From 6cb8b77f290e0b104750e22f5f8594330a598709 Mon Sep 17 00:00:00 2001 From: Kimura Youichi Date: Mon, 17 Jan 2011 22:49:55 +0900 Subject: [PATCH 001/630] added opWidgetFormDateTime (fixes #1873) --- lib/widget/opWidgetFormDateTime.class.php | 28 +++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 lib/widget/opWidgetFormDateTime.class.php diff --git a/lib/widget/opWidgetFormDateTime.class.php b/lib/widget/opWidgetFormDateTime.class.php new file mode 100644 index 000000000..3bea86357 --- /dev/null +++ b/lib/widget/opWidgetFormDateTime.class.php @@ -0,0 +1,28 @@ + + */ +class opWidgetFormDateTime extends sfWidgetFormI18nDateTime +{ + /** + * @see sfWidgetFormI18nDateTime + */ + public function getDateWidget($attributes = array()) + { + return new opWidgetFormDate(array_merge(array('culture' => $this->getOption('culture')), $this->getOptionsFor('date')), $this->getAttributesFor('date', $attributes)); + } +} + From 543738d5db90a786d51beb421c08cea9dbfafb4c Mon Sep 17 00:00:00 2001 From: watanabe Date: Wed, 8 Feb 2012 08:58:52 +0900 Subject: [PATCH 002/630] (fixes #2408) add patch to symfony-1.4.13 and patch not to unescape using get_partial/include_partial --- data/patches/t2408.patch | 14 ++++++++++++++ lib/vendor/symfony/lib/helper/PartialHelper.php | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 data/patches/t2408.patch diff --git a/data/patches/t2408.patch b/data/patches/t2408.patch new file mode 100644 index 000000000..bf9f74cb0 --- /dev/null +++ b/data/patches/t2408.patch @@ -0,0 +1,14 @@ +diff --git a/lib/vendor/symfony/lib/helper/PartialHelper.php b/lib/vendor/symfony/lib/helper/PartialHelper.php +index e5aac3d..9bfb4e1 100644 +--- a/lib/vendor/symfony/lib/helper/PartialHelper.php ++++ b/lib/vendor/symfony/lib/helper/PartialHelper.php +@@ -213,7 +213,7 @@ function get_partial($templateName, $vars = array()) + + $class = sfConfig::get('mod_'.strtolower($moduleName).'_partial_view_class', 'sf').'PartialView'; + $view = new $class($context, $moduleName, $actionName, ''); +- $view->setPartialVars(true === sfConfig::get('sf_escaping_strategy') ? sfOutputEscaper::unescape($vars) : $vars); ++ $view->setPartialVars($vars); + + return $view->render(); + } + diff --git a/lib/vendor/symfony/lib/helper/PartialHelper.php b/lib/vendor/symfony/lib/helper/PartialHelper.php index e5aac3d3b..9bfb4e11b 100644 --- a/lib/vendor/symfony/lib/helper/PartialHelper.php +++ b/lib/vendor/symfony/lib/helper/PartialHelper.php @@ -213,7 +213,7 @@ function get_partial($templateName, $vars = array()) $class = sfConfig::get('mod_'.strtolower($moduleName).'_partial_view_class', 'sf').'PartialView'; $view = new $class($context, $moduleName, $actionName, ''); - $view->setPartialVars(true === sfConfig::get('sf_escaping_strategy') ? sfOutputEscaper::unescape($vars) : $vars); + $view->setPartialVars($vars); return $view->render(); } From 87e003c5cdbb36b1aeccc23ee16e6b46d05feac6 Mon Sep 17 00:00:00 2001 From: Kimura Youichi Date: Mon, 19 Mar 2012 16:14:00 +0900 Subject: [PATCH 003/630] Revert (#2275) "use option 'date_format_range_error' in opValidatorDate" This reverts commit b6045142184085971062775555cf48d3db34de56. --- lib/util/opFormItemGenerator.class.php | 1 - lib/validator/opValidatorDate.class.php | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/util/opFormItemGenerator.class.php b/lib/util/opFormItemGenerator.class.php index ea2ac2abe..1895c2f9b 100644 --- a/lib/util/opFormItemGenerator.class.php +++ b/lib/util/opFormItemGenerator.class.php @@ -233,7 +233,6 @@ public static function generateValidator($field, $choices = array()) if ($field['FormType'] === 'date') { - $option['date_format_range_error'] = 'Y-m-d'; $obj = new opValidatorDate($option); return $obj; } diff --git a/lib/validator/opValidatorDate.class.php b/lib/validator/opValidatorDate.class.php index cc82bf438..cfc3bb976 100644 --- a/lib/validator/opValidatorDate.class.php +++ b/lib/validator/opValidatorDate.class.php @@ -56,7 +56,7 @@ protected function doClean($value) $max = new DateTime($this->getOption('max')); if ($max && $clean->format('U') > $max->format('U')) { - throw new sfValidatorError($this, 'max', array('max' => $max->format($this->getOption('date_format_range_error')))); + throw new sfValidatorError($this, 'max', array('max' => $max->format('Y-m-d'))); } } @@ -65,7 +65,7 @@ protected function doClean($value) $min = new DateTime($this->getOption('min')); if ($min && $clean->format('U') < $min->format('U')) { - throw new sfValidatorError($this, 'min', array('min' => $min->format($this->getOption('date_format_range_error')))); + throw new sfValidatorError($this, 'min', array('min' => $min->format('Y-m-d'))); } } From 46954c93eb22a9a21f926e140e33a7a4f4dde3c4 Mon Sep 17 00:00:00 2001 From: Kimura Youichi Date: Mon, 19 Mar 2012 16:15:27 +0900 Subject: [PATCH 004/630] Revert (#2261) "Removes the last line feed in the base64-encoded data before passing it to base64_decode($data, true)." This reverts commit fcab4cf56ff5532f6e5fef518da08d0c2926a753. --- lib/util/opMailMessage.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/util/opMailMessage.class.php b/lib/util/opMailMessage.class.php index f49af912b..819c337c8 100644 --- a/lib/util/opMailMessage.class.php +++ b/lib/util/opMailMessage.class.php @@ -65,7 +65,7 @@ private static function saveBase64ImageInTempDir($content) $tmppath = tempnam(sys_get_temp_dir(), 'IMG'); $fh = fopen($tmppath, 'w'); - fwrite($fh, base64_decode(rtrim($content), true)); + fwrite($fh, base64_decode($content, true)); fclose($fh); return $tmppath; From 0bfea8f1fa24cc9c28d41a15a73923acd865ee09 Mon Sep 17 00:00:00 2001 From: Kimura Youichi Date: Mon, 19 Mar 2012 16:15:43 +0900 Subject: [PATCH 005/630] Revert (#2261) "Avoid an image being read as a base64-encoded text when it is posted via e-mail and its content-type is image/*" This reverts commit 5cbd2e46763a087ec35f380bcd93b9ab123e526a. --- lib/util/opMailMessage.class.php | 44 +++++++++----------------------- 1 file changed, 12 insertions(+), 32 deletions(-) diff --git a/lib/util/opMailMessage.class.php b/lib/util/opMailMessage.class.php index 819c337c8..3da417aa1 100644 --- a/lib/util/opMailMessage.class.php +++ b/lib/util/opMailMessage.class.php @@ -50,46 +50,20 @@ public function getContent() return $content; } - elseif ('text/plain' === strtok($this->getPart(0)->contentType, ';')) - { - return mb_convert_encoding(parent::getContent(), 'UTF-8', 'JIS'); - } - else - { - return ''; - } - } - private static function saveBase64ImageInTempDir($content) - { - $tmppath = tempnam(sys_get_temp_dir(), 'IMG'); - - $fh = fopen($tmppath, 'w'); - fwrite($fh, base64_decode($content, true)); - fclose($fh); - - return $tmppath; + return mb_convert_encoding(parent::getContent(), 'UTF-8', 'JIS'); } public function getImages() { - $images = array(); - $allowTypes = array('image/jpeg', 'image/png', 'image/gif'); - if (!$this->isMultiPart()) { - $type = strtok($this->getPart(0)->contentType, ';'); - if (in_array($type, $allowTypes)) - { - $image[] = array( - 'tmp_name' => self::saveBase64ImageInTempDir(parent::getContent()), - 'type' => $type, - ); - } - - return $images; + return array(); } + $images = array(); + $allowTypes = array('image/jpeg', 'image/png', 'image/gif'); + $current = $this->key(); $this->rewind(); @@ -98,8 +72,14 @@ public function getImages() $tok = strtok($part->contentType, ';'); if (in_array($tok, $allowTypes)) { + $tmppath = tempnam(sys_get_temp_dir(), 'IMG'); + + $fh = fopen($tmppath, 'w'); + fwrite($fh, base64_decode($part->getContent(), true)); + fclose($fh); + $images[] = array( - 'tmp_name' => self::saveBase64ImageInTempDir($part->getContent()), + 'tmp_name' => $tmppath, 'type' => $tok, ); } From 6106266c62c30a13cd447974a6b783dca2b10aaa Mon Sep 17 00:00:00 2001 From: Kimura Youichi Date: Mon, 19 Mar 2012 16:16:18 +0900 Subject: [PATCH 006/630] Revert (#2104) "fixed "IsTrim" option" This reverts commit 9a9d99dd054733b5a296a0885bb4ff605f7d06a9. --- lib/config/config/sns_config.yml | 8 -------- lib/util/opFormItemGenerator.class.php | 2 +- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/lib/config/config/sns_config.yml b/lib/config/config/sns_config.yml index b26fe8e4b..a869abe0e 100644 --- a/lib/config/config/sns_config.yml +++ b/lib/config/config/sns_config.yml @@ -26,7 +26,6 @@ general: ValueType: "email" Default: "sns@example.com" IsRequired: true - IsTrim: true enable_pc: Name: "enable_pc" @@ -34,7 +33,6 @@ general: FormType: "radio" ValueType: "text" IsRequired: true - IsTrim: true Default: 1 Choices: - "使用しない" @@ -46,7 +44,6 @@ general: FormType: "radio" ValueType: "text" IsRequired: true - IsTrim: true Default: 1 Choices: - "使用しない" @@ -70,7 +67,6 @@ general: ValueType: "regexp" ValueRegexp: "/^[1-9]\d*[K|M]?$/" IsRequired: true - IsTrim: true Default: "300K" daily_news_day: @@ -193,7 +189,6 @@ external_login_page: ValueType: "text" Default: "" IsRequired: false - IsTrim: true external_mobile_login_url: Name: "external_mobile_login_url" @@ -203,7 +198,6 @@ external_login_page: ValueType: "text" Default: "" IsRequired: false - IsTrim: true authentication: _attributes: @@ -317,7 +311,6 @@ api_keys: FormType: "text" ValueType: "string" IsRequired: false - IsTrim: true Default: "" google_AJAX_search_api_key: Name: "google AJAX search api key" @@ -325,5 +318,4 @@ api_keys: FormType: "text" ValueType: "string" IsRequired: false - IsTrim: true Default: "" diff --git a/lib/util/opFormItemGenerator.class.php b/lib/util/opFormItemGenerator.class.php index 1895c2f9b..d400d2256 100644 --- a/lib/util/opFormItemGenerator.class.php +++ b/lib/util/opFormItemGenerator.class.php @@ -159,7 +159,7 @@ public static function generateWidget($field, $choices = array()) public static function generateValidator($field, $choices = array()) { $field = self::arrayKeyCamelize($field); - $option = array('required' => $field['IsRequired'], 'trim' => $field['IsTrim']); + $option = array('required' => $field['IsRequired'], 'trim' => $field['IsRequired']); if (!$choices && !empty($field['Choices'])) { From cc8ea818f66bc399435a58d83eae0091b2d0c2ad Mon Sep 17 00:00:00 2001 From: Kimura Youichi Date: Mon, 19 Mar 2012 16:16:49 +0900 Subject: [PATCH 007/630] Revert (#2089) "fixed description of class file" This reverts commit cf16768ec4e8bc6b62fdb121d033e5bc169e4d21. --- lib/validator/opValidatorImageSize.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/validator/opValidatorImageSize.class.php b/lib/validator/opValidatorImageSize.class.php index 04e24c655..6bfc2c9ac 100644 --- a/lib/validator/opValidatorImageSize.class.php +++ b/lib/validator/opValidatorImageSize.class.php @@ -9,7 +9,7 @@ */ /** - * opValidatorImageSize validates a image size + * opValidatorImageFile validates a date * * @package OpenPNE * @subpackage validator From 12ac5cbb3c01d613fb0ecbfb74e52fa26beb3a4d Mon Sep 17 00:00:00 2001 From: Kimura Youichi Date: Mon, 19 Mar 2012 16:19:15 +0900 Subject: [PATCH 008/630] Revert (#2089) "added the image max size of the mobile to the pc_backend" This reverts commit 0e6df5a238b75abc84f9a3b1d378410646f871b8. Conflicts: apps/pc_backend/i18n/messages.ja.xml --- .../templates/configImageSuccess.php | 2 +- .../templates/deleteImageSuccess.php | 2 +- .../friend/templates/showImageSuccess.php | 2 +- .../member/templates/configImageSuccess.php | 2 +- .../member/templates/deleteImageSuccess.php | 2 +- apps/pc_backend/i18n/messages.ja.xml | 4 -- lib/config/config/sns_config.yml | 8 ---- lib/util/opFormItemGenerator.class.php | 3 -- lib/validator/opValidatorImageSize.class.php | 43 ------------------- 9 files changed, 5 insertions(+), 63 deletions(-) delete mode 100644 lib/validator/opValidatorImageSize.class.php diff --git a/apps/mobile_frontend/modules/community/templates/configImageSuccess.php b/apps/mobile_frontend/modules/community/templates/configImageSuccess.php index 7cc934247..0a1b272cf 100644 --- a/apps/mobile_frontend/modules/community/templates/configImageSuccess.php +++ b/apps/mobile_frontend/modules/community/templates/configImageSuccess.php @@ -3,7 +3,7 @@ getImageFileName()): ?> getFile(), array('size' => '120x120', 'format' => 'jpg')) ?>
getFile(), array('size' => opConfig::get('mobile_image_max_size'), 'format' => 'jpg'))), + link_to(__('Expansion'), sf_image_path($community->getFile(), array('size' => '320x320', 'format' => 'jpg'))), link_to(__('Delete'), '@community_deleteImage?id='.$community->getId()) ) ?>

diff --git a/apps/mobile_frontend/modules/community/templates/deleteImageSuccess.php b/apps/mobile_frontend/modules/community/templates/deleteImageSuccess.php index 842ada04e..c47219918 100644 --- a/apps/mobile_frontend/modules/community/templates/deleteImageSuccess.php +++ b/apps/mobile_frontend/modules/community/templates/deleteImageSuccess.php @@ -3,7 +3,7 @@
">
getImageFileName(), array('size' => '120x120', 'format' => 'jpg')) ?>
-getImageFileName(), array('size' => opConfig::get('mobile_image_max_size'), 'format' => 'jpg')))) ?>
+getImageFileName(), array('size' => '320x320', 'format' => 'jpg')))) ?>

"> getFile(), array('size' => '120x120', 'format' => 'jpg')) ?>
-getFile(), array('size' => opConfig::get('mobile_image_max_size'), 'format' => 'jpg'))).']' ?>

+getFile(), array('size' => '320x320', 'format' => 'jpg'))).']' ?>

diff --git a/apps/mobile_frontend/modules/member/templates/configImageSuccess.php b/apps/mobile_frontend/modules/member/templates/configImageSuccess.php index f27bc9853..a2c05cae0 100644 --- a/apps/mobile_frontend/modules/member/templates/configImageSuccess.php +++ b/apps/mobile_frontend/modules/member/templates/configImageSuccess.php @@ -7,7 +7,7 @@ getCSRFFieldName().'='.$form->getCSRFToken() ?> getFile(), array('size' => '120x120', 'format' => 'jpg')) ?>
-getFile(), array('size' => opConfig::get('mobile_image_max_size'), 'format' => 'jpg')))) ?>
+getFile(), array('size' => '320x320', 'format' => 'jpg')))) ?>
getIsPrimary()) { diff --git a/apps/mobile_frontend/modules/member/templates/deleteImageSuccess.php b/apps/mobile_frontend/modules/member/templates/deleteImageSuccess.php index 52e09f654..764736b57 100644 --- a/apps/mobile_frontend/modules/member/templates/deleteImageSuccess.php +++ b/apps/mobile_frontend/modules/member/templates/deleteImageSuccess.php @@ -3,7 +3,7 @@
">
getFile(), array('size' => '120x120', 'format' => 'jpg')) ?>
-getFile(), array('size' => opConfig::get('mobile_image_max_size'), 'format' => 'jpg')))) ?>
+getFile(), array('size' => '320x320', 'format' => 'jpg')))) ?>

"> Are you sure you want to delete this %community%? 本当にこの%community%を削除してもよろしいですか? - - Not allowed - 許可されていません。 - diff --git a/lib/config/config/sns_config.yml b/lib/config/config/sns_config.yml index a869abe0e..7237cfbed 100644 --- a/lib/config/config/sns_config.yml +++ b/lib/config/config/sns_config.yml @@ -252,14 +252,6 @@ mobile: Choices: 1: "携帯電話のIP帯域をチェックする" 0: "携帯電話のIP帯域をチェックしない" - mobile_image_max_size: - Name: "mobile_image_max_size" - Caption: "画像の最大サイズ設定" - Help: "許可されている画像サイズを\"横x縦\"で指定してください。
(空欄の場合フルサイズになります)" - FormType: "input" - ValueType: "image_size" - IsRequired: false - Default: "320x320" policy: _attributes: diff --git a/lib/util/opFormItemGenerator.class.php b/lib/util/opFormItemGenerator.class.php index d400d2256..70add4def 100644 --- a/lib/util/opFormItemGenerator.class.php +++ b/lib/util/opFormItemGenerator.class.php @@ -261,9 +261,6 @@ public static function generateValidator($field, $choices = array()) case 'password': $obj = new sfValidatorPassword($option); break; - case 'image_size': - $obj = new opValidatorImageSize($option); - break; case 'pass': $obj = new sfValidatorPass($option); break; diff --git a/lib/validator/opValidatorImageSize.class.php b/lib/validator/opValidatorImageSize.class.php deleted file mode 100644 index 6bfc2c9ac..000000000 --- a/lib/validator/opValidatorImageSize.class.php +++ /dev/null @@ -1,43 +0,0 @@ - - */ -class opValidatorImageSize extends opValidatorString -{ - protected function configure($options = array(), $messages = array()) - { - parent::configure($options, $messages); - - $this->setOption('ltrim', true); - $this->setOption('rtrim', true); - } - - protected function doClean($value) - { - $value = parent::doClean($value); - if ($this->isEmpty($value)) - { - return $this->getEmptyValue(); - } - - if (!in_array($value, sfImageHandler::getAllowedSize())) - { - throw new sfValidatorError($this, 'Not allowed'); - } - - return $value; - } -} From d94ebdbbd5334535abda9a0d6f401e45ec79f67c Mon Sep 17 00:00:00 2001 From: Kimura Youichi Date: Mon, 19 Mar 2012 16:19:49 +0900 Subject: [PATCH 009/630] Revert (#1966) "add support for 'sf_route' to opApplicationConfiguration::generateAppUrl()" This reverts commit c1678c50ec2756b8d987f14d42fc445ec51847df. --- lib/config/opApplicationConfiguration.class.php | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/lib/config/opApplicationConfiguration.class.php b/lib/config/opApplicationConfiguration.class.php index b09c777f3..cacc32fcb 100644 --- a/lib/config/opApplicationConfiguration.class.php +++ b/lib/config/opApplicationConfiguration.class.php @@ -552,16 +552,8 @@ public function setCacheDir($cacheDir) public function generateAppUrl($application, $parameters = array(), $absolute = false) { - if (is_array($parameters) && isset($parameters['sf_route'])) - { - $route = $parameters['sf_route']; - unset($parameters['sf_route']); - } - else - { - list($route, $parameters) = sfContext::getInstance()->getController() - ->convertUrlStringToParameters($parameters); - } + list($route, $parameters) = sfContext::getInstance()->getController() + ->convertUrlStringToParameters($parameters); return $this->getAppRouting($application)->generate($route, $parameters, $absolute); } From 49f80b3d7b7cf1264a26c600cdd6e92840e9811c Mon Sep 17 00:00:00 2001 From: Kimura Youichi Date: Mon, 19 Mar 2012 16:20:13 +0900 Subject: [PATCH 010/630] Revert (#1859) "fixed sortable of the community categories" This reverts commit 37f8eb131767a730a46328d1eebba5d802f3036b. --- .../community/actions/actions.class.php | 5 ++- .../doctrine/CommunityFormFilter.class.php | 18 ++++------- lib/form/doctrine/CommunityForm.class.php | 8 +++-- .../doctrine/CommunityCategoryTable.class.php | 31 ------------------- test/fixtures/common/test_data.yml | 5 --- .../doctrine/CommunityCategoryTableTest.php | 16 +--------- 6 files changed, 17 insertions(+), 66 deletions(-) diff --git a/apps/mobile_frontend/modules/community/actions/actions.class.php b/apps/mobile_frontend/modules/community/actions/actions.class.php index 23f0c8dcd..64a0c6910 100644 --- a/apps/mobile_frontend/modules/community/actions/actions.class.php +++ b/apps/mobile_frontend/modules/community/actions/actions.class.php @@ -87,7 +87,10 @@ public function executeSearch(sfWebRequest $request) $this->pager->setPage($request->getParameter('page', 1)); $this->pager->init(); - $this->categorys = Doctrine::getTable('CommunityCategory')->getAllChildren(); + $this->categorys = Doctrine::getTable('CommunityCategory') + ->createQuery() + ->where('lft > 1') + ->execute(); return sfView::SUCCESS; } diff --git a/lib/filter/doctrine/CommunityFormFilter.class.php b/lib/filter/doctrine/CommunityFormFilter.class.php index 748495a9c..aa260038d 100644 --- a/lib/filter/doctrine/CommunityFormFilter.class.php +++ b/lib/filter/doctrine/CommunityFormFilter.class.php @@ -24,20 +24,14 @@ public function __construct($defaults = array(), $options = array(), $CSRFSecret public function configure() { - $choices = array(); - $choices[''] = sfContext::getInstance()->getI18N()->__('All categories', array(), 'form_community'); - - $categories = Doctrine::getTable('CommunityCategory')->getAllChildren(); - foreach ($categories as $category) - { - $choices[$category->getId()] = $category->getName(); - } - + $q = Doctrine::getTable('CommunityCategory')->getAllChildrenQuery(); $widgets = array( 'name' => new sfWidgetFormInput(), - 'community_category_id' => new sfWidgetFormChoice(array( - 'choices' => $choices, - 'default' => '')), + 'community_category_id' => new sfWidgetFormDoctrineChoice(array( + 'model' => 'CommunityCategory', + 'add_empty' => sfContext::getInstance()->getI18N()->__('All categories', array(), 'form_community'), + 'query' => $q, + 'default' => 0)), ); $validators = array( diff --git a/lib/form/doctrine/CommunityForm.class.php b/lib/form/doctrine/CommunityForm.class.php index 6c012d780..a834c0b0f 100644 --- a/lib/form/doctrine/CommunityForm.class.php +++ b/lib/form/doctrine/CommunityForm.class.php @@ -27,8 +27,12 @@ public function configure() $this->widgetSchema->setLabel('name', '%community% Name'); $this->setValidator('name', new opValidatorString(array('max_length' => 64, 'trim' => true))); - $isAllowMemberCommunity = 1 != sfContext::getInstance()->getUser()->getMemberId(); - $communityCategories = Doctrine::getTable('CommunityCategory')->getAllChildren($isAllowMemberCommunity); + $q = Doctrine::getTable('CommunityCategory')->getAllChildrenQuery(); + if (1 != sfContext::getInstance()->getUser()->getMemberId()) + { + $q->andWhere('is_allow_member_community = 1'); + } + $communityCategories = $q->execute(); if (0 < count($communityCategories)) { $choices = array(); diff --git a/lib/model/doctrine/CommunityCategoryTable.class.php b/lib/model/doctrine/CommunityCategoryTable.class.php index 739bbe9f4..dd3add399 100644 --- a/lib/model/doctrine/CommunityCategoryTable.class.php +++ b/lib/model/doctrine/CommunityCategoryTable.class.php @@ -48,35 +48,4 @@ public function getAllChildrenQuery($sort = true) return $q; } - - public function getAllChildren($checkIsAllowMemberCommunity = false) - { - $roots = $this->retrieveAllRoots(); - $children = $this->retrieveAllChildren(); - - // sort by root category - $temp = array(); - foreach ($children as $child) - { - if ($checkIsAllowMemberCommunity && !$child->getIsAllowMemberCommunity()) - { - continue; - } - $temp[$child->getTreeKey()][] = $child; - } - - $data = array(); - foreach ($roots as $root) - { - if (isset($temp[$root->getId()])) - { - $data = array_merge($data, $temp[$root->getId()]); - } - } - - $collection = new Doctrine_Collection($this); - $collection->setData($data); - - return $collection; - } } diff --git a/test/fixtures/common/test_data.yml b/test/fixtures/common/test_data.yml index 5b302a68a..d5dd6d4dc 100644 --- a/test/fixtures/common/test_data.yml +++ b/test/fixtures/common/test_data.yml @@ -507,11 +507,6 @@ CommunityCategory: tree_key: 1 is_allow_member_community: 1 sort_order: 1 - community_category_5: - name: "CategoryC" - tree_key: 2 - is_allow_member_community: 0 - sort_order: 3 CommunityConfig: community_1_description: diff --git a/test/unit/model/doctrine/CommunityCategoryTableTest.php b/test/unit/model/doctrine/CommunityCategoryTableTest.php index 5bb6ee076..095efe2c1 100644 --- a/test/unit/model/doctrine/CommunityCategoryTableTest.php +++ b/test/unit/model/doctrine/CommunityCategoryTableTest.php @@ -3,7 +3,7 @@ include_once dirname(__FILE__) . '/../../../bootstrap/unit.php'; include_once dirname(__FILE__) . '/../../../bootstrap/database.php'; -$t = new lime_test(19, new lime_output_color()); +$t = new lime_test(13, new lime_output_color()); $table = Doctrine::getTable('CommunityCategory'); @@ -39,17 +39,3 @@ $t->isa_ok($table->getAllChildrenQuery(), 'opDoctrineQuery'); $t->is($table->getAllChildrenQuery(false)->getDql(), ' FROM CommunityCategory WHERE lft > 1'); $t->is($table->getAllChildrenQuery(true)->getDql(), ' FROM CommunityCategory WHERE lft > 1 ORDER BY sort_order'); - -//------------------------------------------------------------ -$t->diag('CommunityCategoryTable::getAllChildren()'); -$categories = $table->getAllChildren(); -$t->isa_ok($categories, 'Doctrine_Collection'); -$t->is(count($categories), 3); - -$categories = $table->getAllChildren(false); -$t->isa_ok($categories, 'Doctrine_Collection'); -$t->is(count($categories), 3); - -$categories = $table->getAllChildren(true); -$t->isa_ok($categories, 'Doctrine_Collection'); -$t->is(count($categories), 2); From e1812638693548b130c0fd543d29f147e51c476e Mon Sep 17 00:00:00 2001 From: Kimura Youichi Date: Mon, 19 Mar 2012 16:25:11 +0900 Subject: [PATCH 011/630] Revert (#1591) "fixed supported sortable of the community category" This reverts commit 3b8823462b2a4dd29fb2b54109a69569dba81fe3. Conflicts: apps/pc_backend/modules/community/templates/categoryListSuccess.php --- .../community/actions/actions.class.php | 36 ------------------- .../community/templates/_categoryListForm.php | 14 ++------ .../templates/categoryListSuccess.php | 6 +--- .../doctrine/CommunityCategory.class.php | 8 ----- .../doctrine/CommunityCategoryTable.class.php | 17 +++------ test/fixtures/common/test_data.yml | 14 +++----- .../doctrine/CommunityCategoryTableTest.php | 12 +------ .../model/doctrine/CommunityCategoryTest.php | 13 +------ 8 files changed, 13 insertions(+), 107 deletions(-) diff --git a/apps/pc_backend/modules/community/actions/actions.class.php b/apps/pc_backend/modules/community/actions/actions.class.php index 65ea8b76b..5abe5cb7c 100644 --- a/apps/pc_backend/modules/community/actions/actions.class.php +++ b/apps/pc_backend/modules/community/actions/actions.class.php @@ -236,40 +236,4 @@ public function executeCategoryDelete(sfWebRequest $request) $this->getUser()->setFlash('notice', 'Deleted.'); $this->redirect('community/categoryList'); } - - /** - * Executes categorySort action - * - * @param sfWebRequest $request A request object - */ - public function executeCategorySort(sfWebRequest $request) - { - if (!$request->isXmlHttpRequest()) - { - $this->forward404(); - } - - $request->checkCSRFProtection(); - - $parameters = $request->getParameterHolder(); - $keys = $parameters->getNames(); - foreach ($keys as $key) - { - if (strpos($key, 'type_') === 0) - { - $order = $parameters->get($key); - for ($i = 0; $i < count($order); $i++) - { - $category = Doctrine::getTable('CommunityCategory')->find($order[$i]); - if ($category) - { - $category->setSortOrder($i * 10); - $category->save(); - } - } - break; - } - } - return sfView::NONE; - } } diff --git a/apps/pc_backend/modules/community/templates/_categoryListForm.php b/apps/pc_backend/modules/community/templates/_categoryListForm.php index 12fcc5463..8bd374c65 100644 --- a/apps/pc_backend/modules/community/templates/_categoryListForm.php +++ b/apps/pc_backend/modules/community/templates/_categoryListForm.php @@ -1,4 +1,4 @@ - +
@@ -9,10 +9,9 @@ - -getForm()->renderGlobalErrors() ?> +getForm() as $key => $row) : ?> isHidden()) : ?> @@ -35,7 +34,6 @@ - @@ -60,11 +58,3 @@
renderLabel() ?>
- - - 'tbody', - 'only' => 'sortable', - 'url' => 'community/categorySort', - 'with' => 'Sortable.serialize("type_'.$type.'")+"&'.urlencode($form->getCSRFFieldName()).'='.urlencode($form->getCSRFToken()).'"', -)) ?> diff --git a/apps/pc_backend/modules/community/templates/categoryListSuccess.php b/apps/pc_backend/modules/community/templates/categoryListSuccess.php index fd414bdc6..43a8464ea 100644 --- a/apps/pc_backend/modules/community/templates/categoryListSuccess.php +++ b/apps/pc_backend/modules/community/templates/categoryListSuccess.php @@ -2,15 +2,12 @@ - -

'big', 'form' => $rootForm, 'forceAllowUserCommunity' => true, 'categories' => $categories, @@ -21,9 +18,8 @@

'small'.$category->getId(), 'form' => $categoryForms[$category->getId()], - 'categories' => $category->getChildren(), + 'categories' => $category->getNode()->getChildren(), 'deleteForm' => $deleteForm, )) ?> diff --git a/lib/model/doctrine/CommunityCategory.class.php b/lib/model/doctrine/CommunityCategory.class.php index 082525f32..09c967feb 100644 --- a/lib/model/doctrine/CommunityCategory.class.php +++ b/lib/model/doctrine/CommunityCategory.class.php @@ -43,12 +43,4 @@ public function getForm() { return new CommunityCategoryForm($this); } - - public function getChildren() - { - $q = Doctrine::getTable('CommunityCategory')->getAllChildrenQuery(); - $q->addWhere('tree_key = ?', $this->getId()); - - return $q->execute(); - } } diff --git a/lib/model/doctrine/CommunityCategoryTable.class.php b/lib/model/doctrine/CommunityCategoryTable.class.php index dd3add399..016021cd6 100644 --- a/lib/model/doctrine/CommunityCategoryTable.class.php +++ b/lib/model/doctrine/CommunityCategoryTable.class.php @@ -17,20 +17,11 @@ public function retrieveAll() } //TODO: use getTree()->fetchRoots() - public function retrieveAllRoots($sort = true) + public function retrieveAllRoots() { - return $this->getAllRootsQuery($sort)->execute(); - } - - public function getAllRootsQuery($sort = true) - { - $q = $this->createQuery()->where('lft = 1'); - if ($sort) - { - $q->orderBy('sort_order'); - } - - return $q; + return $this->createQuery() + ->where('lft = 1') + ->execute(); } public function retrieveAllChildren($sort = true) diff --git a/test/fixtures/common/test_data.yml b/test/fixtures/common/test_data.yml index d5dd6d4dc..5b0d69b93 100644 --- a/test/fixtures/common/test_data.yml +++ b/test/fixtures/common/test_data.yml @@ -487,22 +487,16 @@ Community: name: "CommunityE" CommunityCategory: - community_category_1: - name: "コミュニティカテゴリA" - is_allow_member_community: 1 - sort_order: 2 - - community_category_2: - name: "コミュニティカテゴリB" + community_category: + name: "コミュニティカテゴリ" is_allow_member_community: 1 - sort_order: 1 - community_category_3: + community_category_1: name: "CategoryA" tree_key: 1 is_allow_member_community: 1 sort_order: 2 - community_category_4: + community_category_2: name: "CategoryB" tree_key: 1 is_allow_member_community: 1 diff --git a/test/unit/model/doctrine/CommunityCategoryTableTest.php b/test/unit/model/doctrine/CommunityCategoryTableTest.php index 095efe2c1..e0475c129 100644 --- a/test/unit/model/doctrine/CommunityCategoryTableTest.php +++ b/test/unit/model/doctrine/CommunityCategoryTableTest.php @@ -3,7 +3,7 @@ include_once dirname(__FILE__) . '/../../../bootstrap/unit.php'; include_once dirname(__FILE__) . '/../../../bootstrap/database.php'; -$t = new lime_test(13, new lime_output_color()); +$t = new lime_test(8, new lime_output_color()); $table = Doctrine::getTable('CommunityCategory'); @@ -15,16 +15,6 @@ //------------------------------------------------------------ $t->diag('CommunityCategoryTable::retrieveAllRoots()'); $t->isa_ok($table->retrieveAllRoots(), 'Doctrine_Collection'); -$categories = $table->retrieveAllRoots(false); -$t->is($categories[0]->getSortOrder(), 2); -$categories = $table->retrieveAllRoots(true); -$t->is($categories[0]->getSortOrder(), 1); - -//------------------------------------------------------------ -$t->diag('CommunityCategoryTable::getAllRootsQuery()'); -$t->isa_ok($table->getAllRootsQuery(), 'opDoctrineQuery'); -$t->is($table->getAllRootsQuery(false)->getDql(), ' FROM CommunityCategory WHERE lft = 1'); -$t->is($table->getAllRootsQuery(true)->getDql(), ' FROM CommunityCategory WHERE lft = 1 ORDER BY sort_order'); //------------------------------------------------------------ $t->diag('CommunityCategoryTable::retrieveAllChildren()'); diff --git a/test/unit/model/doctrine/CommunityCategoryTest.php b/test/unit/model/doctrine/CommunityCategoryTest.php index e134fbb5f..c873cc1b1 100644 --- a/test/unit/model/doctrine/CommunityCategoryTest.php +++ b/test/unit/model/doctrine/CommunityCategoryTest.php @@ -3,7 +3,7 @@ include_once dirname(__FILE__) . '/../../../bootstrap/unit.php'; include_once dirname(__FILE__) . '/../../../bootstrap/database.php'; -$t = new lime_test(9, new lime_output_color()); +$t = new lime_test(4, new lime_output_color()); $communityCategory1 = Doctrine::getTable('CommunityCategory')->findOneByName('CategoryA'); @@ -28,14 +28,3 @@ //------------------------------------------------------------ $t->diag('CommunityCategory::getForm()'); $t->isa_ok($communityCategory1->getForm(), 'CommunityCategoryForm'); - -//------------------------------------------------------------ -$t->diag('CommunityCategory::getChildren()'); -$t->isa_ok($communityCategory1->getChildren(), 'Doctrine_Collection'); -$t->is(count($communityCategory1->getChildren()), 0); - -$communityCategory = Doctrine::getTable('CommunityCategory')->find(1); -$category = $communityCategory->getChildren(); -$t->is(count($category), 2); -$t->is($category[0]->getName(), 'CategoryB'); -$t->is($category[1]->getName(), 'CategoryA'); From a13fc1b7bbd8add9b7b7df8a13196569fe27ab2e Mon Sep 17 00:00:00 2001 From: Kimura Youichi Date: Mon, 19 Mar 2012 18:54:07 +0900 Subject: [PATCH 012/630] Revert (#1453) "fixed to treat as English User when the language is not supported" This reverts commit cae4f98c95d3e7a817d831bd6231f3aceabe8ed4. --- lib/config/opApplicationConfiguration.class.php | 6 +----- lib/i18n/opI18N.class.php | 3 ++- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/lib/config/opApplicationConfiguration.class.php b/lib/config/opApplicationConfiguration.class.php index cacc32fcb..92b0d9173 100644 --- a/lib/config/opApplicationConfiguration.class.php +++ b/lib/config/opApplicationConfiguration.class.php @@ -215,15 +215,11 @@ public function filterTemplateParameters(sfEvent $event, $parameters) $table = Doctrine::getTable('SnsTerm'); $application = sfConfig::get('sf_app'); - if ($application == 'pc_backend') + if($application == 'pc_backend') { $application = 'pc_frontend'; } $table->configure(sfContext::getInstance()->getUser()->getCulture(), $application); - if (!$table['member']) - { - $table->configure('en', $application); - } $parameters['op_term'] = $table; sfOutputEscaper::markClassAsSafe('SnsTermTable'); diff --git a/lib/i18n/opI18N.class.php b/lib/i18n/opI18N.class.php index 58568ae4f..5f3bd9208 100644 --- a/lib/i18n/opI18N.class.php +++ b/lib/i18n/opI18N.class.php @@ -20,8 +20,9 @@ public function initialize(sfApplicationConfiguration $configuration, sfCache $c { parent::initialize($configuration, $cache, $options); + $this->terms = Doctrine::getTable('SnsTerm'); $application = sfConfig::get('sf_app'); - if ($application == 'pc_backend') + if($application == 'pc_backend') { $application = 'pc_frontend'; } From 1da810f144e79476114268aac3dbc3402d75c703 Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Thu, 22 Mar 2012 21:17:16 +0900 Subject: [PATCH 013/630] updated the mobile_ip_address list. (fixes #2892) --- lib/config/config/mobile_ip_address.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/config/config/mobile_ip_address.yml b/lib/config/config/mobile_ip_address.yml index 882c1aadc..e7c194337 100644 --- a/lib/config/config/mobile_ip_address.yml +++ b/lib/config/config/mobile_ip_address.yml @@ -10,20 +10,16 @@ docomo: - 202.229.177.0/24 - 202.229.178.0/24 -# au (2010/12/24更新) +# au (2012/03/22更新) # http://www.au.kddi.com/ezfactory/tec/spec/ezsava_ip.html ezweb: - 210.230.128.224/28 - 121.111.227.160/27 - - 61.117.1.0/28 - 219.108.158.0/27 - 219.125.146.0/28 - 61.117.2.32/29 - 61.117.2.40/29 - 219.108.158.40/29 - - 219.125.148.0/25 - - 222.5.63.0/25 - - 222.5.63.128/25 - 222.5.62.128/25 - 59.135.38.128/25 - 219.108.157.0/25 From 586cf9a78df7a524eb8783f4b4232ee2f8296d2f Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Thu, 22 Mar 2012 21:20:36 +0900 Subject: [PATCH 014/630] version 3.7.0 --- data/version.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/version.php b/data/version.php index fc3f088bc..9874d24f9 100644 --- a/data/version.php +++ b/data/version.php @@ -10,5 +10,5 @@ if (!defined('OPENPNE_VERSION')) { - define('OPENPNE_VERSION', '3.7.0-dev'); + define('OPENPNE_VERSION', '3.7.0'); } From 427d48417ea9f5b93ca6743e7b8e2462c2bbe204 Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Thu, 22 Mar 2012 21:27:18 +0900 Subject: [PATCH 015/630] tarted developing OpenPNE 3.7.1 --- data/version.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/version.php b/data/version.php index 9874d24f9..98ca5c05a 100644 --- a/data/version.php +++ b/data/version.php @@ -10,5 +10,5 @@ if (!defined('OPENPNE_VERSION')) { - define('OPENPNE_VERSION', '3.7.0'); + define('OPENPNE_VERSION', '3.7.1-dev'); } From 422a18a4502adb8fcd627439215a885870c955d3 Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Thu, 29 Mar 2012 12:42:16 +0900 Subject: [PATCH 016/630] started developing OpenPNE 3.8beta1 --- data/version.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/version.php b/data/version.php index 98ca5c05a..f92c3fb10 100644 --- a/data/version.php +++ b/data/version.php @@ -10,5 +10,5 @@ if (!defined('OPENPNE_VERSION')) { - define('OPENPNE_VERSION', '3.7.1-dev'); + define('OPENPNE_VERSION', '3.8beta1-dev'); } From f6991781693e222595fd31a12c06fa2fc5259e54 Mon Sep 17 00:00:00 2001 From: Masato Nagasawa Date: Tue, 17 May 2011 16:51:51 +0900 Subject: [PATCH 017/630] fixed "IsTrim" option (fixes #2104) --- lib/config/config/sns_config.yml | 8 ++++++++ lib/util/opFormItemGenerator.class.php | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/config/config/sns_config.yml b/lib/config/config/sns_config.yml index 7237cfbed..788be72b8 100644 --- a/lib/config/config/sns_config.yml +++ b/lib/config/config/sns_config.yml @@ -26,6 +26,7 @@ general: ValueType: "email" Default: "sns@example.com" IsRequired: true + IsTrim: true enable_pc: Name: "enable_pc" @@ -33,6 +34,7 @@ general: FormType: "radio" ValueType: "text" IsRequired: true + IsTrim: true Default: 1 Choices: - "使用しない" @@ -44,6 +46,7 @@ general: FormType: "radio" ValueType: "text" IsRequired: true + IsTrim: true Default: 1 Choices: - "使用しない" @@ -67,6 +70,7 @@ general: ValueType: "regexp" ValueRegexp: "/^[1-9]\d*[K|M]?$/" IsRequired: true + IsTrim: true Default: "300K" daily_news_day: @@ -189,6 +193,7 @@ external_login_page: ValueType: "text" Default: "" IsRequired: false + IsTrim: true external_mobile_login_url: Name: "external_mobile_login_url" @@ -198,6 +203,7 @@ external_login_page: ValueType: "text" Default: "" IsRequired: false + IsTrim: true authentication: _attributes: @@ -303,6 +309,7 @@ api_keys: FormType: "text" ValueType: "string" IsRequired: false + IsTrim: true Default: "" google_AJAX_search_api_key: Name: "google AJAX search api key" @@ -310,4 +317,5 @@ api_keys: FormType: "text" ValueType: "string" IsRequired: false + IsTrim: true Default: "" diff --git a/lib/util/opFormItemGenerator.class.php b/lib/util/opFormItemGenerator.class.php index 70add4def..1194ea0d2 100644 --- a/lib/util/opFormItemGenerator.class.php +++ b/lib/util/opFormItemGenerator.class.php @@ -159,7 +159,7 @@ public static function generateWidget($field, $choices = array()) public static function generateValidator($field, $choices = array()) { $field = self::arrayKeyCamelize($field); - $option = array('required' => $field['IsRequired'], 'trim' => $field['IsRequired']); + $option = array('required' => $field['IsRequired'], 'trim' => $field['IsTrim']); if (!$choices && !empty($field['Choices'])) { From 5b1c8d4a6ce15463d6700ded9fb0487709e6c617 Mon Sep 17 00:00:00 2001 From: Kimura Youichi Date: Thu, 20 Oct 2011 15:15:54 +0900 Subject: [PATCH 018/630] correct wrong class name in sfImageHandlerPlugin (fixes #2228) --- .../lib/image/generator/sfImageGenerator.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/sfImageHandlerPlugin/lib/image/generator/sfImageGenerator.class.php b/plugins/sfImageHandlerPlugin/lib/image/generator/sfImageGenerator.class.php index d7a99b5fb..65625a9ad 100644 --- a/plugins/sfImageHandlerPlugin/lib/image/generator/sfImageGenerator.class.php +++ b/plugins/sfImageHandlerPlugin/lib/image/generator/sfImageGenerator.class.php @@ -107,7 +107,7 @@ public function output($outputFilename) $currentUmask = umask(0000); if (false === @mkdir(dirname($outputFilename), 0777, true)) { - throw new sfRuntimeException('Failed to make cache directory.'); + throw new RuntimeException('Failed to make cache directory.'); } umask($currentUmask); } From c400cefb14d56e07e3e9aa73d25343a601749daa Mon Sep 17 00:00:00 2001 From: watanabe Date: Tue, 17 Jan 2012 01:27:26 +0900 Subject: [PATCH 019/630] (fixes #2323) fixed to put links automatically when the text has whitespaces --- lib/helper/opUtilHelper.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/helper/opUtilHelper.php b/lib/helper/opUtilHelper.php index ea0b57124..eb4c17465 100644 --- a/lib/helper/opUtilHelper.php +++ b/lib/helper/opUtilHelper.php @@ -313,7 +313,8 @@ function op_format_date($date, $format = 'd', $culture = null, $charset = null) ( # leading text <\w+.*?>| # leading HTML tag, or [^=!:\'"/]| # leading punctuation, or - ^ # beginning of line + ^| # beginning of line, or + \s? # leading whitespaces ) ( (?:https?://)| # protocol spec, or From 274623fa9d217c663a17e0bc59e676c7a7b4ec0a Mon Sep 17 00:00:00 2001 From: Maki Takahashi Date: Fri, 21 Oct 2011 16:06:17 +0900 Subject: [PATCH 020/630] (fixes #2417) added the max_length option for opValidatorPCMail and sfValidatorMobileEmail --- lib/validator/opValidatorPCEmail.class.php | 6 ++++++ lib/validator/sfValidatorMobileEmail.class.php | 1 + 2 files changed, 7 insertions(+) diff --git a/lib/validator/opValidatorPCEmail.class.php b/lib/validator/opValidatorPCEmail.class.php index 53918f747..5d7e08b28 100644 --- a/lib/validator/opValidatorPCEmail.class.php +++ b/lib/validator/opValidatorPCEmail.class.php @@ -17,6 +17,12 @@ */ class opValidatorPCEmail extends sfValidatorEmail { + protected function configure($options = array(), $messages = array()) + { + parent::configure($options, $messages); + $this->setOption('max_length', 320); + } + /** * @see sfValidatorString */ diff --git a/lib/validator/sfValidatorMobileEmail.class.php b/lib/validator/sfValidatorMobileEmail.class.php index 35b5fa3b4..c5b5dc40e 100644 --- a/lib/validator/sfValidatorMobileEmail.class.php +++ b/lib/validator/sfValidatorMobileEmail.class.php @@ -28,5 +28,6 @@ protected function configure($options = array(), $messages = array()) $str = join('|', array_filter(opToolkit::getMobileMailAddressDomains(), $filter)); $this->setOption('pattern', '/^([^@\s]+)@('.$str.')$/i'); + $this->setOption('max_length', 320); } } From 50656a2028c9f255adc7045200534757819ead35 Mon Sep 17 00:00:00 2001 From: Maki Takahashi Date: Mon, 24 Oct 2011 17:37:53 +0900 Subject: [PATCH 021/630] (fixes #2488) changed error level of opDeprecatedRoute's log from ERR to NOTICE --- lib/routing/opDeprecatedRoute.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/routing/opDeprecatedRoute.class.php b/lib/routing/opDeprecatedRoute.class.php index 86d6ae00c..500a859fd 100644 --- a/lib/routing/opDeprecatedRoute.class.php +++ b/lib/routing/opDeprecatedRoute.class.php @@ -27,7 +27,7 @@ public function matchesUrl($url, $context = array()) $message = array( 'This routing rule is deprecated. Please use other rules instead of this.', - 'priority' => sfLogger::ERR, + 'priority' => sfLogger::NOTICE, ); if (sfContext::hasInstance()) From 64ede427d2d4a00dbefc5b84f465727c91f6eb7d Mon Sep 17 00:00:00 2001 From: mtakai Date: Wed, 19 Oct 2011 15:00:59 +0900 Subject: [PATCH 022/630] (fixes #2516) fixed factories.yml for pc_backend not to cause warning --- apps/pc_backend/config/factories.yml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/apps/pc_backend/config/factories.yml b/apps/pc_backend/config/factories.yml index 21cc1657b..0b9b2a4fd 100644 --- a/apps/pc_backend/config/factories.yml +++ b/apps/pc_backend/config/factories.yml @@ -92,13 +92,7 @@ all: debug: false untranslated_prefix: "[T]" untranslated_suffix: "[/T]" - cache: - class: sfFileCache - param: - automatic_cleaning_factor: 0 - cache_dir: %SF_I18N_CACHE_DIR% - lifetime: 86400 - prefix: %SF_APP_DIR% + cache: ~ routing: class: sfPatternRouting From bebacd50ccf0ba7cdd65676a58b094058274a2be Mon Sep 17 00:00:00 2001 From: mtakai Date: Fri, 18 Nov 2011 22:55:02 +0900 Subject: [PATCH 023/630] (fixes #2516) fixed factories.yml for mobile_frontend not to cause warning --- apps/mobile_frontend/config/factories.yml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/apps/mobile_frontend/config/factories.yml b/apps/mobile_frontend/config/factories.yml index bc25a5b4b..5742d6620 100644 --- a/apps/mobile_frontend/config/factories.yml +++ b/apps/mobile_frontend/config/factories.yml @@ -93,13 +93,7 @@ all: debug: false untranslated_prefix: "[T]" untranslated_suffix: "[/T]" - cache: - class: sfFileCache - param: - automatic_cleaning_factor: 0 - cache_dir: %SF_I18N_CACHE_DIR% - lifetime: 86400 - prefix: %SF_APP_DIR% + cache: ~ routing: class: sfPatternRouting From 6a707421a63695a22ccf8e358144538bf8bf20a7 Mon Sep 17 00:00:00 2001 From: Shogo Kawahara Date: Fri, 25 Nov 2011 22:09:30 +0900 Subject: [PATCH 024/630] fixed factries.yml for pc_frontend, because test can't pass by the response's configuration (fixes #2618) --- apps/pc_frontend/config/factories.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/pc_frontend/config/factories.yml b/apps/pc_frontend/config/factories.yml index 3a2758cc5..9501123c3 100644 --- a/apps/pc_frontend/config/factories.yml +++ b/apps/pc_frontend/config/factories.yml @@ -15,7 +15,7 @@ cli: test: response: - class: sfWebResponse + class: opWebResponse param: send_http_headers: false From 9b81fb9edc73633f112d7e5803d46fa6be0ca583 Mon Sep 17 00:00:00 2001 From: Masato Nagasawa Date: Tue, 21 Dec 2010 22:24:02 +0900 Subject: [PATCH 025/630] fixed supported sortable of the community category (fixes #1591) --- .../community/actions/actions.class.php | 36 +++++++++++++++++++ .../community/templates/_categoryListForm.php | 14 ++++++-- .../templates/categoryListSuccess.php | 6 +++- .../doctrine/CommunityCategory.class.php | 8 +++++ .../doctrine/CommunityCategoryTable.class.php | 17 ++++++--- test/fixtures/common/test_data.yml | 14 +++++--- .../doctrine/CommunityCategoryTableTest.php | 12 ++++++- .../model/doctrine/CommunityCategoryTest.php | 13 ++++++- 8 files changed, 107 insertions(+), 13 deletions(-) diff --git a/apps/pc_backend/modules/community/actions/actions.class.php b/apps/pc_backend/modules/community/actions/actions.class.php index 5abe5cb7c..65ea8b76b 100644 --- a/apps/pc_backend/modules/community/actions/actions.class.php +++ b/apps/pc_backend/modules/community/actions/actions.class.php @@ -236,4 +236,40 @@ public function executeCategoryDelete(sfWebRequest $request) $this->getUser()->setFlash('notice', 'Deleted.'); $this->redirect('community/categoryList'); } + + /** + * Executes categorySort action + * + * @param sfWebRequest $request A request object + */ + public function executeCategorySort(sfWebRequest $request) + { + if (!$request->isXmlHttpRequest()) + { + $this->forward404(); + } + + $request->checkCSRFProtection(); + + $parameters = $request->getParameterHolder(); + $keys = $parameters->getNames(); + foreach ($keys as $key) + { + if (strpos($key, 'type_') === 0) + { + $order = $parameters->get($key); + for ($i = 0; $i < count($order); $i++) + { + $category = Doctrine::getTable('CommunityCategory')->find($order[$i]); + if ($category) + { + $category->setSortOrder($i * 10); + $category->save(); + } + } + break; + } + } + return sfView::NONE; + } } diff --git a/apps/pc_backend/modules/community/templates/_categoryListForm.php b/apps/pc_backend/modules/community/templates/_categoryListForm.php index 8bd374c65..12fcc5463 100644 --- a/apps/pc_backend/modules/community/templates/_categoryListForm.php +++ b/apps/pc_backend/modules/community/templates/_categoryListForm.php @@ -1,4 +1,4 @@ - +
@@ -9,9 +9,10 @@ + +getForm()->renderGlobalErrors() ?> -getForm() as $key => $row) : ?> isHidden()) : ?> @@ -34,6 +35,7 @@ + @@ -58,3 +60,11 @@
renderLabel() ?>
+ + + 'tbody', + 'only' => 'sortable', + 'url' => 'community/categorySort', + 'with' => 'Sortable.serialize("type_'.$type.'")+"&'.urlencode($form->getCSRFFieldName()).'='.urlencode($form->getCSRFToken()).'"', +)) ?> diff --git a/apps/pc_backend/modules/community/templates/categoryListSuccess.php b/apps/pc_backend/modules/community/templates/categoryListSuccess.php index 43a8464ea..fd414bdc6 100644 --- a/apps/pc_backend/modules/community/templates/categoryListSuccess.php +++ b/apps/pc_backend/modules/community/templates/categoryListSuccess.php @@ -2,12 +2,15 @@ + +

'big', 'form' => $rootForm, 'forceAllowUserCommunity' => true, 'categories' => $categories, @@ -18,8 +21,9 @@

'small'.$category->getId(), 'form' => $categoryForms[$category->getId()], - 'categories' => $category->getNode()->getChildren(), + 'categories' => $category->getChildren(), 'deleteForm' => $deleteForm, )) ?> diff --git a/lib/model/doctrine/CommunityCategory.class.php b/lib/model/doctrine/CommunityCategory.class.php index 09c967feb..082525f32 100644 --- a/lib/model/doctrine/CommunityCategory.class.php +++ b/lib/model/doctrine/CommunityCategory.class.php @@ -43,4 +43,12 @@ public function getForm() { return new CommunityCategoryForm($this); } + + public function getChildren() + { + $q = Doctrine::getTable('CommunityCategory')->getAllChildrenQuery(); + $q->addWhere('tree_key = ?', $this->getId()); + + return $q->execute(); + } } diff --git a/lib/model/doctrine/CommunityCategoryTable.class.php b/lib/model/doctrine/CommunityCategoryTable.class.php index 016021cd6..dd3add399 100644 --- a/lib/model/doctrine/CommunityCategoryTable.class.php +++ b/lib/model/doctrine/CommunityCategoryTable.class.php @@ -17,11 +17,20 @@ public function retrieveAll() } //TODO: use getTree()->fetchRoots() - public function retrieveAllRoots() + public function retrieveAllRoots($sort = true) { - return $this->createQuery() - ->where('lft = 1') - ->execute(); + return $this->getAllRootsQuery($sort)->execute(); + } + + public function getAllRootsQuery($sort = true) + { + $q = $this->createQuery()->where('lft = 1'); + if ($sort) + { + $q->orderBy('sort_order'); + } + + return $q; } public function retrieveAllChildren($sort = true) diff --git a/test/fixtures/common/test_data.yml b/test/fixtures/common/test_data.yml index 5b0d69b93..d5dd6d4dc 100644 --- a/test/fixtures/common/test_data.yml +++ b/test/fixtures/common/test_data.yml @@ -487,16 +487,22 @@ Community: name: "CommunityE" CommunityCategory: - community_category: - name: "コミュニティカテゴリ" + community_category_1: + name: "コミュニティカテゴリA" is_allow_member_community: 1 + sort_order: 2 - community_category_1: + community_category_2: + name: "コミュニティカテゴリB" + is_allow_member_community: 1 + sort_order: 1 + + community_category_3: name: "CategoryA" tree_key: 1 is_allow_member_community: 1 sort_order: 2 - community_category_2: + community_category_4: name: "CategoryB" tree_key: 1 is_allow_member_community: 1 diff --git a/test/unit/model/doctrine/CommunityCategoryTableTest.php b/test/unit/model/doctrine/CommunityCategoryTableTest.php index e0475c129..095efe2c1 100644 --- a/test/unit/model/doctrine/CommunityCategoryTableTest.php +++ b/test/unit/model/doctrine/CommunityCategoryTableTest.php @@ -3,7 +3,7 @@ include_once dirname(__FILE__) . '/../../../bootstrap/unit.php'; include_once dirname(__FILE__) . '/../../../bootstrap/database.php'; -$t = new lime_test(8, new lime_output_color()); +$t = new lime_test(13, new lime_output_color()); $table = Doctrine::getTable('CommunityCategory'); @@ -15,6 +15,16 @@ //------------------------------------------------------------ $t->diag('CommunityCategoryTable::retrieveAllRoots()'); $t->isa_ok($table->retrieveAllRoots(), 'Doctrine_Collection'); +$categories = $table->retrieveAllRoots(false); +$t->is($categories[0]->getSortOrder(), 2); +$categories = $table->retrieveAllRoots(true); +$t->is($categories[0]->getSortOrder(), 1); + +//------------------------------------------------------------ +$t->diag('CommunityCategoryTable::getAllRootsQuery()'); +$t->isa_ok($table->getAllRootsQuery(), 'opDoctrineQuery'); +$t->is($table->getAllRootsQuery(false)->getDql(), ' FROM CommunityCategory WHERE lft = 1'); +$t->is($table->getAllRootsQuery(true)->getDql(), ' FROM CommunityCategory WHERE lft = 1 ORDER BY sort_order'); //------------------------------------------------------------ $t->diag('CommunityCategoryTable::retrieveAllChildren()'); diff --git a/test/unit/model/doctrine/CommunityCategoryTest.php b/test/unit/model/doctrine/CommunityCategoryTest.php index c873cc1b1..e134fbb5f 100644 --- a/test/unit/model/doctrine/CommunityCategoryTest.php +++ b/test/unit/model/doctrine/CommunityCategoryTest.php @@ -3,7 +3,7 @@ include_once dirname(__FILE__) . '/../../../bootstrap/unit.php'; include_once dirname(__FILE__) . '/../../../bootstrap/database.php'; -$t = new lime_test(4, new lime_output_color()); +$t = new lime_test(9, new lime_output_color()); $communityCategory1 = Doctrine::getTable('CommunityCategory')->findOneByName('CategoryA'); @@ -28,3 +28,14 @@ //------------------------------------------------------------ $t->diag('CommunityCategory::getForm()'); $t->isa_ok($communityCategory1->getForm(), 'CommunityCategoryForm'); + +//------------------------------------------------------------ +$t->diag('CommunityCategory::getChildren()'); +$t->isa_ok($communityCategory1->getChildren(), 'Doctrine_Collection'); +$t->is(count($communityCategory1->getChildren()), 0); + +$communityCategory = Doctrine::getTable('CommunityCategory')->find(1); +$category = $communityCategory->getChildren(); +$t->is(count($category), 2); +$t->is($category[0]->getName(), 'CategoryB'); +$t->is($category[1]->getName(), 'CategoryA'); From 0021f0b7656bae96b6cd63992f93c65b5700c552 Mon Sep 17 00:00:00 2001 From: Masato Nagasawa Date: Mon, 16 May 2011 15:50:00 +0900 Subject: [PATCH 026/630] added the image max size of the mobile to the pc_backend (refs #2089) --- .../templates/configImageSuccess.php | 2 +- .../templates/deleteImageSuccess.php | 2 +- .../friend/templates/showImageSuccess.php | 2 +- .../member/templates/configImageSuccess.php | 2 +- .../member/templates/deleteImageSuccess.php | 2 +- apps/pc_backend/i18n/messages.ja.xml | 4 ++ lib/config/config/sns_config.yml | 8 ++++ lib/util/opFormItemGenerator.class.php | 3 ++ lib/validator/opValidatorImageSize.class.php | 43 +++++++++++++++++++ 9 files changed, 63 insertions(+), 5 deletions(-) create mode 100644 lib/validator/opValidatorImageSize.class.php diff --git a/apps/mobile_frontend/modules/community/templates/configImageSuccess.php b/apps/mobile_frontend/modules/community/templates/configImageSuccess.php index 0a1b272cf..7cc934247 100644 --- a/apps/mobile_frontend/modules/community/templates/configImageSuccess.php +++ b/apps/mobile_frontend/modules/community/templates/configImageSuccess.php @@ -3,7 +3,7 @@ getImageFileName()): ?> getFile(), array('size' => '120x120', 'format' => 'jpg')) ?>
getFile(), array('size' => '320x320', 'format' => 'jpg'))), + link_to(__('Expansion'), sf_image_path($community->getFile(), array('size' => opConfig::get('mobile_image_max_size'), 'format' => 'jpg'))), link_to(__('Delete'), '@community_deleteImage?id='.$community->getId()) ) ?>

diff --git a/apps/mobile_frontend/modules/community/templates/deleteImageSuccess.php b/apps/mobile_frontend/modules/community/templates/deleteImageSuccess.php index c47219918..842ada04e 100644 --- a/apps/mobile_frontend/modules/community/templates/deleteImageSuccess.php +++ b/apps/mobile_frontend/modules/community/templates/deleteImageSuccess.php @@ -3,7 +3,7 @@
">
getImageFileName(), array('size' => '120x120', 'format' => 'jpg')) ?>
-getImageFileName(), array('size' => '320x320', 'format' => 'jpg')))) ?>
+getImageFileName(), array('size' => opConfig::get('mobile_image_max_size'), 'format' => 'jpg')))) ?>

"> getFile(), array('size' => '120x120', 'format' => 'jpg')) ?>
-getFile(), array('size' => '320x320', 'format' => 'jpg'))).']' ?>

+getFile(), array('size' => opConfig::get('mobile_image_max_size'), 'format' => 'jpg'))).']' ?>

diff --git a/apps/mobile_frontend/modules/member/templates/configImageSuccess.php b/apps/mobile_frontend/modules/member/templates/configImageSuccess.php index a2c05cae0..f27bc9853 100644 --- a/apps/mobile_frontend/modules/member/templates/configImageSuccess.php +++ b/apps/mobile_frontend/modules/member/templates/configImageSuccess.php @@ -7,7 +7,7 @@ getCSRFFieldName().'='.$form->getCSRFToken() ?> getFile(), array('size' => '120x120', 'format' => 'jpg')) ?>
-getFile(), array('size' => '320x320', 'format' => 'jpg')))) ?>
+getFile(), array('size' => opConfig::get('mobile_image_max_size'), 'format' => 'jpg')))) ?>
getIsPrimary()) { diff --git a/apps/mobile_frontend/modules/member/templates/deleteImageSuccess.php b/apps/mobile_frontend/modules/member/templates/deleteImageSuccess.php index 764736b57..52e09f654 100644 --- a/apps/mobile_frontend/modules/member/templates/deleteImageSuccess.php +++ b/apps/mobile_frontend/modules/member/templates/deleteImageSuccess.php @@ -3,7 +3,7 @@
">
getFile(), array('size' => '120x120', 'format' => 'jpg')) ?>
-getFile(), array('size' => '320x320', 'format' => 'jpg')))) ?>
+getFile(), array('size' => opConfig::get('mobile_image_max_size'), 'format' => 'jpg')))) ?>

"> Are you sure you want to delete this %community%? 本当にこの%community%を削除してもよろしいですか? + + Not allowed + 許可されていません。 + diff --git a/lib/config/config/sns_config.yml b/lib/config/config/sns_config.yml index 788be72b8..b26fe8e4b 100644 --- a/lib/config/config/sns_config.yml +++ b/lib/config/config/sns_config.yml @@ -258,6 +258,14 @@ mobile: Choices: 1: "携帯電話のIP帯域をチェックする" 0: "携帯電話のIP帯域をチェックしない" + mobile_image_max_size: + Name: "mobile_image_max_size" + Caption: "画像の最大サイズ設定" + Help: "許可されている画像サイズを\"横x縦\"で指定してください。
(空欄の場合フルサイズになります)" + FormType: "input" + ValueType: "image_size" + IsRequired: false + Default: "320x320" policy: _attributes: diff --git a/lib/util/opFormItemGenerator.class.php b/lib/util/opFormItemGenerator.class.php index 1194ea0d2..1895c2f9b 100644 --- a/lib/util/opFormItemGenerator.class.php +++ b/lib/util/opFormItemGenerator.class.php @@ -261,6 +261,9 @@ public static function generateValidator($field, $choices = array()) case 'password': $obj = new sfValidatorPassword($option); break; + case 'image_size': + $obj = new opValidatorImageSize($option); + break; case 'pass': $obj = new sfValidatorPass($option); break; diff --git a/lib/validator/opValidatorImageSize.class.php b/lib/validator/opValidatorImageSize.class.php new file mode 100644 index 000000000..6bfc2c9ac --- /dev/null +++ b/lib/validator/opValidatorImageSize.class.php @@ -0,0 +1,43 @@ + + */ +class opValidatorImageSize extends opValidatorString +{ + protected function configure($options = array(), $messages = array()) + { + parent::configure($options, $messages); + + $this->setOption('ltrim', true); + $this->setOption('rtrim', true); + } + + protected function doClean($value) + { + $value = parent::doClean($value); + if ($this->isEmpty($value)) + { + return $this->getEmptyValue(); + } + + if (!in_array($value, sfImageHandler::getAllowedSize())) + { + throw new sfValidatorError($this, 'Not allowed'); + } + + return $value; + } +} From c3d3433bb5e97ab1f2df59022d9f4419e503b7cb Mon Sep 17 00:00:00 2001 From: Masato Nagasawa Date: Mon, 16 May 2011 16:26:55 +0900 Subject: [PATCH 027/630] fixed description of class file (fixes #2089) --- lib/validator/opValidatorImageSize.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/validator/opValidatorImageSize.class.php b/lib/validator/opValidatorImageSize.class.php index 6bfc2c9ac..04e24c655 100644 --- a/lib/validator/opValidatorImageSize.class.php +++ b/lib/validator/opValidatorImageSize.class.php @@ -9,7 +9,7 @@ */ /** - * opValidatorImageFile validates a date + * opValidatorImageSize validates a image size * * @package OpenPNE * @subpackage validator From 8eccb9ab0313aa42cad51b453c4dbbb31f8c791f Mon Sep 17 00:00:00 2001 From: mtakai Date: Thu, 14 Jul 2011 22:26:58 +0900 Subject: [PATCH 028/630] (fixes #2275) use option 'date_format_range_error' in opValidatorDate --- lib/util/opFormItemGenerator.class.php | 1 + lib/validator/opValidatorDate.class.php | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/util/opFormItemGenerator.class.php b/lib/util/opFormItemGenerator.class.php index 1895c2f9b..ea2ac2abe 100644 --- a/lib/util/opFormItemGenerator.class.php +++ b/lib/util/opFormItemGenerator.class.php @@ -233,6 +233,7 @@ public static function generateValidator($field, $choices = array()) if ($field['FormType'] === 'date') { + $option['date_format_range_error'] = 'Y-m-d'; $obj = new opValidatorDate($option); return $obj; } diff --git a/lib/validator/opValidatorDate.class.php b/lib/validator/opValidatorDate.class.php index cfc3bb976..cc82bf438 100644 --- a/lib/validator/opValidatorDate.class.php +++ b/lib/validator/opValidatorDate.class.php @@ -56,7 +56,7 @@ protected function doClean($value) $max = new DateTime($this->getOption('max')); if ($max && $clean->format('U') > $max->format('U')) { - throw new sfValidatorError($this, 'max', array('max' => $max->format('Y-m-d'))); + throw new sfValidatorError($this, 'max', array('max' => $max->format($this->getOption('date_format_range_error')))); } } @@ -65,7 +65,7 @@ protected function doClean($value) $min = new DateTime($this->getOption('min')); if ($min && $clean->format('U') < $min->format('U')) { - throw new sfValidatorError($this, 'min', array('min' => $min->format('Y-m-d'))); + throw new sfValidatorError($this, 'min', array('min' => $min->format($this->getOption('date_format_range_error')))); } } From 681ae12ea344193544a6cbd476e9b4fbbce19e1a Mon Sep 17 00:00:00 2001 From: Kimura Youichi Date: Tue, 27 Mar 2012 14:56:27 +0900 Subject: [PATCH 029/630] fix coding style issue (fixes #2275) --- lib/util/opFormItemGenerator.class.php | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/lib/util/opFormItemGenerator.class.php b/lib/util/opFormItemGenerator.class.php index ea2ac2abe..e5a5b4fc0 100644 --- a/lib/util/opFormItemGenerator.class.php +++ b/lib/util/opFormItemGenerator.class.php @@ -71,7 +71,7 @@ public static function generateWidget($field, $choices = array()) if (in_array($field['FormType'], self::$choicesType)) { - if ($field['FormType'] === 'select') + if ('select' === $field['FormType']) { if (!$field['IsRequired']) { @@ -151,6 +151,7 @@ public static function generateWidget($field, $choices = array()) break; default: $obj = new sfWidgetFormInput($params); + break; } return $obj; @@ -166,22 +167,24 @@ public static function generateValidator($field, $choices = array()) $choices = array_keys($field['Choices']); } - if ($field['FormType'] === 'checkbox') + if ('checkbox' === $field['FormType']) { $option['choices'] = $choices; $option['multiple'] = true; $obj = new sfValidatorChoice($option); + return $obj; } - if ($field['FormType'] === 'select' || $field['FormType'] === 'radio') + if ('select' === $field['FormType'] || 'radio' === $field['FormType']) { $option = array('choices' => $choices); $option['required'] = $field['IsRequired']; $obj = new sfValidatorChoice($option); + return $obj; } - if ($field['ValueType'] === 'integer') + if ('integer' === $field['ValueType']) { if (isset($field['ValueMin']) && is_numeric($field['ValueMin'])) { @@ -197,7 +200,7 @@ public static function generateValidator($field, $choices = array()) } } } - elseif ($field['FormType'] === 'date') + elseif ('date' === $field['FormType']) { if (isset($field['ValueMin']) && false !== strtotime($field['ValueMin'])) { @@ -231,10 +234,11 @@ public static function generateValidator($field, $choices = array()) } } - if ($field['FormType'] === 'date') + if ('date' === $field['FormType']) { $option['date_format_range_error'] = 'Y-m-d'; $obj = new opValidatorDate($option); + return $obj; } @@ -270,6 +274,7 @@ public static function generateValidator($field, $choices = array()) break; default: $obj = new opValidatorString($option); + break; } return $obj; @@ -334,6 +339,7 @@ public static function generateSearchWidget($field, $choices = array()) // text and something else default: $obj = new sfWidgetFormInput($params); + break; } return $obj; @@ -376,6 +382,7 @@ public static function filterSearchQuery($q, $column, $value, $field) // text and something else default: $q->andWhereLike($column, $value); + break; } return $q; From 018a9eb6e8e3de0b3e7389f6ad0794a174a911b5 Mon Sep 17 00:00:00 2001 From: Kimura Youichi Date: Sun, 11 Dec 2011 14:42:27 +0900 Subject: [PATCH 030/630] add layouts for smartphone (refs #2227) --- apps/pc_frontend/templates/_tosaka.php | 11 + apps/pc_frontend/templates/smtLayoutGroup.php | 44 + apps/pc_frontend/templates/smtLayoutHome.php | 47 + .../pc_frontend/templates/smtLayoutMember.php | 50 + apps/pc_frontend/templates/smtLayoutSns.php | 52 + lib/response/opWebResponse.class.php | 24 + web/css/bootstrap.css | 2467 +++++++++++++++++ web/css/smt_main.css | 147 + web/images/HomeIcon.png | Bin 0 -> 47837 bytes web/images/LOGO.png | Bin 0 -> 45618 bytes web/images/NOTIFY_CENTER.png | Bin 0 -> 64292 bytes web/images/POST.png | Bin 0 -> 59820 bytes 12 files changed, 2842 insertions(+) create mode 100644 apps/pc_frontend/templates/_tosaka.php create mode 100644 apps/pc_frontend/templates/smtLayoutGroup.php create mode 100644 apps/pc_frontend/templates/smtLayoutHome.php create mode 100644 apps/pc_frontend/templates/smtLayoutMember.php create mode 100644 apps/pc_frontend/templates/smtLayoutSns.php create mode 100644 web/css/bootstrap.css create mode 100644 web/css/smt_main.css create mode 100644 web/images/HomeIcon.png create mode 100644 web/images/LOGO.png create mode 100644 web/images/NOTIFY_CENTER.png create mode 100644 web/images/POST.png diff --git a/apps/pc_frontend/templates/_tosaka.php b/apps/pc_frontend/templates/_tosaka.php new file mode 100644 index 000000000..24b5580e0 --- /dev/null +++ b/apps/pc_frontend/templates/_tosaka.php @@ -0,0 +1,11 @@ +
+
+
+
+
'32', 'class' => 'menubutton')), '@homepage') ?>
+
'32', 'class' => 'ncbutton')) ?>
+
'32', 'class' =>'postbutton')) ?>
+
+
+
+
diff --git a/apps/pc_frontend/templates/smtLayoutGroup.php b/apps/pc_frontend/templates/smtLayoutGroup.php new file mode 100644 index 000000000..443cf5ddb --- /dev/null +++ b/apps/pc_frontend/templates/smtLayoutGroup.php @@ -0,0 +1,44 @@ + + + + + + + + + + +get('customizing_css')): ?> + + + + $sf_user->getMemberApiKey(), + 'apiBase' => app_url_for('api', 'homepage'), +); + +echo javascript_tag(' +var openpne = '.json_encode($json, defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 0).'; +') +?> + + + + + +
+ getDisplayCommunity() ?> + +
+ getImageFileName(), array('size' => '48x48')) ?> +
+
+
getName() ?>
+
+
'48')), '@homepage') ?>
+ +
+ + + diff --git a/apps/pc_frontend/templates/smtLayoutHome.php b/apps/pc_frontend/templates/smtLayoutHome.php new file mode 100644 index 000000000..11d734c16 --- /dev/null +++ b/apps/pc_frontend/templates/smtLayoutHome.php @@ -0,0 +1,47 @@ + + + + + + + + + + +get('customizing_css')): ?> + + + + $sf_user->getMemberApiKey(), + 'apiBase' => app_url_for('api', 'homepage'), +); + +echo javascript_tag(' +var openpne = '.json_encode($json, defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 0).'; +') +?> + + + + + +
+
+ getMember()->getImageFileName(), array('size' => '48x48')) ?> +
+
+
getMember()->getName() ?>
+
+ getMember()->getConfig('op_screen_name') ?> + + @ + +
+
+
'48')), '@homepage') ?>
+
+ + + diff --git a/apps/pc_frontend/templates/smtLayoutMember.php b/apps/pc_frontend/templates/smtLayoutMember.php new file mode 100644 index 000000000..9e0708c4f --- /dev/null +++ b/apps/pc_frontend/templates/smtLayoutMember.php @@ -0,0 +1,50 @@ + + + + + + + + + + +get('customizing_css')): ?> + + + + $sf_user->getMemberApiKey(), + 'apiBase' => app_url_for('api', 'homepage'), +); + +echo javascript_tag(' +var openpne = '.json_encode($json, defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 0).'; +') +?> + + + + + +
+ getDisplayMember() ?> + +
+ getImageFileName(), array('size' => '48x48')) ?> +
+
+
getName() ?>
+
+ getConfig('op_screen_name') ?> + + @ + +
+
+
'48')), '@homepage') ?>
+ +
+ + + diff --git a/apps/pc_frontend/templates/smtLayoutSns.php b/apps/pc_frontend/templates/smtLayoutSns.php new file mode 100644 index 000000000..6310d3da5 --- /dev/null +++ b/apps/pc_frontend/templates/smtLayoutSns.php @@ -0,0 +1,52 @@ + + + + + + + + + + +get('customizing_css')): ?> + + + + opToolkit::isSecurePage() ? $sf_user->getMemberApiKey() : '', + 'apiBase' => app_url_for('api', 'homepage'), +); + +echo javascript_tag(' +var openpne = '.json_encode($json, defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 0).'; +') +?> + + + + + + + + +
+
+ getMember()->getImageFileName(), array('size' => '48x48')) ?> +
+
+
getMember()->getName() ?>
+
+ getMember()->getConfig('op_screen_name') ?> + + @ + +
+
+
'48')), '@homepage') ?>
+
+ + + + + diff --git a/lib/response/opWebResponse.class.php b/lib/response/opWebResponse.class.php index fdb0a9891..fd1282db6 100644 --- a/lib/response/opWebResponse.class.php +++ b/lib/response/opWebResponse.class.php @@ -16,6 +16,10 @@ */ class opWebResponse extends sfWebResponse { + protected + $displayMember = null, + $displayCommunity = null; + public function getTitle() { $result = parent::getTitle(); @@ -27,6 +31,26 @@ public function getTitle() return $result; } + public function getDisplayMember() + { + return $this->displayMember; + } + + public function setDisplayMember(Member $member) + { + $this->displayMember = $member; + } + + public function getDisplayCommunity() + { + return $this->displayCommunity; + } + + public function setDisplayCommunity(Community $community) + { + $this->displayCommunity = $community; + } + public function generateMobileUidCookie() { $request = sfContext::getInstance()->getRequest(); diff --git a/web/css/bootstrap.css b/web/css/bootstrap.css new file mode 100644 index 000000000..63711555a --- /dev/null +++ b/web/css/bootstrap.css @@ -0,0 +1,2467 @@ +/*! + * Bootstrap @VERSION + * + * Copyright 2011 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + * Date: @DATE + */ +/* Reset.less + * Props to Eric Meyer (meyerweb.com) for his CSS reset file. We're using an adapted version here that cuts out some of the reset HTML elements we will never need here (i.e., dfn, samp, etc). + * ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */ +html, body { + margin: 0; + padding: 0; +} +h1, +h2, +h3, +h4, +h5, +h6, +p, +blockquote, +pre, +a, +abbr, +acronym, +address, +cite, +code, +del, +dfn, +em, +img, +q, +s, +samp, +small, +strike, +strong, +sub, +sup, +tt, +var, +dd, +dl, +dt, +li, +ol, +ul, +fieldset, +form, +label, +legend, +button, +table, +caption, +tbody, +tfoot, +thead, +tr, +th, +td { + margin: 0; + padding: 0; + border: 0; + font-weight: normal; + font-style: normal; + font-size: 100%; + line-height: 1; + font-family: inherit; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +ol, ul { + list-style: none; +} +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} +html { + overflow-y: scroll; + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +a:focus { + outline: thin dotted; +} +a:hover, a:active { + outline: 0; +} +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; +} +sub, sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +img { + border: 0; + -ms-interpolation-mode: bicubic; +} +button, +input, +select, +textarea { + font-size: 100%; + margin: 0; + vertical-align: baseline; + *vertical-align: middle; +} +button, input { + line-height: normal; + *overflow: visible; +} +button::-moz-focus-inner, input::-moz-focus-inner { + border: 0; + padding: 0; +} +button, +input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} +input[type="search"] { + -webkit-appearance: textfield; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +textarea { + overflow: auto; + vertical-align: top; +} +/* Variables.less + * Variables to customize the look and feel of Bootstrap + * ----------------------------------------------------- */ +/* Mixins.less + * Snippets of reusable CSS to develop faster and keep code readable + * ----------------------------------------------------------------- */ +/* + * Scaffolding + * Basic and global styles for generating a grid system, structural layout, and page templates + * ------------------------------------------------------------------------------------------- */ +body { + background-color: #ffffff; + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 18px; + color: #404040; +} +.container { + width: 320px; + margin-left: auto; + margin-right: auto; + zoom: 1; +} +.container:before, .container:after { + display: table; + content: ""; + zoom: 1; +} +.container:after { + clear: both; +} +.container-fluid { + position: relative; + min-width: 940px; + padding-left: 20px; + padding-right: 20px; + zoom: 1; +} +.container-fluid:before, .container-fluid:after { + display: table; + content: ""; + zoom: 1; +} +.container-fluid:after { + clear: both; +} +.container-fluid > .sidebar { + position: absolute; + top: 0; + left: 20px; + width: 220px; +} +.container-fluid > .content { + margin-left: 240px; +} +a { + color: #0069d6; + text-decoration: none; + line-height: inherit; + font-weight: inherit; +} +a:hover { + color: #00438a; + text-decoration: underline; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.hide { + display: none; +} +.show { + display: block; +} +.row { + zoom: 1; + margin-left: -4px; +} +.row:before, .row:after { + display: table; + content: ""; + zoom: 1; +} +.row:after { + clear: both; +} +.row > [class*="span"] { + display: inline; + float: left; + margin-left: 4px; +} +.span1 { + width: 23px; +} +.span2 { + width: 50px; +} +.span3 { + width: 77px; +} +.span4 { + width: 104px; +} +.span5 { + width: 131px; +} +.span6 { + width: 158px; +} +.span7 { + width: 185px; +} +.span8 { + width: 212px; +} +.span9 { + width: 239px; +} +.span10 { + width: 266px; +} +.span11 { + width: 293px; +} +.span12 { + width: 320px; +} +.span13 { + width: 347px; +} +.span14 { + width: 374px; +} +.span15 { + width: 401px; +} +.span16 { + width: 428px; +} +.span17 { + width: 455px; +} +.span18 { + width: 482px; +} +.span19 { + width: 509px; +} +.span20 { + width: 536px; +} +.span21 { + width: 563px; +} +.span22 { + width: 590px; +} +.span23 { + width: 617px; +} +.span24 { + width: 644px; +} +.row > .offset1 { + margin-left: 31px; +} +.row > .offset2 { + margin-left: 58px; +} +.row > .offset3 { + margin-left: 85px; +} +.row > .offset4 { + margin-left: 112px; +} +.row > .offset5 { + margin-left: 139px; +} +.row > .offset6 { + margin-left: 166px; +} +.row > .offset7 { + margin-left: 193px; +} +.row > .offset8 { + margin-left: 220px; +} +.row > .offset9 { + margin-left: 247px; +} +.row > .offset10 { + margin-left: 274px; +} +.row > .offset11 { + margin-left: 301px; +} +.row > .offset12 { + margin-left: 328px; +} +.span-one-third { + width: 300px; +} +.span-two-thirds { + width: 620px; +} +.row > .offset-one-third { + margin-left: 340px; +} +.row > .offset-two-thirds { + margin-left: 660px; +} +/* Typography.less + * Headings, body text, lists, code, and more for a versatile and durable typography system + * ---------------------------------------------------------------------------------------- */ +p { + font-size: 13px; + font-weight: normal; + line-height: 18px; + margin-bottom: 9px; +} +p small { + font-size: 11px; + color: #bfbfbf; +} +h1, +h2, +h3, +h4, +h5, +h6 { + font-weight: bold; + color: #404040; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + color: #bfbfbf; +} +h1 { + margin-bottom: 18px; + font-size: 30px; + line-height: 36px; +} +h1 small { + font-size: 18px; +} +h2 { + font-size: 24px; + line-height: 36px; +} +h2 small { + font-size: 14px; +} +h3, +h4, +h5, +h6 { + line-height: 36px; +} +h3 { + font-size: 18px; +} +h3 small { + font-size: 14px; +} +h4 { + font-size: 16px; +} +h4 small { + font-size: 12px; +} +h5 { + font-size: 14px; +} +h6 { + font-size: 13px; + color: #bfbfbf; + text-transform: uppercase; +} +ul, ol { + margin: 0 0 18px 25px; +} +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} +ul { + list-style: disc; +} +ol { + list-style: decimal; +} +li { + line-height: 18px; + color: #808080; +} +ul.unstyled { + list-style: none; + margin-left: 0; +} +dl { + margin-bottom: 18px; +} +dl dt, dl dd { + line-height: 18px; +} +dl dt { + font-weight: bold; +} +dl dd { + margin-left: 9px; +} +hr { + margin: 20px 0 19px; + border: 0; + border-bottom: 1px solid #eee; +} +strong { + font-style: inherit; + font-weight: bold; +} +em { + font-style: italic; + font-weight: inherit; + line-height: inherit; +} +.muted { + color: #bfbfbf; +} +blockquote { + margin-bottom: 18px; + border-left: 5px solid #eee; + padding-left: 15px; +} +blockquote p { + font-size: 14px; + font-weight: 300; + line-height: 18px; + margin-bottom: 0; +} +blockquote small { + display: block; + font-size: 12px; + font-weight: 300; + line-height: 18px; + color: #bfbfbf; +} +blockquote small:before { + content: '\2014 \00A0'; +} +address { + display: block; + line-height: 18px; + margin-bottom: 18px; +} +code, pre { + padding: 0 3px 2px; + font-family: Monaco, Andale Mono, Courier New, monospace; + font-size: 12px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +code { + background-color: #fee9cc; + color: rgba(0, 0, 0, 0.75); + padding: 1px 3px; +} +pre { + background-color: #f5f5f5; + display: block; + padding: 8.5px; + margin: 0 0 18px; + line-height: 18px; + font-size: 12px; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; +} +/* Forms.less + * Base styles for various input types, form layouts, and states + * ------------------------------------------------------------- */ +form { + margin-bottom: 18px; +} +fieldset { + margin-bottom: 18px; + padding-top: 18px; +} +fieldset legend { + display: block; + padding-left: 150px; + font-size: 19.5px; + line-height: 1; + color: #404040; + *padding: 0 0 5px 145px; + /* IE6-7 */ + + *line-height: 1.5; + /* IE6-7 */ + +} +form .clearfix { + margin-bottom: 18px; + zoom: 1; +} +form .clearfix:before, form .clearfix:after { + display: table; + content: ""; + zoom: 1; +} +form .clearfix:after { + clear: both; +} +label, +input, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: normal; +} +label { + padding-top: 6px; + font-size: 13px; + line-height: 18px; + float: left; + width: 130px; + text-align: right; + color: #404040; +} +form .input { + margin-left: 150px; +} +input[type=checkbox], input[type=radio] { + cursor: pointer; +} +input, +textarea, +select, +.uneditable-input { + display: inline-block; + width: 210px; + height: 18px; + padding: 4px; + font-size: 13px; + line-height: 18px; + color: #808080; + border: 1px solid #ccc; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +select { + padding: initial; +} +input[type=checkbox], input[type=radio] { + width: auto; + height: auto; + padding: 0; + margin: 3px 0; + *margin-top: 0; + /* IE6-7 */ + + line-height: normal; + border: none; +} +input[type=file] { + background-color: #ffffff; + padding: initial; + border: initial; + line-height: initial; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +input[type=button], input[type=reset], input[type=submit] { + width: auto; + height: auto; +} +select, input[type=file] { + height: 27px; + *height: auto; + line-height: 27px; + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + +} +select[multiple] { + height: inherit; + background-color: #ffffff; +} +textarea { + height: auto; +} +.uneditable-input { + background-color: #ffffff; + display: block; + border-color: #eee; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + cursor: not-allowed; +} +:-moz-placeholder { + color: #bfbfbf; +} +::-webkit-input-placeholder { + color: #bfbfbf; +} +input, textarea { + -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -ms-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; + -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1); +} +input:focus, textarea:focus { + outline: 0; + border-color: rgba(82, 168, 236, 0.8); + -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6); +} +input[type=file]:focus, input[type=checkbox]:focus, select:focus { + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + outline: 1px dotted #666; +} +form .clearfix.error > label, form .clearfix.error .help-block, form .clearfix.error .help-inline { + color: #b94a48; +} +form .clearfix.error input, form .clearfix.error textarea { + color: #b94a48; + border-color: #ee5f5b; +} +form .clearfix.error input:focus, form .clearfix.error textarea: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 .clearfix.error .input-prepend .add-on, form .clearfix.error .input-append .add-on { + color: #b94a48; + background-color: #fce6e6; + border-color: #b94a48; +} +form .clearfix.warning > label, form .clearfix.warning .help-block, form .clearfix.warning .help-inline { + color: #c09853; +} +form .clearfix.warning input, form .clearfix.warning textarea { + color: #c09853; + border-color: #ccae64; +} +form .clearfix.warning input:focus, form .clearfix.warning textarea:focus { + border-color: #be9a3f; + -webkit-box-shadow: 0 0 6px #e5d6b1; + -moz-box-shadow: 0 0 6px #e5d6b1; + box-shadow: 0 0 6px #e5d6b1; +} +form .clearfix.warning .input-prepend .add-on, form .clearfix.warning .input-append .add-on { + color: #c09853; + background-color: #d2b877; + border-color: #c09853; +} +form .clearfix.success > label, form .clearfix.success .help-block, form .clearfix.success .help-inline { + color: #468847; +} +form .clearfix.success input, form .clearfix.success textarea { + color: #468847; + border-color: #57a957; +} +form .clearfix.success input:focus, form .clearfix.success textarea:focus { + border-color: #458845; + -webkit-box-shadow: 0 0 6px #9acc9a; + -moz-box-shadow: 0 0 6px #9acc9a; + box-shadow: 0 0 6px #9acc9a; +} +form .clearfix.success .input-prepend .add-on, form .clearfix.success .input-append .add-on { + color: #468847; + background-color: #bcddbc; + border-color: #468847; +} +.input-mini, +input.mini, +textarea.mini, +select.mini { + width: 60px; +} +.input-small, +input.small, +textarea.small, +select.small { + width: 90px; +} +.input-medium, +input.medium, +textarea.medium, +select.medium { + width: 150px; +} +.input-large, +input.large, +textarea.large, +select.large { + width: 210px; +} +.input-xlarge, +input.xlarge, +textarea.xlarge, +select.xlarge { + width: 270px; +} +.input-xxlarge, +input.xxlarge, +textarea.xxlarge, +select.xxlarge { + width: 530px; +} +textarea.xxlarge { + overflow-y: auto; +} +input.span1, textarea.span1 { + display: inline-block; + float: none; + width: 13px; + margin-left: 0; +} +input.span2, textarea.span2 { + display: inline-block; + float: none; + width: 40px; + margin-left: 0; +} +input.span3, textarea.span3 { + display: inline-block; + float: none; + width: 67px; + margin-left: 0; +} +input.span4, textarea.span4 { + display: inline-block; + float: none; + width: 94px; + margin-left: 0; +} +input.span5, textarea.span5 { + display: inline-block; + float: none; + width: 121px; + margin-left: 0; +} +input.span6, textarea.span6 { + display: inline-block; + float: none; + width: 148px; + margin-left: 0; +} +input.span7, textarea.span7 { + display: inline-block; + float: none; + width: 175px; + margin-left: 0; +} +input.span8, textarea.span8 { + display: inline-block; + float: none; + width: 202px; + margin-left: 0; +} +input.span9, textarea.span9 { + display: inline-block; + float: none; + width: 229px; + margin-left: 0; +} +input.span10, textarea.span10 { + display: inline-block; + float: none; + width: 256px; + margin-left: 0; +} +input.span11, textarea.span11 { + display: inline-block; + float: none; + width: 283px; + margin-left: 0; +} +input.span12, textarea.span12 { + display: inline-block; + float: none; + width: 310px; + margin-left: 0; +} +input.span13, textarea.span13 { + display: inline-block; + float: none; + width: 337px; + margin-left: 0; +} +input.span14, textarea.span14 { + display: inline-block; + float: none; + width: 364px; + margin-left: 0; +} +input.span15, textarea.span15 { + display: inline-block; + float: none; + width: 391px; + margin-left: 0; +} +input.span16, textarea.span16 { + display: inline-block; + float: none; + width: 418px; + margin-left: 0; +} +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + background-color: #f5f5f5; + border-color: #ddd; + cursor: not-allowed; +} +.actions { + background: #f5f5f5; + margin-top: 18px; + margin-bottom: 18px; + padding: 17px 20px 18px 150px; + border-top: 1px solid #ddd; + -webkit-border-radius: 0 0 3px 3px; + -moz-border-radius: 0 0 3px 3px; + border-radius: 0 0 3px 3px; +} +.actions .secondary-action { + float: right; +} +.actions .secondary-action a { + line-height: 30px; +} +.actions .secondary-action a:hover { + text-decoration: underline; +} +.help-inline, .help-block { + font-size: 13px; + line-height: 18px; + color: #bfbfbf; +} +.help-inline { + padding-left: 5px; + *position: relative; + /* IE6-7 */ + + *top: -5px; + /* IE6-7 */ + +} +.help-block { + display: block; + max-width: 600px; +} +.inline-inputs { + color: #808080; +} +.inline-inputs span { + padding: 0 2px 0 1px; +} +.input-prepend input, .input-append input { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} +.input-prepend .add-on, .input-append .add-on { + position: relative; + background: #f5f5f5; + border: 1px solid #ccc; + z-index: 2; + float: left; + display: block; + width: auto; + min-width: 16px; + height: 18px; + padding: 4px 4px 4px 5px; + margin-right: -1px; + font-weight: normal; + line-height: 18px; + color: #bfbfbf; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} +.input-prepend .active, .input-append .active { + background: #a9dba9; + border-color: #46a546; +} +.input-prepend .add-on { + *margin-top: 1px; + /* IE6-7 */ + +} +.input-append input { + float: left; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} +.input-append .add-on { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; + margin-right: 0; + margin-left: -1px; +} +.inputs-list { + margin: 0 0 5px; + width: 100%; +} +.inputs-list li { + display: block; + padding: 0; + width: 100%; +} +.inputs-list label { + display: block; + float: none; + width: auto; + padding: 0; + margin-left: 20px; + line-height: 18px; + text-align: left; + white-space: normal; +} +.inputs-list label strong { + color: #808080; +} +.inputs-list label small { + font-size: 11px; + font-weight: normal; +} +.inputs-list .inputs-list { + margin-left: 25px; + margin-bottom: 10px; + padding-top: 0; +} +.inputs-list:first-child { + padding-top: 6px; +} +.inputs-list li + li { + padding-top: 2px; +} +.inputs-list input[type=radio], .inputs-list input[type=checkbox] { + margin-bottom: 0; + margin-left: -20px; + float: left; +} +.form-stacked { + padding-left: 20px; +} +.form-stacked fieldset { + padding-top: 9px; +} +.form-stacked legend { + padding-left: 0; +} +.form-stacked label { + display: block; + float: none; + width: auto; + font-weight: bold; + text-align: left; + line-height: 20px; + padding-top: 0; +} +.form-stacked .clearfix { + margin-bottom: 9px; +} +.form-stacked .clearfix div.input { + margin-left: 0; +} +.form-stacked .inputs-list { + margin-bottom: 0; +} +.form-stacked .inputs-list li { + padding-top: 0; +} +.form-stacked .inputs-list li label { + font-weight: normal; + padding-top: 0; +} +.form-stacked div.clearfix.error { + padding-top: 10px; + padding-bottom: 10px; + padding-left: 10px; + margin-top: 0; + margin-left: -10px; +} +.form-stacked .actions { + margin-left: -20px; + padding-left: 20px; +} +/* + * Tables.less + * Tables for, you guessed it, tabular data + * ---------------------------------------- */ +table { + width: 100%; + margin-bottom: 18px; + padding: 0; + font-size: 13px; + border-collapse: collapse; +} +table th, table td { + padding: 10px 10px 9px; + line-height: 18px; + text-align: left; +} +table th { + padding-top: 9px; + font-weight: bold; + vertical-align: middle; +} +table td { + vertical-align: top; + border-top: 1px solid #ddd; +} +table tbody th { + border-top: 1px solid #ddd; + vertical-align: top; +} +.condensed-table th, .condensed-table td { + padding: 5px 5px 4px; +} +.bordered-table { + border: 1px solid #ddd; + border-collapse: separate; + *border-collapse: collapse; + /* IE7, collapse table to remove spacing */ + + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.bordered-table th + th, .bordered-table td + td, .bordered-table th + td { + border-left: 1px solid #ddd; +} +.bordered-table thead tr:first-child th:first-child, .bordered-table tbody tr:first-child td:first-child { + -webkit-border-radius: 4px 0 0 0; + -moz-border-radius: 4px 0 0 0; + border-radius: 4px 0 0 0; +} +.bordered-table thead tr:first-child th:last-child, .bordered-table tbody tr:first-child td:last-child { + -webkit-border-radius: 0 4px 0 0; + -moz-border-radius: 0 4px 0 0; + border-radius: 0 4px 0 0; +} +.bordered-table tbody tr:last-child td:first-child { + -webkit-border-radius: 0 0 0 4px; + -moz-border-radius: 0 0 0 4px; + border-radius: 0 0 0 4px; +} +.bordered-table tbody tr:last-child td:last-child { + -webkit-border-radius: 0 0 4px 0; + -moz-border-radius: 0 0 4px 0; + border-radius: 0 0 4px 0; +} +table .span1 { + width: 3px; +} +table .span2 { + width: 9px; +} +table .span3 { + width: 15px; +} +table .span4 { + width: 21px; +} +table .span5 { + width: 27px; +} +table .span6 { + width: 33px; +} +table .span7 { + width: 39px; +} +table .span8 { + width: 45px; +} +table .span9 { + width: 51px; +} +table .span10 { + width: 57px; +} +table .span11 { + width: 63px; +} +table .span12 { + width: 69px; +} +table .span13 { + width: 75px; +} +table .span14 { + width: 81px; +} +table .span15 { + width: 87px; +} +table .span16 { + width: 93px; +} +.zebra-striped tbody tr:nth-child(odd) td, .zebra-striped tbody tr:nth-child(odd) th { + background-color: #f9f9f9; +} +.zebra-striped tbody tr:hover td, .zebra-striped tbody tr:hover th { + background-color: #f5f5f5; +} +table .header { + cursor: pointer; +} +table .header:after { + content: ""; + float: right; + margin-top: 7px; + border-width: 0 4px 4px; + border-style: solid; + border-color: #000 transparent; + visibility: hidden; +} +table .headerSortUp, table .headerSortDown { + background-color: rgba(141, 192, 219, 0.25); + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); +} +table .header:hover:after { + visibility: visible; +} +table .headerSortDown:after, table .headerSortDown:hover:after { + visibility: visible; + filter: alpha(opacity=60); + -khtml-opacity: 0.6; + -moz-opacity: 0.6; + opacity: 0.6; +} +table .headerSortUp:after { + border-bottom: none; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 4px solid #000; + visibility: visible; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + filter: alpha(opacity=60); + -khtml-opacity: 0.6; + -moz-opacity: 0.6; + opacity: 0.6; +} +table .blue { + color: #049cdb; + border-bottom-color: #049cdb; +} +table .headerSortUp.blue, table .headerSortDown.blue { + background-color: #ade6fe; +} +table .green { + color: #46a546; + border-bottom-color: #46a546; +} +table .headerSortUp.green, table .headerSortDown.green { + background-color: #cdeacd; +} +table .red { + color: #9d261d; + border-bottom-color: #9d261d; +} +table .headerSortUp.red, table .headerSortDown.red { + background-color: #f4c8c5; +} +table .yellow { + color: #ffc40d; + border-bottom-color: #ffc40d; +} +table .headerSortUp.yellow, table .headerSortDown.yellow { + background-color: #fff6d9; +} +table .orange { + color: #f89406; + border-bottom-color: #f89406; +} +table .headerSortUp.orange, table .headerSortDown.orange { + background-color: #fee9cc; +} +table .purple { + color: #7a43b6; + border-bottom-color: #7a43b6; +} +table .headerSortUp.purple, table .headerSortDown.purple { + background-color: #e2d5f0; +} +/* Patterns.less + * Repeatable UI elements outside the base styles provided from the scaffolding + * ---------------------------------------------------------------------------- */ +.topbar { + height: 40px; + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: 10000; + overflow: visible; +} +.topbar a { + color: #bfbfbf; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.topbar h3 a:hover, .topbar .brand:hover, .topbar ul .active > a { + background-color: #333; + background-color: rgba(255, 255, 255, 0.05); + color: #ffffff; + text-decoration: none; +} +.topbar h3 { + position: relative; +} +.topbar h3 a, .topbar .brand { + float: left; + display: block; + padding: 8px 20px 12px; + margin-left: -20px; + color: #ffffff; + font-size: 20px; + font-weight: 200; + line-height: 1; +} +.topbar p { + margin: 0; + line-height: 40px; +} +.topbar p a:hover { + background-color: transparent; + color: #ffffff; +} +.topbar form { + float: left; + margin: 5px 0 0 0; + position: relative; + filter: alpha(opacity=100); + -khtml-opacity: 1; + -moz-opacity: 1; + opacity: 1; +} +.topbar form.pull-right { + float: right; +} +.topbar input { + background-color: #444; + background-color: rgba(255, 255, 255, 0.3); + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: normal; + font-weight: 13px; + line-height: 1; + padding: 4px 9px; + color: #ffffff; + color: rgba(255, 255, 255, 0.75); + border: 1px solid #111; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.25); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.25); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.25); + -webkit-transition: none; + -moz-transition: none; + -ms-transition: none; + -o-transition: none; + transition: none; +} +.topbar input:-moz-placeholder { + color: #e6e6e6; +} +.topbar input::-webkit-input-placeholder { + color: #e6e6e6; +} +.topbar input:hover { + background-color: #bfbfbf; + background-color: rgba(255, 255, 255, 0.5); + color: #ffffff; +} +.topbar input:focus, .topbar input.focused { + outline: 0; + background-color: #ffffff; + color: #404040; + text-shadow: 0 1px 0 #ffffff; + border: 0; + padding: 5px 10px; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); +} +.topbar-inner, .topbar .fill { + background-color: #222; + background-color: #222222; + background-repeat: repeat-x; + background-image: -khtml-gradient(linear, left top, left bottom, from(#333333), to(#222222)); + background-image: -moz-linear-gradient(top, #333333, #222222); + background-image: -ms-linear-gradient(top, #333333, #222222); + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #333333), color-stop(100%, #222222)); + background-image: -webkit-linear-gradient(top, #333333, #222222); + background-image: -o-linear-gradient(top, #333333, #222222); + background-image: linear-gradient(top, #333333, #222222); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); +} +.topbar div > ul, .nav { + display: block; + float: left; + margin: 0 10px 0 0; + position: relative; + left: 0; +} +.topbar div > ul > li, .nav > li { + display: block; + float: left; +} +.topbar div > ul a, .nav a { + display: block; + float: none; + padding: 10px 10px 11px; + line-height: 19px; + text-decoration: none; +} +.topbar div > ul a:hover, .nav a:hover { + color: #ffffff; + text-decoration: none; +} +.topbar div > ul .active > a, .nav .active > a { + background-color: #222; + background-color: rgba(0, 0, 0, 0.5); +} +.topbar div > ul.secondary-nav, .nav.secondary-nav { + float: right; + margin-left: 10px; + margin-right: 0; +} +.topbar div > ul.secondary-nav .menu-dropdown, +.nav.secondary-nav .menu-dropdown, +.topbar div > ul.secondary-nav .dropdown-menu, +.nav.secondary-nav .dropdown-menu { + right: 0; + border: 0; +} +.topbar div > ul a.menu:hover, +.nav a.menu:hover, +.topbar div > ul li.open .menu, +.nav li.open .menu, +.topbar div > ul .dropdown-toggle:hover, +.nav .dropdown-toggle:hover, +.topbar div > ul .dropdown.open .dropdown-toggle, +.nav .dropdown.open .dropdown-toggle { + background: #444; + background: rgba(255, 255, 255, 0.05); +} +.topbar div > ul .menu-dropdown, +.nav .menu-dropdown, +.topbar div > ul .dropdown-menu, +.nav .dropdown-menu { + background-color: #333; +} +.topbar div > ul .menu-dropdown a.menu, +.nav .menu-dropdown a.menu, +.topbar div > ul .dropdown-menu a.menu, +.nav .dropdown-menu a.menu, +.topbar div > ul .menu-dropdown .dropdown-toggle, +.nav .menu-dropdown .dropdown-toggle, +.topbar div > ul .dropdown-menu .dropdown-toggle, +.nav .dropdown-menu .dropdown-toggle { + color: #ffffff; +} +.topbar div > ul .menu-dropdown a.menu.open, +.nav .menu-dropdown a.menu.open, +.topbar div > ul .dropdown-menu a.menu.open, +.nav .dropdown-menu a.menu.open, +.topbar div > ul .menu-dropdown .dropdown-toggle.open, +.nav .menu-dropdown .dropdown-toggle.open, +.topbar div > ul .dropdown-menu .dropdown-toggle.open, +.nav .dropdown-menu .dropdown-toggle.open { + background: #444; + background: rgba(255, 255, 255, 0.05); +} +.topbar div > ul .menu-dropdown li a, +.nav .menu-dropdown li a, +.topbar div > ul .dropdown-menu li a, +.nav .dropdown-menu li a { + color: #999; + text-shadow: 0 1px 0 rgba(0, 0, 0, 0.5); +} +.topbar div > ul .menu-dropdown li a:hover, +.nav .menu-dropdown li a:hover, +.topbar div > ul .dropdown-menu li a:hover, +.nav .dropdown-menu li a:hover { + background-color: #191919; + background-repeat: repeat-x; + background-image: -khtml-gradient(linear, left top, left bottom, from(#292929), to(#191919)); + background-image: -moz-linear-gradient(top, #292929, #191919); + background-image: -ms-linear-gradient(top, #292929, #191919); + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #292929), color-stop(100%, #191919)); + background-image: -webkit-linear-gradient(top, #292929, #191919); + background-image: -o-linear-gradient(top, #292929, #191919); + background-image: linear-gradient(top, #292929, #191919); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#292929', endColorstr='#191919', GradientType=0); + color: #ffffff; +} +.topbar div > ul .menu-dropdown .active a, +.nav .menu-dropdown .active a, +.topbar div > ul .dropdown-menu .active a, +.nav .dropdown-menu .active a { + color: #ffffff; +} +.topbar div > ul .menu-dropdown .divider, +.nav .menu-dropdown .divider, +.topbar div > ul .dropdown-menu .divider, +.nav .dropdown-menu .divider { + background-color: #222; + border-color: #444; +} +.topbar ul .menu-dropdown li a, .topbar ul .dropdown-menu li a { + padding: 4px 15px; +} +li.menu, .dropdown { + position: relative; +} +a.menu:after, .dropdown-toggle:after { + width: 0; + height: 0; + display: inline-block; + content: "↓"; + text-indent: -99999px; + vertical-align: top; + margin-top: 8px; + margin-left: 4px; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 4px solid #ffffff; + filter: alpha(opacity=50); + -khtml-opacity: 0.5; + -moz-opacity: 0.5; + opacity: 0.5; +} +.menu-dropdown, .dropdown-menu { + background-color: #ffffff; + float: left; + display: none; + position: absolute; + top: 40px; + z-index: 900; + min-width: 160px; + max-width: 220px; + _width: 160px; + margin-left: 0; + margin-right: 0; + padding: 6px 0; + zoom: 1; + border-color: #999; + border-color: rgba(0, 0, 0, 0.2); + border-style: solid; + border-width: 0 1px 1px; + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + -webkit-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} +.menu-dropdown li, .dropdown-menu li { + float: none; + display: block; + background-color: none; +} +.menu-dropdown .divider, .dropdown-menu .divider { + height: 1px; + margin: 5px 0; + overflow: hidden; + background-color: #eee; + border-bottom: 1px solid #ffffff; +} +.topbar .dropdown-menu a, .dropdown-menu a { + display: block; + padding: 4px 15px; + clear: both; + font-weight: normal; + line-height: 18px; + color: #808080; + text-shadow: 0 1px 0 #ffffff; +} +.topbar .dropdown-menu a:hover, +.dropdown-menu a:hover, +.topbar .dropdown-menu a.hover, +.dropdown-menu a.hover { + background-color: #dddddd; + background-repeat: repeat-x; + background-image: -khtml-gradient(linear, left top, left bottom, from(#eeeeee), to(#dddddd)); + background-image: -moz-linear-gradient(top, #eeeeee, #dddddd); + background-image: -ms-linear-gradient(top, #eeeeee, #dddddd); + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #eeeeee), color-stop(100%, #dddddd)); + background-image: -webkit-linear-gradient(top, #eeeeee, #dddddd); + background-image: -o-linear-gradient(top, #eeeeee, #dddddd); + background-image: linear-gradient(top, #eeeeee, #dddddd); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#dddddd', GradientType=0); + color: #404040; + text-decoration: none; + -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px rgba(0, 0, 0, 0.025); +} +.open .menu, +.dropdown.open .menu, +.open .dropdown-toggle, +.dropdown.open .dropdown-toggle { + color: #ffffff; + background: #ccc; + background: rgba(0, 0, 0, 0.3); +} +.open .menu-dropdown, +.dropdown.open .menu-dropdown, +.open .dropdown-menu, +.dropdown.open .dropdown-menu { + display: block; +} +.tabs, .pills { + margin: 0 0 18px; + padding: 0; + list-style: none; + zoom: 1; +} +.tabs:before, +.pills:before, +.tabs:after, +.pills:after { + display: table; + content: ""; + zoom: 1; +} +.tabs:after, .pills:after { + clear: both; +} +.tabs > li, .pills > li { + float: left; +} +.tabs > li > a, .pills > li > a { + display: block; +} +.tabs { + border-color: #ddd; + border-style: solid; + border-width: 0 0 1px; +} +.tabs > li { + position: relative; + margin-bottom: -1px; +} +.tabs > li > a { + padding: 0 15px; + margin-right: 2px; + line-height: 34px; + border: 1px solid transparent; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} +.tabs > li > a:hover { + text-decoration: none; + background-color: #eee; + border-color: #eee #eee #ddd; +} +.tabs .active > a, .tabs .active > a:hover { + color: #808080; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; + cursor: default; +} +.tabs .menu-dropdown, .tabs .dropdown-menu { + top: 35px; + border-width: 1px; + -webkit-border-radius: 0 6px 6px 6px; + -moz-border-radius: 0 6px 6px 6px; + border-radius: 0 6px 6px 6px; +} +.tabs a.menu:after, .tabs .dropdown-toggle:after { + border-top-color: #999; + margin-top: 15px; + margin-left: 5px; +} +.tabs li.open.menu .menu, .tabs .open.dropdown .dropdown-toggle { + border-color: #999; +} +.tabs li.open a.menu:after, .tabs .dropdown.open .dropdown-toggle:after { + border-top-color: #555; +} +.pills a { + margin: 5px 3px 5px 0; + padding: 0 15px; + line-height: 30px; + text-shadow: 0 1px 1px #ffffff; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} +.pills a:hover { + color: #ffffff; + text-decoration: none; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.25); + background-color: #00438a; +} +.pills .active a { + color: #ffffff; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.25); + background-color: #0069d6; +} +.pills-vertical > li { + float: none; +} +.tab-content > .tab-pane, +.pill-content > .pill-pane, +.tab-content > div, +.pill-content > div { + display: none; +} +.tab-content > .active, .pill-content > .active { + display: block; +} +.breadcrumb { + padding: 7px 14px; + margin: 0 0 18px; + background-color: #f5f5f5; + background-repeat: repeat-x; + background-image: -khtml-gradient(linear, left top, left bottom, from(#ffffff), to(#f5f5f5)); + background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #f5f5f5)); + background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -o-linear-gradient(top, #ffffff, #f5f5f5); + background-image: linear-gradient(top, #ffffff, #f5f5f5); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0); + border: 1px solid #ddd; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} +.breadcrumb li { + display: inline; + text-shadow: 0 1px 0 #ffffff; +} +.breadcrumb .divider { + padding: 0 5px; + color: #bfbfbf; +} +.breadcrumb .active a { + color: #404040; +} +.hero-unit { + background-color: #f5f5f5; + margin-bottom: 30px; + padding: 60px; + -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; +} +.hero-unit p { + font-size: 18px; + font-weight: 200; + line-height: 27px; +} +footer { + margin-top: 17px; + padding-top: 17px; + border-top: 1px solid #eee; +} +.page-header { + margin-bottom: 17px; + border-bottom: 1px solid #ddd; + -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + -moz-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} +.page-header h1 { + margin-bottom: 8px; +} +.btn.danger, +.alert-message.danger, +.btn.danger:hover, +.alert-message.danger:hover, +.btn.error, +.alert-message.error, +.btn.error:hover, +.alert-message.error:hover, +.btn.success, +.alert-message.success, +.btn.success:hover, +.alert-message.success:hover, +.btn.info, +.alert-message.info, +.btn.info:hover, +.alert-message.info:hover { + color: #ffffff; +} +.btn .close, .alert-message .close { + font-family: Arial, sans-serif; + line-height: 18px; +} +.btn.danger, +.alert-message.danger, +.btn.error, +.alert-message.error { + background-color: #c43c35; + background-repeat: repeat-x; + background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35)); + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(top, #ee5f5b, #c43c35); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + border-color: #c43c35 #c43c35 #882a25; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); +} +.btn.success, .alert-message.success { + background-color: #57a957; + background-repeat: repeat-x; + background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957)); + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -ms-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(top, #62c462, #57a957); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0); + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + border-color: #57a957 #57a957 #3d773d; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); +} +.btn.info, .alert-message.info { + background-color: #339bb9; + background-repeat: repeat-x; + background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9)); + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -ms-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9)); + background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: linear-gradient(top, #5bc0de, #339bb9); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0); + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + border-color: #339bb9 #339bb9 #22697d; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); +} +.btn { + cursor: pointer; + display: inline-block; + background-color: #e6e6e6; + background-repeat: no-repeat; + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); + background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6); + background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); + background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); + background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); + padding: 5px 14px 6px; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + color: #333; + font-size: 13px; + line-height: normal; + border: 1px solid #ccc; + border-bottom-color: #bbb; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -webkit-transition: 0.1s linear all; + -moz-transition: 0.1s linear all; + -ms-transition: 0.1s linear all; + -o-transition: 0.1s linear all; + transition: 0.1s linear all; +} +.btn:hover { + background-position: 0 -15px; + color: #333; + text-decoration: none; +} +.btn:focus { + outline: 1px dotted #666; +} +.btn.primary { + color: #ffffff; + background-color: #0064cd; + background-repeat: repeat-x; + background-image: -khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd)); + background-image: -moz-linear-gradient(top, #049cdb, #0064cd); + background-image: -ms-linear-gradient(top, #049cdb, #0064cd); + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd)); + background-image: -webkit-linear-gradient(top, #049cdb, #0064cd); + background-image: -o-linear-gradient(top, #049cdb, #0064cd); + background-image: linear-gradient(top, #049cdb, #0064cd); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0); + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + border-color: #0064cd #0064cd #003f81; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); +} +.btn.active, .btn:active { + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); +} +.btn.disabled { + cursor: default; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + filter: alpha(opacity=65); + -khtml-opacity: 0.65; + -moz-opacity: 0.65; + opacity: 0.65; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.btn[disabled] { + cursor: default; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + filter: alpha(opacity=65); + -khtml-opacity: 0.65; + -moz-opacity: 0.65; + opacity: 0.65; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.btn.large { + font-size: 15px; + line-height: normal; + padding: 9px 14px 9px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.btn.small { + padding: 7px 9px 7px; + font-size: 11px; +} +:root .alert-message, :root .btn { + border-radius: 0 \0; +} +button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner { + padding: 0; + border: 0; +} +.close { + float: right; + color: #000000; + font-size: 20px; + font-weight: bold; + line-height: 13.5px; + text-shadow: 0 1px 0 #ffffff; + filter: alpha(opacity=25); + -khtml-opacity: 0.25; + -moz-opacity: 0.25; + opacity: 0.25; +} +.close:hover { + color: #000000; + text-decoration: none; + filter: alpha(opacity=40); + -khtml-opacity: 0.4; + -moz-opacity: 0.4; + opacity: 0.4; +} +.alert-message { + position: relative; + padding: 7px 15px; + margin-bottom: 18px; + color: #404040; + background-color: #eedc94; + background-repeat: repeat-x; + background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94)); + background-image: -moz-linear-gradient(top, #fceec1, #eedc94); + background-image: -ms-linear-gradient(top, #fceec1, #eedc94); + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94)); + background-image: -webkit-linear-gradient(top, #fceec1, #eedc94); + background-image: -o-linear-gradient(top, #fceec1, #eedc94); + background-image: linear-gradient(top, #fceec1, #eedc94); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0); + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + border-color: #eedc94 #eedc94 #e4c652; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + border-width: 1px; + border-style: solid; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); +} +.alert-message .close { + margin-top: 1px; + *margin-top: 0; +} +.alert-message a { + font-weight: bold; + color: #404040; +} +.alert-message.danger p a, +.alert-message.error p a, +.alert-message.success p a, +.alert-message.info p a { + color: #ffffff; +} +.alert-message h5 { + line-height: 18px; +} +.alert-message p { + margin-bottom: 0; +} +.alert-message div { + margin-top: 5px; + margin-bottom: 2px; + line-height: 28px; +} +.alert-message .btn { + -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); + -moz-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); +} +.alert-message.block-message { + background-image: none; + background-color: #fdf5d9; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + padding: 14px; + border-color: #fceec1; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.alert-message.block-message ul, .alert-message.block-message p { + margin-right: 30px; +} +.alert-message.block-message ul { + margin-bottom: 0; +} +.alert-message.block-message li { + color: #404040; +} +.alert-message.block-message .alert-actions { + margin-top: 5px; +} +.alert-message.block-message.error, .alert-message.block-message.success, .alert-message.block-message.info { + color: #404040; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} +.alert-message.block-message.error { + background-color: #fddfde; + border-color: #fbc7c6; +} +.alert-message.block-message.success { + background-color: #d1eed1; + border-color: #bfe7bf; +} +.alert-message.block-message.info { + background-color: #ddf4fb; + border-color: #c6edf9; +} +.alert-message.block-message.danger p a, +.alert-message.block-message.error p a, +.alert-message.block-message.success p a, +.alert-message.block-message.info p a { + color: #404040; +} +.pagination { + height: 36px; + margin: 18px 0; +} +.pagination ul { + float: left; + margin: 0; + border: 1px solid #ddd; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} +.pagination li { + display: inline; +} +.pagination a { + float: left; + padding: 0 14px; + line-height: 34px; + border-right: 1px solid; + border-right-color: #ddd; + border-right-color: rgba(0, 0, 0, 0.15); + *border-right-color: #ddd; + /* IE6-7 */ + + text-decoration: none; +} +.pagination a:hover, .pagination .active a { + background-color: #c7eefe; +} +.pagination .disabled a, .pagination .disabled a:hover { + background-color: transparent; + color: #bfbfbf; +} +.pagination .next a { + border: 0; +} +.well { + background-color: #f5f5f5; + margin-bottom: 20px; + padding: 19px; + min-height: 20px; + border: 1px solid #eee; + border: 1px solid rgba(0, 0, 0, 0.05); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} +.modal-backdrop { + background-color: #000000; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 10000; +} +.modal-backdrop.fade { + opacity: 0; +} +.modal-backdrop, .modal-backdrop.fade.in { + filter: alpha(opacity=80); + -khtml-opacity: 0.8; + -moz-opacity: 0.8; + opacity: 0.8; +} +.modal { + position: fixed; + top: 50%; + left: 50%; + z-index: 11000; + width: 560px; + margin: -250px 0 0 -280px; + background-color: #ffffff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.3); + *border: 1px solid #999; + /* IE6-7 */ + + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} +.modal .close { + margin-top: 7px; +} +.modal.fade { + -webkit-transition: opacity .3s linear, top .3s ease-out; + -moz-transition: opacity .3s linear, top .3s ease-out; + -ms-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; + top: -25%; +} +.modal.fade.in { + top: 50%; +} +.modal-header { + border-bottom: 1px solid #eee; + padding: 5px 15px; +} +.modal-body { + padding: 15px; +} +.modal-body form { + margin-bottom: 0; +} +.modal-footer { + background-color: #f5f5f5; + padding: 14px 15px 15px; + 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; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; + zoom: 1; + margin-bottom: 0; +} +.modal-footer:before, .modal-footer:after { + display: table; + content: ""; + zoom: 1; +} +.modal-footer:after { + clear: both; +} +.modal-footer .btn { + float: right; + margin-left: 5px; +} +.modal .popover, .modal .twipsy { + z-index: 12000; +} +.twipsy { + display: block; + position: absolute; + visibility: visible; + padding: 5px; + font-size: 11px; + z-index: 1000; + filter: alpha(opacity=80); + -khtml-opacity: 0.8; + -moz-opacity: 0.8; + opacity: 0.8; +} +.twipsy.fade.in { + filter: alpha(opacity=80); + -khtml-opacity: 0.8; + -moz-opacity: 0.8; + opacity: 0.8; +} +.twipsy.above .twipsy-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-top: 5px solid #000000; +} +.twipsy.left .twipsy-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-left: 5px solid #000000; +} +.twipsy.below .twipsy-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-bottom: 5px solid #000000; +} +.twipsy.right .twipsy-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-right: 5px solid #000000; +} +.twipsy-inner { + padding: 3px 8px; + background-color: #000000; + color: white; + text-align: center; + max-width: 200px; + text-decoration: none; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.twipsy-arrow { + position: absolute; + width: 0; + height: 0; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1000; + padding: 5px; + display: none; +} +.popover.above .arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-top: 5px solid #000000; +} +.popover.right .arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-right: 5px solid #000000; +} +.popover.below .arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-bottom: 5px solid #000000; +} +.popover.left .arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-left: 5px solid #000000; +} +.popover .arrow { + position: absolute; + width: 0; + height: 0; +} +.popover .inner { + background: #000000; + background: rgba(0, 0, 0, 0.8); + padding: 3px; + overflow: hidden; + width: 280px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); +} +.popover .title { + background-color: #f5f5f5; + padding: 9px 15px; + line-height: 1; + -webkit-border-radius: 3px 3px 0 0; + -moz-border-radius: 3px 3px 0 0; + border-radius: 3px 3px 0 0; + border-bottom: 1px solid #eee; +} +.popover .content { + background-color: #ffffff; + padding: 14px; + -webkit-border-radius: 0 0 3px 3px; + -moz-border-radius: 0 0 3px 3px; + border-radius: 0 0 3px 3px; + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} +.popover .content p, .popover .content ul, .popover .content ol { + margin-bottom: 0; +} +.fade { + -webkit-transition: opacity 0.15s linear; + -moz-transition: opacity 0.15s linear; + -ms-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; + opacity: 0; +} +.fade.in { + opacity: 1; +} +.label { + padding: 1px 3px 2px; + font-size: 9.75px; + font-weight: bold; + color: #ffffff; + text-transform: uppercase; + white-space: nowrap; + background-color: #bfbfbf; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.label.important { + background-color: #c43c35; +} +.label.warning { + background-color: #f89406; +} +.label.success { + background-color: #46a546; +} +.label.notice { + background-color: #62cffc; +} +.media-grid { + margin-left: -4px; + margin-bottom: 0; + zoom: 1; +} +.media-grid:before, .media-grid:after { + display: table; + content: ""; + zoom: 1; +} +.media-grid:after { + clear: both; +} +.media-grid li { + display: inline; +} +.media-grid a { + float: left; + padding: 4px; + margin: 0 0 18px 4px; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); +} +.media-grid a img { + display: block; +} +.media-grid a:hover { + border-color: #0069d6; + -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); +} diff --git a/web/css/smt_main.css b/web/css/smt_main.css new file mode 100644 index 000000000..5b2289b0e --- /dev/null +++ b/web/css/smt_main.css @@ -0,0 +1,147 @@ +#face .row { + padding: 0 0 0 6px; +} +#face a { + font-size: 14px; +} +#face { + height: 52px; + background: #eee; + padding: 4px 0 0 0; +} +#face .face-name { + font-size: 20px; + margin: 4px 0; +} + +#tosaka { + height: 44px; + background: #555; + padding-top: 8px; +} +#tosaka div { + height: 100%; +} + +.center { + margin-left: auto; + margin-right: auto; + text-align: center; +} + +.debug { + background: #aaa; + text-align: center; + height: 32px; +} + +.gadget_header { + background: #333; + color: #fff; + text-align: center; + padding: 9px 0; + font-size: 16px; +} + +body { + width: 320px; +} + +hr.toumei { + margin: 0; + height: 4px; + border-color: transparent; +} + +.menu-margin { + background: #555; + height: 12px; + margin-top: 0; +} +.menu-top { + color: #fff; + background: #555; + -webkit-border-radius: 10px 10px 0 0; + -moz-border-radius: 10px 10px 0 0; + border-radius: 10px 10px 0 0; +} +.menu-middle { + color: #fff; + background: #555; +} +.menu-middle .btn { + margin-right: 1px; + margin-bottom: 6px; +} +.menu-bottom { + background: #555; + -webkit-border-radius: 0 0 10px 10px; + -moz-border-radius: 0 0 10px 10px; + border-radius: 0 0 10px 10px; +} + +.rad4 { + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.rad6 { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.rad10 { + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + border-radius: 10px; +} + +.font10 { + font-size: 10px; +} +.font12 { + font-size: 12px; +} +.font14 { + font-size: 14px; +} +.font16 { + font-size: 16px; +} +.font18 { + font-size: 18px; +} + +.row_memberimg { + height: 57px; +} +.row_membername { + height: 30px; +} + +* { + word-break: break-all; +} + +/*---------------------------------------------- + * Override bootstrap.css rules + *--------------------------------------------*/ +label { + width: auto !important; +} + +table { + margin-bottom: 6px !important; +} + +table td { + padding: 0 !important; +} + +table th { + padding: 9px 0 0 0 !important; +} + +table td { + border-top: none !important; +} diff --git a/web/images/HomeIcon.png b/web/images/HomeIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..853291b6ea4b27e212bce790fd7c0da8acf6976c GIT binary patch literal 47837 zcmb^2Q*Vg1>iSguQIwZJ0N?;XKtK?rBt?JyJ2L%Cyf9Gz_C&p0pZ^XJPQp?uF#k4h7~}AN zd02Z%O(zf#z{P(FG%yn3_rH@E&SDzQB90~o&K7pIL@E|GCLo-QKYubZaRntS82&4O z_g?{JJ5y&j14k1OA!9p36C!a7M-w+YM=K{H5oI=qrUP~m5Eu!2M>Tc#tSfB=1zZXA zTt6Ve7YI?&IKCgK_s9y#(Jz`Kkd|4QQ%KA*V#zc~v3OJ(A*3@PB`p3dZ4EdEbRv>CB0WBSE|U)x!0#(OJVea%i~9S;KMUI46f8IwAJl za;0jts`f+$->ioF>$SztnAE*u?d<(>bKHW4&jWD;x~+q))s^ny+!)kP>z?`M3Qu(} zL&+m2P6_GRKr1tw(}ng!$H_y*-&55G!>kK%(mmQ;TFC$A#pbm2P=6>p&wt%8IrztL z$vAZ`Bv#_BgUzT=J-sdwa4it`K}u=A<>qDUBD4(J(~Co6!l54cp193p6ZG~eL=U@? zl+@2 z&~pTKElfZ*(dpC(I-0QMi+CnUC)uz0L|pz~mgAcki0l`>L(6|ar{+D~K6E1iG>CGV zZspFC1t3((3%s&W2!g`p&h_nqdyvELQRlOIJ3WFDuF8-HgPEY_gmMVhyhd~dAO1o( z1Lyya13X5>+917}gL3NwadfWpq2|HB_mGU+fQqNT!95I-Khyhv+=9NMqbu6v-H{$C z^i4-;owCjfHVYnplEWyo&)O&i{m|FuHu(EVjUwC9?a0m)8f;P;fNYOP?FWdd#?gBZ zv_<$M)r2I>4PPe6@g{NqqLYhSZJ!SvC}IhZCf|NkqocPkR1ya0je!*=aQLuVk>GuF zD|S^xStK%sI)}BtMJ5;A^`vxN6r0-|a^aJ>FRB<)W z?bpb2@-FVc51MiLWSP>-jfT;aNG1P!$2bczkazQ{@8iqX8C}iOPxb0#iM>7(Omk{( zB*pqV8F;rBBF%?#a3M(f!#8N`3v3jQoAxLrBngSDX0uWb7gSzJ=^ZbN$& zh_3wV1FAomfm?i=ej7bneuUwIJx%9Ae$syz62F~1@H813l&pjM6;t>|KbL?%d~d(H znfM`Q(>A;wfW-~viiP{73$Q%f9TLWWrQU%bSb4TTyWD0ToX!FmJ%r?5eAXUlf9%+nAUQN3XUIYsIfUZiVQtl(4U#AaW3SI&yDc=pX zptD?lSvF_nVKNQc4L=G@jZtHfDg0E33gAzI77?a1O6q zy1SbBN^1yRQv&5j*@kR*-8+-?dv~OOZxM`1fgN;Ev+|Bm$rU{+=7|_q{fYw;su;j` zJwt$aHjw}N1PSlNq)BnL;(F8}O^bTi@f+#pyM!=DAe-3CVfSSoDDnxqcMy*1c9|TK zm$=kdQ?2+VNc7eFqI3laQfl5hsF>qGNQdqGpmv;N|Axtt)Mv{gM@@Uik_m@^L1fL> zCcFJLy;q5sK_1np*2`OwF(sR8Twn3D{3?9FqRF#)rmx7Xu2FA+jsr$5%UcL7UUet3 zu`{yriQRNt)MVqGf6J9}P?est6gqq&_X&!Gz?ex)485&Q<DpAY@+J^nNd8O~7)AI!a1tB1P|yCFe|a;Z`q@XQj|SVyWjf-w zbDR04x8p4ap^E6E2u5LO@Ks~=9mYt^Lr{)fr>!OB!#3!5^QGYQIiL=f<39Vk*|m9QfIm{kJ>=tNd_2O!^X*KE+_8JI5qa=*)b$Hv zC#1U5nZu;BH4M^C@0^*r1L~&PgI1Z;%(AJ^rRC9U5n9Xb)2&5m=266Z1h1KpVhs8N zSnDTu4uss7v?Y3YBaM<2 zvL+8RX9uoZ?A1=RncGF4p6$iQ`uQ-U>1XK5^ptECIi;CEFaKfTP+Qr;)YQ{K!b82K zA)U<=rYXL+n*-QG_L~5@=Mj6-^r4<>XC^dW_O$oEu7{+Jm9Y5x_Bilg4Dm1hf7+=3 zvgCt+@Xgp*sVM*JrugVY;jO9qnYeX5zixEQkw74k_7TF&bGMYgKR}iV6q}iDu`FyX z8O5smFX?QVAm!j^-np}zQW3`q!axY|-ojJ;CJ9KAl%6)={p`AlHu34IdPb|qY5K-{)2o8Rb}2T-&aGj2fMgEqxUd)ZEn*0k=o zYsd041D>j02prd=K+A$HA^r-_twQ0lmt&>QEL29-*24L3J+Fc*%jS;mHqeclzGt6R zTZ>p$37*B2CI)X$z((l0ByRiG@iGXb&c~(sRHnwN0`Nt^%sTQ{Bi;en)pwWG}Xt*4p;;E!qO$ImJ?A%=3mx-}4 zB|=uUUm%UggE)gfFOYbMg)gn2%%T)czYNlw%%)ehf2=O&9?Ih~Oqum$9x{S+d#d1<7s!%>z zHd|6Kb}m)CNtolykklivY)|KmnAIfi+QPsNix%dDm_EzpcDx}f#L4QF^+{X9+JSPb zjg$z9qebU(eisa!Mj2&B%;x*^dRJB=BH>F6Lcomy5zEAbR+O0kFeVVbmk>)#@)8A; zP3pE?^4|SyFKw*0SE|Zo`B(}XZA87VR@9BbY1~eHxmXG_OXVuG8sQU@$=ql1BOPY0 zoJ73B@lYD9J)yUnte0iC03wIkp3~hM?j=jjEjl=B!ipKSJrvN1T0@1|EGN_slRyQ zt%}^LNc4}5{d-mRNK@cPrI9&NTW@jV*SWTixl9~zMylDMYJUU5F>u@*Ydgm!Grga{ z*9l839qG(zm9>n7sU(3URrI-S#gJbxZWBVhPvcZUd)2VKFW%ZFtaC!Y{u<#1;%bhX z;SNQNo6#yGMZ6>ohkvnzC_}1(g9s+q_t^>RQ>~RzX%^q%x{^x~yH(nx9Z){uk)jAI zn>Ua|y{Pa(zrz}_1|mI~zj9zV(2-NQj1Mo-{@_*_Zwx)h%!>$x(SsQyEH4JMKdOF=*--<=FA|CO0=2NfcP-#G+Y z9?2o75mouXtc-}=+JsA}zttOza2^vYbD%%nA8-2lJjY0h$U}_C1KOVCL{Q_p&ks7C z#Hz5M(J|t?xQNQUhB|raQ5Mf=1P#=p+@CI)GiEjPvjK05EX*NV<=#9(TKdUz2bL1| zr!44SOtg33VLS?nUveqQlE!F_9}d+LN=+~M9YadjuGC=pDv;eJ1DtZBSK+_X&=`)4 zQaCX5CikbgCzXt>N*j|#!gYo5$KMafS1Z5<=qo*>rZ?vaz%#;aSf!KZE@%((r1-}M z5SM7Xf0(``S8uLN{|OmPE0-5iaRKzt+QbkyQ8b|g;v4>8aZyuPn3wP@D?+`u|?|3?x`mnrypJyaB41ZCd| znkxjS_l!EfIpm@~1Zo4LO;IWe*?65w^A<_>F~X4;G+)r2H#32Q&L6)bn^WpgDj_42 zqy3UuSgfIGKmH|&mzw&6IN(5?5w%VjMj${@hrGHPIi(=(75LZ~))R(oN1NT-hSPB7S!dkk#SY=LFE?T^G+ zJ8BWd)CP{M3wLBhA~R{0=V1<^pP|D~1$@e;CGrUXrpu4AT5g>ZR9C5o~VggZ&MGRYz+#Pi+)C;uyRKwNbftd|=x!*GDV zNfne9(%whrE$jp^d}ndp+TBs)Sm{X0GTGy?EMe)jAWcWbfL+EoX*~%H+f{AUUCdwA zuV9ivT*i#$YFVD&G~JTDEU5^)&wNm4OLqI`I( zv=KAXRDjP;E{bO$Bc(GfL2_YVrbs2I*wB*i*YX3=RRrEi{ByO+^g-Rn;pT`+KIPQ( zuYr+-k{7ay(jr7ad4iPeKIs&5zjlP;A)zcVfbumtUh?)1oIHVin8mwXz@=-Rx~7P1 zz&T45NCQ#p^J`&j^hd*Qj|dvpnpB8#C2DaVIB>T5)-LkqmRDCA5fAq2RI#_V$-bv@ zir_1pne{}2b2%*=10CrQavI4z?){~#g(Nx3UleCWmi*cp3SAI7r)6cr3(rszf9EAt z;cL~0(5o#iqD)sZbyWxpPvtlgiYH|`o;&^~C0f1gF&B%96j*4-3OeLX&K3R2nSU5m z<=Uq}4;{IHuvR&dgx@Lh|5#hW%My%M$^(dZQ7zV?tBv?Zpu{E2Hz&^_kdot4HX)RK|axhUCgQ;it@FX)+Ckg+C&b5lCn?XW^~K z7Kf9RRuYtF-!)J{cX?yuw@!j8i8RV0s@5!`I_Vk_O3EyHOf2XEZLlaC&A{ZS5mSz}nDxL&B@CQ$kuq>9^Lm&>>V5PB8 zPJe|}HJN>9#?US<(;J0IJi(zUX}WKdlKRt|b!|&_{r8P^PH9&KIE?O*PmL;KPCbsY zk5bsrTZYmPD+f+&0U63dyEiwP2ASgkc6aYc_?SeRalST$Mo(J*OOP76;Wuoo1-JA} z4MA+`vi7Q_RB51V+a@!?6uOd^Jw$qNa9(QUCf?soADmZpu&iLNPjC=^aMJ8|rYuEZ zgyS2jya61M?O*JXsD~il+Ln3f5{}PJ$Jig`MfhPB<;v%}WEAa2u2E*2UkjUBb(>mU z8`VZ@n%d>K|85+8EW0-ZMQ;F(Z97HwL!i=*rF8(;YcX4iRWeXFsH_#fv9^MK);-5O z=)f~3#eVPojXL_`ki6}+b&+toPJn~e6FW%H+AgME*h~e!H;PPTk73B%_hv7{)&}`@ zPvFP(KELbz#VI!9-c{fYL^dw!7CCV{RF`Nkl*p!Xcnz&!l%_BjCyB+MgJy^W1o{q=XZfKUSJ#YSN@Rn8v~GY{>2)kH5-d|l8g zL6ksIXA3vsxlv-fhtI^XS^m7hGs;F831q_(C*RKWREzkrY6P-YTI`N)-BZq-HpYm* zKb31Ha(3Xr<4l<8BZ6acsN#bq_{eb0u9xR!Ob{SA{ts7qz44ergvJ4h-t0r4(XdlaR=qBF76I|W+5%xIcpa&%= z_r-}7ig<~5Q#o!XFZz*W$7(j%_3Cf+NK-}HYgCfQH|B>vq7y~#$t#0#owFqOV=!|! zX9QgbqDx9hYUD^*Dm7{15d|Bb)>Y}g2DqJI6ZM#I?;$>Iua8vNI#UAYlrkSGoMrM5P(xkFKmOd}H|Hs6_j7xCG-BTL`;adUkmfrpaQ0zW^U*0~Oi}Y}b|1)Bw74Q?EQqw~vTP9FB;bIcIqyn^?P@g!rxI&yw+M*yT z9b;{Bm;&IT-lP}9qNJEKA6!Z2Y3b2l*1lON3g0lhr5DF*7?L77`>B`#dp@GG;5?vT zj6b&GWB(-7REf0TyCeZwq8J6*vPifl8w<|iX`pkhM6#uEdd&#a(kRyC_ zC6ABt`+_wRhyE|(H^JNnJ})63Nz!&cra=$5kR$4r5bCPnt~yQ z9ex2%cZ`vG=XuFmD}qE935_@D3PP3_wevMp7r%{;RfH2T*R?X)!cJ;oFV-UTnZmo- z0M57HM#Pg*46-@d0I9Ht1Ya}M&t)}eXLD93by%VNsnINrG@Qp*+9;ot5h|urgk=n= z33`7uwN@g(um&RL*;Ez()_p~wq!OdZNo}|MWe?9Al(LF0EX5Ri@bL`LRdvX}l-iXG zzghB-^J)5Cy3J95vUjdV_o!y)hxeNTOGk)FK;Cx2c9mw=|&4>ZnEPKTlaO)O)9GrVf(Di^+h6J))Phfb*r+ zYM}_kK>RLf3MVamNy+6aNBMDf??v<{;F)%Fe5matujMp8R}?E>{ud9~N1fyYqS4hu zXv<$UJP+iGy8Cn)V0yjIganX|=nnaPhlDzcibMc;el^hRGT{2Y#kw1g`z@Rf2+|Ch zZi5@Ma~R1oq{C3_7tnJf!h7#z_w9P3_yJ#XihkKiw%P{gzL!0_?r1yR_Ey=}mgM9# zJ;lXAxo-+rO{3;;yqV?nknYqlS%=;{!KDBop>NG}a-5Ypla)D@mFe{FdR$5& z;HjI}C!JXj_wep*X%CLm6I_f|FDl%hU^68PPOiEjuG1$AN0*=dwGUeyKkFVMIdU0J zj>UG5z4>+i=QaH|9kNBB1RcU*7kgL_XFm!V&YwDYm|F(f+ikK;6QsVQb^w7IZl4AUU3>+zMg7XPr z-qS4bHt)wCN&r6Lzn1=J+Tq`m2+de5A`;9^9F+Sq!cp(4Ab&T(JOlsw^`Q|;6Epr)p zN&0N_3@V=EchBQ@t4nq-J21tW10~7-@<1^8f4*sOj*A4FlTEytsno#DPnqwjYj5Dq znw{wD+i%IhiAUMbRQzXQ%}lX`wIZKB7TbNj;F=PrYmj>eD6fjaY|{Nru(dxUZE4X@ zdo!RpPmbig?O;3j`fbE`H`9Y7U*I1E#)Nt=^|42}uv<@*yKm?AI$_u2Yr6#6-~L#j zZwGv@zNas+UCT9Z>H-oo9Z}z*)t>SfGVm{`ymo0j4CVvDPeD$#Za*pGd`xGfCIXrs zCY&Y@Bl}r+4io2`Quk^=M!epQ`%6GA7H3Zq0UkbKtVnA|#_8TleR3WYgw5mzB6YNW zi56Q!amyYbrWFoQ7Rr!~@RiYxaOtpZG#$g_e{Q4`{uYnu-bXC`Rg%fN;m6I@NDBaF z`+0qB+g4udKuur?qu(Xv7<2jmd7;gnY0yI{#_#YJ6|pug zLP(&@5Xk4rPK>DoIMgcj8elppN_Zk){Z6`%HyO3(6ZcIBkeMw(*Y6Qo0%R8u;m3lP91wW-)F2qL zyxwvlLC6Hpcw*-?Vcq45?8grTyS1Zo^1tb%=nL?Fcih%^`|#~8#2V7FC+7HitKFBx z_9$;ID0D}DKK5N)p!QVc0=tjD=Jh)zlt_tk%g%RHApr~5?s9)b6FPJN`6ykn+9tn9 zf6l(vI1ay!aq{+`l)bx&1q>f{=%^Ypf5~HtNRGbDV)mo;fV%O858~w}A3P{Wd|L|u z7cd!s9sAlQJu}T~v8#Fwv8yY+2fn@C#o-Wkz1fA~2kepa;nMpx*ED&uYpoGGc_~`a@5mtU*{;R=3SHqsF^yM z9Hmy;eeU@&Kpe}|Lb|+!H=aB1=f@KwrNdz&87%D?Jv?)Fx{5vKHR5`$Un8G@~UwzRpcb==7Qt*Vr-G> zCDufqZfk9I(Ur5XwcZ=y<&Ng9l;%@>M&hiOaL$A_3m#+%iBr$R2-Ry+n6Wv2o?L!h ziaeWL60W(ea_l|~bjUpSOiBH~JUe@(isMKmm$8}5f8&YzyNkSx7)==~0fW64%Qo>g zymrF>{owZ~(%kcrX!m_1%j7pi=a+hp2OaRV+JxyG$tkJtdON6be`>%Y9d_)DV&6qZRbK?!5yzG~O zn;d_j?h;GPmb3U_taqo)JxmI$gsT*rjK%ht)iL5fbD_8W_*`!|>BFRs^+}iUWN3EL z(F*D2Es7Xrh)&7b9PY<}I95lV3=!csH}V_WHY236xm-xngJ1@nKZ8a~TJ+t15p3*Sqcst0UTugh$}KmlY1t3rfUp3q879HM?zwv7xCVt0x#Ej^W)Am9#_GK)|ap3s=cbSB0IDS z!)kx0ZujHf6);hjuzT&d7mN(O7v_&;*);X&7q-(C{wn5OuavJh3(YFV%WnYOa$ML>tU`S*aQ zbsxfHk!J@I#OH0VHYxRyQ_E$R z;amX%`JR;bOApTWZbq~HtUtK|6!P7!)<3K;mt;R_{(XW_zK|~$GQH3@Q;N3t6pzx( zQk$`;tDw{zZky)dHJrMw3I`NCpV?w$W|3}u=VW271}b#Y=5c9K!WDAmI4APoK$alx zyM%Bi9Jq*L1husI^B2QdX>=)OG|0EUGT=v*9 z0`6sbY4y@S;rTIxS?!;eBlI8J|;%a@8$RiQ0NZF}b1^y-ma%n$#Ht9$`H(w?~NxP-gR{MY*sdB(hyxwOKr0J%f? zW=-E;-3-6S3j67aCxShPog@2!-j^~~o|YzJ7w+By@Um~-r8CZe@6i{~%|9JMRDm7z zhHx7I%Wu1x?aBUqbK1IXenY?$qgw@k8Nac=gY`9IK$#mUSX}&b3kJ z)jn0#$E@9=zB6Q6Bo^IN=Vjg7vVC25-TZ$U(AX#=#DBo;fsbu1TiOk<#mC<{>jk1Z zt%zJ93wo#ElPuzRjPiFZWGmB=Z~mZ7v> z$z3`^yX}c_^WEVi&u;xLnZku5Y*w?HZTX#u1ING;NSf*1PotaEX6LfK&BtJ9byuU+ zdA9pjQRQO2U4NU#-$?sug~a%hqDm>afiLWc#?xZi&N-#?AEj!i3LTd~#q)p%*( znYPZCZkauK_=rzXQyu#bg&DB4hle6IY?rc(3PC>d>2Yd%LSL%wloqVwqnn#8A7?vL zxjJ(EbuP9LnJr^qJS)Pwu5J5;T#L^0SX*2LiS(DX+?2qywpDsd~fG%R*Hg`4jK$jA+tmTR&_rd|bS~k~MICny#h6t^TDrB}7TZB>p^ECl^auw&j z7iy59A&!>a4H3zgyAZukN~}2qMrC4$Qk(YZAASL8ZpCh$t4PZ}5*58hT7So%=zm5% z5wLA!l6A1bJ#BU^Z4H*3ZWk19H`iL!uo~>h4cKs;%$?M>ERRl!gAs!bN=u)h@f0od;-lt}BC>;4s_}r2b79>j3-7 zaKTZ5(V#)!p<{)6qoik}Z&pf+@BQf+w*xh3=YqommUv662u^<+NdRJ{KFQnXk|+{8 zcg_}(ea?2;!&Tn;M4{o;S7m3dpQo~uH&U)edrO39-Au()O4=r*Oi8_T(Nbz*9U)`y zTInXmcu~b|7yjcS)4LE7&v@N7`@y2Cr5_j2d%g_SLtwW|UAbnB3dh#se5vR((L2G~ zB5V1Z`{(ZlliT6JVLAV~BN%a;g3P(GIfGnpXI_Ngg|e3JjtGY7Phr`}#IDWnEaFrR zz}m@m7Bg!GIBUzp88UfNxip7!=dv+=W-3?_!Hsi&CP3tvbM8bx7IaUc|mZ zVR2I&gS<-sbVRdR;P|d0_W#&+Z$3?{8nh8};rZ`Vx+_rY)%{pQO|3>^gfvWuG$XMr zm_q!(Iu*&l!V>FbVE}p)3xj{WZ?LN zm~27>(PZdY@_b3TUeonQl$}aKUfPesv33elR&E{t#lNO>=z=u>f2JJ)l|bbmp`{ff zp;9Q|IXL|zX&qpi+1xGs6}}{e70Q}$(bsdL@ArxeQ-eyu(}1(9>QPQ>^nPM{`R~Pe zFKFzgT?o_jfyv=l_EvD+ZzK|RD#uf%7l6*7K_X%8|8QZ^t^A}#yR z{MhWp9?*a&jGmw52?l!NSd0yk@ArOHz8=ATb_?u-^us{+cLs)}rb32K=X8kbV8=U<9WfF1+&1a!xd^-wO~ zUo*_8#H=CgwEgZ1OHO&YOyZ=kim{=7iOdtf0)LfQYj+vuixkOPmHL8~n}^?qFv*5y z^Gj#7I@D;zx|CU-c4k!#s1N5o75_g3?Sb68J35TP&?-7gNvu?bU6FS%BPR_`w77va zoh>Ii09g$T+0CsO1=z%{jO2pYvbdPV5&E~BjMA*GGEK!)Ojk!ROUa3TVBG01!*tdD>ZVj^i7#e_6jJ?#1y=SpGe`p4|nK9!pV z6pn)Gt`~RILhxn`RS4JKFMd-G<+~xe>&gKPeSUPotVCp}l0%Z@8sm|Cpz^FbOdr=w($`WKT-L1t?* z6kEsm>vQ;T0DDDks@{MJosCB0l^N~$$)R^z?TNuVS*5g@bwJSPXm zQpU9X_3O#san7D$_Aho!7)w?u8}oTR9QFX%-Xd05tivOO2uz?pY<^pDbYzF2!hQhE zk#hoM+Dx%omJ?d+ybHOsTt*99+PU)&3`!$$&Zkj60pQ@iaSpeLB*;>cPLpf{+ROh+|Iyq3uUACU?z_*9!ixigOVFs^!!_SBD9XdHBEY@QCKF}$ zs^WLsV}e+%&PHs#;=Y^%uWYw&8L69A(~F8hrig!MIc+gsj7FXK_=}B@p|V6bkl}Gr zCEvm;i1e4mUmB>@3PXT;6RUW`g&bpftkPpKu9UKAG46-Xuko>_k6SF|0^&K=YKc5f z#pBao)Cy-F`{j5JXn=tO7clm6C$i9+U%g+K3m4e6>va`@N{j#(x{#&1TtkSze;aK~ zoChe8OkwRh1KMlBIR+*1|IHA|f|D^^l_Yq$P4VB=dVDF1c}oh!n{moTn@#`CG5`_k zm{3G0rQL{4um)cUNmfKfM2UOLL=(~ei9^UP9kejSEZ=CH)%E&7y_Z`!rkKW;6+}@OWw=y!TRjqqZ+y`OUg)* zAVh0|&$N&@qy7LrKK1KeYHr(qtx?5zDl&7WplpQov@=2qY4<%#W6W?{OcE$=TDIe;Au z_3etlnhJ$4iSOy67pz8@?skiSNp-&CZ`$053=-zx zlma|r0%n@YL>%I*Syto(HGR$oRD!7}&0TCtWJbmpAqB32vK$@Wxt}DokV%eA70I`0 z#f6Wb=XdTFQz2C;!8GQn6Zi*nvM5c^5^++JFrICrQ$pigB>{fqy;7eDq_GW5^JPc_ zutzmisRH}x%^>^Y84i=20;Awwv_AHp12gn5=J~(ZLEqrdGpWD|(<4Ezt}4JIl*2-Pr$kXn{(3Gf*=wIY7^ZAQCEcFuwP>H$j2Xn$}97afU1r0s0?*6Z5p4|g;7RK+mv_b=p3MP`>`=6h0{~Iaiy9ZuTe>AxK!dx=4 z&h)&+_>?1koPzhE4eoww1yL)b$`RA5fwdWOn3Q0J@hi3Y<6{0&VpXYR@@2>-zA)ab zn0SVhdC6T;QkP!aPF8#Gs}}yfc+&wIC0!nK_W{i_Y>U&EZ64c~9pcav-QC&1y8Y)n z#7!;GlwbmcAB(unyZ@cvOh@D11yqk_%+JU)fvx`dBbl zs6q4_?uPE81X1F(WU!$BmNB1(&iUn}5@F@vVi;#g8e>3Wvjd;WzLoIYm{U&g=u}(1)HpPe?dJ1x=e+1V5(5)rCPESzs8i2Ke`2X! z798q*b&+piosl0sL}l&u5{NtGDqtSdB}WR=1gN+6b(hWQE@nn=k#Sc_jviiEmJKGd z6lD&gP0UX_`gh+wwu0aQb2)dlcCQ)3`Ry5^e&*F{p?#L0#G3SF?Q%Pbk5>4+V#GRN z7<0?l-!V}aY2 z3Dl<(K-)g{|L523b^rVt+14lie4MuG-^7(&%B~v4t*e}7`G(Rt;q&$Ia>fI<{uoi6 zV;wsN&tbwlU$Mo1YdV76(w|dKPuj7+bZuc{@aHIjXxrRhj@5Dk{nMv4k`gIFv+C87rtf?w z@%4J7F2>JJdIHJ}-9h;XczdNDbP=D}TNL6f6-Wb8%;^nBPrHuHVl9Kk+CK>-4fDPLEshS? zT&MK!2b3t{rHPA(W4?6rodX&loqP197!m}7mX+Se34X=aEBEmNaFV>iz!pgWX~YOp zFl+NJfmdF~Cw}HlpgccGq=3JTkm*L~0ms|CtV1f?rQYt%2Xgf1=0?vJ*CPJ_EH@-a z&yOQh2i~QbA+3-9koCQCZGCi&+w3B%in9L6qi>nM8;bdVSK}p&7`M^$?SP7%nKrJI zW0n(Bmj5vJpW}{BVHR$}x0y~)bMfS|@nAZ-POov9orq#YGte7N7asr9=bY5Y|9m&= z!LcAh9P_rHC%@_FKd{zxa-#lUtt?-cIlqQvE0mmUc7kkX&6G^Ey@l)@ci0*4|BoRr zNA@lM2gg-T%{i0H|2rIKRrcTQPyVapfzryA`;UwN*?3~xn^=}YYQqCb?SFD?c9NBy zsLJ}k%Q2Ux*#8Zf<1;hu=@&o!$%@i6S0AH1+K^<`mH@XL!56CXA*qxX6_qyRf5;g^ zr*qg9xZUaew9eBcXi(uGVpXj$|NRj4H;BH?2D3!4%r(?B5Z2e!+tu}$>;%l*lq@$` z3C|4MMRsCxpNlPYbd#MeEOZE4c6}tN0YxphRP$Yg7)eKRFoU=E=vZ%2XTEr$mFJUQ zN0oEPpT?qjj!x3tHq&PuU&)5E+l@CoHnC?WQ&%z9BrZ2D!J~Nn&U)6eXTJG9q9q^G zLvuUqzjXQ^-j2=IE>1qP9-O9UJal%Q-#n;CXa1Kz2WQrV{B4n)8Sq;(V2o?hfv-#; zxXGj!!F`M*!`NjXjS=#Tk4AVk;ukq!=Y`50UPuNww2NR9+&5-s$jG1;%ARm}MDbIL z3|hRdo$47ty}JRgp1eBhDtHsmwvXbjr)ty`(S3J_V`CkJuz>)3Z`UswEm|s?G{zc? zU~Gj&82M6{mC^Q>QA^?9C0m0%;n#92xdCdB*z329;t`|~OmOHJ?(acQl#2vm8qqR% zvEn%*Rk;0k*Ro8X(9e9&s)9=TZJ#Xp9Y6?PJ^bp6Sskv1t)L4+->oVV|j3+kdUi4isJcbsi#CE!ekqzFgmAbCqx_Ydje4)6)bZh4?S;P z*I}2?ob9(AJHF;Jymt`Q;Jm^P8+>~f*L^P^>qPA1h`A4fq7Qowx}j$D;-A-XpO*&x zJUXy=xt|O&wS>9fI;#q{)NWi1NJ#*UKe#RUSgw7~G-9&&z zkGXY}4;sE_Gla&)-Q?#cyGagB+x6-oeXje5k2TGVJNTG>+kkzLTp&`FA1LWz)Xt0C z5nf9~VZXT_Uec&ChaQd`0p`~1pD|8oK75*|dOof+TKh3@_5VwtXsE}pB1R-xG&-C==7g}3y3z>5$8 zKRzGfyQeK(R*v3lRZ!u#fk1o9$HWb-%U3|$qcdYLiaB~8nVD{hr=X{u2ln)8q0v{C z$~?d&*;BXu+45G0FTGwX$UB>X^+>Kf4WTK4q~qxv?_tbVufF>(?7Iy)jS-R-kbcFb ztF6^*(4!|5{gACz2Ne=0(k5m6~Ki+Rm19##-a*OXmnj2jcSsw7x-EN}vRMnSE zc%UH&Wh<^{-rs}8_Vg#y#vD%N3CYnZUOXyciixX2lh1FudxqcGZx|Tw6XpZXFVNXx z{JoK7>=2(56FcYLpi#fLiJ#FiAPGP;xSBm3cmIq*0j8PFtZ?Lfe9nB&A*}(g6}rEA zSo%IO{CML?`GGl*CjZ2DkPFh!cwizQlN!t;{foO}=z0=zkNk!QuSc=Jc6-z|x z$HHNB5S9o3n}0zwe{>K3(@A?Ll!9X-CmXPa71KhG+{0t-Ym8h6LP~WMDHS9h)dNZ5 zuo1GJJIu13JNgdOqLT0=(NJ4GpY(m*`n)A|IKlV1@H$MID|ZS8h)^CJMN4Be^(W?1 zz3BCBq3&cj_I09ZuN2WaWZ2N`ZTW8-U6vg}yKjgyh(ut-UvTpUM2o(-f@rX{ z9+79;ne}yvp4-S8yw554rd_sNO5~^7AEU|jsUX?41pgrTxkh+n5of;)wm=g7kOj{p8;S0mfqs{8_wfA3qZ-cPr1bjl&LR^p)kb-m(k7`{Y zMn>J!f3oadjdL@xS4A0N?~(y`qPXR+o={=zcO>b3G}V@+$EQpruz;mbA7C}x39Eux7GmL=>v#46Td~(8s4E$Ex`=LL8`Z2$CVWvoL*7>TeZGBP0Lz3&suKqtD!q3k$kVfQ)pOod8t*%o zHDd|7%h^tW3i)9QpC|*n&2*ppiYbF!n?L4M*q8`YW};1rj^3uD5e3fHoW{vd!`ymG zFCBo_YP}n zX&b#kR8&M%L_n&dpwdBl2^K)5iBzRY6Y0GZB6g*TQlv&jKuF8 z@2p?o@=bbF-ui`fgw_q?ya|1n#q&NR^mJI7mX^+`!~7fE(Z26{-&XdvYKvwB4mkMe z@X1z>ayBAj0`6@;{(MCSmvcWWD^azzue8f zZJ&HOX3z6=m}A`M%w&g(xSaIoHzZE%3Z*DT#T6*nPmujALSjKYK>Qx)8 zv$2C->zf-}8xy?)0x2Pz&N6M5K{veXuFvDmzj6IN&-?wu2jas&=6Q=hE3zaDw@8l0 znq4H7FmdaY?}l5?*@3RZ&3M2bv1};8g2cy6QX56ZbOM3 ztxKUudv7UB_RN8W7=;5=Dy9d#8wRG;0(cwlbB_vDwZWuG(23POOK^nN5H=bmGgnr@ zZo9TVsz!H`oZ%{*$ivx{4SsGPA61i|vG63A2U<)C^9`r5LkSF@A$6iXNjxHXYaw^%*1SHor<_}fYVbF zYHe_FM%OJMMXol;m099rO)AgxO#40Njeu|7L7CexZn2h&tMdQIUcSpzI$F*JOU#NK zIbLvUz3U-U?Aq}7kMur1w}6eSepQC3Z2L3*gOyqhS{A8tq>)KQWsj| zpOdT$+Ije}5d|fomQ7@aBIC*Xp3luo16?(!SB1#lZ%q1`rgK~_7J_RIp!lB{z!envRr?`7r4Q)(2vBof8uVcDroZ}RC8ClgKH4^&6&GQ{*MC^wz!8DK^ z`Z+W*C1m1zcEjK^umWq<)R&hb-E)1m;P>-}=;%B5Z+h;%Pt$^&^gr*$uTKWl83exo@cCRW)aQsSKAaI6x6!^o$-k@h^0behqWWHvZA zf%%nhvT_M@-|+8rcX7IFx0Sxmu_sce92S*SuQdx6KihJBG^`OlbL_RAd8*&`mdE^n zWypTc$}mgC)a0J}U~a<;XSPyeX6(AZ?Rzq%%b9q2gQAwGd)bSLZ7rYPu;CGxvMGLql{Tb+D_BGjw%mg_Zi7Qful&IYg z29Xa*6M-(hkFFJ$e-^kSk34bh$-Cs(cUeOFFW;nf3QTu;PkHUWCUyLP)y*@v&R#kn{pIbc zcUpH}f#mn>Ro!lml{oCBFdy}MJ6FG zGiOr(O^Ku0`0H$F3IMMW)vqLd(t3!Q-(T6xr8wy%m{}o9GLm~W@9}ThyLD}gS!6?v z)9&%ytTS$;M|Z3;l?be_uW!V>0taOi;JQNKtEqzZgL7%S+LR1azHWv3q&RB=SpB{8 zU`B1JIGT5FnFe)U0x&Az4Bgv%#TfH-VYqSE9fB;?cv`3kkNV2z1Qc%E77!RAx*Zeb zcU+)~;MCrX?17&5e(+pD6FnZUm)P#EVN&r8VG3N)97OdLDhU1-Z<2VSTO|*7GWK%; zC026NeYYY*A0oLte=DY9jPP*VaO5c^B(!5wb;zM-MSjI0*@LLETr}PVWR)5=G9|i` zLqiF2>*uLWtx}5qD5(siq;YhwAI?#dI1;}mm{e>F z=IL#8B@uquRO|*09bVc3G;CSx0X4aYfIjtcV2)B|Nuvs$DOl*>yXC@7CpQrL6 zsL}Pxu37ygTzpw5f4kr?$W#)OWN!^roh6(-9?I?CQ_)p!l0CM4W~>TeznV5cjRUkD z)wRJiP#eGv*`>V=m`iKmj@gq1I?dU`T^dMfNum4pLX30pSE~%H5nElw1M2LAGLUb2 zaBNptVdVw{rF{u{CtFogdPF*0CUGDG`2u=Z@;jHpUMvI8P~&l5cLGGf*C%%C13-kF z+rGF%o&w5bpn3K*L=B$`KKz}(_|E1f@Ke~UZq-VYJ?T0puF3_fGTOG?Yt9Z`E*F}< zCrh{(oA4Ckx_Q=J#JwwHtOLlDfo@B5gjwDsA zg6)r|HDAaI=&b<-E(8Is6}%%gu7QfwH)yCe;$eSP$UkbOm7dCp z|M4SEWkKL&QjCj2wv{jg1EbMDjgZOf|Di@`WY+oVgHtaInY~XidmrcYKK}Ehq&|YB zD*G((<}fAZ9qXUS*-#xtN^1$V{IzeLQR#{po<~tU~>By ztk!yn+U?tjvjLFk;P7z}5(9u8Cql4D+(adn)I&hSsIVduKa!9~&?p=ZB&TT(L-~-d zei11H`B{&Z==;$LI*_-z`ef^UY@^md#e_OqiF1& znSx*hopxl-PDGnp~d1_44%H;9g@iHwMpa6Ue z0|4mt;4qs|a&~P)-UPX?(OENfqF{j9EfM;Y#F(oeP}*&sNlvo*hh0*`&%9uMLU1e^ zpfdf}rS`x7_T!qQLx<$-aSlF428LtEe@q1$^uG`AYgg%}k{%t$d+F$NzE|wtg2!54 zD;{T_yTRLGy|Su~taG}hfk4pAi(Fis>YR_CJkdh;L}JVE~P~IFw`X$Ja7p#H~dXLZT5&-c`XBD>&}Q zleM*ekjpa?G7NTL`{V~`g}XL8hNOUm?DxoZ6fxb(cq@Nlztx!r>#XiVr}g?!buSlm zUdS3oV9^!jUsLWG%Adj(d?1%r6zsSYLxzGNG(zaI_#ky}bDq!;^rH5wB+Cuu2L2V< z8?+4JtylFmoQ`?cH#w0z!K)vgg(MBM`S2l>XhbdmM-|z?XyMo+%4AP%0eNpPc;~7iD4TtEPD-eOs{{tf~G*o3rEFiZOQYBg=Sc7a!7C zAlFG8x(P{tI99-(UL6Hu$6 z-gOp4;4n$265k@aQQQDdnzOo%wya7L+QBYl(GsX&zPYB#Q8k*Dg&;kP;V<&>hU1af zwm<17OKen0h_1)gSUW--exMsDx}KsImTls@Iee~lxCK^+T{Fl_TrcS&c#0akDv$M^ zqMmOQDg%Y|%O|c}8~WDk%-Mn4g@d+qDT~~_3WaCqWibXehTwiEqyG+W)sq{=o5G*G zVnI^N$YS$z&FY9G@98xGaqYOXB4A0To%WXwwf#Oa#7-Odb<#@!SNfHrob(O9Qp@)* zGf`F~Buznjw>+EGs-KA}if>;5w@qYxw_j|{GDkRgM}*p$&{oGdpd;QNV!wauD_pLg zbH|;{Yp=|6y4;t$C17G1Qbn;KmTO;K98qJp&Jp$T-=u_Atm&FA4pV4{(I#1-OMt0* z!QlJt7k!sV{0GoMZ=Z*yG2L6qAB)Hr?8XF(vo~fx*AM*$2^EXb}mCr#{{tE zM4`n~YCw-x$0QY!%Y?{#2T2mO_;e<3MhhR_7JT4lo~3S5_#X-GGZ=iC8TE(_FPAY@ z0gK_z*fnO(*@bbedd{4Q4=f5ZddOKwo@^e1#zRD*BP*B6s`^y8Im!KG^^r1w8lFEice$kcVo)KOL>urMAS=cMhF9HWN2O)Iqi zyKWw7ZG1&cd*UzX`oTmjSBKqqf{%vgAB~fH?7@F;sZfk?5N&537D!ppIRnH(%a!+|3 zSnfi|I-pfL^OT*gDRtaUkM6+Z!nDo86OypVK<+%5yfu}rhasw0;jwY3H%=Ig%?bqV zc7jOC>E;aXr^X-#X&G&EWm{@R>1EGMl81Nrf@Re*1bKi23%tC|I=N;XkhLamH+3AJnP#e($|7 z)g5X5;I{lQO$C}O>Cc=Hia|StBS46xYw9FYeL*#aK4BK!7YEjd_Ab_OMf5!h&-E-z17g3J_~v@_pzBLxH)5p(bNdYL5Fwb@qv0MG<{z0bPitQ}mV@5AXhVMP>k(!KHg*yY zvZjv#--~IjQ=eDDi5$f(0|nK`w({^5qVsQ9RGYg1AyKg8yh)(qwZ6NLY!F?zg@Ld- zS=qB}?ukB@3MNWX?yIPap=|@{Ug^n=0gjW4`vUt{EXet!prW;7+Fx-MJtSBR$_hZ0 zfSgoz#Lyn7!3L&r&p^dmtHQEDWCE=SfwF@TfDY_Dhy*tUUL*7W4eLM&xMI;Q&X7f#oSzYej~U_}H&Z z0ji8^_w7Pzi%KV$Eg55GPn|KqcxA;D9k4sy=y5*$^aeP;@fh55IV3@rYjfZOtGmuT z%W~d)fJu8F&C0sYxm>@NZF;fVjPL4holrR;C}u4_Z)IQHk_)QKuXP8*%i_%vU8c;O z2}5YA^|OXt7;p`D<2Ii`_4TerCNnEyB1ce+v_x4luHqw`l8q*`zvSB-YXjAk>J6tc?m)WcF9i%< zM1P(C*cAsxU|<&7i~Bc;e1TunpjdeAKE4V3e5m-`Q%`&Y@1zl*12Vy;I|J8;eA-3Z zlUe-1r{ZiZ3=O=D>I)>jtV({beDKG?+8j9C30YA2-iZFRf1cU52Q%#wJGEMiyKq0+ zBHX6C$YEuquZ$Ah4Uz|Rau?9VD{_Zs<|XNiB}Rcd41rQoYg95mnFmcVyxd< zbsN^`_oqvH$7t6aip~mDZ>b4gOqgX+)ym!3-j42THl;y*N@W^6#-`mofzjyE9C%oX zd!=V;uyZNpY4eLj|@61;og zH};fSsjCCs4g+8=(S|(=V)0CvZvFF}xtSfQU7${yLi^c8#XfhVR=sh2T!k+r#yBZI zFGSXER=!EkcwmMkh{<*v%!Be8;ux)x8V^`1k?%z8A+h1T7R8ya2EZY*8POS|ZO;+j zerf&?U#qxk#<9TcdI@T*talGMfo(nmA`+16zY%!ewB%jB$C>v70kc~dOMOafzXR2U zaxplWZw;@ERLrU)y8zcH8-&gPB7VC-@tP#_6n#A!aaj{F{81oDBvNTL5CqXt84Ob1 z3gX$QJ)oM13Dc-#o3JlyMKlz0yv!k*l4gSE+Bul(?CFh|#zbO_5r1H>;x%U8ge~vF z7A#;z&g4{!U6EnNyTx7`a+Eg(JMI!{US$;IZQZ3_tQuWu>7JcFY)V5pcJ1Cb=KZwx z?8+2b0A~wv_*~#9!#w?tD(bO$Zx^uy*}JxrR2#bwYV7^2(1-#-0!($ZW2pEQ)zlW; z9;CoRn7%tI16;jFIti&Ef1o z{%%7Vd=TY);(@2`Ztyd8f6s3%C}&IW*BG7cFfeck$1uo7R>O z?7ue(?T)ReSBW89JU0rq0z-F(Uy%5ZzZ~J2Dt)O--cMA^b2nRF-Rh9>xB0RgoewCE z79}pOKwUgDKy~9hrLK_a?i-{%6sqLYF2ue51(h1e{6ihzattF>_!0bVqWd&*r%F>f zA7e1_$v{OF$OnAWDZxpp*iS#esf^>Pjjpf3;iM>R$#7VO-n$n#5k>Cn#+TdXSlbT&8J3&;M_*Ny2(xS*cf9koRCl5lM_+iffpN-JPLs`03818OcMvA6y64dt7)QQp;r%g}PTJi|K=aVQCg%W&P%Q z5zUH_@*e$~x?_26-K@K3+G=q-zl%mOP-&DA(P+fXYlQo0^Yl@aYxC&K149?5{3E(( zs|t+n(vcj?$%a;_J7(zurf41+vQc5oVu%$YD+D^|E09i&>zqK!_P1FDpijqPb0?>Q z0tYkjQ_AB>>f^z0=%xN?lkL@cm(L(S6Cwk{37>z4xOoHg!7P2)``8G4d>v>Sl z9ko(dXc062N{g|53te!vnyHv8lZB+z8$4K$JT>a?e)S@oNZ2S-SKtcE0jSi`767bd zm(gvJV(q^%y{5q%ZylpS**R!w7kA?QGkE&W`^)EC>x}t@gN#@5g3?Ckw&Y9%j3^^N0AeC%_lm{wM^f5@LkUrZ8i@Ho)YX)1c-Wxk}E zb&TZ!1|FfO3=%Y#o0?9>AhBxNhIn@D8N*@`D40~=i#yCcJuJ_fKY!v1qj{g^%4>+q zp8tez@y>}OO=E?8UDF-v=-FId6%I@J4$Nzdce^k=`? z?W7*u|6o2wrows-O5#4_lavP3b!6JS7&SP zTl{8YI8dfi&zdv4T<7DUn=8Wj6-&?a9V+E4vk<=S>^-f%wS>Q78QD2(oCE zeQ}DN=a%o`LfHk00r^$b65-k0AP4)y>&K)yyBn0}iZ-d*X!rOUp)hLLxf<~7*7(S`dfojC`b{(?On~WO&U)Lbg_!Bxmp2 zg-y1VT`shmUn;EI|1okA`mo#dK@*d}ey@XI=T?#I%R_YWw|T=BSBSD)$O!m$g!_7G zoGR_KG-iTyNuVI&tyXODp^t;C=aWT`hSN=Q(PcU0&*Cnw2k!% zvbT9RIy{wh{LX`wY3?Up``SQg9J#cB4ZgV8YOf_oUlae{ytdh{yI*WL)YP8}VyBun zd#nug``O@tsk^3~oT(X#y^c&yAXPYdVOO$TGdIv_<%4U5MWUVjL;ZJ`u5hZg9{b6| zMH)kyIy-RHhyo927zJd@7*`rKUfQ#=BMqi~st4F|?zY8w~^7)?$x;Ken=y!<#kn9g4jyGVwo zrZVh(FgTrFmuwKTWnvySwf3nHbV!3UokXGp9t#>FuOd0#tJid1vG>CqH>jEnS6fn7 zS}?a#mnUu59Ek`jzZ@k?M9MeBDYZU-#1GjHbBGD)h5372MCTin(i^`)zP~h zXV=H-xK|I-!GG8ET_)-K>&`dQ;tw{3#To&(NH5};W?w&@t0Jn+epW&`FL(ENnhQw# zjTZn7tI^_pvX@>0X|SW$ntlq*L4o5byF+`kt7c^|TFybQ7im`nt2N}MX-9w$O_sp~ zZKi|ej64OoY9N#7tD&5ySzhkP)P z%RKpZryb! zjPJI=c;mN(qYjCJ{-^?%{LOk znLbjyA5!`K!P0rHo`@bx4dxTUcRtaHGjg)|2J(;sFnd^~vEYpd>@j6&C?_dbi!>Lu zQ#Xiej_So%Om}ZGFh&&{1+dNq)2p`^akKx;%tS@ox{?}f{_)81K!1==;WB2o<(lH| zkq_g%r+3SRDXb^hU(l2OWX?w(GjlVlM|@A`5koN^RTgLAdZK>q&Y=gJFXEMO-dWmL z%;C@(RHnZUV@SsF?L|a?%uS(qB{2c-TKVtIW_+!6uF@y+&+Vkf-2SO>UqI>16a63f zFEso{d-jU^2f~H(Yf0O$GS9ud)RVVnX1w1*D_5l4J9CuYYW2?@YoA;%s2g^JGs|zv z-(i}`I^NHGL#IF)Okmc~?D0C%=i9bSuL?7ZIT$Acwa^3aO>8Z`YcxNuH9HiDeS7zZ zY?xi@^^Qv=jKz}|cj+Z|ajtOZ2DhbkW#StYL$S~G$MI%U?2{`$RzWozj_SK7&-;iE z_~iVI`_52?JiV3Af;=RroH=||9U=j^oqv4d%)F)7Yh4X_c^p)C4VJjKr$7==vT;Xx z$q^zLZab_2w|1%>KMy?4O55~a3~Ih+UfiQ47bwKYx;-lP(_|i?rWHLOj1&sfPUk74 zVamFduiu8Bsf=}4P_nRFDxG_~KRE_AIyX1K~ovWIKOMx+wTwR z28>@dgdC>dQukjO;T9qXMF(y$94gw}PY(C1C^e%!u}~|&KBw2eNzfX<9x@&N3UV12 zwa?2eP*mah9lZx1V?OxGe0FUXnJzUQJ?Bd8sPM&S=@TjYfzrEDJI``PEO!L%{n+tT z$z8dh>n_?8taOthI!J1qx`FoMB@YVrwQ0LIHqr`S$PG^;d!{Ah9`CZftnsqLR>RUu zt+AseVsCP$@4LeL8JU38W`W0d=a6Jj`j#W`eyGyRRhHPIDbhik;P^`4@W0F^9diGs zO8fHrK+A0{nv`mBVn;-6(=@%aP?(dYFn|1IOotIQ+=@sE?B`FNdG_o)LwXF?$z~E; zwaqI2I;uJ8?2$K<2X^RmzfKELD>GYRvxcYN9*Komay)LP`)f+a3heC@L6|cf32Ccn zK^-DC*}Q`A%1ggRpft$)E=pZ)qp(5DCa+Z#-*vb1y2zZ|~nei-ORGvByRW#8*PbmW07wA>j{W zHiXk&wtf!R*|$7?S+4Y8*RyZQ*IRGgdSZC(L-?UJI>2%oUub|kQ_LOft%q{e^{k22 zY6zdtQtzt#ZfQg|8cOp>9eoYq@sCYDcglH>6=37>Pg%iCER{Sz6kit;aHC(u_5sJJ zo`>{mvzUVZ8~NjcPfBj`%F*@#tRq2PPAGYtZ84*hhy&JDiC1Q3BKXAq<025jk2!~E zhWCBdsow==*t(Q4-iqXrZ<`|AVmNtoAi6ey=>boV(!}_{X3iUy!$aqyU$5P5E#oa4 zTIaeJfL$XCq(2w0+k7PYNcFt>gLh94rZ%0!X3H~`b7K#E>ubb5(mnl>X2b>ooUvROJMd^Jne*$~0nB{2>deQY z9<3WR#yK08K&ujt>=j;X;=a=-d!LT9Akh#5bU4o{E9le$>kfaaBcI~=gLf|$iHlE@ z^Lh9wX=AE0{LLG-&wUSAy@pzm++1q5c7dsnT1yyUdv|Q4=-e6vK24B$i$;0S4kJURyBVer` z7zmJx5UAZcRMlKyBNzszX?thQn@gc*S5J)=unKFZ#j0h^xt{)Tp+9r);IXs)>z@p_ z(uR;o7~Zyu)arkwxW~Tp?$u0d4-K`pLOD5-wOefBt*~AF4R(=@qQTa;s6q_?IJeVj^2E>FgLv3 zD3Zf*Yyc7W!=Y_`gWiJ9th6^{;-4G0ZEKxsag=d z$FY}dq`D?#W5dzGkhWrze~47vzo-3bXKCm@cZ{v73S8~z%}0@ihrKI6ovoy zp1b@R`p*Rh6N*Q*jQ*GPhBrOlrUq_fS#EaTE8?37lFb-iefj0k$vIX?jZRcErQD+}QYl-D-4N2}UCxT4txK0B`xd#-ar#ut z!f`~&xF_*_K)QwVeVgGDTg2_Ybeg0x5kjL7k@7nRfOt*((YH!6b|ADdt>aWOlIF&V zckR0Xs$w7Cx5%@LS+J4W+ACUKKu9lKgH#-i^R3_@+*^Rl&8RmjzffoBvR9MFjCBI} zGy`HF?&xyxf;A*hTo5^4DMsxv??i<#ERz#5{9F2c^@u{qcP3VA>Njl&ADV*q?!AKt z)SjJqy%V)){ySFt(;O4z;NrPY2=lCyf1}*7^ zOlR}+)7K=?p9s=FckC@NsT5Upn3JX2?qhCym_Q|XvrMlslBIzI(n4u*a&j74rOb>R zUOonYhMsJ~i(j)|+jg~a0`+WtEYbp{WtQa$0tr*d0I9IB(U^XoQHUBm=O*k(P!#R~VMPKI+LL*us4BoFHxa6~2U{?Z;>ZSai@`tS#VsoIuXezgLi z=^IUC0cHUk_^ccQKAubK=g1}YQhmJL0rzI!kG8QK1Y) zXYxAt_Srm5r@%S)D3(UFd6qEM!b^Z%SVU}F7h0jQ>0d_eAyJXwxAub97IG5g)=IFx zKA(U(5#U;oKiVKvI75fwNPdgG1eD9F%333tCwMArzPoPZJGc?;A7E;^#AX^Wna zbB<>6T3w7XDiF(n66kgXwpZ%)U*t@osRv4aPi}_cH6{lGEm%~y;Hx%}a0=)BEaG0f$g5BW0 z=jbDR4WQ{KagbOrSLLV0v@_;Jbl`ehW!!iG{Vk1)#i(x^gc}<`L@e?C#QP0#Z^=Xu zs%%pYwyJufyC=LdD)prh6*ab00E{iwsaFn-X}JPX6X(2Xdm+V)J_RttWzWM(?X5o9 zVtcQ!1vwtQ_bgO+*K<6Vlo>BUG}x-eA0TtYM-?I|7eo7aN>D|qMuY1)Q=~eLqVE-p zs2!-z0!~R_8A}=Y2Zpzf$- z%QndLn9~0R6 z;TPGF4~Zp!a<~9AyL)IX)0)xkqcdBZ2U_loQc>AA&I~g+BD~5{<l%W|Q3C~oiz{I&qC_LaiZ-5dB@8tBa9yAr=qFTO z2Elz|k_cwu2pNQDn?5aZ4BAC+4UA|?05aSm#x@WA0lkGCc{$mMazAx5QhpcX-ee9~ z08_VV<2`+OzlPmVJMrwssa-Jf0=t2CHg$8m&R;|B^HC>dLXJxTQ581n~Ovz;7m zq7&8;Oq<%nnfzVl|7sKeY#F8MC0g&CP6}t+FF?CI(kHE3W`RJGf zA1ZuhAaf-bQCVB)+L+sGn5xsYit#Z~BIyPyr=93MnXY4X(#=Y?|>05z8 zuURm5giG&XYuIX=E}gK1*tmc`PQmF(X>`o6UcLNr*F%m_M{yZ=Dvl&ageoO%^MQ1% zV>D~OguhnWLX;TdN(%24BDHE16W1Uo*z`e*;VQ~%w^fsH6DZmzaf~0sW^L=cVEwDp zJn$8#I@)zw%wfw}vOaaryh~>_$@h}TinR{lWEnn(mI0^AuY-S-!K!9)mumPYJ**7s z$Uf72);v9gGMAU(FV0nALj}B+YUYSCN`a5%<9UZA`z3gxA>sk+%4AV09LU@*)eD_A zOX8=-l5gLuDY{Q6=vuA#{NO@W6zlrn7dNHY=k+Ji3G_WNl6i-V5JCnBlMvD6W)lFU zf~B$(ePhs*4k_XM0h=@WRjDs;q@xusOWZ@}@rVW}4+T4_;P(`}!P(&}z*N}ts#4LG zxasHmG$lyp%v2LNA@o{%hLGREqLmNGAne=u;R4@S^G=v+QIt`>fa!WFMRFKj=YLzx zbM>e;6}F)oIb5eJ0%VqM>*jAMvn|}PDwUsf$$yxhyyc|(VQqg%x@3{)XoE#)OfrhE z)@NhtI$p2v9@0BIe0JHQjyE(mII=#oaH}`?%whWj9U)g?In($$eB89k5H=9^EU)A- zTq!A^J*3k�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 WDjV8&8BUP^0000zAkR?%g1Qj=SU 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 literal 0 HcmV?d00001 diff --git a/web/images/NOTIFY_CENTER.png b/web/images/NOTIFY_CENTER.png new file mode 100644 index 0000000000000000000000000000000000000000..18a872b3500c164eb05ff23aa43e9c99abb4945f GIT binary patch literal 64292 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 JcLXtSt)V;CnX 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�|rqF9Rn#Kc^R<1ISXw#AAT(few3_BzAx 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 literal 0 HcmV?d00001 From 1a282268c6a730dacb39da93a8a89ba6d8c5aa4c Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Sun, 11 Dec 2011 16:02:32 +0900 Subject: [PATCH 031/630] disable main.css (from 'opSkinBasicPlugin') on smartphone template (refs #2227) --- apps/pc_frontend/templates/smtLayoutGroup.php | 2 ++ apps/pc_frontend/templates/smtLayoutHome.php | 2 ++ apps/pc_frontend/templates/smtLayoutMember.php | 2 ++ apps/pc_frontend/templates/smtLayoutSns.php | 2 ++ 4 files changed, 8 insertions(+) diff --git a/apps/pc_frontend/templates/smtLayoutGroup.php b/apps/pc_frontend/templates/smtLayoutGroup.php index 443cf5ddb..494417d9e 100644 --- a/apps/pc_frontend/templates/smtLayoutGroup.php +++ b/apps/pc_frontend/templates/smtLayoutGroup.php @@ -1,4 +1,6 @@ +removeStylesheet('/opSkinBasicPlugin/css/main.css') ?> + diff --git a/apps/pc_frontend/templates/smtLayoutHome.php b/apps/pc_frontend/templates/smtLayoutHome.php index 11d734c16..21e6072ce 100644 --- a/apps/pc_frontend/templates/smtLayoutHome.php +++ b/apps/pc_frontend/templates/smtLayoutHome.php @@ -1,4 +1,6 @@ +removeStylesheet('/opSkinBasicPlugin/css/main.css') ?> + diff --git a/apps/pc_frontend/templates/smtLayoutMember.php b/apps/pc_frontend/templates/smtLayoutMember.php index 9e0708c4f..7c00f7d88 100644 --- a/apps/pc_frontend/templates/smtLayoutMember.php +++ b/apps/pc_frontend/templates/smtLayoutMember.php @@ -1,4 +1,6 @@ +removeStylesheet('/opSkinBasicPlugin/css/main.css') ?> + diff --git a/apps/pc_frontend/templates/smtLayoutSns.php b/apps/pc_frontend/templates/smtLayoutSns.php index 6310d3da5..9a9d33763 100644 --- a/apps/pc_frontend/templates/smtLayoutSns.php +++ b/apps/pc_frontend/templates/smtLayoutSns.php @@ -1,4 +1,6 @@ +removeStylesheet('/opSkinBasicPlugin/css/main.css') ?> + From c38a2dbb98d7d71e2ea86cfeb6ccdf1deb03f556 Mon Sep 17 00:00:00 2001 From: Kimura Youichi Date: Thu, 9 Feb 2012 19:41:16 +0900 Subject: [PATCH 032/630] import jquery.tmpl.js into project tree (refs #2227) --- apps/pc_frontend/templates/smtLayoutGroup.php | 1 + apps/pc_frontend/templates/smtLayoutHome.php | 1 + apps/pc_frontend/templates/smtLayoutMember.php | 1 + apps/pc_frontend/templates/smtLayoutSns.php | 1 + web/js/jquery.tmpl.min.js | 1 + 5 files changed, 5 insertions(+) create mode 100644 web/js/jquery.tmpl.min.js diff --git a/apps/pc_frontend/templates/smtLayoutGroup.php b/apps/pc_frontend/templates/smtLayoutGroup.php index 494417d9e..cc682f973 100644 --- a/apps/pc_frontend/templates/smtLayoutGroup.php +++ b/apps/pc_frontend/templates/smtLayoutGroup.php @@ -25,6 +25,7 @@ ') ?> + diff --git a/apps/pc_frontend/templates/smtLayoutHome.php b/apps/pc_frontend/templates/smtLayoutHome.php index 21e6072ce..02650c1dc 100644 --- a/apps/pc_frontend/templates/smtLayoutHome.php +++ b/apps/pc_frontend/templates/smtLayoutHome.php @@ -25,6 +25,7 @@ ') ?> + diff --git a/apps/pc_frontend/templates/smtLayoutMember.php b/apps/pc_frontend/templates/smtLayoutMember.php index 7c00f7d88..358fd5d05 100644 --- a/apps/pc_frontend/templates/smtLayoutMember.php +++ b/apps/pc_frontend/templates/smtLayoutMember.php @@ -25,6 +25,7 @@ ') ?> + diff --git a/apps/pc_frontend/templates/smtLayoutSns.php b/apps/pc_frontend/templates/smtLayoutSns.php index 9a9d33763..f621959b8 100644 --- a/apps/pc_frontend/templates/smtLayoutSns.php +++ b/apps/pc_frontend/templates/smtLayoutSns.php @@ -25,6 +25,7 @@ ') ?> + diff --git a/web/js/jquery.tmpl.min.js b/web/js/jquery.tmpl.min.js new file mode 100644 index 000000000..f08e81dcc --- /dev/null +++ b/web/js/jquery.tmpl.min.js @@ -0,0 +1 @@ +(function(a){var r=a.fn.domManip,d="_tmplitem",q=/^[^<]*(<[\w\W]+>)[^>]*$|\{\{\! /,b={},f={},e,p={key:0,data:{}},h=0,c=0,l=[];function g(e,d,g,i){var c={data:i||(d?d.data:{}),_wrap:d?d._wrap:null,tmpl:null,parent:d||null,nodes:[],calls:u,nest:w,wrap:x,html:v,update:t};e&&a.extend(c,e,{nodes:[],parent:d});if(g){c.tmpl=g;c._ctnt=c._ctnt||c.tmpl(a,c);c.key=++h;(l.length?f:b)[h]=c}return c}a.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(f,d){a.fn[f]=function(n){var g=[],i=a(n),k,h,m,l,j=this.length===1&&this[0].parentNode;e=b||{};if(j&&j.nodeType===11&&j.childNodes.length===1&&i.length===1){i[d](this[0]);g=this}else{for(h=0,m=i.length;h0?this.clone(true):this).get();a.fn[d].apply(a(i[h]),k);g=g.concat(k)}c=0;g=this.pushStack(g,f,i.selector)}l=e;e=null;a.tmpl.complete(l);return g}});a.fn.extend({tmpl:function(d,c,b){return a.tmpl(this[0],d,c,b)},tmplItem:function(){return a.tmplItem(this[0])},template:function(b){return a.template(b,this[0])},domManip:function(d,l,j){if(d[0]&&d[0].nodeType){var f=a.makeArray(arguments),g=d.length,i=0,h;while(i1)f[0]=[a.makeArray(d)];if(h&&c)f[2]=function(b){a.tmpl.afterManip(this,b,j)};r.apply(this,f)}else r.apply(this,arguments);c=0;!e&&a.tmpl.complete(b);return this}});a.extend({tmpl:function(d,h,e,c){var j,k=!c;if(k){c=p;d=a.template[d]||a.template(null,d);f={}}else if(!d){d=c.tmpl;b[c.key]=c;c.nodes=[];c.wrapped&&n(c,c.wrapped);return a(i(c,null,c.tmpl(a,c)))}if(!d)return[];if(typeof h==="function")h=h.call(c||{});e&&e.wrapped&&n(e,e.wrapped);j=a.isArray(h)?a.map(h,function(a){return a?g(e,c,d,a):null}):[g(e,c,d,h)];return k?a(i(c,null,j)):j},tmplItem:function(b){var c;if(b instanceof a)b=b[0];while(b&&b.nodeType===1&&!(c=a.data(b,"tmplItem"))&&(b=b.parentNode));return c||p},template:function(c,b){if(b){if(typeof b==="string")b=o(b);else if(b instanceof a)b=b[0]||{};if(b.nodeType)b=a.data(b,"tmpl")||a.data(b,"tmpl",o(b.innerHTML));return typeof c==="string"?(a.template[c]=b):b}return c?typeof c!=="string"?a.template(null,c):a.template[c]||a.template(null,q.test(c)?c:a(c)):null},encode:function(a){return(""+a).split("<").join("<").split(">").join(">").split('"').join(""").split("'").join("'")}});a.extend(a.tmpl,{tag:{tmpl:{_default:{$2:"null"},open:"if($notnull_1){_=_.concat($item.nest($1,$2));}"},wrap:{_default:{$2:"null"},open:"$item.calls(_,$1,$2);_=[];",close:"call=$item.calls();_=call._.concat($item.wrap(call,_));"},each:{_default:{$2:"$index, $value"},open:"if($notnull_1){$.each($1a,function($2){with(this){",close:"}});}"},"if":{open:"if(($notnull_1) && $1a){",close:"}"},"else":{_default:{$1:"true"},open:"}else if(($notnull_1) && $1a){"},html:{open:"if($notnull_1){_.push($1a);}"},"=":{_default:{$1:"$data"},open:"if($notnull_1){_.push($.encode($1a));}"},"!":{open:""}},complete:function(){b={}},afterManip:function(f,b,d){var e=b.nodeType===11?a.makeArray(b.childNodes):b.nodeType===1?[b]:[];d.call(f,b);m(e);c++}});function i(e,g,f){var b,c=f?a.map(f,function(a){return typeof a==="string"?e.key?a.replace(/(<\w+)(?=[\s>])(?![^>]*_tmplitem)([^>]*)/g,"$1 "+d+'="'+e.key+'" $2'):a:i(a,e,a._ctnt)}):e;if(g)return c;c=c.join("");c.replace(/^\s*([^<\s][^<]*)?(<[\w\W]+>)([^>]*[^>\s])?\s*$/,function(f,c,e,d){b=a(e).get();m(b);if(c)b=j(c).concat(b);if(d)b=b.concat(j(d))});return b?b:j(c)}function j(c){var b=document.createElement("div");b.innerHTML=c;return a.makeArray(b.childNodes)}function o(b){return new Function("jQuery","$item","var $=jQuery,call,_=[],$data=$item.data;with($data){_.push('"+a.trim(b).replace(/([\\'])/g,"\\$1").replace(/[\r\t\n]/g," ").replace(/\$\{([^\}]*)\}/g,"{{= $1}}").replace(/\{\{(\/?)(\w+|.)(?:\(((?:[^\}]|\}(?!\}))*?)?\))?(?:\s+(.*?)?)?(\(((?:[^\}]|\}(?!\}))*?)\))?\s*\}\}/g,function(m,l,j,d,b,c,e){var i=a.tmpl.tag[j],h,f,g;if(!i)throw"Template command not found: "+j;h=i._default||[];if(c&&!/\w$/.test(b)){b+=c;c=""}if(b){b=k(b);e=e?","+k(e)+")":c?")":"";f=c?b.indexOf(".")>-1?b+c:"("+b+").call($item"+e:b;g=c?f:"(typeof("+b+")==='function'?("+b+").call($item):("+b+"))"}else g=f=h.$1||"null";d=k(d);return"');"+i[l?"close":"open"].split("$notnull_1").join(b?"typeof("+b+")!=='undefined' && ("+b+")!=null":"true").split("$1a").join(g).split("$1").join(f).split("$2").join(d?d.replace(/\s*([^\(]+)\s*(\((.*?)\))?/g,function(d,c,b,a){a=a?","+a+")":b?")":"";return a?"("+c+").call($item"+a:d}):h.$2||"")+"_.push('"})+"');}return _;")}function n(c,b){c._wrap=i(c,true,a.isArray(b)?b:[q.test(b)?b:a(b).html()]).join("")}function k(a){return a?a.replace(/\\'/g,"'").replace(/\\\\/g,"\\"):null}function s(b){var a=document.createElement("div");a.appendChild(b.cloneNode(true));return a.innerHTML}function m(o){var n="_"+c,k,j,l={},e,p,i;for(e=0,p=o.length;e=0;i--)m(j[i]);m(k)}function m(j){var p,i=j,k,e,m;if(m=j.getAttribute(d)){while(i.parentNode&&(i=i.parentNode).nodeType===1&&!(p=i.getAttribute(d)));if(p!==m){i=i.parentNode?i.nodeType===11?0:i.getAttribute(d)||0:0;if(!(e=b[m])){e=f[m];e=g(e,b[i]||f[i],null,true);e.key=++h;b[h]=e}c&&o(m)}j.removeAttribute(d)}else if(c&&(e=a.data(j,"tmplItem"))){o(e.key);b[e.key]=e;i=a.data(j.parentNode,"tmplItem");i=i?i.key:0}if(e){k=e;while(k&&k.key!=i){k.nodes.push(j);k=k.parent}delete e._ctnt;delete e._wrap;a.data(j,"tmplItem",e)}function o(a){a=a+n;e=l[a]=l[a]||g(e,b[e.parent.key+n]||e.parent,null,true)}}}function u(a,d,c,b){if(!a)return l.pop();l.push({_:a,tmpl:d,item:this,data:c,options:b})}function w(d,c,b){return a.tmpl(a.template(d),c,b,this)}function x(b,d){var c=b.options||{};c.wrapped=d;return a.tmpl(a.template(b.tmpl),b.data,c,b.item)}function v(d,c){var b=this._wrap;return a.map(a(a.isArray(b)?b.join(""):b).filter(d||"*"),function(a){return c?a.innerText||a.textContent:a.outerHTML||s(a)})}function t(){var b=this.nodes;a.tmpl(null,null,null,this).insertBefore(b[0]);a(b).remove()}})(jQuery) \ No newline at end of file From 4289683965be9798c55de0804e6d952ea445d7fe Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Wed, 28 Dec 2011 00:35:03 +0900 Subject: [PATCH 033/630] add actions and templates for smartphone (refs #2227) --- apps/pc_frontend/i18n/messages.ja.xml | 28 +++ .../community/actions/actions.class.php | 156 ++++++++++++++- .../modules/community/config/view.yml | 24 +++ .../community/templates/smtEditSuccess.php | 100 ++++++++++ .../community/templates/smtHomeSuccess.php | 76 ++++++++ .../community/templates/smtJoinError.php | 17 ++ .../community/templates/smtJoinInput.php | 24 +++ .../templates/smtJoinlistSuccess.php | 18 ++ .../templates/smtMemberListSuccess.php | 20 ++ .../community/templates/smtQuitError.php | 16 ++ .../community/templates/smtQuitSuccess.php | 24 +++ .../default/actions/csrfErrorAction.class.php | 5 + .../default/actions/errorAction.class.php | 7 +- .../actions/privacyPolicyAction.class.php | 5 + .../actions/userAgreementAction.class.php | 5 + .../default/templates/smtCsrfErrorSuccess.php | 9 + .../default/templates/smtErrorSuccess.php | 8 + .../templates/smtPrivacyPolicySuccess.php | 7 + .../templates/smtUserAgreementSuccess.php | 7 + .../modules/friend/actions/actions.class.php | 26 +++ .../modules/friend/config/view.yml | 5 + .../modules/friend/templates/smtLinkInput.php | 23 +++ .../friend/templates/smtListSuccess.php | 21 ++ .../modules/member/actions/actions.class.php | 179 ++++++++++++++++-- .../modules/member/config/view.yml | 18 ++ .../templates/smtConfigImageSuccess.php | 58 ++++++ .../member/templates/smtConfigSuccess.php | 59 ++++++ .../templates/smtEditProfileSuccess.php | 68 +++++++ .../member/templates/smtHomeSuccess.php | 87 +++++++++ .../member/templates/smtInviteError.php | 9 + .../member/templates/smtInviteSuccess.php | 38 ++++ .../member/templates/smtLoginError.php | 8 + .../member/templates/smtLoginSuccess.php | 30 +++ .../member/templates/smtProfileSuccess.php | 110 +++++++++++ lib/request/opWebRequest.class.php | 12 ++ 35 files changed, 1288 insertions(+), 19 deletions(-) create mode 100644 apps/pc_frontend/modules/community/templates/smtEditSuccess.php create mode 100644 apps/pc_frontend/modules/community/templates/smtHomeSuccess.php create mode 100644 apps/pc_frontend/modules/community/templates/smtJoinError.php create mode 100644 apps/pc_frontend/modules/community/templates/smtJoinInput.php create mode 100644 apps/pc_frontend/modules/community/templates/smtJoinlistSuccess.php create mode 100644 apps/pc_frontend/modules/community/templates/smtMemberListSuccess.php create mode 100644 apps/pc_frontend/modules/community/templates/smtQuitError.php create mode 100644 apps/pc_frontend/modules/community/templates/smtQuitSuccess.php create mode 100644 apps/pc_frontend/modules/default/templates/smtCsrfErrorSuccess.php create mode 100644 apps/pc_frontend/modules/default/templates/smtErrorSuccess.php create mode 100644 apps/pc_frontend/modules/default/templates/smtPrivacyPolicySuccess.php create mode 100644 apps/pc_frontend/modules/default/templates/smtUserAgreementSuccess.php create mode 100644 apps/pc_frontend/modules/friend/config/view.yml create mode 100644 apps/pc_frontend/modules/friend/templates/smtLinkInput.php create mode 100644 apps/pc_frontend/modules/friend/templates/smtListSuccess.php create mode 100644 apps/pc_frontend/modules/member/templates/smtConfigImageSuccess.php create mode 100644 apps/pc_frontend/modules/member/templates/smtConfigSuccess.php create mode 100644 apps/pc_frontend/modules/member/templates/smtEditProfileSuccess.php create mode 100644 apps/pc_frontend/modules/member/templates/smtHomeSuccess.php create mode 100644 apps/pc_frontend/modules/member/templates/smtInviteError.php create mode 100644 apps/pc_frontend/modules/member/templates/smtInviteSuccess.php create mode 100644 apps/pc_frontend/modules/member/templates/smtLoginError.php create mode 100644 apps/pc_frontend/modules/member/templates/smtLoginSuccess.php create mode 100644 apps/pc_frontend/modules/member/templates/smtProfileSuccess.php diff --git a/apps/pc_frontend/i18n/messages.ja.xml b/apps/pc_frontend/i18n/messages.ja.xml index 620fe6bf6..2d22b39a9 100644 --- a/apps/pc_frontend/i18n/messages.ja.xml +++ b/apps/pc_frontend/i18n/messages.ja.xml @@ -318,6 +318,10 @@ %friend% List %friend%リスト + + %1%'s %friend% List + %1%さんの%friend%リスト + Other members look your page like this. ※他のメンバーから見たあなたのページはこのようになります。 @@ -1335,6 +1339,30 @@ Unknown Day 日付非設定 + + JSON API Configuration + JSON API 設定 + + + API Key + APIキー + + + You can provide this API key to third party applications. + APIキーはサードパーティアプリに設定することができます。 + + + Reset API key + APIキーをリセットする + + + Back to %member% profile page + %member% さんのページに戻る + + + Back to %community% top page + %community% トップに戻る + diff --git a/apps/pc_frontend/modules/community/actions/actions.class.php b/apps/pc_frontend/modules/community/actions/actions.class.php index 0d14672dc..db954609f 100644 --- a/apps/pc_frontend/modules/community/actions/actions.class.php +++ b/apps/pc_frontend/modules/community/actions/actions.class.php @@ -17,13 +17,41 @@ */ class communityActions extends opCommunityAction { + /** + * Executes home action + * + * @param opWebRequest $request A request object + */ + public function executeHome($request) + { + $this->forwardIf($request->isSmartphone(), 'community', 'smtHome'); + + return parent::executeHome($request); + } + + /** + * Executes smtHome action + * + * @param opWebRequest $request A request object + */ + public function executeSmtHome(opWebRequest $request) + { + $result = parent::executeHome($request); + + $this->getResponse()->setDisplayCommunity($this->community); + + return $result; + } + /** * Executes edit action * - * @param sfRequest $request A request object + * @param opWebRequest $request A request object */ public function executeEdit($request) { + $this->forwardIf($request->isSmartphone(), 'community', 'smtEdit'); + $this->enableImage = true; $result = parent::executeEdit($request); @@ -32,16 +60,65 @@ public function executeEdit($request) } + return $result; + } + + /** + * Executes smtEdit action + * + * @param opWebRequest $request A request object + */ + public function executeSmtEdit(opWebRequest $request) + { + $result = parent::executeEdit($request); + + if ($this->community->isNew()) + { + $this->setLayout('smtLayoutHome'); + } + else + { + $this->getResponse()->setDisplayCommunity($this->community); + } + + return $result; + } + + /** + * Executes memberList action + * + * @param opWebRequest $request A request object + */ + public function executeMemberList($request) + { + $this->forwardIf($request->isSmartphone(), 'community', 'smtMemberList'); + + return parent::executeMemberList($request); + } + + /** + * Executes smtMemberList action + * + * @param opWebRequest $request A request object + */ + public function executeSmtMemberList(opWebRequest $request) + { + $result = parent::executeMemberList($request); + + $this->getResponse()->setDisplayCommunity($this->community); + return $result; } /** * Executes joinlist action * - * @param sfRequest $request A request object + * @param opWebRequest $request A request object */ public function executeJoinlist($request) { + $this->forwardIf($request->isSmartphone(), 'community', 'smtJoinlist'); + sfConfig::set('sf_nav_type', 'default'); if ($request->hasParameter('id') && $request->getParameter('id') != $this->getUser()->getMemberId()) @@ -51,4 +128,79 @@ public function executeJoinlist($request) return parent::executeJoinlist($request); } + + /** + * Executes smtJoinlist action + * + * @param opWebRequest $request A request object + */ + public function executeSmtJoinlist(opWebRequest $request) + { + $result = parent::executeJoinlist($request); + + if ($request['id'] && $request['id'] !== $this->getUser()->getMemberId()) + { + $this->targetMember = Doctrine::getTable('Member')->find((int)$request['id']); + } + else + { + $this->targetMember = $this->getUser()->getMember(); + } + + $this->getResponse()->setDisplayMember($this->targetMember); + + return $result; + } + + /** + * Executes join action + * + * @param opWebRequest $request A request object + */ + public function executeJoin(opWebRequest $request) + { + $this->forwardIf($request->isSmartphone(), 'community', 'smtJoin'); + + return parent::executeJoin($request); + } + + /** + * Executes smtJoin action + * + * @param opWebRequest $request A request object + */ + public function executeSmtJoin(opWebRequest $request) + { + $result = parent::executeJoin($request); + + $this->getResponse()->setDisplayCommunity($this->community); + + return $result; + } + + /** + * Executes quit action + * + * @param opWebRequest $request A request object + */ + public function executeQuit(opWebRequest $request) + { + $this->forwardIf($request->isSmartphone(), 'community', 'smtQuit'); + + return parent::executeQuit($request); + } + + /** + * Executes smtJoin action + * + * @param opWebRequest $request A request object + */ + public function executeSmtQuit(opWebRequest $request) + { + $result = parent::executeQuit($request); + + $this->getResponse()->setDisplayCommunity($this->community); + + return $result; + } } diff --git a/apps/pc_frontend/modules/community/config/view.yml b/apps/pc_frontend/modules/community/config/view.yml index 309e7b7fd..ee36a0e75 100644 --- a/apps/pc_frontend/modules/community/config/view.yml +++ b/apps/pc_frontend/modules/community/config/view.yml @@ -1,2 +1,26 @@ homeSuccess: layout: layoutA + +smtHomeSuccess: + layout: smtLayoutGroup + +smtEditSuccess: + layout: smtLayoutGroup + +smtMemberListSuccess: + layout: smtLayoutGroup + +smtJoinlistSuccess: + layout: smtLayoutMember + +smtJoinInput: + layout: smtLayoutGroup + +smtJoinError: + layout: smtLayoutSns + +smtQuitSuccess: + layout: smtLayoutGroup + +smtQuitError: + layout: smtLayoutSns diff --git a/apps/pc_frontend/modules/community/templates/smtEditSuccess.php b/apps/pc_frontend/modules/community/templates/smtEditSuccess.php new file mode 100644 index 000000000..6fff56c8f --- /dev/null +++ b/apps/pc_frontend/modules/community/templates/smtEditSuccess.php @@ -0,0 +1,100 @@ +isNew()): ?> + + +getId()), 'multipart=true') ?> + +
+isNew()): ?> +
+ +
+ +
+ + +hasGlobalErrors()): ?> +renderGlobalErrors(); ?> + +hasGlobalErrors()): ?> +renderGlobalErrors(); ?> + +hasGlobalErrors()): ?> +renderGlobalErrors(); ?> + + +
+ + +
+ +isHidden()): ?> +
+ renderLabel(); ?> +
+
+ hasError()): ?> + getError()) ?> + + render(array('class' => 'span12')) ?> + renderHelp() ?> +
+ + +
+ +
+ +isHidden()): ?> +
renderLabel() ?>
+
+ hasError()): ?> + getError()) ?> + + render(array('class' => 'span12')) ?> + renderHelp() ?> +
+ + +
+ +
+ +isHidden()): ?> +
renderLabel(); ?>
+
+ hasError()): ?> + getError()) ?> + + render(array('class' => 'span12')) ?> + renderHelp() ?> +
+ + +
+ +
+
+ +renderHiddenFields(); ?> +renderHiddenFields(); ?> +renderHiddenFields(); ?> + +
+ +
+ isNew() && $isDeleteCommunity): ?> + getId())) ?> + DANGER: + + +
+
+ + diff --git a/apps/pc_frontend/modules/community/templates/smtHomeSuccess.php b/apps/pc_frontend/modules/community/templates/smtHomeSuccess.php new file mode 100644 index 000000000..6b16cf9ed --- /dev/null +++ b/apps/pc_frontend/modules/community/templates/smtHomeSuccess.php @@ -0,0 +1,76 @@ +
+
コミュニティ情報
+
+
+
+
+ getImageFileName(), array('size' => '320x320', 'format' => 'jpg')) ?> +
+ + getId()) ?> + +
+
+
+ + + + + + + + + + +getName(), '@member_profile?id='.$m->getId()); +} +?> + + + + + + +community_category_id): ?> + + + + + + + + + + + + + + + + + + + + + +
getCreatedAt(), 'D') ?>
getName(), '@member_profile?id='.$communityAdmin->getId()) ?>
\n", $subAdminCaption) ?>
$op_term['community']->titleize()), 'form_community') ?>:getCommunityCategory() ?>
$op_term['community']->titleize()), 'form_community') ?>:getRaw('community')->getRegisterPolicy()) ?>
countCommunityMembers(); ?>
$op_term['community']->titleize()), 'form_community') ?>getConfig('description'); ?>
+ + $op_term['community']->titleize())), '@community_edit?id=' . $community->getId()) ?>
+ + + + $op_term['community']->titleize())), '@community_quit?id=' . $community->getId()) ?>
+ + + $op_term['community']->titleize())) ?> + + $op_term['community']->titleize())), '@community_join?id=' . $community->getId()) ?>
+ + + +
+
diff --git a/apps/pc_frontend/modules/community/templates/smtJoinError.php b/apps/pc_frontend/modules/community/templates/smtJoinError.php new file mode 100644 index 000000000..4d0d5b033 --- /dev/null +++ b/apps/pc_frontend/modules/community/templates/smtJoinError.php @@ -0,0 +1,17 @@ +
+
+
+ +
+ + + + + + + + + + +
+ diff --git a/apps/pc_frontend/modules/community/templates/smtJoinInput.php b/apps/pc_frontend/modules/community/templates/smtJoinInput.php new file mode 100644 index 000000000..f933ee961 --- /dev/null +++ b/apps/pc_frontend/modules/community/templates/smtJoinInput.php @@ -0,0 +1,24 @@ +
+
$community->getName())) ?>
+
+ +
+
getImageFileName(), array('size' => '48x48')), '@community_home?id='.$id) ?>
+
getName(), '@community_home?id='.$id) ?>
+
+
+ getCurrentUri()); ?> + + isHidden()): ?> +
+ + render(array('class' => 'span12')) ?> + renderHelp() ?> +
+ + +
+ renderHiddenFields(); ?> + +
+
diff --git a/apps/pc_frontend/modules/community/templates/smtJoinlistSuccess.php b/apps/pc_frontend/modules/community/templates/smtJoinlistSuccess.php new file mode 100644 index 000000000..553c21f3d --- /dev/null +++ b/apps/pc_frontend/modules/community/templates/smtJoinlistSuccess.php @@ -0,0 +1,18 @@ +
+
$op_term['community']->titleize())); ?>
+
+
+
+getResults() as $member ): ?> +
+
+ op_image_tag_sf_image($member->getImageFileName(), array('size' => '57x57')))) ?> +
+
getName(), '@member_profile?id='.$member->getId()); ?>
+
+ +
+ +
+ $targetMember->getName())), '@member_profile?id='.$targetMember->getId()) ?> +
diff --git a/apps/pc_frontend/modules/community/templates/smtMemberListSuccess.php b/apps/pc_frontend/modules/community/templates/smtMemberListSuccess.php new file mode 100644 index 000000000..e29ca2f80 --- /dev/null +++ b/apps/pc_frontend/modules/community/templates/smtMemberListSuccess.php @@ -0,0 +1,20 @@ +
+
$op_term['community']->titleize())); ?>
+
+
+
+getResults() as $member ): ?> +
+
+ op_image_tag_sf_image($member->getImageFileName(), array('size' => '57x57')))) ?> +
+
+ getName(), '@member_profile?id='.$member->getId()); ?> +
+
+ +
+ +
+ $community->getName())), '@community_home?id='.$community->getId()) ?> +
diff --git a/apps/pc_frontend/modules/community/templates/smtQuitError.php b/apps/pc_frontend/modules/community/templates/smtQuitError.php new file mode 100644 index 000000000..bcef67f12 --- /dev/null +++ b/apps/pc_frontend/modules/community/templates/smtQuitError.php @@ -0,0 +1,16 @@ +
+
+
+ +
+ + + + + + + + + + +
diff --git a/apps/pc_frontend/modules/community/templates/smtQuitSuccess.php b/apps/pc_frontend/modules/community/templates/smtQuitSuccess.php new file mode 100644 index 000000000..fec4fdd33 --- /dev/null +++ b/apps/pc_frontend/modules/community/templates/smtQuitSuccess.php @@ -0,0 +1,24 @@ +
+
$community->getName())) ?>
+
+ +
+
getImageFileName(), array('size' => '48x48')), '@community_home?id='.$id) ?>
+
getName(), '@community_home?id='.$id) ?>
+
+
+ getCurrentUri()); ?> + + isHidden()): ?> +
+ + render(array('class' => 'span12')) ?> + renderHelp() ?> +
+ + + + renderHiddenFields(); ?> + +
+
diff --git a/apps/pc_frontend/modules/default/actions/csrfErrorAction.class.php b/apps/pc_frontend/modules/default/actions/csrfErrorAction.class.php index b4b1eaed2..ba767e1b6 100644 --- a/apps/pc_frontend/modules/default/actions/csrfErrorAction.class.php +++ b/apps/pc_frontend/modules/default/actions/csrfErrorAction.class.php @@ -19,5 +19,10 @@ class csrfErrorAction extends sfAction { public function execute($request) { + if ($request->isSmartphone()) + { + $this->setLayout('smtLayoutSns'); + $this->setTemplate('smtCsrf'); + } } } diff --git a/apps/pc_frontend/modules/default/actions/errorAction.class.php b/apps/pc_frontend/modules/default/actions/errorAction.class.php index a2f57c05c..877b15ddd 100644 --- a/apps/pc_frontend/modules/default/actions/errorAction.class.php +++ b/apps/pc_frontend/modules/default/actions/errorAction.class.php @@ -21,9 +21,14 @@ class errorAction extends sfAction /** * Executes error action * - * @param sfRequest $request A request object + * @param opWebRequest $request A request object */ public function execute($request) { + if ($request->isSmartphone()) + { + $this->setLayout('smtLayoutSns'); + $this->setTemplate('smtError'); + } } } diff --git a/apps/pc_frontend/modules/default/actions/privacyPolicyAction.class.php b/apps/pc_frontend/modules/default/actions/privacyPolicyAction.class.php index 5ce714119..173be9ee8 100644 --- a/apps/pc_frontend/modules/default/actions/privacyPolicyAction.class.php +++ b/apps/pc_frontend/modules/default/actions/privacyPolicyAction.class.php @@ -24,5 +24,10 @@ class privacyPolicyAction extends sfAction */ public function execute($request) { + if ($request->isSmartphone()) + { + $this->setLayout('smtLayoutSns'); + $this->setTemplate('smtPrivacyPolicy'); + } } } diff --git a/apps/pc_frontend/modules/default/actions/userAgreementAction.class.php b/apps/pc_frontend/modules/default/actions/userAgreementAction.class.php index 67195a715..5c24b42fe 100644 --- a/apps/pc_frontend/modules/default/actions/userAgreementAction.class.php +++ b/apps/pc_frontend/modules/default/actions/userAgreementAction.class.php @@ -24,5 +24,10 @@ class userAgreementAction extends sfAction */ public function execute($request) { + if ($request->isSmartphone()) + { + $this->setLayout('smtLayoutSns'); + $this->setTemplate('smtUserAgreement'); + } } } diff --git a/apps/pc_frontend/modules/default/templates/smtCsrfErrorSuccess.php b/apps/pc_frontend/modules/default/templates/smtCsrfErrorSuccess.php new file mode 100644 index 000000000..6ce90a73d --- /dev/null +++ b/apps/pc_frontend/modules/default/templates/smtCsrfErrorSuccess.php @@ -0,0 +1,9 @@ +
+

+
+ + + +
+ +
diff --git a/apps/pc_frontend/modules/default/templates/smtErrorSuccess.php b/apps/pc_frontend/modules/default/templates/smtErrorSuccess.php new file mode 100644 index 000000000..8337de2f4 --- /dev/null +++ b/apps/pc_frontend/modules/default/templates/smtErrorSuccess.php @@ -0,0 +1,8 @@ +
+

+
+ + +
+ +
diff --git a/apps/pc_frontend/modules/default/templates/smtPrivacyPolicySuccess.php b/apps/pc_frontend/modules/default/templates/smtPrivacyPolicySuccess.php new file mode 100644 index 000000000..2e6acb7fb --- /dev/null +++ b/apps/pc_frontend/modules/default/templates/smtPrivacyPolicySuccess.php @@ -0,0 +1,7 @@ +
+

+
+ +
+ +
diff --git a/apps/pc_frontend/modules/default/templates/smtUserAgreementSuccess.php b/apps/pc_frontend/modules/default/templates/smtUserAgreementSuccess.php new file mode 100644 index 000000000..1ed0b64f6 --- /dev/null +++ b/apps/pc_frontend/modules/default/templates/smtUserAgreementSuccess.php @@ -0,0 +1,7 @@ +
+

+
+ +
+ +
diff --git a/apps/pc_frontend/modules/friend/actions/actions.class.php b/apps/pc_frontend/modules/friend/actions/actions.class.php index 5751c03d8..ce3bef579 100644 --- a/apps/pc_frontend/modules/friend/actions/actions.class.php +++ b/apps/pc_frontend/modules/friend/actions/actions.class.php @@ -29,8 +29,34 @@ public function preExecute() public function executeList(sfWebRequest $request) { + $this->forwardIf($request->isSmartphone(), 'friend', 'smtList'); + $this->size = 50; return parent::executeList($request); } + + public function executeSmtList($request) + { + $this->member = Doctrine::getTable('Member')->find($this->id); + $this->getResponse()->setDisplayMember($this->member); + + return sfView::SUCCESS; + } + + public function executeLink(opWebRequest $request) + { + $this->forwardIf($request->isSmartphone(), 'friend', 'smtLink'); + + return parent::executeLink($request); + } + + public function executeSmtLink(opWebRequest $request) + { + $result = parent::executeLink($request); + + $this->getResponse()->setDisplayMember($this->member); + + return $result; + } } diff --git a/apps/pc_frontend/modules/friend/config/view.yml b/apps/pc_frontend/modules/friend/config/view.yml new file mode 100644 index 000000000..7dcbac29c --- /dev/null +++ b/apps/pc_frontend/modules/friend/config/view.yml @@ -0,0 +1,5 @@ +smtListSuccess: + layout: smtLayoutMember + +smtLinkInput: + layout: smtLayoutSns diff --git a/apps/pc_frontend/modules/friend/templates/smtLinkInput.php b/apps/pc_frontend/modules/friend/templates/smtLinkInput.php new file mode 100644 index 000000000..48ebd36a7 --- /dev/null +++ b/apps/pc_frontend/modules/friend/templates/smtLinkInput.php @@ -0,0 +1,23 @@ +
+
$op_term['my_friend']->pluralize())) ?>
+
+ +
+
getImageFileName(), array('size' => '48x48')), '@member_profile?id='.$id) ?>
+
getName(), '@member_profile?id='.$id) ?>
+
+ getCurrentUri()); ?> + + isHidden()): ?> +
+ + render(array('class' => 'span12')) ?> + renderHelp() ?> +
+ + + + renderHiddenFields(); ?> + +
+
diff --git a/apps/pc_frontend/modules/friend/templates/smtListSuccess.php b/apps/pc_frontend/modules/friend/templates/smtListSuccess.php new file mode 100644 index 000000000..da9fc2225 --- /dev/null +++ b/apps/pc_frontend/modules/friend/templates/smtListSuccess.php @@ -0,0 +1,21 @@ + + + +
+
$member->getName(), '%friend%' => $op_term['friend']->titleize())); ?>
+
+
+
+ +
diff --git a/apps/pc_frontend/modules/member/actions/actions.class.php b/apps/pc_frontend/modules/member/actions/actions.class.php index b8d44a485..22e37cfe6 100644 --- a/apps/pc_frontend/modules/member/actions/actions.class.php +++ b/apps/pc_frontend/modules/member/actions/actions.class.php @@ -20,10 +20,12 @@ class memberActions extends opMemberAction /** * Executes home action * - * @param sfRequest $request A request object + * @param opWebRequest $request A request object */ public function executeHome($request) { + $this->forwardIf($request->isSmartphone(), 'member', 'smtHome'); + $this->topGadgets = null; $this->sideMenuGadgets = null; @@ -47,10 +49,20 @@ public function executeHome($request) return parent::executeHome($request); } + /** + * Execute smtHome action + * + * @param opWebRequest $request A request object + */ + public function executeSmtHome(opWebRequest $request) + { + return sfView::SUCCESS; + } + /** * Executes login action * - * @param sfRequest $request A request object + * @param opWevRequest $request A request object */ public function executeLogin($request) { @@ -59,32 +71,43 @@ public function executeLogin($request) $this->redirect(opConfig::get('external_pc_login_url')); } - $this->gadgetConfig = sfConfig::get('op_login_gadget_list'); - $gadgets = Doctrine::getTable('Gadget')->retrieveGadgetsByTypesName('login'); - $layout = Doctrine::getTable('SnsConfig')->get('login_layout', 'layoutA'); - $this->setLayout($layout); - - switch($layout) + if ($request->isSmartphone()) { - case 'layoutA' : - $this->topGadgets = $gadgets['loginTop']; - case 'layoutB' : - $this->sideMenuGadgets = $gadgets['loginSideMenu']; + $this->setLayout('smtLayoutSns'); + $this->setTemplate('smtLogin'); } + else + { + $this->gadgetConfig = sfConfig::get('op_login_gadget_list'); + $gadgets = Doctrine::getTable('Gadget')->retrieveGadgetsByTypesName('login'); + $layout = Doctrine::getTable('SnsConfig')->get('login_layout', 'layoutA'); + $this->setLayout($layout); - $this->contentsGadgets = $gadgets['loginContents']; - $this->bottomGadgets = $gadgets['loginBottom']; + switch($layout) + { + case 'layoutA' : + $this->topGadgets = $gadgets['loginTop']; + case 'layoutB' : + $this->sideMenuGadgets = $gadgets['loginSideMenu']; + } + + $this->contentsGadgets = $gadgets['loginContents']; + $this->bottomGadgets = $gadgets['loginBottom']; + } return parent::executeLogin($request); } + /** * Executes profile action * - * @param sfRequest $request A request object + * @param opWebRequest $request A request object */ public function executeProfile($request) { + $this->forwardIf($request->isSmartphone(), 'member', 'smtProfile'); + $id = $request->getParameter('id', $this->getUser()->getMemberId()); if ($id != $this->getUser()->getMemberId()) { @@ -110,13 +133,29 @@ public function executeProfile($request) return parent::executeProfile($request); } + /** + * Executes smtProfile action + * + * @param opWebRequest $request A request object + */ + public function executeSmtProfile(opWebRequest $request) + { + $result = parent::executeProfile($request); + + $this->getResponse()->setDisplayMember($this->member); + + return $result; + } + /** * Executes configImage action * - * @param sfRequest $request A request object + * @param opWebRequest $request A request object */ public function executeConfigImage($request) { + $this->forwardIf($request->isSmartphone(), 'member', 'smtConfigImage'); + $options = array('member' => $this->getUser()->getMember()); $this->form = new MemberImageForm(array(), $options); @@ -141,6 +180,44 @@ public function executeConfigImage($request) } $this->redirect('@member_config_image'); } + + } + + + /** + * Executes smtCofigImage action + * + * @param opWebRequest $request A request object + */ + + public function executeSmtConfigImage(opWebRequest $request) + { + $options = array('member' => $this->getUser()->getMember()); + $this->form = new MemberImageForm(array(), $options); + + if ($request->isMethod(sfWebRequest::POST)) + { + try + { + if (!$this->form->bindAndSave($request->getParameter('member_image'), $request->getFiles('member_image'))) + { + $errors = $this->form->getErrorSchema()->getErrors(); + if (isset($errors['file'])) + { + $error = $errors['file']; + $i18n = $this->getContext()->getI18N(); + $this->getUser()->setFlash('error', $i18n->__($error->getMessageFormat(), $error->getArguments())); + } + } + } + catch (opRuntimeException $e) + { + $this->getUser()->setFlash('error', $e->getMessage()); + } + $this->redirect('@member_config_image'); + } + + return parent::executeConfigImage($request); } /** @@ -187,4 +264,74 @@ public function executeChangeLanguage(sfWebRequest $request) } $this->redirect('@homepage'); } + + + /** + * Executes editConfig action + * + * @param opWebRequest $request a request object + */ + public function executeConfig($request) + { + $this->forwardIf($request->isSmartphone(), 'member', 'smtConfig'); + + return parent::executeConfig($request); + } + + /** + * Executes editSmtConfig action + * + * @param opWebRequest $request a request object + */ + public function executeSmtConfig(opWebRequest $request) + { + return parent::executeConfig($request); + } + + + /** + * Executes invite action + * + * @param opWebRequest $request a request object + */ + public function executeInvite($request) + { + $this->forwardIf($request->isSmartphone(), 'member', 'smtInvite'); + + return parent::executeInvite($request); + } + + + /** + * Executes editSmtConfig action + * + * @param opWebRequest $request a request object + */ + public function executeSmtInvite(opWebRequest $request) + { + return parent::executeInvite($request); + } + + + /** + * Executes editProfile action + * + * @param opWebRequest $request a request object + */ + public function executeEditProfile($request) + { + $this->forwardIf($request->isSmartphone(), 'member', 'smtEditProfile'); + + return parent::executeEditProfile($request); + } + + /** + * Executes smtEditProfile action + * + * @param opWebRequest $request a request object + */ + public function executeSmtEditProfile(opWebRequest $request) + { + return parent::executeEditProfile($request); + } } diff --git a/apps/pc_frontend/modules/member/config/view.yml b/apps/pc_frontend/modules/member/config/view.yml index f62759b2b..324e4ffa1 100644 --- a/apps/pc_frontend/modules/member/config/view.yml +++ b/apps/pc_frontend/modules/member/config/view.yml @@ -31,3 +31,21 @@ configSuccess: loginSuccess: layout: layoutA + +smtHomeSuccess: + layout: smtLayoutHome + +smtProfileSuccess: + layout: smtLayoutMember + +smtEditProfileSuccess: + layout: smtLayoutHome + +smtConfigSuccess: + layout: smtLayoutHome + +smtConfigImageSuccess: + layout: smtLayoutHome + +smtInviteSuccess: + layout: smtLayoutHome diff --git a/apps/pc_frontend/modules/member/templates/smtConfigImageSuccess.php b/apps/pc_frontend/modules/member/templates/smtConfigImageSuccess.php new file mode 100644 index 000000000..d938dd4bc --- /dev/null +++ b/apps/pc_frontend/modules/member/templates/smtConfigImageSuccess.php @@ -0,0 +1,58 @@ +
+
+
+ + +hasGlobalErrors()): ?> +renderGlobalErrors(); ?> + + +
+
+x + +

+ +
+
+ + +
+renderFormTag(url_for('member/configImage')) ?> + +renderHiddenFields(); ?> + + += $sf_user->getMember()->getMemberImage()->count()): ?> +
+ + +
+ +
+getMember() ?> +getMemberImage() ?> + +getCSRFFieldName().'='.$form->getCSRFToken() ?> + +
+
+ + +getFile(), array('size' => '120x120', 'width' => '80', 'height' => '80')) ?>
+
+[ +getId().$csrfToken) ?> | +getIsPrimary()) : ?> + + +getId().$csrfToken) ?> + +] + + '80x80', 'alt' => '')) ?> + +
+
+ +
diff --git a/apps/pc_frontend/modules/member/templates/smtConfigSuccess.php b/apps/pc_frontend/modules/member/templates/smtConfigSuccess.php new file mode 100644 index 000000000..73365f8ee --- /dev/null +++ b/apps/pc_frontend/modules/member/templates/smtConfigSuccess.php @@ -0,0 +1,59 @@ + $value) +{ + if (count($value)) + { + $lists[$key] = link_to(__($categoryCaptions[$key]), '@member_config?category='.$key); + } +} +?> + +
+
+
+ +
+
+
+ + + + + +hasGlobalErrors()): ?> +renderGlobalErrors(); ?> + + +
+
+ +

+ +
+
+ + +
+ +isHidden()): ?> +
+ +render(array('class' => 'span12')) ?> +renderHelp() ?> +
+ + + +renderHiddenFields(); ?> + +
+ + + + +
+ +
+ +
diff --git a/apps/pc_frontend/modules/member/templates/smtEditProfileSuccess.php b/apps/pc_frontend/modules/member/templates/smtEditProfileSuccess.php new file mode 100644 index 000000000..0d54d0b42 --- /dev/null +++ b/apps/pc_frontend/modules/member/templates/smtEditProfileSuccess.php @@ -0,0 +1,68 @@ +
+
+
+
+ + +hasGlobalErrors()): ?> +renderGlobalErrors(); ?> + +hasGlobalErrors()): ?> +renderGlobalErrors(); ?> + + + +
+
+x + +

+ +
+
+ + +
+ + +isHidden()): ?> + + + + + + + +isHidden()): ?> + + + + + + +renderHiddenFields(); ?> +renderHiddenFields(); ?> +
renderLabel(); ?> +
+ hasError()): ?> + getError()); ?> + + render(array('class' => 'span16')) ?> + renderHelp(); ?> +
+
renderLabel(); ?> +
+ hasError()): ?> + getError()); ?> + + getWidget()->getOption('widget') instanceof sfWidgetFormDate): ?> + render(array('class' => 'span8')) ?> + + render(array('class' => 'span16')) ?> + + renderHelp() ?> +
+
+ + +
diff --git a/apps/pc_frontend/modules/member/templates/smtHomeSuccess.php b/apps/pc_frontend/modules/member/templates/smtHomeSuccess.php new file mode 100644 index 000000000..7e4950718 --- /dev/null +++ b/apps/pc_frontend/modules/member/templates/smtHomeSuccess.php @@ -0,0 +1,87 @@ + + + + +getRelativeUrlRoot() ? $sf_request->getRelativeUrlRoot() : '/').'"; + var expires = new Date(); + expires.setTime((new Date()).getTime() + (10 * 12 * 30 * 24 * 60 * 60 * 1000)); + var pos = obj.parentNode.id; + + opCookie.set("HomeGadget_" + pos + "_sort", result, expires, path); +} + +function foldObj(obj, display) +{ + Element.childElements(obj.parentNode).each(function(child, index){ + if (!child.hasClassName("partsHeading")) { + if (display == null) { + child.toggle(); + } else { + if (display == "true") { + child.show(); + } else { + child.hide(); + } + } + + var size = Element.childElements(obj.parentNode).length; + if (size == index + 1) { // It is a last loop maybe + var path = "'.($sf_request->getRelativeUrlRoot() ? $sf_request->getRelativeUrlRoot() : '/').'"; + var id = child.parentNode.parentNode.id; + var expires = new Date(); + expires.setTime((new Date()).getTime() + (10 * 12 * 30 * 24 * 60 * 60 * 1000)); + opCookie.set("HomeGadget_" + id + "_toggle", child.visible(), expires, path); + } + } + }); +} + +$$(".partsHeading").each(function(obj){ + // folding + Event.observe(obj, "dblclick", function(e){ + foldObj(obj); + }); + var id = obj.parentNode.parentNode.id; + var display = opCookie.get("HomeGadget_"+id+"_toggle"); + if (display != null) { + foldObj(obj, display); + } + +}); + +["Top", "Left", "Center"].each(function(type){ + var sortInfo = opCookie.get("HomeGadget_" + type + "_sort"); + if (sortInfo) + { + var obj = document.getElementById(type); + var preGadget = null; + sortInfo.split(",").each(function(value){ + var gadget = document.getElementById(value); + if (preGadget) + { + Element.remove(gadget); + Insertion.After(preGadget, gadget); + } + else + { + Element.remove(gadget); + Insertion.Top(obj, gadget); + } + preGadget = gadget; + }); + } +}); + +') ?> diff --git a/apps/pc_frontend/modules/member/templates/smtInviteError.php b/apps/pc_frontend/modules/member/templates/smtInviteError.php new file mode 100644 index 000000000..940aa0eb1 --- /dev/null +++ b/apps/pc_frontend/modules/member/templates/smtInviteError.php @@ -0,0 +1,9 @@ + __('Invite a friend to %1%', array('%1%' => $op_config['sns_name'])), +); +op_include_box('inviteForm', __('The invitation has not been permitted.'), $options); +?> + + + diff --git a/apps/pc_frontend/modules/member/templates/smtInviteSuccess.php b/apps/pc_frontend/modules/member/templates/smtInviteSuccess.php new file mode 100644 index 000000000..a0e759842 --- /dev/null +++ b/apps/pc_frontend/modules/member/templates/smtInviteSuccess.php @@ -0,0 +1,38 @@ +
+
+
$op_config['sns_name'])); ?>
+
+ +hasGlobalErrors()): ?> +renderGlobalErrors(); ?> + + +
+
+x + +

+ +
+
+ +
+ + +isHidden()): ?> +
+renderLabel(); ?> +
+
+ hasError()): ?> + getError()) ?>
+ + render(array('class' => 'span12')) ?> + renderHelp() ?> +
+ + +renderHiddenFields(); ?> + + +
diff --git a/apps/pc_frontend/modules/member/templates/smtLoginError.php b/apps/pc_frontend/modules/member/templates/smtLoginError.php new file mode 100644 index 000000000..7c820e18d --- /dev/null +++ b/apps/pc_frontend/modules/member/templates/smtLoginError.php @@ -0,0 +1,8 @@ +
+
+
+ + + + + diff --git a/apps/pc_frontend/modules/member/templates/smtLoginSuccess.php b/apps/pc_frontend/modules/member/templates/smtLoginSuccess.php new file mode 100644 index 000000000..c4a821cbe --- /dev/null +++ b/apps/pc_frontend/modules/member/templates/smtLoginSuccess.php @@ -0,0 +1,30 @@ +
+ +
+
メールアドレス
+
+ +
+ +
+ +
+
パスワード
+
+ +
+ +
+ +
+
次回から自動的にログイン
+
+
+
+ +
+
+
+ +
+ diff --git a/apps/pc_frontend/modules/member/templates/smtProfileSuccess.php b/apps/pc_frontend/modules/member/templates/smtProfileSuccess.php new file mode 100644 index 000000000..e2f61693d --- /dev/null +++ b/apps/pc_frontend/modules/member/templates/smtProfileSuccess.php @@ -0,0 +1,110 @@ + + + + + +isSelf()): ?> + +
+

+


+getId(), true) ?>

+

link_to(__('Edit profile'), '@member_editProfile'))) ?>

+
+ + $content)) ?> + +isFriend() && opConfig::get('enable_friend_link') && $relation->isAllowed($sf_user->getRawValue()->getMember(), 'friend_link')): ?> + +
+

$member->getName(), '%my_friend%' => $op_term['my_friend']->pluralize())) ?>
+ $op_term['my_friend']->pluralize())), 'friend/link?id='.$member->getId()) ?> +

+
+ + $content)) ?> + + + +getProfiles(true) as $profile) +{ + $caption = $profile->getProfile()->getCaption(); + if ($profile->getProfile()->isPreset()) + { + $presetConfig = $profile->getProfile()->getPresetConfig(); + $caption = __($presetConfig['Caption']); + } + + $profileValue = (string)$profile; + if ('' === $profileValue) + { + continue; + } + + if ($profile->getFormType() === 'textarea') + { + $profileValue = op_auto_link_text(nl2br($profileValue)); + } + + if ($profile->getProfile()->isPreset()) + { + if ($profile->getFormType() === 'country_select') + { + $profileValue = $culture->getCountry($profileValue); + } + elseif ('op_preset_birthday' === $profile->getName()) + { + $profileValue = op_format_date($profileValue, 'XShortDateJa'); + } + + $profileValue = __($profileValue); + } + + $list[$caption] = $profileValue; +} +?> +
+
+
+
+ + + + $v): ?> + + + +
getName(); ?>
+
+ +
+
+
+
+
+
+
+ getImageFileName(), array('size' => '320x320')) ?> +
+
+
+
+
$op_term['friend'])) ?>
+
+
+
+
+ diff --git a/lib/request/opWebRequest.class.php b/lib/request/opWebRequest.class.php index aabb1bd27..fd41a3d52 100644 --- a/lib/request/opWebRequest.class.php +++ b/lib/request/opWebRequest.class.php @@ -415,4 +415,16 @@ public function redirectToSoftBankGateway() sfContext::getInstance()->getController()->redirect($url); } + + public function isSmartphone() + { + $userAgent = $this->getHttpHeader('User-Agent'); + + if (!$userAgent) + { + return false; + } + + return preg_match('/iPhone/', $userAgent) || preg_match('/iPad/', $userAgent) || preg_match('/Android/', $userAgent); + } } From 56e601baefed9354aabd4ff03ba7cfaadfbef3a0 Mon Sep 17 00:00:00 2001 From: Kimura Youichi Date: Thu, 12 Jan 2012 18:11:50 +0900 Subject: [PATCH 034/630] add ability to configure gadget for smartphone (refs #2227) --- .../community/actions/actions.class.php | 6 +- .../community/actions/components.class.php | 31 ++++++ .../templates/_smtCommunityListBox.php | 74 ++++++++++++++ .../_smtCommunityMemberJoinListBox.php | 22 ++++ .../community/templates/smtHomeSuccess.php | 79 +------------- .../default/actions/components.class.php | 5 + .../default/templates/_smtLoginFormBox.php | 65 ++++++++++++ .../modules/member/actions/actions.class.php | 11 ++ .../member/actions/components.class.php | 37 +++++++ .../templates/_smtMemberFriendListBox.php | 28 +++++ .../_smtMemberJoinCommunityListBox.php | 27 +++++ .../member/templates/_smtProfileListBox.php | 53 ++++++++++ .../member/templates/smtHomeSuccess.php | 94 ++--------------- .../member/templates/smtLoginSuccess.php | 37 ++----- .../member/templates/smtProfileSuccess.php | 96 ++---------------- data/fixtures/005_import_gadgets.yml | 32 ++++++ lib/config/config/gadget_config.yml | 24 +++++ .../config/smartphone_community_gadget.yml | 36 +++++++ lib/config/config/smartphone_gadget.yml | 20 ++++ lib/config/config/smartphone_login_gadget.yml | 28 +++++ .../config/smartphone_profile_gadget.yml | 43 ++++++++ web/css/gadgetPlot.css | 8 ++ web/css/smt_main.css | 13 +++ web/images/ajax-loader.gif | Bin 0 -> 1849 bytes 24 files changed, 587 insertions(+), 282 deletions(-) create mode 100644 apps/pc_frontend/modules/community/templates/_smtCommunityListBox.php create mode 100644 apps/pc_frontend/modules/community/templates/_smtCommunityMemberJoinListBox.php create mode 100644 apps/pc_frontend/modules/default/templates/_smtLoginFormBox.php create mode 100644 apps/pc_frontend/modules/member/templates/_smtMemberFriendListBox.php create mode 100644 apps/pc_frontend/modules/member/templates/_smtMemberJoinCommunityListBox.php create mode 100644 apps/pc_frontend/modules/member/templates/_smtProfileListBox.php create mode 100644 lib/config/config/smartphone_community_gadget.yml create mode 100644 lib/config/config/smartphone_gadget.yml create mode 100644 lib/config/config/smartphone_login_gadget.yml create mode 100644 lib/config/config/smartphone_profile_gadget.yml create mode 100644 web/images/ajax-loader.gif diff --git a/apps/pc_frontend/modules/community/actions/actions.class.php b/apps/pc_frontend/modules/community/actions/actions.class.php index db954609f..f0930ac45 100644 --- a/apps/pc_frontend/modules/community/actions/actions.class.php +++ b/apps/pc_frontend/modules/community/actions/actions.class.php @@ -36,11 +36,13 @@ public function executeHome($request) */ public function executeSmtHome(opWebRequest $request) { - $result = parent::executeHome($request); + $gadgets = Doctrine::getTable('Gadget')->retrieveGadgetsByTypesName('smartphoneCommunity'); + $this->contentsGadgets = $gadgets['smartphoneCommunityContents']; + $this->community = Doctrine::getTable('Community')->find($this->id); $this->getResponse()->setDisplayCommunity($this->community); - return $result; + return sfView::SUCCESS; } /** diff --git a/apps/pc_frontend/modules/community/actions/components.class.php b/apps/pc_frontend/modules/community/actions/components.class.php index 0e798c864..1f48fbd88 100644 --- a/apps/pc_frontend/modules/community/actions/components.class.php +++ b/apps/pc_frontend/modules/community/actions/components.class.php @@ -25,4 +25,35 @@ public function executeJoinListBox($request) $this->crownIds = Doctrine::getTable('CommunityMember')->getCommunityIdsOfAdminByMemberId($this->member->getId()); $this->communities = Doctrine::getTable('Community')->retrievesByMemberId($this->member->getId(), $this->row * $this->col, true); } + + public function executeSmtCommunityListBox($request) + { + $this->id = $request->getParameter('id'); + + $memberId = $this->getUser()->getMemberId(); + $communityMember = Doctrine::getTable('CommunityMember')->retrieveByMemberIdAndCommunityId($memberId, $this->id); + + if ($communityMember) + { + $this->isCommunityMember = !$communityMember->getIsPre(); + $this->isCommunityPreMember = $communityMember->getIsPre(); + + $positions = Doctrine::getTable('CommunityMemberPosition')->getPositionsByMemberIdAndCommunityId($memberId, $this->id); + $this->isAdmin = in_array('admin', $positions); + $this->isSubAdmin = in_array('sub_admin', $positions); + $this->isEditCommunity = $this->isAdmin || $this->isSubAdmin; + } + else + { + $this->isCommunityMember = false; + $this->isCommunityPreMember = false; + $this->isAdmin = false; + $this->isSubAdmin = false; + $this->isEditCommunity = false; + } + + $this->community = Doctrine::getTable('Community')->find($this->id); + $this->communityAdmin = $this->community->getAdminMember(); + $this->communitySubAdmins = $this->community->getSubAdminMembers(); + } } diff --git a/apps/pc_frontend/modules/community/templates/_smtCommunityListBox.php b/apps/pc_frontend/modules/community/templates/_smtCommunityListBox.php new file mode 100644 index 000000000..0cd24f752 --- /dev/null +++ b/apps/pc_frontend/modules/community/templates/_smtCommunityListBox.php @@ -0,0 +1,74 @@ +
+
コミュニティ情報
+
+
+
+
+ getImageFileName(), array('size' => '320x320', 'format' => 'jpg')) ?> +
+ + +
+
+
+ + + + + + + + + + +getName(), '@member_profile?id='.$m->getId()); +} +?> + + + + + + +community_category_id): ?> + + + + + + + + + + + + + + + + + + + + + +
getCreatedAt(), 'D') ?>
getName(), '@member_profile?id='.$communityAdmin->getId()) ?>
\n", $subAdminCaption) ?>
$op_term['community']->titleize()), 'form_community') ?>:getCommunityCategory() ?>
$op_term['community']->titleize()), 'form_community') ?>:getRaw('community')->getRegisterPolicy()) ?>
countCommunityMembers(); ?>
$op_term['community']->titleize()), 'form_community') ?>getConfig('description'); ?>
+ + + + + $op_term['community']->titleize())), '@community_quit?id=' . $community->getId()) ?>
+ + + $op_term['community']->titleize())) ?> + + $op_term['community']->titleize())), '@community_join?id=' . $community->getId()) ?>
+ + + +
+
diff --git a/apps/pc_frontend/modules/community/templates/_smtCommunityMemberJoinListBox.php b/apps/pc_frontend/modules/community/templates/_smtCommunityMemberJoinListBox.php new file mode 100644 index 000000000..3ec922db0 --- /dev/null +++ b/apps/pc_frontend/modules/community/templates/_smtCommunityMemberJoinListBox.php @@ -0,0 +1,22 @@ + + + + +
+
+
$op_term['community'])) ?>
+
+
+
+
diff --git a/apps/pc_frontend/modules/community/templates/smtHomeSuccess.php b/apps/pc_frontend/modules/community/templates/smtHomeSuccess.php index 6b16cf9ed..bf4865b2d 100644 --- a/apps/pc_frontend/modules/community/templates/smtHomeSuccess.php +++ b/apps/pc_frontend/modules/community/templates/smtHomeSuccess.php @@ -1,76 +1,7 @@ -
-
コミュニティ情報
-
-
-
-
- getImageFileName(), array('size' => '320x320', 'format' => 'jpg')) ?> -
- - getId()) ?> - -
-
-
- - - - - - - - - - -getName(), '@member_profile?id='.$m->getId()); -} -?> - - - - - + + +isEnabled()): ?> +getComponentModule(), $gadget->getComponentAction(), array('gadget' => $gadget)); ?> -community_category_id): ?> - - - - + - - - - - - - - - - - - - - - - -
getCreatedAt(), 'D') ?>
getName(), '@member_profile?id='.$communityAdmin->getId()) ?>
\n", $subAdminCaption) ?>
$op_term['community']->titleize()), 'form_community') ?>:getCommunityCategory() ?>
$op_term['community']->titleize()), 'form_community') ?>:getRaw('community')->getRegisterPolicy()) ?>
countCommunityMembers(); ?>
$op_term['community']->titleize()), 'form_community') ?>getConfig('description'); ?>
- - $op_term['community']->titleize())), '@community_edit?id=' . $community->getId()) ?>
- - - - $op_term['community']->titleize())), '@community_quit?id=' . $community->getId()) ?>
- - - $op_term['community']->titleize())) ?> - - $op_term['community']->titleize())), '@community_join?id=' . $community->getId()) ?>
- - - -
-
diff --git a/apps/pc_frontend/modules/default/actions/components.class.php b/apps/pc_frontend/modules/default/actions/components.class.php index ad7904649..43d1f580c 100644 --- a/apps/pc_frontend/modules/default/actions/components.class.php +++ b/apps/pc_frontend/modules/default/actions/components.class.php @@ -89,6 +89,11 @@ public function executeLoginFormBox() $this->forms = $this->getUser()->getAuthForms(); } + public function executeSmtLoginFormBox() + { + $this->forms = $this->getUser()->getAuthForms(); + } + public function executeSideBanner() { } diff --git a/apps/pc_frontend/modules/default/templates/_smtLoginFormBox.php b/apps/pc_frontend/modules/default/templates/_smtLoginFormBox.php new file mode 100644 index 000000000..c029cb0bb --- /dev/null +++ b/apps/pc_frontend/modules/default/templates/_smtLoginFormBox.php @@ -0,0 +1,65 @@ + + +getAuthMode()))) ?> + + +hasGlobalErrors()): ?> +renderGlobalErrors(); ?> + + +
+
+x + +

+ +
+
+ + +
+ +isHidden()): ?> +getWidget()->getOption('type')): ?> +
+
+ renderLabel(); ?> +
+
+ hasError()): ?> + getError()); ?> + + render(); ?> + renderHelp(); ?> +
+ +
+
+ +
+ renderLabel(); ?> +
+
+ hasError()): ?> + getError()) ?> + + getWidget()->getOption('type'), array('text', 'password'))): ?> + render(array('class' => 'span12')); ?> + + render(); ?> + + renderHelp(); ?> +
+ + + +
+ +
+
+ +renderHiddenFields(); ?> + +
+ + diff --git a/apps/pc_frontend/modules/member/actions/actions.class.php b/apps/pc_frontend/modules/member/actions/actions.class.php index 22e37cfe6..793704f7d 100644 --- a/apps/pc_frontend/modules/member/actions/actions.class.php +++ b/apps/pc_frontend/modules/member/actions/actions.class.php @@ -56,6 +56,11 @@ public function executeHome($request) */ public function executeSmtHome(opWebRequest $request) { + $this->gadgetConfig = sfConfig::get('op_smartphone_gadget_list'); + + $gadgets = Doctrine::getTable('Gadget')->retrieveGadgetsByTypesName('smartphone'); + $this->contentsGadgets = $gadgets['smartphoneContents']; + return sfView::SUCCESS; } @@ -73,6 +78,9 @@ public function executeLogin($request) if ($request->isSmartphone()) { + $gadgets = Doctrine::getTable('Gadget')->retrieveGadgetsByTypesName('smartphoneLogin'); + $this->contentsGadgets = $gadgets['smartphoneLoginContents']; + $this->setLayout('smtLayoutSns'); $this->setTemplate('smtLogin'); } @@ -140,6 +148,9 @@ public function executeProfile($request) */ public function executeSmtProfile(opWebRequest $request) { + $gadgets = Doctrine::getTable('Gadget')->retrieveGadgetsByTypesName('smartphoneProfile'); + $this->contentsGadgets = $gadgets['smartphoneProfileContents']; + $result = parent::executeProfile($request); $this->getResponse()->setDisplayMember($this->member); diff --git a/apps/pc_frontend/modules/member/actions/components.class.php b/apps/pc_frontend/modules/member/actions/components.class.php index efb28a78c..4d83dc03f 100644 --- a/apps/pc_frontend/modules/member/actions/components.class.php +++ b/apps/pc_frontend/modules/member/actions/components.class.php @@ -21,4 +21,41 @@ public function executeProfileListBox($request) $this->member = $this->getUser()->getMember(); } } + + public function executeSmtProfileListBox($request) + { + if ($request->hasParameter('id')) + { + $this->member = Doctrine::getTable('Member')->find($request->getParameter('id')); + } + else + { + $this->member = $this->getUser()->getMember(); + } + } + + public function executeSmtMemberFriendListBox($request) + { + if ($request->hasParameter('id') && 'profile'!=sfContext::getInstance()->getActionName()) + { + $this->member = Doctrine::getTable('Member')->find($request->getParameter('id')); + } + else + { + $this->member = $this->getUser()->getMember(); + } + } + + public function executeSmtMemberJoinCommunityListBox($request) + { + if ($request->hasParameter('id') && 'profile'!=sfContext::getInstance()->getActionName()) + { + $this->member = Doctrine::getTable('Member')->find($request->getParameter('id')); + } + else + { + $this->member = $this->getUser()->getMember(); + } + } + } diff --git a/apps/pc_frontend/modules/member/templates/_smtMemberFriendListBox.php b/apps/pc_frontend/modules/member/templates/_smtMemberFriendListBox.php new file mode 100644 index 000000000..50cd01c19 --- /dev/null +++ b/apps/pc_frontend/modules/member/templates/_smtMemberFriendListBox.php @@ -0,0 +1,28 @@ + + + + +
+
+
$op_term['friend'])) ?>
+
+
+
+
+
+ +
+ diff --git a/apps/pc_frontend/modules/member/templates/_smtMemberJoinCommunityListBox.php b/apps/pc_frontend/modules/member/templates/_smtMemberJoinCommunityListBox.php new file mode 100644 index 000000000..a682de2d0 --- /dev/null +++ b/apps/pc_frontend/modules/member/templates/_smtMemberJoinCommunityListBox.php @@ -0,0 +1,27 @@ + + + + +
+
+
$op_term['community'])) ?>
+
+
+
+
+
+ +
diff --git a/apps/pc_frontend/modules/member/templates/_smtProfileListBox.php b/apps/pc_frontend/modules/member/templates/_smtProfileListBox.php new file mode 100644 index 000000000..514374417 --- /dev/null +++ b/apps/pc_frontend/modules/member/templates/_smtProfileListBox.php @@ -0,0 +1,53 @@ + +getProfiles(true) as $profile) +{ + $caption = $profile->getProfile()->getCaption(); + if ($profile->getProfile()->isPreset()) + { + $presetConfig = $profile->getProfile()->getPresetConfig(); + $caption = __($presetConfig['Caption']); + } + + $profileValue = (string)$profile; + if ('' === $profileValue) + { + continue; + } + + if ($profile->getFormType() === 'textarea') + { + $profileValue = op_auto_link_text(nl2br($profileValue)); + } + + if ($profile->getProfile()->isPreset()) + { + if ($profile->getFormType() === 'country_select') + { + $profileValue = $culture->getCountry($profileValue); + } + elseif ('op_preset_birthday' === $profile->getName()) + { + $profileValue = op_format_date($profileValue, 'XShortDateJa'); + } + + $profileValue = __($profileValue); + } + + $list[$caption] = $profileValue; +} +?> +
+
+
+
+ + + + $v): ?> + + + +
getName(); ?>
+
diff --git a/apps/pc_frontend/modules/member/templates/smtHomeSuccess.php b/apps/pc_frontend/modules/member/templates/smtHomeSuccess.php index 7e4950718..bf4865b2d 100644 --- a/apps/pc_frontend/modules/member/templates/smtHomeSuccess.php +++ b/apps/pc_frontend/modules/member/templates/smtHomeSuccess.php @@ -1,87 +1,7 @@ - - - - -getRelativeUrlRoot() ? $sf_request->getRelativeUrlRoot() : '/').'"; - var expires = new Date(); - expires.setTime((new Date()).getTime() + (10 * 12 * 30 * 24 * 60 * 60 * 1000)); - var pos = obj.parentNode.id; - - opCookie.set("HomeGadget_" + pos + "_sort", result, expires, path); -} - -function foldObj(obj, display) -{ - Element.childElements(obj.parentNode).each(function(child, index){ - if (!child.hasClassName("partsHeading")) { - if (display == null) { - child.toggle(); - } else { - if (display == "true") { - child.show(); - } else { - child.hide(); - } - } - - var size = Element.childElements(obj.parentNode).length; - if (size == index + 1) { // It is a last loop maybe - var path = "'.($sf_request->getRelativeUrlRoot() ? $sf_request->getRelativeUrlRoot() : '/').'"; - var id = child.parentNode.parentNode.id; - var expires = new Date(); - expires.setTime((new Date()).getTime() + (10 * 12 * 30 * 24 * 60 * 60 * 1000)); - opCookie.set("HomeGadget_" + id + "_toggle", child.visible(), expires, path); - } - } - }); -} - -$$(".partsHeading").each(function(obj){ - // folding - Event.observe(obj, "dblclick", function(e){ - foldObj(obj); - }); - var id = obj.parentNode.parentNode.id; - var display = opCookie.get("HomeGadget_"+id+"_toggle"); - if (display != null) { - foldObj(obj, display); - } - -}); - -["Top", "Left", "Center"].each(function(type){ - var sortInfo = opCookie.get("HomeGadget_" + type + "_sort"); - if (sortInfo) - { - var obj = document.getElementById(type); - var preGadget = null; - sortInfo.split(",").each(function(value){ - var gadget = document.getElementById(value); - if (preGadget) - { - Element.remove(gadget); - Insertion.After(preGadget, gadget); - } - else - { - Element.remove(gadget); - Insertion.Top(obj, gadget); - } - preGadget = gadget; - }); - } -}); - -') ?> + + +isEnabled()): ?> +getComponentModule(), $gadget->getComponentAction(), array('gadget' => $gadget)); ?> + + + diff --git a/apps/pc_frontend/modules/member/templates/smtLoginSuccess.php b/apps/pc_frontend/modules/member/templates/smtLoginSuccess.php index c4a821cbe..bf4865b2d 100644 --- a/apps/pc_frontend/modules/member/templates/smtLoginSuccess.php +++ b/apps/pc_frontend/modules/member/templates/smtLoginSuccess.php @@ -1,30 +1,7 @@ -
- -
-
メールアドレス
-
- -
- -
- -
-
パスワード
-
- -
- -
- -
-
次回から自動的にログイン
-
-
-
- -
-
-
- -
- + + +isEnabled()): ?> +getComponentModule(), $gadget->getComponentAction(), array('gadget' => $gadget)); ?> + + + diff --git a/apps/pc_frontend/modules/member/templates/smtProfileSuccess.php b/apps/pc_frontend/modules/member/templates/smtProfileSuccess.php index e2f61693d..92a0e4b5a 100644 --- a/apps/pc_frontend/modules/member/templates/smtProfileSuccess.php +++ b/apps/pc_frontend/modules/member/templates/smtProfileSuccess.php @@ -1,26 +1,8 @@ - - - - - isSelf()): ?>

-


-getId(), true) ?>

-

link_to(__('Edit profile'), '@member_editProfile'))) ?>

+

$content)) ?> @@ -37,74 +19,10 @@ -getProfiles(true) as $profile) -{ - $caption = $profile->getProfile()->getCaption(); - if ($profile->getProfile()->isPreset()) - { - $presetConfig = $profile->getProfile()->getPresetConfig(); - $caption = __($presetConfig['Caption']); - } - - $profileValue = (string)$profile; - if ('' === $profileValue) - { - continue; - } - - if ($profile->getFormType() === 'textarea') - { - $profileValue = op_auto_link_text(nl2br($profileValue)); - } - - if ($profile->getProfile()->isPreset()) - { - if ($profile->getFormType() === 'country_select') - { - $profileValue = $culture->getCountry($profileValue); - } - elseif ('op_preset_birthday' === $profile->getName()) - { - $profileValue = op_format_date($profileValue, 'XShortDateJa'); - } - - $profileValue = __($profileValue); - } - - $list[$caption] = $profileValue; -} -?> -
-
-
-
- - - - $v): ?> - + + +isEnabled()): ?> +getComponentModule(), $gadget->getComponentAction(), array('gadget' => $gadget)); ?> + - -
getName(); ?>
-
- -
-
-
-
-
-
-
- getImageFileName(), array('size' => '320x320')) ?> -
-
-
-
-
$op_term['friend'])) ?>
-
-
-
-
- + diff --git a/data/fixtures/005_import_gadgets.yml b/data/fixtures/005_import_gadgets.yml index 556c943d2..f3c1ed9f0 100644 --- a/data/fixtures/005_import_gadgets.yml +++ b/data/fixtures/005_import_gadgets.yml @@ -98,3 +98,35 @@ Gadget: type: "mobileProfileBottom" name: "communityJoinListBox" sort_order: 20 + + smartphone_profile_gadget_profile: + type: "smartphoneProfileContents" + name: "profileListBox" + sort_order: 10 + + smartphone_profile_member_list: + type: "smartphoneProfileContents" + name: "memberFriendListBox" + sort_order: 100 + + smartphone_profile_join_community_list: + type: "smartphoneProfileContents" + name: "memberJoinCommunityListBox" + sort_order: 110 + + smartphone_community_gadget_community: + type: "smartphoneCommunityContents" + name: "communityListBox" + sort_order: 10 + + smartphone_community_gadget_join_member_list: + type: "smartphoneCommunityContents" + name: "communityMemberJoinListBox" + sort_order: 100 + + smartphone_login_gadget_login_form_box: + type: "smartphoneLoginContents" + name: "loginForm" + sort_order: 10 + + diff --git a/lib/config/config/gadget_config.yml b/lib/config/config/gadget_config.yml index f4a75ebb3..d6608c315 100644 --- a/lib/config/config/gadget_config.yml +++ b/lib/config/config/gadget_config.yml @@ -55,6 +55,30 @@ mobileFooter: default: layoutD plot_action: [design, mobileFooterGadgetPlot] +smartphone: + name: "スマートフォン版ホーム画面" + layout: + default: layoutD + plot_action: [design, smartphoneHomeGadgetPlot] + +smartphoneProfile: + name: "スマートフォン版プロフィール画面" + layout: + default: layoutD + plot_action: [design, smartphoneProfileGadgetPlot] + +smartphoneCommunity: + name: "スマートフォン版コミュニティ画面" + layout: + default: layoutD + plot_action: [design, smartphoneCommunityGadgetPlot] + +smartphoneLogin: + name: "スマートフォン版ログイン画面" + layout: + default: layoutD + plot_action: [design, smartphoneLoginGadgetPlot] + dailyNews: name: "デイリーニュース(PCメールアドレス向け)" layout: diff --git a/lib/config/config/smartphone_community_gadget.yml b/lib/config/config/smartphone_community_gadget.yml new file mode 100644 index 000000000..44b802679 --- /dev/null +++ b/lib/config/config/smartphone_community_gadget.yml @@ -0,0 +1,36 @@ +freeArea: + caption: + ja_JP: "フリーエリア" + description: + ja_JP: "フリーエリアを設置できます" + component: [default, freeAreaBox] + viewable_privilege: 4 + config: + title: + Name: "title" + Caption: "タイトル" + FormType: "input" + ValueType: "text" + IsRequired: false + value: + Name: "value" + Caption: "内容" + FormType: "rich_textarea" + ValueType: "text" + IsRequired: false + +communityListBox: + caption: + ja_JP: "コミュニティ" + description: + ja_JP: "コミュニティ情報のリストを表示します" + viewable_privilege: 4 + component: [community, smtCommunityListBox] + +communityMemberJoinListBox: + caption: + ja_JP: "コミュニティ参加者一覧" + description: + ja_JP: "コミュニティの参加者一覧を表示します" + component: [community, smtCommunityMemberJoinListBox] + diff --git a/lib/config/config/smartphone_gadget.yml b/lib/config/config/smartphone_gadget.yml new file mode 100644 index 000000000..8b3493eac --- /dev/null +++ b/lib/config/config/smartphone_gadget.yml @@ -0,0 +1,20 @@ +freeArea: + caption: + ja_JP: "フリーエリア" + description: + ja_JP: "フリーエリアを設置できます" + component: [default, freeAreaBox] + config: + title: + Name: "title" + Caption: "タイトル" + FormType: "input" + ValueType: "text" + IsRequired: false + value: + Name: "value" + Caption: "内容" + FormType: "rich_textarea" + ValueType: "text" + IsRequired: false + diff --git a/lib/config/config/smartphone_login_gadget.yml b/lib/config/config/smartphone_login_gadget.yml new file mode 100644 index 000000000..6bf926c22 --- /dev/null +++ b/lib/config/config/smartphone_login_gadget.yml @@ -0,0 +1,28 @@ +loginForm: + caption: + ja_JP: "ログインフォーム" + description: + ja_JP: "ログイン用のフォームを設置できます。利用可能なすべての認証モード用のログインフォームがすべて含まれています。" + viewable_privilege: 4 + component: [default, smtLoginFormBox] + +freeArea: + caption: + ja_JP: "フリーエリア" + description: + ja_JP: "フリーエリアを設置できます" + viewable_privilege: 4 + component: [default, freeAreaBox] + config: + title: + Name: "title" + Caption: "タイトル" + FormType: "input" + ValueType: "text" + IsRequired: false + value: + Name: "value" + Caption: "内容" + FormType: "rich_textarea" + ValueType: "text" + IsRequired: false diff --git a/lib/config/config/smartphone_profile_gadget.yml b/lib/config/config/smartphone_profile_gadget.yml new file mode 100644 index 000000000..6469b2606 --- /dev/null +++ b/lib/config/config/smartphone_profile_gadget.yml @@ -0,0 +1,43 @@ +freeArea: + caption: + ja_JP: "フリーエリア" + description: + ja_JP: "フリーエリアを設置できます" + component: [default, freeAreaBox] + viewable_privilege: 4 + config: + title: + Name: "title" + Caption: "タイトル" + FormType: "input" + ValueType: "text" + IsRequired: false + value: + Name: "value" + Caption: "内容" + FormType: "rich_textarea" + ValueType: "text" + IsRequired: false + +profileListBox: + caption: + ja_JP: "プロフィール" + description: + ja_JP: "プロフィール情報のリストを表示します" + viewable_privilege: 4 + component: [member, smtProfileListBox] + +memberFriendListBox: + caption: + ja_JP: "メンバーフレンド一覧" + description: + ja_JP: "メンバーのフレンド一覧を表示します" + component: [member, smtMemberFriendListBox] + +memberJoinCommunityListBox: + caption: + ja_JP: "メンバーコミュニティ参加者一覧" + description: + ja_JP: "メンバーが参加しているコミュニティの一覧を表示します" + component: [member, smtMemberJoinCommunityListBox] + diff --git a/web/css/gadgetPlot.css b/web/css/gadgetPlot.css index a9ade1acc..9632b45b2 100644 --- a/web/css/gadgetPlot.css +++ b/web/css/gadgetPlot.css @@ -99,6 +99,10 @@ body #plotMobileProfileBottom div, #plotMobileHeaderContents div, #plotMobileFooterContents div, +#plotSmartphoneContents div, +#plotSmartphoneProfileContents div, +#plotSmartphoneCommunityContents div, +#plotSmartphoneLoginContents div, #plotDailyNewsContents div, #plotMobileDailyNewsContents div { @@ -132,6 +136,10 @@ body #plotMobileLoginContents div.emptyGadget, #plotMobileHeaderContents div.emptyGadget, #plotMobileFooterContents div.emptyGadget, +#plotSmartphoneContents div.emptyGadget, +#plotSmartphoneProfileContents div.emptyGadget, +#plotSmartphoneCommunityContents div.emptyGadget, +#plotSmartphoneLoginContents div.emptyGadget, #plotDailyNewsContents div.emptyGadget, #plotMobileDailyNewsContents div.emptyGadget { diff --git a/web/css/smt_main.css b/web/css/smt_main.css index 5b2289b0e..a1c48b79b 100644 --- a/web/css/smt_main.css +++ b/web/css/smt_main.css @@ -123,6 +123,19 @@ hr.toumei { word-break: break-all; } +.partsHeading h3 { + height: 20px; + background: #333; + color: #fff; + text-align: center; + + width: 320px; + + line-height: normal; + font-weight: normal; + font-size: inherit; +} + /*---------------------------------------------- * Override bootstrap.css rules *--------------------------------------------*/ diff --git a/web/images/ajax-loader.gif b/web/images/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..5b33f7e54f4e55b6b8774d86d96895db9af044b4 GIT binary patch literal 1849 zcma*odr(tX9tZI2z31lM+(&YVk%mZ}5P~KlG2s=WSbGzm0!x7^P##Mnh7t-jP!X0Q zk_SQ}Po-L1tlDK;6l?(>v)e5ZBQx4|Y-Q?nr@Px3?9h(3ZWr3^tj=`TP57gKr87N$ zp2wWee1GRRCwo_xahnw)5cxNPJbCg2L6DV|6`#+yw6v6!mDS$f9-JvFD^n;GQ&UrZ zzh5jCkByB101O60U0q#p_1BM>Cv-vP?&s4@g_((4_1L=L$(a91)0=J91Gas#R{McE znYG^9*0A5YZ>#;~+Wkn(W5B0^yELIYLP!K}mB~<)AM@1&nqekynuaEGqPrzoH|KodRXJy)%+w_fu3nE5>@Bd_b zqC$EQ;{c`T&?EsNO|igL9gC7Ygxv?aQUEXMq?~>wg{EyW;VcJ37CUF#HjrT=KQO_* zS>M9yydXk18D(+QDJ1>r);Lav_uYKp$T?4vr{Q$lTo&pKv^?(>L-)G2*lwH!Ah7k? z7oH<8h-(KTKt5V6$8gF)C7Io&P5=SjTh)=zV=E2EUhQZP##L8S{d%UK>>+y82>+FV+#^BzW7u3F)Bb>=lYQ%%j`F>ASe zo*cw@V#u6T`A2He;70mR(V&iV&-7{qP~=SRf&jm9-T{*ZeZ}$rd0#6c&fLG^xJcf5 z+p<`wJYgW+_s*V{uI$nMB;%8`S_3>PfGOj3Rq}@Cx^+j?rk92fANSFDBYnOqQ>Vdj z)(|$AhP4t&Lb=Gvo2#3Gl%9<=Gv`Mz?Po@P4iLF!x}GUWJICDlFk-hS^Whyh7x~VH z@0vD1>HYD4&e+~yzS*-sFR{9`{QEEZO1zg7>R&7cHts-6j!xHVdA8eI+ZlVzd%`es zJT@$#GX(gvCJ1oJN%yLBK}{V=V;seo;!w|Yte!W1%5qLNFWqvZW>h&IiH+oPT=b@E zPhGzv5=(Un*X>v`>%8h_nj^NdYcE6NHS_ifkCV$*D)Tqrbu`s;<=t<4 zAHNqNV?6(g<1PY-w@#I-WYFViz?9TrkMr)u0g`O`u|>T;k|2sV*YF^punvT;$SuTy{j3Gv)yqD!R_CF>yR)MzmmYS5v+~R zXAdD%ng9?df;wd8GxR#%3O+gz};Vo;)sK%Bj-q>Oq%R7JU-KD?vYu>#2UjaDo z&8$>5xW~?KPD_#XFToU1hIb*VOMidUr6iYiO0N|i-7s`T8!cFT`rN!^1Pt78J93i6 z5HI1wIM$94m{3SLDvISDe6$ZG1;eq_D9RTaaC>=cO{@Bs>$IlPCPJJ$h$)-3vzNUQ6OsN#_zWxey!_9%hxwH2_dEJi=yY|1c7nDm2_Lm!Cof8-R_+9UkS zcBE(o47yE)oMR(Q=dp1a2wTX5KvvGyLqlWTa7V&!A*|w|)ax~1_~aJ0=_Lilg*0iQk7#ZD EAHN$8j{pDw literal 0 HcmV?d00001 From c9a7318e8b96fb9ec45327f2ee149dae94d295c1 Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Thu, 12 Jan 2012 15:36:53 +0900 Subject: [PATCH 035/630] add global navigation for smartphone (refs #2227) --- apps/pc_backend/i18n/messages.ja.xml | 4 + .../modules/navigation/templates/_submenu.php | 1 + .../default/actions/components.class.php | 7 ++ .../modules/default/templates/_smtMenu.php | 24 +++++ apps/pc_frontend/templates/_tosaka.php | 19 +++- apps/pc_frontend/templates/smtLayoutGroup.php | 19 ++++ apps/pc_frontend/templates/smtLayoutHome.php | 19 ++++ .../pc_frontend/templates/smtLayoutMember.php | 19 ++++ apps/pc_frontend/templates/smtLayoutSns.php | 18 ++++ .../012_import_smartphone_navi_menu.yml | 60 ++++++++++++ lib/model/doctrine/NavigationTable.class.php | 5 + web/css/smt_main.css | 88 +++++++++++++----- web/images/SEPALATOR.png | Bin 0 -> 42684 bytes web/images/UPARROW.png | Bin 0 -> 42449 bytes web/js/smt_menu.js | 5 + web/js/smt_tosaka.js | 15 +++ 16 files changed, 281 insertions(+), 22 deletions(-) create mode 100644 apps/pc_frontend/modules/default/templates/_smtMenu.php create mode 100644 data/fixtures/012_import_smartphone_navi_menu.yml create mode 100644 web/images/SEPALATOR.png create mode 100644 web/images/UPARROW.png create mode 100644 web/js/smt_menu.js create mode 100644 web/js/smt_tosaka.js diff --git a/apps/pc_backend/i18n/messages.ja.xml b/apps/pc_backend/i18n/messages.ja.xml index f36bb24df..e2bbc1532 100644 --- a/apps/pc_backend/i18n/messages.ja.xml +++ b/apps/pc_backend/i18n/messages.ja.xml @@ -1197,6 +1197,10 @@ PC frontend ナビ設定 + + PC frontend (Smartphone) + スマートフォン版ナビ設定 + Mobile frontend 携帯版ナビ設定 diff --git a/apps/pc_backend/modules/navigation/templates/_submenu.php b/apps/pc_backend/modules/navigation/templates/_submenu.php index 4df980c37..8ce00688f 100644 --- a/apps/pc_backend/modules/navigation/templates/_submenu.php +++ b/apps/pc_backend/modules/navigation/templates/_submenu.php @@ -1,3 +1,4 @@
  • +
  • diff --git a/apps/pc_frontend/modules/default/actions/components.class.php b/apps/pc_frontend/modules/default/actions/components.class.php index 43d1f580c..e7586f38b 100644 --- a/apps/pc_frontend/modules/default/actions/components.class.php +++ b/apps/pc_frontend/modules/default/actions/components.class.php @@ -39,6 +39,13 @@ public function executeLocalNav() } } + public function executeSmtMenu() + { + $type = opToolkit::isSecurePage() ? 'smartphone_default' : 'smartphone_insecure'; + + $this->navs = Doctrine::getTable('Navigation')->retrieveByType($type); + } + public function executeSideBannerGadgets() { $gadgets = Doctrine::getTable('Gadget')->retrieveGadgetsByTypesName('sideBanner'); diff --git a/apps/pc_frontend/modules/default/templates/_smtMenu.php b/apps/pc_frontend/modules/default/templates/_smtMenu.php new file mode 100644 index 000000000..d18134429 --- /dev/null +++ b/apps/pc_frontend/modules/default/templates/_smtMenu.php @@ -0,0 +1,24 @@ + + + diff --git a/apps/pc_frontend/templates/_tosaka.php b/apps/pc_frontend/templates/_tosaka.php index 24b5580e0..8d6e89efa 100644 --- a/apps/pc_frontend/templates/_tosaka.php +++ b/apps/pc_frontend/templates/_tosaka.php @@ -1,8 +1,25 @@ + +
    +
    +
    + 通知センター +
    +
    + 'toggle1_close')) ?> +
    +
    +
    +
    +
    + + + +
    -
    '32', 'class' => 'menubutton')), '@homepage') ?>
    +
    '32', 'class' => 'menubutton')); ?>
    '32', 'class' => 'ncbutton')) ?>
    '32', 'class' =>'postbutton')) ?>
    diff --git a/apps/pc_frontend/templates/smtLayoutGroup.php b/apps/pc_frontend/templates/smtLayoutGroup.php index cc682f973..b346c1d78 100644 --- a/apps/pc_frontend/templates/smtLayoutGroup.php +++ b/apps/pc_frontend/templates/smtLayoutGroup.php @@ -26,6 +26,8 @@ ?> + + @@ -42,6 +44,23 @@
    '48')), '@homepage') ?>
    + +hasFlash('error')): ?> +
    +
    + getFlash('error')); ?> +
    +
    + + +hasFlash('notice')): ?> +
    +
    + getFlash('notice')); ?> +
    +
    + + diff --git a/apps/pc_frontend/templates/smtLayoutHome.php b/apps/pc_frontend/templates/smtLayoutHome.php index 02650c1dc..066af0934 100644 --- a/apps/pc_frontend/templates/smtLayoutHome.php +++ b/apps/pc_frontend/templates/smtLayoutHome.php @@ -26,6 +26,8 @@ ?> + + @@ -45,6 +47,23 @@
    '48')), '@homepage') ?>
    + +hasFlash('error')): ?> +
    +
    + getFlash('error')); ?> +
    +
    + + +hasFlash('notice')): ?> +
    +
    + getFlash('notice')); ?> +
    +
    + + diff --git a/apps/pc_frontend/templates/smtLayoutMember.php b/apps/pc_frontend/templates/smtLayoutMember.php index 358fd5d05..dd990059b 100644 --- a/apps/pc_frontend/templates/smtLayoutMember.php +++ b/apps/pc_frontend/templates/smtLayoutMember.php @@ -26,6 +26,8 @@ ?> + + @@ -48,6 +50,23 @@
    '48')), '@homepage') ?>
    + +hasFlash('error')): ?> +
    +
    + getFlash('error')); ?> +
    +
    + + +hasFlash('notice')): ?> +
    +
    + getFlash('notice')); ?> +
    +
    + + diff --git a/apps/pc_frontend/templates/smtLayoutSns.php b/apps/pc_frontend/templates/smtLayoutSns.php index f621959b8..6c3a35b3f 100644 --- a/apps/pc_frontend/templates/smtLayoutSns.php +++ b/apps/pc_frontend/templates/smtLayoutSns.php @@ -26,6 +26,8 @@ ?> + + @@ -50,6 +52,22 @@ +hasFlash('error')): ?> +
    +
    + getFlash('error')); ?> +
    +
    + + +hasFlash('notice')): ?> +
    +
    + getFlash('notice')); ?> +
    +
    + + diff --git a/data/fixtures/012_import_smartphone_navi_menu.yml b/data/fixtures/012_import_smartphone_navi_menu.yml new file mode 100644 index 000000000..79663fa87 --- /dev/null +++ b/data/fixtures/012_import_smartphone_navi_menu.yml @@ -0,0 +1,60 @@ +Navigation: + smartphone_default_navigation_home: + type: "smartphone_default" + uri: "@homepage" + sort_order: 0 + Translation: + ja_JP: + caption: "マイホーム" + en: + caption: "My Home" + + smartphone_default_navigation_profile_confirm: + type: "smartphone_default" + uri: "@member_profile_mine" + sort_order: 10 + Translation: + ja_JP: + caption: "プロフィール確認" + en: + caption: "Profile" + + smartphone_default_navigation_profile_edit: + type: "smartphone_default" + uri: "@member_editProfile" + sort_order: 20 + Translation: + ja_JP: + caption: "プロフィール編集" + en: + caption: "Edit Profile" + + smartphone_default_navigation_community_all: + type: "smartphone_default" + uri: "@community_home?id=1" + sort_order: 30 + Translation: + ja_JP: + caption: "allコミュニティ" + en: + caption: "all Community" + + smartphone_default_navigation_config: + type: "smartphone_default" + uri: "@member_config" + sort_order: 40 + Translation: + ja_JP: + caption: "設定変更" + en: + caption: "Settings" + + smartphone_default_navigation_logout: + type: "smartphone_default" + uri: "@member_logout" + sort_order: 50 + Translation: + ja_JP: + caption: "ログアウト" + en: + caption: "Logout" diff --git a/lib/model/doctrine/NavigationTable.class.php b/lib/model/doctrine/NavigationTable.class.php index 5dbbb1e8c..1c376bdb5 100644 --- a/lib/model/doctrine/NavigationTable.class.php +++ b/lib/model/doctrine/NavigationTable.class.php @@ -32,6 +32,11 @@ public function getTypesByAppName($appName) 'mobile_friend', 'mobile_community', ); + case 'smartphone' : + return array( + 'smartphone_insecure', + 'smartphone_default', + ); case 'backend' : return array( 'backend_side' diff --git a/web/css/smt_main.css b/web/css/smt_main.css index a1c48b79b..426ccff39 100644 --- a/web/css/smt_main.css +++ b/web/css/smt_main.css @@ -1,10 +1,10 @@ -#face .row { - padding: 0 0 0 6px; +#slot_face .row { + padding: 0 0 0 4px; } -#face a { +#slot_face a { font-size: 14px; } -#face { +#slot_face > .row { height: 52px; background: #eee; padding: 4px 0 0 0; @@ -14,12 +14,28 @@ margin: 4px 0; } -#tosaka { - height: 44px; +.ncform, .menuform { background: #555; - padding-top: 8px; } -#tosaka div { +.white{ + color:#fff; +} + +.ncform, .menuform { + padding-top: 4px; + padding-bottom: 8px; + border-bottom: 6px solid #909090; +} + +.tosaka_margin, .right_margin, .left_margin, .center_margin { + background: #555; +} + +#slot_tosaka .span12 { + height: 34px; + background: #555; +} +#slot_tosaka div { height: 100%; } @@ -36,11 +52,10 @@ } .gadget_header { + height: 20px; background: #333; color: #fff; text-align: center; - padding: 9px 0; - font-size: 16px; } body { @@ -52,6 +67,23 @@ hr.toumei { height: 4px; border-color: transparent; } +hr.toumei2 { + margin: 0; + height: 2px; + border-color: transparent; +} +hr.toumei100 { + margin: 0; + height: 100px; + border-color: transparent; +} +hr.white2 { + margin: 0; + height: 2px; + border-bottom: 0; + background: #fff; + opacity: 0.5; +} .menu-margin { background: #555; @@ -66,6 +98,9 @@ hr.toumei { border-radius: 10px 10px 0 0; } .menu-middle { + margin-top: 4px; +} +.menu-middle > div { color: #fff; background: #555; } @@ -96,20 +131,21 @@ hr.toumei { border-radius: 10px; } +.font11 { + font-size: 11px; + line-height: 13px; +} .font10 { font-size: 10px; -} -.font12 { - font-size: 12px; + line-height: 12px; } .font14 { font-size: 14px; + line-height: 16px; } -.font16 { - font-size: 16px; -} -.font18 { - font-size: 18px; +.font20 { + font-size: 20px; + line-height: 24px; } .row_memberimg { @@ -117,6 +153,7 @@ hr.toumei { } .row_membername { height: 30px; + line-height: 12px; } * { @@ -130,10 +167,19 @@ hr.toumei { text-align: center; width: 320px; +} + +.row_profile * { + text-align: left; +} + +.timeline * { + text-align: left; +} - line-height: normal; - font-weight: normal; - font-size: inherit; +.comment * { + background: #ddd; + text-align: left; } /*---------------------------------------------- diff --git a/web/images/SEPALATOR.png b/web/images/SEPALATOR.png new file mode 100644 index 0000000000000000000000000000000000000000..7eb04a8f70b60fe9ee077cde9fbdd3224a35b461 GIT binary patch literal 42684 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 literal 0 HcmV?d00001 diff --git a/web/images/UPARROW.png b/web/images/UPARROW.png new file mode 100644 index 0000000000000000000000000000000000000000..5f6d768c29fda75806557553fa6d0a66bbc0fa77 GIT binary patch literal 42449 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

    uXm&RI{l@k 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 U==VdvhMrtBx^gb}jN^m<1Lw?z>% literal 0 HcmV?d00001 diff --git a/web/js/smt_menu.js b/web/js/smt_menu.js new file mode 100644 index 000000000..1ae487410 --- /dev/null +++ b/web/js/smt_menu.js @@ -0,0 +1,5 @@ +$(document).ready(function(){ + $("#menubutton").click(function(){ + $(".menuform.template").toggle(); + }); +}); diff --git a/web/js/smt_tosaka.js b/web/js/smt_tosaka.js new file mode 100644 index 000000000..5cf24cf51 --- /dev/null +++ b/web/js/smt_tosaka.js @@ -0,0 +1,15 @@ +$(document).ready(function(){ + $(".ncbutton").click(function(){ + $(".toggle1:not(.ncform)").hide(); + $(".ncform").toggle(); + }); + + $(".menubutton").click(function(){ + $(".toggle1:not(.menuform)").hide(); + $(".menuform").toggle(); + }); + + $(".toggle1_close").click(function(){ + $(".toggle1").hide(); + }); +}); From a998d6bea5cf9e23fdbd14110e3c839be46b4208 Mon Sep 17 00:00:00 2001 From: Kimura Youichi Date: Thu, 16 Feb 2012 19:36:40 +0900 Subject: [PATCH 036/630] add postform into tosaka (refs #2227) --- apps/pc_frontend/templates/_tosaka.php | 19 +++++++++++++++++++ web/css/smt_main.css | 20 +++++++++++++++++++- web/js/smt_tosaka.js | 25 +++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 1 deletion(-) diff --git a/apps/pc_frontend/templates/_tosaka.php b/apps/pc_frontend/templates/_tosaka.php index 8d6e89efa..dce4f2683 100644 --- a/apps/pc_frontend/templates/_tosaka.php +++ b/apps/pc_frontend/templates/_tosaka.php @@ -15,6 +15,25 @@ + +
    +
    +
    + 投稿フォーム +
    +
    + 'toggle1_close')) ?> +
    +
    +
    + +
    +
    + +
    +
    + +
    diff --git a/web/css/smt_main.css b/web/css/smt_main.css index 426ccff39..378cd46b0 100644 --- a/web/css/smt_main.css +++ b/web/css/smt_main.css @@ -14,7 +14,7 @@ margin: 4px 0; } -.ncform, .menuform { +.postform, .ncform, .menuform { background: #555; } .white{ @@ -27,6 +27,24 @@ border-bottom: 6px solid #909090; } +.postface { + height: 52px; + background: #eee; + padding: 4px 0 0 0; +} + +.postform { + padding-top: 4px; + padding-bottom: 52px; + border-bottom: 6px solid #909090; +} +.postform .posttextarea { + margin: 4px 0; +} +.postform .posttextarea textarea { + margin: 0; +} + .tosaka_margin, .right_margin, .left_margin, .center_margin { background: #555; } diff --git a/web/js/smt_tosaka.js b/web/js/smt_tosaka.js index 5cf24cf51..ef5709556 100644 --- a/web/js/smt_tosaka.js +++ b/web/js/smt_tosaka.js @@ -9,7 +9,32 @@ $(document).ready(function(){ $(".menuform").toggle(); }); + $(".postbutton").click(function(){ + $(".toggle1:not(.postform)").hide(); + $(".postform").toggle(); + if($(".postform").is(":visible")){ + $(".posttextarea").focus(); + } + }); + $(".toggle1_close").click(function(){ $(".toggle1").hide(); }); + + $('#tosaka_postform_submit').click(function() { + var body_elem = $('#tosaka_postform_body'); + var body_text = body_elem.val(); + if (body_text == '') return; + + var params = { + apiKey: openpne.apiKey, + body: body_text + }; + + $.getJSON(openpne.apiBase + 'activity/post.json', params, function(json) { + if (json.status == 'success') { + body_elem.val(''); + } + }); + }); }); From 0cc0b7f6779535af5c15731dc55d3e22ddd82e2a Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Thu, 9 Feb 2012 19:41:08 +0900 Subject: [PATCH 037/630] introduce notification center (refs #2227) --- apps/pc_frontend/templates/_tosaka.php | 43 +++++++++- apps/pc_frontend/templates/smtLayoutGroup.php | 1 + apps/pc_frontend/templates/smtLayoutHome.php | 1 + .../pc_frontend/templates/smtLayoutMember.php | 1 + apps/pc_frontend/templates/smtLayoutSns.php | 1 + .../doctrine/MemberRelationship.class.php | 9 ++ web/css/smt_main.css | 48 +++++++++++ web/js/smt_notify.js | 86 +++++++++++++++++++ web/js/smt_tosaka.js | 25 ++++++ 9 files changed, 213 insertions(+), 2 deletions(-) create mode 100644 web/js/smt_notify.js diff --git a/apps/pc_frontend/templates/_tosaka.php b/apps/pc_frontend/templates/_tosaka.php index dce4f2683..0c700c478 100644 --- a/apps/pc_frontend/templates/_tosaka.php +++ b/apps/pc_frontend/templates/_tosaka.php @@ -8,11 +8,49 @@ 'toggle1_close')) ?>
    -
    +
    +
    + + + + @@ -39,7 +77,8 @@
    '32', 'class' => 'menubutton')); ?>
    -
    '32', 'class' => 'ncbutton')) ?>
    +
    '32', 'class' => 'ncbutton')) ?> +
    '32', 'class' =>'postbutton')) ?>
    diff --git a/apps/pc_frontend/templates/smtLayoutGroup.php b/apps/pc_frontend/templates/smtLayoutGroup.php index b346c1d78..fd955329d 100644 --- a/apps/pc_frontend/templates/smtLayoutGroup.php +++ b/apps/pc_frontend/templates/smtLayoutGroup.php @@ -26,6 +26,7 @@ ?> + diff --git a/apps/pc_frontend/templates/smtLayoutHome.php b/apps/pc_frontend/templates/smtLayoutHome.php index 066af0934..e9574e5f1 100644 --- a/apps/pc_frontend/templates/smtLayoutHome.php +++ b/apps/pc_frontend/templates/smtLayoutHome.php @@ -26,6 +26,7 @@ ?> + diff --git a/apps/pc_frontend/templates/smtLayoutMember.php b/apps/pc_frontend/templates/smtLayoutMember.php index dd990059b..c6add4a2c 100644 --- a/apps/pc_frontend/templates/smtLayoutMember.php +++ b/apps/pc_frontend/templates/smtLayoutMember.php @@ -26,6 +26,7 @@ ?> + diff --git a/apps/pc_frontend/templates/smtLayoutSns.php b/apps/pc_frontend/templates/smtLayoutSns.php index 6c3a35b3f..0e36b1c35 100644 --- a/apps/pc_frontend/templates/smtLayoutSns.php +++ b/apps/pc_frontend/templates/smtLayoutSns.php @@ -26,6 +26,7 @@ ?> + diff --git a/lib/model/doctrine/MemberRelationship.class.php b/lib/model/doctrine/MemberRelationship.class.php index 6ffc07d01..1100f2793 100644 --- a/lib/model/doctrine/MemberRelationship.class.php +++ b/lib/model/doctrine/MemberRelationship.class.php @@ -20,6 +20,15 @@ public function preSave($event) } } + public function postSave($event) + { + if ($this->isFriendPreFrom()) + { + // FIXME : Help! finx my centence in English! + opNotificationCenter::notify($this->getMemberRelatedByMemberIdFrom(), $this->getMember(), 'Do you accept friend request?', array('category' => 'link',)); + } + } + public function isFriend() { return (bool)$this->getIsFriend(); diff --git a/web/css/smt_main.css b/web/css/smt_main.css index 378cd46b0..8536dd076 100644 --- a/web/css/smt_main.css +++ b/web/css/smt_main.css @@ -45,6 +45,49 @@ margin: 0; } +#pushList { + background: #ddd; +} +#pushList div.push { + padding: 4px 0; + border-bottom: 1px solid #999; +} +#pushList div.push_content { + margin-left: -13px; +} + +.isread { + background: #FFF; +} + +.hover { + border-color: #aaf; + cursor: pointer; + background-color: #cdf; +} + +#notification_center { + position: relative; +} +.nc_icon1 { + position:absolute; + top: 18px; + left: 24px; + line-height: 10px; +} +.nc_icon2 { + position:absolute; + top: 18px; + left: 58px; + line-height: 10px; +} +.nc_icon3 { + position:absolute; + top: 18px; + left: 90px; + line-height: 10px; +} + .tosaka_margin, .right_margin, .left_margin, .center_margin { background: #555; } @@ -80,6 +123,11 @@ body { width: 320px; } +hr.gray { + margin: 0; + height: 0; + border-color: #999; +} hr.toumei { margin: 0; height: 4px; diff --git a/web/js/smt_notify.js b/web/js/smt_notify.js new file mode 100644 index 000000000..e1bca671b --- /dev/null +++ b/web/js/smt_notify.js @@ -0,0 +1,86 @@ +/******************************************************* +** jQuery notification center functions +** how to use : $('#element').pushLink(); +** $('#element').friendLink(buttonElement: '.button', ncfriendloadingElement: '#ncfriendloading', ncfriendresultmessageElement: '#ncfriendresultmessage'); +** $('#element').friendUnlink(buttonElement: '.button', ncfriendloadingElement: '#ncfriendloading', ncfriendresultmessageElement: '#ncfriendresultmessage'); +** @author : Shouta Kashiwagi +*********************************************************/ + +(function($){ + var _followScroll = true; + var _readyBound = false; + + $.fn.pushLink = function(settings){ + return this.each(function(){ + var linkUrl = $(this).attr('data-location-url'); + var notifyId = $(this).attr('data-notify-id'); + $(this).mouseover(function(){ + $(this).addClass('hover'); + }) + .mouseout(function(){ + $(this).removeClass('hover'); + }) + $(this).click(function(){ + $.getJSON( openpne.apiBase + 'push/read.json' , { 'id': notifyId, 'apiKey': openpne.apiKey }, function(d){}); + window.location = linkUrl; + }); + }); + }; + + $.fn.friendLink = function(settings){ + return this.each(function(){ + $(this).click(function(){ + $(settings.buttonElement).hide(); + $(settings.ncfriendloadingElement).show(); + var pushElement = $(this).parents('.push'); + var memberId = pushElement.attr('data-member-id'); + var notifyId = pushElement.attr('data-notify-id'); + $.getJSON( openpne.apiBase + 'push/read.json' , { 'id': notifyId, 'apiKey': openpne.apiKey }, function(d){}); + $.ajax({ + url: openpne.apiBase + 'member/friend_accept.json', + type: 'GET', + data: 'member_id=' + memberId + '&apiKey=' + openpne.apiKey, + dataType: 'json', + success: function(data) { + if(data.status=='success'){ + $(settings.ncfriendloadingElement).hide(); + $(settings.ncfriendresultmessageElement).text('フレンド申請を承認しました。'); + }else{ + alert(data.message); + } + } + }); + }); + }); + }; + + + $.fn.friendUnlink = function(settings){ + return this.each(function(){ + $(this).click(function(){ + $(settings.buttonElement).hide(); + $(settings.ncfriendloadingElement).show(); + var pushElement = $(this).parents('.push'); + var memberId = pushElement.attr('data-member-id'); + var notifyId = pushElement.attr('data-notify-id'); + $.getJSON( openpne.apiBase + 'push/read.json' , { 'id': notifyId, 'apiKey': openpne.apiKey }, function(d){}); + $.ajax({ + url: openpne.apiBase + 'member/friend_reject.json', + type: 'GET', + data: 'member_id=' + memberId + '&apiKey=' + openpne.apiKey, + dataType: 'json', + success: function(data) { + if(data.status=='success'){ + $(settings.ncfriendloadingElement).hide(); + $(settings.ncfriendresultmessageElement).show(); + $(settings.ncfriendresultmessageElement).text('フレンド申請を拒否しました。'); + }else{ + alert(data.message); + } + } + }); + }); + }); + }; + +})(jQuery); diff --git a/web/js/smt_tosaka.js b/web/js/smt_tosaka.js index ef5709556..2f2eeb2a6 100644 --- a/web/js/smt_tosaka.js +++ b/web/js/smt_tosaka.js @@ -2,6 +2,21 @@ $(document).ready(function(){ $(".ncbutton").click(function(){ $(".toggle1:not(.ncform)").hide(); $(".ncform").toggle(); + $('#pushLoading').show(); + $.getJSON( openpne.apiBase + 'push/search.json?apiKey=' + openpne.apiKey, function(json){ + if(json.status=='success') + { + $pushHtml = $("#pushListTemplate").tmpl(json.data); + $('.divlink', $pushHtml).pushLink(); + $('.friend-accept', $pushHtml).friendLink({ buttonElement: '.friend-notify-button', ncfriendloadingElement: '#ncfriendloading', ncfriendresultmessageElement: '#ncfriendresultmessage', }); + $('.friend-reject', $pushHtml).friendUnlink({ buttonElement: '.friend-notify-button', ncfriendloadingElement: '#ncfriendloading', ncfriendresultmessageElement: '#ncfriendresultmessage', }) + $("#pushList").html($pushHtml); + }else{ + alert(json.message); + } + $('#pushList').show(); + $('#pushLoading').hide(); + }); }); $(".menubutton").click(function(){ @@ -37,4 +52,14 @@ $(document).ready(function(){ } }); }); + + $.getJSON( openpne.apiBase + 'push/count.json?apiKey=' + openpne.apiKey, function(json){ + if(json.status=='success') + { + $pushHtml = $("#pushCountTemplate").tmpl(json.data); + $("#notification_center").append($pushHtml); + }else{ + alert(json.message); + } + }); }); From 20ca2ad8d4a04364b352b3919a154495f4bfa732 Mon Sep 17 00:00:00 2001 From: Kimura Youichi Date: Fri, 17 Feb 2012 16:27:22 +0900 Subject: [PATCH 038/630] add ability to switch smartphone style (refs #2227) --- apps/pc_frontend/i18n/messages.ja.xml | 8 ++++++++ apps/pc_frontend/templates/_layout.php | 12 ++++++++++++ apps/pc_frontend/templates/smtLayoutGroup.php | 6 ++++++ apps/pc_frontend/templates/smtLayoutHome.php | 6 ++++++ .../pc_frontend/templates/smtLayoutMember.php | 6 ++++++ apps/pc_frontend/templates/smtLayoutSns.php | 6 ++++++ lib/request/opWebRequest.class.php | 7 ++++++- plugins/opSkinBasicPlugin/web/css/main.css | 19 +++++++++++++++++++ web/css/smt_main.css | 11 +++++++++++ web/js/smt_main.js | 8 ++++++++ 10 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 web/js/smt_main.js diff --git a/apps/pc_frontend/i18n/messages.ja.xml b/apps/pc_frontend/i18n/messages.ja.xml index 2d22b39a9..e366baddf 100644 --- a/apps/pc_frontend/i18n/messages.ja.xml +++ b/apps/pc_frontend/i18n/messages.ja.xml @@ -1363,6 +1363,14 @@ Back to %community% top page %community% トップに戻る + + View this page on smartphone style + このページをスマートフォン版で表示 + + + View this page on regular style + このページをPC版で表示 + diff --git a/apps/pc_frontend/templates/_layout.php b/apps/pc_frontend/templates/_layout.php index 574da7c66..06bb04b7a 100644 --- a/apps/pc_frontend/templates/_layout.php +++ b/apps/pc_frontend/templates/_layout.php @@ -83,6 +83,18 @@
    +isSmartphone(false)): ?> +
    + + +
    + + + diff --git a/apps/pc_frontend/modules/member/templates/smtProfileSuccess.php b/apps/pc_frontend/modules/member/templates/smtProfileSuccess.php index 92a0e4b5a..74ddae25f 100644 --- a/apps/pc_frontend/modules/member/templates/smtProfileSuccess.php +++ b/apps/pc_frontend/modules/member/templates/smtProfileSuccess.php @@ -9,10 +9,33 @@ isFriend() && opConfig::get('enable_friend_link') && $relation->isAllowed($sf_user->getRawValue()->getMember(), 'friend_link')): ?> +
    -

    $member->getName(), '%my_friend%' => $op_term['my_friend']->pluralize())) ?>
    - $op_term['my_friend']->pluralize())), 'friend/link?id='.$member->getId()) ?> -

    +

    $member->getName(), '%my_friend%' => $op_term['my_friend']->pluralize())) ?>

    + +

    +

    $op_term['friend'])) ?>

    +

    $op_term['friend'])) ?>

    $content)) ?> From d5c6eca8b913559f2e85e376e882c2d8bb21c9a0 Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Mon, 20 Feb 2012 16:54:11 +0900 Subject: [PATCH 063/630] modified tosaka template for smartphone (refs #2227) --- apps/pc_frontend/templates/_tosaka.php | 10 +++--- web/js/smt_notify.js | 42 +++++++++++++++++--------- web/js/smt_tosaka.js | 2 +- 3 files changed, 33 insertions(+), 21 deletions(-) diff --git a/apps/pc_frontend/templates/_tosaka.php b/apps/pc_frontend/templates/_tosaka.php index 0c700c478..99f33b42f 100644 --- a/apps/pc_frontend/templates/_tosaka.php +++ b/apps/pc_frontend/templates/_tosaka.php @@ -15,24 +15,24 @@ -
    +

    $member->getName(), '%my_friend%' => $op_term['my_friend']->pluralize())) ?>

    diff --git a/apps/pc_frontend/templates/_tosaka.php b/apps/pc_frontend/templates/_tosaka.php index 99f33b42f..8e6cfb995 100644 --- a/apps/pc_frontend/templates/_tosaka.php +++ b/apps/pc_frontend/templates/_tosaka.php @@ -1,8 +1,10 @@
    -
    - 通知センター +
    +
    + +
    'toggle1_close')) ?> @@ -29,7 +31,7 @@
    {{if category=="link"}}
    - +
    @@ -40,13 +42,13 @@ @@ -56,8 +58,10 @@
    -
    - 投稿フォーム +
    +
    + +
    'toggle1_close')) ?> @@ -67,7 +71,8 @@
    - + +
    @@ -79,7 +84,7 @@
    '32', 'class' => 'menubutton')); ?>
    '32', 'class' => 'ncbutton')) ?>
    -
    '32', 'class' =>'postbutton')) ?>
    +
    '32', 'class' =>'postbutton')) ?>
    diff --git a/apps/pc_frontend/templates/smtLayoutGroup.php b/apps/pc_frontend/templates/smtLayoutGroup.php index c52bbda81..c33f95c7a 100644 --- a/apps/pc_frontend/templates/smtLayoutGroup.php +++ b/apps/pc_frontend/templates/smtLayoutGroup.php @@ -49,7 +49,7 @@ hasFlash('error')): ?>
    -
    +
    getFlash('error')); ?>
    @@ -57,7 +57,7 @@ hasFlash('notice')): ?>
    -
    +
    getFlash('notice')); ?>
    diff --git a/apps/pc_frontend/templates/smtLayoutHome.php b/apps/pc_frontend/templates/smtLayoutHome.php index fba74c85d..c9ed3f7c0 100644 --- a/apps/pc_frontend/templates/smtLayoutHome.php +++ b/apps/pc_frontend/templates/smtLayoutHome.php @@ -52,7 +52,7 @@ hasFlash('error')): ?>
    -
    +
    getFlash('error')); ?>
    @@ -60,7 +60,7 @@ hasFlash('notice')): ?>
    -
    +
    getFlash('notice')); ?>
    diff --git a/apps/pc_frontend/templates/smtLayoutMember.php b/apps/pc_frontend/templates/smtLayoutMember.php index 1b44287cb..2729f0f2f 100644 --- a/apps/pc_frontend/templates/smtLayoutMember.php +++ b/apps/pc_frontend/templates/smtLayoutMember.php @@ -55,7 +55,7 @@ hasFlash('error')): ?>
    -
    +
    getFlash('error')); ?>
    @@ -63,7 +63,7 @@ hasFlash('notice')): ?>
    -
    +
    getFlash('notice')); ?>
    diff --git a/apps/pc_frontend/templates/smtLayoutSns.php b/apps/pc_frontend/templates/smtLayoutSns.php index 0dd91cf9a..ef1006b2f 100644 --- a/apps/pc_frontend/templates/smtLayoutSns.php +++ b/apps/pc_frontend/templates/smtLayoutSns.php @@ -56,7 +56,7 @@ hasFlash('error')): ?>
    -
    +
    getFlash('error')); ?>
    @@ -64,7 +64,7 @@ hasFlash('notice')): ?>
    -
    +
    getFlash('notice')); ?>
    diff --git a/web/css/bootstrap.css b/web/css/bootstrap.css index 63711555a..2ef76098f 100644 --- a/web/css/bootstrap.css +++ b/web/css/bootstrap.css @@ -1,102 +1,12 @@ /*! - * Bootstrap @VERSION + * Bootstrap v2.0.0 * - * Copyright 2011 Twitter, Inc + * Copyright 2012 Twitter, Inc * Licensed under the Apache License v2.0 * http://www.apache.org/licenses/LICENSE-2.0 * * Designed and built with all the love in the world @twitter by @mdo and @fat. - * Date: @DATE */ -/* Reset.less - * Props to Eric Meyer (meyerweb.com) for his CSS reset file. We're using an adapted version here that cuts out some of the reset HTML elements we will never need here (i.e., dfn, samp, etc). - * ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */ -html, body { - margin: 0; - padding: 0; -} -h1, -h2, -h3, -h4, -h5, -h6, -p, -blockquote, -pre, -a, -abbr, -acronym, -address, -cite, -code, -del, -dfn, -em, -img, -q, -s, -samp, -small, -strike, -strong, -sub, -sup, -tt, -var, -dd, -dl, -dt, -li, -ol, -ul, -fieldset, -form, -label, -legend, -button, -table, -caption, -tbody, -tfoot, -thead, -tr, -th, -td { - margin: 0; - padding: 0; - border: 0; - font-weight: normal; - font-style: normal; - font-size: 100%; - line-height: 1; - font-family: inherit; -} -table { - border-collapse: collapse; - border-spacing: 0; -} -ol, ul { - list-style: none; -} -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; -} -html { - overflow-y: scroll; - font-size: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} -a:focus { - outline: thin dotted; -} -a:hover, a:active { - outline: 0; -} article, aside, details, @@ -117,10 +27,23 @@ audio, canvas, video { audio:not([controls]) { display: none; } +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +a:hover, a:active { + outline: 0; +} sub, sup { + position: relative; font-size: 75%; line-height: 0; - position: relative; vertical-align: baseline; } sup { @@ -130,6 +53,8 @@ sub { bottom: -0.25em; } img { + max-width: 100%; + height: auto; border: 0; -ms-interpolation-mode: bicubic; } @@ -137,18 +62,17 @@ button, input, select, textarea { - font-size: 100%; margin: 0; - vertical-align: baseline; - *vertical-align: middle; + font-size: 100%; + vertical-align: middle; } button, input { - line-height: normal; *overflow: visible; + line-height: normal; } button::-moz-focus-inner, input::-moz-focus-inner { - border: 0; padding: 0; + border: 0; } button, input[type="button"], @@ -163,106 +87,41 @@ input[type="search"] { -moz-box-sizing: content-box; box-sizing: content-box; } -input[type="search"]::-webkit-search-decoration { +input[type="search"]::-webkit-search-decoration, input[type="search"]::-webkit-search-cancel-button { -webkit-appearance: none; } textarea { overflow: auto; vertical-align: top; } -/* Variables.less - * Variables to customize the look and feel of Bootstrap - * ----------------------------------------------------- */ -/* Mixins.less - * Snippets of reusable CSS to develop faster and keep code readable - * ----------------------------------------------------------------- */ -/* - * Scaffolding - * Basic and global styles for generating a grid system, structural layout, and page templates - * ------------------------------------------------------------------------------------------- */ body { - background-color: #ffffff; margin: 0; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 13px; - font-weight: normal; line-height: 18px; - color: #404040; -} -.container { - width: 320px; - margin-left: auto; - margin-right: auto; - zoom: 1; -} -.container:before, .container:after { - display: table; - content: ""; - zoom: 1; -} -.container:after { - clear: both; -} -.container-fluid { - position: relative; - min-width: 940px; - padding-left: 20px; - padding-right: 20px; - zoom: 1; -} -.container-fluid:before, .container-fluid:after { - display: table; - content: ""; - zoom: 1; -} -.container-fluid:after { - clear: both; -} -.container-fluid > .sidebar { - position: absolute; - top: 0; - left: 20px; - width: 220px; -} -.container-fluid > .content { - margin-left: 240px; + color: #333333; + background-color: #ffffff; } a { - color: #0069d6; + color: #0088cc; text-decoration: none; - line-height: inherit; - font-weight: inherit; } a:hover { - color: #00438a; + color: #005580; text-decoration: underline; } -.pull-right { - float: right; -} -.pull-left { - float: left; -} -.hide { - display: none; -} -.show { - display: block; -} .row { - zoom: 1; margin-left: -4px; + *zoom: 1; } .row:before, .row:after { display: table; content: ""; - zoom: 1; } .row:after { clear: both; } -.row > [class*="span"] { - display: inline; +[class*="span"] { float: left; margin-left: 4px; } @@ -299,105 +158,136 @@ a:hover { .span11 { width: 293px; } -.span12 { +.span12, .container { width: 320px; } -.span13 { - width: 347px; +.offset1 { + margin-left: 31px; } -.span14 { - width: 374px; +.offset2 { + margin-left: 58px; } -.span15 { - width: 401px; +.offset3 { + margin-left: 85px; } -.span16 { - width: 428px; +.offset4 { + margin-left: 112px; } -.span17 { - width: 455px; +.offset5 { + margin-left: 139px; } -.span18 { - width: 482px; +.offset6 { + margin-left: 166px; } -.span19 { - width: 509px; +.offset7 { + margin-left: 193px; } -.span20 { - width: 536px; +.offset8 { + margin-left: 220px; } -.span21 { - width: 563px; +.offset9 { + margin-left: 247px; } -.span22 { - width: 590px; +.offset10 { + margin-left: 274px; } -.span23 { - width: 617px; +.offset11 { + margin-left: 301px; } -.span24 { - width: 644px; +.row-fluid { + width: 100%; + *zoom: 1; } -.row > .offset1 { - margin-left: 31px; +.row-fluid:before, .row-fluid:after { + display: table; + content: ""; } -.row > .offset2 { - margin-left: 58px; +.row-fluid:after { + clear: both; } -.row > .offset3 { - margin-left: 85px; +.row-fluid > [class*="span"] { + float: left; + margin-left: 2.127659574%; } -.row > .offset4 { - margin-left: 112px; +.row-fluid > [class*="span"]:first-child { + margin-left: 0; } -.row > .offset5 { - margin-left: 139px; +.row-fluid .span1 { + width: 6.382978723%; } -.row > .offset6 { - margin-left: 166px; +.row-fluid .span2 { + width: 14.89361702%; } -.row > .offset7 { - margin-left: 193px; +.row-fluid .span3 { + width: 23.404255317%; } -.row > .offset8 { - margin-left: 220px; +.row-fluid .span4 { + width: 31.914893614%; } -.row > .offset9 { - margin-left: 247px; +.row-fluid .span5 { + width: 40.425531911%; } -.row > .offset10 { - margin-left: 274px; +.row-fluid .span6 { + width: 48.93617020799999%; } -.row > .offset11 { - margin-left: 301px; +.row-fluid .span7 { + width: 57.446808505%; +} +.row-fluid .span8 { + width: 65.95744680199999%; +} +.row-fluid .span9 { + width: 74.468085099%; +} +.row-fluid .span10 { + width: 82.97872339599999%; +} +.row-fluid .span11 { + width: 91.489361693%; +} +.row-fluid .span12 { + width: 99.99999998999999%; +} +.container { + width: 320px; + margin-left: auto; + margin-right: auto; + *zoom: 1; } -.row > .offset12 { - margin-left: 328px; +.container:before, .container:after { + display: table; + content: ""; } -.span-one-third { - width: 300px; +.container:after { + clear: both; } -.span-two-thirds { - width: 620px; +.container-fluid { + padding-left: 4px; + padding-right: 4px; + *zoom: 1; } -.row > .offset-one-third { - margin-left: 340px; +.container-fluid:before, .container-fluid:after { + display: table; + content: ""; } -.row > .offset-two-thirds { - margin-left: 660px; +.container-fluid:after { + clear: both; } -/* Typography.less - * Headings, body text, lists, code, and more for a versatile and durable typography system - * ---------------------------------------------------------------------------------------- */ p { + margin: 0 0 9px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 13px; - font-weight: normal; line-height: 18px; - margin-bottom: 9px; } p small { font-size: 11px; - color: #bfbfbf; + color: #999999; +} +.lead { + margin-bottom: 18px; + font-size: 20px; + font-weight: 200; + line-height: 27px; } h1, h2, @@ -405,8 +295,10 @@ h3, h4, h5, h6 { + margin: 0; font-weight: bold; - color: #404040; + color: #333333; + text-rendering: optimizelegibility; } h1 small, h2 small, @@ -414,10 +306,10 @@ h3 small, h4 small, h5 small, h6 small { - color: #bfbfbf; + font-weight: normal; + color: #999999; } h1 { - margin-bottom: 18px; font-size: 30px; line-height: 36px; } @@ -429,36 +321,43 @@ h2 { line-height: 36px; } h2 small { - font-size: 14px; -} -h3, -h4, -h5, -h6 { - line-height: 36px; + font-size: 18px; } h3 { + line-height: 27px; font-size: 18px; } h3 small { font-size: 14px; } +h4, h5, h6 { + line-height: 18px; +} h4 { - font-size: 16px; + font-size: 14px; } h4 small { font-size: 12px; } h5 { - font-size: 14px; + font-size: 12px; } h6 { - font-size: 13px; - color: #bfbfbf; + font-size: 11px; + color: #999999; text-transform: uppercase; } +.page-header { + padding-bottom: 17px; + margin: 18px 0; + border-bottom: 1px solid #eeeeee; +} +.page-header h1 { + line-height: 1; +} ul, ol { - margin: 0 0 18px 25px; + padding: 0; + margin: 0 0 9px 25px; } ul ul, ul ol, @@ -474,154 +373,162 @@ ol { } li { line-height: 18px; - color: #808080; } ul.unstyled { - list-style: none; margin-left: 0; + list-style: none; } dl { margin-bottom: 18px; } -dl dt, dl dd { +dt, dd { line-height: 18px; } -dl dt { +dt { font-weight: bold; } -dl dd { +dd { margin-left: 9px; } hr { - margin: 20px 0 19px; + margin: 18px 0; border: 0; - border-bottom: 1px solid #eee; + border-top: 1px solid #e5e5e5; + border-bottom: 1px solid #ffffff; } strong { - font-style: inherit; font-weight: bold; } em { font-style: italic; - font-weight: inherit; - line-height: inherit; } .muted { - color: #bfbfbf; + color: #999999; +} +abbr { + font-size: 90%; + text-transform: uppercase; + border-bottom: 1px dotted #ddd; + cursor: help; } blockquote { - margin-bottom: 18px; - border-left: 5px solid #eee; - padding-left: 15px; + padding: 0 0 0 15px; + margin: 0 0 18px; + border-left: 5px solid #eeeeee; } blockquote p { - font-size: 14px; - font-weight: 300; - line-height: 18px; margin-bottom: 0; + font-size: 16px; + font-weight: 300; + line-height: 22.5px; } blockquote small { display: block; - font-size: 12px; - font-weight: 300; line-height: 18px; - color: #bfbfbf; + color: #999999; } blockquote small:before { content: '\2014 \00A0'; } +blockquote.pull-right { + float: right; + padding-left: 0; + padding-right: 15px; + border-left: 0; + border-right: 5px solid #eeeeee; +} +blockquote.pull-right p, blockquote.pull-right small { + text-align: right; +} +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} address { display: block; - line-height: 18px; margin-bottom: 18px; + line-height: 18px; + font-style: normal; +} +small { + font-size: 100%; +} +cite { + font-style: normal; } code, pre { padding: 0 3px 2px; - font-family: Monaco, Andale Mono, Courier New, monospace; + font-family: Menlo, Monaco, "Courier New", monospace; font-size: 12px; + color: #333333; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; } code { - background-color: #fee9cc; - color: rgba(0, 0, 0, 0.75); - padding: 1px 3px; + padding: 3px 4px; + color: #d14; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; } pre { - background-color: #f5f5f5; display: block; padding: 8.5px; - margin: 0 0 18px; - line-height: 18px; + margin: 0 0 9px; font-size: 12px; + line-height: 18px; + background-color: #f5f5f5; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, 0.15); - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; white-space: pre; white-space: pre-wrap; - word-wrap: break-word; + word-break: break-all; } -/* Forms.less - * Base styles for various input types, form layouts, and states - * ------------------------------------------------------------- */ -form { +pre.prettyprint { margin-bottom: 18px; } +pre code { + padding: 0; + background-color: transparent; +} +form { + margin: 0 0 18px; +} fieldset { - margin-bottom: 18px; - padding-top: 18px; + padding: 0; + margin: 0; + border: 0; } -fieldset legend { +legend { display: block; - padding-left: 150px; + width: 100%; + padding: 0; + margin-bottom: 27px; font-size: 19.5px; - line-height: 1; - color: #404040; - *padding: 0 0 5px 145px; - /* IE6-7 */ - - *line-height: 1.5; - /* IE6-7 */ - -} -form .clearfix { - margin-bottom: 18px; - zoom: 1; -} -form .clearfix:before, form .clearfix:after { - display: table; - content: ""; - zoom: 1; -} -form .clearfix:after { - clear: both; + line-height: 36px; + color: #333333; + border: 0; + border-bottom: 1px solid #eee; } label, input, +button, select, textarea { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 13px; font-weight: normal; - line-height: normal; -} -label { - padding-top: 6px; - font-size: 13px; line-height: 18px; - float: left; - width: 130px; - text-align: right; - color: #404040; } -form .input { - margin-left: 150px; -} -input[type=checkbox], input[type=radio] { - cursor: pointer; +label { + display: block; + margin-bottom: 5px; + color: #333333; } input, textarea, @@ -631,282 +538,187 @@ select, width: 210px; height: 18px; padding: 4px; + margin-bottom: 9px; font-size: 13px; line-height: 18px; - color: #808080; + color: #555555; border: 1px solid #ccc; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; } -select { - padding: initial; +.uneditable-textarea { + width: auto; + height: auto; +} +label input, label textarea, label select { + display: block; } -input[type=checkbox], input[type=radio] { +input[type="image"], input[type="checkbox"], input[type="radio"] { width: auto; height: auto; padding: 0; margin: 3px 0; *margin-top: 0; - /* IE6-7 */ + /* IE7 */ line-height: normal; - border: none; + border: 0; + cursor: pointer; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; } -input[type=file] { - background-color: #ffffff; +input[type="file"] { padding: initial; - border: initial; line-height: initial; + border: initial; + background-color: #ffffff; + background-color: initial; -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none; } -input[type=button], input[type=reset], input[type=submit] { +input[type="button"], input[type="reset"], input[type="submit"] { width: auto; height: auto; } -select, input[type=file] { - height: 27px; - *height: auto; - line-height: 27px; +select, input[type="file"] { + height: 28px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + *margin-top: 4px; /* For IE7, add top margin to align select with labels */ + line-height: 28px; } -select[multiple] { - height: inherit; +select { + width: 220px; background-color: #ffffff; } +select[multiple], select[size] { + height: auto; +} +input[type="image"] { + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} textarea { height: auto; } -.uneditable-input { - background-color: #ffffff; - display: block; - border-color: #eee; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - cursor: not-allowed; +input[type="hidden"] { + display: none; } -:-moz-placeholder { - color: #bfbfbf; +.radio, .checkbox { + padding-left: 18px; } -::-webkit-input-placeholder { - color: #bfbfbf; +.radio input[type="radio"], .checkbox input[type="checkbox"] { + float: left; + margin-left: -18px; +} +.controls > .radio:first-child, .controls > .checkbox:first-child { + padding-top: 5px; +} +.radio.inline, .checkbox.inline { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; +} +.radio.inline + .radio.inline, .checkbox.inline + .checkbox.inline { + margin-left: 10px; +} +.controls > .radio.inline:first-child, .controls > .checkbox.inline:first-child { + padding-top: 0; } input, textarea { + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; -moz-transition: border linear 0.2s, box-shadow linear 0.2s; -ms-transition: border linear 0.2s, box-shadow linear 0.2s; -o-transition: border linear 0.2s, box-shadow linear 0.2s; transition: border linear 0.2s, box-shadow linear 0.2s; - -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1); } input:focus, textarea:focus { - outline: 0; border-color: rgba(82, 168, 236, 0.8); - -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6); - -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6); - box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6); + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + outline: 0; + outline: thin dotted \9; + /* IE6-8 */ + } -input[type=file]:focus, input[type=checkbox]:focus, select:focus { +input[type="file"]:focus, input[type="checkbox"]:focus, select:focus { -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none; - outline: 1px dotted #666; -} -form .clearfix.error > label, form .clearfix.error .help-block, form .clearfix.error .help-inline { - color: #b94a48; -} -form .clearfix.error input, form .clearfix.error textarea { - color: #b94a48; - border-color: #ee5f5b; -} -form .clearfix.error input:focus, form .clearfix.error textarea: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 .clearfix.error .input-prepend .add-on, form .clearfix.error .input-append .add-on { - color: #b94a48; - background-color: #fce6e6; - border-color: #b94a48; -} -form .clearfix.warning > label, form .clearfix.warning .help-block, form .clearfix.warning .help-inline { - color: #c09853; -} -form .clearfix.warning input, form .clearfix.warning textarea { - color: #c09853; - border-color: #ccae64; -} -form .clearfix.warning input:focus, form .clearfix.warning textarea:focus { - border-color: #be9a3f; - -webkit-box-shadow: 0 0 6px #e5d6b1; - -moz-box-shadow: 0 0 6px #e5d6b1; - box-shadow: 0 0 6px #e5d6b1; -} -form .clearfix.warning .input-prepend .add-on, form .clearfix.warning .input-append .add-on { - color: #c09853; - background-color: #d2b877; - border-color: #c09853; -} -form .clearfix.success > label, form .clearfix.success .help-block, form .clearfix.success .help-inline { - color: #468847; -} -form .clearfix.success input, form .clearfix.success textarea { - color: #468847; - border-color: #57a957; -} -form .clearfix.success input:focus, form .clearfix.success textarea:focus { - border-color: #458845; - -webkit-box-shadow: 0 0 6px #9acc9a; - -moz-box-shadow: 0 0 6px #9acc9a; - box-shadow: 0 0 6px #9acc9a; -} -form .clearfix.success .input-prepend .add-on, form .clearfix.success .input-append .add-on { - color: #468847; - background-color: #bcddbc; - border-color: #468847; + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; } -.input-mini, -input.mini, -textarea.mini, -select.mini { +.input-mini { width: 60px; } -.input-small, -input.small, -textarea.small, -select.small { +.input-small { width: 90px; } -.input-medium, -input.medium, -textarea.medium, -select.medium { +.input-medium { width: 150px; } -.input-large, -input.large, -textarea.large, -select.large { +.input-large { width: 210px; } -.input-xlarge, -input.xlarge, -textarea.xlarge, -select.xlarge { +.input-xlarge { width: 270px; } -.input-xxlarge, -input.xxlarge, -textarea.xxlarge, -select.xxlarge { +.input-xxlarge { width: 530px; } -textarea.xxlarge { - overflow-y: auto; -} -input.span1, textarea.span1 { - display: inline-block; +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input { float: none; - width: 13px; margin-left: 0; } -input.span2, textarea.span2 { - display: inline-block; - float: none; +input.span1, textarea.span1, .uneditable-input.span1 { + width: 13px; +} +input.span2, textarea.span2, .uneditable-input.span2 { width: 40px; - margin-left: 0; } -input.span3, textarea.span3 { - display: inline-block; - float: none; +input.span3, textarea.span3, .uneditable-input.span3 { width: 67px; - margin-left: 0; } -input.span4, textarea.span4 { - display: inline-block; - float: none; +input.span4, textarea.span4, .uneditable-input.span4 { width: 94px; - margin-left: 0; } -input.span5, textarea.span5 { - display: inline-block; - float: none; +input.span5, textarea.span5, .uneditable-input.span5 { width: 121px; - margin-left: 0; } -input.span6, textarea.span6 { - display: inline-block; - float: none; +input.span6, textarea.span6, .uneditable-input.span6 { width: 148px; - margin-left: 0; } -input.span7, textarea.span7 { - display: inline-block; - float: none; +input.span7, textarea.span7, .uneditable-input.span7 { width: 175px; - margin-left: 0; } -input.span8, textarea.span8 { - display: inline-block; - float: none; +input.span8, textarea.span8, .uneditable-input.span8 { width: 202px; - margin-left: 0; } -input.span9, textarea.span9 { - display: inline-block; - float: none; +input.span9, textarea.span9, .uneditable-input.span9 { width: 229px; - margin-left: 0; } -input.span10, textarea.span10 { - display: inline-block; - float: none; +input.span10, textarea.span10, .uneditable-input.span10 { width: 256px; - margin-left: 0; } -input.span11, textarea.span11 { - display: inline-block; - float: none; +input.span11, textarea.span11, .uneditable-input.span11 { width: 283px; - margin-left: 0; } -input.span12, textarea.span12 { - display: inline-block; - float: none; +input.span12, textarea.span12, .uneditable-input.span12 { width: 310px; - margin-left: 0; -} -input.span13, textarea.span13 { - display: inline-block; - float: none; - width: 337px; - margin-left: 0; -} -input.span14, textarea.span14 { - display: inline-block; - float: none; - width: 364px; - margin-left: 0; -} -input.span15, textarea.span15 { - display: inline-block; - float: none; - width: 391px; - margin-left: 0; -} -input.span16, textarea.span16 { - display: inline-block; - float: none; - width: 418px; - margin-left: 0; } input[disabled], select[disabled], @@ -918,77 +730,160 @@ textarea[readonly] { border-color: #ddd; cursor: not-allowed; } -.actions { - background: #f5f5f5; +.control-group.warning > label, .control-group.warning .help-block, .control-group.warning .help-inline { + color: #c09853; +} +.control-group.warning input, .control-group.warning select, .control-group.warning textarea { + color: #c09853; + border-color: #c09853; +} +.control-group.warning input:focus, .control-group.warning select:focus, .control-group.warning textarea:focus { + border-color: #a47e3c; + -webkit-box-shadow: 0 0 6px #dbc59e; + -moz-box-shadow: 0 0 6px #dbc59e; + box-shadow: 0 0 6px #dbc59e; +} +.control-group.warning .input-prepend .add-on, .control-group.warning .input-append .add-on { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} +.control-group.error > label, .control-group.error .help-block, .control-group.error .help-inline { + color: #b94a48; +} +.control-group.error input, .control-group.error select, .control-group.error textarea { + color: #b94a48; + border-color: #b94a48; +} +.control-group.error input:focus, .control-group.error select:focus, .control-group.error textarea:focus { + border-color: #953b39; + -webkit-box-shadow: 0 0 6px #d59392; + -moz-box-shadow: 0 0 6px #d59392; + box-shadow: 0 0 6px #d59392; +} +.control-group.error .input-prepend .add-on, .control-group.error .input-append .add-on { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} +.control-group.success > label, .control-group.success .help-block, .control-group.success .help-inline { + color: #468847; +} +.control-group.success input, .control-group.success select, .control-group.success textarea { + color: #468847; + border-color: #468847; +} +.control-group.success input:focus, .control-group.success select:focus, .control-group.success textarea:focus { + border-color: #356635; + -webkit-box-shadow: 0 0 6px #7aba7b; + -moz-box-shadow: 0 0 6px #7aba7b; + box-shadow: 0 0 6px #7aba7b; +} +.control-group.success .input-prepend .add-on, .control-group.success .input-append .add-on { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} +input:focus:required:invalid, textarea:focus:required:invalid, select:focus:required:invalid { + color: #b94a48; + border-color: #ee5f5b; +} +input:focus:required:invalid:focus, textarea:focus:required:invalid:focus, select:focus:required: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: 17px 20px 18px; margin-top: 18px; margin-bottom: 18px; - padding: 17px 20px 18px 150px; + background-color: #f5f5f5; border-top: 1px solid #ddd; - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; } -.actions .secondary-action { - float: right; +.uneditable-input { + display: block; + background-color: #ffffff; + border-color: #eee; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + cursor: not-allowed; } -.actions .secondary-action a { - line-height: 30px; +:-moz-placeholder { + color: #999999; } -.actions .secondary-action a:hover { - text-decoration: underline; +::-webkit-input-placeholder { + color: #999999; } -.help-inline, .help-block { - font-size: 13px; - line-height: 18px; - color: #bfbfbf; +.help-block { + margin-top: 5px; + margin-bottom: 0; + color: #999999; } .help-inline { - padding-left: 5px; - *position: relative; - /* IE6-7 */ - - *top: -5px; - /* IE6-7 */ + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + *zoom: 1; + margin-bottom: 9px; + vertical-align: middle; + padding-left: 5px; } -.help-block { - display: block; - max-width: 600px; +.input-prepend, .input-append { + margin-bottom: 5px; + *zoom: 1; } -.inline-inputs { - color: #808080; +.input-prepend:before, +.input-append:before, +.input-prepend:after, +.input-append:after { + display: table; + content: ""; } -.inline-inputs span { - padding: 0 2px 0 1px; +.input-prepend:after, .input-append:after { + clear: both; } -.input-prepend input, .input-append input { +.input-prepend input, +.input-append input, +.input-prepend .uneditable-input, +.input-append .uneditable-input { -webkit-border-radius: 0 3px 3px 0; -moz-border-radius: 0 3px 3px 0; border-radius: 0 3px 3px 0; } -.input-prepend .add-on, .input-append .add-on { +.input-prepend input:focus, +.input-append input:focus, +.input-prepend .uneditable-input:focus, +.input-append .uneditable-input:focus { position: relative; - background: #f5f5f5; - border: 1px solid #ccc; z-index: 2; +} +.input-prepend .uneditable-input, .input-append .uneditable-input { + border-left-color: #ccc; +} +.input-prepend .add-on, .input-append .add-on { float: left; display: block; width: auto; min-width: 16px; height: 18px; - padding: 4px 4px 4px 5px; margin-right: -1px; + padding: 4px 5px; font-weight: normal; line-height: 18px; - color: #bfbfbf; + color: #999999; text-align: center; text-shadow: 0 1px 0 #ffffff; + background-color: #f5f5f5; + border: 1px solid #ccc; -webkit-border-radius: 3px 0 0 3px; -moz-border-radius: 3px 0 0 3px; border-radius: 3px 0 0 3px; } .input-prepend .active, .input-append .active { - background: #a9dba9; + background-color: #a9dba9; border-color: #46a546; } .input-prepend .add-on { @@ -996,1187 +891,1886 @@ textarea[readonly] { /* IE6-7 */ } -.input-append input { +.input-append input, .input-append .uneditable-input { float: left; -webkit-border-radius: 3px 0 0 3px; -moz-border-radius: 3px 0 0 3px; border-radius: 3px 0 0 3px; } +.input-append .uneditable-input { + border-right-color: #ccc; +} .input-append .add-on { + margin-right: 0; + margin-left: -1px; -webkit-border-radius: 0 3px 3px 0; -moz-border-radius: 0 3px 3px 0; border-radius: 0 3px 3px 0; - margin-right: 0; - margin-left: -1px; } -.inputs-list { - margin: 0 0 5px; - width: 100%; +.input-append input:first-child { + *margin-left: -160px; } -.inputs-list li { - display: block; - padding: 0; - width: 100%; +.input-append input:first-child + .add-on { + *margin-left: -21px; } -.inputs-list label { - display: block; - float: none; - width: auto; - padding: 0; - margin-left: 20px; - line-height: 18px; - text-align: left; - white-space: normal; +.search-query { + padding-left: 14px; + padding-right: 14px; + margin-bottom: 0; + -webkit-border-radius: 14px; + -moz-border-radius: 14px; + border-radius: 14px; +} +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input { + display: inline-block; + margin-bottom: 0; } -.inputs-list label strong { - color: #808080; -} -.inputs-list label small { - font-size: 11px; - font-weight: normal; -} -.inputs-list .inputs-list { - margin-left: 25px; - margin-bottom: 10px; - padding-top: 0; -} -.inputs-list:first-child { - padding-top: 6px; -} -.inputs-list li + li { - padding-top: 2px; -} -.inputs-list input[type=radio], .inputs-list input[type=checkbox] { - margin-bottom: 0; - margin-left: -20px; - float: left; -} -.form-stacked { - padding-left: 20px; -} -.form-stacked fieldset { - padding-top: 9px; -} -.form-stacked legend { - padding-left: 0; +.form-search label, +.form-inline label, +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + display: inline-block; } -.form-stacked label { - display: block; - float: none; - width: auto; - font-weight: bold; - text-align: left; - line-height: 20px; - padding-top: 0; +.form-search .input-append .add-on, +.form-inline .input-prepend .add-on, +.form-search .input-append .add-on, +.form-inline .input-prepend .add-on { + vertical-align: middle; } -.form-stacked .clearfix { +.control-group { margin-bottom: 9px; } -.form-stacked .clearfix div.input { - margin-left: 0; +.form-horizontal legend + .control-group { + margin-top: 18px; + -webkit-margin-top-collapse: separate; } -.form-stacked .inputs-list { - margin-bottom: 0; +.form-horizontal .control-group { + margin-bottom: 18px; + *zoom: 1; } -.form-stacked .inputs-list li { - padding-top: 0; +.form-horizontal .control-group:before, .form-horizontal .control-group:after { + display: table; + content: ""; } -.form-stacked .inputs-list li label { - font-weight: normal; - padding-top: 0; +.form-horizontal .control-group:after { + clear: both; } -.form-stacked div.clearfix.error { - padding-top: 10px; - padding-bottom: 10px; - padding-left: 10px; - margin-top: 0; - margin-left: -10px; +.form-horizontal .control-group > label { + float: left; + width: 140px; + padding-top: 5px; + text-align: right; } -.form-stacked .actions { - margin-left: -20px; - padding-left: 20px; +.form-horizontal .controls { + margin-left: 160px; +} +.form-horizontal .form-actions { + padding-left: 160px; } -/* - * Tables.less - * Tables for, you guessed it, tabular data - * ---------------------------------------- */ table { + max-width: 100%; + border-collapse: collapse; + border-spacing: 0; +} +.table { width: 100%; margin-bottom: 18px; - padding: 0; - font-size: 13px; - border-collapse: collapse; } -table th, table td { - padding: 10px 10px 9px; +.table th, .table td { + padding: 8px; line-height: 18px; text-align: left; + border-top: 1px solid #ddd; } -table th { - padding-top: 9px; +.table th { font-weight: bold; - vertical-align: middle; + vertical-align: bottom; } -table td { +.table td { vertical-align: top; - border-top: 1px solid #ddd; } -table tbody th { - border-top: 1px solid #ddd; - vertical-align: top; +.table thead:first-child tr th, .table thead:first-child tr td { + border-top: 0; } -.condensed-table th, .condensed-table td { - padding: 5px 5px 4px; +.table tbody + tbody { + border-top: 2px solid #ddd; } -.bordered-table { +.table-condensed th, .table-condensed td { + padding: 4px 5px; +} +.table-bordered { border: 1px solid #ddd; border-collapse: separate; - *border-collapse: collapse; - /* IE7, collapse table to remove spacing */ - + *border-collapse: collapsed; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } -.bordered-table th + th, .bordered-table td + td, .bordered-table th + td { +.table-bordered th + th, +.table-bordered td + td, +.table-bordered th + td, +.table-bordered td + th { border-left: 1px solid #ddd; } -.bordered-table thead tr:first-child th:first-child, .bordered-table tbody tr:first-child td:first-child { +.table-bordered thead:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} +.table-bordered thead:first-child tr:first-child th:first-child, .table-bordered tbody:first-child tr:first-child td:first-child { -webkit-border-radius: 4px 0 0 0; -moz-border-radius: 4px 0 0 0; border-radius: 4px 0 0 0; } -.bordered-table thead tr:first-child th:last-child, .bordered-table tbody tr:first-child td:last-child { +.table-bordered thead:first-child tr:first-child th:last-child, .table-bordered tbody:first-child tr:first-child td:last-child { -webkit-border-radius: 0 4px 0 0; -moz-border-radius: 0 4px 0 0; border-radius: 0 4px 0 0; } -.bordered-table tbody tr:last-child td:first-child { +.table-bordered thead:last-child tr:last-child th:first-child, .table-bordered tbody:last-child tr:last-child td:first-child { -webkit-border-radius: 0 0 0 4px; -moz-border-radius: 0 0 0 4px; border-radius: 0 0 0 4px; } -.bordered-table tbody tr:last-child td:last-child { +.table-bordered thead:last-child tr:last-child th:last-child, .table-bordered tbody:last-child tr:last-child td:last-child { -webkit-border-radius: 0 0 4px 0; -moz-border-radius: 0 0 4px 0; border-radius: 0 0 4px 0; } +.table-striped tbody tr:nth-child(odd) td, .table-striped tbody tr:nth-child(odd) th { + background-color: #f9f9f9; +} table .span1 { - width: 3px; + float: none; + width: 7px; + margin-left: 0; } table .span2 { - width: 9px; + float: none; + width: 34px; + margin-left: 0; } table .span3 { - width: 15px; + float: none; + width: 61px; + margin-left: 0; } table .span4 { - width: 21px; + float: none; + width: 88px; + margin-left: 0; } table .span5 { - width: 27px; + float: none; + width: 115px; + margin-left: 0; } table .span6 { - width: 33px; + float: none; + width: 142px; + margin-left: 0; } table .span7 { - width: 39px; + float: none; + width: 169px; + margin-left: 0; } table .span8 { - width: 45px; + float: none; + width: 196px; + margin-left: 0; } table .span9 { - width: 51px; + float: none; + width: 223px; + margin-left: 0; } table .span10 { - width: 57px; + float: none; + width: 250px; + margin-left: 0; } table .span11 { - width: 63px; + float: none; + width: 277px; + margin-left: 0; } table .span12 { - width: 69px; + float: none; + width: 304px; + margin-left: 0; } -table .span13 { - width: 75px; +[class^="icon-"] { + display: inline-block; + width: 14px; + height: 14px; + vertical-align: text-top; + background-image: url(../img/glyphicons-halflings.png); + background-position: 14px 14px; + background-repeat: no-repeat; + *margin-right: .3em; } -table .span14 { - width: 81px; +[class^="icon-"]:last-child { + *margin-left: 0; } -table .span15 { - width: 87px; +.icon-white { + background-image: url(../img/glyphicons-halflings-white.png); } -table .span16 { - width: 93px; +.icon-glass { + background-position: 0 0; } -.zebra-striped tbody tr:nth-child(odd) td, .zebra-striped tbody tr:nth-child(odd) th { - background-color: #f9f9f9; +.icon-music { + background-position: -24px 0; } -.zebra-striped tbody tr:hover td, .zebra-striped tbody tr:hover th { - background-color: #f5f5f5; +.icon-search { + background-position: -48px 0; } -table .header { - cursor: pointer; +.icon-envelope { + background-position: -72px 0; } -table .header:after { - content: ""; - float: right; - margin-top: 7px; - border-width: 0 4px 4px; - border-style: solid; - border-color: #000 transparent; - visibility: hidden; +.icon-heart { + background-position: -96px 0; } -table .headerSortUp, table .headerSortDown { - background-color: rgba(141, 192, 219, 0.25); - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); +.icon-star { + background-position: -120px 0; } -table .header:hover:after { - visibility: visible; +.icon-star-empty { + background-position: -144px 0; } -table .headerSortDown:after, table .headerSortDown:hover:after { - visibility: visible; - filter: alpha(opacity=60); - -khtml-opacity: 0.6; - -moz-opacity: 0.6; - opacity: 0.6; +.icon-user { + background-position: -168px 0; } -table .headerSortUp:after { - border-bottom: none; - border-left: 4px solid transparent; - border-right: 4px solid transparent; - border-top: 4px solid #000; - visibility: visible; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - filter: alpha(opacity=60); - -khtml-opacity: 0.6; - -moz-opacity: 0.6; - opacity: 0.6; +.icon-film { + background-position: -192px 0; } -table .blue { - color: #049cdb; - border-bottom-color: #049cdb; +.icon-th-large { + background-position: -216px 0; } -table .headerSortUp.blue, table .headerSortDown.blue { - background-color: #ade6fe; +.icon-th { + background-position: -240px 0; } -table .green { - color: #46a546; - border-bottom-color: #46a546; +.icon-th-list { + background-position: -264px 0; } -table .headerSortUp.green, table .headerSortDown.green { - background-color: #cdeacd; +.icon-ok { + background-position: -288px 0; } -table .red { - color: #9d261d; - border-bottom-color: #9d261d; +.icon-remove { + background-position: -312px 0; } -table .headerSortUp.red, table .headerSortDown.red { - background-color: #f4c8c5; +.icon-zoom-in { + background-position: -336px 0; } -table .yellow { - color: #ffc40d; - border-bottom-color: #ffc40d; +.icon-zoom-out { + background-position: -360px 0; } -table .headerSortUp.yellow, table .headerSortDown.yellow { - background-color: #fff6d9; +.icon-off { + background-position: -384px 0; } -table .orange { - color: #f89406; - border-bottom-color: #f89406; +.icon-signal { + background-position: -408px 0; } -table .headerSortUp.orange, table .headerSortDown.orange { - background-color: #fee9cc; +.icon-cog { + background-position: -432px 0; } -table .purple { - color: #7a43b6; - border-bottom-color: #7a43b6; +.icon-trash { + background-position: -456px 0; } -table .headerSortUp.purple, table .headerSortDown.purple { - background-color: #e2d5f0; +.icon-home { + background-position: 0 -24px; } -/* Patterns.less - * Repeatable UI elements outside the base styles provided from the scaffolding - * ---------------------------------------------------------------------------- */ -.topbar { - height: 40px; - position: fixed; - top: 0; - left: 0; - right: 0; - z-index: 10000; - overflow: visible; +.icon-file { + background-position: -24px -24px; } -.topbar a { - color: #bfbfbf; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +.icon-time { + background-position: -48px -24px; } -.topbar h3 a:hover, .topbar .brand:hover, .topbar ul .active > a { - background-color: #333; - background-color: rgba(255, 255, 255, 0.05); - color: #ffffff; - text-decoration: none; +.icon-road { + background-position: -72px -24px; } -.topbar h3 { - position: relative; +.icon-download-alt { + background-position: -96px -24px; } -.topbar h3 a, .topbar .brand { - float: left; - display: block; - padding: 8px 20px 12px; - margin-left: -20px; - color: #ffffff; - font-size: 20px; - font-weight: 200; - line-height: 1; +.icon-download { + background-position: -120px -24px; } -.topbar p { - margin: 0; - line-height: 40px; +.icon-upload { + background-position: -144px -24px; } -.topbar p a:hover { - background-color: transparent; - color: #ffffff; +.icon-inbox { + background-position: -168px -24px; } -.topbar form { - float: left; - margin: 5px 0 0 0; - position: relative; - filter: alpha(opacity=100); - -khtml-opacity: 1; - -moz-opacity: 1; - opacity: 1; +.icon-play-circle { + background-position: -192px -24px; } -.topbar form.pull-right { - float: right; +.icon-repeat { + background-position: -216px -24px; } -.topbar input { - background-color: #444; - background-color: rgba(255, 255, 255, 0.3); - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: normal; - font-weight: 13px; - line-height: 1; - padding: 4px 9px; - color: #ffffff; - color: rgba(255, 255, 255, 0.75); - border: 1px solid #111; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.25); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.25); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.25); - -webkit-transition: none; - -moz-transition: none; - -ms-transition: none; - -o-transition: none; - transition: none; +.icon-refresh { + background-position: -240px -24px; } -.topbar input:-moz-placeholder { - color: #e6e6e6; +.icon-list-alt { + background-position: -264px -24px; } -.topbar input::-webkit-input-placeholder { - color: #e6e6e6; +.icon-lock { + background-position: -287px -24px; } -.topbar input:hover { - background-color: #bfbfbf; - background-color: rgba(255, 255, 255, 0.5); - color: #ffffff; +.icon-flag { + background-position: -312px -24px; } -.topbar input:focus, .topbar input.focused { - outline: 0; - background-color: #ffffff; - color: #404040; - text-shadow: 0 1px 0 #ffffff; - border: 0; - padding: 5px 10px; - -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); +.icon-headphones { + background-position: -336px -24px; } -.topbar-inner, .topbar .fill { - background-color: #222; - background-color: #222222; - background-repeat: repeat-x; - background-image: -khtml-gradient(linear, left top, left bottom, from(#333333), to(#222222)); - background-image: -moz-linear-gradient(top, #333333, #222222); - background-image: -ms-linear-gradient(top, #333333, #222222); - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #333333), color-stop(100%, #222222)); - background-image: -webkit-linear-gradient(top, #333333, #222222); - background-image: -o-linear-gradient(top, #333333, #222222); - background-image: linear-gradient(top, #333333, #222222); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); +.icon-volume-off { + background-position: -360px -24px; } -.topbar div > ul, .nav { - display: block; - float: left; - margin: 0 10px 0 0; - position: relative; - left: 0; +.icon-volume-down { + background-position: -384px -24px; } -.topbar div > ul > li, .nav > li { - display: block; - float: left; +.icon-volume-up { + background-position: -408px -24px; } -.topbar div > ul a, .nav a { - display: block; - float: none; - padding: 10px 10px 11px; - line-height: 19px; - text-decoration: none; +.icon-qrcode { + background-position: -432px -24px; } -.topbar div > ul a:hover, .nav a:hover { - color: #ffffff; - text-decoration: none; +.icon-barcode { + background-position: -456px -24px; } -.topbar div > ul .active > a, .nav .active > a { - background-color: #222; - background-color: rgba(0, 0, 0, 0.5); +.icon-tag { + background-position: 0 -48px; } -.topbar div > ul.secondary-nav, .nav.secondary-nav { - float: right; - margin-left: 10px; - margin-right: 0; +.icon-tags { + background-position: -25px -48px; } -.topbar div > ul.secondary-nav .menu-dropdown, -.nav.secondary-nav .menu-dropdown, -.topbar div > ul.secondary-nav .dropdown-menu, -.nav.secondary-nav .dropdown-menu { - right: 0; - border: 0; +.icon-book { + background-position: -48px -48px; } -.topbar div > ul a.menu:hover, -.nav a.menu:hover, -.topbar div > ul li.open .menu, -.nav li.open .menu, -.topbar div > ul .dropdown-toggle:hover, -.nav .dropdown-toggle:hover, -.topbar div > ul .dropdown.open .dropdown-toggle, -.nav .dropdown.open .dropdown-toggle { - background: #444; - background: rgba(255, 255, 255, 0.05); -} -.topbar div > ul .menu-dropdown, -.nav .menu-dropdown, -.topbar div > ul .dropdown-menu, -.nav .dropdown-menu { - background-color: #333; -} -.topbar div > ul .menu-dropdown a.menu, -.nav .menu-dropdown a.menu, -.topbar div > ul .dropdown-menu a.menu, -.nav .dropdown-menu a.menu, -.topbar div > ul .menu-dropdown .dropdown-toggle, -.nav .menu-dropdown .dropdown-toggle, -.topbar div > ul .dropdown-menu .dropdown-toggle, -.nav .dropdown-menu .dropdown-toggle { - color: #ffffff; +.icon-bookmark { + background-position: -72px -48px; } -.topbar div > ul .menu-dropdown a.menu.open, -.nav .menu-dropdown a.menu.open, -.topbar div > ul .dropdown-menu a.menu.open, -.nav .dropdown-menu a.menu.open, -.topbar div > ul .menu-dropdown .dropdown-toggle.open, -.nav .menu-dropdown .dropdown-toggle.open, -.topbar div > ul .dropdown-menu .dropdown-toggle.open, -.nav .dropdown-menu .dropdown-toggle.open { - background: #444; - background: rgba(255, 255, 255, 0.05); -} -.topbar div > ul .menu-dropdown li a, -.nav .menu-dropdown li a, -.topbar div > ul .dropdown-menu li a, -.nav .dropdown-menu li a { - color: #999; - text-shadow: 0 1px 0 rgba(0, 0, 0, 0.5); -} -.topbar div > ul .menu-dropdown li a:hover, -.nav .menu-dropdown li a:hover, -.topbar div > ul .dropdown-menu li a:hover, -.nav .dropdown-menu li a:hover { - background-color: #191919; - background-repeat: repeat-x; - background-image: -khtml-gradient(linear, left top, left bottom, from(#292929), to(#191919)); - background-image: -moz-linear-gradient(top, #292929, #191919); - background-image: -ms-linear-gradient(top, #292929, #191919); - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #292929), color-stop(100%, #191919)); - background-image: -webkit-linear-gradient(top, #292929, #191919); - background-image: -o-linear-gradient(top, #292929, #191919); - background-image: linear-gradient(top, #292929, #191919); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#292929', endColorstr='#191919', GradientType=0); - color: #ffffff; +.icon-print { + background-position: -96px -48px; } -.topbar div > ul .menu-dropdown .active a, -.nav .menu-dropdown .active a, -.topbar div > ul .dropdown-menu .active a, -.nav .dropdown-menu .active a { - color: #ffffff; +.icon-camera { + background-position: -120px -48px; } -.topbar div > ul .menu-dropdown .divider, -.nav .menu-dropdown .divider, -.topbar div > ul .dropdown-menu .divider, -.nav .dropdown-menu .divider { - background-color: #222; - border-color: #444; +.icon-font { + background-position: -144px -48px; } -.topbar ul .menu-dropdown li a, .topbar ul .dropdown-menu li a { - padding: 4px 15px; +.icon-bold { + background-position: -167px -48px; } -li.menu, .dropdown { - position: relative; +.icon-italic { + background-position: -192px -48px; } -a.menu:after, .dropdown-toggle:after { - width: 0; - height: 0; - display: inline-block; - content: "↓"; - text-indent: -99999px; - vertical-align: top; - margin-top: 8px; - margin-left: 4px; - border-left: 4px solid transparent; - border-right: 4px solid transparent; - border-top: 4px solid #ffffff; - filter: alpha(opacity=50); - -khtml-opacity: 0.5; - -moz-opacity: 0.5; - opacity: 0.5; +.icon-text-height { + background-position: -216px -48px; } -.menu-dropdown, .dropdown-menu { - background-color: #ffffff; - float: left; - display: none; - position: absolute; - top: 40px; - z-index: 900; - min-width: 160px; - max-width: 220px; - _width: 160px; - margin-left: 0; - margin-right: 0; - padding: 6px 0; - zoom: 1; - border-color: #999; - border-color: rgba(0, 0, 0, 0.2); - border-style: solid; - border-width: 0 1px 1px; - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; - -webkit-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; +.icon-text-width { + background-position: -240px -48px; } -.menu-dropdown li, .dropdown-menu li { - float: none; - display: block; - background-color: none; +.icon-align-left { + background-position: -264px -48px; } -.menu-dropdown .divider, .dropdown-menu .divider { - height: 1px; - margin: 5px 0; - overflow: hidden; - background-color: #eee; - border-bottom: 1px solid #ffffff; +.icon-align-center { + background-position: -288px -48px; } -.topbar .dropdown-menu a, .dropdown-menu a { - display: block; - padding: 4px 15px; - clear: both; - font-weight: normal; - line-height: 18px; - color: #808080; - text-shadow: 0 1px 0 #ffffff; +.icon-align-right { + background-position: -312px -48px; } -.topbar .dropdown-menu a:hover, -.dropdown-menu a:hover, -.topbar .dropdown-menu a.hover, -.dropdown-menu a.hover { - background-color: #dddddd; - background-repeat: repeat-x; - background-image: -khtml-gradient(linear, left top, left bottom, from(#eeeeee), to(#dddddd)); - background-image: -moz-linear-gradient(top, #eeeeee, #dddddd); - background-image: -ms-linear-gradient(top, #eeeeee, #dddddd); - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #eeeeee), color-stop(100%, #dddddd)); - background-image: -webkit-linear-gradient(top, #eeeeee, #dddddd); - background-image: -o-linear-gradient(top, #eeeeee, #dddddd); - background-image: linear-gradient(top, #eeeeee, #dddddd); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#dddddd', GradientType=0); - color: #404040; - text-decoration: none; - -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px rgba(0, 0, 0, 0.025); - -moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px rgba(0, 0, 0, 0.025); - box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px rgba(0, 0, 0, 0.025); +.icon-align-justify { + background-position: -336px -48px; } -.open .menu, -.dropdown.open .menu, -.open .dropdown-toggle, -.dropdown.open .dropdown-toggle { - color: #ffffff; - background: #ccc; - background: rgba(0, 0, 0, 0.3); +.icon-list { + background-position: -360px -48px; } -.open .menu-dropdown, -.dropdown.open .menu-dropdown, -.open .dropdown-menu, -.dropdown.open .dropdown-menu { - display: block; +.icon-indent-left { + background-position: -384px -48px; } -.tabs, .pills { - margin: 0 0 18px; - padding: 0; - list-style: none; - zoom: 1; +.icon-indent-right { + background-position: -408px -48px; } -.tabs:before, -.pills:before, -.tabs:after, -.pills:after { - display: table; - content: ""; - zoom: 1; +.icon-facetime-video { + background-position: -432px -48px; } -.tabs:after, .pills:after { - clear: both; +.icon-picture { + background-position: -456px -48px; } -.tabs > li, .pills > li { - float: left; +.icon-pencil { + background-position: 0 -72px; } -.tabs > li > a, .pills > li > a { - display: block; +.icon-map-marker { + background-position: -24px -72px; } -.tabs { - border-color: #ddd; - border-style: solid; - border-width: 0 0 1px; +.icon-adjust { + background-position: -48px -72px; } -.tabs > li { - position: relative; - margin-bottom: -1px; +.icon-tint { + background-position: -72px -72px; } -.tabs > li > a { - padding: 0 15px; - margin-right: 2px; - line-height: 34px; - border: 1px solid transparent; - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; +.icon-edit { + background-position: -96px -72px; } -.tabs > li > a:hover { - text-decoration: none; - background-color: #eee; - border-color: #eee #eee #ddd; +.icon-share { + background-position: -120px -72px; } -.tabs .active > a, .tabs .active > a:hover { - color: #808080; - background-color: #ffffff; - border: 1px solid #ddd; - border-bottom-color: transparent; - cursor: default; +.icon-check { + background-position: -144px -72px; } -.tabs .menu-dropdown, .tabs .dropdown-menu { - top: 35px; - border-width: 1px; - -webkit-border-radius: 0 6px 6px 6px; - -moz-border-radius: 0 6px 6px 6px; - border-radius: 0 6px 6px 6px; +.icon-move { + background-position: -168px -72px; } -.tabs a.menu:after, .tabs .dropdown-toggle:after { - border-top-color: #999; - margin-top: 15px; - margin-left: 5px; +.icon-step-backward { + background-position: -192px -72px; } -.tabs li.open.menu .menu, .tabs .open.dropdown .dropdown-toggle { - border-color: #999; +.icon-fast-backward { + background-position: -216px -72px; } -.tabs li.open a.menu:after, .tabs .dropdown.open .dropdown-toggle:after { - border-top-color: #555; +.icon-backward { + background-position: -240px -72px; } -.pills a { - margin: 5px 3px 5px 0; - padding: 0 15px; - line-height: 30px; - text-shadow: 0 1px 1px #ffffff; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; +.icon-play { + background-position: -264px -72px; } -.pills a:hover { - color: #ffffff; - text-decoration: none; - text-shadow: 0 1px 1px rgba(0, 0, 0, 0.25); - background-color: #00438a; +.icon-pause { + background-position: -288px -72px; } -.pills .active a { - color: #ffffff; - text-shadow: 0 1px 1px rgba(0, 0, 0, 0.25); - background-color: #0069d6; +.icon-stop { + background-position: -312px -72px; } -.pills-vertical > li { - float: none; +.icon-forward { + background-position: -336px -72px; } -.tab-content > .tab-pane, -.pill-content > .pill-pane, -.tab-content > div, -.pill-content > div { - display: none; +.icon-fast-forward { + background-position: -360px -72px; } -.tab-content > .active, .pill-content > .active { - display: block; +.icon-step-forward { + background-position: -384px -72px; } -.breadcrumb { - padding: 7px 14px; - margin: 0 0 18px; - background-color: #f5f5f5; - background-repeat: repeat-x; - background-image: -khtml-gradient(linear, left top, left bottom, from(#ffffff), to(#f5f5f5)); - background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5); - background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5); - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #f5f5f5)); - background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5); - background-image: -o-linear-gradient(top, #ffffff, #f5f5f5); - background-image: linear-gradient(top, #ffffff, #f5f5f5); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0); - border: 1px solid #ddd; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; +.icon-eject { + background-position: -408px -72px; } -.breadcrumb li { - display: inline; - text-shadow: 0 1px 0 #ffffff; +.icon-chevron-left { + background-position: -432px -72px; } -.breadcrumb .divider { - padding: 0 5px; - color: #bfbfbf; +.icon-chevron-right { + background-position: -456px -72px; } -.breadcrumb .active a { - color: #404040; +.icon-plus-sign { + background-position: 0 -96px; } -.hero-unit { - background-color: #f5f5f5; - margin-bottom: 30px; - padding: 60px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; +.icon-minus-sign { + background-position: -24px -96px; } -.hero-unit h1 { - margin-bottom: 0; - font-size: 60px; - line-height: 1; - letter-spacing: -1px; +.icon-remove-sign { + background-position: -48px -96px; } -.hero-unit p { - font-size: 18px; - font-weight: 200; - line-height: 27px; +.icon-ok-sign { + background-position: -72px -96px; } -footer { - margin-top: 17px; - padding-top: 17px; - border-top: 1px solid #eee; +.icon-question-sign { + background-position: -96px -96px; } -.page-header { - margin-bottom: 17px; - border-bottom: 1px solid #ddd; - -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - -moz-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +.icon-info-sign { + background-position: -120px -96px; } -.page-header h1 { - margin-bottom: 8px; -} -.btn.danger, -.alert-message.danger, -.btn.danger:hover, -.alert-message.danger:hover, -.btn.error, -.alert-message.error, -.btn.error:hover, -.alert-message.error:hover, -.btn.success, -.alert-message.success, -.btn.success:hover, -.alert-message.success:hover, -.btn.info, -.alert-message.info, -.btn.info:hover, -.alert-message.info:hover { - color: #ffffff; +.icon-screenshot { + background-position: -144px -96px; } -.btn .close, .alert-message .close { - font-family: Arial, sans-serif; - line-height: 18px; +.icon-remove-circle { + background-position: -168px -96px; } -.btn.danger, -.alert-message.danger, -.btn.error, -.alert-message.error { - background-color: #c43c35; - background-repeat: repeat-x; - background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35)); - background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: linear-gradient(top, #ee5f5b, #c43c35); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - border-color: #c43c35 #c43c35 #882a25; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); +.icon-ok-circle { + background-position: -192px -96px; } -.btn.success, .alert-message.success { - background-color: #57a957; - background-repeat: repeat-x; - background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957)); - background-image: -moz-linear-gradient(top, #62c462, #57a957); - background-image: -ms-linear-gradient(top, #62c462, #57a957); - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957)); - background-image: -webkit-linear-gradient(top, #62c462, #57a957); - background-image: -o-linear-gradient(top, #62c462, #57a957); - background-image: linear-gradient(top, #62c462, #57a957); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0); - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - border-color: #57a957 #57a957 #3d773d; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); +.icon-ban-circle { + background-position: -216px -96px; } -.btn.info, .alert-message.info { - background-color: #339bb9; - background-repeat: repeat-x; - background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9)); - background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); - background-image: -ms-linear-gradient(top, #5bc0de, #339bb9); - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9)); - background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); - background-image: -o-linear-gradient(top, #5bc0de, #339bb9); - background-image: linear-gradient(top, #5bc0de, #339bb9); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0); - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - border-color: #339bb9 #339bb9 #22697d; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); +.icon-arrow-left { + background-position: -240px -96px; } -.btn { - cursor: pointer; - display: inline-block; - background-color: #e6e6e6; - background-repeat: no-repeat; - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6)); - background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); - background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6); - background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); - background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); - background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); - padding: 5px 14px 6px; - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - color: #333; - font-size: 13px; - line-height: normal; - border: 1px solid #ccc; - border-bottom-color: #bbb; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -webkit-transition: 0.1s linear all; - -moz-transition: 0.1s linear all; - -ms-transition: 0.1s linear all; - -o-transition: 0.1s linear all; - transition: 0.1s linear all; +.icon-arrow-right { + background-position: -264px -96px; } -.btn:hover { - background-position: 0 -15px; - color: #333; - text-decoration: none; +.icon-arrow-up { + background-position: -289px -96px; } -.btn:focus { - outline: 1px dotted #666; +.icon-arrow-down { + background-position: -312px -96px; } -.btn.primary { - color: #ffffff; - background-color: #0064cd; - background-repeat: repeat-x; - background-image: -khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd)); - background-image: -moz-linear-gradient(top, #049cdb, #0064cd); - background-image: -ms-linear-gradient(top, #049cdb, #0064cd); - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd)); - background-image: -webkit-linear-gradient(top, #049cdb, #0064cd); - background-image: -o-linear-gradient(top, #049cdb, #0064cd); - background-image: linear-gradient(top, #049cdb, #0064cd); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0); - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - border-color: #0064cd #0064cd #003f81; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); +.icon-share-alt { + background-position: -336px -96px; } -.btn.active, .btn:active { - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); +.icon-resize-full { + background-position: -360px -96px; } -.btn.disabled { - cursor: default; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - filter: alpha(opacity=65); - -khtml-opacity: 0.65; - -moz-opacity: 0.65; - opacity: 0.65; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; +.icon-resize-small { + background-position: -384px -96px; } -.btn[disabled] { - cursor: default; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - filter: alpha(opacity=65); - -khtml-opacity: 0.65; - -moz-opacity: 0.65; - opacity: 0.65; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; +.icon-plus { + background-position: -408px -96px; } -.btn.large { - font-size: 15px; - line-height: normal; - padding: 9px 14px 9px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; +.icon-minus { + background-position: -433px -96px; } -.btn.small { - padding: 7px 9px 7px; - font-size: 11px; +.icon-asterisk { + background-position: -456px -96px; } -:root .alert-message, :root .btn { - border-radius: 0 \0; +.icon-exclamation-sign { + background-position: 0 -120px; } -button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner { - padding: 0; - border: 0; +.icon-gift { + background-position: -24px -120px; } -.close { - float: right; - color: #000000; - font-size: 20px; - font-weight: bold; - line-height: 13.5px; - text-shadow: 0 1px 0 #ffffff; - filter: alpha(opacity=25); - -khtml-opacity: 0.25; - -moz-opacity: 0.25; - opacity: 0.25; +.icon-leaf { + background-position: -48px -120px; } -.close:hover { - color: #000000; - text-decoration: none; - filter: alpha(opacity=40); - -khtml-opacity: 0.4; - -moz-opacity: 0.4; - opacity: 0.4; +.icon-fire { + background-position: -72px -120px; } -.alert-message { - position: relative; - padding: 7px 15px; - margin-bottom: 18px; - color: #404040; - background-color: #eedc94; - background-repeat: repeat-x; - background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94)); - background-image: -moz-linear-gradient(top, #fceec1, #eedc94); - background-image: -ms-linear-gradient(top, #fceec1, #eedc94); - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94)); - background-image: -webkit-linear-gradient(top, #fceec1, #eedc94); - background-image: -o-linear-gradient(top, #fceec1, #eedc94); - background-image: linear-gradient(top, #fceec1, #eedc94); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0); - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - border-color: #eedc94 #eedc94 #e4c652; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - border-width: 1px; - border-style: solid; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); +.icon-eye-open { + background-position: -96px -120px; } -.alert-message .close { - margin-top: 1px; - *margin-top: 0; +.icon-eye-close { + background-position: -120px -120px; } -.alert-message a { - font-weight: bold; - color: #404040; +.icon-warning-sign { + background-position: -144px -120px; } -.alert-message.danger p a, -.alert-message.error p a, -.alert-message.success p a, -.alert-message.info p a { - color: #ffffff; +.icon-plane { + background-position: -168px -120px; } -.alert-message h5 { - line-height: 18px; +.icon-calendar { + background-position: -192px -120px; } -.alert-message p { - margin-bottom: 0; +.icon-random { + background-position: -216px -120px; } -.alert-message div { - margin-top: 5px; - margin-bottom: 2px; - line-height: 28px; +.icon-comment { + background-position: -240px -120px; } -.alert-message .btn { - -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); - -moz-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); - box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); +.icon-magnet { + background-position: -264px -120px; } -.alert-message.block-message { - background-image: none; - background-color: #fdf5d9; - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - padding: 14px; - border-color: #fceec1; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; +.icon-chevron-up { + background-position: -288px -120px; } -.alert-message.block-message ul, .alert-message.block-message p { - margin-right: 30px; +.icon-chevron-down { + background-position: -313px -119px; } -.alert-message.block-message ul { - margin-bottom: 0; +.icon-retweet { + background-position: -336px -120px; } -.alert-message.block-message li { - color: #404040; +.icon-shopping-cart { + background-position: -360px -120px; } -.alert-message.block-message .alert-actions { - margin-top: 5px; +.icon-folder-close { + background-position: -384px -120px; } -.alert-message.block-message.error, .alert-message.block-message.success, .alert-message.block-message.info { - color: #404040; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +.icon-folder-open { + background-position: -408px -120px; } -.alert-message.block-message.error { - background-color: #fddfde; - border-color: #fbc7c6; +.icon-resize-vertical { + background-position: -432px -119px; } -.alert-message.block-message.success { - background-color: #d1eed1; - border-color: #bfe7bf; +.icon-resize-horizontal { + background-position: -456px -118px; } -.alert-message.block-message.info { - background-color: #ddf4fb; - border-color: #c6edf9; +.dropdown { + position: relative; } -.alert-message.block-message.danger p a, -.alert-message.block-message.error p a, -.alert-message.block-message.success p a, -.alert-message.block-message.info p a { - color: #404040; +.dropdown-toggle { + *margin-bottom: -3px; } -.pagination { - height: 36px; - margin: 18px 0; +.dropdown-toggle:active, .open .dropdown-toggle { + outline: 0; } -.pagination ul { +.caret { + display: inline-block; + width: 0; + height: 0; + text-indent: -99999px; + *text-indent: 0; + vertical-align: top; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 4px solid #000000; + opacity: 0.3; + filter: alpha(opacity=30); + content: "\2193"; +} +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} +.dropdown:hover .caret, .open.dropdown .caret { + opacity: 1; + filter: alpha(opacity=100); +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; float: left; + display: none; + min-width: 160px; + max-width: 220px; + _width: 160px; + padding: 4px 0; margin: 0; - border: 1px solid #ddd; - border: 1px solid rgba(0, 0, 0, 0.15); - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + list-style: none; + background-color: #ffffff; + border-color: #ccc; + border-color: rgba(0, 0, 0, 0.2); + border-style: solid; + border-width: 1px; + -webkit-border-radius: 0 0 5px 5px; + -moz-border-radius: 0 0 5px 5px; + border-radius: 0 0 5px 5px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + *border-right-width: 2px; + *border-bottom-width: 2px; } -.pagination li { - display: inline; +.dropdown-menu.bottom-up { + top: auto; + bottom: 100%; + margin-bottom: 2px; } -.pagination a { - float: left; - padding: 0 14px; - line-height: 34px; - border-right: 1px solid; - border-right-color: #ddd; - border-right-color: rgba(0, 0, 0, 0.15); - *border-right-color: #ddd; - /* IE6-7 */ - +.dropdown-menu .divider { + height: 1px; + margin: 5px 1px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; + *width: 100%; + *margin: -5px 0 5px; +} +.dropdown-menu a { + display: block; + padding: 3px 15px; + clear: both; + font-weight: normal; + line-height: 18px; + color: #555555; + white-space: nowrap; +} +.dropdown-menu li > a:hover, .dropdown-menu .active > a, .dropdown-menu .active > a:hover { + color: #ffffff; text-decoration: none; + background-color: #0088cc; +} +.dropdown.open { + *z-index: 1000; +} +.dropdown.open .dropdown-toggle { + color: #ffffff; + background: #ccc; + background: rgba(0, 0, 0, 0.3); +} +.dropdown.open .dropdown-menu { + display: block; +} +.typeahead { + 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 #eee; + border: 1px solid rgba(0, 0, 0, 0.05); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} +.fade { + -webkit-transition: opacity 0.15s linear; + -moz-transition: opacity 0.15s linear; + -ms-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; + opacity: 0; +} +.fade.in { + opacity: 1; +} +.collapse { + -webkit-transition: height 0.35s ease; + -moz-transition: height 0.35s ease; + -ms-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; + position: relative; + overflow: hidden; + height: 0; +} +.collapse.in { + height: auto; +} +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 18px; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} +.close:hover { + color: #000000; + text-decoration: none; + opacity: 0.4; + filter: alpha(opacity=40); + cursor: pointer; +} +.btn { + display: inline-block; + padding: 4px 10px 4px; + font-size: 13px; + line-height: 18px; + color: #333333; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + background-color: #fafafa; + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); + background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6); + background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); + background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); + background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); + background-repeat: no-repeat; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); + border: 1px solid #ccc; + border-bottom-color: #bbb; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + cursor: pointer; + *margin-left: .3em; +} +.btn:first-child { + *margin-left: 0; +} +.btn:hover { + color: #333333; + text-decoration: none; + background-color: #e6e6e6; + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -ms-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} +.btn:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn.active, .btn:active { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + background-color: #e6e6e6; + background-color: #d9d9d9 \9; + color: rgba(0, 0, 0, 0.5); + outline: 0; +} +.btn.disabled, .btn[disabled] { + cursor: default; + background-image: none; + background-color: #e6e6e6; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.btn-large { + padding: 9px 14px; + font-size: 15px; + line-height: normal; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +.btn-large .icon { + margin-top: 1px; +} +.btn-small { + padding: 5px 9px; + font-size: 11px; + line-height: 16px; +} +.btn-small .icon { + margin-top: -1px; +} +.btn-primary, +.btn-primary:hover, +.btn-warning, +.btn-warning:hover, +.btn-danger, +.btn-danger:hover, +.btn-success, +.btn-success:hover, +.btn-info, +.btn-info:hover { + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + color: #ffffff; +} +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active { + color: rgba(255, 255, 255, 0.75); +} +.btn-primary { + background-color: #006dcc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -ms-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(top, #0088cc, #0044cc); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-primary:hover, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + background-color: #0044cc; +} +.btn-primary:active, .btn-primary.active { + background-color: #003399 \9; +} +.btn-warning { + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -ms-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(top, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-warning:hover, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + background-color: #f89406; +} +.btn-warning:active, .btn-warning.active { + background-color: #c67605 \9; +} +.btn-danger { + background-color: #da4f49; + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -ms-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(top, #ee5f5b, #bd362f); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0); + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-danger:hover, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + background-color: #bd362f; +} +.btn-danger:active, .btn-danger.active { + background-color: #942a25 \9; +} +.btn-success { + background-color: #5bb75b; + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-image: -ms-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(top, #62c462, #51a351); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0); + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-success:hover, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + background-color: #51a351; +} +.btn-success:active, .btn-success.active { + background-color: #408140 \9; +} +.btn-info { + background-color: #49afcd; + background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -ms-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(top, #5bc0de, #2f96b4); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0); + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-info:hover, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + background-color: #2f96b4; +} +.btn-info:active, .btn-info.active { + background-color: #24748c \9; +} +button.btn, input[type="submit"].btn { + *padding-top: 2px; + *padding-bottom: 2px; +} +button.btn::-moz-focus-inner, input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} +button.btn.large, input[type="submit"].btn.large { + *padding-top: 7px; + *padding-bottom: 7px; +} +button.btn.small, input[type="submit"].btn.small { + *padding-top: 3px; + *padding-bottom: 3px; +} +.btn-group { + position: relative; + *zoom: 1; + *margin-left: .3em; +} +.btn-group:before, .btn-group:after { + display: table; + content: ""; +} +.btn-group:after { + clear: both; +} +.btn-group:first-child { + *margin-left: 0; +} +.btn-group + .btn-group { + margin-left: 5px; +} +.btn-toolbar { + margin-top: 9px; + margin-bottom: 9px; +} +.btn-toolbar .btn-group { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} +.btn-group .btn { + position: relative; + float: left; + margin-left: -1px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.btn-group .btn:first-child { + margin-left: 0; + -webkit-border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; + border-top-left-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + border-bottom-left-radius: 4px; +} +.btn-group .btn:last-child, .btn-group .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; + border-bottom-right-radius: 4px; +} +.btn-group .btn.large:first-child { + margin-left: 0; + -webkit-border-top-left-radius: 6px; + -moz-border-radius-topleft: 6px; + border-top-left-radius: 6px; + -webkit-border-bottom-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + border-bottom-left-radius: 6px; +} +.btn-group .btn.large:last-child, .btn-group .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + -moz-border-radius-topright: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + -moz-border-radius-bottomright: 6px; + border-bottom-right-radius: 6px; +} +.btn-group .btn:hover, +.btn-group .btn:focus, +.btn-group .btn:active, +.btn-group .btn.active { + z-index: 2; +} +.btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + *padding-top: 5px; + *padding-bottom: 5px; +} +.btn-group.open { + *z-index: 1000; +} +.btn-group.open .dropdown-menu { + display: block; + margin-top: 1px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} +.btn .caret { + margin-top: 7px; + margin-left: 0; +} +.btn:hover .caret, .open.btn-group .caret { + opacity: 1; + filter: alpha(opacity=100); +} +.btn-primary .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret { + border-top-color: #ffffff; + opacity: 0.75; + filter: alpha(opacity=75); +} +.btn-small .caret { + margin-top: 4px; +} +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 18px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcf8e3; + border: 1px solid #fbeed5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.alert, .alert-heading { + color: #c09853; +} +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 18px; +} +.alert-success { + background-color: #dff0d8; + border-color: #d6e9c6; +} +.alert-success, .alert-success .alert-heading { + color: #468847; +} +.alert-danger, .alert-error { + background-color: #f2dede; + border-color: #eed3d7; +} +.alert-danger, +.alert-error, +.alert-danger .alert-heading, +.alert-error .alert-heading { + color: #b94a48; +} +.alert-info { + background-color: #d9edf7; + border-color: #bce8f1; +} +.alert-info, .alert-info .alert-heading { + 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-left: 0; + margin-bottom: 18px; + list-style: none; +} +.nav > li > a { + display: block; +} +.nav > li > a:hover { + text-decoration: none; + background-color: #eeeeee; +} +.nav-list { + padding-left: 14px; + padding-right: 14px; + margin-bottom: 0; +} +.nav-list > li > a, .nav-list .nav-header { + display: block; + padding: 3px 15px; + margin-left: -15px; + margin-right: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} +.nav-list .nav-header { + font-size: 11px; + font-weight: bold; + line-height: 18px; + color: #999999; + text-transform: uppercase; +} +.nav-list > li + .nav-header { + margin-top: 9px; +} +.nav-list .active > a, .nav-list .active > a:hover { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #0088cc; +} +.nav-list [class^="icon-"] { + margin-right: 2px; +} +.nav-tabs, .nav-pills { + *zoom: 1; +} +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + content: ""; +} +.nav-tabs:after, .nav-pills:after { + clear: both; +} +.nav-tabs > li, .nav-pills > li { + float: left; +} +.nav-tabs > li > a, .nav-pills > 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: 9px; + padding-bottom: 9px; + 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:hover { + border-color: #eeeeee #eeeeee #dddddd; +} +.nav-tabs > .active > a, .nav-tabs > .active > a:hover { + color: #555555; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; + cursor: default; +} +.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:hover { + color: #ffffff; + background-color: #0088cc; +} +.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-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} +.nav-tabs.nav-stacked > li:last-child > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} +.nav-tabs.nav-stacked > li > a:hover { + border-color: #ddd; + z-index: 2; +} +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} +.nav-tabs .dropdown-menu, .nav-pills .dropdown-menu { + margin-top: 1px; + border-width: 1px; +} +.nav-pills .dropdown-menu { + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.nav-tabs .dropdown-toggle .caret, .nav-pills .dropdown-toggle .caret { + border-top-color: #0088cc; + margin-top: 6px; +} +.nav-tabs .dropdown-toggle:hover .caret, .nav-pills .dropdown-toggle:hover .caret { + border-top-color: #005580; +} +.nav-tabs .active .dropdown-toggle .caret, .nav-pills .active .dropdown-toggle .caret { + border-top-color: #333333; +} +.nav > .dropdown.active > a:hover { + color: #000000; + cursor: pointer; +} +.nav-tabs .open .dropdown-toggle, .nav-pills .open .dropdown-toggle, .nav > .open.active > a:hover { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} +.nav .open .caret, .nav .open.active .caret, .nav .open a:hover .caret { + border-top-color: #ffffff; + opacity: 1; + filter: alpha(opacity=100); +} +.tabs-stacked .open > a:hover { + border-color: #999999; +} +.tabbable { + *zoom: 1; +} +.tabbable:before, .tabbable:after { + display: table; + content: ""; +} +.tabbable:after { + clear: both; +} +.tabs-below .nav-tabs, .tabs-right .nav-tabs, .tabs-left .nav-tabs { + border-bottom: 0; +} +.tab-content > .tab-pane, .pill-content > .pill-pane { + display: none; +} +.tab-content > .active, .pill-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:hover { + border-bottom-color: transparent; + border-top-color: #ddd; +} +.tabs-below .nav-tabs .active > a, .tabs-below .nav-tabs .active > a:hover { + border-color: transparent #ddd #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:hover { + border-color: #eeeeee #dddddd #eeeeee #eeeeee; +} +.tabs-left .nav-tabs .active > a, .tabs-left .nav-tabs .active > a:hover { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} +.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:hover { + border-color: #eeeeee #eeeeee #eeeeee #dddddd; +} +.tabs-right .nav-tabs .active > a, .tabs-right .nav-tabs .active > a:hover { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} +.navbar { + overflow: visible; + margin-bottom: 18px; +} +.navbar-inner { + padding-left: 20px; + padding-right: 20px; + background-color: #2c2c2c; + background-image: -moz-linear-gradient(top, #333333, #222222); + background-image: -ms-linear-gradient(top, #333333, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); + background-image: -webkit-linear-gradient(top, #333333, #222222); + background-image: -o-linear-gradient(top, #333333, #222222); + background-image: linear-gradient(top, #333333, #222222); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); +} +.btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-left: 5px; + margin-right: 5px; + background-color: #2c2c2c; + background-image: -moz-linear-gradient(top, #333333, #222222); + background-image: -ms-linear-gradient(top, #333333, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); + background-image: -webkit-linear-gradient(top, #333333, #222222); + background-image: -o-linear-gradient(top, #333333, #222222); + background-image: linear-gradient(top, #333333, #222222); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); +} +.btn-navbar:hover, +.btn-navbar:active, +.btn-navbar.active, +.btn-navbar.disabled, +.btn-navbar[disabled] { + background-color: #222222; +} +.btn-navbar:active, .btn-navbar.active { + background-color: #080808 \9; +} +.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, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} +.nav-collapse.collapse { + height: auto; +} +.navbar .brand:hover { + text-decoration: none; +} +.navbar .brand { + float: left; + display: block; + padding: 8px 20px 12px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + line-height: 1; + color: #ffffff; +} +.navbar .navbar-text { + margin-bottom: 0; + line-height: 40px; + color: #999999; +} +.navbar .navbar-text a:hover { + color: #ffffff; + background-color: transparent; +} +.navbar .btn, .navbar .btn-group { + margin-top: 5px; +} +.navbar .btn-group .btn { + margin-top: 0; +} +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} +.navbar-form:before, .navbar-form:after { + display: table; + content: ""; +} +.navbar-form:after { + clear: both; +} +.navbar-form input, .navbar-form select { + display: inline-block; + margin-top: 5px; + margin-bottom: 0; +} +.navbar-form .radio, .navbar-form .checkbox { + margin-top: 5px; +} +.navbar-form input[type="image"], .navbar-form input[type="checkbox"], .navbar-form input[type="radio"] { + margin-top: 3px; +} +.navbar-search { + position: relative; + float: left; + margin-top: 6px; + margin-bottom: 0; +} +.navbar-search .search-query { + padding: 4px 9px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + color: #ffffff; + color: rgba(255, 255, 255, 0.75); + background: #666; + background: rgba(255, 255, 255, 0.3); + border: 1px solid #111; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15); + -webkit-transition: none; + -moz-transition: none; + -ms-transition: none; + -o-transition: none; + transition: none; +} +.navbar-search .search-query :-moz-placeholder { + color: #eeeeee; +} +.navbar-search .search-query::-webkit-input-placeholder { + color: #eeeeee; +} +.navbar-search .search-query:hover { + color: #ffffff; + background-color: #999999; + background-color: rgba(255, 255, 255, 0.5); +} +.navbar-search .search-query:focus, .navbar-search .search-query.focused { + padding: 5px 10px; + color: #333333; + text-shadow: 0 1px 0 #ffffff; + background-color: #ffffff; + border: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + outline: 0; +} +.navbar-fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; +} +.navbar-fixed-top .navbar-inner { + padding-left: 0; + padding-right: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} +.navbar .nav.pull-right { + float: right; +} +.navbar .nav > li { + display: block; + float: left; +} +.navbar .nav > li > a { + float: none; + padding: 10px 10px 11px; + line-height: 19px; + color: #999999; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.navbar .nav > li > a:hover { + background-color: transparent; + color: #ffffff; + text-decoration: none; +} +.navbar .nav .active > a, .navbar .nav .active > a:hover { + color: #ffffff; + text-decoration: none; + background-color: #222222; + background-color: rgba(0, 0, 0, 0.5); +} +.navbar .divider-vertical { + height: 40px; + width: 1px; + margin: 0 9px; + overflow: hidden; + background-color: #222222; + border-right: 1px solid #333333; +} +.navbar .nav.pull-right { + margin-left: 10px; + margin-right: 0; +} +.navbar .dropdown-menu { + margin-top: 1px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.navbar .dropdown-menu:before { + content: ''; + display: inline-block; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-bottom-color: rgba(0, 0, 0, 0.2); + position: absolute; + top: -7px; + left: 9px; +} +.navbar .dropdown-menu:after { + content: ''; + display: inline-block; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + position: absolute; + top: -6px; + left: 10px; +} +.navbar .nav .dropdown-toggle .caret, .navbar .nav .open.dropdown .caret { + border-top-color: #ffffff; +} +.navbar .nav .active .caret { + opacity: 1; + filter: alpha(opacity=100); +} +.navbar .nav .open > .dropdown-toggle, .navbar .nav .active > .dropdown-toggle, .navbar .nav .open.active > .dropdown-toggle { + background-color: transparent; +} +.navbar .nav .active > .dropdown-toggle:hover { + color: #ffffff; +} +.navbar .nav.pull-right .dropdown-menu { + left: auto; + right: 0; +} +.navbar .nav.pull-right .dropdown-menu:before { + left: auto; + right: 12px; +} +.navbar .nav.pull-right .dropdown-menu:after { + left: auto; + right: 13px; +} +.breadcrumb { + padding: 7px 14px; + margin: 0 0 18px; + background-color: #fbfbfb; + background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5)); + background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -o-linear-gradient(top, #ffffff, #f5f5f5); + background-image: linear-gradient(top, #ffffff, #f5f5f5); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0); + border: 1px solid #ddd; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} +.breadcrumb li { + display: inline; + text-shadow: 0 1px 0 #ffffff; +} +.breadcrumb .divider { + padding: 0 5px; + color: #999999; +} +.breadcrumb .active a { + color: #333333; +} +.pagination { + height: 36px; + margin: 18px 0; +} +.pagination ul { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + margin-left: 0; + margin-bottom: 0; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} +.pagination li { + display: inline; +} +.pagination a { + float: left; + padding: 0 14px; + line-height: 34px; + text-decoration: none; + border: 1px solid #ddd; + border-left-width: 0; +} +.pagination a:hover, .pagination .active a { + background-color: #f5f5f5; +} +.pagination .active a { + color: #999999; + cursor: default; +} +.pagination .disabled a, .pagination .disabled a:hover { + color: #999999; + background-color: transparent; + cursor: default; +} +.pagination li:first-child a { + border-left-width: 1px; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} +.pagination li:last-child a { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} +.pagination-centered { + text-align: center; +} +.pagination-right { + text-align: right; +} +.pager { + margin-left: 0; + margin-bottom: 18px; + list-style: none; + text-align: center; + *zoom: 1; +} +.pager:before, .pager:after { + display: table; + content: ""; +} +.pager:after { + clear: both; +} +.pager li { + display: inline; +} +.pager a { + 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 a:hover { + text-decoration: none; + background-color: #f5f5f5; +} +.pager .next a { + float: right; } -.pagination a:hover, .pagination .active a { - background-color: #c7eefe; +.pager .previous a { + float: left; } -.pagination .disabled a, .pagination .disabled a:hover { - background-color: transparent; - color: #bfbfbf; +.modal-open .dropdown-menu { + z-index: 2050; } -.pagination .next a { - border: 0; +.modal-open .dropdown.open { + *z-index: 2050; } -.well { - background-color: #f5f5f5; - margin-bottom: 20px; - padding: 19px; - min-height: 20px; - border: 1px solid #eee; - border: 1px solid rgba(0, 0, 0, 0.05); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +.modal-open .popover { + z-index: 2060; } -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); +.modal-open .tooltip { + z-index: 2070; } .modal-backdrop { - background-color: #000000; position: fixed; top: 0; - left: 0; right: 0; bottom: 0; - z-index: 10000; + left: 0; + z-index: 1040; + background-color: #000000; } .modal-backdrop.fade { opacity: 0; } .modal-backdrop, .modal-backdrop.fade.in { - filter: alpha(opacity=80); - -khtml-opacity: 0.8; - -moz-opacity: 0.8; opacity: 0.8; + filter: alpha(opacity=80); } .modal { position: fixed; top: 50%; left: 50%; - z-index: 11000; + z-index: 1050; + max-height: 500px; + overflow: auto; width: 560px; margin: -250px 0 0 -280px; background-color: #ffffff; @@ -2195,9 +2789,6 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner { -moz-background-clip: padding-box; background-clip: padding-box; } -.modal .close { - margin-top: 7px; -} .modal.fade { -webkit-transition: opacity .3s linear, top .3s ease-out; -moz-transition: opacity .3s linear, top .3s ease-out; @@ -2210,18 +2801,19 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner { top: 50%; } .modal-header { + padding: 9px 15px; border-bottom: 1px solid #eee; - padding: 5px 15px; +} +.modal-header .close { + margin-top: 2px; } .modal-body { padding: 15px; } -.modal-body form { - margin-bottom: 0; -} .modal-footer { - background-color: #f5f5f5; padding: 14px 15px 15px; + margin-bottom: 0; + background-color: #f5f5f5; border-top: 1px solid #ddd; -webkit-border-radius: 0 0 6px 6px; -moz-border-radius: 0 0 6px 6px; @@ -2229,13 +2821,11 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner { -webkit-box-shadow: inset 0 1px 0 #ffffff; -moz-box-shadow: inset 0 1px 0 #ffffff; box-shadow: inset 0 1px 0 #ffffff; - zoom: 1; - margin-bottom: 0; + *zoom: 1; } .modal-footer:before, .modal-footer:after { display: table; content: ""; - zoom: 1; } .modal-footer:after { clear: both; @@ -2243,29 +2833,35 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner { .modal-footer .btn { float: right; margin-left: 5px; + margin-bottom: 0; } -.modal .popover, .modal .twipsy { - z-index: 12000; -} -.twipsy { - display: block; +.tooltip { position: absolute; + z-index: 1020; + display: block; visibility: visible; padding: 5px; font-size: 11px; - z-index: 1000; - filter: alpha(opacity=80); - -khtml-opacity: 0.8; - -moz-opacity: 0.8; - opacity: 0.8; + opacity: 0; + filter: alpha(opacity=0); } -.twipsy.fade.in { - filter: alpha(opacity=80); - -khtml-opacity: 0.8; - -moz-opacity: 0.8; +.tooltip.in { opacity: 0.8; + filter: alpha(opacity=80); +} +.tooltip.top { + margin-top: -2px; +} +.tooltip.right { + margin-left: 2px; } -.twipsy.above .twipsy-arrow { +.tooltip.bottom { + margin-top: 2px; +} +.tooltip.left { + margin-left: -2px; +} +.tooltip.top .tooltip-arrow { bottom: 0; left: 50%; margin-left: -5px; @@ -2273,7 +2869,7 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner { border-right: 5px solid transparent; border-top: 5px solid #000000; } -.twipsy.left .twipsy-arrow { +.tooltip.left .tooltip-arrow { top: 50%; right: 0; margin-top: -5px; @@ -2281,7 +2877,7 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner { border-bottom: 5px solid transparent; border-left: 5px solid #000000; } -.twipsy.below .twipsy-arrow { +.tooltip.bottom .tooltip-arrow { top: 0; left: 50%; margin-left: -5px; @@ -2289,7 +2885,7 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner { border-right: 5px solid transparent; border-bottom: 5px solid #000000; } -.twipsy.right .twipsy-arrow { +.tooltip.right .tooltip-arrow { top: 50%; left: 0; margin-top: -5px; @@ -2297,18 +2893,18 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner { border-bottom: 5px solid transparent; border-right: 5px solid #000000; } -.twipsy-inner { +.tooltip-inner { + max-width: 200px; padding: 3px 8px; - background-color: #000000; - color: white; + color: #ffffff; text-align: center; - max-width: 200px; text-decoration: none; + background-color: #000000; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } -.twipsy-arrow { +.tooltip-arrow { position: absolute; width: 0; height: 0; @@ -2317,11 +2913,23 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner { position: absolute; top: 0; left: 0; - z-index: 1000; - padding: 5px; + z-index: 1010; display: none; + padding: 5px; +} +.popover.top { + margin-top: -5px; } -.popover.above .arrow { +.popover.right { + margin-left: 5px; +} +.popover.bottom { + margin-top: 5px; +} +.popover.left { + margin-left: -5px; +} +.popover.top .arrow { bottom: 0; left: 50%; margin-left: -5px; @@ -2337,7 +2945,7 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner { border-bottom: 5px solid transparent; border-right: 5px solid #000000; } -.popover.below .arrow { +.popover.bottom .arrow { top: 0; left: 50%; margin-left: -5px; @@ -2358,12 +2966,12 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner { width: 0; height: 0; } -.popover .inner { - background: #000000; - background: rgba(0, 0, 0, 0.8); +.popover-inner { padding: 3px; - overflow: hidden; width: 280px; + overflow: hidden; + background: #000000; + background: rgba(0, 0, 0, 0.8); -webkit-border-radius: 6px; -moz-border-radius: 6px; border-radius: 6px; @@ -2371,18 +2979,18 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner { -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); } -.popover .title { - background-color: #f5f5f5; +.popover-title { padding: 9px 15px; line-height: 1; + background-color: #f5f5f5; + border-bottom: 1px solid #eee; -webkit-border-radius: 3px 3px 0 0; -moz-border-radius: 3px 3px 0 0; border-radius: 3px 3px 0 0; - border-bottom: 1px solid #eee; } -.popover .content { - background-color: #ffffff; +.popover-content { padding: 14px; + background-color: #ffffff; -webkit-border-radius: 0 0 3px 3px; -moz-border-radius: 0 0 3px 3px; border-radius: 0 0 3px 3px; @@ -2390,19 +2998,51 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner { -moz-background-clip: padding-box; background-clip: padding-box; } -.popover .content p, .popover .content ul, .popover .content ol { +.popover-content p, .popover-content ul, .popover-content ol { margin-bottom: 0; } -.fade { - -webkit-transition: opacity 0.15s linear; - -moz-transition: opacity 0.15s linear; - -ms-transition: opacity 0.15s linear; - -o-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; - opacity: 0; +.thumbnails { + margin-left: -20px; + list-style: none; + *zoom: 1; } -.fade.in { - opacity: 1; +.thumbnails:before, .thumbnails:after { + display: table; + content: ""; +} +.thumbnails:after { + clear: both; +} +.thumbnails > li { + float: left; + margin: 0 0 18px 20px; +} +.thumbnail { + display: block; + padding: 4px; + line-height: 1; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); +} +a.thumbnail:hover { + border-color: #0088cc; + -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); +} +.thumbnail > img { + display: block; + max-width: 100%; + margin-left: auto; + margin-right: auto; +} +.thumbnail .caption { + padding: 9px; } .label { padding: 1px 3px 2px; @@ -2410,58 +3050,316 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner { font-weight: bold; color: #ffffff; text-transform: uppercase; - white-space: nowrap; - background-color: #bfbfbf; + background-color: #999999; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; } -.label.important { - background-color: #c43c35; +.label-important { + background-color: #b94a48; } -.label.warning { +.label-warning { background-color: #f89406; } -.label.success { - background-color: #46a546; +.label-success { + background-color: #468847; +} +.label-info { + background-color: #3a87ad; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} +@-moz-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} +.progress { + overflow: hidden; + height: 18px; + margin-bottom: 18px; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -ms-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(top, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; } -.label.notice { - background-color: #62cffc; +.progress .bar { + width: 0%; + height: 18px; + color: #ffffff; + font-size: 12px; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -moz-linear-gradient(top, #149bdf, #0480be); + background-image: -ms-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(top, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -moz-transition: width 0.6s ease; + -ms-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} +.progress-striped .bar { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.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; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-danger .bar { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -ms-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(top, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); } -.media-grid { - margin-left: -4px; - margin-bottom: 0; - zoom: 1; +.progress-danger.progress-striped .bar { + background-color: #ee5f5b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-success .bar { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -ms-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(top, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0); } -.media-grid:before, .media-grid:after { - display: table; - content: ""; - zoom: 1; +.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, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-info .bar { + background-color: #4bb1cf; + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -ms-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(top, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0); } -.media-grid:after { - clear: both; +.progress-info.progress-striped .bar { + background-color: #5bc0de; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } -.media-grid li { - display: inline; +.accordion { + margin-bottom: 18px; } -.media-grid a { - float: left; - padding: 4px; - margin: 0 0 18px 4px; - border: 1px solid #ddd; +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); } -.media-grid a img { +.accordion-heading { + border-bottom: 0; +} +.accordion-heading .accordion-toggle { display: block; + padding: 8px 15px; } -.media-grid a:hover { - border-color: #0069d6; - -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5; +} +.carousel { + position: relative; + margin-bottom: 18px; + line-height: 1; +} +.carousel-inner { + overflow: hidden; + width: 100%; + position: relative; +} +.carousel .item { + display: none; + position: relative; + -webkit-transition: 0.6s ease-in-out left; + -moz-transition: 0.6s ease-in-out left; + -ms-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} +.carousel .item > img { + display: block; + line-height: 1; +} +.carousel .active, .carousel .next, .carousel .prev { + display: block; +} +.carousel .active { + left: 0; +} +.carousel .next, .carousel .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel .next { + left: 100%; +} +.carousel .prev { + left: -100%; +} +.carousel .next.left, .carousel .prev.right { + left: 0; +} +.carousel .active.left { + left: -100%; +} +.carousel .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: #ffffff; + text-align: center; + background: #222222; + border: 3px solid #ffffff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: 0.5; + filter: alpha(opacity=50); +} +.carousel-control.right { + left: auto; + right: 15px; +} +.carousel-control:hover { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} +.carousel-caption { + position: absolute; + left: 0; + right: 0; + bottom: 0; + padding: 10px 15px 5px; + background: #333333; + background: rgba(0, 0, 0, 0.75); +} +.carousel-caption h4, .carousel-caption p { + color: #ffffff; +} +.hero-unit { + padding: 60px; + margin-bottom: 30px; + background-color: #f5f5f5; + -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; +} +.hero-unit p { + font-size: 18px; + font-weight: 200; + line-height: 27px; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.hide { + display: none; +} +.show { + display: block; +} +.invisible { + visibility: hidden; } diff --git a/web/css/smt_main.css b/web/css/smt_main.css index 6b4847b03..b984f50c4 100644 --- a/web/css/smt_main.css +++ b/web/css/smt_main.css @@ -1,3 +1,55 @@ +body { + margin: 0 auto; +} + +.input-prepend input[class*="span"], .input-append input[class*="span"] { + width: auto; +} + +input[type="checkbox"], input[type="radio"] { + border: 1px solid #ccc; +} + +.form-horizontal .control-group > label { + float: none; + width: auto; + padding-top: 0; + text-align: left; +} + +.form-horizontal .controls { + margin-left: 0; +} +.form-horizontal .control-list { + padding-top: 0; +} + +.form-horizontal .form-actions { + padding-left: 10px; + padding-right: 10px; +} + +.modal { + position: absolute; + top: 10px; + left: 10px; + right: 10px; + width: auto; + margin: 0; +} + +.modal.fade.in { + top: auto; +} +.modal-header .close { + padding: 10px; + margin: -10px; +} + +.carousel-caption { + position: static; +} + #slot_face .row { padding: 0 0 0 4px; } diff --git a/web/img/glyphicons-halflings-white.png b/web/img/glyphicons-halflings-white.png new file mode 100644 index 0000000000000000000000000000000000000000..a20760bfde58d1c92cee95116059fba03c68d689 GIT binary patch literal 4352 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 literal 0 HcmV?d00001 From 0fe4d84be6eb4b4bb9c17d95460072a3527420b6 Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Tue, 21 Feb 2012 14:06:40 +0900 Subject: [PATCH 065/630] add 'keyword' parameter to member/search.json API (refs #2698) --- .../modules/member/actions/actions.class.php | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/apps/api/modules/member/actions/actions.class.php b/apps/api/modules/member/actions/actions.class.php index 1ce3cc92e..84c5b91da 100644 --- a/apps/api/modules/member/actions/actions.class.php +++ b/apps/api/modules/member/actions/actions.class.php @@ -32,10 +32,16 @@ public function executeCommunity(sfWebRequest $request) $memberId = $this->getUser()->getMemberId(); } - $this->communities = Doctrine::getTable('Community')->createQuery('c') + $query = Doctrine::getTable('Community')->createQuery('c') ->innerJoin('c.CommunityMember cm WITH cm.is_pre = false AND cm.member_id = ?', $memberId) - ->limit(sfConfig::get('op_json_api_limit', 20)) - ->execute(); + ->limit(sfConfig::get('op_json_api_limit', 20)); + + if (isset($request['keyword'])) + { + $query->whereLike('c.name', $request['keyword']); + } + + $this->communities = $query->execute(); $this->setTemplate('array', 'community'); } @@ -63,6 +69,11 @@ public function executeSearch(sfWebRequest $request) } } + if (isset($request['keyword'])) + { + $query->andWhereLike('m.name', $request['keyword']); + } + $this->members = $query ->limit(sfConfig::get('op_json_api_limit', 20)) ->execute(); From 593b04817d84a5f0fbef1019ec20da41a16c00db Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Thu, 23 Feb 2012 14:19:13 +0900 Subject: [PATCH 066/630] modify i18n message of activity postform (refs #2227) --- apps/pc_frontend/i18n/messages.ja.xml | 8 ++++++++ apps/pc_frontend/templates/_tosaka.php | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/apps/pc_frontend/i18n/messages.ja.xml b/apps/pc_frontend/i18n/messages.ja.xml index e366baddf..ff92afc26 100644 --- a/apps/pc_frontend/i18n/messages.ja.xml +++ b/apps/pc_frontend/i18n/messages.ja.xml @@ -1371,6 +1371,14 @@ View this page on regular style このページをPC版で表示 + + Post + 投稿する + + + What are you doing now? + 今なにしてる? + diff --git a/apps/pc_frontend/templates/_tosaka.php b/apps/pc_frontend/templates/_tosaka.php index 8e6cfb995..39266a6b0 100644 --- a/apps/pc_frontend/templates/_tosaka.php +++ b/apps/pc_frontend/templates/_tosaka.php @@ -68,7 +68,7 @@
    - +
    From 895e59347d1c29aae85e3b706b0769c224365829 Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Thu, 23 Feb 2012 17:58:02 +0900 Subject: [PATCH 067/630] fix error response of push API (fixes #2698). --- apps/api/modules/push/actions/actions.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/api/modules/push/actions/actions.class.php b/apps/api/modules/push/actions/actions.class.php index d79b01220..068f2424d 100644 --- a/apps/api/modules/push/actions/actions.class.php +++ b/apps/api/modules/push/actions/actions.class.php @@ -68,7 +68,7 @@ public function executeRead(sfWebRequest $request) } else { - return $this->renderJSON(array('status' => 'error')); + $this->forward404('Request parameter id does not exist.'); } } From 9ca25baa2ba758c1d0de42be28decda779d45b18 Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Fri, 24 Feb 2012 11:51:59 +0900 Subject: [PATCH 068/630] minor cleanups (fixes #2841, #2843, #2845; refs #2842) --- .../modules/community/templates/_smtCommunityListBox.php | 2 -- .../modules/community/templates/smtEditSuccess.php | 2 +- apps/pc_frontend/modules/member/actions/components.class.php | 4 ++-- .../pc_frontend/modules/member/templates/smtInviteSuccess.php | 2 +- lib/model/doctrine/MemberRelationship.class.php | 1 - 5 files changed, 4 insertions(+), 7 deletions(-) diff --git a/apps/pc_frontend/modules/community/templates/_smtCommunityListBox.php b/apps/pc_frontend/modules/community/templates/_smtCommunityListBox.php index 790577dcc..6d16b46be 100644 --- a/apps/pc_frontend/modules/community/templates/_smtCommunityListBox.php +++ b/apps/pc_frontend/modules/community/templates/_smtCommunityListBox.php @@ -6,8 +6,6 @@
    getImageFileName(), array('size' => '320x320', 'format' => 'jpg')) ?>
    - -
    diff --git a/apps/pc_frontend/modules/community/templates/smtEditSuccess.php b/apps/pc_frontend/modules/community/templates/smtEditSuccess.php index fbd678b5e..7764593e5 100644 --- a/apps/pc_frontend/modules/community/templates/smtEditSuccess.php +++ b/apps/pc_frontend/modules/community/templates/smtEditSuccess.php @@ -68,7 +68,7 @@ isHidden()): ?>
    renderLabel(); ?>
    -
    +
    hasError()): ?> getError()) ?> diff --git a/apps/pc_frontend/modules/member/actions/components.class.php b/apps/pc_frontend/modules/member/actions/components.class.php index 4d83dc03f..b626226dc 100644 --- a/apps/pc_frontend/modules/member/actions/components.class.php +++ b/apps/pc_frontend/modules/member/actions/components.class.php @@ -36,7 +36,7 @@ public function executeSmtProfileListBox($request) public function executeSmtMemberFriendListBox($request) { - if ($request->hasParameter('id') && 'profile'!=sfContext::getInstance()->getActionName()) + if ($request->hasParameter('id') && 'profile' !== sfContext::getInstance()->getActionName()) { $this->member = Doctrine::getTable('Member')->find($request->getParameter('id')); } @@ -48,7 +48,7 @@ public function executeSmtMemberFriendListBox($request) public function executeSmtMemberJoinCommunityListBox($request) { - if ($request->hasParameter('id') && 'profile'!=sfContext::getInstance()->getActionName()) + if ($request->hasParameter('id') && 'profile' !== sfContext::getInstance()->getActionName()) { $this->member = Doctrine::getTable('Member')->find($request->getParameter('id')); } diff --git a/apps/pc_frontend/modules/member/templates/smtInviteSuccess.php b/apps/pc_frontend/modules/member/templates/smtInviteSuccess.php index 76eabca86..d0da5abf6 100644 --- a/apps/pc_frontend/modules/member/templates/smtInviteSuccess.php +++ b/apps/pc_frontend/modules/member/templates/smtInviteSuccess.php @@ -25,7 +25,7 @@
    hasError()): ?> - getError()) ?>
    + getError()) ?>
    render(array('class' => 'span12')) ?> renderHelp() ?> diff --git a/lib/model/doctrine/MemberRelationship.class.php b/lib/model/doctrine/MemberRelationship.class.php index 1100f2793..39b9c0f16 100644 --- a/lib/model/doctrine/MemberRelationship.class.php +++ b/lib/model/doctrine/MemberRelationship.class.php @@ -24,7 +24,6 @@ public function postSave($event) { if ($this->isFriendPreFrom()) { - // FIXME : Help! finx my centence in English! opNotificationCenter::notify($this->getMemberRelatedByMemberIdFrom(), $this->getMember(), 'Do you accept friend request?', array('category' => 'link',)); } } From 57c0a40cf227eff61e407e76bf9233604fabcb6e Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Fri, 24 Feb 2012 15:14:31 +0900 Subject: [PATCH 069/630] hide tosaka when user is not logged in on smartphone (fixes #2844) --- apps/pc_frontend/templates/_tosaka.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/pc_frontend/templates/_tosaka.php b/apps/pc_frontend/templates/_tosaka.php index 39266a6b0..ec424312e 100644 --- a/apps/pc_frontend/templates/_tosaka.php +++ b/apps/pc_frontend/templates/_tosaka.php @@ -1,3 +1,4 @@ +
    @@ -76,15 +77,18 @@
    +
    '32', 'class' => 'menubutton')); ?>
    +
    '32', 'class' => 'ncbutton')) ?>
    '32', 'class' =>'postbutton')) ?>
    +
    From 9e4f3ec0ff8d0ecde426b69dd4d938c314f87d6f Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Fri, 24 Feb 2012 15:18:24 +0900 Subject: [PATCH 070/630] fixed smartphone form layout (fixes #2846) --- web/css/smt_main.css | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/web/css/smt_main.css b/web/css/smt_main.css index b984f50c4..91ee561e7 100644 --- a/web/css/smt_main.css +++ b/web/css/smt_main.css @@ -2,14 +2,36 @@ body { margin: 0 auto; } +label { + display: inline; +} + +.radio_list { + display: inline-block; +} + +.radio_list li { + list-style: none; + margin-bottom: 5px; +} + .input-prepend input[class*="span"], .input-append input[class*="span"] { width: auto; } input[type="checkbox"], input[type="radio"] { + width: auto!important; border: 1px solid #ccc; } +.input-prepend .add-on, .input-append .add-on { + padding: 0; +} + +.realtime-searchbox { + padding: 0px; width: 300px; +} + .form-horizontal .control-group > label { float: none; width: auto; From 46588868e294b6fa2939ca4c2e94fb6a9404b3a9 Mon Sep 17 00:00:00 2001 From: Kimura Youichi Date: Thu, 19 Jan 2012 19:48:43 +0900 Subject: [PATCH 071/630] add support for linkification of activity --- apps/api/lib/helper/opJsonApiHelper.php | 28 ++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/apps/api/lib/helper/opJsonApiHelper.php b/apps/api/lib/helper/opJsonApiHelper.php index 4c7a99137..05f3bad15 100644 --- a/apps/api/lib/helper/opJsonApiHelper.php +++ b/apps/api/lib/helper/opJsonApiHelper.php @@ -65,7 +65,7 @@ function op_api_activity($activity) 'id' => $activity->getId(), 'member' => op_api_member($member), 'body' => $activity->getBody(), - 'body_html' => op_auto_link_text(nl2br(op_api_force_escape($activity->getBody()))), + 'body_html' => op_activity_linkification(nl2br(op_api_force_escape($activity->getBody()))), 'uri' => $activity->getUri(), 'source' => $activity->getSource(), 'source_uri' => $activity->getSourceUri(), @@ -73,6 +73,32 @@ function op_api_activity($activity) ); } +function op_activity_linkification($body, $options = array()) +{ + $body = op_auto_link_text($body); + + return preg_replace_callback('/(@+)([-._0-9A-Za-z]+)/', 'op_activity_linkification_callback', $body); +} + +function op_activity_linkification_callback($matches) +{ + $at = $matches[1]; + $screenName = $matches[2]; + $screenNameConfig = Doctrine::getTable('MemberConfig')->createQuery() + ->select('member_id') + ->addWhere('name = "op_screen_name"') + ->addWhere('value = ?', $screenName) + ->fetchOne(array(), Doctrine::HYDRATE_NONE); + + if ($screenNameConfig) + { + $memberId = $screenNameConfig[0]; + return link_to($at.$screenName, op_api_member_profile_url($memberId), array('target' => '_blank')); + } + + return $matches[0]; +} + function op_api_force_escape($text) { if (!sfConfig::get('sf_escaping_strategy')) From 9dffdca2c3e620ba739868344fa7143d0309fb52 Mon Sep 17 00:00:00 2001 From: Kimura Youichi Date: Thu, 19 Jan 2012 18:55:12 +0900 Subject: [PATCH 072/630] add activity/community.json --- apps/api/config/routing.yml | 5 +++ .../activity/actions/actions.class.php | 42 +++++++++++++++++++ lib/util/opActivityQueryBuilder.class.php | 25 +++++++++-- 3 files changed, 69 insertions(+), 3 deletions(-) diff --git a/apps/api/config/routing.yml b/apps/api/config/routing.yml index 58cfa94e0..60365e530 100644 --- a/apps/api/config/routing.yml +++ b/apps/api/config/routing.yml @@ -34,6 +34,11 @@ activity_friends: param: { module: activity, action: friends, sf_format: json } requirements: { sf_method: [get] } +activity_community: + url: /activity/community.json + param: { module: activity, action: community, sf_format: json } + requirements: { sf_method: [get] } + activity_post: url: /activity/post.json param: { module: activity, action: post, sf_format: json } diff --git a/apps/api/modules/activity/actions/actions.class.php b/apps/api/modules/activity/actions/actions.class.php index c20b46547..fd2ed891b 100644 --- a/apps/api/modules/activity/actions/actions.class.php +++ b/apps/api/modules/activity/actions/actions.class.php @@ -28,6 +28,15 @@ public function executeSearch(sfWebRequest $request) { $builder->includeFriends($request['target_id'] ? $request['target_id'] : null); } + elseif ('community' === $request['target']) + { + $this->forward400Unless($request['target_id'], 'target_id parameter not specified.'); + $builder + ->includeSelf() + ->includeFriends() + ->includeSns() + ->setCommunityId($request['target_id']); + } else { $this->forward400('target parameter is invalid.'); @@ -112,6 +121,28 @@ public function executeFriends(sfWebRequest $request) $this->forward('activity', 'search'); } + public function executeCommunity(sfWebRequest $request) + { + $request['target'] = 'community'; + + if (isset($request['community_id'])) + { + $request['target_id'] = $request['community_id']; + unset($request['community_id']); + } + elseif (isset($request['id'])) + { + $request['target_id'] = $request['id']; + unset($request['id']); + } + else + { + $this->forward400('community_id parameter not specified.'); + } + + $this->forward('activity', 'search'); + } + public function executePost(sfWebRequest $request) { $this->forward400Unless(isset($request['body']), 'body parameter not specified.'); @@ -139,6 +170,17 @@ public function executePost(sfWebRequest $request) $options['uri'] = $request['url']; } + if (isset($request['target']) && 'community' === $request['target']) + { + if (isset($request['target_id'])) + { + $this->forward400('target_id parameter not specified.'); + } + + $options['foreign_table'] = 'community'; + $options['foreign_id'] = $request['target_id']; + } + $options['source'] = 'API'; $this->activity = Doctrine::getTable('ActivityData')->updateActivity($memberId, $body, $options); diff --git a/lib/util/opActivityQueryBuilder.class.php b/lib/util/opActivityQueryBuilder.class.php index c286e924e..cd243148d 100644 --- a/lib/util/opActivityQueryBuilder.class.php +++ b/lib/util/opActivityQueryBuilder.class.php @@ -20,6 +20,7 @@ class opActivityQueryBuilder protected $table, $viewerId = null, + $communityId = null, $inactiveIds, $include; @@ -42,6 +43,12 @@ public function setViewerId($viewerId) return $this; } + public function setCommunityId($community_id) + { + $this->communityId = $community_id; + return $this; + } + public function resetInclude() { $this->include = array( @@ -49,6 +56,7 @@ public function resetInclude() 'friend' => false, 'sns' => false, 'member' => false, + 'community' => false, ); return $this; @@ -107,10 +115,21 @@ public function buildQuery() $subQuery = array_map(array($this, 'trimSubqueryWhere'), $subQuery); - $query->andWhere(implode(' OR ', $subQuery)) - ->orderBy('id DESC'); + $query->andWhere(implode(' OR ', $subQuery)); - return $query; + if (null === $this->communityId) + { + $query->addWhere('a.foreign_table IS NULL OR a.foreign_table <> "community"'); + } + else + { + $query + ->addWhere('a.foreign_table = "community"') + ->addWhere('a.foreign_id = ?', $this->communityId) + ->addWhere('EXISTS (FROM CommunityMember cm WHERE cm.member_id = a.member_id AND cm.community_id = ?)', $this->communityId); + } + + return $query->orderBy('id DESC'); } protected function buildSelfQuery($query) From badf0563605fb4545353c2b083a763937a983adb Mon Sep 17 00:00:00 2001 From: Kimura Youichi Date: Thu, 5 Jan 2012 14:04:35 +0900 Subject: [PATCH 073/630] add activity/mentions.json --- apps/api/config/routing.yml | 5 ++++ .../activity/actions/actions.class.php | 17 ++++++++++++ lib/util/opActivityQueryBuilder.class.php | 26 +++++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/apps/api/config/routing.yml b/apps/api/config/routing.yml index 60365e530..a53bdbca0 100644 --- a/apps/api/config/routing.yml +++ b/apps/api/config/routing.yml @@ -39,6 +39,11 @@ activity_community: param: { module: activity, action: community, sf_format: json } requirements: { sf_method: [get] } +activity_mentions: + url: /activity/mentions.json + param: { module: activity, action: mentions, sf_format: json } + requirements: { sf_method: [get] } + activity_post: url: /activity/post.json param: { module: activity, action: post, sf_format: json } diff --git a/apps/api/modules/activity/actions/actions.class.php b/apps/api/modules/activity/actions/actions.class.php index fd2ed891b..dbc76c1a6 100644 --- a/apps/api/modules/activity/actions/actions.class.php +++ b/apps/api/modules/activity/actions/actions.class.php @@ -213,4 +213,21 @@ public function executeDelete(sfWebRequest $request) return $this->renderJSON(array('status' => 'success')); } + + public function executeMentions(sfWebRequest $request) + { + $builder = opActivityQueryBuilder::create() + ->setViewerId($this->getUser()->getMemberId()) + ->includeMentions(); + + $query = $builder->buildQuery() + ->andWhere('in_reply_to_activity_id IS NULL') + ->andWhere('foreign_table IS NULL') + ->andWhere('foreign_id IS NULL') + ->limit(20); + + $this->activityData = $query->execute(); + + $this->setTemplate('array'); + } } diff --git a/lib/util/opActivityQueryBuilder.class.php b/lib/util/opActivityQueryBuilder.class.php index cd243148d..f77b087d9 100644 --- a/lib/util/opActivityQueryBuilder.class.php +++ b/lib/util/opActivityQueryBuilder.class.php @@ -55,6 +55,7 @@ public function resetInclude() 'self' => false, 'friend' => false, 'sns' => false, + 'mention' => false, 'member' => false, 'community' => false, ); @@ -80,6 +81,12 @@ public function includeSns() return $this; } + public function includeMentions() + { + $this->include['mention'] = true; + return $this; + } + public function includeMember($member_id) { $this->include['member'] = $member_id; @@ -108,6 +115,11 @@ public function buildQuery() $subQuery[] = $this->buildAllMemberQuery($query->createSubquery()); } + if ($this->include['mention']) + { + $subQuery[] = $this->buildMentionQuery($query->createSubquery()); + } + if ($this->include['member']) { $subQuery[] = $this->buildMemberQueryWithCheckRel($query->createSubquery(), $this->include['member']); @@ -212,6 +224,20 @@ protected function buildMemberQueryWithCheckRel($query, $member_id = null) return $query; } + protected function buildMentionQuery($query) + { + $friendQuery = $this->buildFriendQuery($query->createSubquery()) + ->andWhereLike('a.template_param', '|'.$this->viewerId.'|'); + + $snsQuery = $this->buildAllMemberQuery($query->createSubquery()) + ->andWhereLike('a.template_param', '|'.$this->viewerId.'|'); + + $subQuery = array_map(array($this, 'trimSubqueryWhere'), array($friendQuery, $snsQuery)); + $query->andWhere(implode(' OR ', $subQuery)); + + return $query; + } + protected function trimSubqueryWhere($subquery) { return '('.implode(' ', $subquery->getDqlPart('where')).')'; From 96099de4b7fedd08c356d7842088a1e17f30174b Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Tue, 28 Feb 2012 14:42:23 +0900 Subject: [PATCH 074/630] add ability to post activity to community timeline (refs #2849) --- apps/api/modules/activity/actions/actions.class.php | 2 +- apps/pc_frontend/templates/_tosaka.php | 4 ++++ apps/pc_frontend/templates/smtLayoutGroup.php | 4 ++-- web/js/smt_tosaka.js | 5 +++++ 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/apps/api/modules/activity/actions/actions.class.php b/apps/api/modules/activity/actions/actions.class.php index dbc76c1a6..9f6e67ca3 100644 --- a/apps/api/modules/activity/actions/actions.class.php +++ b/apps/api/modules/activity/actions/actions.class.php @@ -172,7 +172,7 @@ public function executePost(sfWebRequest $request) if (isset($request['target']) && 'community' === $request['target']) { - if (isset($request['target_id'])) + if (!isset($request['target_id'])) { $this->forward400('target_id parameter not specified.'); } diff --git a/apps/pc_frontend/templates/_tosaka.php b/apps/pc_frontend/templates/_tosaka.php index ec424312e..28f1c98e9 100644 --- a/apps/pc_frontend/templates/_tosaka.php +++ b/apps/pc_frontend/templates/_tosaka.php @@ -72,7 +72,11 @@
    + + + +
    diff --git a/apps/pc_frontend/templates/smtLayoutGroup.php b/apps/pc_frontend/templates/smtLayoutGroup.php index c33f95c7a..3eb090fae 100644 --- a/apps/pc_frontend/templates/smtLayoutGroup.php +++ b/apps/pc_frontend/templates/smtLayoutGroup.php @@ -33,9 +33,9 @@ - +getDisplayCommunity() ?> + $community)) ?>
    - getDisplayCommunity() ?>
    getImageFileName(), array('size' => '48x48')) ?> diff --git a/web/js/smt_tosaka.js b/web/js/smt_tosaka.js index 3e0cfccd5..db74d2017 100644 --- a/web/js/smt_tosaka.js +++ b/web/js/smt_tosaka.js @@ -45,6 +45,11 @@ $(document).ready(function(){ apiKey: openpne.apiKey, body: body_text }; + if ($('#tosaka_postform_submit').attr('data-community-id')) + { + params.target = 'community'; + params.target_id = $('#tosaka_postform_submit').attr('data-community-id'); + } $.getJSON(openpne.apiBase + 'activity/post.json', params, function(json) { if (json.status == 'success') { From c5815858da6519ea0983ccc37ff0a064f3c4692f Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Wed, 29 Feb 2012 13:26:42 +0900 Subject: [PATCH 075/630] modify default terms of SNS in fixtures. (fixes #2886) --- data/fixtures/010_import_sns_terms.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/data/fixtures/010_import_sns_terms.yml b/data/fixtures/010_import_sns_terms.yml index 067034e55..dd4146a41 100644 --- a/data/fixtures/010_import_sns_terms.yml +++ b/data/fixtures/010_import_sns_terms.yml @@ -76,33 +76,33 @@ SnsTerm: application: "pc_frontend" Translation: ja_JP: - value: "アクティビティ" + value: "タイムライン" en: - value: "activity" + value: "Timeline" term_activity_mobile_frontend: name: "activity" application: "mobile_frontend" Translation: ja_JP: - value: "アクティビティ" + value: "タイムライン" en: - value: "activity" + value: "Timeline" term_post_activity_pc_frontend: name: "post_activity" application: "pc_frontend" Translation: ja_JP: - value: "アクティビティ投稿" + value: "つぶやく" en: - value: "Post Activity" + value: "Tweet" term_post_activity_mobile_frontend: name: "post_activity" application: "mobile_frontend" Translation: ja_JP: - value: "投稿" + value: "つぶやく" en: - value: "Post Activity" + value: "Tweet" From cb4b63d71d7d550c632015018f6aa2d581eb4362 Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Wed, 29 Feb 2012 13:29:11 +0900 Subject: [PATCH 076/630] hide postform in tosaka after post activity. (fixes #2884) --- web/js/smt_tosaka.js | 1 + 1 file changed, 1 insertion(+) diff --git a/web/js/smt_tosaka.js b/web/js/smt_tosaka.js index db74d2017..bbd0c62cc 100644 --- a/web/js/smt_tosaka.js +++ b/web/js/smt_tosaka.js @@ -54,6 +54,7 @@ $(document).ready(function(){ $.getJSON(openpne.apiBase + 'activity/post.json', params, function(json) { if (json.status == 'success') { body_elem.val(''); + $(".postform").toggle(); } }); }); From c11ce60c06b9d0388c117ab03066e3f01627f7be Mon Sep 17 00:00:00 2001 From: Kimura Youichi Date: Thu, 29 Mar 2012 16:42:42 +0900 Subject: [PATCH 077/630] add 'activity_id' parameter to activity/search.json API (refs #2698) --- apps/api/modules/activity/actions/actions.class.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apps/api/modules/activity/actions/actions.class.php b/apps/api/modules/activity/actions/actions.class.php index 9f6e67ca3..33c95e028 100644 --- a/apps/api/modules/activity/actions/actions.class.php +++ b/apps/api/modules/activity/actions/actions.class.php @@ -81,6 +81,11 @@ public function executeSearch(sfWebRequest $request) $query->addWhere('id > ?', $request['since_id']); } + if (isset($request['activity_id'])) + { + $query->addWhere('id = ?', $request['activity_id']); + } + $this->activityData = $query ->andWhere('in_reply_to_activity_id IS NULL') ->execute(); From 8713dc6c124a8c5b4878fd6ccb50d877b5930743 Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Wed, 29 Feb 2012 18:20:27 +0900 Subject: [PATCH 078/630] modify friend link notification message for i18n. (refs #2227) --- apps/pc_frontend/i18n/messages.ja.xml | 4 ++++ apps/pc_frontend/templates/_tosaka.php | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/apps/pc_frontend/i18n/messages.ja.xml b/apps/pc_frontend/i18n/messages.ja.xml index ff92afc26..d0f374bc6 100644 --- a/apps/pc_frontend/i18n/messages.ja.xml +++ b/apps/pc_frontend/i18n/messages.ja.xml @@ -1379,6 +1379,10 @@ What are you doing now? 今なにしてる? + + %Friend% link request + %Friend%申請 + diff --git a/apps/pc_frontend/templates/_tosaka.php b/apps/pc_frontend/templates/_tosaka.php index 28f1c98e9..e6c6f5b9e 100644 --- a/apps/pc_frontend/templates/_tosaka.php +++ b/apps/pc_frontend/templates/_tosaka.php @@ -24,11 +24,13 @@
    +
    {{if category=="link" && unread==false}} - + {{else}} {{html body}} {{/if}} +
    {{if category=="link"}}
    From 808d8c49c3205e3ed1a3c3fb637c46b3d397068b Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Wed, 29 Feb 2012 13:24:21 +0900 Subject: [PATCH 079/630] modify default smartphone navigation items. (fixes #2886) --- .../modules/default/templates/_smtMenu.php | 4 +++ .../012_import_smartphone_navi_menu.yml | 28 ++++++------------- 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/apps/pc_frontend/modules/default/templates/_smtMenu.php b/apps/pc_frontend/modules/default/templates/_smtMenu.php index 906ae329e..4ce2718ab 100644 --- a/apps/pc_frontend/modules/default/templates/_smtMenu.php +++ b/apps/pc_frontend/modules/default/templates/_smtMenu.php @@ -16,8 +16,12 @@ uri)): ?> + uri): ?> + getMember()->getName(), $nav->uri, array('class' => 'btn btn-info', 'id' => sprintf('smtMenu_%1', op_url_to_id($nav->uri, true)))) ?> + caption, $nav->uri, array('class' => 'btn', 'id' => sprintf('smtMenu_%1', op_url_to_id($nav->uri, true)))) ?> +
    diff --git a/data/fixtures/012_import_smartphone_navi_menu.yml b/data/fixtures/012_import_smartphone_navi_menu.yml index 79663fa87..87ecd5b98 100644 --- a/data/fixtures/012_import_smartphone_navi_menu.yml +++ b/data/fixtures/012_import_smartphone_navi_menu.yml @@ -19,40 +19,30 @@ Navigation: en: caption: "Profile" - smartphone_default_navigation_profile_edit: + smartphone_default_navigation_member_search: type: "smartphone_default" - uri: "@member_editProfile" + uri: "@member_search" sort_order: 20 Translation: ja_JP: - caption: "プロフィール編集" + caption: "メンバー検索" en: - caption: "Edit Profile" + caption: "Member Search" - smartphone_default_navigation_community_all: + smartphone_default_navigation_community_search: type: "smartphone_default" - uri: "@community_home?id=1" + uri: "@community_search" sort_order: 30 Translation: ja_JP: - caption: "allコミュニティ" + caption: "コミュニティ検索" en: - caption: "all Community" - - smartphone_default_navigation_config: - type: "smartphone_default" - uri: "@member_config" - sort_order: 40 - Translation: - ja_JP: - caption: "設定変更" - en: - caption: "Settings" + caption: "Community Search" smartphone_default_navigation_logout: type: "smartphone_default" uri: "@member_logout" - sort_order: 50 + sort_order: 40 Translation: ja_JP: caption: "ログアウト" From a94e65b4062ac42e1cb15837f02b208c9780209c Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Wed, 29 Feb 2012 19:35:03 +0900 Subject: [PATCH 080/630] added option of disable read push. (refs #2756) --- web/js/smt_notify.js | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/web/js/smt_notify.js b/web/js/smt_notify.js index 662a5d5c2..2d2b57beb 100644 --- a/web/js/smt_notify.js +++ b/web/js/smt_notify.js @@ -11,6 +11,11 @@ var _readyBound = false; $.fn.pushLink = function(settings){ + + settings = $.extend({ + isDisableRead: false, + }, settings); + return this.each(function(){ var linkUrl = $(this).attr('data-location-url'); var notifyId = $(this).attr('data-notify-id'); @@ -21,9 +26,16 @@ $(this).removeClass('hover'); }) $(this).click(function(){ - $.getJSON( openpne.apiBase + 'push/read.json' , { 'id': notifyId, 'apiKey': openpne.apiKey }, function(d){ + if ( false == settings.isDisableRead ) + { + $.getJSON( openpne.apiBase + 'push/read.json' , { 'id': notifyId, 'apiKey': openpne.apiKey }, function(d){ + window.location = linkUrl; + }); + } + else + { window.location = linkUrl; - }); + } }); }); }; From 9f11f6b50da93411c7595118c3f9daf5aae60795 Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Wed, 29 Feb 2012 20:04:34 +0900 Subject: [PATCH 081/630] move smartphone switch link. (refs #2227) --- apps/pc_frontend/modules/default/templates/_smtMenu.php | 1 + apps/pc_frontend/templates/smtLayoutGroup.php | 3 --- apps/pc_frontend/templates/smtLayoutHome.php | 3 --- apps/pc_frontend/templates/smtLayoutMember.php | 3 --- apps/pc_frontend/templates/smtLayoutSns.php | 3 --- web/js/smt_main.js | 2 +- 6 files changed, 2 insertions(+), 13 deletions(-) diff --git a/apps/pc_frontend/modules/default/templates/_smtMenu.php b/apps/pc_frontend/modules/default/templates/_smtMenu.php index 4ce2718ab..32f5e3de5 100644 --- a/apps/pc_frontend/modules/default/templates/_smtMenu.php +++ b/apps/pc_frontend/modules/default/templates/_smtMenu.php @@ -23,6 +23,7 @@ +
    diff --git a/apps/pc_frontend/templates/smtLayoutGroup.php b/apps/pc_frontend/templates/smtLayoutGroup.php index 3eb090fae..cbb0c0374 100644 --- a/apps/pc_frontend/templates/smtLayoutGroup.php +++ b/apps/pc_frontend/templates/smtLayoutGroup.php @@ -65,9 +65,6 @@ - diff --git a/apps/pc_frontend/templates/smtLayoutHome.php b/apps/pc_frontend/templates/smtLayoutHome.php index c9ed3f7c0..c00035e16 100644 --- a/apps/pc_frontend/templates/smtLayoutHome.php +++ b/apps/pc_frontend/templates/smtLayoutHome.php @@ -68,9 +68,6 @@ - diff --git a/apps/pc_frontend/templates/smtLayoutMember.php b/apps/pc_frontend/templates/smtLayoutMember.php index 2729f0f2f..ac70047c4 100644 --- a/apps/pc_frontend/templates/smtLayoutMember.php +++ b/apps/pc_frontend/templates/smtLayoutMember.php @@ -71,9 +71,6 @@ - diff --git a/apps/pc_frontend/templates/smtLayoutSns.php b/apps/pc_frontend/templates/smtLayoutSns.php index ef1006b2f..b88f60b8c 100644 --- a/apps/pc_frontend/templates/smtLayoutSns.php +++ b/apps/pc_frontend/templates/smtLayoutSns.php @@ -72,9 +72,6 @@ - diff --git a/web/js/smt_main.js b/web/js/smt_main.js index 5c27120fa..681d9901f 100644 --- a/web/js/smt_main.js +++ b/web/js/smt_main.js @@ -3,6 +3,6 @@ $(function(){ .show() .click(function() { document.cookie = "disable_smt=1"; - location.reload(); + location.href = $(this).attr('href'); }); }); From 583e0954ed2f4d793469df6a6c0eed7e37180099 Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Wed, 29 Feb 2012 20:05:01 +0900 Subject: [PATCH 082/630] modify i18n message for smartphone switch button. (fixes #2227) --- apps/pc_frontend/i18n/messages.ja.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/pc_frontend/i18n/messages.ja.xml b/apps/pc_frontend/i18n/messages.ja.xml index d0f374bc6..93ad84793 100644 --- a/apps/pc_frontend/i18n/messages.ja.xml +++ b/apps/pc_frontend/i18n/messages.ja.xml @@ -1365,11 +1365,11 @@ View this page on smartphone style - このページをスマートフォン版で表示 + スマートフォン表示に切り替え View this page on regular style - このページをPC版で表示 + PC表示に切り替え Post From 5026aaeef016aaac34910f7e057a71bf9c3e77c9 Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Wed, 29 Feb 2012 20:23:54 +0900 Subject: [PATCH 083/630] remove member information on smtLayoutSns layout. (refs #2227) --- apps/pc_frontend/templates/smtLayoutSns.php | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/apps/pc_frontend/templates/smtLayoutSns.php b/apps/pc_frontend/templates/smtLayoutSns.php index b88f60b8c..4c78061ba 100644 --- a/apps/pc_frontend/templates/smtLayoutSns.php +++ b/apps/pc_frontend/templates/smtLayoutSns.php @@ -37,21 +37,6 @@ -
    -
    - getMember()->getImageFileName(), array('size' => '48x48')) ?> -
    -
    -
    getMember()->getName() ?>
    -
    - getMember()->getConfig('op_screen_name') ?> - - @ - -
    -
    -
    '48')), '@homepage') ?>
    -
    hasFlash('error')): ?> From 6404cd1ff4cfc7e1e2837bcea8e5a9ab8d6778bd Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Wed, 29 Feb 2012 20:26:23 +0900 Subject: [PATCH 084/630] fixed layout of member search page on smartphone (fixes #2227) --- apps/pc_frontend/modules/member/config/view.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/pc_frontend/modules/member/config/view.yml b/apps/pc_frontend/modules/member/config/view.yml index b5569dc26..5f7393ca7 100644 --- a/apps/pc_frontend/modules/member/config/view.yml +++ b/apps/pc_frontend/modules/member/config/view.yml @@ -44,6 +44,9 @@ smtEditProfileSuccess: smtConfigSuccess: layout: smtLayoutHome +smtSearchSuccess: + layout: smtLayoutSns + smtConfigImageSuccess: layout: smtLayoutHome From a18840e33720ef8ca757245a1d393b6284eb67d4 Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Wed, 29 Feb 2012 20:35:32 +0900 Subject: [PATCH 085/630] fixed to hide loading on tosaka notification (refs #2756) --- apps/pc_frontend/templates/_tosaka.php | 2 +- web/js/smt_notify.js | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/pc_frontend/templates/_tosaka.php b/apps/pc_frontend/templates/_tosaka.php index e6c6f5b9e..fbe2ca8e9 100644 --- a/apps/pc_frontend/templates/_tosaka.php +++ b/apps/pc_frontend/templates/_tosaka.php @@ -28,7 +28,7 @@ {{if category=="link" && unread==false}} {{else}} - {{html body}} + フレンドリクエストを承認しますか? {{/if}}
    diff --git a/web/js/smt_notify.js b/web/js/smt_notify.js index 2d2b57beb..60bd01415 100644 --- a/web/js/smt_notify.js +++ b/web/js/smt_notify.js @@ -56,7 +56,7 @@ dataType: 'json', success: function(data) { if(data.status=='success'){ - $(this).parent().find('.ncfriendloading:first').hide(); + $('.ncfriendloading').hide(); $(this).parent().find('.ncfriendresultmessage').text('フレンド申請を承認しました。'); $(this).parent().find('.ncfriendresultmessage').show(); }else{ @@ -64,7 +64,7 @@ } }, error: function(r, s, e){ - $(this).parent().find('.ncfriendloading:first').hide(); + $('.ncfriendloading').hide(); $(this).parent().find('.ncfriendresultmessage').text('既に承認済みか拒否済みです。'); $(this).parent().find('.ncfriendresultmessage').show(); } @@ -90,7 +90,7 @@ dataType: 'json', success: function(data) { if(data.status=='success'){ - $(this).parent().find('.ncfriendloading:first').hide(); + $('.ncfriendloading').hide(); $(this).parent().find('.ncfriendresultmessage').text('フレンド申請を拒否しました。'); $(this).parent().find('.ncfriendresultmessage').show(); }else{ @@ -98,7 +98,7 @@ } }, error: function(r, s, e){ - $(this).parent().find('.ncfriendloading:first').hide(); + $('.ncfriendloading').hide(); $(this).parent().find('.ncfriendresultmessage').text('既に承認済みか拒否済みです。'); $(this).parent().find('.ncfriendresultmessage').show(); } From 207d349e19a1b753de3cde20136f814eabe5cd97 Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Wed, 14 Mar 2012 19:48:59 +0900 Subject: [PATCH 086/630] fixed to generate image for square size. (fixes #2890) --- .../sfImageGeneratorImageTransform.php | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/lib/plugins/sfImageHandlerPlugin/lib/image/generator/sfImageGeneratorImageTransform.php b/lib/plugins/sfImageHandlerPlugin/lib/image/generator/sfImageGeneratorImageTransform.php index 4b442c90b..b9fab745e 100644 --- a/lib/plugins/sfImageHandlerPlugin/lib/image/generator/sfImageGeneratorImageTransform.php +++ b/lib/plugins/sfImageHandlerPlugin/lib/image/generator/sfImageGeneratorImageTransform.php @@ -56,6 +56,23 @@ protected function doResize($tmpfilename) throw new sfException($result->getMessage()); } + $srcWidth = $this->transform->getImageWidth(); + $srcHeight = $this->transform->getImageHeight(); + if ($srcWidth > $srcHeight) + { + $srcX = ceil(($srcWidth - $srcHeight) / 2); + $srcY = 0; + $srcW = $srcHeight; + $srcH = $srcHeight; + } + else + { + $srcX = 0; + $srcY = ceil(($srcHeight - $srcWidth) / 2); + $srcW = $srcWidth; + $srcH = $srcWidth; + } + // for mobile phone if ('jpg' === $this->format) { @@ -64,7 +81,16 @@ protected function doResize($tmpfilename) if ($this->width && $this->height) { + $this->transform->crop($srcW, $srcH, $srcX, $srcY); + $tmpoutputfilename = tempnam(sys_get_temp_dir(), 'IGITF'); + $result = $this->transform->save($tmpoutputfilename); + if (PEAR::isError($result)) + { + throw new sfException($result->getMessage()); + } + $this->transform->load($tmpoutputfilename); $this->transform->fit($this->width, $this->height); + unlink($tmpoutputfilename); } } From ad33dea197a1cc53d472f704afe1acec94d46dc9 Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Thu, 15 Mar 2012 18:00:54 +0900 Subject: [PATCH 087/630] add notification center for PC (refs #2767) --- apps/pc_frontend/i18n/messages.ja.xml | 4 + apps/pc_frontend/templates/_header.php | 54 +++++ apps/pc_frontend/templates/_layout.php | 4 + plugins/opSkinBasicPlugin/web/css/main.css | 226 ++++++++++++++++++++- web/js/jquery.notify.js | 90 ++++++++ web/js/op_notify.js | 46 +++++ 6 files changed, 421 insertions(+), 3 deletions(-) create mode 100755 web/js/jquery.notify.js create mode 100755 web/js/op_notify.js diff --git a/apps/pc_frontend/i18n/messages.ja.xml b/apps/pc_frontend/i18n/messages.ja.xml index 93ad84793..91370382b 100644 --- a/apps/pc_frontend/i18n/messages.ja.xml +++ b/apps/pc_frontend/i18n/messages.ja.xml @@ -1383,6 +1383,10 @@ %Friend% link request %Friend%申請 + + There is no new notification. + 新しい通知はありません + diff --git a/apps/pc_frontend/templates/_header.php b/apps/pc_frontend/templates/_header.php index f87be598d..1eeb6cfdf 100644 --- a/apps/pc_frontend/templates/_header.php +++ b/apps/pc_frontend/templates/_header.php @@ -1,5 +1,59 @@

    + +
    + '32', 'class' => 'ncbutton')) ?> +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + + + + + -
    +
    isHidden()): ?>
    diff --git a/web/css/smt_main.css b/web/css/smt_main.css index 91ee561e7..d1b87a246 100644 --- a/web/css/smt_main.css +++ b/web/css/smt_main.css @@ -19,6 +19,12 @@ label { width: auto; } +ul > li > input[type="text"], +ul > li > input[type="textarea"], +ul > li > input[type="password"] { + width: 285px; +} + input[type="checkbox"], input[type="radio"] { width: auto!important; border: 1px solid #ccc; From 1c60d72585ca02bc5e7e4b438d418370d5406711 Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Tue, 27 Mar 2012 14:56:51 +0900 Subject: [PATCH 094/630] fixed notification center templates on smartphone (fixes #2756) --- apps/pc_frontend/i18n/messages.ja.xml | 4 ++++ apps/pc_frontend/templates/_tosaka.php | 11 ++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/apps/pc_frontend/i18n/messages.ja.xml b/apps/pc_frontend/i18n/messages.ja.xml index 91370382b..ac679e0e3 100644 --- a/apps/pc_frontend/i18n/messages.ja.xml +++ b/apps/pc_frontend/i18n/messages.ja.xml @@ -1383,6 +1383,10 @@ %Friend% link request %Friend%申請 + + Do you accept %friend% link request? + %Friend%申請を許可しますか? + There is no new notification. 新しい通知はありません diff --git a/apps/pc_frontend/templates/_tosaka.php b/apps/pc_frontend/templates/_tosaka.php index fbe2ca8e9..450ac4904 100644 --- a/apps/pc_frontend/templates/_tosaka.php +++ b/apps/pc_frontend/templates/_tosaka.php @@ -25,10 +25,15 @@
    - {{if category=="link" && unread==false}} - + {{if category=="link"}} + {{if unread==false}} + + {{/if}} + {{if unread==true}} + + {{/if}} {{else}} - フレンドリクエストを承認しますか? + {{html body}} {{/if}}
    From 628dfbd532a2ca42c74b2f6cfe4605457ff5b6f7 Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Tue, 27 Mar 2012 14:58:27 +0900 Subject: [PATCH 095/630] (fixes #2756) fixed friend link request button text on smartphone notification center --- apps/pc_frontend/templates/_tosaka.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/pc_frontend/templates/_tosaka.php b/apps/pc_frontend/templates/_tosaka.php index 450ac4904..f2e96e318 100644 --- a/apps/pc_frontend/templates/_tosaka.php +++ b/apps/pc_frontend/templates/_tosaka.php @@ -39,8 +39,8 @@
    {{if category=="link"}}
    - - + +
    From cda0dbb5237fbaa056f2fb2260fa42ce984fddde Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Tue, 27 Mar 2012 15:24:40 +0900 Subject: [PATCH 096/630] fixed notification center style on smartphone (fixes #2756) --- apps/pc_frontend/templates/_tosaka.php | 2 +- web/css/smt_main.css | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/pc_frontend/templates/_tosaka.php b/apps/pc_frontend/templates/_tosaka.php index f2e96e318..0ead6db54 100644 --- a/apps/pc_frontend/templates/_tosaka.php +++ b/apps/pc_frontend/templates/_tosaka.php @@ -18,7 +18,7 @@ - -
    @@ -90,17 +88,29 @@ -
    -
    -
    -
    -
    '32', 'class' => 'menubutton')); ?>
    - -
    '32', 'class' => 'ncbutton')) ?> + + + + + diff --git a/web/css/smt_main.css b/web/css/smt_main.css index 8f40e242e..776b5fb0d 100644 --- a/web/css/smt_main.css +++ b/web/css/smt_main.css @@ -148,6 +148,9 @@ input[type="checkbox"], input[type="radio"] { #notification_center { position: relative; + display: inline; + text-align: center; + margin: 0 10px; } .nc_icon1 { position:absolute; @@ -365,3 +368,153 @@ table th { table td { border-top: none !important; } + +.navbar .brand +{ + padding: 4px 20px 8px; +} + +/*---------------------------------------------- + * define tosaka style + *---------------------------------------------*/ +.container { + width: auto; +} + +.row-fluid { + width: 100%; +} +.row { + margin-left: 0; +} + +.row > [class*="span"], +.row-fluid > [class*="span"] { + margin: 0; +} + +.input-prepend input[class*="span"], +.input-append input[class*="span"] { + width: auto; +} + +.navbar-fixed-top { + position: static; + margin-bottom: 8px; +} + +.navbar-fixed-top .navbar-inner { + padding: 5px; +} + +.navbar .brand { + padding-left: 10px; + padding-right: 10px; + margin: 0 0 0 -5px; + min-width: 90px; + max-width: 100px; + overflow: hidden; + text-align: center; +} + +.navbar .nav-collapse { + clear: left; +} + +.navbar .nav { + float: none; + margin: 0 0 9px; +} + +.navbar .nav > li { + border-bottom: 1px #000000 solid; + float: none; +} + +.navbar .nav > .divider-vertical { + display: none; +} + +.navbar .nav .nav-header { + color: #999999; + text-shadow: none; +} + +.navbar .nav > li > a, +.navbar .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #999999; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.navbar .nav > li > a:hover, +.navbar .dropdown-menu a:hover { + background-color: #222222; +} + +.navbar .dropdown-menu { + position: static; + top: auto; + left: auto; + float: none; + display: block; + max-width: none; + margin: 0 15px; + padding: 0; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.navbar .dropdown-menu:before, +.navbar .dropdown-menu:after { + display: none; +} + +.navbar .dropdown-menu .divider { + display: none; +} + +.navbar-form, +.navbar-search { + float: none; + padding: 9px 15px; + margin: 9px 0; + border-top: 1px solid #222222; + border-bottom: 1px solid #222222; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); +} + +.navbar .nav.pull-right { + float: none; + margin-left: 0; +} + +.navbar-static .navbar-inner { + padding-left: 10px; + padding-right: 10px; +} + +.btn-navbar { + display: block; +} + +.nav-collapse { + overflow: hidden; + height: 0; +} + +.container .right { + float: right; +} + diff --git a/web/js/smt_tosaka.js b/web/js/smt_tosaka.js index bbd0c62cc..7f17b2b75 100644 --- a/web/js/smt_tosaka.js +++ b/web/js/smt_tosaka.js @@ -17,11 +17,13 @@ $(document).ready(function(){ $('#pushList').show(); $('#pushLoading').hide(); }); + collapse_toggle($('.nav-collapse')); }); - $(".menubutton").click(function(){ - $(".toggle1:not(.menuform)").hide(); - $(".menuform").toggle(); + $(".btn-navbar").click(function(){ + $(".toggle1:not(.nav-collapse)").hide(); + $('.nav-collapse').show(); + collapse_toggle($('.nav-collapse')); }); $(".postbutton").click(function(){ @@ -30,6 +32,7 @@ $(document).ready(function(){ if($(".postform").is(":visible")){ $(".posttextarea").focus(); } + collapse_toggle($('.nav-collapse')); }); $(".toggle1_close").click(function(){ @@ -69,3 +72,16 @@ $(document).ready(function(){ } }); }); + +function collapse_toggle(elm) +{ + if (elm.hasClass('collapse')) + { + elm.removeClass('collapse'); + } + else + { + elm.addClass('collapse'); + } +} + From 6c1ccec806b221cb073e4672c9e3034e8bccce41 Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Fri, 30 Mar 2012 18:09:23 +0900 Subject: [PATCH 099/630] (fixes #2227) fixed to show smartphone header (tosaka) when user is not logged in --- apps/pc_frontend/templates/smtLayoutSns.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/apps/pc_frontend/templates/smtLayoutSns.php b/apps/pc_frontend/templates/smtLayoutSns.php index f7ccfedf3..2eb3785f0 100644 --- a/apps/pc_frontend/templates/smtLayoutSns.php +++ b/apps/pc_frontend/templates/smtLayoutSns.php @@ -34,11 +34,8 @@ - - - hasFlash('error')): ?>
    From 36d6260acb287808f98cf49855b666fec8c8c4b5 Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Fri, 30 Mar 2012 18:20:37 +0900 Subject: [PATCH 100/630] (fixes #2227) fixed login template style on smartphone. --- .../modules/default/templates/_smtLoginFormBox.php | 2 +- web/css/smt_main.css | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/pc_frontend/modules/default/templates/_smtLoginFormBox.php b/apps/pc_frontend/modules/default/templates/_smtLoginFormBox.php index 6eb9dd230..a02e32c78 100644 --- a/apps/pc_frontend/modules/default/templates/_smtLoginFormBox.php +++ b/apps/pc_frontend/modules/default/templates/_smtLoginFormBox.php @@ -57,7 +57,7 @@
    - + renderHiddenFields(); ?>
    diff --git a/web/css/smt_main.css b/web/css/smt_main.css index 776b5fb0d..01f1b4ad1 100644 --- a/web/css/smt_main.css +++ b/web/css/smt_main.css @@ -309,6 +309,10 @@ hr.white2 { margin-left: 0px!important; } +input.btn320[type="submit"] { + width: 320px; +} + * { word-break: break-all; } From 26403c4242b1d6ee5a96cb96b23e24f89eaeb3fd Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Fri, 30 Mar 2012 18:24:38 +0900 Subject: [PATCH 101/630] (refs #2227) add ability to show SNS register link on smartphone login page. --- .../modules/default/templates/_smtLoginFormBox.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apps/pc_frontend/modules/default/templates/_smtLoginFormBox.php b/apps/pc_frontend/modules/default/templates/_smtLoginFormBox.php index a02e32c78..c2c688c7f 100644 --- a/apps/pc_frontend/modules/default/templates/_smtLoginFormBox.php +++ b/apps/pc_frontend/modules/default/templates/_smtLoginFormBox.php @@ -60,6 +60,11 @@ renderHiddenFields(); ?> +getAuthAdapter()->getAuthConfig('invite_mode') == 2 + && opToolkit::isEnabledRegistration('pc') + && $form->getAuthAdapter()->getAuthConfig('self_invite_action')) : ?> +getAuthAdapter()->getAuthConfig('self_invite_action')) ?> +
    From 1d7cedb059084c54af6cac275f75fe7487c47fce Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Sat, 31 Mar 2012 16:15:43 +0900 Subject: [PATCH 102/630] fixed fatal error in notification center util function (fixes #2756) --- lib/util/opNotificationCenter.class.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/util/opNotificationCenter.class.php b/lib/util/opNotificationCenter.class.php index 53e1c3f8a..52b72292b 100644 --- a/lib/util/opNotificationCenter.class.php +++ b/lib/util/opNotificationCenter.class.php @@ -93,10 +93,9 @@ static public function getNotifications(Member $member = null) else { $notifications = unserialize($notificationObject->getValue()); + $notificationObject->free(true); } - $notificationObject->free(true); - return $notifications; } } From 3ca14f4acb58d40e67ae0a57a95f61c1a93da68e Mon Sep 17 00:00:00 2001 From: kashiwasan Date: Sat, 31 Mar 2012 16:35:27 +0900 Subject: [PATCH 103/630] fixed minor smartphone styles. (fixes #2227) --- apps/pc_frontend/templates/_tosaka.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/pc_frontend/templates/_tosaka.php b/apps/pc_frontend/templates/_tosaka.php index 2f9833529..5774bc157 100644 --- a/apps/pc_frontend/templates/_tosaka.php +++ b/apps/pc_frontend/templates/_tosaka.php @@ -2,7 +2,7 @@
    -
    +
    @@ -64,7 +64,7 @@
    -
    +
    @@ -78,9 +78,9 @@
    - + - +
    @@ -95,7 +95,7 @@

    +
    +x + +

    + +
    +