Merge branch 'develop' into pr/member-phone-number

This commit is contained in:
Kijin Sung 2018-07-06 09:15:52 +09:00
commit 625c3b741f
435 changed files with 22374 additions and 21994 deletions

View file

@ -2,14 +2,13 @@ distro: trusty
sudo: false
language: php
php:
- 5.5
- 5.6
- 7.0
- 7.1
- 7.2
- nightly
matrix:
allow_failures:
- php: 7.2
- php: nightly
services:
- mysql
before_script:
@ -17,12 +16,12 @@ before_script:
- mysql -u root -e "CREATE DATABASE rhymix CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci"
- mysql -u root -e "GRANT ALL PRIVILEGES ON rhymix.* TO travis@localhost"
- mysql -u root -e "UPDATE mysql.user SET Password = PASSWORD('travis') WHERE User = 'travis'; FLUSH PRIVILEGES"
- phpenv config-rm xdebug.ini
- if [[ $TRAVIS_PHP_VERSION != "nightly" ]]; then phpenv config-rm xdebug.ini; fi
- wget https://codeception.com/releases/2.3.9/codecept.phar
- php -S localhost:8000 &
- wget http://codeception.com/releases/2.1.11/codecept.phar
script:
- php codecept.phar build
- php codecept.phar run -d --fail-fast --env travis
- php codecept.phar run --debug --fail-fast --env travis
- grunt lint
notifications:
email: false

View file

@ -33,7 +33,7 @@ Rhymix는 개발자와 사용자가 서로의 권리와 책임을 존중하는
### 설치 환경
Rhymix를 사용하려면 PHP 5.5.9 이상, MySQL 5.0.7 이상 버전이 필요합니다.
Rhymix를 사용하려면 PHP 7.0 이상, MySQL 5.0.7 이상 버전이 필요합니다.
자세한 설치 환경은 [매뉴얼](https://github.com/rhymix/rhymix-docs/blob/master/ko/introduction/requirements.md)을 참고하십시오.
### 개발 참여
@ -80,9 +80,9 @@ Rhymix의 소스코드를 수정하거나 확장 기능을 직접 개발하여
# English
[![Rhymix](https://cloud.githubusercontent.com/assets/8565457/12881857/7c3e69d6-ce90-11e5-94dc-8a592cf9ab7d.png)](https://www.rhymix.org)
Rhymix is a content management system (CMS) for anyone who wants to create independent homepages to express themselves and grow their communities easily and freely.
Rhymix is a content management system (CMS) for everyone who wants to create independent homepages to express themselves and build their communities easily and freely.
Rhymix is a project to fork [XpressEngine](https://www.xpressengine.com) version 1.8 and is free software that anyone can use for free and participate in.
Rhymix is a fork of [XpressEngine](https://www.xpressengine.com) version 1.8 and is free software that anyone can use for free and participate.
Rhymix is a combination of "rhyme" in the sense of "making a poem, adjusting the sound", and "remix" in the sense of "combining, changing".
Rhymix cheers everyone who freely creates and/or assembles new things in the Internet space by combining various software and contents.
@ -90,7 +90,7 @@ Rhymix cheers everyone who freely creates and/or assembles new things in the Int
### Development Direction
Rhymix developers want an Internet ecosystem where developers and users respect each other's rights and responsibilities,
a world where everyone can voice their voice without relying on a centralized SNS platform,
a world where everyone can speak their voice without relying on a centralized SNS platform,
a future where ordinary bloggers, students, the disabled and others as well as developers of startups can build a home in cyberspace and communicate with each other.
Rather than indiscriminately accepting modern IT trends that are centered on developers and service providers,
@ -99,14 +99,14 @@ we focused on technologies that protect users' sovereignty and open Internet env
This requires the most convenience for the average user over any other CMS.
- CMS that is convenient enough for beginners to easily create the website with a few clicks
- CMS that is convenient enough to create the website easily, even for beginners, with a few clicks
- CMS that is actively using the latest technology, fast and secure
- CMS to help users and developers communicate well through community
- We try to ensure maximum compatibility with existing XpressEngine third-party materials such as add-ons, modules and widgets.
### Installation Environment
Rhymix requires PHP 5.5.9 or higher, and MySQL 5.0.7 or higher.
Rhymix requires PHP 7.0 or higher, and MySQL 5.0.7 or higher.
Please see the online manual for more information on server requirements.
### Participation in Development
@ -114,7 +114,7 @@ Please see the online manual for more information on server requirements.
Rhymix welcomes developers, designers, translators, and bugs to the public.
If you would like to participate, please read [CONTRIBUTING.md](./CONTRIBUTING.md) first to ensure efficient and orderly project management.
If you have found a security vulnerability, please let us know at devops@rhymix.org so that we can create a patch before it is exploited.
If you have found a security vulnerability, please let us know at devops@rhymix.org so that we can make a patch before it is exploited.
### Official Website
@ -126,16 +126,17 @@ If you have found a security vulnerability, please let us know at devops@rhymix.
### Copyright and License
Rhymix is a free software licensed under the [GNU GPL v2](http://korea.gnu.org/documents/copyleft/gpl.ko.html) or later.
Free software, also known as "open source" or "open", is a program that emphasizes the freedom and rights of developers and users, their participation and responsibilities, and is free to use and participate in development.
Rhymix is a free software licensed under the [GNU GPL v2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.html) or later.
Free software is a program that emphasizes the rights and responsibilities of developers and users to participate or use in freedom.
Rhymix is based on the source code of [XpressEngine](https://www.xpressengine.com), which [NAVER](https://www.navercorp.com/) is partly copyrighted free software.
Rhymix is based on the source code of [XpressEngine](https://www.xpressengine.com) ([Github](https://github.com/xpressengine/xe-core/)), which [NAVER](https://www.navercorp.com/) is partly copyrighted free software.
Rhymix developers have copyrights on the added and modified code.
XpressEngine had used the GPL in its early days and switched from version 1.4.0 to LGPL, but Rhymix has reverted its licenses to the GPL to further protect its rights and adhere to the spirit of free software.
XpressEngine has been licensed under the GPL in its early days and switched to LGPL from version 1.4.0, but Rhymix has reverted its licenses to the GPL for further protection of the rights and spirit of free software.
(License conversion is allowed in [LGPL v2.1 Section 3](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html).)
GPL is a license that is commonly adopted by global CMSs such as WordPress, Drupal, and Joomla, so the rights and obligations of users and developers are the same as those of CMS.
The GPL is commonly adopted by global CMSes such as WordPress, Drupal, and Joomla. The rights and obligations of users and developers of Rhymix are the same as those CMSes.
The use of Rhymix on homepage does not impose a duty on you to release the source code, even if you modify the source code or develop the extension yourself.
However, distributing and/or selling the source code or extension according to the GPL license, you have to provide the source code.
The use of Rhymix on the homepage does not oblige you to release the source code, even if you modify the Rhymix source code or develop the extension yourself.
However, if you distribute or sell your own extensions to a third party, you must provide the source code, which is subject to the GPL license.

View file

@ -1,602 +0,0 @@
<?php
/* Copyright (C) NAVER <http://www.navercorp.com> */
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(" " . '<link rel="EditURI" type="application/rsd+xml" title="RSD" href="' . $rsd_url . '" />');
}
// 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(
'<?xml version="1.0" encoding="utf-8"?>' .
'<methodResponse>' .
'<params>' .
'<param>' .
'<value>' .
'<struct>' .
'<member><name>categories</name><value><array><data><value><![CDATA[%s]]></value></data></array></value></member>' .
'<member><name>dateCreated</name><value><dateTime.iso8601>%s</dateTime.iso8601></value></member>' .
'<member><name>description</name><value><![CDATA[%s]]></value></member>' .
'<member><name>link</name><value>%s</value></member>' .
'<member><name>postid</name><value><string>%s</string></value></member>' .
'<member><name>title</name><value><![CDATA[%s]]></value></member>' .
'<member><name>publish</name><value><boolean>1</boolean></value></member>' .
'</struct>' .
'</value>' .
'</param>' .
'</params>' .
'</methodResponse>',
$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('<![CDATA[%s]]>',$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 = <<<RSDContent
<?xml version="1.0" ?>
<rsd version="1.0" xmlns="http://archipelago.phrasewise.com/rsd" >
<service>
<engineName>Rhymix</engineName>
<engineLink>https://www.rhymix.org/ </engineLink>
<homePageLink>{$homepagelink}</homePageLink>
<apis>
<api name="MetaWeblog" preferred="true" apiLink="{$api_url}" blogID="" />
</apis>
</service>
</rsd>
RSDContent;
printContent($content);
break;
}
}
/* End of file blogapi.addon.php */
/* Location: ./addons/blogapi/blogapi.addon.php */

View file

@ -1,101 +0,0 @@
<?php
/* Copyright (C) NAVER <http://www.navercorp.com> */
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(
"<methodResponse>\n<fault><value><struct>\n<member>\n<name>faultCode</name>\n<value><int>%d</int></value>\n</member>\n<member>\n<name>faultString</name>\n<value><string>%s</string></value>\n</member>\n</struct></value></fault>\n</methodResponse>\n", $error, htmlspecialchars($message, ENT_COMPAT | ENT_HTML401, 'UTF-8', false)
);
}
// Display results
function getXmlRpcResponse($params)
{
$buff = '<?xml version="1.0" encoding="utf-8"?>' . "\n<methodResponse><params>";
$buff .= _getEncodedVal($params);
$buff .= "</params>\n</methodResponse>\n";
return $buff;
}
// Encoding
function _getEncodedVal($val, $is_sub_set = false)
{
if(preg_match('/^\<\!\[CDATA\[/',$val))
{
$buff = sprintf("<value>%s</value>", $val);
}
elseif(is_int($val))
{
$buff = sprintf("<value><i4>%d</i4></value>", $val);
}
elseif(is_string($val) && preg_match('/^([0-9]+)T([0-9\:]+)$/', $val))
{
$buff = sprintf("<value><dateTime.iso8601>%s</dateTime.iso8601></value>\n", $val);
}
elseif(is_double($val))
{
$buff = sprintf("<value><double>%f</double></value>", $val);
}
elseif(is_bool($val))
{
$buff = sprintf("<value><boolean>%d</boolean></value>", $val ? 1 : 0);
}
elseif(is_object($val))
{
$values = get_object_vars($val);
$val_count = count($values);
$buff = "<value><struct>";
foreach($values as $k => $v)
{
$buff .= sprintf("<member>\n<name>%s</name>\n%s</member>\n", htmlspecialchars($k, ENT_COMPAT | ENT_HTML401, 'UTF-8', false), _getEncodedVal($v, true));
}
$buff .= "</struct></value>\n";
}
elseif(is_array($val))
{
$val_count = count($val);
$buff = "<value><array>\n<data>";
for($i = 0; $i < $val_count; $i++)
{
$buff .= _getEncodedVal($val[$i], true);
}
$buff .= "</data>\n</array></value>";
}
else
{
$buff = sprintf("<value><string>%s</string></value>\n", $val);
}
if(!$is_sub_set)
{
return sprintf("<param>\n%s</param>", $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 */

View file

@ -1,80 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<addon version="0.2">
<title xml:lang="ko">BlogAPI 애드온</title>
<title xml:lang="jp">BlogAPIアドオン</title>
<title xml:lang="zh-CN">BlogAPI</title>
<title xml:lang="en">Addon for BlogAPI</title>
<title xml:lang="vi">BlogAPI Addon</title>
<title xml:lang="ge">Addon für BlogAPI</title>
<title xml:lang="es">Addon para BlogAPI</title>
<title xml:lang="ru">Аддон для BlogAPI</title>
<title xml:lang="zh-TW">部落格 API</title>
<description xml:lang="ko">
metaWeblog를 지원하는 blogApi애드온입니다.
사용으로 설정하면 각 모듈마다 RSD 태그를 노출합니다.
api의 주소는 http://설치주소/모듈명/api 입니다.
사용으로 해야 RSD태그 및 api가 동작을 합니다.
</description>
<description xml:lang="jp">
MetaWeblogをサポートするBlog APIアドオンです。
「使用する」にチェックすると各モジュールごとにRSDのアドレスを表示します。
APIのアドレスは「http://インストールURL/モジュール名/api」です。
「使用する」に設定してから、RSDタグ、およびAPIが作動します。
</description>
<description xml:lang="zh-CN">
支持metaWeblog的 blogApi插件。
设置为"启用"时,会使每个模块都会显示RSD标签。
api地址为http://安装地址/模块名/api。
把状态设置为"使用"时才会激活RSD标签及api。
</description>
<description xml:lang="en">
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.
</description>
<description xml:lang="vi">
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.
</description>
<description xml:lang="ge">
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.
</description>
<description xml:lang="es">
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.
</description>
<description xml:lang="ru">
Этот blogApi аддон поддерживает metaWeblog.
Используя этот аддон, RSD тег становится доступным для каждого модуля.
URL для api - http://setup_path/module_name/api.
тег RSD и api работают только при включенном аддоне.
</description>
<description xml:lang="zh-TW">
支援 MetaWeblog 的部落格 API 附加元件。
設置成"啟用"時,會使每個模組都顯示 RSD 圖示。
API網址是 http://安裝位置/模組名稱/api。
將狀態設置成"啟用"時,才可使用 RSD 和 API
</description>
<version>1.7</version>
<date>2013-11-27</date>
<author email_address="developers@xpressengine.com" link="http://xpressengine.com/">
<name xml:lang="ko">NAVER</name>
<name xml:lang="vi">NAVER</name>
<name xml:lang="jp">NAVER</name>
<name xml:lang="zh-CN">NAVER</name>
<name xml:lang="en">NAVER</name>
<name xml:lang="ge">NAVER</name>
<name xml:lang="es">NAVER</name>
<name xml:lang="ru">NAVER</name>
<name xml:lang="zh-TW">NAVER</name>
</author>
</addon>

View file

@ -43,13 +43,12 @@ function pointLevelIconTrans($matches, $addon_info)
$oPointModel = &$GLOBALS['_pointModel'];
// Get points
if(!$oPointModel->isExistsPoint($member_srl))
$point = $oPointModel->getPoint($member_srl, false, $exists);
if(!$exists)
{
return $matches[0];
}
$point = $oPointModel->getPoint($member_srl);
// Get level
$level = $oPointModel->getLevel($point, $config->level_step);
$text = $matches[5];

File diff suppressed because it is too large Load diff

View file

@ -23,24 +23,7 @@ class DB
* @var array
*/
protected static $priority_dbms = array(
'mysqli' => 6,
'cubrid' => 2,
'mssql' => 1
);
/**
* operations for condition
* @var array
*/
protected static $cond_operation = array(
'equal' => '=',
'more' => '>=',
'excess' => '>',
'less' => '<=',
'below' => '<',
'notequal' => '<>',
'notnull' => 'is not null',
'null' => 'is null',
'mysql' => 1,
);
/**
@ -108,7 +91,7 @@ class DB
protected $cache_file = 'files/cache/queries/';
/**
* stores database type: 'mysql','cubrid','mssql' etc. or 'db' when database is not yet set
* stores database type, e.g. mysql
* @var string
*/
public $db_type;
@ -136,15 +119,15 @@ class DB
if(!$db_type)
{
$db_type = config('db.master.type');
if (config('db.master.engine') === 'innodb')
{
$db_type .= '_innodb';
}
}
if(!$db_type && Context::isInstalled())
{
return new BaseObject(-1, 'msg_db_not_setted');
}
if(!strncmp($db_type, 'mysql', 5))
{
$db_type = 'mysql';
}
if(!isset($GLOBALS['__DB__']))
{
@ -271,7 +254,7 @@ class DB
// after creating instance of class, check is supported
foreach ($supported_list as $db_type)
{
if (strncasecmp($db_type, 'mysql', 5) === 0 && strtolower($db_type) !== 'mysqli')
if (strtolower($db_type) !== 'mysql')
{
continue;
}
@ -707,6 +690,7 @@ class DB
$tableObjects = $query->getTables();
$index_hint_list = '';
/*
foreach($tableObjects as $tableObject)
{
if(is_a($tableObject, 'CubridTableWithHint'))
@ -719,6 +703,7 @@ class DB
{
$index_hint_list = 'USING INDEX ' . $index_hint_list;
}
*/
$groupBy = $query->getGroupByString();
if($groupBy != '')
@ -726,6 +711,12 @@ class DB
$groupBy = ' GROUP BY ' . $groupBy;
}
$having = $query->getHavingString($with_values);
if($having != '')
{
$having = ' HAVING ' . $having;
}
$orderBy = $query->getOrderByString();
if($orderBy != '')
{
@ -738,7 +729,7 @@ class DB
$limit = ' LIMIT ' . $limit;
}
return $select . ' ' . $from . ' ' . $where . ' ' . $index_hint_list . ' ' . $groupBy . ' ' . $orderBy . ' ' . $limit;
return "$select $from $where $index_hint_list $groupBy $having $orderBy $limit";
}
/**
@ -1213,6 +1204,23 @@ class DB
return $dbParser;
}
/**
* Get the number of rows affected by the last query
* @return int
*/
public function getAffectedRows()
{
return -1;
}
/**
* Get the ID generated in the last query
* @return int
*/
public function getInsertID()
{
return 0;
}
}
/* End of file DB.class.php */
/* Location: ./classes/db/DB.class.php */

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -2,24 +2,17 @@
/* Copyright (C) NAVER <http://www.navercorp.com> */
/**
* Class to use MySQL DBMS
* mysql handling class
*
* Does not use prepared statements, since mysql driver does not support them
*
* @author NAVER (developers@xpressengine.com)
* @package /classes/db
* @version 0.1
* Merged class for MySQL and MySQLi, with or without InnoDB
*/
class DBMysql extends DB
class DBMySQL extends DB
{
/**
* prefix of a tablename (One or more Rhymix can be installed in a single DB)
* @var string
*/
var $prefix = 'rx_'; // / <
var $prefix = 'rx_';
var $comment_syntax = '/* %s */';
var $charset = 'utf8';
var $charset = 'utf8mb4';
/**
* Column type used in MySQL
@ -39,6 +32,16 @@ class DBMysql extends DB
'float' => 'float',
);
/**
* Last statement executed
*/
var $last_stmt;
/**
* Query parameters for prepared statement
*/
var $params = array();
/**
* Constructor
* @return void
@ -53,62 +56,54 @@ class DBMysql extends DB
* DB Connect
* this method is private
* @param array $connection connection's value is db_hostname, db_port, db_database, db_userid, db_password
* @return resource
* @return mysqli
*/
function __connect($connection)
protected function __connect($connection)
{
// Ignore if no DB information exists
if(strpos($connection['host'], ':') === false && $connection['port'])
{
$connection['host'] .= ':' . $connection['port'];
}
// Attempt to connect
$result = @mysql_connect($connection['host'], $connection['user'], $connection['pass']);
if(!$result)
if($connection['port'])
{
$this->setError(-1, 'Unable to connect to DB.');
$mysqli = new mysqli($connection['host'], $connection['user'], $connection['pass'], $connection['database'], $connection['port']);
}
else
{
$mysqli = new mysqli($connection['host'], $connection['user'], $connection['pass'], $connection['database']);
}
// Check connection error
if($mysqli->connect_errno)
{
$this->setError($mysqli->connect_errno, $mysqli->connect_error());
return;
}
if(mysql_error())
{
$this->setError(mysql_errno(), mysql_error());
return;
}
// Error appears if the version is lower than 5.0.7
$this->db_version = mysql_get_server_info($result);
if(version_compare($this->db_version, '5.0.7', '<'))
// Check DB version
$this->db_version = $mysqli->server_info;
if (version_compare($this->db_version, '5.0.7', '<'))
{
$this->setError(-1, 'Rhymix requires MySQL 5.0.7 or later. Current MySQL version is ' . $this->db_version);
return;
}
// Set charset
// Set DB charset
$this->charset = isset($connection['charset']) ? $connection['charset'] : 'utf8';
mysql_set_charset($this->charset, $result);
// select db
@mysql_select_db($connection['database'], $result);
if(mysql_error())
{
$this->setError(mysql_errno(), mysql_error());
return;
}
return $result;
$mysqli->set_charset($this->charset);
return $mysqli;
}
/**
* DB disconnection
* this method is private
* @param resource $connection
* @param mysqli $connection
* @return void
*/
function _close($connection)
protected function _close($connection)
{
@mysql_close($connection);
if ($connection instanceof mysqli)
{
$connection->close();
}
}
/**
@ -120,7 +115,8 @@ class DBMysql extends DB
{
if(!is_numeric($string))
{
$string = @mysql_real_escape_string($string);
$connection = $this->_getConnection('master');
$string = $connection->real_escape_string($string);
}
return $string;
}
@ -130,8 +126,19 @@ class DBMysql extends DB
* this method is private
* @return boolean
*/
function _begin($transactionLevel = 0)
protected function _begin($transactionLevel = 0)
{
$connection = $this->_getConnection('master');
if(!$transactionLevel)
{
$connection->begin_transaction();
$this->setQueryLog(array('query' => 'START TRANSACTION'));
}
else
{
$this->_query("SAVEPOINT SP" . $transactionLevel, $connection);
}
return true;
}
@ -140,8 +147,20 @@ class DBMysql extends DB
* this method is private
* @return boolean
*/
function _rollback($transactionLevel = 0)
protected function _rollback($transactionLevel = 0)
{
$connection = $this->_getConnection('master');
$point = $transactionLevel - 1;
if($point)
{
$this->_query("ROLLBACK TO SP" . $point, $connection);
}
else
{
$connection->rollback();
$this->setQueryLog(array('query' => 'ROLLBACK'));
}
return true;
}
@ -150,8 +169,11 @@ class DBMysql extends DB
* this method is private
* @return boolean
*/
function _commit()
protected function _commit()
{
$connection = $this->_getConnection('master');
$connection->commit();
$this->setQueryLog(array('query' => 'COMMIT'));
return true;
}
@ -164,20 +186,105 @@ class DBMysql extends DB
*/
function __query($query, $connection)
{
if(!$connection)
if (!($connection instanceof mysqli) || $connection->connection_errno)
{
$this->setError(-1, 'Unable to connect to DB.');
return false;
}
// Run the query statement
$result = @mysql_query($query, $connection);
// Error Check
if(mysql_error($connection))
if($this->use_prepared_statements == 'Y')
{
$this->setError(mysql_errno($connection), mysql_error($connection));
// 1. Prepare query
$stmt = $connection->prepare($query);
if(!$stmt)
{
$this->setError($connection->errno, $connection->error);
return $this->last_stmt = $result;
}
// 2. Bind parameters
if ($this->params)
{
$types = '';
$params = array();
foreach($this->params as $k => $o)
{
$value = $o->getUnescapedValue();
$type = $o->getType();
// Skip column names -> this should be concatenated to query string
if($o->isColumnName())
{
continue;
}
switch($type)
{
case 'number' :
$type = 'i';
break;
case 'varchar' :
$type = 's';
break;
default:
$type = 's';
}
if(is_array($value))
{
foreach($value as $v)
{
$params[] = $v;
$types .= $type;
}
}
else
{
$params[] = $value;
$types .= $type;
}
}
// 2. Bind parameters
$args = array();
$args[0] = $stmt;
$args[1] = $types;
$i = 2;
foreach($params as $key => $param)
{
$copy[$key] = $param;
$args[$i++] = &$copy[$key];
}
$status = call_user_func_array('mysqli_stmt_bind_param', $args);
if(!$status)
{
$this->setError(-1, "Invalid arguments: " . $connection->error);
return $this->last_stmt = $stmt;
}
}
// 3. Execute query
$status = $stmt->execute();
if(!$status)
{
$this->setError(-1, "Prepared statement failed: " . $connection->error);
return $this->last_stmt = $stmt;
}
// Return stmt for other processing
return $this->last_stmt = $stmt;
}
else
{
$result = $connection->query($query);
if($connection->errno)
{
$this->setError($connection->errno, $connection->error);
}
return $this->last_stmt = $result;
}
// Return result
return $result;
}
/**
@ -193,17 +300,92 @@ class DBMysql extends DB
{
return $output;
}
while($tmp = $this->db_fetch_object($result))
// No prepared statements
if($this->use_prepared_statements != 'Y')
{
if($arrayIndexEndValue)
while($tmp = $this->db_fetch_object($result))
{
$output[$arrayIndexEndValue--] = $tmp;
}
else
{
$output[] = $tmp;
if($arrayIndexEndValue)
{
$output[$arrayIndexEndValue--] = $tmp;
}
else
{
$output[] = $tmp;
}
}
$result->free_result();
}
// Prepared stements: bind result variable and fetch data
else
{
$stmt = $result;
$fields = $stmt->result_metadata()->fetch_fields();
$row = array();
$resultArray = array();
/**
* Mysqli has a bug that causes LONGTEXT columns not to get loaded
* Unless store_result is called before
* MYSQLI_TYPE for longtext is 252
*/
$longtext_exists = false;
foreach($fields as $field)
{
// When joined tables are used and the same column name appears twice, we should add it separately, otherwise bind_result fails
if(isset($resultArray[$field->name]))
{
$field->name = 'repeat_' . $field->name;
}
// Array passed needs to contain references, not values
$row[$field->name] = '';
$resultArray[$field->name] = &$row[$field->name];
if($field->type == 252)
{
$longtext_exists = true;
}
}
$resultArray = array_merge(array($stmt), $resultArray);
if($longtext_exists)
{
$stmt->store_result();
}
call_user_func_array('mysqli_stmt_bind_result', $resultArray);
array_shift($resultArray);
while($stmt->fetch())
{
$resultObject = new stdClass;
foreach($resultArray as $key => $value)
{
if(strpos($key, 'repeat_'))
{
$key = substr($key, 6);
}
$resultObject->$key = $value;
}
if($arrayIndexEndValue)
{
$output[$arrayIndexEndValue--] = $resultObject;
}
else
{
$output[] = $resultObject;
}
}
$stmt->free_result();
$stmt->close();
}
// Return object if there is only 1 result.
if(count($output) == 1)
{
if(isset($arrayIndexEndValue))
@ -215,8 +397,10 @@ class DBMysql extends DB
return $output[0];
}
}
$this->db_free_result($result);
return $output;
else
{
return $output;
}
}
/**
@ -226,12 +410,12 @@ class DBMysql extends DB
*/
function getNextSequence()
{
$query = sprintf("insert into `%ssequence` (seq) values ('0')", $this->prefix);
$query = sprintf("INSERT INTO `%ssequence` (seq) VALUES ('0')", $this->prefix);
$this->_query($query);
$sequence = $this->db_insert_id();
$sequence = $this->getInsertID();
if($sequence % 10000 == 0)
{
$query = sprintf("delete from `%ssequence` where seq < %d", $this->prefix, $sequence);
$query = sprintf("DELETE FROM `%ssequence` WHERE seq < %d", $this->prefix, $sequence);
$this->_query($query);
}
@ -246,7 +430,7 @@ class DBMysql extends DB
*/
function isValidOldPassword($password, $saved_password)
{
$query = sprintf("select password('%s') as password, old_password('%s') as old_password", $this->addQuotes($password), $this->addQuotes($password));
$query = sprintf("SELECT PASSWORD('%s') AS password, OLD_PASSWORD('%s') AS old_password", $this->addQuotes($password), $this->addQuotes($password));
$result = $this->_query($query);
$tmp = $this->_fetch($result);
if($tmp->password === $saved_password || $tmp->old_password === $saved_password)
@ -263,7 +447,7 @@ class DBMysql extends DB
*/
function isTableExists($target_name)
{
$query = sprintf("show tables like '%s%s'", $this->prefix, $this->addQuotes($target_name));
$query = sprintf("SHOW TABLES LIKE '%s%s'", $this->prefix, $this->addQuotes($target_name));
$result = $this->_query($query);
$tmp = $this->_fetch($result);
if(!$tmp)
@ -281,18 +465,18 @@ class DBMysql extends DB
* @param int $size column size
* @param string|int $default default value
* @param boolean $notnull not null status, default value is false
* @param string $after_column
* @return void
*/
function addColumn($table_name, $column_name, $type = 'number', $size = '', $default = null, $notnull = false, $after_column = false)
function addColumn($table_name, $column_name, $type = 'number', $size = '', $default = null, $notnull = false, $after = null)
{
$type = $this->column_type[$type];
if(strtoupper($type) == 'INTEGER')
$type = strtolower($type);
$type = isset($this->column_type[$type]) ? $this->column_type[$type] : $type;
if(in_array($type, ['integer', 'int', 'bigint', 'smallint']))
{
$size = '';
}
$query = sprintf("alter table `%s%s` add `%s` ", $this->prefix, $table_name, $column_name);
$query = sprintf("ALTER TABLE `%s%s` ADD `%s` ", $this->prefix, $table_name, $column_name);
if($size)
{
$query .= sprintf(" %s(%s) ", $type, $size);
@ -303,15 +487,15 @@ class DBMysql extends DB
}
if(isset($default))
{
$query .= sprintf(" default '%s' ", $default);
$query .= sprintf(" DEFAULT '%s' ", $default);
}
if($notnull)
{
$query .= " not null ";
$query .= " NOT NULL ";
}
if($after_column)
{
$query .= sprintf(" after `%s` ", $after_column);
$query .= sprintf(" AFTER `%s` ", $after_column);
}
return $this->_query($query);
@ -325,7 +509,7 @@ class DBMysql extends DB
*/
function dropColumn($table_name, $column_name)
{
$query = sprintf("alter table `%s%s` drop `%s` ", $this->prefix, $table_name, $column_name);
$query = sprintf("ALTER TABLE `%s%s` DROP `%s` ", $this->prefix, $table_name, $column_name);
$this->_query($query);
}
@ -341,13 +525,14 @@ class DBMysql extends DB
*/
function modifyColumn($table_name, $column_name, $type = 'number', $size = '', $default = '', $notnull = false)
{
$type = $this->column_type[$type];
if(strtoupper($type) == 'INTEGER')
$type = strtolower($type);
$type = isset($this->column_type[$type]) ? $this->column_type[$type] : $type;
if(in_array($type, ['integer', 'int', 'bigint', 'smallint']))
{
$size = '';
}
$query = sprintf("alter table `%s%s` modify `%s` ", $this->prefix, $table_name, $column_name);
$query = sprintf("ALTER TABLE `%s%s` MODIFY `%s` ", $this->prefix, $table_name, $column_name);
if($size)
{
$query .= sprintf(" %s(%s) ", $type, $size);
@ -358,11 +543,11 @@ class DBMysql extends DB
}
if($default)
{
$query .= sprintf(" default '%s' ", $default);
$query .= sprintf(" DEFAULT '%s' ", $default);
}
if($notnull)
{
$query .= " not null ";
$query .= " NOT NULL ";
}
return $this->_query($query) ? true : false;
@ -376,7 +561,7 @@ class DBMysql extends DB
*/
function isColumnExists($table_name, $column_name)
{
$query = sprintf("show fields from `%s%s`", $this->prefix, $table_name);
$query = sprintf("SHOW FIELDS FROM `%s%s`", $this->prefix, $table_name);
$result = $this->_query($query);
if($this->isError())
{
@ -406,7 +591,7 @@ class DBMysql extends DB
*/
function getColumnInfo($table_name, $column_name)
{
$query = sprintf("show fields from `%s%s` where `Field` = '%s'", $this->prefix, $table_name, $column_name);
$query = sprintf("SHOW FIELDS FROM `%s%s` WHERE `Field` = '%s'", $this->prefix, $table_name, $column_name);
$result = $this->_query($query);
if($this->isError())
{
@ -470,7 +655,7 @@ class DBMysql extends DB
$target_columns = array($target_columns);
}
$query = sprintf("alter table `%s%s` add %s index `%s` (%s);", $this->prefix, $table_name, $is_unique ? 'unique' : '', $index_name, implode(',', $target_columns));
$query = sprintf("ALTER TABLE `%s%s` ADD %s INDEX `%s` (%s);", $this->prefix, $table_name, $is_unique ? 'UNIQUE' : '', $index_name, implode(',', $target_columns));
$this->_query($query);
}
@ -483,7 +668,7 @@ class DBMysql extends DB
*/
function dropIndex($table_name, $index_name, $is_unique = false)
{
$query = sprintf("alter table `%s%s` drop index `%s`", $this->prefix, $table_name, $index_name);
$query = sprintf("ALTER TABLE `%s%s` DROP INDEX `%s`", $this->prefix, $table_name, $index_name);
$this->_query($query);
}
@ -495,8 +680,7 @@ class DBMysql extends DB
*/
function isIndexExists($table_name, $index_name)
{
//$query = sprintf("show indexes from %s%s where key_name = '%s' ", $this->prefix, $table_name, $index_name);
$query = sprintf("show indexes from `%s%s`", $this->prefix, $table_name);
$query = sprintf("SHOW INDEXES FROM `%s%s`", $this->prefix, $table_name);
$result = $this->_query($query);
if($this->isError())
{
@ -620,9 +804,17 @@ class DBMysql extends DB
}
}
// Normalize data type
$type = strtolower($type);
$type = isset($this->column_type[$type]) ? $this->column_type[$type] : $type;
if(in_array($type, ['integer', 'int', 'bigint', 'smallint']))
{
$size = '';
}
$column_schema[$name] = sprintf('`%s` %s%s %s %s %s %s',
$name,
$this->column_type[$type],
$type,
$size ? "($size)" : '',
$column_charset,
isset($default) ? "DEFAULT '$default'" : '',
@ -644,8 +836,6 @@ class DBMysql extends DB
}
}
// Process
// Process indexes
if(count($primary_list))
{
@ -667,7 +857,7 @@ class DBMysql extends DB
}
// Generate table schema
$engine = stripos(get_class($this), 'innodb') === false ? 'MYISAM' : 'INNODB';
$engine = config('db.master.engine') === 'innodb' ? 'InnoDB' : 'MyISAM';
$charset = $this->charset ?: 'utf8';
$collation = $charset . '_unicode_ci';
$schema = sprintf("CREATE TABLE `%s` (%s) %s",
@ -715,49 +905,84 @@ class DBMysql extends DB
* Handles insertAct
* @param BaseObject $queryObject
* @param boolean $with_values
* @return resource
* @return mixed
*/
function _executeInsertAct($queryObject, $with_values = true)
{
$query = $this->getInsertSql($queryObject, $with_values, true);
if($query instanceof BaseObject)
if ($this->use_prepared_statements == 'Y')
{
return;
$this->params = $queryObject->getArguments();
$with_values = false;
}
$query = $this->getInsertSql($queryObject, $with_values, true);
if ($query instanceof BaseObject)
{
$this->params = array();
return $query;
}
else
{
$output = $this->_query($query);
$this->params = array();
return $output;
}
return $this->_query($query);
}
/**
* Handles updateAct
* @param BaseObject $queryObject
* @param boolean $with_values
* @return resource
* @return mixed
*/
function _executeUpdateAct($queryObject, $with_values = true)
{
$query = $this->getUpdateSql($queryObject, $with_values, true);
if($query instanceof BaseObject)
if ($this->use_prepared_statements == 'Y')
{
if(!$query->toBool()) return $query;
else return;
$this->params = $queryObject->getArguments();
$with_values = false;
}
$query = $this->getUpdateSql($queryObject, $with_values, true);
if ($query instanceof BaseObject)
{
$this->params = array();
return $query;
}
else
{
$output = $this->_query($query);
$this->params = array();
return $output;
}
return $this->_query($query);
}
/**
* Handles deleteAct
* @param BaseObject $queryObject
* @param boolean $with_values
* @return resource
* @return mixed
*/
function _executeDeleteAct($queryObject, $with_values = true)
{
$query = $this->getDeleteSql($queryObject, $with_values, true);
if($query instanceof BaseObject)
if ($this->use_prepared_statements == 'Y')
{
return;
$this->params = $queryObject->getArguments();
$with_values = false;
}
$query = $this->getDeleteSql($queryObject, $with_values, true);
if ($query instanceof BaseObject)
{
$this->params = array();
return $query;
}
else
{
$output = $this->_query($query);
$this->params = array();
return $output;
}
return $this->_query($query);
}
/**
@ -771,23 +996,33 @@ class DBMysql extends DB
*/
function _executeSelectAct($queryObject, $connection = null, $with_values = true)
{
if ($this->use_prepared_statements == 'Y')
{
$this->params = $queryObject->getArguments();
$with_values = false;
}
$result = null;
$limit = $queryObject->getLimit();
$result = NULL;
if($limit && $limit->isPageHandler())
{
return $this->queryPageLimit($queryObject, $result, $connection, $with_values);
$output = $this->queryPageLimit($queryObject, $result, $connection, $with_values);
$this->params = array();
return $output;
}
else
{
$query = $this->getSelectSql($queryObject, $with_values);
if($query instanceof BaseObject)
{
return;
$this->params = array();
return $query;
}
$result = $this->_query($query, $connection);
if($this->isError())
{
$this->params = array();
return $this->queryError($queryObject);
}
@ -801,20 +1036,38 @@ class DBMysql extends DB
$this->_executeUpdateAct($update_query, $with_values);
}
$this->params = array();
return $buff;
}
}
/**
* Get the number of rows affected by the last query
* @return int
*/
function getAffectedRows()
{
$stmt = $this->last_stmt;
return $stmt ? $stmt->affected_rows : -1;
}
/**
* Get the ID generated in the last query
* Return next sequence from sequence table
* This method use only mysql
* @return int
*/
function getInsertID()
{
$connection = $this->_getConnection('master');
return $connection->insert_id;
}
/**
* @deprecated
* @return int
*/
function db_insert_id()
{
$connection = $this->_getConnection('master');
return mysql_insert_id($connection);
return $this->getInsertID();
}
/**
@ -822,9 +1075,9 @@ class DBMysql extends DB
* @param resource $result
* @return BaseObject
*/
function db_fetch_object(&$result)
function db_fetch_object($result)
{
return mysql_fetch_object($result);
return $result->fetch_object();
}
/**
@ -832,9 +1085,9 @@ class DBMysql extends DB
* @param resource $result
* @return boolean Returns TRUE on success or FALSE on failure.
*/
function db_free_result(&$result)
function db_free_result($result)
{
return mysql_free_result($result);
return $result->free_result();
}
/**
@ -855,7 +1108,7 @@ class DBMysql extends DB
*/
function queryError($queryObject)
{
$limit = $queryObject->getLimit();
$limit = method_exists($queryObject, 'getLimit') ? $queryObject->getLimit() : false;
if($limit && $limit->isPageHandler())
{
$buff = new BaseObject;
@ -1045,7 +1298,4 @@ class DBMysql extends DB
}
}
DBMysql::$isSupported = function_exists('mysql_connect');
/* End of file DBMysql.class.php */
/* Location: ./classes/db/DBMysql.class.php */
DBMysql::$isSupported = class_exists('mysqli');

View file

@ -1,76 +0,0 @@
<?php
/* Copyright (C) NAVER <http://www.navercorp.com> */
require_once('DBMysql.class.php');
/**
* Class to use MySQL innoDB DBMS
* mysql innodb handling class
*
* Does not use prepared statements, since mysql driver does not support them
*
* @author NAVER (developers@xpressengine.com)
* @package /classes/db
* @version 0.1
*/
class DBMysql_innodb extends DBMysql
{
/**
* DB transaction start
* this method is private
* @return boolean
*/
function _begin($transactionLevel = 0)
{
$connection = $this->_getConnection('master');
if(!$transactionLevel)
{
$this->_query("START TRANSACTION", $connection);
}
else
{
$this->_query("SAVEPOINT SP" . $transactionLevel, $connection);
}
return true;
}
/**
* DB transaction rollback
* this method is private
* @return boolean
*/
function _rollback($transactionLevel = 0)
{
$connection = $this->_getConnection('master');
$point = $transactionLevel - 1;
if($point)
{
$this->_query("ROLLBACK TO SP" . $point, $connection);
}
else
{
$this->_query("ROLLBACK", $connection);
}
return true;
}
/**
* DB transaction commit
* this method is private
* @return boolean
*/
function _commit()
{
$connection = $this->_getConnection('master');
$this->_query("COMMIT", $connection);
return true;
}
}
DBMysql_innodb::$isSupported = function_exists('mysql_connect');
/* End of file DBMysql_innodb.class.php */
/* Location: ./classes/db/DBMysql_innodb.class.php */

View file

@ -1,412 +0,0 @@
<?php
/* Copyright (C) NAVER <http://www.navercorp.com> */
require_once('DBMysql.class.php');
/**
* Class to use MySQLi DBMS as mysqli_*
* mysql handling class
*
* Does not use prepared statements, since mysql driver does not support them
*
* @author NAVER (developers@xpressengine.com)
* @package /classes/db
* @version 0.1
*/
class DBMysqli extends DBMysql
{
/**
* DB Connect
* this method is private
* @param array $connection connection's value is db_hostname, db_port, db_database, db_userid, db_password
* @return resource
*/
function __connect($connection)
{
// Attempt to connect
if($connection['port'])
{
$result = @mysqli_connect($connection['host'], $connection['user'], $connection['pass'], $connection['database'], $connection['port']);
}
else
{
$result = @mysqli_connect($connection['host'], $connection['user'], $connection['pass'], $connection['database']);
}
$error = mysqli_connect_errno();
if($error)
{
$this->setError($error, mysqli_connect_error());
return;
}
$this->charset = isset($connection['charset']) ? $connection['charset'] : 'utf8';
$this->db_version = $result->server_info;
mysqli_set_charset($result, $this->charset);
return $result;
}
/**
* DB disconnection
* this method is private
* @param resource $connection
* @return void
*/
function _close($connection)
{
mysqli_close($connection);
}
/**
* Handles quatation of the string variables from the query
* @param string $string
* @return string
*/
function addQuotes($string)
{
if(!is_numeric($string))
{
$connection = $this->_getConnection('master');
$string = mysqli_escape_string($connection, $string);
}
return $string;
}
/**
* Execute the query
* this method is private
* @param string $query
* @param resource $connection
* @return resource
*/
function __query($query, $connection)
{
if ($connection === null)
{
$this->setError(-1, 'Unable to connect to DB.');
return false;
}
if($this->use_prepared_statements == 'Y')
{
// 1. Prepare query
$stmt = mysqli_prepare($connection, $query);
if($stmt)
{
$types = '';
$params = array();
$this->_prepareQueryParameters($types, $params);
if(!empty($params))
{
$args[0] = $stmt;
$args[1] = $types;
$i = 2;
foreach($params as $key => $param)
{
$copy[$key] = $param;
$args[$i++] = &$copy[$key];
}
// 2. Bind parameters
$status = call_user_func_array('mysqli_stmt_bind_param', $args);
if(!$status)
{
$this->setError(-1, "Invalid arguments: " . mysqli_error($connection));
}
}
// 3. Execute query
$status = mysqli_stmt_execute($stmt);
if(!$status)
{
$this->setError(-1, "Prepared statement failed: " . mysqli_error($connection));
}
// Return stmt for other processing - like retrieving resultset (_fetch)
return $stmt;
}
}
// Run the query statement
$result = mysqli_query($connection, $query);
// Error Check
$error = mysqli_error($connection);
if($error)
{
$this->setError(mysqli_errno($connection), $error);
}
// Return result
return $result;
}
/**
* Before execute query, prepare statement
* this method is private
* @param string $types
* @param array $params
* @return void
*/
function _prepareQueryParameters(&$types, &$params)
{
$types = '';
$params = array();
if(!$this->param)
{
return;
}
foreach($this->param as $k => $o)
{
$value = $o->getUnescapedValue();
$type = $o->getType();
// Skip column names -> this should be concatenated to query string
if($o->isColumnName())
{
continue;
}
switch($type)
{
case 'number' :
$type = 'i';
break;
case 'varchar' :
$type = 's';
break;
default:
$type = 's';
}
if(is_array($value))
{
foreach($value as $v)
{
$params[] = $v;
$types .= $type;
}
}
else
{
$params[] = $value;
$types .= $type;
}
}
}
/**
* Fetch the result
* @param resource $result
* @param int|NULL $arrayIndexEndValue
* @return array
*/
function _fetch($result, $arrayIndexEndValue = NULL)
{
if($this->use_prepared_statements != 'Y')
{
return parent::_fetch($result, $arrayIndexEndValue);
}
$output = array();
if(!$this->isConnected() || $this->isError() || !$result)
{
return $output;
}
// Prepared stements: bind result variable and fetch data
$stmt = $result;
$meta = mysqli_stmt_result_metadata($stmt);
$fields = mysqli_fetch_fields($meta);
/**
* Mysqli has a bug that causes LONGTEXT columns not to get loaded
* Unless store_result is called before
* MYSQLI_TYPE for longtext is 252
*/
$longtext_exists = false;
foreach($fields as $field)
{
if(isset($resultArray[$field->name])) // When joined tables are used and the same column name appears twice, we should add it separately, otherwise bind_result fails
{
$field->name = 'repeat_' . $field->name;
}
// Array passed needs to contain references, not values
$row[$field->name] = "";
$resultArray[$field->name] = &$row[$field->name];
if($field->type == 252)
{
$longtext_exists = true;
}
}
$resultArray = array_merge(array($stmt), $resultArray);
if($longtext_exists)
{
mysqli_stmt_store_result($stmt);
}
call_user_func_array('mysqli_stmt_bind_result', $resultArray);
$rows = array();
while(mysqli_stmt_fetch($stmt))
{
$resultObject = new stdClass();
foreach($resultArray as $key => $value)
{
if($key === 0)
{
continue; // Skip stmt object
}
if(strpos($key, 'repeat_'))
{
$key = substr($key, 6);
}
$resultObject->$key = $value;
}
$rows[] = $resultObject;
}
mysqli_stmt_close($stmt);
if($arrayIndexEndValue)
{
foreach($rows as $row)
{
$output[$arrayIndexEndValue--] = $row;
}
}
else
{
$output = $rows;
}
if(count($output) == 1)
{
if(isset($arrayIndexEndValue))
{
return $output;
}
else
{
return $output[0];
}
}
return $output;
}
/**
* Handles insertAct
* @param BaseObject $queryObject
* @param boolean $with_values
* @return resource
*/
function _executeInsertAct($queryObject, $with_values = false)
{
if($this->use_prepared_statements != 'Y')
{
return parent::_executeInsertAct($queryObject);
}
$this->param = $queryObject->getArguments();
$result = parent::_executeInsertAct($queryObject, $with_values);
unset($this->param);
return $result;
}
/**
* Handles updateAct
* @param BaseObject $queryObject
* @param boolean $with_values
* @return resource
*/
function _executeUpdateAct($queryObject, $with_values = false)
{
if($this->use_prepared_statements != 'Y')
{
return parent::_executeUpdateAct($queryObject);
}
$this->param = $queryObject->getArguments();
$result = parent::_executeUpdateAct($queryObject, $with_values);
unset($this->param);
return $result;
}
/**
* Handles deleteAct
* @param BaseObject $queryObject
* @param boolean $with_values
* @return resource
*/
function _executeDeleteAct($queryObject, $with_values = false)
{
if($this->use_prepared_statements != 'Y')
{
return parent::_executeDeleteAct($queryObject);
}
$this->param = $queryObject->getArguments();
$result = parent::_executeDeleteAct($queryObject, $with_values);
unset($this->param);
return $result;
}
/**
* Handle selectAct
* In order to get a list of pages easily when selecting \n
* it supports a method as navigation
* @param BaseObject $queryObject
* @param resource $connection
* @param boolean $with_values
* @return BaseObject
*/
function _executeSelectAct($queryObject, $connection = null, $with_values = false)
{
if($this->use_prepared_statements != 'Y')
{
return parent::_executeSelectAct($queryObject, $connection);
}
$this->param = $queryObject->getArguments();
$result = parent::_executeSelectAct($queryObject, $connection, $with_values);
unset($this->param);
return $result;
}
/**
* Get the ID generated in the last query
* Return next sequence from sequence table
* This method use only mysql
* @return int
*/
function db_insert_id()
{
$connection = $this->_getConnection('master');
return mysqli_insert_id($connection);
}
/**
* Fetch a result row as an object
* @param resource $result
* @return BaseObject
*/
function db_fetch_object(&$result)
{
return mysqli_fetch_object($result);
}
/**
* Free result memory
* @param resource $result
* @return boolean Returns TRUE on success or FALSE on failure.
*/
function db_free_result(&$result)
{
return mysqli_free_result($result);
}
}
DBMysqli::$isSupported = function_exists('mysqli_connect');
/* End of file DBMysqli.class.php */
/* Location: ./classes/db/DBMysqli.class.php */

View file

@ -1,86 +0,0 @@
<?php
/* Copyright (C) NAVER <http://www.navercorp.com> */
require_once('DBMysql.class.php');
require_once('DBMysqli.class.php');
/**
* Class to use MySQLi innoDB DBMS as mysqli_*
* mysql innodb handling class
*
* Does not use prepared statements, since mysql driver does not support them
*
* @author NAVER (developers@xpressengine.com)
* @package /classes/db
* @version 0.1
*/
class DBMysqli_innodb extends DBMysqli
{
/**
* DB transaction start
* this method is private
* @return boolean
*/
function _begin($transactionLevel = 0)
{
$connection = $this->_getConnection('master');
if(!$transactionLevel)
{
if(function_exists('mysqli_begin_transaction'))
{
mysqli_begin_transaction($connection);
$this->setQueryLog(array('query' => 'START TRANSACTION'));
}
else
{
$this->_query("START TRANSACTION" . $point, $connection);
}
}
else
{
$this->_query("SAVEPOINT SP" . $transactionLevel, $connection);
}
return true;
}
/**
* DB transaction rollback
* this method is private
* @return boolean
*/
function _rollback($transactionLevel = 0)
{
$connection = $this->_getConnection('master');
$point = $transactionLevel - 1;
if($point)
{
$this->_query("ROLLBACK TO SP" . $point, $connection);
}
else
{
mysqli_rollback($connection);
$this->setQueryLog(array('query' => 'ROLLBACK'));
}
return true;
}
/**
* DB transaction commit
* this method is private
* @return boolean
*/
function _commit()
{
$connection = $this->_getConnection('master');
mysqli_commit($connection);
$this->setQueryLog(array('query' => 'COMMIT'));
return true;
}
}
DBMysqli_innodb::$isSupported = function_exists('mysqli_connect');
/* End of file DBMysqli.class.php */
/* Location: ./classes/db/DBMysqli.class.php */

View file

@ -51,6 +51,12 @@ class Query extends BaseObject
*/
var $groups;
/**
* having list
* @var string|array
*/
var $having;
/**
* order list
* @var array
@ -232,6 +238,27 @@ class Query extends BaseObject
$this->groups = $groups;
}
function setHaving($conditions)
{
$this->having = array();
if(!isset($conditions) || count($conditions) === 0)
{
return;
}
if(!is_array($conditions))
{
$conditions = array($conditions);
}
foreach($conditions as $conditionGroup)
{
if($conditionGroup->show())
{
$this->having[] = $conditionGroup;
}
}
}
function setOrder($order)
{
if(!isset($order) || count($order) === 0)
@ -552,6 +579,30 @@ class Query extends BaseObject
return $groupBy;
}
/**
* Return having sql
* @param boolean $with_values
* @return string
*/
function getHavingString($with_values = TRUE)
{
$having = '';
$condition_count = 0;
foreach($this->having as $conditionGroup)
{
if($condition_count === 0)
{
$conditionGroup->setPipe("");
}
$condition_string = $conditionGroup->toString($with_values);
$having .= $condition_string;
$condition_count++;
}
return trim($having);
}
/**
* Return orderby sql
* @return string
@ -656,6 +707,19 @@ class Query extends BaseObject
}
}
// Having arguments
if(countobj($this->having) > 0)
{
foreach($this->having as $conditionGroup)
{
$args = $conditionGroup->getArguments();
if(countobj($args) > 0)
{
$this->arguments = array_merge($this->arguments, $args);
}
}
}
// Navigation arguments
if(countobj($this->orderby) > 0)
{
@ -669,6 +733,7 @@ class Query extends BaseObject
}
}
}
return $this->arguments;
}

View file

@ -41,7 +41,7 @@ class Condition
* @param string $pipe
* @return void
*/
function __construct($column_name, $argument, $operation, $pipe)
function __construct($column_name, $argument, $operation, $pipe = 'and')
{
$this->column_name = $column_name;
$this->argument = $argument;
@ -85,7 +85,7 @@ class Condition
*/
function toStringWithoutValue()
{
return $this->pipe . ' ' . $this->getConditionPart($this->_value);
return strtoupper($this->pipe) . ' ' . $this->getConditionPart($this->_value);
}
/**
@ -94,7 +94,7 @@ class Condition
*/
function toStringWithValue()
{
return $this->pipe . ' ' . $this->getConditionPart($this->_value);
return strtoupper($this->pipe) . ' ' . $this->getConditionPart($this->_value);
}
function setPipe($pipe)
@ -122,13 +122,18 @@ class Condition
case 'more' :
case 'excess' :
case 'less' :
case 'below' :
case 'below' :
case 'gte' :
case 'gt' :
case 'lte' :
case 'lt' :
case 'like_tail' :
case 'like_prefix' :
case 'like' :
case 'notlike_tail' :
case 'notlike_prefix' :
case 'notlike' :
case 'not_like' :
case 'in' :
case 'notin' :
case 'not_in' :
@ -137,6 +142,7 @@ class Condition
case 'xor':
case 'not':
case 'notequal' :
case 'not_equal' :
// if variable is not set or is not string or number, return
if(!isset($this->_value))
{
@ -167,7 +173,8 @@ class Condition
break;
}
case 'null':
case 'notnull':
case 'notnull':
case 'not_null':
break;
default:
// If operation is not one of the above, means the condition is invalid
@ -190,50 +197,52 @@ class Condition
switch($operation)
{
case 'equal' :
case 'equal' :
return $name . ' = ' . $value;
break;
case 'more' :
case 'more' :
case 'gte' :
return $name . ' >= ' . $value;
break;
case 'excess' :
case 'excess' :
case 'gt' :
return $name . ' > ' . $value;
break;
case 'less' :
case 'less' :
case 'lte' :
return $name . ' <= ' . $value;
break;
case 'below' :
case 'below' :
case 'lt' :
return $name . ' < ' . $value;
break;
case 'like_tail' :
case 'like_prefix' :
case 'like' :
if(defined('__CUBRID_VERSION__')
&& __CUBRID_VERSION__ >= '8.4.1')
return $name . ' rlike ' . $value;
else
return $name . ' like ' . $value;
break;
return $name . ' LIKE ' . $value;
case 'notlike_tail' :
case 'notlike_prefix' :
case 'notlike' :
return $name . ' not like ' . $value;
case 'not_like' :
return $name . ' NOT LIKE ' . $value;
break;
case 'in' :
return $name . ' in ' . $value;
return $name . ' IN ' . $value;
break;
case 'notin' :
case 'not_in' :
return $name . ' not in ' . $value;
return $name . ' NOT IN ' . $value;
break;
case 'notequal' :
case 'notequal' :
case 'not_equal' :
return $name . ' <> ' . $value;
break;
case 'notnull' :
return $name . ' is not null';
case 'notnull' :
case 'not_null' :
return $name . ' IS NOT NULL ';
break;
case 'null' :
return $name . ' is null';
return $name . ' IS NULL ';
break;
case 'and' :
return $name . ' & ' . $value;
@ -248,7 +257,7 @@ class Condition
return $name . ' ~ ' . $value;
break;
case 'between' :
return $name . ' between ' . $value[0] . ' and ' . $value[1];
return $name . ' BETWEEN ' . $value[0] . ' AND ' . $value[1];
break;
}
}

View file

@ -29,7 +29,7 @@ class ConditionGroup
* @param string $pipe
* @return void
*/
function __construct($conditions, $pipe = "")
function __construct($conditions, $pipe = 'and')
{
$this->conditions = array();
foreach($conditions as $condition)
@ -89,7 +89,7 @@ class ConditionGroup
if($this->pipe !== "" && trim($group) !== '')
{
$group = $this->pipe . ' (' . $group . ')';
$group = strtoupper($this->pipe) . ' (' . $group . ')';
}
$this->_group = $group;
@ -105,11 +105,24 @@ class ConditionGroup
{
$args = array();
foreach($this->conditions as $condition)
{
$arg = $condition->getArgument();
if($arg)
{
if($condition instanceof ConditionGroup)
{
foreach($condition->getArguments() as $arg)
{
if($arg)
{
$args[] = $arg;
}
}
}
else
{
$args[] = $arg;
$arg = $condition->getArgument();
if($arg)
{
$args[] = $arg;
}
}
}
return $args;

View file

@ -68,7 +68,7 @@ class ConditionWithArgument extends Condition
$q = '?';
}
}
return $this->pipe . ' ' . $this->getConditionPart($q);
return strtoupper($this->pipe) . ' ' . $this->getConditionPart($q);
}
/**

View file

@ -42,7 +42,7 @@ class SelectExpression extends Expression
*/
function getExpression()
{
return sprintf("%s%s", $this->column_name, $this->column_alias ? " as " . $this->column_alias : "");
return sprintf("%s%s", $this->column_name, $this->column_alias ? (' AS ' . $this->column_alias) : "");
}
function show()

View file

@ -37,7 +37,7 @@ class OrderByColumn
{
$result = $this->getColumnName();
$result .= ' ';
$result .= is_a($this->sort_order, 'Argument') ? $this->sort_order->getValue() : $this->sort_order;
$result .= is_a($this->sort_order, 'Argument') ? $this->sort_order->getValue() : strtoupper($this->sort_order);
return $result;
}

View file

@ -1,71 +0,0 @@
<?php
/* Copyright (C) NAVER <http://www.navercorp.com> */
/**
* @author NAVER (developers@xpressengine.com)
* @package /classes/db/queryparts/table
* @version 0.1
*/
class CubridTableWithHint extends Table
{
/**
* table name
* @var string
*/
var $name;
/**
* table alias
* @var string
*/
var $alias;
/**
* index hint list
* @var array
*/
var $index_hints_list;
/**
* constructor
* @param string $name
* @param string $alias
* @param array $index_hints_list
* @return void
*/
function __construct($name, $alias = NULL, $index_hints_list)
{
parent::__construct($name, $alias);
$this->index_hints_list = $index_hints_list;
}
/**
* Return index hint string
* @return string
*/
function getIndexHintString()
{
$result = '';
// Retrieve table prefix, to add it to index name
$prefix = config('db.master.prefix');
foreach($this->index_hints_list as $index_hint)
{
$index_hint_type = $index_hint->getIndexHintType();
if($index_hint_type !== 'IGNORE')
{
$result .= $this->alias . '.'
. '"' . $prefix . substr($index_hint->getIndexName(), 1)
. ($index_hint_type == 'FORCE' ? '(+)' : '')
. ', ';
}
}
$result = substr($result, 0, -2);
return $result;
}
}
/* End of file CubridTableWithHint.class.php */
/* Location: ./classes/db/queryparts/table/CubridTableWithHint.class.php */

View file

@ -41,12 +41,19 @@ class JoinTable extends Table
function toString($with_value = true)
{
$part = $this->join_type . ' ' . $this->name;
$part .= $this->alias ? ' as ' . $this->alias : '';
$part .= ' on ';
$part = strtoupper($this->join_type) . ' ' . $this->name;
$part .= $this->alias ? (' AS ' . $this->alias) : '';
$part .= ' ON ';
$condition_count = 0;
foreach($this->conditions as $conditionGroup)
{
$part .= $conditionGroup->toString($with_value);
if($condition_count === 0)
{
$conditionGroup->setPipe("");
}
$part .= $conditionGroup->toString($with_value);
$condition_count++;
}
return $part;
}

View file

@ -1,66 +0,0 @@
<?php
/* Copyright (C) NAVER <http://www.navercorp.com> */
/**
* @author NAVER (developers@xpressengine.com)
* @package /classes/db/queryparts/table
* @version 0.1
*/
class MssqlTableWithHint extends Table
{
/**
* table name
* @var string
*/
var $name;
/**
* table alias
* @var string
*/
var $alias;
/**
* index hint type, ex) IGNORE, FORCE, USE...
* @var array
*/
var $index_hints_list;
/**
* constructor
* @param string $name
* @param string $alias
* @param string $index_hints_list
* @return void
*/
function __construct($name, $alias = NULL, $index_hints_list)
{
parent::__construct($name, $alias);
$this->index_hints_list = $index_hints_list;
}
function toString()
{
$result = parent::toString();
$index_hint_string = '';
$indexTypeList = array('USE' => 1, 'FORCE' => 1);
foreach($this->index_hints_list as $index_hint)
{
$index_hint_type = $index_hint->getIndexHintType();
if(isset($indexTypeList[$index_hint_type]))
{
$index_hint_string .= 'INDEX(' . $index_hint->getIndexName() . '), ';
}
}
if($index_hint_string != '')
{
$result .= ' WITH(' . substr($index_hint_string, 0, -2) . ') ';
}
return $result;
}
}
/* End of file MssqlTableWithHint.class.php */
/* Location: ./classes/db/queryparts/table/MssqlTableWithHint.class.php */

View file

@ -36,7 +36,7 @@ class Table
function toString()
{
//return $this->name;
return sprintf("%s%s", $this->name, $this->alias ? ' as ' . $this->alias : '');
return sprintf("%s%s", $this->name, $this->alias ? (' AS ' . $this->alias) : '');
}
function getName()

View file

@ -6,8 +6,8 @@ class HTMLDisplayHandler
/**
* jQuery versions
*/
const JQUERY_V1 = '1.11.3';
const JQUERY_V2 = '2.1.4';
const JQUERY_V1 = '1.12.4';
const JQUERY_V2 = '2.2.4';
/**
* Reserved scripts
@ -201,10 +201,10 @@ class HTMLDisplayHandler
$output = preg_replace($pattern, '/?$1=', $output);
}
}
// prevent the 2nd request due to url(none) of the background-image
$output = preg_replace('/url\((["\']?)none(["\']?)\)/is', 'none', $output);
if(is_array(Context::get('INPUT_ERROR')))
{
$INPUT_ERROR = Context::get('INPUT_ERROR');
@ -235,23 +235,35 @@ class HTMLDisplayHandler
Context::set('favicon_url', $favicon_url);
Context::set('mobicon_url', $mobicon_url);
// convert the final layout
// set content variable that will be inserted in common layout
Context::set('content', $output);
Context::set('m', $is_mobile = Mobile::isFromMobilePhone() ? 1 : 0);
$oTemplate = TemplateHandler::getInstance();
if($is_mobile)
// load basic files
if(!in_array('all', Context::getUnloadedBasicFiles()))
{
$this->_loadMobileJSCSS();
if(Mobile::isFromMobilePhone())
{
$this->_loadMobileJSCSS();
}
else
{
$this->_loadDesktopJSCSS();
}
$this->_loadCommonJSCSS();
}
else
{
$this->_loadDesktopJSCSS();
}
$output = $oTemplate->compile('./common/tpl', 'common_layout');
// set common layout
$output = TemplateHandler::getInstance()->compile('common/tpl', 'common_layout');
// replace the user-defined-language
$oModuleController = getController('module');
$oModuleController->replaceDefinedLangCode($output);
// remove template path comment tag
if(!Rhymix\Framework\Debug::isEnabledForCurrentUser())
{
$output = preg_replace('/\n<!-- Template (?:start|end) : .*? -->\r?\n/', "\n", $output);
}
}
/**
@ -518,11 +530,36 @@ class HTMLDisplayHandler
}
}
// Add tags and hashtags for articles.
if ($page_type === 'article')
{
$tags = $oDocument->getTags();
foreach ($tags as $tag)
{
if ($tag !== '')
{
Context::addOpenGraphData('og:article:tag', $tag, false);
}
}
if (config('seo.og_extract_hashtags'))
{
$hashtags = $oDocument->getHashtags();
foreach ($hashtags as $hashtag)
{
if (!in_array($hashtag, $tags))
{
Context::addOpenGraphData('og:article:tag', escape($hashtag, false));
}
}
}
}
// Add datetime for articles.
if ($page_type === 'article' && config('seo.og_use_timestamps'))
{
Context::addOpenGraphData('article:published_time', $oDocument->getRegdate('c'));
Context::addOpenGraphData('article:modified_time', $oDocument->getUpdate('c'));
Context::addOpenGraphData('og:article:published_time', $oDocument->getRegdate('c'));
Context::addOpenGraphData('og:article:modified_time', $oDocument->getUpdate('c'));
}
}
@ -530,20 +567,20 @@ class HTMLDisplayHandler
* import basic .js files.
* @return void
*/
function _loadDesktopJSCSS()
private function _loadDesktopJSCSS()
{
$lang_type = Context::getLangType();
$this->_loadCommonJSCSS();
// for admin page, add admin css
if(Context::get('module') == 'admin' || strpos(Context::get('act'), 'Admin') > 0)
// add admin css
if(!in_array('admin', Context::getUnloadedBasicFiles()))
{
Context::loadFile(array('./modules/admin/tpl/css/admin.css', '', '', 10), true);
Context::loadFile(array("./modules/admin/tpl/css/admin.iefix.css", '', 'ie', 10), true);
Context::loadFile('./modules/admin/tpl/js/admin.js', true);
Context::loadFile(array('./modules/admin/tpl/css/admin.bootstrap.css', '', '', 1), true);
Context::loadFile(array('./modules/admin/tpl/js/jquery.tmpl.js', '', '', 1), true);
Context::loadFile(array('./modules/admin/tpl/js/jquery.jstree.js', '', '', 1), true);
if(Context::get('module') == 'admin' || strpos(Context::get('act'), 'Admin') > 0)
{
$this->_loadBasicFile('modules/admin/tpl/css/admin.css', 10);
$this->_loadBasicFile('modules/admin/tpl/css/admin.iefix.css', 10, '', true);
$this->_loadBasicFile('modules/admin/tpl/css/admin.bootstrap.css', 1);
$this->_loadBasicFile('modules/admin/tpl/js/admin.js');
$this->_loadBasicFile('modules/admin/tpl/js/jquery.tmpl.js', 1);
$this->_loadBasicFile('modules/admin/tpl/js/jquery.jstree.js', 1);
}
}
}
@ -552,8 +589,12 @@ class HTMLDisplayHandler
*/
private function _loadMobileJSCSS()
{
$this->_loadCommonJSCSS();
Context::loadFile(array('./common/css/mobile.css', '', '', -1500000000), true);
if(in_array('mobile', Context::getUnloadedBasicFiles()))
{
return;
}
$this->_loadBasicFile('common/css/mobile.css', -1500000000);
}
/**
@ -561,9 +602,14 @@ class HTMLDisplayHandler
*/
private function _loadCommonJSCSS()
{
Context::loadFile(array('./common/css/rhymix.scss', '', '', -1600000000), true);
if(in_array('common', Context::getUnloadedBasicFiles()))
{
return;
}
$jquery_version = preg_match('/MSIE [5-8]\./', $_SERVER['HTTP_USER_AGENT']) ? self::JQUERY_V1 : self::JQUERY_V2;
$original_file_list = array(
'plugins/jquery.migrate/jquery-migrate-1.2.1.js',
'plugins/jquery.migrate/jquery-migrate-1.4.1.min.js',
'plugins/blankshield/blankshield.min.js',
'plugins/uri/URI.min.js',
'x.js',
@ -572,40 +618,57 @@ class HTMLDisplayHandler
'xml_handler.js',
'xml_js_filter.js',
);
$jquery_version = preg_match('/MSIE [5-8]\./', $_SERVER['HTTP_USER_AGENT']) ? self::JQUERY_V1 : self::JQUERY_V2;
$this->_loadBasicFile('common/css/rhymix.less', -1600000000);
$this->_loadBasicFile('common/js/jquery-' . $jquery_version . (config('view.minify_scripts') !== 'none' ? '.min' : '') . '.js', -1800000000, 'head');
if(config('view.minify_scripts') === 'none')
{
Context::loadFile(array('./common/js/jquery-' . $jquery_version . '.js', 'head', '', -1800000000), true);
foreach($original_file_list as $filename)
{
Context::loadFile(array('./common/js/' . $filename, 'head', '', -1700000000), true);
$this->_loadBasicFile('common/js/' . $filename, -1700000000, 'head');
}
}
else
{
Context::loadFile(array('./common/js/jquery-' . $jquery_version . '.min.js', 'head', '', -1800000000), true);
$concat_target_filename = 'files/cache/assets/minified/rhymix.min.js';
if(file_exists(\RX_BASEDIR . $concat_target_filename))
{
$concat_target_mtime = filemtime(\RX_BASEDIR . $concat_target_filename);
$original_mtime = 0;
$concat_target_mtime = filemtime(\RX_BASEDIR . $concat_target_filename);
foreach($original_file_list as $filename)
{
$original_mtime = max($original_mtime, filemtime(\RX_BASEDIR . 'common/js/' . $filename));
}
if($concat_target_mtime > $original_mtime)
{
Context::loadFile(array('./' . $concat_target_filename, 'head', '', -1700000000), true);
return;
$no_renew = true;
}
}
Rhymix\Framework\Formatter::minifyJS(array_map(function($str) {
return \RX_BASEDIR . 'common/js/' . $str;
}, $original_file_list), \RX_BASEDIR . $concat_target_filename);
Context::loadFile(array('./' . $concat_target_filename, 'head', '', -1700000000), true);
if(!isset($no_renew))
{
$target_file_list = array();
foreach($original_file_list as $filename)
{
$target_file_list[] = \RX_BASEDIR . 'common/js/' . $filename;
}
Rhymix\Framework\Formatter::minifyJS($target_file_list, \RX_BASEDIR . $concat_target_filename);
}
$this->_loadBasicFile($concat_target_filename, -1700000000, 'head');
}
}
/**
* load basic file
*/
private function _loadBasicFile($filename, $index = 0, $type = '', $ie = false)
{
if(in_array(pathinfo($filename, PATHINFO_BASENAME), Context::getUnloadedBasicFiles()))
{
return;
}
Context::loadFile(array($filename, $type, $ie ? 'ie' : '', $index));
}
}
/* End of file HTMLDisplayHandler.class.php */
/* Location: ./classes/display/HTMLDisplayHandler.class.php */

View file

@ -19,7 +19,7 @@ class ExtraVar
* Current module's Set of ExtraItem
* @var ExtraItem[]
*/
var $keys = null;
var $keys = array();
/**
* Get instance of ExtraVar (singleton)

View file

@ -76,7 +76,7 @@ class FileHandler
* @param string $filename Path of target file
* @param string $buff Content to be written
* @param string $mode a(append) / w(write)
* @return void
* @return false|string
*/
public static function writeFile($filename, $buff, $mode = "w")
{
@ -364,12 +364,9 @@ class FileHandler
}
Rhymix\Framework\Debug::addRemoteRequest($log);
if(count($response->cookies))
foreach($response->cookies as $cookie)
{
foreach($response->cookies as $cookie)
{
$cookies[$host][$cookie->name] = $cookie->value;
}
$cookies[$host][$cookie->name] = $cookie->value;
}
if($response->success)
@ -572,7 +569,16 @@ class FileHandler
return FALSE;
}
imagefilledrectangle($thumb, 0, 0, $resize_width - 1, $resize_height - 1, imagecolorallocate($thumb, 255, 255, 255));
if($target_type == 'png' && function_exists('imagecolorallocatealpha') && function_exists('imagesavealpha') && function_exists('imagealphablending'))
{
imagefill($thumb, 0, 0, imagecolorallocatealpha($thumb, 0, 0, 0, 127));
imagesavealpha($thumb, TRUE);
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;
@ -818,6 +824,64 @@ class FileHandler
$path = self::getRealPath($path);
return Rhymix\Framework\Storage::isDirectory($path) && Rhymix\Framework\Storage::isWritable($path);
}
/**
* @deprecated
*
* Clears file status cache
*
* @param string|array $target filename or directory
* @param boolean $include include files in the directory
*/
public static function clearStatCache($target, $include = false)
{
foreach(is_array($target) ? $target : array($target) as $target_item)
{
$target_item = self::getRealPath($target_item);
if($include && self::isDir($target_item))
{
self::clearStatCache(self::readDir($target_item, '', false, true), $include);
}
else
{
clearstatcache(true, $target_item);
}
}
}
/**
* @deprecated
*
* Invalidates a cached script of OPcache
*
* @param string|array $target filename or directory
* @param boolean $force force
*/
public static function invalidateOpcache($target, $force = true)
{
static $opcache = null;
if($opcache === null)
{
$opcache = function_exists('opcache_invalidate');
}
if($opcache === false)
{
return;
}
foreach(is_array($target) ? $target : array($target) as $target_item)
{
if(substr($target_item, -4) === '.php')
{
opcache_invalidate(self::getRealPath($target_item), $force);
}
elseif($path = self::isDir($target_item))
{
self::invalidateOpcache(self::readDir($path, '', false, true), $force);
}
}
}
}
/* End of file FileHandler.class.php */

View file

@ -228,12 +228,9 @@ class ModuleHandler extends Handler
{
$oDocumentModel = getModel('document');
$oDocument = $oDocumentModel->getDocument($this->document_srl);
if($oDocument->isSecret() || $oDocument->get('status') === $oDocumentModel->getConfigStatus('temp'))
if($oDocument->isExists() && !$oDocument->isAccessible())
{
if(!$oDocument->isGranted() && !$oDocument->isAccessible())
{
$this->httpStatusCode = '403';
}
$this->httpStatusCode = '403';
}
}
}
@ -549,8 +546,6 @@ class ModuleHandler extends Handler
}
return $oMessageObject;
}
$forward = NULL;
// 1. Look for the module with action name
if(preg_match('/^([a-z]+)([A-Z])([a-z0-9\_]+)(.*)$/', $this->act, $matches))
@ -578,12 +573,12 @@ class ModuleHandler extends Handler
}
}
if(!$forward)
if(empty($forward->module))
{
$forward = $oModuleModel->getActionForward($this->act);
}
if($forward->module && $forward->type && $forward->act && $forward->act == $this->act)
if(!empty($forward->module))
{
$kind = stripos($forward->act, 'admin') !== FALSE ? 'admin' : '';
$type = $forward->type;
@ -706,7 +701,7 @@ class ModuleHandler extends Handler
// ruleset check...
if(!empty($ruleset))
{
$rulesetModule = $forward->module ? $forward->module : $this->module;
$rulesetModule = !empty($forward->module) ? $forward->module : $this->module;
$rulesetFile = $oModuleModel->getValidatorFilePath($rulesetModule, $ruleset, $this->mid);
if(!empty($rulesetFile))
{
@ -909,7 +904,7 @@ class ModuleHandler extends Handler
}
// If connection to DB has a problem even though it's not install module, set error
if($this->module != 'install' && isset($GLOBALS['__DB__']) && $GLOBALS['__DB__'][Context::getDBType()]->isConnected() == FALSE)
if($this->module != 'install' && !DB::getInstance()->isConnected())
{
$this->error = 'msg_dbconnect_failed';
}
@ -1030,22 +1025,18 @@ class ModuleHandler extends Handler
$oMenuAdminController = getAdminController('menu');
$homeMenuCacheFile = $oMenuAdminController->getHomeMenuCacheFile();
$homeMenuSrl = 0;
if(FileHandler::exists($homeMenuCacheFile))
{
include($homeMenuCacheFile);
}
$menu->xml_file = './files/cache/menu/' . $homeMenuSrl . '.xml.php';
$menu->php_file = './files/cache/menu/' . $homeMenuSrl . '.php';
if(!$menu->menu_srl)
{
$menu->xml_file = str_replace('.xml.php', $homeMenuSrl . '.xml.php', $menu->xml_file);
$menu->php_file = str_replace('.php', $homeMenuSrl . '.php', $menu->php_file);
$layout_info->menu->{$menu_id}->menu_srl = $homeMenuSrl;
}
else
{
$menu->xml_file = str_replace($menu->menu_srl, $homeMenuSrl, $menu->xml_file);
$menu->php_file = str_replace($menu->menu_srl, $homeMenuSrl, $menu->php_file);
}
}
$php_file = FileHandler::exists($menu->php_file);

View file

@ -38,6 +38,10 @@ class ModuleObject extends BaseObject
function __construct($error = 0, $message = 'success')
{
$this->user = Context::get('logged_info') ?: new Rhymix\Framework\Helpers\SessionHelper;
if(!($this->user instanceof Rhymix\Framework\Helpers\SessionHelper))
{
$this->user = Rhymix\Framework\Session::getMemberInfo();
}
parent::__construct($error, $message);
}

View file

@ -32,9 +32,10 @@ class TemplateHandler
*/
public function __construct()
{
ini_set('pcre.jit', false);
$this->config = new stdClass;
$this->handler_mtime = filemtime(__FILE__);
$this->user = Context::get('logged_info') ?: new Rhymix\Framework\Helpers\SessionHelper;
$this->user = Rhymix\Framework\Session::getMemberInfo() ?: new Rhymix\Framework\Helpers\SessionHelper;
}
/**
@ -72,36 +73,35 @@ class TemplateHandler
protected function init($tpl_path, $tpl_filename, $tpl_file = '')
{
// verify arguments
if(!$tpl_path || substr($tpl_path, -1) != '/')
{
$tpl_path .= '/';
}
$tpl_path = trim(preg_replace('@^' . preg_quote(\RX_BASEDIR, '@') . '|\./@', '', str_replace('\\', '/', $tpl_path)), '/') . '/';
if($tpl_path === '/' || !is_dir($tpl_path))
{
return;
}
if(!file_exists($tpl_path . $tpl_filename) && file_exists($tpl_path . $tpl_filename . '.html'))
if(!file_exists(\RX_BASEDIR . $tpl_path . $tpl_filename) && file_exists(\RX_BASEDIR . $tpl_path . $tpl_filename . '.html'))
{
$tpl_filename .= '.html';
}
// create tpl_file variable
if(!$tpl_file)
if($tpl_file)
{
$tpl_file = trim(preg_replace('@^' . preg_quote(\RX_BASEDIR, '@') . '|\./@', '', str_replace('\\', '/', $tpl_file)), '/');
}
else
{
$tpl_file = $tpl_path . $tpl_filename;
}
// set template file infos.
$this->path = $tpl_path;
$this->path = \RX_BASEDIR . $tpl_path;
$this->web_path = \RX_BASEURL . $tpl_path;
$this->filename = $tpl_filename;
$this->file = $tpl_file;
// set absolute URL of template path
$this->web_path = \RX_BASEURL . ltrim(preg_replace('@^' . preg_quote(\RX_BASEDIR, '@') . '|\./@', '', $this->path), '/');
$this->file = \RX_BASEDIR . $tpl_file;
// set compiled file name
$converted_path = str_replace(array('\\', '..'), array('/', 'dotdot'), ltrim($this->file, './'));
$this->compiled_file = \RX_BASEDIR . 'files/cache/template/' . $converted_path . '.php';
$converted_path = ltrim(str_replace(array('\\', '..'), array('/', 'dotdot'), $tpl_file), '/');
$this->compiled_file = \RX_BASEDIR . 'files/cache/template/' . $converted_path . '.php';
}
/**
@ -122,6 +122,7 @@ class TemplateHandler
// if target file does not exist exit
if(!$this->file || !file_exists($this->file))
{
$tpl_path = str_replace('\\', '/', $tpl_path);
$error_message = "Template not found: ${tpl_path}${tpl_filename}" . ($tpl_file ? " (${tpl_file})" : '');
trigger_error($error_message, \E_USER_WARNING);
return escape($error_message);
@ -184,6 +185,7 @@ class TemplateHandler
// if target file does not exist exit
if(!$this->file || !file_exists($this->file))
{
$tpl_path = str_replace('\\', '/', $tpl_path);
$error_message = "Template not found: ${tpl_path}${tpl_filename}";
trigger_error($error_message, \E_USER_WARNING);
return escape($error_message);
@ -343,19 +345,32 @@ class TemplateHandler
*/
private function _fetch($filename)
{
$__Context = Context::getInstance();
// Import Context and lang as local variables.
$__Context = Context::getAll();
$__Context->tpl_path = $this->path;
global $lang;
// Start the output buffer.
$__ob_level_before_fetch = ob_get_level();
ob_start();
// Include the compiled template.
include $filename;
// Fetch contents of the output buffer until the buffer level is the same as before.
$contents = '';
while (ob_get_level() > $__ob_level_before_fetch)
{
$contents .= ob_get_clean();
}
// Insert template path comment tag.
if(Rhymix\Framework\Debug::isEnabledForCurrentUser() && Context::getResponseMethod() === 'HTML' && !starts_with('<!DOCTYPE', $contents) && !starts_with('<?xml', $contents))
{
$sign = PHP_EOL . '<!-- Template %s : ' . $this->web_path . $this->filename . ' -->' . PHP_EOL;
$contents = sprintf($sign, 'start') . $contents . sprintf($sign, 'end');
}
return $contents;
}
@ -404,27 +419,13 @@ class TemplateHandler
*/
private function _parseInline($buff)
{
preg_match_all('/<([a-zA-Z]+\d?)(?>(?!<[a-z]+\d?[\s>]).)*?(?:[ \|]cond| loop)="/s', $buff, $match);
if(empty($match))
{
return $buff;
}
$tags = array_diff(array_unique($match[1]), $this->skipTags);
if(!count($tags))
{
return $buff;
}
$tags = '(?:' . implode('|', $tags) . ')';
$split_regex = "@(<(?>/?{$tags})(?>[^<>\{\}\"']+|<!--.*?-->|{[^}]+}|\".*?\"|'.*?'|.)*?>)@s";
$nodes = preg_split($split_regex, $buff, -1, PREG_SPLIT_DELIM_CAPTURE);
// list of self closing tags
$self_closing = array('area' => 1, 'base' => 1, 'basefont' => 1, 'br' => 1, 'hr' => 1, 'input' => 1, 'img' => 1, 'link' => 1, 'meta' => 1, 'param' => 1, 'frame' => 1, 'col' => 1);
$skip = $this->skipTags ? sprintf('(?!%s)', implode('|', $this->skipTags)) : '';
$split_regex = "@(</?{$skip}[a-zA-Z](?>[^<>{}\"]+|<!--.*?-->.*?<!--.*?end-->|{[^}]*}|\"(?>'.*?'|.)*?\"|.)*?>)@s";
$nodes = preg_split($split_regex, $buff, -1, PREG_SPLIT_DELIM_CAPTURE);
for($idx = 1, $node_len = count($nodes); $idx < $node_len; $idx+=2)
{
if(!($node = $nodes[$idx]))
@ -465,10 +466,7 @@ class TemplateHandler
{
$expr_m[2] .= '=>' . trim($expr_m[3]);
}
$nodes[$idx - 1] .= sprintf(
'<?php $t%3$s=%1$s;if($t%3$s&&count($t%3$s))foreach($t%3$s as %2$s){ ?>'
,$expr_m[1], $expr_m[2], md5( $buff . strval($idx-1) )
);
$nodes[$idx - 1] .= sprintf('<?php if(%1$s)foreach(%1$s as %2$s){ ?>', $expr_m[1], $expr_m[2]);
}
elseif($expr_m[4])
{
@ -867,7 +865,7 @@ class TemplateHandler
elseif($mm[1] == 'foreach')
{
$var = preg_replace('/^\s*\(\s*(.+?) .*$/', '$1', $m[8]);
$precheck = "if({$var}&&count({$var}))";
$precheck = "if({$var})";
}
return '<?php ' . self::_replaceVar($precheck . $m[7] . $m[8]) . '{ ?>' . $m[9];
}
@ -970,7 +968,7 @@ class TemplateHandler
}
return preg_replace_callback('@(?<!::|\\\\|(?<!eval\()\')\$([a-z_][a-z0-9_]*)@i', function($matches) {
if (preg_match('/^(?:GLOBALS|_SERVER|_COOKIE|_GET|_POST|_REQUEST|__Context|this)$/', $matches[1]))
if (preg_match('/^(?:GLOBALS|_SERVER|_COOKIE|_GET|_POST|_REQUEST|__Context|this|lang)$/', $matches[1]))
{
return '$' . $matches[1];
}

View file

@ -323,7 +323,7 @@ class Validator
if(is_array($value))
{
if(!isset($value[tmp_name]))
if(!isset($value['tmp_name']))
{
$value = implode('', $value);
}

View file

@ -216,7 +216,7 @@ class XmlJsFilter extends XmlParser
}
// generates a field, which is a script of the checked item
$node_count = count($field_node);
$node_count = countobj($field_node);
if($node_count)
{
foreach($field_node as $key => $node)
@ -309,7 +309,7 @@ class XmlJsFilter extends XmlParser
// generates parameter script to create dbata
$rename_params = array();
$parameter_count = count($parameter_param);
$parameter_count = countobj($parameter_param);
if($parameter_count)
{
// contains parameter of the default filter contents

View file

@ -16,7 +16,7 @@ class ConditionGroupTag
* @var string|array value is ConditionTag object
*/
var $conditions;
/**
* pipe
* @var string
@ -29,7 +29,7 @@ class ConditionGroupTag
* @param string $pipe
* @return void
*/
function __construct($conditions, $pipe = "")
function __construct($conditions, $pipe = 'and')
{
$this->pipe = $pipe;
@ -40,8 +40,18 @@ class ConditionGroupTag
foreach($conditions as $condition)
{
//if($condition->node_name === 'query') $this->conditions[] = new QueryTag($condition, true);
$this->conditions[] = new ConditionTag($condition);
if($condition->node_name === 'group')
{
$subconditions = $condition->condition;
$subgroups = $condition->group;
$subconditions = $subconditions ? (is_array($subconditions) ? $subconditions : [$subconditions]) : [];
$subgroups = $subgroups ? (is_array($subgroups) ? $subgroups : [$subgroups]) : [];
$this->conditions[] = new ConditionGroupTag(array_merge($subconditions, $subgroups), $condition->attrs->pipe);
}
else
{
$this->conditions[] = new ConditionTag($condition);
}
}
}
@ -58,8 +68,15 @@ class ConditionGroupTag
{
$conditions_string = 'array(' . PHP_EOL;
foreach($this->conditions as $condition)
{
$conditions_string .= $condition->getConditionString() . PHP_EOL . ',';
{
if($condition instanceof ConditionGroupTag)
{
$conditions_string .= $condition->getConditionGroupString() . PHP_EOL . ',';
}
else
{
$conditions_string .= $condition->getConditionString() . PHP_EOL . ',';
}
}
$conditions_string = substr($conditions_string, 0, -2); //remove ','
$conditions_string .= ')';

View file

@ -62,7 +62,7 @@ class ConditionTag
function __construct($condition)
{
$this->operation = $condition->attrs->operation;
$this->pipe = $condition->attrs->pipe;
$this->pipe = $condition->attrs->pipe ?: 'and';
$dbParser = DB::getParser();
$this->column_name = $dbParser->parseExpression($condition->attrs->column);

View file

@ -61,8 +61,12 @@ class ConditionsTag
$xml_groups = array($xml_groups);
}
foreach($xml_groups as $group)
{
$this->condition_groups[] = new ConditionGroupTag($group->condition, $group->attrs->pipe);
{
$subconditions = $group->condition;
$subgroups = $group->group;
$subconditions = $subconditions ? (is_array($subconditions) ? $subconditions : [$subconditions]) : [];
$subgroups = $subgroups ? (is_array($subgroups) ? $subgroups : [$subgroups]) : [];
$this->condition_groups[] = new ConditionGroupTag(array_merge($subconditions, $subgroups), $group->attrs->pipe);
}
}
}

View file

@ -71,6 +71,12 @@ class QueryTag
*/
var $groups;
/**
* Having in xml tags
* @var object
*/
var $having;
/**
* Navigation in xml tags
* @var object
@ -303,7 +309,8 @@ class QueryTag
$buff .= '$query->setSubquery(' . $this->subquery->toString() . ');' . PHP_EOL;
}
$buff .= '$query->setConditions(' . $this->conditions->toString() . ');' . PHP_EOL;
$buff .= '$query->setGroups(' . $this->groups->toString() . ');' . PHP_EOL;
$buff .= '$query->setGroups(' . $this->groups->toString() . ');' . PHP_EOL;
$buff .= '$query->setHaving(' . $this->having->toString() . ');' . PHP_EOL;
$buff .= '$query->setOrder(' . $this->navigation->getOrderByString() . ');' . PHP_EOL;
$buff .= '$query->setLimit(' . $this->navigation->getLimitString() . ');' . PHP_EOL;
@ -340,12 +347,16 @@ class QueryTag
{
if($this->query->groups)
{
return $this->groups = new GroupsTag($this->query->groups->group);
$this->groups = new GroupsTag($this->query->groups->group);
$this->having = new ConditionsTag($this->query->groups->having);
}
else
{
return $this->groups = new GroupsTag(NULL);
}
$this->groups = new GroupsTag(NULL);
$this->having = new ConditionsTag(array());
}
return $this->groups;
}
function getNavigation()
@ -385,7 +396,8 @@ class QueryTag
$arguments = array_merge($arguments, $this->subquery->getArguments());
}
$arguments = array_merge($arguments, $this->tables->getArguments());
$arguments = array_merge($arguments, $this->conditions->getArguments());
$arguments = array_merge($arguments, $this->conditions->getArguments());
$arguments = array_merge($arguments, $this->having->getArguments());
$arguments = array_merge($arguments, $this->navigation->getArguments());
return $arguments;
}

View file

@ -37,7 +37,7 @@ class HintTableTag extends TableTag
$dbType = ucfirst(Context::getDBType());
$result = sprintf('new %sTableWithHint(\'%s\'%s, array('
, $dbType == 'Mysqli' ? 'Mysql' : $dbType
, starts_with('mysql', $dbType, false) ? 'Mysql' : $dbType
, $dbParser->escape($this->name)
, $this->alias ? ', \'' . $dbParser->escape($this->alias) . '\'' : ', null'
//, ', \'' . $dbParser->escape($this->index->name) .'\', \'' . $this->index->type .'\''

View file

@ -92,7 +92,7 @@ class TableTag
function isJoinTable()
{
$joinList = array('left join' => 1, 'left outer join' => 1, 'right join' => 1, 'right outer join' => 1);
if(isset($joinList[$this->join_type]) && count($this->conditions))
if(isset($joinList[$this->join_type]) && countobj($this->conditions))
{
return true;
}

View file

@ -41,15 +41,6 @@ if (function_exists('mb_regex_encoding'))
require_once __DIR__ . '/constants.php';
require_once __DIR__ . '/functions.php';
require_once __DIR__ . '/legacy.php';
require_once RX_BASEDIR . 'classes/object/Object.class.php';
/**
* Load user configuration.
*/
if(file_exists(RX_BASEDIR . 'config/config.user.inc.php'))
{
require_once RX_BASEDIR . 'config/config.user.inc.php';
}
/**
* Define the list of legacy class names for the autoloader.
@ -75,10 +66,8 @@ $GLOBALS['RX_AUTOLOAD_FILE_MAP'] = array_change_key_case(array(
'UpdateExpressionWithoutArgument' => 'classes/db/queryparts/expression/UpdateExpressionWithoutArgument.class.php',
'Limit' => 'classes/db/queryparts/limit/Limit.class.php',
'OrderByColumn' => 'classes/db/queryparts/order/OrderByColumn.class.php',
'CubridTableWithHint' => 'classes/db/queryparts/table/CubridTableWithHint.class.php',
'IndexHint' => 'classes/db/queryparts/table/IndexHint.class.php',
'JoinTable' => 'classes/db/queryparts/table/JoinTable.class.php',
'MssqlTableWithHint' => 'classes/db/queryparts/table/MssqlTableWithHint.class.php',
'MysqlTableWithHint' => 'classes/db/queryparts/table/MysqlTableWithHint.class.php',
'Table' => 'classes/db/queryparts/table/Table.class.php',
'DisplayHandler' => 'classes/display/DisplayHandler.class.php',
@ -194,6 +183,19 @@ spl_autoload_register(function($class_name)
*/
require_once RX_BASEDIR . 'vendor/autoload.php';
/**
* Load essential classes.
*/
require_once RX_BASEDIR . 'classes/object/Object.class.php';
/**
* Load user configuration.
*/
if(file_exists(RX_BASEDIR . 'config/config.user.inc.php'))
{
require_once RX_BASEDIR . 'config/config.user.inc.php';
}
/**
* Load system configuration.
*/

View file

@ -3,7 +3,7 @@
/**
* RX_VERSION is the version number of the Rhymix CMS.
*/
define('RX_VERSION', '1.8.46');
define('RX_VERSION', '1.9.7');
/**
* RX_MICROTIME is the startup time of the current script, in microseconds since the Unix epoch.

447
common/css/rhymix.less Normal file
View file

@ -0,0 +1,447 @@
@charset "UTF-8";
/* Element Reset */
body, table, input, textarea, select, button {
font-family: sans-serif;
font-size: 12px;
}
article, aside, details, figcaption, figure, footer, header, hgroup, nav, section {
display: block;
}
body {
position: relative;
}
a img {
border: 0;
}
[hidden] {
display: none;
}
/* Content Default Styles */
.word_break(@wb) when (@wb = normal), (@wb = keep-all), (@wb = break-all) {
word-break: @wb;
word-wrap: break-word;
}
.word_break(@wb) when (@wb = none) {
white-space: nowrap;
}
.xe_content {
font-family: @default_font_family;
font-size: @default_font_size;
line-height: @default_line_height;
.word_break(@default_word_break);
p {
margin: 0 0 @default_paragraph_spacing 0;
}
img {
max-width: 100%;
height: auto;
}
}
@media screen {
img {
max-width: none;
}
}
/* Clearfix */
.xe-clearfix {
&:before, &:after {
content: " ";
display: table;
}
&:after {
clear: both;
}
zoom: 1;
}
.xe-widget-wrapper {
overflow: hidden;
}
/* Popup Menu Area */
#popup_menu_area {
position: absolute;
z-index: 9999;
margin: 10px 0;
padding: 0;
border: 1px solid #eeeeee;
border-radius: 2px;
font-size: 12px;
box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23);
background: #fff;
min-width:80px;
ul {
margin: 0;
padding: 0;
list-style: none;
}
li {
margin: 0;
padding: 0;
line-height: 1.5;
}
a {
display: block;
padding: 5px;
text-decoration: none;
color: #212121;
&:hover, &:active, &:focus {
background: #eeeeee;
outline: none;
}
}
}
@media screen and (max-width: 400px) {
#popup_menu_area {
min-width:120px;
max-width:95%;
font-size: 13px;
a {
display: block;
padding: 10px;
text-decoration: none;
color: #212121;
}
}
}
/* Editable Preview */
.editable_preview {
width: 100%;
min-height: 240px;
max-height: 440px;
box-sizing: border-box;
margin: 0;
padding: 6px;
border: 1px solid #ccc;
border-radius: 4px;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
overflow-y: auto;
cursor: text;
p {
margin-bottom: @default_paragraph_spacing !important;
}
}
.editable_preview_iframe {
width: 100%;
height: 440px;
box-sizing: border-box;
margin: 0 0 -4px 0;
padding: 0;
border: 0;
}
/* Message */
.message {
position: relative;
margin: 1em 0;
padding: 0 1em;
border: 1px solid #ddd;
border-radius: 4px;
line-height: 1.4;
font-size: 13px;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
background-color: #f8f8f8;
p {
margin: 1em 0 !important;
}
&.info {
border-color: #BCE8F1;
color: #3A87AD;
background-color: #D9EDF7;
}
&.error {
border-color: #EED3D7;
color: #B94A48;
background-color: #F2DEDE;
}
&.update {
border-color: #D6E9C6;
color: #468847;
background-color: #DFF0D8;
}
}
body > .message {
margin: 1em;
}
/* Waiting for server response */
.wfsr {
z-index: 100;
display: none;
position: fixed;
left: 0;
top: 0;
right: 0;
margin: 0;
padding: 20px 0 0 0;
border-bottom: 1px solid #ccc;
text-align: center;
font: bold 16px/60px "Helvetica Neue", Helvetica, Arial, Dotum, sans-serif;
color: #fff;
opacity: .8;
filter: alpha(opacity=80);
box-shadow: 0 0 5px #000;
background: #333 url("../../common/img/msg.loading.gif") no-repeat center 15px;
}
/* Button */
.btnArea {
clear: both;
margin: 10px 0;
padding: 0;
text-align: right;
zoom: 1;
&:after {
clear: both;
display: block;
content: "";
}
}
.btn {
display: inline-block;
*display: inline;
margin: 0;
padding: 0 12px !important;
height: 24px !important;
overflow: visible;
border: 1px solid #bbbbbb;
border-color: #e6e6e6 #e6e6e6 #bfbfbf;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
border-bottom-color: #a2a2a2;
border-radius: 2px;
text-decoration: none !important;
text-align: center;
text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
vertical-align: top;
line-height: 24px !important;
font-family: inherit;
font-size: 12px;
color: #333333;
*zoom: 1;
cursor: pointer;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
background-color: #f5f5f5;
*background-color: #e6e6e6;
background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
background-image: -webkit-gradient(top, #ffffff, #e6e6e6);
background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
background-image: linear-gradient(top, #ffffff, #e6e6e6);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
&:hover, &:active, &[disabled] {
color: #333;
background-color: #e6e6e6;
*background-color: #d9d9d9;
}
>a, >button, >input, >span {
display: inline-block;
*zoom: 1;
margin: 0 -12px !important;
padding: 0 12px !important;
overflow: visible;
width: auto;
height: 24px;
border: 0;
vertical-align: top;
text-decoration: none !important;
line-height: 24px;
font-family: inherit;
font-size: 12px;
color: #333;
cursor: pointer;
background: none;
}
}
input.btn, button.btn {
height: 26px !important;
}
.btn-group {
position: relative;
display: inline-block;
*display: inline;
*margin-left: .3em;
white-space: nowrap;
vertical-align: middle;
font-size: 0;
*zoom: 1;
&:first-child {
*margin-left: 0;
}
&+.btn-group {
margin-left: 5px;
}
>.btn {
position: relative;
-webkit-border-radius: 0;
-moz-border-radius: 0;
border-radius: 0;
&+.btn {
margin-left: -1px;
}
&:first-child {
margin-left: 0;
-webkit-border-bottom-left-radius: 4px;
-moz-border-radius-bottomleft: 4px;
border-bottom-left-radius: 4px;
-webkit-border-top-left-radius: 4px;
-moz-border-radius-topleft: 4px;
border-top-left-radius: 4px;
}
&:last-child {
-webkit-border-top-right-radius: 4px;
-moz-border-radius-topright: 4px;
border-top-right-radius: 4px;
-webkit-border-bottom-right-radius: 4px;
-moz-border-radius-bottomright: 4px;
border-bottom-right-radius: 4px;
}
&:hover, &:focus, &:active, &.active {
z-index: 2;
}
}
}
/* Debug */
#rhymix_debug_button {
display: none;
position: fixed;
left: 0; bottom: 40px;
background: #eeeeee;
background: linear-gradient(to bottom, #f4f4f4 0%, #eaeaea 100%);
border: 1px solid #ccc; border-left: 0;
border-top-right-radius: 4px;
border-bottom-right-radius: 4px;
box-shadow: 0 0 3px 0 rgba(0, 0, 0, 0.18), 0 0 6px 0 rgba(0, 0, 0, 0.12);
z-index: 1073741824;
&:hover {
background: #dddddd;
background: linear-gradient(to bottom, #e8e8e8 0%, #d9d9d9 100%);
}
a {
display: block;
font: bold 12px/14px Arial, sans-serif;
color: #444;
text-decoration: none;
padding: 4px 8px;
&.has_errors {
color: #f44336;
}
}
}
#rhymix_debug_panel {
display: none;
position: fixed;
left: 0; top: 0;
max-width: 100%;
height: 100%;
overflow-y: scroll;
background: #fcfcfc;
box-sizing: border-box;
border-right: 1px solid #ccc;
box-shadow: 0 0 4px 0 rgba(0, 0, 0, 0.18), 0 0 8px 0 rgba(0, 0, 0, 0.12);
z-index: 1073741824;
.debug_header {
clear: both;
width: 100%;
height: 36px;
background: #444444;
background: linear-gradient(to right, #222222 0%, #444444 40%, #eeeeee 100%);
position: relative;
h2 {
font: bold 16px/20px Arial, sans-serif;
color: #fcfcfc;
position: absolute;
left: 10px; top: 10px;
margin: 0; padding: 0;
}
.debug_maximize {
font: normal 20px/24px Arial, sans-serif;
text-decoration: none;
color: #444444;
position: absolute;
right: 32px; top: 6px;
}
.debug_close {
font: normal 28px/28px Arial, sans-serif;
text-decoration: none;
color: #444444;
position: absolute;
right: 10px; top: 4px;
&:hover {
color: #f44336;
}
}
}
.debug_page {
clear: both;
margin: 12px 10px;
font: normal 12px/16px Arial, NanumBarunGothic, NanumGothic, "Malgun Gothic", sans-serif;
.debug_page_header {
padding-bottom: 8px;
border-bottom: 1px solid #ddd;
position: relative;
cursor: pointer;
h3 {
color: #444;
font: inherit;
font-size: 14px;
font-weight: bold;
margin: 0;
padding: 0;
}
}
.debug_page_collapse {
display: block;
position: absolute;
right: 0; top: 0;
color: #999;
font-size: 10px;
line-height: 12px;
text-decoration: none;
padding: 2px 2px;
}
.debug_page_body {
margin: 8px 4px 8px 10px;
h4 {
color: #444;
font: inherit;
font-size: 13px;
font-weight: bold;
margin: 0 0 8px 0;
padding: 0;
}
}
.debug_entry {
font-family: Consolas, "Courier New", monospace;
color: #444;
margin-left: 38px;
margin-bottom: 8px;
text-indent: -28px;
word-wrap: break-word;
word-break: break-all;
&.pre_wrap {
white-space: pre-wrap;
}
ul.debug_metadata {
margin: 0 0 0 -16px; padding: 0;
li {
list-style: disc;
margin: 0; padding: 0; text-indent: 0;
}
}
ul.debug_backtrace {
margin: 4px 0 0 16px; padding: 0;
li {
list-style: disc;
margin: 0; padding: 0; text-indent: 0;
color: #888;
}
}
}
}
}

View file

@ -1,419 +1 @@
@charset "UTF-8";
/* Element Reset */
body, table, input, textarea, select, button {
font-family: sans-serif;
font-size: 12px;
}
article, aside, details, figcaption, figure, footer, header, hgroup, nav, section {
display: block;
}
body {
position: relative;
}
a img {
border: 0;
}
[hidden] {
display: none;
}
/* Content Default Styles */
.xe_content {
font-family: $default_font_family;
font-size: $default_font_size;
line-height: $default_line_height;
@if $default_word_break == 'none' {
white-space: nowrap;
} @else {
word-break: $default_word_break;
word-wrap: break-word;
}
p {
margin: 0 0 $default_paragraph_spacing 0;
}
img {
max-width: 100%;
height: auto;
}
}
@media \0screen {
img {
max-width: none;
}
}
/* Clearfix */
.xe-clearfix {
&:before, &:after {
content: " ";
display: table;
}
&:after {
clear: both;
}
zoom: 1;
}
.xe-widget-wrapper {
overflow: hidden;
}
/* Popup Menu Area */
#popup_menu_area {
position: absolute;
z-index: 9999;
margin: 10px 0;
padding: 0;
border: 1px solid #eeeeee;
border-radius: 2px;
font-size: 12px;
box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23);
background: #fff;
min-width:80px;
ul {
margin: 0;
padding: 0;
list-style: none;
}
li {
margin: 0;
padding: 0;
line-height: 1.5;
}
a {
display: block;
padding: 5px;
text-decoration: none;
color: #212121;
&:hover, &:active, &:focus {
background: #eeeeee;
outline: none;
}
}
}
@media screen and (max-width: 400px) {
#popup_menu_area {
min-width:120px;
max-width:95%;
font-size: 13px;
a {
display: block;
padding: 10px;
text-decoration: none;
color: #212121;
}
}
}
/* Message */
.message {
position: relative;
margin: 1em 0;
padding: 0 1em;
border: 1px solid #ddd;
border-radius: 4px;
line-height: 1.4;
font-size: 13px;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
background-color: #f8f8f8;
p {
margin: 1em 0 !important;
}
&.info {
border-color: #BCE8F1;
color: #3A87AD;
background-color: #D9EDF7;
}
&.error {
border-color: #EED3D7;
color: #B94A48;
background-color: #F2DEDE;
}
&.update {
border-color: #D6E9C6;
color: #468847;
background-color: #DFF0D8;
}
}
body > .message {
margin: 1em;
}
/* Waiting for server response */
.wfsr {
z-index: 100;
display: none;
position: fixed;
left: 0;
top: 0;
right: 0;
margin: 0;
padding: 20px 0 0 0;
border-bottom: 1px solid #ccc;
text-align: center;
font: bold 16px/60px "Helvetica Neue", Helvetica, Arial, , Dotum, sans-serif;
color: #fff;
opacity: .8;
filter: alpha(opacity=80);
box-shadow: 0 0 5px #000;
background: #333 url("../../common/img/msg.loading.gif") no-repeat center 15px;
}
/* Button */
.btnArea {
clear: both;
margin: 10px 0;
padding: 0;
text-align: right;
zoom: 1;
&:after {
clear: both;
display: block;
content: "";
}
}
.btn {
display: inline-block;
*display: inline;
margin: 0;
padding: 0 12px !important;
height: 24px !important;
overflow: visible;
border: 1px solid #bbbbbb;
border-color: #e6e6e6 #e6e6e6 #bfbfbf;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
border-bottom-color: #a2a2a2;
border-radius: 2px;
text-decoration: none !important;
text-align: center;
text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
vertical-align: top;
line-height: 24px !important;
font-family: inherit;
font-size: 12px;
color: #333333;
*zoom: 1;
cursor: pointer;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
background-color: #f5f5f5;
*background-color: #e6e6e6;
background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
background-image: -webkit-gradient(top, #ffffff, #e6e6e6);
background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
background-image: linear-gradient(top, #ffffff, #e6e6e6);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);
filter: progid: DXImageTransform.Microsoft.gradient(enabled=false);
&:hover, &:active, &[disabled] {
color: #333;
background-color: #e6e6e6;
*background-color: #d9d9d9;
}
>a, >button, >input, >span {
display: inline-block;
*zoom: 1;
margin: 0 -12px !important;
padding: 0 12px !important;
overflow: visible;
width: auto;
height: 24px;
border: 0;
vertical-align: top;
text-decoration: none !important;
line-height: 24px;
font-family: inherit;
font-size: 12px;
color: #333;
cursor: pointer;
background: none;
}
}
input.btn, button.btn {
height: 26px !important;
}
.btn-group {
position: relative;
display: inline-block;
*display: inline;
*margin-left: .3em;
white-space: nowrap;
vertical-align: middle;
font-size: 0;
*zoom: 1;
&:first-child {
*margin-left: 0;
}
&+.btn-group {
margin-left: 5px;
}
>.btn {
position: relative;
-webkit-border-radius: 0;
-moz-border-radius: 0;
border-radius: 0;
&+.btn {
margin-left: -1px;
}
&:first-child {
margin-left: 0;
-webkit-border-bottom-left-radius: 4px;
-moz-border-radius-bottomleft: 4px;
border-bottom-left-radius: 4px;
-webkit-border-top-left-radius: 4px;
-moz-border-radius-topleft: 4px;
border-top-left-radius: 4px;
}
&:last-child {
-webkit-border-top-right-radius: 4px;
-moz-border-radius-topright: 4px;
border-top-right-radius: 4px;
-webkit-border-bottom-right-radius: 4px;
-moz-border-radius-bottomright: 4px;
border-bottom-right-radius: 4px;
}
&:hover, &:focus, &:active, &.active {
z-index: 2;
}
}
}
/* Debug */
#rhymix_debug_button {
display: none;
position: fixed;
left: 0; bottom: 40px;
background: #eeeeee;
background: linear-gradient(to bottom, #f4f4f4 0%, #eaeaea 100%);
border: 1px solid #ccc; border-left: 0;
border-top-right-radius: 4px;
border-bottom-right-radius: 4px;
box-shadow: 0 0 3px 0 rgba(0, 0, 0, 0.18), 0 0 6px 0 rgba(0, 0, 0, 0.12);
z-index: 1073741824;
&:hover {
background: #dddddd;
background: linear-gradient(to bottom, #e8e8e8 0%, #d9d9d9 100%);
}
a {
display: block;
font: bold 12px/14px Arial, sans-serif;
color: #444;
text-decoration: none;
padding: 4px 8px;
&.has_errors {
color: #f44336;
}
}
}
#rhymix_debug_panel {
display: none;
position: fixed;
left: 0; top: 0;
max-width: 100%;
height: 100%;
overflow-y: scroll;
background: #fcfcfc;
box-sizing: border-box;
border-right: 1px solid #ccc;
box-shadow: 0 0 4px 0 rgba(0, 0, 0, 0.18), 0 0 8px 0 rgba(0, 0, 0, 0.12);
z-index: 1073741824;
.debug_header {
clear: both;
width: 100%;
height: 36px;
background: #444444;
background: linear-gradient(to right, #222222 0%, #444444 40%, #eeeeee 100%);
position: relative;
h2 {
font: bold 16px/20px Arial, sans-serif;
color: #fcfcfc;
position: absolute;
left: 10px; top: 10px;
margin: 0; padding: 0;
}
.debug_maximize {
font: normal 20px/24px Arial, sans-serif;
text-decoration: none;
color: #444444;
position: absolute;
right: 32px; top: 6px;
}
.debug_close {
font: normal 28px/28px Arial, sans-serif;
text-decoration: none;
color: #444444;
position: absolute;
right: 10px; top: 4px;
&:hover {
color: #f44336;
}
}
}
.debug_page {
clear: both;
margin: 12px 10px;
font: normal 12px/16px Arial, NanumBarunGothic, NanumGothic, "Malgun Gothic", sans-serif;
.debug_page_header {
padding-bottom: 8px;
border-bottom: 1px solid #ddd;
position: relative;
cursor: pointer;
h3 {
color: #444;
font: inherit;
font-size: 14px;
font-weight: bold;
margin: 0;
padding: 0;
}
}
.debug_page_collapse {
display: block;
position: absolute;
right: 0; top: 0;
color: #999;
font-size: 10px;
line-height: 12px;
text-decoration: none;
padding: 2px 2px;
}
.debug_page_body {
margin: 8px 4px 8px 10px;
h4 {
color: #444;
font: inherit;
font-size: 13px;
font-weight: bold;
margin: 0 0 8px 0;
padding: 0;
}
}
.debug_entry {
font-family: Consolas, "Courier New", monospace;
color: #444;
margin-left: 38px;
margin-bottom: 8px;
text-indent: -28px;
word-wrap: break-word;
word-break: break-all;
&.pre_wrap {
white-space: pre-wrap;
}
ul.debug_metadata {
margin: 0 0 0 -16px; padding: 0;
li {
list-style: disc;
margin: 0; padding: 0; text-indent: 0;
}
}
ul.debug_backtrace {
margin: 4px 0 0 16px; padding: 0;
li {
list-style: disc;
margin: 0; padding: 0; text-indent: 0;
color: #888;
}
}
}
}
}
/* This file is not used after Rhymix 1.9.0. See rhymix.less instead. */

View file

@ -20,10 +20,11 @@ return array(
'190.93.240.0/20',
'197.234.240.0/22',
'198.41.128.0/17',
'199.27.128.0/21',
'2400:cb00::/32',
'2405:8100::/32',
'2405:b500::/32',
'2606:4700::/32',
'2803:f800::/32',
'2c0f:f248::/32',
'2a06:98c0::/29',
);

View file

@ -20,7 +20,9 @@ return array(
'engine' => null,
),
),
'cache' => array(),
'cache' => array(
'truncate_method' => 'delete',
),
'ftp' => array(
'host' => 'localhost',
'port' => 21,
@ -101,6 +103,7 @@ return array(
'og_enabled' => false,
'og_extract_description' => false,
'og_extract_images' => false,
'og_extract_hashtags' => false,
'og_use_timestamps' => false,
),
'mediafilter' => array(

File diff suppressed because it is too large Load diff

View file

@ -2,7 +2,7 @@
/**
* Source: https://xn--3e0bx5euxnjje69i70af08bea817g.xn--3e0b707e/jsp/infoboard/stats/inProCurIpv6Add.jsp
* Last Updated: 2017-06-30
* Last Updated: 2018-03-07
*/
return array (
0 =>
@ -13,7 +13,7 @@ return array (
1 =>
array (
0 => '200102b800000000',
1 => '200102b8ffffffff',
1 => '200102b9ffffffff',
),
2 =>
array (
@ -111,411 +111,421 @@ return array (
1 => '20010f48ffffffff',
),
21 =>
array (
0 => '200144d000000000',
1 => '200144dfffffffff',
),
22 =>
array (
0 => '24009f8000000000',
1 => '24009f80ffffffff',
),
22 =>
23 =>
array (
0 => '2400a58000000000',
1 => '2400a580ffffffff',
),
23 =>
24 =>
array (
0 => '2400ab0000000000',
1 => '2400ab00ffffffff',
),
24 =>
25 =>
array (
0 => '2400cf0000000000',
1 => '2400cf00ffffffff',
),
25 =>
26 =>
array (
0 => '2400fd8000000000',
1 => '2400fd80ffffffff',
),
26 =>
27 =>
array (
0 => '24018ac000000000',
1 => '24018ac0ffffffff',
),
28 =>
array (
0 => '24019ec000000000',
1 => '24019ec0ffffffff',
),
29 =>
array (
0 => '2401a00000000000',
1 => '2401a000ffffffff',
),
27 =>
30 =>
array (
0 => '2401a80000000000',
1 => '2401a800ffffffff',
),
28 =>
31 =>
array (
0 => '2401c50000000000',
1 => '2401c500ffffffff',
),
29 =>
32 =>
array (
0 => '24021a0000000000',
1 => '24021a00ffffffff',
),
30 =>
33 =>
array (
0 => '2402be0000000000',
1 => '2402be00ffffffff',
),
31 =>
34 =>
array (
0 => '2402de0000000000',
1 => '2402de00ffffffff',
),
32 =>
35 =>
array (
0 => '2402f40000000000',
1 => '2402f400ffffffff',
),
33 =>
36 =>
array (
0 => '24033e0000000000',
1 => '24033e00ffffffff',
),
34 =>
37 =>
array (
0 => '24053d0000000000',
1 => '24053d00ffffffff',
),
35 =>
38 =>
array (
0 => '24055f0000000000',
1 => '24055f00ffffffff',
),
36 =>
39 =>
array (
0 => '24057b0000000000',
1 => '24057b00ffffffff',
),
37 =>
40 =>
array (
0 => '2405c00000000000',
1 => '2405c000ffffffff',
),
38 =>
41 =>
array (
0 => '2405d88000000000',
1 => '2405d880ffffffff',
),
39 =>
42 =>
array (
0 => '24066a0000000000',
1 => '24066a00ffffffff',
),
40 =>
43 =>
array (
0 => '2406ad0000000000',
1 => '2406ad00ffffffff',
),
41 =>
44 =>
array (
0 => '2406b00000000000',
1 => '2406b000ffffffff',
),
42 =>
45 =>
array (
0 => '2406d00000000000',
1 => '2406d000ffffffff',
),
43 =>
46 =>
array (
0 => '2406d70000000000',
1 => '2406d700ffffffff',
),
44 =>
47 =>
array (
0 => '24070b0000000000',
1 => '24070b00ffffffff',
),
45 =>
48 =>
array (
0 => '24079b8000000000',
1 => '24079b80ffffffff',
),
46 =>
49 =>
array (
0 => '2407b20000000000',
1 => '2407b200ffffffff',
),
47 =>
50 =>
array (
0 => '2407b80000000000',
1 => '2407b800ffffffff',
),
48 =>
51 =>
array (
0 => '2407c00000000000',
1 => '2407c000ffffffff',
),
49 =>
52 =>
array (
0 => '2407c70000000000',
1 => '2407c700ffffffff',
),
50 =>
array (
0 => '2001000000000000',
1 => '2001000fffffffff',
),
51 =>
53 =>
array (
0 => '2001022000000000',
1 => '20010220ffffffff',
),
52 =>
54 =>
array (
0 => '2001023000000000',
1 => '20010230ffffffff',
),
53 =>
55 =>
array (
0 => '2001027000000000',
1 => '20010270ffffffff',
),
54 =>
56 =>
array (
0 => '2001028000000000',
1 => '20010280ffffffff',
),
55 =>
57 =>
array (
0 => '2001029000000000',
1 => '20010290ffffffff',
),
56 =>
58 =>
array (
0 => '2001032000000000',
1 => '20010320ffffffff',
),
57 =>
59 =>
array (
0 => '2001033000000000',
1 => '20010330ffffffff',
),
58 =>
60 =>
array (
0 => '2001037800000000',
1 => '20010378ffffffff',
),
59 =>
61 =>
array (
0 => '2001039000000000',
1 => '20010390ffffffff',
),
60 =>
62 =>
array (
0 => '2001443000000000',
1 => '20014430ffffffff',
),
61 =>
63 =>
array (
0 => '2400000000000000',
1 => '24000fffffffffff',
),
62 =>
64 =>
array (
0 => '2400180000000000',
1 => '24001800ffffffff',
),
63 =>
65 =>
array (
0 => '2400330000000000',
1 => '24003300ffffffff',
),
64 =>
66 =>
array (
0 => '2400478000000000',
1 => '24004780ffffffff',
),
65 =>
67 =>
array (
0 => '2400498000000000',
1 => '24004980ffffffff',
),
66 =>
68 =>
array (
0 => '2401270000000000',
1 => '24012700ffffffff',
),
67 =>
69 =>
array (
0 => '2401400000000000',
1 => '24014000ffffffff',
),
68 =>
70 =>
array (
0 => '2402000000000000',
1 => '240200ffffffffff',
),
69 =>
71 =>
array (
0 => '2402310000000000',
1 => '24023100ffffffff',
),
70 =>
72 =>
array (
0 => '2402580000000000',
1 => '24025800ffffffff',
),
71 =>
73 =>
array (
0 => '2402610000000000',
1 => '24026100ffffffff',
),
72 =>
74 =>
array (
0 => '2402700000000000',
1 => '24027000ffffffff',
),
73 =>
75 =>
array (
0 => '2403370000000000',
1 => '24033700ffffffff',
),
74 =>
76 =>
array (
0 => '2403630000000000',
1 => '24036300ffffffff',
),
75 =>
77 =>
array (
0 => '2403650000000000',
1 => '24036500ffffffff',
),
76 =>
78 =>
array (
0 => '2404000000000000',
1 => '2404000fffffffff',
0 => '2404018000000000',
1 => '2404018fffffffff',
),
77 =>
79 =>
array (
0 => '2404080000000000',
1 => '24040800ffffffff',
),
78 =>
80 =>
array (
0 => '2404230000000000',
1 => '24042300ffffffff',
),
79 =>
81 =>
array (
0 => '2404460000000000',
1 => '24044600ffffffff',
),
80 =>
82 =>
array (
0 => '2405350000000000',
1 => '24053500ffffffff',
),
81 =>
83 =>
array (
0 => '2405430000000000',
1 => '24054300ffffffff',
),
82 =>
84 =>
array (
0 => '2405580000000000',
1 => '24055800ffffffff',
),
83 =>
85 =>
array (
0 => '2405860000000000',
1 => '24058600ffffffff',
),
84 =>
86 =>
array (
0 => '2405950000000000',
1 => '24059500ffffffff',
),
85 =>
87 =>
array (
0 => '2406400000000000',
1 => '24064000ffffffff',
),
86 =>
88 =>
array (
0 => '2406590000000000',
1 => '24065900ffffffff',
),
87 =>
89 =>
array (
0 => '2406660000000000',
1 => '24066600ffffffff',
),
88 =>
90 =>
array (
0 => '2406680000000000',
1 => '24066800ffffffff',
),
89 =>
91 =>
array (
0 => '2407200000000000',
1 => '24072000ffffffff',
),
90 =>
92 =>
array (
0 => '2407350000000000',
1 => '24073500ffffffff',
),
91 =>
93 =>
array (
0 => '2407508000000000',
1 => '24075080ffffffff',
),
92 =>
94 =>
array (
0 => '2407518000000000',
1 => '24075180ffffffff',
),
93 =>
95 =>
array (
0 => '2407650000000000',
1 => '24076500ffffffff',
),
94 =>
96 =>
array (
0 => '2407670000000000',
1 => '24076700ffffffff',
),
95 =>
97 =>
array (
0 => '2407910000000000',
1 => '24079100ffffffff',
),
96 =>
98 =>
array (
0 => '20010e6000000000',
1 => '20010e60ffffffff',
),
97 =>
99 =>
array (
0 => '20010e7000000000',
1 => '20010e70ffffffff',
),
98 =>
100 =>
array (
0 => '20010e7800000000',
1 => '20010e78ffffffff',
),
99 =>
101 =>
array (
0 => '20010e9800000000',
1 => '20010e98ffffffff',
),
100 =>
102 =>
array (
0 => '24009e8000000000',
1 => '24009e80ffffffff',
),
101 =>
103 =>
array (
0 => '2400e18000000000',
1 => '2400e180ffffffff',
),
102 =>
104 =>
array (
0 => '2401e20000000000',
1 => '2401e200ffffffff',

View file

@ -18,4 +18,5 @@ return array(
'ru' => array('name' => 'Русский', 'locale' => 'ru_RU'),
'tr' => array('name' => 'Türkçe', 'locale' => 'tr_TR'),
'vi' => array('name' => 'Tiếng Việt', 'locale' => 'vi_VN'),
'id' => array('name' => 'Bahasa Indonesia', 'locale' => 'id_ID'),
);

View file

@ -10,6 +10,7 @@ class Debug
/**
* Store log entries here.
*/
protected static $_enabled = true;
protected static $_aliases = array();
protected static $_entries = array();
protected static $_errors = array();
@ -22,6 +23,26 @@ class Debug
protected static $_remote_requests = array();
protected static $_slow_remote_requests = array();
/**
* Enable log collection.
*
* @return void
*/
public static function enable()
{
self::$_enabled = true;
}
/**
* Disable log collection.
*
* @return void
*/
public static function disable()
{
self::$_enabled = false;
}
/**
* Get all entries.
*
@ -32,6 +53,16 @@ class Debug
return self::$_entries;
}
/**
* Clear all entries.
*
* @return void
*/
public static function clearEntries()
{
self::$_entries = array();
}
/**
* Get all errors.
*
@ -42,6 +73,16 @@ class Debug
return self::$_errors;
}
/**
* Clear all errors.
*
* @return void
*/
public static function clearErrors()
{
self::$_errors = array();
}
/**
* Get all queries.
*
@ -62,6 +103,17 @@ class Debug
return self::$_slow_queries;
}
/**
* Clear all queries.
*
* @return void
*/
public static function clearQueries()
{
self::$_queries = array();
self::$_slow_queries = array();
}
/**
* Get all triggers.
*
@ -82,6 +134,17 @@ class Debug
return self::$_slow_triggers;
}
/**
* Clear all triggers.
*
* @return void
*/
public static function clearTriggers()
{
self::$_triggers = array();
self::$_slow_triggers = array();
}
/**
* Get all widgets.
*
@ -102,6 +165,17 @@ class Debug
return self::$_slow_widgets;
}
/**
* Clear all widgets.
*
* @return void
*/
public static function clearWidgets()
{
self::$_widgets = array();
self::$_slow_widgets = array();
}
/**
* Get all remote requests.
*
@ -122,6 +196,36 @@ class Debug
return self::$_slow_remote_requests;
}
/**
* Clear all remote requests.
*
* @return void
*/
public static function clearRemoteRequests()
{
self::$_remote_requests = array();
self::$_slow_remote_requests = array();
}
/**
* Clear all records.
*
* @return void
*/
public static function clearAll()
{
self::$_entries = array();
self::$_errors = array();
self::$_queries = array();
self::$_slow_queries = array();
self::$_triggers = array();
self::$_slow_triggers = array();
self::$_widgets = array();
self::$_slow_widgets = array();
self::$_remote_requests = array();
self::$_slow_remote_requests = array();
}
/**
* Add a filename alias.
*
@ -142,6 +246,12 @@ class Debug
*/
public static function addEntry($message)
{
// Do not store log if disabled.
if (!self::$_enabled)
{
return;
}
// Get the backtrace.
$backtrace = debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS);
if (count($backtrace) > 1 && $backtrace[1]['function'] === 'debugPrint' && !$backtrace[1]['class'])
@ -181,6 +291,12 @@ class Debug
*/
public static function addError($errno, $errstr, $errfile, $errline, $errcontext)
{
// Do not store log if disabled.
if (!self::$_enabled)
{
return;
}
// Do not handle error types that we were told to ignore.
if (!($errno & error_reporting()))
{
@ -224,6 +340,13 @@ class Debug
*/
public static function addQuery($query)
{
// Do not store log if disabled.
if (!self::$_enabled)
{
return;
}
// Prepare the log entry.
$query_object = (object)array(
'type' => 'Query',
'time' => microtime(true),
@ -276,6 +399,13 @@ class Debug
*/
public static function addTrigger($trigger)
{
// Do not store log if disabled.
if (!self::$_enabled)
{
return;
}
// Prepare the log entry.
$trigger_object = (object)array(
'type' => 'Trigger',
'time' => microtime(true),
@ -303,6 +433,13 @@ class Debug
*/
public static function addWidget($widget)
{
// Do not store log if disabled.
if (!self::$_enabled)
{
return;
}
// Prepare the log entry.
$widget_object = (object)array(
'type' => 'Widget',
'time' => microtime(true),
@ -328,6 +465,13 @@ class Debug
*/
public static function addRemoteRequest($request)
{
// Do not store log if disabled.
if (!self::$_enabled)
{
return;
}
// Prepare the log entry.
$request_object = (object)array(
'type' => 'Remote Request',
'time' => microtime(true),

View file

@ -10,7 +10,7 @@ class Woorimail extends Base implements \Rhymix\Framework\Drivers\MailInterface
/**
* The API URL.
*/
protected static $_url = 'https://woorimail.com:20080/index.php';
protected static $_url = 'https://woorimail.com/index.php';
/**
* Error codes and messages.
@ -104,7 +104,7 @@ class Woorimail extends Base implements \Rhymix\Framework\Drivers\MailInterface
'sender_nickname' => '',
'receiver_email' => array(),
'receiver_nickname' => array(),
'member_regdate' => date('YmdHis'),
'member_regdate' => array(),
'domain' => $this->_config['api_domain'],
'authkey' => $this->_config['api_token'],
'wms_domain' => 'woorimail.com',
@ -163,6 +163,7 @@ class Woorimail extends Base implements \Rhymix\Framework\Drivers\MailInterface
$data['receiver_nickname'][] = str_replace(',', '', trim($name) ?: substr($email, 0, strpos($email, '@')));
}
}
$data['member_regdate'] = implode(',', array_fill(0, count($data['receiver_email']), date('YmdHis')));
$data['receiver_email'] = implode(',', $data['receiver_email']);
$data['receiver_nickname'] = implode(',', $data['receiver_nickname']);

View file

@ -24,7 +24,7 @@ class MediaFilter
*/
public static function addIframePrefix($prefix, $permanently = false)
{
if (!count(self::$_iframe_whitelist))
if (!self::$_iframe_whitelist)
{
self::_loadWhitelists();
}
@ -52,7 +52,7 @@ class MediaFilter
*/
public static function addObjectPrefix($prefix, $permanently = false)
{
if (!count(self::$_object_whitelist))
if (!self::$_object_whitelist)
{
self::_loadWhitelists();
}
@ -94,7 +94,7 @@ class MediaFilter
*/
public static function getIframeWhitelist()
{
if (!count(self::$_iframe_whitelist))
if (!self::$_iframe_whitelist)
{
self::_loadWhitelists();
}
@ -108,7 +108,7 @@ class MediaFilter
*/
public static function getIframeWhitelistRegex()
{
if (!count(self::$_iframe_whitelist))
if (!self::$_iframe_whitelist)
{
self::_loadWhitelists();
}
@ -127,7 +127,7 @@ class MediaFilter
*/
public static function getObjectWhitelist()
{
if (!count(self::$_object_whitelist))
if (!self::$_object_whitelist)
{
self::_loadWhitelists();
}
@ -141,7 +141,7 @@ class MediaFilter
*/
public static function getObjectWhitelistRegex()
{
if (!count(self::$_object_whitelist))
if (!self::$_object_whitelist)
{
self::_loadWhitelists();
}

View file

@ -104,7 +104,7 @@ class ConfigParser
$config['db']['master']['engine'] = 'myisam';
}
if (isset($db_info->slave_db) && count($db_info->slave_db))
if (isset($db_info->slave_db) && is_array($db_info->slave_db) && count($db_info->slave_db))
{
foreach ($db_info->slave_db as $slave_id => $slave_db)
{

View file

@ -111,7 +111,7 @@ class LangParser
foreach ($items as $item)
{
$name = strval($item['name']);
if (count($item->item))
if (@count($item->item))
{
$lang[$name] = array();
self::_toArray($item->item, $lang[$name], $language);

View file

@ -166,35 +166,47 @@ class Security
// Cap entropy to 256 bits from any one source, because anything more is meaningless.
$entropy_capped_bytes = min(32, $entropy_required_bytes);
$entropy = false;
// Find and use the most secure way to generate a random string.
$entropy = false;
$is_windows = (defined('\PHP_OS') && strtoupper(substr(\PHP_OS, 0, 3)) === 'WIN');
if(function_exists('random_bytes')) // PHP 7
if(function_exists('random_bytes'))
{
$entropy = random_bytes($entropy_capped_bytes);
}
elseif(function_exists('openssl_random_pseudo_bytes'))
{
$entropy = openssl_random_pseudo_bytes($entropy_capped_bytes);
}
elseif(function_exists('mcrypt_create_iv') && !$is_windows)
{
$entropy = mcrypt_create_iv($entropy_capped_bytes, \MCRYPT_DEV_URANDOM);
}
elseif(function_exists('mcrypt_create_iv') && $is_windows)
{
$entropy = mcrypt_create_iv($entropy_capped_bytes, \MCRYPT_RAND);
}
elseif(!$is_windows && @is_readable('/dev/urandom'))
{
$fp = fopen('/dev/urandom', 'rb');
if (function_exists('stream_set_read_buffer')) // This function does not exist in HHVM.
try
{
stream_set_read_buffer($fp, 0); // Prevent reading several KB of unnecessary data from urandom.
$entropy = random_bytes($entropy_capped_bytes);
}
catch (\Exception $e)
{
$entropy = false;
}
}
// Use other good sources of entropy if random_bytes() is not available.
if ($entropy === false)
{
$is_windows = (defined('\PHP_OS') && strtoupper(substr(\PHP_OS, 0, 3)) === 'WIN');
if(function_exists('openssl_random_pseudo_bytes'))
{
$entropy = openssl_random_pseudo_bytes($entropy_capped_bytes);
}
elseif(function_exists('mcrypt_create_iv') && !$is_windows)
{
$entropy = mcrypt_create_iv($entropy_capped_bytes, \MCRYPT_DEV_URANDOM);
}
elseif(function_exists('mcrypt_create_iv') && $is_windows)
{
$entropy = mcrypt_create_iv($entropy_capped_bytes, \MCRYPT_RAND);
}
elseif(!$is_windows && @is_readable('/dev/urandom'))
{
$fp = fopen('/dev/urandom', 'rb');
if (function_exists('stream_set_read_buffer')) // This function does not exist in HHVM.
{
stream_set_read_buffer($fp, 0); // Prevent reading several KB of unnecessary data from urandom.
}
$entropy = fread($fp, $entropy_capped_bytes);
fclose($fp);
}
$entropy = fread($fp, $entropy_capped_bytes);
fclose($fp);
}
// Use built-in source of entropy if an error occurs while using other functions.

View file

@ -240,7 +240,7 @@ class Session
}
// Start the session if it contains data.
if ($force || (count($_SESSION) && !headers_sent()))
if ($force || (@count($_SESSION) && !headers_sent()))
{
// Copy session data to a temporary array.
$temp = $_SESSION;

View file

@ -17,6 +17,16 @@ class Storage
*/
protected static $_umask;
/**
* Cache the opcache status here.
*/
protected static $_opcache;
/**
* Cache locks here.
*/
protected static $_locks = array();
/**
* Check if a path really exists.
*
@ -297,7 +307,11 @@ class Storage
$filename = $original_filename;
}
if (function_exists('opcache_invalidate') && substr($filename, -4) === '.php')
if (self::$_opcache === null)
{
self::$_opcache = function_exists('opcache_invalidate');
}
if (self::$_opcache && substr($filename, -4) === '.php')
{
@opcache_invalidate($filename, true);
}
@ -410,7 +424,11 @@ class Storage
$destination = $original_destination;
}
if (function_exists('opcache_invalidate') && substr($destination, -4) === '.php')
if (self::$_opcache === null)
{
self::$_opcache = function_exists('opcache_invalidate');
}
if (self::$_opcache && substr($destination, -4) === '.php')
{
@opcache_invalidate($destination, true);
}
@ -461,7 +479,11 @@ class Storage
@chmod($destination, 0666 & ~self::getUmask());
}
if (function_exists('opcache_invalidate'))
if (self::$_opcache === null)
{
self::$_opcache = function_exists('opcache_invalidate');
}
if (self::$_opcache)
{
if (substr($source, -4) === '.php')
{
@ -500,7 +522,11 @@ class Storage
trigger_error('Cannot delete file: ' . $filename, \E_USER_WARNING);
}
if (function_exists('opcache_invalidate') && substr($filename, -4) === '.php')
if (self::$_opcache === null)
{
self::$_opcache = function_exists('opcache_invalidate');
}
if (self::$_opcache && substr($filename, -4) === '.php')
{
@opcache_invalidate($filename, true);
}
@ -837,4 +863,58 @@ class Storage
}
}
}
/**
* Obtain an exclusive lock.
*
* @return bool
*/
public static function getLock($name)
{
$name = str_replace('.', '%2E', rawurlencode($name));
if (isset(self::$_locks[$name]))
{
return false;
}
$lockdir = \RX_BASEDIR . 'files/locks';
if (!self::isDirectory($lockdir) && !self::createDirectory($lockdir))
{
return false;
}
self::$_locks[$name] = @fopen($lockdir . '/' . $name . '.lock', 'w');
if (!self::$_locks[$name])
{
unset(self::$_locks[$name]);
return false;
}
$result = @flock(self::$_locks[$name], \LOCK_EX | \LOCK_NB);
if (!$result)
{
@fclose(self::$_locks[$name]);
unset(self::$_locks[$name]);
return false;
}
register_shutdown_function('\\Rhymix\\Framework\\Storage::clearLocks');
return true;
}
/**
* Clear all locks.
*
* @return void
*/
public static function clearLocks()
{
foreach (self::$_locks as $name => $lock)
{
@flock($lock, \LOCK_UN);
@fclose($lock);
@unlink(\RX_BASEDIR . 'files/locks/' . $name . '.lock');
unset(self::$_locks[$name]);
}
}
}

View file

@ -146,7 +146,7 @@ class UA
}
// Look for common search engine names and the 'bot' keyword.
if (preg_match('/bot|slurp|facebook(externalhit|scraper)|ia_archiver|ask jeeves|teoma|baidu|daumoa|lycos|pingdom/i', $ua))
if (preg_match('/bot|spider|crawler|archiver|wget|curl|php|slurp|wordpress|facebook|teoma|yeti|daum|[(<+]https?:|@/i', $ua))
{
return self::$_robot_cache[$ua] = true;
}

View file

@ -38,7 +38,7 @@ class URL
public static function getCurrentDomainURL($path = '/')
{
$proto = \RX_SSL ? 'https://' : 'http://';
$host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'localhost';
$host = isset($_SERVER['HTTP_HOST']) ? self::decodeIdna($_SERVER['HTTP_HOST']) : 'localhost';
return $proto . $host . '/' . ltrim($path, '/');
}

View file

@ -33,8 +33,18 @@
* @brief Check if two URLs belong to the same origin
*/
window.isSameOrigin = function(url1, url2) {
url1 = window.XE.URI(url1).normalizePort().normalizePathname().origin();
url2 = window.XE.URI(url1).normalizePort().normalizePathname().origin();
if(!url1 || !url2) {
return false;
}
if (url1.match(/^\.?\/[^\/]*/) || url2.match(/^\.?\/[^\/]*/)) {
return true;
}
if (url1.match(/^(https?:)?\/\/[^\/]*[^a-z0-9\/.:_-]/i) || url2.match(/^(https?:)?\/\/[^\/]*[^a-z0-9\/.:_-]/i)) {
return false;
}
url1 = window.XE.URI(url1).normalizePort().normalizeHostname().normalizePathname().origin();
url2 = window.XE.URI(url2).normalizePort().normalizeHostname().normalizePathname().origin();
return (url1 === url2) ? true : false;
};
@ -202,19 +212,19 @@
if (typeof url !== "string") {
return false;
}
if (url.match(/^\/[^\/]/)) {
if (url.match(/^\.?\/[^\/]/)) {
return true;
}
if (url.match(/^\w+:[^\/]*$/)) {
if (url.match(/^\w+:[^\/]*$/) || url.match(/^(https?:)?\/\/[^\/]*[^a-z0-9\/.:_-]/i)) {
return false;
}
if (!window.XE.baseurl) {
window.XE.baseurl = window.XE.URI(window.request_uri).normalizePort().normalizePathname();
window.XE.baseurl = window.XE.URI(window.request_uri).normalizePort().normalizeHostname().normalizePathname();
window.XE.baseurl = window.XE.baseurl.hostname() + window.XE.baseurl.directory();
}
var target_url = window.XE.URI(url).normalizePort().normalizePathname();
var target_url = window.XE.URI(url).normalizePort().normalizeHostname().normalizePathname();
if (target_url.is("urn")) {
return false;
}
@ -242,8 +252,8 @@ jQuery(function($) {
/* Tabnapping protection, step 1 */
$('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 (!href || !target || target === '_top' || target === '_self' || target === '_parent') {
return;
}
@ -259,8 +269,8 @@ jQuery(function($) {
/* Tabnapping protection, step 2 */
$('body').on('click', 'a[target]', function(event) {
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 (!href || !target || target === '_top' || target === '_self' || target === '_parent') {
return;
}
@ -275,6 +285,25 @@ jQuery(function($) {
}
});
/* Editor preview replacement */
$(".editable_preview").addClass("xe_content").attr("tabindex", 0);
$(".editable_preview").on("click", function() {
var input = $(this).siblings(".editable_preview_content");
if (input.size()) {
$(this).off("click").off("focus").hide();
input = input.first();
if (input.attr("type") !== "hidden") {
input.hide();
}
var iframe = $('<iframe class="editable_preview_iframe"></iframe>');
iframe.attr("src", current_url.setQuery("module", "editor").setQuery("act", "dispEditorFrame").setQuery("parent_input_id", input.attr("id")).replace(/^https?:/, ''));
iframe.insertAfter(input);
}
});
$(".editable_preview").on("focus", function() {
$(this).triggerHandler("click");
});
/* select - option의 disabled=disabled 속성을 IE에서도 체크하기 위한 함수 */
if(navigator.userAgent.match(/MSIE/)) {
$('select').each(function(i, sels) {

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

5
common/js/jquery-1.12.4.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

4
common/js/jquery-2.2.4.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,38 @@
/**
* @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*/
/**
* @fileOverview The "divarea" plugin. It registers the "wysiwyg" editing
* mode using a DIV element.
*/
CKEDITOR.plugins.add( 'divarea', {
afterInit: function( editor ) {
// Add the "wysiwyg" mode.
// Do that in the afterInit function, so it'll eventually overwrite
// the mode defined by the wysiwygarea plugin.
editor.addMode( 'wysiwyg', function( callback ) {
var editingBlock = CKEDITOR.dom.element.createFromHtml(
'<div class="cke_wysiwyg_div cke_reset cke_enable_context_menu" hidefocus="true"></div>'
);
var contentSpace = editor.ui.space( 'contents' );
contentSpace.append( editingBlock );
editingBlock = editor.editable( editingBlock );
editingBlock.detach = CKEDITOR.tools.override( editingBlock.detach,
function( org ) {
return function() {
org.apply( this, arguments );
this.remove();
};
} );
editor.setData( editor.getData( 1 ), callback );
editor.fire( 'contentDom' );
} );
}
} );

View file

@ -0,0 +1,24 @@
/**
* iOS enter key fix for IME
*
* https://github.com/rhymix/rhymix/issues/932
*/
CKEDITOR.plugins.add( 'ios_enterkey',
{
icons: 'ios_enterkey',
init: function(editor)
{
editor.on('contentDom', function()
{
var editable = editor.editable();
editable.attachListener(editable, 'keyup', function(e)
{
if(e.data.getKey() === 13)
{
$(editor.document.$).find('.cke_wysiwyg_div').blur();
$(editor.document.$).find('.cke_wysiwyg_div').focus();
}
});
});
}
});

View file

@ -75,10 +75,10 @@
url: request_uri,
formData: defaultFormData,
dropZone: $container,
add: function(e, d) {
add: function(e, item) {
var dfd = jQuery.Deferred();
$.each(d.files, function(index, file) {
$.each(item.files, function(index, file) {
if(data.settings.maxFileSize > 0 && data.settings.maxFileSize < file.size) {
dfd.reject();
alert(window.xe.msg_exceeds_limit_size);
@ -88,15 +88,15 @@
});
dfd.done(function(){
d.submit();
item.submit();
});
},
submit: function(e, data) {
data.formData = defaultFormData;
data.formData.nonce = "T" + new Date().getTime() + "." + Math.random();
submit: function(e, item) {
item.formData = defaultFormData;
item.formData.nonce = "T" + new Date().getTime() + "." + Math.random();
chunkStatus = true;
},
chunksend: function(e, data) {
chunksend: function(e, res) {
if (!chunkStatus) {
return false;
}
@ -116,9 +116,9 @@
return chunkStatus = false;
}
},
chunkfail: function(e, data) {
chunkfail: function(e, res) {
if (chunkStatus) {
alert(window.xe.msg_file_upload_error + " (Type 3)" + "<br>\n" + data.errorThrown + "<br>\n" + data.textStatus);
alert(window.xe.msg_file_upload_error + " (Type 3)" + "<br>\n" + res.errorThrown + "<br>\n" + res.textStatus);
return chunkStatus = false;
}
},
@ -158,11 +158,11 @@
return false;
}
},
fail: function(e, data) {
fail: function(e, res) {
data.settings.progressbar.delay(1000).slideUp();
data.settings.progressStatus.delay(1000).slideUp();
if (chunkStatus) {
alert(window.xe.msg_file_upload_error + " (Type 7)" + "<br>\n" + data.errorThrown + "<br>\n" + data.textStatus);
alert(window.xe.msg_file_upload_error + " (Type 7)" + "<br>\n" + res.errorThrown + "<br>\n" + res.textStatus);
return false;
}
},
@ -174,8 +174,8 @@
data.settings.progressStatus.show();
data.settings.progressbar.show();
},
progressall: function (e, d) {
var progress = Math.round(d.loaded / d.total * 999) / 10;
progressall: function (e, res) {
var progress = Math.round(res.loaded / res.total * 999) / 10;
data.settings.progressbarGraph.width(progress+'%');
data.settings.progressPercent.text(progress+'%');
}

File diff suppressed because one or more lines are too long

View file

@ -1,13 +1,15 @@
/*!
* jQuery Migrate - v1.2.1 - 2013-05-08
* https://github.com/jquery/jquery-migrate
* Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors; Licensed MIT
* jQuery Migrate - v1.4.1 - 2016-05-19
* Copyright jQuery Foundation and other contributors
*/
(function( jQuery, window, undefined ) {
// See http://bugs.jquery.com/ticket/13335
// "use strict";
jQuery.migrateVersion = "1.4.1";
var warnedAbout = {};
// List of warnings already given; public read only
@ -17,9 +19,13 @@ jQuery.migrateWarnings = [];
// jQuery.migrateMute = false;
// Show a message on the console so devs know we're active
if ( !jQuery.migrateMute && window.console && window.console.log ) {
window.console.log("JQMIGRATE: Logging is active");
/*
if ( window.console && window.console.log ) {
window.console.log( "JQMIGRATE: Migrate is installed" +
( jQuery.migrateMute ? "" : " with logging active" ) +
", version " + jQuery.migrateVersion );
}
*/
// Set to false to disable traces that appear with warnings
if ( jQuery.migrateTrace === undefined ) {
@ -152,7 +158,7 @@ jQuery.attr = function( elem, name, value, pass ) {
// Warn only for attributes that can remain distinct from their properties post-1.9
if ( ruseDefault.test( lowerName ) ) {
migrateWarn( "jQuery.fn.attr('" + lowerName + "') may use property instead of attribute" );
migrateWarn( "jQuery.fn.attr('" + lowerName + "') might use property instead of attribute" );
}
}
@ -189,46 +195,114 @@ jQuery.attrHooks.value = {
var matched, browser,
oldInit = jQuery.fn.init,
oldFind = jQuery.find,
oldParseJSON = jQuery.parseJSON,
rspaceAngle = /^\s*</,
rattrHashTest = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/,
rattrHashGlob = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g,
// Note: XSS check is done below after string is trimmed
rquickExpr = /^([^<]*)(<[\w\W]+>)([^>]*)$/;
// $(html) "looks like html" rule change
jQuery.fn.init = function( selector, context, rootjQuery ) {
var match;
var match, ret;
if ( selector && typeof selector === "string" && !jQuery.isPlainObject( context ) &&
(match = rquickExpr.exec( jQuery.trim( selector ) )) && match[ 0 ] ) {
// This is an HTML string according to the "old" rules; is it still?
if ( selector.charAt( 0 ) !== "<" ) {
migrateWarn("$(html) HTML strings must start with '<' character");
}
if ( match[ 3 ] ) {
migrateWarn("$(html) HTML text after last tag is ignored");
}
// Consistently reject any HTML-like string starting with a hash (#9521)
// Note that this may break jQuery 1.6.x code that otherwise would work.
if ( match[ 0 ].charAt( 0 ) === "#" ) {
migrateWarn("HTML string cannot start with a '#' character");
jQuery.error("JQMIGRATE: Invalid selector string (XSS)");
}
// Now process using loose rules; let pre-1.8 play too
if ( context && context.context ) {
// jQuery object as context; parseHTML expects a DOM object
context = context.context;
}
if ( jQuery.parseHTML ) {
return oldInit.call( this, jQuery.parseHTML( match[ 2 ], context, true ),
context, rootjQuery );
if ( selector && typeof selector === "string" ) {
if ( !jQuery.isPlainObject( context ) &&
(match = rquickExpr.exec( jQuery.trim( selector ) )) && match[ 0 ] ) {
// This is an HTML string according to the "old" rules; is it still?
if ( !rspaceAngle.test( selector ) ) {
migrateWarn("$(html) HTML strings must start with '<' character");
}
if ( match[ 3 ] ) {
migrateWarn("$(html) HTML text after last tag is ignored");
}
// Consistently reject any HTML-like string starting with a hash (gh-9521)
// Note that this may break jQuery 1.6.x code that otherwise would work.
if ( match[ 0 ].charAt( 0 ) === "#" ) {
migrateWarn("HTML string cannot start with a '#' character");
jQuery.error("JQMIGRATE: Invalid selector string (XSS)");
}
// Now process using loose rules; let pre-1.8 play too
// Is this a jQuery context? parseHTML expects a DOM element (#178)
if ( context && context.context && context.context.nodeType ) {
context = context.context;
}
if ( jQuery.parseHTML ) {
return oldInit.call( this,
jQuery.parseHTML( match[ 2 ], context && context.ownerDocument ||
context || document, true ), context, rootjQuery );
}
}
}
return oldInit.apply( this, arguments );
ret = oldInit.apply( this, arguments );
// Fill in selector and context properties so .live() works
if ( selector && selector.selector !== undefined ) {
// A jQuery object, copy its properties
ret.selector = selector.selector;
ret.context = selector.context;
} else {
ret.selector = typeof selector === "string" ? selector : "";
if ( selector ) {
ret.context = selector.nodeType? selector : context || document;
}
}
return ret;
};
jQuery.fn.init.prototype = jQuery.fn;
jQuery.find = function( selector ) {
var args = Array.prototype.slice.call( arguments );
// Support: PhantomJS 1.x
// String#match fails to match when used with a //g RegExp, only on some strings
if ( typeof selector === "string" && rattrHashTest.test( selector ) ) {
// The nonstandard and undocumented unquoted-hash was removed in jQuery 1.12.0
// First see if qS thinks it's a valid selector, if so avoid a false positive
try {
document.querySelector( selector );
} catch ( err1 ) {
// Didn't *look* valid to qSA, warn and try quoting what we think is the value
selector = selector.replace( rattrHashGlob, function( _, attr, op, value ) {
return "[" + attr + op + "\"" + value + "\"]";
} );
// If the regexp *may* have created an invalid selector, don't update it
// Note that there may be false alarms if selector uses jQuery extensions
try {
document.querySelector( selector );
migrateWarn( "Attribute selector with '#' must be quoted: " + args[ 0 ] );
args[ 0 ] = selector;
} catch ( err2 ) {
migrateWarn( "Attribute selector with '#' was not fixed: " + args[ 0 ] );
}
}
}
return oldFind.apply( this, args );
};
// Copy properties attached to original jQuery.find method (e.g. .attr, .isXML)
var findProp;
for ( findProp in oldFind ) {
if ( Object.prototype.hasOwnProperty.call( oldFind, findProp ) ) {
jQuery.find[ findProp ] = oldFind[ findProp ];
}
}
// Let $.parseJSON(falsy_value) return null
jQuery.parseJSON = function( json ) {
if ( !json && json !== null ) {
if ( !json ) {
migrateWarn("jQuery.parseJSON requires a valid JSON string");
return null;
}
@ -274,6 +348,11 @@ if ( !jQuery.browser ) {
// Warn if the code tries to get jQuery.browser
migrateWarnProp( jQuery, "browser", jQuery.browser, "jQuery.browser is deprecated" );
// jQuery.boxModel deprecated in 1.3, jQuery.support.boxModel deprecated in 1.7
jQuery.boxModel = jQuery.support.boxModel = (document.compatMode === "CSS1Compat");
migrateWarnProp( jQuery, "boxModel", jQuery.boxModel, "jQuery.boxModel is deprecated" );
migrateWarnProp( jQuery.support, "boxModel", jQuery.support.boxModel, "jQuery.support.boxModel is deprecated" );
jQuery.sub = function() {
function jQuerySub( selector, context ) {
return new jQuerySub.fn.init( selector, context );
@ -284,11 +363,10 @@ jQuery.sub = function() {
jQuerySub.fn.constructor = jQuerySub;
jQuerySub.sub = this.sub;
jQuerySub.fn.init = function init( selector, context ) {
if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
context = jQuerySub( context );
}
return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
var instance = jQuery.fn.init.call( this, selector, context, rootjQuerySub );
return instance instanceof jQuerySub ?
instance :
jQuerySub( instance );
};
jQuerySub.fn.init.prototype = jQuerySub.fn;
var rootjQuerySub = jQuerySub(document);
@ -296,6 +374,57 @@ jQuery.sub = function() {
return jQuerySub;
};
// The number of elements contained in the matched element set
jQuery.fn.size = function() {
migrateWarn( "jQuery.fn.size() is deprecated; use the .length property" );
return this.length;
};
var internalSwapCall = false;
// If this version of jQuery has .swap(), don't false-alarm on internal uses
if ( jQuery.swap ) {
jQuery.each( [ "height", "width", "reliableMarginRight" ], function( _, name ) {
var oldHook = jQuery.cssHooks[ name ] && jQuery.cssHooks[ name ].get;
if ( oldHook ) {
jQuery.cssHooks[ name ].get = function() {
var ret;
internalSwapCall = true;
ret = oldHook.apply( this, arguments );
internalSwapCall = false;
return ret;
};
}
});
}
jQuery.swap = function( elem, options, callback, args ) {
var ret, name,
old = {};
if ( !internalSwapCall ) {
migrateWarn( "jQuery.swap() is undocumented and deprecated" );
}
// Remember the old values, and insert the new ones
for ( name in options ) {
old[ name ] = elem.style[ name ];
elem.style[ name ] = options[ name ];
}
ret = callback.apply( elem, args || [] );
// Revert the old values
for ( name in options ) {
elem.style[ name ] = old[ name ];
}
return ret;
};
// Ensure that $.ajax gets the new parseJSON defined in core.js
jQuery.ajaxSetup({
@ -324,13 +453,7 @@ jQuery.fn.data = function( name ) {
};
var rscriptType = /\/(java|ecma)script/i,
oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack;
jQuery.fn.andSelf = function() {
migrateWarn("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()");
return oldSelf.apply( this, arguments );
};
var rscriptType = /\/(java|ecma)script/i;
// Since jQuery.clean is used internally on older versions, we only shim if it's missing
if ( !jQuery.clean ) {
@ -388,6 +511,7 @@ var eventAdd = jQuery.event.add,
oldToggle = jQuery.fn.toggle,
oldLive = jQuery.fn.live,
oldDie = jQuery.fn.die,
oldLoad = jQuery.fn.load,
ajaxEvents = "ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",
rajaxEvent = new RegExp( "\\b(?:" + ajaxEvents + ")\\b" ),
rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
@ -422,17 +546,35 @@ jQuery.event.remove = function( elem, types, handler, selector, mappedTypes ){
eventRemove.call( this, elem, hoverHack( types ) || "", handler, selector, mappedTypes );
};
jQuery.fn.error = function() {
var args = Array.prototype.slice.call( arguments, 0);
migrateWarn("jQuery.fn.error() is deprecated");
args.splice( 0, 0, "error" );
if ( arguments.length ) {
return this.bind.apply( this, args );
}
// error event should not bubble to window, although it does pre-1.7
this.triggerHandler.apply( this, args );
return this;
};
jQuery.each( [ "load", "unload", "error" ], function( _, name ) {
jQuery.fn[ name ] = function() {
var args = Array.prototype.slice.call( arguments, 0 );
// If this is an ajax load() the first arg should be the string URL;
// technically this could also be the "Anything" arg of the event .load()
// which just goes to show why this dumb signature has been deprecated!
// jQuery custom builds that exclude the Ajax module justifiably die here.
if ( name === "load" && typeof args[ 0 ] === "string" ) {
return oldLoad.apply( this, args );
}
migrateWarn( "jQuery.fn." + name + "() is deprecated" );
args.splice( 0, 0, name );
if ( arguments.length ) {
return this.bind.apply( this, args );
}
// Use .triggerHandler here because:
// - load and unload events don't need to bubble, only applied to window or image
// - error event should not bubble to window, although it does pre-1.7
// See http://bugs.jquery.com/ticket/11820
this.triggerHandler.apply( this, args );
return this;
};
});
jQuery.fn.toggle = function( fn, fn2 ) {
@ -501,7 +643,7 @@ jQuery.each( ajaxEvents.split("|"),
// The document needs no shimming; must be !== for oldIE
if ( elem !== document ) {
jQuery.event.add( document, name + "." + jQuery.guid, function() {
jQuery.event.trigger( name, null, elem, true );
jQuery.event.trigger( name, Array.prototype.slice.call( arguments, 1 ), elem, true );
});
jQuery._data( this, name, jQuery.guid++ );
}
@ -517,5 +659,96 @@ jQuery.each( ajaxEvents.split("|"),
}
);
jQuery.event.special.ready = {
setup: function() {
if ( this === document ) {
migrateWarn( "'ready' event is deprecated" );
}
}
};
var oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack,
oldFnFind = jQuery.fn.find;
jQuery.fn.andSelf = function() {
migrateWarn("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()");
return oldSelf.apply( this, arguments );
};
jQuery.fn.find = function( selector ) {
var ret = oldFnFind.apply( this, arguments );
ret.context = this.context;
ret.selector = this.selector ? this.selector + " " + selector : selector;
return ret;
};
// jQuery 1.6 did not support Callbacks, do not warn there
if ( jQuery.Callbacks ) {
var oldDeferred = jQuery.Deferred,
tuples = [
// action, add listener, callbacks, .then handlers, final state
[ "resolve", "done", jQuery.Callbacks("once memory"),
jQuery.Callbacks("once memory"), "resolved" ],
[ "reject", "fail", jQuery.Callbacks("once memory"),
jQuery.Callbacks("once memory"), "rejected" ],
[ "notify", "progress", jQuery.Callbacks("memory"),
jQuery.Callbacks("memory") ]
];
jQuery.Deferred = function( func ) {
var deferred = oldDeferred(),
promise = deferred.promise();
deferred.pipe = promise.pipe = function( /* fnDone, fnFail, fnProgress */ ) {
var fns = arguments;
migrateWarn( "deferred.pipe() is deprecated" );
return jQuery.Deferred(function( newDefer ) {
jQuery.each( tuples, function( i, tuple ) {
var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
// deferred.done(function() { bind to newDefer or newDefer.resolve })
// deferred.fail(function() { bind to newDefer or newDefer.reject })
// deferred.progress(function() { bind to newDefer or newDefer.notify })
deferred[ tuple[1] ](function() {
var returned = fn && fn.apply( this, arguments );
if ( returned && jQuery.isFunction( returned.promise ) ) {
returned.promise()
.done( newDefer.resolve )
.fail( newDefer.reject )
.progress( newDefer.notify );
} else {
newDefer[ tuple[ 0 ] + "With" ](
this === promise ? newDefer.promise() : this,
fn ? [ returned ] : arguments
);
}
});
});
fns = null;
}).promise();
};
deferred.isResolved = function() {
migrateWarn( "deferred.isResolved is deprecated" );
return deferred.state() === "resolved";
};
deferred.isRejected = function() {
migrateWarn( "deferred.isRejected is deprecated" );
return deferred.state() === "rejected";
};
if ( func ) {
func.call( deferred, deferred );
}
return deferred;
};
}
})( jQuery, window );

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

Before After
Before After

View file

@ -1,8 +1,8 @@
/*! jQuery UI - v1.11.4 - 2015-03-11
/*! jQuery UI - v1.12.1 - 2016-09-14
* http://jqueryui.com
* Includes: core.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, draggable.css, menu.css, progressbar.css, resizable.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */
* Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
* To view and modify this theme, visit http://jqueryui.com/themeroller/?bgShadowXPos=&bgOverlayXPos=&bgErrorXPos=&bgHighlightXPos=&bgContentXPos=&bgHeaderXPos=&bgActiveXPos=&bgHoverXPos=&bgDefaultXPos=&bgShadowYPos=&bgOverlayYPos=&bgErrorYPos=&bgHighlightYPos=&bgContentYPos=&bgHeaderYPos=&bgActiveYPos=&bgHoverYPos=&bgDefaultYPos=&bgShadowRepeat=&bgOverlayRepeat=&bgErrorRepeat=&bgHighlightRepeat=&bgContentRepeat=&bgHeaderRepeat=&bgActiveRepeat=&bgHoverRepeat=&bgDefaultRepeat=&iconsHover=url(%22images%2Fui-icons_555555_256x240.png%22)&iconsHighlight=url(%22images%2Fui-icons_777620_256x240.png%22)&iconsHeader=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsError=url(%22images%2Fui-icons_cc0000_256x240.png%22)&iconsDefault=url(%22images%2Fui-icons_777777_256x240.png%22)&iconsContent=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsActive=url(%22images%2Fui-icons_ffffff_256x240.png%22)&bgImgUrlShadow=&bgImgUrlOverlay=&bgImgUrlHover=&bgImgUrlHighlight=&bgImgUrlHeader=&bgImgUrlError=&bgImgUrlDefault=&bgImgUrlContent=&bgImgUrlActive=&opacityFilterShadow=Alpha(Opacity%3D30)&opacityFilterOverlay=Alpha(Opacity%3D30)&opacityShadowPerc=30&opacityOverlayPerc=30&iconColorHover=%23555555&iconColorHighlight=%23777620&iconColorHeader=%23444444&iconColorError=%23cc0000&iconColorDefault=%23777777&iconColorContent=%23444444&iconColorActive=%23ffffff&bgImgOpacityShadow=0&bgImgOpacityOverlay=0&bgImgOpacityError=95&bgImgOpacityHighlight=55&bgImgOpacityContent=75&bgImgOpacityHeader=75&bgImgOpacityActive=65&bgImgOpacityHover=75&bgImgOpacityDefault=75&bgTextureShadow=flat&bgTextureOverlay=flat&bgTextureError=flat&bgTextureHighlight=flat&bgTextureContent=flat&bgTextureHeader=flat&bgTextureActive=flat&bgTextureHover=flat&bgTextureDefault=flat&cornerRadius=3px&fwDefault=normal&ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&cornerRadiusShadow=8px&thicknessShadow=5px&offsetLeftShadow=0px&offsetTopShadow=0px&opacityShadow=.3&bgColorShadow=%23666666&opacityOverlay=.3&bgColorOverlay=%23aaaaaa&fcError=%235f3f3f&borderColorError=%23f1a899&bgColorError=%23fddfdf&fcHighlight=%23777620&borderColorHighlight=%23dad55e&bgColorHighlight=%23fffa90&fcContent=%23333333&borderColorContent=%23dddddd&bgColorContent=%23ffffff&fcHeader=%23333333&borderColorHeader=%23dddddd&bgColorHeader=%23e9e9e9&fcActive=%23ffffff&borderColorActive=%23003eff&bgColorActive=%23007fff&fcHover=%232b2b2b&borderColorHover=%23cccccc&bgColorHover=%23ededed&fcDefault=%23454545&borderColorDefault=%23c5c5c5&bgColorDefault=%23f6f6f6
* Copyright jQuery Foundation and other contributors; Licensed MIT */
/* Layout helpers
----------------------------------*/
@ -38,9 +38,6 @@
.ui-helper-clearfix:after {
clear: both;
}
.ui-helper-clearfix {
min-height: 0; /* support: IE7 */
}
.ui-helper-zfix {
width: 100%;
height: 100%;
@ -60,20 +57,27 @@
----------------------------------*/
.ui-state-disabled {
cursor: default !important;
pointer-events: none;
}
/* Icons
----------------------------------*/
/* states and images */
.ui-icon {
display: block;
display: inline-block;
vertical-align: middle;
margin-top: -.25em;
position: relative;
text-indent: -99999px;
overflow: hidden;
background-repeat: no-repeat;
}
.ui-widget-icon-block {
left: 50%;
margin-left: -8px;
display: block;
}
/* Misc visuals
----------------------------------*/
@ -92,21 +96,8 @@
position: relative;
margin: 2px 0 0 0;
padding: .5em .5em .5em .7em;
min-height: 0; /* support: IE7 */
font-size: 100%;
}
.ui-accordion .ui-accordion-icons {
padding-left: 2.2em;
}
.ui-accordion .ui-accordion-icons .ui-accordion-icons {
padding-left: 2.2em;
}
.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
position: absolute;
left: .5em;
top: 50%;
margin-top: -8px;
}
.ui-accordion .ui-accordion-content {
padding: 1em 2.2em;
border-top: 0;
@ -118,17 +109,78 @@
left: 0;
cursor: default;
}
.ui-menu {
list-style: none;
padding: 0;
margin: 0;
display: block;
outline: 0;
}
.ui-menu .ui-menu {
position: absolute;
}
.ui-menu .ui-menu-item {
margin: 0;
cursor: pointer;
/* support: IE10, see #8844 */
list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
}
.ui-menu .ui-menu-item-wrapper {
position: relative;
padding: 3px 1em 3px .4em;
}
.ui-menu .ui-menu-divider {
margin: 5px 0;
height: 0;
font-size: 0;
line-height: 0;
border-width: 1px 0 0 0;
}
.ui-menu .ui-state-focus,
.ui-menu .ui-state-active {
margin: -1px;
}
/* icon support */
.ui-menu-icons {
position: relative;
}
.ui-menu-icons .ui-menu-item-wrapper {
padding-left: 2em;
}
/* left-aligned */
.ui-menu .ui-icon {
position: absolute;
top: 0;
bottom: 0;
left: .2em;
margin: auto 0;
}
/* right-aligned */
.ui-menu .ui-menu-icon {
left: auto;
right: 0;
}
.ui-button {
padding: .4em 1em;
display: inline-block;
position: relative;
padding: 0;
line-height: normal;
margin-right: .1em;
cursor: pointer;
vertical-align: middle;
text-align: center;
overflow: visible; /* removes extra width in IE */
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
/* Support: IE <= 11 */
overflow: visible;
}
.ui-button,
.ui-button:link,
.ui-button:visited,
@ -136,92 +188,130 @@
.ui-button:active {
text-decoration: none;
}
/* to make room for the icon, a width needs to be set here */
.ui-button-icon-only {
width: 2.2em;
}
/* button elements seem to need a little more width */
button.ui-button-icon-only {
width: 2.4em;
}
.ui-button-icons-only {
width: 3.4em;
}
button.ui-button-icons-only {
width: 3.7em;
width: 2em;
box-sizing: border-box;
text-indent: -9999px;
white-space: nowrap;
}
/* button text element */
.ui-button .ui-button-text {
display: block;
line-height: normal;
}
.ui-button-text-only .ui-button-text {
padding: .4em 1em;
}
.ui-button-icon-only .ui-button-text,
.ui-button-icons-only .ui-button-text {
padding: .4em;
text-indent: -9999999px;
}
.ui-button-text-icon-primary .ui-button-text,
.ui-button-text-icons .ui-button-text {
padding: .4em 1em .4em 2.1em;
}
.ui-button-text-icon-secondary .ui-button-text,
.ui-button-text-icons .ui-button-text {
padding: .4em 2.1em .4em 1em;
}
.ui-button-text-icons .ui-button-text {
padding-left: 2.1em;
padding-right: 2.1em;
}
/* no icon support for input elements, provide padding by default */
input.ui-button {
padding: .4em 1em;
/* no icon support for input elements */
input.ui-button.ui-button-icon-only {
text-indent: 0;
}
/* button icon element(s) */
.ui-button-icon-only .ui-icon,
.ui-button-text-icon-primary .ui-icon,
.ui-button-text-icon-secondary .ui-icon,
.ui-button-text-icons .ui-icon,
.ui-button-icons-only .ui-icon {
.ui-button-icon-only .ui-icon {
position: absolute;
top: 50%;
margin-top: -8px;
}
.ui-button-icon-only .ui-icon {
left: 50%;
margin-top: -8px;
margin-left: -8px;
}
.ui-button-text-icon-primary .ui-button-icon-primary,
.ui-button-text-icons .ui-button-icon-primary,
.ui-button-icons-only .ui-button-icon-primary {
left: .5em;
}
.ui-button-text-icon-secondary .ui-button-icon-secondary,
.ui-button-text-icons .ui-button-icon-secondary,
.ui-button-icons-only .ui-button-icon-secondary {
right: .5em;
.ui-button.ui-icon-notext .ui-icon {
padding: 0;
width: 2.1em;
height: 2.1em;
text-indent: -9999px;
white-space: nowrap;
}
/* button sets */
.ui-buttonset {
margin-right: 7px;
}
.ui-buttonset .ui-button {
margin-left: 0;
margin-right: -.3em;
input.ui-button.ui-icon-notext .ui-icon {
width: auto;
height: auto;
text-indent: 0;
white-space: normal;
padding: .4em 1em;
}
/* workarounds */
/* reset extra padding in Firefox, see h5bp.com/l */
/* Support: Firefox 5 - 40 */
input.ui-button::-moz-focus-inner,
button.ui-button::-moz-focus-inner {
border: 0;
padding: 0;
}
.ui-controlgroup {
vertical-align: middle;
display: inline-block;
}
.ui-controlgroup > .ui-controlgroup-item {
float: left;
margin-left: 0;
margin-right: 0;
}
.ui-controlgroup > .ui-controlgroup-item:focus,
.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
z-index: 9999;
}
.ui-controlgroup-vertical > .ui-controlgroup-item {
display: block;
float: none;
width: 100%;
margin-top: 0;
margin-bottom: 0;
text-align: left;
}
.ui-controlgroup-vertical .ui-controlgroup-item {
box-sizing: border-box;
}
.ui-controlgroup .ui-controlgroup-label {
padding: .4em 1em;
}
.ui-controlgroup .ui-controlgroup-label span {
font-size: 80%;
}
.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
border-left: none;
}
.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
border-top: none;
}
.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
border-right: none;
}
.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
border-bottom: none;
}
/* Spinner specific style fixes */
.ui-controlgroup-vertical .ui-spinner-input {
/* Support: IE8 only, Android < 4.4 only */
width: 75%;
width: calc( 100% - 2.4em );
}
.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
border-top-style: solid;
}
.ui-checkboxradio-label .ui-icon-background {
box-shadow: inset 1px 1px 1px #ccc;
border-radius: .12em;
border: none;
}
.ui-checkboxradio-radio-label .ui-icon-background {
width: 16px;
height: 16px;
border-radius: 1em;
overflow: visible;
border: none;
}
.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
background-image: none;
width: 8px;
height: 8px;
border-width: 4px;
border-style: solid;
}
.ui-checkboxradio-disabled {
pointer-events: none;
}
.ui-datepicker {
width: 17em;
padding: .2em .2em 0;
@ -387,8 +477,17 @@ button.ui-button::-moz-focus-inner {
border-right-width: 0;
border-left-width: 1px;
}
.ui-dialog {
/* Icons */
.ui-datepicker .ui-icon {
display: block;
text-indent: -99999px;
overflow: hidden;
background-repeat: no-repeat;
left: .5em;
top: .3em;
}
.ui-dialog {
position: absolute;
top: 0;
left: 0;
@ -437,12 +536,44 @@ button.ui-button::-moz-focus-inner {
margin: .5em .4em .5em 0;
cursor: pointer;
}
.ui-dialog .ui-resizable-n {
height: 2px;
top: 0;
}
.ui-dialog .ui-resizable-e {
width: 2px;
right: 0;
}
.ui-dialog .ui-resizable-s {
height: 2px;
bottom: 0;
}
.ui-dialog .ui-resizable-w {
width: 2px;
left: 0;
}
.ui-dialog .ui-resizable-se,
.ui-dialog .ui-resizable-sw,
.ui-dialog .ui-resizable-ne,
.ui-dialog .ui-resizable-nw {
width: 7px;
height: 7px;
}
.ui-dialog .ui-resizable-se {
width: 12px;
height: 12px;
right: -5px;
bottom: -5px;
background-position: 16px 16px;
right: 0;
bottom: 0;
}
.ui-dialog .ui-resizable-sw {
left: 0;
bottom: 0;
}
.ui-dialog .ui-resizable-ne {
right: 0;
top: 0;
}
.ui-dialog .ui-resizable-nw {
left: 0;
top: 0;
}
.ui-draggable .ui-dialog-titlebar {
cursor: move;
@ -451,77 +582,6 @@ button.ui-button::-moz-focus-inner {
-ms-touch-action: none;
touch-action: none;
}
.ui-menu {
list-style: none;
padding: 0;
margin: 0;
display: block;
outline: none;
}
.ui-menu .ui-menu {
position: absolute;
}
.ui-menu .ui-menu-item {
position: relative;
margin: 0;
padding: 3px 1em 3px .4em;
cursor: pointer;
min-height: 0; /* support: IE7 */
/* support: IE10, see #8844 */
list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
}
.ui-menu .ui-menu-divider {
margin: 5px 0;
height: 0;
font-size: 0;
line-height: 0;
border-width: 1px 0 0 0;
}
.ui-menu .ui-state-focus,
.ui-menu .ui-state-active {
margin: -1px;
}
/* icon support */
.ui-menu-icons {
position: relative;
}
.ui-menu-icons .ui-menu-item {
padding-left: 2em;
}
/* left-aligned */
.ui-menu .ui-icon {
position: absolute;
top: 0;
bottom: 0;
left: .2em;
margin: auto 0;
}
/* right-aligned */
.ui-menu .ui-menu-icon {
left: auto;
right: 0;
}
.ui-progressbar {
height: 2em;
text-align: left;
overflow: hidden;
}
.ui-progressbar .ui-progressbar-value {
margin: -1px;
height: 100%;
}
.ui-progressbar .ui-progressbar-overlay {
background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
height: 100%;
filter: alpha(opacity=25); /* support: IE8 */
opacity: 0.25;
}
.ui-progressbar-indeterminate .ui-progressbar-value {
background-image: none;
}
.ui-resizable {
position: relative;
}
@ -592,6 +652,24 @@ button.ui-button::-moz-focus-inner {
right: -5px;
top: -5px;
}
.ui-progressbar {
height: 2em;
text-align: left;
overflow: hidden;
}
.ui-progressbar .ui-progressbar-value {
margin: -1px;
height: 100%;
}
.ui-progressbar .ui-progressbar-overlay {
background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
height: 100%;
filter: alpha(opacity=25); /* support: IE8 */
opacity: 0.25;
}
.ui-progressbar-indeterminate .ui-progressbar-value {
background-image: none;
}
.ui-selectable {
-ms-touch-action: none;
touch-action: none;
@ -611,7 +689,6 @@ button.ui-button::-moz-focus-inner {
}
.ui-selectmenu-menu .ui-menu {
overflow: auto;
/* Support: IE7 */
overflow-x: hidden;
padding-bottom: 1px;
}
@ -627,28 +704,20 @@ button.ui-button::-moz-focus-inner {
.ui-selectmenu-open {
display: block;
}
.ui-selectmenu-button {
display: inline-block;
overflow: hidden;
position: relative;
text-decoration: none;
cursor: pointer;
}
.ui-selectmenu-button span.ui-icon {
right: 0.5em;
left: auto;
margin-top: -8px;
position: absolute;
top: 50%;
}
.ui-selectmenu-button span.ui-selectmenu-text {
text-align: left;
padding: 0.4em 2.1em 0.4em 1em;
.ui-selectmenu-text {
display: block;
line-height: 1.4;
margin-right: 20px;
overflow: hidden;
text-overflow: ellipsis;
}
.ui-selectmenu-button.ui-button {
text-align: left;
white-space: nowrap;
width: 14em;
}
.ui-selectmenu-icon.ui-icon {
float: right;
margin-top: 0;
}
.ui-slider {
position: relative;
@ -730,14 +799,14 @@ button.ui-button::-moz-focus-inner {
border: none;
background: none;
color: inherit;
padding: 0;
padding: .222em 0;
margin: .2em 0;
vertical-align: middle;
margin-left: .4em;
margin-right: 22px;
margin-right: 2em;
}
.ui-spinner-button {
width: 16px;
width: 1.6em;
height: 50%;
font-size: .5em;
padding: 0;
@ -751,16 +820,9 @@ button.ui-button::-moz-focus-inner {
}
/* more specificity required here to override default borders */
.ui-spinner a.ui-spinner-button {
border-top: none;
border-bottom: none;
border-right: none;
}
/* vertically center icon */
.ui-spinner .ui-icon {
position: absolute;
margin-top: -8px;
top: 50%;
left: 0;
border-top-style: none;
border-bottom-style: none;
border-right-style: none;
}
.ui-spinner-up {
top: 0;
@ -768,12 +830,6 @@ button.ui-button::-moz-focus-inner {
.ui-spinner-down {
bottom: 0;
}
/* TR overrides */
.ui-spinner .ui-icon-triangle-1-s {
/* need to fix icons sprite */
background-position: -65px -16px;
}
.ui-tabs {
position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
padding: .2em;
@ -820,8 +876,6 @@ button.ui-button::-moz-focus-inner {
position: absolute;
z-index: 9999;
max-width: 300px;
-webkit-box-shadow: 0 0 5px #aaa;
box-shadow: 0 0 5px #aaa;
}
body .ui-tooltip {
border-width: 2px;
@ -830,8 +884,8 @@ body .ui-tooltip {
/* Component containers
----------------------------------*/
.ui-widget {
font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
font-size: 1.1em;
font-family: Arial,Helvetica,sans-serif;
font-size: 1em;
}
.ui-widget .ui-widget {
font-size: 1em;
@ -840,41 +894,54 @@ body .ui-tooltip {
.ui-widget select,
.ui-widget textarea,
.ui-widget button {
font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
font-family: Arial,Helvetica,sans-serif;
font-size: 1em;
}
.ui-widget.ui-widget-content {
border: 1px solid #c5c5c5;
}
.ui-widget-content {
border: 1px solid #dddddd;
background: #eeeeee url("images/ui-bg_highlight-soft_100_eeeeee_1x100.png") 50% top repeat-x;
background: #ffffff;
color: #333333;
}
.ui-widget-content a {
color: #333333;
}
.ui-widget-header {
border: 1px solid #e78f08;
background: #f6a828 url("images/ui-bg_gloss-wave_35_f6a828_500x100.png") 50% 50% repeat-x;
color: #ffffff;
border: 1px solid #dddddd;
background: #e9e9e9;
color: #333333;
font-weight: bold;
}
.ui-widget-header a {
color: #ffffff;
color: #333333;
}
/* Interaction states
----------------------------------*/
.ui-state-default,
.ui-widget-content .ui-state-default,
.ui-widget-header .ui-state-default {
border: 1px solid #cccccc;
background: #f6f6f6 url("images/ui-bg_glass_100_f6f6f6_1x400.png") 50% 50% repeat-x;
font-weight: bold;
color: #1c94c4;
.ui-widget-header .ui-state-default,
.ui-button,
/* We use html here because we need a greater specificity to make sure disabled
works properly when clicked or hovered */
html .ui-button.ui-state-disabled:hover,
html .ui-button.ui-state-disabled:active {
border: 1px solid #c5c5c5;
background: #f6f6f6;
font-weight: normal;
color: #454545;
}
.ui-state-default a,
.ui-state-default a:link,
.ui-state-default a:visited {
color: #1c94c4;
.ui-state-default a:visited,
a.ui-button,
a:link.ui-button,
a:visited.ui-button,
.ui-button {
color: #454545;
text-decoration: none;
}
.ui-state-hover,
@ -882,11 +949,13 @@ body .ui-tooltip {
.ui-widget-header .ui-state-hover,
.ui-state-focus,
.ui-widget-content .ui-state-focus,
.ui-widget-header .ui-state-focus {
border: 1px solid #fbcb09;
background: #fdf5ce url("images/ui-bg_glass_100_fdf5ce_1x400.png") 50% 50% repeat-x;
font-weight: bold;
color: #c77405;
.ui-widget-header .ui-state-focus,
.ui-button:hover,
.ui-button:focus {
border: 1px solid #cccccc;
background: #ededed;
font-weight: normal;
color: #2b2b2b;
}
.ui-state-hover a,
.ui-state-hover a:hover,
@ -895,22 +964,36 @@ body .ui-tooltip {
.ui-state-focus a,
.ui-state-focus a:hover,
.ui-state-focus a:link,
.ui-state-focus a:visited {
color: #c77405;
.ui-state-focus a:visited,
a.ui-button:hover,
a.ui-button:focus {
color: #2b2b2b;
text-decoration: none;
}
.ui-visual-focus {
box-shadow: 0 0 3px 1px rgb(94, 158, 214);
}
.ui-state-active,
.ui-widget-content .ui-state-active,
.ui-widget-header .ui-state-active {
border: 1px solid #fbd850;
background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;
font-weight: bold;
color: #eb8f00;
.ui-widget-header .ui-state-active,
a.ui-button:active,
.ui-button:active,
.ui-button.ui-state-active:hover {
border: 1px solid #003eff;
background: #007fff;
font-weight: normal;
color: #ffffff;
}
.ui-icon-background,
.ui-state-active .ui-icon-background {
border: #003eff;
background-color: #ffffff;
}
.ui-state-active a,
.ui-state-active a:link,
.ui-state-active a:visited {
color: #eb8f00;
color: #ffffff;
text-decoration: none;
}
@ -919,31 +1002,35 @@ body .ui-tooltip {
.ui-state-highlight,
.ui-widget-content .ui-state-highlight,
.ui-widget-header .ui-state-highlight {
border: 1px solid #fed22f;
background: #ffe45c url("images/ui-bg_highlight-soft_75_ffe45c_1x100.png") 50% top repeat-x;
color: #363636;
border: 1px solid #dad55e;
background: #fffa90;
color: #777620;
}
.ui-state-checked {
border: 1px solid #dad55e;
background: #fffa90;
}
.ui-state-highlight a,
.ui-widget-content .ui-state-highlight a,
.ui-widget-header .ui-state-highlight a {
color: #363636;
color: #777620;
}
.ui-state-error,
.ui-widget-content .ui-state-error,
.ui-widget-header .ui-state-error {
border: 1px solid #cd0a0a;
background: #b81900 url("images/ui-bg_diagonals-thick_18_b81900_40x40.png") 50% 50% repeat;
color: #ffffff;
border: 1px solid #f1a899;
background: #fddfdf;
color: #5f3f3f;
}
.ui-state-error a,
.ui-widget-content .ui-state-error a,
.ui-widget-header .ui-state-error a {
color: #ffffff;
color: #5f3f3f;
}
.ui-state-error-text,
.ui-widget-content .ui-state-error-text,
.ui-widget-header .ui-state-error-text {
color: #ffffff;
color: #5f3f3f;
}
.ui-priority-primary,
.ui-widget-content .ui-priority-primary,
@ -978,46 +1065,50 @@ body .ui-tooltip {
}
.ui-icon,
.ui-widget-content .ui-icon {
background-image: url("images/ui-icons_222222_256x240.png");
background-image: url("images/ui-icons_444444_256x240.png");
}
.ui-widget-header .ui-icon {
background-image: url("images/ui-icons_ffffff_256x240.png");
}
.ui-state-default .ui-icon {
background-image: url("images/ui-icons_ef8c08_256x240.png");
background-image: url("images/ui-icons_444444_256x240.png");
}
.ui-state-hover .ui-icon,
.ui-state-focus .ui-icon {
background-image: url("images/ui-icons_ef8c08_256x240.png");
.ui-state-focus .ui-icon,
.ui-button:hover .ui-icon,
.ui-button:focus .ui-icon {
background-image: url("images/ui-icons_555555_256x240.png");
}
.ui-state-active .ui-icon {
background-image: url("images/ui-icons_ef8c08_256x240.png");
.ui-state-active .ui-icon,
.ui-button:active .ui-icon {
background-image: url("images/ui-icons_ffffff_256x240.png");
}
.ui-state-highlight .ui-icon {
background-image: url("images/ui-icons_228ef1_256x240.png");
.ui-state-highlight .ui-icon,
.ui-button .ui-state-highlight.ui-icon {
background-image: url("images/ui-icons_777620_256x240.png");
}
.ui-state-error .ui-icon,
.ui-state-error-text .ui-icon {
background-image: url("images/ui-icons_ffd27a_256x240.png");
background-image: url("images/ui-icons_cc0000_256x240.png");
}
.ui-button .ui-icon {
background-image: url("images/ui-icons_777777_256x240.png");
}
/* positioning */
.ui-icon-blank { background-position: 16px 16px; }
.ui-icon-carat-1-n { background-position: 0 0; }
.ui-icon-carat-1-ne { background-position: -16px 0; }
.ui-icon-carat-1-e { background-position: -32px 0; }
.ui-icon-carat-1-se { background-position: -48px 0; }
.ui-icon-carat-1-s { background-position: -64px 0; }
.ui-icon-carat-1-sw { background-position: -80px 0; }
.ui-icon-carat-1-w { background-position: -96px 0; }
.ui-icon-carat-1-nw { background-position: -112px 0; }
.ui-icon-carat-2-n-s { background-position: -128px 0; }
.ui-icon-carat-2-e-w { background-position: -144px 0; }
.ui-icon-caret-1-n { background-position: 0 0; }
.ui-icon-caret-1-ne { background-position: -16px 0; }
.ui-icon-caret-1-e { background-position: -32px 0; }
.ui-icon-caret-1-se { background-position: -48px 0; }
.ui-icon-caret-1-s { background-position: -65px 0; }
.ui-icon-caret-1-sw { background-position: -80px 0; }
.ui-icon-caret-1-w { background-position: -96px 0; }
.ui-icon-caret-1-nw { background-position: -112px 0; }
.ui-icon-caret-2-n-s { background-position: -128px 0; }
.ui-icon-caret-2-e-w { background-position: -144px 0; }
.ui-icon-triangle-1-n { background-position: 0 -16px; }
.ui-icon-triangle-1-ne { background-position: -16px -16px; }
.ui-icon-triangle-1-e { background-position: -32px -16px; }
.ui-icon-triangle-1-se { background-position: -48px -16px; }
.ui-icon-triangle-1-s { background-position: -64px -16px; }
.ui-icon-triangle-1-s { background-position: -65px -16px; }
.ui-icon-triangle-1-sw { background-position: -80px -16px; }
.ui-icon-triangle-1-w { background-position: -96px -16px; }
.ui-icon-triangle-1-nw { background-position: -112px -16px; }
@ -1027,7 +1118,7 @@ body .ui-tooltip {
.ui-icon-arrow-1-ne { background-position: -16px -32px; }
.ui-icon-arrow-1-e { background-position: -32px -32px; }
.ui-icon-arrow-1-se { background-position: -48px -32px; }
.ui-icon-arrow-1-s { background-position: -64px -32px; }
.ui-icon-arrow-1-s { background-position: -65px -32px; }
.ui-icon-arrow-1-sw { background-position: -80px -32px; }
.ui-icon-arrow-1-w { background-position: -96px -32px; }
.ui-icon-arrow-1-nw { background-position: -112px -32px; }
@ -1039,7 +1130,7 @@ body .ui-tooltip {
.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
@ -1188,38 +1279,34 @@ body .ui-tooltip {
.ui-corner-top,
.ui-corner-left,
.ui-corner-tl {
border-top-left-radius: 4px;
border-top-left-radius: 3px;
}
.ui-corner-all,
.ui-corner-top,
.ui-corner-right,
.ui-corner-tr {
border-top-right-radius: 4px;
border-top-right-radius: 3px;
}
.ui-corner-all,
.ui-corner-bottom,
.ui-corner-left,
.ui-corner-bl {
border-bottom-left-radius: 4px;
border-bottom-left-radius: 3px;
}
.ui-corner-all,
.ui-corner-bottom,
.ui-corner-right,
.ui-corner-br {
border-bottom-right-radius: 4px;
border-bottom-right-radius: 3px;
}
/* Overlays */
.ui-widget-overlay {
background: #666666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat;
opacity: .5;
filter: Alpha(Opacity=50); /* support: IE8 */
background: #aaaaaa;
opacity: .003;
filter: Alpha(Opacity=.3); /* support: IE8 */
}
.ui-widget-shadow {
margin: -5px 0 0 -5px;
padding: 5px;
background: #000000 url("images/ui-bg_flat_10_000000_40x100.png") 50% 50% repeat-x;
opacity: .2;
filter: Alpha(Opacity=20); /* support: IE8 */
border-radius: 5px;
-webkit-box-shadow: 0px 0px 5px #666666;
box-shadow: 0px 0px 5px #666666;
}

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,5 +1,5 @@
/*!
* jQuery UI CSS Framework 1.11.4
* jQuery UI CSS Framework 1.12.1
* http://jqueryui.com
*
* Copyright jQuery Foundation and other contributors
@ -8,7 +8,6 @@
*
* http://api.jqueryui.com/category/theming/
*/
/* Layout helpers
----------------------------------*/
.ui-helper-hidden {
@ -43,9 +42,6 @@
.ui-helper-clearfix:after {
clear: both;
}
.ui-helper-clearfix {
min-height: 0; /* support: IE7 */
}
.ui-helper-zfix {
width: 100%;
height: 100%;
@ -65,20 +61,27 @@
----------------------------------*/
.ui-state-disabled {
cursor: default !important;
pointer-events: none;
}
/* Icons
----------------------------------*/
/* states and images */
.ui-icon {
display: block;
display: inline-block;
vertical-align: middle;
margin-top: -.25em;
position: relative;
text-indent: -99999px;
overflow: hidden;
background-repeat: no-repeat;
}
.ui-widget-icon-block {
left: 50%;
margin-left: -8px;
display: block;
}
/* Misc visuals
----------------------------------*/
@ -97,21 +100,8 @@
position: relative;
margin: 2px 0 0 0;
padding: .5em .5em .5em .7em;
min-height: 0; /* support: IE7 */
font-size: 100%;
}
.ui-accordion .ui-accordion-icons {
padding-left: 2.2em;
}
.ui-accordion .ui-accordion-icons .ui-accordion-icons {
padding-left: 2.2em;
}
.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
position: absolute;
left: .5em;
top: 50%;
margin-top: -8px;
}
.ui-accordion .ui-accordion-content {
padding: 1em 2.2em;
border-top: 0;
@ -123,17 +113,78 @@
left: 0;
cursor: default;
}
.ui-menu {
list-style: none;
padding: 0;
margin: 0;
display: block;
outline: 0;
}
.ui-menu .ui-menu {
position: absolute;
}
.ui-menu .ui-menu-item {
margin: 0;
cursor: pointer;
/* support: IE10, see #8844 */
list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
}
.ui-menu .ui-menu-item-wrapper {
position: relative;
padding: 3px 1em 3px .4em;
}
.ui-menu .ui-menu-divider {
margin: 5px 0;
height: 0;
font-size: 0;
line-height: 0;
border-width: 1px 0 0 0;
}
.ui-menu .ui-state-focus,
.ui-menu .ui-state-active {
margin: -1px;
}
/* icon support */
.ui-menu-icons {
position: relative;
}
.ui-menu-icons .ui-menu-item-wrapper {
padding-left: 2em;
}
/* left-aligned */
.ui-menu .ui-icon {
position: absolute;
top: 0;
bottom: 0;
left: .2em;
margin: auto 0;
}
/* right-aligned */
.ui-menu .ui-menu-icon {
left: auto;
right: 0;
}
.ui-button {
padding: .4em 1em;
display: inline-block;
position: relative;
padding: 0;
line-height: normal;
margin-right: .1em;
cursor: pointer;
vertical-align: middle;
text-align: center;
overflow: visible; /* removes extra width in IE */
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
/* Support: IE <= 11 */
overflow: visible;
}
.ui-button,
.ui-button:link,
.ui-button:visited,
@ -141,92 +192,130 @@
.ui-button:active {
text-decoration: none;
}
/* to make room for the icon, a width needs to be set here */
.ui-button-icon-only {
width: 2.2em;
}
/* button elements seem to need a little more width */
button.ui-button-icon-only {
width: 2.4em;
}
.ui-button-icons-only {
width: 3.4em;
}
button.ui-button-icons-only {
width: 3.7em;
width: 2em;
box-sizing: border-box;
text-indent: -9999px;
white-space: nowrap;
}
/* button text element */
.ui-button .ui-button-text {
display: block;
line-height: normal;
}
.ui-button-text-only .ui-button-text {
padding: .4em 1em;
}
.ui-button-icon-only .ui-button-text,
.ui-button-icons-only .ui-button-text {
padding: .4em;
text-indent: -9999999px;
}
.ui-button-text-icon-primary .ui-button-text,
.ui-button-text-icons .ui-button-text {
padding: .4em 1em .4em 2.1em;
}
.ui-button-text-icon-secondary .ui-button-text,
.ui-button-text-icons .ui-button-text {
padding: .4em 2.1em .4em 1em;
}
.ui-button-text-icons .ui-button-text {
padding-left: 2.1em;
padding-right: 2.1em;
}
/* no icon support for input elements, provide padding by default */
input.ui-button {
padding: .4em 1em;
/* no icon support for input elements */
input.ui-button.ui-button-icon-only {
text-indent: 0;
}
/* button icon element(s) */
.ui-button-icon-only .ui-icon,
.ui-button-text-icon-primary .ui-icon,
.ui-button-text-icon-secondary .ui-icon,
.ui-button-text-icons .ui-icon,
.ui-button-icons-only .ui-icon {
.ui-button-icon-only .ui-icon {
position: absolute;
top: 50%;
margin-top: -8px;
}
.ui-button-icon-only .ui-icon {
left: 50%;
margin-top: -8px;
margin-left: -8px;
}
.ui-button-text-icon-primary .ui-button-icon-primary,
.ui-button-text-icons .ui-button-icon-primary,
.ui-button-icons-only .ui-button-icon-primary {
left: .5em;
}
.ui-button-text-icon-secondary .ui-button-icon-secondary,
.ui-button-text-icons .ui-button-icon-secondary,
.ui-button-icons-only .ui-button-icon-secondary {
right: .5em;
.ui-button.ui-icon-notext .ui-icon {
padding: 0;
width: 2.1em;
height: 2.1em;
text-indent: -9999px;
white-space: nowrap;
}
/* button sets */
.ui-buttonset {
margin-right: 7px;
}
.ui-buttonset .ui-button {
margin-left: 0;
margin-right: -.3em;
input.ui-button.ui-icon-notext .ui-icon {
width: auto;
height: auto;
text-indent: 0;
white-space: normal;
padding: .4em 1em;
}
/* workarounds */
/* reset extra padding in Firefox, see h5bp.com/l */
/* Support: Firefox 5 - 40 */
input.ui-button::-moz-focus-inner,
button.ui-button::-moz-focus-inner {
border: 0;
padding: 0;
}
.ui-controlgroup {
vertical-align: middle;
display: inline-block;
}
.ui-controlgroup > .ui-controlgroup-item {
float: left;
margin-left: 0;
margin-right: 0;
}
.ui-controlgroup > .ui-controlgroup-item:focus,
.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
z-index: 9999;
}
.ui-controlgroup-vertical > .ui-controlgroup-item {
display: block;
float: none;
width: 100%;
margin-top: 0;
margin-bottom: 0;
text-align: left;
}
.ui-controlgroup-vertical .ui-controlgroup-item {
box-sizing: border-box;
}
.ui-controlgroup .ui-controlgroup-label {
padding: .4em 1em;
}
.ui-controlgroup .ui-controlgroup-label span {
font-size: 80%;
}
.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
border-left: none;
}
.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
border-top: none;
}
.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
border-right: none;
}
.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
border-bottom: none;
}
/* Spinner specific style fixes */
.ui-controlgroup-vertical .ui-spinner-input {
/* Support: IE8 only, Android < 4.4 only */
width: 75%;
width: calc( 100% - 2.4em );
}
.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
border-top-style: solid;
}
.ui-checkboxradio-label .ui-icon-background {
box-shadow: inset 1px 1px 1px #ccc;
border-radius: .12em;
border: none;
}
.ui-checkboxradio-radio-label .ui-icon-background {
width: 16px;
height: 16px;
border-radius: 1em;
overflow: visible;
border: none;
}
.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
background-image: none;
width: 8px;
height: 8px;
border-width: 4px;
border-style: solid;
}
.ui-checkboxradio-disabled {
pointer-events: none;
}
.ui-datepicker {
width: 17em;
padding: .2em .2em 0;
@ -392,8 +481,17 @@ button.ui-button::-moz-focus-inner {
border-right-width: 0;
border-left-width: 1px;
}
.ui-dialog {
/* Icons */
.ui-datepicker .ui-icon {
display: block;
text-indent: -99999px;
overflow: hidden;
background-repeat: no-repeat;
left: .5em;
top: .3em;
}
.ui-dialog {
position: absolute;
top: 0;
left: 0;
@ -442,12 +540,44 @@ button.ui-button::-moz-focus-inner {
margin: .5em .4em .5em 0;
cursor: pointer;
}
.ui-dialog .ui-resizable-n {
height: 2px;
top: 0;
}
.ui-dialog .ui-resizable-e {
width: 2px;
right: 0;
}
.ui-dialog .ui-resizable-s {
height: 2px;
bottom: 0;
}
.ui-dialog .ui-resizable-w {
width: 2px;
left: 0;
}
.ui-dialog .ui-resizable-se,
.ui-dialog .ui-resizable-sw,
.ui-dialog .ui-resizable-ne,
.ui-dialog .ui-resizable-nw {
width: 7px;
height: 7px;
}
.ui-dialog .ui-resizable-se {
width: 12px;
height: 12px;
right: -5px;
bottom: -5px;
background-position: 16px 16px;
right: 0;
bottom: 0;
}
.ui-dialog .ui-resizable-sw {
left: 0;
bottom: 0;
}
.ui-dialog .ui-resizable-ne {
right: 0;
top: 0;
}
.ui-dialog .ui-resizable-nw {
left: 0;
top: 0;
}
.ui-draggable .ui-dialog-titlebar {
cursor: move;
@ -456,77 +586,6 @@ button.ui-button::-moz-focus-inner {
-ms-touch-action: none;
touch-action: none;
}
.ui-menu {
list-style: none;
padding: 0;
margin: 0;
display: block;
outline: none;
}
.ui-menu .ui-menu {
position: absolute;
}
.ui-menu .ui-menu-item {
position: relative;
margin: 0;
padding: 3px 1em 3px .4em;
cursor: pointer;
min-height: 0; /* support: IE7 */
/* support: IE10, see #8844 */
list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
}
.ui-menu .ui-menu-divider {
margin: 5px 0;
height: 0;
font-size: 0;
line-height: 0;
border-width: 1px 0 0 0;
}
.ui-menu .ui-state-focus,
.ui-menu .ui-state-active {
margin: -1px;
}
/* icon support */
.ui-menu-icons {
position: relative;
}
.ui-menu-icons .ui-menu-item {
padding-left: 2em;
}
/* left-aligned */
.ui-menu .ui-icon {
position: absolute;
top: 0;
bottom: 0;
left: .2em;
margin: auto 0;
}
/* right-aligned */
.ui-menu .ui-menu-icon {
left: auto;
right: 0;
}
.ui-progressbar {
height: 2em;
text-align: left;
overflow: hidden;
}
.ui-progressbar .ui-progressbar-value {
margin: -1px;
height: 100%;
}
.ui-progressbar .ui-progressbar-overlay {
background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
height: 100%;
filter: alpha(opacity=25); /* support: IE8 */
opacity: 0.25;
}
.ui-progressbar-indeterminate .ui-progressbar-value {
background-image: none;
}
.ui-resizable {
position: relative;
}
@ -597,6 +656,24 @@ button.ui-button::-moz-focus-inner {
right: -5px;
top: -5px;
}
.ui-progressbar {
height: 2em;
text-align: left;
overflow: hidden;
}
.ui-progressbar .ui-progressbar-value {
margin: -1px;
height: 100%;
}
.ui-progressbar .ui-progressbar-overlay {
background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
height: 100%;
filter: alpha(opacity=25); /* support: IE8 */
opacity: 0.25;
}
.ui-progressbar-indeterminate .ui-progressbar-value {
background-image: none;
}
.ui-selectable {
-ms-touch-action: none;
touch-action: none;
@ -616,7 +693,6 @@ button.ui-button::-moz-focus-inner {
}
.ui-selectmenu-menu .ui-menu {
overflow: auto;
/* Support: IE7 */
overflow-x: hidden;
padding-bottom: 1px;
}
@ -632,28 +708,20 @@ button.ui-button::-moz-focus-inner {
.ui-selectmenu-open {
display: block;
}
.ui-selectmenu-button {
display: inline-block;
overflow: hidden;
position: relative;
text-decoration: none;
cursor: pointer;
}
.ui-selectmenu-button span.ui-icon {
right: 0.5em;
left: auto;
margin-top: -8px;
position: absolute;
top: 50%;
}
.ui-selectmenu-button span.ui-selectmenu-text {
text-align: left;
padding: 0.4em 2.1em 0.4em 1em;
.ui-selectmenu-text {
display: block;
line-height: 1.4;
margin-right: 20px;
overflow: hidden;
text-overflow: ellipsis;
}
.ui-selectmenu-button.ui-button {
text-align: left;
white-space: nowrap;
width: 14em;
}
.ui-selectmenu-icon.ui-icon {
float: right;
margin-top: 0;
}
.ui-slider {
position: relative;
@ -735,14 +803,14 @@ button.ui-button::-moz-focus-inner {
border: none;
background: none;
color: inherit;
padding: 0;
padding: .222em 0;
margin: .2em 0;
vertical-align: middle;
margin-left: .4em;
margin-right: 22px;
margin-right: 2em;
}
.ui-spinner-button {
width: 16px;
width: 1.6em;
height: 50%;
font-size: .5em;
padding: 0;
@ -756,16 +824,9 @@ button.ui-button::-moz-focus-inner {
}
/* more specificity required here to override default borders */
.ui-spinner a.ui-spinner-button {
border-top: none;
border-bottom: none;
border-right: none;
}
/* vertically center icon */
.ui-spinner .ui-icon {
position: absolute;
margin-top: -8px;
top: 50%;
left: 0;
border-top-style: none;
border-bottom-style: none;
border-right-style: none;
}
.ui-spinner-up {
top: 0;
@ -773,12 +834,6 @@ button.ui-button::-moz-focus-inner {
.ui-spinner-down {
bottom: 0;
}
/* TR overrides */
.ui-spinner .ui-icon-triangle-1-s {
/* need to fix icons sprite */
background-position: -65px -16px;
}
.ui-tabs {
position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
padding: .2em;
@ -825,8 +880,6 @@ button.ui-button::-moz-focus-inner {
position: absolute;
z-index: 9999;
max-width: 300px;
-webkit-box-shadow: 0 0 5px #aaa;
box-shadow: 0 0 5px #aaa;
}
body .ui-tooltip {
border-width: 2px;

File diff suppressed because one or more lines are too long

View file

@ -1,5 +1,5 @@
/*!
* jQuery UI CSS Framework 1.11.4
* jQuery UI CSS Framework 1.12.1
* http://jqueryui.com
*
* Copyright jQuery Foundation and other contributors
@ -8,15 +8,15 @@
*
* http://api.jqueryui.com/category/theming/
*
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
* To view and modify this theme, visit http://jqueryui.com/themeroller/?bgShadowXPos=&bgOverlayXPos=&bgErrorXPos=&bgHighlightXPos=&bgContentXPos=&bgHeaderXPos=&bgActiveXPos=&bgHoverXPos=&bgDefaultXPos=&bgShadowYPos=&bgOverlayYPos=&bgErrorYPos=&bgHighlightYPos=&bgContentYPos=&bgHeaderYPos=&bgActiveYPos=&bgHoverYPos=&bgDefaultYPos=&bgShadowRepeat=&bgOverlayRepeat=&bgErrorRepeat=&bgHighlightRepeat=&bgContentRepeat=&bgHeaderRepeat=&bgActiveRepeat=&bgHoverRepeat=&bgDefaultRepeat=&iconsHover=url(%22images%2Fui-icons_555555_256x240.png%22)&iconsHighlight=url(%22images%2Fui-icons_777620_256x240.png%22)&iconsHeader=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsError=url(%22images%2Fui-icons_cc0000_256x240.png%22)&iconsDefault=url(%22images%2Fui-icons_777777_256x240.png%22)&iconsContent=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsActive=url(%22images%2Fui-icons_ffffff_256x240.png%22)&bgImgUrlShadow=&bgImgUrlOverlay=&bgImgUrlHover=&bgImgUrlHighlight=&bgImgUrlHeader=&bgImgUrlError=&bgImgUrlDefault=&bgImgUrlContent=&bgImgUrlActive=&opacityFilterShadow=Alpha(Opacity%3D30)&opacityFilterOverlay=Alpha(Opacity%3D30)&opacityShadowPerc=30&opacityOverlayPerc=30&iconColorHover=%23555555&iconColorHighlight=%23777620&iconColorHeader=%23444444&iconColorError=%23cc0000&iconColorDefault=%23777777&iconColorContent=%23444444&iconColorActive=%23ffffff&bgImgOpacityShadow=0&bgImgOpacityOverlay=0&bgImgOpacityError=95&bgImgOpacityHighlight=55&bgImgOpacityContent=75&bgImgOpacityHeader=75&bgImgOpacityActive=65&bgImgOpacityHover=75&bgImgOpacityDefault=75&bgTextureShadow=flat&bgTextureOverlay=flat&bgTextureError=flat&bgTextureHighlight=flat&bgTextureContent=flat&bgTextureHeader=flat&bgTextureActive=flat&bgTextureHover=flat&bgTextureDefault=flat&cornerRadius=3px&fwDefault=normal&ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&cornerRadiusShadow=8px&thicknessShadow=5px&offsetLeftShadow=0px&offsetTopShadow=0px&opacityShadow=.3&bgColorShadow=%23666666&opacityOverlay=.3&bgColorOverlay=%23aaaaaa&fcError=%235f3f3f&borderColorError=%23f1a899&bgColorError=%23fddfdf&fcHighlight=%23777620&borderColorHighlight=%23dad55e&bgColorHighlight=%23fffa90&fcContent=%23333333&borderColorContent=%23dddddd&bgColorContent=%23ffffff&fcHeader=%23333333&borderColorHeader=%23dddddd&bgColorHeader=%23e9e9e9&fcActive=%23ffffff&borderColorActive=%23003eff&bgColorActive=%23007fff&fcHover=%232b2b2b&borderColorHover=%23cccccc&bgColorHover=%23ededed&fcDefault=%23454545&borderColorDefault=%23c5c5c5&bgColorDefault=%23f6f6f6
*/
/* Component containers
----------------------------------*/
.ui-widget {
font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
font-size: 1.1em;
font-family: Arial,Helvetica,sans-serif;
font-size: 1em;
}
.ui-widget .ui-widget {
font-size: 1em;
@ -25,41 +25,54 @@
.ui-widget select,
.ui-widget textarea,
.ui-widget button {
font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
font-family: Arial,Helvetica,sans-serif;
font-size: 1em;
}
.ui-widget.ui-widget-content {
border: 1px solid #c5c5c5;
}
.ui-widget-content {
border: 1px solid #dddddd;
background: #eeeeee url("images/ui-bg_highlight-soft_100_eeeeee_1x100.png") 50% top repeat-x;
background: #ffffff;
color: #333333;
}
.ui-widget-content a {
color: #333333;
}
.ui-widget-header {
border: 1px solid #e78f08;
background: #f6a828 url("images/ui-bg_gloss-wave_35_f6a828_500x100.png") 50% 50% repeat-x;
color: #ffffff;
border: 1px solid #dddddd;
background: #e9e9e9;
color: #333333;
font-weight: bold;
}
.ui-widget-header a {
color: #ffffff;
color: #333333;
}
/* Interaction states
----------------------------------*/
.ui-state-default,
.ui-widget-content .ui-state-default,
.ui-widget-header .ui-state-default {
border: 1px solid #cccccc;
background: #f6f6f6 url("images/ui-bg_glass_100_f6f6f6_1x400.png") 50% 50% repeat-x;
font-weight: bold;
color: #1c94c4;
.ui-widget-header .ui-state-default,
.ui-button,
/* We use html here because we need a greater specificity to make sure disabled
works properly when clicked or hovered */
html .ui-button.ui-state-disabled:hover,
html .ui-button.ui-state-disabled:active {
border: 1px solid #c5c5c5;
background: #f6f6f6;
font-weight: normal;
color: #454545;
}
.ui-state-default a,
.ui-state-default a:link,
.ui-state-default a:visited {
color: #1c94c4;
.ui-state-default a:visited,
a.ui-button,
a:link.ui-button,
a:visited.ui-button,
.ui-button {
color: #454545;
text-decoration: none;
}
.ui-state-hover,
@ -67,11 +80,13 @@
.ui-widget-header .ui-state-hover,
.ui-state-focus,
.ui-widget-content .ui-state-focus,
.ui-widget-header .ui-state-focus {
border: 1px solid #fbcb09;
background: #fdf5ce url("images/ui-bg_glass_100_fdf5ce_1x400.png") 50% 50% repeat-x;
font-weight: bold;
color: #c77405;
.ui-widget-header .ui-state-focus,
.ui-button:hover,
.ui-button:focus {
border: 1px solid #cccccc;
background: #ededed;
font-weight: normal;
color: #2b2b2b;
}
.ui-state-hover a,
.ui-state-hover a:hover,
@ -80,22 +95,36 @@
.ui-state-focus a,
.ui-state-focus a:hover,
.ui-state-focus a:link,
.ui-state-focus a:visited {
color: #c77405;
.ui-state-focus a:visited,
a.ui-button:hover,
a.ui-button:focus {
color: #2b2b2b;
text-decoration: none;
}
.ui-visual-focus {
box-shadow: 0 0 3px 1px rgb(94, 158, 214);
}
.ui-state-active,
.ui-widget-content .ui-state-active,
.ui-widget-header .ui-state-active {
border: 1px solid #fbd850;
background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;
font-weight: bold;
color: #eb8f00;
.ui-widget-header .ui-state-active,
a.ui-button:active,
.ui-button:active,
.ui-button.ui-state-active:hover {
border: 1px solid #003eff;
background: #007fff;
font-weight: normal;
color: #ffffff;
}
.ui-icon-background,
.ui-state-active .ui-icon-background {
border: #003eff;
background-color: #ffffff;
}
.ui-state-active a,
.ui-state-active a:link,
.ui-state-active a:visited {
color: #eb8f00;
color: #ffffff;
text-decoration: none;
}
@ -104,31 +133,35 @@
.ui-state-highlight,
.ui-widget-content .ui-state-highlight,
.ui-widget-header .ui-state-highlight {
border: 1px solid #fed22f;
background: #ffe45c url("images/ui-bg_highlight-soft_75_ffe45c_1x100.png") 50% top repeat-x;
color: #363636;
border: 1px solid #dad55e;
background: #fffa90;
color: #777620;
}
.ui-state-checked {
border: 1px solid #dad55e;
background: #fffa90;
}
.ui-state-highlight a,
.ui-widget-content .ui-state-highlight a,
.ui-widget-header .ui-state-highlight a {
color: #363636;
color: #777620;
}
.ui-state-error,
.ui-widget-content .ui-state-error,
.ui-widget-header .ui-state-error {
border: 1px solid #cd0a0a;
background: #b81900 url("images/ui-bg_diagonals-thick_18_b81900_40x40.png") 50% 50% repeat;
color: #ffffff;
border: 1px solid #f1a899;
background: #fddfdf;
color: #5f3f3f;
}
.ui-state-error a,
.ui-widget-content .ui-state-error a,
.ui-widget-header .ui-state-error a {
color: #ffffff;
color: #5f3f3f;
}
.ui-state-error-text,
.ui-widget-content .ui-state-error-text,
.ui-widget-header .ui-state-error-text {
color: #ffffff;
color: #5f3f3f;
}
.ui-priority-primary,
.ui-widget-content .ui-priority-primary,
@ -163,46 +196,50 @@
}
.ui-icon,
.ui-widget-content .ui-icon {
background-image: url("images/ui-icons_222222_256x240.png");
background-image: url("images/ui-icons_444444_256x240.png");
}
.ui-widget-header .ui-icon {
background-image: url("images/ui-icons_ffffff_256x240.png");
}
.ui-state-default .ui-icon {
background-image: url("images/ui-icons_ef8c08_256x240.png");
background-image: url("images/ui-icons_444444_256x240.png");
}
.ui-state-hover .ui-icon,
.ui-state-focus .ui-icon {
background-image: url("images/ui-icons_ef8c08_256x240.png");
.ui-state-focus .ui-icon,
.ui-button:hover .ui-icon,
.ui-button:focus .ui-icon {
background-image: url("images/ui-icons_555555_256x240.png");
}
.ui-state-active .ui-icon {
background-image: url("images/ui-icons_ef8c08_256x240.png");
.ui-state-active .ui-icon,
.ui-button:active .ui-icon {
background-image: url("images/ui-icons_ffffff_256x240.png");
}
.ui-state-highlight .ui-icon {
background-image: url("images/ui-icons_228ef1_256x240.png");
.ui-state-highlight .ui-icon,
.ui-button .ui-state-highlight.ui-icon {
background-image: url("images/ui-icons_777620_256x240.png");
}
.ui-state-error .ui-icon,
.ui-state-error-text .ui-icon {
background-image: url("images/ui-icons_ffd27a_256x240.png");
background-image: url("images/ui-icons_cc0000_256x240.png");
}
.ui-button .ui-icon {
background-image: url("images/ui-icons_777777_256x240.png");
}
/* positioning */
.ui-icon-blank { background-position: 16px 16px; }
.ui-icon-carat-1-n { background-position: 0 0; }
.ui-icon-carat-1-ne { background-position: -16px 0; }
.ui-icon-carat-1-e { background-position: -32px 0; }
.ui-icon-carat-1-se { background-position: -48px 0; }
.ui-icon-carat-1-s { background-position: -64px 0; }
.ui-icon-carat-1-sw { background-position: -80px 0; }
.ui-icon-carat-1-w { background-position: -96px 0; }
.ui-icon-carat-1-nw { background-position: -112px 0; }
.ui-icon-carat-2-n-s { background-position: -128px 0; }
.ui-icon-carat-2-e-w { background-position: -144px 0; }
.ui-icon-caret-1-n { background-position: 0 0; }
.ui-icon-caret-1-ne { background-position: -16px 0; }
.ui-icon-caret-1-e { background-position: -32px 0; }
.ui-icon-caret-1-se { background-position: -48px 0; }
.ui-icon-caret-1-s { background-position: -65px 0; }
.ui-icon-caret-1-sw { background-position: -80px 0; }
.ui-icon-caret-1-w { background-position: -96px 0; }
.ui-icon-caret-1-nw { background-position: -112px 0; }
.ui-icon-caret-2-n-s { background-position: -128px 0; }
.ui-icon-caret-2-e-w { background-position: -144px 0; }
.ui-icon-triangle-1-n { background-position: 0 -16px; }
.ui-icon-triangle-1-ne { background-position: -16px -16px; }
.ui-icon-triangle-1-e { background-position: -32px -16px; }
.ui-icon-triangle-1-se { background-position: -48px -16px; }
.ui-icon-triangle-1-s { background-position: -64px -16px; }
.ui-icon-triangle-1-s { background-position: -65px -16px; }
.ui-icon-triangle-1-sw { background-position: -80px -16px; }
.ui-icon-triangle-1-w { background-position: -96px -16px; }
.ui-icon-triangle-1-nw { background-position: -112px -16px; }
@ -212,7 +249,7 @@
.ui-icon-arrow-1-ne { background-position: -16px -32px; }
.ui-icon-arrow-1-e { background-position: -32px -32px; }
.ui-icon-arrow-1-se { background-position: -48px -32px; }
.ui-icon-arrow-1-s { background-position: -64px -32px; }
.ui-icon-arrow-1-s { background-position: -65px -32px; }
.ui-icon-arrow-1-sw { background-position: -80px -32px; }
.ui-icon-arrow-1-w { background-position: -96px -32px; }
.ui-icon-arrow-1-nw { background-position: -112px -32px; }
@ -224,7 +261,7 @@
.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
@ -373,38 +410,34 @@
.ui-corner-top,
.ui-corner-left,
.ui-corner-tl {
border-top-left-radius: 4px;
border-top-left-radius: 3px;
}
.ui-corner-all,
.ui-corner-top,
.ui-corner-right,
.ui-corner-tr {
border-top-right-radius: 4px;
border-top-right-radius: 3px;
}
.ui-corner-all,
.ui-corner-bottom,
.ui-corner-left,
.ui-corner-bl {
border-bottom-left-radius: 4px;
border-bottom-left-radius: 3px;
}
.ui-corner-all,
.ui-corner-bottom,
.ui-corner-right,
.ui-corner-br {
border-bottom-right-radius: 4px;
border-bottom-right-radius: 3px;
}
/* Overlays */
.ui-widget-overlay {
background: #666666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat;
opacity: .5;
filter: Alpha(Opacity=50); /* support: IE8 */
background: #aaaaaa;
opacity: .003;
filter: Alpha(Opacity=.3); /* support: IE8 */
}
.ui-widget-shadow {
margin: -5px 0 0 -5px;
padding: 5px;
background: #000000 url("images/ui-bg_flat_10_000000_40x100.png") 50% 50% repeat-x;
opacity: .2;
filter: Alpha(Opacity=20); /* support: IE8 */
border-radius: 5px;
-webkit-box-shadow: 0px 0px 5px #666666;
box-shadow: 0px 0px 5px #666666;
}

File diff suppressed because one or more lines are too long

View file

@ -27,8 +27,8 @@ $lang->cmd_replace = 'Replace';
$lang->cmd_confirm = 'Confirm';
$lang->cmd_cancel = 'Cancel';
$lang->cmd_back = 'Go Back';
$lang->cmd_vote = 'Recommend';
$lang->cmd_vote_down = 'Not recommend';
$lang->cmd_vote = 'Upvote';
$lang->cmd_vote_down = 'Downvote';
$lang->cmd_declare = 'Report';
$lang->cmd_cancel_declare = 'Cancel Report';
$lang->cmd_declared_list = 'Reported List';
@ -265,13 +265,13 @@ $lang->fail_to_registed = 'Failed to register.';
$lang->fail_to_update = 'Fail to update.';
$lang->fail_to_delete = 'Failed to delete.';
$lang->fail_to_move = 'Failed to move.';
$lang->failed_voted = 'No permission to Recommend.';
$lang->failed_blamed = 'No permission to Not Recommend.';
$lang->failed_voted = 'No permission to upvote.';
$lang->failed_blamed = 'No permission to downvote.';
$lang->failed_declared = 'No permission to Report.';
$lang->fail_to_delete_have_children = 'Cannot delete the article with comments.';
$lang->confirm_submit = 'Are you sure you want to submit?';
$lang->confirm_logout = 'Are you sure you want to sign out?';
$lang->confirm_vote = 'Are you sure you want to recommend?';
$lang->confirm_vote = 'Are you sure you want to upvote?';
$lang->confirm_delete = 'Are you sure you want to delete?';
$lang->confirm_restore = 'Are you sure you want to restore?';
$lang->confirm_move = 'Are you sure you want to move?';

View file

@ -22,6 +22,9 @@ $output = executeQuery('ncenterlite.deleteNotifyAll', $args);
if ($output->toBool())
{
echo "Successfully deleted all notifications older than $days days.\n";
$delete_obj = (object)array('regdate' => time());
Rhymix\Framework\Cache::clearGroup('ncenterlite');
Rhymix\Framework\Storage::writePHPData(\RX_BASEDIR . 'files/cache/ncenterlite/new_notify/delete_date.php', $delete_obj);
}
else
{

View file

@ -36,7 +36,7 @@
<link rel="alternate" type="application/atom+xml" title="Site Atom" href="{$general_atom_url}" cond="$general_rss_url" />
<!-- ICONS AND OTHER LINKS -->
<link cond="$canonical_url" rel="canonical" href="{$canonical_url}" />
<link cond="Context::getCanonicalURL()" rel="canonical" href="{Context::getCanonicalURL()}" />
<link cond="$favicon_url" rel="shortcut icon" href="{$favicon_url}" />
<link cond="$mobicon_url" rel="apple-touch-icon" href="{$mobicon_url}" />
@ -48,9 +48,9 @@
<!-- COMMON JS VARIABLES -->
<script>
var default_url = "{Context::getDefaultUrl()}";
var current_url = "{$current_url}";
var request_uri = "{$request_uri}";
var default_url = "{\Rhymix\Framework\URL::encodeIdna(Context::getDefaultUrl())}";
var current_url = "{\Rhymix\Framework\URL::encodeIdna($current_url)}";
var request_uri = "{\Rhymix\Framework\URL::encodeIdna($request_uri)}";
var current_lang = xe.current_lang = "{$lang_type}";
var current_mid = {json_encode($mid ?: null)};
var http_port = {Context::get("_http_port") ?: 'null'};

View file

@ -43,8 +43,7 @@ require dirname(__FILE__) . '/common/autoload.php';
* @brief Initialize by creating Context object
* Set all Request Argument/Environment variables
**/
$oContext = Context::getInstance();
$oContext->init();
Context::init();
/**
* @brief Initialize and execute Module Handler

View file

@ -1,217 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<layout version="0.2">
<title xml:lang="ko">XE 공식 사이트 레이아웃</title>
<title xml:lang="jp">XE公式サイトレイアウト</title>
<title xml:lang="en">XE Official website layout</title>
<title xml:lang="ge">XE Offizielle Website-Layout</title>
<title xml:lang="ru">XE Официальный сайт макет</title>
<title xml:lang="es">Diseño oficial de la página web de XE</title>
<title xml:lang="zh-CN">XE 官方网站布局</title>
<title xml:lang="zh-TW">XE 官方網站版面</title>
<title xml:lang="vi">Giao diện chính thức của XE</title>
<title xml:lang="tr">XE Resmi Websitesi Yerleşim Düzeni</title>
<description xml:lang="ko">
XE 공식 사이트 레이아웃입니다.
제작 : NAVER
</description>
<description xml:lang="jp">
XEの公式サイトのレイアウトです。
제작 : NAVER
</description>
<description xml:lang="en">
This layout is the Official website layout for XE.
제작 : NAVER
</description>
<description xml:lang="ge">
Dieses Layout ist das XE Offizielle Website-Layout.
제작 : NAVER
</description>
<description xml:lang="ru">
Этот формат является XE Официальный сайт компоновку.
제작 : NAVER
</description>
<description xml:lang="es">
Este diseño is el diseño oficial de la página web de Zerobard XE.
제작 : NAVER
</description>
<description xml:lang="zh-CN">
XE官方网站布局。
제작 : NAVER
</description>
<description xml:lang="zh-TW">
XE官方網站版面。
제작 : NAVER
</description>
<description xml:lang="vi">
Đây là giao diện chính thức của XE.
제작 : NAVER
</description>
<description xml:lang="tr">
Bu yerleşim düzeni, XE'nin resmi website yerleşim düzenidir.
제작 : NAVER
</description>
<version>1.7</version>
<date>2013-11-27</date>
<link>http://xpressengine.com/</link>
<author email_address="developers@xpressengine.com" link="http://xpressengine.com/">
<name xml:lang="ko">NAVER</name>
<name xml:lang="jp">NAVER</name>
<name xml:lang="en">NAVER</name>
<name xml:lang="ge">NAVER</name>
<name xml:lang="ru">NAVER</name>
<name xml:lang="es">NAVER</name>
<name xml:lang="zh-CN">NAVER</name>
<name xml:lang="zh-TW">NAVER</name>
<name xml:lang="vi">NAVER</name>
<name xml:lang="tr">NAVER</name>
</author>
<extra_vars>
<var name="colorset" type="select">
<title xml:lang="ko">컬러셋</title>
<title xml:lang="jp">カラーセット</title>
<title xml:lang="zh-CN">颜色</title>
<title xml:lang="zh-TW">顏色設定</title>
<title xml:lang="en">Colorset</title>
<title xml:lang="ge">Colorset</title>
<title xml:lang="ru">Colorset</title>
<title xml:lang="es">Set de colores</title>
<title xml:lang="vi">Màu sắc</title>
<title xml:lang="tr">Renk ayarı</title>
<description xml:lang="ko">원하는 컬러셋을 선택해주세요.</description>
<description xml:lang="jp">希望するカラーセットを選択して下さい。</description>
<description xml:lang="zh-CN">请选择颜色。</description>
<description xml:lang="zh-TW">請選擇顏色。</description>
<description xml:lang="en">Please select the colorset you want.</description>
<description xml:lang="ge">Bitte wählen Sie ein colorset Sie wollen.</description>
<description xml:lang="ru">Выберите colorset хотите.</description>
<description xml:lang="es">Seleccione set de colores que desea.</description>
<description xml:lang="vi">Hãy chọn màu sắc bạn muốn.</description>
<description xml:lang="tr">Lütfen kullanmak istediğiniz renk ayarını seçiniz.</description>
<options value="default">
<title xml:lang="ko">기본</title>
<title xml:lang="jp">デフォルト</title>
<title xml:lang="en">Basic</title>
<title xml:lang="ge">Basic</title>
<title xml:lang="ru">Базовые</title>
<title xml:lang="es">Básico</title>
<title xml:lang="zh-CN">默认</title>
<title xml:lang="zh-TW">預設</title>
<title xml:lang="vi">Cơ bản</title>
<title xml:lang="tr">Temel</title>
</options>
<options value="black">
<title xml:lang="ko">검은색</title>
<title xml:lang="jp"></title>
<title xml:lang="en">Black</title>
<title xml:lang="ge">Schwarz</title>
<title xml:lang="ru">Черного</title>
<title xml:lang="es">Negro</title>
<title xml:lang="zh-CN">黑色</title>
<title xml:lang="zh-TW">黑色</title>
<title xml:lang="vi">Black</title>
<title xml:lang="tr">Siyah</title>
</options>
<options value="white">
<title xml:lang="ko">하얀색</title>
<title xml:lang="jp"></title>
<title xml:lang="en">white</title>
<title xml:lang="ge">weiß</title>
<title xml:lang="ru">белый</title>
<title xml:lang="es">Blanco</title>
<title xml:lang="zh-CN">白色</title>
<title xml:lang="zh-TW">白色</title>
<title xml:lang="vi">White</title>
<title xml:lang="tr">Beyaz</title>
</options>
</var>
<var name="logo_image" type="image">
<title xml:lang="ko">로고이미지</title>
<title xml:lang="jp">ロゴイメージ</title>
<title xml:lang="zh-CN">LOGO图片</title>
<title xml:lang="zh-TW">Logo圖片</title>
<title xml:lang="en">Logo image</title>
<title xml:lang="ge">Logobildes</title>
<title xml:lang="ru">Изображения логотипа</title>
<title xml:lang="es">Imagen del logotipo</title>
<title xml:lang="vi">Hình Logo</title>
<title xml:lang="tr">Logo resmi</title>
<description xml:lang="ko">레이아웃의 상단에 표시될 로고이미지를 입력하세요. (세로길이가 23px인 투명이미지가 가장 어울립니다)</description>
<description xml:lang="jp">レイアウトの上段に表示されるロゴイメージを入力して下さい。 (縦幅が23pxである透明イメージをお勧めします。。)</description>
<description xml:lang="zh-CN">请输入显示在布局顶部的LOGO图片(高度为23px的透明图片为适)。</description>
<description xml:lang="zh-TW">請輸入要顯示在版面上端的 Logo 圖片。(適當高度為23px的透明圖片。)</description>
<description xml:lang="en">Please input a logo image which will be displayed on the top of the layout. (Transparent image with height of 23px is recommended.)</description>
<description xml:lang="ge">Bitte geben Sie ein Logo das Bild wird auf dem oberen Layout. (Transparent Bild mit einer Höhe von 23px wird empfohlen).</description>
<description xml:lang="ru">Введите логотип изображение, которое будет отображаться в верхней части формы. (Прозрачный изображение с высотой 23px рекомендуется.)</description>
<description xml:lang="es">Ingresar una imagen para logotipo. ( Se recomienda una imagen de fondo transparente con una altura de 23px.</description>
<description xml:lang="vi">Hãy chọn Logo hiển thị phía trên cùng của giao diện. (Đề nghị: Hình ảnh có nền trong suốt và kích thước 23px.)</description>
<description xml:lang="tr">Lütfen yerleşim düzeninin üst kısmında görüntülenecek bir resim girişi yapınız. (23px uzunluğunda net bir resim seçmeniz önerilir)</description>
</var>
<var name="logo_image_alt" type="text">
<title xml:lang="ko">로고이미지 대체문자</title>
<title xml:lang="en">Logo image alt text</title>
<description xml:lang="ko">레이아웃의 상단에 표시될 로고이미지 대체문자를 입력하세요.</description>
<description xml:lang="en">Please input a logo image alternative text which will be displayed on the top of the layout.</description>
</var>
<var name="index_url" type="text">
<title xml:lang="ko">홈 페이지 URL</title>
<title xml:lang="jp">ホームページURL</title>
<title xml:lang="zh-CN">主页地址</title>
<title xml:lang="zh-TW">主頁網址</title>
<title xml:lang="en">Homepage URL</title>
<title xml:lang="ge">Homepage URL</title>
<title xml:lang="ru">Домашняя страница URL</title>
<title xml:lang="es">URL de la página web</title>
<title xml:lang="vi">URL Trang chủ</title>
<title xml:lang="tr">Anasayfa URL'si</title>
<description xml:lang="ko">로고를 클릭시에 이동할 홈 페이지 URL을 입력해 주세요.</description>
<description xml:lang="jp">ロゴをクリックした時に移動するホームページのURLを入力して下さい。</description>
<description xml:lang="zh-CN">点击网站LOGO时要移动的页面URL。</description>
<description xml:lang="zh-TW">請輸入當用戶按了網站 Logo 後,要前往的頁面網址。</description>
<description xml:lang="en">Please input the URL to redirect when user clicks the logo.</description>
<description xml:lang="ge">Bitte geben Sie die URL umzuleiten, wenn Benutzer klickt das Logo</description>
<description xml:lang="ru">Пожалуйста, введите URL для перенаправления, когда пользователь нажимает логотип</description>
<description xml:lang="es">Ingresar el URL de la página web para redireccionar al pulsar el logotipo</description>
<description xml:lang="vi">Hãy nhập địa chỉ bạn muốn chuyển đến khi bấm vào Logo</description>
<description xml:lang="tr">Lütfen kullanıcılar resme tıkladıkları zaman yönlendirilecekleri bir URL giriniz.</description>
</var>
<var name="background_image" type="image">
<title xml:lang="ko">배경 이미지</title>
<title xml:lang="jp">背景イメージ</title>
<title xml:lang="zh-CN">背景图片</title>
<title xml:lang="zh-TW">背景圖片</title>
<title xml:lang="en">Background Image</title>
<title xml:lang="ge">Hintergrundbild</title>
<title xml:lang="ru">Фоновое изображение</title>
<title xml:lang="es">Imagen de fondo</title>
<title xml:lang="vi">Hình nền</title>
<title xml:lang="tr">Arkaplan Resmi</title>
<description xml:lang="ko">배경 이미지를 사용하려면 등록해주세요.</description>
<description xml:lang="jp">背景イメージを使う場合は、登録して下さい。</description>
<description xml:lang="zh-CN">要想使用背景图片请在这里上传。</description>
<description xml:lang="zh-TW">請在這裡上傳想要使用的背景圖片。</description>
<description xml:lang="en">Please input if you want to use the background image.</description>
<description xml:lang="ge">Bitte geben Sie, wenn Sie verwenden wollen Hintergrundbild.</description>
<description xml:lang="ru">Введите, если вы хотите использовать фоновое изображение.</description>
<description xml:lang="es">Ingresar imagen de fondo si desea usar.</description>
<description xml:lang="vi">Hãy nhập hình nền nếu bạn muốn sử dụng.</description>
<description xml:lang="tr">Eğer arkaplan resmi kullanmak istiyorsanız, lütfen resim girişi yapınız.</description>
</var>
</extra_vars>
<menus>
<menu name="main_menu" maxdepth="3" default="true">
<title xml:lang="ko">상단 메뉴</title>
<title xml:lang="jp">上段用メニュー</title>
<title xml:lang="zh-CN">主菜单</title>
<title xml:lang="zh-TW">主選單</title>
<title xml:lang="en">Top menu</title>
<title xml:lang="ge">Top Menü</title>
<title xml:lang="ru">Верхнее меню</title>
<title xml:lang="es">Menú Principal</title>
<title xml:lang="vi">Menu trên</title>
<title xml:lang="tr">Ana Menü</title>
</menu>
</menus>
</layout>

View file

@ -1,55 +0,0 @@
@charset "utf-8";
/* NAVER (developers@xpressengine.com) */
/* Site Layout - Body Wrap */
body{background:#000}
.xe{position:relative;width:960px;margin:0 auto;padding:1.5em 0 0 0;font-family:Tahoma, Geneva, sans-serif}
/* Site Layout - Header */
.header{position:relative;width:960px;height:120px;background:url(../images/black/bgHeader.jpg) no-repeat right top;margin-bottom:10px;z-index:2}
.header h1{margin:0;position:absolute;top:32px;left:25px}
.header h1 a{color:#fff;text-decoration:none}
.language{position:absolute;top:18px;right:19px;z-index:100}
.language strong{display:inline-block;height:15px;color:#fff;font:.75em/15px Tahoma;margin-right:3px;vertical-align:top}
.language .toggle{background:none;border:0;cursor:pointer;vertical-align:top;padding:0;height:15px}
.language ul{position:absolute;top:15px;right:0px;display:none;border:1px solid #282827;background:#3d3d3d;margin:0;padding:0}
.language li{list-style:none}
.language li button{display:block;width:61px;padding:3px 8px;font-size:9px;color:#cbcbcb;text-decoration:none;background:none;border:0;text-align:left;white-space:nowrap;cursor:pointer}
.gnb{position:absolute;top:82px;left:0;height:38px;white-space:nowrap;margin-bottom:10px}
.gnb ul{list-style:none;margin:0;padding:0;zoom:1}
.gnb ul:after{content:"";display:block;clear:both}
.gnb ul ul{display:none;position:absolute;left:0;top:38px;padding:5px 0;background:#333;border:1px solid #000;border-top:0}
.gnb li{list-style:none;float:left;background:url(../images/black/bgGnbVr.gif) no-repeat left center;padding-left:2px;position:relative;white-space:nowrap}
.gnb li.first{padding:0;background:none}
.gnb li li{float:none;background:none;padding:0;left:0}
.gnb li a{display:block;float:left;padding:13px 15px 0 15px;height:25px;color:#a6a6a6;white-space:nowrap;text-decoration:none}
.gnb li a:hover,
.gnb li a:focus{color:#fff}
.gnb li.active a{font-weight:bold;color:#fff;background:url(../images/black/bgGnbOn.gif) no-repeat center top}
.gnb li li a{float:none;display:block;padding:5px 15px !important;background:none !important;height:auto;font-weight:normal !important}
.gnb li li.active a{font-weight:bold !important}
.iSearch{position:absolute;top:48px;right:15px;width:214px;text-align:right}
.iSearch .iText{vertical-align:middle;position:relative;top:0;_top:-1px;left:1px;padding:3px 3px 1px 3px;width:94px;height:13px;color:#fff;border:1px solid #8E8E8D;background-color:#857C79}
.iSearch .iText:hover,
.iSearch .iText:focus{border:1px solid #B0B0AF;background-color:#A9A4A3}
.iSearch .submit{vertical-align:middle;_position:relative;_top:-1px}
/* Site Layout - Content Body */
.body{position:relative;z-index:1;padding-bottom:30px;overflow:hidden;background:url(../images/black/bgContentBody.gif) repeat-y left top;border-bottom:1px solid #515151;zoom:1}
.body:after{content:"";display:block;clear:both}
/* Site Layout - Column Left */
.lnb{position:relative;width:201px;float:left}
.lnb h2{margin:0}
.lnb h2 a{display:block;padding:10px 0 10px 20px;text-decoration:none;color:#eee}
.locNav{border-top:1px solid #515151;padding:4px 5px;width:190px;margin:0 0 1em 0;list-style:none}
.locNav li{padding:0 0 4px 0;vertical-align:top}
.locNav li a{padding:6px 5px 6px 13px;display:block;border:1px solid #565655;border-left:0;border-right:0;background:url(../images/black/bgLnbOff.gif) repeat-x;color:#c2c2c2;position:relative;z-index:99;text-decoration:none}
.locNav li.active a{color:#fff;background:#e61700;border:1px solid #ff1a00;border-left:0;border-right:0}
.locNav li ul{display:block;position:relative;width:184px;padding:0 3px;margin:0;position:relative;border-top:1px solid #3d3d3d;overflow:hidden}
.locNav li li{padding:0;border-top:1px solid #474747;position:relative;top:-1px}
.locNav li li a{padding:6px 5px 6px 10px;width:169px;color:#818181 !important;border:none;background:none !important;border:none !important}
.locNav li.active li.active a{color:#ff1a00 !important;font-weight:bold !important;background:url(../images/black/bulletLnb.gif) no-repeat 175px center !important}
/* Site Layout - Column Right */
.content{width:740px;float:right;overflow:hidden}
.xe_content{color:#ddd}
/* Site Layout - Footer */
.footer{border-top:3px solid #424242;padding:1em 0;clear:both}
.footer p{text-align:center;margin:0}
.footer a{color:#818181;font-size:.9em;text-decoration:none}

View file

@ -1,58 +0,0 @@
@charset "utf-8";
/* NAVER (developers@xpressengine.com) */
/* Default Skin - Start */
.selectLang{margin:0;padding:0}
/* Site Layout - Body Wrap */
html{background:#fff url(../images/default/bgBody.gif) repeat-x left top;font-family:Tahoma, Geneva, sans-serif}
.xe{width:960px;margin:1.5em auto 0 auto}
/* Site Layout - Header */
.header{position:relative;width:960px;height:120px;background:url(../images/default/bgHeader.jpg) no-repeat right top;margin-bottom:10px;z-index:2}
.body .header{width:auto;height:auto;background:none;margin:auto;z-index:1}
.header h1{margin:0;position:absolute;top:32px;left:25px}
.header h1 a{color:#fff;text-decoration:none}
.language{position:absolute;top:18px;right:19px;z-index:100}
.language strong{display:inline-block;height:15px;color:#fff;font:.75em/15px Tahoma;margin-right:3px;vertical-align:top}
.language .toggle{background:none;border:0;cursor:pointer;vertical-align:top;padding:0;height:15px}
.language ul{position:absolute;top:15px;right:0px;display:none;border:1px solid #b23628;background:#de4332;margin:0;padding:0}
.language li{list-style:none}
.language li button{display:block;width:61px;padding:3px 8px;font-size:9px;color:#fff;background:none;border:0;text-align:left;white-space:nowrap;cursor:pointer}
.gnb{position:absolute;top:82px;left:0;height:38px;white-space:nowrap;margin-bottom:10px}
.gnb ul{list-style:none;margin:0;padding:0;zoom:1}
.gnb ul:after{content:"";display:block;clear:both}
.gnb ul ul{display:none;position:absolute;left:0;top:38px;padding:5px 0;background:#666;border:1px solid #444;border-top:0}
.gnb li{float:left;list-style:none;background:url(../images/default/bgGnbVr.gif) no-repeat left center;padding-left:2px;position:relative;white-space:nowrap}
.gnb li.first{padding:0;background:none}
.gnb li li{float:none;background:none;padding:0;left:0}
.gnb li a{float:left;padding:13px 15px 0 15px;height:25px;color:#e8e8e8;white-space:nowrap;text-decoration:none}
.gnb li a:hover,
.gnb li a:active,
.gnb li a:focus{color:#fff}
.gnb li.active a{font-weight:bold;color:#fff;background:url(../images/default/bgGnbOn.gif) no-repeat center top}
.gnb li li a{float:none;display:block;padding:5px 15px !important;background:none !important;height:auto;font-weight:normal !important}
.gnb li li.active a{font-weight:bold !important}
.iSearch{position:absolute;top:48px;right:15px;width:214px;text-align:right}
.iSearch .iText{vertical-align:middle;position:relative;top:0;_top:-1px;left:1px;padding:3px 3px 1px 3px;width:94px;height:13px;color:#fff;border:1px solid #8E8E8D;background-color:#857C79}
.iSearch .iText:hover,
.iSearch .iText:focus{border:1px solid #B0B0AF;background-color:#A9A4A3}
.iSearch .submit{vertical-align:middle;_position:relative;_top:-1px}
/* Site Layout - Content Body */
.body{position:relative;z-index:1;padding-bottom:30px;background:url(../images/default/bgContentBody.gif) repeat-y left top;border-bottom:1px solid #ddd;zoom:1}
.body:after{content:"";display:block;clear:both}
/* Site Layout - Column Left */
.lnb{position:relative;width:201px;float:left}
.lnb h2{margin:0}
.lnb h2 a{display:block;padding:10px 0 10px 20px;text-decoration:none;color:#333}
.locNav{border-top:1px solid #ddd;padding:4px 5px;width:190px;margin:0 0 1em 0;list-style:none}
.locNav li{padding:0 0 4px 0;vertical-align:top}
.locNav li a{padding:6px 5px 6px 13px;display:block;border:1px solid #e8e8e8;border-left:0;border-right:0;background:url(../images/default/bgLnbOff.gif) repeat-x;color:#3e3e3e;position:relative;z-index:99;text-decoration:none}
.locNav li.active a{color:#fff;background:#de4332;border:1px solid #de4332;border-left:0;border-right:0}
.locNav li ul{display:block;position:relative;width:184px;padding:0 3px;margin:0;border-top:1px solid #fff;overflow:hidden}
.locNav li li{padding:0;border-top:1px solid #f2f2f2;position:relative;top:-1px}
.locNav li li a{padding:6px 5px 6px 10px;width:169px;color:#818181 !important;border:none;background:none !important;border:none !important}
.locNav li.active li.active a{color:#ff1a00 !important;font-weight:bold !important;background:url(../images/default/bulletLnb.gif) no-repeat 175px center !important}
/* Site Layout - Column Right */
.content{width:740px;float:right}
/* Site Layout - Footer */
.footer{border-top:3px solid #f4f4f4;padding:1em 0;clear:both}
.footer p{text-align:center;margin:0}
.footer a{color:#999;font-size:.9em;text-decoration:none}

View file

@ -1,54 +0,0 @@
@charset "utf-8";
/* NAVER (developers@xpressengine.com) */
/* Site Layout - Body Wrap */
body{background:#fff}
.xe{position:relative;width:960px;margin:0 auto;padding:1.5em 0 0 0;font-family:Tahoma, Geneva, sans-serif}
/* Site Layout - Header */
.header{position:relative;width:958px;height:114px;border-top:6px solid #323232;border-left:1px solid #d9d9d9;border-right:1px solid #d9d9d9;background:url(../images/white/bgHeader.png) no-repeat right bottom;margin-bottom:10px;z-index:2}
.header h1{margin:0;position:absolute;top:32px;left:25px}
.header h1 a{color:#333;text-decoration:none}
.language{position:absolute;top:12px;right:19px;z-index:100}
.language strong{display:inline-block;height:15px;color:#5c5c5c;font:.75em/15px Tahoma;margin-right:3px;vertical-align:top}
.language .toggle{background:none;border:0;cursor:pointer;vertical-align:top;padding:0;height:15px}
.language ul{position:absolute;top:15px;right:0px;display:none;border:1px solid #d9d9d9;background:#fff;margin:0;padding:0}
.language li{list-style:none}
.language li button{display:block;width:61px;padding:3px 8px;font-size:9px;color:#5c5c5c;text-decoration:none;background:none;border:0;text-align:left;white-space:nowrap;cursor:pointer}
.gnb{position:absolute;top:76px;left:0;height:38px;white-space:nowrap;margin-bottom:10px}
.gnb ul{list-style:none;margin:0;padding:0;zoom:1}
.gnb ul:after{content:"";display:block;clear:both}
.gnb ul ul{display:none;position:absolute;left:-1px;top:38px;padding:5px 0;background:#fff;border:1px solid #ddd;border-top:0}
.gnb li{list-style:none;float:left;background:url(../images/white/bgGnbVr.gif) no-repeat left center;padding-left:2px;position:relative;white-space:nowrap}
.gnb li.first{padding:0;background:none}
.gnb li li{float:none;background:none;padding:0;left:0}
.gnb li a{display:block;float:left;padding:13px 15px 0 15px;height:25px;color:#727272;white-space:nowrap;text-decoration:none}
.gnb li a:hover,
.gnb li a:focus{color:#000}
.gnb li.active a{font-weight:bold;color:#3f3f3f;background:url(../images/white/bgGnbOn.gif) no-repeat center top}
.gnb li li a{float:none;display:block;padding:5px 15px !important;background:none !important;height:auto;font-weight:normal !important}
.gnb li li.active a{font-weight:bold !important}
.iSearch{position:absolute;top:48px;right:15px;width:214px;text-align:right}
.iSearch .iText{vertical-align:middle;position:relative;top:0;_top:-1px;left:1px;padding:3px 3px 1px 3px;width:94px;height:13px;color:#000;border:1px solid #B0B0AF;background-color:#fff}
.iSearch .iText:hover,
.iSearch .iText:focus{border:1px solid #8E8E8D;background-color:#fff}
.iSearch .submit{vertical-align:middle;_position:relative;_top:-1px}
/* Site Layout - Content Body */
.body{position:relative;z-index:1;padding-bottom:30px;overflow:hidden;background:url(../images/white/bgContentBody.gif) repeat-y left top;border-bottom:1px solid #ddd;zoom:1}
.body:after{content:"";display:block;clear:both}
/* Site Layout - Column Left */
.lnb{position:relative;width:201px;float:left}
.lnb h2{margin:0}
.lnb h2 a{display:block;padding:10px 0 10px 20px;text-decoration:none;color:#333}
.locNav{border-top:1px solid #ddd;padding:4px 5px;width:190px;margin:0 0 1em 0;list-style:none}
.locNav li{padding:0 0 4px 0;vertical-align:top}
.locNav li a{padding:6px 5px 6px 13px;display:block;border:1px solid #e8e8e8;border-left:0;border-right:0;background:url(../images/white/bgLnbOff.gif) repeat-x;color:#3e3e3e;position:relative;z-index:99;text-decoration:none}
.locNav li.active a{color:#fff;background:#de4332;border:1px solid #de4332;border-left:0;border-right:0}
.locNav li ul{display:block;position:relative;width:184px;padding:0 3px;margin:0;position:relative;border-top:1px solid #fff;overflow:hidden}
.locNav li li{padding:0;border-top:1px solid #f2f2f2;position:relative;top:-1px}
.locNav li li a{padding:6px 5px 6px 10px;width:169px;color:#818181 !important;border:none;background:none !important;border:none !important}
.locNav li.active li.active a{color:#ff1a00 !important;font-weight:bold !important;background:url(../images/white/bulletLnb.gif) no-repeat 175px center !important}
/* Site Layout - Column Right */
.content{width:740px;float:right;overflow:hidden}
/* Site Layout - Footer */
.footer{border-top:3px solid #f4f4f4;padding:1em 0;clear:both}
.footer p{text-align:center;margin:0}
.footer a{color:#999;font-size:.9em;text-decoration:none}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 145 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 346 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Some files were not shown because too many files have changed in this diff Show more