diff --git a/.travis.yml b/.travis.yml index 72a55f5ad..3edfc71ff 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,4 +27,5 @@ script: - if [ $(phpenv version-name) != "5.3" ]; then ./vendor/bin/codecept run -d --fail-fast --env travis; fi notifications: slack: - secure: 0HhwktIb65zfge56E4yMfYj0Xj4GeYIaxvh/Obb13BK1/C8RdWBy6u213N5MQ2UHsxYk8wXXzynaCh4psegi2iPy9dbKmkdAdEQMzYoKE2xYVSqZveeVQm0sqFVXAlzggpgs/j5vtvKYjRkQKtTrz0C+p0uJ0bkLcyWGezWTpGc= + secure: jpoMjtkveVuPZM4JXJETAPv8QUCtTbI/ZTixdS9HUgxSb9tD2DkoekMaRzXYnXA82Les/gGxTC0fQFcFrls6Ypkbvp1udBPggmAdLiBHubBIz+yd1BGIf/l4I6MY1QmGe1Lx4xlnVlEgLnKXHn+W+ENep4/MzpCEaR9Vw8wfGqY= + secure: "gPv4qFmGcXimNlI/OeVk5n4VtRCWbAe7VUtw7Inb3A/ZZaVDo11gtMNkwo/JVKSnXqFkaCQYebcNpj2D9Rb2ZCwgjMSX6wxvpA4/8OLOZpbWqFW6Hz2RKNggubXlnalXkIwFcsvj70rKctbcJFk2C1G9rVvYWdVGD9X4/ozQtAc=" diff --git a/README.md b/README.md index a96a87e1b..f629e1077 100644 --- a/README.md +++ b/README.md @@ -1,57 +1,9 @@ -XpressEngine +XpressEngine With XETOWN ============ +develop 브랜치에서 쓸만한 PR Merge! -[![Build Status](https://travis-ci.org/xpressengine/xe-core.svg?branch=master)](https://travis-ci.org/xpressengine/xe-core) -[![License](http://img.shields.io/badge/license-GNU%20LGPL-brightgreen.svg)](http://www.gnu.org/licenses/gpl.html) -[![Latest release](http://img.shields.io/github/release/xpressengine/xe-core.svg)](https://github.com/xpressengine/xe-core/releases) +xe core 새버전이 나오면 master 브랜치에서 Merge후 develop 브랜치와 최종 Merge! -XpressEngine(XE)은 누구나 쉽고 편하고 자유롭게 콘텐츠를 발행을 할 수 있도록 하기 위한 CMS(Content Management System)입니다. -오픈소스 라이선스로 누구나 사용 또는 개작할 수 있으며, 개방형 프로젝트로서 누구나 개발에 참여할 수 있습니다. +develop 브랜치에서 커밋 가능. (소스수정) -### 확장형 구조 - -XE 코어는 모듈, 애드온, 에디터 컴포넌트, 위젯, 레이아웃의 구조를 기반으로 결과물을 생성합니다. - -이렇게 각각의 기능과 디자인이 구조적으로 연결되는 모듈형 구조는 개발 및 유지보수를 쉽게 하도록 도와주며 관리자는 손쉽게 설정과 디자인을 변경할 수 있습니다. - -레이아웃, 모듈 스킨 그리고 위젯의 스타일과 스킨을 활용하면 여러분만의 개성을 가진 웹 사이트를 만들 수 있습니다. XE와 함께 더 다채롭고 개성있는 웹사이트를 만들어보세요! - -### 오픈 소스 소프트웨어! 열린 프로젝트! (코드 공헌 가이드) -많은 분들께서 개발, 디자인, 마크업 등의 전문 분야는 물론 다국어 번역, 문제점 보고 등 기능 개선 및 문제 해결을 위해 많은 노력을 해주시고 계십니다. - -참여를 원하시는 분들은 버그 신고/제안 혹은 Pull Request 전에 [CONTRIBUTING.md](./CONTRIBUTING.md) 문서를 먼저 읽어주시기 바랍니다. -XpressEngine은 여러분들의 개발 참여를 기다립니다. - -## Server Requirements -* PHP version 5.3.0 or greater (But recommend PHP >= 5.5.0) -* MYSQL version 4.1 or greater (But recommend MYSQL >= 5.x) , MS-SQL, CUBRID -* XML Library -* GD Library -* ICONV -* session.auto_start = Off (php.ini) - -## Maintainers -@akasima @bnu @jhyeon1010 @khongchi @findstar @ngleader - -## Contributors -http://www.xpressengine.com/contributors - -## Support -* Official site (Korean) : http://www.xpressengine.com/ - -## License -Copyright 2014 NAVER Corp. - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +참여하실 분들은 conory(conorycom@gmail.com) 에게 알려주시면 Collaborators 으로 등록해드리겠습니다. diff --git a/addons/adminlogging/adminlogging.addon.php b/addons/adminlogging/adminlogging.addon.php index bedc80195..42f5bd581 100644 --- a/addons/adminlogging/adminlogging.addon.php +++ b/addons/adminlogging/adminlogging.addon.php @@ -10,7 +10,7 @@ if(!defined('__XE__')) * @brief admin log */ $logged_info = Context::get('logged_info'); -if($logged_info && $logged_info->is_admin == 'Y' && stripos(Context::get('act'), 'admin') !== false && $called_position == 'before_module_proc') +if(Context::get('is_logged') && $logged_info->is_admin == 'Y' && stripos(Context::get('act'), 'admin') !== false && $called_position == 'before_module_proc') { $oAdminloggingController = getController('adminlogging'); $oAdminloggingController->insertLog($this->module, $this->act); diff --git a/addons/member_communication/member_communication.addon.php b/addons/member_communication/member_communication.addon.php index 8986d8b59..0c660c1e9 100644 --- a/addons/member_communication/member_communication.addon.php +++ b/addons/member_communication/member_communication.addon.php @@ -14,12 +14,13 @@ if(!defined('__XE__')) * - When caliing MemberModel::getMemberMenu, feature to add a friend is added */ // Stop if non-logged-in user is -$logged_info = Context::get('logged_info'); -if(!$logged_info|| isCrawler()) +if(!Context::get('is_logged') || isCrawler()) { return; } +$logged_info = Context::get('logged_info'); + /** * Message/Friend munus are added on the pop-up window and member profile. Check if a new message is received * */ diff --git a/addons/member_extra_info/member_extra_info.lib.php b/addons/member_extra_info/member_extra_info.lib.php index 07ef8963f..64b0015a4 100644 --- a/addons/member_extra_info/member_extra_info.lib.php +++ b/addons/member_extra_info/member_extra_info.lib.php @@ -21,8 +21,14 @@ function memberTransImageName($matches) $oMemberModel = getModel('member'); $nick_name = $matches[5]; + // Initialize global variable for cache + if(!isset($GLOBALS['_transImageNameList'][$member_srl])) + { + $GLOBALS['_transImageNameList'][$member_srl] = new stdClass(); + } $_tmp = &$GLOBALS['_transImageNameList'][$member_srl]; - // If pre-defined data in the global variablesm return it + + // If pre-defined data in the global variables, return it if(!$_tmp->cached) { $_tmp->cached = true; @@ -31,7 +37,8 @@ function memberTransImageName($matches) if(file_exists(_XE_PATH_ . $image_name_file)) { - $_tmp->image_name_file = $image_name_file; + $_tmp->image_name_file = $image_name_file . '?' . date('YmdHis', filemtime(_XE_PATH_ . $image_name_file)); + $image_name_file = $_tmp->image_name_file; } else { @@ -40,7 +47,8 @@ function memberTransImageName($matches) if(file_exists(_XE_PATH_ . $image_mark_file)) { - $_tmp->image_mark_file = $image_mark_file; + $_tmp->image_mark_file = $image_mark_file . '?' . date('YmdHis', filemtime(_XE_PATH_ . $image_mark_file)); + $image_mark_file = $_tmp->image_mark_file; } else { diff --git a/addons/mobile/classes/hdml.class.php b/addons/mobile/classes/hdml.class.php index 868df7faa..7e67ce3f5 100644 --- a/addons/mobile/classes/hdml.class.php +++ b/addons/mobile/classes/hdml.class.php @@ -8,9 +8,9 @@ class wap extends mobileXE { /** * @brief constructor **/ - function wap() + function __construct() { - parent::mobileXE(); + parent::__construct(); } /** diff --git a/addons/mobile/classes/mhtml.class.php b/addons/mobile/classes/mhtml.class.php index 43e472a35..250878d11 100644 --- a/addons/mobile/classes/mhtml.class.php +++ b/addons/mobile/classes/mhtml.class.php @@ -9,9 +9,9 @@ class wap extends mobileXE /** * @brief constructor **/ - function wap() + function __construct() { - parent::mobileXE(); + parent::__construct(); } /** diff --git a/addons/mobile/classes/mobile.class.php b/addons/mobile/classes/mobile.class.php index fa5f612e0..53951e99e 100644 --- a/addons/mobile/classes/mobile.class.php +++ b/addons/mobile/classes/mobile.class.php @@ -76,7 +76,7 @@ class mobileXE /** * @brief constructor */ - function mobileXE() + function __construct() { // Check navigation mode if(Context::get('nm')) diff --git a/addons/mobile/classes/wml.class.php b/addons/mobile/classes/wml.class.php index aee5b3965..d46c976a7 100644 --- a/addons/mobile/classes/wml.class.php +++ b/addons/mobile/classes/wml.class.php @@ -8,9 +8,9 @@ class wap extends mobileXE /** * @brief constructor */ - function wap() + function __construct() { - parent::mobileXE(); + parent::__construct(); } /** diff --git a/addons/point_level_icon/point_level_icon.lib.php b/addons/point_level_icon/point_level_icon.lib.php index 3eb2a61d8..9dd9e3054 100644 --- a/addons/point_level_icon/point_level_icon.lib.php +++ b/addons/point_level_icon/point_level_icon.lib.php @@ -7,15 +7,17 @@ function pointLevelIconTrans($matches) { $member_srl = $matches[3]; - if($member_srl < 1) + // If anonymous or not member_srl go to Hide Point Icon + if($member_srl < 1||!$member_srl) { return $matches[0]; } $orig_text = preg_replace('/' . preg_quote($matches[5], '/') . '<\/' . $matches[6] . '>$/', '', $matches[0]); - // Check Group Image Mark $oMemberModel = getModel('member'); + + // Check Group Image Mark if($oMemberModel->getGroupImageMark($member_srl)) { return $orig_text . $matches[5] . ''; diff --git a/classes/cache/CacheApc.class.php b/classes/cache/CacheApc.class.php index b8499d7a6..0d8683eb6 100644 --- a/classes/cache/CacheApc.class.php +++ b/classes/cache/CacheApc.class.php @@ -30,7 +30,7 @@ class CacheApc extends CacheBase * * @return void */ - function CacheApc() + function __construct() { } diff --git a/classes/cache/CacheFile.class.php b/classes/cache/CacheFile.class.php index 5942960f9..ff1afb4d5 100644 --- a/classes/cache/CacheFile.class.php +++ b/classes/cache/CacheFile.class.php @@ -6,7 +6,7 @@ * * Filedisk Cache Handler * - * @author NAVER (developers@xpressengine.com) + * @author NAVER (developers@xpressengine.com) */ class CacheFile extends CacheBase { @@ -35,7 +35,7 @@ class CacheFile extends CacheBase * * @return void */ - function CacheFile() + function __construct() { $this->cache_dir = _XE_PATH_ . $this->cache_dir; FileHandler::makeDir($this->cache_dir); @@ -78,31 +78,32 @@ class CacheFile extends CacheBase $content[] = 'if(!defined(\'__XE__\')) { exit(); }'; $content[] = 'return \'' . addslashes(serialize($obj)) . '\';'; FileHandler::writeFile($cache_file, implode(PHP_EOL, $content)); - if(function_exists('opcache_invalidate')) - { - @opcache_invalidate($cache_file, true); - } + if(function_exists('opcache_invalidate')) + { + @opcache_invalidate($cache_file, true); + } } /** * Return whether cache is valid or invalid * * @param string $key Cache key - * @param int $modified_time Not used + * @param int $modified_time Unix time of data modified. + * If stored time is older then modified time, return false. * @return bool Return true on valid or false on invalid. */ function isValid($key, $modified_time = 0) { $cache_file = $this->getCacheFileName($key); - + if(file_exists($cache_file)) { - if($modified_time > 0 && filemtime($cache_file) < $modified_timed) - { - FileHandler::removeFile($cache_file); - return false; - } - + if($modified_time > 0 && filemtime($cache_file) < $modified_time) + { + FileHandler::removeFile($cache_file); + return false; + } + return true; } @@ -113,24 +114,25 @@ class CacheFile extends CacheBase * Fetch a stored variable from the cache * * @param string $key The $key used to store the value. - * @param int $modified_time Not used + * @param int $modified_time Unix time of data modified. + * If stored time is older then modified time, return false. * @return false|mixed Return false on failure. Return the string associated with the $key on success. */ function get($key, $modified_time = 0) { - if(!$cache_file = FileHandler::exists($this->getCacheFileName($key))) - { - return false; - } - - if($modified_time > 0 && filemtime($cache_file) < $modified_timed) + if(!$cache_file = FileHandler::exists($this->getCacheFileName($key))) { - FileHandler::removeFile($cache_file); return false; } - $content = include($cache_file); - + if($modified_time > 0 && filemtime($cache_file) < $modified_time) + { + FileHandler::removeFile($cache_file); + return false; + } + + $content = include($cache_file); + return unserialize(stripslashes($content)); } @@ -143,10 +145,10 @@ class CacheFile extends CacheBase function _delete($_key) { $cache_file = $this->getCacheFileName($_key); - if(function_exists('opcache_invalidate')) - { - @opcache_invalidate($cache_file, true); - } + if(function_exists('opcache_invalidate')) + { + @opcache_invalidate($cache_file, true); + } FileHandler::removeFile($cache_file); } @@ -169,6 +171,7 @@ class CacheFile extends CacheBase function truncate() { FileHandler::removeFilesInDir($this->cache_dir); + return true; } } diff --git a/classes/cache/CacheHandler.class.php b/classes/cache/CacheHandler.class.php index a3740b8ec..39a038999 100644 --- a/classes/cache/CacheHandler.class.php +++ b/classes/cache/CacheHandler.class.php @@ -49,7 +49,7 @@ class CacheHandler extends Handler * @param boolean $always_use_file If set true, use a file cache always * @return CacheHandler */ - function CacheHandler($target, $info = null, $always_use_file = false) + function __construct($target, $info = null, $always_use_file = false) { if(!$info) { @@ -69,6 +69,11 @@ class CacheHandler extends Handler $type = 'memcache'; $url = $info->use_object_cache; } + else if(substr($info->use_object_cache, 0, 5) == 'redis') + { + $type = 'redis'; + $url = $info->use_object_cache; + } else if($info->use_object_cache == 'wincache') { $type = 'wincache'; @@ -93,6 +98,11 @@ class CacheHandler extends Handler $type = 'memcache'; $url = $info->use_template_cache; } + else if(substr($info->use_template_cache, 0, 5) == 'redis') + { + $type = 'redis'; + $url = $info->use_template_cache; + } else if($info->use_template_cache == 'wincache') { $type = 'wincache'; diff --git a/classes/cache/CacheMemcache.class.php b/classes/cache/CacheMemcache.class.php index 6869ff838..b37019ab6 100644 --- a/classes/cache/CacheMemcache.class.php +++ b/classes/cache/CacheMemcache.class.php @@ -13,6 +13,7 @@ class CacheMemcache extends CacheBase * @var Memcahe */ var $Memcache; + var $SelectedExtension; /** * Get instance of CacheMemcache @@ -36,11 +37,24 @@ class CacheMemcache extends CacheBase * @param string $url url of memcache * @return void */ - function CacheMemcache($url) + function __construct($url) { //$config['url'] = array('memcache://localhost:11211'); $config['url'] = is_array($url) ? $url : array($url); - $this->Memcache = new Memcache; + if(class_exists('Memcached')) + { + $this->Memcache = new Memcached; + $this->SelectedExtension = 'Memcached'; + } + elseif(class_exists('Memcache')) + { + $this->Memcache = new Memcache; + $this->SelectedExtension = 'Memcache'; + } + else + { + return false; + } foreach($config['url'] as $url) { @@ -58,19 +72,21 @@ class CacheMemcache extends CacheBase { if(isset($GLOBALS['XE_MEMCACHE_SUPPORT'])) { - return true; + return $GLOBALS['XE_MEMCACHE_SUPPORT']; } - if($this->Memcache->set('xe', 'xe', MEMCACHE_COMPRESSED, 1)) + if($this->SelectedExtension === 'Memcached') { - $GLOBALS['XE_MEMCACHE_SUPPORT'] = true; + return $GLOBALS['XE_MEMCACHE_SUPPORT'] = $this->Memcache->set('xe', 'xe', 1); + } + elseif($this->SelectedExtension === 'Memcache') + { + return $GLOBALS['XE_MEMCACHE_SUPPORT'] = $this->Memcache->set('xe', 'xe', MEMCACHE_COMPRESSED, 1); } else { - $GLOBALS['XE_MEMCACHE_SUPPORT'] = false; + return $GLOBALS['XE_MEMCACHE_SUPPORT'] = false; } - - return $GLOBALS['XE_MEMCACHE_SUPPORT']; } /** @@ -108,7 +124,14 @@ class CacheMemcache extends CacheBase $valid_time = $this->valid_time; } - return $this->Memcache->set($this->getKey($key), array($_SERVER['REQUEST_TIME'], $buff), MEMCACHE_COMPRESSED, $valid_time); + if($this->SelectedExtension === 'Memcached') + { + return $this->Memcache->set($this->getKey($key), array($_SERVER['REQUEST_TIME'], $buff), $valid_time); + } + else + { + return $this->Memcache->set($this->getKey($key), array($_SERVER['REQUEST_TIME'], $buff), MEMCACHE_COMPRESSED, $valid_time); + } } /** diff --git a/classes/cache/CacheRedis.class.php b/classes/cache/CacheRedis.class.php new file mode 100644 index 000000000..df8f53cf8 --- /dev/null +++ b/classes/cache/CacheRedis.class.php @@ -0,0 +1,248 @@ + */ + +/** + * Cache class for Redis + * + * @author NAVER (developer@xpressengine.com) + */ +class CacheRedis extends CacheBase +{ + /** + * instance of Redis + * @var redis + */ + var $redis; + var $status; + + /** + * Get instance of CacheRedis + * + * @param string $url url of Redis + * @return CacheRedis instance of CacheRedis + */ + function getInstance($url) + { + if(!$GLOBALS['__CacheRedis__']) + { + $GLOBALS['__CacheRedis__'] = new CacheRedis($url); + } + return $GLOBALS['__CacheRedis__']; + } + + /** + * Construct + * + * Do not use this directly. You can use getInstance() instead. + * @param string $url url of Redis + * @return void + */ + function CacheRedis($url) + { + //$config['url'] = 'redis://localhost:6379/1'; + $config['url'] = is_array($url) ? reset($url) : $url; + + if(!class_exists('Redis')) + { + return $this->status = false; + } + + try + { + $this->redis = new Redis; + $info = parse_url($url); + $this->redis->connect($info['host'], $info['port'], 0.15); + if(isset($info['user']) || isset($info['pass'])) + { + $this->redis->auth(isset($info['user']) ? $info['user'] : $info['pass']); + } + if(isset($info['path']) && $dbnum = intval(substr($info['path'], 1))) + { + $this->redis->select($dbnum); + } + return $this->status = true; + } + catch(RedisException $e) + { + return $this->status = false; + } + } + + /** + * Return whether support or not support cache + * + * @return bool Return true on support or false on not support + */ + function isSupport() + { + if($this->status !== null) + { + return $this->status; + } + + try + { + return $this->redis->setex('xe', 1, 'xe'); + } + catch(RedisException $e) + { + return $this->status = false; + } + } + + /** + * Get unique key of given key by path of XE + * + * @param string $key Cache key + * @return string Return unique key + */ + function getKey($key) + { + static $prefix = null; + if($prefix === null) + { + $prefix = substr(sha1(_XE_PATH_), 0, 12) . ':'; + } + return $prefix . $key; + } + + /** + * Store data at the server + * + * CacheRedis::put() stores an item $buff with $key on the Redis server. + * Parameter $valid_time is expiration time in seconds. If it's 0, the item never expires + * (but Redis server doesn't guarantee this item to be stored all the time, it could be delete from the cache to make place for other items). + * + * Remember that resource variables (i.e. file and connection descriptors) cannot be stored in the cache, + * because they can not be adequately represented in serialized state. + * + * @param string $key The key that will be associated with the item. + * @param mixed $buff The variable to store. Strings and integers are stored as is, other types are stored serialized. + * @param int $valid_time Expiration time of the item. + * You can also use Unix timestamp or a number of seconds starting from current time, but in the latter case the number of seconds may not exceed 2592000 (30 days). + * If it's equal to zero, use the default valid time CacheRedis::valid_time. + * @return bool Returns true on success or false on failure. + */ + function put($key, $buff, $valid_time = 0) + { + if($valid_time > 60 * 60 * 24 * 30) + { + $valid_time = $valid_time - time(); + } + if($valid_time <= 0) + { + $valid_time = $this->valid_time; + } + + try + { + return $this->redis->setex($this->getKey($key), $valid_time, serialize(array($_SERVER['REQUEST_TIME'], $buff))); + } + catch(RedisException $e) + { + return $this->status = false; + } + } + + /** + * Return whether cache is valid or invalid + * + * @param string $key Cache key + * @param int $modified_time Unix time of data modified. + * If stored time is older then modified time, the data is invalid. + * @return bool Return true on valid or false on invalid. + */ + function isValid($key, $modified_time = 0) + { + $_key = $this->getKey($key); + $obj = $this->redis->get($_key); + $obj = $obj ? unserialize($obj) : false; + if(!$obj || !is_array($obj)) + { + return false; + } + unset($obj[1]); + + if($modified_time > 0 && $modified_time > $obj[0]) + { + $this->redis->del($_key); + return false; + } + + return true; + } + + /** + * Retrieve item from the server + * + * CacheRedis::get() returns previously stored data if an item with such $key exists on the server at this moment. + * + * @param string $key The key to fetch + * @param int $modified_time Unix time of data modified. + * If stored time is older then modified time, return false. + * @return false|mixed Return false on failure or older then modified time. Return the string associated with the $key on success. + */ + function get($key, $modified_time = 0) + { + $_key = $this->getKey($key); + $obj = $this->redis->get($_key); + $obj = $obj ? unserialize($obj) : false; + if(!$obj || !is_array($obj)) + { + return false; + } + + if($modified_time > 0 && $modified_time > $obj[0]) + { + $this->redis->del($_key); + return false; + } + + return $obj[1]; + } + + /** + * Delete item from the server + * + * CacheRedis::delete() deletes an item with tey $key. + * + * @param string $key The key associated with the item to delete. + * @return void + */ + function delete($key) + { + $_key = $this->getKey($key); + + try + { + $this->redis->del($_key); + } + catch(RedisException $e) + { + return $this->status = false; + } + } + + /** + * Flush all existing items at the server + * + * CacheRedis::truncate() immediately invalidates all existing items. + * If using multiple databases, items in other databases are not affected. + * + * @return bool Returns true on success or false on failure. + */ + function truncate() + { + try + { + return $this->redis->flushDB(); + } + catch(RedisException $e) + { + return $this->status = false; + } + } + +} +/* End of file CacheRedis.class.php */ +/* Location: ./classes/cache/CacheRedis.class.php */ diff --git a/classes/cache/CacheWincache.class.php b/classes/cache/CacheWincache.class.php index 072f968d4..8e902231c 100644 --- a/classes/cache/CacheWincache.class.php +++ b/classes/cache/CacheWincache.class.php @@ -32,7 +32,7 @@ class CacheWincache extends CacheBase * * @return void */ - function CacheWincache() + function __construct() { } diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php index cd4265b1f..0c5421a98 100644 --- a/classes/context/Context.class.php +++ b/classes/context/Context.class.php @@ -159,7 +159,7 @@ class Context * * @return object Instance */ - function &getInstance() + public static function &getInstance() { static $theInstance = null; if(!$theInstance) @@ -175,7 +175,7 @@ class Context * * @return void */ - function Context() + public function __construct() { $this->oFrontEndFileHandler = new FrontEndFileHandler(); $this->get_vars = new stdClass(); @@ -198,10 +198,18 @@ class Context * @see This function should be called only once * @return void */ - function init() + public function init() { - if(!isset($GLOBALS['HTTP_RAW_POST_DATA']) && version_compare(PHP_VERSION, '5.6.0', '>=') === true) { - if(simplexml_load_string(file_get_contents("php://input")) !== false) $GLOBALS['HTTP_RAW_POST_DATA'] = file_get_contents("php://input"); + // fix missing HTTP_RAW_POST_DATA in PHP 5.6 and above + if(!isset($GLOBALS['HTTP_RAW_POST_DATA']) && version_compare(PHP_VERSION, '5.6.0', '>=') === TRUE) + { + $GLOBALS['HTTP_RAW_POST_DATA'] = file_get_contents("php://input"); + + // If content is not XML JSON, unset + if(!preg_match('/^[\<\{\[]/', $GLOBALS['HTTP_RAW_POST_DATA']) && strpos($_SERVER['CONTENT_TYPE'], 'json') === FALSE && strpos($_SERVER['HTTP_CONTENT_TYPE'], 'json') === FALSE) + { + unset($GLOBALS['HTTP_RAW_POST_DATA']); + } } // set context variables in $GLOBALS (to use in display handler) @@ -333,8 +341,29 @@ class Context ); } - if($sess = $_POST[session_name()]) session_id($sess); - session_start(); + // start session if it was previously started + $session_name = session_name(); + $session_id = NULL; + if($session_id = $_POST[$session_name]) + { + session_id($session_id); + } + else + { + $session_id = $_COOKIE[$session_name]; + } + + if($session_id !== NULL || $this->db_info->cache_friendly != 'Y') + { + $this->setCacheControl(0, false); + session_start(); + } + else + { + $this->setCacheControl(-1, true); + register_shutdown_function(array($this, 'checkSessionStatus')); + $_SESSION = array(); + } // set authentication information in Context and session if(self::isInstalled()) @@ -359,7 +388,10 @@ class Context } $this->set('is_logged', $oMemberModel->isLogged()); - $this->set('logged_info', $oMemberModel->getLoggedInfo()); + if($oMemberModel->isLogged()) + { + $this->set('logged_info', $oMemberModel->getLoggedInfo()); + } } } @@ -420,22 +452,78 @@ class Context } } + /** + * Get the session status + * + * @return bool + */ + public static function getSessionStatus() + { + return (session_id() !== ''); + } + + /** + * Start the session if $_SESSION was touched + * + * @return void + */ + public static function checkSessionStatus($force_start = false) + { + is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); + + if($self->getSessionStatus()) + { + return; + } + if($force_start || (count($_SESSION) && !headers_sent())) + { + $tempSession = $_SESSION; + unset($_SESSION); + session_start(); + $_SESSION = $tempSession; + } + } + /** * Finalize using resources, such as DB connection * * @return void */ - function close() + public static function close() { session_write_close(); } + /** + * set Cache-Control header + * + * @return void + */ + public static function setCacheControl($ttl = 0, $public = true) + { + if($ttl == 0) + { + header('Cache-Control: ' . ($public ? 'public, ' : 'private, ') . 'must-revalidate, post-check=0, pre-check=0, no-store, no-cache'); + header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); + header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); + } + elseif($ttl == -1) + { + header('Cache-Control: ' . ($public ? 'public, ' : 'private, ') . 'must-revalidate, post-check=0, pre-check=0'); + } + else + { + header('Cache-Control: ' . ($public ? 'public, ' : 'private, ') . 'must-revalidate, max-age=' . (int)$ttl); + header('Expires: ' . gmdate('D, d M Y H:i:s', time() + (int)$ttl) . ' GMT'); + } + } + /** * Load the database information * * @return void */ - function loadDBInfo() + public static function loadDBInfo() { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); @@ -498,7 +586,7 @@ class Context $db_info->use_db_session = 'N'; if(!$db_info->use_ssl) $db_info->use_ssl = 'none'; - $this->set('_use_ssl', $db_info->use_ssl); + $self->set('_use_ssl', $db_info->use_ssl); $self->set('_http_port', ($db_info->http_port) ? $db_info->http_port : NULL); $self->set('_https_port', ($db_info->https_port) ? $db_info->https_port : NULL); @@ -519,7 +607,7 @@ class Context * * @return string DB's db_type */ - function getDBType() + public static function getDBType() { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); return $self->db_info->master_db["db_type"]; @@ -531,7 +619,7 @@ class Context * @param object $db_info DB information * @return void */ - function setDBInfo($db_info) + public static function setDBInfo($db_info) { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); $self->db_info = $db_info; @@ -542,7 +630,7 @@ class Context * * @return object DB information */ - function getDBInfo() + public static function getDBInfo() { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); return $self->db_info; @@ -553,7 +641,7 @@ class Context * * @return object SSL status (Optional - none|always|optional) */ - function getSslStatus() + public static function getSslStatus() { $dbInfo = self::getDBInfo(); return $dbInfo->use_ssl; @@ -564,7 +652,7 @@ class Context * * @return string Default URL */ - function getDefaultUrl() + public static function getDefaultUrl() { $db_info = self::getDBInfo(); return $db_info->default_url; @@ -575,7 +663,7 @@ class Context * * @return array Supported languages */ - function loadLangSupported() + public static function loadLangSupported() { static $lang_supported = null; if(!$lang_supported) @@ -596,7 +684,7 @@ class Context * * @return array Selected languages */ - function loadLangSelected() + public static function loadLangSelected() { static $lang_selected = null; if(!$lang_selected) @@ -634,7 +722,7 @@ class Context * * @return bool True : Module handling is necessary in the control path of current request , False : Otherwise */ - function checkSSO() + public function checkSSO() { // pass if it's not GET request or XE is not yet installed if($this->db_info->use_sso != 'Y' || isCrawler()) @@ -659,41 +747,68 @@ class Context $default_url .= '/'; } - // for sites recieving SSO valdiation - if($default_url == self::getRequestUri()) - { - if(self::get('default_url')) - { - $url = base64_decode(self::get('default_url')); - $url_info = parse_url($url); - $url_info['query'].= ($url_info['query'] ? '&' : '') . 'SSOID=' . session_id(); - $redirect_url = sprintf('%s://%s%s%s?%s', $url_info['scheme'], $url_info['host'], $url_info['port'] ? ':' . $url_info['port'] : '', $url_info['path'], $url_info['query']); - header('location:' . $redirect_url); - return FALSE; - } - // for sites requesting SSO validation - } - else - { - // result handling : set session_name() - if($session_name = self::get('SSOID')) - { - setcookie(session_name(), $session_name); + // Get current site information (only the base URL, not the full URL) + $current_site = self::getRequestUri(); - $url = preg_replace('/([\?\&])$/', '', str_replace('SSOID=' . $session_name, '', self::getRequestUrl())); - header('location:' . $url); - return FALSE; - // send SSO request - } - else if(!self::get('SSOID') && $_COOKIE['sso'] != md5(self::getRequestUri())) - { - setcookie('sso', md5(self::getRequestUri()), 0, '/'); - $url = sprintf("%s?default_url=%s", $default_url, base64_encode(self::getRequestUrl())); - header('location:' . $url); - return FALSE; - } + // Step 1: if the current site is not the default site, send SSO validation request to the default site + if($default_url !== $current_site && !self::get('SSOID') && $_COOKIE['sso'] !== md5($current_site)) + { + // Set sso cookie to prevent multiple simultaneous SSO validation requests + setcookie('sso', md5($current_site), 0, '/'); + + // Redirect to the default site + $redirect_url = sprintf('%s?return_url=%s', $default_url, urlencode(base64_encode($current_site))); + header('Location:' . $redirect_url); + return FALSE; } + // Step 2: receive and process SSO validation request at the default site + if($default_url === $current_site && self::get('return_url')) + { + // Get the URL of the origin site + $url = base64_decode(self::get('return_url')); + $url_info = parse_url($url); + + // Check that the origin site is a valid site in this XE installation (to prevent open redirect vuln) + if(!getModel('module')->getSiteInfoByDomain(rtrim($url, '/'))->site_srl) + { + htmlHeader(); + echo self::getLang("msg_invalid_request"); + htmlFooter(); + return FALSE; + } + + // Redirect back to the origin site + $url_info['query'] .= ($url_info['query'] ? '&' : '') . 'SSOID=' . session_id(); + $redirect_url = sprintf('%s://%s%s%s%s', $url_info['scheme'], $url_info['host'], $url_info['port'] ? (':' . $url_info['port']) : '', $url_info['path'], ($url_info['query'] ? ('?' . $url_info['query']) : '')); + header('Location:' . $redirect_url); + return FALSE; + } + + // Step 3: back at the origin site, set session ID to be the same as the default site + if($default_url !== $current_site && self::get('SSOID')) + { + // Check that the session ID was given by the default site (to prevent session fixation CSRF) + if(isset($_SERVER['HTTP_REFERER']) && strpos($_SERVER['HTTP_REFERER'], $default_url) !== 0) + { + htmlHeader(); + echo self::getLang("msg_invalid_request"); + htmlFooter(); + return FALSE; + } + + // Set session ID + setcookie(session_name(), self::get('SSOID')); + + // Finally, redirect to the originally requested URL + $url_info = parse_url(self::getRequestUrl()); + $url_info['query'] = preg_replace('/(^|\b)SSOID=([^&?]+)/', '', $url_info['query']); + $redirect_url = sprintf('%s://%s%s%s%s', $url_info['scheme'], $url_info['host'], $url_info['port'] ? (':' . $url_info['port']) : '', $url_info['path'], ($url_info['query'] ? ('?' . $url_info['query']) : '')); + header('Location:' . $redirect_url); + return FALSE; + } + + // If none of the conditions above apply, proceed normally return TRUE; } @@ -702,7 +817,7 @@ class Context * * @return bool True: FTP information is registered, False: otherwise */ - function isFTPRegisted() + public static function isFTPRegisted() { return file_exists(self::getFTPConfigFile()); } @@ -712,7 +827,7 @@ class Context * * @return object FTP information */ - function getFTPInfo() + public static function getFTPInfo() { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); @@ -732,7 +847,7 @@ class Context * @param string $site_title Browser title to be added * @return void */ - function addBrowserTitle($site_title) + public static function addBrowserTitle($site_title) { if(!$site_title) { @@ -756,7 +871,7 @@ class Context * @param string $site_title Browser title to be set * @return void */ - function setBrowserTitle($site_title) + public static function setBrowserTitle($site_title) { if(!$site_title) { @@ -771,7 +886,7 @@ class Context * * @return string Browser title(htmlspecialchars applied) */ - function getBrowserTitle() + public static function getBrowserTitle() { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); @@ -785,7 +900,7 @@ class Context * Return layout's title * @return string layout's title */ - public function getSiteTitle() + public static function getSiteTitle() { $oModuleModel = getModel('module'); $moduleConfig = $oModuleModel->getModuleConfig('module'); @@ -801,7 +916,7 @@ class Context * Get browser title * @deprecated */ - function _getBrowserTitle() + public function _getBrowserTitle() { return $this->getBrowserTitle(); } @@ -812,7 +927,7 @@ class Context * @param string $path Path of the language file * @return void */ - function loadLang($path) + public static function loadLang($path) { global $lang; @@ -857,7 +972,7 @@ class Context * @param string Path of the language file * @return void */ - function _evalxmlLang($path) + public function _evalxmlLang($path) { global $lang; @@ -891,7 +1006,7 @@ class Context * @param string $path Path of the language file * @return string file name */ - function _loadXmlLang($path) + public function _loadXmlLang($path) { if(!$path) return; @@ -905,7 +1020,7 @@ class Context * @param string $path Path of the language file * @return string file name */ - function _loadPhpLang($path) + public function _loadPhpLang($path) { if(!$path) return; @@ -935,14 +1050,17 @@ class Context * @param string $lang_type Language type. * @return void */ - function setLangType($lang_type = 'ko') + public static function setLangType($lang_type = 'ko') { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); $self->lang_type = $lang_type; $self->set('lang_type', $lang_type); - $_SESSION['lang_type'] = $lang_type; + if($self->getSessionStatus()) + { + $_SESSION['lang_type'] = $lang_type; + } } /** @@ -950,7 +1068,7 @@ class Context * * @return string Language type */ - function getLangType() + public static function getLangType() { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); return $self->lang_type; @@ -962,7 +1080,7 @@ class Context * @param string $code Language variable name * @return string If string for the code exists returns it, otherwise returns original code */ - function getLang($code) + public static function getLang($code) { if(!$code) { @@ -982,7 +1100,7 @@ class Context * @param string $val `$code`s value * @return void */ - function setLang($code, $val) + public static function setLang($code, $val) { if(!isset($GLOBALS['lang'])) { @@ -997,7 +1115,7 @@ class Context * @param object $source_obj Conatins strings to convert * @return object converted object */ - function convertEncoding($source_obj) + public static function convertEncoding($source_obj) { $charset_list = array( 'UTF-8', 'EUC-KR', 'CP949', 'ISO8859-1', 'EUC-JP', 'SHIFT_JIS', 'CP932', @@ -1038,7 +1156,7 @@ class Context * @see arrayConvWalkCallback will replaced array_walk_recursive in >=PHP5 * @return void */ - function checkConvertFlag(&$val, $key = null, $charset = null) + public static function checkConvertFlag(&$val, $key = null, $charset = null) { static $flag = TRUE; if($charset) @@ -1065,7 +1183,7 @@ class Context * @see arrayConvWalkCallback will replaced array_walk_recursive in >=PHP5 * @return object converted object */ - function doConvertEncoding(&$val, $key = null, $charset) + public static function doConvertEncoding(&$val, $key = null, $charset) { if (is_array($val)) { @@ -1080,7 +1198,7 @@ class Context * @param string $str String to convert * @return string converted string */ - function convertEncodingStr($str) + public static function convertEncodingStr($str) { if(!$str) return null; $obj = new stdClass(); @@ -1107,7 +1225,7 @@ class Context * @param string $method Response method. [HTML|XMLRPC|JSON] * @return void */ - function setResponseMethod($method = 'HTML') + public static function setResponseMethod($method = 'HTML') { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); @@ -1120,7 +1238,7 @@ class Context * * @return string Response method. If it's not set, returns request method. */ - function getResponseMethod() + public static function getResponseMethod() { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); @@ -1141,7 +1259,7 @@ class Context * @param string $type Request method. (Optional - GET|POST|XMLRPC|JSON) * @return void */ - function setRequestMethod($type = '') + public static function setRequestMethod($type = '') { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); @@ -1159,7 +1277,7 @@ class Context * * @return void */ - function _checkGlobalVars() + public function _checkGlobalVars() { $this->_recursiveCheckVar($_SERVER['HTTP_HOST']); @@ -1171,11 +1289,11 @@ class Context } /** - * handle request areguments for GET/POST + * handle request arguments for GET/POST * * @return void */ - function _setRequestArgument() + public function _setRequestArgument() { if(!count($_REQUEST)) { @@ -1218,7 +1336,7 @@ class Context } } - function _recursiveCheckVar($val) + public function _recursiveCheckVar($val) { if(is_string($val)) { @@ -1245,7 +1363,7 @@ class Context * * @return void */ - function _setJSONRequestArgument() + public function _setJSONRequestArgument() { if($this->getRequestMethod() != 'JSON') { @@ -1266,7 +1384,7 @@ class Context * * @return void */ - function _setXmlRpcArgument() + public function _setXmlRpcArgument() { if($this->getRequestMethod() != 'XMLRPC') { @@ -1357,7 +1475,7 @@ class Context * @param string $do_stripslashes Whether to strip slashes * @return mixed filtered value. Type are string or array */ - function _filterRequestVar($key, $val, $do_stripslashes = 1) + public function _filterRequestVar($key, $val, $do_stripslashes = 1) { if(!($isArray = is_array($val))) { @@ -1404,7 +1522,7 @@ class Context * * @return bool True: exists, False: otherwise */ - function isUploaded() + public static function isUploaded() { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); return $self->is_uploaded; @@ -1415,7 +1533,7 @@ class Context * * @return void */ - function _setUploadedArgument() + public function _setUploadedArgument() { if($_SERVER['REQUEST_METHOD'] != 'POST' || !$_FILES || (stripos($_SERVER['CONTENT_TYPE'], 'multipart/form-data') === FALSE && stripos($_SERVER['HTTP_CONTENT_TYPE'], 'multipart/form-data') === FALSE)) { @@ -1458,7 +1576,7 @@ class Context * Return request method * @return string Request method type. (Optional - GET|POST|XMLRPC|JSON) */ - function getRequestMethod() + public static function getRequestMethod() { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); return $self->request_method; @@ -1468,7 +1586,7 @@ class Context * Return request URL * @return string request URL */ - function getRequestUrl() + public static function getRequestUrl() { static $url = null; if(is_null($url)) @@ -1490,7 +1608,7 @@ class Context * Return js callback func. * @return string callback func. */ - function getJSCallbackFunc() + public static function getJSCallbackFunc() { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); $js_callback_func = isset($_GET['xe_js_callback']) ? $_GET['xe_js_callback'] : $_POST['xe_js_callback']; @@ -1515,7 +1633,7 @@ class Context * @param bool $autoEncode If TRUE, url encode automatically, detailed. Use this option, $encode value should be TRUE * @return string URL */ - function getUrl($num_args = 0, $args_list = array(), $domain = null, $encode = TRUE, $autoEncode = FALSE) + public static function getUrl($num_args = 0, $args_list = array(), $domain = null, $encode = TRUE, $autoEncode = FALSE) { static $site_module_info = null; static $current_info = null; @@ -1757,7 +1875,7 @@ class Context * @param string $domain Domain * @retrun string converted URL */ - function getRequestUri($ssl_mode = FOLLOW_REQUEST_SSL, $domain = null) + public static function getRequestUri($ssl_mode = FOLLOW_REQUEST_SSL, $domain = null) { static $url = array(); @@ -1856,7 +1974,7 @@ class Context * @param mixed $set_to_get_vars If not FALSE, Set to get vars. * @return void */ - function set($key, $val, $set_to_get_vars = 0) + public static function set($key, $val, $set_to_get_vars = 0) { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); $self->context->{$key} = $val; @@ -1881,7 +1999,7 @@ class Context * @param string $key Key * @return string Key */ - function get($key) + public static function get($key) { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); @@ -1897,7 +2015,7 @@ class Context * * @return object */ - function gets() + public static function gets() { $num_args = func_num_args(); if($num_args < 1) @@ -1920,7 +2038,7 @@ class Context * * @return object All data */ - function getAll() + public static function getAll() { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); return $self->context; @@ -1931,7 +2049,7 @@ class Context * * @return Object Request variables. */ - function getRequestVars() + public static function getRequestVars() { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); if($self->get_vars) @@ -1947,7 +2065,7 @@ class Context * @param string $action act name * @return void */ - function addSSLAction($action) + public static function addSSLAction($action) { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); @@ -1971,7 +2089,7 @@ class Context * @param string $action act name * @return void */ - function addSSLActions($action_array) + public static function addSSLActions($action_array) { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); @@ -1999,7 +2117,7 @@ class Context * @param string $action act name * @return void */ - function subtractSSLAction($action) + public static function subtractSSLAction($action) { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); @@ -2017,7 +2135,7 @@ class Context * * @return string acts in array */ - function getSSLActions() + public static function getSSLActions() { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); if($self->getSslStatus() == 'optional') @@ -2032,7 +2150,7 @@ class Context * @param string $action act name * @return bool If SSL exists, return TRUE. */ - function isExistsSSLAction($action) + public static function isExistsSSLAction($action) { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); return isset($self->ssl_actions[$action]); @@ -2045,7 +2163,7 @@ class Context * @param string $file file path * @return string normalized file path */ - function normalizeFilePath($file) + public static function normalizeFilePath($file) { if($file{0} != '/' && $file{0} != '.' && strpos($file, '://') === FALSE) { @@ -2067,7 +2185,7 @@ class Context * @param string $file file path * @return string Converted file path */ - function getAbsFileUrl($file) + public static function getAbsFileUrl($file) { $file = self::normalizeFilePath($file); if(strpos($file, './') === 0) @@ -2098,7 +2216,7 @@ class Context * $args[3]: index * */ - function loadFile($args) + public static function loadFile($args) { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); @@ -2113,7 +2231,7 @@ class Context * @param string $media Media query * @return void */ - function unloadFile($file, $targetIe = '', $media = 'all') + public static function unloadFile($file, $targetIe = '', $media = 'all') { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); $self->oFrontEndFileHandler->unloadFile($file, $targetIe, $media); @@ -2125,7 +2243,7 @@ class Context * @param string $type Unload target (optional - all|css|js) * @return void */ - function unloadAllFiles($type = 'all') + public static function unloadAllFiles($type = 'all') { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); $self->oFrontEndFileHandler->unloadAllFiles($type); @@ -2144,7 +2262,7 @@ class Context * @param string $autoPath If path not readed, set the path automatically. * @return void */ - function addJsFile($file, $optimized = FALSE, $targetie = '', $index = 0, $type = 'head', $isRuleset = FALSE, $autoPath = null) + public static function addJsFile($file, $optimized = FALSE, $targetie = '', $index = 0, $type = 'head', $isRuleset = FALSE, $autoPath = null) { if($isRuleset) { @@ -2174,7 +2292,7 @@ class Context * @param string $targetie target IE * @return void */ - function unloadJsFile($file, $optimized = FALSE, $targetie = '') + public static function unloadJsFile($file, $optimized = FALSE, $targetie = '') { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); $self->oFrontEndFileHandler->unloadFile($file, $targetie); @@ -2185,7 +2303,7 @@ class Context * * @return void */ - function unloadAllJsFiles() + public static function unloadAllJsFiles() { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); $self->oFrontEndFileHandler->unloadAllFiles('js'); @@ -2198,7 +2316,7 @@ class Context * @param string $filename File name * @return void */ - function addJsFilter($path, $filename) + public static function addJsFilter($path, $filename) { $oXmlFilter = new XmlJSFilter($path, $filename); $oXmlFilter->compile(); @@ -2211,7 +2329,7 @@ class Context * @param array $files File list * @return array File list */ - function _getUniqueFileList($files) + public static function _getUniqueFileList($files) { ksort($files); $files = array_values($files); @@ -2234,7 +2352,7 @@ class Context * @param string $type Added position. (head:.., body:..) * @return array Returns javascript file list. Array contains file, targetie. */ - function getJsFile($type = 'head') + public static function getJsFile($type = 'head') { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); return $self->oFrontEndFileHandler->getJsFileList($type); @@ -2252,7 +2370,7 @@ class Context * @return void * */ - function addCSSFile($file, $optimized = FALSE, $media = 'all', $targetie = '', $index = 0) + public static function addCSSFile($file, $optimized = FALSE, $media = 'all', $targetie = '', $index = 0) { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); $self->oFrontEndFileHandler->loadFile(array($file, $media, $targetie, $index)); @@ -2268,7 +2386,7 @@ class Context * @param string $targetie target IE * @return void */ - function unloadCSSFile($file, $optimized = FALSE, $media = 'all', $targetie = '') + public static function unloadCSSFile($file, $optimized = FALSE, $media = 'all', $targetie = '') { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); $self->oFrontEndFileHandler->unloadFile($file, $targetie, $media); @@ -2279,7 +2397,7 @@ class Context * * @return void */ - function unloadAllCSSFiles() + public static function unloadAllCSSFiles() { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); $self->oFrontEndFileHandler->unloadAllFiles('css'); @@ -2290,7 +2408,7 @@ class Context * * @return array Returns css file list. Array contains file, media, targetie. */ - function getCSSFile() + public static function getCSSFile() { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); return $self->oFrontEndFileHandler->getCssFileList(); @@ -2301,7 +2419,7 @@ class Context * @param string $pluginName * @return stdClass */ - function getJavascriptPluginInfo($pluginName) + public static function getJavascriptPluginInfo($pluginName) { if($plugin_name == 'ui.datepicker') { @@ -2356,7 +2474,7 @@ class Context * @param string $plugin_name plugin name * @return void */ - function loadJavascriptPlugin($plugin_name) + public static function loadJavascriptPlugin($plugin_name) { static $loaded_plugins = array(); @@ -2414,13 +2532,13 @@ class Context * @param string $header add html code before . * @return void */ - function addHtmlHeader($header) + public static function addHtmlHeader($header) { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); $self->html_header .= "\n" . $header; } - function clearHtmlHeader() + public static function clearHtmlHeader() { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); $self->html_header = ''; @@ -2431,7 +2549,7 @@ class Context * * @return string Added html code before */ - function getHtmlHeader() + public static function getHtmlHeader() { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); return $self->html_header; @@ -2442,7 +2560,7 @@ class Context * * @param string $class_name class name */ - function addBodyClass($class_name) + public static function addBodyClass($class_name) { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); $self->body_class[] = $class_name; @@ -2453,7 +2571,7 @@ class Context * * @return string Return class to html body */ - function getBodyClass() + public static function getBodyClass() { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); $self->body_class = array_unique($self->body_class); @@ -2466,7 +2584,7 @@ class Context * * @param string $header Add html code after */ - function addBodyHeader($header) + public static function addBodyHeader($header) { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); $self->body_header .= "\n" . $header; @@ -2477,7 +2595,7 @@ class Context * * @return string Added html code after */ - function getBodyHeader() + public static function getBodyHeader() { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); return $self->body_header; @@ -2488,7 +2606,7 @@ class Context * * @param string $footer Add html code before */ - function addHtmlFooter($footer) + public static function addHtmlFooter($footer) { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); $self->html_footer .= ($self->Htmlfooter ? "\n" : '') . $footer; @@ -2499,7 +2617,7 @@ class Context * * @return string Added html code before */ - function getHtmlFooter() + public static function getHtmlFooter() { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); return $self->html_footer; @@ -2510,7 +2628,7 @@ class Context * * @retrun string The path of the config file that contains database settings */ - function getConfigFile() + public static function getConfigFile() { return _XE_PATH_ . 'files/config/db.config.php'; } @@ -2520,7 +2638,7 @@ class Context * * @return string The path of the config file that contains FTP settings */ - function getFTPConfigFile() + public static function getFTPConfigFile() { return _XE_PATH_ . 'files/config/ftp.config.php'; } @@ -2530,7 +2648,7 @@ class Context * * @return bool True if the config file exists, otherwise FALSE. */ - function isInstalled() + public static function isInstalled() { return FileHandler::hasContent(self::getConfigFile()); } @@ -2541,7 +2659,7 @@ class Context * @param string Transforms codes * @return string Transforms codes */ - function transContent($content) + public static function transContent($content) { return $content; } @@ -2551,7 +2669,7 @@ class Context * * @return bool True if it is allowed to use rewrite mod, otherwise FALSE */ - function isAllowRewrite() + public static function isAllowRewrite() { $oContext = self::getInstance(); return $oContext->allow_rewrite; @@ -2563,7 +2681,7 @@ class Context * @param string $path URL path * @return string Converted path */ - function pathToUrl($path) + public static function pathToUrl($path) { $xe = _XE_PATH_; $path = strtr($path, "\\", "/"); @@ -2618,7 +2736,7 @@ class Context * Get meta tag * @return array The list of meta tags */ - function getMetaTag() + public static function getMetaTag() { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); @@ -2645,7 +2763,7 @@ class Context * @param mixed $is_http_equiv value of http_equiv * @return void */ - function addMetaTag($name, $content, $is_http_equiv = FALSE) + public static function addMetaTag($name, $content, $is_http_equiv = FALSE) { is_a($this, 'Context') ? $self = $this : $self = self::getInstance(); $self->meta_tags[$name . "\t" . ($is_http_equiv ? '1' : '0')] = $content; diff --git a/classes/db/DB.class.php b/classes/db/DB.class.php index 3594fb2ed..81a9047ed 100644 --- a/classes/db/DB.class.php +++ b/classes/db/DB.class.php @@ -1,11 +1,6 @@ */ -if(!defined('__XE_LOADED_DB_CLASS__')) -{ - define('__XE_LOADED_DB_CLASS__', 1); -} - /** * - DB parent class * - usage of db in XE is via xml @@ -190,7 +185,7 @@ class DB * constructor * @return void */ - function DB() + function __construct() { $this->count_cache_path = _XE_PATH_ . $this->count_cache_path; $this->cache_file = _XE_PATH_ . $this->cache_file; @@ -215,16 +210,18 @@ class DB */ function getEnableList() { - if(!$this->supported_list) + is_a($this, 'DB') ? $self = $this : $self = self::getInstance(); + + if(!$self->supported_list) { $oDB = new DB(); - $this->supported_list = $oDB->_getSupportedList(); + $self->supported_list = $oDB->_getSupportedList(); } $enableList = array(); - if(is_array($this->supported_list)) + if(is_array($self->supported_list)) { - foreach($this->supported_list AS $key => $value) + foreach($self->supported_list AS $key => $value) { if($value->enable) { @@ -242,16 +239,18 @@ class DB */ function getDisableList() { - if(!$this->supported_list) + is_a($this, 'DB') ? $self = $this : $self = self::getInstance(); + + if(!$self->supported_list) { $oDB = new DB(); - $this->supported_list = $oDB->_getSupportedList(); + $self->supported_list = $oDB->_getSupportedList(); } $disableList = array(); - if(is_array($this->supported_list)) + if(is_array($self->supported_list)) { - foreach($this->supported_list AS $key => $value) + foreach($self->supported_list AS $key => $value) { if(!$value->enable) { @@ -1090,7 +1089,7 @@ class DB * this method is protected * @return boolean */ - function _begin() + function _begin($transactionLevel = 0) { return TRUE; } @@ -1118,7 +1117,7 @@ class DB * this method is protected * @return boolean */ - function _rollback() + function _rollback($transactionLevel = 0) { return TRUE; } diff --git a/classes/db/DBCubrid.class.php b/classes/db/DBCubrid.class.php index fc977d81a..ff856ec2b 100644 --- a/classes/db/DBCubrid.class.php +++ b/classes/db/DBCubrid.class.php @@ -49,7 +49,7 @@ class DBCubrid extends DB * constructor * @return void */ - function DBCubrid() + function __construct() { $this->_setDBInfo(); $this->_connect(); @@ -144,7 +144,7 @@ class DBCubrid extends DB * this method is private * @return boolean */ - function _begin($transactionLevel) + function _begin($transactionLevel = 0) { if(__CUBRID_VERSION__ >= '8.4.0') { @@ -167,7 +167,7 @@ class DBCubrid extends DB * this method is private * @return boolean */ - function _rollback($transactionLevel) + function _rollback($transactionLevel = 0) { $connection = $this->_getConnection('master'); @@ -539,6 +539,68 @@ class DBCubrid extends DB $this->_query($query); } + /** + * Modify a column (only supported in CUBRID 8.4 and above, otherwise returns false) + * @param string $table_name table name + * @param string $column_name column name + * @param string $type column type, default value is 'number' + * @param int $size column size + * @param string|int $default default value + * @param boolean $notnull not null status, default value is false + * @return bool + */ + function modifyColumn($table_name, $column_name, $type = 'number', $size = '', $default = '', $notnull = FALSE) + { + if(!version_compare(__CUBRID_VERSION__, '8.4.0', '>=')) + { + return false; + } + + $type = strtoupper($this->column_type[$type]); + if($type == 'INTEGER') + { + $size = ''; + } + + $query = sprintf("alter class \"%s%s\" modify \"%s\" ", $this->prefix, $table_name, $column_name); + + if($type == 'char' || $type == 'varchar') + { + if($size) + { + $size = $size * 3; + } + } + + if($size) + { + $query .= sprintf("%s(%s) ", $type, $size); + } + else + { + $query .= sprintf("%s ", $type); + } + + if($default) + { + if($type == 'INTEGER' || $type == 'BIGINT' || $type == 'INT') + { + $query .= sprintf("default %d ", $default); + } + else + { + $query .= sprintf("default '%s' ", $default); + } + } + + if($notnull) + { + $query .= "not null "; + } + + return $this->_query($query) ? true : false; + } + /** * Check column exist status of the table * @param string $table_name table name @@ -567,6 +629,62 @@ class DBCubrid extends DB return $output; } + /** + * Get information about a column + * @param string $table_name table name + * @param string $column_name column name + * @return object + */ + function getColumnInfo($table_name, $column_name) + { + $query = sprintf("select * from \"db_attribute\" where " . "\"attr_name\" ='%s' and \"class_name\" = '%s%s'", $column_name, $this->prefix, $table_name); + $result = $this->_query($query); + if($this->isError()) + { + return; + } + $output = $this->_fetch($result); + if($output) + { + $dbtype = strtolower($output->data_type); + if($dbtype === 'string') $dbtype = 'character varying'; + $size = ($output->prec > 0) ? $output->prec : null; + if($xetype = array_search("$dbtype($size)", $this->column_type)) + { + $dbtype = "$dbtype($size)"; + $size = null; + } + elseif($size !== null) + { + if($xetype = array_search($dbtype, $this->column_type)) + { + if($size % 3 == 0) $size = intval($size / 3); + } + else + { + $xetype = $dbtype; + } + } + else + { + $xetype = $dbtype; + $size = null; + } + return (object)array( + 'name' => $output->attr_name, + 'dbtype' => $dbtype, + 'xetype' => $xetype, + 'size' => $size, + 'default_value' => $output->default_value, + 'notnull' => !$output->is_nullable, + ); + } + else + { + return false; + } + } + /** * Add an index to the table * $target_columns = array(col1, col2) diff --git a/classes/db/DBMssql.class.php b/classes/db/DBMssql.class.php index 32adb251c..b9e7aa1e7 100644 --- a/classes/db/DBMssql.class.php +++ b/classes/db/DBMssql.class.php @@ -42,7 +42,7 @@ class DBMssql extends DB * Constructor * @return void */ - function DBMssql() + function __construct() { $this->_setDBInfo(); $this->_connect(); @@ -113,7 +113,7 @@ class DBMssql extends DB * this method is private * @return boolean */ - function _begin($transactionLevel) + function _begin($transactionLevel = 0) { $connection = $this->_getConnection('master'); @@ -136,7 +136,7 @@ class DBMssql extends DB * this method is private * @return boolean */ - function _rollback($transactionLevel) + function _rollback($transactionLevel = 0) { $connection = $this->_getConnection('master'); @@ -389,7 +389,7 @@ class DBMssql extends DB $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); @@ -423,10 +423,50 @@ class DBMssql extends DB { return; } - $query = sprintf("alter table %s%s drop %s ", $this->prefix, $table_name, $column_name); + $query = sprintf("alter table %s%s drop column \"%s\" ", $this->prefix, $table_name, $column_name); $this->_query($query); } + /** + * Modify a column + * @param string $table_name table name + * @param string $column_name column name + * @param string $type column type, default value is 'number' + * @param int $size column size + * @param string|int $default default value + * @param boolean $notnull not null status, default value is false + * @return bool + */ + function modifyColumn($table_name, $column_name, $type = 'number', $size = '', $default = '', $notnull = false) + { + $type = $this->column_type[$type]; + if(strtoupper($type) == 'INTEGER') + { + $size = ''; + } + + $query = sprintf("alter table %s%s alter column %s ", $this->prefix, $table_name, $column_name); + if($size) + { + $query .= sprintf(" %s(%s) ", $type, $size); + } + else + { + $query .= sprintf(" %s ", $type); + } + + if($default) + { + $query .= sprintf(" default '%s' ", $default); + } + if($notnull) + { + $query .= " not null "; + } + + return $this->_query($query) ? true : false; + } + /** * Check column exist status of the table * @param string $table_name table name @@ -448,7 +488,67 @@ class DBMssql extends DB } return true; } - + + /** + * Get information about a column + * @param string $table_name table name + * @param string $column_name column name + * @return object + */ + function getColumnInfo($table_name, $column_name) + { + $query = sprintf("select syscolumns.name as name, systypes.name as type_name, syscolumns.length as length, " . + "syscolumns.isnullable as isnullable, syscomments.text as default_value from syscolumns " . + "inner join sysobjects on sysobjects.id = syscolumns.id " . + "inner join systypes on systypes.xtype = syscolumns.xtype " . + "left join syscomments on syscolumns.cdefault = syscomments.id " . + "where sysobjects.name = '%s%s' and syscolumns.name = '%s'", $this->prefix, $table_name, $column_name); + $result = $this->_query($query); + if($this->isError()) + { + return; + } + $output = $this->_fetch($result); + if($output) + { + $dbtype = $output->type_name; + $size = ($output->length > 0) ? $output->length : null; + if($xetype = array_search("$dbtype($size)", $this->column_type)) + { + $dbtype = "$dbtype($size)"; + $size = null; + } + elseif($size !== null) + { + if($xetype = array_search($dbtype, $this->column_type)) + { + // no-op + } + else + { + $xetype = $dbtype; + } + } + else + { + $xetype = $dbtype; + $size = null; + } + return (object)array( + 'name' => $output->name, + 'dbtype' => $dbtype, + 'xetype' => $xetype, + 'size' => $size, + 'default_value' => $output->default_value, + 'notnull' => !$output->isnullable, + ); + } + else + { + return false; + } + } + /** * Add an index to the table * $target_columns = array(col1, col2) diff --git a/classes/db/DBMysql.class.php b/classes/db/DBMysql.class.php index 2e9bf606c..2be81f1e5 100644 --- a/classes/db/DBMysql.class.php +++ b/classes/db/DBMysql.class.php @@ -43,7 +43,7 @@ class DBMysql extends DB * Constructor * @return void */ - function DBMysql() + function __construct() { $this->_setDBInfo(); $this->_connect(); @@ -147,7 +147,7 @@ class DBMysql extends DB * this method is private * @return boolean */ - function _begin() + function _begin($transactionLevel = 0) { return true; } @@ -157,7 +157,7 @@ class DBMysql extends DB * this method is private * @return boolean */ - function _rollback() + function _rollback($transactionLevel = 0) { return true; } @@ -340,6 +340,45 @@ class DBMysql extends DB $this->_query($query); } + /** + * Modify a column + * @param string $table_name table name + * @param string $column_name column name + * @param string $type column type, default value is 'number' + * @param int $size column size + * @param string|int $default default value + * @param boolean $notnull not null status, default value is false + * @return bool + */ + function modifyColumn($table_name, $column_name, $type = 'number', $size = '', $default = '', $notnull = false) + { + $type = $this->column_type[$type]; + if(strtoupper($type) == 'INTEGER') + { + $size = ''; + } + + $query = sprintf("alter table `%s%s` modify `%s` ", $this->prefix, $table_name, $column_name); + if($size) + { + $query .= sprintf(" %s(%s) ", $type, $size); + } + else + { + $query .= sprintf(" %s ", $type); + } + if($default) + { + $query .= sprintf(" default '%s' ", $default); + } + if($notnull) + { + $query .= " not null "; + } + + return $this->_query($query) ? true : false; + } + /** * Check column exist status of the table * @param string $table_name table name @@ -370,6 +409,61 @@ class DBMysql extends DB return false; } + /** + * Get information about a column + * @param string $table_name table name + * @param string $column_name column name + * @return object + */ + function getColumnInfo($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()) + { + return; + } + $output = $this->_fetch($result); + if($output) + { + $dbtype = $output->{'Type'}; + if($xetype = array_search($dbtype, $this->column_type)) + { + $size = null; + } + elseif(strpos($dbtype, '(') !== false) + { + list($dbtype, $size) = explode('(', $dbtype, 2); + $size = intval(rtrim($size, ')')); + if($xetype = array_search($dbtype, $this->column_type)) + { + // no-op + } + else + { + $xetype = $dbtype; + } + } + else + { + $xetype = $dbtype; + $size = null; + } + return (object)array( + 'name' => $output->{'Field'}, + 'dbtype' => $dbtype, + 'xetype' => $xetype, + 'size' => $size, + 'default_value' => $output->{'Default'}, + 'notnull' => strncmp($output->{'Null'}, 'NO', 2) == 0 ? true : false, + ); + } + else + { + return false; + } + } + /** * Add an index to the table * $target_columns = array(col1, col2) diff --git a/classes/db/DBMysql_innodb.class.php b/classes/db/DBMysql_innodb.class.php index affa59aab..bb8cc1b11 100644 --- a/classes/db/DBMysql_innodb.class.php +++ b/classes/db/DBMysql_innodb.class.php @@ -20,7 +20,7 @@ class DBMysql_innodb extends DBMysql * Constructor * @return void */ - function DBMysql_innodb() + function __construct() { $this->_setDBInfo(); $this->_connect(); @@ -51,7 +51,7 @@ class DBMysql_innodb extends DBMysql * this method is private * @return boolean */ - function _begin($transactionLevel) + function _begin($transactionLevel = 0) { $connection = $this->_getConnection('master'); @@ -71,7 +71,7 @@ class DBMysql_innodb extends DBMysql * this method is private * @return boolean */ - function _rollback($transactionLevel) + function _rollback($transactionLevel = 0) { $connection = $this->_getConnection('master'); diff --git a/classes/db/DBMysqli.class.php b/classes/db/DBMysqli.class.php index 58d25c852..bf06b1b1c 100644 --- a/classes/db/DBMysqli.class.php +++ b/classes/db/DBMysqli.class.php @@ -20,7 +20,7 @@ class DBMysqli extends DBMysql * Constructor * @return void */ - function DBMysqli() + function __construct() { $this->_setDBInfo(); $this->_connect(); diff --git a/classes/db/DBMysqli_innodb.class.php b/classes/db/DBMysqli_innodb.class.php index 55422b61f..511bc18e6 100644 --- a/classes/db/DBMysqli_innodb.class.php +++ b/classes/db/DBMysqli_innodb.class.php @@ -20,7 +20,7 @@ class DBMysqli_innodb extends DBMysql * Constructor * @return void */ - function DBMysqli_innodb() + function __construct() { $this->_setDBInfo(); $this->_connect(); @@ -85,7 +85,7 @@ class DBMysqli_innodb extends DBMysql * this method is private * @return boolean */ - function _begin($transactionLevel) + function _begin($transactionLevel = 0) { $connection = $this->_getConnection('master'); @@ -105,7 +105,7 @@ class DBMysqli_innodb extends DBMysql * this method is private * @return boolean */ - function _rollback($transactionLevel) + function _rollback($transactionLevel = 0) { $connection = $this->_getConnection('master'); diff --git a/classes/db/queryparts/Query.class.php b/classes/db/queryparts/Query.class.php index 729fdfff2..85c499a14 100644 --- a/classes/db/queryparts/Query.class.php +++ b/classes/db/queryparts/Query.class.php @@ -94,7 +94,7 @@ class Query extends Object * @param string $priority * @return void */ - function Query($queryID = NULL + function __construct($queryID = NULL , $action = NULL , $columns = NULL , $tables = NULL diff --git a/classes/db/queryparts/Subquery.class.php b/classes/db/queryparts/Subquery.class.php index b9ff3b605..2a1390f2f 100644 --- a/classes/db/queryparts/Subquery.class.php +++ b/classes/db/queryparts/Subquery.class.php @@ -33,7 +33,7 @@ class Subquery extends Query * @param string $join_type * @return void */ - function Subquery($alias, $columns, $tables, $conditions, $groups, $orderby, $limit, $join_type = null) + function __construct($alias, $columns, $tables, $conditions, $groups, $orderby, $limit, $join_type = null) { $this->alias = $alias; diff --git a/classes/db/queryparts/condition/Condition.class.php b/classes/db/queryparts/condition/Condition.class.php index 10fd88e25..2e5968e10 100644 --- a/classes/db/queryparts/condition/Condition.class.php +++ b/classes/db/queryparts/condition/Condition.class.php @@ -41,7 +41,7 @@ class Condition * @param string $pipe * @return void */ - function Condition($column_name, $argument, $operation, $pipe) + function __construct($column_name, $argument, $operation, $pipe) { $this->column_name = $column_name; $this->argument = $argument; diff --git a/classes/db/queryparts/condition/ConditionGroup.class.php b/classes/db/queryparts/condition/ConditionGroup.class.php index 5906e4a2e..0c782c3e6 100644 --- a/classes/db/queryparts/condition/ConditionGroup.class.php +++ b/classes/db/queryparts/condition/ConditionGroup.class.php @@ -29,7 +29,7 @@ class ConditionGroup * @param string $pipe * @return void */ - function ConditionGroup($conditions, $pipe = "") + function __construct($conditions, $pipe = "") { $this->conditions = array(); foreach($conditions as $condition) diff --git a/classes/db/queryparts/condition/ConditionSubquery.class.php b/classes/db/queryparts/condition/ConditionSubquery.class.php index b338663f7..60c2808d7 100644 --- a/classes/db/queryparts/condition/ConditionSubquery.class.php +++ b/classes/db/queryparts/condition/ConditionSubquery.class.php @@ -17,9 +17,9 @@ class ConditionSubquery extends Condition * @param string $pipe * @return void */ - function ConditionSubquery($column_name, $argument, $operation, $pipe = "") + function __construct($column_name, $argument, $operation, $pipe = "") { - parent::Condition($column_name, $argument, $operation, $pipe); + parent::__construct($column_name, $argument, $operation, $pipe); $this->_value = $this->argument->toString(); } diff --git a/classes/db/queryparts/condition/ConditionWithArgument.class.php b/classes/db/queryparts/condition/ConditionWithArgument.class.php index 8c9919f92..4108ef49d 100644 --- a/classes/db/queryparts/condition/ConditionWithArgument.class.php +++ b/classes/db/queryparts/condition/ConditionWithArgument.class.php @@ -17,14 +17,14 @@ class ConditionWithArgument extends Condition * @param string $pipe * @return void */ - function ConditionWithArgument($column_name, $argument, $operation, $pipe = "") + function __construct($column_name, $argument, $operation, $pipe = "") { if($argument === null) { $this->_show = false; return; } - parent::Condition($column_name, $argument, $operation, $pipe); + parent::__construct($column_name, $argument, $operation, $pipe); $this->_value = $argument->getValue(); } diff --git a/classes/db/queryparts/condition/ConditionWithoutArgument.class.php b/classes/db/queryparts/condition/ConditionWithoutArgument.class.php index f4590475d..7b489d4a2 100644 --- a/classes/db/queryparts/condition/ConditionWithoutArgument.class.php +++ b/classes/db/queryparts/condition/ConditionWithoutArgument.class.php @@ -17,9 +17,9 @@ class ConditionWithoutArgument extends Condition * @param string $pipe * @return void */ - function ConditionWithoutArgument($column_name, $argument, $operation, $pipe = "") + function __construct($column_name, $argument, $operation, $pipe = "") { - parent::Condition($column_name, $argument, $operation, $pipe); + parent::__construct($column_name, $argument, $operation, $pipe); $tmpArray = array('in' => 1, 'notin' => 1, 'not_in' => 1); if(isset($tmpArray[$operation])) { diff --git a/classes/db/queryparts/expression/ClickCountExpression.class.php b/classes/db/queryparts/expression/ClickCountExpression.class.php index 05ac92e16..d91d66ccd 100644 --- a/classes/db/queryparts/expression/ClickCountExpression.class.php +++ b/classes/db/queryparts/expression/ClickCountExpression.class.php @@ -23,9 +23,9 @@ class ClickCountExpression extends SelectExpression * @param bool $click_count * @return void */ - function ClickCountExpression($column_name, $alias = NULL, $click_count = false) + function __construct($column_name, $alias = NULL, $click_count = false) { - parent::SelectExpression($column_name, $alias); + parent::__construct($column_name, $alias); if(!is_bool($click_count)) { diff --git a/classes/db/queryparts/expression/DeleteExpression.class.php b/classes/db/queryparts/expression/DeleteExpression.class.php index 7342c7412..24e93cf96 100644 --- a/classes/db/queryparts/expression/DeleteExpression.class.php +++ b/classes/db/queryparts/expression/DeleteExpression.class.php @@ -24,9 +24,9 @@ class DeleteExpression extends Expression * @param mixed $value * @return void */ - function DeleteExpression($column_name, $value) + function __construct($column_name, $value) { - parent::Expression($column_name); + parent::__construct($column_name); $this->value = $value; } diff --git a/classes/db/queryparts/expression/Expression.class.php b/classes/db/queryparts/expression/Expression.class.php index 1436f8995..7e29976da 100644 --- a/classes/db/queryparts/expression/Expression.class.php +++ b/classes/db/queryparts/expression/Expression.class.php @@ -27,7 +27,7 @@ class Expression * @param string $column_name * @return void */ - function Expression($column_name) + function __construct($column_name) { $this->column_name = $column_name; } diff --git a/classes/db/queryparts/expression/InsertExpression.class.php b/classes/db/queryparts/expression/InsertExpression.class.php index 16bd5e72f..fa64b1af2 100644 --- a/classes/db/queryparts/expression/InsertExpression.class.php +++ b/classes/db/queryparts/expression/InsertExpression.class.php @@ -23,9 +23,9 @@ class InsertExpression extends Expression * @param object $argument * @return void */ - function InsertExpression($column_name, $argument) + function __construct($column_name, $argument) { - parent::Expression($column_name); + parent::__construct($column_name); $this->argument = $argument; } diff --git a/classes/db/queryparts/expression/SelectExpression.class.php b/classes/db/queryparts/expression/SelectExpression.class.php index 173a222c4..5c0447c77 100644 --- a/classes/db/queryparts/expression/SelectExpression.class.php +++ b/classes/db/queryparts/expression/SelectExpression.class.php @@ -30,9 +30,9 @@ class SelectExpression extends Expression * @param string $alias * @return void */ - function SelectExpression($column_name, $alias = NULL) + function __construct($column_name, $alias = NULL) { - parent::Expression($column_name); + parent::__construct($column_name); $this->column_alias = $alias; } diff --git a/classes/db/queryparts/expression/StarExpression.class.php b/classes/db/queryparts/expression/StarExpression.class.php index 589f8f0b3..3318d9543 100644 --- a/classes/db/queryparts/expression/StarExpression.class.php +++ b/classes/db/queryparts/expression/StarExpression.class.php @@ -16,9 +16,9 @@ class StarExpression extends SelectExpression * constructor, set the column to asterisk * @return void */ - function StarExpression() + function __construct() { - parent::SelectExpression("*"); + parent::__construct("*"); } function getArgument() diff --git a/classes/db/queryparts/expression/UpdateExpression.class.php b/classes/db/queryparts/expression/UpdateExpression.class.php index c95b6324c..ffe8146bf 100644 --- a/classes/db/queryparts/expression/UpdateExpression.class.php +++ b/classes/db/queryparts/expression/UpdateExpression.class.php @@ -23,9 +23,9 @@ class UpdateExpression extends Expression * @param object $argument * @return void */ - function UpdateExpression($column_name, $argument) + function __construct($column_name, $argument) { - parent::Expression($column_name); + parent::__construct($column_name); $this->argument = $argument; } diff --git a/classes/db/queryparts/expression/UpdateExpressionWithoutArgument.class.php b/classes/db/queryparts/expression/UpdateExpressionWithoutArgument.class.php index dd1831ede..5c025162e 100644 --- a/classes/db/queryparts/expression/UpdateExpressionWithoutArgument.class.php +++ b/classes/db/queryparts/expression/UpdateExpressionWithoutArgument.class.php @@ -23,9 +23,9 @@ class UpdateExpressionWithoutArgument extends UpdateExpression * @param object $argument * @return void */ - function UpdateExpressionWithoutArgument($column_name, $argument) + function __construct($column_name, $argument) { - parent::Expression($column_name); + parent::__construct($column_name, $argument); $this->argument = $argument; } diff --git a/classes/db/queryparts/limit/Limit.class.php b/classes/db/queryparts/limit/Limit.class.php index 5dfbf855d..5e660c4d6 100644 --- a/classes/db/queryparts/limit/Limit.class.php +++ b/classes/db/queryparts/limit/Limit.class.php @@ -40,7 +40,7 @@ class Limit * @param int $page_count * @return void */ - function Limit($list_count, $page = NULL, $page_count = NULL) + function __construct($list_count, $page = NULL, $page_count = NULL) { $this->list_count = $list_count; if($page) diff --git a/classes/db/queryparts/order/OrderByColumn.class.php b/classes/db/queryparts/order/OrderByColumn.class.php index c36a6fcf5..92bf4b947 100644 --- a/classes/db/queryparts/order/OrderByColumn.class.php +++ b/classes/db/queryparts/order/OrderByColumn.class.php @@ -27,7 +27,7 @@ class OrderByColumn * @param string $sort_order * @return void */ - function OrderByColumn($column_name, $sort_order) + function __construct($column_name, $sort_order) { $this->column_name = $column_name; $this->sort_order = $sort_order; diff --git a/classes/db/queryparts/table/CubridTableWithHint.class.php b/classes/db/queryparts/table/CubridTableWithHint.class.php index c43234066..a8b1e1640 100644 --- a/classes/db/queryparts/table/CubridTableWithHint.class.php +++ b/classes/db/queryparts/table/CubridTableWithHint.class.php @@ -34,9 +34,9 @@ class CubridTableWithHint extends Table * @param array $index_hints_list * @return void */ - function CubridTableWithHint($name, $alias = NULL, $index_hints_list) + function __construct($name, $alias = NULL, $index_hints_list) { - parent::Table($name, $alias); + parent::__construct($name, $alias); $this->index_hints_list = $index_hints_list; } diff --git a/classes/db/queryparts/table/IndexHint.class.php b/classes/db/queryparts/table/IndexHint.class.php index 665614902..4b80ecf97 100644 --- a/classes/db/queryparts/table/IndexHint.class.php +++ b/classes/db/queryparts/table/IndexHint.class.php @@ -27,7 +27,7 @@ class IndexHint * @param string $index_hint_type * @return void */ - function IndexHint($index_name, $index_hint_type) + function __construct($index_name, $index_hint_type) { $this->index_name = $index_name; $this->index_hint_type = $index_hint_type; diff --git a/classes/db/queryparts/table/JoinTable.class.php b/classes/db/queryparts/table/JoinTable.class.php index d216b4cad..0d6625728 100644 --- a/classes/db/queryparts/table/JoinTable.class.php +++ b/classes/db/queryparts/table/JoinTable.class.php @@ -32,9 +32,9 @@ class JoinTable extends Table * @param array $conditions * @return void */ - function JoinTable($name, $alias, $join_type, $conditions) + function __construct($name, $alias, $join_type, $conditions) { - parent::Table($name, $alias); + parent::__construct($name, $alias); $this->join_type = $join_type; $this->conditions = $conditions; } diff --git a/classes/db/queryparts/table/MssqlTableWithHint.class.php b/classes/db/queryparts/table/MssqlTableWithHint.class.php index ef880cfe6..edc49accc 100644 --- a/classes/db/queryparts/table/MssqlTableWithHint.class.php +++ b/classes/db/queryparts/table/MssqlTableWithHint.class.php @@ -34,9 +34,9 @@ class MssqlTableWithHint extends Table * @param string $index_hints_list * @return void */ - function MssqlTableWithHint($name, $alias = NULL, $index_hints_list) + function __construct($name, $alias = NULL, $index_hints_list) { - parent::Table($name, $alias); + parent::__construct($name, $alias); $this->index_hints_list = $index_hints_list; } diff --git a/classes/db/queryparts/table/MysqlTableWithHint.class.php b/classes/db/queryparts/table/MysqlTableWithHint.class.php index f37193323..1642ad7aa 100644 --- a/classes/db/queryparts/table/MysqlTableWithHint.class.php +++ b/classes/db/queryparts/table/MysqlTableWithHint.class.php @@ -34,9 +34,9 @@ class MysqlTableWithHint extends Table * @param string $index_hints_list * @return void */ - function MysqlTableWithHint($name, $alias = NULL, $index_hints_list) + function __construct($name, $alias = NULL, $index_hints_list) { - parent::Table($name, $alias); + parent::__construct($name, $alias); $this->index_hints_list = $index_hints_list; } diff --git a/classes/db/queryparts/table/Table.class.php b/classes/db/queryparts/table/Table.class.php index ce667cd36..dfd42fb7b 100644 --- a/classes/db/queryparts/table/Table.class.php +++ b/classes/db/queryparts/table/Table.class.php @@ -27,7 +27,7 @@ class Table * @param string $alias * @return void */ - function Table($name, $alias = NULL) + function __construct($name, $alias = NULL) { $this->name = $name; $this->alias = $alias; diff --git a/classes/display/DisplayHandler.class.php b/classes/display/DisplayHandler.class.php index deb8d8326..e89cfead0 100644 --- a/classes/display/DisplayHandler.class.php +++ b/classes/display/DisplayHandler.class.php @@ -28,7 +28,6 @@ class DisplayHandler extends Handler if( (defined('__OB_GZHANDLER_ENABLE__') && __OB_GZHANDLER_ENABLE__ == 1) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE && - function_exists('ob_gzhandler') && extension_loaded('zlib') && $oModule->gzhandler_enable ) @@ -78,6 +77,9 @@ class DisplayHandler extends Handler $handler->prepareToPrint($output); } + // Start the session if $_SESSION was touched + Context::getInstance()->checkSessionStatus(); + // header output $httpStatusCode = $oModule->getHttpStatusCode(); @@ -112,17 +114,15 @@ class DisplayHandler extends Handler $this->gz_enabled = FALSE; } - // results directly output + // enable gzip using zlib extension if($this->gz_enabled) { - header("Content-Encoding: gzip"); - print ob_gzhandler($output, 5); - } - else - { - print $output; + ini_set('zlib.output_compression', true); } + // results directly output + print $output; + // call a trigger after display ModuleHandler::triggerCall('display', 'after', $output); @@ -321,11 +321,6 @@ class DisplayHandler extends Handler function _printXMLHeader() { 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"); } /** @@ -335,11 +330,6 @@ class DisplayHandler extends Handler function _printHTMLHeader() { header("Content-Type: text/html; 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"); } /** @@ -349,11 +339,6 @@ class DisplayHandler extends Handler function _printJSONHeader() { header("Content-Type: text/html; 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"); } /** diff --git a/classes/extravar/Extravar.class.php b/classes/extravar/Extravar.class.php index 821a7c62b..224de5255 100644 --- a/classes/extravar/Extravar.class.php +++ b/classes/extravar/Extravar.class.php @@ -38,7 +38,7 @@ class ExtraVar * @param int $module_srl Sequence of module * @return void */ - function ExtraVar($module_srl) + function __construct($module_srl) { $this->module_srl = $module_srl; } @@ -157,7 +157,7 @@ class ExtraItem * @param string $eid Unique id of extra variable in module * @return void */ - function ExtraItem($module_srl, $idx, $name, $type = 'text', $default = null, $desc = '', $is_required = 'N', $search = 'N', $value = null, $eid = '') + function __construct($module_srl, $idx, $name, $type = 'text', $default = null, $desc = '', $is_required = 'N', $search = 'N', $value = null, $eid = '') { if(!$idx) { @@ -292,11 +292,11 @@ class ExtraItem /** * Returns a value for HTML * - * @return string Returns a value expressed in HTML. + * @return string Returns filtered value */ function getValue() { - return $this->_getTypeValue($this->type, $this->value); + return removeHackTag($this->value); } /** diff --git a/classes/file/FileHandler.class.php b/classes/file/FileHandler.class.php index 13f7a44cb..6db60dcbe 100644 --- a/classes/file/FileHandler.class.php +++ b/classes/file/FileHandler.class.php @@ -15,7 +15,7 @@ class FileHandler * @param string $source path to change into absolute path * @return string Absolute path */ - function getRealPath($source) + public static function getRealPath($source) { if(strlen($source) >= 2 && substr_compare($source, './', 0, 2) === 0) { @@ -36,7 +36,7 @@ class FileHandler * @param string $type If set as 'force'. Even if the file exists in target, the file is copied. * @return void */ - function copyDir($source_dir, $target_dir, $filter = null, $type = null) + public static function copyDir($source_dir, $target_dir, $filter = null, $type = null) { $source_dir = self::getRealPath($source_dir); $target_dir = self::getRealPath($target_dir); @@ -101,7 +101,7 @@ class FileHandler * @param string $force Y: overwrite * @return void */ - function copyFile($source, $target, $force = 'Y') + public static function copyFile($source, $target, $force = 'Y') { setlocale(LC_CTYPE, 'en_US.UTF8', 'ko_KR.UTF8'); $source = self::getRealPath($source); @@ -124,7 +124,7 @@ class FileHandler * @param string $filename Path of target file * @return string The content of the file. If target file does not exist, this function returns nothing. */ - function readFile($filename) + public static function readFile($filename) { if(($filename = self::exists($filename)) === FALSE || filesize($filename) < 1) { @@ -142,7 +142,7 @@ class FileHandler * @param string $mode a(append) / w(write) * @return void */ - function writeFile($filename, $buff, $mode = "w") + public static function writeFile($filename, $buff, $mode = "w") { $filename = self::getRealPath($filename); $pathinfo = pathinfo($filename); @@ -164,7 +164,7 @@ class FileHandler * @param string $filename path of target file * @return bool Returns TRUE on success or FALSE on failure. */ - function removeFile($filename) + public static function removeFile($filename) { return (($filename = self::exists($filename)) !== FALSE) && @unlink($filename); } @@ -178,7 +178,7 @@ class FileHandler * @param string $target Path of target file * @return bool Returns TRUE on success or FALSE on failure. */ - function rename($source, $target) + public static function rename($source, $target) { return @rename(self::getRealPath($source), self::getRealPath($target)); } @@ -190,7 +190,7 @@ class FileHandler * @param string $target Path of target file * @return bool Returns TRUE on success or FALSE on failure. */ - function moveFile($source, $target) + public static function moveFile($source, $target) { if(($source = self::exists($source)) !== FALSE) { @@ -209,7 +209,7 @@ class FileHandler * @param string $target_dir Path of target directory * @return void */ - function moveDir($source_dir, $target_dir) + public static function moveDir($source_dir, $target_dir) { self::rename($source_dir, $target_dir); } @@ -225,7 +225,7 @@ class FileHandler * @param bool $concat_prefix If TRUE, return file name as absolute path * @return string[] Array of the filenames in the path */ - function readDir($path, $filter = '', $to_lower = FALSE, $concat_prefix = FALSE) + public static function readDir($path, $filter = '', $to_lower = FALSE, $concat_prefix = FALSE) { $path = self::getRealPath($path); $output = array(); @@ -277,7 +277,7 @@ class FileHandler * @param string $path_string Path of target directory * @return bool TRUE if success. It might return nothing when ftp is used and connection to the ftp address failed. */ - function makeDir($path_string) + public static function makeDir($path_string) { if(self::exists($path_string) !== FALSE) { @@ -358,7 +358,7 @@ class FileHandler * @param string $path Path of the target directory * @return void */ - function removeDir($path) + public static function removeDir($path) { if(($path = self::isDir($path)) === FALSE) { @@ -399,7 +399,7 @@ class FileHandler * @param string $path Path of the target directory * @return void */ - function removeBlankDir($path) + public static function removeBlankDir($path) { if(($path = self::isDir($path)) === FALSE) { @@ -433,7 +433,7 @@ class FileHandler * @param string $path Path of the target directory * @return void */ - function removeFilesInDir($path) + public static function removeFilesInDir($path) { if(($path = self::getRealPath($path)) === FALSE) { @@ -475,7 +475,7 @@ class FileHandler * @param int $size Number of the size * @return string File size string */ - function filesize($size) + public static function filesize($size) { if(!$size) { @@ -515,12 +515,12 @@ class FileHandler * @param string $post_data Request arguments array for POST method * @return string If success, the content of the target file. Otherwise: none */ - function getRemoteResource($url, $body = null, $timeout = 3, $method = 'GET', $content_type = null, $headers = array(), $cookies = array(), $post_data = array(), $request_config = array()) + public static function getRemoteResource($url, $body = null, $timeout = 3, $method = 'GET', $content_type = null, $headers = array(), $cookies = array(), $post_data = array(), $request_config = array()) { try { requirePear(); - require_once('HTTP/Request.php'); + if(!class_exists('HTTP_Request')) require_once('HTTP/Request.php'); $parsed_url = parse_url(__PROXY_SERVER__); if($parsed_url["host"]) @@ -621,7 +621,7 @@ class FileHandler * @param string[] $headers Headers key value array. * @return bool TRUE: success, FALSE: failed */ - function getRemoteFile($url, $target_filename, $body = null, $timeout = 3, $method = 'GET', $content_type = null, $headers = array(), $cookies = array(), $post_data = array(), $request_config = array()) + public static function getRemoteFile($url, $target_filename, $body = null, $timeout = 3, $method = 'GET', $content_type = null, $headers = array(), $cookies = array(), $post_data = array(), $request_config = array()) { if(!($body = self::getRemoteResource($url, $body, $timeout, $method, $content_type, $headers,$cookies,$post_data,$request_config))) { @@ -639,7 +639,7 @@ class FileHandler * @param $val Size in string (ex., 10, 10K, 10M, 10G ) * @return int converted size */ - function returnBytes($val) + public static function returnBytes($val) { $unit = strtoupper(substr($val, -1)); $val = (float)$val; @@ -660,7 +660,7 @@ class FileHandler * @param array $imageInfo Image info retrieved by getimagesize function * @return bool TRUE: it's ok, FALSE: otherwise */ - function checkMemoryLoadImage(&$imageInfo) + public static function checkMemoryLoadImage(&$imageInfo) { $K64 = 65536; $TWEAKFACTOR = 2.0; @@ -689,7 +689,7 @@ class FileHandler * @param string $thumbnail_type Thumbnail type(crop, ratio) * @return bool TRUE: success, FALSE: failed */ - function createImageFile($source_file, $target_file, $resize_width = 0, $resize_height = 0, $target_type = '', $thumbnail_type = 'crop') + public static function createImageFile($source_file, $target_file, $resize_width = 0, $resize_height = 0, $target_type = '', $thumbnail_type = 'crop') { // check params if (($source_file = self::exists($source_file)) === FALSE) @@ -892,7 +892,7 @@ class FileHandler * @param string $filename Path of the ini file * @return array ini array (if the target file does not exist, it returns FALSE) */ - function readIniFile($filename) + public static function readIniFile($filename) { if(($filename = self::exists($filename)) === FALSE) { @@ -923,7 +923,7 @@ class FileHandler * @param array $arr Array * @return bool if array contains nothing it returns FALSE, otherwise TRUE */ - function writeIniFile($filename, $arr) + public static function writeIniFile($filename, $arr) { if(!is_array($arr) || count($arr) == 0) { @@ -939,7 +939,7 @@ class FileHandler * @param array $arr Array * @return string */ - function _makeIniBuff($arr) + public static function _makeIniBuff($arr) { $return = array(); foreach($arr as $key => $val) @@ -976,7 +976,7 @@ class FileHandler * @param string $mode File mode for fopen * @return FileObject File object */ - function openFile($filename, $mode) + public static function openFile($filename, $mode) { $pathinfo = pathinfo($filename); self::makeDir($pathinfo['dirname']); @@ -991,7 +991,7 @@ class FileHandler * @param string $filename Target file name * @return bool Returns TRUE if the file exists and contains something. */ - function hasContent($filename) + public static function hasContent($filename) { return (is_readable($filename) && (filesize($filename) > 0)); } @@ -1002,7 +1002,7 @@ class FileHandler * @param string $filename Target file name * @return bool Returns FALSE if the file does not exists, or Returns full path file(string). */ - function exists($filename) + public static function exists($filename) { $filename = self::getRealPath($filename); return file_exists($filename) ? $filename : FALSE; @@ -1014,7 +1014,7 @@ class FileHandler * @param string $dir Target dir path * @return bool Returns FALSE if the dir is not dir, or Returns full path of dir(string). */ - function isDir($path) + public static function isDir($path) { $path = self::getRealPath($path); return is_dir($path) ? $path : FALSE; @@ -1026,7 +1026,7 @@ class FileHandler * @param string $path Target dir path * @return bool */ - function isWritableDir($path) + public static function isWritableDir($path) { $path = self::getRealPath($path); if(is_dir($path)==FALSE) diff --git a/classes/file/FileObject.class.php b/classes/file/FileObject.class.php index f8134a43c..6cee35bb4 100644 --- a/classes/file/FileObject.class.php +++ b/classes/file/FileObject.class.php @@ -34,7 +34,7 @@ class FileObject extends Object * @param string $mode File open mode * @return void */ - function FileObject($path, $mode) + function __construct($path, $mode) { if($path != NULL) { diff --git a/classes/httprequest/XEHttpRequest.class.php b/classes/httprequest/XEHttpRequest.class.php index 901d4fcea..78242e2f6 100644 --- a/classes/httprequest/XEHttpRequest.class.php +++ b/classes/httprequest/XEHttpRequest.class.php @@ -41,7 +41,7 @@ class XEHttpRequest * constructor * @return void */ - function XEHttpRequest($host, $port, $scheme='') + function __construct($host, $port, $scheme='') { $this->m_host = $host; $this->m_port = $port; diff --git a/classes/mail/Mail.class.php b/classes/mail/Mail.class.php index db8089a0c..14b58ccf4 100644 --- a/classes/mail/Mail.class.php +++ b/classes/mail/Mail.class.php @@ -130,7 +130,7 @@ class Mail extends PHPMailer * * @return void */ - function Mail() + function __construct() { } diff --git a/classes/mobile/Mobile.class.php b/classes/mobile/Mobile.class.php index c38ffcf21..b1a862149 100644 --- a/classes/mobile/Mobile.class.php +++ b/classes/mobile/Mobile.class.php @@ -123,13 +123,13 @@ class Mobile setcookie("mobile", 'true', 0, $xe_web_path); } } - elseif($_COOKIE['mobile'] != 'false') + elseif(isset($_COOKIE['mobile']) && $_COOKIE['mobile'] != 'false') { $_COOKIE['mobile'] = 'false'; setcookie("mobile", 'false', 0, $xe_web_path); } - if($_COOKIE['user-agent'] != md5($_SERVER['HTTP_USER_AGENT'])) + if(isset($_COOKIE['mobile']) && $_COOKIE['user-agent'] != md5($_SERVER['HTTP_USER_AGENT'])) { setcookie("user-agent", md5($_SERVER['HTTP_USER_AGENT']), 0, $xe_web_path); } @@ -238,4 +238,3 @@ class Mobile return ($db_info->use_mobile_view === 'Y'); } } -?> diff --git a/classes/module/ModuleHandler.class.php b/classes/module/ModuleHandler.class.php index 4f6b67fe2..267b73671 100644 --- a/classes/module/ModuleHandler.class.php +++ b/classes/module/ModuleHandler.class.php @@ -32,7 +32,7 @@ class ModuleHandler extends Handler * @return void * */ - function ModuleHandler($module = '', $act = '', $mid = '', $document_srl = '', $module_srl = '') + function __construct($module = '', $act = '', $mid = '', $document_srl = '', $module_srl = '') { // If XE has not installed yet, set module as install if(!Context::isInstalled()) @@ -116,7 +116,6 @@ class ModuleHandler extends Handler * */ function init() { - $oModuleModel = getModel('module'); $site_module_info = Context::get('site_module_info'); @@ -317,13 +316,13 @@ class ModuleHandler extends Handler function procModule() { $oModuleModel = getModel('module'); + $display_mode = Mobile::isFromMobilePhone() ? 'mobile' : 'view'; // If error occurred while preparation, return a message instance if($this->error) { $this->_setInputErrorToContext(); - $type = Mobile::isFromMobilePhone() ? 'mobile' : 'view'; - $oMessageObject = ModuleHandler::getModuleInstance('message', $type); + $oMessageObject = ModuleHandler::getModuleInstance('message', $display_mode); $oMessageObject->setError(-1); $oMessageObject->setMessage($this->error); $oMessageObject->dispMessage(); @@ -359,8 +358,7 @@ class ModuleHandler extends Handler $this->httpStatusCode = '404'; $this->_setInputErrorToContext(); - $type = Mobile::isFromMobilePhone() ? 'mobile' : 'view'; - $oMessageObject = ModuleHandler::getModuleInstance('message', $type); + $oMessageObject = ModuleHandler::getModuleInstance('message', $display_mode); $oMessageObject->setError(-1); $oMessageObject->setMessage($this->error); $oMessageObject->dispMessage(); @@ -397,7 +395,7 @@ class ModuleHandler extends Handler if(!in_array(strtoupper($_SERVER['REQUEST_METHOD']), $allowedMethodList)) { $this->error = "msg_invalid_request"; - $oMessageObject = ModuleHandler::getModuleInstance('message', 'view'); + $oMessageObject = ModuleHandler::getModuleInstance('message', $display_mode); $oMessageObject->setError(-1); $oMessageObject->setMessage($this->error); $oMessageObject->dispMessage(); @@ -410,13 +408,24 @@ class ModuleHandler extends Handler Mobile::setMobile(FALSE); } - // Admin ip $logged_info = Context::get('logged_info'); + + // check CSRF for POST actions + if(Context::getRequestMethod() === 'POST' && Context::isInstalled() && $this->act !== 'procFileUpload' && !checkCSRF()) { + $this->error = 'msg_invalid_request'; + $oMessageObject = ModuleHandler::getModuleInstance('message', $display_mode); + $oMessageObject->setError(-1); + $oMessageObject->setMessage($this->error); + $oMessageObject->dispMessage(); + return $oMessageObject; + } + + // Admin ip if($kind == 'admin' && $_SESSION['denied_admin'] == 'Y') { $this->_setInputErrorToContext(); $this->error = "msg_not_permitted_act"; - $oMessageObject = ModuleHandler::getModuleInstance('message', $type); + $oMessageObject = ModuleHandler::getModuleInstance('message', $display_mode); $oMessageObject->setError(-1); $oMessageObject->setMessage($this->error); $oMessageObject->dispMessage(); @@ -446,8 +455,7 @@ class ModuleHandler extends Handler if(!is_object($oModule)) { $this->_setInputErrorToContext(); - $type = Mobile::isFromMobilePhone() ? 'mobile' : 'view'; - $oMessageObject = ModuleHandler::getModuleInstance('message', $type); + $oMessageObject = ModuleHandler::getModuleInstance('message', $display_mode); $oMessageObject->setError(-1); $oMessageObject->setMessage($this->error); $oMessageObject->dispMessage(); @@ -466,7 +474,7 @@ class ModuleHandler extends Handler { $this->_setInputErrorToContext(); $this->error = 'msg_invalid_request'; - $oMessageObject = ModuleHandler::getModuleInstance('message', $type); + $oMessageObject = ModuleHandler::getModuleInstance('message', $display_mode); $oMessageObject->setError(-1); $oMessageObject->setMessage($this->error); $oMessageObject->dispMessage(); @@ -495,7 +503,7 @@ class ModuleHandler extends Handler else { $this->error = 'msg_invalid_request'; - $oMessageObject = ModuleHandler::getModuleInstance('message', 'view'); + $oMessageObject = ModuleHandler::getModuleInstance('message', $display_mode); $oMessageObject->setError(-1); $oMessageObject->setMessage($this->error); $oMessageObject->dispMessage(); @@ -517,6 +525,34 @@ class ModuleHandler extends Handler $tpl_path = $oModule->getTemplatePath(); $orig_module = $oModule; + $xml_info = $oModuleModel->getModuleActionXml($forward->module); + + // SECISSUE also check foward act method + // check REQUEST_METHOD in controller + if($type == 'controller') + { + $allowedMethod = $xml_info->action->{$forward->act}->method; + + if(!$allowedMethod) + { + $allowedMethodList[0] = 'POST'; + } + else + { + $allowedMethodList = explode('|', strtoupper($allowedMethod)); + } + + if(!in_array(strtoupper($_SERVER['REQUEST_METHOD']), $allowedMethodList)) + { + $this->error = "msg_invalid_request"; + $oMessageObject = ModuleHandler::getModuleInstance('message', $display_mode); + $oMessageObject->setError(-1); + $oMessageObject->setMessage($this->error); + $oMessageObject->dispMessage(); + return $oMessageObject; + } + } + if($type == "view" && Mobile::isFromMobilePhone()) { $orig_type = "view"; @@ -537,9 +573,8 @@ class ModuleHandler extends Handler if(!is_object($oModule)) { - $type = Mobile::isFromMobilePhone() ? 'mobile' : 'view'; $this->_setInputErrorToContext(); - $oMessageObject = ModuleHandler::getModuleInstance('message', $type); + $oMessageObject = ModuleHandler::getModuleInstance('message', $display_mode); $oMessageObject->setError(-1); $oMessageObject->setMessage('msg_module_is_not_exists'); $oMessageObject->dispMessage(); @@ -550,8 +585,6 @@ class ModuleHandler extends Handler return $oMessageObject; } - $xml_info = $oModuleModel->getModuleActionXml($forward->module); - if($this->module == "admin" && $type == "view") { if($logged_info->is_admin == 'Y') @@ -569,7 +602,7 @@ class ModuleHandler extends Handler $this->_setInputErrorToContext(); $this->error = 'msg_is_not_administrator'; - $oMessageObject = ModuleHandler::getModuleInstance('message', $type); + $oMessageObject = ModuleHandler::getModuleInstance('message', $display_mode); $oMessageObject->setError(-1); $oMessageObject->setMessage($this->error); $oMessageObject->dispMessage(); @@ -583,7 +616,7 @@ class ModuleHandler extends Handler { $this->_setInputErrorToContext(); $this->error = 'msg_is_not_manager'; - $oMessageObject = ModuleHandler::getModuleInstance('message', 'view'); + $oMessageObject = ModuleHandler::getModuleInstance('message', $display_mode); $oMessageObject->setError(-1); $oMessageObject->setMessage($this->error); $oMessageObject->dispMessage(); @@ -595,7 +628,7 @@ class ModuleHandler extends Handler { $this->_setInputErrorToContext(); $this->error = 'msg_is_not_administrator'; - $oMessageObject = ModuleHandler::getModuleInstance('message', 'view'); + $oMessageObject = ModuleHandler::getModuleInstance('message', $display_mode); $oMessageObject->setError(-1); $oMessageObject->setMessage($this->error); $oMessageObject->dispMessage(); @@ -722,15 +755,23 @@ class ModuleHandler extends Handler } - $_SESSION['XE_VALIDATOR_ERROR'] = $error; - $_SESSION['XE_VALIDATOR_ID'] = Context::get('xe_validator_id'); + if($error != 0) + { + $_SESSION['XE_VALIDATOR_ERROR'] = $error; + } + if($validator_id = Context::get('xe_validator_id')) + { + $_SESSION['XE_VALIDATOR_ID'] = $validator_id; + } if($message != 'success') { $_SESSION['XE_VALIDATOR_MESSAGE'] = $message; } - $_SESSION['XE_VALIDATOR_MESSAGE_TYPE'] = $messageType; - - if(Context::get('xeVirtualRequestMethod') != 'xml') + if($messageType != 'info') + { + $_SESSION['XE_VALIDATOR_MESSAGE_TYPE'] = $messageType; + } + if(Context::get('xeVirtualRequestMethod') != 'xml' && $redirectUrl) { $_SESSION['XE_VALIDATOR_RETURN_URL'] = $redirectUrl; } @@ -780,12 +821,12 @@ class ModuleHandler extends Handler * */ function _clearErrorSession() { - $_SESSION['XE_VALIDATOR_ERROR'] = ''; - $_SESSION['XE_VALIDATOR_MESSAGE'] = ''; - $_SESSION['XE_VALIDATOR_MESSAGE_TYPE'] = ''; - $_SESSION['XE_VALIDATOR_RETURN_URL'] = ''; - $_SESSION['XE_VALIDATOR_ID'] = ''; - $_SESSION['INPUT_ERROR'] = ''; + unset($_SESSION['XE_VALIDATOR_ERROR']); + unset($_SESSION['XE_VALIDATOR_MESSAGE']); + unset($_SESSION['XE_VALIDATOR_MESSAGE_TYPE']); + unset($_SESSION['XE_VALIDATOR_RETURN_URL']); + unset($_SESSION['XE_VALIDATOR_ID']); + unset($_SESSION['INPUT_ERROR']); } /** @@ -839,6 +880,7 @@ class ModuleHandler extends Handler $display_handler = new DisplayHandler(); $display_handler->_debugOutput(); + Context::getInstance()->checkSessionStatus(); header('location:' . $_SESSION['XE_VALIDATOR_RETURN_URL']); return; } diff --git a/classes/module/ModuleObject.class.php b/classes/module/ModuleObject.class.php index 9485a74c4..18838295b 100644 --- a/classes/module/ModuleObject.class.php +++ b/classes/module/ModuleObject.class.php @@ -86,7 +86,7 @@ class ModuleObject extends Object * @param string $type type of message (error, info, update) * @return void * */ - function setMessage($message, $type = NULL) + function setMessage($message = 'success', $type = NULL) { parent::setMessage($message); $this->setMessageType($type); @@ -370,7 +370,7 @@ class ModuleObject extends Object * set the directory path of the layout directory * @return string * */ - function getLayoutPath() + function getLayoutPath($layout_name = "", $layout_type = "P") { return $this->layout_path; } @@ -472,12 +472,12 @@ class ModuleObject extends Object return FALSE; } } - // execute api methos of the module if view action is and result is XMLRPC or JSON - if($this->module_info->module_type == 'view') + // execute api methods of the module if view action is and result is XMLRPC or JSON + if($this->module_info->module_type == 'view' || $this->module_info->module_type == 'mobile') { if(Context::getResponseMethod() == 'XMLRPC' || Context::getResponseMethod() == 'JSON') { - $oAPI = getAPI($this->module_info->module, 'api'); + $oAPI = getAPI($this->module_info->module); if(method_exists($oAPI, $this->act)) { $oAPI->{$this->act}($this); diff --git a/classes/object/Object.class.php b/classes/object/Object.class.php index ed5a76bcf..8459f0df2 100644 --- a/classes/object/Object.class.php +++ b/classes/object/Object.class.php @@ -40,7 +40,7 @@ class Object * @param string $message Error message * @return void */ - function Object($error = 0, $message = 'success') + function __construct($error = 0, $message = 'success') { $this->setError($error); $this->setMessage($message); @@ -94,7 +94,7 @@ class Object * @param string $message Error message * @return bool Alaways returns true. */ - function setMessage($message = 'success') + function setMessage($message = 'success', $type = NULL) { if($str = Context::getLang($message)) { diff --git a/classes/page/PageHandler.class.php b/classes/page/PageHandler.class.php index 9b2322b75..bebbdc7df 100644 --- a/classes/page/PageHandler.class.php +++ b/classes/page/PageHandler.class.php @@ -30,7 +30,7 @@ class PageHandler extends Handler * @return void */ - function PageHandler($total_count, $total_page, $cur_page, $page_count = 10) + function __construct($total_count, $total_page, $cur_page, $page_count = 10) { $this->total_count = $total_count; $this->total_page = $total_page; diff --git a/classes/security/Crypto.class.php b/classes/security/Crypto.class.php new file mode 100644 index 000000000..0e9e06cf4 --- /dev/null +++ b/classes/security/Crypto.class.php @@ -0,0 +1,357 @@ + */ + +/** + * This class makes encryption and digital signing easy to use in XE. + * + * The encryption methods use AES-128, and is fully compatible with + * https://github.com/defuse/php-encryption + * except that it uses base64-encoded keys and ciphertexts. + * + * The digital signature methods is based on the same SHA-256 based + * key derivation function used by the encryption methods. + * + * A key is automatically generated and saved to the files/config directory + * when first invoked. The same key will be used for all subsequent + * method calls that do not specify a different key. + * The key must be a binary string exactly 16 bytes long. + * + * @file Crypto.class.php + * @author Kijin Sung (kijin@kijinsung.com) + * @package /classes/security + * @version 1.0 + */ +class Crypto +{ + /** + * @brief Default configuration + */ + const ENCRYPTION_ALGO = 'aes-128'; + const ENCRYPTION_MODE = 'cbc'; + const ENCRYPTION_BLOCK_SIZE = 16; + const ENCRYPTION_KEY_SIZE = 16; + const ENCRYPTION_KEY_INFO = 'DefusePHP|KeyForEncryption'; + const ENCRYPTION_MAC_ALGO = 'sha256'; + const ENCRYPTION_MAC_SIZE = 32; + const ENCRYPTION_MAC_INFO = 'DefusePHP|KeyForAuthentication'; + const SIGNATURE_ALGO = 'sha256'; + const SIGNATURE_SIZE = '32'; + + /** + * @brief The default key + */ + protected static $_default_key = null; + + /** + * @brief The currently selected extension + */ + protected static $_extension = null; + + /** + * @brief If this is true, encryption and signature are only valid in current session + */ + protected $_current_session_only = false; + + /** + * @brief Constructor + */ + public function __construct() + { + if(function_exists('openssl_encrypt')) + { + self::$_extension = 'openssl'; + } + elseif(function_exists('mcrypt_encrypt')) + { + self::$_extension = 'mcrypt'; + } + else + { + throw new Exception('Crypto class requires openssl or mcrypt extension.'); + } + } + + /** + * @brief Check if cryptography is supported on this server + * @return bool + */ + public static function isSupported() + { + return (function_exists('openssl_encrypt') || function_exists('mcrypt_encrypt')); + } + + /** + * @brief Make encryption and signature only valid in current session + * @return void + */ + public function currentSessionOnly() + { + $this->_current_session_only = true; + } + + /** + * @brief Encrypt a string + * @param string $plaintext The string to encrypt + * @param string $key Optional key. If empty, default key will be used. + * @return string + */ + public function encrypt($plaintext, $key = null) + { + if($key === null || $key === '') + { + $key = $this->_getSessionKey(); + } + + // Generate subkey for encryption + $enc_key = self::_defuseCompatibleHKDF($key, self::ENCRYPTION_KEY_INFO); + + // Generate IV + $iv = self::_createIV(); + + // Encrypt the plaintext + if(self::$_extension === 'openssl') + { + $openssl_method = self::ENCRYPTION_ALGO . '-' . self::ENCRYPTION_MODE; + $ciphertext = openssl_encrypt($plaintext, $openssl_method, $enc_key, OPENSSL_RAW_DATA, $iv); + } + else + { + $mcrypt_method = str_replace('aes', 'rijndael', self::ENCRYPTION_ALGO); + $plaintext = self::_applyPKCS7Padding($plaintext, self::ENCRYPTION_BLOCK_SIZE); + $ciphertext = mcrypt_encrypt($mcrypt_method, $enc_key, $plaintext, self::ENCRYPTION_MODE, $iv); + } + + // Generate MAC + $mac_key = self::_defuseCompatibleHKDF($key, self::ENCRYPTION_MAC_INFO); + $mac = hash_hmac(self::ENCRYPTION_MAC_ALGO, ($iv . $ciphertext), $mac_key, true); + + // Return the MAC, IV, and ciphertext as a base64 encoded string + return base64_encode($mac . $iv . $ciphertext); + } + + /** + * @brief Decrypt a string + * @param string $ciphertext The string to decrypt + * @param string $key Optional key. If empty, default key will be used. + * @return string + */ + public function decrypt($ciphertext, $key = null) + { + if($key === null || $key === '') + { + $key = $this->_getSessionKey(); + } + + // Base64 decode the ciphertext and check the length + $ciphertext = @base64_decode($ciphertext); + if(strlen($ciphertext) < (self::ENCRYPTION_MAC_SIZE + (self::ENCRYPTION_BLOCK_SIZE * 2))) + { + return false; + } + + // Extract MAC and IV from the remainder of the ciphertext + $mac = substr($ciphertext, 0, self::ENCRYPTION_MAC_SIZE); + $iv = substr($ciphertext, self::ENCRYPTION_MAC_SIZE, self::ENCRYPTION_BLOCK_SIZE); + $ciphertext = substr($ciphertext, self::ENCRYPTION_MAC_SIZE + self::ENCRYPTION_BLOCK_SIZE); + + // Validate MAC + $mac_key = self::_defuseCompatibleHKDF($key, self::ENCRYPTION_MAC_INFO); + $mac_compare = hash_hmac(self::ENCRYPTION_MAC_ALGO, ($iv . $ciphertext), $mac_key, true); + $oPassword = new Password(); + if(!$oPassword->strcmpConstantTime($mac, $mac_compare)) + { + return false; + } + + // Generate subkey for encryption + $enc_key = self::_defuseCompatibleHKDF($key, self::ENCRYPTION_KEY_INFO); + + // Decrypt the ciphertext + if (self::$_extension === 'openssl') + { + $openssl_method = self::ENCRYPTION_ALGO . '-' . self::ENCRYPTION_MODE; + $plaintext = openssl_decrypt($ciphertext, $openssl_method, $enc_key, OPENSSL_RAW_DATA, $iv); + } + else + { + $mcrypt_method = str_replace('aes', 'rijndael', self::ENCRYPTION_ALGO); + $plaintext = @mcrypt_decrypt($mcrypt_method, $enc_key, $ciphertext, self::ENCRYPTION_MODE, $iv); + if($plaintext === false) + { + return false; + } + $plaintext = self::_stripPKCS7Padding($plaintext, self::ENCRYPTION_BLOCK_SIZE); + if($plaintext === false) + { + return false; + } + } + + // Return the plaintext + return $plaintext; + } + + /** + * @brief Create a digital signature of a string + * @param string $plaintext The string to sign + * @param string $key Optional key. If empty, default key will be used. + * @return string + */ + public function createSignature($plaintext, $key = null) + { + if($key === null || $key === '') + { + $key = $this->_getSessionKey(); + } + + // Generate a signature using HMAC + return bin2hex(self::_defuseCompatibleHKDF($plaintext, $key)); + } + + /** + * @brief Verify a digital signature + * @param string $signature The signature to verify + * @param string $plaintext The string to verify + * @param string $key Optional key. If empty, default key will be used. + * @return bool + */ + public function verifySignature($signature, $plaintext, $key = null) + { + if($key === null || $key === '') + { + $key = $this->_getSessionKey(); + } + + // Verify the signature using HMAC + $oPassword = new Password(); + $compare = bin2hex(self::_defuseCompatibleHKDF($plaintext, $key)); + return $oPassword->strcmpConstantTime($signature, $compare); + } + + /** + * @brief Get the default key applicable to this instance + * @return string + */ + protected function _getSessionKey() + { + if($this->_current_session_only) + { + if(!isset($_SESSION['XE_CRYPTO_SESSKEY'])) + { + $_SESSION['XE_CRYPTO_SESSKEY'] = self::_createSecureKey(); + } + $session_key = base64_decode($_SESSION['XE_CRYPTO_SESSKEY']); + return strval(self::_getDefaultKey()) ^ strval($session_key); + } + else + { + return strval(self::_getDefaultKey()); + } + } + + /** + * @brief Get the default key + * @return string + */ + protected static function _getDefaultKey() + { + if(self::$_default_key !== null) + { + return base64_decode(self::$_default_key); + } + else + { + $file_name = _XE_PATH_ . 'files/config/crypto.config.php'; + if(file_exists($file_name) && is_readable($file_name)) + { + $key = (include $file_name); + } + if(!isset($key) || !is_string($key)) + { + $key = self::_createSecureKey(); + self::_setDefaultKey($key); + } + return base64_decode(self::$_default_key = $key); + } + } + + /** + * @brief Set the default key + * @param string $key The default key + * @return void + */ + protected static function _setDefaultKey($key) + { + self::$_default_key = $key = trim($key); + $file_name = _XE_PATH_ . 'files/config/crypto.config.php'; + $file_content = 'createSecureSalt(ENCRYPTION_KEY_SIZE, 'binary')); + } + + /** + * @brief Create an IV + * @return string + */ + protected static function _createIV() + { + $oPassword = new Password(); + return $oPassword->createSecureSalt(self::ENCRYPTION_BLOCK_SIZE, 'binary'); + } + + + /** + * @brief Apply PKCS#7 padding to a string + * @param string $str The string + * @param int $block_size The block size + * @return string + */ + protected static function _applyPKCS7Padding($str, $block_size) + { + $padding_size = $block_size - (strlen($str) % $block_size); + if ($padding_size === 0) $padding_size = $block_size; + return $str . str_repeat(chr($padding_size), $padding_size); + } + + /** + * @brief Remove PKCS#7 padding from a string + * @param string $str The string + * @param int $block_size The block size + * @return string + */ + protected static function _stripPKCS7Padding($str, $block_size) + { + if (strlen($str) % $block_size !== 0) return false; + $padding_size = ord(substr($str, -1)); + if ($padding_size < 1 || $padding_size > $block_size) return false; + if (substr($str, (-1 * $padding_size)) !== str_repeat(chr($padding_size), $padding_size)) return false; + return substr($str, 0, strlen($str) - $padding_size); + } + + /** + * @brief HKDF function compatible with defuse/php-encryption + * @return string + */ + protected static function _defuseCompatibleHKDF($key, $info) + { + $salt = str_repeat("\x00", self::ENCRYPTION_MAC_SIZE); + $prk = hash_hmac(self::ENCRYPTION_MAC_ALGO, $key, $salt, true); + $t = $last_block = ''; + for ($block_index = 1; strlen($t) < self::ENCRYPTION_KEY_SIZE; $block_index++) + { + $t .= $last_block = hash_hmac(self::ENCRYPTION_MAC_ALGO, ($last_block . $info . chr($block_index)), $prk, true); + } + return substr($t, 0, self::ENCRYPTION_KEY_SIZE); + } +} +/* End of file : Crypto.class.php */ +/* Location: ./classes/security/Crypto.class.php */ diff --git a/classes/security/EmbedFilter.class.php b/classes/security/EmbedFilter.class.php index 42d6539ad..034c8a82b 100644 --- a/classes/security/EmbedFilter.class.php +++ b/classes/security/EmbedFilter.class.php @@ -260,7 +260,7 @@ class EmbedFilter * @constructor * @return void */ - function EmbedFilter() + function __construct() { $this->_makeWhiteDomainList(); diff --git a/classes/security/Password.class.php b/classes/security/Password.class.php index 436c2b6e5..93e87f0e1 100644 --- a/classes/security/Password.class.php +++ b/classes/security/Password.class.php @@ -12,6 +12,24 @@ */ class Password { + /** + * @brief Custom algorithms are stored here + * @var array + */ + protected static $_custom = array(); + + /** + * @brief Register a custom algorithm for password checking + * @param string $name The name of the algorithm + * @param string $regexp The regular expression to detect the algorithm + * @param callable $callback The function to call to regenerate the hash + * @return void + */ + public static function registerCustomAlgorithm($name, $regexp, $callback) + { + self::$_custom[$name] = array('regexp' => $regexp, 'callback' => $callback); + } + /** * @brief Return the list of hashing algorithms supported by this server * @return array @@ -162,6 +180,16 @@ class Password return $this->strcmpConstantTime($hash_to_compare, $hash); default: + if($algorithm && isset(self::$_custom[$algorithm])) + { + $hash_callback = self::$_custom[$algorithm]['callback']; + $hash_to_compare = $hash_callback($password, $hash); + return $this->strcmpConstantTime($hash_to_compare, $hash); + } + if(in_array($algorithm, hash_algos())) + { + return $this->strcmpConstantTime(hash($algorithm, $password), $hash); + } return false; } } @@ -173,6 +201,14 @@ class Password */ function checkAlgorithm($hash) { + foreach(self::$_custom as $name => $definition) + { + if(preg_match($definition['regexp'], $hash)) + { + return $name; + } + } + if(preg_match('/^\$2[axy]\$([0-9]{2})\$/', $hash, $matches)) { return 'bcrypt'; @@ -185,6 +221,22 @@ class Password { return 'md5'; } + elseif(strlen($hash) === 40 && ctype_xdigit($hash)) + { + return 'sha1'; + } + elseif(strlen($hash) === 64 && ctype_xdigit($hash)) + { + return 'sha256'; + } + elseif(strlen($hash) === 96 && ctype_xdigit($hash)) + { + return 'sha384'; + } + elseif(strlen($hash) === 128 && ctype_xdigit($hash)) + { + return 'sha512'; + } elseif(strlen($hash) === 16 && ctype_xdigit($hash)) { return 'mysql_old_password'; @@ -246,8 +298,13 @@ class Password $entropy_capped_bytes = min(32, $entropy_required_bytes); // 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('openssl_random_pseudo_bytes') && (!$is_windows || version_compare(PHP_VERSION, '5.4', '>='))) + if(function_exists('random_bytes')) // PHP 7 + { + $entropy = random_bytes($entropy_capped_bytes); + } + elseif(function_exists('openssl_random_pseudo_bytes') && (!$is_windows || version_compare(PHP_VERSION, '5.4', '>='))) { $entropy = openssl_random_pseudo_bytes($entropy_capped_bytes); } @@ -262,10 +319,16 @@ class Password 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); } - else + + // Use built-in source of entropy if an error occurs while using other functions + if($entropy === false || strlen($entropy) < $entropy_capped_bytes) { $entropy = ''; for($i = 0; $i < $entropy_capped_bytes; $i += 2) diff --git a/classes/security/Purifier.class.php b/classes/security/Purifier.class.php index 0c78d09fd..5a5cf6953 100644 --- a/classes/security/Purifier.class.php +++ b/classes/security/Purifier.class.php @@ -9,7 +9,7 @@ class Purifier private $_config; private $_def; - public function Purifier() + public function __construct() { $this->_checkCacheDir(); @@ -93,11 +93,17 @@ class Purifier { foreach($m2[1] as $value2) { + //SECISSUE check style attr + if($value2 == 'style') + { + continue; + } $attributeList[] = $value2; } } } } + return array_unique($attributeList); } @@ -121,6 +127,11 @@ class Purifier { foreach($m2[1] as $value2) { + //SECISSUE check style attr + if($value2 == 'style') + { + continue; + } $attributeList[] = $value2; } } diff --git a/classes/security/Security.class.php b/classes/security/Security.class.php index 176ba0ed5..9b5669131 100644 --- a/classes/security/Security.class.php +++ b/classes/security/Security.class.php @@ -22,7 +22,7 @@ class Security * @param mixed $var Target context * @return void */ - function Security($var = NULL) + function __construct($var = NULL) { $this->_targetVar = $var; } diff --git a/classes/template/TemplateHandler.class.php b/classes/template/TemplateHandler.class.php index 84946b333..d6831a6fb 100644 --- a/classes/template/TemplateHandler.class.php +++ b/classes/template/TemplateHandler.class.php @@ -19,6 +19,7 @@ class TemplateHandler private $xe_path = NULL; ///< XpressEngine base path private $web_path = NULL; ///< tpl file web path private $compiled_file = NULL; ///< tpl file web path + private $config = NULL; private $skipTags = NULL; private $handler_mtime = 0; static private $rootTpl = NULL; @@ -31,6 +32,7 @@ class TemplateHandler { $this->xe_path = rtrim(preg_replace('/([^\.^\/]+)\.php$/i', '', $_SERVER['SCRIPT_NAME']), '/'); $this->compiled_path = _XE_PATH_ . $this->compiled_path; + $this->config = new stdClass(); } /** @@ -232,6 +234,13 @@ class TemplateHandler $this->skipTags = array('marquee'); } + // reset config for this buffer (this step is necessary because we use a singleton for every template) + $previous_config = clone $this->config; + $this->config = new stdClass(); + + // detect existence of autoescape config + $this->config->autoescape = (strpos($buff, ' autoescape="') === FALSE) ? NULL : 'off'; + // replace comments $buff = preg_replace('@@s', '', $buff); @@ -242,7 +251,7 @@ class TemplateHandler $buff = $this->_parseInline($buff); // include, unload/load, import - $buff = preg_replace_callback('/{(@[\s\S]+?|(?=\$\w+|_{1,2}[A-Z]+|[!\(+-]|\w+(?:\(|::)|\d+|[\'"].*?[\'"]).+?)}|<(!--[#%])?(include|import|(un)?load(?(4)|(?:_js_plugin)?))(?(2)\(["\']([^"\']+)["\'])(.*?)(?(2)\)--|\/)>|(\s*)/', array($this, '_parseResource'), $buff); + $buff = preg_replace_callback('/{(@[\s\S]+?|(?=\$\w+|_{1,2}[A-Z]+|[!\(+-]|\w+(?:\(|::)|\d+|[\'"].*?[\'"]).+?)}|<(!--[#%])?(include|import|(un)?load(?(4)|(?:_js_plugin)?)|config)(?(2)\(["\']([^"\']+)["\'])(.*?)(?(2)\)--|\/)>|(\s*)/', array($this, '_parseResource'), $buff); // remove block which is a virtual tag $buff = preg_replace('@@is', '', $buff); @@ -260,6 +269,9 @@ class TemplateHandler // remove php script reopening $buff = preg_replace(array('/(\n|\r\n)+/', '/(;)?( )*\?\>\<\?php([\n\t ]+)?/'), array("\n", ";\n"), $buff); + // restore config to previous value + $this->config = $previous_config; + return $buff; } @@ -509,7 +521,10 @@ class TemplateHandler { $expr_m[2] .= '=>' . trim($expr_m[3]); } - $nodes[$idx - 1] .= ""; + $nodes[$idx - 1] .= sprintf( + '' + ,$expr_m[1], $expr_m[2], md5( $buff . strval($idx-1) ) + ); } elseif($expr_m[4]) { @@ -587,14 +602,35 @@ class TemplateHandler { return $m[0]; } - - $echo = 'echo '; + if($m[1]{0} == '@') { - $echo = ''; - $m[1] = substr($m[1], 1); + $m[1] = $this->_replaceVar(substr($m[1], 1)); + return ""; + } + else + { + $escape_option = $this->config->autoescape !== null ? 'auto' : 'noescape'; + if(preg_match('@^(.+)\\|((?:no)?escape)$@', $m[1], $mm)) + { + $m[1] = $mm[1]; + $escape_option = $mm[2]; + } + elseif($m[1] === '$content' && preg_match('@/layouts/.+/layout\.html$@', $this->file)) + { + $escape_option = 'noescape'; + } + $m[1] = $this->_replaceVar($m[1]); + switch($escape_option) + { + case 'auto': + return "config->autoescape === 'on' ? htmlspecialchars({$m[1]}, ENT_COMPAT, 'UTF-8', false) : {$m[1]}) ?>"; + case 'escape': + return ""; + case 'noescape': + return ""; + } } - return '_replaceVar($m[1]) . ' ?>'; } if($m[3]) @@ -727,6 +763,17 @@ class TemplateHandler } return $result; + // + case 'config': + $result = ''; + if(preg_match_all('@ (\w+)="([^"]+)"@', $m[6], $config_matches, PREG_SET_ORDER)) + { + foreach($config_matches as $config_match) + { + $result .= "\$this->config->{$config_match[1]} = '" . trim(strtolower($config_match[2])) . "';"; + } + } + return ""; } } diff --git a/classes/xml/XmlJsFilter.class.php b/classes/xml/XmlJsFilter.class.php index 55dab10b7..aed08c838 100644 --- a/classes/xml/XmlJsFilter.class.php +++ b/classes/xml/XmlJsFilter.class.php @@ -79,7 +79,7 @@ class XmlJsFilter extends XmlParser * @return void */ - function XmlJsFilter($path, $xml_file) + function __construct($path, $xml_file) { if(substr($path, -1) !== '/') { diff --git a/classes/xml/XmlLangParser.class.php b/classes/xml/XmlLangParser.class.php index 6804e68df..935a0a4bc 100644 --- a/classes/xml/XmlLangParser.class.php +++ b/classes/xml/XmlLangParser.class.php @@ -53,7 +53,7 @@ class XmlLangParser extends XmlParser * @param string $lang_type * @return void */ - function XmlLangParser($xml_file, $lang_type) + function __construct($xml_file, $lang_type) { $this->lang_type = $lang_type; $this->xml_file = $xml_file; diff --git a/classes/xml/XmlQueryParser.class.php b/classes/xml/XmlQueryParser.class.php index e86c00c8f..66284031a 100644 --- a/classes/xml/XmlQueryParser.class.php +++ b/classes/xml/XmlQueryParser.class.php @@ -24,7 +24,7 @@ class XmlQueryParser extends XmlParser * constructor * @return void */ - function XmlQueryParser() + function __construct() { } diff --git a/classes/xml/xmlquery/DBParser.class.php b/classes/xml/xmlquery/DBParser.class.php index efef7272c..b9aa80cc2 100644 --- a/classes/xml/xmlquery/DBParser.class.php +++ b/classes/xml/xmlquery/DBParser.class.php @@ -60,7 +60,7 @@ class DBParser * * @return void */ - function DBParser($escape_char_left, $escape_char_right = "", $table_prefix = "xe_") + function __construct($escape_char_left, $escape_char_right = "", $table_prefix = "xe_") { $this->escape_char_left = $escape_char_left; if($escape_char_right !== "") diff --git a/classes/xml/xmlquery/QueryParser.class.php b/classes/xml/xmlquery/QueryParser.class.php index 80e9975b0..4fe996d1f 100644 --- a/classes/xml/xmlquery/QueryParser.class.php +++ b/classes/xml/xmlquery/QueryParser.class.php @@ -30,7 +30,7 @@ class QueryParser * @param bool $isSubQuery * @return void */ - function QueryParser($query = NULL, $isSubQuery = FALSE) + function __construct($query = NULL, $isSubQuery = FALSE) { if($query) { diff --git a/classes/xml/xmlquery/argument/Argument.class.php b/classes/xml/xmlquery/argument/Argument.class.php index ffc275495..de3acc28c 100644 --- a/classes/xml/xmlquery/argument/Argument.class.php +++ b/classes/xml/xmlquery/argument/Argument.class.php @@ -64,7 +64,7 @@ class Argument * @return void */ - function Argument($name, $value) + function __construct($name, $value) { $this->value = $value; $this->name = $name; diff --git a/classes/xml/xmlquery/argument/ConditionArgument.class.php b/classes/xml/xmlquery/argument/ConditionArgument.class.php index 956977432..be97fc097 100644 --- a/classes/xml/xmlquery/argument/ConditionArgument.class.php +++ b/classes/xml/xmlquery/argument/ConditionArgument.class.php @@ -23,7 +23,7 @@ class ConditionArgument extends Argument * @param string $operation * @return void */ - function ConditionArgument($name, $value, $operation) + function __construct($name, $value, $operation) { $operationList = array('in' => 1, 'notin' => 1, 'not_in' => 1, 'between' => 1); if(isset($value) && isset($operationList[$operation]) && !is_array($value) && $value != '') @@ -32,7 +32,7 @@ class ConditionArgument extends Argument $value = str_replace('\'', '', $value); $value = explode(',', $value); } - parent::Argument($name, $value); + parent::__construct($name, $value); $this->operation = $operation; } diff --git a/classes/xml/xmlquery/queryargument/DefaultValue.class.php b/classes/xml/xmlquery/queryargument/DefaultValue.class.php index d4b9c0a95..455d06537 100644 --- a/classes/xml/xmlquery/queryargument/DefaultValue.class.php +++ b/classes/xml/xmlquery/queryargument/DefaultValue.class.php @@ -58,7 +58,7 @@ class DefaultValue * @param mixed $value value * @return void */ - function DefaultValue($column_name, $value) + function __construct($column_name, $value) { $dbParser = DB::getParser(); $this->column_name = $dbParser->parseColumnName($column_name); diff --git a/classes/xml/xmlquery/queryargument/QueryArgument.class.php b/classes/xml/xmlquery/queryargument/QueryArgument.class.php index d026cae89..7e97975b6 100644 --- a/classes/xml/xmlquery/queryargument/QueryArgument.class.php +++ b/classes/xml/xmlquery/queryargument/QueryArgument.class.php @@ -58,7 +58,7 @@ class QueryArgument * @param bool $ignore_value * @return void */ - function QueryArgument($tag, $ignore_value = FALSE) + function __construct($tag, $ignore_value = FALSE) { static $number_of_arguments = 0; diff --git a/classes/xml/xmlquery/queryargument/validator/QueryArgumentValidator.class.php b/classes/xml/xmlquery/queryargument/validator/QueryArgumentValidator.class.php index d5fc37f2b..2bcfbe1b9 100644 --- a/classes/xml/xmlquery/queryargument/validator/QueryArgumentValidator.class.php +++ b/classes/xml/xmlquery/queryargument/validator/QueryArgumentValidator.class.php @@ -59,7 +59,7 @@ class QueryArgumentValidator * @param QueryArgument $argument * @return void */ - function QueryArgumentValidator($tag, $argument) + function __construct($tag, $argument) { $this->argument = $argument; $this->argument_name = $this->argument->getArgumentName(); diff --git a/classes/xml/xmlquery/tags/column/ColumnTag.class.php b/classes/xml/xmlquery/tags/column/ColumnTag.class.php index 6d92caff2..4ed4ae34d 100644 --- a/classes/xml/xmlquery/tags/column/ColumnTag.class.php +++ b/classes/xml/xmlquery/tags/column/ColumnTag.class.php @@ -25,7 +25,7 @@ class ColumnTag * @param string $name * @return void */ - function ColumnTag($name) + function __construct($name) { $this->name = $name; } diff --git a/classes/xml/xmlquery/tags/column/InsertColumnTag.class.php b/classes/xml/xmlquery/tags/column/InsertColumnTag.class.php index 26573f28c..d8c412b8d 100644 --- a/classes/xml/xmlquery/tags/column/InsertColumnTag.class.php +++ b/classes/xml/xmlquery/tags/column/InsertColumnTag.class.php @@ -25,9 +25,9 @@ class InsertColumnTag extends ColumnTag * * @return void */ - function InsertColumnTag($column) + function __construct($column) { - parent::ColumnTag($column->attrs->name); + parent::__construct($column->attrs->name); $dbParser = DB::getParser(); $this->name = $dbParser->parseColumnName($this->name); $this->argument = new QueryArgument($column); diff --git a/classes/xml/xmlquery/tags/column/InsertColumnTagWithoutArgument.class.php b/classes/xml/xmlquery/tags/column/InsertColumnTagWithoutArgument.class.php index 9a7de0b5d..f5cf226d4 100644 --- a/classes/xml/xmlquery/tags/column/InsertColumnTagWithoutArgument.class.php +++ b/classes/xml/xmlquery/tags/column/InsertColumnTagWithoutArgument.class.php @@ -17,9 +17,9 @@ class InsertColumnTagWithoutArgument extends ColumnTag * @param object $column * @return void */ - function InsertColumnTagWithoutArgument($column) + function __construct($column) { - parent::ColumnTag($column->attrs->name); + parent::__construct($column->attrs->name); $dbParser = DB::getParser(); $this->name = $dbParser->parseColumnName($this->name); } diff --git a/classes/xml/xmlquery/tags/column/InsertColumnsTag.class.php b/classes/xml/xmlquery/tags/column/InsertColumnsTag.class.php index f3fe110b4..91c2f997e 100644 --- a/classes/xml/xmlquery/tags/column/InsertColumnsTag.class.php +++ b/classes/xml/xmlquery/tags/column/InsertColumnsTag.class.php @@ -24,7 +24,7 @@ class InsertColumnsTag * @param array|string $xml_columns * @return void */ - function InsertColumnsTag($xml_columns) + function __construct($xml_columns) { $this->columns = array(); diff --git a/classes/xml/xmlquery/tags/column/SelectColumnTag.class.php b/classes/xml/xmlquery/tags/column/SelectColumnTag.class.php index a29192ea9..a955d0045 100644 --- a/classes/xml/xmlquery/tags/column/SelectColumnTag.class.php +++ b/classes/xml/xmlquery/tags/column/SelectColumnTag.class.php @@ -31,16 +31,16 @@ class SelectColumnTag extends ColumnTag * @param string|object $column * @return void */ - function SelectColumnTag($column) + function __construct($column) { if($column == "*" || $column->attrs->name == '*') { - parent::ColumnTag(NULL); + parent::__construct(NULL); $this->name = "*"; } else { - parent::ColumnTag($column->attrs->name); + parent::__construct($column->attrs->name); $dbParser = DB::getParser(); $this->name = $dbParser->parseExpression($this->name); diff --git a/classes/xml/xmlquery/tags/column/SelectColumnsTag.class.php b/classes/xml/xmlquery/tags/column/SelectColumnsTag.class.php index 271cee8a5..96975041c 100644 --- a/classes/xml/xmlquery/tags/column/SelectColumnsTag.class.php +++ b/classes/xml/xmlquery/tags/column/SelectColumnsTag.class.php @@ -25,7 +25,7 @@ class SelectColumnsTag * @internal param \Xml_Node_ $xml_columns * @return void */ - function SelectColumnsTag($xml_columns_tag) + function __construct($xml_columns_tag) { if(!$xml_columns_tag) { diff --git a/classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php b/classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php index 462c31192..55c390e75 100644 --- a/classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php +++ b/classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php @@ -31,9 +31,9 @@ class UpdateColumnTag extends ColumnTag * @param object $column * @return void */ - function UpdateColumnTag($column) + function __construct($column) { - parent::ColumnTag($column->attrs->name); + parent::__construct($column->attrs->name); $dbParser = DB::getParser(); $this->name = $dbParser->parseColumnName($this->name); diff --git a/classes/xml/xmlquery/tags/column/UpdateColumnsTag.class.php b/classes/xml/xmlquery/tags/column/UpdateColumnsTag.class.php index 765999db6..be0fea125 100644 --- a/classes/xml/xmlquery/tags/column/UpdateColumnsTag.class.php +++ b/classes/xml/xmlquery/tags/column/UpdateColumnsTag.class.php @@ -24,7 +24,7 @@ class UpdateColumnsTag * @param array|object $xml_columns * @return void */ - function UpdateColumnsTag($xml_columns) + function __construct($xml_columns) { $this->columns = array(); diff --git a/classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php b/classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php index dce3c825b..807ff3a1e 100644 --- a/classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php +++ b/classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php @@ -29,7 +29,7 @@ class ConditionGroupTag * @param string $pipe * @return void */ - function ConditionGroupTag($conditions, $pipe = "") + function __construct($conditions, $pipe = "") { $this->pipe = $pipe; diff --git a/classes/xml/xmlquery/tags/condition/ConditionTag.class.php b/classes/xml/xmlquery/tags/condition/ConditionTag.class.php index 795d95c77..4d0a2f5fc 100644 --- a/classes/xml/xmlquery/tags/condition/ConditionTag.class.php +++ b/classes/xml/xmlquery/tags/condition/ConditionTag.class.php @@ -59,7 +59,7 @@ class ConditionTag * @param object $condition * @return void */ - function ConditionTag($condition) + function __construct($condition) { $this->operation = $condition->attrs->operation; $this->pipe = $condition->attrs->pipe; diff --git a/classes/xml/xmlquery/tags/condition/ConditionsTag.class.php b/classes/xml/xmlquery/tags/condition/ConditionsTag.class.php index 661afa533..0042505ff 100644 --- a/classes/xml/xmlquery/tags/condition/ConditionsTag.class.php +++ b/classes/xml/xmlquery/tags/condition/ConditionsTag.class.php @@ -22,7 +22,7 @@ class ConditionsTag * @param object $xml_conditions * @return void */ - function ConditionsTag($xml_conditions) + function __construct($xml_conditions) { $this->condition_groups = array(); if(!$xml_conditions) diff --git a/classes/xml/xmlquery/tags/condition/JoinConditionsTag.class.php b/classes/xml/xmlquery/tags/condition/JoinConditionsTag.class.php index c4c253032..db6c0c353 100644 --- a/classes/xml/xmlquery/tags/condition/JoinConditionsTag.class.php +++ b/classes/xml/xmlquery/tags/condition/JoinConditionsTag.class.php @@ -16,9 +16,9 @@ class JoinConditionsTag extends ConditionsTag * @param object $xml_conditions * @return void */ - function JoinConditionsTag($xml_conditions) + function __construct($xml_conditions) { - parent::ConditionsTag($xml_conditions); + parent::__construct($xml_conditions); $this->condition_groups[0]->conditions[0]->setPipe(""); } diff --git a/classes/xml/xmlquery/tags/group/GroupsTag.class.php b/classes/xml/xmlquery/tags/group/GroupsTag.class.php index 8320e8d7b..ab5e70111 100644 --- a/classes/xml/xmlquery/tags/group/GroupsTag.class.php +++ b/classes/xml/xmlquery/tags/group/GroupsTag.class.php @@ -22,7 +22,7 @@ class GroupsTag * @param array|string $xml_groups * @return void */ - function GroupsTag($xml_groups) + function __construct($xml_groups) { $this->groups = array(); diff --git a/classes/xml/xmlquery/tags/navigation/IndexTag.class.php b/classes/xml/xmlquery/tags/navigation/IndexTag.class.php index 76800fbc5..fdd0bb39f 100644 --- a/classes/xml/xmlquery/tags/navigation/IndexTag.class.php +++ b/classes/xml/xmlquery/tags/navigation/IndexTag.class.php @@ -46,7 +46,7 @@ class IndexTag * @param object $index * @return void */ - function IndexTag($index) + function __construct($index) { $this->argument_name = $index->attrs->var; diff --git a/classes/xml/xmlquery/tags/navigation/LimitTag.class.php b/classes/xml/xmlquery/tags/navigation/LimitTag.class.php index 04325585d..e3ff511dd 100644 --- a/classes/xml/xmlquery/tags/navigation/LimitTag.class.php +++ b/classes/xml/xmlquery/tags/navigation/LimitTag.class.php @@ -40,7 +40,7 @@ class LimitTag * @param object $index * @return void */ - function LimitTag($index) + function __construct($index) { if($index->page && $index->page->attrs && $index->page_count && $index->page_count->attrs) { diff --git a/classes/xml/xmlquery/tags/navigation/NavigationTag.class.php b/classes/xml/xmlquery/tags/navigation/NavigationTag.class.php index 6c2019d65..50034c984 100644 --- a/classes/xml/xmlquery/tags/navigation/NavigationTag.class.php +++ b/classes/xml/xmlquery/tags/navigation/NavigationTag.class.php @@ -46,7 +46,7 @@ class NavigationTag * @param object $xml_navigation * @return void */ - function NavigationTag($xml_navigation) + function __construct($xml_navigation) { $this->order = array(); if($xml_navigation) diff --git a/classes/xml/xmlquery/tags/query/QueryTag.class.php b/classes/xml/xmlquery/tags/query/QueryTag.class.php index 36df75a11..3b5c36063 100644 --- a/classes/xml/xmlquery/tags/query/QueryTag.class.php +++ b/classes/xml/xmlquery/tags/query/QueryTag.class.php @@ -119,7 +119,7 @@ class QueryTag * @param bool $isSubQuery * @return void */ - function QueryTag($query, $isSubQuery = FALSE) + function __construct($query, $isSubQuery = FALSE) { $this->action = $query->attrs->action; $this->query_id = $query->attrs->id; diff --git a/classes/xml/xmlquery/tags/table/HintTableTag.class.php b/classes/xml/xmlquery/tags/table/HintTableTag.class.php index d499c2c1f..bba162149 100644 --- a/classes/xml/xmlquery/tags/table/HintTableTag.class.php +++ b/classes/xml/xmlquery/tags/table/HintTableTag.class.php @@ -25,9 +25,9 @@ class HintTableTag extends TableTag * @param array $index * @return void */ - function HintTableTag($table, $index) + function __construct($table, $index) { - parent::TableTag($table); + parent::__construct($table); $this->index = $index; } diff --git a/classes/xml/xmlquery/tags/table/TableTag.class.php b/classes/xml/xmlquery/tags/table/TableTag.class.php index 1156a678b..82cc2af37 100644 --- a/classes/xml/xmlquery/tags/table/TableTag.class.php +++ b/classes/xml/xmlquery/tags/table/TableTag.class.php @@ -66,7 +66,7 @@ class TableTag * @param object $table XML tag * @return void */ - function TableTag($table) + function __construct($table) { $dbParser = DB::getParser(); diff --git a/classes/xml/xmlquery/tags/table/TablesTag.class.php b/classes/xml/xmlquery/tags/table/TablesTag.class.php index 80eb97ee1..86e94ea4f 100644 --- a/classes/xml/xmlquery/tags/table/TablesTag.class.php +++ b/classes/xml/xmlquery/tags/table/TablesTag.class.php @@ -33,7 +33,7 @@ class TablesTag * @param object $xml_index_hints_tag * @return void */ - function TablesTag($xml_tables_tag, $xml_index_hints_tag = NULL) + function __construct($xml_tables_tag, $xml_index_hints_tag = NULL) { $this->tables = array(); diff --git a/common/js/plugins/ckeditor/ckeditor/adapters/jquery.js b/common/js/plugins/ckeditor/ckeditor/adapters/jquery.js index 704635fb4..36077a487 100644 --- a/common/js/plugins/ckeditor/ckeditor/adapters/jquery.js +++ b/common/js/plugins/ckeditor/ckeditor/adapters/jquery.js @@ -2,9 +2,9 @@ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.md or http://ckeditor.com/license */ -(function(a){CKEDITOR.config.jqueryOverrideVal="undefined"==typeof CKEDITOR.config.jqueryOverrideVal?!0:CKEDITOR.config.jqueryOverrideVal;"undefined"!=typeof a&&(a.extend(a.fn,{ckeditorGet:function(){var a=this.eq(0).data("ckeditorInstance");if(!a)throw"CKEditor is not initialized yet, use ckeditor() with a callback.";return a},ckeditor:function(g,d){if(!CKEDITOR.env.isCompatible)throw Error("The environment is incompatible.");if(!a.isFunction(g))var k=d,d=g,g=k;var i=[],d=d||{};this.each(function(){var b= -a(this),c=b.data("ckeditorInstance"),f=b.data("_ckeditorInstanceLock"),h=this,j=new a.Deferred;i.push(j.promise());if(c&&!f)g&&g.apply(c,[this]),j.resolve();else if(f)c.once("instanceReady",function(){setTimeout(function(){c.element?(c.element.$==h&&g&&g.apply(c,[h]),j.resolve()):setTimeout(arguments.callee,100)},0)},null,null,9999);else{if(d.autoUpdateElement||"undefined"==typeof d.autoUpdateElement&&CKEDITOR.config.autoUpdateElement)d.autoUpdateElementJquery=!0;d.autoUpdateElement=!1;b.data("_ckeditorInstanceLock", -!0);c=a(this).is("textarea")?CKEDITOR.replace(h,d):CKEDITOR.inline(h,d);b.data("ckeditorInstance",c);c.on("instanceReady",function(d){var e=d.editor;setTimeout(function(){if(e.element){d.removeListener();e.on("dataReady",function(){b.trigger("dataReady.ckeditor",[e])});e.on("setData",function(a){b.trigger("setData.ckeditor",[e,a.data])});e.on("getData",function(a){b.trigger("getData.ckeditor",[e,a.data])},999);e.on("destroy",function(){b.trigger("destroy.ckeditor",[e])});e.on("save",function(){a(h.form).submit(); -return!1},null,null,20);if(e.config.autoUpdateElementJquery&&b.is("textarea")&&a(h.form).length){var c=function(){b.ckeditor(function(){e.updateElement()})};a(h.form).submit(c);a(h.form).bind("form-pre-serialize",c);b.bind("destroy.ckeditor",function(){a(h.form).unbind("submit",c);a(h.form).unbind("form-pre-serialize",c)})}e.on("destroy",function(){b.removeData("ckeditorInstance")});b.removeData("_ckeditorInstanceLock");b.trigger("instanceReady.ckeditor",[e]);g&&g.apply(e,[h]);j.resolve()}else setTimeout(arguments.callee, -100)},0)},null,null,9999)}});var f=new a.Deferred;this.promise=f.promise();a.when.apply(this,i).then(function(){f.resolve()});this.editor=this.eq(0).data("ckeditorInstance");return this}}),CKEDITOR.config.jqueryOverrideVal&&(a.fn.val=CKEDITOR.tools.override(a.fn.val,function(g){return function(d){if(arguments.length){var k=this,i=[],f=this.each(function(){var b=a(this),c=b.data("ckeditorInstance");if(b.is("textarea")&&c){var f=new a.Deferred;c.setData(d,function(){f.resolve()});i.push(f.promise()); -return!0}return g.call(b,d)});if(i.length){var b=new a.Deferred;a.when.apply(this,i).done(function(){b.resolveWith(k)});return b.promise()}return f}var f=a(this).eq(0),c=f.data("ckeditorInstance");return f.is("textarea")&&c?c.getData():g.call(f)}})))})(window.jQuery); \ No newline at end of file +(function(a){if("undefined"==typeof a)throw Error("jQuery should be loaded before CKEditor jQuery adapter.");if("undefined"==typeof CKEDITOR)throw Error("CKEditor should be loaded before CKEditor jQuery adapter.");CKEDITOR.config.jqueryOverrideVal="undefined"==typeof CKEDITOR.config.jqueryOverrideVal?!0:CKEDITOR.config.jqueryOverrideVal;a.extend(a.fn,{ckeditorGet:function(){var a=this.eq(0).data("ckeditorInstance");if(!a)throw"CKEditor is not initialized yet, use ckeditor() with a callback.";return a}, +ckeditor:function(g,d){if(!CKEDITOR.env.isCompatible)throw Error("The environment is incompatible.");if(!a.isFunction(g))var k=d,d=g,g=k;var i=[],d=d||{};this.each(function(){var b=a(this),c=b.data("ckeditorInstance"),f=b.data("_ckeditorInstanceLock"),h=this,j=new a.Deferred;i.push(j.promise());if(c&&!f)g&&g.apply(c,[this]),j.resolve();else if(f)c.once("instanceReady",function(){setTimeout(function(){c.element?(c.element.$==h&&g&&g.apply(c,[h]),j.resolve()):setTimeout(arguments.callee,100)},0)},null, +null,9999);else{if(d.autoUpdateElement||"undefined"==typeof d.autoUpdateElement&&CKEDITOR.config.autoUpdateElement)d.autoUpdateElementJquery=!0;d.autoUpdateElement=!1;b.data("_ckeditorInstanceLock",!0);c=a(this).is("textarea")?CKEDITOR.replace(h,d):CKEDITOR.inline(h,d);b.data("ckeditorInstance",c);c.on("instanceReady",function(d){var e=d.editor;setTimeout(function(){if(e.element){d.removeListener();e.on("dataReady",function(){b.trigger("dataReady.ckeditor",[e])});e.on("setData",function(a){b.trigger("setData.ckeditor", +[e,a.data])});e.on("getData",function(a){b.trigger("getData.ckeditor",[e,a.data])},999);e.on("destroy",function(){b.trigger("destroy.ckeditor",[e])});e.on("save",function(){a(h.form).submit();return!1},null,null,20);if(e.config.autoUpdateElementJquery&&b.is("textarea")&&a(h.form).length){var c=function(){b.ckeditor(function(){e.updateElement()})};a(h.form).submit(c);a(h.form).bind("form-pre-serialize",c);b.bind("destroy.ckeditor",function(){a(h.form).unbind("submit",c);a(h.form).unbind("form-pre-serialize", +c)})}e.on("destroy",function(){b.removeData("ckeditorInstance")});b.removeData("_ckeditorInstanceLock");b.trigger("instanceReady.ckeditor",[e]);g&&g.apply(e,[h]);j.resolve()}else setTimeout(arguments.callee,100)},0)},null,null,9999)}});var f=new a.Deferred;this.promise=f.promise();a.when.apply(this,i).then(function(){f.resolve()});this.editor=this.eq(0).data("ckeditorInstance");return this}});CKEDITOR.config.jqueryOverrideVal&&(a.fn.val=CKEDITOR.tools.override(a.fn.val,function(g){return function(d){if(arguments.length){var k= +this,i=[],f=this.each(function(){var b=a(this),c=b.data("ckeditorInstance");if(b.is("textarea")&&c){var f=new a.Deferred;c.setData(d,function(){f.resolve()});i.push(f.promise());return!0}return g.call(b,d)});if(i.length){var b=new a.Deferred;a.when.apply(this,i).done(function(){b.resolveWith(k)});return b.promise()}return f}var f=a(this).eq(0),c=f.data("ckeditorInstance");return f.is("textarea")&&c?c.getData():g.call(f)}}))})(window.jQuery); \ No newline at end of file diff --git a/common/js/plugins/ckeditor/ckeditor/build-config.js b/common/js/plugins/ckeditor/ckeditor/build-config.js index dd1c656b1..82210ba12 100644 --- a/common/js/plugins/ckeditor/ckeditor/build-config.js +++ b/common/js/plugins/ckeditor/ckeditor/build-config.js @@ -42,6 +42,7 @@ var CKBUILDER_CONFIG = { '.jscsrc', '.jshintignore', '.jshintrc', + 'less', '.mailmap', 'node_modules', 'package.json', diff --git a/common/js/plugins/ckeditor/ckeditor/ckeditor.js b/common/js/plugins/ckeditor/ckeditor/ckeditor.js index d0e208582..032d7e399 100644 --- a/common/js/plugins/ckeditor/ckeditor/ckeditor.js +++ b/common/js/plugins/ckeditor/ckeditor/ckeditor.js @@ -2,564 +2,591 @@ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.md or http://ckeditor.com/license */ -(function(){if(window.CKEDITOR&&window.CKEDITOR.dom)return;window.CKEDITOR||(window.CKEDITOR=function(){var a=/(^|.*[\\\/])ckeditor\.js(?:\?.*|;.*)?$/i,f={timestamp:"F0RD",version:"4.4.7",revision:"3a35b3d",rnd:Math.floor(900*Math.random())+100,_:{pending:[],basePathSrcPattern:a},status:"unloaded",basePath:function(){var e=window.CKEDITOR_BASEPATH||"";if(!e)for(var d=document.getElementsByTagName("script"),c=0;c=0;s--)if(m[s].priority<=k){m.splice(s+1,0,j);return{removeListener:g}}m.unshift(j)}return{removeListener:g}}, -once:function(){var a=Array.prototype.slice.call(arguments),e=a[1];a[1]=function(a){a.removeListener();return e.apply(this,arguments)};return this.on.apply(this,a)},capture:function(){CKEDITOR.event.useCapture=1;var a=this.on.apply(this,arguments);CKEDITOR.event.useCapture=0;return a},fire:function(){var a=0,e=function(){a=1},d=0,b=function(){d=1};return function(k,j,g){var m=f(this)[k],k=a,y=d;a=d=0;if(m){var s=m.listeners;if(s.length)for(var s=s.slice(0),w,q=0;q=0&&d.listeners.splice(b,1)}},removeAllListeners:function(){var a=f(this),e;for(e in a)delete a[e]},hasListeners:function(a){return(a=f(this)[a])&&a.listeners.length> -0}}}());CKEDITOR.editor||(CKEDITOR.editor=function(){CKEDITOR._.pending.push([this,arguments]);CKEDITOR.event.call(this)},CKEDITOR.editor.prototype.fire=function(a,f){a in{instanceReady:1,loaded:1}&&(this[a]=true);return CKEDITOR.event.prototype.fire.call(this,a,f,this)},CKEDITOR.editor.prototype.fireOnce=function(a,f){a in{instanceReady:1,loaded:1}&&(this[a]=true);return CKEDITOR.event.prototype.fireOnce.call(this,a,f,this)},CKEDITOR.event.implementOn(CKEDITOR.editor.prototype)); -CKEDITOR.env||(CKEDITOR.env=function(){var a=navigator.userAgent.toLowerCase(),f={ie:a.indexOf("trident/")>-1,webkit:a.indexOf(" applewebkit/")>-1,air:a.indexOf(" adobeair/")>-1,mac:a.indexOf("macintosh")>-1,quirks:document.compatMode=="BackCompat"&&(!document.documentMode||document.documentMode<10),mobile:a.indexOf("mobile")>-1,iOS:/(ipad|iphone|ipod)/.test(a),isCustomDomain:function(){if(!this.ie)return false;var a=document.domain,d=window.location.hostname;return a!=d&&a!="["+d+"]"},secure:location.protocol== -"https:"};f.gecko=navigator.product=="Gecko"&&!f.webkit&&!f.ie;if(f.webkit)a.indexOf("chrome")>-1?f.chrome=true:f.safari=true;var b=0;if(f.ie){b=f.quirks||!document.documentMode?parseFloat(a.match(/msie (\d+)/)[1]):document.documentMode;f.ie9Compat=b==9;f.ie8Compat=b==8;f.ie7Compat=b==7;f.ie6Compat=b<7||f.quirks}if(f.gecko){var c=a.match(/rv:([\d\.]+)/);if(c){c=c[1].split(".");b=c[0]*1E4+(c[1]||0)*100+(c[2]||0)*1}}f.air&&(b=parseFloat(a.match(/ adobeair\/(\d+)/)[1]));f.webkit&&(b=parseFloat(a.match(/ applewebkit\/(\d+)/)[1])); -f.version=b;f.isCompatible=f.iOS&&b>=534||!f.mobile&&(f.ie&&b>6||f.gecko&&b>=2E4||f.air&&b>=1||f.webkit&&b>=522||false);f.hidpi=window.devicePixelRatio>=2;f.needsBrFiller=f.gecko||f.webkit||f.ie&&b>10;f.needsNbspFiller=f.ie&&b<11;f.cssClass="cke_browser_"+(f.ie?"ie":f.gecko?"gecko":f.webkit?"webkit":"unknown");if(f.quirks)f.cssClass=f.cssClass+" cke_browser_quirks";if(f.ie)f.cssClass=f.cssClass+(" cke_browser_ie"+(f.quirks?"6 cke_browser_iequirks":f.version));if(f.air)f.cssClass=f.cssClass+" cke_browser_air"; -if(f.iOS)f.cssClass=f.cssClass+" cke_browser_ios";if(f.hidpi)f.cssClass=f.cssClass+" cke_hidpi";return f}()); +(function(){if(window.CKEDITOR&&window.CKEDITOR.dom)return;window.CKEDITOR||(window.CKEDITOR=function(){var a=/(^|.*[\\\/])ckeditor\.js(?:\?.*|;.*)?$/i,d={timestamp:"F7J9",version:"4.5.3",revision:"6c70c82",rnd:Math.floor(900*Math.random())+100,_:{pending:[],basePathSrcPattern:a},status:"unloaded",basePath:function(){var b=window.CKEDITOR_BASEPATH||"";if(!b)for(var c=document.getElementsByTagName("script"),d=0;d=0;r--)if(g[r].priority<=i){g.splice(r+1,0,j);return{removeListener:n}}g.unshift(j)}return{removeListener:n}}, +once:function(){var a=Array.prototype.slice.call(arguments),b=a[1];a[1]=function(a){a.removeListener();return b.apply(this,arguments)};return this.on.apply(this,a)},capture:function(){CKEDITOR.event.useCapture=1;var a=this.on.apply(this,arguments);CKEDITOR.event.useCapture=0;return a},fire:function(){var a=0,b=function(){a=1},f=0,h=function(){f=1};return function(i,j,n){var g=d(this)[i],i=a,A=f;a=f=0;if(g){var r=g.listeners;if(r.length)for(var r=r.slice(0),y,o=0;o=0&&f.listeners.splice(h,1)}},removeAllListeners:function(){var a=d(this),b;for(b in a)delete a[b]},hasListeners:function(a){return(a=d(this)[a])&&a.listeners.length> +0}}}());CKEDITOR.editor||(CKEDITOR.editor=function(){CKEDITOR._.pending.push([this,arguments]);CKEDITOR.event.call(this)},CKEDITOR.editor.prototype.fire=function(a,d){a in{instanceReady:1,loaded:1}&&(this[a]=true);return CKEDITOR.event.prototype.fire.call(this,a,d,this)},CKEDITOR.editor.prototype.fireOnce=function(a,d){a in{instanceReady:1,loaded:1}&&(this[a]=true);return CKEDITOR.event.prototype.fireOnce.call(this,a,d,this)},CKEDITOR.event.implementOn(CKEDITOR.editor.prototype)); +CKEDITOR.env||(CKEDITOR.env=function(){var a=navigator.userAgent.toLowerCase(),d=a.match(/edge[ \/](\d+.?\d*)/),b=a.indexOf("trident/")>-1,b=!(!d&&!b),b={ie:b,edge:!!d,webkit:!b&&a.indexOf(" applewebkit/")>-1,air:a.indexOf(" adobeair/")>-1,mac:a.indexOf("macintosh")>-1,quirks:document.compatMode=="BackCompat"&&(!document.documentMode||document.documentMode<10),mobile:a.indexOf("mobile")>-1,iOS:/(ipad|iphone|ipod)/.test(a),isCustomDomain:function(){if(!this.ie)return false;var a=document.domain,b= +window.location.hostname;return a!=b&&a!="["+b+"]"},secure:location.protocol=="https:"};b.gecko=navigator.product=="Gecko"&&!b.webkit&&!b.ie;if(b.webkit)a.indexOf("chrome")>-1?b.chrome=true:b.safari=true;var c=0;if(b.ie){c=d?parseFloat(d[1]):b.quirks||!document.documentMode?parseFloat(a.match(/msie (\d+)/)[1]):document.documentMode;b.ie9Compat=c==9;b.ie8Compat=c==8;b.ie7Compat=c==7;b.ie6Compat=c<7||b.quirks}if(b.gecko)if(d=a.match(/rv:([\d\.]+)/)){d=d[1].split(".");c=d[0]*1E4+(d[1]||0)*100+(d[2]|| +0)*1}b.air&&(c=parseFloat(a.match(/ adobeair\/(\d+)/)[1]));b.webkit&&(c=parseFloat(a.match(/ applewebkit\/(\d+)/)[1]));b.version=c;b.isCompatible=!(b.ie&&c<7)&&!(b.gecko&&c<4E4)&&!(b.webkit&&c<534);b.hidpi=window.devicePixelRatio>=2;b.needsBrFiller=b.gecko||b.webkit||b.ie&&c>10;b.needsNbspFiller=b.ie&&c<11;b.cssClass="cke_browser_"+(b.ie?"ie":b.gecko?"gecko":b.webkit?"webkit":"unknown");if(b.quirks)b.cssClass=b.cssClass+" cke_browser_quirks";if(b.ie)b.cssClass=b.cssClass+(" cke_browser_ie"+(b.quirks? +"6 cke_browser_iequirks":b.version));if(b.air)b.cssClass=b.cssClass+" cke_browser_air";if(b.iOS)b.cssClass=b.cssClass+" cke_browser_ios";if(b.hidpi)b.cssClass=b.cssClass+" cke_hidpi";return b}()); "unloaded"==CKEDITOR.status&&function(){CKEDITOR.event.implementOn(CKEDITOR);CKEDITOR.loadFullCore=function(){if(CKEDITOR.status!="basic_ready")CKEDITOR.loadFullCore._load=1;else{delete CKEDITOR.loadFullCore;var a=document.createElement("script");a.type="text/javascript";a.src=CKEDITOR.basePath+"ckeditor.js";document.getElementsByTagName("head")[0].appendChild(a)}};CKEDITOR.loadFullCoreTimeout=0;CKEDITOR.add=function(a){(this._.pending||(this._.pending=[])).push(a)};(function(){CKEDITOR.domReady(function(){var a= -CKEDITOR.loadFullCore,f=CKEDITOR.loadFullCoreTimeout;if(a){CKEDITOR.status="basic_ready";a&&a._load?a():f&&setTimeout(function(){CKEDITOR.loadFullCore&&CKEDITOR.loadFullCore()},f*1E3)}})})();CKEDITOR.status="basic_loaded"}();CKEDITOR.dom={}; -(function(){var a=[],f=CKEDITOR.env.gecko?"-moz-":CKEDITOR.env.webkit?"-webkit-":CKEDITOR.env.ie?"-ms-":"",b=/&/g,c=/>/g,e=/"+e+""):d.push('');return d.join("")}, -htmlEncode:function(a){return(""+a).replace(b,"&").replace(c,">").replace(e,"<")},htmlDecode:function(a){return a.replace(h,"&").replace(k,">").replace(j,"<")},htmlEncodeAttr:function(a){return a.replace(d,""").replace(e,"<").replace(c,">")},htmlDecodeAttr:function(a){return a.replace(g,'"').replace(j,"<").replace(k,">")},getNextNumber:function(){var a=0;return function(){return++a}}(),getNextId:function(){return"cke_"+this.getNextNumber()},override:function(a,e){var d=e(a);d.prototype= -a.prototype;return d},setTimeout:function(a,e,d,b,c){c||(c=window);d||(d=c);return c.setTimeout(function(){b?a.apply(d,[].concat(b)):a.apply(d)},e||0)},trim:function(){var a=/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g;return function(e){return e.replace(a,"")}}(),ltrim:function(){var a=/^[ \t\n\r]+/g;return function(e){return e.replace(a,"")}}(),rtrim:function(){var a=/[ \t\n\r]+$/g;return function(e){return e.replace(a,"")}}(),indexOf:function(a,e){if(typeof e=="function")for(var d=0,b=a.length;d=0?a[d]:null},bind:function(a,e){return function(){return a.apply(e,arguments)}},createClass:function(a){var e=a.$,d=a.base,b=a.privates||a._,c=a.proto,a=a.statics;!e&&(e=function(){d&&this.base.apply(this,arguments)});if(b)var f=e,e=function(){var a=this._||(this._={}),e;for(e in b){var d=b[e];a[e]=typeof d=="function"?CKEDITOR.tools.bind(d,this):d}f.apply(this,arguments)};if(d){e.prototype= -this.prototypedCopy(d.prototype);e.prototype.constructor=e;e.base=d;e.baseProto=d.prototype;e.prototype.base=function(){this.base=d.prototype.base;d.apply(this,arguments);this.base=arguments.callee}}c&&this.extend(e.prototype,c,true);a&&this.extend(e,a,true);return e},addFunction:function(e,d){return a.push(function(){return e.apply(d||this,arguments)})-1},removeFunction:function(e){a[e]=null},callFunction:function(e){var d=a[e];return d&&d.apply(window,Array.prototype.slice.call(arguments,1))},cssLength:function(){var a= -/^-?\d+\.?\d*px$/,e;return function(d){e=CKEDITOR.tools.trim(d+"")+"px";return a.test(e)?e:d||""}}(),convertToPx:function(){var a;return function(e){if(!a){a=CKEDITOR.dom.element.createFromHtml('
',CKEDITOR.document);CKEDITOR.document.getBody().append(a)}if(!/%$/.test(e)){a.setStyle("width",e);return a.$.clientWidth}return e}}(),repeat:function(a,e){return Array(e+1).join(a)},tryThese:function(){for(var a, -e=0,d=arguments.length;e/g,e=/",amp:"&",quot:'"',nbsp:" ",shy:"­"},j=function(a,g){return g[0]=="#"?String.fromCharCode(parseInt(g.slice(1),10)):i[g]};CKEDITOR.on("reset",function(){a=[]});CKEDITOR.tools={arrayCompare:function(a,g){if(!a&&!g)return true;if(!a||!g||a.length!=g.length)return false;for(var b=0;b"+g+""):b.push('');return b.join("")},htmlEncode:function(a){return a===void 0||a===null?"":(""+a).replace(b,"&").replace(c,">").replace(e,"<")},htmlDecode:function(a){return a.replace(h,j)},htmlEncodeAttr:function(a){return CKEDITOR.tools.htmlEncode(a).replace(f,""")},htmlDecodeAttr:function(a){return CKEDITOR.tools.htmlDecode(a)},transformPlainTextToHtml:function(a, +g){var b=g==CKEDITOR.ENTER_BR,c=this.htmlEncode(a.replace(/\r\n/g,"\n")),c=c.replace(/\t/g,"    "),i=g==CKEDITOR.ENTER_P?"p":"div";if(!b){var o=/\n{2}/g;if(o.test(c))var d="<"+i+">",j="",c=d+c.replace(o,function(){return j+d})+j}c=c.replace(/\n/g,"
");b||(c=c.replace(RegExp("
(?=)"),function(a){return CKEDITOR.tools.repeat(a,2)}));c=c.replace(/^ | $/g," ");return c=c.replace(/(>|\s) /g,function(a,g){return g+" "}).replace(/ (?=<)/g," ")},getNextNumber:function(){var a= +0;return function(){return++a}}(),getNextId:function(){return"cke_"+this.getNextNumber()},getUniqueId:function(){for(var a="e",g=0;g<8;g++)a=a+Math.floor((1+Math.random())*65536).toString(16).substring(1);return a},override:function(a,g){var b=g(a);b.prototype=a.prototype;return b},setTimeout:function(a,g,b,c,i){i||(i=window);b||(b=i);return i.setTimeout(function(){c?a.apply(b,[].concat(c)):a.apply(b)},g||0)},trim:function(){var a=/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g;return function(g){return g.replace(a, +"")}}(),ltrim:function(){var a=/^[ \t\n\r]+/g;return function(g){return g.replace(a,"")}}(),rtrim:function(){var a=/[ \t\n\r]+$/g;return function(g){return g.replace(a,"")}}(),indexOf:function(a,g){if(typeof g=="function")for(var b=0,c=a.length;b=0?a[c]:null},bind:function(a,b){return function(){return a.apply(b, +arguments)}},createClass:function(a){var b=a.$,c=a.base,i=a.privates||a._,d=a.proto,a=a.statics;!b&&(b=function(){c&&this.base.apply(this,arguments)});if(i)var o=b,b=function(){var a=this._||(this._={}),b;for(b in i){var g=i[b];a[b]=typeof g=="function"?CKEDITOR.tools.bind(g,this):g}o.apply(this,arguments)};if(c){b.prototype=this.prototypedCopy(c.prototype);b.prototype.constructor=b;b.base=c;b.baseProto=c.prototype;b.prototype.base=function(){this.base=c.prototype.base;c.apply(this,arguments);this.base= +arguments.callee}}d&&this.extend(b.prototype,d,true);a&&this.extend(b,a,true);return b},addFunction:function(b,g){return a.push(function(){return b.apply(g||this,arguments)})-1},removeFunction:function(b){a[b]=null},callFunction:function(b){var g=a[b];return g&&g.apply(window,Array.prototype.slice.call(arguments,1))},cssLength:function(){var a=/^-?\d+\.?\d*px$/,b;return function(c){b=CKEDITOR.tools.trim(c+"")+"px";return a.test(b)?b:c||""}}(),convertToPx:function(){var a;return function(b){if(!a){a= +CKEDITOR.dom.element.createFromHtml('
',CKEDITOR.document);CKEDITOR.document.getBody().append(a)}if(!/%$/.test(b)){a.setStyle("width",b);return a.$.clientWidth}return b}}(),repeat:function(a,b){return Array(b+1).join(a)},tryThese:function(){for(var a,b=0,c=arguments.length;b]*?>)|^/i,'$&\n + +
diff --git a/modules/admin/admin.admin.controller.php b/modules/admin/admin.admin.controller.php index f17618391..87c3891e7 100644 --- a/modules/admin/admin.admin.controller.php +++ b/modules/admin/admin.admin.controller.php @@ -140,7 +140,7 @@ class adminAdminController extends admin $oMemberController = getController('member'); $oMemberController->procMemberLogout(); - header('Location: ' . getNotEncodedUrl('', 'module', 'admin')); + header('Location: ' . getNotEncodedUrl('')); } public function procAdminInsertDefaultDesignInfo() @@ -501,7 +501,7 @@ class adminAdminController extends admin $vars = Context::getRequestVars(); $oInstallController = getController('install'); - $db_info = Context::getDbInfo(); + $db_info = Context::getDBInfo(); $db_info->use_sitelock = ($vars->use_sitelock) ? $vars->use_sitelock : 'N'; $db_info->sitelock_title = $vars->sitelock_title; @@ -543,7 +543,7 @@ class adminAdminController extends admin { $vars = Context::getRequestVars(); - $db_info = Context::getDbInfo(); + $db_info = Context::getDBInfo(); $white_object = $vars->embed_white_object; $white_object = preg_replace("/[\r\n|\r|\n]+/", '|@|', $white_object); diff --git a/modules/admin/admin.admin.view.php b/modules/admin/admin.admin.view.php index 35eee1af1..e6d58cbfe 100644 --- a/modules/admin/admin.admin.view.php +++ b/modules/admin/admin.admin.view.php @@ -71,6 +71,7 @@ class adminAdminView extends admin Context::set('use_html5', $db_info->use_html5 == 'Y' ? 'Y' : 'N'); Context::set('use_spaceremover', $db_info->use_spaceremover ? $db_info->use_spaceremover : 'Y'); //not use Context::set('qmail_compatibility', $db_info->qmail_compatibility == 'Y' ? 'Y' : 'N'); + Context::set('cache_friendly', $db_info->cache_friendly == 'Y' ? 'Y' : 'N'); Context::set('use_db_session', $db_info->use_db_session == 'N' ? 'N' : 'Y'); Context::set('use_mobile_view', $db_info->use_mobile_view == 'Y' ? 'Y' : 'N'); Context::set('use_ssl', $db_info->use_ssl ? $db_info->use_ssl : "none"); diff --git a/modules/admin/lang/lang.xml b/modules/admin/lang/lang.xml index ed6277a3b..770d3f2c3 100644 --- a/modules/admin/lang/lang.xml +++ b/modules/admin/lang/lang.xml @@ -358,7 +358,7 @@ - + @@ -760,6 +760,18 @@ + + + + + + + + + 이 옵션을 선택할 경우 방문자 수 및 조회수 집계가 정확하지 않을 수 있습니다.]]> + Selecting this option may cause view counts and visitor counts to become inaccurate.]]> + このオプションを選択した場合、訪問者数とヒット集計が正確でない場合があります。]]> + @@ -1353,7 +1365,6 @@ - @@ -1397,7 +1408,6 @@ - @@ -1410,7 +1420,6 @@ - @@ -1424,7 +1433,6 @@ - @@ -1457,12 +1465,30 @@ - - + + + + + + + + + + 매우 심각한 PHP 보안 문제 및 공격에 노출될 수 있습니다.
  • XE 최신 버전을 사용할 수 없습니다.
  • XE 최신 버전 이상에서 지원하는 확장 기능을 사용할 수 없습니다.
  • 일부 확장 기능이 동작하지 않거나, 이로 인해 장애가 발생할 수 있습니다.
  • ]]>
    + PHP version of this server can be exposed to serious security problems and attacks.
  • Latest version of XE is not available.
  • You can not use extensions that are supported by the latest version of XE.
  • Some extensions may not work properly. It can cause problems.
  • ]]>
    +
    + + + + + + + + diff --git a/modules/admin/tpl/_dashboard_default.html b/modules/admin/tpl/_dashboard_default.html index 1028cc468..32e4ae3e2 100644 --- a/modules/admin/tpl/_dashboard_default.html +++ b/modules/admin/tpl/_dashboard_default.html @@ -63,4 +63,3 @@

    {$lang->more}

    - diff --git a/modules/admin/tpl/_header.html b/modules/admin/tpl/_header.html index 34b083724..ef2f95953 100644 --- a/modules/admin/tpl/_header.html +++ b/modules/admin/tpl/_header.html @@ -1,5 +1,7 @@ + +

    {$lang->skip_to_content}

    diff --git a/modules/admin/tpl/admin_setup.html b/modules/admin/tpl/admin_setup.html index a75dfc524..758739f5c 100644 --- a/modules/admin/tpl/admin_setup.html +++ b/modules/admin/tpl/admin_setup.html @@ -114,3 +114,5 @@ .adminMap .parent>.side{right:30px} .adminMap .placeholder{background:#000;border-radius:5px} + +
    diff --git a/modules/admin/tpl/config_ftp.html b/modules/admin/tpl/config_ftp.html index 4208abd88..22e2c0a67 100644 --- a/modules/admin/tpl/config_ftp.html +++ b/modules/admin/tpl/config_ftp.html @@ -124,3 +124,5 @@ jQuery(function($){ }); }); + +
    diff --git a/modules/admin/tpl/config_general.html b/modules/admin/tpl/config_general.html index 3ec964fd8..8aa44749c 100644 --- a/modules/admin/tpl/config_general.html +++ b/modules/admin/tpl/config_general.html @@ -225,6 +225,15 @@
    +
    + +
    + + +
    +

    {$lang->about_cache_friendly}

    +
    +
    @@ -314,3 +323,4 @@ function doSubmitConfig() +
    diff --git a/modules/admin/tpl/css/admin.css b/modules/admin/tpl/css/admin.css index 674e20d79..1de422984 100644 --- a/modules/admin/tpl/css/admin.css +++ b/modules/admin/tpl/css/admin.css @@ -908,6 +908,9 @@ margin-bottom: 10px; text-decoration: none; color: #666; } +.x>.header>.account>ul>li.forum-chak>a { + color: #FFF; +} .x>.header>.account>ul>li>a:hover, .x>.header>.account>ul>li>a:focus { text-decoration: underline; @@ -2387,3 +2390,33 @@ html[lang="mn"] .x .g11n.active>[disabled], height: 1px; overflow: hidden; } + + +.admin-forum-container { + clear: both; + margin: 10px 5px; + border: 0 solid #ddd; +} +.admin-forum-container.activated-forum { + margin-top: 30px; + padding: 15px; + background-color: #fbfbfb; + border-width: 3px 0; +} +.admin-forum-container .open-forum { + display: inline-block; + padding: 15px; + padding-left: 60px; + color: #0088cc; + font-size: 14px; + height: 20px; + line-height: 20px; + text-decoration: none; + background-image: url('../img/chak_c.png'); + background-repeat: no-repeat; + background-position: center left; +} +.admin-forum-container .open-forum:hover, +.admin-forum-container .open-forum:active { + text-decoration: underline; +} diff --git a/modules/admin/tpl/css/admin.min.css b/modules/admin/tpl/css/admin.min.css index 6a7951a31..01d029db8 100644 --- a/modules/admin/tpl/css/admin.min.css +++ b/modules/admin/tpl/css/admin.min.css @@ -1 +1 @@ -@charset "utf-8";body,html{min-height:100%}body{-webkit-text-size-adjust:none}body>.x:first-child{min-width:300px;max-width:1240px;margin:0 auto}.x button,.x input,.x label,.x select,.x table,.x textarea,body>.x{font-size:13px}.x strong,.x th{font-weight:600}.x dfn,.x em{font-style:normal}.x [disabled]{cursor:not-allowed}.x [hidden]{display:none}.x a[target="_blank"]:after{content:"";display:inline-block;width:14px;height:14px;vertical-align:middle;margin:-2px 0 0 2px;background-position:-120px -72px;opacity:.3;filter:alpha(opacity=30)}.x a[target="_blank"]:focus:after,.x a[target="_blank"]:hover:after{opacity:.7;filter:alpha(opacity=70)}.x mark{background-color:#FF0;color:#000}.x .x_page-header{margin-top:10px;padding-bottom:0;border-bottom:2px solid #ddd}.x .x_page-header>h1{position:relative;margin-bottom:0;font-size:24px;color:#333}.x .x_page-header>h1>.x_icon-question-sign{margin:0}.x .x_page-header>h1>.path+.x_icon-question-sign{margin:4px 0 0}.x .x_icon-question-sign{vertical-align:middle}.x h1,.x h2,.x h3,.x h4,.x h5,.x h6{line-height:1.5;font-weight:600;color:#666;text-rendering:auto}.x h1{font-size:22px}.x h2{font-size:18px}.x h3{font-size:14px}.x h4,.x h5,.x h6{font-size:12px}.x [class*=" x_icon-"],.x [class^=x_icon-]{text-decoration:none;border:0;padding:0 0 0 14px;width:0;background-color:transparent;overflow:hidden;font-size:0}.x .x_close{width:32px;height:32px;font-size:17px;opacity:.5;filter:alpha(opacity=50)}.x .x_alert{position:relative}.x .x_alert>.x_close{position:absolute;top:0;right:0}.x .x_pagination{height:26px;margin:10px 0 0}.x .x_pagination ul>li>a,.x .x_pagination ul>li>span,.x .x_pagination ul>li>strong{line-height:24px;padding:0 8px}.x .x_pagination ul>.x_active>a,.x .x_pagination ul>.x_active>span,.x .x_pagination ul>.x_active>strong{line-height:26px;border:0;background-color:#333!important;color:#fff;font-weight:700;font-size:18px;font-family:Arial,Helvetica,sans-serif;border-radius:2px}.x .x_pagination [id^=goTo]{display:none;margin:0;padding:0}.x .x_pagination [id^=goTo]>*{border:0;border-radius:0}.x .x_pagination [id^=goTo]>[type=number]{height:16px;line-height:16px;width:50px;text-align:center}.x .x_pagination [id^=goTo]>[type=submit]{line-height:24px;height:24px;padding:0 6px}.x .btn{color:#333}.x .x_btn{border-radius:2px;overflow:visible;font-size:14px;line-height:18px;padding:3px 9px;text-decoration:none!important}.x .x_btn-large{font-size:16px;padding:9px 14px;font-weight:700}.x .x_btn-small{font-size:14px}.x .x_btn-mini{font-size:11px;padding:1px 6px;line-height:17px}.x .x_btn-link{padding:0;margin:0;overflow:visible;font-size:13px;border:0}.x .x_btn-group{zoom:1}.x .x_btn-group:after{content:"";display:block;clear:both}.x .x_btn-group>.x_btn{border-radius:0}.x .x_btn-group>.x_btn:last-child,.x .x_btn-group>.x_dropdown-toggle{border-top-right-radius:2px;border-bottom-right-radius:2px}.x .x_btn-group>.x_btn:first-child{border-bottom-left-radius:2px;border-top-left-radius:2px}.x .x_btn-group>.x_btn-inverse+.x_btn-inverse{border-left-color:#555}.x input[type=checkbox],.x input[type=radio]{margin:0}.x input[type=file]{height:auto}.x td input,.x td select,.x td textarea{margin-bottom:0}.x [class*=x_icon-]{opacity:.5;filter:alpha(opacity=50)}.x :focus>[class*=x_icon-],.x :hover>[class*=x_icon-],.x [class*=x_icon-]:focus,.x [class*=x_icon-]:hover{opacity:1;filter:alpha(opacity=100)}.x .x_nav-tabs>li>a{padding-top:6px;padding-bottom:6px;text-decoration:none!important}.x .x_nav-tabs>li.x_active>a{font-weight:700}.x .x_table{margin:10px 0;border-top:2px solid #ddd;border-bottom:1px solid #ddd}.x h1+.x_table{border-top:0;margin-top:-10px}.x .x_table>caption{text-align:left;padding:0 0 10px;line-height:26px}.x .x_table>caption>a,.x .x_table>caption>i,.x .x_table>caption>strong{position:relative;top:7px}.x .x_table thead th{vertical-align:top}.x .x_table input{margin:0}.x .x_inline{display:inline-block;*display:inline;*zoom:1}.x .x_page-header+.x_form-horizontal{margin-top:-20px}.x .x_controls:after{content:"";display:block;clear:both}.x .x_form-horizontal .x_control-label,.x input:checked+label,.x label.checked{font-weight:700;word-break:keep-all}.x .x_form-horizontal .x_control-label{width:180px}.x .x_form-horizontal .x_controls{margin-left:200px;*margin-left:0}.x .x_form-horizontal .x_controls label{padding:5px 0;margin-bottom:0}.x input[type=checkbox]+label,.x input[type=radio]+label{font-weight:400}.x label.x_inline{margin-right:16px}.x .x_input-append>*{vertical-align:top}.x .x_input-append a.x_add-on,.x .x_input-prepend a.x_add-on{height:16px;line-height:16px}.x .x_input-append button.x_add-on,.x .x_input-prepend button.x_add-on{height:24px;line-height:16px}.x .x_modal-header{padding:10px 15px;border-bottom:1px solid #aaa;background-color:#333;border-radius:5px 5px 0 0;background-image:-webkit-linear-gradient(top,#666,#333 50%,#000 50%,#333 100%);background-image:-moz-linear-gradient(top,#666,#333 50%,#000 50%,#333 100%);background-image:-o-linear-gradient(top,#666,#333 50%,#000 50%,#333 100%);background-image:linear-gradient(top,#666,#333 50%,#000 50%,#333 100%)}.x .x_modal-header>h1,.x .x_modal-header>h2,.x .x_modal-header>h3{font-size:16px;line-height:30px;margin:0;color:#fff;text-shadow:0 -1px 0 #000}.x .x_modal-body{overflow-y:visible;max-height:none}.x_modal,.x_modal-backdrop{display:none}.x_modal{top:30px}.x_modal-backdrop{opacity:.6;filter:alpha(opacity=60)}.x_modal{padding:0;width:90%;margin:0 0 0 -45%;max-width:none;border-radius:6px}.x_modal>form{margin:0!important}.x_modal>.x_close{position:absolute;top:8px;right:10px;font-size:21px;color:#fff}.x_modal .x_modal-body{background:#fff;min-height:50px;overflow-y:auto;max-height:400px}.x_modal-body:after{content:"";display:block;clear:both}.x .x_control-group{padding-top:8px;border-top:1px dotted #ddd;clear:both}.x .x_control-group:before{content:"";display:block;clear:both}.x .x_control-group:first-child,.x .x_control-group:first-of-type{border-top:0;padding-top:0}.x .x_control-group select{width:auto;min-width:220px}.x .x_form-horizontal .x_control-group{margin-bottom:10px}.x input[type=color],.x input[type=date],.x input[type=datetime-local],.x input[type=datetime],.x input[type=email],.x input[type=month],.x input[type=number],.x input[type=password],.x input[type=search],.x input[type=tel],.x input[type=text],.x input[type=time],.x input[type=url],.x input[type=week]{height:16px;line-height:16px}.x input[type=number]{width:50px}.x select{padding:0;height:26px;line-height:26px}.x select[multiple]{height:auto}.x textarea{vertical-align:top}.x .x_tab-content{overflow:visible}.x .x_well>:first-child{margin-top:0}.x .x_well>:last-child{margin-bottom:0}.x legend{font-size:14px;font-weight:700;line-height:24px}.x label{font-weight:inherit}.x label:only-child,.x p:last-child,.x td p{margin-bottom:0}.x form{margin:0 0 10px}.x form .x_btn[type=submit]:only-child{min-width:120px}.x .x_help-inline{display:inline}.x .x_btn.x_disabled,.x .x_btn[disabled]{opacity:.5;filter:alpha(opacity=50);cursor:not-allowed}@media all and (max-width:980px){.x .x_form-horizontal .x_control-label{float:none;width:auto;text-align:left}.x .x_form-horizontal .x_controls{margin-left:0}}.x .section{margin:20px 0 40px}.x .section>h1{position:relative;border-bottom:1px solid #ddd;cursor:pointer}.x .section>h1>.snToggle{position:absolute;bottom:0;right:0;width:32px;height:32px;opacity:.5;filter:alpha(opacity=50)}.x .section>h1>.snToggle.x_icon-chevron-up{background-position:-279px -112px}.x .section>h1>.snToggle.x_icon-chevron-down{background-position:-303px -111px}.x .section>h2{position:relative;border-bottom:1px dotted #ddd}.x .section>h2+.x_control-group{border-top:0}.x .section.collapsed>*{display:none}.x .section.collapsed>h1{display:block}.x .center{text-align:center}.x .search{margin:10px 0 0}.x .search select{width:auto}.x .search>input[type=search]{height:16px;line-height:16px;width:120px}.x .vr{color:#ccc;font-style:normal}.x .nowr{white-space:nowrap}.x .btnArea{padding:10px 0;margin:10px 0;border-top:1px solid #ccc;text-align:right;zoom:1;clear:both}.x .btnArea:after{content:"";display:block;clear:both}.x a.active,.x li.active>a{color:#000;font-weight:700;text-decoration:none}.x .module_search+[readonly]{vertical-align:top;border-top-right-radius:0;border-bottom-right-radius:0}.x .module_search+[readonly]+a.x_btn{vertical-align:top;border-top-left-radius:0;border-bottom-left-radius:0;margin-left:-5px}.x .fileBtn{position:relative;display:inline-block;overflow:hidden}.x .fileBtn>input[type=file]{position:absolute;top:0;right:0;margin:0;padding:0;border:0;outline:0;cursor:pointer;opacity:0;filter:alpha(opacity=0);-webkit-transform:scale(4);-webkit-transform-origin:100% 0;-moz-transform:scale(4);-moz-transform-origin:100% 0;-o-transform:scale(4);-o-transform-origin:100% 0;transform:scale(4);transform-origin:100% 0}.x td>form,.x td>p:last-of-type,.x td>p:only-of-type{margin:0}.x [data-display=none]{display:none}.x .x_page-header .path{font-size:14px;display:inline-block}.x .x_page-header .path:first-letter{color:#ccc;font-weight:400}.x [data-toggle]+.x_help-block{margin-top:10px}.x input.switch{width:42px;height:16px;opacity:0;filter:alpha(opacity=0);position:relative;z-index:2}.x input.switch+i{position:relative!important;z-index:1;left:auto!important;top:auto!important;right:auto!important;bottom:auto!important;margin:0 0 0 -42px!important;opacity:1!important;filter:alpha(opacity=100)!important;padding:0;vertical-align:middle;display:inline-block;width:42px;height:16px;background-image:url(../../../../modules/admin/tpl/img/toggleSwitch.png)!important;background-repeat:no-repeat}.x input[checked].switch+i{background-position:0 -16px!important}.x_modal._common{width:600px;margin-left:-300px}.x_modal._common._small{width:400px;margin-left:-200px}@media all and (max-width:650px){.x_modal._common{width:90%;margin-left:-45%}}@media all and (max-width:450px){.x_modal._common._small{width:90%;margin-left:-45%}}.x_modal._common._nobody .x_modal-body,.x_modal._common._type_alert ._cancel,.x_modal._common._type_alert .x_modal-header{display:none}.x_modal._common._type_alert .x_modal-body{border-radius:6px 6px 0 0}.x_modal._common._nobody .x_modal-footer{border-top:0}.x_modal-body.showTree .moveList{float:left;width:60%}.x_modal-body.showTree .moveTree{display:block!important;float:right;width:38%}.x_modal-body.showTree .moveTree>h1{font-size:13px;color:#333;border-bottom:2px solid #ddd;padding:10px 0 7px}@media all and (max-width:960px){.x_modal-body.showTree .moveList,.x_modal-body.showTree .moveTree{float:none;width:auto}}.x .dashboard>div>section>h2:before,.x a[target="_blank"]:after,.x>.body>.gnb>ul>li>a>i{background-image:url(../img/glyphicons-halflings.png);background-repeat:no-repeat}.x>.body>.gnb>ul>li.active>a>i,.x>.body>.gnb>ul>li.open>a>i,.x_modal-body .tree .jstree-clicked>i,.x_modal-body .tree .jstree-hovered>i{background-image:url(../img/glyphicons-halflings-white.png);background-repeat:no-repeat}@media all and (max-width:800px){.x>.body>.gnb>ul>li:first-child>a>i{background-image:url(../img/glyphicons-halflings-white.png);background-repeat:no-repeat}}.x>.skipNav{margin:0}.x>.skipNav>a{display:block;height:1px;text-align:center;border-radius:4px;overflow:hidden;color:#333;text-decoration:none}.x>.skipNav>a:focus{height:auto;margin:5px 0;padding:8px 0;background:#fff}.x>.header{position:relative;z-index:2;padding:10px 15px;border-bottom:1px solid #ddd;background-color:#fff;zoom:1}.x>.header:after{content:"";display:block;clear:both}.x>.header:before{content:"";position:absolute;bottom:0;left:1px;right:1px;height:1px;box-shadow:0 2px 3px #ddd}.x>.body{position:relative;zoom:1;padding:0 0 50px 215px;z-index:1}.x>.body.wide{padding-left:70px}.x>.body:after{content:"";display:block;clear:both}.x>.body>.content{width:100%;padding:1px 0 0;float:right;margin:0 0 0 -100%;outline:0}.x>.body>.content>:first-child{margin-top:0}.x>.body>.gnb{width:180px;position:relative;margin:15px 0 0 -215px;float:left;display:inline}.x>.body.wide>.gnb{width:38px;margin-left:-70px}@media all and (max-width:800px){.x>.header{border-bottom:0}.x>.header:before{content:normal}.x>.body,.x>.body.wide{padding:0}.x>.body>.content{width:auto;padding:1px 10px 0;float:none;margin:0 0 30px}.x>.body>.gnb{float:none;display:block;width:auto;margin:0!important;border-radius:0;position:relative;top:auto;left:auto}.x>.body.wide>.gnb{width:auto}}.x>.header>h1{display:inline-block;*display:inline;zoom:1;margin:0 15px 0 0;white-space:nowrap}.x>.header>h1>a{text-decoration:none;color:#333;font-size:24px;line-height:40px;font-family:Arial,Helvetica,sans-serif}.x>.header>h1>a>img{vertical-align:middle}.x>.header>.site{display:inline-block;*display:inline;zoom:1;margin:14px 0 0;font-size:11px}.x>.header>.site>a{text-decoration:none;color:#666;font-family:Tahoma,Geneva,sans-serif}.x>.header>.site>a:focus,.x>.header>.site>a:hover{text-decoration:underline}.x>.header>.account{float:right;position:relative;margin:13px 0 0}.x>.header>.account>ul{list-style:none;margin:0;padding:0}.x>.header>.account>ul>li{display:inline}.x>.header>.account>ul>li:before{content:"| ";color:#ddd}.x>.header>.account>ul>li:first-child:before{content:normal}.x>.header>.account>ul>li>a{text-decoration:none;color:#666}.x>.header>.account>ul>li>a:focus,.x>.header>.account>ul>li>a:hover{text-decoration:underline}.x>.header>.account .lang+#lang{position:absolute;top:20px;left:auto;right:0;min-width:0}.x>.header>.account .lang+#lang a:focus,.x>.header>.account .lang+#lang a:hover{background:0 0;color:#333}.x>.header>.account .lang+#lang .x_active>a{color:#fff;background:#0081c2 -webkit-linear-gradient(top,#08c,#0077b3);background:#0081c2 -moz-linear-gradient(top,#08c,#0077b3);background:#0081c2 -o-linear-gradient(top,#08c,#0077b3)}@media all and (max-width:480px){.x>.header>.site{margin-top:0}}@media all and (max-width:800px){.x>.header>.account{margin-top:0}}.x>.footer{border-top:1px solid #ddd;padding:10px 15px;zoom:1}.x>.footer:after{content:"";display:block;clear:both}.x>.footer>p{margin:0}.x>.footer>.power{float:left;color:#666}.x>.footer>.cache{float:right}.x>.footer>.cache>*{color:#666}.x>.footer .vr{color:#ccc!important}.x>.body>.gnb ul{margin:0;padding:0;list-style:none}.x>.body>.gnb>ul{position:relative;z-index:1;box-shadow:0 0 4px #ccc;border:2px solid #fff}.x>.body>.gnb a{text-decoration:none;text-shadow:0 1px 0 #fff;color:#000;display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x>.body>.gnb>a[href="#gnbNav"]{display:block;position:absolute;z-index:2;white-space:nowrap;font-size:0;top:50%;right:-14px;background:#eee;width:12px;height:50px;border-radius:0 3px 3px 0;margin:-25px 0 0 0;border:1px solid #ddd;border-left:0;overflow:hidden;text-indent:20px}.x>.body.wide>.gnb>a[href="#gnbNav"]>b{border-color:transparent;border-left-color:#666;margin:-4px 0 0 -2px}.x>.body>.gnb>a[href="#gnbNav"]>b{width:0;height:0;position:absolute;top:50%;left:50%;margin:-4px 0 0 -6px;border:4px solid;border-color:transparent;border-right-color:#666}.x>.body>.gnb>a>i{display:none}.x>.body>.gnb .exMenu{position:absolute;width:100%}.x>.body>.gnb .exMenu>button{width:100%;border:0;background:0 0;font-size:20px;line-height:25px}.x>.body>.gnb .exMenu>button>i{opacity:.5;filter:alpha(opacity=50);vertical-align:middle;text-indent:0}.x>.body>.gnb .exMenu>button:focus>i,.x>.body>.gnb .exMenu>button:hover>i{opacity:1;filter:alpha(opacity=100)}.x>.body>.gnb .exMenu .x_icon-chevron-up,.x>.body>.gnb>.ex .exMenu .x_icon-chevron-down{display:none}.x>.body>.gnb>.ex .exMenu .x_icon-chevron-up{display:inline-block}.x>.body>.gnb>ul>li[data-index="1"]{border-top-color:#eee}.x>.body>.gnb>ul>li[data-index="5"]{margin-bottom:25px}.x>.body>.gnb>ul>li[data-index="6"]{border-top-color:#eee}.x>.body>.gnb>ul>li[data-index="6"],.x>.body>.gnb>ul>li[data-index="7"]{display:none}.x>.body>.gnb>.ex>li[data-index="6"],.x>.body>.gnb>.ex>li[data-index="7"]{display:block}.x>.body>.gnb>ul>li[data-index].active_{display:none}@media all and (max-width:800px){.x>.body>.gnb>ul{border:0}.x>.body>.gnb>ul>li{display:none}.x>.body>.gnb.open>ul>li{display:block}.x>.body>.gnb.open>ul>li[data-index="6"],.x>.body>.gnb.open>ul>li[data-index="7"],.x>.body>.gnb>.ex>li[data-index="6"],.x>.body>.gnb>.ex>li[data-index="7"]{display:none}.x>.body>.gnb.open>.ex>li[data-index="6"],.x>.body>.gnb.open>.ex>li[data-index="7"]{display:block}.x>.body>.gnb>ul>li:first-child{display:block!important}.x>.body.wide>.gnb>a[href="#gnbNav"],.x>.body>.gnb>a[href="#gnbNav"]{top:0;right:0;line-height:37px;width:44px;height:auto;background:0 0;border-radius:0;margin:0;border:0}.x>.body>.gnb>a[href="#gnbNav"]{opacity:.5;filter:alpha(opacity=50%)}.x>.body>.gnb>a[href="#gnbNav"]:before{content:"";position:absolute;top:1px;left:0;width:1px;height:100%;border-left:1px solid #999}.x>.body>.gnb>a[href="#gnbNav"]>b{display:none}.x>.body>.gnb>a>i{display:block;position:absolute;top:50%;left:50%;margin:-7px 0 0 -7px}}.x>.body>.gnb>ul>li{background:#3886d0;border-top:1px solid #fff;border-bottom:1px solid #ddd;vertical-align:top;white-space:nowrap}.x>.body>.gnb>ul>li.active{background:#222}.x>.body>.gnb>ul>li.active,.x>.body>.gnb>ul>li.open{border-bottom:0;padding:0 0 1px}.x>.body>.gnb>ul>li>a{position:relative;padding:8px 5px 8px 10px;background:#f1f1f1;background:-webkit-linear-gradient(top,#F1F1F1,#E8E8E8);background:-moz-linear-gradient(top,#F1F1F1,#E8E8E8);background:-o-linear-gradient(top,#F1F1F1,#E8E8E8);background:-ms-linear-gradient(top,#F1F1F1,#E8E8E8);background:linear-gradient(top,#F1F1F1,#E8E8E8)}.x>.body>.gnb>ul>li>a>i{display:inline-block;width:14px;height:14px;margin:-4px 4px 0 0;vertical-align:middle;opacity:.75;filter:alpha(opacity=75)}.x>.body>.gnb>ul>li>a>b{position:absolute;width:0;height:0;top:50%;right:10px;margin:-2px 0 0 0;border:4px solid transparent;border-top-color:#999}.x>.body>.gnb>ul>li.open>a>b{border-top:0;border-bottom-color:#fff}.x>.body.wide>.gnb>ul>li>a>b{display:none}.x>.body>.gnb>ul>li[data-index="1"]>a>i{background-position:-384px -144px}.x>.body>.gnb>ul>li[data-index="2"]>a>i{background-position:0 -24px}.x>.body>.gnb>ul>li[data-index="3"]>a>i{background-position:-168px 0}.x>.body>.gnb>ul>li[data-index="4"]>a>i{background-position:-48px -48px}.x>.body>.gnb>ul>li>a[href="#favorite"]>i{background-position:-120px 0}.x>.body>.gnb>ul>li[data-index="6"]>a>i{background-position:-360px -144px}.x>.body>.gnb>ul>li[data-index="7"]>a>i{background-position:-432px 0}.x>.body>.gnb>ul>li>a:focus,.x>.body>.gnb>ul>li>a:hover{background:#f6f6f6;background:-webkit-linear-gradient(top,#f6f6f6,#F1F1F1);background:-moz-linear-gradient(top,#f6f6f6,#F1F1F1);background:-o-linear-gradient(top,#f6f6f6,#F1F1F1);background:-ms-linear-gradient(top,#f6f6f6,#F1F1F1);background:linear-gradient(top,#f6f6f6,#F1F1F1)}.x>.body>.gnb>ul>li.open>a{font-weight:700;color:#fff;text-shadow:0 -1px 0 #333;background:#3886d0;background:-webkit-linear-gradient(top,#6ebcea,#3886d0);background:-moz-linear-gradient(top,#6ebcea,#3886d0);background:-o-linear-gradient(top,#6ebcea,#3886d0);background:-ms-linear-gradient(top,#6ebcea,#3886d0);background:linear-gradient(top,#6ebcea,#3886d0)}.x>.body>.gnb>ul>li.active>a{font-weight:700;color:#fff;text-shadow:none;background:#222;background:-webkit-linear-gradient(top,from(#555),to(#222));background:-moz-linear-gradient(top,#555,#222);background:-o-linear-gradient(top,#555,#222)}@media all and (max-width:800px){.x>.body>.gnb>ul>li:first-child>a{font-weight:700;color:#fff;text-shadow:none;border-radius:3px;background-color:#222;background-image:-webkit-linear-gradient(top,#555,#222);background-image:-moz-linear-gradient(top,#555,#222);background-image:-o-linear-gradient(top,#555,#222);background-image:linear-gradient(top,#555,#222)}}.x>.body.wide>.gnb>ul>li>a>.tx{display:inline-block;width:1px;height:1px;overflow:hidden}.x>.body>.gnb>ul>li>ul{display:none;margin:0 10px 10px;border-radius:4px}.x>.body>.gnb>ul>li.active>ul{display:block!important}.x>.body.wide>.gnb>ul>li>ul{display:none!important}.x>.body>.gnb>ul>li>ul>li{border-top:1px solid #ddd;position:relative}.x>.body>.gnb>ul>li>ul>li:first-child{border:0}.x>.body>.gnb>ul>li>ul>li.active_{box-shadow:0 0 3px #999;z-index:99;border:1px solid #666;border-left:0;border-right:0}.x>.body>.gnb>ul>li>ul>li>a{padding:4px 5px 4px 15px;background:#e8e8e8;background:-webkit-linear-gradient(top,#f1f1f1,#e8e8e8);background:-moz-linear-gradient(top,#f1f1f1,#e8e8e8);background:-o-linear-gradient(top,#f1f1f1,#e8e8e8);background:-ms-linear-gradient(top,#f1f1f1,#e8e8e8);background:linear-gradient(top,#f1f1f1,#e8e8e8)}.x>.body>.gnb>ul>li>ul#favorite>li>a{padding:4px 25px 4px 15px}.x>.body>.gnb>ul>li>ul>li:first-child>a{border-radius:4px 4px 0 0}.x>.body>.gnb>ul>li>ul>li:last-child>a{border-radius:0 0 4px 4px}.x>.body>.gnb>ul>li>ul>li:only-child>a{border-radius:4px}.x>.body>.gnb>ul>li>ul>li.active_>a,.x>.body>.gnb>ul>li>ul>li>a:active,.x>.body>.gnb>ul>li>ul>li>a:hover{font-weight:700;background:-webkit-linear-gradient(top,#F6F6F6,#F1F1F1);background:-moz-linear-gradient(top,#F6F6F6,#F1F1F1);background:-o-linear-gradient(top,#F6F6F6,#F1F1F1);background:-ms-linear-gradient(top,#F6F6F6,#F1F1F1);background:linear-gradient(top,#F6F6F6,#F1F1F1)}.x>.body>.gnb>ul>li>ul>li.active_>a:after{content:"";position:absolute;top:8px;right:-12px;border:6px solid transparent;border-left-color:#f3f3f3;width:0;height:0;overflow:hidden}.x>.body>.gnb>ul>li>ul>li>.remove{position:absolute;top:4px;right:5px}.x>.body>.gnb>ul>li>ul>li>.remove>.x_close{width:20px;height:20px}@media all and (max-width:800px){.x>.body.wide>.gnb>ul>li>a>.tx{width:auto;height:auto}}.x .dashboard{zoom:1}.x .dashboard:after{content:"";display:block;clear:both}.x .dashboard>div{float:right;width:49%}.x .dashboard>div:first-child{float:left}.x .dashboard>div>section{position:relative;height:196px;border:1px solid #ddd;border-radius:4px;margin:0 0 25px;overflow:hidden}.x .dashboard>div>section>h2{font-size:14px;margin:0;padding:6px 15px;border-bottom:1px solid #ddd;background:#e8e8e8;background:-webkit-linear-gradient(top,#F1F1F1,#E8E8E8);background:-moz-linear-gradient(top,#F1F1F1,#E8E8E8);background:-o-linear-gradient(top,#F1F1F1,#E8E8E8);background:-ms-linear-gradient(top,#F1F1F1,#E8E8E8);background:linear-gradient(top,#F1F1F1,#E8E8E8);text-shadow:0 1px 0 #fff}.x .dashboard>div>section>h2:before{content:"";display:inline-block;width:14px;height:14px;margin:0 4px 0 0;vertical-align:middle;opacity:.5;filter:alpha(opacity=50)}.x .dashboard>div>.status>h2:before{background-position:-408px 0}.x .dashboard>div>.status dl{color:#767676;display:inline-block;*display:inline;zoom:1;margin:0 8px 0 0;padding:1px 8px 0;font:11px/1 돋움,Dotum,Arial,Helvetica,sans-serif;background:#fff;box-shadow:0 0 3px #999 inset;border-radius:3px;min-width:60px;text-align:center}.x .dashboard>div>.status dt{display:inline;font-weight:400}.x .dashboard>div>.status dd{display:inline;margin:0}.x .dashboard>div>.status dl a{color:#767676}.x .dashboard>div>.member>h2:before{background-position:-168px 0}.x .dashboard>div>.document>h2:before{background-position:-264px -48px}.x .dashboard>div>.reply>h2:before{background-position:-240px -120px}.x .dashboard>div>.trackback>h2:before{background-position:-216px -120px}.x .dashboard>div>section>.more{position:absolute;top:7px;right:15px;text-shadow:0 1px 0 #fff}.x .dashboard>div>section>.more i{font:12px Tahoma,Geneva,sans-serif}.x .dashboard>div>section>.more dl{color:#767676;display:inline-block;*display:inline;zoom:1;margin:0 8px 0 0;padding:1px 8px 0;font:11px/1 돋움,Dotum,Arial,Helvetica,sans-serif;background:#fff;box-shadow:0 0 3px #999 inset;border-radius:3px;min-width:60px;text-align:center}.x .dashboard>div>section>.more dt{display:inline;font-weight:400}.x .dashboard>div>section>.more dd{display:inline;margin:0}.x .dashboard>div>section>.more dl a{color:#767676}.x .dashboard>div>section ul{list-style:none;margin:10px;padding:0;overflow:hidden;zoom:1}.x .dashboard>div>section li{position:relative;height:28px;line-height:28px;padding:0 70px 0 5px;white-space:nowrap;overflow:hidden;zoom:1;vertical-align:top}.x .dashboard>div>section li.hover{background:#f4f4f4;border-radius:4px}.x .dashboard>div>section li>a{display:block;width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.x .dashboard>div>section li>.side{position:absolute;top:0;right:5px;line-height:28px;width:60px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:right;zoom:1}.x .dashboard>div>section li>.action{display:none;position:absolute;top:0;right:5px;margin:0;padding:0 0 0 40px;text-align:right;white-space:nowrap;line-height:28px;background:#f4f4f4}.x .dashboard>div>section li>.action>button{margin:0 0 0 4px;padding:0 0 0 15px;overflow:visible}@media all and (max-width:980px){.x .dashboard>div{float:none!important;width:auto}}.x .g11n>.x_add-on{font-size:0;position:relative;cursor:pointer;text-decoration:none;*color:#eee}.x .g11n>.x_add-on>i{position:absolute;top:50%;left:50%;margin:-7px 0 0 -7px;z-index:1;opacity:.25;filter:alpha(opacity=25)}.x .g11n>.x_add-on.remover{display:none;width:26px;height:26px}.x .g11n.active>[disabled]{padding-left:25px;background-position:4px 6px;background-repeat:no-repeat}.x .g11n.active>.x_add-on.remover{display:inline-block}.x .g11n>.x_add-on:hover>i{opacity:1;filter:alpha(opacity=100)}.x .g11n>textarea{border-top-right-radius:0;overflow-x:hidden}#g11n #lang_search .list{border-top:2px solid #ddd}#g11n #lang_search .item{border-bottom:1px solid #ddd;margin:0}#g11n #lang_search .item>a{display:block;padding:8px 0;position:relative}#g11n #lang_search .item>a>i{position:absolute;top:50%;margin:-7px 0 0 0;right:0;opacity:.5;filter:alpha(opacity=50)}#g11n #lang_search .item>fieldset{display:none;padding:0 0 15px}#g11n .item input[type=text],#g11n .item textarea{padding-left:25px;width:187px;background-repeat:no-repeat;background-position:4px 8px;overflow-x:hidden}#g11n .flag{padding-left:18px;background-repeat:no-repeat;background-position:0 50%}#g11n .flag.en,#g11n .item .en,html[lang=en] .x .g11n.active>[disabled]{background-image:url(../img/flag.en.gif)}#g11n .flag.ko,#g11n .item .ko,html[lang=ko] .x .g11n.active>[disabled]{background-image:url(../img/flag.ko.gif)}#g11n .flag.jp,#g11n .item .jp,html[lang=jp] .x .g11n.active>[disabled]{background-image:url(../img/flag.jp.gif)}#g11n .flag.zh-CN,#g11n .item .zh-CN,html[lang=zh] .x .g11n.active>[disabled]{background-image:url(../img/flag.cn.gif)}#g11n .flag.zh-TW,#g11n .item .zh-TW,html[lang=zh] .x .g11n.active>[disabled]{background-image:url(../img/flag.tw.gif)}#g11n .flag.fr,#g11n .item .fr,html[lang=fr] .x .g11n.active>[disabled]{background-image:url(../img/flag.fr.gif)}#g11n .flag.de,#g11n .item .de,html[lang=de] .x .g11n.active>[disabled]{background-image:url(../img/flag.de.gif)}#g11n .flag.ru,#g11n .item .ru,html[lang=ru] .x .g11n.active>[disabled]{background-image:url(../img/flag.ru.gif)}#g11n .flag.es,#g11n .item .es,html[lang=es] .x .g11n.active>[disabled]{background-image:url(../img/flag.es.gif)}#g11n .item .tr,#gg1n .flag.tr,html[lang=tr] .x .g11n.active>[disabled]{background-image:url(../img/flag.tr.gif)}#g11n .flag.vi,#g11n .item .vi,html[lang=vi] .x .g11n.active>[disabled]{background-image:url(../img/flag.vi.gif)}#g11n .flag.mn,#g11n .item .mn,html[lang=mn] .x .g11n.active>[disabled]{background-image:url(../img/flag.mn.gif)}#g11n #lang_search .cancel,#g11n #lang_search .editMode .modify,#g11n #lang_search .editMode .useit,#g11n #lang_search .save{display:none}#g11n #lang_search .editMode .cancel,#g11n #lang_search .editMode .save{display:inline-block}.x .moduleWindow{position:absolute;z-index:100;padding:15px 20px}.x .moduleWindow ul{margin-bottom:0}.x .moduleWindow .siteList{margin-right:14px}.x .moduleWindow .siteList>input[type=search]{width:100%;padding-top:6px;padding-bottom:6px;border-radius:3px 3px 0 0;margin-bottom:0}.x .moduleWindow .siteList>ul{margin:-1px -14px 0 0}.x .moduleWindow .siteList>ul>li{background:#fff}.x .moduleWindow .siteList>ul>li:first-child>a{border-top-left-radius:0;border-top-right-radius:0}.x .moduleWindow select{width:100%}.x .textList{border:1px solid #ddd!important;line-height:1.5em;height:125px;overflow:auto}.x .textList li{position:relative;border:0;padding:0 10px;height:25px;line-height:25px;white-space:nowrap;overflow:hidden}.x .textList li:nth-child(even){background:#eee}.x .textList li>button{position:absolute;right:8px;top:50%;margin:-7px 0 0 0}.x .uDrag .wrap{position:relative;padding-left:20px}.x .uDrag li>.wrap{margin:0 0 0 8px}.x .uDrag .dragActive{background:#FFD}.x .uDrag .dragActive td,.x .uDrag .dragActive th{background:none!important}.x .uDrag .dragBtn{position:absolute;width:8px;height:100%;padding:0;overflow:hidden;background:url(../img/bgDragable.gif);top:1px;left:0;text-indent:12px;border:0;cursor:n-resize;white-space:nowrap;font-size:0}.x #faviconPreview{position:relative;padding:80px 0 0 200px;background:url(../img/bgFavicon.gif) no-repeat}.x #faviconPreview img{position:absolute}.x #faviconPreview .fn1{top:30px;left:12px}.x #faviconPreview .fn2{top:55px;left:68px}.x #mobiconPreview{position:relative;padding:270px 0 0 200px;background:url(../img/bgMobileTop.png) no-repeat}.x #mobiconPreview img{position:absolute;top:20px;left:10px;width:32px;height:32px}.x #mobiconPreview span{position:absolute;width:32px;text-align:center;top:52px;left:10px;color:#fff;font-size:9px}.x .layer{position:absolute;display:none;font-weight:400}.tree{margin:3px 0 5px;min-width:200px;background-color:transparent!important}.tree ul{margin:0;padding:0;list-style:none}.tree li{padding:0;white-space:nowrap;position:relative;border-radius:3px;vertical-align:top}.tree li>ul{margin:0}.tree a{text-decoration:none}.tree>ul{padding:1px}.tree .jstree-rename-input{margin-left:-16px;z-index:2}.tree>ul>li{margin-top:30px;position:relative}.tree>ul>li:before{content:"";display:block;border-top:1px dotted #ccc;position:relative;top:-15px}.tree>ul>li:first-child{margin-top:0}.tree>ul>li:first-child:before{content:normal}.tree>ul>li>a{font-weight:700;text-shadow:0 1px 0 #fff;vertical-align:middle}.tree>ul>li>a.jstree-clicked,.tree>ul>li>a.jstree-hovered,.tree>ul>li>a:focus,.tree>ul>li>a:hover{text-shadow:none}.tree>ul>li>ul{margin:0 0 0 18px}.tree>ul>li>ul>li{margin-left:0}.tree li>a{border:0!important;padding:0 8px!important;margin:0 0 1px;border-radius:3px;position:relative;z-index:2;height:23px;line-height:23px;max-width:160px;overflow:hidden;text-overflow:ellipsis;-webkit-transition:.2s;-moz-transition:.2s;-o-transition:.2s;transition:.2s}.tree li>a>i{opacity:.5;filter:alpha(opacity=50)}.tree .jstree-clicked>i,.tree .jstree-hovered>i{opacity:1;filter:alpha(opacity=100)}.tree a>.jstree-icon{display:none}.tree .jstree-closed>.jstree-icon,.tree .jstree-open>.jstree-icon{background-color:#fff}.x .h2,.x .h3,.x .h4{position:relative;border-style:solid;border-top:0;border-right:0;zoom:1;padding-left:8px}.x .h1{background:#444;border-radius:4px;color:#fff;margin:0 0 1em;font-size:16px;padding:0 15px;line-height:36px}.x .h2{border-width:3px;font-size:20px;border-color:#888}.x .h3{border-width:2px;font-size:16px;border-color:#aaa}.x .h4{border-width:1px;font-size:12px;border-color:#ccc}.x .h1+.table table,.x .h1+ul,.x .h2+.table table,.x .h2+ul,.x .h3+.table table,.x .h3+ul,.x .h4+.table table,.x .h4+ul{border-top:0!important;margin-top:-1em!important}.x .table{margin:1em 0}.x .table table{width:100%;border:0;border-collapse:collapse;border-top:2px solid #ccc}.x .table caption{font-weight:700;text-align:left;line-height:22px;padding:5px 0}.x .table caption:after{content:"";display:block;clear:both}.x .table caption a{font-weight:400}.x .table caption em{float:right;margin-left:1em}.x .table caption strong{color:#e00}.x .table caption .side{float:right;font-weight:400;margin-left:1em}.x .table td,.x .table th{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd}.x .table th{background:#f8f8f8}.x .table thead th{border-bottom:1px solid #999}.x .table tfoot td{font-weight:700;background:#f8f8f8}.x .table.even tbody tr:nth-of-type(even){background-color:#fafafa}.x .table tbody tr:hover{background:#ffd!important}.x .table td>input[type=text]{margin:-1px 0!important;vertical-align:middle}.x .table img{vertical-align:middle}.x .table em{font-style:normal;font-weight:400;color:#e00}.x .form{margin:0 0 1em;padding:0}.x .form fieldset{margin:0 0 2em;padding:0;border:0}.x .form.search fieldset{border:1px solid #ccc;padding:5px 15px;border-radius:3px}.x .form em{font-style:normal;color:#e00}.x .form label{line-height:1;vertical-align:middle}.x .form input[type=checkbox]+label,.x .form input[type=radio]+label{margin-right:1em}.x .form input[type=checkbox]+label,.x .form input[type=file],.x .form input[type=radio]+label{cursor:pointer}.x .form ul{position:relative;margin:1em 0;padding:0;list-style:none;border-top:2px solid #ccc;border-bottom:1px solid #ccc;zoom:1}.x .form li{list-style:none;border:1px solid #ddd;border-left:0;border-right:0;margin:-1px 0;padding:8px 0;vertical-align:top;zoom:1}.x .form li:hover{background:#ffd}.x .form li:first-child{border-top:0}.x .form li>label:first-child{display:block;font-weight:700}.x .form li label em{font-weight:400}.x .form label.overlap{position:absolute;color:#aaa}.x .form input[type=file],.x .form input[type=password],.x .form input[type=text],.x .form select[size],.x .form textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:0 0}.x .form input[type=file],.x .form input[type=password],.x .form input[type=text]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .form input[type=checkbox],.x .form input[type=radio]{margin:0;padding:0;width:13px;height:13px;vertical-align:middle}.x .form input[type=checkbox][disabled=disabled],.x .form input[type=password][disabled=disabled],.x .form input[type=radio][disabled=disabled],.x .form input[type=text][disabled=disabled],.x .form select[disabled=disabled],.x .form textarea[disabled=disabled]{background:#ddd;text-shadow:1px 1px 0 #fff}.x .form textarea{padding:3px 4px;vertical-align:top;resize:both}.x .form em.desc,.x .form span.desc{line-height:22px;vertical-align:middle;margin:0 10px}.x .form p.desc{margin:.25em 0;line-height:1.4}.x .form .q{font-weight:700;margin:0 0 5px}.x .form .a{margin:0 0 5px}.x .form .tgForm{margin-right:1em}.x .cnb{margin:1em 0;position:relative;zoom:1}.x .cnb:after{content:"";display:block;clear:both}.x .cnb ul{list-style:none;margin:0;padding:0}.x .cnb li{display:inline}.x .cnb li:before{content:"| ";color:#ccc}.x .cnb li:first-child:before{content:""}.x .cnb .active,.x .cnb .active a{font-weight:700;color:#333;text-decoration:none}.x .cnb .side{float:right}.x .pagination{margin:1em 0;text-align:center;line-height:normal}.x .pagination *{vertical-align:middle}.x .pagination a,.x .pagination strong{position:relative;display:inline-block;padding:2px 4px;font-weight:700;text-decoration:none;line-height:normal;color:#333!important;vertical-align:middle}.x .pagination a:active,.x .pagination a:focus,.x .pagination a:hover{border:1px solid #ddd;margin:0 -1px}.x .pagination strong{color:#e00!important;font-size:20px}.x .pagination .direction{font-weight:400;white-space:nowrap}.x .pagination .direction:active,.x .pagination .direction:focus,.x .pagination .direction:hover{border:0;margin:0;text-decoration:underline}.x .pagination input{width:30px;text-align:center}.x .pagination button{overflow:visible}.x .prgrs{white-space:nowrap;line-height:normal;vertical-align:middle}.x .prgrs *{vertical-align:middle}.x .prgrs .pBar{position:relative;display:inline-block;background:#e9e9e9;margin:0 5px 0 0}.x .prgrs .pAction{display:inline-block;vertical-align:top;background:#99a6b6}.x .prgrs .pNum{width:100%;left:0;top:0;text-align:center;text-shadow:1px 1px 0 #fff}.x .prgrs.prgrsSmall{font-size:14px;line-height:14px}.x .prgrs.prgrsSmall .pAction,.x .prgrs.prgrsSmall .pBar,.x .prgrs.prgrsSmall .pNum{height:16px;line-height:16px;font-size:11px}.x .prgrs.prgrsMedium{font-size:24px;line-height:24px}.x .prgrs.prgrsMedium .pAction,.x .prgrs.prgrsMedium .pBar,.x .prgrs.prgrsMedium .pNum{height:22px;line-height:22px;font-size:12px}.x .prgrs.prgrsLarge{font-size:38px;line-height:38px}.x .prgrs.prgrsLarge .pAction,.x .prgrs.prgrsLarge .pBar,.x .prgrs.prgrsLarge .pNum{height:34px;line-height:34px;font-size:14px}.modal{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:1050}.modal .bg{position:absolute;background:#000;_background:0 0;width:100%;height:100%;opacity:.5;z-index:2;filter:alpha(opacity=50);zoom:1}.modal .fg{position:relative;width:80%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000}.modal .lined,.modal .table,.modal ol,.modal ul{margin-bottom:1em}.modal .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1}.modalClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:700;cursor:pointer;color:#999;border-radius:5px}.modalBlur{position:absolute;top:0;right:0;border:0;background:0 0;padding:0;width:1px;height:1px;overflow:hidden} \ No newline at end of file +@charset "utf-8";body,html{min-height:100%}body{-webkit-text-size-adjust:none}body>.x:first-child{min-width:300px;max-width:1240px;margin:0 auto}.x button,.x input,.x label,.x select,.x table,.x textarea,body>.x{font-size:13px}.x strong,.x th{font-weight:600}.x dfn,.x em{font-style:normal}.x [disabled]{cursor:not-allowed}.x [hidden]{display:none}.x a[target="_blank"]:after{content:"";display:inline-block;width:14px;height:14px;vertical-align:middle;margin:-2px 0 0 2px;background-position:-120px -72px;opacity:.3;filter:alpha(opacity=30)}.x a[target="_blank"]:focus:after,.x a[target="_blank"]:hover:after{opacity:.7;filter:alpha(opacity=70)}.x mark{background-color:#FF0;color:#000}.x .x_page-header{margin-top:10px;padding-bottom:0;border-bottom:2px solid #ddd}.x .x_page-header>h1{position:relative;margin-bottom:0;font-size:24px;color:#333}.x .x_page-header>h1>.x_icon-question-sign{margin:0}.x .x_page-header>h1>.path+.x_icon-question-sign{margin:4px 0 0}.x .x_icon-question-sign{vertical-align:middle}.x h1,.x h2,.x h3,.x h4,.x h5,.x h6{line-height:1.5;font-weight:600;color:#666;text-rendering:auto}.x h1{font-size:22px}.x h2{font-size:18px}.x h3{font-size:14px}.x h4,.x h5,.x h6{font-size:12px}.x [class*=" x_icon-"],.x [class^=x_icon-]{text-decoration:none;border:0;padding:0 0 0 14px;width:0;background-color:transparent;overflow:hidden;font-size:0}.x .x_close{width:32px;height:32px;font-size:17px;opacity:.5;filter:alpha(opacity=50)}.x .x_alert{position:relative}.x .x_alert>.x_close{position:absolute;top:0;right:0}.x .x_pagination{height:26px;margin:10px 0 0}.x .x_pagination ul>li>a,.x .x_pagination ul>li>span,.x .x_pagination ul>li>strong{line-height:24px;padding:0 8px}.x .x_pagination ul>.x_active>a,.x .x_pagination ul>.x_active>span,.x .x_pagination ul>.x_active>strong{line-height:26px;border:0;background-color:#333!important;color:#fff;font-weight:700;font-size:18px;font-family:Arial,Helvetica,sans-serif;border-radius:2px}.x .x_pagination [id^=goTo]{display:none;margin:0;padding:0}.x .x_pagination [id^=goTo]>*{border:0;border-radius:0}.x .x_pagination [id^=goTo]>[type=number]{height:16px;line-height:16px;width:50px;text-align:center}.x .x_pagination [id^=goTo]>[type=submit]{line-height:24px;height:24px;padding:0 6px}.x .btn{color:#333}.x .x_btn{border-radius:2px;overflow:visible;font-size:14px;line-height:18px;padding:3px 9px;text-decoration:none!important}.x .x_btn-large{font-size:16px;padding:9px 14px;font-weight:700}.x .x_btn-small{font-size:14px}.x .x_btn-mini{font-size:11px;padding:1px 6px;line-height:17px}.x .x_btn-link{padding:0;margin:0;overflow:visible;font-size:13px;border:0}.x .x_btn-group{zoom:1}.x .x_btn-group:after{content:"";display:block;clear:both}.x .x_btn-group>.x_btn{border-radius:0}.x .x_btn-group>.x_btn:last-child,.x .x_btn-group>.x_dropdown-toggle{border-top-right-radius:2px;border-bottom-right-radius:2px}.x .x_btn-group>.x_btn:first-child{border-bottom-left-radius:2px;border-top-left-radius:2px}.x .x_btn-group>.x_btn-inverse+.x_btn-inverse{border-left-color:#555}.x input[type=checkbox],.x input[type=radio]{margin:0}.x input[type=file]{height:auto}.x td input,.x td select,.x td textarea{margin-bottom:0}.x [class*=x_icon-]{opacity:.5;filter:alpha(opacity=50)}.x :focus>[class*=x_icon-],.x :hover>[class*=x_icon-],.x [class*=x_icon-]:focus,.x [class*=x_icon-]:hover{opacity:1;filter:alpha(opacity=100)}.x .x_nav-tabs>li>a{padding-top:6px;padding-bottom:6px;text-decoration:none!important}.x .x_nav-tabs>li.x_active>a{font-weight:700}.x .x_table{margin:10px 0;border-top:2px solid #ddd;border-bottom:1px solid #ddd}.x h1+.x_table{border-top:0;margin-top:-10px}.x .x_table>caption{text-align:left;padding:0 0 10px;line-height:26px}.x .x_table>caption>a,.x .x_table>caption>i,.x .x_table>caption>strong{position:relative;top:7px}.x .x_table thead th{vertical-align:top}.x .x_table input{margin:0}.x .x_inline{display:inline-block;*display:inline;*zoom:1}.x .x_page-header+.x_form-horizontal{margin-top:-20px}.x .x_controls:after{content:"";display:block;clear:both}.x .x_form-horizontal .x_control-label,.x input:checked+label,.x label.checked{font-weight:700;word-break:keep-all}.x .x_form-horizontal .x_control-label{width:180px}.x .x_form-horizontal .x_controls{margin-left:200px;*margin-left:0}.x .x_form-horizontal .x_controls label{padding:5px 0;margin-bottom:0}.x input[type=checkbox]+label,.x input[type=radio]+label{font-weight:400}.x label.x_inline{margin-right:16px}.x .x_input-append>*{vertical-align:top}.x .x_input-append a.x_add-on,.x .x_input-prepend a.x_add-on{height:16px;line-height:16px}.x .x_input-append button.x_add-on,.x .x_input-prepend button.x_add-on{height:24px;line-height:16px}.x .x_modal-header{padding:10px 15px;border-bottom:1px solid #aaa;background-color:#333;border-radius:5px 5px 0 0;background-image:-webkit-linear-gradient(top,#666,#333 50%,#000 50%,#333 100%);background-image:-moz-linear-gradient(top,#666,#333 50%,#000 50%,#333 100%);background-image:-o-linear-gradient(top,#666,#333 50%,#000 50%,#333 100%);background-image:linear-gradient(top,#666,#333 50%,#000 50%,#333 100%)}.x .x_modal-header>h1,.x .x_modal-header>h2,.x .x_modal-header>h3{font-size:16px;line-height:30px;margin:0;color:#fff;text-shadow:0 -1px 0 #000}.x .x_modal-body{overflow-y:visible;max-height:none}.x_modal,.x_modal-backdrop{display:none}.x_modal{top:30px}.x_modal-backdrop{opacity:.6;filter:alpha(opacity=60)}.x_modal{padding:0;width:90%;margin:0 0 0 -45%;max-width:none;border-radius:6px}.x_modal>form{margin:0!important}.x_modal>.x_close{position:absolute;top:8px;right:10px;font-size:21px;color:#fff}.x_modal .x_modal-body{background:#fff;min-height:50px;overflow-y:auto;max-height:400px}.x_modal-body:after{content:"";display:block;clear:both}.x .x_control-group{padding-top:8px;border-top:1px dotted #ddd;clear:both}.x .x_control-group:before{content:"";display:block;clear:both}.x .x_control-group:first-child,.x .x_control-group:first-of-type{border-top:0;padding-top:0}.x .x_control-group select{width:auto;min-width:220px}.x .x_form-horizontal .x_control-group{margin-bottom:10px}.x input[type=color],.x input[type=date],.x input[type=datetime-local],.x input[type=datetime],.x input[type=email],.x input[type=month],.x input[type=number],.x input[type=password],.x input[type=search],.x input[type=tel],.x input[type=text],.x input[type=time],.x input[type=url],.x input[type=week]{height:16px;line-height:16px}.x input[type=number]{width:50px}.x select{padding:0;height:26px;line-height:26px}.x select[multiple]{height:auto}.x textarea{vertical-align:top}.x .x_tab-content{overflow:visible}.x .x_well>:first-child{margin-top:0}.x .x_well>:last-child{margin-bottom:0}.x legend{font-size:14px;font-weight:700;line-height:24px}.x label{font-weight:inherit}.x label:only-child,.x p:last-child,.x td p{margin-bottom:0}.x form{margin:0 0 10px}.x form .x_btn[type=submit]:only-child{min-width:120px}.x .x_help-inline{display:inline}.x .x_btn.x_disabled,.x .x_btn[disabled]{opacity:.5;filter:alpha(opacity=50);cursor:not-allowed}@media all and (max-width:980px){.x .x_form-horizontal .x_control-label{float:none;width:auto;text-align:left}.x .x_form-horizontal .x_controls{margin-left:0}}.x .section{margin:20px 0 40px}.x .section>h1{position:relative;border-bottom:1px solid #ddd;cursor:pointer}.x .section>h1>.snToggle{position:absolute;bottom:0;right:0;width:32px;height:32px;opacity:.5;filter:alpha(opacity=50)}.x .section>h1>.snToggle.x_icon-chevron-up{background-position:-279px -112px}.x .section>h1>.snToggle.x_icon-chevron-down{background-position:-303px -111px}.x .section>h2{position:relative;border-bottom:1px dotted #ddd}.x .section>h2+.x_control-group{border-top:0}.x .section.collapsed>*{display:none}.x .section.collapsed>h1{display:block}.x .center{text-align:center}.x .search{margin:10px 0 0}.x .search select{width:auto}.x .search>input[type=search]{height:16px;line-height:16px;width:120px}.x .vr{color:#ccc;font-style:normal}.x .nowr{white-space:nowrap}.x .btnArea{padding:10px 0;margin:10px 0;border-top:1px solid #ccc;text-align:right;zoom:1;clear:both}.x .btnArea:after{content:"";display:block;clear:both}.x a.active,.x li.active>a{color:#000;font-weight:700;text-decoration:none}.x .module_search+[readonly]{vertical-align:top;border-top-right-radius:0;border-bottom-right-radius:0}.x .module_search+[readonly]+a.x_btn{vertical-align:top;border-top-left-radius:0;border-bottom-left-radius:0;margin-left:-5px}.x .fileBtn{position:relative;display:inline-block;overflow:hidden}.x .fileBtn>input[type=file]{position:absolute;top:0;right:0;margin:0;padding:0;border:0;outline:0;cursor:pointer;opacity:0;filter:alpha(opacity=0);-webkit-transform:scale(4);-webkit-transform-origin:100% 0;-moz-transform:scale(4);-moz-transform-origin:100% 0;-o-transform:scale(4);-o-transform-origin:100% 0;transform:scale(4);transform-origin:100% 0}.x td>form,.x td>p:last-of-type,.x td>p:only-of-type{margin:0}.x [data-display=none]{display:none}.x .x_page-header .path{font-size:14px;display:inline-block}.x .x_page-header .path:first-letter{color:#ccc;font-weight:400}.x [data-toggle]+.x_help-block{margin-top:10px}.x input.switch{width:42px;height:16px;opacity:0;filter:alpha(opacity=0);position:relative;z-index:2}.x input.switch+i{position:relative!important;z-index:1;left:auto!important;top:auto!important;right:auto!important;bottom:auto!important;margin:0 0 0 -42px!important;opacity:1!important;filter:alpha(opacity=100)!important;padding:0;vertical-align:middle;display:inline-block;width:42px;height:16px;background-image:url(../../../../modules/admin/tpl/img/toggleSwitch.png)!important;background-repeat:no-repeat}.x input[checked].switch+i{background-position:0 -16px!important}.x_modal._common{width:600px;margin-left:-300px}.x_modal._common._small{width:400px;margin-left:-200px}@media all and (max-width:650px){.x_modal._common{width:90%;margin-left:-45%}}@media all and (max-width:450px){.x_modal._common._small{width:90%;margin-left:-45%}}.x_modal._common._nobody .x_modal-body,.x_modal._common._type_alert ._cancel,.x_modal._common._type_alert .x_modal-header{display:none}.x_modal._common._type_alert .x_modal-body{border-radius:6px 6px 0 0}.x_modal._common._nobody .x_modal-footer{border-top:0}.x_modal-body.showTree .moveList{float:left;width:60%}.x_modal-body.showTree .moveTree{display:block!important;float:right;width:38%}.x_modal-body.showTree .moveTree>h1{font-size:13px;color:#333;border-bottom:2px solid #ddd;padding:10px 0 7px}@media all and (max-width:960px){.x_modal-body.showTree .moveList,.x_modal-body.showTree .moveTree{float:none;width:auto}}.x .dashboard>div>section>h2:before,.x a[target="_blank"]:after,.x>.body>.gnb>ul>li>a>i{background-image:url(../img/glyphicons-halflings.png);background-repeat:no-repeat}.x>.body>.gnb>ul>li.active>a>i,.x>.body>.gnb>ul>li.open>a>i,.x_modal-body .tree .jstree-clicked>i,.x_modal-body .tree .jstree-hovered>i{background-image:url(../img/glyphicons-halflings-white.png);background-repeat:no-repeat}@media all and (max-width:800px){.x>.body>.gnb>ul>li:first-child>a>i{background-image:url(../img/glyphicons-halflings-white.png);background-repeat:no-repeat}}.x>.skipNav{margin:0}.x>.skipNav>a{display:block;height:1px;text-align:center;border-radius:4px;overflow:hidden;color:#333;text-decoration:none}.x>.skipNav>a:focus{height:auto;margin:5px 0;padding:8px 0;background:#fff}.x>.header{position:relative;z-index:2;padding:10px 15px;border-bottom:1px solid #ddd;background-color:#fff;zoom:1}.x>.header:after{content:"";display:block;clear:both}.x>.header:before{content:"";position:absolute;bottom:0;left:1px;right:1px;height:1px;box-shadow:0 2px 3px #ddd}.x>.body{position:relative;zoom:1;padding:0 0 50px 215px;z-index:1}.x>.body.wide{padding-left:70px}.x>.body:after{content:"";display:block;clear:both}.x>.body>.content{width:100%;padding:1px 0 0;float:right;margin:0 0 0 -100%;outline:0}.x>.body>.content>:first-child{margin-top:0}.x>.body>.gnb{width:180px;position:relative;margin:15px 0 0 -215px;float:left;display:inline}.x>.body.wide>.gnb{width:38px;margin-left:-70px}@media all and (max-width:800px){.x>.header{border-bottom:0}.x>.header:before{content:normal}.x>.body,.x>.body.wide{padding:0}.x>.body>.content{width:auto;padding:1px 10px 0;float:none;margin:0 0 30px}.x>.body>.gnb{float:none;display:block;width:auto;margin:0!important;border-radius:0;position:relative;top:auto;left:auto}.x>.body.wide>.gnb{width:auto}}.x>.header>h1{display:inline-block;*display:inline;zoom:1;margin:0 15px 0 0;white-space:nowrap}.x>.header>h1>a{text-decoration:none;color:#333;font-size:24px;line-height:40px;font-family:Arial,Helvetica,sans-serif}.x>.header>h1>a>img{vertical-align:middle}.x>.header>.site{display:inline-block;*display:inline;zoom:1;margin:14px 0 0;font-size:11px}.x>.header>.site>a{text-decoration:none;color:#666;font-family:Tahoma,Geneva,sans-serif}.x>.header>.site>a:focus,.x>.header>.site>a:hover{text-decoration:underline}.x>.header>.account{float:right;position:relative;margin:13px 0 0}.x>.header>.account>ul{list-style:none;margin:0;padding:0}.x>.header>.account>ul>li{display:inline}.x>.header>.account>ul>li:before{content:"| ";color:#ddd}.x>.header>.account>ul>li:first-child:before{content:normal}.x>.header>.account>ul>li>a{text-decoration:none;color:#666}.x>.header>.account>ul>li.forum-chak>a{color:#FFF}.x>.header>.account>ul>li>a:focus,.x>.header>.account>ul>li>a:hover{text-decoration:underline}.x>.header>.account .lang+#lang{position:absolute;top:20px;left:auto;right:0;min-width:0}.x>.header>.account .lang+#lang a:focus,.x>.header>.account .lang+#lang a:hover{background:0 0;color:#333}.x>.header>.account .lang+#lang .x_active>a{color:#fff;background:#0081c2 -webkit-linear-gradient(top,#08c,#0077b3);background:#0081c2 -moz-linear-gradient(top,#08c,#0077b3);background:#0081c2 -o-linear-gradient(top,#08c,#0077b3)}@media all and (max-width:480px){.x>.header>.site{margin-top:0}}@media all and (max-width:800px){.x>.header>.account{margin-top:0}}.x>.footer{border-top:1px solid #ddd;padding:10px 15px;zoom:1}.x>.footer:after{content:"";display:block;clear:both}.x>.footer>p{margin:0}.x>.footer>.power{float:left;color:#666}.x>.footer>.cache{float:right}.x>.footer>.cache>*{color:#666}.x>.footer .vr{color:#ccc!important}.x>.body>.gnb ul{margin:0;padding:0;list-style:none}.x>.body>.gnb>ul{position:relative;z-index:1;box-shadow:0 0 4px #ccc;border:2px solid #fff}.x>.body>.gnb a{text-decoration:none;text-shadow:0 1px 0 #fff;color:#000;display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x>.body>.gnb>a[href="#gnbNav"]{display:block;position:absolute;z-index:2;white-space:nowrap;font-size:0;top:50%;right:-14px;background:#eee;width:12px;height:50px;border-radius:0 3px 3px 0;margin:-25px 0 0 0;border:1px solid #ddd;border-left:0;overflow:hidden;text-indent:20px}.x>.body.wide>.gnb>a[href="#gnbNav"]>b{border-color:transparent;border-left-color:#666;margin:-4px 0 0 -2px}.x>.body>.gnb>a[href="#gnbNav"]>b{width:0;height:0;position:absolute;top:50%;left:50%;margin:-4px 0 0 -6px;border:4px solid;border-color:transparent;border-right-color:#666}.x>.body>.gnb>a>i{display:none}.x>.body>.gnb .exMenu{position:absolute;width:100%}.x>.body>.gnb .exMenu>button{width:100%;border:0;background:0 0;font-size:20px;line-height:25px}.x>.body>.gnb .exMenu>button>i{opacity:.5;filter:alpha(opacity=50);vertical-align:middle;text-indent:0}.x>.body>.gnb .exMenu>button:focus>i,.x>.body>.gnb .exMenu>button:hover>i{opacity:1;filter:alpha(opacity=100)}.x>.body>.gnb .exMenu .x_icon-chevron-up,.x>.body>.gnb>.ex .exMenu .x_icon-chevron-down{display:none}.x>.body>.gnb>.ex .exMenu .x_icon-chevron-up{display:inline-block}.x>.body>.gnb>ul>li[data-index="1"]{border-top-color:#eee}.x>.body>.gnb>ul>li[data-index="5"]{margin-bottom:25px}.x>.body>.gnb>ul>li[data-index="6"]{border-top-color:#eee}.x>.body>.gnb>ul>li[data-index="6"],.x>.body>.gnb>ul>li[data-index="7"]{display:none}.x>.body>.gnb>.ex>li[data-index="6"],.x>.body>.gnb>.ex>li[data-index="7"]{display:block}.x>.body>.gnb>ul>li[data-index].active_{display:none}@media all and (max-width:800px){.x>.body>.gnb>ul{border:0}.x>.body>.gnb>ul>li{display:none}.x>.body>.gnb.open>ul>li{display:block}.x>.body>.gnb.open>ul>li[data-index="6"],.x>.body>.gnb.open>ul>li[data-index="7"],.x>.body>.gnb>.ex>li[data-index="6"],.x>.body>.gnb>.ex>li[data-index="7"]{display:none}.x>.body>.gnb.open>.ex>li[data-index="6"],.x>.body>.gnb.open>.ex>li[data-index="7"]{display:block}.x>.body>.gnb>ul>li:first-child{display:block!important}.x>.body.wide>.gnb>a[href="#gnbNav"],.x>.body>.gnb>a[href="#gnbNav"]{top:0;right:0;line-height:37px;width:44px;height:auto;background:0 0;border-radius:0;margin:0;border:0}.x>.body>.gnb>a[href="#gnbNav"]{opacity:.5;filter:alpha(opacity=50%)}.x>.body>.gnb>a[href="#gnbNav"]:before{content:"";position:absolute;top:1px;left:0;width:1px;height:100%;border-left:1px solid #999}.x>.body>.gnb>a[href="#gnbNav"]>b{display:none}.x>.body>.gnb>a>i{display:block;position:absolute;top:50%;left:50%;margin:-7px 0 0 -7px}}.x>.body>.gnb>ul>li{background:#3886d0;border-top:1px solid #fff;border-bottom:1px solid #ddd;vertical-align:top;white-space:nowrap}.x>.body>.gnb>ul>li.active{background:#222}.x>.body>.gnb>ul>li.active,.x>.body>.gnb>ul>li.open{border-bottom:0;padding:0 0 1px}.x>.body>.gnb>ul>li>a{position:relative;padding:8px 5px 8px 10px;background:#f1f1f1;background:-webkit-linear-gradient(top,#F1F1F1,#E8E8E8);background:-moz-linear-gradient(top,#F1F1F1,#E8E8E8);background:-o-linear-gradient(top,#F1F1F1,#E8E8E8);background:-ms-linear-gradient(top,#F1F1F1,#E8E8E8);background:linear-gradient(top,#F1F1F1,#E8E8E8)}.x>.body>.gnb>ul>li>a>i{display:inline-block;width:14px;height:14px;margin:-4px 4px 0 0;vertical-align:middle;opacity:.75;filter:alpha(opacity=75)}.x>.body>.gnb>ul>li>a>b{position:absolute;width:0;height:0;top:50%;right:10px;margin:-2px 0 0 0;border:4px solid transparent;border-top-color:#999}.x>.body>.gnb>ul>li.open>a>b{border-top:0;border-bottom-color:#fff}.x>.body.wide>.gnb>ul>li>a>b{display:none}.x>.body>.gnb>ul>li[data-index="1"]>a>i{background-position:-384px -144px}.x>.body>.gnb>ul>li[data-index="2"]>a>i{background-position:0 -24px}.x>.body>.gnb>ul>li[data-index="3"]>a>i{background-position:-168px 0}.x>.body>.gnb>ul>li[data-index="4"]>a>i{background-position:-48px -48px}.x>.body>.gnb>ul>li>a[href="#favorite"]>i{background-position:-120px 0}.x>.body>.gnb>ul>li[data-index="6"]>a>i{background-position:-360px -144px}.x>.body>.gnb>ul>li[data-index="7"]>a>i{background-position:-432px 0}.x>.body>.gnb>ul>li>a:focus,.x>.body>.gnb>ul>li>a:hover{background:#f6f6f6;background:-webkit-linear-gradient(top,#f6f6f6,#F1F1F1);background:-moz-linear-gradient(top,#f6f6f6,#F1F1F1);background:-o-linear-gradient(top,#f6f6f6,#F1F1F1);background:-ms-linear-gradient(top,#f6f6f6,#F1F1F1);background:linear-gradient(top,#f6f6f6,#F1F1F1)}.x>.body>.gnb>ul>li.open>a{font-weight:700;color:#fff;text-shadow:0 -1px 0 #333;background:#3886d0;background:-webkit-linear-gradient(top,#6ebcea,#3886d0);background:-moz-linear-gradient(top,#6ebcea,#3886d0);background:-o-linear-gradient(top,#6ebcea,#3886d0);background:-ms-linear-gradient(top,#6ebcea,#3886d0);background:linear-gradient(top,#6ebcea,#3886d0)}.x>.body>.gnb>ul>li.active>a{font-weight:700;color:#fff;text-shadow:none;background:#222;background:-webkit-linear-gradient(top,from(#555),to(#222));background:-moz-linear-gradient(top,#555,#222);background:-o-linear-gradient(top,#555,#222)}@media all and (max-width:800px){.x>.body>.gnb>ul>li:first-child>a{font-weight:700;color:#fff;text-shadow:none;border-radius:3px;background-color:#222;background-image:-webkit-linear-gradient(top,#555,#222);background-image:-moz-linear-gradient(top,#555,#222);background-image:-o-linear-gradient(top,#555,#222);background-image:linear-gradient(top,#555,#222)}}.x>.body.wide>.gnb>ul>li>a>.tx{display:inline-block;width:1px;height:1px;overflow:hidden}.x>.body>.gnb>ul>li>ul{display:none;margin:0 10px 10px;border-radius:4px}.x>.body>.gnb>ul>li.active>ul{display:block!important}.x>.body.wide>.gnb>ul>li>ul{display:none!important}.x>.body>.gnb>ul>li>ul>li{border-top:1px solid #ddd;position:relative}.x>.body>.gnb>ul>li>ul>li:first-child{border:0}.x>.body>.gnb>ul>li>ul>li.active_{box-shadow:0 0 3px #999;z-index:99;border:1px solid #666;border-left:0;border-right:0}.x>.body>.gnb>ul>li>ul>li>a{padding:4px 5px 4px 15px;background:#e8e8e8;background:-webkit-linear-gradient(top,#f1f1f1,#e8e8e8);background:-moz-linear-gradient(top,#f1f1f1,#e8e8e8);background:-o-linear-gradient(top,#f1f1f1,#e8e8e8);background:-ms-linear-gradient(top,#f1f1f1,#e8e8e8);background:linear-gradient(top,#f1f1f1,#e8e8e8)}.x>.body>.gnb>ul>li>ul#favorite>li>a{padding:4px 25px 4px 15px}.x>.body>.gnb>ul>li>ul>li:first-child>a{border-radius:4px 4px 0 0}.x>.body>.gnb>ul>li>ul>li:last-child>a{border-radius:0 0 4px 4px}.x>.body>.gnb>ul>li>ul>li:only-child>a{border-radius:4px}.x>.body>.gnb>ul>li>ul>li.active_>a,.x>.body>.gnb>ul>li>ul>li>a:active,.x>.body>.gnb>ul>li>ul>li>a:hover{font-weight:700;background:-webkit-linear-gradient(top,#F6F6F6,#F1F1F1);background:-moz-linear-gradient(top,#F6F6F6,#F1F1F1);background:-o-linear-gradient(top,#F6F6F6,#F1F1F1);background:-ms-linear-gradient(top,#F6F6F6,#F1F1F1);background:linear-gradient(top,#F6F6F6,#F1F1F1)}.x>.body>.gnb>ul>li>ul>li.active_>a:after{content:"";position:absolute;top:8px;right:-12px;border:6px solid transparent;border-left-color:#f3f3f3;width:0;height:0;overflow:hidden}.x>.body>.gnb>ul>li>ul>li>.remove{position:absolute;top:4px;right:5px}.x>.body>.gnb>ul>li>ul>li>.remove>.x_close{width:20px;height:20px}@media all and (max-width:800px){.x>.body.wide>.gnb>ul>li>a>.tx{width:auto;height:auto}}.x .dashboard{zoom:1}.x .dashboard:after{content:"";display:block;clear:both}.x .dashboard>div{float:right;width:49%}.x .dashboard>div:first-child{float:left}.x .dashboard>div>section{position:relative;height:196px;border:1px solid #ddd;border-radius:4px;margin:0 0 25px;overflow:hidden}.x .dashboard>div>section>h2{font-size:14px;margin:0;padding:6px 15px;border-bottom:1px solid #ddd;background:#e8e8e8;background:-webkit-linear-gradient(top,#F1F1F1,#E8E8E8);background:-moz-linear-gradient(top,#F1F1F1,#E8E8E8);background:-o-linear-gradient(top,#F1F1F1,#E8E8E8);background:-ms-linear-gradient(top,#F1F1F1,#E8E8E8);background:linear-gradient(top,#F1F1F1,#E8E8E8);text-shadow:0 1px 0 #fff}.x .dashboard>div>section>h2:before{content:"";display:inline-block;width:14px;height:14px;margin:0 4px 0 0;vertical-align:middle;opacity:.5;filter:alpha(opacity=50)}.x .dashboard>div>.status>h2:before{background-position:-408px 0}.x .dashboard>div>.status dl{color:#767676;display:inline-block;*display:inline;zoom:1;margin:0 8px 0 0;padding:1px 8px 0;font:11px/1 돋움,Dotum,Arial,Helvetica,sans-serif;background:#fff;box-shadow:0 0 3px #999 inset;border-radius:3px;min-width:60px;text-align:center}.x .dashboard>div>.status dt{display:inline;font-weight:400}.x .dashboard>div>.status dd{display:inline;margin:0}.x .dashboard>div>.status dl a{color:#767676}.x .dashboard>div>.member>h2:before{background-position:-168px 0}.x .dashboard>div>.document>h2:before{background-position:-264px -48px}.x .dashboard>div>.reply>h2:before{background-position:-240px -120px}.x .dashboard>div>.trackback>h2:before{background-position:-216px -120px}.x .dashboard>div>section>.more{position:absolute;top:7px;right:15px;text-shadow:0 1px 0 #fff}.x .dashboard>div>section>.more i{font:12px Tahoma,Geneva,sans-serif}.x .dashboard>div>section>.more dl{color:#767676;display:inline-block;*display:inline;zoom:1;margin:0 8px 0 0;padding:1px 8px 0;font:11px/1 돋움,Dotum,Arial,Helvetica,sans-serif;background:#fff;box-shadow:0 0 3px #999 inset;border-radius:3px;min-width:60px;text-align:center}.x .dashboard>div>section>.more dt{display:inline;font-weight:400}.x .dashboard>div>section>.more dd{display:inline;margin:0}.x .dashboard>div>section>.more dl a{color:#767676}.x .dashboard>div>section ul{list-style:none;margin:10px;padding:0;overflow:hidden;zoom:1}.x .dashboard>div>section li{position:relative;height:28px;line-height:28px;padding:0 70px 0 5px;white-space:nowrap;overflow:hidden;zoom:1;vertical-align:top}.x .dashboard>div>section li.hover{background:#f4f4f4;border-radius:4px}.x .dashboard>div>section li>a{display:block;width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.x .dashboard>div>section li>.side{position:absolute;top:0;right:5px;line-height:28px;width:60px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:right;zoom:1}.x .dashboard>div>section li>.action{display:none;position:absolute;top:0;right:5px;margin:0;padding:0 0 0 40px;text-align:right;white-space:nowrap;line-height:28px;background:#f4f4f4}.x .dashboard>div>section li>.action>button{margin:0 0 0 4px;padding:0 0 0 15px;overflow:visible}@media all and (max-width:980px){.x .dashboard>div{float:none!important;width:auto}}.x .g11n>.x_add-on{font-size:0;position:relative;cursor:pointer;text-decoration:none;*color:#eee}.x .g11n>.x_add-on>i{position:absolute;top:50%;left:50%;margin:-7px 0 0 -7px;z-index:1;opacity:.25;filter:alpha(opacity=25)}.x .g11n>.x_add-on.remover{display:none;width:26px;height:26px}.x .g11n.active>[disabled]{padding-left:25px;background-position:4px 6px;background-repeat:no-repeat}.x .g11n.active>.x_add-on.remover{display:inline-block}.x .g11n>.x_add-on:hover>i{opacity:1;filter:alpha(opacity=100)}.x .g11n>textarea{border-top-right-radius:0;overflow-x:hidden}#g11n #lang_search .list{border-top:2px solid #ddd}#g11n #lang_search .item{border-bottom:1px solid #ddd;margin:0}#g11n #lang_search .item>a{display:block;padding:8px 0;position:relative}#g11n #lang_search .item>a>i{position:absolute;top:50%;margin:-7px 0 0 0;right:0;opacity:.5;filter:alpha(opacity=50)}#g11n #lang_search .item>fieldset{display:none;padding:0 0 15px}#g11n .item input[type=text],#g11n .item textarea{padding-left:25px;width:187px;background-repeat:no-repeat;background-position:4px 8px;overflow-x:hidden}#g11n .flag{padding-left:18px;background-repeat:no-repeat;background-position:0 50%}#g11n .flag.en,#g11n .item .en,html[lang=en] .x .g11n.active>[disabled]{background-image:url(../img/flag.en.gif)}#g11n .flag.ko,#g11n .item .ko,html[lang=ko] .x .g11n.active>[disabled]{background-image:url(../img/flag.ko.gif)}#g11n .flag.jp,#g11n .item .jp,html[lang=jp] .x .g11n.active>[disabled]{background-image:url(../img/flag.jp.gif)}#g11n .flag.zh-CN,#g11n .item .zh-CN,html[lang=zh] .x .g11n.active>[disabled]{background-image:url(../img/flag.cn.gif)}#g11n .flag.zh-TW,#g11n .item .zh-TW,html[lang=zh] .x .g11n.active>[disabled]{background-image:url(../img/flag.tw.gif)}#g11n .flag.fr,#g11n .item .fr,html[lang=fr] .x .g11n.active>[disabled]{background-image:url(../img/flag.fr.gif)}#g11n .flag.de,#g11n .item .de,html[lang=de] .x .g11n.active>[disabled]{background-image:url(../img/flag.de.gif)}#g11n .flag.ru,#g11n .item .ru,html[lang=ru] .x .g11n.active>[disabled]{background-image:url(../img/flag.ru.gif)}#g11n .flag.es,#g11n .item .es,html[lang=es] .x .g11n.active>[disabled]{background-image:url(../img/flag.es.gif)}#g11n .item .tr,#gg1n .flag.tr,html[lang=tr] .x .g11n.active>[disabled]{background-image:url(../img/flag.tr.gif)}#g11n .flag.vi,#g11n .item .vi,html[lang=vi] .x .g11n.active>[disabled]{background-image:url(../img/flag.vi.gif)}#g11n .flag.mn,#g11n .item .mn,html[lang=mn] .x .g11n.active>[disabled]{background-image:url(../img/flag.mn.gif)}#g11n #lang_search .cancel,#g11n #lang_search .editMode .modify,#g11n #lang_search .editMode .useit,#g11n #lang_search .save{display:none}#g11n #lang_search .editMode .cancel,#g11n #lang_search .editMode .save{display:inline-block}.x .moduleWindow{position:absolute;z-index:100;padding:15px 20px}.x .moduleWindow ul{margin-bottom:0}.x .moduleWindow .siteList{margin-right:14px}.x .moduleWindow .siteList>input[type=search]{width:100%;padding-top:6px;padding-bottom:6px;border-radius:3px 3px 0 0;margin-bottom:0}.x .moduleWindow .siteList>ul{margin:-1px -14px 0 0}.x .moduleWindow .siteList>ul>li{background:#fff}.x .moduleWindow .siteList>ul>li:first-child>a{border-top-left-radius:0;border-top-right-radius:0}.x .moduleWindow select{width:100%}.x .textList{border:1px solid #ddd!important;line-height:1.5em;height:125px;overflow:auto}.x .textList li{position:relative;border:0;padding:0 10px;height:25px;line-height:25px;white-space:nowrap;overflow:hidden}.x .textList li:nth-child(even){background:#eee}.x .textList li>button{position:absolute;right:8px;top:50%;margin:-7px 0 0 0}.x .uDrag .wrap{position:relative;padding-left:20px}.x .uDrag li>.wrap{margin:0 0 0 8px}.x .uDrag .dragActive{background:#FFD}.x .uDrag .dragActive td,.x .uDrag .dragActive th{background:none!important}.x .uDrag .dragBtn{position:absolute;width:8px;height:100%;padding:0;overflow:hidden;background:url(../img/bgDragable.gif);top:1px;left:0;text-indent:12px;border:0;cursor:n-resize;white-space:nowrap;font-size:0}.x #faviconPreview{position:relative;padding:80px 0 0 200px;background:url(../img/bgFavicon.gif) no-repeat}.x #faviconPreview img{position:absolute}.x #faviconPreview .fn1{top:30px;left:12px}.x #faviconPreview .fn2{top:55px;left:68px}.x #mobiconPreview{position:relative;padding:270px 0 0 200px;background:url(../img/bgMobileTop.png) no-repeat}.x #mobiconPreview img{position:absolute;top:20px;left:10px;width:32px;height:32px}.x #mobiconPreview span{position:absolute;width:32px;text-align:center;top:52px;left:10px;color:#fff;font-size:9px}.x .layer{position:absolute;display:none;font-weight:400}.tree{margin:3px 0 5px;min-width:200px;background-color:transparent!important}.tree ul{margin:0;padding:0;list-style:none}.tree li{padding:0;white-space:nowrap;position:relative;border-radius:3px;vertical-align:top}.tree li>ul{margin:0}.tree a{text-decoration:none}.tree>ul{padding:1px}.tree .jstree-rename-input{margin-left:-16px;z-index:2}.tree>ul>li{margin-top:30px;position:relative}.tree>ul>li:before{content:"";display:block;border-top:1px dotted #ccc;position:relative;top:-15px}.tree>ul>li:first-child{margin-top:0}.tree>ul>li:first-child:before{content:normal}.tree>ul>li>a{font-weight:700;text-shadow:0 1px 0 #fff;vertical-align:middle}.tree>ul>li>a.jstree-clicked,.tree>ul>li>a.jstree-hovered,.tree>ul>li>a:focus,.tree>ul>li>a:hover{text-shadow:none}.tree>ul>li>ul{margin:0 0 0 18px}.tree>ul>li>ul>li{margin-left:0}.tree li>a{border:0!important;padding:0 8px!important;margin:0 0 1px;border-radius:3px;position:relative;z-index:2;height:23px;line-height:23px;max-width:160px;overflow:hidden;text-overflow:ellipsis;-webkit-transition:.2s;-moz-transition:.2s;-o-transition:.2s;transition:.2s}.tree li>a>i{opacity:.5;filter:alpha(opacity=50)}.tree .jstree-clicked>i,.tree .jstree-hovered>i{opacity:1;filter:alpha(opacity=100)}.tree a>.jstree-icon{display:none}.tree .jstree-closed>.jstree-icon,.tree .jstree-open>.jstree-icon{background-color:#fff}.x .h2,.x .h3,.x .h4{position:relative;border-style:solid;border-top:0;border-right:0;zoom:1;padding-left:8px}.x .h1{background:#444;border-radius:4px;color:#fff;margin:0 0 1em;font-size:16px;padding:0 15px;line-height:36px}.x .h2{border-width:3px;font-size:20px;border-color:#888}.x .h3{border-width:2px;font-size:16px;border-color:#aaa}.x .h4{border-width:1px;font-size:12px;border-color:#ccc}.x .h1+.table table,.x .h1+ul,.x .h2+.table table,.x .h2+ul,.x .h3+.table table,.x .h3+ul,.x .h4+.table table,.x .h4+ul{border-top:0!important;margin-top:-1em!important}.x .table{margin:1em 0}.x .table table{width:100%;border:0;border-collapse:collapse;border-top:2px solid #ccc}.x .table caption{font-weight:700;text-align:left;line-height:22px;padding:5px 0}.x .table caption:after{content:"";display:block;clear:both}.x .table caption a{font-weight:400}.x .table caption em{float:right;margin-left:1em}.x .table caption strong{color:#e00}.x .table caption .side{float:right;font-weight:400;margin-left:1em}.x .table td,.x .table th{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd}.x .table th{background:#f8f8f8}.x .table thead th{border-bottom:1px solid #999}.x .table tfoot td{font-weight:700;background:#f8f8f8}.x .table.even tbody tr:nth-of-type(even){background-color:#fafafa}.x .table tbody tr:hover{background:#ffd!important}.x .table td>input[type=text]{margin:-1px 0!important;vertical-align:middle}.x .table img{vertical-align:middle}.x .table em{font-style:normal;font-weight:400;color:#e00}.x .form{margin:0 0 1em;padding:0}.x .form fieldset{margin:0 0 2em;padding:0;border:0}.x .form.search fieldset{border:1px solid #ccc;padding:5px 15px;border-radius:3px}.x .form em{font-style:normal;color:#e00}.x .form label{line-height:1;vertical-align:middle}.x .form input[type=checkbox]+label,.x .form input[type=radio]+label{margin-right:1em}.x .form input[type=checkbox]+label,.x .form input[type=file],.x .form input[type=radio]+label{cursor:pointer}.x .form ul{position:relative;margin:1em 0;padding:0;list-style:none;border-top:2px solid #ccc;border-bottom:1px solid #ccc;zoom:1}.x .form li{list-style:none;border:1px solid #ddd;border-left:0;border-right:0;margin:-1px 0;padding:8px 0;vertical-align:top;zoom:1}.x .form li:hover{background:#ffd}.x .form li:first-child{border-top:0}.x .form li>label:first-child{display:block;font-weight:700}.x .form li label em{font-weight:400}.x .form label.overlap{position:absolute;color:#aaa}.x .form input[type=file],.x .form input[type=password],.x .form input[type=text],.x .form select[size],.x .form textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:0 0}.x .form input[type=file],.x .form input[type=password],.x .form input[type=text]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .form input[type=checkbox],.x .form input[type=radio]{margin:0;padding:0;width:13px;height:13px;vertical-align:middle}.x .form input[type=checkbox][disabled=disabled],.x .form input[type=password][disabled=disabled],.x .form input[type=radio][disabled=disabled],.x .form input[type=text][disabled=disabled],.x .form select[disabled=disabled],.x .form textarea[disabled=disabled]{background:#ddd;text-shadow:1px 1px 0 #fff}.x .form textarea{padding:3px 4px;vertical-align:top;resize:both}.x .form em.desc,.x .form span.desc{line-height:22px;vertical-align:middle;margin:0 10px}.x .form p.desc{margin:.25em 0;line-height:1.4}.x .form .q{font-weight:700;margin:0 0 5px}.x .form .a{margin:0 0 5px}.x .form .tgForm{margin-right:1em}.x .cnb{margin:1em 0;position:relative;zoom:1}.x .cnb:after{content:"";display:block;clear:both}.x .cnb ul{list-style:none;margin:0;padding:0}.x .cnb li{display:inline}.x .cnb li:before{content:"| ";color:#ccc}.x .cnb li:first-child:before{content:""}.x .cnb .active,.x .cnb .active a{font-weight:700;color:#333;text-decoration:none}.x .cnb .side{float:right}.x .pagination{margin:1em 0;text-align:center;line-height:normal}.x .pagination *{vertical-align:middle}.x .pagination a,.x .pagination strong{position:relative;display:inline-block;padding:2px 4px;font-weight:700;text-decoration:none;line-height:normal;color:#333!important;vertical-align:middle}.x .pagination a:active,.x .pagination a:focus,.x .pagination a:hover{border:1px solid #ddd;margin:0 -1px}.x .pagination strong{color:#e00!important;font-size:20px}.x .pagination .direction{font-weight:400;white-space:nowrap}.x .pagination .direction:active,.x .pagination .direction:focus,.x .pagination .direction:hover{border:0;margin:0;text-decoration:underline}.x .pagination input{width:30px;text-align:center}.x .pagination button{overflow:visible}.x .prgrs{white-space:nowrap;line-height:normal;vertical-align:middle}.x .prgrs *{vertical-align:middle}.x .prgrs .pBar{position:relative;display:inline-block;background:#e9e9e9;margin:0 5px 0 0}.x .prgrs .pAction{display:inline-block;vertical-align:top;background:#99a6b6}.x .prgrs .pNum{width:100%;left:0;top:0;text-align:center;text-shadow:1px 1px 0 #fff}.x .prgrs.prgrsSmall{font-size:14px;line-height:14px}.x .prgrs.prgrsSmall .pAction,.x .prgrs.prgrsSmall .pBar,.x .prgrs.prgrsSmall .pNum{height:16px;line-height:16px;font-size:11px}.x .prgrs.prgrsMedium{font-size:24px;line-height:24px}.x .prgrs.prgrsMedium .pAction,.x .prgrs.prgrsMedium .pBar,.x .prgrs.prgrsMedium .pNum{height:22px;line-height:22px;font-size:12px}.x .prgrs.prgrsLarge{font-size:38px;line-height:38px}.x .prgrs.prgrsLarge .pAction,.x .prgrs.prgrsLarge .pBar,.x .prgrs.prgrsLarge .pNum{height:34px;line-height:34px;font-size:14px}.modal{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:1050}.modal .bg{position:absolute;background:#000;_background:0 0;width:100%;height:100%;opacity:.5;z-index:2;filter:alpha(opacity=50);zoom:1}.modal .fg{position:relative;width:80%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000}.modal .lined,.modal .table,.modal ol,.modal ul{margin-bottom:1em}.modal .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1}.modalClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:700;cursor:pointer;color:#999;border-radius:5px}.modalBlur{position:absolute;top:0;right:0;border:0;background:0 0;padding:0;width:1px;height:1px;overflow:hidden}.admin-forum-container{clear:both;margin:10px 5px;border:0 solid #ddd}.admin-forum-container.activated-forum{margin-top:30px;padding:15px;background-color:#fbfbfb;border-width:3px 0}.admin-forum-container .open-forum{display:inline-block;padding:15px;padding-left:60px;color:#08c;font-size:14px;height:20px;line-height:20px;text-decoration:none;background-image:url(../img/chak_c.png);background-repeat:no-repeat;background-position:center left}.admin-forum-container .open-forum:active,.admin-forum-container .open-forum:hover{text-decoration:underline} \ No newline at end of file diff --git a/modules/admin/tpl/img/chak_c.png b/modules/admin/tpl/img/chak_c.png new file mode 100644 index 000000000..c0ea44130 Binary files /dev/null and b/modules/admin/tpl/img/chak_c.png differ diff --git a/modules/admin/tpl/index.html b/modules/admin/tpl/index.html index 00c5a13c5..7b8ebfbcd 100644 --- a/modules/admin/tpl/index.html +++ b/modules/admin/tpl/index.html @@ -81,17 +81,11 @@
    -

    안전하지 않은 PHP 버전 경고

    -

    이 서버는 안전하지 않은 PHP 버전을 사용하고 있으며, PHP를 최신 안정 버전으로의 업그레이드를 권장합니다.

    -

    이 서버의 PHP 버전 : {phpversion()}

    -

    PHP 최신 안정버전 확인하기

    - -
      -
    • 매우 심각한 PHP 보안 문제 및 공격에 노출될 수 있습니다.
    • -
    • XE 최신 버전을 사용할 수 없습니다.
    • -
    • XE 최신 버전 이상을 지원하는 확장 기능을 사용할 수 없습니다.
    • -
    • 일부 확장 기능이 동작하지 않거나, 이로 인해 장애가 발생할 수 있습니다.
    • -
    +

    {$lang->msg_php_warning_title}

    +

    {$lang->msg_php_warning_notice}

    +

    {$lang->msg_php_warning_now_version} : {phpversion()}

    +

    {$lang->msg_php_warning_latest_version_check}

    +
      {$lang->msg_php_warning_notice_explain}
    diff --git a/modules/admin/tpl/js/admin.js b/modules/admin/tpl/js/admin.js index 0eee8ae5b..1f3a60d20 100644 --- a/modules/admin/tpl/js/admin.js +++ b/modules/admin/tpl/js/admin.js @@ -2471,3 +2471,67 @@ jQuery(function($){ } }); }); + + + +// Forum Chak +(function($){ + var chak = { + elClass: 'chak-comment', + group_id: 'xe1_official', + apikey: 'xe17935b49af5435d37f1cde130363db-forum' + }; + + $(function(){ + var $chakContainer = $('.admin-forum-container'); + + if($chakContainer.length) { + var $forumOpen = $('이 페이지에 대한 포럼 보기'); + var $headerButton = $('
  • Forum
  • '); + var $headerMenu = $('header.header .account ul'); + + (function(){var s=document.createElement('script');s.type='text/javascript';s.src='//chak.it/static/service.js';s.async=true;(document.getElementsByTagName('head')[0]||document.getElementsByTagName('body')[0]).appendChild(s);})(); + + $chakContainer.each(function(idx){ + var $el = $(this); + var elData = $el.data(); + elData.count = 0; + var $opener = $forumOpen.clone(); + var $button = $headerButton.clone(); + var forumId = 'inline-forum-' + idx; + + $el.append($opener); + + $button.find('a') + .attr('href', '#' + forumId) + .on('click', function(){ + var $target = $($.attr(this, 'href')); + $('html, body').animate({ + scrollTop: $target.offset().top - 20 + }, 500); + return false; + }) + .one('click', function() { + var $target = $($.attr(this, 'href')); + $target.find('a').click(); + }); + + $headerMenu.append($button); + $el.attr('id', forumId); + + $el.find('a').on('click', function(){ + var div = document.createElement("div"); + div.setAttribute("data-chak-apikey", chak.apikey); + div.setAttribute("data-chak-categories", elData.chakCategories); + + $opener.after(div); + $chakContainer.addClass('activated-forum'); + + manuallySetChakService(div); + + $opener.remove(); + }); + }); + } + }); +})(jQuery); diff --git a/modules/admin/tpl/js/admin.min.js b/modules/admin/tpl/js/admin.min.js index afdd04989..18f9df812 100644 --- a/modules/admin/tpl/js/admin.min.js +++ b/modules/admin/tpl/js/admin.min.js @@ -1,2 +1,2 @@ function doInstallModule(a){var b=[];b.module_name=a,exec_xml("install","procInstallAdminInstall",b,completeInstallModule)}function doUpdateModule(a){var b=[];b.module_name=a,exec_xml("install","procInstallAdminUpdate",b,completeInstallModule)}function completeInstallModule(a){alert(a.message),location.reload()}function getOffset(a,b){for(var c=0,d=0;a&&a!=b;)c+=a.offsetTop,d+=a.offsetLeft,a=a.offsetParent;return{top:c,left:d}}jQuery(function(a){function b(){var b=a(".x>.body"),c=b.find(">.gnb"),d=b.children("#content.content");d.width("99.99%"),setTimeout(function(){d.removeAttr("style"),c.height()>d.height()&&d.height(c.height())},100)}if(window.scrollTo(0,0),a(document.body).on("click",".x [data-toggle]",function(){var b=a(this);if(b.is("a")&&b.attr("href")!=b.attr("data-toggle")){var c=b.attr("href");b.attr("data-toggle",c)}var d=a(b.attr("data-toggle")),e="a,input,button,textarea,select";return d.toggle(),d.is(":visible")&&!d.find(e).length?d.not(":disabled").attr("tabindex","0").focus():d.is(":visible")&&d.find(e).length?d.not(":disabled").find(e).eq(0).focus():b.focus(),!1}),a(document.body).on("click",".x [data-show]",function(){var b=a(this);if(b.is("a")&&b.attr("href")!=b.attr("data-show")){var c=b.attr("href");b.attr("data-show",c)}return a(b.attr("data-show")).show().attr("tabindex","0").focus(),!1}),a(document.body).on("click",".x [data-hide]",function(){var b=a(this);if(b.is("a")&&b.attr("href")!=b.attr("data-hide")){var c=b.attr("href");b.attr("data-hide",c)}return a(b.attr("data-hide")).hide(),b.focus(),!1}),a.fn.xeTabbable=function(){a(this).each(function(){var b=a(this);b.find(">.x_nav-tabs>li>a").each(function(b){a(this).attr("data-index",b+1)}),b.find(">.x_tab-content>.x_tab-pane").each(function(b){a(this).attr("data-index",b+1)})}),a('.x .x_tab-content>.x_tab-pane:not(".x_active")').hide()},a(".x .x_tabbable").xeTabbable(),a(document.body).on("click",'.x .x_nav-tabs>li>a[href^="#"]',function(){var b=a(this);return b.parent("li").hasClass("x_disabled")?!1:(b.parent("li").addClass("x_active").siblings().removeClass("x_active"),b.closest(".x_nav-tabs").next(".x_tab-content").find(">.x_tab-pane").eq(b.attr("data-index")-1).addClass("x_active").show().siblings(".x_tab-pane").removeClass("x_active").hide(),b.parents(".x_tabbable").trigger("tab_change",[parseInt(b.attr("data-index"))-1,b]),!1)}),a.fn.gnb=function(){var c=a(".x>.body"),d=c.find(">.gnb"),e=d.find(">ul>li"),f=new Date;f.setTime(f.getTime()+30758400),e.find(">a").prepend(""),e.find(">ul").prev("a").append(""),e.each(function(b){a(this).attr("data-index",b+1)});var g=e.find(">ul>li.active_").closest("li.active").attr("data-index");e.find(">ul>li.active_").clone().addClass("active").attr("data-index",g).prependTo("#gnbNav").find(">a").prepend(""),e.find(">a").click(function(){function d(){c.removeClass("wide"),b()}var e=a(this),g=a(this).parent("li"),h=g.hasClass("open"),i=g.hasClass("active"),j=g.find(">ul").length>=1,k=c.hasClass("wide");return h||i||!j?h&&!i&&j&&!k?(g.removeClass("open").find(">ul").slideUp(100),d(),setCookie("__xe_admin_gnb_tx_"+e.data("href"),"close",f),!1):k&&!j||i||k&&h?(d(),!1):void 0:(g.addClass("open").find(">ul").slideDown(100),d(),setCookie("__xe_admin_gnb_tx_"+e.data("href"),"open",f),!1)}),d.find('>a[href="#gnbNav"]').click(function(){return a(this).parent(".gnb").toggleClass("open"),c.toggleClass("wide"),a(window).width()<=980&&!d.hasClass("open")&&a("#gnbNav").removeClass("ex"),b(),a(this).parent(".gnb").hasClass("open")?setCookie("__xe_admin_gnb_status","open",f):setCookie("__xe_admin_gnb_status","close",f),!1}),d.find(".exMenu>button").click(function(){a("#gnbNav").toggleClass("ex"),b(),a("#gnbNav").hasClass("ex")?setCookie("__xe_admin_gnb_ex_status","open",f):setCookie("__xe_admin_gnb_ex_status","close",f)});var h=getCookie("__xe_admin_gnb_status");h&&setCookie("__xe_admin_gnb_status",h,f);var i=getCookie("__xe_admin_gnb_ex_status");if(i&&setCookie("__xe_admin_gnb_xe_status",i,f),"undefined"!=typeof __xe_admin_gnb_txs)for(var j in __xe_admin_gnb_txs){var k=__xe_admin_gnb_txs[j],l=getCookie(k);setCookie(k,l,f)}},a(".gnb").gnb(),a(".x #lang").mouseleave(function(){a(this).hide()}).focusout(function(){var b=a(this);setTimeout(function(){b.find("a:focus").length||b.mouseleave()},500)}),a(".x th :checkbox").change(function(){var b=a(this),c=b.data("name");b.closest("table").find(":checkbox").filter(function(){var b=a(this);return!b.prop("disabled")&&(b.attr("name")==c||b.data("name")==c)}).prop("checked",b.prop("checked")).end().end().trigger("update.checkbox",[c,this.checked])}),a(document.body).on("click",".x .x_pagination .x_disabled, .x .x_pagination .x_active",function(){return!1}),a(".x .section").length>1){var c=a(".x .section").find(">h1:first");c.each(function(){var b=a(this);b.next().length&&b.append('')}),a(".x .section.collapsed>h1>.snToggle").removeClass("x_icon-chevron-up").addClass("x_icon-chevron-down"),c.click(function(){var c=a(this),d=a(this).find(">.snToggle"),e=c.closest(".section");e.hasClass("collapsed")?(e.removeClass("collapsed"),d.removeClass("x_icon-chevron-down").addClass("x_icon-chevron-up")):(e.addClass("collapsed"),d.removeClass("x_icon-chevron-up").addClass("x_icon-chevron-down")),b()})}var d=a(".x .x_alert");d.prepend(''),d.children(".x_close").click(function(){a(this).parent(".x_alert").hide()}),a(".x .x_btn").click(function(){return a(this).hasClass("x_disabled")?!1:void 0}),a.fn.vr=function(){this.each(function(){var b=a(this);"|"==b.text()&&b.addClass("vr").filter(":first-child, :last-child").remove()})},a(".x i").vr(),a.fn.labelMaker=function(){this.each(function(b){b+=1;var c=a(this),d="input, textarea, select",e=":radio, :checkbox",f="[id]",g="i"+b;c.next(d).filter(f).not(e).length?c.attr("for",c.next().attr("id")):c.next(d).not(f).not(e).length?c.attr("for",g).next().attr("id",g):c.prev(e).filter(f).length?c.attr("for",c.prev().attr("id")):c.prev(e).not(f).length?c.attr("for",g).prev().attr("id",g):c.children(d).filter(f).length?c.attr("for",c.children(d).filter(f).eq(0).attr("id")):c.children(d).not(f).length&&c.attr("for",g).children(d).not(f).eq(0).attr("id",g)})},a("label:not([for])").labelMaker(),a.fn.checkToggle=function(){function b(){setTimeout(function(){a(":checked").parent("label").addClass("checked"),a(':not(":checked")').parent("label").removeClass("checked")},0)}this.change(b),b()},a(":radio, :checkbox").checkToggle(),a.fn.fileTypeOverlap=function(){this.each(function(){var b=a(this);b.wrap('').before(b.attr("title"))})},a('input[type="file"].overlap').fileTypeOverlap(),a.fn.tableSpan=function(){this.each(function(){var b=a(this),c=b.find(">thead>tr:eq(0)>th").length,d=b.find(">tbody>tr:eq(0)>td:only-child");c!=d.attr("colspan")&&d.attr("colspan",c).css("text-align","center")})},a("table").tableSpan()}),jQuery(function(a){var b=27,c=[],d=1040,e=a('
    ').appendTo("body").hide();a.fn.xeModalWindow=function(){this.not(".xe-modal-window").addClass("xe-modal-window").each(function(){a(a(this).attr("href")).addClass("x").hide()}).click(function(){var b,c=a(this);return b=a(c.attr("href")),"showing"==b.data("state")?c.trigger("close.mw"):c.trigger("open.mw"),!1}).bind("open.mw",function(){function f(){k.trigger("after-open.mw")}var g,h,i,j,k=a(this);if(g=a(k.attr("href")),!c.length||c[c.length-1].get(0)!=g.get(0)){if(g.parent("body").length||(h=a(''),h.click(function(){g.data("anchor").trigger("close.mw")}),g.find("[data-hide]").click(function(){g.data("anchor").trigger("close.mw")}),a("body").append(g),g.prepend(h)),g.data("anchor",k),i=a.Event("before-open.mw"),k.trigger(i),i.isDefaultPrevented())return!1;j=k.data("duration")||"fast",g.data("state","showing"),a(document).bind("keydown.mw",function(a){return a.which==b?(k.trigger("close.mw"),!1):void 0}),g.fadeIn(j,f).find("button.x_close:first").focus(),a("body").css("overflow","hidden"),c.push(g);var l=d+2*(c.length-1);e.css("z-index",l).show();var m=e.height(),n=m;n-=g.find(".x_modal-header:visible").height(),n-=g.find(".x_modal-footer:visible").height(),n-=150,g.find(".x_modal-body").css("height",n),g.css("z-index",l+1)}}).bind("close.mw",function(){function b(){i.trigger("after-close.mw")}var f,g,h,i=a(this);if(g=a(i.attr("href")),!c.length||c[c.length-1].get(0)==g.get(0)){if(f=a.Event("before-close.mw"),i.trigger(f),f.isDefaultPrevented())return!1;h=i.data("duration")||"fast",g.data("state","hiding"),g.fadeOut(h,b),a("body").css("overflow","auto"),i.focus(),c.pop();var j=d+2*(c.length-1);c.length?e.css("z-index",j):e.hide()}}),a("div.x_modal").addClass("x")},a("a.modalAnchor").xeModalWindow()}),jQuery(function(a){var b=!1,c=27;a.fn.xeContentToggler=function(){return this.not(".xe-content-toggler").addClass("xe-content-toggler").each(function(){var c=a(this);$layer=a(c.attr("href")),$layer.hide().not(".xe-toggling-content").addClass("xe-toggling-content").mousedown(function(a){b=!0}).focusout(function(a){setTimeout(function(){b||$layer.find(":focus").length||"showing"!=$layer.data("state")||c.trigger("close.tc"),b=!1},1)})}).click(function(){var b,c=a(this);return b=a(c.attr("href")),b.data("anchor",c),"showing"==b.data("state")?c.trigger("close.tc"):c.trigger("open.tc"),!1}).bind("open.tc",function(){function d(){h.trigger("after-open.tc")}var e,f,g,h=a(this);switch(e=a(h.attr("href")),f=h.data("effect"),g=h.data("duration")||"fast",e.data("state","showing"),h.trigger("before-open.tc"),b=!1,a(document).unbind("mousedown.tc keydown.tc").bind("mousedown.tc keydown.tc",function(b){if(b){if("keydown"==b.type&&b.which!=c)return!0;if("mousedown"==b.type){var d=a(b.target);if(d.is("html,.tgAnchor,.tgContent")||e.has(d).length)return!0}}return h.trigger("close.tc"),!1}),f){case"slide":e.slideDown(g,d);break;case"slide-h":var i=e.css({"overflow-x":"",width:""}).width();e.show().css({"overflow-x":"hidden",width:"0px"}).animate({width:i},g,function(){e.css({"overflow-x":"",width:""}),d()});break;case"fade":e.fadeIn(g,d);break;default:e.show(),h.trigger("after-open.tc")}}).bind("close.tc",function(){function b(){f.trigger("after-close.tc")}var c,d,e,f=a(this);switch(a(document).unbind("mousedown.tc keydown.tc"),c=a(f.attr("href")),d=f.data("effect"),e=f.data("duration")||"fast",c.data("state","hiding"),f.trigger("before-close.tc"),d){case"slide":c.slideUp(e,b);break;case"slide-h":c.animate({width:0},e,function(){c.hide(),b()});break;case"fade":c.fadeOut(e,b);break;default:c.hide(),f.trigger("after-close.tc")}}),this},a("a.tgAnchor").xeContentToggler()}),jQuery(function(a){a.fn.xeModuleFinder=function(){return this.not(".xe-module-finder").addClass("xe-module-finder").find("a.tgAnchor.findsite").bind("before-open.tc",function(){function b(b){var e,f,g,h=b.site_list;if(d.empty(),c.closest(".modulefinder").find(".moduleList,.moduleIdList").attr("disabled","disabled"),b.error||!a.isArray(h))return void c.trigger("close.tc");for(f=0,g=h.length;g>f;f++)e=a("
  • ").appendTo(d),a('

    "),a("body").append(b),b.find("._ok").click(function(){a.xeMsgBox.fnOnOK()}),b.find("._cancel").click(function(){a.xeMsgBox.fnOnCancel()}),b.bind("show",function(){a.xeMsgBox.bVisible=!0,a.xeMsgBox._showFoggy(),a.xeMsgBox.fnOnShow(),b.find("input,button").length>0&&setTimeout(function(){b.find("input,button").each(function(b,c){var d=a(c);return d.is(":visible")?(d.focus(),!1):void 0})},0)}),b.bind("hide",function(){a.xeMsgBox.bVisible=!1,a.xeMsgBox._hideFoggy(),a.xeMsgBox.fnOnHide()}),a(document.body).on("keydown",function(c){a.xeMsgBox.bVisible&&27===c.keyCode&&(b.find("._cancel").click(),c.preventDefault())}),a.xeMsgBox.fnOnOK=function(){"function"==typeof a.xeMsgBox.htOptions.fnOnOK&&a.xeMsgBox.htOptions.fnOnOK()||b.hide()},a.xeMsgBox.fnOnCancel=function(){"function"==typeof a.xeMsgBox.htOptions.fnOnCancel&&a.xeMsgBox.htOptions.fnOnCancel(),b.hide()},a.xeMsgBox.fnOnShow=function(){"function"==typeof a.xeMsgBox.htOptions.fnOnShow&&a.xeMsgBox.htOptions.fnOnShow()},a.xeMsgBox.fnOnHide=function(){"function"==typeof a.xeMsgBox.htOptions.fnOnHide&&a.xeMsgBox.htOptions.fnOnHide()},a.xeMsgBox.showMsgBox=function(c){a('head>link[rel="stylesheet"]:last').after(''),c=a.xeMsgBox.htOptions=c||{};var d=c.sTitle||"",e=c.sText||"",f=c.bDanger||!1;b.find("._title").html(d),b.find("._text").html(e),""===e?b.addClass("_nobody"):b.removeClass("_nobody");var g=b.find("._ok");f?(g.removeClass("x_btn-inverse"),g.addClass("x_btn-danger")):(g.removeClass("x_btn-danger"),g.addClass("x_btn-inverse")),c.bSmall?b.addClass("_small"):b.removeClass("_small"),c.bAlert?b.addClass("_type_alert"):b.removeClass("_type_alert"),b.show()},a.xeMsgBox.alertDialog=function(a){a=a||{},a.bAlert=!0,this.showMsgBox(a)},a.xeMsgBox.alert=function(a){htOptions={bAlert:!0,bNobody:!0,bSmall:!0,sText:a},this.showMsgBox(htOptions)},a.xeMsgBox.confirmDialog=function(a){a=a||{},a.bAlert=!1,this.showMsgBox(a)};var c=a.xeMsgBox.$foggyLayer=a("
    ");c.css({position:"fixed",top:0,left:0,backgroundColor:"#000",opacity:.5,display:"none",zIndex:9998}),a(a.find("body")).append(c),a.xeMsgBox._resizeFoggy=function(){c.css({width:0,height:0}),setTimeout(function(){c.css({width:a(document).width(),height:a(document).height()})},0)},a(window).resize(a.xeMsgBox._resizeFoggy),a.xeMsgBox._resizeFoggy(),a.xeMsgBox._showFoggy=function(){c.show()},a.xeMsgBox._hideFoggy=function(){c.hide()}}),jQuery(function(a){a.xeFoggy={};var b=a.xeFoggy.$foggyLayer=a("
    ");b.css({position:"fixed",top:0,left:0,backgroundColor:"#000",opacity:.5,display:"none",zIndex:9998}),a("body").append(b),a.xeFoggy._resizeFoggy=function(){b.css({width:0,height:0}),setTimeout(function(){b.css({width:a(document).width(),height:a(document).height()})},0)},a(window).resize(a.xeFoggy._resizeFoggy),a.xeFoggy._resizeFoggy(),a.xeFoggy.show=function(a){a?b.css({opacity:0}):b.css({opacity:.5}),b.show()},a.xeFoggy.hide=function(){b.hide()}}),jQuery(function(a){var b=!1,c=a('
  • ');a.fn.xeSortableTable=function(){return this.not(".xe-sortable-table").addClass("xe-sortable-table").delegate("button.dragBtn","mousedown.st",function(d){var e,f,g,h,i,j,k,l,m,n,o,p;if(1==d.which){if(e=a(this),f=e.closest("tr"),g=e.closest("table"),p=g.get(0).offsetParent,i=f.height(),j=f.width(),before_event=a.Event("before-drag.st"),g.trigger(before_event),before_event.isDefaultPrevented())return!1;l={x:d.pageX,y:d.pageY},k=getOffset(f.get(0),p),$clone=f.attr("target",!0).clone(!0).appendTo(g),o=(h=g.find("thead th")).length,h.filter("[colspan]").attr("colspan",function(a,b){o+=b-1}),c.find("td").attr("colspan",o),m=[],g.find("tbody>tr:not([target],.sticky,:hidden)").each(function(){var b,c=a(this);b=getOffset(this,p),m.push({top:b.top,bottom:b.top+c.height(),$item:c})}),$clone.addClass("draggable").css({position:"absolute",opacity:.6,width:j,height:i,left:k.left,top:k.top,zIndex:100}),c.css({position:"absolute",opacity:.6,width:j,height:"10px",left:k.left,top:k.top,backgroundColor:"#bbb",overflow:"hidden",zIndex:99}).appendTo(g),f.css("opacity",.6),a(document).unbind("mousedown.st mouseup.st").bind("mousemove.st",function(a){var b,d,e,f,g;for(n=null,b={x:l.x-a.pageX,y:l.y-a.pageY},d=k.top-b.y,e=0,f=m.length;f>e;e++)g=m[e],e&&g.top>d||f-1>e&&g.bottomd-12?(n.state="before",c.css("top",g.top-5)):(n.state="after",c.css("top",g.bottom-5)));$clone.css({top:d})}).bind("mouseup.st",function(d){var e;b=!1,a(document).unbind("mousemove.st mouseup.st"),f.removeAttr("target").css("opacity",""),$clone.remove(),c.remove(),n&&(e=a(n.element),e[n.state](f),g.trigger("after-drag.st"))})}}),this},a("table.sortable").xeSortableTable()}),jQuery(function(a){a(".filebox").bind("before-open.mw",function(){function b(e){d.html(e.html),d.find(".select").bind("click",function(b){var d=a("input.select_checkbox:checked");if(0===d.length){var e=a(this).closest("tr").find("img.filebox_item").attr("src");e?(c.trigger("filebox.selected",[e]),c.trigger("close.mw")):alert("None selected!")}else c.trigger("filebox.selected",[d]),c.trigger("close.mw");return!1}),d.find(".x_pagination").find("a").filter(function(){return a(this).data("toggle")?!1:a(this).parent().hasClass("x_disabled")?!1:a(this).parent().hasClass("x_active")?!1:!0}).bind("click",function(){var c=a(this).attr("page");return a.exec_json("module.getFileBoxListHtml",{page:c},b),!1}),a("#goToFileBox").find("button").bind("click",function(){var c=a(this).prev("input").val();return a.exec_json("module.getFileBoxListHtml",{page:c},b),!1}),d.closest(".x_modal-body").scrollTop(0)}var c,d,e;c=a(this),e=c.attr("href"),d=a(e).find(".filebox_list"),a.exec_json("module.getFileBoxListHtml",{page:"1"},b)});var b=a(".x .dsTg .__simple"),c=a(".x .dsTg .__detail"),d=a(".x .dsTg td.title");d.each(function(){var b=a(this);0===b.find("p.x_alert").length&&b.addClass("tg").find(">*:not(:first-child)").hide()});var e=a(".x .dsTg td.tg>*:not(:first-child)");b.click(function(){e.hide(),c.removeClass("x_active"),b.addClass("x_active")}),c.click(function(){e.show(),c.addClass("x_active"),b.removeClass("x_active")})}),jQuery(function(a){a.fn.xeMultilingualWindow=function(b){function c(){return o.is(":visible")&&q&&confirm(xe.msg_confirm_save_and_use_multilingual)&&o.find(".save-useit").trigger("click"),!0}function d(){if(p.is(":visible")&&p.find(".editMode").length){var a=p.find(".editMode");confirm(xe.msg_confirm_save_and_use_multilingual)?a.find(".save").trigger("click"):a.find(".cancel").trigger("click")}return!0}function e(){return p.find(".item > fieldset").hide().prev("a").children("i").removeClass("x_icon-chevrom-up").addClass("x_icon-chevron-down"),n.find('[href="#lang_create"]').trigger("click"),o.find(".editMode").children("textarea").val(""),q=!1,!0}function f(a){a?(i(1,xe.current_lang,"",a,!1),n.find('[href="#lang_search"]').trigger("click",!0)):i(1,xe.current_lang,"","",!1)}function g(){return c()&&d()&&e()?void 0:!1}function h(a,b){var c=n.data("lang-target");q=!1,c&&c.trigger("selected.g11n",[a,b])}function i(c,d,e,f,g){"undefined"==typeof c&&(c=1),"undefined"==typeof d&&(d=xe.current_lang),"undefined"==typeof e&&(e=""),"undefined"==typeof f&&(f=""),"undefined"==typeof g&&(g=!0),a.exec_json("module.getModuleAdminLangListHtml",{page:c,lang_code:d,search_keyword:e,name:f,list_count:b.list_count,mid:current_url.getQuery("mid")},function(b){b&&b.html&&(p.html(b.html),j(),k(),l(),m(),g&&(document.location.href="#lang_search"),f&&a("#lang_search").find('[href^="#lang-"]').trigger("click"))})}function j(){p.find(".x_pagination a").click(function(){var b=a(this).data("page"),c=a(this).data("search_keyword"),d=a(this).data("current_lang");return b?(i(b,d,c),!1):void 0}),p.find(".x_pagination").submit(function(){var b=a(this).find('[name="page"]').val(),c=a(this).data("search_keyword"),d=a(this).data("current_lang");return b?(i(b,d,c),!1):!1})}function k(){p.find(".search").submit(function(){var b=a(this).find('[name="search_keyword"]').val(),c=a(this).find('[name="lang_code"]').val();return i(1,c,b),!1}),p.find("#search_cancel").click(function(){i(1,xe.current_lang,"")})}function l(){p.find(".set").append('').click(function(){function b(b){var d=c.next("fieldset").find("textarea");d.each(function(){var c=a(this),d=b.langs[c.data("lang")],e=/^\$user_lang->/;e.test(d)?c.val("").data("value",""):c.val(d).data("value",d)}),c.data("is_loaded",!0)}var c=a(this),e=c.data("lang_code");d();var f="x_icon-chevron-up",g="x_icon-chevron-down";c.next("fieldset").is(":visible")?c.children("i").removeClass(f).addClass(g):(c.parent(".item").siblings(".item").find("a > i").removeClass(f).addClass(g).end().children("fieldset").hide(),c.children("i").removeClass(g).addClass(f)),"undefined"==typeof c.data("is_loaded")&&a.exec_json("module.getModuleAdminLangCode",{name:e,mid:current_url.getQuery("mid")},b)})}function m(){b.view_use||p.find(".useit").hide(),b.view_modify||p.find(".modify").hide(),b.view_delete||p.find(".delete").hide(),"save"==b.modify_type&&p.find(".save").text(xe.cmd_save),p.find(".modify").click(function(){a(this).closest("fieldset").addClass("editMode").find("textarea").removeAttr("disabled"),a(this).siblings(".cancel").prependTo(a(this).parent()),a(this).siblings(".delete").attr("disabled","disabled")}),p.find(".cancel").click(function(){return a(this).closest("fieldset").removeClass("editMode").find("textarea").attr("disabled","disabled").each(function(){var b=a(this);b.val(b.data("value"))}),a(this).siblings(".modify").prependTo(a(this).parent()),a(this).siblings(".delete").removeAttr("disabled"),!1}),p.find(".delete").click(function(){if(confirm(xe.confirm_delete)){var b=a(this);lang_name=b.closest(".item").find('[href^="#lang-"]').data("lang_code"),a.exec_json("module.procModuleAdminDeleteLang",{name:lang_name,mid:current_url.getQuery("mid")},function(a){if(a){if(a.error)return void alert(a.message);var b=p.find(".x_pagination"),c=b.data("page"),d=b.data("search_keyword"),e=b.data("lang_code");c||($page=1),i(c,e,d)}})}}),p.find(".item").submit(function(){var b=a(this),c=b.find(".editMode").children("textarea"),d=b.find('[href^="#lang-"]'),e={},f=null;return c.each(function(){var b=a(this);e[b.attr("class")]=b.val(),b.data("tmp_value",b.val()),xe.current_lang==b.attr("class")&&(f=b.val())}),e.lang_name=d.data("lang_code"),e.mid=current_url.getQuery("mid"),a.exec_json("module.procModuleAdminInsertLang",e,function(e){e&&!e.error&&e.name&&(c.each(function(){var b=a(this);b.data("value",b.data("tmp_value"))}),d.children("span").html(f),p.find(".cancel").trigger("click"),b.find(".useit").trigger("click"))}),!1}),p.find(".useit").click(function(){var b=a(this),c=b.closest(".item").find('[href^="#lang-"]'),d=c.data("lang_code"),e=c.children("span").text();h(d,e)})}var n=a(this),o=n.find("#lang_create"),p=n.find("#lang_search"),q=!1;return b=a.extend({create_type:"save_and_use",modify_type:"save_and_use",view_use:!0,view_modify:!0,view_delete:!1,list_count:5},b||{}),"save_and_use"!=b.create_type&&o.find(".save-useit").text(xe.cmd_save),n.find(".x_tabbable").xeTabbable(),o.find(".editMode textarea").change(function(){q=!0}),o.submit(function(){function c(a){a&&!a.error&&a.name&&("save_and_use"==b.create_type?h(a.name,g):(alert(a.message),e()))}var d=a(this),f={},g=null;return d.find(".editMode").children("textarea").each(function(){var b=a(this);f[b.attr("class")]=b.val(),xe.current_lang==b.attr("class")&&(g=b.val())}),g?(f.mid=current_url.getQuery("mid"),a.exec_json("module.procModuleAdminInsertLang",f,c),!1):(alert(xe.msg_empty_multilingual),!1)}),n.find('[href="#lang_search"]').click(function(a,b){"undefined"==typeof b&&i()}),n.bind("reset.g11n",function(){e()}),n.bind("before-open.g11n",function(a,b){f(b)}),n.bind("before-close.g11n",function(){return g()}),this}});var is_loaded_multilingual_window_html=!1;jQuery(function(a){a.fn.xeLoadMultilingualWindowHtml=function(){function b(b){var c=a("#content");a(b.html).appendTo(c).xeMultilingualWindow(),a(".lang_code").trigger("loaded-multilingualWindow")}return a.exec_json("module.getModuleAdminMultilingualHtml",{mid:current_url.getQuery("mid")},b),this}});var multilingual_id_count=0;jQuery(function(a){a.fn.xeApplyMultilingualUI=function(){return a(this).each(function(){function b(){function b(){g.val(l.val()).width(g.data("width")).removeAttr("disabled").data("active",!1),g.parent(".g11n").removeClass("active")}function f(){function c(a){if(a&&a.langs){var b=g.width();g.closest(".g11n").addClass("active"),g.val(a.langs[xe.current_lang]).attr("disabled","disabled").width(b-44).data("active",!0)}}b();var d=/^\$user_lang->/;d.test(g.val())&&a.exec_json("module.getModuleAdminLangCode",{name:g.val().replace("$user_lang->",""),mid:current_url.getQuery("mid")},c)}var g,h=a("#g11n"),i=c.width();g="TEXTAREA"==d.tagName||"textarea"==c.data("type")?a(' + @@ -54,4 +55,20 @@ - \ No newline at end of file + + \ No newline at end of file diff --git a/modules/document/tpl/declared_list.html b/modules/document/tpl/declared_list.html index b9e94aeb6..0019b45f5 100644 --- a/modules/document/tpl/declared_list.html +++ b/modules/document/tpl/declared_list.html @@ -200,4 +200,6 @@ jQuery(function($){ } }); }); - \ No newline at end of file + + +
    diff --git a/modules/document/tpl/document_list.html b/modules/document/tpl/document_list.html index d9eca400e..ea13dc025 100644 --- a/modules/document/tpl/document_list.html +++ b/modules/document/tpl/document_list.html @@ -216,3 +216,5 @@ jQuery(function($){ }); }); + +
    diff --git a/modules/editor/components/emoticon/emoticon.class.php b/modules/editor/components/emoticon/emoticon.class.php index efbd1588a..e9392bab0 100644 --- a/modules/editor/components/emoticon/emoticon.class.php +++ b/modules/editor/components/emoticon/emoticon.class.php @@ -15,7 +15,7 @@ class emoticon extends EditorHandler /** * @brief editor_sequence and components out of the path */ - function emoticon($editor_sequence, $component_path) + function __construct($editor_sequence, $component_path) { $this->editor_sequence = $editor_sequence; $this->component_path = $component_path; diff --git a/modules/editor/components/emoticon/tpl/popup.html b/modules/editor/components/emoticon/tpl/popup.html index 3fe5aa7c7..e408bf16b 100644 --- a/modules/editor/components/emoticon/tpl/popup.html +++ b/modules/editor/components/emoticon/tpl/popup.html @@ -11,5 +11,5 @@ -
    +
    diff --git a/modules/editor/components/emoticon/tpl/popup.js b/modules/editor/components/emoticon/tpl/popup.js index 31417ff57..a44f31450 100644 --- a/modules/editor/components/emoticon/tpl/popup.js +++ b/modules/editor/components/emoticon/tpl/popup.js @@ -22,7 +22,20 @@ function completeGetEmoticons(ret_obj) { for(var i=0;i'; } - jQuery('#emoticons').html(html.join('')).find('img.emoticon').click(insertEmoticon); + jQuery('#emoticons').html(html.join('')).find('img.emoticon') + .click(insertEmoticon) + .load(function(){ + /* resize popup window for new emoticons loaded, 2015-07-14 by misol */ + if(jQuery('section.section').outerHeight(true) != jQuery( window ).height()) + { + // more space for y-scroll + var ww = (jQuery('section.section').outerHeight(true) > jQuery( window ).height())? jQuery('section.section').outerWidth(true) + 60 : jQuery('section.section').outerWidth(true) + 30; + // not more than screen height + var wh = (screen.height-100 < jQuery('section.section').outerHeight(true)+100)? screen.height-100 : jQuery('section.section').outerHeight(true)+100; + + window.resizeTo(ww, wh); + } + }); } /** diff --git a/modules/editor/components/emoticon/tpl/popup.min.js b/modules/editor/components/emoticon/tpl/popup.min.js new file mode 100644 index 000000000..11e57942b --- /dev/null +++ b/modules/editor/components/emoticon/tpl/popup.min.js @@ -0,0 +1 @@ +jQuery(function(e){function o(e){var o={component:"emoticon",emoticon:e,method:"getEmoticonList"},t="error message emoticons".split(" ");exec_xml("editor","procEditorCall",o,i,t)}function i(e){for(var o=e.emoticons.split("\n"),i=[],n=0;n';jQuery("#emoticons").html(i.join("")).find("img.emoticon").click(t).load(function(){if(jQuery("section.section").outerHeight(!0)!=jQuery(window).height()){var e=jQuery("section.section").outerHeight(!0)>jQuery(window).height()?jQuery("section.section").outerWidth(!0)+60:jQuery("section.section").outerWidth(!0)+30,o=screen.height-100',o.editorFocus(o.editorPrevSrl),o.editorRelKeys[o.editorPrevSrl].pasteHTML(e),n&&window.focus(),!1}var n=window._isPoped;o("msn"),e("#selectEmoticonList").change(function(){o(this.value)})}); \ No newline at end of file diff --git a/modules/editor/components/image_gallery/image_gallery.class.php b/modules/editor/components/image_gallery/image_gallery.class.php index 6fbea0f76..7f52bc43f 100644 --- a/modules/editor/components/image_gallery/image_gallery.class.php +++ b/modules/editor/components/image_gallery/image_gallery.class.php @@ -14,7 +14,7 @@ class image_gallery extends EditorHandler /** * @brief editor_sequence and components out of the path */ - function image_gallery($editor_sequence, $component_path) + function __construct($editor_sequence, $component_path) { $this->editor_sequence = $editor_sequence; $this->component_path = $component_path; @@ -43,18 +43,24 @@ class image_gallery extends EditorHandler */ function transHTML($xml_obj) { - $gallery_info = new stdClass; - $gallery_info->srl = rand(111111,999999); - $gallery_info->border_thickness = $xml_obj->attrs->border_thickness; + $gallery_info = new stdClass(); + $gallery_info->srl = rand(111111, 999999); + $gallery_info->border_thickness = (int)$xml_obj->attrs->border_thickness; $gallery_info->gallery_style = $xml_obj->attrs->gallery_style; $color_preg = "/^([a-fA-F0-9]{6})/"; $gallery_info->border_color = preg_replace($color_preg,"#$1",$xml_obj->attrs->border_color); $gallery_info->bg_color = preg_replace($color_preg,"#$1",$xml_obj->attrs->bg_color); $gallery_info->gallery_align = $xml_obj->attrs->gallery_align; + if(!in_array($gallery_info->gallery_align, array('left', 'center', 'right'))) { + $gallery_info->gallery_align = 'center'; + } + $images_list = $xml_obj->attrs->images_list; - $images_list = preg_replace('/\.(gif|jpg|jpeg|png) /i',".\\1\n",$images_list); - $gallery_info->images_list = explode("\n",trim($images_list)); + $images_list = preg_replace('/\.(gif|jpe?g|png) /i', ".\\1\n", $images_list); + $images_list = explode("\n", trim($images_list)); + $gallery_info->images_list = preg_grep("/^[a-z0-9\/]+\.(gif|jpe?g|png)+$/", $images_list); + // If you set the output to output the XML code generated a list of the image if(Context::getResponseMethod() == 'XMLRPC') { diff --git a/modules/editor/components/image_gallery/tpl/popup.min.css b/modules/editor/components/image_gallery/tpl/popup.min.css index 4fe084254..a5a6d0962 100644 --- a/modules/editor/components/image_gallery/tpl/popup.min.css +++ b/modules/editor/components/image_gallery/tpl/popup.min.css @@ -1 +1 @@ -@charset "utf-8";body,html{min-height:100%}body{-webkit-text-size-adjust:none}body>.x:first-child{min-width:300px;max-width:1240px;margin:0 auto}.x button,.x input,.x label,.x select,.x table,.x textarea,body>.x{font-size:13px}.x strong,.x th{font-weight:600}.x dfn,.x em{font-style:normal}.x [disabled]{cursor:not-allowed}.x [hidden]{display:none}.x a[target="_blank"]:after{content:"";display:inline-block;width:14px;height:14px;vertical-align:middle;margin:-2px 0 0 2px;background-position:-120px -72px;opacity:.3;filter:alpha(opacity=30)}.x a[target="_blank"]:focus:after,.x a[target="_blank"]:hover:after{opacity:.7;filter:alpha(opacity=70)}.x mark{background-color:#FF0;color:#000}.x .x_page-header{margin-top:10px;padding-bottom:0;border-bottom:2px solid #ddd}.x .x_page-header>h1{position:relative;margin-bottom:0;font-size:24px;color:#333}.x .x_page-header>h1>.x_icon-question-sign{margin:0}.x .x_page-header>h1>.path+.x_icon-question-sign{margin:4px 0 0}.x .x_icon-question-sign{vertical-align:middle}.x h1,.x h2,.x h3,.x h4,.x h5,.x h6{line-height:1.5;font-weight:600;color:#666;text-rendering:auto}.x h1{font-size:22px}.x h2{font-size:18px}.x h3{font-size:14px}.x h4,.x h5,.x h6{font-size:12px}.x [class*=" x_icon-"],.x [class^=x_icon-]{text-decoration:none;border:0;padding:0 0 0 14px;width:0;background-color:transparent;overflow:hidden;font-size:0}.x .x_close{width:32px;height:32px;font-size:17px;opacity:.5;filter:alpha(opacity=50)}.x .x_alert{position:relative}.x .x_alert>.x_close{position:absolute;top:0;right:0}.x .x_pagination{height:26px;margin:10px 0 0}.x .x_pagination ul>li>a,.x .x_pagination ul>li>span,.x .x_pagination ul>li>strong{line-height:24px;padding:0 8px}.x .x_pagination ul>.x_active>a,.x .x_pagination ul>.x_active>span,.x .x_pagination ul>.x_active>strong{line-height:26px;border:0;background-color:#333!important;color:#fff;font-weight:700;font-size:18px;font-family:Arial,Helvetica,sans-serif;border-radius:2px}.x .x_pagination [id^=goTo]{display:none;margin:0;padding:0}.x .x_pagination [id^=goTo]>*{border:0;border-radius:0}.x .x_pagination [id^=goTo]>[type=number]{height:16px;line-height:16px;width:50px;text-align:center}.x .x_pagination [id^=goTo]>[type=submit]{line-height:24px;height:24px;padding:0 6px}.x .btn{color:#333}.x .x_btn{border-radius:2px;overflow:visible;font-size:14px;line-height:18px;padding:3px 9px;text-decoration:none!important}.x .x_btn-large{font-size:16px;padding:9px 14px;font-weight:700}.x .x_btn-small{font-size:14px}.x .x_btn-mini{font-size:11px;padding:1px 6px;line-height:17px}.x .x_btn-link{padding:0;margin:0;overflow:visible;font-size:13px;border:0}.x .x_btn-group{zoom:1}.x .x_btn-group:after{content:"";display:block;clear:both}.x .x_btn-group>.x_btn{border-radius:0}.x .x_btn-group>.x_btn:last-child,.x .x_btn-group>.x_dropdown-toggle{border-top-right-radius:2px;border-bottom-right-radius:2px}.x .x_btn-group>.x_btn:first-child{border-bottom-left-radius:2px;border-top-left-radius:2px}.x .x_btn-group>.x_btn-inverse+.x_btn-inverse{border-left-color:#555}.x input[type=checkbox],.x input[type=radio]{margin:0}.x input[type=file]{height:auto}.x td input,.x td select,.x td textarea{margin-bottom:0}.x [class*=x_icon-]{opacity:.5;filter:alpha(opacity=50)}.x :focus>[class*=x_icon-],.x :hover>[class*=x_icon-],.x [class*=x_icon-]:focus,.x [class*=x_icon-]:hover{opacity:1;filter:alpha(opacity=100)}.x .x_nav-tabs>li>a{padding-top:6px;padding-bottom:6px;text-decoration:none!important}.x .x_nav-tabs>li.x_active>a{font-weight:700}.x .x_table{margin:10px 0;border-top:2px solid #ddd;border-bottom:1px solid #ddd}.x h1+.x_table{border-top:0;margin-top:-10px}.x .x_table>caption{text-align:left;padding:0 0 10px;line-height:26px}.x .x_table>caption>a,.x .x_table>caption>i,.x .x_table>caption>strong{position:relative;top:7px}.x .x_table thead th{vertical-align:top}.x .x_table input{margin:0}.x .x_inline{display:inline-block;*display:inline;*zoom:1}.x .x_page-header+.x_form-horizontal{margin-top:-20px}.x .x_controls:after{content:"";display:block;clear:both}.x .x_form-horizontal .x_control-label,.x input:checked+label,.x label.checked{font-weight:700;word-break:keep-all}.x .x_form-horizontal .x_control-label{width:180px}.x .x_form-horizontal .x_controls{margin-left:200px;*margin-left:0}.x .x_form-horizontal .x_controls label{padding:5px 0;margin-bottom:0}.x input[type=checkbox]+label,.x input[type=radio]+label{font-weight:400}.x label.x_inline{margin-right:16px}.x .x_input-append>*{vertical-align:top}.x .x_input-append a.x_add-on,.x .x_input-prepend a.x_add-on{height:16px;line-height:16px}.x .x_input-append button.x_add-on,.x .x_input-prepend button.x_add-on{height:24px;line-height:16px}.x .x_modal-header{padding:10px 15px;border-bottom:1px solid #aaa;background-color:#333;border-radius:5px 5px 0 0;background-image:-webkit-linear-gradient(top,#666,#333 50%,#000 50%,#333 100%);background-image:-moz-linear-gradient(top,#666,#333 50%,#000 50%,#333 100%);background-image:-o-linear-gradient(top,#666,#333 50%,#000 50%,#333 100%);background-image:linear-gradient(top,#666,#333 50%,#000 50%,#333 100%)}.x .x_modal-header>h1,.x .x_modal-header>h2,.x .x_modal-header>h3{font-size:16px;line-height:30px;margin:0;color:#fff;text-shadow:0 -1px 0 #000}.x .x_modal-body{overflow-y:visible;max-height:none}.x_modal,.x_modal-backdrop{display:none}.x_modal{top:30px}.x_modal-backdrop{opacity:.6;filter:alpha(opacity=60)}.x_modal{padding:0;width:90%;margin:0 0 0 -45%;max-width:none;border-radius:6px}.x_modal>form{margin:0!important}.x_modal>.x_close{position:absolute;top:8px;right:10px;font-size:21px;color:#fff}.x_modal .x_modal-body{background:#fff;min-height:50px;overflow-y:auto;max-height:400px}.x_modal-body:after{content:"";display:block;clear:both}.x .x_control-group{padding-top:8px;border-top:1px dotted #ddd;clear:both}.x .x_control-group:before{content:"";display:block;clear:both}.x .x_control-group:first-child,.x .x_control-group:first-of-type{border-top:0;padding-top:0}.x .x_control-group select{width:auto;min-width:220px}.x .x_form-horizontal .x_control-group{margin-bottom:10px}.x input[type=color],.x input[type=date],.x input[type=datetime-local],.x input[type=datetime],.x input[type=email],.x input[type=month],.x input[type=number],.x input[type=password],.x input[type=search],.x input[type=tel],.x input[type=text],.x input[type=time],.x input[type=url],.x input[type=week]{height:16px;line-height:16px}.x input[type=number]{width:50px}.x select{padding:0;height:26px;line-height:26px}.x select[multiple]{height:auto}.x textarea{vertical-align:top}.x .x_tab-content{overflow:visible}.x .x_well>:first-child{margin-top:0}.x .x_well>:last-child{margin-bottom:0}.x legend{font-size:14px;font-weight:700;line-height:24px}.x label{font-weight:inherit}.x label:only-child,.x p:last-child,.x td p{margin-bottom:0}.x form{margin:0 0 10px}.x form .x_btn[type=submit]:only-child{min-width:120px}.x .x_help-inline{display:inline}.x .x_btn.x_disabled,.x .x_btn[disabled]{opacity:.5;filter:alpha(opacity=50);cursor:not-allowed}@media all and (max-width:980px){.x .x_form-horizontal .x_control-label{float:none;width:auto;text-align:left}.x .x_form-horizontal .x_controls{margin-left:0}}.x .section{margin:20px 0 40px}.x .section>h1{position:relative;border-bottom:1px solid #ddd;cursor:pointer}.x .section>h1>.snToggle{position:absolute;bottom:0;right:0;width:32px;height:32px;opacity:.5;filter:alpha(opacity=50)}.x .section>h1>.snToggle.x_icon-chevron-up{background-position:-279px -112px}.x .section>h1>.snToggle.x_icon-chevron-down{background-position:-303px -111px}.x .section>h2{position:relative;border-bottom:1px dotted #ddd}.x .section>h2+.x_control-group{border-top:0}.x .section.collapsed>*{display:none}.x .section.collapsed>h1{display:block}.x .center{text-align:center}.x .search{margin:10px 0 0}.x .search select{width:auto}.x .search>input[type=search]{height:16px;line-height:16px;width:120px}.x .vr{color:#ccc;font-style:normal}.x .nowr{white-space:nowrap}.x .btnArea{padding:10px 0;margin:10px 0;border-top:1px solid #ccc;text-align:right;zoom:1;clear:both}.x .btnArea:after{content:"";display:block;clear:both}.x a.active,.x li.active>a{color:#000;font-weight:700;text-decoration:none}.x .module_search+[readonly]{vertical-align:top;border-top-right-radius:0;border-bottom-right-radius:0}.x .module_search+[readonly]+a.x_btn{vertical-align:top;border-top-left-radius:0;border-bottom-left-radius:0;margin-left:-5px}.x .fileBtn{position:relative;display:inline-block;overflow:hidden}.x .fileBtn>input[type=file]{position:absolute;top:0;right:0;margin:0;padding:0;border:0;outline:0;cursor:pointer;opacity:0;filter:alpha(opacity=0);-webkit-transform:scale(4);-webkit-transform-origin:100% 0;-moz-transform:scale(4);-moz-transform-origin:100% 0;-o-transform:scale(4);-o-transform-origin:100% 0;transform:scale(4);transform-origin:100% 0}.x td>form,.x td>p:last-of-type,.x td>p:only-of-type{margin:0}.x [data-display=none]{display:none}.x .x_page-header .path{font-size:14px;display:inline-block}.x .x_page-header .path:first-letter{color:#ccc;font-weight:400}.x [data-toggle]+.x_help-block{margin-top:10px}.x input.switch{width:42px;height:16px;opacity:0;filter:alpha(opacity=0);position:relative;z-index:2}.x input.switch+i{position:relative!important;z-index:1;left:auto!important;top:auto!important;right:auto!important;bottom:auto!important;margin:0 0 0 -42px!important;opacity:1!important;filter:alpha(opacity=100)!important;padding:0;vertical-align:middle;display:inline-block;width:42px;height:16px;background-image:url(../../../../admin/tpl/img/toggleSwitch.png)!important;background-repeat:no-repeat}.x input[checked].switch+i{background-position:0 -16px!important}.x_modal._common{width:600px;margin-left:-300px}.x_modal._common._small{width:400px;margin-left:-200px}@media all and (max-width:650px){.x_modal._common{width:90%;margin-left:-45%}}@media all and (max-width:450px){.x_modal._common._small{width:90%;margin-left:-45%}}.x_modal._common._nobody .x_modal-body,.x_modal._common._type_alert ._cancel,.x_modal._common._type_alert .x_modal-header{display:none}.x_modal._common._type_alert .x_modal-body{border-radius:6px 6px 0 0}.x_modal._common._nobody .x_modal-footer{border-top:0}.x_modal-body.showTree .moveList{float:left;width:60%}.x_modal-body.showTree .moveTree{display:block!important;float:right;width:38%}.x_modal-body.showTree .moveTree>h1{font-size:13px;color:#333;border-bottom:2px solid #ddd;padding:10px 0 7px}@media all and (max-width:960px){.x_modal-body.showTree .moveList,.x_modal-body.showTree .moveTree{float:none;width:auto}}.x .dashboard>div>section>h2:before,.x a[target="_blank"]:after,.x>.body>.gnb>ul>li>a>i{background-image:url(../../../../admin/tpl/img/glyphicons-halflings.png);background-repeat:no-repeat}.x>.body>.gnb>ul>li.active>a>i,.x>.body>.gnb>ul>li.open>a>i,.x_modal-body .tree .jstree-clicked>i,.x_modal-body .tree .jstree-hovered>i{background-image:url(../../../../admin/tpl/img/glyphicons-halflings-white.png);background-repeat:no-repeat}@media all and (max-width:800px){.x>.body>.gnb>ul>li:first-child>a>i{background-image:url(../../../../admin/tpl/img/glyphicons-halflings-white.png);background-repeat:no-repeat}}.x>.skipNav{margin:0}.x>.skipNav>a{display:block;height:1px;text-align:center;border-radius:4px;overflow:hidden;color:#333;text-decoration:none}.x>.skipNav>a:focus{height:auto;margin:5px 0;padding:8px 0;background:#fff}.x>.header{position:relative;z-index:2;padding:10px 15px;border-bottom:1px solid #ddd;background-color:#fff;zoom:1}.x>.header:after{content:"";display:block;clear:both}.x>.header:before{content:"";position:absolute;bottom:0;left:1px;right:1px;height:1px;box-shadow:0 2px 3px #ddd}.x>.body{position:relative;zoom:1;padding:0 0 50px 215px;z-index:1}.x>.body.wide{padding-left:70px}.x>.body:after{content:"";display:block;clear:both}.x>.body>.content{width:100%;padding:1px 0 0;float:right;margin:0 0 0 -100%;outline:0}.x>.body>.content>:first-child{margin-top:0}.x>.body>.gnb{width:180px;position:relative;margin:15px 0 0 -215px;float:left;display:inline}.x>.body.wide>.gnb{width:38px;margin-left:-70px}@media all and (max-width:800px){.x>.header{border-bottom:0}.x>.header:before{content:normal}.x>.body,.x>.body.wide{padding:0}.x>.body>.content{width:auto;padding:1px 10px 0;float:none;margin:0 0 30px}.x>.body>.gnb{float:none;display:block;width:auto;margin:0!important;border-radius:0;position:relative;top:auto;left:auto}.x>.body.wide>.gnb{width:auto}}.x>.header>h1{display:inline-block;*display:inline;zoom:1;margin:0 15px 0 0;white-space:nowrap}.x>.header>h1>a{text-decoration:none;color:#333;font-size:24px;line-height:40px;font-family:Arial,Helvetica,sans-serif}.x>.header>h1>a>img{vertical-align:middle}.x>.header>.site{display:inline-block;*display:inline;zoom:1;margin:14px 0 0;font-size:11px}.x>.header>.site>a{text-decoration:none;color:#666;font-family:Tahoma,Geneva,sans-serif}.x>.header>.site>a:focus,.x>.header>.site>a:hover{text-decoration:underline}.x>.header>.account{float:right;position:relative;margin:13px 0 0}.x>.header>.account>ul{list-style:none;margin:0;padding:0}.x>.header>.account>ul>li{display:inline}.x>.header>.account>ul>li:before{content:"| ";color:#ddd}.x>.header>.account>ul>li:first-child:before{content:normal}.x>.header>.account>ul>li>a{text-decoration:none;color:#666}.x>.header>.account>ul>li>a:focus,.x>.header>.account>ul>li>a:hover{text-decoration:underline}.x>.header>.account .lang+#lang{position:absolute;top:20px;left:auto;right:0;min-width:0}.x>.header>.account .lang+#lang a:focus,.x>.header>.account .lang+#lang a:hover{background:0 0;color:#333}.x>.header>.account .lang+#lang .x_active>a{color:#fff;background:#0081c2 -webkit-linear-gradient(top,#08c,#0077b3);background:#0081c2 -moz-linear-gradient(top,#08c,#0077b3);background:#0081c2 -o-linear-gradient(top,#08c,#0077b3)}@media all and (max-width:480px){.x>.header>.site{margin-top:0}}@media all and (max-width:800px){.x>.header>.account{margin-top:0}}.x>.footer{border-top:1px solid #ddd;padding:10px 15px;zoom:1}.x>.footer:after{content:"";display:block;clear:both}.x>.footer>p{margin:0}.x>.footer>.power{float:left;color:#666}.x>.footer>.cache{float:right}.x>.footer>.cache>*{color:#666}.x>.footer .vr{color:#ccc!important}.x>.body>.gnb ul{margin:0;padding:0;list-style:none}.x>.body>.gnb>ul{position:relative;z-index:1;box-shadow:0 0 4px #ccc;border:2px solid #fff}.x>.body>.gnb a{text-decoration:none;text-shadow:0 1px 0 #fff;color:#000;display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x>.body>.gnb>a[href="#gnbNav"]{display:block;position:absolute;z-index:2;white-space:nowrap;font-size:0;top:50%;right:-14px;background:#eee;width:12px;height:50px;border-radius:0 3px 3px 0;margin:-25px 0 0 0;border:1px solid #ddd;border-left:0;overflow:hidden;text-indent:20px}.x>.body.wide>.gnb>a[href="#gnbNav"]>b{border-color:transparent;border-left-color:#666;margin:-4px 0 0 -2px}.x>.body>.gnb>a[href="#gnbNav"]>b{width:0;height:0;position:absolute;top:50%;left:50%;margin:-4px 0 0 -6px;border:4px solid;border-color:transparent;border-right-color:#666}.x>.body>.gnb>a>i{display:none}.x>.body>.gnb .exMenu{position:absolute;width:100%}.x>.body>.gnb .exMenu>button{width:100%;border:0;background:0 0;font-size:20px;line-height:25px}.x>.body>.gnb .exMenu>button>i{opacity:.5;filter:alpha(opacity=50);vertical-align:middle;text-indent:0}.x>.body>.gnb .exMenu>button:focus>i,.x>.body>.gnb .exMenu>button:hover>i{opacity:1;filter:alpha(opacity=100)}.x>.body>.gnb .exMenu .x_icon-chevron-up,.x>.body>.gnb>.ex .exMenu .x_icon-chevron-down{display:none}.x>.body>.gnb>.ex .exMenu .x_icon-chevron-up{display:inline-block}.x>.body>.gnb>ul>li[data-index="1"]{border-top-color:#eee}.x>.body>.gnb>ul>li[data-index="5"]{margin-bottom:25px}.x>.body>.gnb>ul>li[data-index="6"]{border-top-color:#eee}.x>.body>.gnb>ul>li[data-index="6"],.x>.body>.gnb>ul>li[data-index="7"]{display:none}.x>.body>.gnb>.ex>li[data-index="6"],.x>.body>.gnb>.ex>li[data-index="7"]{display:block}.x>.body>.gnb>ul>li[data-index].active_{display:none}@media all and (max-width:800px){.x>.body>.gnb>ul{border:0}.x>.body>.gnb>ul>li{display:none}.x>.body>.gnb.open>ul>li{display:block}.x>.body>.gnb.open>ul>li[data-index="6"],.x>.body>.gnb.open>ul>li[data-index="7"],.x>.body>.gnb>.ex>li[data-index="6"],.x>.body>.gnb>.ex>li[data-index="7"]{display:none}.x>.body>.gnb.open>.ex>li[data-index="6"],.x>.body>.gnb.open>.ex>li[data-index="7"]{display:block}.x>.body>.gnb>ul>li:first-child{display:block!important}.x>.body.wide>.gnb>a[href="#gnbNav"],.x>.body>.gnb>a[href="#gnbNav"]{top:0;right:0;line-height:37px;width:44px;height:auto;background:0 0;border-radius:0;margin:0;border:0}.x>.body>.gnb>a[href="#gnbNav"]{opacity:.5;filter:alpha(opacity=50%)}.x>.body>.gnb>a[href="#gnbNav"]:before{content:"";position:absolute;top:1px;left:0;width:1px;height:100%;border-left:1px solid #999}.x>.body>.gnb>a[href="#gnbNav"]>b{display:none}.x>.body>.gnb>a>i{display:block;position:absolute;top:50%;left:50%;margin:-7px 0 0 -7px}}.x>.body>.gnb>ul>li{background:#3886d0;border-top:1px solid #fff;border-bottom:1px solid #ddd;vertical-align:top;white-space:nowrap}.x>.body>.gnb>ul>li.active{background:#222}.x>.body>.gnb>ul>li.active,.x>.body>.gnb>ul>li.open{border-bottom:0;padding:0 0 1px}.x>.body>.gnb>ul>li>a{position:relative;padding:8px 5px 8px 10px;background:#f1f1f1;background:-webkit-linear-gradient(top,#F1F1F1,#E8E8E8);background:-moz-linear-gradient(top,#F1F1F1,#E8E8E8);background:-o-linear-gradient(top,#F1F1F1,#E8E8E8);background:-ms-linear-gradient(top,#F1F1F1,#E8E8E8);background:linear-gradient(top,#F1F1F1,#E8E8E8)}.x>.body>.gnb>ul>li>a>i{display:inline-block;width:14px;height:14px;margin:-4px 4px 0 0;vertical-align:middle;opacity:.75;filter:alpha(opacity=75)}.x>.body>.gnb>ul>li>a>b{position:absolute;width:0;height:0;top:50%;right:10px;margin:-2px 0 0 0;border:4px solid transparent;border-top-color:#999}.x>.body>.gnb>ul>li.open>a>b{border-top:0;border-bottom-color:#fff}.x>.body.wide>.gnb>ul>li>a>b{display:none}.x>.body>.gnb>ul>li[data-index="1"]>a>i{background-position:-384px -144px}.x>.body>.gnb>ul>li[data-index="2"]>a>i{background-position:0 -24px}.x>.body>.gnb>ul>li[data-index="3"]>a>i{background-position:-168px 0}.x>.body>.gnb>ul>li[data-index="4"]>a>i{background-position:-48px -48px}.x>.body>.gnb>ul>li>a[href="#favorite"]>i{background-position:-120px 0}.x>.body>.gnb>ul>li[data-index="6"]>a>i{background-position:-360px -144px}.x>.body>.gnb>ul>li[data-index="7"]>a>i{background-position:-432px 0}.x>.body>.gnb>ul>li>a:focus,.x>.body>.gnb>ul>li>a:hover{background:#f6f6f6;background:-webkit-linear-gradient(top,#f6f6f6,#F1F1F1);background:-moz-linear-gradient(top,#f6f6f6,#F1F1F1);background:-o-linear-gradient(top,#f6f6f6,#F1F1F1);background:-ms-linear-gradient(top,#f6f6f6,#F1F1F1);background:linear-gradient(top,#f6f6f6,#F1F1F1)}.x>.body>.gnb>ul>li.open>a{font-weight:700;color:#fff;text-shadow:0 -1px 0 #333;background:#3886d0;background:-webkit-linear-gradient(top,#6ebcea,#3886d0);background:-moz-linear-gradient(top,#6ebcea,#3886d0);background:-o-linear-gradient(top,#6ebcea,#3886d0);background:-ms-linear-gradient(top,#6ebcea,#3886d0);background:linear-gradient(top,#6ebcea,#3886d0)}.x>.body>.gnb>ul>li.active>a{font-weight:700;color:#fff;text-shadow:none;background:#222;background:-webkit-linear-gradient(top,from(#555),to(#222));background:-moz-linear-gradient(top,#555,#222);background:-o-linear-gradient(top,#555,#222)}@media all and (max-width:800px){.x>.body>.gnb>ul>li:first-child>a{font-weight:700;color:#fff;text-shadow:none;border-radius:3px;background-color:#222;background-image:-webkit-linear-gradient(top,#555,#222);background-image:-moz-linear-gradient(top,#555,#222);background-image:-o-linear-gradient(top,#555,#222);background-image:linear-gradient(top,#555,#222)}}.x>.body.wide>.gnb>ul>li>a>.tx{display:inline-block;width:1px;height:1px;overflow:hidden}.x>.body>.gnb>ul>li>ul{display:none;margin:0 10px 10px;border-radius:4px}.x>.body>.gnb>ul>li.active>ul{display:block!important}.x>.body.wide>.gnb>ul>li>ul{display:none!important}.x>.body>.gnb>ul>li>ul>li{border-top:1px solid #ddd;position:relative}.x>.body>.gnb>ul>li>ul>li:first-child{border:0}.x>.body>.gnb>ul>li>ul>li.active_{box-shadow:0 0 3px #999;z-index:99;border:1px solid #666;border-left:0;border-right:0}.x>.body>.gnb>ul>li>ul>li>a{padding:4px 5px 4px 15px;background:#e8e8e8;background:-webkit-linear-gradient(top,#f1f1f1,#e8e8e8);background:-moz-linear-gradient(top,#f1f1f1,#e8e8e8);background:-o-linear-gradient(top,#f1f1f1,#e8e8e8);background:-ms-linear-gradient(top,#f1f1f1,#e8e8e8);background:linear-gradient(top,#f1f1f1,#e8e8e8)}.x>.body>.gnb>ul>li>ul#favorite>li>a{padding:4px 25px 4px 15px}.x>.body>.gnb>ul>li>ul>li:first-child>a{border-radius:4px 4px 0 0}.x>.body>.gnb>ul>li>ul>li:last-child>a{border-radius:0 0 4px 4px}.x>.body>.gnb>ul>li>ul>li:only-child>a{border-radius:4px}.x>.body>.gnb>ul>li>ul>li.active_>a,.x>.body>.gnb>ul>li>ul>li>a:active,.x>.body>.gnb>ul>li>ul>li>a:hover{font-weight:700;background:-webkit-linear-gradient(top,#F6F6F6,#F1F1F1);background:-moz-linear-gradient(top,#F6F6F6,#F1F1F1);background:-o-linear-gradient(top,#F6F6F6,#F1F1F1);background:-ms-linear-gradient(top,#F6F6F6,#F1F1F1);background:linear-gradient(top,#F6F6F6,#F1F1F1)}.x>.body>.gnb>ul>li>ul>li.active_>a:after{content:"";position:absolute;top:8px;right:-12px;border:6px solid transparent;border-left-color:#f3f3f3;width:0;height:0;overflow:hidden}.x>.body>.gnb>ul>li>ul>li>.remove{position:absolute;top:4px;right:5px}.x>.body>.gnb>ul>li>ul>li>.remove>.x_close{width:20px;height:20px}@media all and (max-width:800px){.x>.body.wide>.gnb>ul>li>a>.tx{width:auto;height:auto}}.x .dashboard{zoom:1}.x .dashboard:after{content:"";display:block;clear:both}.x .dashboard>div{float:right;width:49%}.x .dashboard>div:first-child{float:left}.x .dashboard>div>section{position:relative;height:196px;border:1px solid #ddd;border-radius:4px;margin:0 0 25px;overflow:hidden}.x .dashboard>div>section>h2{font-size:14px;margin:0;padding:6px 15px;border-bottom:1px solid #ddd;background:#e8e8e8;background:-webkit-linear-gradient(top,#F1F1F1,#E8E8E8);background:-moz-linear-gradient(top,#F1F1F1,#E8E8E8);background:-o-linear-gradient(top,#F1F1F1,#E8E8E8);background:-ms-linear-gradient(top,#F1F1F1,#E8E8E8);background:linear-gradient(top,#F1F1F1,#E8E8E8);text-shadow:0 1px 0 #fff}.x .dashboard>div>section>h2:before{content:"";display:inline-block;width:14px;height:14px;margin:0 4px 0 0;vertical-align:middle;opacity:.5;filter:alpha(opacity=50)}.x .dashboard>div>.status>h2:before{background-position:-408px 0}.x .dashboard>div>.status dl{color:#767676;display:inline-block;*display:inline;zoom:1;margin:0 8px 0 0;padding:1px 8px 0;font:11px/1 돋움,Dotum,Arial,Helvetica,sans-serif;background:#fff;box-shadow:0 0 3px #999 inset;border-radius:3px;min-width:60px;text-align:center}.x .dashboard>div>.status dt{display:inline;font-weight:400}.x .dashboard>div>.status dd{display:inline;margin:0}.x .dashboard>div>.status dl a{color:#767676}.x .dashboard>div>.member>h2:before{background-position:-168px 0}.x .dashboard>div>.document>h2:before{background-position:-264px -48px}.x .dashboard>div>.reply>h2:before{background-position:-240px -120px}.x .dashboard>div>.trackback>h2:before{background-position:-216px -120px}.x .dashboard>div>section>.more{position:absolute;top:7px;right:15px;text-shadow:0 1px 0 #fff}.x .dashboard>div>section>.more i{font:12px Tahoma,Geneva,sans-serif}.x .dashboard>div>section>.more dl{color:#767676;display:inline-block;*display:inline;zoom:1;margin:0 8px 0 0;padding:1px 8px 0;font:11px/1 돋움,Dotum,Arial,Helvetica,sans-serif;background:#fff;box-shadow:0 0 3px #999 inset;border-radius:3px;min-width:60px;text-align:center}.x .dashboard>div>section>.more dt{display:inline;font-weight:400}.x .dashboard>div>section>.more dd{display:inline;margin:0}.x .dashboard>div>section>.more dl a{color:#767676}.x .dashboard>div>section ul{list-style:none;margin:10px;padding:0;overflow:hidden;zoom:1}.x .dashboard>div>section li{position:relative;height:28px;line-height:28px;padding:0 70px 0 5px;white-space:nowrap;overflow:hidden;zoom:1;vertical-align:top}.x .dashboard>div>section li.hover{background:#f4f4f4;border-radius:4px}.x .dashboard>div>section li>a{display:block;width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.x .dashboard>div>section li>.side{position:absolute;top:0;right:5px;line-height:28px;width:60px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:right;zoom:1}.x .dashboard>div>section li>.action{display:none;position:absolute;top:0;right:5px;margin:0;padding:0 0 0 40px;text-align:right;white-space:nowrap;line-height:28px;background:#f4f4f4}.x .dashboard>div>section li>.action>button{margin:0 0 0 4px;padding:0 0 0 15px;overflow:visible}@media all and (max-width:980px){.x .dashboard>div{float:none!important;width:auto}}.x .g11n>.x_add-on{font-size:0;position:relative;cursor:pointer;text-decoration:none;*color:#eee}.x .g11n>.x_add-on>i{position:absolute;top:50%;left:50%;margin:-7px 0 0 -7px;z-index:1;opacity:.25;filter:alpha(opacity=25)}.x .g11n>.x_add-on.remover{display:none;width:26px;height:26px}.x .g11n.active>[disabled]{padding-left:25px;background-position:4px 6px;background-repeat:no-repeat}.x .g11n.active>.x_add-on.remover{display:inline-block}.x .g11n>.x_add-on:hover>i{opacity:1;filter:alpha(opacity=100)}.x .g11n>textarea{border-top-right-radius:0;overflow-x:hidden}#g11n #lang_search .list{border-top:2px solid #ddd}#g11n #lang_search .item{border-bottom:1px solid #ddd;margin:0}#g11n #lang_search .item>a{display:block;padding:8px 0;position:relative}#g11n #lang_search .item>a>i{position:absolute;top:50%;margin:-7px 0 0 0;right:0;opacity:.5;filter:alpha(opacity=50)}#g11n #lang_search .item>fieldset{display:none;padding:0 0 15px}#g11n .item input[type=text],#g11n .item textarea{padding-left:25px;width:187px;background-repeat:no-repeat;background-position:4px 8px;overflow-x:hidden}#g11n .flag{padding-left:18px;background-repeat:no-repeat;background-position:0 50%}#g11n .flag.en,#g11n .item .en,html[lang=en] .x .g11n.active>[disabled]{background-image:url(../../../../admin/tpl/img/flag.en.gif)}#g11n .flag.ko,#g11n .item .ko,html[lang=ko] .x .g11n.active>[disabled]{background-image:url(../../../../admin/tpl/img/flag.ko.gif)}#g11n .flag.jp,#g11n .item .jp,html[lang=jp] .x .g11n.active>[disabled]{background-image:url(../../../../admin/tpl/img/flag.jp.gif)}#g11n .flag.zh-CN,#g11n .item .zh-CN,html[lang=zh] .x .g11n.active>[disabled]{background-image:url(../../../../admin/tpl/img/flag.cn.gif)}#g11n .flag.zh-TW,#g11n .item .zh-TW,html[lang=zh] .x .g11n.active>[disabled]{background-image:url(../../../../admin/tpl/img/flag.tw.gif)}#g11n .flag.fr,#g11n .item .fr,html[lang=fr] .x .g11n.active>[disabled]{background-image:url(../../../../admin/tpl/img/flag.fr.gif)}#g11n .flag.de,#g11n .item .de,html[lang=de] .x .g11n.active>[disabled]{background-image:url(../../../../admin/tpl/img/flag.de.gif)}#g11n .flag.ru,#g11n .item .ru,html[lang=ru] .x .g11n.active>[disabled]{background-image:url(../../../../admin/tpl/img/flag.ru.gif)}#g11n .flag.es,#g11n .item .es,html[lang=es] .x .g11n.active>[disabled]{background-image:url(../../../../admin/tpl/img/flag.es.gif)}#g11n .item .tr,#gg1n .flag.tr,html[lang=tr] .x .g11n.active>[disabled]{background-image:url(../../../../admin/tpl/img/flag.tr.gif)}#g11n .flag.vi,#g11n .item .vi,html[lang=vi] .x .g11n.active>[disabled]{background-image:url(../../../../admin/tpl/img/flag.vi.gif)}#g11n .flag.mn,#g11n .item .mn,html[lang=mn] .x .g11n.active>[disabled]{background-image:url(../../../../admin/tpl/img/flag.mn.gif)}#g11n #lang_search .cancel,#g11n #lang_search .editMode .modify,#g11n #lang_search .editMode .useit,#g11n #lang_search .save{display:none}#g11n #lang_search .editMode .cancel,#g11n #lang_search .editMode .save{display:inline-block}.x .moduleWindow{position:absolute;z-index:100;padding:15px 20px}.x .moduleWindow ul{margin-bottom:0}.x .moduleWindow .siteList{margin-right:14px}.x .moduleWindow .siteList>input[type=search]{width:100%;padding-top:6px;padding-bottom:6px;border-radius:3px 3px 0 0;margin-bottom:0}.x .moduleWindow .siteList>ul{margin:-1px -14px 0 0}.x .moduleWindow .siteList>ul>li{background:#fff}.x .moduleWindow .siteList>ul>li:first-child>a{border-top-left-radius:0;border-top-right-radius:0}.x .moduleWindow select{width:100%}.x .textList{border:1px solid #ddd!important;line-height:1.5em;height:125px;overflow:auto}.x .textList li{position:relative;border:0;padding:0 10px;height:25px;line-height:25px;white-space:nowrap;overflow:hidden}.x .textList li:nth-child(even){background:#eee}.x .textList li>button{position:absolute;right:8px;top:50%;margin:-7px 0 0 0}.x .uDrag .wrap{position:relative;padding-left:20px}.x .uDrag li>.wrap{margin:0 0 0 8px}.x .uDrag .dragActive{background:#FFD}.x .uDrag .dragActive td,.x .uDrag .dragActive th{background:none!important}.x .uDrag .dragBtn{position:absolute;width:8px;height:100%;padding:0;overflow:hidden;background:url(../../../../admin/tpl/img/bgDragable.gif);top:1px;left:0;text-indent:12px;border:0;cursor:n-resize;white-space:nowrap;font-size:0}.x #faviconPreview{position:relative;padding:80px 0 0 200px;background:url(../../../../admin/tpl/img/bgFavicon.gif) no-repeat}.x #faviconPreview img{position:absolute}.x #faviconPreview .fn1{top:30px;left:12px}.x #faviconPreview .fn2{top:55px;left:68px}.x #mobiconPreview{position:relative;padding:270px 0 0 200px;background:url(../../../../admin/tpl/img/bgMobileTop.png) no-repeat}.x #mobiconPreview img{position:absolute;top:20px;left:10px;width:32px;height:32px}.x #mobiconPreview span{position:absolute;width:32px;text-align:center;top:52px;left:10px;color:#fff;font-size:9px}.x .layer{position:absolute;display:none;font-weight:400}.tree{margin:3px 0 5px;min-width:200px;background-color:transparent!important}.tree ul{margin:0;padding:0;list-style:none}.tree li{padding:0;white-space:nowrap;position:relative;border-radius:3px;vertical-align:top}.tree li>ul{margin:0}.tree a{text-decoration:none}.tree>ul{padding:1px}.tree .jstree-rename-input{margin-left:-16px;z-index:2}.tree>ul>li{margin-top:30px;position:relative}.tree>ul>li:before{content:"";display:block;border-top:1px dotted #ccc;position:relative;top:-15px}.tree>ul>li:first-child{margin-top:0}.tree>ul>li:first-child:before{content:normal}.tree>ul>li>a{font-weight:700;text-shadow:0 1px 0 #fff;vertical-align:middle}.tree>ul>li>a.jstree-clicked,.tree>ul>li>a.jstree-hovered,.tree>ul>li>a:focus,.tree>ul>li>a:hover{text-shadow:none}.tree>ul>li>ul{margin:0 0 0 18px}.tree>ul>li>ul>li{margin-left:0}.tree li>a{border:0!important;padding:0 8px!important;margin:0 0 1px;border-radius:3px;position:relative;z-index:2;height:23px;line-height:23px;max-width:160px;overflow:hidden;text-overflow:ellipsis;-webkit-transition:.2s;-moz-transition:.2s;-o-transition:.2s;transition:.2s}.tree li>a>i{opacity:.5;filter:alpha(opacity=50)}.tree .jstree-clicked>i,.tree .jstree-hovered>i{opacity:1;filter:alpha(opacity=100)}.tree a>.jstree-icon{display:none}.tree .jstree-closed>.jstree-icon,.tree .jstree-open>.jstree-icon{background-color:#fff}.x .h2,.x .h3,.x .h4{position:relative;border-style:solid;border-top:0;border-right:0;zoom:1;padding-left:8px}.x .h1{background:#444;border-radius:4px;color:#fff;margin:0 0 1em;font-size:16px;padding:0 15px;line-height:36px}.x .h2{border-width:3px;font-size:20px;border-color:#888}.x .h3{border-width:2px;font-size:16px;border-color:#aaa}.x .h4{border-width:1px;font-size:12px;border-color:#ccc}.x .h1+.table table,.x .h1+ul,.x .h2+.table table,.x .h2+ul,.x .h3+.table table,.x .h3+ul,.x .h4+.table table,.x .h4+ul{border-top:0!important;margin-top:-1em!important}.x .table{margin:1em 0}.x .table table{width:100%;border:0;border-collapse:collapse;border-top:2px solid #ccc}.x .table caption{font-weight:700;text-align:left;line-height:22px;padding:5px 0}.x .table caption:after{content:"";display:block;clear:both}.x .table caption a{font-weight:400}.x .table caption em{float:right;margin-left:1em}.x .table caption strong{color:#e00}.x .table caption .side{float:right;font-weight:400;margin-left:1em}.x .table td,.x .table th{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd}.x .table th{background:#f8f8f8}.x .table thead th{border-bottom:1px solid #999}.x .table tfoot td{font-weight:700;background:#f8f8f8}.x .table.even tbody tr:nth-of-type(even){background-color:#fafafa}.x .table tbody tr:hover{background:#ffd!important}.x .table td>input[type=text]{margin:-1px 0!important;vertical-align:middle}.x .table img{vertical-align:middle}.x .table em{font-style:normal;font-weight:400;color:#e00}.x .form{margin:0 0 1em;padding:0}.x .form fieldset{margin:0 0 2em;padding:0;border:0}.x .form.search fieldset{border:1px solid #ccc;padding:5px 15px;border-radius:3px}.x .form em{font-style:normal;color:#e00}.x .form label{line-height:1;vertical-align:middle}.x .form input[type=checkbox]+label,.x .form input[type=radio]+label{margin-right:1em}.x .form input[type=checkbox]+label,.x .form input[type=file],.x .form input[type=radio]+label{cursor:pointer}.x .form ul{position:relative;margin:1em 0;padding:0;list-style:none;border-top:2px solid #ccc;border-bottom:1px solid #ccc;zoom:1}.x .form li{list-style:none;border:1px solid #ddd;border-left:0;border-right:0;margin:-1px 0;padding:8px 0;vertical-align:top;zoom:1}.x .form li:hover{background:#ffd}.x .form li:first-child{border-top:0}.x .form li>label:first-child{display:block;font-weight:700}.x .form li label em{font-weight:400}.x .form label.overlap{position:absolute;color:#aaa}.x .form input[type=file],.x .form input[type=password],.x .form input[type=text],.x .form select[size],.x .form textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:0 0}.x .form input[type=file],.x .form input[type=password],.x .form input[type=text]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .form input[type=checkbox],.x .form input[type=radio]{margin:0;padding:0;width:13px;height:13px;vertical-align:middle}.x .form input[type=checkbox][disabled=disabled],.x .form input[type=password][disabled=disabled],.x .form input[type=radio][disabled=disabled],.x .form input[type=text][disabled=disabled],.x .form select[disabled=disabled],.x .form textarea[disabled=disabled]{background:#ddd;text-shadow:1px 1px 0 #fff}.x .form textarea{padding:3px 4px;vertical-align:top;resize:both}.x .form em.desc,.x .form span.desc{line-height:22px;vertical-align:middle;margin:0 10px}.x .form p.desc{margin:.25em 0;line-height:1.4}.x .form .q{font-weight:700;margin:0 0 5px}.x .form .a{margin:0 0 5px}.x .form .tgForm{margin-right:1em}.x .cnb{margin:1em 0;position:relative;zoom:1}.x .cnb:after{content:"";display:block;clear:both}.x .cnb ul{list-style:none;margin:0;padding:0}.x .cnb li{display:inline}.x .cnb li:before{content:"| ";color:#ccc}.x .cnb li:first-child:before{content:""}.x .cnb .active,.x .cnb .active a{font-weight:700;color:#333;text-decoration:none}.x .cnb .side{float:right}.x .pagination{margin:1em 0;text-align:center;line-height:normal}.x .pagination *{vertical-align:middle}.x .pagination a,.x .pagination strong{position:relative;display:inline-block;padding:2px 4px;font-weight:700;text-decoration:none;line-height:normal;color:#333!important;vertical-align:middle}.x .pagination a:active,.x .pagination a:focus,.x .pagination a:hover{border:1px solid #ddd;margin:0 -1px}.x .pagination strong{color:#e00!important;font-size:20px}.x .pagination .direction{font-weight:400;white-space:nowrap}.x .pagination .direction:active,.x .pagination .direction:focus,.x .pagination .direction:hover{border:0;margin:0;text-decoration:underline}.x .pagination input{width:30px;text-align:center}.x .pagination button{overflow:visible}.x .prgrs{white-space:nowrap;line-height:normal;vertical-align:middle}.x .prgrs *{vertical-align:middle}.x .prgrs .pBar{position:relative;display:inline-block;background:#e9e9e9;margin:0 5px 0 0}.x .prgrs .pAction{display:inline-block;vertical-align:top;background:#99a6b6}.x .prgrs .pNum{width:100%;left:0;top:0;text-align:center;text-shadow:1px 1px 0 #fff}.x .prgrs.prgrsSmall{font-size:14px;line-height:14px}.x .prgrs.prgrsSmall .pAction,.x .prgrs.prgrsSmall .pBar,.x .prgrs.prgrsSmall .pNum{height:16px;line-height:16px;font-size:11px}.x .prgrs.prgrsMedium{font-size:24px;line-height:24px}.x .prgrs.prgrsMedium .pAction,.x .prgrs.prgrsMedium .pBar,.x .prgrs.prgrsMedium .pNum{height:22px;line-height:22px;font-size:12px}.x .prgrs.prgrsLarge{font-size:38px;line-height:38px}.x .prgrs.prgrsLarge .pAction,.x .prgrs.prgrsLarge .pBar,.x .prgrs.prgrsLarge .pNum{height:34px;line-height:34px;font-size:14px}.modal{_height:100%;min-height:100%}.modal .bg{position:absolute;background:#000;_background:0 0;width:100%;height:100%;opacity:.5;z-index:2;filter:alpha(opacity=50);zoom:1}.modal .fg{position:relative;width:80%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000}.modal .lined,.modal .table,.modal ol,.modal ul{margin-bottom:1em}.modal .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1}.modalClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:700;cursor:pointer;color:#999;border-radius:5px}.modalBlur{position:absolute;top:0;right:0;border:0;background:0 0;padding:0;width:1px;height:1px;overflow:hidden}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:active,a:hover{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button}button,input[type=button],input[type=checkbox],input[type=radio],input[type=reset],input[type=submit],label,select{cursor:pointer}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}textarea{overflow:auto}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:focus,a:hover{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,.1);box-shadow:0 1px 3px rgba(0,0,0,.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:after,.row:before{display:table;line-height:0;content:""}.row:after{clear:both}[class*=span]{float:left;min-height:1px;margin-left:20px}.container,.navbar-fixed-bottom .container,.navbar-fixed-top .container,.navbar-static-top .container,.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:after,.row-fluid:before{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*=span]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*=span]:first-child{margin-left:0}.row-fluid .controls-row [class*=span]+[class*=span]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}.row-fluid [class*=span].hide,[class*=span].hide{display:none}.row-fluid [class*=span].pull-right,[class*=span].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:after,.container:before{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:after,.container-fluid:before{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:700}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:focus,a.muted:hover{color:gray}.text-warning{color:#c09853}a.text-warning:focus,a.text-warning:hover{color:#a47e3c}.text-error{color:#b94a48}a.text-error:focus,a.text-error:hover{color:#953b39}.text-info{color:#3a87ad}a.text-info:focus,a.text-info:hover{color:#2d6987}.text-success{color:#468847}a.text-success:focus,a.text-success:hover{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:700;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:400;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small,h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ol,ul{padding:0;margin:0 0 10px 25px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}li{line-height:20px}ol.inline,ol.unstyled,ul.inline,ul.unstyled{margin-left:0;list-style:none}ol.inline>li,ul.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dd,dt{line-height:20px}dt{font-weight:700}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:after,.dl-horizontal:before{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}blockquote:after,blockquote:before,q:after,q:before{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}button,input,label,select,textarea{font-size:14px;font-weight:400;line-height:20px}button,input,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}.uneditable-input,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.uneditable-input,input,textarea{width:206px}textarea{height:auto}.uneditable-input,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],textarea{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}.uneditable-input:focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,textarea:focus{border-color:rgba(82,168,236,.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6)}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type=button],input[type=checkbox],input[type=file],input[type=image],input[type=radio],input[type=reset],input[type=submit]{width:auto}input[type=file],select{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus,select:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.025);box-shadow:inset 0 1px 2px rgba(0,0,0,.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.checkbox,.radio{min-height:20px;padding-left:20px}.checkbox input[type=checkbox],.radio input[type=radio]{float:left;margin-left:-20px}.controls>.checkbox:first-child,.controls>.radio:first-child{padding-top:5px}.checkbox.inline,.radio.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.checkbox.inline+.checkbox.inline,.radio.inline+.radio.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}.row-fluid .uneditable-input[class*=span],.row-fluid input[class*=span],.row-fluid select[class*=span],.row-fluid textarea[class*=span],.uneditable-input[class*=span],input[class*=span],select[class*=span],textarea[class*=span]{float:none;margin-left:0}.input-append .uneditable-input[class*=span],.input-append input[class*=span],.input-prepend .uneditable-input[class*=span],.input-prepend input[class*=span],.row-fluid .input-append [class*=span],.row-fluid .input-prepend [class*=span],.row-fluid .uneditable-input[class*=span],.row-fluid input[class*=span],.row-fluid select[class*=span],.row-fluid textarea[class*=span]{display:inline-block}.uneditable-input,input,textarea{margin-left:0}.controls-row [class*=span]+[class*=span]{margin-left:20px}.uneditable-input.span12,input.span12,textarea.span12{width:926px}.uneditable-input.span11,input.span11,textarea.span11{width:846px}.uneditable-input.span10,input.span10,textarea.span10{width:766px}.uneditable-input.span9,input.span9,textarea.span9{width:686px}.uneditable-input.span8,input.span8,textarea.span8{width:606px}.uneditable-input.span7,input.span7,textarea.span7{width:526px}.uneditable-input.span6,input.span6,textarea.span6{width:446px}.uneditable-input.span5,input.span5,textarea.span5{width:366px}.uneditable-input.span4,input.span4,textarea.span4{width:286px}.uneditable-input.span3,input.span3,textarea.span3{width:206px}.uneditable-input.span2,input.span2,textarea.span2{width:126px}.uneditable-input.span1,input.span1,textarea.span1{width:46px}.controls-row{*zoom:1}.controls-row:after,.controls-row:before{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*=span],.row-fluid .controls-row [class*=span]{float:left}.controls-row .checkbox[class*=span],.controls-row .radio[class*=span]{padding-top:5px}input[disabled],input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type=checkbox][disabled],input[type=checkbox][readonly],input[type=radio][disabled],input[type=radio][readonly]{background-color:transparent}.control-group.warning .checkbox,.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dbc59e}.control-group.warning .input-append .add-on,.control-group.warning .input-prepend .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .checkbox,.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d59392}.control-group.error .input-append .add-on,.control-group.error .input-prepend .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .checkbox,.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7aba7b}.control-group.success .input-append .add-on,.control-group.success .input-prepend .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .checkbox,.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad;border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7ab5d3}.control-group.info .input-append .add-on,.control-group.info .input-prepend .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:after,.form-actions:before{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append .dropdown-menu,.input-append .popover,.input-append .uneditable-input,.input-append input,.input-append select,.input-prepend .dropdown-menu,.input-prepend .popover,.input-prepend .uneditable-input,.input-prepend input,.input-prepend select{font-size:14px}.input-append .uneditable-input,.input-append input,.input-append select,.input-prepend .uneditable-input,.input-prepend input,.input-prepend select{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .uneditable-input:focus,.input-append input:focus,.input-append select:focus,.input-prepend .uneditable-input:focus,.input-prepend input:focus,.input-prepend select:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:400;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-append .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .add-on,.input-prepend .btn,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-append .uneditable-input,.input-append input,.input-append select,.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append .uneditable-input+.btn-group .btn:last-child,.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn-group:last-child>.dropdown-toggle,.input-append .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .uneditable-input,.input-prepend.input-append input,.input-prepend.input-append select{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append .uneditable-input+.btn-group .btn,.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn,.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-horizontal .help-inline,.form-horizontal .input-append,.form-horizontal .input-prepend,.form-horizontal .uneditable-input,.form-horizontal input,.form-horizontal select,.form-horizontal textarea,.form-inline .help-inline,.form-inline .input-append,.form-inline .input-prepend,.form-inline .uneditable-input,.form-inline input,.form-inline select,.form-inline textarea,.form-search .help-inline,.form-search .input-append,.form-search .input-prepend,.form-search .uneditable-input,.form-search input,.form-search select,.form-search textarea{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-horizontal .hide,.form-inline .hide,.form-search .hide{display:none}.form-inline .btn-group,.form-inline label,.form-search .btn-group,.form-search label{display:inline-block}.form-inline .input-append,.form-inline .input-prepend,.form-search .input-append,.form-search .input-prepend{margin-bottom:0}.form-inline .checkbox,.form-inline .radio,.form-search .checkbox,.form-search .radio{padding-left:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio],.form-search .checkbox input[type=checkbox],.form-search .radio input[type=radio]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:after,.form-horizontal .control-group:before{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal .input-append+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table td,.table th{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:700}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child td,.table caption+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table thead:first-child tr:first-child td,.table thead:first-child tr:first-child th{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed td,.table-condensed th{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered td,.table-bordered th{border-left:1px solid #ddd}.table-bordered caption+tbody tr:first-child td,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+thead tr:first-child th,.table-bordered tbody:first-child tr:first-child td,.table-bordered tbody:first-child tr:first-child th,.table-bordered thead:first-child tr:first-child th{border-top:0}.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child,.table-bordered thead:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child,.table-bordered thead:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child,.table-bordered thead:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child,.table-bordered thead:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered caption+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered caption+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}.row-fluid table td[class*=span],.row-fluid table th[class*=span],table td[class*=span],table th[class*=span]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class*=" icon-"],[class^=icon-]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url(../../../../../common/img/glyphicons-halflings.png);background-position:14px 14px;background-repeat:no-repeat}.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-menu>.active>a>[class^=icon-],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>li>a:focus>[class^=icon-],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^=icon-],.dropdown-submenu:focus>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class^=icon-],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^=icon-],.icon-white,.nav-list>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^=icon-],.nav-pills>.active>a>[class*=" icon-"],.nav-pills>.active>a>[class^=icon-],.navbar-inverse .nav>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^=icon-]{background-image:url(../../../../../common/img/glyphicons-halflings-white.png)}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropdown,.dropup{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover,.dropdown-submenu:focus>a,.dropdown-submenu:hover>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#999}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px;-moz-border-radius:0 6px 6px;border-radius:0 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:700;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.btn.active,.btn.disabled,.btn:active,.btn:focus,.btn:hover,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn.active,.btn:active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:focus,.btn:hover{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class*=" icon-"],.btn-large [class^=icon-]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class*=" icon-"],.btn-small [class^=icon-]{margin-top:0}.btn-mini [class*=" icon-"],.btn-mini [class^=icon-]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary.active,.btn-primary.disabled,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary.active,.btn-primary:active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning.active,.btn-warning.disabled,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning.active,.btn-warning:active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger.active,.btn-danger.disabled,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger.active,.btn-danger:active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success.active,.btn-success.disabled,.btn-success:active,.btn-success:focus,.btn-success:hover,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success.active,.btn-success:active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info.active,.btn-info.disabled,.btn-info:active,.btn-info:focus,.btn-info:hover,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info.active,.btn-info:active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse.active,.btn-inverse.disabled,.btn-inverse:active,.btn-inverse:focus,.btn-inverse:hover,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse.active,.btn-inverse:active{background-color:#080808 \9}button.btn,input[type=submit].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type=submit].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type=submit].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type=submit].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type=submit].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:focus,.btn-link:hover{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn+.btn-group,.btn-toolbar>.btn-group+.btn{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,.125),inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,.125),inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(255,255,255,.125),inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px;border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-danger .caret,.btn-info .caret,.btn-inverse .caret,.btn-primary .caret,.btn-success .caret,.btn-warning .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:700;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list .nav-header,.nav-list>li>a{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:focus,.nav-list>.active>a:hover{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.2);background-color:#08c}.nav-list [class*=" icon-"],.nav-list [class^=icon-]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-pills,.nav-tabs{*zoom:1}.nav-pills:after,.nav-pills:before,.nav-tabs:after,.nav-tabs:before{display:table;line-height:0;content:""}.nav-pills:after,.nav-tabs:after{clear:both}.nav-pills>li,.nav-tabs>li{float:left}.nav-pills>li>a,.nav-tabs>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:focus,.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:focus,.nav-tabs>.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:focus,.nav-pills>.active>a:hover{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:focus,.nav-tabs.nav-stacked>li>a:hover{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:focus .caret,.nav .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:focus,.nav>.dropdown.active>a:hover{cursor:pointer}.nav-pills .open .dropdown-toggle,.nav-tabs .open .dropdown-toggle,.nav>li.dropdown.open.active>a:focus,.nav>li.dropdown.open.active>a:hover{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open a:focus .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open.active .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:focus,.tabs-stacked .open>a:hover{border-color:#999}.tabbable{*zoom:1}.tabbable:after,.tabbable:before{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-left>.nav-tabs,.tabs-right>.nav-tabs{border-bottom:0}.pill-content>.pill-pane,.tab-content>.tab-pane{display:none}.pill-content>.active,.tab-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:focus,.tabs-below>.nav-tabs>li>a:hover{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:focus,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:focus,.tabs-left>.nav-tabs>li>a:hover{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:focus,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:focus,.tabs-right>.nav-tabs>li>a:hover{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:focus,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:focus,.nav>.disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,.065);box-shadow:0 1px 4px rgba(0,0,0,.065)}.navbar-inner:after,.navbar-inner:before{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:focus,.navbar .brand:hover{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:focus,.navbar-link:hover{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-append .btn,.navbar .input-append .btn-group,.navbar .input-prepend .btn,.navbar .input-prepend .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:after,.navbar-form:before{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form .checkbox,.navbar-form .radio,.navbar-form input,.navbar-form select{margin-top:5px}.navbar-form .btn,.navbar-form input,.navbar-form select{display:inline-block;margin-bottom:0}.navbar-form input[type=checkbox],.navbar-form input[type=image],.navbar-form input[type=radio]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:400;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-bottom .navbar-inner,.navbar-fixed-top .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-bottom .container,.navbar-fixed-top .container,.navbar-static-top .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,.1);box-shadow:0 1px 10px rgba(0,0,0,.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,.1);box-shadow:0 -1px 10px rgba(0,0,0,.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:focus,.navbar .nav>.active>a:hover{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,.125);box-shadow:inset 0 3px 8px rgba(0,0,0,.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075)}.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar:active,.navbar .btn-navbar:focus,.navbar .btn-navbar:hover,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar.active,.navbar .btn-navbar:active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,.25);box-shadow:0 1px 0 rgba(0,0,0,.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:focus .caret,.navbar .nav li.dropdown>a:hover .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle,.navbar .nav li.dropdown.open>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .nav>li>.dropdown-menu.pull-right,.navbar .pull-right>li>.dropdown-menu{right:0;left:auto}.navbar .nav>li>.dropdown-menu.pull-right:before,.navbar .pull-right>li>.dropdown-menu:before{right:12px;left:auto}.navbar .nav>li>.dropdown-menu.pull-right:after,.navbar .pull-right>li>.dropdown-menu:after{right:13px;left:auto}.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu,.navbar .pull-right>li>.dropdown-menu .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-inverse .brand:focus,.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff}.navbar-inverse .brand,.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:focus,.navbar-inverse .nav .active>a:hover{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:focus,.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:focus .caret,.navbar-inverse .nav li.dropdown>a:hover .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query.focused,.navbar-inverse .navbar-search .search-query:focus{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);-moz-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar:active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>.active>a,.pagination ul>.active>span,.pagination ul>li>a:focus,.pagination ul>li>a:hover{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>a,.pagination ul>.disabled>a:focus,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>span{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>a,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>a,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:after,.pager:before{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,.3);box-shadow:0 3px 7px rgba(0,0,0,.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:after,.modal-footer:before{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:after,.thumbnails:before{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,.055);box-shadow:0 1px 3px rgba(0,0,0,.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:focus,a.thumbnail:hover{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,.25);box-shadow:0 1px 4px rgba(0,105,214,.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.badge,.label{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:700;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.badge:empty,.label:empty{display:none}a.badge:focus,a.badge:hover,a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.badge-important,.label-important{background-color:#b94a48}.badge-important[href],.label-important[href]{background-color:#953b39}.badge-warning,.label-warning{background-color:#f89406}.badge-warning[href],.label-warning[href]{background-color:#c67605}.badge-success,.label-success{background-color:#468847}.badge-success[href],.label-success[href]{background-color:#356635}.badge-info,.label-info{background-color:#3a87ad}.badge-info[href],.label-info[href]{background-color:#2d6987}.badge-inverse,.label-inverse{background-color:#333}.badge-inverse[href],.label-inverse[href]{background-color:#1a1a1a}.btn .badge,.btn .label{position:relative;top:-1px}.btn-mini .badge,.btn-mini .label{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,.15),inset 0 -1px 0 rgba(0,0,0,.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,.15),inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 1px 0 0 rgba(0,0,0,.15),inset 0 -1px 0 rgba(0,0,0,.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,.15)),color-stop(0.75,rgba(255,255,255,.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress .bar-danger,.progress-danger .bar{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,.15)),color-stop(0.75,rgba(255,255,255,.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress .bar-success,.progress-success .bar{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0)}.progress-striped .bar-success,.progress-success.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,.15)),color-stop(0.75,rgba(255,255,255,.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress .bar-info,.progress-info .bar{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,.15)),color-stop(0.75,rgba(255,255,255,.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress .bar-warning,.progress-warning .bar{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0)}.progress-striped .bar-warning,.progress-warning.progress-striped .bar{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,.15)),color-stop(0.75,rgba(255,255,255,.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}} \ No newline at end of file +@charset "utf-8";body,html{min-height:100%}body{-webkit-text-size-adjust:none}body>.x:first-child{min-width:300px;max-width:1240px;margin:0 auto}.x button,.x input,.x label,.x select,.x table,.x textarea,body>.x{font-size:13px}.x strong,.x th{font-weight:600}.x dfn,.x em{font-style:normal}.x [disabled]{cursor:not-allowed}.x [hidden]{display:none}.x a[target="_blank"]:after{content:"";display:inline-block;width:14px;height:14px;vertical-align:middle;margin:-2px 0 0 2px;background-position:-120px -72px;opacity:.3;filter:alpha(opacity=30)}.x a[target="_blank"]:focus:after,.x a[target="_blank"]:hover:after{opacity:.7;filter:alpha(opacity=70)}.x mark{background-color:#FF0;color:#000}.x .x_page-header{margin-top:10px;padding-bottom:0;border-bottom:2px solid #ddd}.x .x_page-header>h1{position:relative;margin-bottom:0;font-size:24px;color:#333}.x .x_page-header>h1>.x_icon-question-sign{margin:0}.x .x_page-header>h1>.path+.x_icon-question-sign{margin:4px 0 0}.x .x_icon-question-sign{vertical-align:middle}.x h1,.x h2,.x h3,.x h4,.x h5,.x h6{line-height:1.5;font-weight:600;color:#666;text-rendering:auto}.x h1{font-size:22px}.x h2{font-size:18px}.x h3{font-size:14px}.x h4,.x h5,.x h6{font-size:12px}.x [class*=" x_icon-"],.x [class^=x_icon-]{text-decoration:none;border:0;padding:0 0 0 14px;width:0;background-color:transparent;overflow:hidden;font-size:0}.x .x_close{width:32px;height:32px;font-size:17px;opacity:.5;filter:alpha(opacity=50)}.x .x_alert{position:relative}.x .x_alert>.x_close{position:absolute;top:0;right:0}.x .x_pagination{height:26px;margin:10px 0 0}.x .x_pagination ul>li>a,.x .x_pagination ul>li>span,.x .x_pagination ul>li>strong{line-height:24px;padding:0 8px}.x .x_pagination ul>.x_active>a,.x .x_pagination ul>.x_active>span,.x .x_pagination ul>.x_active>strong{line-height:26px;border:0;background-color:#333!important;color:#fff;font-weight:700;font-size:18px;font-family:Arial,Helvetica,sans-serif;border-radius:2px}.x .x_pagination [id^=goTo]{display:none;margin:0;padding:0}.x .x_pagination [id^=goTo]>*{border:0;border-radius:0}.x .x_pagination [id^=goTo]>[type=number]{height:16px;line-height:16px;width:50px;text-align:center}.x .x_pagination [id^=goTo]>[type=submit]{line-height:24px;height:24px;padding:0 6px}.x .btn{color:#333}.x .x_btn{border-radius:2px;overflow:visible;font-size:14px;line-height:18px;padding:3px 9px;text-decoration:none!important}.x .x_btn-large{font-size:16px;padding:9px 14px;font-weight:700}.x .x_btn-small{font-size:14px}.x .x_btn-mini{font-size:11px;padding:1px 6px;line-height:17px}.x .x_btn-link{padding:0;margin:0;overflow:visible;font-size:13px;border:0}.x .x_btn-group{zoom:1}.x .x_btn-group:after{content:"";display:block;clear:both}.x .x_btn-group>.x_btn{border-radius:0}.x .x_btn-group>.x_btn:last-child,.x .x_btn-group>.x_dropdown-toggle{border-top-right-radius:2px;border-bottom-right-radius:2px}.x .x_btn-group>.x_btn:first-child{border-bottom-left-radius:2px;border-top-left-radius:2px}.x .x_btn-group>.x_btn-inverse+.x_btn-inverse{border-left-color:#555}.x input[type=checkbox],.x input[type=radio]{margin:0}.x input[type=file]{height:auto}.x td input,.x td select,.x td textarea{margin-bottom:0}.x [class*=x_icon-]{opacity:.5;filter:alpha(opacity=50)}.x :focus>[class*=x_icon-],.x :hover>[class*=x_icon-],.x [class*=x_icon-]:focus,.x [class*=x_icon-]:hover{opacity:1;filter:alpha(opacity=100)}.x .x_nav-tabs>li>a{padding-top:6px;padding-bottom:6px;text-decoration:none!important}.x .x_nav-tabs>li.x_active>a{font-weight:700}.x .x_table{margin:10px 0;border-top:2px solid #ddd;border-bottom:1px solid #ddd}.x h1+.x_table{border-top:0;margin-top:-10px}.x .x_table>caption{text-align:left;padding:0 0 10px;line-height:26px}.x .x_table>caption>a,.x .x_table>caption>i,.x .x_table>caption>strong{position:relative;top:7px}.x .x_table thead th{vertical-align:top}.x .x_table input{margin:0}.x .x_inline{display:inline-block;*display:inline;*zoom:1}.x .x_page-header+.x_form-horizontal{margin-top:-20px}.x .x_controls:after{content:"";display:block;clear:both}.x .x_form-horizontal .x_control-label,.x input:checked+label,.x label.checked{font-weight:700;word-break:keep-all}.x .x_form-horizontal .x_control-label{width:180px}.x .x_form-horizontal .x_controls{margin-left:200px;*margin-left:0}.x .x_form-horizontal .x_controls label{padding:5px 0;margin-bottom:0}.x input[type=checkbox]+label,.x input[type=radio]+label{font-weight:400}.x label.x_inline{margin-right:16px}.x .x_input-append>*{vertical-align:top}.x .x_input-append a.x_add-on,.x .x_input-prepend a.x_add-on{height:16px;line-height:16px}.x .x_input-append button.x_add-on,.x .x_input-prepend button.x_add-on{height:24px;line-height:16px}.x .x_modal-header{padding:10px 15px;border-bottom:1px solid #aaa;background-color:#333;border-radius:5px 5px 0 0;background-image:-webkit-linear-gradient(top,#666,#333 50%,#000 50%,#333 100%);background-image:-moz-linear-gradient(top,#666,#333 50%,#000 50%,#333 100%);background-image:-o-linear-gradient(top,#666,#333 50%,#000 50%,#333 100%);background-image:linear-gradient(top,#666,#333 50%,#000 50%,#333 100%)}.x .x_modal-header>h1,.x .x_modal-header>h2,.x .x_modal-header>h3{font-size:16px;line-height:30px;margin:0;color:#fff;text-shadow:0 -1px 0 #000}.x .x_modal-body{overflow-y:visible;max-height:none}.x_modal,.x_modal-backdrop{display:none}.x_modal{top:30px}.x_modal-backdrop{opacity:.6;filter:alpha(opacity=60)}.x_modal{padding:0;width:90%;margin:0 0 0 -45%;max-width:none;border-radius:6px}.x_modal>form{margin:0!important}.x_modal>.x_close{position:absolute;top:8px;right:10px;font-size:21px;color:#fff}.x_modal .x_modal-body{background:#fff;min-height:50px;overflow-y:auto;max-height:400px}.x_modal-body:after{content:"";display:block;clear:both}.x .x_control-group{padding-top:8px;border-top:1px dotted #ddd;clear:both}.x .x_control-group:before{content:"";display:block;clear:both}.x .x_control-group:first-child,.x .x_control-group:first-of-type{border-top:0;padding-top:0}.x .x_control-group select{width:auto;min-width:220px}.x .x_form-horizontal .x_control-group{margin-bottom:10px}.x input[type=color],.x input[type=date],.x input[type=datetime-local],.x input[type=datetime],.x input[type=email],.x input[type=month],.x input[type=number],.x input[type=password],.x input[type=search],.x input[type=tel],.x input[type=text],.x input[type=time],.x input[type=url],.x input[type=week]{height:16px;line-height:16px}.x input[type=number]{width:50px}.x select{padding:0;height:26px;line-height:26px}.x select[multiple]{height:auto}.x textarea{vertical-align:top}.x .x_tab-content{overflow:visible}.x .x_well>:first-child{margin-top:0}.x .x_well>:last-child{margin-bottom:0}.x legend{font-size:14px;font-weight:700;line-height:24px}.x label{font-weight:inherit}.x label:only-child,.x p:last-child,.x td p{margin-bottom:0}.x form{margin:0 0 10px}.x form .x_btn[type=submit]:only-child{min-width:120px}.x .x_help-inline{display:inline}.x .x_btn.x_disabled,.x .x_btn[disabled]{opacity:.5;filter:alpha(opacity=50);cursor:not-allowed}@media all and (max-width:980px){.x .x_form-horizontal .x_control-label{float:none;width:auto;text-align:left}.x .x_form-horizontal .x_controls{margin-left:0}}.x .section{margin:20px 0 40px}.x .section>h1{position:relative;border-bottom:1px solid #ddd;cursor:pointer}.x .section>h1>.snToggle{position:absolute;bottom:0;right:0;width:32px;height:32px;opacity:.5;filter:alpha(opacity=50)}.x .section>h1>.snToggle.x_icon-chevron-up{background-position:-279px -112px}.x .section>h1>.snToggle.x_icon-chevron-down{background-position:-303px -111px}.x .section>h2{position:relative;border-bottom:1px dotted #ddd}.x .section>h2+.x_control-group{border-top:0}.x .section.collapsed>*{display:none}.x .section.collapsed>h1{display:block}.x .center{text-align:center}.x .search{margin:10px 0 0}.x .search select{width:auto}.x .search>input[type=search]{height:16px;line-height:16px;width:120px}.x .vr{color:#ccc;font-style:normal}.x .nowr{white-space:nowrap}.x .btnArea{padding:10px 0;margin:10px 0;border-top:1px solid #ccc;text-align:right;zoom:1;clear:both}.x .btnArea:after{content:"";display:block;clear:both}.x a.active,.x li.active>a{color:#000;font-weight:700;text-decoration:none}.x .module_search+[readonly]{vertical-align:top;border-top-right-radius:0;border-bottom-right-radius:0}.x .module_search+[readonly]+a.x_btn{vertical-align:top;border-top-left-radius:0;border-bottom-left-radius:0;margin-left:-5px}.x .fileBtn{position:relative;display:inline-block;overflow:hidden}.x .fileBtn>input[type=file]{position:absolute;top:0;right:0;margin:0;padding:0;border:0;outline:0;cursor:pointer;opacity:0;filter:alpha(opacity=0);-webkit-transform:scale(4);-webkit-transform-origin:100% 0;-moz-transform:scale(4);-moz-transform-origin:100% 0;-o-transform:scale(4);-o-transform-origin:100% 0;transform:scale(4);transform-origin:100% 0}.x td>form,.x td>p:last-of-type,.x td>p:only-of-type{margin:0}.x [data-display=none]{display:none}.x .x_page-header .path{font-size:14px;display:inline-block}.x .x_page-header .path:first-letter{color:#ccc;font-weight:400}.x [data-toggle]+.x_help-block{margin-top:10px}.x input.switch{width:42px;height:16px;opacity:0;filter:alpha(opacity=0);position:relative;z-index:2}.x input.switch+i{position:relative!important;z-index:1;left:auto!important;top:auto!important;right:auto!important;bottom:auto!important;margin:0 0 0 -42px!important;opacity:1!important;filter:alpha(opacity=100)!important;padding:0;vertical-align:middle;display:inline-block;width:42px;height:16px;background-image:url(../../../../admin/tpl/img/toggleSwitch.png)!important;background-repeat:no-repeat}.x input[checked].switch+i{background-position:0 -16px!important}.x_modal._common{width:600px;margin-left:-300px}.x_modal._common._small{width:400px;margin-left:-200px}@media all and (max-width:650px){.x_modal._common{width:90%;margin-left:-45%}}@media all and (max-width:450px){.x_modal._common._small{width:90%;margin-left:-45%}}.x_modal._common._nobody .x_modal-body,.x_modal._common._type_alert ._cancel,.x_modal._common._type_alert .x_modal-header{display:none}.x_modal._common._type_alert .x_modal-body{border-radius:6px 6px 0 0}.x_modal._common._nobody .x_modal-footer{border-top:0}.x_modal-body.showTree .moveList{float:left;width:60%}.x_modal-body.showTree .moveTree{display:block!important;float:right;width:38%}.x_modal-body.showTree .moveTree>h1{font-size:13px;color:#333;border-bottom:2px solid #ddd;padding:10px 0 7px}@media all and (max-width:960px){.x_modal-body.showTree .moveList,.x_modal-body.showTree .moveTree{float:none;width:auto}}.x .dashboard>div>section>h2:before,.x a[target="_blank"]:after,.x>.body>.gnb>ul>li>a>i{background-image:url(../../../../admin/tpl/img/glyphicons-halflings.png);background-repeat:no-repeat}.x>.body>.gnb>ul>li.active>a>i,.x>.body>.gnb>ul>li.open>a>i,.x_modal-body .tree .jstree-clicked>i,.x_modal-body .tree .jstree-hovered>i{background-image:url(../../../../admin/tpl/img/glyphicons-halflings-white.png);background-repeat:no-repeat}@media all and (max-width:800px){.x>.body>.gnb>ul>li:first-child>a>i{background-image:url(../../../../admin/tpl/img/glyphicons-halflings-white.png);background-repeat:no-repeat}}.x>.skipNav{margin:0}.x>.skipNav>a{display:block;height:1px;text-align:center;border-radius:4px;overflow:hidden;color:#333;text-decoration:none}.x>.skipNav>a:focus{height:auto;margin:5px 0;padding:8px 0;background:#fff}.x>.header{position:relative;z-index:2;padding:10px 15px;border-bottom:1px solid #ddd;background-color:#fff;zoom:1}.x>.header:after{content:"";display:block;clear:both}.x>.header:before{content:"";position:absolute;bottom:0;left:1px;right:1px;height:1px;box-shadow:0 2px 3px #ddd}.x>.body{position:relative;zoom:1;padding:0 0 50px 215px;z-index:1}.x>.body.wide{padding-left:70px}.x>.body:after{content:"";display:block;clear:both}.x>.body>.content{width:100%;padding:1px 0 0;float:right;margin:0 0 0 -100%;outline:0}.x>.body>.content>:first-child{margin-top:0}.x>.body>.gnb{width:180px;position:relative;margin:15px 0 0 -215px;float:left;display:inline}.x>.body.wide>.gnb{width:38px;margin-left:-70px}@media all and (max-width:800px){.x>.header{border-bottom:0}.x>.header:before{content:normal}.x>.body,.x>.body.wide{padding:0}.x>.body>.content{width:auto;padding:1px 10px 0;float:none;margin:0 0 30px}.x>.body>.gnb{float:none;display:block;width:auto;margin:0!important;border-radius:0;position:relative;top:auto;left:auto}.x>.body.wide>.gnb{width:auto}}.x>.header>h1{display:inline-block;*display:inline;zoom:1;margin:0 15px 0 0;white-space:nowrap}.x>.header>h1>a{text-decoration:none;color:#333;font-size:24px;line-height:40px;font-family:Arial,Helvetica,sans-serif}.x>.header>h1>a>img{vertical-align:middle}.x>.header>.site{display:inline-block;*display:inline;zoom:1;margin:14px 0 0;font-size:11px}.x>.header>.site>a{text-decoration:none;color:#666;font-family:Tahoma,Geneva,sans-serif}.x>.header>.site>a:focus,.x>.header>.site>a:hover{text-decoration:underline}.x>.header>.account{float:right;position:relative;margin:13px 0 0}.x>.header>.account>ul{list-style:none;margin:0;padding:0}.x>.header>.account>ul>li{display:inline}.x>.header>.account>ul>li:before{content:"| ";color:#ddd}.x>.header>.account>ul>li:first-child:before{content:normal}.x>.header>.account>ul>li>a{text-decoration:none;color:#666}.x>.header>.account>ul>li.forum-chak>a{color:#FFF}.x>.header>.account>ul>li>a:focus,.x>.header>.account>ul>li>a:hover{text-decoration:underline}.x>.header>.account .lang+#lang{position:absolute;top:20px;left:auto;right:0;min-width:0}.x>.header>.account .lang+#lang a:focus,.x>.header>.account .lang+#lang a:hover{background:0 0;color:#333}.x>.header>.account .lang+#lang .x_active>a{color:#fff;background:#0081c2 -webkit-linear-gradient(top,#08c,#0077b3);background:#0081c2 -moz-linear-gradient(top,#08c,#0077b3);background:#0081c2 -o-linear-gradient(top,#08c,#0077b3)}@media all and (max-width:480px){.x>.header>.site{margin-top:0}}@media all and (max-width:800px){.x>.header>.account{margin-top:0}}.x>.footer{border-top:1px solid #ddd;padding:10px 15px;zoom:1}.x>.footer:after{content:"";display:block;clear:both}.x>.footer>p{margin:0}.x>.footer>.power{float:left;color:#666}.x>.footer>.cache{float:right}.x>.footer>.cache>*{color:#666}.x>.footer .vr{color:#ccc!important}.x>.body>.gnb ul{margin:0;padding:0;list-style:none}.x>.body>.gnb>ul{position:relative;z-index:1;box-shadow:0 0 4px #ccc;border:2px solid #fff}.x>.body>.gnb a{text-decoration:none;text-shadow:0 1px 0 #fff;color:#000;display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x>.body>.gnb>a[href="#gnbNav"]{display:block;position:absolute;z-index:2;white-space:nowrap;font-size:0;top:50%;right:-14px;background:#eee;width:12px;height:50px;border-radius:0 3px 3px 0;margin:-25px 0 0 0;border:1px solid #ddd;border-left:0;overflow:hidden;text-indent:20px}.x>.body.wide>.gnb>a[href="#gnbNav"]>b{border-color:transparent;border-left-color:#666;margin:-4px 0 0 -2px}.x>.body>.gnb>a[href="#gnbNav"]>b{width:0;height:0;position:absolute;top:50%;left:50%;margin:-4px 0 0 -6px;border:4px solid;border-color:transparent;border-right-color:#666}.x>.body>.gnb>a>i{display:none}.x>.body>.gnb .exMenu{position:absolute;width:100%}.x>.body>.gnb .exMenu>button{width:100%;border:0;background:0 0;font-size:20px;line-height:25px}.x>.body>.gnb .exMenu>button>i{opacity:.5;filter:alpha(opacity=50);vertical-align:middle;text-indent:0}.x>.body>.gnb .exMenu>button:focus>i,.x>.body>.gnb .exMenu>button:hover>i{opacity:1;filter:alpha(opacity=100)}.x>.body>.gnb .exMenu .x_icon-chevron-up,.x>.body>.gnb>.ex .exMenu .x_icon-chevron-down{display:none}.x>.body>.gnb>.ex .exMenu .x_icon-chevron-up{display:inline-block}.x>.body>.gnb>ul>li[data-index="1"]{border-top-color:#eee}.x>.body>.gnb>ul>li[data-index="5"]{margin-bottom:25px}.x>.body>.gnb>ul>li[data-index="6"]{border-top-color:#eee}.x>.body>.gnb>ul>li[data-index="6"],.x>.body>.gnb>ul>li[data-index="7"]{display:none}.x>.body>.gnb>.ex>li[data-index="6"],.x>.body>.gnb>.ex>li[data-index="7"]{display:block}.x>.body>.gnb>ul>li[data-index].active_{display:none}@media all and (max-width:800px){.x>.body>.gnb>ul{border:0}.x>.body>.gnb>ul>li{display:none}.x>.body>.gnb.open>ul>li{display:block}.x>.body>.gnb.open>ul>li[data-index="6"],.x>.body>.gnb.open>ul>li[data-index="7"],.x>.body>.gnb>.ex>li[data-index="6"],.x>.body>.gnb>.ex>li[data-index="7"]{display:none}.x>.body>.gnb.open>.ex>li[data-index="6"],.x>.body>.gnb.open>.ex>li[data-index="7"]{display:block}.x>.body>.gnb>ul>li:first-child{display:block!important}.x>.body.wide>.gnb>a[href="#gnbNav"],.x>.body>.gnb>a[href="#gnbNav"]{top:0;right:0;line-height:37px;width:44px;height:auto;background:0 0;border-radius:0;margin:0;border:0}.x>.body>.gnb>a[href="#gnbNav"]{opacity:.5;filter:alpha(opacity=50%)}.x>.body>.gnb>a[href="#gnbNav"]:before{content:"";position:absolute;top:1px;left:0;width:1px;height:100%;border-left:1px solid #999}.x>.body>.gnb>a[href="#gnbNav"]>b{display:none}.x>.body>.gnb>a>i{display:block;position:absolute;top:50%;left:50%;margin:-7px 0 0 -7px}}.x>.body>.gnb>ul>li{background:#3886d0;border-top:1px solid #fff;border-bottom:1px solid #ddd;vertical-align:top;white-space:nowrap}.x>.body>.gnb>ul>li.active{background:#222}.x>.body>.gnb>ul>li.active,.x>.body>.gnb>ul>li.open{border-bottom:0;padding:0 0 1px}.x>.body>.gnb>ul>li>a{position:relative;padding:8px 5px 8px 10px;background:#f1f1f1;background:-webkit-linear-gradient(top,#F1F1F1,#E8E8E8);background:-moz-linear-gradient(top,#F1F1F1,#E8E8E8);background:-o-linear-gradient(top,#F1F1F1,#E8E8E8);background:-ms-linear-gradient(top,#F1F1F1,#E8E8E8);background:linear-gradient(top,#F1F1F1,#E8E8E8)}.x>.body>.gnb>ul>li>a>i{display:inline-block;width:14px;height:14px;margin:-4px 4px 0 0;vertical-align:middle;opacity:.75;filter:alpha(opacity=75)}.x>.body>.gnb>ul>li>a>b{position:absolute;width:0;height:0;top:50%;right:10px;margin:-2px 0 0 0;border:4px solid transparent;border-top-color:#999}.x>.body>.gnb>ul>li.open>a>b{border-top:0;border-bottom-color:#fff}.x>.body.wide>.gnb>ul>li>a>b{display:none}.x>.body>.gnb>ul>li[data-index="1"]>a>i{background-position:-384px -144px}.x>.body>.gnb>ul>li[data-index="2"]>a>i{background-position:0 -24px}.x>.body>.gnb>ul>li[data-index="3"]>a>i{background-position:-168px 0}.x>.body>.gnb>ul>li[data-index="4"]>a>i{background-position:-48px -48px}.x>.body>.gnb>ul>li>a[href="#favorite"]>i{background-position:-120px 0}.x>.body>.gnb>ul>li[data-index="6"]>a>i{background-position:-360px -144px}.x>.body>.gnb>ul>li[data-index="7"]>a>i{background-position:-432px 0}.x>.body>.gnb>ul>li>a:focus,.x>.body>.gnb>ul>li>a:hover{background:#f6f6f6;background:-webkit-linear-gradient(top,#f6f6f6,#F1F1F1);background:-moz-linear-gradient(top,#f6f6f6,#F1F1F1);background:-o-linear-gradient(top,#f6f6f6,#F1F1F1);background:-ms-linear-gradient(top,#f6f6f6,#F1F1F1);background:linear-gradient(top,#f6f6f6,#F1F1F1)}.x>.body>.gnb>ul>li.open>a{font-weight:700;color:#fff;text-shadow:0 -1px 0 #333;background:#3886d0;background:-webkit-linear-gradient(top,#6ebcea,#3886d0);background:-moz-linear-gradient(top,#6ebcea,#3886d0);background:-o-linear-gradient(top,#6ebcea,#3886d0);background:-ms-linear-gradient(top,#6ebcea,#3886d0);background:linear-gradient(top,#6ebcea,#3886d0)}.x>.body>.gnb>ul>li.active>a{font-weight:700;color:#fff;text-shadow:none;background:#222;background:-webkit-linear-gradient(top,from(#555),to(#222));background:-moz-linear-gradient(top,#555,#222);background:-o-linear-gradient(top,#555,#222)}@media all and (max-width:800px){.x>.body>.gnb>ul>li:first-child>a{font-weight:700;color:#fff;text-shadow:none;border-radius:3px;background-color:#222;background-image:-webkit-linear-gradient(top,#555,#222);background-image:-moz-linear-gradient(top,#555,#222);background-image:-o-linear-gradient(top,#555,#222);background-image:linear-gradient(top,#555,#222)}}.x>.body.wide>.gnb>ul>li>a>.tx{display:inline-block;width:1px;height:1px;overflow:hidden}.x>.body>.gnb>ul>li>ul{display:none;margin:0 10px 10px;border-radius:4px}.x>.body>.gnb>ul>li.active>ul{display:block!important}.x>.body.wide>.gnb>ul>li>ul{display:none!important}.x>.body>.gnb>ul>li>ul>li{border-top:1px solid #ddd;position:relative}.x>.body>.gnb>ul>li>ul>li:first-child{border:0}.x>.body>.gnb>ul>li>ul>li.active_{box-shadow:0 0 3px #999;z-index:99;border:1px solid #666;border-left:0;border-right:0}.x>.body>.gnb>ul>li>ul>li>a{padding:4px 5px 4px 15px;background:#e8e8e8;background:-webkit-linear-gradient(top,#f1f1f1,#e8e8e8);background:-moz-linear-gradient(top,#f1f1f1,#e8e8e8);background:-o-linear-gradient(top,#f1f1f1,#e8e8e8);background:-ms-linear-gradient(top,#f1f1f1,#e8e8e8);background:linear-gradient(top,#f1f1f1,#e8e8e8)}.x>.body>.gnb>ul>li>ul#favorite>li>a{padding:4px 25px 4px 15px}.x>.body>.gnb>ul>li>ul>li:first-child>a{border-radius:4px 4px 0 0}.x>.body>.gnb>ul>li>ul>li:last-child>a{border-radius:0 0 4px 4px}.x>.body>.gnb>ul>li>ul>li:only-child>a{border-radius:4px}.x>.body>.gnb>ul>li>ul>li.active_>a,.x>.body>.gnb>ul>li>ul>li>a:active,.x>.body>.gnb>ul>li>ul>li>a:hover{font-weight:700;background:-webkit-linear-gradient(top,#F6F6F6,#F1F1F1);background:-moz-linear-gradient(top,#F6F6F6,#F1F1F1);background:-o-linear-gradient(top,#F6F6F6,#F1F1F1);background:-ms-linear-gradient(top,#F6F6F6,#F1F1F1);background:linear-gradient(top,#F6F6F6,#F1F1F1)}.x>.body>.gnb>ul>li>ul>li.active_>a:after{content:"";position:absolute;top:8px;right:-12px;border:6px solid transparent;border-left-color:#f3f3f3;width:0;height:0;overflow:hidden}.x>.body>.gnb>ul>li>ul>li>.remove{position:absolute;top:4px;right:5px}.x>.body>.gnb>ul>li>ul>li>.remove>.x_close{width:20px;height:20px}@media all and (max-width:800px){.x>.body.wide>.gnb>ul>li>a>.tx{width:auto;height:auto}}.x .dashboard{zoom:1}.x .dashboard:after{content:"";display:block;clear:both}.x .dashboard>div{float:right;width:49%}.x .dashboard>div:first-child{float:left}.x .dashboard>div>section{position:relative;height:196px;border:1px solid #ddd;border-radius:4px;margin:0 0 25px;overflow:hidden}.x .dashboard>div>section>h2{font-size:14px;margin:0;padding:6px 15px;border-bottom:1px solid #ddd;background:#e8e8e8;background:-webkit-linear-gradient(top,#F1F1F1,#E8E8E8);background:-moz-linear-gradient(top,#F1F1F1,#E8E8E8);background:-o-linear-gradient(top,#F1F1F1,#E8E8E8);background:-ms-linear-gradient(top,#F1F1F1,#E8E8E8);background:linear-gradient(top,#F1F1F1,#E8E8E8);text-shadow:0 1px 0 #fff}.x .dashboard>div>section>h2:before{content:"";display:inline-block;width:14px;height:14px;margin:0 4px 0 0;vertical-align:middle;opacity:.5;filter:alpha(opacity=50)}.x .dashboard>div>.status>h2:before{background-position:-408px 0}.x .dashboard>div>.status dl{color:#767676;display:inline-block;*display:inline;zoom:1;margin:0 8px 0 0;padding:1px 8px 0;font:11px/1 돋움,Dotum,Arial,Helvetica,sans-serif;background:#fff;box-shadow:0 0 3px #999 inset;border-radius:3px;min-width:60px;text-align:center}.x .dashboard>div>.status dt{display:inline;font-weight:400}.x .dashboard>div>.status dd{display:inline;margin:0}.x .dashboard>div>.status dl a{color:#767676}.x .dashboard>div>.member>h2:before{background-position:-168px 0}.x .dashboard>div>.document>h2:before{background-position:-264px -48px}.x .dashboard>div>.reply>h2:before{background-position:-240px -120px}.x .dashboard>div>.trackback>h2:before{background-position:-216px -120px}.x .dashboard>div>section>.more{position:absolute;top:7px;right:15px;text-shadow:0 1px 0 #fff}.x .dashboard>div>section>.more i{font:12px Tahoma,Geneva,sans-serif}.x .dashboard>div>section>.more dl{color:#767676;display:inline-block;*display:inline;zoom:1;margin:0 8px 0 0;padding:1px 8px 0;font:11px/1 돋움,Dotum,Arial,Helvetica,sans-serif;background:#fff;box-shadow:0 0 3px #999 inset;border-radius:3px;min-width:60px;text-align:center}.x .dashboard>div>section>.more dt{display:inline;font-weight:400}.x .dashboard>div>section>.more dd{display:inline;margin:0}.x .dashboard>div>section>.more dl a{color:#767676}.x .dashboard>div>section ul{list-style:none;margin:10px;padding:0;overflow:hidden;zoom:1}.x .dashboard>div>section li{position:relative;height:28px;line-height:28px;padding:0 70px 0 5px;white-space:nowrap;overflow:hidden;zoom:1;vertical-align:top}.x .dashboard>div>section li.hover{background:#f4f4f4;border-radius:4px}.x .dashboard>div>section li>a{display:block;width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.x .dashboard>div>section li>.side{position:absolute;top:0;right:5px;line-height:28px;width:60px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:right;zoom:1}.x .dashboard>div>section li>.action{display:none;position:absolute;top:0;right:5px;margin:0;padding:0 0 0 40px;text-align:right;white-space:nowrap;line-height:28px;background:#f4f4f4}.x .dashboard>div>section li>.action>button{margin:0 0 0 4px;padding:0 0 0 15px;overflow:visible}@media all and (max-width:980px){.x .dashboard>div{float:none!important;width:auto}}.x .g11n>.x_add-on{font-size:0;position:relative;cursor:pointer;text-decoration:none;*color:#eee}.x .g11n>.x_add-on>i{position:absolute;top:50%;left:50%;margin:-7px 0 0 -7px;z-index:1;opacity:.25;filter:alpha(opacity=25)}.x .g11n>.x_add-on.remover{display:none;width:26px;height:26px}.x .g11n.active>[disabled]{padding-left:25px;background-position:4px 6px;background-repeat:no-repeat}.x .g11n.active>.x_add-on.remover{display:inline-block}.x .g11n>.x_add-on:hover>i{opacity:1;filter:alpha(opacity=100)}.x .g11n>textarea{border-top-right-radius:0;overflow-x:hidden}#g11n #lang_search .list{border-top:2px solid #ddd}#g11n #lang_search .item{border-bottom:1px solid #ddd;margin:0}#g11n #lang_search .item>a{display:block;padding:8px 0;position:relative}#g11n #lang_search .item>a>i{position:absolute;top:50%;margin:-7px 0 0 0;right:0;opacity:.5;filter:alpha(opacity=50)}#g11n #lang_search .item>fieldset{display:none;padding:0 0 15px}#g11n .item input[type=text],#g11n .item textarea{padding-left:25px;width:187px;background-repeat:no-repeat;background-position:4px 8px;overflow-x:hidden}#g11n .flag{padding-left:18px;background-repeat:no-repeat;background-position:0 50%}#g11n .flag.en,#g11n .item .en,html[lang=en] .x .g11n.active>[disabled]{background-image:url(../../../../admin/tpl/img/flag.en.gif)}#g11n .flag.ko,#g11n .item .ko,html[lang=ko] .x .g11n.active>[disabled]{background-image:url(../../../../admin/tpl/img/flag.ko.gif)}#g11n .flag.jp,#g11n .item .jp,html[lang=jp] .x .g11n.active>[disabled]{background-image:url(../../../../admin/tpl/img/flag.jp.gif)}#g11n .flag.zh-CN,#g11n .item .zh-CN,html[lang=zh] .x .g11n.active>[disabled]{background-image:url(../../../../admin/tpl/img/flag.cn.gif)}#g11n .flag.zh-TW,#g11n .item .zh-TW,html[lang=zh] .x .g11n.active>[disabled]{background-image:url(../../../../admin/tpl/img/flag.tw.gif)}#g11n .flag.fr,#g11n .item .fr,html[lang=fr] .x .g11n.active>[disabled]{background-image:url(../../../../admin/tpl/img/flag.fr.gif)}#g11n .flag.de,#g11n .item .de,html[lang=de] .x .g11n.active>[disabled]{background-image:url(../../../../admin/tpl/img/flag.de.gif)}#g11n .flag.ru,#g11n .item .ru,html[lang=ru] .x .g11n.active>[disabled]{background-image:url(../../../../admin/tpl/img/flag.ru.gif)}#g11n .flag.es,#g11n .item .es,html[lang=es] .x .g11n.active>[disabled]{background-image:url(../../../../admin/tpl/img/flag.es.gif)}#g11n .item .tr,#gg1n .flag.tr,html[lang=tr] .x .g11n.active>[disabled]{background-image:url(../../../../admin/tpl/img/flag.tr.gif)}#g11n .flag.vi,#g11n .item .vi,html[lang=vi] .x .g11n.active>[disabled]{background-image:url(../../../../admin/tpl/img/flag.vi.gif)}#g11n .flag.mn,#g11n .item .mn,html[lang=mn] .x .g11n.active>[disabled]{background-image:url(../../../../admin/tpl/img/flag.mn.gif)}#g11n #lang_search .cancel,#g11n #lang_search .editMode .modify,#g11n #lang_search .editMode .useit,#g11n #lang_search .save{display:none}#g11n #lang_search .editMode .cancel,#g11n #lang_search .editMode .save{display:inline-block}.x .moduleWindow{position:absolute;z-index:100;padding:15px 20px}.x .moduleWindow ul{margin-bottom:0}.x .moduleWindow .siteList{margin-right:14px}.x .moduleWindow .siteList>input[type=search]{width:100%;padding-top:6px;padding-bottom:6px;border-radius:3px 3px 0 0;margin-bottom:0}.x .moduleWindow .siteList>ul{margin:-1px -14px 0 0}.x .moduleWindow .siteList>ul>li{background:#fff}.x .moduleWindow .siteList>ul>li:first-child>a{border-top-left-radius:0;border-top-right-radius:0}.x .moduleWindow select{width:100%}.x .textList{border:1px solid #ddd!important;line-height:1.5em;height:125px;overflow:auto}.x .textList li{position:relative;border:0;padding:0 10px;height:25px;line-height:25px;white-space:nowrap;overflow:hidden}.x .textList li:nth-child(even){background:#eee}.x .textList li>button{position:absolute;right:8px;top:50%;margin:-7px 0 0 0}.x .uDrag .wrap{position:relative;padding-left:20px}.x .uDrag li>.wrap{margin:0 0 0 8px}.x .uDrag .dragActive{background:#FFD}.x .uDrag .dragActive td,.x .uDrag .dragActive th{background:none!important}.x .uDrag .dragBtn{position:absolute;width:8px;height:100%;padding:0;overflow:hidden;background:url(../../../../admin/tpl/img/bgDragable.gif);top:1px;left:0;text-indent:12px;border:0;cursor:n-resize;white-space:nowrap;font-size:0}.x #faviconPreview{position:relative;padding:80px 0 0 200px;background:url(../../../../admin/tpl/img/bgFavicon.gif) no-repeat}.x #faviconPreview img{position:absolute}.x #faviconPreview .fn1{top:30px;left:12px}.x #faviconPreview .fn2{top:55px;left:68px}.x #mobiconPreview{position:relative;padding:270px 0 0 200px;background:url(../../../../admin/tpl/img/bgMobileTop.png) no-repeat}.x #mobiconPreview img{position:absolute;top:20px;left:10px;width:32px;height:32px}.x #mobiconPreview span{position:absolute;width:32px;text-align:center;top:52px;left:10px;color:#fff;font-size:9px}.x .layer{position:absolute;display:none;font-weight:400}.tree{margin:3px 0 5px;min-width:200px;background-color:transparent!important}.tree ul{margin:0;padding:0;list-style:none}.tree li{padding:0;white-space:nowrap;position:relative;border-radius:3px;vertical-align:top}.tree li>ul{margin:0}.tree a{text-decoration:none}.tree>ul{padding:1px}.tree .jstree-rename-input{margin-left:-16px;z-index:2}.tree>ul>li{margin-top:30px;position:relative}.tree>ul>li:before{content:"";display:block;border-top:1px dotted #ccc;position:relative;top:-15px}.tree>ul>li:first-child{margin-top:0}.tree>ul>li:first-child:before{content:normal}.tree>ul>li>a{font-weight:700;text-shadow:0 1px 0 #fff;vertical-align:middle}.tree>ul>li>a.jstree-clicked,.tree>ul>li>a.jstree-hovered,.tree>ul>li>a:focus,.tree>ul>li>a:hover{text-shadow:none}.tree>ul>li>ul{margin:0 0 0 18px}.tree>ul>li>ul>li{margin-left:0}.tree li>a{border:0!important;padding:0 8px!important;margin:0 0 1px;border-radius:3px;position:relative;z-index:2;height:23px;line-height:23px;max-width:160px;overflow:hidden;text-overflow:ellipsis;-webkit-transition:.2s;-moz-transition:.2s;-o-transition:.2s;transition:.2s}.tree li>a>i{opacity:.5;filter:alpha(opacity=50)}.tree .jstree-clicked>i,.tree .jstree-hovered>i{opacity:1;filter:alpha(opacity=100)}.tree a>.jstree-icon{display:none}.tree .jstree-closed>.jstree-icon,.tree .jstree-open>.jstree-icon{background-color:#fff}.x .h2,.x .h3,.x .h4{position:relative;border-style:solid;border-top:0;border-right:0;zoom:1;padding-left:8px}.x .h1{background:#444;border-radius:4px;color:#fff;margin:0 0 1em;font-size:16px;padding:0 15px;line-height:36px}.x .h2{border-width:3px;font-size:20px;border-color:#888}.x .h3{border-width:2px;font-size:16px;border-color:#aaa}.x .h4{border-width:1px;font-size:12px;border-color:#ccc}.x .h1+.table table,.x .h1+ul,.x .h2+.table table,.x .h2+ul,.x .h3+.table table,.x .h3+ul,.x .h4+.table table,.x .h4+ul{border-top:0!important;margin-top:-1em!important}.x .table{margin:1em 0}.x .table table{width:100%;border:0;border-collapse:collapse;border-top:2px solid #ccc}.x .table caption{font-weight:700;text-align:left;line-height:22px;padding:5px 0}.x .table caption:after{content:"";display:block;clear:both}.x .table caption a{font-weight:400}.x .table caption em{float:right;margin-left:1em}.x .table caption strong{color:#e00}.x .table caption .side{float:right;font-weight:400;margin-left:1em}.x .table td,.x .table th{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd}.x .table th{background:#f8f8f8}.x .table thead th{border-bottom:1px solid #999}.x .table tfoot td{font-weight:700;background:#f8f8f8}.x .table.even tbody tr:nth-of-type(even){background-color:#fafafa}.x .table tbody tr:hover{background:#ffd!important}.x .table td>input[type=text]{margin:-1px 0!important;vertical-align:middle}.x .table img{vertical-align:middle}.x .table em{font-style:normal;font-weight:400;color:#e00}.x .form{margin:0 0 1em;padding:0}.x .form fieldset{margin:0 0 2em;padding:0;border:0}.x .form.search fieldset{border:1px solid #ccc;padding:5px 15px;border-radius:3px}.x .form em{font-style:normal;color:#e00}.x .form label{line-height:1;vertical-align:middle}.x .form input[type=checkbox]+label,.x .form input[type=radio]+label{margin-right:1em}.x .form input[type=checkbox]+label,.x .form input[type=file],.x .form input[type=radio]+label{cursor:pointer}.x .form ul{position:relative;margin:1em 0;padding:0;list-style:none;border-top:2px solid #ccc;border-bottom:1px solid #ccc;zoom:1}.x .form li{list-style:none;border:1px solid #ddd;border-left:0;border-right:0;margin:-1px 0;padding:8px 0;vertical-align:top;zoom:1}.x .form li:hover{background:#ffd}.x .form li:first-child{border-top:0}.x .form li>label:first-child{display:block;font-weight:700}.x .form li label em{font-weight:400}.x .form label.overlap{position:absolute;color:#aaa}.x .form input[type=file],.x .form input[type=password],.x .form input[type=text],.x .form select[size],.x .form textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:0 0}.x .form input[type=file],.x .form input[type=password],.x .form input[type=text]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .form input[type=checkbox],.x .form input[type=radio]{margin:0;padding:0;width:13px;height:13px;vertical-align:middle}.x .form input[type=checkbox][disabled=disabled],.x .form input[type=password][disabled=disabled],.x .form input[type=radio][disabled=disabled],.x .form input[type=text][disabled=disabled],.x .form select[disabled=disabled],.x .form textarea[disabled=disabled]{background:#ddd;text-shadow:1px 1px 0 #fff}.x .form textarea{padding:3px 4px;vertical-align:top;resize:both}.x .form em.desc,.x .form span.desc{line-height:22px;vertical-align:middle;margin:0 10px}.x .form p.desc{margin:.25em 0;line-height:1.4}.x .form .q{font-weight:700;margin:0 0 5px}.x .form .a{margin:0 0 5px}.x .form .tgForm{margin-right:1em}.x .cnb{margin:1em 0;position:relative;zoom:1}.x .cnb:after{content:"";display:block;clear:both}.x .cnb ul{list-style:none;margin:0;padding:0}.x .cnb li{display:inline}.x .cnb li:before{content:"| ";color:#ccc}.x .cnb li:first-child:before{content:""}.x .cnb .active,.x .cnb .active a{font-weight:700;color:#333;text-decoration:none}.x .cnb .side{float:right}.x .pagination{margin:1em 0;text-align:center;line-height:normal}.x .pagination *{vertical-align:middle}.x .pagination a,.x .pagination strong{position:relative;display:inline-block;padding:2px 4px;font-weight:700;text-decoration:none;line-height:normal;color:#333!important;vertical-align:middle}.x .pagination a:active,.x .pagination a:focus,.x .pagination a:hover{border:1px solid #ddd;margin:0 -1px}.x .pagination strong{color:#e00!important;font-size:20px}.x .pagination .direction{font-weight:400;white-space:nowrap}.x .pagination .direction:active,.x .pagination .direction:focus,.x .pagination .direction:hover{border:0;margin:0;text-decoration:underline}.x .pagination input{width:30px;text-align:center}.x .pagination button{overflow:visible}.x .prgrs{white-space:nowrap;line-height:normal;vertical-align:middle}.x .prgrs *{vertical-align:middle}.x .prgrs .pBar{position:relative;display:inline-block;background:#e9e9e9;margin:0 5px 0 0}.x .prgrs .pAction{display:inline-block;vertical-align:top;background:#99a6b6}.x .prgrs .pNum{width:100%;left:0;top:0;text-align:center;text-shadow:1px 1px 0 #fff}.x .prgrs.prgrsSmall{font-size:14px;line-height:14px}.x .prgrs.prgrsSmall .pAction,.x .prgrs.prgrsSmall .pBar,.x .prgrs.prgrsSmall .pNum{height:16px;line-height:16px;font-size:11px}.x .prgrs.prgrsMedium{font-size:24px;line-height:24px}.x .prgrs.prgrsMedium .pAction,.x .prgrs.prgrsMedium .pBar,.x .prgrs.prgrsMedium .pNum{height:22px;line-height:22px;font-size:12px}.x .prgrs.prgrsLarge{font-size:38px;line-height:38px}.x .prgrs.prgrsLarge .pAction,.x .prgrs.prgrsLarge .pBar,.x .prgrs.prgrsLarge .pNum{height:34px;line-height:34px;font-size:14px}.modal{_height:100%;min-height:100%}.modal .bg{position:absolute;background:#000;_background:0 0;width:100%;height:100%;opacity:.5;z-index:2;filter:alpha(opacity=50);zoom:1}.modal .fg{position:relative;width:80%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000}.modal .lined,.modal .table,.modal ol,.modal ul{margin-bottom:1em}.modal .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1}.modalClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:700;cursor:pointer;color:#999;border-radius:5px}.modalBlur{position:absolute;top:0;right:0;border:0;background:0 0;padding:0;width:1px;height:1px;overflow:hidden}.admin-forum-container{clear:both;margin:10px 5px;border:0 solid #ddd}.admin-forum-container.activated-forum{margin-top:30px;padding:15px;background-color:#fbfbfb;border-width:3px 0}.admin-forum-container .open-forum{display:inline-block;padding:15px;padding-left:60px;color:#08c;font-size:14px;height:20px;line-height:20px;text-decoration:none;background-image:url(../../../../admin/tpl/img/chak_c.png);background-repeat:no-repeat;background-position:center left}.admin-forum-container .open-forum:active,.admin-forum-container .open-forum:hover{text-decoration:underline}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:active,a:hover{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button}button,input[type=button],input[type=checkbox],input[type=radio],input[type=reset],input[type=submit],label,select{cursor:pointer}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}textarea{overflow:auto}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:focus,a:hover{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,.1);box-shadow:0 1px 3px rgba(0,0,0,.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:after,.row:before{display:table;line-height:0;content:""}.row:after{clear:both}[class*=span]{float:left;min-height:1px;margin-left:20px}.container,.navbar-fixed-bottom .container,.navbar-fixed-top .container,.navbar-static-top .container,.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:after,.row-fluid:before{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*=span]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*=span]:first-child{margin-left:0}.row-fluid .controls-row [class*=span]+[class*=span]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}.row-fluid [class*=span].hide,[class*=span].hide{display:none}.row-fluid [class*=span].pull-right,[class*=span].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:after,.container:before{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:after,.container-fluid:before{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:700}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:focus,a.muted:hover{color:gray}.text-warning{color:#c09853}a.text-warning:focus,a.text-warning:hover{color:#a47e3c}.text-error{color:#b94a48}a.text-error:focus,a.text-error:hover{color:#953b39}.text-info{color:#3a87ad}a.text-info:focus,a.text-info:hover{color:#2d6987}.text-success{color:#468847}a.text-success:focus,a.text-success:hover{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:700;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:400;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small,h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ol,ul{padding:0;margin:0 0 10px 25px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}li{line-height:20px}ol.inline,ol.unstyled,ul.inline,ul.unstyled{margin-left:0;list-style:none}ol.inline>li,ul.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dd,dt{line-height:20px}dt{font-weight:700}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:after,.dl-horizontal:before{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}blockquote:after,blockquote:before,q:after,q:before{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}button,input,label,select,textarea{font-size:14px;font-weight:400;line-height:20px}button,input,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}.uneditable-input,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.uneditable-input,input,textarea{width:206px}textarea{height:auto}.uneditable-input,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],textarea{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}.uneditable-input:focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,textarea:focus{border-color:rgba(82,168,236,.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6)}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type=button],input[type=checkbox],input[type=file],input[type=image],input[type=radio],input[type=reset],input[type=submit]{width:auto}input[type=file],select{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus,select:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.025);box-shadow:inset 0 1px 2px rgba(0,0,0,.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.checkbox,.radio{min-height:20px;padding-left:20px}.checkbox input[type=checkbox],.radio input[type=radio]{float:left;margin-left:-20px}.controls>.checkbox:first-child,.controls>.radio:first-child{padding-top:5px}.checkbox.inline,.radio.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.checkbox.inline+.checkbox.inline,.radio.inline+.radio.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}.row-fluid .uneditable-input[class*=span],.row-fluid input[class*=span],.row-fluid select[class*=span],.row-fluid textarea[class*=span],.uneditable-input[class*=span],input[class*=span],select[class*=span],textarea[class*=span]{float:none;margin-left:0}.input-append .uneditable-input[class*=span],.input-append input[class*=span],.input-prepend .uneditable-input[class*=span],.input-prepend input[class*=span],.row-fluid .input-append [class*=span],.row-fluid .input-prepend [class*=span],.row-fluid .uneditable-input[class*=span],.row-fluid input[class*=span],.row-fluid select[class*=span],.row-fluid textarea[class*=span]{display:inline-block}.uneditable-input,input,textarea{margin-left:0}.controls-row [class*=span]+[class*=span]{margin-left:20px}.uneditable-input.span12,input.span12,textarea.span12{width:926px}.uneditable-input.span11,input.span11,textarea.span11{width:846px}.uneditable-input.span10,input.span10,textarea.span10{width:766px}.uneditable-input.span9,input.span9,textarea.span9{width:686px}.uneditable-input.span8,input.span8,textarea.span8{width:606px}.uneditable-input.span7,input.span7,textarea.span7{width:526px}.uneditable-input.span6,input.span6,textarea.span6{width:446px}.uneditable-input.span5,input.span5,textarea.span5{width:366px}.uneditable-input.span4,input.span4,textarea.span4{width:286px}.uneditable-input.span3,input.span3,textarea.span3{width:206px}.uneditable-input.span2,input.span2,textarea.span2{width:126px}.uneditable-input.span1,input.span1,textarea.span1{width:46px}.controls-row{*zoom:1}.controls-row:after,.controls-row:before{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*=span],.row-fluid .controls-row [class*=span]{float:left}.controls-row .checkbox[class*=span],.controls-row .radio[class*=span]{padding-top:5px}input[disabled],input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type=checkbox][disabled],input[type=checkbox][readonly],input[type=radio][disabled],input[type=radio][readonly]{background-color:transparent}.control-group.warning .checkbox,.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dbc59e}.control-group.warning .input-append .add-on,.control-group.warning .input-prepend .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .checkbox,.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d59392}.control-group.error .input-append .add-on,.control-group.error .input-prepend .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .checkbox,.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7aba7b}.control-group.success .input-append .add-on,.control-group.success .input-prepend .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .checkbox,.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad;border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7ab5d3}.control-group.info .input-append .add-on,.control-group.info .input-prepend .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:after,.form-actions:before{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append .dropdown-menu,.input-append .popover,.input-append .uneditable-input,.input-append input,.input-append select,.input-prepend .dropdown-menu,.input-prepend .popover,.input-prepend .uneditable-input,.input-prepend input,.input-prepend select{font-size:14px}.input-append .uneditable-input,.input-append input,.input-append select,.input-prepend .uneditable-input,.input-prepend input,.input-prepend select{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .uneditable-input:focus,.input-append input:focus,.input-append select:focus,.input-prepend .uneditable-input:focus,.input-prepend input:focus,.input-prepend select:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:400;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-append .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .add-on,.input-prepend .btn,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-append .uneditable-input,.input-append input,.input-append select,.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append .uneditable-input+.btn-group .btn:last-child,.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn-group:last-child>.dropdown-toggle,.input-append .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .uneditable-input,.input-prepend.input-append input,.input-prepend.input-append select{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append .uneditable-input+.btn-group .btn,.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn,.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-horizontal .help-inline,.form-horizontal .input-append,.form-horizontal .input-prepend,.form-horizontal .uneditable-input,.form-horizontal input,.form-horizontal select,.form-horizontal textarea,.form-inline .help-inline,.form-inline .input-append,.form-inline .input-prepend,.form-inline .uneditable-input,.form-inline input,.form-inline select,.form-inline textarea,.form-search .help-inline,.form-search .input-append,.form-search .input-prepend,.form-search .uneditable-input,.form-search input,.form-search select,.form-search textarea{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-horizontal .hide,.form-inline .hide,.form-search .hide{display:none}.form-inline .btn-group,.form-inline label,.form-search .btn-group,.form-search label{display:inline-block}.form-inline .input-append,.form-inline .input-prepend,.form-search .input-append,.form-search .input-prepend{margin-bottom:0}.form-inline .checkbox,.form-inline .radio,.form-search .checkbox,.form-search .radio{padding-left:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio],.form-search .checkbox input[type=checkbox],.form-search .radio input[type=radio]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:after,.form-horizontal .control-group:before{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal .input-append+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table td,.table th{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:700}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child td,.table caption+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table thead:first-child tr:first-child td,.table thead:first-child tr:first-child th{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed td,.table-condensed th{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered td,.table-bordered th{border-left:1px solid #ddd}.table-bordered caption+tbody tr:first-child td,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+thead tr:first-child th,.table-bordered tbody:first-child tr:first-child td,.table-bordered tbody:first-child tr:first-child th,.table-bordered thead:first-child tr:first-child th{border-top:0}.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child,.table-bordered thead:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child,.table-bordered thead:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child,.table-bordered thead:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child,.table-bordered thead:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered caption+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered caption+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}.row-fluid table td[class*=span],.row-fluid table th[class*=span],table td[class*=span],table th[class*=span]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class*=" icon-"],[class^=icon-]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url(../../../../../common/img/glyphicons-halflings.png);background-position:14px 14px;background-repeat:no-repeat}.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-menu>.active>a>[class^=icon-],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>li>a:focus>[class^=icon-],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^=icon-],.dropdown-submenu:focus>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class^=icon-],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^=icon-],.icon-white,.nav-list>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^=icon-],.nav-pills>.active>a>[class*=" icon-"],.nav-pills>.active>a>[class^=icon-],.navbar-inverse .nav>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^=icon-]{background-image:url(../../../../../common/img/glyphicons-halflings-white.png)}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropdown,.dropup{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover,.dropdown-submenu:focus>a,.dropdown-submenu:hover>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#999}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px;-moz-border-radius:0 6px 6px;border-radius:0 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:700;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.btn.active,.btn.disabled,.btn:active,.btn:focus,.btn:hover,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn.active,.btn:active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:focus,.btn:hover{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class*=" icon-"],.btn-large [class^=icon-]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class*=" icon-"],.btn-small [class^=icon-]{margin-top:0}.btn-mini [class*=" icon-"],.btn-mini [class^=icon-]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary.active,.btn-primary.disabled,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary.active,.btn-primary:active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning.active,.btn-warning.disabled,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning.active,.btn-warning:active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger.active,.btn-danger.disabled,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger.active,.btn-danger:active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success.active,.btn-success.disabled,.btn-success:active,.btn-success:focus,.btn-success:hover,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success.active,.btn-success:active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info.active,.btn-info.disabled,.btn-info:active,.btn-info:focus,.btn-info:hover,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info.active,.btn-info:active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse.active,.btn-inverse.disabled,.btn-inverse:active,.btn-inverse:focus,.btn-inverse:hover,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse.active,.btn-inverse:active{background-color:#080808 \9}button.btn,input[type=submit].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type=submit].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type=submit].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type=submit].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type=submit].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:focus,.btn-link:hover{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn+.btn-group,.btn-toolbar>.btn-group+.btn{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,.125),inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,.125),inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(255,255,255,.125),inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px;border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-danger .caret,.btn-info .caret,.btn-inverse .caret,.btn-primary .caret,.btn-success .caret,.btn-warning .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:700;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list .nav-header,.nav-list>li>a{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:focus,.nav-list>.active>a:hover{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.2);background-color:#08c}.nav-list [class*=" icon-"],.nav-list [class^=icon-]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-pills,.nav-tabs{*zoom:1}.nav-pills:after,.nav-pills:before,.nav-tabs:after,.nav-tabs:before{display:table;line-height:0;content:""}.nav-pills:after,.nav-tabs:after{clear:both}.nav-pills>li,.nav-tabs>li{float:left}.nav-pills>li>a,.nav-tabs>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:focus,.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:focus,.nav-tabs>.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:focus,.nav-pills>.active>a:hover{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:focus,.nav-tabs.nav-stacked>li>a:hover{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:focus .caret,.nav .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:focus,.nav>.dropdown.active>a:hover{cursor:pointer}.nav-pills .open .dropdown-toggle,.nav-tabs .open .dropdown-toggle,.nav>li.dropdown.open.active>a:focus,.nav>li.dropdown.open.active>a:hover{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open a:focus .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open.active .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:focus,.tabs-stacked .open>a:hover{border-color:#999}.tabbable{*zoom:1}.tabbable:after,.tabbable:before{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-left>.nav-tabs,.tabs-right>.nav-tabs{border-bottom:0}.pill-content>.pill-pane,.tab-content>.tab-pane{display:none}.pill-content>.active,.tab-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:focus,.tabs-below>.nav-tabs>li>a:hover{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:focus,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:focus,.tabs-left>.nav-tabs>li>a:hover{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:focus,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:focus,.tabs-right>.nav-tabs>li>a:hover{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:focus,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:focus,.nav>.disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,.065);box-shadow:0 1px 4px rgba(0,0,0,.065)}.navbar-inner:after,.navbar-inner:before{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:focus,.navbar .brand:hover{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:focus,.navbar-link:hover{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-append .btn,.navbar .input-append .btn-group,.navbar .input-prepend .btn,.navbar .input-prepend .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:after,.navbar-form:before{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form .checkbox,.navbar-form .radio,.navbar-form input,.navbar-form select{margin-top:5px}.navbar-form .btn,.navbar-form input,.navbar-form select{display:inline-block;margin-bottom:0}.navbar-form input[type=checkbox],.navbar-form input[type=image],.navbar-form input[type=radio]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:400;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-bottom .navbar-inner,.navbar-fixed-top .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-bottom .container,.navbar-fixed-top .container,.navbar-static-top .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,.1);box-shadow:0 1px 10px rgba(0,0,0,.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,.1);box-shadow:0 -1px 10px rgba(0,0,0,.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:focus,.navbar .nav>.active>a:hover{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,.125);box-shadow:inset 0 3px 8px rgba(0,0,0,.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075)}.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar:active,.navbar .btn-navbar:focus,.navbar .btn-navbar:hover,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar.active,.navbar .btn-navbar:active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,.25);box-shadow:0 1px 0 rgba(0,0,0,.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:focus .caret,.navbar .nav li.dropdown>a:hover .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle,.navbar .nav li.dropdown.open>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .nav>li>.dropdown-menu.pull-right,.navbar .pull-right>li>.dropdown-menu{right:0;left:auto}.navbar .nav>li>.dropdown-menu.pull-right:before,.navbar .pull-right>li>.dropdown-menu:before{right:12px;left:auto}.navbar .nav>li>.dropdown-menu.pull-right:after,.navbar .pull-right>li>.dropdown-menu:after{right:13px;left:auto}.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu,.navbar .pull-right>li>.dropdown-menu .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-inverse .brand:focus,.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff}.navbar-inverse .brand,.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:focus,.navbar-inverse .nav .active>a:hover{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:focus,.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:focus .caret,.navbar-inverse .nav li.dropdown>a:hover .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query.focused,.navbar-inverse .navbar-search .search-query:focus{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);-moz-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar:active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>.active>a,.pagination ul>.active>span,.pagination ul>li>a:focus,.pagination ul>li>a:hover{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>a,.pagination ul>.disabled>a:focus,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>span{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>a,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>a,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:after,.pager:before{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,.3);box-shadow:0 3px 7px rgba(0,0,0,.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:after,.modal-footer:before{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:after,.thumbnails:before{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,.055);box-shadow:0 1px 3px rgba(0,0,0,.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:focus,a.thumbnail:hover{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,.25);box-shadow:0 1px 4px rgba(0,105,214,.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.badge,.label{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:700;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.badge:empty,.label:empty{display:none}a.badge:focus,a.badge:hover,a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.badge-important,.label-important{background-color:#b94a48}.badge-important[href],.label-important[href]{background-color:#953b39}.badge-warning,.label-warning{background-color:#f89406}.badge-warning[href],.label-warning[href]{background-color:#c67605}.badge-success,.label-success{background-color:#468847}.badge-success[href],.label-success[href]{background-color:#356635}.badge-info,.label-info{background-color:#3a87ad}.badge-info[href],.label-info[href]{background-color:#2d6987}.badge-inverse,.label-inverse{background-color:#333}.badge-inverse[href],.label-inverse[href]{background-color:#1a1a1a}.btn .badge,.btn .label{position:relative;top:-1px}.btn-mini .badge,.btn-mini .label{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,.15),inset 0 -1px 0 rgba(0,0,0,.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,.15),inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 1px 0 0 rgba(0,0,0,.15),inset 0 -1px 0 rgba(0,0,0,.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,.15)),color-stop(0.75,rgba(255,255,255,.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress .bar-danger,.progress-danger .bar{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,.15)),color-stop(0.75,rgba(255,255,255,.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress .bar-success,.progress-success .bar{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0)}.progress-striped .bar-success,.progress-success.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,.15)),color-stop(0.75,rgba(255,255,255,.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress .bar-info,.progress-info .bar{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,.15)),color-stop(0.75,rgba(255,255,255,.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress .bar-warning,.progress-warning .bar{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0)}.progress-striped .bar-warning,.progress-warning.progress-striped .bar{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,.15)),color-stop(0.75,rgba(255,255,255,.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}} \ No newline at end of file diff --git a/modules/editor/components/image_link/image_link.class.php b/modules/editor/components/image_link/image_link.class.php index e13a6ace9..68b477ba6 100644 --- a/modules/editor/components/image_link/image_link.class.php +++ b/modules/editor/components/image_link/image_link.class.php @@ -14,7 +14,7 @@ class image_link extends EditorHandler /** * @brief editor_sequence and components out of the path */ - function image_link($editor_sequence, $component_path) + function __construct($editor_sequence, $component_path) { $this->editor_sequence = $editor_sequence; $this->component_path = $component_path; diff --git a/modules/editor/components/poll_maker/poll_maker.class.php b/modules/editor/components/poll_maker/poll_maker.class.php index d8f17739b..ee96c68ed 100644 --- a/modules/editor/components/poll_maker/poll_maker.class.php +++ b/modules/editor/components/poll_maker/poll_maker.class.php @@ -14,7 +14,7 @@ class poll_maker extends EditorHandler /** * @brief editor_sequence and components out of the path */ - function poll_maker($editor_sequence, $component_path) + function __construct($editor_sequence, $component_path) { $this->editor_sequence = $editor_sequence; $this->component_path = $component_path; diff --git a/modules/editor/editor.admin.controller.php b/modules/editor/editor.admin.controller.php index 659132bea..baf7750a3 100644 --- a/modules/editor/editor.admin.controller.php +++ b/modules/editor/editor.admin.controller.php @@ -144,7 +144,8 @@ class editorAdminController extends editor { $oModuleController = getController('module'); $configVars = Context::getRequestVars(); - + + $config = new stdClass; if($configVars->font_defined != 'Y') $config->font_defined = $configVars->font_defined = 'N'; else $config->font_defined = 'Y'; diff --git a/modules/editor/editor.model.php b/modules/editor/editor.model.php index d584f9ba3..2dcbe26fd 100644 --- a/modules/editor/editor.model.php +++ b/modules/editor/editor.model.php @@ -627,7 +627,7 @@ class editorModel extends editor if($logged_info->is_admin == "Y" || $logged_info->is_site_admin == "Y") continue; if($val->target_group) { - if(!$logged_info) + if(!Context::get('is_logged')) { $val->enabled = "N"; } diff --git a/modules/editor/skins/ckeditor/css/default.css b/modules/editor/skins/ckeditor/css/default.css index e69de29bb..a9afbba8c 100755 --- a/modules/editor/skins/ckeditor/css/default.css +++ b/modules/editor/skins/ckeditor/css/default.css @@ -0,0 +1 @@ +p.editor_autosaved_message.autosave_message {display:none;background: #f6ffdb;padding:6px 10px;margin:0;line-height:1;} diff --git a/modules/editor/skins/ckeditor/editor.html b/modules/editor/skins/ckeditor/editor.html index 850691e89..ad3149792 100755 --- a/modules/editor/skins/ckeditor/editor.html +++ b/modules/editor/skins/ckeditor/editor.html @@ -8,6 +8,10 @@ + + {@ $css_content = null } {@ $css_content = '.xe_content.editable p { margin: 0;'. chr(125); } @@ -23,8 +27,17 @@ {@ $css_content .= chr(125);} + + + + + + +
    +

     

    + diff --git a/modules/editor/skins/ckeditor/file_upload.html b/modules/editor/skins/ckeditor/file_upload.html index 913f1cbfb..777245265 100644 --- a/modules/editor/skins/ckeditor/file_upload.html +++ b/modules/editor/skins/ckeditor/file_upload.html @@ -44,36 +44,28 @@ - diff --git a/modules/editor/skins/xpresseditor/js/xe_textarea.js b/modules/editor/skins/xpresseditor/js/xe_textarea.js index 92eb0bf8b..865d37f0d 100644 --- a/modules/editor/skins/xpresseditor/js/xe_textarea.js +++ b/modules/editor/skins/xpresseditor/js/xe_textarea.js @@ -34,8 +34,7 @@ function editorGetContentTextarea(editor_sequence) { content = content.replace(/>/g, ">"); content = content.replace(/\"/g, """); } - content = content.replace(/(\r\n|\n)/g, "
    "); + content = content.replace(/(\r\n|\n)/g, "
    "); } return content; -} - +} \ No newline at end of file diff --git a/modules/editor/skins/xpresseditor/js/xe_textarea.min.js b/modules/editor/skins/xpresseditor/js/xe_textarea.min.js index fcab0985b..a7fa9e8b0 100644 --- a/modules/editor/skins/xpresseditor/js/xe_textarea.min.js +++ b/modules/editor/skins/xpresseditor/js/xe_textarea.min.js @@ -1 +1 @@ -function editorStartTextarea(a,b,c){var d=xGetElementById("editor_"+a),e=xGetElementById("htm_"+a).value;d.form.setAttribute("editor_sequence",a),d.style.width="100%",editorRelKeys[a]=new Array,editorRelKeys[a].primary=d.form[c],editorRelKeys[a].content=d.form[b],editorRelKeys[a].func=editorGetContentTextarea;var f=d.form[b].value;e&&(f=f.replace(/]*)>/gi,"\n"),"br"!=e&&(f=f.replace(/</g,"<"),f=f.replace(/>/g,">"),f=f.replace(/"/g,'"'),f=f.replace(/&/g,"&"))),d.value=f}function editorGetContentTextarea(a){var b=xGetElementById("editor_"+a),c=xGetElementById("htm_"+a).value,d=b.value.trim();return c&&("br"!=c&&(d=d.replace(/&/g,"&"),d=d.replace(//g,">"),d=d.replace(/\"/g,""")),d=d.replace(/(\r\n|\n)/g,"
    ")),d} \ No newline at end of file +function editorStartTextarea(a,b,c){var d=xGetElementById("editor_"+a),e=xGetElementById("htm_"+a).value;d.form.setAttribute("editor_sequence",a),d.style.width="100%",editorRelKeys[a]=new Array,editorRelKeys[a].primary=d.form[c],editorRelKeys[a].content=d.form[b],editorRelKeys[a].func=editorGetContentTextarea;var f=d.form[b].value;e&&(f=f.replace(/]*)>/gi,"\n"),"br"!=e&&(f=f.replace(/</g,"<"),f=f.replace(/>/g,">"),f=f.replace(/"/g,'"'),f=f.replace(/&/g,"&"))),d.value=f}function editorGetContentTextarea(a){var b=xGetElementById("editor_"+a),c=xGetElementById("htm_"+a).value,d=b.value.trim();return c&&("br"!=c&&(d=d.replace(/&/g,"&"),d=d.replace(//g,">"),d=d.replace(/\"/g,"""))),d} diff --git a/modules/editor/tpl/admin_index.html b/modules/editor/tpl/admin_index.html index 00d055ab5..2cf340627 100644 --- a/modules/editor/tpl/admin_index.html +++ b/modules/editor/tpl/admin_index.html @@ -213,3 +213,4 @@ jQuery(function($){ }); +
    diff --git a/modules/editor/tpl/js/editor.app.js b/modules/editor/tpl/js/editor.app.js index 56941412d..15baab9ce 100644 --- a/modules/editor/tpl/js/editor.app.js +++ b/modules/editor/tpl/js/editor.app.js @@ -1,3 +1,23 @@ +function getCkFormInstance(editor_sequence) +{ + var fo_obj = document.getElementById('ckeditor_instance_' + editor_sequence).parentNode; + while(fo_obj.nodeName != 'FORM') { fo_obj = fo_obj.parentNode; } + if(fo_obj.nodeName == 'FORM') return fo_obj; + return; +} + +function getAutoSavedSrl(ret_obj, response_tags, c) { + var editor_sequence = ret_obj.editor_sequence; + var primary_key = ret_obj.key; + var fo_obj = getCkFormInstance(editor_sequence); + + if(ret_obj.document_srl !== 0) + { + fo_obj[primary_key].value = ret_obj.document_srl; + reloadUploader(editor_sequence); + } +} + (function($){ "use strict"; var default_ckeconfig = { @@ -60,6 +80,8 @@ var $contentField = $form.find(opts.content_field); var data = $containerEl.data(); var editor_sequence = $containerEl.data().editorSequence; + var primary_key = $containerEl.data().editorPrimaryKeyName; + var fo_obj = getCkFormInstance(editor_sequence); this.ckeconfig = $.extend({}, default_ckeconfig, opts.ckeconfig || {}); @@ -67,6 +89,29 @@ $form.attr('editor_sequence', data.editorSequence); if(CKEDITOR.env.mobile) CKEDITOR.env.isCompatible = true; + + // saved document(자동저장 문서)에 대한 확인 + if(typeof(fo_obj._saved_doc_title)!= "undefined") { ///<< _saved_doc_title field가 없으면 자동저장 하지 않음 + var saved_title = fo_obj._saved_doc_title.value; + var saved_content = fo_obj._saved_doc_content.value; + + if(saved_title || saved_content) { + // 자동저장된 문서 활용여부를 물은 후 사용하지 않는다면 자동저장된 문서 삭제 + if(confirm(fo_obj._saved_doc_message.value)) { + if(typeof(fo_obj.title)!='undefined') fo_obj.title.value = saved_title; + $contentField.val(saved_content); + + var param = []; + param.editor_sequence = editor_sequence; + param.primary_key = primary_key; + param.mid = current_mid; + var response_tags = new Array("error","message","editor_sequence","key","title","content","document_srl"); + exec_xml('editor',"procEditorLoadSavedDocument", param, getAutoSavedSrl, response_tags); + } else { + editorRemoveSavedDoc(); + } + } + } var instance = CKEDITOR.appendTo($containerEl[0], {}, $contentField.val()); @@ -109,6 +154,9 @@ window.editorRelKeys[data.editorSequence].pasteHTML = function(text){ instance.insertHtml(text, 'html'); }; + + // 자동저장 필드가 있다면 자동 저장 기능 활성화 + if(typeof(fo_obj._saved_doc_title)!="undefined" ) editorEnableAutoSave(fo_obj, editor_sequence); }, getContent : function(seq) { var self = this; diff --git a/modules/file/conf/module.xml b/modules/file/conf/module.xml index 7ae7858fa..7f5425f6e 100644 --- a/modules/file/conf/module.xml +++ b/modules/file/conf/module.xml @@ -13,7 +13,7 @@ - + diff --git a/modules/file/file.controller.php b/modules/file/file.controller.php index aa5c61e95..11b876063 100644 --- a/modules/file/file.controller.php +++ b/modules/file/file.controller.php @@ -46,6 +46,12 @@ class fileController extends file $output = $this->insertFile($file_info, $module_srl, $upload_target_srl); Context::setResponseMethod('JSON'); + $this->add('file_srl',$output->get('file_srl')); + $this->add('file_size',$output->get('file_size')); + $this->add('direct_download',$output->get('direct_download')); + $this->add('source_filename',$output->get('source_filename')); + $this->add('download_url',$output->get('uploaded_filename')); + $this->add('upload_target_srl',$output->get('upload_target_srl')); if($output->error != '0') $this->stop($output->message); } @@ -112,11 +118,11 @@ class fileController extends file $source_src = $fileInfo->uploaded_filename; $output_src = $source_src . '.resized' . strrchr($source_src,'.'); - $type = 'ratio'; if(!$height) $height = $width-1; if(FileHandler::createImageFile($source_src,$output_src,$width,$height,'','ratio')) { + $output = new stdClass(); $output->info = getimagesize($output_src); $output->src = $output_src; } @@ -263,87 +269,151 @@ class fileController extends file } } } + // Call a trigger (before) $output = ModuleHandler::triggerCall('file.downloadFile', 'before', $file_obj); if(!$output->toBool()) return $this->stop(($output->message)?$output->message:'msg_not_permitted_download'); - - // 다운로드 후 (가상) // Increase download_count $args = new stdClass(); $args->file_srl = $file_srl; executeQuery('file.updateFileDownloadCount', $args); + // Call a trigger (after) $output = ModuleHandler::triggerCall('file.downloadFile', 'after', $file_obj); - $random = new Password(); - $file_key = $_SESSION['__XE_FILE_KEY__'][$file_srl] = $random->createSecureSalt(32, 'hex'); + // Redirect to procFileOutput using file key + if(!isset($_SESSION['__XE_FILE_KEY__']) || !is_string($_SESSION['__XE_FILE_KEY__']) || strlen($_SESSION['__XE_FILE_KEY__']) != 32) + { + $random = new Password(); + $_SESSION['__XE_FILE_KEY__'] = $random->createSecureSalt(32, 'hex'); + } + $file_key_data = $file_obj->file_srl . $file_obj->file_size . $file_obj->uploaded_filename . $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']; + $file_key = substr(hash_hmac('sha256', $file_key_data, $_SESSION['__XE_FILE_KEY__']), 0, 32); header('Location: '.getNotEncodedUrl('', 'act', 'procFileOutput','file_srl',$file_srl,'file_key',$file_key)); Context::close(); exit(); - } public function procFileOutput() { + // Get requsted file info $oFileModel = getModel('file'); $file_srl = Context::get('file_srl'); $file_key = Context::get('file_key'); - if(strstr($_SERVER['HTTP_USER_AGENT'], "Android")) $is_android = true; - if($is_android && $_SESSION['__XE_FILE_KEY_AND__'][$file_srl]) $session_key = '__XE_FILE_KEY_AND__'; - else $session_key = '__XE_FILE_KEY__'; $columnList = array('source_filename', 'uploaded_filename', 'file_size'); $file_obj = $oFileModel->getFile($file_srl, $columnList); + $filesize = $file_obj->file_size; + $filename = $file_obj->source_filename; + $etag = md5($file_srl . $file_key . $_SERVER['HTTP_USER_AGENT']); - $uploaded_filename = $file_obj->uploaded_filename; - - if(!file_exists($uploaded_filename)) return $this->stop('msg_file_not_found'); - - if(!$file_key || $_SESSION[$session_key][$file_srl] != $file_key) + // Check file key + if(strlen($file_key) != 32 || !isset($_SESSION['__XE_FILE_KEY__']) || !is_string($_SESSION['__XE_FILE_KEY__'])) { - unset($_SESSION[$session_key][$file_srl]); return $this->stop('msg_invalid_request'); } + $file_key_data = $file_srl . $file_obj->file_size . $file_obj->uploaded_filename . $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']; + $file_key_compare = substr(hash_hmac('sha256', $file_key_data, $_SESSION['__XE_FILE_KEY__']), 0, 32); + if($file_key !== $file_key_compare) + { + return $this->stop('msg_invalid_request'); + } + + // Check if file exists + $uploaded_filename = $file_obj->uploaded_filename; + if(!file_exists($uploaded_filename)) + { + return $this->stop('msg_file_not_found'); + } - $file_size = $file_obj->file_size; - $filename = $file_obj->source_filename; - if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE || (strpos($_SERVER['HTTP_USER_AGENT'], 'Windows') !== FALSE && strpos($_SERVER['HTTP_USER_AGENT'], 'Trident') !== FALSE && strpos($_SERVER['HTTP_USER_AGENT'], 'rv:') !== FALSE)) + // If client sent an If-None-Match header with the correct ETag, do not download again + if(isset($_SERVER['HTTP_IF_NONE_MATCH']) && trim(trim($_SERVER['HTTP_IF_NONE_MATCH']), '\'"') === $etag) + { + header('HTTP/1.1 304 Not Modified'); + exit(); + } + + // If client sent an If-Modified-Since header with a recent modification date, do not download again + if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) > filemtime($uploaded_filename)) + { + header('HTTP/1.1 304 Not Modified'); + exit(); + } + + // Filename encoding for browsers that support RFC 5987 + if(preg_match('#(?:Chrome|Edge)/(\d+)\.#', $_SERVER['HTTP_USER_AGENT'], $matches) && $matches[1] >= 11) + { + $filename_param = "filename*=UTF-8''" . rawurlencode($filename) . '; filename="' . rawurlencode($filename) . '"'; + } + elseif(preg_match('#(?:Firefox|Safari|Trident)/(\d+)\.#', $_SERVER['HTTP_USER_AGENT'], $matches) && $matches[1] >= 6) + { + $filename_param = "filename*=UTF-8''" . rawurlencode($filename) . '; filename="' . rawurlencode($filename) . '"'; + } + // Filename encoding for browsers that do not support RFC 5987 + elseif(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE) { $filename = rawurlencode($filename); - $filename = preg_replace('/\./', '%2e', $filename, substr_count($filename, '.') - 1); + $filename_param = 'filename="' . preg_replace('/\./', '%2e', $filename, substr_count($filename, '.') - 1) . '"'; } - - if($is_android) + else { - if($_SESSION['__XE_FILE_KEY__'][$file_srl]) $_SESSION['__XE_FILE_KEY_AND__'][$file_srl] = $file_key; + $filename_param = 'filename="' . $filename . '"'; } - unset($_SESSION[$session_key][$file_srl]); - + // Close context to prevent blocking the session Context::close(); + // Open file $fp = fopen($uploaded_filename, 'rb'); - if(!$fp) return $this->stop('msg_file_not_found'); + if(!$fp) + { + return $this->stop('msg_file_not_found'); + } - header("Cache-Control: "); + // Take care of pause and resume + if(isset($_SERVER['HTTP_RANGE']) && preg_match('/^bytes=(\d+)-(\d+)?/', $_SERVER['HTTP_RANGE'], $matches)) + { + $range_start = $matches[1]; + $range_end = $matches[2] ? $matches[2] : ($filesize - 1); + $range_length = $range_end - $range_start + 1; + if($range_length < 1 || $range_start < 0 || $range_start >= $filesize || $range_end >= $filesize) + { + header('HTTP/1.1 416 Requested Range Not Satisfiable'); + fclose($fp); + exit(); + } + fseek($fp, $range_start); + header('HTTP/1.1 206 Partial Content'); + header('Content-Range: bytes ' . $range_start . '-' . $range_end . '/' . $filesize); + } + else + { + $range_start = 0; + $range_length = $filesize - $range_start; + } + + // Clear buffer + while(ob_get_level()) ob_end_clean(); + + // Set headers + header("Cache-Control: private; max-age=3600"); header("Pragma: "); header("Content-Type: application/octet-stream"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); - header("Content-Length: " .(string)($file_size)); - header('Content-Disposition: attachment; filename="'.$filename.'"'); - header("Content-Transfer-Encoding: binary\n"); + header('Content-Disposition: attachment; ' . $filename_param); + header('Content-Transfer-Encoding: binary'); + header('Content-Length: ' . $range_length); + header('Accept-Ranges: bytes'); + header('Etag: "' . $etag . '"'); - // if file size is lager than 10MB, use fread function (#18675748) - if(filesize($uploaded_filename) > 1024 * 1024) + // Print the file contents + for($offset = 0; $offset < $range_length; $offset += 4096) { - while(!feof($fp)) echo fread($fp, 1024); - fclose($fp); - } - else - { - fpassthru($fp); + $buffer_size = min(4096, $range_length - $offset); + echo fread($fp, $buffer_size); + flush(); } exit(); diff --git a/modules/file/tpl/adminConfig.html b/modules/file/tpl/adminConfig.html index 1d4bd8782..6ae5cb121 100644 --- a/modules/file/tpl/adminConfig.html +++ b/modules/file/tpl/adminConfig.html @@ -56,3 +56,5 @@ + +
    diff --git a/modules/file/tpl/file_list.html b/modules/file/tpl/file_list.html index a11f42b82..1f00e2e6e 100644 --- a/modules/file/tpl/file_list.html +++ b/modules/file/tpl/file_list.html @@ -207,3 +207,5 @@ jQuery(function($){ }); }); + +
    diff --git a/modules/importer/tpl/index.html b/modules/importer/tpl/index.html index cac85a045..ab917cb21 100644 --- a/modules/importer/tpl/index.html +++ b/modules/importer/tpl/index.html @@ -105,3 +105,5 @@ jQuery('a.modalAnchor') return false; }); + +
    diff --git a/modules/install/install.admin.controller.php b/modules/install/install.admin.controller.php index 520afcfaf..0933108c7 100644 --- a/modules/install/install.admin.controller.php +++ b/modules/install/install.admin.controller.php @@ -96,11 +96,15 @@ class installAdminController extends install $qmail_compatibility = Context::get('qmail_compatibility'); if($qmail_compatibility!='Y') $qmail_compatibility = 'N'; + $cache_friendly = Context::get('cache_friendly'); + if($cache_friendly!='Y') $cache_friendly = 'N'; + $use_html5 = Context::get('use_html5'); if(!$use_html5) $use_html5 = 'N'; $db_info->default_url = $default_url; $db_info->qmail_compatibility = $qmail_compatibility; + $db_info->cache_friendly = $cache_friendly; $db_info->use_db_session = $use_db_session; $db_info->use_rewrite = $use_rewrite; $db_info->use_sso = $use_sso; diff --git a/modules/install/install.controller.php b/modules/install/install.controller.php index 178c5a56a..6fb6d6861 100644 --- a/modules/install/install.controller.php +++ b/modules/install/install.controller.php @@ -600,7 +600,7 @@ class installController extends install { $db_tmp_config_file = $this->db_tmp_config_file; - $db_info = Context::getDbInfo(); + $db_info = Context::getDBInfo(); if(!$db_info) return; $buff = $this->_getDBConfigFileContents($db_info); @@ -641,7 +641,7 @@ class installController extends install $config_file = Context::getConfigFile(); //if(file_exists($config_file)) return; - $db_info = Context::getDbInfo(); + $db_info = Context::getDBInfo(); if(!$db_info) return; $buff = $this->_getDBConfigFileContents($db_info); diff --git a/modules/integration_search/conf/info.xml b/modules/integration_search/conf/info.xml index 8a45efbc7..67e8ac786 100644 --- a/modules/integration_search/conf/info.xml +++ b/modules/integration_search/conf/info.xml @@ -1,13 +1,13 @@ 통합검색 - 综合搜索 - 統合検索 Integrated Search + 統合検索 + 集成搜索 + 集成搜索 Tìm kiếm tích hợp Búsqueda Integrada Интегрируемый поиск - 綜合搜尋 Birleşik Arama 선택한 페이지를 대상으로 통합검색을 지원합니다. diff --git a/modules/integration_search/integration_search.view.php b/modules/integration_search/integration_search.view.php index 79d3c6933..ebeb7e61c 100644 --- a/modules/integration_search/integration_search.view.php +++ b/modules/integration_search/integration_search.view.php @@ -98,6 +98,13 @@ class integration_searchView extends integration_search if($is_keyword) { $oIS = getModel('integration_search'); + $oTrackbackModel = getAdminModel('trackback'); + Context::set('trackback_module_exist', true); + if(!$oTrackbackModel) + { + Context::set('trackback_module_exist', false); + } + switch($where) { case 'document' : diff --git a/modules/integration_search/lang/lang.xml b/modules/integration_search/lang/lang.xml index 4db09ec6f..477f5d3eb 100644 --- a/modules/integration_search/lang/lang.xml +++ b/modules/integration_search/lang/lang.xml @@ -4,8 +4,8 @@ - - + + @@ -70,9 +70,17 @@ + + + + + + + + '%s'에 대한 검색결과 %d건]]> diff --git a/modules/integration_search/skins/default/header.html b/modules/integration_search/skins/default/header.html index 12dcd5cc6..71e5aadc3 100644 --- a/modules/integration_search/skins/default/header.html +++ b/modules/integration_search/skins/default/header.html @@ -27,7 +27,7 @@
  • class="on">{$lang->integration_search}
  • class="on">{$lang->document}
  • class="on">{$lang->comment}
  • -
  • class="on">{$lang->trackback}
  • +
  • class="on">{$lang->trackback}
  • class="on">{$lang->multimedia}
  • class="on">{$lang->file}
  • diff --git a/modules/integration_search/skins/default/index.html b/modules/integration_search/skins/default/index.html index c701fd677..fb756c196 100644 --- a/modules/integration_search/skins/default/index.html +++ b/modules/integration_search/skins/default/index.html @@ -12,11 +12,13 @@ -{@ $output = $search_result['trackback'] } -{@ $search_target = 'title'; } - - - + + {@ $output = $search_result['trackback'] } + {@ $search_target = 'title'; } + + + + {@ $output = $search_result['multimedia'] } diff --git a/modules/integration_search/skins/default/trackback.html b/modules/integration_search/skins/default/trackback.html index c37a70e15..f8eefd004 100644 --- a/modules/integration_search/skins/default/trackback.html +++ b/modules/integration_search/skins/default/trackback.html @@ -3,39 +3,39 @@

    {$lang->trackback} ({number_format($output->total_count)})

    - {$lang->msg_no_result} + {$lang->msg_no_result} - - - - + + + diff --git a/modules/layout/layout.model.php b/modules/layout/layout.model.php index 858d37400..7797edf4d 100644 --- a/modules/layout/layout.model.php +++ b/modules/layout/layout.model.php @@ -289,7 +289,7 @@ class layoutModel extends layout * @param string $layout_type (P : PC, M : Mobile) * @return string path of layout */ - function getLayoutPath($layout_name, $layout_type = "P") + function getLayoutPath($layout_name = "", $layout_type = "P") { $layout_parse = explode('|@|', $layout_name); if(count($layout_parse) > 1) diff --git a/modules/layout/layout.view.php b/modules/layout/layout.view.php index 178f37a65..50b134560 100644 --- a/modules/layout/layout.view.php +++ b/modules/layout/layout.view.php @@ -316,6 +316,12 @@ class layoutView extends layout */ function dispLayoutPreview() { + if(!checkCSRF()) + { + $this->stop('msg_invalid_request'); + return new Object(-1, 'msg_invalid_request'); + } + // admin check // this act is admin view but in normal view because do not load admin css/js files $logged_info = Context::get('logged_info'); diff --git a/modules/layout/tpl/installed_layout_list.html b/modules/layout/tpl/installed_layout_list.html index 2916eb953..efbb71cd4 100644 --- a/modules/layout/tpl/installed_layout_list.html +++ b/modules/layout/tpl/installed_layout_list.html @@ -52,3 +52,5 @@
     
    + +
    diff --git a/modules/layout/tpl/layout_all_instance_list.html b/modules/layout/tpl/layout_all_instance_list.html index bcc8394e3..a6782fc14 100644 --- a/modules/layout/tpl/layout_all_instance_list.html +++ b/modules/layout/tpl/layout_all_instance_list.html @@ -43,3 +43,5 @@ + +
    diff --git a/modules/layout/tpl/layout_edit.html b/modules/layout/tpl/layout_edit.html index 86a0f5690..c180bf573 100644 --- a/modules/layout/tpl/layout_edit.html +++ b/modules/layout/tpl/layout_edit.html @@ -94,3 +94,5 @@ + +
    diff --git a/modules/layout/tpl/layout_instance_list.html b/modules/layout/tpl/layout_instance_list.html index 702ea4fca..b67cbdc8d 100644 --- a/modules/layout/tpl/layout_instance_list.html +++ b/modules/layout/tpl/layout_instance_list.html @@ -105,3 +105,5 @@ xe.lang.confirm_delete = '{$lang->confirm_delete}'; + +
    diff --git a/modules/layout/tpl/layout_modify.html b/modules/layout/tpl/layout_modify.html index 279f8196a..71b925a05 100644 --- a/modules/layout/tpl/layout_modify.html +++ b/modules/layout/tpl/layout_modify.html @@ -1,3 +1,5 @@ {$content} + +
    diff --git a/modules/member/conf/module.xml b/modules/member/conf/module.xml index e361bcec6..4d8781f14 100644 --- a/modules/member/conf/module.xml +++ b/modules/member/conf/module.xml @@ -62,8 +62,8 @@ - - + + @@ -83,6 +83,7 @@ + diff --git a/modules/member/lang/lang.xml b/modules/member/lang/lang.xml index cca3c0a20..201fd7db7 100644 --- a/modules/member/lang/lang.xml +++ b/modules/member/lang/lang.xml @@ -143,6 +143,22 @@ + + + + + + + + + + + + + + + + @@ -475,6 +491,17 @@ + + + + + + + + + + + @@ -514,7 +541,6 @@ - @@ -1094,6 +1120,18 @@ + + + + + + + + + + + + @@ -1962,6 +2000,13 @@ + + 특정 이메일 제공자(hostname, 예: naver.com, gmail.com)만 허용하거나, 특정 이메일 제공자의 사용을 제한할 수 있습니다.]]> + You can set new member's e-mail address providers. You can allow or prohibit some e-mail hosts(eg.: naver.com, gmail.com).]]> + You can set new member's e-mail address providers. You can allow or prohibit some e-mail hosts(eg.: naver.com, gmail.com).]]> + You can set new member's e-mail address providers. You can allow or prohibit some e-mail hosts(eg.: naver.com, gmail.com).]]> + You can set new member's e-mail address providers. You can allow or prohibit some e-mail hosts(eg.: naver.com, gmail.com).]]> + @@ -2009,6 +2054,17 @@ + + + + + + + + + + + @@ -2356,6 +2412,14 @@ + + + + + + + + @@ -2469,6 +2533,20 @@ + + + + + + + + + + + + + + @@ -2525,6 +2603,13 @@ + + %s개의 이메일 주소 제공자를 %s 합니다.]]> + %s %s e-mail address providers below.]]> + %s %s e-mail address providers below.]]> + %s %s e-mail address providers below.]]> + %s %s e-mail address providers below.]]> + %s개의 금지 아이디가 있습니다.]]> %s prohibited ID.]]> @@ -2629,6 +2714,13 @@ + + + + + + + @@ -2662,6 +2754,13 @@ + + + + + + + diff --git a/modules/member/m.skins/default/common_footer.html b/modules/member/m.skins/default/common_footer.html new file mode 100644 index 000000000..c63a94a2b --- /dev/null +++ b/modules/member/m.skins/default/common_footer.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modules/member/m.skins/default/common_header.html b/modules/member/m.skins/default/common_header.html new file mode 100644 index 000000000..5d824928b --- /dev/null +++ b/modules/member/m.skins/default/common_header.html @@ -0,0 +1,9 @@ + +
    + \ No newline at end of file diff --git a/modules/member/m.skins/default/css/member.css b/modules/member/m.skins/default/css/member.css index 6cccfd3d1..432f926bd 100644 --- a/modules/member/m.skins/default/css/member.css +++ b/modules/member/m.skins/default/css/member.css @@ -31,4 +31,63 @@ .xm .ba li:first-child{border:0} .xm .ba li>a, .xm .ba li>button, -.xm .ba li>input{display:block;white-space:nowrap;padding:7px 10px;text-decoration:none;color:#000;background:#f4f4f4;text-shadow:0 1px 0 #fff;overflow:hidden;text-overflow:ellipsis} \ No newline at end of file +.xm .ba li>input{display:block;white-space:nowrap;padding:7px 10px;text-decoration:none;color:#000;background:#f4f4f4;text-shadow:0 1px 0 #fff;overflow:hidden;text-overflow:ellipsis} +/* List */ +.lt{margin:0;padding:0;list-style:none;background:#f8f8f8;font-size:14px} +.lt li{border-bottom:1px solid #ccc8be;overflow:hidden} +.lt a{box-sizing: border-box;width:100%;display:inline-block;float:left;text-decoration:none;color:#000;padding:10px} +.lt .memberInfo{float:right;} +.lt .notice{display:inline-block;background:#a06acd;font-weight:bold;color:#fff;font-size:12px;padding:1px;border-radius:2px;-moz-border-radius:2px;-webkit-border-radius:2px} +.lt .title{display:block;margin:0 0 5px 0} +.lt .title strong{font-size:14px;font-weight:bold} +.lt .title em{font-size:12px;color:#333;color:#6352d2} +.lt .auth{display:block;font-size:12px} +.lt .auth .time{padding:0 5px;border-left:1px solid #bfbfbf} +/* Pagination */ +.pn{font-size:12px;text-align:center;background:#f2f0ec;padding:15px 0;border-top:1px solid #fff} +.pn a{color:#333;text-decoration:none} +.pn strong{margin:0 10px} +.pn .prev:before{content:"";display:inline-block;width:0;height:0;margin:0 4px 0 0;border:4px solid;border-color:transparent;border-right-color:#999} +.pn .next:after{content:"";display:inline-block;width:0;height:0;margin:0 0 0 4px;border:4px solid;border-color:transparent;border-left-color:#999} +/* MemberMenu */ +.xm div.mtab{ + overflow: hidden; + width:100%; + height: 52px; + white-space: nowrap; + border-bottom: 1px solid #e0e0e0; + box-sizing: border-box; +} +.xm ul.mtab{ + display: block; + list-style: outside none none; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + padding: 6px 0px 100px; + text-decoration: none; + margin: 0; +} +.xm ul.mtab>li { + display:inline-block; + height: 40px; + line-height: 18px; + position: relative; +} +.xm ul.mtab>li a { + display:inline-block; + color: #000; + font-weight: 400; + letter-spacing: -1px; + line-height: 40px; + text-decoration: none; +} +.xm ul.mtab>li a:hover, .xm ul.mtab>li.active a { + font-weight: 700; +} +.xm ul.mtab>li a span { + border-left: 1px solid #e0e0e0; + padding: 0 15px; +} +.xm ul.mtab>li:first-child a span { + border-left: 0 none; +} \ No newline at end of file diff --git a/modules/member/m.skins/default/document_list.html b/modules/member/m.skins/default/document_list.html new file mode 100644 index 000000000..cd0db8d18 --- /dev/null +++ b/modules/member/m.skins/default/document_list.html @@ -0,0 +1,18 @@ + +
    +

    {$member_title = $lang->cmd_view_own_document}

    + +
    + + {$page} / {$page_navigation->last_page} + +
    +
    + \ No newline at end of file diff --git a/modules/member/m.skins/default/member_info.html b/modules/member/m.skins/default/member_info.html index 57c2f604d..94f4b1823 100644 --- a/modules/member/m.skins/default/member_info.html +++ b/modules/member/m.skins/default/member_info.html @@ -1,35 +1,36 @@ - +
    -

    {$lang->member_info}

    -
    -

    {$XE_VALIDATOR_MESSAGE}

    -
    -
    - - - - - - - - - - - - - - - - - - - -
    {$item->title} *{$item->value}
    {$lang->member_group}{implode(', ', $memberInfo['group_list'])}
    {$lang->signup_date}{zdate($memberInfo[regdate],"Y-m-d")}
    {$lang->last_login}{zdate($memberInfo[last_login],"Y-m-d")}
    -
    - +

    {$lang->member_info}

    +
    +

    {$XE_VALIDATOR_MESSAGE}

    +
    +
    + + + + + + + + + + + + + + + + + + + +
    {$item->title} *{$item->value}
    {$lang->member_group}{implode(', ', $memberInfo['group_list'])}
    {$lang->signup_date}{zdate($memberInfo[regdate],"Y-m-d")}
    {$lang->last_login}{zdate($memberInfo[last_login],"Y-m-d")}
    +
    +
    + \ No newline at end of file diff --git a/modules/member/m.skins/default/saved_list.html b/modules/member/m.skins/default/saved_list.html new file mode 100644 index 000000000..c2a0cc3b6 --- /dev/null +++ b/modules/member/m.skins/default/saved_list.html @@ -0,0 +1,18 @@ + +
    +

    {$member_title = $lang->cmd_view_saved_document}

    + +
    + + {$page} / {$page_navigation->last_page} + +
    +
    + \ No newline at end of file diff --git a/modules/member/m.skins/default/scrapped_list.html b/modules/member/m.skins/default/scrapped_list.html new file mode 100644 index 000000000..1c1ae0cc9 --- /dev/null +++ b/modules/member/m.skins/default/scrapped_list.html @@ -0,0 +1,18 @@ + +
    +

    {$member_title = $lang->cmd_view_scrapped_document}

    + +
    + + {$page} / {$page_navigation->last_page} + +
    +
    + \ No newline at end of file diff --git a/modules/member/member.admin.controller.php b/modules/member/member.admin.controller.php index 1ef07603a..b6a89a27e 100644 --- a/modules/member/member.admin.controller.php +++ b/modules/member/member.admin.controller.php @@ -156,6 +156,7 @@ class memberAdminController extends member $args = Context::gets( 'enable_join', 'enable_confirm', + 'enable_find_account_question', 'webmaster_name', 'webmaster_email', 'password_strength', @@ -207,6 +208,7 @@ class memberAdminController extends member $args = Context::gets( 'limit_day', 'limit_day_description', + 'emailhost_check', 'agreement', 'redirect_url', 'profile_image', 'profile_image_max_width', 'profile_image_max_height', @@ -220,6 +222,7 @@ class memberAdminController extends member $all_args = Context::getRequestVars(); $args->limit_day = (int)$args->limit_day; + if($args->emailhost_check != 'allowed' && $args->emailhost_check != 'prohibited') $args->emailhost_check == 'allowed'; if(!trim(strip_tags($args->agreement))) { $agreement_file = _XE_PATH_.'files/member_extra_info/agreement_' . Context::get('lang_type') . '.txt'; @@ -237,7 +240,8 @@ class memberAdminController extends member return new Object('-1', 'msg_exist_selected_module'); } - $args->redirect_url = Context::getDefaultUrl().$redirectModuleInfo->mid; + $args->redirect_mid = $redirectModuleInfo->mid; + $args->redirect_url = getNotEncodedFullUrl('','mid',$redirectModuleInfo->mid); } $args->profile_image = $args->profile_image ? 'Y' : 'N'; @@ -254,7 +258,7 @@ class memberAdminController extends member global $lang; $signupForm = array(); $items = array('user_id', 'password', 'user_name', 'nick_name', 'email_address', 'find_account_question', 'homepage', 'blog', 'birthday', 'signature', 'profile_image', 'image_name', 'image_mark', 'profile_image_max_width', 'profile_image_max_height', 'image_name_max_width', 'image_name_max_height', 'image_mark_max_width', 'image_mark_max_height'); - $mustRequireds = array('email_address', 'nick_name', 'password', 'find_account_question'); + $mustRequireds = array('email_address', 'nick_name', 'password'); $extendItems = $oMemberModel->getJoinFormList(); foreach($list_order as $key) { @@ -408,9 +412,9 @@ class memberAdminController extends member $extendItems = $oMemberModel->getJoinFormList(); $items = array('user_id', 'password', 'user_name', 'nick_name', 'email_address', 'find_account_question', 'homepage', 'blog', 'birthday', 'signature', 'profile_image', 'image_name', 'image_mark'); - $mustRequireds = array('email_address', 'nick_name','password', 'find_account_question'); - $orgRequireds = array('email_address', 'password', 'find_account_question', 'user_id', 'nick_name', 'user_name'); - $orgUse = array('email_address', 'password', 'find_account_question', 'user_id', 'nick_name', 'user_name', 'homepage', 'blog', 'birthday'); + $mustRequireds = array('email_address', 'nick_name', 'password'); + $orgRequireds = array('email_address', 'password', 'user_id', 'nick_name', 'user_name'); + $orgUse = array('email_address', 'password', 'user_id', 'nick_name', 'user_name', 'homepage', 'blog', 'birthday'); $list_order = array(); foreach($items as $key) @@ -497,7 +501,7 @@ class memberAdminController extends member } else if($formInfo->name == 'password') { - $fields[] = ''; + $fields[] = ''; $fields[] = ''; } else if($formInfo->name == 'find_account_question') @@ -557,7 +561,7 @@ class memberAdminController extends member ''; $fields = array(); - $trans = array('email_address'=>'email', 'user_id'=> 'userid'); + $trans = array('email_address'=>'email', 'user_id'=> ''); $fields[] = sprintf('', $trans[$identifier]); $fields[] = ''; @@ -861,7 +865,7 @@ class memberAdminController extends member } $this->setMessage('success_updated'); break; - } + } case 'delete': { $oMemberController->memberInfo = null; @@ -1015,6 +1019,44 @@ class memberAdminController extends member $this->setRedirectUrl($returnUrl); } + /** + * Add allowed or denied email hostnames + * @return void + */ + function procMemberAdminUpdateManagedEmailHosts() + { + $email_hosts = Context::get('email_hosts'); + + $mode = Context::get('mode'); + $mode = $mode ? $mode : 'insert'; + + if($mode == 'delete') + { + $output = $this->deleteManagedEmailHost($email_hosts); + if(!$output->toBool()) + { + return $output; + } + $msg_code = 'success_deleted'; + $this->setMessage($msg_code); + } + else + { + $email_hosts = preg_replace('/([^a-z0-9\.\-\_\n]*)/i','',$email_hosts); + $email_hosts = array_unique(explode("\n",$email_hosts."\n")); + $success_email_hosts = array(); + foreach($email_hosts as $val) + { + $val = trim($val); + if(!$val) continue; + $output = $this->insertManagedEmailHost($val, ''); + if($output->toBool()) $success_email_hosts[] = $val; + } + + $this->add('email_hosts', implode("\n",$success_email_hosts)); + } + } + /** * Add a denied nick name * @return void @@ -1320,6 +1362,21 @@ class memberAdminController extends member return executeQuery('member.insertDeniedNickName', $args); } + /** + * Register managed Email Hostname + * @param string $email_host + * @param string $description + * @return Object + */ + function insertManagedEmailHost($email_host, $description = '') + { + $args = new stdClass(); + $args->email_host = trim(strtolower($email_host)); + $args->description = $description; + + return executeQuery('member.insertManagedEmailHost', $args); + } + /** * delete a denied id * @param string $user_id @@ -1348,6 +1405,18 @@ class memberAdminController extends member return executeQuery('member.deleteDeniedNickName', $args); } + /** + * delete a denied nick name + * @param string $email_host + * @return object + */ + function deleteManagedEmailHost($email_host) + { + $args = new stdClass(); + $args->email_host = $email_host; + return executeQuery('member.deleteManagedEmailHost', $args); + } + /** * Delete a join form * @param int $member_join_form_srl diff --git a/modules/member/member.admin.view.php b/modules/member/member.admin.view.php index f6a59dadb..ca4318ce1 100644 --- a/modules/member/member.admin.view.php +++ b/modules/member/member.admin.view.php @@ -9,14 +9,14 @@ class memberAdminView extends member { /** * Group list - * + * * @var array */ var $group_list = NULL; /** * Selected member info - * + * * @var array */ var $memberInfo = NULL; @@ -33,7 +33,7 @@ class memberAdminView extends member * * @return void */ - function init() + function init() { $oMemberModel = getModel('member'); $this->memberConfig = $oMemberModel->getMemberConfig(); @@ -43,7 +43,7 @@ class memberAdminView extends member // if member_srl exists, set memberInfo $member_srl = Context::get('member_srl'); - if($member_srl) + if($member_srl) { $this->memberInfo = $oMemberModel->getMemberInfoByMemberSrl($member_srl); if(!$this->memberInfo) @@ -141,7 +141,14 @@ class memberAdminView extends member if($config->redirect_url) { - $mid = str_ireplace(Context::getDefaultUrl(), '', $config->redirect_url); + if(!$config->redirect_mid) + { + $mid = str_ireplace(Context::getDefaultUrl(), '', $config->redirect_url); + } + else + { + $mid = $config->redirect_mid; + } $siteModuleInfo = Context::get('site_module_info'); @@ -159,6 +166,7 @@ class memberAdminView extends member // get an editor $option = new stdClass(); + $option->skin = $oEditorModel->getEditorConfig()->editor_skin; $option->primary_key_name = 'temp_srl'; $option->content_key_name = 'agreement'; $option->allow_fileupload = false; @@ -193,7 +201,13 @@ class memberAdminView extends member // get denied NickName List $deniedNickNames = $oMemberModel->getDeniedNickNames(); Context::set('deniedNickNames', $deniedNickNames); - $oSecurity->encodeHTML('deniedNickNames..nick_name'); + $oSecurity->encodeHTML('deniedNickNames..nick_name'); + + //get managed Email Hosts + $managedEmailHost = $oMemberModel->getManagedEmailHosts(); + Context::set('managedEmailHost', $managedEmailHost); + $oSecurity->encodeHTML('managedEmailHost..email_host'); + $this->setTemplateFile('signup_config'); } @@ -231,7 +245,7 @@ class memberAdminView extends member * * @return void */ - function dispMemberAdminConfigOLD() + function dispMemberAdminConfigOLD() { $oModuleModel = getModel('module'); $oMemberModel = getModel('member'); @@ -259,6 +273,7 @@ class memberAdminView extends member Context::set('editor_skin_list', $oEditorModel->getEditorSkinList()); // get an editor + $option->skin = $oEditorModel->getEditorConfig()->editor_skin; $option->primary_key_name = 'temp_srl'; $option->content_key_name = 'agreement'; $option->allow_fileupload = false; @@ -352,6 +367,7 @@ class memberAdminView extends member { $oEditorModel = getModel('editor'); $option = new stdClass(); + $option->skin = $oEditorModel->getEditorConfig()->editor_skin; $option->primary_key_name = 'member_srl'; $option->content_key_name = 'signature'; $option->allow_fileupload = false; @@ -378,7 +394,7 @@ class memberAdminView extends member } /** - * Get tags by the member info type + * Get tags by the member info type * * @param object $memberInfo * @param boolean $isAdmin (true : admin, false : not admin) @@ -615,7 +631,7 @@ class memberAdminView extends member } $replace = array_merge($extentionReplace, $replace); - $inputTag = preg_replace('@%(\w+)%@e', '$replace[$1]', $template); + $inputTag = preg_replace_callback('@%(\w+)%@', function($n) { return $replace[$n[1]]; }, $template); if($extendForm->description) $inputTag .= '

    '.$extendForm->description.'

    '; @@ -631,7 +647,7 @@ class memberAdminView extends member * * @return void */ - function dispMemberAdminGroupList() + function dispMemberAdminGroupList() { $oModuleModel = getModel('module'); $output = $oModuleModel->getModuleFileBoxList(); diff --git a/modules/member/member.class.php b/modules/member/member.class.php index 4c994af02..c16bd026f 100644 --- a/modules/member/member.class.php +++ b/modules/member/member.class.php @@ -18,7 +18,7 @@ class member extends ModuleObject { * * @return void */ - function member() + function __construct() { if(!Context::isInstalled()) return; diff --git a/modules/member/member.controller.php b/modules/member/member.controller.php index 3f879acc5..6212d6254 100644 --- a/modules/member/member.controller.php +++ b/modules/member/member.controller.php @@ -239,6 +239,23 @@ class memberController extends member break; case 'email_address' : + // Check managed Email Host + if($oMemberModel->isDeniedEmailHost($value)) + { + $config = $oMemberModel->getMemberConfig(); + $emailhost_check = $config->emailhost_check; + + $managed_email_host = Context::getLang('managed_email_host'); + + $email_hosts = $oMemberModel->getManagedEmailHosts(); + foreach ($email_hosts as $host) + { + $hosts[] = $host->email_host; + } + $message = sprintf($managed_email_host[$emailhost_check],implode(', ',$hosts),'id@'.implode(', id@',$hosts)); + return new Object(0,$message); + } + // Check if duplicated $member_srl = $oMemberModel->getMemberSrlByEmailAddress($value); if($member_srl && $logged_info->member_srl != $member_srl ) return new Object(0,'msg_exists_email_address'); @@ -356,6 +373,10 @@ class memberController extends member $this->insertImageName($args->member_srl, $image_name['tmp_name']); } + // Save Signature + $signature = Context::get('signature'); + $this->putSignature($args->member_srl, $signature); + // If a virtual site, join the site $site_module_info = Context::get('site_module_info'); if($site_module_info->site_srl > 0) @@ -1051,6 +1072,10 @@ class memberController extends member { $oMemberModel = getModel('member'); $config = $oMemberModel->getMemberConfig(); + if($config->enable_find_account_question != 'Y') + { + return new Object(-1, 'msg_question_not_allowed'); + } $email_address = Context::get('email_address'); $user_id = Context::get('user_id'); @@ -1251,7 +1276,7 @@ class memberController extends member $oMail->setTitle( Context::getLang('msg_confirm_account_title') ); $oMail->setContent($content); $oMail->setSender( $member_config->webmaster_name?$member_config->webmaster_name:'webmaster', $member_config->webmaster_email); - $oMail->setReceiptor( $args->user_name, $args->email_address ); + $oMail->setReceiptor( $member_info->user_name, $member_info->email_address ); $oMail->send(); $msg = sprintf(Context::getLang('msg_confirm_mail_sent'), $args->email_address); @@ -1670,7 +1695,7 @@ class memberController extends member $args->ipaddress = $_SERVER['REMOTE_ADDR']; // check identifier - if($config->identifier == 'email_address') + if($config->identifier == 'email_address' || strpos($user_id, '@') !== false) { // Get user_id information $this->memberInfo = $oMemberModel->getMemberInfoByEmailAddress($user_id); @@ -1988,6 +2013,22 @@ class memberController extends member return new Object(-1,'msg_exists_nick_name'); } + // Check managed Email Host + if($oMemberModel->isDeniedEmailHost($args->email_address)) + { + $config = $oMemberModel->getMemberConfig(); + $emailhost_check = $config->emailhost_check; + + $managed_email_host = Context::getLang('managed_email_host'); + $email_hosts = $oMemberModel->getManagedEmailHosts(); + foreach ($email_hosts as $host) + { + $hosts[] = $host->email_host; + } + $message = sprintf($managed_email_host[$emailhost_check],implode(', ',$hosts),'id@'.implode(', id@',$hosts)); + return new Object(-1, $message); + } + // Check if email address is duplicate $member_srl = $oMemberModel->getMemberSrlByEmailAddress($args->email_address); if($member_srl) @@ -2133,6 +2174,22 @@ class memberController extends member $output = executeQuery('member.getMemberInfoByMemberSrl', $args); $orgMemberInfo = $output->data; + // Check managed Email Host + if($oMemberModel->isDeniedEmailHost($args->email_address)) + { + $config = $oMemberModel->getMemberConfig(); + $emailhost_check = $config->emailhost_check; + + $managed_email_host = Context::getLang('managed_email_host'); + $email_hosts = $oMemberModel->getManagedEmailHosts(); + foreach ($email_hosts as $host) + { + $hosts[] = $host->email_host; + } + $message = sprintf($managed_email_host[$emailhost_check],implode(', ',$hosts),'id@'.implode(', id@',$hosts)); + return new Object(-1, $message); + } + // Check if email address or user ID is duplicate if($config->identifier == 'email_address') { @@ -2455,6 +2512,23 @@ class memberController extends member if(!$newEmail) return $this->stop('msg_invalid_request'); $oMemberModel = getModel('member'); + // Check managed Email Host + if($oMemberModel->isDeniedEmailHost($newEmail)) + { + $config = $oMemberModel->getMemberConfig(); + $emailhost_check = $config->emailhost_check; + + $managed_email_host = Context::getLang('managed_email_host'); + $email_hosts = $oMemberModel->getManagedEmailHosts(); + foreach ($email_hosts as $host) + { + $hosts[] = $host->email_host; + } + $message = sprintf($managed_email_host[$emailhost_check],implode(', ',$hosts),'id@'.implode(', id@',$hosts)); + return new Object(-1, $message); + } + + // Check if the e-mail address is already registered $member_srl = $oMemberModel->getMemberSrlByEmailAddress($newEmail); if($member_srl) return new Object(-1,'msg_exists_email_address'); diff --git a/modules/member/member.mobile.php b/modules/member/member.mobile.php index 9f441826d..41a7e4b89 100644 --- a/modules/member/member.mobile.php +++ b/modules/member/member.mobile.php @@ -67,6 +67,11 @@ class memberMobile extends memberView Context::set('oMemberInfo', get_object_vars($this->member_info)); } } + + function dispMemberScrappedDocument() + { + parent::dispMemberScrappedDocument(); + } } /* End of file member.mobile.php */ /* Location: ./modules/member/member.mobile.php */ diff --git a/modules/member/member.model.php b/modules/member/member.model.php index e7c90c264..3a38c2f72 100644 --- a/modules/member/member.model.php +++ b/modules/member/member.model.php @@ -66,12 +66,19 @@ class memberModel extends member if(!$config->identifier) $config->identifier = 'user_id'; + if(!$config->emailhost_check) $config->emailhost_check = 'allowed'; + if(!$config->max_error_count) $config->max_error_count = 10; if(!$config->max_error_count_time) $config->max_error_count_time = 300; if(!$config->signature_editor_skin || $config->signature_editor_skin == 'default') $config->signature_editor_skin = 'ckeditor'; if(!$config->sel_editor_colorset) $config->sel_editor_colorset = 'moono'; + if($config->redirect_mid) + { + $config->redirect_url = getNotEncodedFullUrl('','mid',$config->redirect_mid); + } + $member_config = $config; return $config; @@ -196,8 +203,17 @@ class memberModel extends member { return true; } + elseif(filter_var($_SESSION['ipaddress'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) + { + // IPv6: require same /48 + if(strncmp(inet_pton($_SESSION['ipaddress']), inet_pton($_SERVER['REMOTE_ADDR']), 6) == 0) + { + return true; + } + } else { + // IPv4: require same /24 if(ip2long($_SESSION['ipaddress']) >> 8 == ip2long($_SERVER['REMOTE_ADDR']) >> 8) { return true; @@ -205,7 +221,10 @@ class memberModel extends member } } - $_SESSION['is_logged'] = false; + if(Context::getSessionStatus()) + { + $_SESSION['is_logged'] = false; + } return false; } @@ -246,7 +265,7 @@ class memberModel extends member return $logged_info; } - return NULL; + return new stdClass; } /** @@ -300,7 +319,7 @@ class memberModel extends member */ function getMemberInfoByMemberSrl($member_srl, $site_srl = 0, $columnList = array()) { - if(!$member_srl) return; + if(!$member_srl) return new stdClass; //columnList size zero... get full member info if(!$GLOBALS['__member_info__'][$member_srl] || count($columnList) == 0) @@ -321,10 +340,10 @@ class memberModel extends member $args = new stdClass(); $args->member_srl = $member_srl; $output = executeQuery('member.getMemberInfoByMemberSrl', $args, $columnList); - if(!$output->data) + if(!$output->data) { if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key, new stdClass); - return; + return new stdClass; } $this->arrangeMemberInfo($output->data, $site_srl); @@ -840,6 +859,20 @@ class memberModel extends member return $output->data; } + function getManagedEmailHosts() + { + static $output; + if(isset($output->data)) return $output->data; + $output = executeQueryArray('member.getManagedEmailHosts'); + if(!$output->toBool()) + { + $output->data = array(); + return array(); + } + + return $output->data; + } + /** * @brief Verify if ID is denied */ @@ -867,6 +900,49 @@ class memberModel extends member } return false; } + + /** + * @brief Verify if email_host from email_address is denied + */ + function isDeniedEmailHost($email_address) + { + $email_address = trim($email_address); + $oMemberModel = &getModel('member'); + $config = $oMemberModel->getMemberConfig(); + $emailhost_check = $config->emailhost_check; + $managedHosts = $oMemberModel->getManagedEmailHosts(); + if(count($managedHosts) < 1) return FALSE; + + static $return; + if(!isset($return[$email_address])) + { + $email = explode('@',$email_address); + $email_hostname = $email[1]; + if(!$email_hostname) return TRUE; + + foreach($managedHosts as $managedHost) + { + if($managedHost->email_host && strtolower($managedHost->email_host) == strtolower($email_hostname)) + { + $return[$email_address] = TRUE; + } + } + if(!$return[$email_address]) + { + $return[$email_address] = FALSE; + } + } + + if($emailhost_check == 'prohibited') + { + return $return[$email_address]; + } + else + { + return (!$return[$email_address]); + } + } + /** * @brief Get information of the profile image */ @@ -885,7 +961,7 @@ class memberModel extends member $info = new stdClass(); $info->width = $width; $info->height = $height; - $info->src = Context::getRequestUri().$image_name_file; + $info->src = Context::getRequestUri().$image_name_file . '?' . date('YmdHis', filemtime($image_name_file)); $info->file = './'.$image_name_file; $GLOBALS['__member_info__']['profile_image'][$member_srl] = $info; break; @@ -910,7 +986,7 @@ class memberModel extends member $info = new stdClass; $info->width = $width; $info->height = $height; - $info->src = Context::getRequestUri().$image_name_file; + $info->src = Context::getRequestUri().$image_name_file. '?' . date('YmdHis', filemtime($image_name_file)); $info->file = './'.$image_name_file; $GLOBALS['__member_info__']['image_name'][$member_srl] = $info; } @@ -932,7 +1008,7 @@ class memberModel extends member list($width, $height, $type, $attrs) = getimagesize($image_mark_file); $info->width = $width; $info->height = $height; - $info->src = Context::getRequestUri().$image_mark_file; + $info->src = Context::getRequestUri().$image_mark_file . '?' . date('YmdHis', filemtime($image_mark_file)); $info->file = './'.$image_mark_file; $GLOBALS['__member_info__']['image_mark'][$member_srl] = $info; } @@ -1096,7 +1172,7 @@ class memberModel extends member case 'low': if($length < 4) return false; - break; + break; } return true; diff --git a/modules/member/member.view.php b/modules/member/member.view.php index eaf6f1ec6..8a21d6e67 100644 --- a/modules/member/member.view.php +++ b/modules/member/member.view.php @@ -209,6 +209,29 @@ class memberView extends member $formTags = $oMemberAdminView->_getMemberInputTag($member_info); Context::set('formTags', $formTags); + + // Editor of the module set for signing by calling getEditor + foreach($formTags as $formTag) { + if($formTag->name=='signature') { + $oEditorModel = getModel('editor'); + $option = new stdClass(); + $option->primary_key_name = 'member_srl'; + $option->content_key_name = 'signature'; + $option->allow_fileupload = false; + $option->enable_autosave = false; + $option->enable_default_component = true; + $option->enable_component = false; + $option->resizable = false; + $option->disable_html = true; + $option->height = 100; + $option->skin = $member_config->signature_editor_skin; + $option->colorset = $member_config->sel_editor_colorset; + $editor = $oEditorModel->getEditor($member_info->member_srl, $option); + Context::set('editor', $editor); + } + } + + global $lang; $identifierForm = new stdClass(); $identifierForm->title = $lang->{$member_config->identifier}; @@ -529,6 +552,7 @@ class memberView extends member $config = $this->member_config; Context::set('identifier', $config->identifier); + Context::set('enable_find_account_question', $config->enable_find_account_question); $this->setTemplateFile('find_member_account'); } diff --git a/modules/member/queries/deleteManagedEmailHost.xml b/modules/member/queries/deleteManagedEmailHost.xml new file mode 100644 index 000000000..edb3b99de --- /dev/null +++ b/modules/member/queries/deleteManagedEmailHost.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/modules/member/queries/getManagedEmailHosts.xml b/modules/member/queries/getManagedEmailHosts.xml new file mode 100644 index 000000000..2000d4158 --- /dev/null +++ b/modules/member/queries/getManagedEmailHosts.xml @@ -0,0 +1,8 @@ + + +
    + + + + + \ No newline at end of file diff --git a/modules/member/queries/insertManagedEmailHost.xml b/modules/member/queries/insertManagedEmailHost.xml new file mode 100644 index 000000000..87f2bd9f7 --- /dev/null +++ b/modules/member/queries/insertManagedEmailHost.xml @@ -0,0 +1,10 @@ + + +
    + + + + + + + \ No newline at end of file diff --git a/modules/member/ruleset/leaveMember.xml b/modules/member/ruleset/leaveMember.xml index 332ab7264..4bdbc9c9a 100644 --- a/modules/member/ruleset/leaveMember.xml +++ b/modules/member/ruleset/leaveMember.xml @@ -3,6 +3,6 @@ - + diff --git a/modules/member/ruleset/modifyPassword.xml b/modules/member/ruleset/modifyPassword.xml index 3182758d0..8fa32ed99 100644 --- a/modules/member/ruleset/modifyPassword.xml +++ b/modules/member/ruleset/modifyPassword.xml @@ -3,8 +3,8 @@ - - - + + + diff --git a/modules/member/ruleset/signup.xml b/modules/member/ruleset/signup.xml index 74b592132..ba39a6cd5 100644 --- a/modules/member/ruleset/signup.xml +++ b/modules/member/ruleset/signup.xml @@ -4,8 +4,8 @@ - - + + diff --git a/modules/member/schemas/member_managed_email_hosts.xml b/modules/member/schemas/member_managed_email_hosts.xml new file mode 100644 index 000000000..d10421826 --- /dev/null +++ b/modules/member/schemas/member_managed_email_hosts.xml @@ -0,0 +1,5 @@ +
    + + + +
    \ No newline at end of file diff --git a/modules/member/skins/default/find_member_account.html b/modules/member/skins/default/find_member_account.html index bba843e46..2e3ce1123 100644 --- a/modules/member/skins/default/find_member_account.html +++ b/modules/member/skins/default/find_member_account.html @@ -18,8 +18,8 @@
    -
    -
    +
    +

    {$lang->cmd_find_member_account_with_email_question}

    {$lang->about_find_account_question}

    diff --git a/modules/member/skins/default/modify_info.html b/modules/member/skins/default/modify_info.html index f28b11dbd..f09eefd3a 100644 --- a/modules/member/skins/default/modify_info.html +++ b/modules/member/skins/default/modify_info.html @@ -27,7 +27,7 @@
    - +
    {$formTag->inputTag}
    {$editor} diff --git a/modules/member/skins/default/signup_form.html b/modules/member/skins/default/signup_form.html index 274a32c5d..cc6788c4e 100644 --- a/modules/member/skins/default/signup_form.html +++ b/modules/member/skins/default/signup_form.html @@ -41,9 +41,17 @@
    -
    +
    -
    {$formTag->inputTag}
    +
    {$formTag->inputTag}
    +
    + + {$editor} + +
    {$lang->allow_mailing}
    diff --git a/modules/member/tpl/default_config.html b/modules/member/tpl/default_config.html index d04032437..3bce7c7ee 100644 --- a/modules/member/tpl/default_config.html +++ b/modules/member/tpl/default_config.html @@ -20,6 +20,14 @@

    {$lang->about_enable_confirm}

    +
    +
    {$lang->enable_find_account_question}
    +
    + + +

    {$lang->about_enable_find_account_question}

    +
    +
    {$lang->cmd_config_password_strength}
    @@ -80,3 +88,5 @@
    + +
    diff --git a/modules/member/tpl/design_config.html b/modules/member/tpl/design_config.html index a656e75fb..f1f37e83f 100644 --- a/modules/member/tpl/design_config.html +++ b/modules/member/tpl/design_config.html @@ -50,3 +50,5 @@ + +
    diff --git a/modules/member/tpl/group_list.html b/modules/member/tpl/group_list.html index 55ae4585e..410ca70c6 100644 --- a/modules/member/tpl/group_list.html +++ b/modules/member/tpl/group_list.html @@ -15,7 +15,7 @@

    {$XE_VALIDATOR_MESSAGE}

    -
    + @@ -103,3 +103,5 @@

    {$lang->add_group_image_mark}: {$lang->link_file_box}

    + +
    diff --git a/modules/member/tpl/insert_member.html b/modules/member/tpl/insert_member.html index 0991f6adc..2d39c5305 100644 --- a/modules/member/tpl/insert_member.html +++ b/modules/member/tpl/insert_member.html @@ -129,3 +129,5 @@ }); })(jQuery); + +
    diff --git a/modules/member/tpl/js/signup_config.js b/modules/member/tpl/js/signup_config.js index 37619e1bb..eb0c6b17b 100644 --- a/modules/member/tpl/js/signup_config.js +++ b/modules/member/tpl/js/signup_config.js @@ -17,7 +17,7 @@ function doUpdateDeniedID(user_id, mode, message) { } /* prohibited nick name functions */ -function doUpdateDeniedNickName(nick_name, mode, message) +function doUpdateDeniedNickName(nick_name, mode, message) { if(typeof(message)!='undefined' && !confirm(message)) return; @@ -35,8 +35,27 @@ function doUpdateDeniedNickName(nick_name, mode, message) ); } +/* managed E-mail Address functions */ +function doUpdateManagedEmailHost(email_host, mode, message) +{ + if(typeof(message)!='undefined' && !confirm(message)) return; + + exec_xml( + 'member', + 'procMemberAdminUpdateManagedEmailHosts', + {email_hosts:email_host, mode:mode, email_hosts_count:jQuery('#managedEmailHost li').length}, + function(){ + if (mode == 'delete'){ + jQuery('#managed_'+email_host.replace(/\./g,'\_\_')).remove(); + jQuery('._managededEmailHostCount').html(jQuery('#managedEmailHost li').length); + } + }, + ['error','message','tpl'] + ); +} + jQuery(function($){ - // hide form if enable_join is setted "No" + // hide form if enable_join is setted "No" var suForm = $('table.__join_form'); // 회원가입 양식 function changeTable($i) @@ -66,6 +85,7 @@ jQuery(function($){ suForm.find(':checkbox[name="usable_list[]"]').each(function(){ var $i = $(this); + if($i.val() == 'find_account_question') return; $i.change(function(){ changeTable($i); @@ -96,7 +116,7 @@ jQuery(function($){ if (!confirm(xe.lang.msg_delete_extend_form)) return; var memberFormSrl = $(event.target).parent().attr('id'); - var targetTR = $(event.target).closest('tr'); + var targetTR = $(event.target).closest('tr'); exec_xml( 'member', @@ -111,7 +131,7 @@ jQuery(function($){ $('button._addDeniedID').click(function(){ var ids = $('#prohibited_id').val(); - if(ids == ''){ + if(ids == ''){ alert(xe.lang.msg_null_prohibited_id); $('#prohibited_id').focus(); return; @@ -136,11 +156,40 @@ jQuery(function($){ jQuery.exec_json('member.procMemberAdminInsertDeniedID', {'user_id': ids}, on_complete); + }); + $('button._addManagedEmailHost').click(function(){ + var hosts = $('#manage_email_host').val(); + if(hosts == ''){ + alert(xe.lang.msg_null_managed_emailhost); + $('#manage_email_host').focus(); + return; + } + + var tag; + function on_complete(data) + { + $('#manage_email_host').val(''); + + var hosts = $.trim(data.email_hosts); + if(hosts == '') return; + var uids = hosts.split("\n"); + for (var i=0; i'+uids[i]+' '; + $('#managedEmailHost').append($(tag)); + } + + $('._managededEmailHostCount').html($('#managedEmailHost li').length); + } + + $.exec_json('member.procMemberAdminUpdateManagedEmailHosts', {'email_hosts': hosts}, on_complete); + }); $('button._addDeniedNickName').click(function(){ var ids = $('#prohibited_nick_name').val(); - if(ids == ''){ + if(ids == ''){ alert(xe.lang.msg_null_prohibited_nick_name); $('#prohibited_nick_name').focus(); return; @@ -195,7 +244,7 @@ jQuery(function($){ $notCheckedTR.find('th').html('
    '+$notCheckedTR.find('th ._title').html()+'
    '); $notCheckedTR.removeClass('sticky'); - // add sticky class + // add sticky class } }); diff --git a/modules/member/tpl/login_config.html b/modules/member/tpl/login_config.html index 4a7d811d4..7daba7170 100644 --- a/modules/member/tpl/login_config.html +++ b/modules/member/tpl/login_config.html @@ -62,3 +62,5 @@ jQuery(function($){ }).change(); }); + +
    diff --git a/modules/member/tpl/member_list.html b/modules/member/tpl/member_list.html index 921a188b3..606073ab2 100644 --- a/modules/member/tpl/member_list.html +++ b/modules/member/tpl/member_list.html @@ -30,6 +30,7 @@ {$lang->email} {$title} + {$lang->status} {$lang->signup_date} {$lang->last_login} {$lang->member_group} @@ -47,6 +48,7 @@ {@ $member_info['group_list'] = implode(', ', $member_info['group_list'])} {$member_info[$name]} + {$lang->denied}{$lang->approval} {zdate($member_info['regdate'], 'Y-m-d')} {zdate($member_info['last_login'], 'Y-m-d')} {$member_info['group_list']}  @@ -202,3 +204,5 @@ jQuery(function($){ }); }); + +
    diff --git a/modules/member/tpl/signup_config.html b/modules/member/tpl/signup_config.html index 3694ba5b6..8f0a56e84 100644 --- a/modules/member/tpl/signup_config.html +++ b/modules/member/tpl/signup_config.html @@ -7,6 +7,7 @@ xe.lang.cmd_delete = '{$lang->cmd_delete}'; xe.lang.msg_null_prohibited_id = '{$lang->msg_null_prohibited_id}'; xe.lang.msg_null_prohibited_nick_name = '{$lang->msg_null_prohibited_nick_name}'; + xe.lang.msg_null_managed_emailhost = '{$lang->msg_null_managed_emailhost}'; xe.lang.msg_exists_user_id= '{$lang->msg_exists_user_id}'; @@ -23,6 +24,24 @@ + +
    + +
    +
    +

    {$lang->about_emailhost_check}

    +
    + + +

    {@ if($config->emailhost_check =='prohibited') $emailhost_check = $lang->cmd_prohibited; else $emailhost_check = $lang->cmd_allowed;}{sprintf($lang->count_manage_email_host, count($managedEmailHost), $emailhost_check)}

    +
      +
    • {$emailInfo->email_host}
    • +
    + + +

    {$lang->multi_line_input}

    +
    +
    @@ -30,7 +49,7 @@
    • {$nicknameInfo->nick_name}
    - +

    {$lang->multi_line_input}

    @@ -198,3 +217,5 @@ #userDefine{max-width:60%;margin-left:-30%} } + +
    diff --git a/modules/menu/menu.admin.controller.php b/modules/menu/menu.admin.controller.php index bd4105a18..84a6cbfaf 100644 --- a/modules/menu/menu.admin.controller.php +++ b/modules/menu/menu.admin.controller.php @@ -103,7 +103,7 @@ class menuAdminController extends menu $output->add('menuSrl', $args->menu_srl); return $output; } - + function linkAllModuleInstancesToSitemap() { $unlinked_modules = false; @@ -114,7 +114,7 @@ class menuAdminController extends menu { $unlinked_modules = $output->data; } - + if($unlinked_modules) { $unlinked_menu_srl = $this->getUnlinkedMenu(); @@ -122,7 +122,7 @@ class menuAdminController extends menu } } - + function getUnlinkedMenu() { // 'unlinked' menu 존재여부 확인 @@ -139,7 +139,7 @@ class menuAdminController extends menu unset($moduleConfig->unlinked_menu_srl); } } - + if(!$moduleConfig->unlinked_menu_srl) { $output = $this->addMenu('unlinked', 0); @@ -154,10 +154,10 @@ class menuAdminController extends menu return false; } } - + return $moduleConfig->unlinked_menu_srl; } - + /** * insert menu when not linked module. * @@ -172,7 +172,7 @@ class menuAdminController extends menu { return new Object(-1, 'msg_invalid_request'); } - + foreach($moduleInfos as $moduleInfo) { // search menu. @@ -180,9 +180,9 @@ class menuAdminController extends menu $args->url = $moduleInfo->mid; $args->site_srl = $moduleInfo->site_srl; $args->is_shortcut = 'N'; - + $output = executeQuery('menu.getMenuItemByUrl', $args); - + if($output->toBool() && $output->data) { $moduleInfo->menu_srl = $output->data->menu_srl; @@ -195,7 +195,7 @@ class menuAdminController extends menu $item_args->name = $moduleInfo->mid; $item_args->menu_item_srl = getNextSequence(); $item_args->listorder = -1*$item_args->menu_item_srl; - + $output = executeQuery('menu.insertMenuItem', $item_args); if(!$output->toBool()) { @@ -203,9 +203,9 @@ class menuAdminController extends menu } $moduleInfo->menu_srl = $menuSrl; } - + $output = executeQuery('module.updateModule', $moduleInfo); - + return $output; } @@ -214,14 +214,14 @@ class menuAdminController extends menu { $oCacheHandler->invalidateGroupKey('site_and_module'); } - + $oMenuAdminController = getAdminController('menu'); $oMenuAdminController->makeXmlFile($menuSrl); - + return new Object(); } - - + + /** * Change the menu title @@ -418,7 +418,7 @@ class menuAdminController extends menu // recreate menu cache file $this->makeXmlFile($request->menu_srl); - + if(!$isProc) { return $this->get('menu_item_srl'); @@ -504,7 +504,7 @@ class menuAdminController extends menu $args->is_shortcut = $request->is_shortcut; $args->url = '#'; } - + if($request->menu_desc) $args->desc = $request->menu_desc; else $args->desc = ''; @@ -539,7 +539,7 @@ class menuAdminController extends menu if($request->menu_name_key) $args->name = $request->menu_name_key; else $args->name = $request->menu_name; - + if($request->menu_desc) $args->desc = $request->menu_desc; else $args->desc = ''; @@ -616,7 +616,7 @@ class menuAdminController extends menu { $cmArgs->use_mobile = 'Y'; } - + // if mid is empty, auto create mid if(!$request->module_id) { @@ -725,14 +725,14 @@ class menuAdminController extends menu { $args->name = $request->menu_name; } - + if($request->menu_desc) $args->desc = $request->menu_desc; else $args->desc = ''; - + unset($args->group_srls); $args->open_window = $request->menu_open_window; $args->expand = $request->menu_expand; - $output = executeQuery('menu.updateMenuItem', $args); + $output = $this->_updateMenuItem($args); $this->makeXmlFile($args->menu_srl); @@ -790,7 +790,7 @@ class menuAdminController extends menu $item_info->active_btn = ''; } - $output = executeQuery('menu.updateMenuItem', $item_info); + $output = $this->_updateMenuItem($item_info); // recreate menu cache file $this->makeXmlFile($args->menu_srl); @@ -798,13 +798,20 @@ class menuAdminController extends menu public function updateMenuItem($itemInfo) { - $output = executeQuery('menu.updateMenuItem', $itemInfo); + $output = $this->_updateMenuItem($itemInfo); // recreate menu cache file $this->makeXmlFile($itemInfo->menu_srl); return $output; } + public function _updateMenuItem($itemInfo) + { + $output = executeQuery('menu.updateMenuItem', $itemInfo); + + return $output; + } + /** * Delete menu item(menu of the menu) * @return void|Object @@ -961,7 +968,7 @@ class menuAdminController extends menu { $output->data->url = ''; $referenceItem = $output->data; - $output = executeQuery('menu.updateMenuItem', $referenceItem); + $output = $this->_updateMenuItem($referenceItem); if(!$output->toBool()) { $oDB->rollback(); @@ -1017,7 +1024,9 @@ class menuAdminController extends menu // get original menu item info for cache file recreate $originalItemInfo = $oMenuAdminModel->getMenuItemInfo($target_srl); - if(!$originalItemInfo->menu_item_srl) + $targetMenuInfo = $oMenuAdminModel->getMenu($target_srl); + $targetMenuItemInfo = $oMenuAdminModel->getMenuItemInfo($target_srl); + if(!$originalItemInfo->menu_item_srl || (!$targetMenuInfo->menu_srl && !$targetMenuItemInfo->menu_item_srl)) { return new Object(-1, 'msg_empty_menu_item'); } @@ -1085,7 +1094,7 @@ class menuAdminController extends menu $args = new stdClass(); $args->menu_srl = $menu_srl; $args->menu_item_srl = $node['node_srl']; - $output = executeQuery('menu.updateMenuItemNode', $args); + $output = $this->_updateMenuItem($args); //module's menu_srl move also if($node['is_shortcut'] == 'N' && !empty($node['url'])) @@ -1249,7 +1258,7 @@ class menuAdminController extends menu $update_item_info->normal_btn = $copied_info['normal_btn']; $update_item_info->hover_btn = $copied_info['hover_btn']; $update_item_info->active_btn = $copied_info['active_btn']; - executeQuery('menu.updateMenuItem', $update_item_info); + $output = $this->_updateMenuItem($update_item_info); } $this->insertedMenuItemSrlList[] = $insertedMenuItemSrl; } @@ -1629,7 +1638,7 @@ class menuAdminController extends menu // Update if exists if($item_info->menu_item_srl == $args->menu_item_srl) { - $output = executeQuery('menu.updateMenuItem', $args); + $output = $this->_updateMenuItem($args); if(!$output->toBool()) return $output; } // Insert if not exist @@ -1680,7 +1689,7 @@ class menuAdminController extends menu if($exposure) $args->group_srls = implode(',', $exposure); } - $output = executeQuery('menu.updateMenuItem', $args); + $output = $this->_updateMenuItem($args); if(!$output->toBool()) { return $output; diff --git a/modules/menu/tpl/sitemap.html b/modules/menu/tpl/sitemap.html index f5fa8a25b..30c8b8e0c 100644 --- a/modules/menu/tpl/sitemap.html +++ b/modules/menu/tpl/sitemap.html @@ -352,6 +352,8 @@
    + + @@ -3797,7 +3799,9 @@ jQuery(function($){ function installPackage(sPackageSrl, sPackageType, $item){ //act=getAutoinstallAdminIsAuthed - $.exec_json("admin.getAutoinstallAdminIsAuthed", {}, function(htData){ + var params = {}; + params.package_srl = sPackageSrl; + $.exec_json("admin.getAutoinstallAdminIsAuthed", params, function(htData){ // FTP 비밀번호 뿐만 아니라 정보가 전혀 없을 경우? switch(htData.is_authed){ case -1: @@ -4120,3 +4124,6 @@ jQuery.extend({ }); //]]> + +
    +
    diff --git a/modules/module/module.controller.php b/modules/module/module.controller.php index de217b10b..8a7f1e9d5 100644 --- a/modules/module/module.controller.php +++ b/modules/module/module.controller.php @@ -209,6 +209,20 @@ class moduleController extends module return $this->insertModuleConfig($module, $origin_config, $site_srl); } + function updateModulePartConfig($module, $module_srl, $config) + { + $oModuleModel = getModel('module'); + $origin_config = $oModuleModel->getModulePartConfig($module, $module_srl); + + if(!$origin_config) $origin_config = new stdClass; + foreach($config as $key => $val) + { + $origin_config->{$key} = $val; + } + + return $this->insertModulePartConfig($module, $module_srl, $origin_config); + } + /** * @brief Enter a specific set of modules * In order to manage global configurations of modules such as board, member and so on @@ -441,7 +455,9 @@ class moduleController extends module unset($output); - if($isMenuCreate == TRUE) + $args->browser_title = strip_tags($args->browser_title); + + if($isMenuCreate === TRUE) { $menuArgs = new stdClass; $menuArgs->menu_srl = $args->menu_srl; @@ -476,8 +492,8 @@ class moduleController extends module } } - $args->menu_srl = $menuArgs->menu_srl; // Insert a module + $args->menu_srl = $menuArgs->menu_srl; $output = executeQuery('module.insertModule', $args); if(!$output->toBool()) { @@ -505,6 +521,15 @@ class moduleController extends module */ function updateModule($args) { + if(isset($args->isMenuCreate)) + { + $isMenuCreate = $args->isMenuCreate; + } + else + { + $isMenuCreate = TRUE; + } + $output = $this->arrangeModuleInfo($args, $extra_vars); if(!$output->toBool()) return $output; // begin transaction @@ -521,6 +546,8 @@ class moduleController extends module if(!$args->browser_title) $args->browser_title = $module_info->browser_title; } + $args->browser_title = strip_tags($args->browser_title); + $output = executeQuery('module.isExistsModuleName', $args); if(!$output->toBool() || $output->data->count) { @@ -567,22 +594,25 @@ class moduleController extends module return $output; } - $menuArgs = new stdClass; - $menuArgs->url = $module_info->mid; - $menuArgs->site_srl = $module_info->site_srl; - $menuOutput = executeQueryArray('menu.getMenuItemByUrl', $menuArgs); - if($menuOutput->data && count($menuOutput->data)) + if($isMenuCreate === TRUE) { - $oMenuAdminController = getAdminController('menu'); - foreach($menuOutput->data as $itemInfo) + $menuArgs = new stdClass; + $menuArgs->url = $module_info->mid; + $menuArgs->site_srl = $module_info->site_srl; + $menuOutput = executeQueryArray('menu.getMenuItemByUrl', $menuArgs); + if($menuOutput->data && count($menuOutput->data)) { - $itemInfo->url = $args->mid; - - $updateMenuItemOutput = $oMenuAdminController->updateMenuItem($itemInfo); - if(!$updateMenuItemOutput->toBool()) + $oMenuAdminController = getAdminController('menu'); + foreach($menuOutput->data as $itemInfo) { - $oDB->rollback(); - return $updateMenuItemOutput; + $itemInfo->url = $args->mid; + + $updateMenuItemOutput = $oMenuAdminController->updateMenuItem($itemInfo); + if(!$updateMenuItemOutput->toBool()) + { + $oDB->rollback(); + return $updateMenuItemOutput; + } } } } @@ -977,7 +1007,7 @@ class moduleController extends module } } - $oDB->commit; + $oDB->commit(); return new Object(); } diff --git a/modules/module/module.model.php b/modules/module/module.model.php index e5b8097f3..9f74c0397 100644 --- a/modules/module/module.model.php +++ b/modules/module/module.model.php @@ -77,7 +77,7 @@ class moduleModel extends module } /** - * @brief Get the defaul mid according to the domain + * @brief Get the default mid according to the domain */ function getDefaultMid() { @@ -1381,7 +1381,7 @@ class moduleModel extends module $args->site_srl = $site_srl; $output = executeQuery('module.getModuleConfig', $args); if($output->data->config) $config = unserialize($output->data->config); - else $config = null; + else $config = new stdClass; //insert in cache if($oCacheHandler->isSupport()) diff --git a/modules/module/tpl/adminFileBox.html b/modules/module/tpl/adminFileBox.html index 7173737a2..ff209ea07 100644 --- a/modules/module/tpl/adminFileBox.html +++ b/modules/module/tpl/adminFileBox.html @@ -116,3 +116,5 @@
    + +
    diff --git a/modules/module/tpl/category_list.html b/modules/module/tpl/category_list.html index 91c15adf3..4a25830aa 100644 --- a/modules/module/tpl/category_list.html +++ b/modules/module/tpl/category_list.html @@ -58,3 +58,5 @@ + +
    diff --git a/modules/module/tpl/category_update_form.html b/modules/module/tpl/category_update_form.html index a91f3ad73..deb204e85 100644 --- a/modules/module/tpl/category_update_form.html +++ b/modules/module/tpl/category_update_form.html @@ -20,3 +20,4 @@ +
    diff --git a/modules/module/tpl/module_list.html b/modules/module/tpl/module_list.html index bbb989d8d..fcd075303 100644 --- a/modules/module/tpl/module_list.html +++ b/modules/module/tpl/module_list.html @@ -59,4 +59,6 @@ jQuery(function($){ $('.dsTg>tbody>tr[data-type1]').prependTo('tbody'); $('.dsTg>tbody>tr[data-type2]').prependTo('tbody'); }); - \ No newline at end of file + + +
    diff --git a/modules/point/point.admin.controller.php b/modules/point/point.admin.controller.php index 38355d119..ecfce13f6 100644 --- a/modules/point/point.admin.controller.php +++ b/modules/point/point.admin.controller.php @@ -50,6 +50,8 @@ class pointAdminController extends point $config->download_file = (int)$args->download_file; $config->voted = (int)$args->voted; $config->blamed = (int)$args->blamed; + $config->voted_comment = (int)$args->voted_comment; + $config->blamed_comment = (int)$args->blamed_comment; // The highest level $config->max_level = $args->max_level; if($config->max_level>1000) $config->max_level = 1000; @@ -62,10 +64,10 @@ class pointAdminController extends point // Check if reading a document is not allowed if($args->disable_read_document == 'Y') $config->disable_read_document = 'Y'; else $config->disable_read_document = 'N'; - + $oMemberModel = getModel('member'); $group_list = $oMemberModel->getGroups(); - + // Per-level group configurations foreach($group_list as $group) { @@ -83,7 +85,7 @@ class pointAdminController extends point } //if group level is lower than 1, change to 1 - if($args->{'point_group_'.$group_srl} < 1) + if($args->{'point_group_'.$group_srl} && $args->{'point_group_'.$group_srl} < 1) { $args->{'point_group_'.$group_srl} = 1; } @@ -132,7 +134,7 @@ class pointAdminController extends point { $args = Context::getRequestVars(); - $configTypeList = array('insert_document', 'insert_comment', 'upload_file', 'download_file', 'read_document', 'voted', 'blamed'); + $configTypeList = array('insert_document', 'insert_comment', 'upload_file', 'download_file', 'read_document', 'voted', 'blamed', 'voted_comment', 'blamed_comment'); foreach($configTypeList AS $config) { if(is_array($args->{$config})) @@ -186,6 +188,8 @@ class pointAdminController extends point $config['read_document'] = (int)Context::get('read_document'); $config['voted'] = (int)Context::get('voted'); $config['blamed'] = (int)Context::get('blamed'); + $config['voted_comment'] = (int)Context::get('voted_comment'); + $config['blamed_comment'] = (int)Context::get('blamed_comment'); $oModuleController->insertModulePartConfig('point', $srl, $config); } diff --git a/modules/point/point.class.php b/modules/point/point.class.php index 7894854f8..2fbc28999 100644 --- a/modules/point/point.class.php +++ b/modules/point/point.class.php @@ -65,12 +65,34 @@ class point extends ModuleObject // Vote up / Vote down $config->voted = 0; $config->blamed = 0; + // Comment Vote up / Comment Vote down + $config->voted_comment = 0; + $config->blamed_comment = 0; // Save configurations $oModuleController->insertModuleConfig('point', $config); // Cash act list for faster execution $oPointController = getAdminController('point'); $oPointController->cacheActList(); - + // Add a trigger for registration/insert document/insert comment/upload a file/download + $oModuleController->insertTrigger('member.insertMember', 'point', 'controller', 'triggerInsertMember', 'after'); + $oModuleController->insertTrigger('document.insertDocument', 'point', 'controller', 'triggerInsertDocument', 'after'); + $oModuleController->insertTrigger('document.deleteDocument', 'point', 'controller', 'triggerBeforeDeleteDocument', 'before'); + $oModuleController->insertTrigger('document.deleteDocument', 'point', 'controller', 'triggerDeleteDocument', 'after'); + $oModuleController->insertTrigger('comment.insertComment', 'point', 'controller', 'triggerInsertComment', 'after'); + $oModuleController->insertTrigger('comment.deleteComment', 'point', 'controller', 'triggerDeleteComment', 'after'); + $oModuleController->insertTrigger('file.insertFile', 'point', 'controller', 'triggerInsertFile', 'after'); + $oModuleController->insertTrigger('file.deleteFile', 'point', 'controller', 'triggerDeleteFile', 'after'); + $oModuleController->insertTrigger('file.downloadFile', 'point', 'controller', 'triggerBeforeDownloadFile', 'before'); + $oModuleController->insertTrigger('file.downloadFile', 'point', 'controller', 'triggerDownloadFile', 'after'); + $oModuleController->insertTrigger('member.doLogin', 'point', 'controller', 'triggerAfterLogin', 'after'); + $oModuleController->insertTrigger('module.dispAdditionSetup', 'point', 'view', 'triggerDispPointAdditionSetup', 'after'); + $oModuleController->insertTrigger('document.updateReadedCount', 'point', 'controller', 'triggerUpdateReadedCount', 'after'); + // Add a trigger for voting up and down 2008.05.13 haneul + $oModuleController->insertTrigger('document.updateVotedCount', 'point', 'controller', 'triggerUpdateVotedCount', 'after'); + // Add a trigger for using points for permanent saving of a temporarily saved document 2009.05.19 zero + $oModuleController->insertTrigger('document.updateDocument', 'point', 'controller', 'triggerUpdateDocument', 'before'); + // Add a trigger for comment voting up and down 2014.08.30 sejin7940 + $oModuleController->insertTrigger('comment.updateVotedCount', 'point', 'controller', 'triggerUpdateVotedCount', 'after'); return new Object(); } @@ -107,8 +129,10 @@ class point extends ModuleObject // 2012. 08. 29 Add a trigger to copy additional setting when the module is copied if(!$oModuleModel->getTrigger('module.procModuleAdminCopyModule', 'point', 'controller', 'triggerCopyModule', 'after')) return true; - } + // Add a trigger for comment voting up and down 2014.08.30 sejin7940 + if(!$oModuleModel->getTrigger('comment.updateVotedCount', 'point', 'controller', 'triggerUpdateVotedCount', 'after')) return true; + } return false; } @@ -158,6 +182,15 @@ class point extends ModuleObject { $oModuleController->insertTrigger('module.procModuleAdminCopyModule', 'point', 'controller', 'triggerCopyModule', 'after'); } + // Add a trigger for comment voting up and down 2014.08.30 sejin7940 + if(!$oModuleModel->getTrigger('comment.updateVotedCount', 'point', 'controller', 'triggerUpdateVotedCount', 'after')) + { + $config = $oModuleModel->getModuleConfig('point'); + $config->voted_comment = 0; + $config->blamed_comment = 0; + $oModuleController->insertModuleConfig('point', $config); + $oModuleController->insertTrigger('comment.updateVotedCount', 'point', 'controller', 'triggerUpdateVotedCount', 'after'); + } return new Object(0, 'success_updated'); } diff --git a/modules/point/point.controller.php b/modules/point/point.controller.php index 3337b5514..45b8d3f34 100644 --- a/modules/point/point.controller.php +++ b/modules/point/point.controller.php @@ -187,32 +187,37 @@ class pointController extends point */ function triggerDeleteDocument(&$obj) { - $module_srl = $obj->module_srl; - $member_srl = $obj->member_srl; - // The process related to clearing the post object - if(!$module_srl || !$member_srl) return new Object(); - // Run only when logged in - $logged_info = Context::get('logged_info'); - if(!$logged_info->member_srl) return new Object(); - // Get the points of the member - $oPointModel = getModel('point'); - $cur_point = $oPointModel->getPoint($member_srl, true); - // Get the point module information - $oModuleModel = getModel('module'); - $config = $oModuleModel->getModuleConfig('point'); - $module_config = $oModuleModel->getModulePartConfig('point', $module_srl); - - $point = $module_config['insert_document']; - if(strlen($point) == 0 && !is_int($point)) $point = $config->insert_document; - // if the point is set to decrease when writing a document, make sure it does not increase the points when deleting an article - if($point < 0) return new Object(); - $cur_point -= $point; - // Add points related to deleting an attachment - $point = $module_config['upload_file']; - if(strlen($point) == 0 && !is_int($point)) $point = $config->upload_file; - if($obj->uploaded_count) $cur_point -= $point * $obj->uploaded_count; - // Increase the point - $this->setPoint($member_srl,$cur_point); + $oDocumentModel = getModel('document'); + + if($obj->status != $oDocumentModel->getConfigStatus('temp')) + { + $module_srl = $obj->module_srl; + $member_srl = $obj->member_srl; + // The process related to clearing the post object + if(!$module_srl || !$member_srl) return new Object(); + // Run only when logged in + $logged_info = Context::get('logged_info'); + if(!$logged_info->member_srl) return new Object(); + // Get the points of the member + $oPointModel = getModel('point'); + $cur_point = $oPointModel->getPoint($member_srl, true); + // Get the point module information + $oModuleModel = getModel('module'); + $config = $oModuleModel->getModuleConfig('point'); + $module_config = $oModuleModel->getModulePartConfig('point', $module_srl); + + $point = $module_config['insert_document']; + if(strlen($point) == 0 && !is_int($point)) $point = $config->insert_document; + // if the point is set to decrease when writing a document, make sure it does not increase the points when deleting an article + if($point < 0) return new Object(); + $cur_point -= $point; + // Add points related to deleting an attachment + $point = $module_config['upload_file']; + if(strlen($point) == 0 && !is_int($point)) $point = $config->upload_file; + if($obj->uploaded_count) $cur_point -= $point * $obj->uploaded_count; + // Increase the point + $this->setPoint($member_srl,$cur_point); + } return new Object(); } @@ -459,15 +464,32 @@ class pointController extends point if( $obj->point > 0 ) { - $point = $module_config['voted']; - if(strlen($point) == 0 && !is_int($point)) $point = $config->voted; + if($obj->comment_srl) + { + $point = $module_config['voted_comment']; + if(strlen($point) == 0 && !is_int($point)) $point = $config->voted_comment; + } + else + { + $point = $module_config['voted']; + if(strlen($point) == 0 && !is_int($point)) $point = $config->voted; + } } else { - $point = $module_config['blamed']; - if(strlen($point) == 0 && !is_int($point)) $point = $config->blamed; + if($obj->comment_srl) + { + $point = $module_config['blamed_comment']; + if(strlen($point) == 0 && !is_int($point)) $point = $config->blamed_comment; + } + else + { + $point = $module_config['blamed']; + if(strlen($point) == 0 && !is_int($point)) $point = $config->blamed; + } } + if(!$point) return new Object(); // Increase the point $cur_point += $point; diff --git a/modules/point/point.view.php b/modules/point/point.view.php index 2fc1bb312..089323630 100644 --- a/modules/point/point.view.php +++ b/modules/point/point.view.php @@ -48,6 +48,8 @@ class pointView extends point $module_config['read_document'] = $config->read_document; $module_config['voted'] = $config->voted; $module_config['blamed'] = $config->blamed; + $module_config['voted_comment'] = $config->voted_comment; + $module_config['blamed_comment'] = $config->blamed_comment; } } diff --git a/modules/point/tpl/config.html b/modules/point/tpl/config.html index b9a79cb68..8a6b42cfe 100644 --- a/modules/point/tpl/config.html +++ b/modules/point/tpl/config.html @@ -58,6 +58,12 @@
    : +
    + : + +
    + : +
    @@ -190,4 +196,6 @@ jQuery(function($){ } }); }); - \ No newline at end of file + + +
    diff --git a/modules/point/tpl/member_list.html b/modules/point/tpl/member_list.html index 447944c6d..0228696fc 100644 --- a/modules/point/tpl/member_list.html +++ b/modules/point/tpl/member_list.html @@ -145,3 +145,5 @@ + +
    diff --git a/modules/point/tpl/module_config.html b/modules/point/tpl/module_config.html index 07ee02cba..243e67eba 100644 --- a/modules/point/tpl/module_config.html +++ b/modules/point/tpl/module_config.html @@ -18,6 +18,8 @@ {$lang->point_read_document} {$lang->point_voted} {$lang->point_blamed} + {$lang->comment} {$lang->point_voted} + {$lang->comment} {$lang->point_blamed} @@ -30,6 +32,8 @@ {$config->point_name} {$config->point_name} {$config->point_name} + {$config->point_name} + {$config->point_name} @@ -37,3 +41,5 @@
    + +
    diff --git a/modules/point/tpl/point_module_config.html b/modules/point/tpl/point_module_config.html index 81273df1c..0fda279e4 100644 --- a/modules/point/tpl/point_module_config.html +++ b/modules/point/tpl/point_module_config.html @@ -50,6 +50,18 @@ {$module_config['point_name']} +
    + +
    + {$module_config['point_name']} +
    +
    +
    + +
    + {$module_config['point_name']} +
    +
    diff --git a/modules/poll/tpl/poll_list.html b/modules/poll/tpl/poll_list.html index b0aae9a12..91e8f4aae 100644 --- a/modules/poll/tpl/poll_list.html +++ b/modules/poll/tpl/poll_list.html @@ -124,3 +124,5 @@ jQuery(function($){ }); }); + +
    diff --git a/modules/rss/tpl/rss_admin_index.html b/modules/rss/tpl/rss_admin_index.html index 9055e894e..4342492c6 100644 --- a/modules/rss/tpl/rss_admin_index.html +++ b/modules/rss/tpl/rss_admin_index.html @@ -122,3 +122,5 @@ jQuery(function($){ }); }); + +
    diff --git a/modules/session/session.class.php b/modules/session/session.class.php index aeb7f6cea..b88baf45d 100644 --- a/modules/session/session.class.php +++ b/modules/session/session.class.php @@ -13,7 +13,7 @@ class session extends ModuleObject var $lifetime = 18000; var $session_started = false; - function session() + function __construct() { if(Context::isInstalled()) $this->session_started= true; } diff --git a/modules/spamfilter/tpl/footer.html b/modules/spamfilter/tpl/footer.html index e69de29bb..30961915b 100644 --- a/modules/spamfilter/tpl/footer.html +++ b/modules/spamfilter/tpl/footer.html @@ -0,0 +1 @@ +
    diff --git a/modules/trash/tpl/trash_list.html b/modules/trash/tpl/trash_list.html index 802f5b69e..04b66db88 100644 --- a/modules/trash/tpl/trash_list.html +++ b/modules/trash/tpl/trash_list.html @@ -165,3 +165,5 @@ jQuery(function($){ }); }); + +
    diff --git a/modules/trash/tpl/trash_view.html b/modules/trash/tpl/trash_view.html index b1292c1a9..64c29d652 100644 --- a/modules/trash/tpl/trash_view.html +++ b/modules/trash/tpl/trash_view.html @@ -75,3 +75,4 @@
    +
    diff --git a/modules/widget/tpl/downloaded_widget_list.html b/modules/widget/tpl/downloaded_widget_list.html index d33afbe22..920ed0f10 100644 --- a/modules/widget/tpl/downloaded_widget_list.html +++ b/modules/widget/tpl/downloaded_widget_list.html @@ -39,3 +39,5 @@ + +
    diff --git a/modules/widget/tpl/widget_generate_code.html b/modules/widget/tpl/widget_generate_code.html index 044278e22..c9e400ec9 100644 --- a/modules/widget/tpl/widget_generate_code.html +++ b/modules/widget/tpl/widget_generate_code.html @@ -17,3 +17,5 @@

    + +

    diff --git a/tests/unit/FuncIncTest.class.php b/tests/unit/FuncIncTest.class.php deleted file mode 100644 index 265e6b072..000000000 --- a/tests/unit/FuncIncTest.class.php +++ /dev/null @@ -1,53 +0,0 @@ -

    IFrame

    ', - '
    <iframe src="path/to/file.html"></iframe>

    IFrame

    ' - ), - // expression - array( - '
    ', - '
    ' - ), - // no quotes and no semicolon - http://ha.ckers.org/xss.html - array( - '', - '' - ), - // embedded encoded tab to break up XSS - http://ha.ckers.org/xss.html - array( - '', - '' - ), - // issue 178 - array( - "", - '' - ), - // issue 534 - array( - '*/" onerror="console.log(\'Yet another XSS\')">', - '*/" onerror="console.log(\'Yet another XSS\')">' - ), - // issue 602 - array( - 'test', - 'test' - ) - ); - } - - /** - * @dataProvider provider - */ - public function testXss($source, $expected) - { - $result = removeHackTag($source); - $this->assertEquals($result, $expected); - } -} diff --git a/tests/unit/FuncIncTest.php b/tests/unit/FuncIncTest.php index bb7e86fa7..de22cbd30 100644 --- a/tests/unit/FuncIncTest.php +++ b/tests/unit/FuncIncTest.php @@ -29,7 +29,7 @@ class FuncIncTest extends \Codeception\TestCase\Test ), // issue 178 array( - "", + '', 'invalid.jpg' ), // issue 534 @@ -41,6 +41,23 @@ class FuncIncTest extends \Codeception\TestCase\Test array( 'test', '' + ), + // issue #1813 https://github.com/xpressengine/xe-core/issues/1813 + array( + 'dummy', + 'dummy' + ), + array( + 'dummy', + 'dummy' + ), + array( + "\"dummy\"", + 'dummy' + ), + array( + "\"dummy\"", + 'dummy' ) ); } diff --git a/tests/unit/classes/template/TemplateHandlerTest.php b/tests/unit/classes/template/TemplateHandlerTest.php index daece9612..4ec211c6c 100644 --- a/tests/unit/classes/template/TemplateHandlerTest.php +++ b/tests/unit/classes/template/TemplateHandlerTest.php @@ -33,7 +33,7 @@ class TemplateHandlerTest extends \Codeception\TestCase\Test // foreach loop array( '', - '?>
      arr&&count($__Context->arr))foreach($__Context->arr as $__Context->key=>$__Context->val){ ?>
    • Link
        arr2&&count($__Context->arr2))foreach($__Context->arr2 as $__Context->key2=>$__Context->val2){ ?>
    ' + '?>
      arr;if($tba7582b53a5d9d2bfecc5c52511ef7ee&&count($tba7582b53a5d9d2bfecc5c52511ef7ee))foreach($tba7582b53a5d9d2bfecc5c52511ef7ee as $__Context->key=>$__Context->val){ ?>
    • Link
        arr2;if($tf92ab3139c8d388f9a5f63e0fdd8f516&&count($tf92ab3139c8d388f9a5f63e0fdd8f516))foreach($tf92ab3139c8d388f9a5f63e0fdd8f516 as $__Context->key2=>$__Context->val2){ ?>
    ' ), // while loop array( @@ -183,7 +183,7 @@ class TemplateHandlerTest extends \Codeception\TestCase\Test // issue 135 array( '

    {$key}

    Loop block {$val}
    ', - PHP_EOL . 'if($__Context->_m_list_all&&count($__Context->_m_list_all))foreach($__Context->_m_list_all as $__Context->key=>$__Context->val){ ?>

    key ?>

    Loop block val ?>
    ' + PHP_EOL . '$t1b443c9e474abcf95c0ff70798d10a4c=$__Context->_m_list_all;if($t1b443c9e474abcf95c0ff70798d10a4c&&count($t1b443c9e474abcf95c0ff70798d10a4c))foreach($t1b443c9e474abcf95c0ff70798d10a4c as $__Context->key=>$__Context->val){ ?>

    key ?>

    Loop block val ?>
    ' ), // issue 136 array( @@ -193,17 +193,17 @@ class TemplateHandlerTest extends \Codeception\TestCase\Test // issue 188 array( '
    Hello, world!
    ', - PHP_EOL . 'if($__Context->ii < $__Context->nn){;'.PHP_EOL.'if($__Context->dummy&&count($__Context->dummy))foreach($__Context->dummy as $__Context->k=>$__Context->v){ ?>
    Hello, world!
    ' + PHP_EOL . 'if($__Context->ii < $__Context->nn){;' . PHP_EOL . '$te536ab402425aa07f37ece1808639b07=$__Context->dummy;if($te536ab402425aa07f37ece1808639b07&&count($te536ab402425aa07f37ece1808639b07))foreach($te536ab402425aa07f37ece1808639b07 as $__Context->k=>$__Context->v){ ?>
    Hello, world!
    ' ), // issue 190 array( '
    Hello, world!
    ', - PHP_EOL . 'if(!($__Context->i >= $__Context->n)){;'.PHP_EOL.'if($__Context->dummy&&count($__Context->dummy))foreach($__Context->dummy as $__Context->k=>$__Context->v){ ?>
    Hello, world!
    ' + PHP_EOL . 'if(!($__Context->i >= $__Context->n)){;' . PHP_EOL . '$tcf235db237866cd5f280e0a7fdb2dca8=$__Context->dummy;if($tcf235db237866cd5f280e0a7fdb2dca8&&count($tcf235db237866cd5f280e0a7fdb2dca8))foreach($tcf235db237866cd5f280e0a7fdb2dca8 as $__Context->k=>$__Context->v){ ?>
    Hello, world!
    ' ), // issue 183 array( ''."\n".'
    {$vvv}
    CD
    ', - '?>vvvls&&count($__Context->vvvls))foreach($__Context->vvvls as $__Context->vvv){ ?>'."\n".'
    vvv ?>
    CD
    ' + '?>vvvls;if($t605f930a4a05d6efbed70a9059f688fe&&count($t605f930a4a05d6efbed70a9059f688fe))foreach($t605f930a4a05d6efbed70a9059f688fe as $__Context->vvv){ ?>'."\n".'
    vvv ?>
    CD
    ' ), // issue 512 - ignores array(