diff --git a/addons/blogapi/blogapi.addon.php b/addons/blogapi/blogapi.addon.php deleted file mode 100644 index e804af836d..0000000000 --- a/addons/blogapi/blogapi.addon.php +++ /dev/null @@ -1,602 +0,0 @@ - */ - -if(!defined('__XE__')) - exit(); - -/** - * @file blogapicounter.addon.php - * @author NAVER (developers@xpressengine.com) - * @brief Add blogAPI - * - * It enables to write a post by using an external tool such as ms live writer, firefox performancing, zoundry and so on. - * It should be called before executing the module(before_module_proc). If not, it is forced to shut down. - * */ -// Insert a rsd tag when called_position is after_module_proc -if($called_position == 'after_module_proc') -{ - // Create rsd address of the current module - $site_module_info = Context::get('site_module_info'); - $rsd_url = getFullSiteUrl($site_module_info->domain, '', 'mid', $this->module_info->mid, 'act', 'api'); - // Insert rsd tag into the header - Context::addHtmlHeader(" " . ''); -} -// If act isnot api, just return -if($_REQUEST['act'] != 'api') -{ - return; -} - -// Read func file -require_once(_XE_PATH_ . 'addons/blogapi/blogapi.func.php'); - -$xml = $GLOBALS['HTTP_RAW_POST_DATA']; - -// If HTTP_RAW_POST_DATA is NULL, Print error message -if(!$xml) -{ - $content = getXmlRpcFailure(1, 'Invalid Method Call'); - printContent($content); -} - -// xmlprc parsing -// Parse the requested xmlrpc -if(Security::detectingXEE($xml)) -{ - header("HTTP/1.0 400 Bad Request"); - exit; -} - -if(version_compare(PHP_VERSION, '5.2.11', '<=')) libxml_disable_entity_loader(true); -$xml = new SimpleXMLElement($xml, LIBXML_NONET | LIBXML_NOENT); - -$method_name = (string)$xml->methodName; -$params = $xml->params->param; - -// Compatible with some of methodname -if(in_array($method_name, array('metaWeblog.deletePost', 'metaWeblog.getUsersBlogs', 'metaWeblog.getUserInfo'))) -{ - $method_name = str_replace('metaWeblog.', 'blogger.', $method_name); -} - -// Get user_id, password and attempt log-in -$user_id = trim((string)$params[1]->value->string); -$password = trim((string)$params[2]->value->string); - -// Before executing the module, authentication is processed. -if($called_position == 'before_module_init') -{ - // Attempt log-in by using member controller - if($user_id && $password) - { - $oMemberController = getController('member'); - $output = $oMemberController->doLogin($user_id, $password); - // If login fails, an error message appears - if(!$output->toBool()) - { - $content = getXmlRpcFailure(1, $output->getMessage()); - printContent($content); - } - } - else - { - $content = getXmlRpcFailure(1, 'not logged'); - printContent($content); - } -} - -// Before module processing, handle requests from blogapi tool and then terminate. -if($called_position == 'before_module_proc') -{ - // Check writing permission - if(!$this->grant->write_document) - { - printContent(getXmlRpcFailure(1, 'no permission')); - } - - // Get information of the categories - $oDocumentModel = getModel('document'); - $category_list = $oDocumentModel->getCategoryList($this->module_srl); - - // Specifies a temporary file storage - $logged_info = Context::get('logged_info'); - $mediaPath = sprintf('files/cache/blogapi/%s/%s/', $this->mid, $logged_info->member_srl); - $mediaAbsPath = _XE_PATH_ . $mediaPath; - $mediaUrlPath = Context::getRequestUri() . $mediaPath; - - switch($method_name) - { - // Blog information - case 'blogger.getUsersBlogs' : - $obj = new stdClass(); - $obj->url = getFullSiteUrl(''); - $obj->blogid = $this->mid; - $obj->blogName = $this->module_info->browser_title; - $blog_list = array($obj); - - $content = getXmlRpcResponse($blog_list); - printContent($content); - break; - - // Return a list of categories - case 'metaWeblog.getCategories' : - $category_obj_list = array(); - if($category_list) - { - foreach($category_list as $category_srl => $category_info) - { - $obj = new stdClass(); - $obj->description = $category_info->title; - //$obj->htmlUrl = Context::getRequestUri().$this->mid.'/1'; - //$obj->rssUrl= Context::getRequestUri().'rss/'.$this->mid.'/1'; - $obj->title = $category_info->title; - $obj->categoryid = $category_srl; - $category_obj_list[] = $obj; - } - } - - $content = getXmlRpcResponse($category_obj_list); - printContent($content); - break; - - // Upload file - case 'metaWeblog.newMediaObject' : - // Check a file upload permission - $oFileModel = getModel('file'); - $file_module_config = $oFileModel->getFileModuleConfig($this->module_srl); - if(is_array($file_module_config->download_grant) && count($file_module_config->download_grant) > 0) - { - $logged_info = Context::get('logged_info'); - if($logged_info->is_admin != 'Y') - { - $is_permitted = false; - for($i = 0; $i < count($file_module_config->download_grant); $i++) - { - $group_srl = $file_module_config->download_grant[$i]; - if($logged_info->group_list[$group_srl]) - { - $is_permitted = true; - break; - } - } - if(!$is_permitted){ - printContent(getXmlRpcFailure(1, 'no permission')); - } - } - } - - $fileinfo = $params[3]->value->struct->member; - foreach($fileinfo as $key => $val) - { - $nodename = (string)$val->name; - if($nodename === 'bits') - { - $filedata = base64_decode((string)$val->value->base64); - } - else if($nodename === 'name') - { - $filename = pathinfo((string)$val->value->string, PATHINFO_BASENAME); - } - } - - if($logged_info->is_admin != 'Y') - { - // check file type - if(isset($file_module_config->allowed_filetypes) && $file_module_config->allowed_filetypes !== '*.*') - { - $filetypes = explode(';', $file_module_config->allowed_filetypes); - $ext = array(); - - foreach($filetypes as $item) - { - $item = explode('.', $item); - $ext[] = strtolower(array_pop($item)); - } - - $uploaded_ext = explode('.', $filename); - $uploaded_ext = strtolower(array_pop($uploaded_ext)); - - if(!in_array($uploaded_ext, $ext)) - { - printContent(getXmlRpcFailure(1, 'Not allowed file type')); - break; - } - } - - $allowed_filesize = $file_module_config->allowed_filesize * 1024 * 1024; - if($allowed_filesize < strlen($filedata)) - { - printContent(getXmlRpcFailure(1, 'This file exceeds the attachment limit')); - break; - } - } - - $temp_filename = Password::createSecureSalt(12, 'alnum'); - $target_filename = sprintf('%s%s', $mediaAbsPath, $temp_filename); - FileHandler::makeDir($mediaAbsPath); - FileHandler::writeFile($target_filename, $filedata); - FileHandler::writeFile($target_filename . '_source_filename', $filename); - - $obj = new stdClass(); - $obj->url = Context::getRequestUri() . $mediaPath . $temp_filename; - $content = getXmlRpcResponse($obj); - printContent($content); - break; - // Get posts - case 'metaWeblog.getPost' : - $document_srl = (string)$params[0]->value->string; - if(!$document_srl) - { - printContent(getXmlRpcFailure(1, 'no permission')); - } - else - { - $oDocumentModel = getModel('document'); - $oDocument = $oDocumentModel->getDocument($document_srl); - if(!$oDocument->isExists() || !$oDocument->isGranted()) - { - printContent(getXmlRpcFailure(1, 'no permission')); - } - else - { - // Get a list of categories and set Context - $category = ""; - if($oDocument->get('category_srl')) - { - $oDocumentModel = getModel('document'); - $category_list = $oDocumentModel->getCategoryList($oDocument->get('module_srl')); - if($category_list[$oDocument->get('category_srl')]) - { - $category = $category_list[$oDocument->get('category_srl')]->title; - } - } - - $content = sprintf( - '' . - '' . - '' . - '' . - '' . - '' . - 'categories' . - 'dateCreated%s' . - 'description' . - 'link%s' . - 'postid%s' . - 'title' . - 'publish1' . - '' . - '' . - '' . - '' . - '', - $category, - date("Ymd", $oDocument->getRegdateTime()) . 'T' . date("H:i:s", $oDocument->getRegdateTime()), - $oDocument->getContent(false, false, true, false), - getFullUrl('', 'document_srl', $oDocument->document_srl), - $oDocument->document_srl, - $oDocument->getTitleText() - ); - printContent($content); - } - } - break; - - // Write a new post - case 'metaWeblog.newPost' : - $obj = new stdClass(); - $info = $params[3]; - // Get information of post, title, and category - foreach($info->value->struct->member as $val) - { - switch((string)$val->name) - { - case 'title' : - $obj->title = (string)$val->value->string; - break; - case 'description' : - $obj->content = (string)$val->value->string; - break; - case 'categories' : - $categories = $val->value->array->data->value; - $category = (string)$categories[0]->string; - if($category && $category_list) - { - foreach($category_list as $category_srl => $category_info) - { - if($category_info->title == $category) - $obj->category_srl = $category_srl; - } - } - break; - case 'tagwords' : - $tags = $val->value->array->data->value; - foreach($tags as $tag) - { - $tag_list[] = (string)$tag->string; - } - if(count($tag_list)) - $obj->tags = implode(',', $tag_list); - break; - } - } - - // Set document srl - $document_srl = getNextSequence(); - $obj->document_srl = $document_srl; - $obj->module_srl = $this->module_srl; - - // Attachment - if(is_dir($mediaAbsPath)) - { - $file_list = FileHandler::readDir($mediaAbsPath, '/(_source_filename)$/is'); - $file_count = count($file_list); - if($file_count) - { - $oFileController = getController('file'); - $oFileModel = getModel('file'); - foreach($file_list as $file) - { - $filename = FileHandler::readFile($mediaAbsPath . $file); - $temp_filename = str_replace('_source_filename', '', $file); - - $file_info = array(); - $file_info['tmp_name'] = sprintf('%s%s', $mediaAbsPath, $temp_filename); - $file_info['name'] = $filename; - $fileOutput = $oFileController->insertFile($file_info, $this->module_srl, $document_srl, 0, true); - - if($fileOutput->get('direct_download') === 'N') - { - $replace_url = Context::getRequestUri() . $oFileModel->getDownloadUrl($fileOutput->file_srl, $fileOutput->sid, $this->module_srl); - } - else - { - $replace_url = Context::getRequestUri() . $fileOutput->get('uploaded_filename'); - } - - $obj->content = str_replace($mediaUrlPath . $temp_filename, $replace_url, $obj->content); - } - $obj->uploaded_count = $file_count; - } - } - - $oDocumentController = getController('document'); - $obj->commentStatus = 'ALLOW'; - $obj->allow_trackback = 'Y'; - - $logged_info = Context::get('logged_info'); - $obj->member_srl = $logged_info->member_srl; - $obj->user_id = $logged_info->user_id; - $obj->user_name = $logged_info->user_name; - $obj->nick_name = $logged_info->nick_name; - $obj->email_address = $logged_info->email_address; - $obj->homepage = $logged_info->homepage; - $output = $oDocumentController->insertDocument($obj, TRUE); - - if(!$output->toBool()) - { - $content = getXmlRpcFailure(1, $output->getMessage()); - } - else - { - $content = getXmlRpcResponse(strval($document_srl)); - } - FileHandler::removeDir($mediaAbsPath); - - printContent($content); - break; - - // Edit post - case 'metaWeblog.editPost' : - $tmp_val = (string)$params[0]->value->string; - if(!$tmp_val) - $tmp_val = (string)$params[0]->value->i4; - if(!$tmp_val) - { - $content = getXmlRpcFailure(1, 'no permission'); - break; - } - $tmp_arr = explode('/', $tmp_val); - $document_srl = array_pop($tmp_arr); - if(!$document_srl) - { - $content = getXmlRpcFailure(1, 'no permission'); - break; - } - - $oDocumentModel = getModel('document'); - $oDocument = $oDocumentModel->getDocument($document_srl); - // Check if a permission to modify a document is granted - if(!$oDocument->isGranted()) - { - $content = getXmlRpcFailure(1, 'no permission'); - break; - } - - $obj = $oDocument->getObjectVars(); - - $info = $params[3]; - // Get information of post, title, and category - foreach($info->value->struct->member as $val) - { - switch((string)$val->name) - { - case 'title' : - $obj->title = (string)$val->value->string; - break; - case 'description' : - $obj->content = (string)$val->value->string; - break; - case 'categories' : - $categories = $val->value->array->data->value; - $category = (string)$categories[0]->string; - if($category && $category_list) - { - foreach($category_list as $category_srl => $category_info) - { - if($category_info->title == $category) - $obj->category_srl = $category_srl; - } - } - break; - case 'tagwords' : - $tags = $val->value->array->data->value; - foreach($tags as $tag) - { - $tag_list[] = (string)$tag->string; - } - if(count($tag_list)) - $obj->tags = implode(',', $tag_list); - break; - } - } - // Document srl - $obj->document_srl = $document_srl; - $obj->module_srl = $this->module_srl; - - // Attachment - if(is_dir($mediaAbsPath)) - { - $file_list = FileHandler::readDir($mediaAbsPath, '/(_source_filename)$/is'); - $file_count = count($file_list); - if($file_count) - { - $oFileController = getController('file'); - $oFileModel = getModel('file'); - foreach($file_list as $file) - { - $filename = FileHandler::readFile($mediaAbsPath . $file); - $temp_filename = str_replace('_source_filename', '', $file); - - $file_info = array(); - $file_info['tmp_name'] = sprintf('%s%s', $mediaAbsPath, $temp_filename); - $file_info['name'] = $filename; - $fileOutput = $oFileController->insertFile($file_info, $this->module_srl, $document_srl, 0, true); - - if($fileOutput->get('direct_download') === 'N') - { - $replace_url = Context::getRequestUri() . $oFileModel->getDownloadUrl($fileOutput->file_srl, $fileOutput->sid, $this->module_srl); - } - else - { - $replace_url = Context::getRequestUri() . $fileOutput->get('uploaded_filename'); - } - - $obj->content = str_replace($mediaUrlPath . $temp_filename, $replace_url, $obj->content); - } - $obj->uploaded_count += $file_count; - } - } - - $oDocumentController = getController('document'); - $output = $oDocumentController->updateDocument($oDocument, $obj, TRUE); - - if(!$output->toBool()) - { - $content = getXmlRpcFailure(1, $output->getMessage()); - } - else - { - $content = getXmlRpcResponse(true); - FileHandler::removeDir($mediaAbsPath); - } - - printContent($content); - break; - // Delete the post - case 'blogger.deletePost' : - $tmp_val = (string)$params[1]->value->string; - $tmp_arr = explode('/', $tmp_val); - $document_srl = array_pop($tmp_arr); - // Get a document - $oDocumentModel = getModel('document'); - $oDocument = $oDocumentModel->getDocument($document_srl); - // If the document exists - if(!$oDocument->isExists()) - { - $content = getXmlRpcFailure(1, 'not exists'); - // Check if a permission to delete a document is granted - } - elseif(!$oDocument->isGranted()) - { - $content = getXmlRpcFailure(1, 'no permission'); - break; - // Delete - } - else - { - $oDocumentController = getController('document'); - $output = $oDocumentController->deleteDocument($document_srl); - if(!$output->toBool()) - $content = getXmlRpcFailure(1, $output->getMessage()); - else - $content = getXmlRpcResponse(true); - } - - printContent($content); - break; - // Get recent posts - case 'metaWeblog.getRecentPosts' : - // Options to get a list - $args = new stdClass(); - $args->module_srl = $this->module_srl; // /< module_srl of the current module - $args->page = 1; - $args->list_count = 20; - $args->sort_index = 'list_order'; // /< Sorting values - $logged_info = Context::get('logged_info'); - $args->search_target = 'member_srl'; - $args->search_keyword = $logged_info->member_srl; - $output = $oDocumentModel->getDocumentList($args); - if(!$output->toBool() || !$output->data) - { - $content = getXmlRpcFailure(1, 'post not founded'); - } - else - { - $oEditorController = getController('editor'); - - $posts = array(); - foreach($output->data as $key => $oDocument) - { - $post = new stdClass(); - $post->categories = array(); - $post->dateCreated = date("Ymd", $oDocument->getRegdateTime()) . 'T' . date("H:i:s", $oDocument->getRegdateTime()); - $post->description = sprintf('',$oEditorController->transComponent($oDocument->getContent(false, false, true, false))); - $post->link = $post->permaLink = getFullUrl('', 'document_srl', $oDocument->document_srl); - $post->postid = $oDocument->document_srl; - $post->title = htmlspecialchars($oDocument->get('title'), ENT_COMPAT | ENT_HTML401, 'UTF-8', false); - $post->publish = 1; - $post->userid = $oDocument->get('user_id'); - $post->mt_allow_pings = 0; - $post->mt_allow_comments = $oDocument->allowComment() ? 1 : 0; - $posts[] = $post; - } - $content = getXmlRpcResponse($posts); - printContent($content); - } - break; - - // Display RSD if there is no request - default : - $homepagelink = getUrl('', 'mid', $this->mid); - $site_module_info = Context::get('site_module_info'); - $api_url = getFullSiteUrl($site_module_info->domain, '', 'mid', $site_module_info->mid, 'act', 'api'); - $content = << - - - XpressEngine - http://www.xpressengine.com/ - {$homepagelink} - - - - - -RSDContent; - printContent($content); - break; - } -} -/* End of file blogapi.addon.php */ -/* Location: ./addons/blogapi/blogapi.addon.php */ diff --git a/addons/blogapi/blogapi.func.php b/addons/blogapi/blogapi.func.php deleted file mode 100644 index 06cc06c849..0000000000 --- a/addons/blogapi/blogapi.func.php +++ /dev/null @@ -1,101 +0,0 @@ - */ - -if(!defined('__XE__')) - exit(); - -/** - * @file ./addons/blogapi/blogapi.func.php - * @author NAVER (developers@xpressengine.com) - * @brief Function collections for the implementation of blogapi - * */ -// Error messages -function getXmlRpcFailure($error, $message) -{ - return - sprintf( - "\n\n\nfaultCode\n%d\n\n\nfaultString\n%s\n\n\n\n", $error, htmlspecialchars($message, ENT_COMPAT | ENT_HTML401, 'UTF-8', false) - ); -} - -// Display results -function getXmlRpcResponse($params) -{ - $buff = '' . "\n"; - $buff .= _getEncodedVal($params); - $buff .= "\n\n"; - - return $buff; -} - -// Encoding -function _getEncodedVal($val, $is_sub_set = false) -{ - if(preg_match('/^\<\!\[CDATA\[/',$val)) - { - $buff = sprintf("%s", $val); - } - elseif(is_int($val)) - { - $buff = sprintf("%d", $val); - } - elseif(is_string($val) && preg_match('/^([0-9]+)T([0-9\:]+)$/', $val)) - { - $buff = sprintf("%s\n", $val); - } - elseif(is_double($val)) - { - $buff = sprintf("%f", $val); - } - elseif(is_bool($val)) - { - $buff = sprintf("%d", $val ? 1 : 0); - } - elseif(is_object($val)) - { - $values = get_object_vars($val); - $val_count = count($values); - $buff = ""; - foreach($values as $k => $v) - { - $buff .= sprintf("\n%s\n%s\n", htmlspecialchars($k, ENT_COMPAT | ENT_HTML401, 'UTF-8', false), _getEncodedVal($v, true)); - } - $buff .= "\n"; - } - elseif(is_array($val)) - { - $val_count = count($val); - $buff = "\n"; - for($i = 0; $i < $val_count; $i++) - { - $buff .= _getEncodedVal($val[$i], true); - } - $buff .= "\n"; - } - else - { - $buff = sprintf("%s\n", $val); - } - if(!$is_sub_set) - { - return sprintf("\n%s", $buff); - } - return $buff; -} - -// Display the result -function printContent($content) -{ - header("Content-Type: text/xml; charset=UTF-8"); - header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); - header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); - header("Cache-Control: no-store, no-cache, must-revalidate"); - header("Cache-Control: post-check=0, pre-check=0", false); - header("Pragma: no-cache"); - print $content; - Context::close(); - exit(); -} - -/* End of file blogapi.func.php */ -/* Location: ./addons/blogapi/blogapi.func.php */ diff --git a/addons/blogapi/conf/info.xml b/addons/blogapi/conf/info.xml deleted file mode 100644 index 408cf8ffa5..0000000000 --- a/addons/blogapi/conf/info.xml +++ /dev/null @@ -1,80 +0,0 @@ - - - BlogAPI 애드온 - BlogAPIアドオン - BlogAPI - Addon for BlogAPI - BlogAPI Addon - Addon für BlogAPI - Addon para BlogAPI - Аддон для BlogAPI - 部落格 API - - metaWeblog를 지원하는 blogApi애드온입니다. - 사용으로 설정하면 각 모듈마다 RSD 태그를 노출합니다. - api의 주소는 http://설치주소/모듈명/api 입니다. - 사용으로 해야 RSD태그 및 api가 동작을 합니다. - - - MetaWeblogをサポートするBlog APIアドオンです。 - 「使用する」にチェックすると各モジュールごとにRSDのアドレスを表示します。 - APIのアドレスは「http://インストールURL/モジュール名/api」です。 - 「使用する」に設定してから、RSDタグ、およびAPIが作動します。 - - - 支持metaWeblog的 blogApi插件。 - 设置为"启用"时,会使每个模块都会显示RSD标签。 - api地址为http://安装地址/模块名/api。 - 把状态设置为"使用"时,才会激活RSD标签及api。 - - - This blogAPI addon supports metaWeblog. - By using this option, it lets the RSD tag to be exposed to each module. - URL to the API is http://setup_path/module_name/api. - RSD tag and the api will work only if you use this addon. - - - Addon BlogAPI này hỗ trợ metaWeblog.. - Bằng việc sử dụng tùy chọn này, Tag RSD sẽ được hiển thị đến mỗi Module. - URL cho API có dạng http://setup_path/module_name/api. - RSD Tag và API chỉ làm việc khi Addon này được kích hoạt. - - - Diese blogApi addon metaWeblog unterstützt. - Durch die Verwendung dieser Option, die es ermöglicht RSD Tag ausgesetzt werden jedes Modul. - URL der api ist http://setup_path/module_name/api. - RSD-Tag und dem API arbeiten und nur dann, wenn Sie über dieses Addon. - - - Este blogApi addon soporta el metaWeblog. - Si seleccionas la optión usar, cada módulo entregará la etiqueta RSD. - La dirección de api es http://dirección de la instalación/nombre de módulo/api. - Sólo si seleccionas la opción usar, funcionará la etiqueta RSD y api. - - - Этот blogApi аддон поддерживает metaWeblog. - Используя этот аддон, RSD тег становится доступным для каждого модуля. - URL для api - http://setup_path/module_name/api. - тег RSD и api работают только при включенном аддоне. - - - 支援 MetaWeblog 的部落格 API 附加元件。 - 設置成"啟用"時,會使每個模組都顯示 RSD 圖示。 - API網址是 http://安裝位置/模組名稱/api。 - 將狀態設置成"啟用"時,才可使用 RSD 和 API - - 1.7 - 2013-11-27 - - - NAVER - NAVER - NAVER - NAVER - NAVER - NAVER - NAVER - NAVER - NAVER - - diff --git a/addons/mobile/classes/hdml.class.php b/addons/mobile/classes/hdml.class.php deleted file mode 100644 index 868df7faac..0000000000 --- a/addons/mobile/classes/hdml.class.php +++ /dev/null @@ -1,124 +0,0 @@ -charset); - header("Cache-Control: no-store, no-cache, must-revalidate"); - header("Cache-Control: post-check=0, pre-check=0", false); - header("Pragma: no-cache"); - - print ''; - print "\n"; - print $this->hasChilds()?'':''; - print "\n"; - - if($this->upperUrl) - { - $url = $this->upperUrl; - printf('%s', $url->url, $url->text, "\n"); - } - } - - /** - * @brief Output title - **/ - function printTitle() - { - if($this->totalPage > $this->mobilePage) $titlePageStr = sprintf("(%d/%d)",$this->mobilePage, $this->totalPage); - printf('<%s%s>%s', $this->title,$titlePageStr,"\n"); - } - - /** - * @brief Output information - * hasChilds() if there is a list of content types, otherwise output - **/ - function printContent() - { - if($this->hasChilds()) - { - foreach($this->getChilds() as $key => $val) - { - if(!$val['link']) continue; - printf('%s%s',Context::getLang('cmd_select'), $val['href'], $val['text'], "\n"); - } - } - else - { - printf('%s
%s', $this->getContent(),"\n"); - } - } - - /** - * @brief Button to output - **/ - function printBtn() - { - // Menu Types - if($this->hasChilds()) - { - if($this->nextUrl) - { - $url = $this->nextUrl; - printf('%s%s', $url->text, $url->url, $url->text, "\n"); - } - if($this->prevUrl) - { - $url = $this->prevUrl; - printf('%s%s', $url->text, $url->url, $url->text, "\n"); - } - if($this->homeUrl) - { - $url = $this->homeUrl; - printf('%s%s', $url->text, $url->url, $url->text, "\n"); - } - // Content Types - } - else - { - if($this->nextUrl) - { - $url = $this->nextUrl; - printf('%s', $url->text, $url->url, $url->text); - } - if($this->prevUrl) - { - $url = $this->prevUrl; - printf('%s', $url->text, $url->url, $url->text); - } - if($this->homeUrl) - { - $url = $this->homeUrl; - printf('%s', $url->text, $url->url, $url->text); - } - } - } - - /** - * @brief Footer information output - **/ - function printFooter() - { - print $this->hasChilds()?'
':''; - print "\n"; - print("
"); - } -} - -/* End of file hdml.class.php */ -/* Location: ./addons/mobile/classes/hdml.class.php */ diff --git a/addons/mobile/classes/mhtml.class.php b/addons/mobile/classes/mhtml.class.php deleted file mode 100644 index 43e472a350..0000000000 --- a/addons/mobile/classes/mhtml.class.php +++ /dev/null @@ -1,98 +0,0 @@ -\n"); - if($this->totalPage > $this->mobilePage) $titlePageStr = sprintf("(%d/%d)",$this->mobilePage, $this->totalPage); - printf("%s%s\n", htmlspecialchars($this->title, ENT_COMPAT | ENT_HTML401, 'UTF-8', false),htmlspecialchars($titlePageStr, ENT_COMPAT | ENT_HTML401, 'UTF-8', false)); - } - // Output title - function printTitle() - { - if($this->totalPage > $this->mobilePage) $titlePageStr = sprintf("(%d/%d)",$this->mobilePage, $this->totalPage); - printf('<%s%s>
%s', htmlspecialchars($this->title, ENT_COMPAT | ENT_HTML401, 'UTF-8', false),htmlspecialchars($titlePageStr, ENT_COMPAT | ENT_HTML401, 'UTF-8', false),"\n"); - } - - /** - * @brief Output information - * hasChilds() if there is a list of content types, otherwise output - **/ - function printContent() - { - if($this->hasChilds()) - { - foreach($this->getChilds() as $key => $val) - { - if(!$val['link']) continue; - printf('%s
%s', $val['href'], $this->getNo(), $val['text'], "\n"); - if($val['extra']) printf("
%s\n",str_replace('
','
',$val['extra'])); - } - } - else - { - print(str_replace('
','
',$this->getContent())."\n"); - } - print "

"; - } - - /** - * @brief Button to output - **/ - function printBtn() - { - if($this->nextUrl) - { - $url = $this->nextUrl; - printf('%s
%s', $url->url, $url->text, "\n"); - } - if($this->prevUrl) - { - $url = $this->prevUrl; - printf('%s
%s', $url->url, $url->text, "\n"); - } - // Select Language - if(!parent::isLangChange()) - { - $url = getUrl('','lcm','1','sel_lang',Context::getLangType(),'return_uri',Context::get('current_url')); - printf('%s
%s', $url, 'Language : '.Context::getLang('select_lang'), "\n"); - } - else - { - printf('%s
%s', Context::get('return_uri'), Context::getLang('lang_return'), "\n"); - } - if($this->upperUrl) - { - $url = $this->upperUrl; - printf('%s', $url->url, $url->text, "\n"); - } - if($this->homeUrl) - { - $url = $this->homeUrl; - printf('%s
%s', $url->text, $url->url, $url->text, "\n"); - } - } - // Footer information output - function printFooter() - { - print("\n"); - } -} -/* End of file mhtml.class.php */ -/* Location: ./addons/mobile/classes/mhtml.class.php */ diff --git a/addons/mobile/classes/mobile.class.php b/addons/mobile/classes/mobile.class.php deleted file mode 100644 index fa5f612e05..0000000000 --- a/addons/mobile/classes/mobile.class.php +++ /dev/null @@ -1,632 +0,0 @@ -lang = FileHandler::readFile('./files/cache/addons/mobile/setLangType/personal_settings/'.md5(trim($_SERVER['HTTP_USER_AGENT']).trim($_SERVER['HTTP_PHONE_NUMBER']).trim($_SERVER['HTTP_HTTP_PHONE_NUMBER'])).'.php'); - if($this->lang) - { - $lang_supported = Context::get('lang_supported'); - $this->lang = str_replace(array(''),array('',''),$this->lang); - if(isset($lang_supported[$this->lang])) Context::setLangType($this->lang); - } - Context::loadLang(_XE_PATH_.'addons/mobile/lang'); - - $instance = new wap(); - - $mobilePage = (int)Context::get('mpage'); - if(!$mobilePage) $mobilePage = 1; - - $instance->setMobilePage($mobilePage); - } - return $instance; - } - - /** - * @brief constructor - */ - function mobileXE() - { - // Check navigation mode - if(Context::get('nm')) - { - $this->navigationMode = 1; - $this->cmid = (int)Context::get('cmid'); - } - - if(Context::get('lcm')) - { - $this->languageMode = 1; - $this->lang = Context::get('sel_lang'); - } - } - - /** - * @brief Check navigation mode - * navigationMode settings and modules of information must be menu_srl return to navigation mode = true - */ - function isNavigationMode() - { - return ($this->navigationMode && $this->module_info->menu_srl)?true:false; - } - - /** - * @brief Check langchange mode - * true return should be set languageMode - */ - function isLangChange() - { - if($this->languageMode) return true; - else return false; - } - - /** - * @brief Language settings - * Cookies Since you set your phone to store language-specific file, file creation - */ - function setLangType() - { - $lang_supported = Context::get('lang_supported'); - // Make sure that the language variables and parameters are valid - if($this->lang && isset($lang_supported[$this->lang])) - { - $langbuff = FileHandler::readFile('./files/cache/addons/mobile/setLangType/personal_settings/'.md5(trim($_SERVER['HTTP_USER_AGENT']).trim($_SERVER['HTTP_PHONE_NUMBER']).trim($_SERVER['HTTP_HTTP_PHONE_NUMBER'])).'.php'); - if($langbuff) FileHandler::removeFile('./files/cache/addons/mobile/setLangType/personal_settings/'.md5(trim($_SERVER['HTTP_USER_AGENT']).trim($_SERVER['HTTP_PHONE_NUMBER']).trim($_SERVER['HTTP_HTTP_PHONE_NUMBER'])).'.php'); - $langbuff = 'lang.'**/ ?>'; - FileHandler::writeFile('./files/cache/addons/mobile/setLangType/personal_settings/'.md5(trim($_SERVER['HTTP_USER_AGENT']).trim($_SERVER['HTTP_PHONE_NUMBER']).trim($_SERVER['HTTP_HTTP_PHONE_NUMBER'])).'.php',$langbuff); - } - } - - /** - * @brief Information currently requested module settings - */ - function setModuleInfo(&$module_info) - { - if($this->module_info) return; - $this->module_info = $module_info; - } - - /** - * @brief Set the module instance is currently running - */ - function setModuleInstance(&$oModule) - { - if($this->oModule) return; - // Save instance - $this->oModule = $oModule; - // Of the current module if there is a menu by menu - $menu_cache_file = sprintf(_XE_PATH_.'files/cache/menu/%d.php', $this->module_info->menu_srl); - if(!file_exists($menu_cache_file)) return; - - include $menu_cache_file; - // One-dimensional arrangement of menu changes - $this->getListedItems($menu->list, $listed_items, $node_list); - - $this->listed_items = $listed_items; - $this->node_list = $node_list; - $this->menu = $menu->list; - - $k = array_keys($node_list); - $v = array_values($node_list); - $this->index_mid = $k[0]; - // The depth of the current menu, the top button to specify if one or more - $cur_menu_item = $listed_items[$node_list[$this->module_info->mid]]; - if($cur_menu_item['parent_srl']) - { - $parent_srl = $cur_menu_item['parent_srl']; - if($parent_srl && $listed_items[$parent_srl]) - { - $parent_item = $listed_items[$parent_srl]; - if($parent_item) $this->setUpperUrl(getUrl('','mid',$parent_item['mid']), Context::getLang('cmd_go_upper')); - } - } - elseif (!$this->isNavigationMode()) - { - $this->setUpperUrl(getUrl('','mid',$this->index_mid,'nm','1','cmid',0), Context::getLang('cmd_view_sitemap')); - } - } - - /** - * @brief Access the browser's header to determine the return type of the browser - * Mobile browser, if not null return - */ - function getBrowserType() - { - if(Context::get('smartphone')) return null; - // Determine the type of browser - $browserAccept = $_SERVER['HTTP_ACCEPT']; - $userAgent = $_SERVER['HTTP_USER_AGENT']; - $wap_sid = $_SERVER['HTTP_X_UP_SUBNO']; - - if(stripos($userAgent, "SKT11") !== FALSE || stripos($browserAccept, "skt") !== FALSE) - { - Context::set('mobile_skt',1); - return "wml"; - } - elseif(stripos($browserAccept, "hdml") !== FALSE) return "hdml"; - elseif(stripos($userAgent, "cellphone") !== FALSE) return "mhtml"; - return null; - } - - /** - * @brief Specify charset - */ - function setCharSet($charset = 'UTF-8') - { - if(!$charset) $charset = 'UTF-8'; - // SKT supports the euc-kr - if(Context::get('mobile_skt')==1) $charset = 'euc-kr'; - - $this->charset = $charset; - } - - /** - * @brief Limited capacity of mobile devices, specifying a different virtual page - */ - function setMobilePage($page=1) - { - if(!$page) $page = 1; - $this->mobilePage = $page; - } - - /** - * @brief Mokrokhyeong child menu for specifying the data set - */ - function setChilds($childs) - { - // If more than nine the number of menu paging processing itself - $menu_count = count($childs); - if($menu_count>9) - { - $startNum = ($this->mobilePage-1)*9; - $idx = 0; - $new_childs = array(); - foreach($childs as $k => $v) - { - if($idx >= $startNum && $idx < $startNum+9) - { - $new_childs[$k] = $v; - } - $idx ++; - } - $childs = $new_childs; - - $this->totalPage = (int)(($menu_count-1)/9)+1; - // next/prevUrl specify - if($this->mobilePage>1) - { - $url = getUrl('mid',$_GET['mid'],'mpage',$this->mobilePage-1); - $text = sprintf('%s (%d/%d)', Context::getLang('cmd_prev'), $this->mobilePage-1, $this->totalPage); - $this->setPrevUrl($url, $text); - } - - if($this->mobilePage<$this->totalPage) - { - $url = getUrl('mid',$_GET['mid'],'mpage',$this->mobilePage+1); - $text = sprintf('%s (%d/%d)', Context::getLang('cmd_next'), $this->mobilePage+1, $this->totalPage); - $this->setNextUrl($url, $text); - } - } - $this->childs = $childs; - } - - /** - * @brief Check the menu to be output - */ - function hasChilds() - { - return count($this->childs)?true:0; - } - - /** - * @brief Returns the child menu - */ - function getChilds() - { - return $this->childs; - } - - /** - * @brief Specify title - */ - function setTitle($title) - { - $oModuleController = getController('module'); - $this->title = $title; - $oModuleController->replaceDefinedLangCode($this->title); - } - - /** - * @brief return title - */ - function getTitle() - { - return $this->title; - } - - /** - * @brief Content Cleanup - * In HTML content, the ability to extract text and links - */ - function setContent($content) - { - $oModuleController = getController('module'); - $allow_tag_array = array('','
','

','','','','','','','','','','
'); - // Links/wrap, remove all tags except gangjoman - $content = strip_tags($content, implode($allow_tag_array)); - // Margins tab removed - $content = str_replace("\t", "", $content); - // Repeat two more times the space and remove julnanumeul - $content = preg_replace('/( ){2,}/s', '', $content); - $content = preg_replace("/([\r\n]+)/s", "\r\n", $content); - $content = preg_replace(array("/","
"), array("
","
"), $content); - - while(strpos($content, '

')) - { - $content = str_replace('

','
',$content); - } - // If the required size of a deck of mobile content to write down all the dividing pages - $contents = array(); - while($content) - { - $tmp = $this->cutStr($content, $this->deckSize, ''); - $contents[] = $tmp; - $content = substr($content, strlen($tmp)); - - //$content = str_replace(array('&','<','>','"','&nbsp;'), array('&','<','>','"',' '), $content); - - foreach($allow_tag_array as $tag) - { - if($tag == '
') continue; - $tag_open_pos = strpos($content, str_replace('>','',$tag)); - $tag_close_pos = strpos($content, str_replace('<','totalPage = count($contents); - // next/prevUrl specify - if($this->mobilePage>1) - { - $url = getUrl('mid',$_GET['mid'],'mpage',$this->mobilePage-1); - $text = sprintf('%s (%d/%d)', Context::getLang('cmd_prev'), $this->mobilePage-1, $this->totalPage); - $this->setPrevUrl($url, $text); - } - - if($this->mobilePage<$this->totalPage) - { - $url = getUrl('mid',$_GET['mid'],'mpage',$this->mobilePage+1); - $text = sprintf('%s (%d/%d)', Context::getLang('cmd_next'), $this->mobilePage+1, $this->totalPage); - $this->setNextUrl($url, $text); - } - - $this->content = $contents[$this->mobilePage-1]; - $oModuleController->replaceDefinedLangCode($this->content); - $content = str_replace(array('$','\''), array('$$','''), $content); - } - - /** - * @brief cutting the number of byte functions - */ - function cutStr($string, $cut_size) - { - return preg_match('/.{'.$cut_size.'}/su', $string, $arr) ? $arr[0] : $string; - } - - /** - * @brief Return content - */ - function getContent() - { - return $this->content; - } - - /** - * @brief Specifies the home url - */ - function setHomeUrl($url, $text) - { - if(!$url) $url = '#'; - $this->homeUrl->url = $url; - $this->homeUrl->text = $text; - } - - /** - * @brief Specify upper url - */ - function setUpperUrl($url, $text) - { - if(!$url) $url = '#'; - $this->upperUrl->url = $url; - $this->upperUrl->text = $text; - } - - /** - * @brief Specify prev url - */ - function setPrevUrl($url, $text) - { - if(!$url) $url = '#'; - $this->prevUrl->url = $url; - $this->prevUrl->text = $text; - } - - /** - * @brief Specify next url - */ - function setNextUrl($url, $text) - { - if(!$url) $url = '#'; - $this->nextUrl->url = $url; - $this->nextUrl->text = $text; - } - - /** - * @brief Next, Previous, Top button assignments other than - */ - function setEtcBtn($url, $text) - { - if(!$url) $url = '#'; - $etc['url'] = $url; - $etc['text'] = htmlspecialchars($text); - $this->etcBtn[] = $etc; - } - - /** - * @brief display - */ - function display() - { - // Home button assignments - $this->setHomeUrl(getUrl(), Context::getLang('cmd_go_home')); - // Specify the title - if(!$this->title) $this->setTitle(Context::getBrowserTitle()); - - ob_start(); - // Output header - $this->printHeader(); - // Output title - $this->printTitle(); - // Information output - $this->printContent(); - // Button output - $this->printBtn(); - // Footer output - $this->printFooter(); - - $content = ob_get_clean(); - // After conversion output - if(strtolower($this->charset) == 'utf-8') print $content; - else print iconv('UTF-8',$this->charset."//TRANSLIT//IGNORE", $content); - - exit(); - } - - /** - * @brief Move page - */ - function movepage($url) - { - header("location:$url"); - exit(); - } - - /** - * @brief And returns a list of serial numbers in - */ - function getNo() - { - $this->no++; - $str = $this->no; - return $str; - } - - /** - * @brief XE is easy to use Menu module is relieved during the function, value - */ - function getListedItems($menu, &$listed_items, &$node_list) - { - if(!count($menu)) return; - foreach($menu as $node_srl => $item) - { - if(preg_match('/^([a-zA-Z0-9\_\-]+)$/', $item['url'])) - { - $mid = $item['mid'] = $item['url']; - $node_list[$mid] = $node_srl; - } - else - { - $mid = $item['mid'] = null; - } - - $listed_items[$node_srl] = $item; - $this->getListedItems($item['list'], $listed_items, $node_list); - } - } - - /** - * @brief XE navigation output - */ - function displayNavigationContent() - { - $childs = array(); - - if($this->cmid) - { - $cur_item = $this->listed_items[$this->cmid]; - $upper_srl = $cur_item['parent_srl'];; - $list = $cur_item['list'];; - $this->setUpperUrl(getUrl('cmid',$upper_srl), Context::getLang('cmd_go_upper')); - if(preg_match('/^([a-zA-Z0-9\_\-]+)$/', $cur_item['url'])) - { - $obj = array(); - $obj['href'] = getUrl('','mid',$cur_item['url']); - $obj['link'] = $obj['text'] = '['.$cur_item['text'].']'; - $childs[] = $obj; - } - - } - else - { - $list = $this->menu; - $upper_srl = 0; - } - - if(count($list)) - { - foreach($list as $key => $val) - { - if(!$val['text']) continue; - $obj = array(); - if(!count($val['list'])) - { - $obj['href'] = getUrl('','mid',$val['url']); - } - else - { - $obj['href'] = getUrl('cmid',$val['node_srl']); - } - $obj['link'] = $obj['text'] = $val['text']; - $childs[] = $obj; - } - $this->setChilds($childs); - } - // Output - $this->display(); - } - - /** - * @brief Language Settings menu, the output - */ - function displayLangSelect() - { - $childs = array(); - - $this->lang = FileHandler::readFile('./files/cache/addons/mobile/setLangType/personal_settings/'.md5(trim($_SERVER['HTTP_USER_AGENT']).trim($_SERVER['HTTP_PHONE_NUMBER']).trim($_SERVER['HTTP_HTTP_PHONE_NUMBER'])).'.php'); - if($this->lang) - { - $this->lang = str_replace(array(''),array('',''),$this->lang); - Context::setLangType($this->lang); - } - $lang_supported = Context::get('lang_supported'); - $lang_type = Context::getLangType(); - $obj = array(); - $obj['link'] = $obj['text'] = Context::getLang('president_lang').' : '.$lang_supported[$lang_type]; - $obj['href'] = getUrl('sel_lang',$lang_type); - $childs[] = $obj; - - if(is_array($lang_supported)) - { - foreach($lang_supported as $key => $val) - { - $obj = array(); - $obj['link'] = $obj['text'] = $val; - $obj['href'] = getUrl('sel_lang',$key); - $childs[] = $obj; - } - } - - $this->setChilds($childs); - - $this->display(); - } - - /** - * @brief Module to create a class object of the WAP WAP ready - */ - function displayModuleContent() - { - // Create WAP class objects of the selected module - $oModule = &getWap($this->module_info->module); - if(!$oModule || !method_exists($oModule, 'procWAP') ) return; - - $vars = get_object_vars($this->oModule); - if(count($vars)) foreach($vars as $key => $val) $oModule->{$key} = $val; - // Run - $oModule->procWAP($this); - // Output - $this->display(); - } - - /** - * @brief WAP content is available as a separate output if the final results - */ - function displayContent() - { - Context::set('layout','none'); - // Compile a template - $oTemplate = new TemplateHandler(); - $oContext = &Context::getInstance(); - - $content = $oTemplate->compile($this->oModule->getTemplatePath(), $this->oModule->getTemplateFile()); - $this->setContent($content); - // Output - $this->display(); - } -} -/* End of file mobile.class.php */ -/* Location: ./addons/mobile/classes/mobile.class.php */ diff --git a/addons/mobile/classes/wml.class.php b/addons/mobile/classes/wml.class.php deleted file mode 100644 index aee5b3965f..0000000000 --- a/addons/mobile/classes/wml.class.php +++ /dev/null @@ -1,127 +0,0 @@ -charset); - if($this->totalPage > $this->mobilePage) $titlePageStr = sprintf("(%d/%d)",$this->mobilePage, $this->totalPage); - print("charset."\"?>\n"); - // Card Title - printf("\n\n

\n",htmlspecialchars($this->title, ENT_COMPAT | ENT_HTML401, 'UTF-8', false),htmlspecialchars($titlePageStr, ENT_COMPAT | ENT_HTML401, 'UTF-8', false)); - } - - /** - * @brief Output title - */ - function printTitle() - { - if($this->totalPage > $this->mobilePage) $titlePageStr = sprintf("(%d/%d)",$this->mobilePage, $this->totalPage); - printf('<%s%s>
%s', htmlspecialchars($this->title, ENT_COMPAT | ENT_HTML401, 'UTF-8', false),htmlspecialchars($titlePageStr, ENT_COMPAT | ENT_HTML401, 'UTF-8', false),"\n"); - } - - /** - * @brief Output information - * hasChilds() if there is a list of content types, otherwise output - */ - function printContent() - { - if($this->hasChilds()) - { - foreach($this->getChilds() as $key => $val) - { - if(!$val['link']) continue; - printf('%s', $this->getNo(), htmlspecialchars($val['text'], ENT_COMPAT | ENT_HTML401, 'UTF-8', false), $val['href'], "\n"); - if($val['extra']) printf("%s\n",$val['extra']); - } - } - else - { - printf('%s
%s', str_replace("
","
",$this->getContent()),"\n"); - } - print('
'); - } - - /** - * @brief Button to output - */ - function printBtn() - { - if($this->nextUrl) - { - $url = $this->nextUrl; - printf('%s', $url->text, $url->url, "\n"); - } - if($this->prevUrl) - { - $url = $this->prevUrl; - printf('%s', $url->text, $url->url, "\n"); - } - // Others are not applicable in charge of the button output (array passed) type?? - if($this->etcBtn) - { - if(is_array($this->etcBtn)) - { - foreach($this->etcBtn as $key=>$val) - { - printf('%s', $key, $val['text'], $val['url'], "\n"); - } - } - } - // Select Language - if(!parent::isLangChange()) - { - $url = getUrl('','lcm','1','sel_lang',Context::getLangType(),'return_uri',Context::get('current_url')); - printf('%s', 'Language : '.Context::getLang('select_lang'), $url, "\n"); - } - else - { - printf('%s', Context::getLang('lang_return'), Context::get('return_uri'), "\n"); - } - if($this->homeUrl) - { - $url = $this->homeUrl; - printf('%s', $url->text, $url->url, "\n"); - } - if($this->upperUrl) - { - $url = $this->upperUrl; - printf('%s', $url->text, $url->url, "\n"); - } - } - // Footer information output - function printFooter() - { - print("

\n
\n
"); - } - // And returns a list of serial numbers in - function getNo() - { - if(Context::get('mobile_skt')==1) - { - return "vnd.skmn".parent::getNo(); - } - else - { - return parent::getNo(); - } - return $str; - } -} -/* End of file wml.class.php */ -/* Location: ./addons/mobile/classes/wml.class.php */ diff --git a/addons/mobile/conf/info.xml b/addons/mobile/conf/info.xml deleted file mode 100644 index cb25d00e9f..0000000000 --- a/addons/mobile/conf/info.xml +++ /dev/null @@ -1,84 +0,0 @@ - - - 모바일XE 애드온 - モバイルXEアドオン - 手机XE插件 - Mobile XE - Mobile XE - Mobile XE - XE行動上網 - - 모바일에서 접속시 헤더 정보를 분석하여 WAP 태그로 출력하는 애드온입니다. - wml, hdml, mhtml를 지원하고 그 이외의 경우에는 동작하지 않습니다. - - - モバイル端末機からアクセス時、ヘッダー(header)情報を分析して「メニュー」と「モジュール」の関係を利用してWAPタグに変換表示するアドオンです。 - wml, hdml, mhtmlをサポートし、その以外は対応していません。 - - - 通过手机访问网站时将网页输出为WAP标签的插件。 - 支持语言:wml, hdml, mhtml - - - This addon displays WAP tag by analyzing header information on mobile connection. - Only wml, hdml, mhtml formats are provided. - - - Addon này hiển thị WAP Tag bởi việc phân tích thông tin khi kết nối bằng di động. - Chỉ hỗ trợ cho các định dạng wml, hdml, mhtml. - - - Данный аддон показывает WAP теги, анализирую информацию мобильного соединения. - Поддерживаются только wml, hdml, mhtml форматы. - - - 透過行動工具上網時,會將網頁轉換為WAP標籤顯示。 - 只限於 wml, hdml, mhtml格式。 - - 1.7 - 2013-11-27 - - - NAVER - NAVER - NAVER - NAVER - NAVER - NAVER - NAVER - - - - - misol - misol - misol - misol - misol - misol - misol - - 언어선택 추가(WML, mHTML) - 인코딩 설정 개선 - 그 외 소소한 개선들 - - - - - 문자셋 - 文字コード - 编码 - Charset - Charset - Charset - 編碼 - 모바일 기기의 경우 UTF-8 문자셋을 인식하지 못할 수 있습니다. 문자셋에 원하는 문자셋을 입력하면 자동으로 변환하여 출력하여 모바일에서 이상없이 출력하도록 합니다. 기본값은 UTF-8입니다. (*SK Telecom 휴대전화의 경우 euc-kr인코딩만 지원하므로, 강제로 euc-kr인코딩만 지원합니다.) - ある特定のモバイル機器ではutf-8文字コードの認識が出来ない場合があります。文字コードを設定すると、(日本語だけの場合)該当文字コードに自動変換して正常に表示出来るようになります。本アドオンのデフォルト値はUTF-8で、日本の携帯はshift-jisが一般的です。 - 手机有时无法识别utf-8编码,这时输入相应的编码值即可自动转换。默认编码为UTF-8。 - utf-8 may be read with mobile tools. Mobile tools will display correct charset when you input charset you want. Default charset is UTF-8. - UTF-8 không thể đọc được cho các công cụ di động. Những công cụ di động sẽ trình bày Charset đúng khi bạn nhập vào Charset bạn muốn. Charset mặc định là UTF-8. - utf-8 may be read with mobile tools. Mobile tools will display correct charset when you input charset you want. Default charset is UTF-8. - 行動工具無法讀取utf-8編碼。當您輸入所想要的編碼時,行動工具將會正確的顯示。預設編碼是UTF-8. - - - diff --git a/addons/mobile/lang/lang.xml b/addons/mobile/lang/lang.xml deleted file mode 100644 index 202e0d6266..0000000000 --- a/addons/mobile/lang/lang.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/addons/mobile/mobile.addon.php b/addons/mobile/mobile.addon.php deleted file mode 100644 index df8b408e37..0000000000 --- a/addons/mobile/mobile.addon.php +++ /dev/null @@ -1,77 +0,0 @@ - */ - -if(!defined('__XE__')) - exit(); - -/** - * @file mobile.addon.php - * @author NAVER (developers@xpressengine.com) - * @brief Mobile XE add-on - * - * If a mobile connection is made (see the header information), display contents with WAP tags - * - * Time to call - * - * before_module_proc > call when changing general settings for mobile - * - * after_module_proc > display mobile content - * Condition - * */ -// Ignore admin page -if(Context::get('module') == 'admin') -{ - return; -} -// Manage when to call it -if($called_position != 'before_module_proc' && $called_position != 'after_module_proc') -{ - return; -} -// Ignore if not mobile browser -require_once(_XE_PATH_ . 'addons/mobile/classes/mobile.class.php'); -if(!mobileXE::getBrowserType()) -{ - return; -} -// Generate mobile instance -$oMobile = &mobileXE::getInstance(); -if(!$oMobile) -{ - return; -} -// Specify charset on the add-on settings -$oMobile->setCharSet($addon_info->charset); -// Set module information -$oMobile->setModuleInfo($this->module_info); -// Register the current module object -$oMobile->setModuleInstance($this); - -// Extract content and display/exit if navigate mode is or if WAP class exists -if($called_position == 'before_module_proc') -{ - if($oMobile->isLangChange()) - { - $oMobile->setLangType(); - $oMobile->displayLangSelect(); - } - // On navigation mode, display navigation content - if($oMobile->isNavigationMode()) - { - $oMobile->displayNavigationContent(); - } - // If you have a WAP class content output via WAP class - else - { - $oMobile->displayModuleContent(); - } - // If neither navigation mode nor WAP class is, display the module's result -} -else if($called_position == 'after_module_proc') -{ - // Display - $oMobile->displayContent(); -} - -/* End of file mobile.addon.php */ -/* Location: ./addons/mobile/mobile.addon.php */ diff --git a/addons/openid_delegation_id/conf/info.xml b/addons/openid_delegation_id/conf/info.xml deleted file mode 100644 index d257006f36..0000000000 --- a/addons/openid_delegation_id/conf/info.xml +++ /dev/null @@ -1,125 +0,0 @@ - - - OpenID delegation ID - OpenID - OpenID Delegation ID - OpenID Delegation ID - OpenID Delegation ID - Delegación ID para OpenID - OpenIDアドオン - Открытый ID(OpenID) - OpenID - - 본인의 도메인을 사용하여 오픈아이디로 활용할 수 있도록 합니다. - 꼭 설정을 통해서 openid provider관련 값을 입력후 사용해주세요. - - - 可以把本人的域名当分散式身份验证系统(OpenID)来使用。 - 必须在设置中输入openid provider相关值后再使用。 - - - This addon enables you to use your own domain name as an OpenID. - Just be sure to set the values related with openid provider before using. - - - Addon này cho phép bạn sử dụng tên miền của mình như một OpenID. - Hãy kiểm tra để đặt giá trị liên quan với OpenID trước khi sử dụng. - - - Dieses Addon ermöglicht es Ihnen, mit Ihrem eigenen Domain-Namen als OpenID. - Einfach sicher sein, dass die Werte im Zusammenhang mit OpenID-Provider, bevor Sie. - - - Utlizando su propio dominio puede usar como OpenID. - Debe utilizar luego de ingresar los valores relacionado con openid provider a través de la configuracion. - - - 保有しているオリジナルドメインをオープンIDとして活用することが出来ます。 - 必ず設定にて、OpenIDプロバイダーの関連情報を入力してから使用して下さい。 - - - Этот аддон позволяет Вам использовать Ваше доменное имя как OpenID. - Прежде, чем использовать, установите значения, имеющие отношение к openid-провайдеру . - - - 可將原本的域名當做OpenID來使用。 - 必須在設置中輸入openid provider相關資料後再使用。 - - 1.7 - 2013-11-27 - - - NAVER - NAVER - NAVER - NAVER - NAVER - NAVER - NAVER - NAVER - NAVER - - - - - server - server - server - Server - server - Servidor - server - server - server - openid.server 값을 입력해 주세요. - 请输入 openid.server 值。 - Hãy nhập OpenID Server của bạn. - Please input your openid.server value. - Bitte geben Sie Ihre openid.server Wert. - Ingrese el valor del openid.server. - openid.server値を入力して下さい。 - Пожалуйста, введите Ваше значение openid.server - 請輸入 openid.server 值。 - - - delegate - delegate - Delegate - delegate - delegate - delegado - delegate - delegate - delegate - openid.delegate값을 입력해주세요. - 请输入 openid.delegate 值。 - Hãy nhập OpenID Delegate của bạn. - Please input your openid.delegate value. - Bitte geben Sie Ihre openid.delegate Wert. - Ingresar el valor del openid.delegate - openid.delegate値を入力して下さい。 - Пожалуйста, введите Ваше значение openid.delegate - 請輸入 openid.delegate 值。 - - - xrds - xrds - xrds - xrds - xrds - xrds - xrds - xrds - xrds - X-XRDS-Location값을 입력해주세요. - 请输入 X-XRDS-Location 值。 - Please input your X-XRDS-Location value. - Hãy nhập X-XRDS-Location của bạn. - Bitte geben Sie Ihre X-XRDS-Standort Wert. - Ingresar el valor de X-XRDS-Location - X-XRDS-Location値を入力して下さい。 - Пожалуйста, введите Ваше значение X-XRDS-Локации. - 請輸入 X-XRDS-Location 值。 - - - diff --git a/addons/openid_delegation_id/openid_delegation_id.addon.php b/addons/openid_delegation_id/openid_delegation_id.addon.php deleted file mode 100644 index 7b9b9d6b07..0000000000 --- a/addons/openid_delegation_id/openid_delegation_id.addon.php +++ /dev/null @@ -1,38 +0,0 @@ - */ - -if(!defined('__XE__')) - exit(); - -/** - * @file openid_delegation_id.addon.php - * @author NAVER (developers@xpressengine.com) - * @brief OpenID Delegation ID Add-on - * - * This enables to use openID as user's homepage or blog url. - * Enter your open ID service information on the configuration. - * */ -// Execute only wen called_position is before_module_init -if($called_position != 'before_module_init') -{ - return; -} -// Get add-on settings(openid_delegation_id) -if(!$addon_info->server || !$addon_info->delegate || !$addon_info->xrds) -{ - return; -} - -$header_script = sprintf( - '' . "\n" . - '' . "\n" . - '', - $addon_info->server, - $addon_info->delegate, - $addon_info->xrds -); - -Context::addHtmlHeader($header_script); - -/* End of file openid_delegation_id.addon.php */ -/* Location: ./addons/openid_delegation_id/openid_delegation_id.addon.php */ diff --git a/classes/file/FileHandler.class.php b/classes/file/FileHandler.class.php index 6ffe9b8b67..d3b73e552f 100644 --- a/classes/file/FileHandler.class.php +++ b/classes/file/FileHandler.class.php @@ -726,6 +726,12 @@ function returnBytes($val) */ function checkMemoryLoadImage(&$imageInfo) { + $memoryLimit = self::returnBytes(ini_get('memory_limit')); + if($memoryLimit == -1) + { + return true; + } + $K64 = 65536; $TWEAKFACTOR = 2.0; $channels = $imageInfo['channels']; @@ -733,12 +739,14 @@ function checkMemoryLoadImage(&$imageInfo) { $channels = 6; //for png } + $memoryNeeded = round(($imageInfo[0] * $imageInfo[1] * $imageInfo['bits'] * $channels / 8 + $K64 ) * $TWEAKFACTOR); $availableMemory = self::returnBytes(ini_get('memory_limit')) - memory_get_usage(); if($availableMemory < $memoryNeeded) { return FALSE; } + return TRUE; } @@ -751,9 +759,10 @@ function checkMemoryLoadImage(&$imageInfo) * @param int $resize_height Height to resize * @param string $target_type If $target_type is set (gif, jpg, png, bmp), result image will be saved as target type * @param string $thumbnail_type Thumbnail type(crop, ratio) + * @param bool $thumbnail_transparent If $target_type is png, set background set transparent color * @return bool TRUE: success, FALSE: failed */ - function createImageFile($source_file, $target_file, $resize_width = 0, $resize_height = 0, $target_type = '', $thumbnail_type = 'crop') + function createImageFile($source_file, $target_file, $resize_width = 0, $resize_height = 0, $target_type = '', $thumbnail_type = 'crop', $thumbnail_transparent = FALSE) { // check params if (($source_file = self::exists($source_file)) === FALSE) @@ -841,7 +850,24 @@ function createImageFile($source_file, $target_file, $resize_width = 0, $resize_ return FALSE; } - imagefilledrectangle($thumb, 0, 0, $resize_width - 1, $resize_height - 1, imagecolorallocate($thumb, 255, 255, 255)); + if(function_exists('imagecolorallocatealpha') && $target_type == 'png' && $thumbnail_transparent) + { + imagefill($thumb, 0, 0, imagecolorallocatealpha($thumb, 0, 0, 0, 127)); + + if(function_exists('imagesavealpha')) + { + imagesavealpha($thumb, TRUE); + } + + if(function_exists('imagealphablending')) + { + imagealphablending($thumb, TRUE); + } + } + else + { + imagefilledrectangle($thumb, 0, 0, $resize_width - 1, $resize_height - 1, imagecolorallocate($thumb, 255, 255, 255)); + } // create temporary image having original type $source = NULL; diff --git a/classes/module/ModuleHandler.class.php b/classes/module/ModuleHandler.class.php index 6d4ff7bea5..89086dcfe5 100644 --- a/classes/module/ModuleHandler.class.php +++ b/classes/module/ModuleHandler.class.php @@ -821,7 +821,7 @@ function procModule() Context::addHtmlFooter($footer); } - if($type == "view" && $kind != 'admin') + if(($type == 'view' || $type == 'mobile') && $kind != 'admin') { $module_config = $oModuleModel->getModuleConfig('module'); if($module_config->htmlFooter) diff --git a/classes/security/Purifier.class.php b/classes/security/Purifier.class.php index 66de017d6d..bacd0073a3 100644 --- a/classes/security/Purifier.class.php +++ b/classes/security/Purifier.class.php @@ -48,6 +48,7 @@ private function _setConfig() $this->_config->set('Attr.IDPrefix', 'user_content_'); $this->_def = $this->_config->getHTMLDefinition(TRUE); + $this->_def->addAttribute('iframe', 'allowfullscreen', 'Text'); } private function _setDefinition(&$content) diff --git a/common/img/icon.bubble.png b/common/img/icon.bubble.png deleted file mode 100644 index 82f6f3aadd..0000000000 Binary files a/common/img/icon.bubble.png and /dev/null differ diff --git a/common/js/common.js b/common/js/common.js index 93c6067210..65e49261e1 100644 --- a/common/js/common.js +++ b/common/js/common.js @@ -4,9 +4,6 @@ * @brief 몇가지 유용한 & 기본적으로 자주 사용되는 자바스크립트 함수들 모음 **/ -/* jQuery 참조변수($) 제거 */ -if(jQuery) jQuery.noConflict(); - if(typeof window.XE == "undefined") { /*jshint -W082 */ (function($, global) { @@ -148,7 +145,7 @@ if(typeof window.XE == "undefined") { isSameHost: function(url) { if(typeof url != "string") return false; - var target_url = global.XE.URI(url).normalizePathname(); + var target_url = global.XE.URI(url).normalizeHostname().normalizePort().normalizePathname(); if(target_url.is('urn')) return false; var port = [Number(global.http_port) || 80, Number(global.https_port) || 443]; @@ -167,7 +164,7 @@ if(typeof window.XE == "undefined") { } if(!base_url) { - base_url = global.XE.URI(global.request_uri).normalizePathname(); + base_url = global.XE.URI(global.request_uri).normalizeHostname().normalizePort().normalizePathname(); base_url = base_url.hostname() + base_url.directory(); } target_url = target_url.hostname() + target_url.directory(); @@ -182,8 +179,8 @@ if(typeof window.XE == "undefined") { $(function() { $('a[target]').each(function() { var $this = $(this); - var href = $this.attr('href').trim(); - var target = $this.attr('target').trim(); + var href = String($this.attr('href')).trim(); + var target = String($this.attr('target')).trim(); if(!target || !href) return; if(!href.match(/^(https?:\/\/)/)) return; @@ -208,7 +205,7 @@ if(typeof window.XE == "undefined") { $('body').on('click', 'a[target]', function(e) { var $this = $(this); - var href = $this.attr('href').trim(); + var href = String($this.attr('href')).trim(); if(!href) return; if(!href.match(/^(https?:\/\/)/)) return; diff --git a/common/js/xe.js b/common/js/xe.js index 2c4008df6a..c718363189 100644 --- a/common/js/xe.js +++ b/common/js/xe.js @@ -982,9 +982,6 @@ d.fn.uri=function(b){var d=this.first(),g=d.get(0),h=u(g);if(!h)throw Error('Ele this._string),this._dom_element[this._dom_attribute]=this._string;else if(!0===b)this._deferred_build=!0;else if(void 0===b||this._deferred_build)this._string=k.build(this._parts),this._deferred_build=!1;return this};var q=/^([a-zA-Z]+)\s*([\^\$*]?=|:)\s*(['"]?)(.+)\3|^\s*([a-zA-Z0-9]+)\s*$/;var w=d.expr.createPseudo?d.expr.createPseudo(function(b){return function(d){return p(d,b)}}):function(b,d,g){return p(b,g[3])};d.expr[":"].uri=w;return d}); !function(e){"use strict";function n(e){if("undefined"==typeof e.length)o(e,"click",t);else if("string"!=typeof e&&!(e instanceof String))for(var n=0;n-1&&!a.getQuery("vid")&&(a=a.setQuery("vid",xeVid));try{"_blank"!=b&&winopen_list[b]&&(winopen_list[b].close(),winopen_list[b]=null)}catch(a){}if(void 0===b&&(b="_blank"),void 0===c&&(c=""),window.XE.isSameHost(a)){var d=window.open(a,b,c);d.focus(),"_blank"!=b&&(winopen_list[b]=d)}else window.blankshield.open(a,b,c)}function popopen(a,b){winopen(a,b,"width=800,height=600,scrollbars=yes,resizable=yes,toolbars=no")}function sendMailTo(a){location.href="mailto:"+a}function move_url(a,b){return!!a&&(/^\./.test(a)&&(a=window.request_uri+a),void 0===b||"N"==b?location.href=a:winopen(a),!1)}function displayMultimedia(a,b,c,d){var e=_displayMultimedia(a,b,c,d);e&&document.writeln(e)}function _displayMultimedia(a,b,c,d){0===a.indexOf("files")&&(a=request_uri+a);var e={wmode:"transparent",allowScriptAccess:"never",quality:"high",flashvars:"",autostart:!1},f=jQuery.extend(e,d||{}),g=f.autostart&&"false"!=f.autostart?"true":"false";delete f.autostart;var h="",i="",j="";if(/\.(gif|jpg|jpeg|bmp|png)$/i.test(a))j='';else if(/\.flv$/i.test(a)||/\.mov$/i.test(a)||/\.moov$/i.test(a)||/\.m4v$/i.test(a))j='';else if(/\.swf/i.test(a)){h="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",i="undefined"!=typeof enforce_ssl&&enforce_ssl?"https://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0":"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0",j='',j+='';for(var k in f)"undefined"!=f[k]&&""!==f[k]&&(j+='');j+=''}else(jQuery.browser.mozilla||jQuery.browser.opera)&&(g=f.autostart&&"false"!=f.autostart?"1":"0"),j='.popup");e=h.css({overflow:"scroll"}).offset(),a=h.width(10).height(1e4).get(0).scrollWidth+2*e.left,b=h.height(10).width(1e4).get(0).scrollHeight+2*e.top,a<800&&(a=800+2*e.left),c=g.width(),d=g.height(),a!=c&&window.resizeBy(a-c,0),b!=d&&window.resizeBy(0,b-d),h.width(a-2*e.left).css({overflow:"",height:""})}function doCallModuleAction(a,b,c){var d={target_srl:c,cur_mid:current_mid,mid:current_mid};exec_xml(a,b,d,completeCallModuleAction)}function completeCallModuleAction(a,b){"success"!=a.message&&alert(a.message),location.reload()}function completeMessage(a){alert(a.message),location.reload()}function doChangeLangType(a){if("string"==typeof a)setLangType(a);else{setLangType(a.options[a.selectedIndex].value)}location.href=location.href.setQuery("l","")}function setLangType(a){var b=new Date;b.setTime(b.getTime()+6048e8),setCookie("lang_type",a,b,"/")}function doDocumentPreview(a){for(var b=a;"FORM"!=b.nodeName;)b=b.parentNode;if("FORM"==b.nodeName){var c=b.getAttribute("editor_sequence"),d=editorGetContent(c),e=(window.open("","previewDocument","toolbars=no,width=700px;height=800px,scrollbars=yes,resizable=yes"),jQuery("#previewDocument"));e.length?e=e[0]:(jQuery('
').appendTo(document.body),e=jQuery("#previewDocument")[0]),e&&(e.content.value=d,e.submit())}}function doDocumentSave(a){var b=a.form.getAttribute("editor_sequence"),c=editorRelKeys[b].content.value;if(void 0!==b&&b&&"undefined"!=typeof editorRelKeys&&"function"==typeof editorGetContent){var d=editorGetContent(b);editorRelKeys[b].content.value=d}var e={},f=["error","message","document_srl"],g=(a.form.elements,jQuery(a.form).serializeArray());return jQuery.each(g,function(a,b){var c=jQuery.trim(b.value);if(!c)return!0;/\[\]$/.test(b.name)&&(b.name=b.name.replace(/\[\]$/,"")),e[b.name]?e[b.name]+="|@|"+c:e[b.name]=b.value}),exec_xml("document","procDocumentTempSave",e,completeDocumentSave,f,e,a.form),editorRelKeys[b].content.value=c,!1}function completeDocumentSave(a){jQuery("input[name=document_srl]").eq(0).val(a.document_srl),alert(a.message)}function doDocumentLoad(a){objForSavedDoc=a.form,popopen(request_uri.setQuery("module","document").setQuery("act","dispTempSavedList"))}function doDocumentSelect(a,b){if(!opener||!opener.objForSavedDoc)return void window.close();switch(void 0===b&&(b="document"),b){case"page":var c=opener.current_url;c=c.setQuery("document_srl",a),c="dispPageAdminMobileContentModify"===c.getQuery("act")?c.setQuery("act","dispPageAdminMobileContentModify"):c.setQuery("act","dispPageAdminContentModify"),opener.location.href=c;break;default:opener.location.href=opener.current_url.setQuery("document_srl",a).setQuery("act","dispBoardWrite")}window.close()}function viewSkinInfo(a,b){popopen("./?module=module&act=dispModuleSkinInfo&selected_module="+a+"&skin="+b,"SkinInfo")}function doAddDocumentCart(a){var b=a.value;addedDocument[addedDocument.length]=b,setTimeout(function(){callAddDocumentCart(addedDocument.length)},100)}function callAddDocumentCart(a){if(!(addedDocument.length<1||a!=addedDocument.length)){var b=[];b.srls=addedDocument.join(","),exec_xml("document","procDocumentAddCart",b,null),addedDocument=[]}}function transRGB2Hex(a){if(!a)return a;if(a.indexOf("#")>-1)return a.replace(/^#/,"");if(a.toLowerCase().indexOf("rgb")<0)return a;a=a.replace(/^rgb\(/i,"").replace(/\)$/,""),value_list=a.split(",");for(var b="",c=0;c'),b.elements._filter.value=a,k[0]=a,k[1]=function(a){var i={},k=(a.elements,j(a).serializeArray());if(j.each(k,function(a,b){var c=j.trim(b.value),d=b.name;if(!c||!d)return!0;h[d]&&(d=h[d]),/\[\]$/.test(d)&&(d=d.replace(/\[\]$/,"")),i[d]?i[d]+="|@|"+c:i[d]=b.value}),g&&!confirm(g))return!1;exec_xml(c,d,i,e,f,i,b)},i.cast("ADD_CALLBACK",k),i.cast("VALIDATE",[b,a]),!1)}if(window.Modernizr=function(a,b,c){function d(a){t.cssText=a}function e(a,b){return d(x.join(a+";")+(b||""))}function f(a,b){return typeof a===b}function g(a,b){return!!~(""+a).indexOf(b)}function h(a,b){for(var d in a){var e=a[d];if(!g(e,"-")&&t[e]!==c)return"pfx"!=b||e}return!1}function i(a,b,d){for(var e in a){var g=b[a[e]];if(g!==c)return!1===d?a[e]:f(g,"function")?g.bind(d||b):g}return!1}function j(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+z.join(d+" ")+d).split(" ");return f(b,"string")||f(b,"undefined")?h(e,b):(e=(a+" "+A.join(d+" ")+d).split(" "),i(e,b,c))}function k(){o.input=function(c){for(var d=0,e=c.length;d',a,""].join(""),j.id=r,(k?j:l).innerHTML+=f,l.appendChild(j),k||(l.style.background="",l.style.overflow="hidden",i=q.style.overflow,q.style.overflow="hidden",q.appendChild(l)),g=c(j,a),k?j.parentNode.removeChild(j):(l.parentNode.removeChild(l),q.style.overflow=i),!!g},I=function(){function a(a,e){e=e||b.createElement(d[a]||"div"),a="on"+a;var g=a in e;return g||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(a,""),g=f(e[a],"function"),f(e[a],"undefined")||(e[a]=c),e.removeAttribute(a))),e=null,g}var d={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return a}(),J={}.hasOwnProperty;m=f(J,"undefined")||f(J.call,"undefined")?function(a,b){return b in a&&f(a.constructor.prototype[b],"undefined")}:function(a,b){return J.call(a,b)},Function.prototype.bind||(Function.prototype.bind=function(a){var b=this;if("function"!=typeof b)throw new TypeError;var c=G.call(arguments,1),d=function(){if(this instanceof d){var e=function(){};e.prototype=b.prototype;var f=new e,g=b.apply(f,c.concat(G.call(arguments)));return Object(g)===g?g:f}return b.apply(a,c.concat(G.call(arguments)))};return d}),C.flexbox=function(){return j("flexWrap")},C.flexboxlegacy=function(){return j("boxDirection")},C.canvas=function(){var a=b.createElement("canvas");return!(!a.getContext||!a.getContext("2d"))},C.canvastext=function(){return!(!o.canvas||!f(b.createElement("canvas").getContext("2d").fillText,"function"))},C.webgl=function(){return!!a.WebGLRenderingContext},C.touch=function(){var c;return"ontouchstart"in a||a.DocumentTouch&&b instanceof DocumentTouch?c=!0:H(["@media (",x.join("touch-enabled),("),r,")","{#modernizr{top:9px;position:absolute}}"].join(""),function(a){c=9===a.offsetTop}),c},C.geolocation=function(){return"geolocation"in navigator},C.postmessage=function(){return!!a.postMessage},C.websqldatabase=function(){return!!a.openDatabase},C.indexedDB=function(){return!!j("indexedDB",a)},C.hashchange=function(){return I("hashchange",a)&&(b.documentMode===c||b.documentMode>7)},C.history=function(){return!(!a.history||!history.pushState)},C.draganddrop=function(){var a=b.createElement("div");return"draggable"in a||"ondragstart"in a&&"ondrop"in a},C.websockets=function(){return"WebSocket"in a||"MozWebSocket"in a},C.rgba=function(){return d("background-color:rgba(150,255,150,.5)"),g(t.backgroundColor,"rgba")},C.hsla=function(){return d("background-color:hsla(120,40%,100%,.5)"),g(t.backgroundColor,"rgba")||g(t.backgroundColor,"hsla")},C.multiplebgs=function(){return d("background:url(https://),url(https://),red url(https://)"),/(url\s*\(.*?){3}/.test(t.background)},C.backgroundsize=function(){return j("backgroundSize")},C.borderimage=function(){return j("borderImage")},C.borderradius=function(){return j("borderRadius")},C.boxshadow=function(){return j("boxShadow")},C.textshadow=function(){return""===b.createElement("div").style.textShadow},C.opacity=function(){return e("opacity:.55"),/^0.55$/.test(t.opacity)},C.cssanimations=function(){return j("animationName")},C.csscolumns=function(){return j("columnCount")},C.cssgradients=function(){var a="background-image:";return d((a+"-webkit- ".split(" ").join("gradient(linear,left top,right bottom,from(#9f9),to(white));"+a)+x.join("linear-gradient(left top,#9f9, white);"+a)).slice(0,-a.length)),g(t.backgroundImage,"gradient")},C.cssreflections=function(){return j("boxReflect")},C.csstransforms=function(){return!!j("transform")},C.csstransforms3d=function(){var a=!!j("perspective");return a&&"webkitPerspective"in q.style&&H("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(b,c){a=9===b.offsetLeft&&3===b.offsetHeight}),a},C.csstransitions=function(){return j("transition")},C.fontface=function(){var a;return H('@font-face {font-family:"font";src:url("https://")}',function(c,d){var e=b.getElementById("smodernizr"),f=e.sheet||e.styleSheet,g=f?f.cssRules&&f.cssRules[0]?f.cssRules[0].cssText:f.cssText||"":"";a=/src/i.test(g)&&0===g.indexOf(d.split(" ")[0])}),a},C.generatedcontent=function(){var a;return H(["#",r,"{font:0/0 a}#",r,':after{content:"',v,'";visibility:hidden;font:3px/1 a}'].join(""),function(b){a=b.offsetHeight>=3}),a},C.video=function(){var a=b.createElement("video"),c=!1;try{(c=!!a.canPlayType)&&(c=new Boolean(c),c.ogg=a.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,""),c.h264=a.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,""),c.webm=a.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,""))}catch(a){}return c},C.audio=function(){var a=b.createElement("audio"),c=!1;try{(c=!!a.canPlayType)&&(c=new Boolean(c),c.ogg=a.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),c.mp3=a.canPlayType("audio/mpeg;").replace(/^no$/,""),c.wav=a.canPlayType('audio/wav; codecs="1"').replace(/^no$/,""),c.m4a=(a.canPlayType("audio/x-m4a;")||a.canPlayType("audio/aac;")).replace(/^no$/,""))}catch(a){}return c},C.localstorage=function(){try{return localStorage.setItem(r,r),localStorage.removeItem(r),!0}catch(a){return!1}},C.sessionstorage=function(){try{return sessionStorage.setItem(r,r),sessionStorage.removeItem(r),!0}catch(a){return!1}},C.webworkers=function(){return!!a.Worker},C.applicationcache=function(){return!!a.applicationCache},C.svg=function(){return!!b.createElementNS&&!!b.createElementNS(B.svg,"svg").createSVGRect},C.inlinesvg=function(){var a=b.createElement("div");return a.innerHTML="",(a.firstChild&&a.firstChild.namespaceURI)==B.svg},C.smil=function(){return!!b.createElementNS&&/SVGAnimate/.test(w.call(b.createElementNS(B.svg,"animate")))},C.svgclippaths=function(){return!!b.createElementNS&&/SVGClipPath/.test(w.call(b.createElementNS(B.svg,"clipPath")))};for(var K in C)m(C,K)&&(l=K.toLowerCase(),o[l]=C[K](),F.push((o[l]?"":"no-")+l));return o.input||k(),o.addTest=function(a,b){if("object"==typeof a)for(var d in a)m(a,d)&&o.addTest(d,a[d]);else{if(a=a.toLowerCase(),o[a]!==c)return o;b="function"==typeof b?b():b,void 0!==p&&p&&(q.className+=" modernizr-"+(b?"":"no-")+a),o[a]=b}return o},d(""),s=u=null,function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=s.elements;return"string"==typeof a?a.split(" "):a}function e(a){var b=r[a[p]];return b||(b={},q++,a[p]=q,r[q]=b),b}function f(a,c,d){if(c||(c=b),k)return c.createElement(a);d||(d=e(c));var f;return f=d.cache[a]?d.cache[a].cloneNode():o.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!f.canHaveChildren||n.test(a)||f.tagUrn?f:d.frag.appendChild(f)}function g(a,c){if(a||(a=b),k)return a.createDocumentFragment();c=c||e(a);for(var f=c.frag.cloneNode(),g=0,h=d(),i=h.length;g",j="hidden"in a,k=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return void 0===a.cloneNode||void 0===a.createDocumentFragment||void 0===a.createElement}()}catch(a){j=!0,k=!0}}();var s={elements:m.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:l,shivCSS:!1!==m.shivCSS,supportsUnknownElements:k,shivMethods:!1!==m.shivMethods,type:"default",shivDocument:i,createElement:f,createDocumentFragment:g};a.html5=s,i(b)}(this,b),o._version=n,o._prefixes=x,o._domPrefixes=A,o._cssomPrefixes=z,o.hasEvent=I,o.testProp=function(a){return h([a])},o.testAllProps=j,o.testStyles=H,q.className=q.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(p?" modernizr-js modernizr-"+F.join(" modernizr-"):""),o}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==q.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=r.shift();s=1,a?a.t?o(function(){("c"==a.t?m.injectCss:m.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):s=0}function i(a,c,d,e,f,i,j){function k(b){if(!n&&g(l.readyState)&&(t.r=n=1,!s&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&o(function(){v.removeChild(l)},50);for(var d in A[c])A[c].hasOwnProperty(d)&&A[c][d].onload()}}var j=j||m.errorTimeout,l=b.createElement(a),n=0,q=0,t={t:d,s:c,e:f,a:i,x:j};1===A[c]&&(q=1,A[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,q)},r.splice(e,0,t),"img"!=a&&(q||2===A[c]?(v.insertBefore(l,u?null:p),o(k,j)):A[c].push(l))}function j(a,b,c,d,f){return s=0,b=b||"j",e(a)?i("c"==b?x:w,a,b,this.i++,c,d,f):(r.splice(this.i++,0,a),1==r.length&&h()),this}function k(){var a=m;return a.loader={load:j,i:0},a}var l,m,n=b.documentElement,o=a.setTimeout,p=b.getElementsByTagName("script")[0],q={}.toString,r=[],s=0,t="MozAppearance"in n.style,u=t&&!!b.createRange().compareNode,v=u?n:p.parentNode,n=a.opera&&"[object Opera]"==q.call(a.opera),n=!!b.attachEvent&&!n,w=t?"object":n?"script":"img",x=n?"script":w,y=Array.isArray||function(a){return"[object Array]"==q.call(a)},z=[],A={},B={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}};m=function(a){function b(a){var b,c,d,a=a.split("!"),e=z.length,f=a.pop(),g=a.length,f={url:f,origUrl:f,prefixes:a};for(c=0;ce&&("0"===b[0]&&1e&&(b=g,e=f)):"0"===a[d]&&(h=!0,g=d,f=1);for(f>e&&(b=g,e=f),1=b&&e>>10&1023|55296),a=56320|1023&a),b+=t(a)}).join("")}function g(a,b){return a+22+75*(26>a)-((0!=b)<<5)}function h(a,b,c){var d=0;for(a=c?s(a/700):a>>1,a+=s(a/b);455l&&(l=0),c=0;c=g&&b("invalid-input");var n=a.charCodeAt(l++);n=10>n-48?n-22:26>n-65?n-65:26>n-97?n-97:36,(36<=n||n>s((2147483647-i)/m))&&b("overflow"),i+=n*m;var o=d<=k?1:d>=k+26?26:d-k;if(ns(2147483647/n)&&b("overflow"),m*=n}m=e.length+1,k=h(i-c,m,0==c),s(i/m)>2147483647-j&&b("overflow"),j+=s(i/m),i%=m,e.splice(i++,0,j)}return f(e)}function j(a){var c,d,f,i=[];a=e(a);var j=a.length,k=128,l=0,m=72;for(f=0;fn&&i.push(t(n))}for((c=d=i.length)&&i.push("-");c=k&&ns((2147483647-l)/p)&&b("overflow"),l+=(o-k)*p,k=o,f=0;f=m+26?26:o-m,!(q= 0x80 (not a basic code point)","invalid-input":"Invalid input"},s=Math.floor,t=String.fromCharCode,u={version:"1.3.2",ucs2:{decode:e,encode:f},decode:i,encode:j,toASCII:function(a){return d(a,function(a){return p.test(a)?"xn--"+j(a):a})},toUnicode:function(a){return d(a,function(a){return o.test(a)?i(a.slice(4).toLowerCase()):a})}};if("function"==typeof define&&"object"==typeof define.amd&&define.amd)define("punycode",function(){return u});else if(k&&l)if(module.exports==k)l.exports=u;else for(n in u)u.hasOwnProperty(n)&&(k[n]=u[n]);else a.punycode=u}(this),function(a,b){"object"==typeof module&&module.exports?module.exports=b():"function"==typeof define&&define.amd?define(b):a.SecondLevelDomains=b(a)}(this,function(a){var b=a&&a.SecondLevelDomains,c={list:{ac:" com gov mil net org ",ae:" ac co gov mil name net org pro sch ",af:" com edu gov net org ",al:" com edu gov mil net org ",ao:" co ed gv it og pb ",ar:" com edu gob gov int mil net org tur ",at:" ac co gv or ",au:" asn com csiro edu gov id net org ",ba:" co com edu gov mil net org rs unbi unmo unsa untz unze ",bb:" biz co com edu gov info net org store tv ",bh:" biz cc com edu gov info net org ",bn:" com edu gov net org ",bo:" com edu gob gov int mil net org tv ",br:" adm adv agr am arq art ato b bio blog bmd cim cng cnt com coop ecn edu eng esp etc eti far flog fm fnd fot fst g12 ggf gov imb ind inf jor jus lel mat med mil mus net nom not ntr odo org ppg pro psc psi qsl rec slg srv tmp trd tur tv vet vlog wiki zlg ",bs:" com edu gov net org ",bz:" du et om ov rg ",ca:" ab bc mb nb nf nl ns nt nu on pe qc sk yk ",ck:" biz co edu gen gov info net org ",cn:" ac ah bj com cq edu fj gd gov gs gx gz ha hb he hi hl hn jl js jx ln mil net nm nx org qh sc sd sh sn sx tj tw xj xz yn zj ",co:" com edu gov mil net nom org ",cr:" ac c co ed fi go or sa ",cy:" ac biz com ekloges gov ltd name net org parliament press pro tm ",do:" art com edu gob gov mil net org sld web ",dz:" art asso com edu gov net org pol ",ec:" com edu fin gov info med mil net org pro ",eg:" com edu eun gov mil name net org sci ",er:" com edu gov ind mil net org rochest w ",es:" com edu gob nom org ",et:" biz com edu gov info name net org ",fj:" ac biz com info mil name net org pro ",fk:" ac co gov net nom org ",fr:" asso com f gouv nom prd presse tm ",gg:" co net org ",gh:" com edu gov mil org ",gn:" ac com gov net org ",gr:" com edu gov mil net org ",gt:" com edu gob ind mil net org ",gu:" com edu gov net org ",hk:" com edu gov idv net org ",hu:" 2000 agrar bolt casino city co erotica erotika film forum games hotel info ingatlan jogasz konyvelo lakas media news org priv reklam sex shop sport suli szex tm tozsde utazas video ",id:" ac co go mil net or sch web ",il:" ac co gov idf k12 muni net org ",in:" ac co edu ernet firm gen gov i ind mil net nic org res ",iq:" com edu gov i mil net org ",ir:" ac co dnssec gov i id net org sch ",it:" edu gov ",je:" co net org ",jo:" com edu gov mil name net org sch ",jp:" ac ad co ed go gr lg ne or ",ke:" ac co go info me mobi ne or sc ",kh:" com edu gov mil net org per ",ki:" biz com de edu gov info mob net org tel ",km:" asso com coop edu gouv k medecin mil nom notaires pharmaciens presse tm veterinaire ",kn:" edu gov net org ",kr:" ac busan chungbuk chungnam co daegu daejeon es gangwon go gwangju gyeongbuk gyeonggi gyeongnam hs incheon jeju jeonbuk jeonnam k kg mil ms ne or pe re sc seoul ulsan ",kw:" com edu gov net org ",ky:" com edu gov net org ",kz:" com edu gov mil net org ",lb:" com edu gov net org ",lk:" assn com edu gov grp hotel int ltd net ngo org sch soc web ",lr:" com edu gov net org ",lv:" asn com conf edu gov id mil net org ",ly:" com edu gov id med net org plc sch ",ma:" ac co gov m net org press ",mc:" asso tm ",me:" ac co edu gov its net org priv ",mg:" com edu gov mil nom org prd tm ",mk:" com edu gov inf name net org pro ",ml:" com edu gov net org presse ",mn:" edu gov org ",mo:" com edu gov net org ",mt:" com edu gov net org ",mv:" aero biz com coop edu gov info int mil museum name net org pro ",mw:" ac co com coop edu gov int museum net org ",mx:" com edu gob net org ",my:" com edu gov mil name net org sch ",nf:" arts com firm info net other per rec store web ",ng:" biz com edu gov mil mobi name net org sch ",ni:" ac co com edu gob mil net nom org ",np:" com edu gov mil net org ",nr:" biz com edu gov info net org ",om:" ac biz co com edu gov med mil museum net org pro sch ",pe:" com edu gob mil net nom org sld ",ph:" com edu gov i mil net ngo org ",pk:" biz com edu fam gob gok gon gop gos gov net org web ",pl:" art bialystok biz com edu gda gdansk gorzow gov info katowice krakow lodz lublin mil net ngo olsztyn org poznan pwr radom slupsk szczecin torun warszawa waw wroc wroclaw zgora ",pr:" ac biz com edu est gov info isla name net org pro prof ",ps:" com edu gov net org plo sec ",pw:" belau co ed go ne or ",ro:" arts com firm info nom nt org rec store tm www ",rs:" ac co edu gov in org ",sb:" com edu gov net org ",sc:" com edu gov net org ",sh:" co com edu gov net nom org ",sl:" com edu gov net org ",st:" co com consulado edu embaixada gov mil net org principe saotome store ",sv:" com edu gob org red ",sz:" ac co org ",tr:" av bbs bel biz com dr edu gen gov info k12 name net org pol tel tsk tv web ",tt:" aero biz cat co com coop edu gov info int jobs mil mobi museum name net org pro tel travel ",tw:" club com ebiz edu game gov idv mil net org ",mu:" ac co com gov net or org ",mz:" ac co edu gov org ",na:" co com ",nz:" ac co cri geek gen govt health iwi maori mil net org parliament school ",pa:" abo ac com edu gob ing med net nom org sld ",pt:" com edu gov int net nome org publ ",py:" com edu gov mil net org ",qa:" com edu gov mil net org ",re:" asso com nom ",ru:" ac adygeya altai amur arkhangelsk astrakhan bashkiria belgorod bir bryansk buryatia cbg chel chelyabinsk chita chukotka chuvashia com dagestan e-burg edu gov grozny int irkutsk ivanovo izhevsk jar joshkar-ola kalmykia kaluga kamchatka karelia kazan kchr kemerovo khabarovsk khakassia khv kirov koenig komi kostroma kranoyarsk kuban kurgan kursk lipetsk magadan mari mari-el marine mil mordovia mosreg msk murmansk nalchik net nnov nov novosibirsk nsk omsk orenburg org oryol penza perm pp pskov ptz rnd ryazan sakhalin samara saratov simbirsk smolensk spb stavropol stv surgut tambov tatarstan tom tomsk tsaritsyn tsk tula tuva tver tyumen udm udmurtia ulan-ude vladikavkaz vladimir vladivostok volgograd vologda voronezh vrn vyatka yakutia yamal yekaterinburg yuzhno-sakhalinsk ",rw:" ac co com edu gouv gov int mil net ",sa:" com edu gov med net org pub sch ",sd:" com edu gov info med net org tv ",se:" a ac b bd c d e f g h i k l m n o org p parti pp press r s t tm u w x y z ",sg:" com edu gov idn net org per ",sn:" art com edu gouv org perso univ ",sy:" com edu gov mil net news org ",th:" ac co go in mi net or ",tj:" ac biz co com edu go gov info int mil name net nic org test web ",tn:" agrinet com defense edunet ens fin gov ind info intl mincom nat net org perso rnrt rns rnu tourism ",tz:" ac co go ne or ",ua:" biz cherkassy chernigov chernovtsy ck cn co com crimea cv dn dnepropetrovsk donetsk dp edu gov if in ivano-frankivsk kh kharkov kherson khmelnitskiy kiev kirovograd km kr ks kv lg lugansk lutsk lviv me mk net nikolaev od odessa org pl poltava pp rovno rv sebastopol sumy te ternopil uzhgorod vinnica vn zaporizhzhe zhitomir zp zt ",ug:" ac co go ne or org sc ",uk:" ac bl british-library co cym gov govt icnet jet lea ltd me mil mod national-library-scotland nel net nhs nic nls org orgn parliament plc police sch scot soc ",us:" dni fed isa kids nsn ",uy:" com edu gub mil net org ",ve:" co com edu gob info mil net org web ",vi:" co com k12 net org ",vn:" ac biz com edu gov health info int name net org pro ",ye:" co com gov ltd me net org plc ",yu:" ac co edu gov org ",za:" ac agric alt bourse city co cybernet db edu gov grondar iaccess imt inca landesign law mil net ngo nis nom olivetti org pix school tm web ",zm:" ac co com edu gov net org sch ",com:"ar br cn de eu gb gr hu jpn kr no qc ru sa se uk us uy za ",net:"gb jp se uk ",org:"ae",de:"com "},has:function(a){var b=a.lastIndexOf(".");if(0>=b||b>=a.length-1)return!1;var d=a.lastIndexOf(".",b-1);if(0>=d||d>=b-1)return!1;var e=c.list[a.slice(b+1)];return!!e&&0<=e.indexOf(" "+a.slice(d+1,b)+" ")},is:function(a){var b=a.lastIndexOf(".");if(0>=b||b>=a.length-1||0<=a.lastIndexOf(".",b-1))return!1;var d=c.list[a.slice(b+1)];return!!d&&0<=d.indexOf(" "+a.slice(0,b)+" ")},get:function(a){var b=a.lastIndexOf(".");if(0>=b||b>=a.length-1)return null;var d=a.lastIndexOf(".",b-1);if(0>=d||d>=b-1)return null;var e=c.list[a.slice(b+1)];return!e||0>e.indexOf(" "+a.slice(d+1,b)+" ")?null:a.slice(d+1)},noConflict:function(){return a.SecondLevelDomains===this&&(a.SecondLevelDomains=b),this}};return c}),function(a,b){"object"==typeof module&&module.exports?module.exports=b(require("./punycode"),require("./IPv6"),require("./SecondLevelDomains")):"function"==typeof define&&define.amd?define(["./punycode","./IPv6","./SecondLevelDomains"],b):a.URI=b(a.punycode,a.IPv6,a.SecondLevelDomains,a)}(this,function(a,b,c,d){function e(a,b){var c=1<=arguments.length,d=2<=arguments.length;if(!(this instanceof e))return c?d?new e(a,b):new e(a):new e;if(void 0===a){if(c)throw new TypeError("undefined is not a valid argument for URI");a="undefined"!=typeof location?location.href+"":""}if(null===a&&c)throw new TypeError("null is not a valid argument for URI");return this.href(a),void 0!==b?this.absoluteTo(b):this}function f(a){return a.replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1")}function g(a){return void 0===a?"Undefined":String(Object.prototype.toString.call(a)).slice(8,-1)}function h(a){return"Array"===g(a)}function i(a,b){var c,d={};if("RegExp"===g(b))d=null;else if(h(b)){var e=0;for(c=b.length;e]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?\u00ab\u00bb\u201c\u201d\u2018\u2019]))/gi,e.findUri={start:/\b(?:([a-z][a-z0-9.+-]*:\/\/)|www\.)/gi,end:/[\s\r\n]|$/,trim:/[`!()\[\]{};:'".,<>?\u00ab\u00bb\u201c\u201d\u201e\u2018\u2019]+$/,parens:/(\([^\)]*\)|\[[^\]]*\]|\{[^}]*\}|<[^>]*>)/g},e.defaultPorts={http:"80",https:"443",ftp:"21",gopher:"70",ws:"80",wss:"443"},e.hostProtocols=["http","https"],e.invalid_hostname_characters=/[^a-zA-Z0-9\.\-:_]/,e.domAttributes={a:"href",blockquote:"cite",link:"href",base:"href",script:"src",form:"action",img:"src",area:"href",iframe:"src",embed:"src",source:"src",track:"src",input:"src",audio:"src",video:"src"},e.getDomAttribute=function(a){if(a&&a.nodeName){var b=a.nodeName.toLowerCase();if("input"!==b||"image"===a.type)return e.domAttributes[b]}},e.encode=n,e.decode=decodeURIComponent,e.iso8859=function(){e.encode=escape,e.decode=unescape},e.unicode=function(){e.encode=n,e.decode=decodeURIComponent},e.characters={pathname:{encode:{expression:/%(24|26|2B|2C|3B|3D|3A|40)/gi,map:{"%24":"$","%26":"&","%2B":"+","%2C":",","%3B":";","%3D":"=","%3A":":","%40":"@"}},decode:{expression:/[\/\?#]/g,map:{"/":"%2F","?":"%3F","#":"%23"}}},reserved:{encode:{expression:/%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/gi,map:{"%3A":":","%2F":"/","%3F":"?","%23":"#","%5B":"[","%5D":"]","%40":"@","%21":"!","%24":"$","%26":"&","%27":"'","%28":"(","%29":")","%2A":"*","%2B":"+","%2C":",","%3B":";","%3D":"="}}},urnpath:{encode:{expression:/%(21|24|27|28|29|2A|2B|2C|3B|3D|40)/gi,map:{"%21":"!","%24":"$","%27":"'","%28":"(","%29":")","%2A":"*","%2B":"+","%2C":",","%3B":";","%3D":"=","%40":"@"}},decode:{expression:/[\/\?#:]/g,map:{"/":"%2F","?":"%3F","#":"%23",":":"%3A"}}}},e.encodeQuery=function(a,b){var c=e.encode(a+"");return void 0===b&&(b=e.escapeQuerySpace),b?c.replace(/%20/g,"+"):c},e.decodeQuery=function(a,b){a+="",void 0===b&&(b=e.escapeQuerySpace);try{return e.decode(b?a.replace(/\+/g,"%20"):a)}catch(b){return a}};var t,u={encode:"encode",decode:"decode"},v=function(a,b){return function(c){try{return e[b](c+"").replace(e.characters[a][b].expression,function(c){return e.characters[a][b].map[c]})}catch(a){return c}}};for(t in u)e[t+"PathSegment"]=v("pathname",u[t]),e[t+"UrnPathSegment"]=v("urnpath",u[t]);u=function(a,b,c){return function(d){var f=c?function(a){return e[b](e[c](a))}:e[b];d=(d+"").split(a);for(var g=0,h=d.length;gc?a.charAt(0)===b.charAt(0)&&"/"===a.charAt(0)?"/":"":("/"===a.charAt(c)&&"/"===b.charAt(c)||(c=a.substring(0,c).lastIndexOf("/")),a.substring(0,c+1))},e.withinString=function(a,b,c){c||(c={});var d=c.start||e.findUri.start,f=c.end||e.findUri.end,g=c.trim||e.findUri.trim,h=c.parens||e.findUri.parens,i=/[a-z0-9-]=["']?$/i;for(d.lastIndex=0;;){var j=d.exec(a);if(!j)break;var k=j.index;if(c.ignoreHtml){var l=a.slice(Math.max(k-3,0),k);if(l&&i.test(l))continue}var m=k+a.slice(k).search(f);for(l=a.slice(k,m),m=-1;;){var n=h.exec(l);if(!n)break;m=Math.max(m,n.index+n[0].length)}l=-1b))throw new TypeError('Port "'+a+'" is not a valid port')}},e.noConflict=function(a){return a?(a={URI:this.noConflict()},d.URITemplate&&"function"==typeof d.URITemplate.noConflict&&(a.URITemplate=d.URITemplate.noConflict()),d.IPv6&&"function"==typeof d.IPv6.noConflict&&(a.IPv6=d.IPv6.noConflict()),d.SecondLevelDomains&&"function"==typeof d.SecondLevelDomains.noConflict&&(a.SecondLevelDomains=d.SecondLevelDomains.noConflict()),a):(d.URI===this&&(d.URI=q),this)},r.build=function(a){return!0===a?this._deferred_build=!0:(void 0===a||this._deferred_build)&&(this._string=e.build(this._parts),this._deferred_build=!1),this},r.clone=function(){return new e(this)},r.valueOf=r.toString=function(){return this.build(!1)._string},r.protocol=o("protocol"),r.username=o("username"),r.password=o("password"),r.hostname=o("hostname"),r.port=o("port"),r.query=p("query","?"),r.fragment=p("fragment","#"),r.search=function(a,b){var c=this.query(a,b);return"string"==typeof c&&c.length?"?"+c:c},r.hash=function(a,b){var c=this.fragment(a,b);return"string"==typeof c&&c.length?"#"+c:c},r.pathname=function(a,b){if(void 0===a||!0===a){var c=this._parts.path||(this._parts.hostname?"/":"");return a?(this._parts.urn?e.decodeUrnPath:e.decodePath)(c):c}return this._parts.path=this._parts.urn?a?e.recodeUrnPath(a):"":a?e.recodePath(a):"/",this.build(!b),this},r.path=r.pathname,r.href=function(a,b){var c;if(void 0===a)return this.toString();this._string="",this._parts=e._parts();var d=a instanceof e,f="object"==typeof a&&(a.hostname||a.path||a.pathname);if(a.nodeName&&(f=e.getDomAttribute(a),a=a[f]||"",f=!1),!d&&f&&void 0!==a.pathname&&(a=a.toString()),"string"==typeof a||a instanceof String)this._parts=e.parse(String(a),this._parts);else{if(!d&&!f)throw new TypeError("invalid input");for(c in d=d?a._parts:a)s.call(this._parts,c)&&(this._parts[c]=d[c])}return this.build(!b),this},r.is=function(a){var b=!1,d=!1,f=!1,g=!1,h=!1,i=!1,j=!1,k=!this._parts.urn;switch(this._parts.hostname&&(k=!1,d=e.ip4_expression.test(this._parts.hostname),f=e.ip6_expression.test(this._parts.hostname),b=d||f,h=(g=!b)&&c&&c.has(this._parts.hostname),i=g&&e.idn_expression.test(this._parts.hostname),j=g&&e.punycode_expression.test(this._parts.hostname)),a.toLowerCase()){case"relative":return k;case"absolute":return!k;case"domain":case"name":return g;case"sld":return h;case"ip":return b;case"ip4":case"ipv4":case"inet4":return d;case"ip6":case"ipv6":case"inet6":return f;case"idn":return i;case"url":return!this._parts.urn;case"urn":return!!this._parts.urn;case"punycode":return j}return null};var w=r.protocol,x=r.port,y=r.hostname;r.protocol=function(a,b){if(a&&(a=a.replace(/:(\/\/)?$/,""),!a.match(e.protocol_expression)))throw new TypeError('Protocol "'+a+"\" contains characters other than [A-Z0-9.+-] or doesn't start with [A-Z]");return w.call(this,a,b)},r.scheme=r.protocol,r.port=function(a,b){return this._parts.urn?void 0===a?"":this:(void 0!==a&&(0===a&&(a=null),a&&(a+="",":"===a.charAt(0)&&(a=a.substring(1)),e.ensureValidPort(a))),x.call(this,a,b))},r.hostname=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0!==a){var c={preventInvalidHostname:this._parts.preventInvalidHostname};if("/"!==e.parseHost(a,c))throw new TypeError('Hostname "'+a+'" contains characters other than [A-Z0-9.-]');a=c.hostname,this._parts.preventInvalidHostname&&e.ensureValidHostname(a,this._parts.protocol)}return y.call(this,a,b)},r.origin=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a){var c=this.protocol();return this.authority()?(c?c+"://":"")+this.authority():""}return c=e(a),this.protocol(c.protocol()).authority(c.authority()).build(!b),this},r.host=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a)return this._parts.hostname?e.buildHost(this._parts):"";if("/"!==e.parseHost(a,this._parts))throw new TypeError('Hostname "'+a+'" contains characters other than [A-Z0-9.-]');return this.build(!b),this},r.authority=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a)return this._parts.hostname?e.buildAuthority(this._parts):"";if("/"!==e.parseAuthority(a,this._parts))throw new TypeError('Hostname "'+a+'" contains characters other than [A-Z0-9.-]');return this.build(!b),this},r.userinfo=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a){var c=e.buildUserinfo(this._parts);return c?c.substring(0,c.length-1):c}return"@"!==a[a.length-1]&&(a+="@"),e.parseUserinfo(a,this._parts),this.build(!b),this},r.resource=function(a,b){if(void 0===a)return this.path()+this.search()+this.hash();var c=e.parse(a);return this._parts.path=c.path,this._parts.query=c.query,this._parts.fragment=c.fragment,this.build(!b),this},r.subdomain=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a){if(!this._parts.hostname||this.is("IP"))return"";var c=this._parts.hostname.length-this.domain().length-1;return this._parts.hostname.substring(0,c)||""}if(c=this._parts.hostname.length-this.domain().length,c=this._parts.hostname.substring(0,c),c=new RegExp("^"+f(c)),a&&"."!==a.charAt(a.length-1)&&(a+="."),-1!==a.indexOf(":"))throw new TypeError("Domains cannot contain colons");return a&&e.ensureValidHostname(a,this._parts.protocol),this._parts.hostname=this._parts.hostname.replace(c,a),this.build(!b),this},r.domain=function(a,b){if(this._parts.urn)return void 0===a?"":this;if("boolean"==typeof a&&(b=a,a=void 0),void 0===a){if(!this._parts.hostname||this.is("IP"))return"";var c=this._parts.hostname.match(/\./g);return c&&2>c.length?this._parts.hostname:(c=this._parts.hostname.length-this.tld(b).length-1,c=this._parts.hostname.lastIndexOf(".",c-1)+1,this._parts.hostname.substring(c)||"")}if(!a)throw new TypeError("cannot set domain empty");if(-1!==a.indexOf(":"))throw new TypeError("Domains cannot contain colons");return e.ensureValidHostname(a,this._parts.protocol),!this._parts.hostname||this.is("IP")?this._parts.hostname=a:(c=new RegExp(f(this.domain())+"$"),this._parts.hostname=this._parts.hostname.replace(c,a)),this.build(!b),this},r.tld=function(a,b){if(this._parts.urn)return void 0===a?"":this;if("boolean"==typeof a&&(b=a,a=void 0),void 0===a){if(!this._parts.hostname||this.is("IP"))return"";var d=this._parts.hostname.lastIndexOf(".");return d=this._parts.hostname.substring(d+1),!0!==b&&c&&c.list[d.toLowerCase()]?c.get(this._parts.hostname)||d:d}if(!a)throw new TypeError("cannot set TLD empty");if(a.match(/[^a-zA-Z0-9-]/)){if(!c||!c.is(a))throw new TypeError('TLD "'+a+'" contains characters other than [A-Z0-9]');d=new RegExp(f(this.tld())+"$"),this._parts.hostname=this._parts.hostname.replace(d,a)}else{if(!this._parts.hostname||this.is("IP"))throw new ReferenceError("cannot set TLD on non-domain host");d=new RegExp(f(this.tld())+"$"),this._parts.hostname=this._parts.hostname.replace(d,a)}return this.build(!b),this},r.directory=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a||!0===a){if(!this._parts.path&&!this._parts.hostname)return"";if("/"===this._parts.path)return"/";var c=this._parts.path.length-this.filename().length-1;return c=this._parts.path.substring(0,c)||(this._parts.hostname?"/":""),a?e.decodePath(c):c}return c=this._parts.path.length-this.filename().length,c=this._parts.path.substring(0,c),c=new RegExp("^"+f(c)),this.is("relative")||(a||(a="/"),"/"!==a.charAt(0)&&(a="/"+a)),a&&"/"!==a.charAt(a.length-1)&&(a+="/"),a=e.recodePath(a),this._parts.path=this._parts.path.replace(c,a),this.build(!b),this},r.filename=function(a,b){if(this._parts.urn)return void 0===a?"":this;if("string"!=typeof a){if(!this._parts.path||"/"===this._parts.path)return"";var c=this._parts.path.lastIndexOf("/");return c=this._parts.path.substring(c+1),a?e.decodePathSegment(c):c}c=!1,"/"===a.charAt(0)&&(a=a.substring(1)),a.match(/\.?\//)&&(c=!0);var d=new RegExp(f(this.filename())+"$");return a=e.recodePath(a),this._parts.path=this._parts.path.replace(d,a),c?this.normalizePath(b):this.build(!b),this},r.suffix=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a||!0===a){if(!this._parts.path||"/"===this._parts.path)return"";var c=this.filename(),d=c.lastIndexOf(".");return-1===d?"":(c=c.substring(d+1),c=/^[a-z0-9%]+$/i.test(c)?c:"",a?e.decodePathSegment(c):c)}if("."===a.charAt(0)&&(a=a.substring(1)),c=this.suffix())d=a?new RegExp(f(c)+"$"):new RegExp(f("."+c)+"$");else{if(!a)return this;this._parts.path+="."+e.recodePath(a)}return d&&(a=e.recodePath(a),this._parts.path=this._parts.path.replace(d,a)),this.build(!b),this},r.segment=function(a,b,c){var d=this._parts.urn?":":"/",e=this.path(),f="/"===e.substring(0,1);if(e=e.split(d),void 0!==a&&"number"!=typeof a&&(c=b,b=a,a=void 0),void 0!==a&&"number"!=typeof a)throw Error('Bad segment "'+a+'", must be 0-based integer');if(f&&e.shift(),0>a&&(a=Math.max(e.length+a,0)),void 0===b)return void 0===a?e:e[a];if(null===a||void 0===e[a])if(h(b)){e=[],a=0;for(var g=b.length;a{}"`^| \\]/,c.expand=function(a,b,d){var e=h[a.operator],f=e.named?"Named":"Unnamed";a=a.variables;var g,i,j=[];for(i=0;g=a[i];i++){var k=b.get(g.name);if(0===k.type&&d&&d.strict)throw Error('Missing expansion value for variable "'+g.name+'"');if(k.val.length){if(1
"+k+" "}}this.loaded_popup_menus[e]=g}if(g){var o=a("#popup_menu_area").html("
    "+g+"
"),p={top:d.page_y,left:d.page_x};o.outerHeight()+p.top>a(window).height()+a(window).scrollTop()&&(p.top=a(window).height()-o.outerHeight()+a(window).scrollTop()),o.outerWidth()+p.left>a(window).width()+a(window).scrollLeft()&&(p.left=a(window).width()-o.outerWidth()+a(window).scrollLeft()),o.css({top:p.top,left:p.left}).show().focus()}},isSameHost:function(a){if("string"!=typeof a)return!1;var c=b.XE.URI(a).normalizePathname();if(c.is("urn"))return!1;var e=[Number(b.http_port)||80,Number(b.https_port)||443];c.hostname()||(c=c.absoluteTo(b.request_uri));var f=c.port();return f||(f="http"==c.protocol()?80:443),-1!==jQuery.inArray(Number(f),e)&&(d||(d=b.XE.URI(b.request_uri).normalizePathname(),d=d.hostname()+d.directory()),c=c.hostname()+c.directory(),0===c.indexOf(d))}}}(jQuery,window||global),function(a,b){a(function(){a("a[target]").each(function(){var c=a(this),d=c.attr("href").trim(),e=c.attr("target").trim();if(e&&d&&d.match(/^(https?:\/\/)/)){if("_top"===e||"_self"===e||"_parent"===e)return void c.data("noopener",!1);if(!b.XE.isSameHost(d)){var f=c.attr("rel");c.data("noopener",!0),"string"==typeof f?c.attr("rel",f+" noopener"):c.attr("rel","noopener")}}}),a("body").on("click","a[target]",function(b){var c=a(this),d=c.attr("href").trim();if(d&&d.match(/^(https?:\/\/)/)&&!1!==c.data("noopener")&&!window.XE.isSameHost(d)){var e=c.attr("rel");"string"==typeof e?c.attr("rel",e+" noopener"):c.attr("rel","noopener"),blankshield.open(d),b.preventDefault()}}),a.browser.msie&&a("select").each(function(a,b){for(var c=!1,d=[],e=0;e-1?d[a]:e;c&&(b.oldonchange=b.onchange,b.onchange=function(){this.options[this.selectedIndex].disabled?this.selectedIndex=d[a]:this.oldonchange&&this.oldonchange()},b.selectedIndex>=0&&b.options[b.selectedIndex].disabled&&b.onchange())});var c=a(".xe_content .fold_button");if(c.size()){var d=a("div.fold_container",c);a("button.more",c).click(function(){a(this).hide().next("button").show().parent().next(d).show()}),a("button.less",c).click(function(){a(this).hide().prev("button").show().parent().next(d).hide()})}jQuery('input[type="submit"],button[type="submit"]').click(function(a){var b=jQuery(a.currentTarget);setTimeout(function(){return function(){b.attr("disabled","disabled")}}(),0),setTimeout(function(){return function(){b.removeAttr("disabled")}}(),3e3)})})}(jQuery,window||global),function(a){function b(b){var c=b.search(!0),d=b.filename()||"index.php",e=!0===a.enforce_ssl?"https":"http",f=80;return a.XE.isSameHost(b.toString())&&jQuery.isEmptyObject(c)&&(d=""),"https"!==e&&c.act&&-1!==jQuery.inArray(c.act,a.ssl_actions)&&(e="https"),f="http"===e?a.http_port:a.https_port,b.protocol(e).port(f||null).filename(d).normalizePort()}String.prototype.getQuery=function(b){var c=a.XE.URI(this),d=c.search(!0);return void 0===d[b]?"":d[b]},String.prototype.setQuery=function(c,d){var e=a.XE.URI(this);return void 0!==c&&(void 0===d||""===d||null===d?e.removeSearch(c):e.setSearch(c,String(d))),b(e).toString()},String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")})}(window||global);var winopen_list=[],objForSavedDoc=null,addedDocument=[],Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(a){var b,c,d,e,f,g,h,i="",j=0;for(a=Base64._utf8_encode(a);j>2,f=(3&b)<<4|c>>4,g=(15&c)<<2|d>>6,h=63&d,isNaN(c)?g=h=64:isNaN(d)&&(h=64),i=i+this._keyStr.charAt(e)+this._keyStr.charAt(f)+this._keyStr.charAt(g)+this._keyStr.charAt(h);return i},decode:function(a){var b,c,d,e,f,g,h,i="",j=0;for(a=a.replace(/[^A-Za-z0-9\+\/\=]/g,"");j>4,c=(15&f)<<4|g>>2,d=(3&g)<<6|h,i+=String.fromCharCode(b),64!=g&&(i+=String.fromCharCode(c)),64!=h&&(i+=String.fromCharCode(d));return i=Base64._utf8_decode(i)},_utf8_encode:function(a){a=a.replace(/\r\n/g,"\n");for(var b="",c=0;c127&&d<2048?(b+=String.fromCharCode(d>>6|192),b+=String.fromCharCode(63&d|128)):(b+=String.fromCharCode(d>>12|224),b+=String.fromCharCode(d>>6&63|128),b+=String.fromCharCode(63&d|128))}return b},_utf8_decode:function(a){for(var b="",c=0,d=0,e=0,f=0;c191&&d<224?(e=a.charCodeAt(c+1),b+=String.fromCharCode((31&d)<<6|63&e),c+=2):(e=a.charCodeAt(c+1),f=a.charCodeAt(c+2),b+=String.fromCharCode((15&d)<<12|(63&e)<<6|63&f),c+=3);return b}};"undefined"==typeof resizeImageContents&&(window.resizeImageContents=function(){}),"undefined"==typeof activateOptionDisabled&&(window.activateOptionDisabled=function(){});var objectExtend=jQuery.extend,loaded_popup_menus=XE.loaded_popup_menus;jQuery(function(a){a(document).on("click",function(b){var c=a("#popup_menu_area");c.length||(c=a('