diff --git a/Classes/Controller/NewsletterSubscriptionController.php b/Classes/Controller/NewsletterSubscriptionController.php index d928654..64ba033 100644 --- a/Classes/Controller/NewsletterSubscriptionController.php +++ b/Classes/Controller/NewsletterSubscriptionController.php @@ -1,15 +1,28 @@ settings[$rteField] = $this->configurationManager->getContentObject()->parseFunc( + $this->settings[$rteField], + [], + '< lib.parseFunc_RTE' + ); + } + } /** * Render form action * * @return void */ - public function formAction() { - - $this->initalize(); - - $this->assignViewVariables(); - - $this->addJsFooterInlineCode(); - + public function formAction() + { + $this->view->assign( + 'ceuid', + $this->configurationManager->getContentObject()->getFieldVal('uid') + ); } /** * Render confirm action * - * Renders confirm result as a content element if hash parameter is set - * @return void + * Renders confirm result as a content element + * + * @param string $status + * @param string $hashid + * @param string $hash */ - public function confirmAction() { - - if ( $this->settings['forceFormView'] == 1 ) { - $this->forward('form', NULL, NULL, $this->request->getArguments()); - } - - $hash = GeneralUtility::removeXSS(GeneralUtility::_GP('hash')); - $status = GeneralUtility::removeXSS(GeneralUtility::_GP('status')); - $id = intval(GeneralUtility::removeXSS(GeneralUtility::_GP('hashid'))); - - if ( is_string($hash) && strlen(trim($hash)) > 0 ) { + public function confirmAction($status, $hashid, $hash) + { + $id = intval($hashid); - if ($status == 'subscribe') { - $this->confirmSubscription($hash,$id); - } elseif ($status == 'unsubscribe') { - $this->unsubscribe($hash,$id); - } + switch ($status) { + case self::STATUS_SUBSCRIBE: + $this->confirmSubscription($hash, $id); + break; + case self::STATUS_UNSUBSCRIBE: + $this->unSubscribe($hash, $id); + break; } } @@ -114,263 +116,173 @@ public function confirmAction() { * Render ajax action * * Ajax action: - * If hash parameter is set, used to make confirmation, else return result of subscribe/unsubscribe to form in formAction. + * Return result of subscribe/unsubscribe + * * @return void */ - public function ajaxAction() { - - $hash = GeneralUtility::removeXSS(GeneralUtility::_GP('hash')); - - if ( is_string($hash) === FALSE || strlen(trim($hash)) == 0 ) { - $response = $this->runAjax(); - header('Content-type: application/json'); - echo json_encode($response); - exit; - } else { - $status = GeneralUtility::removeXSS(GeneralUtility::_GP('status')); - $hash = GeneralUtility::removeXSS(GeneralUtility::_GP('hash')); - $id = intval(GeneralUtility::removeXSS(GeneralUtility::_GP('hashid'))); - - if ($status == 'subscribe') { - $this->confirmSubscription($hash,$id); - } elseif ($status == 'unsubscribe') { - $this->unsubscribe($hash,$id); + public function ajaxAction() + { + $isNewSubscription = $this->request->hasArgument('submitSubscribe'); + $arguments = $this->request->getArguments(); + foreach (['email', 'name'] as $item) { + if (array_key_exists($item, $arguments)) { + $arguments[$item] = trim($arguments[$item]); } } - } - - /** - * Initialize Controller - * - * Setup of properties - * @return void - */ - protected function initalize() { - $contentElementObject = $this->configurationManager->getContentObject()->data; + $message = $this->validateSubscription($isNewSubscription, $arguments); + $valid = $message === ''; - $this->contentElementUid = $contentElementObject['uid']; - $this->formName = $this->settings['tagIdPrefix'] . $this->contentElementUid; - - if ( $this->isFileAccessible( $this->settings['dynamicJsTemplateFile'] ) ) { - $this->dynamicJsTemplateFile = $this->settings['dynamicJsTemplateFile']; - } else { - $this->messages[] = 'The file with js template is not accesible (' . $this->settings['dynamicJsTemplateFile'] . ')'; + if ($valid) { + // It still could fail ? + list($valid, $message) = $this->processSubscription($isNewSubscription, $arguments); } + echo json_encode( + [ + 'success' => $valid, + 'message' => $message + ] + ); + exit(0); } /** - * Returns the content of dynamicJsTemplateFile with "markers" replaced. + * Process subscribe or unsubscribe action * - * @return string + * @param bool $isNewSubscription + * @param array $arguments + * @return array */ - protected function getProcessedDynamicJavascript() { - - $dynamicJsTemplate = $this->getFileContent( $this->dynamicJsTemplateFile ); - $dynamicJsTemplate = str_replace('__FORMNAME__', $this->formName, $dynamicJsTemplate); - - return $dynamicJsTemplate; - } + protected function processSubscription($isNewSubscription, $arguments) + { + // Variables to store message and status + $pid = intval($this->settings['saveFolder']); - /** - * Adds footer inline code - * - * Only adds javascript if function getProcessedDynamicJavascript generated some output. - * - */ - protected function addJsFooterInlineCode() { + // Check what action to execute + if ($isNewSubscription) { + // Since name is validated and still can be empty if name isn't mandatory, set empty name from email. + $name = empty($arguments['name']) ? $arguments['email'] : $arguments['name']; + + /** @var FrontendUserGroup $frontendUserGroup */ + $frontendUserGroup = $this->frontendUserGroupRepository->getFrontendUserGroupByUid( + $this->settings['userGroup'] + ); + + // Try to create feuser and store it in repository + /** @var FrontendUser $frontendUser */ + $frontendUser = $this->objectManager->get(FrontendUser::class); + $frontendUser->setAsSubscriber( + $pid, + $arguments['email'], + $name, + $this->settings['enableEmailConfirm'], + $frontendUserGroup + ); + + // Signal slot for after fe_user creation + $this->signalSlotDispatcher->dispatch( + __CLASS__, + 'afterFeUserCreation', + [$frontendUser, $this] + ); + + $this->frontendUserRepository->add($frontendUser); + $this->persistenceManager->persistAll(); + + // User was created + if ($this->settings['enableEmailConfirm']) { + /** @var EmailNotificationService $emailNotificationService */ + $emailNotificationService = GeneralUtility::makeInstance( + EmailNotificationService::class, + $this->settings + ); + + $emailNotificationService->sendConfirmationEmail( + $frontendUser, + $this->getFeLink($frontendUser->getUid(), self::STATUS_SUBSCRIBE), + false + ); + + $message = $this->translate('success.subscribe.subscribed-confirm'); + } else { + // Add user + $message = $this->translate('success.subscribe.subscribed-noconfirm'); + } - $javascript = $this->getProcessedDynamicJavascript(); + $success = true; + } else { + /** @var FrontendUser $frontendUser */ + $frontendUser = $this->frontendUserRepository->getUserByEmailAndPid($arguments['email'], $pid); + + if ($this->settings['enableEmailConfirm']) { + /** @var EmailNotificationService $emailNotificationService */ + $emailNotificationService = GeneralUtility::makeInstance( + EmailNotificationService::class, + $this->settings + ); + + $emailNotificationService->sendConfirmationEmail( + $frontendUser, + $this->getFeLink($frontendUser->getUid(), self::STATUS_UNSUBSCRIBE), + true + ); + + $message = $this->translate('success.unsubscribe.unsubscribed-confirm'); + } else { + // Set user to deleted + $this->frontendUserRepository->remove($frontendUser); + $this->persistenceManager->persistAll(); - if ( is_string($javascript) && strlen($javascript) > 0 ) { - /** @var PageRenderer $pageRenderer */ - $pageRenderer = GeneralUtility::makeInstance(PageRenderer::class); - $pageRenderer->addJsFooterInlineCode($this->formName, $javascript); + $message = $this->translate('success.unsubscribe.unsubscribed-noconfirm'); + } + $success = true; } + return [$success, $message]; } /** - * Assign view variables (formAction,) + * Check if data is valid * - * @return void - */ - protected function assignViewVariables() { - - $this->view->assign('ceuid',$this->contentElementUid); - $this->view->assign('displayNameField',$this->isNameVisibleInForm()); - $this->view->assign('formName',$this->formName); - $this->view->assign('sysLanguageUid', $GLOBALS['TSFE']->sys_language_uid); - - } - - /** - * Assign view variables (formAction,) + * @param bool $isNewSubscription + * @param array $arguments * - * @return bool If setup is valid. + * @return string Empty if no error */ - protected function isConfigurationValid() { + protected function validateSubscription($isNewSubscription, $arguments) + { + $alreadyExist = $this->frontendUserRepository->doesEmailExistInPid( + $arguments['email'], + intval($this->settings['saveFolder']) + ); - $isValid = true; + $message = ''; - $frontendUserGroup = $this->frontendUserGroupRepository->getFrontendUserGroupByUid( intval($this->settings['userGroup']) ); - if ( $frontendUserGroup === NULL ) { - $this->messages[] = 'Frontend Usergroup is not valid.'; - $isValid = false; + if (!GeneralUtility::validEmail($arguments['email'])) { + $message = $this->translate('error.invalid.email'); + } elseif ($isNewSubscription && $alreadyExist) { + $message = $this->translate('error.subscribe.already-subscribed'); + } elseif ($isNewSubscription && !$this->isNameValid($arguments['name'])) { + $message = $this->translate('error.invalid.name'); + } elseif ($isNewSubscription && is_null($this->frontendUserGroupRepository->getFrontendUserGroupByUid($this->settings['userGroup']))) { + $message = $this->translate('error.subscribe.4101'); + } elseif (!$isNewSubscription && !$alreadyExist) { + $message = $this->translate('error.unsubscribe.not-subscribed'); } - // $storagePid = intval($this->settings['saveFolder']); - - - // $GLOBALS['TYPO3_CONF_VARS']['BE']['warning_email_addr'] - + return $message; } /** - * runs ajax + * Translate label * - * @return array + * @param string $key + * @return NULL|string */ - public function runAjax() + protected function translate($key = '') { - $name = $this->getArgument('name'); - $email = $this->getArgument('email'); - $submitType = $this->getArgument('submitType'); - - $pid = intval($this->settings['saveFolder']); - $confirm = intval($this->settings['enableEmailConfirm']); - $emailConfirmIsEnabled = intval($this->settings['enableEmailConfirm']) == 1; - $userGroup = intval($this->settings['userGroup']); - - // Variables to store message and status - $message = ''; - $success = false; - - // TODO: VALIDATE CONFIGURATION AND ARGUMENTS BEFORE PROCEEDING !! - /* - $configurationIsValid = $this->isConfigurationValid(); - if ( !$configurationIsValid ) { - if ( $GLOBALS['BE_USER']->user['admin'] == 1 ) { - $message = ''; - } else { - $message = LocalizationUtility::translate('error.invalid.configuration', 'pxa_newsletter_subscription'); - } - } - */ - - // Check if email exist in pid - $emailExist = $this->frontendUserRepository->doesEmailExistInPid( $email, $pid ); - - // Check what action to execute - if ( $submitType == LocalizationUtility::translate('unsubscribe', 'pxa_newsletter_subscription') ) { - // On Unsubscribe - if ( GeneralUtility::validEmail($email) === FALSE ) { - // Not a valid email - $message = LocalizationUtility::translate('error.invalid.email', 'pxa_newsletter_subscription'); - } else { - if ( $emailExist === FALSE ) { - // email doesn't exist in pid - $message = LocalizationUtility::translate('error.unsubscribe.not-subscribed', 'pxa_newsletter_subscription'); - } else { - if ( $emailConfirmIsEnabled ) { - // Send unsubscribe email - $frontendUser = $this->frontendUserRepository->getUserByEmailAndPid($email, $pid); - if ($frontendUser !== NULL) { - $this->sendConfirmationEmail($frontendUser->getEmail(), $frontendUser->getName(), $frontendUser->getHash(), $frontendUser->getUid(), TRUE ); - $message = LocalizationUtility::translate('success.unsubscribe.unsubscribed-confirm', 'pxa_newsletter_subscription'); - $success = true; - } else { - $message = LocalizationUtility::translate('error.subscribe.4105', 'pxa_newsletter_subscription'); - } - } else { - // Set user to deleted - $frontendUser = $this->frontendUserRepository->getUserByEmailAndPid($email, $pid); - if ($frontendUser !== NULL) { - $frontendUser->setDeleted(1); - $this->frontendUserRepository->update($frontendUser); - $this->persistenceManager->persistAll(); - if ( $frontendUser->getDeleted() == TRUE ) { - $message = LocalizationUtility::translate('success.unsubscribe.unsubscribed-noconfirm', 'pxa_newsletter_subscription'); - $success = true; - } else { - $message = LocalizationUtility::translate('error.subscribe.4104', 'pxa_newsletter_subscription'); - } - } else { - $message = LocalizationUtility::translate('error.subscribe.4103', 'pxa_newsletter_subscription'); - } - } - } - } - } else { - // If not Unsubscribe - if ( GeneralUtility::validEmail($email) === FALSE ) { - // Not a valid email - $message = LocalizationUtility::translate('error.invalid.email', 'pxa_newsletter_subscription'); - } else { - if ( $this->isNameValid($name) === FALSE ) { - // Not a valid name - $message = LocalizationUtility::translate('error.invalid.name', 'pxa_newsletter_subscription'); - } else { - if ( $emailExist ) { - // Check if disabled, then resend confirmation mail ? - // email already exist in pid - $message = LocalizationUtility::translate('error.subscribe.already-subscribed', 'pxa_newsletter_subscription'); - } else { - /** @var FrontendUserGroup $frontendUserGroup */ - $frontendUserGroup = $this->frontendUserGroupRepository->getFrontendUserGroupByUid($userGroup); - if ( $frontendUserGroup === NULL ) { - // Could not load usergroup. - // TODO: generate email for admin, setup invalid frontend usergroup is invalid. - $message = LocalizationUtility::translate('error.subscribe.4101', 'pxa_newsletter_subscription'); - } else { - // Since name is validated and still can be empty if name isn't mandatory, set empty name from email. - if ( strlen(trim($name)) == 0 ) { - $name = $email; - } - // Try to create feuser and store it in repository - $frontendUser = $this->objectManager->get(\Pixelant\PxaNewsletterSubscription\Domain\Model\FrontendUser::class); - $frontendUser->setAsSubscriber( $pid, $email, $name, $emailConfirmIsEnabled, $frontendUserGroup ); - - // Signal slot for after fe_user creation - $this->signalSlotDispatcher->dispatch( - __CLASS__, - 'afterFeUserCreation', - array($frontendUser, $this) - ); - - $this->frontendUserRepository->add( $frontendUser ); - $this->persistenceManager->persistAll(); - - if ( $frontendUser->getUid() > 0 ) { - // User was created - if ( $emailConfirmIsEnabled ) { - // Send subscribe email - $this->sendConfirmationEmail($frontendUser->getEmail(), $frontendUser->getName(), $frontendUser->getHash(), $frontendUser->getUid(), FALSE); - $message = LocalizationUtility::translate('success.subscribe.subscribed-confirm', 'pxa_newsletter_subscription'); - $success = true; - } else { - // Add user - $message = LocalizationUtility::translate('success.subscribe.subscribed-noconfirm', 'pxa_newsletter_subscription'); - $success = true; - } - } else { - // The feuser was not created. - $message = LocalizationUtility::translate('error.subscribe.4102', 'pxa_newsletter_subscription') . $frontendUser->getUid(); - } - } - } - } - } - } - return array( - 'message' => $message, - 'success' => $success - ); + return LocalizationUtility::translate($key, 'pxa_newsletter_subscription'); } /** @@ -380,31 +292,31 @@ public function runAjax() * @param string $id * @return void */ - protected function confirmSubscription($hash,$id) { - - $status = true; - - try { + protected function confirmSubscription($hash, $id) + { + $status = false; - $frontendUser = $this->frontendUserRepository->getUserByUidAndHash($id, $hash); - if ($frontendUser !== NULL) { + if ($this->hashService->validateHmac('pxa_newsletter_subscription-subscribe' . $id, $hash)) { + /** @var FrontendUser $frontendUser */ + $frontendUser = $this->frontendUserRepository->findByUid($id); + if ($frontendUser !== null && $frontendUser->getDisable()) { $frontendUser->setDisable(0); - $this->frontendUserRepository->update($frontendUser); - $this->persistenceManager->persistAll(); - $message = LocalizationUtility::translate('subscribe_ok', 'pxa_newsletter_subscription'); - } - } catch (\Exception $e) { + $this->frontendUserRepository->update($frontendUser); + $message = $this->translate('subscribe_ok'); + $status = true; + } } if (!isset($message)) { - $message = LocalizationUtility::translate('subscribe_error', 'pxa_newsletter_subscription'); - $status = false; + $message = $this->translate('subscribe_error'); } - $this->view->assign('message', $message); - $this->view->assign('status', $status); + $this->view->assignMultiple([ + 'message' => $message, + 'status' => $status + ]); } /** @@ -414,65 +326,29 @@ protected function confirmSubscription($hash,$id) { * @param string $id * @return void */ - protected function unsubscribe($hash,$id) + protected function unSubscribe($hash, $id) { - $status = true; + $status = false; - try { - $frontendUser = $this->frontendUserRepository->getUserByUidAndHash($id, $hash); - if ($frontendUser !== NULL) { - $frontendUser->setDeleted(1); - $this->frontendUserRepository->update($frontendUser); - $this->persistenceManager->persistAll(); - $message = LocalizationUtility::translate('unsubscribe_ok', 'pxa_newsletter_subscription'); - } - } catch (\Exception $e) { + if ($this->hashService->validateHmac('pxa_newsletter_subscription-unsubscribe' . $id, $hash)) { + $frontendUser = $this->frontendUserRepository->findByUid($id); - } - - if (!isset($message)) { - $message = LocalizationUtility::translate('unsubscribe_error', 'pxa_newsletter_subscription'); - $status = false; - } + if ($frontendUser !== null) { + $this->frontendUserRepository->remove($frontendUser); - $this->view->assign('message', $message); - $this->view->assign('status', $status); - } - - /** - * Sends a confirmation mail - * - * @param string $email Email - * @param string $name Name - * @param string $hash Frontenduser computed hash - * @param int $id Frontenduser id - * @param bool $unsubscribeMail If the mail is only a unsubscribe mail - * @return bool - */ - protected function sendConfirmationEmail($email, $name, $hash, $id, $unsubscribeMail) { - - try { - $mail = GeneralUtility::makeInstance('TYPO3\\CMS\\Core\\Mail\\MailMessage'); - $mail->setFrom( $this->getConfirmMailFrom() ); - $mail->setTo( $this->getConfirmMailTo( $name, $email) ); - $mail->setSubject( $this->getConfirmMailSubject() ); - $mail->setBody( $this->getConfirmMailBody($name, $hash, $id, $unsubscribeMail ), 'text/plain' ); - - if ( GeneralUtility::validEmail($this->settings['confirmMailReplyTo']) === TRUE ) { - $mail->setReplyTo( $this->settings['confirmMailReplyTo'] ); + $message = $this->translate('unsubscribe_ok'); + $status = true; } - - $mail->send(); - - return $mail->isSent(); - - } catch (\Exception $e) { - - return false; - } + if (!isset($message)) { + $message = $this->translate('unsubscribe_error'); + } + $this->view->assignMultiple([ + 'message' => $message, + 'status' => $status + ]); } /** @@ -481,202 +357,27 @@ protected function sendConfirmationEmail($email, $name, $hash, $id, $unsubscribe * Also, if flexform setting Confirm Page is set, the link is to a page, otherwise it is a ajax link. * * @param int $id Frontenduser id - * @param string $hash Frontenduser computed hash - * @param bool $unsubscribeLink If true, link is to unsubscribe, default is to subscribe - * @return string - */ - protected function getFeLink( $id, $hash, $unsubscribeLink ) { - - $mode = $unsubscribeLink ? 'unsubscribe' : 'subscribe'; - $confirmPageId = intval($this->settings['confirmPage']); - - $linkParams = array( - "status" => $mode, - "hashid" => $id, - "hash" => $hash, - ); - - if ( $confirmPageId > 0 ) { - - $feLink = $this - ->uriBuilder - ->reset() - ->setTargetPageUid($confirmPageId) - ->setArguments($linkParams) - ->setNoCache(1) - ->setUseCacheHash(true) - ->setCreateAbsoluteUri(true) - ->uriFor('confirm', null, 'NewsletterSubscription'); - - } else { - - $feLink = $this - ->uriBuilder - ->reset() - ->setArguments($linkParams) - ->setNoCache(1) - ->setUseCacheHash(true) - ->setCreateAbsoluteUri(true) - ->uriFor('ajax', null, 'NewsletterSubscription'); - - } - - return $feLink; - } - - /** - * Generates the t3lib_mail_Message setFrom array for confirmation mail - * - * @return array - */ - protected function getConfirmMailFrom() { - - // Default to Install tool default settings - $confirmMailSenderName = $GLOBALS['TYPO3_CONF_VARS']['MAIL']['defaultMailFromName']; - $confirmMailSenderEmail= $GLOBALS['TYPO3_CONF_VARS']['MAIL']['defaultMailFromAddress']; - - // Override with flexform settings if set and valid - if ( is_string($this->settings['confirmMailSenderName']) && strlen(trim($this->settings['confirmMailSenderName'])) > 0 ) { - $confirmMailSenderName = $this->settings['confirmMailSenderName']; - } - if ( GeneralUtility::validEmail($this->settings['confirmMailSenderEmail']) ) { - $confirmMailSenderEmail = $this->settings['confirmMailSenderEmail']; - } - - // If from email is still empty, use a no-reply address - if ( strlen($confirmMailSenderEmail) == 0 ) { - // Won't work on all domains! - $domain = GeneralUtility::getIndpEnv('TYPO3_HOST_ONLY'); - if (substr($domain,0,3) == 'www') { - $domain = substr($domain, 4); - $confirmMailSenderEmail = 'no-reply@' . $domain; - } else { - $confirmMailSenderEmail = 'no-reply@' . $domain; - } - $confirmMailSenderName = $confirmMailSenderEmail; - } - - if ( strlen($confirmMailSenderName) == 0 ) { - $confirmMailSenderName = $confirmMailSenderEmail; - } - - if (preg_match('/\\s|,/', $confirmMailSenderName) >= 1) { - $confirmMailSenderName = '"' . $confirmMailSenderName . '"'; - } - - return array( $confirmMailSenderEmail => $confirmMailSenderName ); - - } - - /** - * Generates the t3lib_mail_Message setTo array for confirmation mail - * - * @param string $name Name - * @param string $email Email - * @return array - */ - protected function getConfirmMailTo($name, $email) { - - // Set defaults, name same as email - $confirmMailRecipientName = $email; - $confirmMailRecipientEmail = $email; - - // If name is set, use it - if ( is_string($name) && strlen(trim($name)) > 0 ) { - $confirmMailRecipientName = $name; - } - - if (preg_match('/\\s|,/', $confirmMailRecipientName) >= 1) { - $confirmMailRecipientName = '"' . $confirmMailRecipientName . '"'; - } - - return array( $confirmMailRecipientEmail => $confirmMailRecipientName ); - } - - /** - * Generates the t3lib_mail_Message setSubject string for confirmation mail - * + * @param string $status Subscribe or unsubscribe * @return string */ - protected function getConfirmMailSubject() { - - // Set defaults subject from translation - $subject = LocalizationUtility::translate('confirm_mail_subject', 'pxa_newsletter_subscription'); - - // Override with flexform settings if set and valid - if ( is_string($this->settings['confirmMailSubject']) && strlen(trim($this->settings['confirmMailSubject'])) > 0 ) { - $subject = $this->settings['confirmMailSubject']; - } - return $subject; - - } - - /** - * Generates the t3lib_mail_Message setBody string for confirmation mail - * - * @param string $name Name - * @param string $hash Frontenduser computed hash - * @param int $id Frontenduser id - * @param bool $unsubscribeMail If the mail is only a unsubscribe mail - * @return string - */ - protected function getConfirmMailBody($name, $hash, $id, $unsubscribeMail) { - - $subscribeLink = $this->getFeLink( $id, $hash, false ); - $unsubscribeLink = $this->getFeLink( $id, $hash, true ); - - // Set defaults from original translation, has replacement in texts - $bodyText = LocalizationUtility::translate('confirm_mail_greeting', 'pxa_newsletter_subscription',array($name)) . PHP_EOL . PHP_EOL; - $bodySubscribeLink = LocalizationUtility::translate('confirm_mail_line1', 'pxa_newsletter_subscription', array( PHP_EOL . PHP_EOL . $subscribeLink . PHP_EOL . PHP_EOL)); - $bodyUnsubscribeLink = LocalizationUtility::translate('confirm_mail_line2', 'pxa_newsletter_subscription',array( PHP_EOL . PHP_EOL . $unsubscribeLink . PHP_EOL . PHP_EOL)); - $bodyFooter = ''; - - // Override with flexform values if set - if ( $unsubscribeMail ) { - if ( is_string($this->settings['confirmMailUnsubscribeBody']) && strlen(trim($this->settings['confirmMailUnsubscribeBody'])) > 0 ) { - $bodyText = $this->settings['confirmMailUnsubscribeBody'] . PHP_EOL . PHP_EOL; - } - } else { - if ( is_string($this->settings['confirmMailSubscribeBody']) && strlen(trim($this->settings['confirmMailSubscribeBody'])) > 0 ) { - $bodyText = $this->settings['confirmMailSubscribeBody'] . PHP_EOL . PHP_EOL; - } - } - - if ( is_string($this->settings['confirmMailSubscribeInstruction']) && strlen(trim($this->settings['confirmMailSubscribeInstruction'])) > 0 ) { - $bodySubscribeLink = $this->settings['confirmMailSubscribeInstruction']; - $bodySubscribeLink .= PHP_EOL . $subscribeLink . PHP_EOL . PHP_EOL; - } - - if ( is_string($this->settings['confirmMailUnsubscribeInstruction']) && strlen(trim($this->settings['confirmMailUnsubscribeInstruction'])) > 0 ) { - $bodyUnsubscribeLink = $this->settings['confirmMailUnsubscribeInstruction']; - $bodyUnsubscribeLink .= PHP_EOL . $unsubscribeLink . PHP_EOL . PHP_EOL; - } - - if ( is_string($this->settings['confirmMailFooter']) && strlen(trim($this->settings['confirmMailFooter'])) > 0 ) { - $bodyFooter = PHP_EOL . PHP_EOL . $this->settings['confirmMailFooter']; - } - // Remove subscribe link part of message if it is a unsubscribe mail. - if ($unsubscribeMail) { - $bodySubscribeLink = ''; - } - - return $bodyText . $bodySubscribeLink . $bodyUnsubscribeLink . $bodyFooter; - - } - - /** - * Get request argument - * - * @var string $argument Name of argument - * @return string - */ - protected function getArgument($argument) { - - $return = ''; - if ( $this->request->hasArgument($argument) ) { - $return = GeneralUtility::removeXSS( $this->request->getArgument($argument) ); - } - return $return; + protected function getFeLink($id, $status) + { + $confirmPageId = intval($this->settings['confirmPage']) ? + intval($this->settings['confirmPage']) : $GLOBALS['TSFE']->id; + + $linkParams = [ + 'status' => $status, + 'hashid' => $id, + 'hash' => $this->hashService->generateHmac('pxa_newsletter_subscription-' . $status . $id) + ]; + + + return $this + ->uriBuilder + ->reset() + ->setTargetPageUid($confirmPageId) + ->setCreateAbsoluteUri(true) + ->uriFor('confirm', $linkParams); } /** @@ -685,68 +386,8 @@ protected function getArgument($argument) { * @var string $name Name * @return bool */ - protected function isNameValid($name) { - $isValid = FALSE; - if ( $this->settings['formFieldNameIsMandatory'] == 0 ) { - $isValid = TRUE; - } else { - if ( is_string($name) && strlen(trim($name)) > 0 ) { - $isValid = TRUE; - } - } - return $isValid; - } - - /** - * Check if name field should be hidden in form - * - * @return bool - */ - protected function isNameVisibleInForm() { - $isVisible = true; - if ( $this->settings['formFieldNameIsMandatory'] == 0 ) { - if ( $this->settings['formFieldNameHidden'] == 1 ) { - $isVisible = false; - } - } - return $isVisible; - } - - /** - * Fetches content from file - * - * @param string $filename - * @return string FileContent - */ - public function getFileContent($filename) { - - $dynamicJavascript = ''; - - if ( $this->isFileAccessible($filename) ) { - $absoluteFilename = GeneralUtility::getFileAbsFileName($filename); - $dynamicJavascript = GeneralUtility::getUrl($absoluteFilename); - } - - return $dynamicJavascript; - } - - /** - * Check if file is accessible - * - * @param string $filename Relative path to file, EXT: works. - * @return bool - */ - public function isFileAccessible($filename) { - - $isFileAccessible = false; - - $absoluteFilename = GeneralUtility::getFileAbsFileName($filename); - if (GeneralUtility::isAllowedAbsPath($absoluteFilename)) { - if ( \file_exists($absoluteFilename) ) { - $isFileAccessible = true; - } - } - - return $isFileAccessible; + protected function isNameValid($name) + { + return !$this->settings['formFieldNameIsMandatory'] || !empty($name); } } diff --git a/Classes/Domain/Model/FrontendUser.php b/Classes/Domain/Model/FrontendUser.php index 5357565..5ef8406 100644 --- a/Classes/Domain/Model/FrontendUser.php +++ b/Classes/Domain/Model/FrontendUser.php @@ -35,105 +35,69 @@ * */ -class FrontendUser extends \TYPO3\CMS\Extbase\Domain\Model\FrontendUser { - - /** - * @var boolean - */ - protected $disable; - - /** - * @var boolean - */ - protected $deleted; - - /** - * @param boolean $disable - */ - public function setDisable($disable) { - $this->disable = $disable; - } - - /** - * @return boolean - */ - public function getDisable() { - return $this->disable; - } - - /** - * @param boolean $deleted - */ - public function setDeleted($deleted) { - $this->deleted = $deleted; - } - - /** - * @return boolean - */ - public function getDeleted() { - return $this->deleted; - } - - /** - * Sets password with a random generated password. - * - * @param int $length The length of the password. - * @return void - */ - public function setRandomPassword($length = 12) { - - $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_-=+;:,.?"; - $password = substr( str_shuffle( $chars ), 0, $length ); - - $this->password = $password; - - } - - /** - * Sets random hash (uses fax property). - * - * @return void - */ - public function setHash() - { - $randomHash = substr(md5(uniqid(rand(), true)), 16, 16); - $this->fax = $randomHash; - } - - /** - * Gets random hash (uses fax property). - * - * @return string - */ - public function getHash() - { - return $this->fax; - } - - /** - * Creates a new Frontend User as a subscriber. - * - * @param int $pid The page to store the Frontend User on. - * @param string $email The email of the user. - * @param string $name The name of the user. - * @param bool $confirm If the user needs to confirm subscription by email. - * @param \TYPO3\CMS\Extbase\Domain\Model\FrontendUserGroup $usergroup The usergroup user should be a member of. - * @return void - */ - public function setAsSubscriber($pid, $email, $name, $confirm, \TYPO3\CMS\Extbase\Domain\Model\FrontendUserGroup $usergroup) { - - $this->setPid(intval($pid)); - $this->setUsername($email); - $this->setEmail($email); - $this->setName($name); - $this->setDisable(intval($confirm)); - $this->setHash(); - $this->setRandomPassword(12); - $this->addUsergroup($usergroup); - - } - - +class FrontendUser extends \TYPO3\CMS\Extbase\Domain\Model\FrontendUser +{ + + /** + * @var boolean + */ + protected $disable; + + /** + * @param boolean $disable + */ + public function setDisable($disable) + { + $this->disable = $disable; + } + + /** + * @return boolean + */ + public function getDisable() + { + return $this->disable; + } + + /** + * Sets password with a random generated password. + * + * @param int $length The length of the password. + * @return void + */ + public function setRandomPassword($length = 12) + { + + $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_-=+;:,.?"; + $password = substr(str_shuffle($chars), 0, $length); + + $this->password = $password; + } + + /** + * Creates a new Frontend User as a subscriber. + * + * @param int $pid The page to store the Frontend User on. + * @param string $email The email of the user. + * @param string $name The name of the user. + * @param bool $confirm If the user needs to confirm subscription by email. + * @param \TYPO3\CMS\Extbase\Domain\Model\FrontendUserGroup $usergroup The usergroup user should be a member of. + * @return void + */ + public function setAsSubscriber( + $pid, + $email, + $name, + $confirm, + \TYPO3\CMS\Extbase\Domain\Model\FrontendUserGroup $usergroup + ) { + + $this->setPid(intval($pid)); + $this->setUsername($email); + $this->setEmail($email); + $this->setName($name); + $this->setDisable(intval($confirm)); + $this->setRandomPassword(12); + $this->addUsergroup($usergroup); + } } -?> \ No newline at end of file diff --git a/Classes/Domain/Model/FrontendUserGroup.php b/Classes/Domain/Model/FrontendUserGroup.php index 457ed71..1c5bece 100644 --- a/Classes/Domain/Model/FrontendUserGroup.php +++ b/Classes/Domain/Model/FrontendUserGroup.php @@ -1,4 +1,5 @@ createQuery(); - $query = $this->createQuery(); - - $query->getQuerySettings()->setRespectStoragePage(FALSE); - - $frontendUserGroup = $query - ->matching( - $query->equals('uid',$uid) - ) - ->execute() - ->getFirst(); - - return $frontendUserGroup; - } + $query->getQuerySettings()->setRespectStoragePage(false); + return $query + ->matching( + $query->equals('uid', $uid) + ) + ->execute() + ->getFirst(); + } } -?> diff --git a/Classes/Domain/Repository/FrontendUserRepository.php b/Classes/Domain/Repository/FrontendUserRepository.php index 86dbcc3..be873ad 100644 --- a/Classes/Domain/Repository/FrontendUserRepository.php +++ b/Classes/Domain/Repository/FrontendUserRepository.php @@ -1,4 +1,5 @@ createQuery(); - - $query->getQuerySettings()->setRespectStoragePage(FALSE); - $query->getQuerySettings()->setIgnoreEnableFields(TRUE); - $query->getQuerySettings()->setEnableFieldsToBeIgnored(array('disabled')); - - $countUsers = $query - ->matching( - $query->logicalAnd( - $query->equals('email', $email), - $query->equals('pid', $pid) - ) - ) - ->count(); - - return $countUsers; - } - - /** - * Does frontend user with email exist on page with pid. - * - * @param string $email - * @param int $pid - * @return bool - */ - public function doesEmailExistInPid($email, $pid) { - - $query = $this->createQuery(); - - $query->getQuerySettings()->setRespectStoragePage(FALSE); - $query->getQuerySettings()->setIgnoreEnableFields(TRUE); - $query->getQuerySettings()->setEnableFieldsToBeIgnored(array('disabled')); - - $countUsers = $query - ->matching( - $query->logicalAnd( - $query->equals('email', $email), - $query->equals('pid', $pid) - ) - ) - ->count(); - - return $countUsers > 0; - } - - /** - * Gets a Frontend User by uid and hash (fax) - * - * @param int $uid - * @param string $hash - * @return Pixelant\PxaNewsletterSubscription\Domain\Model\FrontendUser - */ - public function getUserByUidAndHash($uid, $hash) { - - $query = $this->createQuery(); - - $query->getQuerySettings()->setRespectStoragePage(FALSE); - $query->getQuerySettings()->setIgnoreEnableFields(TRUE); - $query->getQuerySettings()->setEnableFieldsToBeIgnored(array('disabled')); - - $frontendUser = $query - ->matching( - $query->logicalAnd( - $query->equals('uid', $uid), - $query->equals('fax', $hash) - ) - ) - ->execute() - ->getFirst(); - - return $frontendUser; - } - - /** - * Gets a sigle (first) Frontend User by email and pid - * - * @param string $email - * @param int $pid - * @return Pixelant\PxaNewsletterSubscription\Domain\Model\FrontendUser - */ - public function getUserByEmailAndPid($email, $pid) { - - $query = $this->createQuery(); - - $query->getQuerySettings()->setRespectStoragePage(FALSE); - $query->getQuerySettings()->setIgnoreEnableFields(TRUE); - $query->getQuerySettings()->setEnableFieldsToBeIgnored(array('disabled')); - - $frontendUser = $query - ->matching( - $query->logicalAnd( - $query->equals('email', $email), - $query->equals('pid', $pid) - ) - ) - ->execute() - ->getFirst(); - - return $frontendUser; - } - +class FrontendUserRepository extends \TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository +{ + + /** + * initialize default settings + */ + public function initializeObject() + { + /** @var Typo3QuerySettings $defaultQuerySettings */ + $defaultQuerySettings = $this->objectManager->get(Typo3QuerySettings::class); + + $defaultQuerySettings->setRespectStoragePage(false); + $defaultQuerySettings->setIgnoreEnableFields(true); + $defaultQuerySettings->setEnableFieldsToBeIgnored(['disabled']); + + $this->setDefaultQuerySettings($defaultQuerySettings); + } + + /** + * Find one user + * + * @param int $uid + * @return object + */ + public function findByUid($uid) + { + $query = $this->createQuery(); + return $query->matching($query->equals('uid', $uid))->execute()->getFirst(); + } + + /** + * Does frontend user with email exist on page with pid. + * + * @param string $email + * @param int $pid + * @return bool + */ + public function doesEmailExistInPid($email, $pid) + { + $query = $this->createQuery(); + + $countUsers = $query + ->matching( + $query->logicalAnd( + $query->equals('email', $email), + $query->equals('pid', $pid) + ) + ) + ->count(); + + return $countUsers > 0; + } + + /** + * Gets a sigle (first) Frontend User by email and pid + * + * @param string $email + * @param int $pid + * @return \Pixelant\PxaNewsletterSubscription\Domain\Model\FrontendUser|object + */ + public function getUserByEmailAndPid($email, $pid) + { + + $query = $this->createQuery(); + + $frontendUser = $query + ->matching( + $query->logicalAnd( + $query->equals('email', $email), + $query->equals('pid', $pid) + ) + ) + ->execute() + ->getFirst(); + + return $frontendUser; + } } -?> diff --git a/Classes/Service/EmailNotificationService.php b/Classes/Service/EmailNotificationService.php new file mode 100644 index 0000000..cd6d583 --- /dev/null +++ b/Classes/Service/EmailNotificationService.php @@ -0,0 +1,170 @@ +mailMessage = GeneralUtility::makeInstance(MailMessage::class); + + // plugin settings + $this->settings = $settings; + } + + /** + * Send email + * + * @param FrontendUser $feUser + * @param string $link + * @param bool $unSubscribeMail + * @return void + */ + public function sendConfirmationEmail(FrontendUser $feUser, $link, $unSubscribeMail) + { + $link = $this->generateLink($link); + + $this->mailMessage->setFrom($this->getSender()); + $this->mailMessage->setTo($feUser->getEmail()); + $this->mailMessage->setSubject($this->getConfirmMailSubject()); + $this->mailMessage->setBody( + $this->getConfirmMailBody($feUser, $link, $unSubscribeMail), + 'text/html' + ); + + $this->mailMessage->send(); + } + + /** + * Get sender name and email + * + * @return array + */ + protected function getSender() + { + // Override with flexform settings if set and valid + if (!empty($this->settings['confirmMailSenderName'])) { + $confirmMailSenderName = $this->settings['confirmMailSenderName']; + } else { + $confirmMailSenderName = $GLOBALS['TYPO3_CONF_VARS']['MAIL']['defaultMailFromName']; + } + + if (GeneralUtility::validEmail($this->settings['confirmMailSenderEmail'])) { + $confirmMailSenderEmail = $this->settings['confirmMailSenderEmail']; + } else { + $confirmMailSenderEmail = $GLOBALS['TYPO3_CONF_VARS']['MAIL']['defaultMailFromAddress']; + } + + // If from email is still empty, use a no-reply address + if (empty($confirmMailSenderEmail)) { + // Won't work on all domains! + $domain = GeneralUtility::getIndpEnv('TYPO3_HOST_ONLY'); + if (substr($domain, 0, 3) == 'www') { + $domain = substr($domain, 4); + } + + $confirmMailSenderEmail = 'no-reply@' . $domain; + } + + if (empty($confirmMailSenderName)) { + $confirmMailSenderName = $confirmMailSenderEmail; + } + + return [$confirmMailSenderEmail => $confirmMailSenderName]; + } + + /** + * Generates the Body string for confirmation mail + * + * @param FrontendUser $feUser + * @param $link + * @param $unSubscribeMail + * @return string + */ + protected function getConfirmMailBody(FrontendUser $feUser, $link, $unSubscribeMail) + { + // Check flex form value + $bodyText = $unSubscribeMail ? + $this->settings['confirmMailUnsubscribeBody'] : $this->settings['confirmMailSubscribeBody']; + + if (empty($bodyText)) { + // Set defaults from original translation, has replacement in texts + $bodyText = LocalizationUtility::translate( + 'confirm_mail_greeting', + 'pxa_newsletter_subscription', + [$feUser->getName()] + ); + } + + if (strpos($bodyText, self::LINK_HOLDER) !== false) { + $bodyText = str_replace(self::LINK_HOLDER, $link, $bodyText); + } else { + // append + $bodyText .= sprintf( + '

%s

', + $link + ); + } + + return $bodyText; + } + + /** + * If link text is set, generate HTML for link + * + * @param string $link + * @return string + */ + protected function generateLink($link) + { + if (!empty($this->settings['confirmLinkText'])) { + $link = sprintf( + '%s', + $link, + $this->settings['confirmLinkText'] + ); + } + + return $link; + } + + /** + * Generates the Subject for confirmation mail + * + * @return string + */ + protected function getConfirmMailSubject() + { + return empty($this->settings['confirmMailSubject']) ? + LocalizationUtility::translate('confirm_mail_subject', 'pxa_newsletter_subscription') : + $this->settings['confirmMailSubject']; + } +} diff --git a/Classes/ViewHelpers/WrapContentViewHelper.php b/Classes/ViewHelpers/WrapContentViewHelper.php new file mode 100644 index 0000000..5819228 --- /dev/null +++ b/Classes/ViewHelpers/WrapContentViewHelper.php @@ -0,0 +1,62 @@ +registerArgument('settings', 'array', 'Settings', true); + } + + /** + * Wrap with special classes + * + * @return string + */ + public function render() + { + return $this->wrap( + 'outerWrap', + $this->wrap( + 'innerWrap', + $this->renderChildren() + ) + ); + } + + /** + * Wrap + * + * @param $wrapType + * @param $content + * @return string + */ + protected function wrap($wrapType, $content) + { + if (is_array($this->arguments['settings'][$wrapType])) { + if ((int)$this->arguments['settings'][$wrapType]['enabled'] === 1) { + return sprintf( + '
%s
', + $this->arguments['settings'][$wrapType]['class'], + $content + ); + } + } + + return $content; + } +} diff --git a/Configuration/FlexForms/flexform_pi1.xml b/Configuration/FlexForms/flexform_pi1.xml index 451f846..bda766e 100644 --- a/Configuration/FlexForms/flexform_pi1.xml +++ b/Configuration/FlexForms/flexform_pi1.xml @@ -1,250 +1,180 @@ - - 1 - - - - - - - Settings - - - array - - - - - - check - - reload - - - - - - - check - - reload - - - - - - FIELD:settings.formFieldNameIsMandatory:=:0 - - check - - - - - - - - check - - - - - - - - check - - - - - - 1 - - - group - db - pages - 1 - 1 - 1 - 1 - - - suggest - - - - - - - - 1 - - - group - db - fe_groups - 1 - 1 - 1 - - - - - - 1 - - - group - db - pages - 1 - 1 - 0 - 1 - - - suggest - - - - - - - - - - - - - Confirmation Mail - - - - array - - - - - - input - 20 - 30 - - - - - - - - - input - 20 - 30 - trim - - - - - - - - input - 20 - 30 - trim - - - - - - - - input - 35 - 35 - - - - - - - - text - 35 - 10 - - - - - - - - text - 35 - 10 - - - - - - - - text - 35 - 2 - - - - - - - - text - 35 - 2 - - - - - - - - text - 35 - 3 - - - - - - - + + 1 + + + + + + + Settings + + + array + + + + + reload + + check + + + + + + + + check + + + + + + + + check + + + + + + 1 + + + group + db + pages + 1 + 1 + 1 + 1 + + + suggest + + + + + + + + 1 + + + group + db + fe_groups + 1 + 1 + 1 + + + + + + 1 + + FIELD:settings.enableEmailConfirm:REQ:TRUE + + group + db + pages + 1 + 1 + 0 + 1 + + + suggest + + + + + + + + + + + + Confirmation Mail + + FIELD:sDEF.settings.enableEmailConfirm:REQ:TRUE + array + + + + + + input + 20 + 30 + trim,required + + + + + + + + input + 20 + 30 + trim,required + + + + + + + + input + 35 + 35 + trim,required + + + + + + + + input + 35 + 35 + trim + + + + + + + richtext[*]:rte_transform[mode=ts_css] + + text + 35 + 10 + trim,required + 1 + + + + + + + richtext[*]:rte_transform[mode=ts_css] + + text + 35 + 10 + trim,required + 1 + + + + + + + \ No newline at end of file diff --git a/Configuration/TCA/Overrides/fe_users.php b/Configuration/TCA/Overrides/fe_users.php new file mode 100644 index 0000000..a0af096 --- /dev/null +++ b/Configuration/TCA/Overrides/fe_users.php @@ -0,0 +1,10 @@ + 1, + 'config' => [ + 'type' => 'passthrough' + ] +]; diff --git a/Configuration/TCA/Overrides/sys_template.php b/Configuration/TCA/Overrides/sys_template.php new file mode 100644 index 0000000..fc9ca7d --- /dev/null +++ b/Configuration/TCA/Overrides/sys_template.php @@ -0,0 +1,8 @@ + Name is mandatory for subscribe - - Exclude name in the subscribe form - - Save to folder + Storage Select a usergroup - - Force form view (Usable f.ex. when you have a subscribe in the footer) - Display unsubscribe button - Confirmation page (if none is selected the ajax action is used, the page will only contain the confirm message) + Confirmation page (if none is selected current page will be used) Sender name in confirm mail @@ -33,26 +27,17 @@ Sender e-mail in confirm mail - - Reply to address in confirm mail - Subject of confirmation mail - Body of subscribe confirmation mail + Body of subscribe confirmation mail. Use "{link}" to add confirmation link. - Body of unsubscribe confirmation mail - - - Subscribe instruction in confirmation mail (displayed above subscribelink) - - - Unsubscribe instruction in confirmation mail (displayed above unsubscribelink) + Body of unsubscribe confirmation mail. Use "{link}" to add confirmation link. - - Footer in confirmation mail + + Confirmation link text. If empty full link is used. diff --git a/Resources/Private/Layouts/Standalone.html b/Resources/Private/Layouts/Standalone.html deleted file mode 100644 index c90cd90..0000000 --- a/Resources/Private/Layouts/Standalone.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - Newsletter options - - - - -
-
-
- -
-
-
- - \ No newline at end of file diff --git a/Resources/Private/Templates/NewsletterSubscription/Ajax.html b/Resources/Private/Templates/NewsletterSubscription/Ajax.html deleted file mode 100644 index 0942ccc..0000000 --- a/Resources/Private/Templates/NewsletterSubscription/Ajax.html +++ /dev/null @@ -1,14 +0,0 @@ - - -The standalone layout is used since it is not rendered on a page - - -
-

{message}

-

- - - -

-
-
diff --git a/Resources/Private/Templates/NewsletterSubscription/Confirm.html b/Resources/Private/Templates/NewsletterSubscription/Confirm.html index f9b8b52..df05cf0 100644 --- a/Resources/Private/Templates/NewsletterSubscription/Confirm.html +++ b/Resources/Private/Templates/NewsletterSubscription/Confirm.html @@ -1,15 +1,21 @@ + + - - -
- + + +
+ +
+
+ +
+ -

{message}

- - -
-
- -
\ No newline at end of file + +

+ {message} +

+
+ \ No newline at end of file diff --git a/Resources/Private/Templates/NewsletterSubscription/Form.html b/Resources/Private/Templates/NewsletterSubscription/Form.html index be48a9f..19d282b 100644 --- a/Resources/Private/Templates/NewsletterSubscription/Form.html +++ b/Resources/Private/Templates/NewsletterSubscription/Form.html @@ -1,182 +1,103 @@ + + - - Don't change the id of the form, it is targeted from js, - - - - - - - - - - - - - - - Check if inputs should be wrapped with a div, start - -
- - - Render sections with inputs - - - - Check if inputs should be wrapped with a div, end - -
-
- + + + + + Form fields. + Wrap content will check if it need to enable it with inner or outer wrap + + + + Name if enabled + + + + + + + + + + + + + + + +
+
- - - Check if buttons should be wrapped with a div, start - -
- - - Render sections with buttons - - - - Check if buttons should be wrapped with a div, end - -
-
- -
- - - - Should name field be visible in form - - - Check if field should be wrapped with a div, start - -
- - - Check if field should be wrapped with a second div, start - -
- - - Render input field - - - Check if field should be wrapped with a second div, end - -
-
- - Check if field should be wrapped with a div, end - -
-
- -
- -
- - - - Check if field should be wrapped with a div, start - -
- - - Check if field should be wrapped with a second div, start - -
- - - Render input field - - - Check if field should be wrapped with a second div, end - -
-
- - Check if field should be wrapped with a div, end - -
-
- -
- - Check if button should be wrapped with a div, start - -
- - - Render button - - - - - - - - - - - - - - - - - - Check if button should be wrapped with a div, start - -
-
- + + + + + + + + + + + + + + + + + +
- - - - Check if button should be wrapped with a div, start - -
- - - Render button - - - - - - - - - - - - - - - - - - Check if button should be wrapped with a div, start - -
-
- -
- -
\ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Resources/Public/Css/bootstrap-responsive.min.css b/Resources/Public/Css/bootstrap-responsive.min.css deleted file mode 100644 index 60a47c9..0000000 --- a/Resources/Public/Css/bootstrap-responsive.min.css +++ /dev/null @@ -1,12 +0,0 @@ -.clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";} -.clearfix:after{clear:both;} -.hide-text{overflow:hidden;text-indent:100%;white-space:nowrap;} -.input-block-level{display:block;width:100%;min-height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;} -.hidden{display:none;visibility:hidden;} -.visible-phone{display:none;} -.visible-tablet{display:none;} -.visible-desktop{display:block;} -.hidden-phone{display:block;} -.hidden-tablet{display:block;} -.hidden-desktop{display:none;} -@media (max-width:767px){.visible-phone{display:block;} .hidden-phone{display:none;} .hidden-desktop{display:block;} .visible-desktop{display:none;}}@media (min-width:768px) and (max-width:979px){.visible-tablet{display:block;} .hidden-tablet{display:none;} .hidden-desktop{display:block;} .visible-desktop{display:none;}}@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:18px;} 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;}}@media (max-width:767px){body{padding-left:20px;padding-right:20px;} .navbar-fixed-top{margin-left:-20px;margin-right:-20px;} .container{width:auto;} .row-fluid{width:100%;} .row{margin-left:0;} .row>[class*="span"],.row-fluid>[class*="span"]{float:none;display:block;width:auto;margin:0;} .thumbnails [class*="span"]{width:auto;} input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;} .input-prepend input[class*="span"],.input-append input[class*="span"]{width:auto;}}@media (min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:20px;} .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px;} .span12{width:724px;} .span11{width:662px;} .span10{width:600px;} .span9{width:538px;} .span8{width:476px;} .span7{width:414px;} .span6{width:352px;} .span5{width:290px;} .span4{width:228px;} .span3{width:166px;} .span2{width:104px;} .span1{width:42px;} .offset12{margin-left:764px;} .offset11{margin-left:702px;} .offset10{margin-left:640px;} .offset9{margin-left:578px;} .offset8{margin-left:516px;} .offset7{margin-left:454px;} .offset6{margin-left:392px;} .offset5{margin-left:330px;} .offset4{margin-left:268px;} .offset3{margin-left:206px;} .offset2{margin-left:144px;} .offset1{margin-left:82px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.762430939%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid > .span12{width:99.999999993%;} .row-fluid > .span11{width:91.436464082%;} .row-fluid > .span10{width:82.87292817100001%;} .row-fluid > .span9{width:74.30939226%;} .row-fluid > .span8{width:65.74585634900001%;} .row-fluid > .span7{width:57.182320438000005%;} .row-fluid > .span6{width:48.618784527%;} .row-fluid > .span5{width:40.055248616%;} .row-fluid > .span4{width:31.491712705%;} .row-fluid > .span3{width:22.928176794%;} .row-fluid > .span2{width:14.364640883%;} .row-fluid > .span1{width:5.801104972%;} input,textarea,.uneditable-input{margin-left:0;} input.span12, textarea.span12, .uneditable-input.span12{width:714px;} input.span11, textarea.span11, .uneditable-input.span11{width:652px;} input.span10, textarea.span10, .uneditable-input.span10{width:590px;} input.span9, textarea.span9, .uneditable-input.span9{width:528px;} input.span8, textarea.span8, .uneditable-input.span8{width:466px;} input.span7, textarea.span7, .uneditable-input.span7{width:404px;} input.span6, textarea.span6, .uneditable-input.span6{width:342px;} input.span5, textarea.span5, .uneditable-input.span5{width:280px;} input.span4, textarea.span4, .uneditable-input.span4{width:218px;} input.span3, textarea.span3, .uneditable-input.span3{width:156px;} input.span2, textarea.span2, .uneditable-input.span2{width:94px;} input.span1, textarea.span1, .uneditable-input.span1{width:32px;}}@media (max-width:979px){body{padding-top:0;} .navbar-fixed-top{position:static;margin-bottom:18px;} .navbar-fixed-top .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .navbar .nav-collapse{clear:left;} .navbar .nav{float:none;margin:0 0 9px;} .navbar .nav>li{float:none;} .navbar .nav>li>a{margin-bottom:2px;} .navbar .nav>.divider-vertical{display:none;} .navbar .nav .nav-header{color:#999999;text-shadow:none;} .navbar .nav>li>a,.navbar .dropdown-menu a{padding:6px 15px;font-weight:bold;color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .navbar .dropdown-menu li+li a{margin-bottom:2px;} .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;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;overflow:visible !important;}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:30px;} .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px;} .span12{width:1170px;} .span11{width:1070px;} .span10{width:970px;} .span9{width:870px;} .span8{width:770px;} .span7{width:670px;} .span6{width:570px;} .span5{width:470px;} .span4{width:370px;} .span3{width:270px;} .span2{width:170px;} .span1{width:70px;} .offset12{margin-left:1230px;} .offset11{margin-left:1130px;} .offset10{margin-left:1030px;} .offset9{margin-left:930px;} .offset8{margin-left:830px;} .offset7{margin-left:730px;} .offset6{margin-left:630px;} .offset5{margin-left:530px;} .offset4{margin-left:430px;} .offset3{margin-left:330px;} .offset2{margin-left:230px;} .offset1{margin-left:130px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.564102564%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid > .span12{width:100%;} .row-fluid > .span11{width:91.45299145300001%;} .row-fluid > .span10{width:82.905982906%;} .row-fluid > .span9{width:74.358974359%;} .row-fluid > .span8{width:65.81196581200001%;} .row-fluid > .span7{width:57.264957265%;} .row-fluid > .span6{width:48.717948718%;} .row-fluid > .span5{width:40.170940171000005%;} .row-fluid > .span4{width:31.623931624%;} .row-fluid > .span3{width:23.076923077%;} .row-fluid > .span2{width:14.529914530000001%;} .row-fluid > .span1{width:5.982905983%;} input,textarea,.uneditable-input{margin-left:0;} input.span12, textarea.span12, .uneditable-input.span12{width:1160px;} input.span11, textarea.span11, .uneditable-input.span11{width:1060px;} input.span10, textarea.span10, .uneditable-input.span10{width:960px;} input.span9, textarea.span9, .uneditable-input.span9{width:860px;} input.span8, textarea.span8, .uneditable-input.span8{width:760px;} input.span7, textarea.span7, .uneditable-input.span7{width:660px;} input.span6, textarea.span6, .uneditable-input.span6{width:560px;} input.span5, textarea.span5, .uneditable-input.span5{width:460px;} input.span4, textarea.span4, .uneditable-input.span4{width:360px;} input.span3, textarea.span3, .uneditable-input.span3{width:260px;} input.span2, textarea.span2, .uneditable-input.span2{width:160px;} input.span1, textarea.span1, .uneditable-input.span1{width:60px;} .thumbnails{margin-left:-30px;} .thumbnails>li{margin-left:30px;}} diff --git a/Resources/Public/Css/bootstrap.min.css b/Resources/Public/Css/bootstrap.min.css deleted file mode 100644 index c951467..0000000 --- a/Resources/Public/Css/bootstrap.min.css +++ /dev/null @@ -1,689 +0,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;} -html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;} -a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} -a:hover,a:active{outline:0;} -sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;} -sup{top:-0.5em;} -sub{bottom:-0.25em;} -img{height:auto;border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;} -button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;} -button,input{*overflow:visible;line-height:normal;} -button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border: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,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;} -textarea{overflow:auto;vertical-align:top;} -.clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";} -.clearfix:after{clear:both;} -.hide-text{overflow:hidden;text-indent:100%;white-space:nowrap;} -.input-block-level{display:block;width:100%;min-height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;} -body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333333;background-color:#ffffff;} -a{color:#0088cc;text-decoration:none;} -a:hover{color:#005580;text-decoration:underline;} -.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} -.row:after{clear:both;} -[class*="span"]{float:left;margin-left:20px;} -.container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;} -.span12{width:940px;} -.span11{width:860px;} -.span10{width:780px;} -.span9{width:700px;} -.span8{width:620px;} -.span7{width:540px;} -.span6{width:460px;} -.span5{width:380px;} -.span4{width:300px;} -.span3{width:220px;} -.span2{width:140px;} -.span1{width:60px;} -.offset12{margin-left:980px;} -.offset11{margin-left:900px;} -.offset10{margin-left:820px;} -.offset9{margin-left:740px;} -.offset8{margin-left:660px;} -.offset7{margin-left:580px;} -.offset6{margin-left:500px;} -.offset5{margin-left:420px;} -.offset4{margin-left:340px;} -.offset3{margin-left:260px;} -.offset2{margin-left:180px;} -.offset1{margin-left:100px;} -.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} -.row-fluid:after{clear:both;} -.row-fluid>[class*="span"]{float:left;margin-left:2.127659574%;} -.row-fluid>[class*="span"]:first-child{margin-left:0;} -.row-fluid > .span12{width:99.99999998999999%;} -.row-fluid > .span11{width:91.489361693%;} -.row-fluid > .span10{width:82.97872339599999%;} -.row-fluid > .span9{width:74.468085099%;} -.row-fluid > .span8{width:65.95744680199999%;} -.row-fluid > .span7{width:57.446808505%;} -.row-fluid > .span6{width:48.93617020799999%;} -.row-fluid > .span5{width:40.425531911%;} -.row-fluid > .span4{width:31.914893614%;} -.row-fluid > .span3{width:23.404255317%;} -.row-fluid > .span2{width:14.89361702%;} -.row-fluid > .span1{width:6.382978723%;} -.container{margin-left:auto;margin-right:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";} -.container:after{clear:both;} -.container-fluid{padding-left:20px;padding-right:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";} -.container-fluid:after{clear:both;} -p{margin:0 0 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;}p small{font-size:11px;color:#999999;} -.lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px;} -h1,h2,h3,h4,h5,h6{margin:0;font-family:inherit;font-weight:bold;color:inherit;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999999;} -h1{font-size:30px;line-height:36px;}h1 small{font-size:18px;} -h2{font-size:24px;line-height:36px;}h2 small{font-size:18px;} -h3{line-height:27px;font-size:18px;}h3 small{font-size:14px;} -h4,h5,h6{line-height:18px;} -h4{font-size:14px;}h4 small{font-size:12px;} -h5{font-size:12px;} -h6{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{padding:0;margin:0 0 9px 25px;} -ul ul,ul ol,ol ol,ol ul{margin-bottom:0;} -ul{list-style:disc;} -ol{list-style:decimal;} -li{line-height:18px;} -ul.unstyled,ol.unstyled{margin-left:0;list-style:none;} -dl{margin-bottom:18px;} -dt,dd{line-height:18px;} -dt{font-weight:bold;line-height:17px;} -dd{margin-left:9px;} -.dl-horizontal dt{float:left;clear:left;width:120px;text-align:right;} -.dl-horizontal dd{margin-left:130px;} -hr{margin:18px 0;border:0;border-top:1px solid #eeeeee;border-bottom:1px solid #ffffff;} -strong{font-weight:bold;} -em{font-style:italic;} -.muted{color:#999999;} -abbr[title]{border-bottom:1px dotted #ddd;cursor:help;} -abbr.initialism{font-size:90%;text-transform:uppercase;} -blockquote{padding:0 0 0 15px;margin:0 0 18px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:22.5px;} -blockquote small{display:block;line-height:18px;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;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:Menlo,Monaco,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} -code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;} -pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12.025px;line-height:18px;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;white-space:pre;white-space:pre-wrap;word-break:break-all;word-wrap:break-word;}pre.prettyprint{margin-bottom:18px;} -pre code{padding:0;color:inherit;background-color:transparent;border:0;} -.pre-scrollable{max-height:340px;overflow-y:scroll;} -form{margin:0 0 18px;} -fieldset{padding:0;margin:0;border:0;} -legend{display:block;width:100%;padding:0;margin-bottom:27px;font-size:19.5px;line-height:36px;color:#333333;border:0;border-bottom:1px solid #eee;}legend small{font-size:13.5px;color:#999999;} -label,input,button,select,textarea{font-size:13px;font-weight:normal;line-height:18px;} -input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;} -label{display:block;margin-bottom:5px;color:#333333;} -input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;margin-bottom:9px;font-size:13px;line-height:18px;color:#555555;border:1px solid #cccccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} -.uneditable-textarea{width:auto;height:auto;} -label input,label textarea,label select{display:block;} -input[type="image"],input[type="checkbox"],input[type="radio"]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;cursor:pointer;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border:0 \9;} -input[type="image"]{border:0;} -input[type="file"]{width:auto;padding: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"]{width:auto;height:auto;} -select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px;} -input[type="file"]{line-height:18px \9;} -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;} -input[type="hidden"]{display:none;} -.radio,.checkbox{padding-left:18px;} -.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;padding-top:5px;margin-bottom:0;vertical-align:middle;} -.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;} -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;} -input:focus,textarea:focus{border-color:rgba(82, 168, 236, 0.8);-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;} -input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} -.input-mini{width:60px;} -.input-small{width:90px;} -.input-medium{width:150px;} -.input-large{width:210px;} -.input-xlarge{width:270px;} -.input-xxlarge{width:530px;} -input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{float:none;margin-left:0;} -input,textarea,.uneditable-input{margin-left:0;} -input.span12, textarea.span12, .uneditable-input.span12{width:930px;} -input.span11, textarea.span11, .uneditable-input.span11{width:850px;} -input.span10, textarea.span10, .uneditable-input.span10{width:770px;} -input.span9, textarea.span9, .uneditable-input.span9{width:690px;} -input.span8, textarea.span8, .uneditable-input.span8{width:610px;} -input.span7, textarea.span7, .uneditable-input.span7{width:530px;} -input.span6, textarea.span6, .uneditable-input.span6{width:450px;} -input.span5, textarea.span5, .uneditable-input.span5{width:370px;} -input.span4, textarea.span4, .uneditable-input.span4{width:290px;} -input.span3, textarea.span3, .uneditable-input.span3{width:210px;} -input.span2, textarea.span2, .uneditable-input.span2{width:130px;} -input.span1, textarea.span1, .uneditable-input.span1{width:50px;} -input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#eeeeee;border-color:#ddd;cursor:not-allowed;} -.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;background-color:#eeeeee;border-top:1px solid #ddd;*zoom:1;}.form-actions:before,.form-actions:after{display:table;content:"";} -.form-actions:after{clear:both;} -.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;} -:-moz-placeholder{color:#999999;} -::-webkit-input-placeholder{color:#999999;} -.help-block,.help-inline{color:#555555;} -.help-block{display:block;margin-bottom:9px;} -.help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px;} -.input-prepend,.input-append{margin-bottom:5px;}.input-prepend input,.input-append input,.input-prepend select,.input-append select,.input-prepend .uneditable-input,.input-append .uneditable-input{*margin-left:0;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-prepend input:focus,.input-append input:focus,.input-prepend select:focus,.input-append select:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus{position:relative;z-index:2;} -.input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc;} -.input-prepend .add-on,.input-append .add-on{display:inline-block;width:auto;min-width:16px;height:18px;padding:4px 5px;font-weight:normal;line-height:18px;text-align:center;text-shadow:0 1px 0 #ffffff;vertical-align:middle;background-color:#eeeeee;border:1px solid #ccc;} -.input-prepend .add-on,.input-append .add-on,.input-prepend .btn,.input-append .btn{-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-color:#a9dba9;border-color:#46a546;} -.input-prepend .add-on,.input-prepend .btn{margin-right:-1px;} -.input-append input,.input-append select .uneditable-input{-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-left-color:#eee;border-right-color:#ccc;} -.input-append .add-on,.input-append .btn{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} -.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} -.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} -.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,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;margin-bottom:0;} -.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none;} -.form-search label,.form-inline label{display:inline-block;} -.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0;} -.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle;} -.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-left:0;margin-right:3px;} -.control-group{margin-bottom:9px;} -legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate;} -.form-horizontal .control-group{margin-bottom:18px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";} -.form-horizontal .control-group:after{clear:both;} -.form-horizontal .control-label{float:left;width:140px;padding-top:5px;text-align:right;} -.form-horizontal .controls{margin-left:160px;*display:inline-block;*margin-left:0;*padding-left:20px;} -.form-horizontal .help-block{margin-top:9px;margin-bottom:0;} -.form-horizontal .form-actions{padding-left:160px;} -table{max-width:100%;border-collapse:collapse;border-spacing:0;background-color:transparent;} -.table{width:100%;margin-bottom:18px;}.table th,.table td{padding:8px;line-height:18px;text-align:left;vertical-align:top;border-top:1px solid #dddddd;} -.table th{font-weight:bold;} -.table thead th{vertical-align:bottom;} -.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0;} -.table tbody+tbody{border-top:2px solid #dddddd;} -.table-condensed th,.table-condensed td{padding:4px 5px;} -.table-bordered{border:1px solid #dddddd;border-left:0;border-collapse:separate;*border-collapse:collapsed;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th,.table-bordered td{border-left:1px solid #dddddd;} -.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;} -.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;} -.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;} -.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 tbody tr:hover td,.table tbody tr:hover th{background-color:#f5f5f5;} -table .span1{float:none;width:44px;margin-left:0;} -table .span2{float:none;width:124px;margin-left:0;} -table .span3{float:none;width:204px;margin-left:0;} -table .span4{float:none;width:284px;margin-left:0;} -table .span5{float:none;width:364px;margin-left:0;} -table .span6{float:none;width:444px;margin-left:0;} -table .span7{float:none;width:524px;margin-left:0;} -table .span8{float:none;width:604px;margin-left:0;} -table .span9{float:none;width:684px;margin-left:0;} -table .span10{float:none;width:764px;margin-left:0;} -table .span11{float:none;width:844px;margin-left:0;} -table .span12{float:none;width:924px;margin-left:0;} -table .span13{float:none;width:1004px;margin-left:0;} -table .span14{float:none;width:1084px;margin-left:0;} -table .span15{float:none;width:1164px;margin-left:0;} -table .span16{float:none;width:1244px;margin-left:0;} -table .span17{float:none;width:1324px;margin-left:0;} -table .span18{float:none;width:1404px;margin-left:0;} -table .span19{float:none;width:1484px;margin-left:0;} -table .span20{float:none;width:1564px;margin-left:0;} -table .span21{float:none;width:1644px;margin-left:0;} -table .span22{float:none;width:1724px;margin-left:0;} -table .span23{float:none;width:1804px;margin-left:0;} -table .span24{float:none;width:1884px;margin-left:0;} -[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat;*margin-right:.3em;}[class^="icon-"]:last-child,[class*=" icon-"]:last-child{*margin-left:0;} -.icon-white{background-image:url("../img/glyphicons-halflings-white.png");} -.icon-glass{background-position:0 0;} -.icon-music{background-position:-24px 0;} -.icon-search{background-position:-48px 0;} -.icon-envelope{background-position:-72px 0;} -.icon-heart{background-position:-96px 0;} -.icon-star{background-position:-120px 0;} -.icon-star-empty{background-position:-144px 0;} -.icon-user{background-position:-168px 0;} -.icon-film{background-position:-192px 0;} -.icon-th-large{background-position:-216px 0;} -.icon-th{background-position:-240px 0;} -.icon-th-list{background-position:-264px 0;} -.icon-ok{background-position:-288px 0;} -.icon-remove{background-position:-312px 0;} -.icon-zoom-in{background-position:-336px 0;} -.icon-zoom-out{background-position:-360px 0;} -.icon-off{background-position:-384px 0;} -.icon-signal{background-position:-408px 0;} -.icon-cog{background-position:-432px 0;} -.icon-trash{background-position:-456px 0;} -.icon-home{background-position:0 -24px;} -.icon-file{background-position:-24px -24px;} -.icon-time{background-position:-48px -24px;} -.icon-road{background-position:-72px -24px;} -.icon-download-alt{background-position:-96px -24px;} -.icon-download{background-position:-120px -24px;} -.icon-upload{background-position:-144px -24px;} -.icon-inbox{background-position:-168px -24px;} -.icon-play-circle{background-position:-192px -24px;} -.icon-repeat{background-position:-216px -24px;} -.icon-refresh{background-position:-240px -24px;} -.icon-list-alt{background-position:-264px -24px;} -.icon-lock{background-position:-287px -24px;} -.icon-flag{background-position:-312px -24px;} -.icon-headphones{background-position:-336px -24px;} -.icon-volume-off{background-position:-360px -24px;} -.icon-volume-down{background-position:-384px -24px;} -.icon-volume-up{background-position:-408px -24px;} -.icon-qrcode{background-position:-432px -24px;} -.icon-barcode{background-position:-456px -24px;} -.icon-tag{background-position:0 -48px;} -.icon-tags{background-position:-25px -48px;} -.icon-book{background-position:-48px -48px;} -.icon-bookmark{background-position:-72px -48px;} -.icon-print{background-position:-96px -48px;} -.icon-camera{background-position:-120px -48px;} -.icon-font{background-position:-144px -48px;} -.icon-bold{background-position:-167px -48px;} -.icon-italic{background-position:-192px -48px;} -.icon-text-height{background-position:-216px -48px;} -.icon-text-width{background-position:-240px -48px;} -.icon-align-left{background-position:-264px -48px;} -.icon-align-center{background-position:-288px -48px;} -.icon-align-right{background-position:-312px -48px;} -.icon-align-justify{background-position:-336px -48px;} -.icon-list{background-position:-360px -48px;} -.icon-indent-left{background-position:-384px -48px;} -.icon-indent-right{background-position:-408px -48px;} -.icon-facetime-video{background-position:-432px -48px;} -.icon-picture{background-position:-456px -48px;} -.icon-pencil{background-position:0 -72px;} -.icon-map-marker{background-position:-24px -72px;} -.icon-adjust{background-position:-48px -72px;} -.icon-tint{background-position:-72px -72px;} -.icon-edit{background-position:-96px -72px;} -.icon-share{background-position:-120px -72px;} -.icon-check{background-position:-144px -72px;} -.icon-move{background-position:-168px -72px;} -.icon-step-backward{background-position:-192px -72px;} -.icon-fast-backward{background-position:-216px -72px;} -.icon-backward{background-position:-240px -72px;} -.icon-play{background-position:-264px -72px;} -.icon-pause{background-position:-288px -72px;} -.icon-stop{background-position:-312px -72px;} -.icon-forward{background-position:-336px -72px;} -.icon-fast-forward{background-position:-360px -72px;} -.icon-step-forward{background-position:-384px -72px;} -.icon-eject{background-position:-408px -72px;} -.icon-chevron-left{background-position:-432px -72px;} -.icon-chevron-right{background-position:-456px -72px;} -.icon-plus-sign{background-position:0 -96px;} -.icon-minus-sign{background-position:-24px -96px;} -.icon-remove-sign{background-position:-48px -96px;} -.icon-ok-sign{background-position:-72px -96px;} -.icon-question-sign{background-position:-96px -96px;} -.icon-info-sign{background-position:-120px -96px;} -.icon-screenshot{background-position:-144px -96px;} -.icon-remove-circle{background-position:-168px -96px;} -.icon-ok-circle{background-position:-192px -96px;} -.icon-ban-circle{background-position:-216px -96px;} -.icon-arrow-left{background-position:-240px -96px;} -.icon-arrow-right{background-position:-264px -96px;} -.icon-arrow-up{background-position:-289px -96px;} -.icon-arrow-down{background-position:-312px -96px;} -.icon-share-alt{background-position:-336px -96px;} -.icon-resize-full{background-position:-360px -96px;} -.icon-resize-small{background-position:-384px -96px;} -.icon-plus{background-position:-408px -96px;} -.icon-minus{background-position:-433px -96px;} -.icon-asterisk{background-position:-456px -96px;} -.icon-exclamation-sign{background-position:0 -120px;} -.icon-gift{background-position:-24px -120px;} -.icon-leaf{background-position:-48px -120px;} -.icon-fire{background-position:-72px -120px;} -.icon-eye-open{background-position:-96px -120px;} -.icon-eye-close{background-position:-120px -120px;} -.icon-warning-sign{background-position:-144px -120px;} -.icon-plane{background-position:-168px -120px;} -.icon-calendar{background-position:-192px -120px;} -.icon-random{background-position:-216px -120px;} -.icon-comment{background-position:-240px -120px;} -.icon-magnet{background-position:-264px -120px;} -.icon-chevron-up{background-position:-288px -120px;} -.icon-chevron-down{background-position:-313px -119px;} -.icon-retweet{background-position:-336px -120px;} -.icon-shopping-cart{background-position:-360px -120px;} -.icon-folder-close{background-position:-384px -120px;} -.icon-folder-open{background-position:-408px -120px;} -.icon-resize-vertical{background-position:-432px -119px;} -.icon-resize-horizontal{background-position:-456px -118px;} -.dropdown{position:relative;} -.dropdown-toggle{*margin-bottom:-3px;} -.dropdown-toggle:active,.open .dropdown-toggle{outline:0;} -.caret{display:inline-block;width:0;height:0;vertical-align:top;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000000;opacity:0.3;filter:alpha(opacity=30);content:"";} -.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;padding:4px 0;margin:0;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;}.dropdown-menu.pull-right{right:0;left:auto;} -.dropdown-menu .divider{height:1px;margin:8px 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:#333333;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;} -.pull-right .dropdown-menu{left:auto;right:0;} -.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000000;content:"\2191";} -.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px;} -.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);} -.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} -.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} -.fade{-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;*display:inline;*zoom:1;padding:4px 10px 4px;margin-bottom:0;font-size:13px;line-height:18px;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);vertical-align:middle;background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #ffffff, #e6e6e6);background-image:-ms-linear-gradient(top, #ffffff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #ffffff, #e6e6e6);background-image:-o-linear-gradient(top, #ffffff, #e6e6e6);background-image:linear-gradient(top, #ffffff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);border:1px solid #cccccc;border-bottom-color:#b3b3b3;-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:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{background-color:#e6e6e6;} -.btn:active,.btn.active{background-color:#cccccc \9;} -.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 #333;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;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 [class^="icon-"]{margin-top:1px;} -.btn-small{padding:5px 9px;font-size:11px;line-height:16px;} -.btn-small [class^="icon-"]{margin-top:-1px;} -.btn-mini{padding:2px 6px;font-size:11px;line-height:14px;} -.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,.btn-inverse,.btn-inverse: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,.btn-inverse.active{color:rgba(255, 255, 255, 0.75);} -.btn-primary{background-color:#0074cc;background-image:-moz-linear-gradient(top, #0088cc, #0055cc);background-image:-ms-linear-gradient(top, #0088cc, #0055cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0055cc));background-image:-webkit-linear-gradient(top, #0088cc, #0055cc);background-image:-o-linear-gradient(top, #0088cc, #0055cc);background-image:linear-gradient(top, #0088cc, #0055cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0055cc', GradientType=0);border-color:#0055cc #0055cc #003580;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:#0055cc;} -.btn-primary:active,.btn-primary.active{background-color:#004099 \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;} -.btn-inverse{background-color:#414141;background-image:-moz-linear-gradient(top, #555555, #222222);background-image:-ms-linear-gradient(top, #555555, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#555555), to(#222222));background-image:-webkit-linear-gradient(top, #555555, #222222);background-image:-o-linear-gradient(top, #555555, #222222);background-image:linear-gradient(top, #555555, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#555555', 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);}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{background-color:#222222;} -.btn-inverse:active,.btn-inverse.active{background-color:#080808 \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.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px;} -button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px;} -button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px;} -.btn-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;*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:3px;*padding-bottom:3px;} -.btn-group .btn-mini.dropdown-toggle{padding-left:5px;padding-right:5px;*padding-top:1px;*padding-bottom:1px;} -.btn-group .btn-small.dropdown-toggle{*padding-top:4px;*padding-bottom:4px;} -.btn-group .btn-large.dropdown-toggle{padding-left:12px;padding-right:12px;} -.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-mini .caret{margin-top:5px;} -.btn-small .caret{margin-top:6px;} -.btn-large .caret{margin-top:6px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} -.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;opacity:0.75;filter:alpha(opacity=75);} -.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;color:#c09853;} -.alert-heading{color:inherit;} -.alert .close{position:relative;top:-2px;right:-21px;line-height:18px;} -.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847;} -.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;color:#b94a48;} -.alert-info{background-color:#d9edf7;border-color:#bce8f1;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 .nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:18px;color:#999999;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);text-transform:uppercase;} -.nav li+.nav-header{margin-top:9px;} -.nav-list{padding-left:15px;padding-right:15px;margin-bottom:0;} -.nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);} -.nav-list>li>a{padding:3px 15px;} -.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-list .divider{height:1px;margin:8px 1px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;*width:100%;*margin:-5px 0 5px;} -.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:8px;padding-bottom:8px;line-height:18px;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;border-bottom-color:#0088cc;margin-top:6px;} -.nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580;} -.nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret{border-top-color:#333333;border-bottom-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;border-bottom-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;} -.tab-content{display:table;width:100%;} -.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{*position:relative;*z-index:2;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);} -.navbar .container{width:auto;} -.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{color:#999999;}.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;} -.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,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;} -.navbar-form input,.navbar-form select{display:inline-block;margin-bottom:0;} -.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;} -.navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap;}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0;} -.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;background-color:#626262;border:1px solid #151515;-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:#cccccc;} -.navbar-search .search-query::-webkit-input-placeholder{color:#cccccc;} -.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,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0;} -.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;} -.navbar-fixed-top{top:0;} -.navbar-fixed-bottom{bottom: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;} -.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-fixed-bottom .dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0, 0, 0, 0.2);border-bottom:0;bottom:-7px;top:auto;} -.navbar-fixed-bottom .dropdown-menu:after{border-top:6px solid #ffffff;border-bottom:0;bottom:-6px;top:auto;} -.navbar .nav .dropdown-toggle .caret,.navbar .nav .open.dropdown .caret{border-top-color:#ffffff;border-bottom-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,.navbar .nav .dropdown-menu.pull-right{left:auto;right:0;}.navbar .nav.pull-right .dropdown-menu:before,.navbar .nav .dropdown-menu.pull-right:before{left:auto;right:12px;} -.navbar .nav.pull-right .dropdown-menu:after,.navbar .nav .dropdown-menu.pull-right:after{left:auto;right:13px;} -.breadcrumb{padding:7px 14px;margin:0 0 18px;list-style:none;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-block;*display:inline;*zoom:1;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;*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 span,.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;} -.pager .previous a{float:left;} -.pager .disabled a,.pager .disabled a:hover{color:#999999;background-color:#fff;cursor:default;} -.modal-open .dropdown-menu{z-index:2050;} -.modal-open .dropdown.open{*z-index:2050;} -.modal-open .popover{z-index:2060;} -.modal-open .tooltip{z-index:2070;} -.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;} -.modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);} -.modal{position:fixed;top:50%;left:50%;z-index:1050;overflow:auto;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;-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.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{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;} -.modal-body{overflow-y:auto;max-height:400px;padding:15px;} -.modal-form{margin-bottom:0;} -.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-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;}.modal-footer:before,.modal-footer:after{display:table;content:"";} -.modal-footer:after{clear:both;} -.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0;} -.modal-footer .btn-group .btn+.btn{margin-left:-1px;} -.tooltip{position:absolute;z-index:1020;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);} -.tooltip.top{margin-top:-2px;} -.tooltip.right{margin-left:2px;} -.tooltip.bottom{margin-top:2px;} -.tooltip.left{margin-left:-2px;} -.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} -.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} -.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} -.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} -.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.tooltip-arrow{position:absolute;width:0;height:0;} -.popover{position:absolute;top:0;left:0;z-index:1010;display:none;padding:5px;}.popover.top{margin-top:-5px;} -.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;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.bottom .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{padding:3px;width:280px;overflow:hidden;background:#000000;background:rgba(0, 0, 0, 0.8);-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{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;} -.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;-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;} -.thumbnails{margin-left:-20px;list-style:none;*zoom: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 4px 2px;font-size:10.998px;font-weight:bold;line-height:13px;color:#ffffff;vertical-align:middle;white-space:nowrap;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} -.label:hover{color:#ffffff;text-decoration:none;} -.label-important{background-color:#b94a48;} -.label-important:hover{background-color:#953b39;} -.label-warning{background-color:#f89406;} -.label-warning:hover{background-color:#c67605;} -.label-success{background-color:#468847;} -.label-success:hover{background-color:#356635;} -.label-info{background-color:#3a87ad;} -.label-info:hover{background-color:#2d6987;} -.label-inverse{background-color:#333333;} -.label-inverse:hover{background-color:#1a1a1a;} -.badge{padding:1px 9px 2px;font-size:12.025px;font-weight:bold;white-space:nowrap;color:#ffffff;background-color:#999999;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px;} -.badge:hover{color:#ffffff;text-decoration:none;cursor:pointer;} -.badge-error{background-color:#b94a48;} -.badge-error:hover{background-color:#953b39;} -.badge-warning{background-color:#f89406;} -.badge-warning:hover{background-color:#c67605;} -.badge-success{background-color:#468847;} -.badge-success:hover{background-color:#356635;} -.badge-info{background-color:#3a87ad;} -.badge-info:hover{background-color:#2d6987;} -.badge-inverse{background-color:#333333;} -.badge-inverse:hover{background-color:#1a1a1a;} -@-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;}}@-ms-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;} -.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;-ms-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:#149bdf;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);} -.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);} -.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);} -.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);} -.progress-warning .bar{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);} -.progress-warning.progress-striped .bar{background-color:#fbb450;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 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);} -.accordion{margin-bottom:18px;} -.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.accordion-heading{border-bottom:0;} -.accordion-heading .accordion-toggle{display:block;padding:8px 15px;} -.accordion-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:#eeeeee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;color:inherit;letter-spacing:-1px;} -.hero-unit p{font-size:18px;font-weight:200;line-height:27px;color:inherit;} -.pull-right{float:right;} -.pull-left{float:left;} -.hide{display:none;} -.show{display:block;} -.invisible{visibility:hidden;} diff --git a/Resources/Public/Js/Form.js b/Resources/Public/Js/Form.js new file mode 100644 index 0000000..c3f4fbd --- /dev/null +++ b/Resources/Public/Js/Form.js @@ -0,0 +1,56 @@ +(function (w, $) { + var submitElement = $('[data-identifier="submit"]', 'form[data-form="pxa-newsletter-subscription-form"]'); + + submitElement.on('click', function (e) { + e.preventDefault(); + + var currentButton = $(this), + formElement = currentButton.parents('form[data-form="pxa-newsletter-subscription-form"]'), + spinnerElement = $('[data-identifier="spinner"]', formElement), + data = formElement.serializeArray(); + + data.push({name: currentButton.attr('name'), value: 1}); + + // Disable button, and fade in spinner + spinnerElement.fadeIn(50); + currentButton.prop('disabled', true); + + $.ajax({ + //type of receiving data + type: 'POST', + url: formElement.attr('action'), + data: data, + dataType: 'JSON' + }).done(function (response) { + //ajax sends msg from php, which informs user, what has happens + var message = $('
', { + class: 'alert js__ajax-response', + text: response.message + }); + formElement.after(message); + + if (response.success) { + // display message + message.addClass('alert-success'); + // hide form + formElement.hide(); + } else { + // display message and set message to disapear after 5 sec. + message.addClass('alert-danger').delay(5000).fadeOut('slow'); + } + }).fail(function (jqXHR, textStatus) { + // Set message and set it to disapear after 5 sec. + var message = $('
', { + class: 'alert alert-danger js__ajax-response', + text: textStatus + }); + formElement.after(message); + message.delay(5000).fadeOut('slow'); + }).always(function () { + // Hide spinner and enable inputs again + spinnerElement.fadeOut(50); + currentButton.prop('disabled', false); + }); //end ajax + }); //end submit + +})(window, jQuery); \ No newline at end of file diff --git a/Resources/Public/Js/bootstrap-acknowledgeinput.js b/Resources/Public/Js/bootstrap-acknowledgeinput.js deleted file mode 100644 index a0fd195..0000000 --- a/Resources/Public/Js/bootstrap-acknowledgeinput.js +++ /dev/null @@ -1,150 +0,0 @@ -/* ========================================================= - * bootstrap-acknowledgeinput.js - v0.4 - * http://averagemarcus.github.com/Bootstrap-AcknowledgeInputs/ - * ========================================================= - * Requirements: - * -------------- - * jQuery (1.9.1 recommended) - http://jquery.com/ - * Bootstrap (css) - http://twitter.github.com/bootstrap - * - * Recommended: - * -------------- - * Font-Awesome - http://fortawesome.github.com/Font-Awesome/ - * (This allows coloured icons) - * - * ========================================================= - * Copyright 2013 Marcus Noble - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================= */ - -(function( $ ) { - "use strict"; - $.fn.acknowledgeinput = function(options){ - var acknowledgeVars = { - success_color: "#468847", - danger_color: "#bd362f", - icon_success: "icon-ok", - icon_danger: "icon-warning-sign", - update_on: "change", - default_state: "visible" - }; - - var updateIcons = function (inputEl) { - function modify_classes(isSuccess, iconClass) { - var colour = isSuccess ? acknowledgeVars.success_color : acknowledgeVars.danger_color; - inputEl.parent().find('[data-role=acknowledgement]').css('color', colour).find('i').removeClass().addClass(iconClass); - } - function isNotNullOrEmpty(value){ - return (inputEl.val() !== "" && inputEl.val() !== null); - } - //Setup default - inputEl.parent().find('[data-role=acknowledgement]').addClass('add-on').find('i').removeClass(); - var re; - var data_type = inputEl.data('type') === undefined ? "text" : inputEl.data('type'); - var required = inputEl.attr("required") === undefined ? false : inputEl.attr("required").toLowerCase() === "required"; - - if (data_type.toLowerCase() === "text") { - if (isNotNullOrEmpty(inputEl.val())) { - modify_classes(true, acknowledgeVars.icon_success); - } else if (required) { - modify_classes(false, acknowledgeVars.icon_danger); - } - } else if (data_type.toLowerCase() === "email") { - re = /^(([^<>()\[\]\\.,;:\s@\"]+(\.[^<>()\[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ - var isEmail = re.test(inputEl.val()); - - if (isNotNullOrEmpty(inputEl.val()) && isEmail) { - modify_classes(true, acknowledgeVars.icon_success); - } else if (required || (isNotNullOrEmpty(inputEl.val()) && !isEmail)) { - modify_classes(false, acknowledgeVars.icon_danger); - } - } else if (data_type.toLowerCase() === "tel") { - re = /^(\+)?( |-|\(|\)|[0-9]){4,50}$/; - var isTel = re.test(inputEl.val()); - - if (isNotNullOrEmpty(inputEl.val()) && isTel) { - modify_classes(true, acknowledgeVars.icon_success); - } else if (required || (isNotNullOrEmpty(inputEl.val()) && !isTel)) { - modify_classes(false, acknowledgeVars.icon_danger); - } - } else if (data_type.toLowerCase() === "number") { - re = /^(\-)?([0-9])+$/; - var isNumber = re.test(inputEl.val()); - - if (isNotNullOrEmpty(inputEl.val()) && isNumber) { - modify_classes(true, acknowledgeVars.icon_success); - } else if (required || (isNotNullOrEmpty(inputEl.val()) && !isNumber)) { - modify_classes(false, acknowledgeVars.icon_danger); - } - } else if (data_type.toLowerCase() === "integer") { - re = /^(\-)?(([1-9])([0-9])+|0)$/; - var isInt = re.test(inputEl.val()); - - if (isNotNullOrEmpty(inputEl.val()) && isInt) { - modify_classes(true, acknowledgeVars.icon_success); - } else if (required || (isNotNullOrEmpty(inputEl.val()) && !isInt)) { - modify_classes(false, acknowledgeVars.icon_danger); - } - } else if (data_type.toLowerCase() === "decimal") { - re = /^(\-)?(([0-9])+(\.)([0-9])+|0)$/; - var isDecimal = re.test(inputEl.val()); - - if (isNotNullOrEmpty(inputEl.val()) && isDecimal) { - modify_classes(true, acknowledgeVars.icon_success); - } else if (required || (isNotNullOrEmpty(inputEl.val()) && !isDecimal)) { - modify_classes(false, acknowledgeVars.icon_danger); - } - } else if (data_type.toLowerCase() === "currency") { - re = /^(([0-9])+((\.|,)?([0-9]){2,2})?)$/; - var isCurrency = re.test(inputEl.val()); - - if (isNotNullOrEmpty(inputEl.val()) && isCurrency) { - modify_classes(true, acknowledgeVars.icon_success); - } else if (required || (isNotNullOrEmpty(inputEl.val()) && !isCurrency)) { - modify_classes(false, acknowledgeVars.icon_danger); - } - } else if (data_type.toLowerCase() === "colour" || data_type.toLowerCase() === "color") { - var isColour = $('').css({ color : 'transparent' }).css({ color : inputEl.val() }).css('color') !== 'transparent'; - - if (isNotNullOrEmpty(inputEl.val()) && isColour) { - modify_classes(true, acknowledgeVars.icon_success); - } else if (required || (isNotNullOrEmpty(inputEl.val()) && !isColour)) { - modify_classes(false, acknowledgeVars.icon_danger); - } - } else if (data_type.toLowerCase() === "url") { - re = /^(https?:\/\/)?([\da-z\.\-]+)\.([a-z\.]{2,6})([\/\w \.\-]*)*\/?$/; - var isUrl = re.test(inputEl.val()); - - if (isNotNullOrEmpty(inputEl.val()) && isUrl) { - modify_classes(true, acknowledgeVars.icon_success); - } else if (required || (isNotNullOrEmpty(inputEl.val()) && !isUrl)) { - modify_classes(false, acknowledgeVars.icon_danger); - } - } - - - }; - - $.extend(acknowledgeVars, options); - - $('[data-role=acknowledge-input]').find('input:not([type=radio]):not([type=checkbox]),textarea,select').each(function () { - updateIcons($(this)); - if (acknowledgeVars.default_state != 'visible') { - $(this).parent().find('[data-role=acknowledgement]').addClass('add-on').find('i').removeClass(); - } - }).on(acknowledgeVars.update_on, function () { - updateIcons($(this)); - }); - }; -}) ( window.jQuery ); \ No newline at end of file diff --git a/Resources/Public/Js/bootstrap-acknowledgeinput.min.js b/Resources/Public/Js/bootstrap-acknowledgeinput.min.js deleted file mode 100644 index ddff13c..0000000 --- a/Resources/Public/Js/bootstrap-acknowledgeinput.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(a){a.fn.acknowledgeinput=function(c){var d={success_color:"#468847",danger_color:"#bd362f",icon_success:"icon-ok",icon_danger:"icon-warning-sign",update_on:"change",default_state:"visible"};var b=function(g){function p(s,u){var t=s?d.success_color:d.danger_color;g.parent().find("[data-role=acknowledgement]").css("color",t).find("i").removeClass().addClass(u)}function n(s){return(g.val()!==""&&g.val()!==null)}g.parent().find("[data-role=acknowledgement]").addClass("add-on").find("i").removeClass();var k;var h=g.data("type")===undefined?"text":g.data("type");var o=g.attr("required")===undefined?false:g.attr("required").toLowerCase()==="required";if(h.toLowerCase()==="text"){if(n(g.val())){p(true,d.icon_success)}else{if(o){p(false,d.icon_danger)}}}else{if(h.toLowerCase()==="email"){k=/^(([^<>()\[\]\\.,;:\s@\"]+(\.[^<>()\[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;var r=k.test(g.val());if(n(g.val())&&r){p(true,d.icon_success)}else{if(o||(n(g.val())&&!r)){p(false,d.icon_danger)}}}else{if(h.toLowerCase()==="tel"){k=/^(\+)?( |-|\(|\)|[0-9]){4,50}$/;var m=k.test(g.val());if(n(g.val())&&m){p(true,d.icon_success)}else{if(o||(n(g.val())&&!m)){p(false,d.icon_danger)}}}else{if(h.toLowerCase()==="number"){k=/^(\-)?([0-9])+$/;var j=k.test(g.val());if(n(g.val())&&j){p(true,d.icon_success)}else{if(o||(n(g.val())&&!j)){p(false,d.icon_danger)}}}else{if(h.toLowerCase()==="integer"){k=/^(\-)?(([1-9])([0-9])+|0)$/;var l=k.test(g.val());if(n(g.val())&&l){p(true,d.icon_success)}else{if(o||(n(g.val())&&!l)){p(false,d.icon_danger)}}}else{if(h.toLowerCase()==="decimal"){k=/^(\-)?(([0-9])+(\.)([0-9])+|0)$/;var e=k.test(g.val());if(n(g.val())&&e){p(true,d.icon_success)}else{if(o||(n(g.val())&&!e)){p(false,d.icon_danger)}}}else{if(h.toLowerCase()==="currency"){k=/^(([0-9])+((\.|,)?([0-9]){2,2})?)$/;var f=k.test(g.val());if(n(g.val())&&f){p(true,d.icon_success)}else{if(o||(n(g.val())&&!f)){p(false,d.icon_danger)}}}else{if(h.toLowerCase()==="colour"||h.toLowerCase()==="color"){var q=a("").css({color:"transparent"}).css({color:g.val()}).css("color")!=="transparent";if(n(g.val())&&q){p(true,d.icon_success)}else{if(o||(n(g.val())&&!q)){p(false,d.icon_danger)}}}else{if(h.toLowerCase()==="url"){k=/^(https?:\/\/)?([\da-z\.\-]+)\.([a-z\.]{2,6})([\/\w \.\-]*)*\/?$/;var i=k.test(g.val());if(n(g.val())&&i){p(true,d.icon_success)}else{if(o||(n(g.val())&&!i)){p(false,d.icon_danger)}}}}}}}}}}}};a.extend(d,c);a("[data-role=acknowledge-input]").find("input:not([type=radio]):not([type=checkbox]),textarea,select").each(function(){b(a(this));if(d.default_state!="visible"){a(this).parent().find("[data-role=acknowledgement]").addClass("add-on").find("i").removeClass()}}).on(d.update_on,function(){b(a(this))})}})(window.jQuery); \ No newline at end of file diff --git a/Resources/Public/Js/form_javascript_template.js b/Resources/Public/Js/form_javascript_template.js deleted file mode 100644 index 19117e6..0000000 --- a/Resources/Public/Js/form_javascript_template.js +++ /dev/null @@ -1,68 +0,0 @@ -$(document).ready(function() { - - // $(document).acknowledgeinput({ - // default_state: 'hidden' - //}); - - var formElement = $('#__FORMNAME__'); - var submitElement = $('[data-identifier="submit"]', formElement); - var spinnerElement = $('[data-identifier="spinner"]', formElement); - - submitElement.click(function(e) { - e.preventDefault(); - - // get form data and also include the input that was pressed - var formData = $(this).closest('form').serializeArray(); - formData.push({ name: this.name, value: this.value }); - - // create a uniqe tag id for temporary message - var ts = Math.round(+new Date()); - var messageTagId = 'contact-form-message' + ts; - - // Disable button, and fade in spinner - spinnerElement.fadeIn(50); - submitElement.attr('disabled', 'disabled'); - - // remove previous messages - $('.js__ajax-response').hide(); - - $.ajax({ - //type of receiving data - type: 'POST', - - //page where ajax is running - url: formElement.attr('action'), - - //send_data, data which will be send to php - data: formData, - dataType: "JSON", - // if call is ok - success: function(response) { - //ajax sends msg from php, which informs user, what has happens - formElement.after('
' + response.message + '
'); - if (response.success) { - // display message - $('#' + messageTagId).addClass('alert-success'); - // hide form - formElement.hide(); - } else { - // display message and set message to disapear after 5 sec. - $('#' + messageTagId).addClass('alert-danger').delay(5000).fadeOut('slow'); - } - // Hide spinner and enable inputs again - spinnerElement.fadeOut(50); - submitElement.removeAttr('disabled'); - }, - - error: function(jqXHR, textStatus, errorThrown) { - // Set message and set it to disapear after 5 sec. - formElement.after('
' + jqXHR_error_message + '
'); - $('#' + messageTagId).delay(5000).fadeOut('slow'); - // hide spinner and enable inputs again - spinnerElement.fadeOut(50); - submitElement.removeAttr('disabled'); - } - }); //end ajax - }); //end submit - -}); \ No newline at end of file diff --git a/Resources/Public/Js/form_javascript_template.min.js b/Resources/Public/Js/form_javascript_template.min.js deleted file mode 100644 index aa31393..0000000 --- a/Resources/Public/Js/form_javascript_template.min.js +++ /dev/null @@ -1 +0,0 @@ -$(document).ready(function(){var formElement=$("#__FORMNAME__");var submitElement=$('[data-identifier="submit"]',formElement);var spinnerElement=$('[data-identifier="spinner"]',formElement);submitElement.click(function(e){e.preventDefault();var formData=$(this).closest("form").serializeArray();formData.push({name:this.name,value:this.value});var ts=Math.round(+new Date);var messageTagId="contact-form-message"+ts;spinnerElement.fadeIn(50);submitElement.attr("disabled","disabled");$(".js__ajax-response").hide();$.ajax({type:"POST",url:formElement.attr("action"),data:formData,dataType:"JSON",success:function(response){formElement.after('
'+response.message+"
");if(response.success){$("#"+messageTagId).addClass("alert-success");formElement.hide()}else{$("#"+messageTagId).addClass("alert-danger").delay(5e3).fadeOut("slow")}spinnerElement.fadeOut(50);submitElement.removeAttr("disabled")},error:function(jqXHR,textStatus,errorThrown){formElement.after('
'+jqXHR_error_message+"
");$("#"+messageTagId).delay(5e3).fadeOut("slow");spinnerElement.fadeOut(50);submitElement.removeAttr("disabled")}})})}); diff --git a/ext_emconf.php b/ext_emconf.php index 5afab12..303c1e8 100644 --- a/ext_emconf.php +++ b/ext_emconf.php @@ -10,33 +10,29 @@ # "version" and "dependencies" must not be touched! ######################################################################## -$EM_CONF[$_EXTKEY] = array( - 'title' => 'Newsletter Subscription', - 'description' => 'Newsletter Subscription', - 'category' => 'plugin', - 'author' => 'Inna Titorenko', - 'author_email' => 'inna@pixelant.se', - 'author_company' => 'Pixelant', - 'shy' => '', - 'priority' => '', - 'module' => '', - 'state' => 'beta', - 'internal' => '', - 'uploadfolder' => '0', - 'createDirs' => '', - 'modify_tables' => '', - 'clearCacheOnLoad' => 0, - 'lockType' => '', - 'version' => '4.1.2', - 'constraints' => array( - 'depends' => array( - 'typo3' => '8.7' - ), - 'conflicts' => array( - ), - 'suggests' => array( - ), - ), -); - -?> +$EM_CONF[$_EXTKEY] = [ + 'title' => 'Newsletter Subscription', + 'description' => 'Newsletter Subscription', + 'category' => 'plugin', + 'author' => 'Inna Titorenko', + 'author_email' => 'inna@pixelant.se', + 'author_company' => 'Pixelant', + 'shy' => '', + 'priority' => '', + 'module' => '', + 'state' => 'beta', + 'internal' => '', + 'uploadfolder' => '0', + 'createDirs' => '', + 'modify_tables' => '', + 'clearCacheOnLoad' => 0, + 'lockType' => '', + 'version' => '5.0.0', + 'constraints' => [ + 'depends' => [ + 'typo3' => '8.7' + ], + 'conflicts' => [], + 'suggests' => [], + ], +]; diff --git a/ext_localconf.php b/ext_localconf.php index 34a27ef..617fdbd 100644 --- a/ext_localconf.php +++ b/ext_localconf.php @@ -1,17 +1,14 @@ 'form,ajax,confirm', - ), - // non-cacheable actions - array( - 'NewsletterSubscription' => 'ajax,confirm', - ) + 'Pixelant.' . $_EXTKEY, + 'Subscription', + [ + 'NewsletterSubscription' => 'form,ajax,confirm', + ], + // non-cacheable actions + [ + 'NewsletterSubscription' => 'ajax,confirm' + ] ); -?> diff --git a/ext_tables.php b/ext_tables.php deleted file mode 100644 index 4299e41..0000000 --- a/ext_tables.php +++ /dev/null @@ -1,29 +0,0 @@ - 1, - 'config' => Array( - 'type' => 'passthrough', - ) -); -/*********************************/ - -\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addStaticFile($_EXTKEY, 'Configuration/TypoScript', 'Newsletter Subscription'); -?> \ No newline at end of file