Commit 2e40dd40 by lmf

Merge branch 'master' into production

parents aa78cee2 e88e951a
...@@ -137,13 +137,13 @@ class Add extends \Magento\Checkout\Controller\Cart implements HttpPostActionInt ...@@ -137,13 +137,13 @@ class Add extends \Magento\Checkout\Controller\Cart implements HttpPostActionInt
); );
if (!$this->_checkoutSession->getNoCartRedirect(true)) { if (!$this->_checkoutSession->getNoCartRedirect(true)) {
if ($this->shouldRedirectToCart()) { // if ($this->shouldRedirectToCart()) {
$message = __( // $message = __(
'You added %1 to your shopping cart.', // 'You added %1 to your shopping cart.',
$product->getName() // $product->getName()
); // );
$this->messageManager->addSuccessMessage($message); // $this->messageManager->addSuccessMessage($message);
} // }
if ($this->cart->getQuote()->getHasError()) { if ($this->cart->getQuote()->getHasError()) {
$errors = $this->cart->getQuote()->getErrors(); $errors = $this->cart->getQuote()->getErrors();
foreach ($errors as $error) { foreach ($errors as $error) {
......
...@@ -65,7 +65,7 @@ Message,Message ...@@ -65,7 +65,7 @@ Message,Message
"Print receipt","Print receipt" "Print receipt","Print receipt"
"Apply Discount Code","Apply Discount Code" "Apply Discount Code","Apply Discount Code"
"Enter discount code","Enter discount code" "Enter discount code","Enter discount code"
"Apply Discount","Apply Discount" "Apply Discount","Apply Code"
"Cancel Coupon","Cancel Coupon" "Cancel Coupon","Cancel Coupon"
"Shopping Cart Items","Shopping Cart Items" "Shopping Cart Items","Shopping Cart Items"
Item,Item Item,Item
......
...@@ -122,7 +122,7 @@ Inactive,Inactive ...@@ -122,7 +122,7 @@ Inactive,Inactive
"%1 Cart Price Rules based on ""%2"" attribute have been disabled.","%1 Cart Price Rules based on ""%2"" attribute have been disabled." "%1 Cart Price Rules based on ""%2"" attribute have been disabled.","%1 Cart Price Rules based on ""%2"" attribute have been disabled."
"Apply Discount Code","Apply Discount Code" "Apply Discount Code","Apply Discount Code"
"Enter discount code","Enter discount code" "Enter discount code","Enter discount code"
"Apply Discount","Apply Discount" "Apply Discount","Apply Code"
"Cancel coupon","Cancel coupon" "Cancel coupon","Cancel coupon"
"Your coupon was successfully removed.","Your coupon was successfully removed." "Your coupon was successfully removed.","Your coupon was successfully removed."
"Your coupon was successfully applied.","Your coupon was successfully applied." "Your coupon was successfully applied.","Your coupon was successfully applied."
......
<?php
namespace Rokanthemes\OnePageCheckout\Api\Data;
/**
* Interface UpdateItemDetailsInterface
* @api
*/
interface UpdateItemDetailsInterface
{
/**
* Constants defined for keys of array, makes typos less likely
*/
const PAYMENT_METHODS = 'payment_methods';
const TOTALS = 'totals';
const SHIPPING_METHODS = 'shipping_methods';
const MESSAGE = 'message';
const STATUS = 'status';
const HAS_ERROR = 'has_error';
const GIFT_WRAP_DISPLAY = 'gift_wrap_display';
const GIFT_WRAP_LABEL = 'gift_wrap_label';
/**
* @return \Magento\Quote\Api\Data\PaymentMethodInterface[]
*/
public function getPaymentMethods();
/**
* @param \Magento\Quote\Api\Data\PaymentMethodInterface[] $paymentMethods
* @return $this
*/
public function setPaymentMethods($paymentMethods);
/**
* @return \Magento\Quote\Api\Data\TotalsInterface
*/
public function getTotals();
/**
* @param \Magento\Quote\Api\Data\TotalsInterface $totals
* @return $this
*/
public function setTotals($totals);
/**
* @return \Magento\Quote\Api\Data\ShippingMethodInterface[]
*/
public function getShippingMethods();
/**
* @param \Magento\Quote\Api\Data\ShippingMethodInterface[] $shippingMethods
* @return $this
*/
public function setShippingMethods($shippingMethods);
/**
* @return string
*/
public function getMessage();
/**
* @param string $message
* @return $this
*/
public function setMessage($message);
/**
* @return bool
*/
public function getStatus();
/**
* @param bool $status
* @return $this
*/
public function setStatus($status);
/**
* @return bool
*/
public function getHasError();
/**
* @param bool $error
* @return $this
*/
public function setHasError($error);
/**
* @return bool
*/
}
<?php
namespace Rokanthemes\OnePageCheckout\Api;
/**
* Interface GuestUpdateItemManagementInterface
* @api
*/
interface GuestUpdateItemManagementInterface
{
/**
* @param string $cartId
* @param \Magento\Quote\Api\Data\EstimateAddressInterface $address
* @param int $itemId
* @param float $qty
* @return \Rokanthemes\OnePageCheckout\Api\Data\UpdateItemDetailsInterface
*/
public function update($cartId, \Magento\Quote\Api\Data\EstimateAddressInterface $address, $itemId, $qty);
}
<?php
namespace Rokanthemes\OnePageCheckout\Api;
/**
* Interface UpdateItemManagementInterface
* @api
*/
interface UpdateItemManagementInterface
{
/**
* @param int $cartId
* @param \Magento\Quote\Api\Data\EstimateAddressInterface $address
* @param int $itemId
* @param float $qty
* @return \Rokanthemes\OnePageCheckout\Api\Data\UpdateItemDetailsInterface
* @throws \Magento\Framework\Exception\CouldNotSaveException
* @throws \Magento\Framework\Exception\NoSuchEntityException
*/
public function update($cartId, \Magento\Quote\Api\Data\EstimateAddressInterface $address, $itemId, $qty);
}
<?php
namespace Rokanthemes\OnePageCheckout\Block\Adminhtml\Field;
use Magento\Backend\Block\Template;
use Magento\Backend\Block\Widget\Context;
use Magento\Customer\Model\Attribute;
use Rokanthemes\OnePageCheckout\Helper\Address;
/**
* Class AbstractField
* @package Rokanthemes\OnePageCheckout\Block\Adminhtml\Field
*/
abstract class AbstractField extends Template
{
const BLOCK_ID = '';
/**
* @var string
*/
protected $_template = 'Rokanthemes_OnePageCheckout::field/position.phtml';
/**
* @var Address
*/
protected $helper;
/**
* @var Attribute[]
*/
protected $sortedFields = [];
/**
* @var Attribute[]
*/
protected $availableFields = [];
/**
* AbstractField constructor.
*
* @param Context $context
* @param Address $helper
* @param array $data
*/
public function __construct(
Context $context,
Address $helper,
array $data = []
) {
$this->helper = $helper;
parent::__construct($context, $data);
}
/**
* Retrieve the header text
*
* @return string
*/
abstract public function getBlockTitle();
/**
* @return string
*/
public function getBlockId()
{
return static::BLOCK_ID;
}
/**
* @return Attribute[]
*/
public function getSortedFields()
{
return $this->sortedFields;
}
/**
* @return Attribute[]
*/
public function getAvailableFields()
{
return $this->availableFields;
}
/**
* @return Address
*/
public function getHelperData()
{
return $this->helper;
}
/**
* @return bool
*/
public function isVisible()
{
return true;
}
/**
* @return bool
*/
public function hasFields()
{
return true;
}
/**
* @return string
*/
public function getNoticeMessage()
{
return '';
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Block\Adminhtml\Field;
/**
* Class Address
* @package Rokanthemes\OnePageCheckout\Block\Adminhtml\Field
*/
class Address extends AbstractField
{
const BLOCK_ID = 'admin-address-information';
/**
* @inheritdoc
*/
protected function _construct()
{
parent::_construct();
/** Prepare collection */
list($this->sortedFields, $this->availableFields) = $this->helper->getSortedField(false);
}
/**
* @return string
*/
public function getBlockTitle()
{
return (string) __('Address Information');
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Block\Adminhtml\Field;
use Magento\Backend\Block\Widget\Container;
use Magento\Backend\Block\Widget\Context;
class Tabs extends Container
{
public function __construct(
Context $context,
array $data = []
) {
parent::__construct($context, $data);
}
/**
* @inheritdoc
*/
protected function _construct()
{
parent::_construct();
$this->addButton('save', [
'label' => __('Save Position'),
'class' => 'save primary admin-save-position',
]);
}
/**
* Retrieve the header text
*
* @return string
*/
public function getHeaderText()
{
return (string) __('Manage Fields');
}
/**
* @return string
*/
public function getAjaxUrl()
{
return $this->getUrl('*/*/save');
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Block;
class Config extends \Magento\Framework\View\Element\Template
{
protected $helper;
/**
* Construct
*
* @param \Magento\Framework\View\Element\Template\Context $context
* @param \Magento\Customer\Model\Session $customerSession
* @param array $data
*/
public function __construct(
\Magento\Framework\View\Element\Template\Context $context,
\Rokanthemes\OnePageCheckout\Helper\Data $helper,
array $data = []
) {
parent::__construct($context, $data);
$this->helper = $helper;
}
public function getShortDescription()
{
return $this->helper->getGeneral('short_description');
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Controller\Account;
class Save extends \Magento\Framework\App\Action\Action
{
/**
* @var \Magento\Checkout\Helper\Cart
*/
protected $checkoutSession;
/**
* @var \Magento\Framework\Controller\Result\JsonFactory
*/
protected $resultJsonFactory;
/**
* Save constructor.
* @param \Magento\Framework\App\Action\Context $context
* @param \Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory
* @param \Magento\Checkout\Model\Session $checkoutSession
*/
public function __construct(
\Magento\Framework\App\Action\Context $context,
\Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory,
\Magento\Checkout\Model\Session $checkoutSession
) {
parent::__construct($context);
$this->checkoutSession = $checkoutSession;
$this->resultJsonFactory = $resultJsonFactory;
}
/**
* @return \Magento\Framework\App\ResponseInterface|\Magento\Framework\Controller\Result\Json|\Magento\Framework\Controller\ResultInterface
*/
public function execute()
{
$result = $this->resultJsonFactory->create();
try {
$params = $this->getRequest()->getParams();
if (isset($params['email'])
&& isset($params['pass'])
&& isset($params['confirmpass'])
&& $params['pass'] == $params['confirmpass']
) {
$this->checkoutSession->setNewAccountInformaton(
['email' => $params['email'], 'pass' => $params['pass']]
);
} else {
$this->checkoutSession->unsNewAccountInformaton();
}
} catch (\Exception $e) {
return $result->setData($e->getMessage());
}
return $result->setData('done');
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Controller\Adminhtml\Field;
use Magento\Backend\App\Action;
use Magento\Backend\App\Action\Context;
use Magento\Framework\View\Result\Page;
use Magento\Framework\View\Result\PageFactory;
/**
* Class Position
* @package Rokanthemes\OnePageCheckout\Controller\Adminhtml\Field
*/
class Manage extends Action
{
/**
* @var PageFactory
*/
protected $resultPageFactory;
/**
* @param Context $context
* @param PageFactory $resultPageFactory
*/
public function __construct(
Context $context,
PageFactory $resultPageFactory
) {
$this->resultPageFactory = $resultPageFactory;
parent::__construct($context);
}
/**
* @return Page
*/
public function execute()
{
$resultPage = $this->resultPageFactory->create();
$resultPage->getConfig()->getTitle()->prepend(__('Manage Fields'));
$resultPage->addBreadcrumb(__('One Page Checkout'), __('One Page Checkout'));
$resultPage->addBreadcrumb(__('Manage Fields'), __('Manage Fields'));
return $resultPage;
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Controller\Adminhtml\Field;
use Exception;
use Magento\Backend\App\Action;
use Magento\Backend\App\Action\Context;
use Magento\Config\Model\ResourceModel\Config;
use Magento\Framework\App\Config\ReinitableConfigInterface;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\App\ResponseInterface;
use Magento\Framework\Controller\Result\Json;
use Magento\Framework\Controller\Result\JsonFactory;
use Magento\Framework\Controller\ResultInterface;
use Rokanthemes\OnePageCheckout\Helper\Data as OpcHelper;
/**
* Class Save
* @package Rokanthemes\OnePageCheckout\Controller\Adminhtml\Field
*/
class Save extends Action
{
/**
* @var Config
*/
private $resourceConfig;
/**
* @var ScopeConfigInterface
*/
private $_appConfig;
/**
* @var JsonFactory
*/
private $resultJsonFactory;
/**
* Save constructor.
*
* @param Context $context
* @param Config $resourceConfig
* @param ReinitableConfigInterface $config
* @param JsonFactory $resultJsonFactory
*/
public function __construct(
Context $context,
Config $resourceConfig,
ReinitableConfigInterface $config,
JsonFactory $resultJsonFactory
) {
$this->resourceConfig = $resourceConfig;
$this->_appConfig = $config;
$this->resultJsonFactory = $resultJsonFactory;
parent::__construct($context);
}
/**
* Save position to config
*
* @return ResponseInterface|Json|ResultInterface
*/
public function execute()
{
/** @var Json $resultJson */
$resultJson = $this->resultJsonFactory->create();
$result = [
'message' => (string) __('Error during save field position.'),
'type' => 'error',
];
$fields = $this->getRequest()->getParam('fields', false);
if ($fields) {
try {
$this->resourceConfig->saveConfig(
OpcHelper::XML_PATH_SORTED_FIELD_POSITION,
$fields,
ScopeConfigInterface::SCOPE_TYPE_DEFAULT,
0
);
} catch (Exception $e) {
$result['message'] = $e->getMessage();
return $resultJson->setData($result);
}
// re-init configuration
$this->_appConfig->reinit();
$result['message'] = (string) __('All fields have been saved.');
$result['type'] = 'success';
}
return $resultJson->setData($result);
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Controller\Index;
use Magento\Customer\Api\AccountManagementInterface;
use Magento\Customer\Api\CustomerRepositoryInterface;
use Magento\Checkout\Controller\Onepage;
use Magento\Framework\App\Action\Context;
use Magento\Customer\Model\Session;
use Magento\Framework\Registry;
use Magento\Framework\Translate\InlineInterface;
use Magento\Framework\Data\Form\FormKey\Validator;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\View\LayoutFactory;
use Magento\Quote\Api\CartRepositoryInterface;
use Magento\Framework\View\Result\PageFactory;
use Magento\Framework\View\Result\LayoutFactory as ResultLayout;
use Magento\Framework\Controller\Result\RawFactory;
use Magento\Framework\Controller\Result\JsonFactory;
use Magento\Checkout\Helper\Data;
use Magento\Checkout\Model\Session as SessionModel;
class Index extends Onepage
{
/**
* Checkout helper
*
* @var Data
*/
private $checkoutHelper;
/**
* Checkout session
*
* @var Session
*/
private $checkoutSession;
/**
* One step checkout helper
*
* @var Config
*/
private $configHelper;
/**
* Initialize dependencies.
*
* @param Context $context
* @param Session $customerSession
* @param CustomerRepositoryInterface $customerRepository
* @param AccountManagementInterface $accountManagement
* @param Registry $coreRegistry
* @param InlineInterface $translateInline
* @param Validator $formKeyValidator
* @param ScopeConfigInterface $scopeConfig
* @param LayoutFactory $layoutFactory
* @param CartRepositoryInterface $quoteRepository
* @param PageFactory $resultPageFactory
* @param ResultLayout $resultLayoutFactory
* @param RawFactory $resultRawFactory
* @param JsonFactory $resultJsonFactory
* @param Data $checkoutHelper
* @param SessionModel $checkoutSession
* @param Config $configHelper
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
*/
public function __construct(
Context $context,
Session $customerSession,
CustomerRepositoryInterface $customerRepository,
AccountManagementInterface $accountManagement,
Registry $coreRegistry,
InlineInterface $translateInline,
Validator $formKeyValidator,
ScopeConfigInterface $scopeConfig,
LayoutFactory $layoutFactory,
CartRepositoryInterface $quoteRepository,
PageFactory $resultPageFactory,
ResultLayout $resultLayoutFactory,
RawFactory $resultRawFactory,
JsonFactory $resultJsonFactory,
Data $checkoutHelper,
SessionModel $checkoutSession,
\Rokanthemes\OnePageCheckout\Helper\Data $configHelper
) {
$this->checkoutHelper = $checkoutHelper;
$this->checkoutSession = $checkoutSession;
$this->configHelper = $configHelper;
parent::__construct(
$context,
$customerSession,
$customerRepository,
$accountManagement,
$coreRegistry,
$translateInline,
$formKeyValidator,
$scopeConfig,
$layoutFactory,
$quoteRepository,
$resultPageFactory,
$resultLayoutFactory,
$resultRawFactory,
$resultJsonFactory
);
}
/**
* Checkout page
*
* @return \Magento\Framework\Controller\ResultInterface
*/
public function execute()
{
if (!$this->configHelper->getModuleStatus()) {
return $this->resultRedirectFactory->create()->setPath('checkout');
}
if (!$this->checkoutHelper->canOnepageCheckout()) {
$this->messageManager->addErrorMessage(__('One-page checkout is turned off.'));
return $this->resultRedirectFactory->create()->setPath('checkout/cart');
}
$quote = $this->getOnepage()->getQuote();
if (!$quote->hasItems() || $quote->getHasError() || !$quote->validateMinimumAmount()) {
return $this->resultRedirectFactory->create()->setPath('checkout/cart');
}
if (!$this->_customerSession->isLoggedIn() && !$this->checkoutHelper->isAllowedGuestCheckout($quote)) {
$this->messageManager->addErrorMessage(__('Guest checkout is disabled.'));
return $this->resultRedirectFactory->create()->setPath('checkout/cart');
}
$currentUrl = $this->_url->getUrl('*/*/*', ['_secure' => true]);
$this->_customerSession->setBeforeAuthUrl($currentUrl);
$this->_customerSession->regenerateId();
$this->checkoutSession->setCartWasUpdated(false);
$this->getOnepage()->initCheckout();
$resultPage = $this->resultPageFactory->create();
$title = trim($this->configHelper->getGeneral('page_title'));
if (!$title || $title == '') {
$title = __('Express Checkout');
}
if($this->configHelper->isDisplayField('show_full_layout'))
{
$resultPage->getLayout()->getUpdate()->addHandle('onepagecheckout_index_index_full');
}
else{
$resultPage->getLayout()->getUpdate()->addHandle('onepagecheckout_index_index_default');
}
$resultPage->getConfig()->getTitle()->set($title);
return $resultPage;
}
}
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Rokanthemes\OnePageCheckout\Controller;
use Magento\Framework\App\Request\Http as HttpRequest;
use Magento\Framework\App\Response\Http as HttpResponse;
use Magento\UrlRewrite\Controller\Adminhtml\Url\Rewrite;
use Magento\UrlRewrite\Model\UrlFinderInterface;
use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;
use Magento\Framework\UrlInterface;
use Magento\Framework\App\Action\Redirect;
use Magento\Framework\App\ActionInterface;
/**
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class Router implements \Magento\Framework\App\RouterInterface
{
/**
* @var \Magento\Framework\App\ActionFactory
*/
protected $actionFactory;
/**
* @var \Magento\Framework\App\Config\ScopeConfigInterface
*/
protected $_helper;
/**
* Router constructor.
* @param \Magento\Framework\App\ActionFactory $actionFactory
* @param \Rokanthemes\OnePageCheckout\Helper\Data $helper
*/
public function __construct(
\Magento\Framework\App\ActionFactory $actionFactory,
\Rokanthemes\OnePageCheckout\Helper\Data $helper
) {
$this->_helper = $helper;
$this->actionFactory = $actionFactory;
}
/**
* Match corresponding URL Rewrite and modify request
*
* @param \Magento\Framework\App\RequestInterface|HttpRequest $request
* @return ActionInterface|null
*/
public function match(\Magento\Framework\App\RequestInterface $request)
{
$identifier = trim($request->getPathInfo(), '/');
if(!$this->_helper->getModuleStatus() || $this->_helper->getConfigUrl() != $identifier)
return null;
$moduleFrontName = 'Rokanthemes_OnePageCheckout';
$actionPath = 'index';
$action = 'index';
$currentModuleName = 'Rokanthemes_OnePageCheckout';
$routeName = 'onepagecheckout';
$request->setModuleName($moduleFrontName);
$request->setControllerName($actionPath);
$request->setActionName($action);
$request->setControllerModule($currentModuleName);
$request->setRouteName($routeName);
return $this->actionFactory->create(\Magento\Framework\App\Action\Forward::class);
} /**
* @param \Magento\Framework\App\RequestInterface|HttpRequest $request
* @param string $url
* @param integer $code
* @return ActionInterface
*/
protected function redirect($request, $url, $code)
{
$this->response->setRedirect($url, $code);
$request->setDispatched(true);
return $this->actionFactory->create(Redirect::class);
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Helper;
use Exception;
use Magento\Config\Model\ResourceModel\Config;
use Magento\Customer\Helper\Address as CustomerAddressHelper;
use Magento\Customer\Model\Attribute;
use Magento\Customer\Model\AttributeMetadataDataProvider;
use Magento\Directory\Model\Region;
use Magento\Framework\App\Config\ReinitableConfigInterface;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\Framework\App\Helper\Context;
use Magento\Framework\Locale\Resolver;
use Magento\Framework\ObjectManagerInterface;
use Magento\Store\Model\StoreManagerInterface;
/**
* Class Address
* @package Rokanthemes\OnePageCheckout\Helper
*/
class Address extends Data
{
/**
* @var DirectoryList
*/
protected $_directoryList;
/**
* @var Resolver
*/
protected $_localeResolver;
/**
* @var Region
*/
protected $_regionModel;
/**
* @var CustomerAddressHelper
*/
protected $addressHelper;
protected $jsonHelper;
/**
* @var AttributeMetadataDataProvider
*/
private $attributeMetadataDataProvider;
/**
* @var Config
*/
private $resourceConfig;
/**
* @var ReinitableConfigInterface
*/
private $appConfig;
/**
* Address constructor.
*
* @param Context $context
* @param ObjectManagerInterface $objectManager
* @param StoreManagerInterface $storeManager
* @param DirectoryList $directoryList
* @param Resolver $localeResolver
* @param Region $regionModel
* @param CustomerAddressHelper $addressHelper
* @param AttributeMetadataDataProvider $attributeMetadataDataProvider
* @param Config $resourceConfig
* @param ReinitableConfigInterface $appConfig
*/
public function __construct(
Context $context,
ObjectManagerInterface $objectManager,
StoreManagerInterface $storeManager,
DirectoryList $directoryList,
Resolver $localeResolver,
Region $regionModel,
CustomerAddressHelper $addressHelper,
AttributeMetadataDataProvider $attributeMetadataDataProvider,
Config $resourceConfig,
\Magento\Framework\Json\Helper\Data $jsonHelper,
ReinitableConfigInterface $appConfig
) {
$this->_directoryList = $directoryList;
$this->_localeResolver = $localeResolver;
$this->_regionModel = $regionModel;
$this->addressHelper = $addressHelper;
$this->attributeMetadataDataProvider = $attributeMetadataDataProvider;
$this->resourceConfig = $resourceConfig;
$this->appConfig = $appConfig;
$this->jsonHelper = $jsonHelper;
parent::__construct($context, $objectManager, $storeManager);
}
/**
* Address Fields
*
* @return array
*/
public function getAddressFields()
{
$fieldPosition = $this->getAddressFieldPosition();
$fields = array_keys($fieldPosition);
if (!in_array('country_id', $fields, true)) {
array_unshift($fields, 'country_id');
}
if (in_array('region_id', $fields, true)) {
$fields[] = 'region_id_input';
}
return $fields;
}
/**
* Get position to display on one step checkout
*
* @return array
*/
public function getAddressFieldPosition()
{
$fieldPosition = [];
$sortedField = $this->getSortedField();
foreach ($sortedField as $field) {
$fieldPosition[$field->getAttributeCode()] = [
'sortOrder' => $field->getSortOrder(),
'colspan' => $field->getColspan(),
'required' => $field->getIsRequiredMp(),
'isNewRow' => $field->getIsNewRow(),
];
}
return $fieldPosition;
}
/**
* Get attribute collection to show on process checkout
*
* @param bool|true $onlySorted
*
* @return array
*/
public function getSortedField($onlySorted = true)
{
$availableFields = [];
$sortedFields = [];
$sortOrder = 1;
$collection = $this->attributeMetadataDataProvider->loadAttributesCollection(
'customer_address',
'customer_register_address'
);
/** @var Attribute $field */
foreach ($collection as $field) {
if ($this->isAddressAttributeVisible($field)) {
$availableFields[$field->getAttributeCode()] = $field;
}
}
$collection = $this->attributeMetadataDataProvider->loadAttributesCollection(
'customer',
'customer_account_create'
);
/** @var Attribute $field */
foreach ($collection as $field) {
if ($this->isCustomerAttributeVisible($field)) {
$availableFields[$field->getAttributeCode()] = $field;
}
}
$collection = $this->attributeMetadataDataProvider->loadAttributesCollection(
'customer_address',
'onestepcheckout_index_index'
);
/** @var Attribute $field */
foreach ($collection as $field) {
if ($field->getIsVisible()) {
$availableFields[$field->getAttributeCode()] = $field;
}
}
// apply Custom Field label config
for ($i = 1; $i <= 3; $i++) {
$key = 'custom_field_' . $i;
$field = $availableFields[$key] ?? null;
if ($field) {
$field->setDefaultFrontendLabel($this->getCustomFieldLabel($i));
}
}
$colCount = 0;
foreach ($this->getFieldPosition() as $field) {
foreach ($availableFields as $code => $avField) {
if ($field['code'] === $code) {
unset($availableFields[$code]);
$avField
->setColspan($field['colspan'])
->setSortOrder($sortOrder++)
->setColStyle($this->getColStyle($field['colspan']))
->setIsNewRow($this->getIsNewRow($field['colspan'], $colCount));
if (isset($field['required'])) {
// cannot set IS_REQUIRED because attribute is not user defined
$avField->setIsRequiredMp($field['required']);
}
$sortedFields[$code] = $avField;
break;
}
}
}
return $onlySorted ? $sortedFields : [$sortedFields, $availableFields];
}
/**
* Check if address attribute can be visible on frontend
*
* @param Attribute $attribute
*
* @return bool|null|string
*/
public function isAddressAttributeVisible($attribute)
{
// if ($this->isEnableCustomerAttributes() && $attribute->getIsUserDefined()) {
// return false; // Prevent duplicated customer attributes
// }
$code = $attribute->getAttributeCode();
$result = $attribute->getIsVisible();
switch ($code) {
case 'vat_id':
$result = $this->addressHelper->isVatAttributeVisible();
break;
case 'region':
$result = false;
break;
}
return $result;
}
/**
* Check if customer attribute can be visible on frontend
*
* @param Attribute $attribute
*
* @return bool|null|string
*/
public function isCustomerAttributeVisible($attribute)
{
$code = $attribute->getAttributeCode();
if (in_array($code, ['gender', 'taxvat', 'dob'])) {
return $attribute->getIsVisible();
}
return $attribute->getIsUserDefined();
}
/**
* @return array
*/
public function getFieldPosition()
{
$fields = $this->getConfigValue(self::XML_PATH_SORTED_FIELD_POSITION);
if(!$fields)
{
$fields = '[{"code":"firstname","colspan":12,"required":true},{"code":"lastname","colspan":12,"required":true},{"code":"street","colspan":12,"required":false},{"code":"city","colspan":12,"required":false},{"code":"postcode","colspan":12,"required":false},{"code":"country_id","colspan":12,"required":true},{"code":"region_id","colspan":12,"required":true},{"code":"company","colspan":12,"required":false},{"code":"telephone","colspan":12,"required":true}]';
}
return $this->jsonHelper->jsonDecode($fields);
}
/**
* @param int $colSpan
*
* @return string
*/
public function getColStyle($colSpan)
{
switch ($colSpan) {
case 12:
return 'wide';
case 9:
return 'medium';
case 3:
return 'short';
default:
return '';
}
}
/**
* @param int $colSpan
* @param int $colCount
*
* @return bool
*/
public function getIsNewRow($colSpan, &$colCount)
{
$result = $colCount === 0;
$colCount += $colSpan;
if ($colCount >= 12) {
$colCount = 0;
}
return $result;
}
}
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Rokanthemes\OnePageCheckout\Helper;
use Magento\Framework\App\Helper\AbstractHelper;
use Magento\Store\Model\ScopeInterface;
use Magento\GiftMessage\Helper\Message;
use Magento\Framework\ObjectManagerInterface;
/**
* Catalog category helper
*
* @SuppressWarnings(PHPMD.LongVariable)
*/
class Data extends AbstractHelper
{
const XML_PATH_STATUS_ONEPAGECHECKOUT = 'onepagecheckout/general/enabled';
const XML_PATH_URL_ONEPAGECHECKOUT = 'onepagecheckout/general/seourl';
const GENERAL_GROUP = 'onepagecheckout/general/';
const XML_PATH_SORTED_FIELD_POSITION = 'onepagecheckout/field/position';
/**
* Store manager
*
* @var \Magento\Store\Model\StoreManagerInterface
*/
protected $_storeManager;
protected $objectManager;
public function __construct(
\Magento\Framework\App\Helper\Context $context,
ObjectManagerInterface $objectManager,
\Magento\Store\Model\StoreManagerInterface $storeManager
) {
$this->_storeManager = $storeManager;
$this->objectManager = $objectManager;
parent::__construct($context);
}
public function getConfigUrl()
{
return $this->scopeConfig->getValue(self::XML_PATH_URL_ONEPAGECHECKOUT);
}
public function getModuleStatus()
{
return $this->scopeConfig->getValue(self::XML_PATH_STATUS_ONEPAGECHECKOUT);
}
public function getGeneral($field, $storeId = null)
{
if (!$this->getModuleStatus()) {
return false;
}
return $this->scopeConfig->getValue(
self::GENERAL_GROUP . $field,
ScopeInterface::SCOPE_STORE,
$storeId
);
}
/**
* @param string $field
* @param null|int $storeId
* @return mixed
*/
public function isDisplayField($field, $storeId = null)
{
if (!$this->getModuleStatus()) {
return false;
}
return $this->scopeConfig->isSetFlag(
self::GENERAL_GROUP . $field,
ScopeInterface::SCOPE_STORE,
$storeId
);
}
public function getPaymentOnlineMethods()
{
$onlineMethodList = [
'payflowpro',
'payflow_link',
'payflow_advanced',
'braintree_paypal',
'paypal_express_bml',
'payflow_express_bml',
'payflow_express',
'paypal_express',
'authorizenet_directpost',
'realexpayments_hpp',
'braintree'
];
return $onlineMethodList;
}
public function isMessagesAllowed($store = null)
{
if (!$this->getModuleStatus()) {
return false;
}
return $this->scopeConfig->isSetFlag(
Message::XPATH_CONFIG_GIFT_MESSAGE_ALLOW_ORDER,
ScopeInterface::SCOPE_STORE,
$store
);
}
public function getDefaultCustomerGroupId($storeId = null)
{
return $this->scopeConfig->getValue(
'customer/create_account/default_group',
ScopeInterface::SCOPE_STORE,
$storeId
);
}
public function getConfigValue($field, $scopeValue = null, $scopeType = ScopeInterface::SCOPE_STORE)
{
return $this->scopeConfig->getValue($field, $scopeType, $scopeValue);
}
/**
* @return bool
*/
public function isEnableAmazonPay()
{
return $this->isModuleOutputEnabled('Amazon_Payment');
}/**
* @param $path
*
* @return mixed
*/
public function getObject($path)
{
return $this->objectManager->get($path);
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Model;
use Magento\Sales\Model\Order\Status\HistoryFactory;
use Magento\Newsletter\Model\Subscriber;
use Psr\Log\LoggerInterface;
use Magento\Sales\Api\OrderRepositoryInterface;
/**
* Class AdditionalData
*
* @package Rokanthemes\OnePageCheckout\Model
*/
class AdditionalData
{
/**
* Order history factory
*
* @var HistoryFactory $historyFactory
*/
private $historyFactory;
/**
* @var \Magento\Sales\Api\OrderRepositoryInterface
*/
private $orderRepository;
/**
* Subcriber
*
* @var \Magento\Newsletter\Model\Subscriber
*/
private $subscriber;
/**
* Logger
*
* @var \Psr\Log\LoggerInterface
*/
private $logger;
/**
* Initialize dependencies.
*
* @param HistoryFactory $historyFactory
* @param OrderRepositoryInterface $orderRepository
* @param Subscriber $subscriber
* @param LoggerInterface $logger
*/
public function __construct(
HistoryFactory $historyFactory,
OrderRepositoryInterface $orderRepository,
Subscriber $subscriber,
LoggerInterface $logger
) {
$this->historyFactory = $historyFactory;
$this->orderRepository = $orderRepository;
$this->subscriber = $subscriber;
$this->logger = $logger;
}
/**
* @param \Magento\Quote\Model\Quote $quote
* @param array $additionalData
* @return void
*/
public function saveDelivery($quote, $additionalData)
{
if (isset($additionalData['customer_shipping_date'])) {
$quote->setCustomerShippingDate($additionalData['customer_shipping_date']);
}
if (isset($additionalData['customer_shipping_comments'])) {
$quote->setCustomerShippingComments($additionalData['customer_shipping_comments']);
}
}
/**
* @param int $orderId
* @param array $additionalData
* @return void
*/
public function saveComment($orderId, $additionalData)
{
$order = $this->orderRepository->get($orderId);
try {
if (isset($additionalData['order_comment']) && $additionalData['order_comment']) {
$comment = $order->getCustomerName();
$comment .= ': ';
$comment .= $additionalData['order_comment'];
if ($order->getId()) {
$status = $order->getStatus();
$history = $this->historyFactory->create();
$history->setComment($comment)
->setParentId($orderId)
->setIsVisibleOnFront(1)
->setIsCustomerNotified(0)
->setEntityName('order')
->setStatus($status)
->save();
}
}
} catch (\Exception $e) {
$this->logger->error($e->getMessage());
}
}
/**
* @param int $orderId
* @param array $additionalData
* @return void
*/
public function subscriber($orderId, $additionalData)
{
$order = $this->orderRepository->get($orderId);
try {
if (isset($additionalData['subscribe']) && $additionalData['subscribe']) {
if ($order->getCustomerId()) {
$subscriberModel = $this->subscriber->loadByCustomerId($order->getCustomerId());
if (!$subscriberModel->isSubscribed()) {
$this->subscriber->subscribeCustomerById($order->getCustomerId());
}
} else {
$subscriberModel = $this->subscriber->loadByEmail($order->getCustomerEmail());
if (!$subscriberModel->isSubscribed()) {
$this->subscriber->subscribe($order->getCustomerEmail());
}
}
}
} catch (\Exception $e) {
$this->logger->error($e->getMessage());
}
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Model;
use Magento\Checkout\Model\ConfigProviderInterface;
use Magento\GiftMessage\Model\CompositeConfigProvider as GiftMessageConfig;
use Magento\Framework\Serialize\Serializer\Json;
use Magento\Framework\View\LayoutInterface;
use Rokanthemes\OnePageCheckout\Model\ResourceModel\CompositeConfig;
use Magento\Framework\HTTP\PhpEnvironment\RemoteAddress;
use Magento\Framework\HTTP\Client\Curl;
use Psr\Log\LoggerInterface;
class CompositeConfigProvider implements ConfigProviderInterface
{
/**
* config helper.
*
* @var Config
*/
private $configHelper;
/**
* @var GiftMessageConfig
*/
private $configProvider;
/**
* @var Json
*/
private $serializer;
/**
* @var LayoutInterface
*/
private $layout;
/**
* @var CompositeConfig
*/
private $compositeConfig;
/**
* @var RemoteAddress
*/
private $remoteAddress;
/**
* @var LoggerInterface
*/
private $logger;
/**
* @var Curl
*/
private $curl;
/**
* CompositeConfigProvider constructor.
* @param \Rokanthemes\OnePageCheckout\Helper\Data $configHelper
* @param GiftMessageConfig $configProvider
* @param Json $serializer
* @param LayoutInterface $layout
* @param CompositeConfig $compositeConfig
* @param RemoteAddress $remoteAddress
* @param Curl $curl
* @param LoggerInterface $logger
*/
public function __construct(
\Rokanthemes\OnePageCheckout\Helper\Data $configHelper,
GiftMessageConfig $configProvider,
Json $serializer,
LayoutInterface $layout,
CompositeConfig $compositeConfig,
RemoteAddress $remoteAddress,
Curl $curl,
LoggerInterface $logger
) {
$this->configHelper = $configHelper;
$this->configProvider = $configProvider;
$this->serializer = $serializer;
$this->layout = $layout;
$this->compositeConfig = $compositeConfig;
$this->remoteAddress = $remoteAddress;
$this->curl = $curl;
$this->logger = $logger;
}
/**
* Get Config
*
* @return array
* @throws \Magento\Framework\Exception\NoSuchEntityException
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.NPathComplexity)
*/
public function getConfig()
{
$output = [];
$helper = $this->configHelper;
if ($helper->getModuleStatus()) {
$config['googleApiAutoComplete'] = false;
$config['googleApiListCountries'] = $this->compositeConfig->getCountryHasRegion();
$config['autoCreateNewAccount']['enable'] = true;
$config['autoCreateNewAccount']['minLength'] = 8;
$config['autoCreateNewAccount']['minCharacterSets'] = 3;
$config['titlePlaceOrder'] = $this->configHelper->getGeneral('title_place_order');
if ($helper->isDisplayField('show_gift_message') && $helper->isMessagesAllowed()) {
$config['giftOptionsConfig'] = $this->getGiftOptionsConfigJson();
}
$output['OnePageCheckout'] = $config;
$output['paypal_in_context'] = false;
$output['rewrite_email_element'] = true;
$output['opcWidget'] = $this->getOpcWidget();
}
return $output;
}
/**
* Get Widget
*
* @return array
* @throws \Magento\Framework\Exception\NoSuchEntityException
*/
private function getOpcWidget()
{
$result = [];
if($this->configHelper->isDisplayField('show_widget_box') && $this->configHelper->getGeneral('widget_after_placeorder'))
{
$result['widget_after_placeorder'][] =
$this->layout->createBlock(\Magento\Cms\Block\Block::class)
->setBlockId($this->configHelper->getGeneral('widget_after_placeorder'))->toHtml();
}
return $result;
}
/**
* Retrieve gift message configuration
*
* @return string
*/
private function getGiftOptionsConfigJson()
{
return $this->configProvider->getConfig();
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Model;
use Rokanthemes\OnePageCheckout\Api\GuestUpdateItemManagementInterface;
use Magento\Quote\Model\QuoteIdMaskFactory;
use Rokanthemes\OnePageCheckout\Api\UpdateItemManagementInterface;
/**
* Class GuestUpdateItemManagement
*
* @package Rokanthemes\OnePageCheckout\Model
*/
class GuestUpdateItemManagement implements GuestUpdateItemManagementInterface
{
/**
* @var \Magento\Quote\Model\QuoteIdMaskFactory
*/
private $quoteIdMaskFactory;
/**
* @var \Rokanthemes\OnePageCheckout\Api\UpdateItemManagementInterface
*/
private $updateItemManagement;
/**
* @param QuoteIdMaskFactory $quoteIdMaskFactory
* @param UpdateItemManagementInterface $updateItemManagement
*/
public function __construct(
QuoteIdMaskFactory $quoteIdMaskFactory,
UpdateItemManagementInterface $updateItemManagement
) {
$this->quoteIdMaskFactory = $quoteIdMaskFactory;
$this->updateItemManagement = $updateItemManagement;
}
/**
* {@inheritdoc}
*/
public function update($cartId, \Magento\Quote\Api\Data\EstimateAddressInterface $address, $itemId, $qty)
{
$quoteIdMask = $this->quoteIdMaskFactory->create()->load($cartId, 'masked_id');
$quoteId = (int) $quoteIdMask->getQuoteId();
return $this->updateItemManagement->update($quoteId, $address, $itemId, $qty);
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Model\ResourceModel;
class CompositeConfig
{
/**
* @var array
*/
protected $tableNames = [];
/**
* @var ResourceConnection
*/
protected $resourceConnection;
/**
* @var \Magento\Framework\DB\Adapter\AdapterInterface
*/
protected $readAdapter;
/**
* @var \Magento\Store\Model\StoreManagerInterface
*/
protected $storeManager;
/**
* compositeConfig constructor.
* @param \Magento\Framework\App\ResourceConnection $resourceConnection
* @param \Magento\Store\Model\StoreManagerInterface $storeManager
*/
public function __construct(
\Magento\Framework\App\ResourceConnection $resourceConnection,
\Magento\Store\Model\StoreManagerInterface $storeManager
) {
$this->resourceConnection = $resourceConnection;
$this->storeManager = $storeManager;
$this->readAdapter = $this->resourceConnection->getConnection('core_read');
}
/**
* Get Widget
*
* @return array
* @throws \Magento\Framework\Exception\NoSuchEntityException
*/
public function getOpcWidget()
{
$storeId = $this->storeManager->getStore()->getId();
$select = $this->readAdapter->select()
->from(
['t1' => $this->getTableName('widget_instance_page')],
['t1.block_reference']
)->joinLeft(
['t2' => $this->getTableName('widget_instance')],
't1.instance_id = t2.instance_id',
['t2.widget_parameters']
)->where("t1.layout_handle = 'rokanthemes_opc'")
->where("FIND_IN_SET(0, store_ids) OR FIND_IN_SET(" . $storeId . ", store_ids)")
->order('t2.sort_order ASC')
->order('t2.instance_id ASC');
// @codingStandardsIgnoreStart
return $this->readAdapter->fetchAll($select);
// @codingStandardsIgnoreEnd
}
/**
* Get Country
*
* @return array
*/
public function getCountryHasRegion()
{
// @codingStandardsIgnoreStart
$select = $this->readAdapter->select()
->from(
[$this->getTableName('directory_country_region')],
'country_id'
)->group('country_id');
// @codingStandardsIgnoreEnd
$result = $this->readAdapter->fetchCol($select);
return $result;
}
/**
* Get Table Name
*
* @param String $entity
* @return bool|mixed
*/
public function getTableName($entity)
{
if (!isset($this->tableNames[$entity])) {
try {
$this->tableNames[$entity] = $this->resourceConnection->getTableName($entity);
} catch (\Exception $e) {
return false;
}
}
return $this->tableNames[$entity];
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Model;
use Rokanthemes\OnePageCheckout\Api\Data\UpdateItemDetailsInterface;
use Magento\Framework\Model\AbstractExtensibleModel;
/**
* Class GuestUpdateItemManagement
*
* @package Rokanthemes\OnePageCheckout\Model
*/
class UpdateItemDetails extends AbstractExtensibleModel implements UpdateItemDetailsInterface
{
/**
* {@inheritdoc}
*/
public function getPaymentMethods()
{
return $this->getData(self::PAYMENT_METHODS);
}
/**
* {@inheritdoc}
*/
public function setPaymentMethods($paymentMethods)
{
return $this->setData(self::PAYMENT_METHODS, $paymentMethods);
}
/**
* {@inheritdoc}
*/
public function getTotals()
{
return $this->getData(self::TOTALS);
}
/**
* {@inheritdoc}
*/
public function setTotals($totals)
{
return $this->setData(self::TOTALS, $totals);
}
/**
* {@inheritdoc}
*/
public function getShippingMethods()
{
return $this->getData(self::SHIPPING_METHODS);
}
/**
* {@inheritdoc}
*/
public function setShippingMethods($shippingMethods)
{
return $this->setData(self::SHIPPING_METHODS, $shippingMethods);
}
/**
* {@inheritdoc}
*/
public function getMessage()
{
return $this->getData(self::MESSAGE);
}
/**
* {@inheritdoc}
*/
public function setMessage($message)
{
return $this->setData(self::MESSAGE, $message);
}
/**
* {@inheritdoc}
*/
public function getStatus()
{
return $this->getData(self::STATUS);
}
/**
* {@inheritdoc}
*/
public function setStatus($status)
{
return $this->setData(self::STATUS, $status);
}
/**
* {@inheritdoc}
*/
public function getHasError()
{
return $this->getData(self::HAS_ERROR);
}
/**
* {@inheritdoc}
*/
public function setHasError($error)
{
return $this->setData(self::HAS_ERROR, $error);
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Model;
use Rokanthemes\OnePageCheckout\Api\UpdateItemManagementInterface;
use Magento\Framework\Exception\CouldNotSaveException;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Quote\Api\CartRepositoryInterface;
use Magento\Framework\Exception\LocalizedException;
use Rokanthemes\OnePageCheckout\Api\Data\UpdateItemDetailsInterfaceFactory;
use Magento\Quote\Api\ShippingMethodManagementInterface;
use Magento\Quote\Api\PaymentMethodManagementInterface;
use Magento\Quote\Api\CartTotalRepositoryInterface;
use Magento\Framework\Escaper;
/**
* Class UpdateItemManagement
*
* @package Rokanthemes\OnePageCheckout\Model
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class UpdateItemManagement implements UpdateItemManagementInterface
{
/**
* @var CartRepositoryInterface
*/
private $cartRepository;
/**
* @var UpdateItemDetailsInterfaceFactory
*/
private $updateItemDetails;
/**
* @var ShippingMethodManagementInterface
*/
private $shippingMethodManagement;
/**
* @var PaymentMethodManagementInterface
*/
private $paymentMethodManagement;
/**
* @var CartTotalRepositoryInterface
*/
private $cartTotalRepository;
/**
* @var Escaper
*/
private $escaper;
/**
* UpdateItemManagement constructor.
* @param CartRepositoryInterface $cartRepository
* @param UpdateItemDetailsInterfaceFactory $updateItemDetails
* @param ShippingMethodManagementInterface $shippingMethodManagement
* @param PaymentMethodManagementInterface $paymentMethodManagement
* @param CartTotalRepositoryInterface $cartTotalRepository
* @param Escaper $escaper
*/
public function __construct(
CartRepositoryInterface $cartRepository,
UpdateItemDetailsInterfaceFactory $updateItemDetails,
ShippingMethodManagementInterface $shippingMethodManagement,
PaymentMethodManagementInterface $paymentMethodManagement,
CartTotalRepositoryInterface $cartTotalRepository,
Escaper $escaper
) {
$this->cartRepository = $cartRepository;
$this->updateItemDetails = $updateItemDetails;
$this->shippingMethodManagement = $shippingMethodManagement;
$this->paymentMethodManagement = $paymentMethodManagement;
$this->cartTotalRepository = $cartTotalRepository;
$this->escaper = $escaper;
}
/**
* @param int $cartId
* @param \Magento\Quote\Api\Data\EstimateAddressInterface $address
* @param int $itemId
* @param float $qty
* @return \Rokanthemes\OnePageCheckout\Api\Data\UpdateItemDetailsInterface
* @throws CouldNotSaveException
* @throws NoSuchEntityException
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
public function update(
$cartId,
\Magento\Quote\Api\Data\EstimateAddressInterface $address,
$itemId,
$qty
) {
$status = false;
/** @var \Magento\Quote\Model\Quote $quote */
$quote = $this->cartRepository->getActive($cartId);
if (!$quote) {
throw new NoSuchEntityException(__('This quote does not exist.'));
}
$quoteItem = $quote->getItemById($itemId);
if (!$quoteItem) {
throw new NoSuchEntityException(__('We can\'t find the quote item.'));
}
try {
if (!$qty || $qty <= 0) {
$quote->removeItem($itemId);
$this->cartRepository->save($quote);
$status = true;
$message = __(
'%1 was removed in your shopping cart.',
$this->escaper->escapeHtml($quoteItem->getProduct()->getName())
);
} else {
$quoteItem->setQty($qty);
if ($quoteItem->getHasError()) {
throw new CouldNotSaveException(__($quoteItem->getMessage()));
} else {
$quoteItem->save();
$status = true;
$message = __(
'%1 was updated in your shopping cart.',
$this->escaper->escapeHtml($quoteItem->getProduct()->getName())
);
}
}
$this->cartRepository->save($quote);
} catch (LocalizedException $e) {
$message = $e->getMessage();
} catch (\Exception $e) {
$message = $e->getMessage();
}
return $this->getUpdateCartDetails($quote, $address, $cartId, $message, $status);
}
/**
* @param \Magento\Quote\Model\Quote $quote
* @param \Magento\Quote\Api\Data\EstimateAddressInterface $address
* @param int $quoteId
* @param string $message
* @param boolean $status
* @return \Rokanthemes\OnePageCheckout\Api\Data\UpdateItemDetailsInterface
* @throws NoSuchEntityException
*/
private function getUpdateCartDetails($quote, $address, $quoteId, $message, $status)
{
$cartDetails = $this->updateItemDetails->create();
$paymentMethods = $this->paymentMethodManagement->getList($quoteId);
$totals = $this->cartTotalRepository->get($quoteId);
$shippingAddress = $quote->getShippingAddress();
if ($shippingAddress && $shippingAddress->getCustomerAddressId()) {
$shippingMethods = $this->shippingMethodManagement->estimateByAddressId(
$quoteId,
$shippingAddress->getCustomerAddressId()
);
} else {
$shippingMethods = $this->shippingMethodManagement->estimateByAddress($quoteId, $address);
}
$cartDetails->setShippingMethods($shippingMethods);
$cartDetails->setPaymentMethods($paymentMethods);
$cartDetails->setTotals($totals);
$cartDetails->setMessage($message);
$cartDetails->setStatus($status);
if (!$quote->hasItems() || $quote->getHasError() || !$quote->validateMinimumAmount()) {
$cartDetails->setHasError(true);
}
return $cartDetails;
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Observer\Admin;
use Magento\Framework\Event\Observer as EventObserver;
use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\View\LayoutInterface;
class CoreLayoutRenderElementObserver implements ObserverInterface
{
/**
* @var LayoutInterface
*/
private $layout;
/**
* One step checkout config helper
*
* @var Config
*/
private $configHelper;
public function __construct(
LayoutInterface $layout,
\Rokanthemes\OnePageCheckout\Helper\Data $configHelper
) {
$this->layout = $layout;
$this->configHelper = $configHelper;
}
/**
* Execute observer
*
* @param EventObserver $observer
* @return void
*/
public function execute(EventObserver $observer)
{
if ($observer->getElementName() == 'order_shipping_view' &&
$this->configHelper->getModuleStatus() ) {
$orderShippingViewBlock = $observer->getLayout()->getBlock($observer->getElementName());
$order = $orderShippingViewBlock->getOrder();
$deliveryBlock = $this->layout->createBlock(\Magento\Framework\View\Element\Template::class);
$date = $order->getCustomerShippingDate();
$deliveryBlock->setCustomerShippingDate($date)
->setCustomerShippingComments($order->getCustomerShippingComments())
->setActiveJs(true)
->setTemplate('Rokanthemes_OnePageCheckout::delivery.phtml');
$html = $observer->getTransport()->getOutput() . $deliveryBlock->toHtml();
$observer->getTransport()->setOutput($html);
}
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Observer;
use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\Event\Observer;
class SalesModelServiceQuoteSubmitBeforeObserver implements ObserverInterface
{
/**
* @var \Rokanthemes\OnePageCheckout\Helper\Data|Config
*/
private $configHelper;
public function __construct(
\Rokanthemes\OnePageCheckout\Helper\Data $configHelper
) {
$this->configHelper = $configHelper;
}
/**
* @param Observer $observer
* @return $this|void
*/
public function execute(Observer $observer)
{
$quote = $observer->getEvent()->getQuote();
$order = $observer->getEvent()->getOrder();
if ($this->configHelper->getModuleStatus()) {
$order->setCustomerShippingDate($quote->getCustomerShippingDate());
$order->setCustomerShippingComments($quote->getCustomerShippingComments());
}
return $this;
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Observer;
use Magento\Framework\Event\Observer as EventObserver;
use Magento\Framework\Event\ObserverInterface;
class SalesOrderPlaceAfterObserver implements ObserverInterface
{
/**
* CUSTOMER_IS_GUEST
*/
const CUSTOMER_IS_GUEST = 0;
/**
* @var GuestToCustomer\Helper\Observer\Helper
*/
protected $customerFactory;
/**
* @var \Magento\Customer\Model\AddressFactory
*/
protected $addressFactory;
/**
* @var \Magento\Customer\Model\Session
*/
protected $customerSession;
/**
* @var \Magento\Store\Model\StoreManagerInterface
*/
protected $storeManager;
/**
* @var \Magento\Checkout\Model\Session
*/
protected $checkoutSession;
/**
* @var \Rokanthemes\OnePageCheckout\Helper\Data
*/
protected $helper;
/**
* @var \Magento\Sales\Model\Order\Status\HistoryFactory
*/
protected $historyFactory;
/**
* @var \Magento\Newsletter\Model\Subscriber
*/
protected $subscriber;
/**
* @var \Psr\Log\LoggerInterface
*/
protected $logger;
public function __construct(
\Magento\Customer\Model\CustomerFactory $customerFactory,
\Magento\Customer\Model\AddressFactory $addressFactory,
\Magento\Customer\Model\Session $customerSession,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Checkout\Model\Session $checkoutSession,
\Rokanthemes\OnePageCheckout\Helper\Data $helper,
\Magento\Sales\Model\Order\Status\HistoryFactory $historyFactory,
\Magento\Newsletter\Model\Subscriber $subscriber,
\Psr\Log\LoggerInterface $logger
) {
$this->customerFactory = $customerFactory;
$this->addressFactory = $addressFactory;
$this->customerSession = $customerSession;
$this->storeManager = $storeManager;
$this->checkoutSession = $checkoutSession;
$this->helper = $helper;
$this->historyFactory = $historyFactory;
$this->subscriber = $subscriber;
$this->logger = $logger;
}
public function execute(EventObserver $observer)
{
$additionalData = $this->checkoutSession->getRokanthemesOpcAdditionalData();
$this->checkoutSession->unsRokanthemesOpcAdditionalData();
if (isset($additionalData['order_comment']) && $additionalData['order_comment'] != '') {
$this->checkoutSession->setRokanthemesOpcOrderComment($additionalData['order_comment']);
}
$order = $observer->getEvent()->getOrder();
$websiteId = $this->storeManager->getStore()->getWebsiteId();
$storeId = $this->storeManager->getStore()->getId();
if (!$this->helper->getModuleStatus()) {
$this->subscriber($order, $additionalData, 0);
return;
}
$billingAddress = $order->getBillingAddress();
$shippingAddress = $order->getShippingAddress();
$emailGuest = $billingAddress->getData('email');
$customer = $this->checkEmailCustomer($emailGuest, $websiteId);
if ($order->getCustomerIsGuest() == 1 && $customer) {
$observer->getEvent()->getOrder()->setCustomerId(
$customer->getId()
)->setCustomerGroupId(
(int)$customer->getGroupId()
)->setCustomerIsGuest(
self::CUSTOMER_IS_GUEST
)->setCustomerFirstname(
$customer->getName()
);
$customerAttr = $this->checkoutSession->getCustomerAttributes();
if ($customerAttr && !empty($customerAttr)) {
$this->checkoutSession->unsCustomerAttributes();
$customerData = $customer->getDataModel();
foreach ($customerAttr as $attr => $value) {
if (is_array($value)) {
$value = implode(',', $value);
}
$customerData->setCustomAttribute($attr, $value);
}
$customer->updateData($customerData);
try {
$customer->save();
} catch (\Exception $e) {
$this->logger->debug($e->getMessage());
}
}
$this->subscriber($order, $additionalData, $customer->getId());
return $this;
}
$pass = $this->isCreateNewAccount($emailGuest);
if (!$pass) {
if ($order->getCustomerIsGuest() == 0) {
$this->subscriber($order, $additionalData, $order->getCustomerId());
} else {
$this->subscriber($order, $additionalData, 0);
}
return;
}
if ($order->getCustomerIsGuest() == 1 && !$customer) {
try {
$shippingAddress = $shippingAddress ? $shippingAddress->getData() : [];
$shippingAddress = $this->removeExtensionAttributes($shippingAddress);
$billingAddress = $billingAddress->getData();
$defaultCustomerGroupId = $this->helper->getDefaultCustomerGroupId($storeId);
$customer = $this->createNewAccount(
$billingAddress,
$websiteId,
$storeId,
$defaultCustomerGroupId,
$pass
);
if (!$customer) {
$this->subscriber($order, $additionalData, 0);
return;
}
$customerId = $customer->getId();
$customerAddressId = $this->saveCustomerAddresses($customerId, $shippingAddress, $billingAddress);
if (empty($customerAddressId)) {
$this->subscriber($order, $additionalData, $customer->getId());
return;
}
$observer->getEvent()->getOrder()
->setCustomerId($customerId)
->setCustomerEmail($billingAddress['email'])
->setCustomerFirstname($billingAddress['firstname'])
->setCustomerLastname($billingAddress['lastname'])
->setCustomerIsGuest(self::CUSTOMER_IS_GUEST)
->setCustomerGroupId($defaultCustomerGroupId);
//Set order address
$this->setOrderAddress($customerId, $customerAddressId, $observer);
$this->customerSession->setCustomerAsLoggedIn($customer);
} catch (\Exception $e) {
$this->logger->debug($e->getMessage());
}
}
if ($order->getCustomerIsGuest() == 0) {
$this->subscriber($order, $additionalData, $order->getCustomerId());
} else {
$this->subscriber($order, $additionalData, 0);
}
}
/**
* Check Create Account
*
* @param string $emailGuest
* @return bool
*/
protected function isCreateNewAccount($emailGuest)
{
$newCustomer = $this->checkoutSession->getNewAccountInformaton();
if ($newCustomer &&
isset($newCustomer['email']) &&
isset($newCustomer['pass']) &&
$emailGuest == $newCustomer['email']
) {
$this->checkoutSession->unsNewAccountInformaton();
return $newCustomer['pass'];
}
return false;
}
/**
* Check exist Customer Email
*
* @param string $customerEmail
* @param int $websiteId
* @return bool|\Magento\Customer\Model\Customer
*/
protected function checkEmailCustomer($customerEmail, $websiteId)
{
$customer = $this->customerFactory->create()->setWebsiteId($websiteId)->loadByEmail($customerEmail);
if ($customer->getId()) {
return $customer;
} else {
return false;
}
}
/**
* Remove Attribute
*
* @param array $shippingAddress
* @return mixed
*/
protected function removeExtensionAttributes($shippingAddress)
{
if (isset($shippingAddress['extension_attributes'])) {
unset($shippingAddress['extension_attributes']);
}
return $shippingAddress;
}
/**
* Create New Account
*
* @param array $billingAddress
* @param int $websiteId
* @param int $storeId
* @param int $defaultCustomerGroupId
* @param string $pass
* @return bool|\Magento\Customer\Model\Customer
*/
protected function createNewAccount($billingAddress, $websiteId, $storeId, $defaultCustomerGroupId, $pass)
{
$customer = $this->customerFactory->create();
$customer->setWebsiteId($websiteId);
$customer->setEmail($billingAddress['email']);
$customer->setGroupId($defaultCustomerGroupId);
$customer->setFirstname($billingAddress['firstname']);
$customer->setLastname($billingAddress['lastname']);
if (isset($billingAddress['prefix']) && $billingAddress['prefix'] != null) {
$customer->setPrefix($billingAddress['prefix']);
}
if (isset($billingAddress['suffix']) && $billingAddress['suffix'] != null) {
$customer->setPrefix($billingAddress['suffix']);
}
$customer->setPassword($pass);
$customerAttr = $this->checkoutSession->getCustomerAttributes();
if ($customerAttr && !empty($customerAttr)) {
$this->checkoutSession->unsCustomerAttributes();
$customerData = $customer->getDataModel();
foreach ($customerAttr as $attr => $value) {
if (is_array($value)) {
$value = implode(',', $value);
}
$customerData->setCustomAttribute($attr, $value);
}
$customer->updateData($customerData);
}
try {
$customer->save();
} catch (\Exception $e) {
$this->logger->debug($e->getMessage());
return false;
}
try {
$customer->reindex();
$customer->sendNewAccountEmail('registered', '', $storeId);
} catch (\Exception $e) {
$this->logger->debug($e->getMessage());
}
return $customer;
}
/**
* Save Customer Address
*
* @param int $customerId
* @param array $shippingAddress
* @param array $billingAddress
* @return array
* @throws \Exception
*/
protected function saveCustomerAddresses($customerId, $shippingAddress, $billingAddress)
{
$result = [];
if (!$this->isAsyncAddress($shippingAddress, $billingAddress)) {
if (!empty($shippingAddress)) {
$shipping = $this->saveAddressCustomer(
$shippingAddress,
$customerId,
'shipping'
);
if ($shipping) {
$result['billing'] = $shipping;
}
}
if (!empty($billingAddress)) {
$billing = $this->saveAddressCustomer(
$billingAddress,
$customerId,
'billing'
);
if ($billing) {
$result['billing'] = $billing;
}
}
} else {
if (isset($shippingAddress['address_type'])) {
if (!empty($shippingAddress)) {
$both = $this->saveAddressCustomer(
$shippingAddress,
$customerId,
'both'
);
if ($both) {
$result['billing_shipping'] = $both;
}
}
}
}
return $result;
}
/**
* Check Shipping same Billing Address
*
* @param array $shippingAddress
* @param array $billingAddress
* @return bool
*/
protected function isAsyncAddress($shippingAddress, $billingAddress)
{
if (empty($shippingAddress) || empty($billingAddress)) {
return false;
}
unset($shippingAddress['address_type']);
unset($billingAddress['address_type']);
unset($shippingAddress['quote_address_id']);
unset($billingAddress['quote_address_id']);
unset($shippingAddress['id']);
unset($billingAddress['id']);
unset($shippingAddress['entity_id']);
unset($billingAddress['entity_id']);
if (!empty(array_diff($shippingAddress, $billingAddress))) {
$sameAddress = false;
} else {
$sameAddress = true;
}
return $sameAddress;
}
/**
* Save Address to Customer
*
* @param array $addressData
* @param int $customerId
* @param string $type
* @return bool|mixed
*/
protected function saveAddressCustomer($addressData, $customerId, $type)
{
$customerAddress = $this->addressFactory->create();
$customerAddress->setCustomerId($customerId)
->setFirstname($addressData['firstname'])
->setLastname($addressData['lastname'])
->setCountryId($addressData['country_id'])
->setRegionId($addressData['region_id'])
->setRegion($addressData['region'])
->setPostcode($addressData['postcode'])
->setCity($addressData['city'])
->setTelephone($addressData['telephone'])
->setCompany($addressData['company'])
->setStreet($addressData['street'])
->setSaveInAddressBook('1');
if ($type == 'billing') {
$customerAddress->setIsDefaultBilling('1');
} elseif ($type == 'shipping') {
$customerAddress->setIsDefaultShipping('1');
} else {
$customerAddress->setIsDefaultBilling('1');
$customerAddress->setIsDefaultShipping('1');
}
try {
$customerAddress->save();
return $customerAddress->getId();
} catch (\Exception $e) {
return false;
}
}
/**
* Save Address to Order
*
* @param int $customerId
* @param array $customerAddress
* @param EventObserver $observer
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
protected function setOrderAddress($customerId, $customerAddress, $observer)
{
$idDefaultBilling = false;
$idDefaultShipping = false;
if (isset($customerAddress['billing_shipping'])) {
$idDefaultBilling = $idDefaultShipping = $customerAddress['billing_shipping'];
} else {
if (isset($customerAddress['billing'])) {
$idDefaultBilling = $customerAddress['billing'];
}
if (isset($customerAddress['shipping'])) {
$idDefaultShipping = $customerAddress['shipping'];
}
if ($idDefaultBilling && !$idDefaultShipping) {
$idDefaultShipping = $idDefaultBilling;
}
if (!$idDefaultBilling && $idDefaultShipping) {
$idDefaultBilling = $idDefaultShipping;
}
}
$order = $observer->getEvent()->getOrder();
if ($order->getBillingAddress()) {
$order->getBillingAddress()->setCustomerId($customerId);
$order->getBillingAddress()->setCustomerAddressId($idDefaultBilling);
}
if ($order->getShippingAddress()) {
$order->getShippingAddress()->setCustomerId($customerId);
$order->getShippingAddress()->setCustomerAddressId($idDefaultShipping);
}
}
/**
* Subscriber
*
* @param Magento\Sales\Model\Order $order
* @param array $additionalData
* @param int $customerId
* @throws \Exception
*/
protected function subscriber($order, $additionalData, $customerId)
{
if (!empty($additionalData)
&& $this->helper->isDisplayField('show_subscribe_newsletter')
) {
if ($customerId != 0 && $customerId != null) {
$subscriberModel = $this->subscriber->loadByCustomerId($customerId);
if (!$subscriberModel->isSubscribed()) {
try {
$this->subscriber->subscribeCustomerById($customerId);
} catch (\Exception $e) {
$this->logger->error($e->getMessage());
}
}
} else {
$subscriberModel = $this->subscriber->loadByEmail($order->getCustomerEmail());
if (!$subscriberModel->isSubscribed()) {
try {
$this->subscriber->subscribe($order->getCustomerEmail());
} catch (\Exception $e) {
$this->logger->error($e->getMessage());
}
}
}
}
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Plugin\Checkout\Block\Checkout;
use Magento\Customer\Model\AttributeMetadataDataProvider;
use Amazon\Core\Helper\Data;
use Magento\Checkout\Block\Checkout\AttributeMerger;
use Magento\Checkout\Model\Session as CheckoutSession;
use Magento\Customer\Model\Attribute;
use Magento\Customer\Model\Options;
use Magento\Framework\App\ObjectManager;
use Magento\Framework\Exception\LocalizedException;
use Magento\Ui\Component\Form\AttributeMapper;
/**
* Class LayoutProcessor
* @package Rokanthemes\OnePageCheckout\Plugin\Checkout\Block\Checkout
*/
class LayoutProcessor
{
/**
* One step checkout helper
*
* @var Config
*/
protected $configHelper;
/**
* LayoutProcessor constructor.
* @param Config $configHelper
*/
/**
* @var AttributeMetadataDataProvider
*/
private $attributeMetadataDataProvider;
/**
* @var AttributeMapper
*/
protected $attributeMapper;
/**
* @var AttributeMerger
*/
protected $merger;
/**
* @var Options
*/
private $options;
/**
* @var CheckoutSession
*/
private $checkoutSession;
public function __construct(
\Rokanthemes\OnePageCheckout\Helper\Address $configHelper,
CheckoutSession $checkoutSession,
AttributeMetadataDataProvider $attributeMetadataDataProvider,
AttributeMapper $attributeMapper,
AttributeMerger $merger
) {
$this->configHelper = $configHelper;
$this->checkoutSession = $checkoutSession;
$this->attributeMetadataDataProvider = $attributeMetadataDataProvider;
$this->attributeMapper = $attributeMapper;
$this->merger = $merger;
}
/**
* @param \Magento\Checkout\Block\Checkout\LayoutProcessor $subject
* @param array $jsLayout
* @return array
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
* @SuppressWarnings(PHPMD.NPathComplexity)
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
public function afterProcess(
\Magento\Checkout\Block\Checkout\LayoutProcessor $subject,
array $jsLayout
) {
if (!$this->configHelper->getModuleStatus()) {
return $jsLayout;
}
if (isset($jsLayout['components']['checkout']['children']['steps']['children']['billing-step']
['children']['payment']['children']['afterMethods']['children']['billing-address-form'])) {
$component = $jsLayout['components']['checkout']['children']['steps']['children']
['billing-step']['children']['payment']['children']['afterMethods']['children']
['billing-address-form'];
unset(
$jsLayout['components']['checkout']['children']['steps']['children']['billing-step']
['children']['payment']['children']['afterMethods']['children']['billing-address-form']
);
$component['component'] = 'Rokanthemes_OnePageCheckout/js/view/billing-address';
$jsLayout['components']['checkout']['children']['steps']['children']['billing-step']
['children']['payment']['children']['payments-list']['children']
['billing-address-form-shared'] = $component;
}
if($orderCommentTitle = $this->configHelper->getGeneral('title_box_order_comment'))
{
$jsLayout['components']['checkout']['children']['sidebar']['children']
['rokanthemes_opc_order_comment']['label'] = $orderCommentTitle;
}
if (!$this->configHelper->isDisplayField('show_order_comment')) {
unset(
$jsLayout['components']['checkout']['children']['sidebar']['children']
['rokanthemes_opc_order_comment']
);
}
$jsLayout = $this->sortAddressComponent($jsLayout);
$jsLayout = $this->newsletter($jsLayout);
$jsLayout = $this->_prepareShippingDelivery($jsLayout);
if (!$this->configHelper->isDisplayField('show_gift_message') ||
!$this->configHelper->isMessagesAllowed()) {
unset(
$jsLayout['components']['checkout']['children']['sidebar']['children']
['giftmessage']
);
}
$jsLayout = $this->discountCode($jsLayout);
$jsLayout = $this->removeComponent($jsLayout);
return $jsLayout;
}
protected function _prepareShippingDelivery($jsLayout)
{
if($boxTitle = $this->configHelper->getGeneral('title_box_shipping_delivery_date'))
{
$jsLayout['components']['checkout']['children']['steps']['children']['shipping-step']['children']
['shippingAddress']['children']
['before-shipping-method-form']['children']
['rokanthemes_opc_shipping_delivery_date']['label'] = $boxTitle;
}
if($boxTitle = $this->configHelper->getGeneral('title_box_shipping_delivery_comment'))
{
$jsLayout['components']['checkout']['children']['steps']['children']['shipping-step']['children']
['shippingAddress']['children']
['before-shipping-method-form']['children']
['rokanthemes_opc_shipping_delivery_comment']['label'] = $boxTitle;
}
if (!$this->configHelper->isDisplayField('show_shipping_delivery_date')) {
unset(
$jsLayout['components']['checkout']['children']['steps']['children']['shipping-step']['children']
['shippingAddress']['children']
['before-shipping-method-form']['children']
['rokanthemes_opc_shipping_delivery_date']
);
}
if (!$this->configHelper->isDisplayField('show_shipping_delivery_comment')) {
unset(
$jsLayout['components']['checkout']['children']['steps']['children']['shipping-step']['children']
['shippingAddress']['children']
['before-shipping-method-form']['children']
['rokanthemes_opc_shipping_delivery_comment']
);
}
return $jsLayout;
}
/**
* @return Options
*/
private function getOptions()
{
if (!is_object($this->options)) {
$this->options = ObjectManager::getInstance()->get(Options::class);
}
return $this->options;
}
protected function sortAddressComponent($jsLayout)
{
$steps = &$jsLayout['components']['checkout']['children']['steps']['children'];
$shippingStep = &$steps['shipping-step']['children'];
/** Shipping address fields */
if (isset($shippingStep['shippingAddress']['children']['shipping-address-fieldset']['children'])) {
$shipping = &$shippingStep['shippingAddress']['children'];
$shipping['shipping-address-fieldset']['children'] = $this->getAddressFieldset(
$shipping['shipping-address-fieldset']['children'],
'shippingAddress'
);
if (isset($shipping['shipping-address-fieldset']['children']['taxvat'])) {
$shipping['shipping-address-fieldset']['children']['taxvat']['dataScope'] = 'shippingAddress.vat_id';
}
if ($this->configHelper->isEnableAmazonPay()) {
$shippingConfig = &$shippingStep['shippingAddress'];
$shippingConfig['component'] = 'Rokanthemes_OnePageCheckout/js/view/shipping';
$shippingConfig['children']['customer-email']['component'] = 'Rokanthemes_OnePageCheckout/js/view/form/element/email';
}
}
/** Billing address fields */
if (isset($shippingStep['billingAddress']['children']['billing-address-fieldset']['children'])) {
$billing = &$shippingStep['billingAddress']['children'];
$billing['billing-address-fieldset']['children'] = $this->getAddressFieldset(
$billing['billing-address-fieldset']['children'],
'billingAddress'
);
/** Fix the issue of the unsaved vat_id field */
if (isset($billing['billing-address-fieldset']['children']['taxvat'])) {
$billing['billing-address-fieldset']['children']['taxvat']['dataScope'] = 'billingAddress.vat_id';
}
/** Remove billing customer email if quote is not virtual */
if (!$this->checkoutSession->getQuote()->isVirtual()) {
unset($billing['customer-email']);
}
}
$billingStep = &$steps['billing-step']['children'];
if(isset($billingStep['payment']['children']['payments-list']['children']['billing-address-form-shared']['children']['form-fields']['children']))
{
$billingStep['payment']['children']['payments-list']['children']['billing-address-form-shared']['children']['form-fields']['children'] = $this->sortFieldAddress(
$billingStep['payment']['children']['payments-list']['children']['billing-address-form-shared']['children']['form-fields']['children']
);
}
/** Remove billing address in payment method content */
/** @var array $fields */
$fields = &$billingStep['payment']['children']['payments-list']['children'];
foreach ($fields as $code => $field) {
if (array_key_exists('component', $field) &&
$field['component'] === 'Magento_Checkout/js/view/billing-address') {
unset($fields[$code]);
}
}
return $jsLayout;
}
protected function sortFieldAddress($fields)
{
$fieldPosition = $this->configHelper->getAddressFieldPosition();
foreach ($fields as $key => $value)
{
if(isset($fieldPosition[$key]['sortOrder']))
{
$fields[$key]['sortOrder'] = $fieldPosition[$key]['sortOrder'];
}
if(isset($fieldPosition[$key]['required']))
{
$fields[$key]['validation']['required-entry'] = $fieldPosition[$key]['required'];
}
}
return $fields;
}
/**
* Get address fieldset for shipping/billing address
*
* @param $fields
* @param $type
*
* @return array
* @throws LocalizedException
*/
public function getAddressFieldset($fields, $type)
{
$elements = $this->getAddressAttributes($fields);
$systemAttribute = $elements['default'];
if (count($systemAttribute)) {
$attributesToConvert = [
'prefix' => [$this->getOptions(), 'getNamePrefixOptions'],
'suffix' => [$this->getOptions(), 'getNameSuffixOptions'],
];
$systemAttribute = $this->convertElementsToSelect($systemAttribute, $attributesToConvert);
$fields = $this->merger->merge(
$systemAttribute,
'checkoutProvider',
$type,
$fields
);
}
$customAttribute = $elements['custom'];
if (count($customAttribute)) {
$fields = $this->merger->merge(
$customAttribute,
'checkoutProvider',
$type . '.custom_attributes',
$fields
);
}
$fieldPosition = $this->configHelper->getAddressFieldPosition();
$opcField = [];
$allFieldSection = $this->configHelper->getSortedField(false);
foreach ($allFieldSection as $allField) {
/** @var Attribute $field */
foreach ($allField as $field) {
$opcField[] = $field->getAttributeCode();
}
}
$this->addCustomerAttribute($fields, $type);
$this->addAddressOption($fields, $fieldPosition, $opcField);
/**
* Compatible Amazon Pay
*/
if ($this->configHelper->isEnableAmazonPay()) {
/** @var Data $amazonHelper */
$amazonHelper = $this->configHelper->getObject(Data::class);
if ($amazonHelper->isPwaEnabled()) {
$fields['inline-form-manipulator'] = [
'component' => 'Rokanthemes_OnePageCheckout/js/view/amazon'
];
}
}
return $fields;
}
/**
* @param array $fields
* @param array $fieldPosition
* @param array $opcField
*
* @return $this
*/
private function addAddressOption(&$fields, $fieldPosition, $opcField = [])
{
foreach ($fields as $code => &$field) {
if (empty($fieldPosition[$code])) {
if ($code === 'country_id') {
$field['config']['additionalClasses'] = 'mp-hidden';
continue;
}
continue;
}
$fieldConfig = $fieldPosition[$code];
if (in_array($code, $opcField, true)) {
$field['sortOrder'] = $fieldConfig['sortOrder'];
}
$classes = $field['config']['additionalClasses'] ?? '';
$classes .= ' col-mp mp-' . $fieldConfig['colspan'];
if ($fieldConfig['isNewRow']) {
$classes .= ' mp-clear';
}
if (isset($fieldConfig['required'])) {
if ($fieldConfig['required']) {
$classes .= ' required';
$field['validation']['required-entry'] = true;
} else {
$classes .= ' not-required';
$validation = &$field['validation'];
if (isset($validation['required-entry'])) {
unset($validation['required-entry']);
}
if (isset($validation['min_text_length'])) {
unset($validation['min_text_length']);
}
}
}
$field['config']['additionalClasses'] = $classes;
}
unset($field);
return $this;
}
/**
* Add customer attribute like gender, dob, taxvat
*
* @param $fields
* @param $type
*
* @return $this
* @throws LocalizedException
*/
private function addCustomerAttribute(&$fields, $type)
{
$attributes = $this->attributeMetadataDataProvider->loadAttributesCollection(
'customer',
'customer_account_create'
);
$addressElements = [];
foreach ($attributes as $attribute) {
if ($this->configHelper->isCustomerAttributeVisible($attribute)) {
$addressElements[$attribute->getAttributeCode()] = $this->attributeMapper->map($attribute);
}
}
if (count($addressElements)) {
$fields = $this->merger->merge(
$addressElements,
'checkoutProvider',
$type . '.custom_attributes',
$fields
);
}
foreach ($fields as $code => &$field) {
if (isset($field['label'])) {
$field['label'] = __($field['label']);
}
}
return $this;
}
/**
* Convert elements(like prefix and suffix) from inputs to selects when necessary
*
* @param array $elements address attributes
* @param array $attributesToConvert fields and their callbacks
*
* @return array
*/
private function convertElementsToSelect($elements, $attributesToConvert)
{
$codes = array_keys($attributesToConvert);
foreach (array_keys($elements) as $code) {
if (!in_array($code, $codes, true)) {
continue;
}
$options = call_user_func($attributesToConvert[$code]);
if (!is_array($options)) {
continue;
}
$elements[$code]['dataType'] = 'select';
$elements[$code]['formElement'] = 'select';
foreach ($options as $key => $value) {
$elements[$code]['options'][] = [
'value' => $key,
'label' => $value,
];
}
}
return $elements;
}
/**
* @param array $fields
*
* @return array
* @throws LocalizedException
*/
private function getAddressAttributes($fields)
{
$elements = [
'custom' => [],
'default' => []
];
$formCodes = ['onestepcheckout_index_index', 'customer_register_address'];
foreach ($formCodes as $formCode) {
$attributes = $this->attributeMetadataDataProvider->loadAttributesCollection(
'customer_address',
$formCode
);
/** @var Attribute $attribute */
foreach ($attributes as $attribute) {
$code = $attribute->getAttributeCode();
if (isset($elements['custom'][$code]) || isset($elements['default'][$code])) {
continue;
}
$element = $this->attributeMapper->map($attribute);
if (isset($element['label'])) {
$label = $element['label'];
$element['label'] = __($label);
}
if ($attribute->getIsUserDefined()) {
if (!isset($fields[$code])) {
$elements['custom'][$code] = $element;
}
} else {
$elements['default'][$code] = $element;
}
}
}
return $elements;
}
/**
* @param $jsLayout
* @return mixed
*/
protected function removeComponent($jsLayout)
{
unset(
$jsLayout['components']['checkout']['children']['steps']['children']['billing-step']
['children']['payment']['children']['afterMethods']['children']['discount']
);
unset(
$jsLayout['components']['checkout']['children']['sidebar']['children']['shipping-information']
);
unset(
$jsLayout['components']['checkout']['children']['steps']['children']['billing-step']
['children']['payment']['children']['payments-list']['children']['before-place-order']
['children']['agreements']
);
unset($jsLayout['components']['checkout']['children']['progressBar']);
if(isset($jsLayout['components']['checkout']['children']['steps']['children']['shipping-step']['children']['shippingAddress']['children']['customer-email']['children']['recaptcha'])){
unset($jsLayout['components']['checkout']['children']['steps']['children']['shipping-step']['children']['shippingAddress']['children']['customer-email']['children']['recaptcha']);
}
if(isset($jsLayout['components']['checkout']['children']['steps']['children']['billing-step']['children']['payment']['children']['customer-email']['children']['recaptcha'])){
unset($jsLayout['components']['checkout']['children']['steps']['children']['billing-step']['children']['payment']['children']['customer-email']['children']['recaptcha']);
}
if(isset($jsLayout['components']['checkout']['children']['steps']['children']['billing-step']['children']['payment']['children']['beforeMethods']['children']['place-order-recaptcha-container'])){
unset($jsLayout['components']['checkout']['children']['steps']['children']['billing-step']['children']['payment']['children']['beforeMethods']['children']['place-order-recaptcha-container']);
}
if(isset($jsLayout['components']['checkout']['children']['authentication']['children']['recaptcha'])){
unset($jsLayout['components']['checkout']['children']['authentication']['children']['recaptcha']);
}
return $jsLayout;
}
/**
* @param $jsLayout
* @return mixed
*/
protected function newsletter($jsLayout)
{
$checked = false;
if ($checked = $this->configHelper->getGeneral('default_newletter_checkbox')) {
$jsLayout['components']['checkout']['children']['sidebar']['children']
['subscribe']['config']['checked'] = $checked;
}
if($newletterTitle = $this->configHelper->getGeneral('title_box_subscribe'))
{
$jsLayout['components']['checkout']['children']['sidebar']['children']
['subscribe']['config']['description'] = $newletterTitle;
}
if(!$this->configHelper->isDisplayField('show_subscribe_newsletter'))
{
unset($jsLayout['components']['checkout']['children']['sidebar']['children']
['subscribe']);
}
return $jsLayout;
}
/**
* @param $jsLayout
* @return mixed
*/
protected function discountCode($jsLayout)
{
if ($this->configHelper->isDisplayField('show_discount_box')) {
$jsLayout['components']['checkout']['children']['sidebar']['children']['discount'] =
$jsLayout['components']['checkout']['children']['steps']['children']['billing-step']
['children']['payment']['children']['afterMethods']['children']['discount'];
$jsLayout['components']['checkout']['children']['sidebar']['children']['discount']
['displayArea'] = 'summary';
$jsLayout['components']['checkout']['children']['sidebar']['children']['discount']
['template'] = 'Rokanthemes_OnePageCheckout/payment/discount';
$jsLayout['components']['checkout']['children']['sidebar']['children']['discount']
['sortOrder'] = 240;
}
return $jsLayout;
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Plugin\Checkout\Controller\Index;
use Magento\Framework\Controller\Result\RedirectFactory;
use Magento\Checkout\Controller\Index\Index as CheckoutIndex;
use Magento\Framework\UrlInterface;
class Index
{
/**
* @var RedirectFactory
*/
private $resultRedirectFactory;
/**
* One step checkout helper
*
* @var Config
*/
private $configHelper;
/**
* @var UrlInterface
*/
private $urlBuilder;
/**
* @param RedirectFactory $resultRedirectFactory
* @param Config $configHelper
* @param UrlInterface $urlBuilder
*/
public function __construct(
RedirectFactory $resultRedirectFactory,
\Rokanthemes\OnePageCheckout\Helper\Data $configHelper,
UrlInterface $urlBuilder
) {
$this->resultRedirectFactory = $resultRedirectFactory;
$this->configHelper = $configHelper;
$this->urlBuilder = $urlBuilder;
}
/**
* @param CheckoutIndex $subject
* @param callable $proceed
* @return mixed
* @SuppressWarnings(PHPMD.UnusedLocalVariable)
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function aroundExecute(
CheckoutIndex $subject,
$proceed
) {
if ($this->configHelper->getModuleStatus()) {
$path = 'onepagecheckout';
$router = $this->configHelper->getConfigUrl();
if ($router) {
$router = preg_replace('/\s+/', '', $router);
$router = preg_replace('/\/+/', '', $router);
$path = trim($router, '/');
}
$url = trim($this->urlBuilder->getUrl($path), '/');
return $this->resultRedirectFactory->create()->setUrl($url);
} else {
return $proceed();
}
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Plugin\Checkout\Helper;
class Data
{
/**
* config helper.
*
* @var Config
*/
private $configHelper;
/**
* @param Config $configHelper
*/
public function __construct(
\Rokanthemes\OnePageCheckout\Helper\Data $configHelper
) {
$this->configHelper = $configHelper;
}
/**
* @param \Magento\Checkout\Helper\Data $subject
* @param callable $proceed
* @return bool
* @SuppressWarnings(PHPMD.UnusedLocalVariable)
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function afterIsDisplayBillingOnPaymentMethodAvailable(
\Magento\Checkout\Helper\Data $subject,
$result
) {
if ($this->configHelper->getModuleStatus()) {
$result = false;
}
return $result;
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Plugin\Checkout\Model;
use Rokanthemes\OnePageCheckout\Model\AdditionalData;
use Magento\Quote\Api\CartRepositoryInterface;
class CustomerAdditionalData
{
/**
* @var AdditionalData
*/
private $additionalDataModel;
/**
* @var CartRepositoryInterface
*/
private $cartRepository;
/**
* @var Magento\Checkout\Model\SessionFactory
*/
private $checkoutSession;
/**
* One step checkout helper
*
* @var Config
*/
private $configHelper;
/**
* CustomerAdditionalData constructor.
* @param AdditionalData $additionalDataModel
* @param CartRepositoryInterface $cartRepository
* @param \Magento\Checkout\Model\SessionFactory $checkoutSession
* @param Config $configHelper
*/
public function __construct(
AdditionalData $additionalDataModel,
CartRepositoryInterface $cartRepository,
\Magento\Checkout\Model\SessionFactory $checkoutSession,
\Rokanthemes\OnePageCheckout\Helper\Data $configHelper
) {
$this->additionalDataModel = $additionalDataModel;
$this->cartRepository = $cartRepository;
$this->checkoutSession = $checkoutSession;
$this->configHelper = $configHelper;
}
public function aroundSavePaymentInformationAndPlaceOrder(
\Magento\Checkout\Api\PaymentInformationManagementInterface $subject,
\Closure $proceed,
$cartId,
\Magento\Quote\Api\Data\PaymentInterface $paymentMethod,
\Magento\Quote\Api\Data\AddressInterface $billingAddress = null
) {
if ($paymentMethod->getExtensionAttributes() !== null
&& $this->configHelper->getModuleStatus()
&& $paymentMethod->getExtensionAttributes()->getRokanthemesOpc() !== null
) {
$additionalData = $paymentMethod->getExtensionAttributes()->getRokanthemesOpc();
$orderId = $proceed($cartId, $paymentMethod, $billingAddress);
if (!empty($additionalData) && isset($additionalData['order_comment'])) {
$this->additionalDataModel->saveComment($orderId, $additionalData);
}
if (!empty($additionalData)
&& $this->configHelper->isDisplayField('show_subscribe_newsletter')
) {
$this->additionalDataModel->subscriber($orderId, $additionalData);
}
} else {
return $proceed($cartId, $paymentMethod, $billingAddress);
}
}
public function beforeSavePaymentInformation(
\Magento\Checkout\Api\PaymentInformationManagementInterface $subject,
$cartId,
\Magento\Quote\Api\Data\PaymentInterface $paymentMethod,
\Magento\Quote\Api\Data\AddressInterface $billingAddress = null
) {
if ($paymentMethod->getExtensionAttributes() !== null
&& $this->configHelper->getModuleStatus()
&& $paymentMethod->getExtensionAttributes()->getRokanthemesOpc() !== null
) {
$additionalData = $paymentMethod->getExtensionAttributes()->getRokanthemesOpc();
$quote = $this->cartRepository->getActive($cartId);
if (!empty($additionalData)) {
$this->additionalDataModel->saveDelivery($quote, $additionalData);
if (in_array($paymentMethod->getMethod(), $this->configHelper->getPaymentOnlineMethods())) {
$this->checkoutSession->create()->setRokanthemesOpcAdditionalData($additionalData);
}
}
}
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Plugin\Checkout\Model;
use Rokanthemes\OnePageCheckout\Model\AdditionalData;
use Magento\Quote\Api\CartRepositoryInterface;
use Magento\Quote\Model\QuoteIdMaskFactory;
class GuestAdditionalData
{
/**
* @var AdditionalData
*/
private $additionalDataModel;
/**
* @var CartRepositoryInterface
*/
private $cartRepository;
/**
* @var QuoteIdMaskFactory
*/
private $quoteIdMaskFactory;
/**
* @var Magento\Checkout\Model\SessionFactory
*/
private $checkoutSession;
/**
* One step checkout helper
*
* @var Config
*/
private $configHelper;
/**
* GuestAdditionalData constructor.
* @param AdditionalData $additionalDataModel
* @param CartRepositoryInterface $cartRepository
* @param QuoteIdMaskFactory $quoteIdMaskFactory
* @param \Magento\Checkout\Model\SessionFactory $checkoutSession
* @param \Rokanthemes\OnePageCheckout\Helper\Data $configHelper
*/
public function __construct(
AdditionalData $additionalDataModel,
CartRepositoryInterface $cartRepository,
QuoteIdMaskFactory $quoteIdMaskFactory,
\Magento\Checkout\Model\SessionFactory $checkoutSession,
\Rokanthemes\OnePageCheckout\Helper\Data $configHelper
) {
$this->additionalDataModel = $additionalDataModel;
$this->cartRepository = $cartRepository;
$this->quoteIdMaskFactory = $quoteIdMaskFactory;
$this->checkoutSession = $checkoutSession;
$this->configHelper = $configHelper;
}
public function aroundSavePaymentInformationAndPlaceOrder(
\Magento\Checkout\Api\GuestPaymentInformationManagementInterface $subject,
\Closure $proceed,
$cartId,
$email,
\Magento\Quote\Api\Data\PaymentInterface $paymentMethod,
\Magento\Quote\Api\Data\AddressInterface $billingAddress = null
) {
if ($paymentMethod->getExtensionAttributes() !== null
&& $this->configHelper->getModuleStatus()
&& $paymentMethod->getExtensionAttributes()->getRokanthemesOpc() !== null
) {
$additionalData = $paymentMethod->getExtensionAttributes()->getRokanthemesOpc();
$orderId = $proceed($cartId, $email, $paymentMethod, $billingAddress);
if (!empty($additionalData) && isset($additionalData['order_comment'])) {
$this->additionalDataModel->saveComment($orderId, $additionalData);
}
if (!empty($additionalData)
&& $this->configHelper->isDisplayField('show_subscribe_newsletter')
) {
$this->additionalDataModel->subscriber($orderId, $additionalData);
}
} else {
return $proceed($cartId, $email, $paymentMethod, $billingAddress);
}
}
public function beforeSavePaymentInformation(
\Magento\Checkout\Api\GuestPaymentInformationManagementInterface $subject,
$cartId,
$email,
\Magento\Quote\Api\Data\PaymentInterface $paymentMethod,
\Magento\Quote\Api\Data\AddressInterface $billingAddress = null
) {
if ($paymentMethod->getExtensionAttributes() !== null
&& $this->configHelper->getModuleStatus()
&& $paymentMethod->getExtensionAttributes()->getRokanthemesOpc() !== null
) {
$additionalData = $paymentMethod->getExtensionAttributes()->getRokanthemesOpc();
$quoteIdMask = $this->quoteIdMaskFactory->create()->load($cartId, 'masked_id');
$quote = $this->cartRepository->getActive($quoteIdMask->getQuoteId());
if (!empty($additionalData)) {
$this->additionalDataModel->saveDelivery($quote, $additionalData);
if (in_array($paymentMethod->getMethod(), $this->configHelper->getPaymentOnlineMethods())) {
$this->checkoutSession->create()->setRokanthemesOpcAdditionalData($additionalData);
}
}
}
}
}
<?php
namespace Rokanthemes\OnePageCheckout\Setup;
use Magento\Framework\DB\Ddl\Table;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Quote\Setup\QuoteSetupFactory;
use Magento\Sales\Setup\SalesSetupFactory;
class InstallData implements InstallDataInterface
{
/**
* @var Magento\Sales\Setup\SalesSetupFactory
*/
protected $_salesSetupFactory;
/**
* @var Magento\Quote\Setup\QuoteSetupFactory
*/
protected $_quoteSetupFactory;
/**
* @param SalesSetupFactory $salesSetupFactory
* @param QuoteSetupFactory $quoteSetupFactory
*/
public function __construct(
SalesSetupFactory $salesSetupFactory,
QuoteSetupFactory $quoteSetupFactory
) {
$this->_salesSetupFactory = $salesSetupFactory;
$this->_quoteSetupFactory = $quoteSetupFactory;
}
public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
{
$installer = $setup;
$installer->startSetup();
// @var \Magento\Sales\Setup\SalesSetup $salesInstaller
$columnExist = $installer->getConnection()->tableColumnExists(
$installer->getTable('sales_order'),
'customer_shipping_date'
);
if (!$columnExist) {
$installer->getConnection()->addColumn(
$installer->getTable('quote'),
'customer_shipping_date',
[
'type' => Table::TYPE_DATETIME,
'nullable' => true,
'comment' => 'Customer Shipping Delivery Date'
]
);
$installer->getConnection()->addColumn(
$installer->getTable('quote'),
'customer_shipping_comments',
[
'type' => Table::TYPE_TEXT,
'nullable' => true,
'comment' => 'Customer Shipping Delivery Comment'
]
);
$installer->getConnection()->addColumn(
$installer->getTable('sales_order'),
'customer_shipping_date',
[
'type' => Table::TYPE_DATETIME,
'nullable' => true,
'comment' => 'Customer Shipping Delivery Date'
]
);
$installer->getConnection()->addColumn(
$installer->getTable('sales_order'),
'customer_shipping_comments',
[
'type' => Table::TYPE_TEXT,
'nullable' => true,
'comment' => 'Customer Shipping Delivery Comment'
]
);
$installer->getConnection()->addColumn(
$installer->getTable('sales_order_grid'),
'customer_shipping_date',
[
'type' => Table::TYPE_DATETIME,
'nullable' => true,
'comment' => 'Customer Shipping Delivery Date'
]
);
}
$setup->endSetup();
}
}
{
"name": "rokanthemes/module-onepagecheckout",
"description": "",
"type": "magento2-module",
"license": "OSL-3.0",
"authors": [
],
"minimum-stability": "dev",
"require": {},
"autoload": {
"files": [
"registration.php"
],
"psr-4": {
"Rokanthemes\\OnePageCheckout\\": ""
}
}
}
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:Acl/etc/acl.xsd">
<acl>
<resources>
<resource id="Magento_Backend::admin">
<resource id="Magento_Backend::stores">
<resource id="Magento_Backend::stores_settings">
<resource id="Magento_Config::config">
<resource id="Rokanthemes_OnePageCheckout::onepagecheckout_config" title="One Page Checkout" />
</resource>
</resource>
</resource>
<resource id="Rokanthemes_RokanBase::rokanbase">
<resource id="Rokanthemes_OnePageCheckout::onepagecheckout" title="One Page Checkout" translate="title" sortOrder="20">
<resource id="Rokanthemes_OnePageCheckout::onepagecheckout_menu_config" title="Configuration" translate="title" sortOrder="10" />
<resource id="Rokanthemes_OnePageCheckout::onepagecheckout_sorting_fields" title="Sorting Fields" translate="title" sortOrder="20" />
</resource>
</resource>
</resource>
</resources>
</acl>
</config>
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="core_layout_render_element">
<observer name="rokanthemes_onepagecheckout_core_layout_render_element" instance="Rokanthemes\OnePageCheckout\Observer\Admin\CoreLayoutRenderElementObserver" />
</event>
</config>
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Backend:etc/menu.xsd">
<menu>
<add id="Rokanthemes_OnePageCheckout::onepagecheckout" title="One Page Checkout" module="Rokanthemes_OnePageCheckout" sortOrder="20" parent="Rokanthemes_RokanBase::rokanbase" resource="Rokanthemes_OnePageCheckout::onepagecheckout" />
<add id="Rokanthemes_OnePageCheckout::onepagecheckout_menu_config" title="Configuration" module="Rokanthemes_OnePageCheckout" sortOrder="10" parent="Rokanthemes_OnePageCheckout::onepagecheckout" resource="Rokanthemes_OnePageCheckout::onepagecheckout_menu_config" action="adminhtml/system_config/edit/section/onepagecheckout" />
<add id="Rokanthemes_OnePageCheckout::onepagecheckout_sorting_fields" title="Sort Address Fields" module="Rokanthemes_OnePageCheckout" sortOrder="10" parent="Rokanthemes_OnePageCheckout::onepagecheckout" resource="Rokanthemes_OnePageCheckout::onepagecheckout_sorting_fields" action="onepagecheckout/field/manage" />
</menu>
</config>
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
<router id="admin">
<route id="onepagecheckout" frontName="onepagecheckout">
<module name="Rokanthemes_OnePageCheckout" before="Magento_Backend"/>
</route>
</router>
</config>
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Config:etc/system_file.xsd">
<system>
<section id="onepagecheckout" translate="label" sortOrder="20" showInDefault="1" showInWebsite="1" showInStore="1">
<class>separator-top</class>
<label>One Page Checkout</label>
<tab>sales</tab>
<resource>Rokanthemes_OnePageCheckout::onepagecheckout_config</resource>
<group id="general" translate="label" type="text" sortOrder="10" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>General Options</label>
<field id="enabled" translate="label" type="select" sortOrder="20" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Enable Express Checkout</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
</field>
<field id="seourl" translate="label" type="text" sortOrder="30" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Seo Url</label>
<depends>
<field id="enabled">1</field>
</depends>
</field>
<field id="page_title" translate="label" type="text" sortOrder="40" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Page Title</label>
<depends>
<field id="enabled">1</field>
</depends>
</field>
<field id="short_description" translate="label" type="textarea" sortOrder="45" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Short Description</label>
<depends>
<field id="enabled">1</field>
</depends>
</field>
<field id="show_order_comment" translate="label" type="select" sortOrder="50" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Show Order Comment on Checkout</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<depends>
<field id="enabled">1</field>
</depends>
</field>
<!--field id="title_box_order_comment" translate="label" type="text" sortOrder="55" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Title Box Order Comment</label>
<depends>
<field id="enabled">1</field>
<field id="show_order_comment">1</field>
</depends>
</field-->
<field id="show_subscribe_newsletter" translate="label" type="select" sortOrder="60" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Show Checkbox Subscribe on Checkout</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<depends>
<field id="enabled">1</field>
</depends>
</field>
<field id="title_box_subscribe" translate="label" type="text" sortOrder="65" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Title Box Subscribe Newletter</label>
<depends>
<field id="enabled">1</field>
<field id="show_subscribe_newsletter">1</field>
</depends>
</field>
<field id="default_newletter_checkbox" translate="label" type="select" sortOrder="70" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Default checkbox Subscribe on Checkout</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<depends>
<field id="enabled">1</field>
<field id="show_subscribe_newsletter">1</field>
</depends>
</field>
<field id="show_discount_box" translate="label" type="select" sortOrder="80" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Show Discount Box on Checkout</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<depends>
<field id="enabled">1</field>
</depends>
</field>
<field id="show_gift_message" translate="label" type="select" sortOrder="80" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Show Gift Message on Checkout</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<depends>
<field id="enabled">1</field>
</depends>
</field>
<field id="show_widget_box" translate="label" type="select" sortOrder="90" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Show Widget After Place Order</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<depends>
<field id="enabled">1</field>
</depends>
</field>
<field id="widget_after_placeorder" translate="label" type="select" sortOrder="100" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Cms Show after Place Order</label>
<source_model>Magento\Cms\Model\Config\Source\Block</source_model>
<depends>
<field id="enabled">1</field>
<field id="show_widget_box">1</field>
</depends>
</field>
<field id="show_shipping_delivery_date" translate="label" type="select" sortOrder="100" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Show Shipping Delivery Date</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<depends>
<field id="enabled">1</field>
</depends>
</field>
<field id="title_box_shipping_delivery_date" translate="label" type="text" sortOrder="110" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Title Box Shipping Delivery Date</label>
<depends>
<field id="enabled">1</field>
<field id="show_shipping_delivery_date">1</field>
</depends>
</field>
<field id="show_shipping_delivery_comment" translate="label" type="select" sortOrder="120" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Show Shipping Delivery Comment</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<depends>
<field id="enabled">1</field>
</depends>
</field>
<field id="title_box_shipping_delivery_comment" translate="label" type="text" sortOrder="130" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Title Box Shipping Delivery Comment</label>
<depends>
<field id="enabled">1</field>
<field id="show_shipping_delivery_comment">1</field>
</depends>
</field>
<field id="show_full_layout" translate="label" type="select" sortOrder="140" showInDefault="1" showInWebsite="1"
showInStore="1">
<label>Show full Header and Footer</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<depends>
<field id="enabled">1</field>
</depends>
</field>
<field id="title_place_order" translate="label" type="text" sortOrder="150" showInDefault="1" showInWebsite="1"
showInStore="1" >
<label>Title Button Place Order</label>
<depends>
<field id="enabled">1</field>
</depends>
</field>
</group>
</section>
</system>
</config>
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Store:etc/config.xsd">
<default>
<onepagecheckout>
<general>
<enabled>1</enabled>
<seourl>expresscheckout.html</seourl>
<page_title>Express Checkout</page_title>
<show_shipping_delivery_date>1</show_shipping_delivery_date>
<show_shipping_delivery_comment>1</show_shipping_delivery_comment>
<show_order_comment>1</show_order_comment>
<show_subscribe_newsletter>1</show_subscribe_newsletter>
<show_gift_message>1</show_gift_message>
<default_newletter_checkbox>0</default_newletter_checkbox>
<show_discount_box>1</show_discount_box>
<title_box_shipping_delivery_date>Shipping Delivery Date</title_box_shipping_delivery_date>
<title_box_shipping_delivery_comment>Shipping Delivery Comment</title_box_shipping_delivery_comment>
<title_box_order_comment>Order Comment</title_box_order_comment>
<title_box_subscribe>Check To Subscribe Order Newsletter</title_box_subscribe>
<title_place_order>Place Order</title_place_order>
</general>
</onepagecheckout>
</default>
</config>
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Rokanthemes\OnePageCheckout\Api\UpdateItemManagementInterface"
type="Rokanthemes\OnePageCheckout\Model\UpdateItemManagement"/>
<preference for="Rokanthemes\OnePageCheckout\Api\GuestUpdateItemManagementInterface"
type="Rokanthemes\OnePageCheckout\Model\GuestUpdateItemManagement"/>
<preference for="Rokanthemes\OnePageCheckout\Api\Data\UpdateItemDetailsInterface"
type="Rokanthemes\OnePageCheckout\Model\UpdateItemDetails"/>
<type name="Magento\Checkout\Api\PaymentInformationManagementInterface">
<plugin name="rokanthemes_opc_additional_data" type="Rokanthemes\OnePageCheckout\Plugin\Checkout\Model\CustomerAdditionalData"/>
</type>
<type name="Magento\Checkout\Api\GuestPaymentInformationManagementInterface">
<plugin name="rokanthemes_opc_guest_additional_data"
type="Rokanthemes\OnePageCheckout\Plugin\Checkout\Model\GuestAdditionalData"/>
</type>
<virtualType name="Magento\Sales\Model\ResourceModel\Order\Grid" type="Magento\Sales\Model\ResourceModel\Grid">
<arguments>
<argument name="columns" xsi:type="array">
<item name="customer_shipping_date" xsi:type="string">sales_order.customer_shipping_date</item>
</argument>
</arguments>
</virtualType>
</config>
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="sales_model_service_quote_submit_before">
<observer name="rokanthemes_onepagecheckout_sales_model_service_quote_submit_before" instance="Rokanthemes\OnePageCheckout\Observer\SalesModelServiceQuoteSubmitBeforeObserver" shared="false" />
</event>
<event name="sales_order_place_after">
<observer name="rokanthemes_onepagecheckout_sales_order_place_after" instance="Rokanthemes\OnePageCheckout\Observer\SalesOrderPlaceAfterObserver" />
</event>
</config>
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Api/etc/extension_attributes.xsd">
<extension_attributes for="Magento\Quote\Api\Data\PaymentInterface">
<attribute code="rokanthemes_opc" type="string[]" />
</extension_attributes>
<extension_attributes for="Magento\Sales\Api\Data\OrderInterface">
<attribute code="customer_shipping_date" type="string" />
<attribute code="customer_shipping_comments" type="string" />
</extension_attributes>
<extension_attributes for="Magento\Sales\Api\Data\InvoiceInterface">
<attribute code="customer_shipping_date" type="string" />
<attribute code="customer_shipping_comments" type="string" />
</extension_attributes>
<extension_attributes for="Magento\Sales\Api\Data\ShipmentInterface">
<attribute code="customer_shipping_date" type="string" />
<attribute code="customer_shipping_comments" type="string" />
</extension_attributes>
<extension_attributes for="Magento\Sales\Api\Data\CreditmemoInterface">
<attribute code="customer_shipping_date" type="string" />
<attribute code="customer_shipping_comments" type="string" />
</extension_attributes>
</config>
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="\Magento\Checkout\Block\Checkout\LayoutProcessor">
<plugin name="onepagecheckout_checkout_layout_processor" type="Rokanthemes\OnePageCheckout\Plugin\Checkout\Block\Checkout\LayoutProcessor" />
</type>
<type name="\Magento\Checkout\Helper\Data">
<plugin name="onepagecheckout_checkout_helper_data" type="Rokanthemes\OnePageCheckout\Plugin\Checkout\Helper\Data" />
</type>
<type name="Magento\Checkout\Model\CompositeConfigProvider">
<arguments>
<argument name="configProviders" xsi:type="array">
<item name="onepagecheckout_checkout_composite_config" xsi:type="object">Rokanthemes\OnePageCheckout\Model\CompositeConfigProvider</item>
</argument>
</arguments>
</type>
<type name="Magento\Framework\App\RouterList">
<arguments>
<argument name="routerList" xsi:type="array">
<item name="onepagecheckout" xsi:type="array">
<item name="class" xsi:type="string">Rokanthemes\OnePageCheckout\Controller\Router</item>
<item name="disable" xsi:type="boolean">false</item>
<item name="sortOrder" xsi:type="string">90</item>
</item>
</argument>
</arguments>
</type>
<type name="Magento\Checkout\Controller\Index\Index">
<plugin name="onepagecheckout_checkout_redirect_link"
type="Rokanthemes\OnePageCheckout\Plugin\Checkout\Controller\Index\Index" />
</type>
</config>
<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
<router id="standard">
<route frontName="onepagecheckout" id="onepagecheckout">
<module name="Rokanthemes_OnePageCheckout"/>
</route>
</router>
</config>
<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Rokanthemes_OnePageCheckout" setup_version="1.0.0" />
</config>
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd">
<route url="/V1/rokanthemes-opc/carts/mine/update-item-qty" method="POST">
<service class="Rokanthemes\OnePageCheckout\Api\UpdateItemManagementInterface" method="update"/>
<resources>
<resource ref="self"/>
</resources>
<data>
<parameter name="cartId" force="true">%cart_id%</parameter>
</data>
</route>
<route url="/V1/rokanthemes-opc/guest-carts/:cartId/update-item-qty" method="POST">
<service class="Rokanthemes\OnePageCheckout\Api\GuestUpdateItemManagementInterface" method="update"/>
<resources>
<resource ref="anonymous"/>
</resources>
</route>
</routes>
<?php
use Magento\Framework\Component\ComponentRegistrar;
ComponentRegistrar::register(ComponentRegistrar::MODULE, 'Rokanthemes_OnePageCheckout', __DIR__);
<?xml version="1.0" encoding="UTF-8"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="admin-1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<head>
<css src="Rokanthemes_OnePageCheckout::css/style.css"/>
<css src="Rokanthemes_OnePageCheckout::css/jquery-ui.min.css"/>
</head>
<body>
<referenceContainer name="content">
<block class="Rokanthemes\OnePageCheckout\Block\Adminhtml\Field\Tabs" name="admin.field.tabs" template="Rokanthemes_OnePageCheckout::field/tabs.phtml">
<block class="Rokanthemes\OnePageCheckout\Block\Adminhtml\Field\Address" name="admin.field.address"/>
</block>
</referenceContainer>
</body>
</page>
<div class="customer_shipping_delivery" style="display:none;">
<?php
$date = $block->getCustomerShippingDate();
if ($date && $date != '0000-00-00 00:00:00') :
?>
<div id="shipping-delivery-date">
<br />
<strong><?= $block->escapeHtml(__('Customer Delivery Date:')) ?></strong>
<span><?= $block->formatDate($date, \IntlDateFormatter::MEDIUM); ?></span>
</div>
<?php endif; ?>
<?php if ($comment = $block->getCustomerShippingComments()) : ?>
<div id="shipping-delivery-comment">
<br />
<strong><?= $block->escapeHtml(__('Customer Delivery Comment:')) ?></strong>
<span><?php echo $comment; ?></span>
</div>
<?php endif; ?>
</div>
<?php if ($block->getActiveJs()) : ?>
<script type="text/x-magento-init">
{
"body": {
"Rokanthemes_OnePageCheckout/js/shippingdelivery": {}
}
}
</script>
<?php endif; ?>
<?php
/** @var \Rokanthemes\OnePageCheckout\Block\Adminhtml\Field\AbstractField $block */
?>
<div id="<?= $block->escapeQuote($block->getBlockId()) ?>" class="admin-field-container">
<?php if ($block->isVisible() && $block->hasFields()) : ?>
<div class="containment row">
<div class="field-wrapper available-wrapper col-m-4">
<div><?= __('Area Removed'); ?></div>
<ul class="sortable-list ui-sortable">
<?php foreach ($block->getAvailableFields() as $field) : ?>
<li class="sortable-item" id="<?= $block->escapeQuote($field->getId()) ?>"
data-code="<?= $block->escapeQuote($field->getAttributeCode()) ?>">
<div class="attribute-label">
<span><?= $block->escapeHtml($field->getFrontendLabel()) ?></span>
<div class="attribute-required">
<input type="checkbox" title="<?= $block->escapeQuote(__('Is Required?')) ?>"
<?php if ($field->getIsRequired()) {
echo ' checked';
} ?>>
</div>
</div>
</li>
<?php endforeach; ?>
</ul>
</div>
<div class="field-wrapper sorted-wrapper col-m-8">
<div><?= __('Area Sorting'); ?></div>
<ul class="sortable-list ui-sortable">
<?php foreach ($block->getSortedFields() as $field) : ?>
<li class="sortable-item <?= $block->escapeQuote($field->getColStyle()) ?>"
id="<?= $block->escapeQuote($field->getId()) ?>"
data-code="<?= $block->escapeQuote($field->getAttributeCode()) ?>">
<div class="attribute-label">
<span><?= $block->escapeHtml($field->getFrontendLabel()) ?></span>
<?php if ($field->getId()) : ?>
<div class="attribute-required">
<input type="checkbox" title="<?= $block->escapeQuote(__('Is Required?')) ?>"
<?php if ($field->getIsRequiredMp()) {
echo ' checked';
} ?>>
</div>
<?php endif; ?>
</div>
</li>
<?php endforeach; ?>
</ul>
</div>
</div>
<script type="text/x-magento-init">
{
"*": {
"Rokanthemes_OnePageCheckout/js/field-position": {
"blockId": "<?= /** @noEscape */ $block->getBlockId() ?>"
}
}
}
</script>
<?php else : ?>
<div class="messages">
<div class="message message-info info">
<span><?= /** @noEscape */ $block->getNoticeMessage() ?></span>
</div>
</div>
<?php endif; ?>
</div>
<div id="position-save-messages" class="messages"></div>
<div id="admin-field-tabs" class="row">
<a class="button action-default col-m-12" href="#address-information">
<i class="fa fa-home"></i>
<span><?= $block->escapeHtml(__('Address Information')) ?></span>
</a>
</div>
<div id="field-position-sortable">
<?= $block->getChildHtml() ?>
</div>
<script type="text/x-magento-init">
{
"*": {
"Rokanthemes_OnePageCheckout/js/field-tabs": {
"url": "<?= $block->escapeUrl($block->getAjaxUrl()) ?>"
}
}
}
</script>
/*! jQuery UI - v1.11.1 - 2014-09-25
* http://jqueryui.com
* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;min-height:0;font-size:100%}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:none}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{position:relative;margin:0;padding:3px 1em 3px .4em;cursor:pointer;min-height:0;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-button{display:inline-block;overflow:hidden;position:relative;text-decoration:none;cursor:pointer}.ui-selectmenu-button span.ui-icon{right:0.5em;left:auto;margin-top:-8px;position:absolute;top:50%}.ui-selectmenu-button span.ui-selectmenu-text{text-align:left;padding:0.4em 2.1em 0.4em 1em;display:block;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#eee url("images/ui-bg_highlight-soft_100_eeeeee_1x100.png") 50% top repeat-x;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #e78f08;background:#f6a828 url("images/ui-bg_gloss-wave_35_f6a828_500x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #ccc;background:#f6f6f6 url("images/ui-bg_glass_100_f6f6f6_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#1c94c4}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#1c94c4;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #fbcb09;background:#fdf5ce url("images/ui-bg_glass_100_fdf5ce_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#c77405}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#c77405;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #fbd850;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#eb8f00}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#eb8f00;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fed22f;background:#ffe45c url("images/ui-bg_highlight-soft_75_ffe45c_1x100.png") 50% top repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#b81900 url("images/ui-bg_diagonals-thick_18_b81900_40x40.png") 50% 50% repeat;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_228ef1_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_ffd27a_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat;opacity:.5;filter:Alpha(Opacity=50)}.ui-widget-shadow{margin:-5px 0 0 -5px;padding:5px;background:#000 url("images/ui-bg_flat_10_000000_40x100.png") 50% 50% repeat-x;opacity:.2;filter:Alpha(Opacity=20);border-radius:5px}
\ No newline at end of file
#field-position-sortable .suggest-position {
background: #cccccc;
height: 4rem;
float: left;
}
/* ------------------------------------------------------------------- */
/* General */
.field-wrapper.sorted-wrapper {
background-color: #fafafa;
border-left: none;
}
.field-wrapper.available-wrapper {
background-color: #e3e3e3;
border-right: none;
}
.field-wrapper {
display: table-cell;
vertical-align: top;
float: unset;
border: 1px solid #adadad;
border-top: none;
}
.field-wrapper ul {
width: 100%;
min-height: 450px;
padding-top: 5px;
list-style-type: none;
}
.field-wrapper ul li {
width: 48%;
margin: 1%;
}
.field-wrapper ul li.wide {
width: 98%;
}
.field-wrapper ul li.medium {
width: 72%;
}
.field-wrapper ul li.short {
width: 23%;
}
.field-wrapper.available-wrapper ul li {
width: 96%;
margin: 2%;
}
.field-wrapper ul li .attribute-label {
border: 1px solid #cccccc;
text-align: center;
padding: 10px 10px;
cursor: move;
background: #ffffff;
height: 20px !important;
box-sizing: content-box;
}
.field-wrapper ul li.ui-state-disabled {
opacity: 1;
}
.field-wrapper ul li.ui-state-disabled .attribute-label {
background-color: #514943;
border-color: #514943;
color: #ffffff;
}
.available-wrapper .ui-resizable-handle {
display: none !important;
}
#field-position-sortable .ui-resizable-s {
display: none !important;
}
/* Containment area */
.ui-resizable-border {
border: 1px dotted #cccccc;
}
#admin-field-tabs a {
padding: 5px;
font-size: 2rem;
line-height: 1.5;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
#admin-field-tabs a._active {
background-color: #1979c3;
border-color: #1979c3;
color: #ffffff;
}
#field-position-sortable .attribute-required {
position: absolute;
top: 3px;
right: 3px;
}
.available-wrapper .attribute-required, .admin-field-container {
display: none;
}
.admin-field-container .containment.row {
display: flex;
}
.f-left {
float: left;
}
#field-position-sortable > .admin-field-container > .messages {
margin-top: 3rem;
}
#field-position-sortable > .admin-field-container > .messages > .message:last-child {
margin: 0;
}
define(['jquery', 'jquery/ui'], function ($) {
'use strict';
$.widget('admin.field_position', {
_create: function () {
this.initGrid();
},
initGrid: function () {
var selector = '#' + this.options.blockId + ' ',
list = $(selector + '.sortable-list'),
field, elemWidth;
var options = {
tolerance: 'pointer',
connectWith: '.sortable-list',
dropOnEmpty: true,
containment: 'body',
cancel: '.ui-state-disabled',
placeholder: 'suggest-position',
zIndex: 10,
scroll: false,
start: function (e, hash) {
if (hash.item.hasClass('wide')) {
hash.placeholder.addClass('wide');
}
if (hash.item.hasClass('medium')) {
hash.placeholder.addClass('medium');
}
if (hash.item.hasClass('short')) {
hash.placeholder.addClass('short');
}
}
};
if (this.options.blockId === 'admin-order-summary') {
options.items = 'li:not(.ui-state-disabled)';
}
list.sortable(options);
$(selector + '.sortable-list li').disableSelection();
$(selector + '.sortable-list li').addClass('f-left');
$(selector + '.containment ul li .attribute-label').resizable({
maxHeight: 40,
minHeight: 40,
zIndex: 10,
cancel: '.ui-state-disabled',
helper: 'ui-resizable-border',
stop: function (e, ui) {
field = ui.element.parent();
elemWidth = ui.element.width() / 2;
field.removeClass('wide');
field.removeClass('medium');
field.removeClass('short');
if (elemWidth < field.width() * 0.3) {
field.addClass('short');
} else if (elemWidth > field.width() * 0.6 && elemWidth < field.width() * 0.8) {
field.addClass('medium');
} else if (elemWidth > field.width() * 0.8) {
field.addClass('wide');
}
ui.element.css({width: ''});
}
});
}
});
return $.admin.field_position;
});
define(['jquery'], function ($) {
'use strict';
$.widget('admin.field_tabs', {
_create: function () {
this.initTabEvent();
this.initSaveEvent();
},
initTabEvent: function () {
var elem = $('#admin-field-tabs .action-default');
$('.admin-field-container').show();
elem.on('click', function () {
elem.removeClass('_active');
$(this).addClass('_active');
return false;
});
},
initSaveEvent: function () {
var self = this;
$('.admin-save-position').on('click', function () {
self.savePosition(self.options.url);
});
},
savePosition: function (url) {
var self = this,
fields = [],
oaFields = [],
field = {},
parent = null;
$('#position-save-messages').html('');
$('.sorted-wrapper .sortable-item').each(function (index, el) {
parent = $(el).parents('.admin-field-container');
field = {
code: $(el).attr('data-code'),
colspan: self.getColspan($(el)),
required: !!$(el).find('.attribute-required input').is(':checked')
};
if ($(el).parents('#admin-address-information').length) {
fields.push(field);
}
});
$.ajax({
method: 'post',
showLoader: true,
url: url,
data: {
fields: JSON.stringify(fields)
},
success: function (response) {
$('#position-save-messages').html(
'<div class="message message-' + response.type + ' ' + response.type + ' ">' +
'<span>' + response.message + '</span>' +
'</div>'
);
}
});
},
getColspan: function (elem) {
if (elem.hasClass('wide')) {
return 12;
} else if (elem.hasClass('medium')) {
return 9;
} else if (elem.hasClass('short')) {
return 3;
}
return 6;
}
});
return $.admin.field_tabs;
});
define([
'jquery'
], function ($) {
'use strict';
if ($('#shipping-delivery-date').length) {
var date = $('#shipping-delivery-date').detach();
$('.order-shipping-method').append(date);
}
if ($('#shipping-delivery-comment').length) {
var comment = $('#shipping-delivery-comment').detach();
$('.order-shipping-method').append(comment);
}
});
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<update handle="checkout_index_index"/>
<body>
<attribute name="class" value="rokanthemes-onepagecheckout"/>
<attribute name="class" value="checkout-index-index"/>
<referenceBlock name="page.main.title">
<block class="Rokanthemes\OnePageCheckout\Block\Config" name="short.description" template="Rokanthemes_OnePageCheckout::short_description.phtml"/>
</referenceBlock>
<referenceBlock name="checkout.root">
<arguments>
<argument name="jsLayout" xsi:type="array">
<item name="components" xsi:type="array">
<item name="checkout" xsi:type="array">
<item name="component" xsi:type="string">Rokanthemes_OnePageCheckout/js/view/onepage</item>
<item name="children" xsi:type="array">
<item name="steps" xsi:type="array">
<item name="children" xsi:type="array">
<item name="shipping-step" xsi:type="array">
<item name="children" xsi:type="array">
<item name="shippingAddress" xsi:type="array">
<item name="component" xsi:type="string">Rokanthemes_OnePageCheckout/js/view/shipping</item>
<item name="children" xsi:type="array">
<item name="customer-email" xsi:type="array">
<item name="component" xsi:type="string">Rokanthemes_OnePageCheckout/js/view/form/element/email</item>
</item>
<item name="address-list" xsi:type="array">
<item name="component" xsi:type="string">Rokanthemes_OnePageCheckout/js/view/shipping-address/list</item>
</item>
<item name="before-shipping-method-form" xsi:type="array">
<item name="children" xsi:type="array">
<!-- address-list-additional-addresses -->
<item name="rokanthemes_opc_shipping_delivery_date" xsi:type="array">
<item name="label" xsi:type="string" translate="true">Shipping Delivery Date</item>
<item name="component" xsi:type="string">Rokanthemes_OnePageCheckout/js/view/form/element/date</item>
<item name="dataScope" xsi:type="string">before-shipping-method-form.rokanthemes_opc_shipping_delivery_date</item>
<item name="config" xsi:type="array">
<item name="template" xsi:type="string">ui/form/field</item>
<item name="options" xsi:type="array">
<item name="timeFormat" xsi:type="string">HH:mm</item>
<item name="showsTime" xsi:type="string">true</item>
</item>
</item>
</item>
<item name="rokanthemes_opc_shipping_delivery_comment" xsi:type="array">
<item name="label" xsi:type="string" translate="true">Shipping Delivery Comment</item>
<item name="component" xsi:type="string">Magento_Ui/js/form/element/textarea</item>
<item name="dataScope" xsi:type="string">before-shipping-method-form.rokanthemes_opc_shipping_delivery_comment</item>
<item name="config" xsi:type="array">
<item name="template" xsi:type="string">ui/form/field</item>
<item name="elementTmpl" xsi:type="string">ui/form/element/textarea</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
<item name="billing-step" xsi:type="array">
<item name="children" xsi:type="array">
<item name="payment" xsi:type="array">
<item name="component" xsi:type="string">Rokanthemes_OnePageCheckout/js/view/payment</item>
<item name="template" xsi:type="string">Rokanthemes_OnePageCheckout/payment</item>
<item name="children" xsi:type="array">
<item name="customer-email" xsi:type="array">
<item name="component" xsi:type="string">Rokanthemes_OnePageCheckout/js/view/form/element/email</item>
</item>
<item name="payments-list" xsi:type="array">
<item name="component" xsi:type="string">Rokanthemes_OnePageCheckout/js/view/payment/list</item>
<item name="template" xsi:type="string">Rokanthemes_OnePageCheckout/payment-methods/list</item>
</item>
<item name="additional-payment-validators" xsi:type="array">
<item name="children" xsi:type="array">
<item name="agreements-validator" xsi:type="array">
<item name="component" xsi:type="string">Rokanthemes_OnePageCheckout/js/view/agreement-validation</item>
</item>
<item name="create-new-account-validator" xsi:type="array">
<item name="component" xsi:type="string">Rokanthemes_OnePageCheckout/js/view/create-new-account-validation</item>
</item>
</item>
</item>
<item name="afterMethods" xsi:type="array">
<item name="children" xsi:type="array">
<item name="discount" xsi:type="array">
<item name="component" xsi:type="string">Rokanthemes_OnePageCheckout/js/view/payment/discount</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
<item name="sidebar" xsi:type="array">
<item name="config" xsi:type="array">
<item name="template" xsi:type="string">Rokanthemes_OnePageCheckout/sidebar</item>
</item>
<item name="children" xsi:type="array">
<item name="summary" xsi:type="array">
<item name="children" xsi:type="array">
<item name="cart_items" xsi:type="array">
<item name="displayArea" xsi:type="string">summary</item>
<item name="sortOrder" xsi:type="string">0</item>
<item name="children" xsi:type="array">
<item name="details" xsi:type="array">
<item name="component" xsi:type="string">Rokanthemes_OnePageCheckout/js/view/summary/item/details</item>
</item>
</item>
</item>
</item>
</item>
<item name="rokanthemes_opc_order_comment" xsi:type="array">
<item name="component" xsi:type="string">Magento_Ui/js/form/element/textarea</item>
<item name="label" xsi:type="string" translate="true">Order Comment</item>
<item name="displayArea" xsi:type="string">summary</item>
<item name="sortOrder" xsi:type="string">220</item>
<item name="config" xsi:type="array">
<item name="template" xsi:type="string">Rokanthemes_OnePageCheckout/form/order-comment</item>
</item>
</item>
<item name="subscribe" xsi:type="array">
<item name="component" xsi:type="string">Magento_Ui/js/form/element/boolean</item>
<item name="displayArea" xsi:type="string">summary</item>
<item name="sortOrder" xsi:type="string">230</item>
<item name="config" xsi:type="array">
<item name="template" xsi:type="string">ui/form/element/checkbox</item>
<item name="checked" xsi:type="boolean">false</item>
<item name="description" xsi:type="string" translate="true">Check to Subscribe Our Newsletter</item>
<item name="dataType" xsi:type="string">boolean</item>
<item name="formElement" xsi:type="string">checkbox</item>
</item>
</item>
<item name="giftmessage" xsi:type="array">
<item name="component" xsi:type="string">uiComponent</item>
<item name="sortOrder" xsi:type="string">240</item>
<item name="displayArea" xsi:type="string">summary</item>
<item name="children" xsi:type="array">
<item name="giftOptionsCart" xsi:type="array">
<item name="component" xsi:type="string">Rokanthemes_OnePageCheckout/js/view/gift-message</item>
<item name="config" xsi:type="array">
<item name="template" xsi:type="string">Rokanthemes_OnePageCheckout/gift-message</item>
<item name="formTemplate" xsi:type="string">Magento_GiftMessage/gift-message-form</item>
</item>
</item>
</item>
</item>
<item name="agreements" xsi:type="array">
<item name="component" xsi:type="string">Magento_CheckoutAgreements/js/view/checkout-agreements</item>
<item name="template" xsi:type="string">Rokanthemes_OnePageCheckout/checkout/checkout-agreements</item>
<item name="sortOrder" xsi:type="string">260</item>
<item name="displayArea" xsi:type="string">summary</item>
<item name="dataScope" xsi:type="string">checkoutAgreements</item>
<item name="provider" xsi:type="string">checkoutProvider</item>
</item>
<item name="place-order-btn" xsi:type="array">
<item name="component" xsi:type="string">Rokanthemes_OnePageCheckout/js/view/place-order-btn</item>
<item name="displayArea" xsi:type="string">summary</item>
<item name="sortOrder" xsi:type="string">270</item>
</item>
<item name="opc_widget_under_button" xsi:type="array">
<item name="component" xsi:type="string">Rokanthemes_OnePageCheckout/js/view/opc-widget</item>
<item name="config" xsi:type="array">
<item name="template" xsi:type="string">Rokanthemes_OnePageCheckout/widget/opc-widget-button</item>
</item>
<item name="sortOrder" xsi:type="string">280</item>
<item name="displayArea" xsi:type="string">summary</item>
</item>
</item>
</item>
<item name="autocomplete" xsi:type="array">
<item name="sortOrder" xsi:type="string">250</item>
<item name="component" xsi:type="string">Rokanthemes_OnePageCheckout/js/model/autocomplete</item>
</item>
</item>
</item>
</item>
</argument>
</arguments>
</referenceBlock>
</body>
</page>
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceContainer name="sidebar.additional" remove="true"/>
<referenceBlock name="top.search" remove="true"/>
<referenceBlock name="minicart" remove="true"/>
<referenceContainer name="footer-container" remove="true"/>
<referenceBlock name="header.panel.wrapper" remove="true"/>
</body>
</page>
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<attribute name="class" value="rokanthemes-onepagecheckout-full"/>
<attribute name="class" value="checkout-index-index"/>
</body>
</page>
var config = {
map: {
'*': {
'Magento_Checkout/template/billing-address/form.html':
'Rokanthemes_OnePageCheckout/template/billing-address/form.html',
'Magento_Checkout/js/model/shipping-rate-service':
'Rokanthemes_OnePageCheckout/js/model/shipping-rate-service',
'Magento_Checkout/js/action/get-payment-information':
'Rokanthemes_OnePageCheckout/js/action/get-payment-information'
}
},
config: {
mixins: {
'Magento_Checkout/js/action/place-order': {
'Rokanthemes_OnePageCheckout/js/model/place-order-mixin': true,
'Magento_CheckoutAgreements/js/model/place-order-mixin': false
},
'Magento_Checkout/js/model/step-navigator': {
'Rokanthemes_OnePageCheckout/js/model/step-navigator-mixin': true
},
'Magento_Checkout/js/action/set-payment-information': {
'Magento_CheckoutAgreements/js/model/set-payment-information-mixin': false,
'Rokanthemes_OnePageCheckout/js/model/set-payment-information-mixin': true
},
'Magento_Checkout/js/model/shipping-rates-validation-rules': {
'Rokanthemes_OnePageCheckout/js/model/shipping-rates-validation-rules-mixin': true
},
'Magento_Paypal/js/in-context/express-checkout-wrapper': {
'Rokanthemes_OnePageCheckout/js/paypal/in-context/express-checkout-wrapper-mixin': true
},
'Magento_Paypal/js/view/payment/method-renderer/in-context/checkout-express': {
'Rokanthemes_OnePageCheckout/js/paypal/view/payment/method-renderer/in-context/checkout-express-mixin': true
},
'Amazon_Payment/js/view/payment/list': {
'Rokanthemes_OnePageCheckout/js/amazon-pay/view/payment-list': true
},
'Amazon_Payment/js/view/checkout-revert': {
'Rokanthemes_OnePageCheckout/js/amazon-pay/view/checkout-revert-rewrite': true
}
}
}
};
<?php
/**
* @var $block \Rokanthemes\OnePageCheckout\Block\Config
*/
?>
<div class="short-description">
<?= $block->getShortDescription() ?>
</div>
// @screen__xxs: 320px;
// @screen__xs: 480px;
// @screen__s: 640px;
// @screen__m: 768px;
// @screen__l: 1024px;
// @screen__xl: 1440px;
@onepagecheckout_1_column: 100%;
@onepagecheckout_2_columns: 48%;
@onepagecheckout_3_columns: 33%;
@_column_box_shadow_hover: 0px 0px 10px 10px rgba(68,68,68,0.6);
@_radius_radio: 50%;
@_bgr_default: #19cba2;
@_color_default: #eceff1;
.checkout-step() {
box-sizing: border-box;
transition: all .2s ease-in-out;
padding: 15px;
width: @onepagecheckout_2_columns;
border: 1px solid @border-color__base;
}
.onepage-click-wave-0 () {
width: 15px;
height: 15px;
opacity: 0.35;
position: relative;
}
.onepage-click-wave-100 () {
width: 250px;
height: 250px;
margin-left: -120px;
margin-top: -120px;
opacity: 0.0;
}
.onepage-title-before () {
background-color: @_bgr_default;
display: inline-block;
width: 35px;
height: 35px;
border-radius: @_radius_radio;
vertical-align: middle;
text-align: center;
line-height: 35px;
color: @_color_default;
font-size: 15px;
font-weight: 700;
margin-right: 10px;
}
//
// Common
// _____________________________________________
& when (@media-common = true) {
@-webkit-keyframes onepage-click-wave {
0% {.onepage-click-wave-0}
100% {.onepage-click-wave-100}
}
@-moz-keyframes onepage-click-wave {
0% {.onepage-click-wave-0}
100% {.onepage-click-wave-100}
}
@-o-keyframes onepage-click-wave {
0% {.onepage-click-wave-0}
100% {.onepage-click-wave-100}
}
@keyframes onepage-click-wave {
0% {.onepage-click-wave-0}
100% {.onepage-click-wave-100}
}
.rokanthemes-onepagecheckout-full.checkout-index-index{
.nav-sections{
display: block;
}
.nav-toggle
{
display: block;
}
}
.rokanthemes-onepagecheckout {
.step-title {
&:before {
.onepage-title-before;
}
}
#shipping,
#opc-shipping_method,
#payment{
.checkout-step;
.fieldset > .field{
margin: 5px 0 5px;
}
.label,
.fieldset > .field:not(.choice) > .label {
margin: 0 0 8px;
display: block;
width: auto;
}
.fieldset > .field:not(.choice) > .control {
width: 100%;
}
}
#shipping-new-address-form{
.street{
.additional{
.label{
position: static;
width: auto;
height: auto;
}
}
}
}
#shipping{
.form-login{
margin-bottom: 0;
.create-account{
input[type="checkbox"]{
vertical-align: middle;
}
}
}
.form-shipping-address{
margin-top: 0;
}
}
.opc-wrapper {
width: @onepagecheckout_1_column;
padding-right: 0;
#shipping {
float: left;
#checkout-step-shipping {
.shipping-address-item {
width: @onepagecheckout_1_column;
&::before {
width: 0;
}
&:hover {
border-color: #ff5501;
background-color: #f5f5f5;
}
}
.not-selected-item {
cursor: pointer;
}
}
}
#opc-shipping_method {
float: right;
margin-left: 4%;
div[name$=".rokanthemes_opc_shipping_delivery_date"] {
margin: 28px 0 20px;
.label {
margin: 0 0 8px;
display: inline-block;
}
}
div[name$=".rokanthemes_opc_shipping_delivery_comment"] {
margin-bottom: 20px;
.label {
margin: 0 0 8px;
display: inline-block;
}
}
#checkout-step-shipping_method {
margin-bottom: 0;
#checkout-shipping-method-load {
.table-checkout-shipping-method {
width: @onepagecheckout_1_column;
min-width: 290px;
}
}
#shipping-method-buttons-container {
display: none;
}
}
}
#payment {
float: right;
margin-top: 25px;
input[type="radio"] {
position: relative;
top: 3px;
}
#co-payment-form {
.step-title {
border-bottom: 1px solid #cccccc;
}
.onepage-delivery {
margin-top: 20px;
}
}
#checkout-payment-method-load {
.payment-methods {
margin: auto;
.payment-group {
&:not(:first-child) {
.step-title {
font-size: 18px;
font-weight: unset;
}
}
.checkout-billing-address {
margin-top: 30px;
.actions-toolbar {
margin-top: 30px;
}
}
.payment-method {
.payment-method-title {
padding: 15px 0;
}
.payment-method-content {
padding: 0;
.action.primary, .box-tocart .action.instant-purchase, .multicheckout .action.primary {
display: none;
}
.actions-toolbar {
margin-bottom: 5px;
}
}
}
}
}
}
}
.payment-virtual {
margin-top: 0 !important;
width: 100% !important;
#checkout-payment-method-load {
.payment-methods {
}
}
}
}
#opc-sidebar {
float: right;
width: @onepagecheckout_1_column;
margin-top: 30px;
.label {
margin: 0 0 8px;
display: inline-block;
}
> .field {
margin: 10px 0;
}
.items-in-cart{
margin-bottom: 20px;
}
.minicart-items{
.product-item{
.product.options{
.toggle{
margin-bottom: 5px;
}
}
.item-options{
.label{
margin-right: 5px;
margin-bottom: 0;
}
}
}
}
.opc-block-summary {
.product-item-details {
input.qty {
max-width: 45px;
text-align: center;
}
}
}
.discount-code {
margin: 15px 0;
#discount-form {
width: 60%;
margin: auto;
&:after,
&:before{
content: '';
display: table;
clear: both;
}
.payment-option-inner {
width: 58%;
display: inline-block;
flex: 1;
}
.actions-toolbar {
float: right;
margin-left: 10px;
.action {
margin: 0;
}
}
}
}
.actions-toolbar {
> .primary {
width: @onepagecheckout_1_column;
> .btn-placeorder {
margin: 0;
border-radius: 2px;
font-weight: 500;
font-size: 16px;
width: @onepagecheckout_1_column;
}
}
}
.footer.links{
margin-top: 10px;
padding-left: 0;
list-style: none;
}
}
.ui_tpicker_hour_slider, .ui_tpicker_minute_slider {
width: 100%!important;
}
span {
&.qty-button {
display: inline-block;
text-align: center;
vertical-align: middle;
}
&.increase, &.decrease{
position: relative;
display: block;
width: 14px;
height: 14px;
cursor: pointer;
&:before {
content: "";
width: 0;
height: 0;
position: absolute;
border: 7px solid transparent;
}
}
&.increase {
margin-bottom: 4px;
&:before {
border-bottom: 7px solid #000;
}
}
&.decrease {
margin-top: 4px;
&:before {
border-top: 7px solid #000;
}
}
}
#paypay-in-context-button {
&.disable {
opacity: 0.4;
cursor: default;
pointer-events: none;
}
}
.page-wrapper{
.page-title-wrapper{
position: relative;
width: 100%;
height: auto;
margin-bottom: @indent__base;
}
}
}
}
//
// Mobile
//
.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__s) {
.rokanthemes-onepagecheckout {
.opc-wrapper {
#shipping {
width: @onepagecheckout_1_column;
}
#opc-shipping_method {
overflow-x: auto;
overflow-y: hidden;
width: @onepagecheckout_1_column;
margin-top: 25px;
#checkout-step-shipping_method {
#checkout-shipping-method-load {
.table-checkout-shipping-method {
min-width: unset;
}
}
}
}
#payment {
overflow-x: auto;
overflow-y: hidden;
width: @onepagecheckout_1_column;
#checkout-payment-method-load {
.step-title {
border: 0;
}
.checkout-billing-address {
.billing-address-same-as-shipping-block {
margin: 0;
}
}
}
}
}
#opc-sidebar {
.discount-code {
#discount-form {
width: @onepagecheckout_1_column;
.payment-option-inner{
width: 100%;
}
.actions-toolbar{
float: none;
margin-left: 0;
margin-top: 10px;
}
}
}
}
.create-account {
margin-bottom: 0;
.pass {
float: left;
width: 48%;
margin-right: 4%;
margin-bottom: 0;
}
.confirm-pass {
float: left;
width: 48%;
}
}
}
}
.media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__xs) {
.rokanthemes-onepagecheckout {
.create-account {
.pass {
float: none;
width: 100%;
margin-bottom: 20px;
}
.confirm-pass {
float: none;
width: 100%;
}
}
}
}
//
// Desktop
// _____________________________________________
.media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__l) {
.rokanthemes-onepagecheckout {
.opc-wrapper {
width: 66.66%;
padding-right: 30px;
}
#opc-sidebar {
width: @onepagecheckout_3_columns;
margin-top: 0;
.discount-code {
#discount-form {
width: @onepagecheckout_1_column;
display: -webkit-box; /* OLD - iOS 6-, Safari 3.1-6 */
display: -moz-box; /* OLD - Firefox 19- (buggy but mostly works) */
display: -ms-flexbox; /* TWEENER - IE 10 */
display: -webkit-flex; /* NEW - Chrome */
display: flex;
}
}
}
}
}
define([
'jquery',
'Magento_Checkout/js/model/quote',
'Magento_Checkout/js/model/url-builder',
'mage/storage',
'Magento_Checkout/js/model/error-processor',
'Magento_Customer/js/model/customer',
'Magento_Checkout/js/model/payment/method-converter',
'Magento_Checkout/js/model/payment-service'
], function ($, quote, urlBuilder, storage, errorProcessor, customer, methodConverter, paymentService) {
'use strict';
return function (deferred, messageContainer) {
var serviceUrl;
deferred = deferred || $.Deferred();
/**
* Checkout for guest and registered customer.
*/
if (!customer.isLoggedIn()) {
serviceUrl = urlBuilder.createUrl('/guest-carts/:cartId/payment-information', {
cartId: quote.getQuoteId()
});
} else {
serviceUrl = urlBuilder.createUrl('/carts/mine/payment-information', {});
}
if (!window.isPlaceOrderDispatched) {
window.isPlaceOrderDispatched = false;
return storage.get(
serviceUrl, false
).done(function (response) {
quote.setTotals(response.totals);
paymentService.setPaymentMethods(methodConverter(response['payment_methods']));
deferred.resolve();
}).fail(function (response) {
errorProcessor.process(response, messageContainer);
deferred.reject();
});
}
};
});
define([
'Rokanthemes_OnePageCheckout/js/model/url-builder',
'mage/storage',
'Magento_Ui/js/model/messageList',
'Magento_Checkout/js/model/error-processor',
'mage/url',
'Magento_Checkout/js/model/quote',
'underscore'
], function (urlBuilder, storage, messageList, errorProcessor, url, quote, _) {
'use strict';
return function (giftMessage, remove) {
var serviceUrl;
url.setBaseUrl(giftMessage.getConfigValue('baseUrl'));
if (giftMessage.getConfigValue('isCustomerLoggedIn')) {
serviceUrl = urlBuilder.createUrl('/carts/mine/gift-message', {});
if (giftMessage.itemId != 'orderLevel') { //eslint-disable-line eqeqeq
serviceUrl = urlBuilder.createUrl('/carts/mine/gift-message/:itemId', {
itemId: giftMessage.itemId
});
}
} else {
serviceUrl = urlBuilder.createUrl('/guest-carts/:cartId/gift-message', {
cartId: quote.getQuoteId()
});
if (giftMessage.itemId != 'orderLevel') { //eslint-disable-line eqeqeq
serviceUrl = urlBuilder.createUrl(
'/guest-carts/:cartId/gift-message/:itemId',
{
cartId: quote.getQuoteId(), itemId: giftMessage.itemId
}
);
}
}
messageList.clear();
storage.post(
serviceUrl,
JSON.stringify({
'gift_message': giftMessage.getSubmitParams(remove)
})
).done(function () {
giftMessage.reset();
_.each(giftMessage.getAfterSubmitCallbacks(), function (callback) {
if (_.isFunction(callback)) {
callback();
}
});
}).fail(function (response) {
errorProcessor.process(response);
});
};
});
define(
[
'jquery',
'Magento_Checkout/js/model/quote',
'Rokanthemes_OnePageCheckout/js/model/resource-url-manager',
'mage/storage',
'Magento_Checkout/js/model/error-processor',
'Magento_Customer/js/model/customer',
'Magento_Checkout/js/model/payment/method-converter',
'Magento_Checkout/js/model/payment-service',
'Magento_Checkout/js/model/shipping-service',
'Magento_Checkout/js/model/full-screen-loader',
'uiRegistry'
],
function ($,
quote,
resourceUrlManager,
storage,
errorProcessor,
customer,
methodConverter,
paymentService,
shippingService,
opcLoader,
registry) {
'use strict';
return function () {
opcLoader.startLoader();
return storage.post(
resourceUrlManager.getUrlForUpdatePaymentTotalInformation(quote)
).done(
function (response) {
var options, paths;
if (response.redirect_url) {
window.location.href = response.redirect_url;
return;
}
// remove downloadable options on cart item reload
$('#downloadable-links-list').remove();
$('#links-advice-container').remove();
if (response.image_data) {
registry.get('checkout.sidebar.summary.cart_items.details.thumbnail').imageData
= JSON.parse(response.image_data);
}
if (response.options) {
options = JSON.parse(response.options);
response.totals.items.forEach(function (item) {
item.rkopc = options[item.item_id];
});
}
if (response.request_path) {
paths = JSON.parse(response.request_path);
response.totals.items.forEach(function (item) {
item.request_path = paths[item.item_id];
});
}
quote.setTotals(response.totals);
paymentService.setPaymentMethods(methodConverter(response.payment_methods));
}
).fail(
function (response) {
errorProcessor.process(response);
}
).always(
function () {
opcLoader.stopLoader();
}
);
};
}
);
define([
'Magento_Checkout/js/model/quote',
'Rokanthemes_OnePageCheckout/js/model/shipping-save-processor'
], function (quote, shippingSaveProcessor) {
'use strict';
return function () {
return shippingSaveProcessor.saveShippingInformation(quote.shippingAddress().getType());
};
});
define([
'jquery',
'underscore',
'Rokanthemes_OnePageCheckout/js/model/url-builder',
'mage/storage',
'Magento_Checkout/js/model/error-processor',
'Magento_Checkout/js/model/shipping-service',
'Magento_Checkout/js/model/totals',
'Rokanthemes_OnePageCheckout/js/model/payment-service',
'mage/url',
'Magento_Checkout/js/model/quote',
'Magento_Checkout/js/model/payment/method-converter',
'Magento_Checkout/js/model/payment-service',
'Rokanthemes_OnePageCheckout/js/model/update-item-service',
'Magento_Ui/js/model/messageList',
'Magento_Checkout/js/action/get-totals'
], function (
$,
_,
urlBuilder,
storage,
errorProcessor,
shippingService,
totals,
paymentService,
url,
quote,
methodConverter,
paymentServiceDefault,
updateItemService,
globalMessageList,
getTotalsAction
) {
'use strict';
return function (item) {
var serviceUrl = urlBuilder.getUpdateQtyUrl(),
address = quote.shippingAddress();
shippingService.isLoading(true);
totals.isLoading(true);
paymentService.isLoading(true);
return storage.post(
serviceUrl,
JSON.stringify({
address: {
'region_id': address.regionId,
'region': address.region,
'country_id': address.countryId,
'postcode': address.postcode
},
itemId: parseInt(item.item_id),
qty: parseFloat(item.qty)
})
).done(function (response) {
if (response.has_error && response.status) {
globalMessageList.addSuccessMessage(response);
window.location.replace(url.build('checkout/cart/'));
} else {
if (response.status) {
globalMessageList.addSuccessMessage(response);
updateItemService.hasUpdateResult(true);
shippingService.setShippingRates(response.shipping_methods);
paymentServiceDefault.setPaymentMethods(methodConverter(response.payment_methods));
updateItemService.hasUpdateResult(false);
response.totals.coupon_code ? paymentService.isAppliedCoupon(true) : paymentService.isAppliedCoupon(false);
var deferred = $.Deferred();
getTotalsAction([], deferred);
$('.items-in-cart').find('[data-bind="text: getCartSummaryItemsCount()"]')
.text(response['totals']['items_qty']);
} else {
globalMessageList.addErrorMessage(response);
}
}
}).fail(function (response) {
errorProcessor.process(response);
}).always(function () {
shippingService.isLoading(false);
totals.isLoading(false);
paymentService.isLoading(false);
});
};
});
define([
'Rokanthemes_OnePageCheckout/js/model/shipping-save-processor/validate'
], function (validateProcessor) {
'use strict';
return function () {
return validateProcessor.saveShippingInformation();
};
});
define([
'jquery',
'underscore',
'ko',
'uiComponent',
'Amazon_Payment/js/model/storage',
'mage/storage',
'Magento_Checkout/js/model/error-processor',
'Magento_Checkout/js/model/url-builder',
'Magento_Checkout/js/model/full-screen-loader',
], function (
$,
_,
ko,
Component,
amazonStorage,
storage,
errorProcessor,
urlBuilder,
fullScreenLoader,
) {
'use strict';
var mixin = {
/**
* Revert checkout
*/
revertCheckout: function () {
var serviceUrl = urlBuilder.createUrl('/amazon/order-ref', {});
fullScreenLoader.startLoader();
storage.delete(
serviceUrl
).done(
function () {
amazonStorage.amazonlogOut();
fullScreenLoader.stopLoader();
// Amazon pay hot-fix: reload page after Customer click "Return to standard checkout"
// to reload other payment method
location.reload();
}
).fail(
function (response) {
fullScreenLoader.stopLoader();
errorProcessor.process(response);
}
);
}
};
return function (target) {
return target.extend(mixin);
};
});
define([
'jquery',
'underscore'
], function (
$,
_
) {
'use strict';
var mixin = {
/**
* @param {Object} group
* @returns {Boolean}
*/
showFormShared: function (group) {
var isShow = false,
self = this;
if (self.paymentGroupsList().length) {
if (_.first(self.paymentGroupsList()).alias == group().alias) {
isShow = true;
}
}
return isShow;
},
};
return function (target) {
return target.extend(mixin);
};
});
(function ($) {
$.fn.extend({
sliderAccess: function (options) {
options = options || {};
options.touchonly = options.touchonly !== undefined ? options.touchonly : true;
if (options.touchonly === true && !("ontouchend" in document))
return $(this);
return $(this).each(function (i, obj) {
var $t = $(this),
o = $.extend({}, {
where: 'after',
step: $t.slider('option', 'step'),
upIcon: 'ui-icon-plus',
downIcon: 'ui-icon-minus',
text: false,
upText: '+',
downText: '-',
buttonset: true,
buttonsetTag: 'span',
speed: 150
}, options),
$buttons = $('<' + o.buttonsetTag + ' class="ui-slider-access">' +
'<button data-icon="' + o.downIcon + '" data-step="-' + o.step + '">' + o.downText + '</button>' +
'<button data-icon="' + o.upIcon + '" data-step="' + o.step + '">' + o.upText + '</button>' +
'</' + o.buttonsetTag + '>');
$buttons.children('button').each(function (j, jobj) {
var $jt = $(this),
timeout = null,
increment = function ($jt, $t, e) {
var step = $jt.data('step'),
curr = $t.slider('value'),
newval = curr += step * 1,
minval = $t.slider('option', 'min'),
maxval = $t.slider('option', 'max');
e.preventDefault();
if (newval < minval || newval > maxval)
return;
$t.slider('value', newval);
$t.slider("option", "slide").call($t, null, {value: newval});
};
$jt.button({
text: o.text,
icons: {primary: $jt.data('icon')}
})
.bind('touchstart mousedown', function (e) {
increment($jt, $t, e);
timeout = setInterval(function () {
increment($jt, $t, e);
}, o.speed);
});
$(document).bind('touchend mouseup', function (e) {
clearInterval(timeout);
return e.type == 'touchend';
});
});
// before or after
$t[o.where]($buttons);
if (o.buttonset) {
$buttons.removeClass('ui-corner-right').removeClass('ui-corner-left').buttonset();
$buttons.eq(0).addClass('ui-corner-left');
$buttons.eq(1).addClass('ui-corner-right');
}
// adjust the width so we don't break the original layout
var bOuterWidth = $buttons.css({
marginLeft: (o.where == 'after' ? 10 : 0),
marginRight: (o.where == 'before' ? 10 : 0)
}).outerWidth(true) + 5;
var tOuterWidth = $t.outerWidth(true);
// support "always" hide the slider
if (o.hideSlider == 'always' || (o.hideSlider == 'touch' && ("ontouchend" in document))) {
$t.css('display', 'none');
} else {
$t.css('display', 'inline-block').width(tOuterWidth - bOuterWidth);
}
});
}
});
})(jQuery);
define([
'jquery',
'uiRegistry',
'underscore'
], function ($, registry, _) {
'use strict';
return function (paymentData) {
var additionalData = {};
var shippingAddressComponent = registry.get('checkout.steps.shipping-step.shippingAddress');
if (!_.isEmpty(shippingAddressComponent)) {
var deliveryDate = shippingAddressComponent.getChild('before-shipping-method-form').getChild('rokanthemes_opc_shipping_delivery_date');
var deliveryComment = shippingAddressComponent.getChild('before-shipping-method-form').getChild('rokanthemes_opc_shipping_delivery_comment');
}
var orderComment = registry.get('checkout.sidebar.rokanthemes_opc_order_comment');
var subscribe = registry.get('checkout.sidebar.subscribe');
if (!_.isUndefined(deliveryDate)) {
additionalData['customer_shipping_date'] = deliveryDate.value();
}
if (!_.isUndefined(deliveryComment)) {
additionalData['customer_shipping_comments'] = deliveryComment.value();
}
if (!_.isUndefined(orderComment)) {
additionalData['order_comment'] = orderComment.value();
}
if (!_.isUndefined(subscribe)) {
additionalData['subscribe'] = subscribe.value();
}
if (!additionalData) {
return;
}
if (paymentData['extension_attributes'] === undefined) {
paymentData['extension_attributes'] = {};
}
console.log(additionalData);
paymentData['extension_attributes']['rokanthemes_opc'] = additionalData;
};
});
define([
'jquery',
'mage/validation'
], function ($) {
'use strict';
var checkoutConfig = window.checkoutConfig,
agreementsConfig = checkoutConfig ? checkoutConfig.checkoutAgreements : {},
agreementsInputPath = '.rokanthemes-onepagecheckout #opc-sidebar div.checkout-agreements input';
return {
/**
* Validate checkout agreements
*
* @returns {Boolean}
*/
validate: function () {
var isValid = true;
if (!agreementsConfig.isEnabled || $(agreementsInputPath).length === 0) {
return true;
}
$(agreementsInputPath).each(function (index, agreementsInput) {
if (!$('#onepagecheckout-form-checkout-agreements').validate({
errorClass: 'mage-error',
errorElement: 'div',
meta: 'validate',
errorPlacement: function (error, element) {
var errorPlacement = element;
if (element.is(':checkbox') || element.is(':radio')) {
errorPlacement = element.siblings('label').last();
}
errorPlacement.after(error);
}
}).element(agreementsInput)) {
isValid = false;
}
});
return isValid;
}
};
});
define([
'jquery'
], function ($) {
'use strict';
var agreementsConfig = window.checkoutConfig.checkoutAgreements;
/** Override default place order action and add agreement_ids to request */
return function (paymentData) {
var agreementForm,
agreementData,
agreementIds;
if (!agreementsConfig.isEnabled) {
return;
}
agreementForm = $('.payment-method._active div[data-role=checkout-agreements] input');
if (!_.isUndefined(window.checkoutConfig.OnePageCheckout) && $('.rokanthemes-onepagecheckout').length) {
agreementForm = $('.rokanthemes-onepagecheckout #opc-sidebar div[data-role=checkout-agreements] input');
}
agreementData = agreementForm.serializeArray();
agreementIds = [];
agreementData.forEach(function (item) {
agreementIds.push(item.value);
});
if (paymentData['extension_attributes'] === undefined) {
paymentData['extension_attributes'] = {};
}
paymentData['extension_attributes']['agreement_ids'] = agreementIds;
};
});
define([
'ko',
'underscore',
'uiComponent',
'jquery',
'uiRegistry',
'Magento_Customer/js/model/address-list',
'Magento_Ui/js/lib/view/utils/async'
], function (ko, _, Component, $, registry, addressList) {
'use strict';
var componentFields = [
'country_id',
'postcode',
'region_id',
'region',
'city',
'street'
];
var streetIds = [];
return Component.extend({
/** @inheritdoc */
initialize: function () {
this._super();
var self = this,
mapUrl;
if (window.checkoutConfig.OnePageCheckout.googleApiAutoComplete == false) {
if (window.checkoutConfig.OnePageCheckout.googleApiCustomerCountry) {
$.async('[name="street[0]"]', function (element) {
var id = $(element).attr('id');
self.fillCountry(id, window.checkoutConfig.OnePageCheckout.googleApiCustomerCountry);
});
}
return;
}
if (!_.isUndefined(window.checkoutConfig.OnePageCheckout.googleApi)) {
mapUrl = 'https://maps.googleapis.com/maps/api/js?key=' + window.checkoutConfig.OnePageCheckout.googleApi + '&libraries=places';
$.getScript(mapUrl);
}
$.async('[name="street[0]"]', function (element) {
var id = $(element).attr('id');
streetIds.push(id);
self.initAutocomplete(id);
$(element).attr('placeholder', '');
});
},
getAddressFromGoogleApi: function (addressGoogleApi, type) {
if (type == 'autofill') {
var addressGoogleApiOne = addressGoogleApi[0];
if (addressGoogleApi[1]) {
var addressGoogleApiTwo = addressGoogleApi[1];
}
} else {
var addressGoogleApiOne = addressGoogleApi;
}
var self = this,
address = [],
a = 1,
issetCountry = false,
issetCity = false,
regionId = false;
for (var i = 0; i < addressGoogleApiOne.address_components.length; i++) {
for (var b = 0; b < addressGoogleApiOne.address_components[i].types.length; b++) {
if (addressGoogleApiOne.address_components[i].types[b] == "country" && issetCountry == false) {
address['country_id'] = addressGoogleApiOne.address_components[i].short_name;
issetCountry = true;
}
if (addressGoogleApiOne.address_components[i].types[b] == "locality") {
address['city'] = addressGoogleApiOne.address_components[i].long_name;
issetCity = true;
}
if (addressGoogleApiOne.address_components[i].types[b] == "administrative_area_level_1") {
address['region_id'] = addressGoogleApiOne.address_components[i].long_name;
regionId = addressGoogleApiOne.address_components[i].long_name;
}
if (addressGoogleApiOne.address_components[i].types[b] == "postal_code") {
address['postcode'] = addressGoogleApiOne.address_components[i].long_name;
}
}
}
if (addressGoogleApiTwo) {
address['street'] = addressGoogleApiTwo.formatted_address;
} else {
address['street'] = addressGoogleApiOne.formatted_address;
}
if (issetCity == false && regionId != false) {
address['city'] = regionId;
}
return address;
},
fillInAddress: function (address, id, type) {
if (addressList().length !== 0) {
return;
}
var street = $('#' + id).val();
if (typeof street !== "undefined" && street != '' && type == 'autofill'){
return;
}
var component,
country = false,
countryList = window.checkoutConfig.OnePageCheckout.googleApiListCountries,
useRegionId = false,
countryElement = false,
regionIdElement = false,
billing = 'checkout.steps.billing-step.payment.payments-list.billing-address-form-shared.form-fields',
shipping = 'checkout.steps.shipping-step.shippingAddress.shipping-address-fieldset';
if (registry.get(shipping).getChild('street').getChild(0).uid === id) {
component = shipping;
} else {
component = billing;
}
setTimeout(function(){
registry.get(component, function (formComponent) {
$.each(componentFields, function (index, field) {
var element = formComponent.getChild(field);
if (field === 'region') {
element = formComponent.getChild('region_id_input');
}
if (field == 'country_id' && field in address) {
$('#' + element.uid).find('option').each(function () {
if ($(this).attr('value') == address[field]) {
var currentCountry = element.value();
element.value(address[field]);
country = address[field];
countryElement = element;
if (($.inArray(currentCountry, countryList) === -1 && $.inArray(address[field], countryList) !== -1) ||
($.inArray(currentCountry, countryList) !== -1 && $.inArray(address[field], countryList) !== -1 && currentCountry != address[field])
) {
element.trigger('change');
}
return false;
}
});
}
if (field == 'region_id' && field in address && country != false && $.inArray(country, countryList) !== -1) {
$('#' + element.uid).find('option').each(function () {
if ($(this).attr('data-title') == address[field]) {
element.value($(this).attr('value'));
regionIdElement = element;
return false;
}
});
useRegionId = true;
}
if (field == 'region' && country != false && useRegionId == false) {
if ('region_id' in address) {
element.value(address['region_id']);
} else {
element.value('');
}
}
if (field == 'street' && field in address) {
element = formComponent.getChild(field).getChild(0);
element.value(address[field]);
}
if ((field == 'postcode' || field == 'city')) {
if (field in address) {
element.value(address[field]);
} else {
element.value('');
}
}
});
});
if (country != '' && component == shipping) {
if (useRegionId == true && regionIdElement != false) {
regionIdElement.trigger('change');
} else {
if (countryElement != false) {
countryElement.trigger('change');
}
}
}
}, 500);
},
fillCountry: function (id, countryCode) {
if (addressList().length !== 0) {
return;
}
if ($('#' + id).val() != ''){
return;
}
var component,
billing = 'checkout.steps.billing-step.payment.payments-list.billing-address-form-shared.form-fields',
shipping = 'checkout.steps.shipping-step.shippingAddress.shipping-address-fieldset';
if (registry.get(shipping).getChild('street').getChild(0).uid === id) {
component = shipping;
} else {
component = billing;
}
setTimeout(function(){
registry.get(component, function (formComponent) {
var element = formComponent.getChild('country_id');
$('#' + element.uid).find('option').each(function () {
if ($(this).attr('value') == countryCode) {
var currentCountry = element.value();
element.value(countryCode);
if (currentCountry != countryCode) {
element.trigger('change');
}
return false;
}
});
});
}, 500);
},
/**
* @param {String} id
*/
initAutocomplete: function (id) {
var self = this,
options = {types: ['address']},
googleAddress = false;
if (!_.isUndefined(window.checkoutConfig.OnePageCheckout.specificcountry)) {
var countries = window.checkoutConfig.OnePageCheckout.specificcountry;
options.componentRestrictions = {country: countries};
}
var autocomplete = new google.maps.places.Autocomplete(
(document.getElementById(id)),
options
);
autocomplete.addListener('place_changed', function () {
var results = autocomplete.getPlace();
if (results) {
var address = self.getAddressFromGoogleApi(results, 'suggest');
self.fillInAddress(address, id, 'suggest');
}
});
}
});
});
define(['ko'], function (ko) {
'use strict';
var hasLogin = window.checkoutConfig.OnePageCheckout.isAmazonAccountLoggedIn;
return {
isAmazonAccountLoggedIn: ko.observable(hasLogin),
setLogin: function (value) {
return this.isAmazonAccountLoggedIn(value);
}
};
});
define([
'jquery',
'Magento_Customer/js/model/customer',
'Rokanthemes_OnePageCheckout/js/model/save-new-account-information',
'mage/validation'
], function ($, customer, saveNewAccountInformation) {
'use strict';
return {
/**
* Validate checkout agreements
*
* @returns {Boolean}
*/
validate: function () {
var validationResult = true,
createNewAccountCheckBoxId = 'create-new-customer',
loginFormSelector = 'form[data-role=email-with-possible-login]';
if (!customer.isLoggedIn() && $(loginFormSelector + ' #'+createNewAccountCheckBoxId).is(":checked")) {
$(loginFormSelector).validation();
validationResult = Boolean($(loginFormSelector + ' input[name=newcustomerpassword]').valid());
if (validationResult == true) {
validationResult = Boolean($(loginFormSelector + ' input[name=newcustomerpassword_confirmation]').valid());
}
}
saveNewAccountInformation.ajaxSave();
return validationResult;
}
};
});
define([], function () {
'use strict';
return {
/**
* @return {Object}
*/
getRules: function () {
return {
'country_id': {
'required': true
}
};
}
};
});
define([
'jquery',
'mageUtils',
'./default-validation-rules',
'mage/translate'
], function ($, utils, validationRules, $t) {
'use strict';
return {
validationErrors: [],
/**
* @param {Object} address
* @return {Boolean}
*/
validate: function (address) {
var self = this;
this.validationErrors = [];
$.each(validationRules.getRules(), function (field, rule) {
var message;
if (rule.required && utils.isEmpty(address[field])) {
message = $t('Field ') + field + $t(' is required.');
self.validationErrors.push(message);
}
});
return !this.validationErrors.length;
}
};
});
/**
* @api
*/
define([
'Magento_GiftMessage/js/model/gift-message'
], function (GiftMessage) {
'use strict';
window.giftOptionsConfig = window.checkoutConfig.OnePageCheckout.giftOptionsConfig;
return function (itemId) {
return new GiftMessage(itemId);
};
});
define([
'underscore',
'Magento_Checkout/js/model/quote',
'Magento_Checkout/js/model/payment/method-list',
'Magento_Checkout/js/action/select-payment-method',
'Magento_Checkout/js/model/payment-service'
], function (_, quote, methodList, selectPaymentMethod, paymentService) {
'use strict';
/**
* Free method filter
* @param {Object} paymentMethod
* @return {Boolean}
*/
var isFreePaymentMethod = function (paymentMethod) {
return paymentMethod.method === 'free';
},
/**
* Grabs the grand total from quote
* @return {Number}
*/
getGrandTotal = function () {
return quote.totals()['grand_total'];
};
return {
/**
* Populate the list of payment methods
* @param {Array} methods
*/
setPaymentMethods: function (methods) {
var freeMethod,
filteredMethods,
methodIsAvailable,
methodNames;
freeMethod = _.find(methods, isFreePaymentMethod);
paymentService.isFreeAvailable = !!freeMethod;
if (freeMethod && getGrandTotal() <= 0) {
methods.splice(0, methods.length, freeMethod);
selectPaymentMethod(freeMethod);
}
filteredMethods = _.without(methods, freeMethod);
if (filteredMethods.length === 1) {
selectPaymentMethod(filteredMethods[0]);
} else if (quote.paymentMethod()) {
methodIsAvailable = methods.some(function (item) {
return item.method === quote.paymentMethod().method;
});
//Unset selected payment method if not available
if (!methodIsAvailable) {
selectPaymentMethod(null);
}
}
/**
* Overwrite methods with existing methods to preserve ko array references.
* This prevent ko from re-rendering those methods.
*/
methodNames = _.pluck(methods, 'method');
_.map(methodList(), function (existingMethod) {
var existingMethodIndex = methodNames.indexOf(existingMethod.method);
if (existingMethodIndex !== -1) {
methods[existingMethodIndex] = existingMethod;
}
});
methodList(methods);
}
};
});
define([
'ko',
'Magento_Checkout/js/model/quote'
], function (ko, quote) {
'use strict';
var totals = quote.getTotals(),
couponCode = ko.observable(null);
if (totals()) {
couponCode(totals()['coupon_code']);
}
return {
isLoading: ko.observable(false),
isAppliedCoupon: ko.observable(couponCode() != null)
}
});
define([
'jquery',
'underscore',
'mage/utils/wrapper',
'Rokanthemes_OnePageCheckout/js/model/additional-data',
'Rokanthemes_OnePageCheckout/js/model/agreements-assigner'
], function ($, _, wrapper, additionalData, agreementsAssigner) {
'use strict';
return function (placeOrderAction) {
return wrapper.wrap(placeOrderAction, function (originalAction, paymentData, messageContainer) {
if (!_.isUndefined(window.checkoutConfig.OnePageCheckout)) {
additionalData(paymentData);
}
agreementsAssigner(paymentData);
return originalAction(paymentData, messageContainer);
});
};
});
define(
[
'jquery',
'Magento_Checkout/js/model/resource-url-manager'
],
function ($, resourceUrlManager) {
"use strict";
return $.extend({
/** Get url for update item qty and remove item */
getUrlForUpdatePaymentTotalInformation: function (quote) {
var params = this.getCheckoutMethod() === 'guest' ? {cartId: quote.getQuoteId()} : {};
var urls = {
'guest': '/guest-carts/:cartId/payment-total-information',
'customer': '/carts/mine/payment-total-information'
};
return this.getUrl(urls, params);
}
}, resourceUrlManager);
}
);
define([
'jquery',
'ko',
'uiComponent',
'Magento_Checkout/js/model/full-screen-loader',
'mage/url'
], function (
$,
ko,
Component,
fullScreenLoader,
urlBuilder
) {
return {
ajaxSave: function () {
var createNewAccountCheckBoxId = 'create-new-customer',
loginFormSelector = 'form[data-role=email-with-possible-login]';
var data = {};
if ($(loginFormSelector + ' #' + createNewAccountCheckBoxId).is(":checked")) {
data['email'] = $(loginFormSelector + ' input[name=username]').val();
data['pass'] = $(loginFormSelector + ' input[name=newcustomerpassword]').val();
data['confirmpass'] = $(loginFormSelector + ' input[name=newcustomerpassword_confirmation]').val();
}
var saveUrl = 'onepagecheckout/account/save';
fullScreenLoader.startLoader();
$.ajax({
url: urlBuilder.build(saveUrl),
data: data,
type: 'post',
dataType: 'json',
/** @inheritdoc */
success: function (response) {
fullScreenLoader.stopLoader();
},
/** @inheritdoc */
error: function () {
alert({
content: $.mage.__('Sorry, something went wrong. Please try again later.')
});
}
});
}
};
});
define([
'jquery',
'mage/utils/wrapper',
'Rokanthemes_OnePageCheckout/js/model/additional-data',
'Rokanthemes_OnePageCheckout/js/model/agreements-assigner',
'underscore',
'Magento_Checkout/js/checkout-data',
], function ($, wrapper, additionalData, agreementsAssigner, _, checkoutData) {
'use strict';
return function (placeOrderAction) {
/** Override place-order-mixin for set-payment-information action as they differs only by method signature */
return wrapper.wrap(placeOrderAction, function (originalAction, messageContainer, paymentData) {
if (!_.isUndefined(window.checkoutConfig.OnePageCheckout)) {
additionalData(paymentData);
}
agreementsAssigner(paymentData);
// only send request when email is filled
if (window.checkoutConfig.isCustomerLoggedIn &&
!_.isEmpty(checkoutData.getSelectedShippingAddress())) {
return originalAction(messageContainer, paymentData);
}
if (!_.isEmpty(checkoutData.getValidatedEmailValue())) {
return originalAction(messageContainer, paymentData);
}
return originalAction(messageContainer, paymentData);
});
};
});
define([
'Magento_Checkout/js/model/resource-url-manager',
'Magento_Checkout/js/model/quote',
'mage/storage',
'Magento_Checkout/js/model/shipping-service',
'Magento_Checkout/js/model/shipping-rate-registry',
'Magento_Checkout/js/model/error-processor'
], function (resourceUrlManager, quote, storage, shippingService, rateRegistry, errorProcessor) {
'use strict';
return function (address) {
shippingService.isLoading(true);
return storage.post(
resourceUrlManager.getUrlForEstimationShippingMethodsByAddressId(),
JSON.stringify({
addressId: address.customerAddressId
}),
false
).done(function (result) {
console.log('register');
rateRegistry.set(address.getKey(), result);
shippingService.setShippingRates(result);
}).fail(function (response) {
console.log('cccc');
shippingService.setShippingRates([]);
errorProcessor.process(response);
}).always(function () {
console.log('ddd');
shippingService.isLoading(false);
}
);
}
});
define([
'Magento_Checkout/js/model/resource-url-manager',
'Magento_Checkout/js/model/quote',
'mage/storage',
'Magento_Checkout/js/model/shipping-service',
'Magento_Checkout/js/model/shipping-rate-registry',
'Magento_Checkout/js/model/error-processor'
], function (resourceUrlManager, quote, storage, shippingService, rateRegistry, errorProcessor) {
'use strict';
return function (address) {
var serviceUrl, payload;
shippingService.isLoading(true);
serviceUrl = resourceUrlManager.getUrlForEstimationShippingMethodsForNewAddress(quote);
payload = JSON.stringify({
address: {
'street': address.street,
'city': address.city,
'region_id': address.regionId,
'region': address.region,
'country_id': address.countryId,
'postcode': address.postcode,
'email': address.email,
'customer_id': address.customerId,
'firstname': address.firstname,
'lastname': address.lastname,
'middlename': address.middlename,
'prefix': address.prefix,
'suffix': address.suffix,
'vat_id': address.vatId,
'company': address.company,
'telephone': address.telephone,
'fax': address.fax,
'custom_attributes': address.customAttributes,
'save_in_address_book': address.saveInAddressBook
}
}
);
return storage.post(
serviceUrl, payload, false
).done(function (result) {
rateRegistry.set(address.getCacheKey(), result);
shippingService.setShippingRates(result);
}).fail(function (response) {
shippingService.setShippingRates([]);
errorProcessor.process(response);
}).always(function () {
shippingService.isLoading(false);
});
}
});
define([
'jquery',
'Magento_Checkout/js/model/quote',
'Magento_Checkout/js/model/shipping-rate-processor/new-address',
'Magento_Checkout/js/model/shipping-rate-processor/customer-address'
], function ($, quote, defaultProcessor, customerAddressProcessor) {
'use strict';
var processors = [];
processors.default = defaultProcessor;
processors['customer-address'] = customerAddressProcessor;
quote.shippingAddress.subscribe(function () {
if (typeof window.shippingAddress === "undefined" || $.isEmptyObject(window.shippingAddress)) {
var type = quote.shippingAddress().getType();
if (processors[type]) {
processors[type].getRates(quote.shippingAddress());
} else {
processors.default.getRates(quote.shippingAddress());
}
}
});
return {
/**
* @param {String} type
* @param {*} processor
*/
registerProcessor: function (type, processor) {
processors[type] = processor;
}
};
});
define(['jquery'], function ($) {
'use strict';
return function (target) {
target.getObservableFields = function () {
var self = this,
observableFields = [];
$.each(self.getRules(), function (carrier, fields) {
$.each(fields, function (field) {
if (observableFields.indexOf(field) === -1) {
observableFields.push(field);
}
});
});
observableFields.push('telephone'); // Load shipping method on Phone Number change
return observableFields;
};
return target;
};
});
define([
'jquery',
'ko',
'underscore',
'Magento_Checkout/js/model/shipping-rates-validation-rules',
'Magento_Checkout/js/model/address-converter',
'Magento_Checkout/js/action/select-shipping-address',
'Magento_Checkout/js/model/postcode-validator',
'Rokanthemes_OnePageCheckout/js/model/default-validator',
'mage/translate',
'uiRegistry',
'Magento_Checkout/js/model/shipping-address/form-popup-state',
'Magento_Checkout/js/model/quote',
'Magento_Checkout/js/model/shipping-rates-validator'
], function (
$,
ko,
_,
shippingRatesValidationRules,
addressConverter,
selectShippingAddress,
postcodeValidator,
defaultValidator,
$t,
uiRegistry,
formPopUpState,
quote,
shippingRatesValidator
) {
'use strict';
var validators = [],
postcodeElement = null,
postcodeElementName = 'postcode';
validators.push(defaultValidator);
shippingRatesValidator.doElementBinding = function (element, force, delay) {
var observableFields = shippingRatesValidationRules.getObservableFields();
if (_.isUndefined(delay)) {
if (element.index === 'country_id' || element.index === 'region_id') {
delay = 0;
} else {
delay = 700;
}
}
if (element && (observableFields.indexOf(element.index) !== -1 || force)) {
if (element.index !== postcodeElementName) {
this.bindHandler(element, delay);
}
}
if (element.index === postcodeElementName) {
this.bindHandler(element, delay);
postcodeElement = element;
}
};
return shippingRatesValidator;
});
define([
'Rokanthemes_OnePageCheckout/js/model/shipping-save-processor/default'
], function (defaultProcessor) {
'use strict';
var processors = [];
processors['default'] = defaultProcessor;
return {
/**
* @param {String} type
* @param {*} processor
*/
registerProcessor: function (type, processor) {
processors[type] = processor;
},
/**
* @param {String} type
* @return {Array}
*/
saveShippingInformation: function (type) {
var rates = [];
if (processors[type]) {
rates = processors[type].saveShippingInformation();
} else {
rates = processors['default'].saveShippingInformation();
}
return rates;
}
};
});
define([
'ko',
'underscore',
'Magento_Checkout/js/model/quote',
'Magento_Checkout/js/model/resource-url-manager',
'mage/storage',
'Rokanthemes_OnePageCheckout/js/model/payment-service-default',
'Magento_Checkout/js/model/payment/method-converter',
'Magento_Checkout/js/model/error-processor',
'Magento_Checkout/js/action/select-billing-address',
'Rokanthemes_OnePageCheckout/js/model/shipping-save-processor/payload-extender',
'Magento_Customer/js/model/customer'
], function (
ko,
_,
quote,
resourceUrlManager,
storage,
paymentService,
methodConverter,
errorProcessor,
selectBillingAddressAction,
payloadExtender,
customer
) {
'use strict';
return {
/**
* @return {jQuery.Deferred}
*/
saveShippingInformation: function () {
var payload;
if (!quote.billingAddress()) {
selectBillingAddressAction(quote.shippingAddress());
}
var billingAddress = quote.billingAddress();
if (!customer.isLoggedIn()) {
if (billingAddress) {
if (!_.isUndefined(billingAddress.street)) {
if (billingAddress.street.length == 0) {
delete billingAddress.street;
}
} else {
delete billingAddress.street;
}
}
}
payload = {
addressInformation: {
'shipping_address': quote.shippingAddress(),
'billing_address': quote.billingAddress(),
'shipping_method_code': quote.shippingMethod()['method_code'],
'shipping_carrier_code': quote.shippingMethod()['carrier_code']
}
};
payloadExtender(payload);
return storage.post(
resourceUrlManager.getUrlForSetShippingInformation(quote),
JSON.stringify(payload)
).done(
function (response) {
quote.setTotals(response.totals);
paymentService.setPaymentMethods(methodConverter(response['payment_methods']));
}
).fail(
function (response) {
errorProcessor.process(response);
}
);
}
};
});
define([
'jquery'
], function ($) {
'use strict';
return function (payload) {
payload.addressInformation['extension_attributes'] = {};
if ($('#shipping #customer_shipping_date').length || $('#opc-shipping_method #customer_shipping_date').length) {
payload.addressInformation['extension_attributes']['customer_shipping_date'] = $('#customer_shipping_date').val();
}
if ($('#shipping #customer_shipping_comments').length || $('#opc-shipping_method #customer_shipping_comments').length) {
payload.addressInformation['extension_attributes']['customer_shipping_comments'] = $('#customer_shipping_comments').val();
}
if ($('#shipping #delivery_time_slot').length || $('#opc-shipping_method #delivery_time_slot').length) {
payload.addressInformation['extension_attributes']['delivery_time_slot'] = $('#delivery_time_slot').val();
}
return payload;
};
});
define([
'ko',
'underscore',
'Magento_Checkout/js/model/quote',
'mage/storage',
'Magento_Checkout/js/model/error-processor',
'Magento_Checkout/js/action/select-billing-address',
'Magento_Checkout/js/model/resource-url-manager',
'Rokanthemes_OnePageCheckout/js/model/shipping-save-processor/payload-extender',
'Magento_Customer/js/model/customer'
], function (
ko,
_,
quote,
storage,
errorProcessor,
selectBillingAddressAction,
resourceUrlManager,
payloadExtender,
customer
) {
'use strict';
return {
/**
* @return {jQuery.Deferred}
*/
saveShippingInformation: function () {
var payload;
if (!quote.billingAddress()) {
selectBillingAddressAction(quote.shippingAddress());
}
var billingAddress = quote.billingAddress();
if (!customer.isLoggedIn()) {
if (billingAddress) {
if (!_.isUndefined(billingAddress.street)) {
if (billingAddress.street.length == 0) {
delete billingAddress.street;
}
} else {
delete billingAddress.street;
}
}
}
payload = {
addressInformation: {
'shipping_address': quote.shippingAddress(),
'billing_address': quote.billingAddress(),
'shipping_method_code': quote.shippingMethod()['method_code'],
'shipping_carrier_code': quote.shippingMethod()['carrier_code']
}
};
payloadExtender(payload);
return storage.post(
resourceUrlManager.getUrlForSetShippingInformation(quote),
JSON.stringify(payload)
).fail(
function (response) {
errorProcessor.process(response);
}
);
}
};
});
define([
'underscore'
], function (_) {
'use strict';
return function (stepNavigator) {
if (!_.isUndefined(window.checkoutConfig.OnePageCheckout)) {
stepNavigator.isProcessed = function () {
return true;
};
}
return stepNavigator;
};
});
define([
'jquery',
'ko',
'Magento_Checkout/js/model/step-navigator'
], function ($, ko, stepNavigator) {
'use strict';
var steps = ko.observableArray();
return {
/**
* @param {String} code
* @param {*} alias
* @param {*} title
* @param {Function} isVisible
* @param {*} navigate
* @param {*} sortOrder
*/
registerStep: function (code, alias, title, isVisible, navigate, sortOrder) {
var hash, active;
if ($.inArray(code, stepNavigator.validCodes) !== -1) {
throw new DOMException('Step code [' + code + '] already registered in step navigator');
}
if (alias != null) {
if ($.inArray(alias, stepNavigator.validCodes) !== -1) {
throw new DOMException('Step code [' + alias + '] already registered in step navigator');
}
stepNavigator.validCodes.push(alias);
}
stepNavigator.validCodes.push(code);
steps.push({
code: code,
alias: alias != null ? alias : code,
title: title,
isVisible: isVisible,
navigate: navigate,
sortOrder: sortOrder
});
active = stepNavigator.getActiveItemIndex();
steps.each(function (elem, index) {
if (active !== index && elem.code !== 'payment') {
elem.isVisible(false);
}
});
stepNavigator.stepCodes.push(code);
hash = window.location.hash.replace('#', '');
if (hash != '' && hash != code) {
isVisible(false);
}
}
};
});
define([
'ko'
], function (ko) {
'use strict';
var hasUpdateResult = ko.observable(false);
return {
hasUpdateResult : hasUpdateResult
}
});
define([
'jquery',
'underscore',
'Magento_Checkout/js/model/url-builder',
'Magento_Customer/js/model/customer',
'Magento_Checkout/js/model/quote'
], function ($, _, urlBuilder, customer, quote) {
'use strict';
var opcStoreCode;
if (!_.isUndefined(window.checkoutConfig.OnePageCheckout.giftOptionsConfig)) {
opcStoreCode = window.checkoutConfig.OnePageCheckout.giftOptionsConfig.storeCode;
} else {
opcStoreCode = window.checkoutConfig.storeCode;
}
return $.extend(urlBuilder, {
storeCode: opcStoreCode,
/**
* Get update item url for service.
*
* @return {String}
*/
getUpdateQtyUrl: function () {
var serviceUrl;
if (!customer.isLoggedIn()) {
serviceUrl = this.createUrl('/rokanthemes-opc/guest-carts/:cartId/update-item-qty', {
cartId: quote.getQuoteId()
});
} else {
serviceUrl = this.createUrl('/rokanthemes-opc/carts/mine/update-item-qty', {});
}
return serviceUrl;
}
});
});
define([
'Magento_Paypal/js/in-context/express-checkout-smart-buttons'
], function (checkoutSmartButtons) {
'use strict';
window.paypalElement = false;
return function(target){
target.renderPayPalButtons = function (element) {
if (window.paypalElement == false) {
window.paypalElement = element;
}
if (typeof window.checkoutConfig === "undefined") {
checkoutSmartButtons(this.prepareClientConfig(), element);
}
}
return target;
};
});
define([
'jquery',
'uiRegistry',
'Magento_Checkout/js/model/quote',
'Magento_Checkout/js/model/payment/additional-validators',
'Magento_Paypal/js/in-context/express-checkout-smart-buttons',
'Rokanthemes_OnePageCheckout/js/action/validate-shipping-information',
'Magento_Checkout/js/action/select-billing-address',
'Magento_Checkout/js/model/full-screen-loader',
'mage/translate'
], function ($, registry, quote, additionalValidators, checkoutSmartButtons, validateShippingInformationAction, selectBillingAddress, fullScreenLoader) {
'use strict';
var buttonId = 'paypay-in-context-button',
errorId = 'paypay-in-context-validate-error',
html = '<p id="' + errorId + '" style="display:none">' + $.mage.__('Please Fill All Require Field!') + '</p><p class="action primary" id="' + buttonId + '" style="display:none">' + $.mage.__('Continue Paypal') + '</p>',
mixin = {
/**
* Listens element on change and validate it.
*
* @param {HTMLElement} context
*/
initListeners: function (context) {
$(context).find('.payment-method-content').append(html);
var seft = this;
quote.billingAddress.subscribe(function (address) {
if (quote.isVirtual()) {
if (address !== null && quote.paymentMethod() != null) {
$('#' + buttonId).removeClass('disable');
return;
}
} else {
if (address !== null && quote.paymentMethod() != null && quote.shippingMethod() != null) {
$('#' + buttonId).removeClass('disable');
return;
}
}
if (!$('#' + buttonId).hasClass('disable')) {
$('#' + buttonId).addClass('disable');
}
}, this);
this.customValidate(seft);
$('#' + buttonId).click(function () {
if (!$(this).hasClass('disable')) {
$(this).addClass('disable');
seft.customValidate(seft);
}
})
this.fieldChange();
},
/**
* Validates Smart Buttons
*/
validate: function () {
if (this.actions) {
this.actions.enable();
}
},
fieldChange: function () {
$('input[type=radio], input[type=checkbox], select').change(function () {
$('#' + buttonId).parent().find('.actions-toolbar').html('');
$('#' + buttonId).show();
$('#' + errorId).hide();
$('#' + buttonId).removeClass('disable');
if ($(this).val() == 'paypal_express') {
$('#' + buttonId).trigger('click');
}
});
$("input[type=text], textarea").keyup(function(){
$('#' + buttonId).parent().find('.actions-toolbar').html('');
$('#' + buttonId).show();
$('#' + buttonId).removeClass('disable');
});
$("input[type=text], textarea").keydown(function(){
$('#' + buttonId).parent().find('.actions-toolbar').html('');
$('#' + buttonId).show();
$('#' + buttonId).removeClass('disable');
});
},
customValidate: function (seft) {
var shippingAddressComponent = registry.get('checkout.steps.shipping-step.shippingAddress');
if (additionalValidators.validate() == true) {
if (!quote.isVirtual()) {
if (shippingAddressComponent.validateShippingInformation()) {
validateShippingInformationAction().done(
function () {
$('#' + buttonId).hide();
$('#' + errorId).hide();
checkoutSmartButtons(seft.prepareClientConfig(), window.paypalElement);
}
).fail(
function () {
$('#' + buttonId).show();
$('#' + errorId).show();
$('#' + buttonId).removeClass('disable');
fullScreenLoader.stopLoader();
}
);
return;
}
}
}
$('#' + buttonId).show();
$('#' + errorId).show();
$('#' + buttonId).removeClass('disable');
}
};
return function (target) {
return target.extend(mixin);
};
});
define([
'Magento_Paypal/js/in-context/express-checkout-smart-buttons'
], function (checkoutSmartButtons) {
'use strict';
window.paypalElement = false;
return function(target){
target.renderPayPalButtons = function (element) {
if (window.paypalElement == false) {
window.paypalElement = element;
}
if (typeof window.checkoutConfig === "undefined") {
checkoutSmartButtons(this.prepareClientConfig(), element);
}
}
return target;
};
});
define([
'jquery',
'uiRegistry',
'Magento_Checkout/js/model/quote',
'Magento_Checkout/js/model/payment/additional-validators',
'Magento_Paypal/js/in-context/express-checkout-smart-buttons',
'Rokanthemes_OnePageCheckout/js/action/validate-shipping-information',
'Magento_Checkout/js/action/select-billing-address',
'Magento_Checkout/js/model/full-screen-loader',
'mage/translate'
], function ($, registry, quote, additionalValidators, checkoutSmartButtons, validateShippingInformationAction, selectBillingAddress, fullScreenLoader) {
'use strict';
var buttonId = 'paypay-in-context-button',
errorId = 'paypay-in-context-validate-error',
html = '<p id="' + errorId + '" style="display:none">' + $.mage.__('Please Fill All Require Field!') + '</p><p class="action primary" id="' + buttonId + '" style="display:none">' + $.mage.__('Continue Paypal') + '</p>',
mixin = {
/**
* Listens element on change and validate it.
*
* @param {HTMLElement} context
*/
initListeners: function (context) {
$(context).find('.payment-method-content').append(html);
var seft = this;
quote.billingAddress.subscribe(function (address) {
if (quote.isVirtual()) {
if (address !== null && quote.paymentMethod() != null) {
$('#' + buttonId).removeClass('disable');
return;
}
} else {
if (address !== null && quote.paymentMethod() != null && quote.shippingMethod() != null) {
$('#' + buttonId).removeClass('disable');
return;
}
}
if (!$('#' + buttonId).hasClass('disable')) {
$('#' + buttonId).addClass('disable');
}
}, this);
this.customValidate(seft);
$('#' + buttonId).click(function () {
if (!$(this).hasClass('disable')) {
$(this).addClass('disable');
seft.customValidate(seft);
}
})
this.fieldChange();
},
/**
* Validates Smart Buttons
*/
validate: function () {
if (this.actions) {
this.actions.enable();
}
},
fieldChange: function () {
$('input[type=radio], input[type=checkbox], select').change(function () {
$('#' + buttonId).parent().find('.actions-toolbar').html('');
$('#' + buttonId).show();
$('#' + errorId).hide();
$('#' + buttonId).removeClass('disable');
if ($(this).val() == 'paypal_express') {
$('#' + buttonId).trigger('click');
}
});
$("input[type=text], textarea").keyup(function(){
$('#' + buttonId).parent().find('.actions-toolbar').html('');
$('#' + buttonId).show();
$('#' + buttonId).removeClass('disable');
});
$("input[type=text], textarea").keydown(function(){
$('#' + buttonId).parent().find('.actions-toolbar').html('');
$('#' + buttonId).show();
$('#' + buttonId).removeClass('disable');
});
},
customValidate: function (seft) {
var shippingAddressComponent = registry.get('checkout.steps.shipping-step.shippingAddress');
if (additionalValidators.validate() == true) {
if (!quote.isVirtual()) {
if (shippingAddressComponent.validateShippingInformation()) {
validateShippingInformationAction().done(
function () {
$('#' + buttonId).hide();
$('#' + errorId).hide();
checkoutSmartButtons(seft.prepareClientConfig(), window.paypalElement);
}
).fail(
function () {
$('#' + buttonId).show();
$('#' + errorId).show();
$('#' + buttonId).removeClass('disable');
fullScreenLoader.stopLoader();
}
);
return;
}
}
}
$('#' + buttonId).show();
$('#' + errorId).show();
$('#' + buttonId).removeClass('disable');
}
};
return function (target) {
return target.extend(mixin);
};
});
define([
'uiComponent',
'Magento_Checkout/js/model/payment/additional-validators',
'Rokanthemes_OnePageCheckout/js/model/agreement-validator'
], function (Component, additionalValidators, agreementValidator) {
'use strict';
additionalValidators.registerValidator(agreementValidator);
return Component.extend({});
});
define([
'uiComponent',
'jquery',
'ko',
'Amazon_Payment/js/model/storage',
'Magento_Checkout/js/model/shipping-rate-service',
'Rokanthemes_OnePageCheckout/js/action/payment-total-information',
'Rokanthemes_OnePageCheckout/js/model/compatible/amazon-pay',
'Magento_Checkout/js/model/quote'
], function (Component, $, ko, amazonStorage, shippingService, getPaymentTotalInformation, amazonPay, quote) {
'use strict';
return Component.extend({
defaults: {
template: 'Amazon_Payment/shipping-address/inline-form',
formSelector: 'co-shipping-form'
},
/**
* Init inline form
*/
initObservable: function () {
this._super();
amazonStorage.isAmazonAccountLoggedIn.subscribe(function (value) {
if (value == false) {
window.checkoutConfig.OnePageCheckout.isAmazonAccountLoggedIn = value;
amazonPay.setLogin(value);
if (!quote.isVirtual()) {
shippingService.estimateShippingMethod();
}
getPaymentTotalInformation();
}
var elem = document.getElementById(this.formSelector);
if (elem && value === false) {
document.getElementById(this.formSelector).style.display = 'block';
}
}, this);
return this;
},
/**
* Show/hide inline form
*/
manipulateInlineForm: function () {
if (amazonStorage.isAmazonAccountLoggedIn()) {
window.checkoutConfig.OnePageCheckout.isAmazonAccountLoggedIn = true;
amazonPay.setLogin(true);
setTimeout(function () {
if (!quote.isVirtual()) {
shippingService.estimateShippingMethod();
}
getPaymentTotalInformation();
}, 1000);
var elem = document.getElementById(this.formSelector);
if (elem) {
document.getElementById(this.formSelector).style.display = 'none';
}
}
}
});
});
define([
'ko',
'jquery',
'underscore',
'Magento_Ui/js/form/form',
'Magento_Customer/js/model/customer',
'Magento_Customer/js/model/address-list',
'Magento_Checkout/js/model/quote',
'Magento_Checkout/js/action/create-billing-address',
'Magento_Checkout/js/action/select-billing-address',
'Magento_Checkout/js/checkout-data',
'Magento_Checkout/js/model/checkout-data-resolver',
'Magento_Customer/js/customer-data',
'Magento_Checkout/js/action/set-billing-address',
'Magento_Ui/js/model/messageList',
'mage/translate',
'uiRegistry'
], function (
ko,
$,
_,
Component,
customer,
addressList,
quote,
createBillingAddress,
selectBillingAddress,
checkoutData,
checkoutDataResolver,
customerData,
setBillingAddressAction,
globalMessageList,
$t,
registry
) {
'use strict';
var lastSelectedBillingAddress = null,
newAddressOption = {
/**
* Get new address label
* @returns {String}
*/
getAddressInline: function () {
return $t('New Address');
},
customerAddressId: null
},
countryData = customerData.get('directory-data'),
addressOptions = addressList().filter(function (address) {
return address.getType() == 'customer-address'; //eslint-disable-line eqeqeq
});
addressOptions.push(newAddressOption);
return Component.extend({
defaults: {
template: 'Rokanthemes_OnePageCheckout/billing-address'
},
currentBillingAddress: quote.billingAddress,
addressOptions: addressOptions,
customerHasAddresses: addressOptions.length > 1,
/**
* Init component
*/
initialize: function () {
var self = this;
this._super();
quote.paymentMethod.subscribe(function () {
if (self.isAddressSameAsShipping()) {
selectBillingAddress(quote.shippingAddress());
}
checkoutDataResolver.resolveBillingAddress();
}, this);
},
/**
* @return {exports.initObservable}
*/
initObservable: function () {
this._super()
.observe({
selectedAddress: null,
isAddressDetailsVisible: quote.billingAddress() != null,
isAddressFormVisible: !customer.isLoggedIn() || addressOptions.length === 1,
isAddressSameAsShipping: false,
saveInAddressBook: 1
});
quote.billingAddress.subscribe(function (newAddress) {
if (quote.isVirtual() || !quote.shippingAddress()) {
this.isAddressSameAsShipping(false);
} else {
this.isAddressSameAsShipping(
newAddress != null &&
newAddress.getCacheKey() == quote.shippingAddress().getCacheKey() //eslint-disable-line eqeqeq
);
}
if (newAddress != null && newAddress.saveInAddressBook !== undefined) {
this.saveInAddressBook(newAddress.saveInAddressBook);
} else {
this.saveInAddressBook(1);
}
this.isAddressDetailsVisible(true);
}, this);
return this;
},
canUseShippingAddress: ko.computed(function () {
return !quote.isVirtual() && quote.shippingAddress() && quote.shippingAddress().canUseForBilling();
}),
/**
* @param {Object} address
* @return {*}
*/
addressOptionsText: function (address) {
return address.getAddressInline();
},
/**
* @return {Boolean}
*/
useShippingAddress: function () {
if (this.isAddressSameAsShipping()) {
selectBillingAddress(quote.shippingAddress());
this.updateAddresses();
this.isAddressDetailsVisible(true);
} else {
lastSelectedBillingAddress = quote.billingAddress();
quote.billingAddress(null);
this.isAddressDetailsVisible(false);
}
checkoutData.setSelectedBillingAddress(null);
return true;
},
/**
* Update address action
*/
updateAddress: function () {
var addressData, newBillingAddress, update;
if (this.selectedAddress() && this.selectedAddress() != newAddressOption) { //eslint-disable-line eqeqeq
selectBillingAddress(this.selectedAddress());
checkoutData.setSelectedBillingAddress(this.selectedAddress().getKey());
update = true;
} else {
this.source.set('params.invalid', false);
this.source.trigger(this.dataScopePrefix + '.data.validate');
if (this.source.get(this.dataScopePrefix + '.custom_attributes')) {
this.source.trigger(this.dataScopePrefix + '.custom_attributes.data.validate');
}
if (!this.source.get('params.invalid')) {
addressData = this.source.get(this.dataScopePrefix);
if (customer.isLoggedIn() && !this.customerHasAddresses) { //eslint-disable-line max-depth
this.saveInAddressBook(1);
}
addressData['save_in_address_book'] = this.saveInAddressBook() ? 1 : 0;
newBillingAddress = createBillingAddress(addressData);
// New address must be selected as a billing address
selectBillingAddress(newBillingAddress);
checkoutData.setSelectedBillingAddress(newBillingAddress.getKey());
checkoutData.setNewCustomerBillingAddress(addressData);
update = true;
}
}
if (!_.isUndefined(update)) {
this.updateAddresses();
}
},
/**
* Edit address action
*/
editAddress: function () {
lastSelectedBillingAddress = quote.billingAddress();
quote.billingAddress(null);
this.isAddressDetailsVisible(false);
},
/**
* Cancel address edit action
*/
cancelAddressEdit: function () {
this.restoreBillingAddress();
if (quote.billingAddress()) {
// restore 'Same As Shipping' checkbox state
this.isAddressSameAsShipping(
quote.billingAddress() != null &&
quote.billingAddress().getCacheKey() == quote.shippingAddress().getCacheKey() && //eslint-disable-line
!quote.isVirtual()
);
this.isAddressDetailsVisible(true);
}
},
/**
* Restore billing address
*/
restoreBillingAddress: function () {
if (lastSelectedBillingAddress != null) {
selectBillingAddress(lastSelectedBillingAddress);
}
},
/**
* @param {Object} address
*/
onAddressChange: function (address) {
if (address == newAddressOption) {
this.autoFillAddress('co-billing-form');
}
this.isAddressFormVisible(address == newAddressOption); //eslint-disable-line eqeqeq
},
/**
* @param {Number} countryId
* @return {*}
*/
getCountryName: function (countryId) {
return countryData()[countryId] != undefined ? countryData()[countryId].name : ''; //eslint-disable-line
},
/**
* Trigger action to update shipping and billing addresses
*/
updateAddresses: function () {
if (window.checkoutConfig.reloadOnBillingAddress ||
!window.checkoutConfig.displayBillingOnPaymentMethod
) {
setBillingAddressAction(globalMessageList);
}
},
/**
* Get code
* @param {Object} parent
* @returns {String}
*/
getCode: function (parent) {
return _.isFunction(parent.getCode) ? parent.getCode() : 'shared';
},
/**
* Auto Fill Address
* @param element
*/
autoFillAddress: function (element) {
var self = this;
if (typeof(element) === "object") {
var formId = element.id;
} else if (typeof(element) === "string") {
var formId = element.replace("#", "");
}
if (addressList().length === 0 || typeof(element) === "string") {
setTimeout(function(){
var streetId = $('#' + formId + ' [name="street[0]"]').id;
var street = $('#' + formId + ' [name="street[0]"]').val();
if (street == '') {
self.fillCountry(formId);
}
}, 1000);
}
},
/**
* Fill Address
* @param address
* @param id
*/
fillInAddress: function (address, id) {
var componentFields = [
'country_id',
'postcode',
'region_id',
'region',
'city',
'street'
];
var country = false,
countryList = window.checkoutConfig.OnePageCheckout.googleApiListCountries,
useRegionId = false,
countryElement = false,
regionIdElement = false,
component = 'checkout.steps.billing-step.payment.payments-list.billing-address-form-shared.form-fields';
registry.get(component, function (formComponent) {
$.each(componentFields, function (index, field) {
var element = formComponent.getChild(field);
if (field === 'region') {
element = formComponent.getChild('region_id_input');
}
if (field == 'country_id' && field in address) {
$('#' + element.uid).find('option').each(function () {
if ($(this).attr('value') == address[field]) {
var currentCountry = element.value();
element.value(address[field]);
country = address[field];
countryElement = element;
if (($.inArray(currentCountry, countryList) === -1 && $.inArray(address[field], countryList) !== -1) ||
($.inArray(currentCountry, countryList) !== -1 && $.inArray(address[field], countryList) !== -1 && currentCountry != address[field])
) {
element.trigger('change');
}
return false;
}
});
}
if (field == 'region_id' && field in address && country != false && $.inArray(country, countryList) !== -1) {
$('#' + element.uid).find('option').each(function () {
if ($(this).attr('data-title') == address[field]) {
element.value($(this).attr('value'));
regionIdElement = element;
return false;
}
});
useRegionId = true;
}
if (field == 'region' && country != false && useRegionId == false) {
if ('region_id' in address) {
element.value(address['region_id']);
} else {
element.value('');
}
}
if (field == 'street' && field in address) {
element = formComponent.getChild(field).getChild(0);
element.value(address[field]);
}
if ((field == 'postcode' || field == 'city')) {
if (field in address) {
element.value(address[field]);
} else {
element.value('');
}
}
});
});
if (country != '' && component == shipping) {
if (useRegionId == true && regionIdElement != false) {
regionIdElement.trigger('change');
} else {
if (countryElement != false) {
countryElement.trigger('change');
}
}
}
},
/**
* Fill Country
* @param id
* @param countryCode
*/
fillCountry: function (formId) {
var countryCode = window.checkoutConfig.OnePageCheckout.googleApiCustomerCountry,
countrySelector = $('#' + formId + ' [name="country_id"]'),
currentCountry = countrySelector.val();
if (currentCountry == countryCode) {
return;
}
countrySelector.find('option').each(function () {
if ($(this).attr('value') == countryCode) {
countrySelector.val(countryCode);
countrySelector.trigger('change');
return false;
}
});
},
/**
* Get customer attribute label
*
* @param {*} attribute
* @returns {*}
*/
getCustomAttributeLabel: function (attribute) {
var resultAttribute;
if (typeof attribute === 'string') {
return attribute;
}
if (attribute.label) {
return attribute.label;
}
resultAttribute = _.findWhere(this.source.get('customAttributes')[attribute['attribute_code']], {
value: attribute.value
});
return resultAttribute && resultAttribute.label || attribute.value;
}
});
});
define([
'uiComponent',
'Magento_Checkout/js/model/payment/additional-validators',
'Rokanthemes_OnePageCheckout/js/model/create-new-account-validator'
], function (Component, additionalValidators, agreementValidator) {
'use strict';
additionalValidators.registerValidator(agreementValidator);
return Component.extend({});
});
define([
'moment',
'Magento_Ui/js/form/element/date',
'Rokanthemes_OnePageCheckout/js/lib/jquery/jquery-ui-addon-slider-access'
], function (moment, coreDate) {
'use strict';
return coreDate.extend({
defaults: {
options: {
addSliderAccess: true,
sliderAccessArgs: { touchonly: false }
},
},
/**
* Prepares and sets date/time value that will be sent
* to the server.
*
* @param {String} shiftedValue
*/
onShiftedValueChange: function (shiftedValue) {
var value,
formattedValue,
momentValue;
if (shiftedValue) {
momentValue = moment(shiftedValue, this.pickerDateTimeFormat);
if (this.options.showsTime) {
formattedValue = moment(momentValue).format(this.timezoneFormat);
value = moment.tz(formattedValue, this.storeTimeZone).tz('UTC').toISOString();
} else {
value = momentValue.format(this.outputDateFormat);
}
} else {
value = '';
}
if (value !== this.value() && !this.options.showsTime) {
this.value(value);
}
},
});
});
define([
'jquery',
'Magento_Checkout/js/view/form/element/email',
'mage/validation'
], function ($, Component) {
'use strict';
return Component.extend({
defaults: {
template: 'Rokanthemes_OnePageCheckout/form/element/email',
createNewAccount: false
},
checkDelay: 1000,
initObservable: function () {
this._super()
.observe(['email', 'emailFocused', 'isLoading', 'isPasswordVisible', 'createNewAccount']);
return this;
},
createNewAccountConfig: function () {
return window.checkoutConfig.OnePageCheckout.autoCreateNewAccount.enable;
},
createNewAccountChecked: function (element) {
if ($('#' + element).is(":checked")) {
this.createNewAccount(true);
} else {
this.createNewAccount(false);
}
},
minLength: function () {
return window.checkoutConfig.OnePageCheckout.autoCreateNewAccount.minLength;
},
minCharacterSets: function () {
return window.checkoutConfig.OnePageCheckout.autoCreateNewAccount.minCharacterSets;
}
});
});
define([
'uiRegistry',
'Magento_Ui/js/form/element/region'
], function (registry, Component) {
'use strict';
return Component.extend({
/**
* @inheritdoc
*/
filter: function (value, field) {
var country = registry.get(this.parentName + '.' + 'country_id');
if (country) {
this._super(value, field);
}
}
});
});
define([
'ko',
'uiComponent',
'Rokanthemes_OnePageCheckout/js/model/gift-message',
'Rokanthemes_OnePageCheckout/js/action/gift-options'
], function (ko, Component, GiftMessage, giftOptionsService) {
'use strict';
return Component.extend({
formBlockVisibility: null,
resultBlockVisibility: null,
model: {},
isLoading: ko.observable(false),
/**
* Component init
*/
initialize: function () {
var self = this,
model;
this._super()
.observe('formBlockVisibility')
.observe({
'resultBlockVisibility': false
});
this.itemId = this.itemId || 'orderLevel';
this.model = new GiftMessage(this.itemId);
this.model.getObservable('isClear').subscribe(function (value) {
if (value == true) {
self.formBlockVisibility(false);
self.model.getObservable('alreadyAdded')(true);
}
});
this.model.afterSubmit = function () {
self.hideFormBlock();
self.resultBlockVisibility(false);
self.isLoading(false);
};
this.isResultBlockVisible();
},
/**
* Is reslt block visible
*/
isResultBlockVisible: function () {
var self = this;
if (this.model.getObservable('alreadyAdded')()) {
this.resultBlockVisibility(true);
}
this.model.getObservable('additionalOptionsApplied').subscribe(function (value) {
if (value == true) { //eslint-disable-line eqeqeq
self.resultBlockVisibility(true);
}
});
},
/**
* @param {String} key
* @return {*}
*/
getObservable: function (key) {
return this.model.getObservable(key);
},
/**
* Hide\Show form block
*/
toggleFormBlockVisibility: function () {
if (!this.model.getObservable('alreadyAdded')()) {
this.formBlockVisibility(!this.formBlockVisibility());
} else {
this.resultBlockVisibility(!this.resultBlockVisibility());
}
},
/**
* Edit options
*/
editOptions: function () {
this.resultBlockVisibility(false);
this.formBlockVisibility(true);
},
/**
* Delete options
*/
deleteOptions: function () {
this.isLoading(true);
giftOptionsService(this.model);
this.model.getObservable('alreadyAdded')(false);
},
/**
* Hide form block
*/
hideFormBlock: function () {
this.formBlockVisibility(false);
if (this.model.getObservable('alreadyAdded')()) {
this.resultBlockVisibility(true);
}
},
/**
* @return {Boolean}
*/
hasActiveOptions: function () {
var regionData = this.getRegion('additionalOptions'),
options = regionData(),
i;
for (i = 0; i < options.length; i++) {
if (options[i].isActive()) {
return true;
}
}
return false;
},
/**
* @return {Boolean}
*/
isActive: function () {
return this.model.isGiftMessageAvailable();
},
/**
* Submit options
*/
submitOptions: function () {
this.isLoading(true);
giftOptionsService(this.model);
this.model.getObservable('alreadyAdded')(true);
}
});
});
define([
'uiComponent',
'uiRegistry',
'underscore',
'Magento_Checkout/js/model/quote',
'Magento_Checkout/js/action/select-billing-address',
'Rokanthemes_OnePageCheckout/js/model/payment-service',
'Magento_Checkout/js/model/totals',
'Rokanthemes_OnePageCheckout/js/action/set-shipping-information',
'Magento_Checkout/js/model/shipping-service',
'Magento_Customer/js/model/customer',
'Rokanthemes_OnePageCheckout/js/model/update-item-service'
], function (
Component,
registry,
_,
quote,
selectBillingAddress,
paymentService,
totalsService,
setShippingInformationAction,
shippingService,
customer,
updateItemService
) {
'use strict';
return Component.extend({
/** @inheritdoc */
initialize: function () {
this._super();
var self = this;
quote.shippingMethod.subscribe(function (method) {
if (method && !updateItemService.hasUpdateResult()) {
var shippingRates = shippingService.getShippingRates();
var availableRate = _.find(shippingRates(), function (rate) {
if (rate['method_code'] === null && method['method_code'] === null) {
return false;
}
return rate['carrier_code'] + '_' + rate['method_code'] === method['carrier_code'] + '_' + method['method_code'];
});
if (availableRate) {
if (self._isAddressSameAsShipping()) {
selectBillingAddress(quote.shippingAddress());
}
paymentService.isLoading(true);
totalsService.isLoading(true);
setShippingInformationAction().done(
function () {
paymentService.isLoading(false);
totalsService.isLoading(false);
}
);
}
}
}, this);
if (!customer.isLoggedIn()) {
quote.shippingAddress.subscribe(function (address) {
if (_.isUndefined(address.street) || address.street.length == 0) {
address.street = ["", ""];
}
}, this);
}
},
/**
* @returns {*}
*/
_isAddressSameAsShipping: function () {
return registry.get('checkout.steps.billing-step.payment.payments-list.billing-address-form-shared').isAddressSameAsShipping();
}
});
});
define(
[
'jquery',
'ko',
'uiComponent'
],
function (
$,
ko,
Component
) {
'use strict';
return Component.extend({
defaults: {
template: 'Rokanthemes_OnePageCheckout/widget/opc-widget'
},
getOpcWidget: function (position) {
var widgetList = window.checkoutConfig.opcWidget,
result = ko.observableArray([]);
if (position == "widget_after_placeorder") {
$.each(widgetList.widget_after_placeorder, function (index, value) {
result.push(value);
});
}
return result;
}
});
}
);
define([
'jquery',
'underscore',
'uiComponent',
'ko',
'Magento_Checkout/js/model/quote',
'Rokanthemes_OnePageCheckout/js/model/step-navigator',
'Magento_Checkout/js/model/payment-service',
'Magento_Checkout/js/model/payment/method-converter',
'Magento_Checkout/js/action/get-payment-information',
'Magento_Checkout/js/model/checkout-data-resolver',
'mage/translate',
'Rokanthemes_OnePageCheckout/js/model/payment-service'
], function (
$,
_,
Component,
ko,
quote,
stepNavigator,
paymentService,
methodConverter,
getPaymentInformation,
checkoutDataResolver,
$t,
paymentServiceCt
) {
'use strict';
/** Set payment methods to collection */
paymentService.setPaymentMethods(methodConverter(window.checkoutConfig.paymentMethods));
return Component.extend({
defaults: {
template: 'Magento_Checkout/payment',
activeMethod: ''
},
isVisible: ko.observable(true),
quoteIsVirtual: quote.isVirtual(),
isLoading: paymentServiceCt.isLoading,
isPaymentMethodsAvailable: ko.computed(function () {
return paymentService.getAvailablePaymentMethods().length > 0;
}),
/** @inheritdoc */
initialize: function () {
this._super();
checkoutDataResolver.resolvePaymentMethod();
stepNavigator.registerStep(
'payment',
null,
$t('Review & Payments'),
this.isVisible,
_.bind(this.navigate, this),
20
);
this.navigate();
return this;
},
/**
* Navigate method.
*/
navigate: function () {
var self = this;
getPaymentInformation().done(function () {
self.isVisible(true);
});
},
/**
* @return {*}
*/
getFormKey: function () {
return window.checkoutConfig.formKey;
}
});
});
define(
[
'jquery',
'ko',
'uiComponent',
'Magento_Checkout/js/model/quote',
'Magento_SalesRule/js/action/set-coupon-code',
'Magento_SalesRule/js/action/cancel-coupon',
'Rokanthemes_OnePageCheckout/js/model/payment-service'
],
function ($, ko, Component, quote, setCouponCodeAction, cancelCouponAction, paymentServiceOpc) {
'use strict';
var totals = quote.getTotals(),
couponCode = ko.observable(null),
isApplied = paymentServiceOpc.isAppliedCoupon;
if (totals()) {
couponCode(totals()['coupon_code']);
}
return Component.extend({
defaults: {
template: 'Magento_SalesRule/payment/discount'
},
couponCode: couponCode,
/**
* Applied flag
*/
isApplied: isApplied,
/**
* Coupon code application procedure
*/
apply: function() {
if (this.validate()) {
setCouponCodeAction(couponCode(), isApplied);
}
},
/**
* Cancel using coupon
*/
cancel: function() {
if (this.validate()) {
couponCode('');
cancelCouponAction(isApplied);
}
},
/**
* Coupon form validation
*
* @returns {Boolean}
*/
validate: function () {
var form = '#discount-form';
return $(form).validation() && $(form).validation('isValid');
}
});
}
);
define([
'underscore',
'Magento_Checkout/js/view/payment/list'
], function (_, Component) {
'use strict';
return Component.extend({
/** @inheritdoc */
initialize: function () {
this._super();
},
/**
* Returns payment group title
*
* @param {Object} group
* @returns {String}
*/
getGroupTitle: function (group) {
var title = group().title;
if (group().isDefault() && this.paymentGroupsList().length > 1) {
title = this.defaultGroupTitle;
}
return title;
},
/**
* @param {Object} group
* @returns {Boolean}
*/
showFormShared: function (group) {
var isShow = false;
if (this.paymentGroupsList().length) {
if (_.first(this.paymentGroupsList()).alias == group().alias) {
isShow = true;
}
}
return isShow;
}
});
});
define([
'jquery',
'uiRegistry',
'Magento_Checkout/js/model/quote',
'Magento_Checkout/js/model/payment/additional-validators',
'Magento_Paypal/js/in-context/express-checkout-smart-buttons',
'Rokanthemes_OnePageCheckout/js/action/validate-shipping-information',
'Magento_Checkout/js/action/select-billing-address',
'Magento_Checkout/js/model/full-screen-loader',
'mage/translate'
], function ($, registry, quote, additionalValidators, checkoutSmartButtons, validateShippingInformationAction, selectBillingAddress, fullScreenLoader) {
'use strict';
var buttonId = 'paypay-in-context-button',
errorId = 'paypay-in-context-validate-error',
html = '<p id="' + errorId + '" style="display:none">' + $.mage.__('Please Fill All Require Field!') + '</p><p class="action primary" id="' + buttonId + '" style="display:none">' + $.mage.__('Continue Paypal') + '</p>',
mixin = {
/**
* Listens element on change and validate it.
*
* @param {HTMLElement} context
*/
initListeners: function (context) {
$(context).find('.payment-method-content').append(html);
var seft = this;
quote.billingAddress.subscribe(function (address) {
if (quote.isVirtual()) {
if (address !== null && quote.paymentMethod() != null) {
$('#' + buttonId).removeClass('disable');
return;
}
} else {
if (address !== null && quote.paymentMethod() != null && quote.shippingMethod() != null) {
$('#' + buttonId).removeClass('disable');
return;
}
}
if (!$('#' + buttonId).hasClass('disable')) {
$('#' + buttonId).addClass('disable');
}
}, this);
this.customValidate(seft);
$('#' + buttonId).click(function () {
if (!$(this).hasClass('disable')) {
$(this).addClass('disable');
seft.customValidate(seft);
}
})
this.fieldChange();
},
/**
* Validates Smart Buttons
*/
validate: function () {
if (this.actions) {
this.actions.enable();
}
},
fieldChange: function () {
$('input[type=radio], input[type=checkbox], select').change(function () {
$('#' + buttonId).parent().find('.actions-toolbar').html('');
$('#' + buttonId).show();
$('#' + errorId).hide();
$('#' + buttonId).removeClass('disable');
if ($(this).val() == 'paypal_express') {
$('#' + buttonId).trigger('click');
}
});
$("input[type=text], textarea").keyup(function(){
$('#' + buttonId).parent().find('.actions-toolbar').html('');
$('#' + buttonId).show();
$('#' + buttonId).removeClass('disable');
});
$("input[type=text], textarea").keydown(function(){
$('#' + buttonId).parent().find('.actions-toolbar').html('');
$('#' + buttonId).show();
$('#' + buttonId).removeClass('disable');
});
},
customValidate: function (seft) {
var shippingAddressComponent = registry.get('checkout.steps.shipping-step.shippingAddress');
if (additionalValidators.validate() == true) {
if (!quote.isVirtual()) {
if (shippingAddressComponent.validateShippingInformation()) {
validateShippingInformationAction().done(
function () {
$('#' + buttonId).hide();
$('#' + errorId).hide();
checkoutSmartButtons(seft.prepareClientConfig(), window.paypalElement);
}
).fail(
function () {
$('#' + buttonId).show();
$('#' + errorId).show();
$('#' + buttonId).removeClass('disable');
fullScreenLoader.stopLoader();
}
);
return;
}
}
}
$('#' + buttonId).show();
$('#' + errorId).show();
$('#' + buttonId).removeClass('disable');
}
};
return function (target) {
return target.extend(mixin);
};
});
define([
'ko',
'jquery',
'uiComponent',
'uiRegistry',
'mage/translate',
'Magento_Checkout/js/model/quote',
'Rokanthemes_OnePageCheckout/js/model/shipping-rate-processor/new-address',
'Rokanthemes_OnePageCheckout/js/model/shipping-rate-processor/customer-address',
'Rokanthemes_OnePageCheckout/js/action/validate-shipping-information',
// 'Rokanthemes_OnePageCheckout/js/action/validate-gift-wrap-before-order',
'Magento_Checkout/js/model/full-screen-loader',
'Magento_Checkout/js/action/select-billing-address',
'Magento_Checkout/js/model/payment/additional-validators',
'Magento_Checkout/js/model/shipping-service',
'Magento_Checkout/js/model/shipping-rate-registry',
'underscore',
'Magento_Ui/js/modal/alert',
'Magento_Checkout/js/checkout-data',
'Magento_Checkout/js/model/totals',
'Amazon_Payment/js/model/storage'
], function (
ko,
$,
Component,
registry,
$t,
quote,
DefaultProcessor,
CustomerAddressProcessor,
validateShippingInformationAction,
// validateGiftWrapAction,
fullScreenLoader,
selectBillingAddress,
additionalValidators,
shippingService,
rateRegistry,
_,
alert,
checkoutData,
totals,
amazonStorage
) {
'use strict';
return Component.extend({
defaults: {
template: 'Rokanthemes_OnePageCheckout/place-order-btn'
},
placeOrderLabel: ko.observable($t(window.checkoutConfig.OnePageCheckout.titlePlaceOrder)),
isVisible: ko.observable(true),
isPlaceOrderActionAllowed: ko.observable(quote.billingAddress() != null && quote.paymentMethod() != null),
/** @inheritdoc */
initialize: function () {
window.isPlaceOrderDispatched = false;
this._super();
var self = this;
quote.billingAddress.subscribe(function (address) {
if (quote.isVirtual()) {
setTimeout(function () {
self.isPlaceOrderActionAllowed(address !== null && quote.paymentMethod() != null);
}, 500);
} else {
self.isPlaceOrderActionAllowed(address !== null && quote.paymentMethod() != null && quote.shippingMethod() != null);
}
}, this);
quote.paymentMethod.subscribe(function (newMethod) {
if (quote.isVirtual()) {
self.isPlaceOrderActionAllowed(newMethod !== null && quote.billingAddress() != null);
} else {
self.isPlaceOrderActionAllowed(newMethod !== null && quote.billingAddress() != null && quote.shippingMethod() != null);
}
if ((newMethod.method === "amazonlogin" && !amazonStorage.isAmazonAccountLoggedIn()) ||
newMethod.method === "braintree_paypal"
) {
self.isVisible(false);
}
}, this);
if (!quote.isVirtual()) {
quote.shippingMethod.subscribe(function (method) {
var availableRate,
shippingRates = shippingService.getShippingRates();
if (method) {
availableRate = _.find(shippingRates(), function (rate) {
return rate['carrier_code'] + '_' + rate['method_code'] === method['carrier_code'] + '_' + method['method_code'];
});
}
self.isPlaceOrderActionAllowed(availableRate && quote.paymentMethod() != null && quote.billingAddress() != null);
}, this);
}
if (
window.checkoutConfig.paypal_in_context == true || !_.isEmpty(window.checkoutConfig.amazonLogin)
) {
var selectedPaymentMethod = checkoutData.getSelectedPaymentMethod();
if (selectedPaymentMethod == "paypal_express" ||
selectedPaymentMethod == "amazonlogin" ||
selectedPaymentMethod == "braintree_paypal") {
self.isVisible(false);
}
$(document).on('change', '.payment-method .radio', function () {
if ($('.payment-method._active').find('.actions-toolbar').is('#paypal-express-in-context-button') ||
($(this).attr('id') === 'amazonlogin') ||
($(this).attr('id') === 'braintree_paypal')
) {
self.isVisible(false);
} else {
self.isVisible(true);
}
});
}
},
placeOrder: function (data, event) {
var self = this;
var shippingAddressComponent = registry.get('checkout.steps.shipping-step.shippingAddress');
window.isPlaceOrderDispatched = true;
if (event) {
event.preventDefault();
}
if (additionalValidators.validate()) {
if (quote.isVirtual()) {
$('input#' + self.getCode())
.closest('.payment-method').find('.payment-method-content .actions-toolbar:not([style*="display: none"]) button.action.checkout')
.trigger('click');
} else {
if (shippingAddressComponent.validateShippingInformation()) {
var reSelectShippingAddress = false;
if (typeof window.shippingAddress !== "undefined" || !$.isEmptyObject(window.shippingAddress)) {
quote.shippingAddress(window.shippingAddress);
var type = quote.shippingAddress().getType();
if (type == 'customer-address') {
var cache = rateRegistry.get(quote.shippingAddress().getKey());
if (!cache) {
reSelectShippingAddress = true;
CustomerAddressProcessor(quote.shippingAddress()).done(function (result) {
self.placeOrderContinue();
}).fail(function (response) {
}).always(function () {
window.shippingAddress = {};
});
} else {
window.shippingAddress = {};
}
} else {
var cache = rateRegistry.get(quote.shippingAddress().getCacheKey());
if (!cache) {
reSelectShippingAddress = true;
DefaultProcessor(quote.shippingAddress()).done(function (result) {
self.placeOrderContinue();
}).fail(function (response) {
}).always(function () {
window.shippingAddress = {};
});
} else {
window.shippingAddress = {};
}
}
}
if (!reSelectShippingAddress) {
self.placeOrderContinue();
}
}
}
}
return false;
},
placeOrderContinue: function () {
var self = this;
var billingAddressComponent = registry.get('checkout.steps.billing-step.payment.payments-list.billing-address-form-shared');
if (billingAddressComponent.isAddressSameAsShipping()) {
fullScreenLoader.startLoader();
selectBillingAddress(quote.shippingAddress());
}
validateShippingInformationAction().done(
function () {
fullScreenLoader.stopLoader();
$('input#' + self.getCode())
.closest('.payment-method').find('.payment-method-content .actions-toolbar:not([style*="display: none"]) button.action.checkout')
.trigger('click');
}
).fail(
function () {
fullScreenLoader.stopLoader();
}
);
},
getCode: function () {
return quote.paymentMethod().method;
}
});
});
define([
'underscore',
'ko',
'mageUtils',
'Magento_Checkout/js/view/shipping-address/list',
'uiLayout'
], function (_, ko, utils, Component, layout) {
'use strict';
var defaultRendererTemplate = {
parent: '${ $.$data.parentName }',
name: '${ $.$data.name }',
component: 'Magento_Checkout/js/view/shipping-address/address-renderer/default',
template: 'Rokanthemes_OnePageCheckout/shipping-address/address-renderer/default'
};
return Component.extend({
/**
* Create new component that will render given address in the address list
*
* @param {Object} address
* @param {*} index
*/
createRendererComponent: function (address, index) {
var rendererTemplate, templateData, rendererComponent;
if (index in this.rendererComponents) {
this.rendererComponents[index].address(address);
} else {
// rendererTemplates are provided via layout
rendererTemplate = address.getType() != undefined && this.rendererTemplates[address.getType()] != undefined ? //eslint-disable-line
utils.extend({}, defaultRendererTemplate, this.rendererTemplates[address.getType()]) :
defaultRendererTemplate;
templateData = {
parentName: this.name,
name: index
};
rendererComponent = utils.template(rendererTemplate, templateData);
utils.extend(rendererComponent, {
address: ko.observable(address)
});
layout([rendererComponent]);
this.rendererComponents[index] = rendererComponent;
}
}
});
});
define([
'jquery',
'underscore',
'Magento_Ui/js/form/form',
'ko',
'Magento_Customer/js/model/customer',
'Magento_Customer/js/model/address-list',
'Magento_Checkout/js/model/address-converter',
'Magento_Checkout/js/model/quote',
'Magento_Checkout/js/action/create-shipping-address',
'Magento_Checkout/js/action/select-shipping-address',
'Rokanthemes_OnePageCheckout/js/model/shipping-rates-validator',
'Magento_Checkout/js/model/shipping-address/form-popup-state',
'Magento_Checkout/js/model/shipping-service',
'Magento_Checkout/js/action/select-shipping-method',
'Magento_Checkout/js/model/shipping-rate-registry',
'Magento_Checkout/js/action/set-shipping-information',
'Magento_Checkout/js/model/step-navigator',
'Magento_Ui/js/modal/modal',
'Magento_Checkout/js/model/checkout-data-resolver',
'Magento_Checkout/js/checkout-data',
'uiRegistry',
'mage/translate',
'Magento_Checkout/js/model/shipping-rate-service'
], function (
$,
_,
Component,
ko,
customer,
addressList,
addressConverter,
quote,
createShippingAddress,
selectShippingAddress,
shippingRatesValidator,
formPopUpState,
shippingService,
selectShippingMethodAction,
rateRegistry,
setShippingInformationAction,
stepNavigator,
modal,
checkoutDataResolver,
checkoutData,
registry,
$t
) {
'use strict';
var popUp = null;
return Component.extend({
defaults: {
template: 'Magento_Checkout/shipping',
shippingFormTemplate: 'Rokanthemes_OnePageCheckout/shipping-address/form',
shippingMethodListTemplate: 'Magento_Checkout/shipping-address/shipping-method-list',
shippingMethodItemTemplate: 'Magento_Checkout/shipping-address/shipping-method-item'
},
visible: ko.observable(!quote.isVirtual()),
errorValidationMessage: ko.observable(false),
isCustomerLoggedIn: customer.isLoggedIn,
isFormPopUpVisible: formPopUpState.isVisible,
isFormInline: addressList().length === 0,
isNewAddressAdded: ko.observable(false),
saveInAddressBook: 1,
quoteIsVirtual: quote.isVirtual(),
/**
* @return {exports}
*/
initialize: function () {
var self = this,
hasNewAddress,
fieldsetName = 'checkout.steps.shipping-step.shippingAddress.shipping-address-fieldset';
this._super();
if (!quote.isVirtual()) {
stepNavigator.registerStep(
'shipping',
'',
$t('Shipping'),
this.visible,
_.bind(this.navigate, this),
10
);
}
checkoutDataResolver.resolveShippingAddress();
hasNewAddress = addressList.some(function (address) {
return address.getType() == 'new-customer-address'; //eslint-disable-line eqeqeq
});
this.isNewAddressAdded(hasNewAddress);
this.isFormPopUpVisible.subscribe(function (value) {
if (value) {
self.getPopUp().openModal();
}
});
quote.shippingMethod.subscribe(function () {
self.errorValidationMessage(false);
});
registry.async('checkoutProvider')(function (checkoutProvider) {
var shippingAddressData = checkoutData.getShippingAddressFromData();
if (shippingAddressData) {
checkoutProvider.set(
'shippingAddress',
$.extend(true, {}, checkoutProvider.get('shippingAddress'), shippingAddressData)
);
}
checkoutProvider.on('shippingAddress', function (shippingAddrsData) {
checkoutData.setShippingAddressFromData(shippingAddrsData);
});
shippingRatesValidator.initFields(fieldsetName);
});
return this;
},
/**
* Navigator change hash handler.
*
* @param {Object} step - navigation step
*/
navigate: function (step) {
step && step.isVisible(true);
},
/**
* @return {*}
*/
getPopUp: function () {
var self = this,
buttons;
if (!popUp) {
buttons = this.popUpForm.options.buttons;
this.popUpForm.options.buttons = [
{
text: buttons.save.text ? buttons.save.text : $t('Save Address'),
class: buttons.save.class ? buttons.save.class : 'action primary action-save-address',
click: self.saveNewAddress.bind(self)
},
{
text: buttons.cancel.text ? buttons.cancel.text : $t('Cancel'),
class: buttons.cancel.class ? buttons.cancel.class : 'action secondary action-hide-popup',
/** @inheritdoc */
click: this.onClosePopUp.bind(this)
}
];
/** @inheritdoc */
this.popUpForm.options.closed = function () {
self.isFormPopUpVisible(false);
};
this.popUpForm.options.modalCloseBtnHandler = this.onClosePopUp.bind(this);
this.popUpForm.options.keyEventHandlers = {
escapeKey: this.onClosePopUp.bind(this)
};
/** @inheritdoc */
this.popUpForm.options.opened = function () {
// Store temporary address for revert action in case when user click cancel action
self.temporaryAddress = $.extend(true, {}, checkoutData.getShippingAddressFromData());
};
popUp = modal(this.popUpForm.options, $(this.popUpForm.element));
}
self.autoFillAddress(this.popUpForm.element);
return popUp;
},
/**
* Revert address and close modal.
*/
onClosePopUp: function () {
checkoutData.setShippingAddressFromData($.extend(true, {}, this.temporaryAddress));
this.getPopUp().closeModal();
},
/**
* Show address form popup
*/
showFormPopUp: function () {
this.isFormPopUpVisible(true);
},
/**
* Save new shipping address
*/
saveNewAddress: function () {
var addressData,
newShippingAddress;
this.source.set('params.invalid', false);
this.triggerShippingDataValidateEvent();
if (!this.source.get('params.invalid')) {
addressData = this.source.get('shippingAddress');
// if user clicked the checkbox, its value is true or false. Need to convert.
addressData['save_in_address_book'] = this.saveInAddressBook ? 1 : 0;
// New address must be selected as a shipping address
newShippingAddress = createShippingAddress(addressData);
selectShippingAddress(newShippingAddress);
checkoutData.setSelectedShippingAddress(newShippingAddress.getKey());
checkoutData.setNewCustomerShippingAddress($.extend(true, {}, addressData));
this.getPopUp().closeModal();
this.isNewAddressAdded(true);
}
},
/**
* Shipping Method View
*/
rates: shippingService.getShippingRates(),
isLoading: shippingService.isLoading,
isSelected: ko.computed(function () {
return quote.shippingMethod() ?
quote.shippingMethod()['carrier_code'] + '_' + quote.shippingMethod()['method_code'] :
null;
}),
/**
* @param {Object} shippingMethod
* @return {Boolean}
*/
selectShippingMethod: function (shippingMethod) {
selectShippingMethodAction(shippingMethod);
checkoutData.setSelectedShippingRate(shippingMethod['carrier_code'] + '_' + shippingMethod['method_code']);
return true;
},
/**
* Set shipping information handler
*/
setShippingInformation: function () {
if (this.validateShippingInformation()) {
setShippingInformationAction().done(
function () {
stepNavigator.next();
}
);
}
},
/**
* @return {Boolean}
*/
validateShippingInformation: function () {
var shippingAddress,
addressData,
loginFormSelector = 'form[data-role=email-with-possible-login]',
emailValidationResult = customer.isLoggedIn(),
field;
if (!quote.shippingMethod()) {
this.errorValidationMessage($t('Please specify a shipping method.'));
return false;
}
if (!customer.isLoggedIn()) {
$(loginFormSelector).validation();
emailValidationResult = Boolean($(loginFormSelector + ' input[name=username]').valid());
}
if (this.isFormInline) {
this.source.set('params.invalid', false);
this.triggerShippingDataValidateEvent();
if (emailValidationResult &&
this.source.get('params.invalid') ||
!quote.shippingMethod()['method_code'] ||
!quote.shippingMethod()['carrier_code']
) {
this.focusInvalid();
return false;
}
shippingAddress = quote.shippingAddress();
addressData = addressConverter.formAddressDataToQuoteAddress(
this.source.get('shippingAddress')
);
//Copy form data to quote shipping address object
for (field in addressData) {
if (addressData.hasOwnProperty(field) && //eslint-disable-line max-depth
shippingAddress.hasOwnProperty(field) &&
typeof addressData[field] != 'function' &&
_.isEqual(shippingAddress[field], addressData[field])
) {
shippingAddress[field] = addressData[field];
} else if (typeof addressData[field] != 'function' &&
!_.isEqual(shippingAddress[field], addressData[field])) {
shippingAddress = addressData;
break;
}
}
if (customer.isLoggedIn()) {
shippingAddress['save_in_address_book'] = 1;
}
window.shippingAddress = shippingAddress;
//selectShippingAddress(shippingAddress);
}
if (!emailValidationResult) {
$(loginFormSelector + ' input[name=username]').focus();
return false;
}
return true;
},
/**
* Trigger Shipping data Validate Event.
*/
triggerShippingDataValidateEvent: function () {
this.source.trigger('shippingAddress.data.validate');
if (this.source.get('shippingAddress.custom_attributes')) {
this.source.trigger('shippingAddress.custom_attributes.data.validate');
}
},
/**
* Auto Fill Address
* @param element
*/
autoFillAddress: function (element) {
var self = this;
if (typeof(element) === "object") {
var formId = element.id;
} else if (typeof(element) === "string") {
var formId = element.replace("#", "");
}
if (this.isFormInline || typeof(element) === "string") {
setTimeout(function(){
var streetId = $('#' + formId + ' [name="street[0]"]').id;
var street = $('#' + formId + ' [name="street[0]"]').val();
if (street == '') {
self.fillCountry(formId);
}
}, 500);
}
},
/**
* Fill Address
* @param address
* @param id
*/
fillInAddress: function (address, id) {
var componentFields = [
'country_id',
'postcode',
'region_id',
'region',
'city',
'street'
];
var country = false,
countryList = window.checkoutConfig.OnePageCheckout.googleApiListCountries,
useRegionId = false,
countryElement = false,
regionIdElement = false,
component = 'checkout.steps.shipping-step.shippingAddress.shipping-address-fieldset';
registry.get(component, function (formComponent) {
$.each(componentFields, function (index, field) {
var element = formComponent.getChild(field);
if (field === 'region') {
element = formComponent.getChild('region_id_input');
}
if (field == 'country_id' && field in address) {
$('#' + element.uid).find('option').each(function () {
if ($(this).attr('value') == address[field]) {
var currentCountry = element.value();
element.value(address[field]);
country = address[field];
countryElement = element;
if (($.inArray(currentCountry, countryList) === -1 && $.inArray(address[field], countryList) !== -1) ||
($.inArray(currentCountry, countryList) !== -1 && $.inArray(address[field], countryList) !== -1 && currentCountry != address[field])
) {
element.trigger('change');
}
return false;
}
});
}
if (field == 'region_id' && field in address && country != false && $.inArray(country, countryList) !== -1) {
$('#' + element.uid).find('option').each(function () {
if ($(this).attr('data-title') == address[field]) {
element.value($(this).attr('value'));
regionIdElement = element;
return false;
}
});
useRegionId = true;
}
if (field == 'region' && country != false && useRegionId == false) {
if ('region_id' in address) {
element.value(address['region_id']);
} else {
element.value('');
}
}
if (field == 'street' && field in address) {
element = formComponent.getChild(field).getChild(0);
element.value(address[field]);
}
if ((field == 'postcode' || field == 'city')) {
if (field in address) {
element.value(address[field]);
} else {
element.value('');
}
}
});
});
if (country != '' && component == shipping) {
if (useRegionId == true && regionIdElement != false) {
regionIdElement.trigger('change');
} else {
if (countryElement != false) {
countryElement.trigger('change');
}
}
}
},
/**
* Fill Country
* @param id
* @param countryCode
*/
fillCountry: function (formId) {
var countryCode = window.checkoutConfig.OnePageCheckout.googleApiCustomerCountry,
countrySelector = $('#' + formId + ' [name="country_id"]'),
currentCountry = countrySelector.val();
if (currentCountry == countryCode) {
return;
}
countrySelector.find('option').each(function () {
if ($(this).attr('value') == countryCode) {
countrySelector.val(countryCode);
countrySelector.trigger('change');
return false;
}
});
}
});
});
define([
'jquery',
'Magento_Checkout/js/view/summary/item/details',
'mage/translate',
'ko',
'underscore',
'Magento_Customer/js/customer-data',
'Rokanthemes_OnePageCheckout/js/action/update-item',
'Magento_Checkout/js/model/quote'
], function ($, Component, $t, ko, _, customerData, updateItemAction, quote) {
'use strict';
return Component.extend({
defaults: {
template: 'Rokanthemes_OnePageCheckout/summary/item/details'
},
titleQtyBox: ko.observable($t('Qty')),
number: null,
/**
* @param {Object} item
* @returns void
*/
updateQty: function (item) {
if (item.qty < 0) {
$(".error-message[itemId = '" + item.item_id + "']").text($t('Please enter the number greater than or equal to 0!'));
return;
}
if (parseFloat(item.qty) != item.qty) {
$(".error-message[itemId = '" + item.item_id + "']").text($t('Please enter number!'));
return;
}
$(".error-message[itemId = '" + item.item_id + "']").text($t(''));
updateItemAction(item).done(
function (response) {
var totals = response.totals,
data = JSON.parse(this.data),
itemId = data.itemId,
itemsOrigin = [],
quoteItemData = window.checkoutConfig.quoteItemData;
if (!response.status) {
var originItem = _.find(quoteItemData, function (index) {
return index.item_id == itemId;
});
$.each(totals.items, function (index) {
if (this.item_id == originItem.item_id) {
this.qty = originItem.qty;
}
itemsOrigin[index] = this;
});
totals.items = itemsOrigin;
} else {
customerData.reload('cart');
}
quote.setTotals(totals);
}
);
},
/**
* @param data
* @param event
*/
updateQtyButton: function (data, event) {
var element = event.target,
action = element.getAttribute('action'),
itemId = element.getAttribute('itemId'),
qtyInput = $('[itemId = ' + itemId + ']').parent().parent().find('input');
if (typeof action === "undefined" || typeof itemId === "undefined" || typeof qtyInput === "undefined") {
return;
}
var currentQty = parseFloat(qtyInput.val());
currentQty = Math.round(currentQty * 100);
if (this.number != null && currentQty >= 100) {
clearTimeout(this.number);
}
if (action == 'increase') {
var nextQty = (currentQty + 100)/100;
nextQty = +nextQty.toFixed(2);
qtyInput.val(nextQty);
this.number = setTimeout(function () {
qtyInput.trigger('change');
}, 1000);
} else {
if (currentQty >= 100) {
var nextQty = (currentQty - 100)/100;
nextQty = +nextQty.toFixed(2);
qtyInput.val(nextQty);
this.number = setTimeout(function () {
qtyInput.trigger('change');
}, 1000);
}
}
},
/**
* @param {*} itemId
* @returns {String}
*/
getProductUrl: function (itemId) {
if (_.isUndefined(customerData.get('cart')())) {
customerData.reload('cart');
}
var productUrl = 'javascript:void(0)',
cartData = customerData.get('cart')(),
items = cartData.items;
var item = _.find(items, function (item) {
return item.item_id == itemId;
});
if (!_.isUndefined(item) && item.product_has_url) {
productUrl = item.product_url;
}
return productUrl;
}
});
});
define([
'uiComponent',
'Magento_Checkout/js/model/payment/additional-validators',
'Rokanthemes_OnePageCheckout/js/model/agreement-validator'
], function (Component, additionalValidators, agreementValidator) {
'use strict';
additionalValidators.registerValidator(agreementValidator);
return Component.extend({});
});
define([
'uiComponent',
'jquery',
'ko',
'Amazon_Payment/js/model/storage',
'Magento_Checkout/js/model/shipping-rate-service',
'Rokanthemes_OnePageCheckout/js/action/payment-total-information',
'Rokanthemes_OnePageCheckout/js/model/compatible/amazon-pay',
'Magento_Checkout/js/model/quote'
], function (Component, $, ko, amazonStorage, shippingService, getPaymentTotalInformation, amazonPay, quote) {
'use strict';
return Component.extend({
defaults: {
template: 'Amazon_Payment/shipping-address/inline-form',
formSelector: 'co-shipping-form'
},
/**
* Init inline form
*/
initObservable: function () {
this._super();
amazonStorage.isAmazonAccountLoggedIn.subscribe(function (value) {
if (value == false) {
window.checkoutConfig.OnePageCheckout.isAmazonAccountLoggedIn = value;
amazonPay.setLogin(value);
if (!quote.isVirtual()) {
shippingService.estimateShippingMethod();
}
getPaymentTotalInformation();
}
var elem = document.getElementById(this.formSelector);
if (elem && value === false) {
document.getElementById(this.formSelector).style.display = 'block';
}
}, this);
return this;
},
/**
* Show/hide inline form
*/
manipulateInlineForm: function () {
if (amazonStorage.isAmazonAccountLoggedIn()) {
window.checkoutConfig.OnePageCheckout.isAmazonAccountLoggedIn = true;
amazonPay.setLogin(true);
setTimeout(function () {
if (!quote.isVirtual()) {
shippingService.estimateShippingMethod();
}
getPaymentTotalInformation();
}, 1000);
var elem = document.getElementById(this.formSelector);
if (elem) {
document.getElementById(this.formSelector).style.display = 'none';
}
}
}
});
});
define([
'ko',
'jquery',
'underscore',
'Magento_Ui/js/form/form',
'Magento_Customer/js/model/customer',
'Magento_Customer/js/model/address-list',
'Magento_Checkout/js/model/quote',
'Magento_Checkout/js/action/create-billing-address',
'Magento_Checkout/js/action/select-billing-address',
'Magento_Checkout/js/checkout-data',
'Magento_Checkout/js/model/checkout-data-resolver',
'Magento_Customer/js/customer-data',
'Magento_Checkout/js/action/set-billing-address',
'Magento_Ui/js/model/messageList',
'mage/translate',
'uiRegistry'
], function (
ko,
$,
_,
Component,
customer,
addressList,
quote,
createBillingAddress,
selectBillingAddress,
checkoutData,
checkoutDataResolver,
customerData,
setBillingAddressAction,
globalMessageList,
$t,
registry
) {
'use strict';
var lastSelectedBillingAddress = null,
newAddressOption = {
/**
* Get new address label
* @returns {String}
*/
getAddressInline: function () {
return $t('New Address');
},
customerAddressId: null
},
countryData = customerData.get('directory-data'),
addressOptions = addressList().filter(function (address) {
return address.getType() == 'customer-address'; //eslint-disable-line eqeqeq
});
addressOptions.push(newAddressOption);
return Component.extend({
defaults: {
template: 'Rokanthemes_OnePageCheckout/billing-address'
},
currentBillingAddress: quote.billingAddress,
addressOptions: addressOptions,
customerHasAddresses: addressOptions.length > 1,
/**
* Init component
*/
initialize: function () {
var self = this;
this._super();
quote.paymentMethod.subscribe(function () {
if (self.isAddressSameAsShipping()) {
selectBillingAddress(quote.shippingAddress());
}
checkoutDataResolver.resolveBillingAddress();
}, this);
},
/**
* @return {exports.initObservable}
*/
initObservable: function () {
this._super()
.observe({
selectedAddress: null,
isAddressDetailsVisible: quote.billingAddress() != null,
isAddressFormVisible: !customer.isLoggedIn() || addressOptions.length === 1,
isAddressSameAsShipping: false,
saveInAddressBook: 1
});
quote.billingAddress.subscribe(function (newAddress) {
if (quote.isVirtual() || !quote.shippingAddress()) {
this.isAddressSameAsShipping(false);
} else {
this.isAddressSameAsShipping(
newAddress != null &&
newAddress.getCacheKey() == quote.shippingAddress().getCacheKey() //eslint-disable-line eqeqeq
);
}
if (newAddress != null && newAddress.saveInAddressBook !== undefined) {
this.saveInAddressBook(newAddress.saveInAddressBook);
} else {
this.saveInAddressBook(1);
}
this.isAddressDetailsVisible(true);
}, this);
return this;
},
canUseShippingAddress: ko.computed(function () {
return !quote.isVirtual() && quote.shippingAddress() && quote.shippingAddress().canUseForBilling();
}),
/**
* @param {Object} address
* @return {*}
*/
addressOptionsText: function (address) {
return address.getAddressInline();
},
/**
* @return {Boolean}
*/
useShippingAddress: function () {
if (this.isAddressSameAsShipping()) {
selectBillingAddress(quote.shippingAddress());
this.updateAddresses();
this.isAddressDetailsVisible(true);
} else {
lastSelectedBillingAddress = quote.billingAddress();
quote.billingAddress(null);
this.isAddressDetailsVisible(false);
}
checkoutData.setSelectedBillingAddress(null);
return true;
},
/**
* Update address action
*/
updateAddress: function () {
var addressData, newBillingAddress, update;
if (this.selectedAddress() && this.selectedAddress() != newAddressOption) { //eslint-disable-line eqeqeq
selectBillingAddress(this.selectedAddress());
checkoutData.setSelectedBillingAddress(this.selectedAddress().getKey());
update = true;
} else {
this.source.set('params.invalid', false);
this.source.trigger(this.dataScopePrefix + '.data.validate');
if (this.source.get(this.dataScopePrefix + '.custom_attributes')) {
this.source.trigger(this.dataScopePrefix + '.custom_attributes.data.validate');
}
if (!this.source.get('params.invalid')) {
addressData = this.source.get(this.dataScopePrefix);
if (customer.isLoggedIn() && !this.customerHasAddresses) { //eslint-disable-line max-depth
this.saveInAddressBook(1);
}
addressData['save_in_address_book'] = this.saveInAddressBook() ? 1 : 0;
newBillingAddress = createBillingAddress(addressData);
// New address must be selected as a billing address
selectBillingAddress(newBillingAddress);
checkoutData.setSelectedBillingAddress(newBillingAddress.getKey());
checkoutData.setNewCustomerBillingAddress(addressData);
update = true;
}
}
if (!_.isUndefined(update)) {
this.updateAddresses();
}
},
/**
* Edit address action
*/
editAddress: function () {
lastSelectedBillingAddress = quote.billingAddress();
quote.billingAddress(null);
this.isAddressDetailsVisible(false);
},
/**
* Cancel address edit action
*/
cancelAddressEdit: function () {
this.restoreBillingAddress();
if (quote.billingAddress()) {
// restore 'Same As Shipping' checkbox state
this.isAddressSameAsShipping(
quote.billingAddress() != null &&
quote.billingAddress().getCacheKey() == quote.shippingAddress().getCacheKey() && //eslint-disable-line
!quote.isVirtual()
);
this.isAddressDetailsVisible(true);
}
},
/**
* Restore billing address
*/
restoreBillingAddress: function () {
if (lastSelectedBillingAddress != null) {
selectBillingAddress(lastSelectedBillingAddress);
}
},
/**
* @param {Object} address
*/
onAddressChange: function (address) {
if (address == newAddressOption) {
this.autoFillAddress('co-billing-form');
}
this.isAddressFormVisible(address == newAddressOption); //eslint-disable-line eqeqeq
},
/**
* @param {Number} countryId
* @return {*}
*/
getCountryName: function (countryId) {
return countryData()[countryId] != undefined ? countryData()[countryId].name : ''; //eslint-disable-line
},
/**
* Trigger action to update shipping and billing addresses
*/
updateAddresses: function () {
if (window.checkoutConfig.reloadOnBillingAddress ||
!window.checkoutConfig.displayBillingOnPaymentMethod
) {
setBillingAddressAction(globalMessageList);
}
},
/**
* Get code
* @param {Object} parent
* @returns {String}
*/
getCode: function (parent) {
return _.isFunction(parent.getCode) ? parent.getCode() : 'shared';
},
/**
* Auto Fill Address
* @param element
*/
autoFillAddress: function (element) {
var self = this;
if (typeof(element) === "object") {
var formId = element.id;
} else if (typeof(element) === "string") {
var formId = element.replace("#", "");
}
if (addressList().length === 0 || typeof(element) === "string") {
setTimeout(function(){
var streetId = $('#' + formId + ' [name="street[0]"]').id;
var street = $('#' + formId + ' [name="street[0]"]').val();
if (street == '') {
self.fillCountry(formId);
}
}, 1000);
}
},
/**
* Fill Address
* @param address
* @param id
*/
fillInAddress: function (address, id) {
var componentFields = [
'country_id',
'postcode',
'region_id',
'region',
'city',
'street'
];
var country = false,
countryList = window.checkoutConfig.OnePageCheckout.googleApiListCountries,
useRegionId = false,
countryElement = false,
regionIdElement = false,
component = 'checkout.steps.billing-step.payment.payments-list.billing-address-form-shared.form-fields';
registry.get(component, function (formComponent) {
$.each(componentFields, function (index, field) {
var element = formComponent.getChild(field);
if (field === 'region') {
element = formComponent.getChild('region_id_input');
}
if (field == 'country_id' && field in address) {
$('#' + element.uid).find('option').each(function () {
if ($(this).attr('value') == address[field]) {
var currentCountry = element.value();
element.value(address[field]);
country = address[field];
countryElement = element;
if (($.inArray(currentCountry, countryList) === -1 && $.inArray(address[field], countryList) !== -1) ||
($.inArray(currentCountry, countryList) !== -1 && $.inArray(address[field], countryList) !== -1 && currentCountry != address[field])
) {
element.trigger('change');
}
return false;
}
});
}
if (field == 'region_id' && field in address && country != false && $.inArray(country, countryList) !== -1) {
$('#' + element.uid).find('option').each(function () {
if ($(this).attr('data-title') == address[field]) {
element.value($(this).attr('value'));
regionIdElement = element;
return false;
}
});
useRegionId = true;
}
if (field == 'region' && country != false && useRegionId == false) {
if ('region_id' in address) {
element.value(address['region_id']);
} else {
element.value('');
}
}
if (field == 'street' && field in address) {
element = formComponent.getChild(field).getChild(0);
element.value(address[field]);
}
if ((field == 'postcode' || field == 'city')) {
if (field in address) {
element.value(address[field]);
} else {
element.value('');
}
}
});
});
if (country != '' && component == shipping) {
if (useRegionId == true && regionIdElement != false) {
regionIdElement.trigger('change');
} else {
if (countryElement != false) {
countryElement.trigger('change');
}
}
}
},
/**
* Fill Country
* @param id
* @param countryCode
*/
fillCountry: function (formId) {
var countryCode = window.checkoutConfig.OnePageCheckout.googleApiCustomerCountry,
countrySelector = $('#' + formId + ' [name="country_id"]'),
currentCountry = countrySelector.val();
if (currentCountry == countryCode) {
return;
}
countrySelector.find('option').each(function () {
if ($(this).attr('value') == countryCode) {
countrySelector.val(countryCode);
countrySelector.trigger('change');
return false;
}
});
},
/**
* Get customer attribute label
*
* @param {*} attribute
* @returns {*}
*/
getCustomAttributeLabel: function (attribute) {
var resultAttribute;
if (typeof attribute === 'string') {
return attribute;
}
if (attribute.label) {
return attribute.label;
}
resultAttribute = _.findWhere(this.source.get('customAttributes')[attribute['attribute_code']], {
value: attribute.value
});
return resultAttribute && resultAttribute.label || attribute.value;
}
});
});
define([
'uiComponent',
'Magento_Checkout/js/model/payment/additional-validators',
'Rokanthemes_OnePageCheckout/js/model/create-new-account-validator'
], function (Component, additionalValidators, agreementValidator) {
'use strict';
additionalValidators.registerValidator(agreementValidator);
return Component.extend({});
});
define([
'moment',
'Magento_Ui/js/form/element/date',
'Rokanthemes_OnePageCheckout/js/lib/jquery/jquery-ui-addon-slider-access'
], function (moment, coreDate) {
'use strict';
return coreDate.extend({
defaults: {
options: {
addSliderAccess: true,
sliderAccessArgs: { touchonly: false }
},
},
/**
* Prepares and sets date/time value that will be sent
* to the server.
*
* @param {String} shiftedValue
*/
onShiftedValueChange: function (shiftedValue) {
var value,
formattedValue,
momentValue;
if (shiftedValue) {
momentValue = moment(shiftedValue, this.pickerDateTimeFormat);
if (this.options.showsTime) {
formattedValue = moment(momentValue).format(this.timezoneFormat);
value = moment.tz(formattedValue, this.storeTimeZone).tz('UTC').toISOString();
} else {
value = momentValue.format(this.outputDateFormat);
}
} else {
value = '';
}
if (value !== this.value() && !this.options.showsTime) {
this.value(value);
}
},
});
});
define([
'jquery',
'Magento_Checkout/js/view/form/element/email',
'mage/validation'
], function ($, Component) {
'use strict';
return Component.extend({
defaults: {
template: 'Rokanthemes_OnePageCheckout/form/element/email',
createNewAccount: false
},
checkDelay: 1000,
initObservable: function () {
this._super()
.observe(['email', 'emailFocused', 'isLoading', 'isPasswordVisible', 'createNewAccount']);
return this;
},
createNewAccountConfig: function () {
return window.checkoutConfig.OnePageCheckout.autoCreateNewAccount.enable;
},
createNewAccountChecked: function (element) {
if ($('#' + element).is(":checked")) {
this.createNewAccount(true);
} else {
this.createNewAccount(false);
}
},
minLength: function () {
return window.checkoutConfig.OnePageCheckout.autoCreateNewAccount.minLength;
},
minCharacterSets: function () {
return window.checkoutConfig.OnePageCheckout.autoCreateNewAccount.minCharacterSets;
}
});
});
define([
'uiRegistry',
'Magento_Ui/js/form/element/region'
], function (registry, Component) {
'use strict';
return Component.extend({
/**
* @inheritdoc
*/
filter: function (value, field) {
var country = registry.get(this.parentName + '.' + 'country_id');
if (country) {
this._super(value, field);
}
}
});
});
define([
'ko',
'uiComponent',
'Rokanthemes_OnePageCheckout/js/model/gift-message',
'Rokanthemes_OnePageCheckout/js/action/gift-options'
], function (ko, Component, GiftMessage, giftOptionsService) {
'use strict';
return Component.extend({
formBlockVisibility: null,
resultBlockVisibility: null,
model: {},
isLoading: ko.observable(false),
/**
* Component init
*/
initialize: function () {
var self = this,
model;
this._super()
.observe('formBlockVisibility')
.observe({
'resultBlockVisibility': false
});
this.itemId = this.itemId || 'orderLevel';
this.model = new GiftMessage(this.itemId);
this.model.getObservable('isClear').subscribe(function (value) {
if (value == true) {
self.formBlockVisibility(false);
self.model.getObservable('alreadyAdded')(true);
}
});
this.model.afterSubmit = function () {
self.hideFormBlock();
self.resultBlockVisibility(false);
self.isLoading(false);
};
this.isResultBlockVisible();
},
/**
* Is reslt block visible
*/
isResultBlockVisible: function () {
var self = this;
if (this.model.getObservable('alreadyAdded')()) {
this.resultBlockVisibility(true);
}
this.model.getObservable('additionalOptionsApplied').subscribe(function (value) {
if (value == true) { //eslint-disable-line eqeqeq
self.resultBlockVisibility(true);
}
});
},
/**
* @param {String} key
* @return {*}
*/
getObservable: function (key) {
return this.model.getObservable(key);
},
/**
* Hide\Show form block
*/
toggleFormBlockVisibility: function () {
if (!this.model.getObservable('alreadyAdded')()) {
this.formBlockVisibility(!this.formBlockVisibility());
} else {
this.resultBlockVisibility(!this.resultBlockVisibility());
}
},
/**
* Edit options
*/
editOptions: function () {
this.resultBlockVisibility(false);
this.formBlockVisibility(true);
},
/**
* Delete options
*/
deleteOptions: function () {
this.isLoading(true);
giftOptionsService(this.model);
this.model.getObservable('alreadyAdded')(false);
},
/**
* Hide form block
*/
hideFormBlock: function () {
this.formBlockVisibility(false);
if (this.model.getObservable('alreadyAdded')()) {
this.resultBlockVisibility(true);
}
},
/**
* @return {Boolean}
*/
hasActiveOptions: function () {
var regionData = this.getRegion('additionalOptions'),
options = regionData(),
i;
for (i = 0; i < options.length; i++) {
if (options[i].isActive()) {
return true;
}
}
return false;
},
/**
* @return {Boolean}
*/
isActive: function () {
return this.model.isGiftMessageAvailable();
},
/**
* Submit options
*/
submitOptions: function () {
this.isLoading(true);
giftOptionsService(this.model);
this.model.getObservable('alreadyAdded')(true);
}
});
});
define([
'uiComponent',
'uiRegistry',
'underscore',
'Magento_Checkout/js/model/quote',
'Magento_Checkout/js/action/select-billing-address',
'Rokanthemes_OnePageCheckout/js/model/payment-service',
'Magento_Checkout/js/model/totals',
'Rokanthemes_OnePageCheckout/js/action/set-shipping-information',
'Magento_Checkout/js/model/shipping-service',
'Magento_Customer/js/model/customer',
'Rokanthemes_OnePageCheckout/js/model/update-item-service'
], function (
Component,
registry,
_,
quote,
selectBillingAddress,
paymentService,
totalsService,
setShippingInformationAction,
shippingService,
customer,
updateItemService
) {
'use strict';
return Component.extend({
/** @inheritdoc */
initialize: function () {
this._super();
var self = this;
quote.shippingMethod.subscribe(function (method) {
if (method && !updateItemService.hasUpdateResult()) {
var shippingRates = shippingService.getShippingRates();
var availableRate = _.find(shippingRates(), function (rate) {
if (rate['method_code'] === null && method['method_code'] === null) {
return false;
}
return rate['carrier_code'] + '_' + rate['method_code'] === method['carrier_code'] + '_' + method['method_code'];
});
if (availableRate) {
if (self._isAddressSameAsShipping()) {
selectBillingAddress(quote.shippingAddress());
}
paymentService.isLoading(true);
totalsService.isLoading(true);
setShippingInformationAction().done(
function () {
paymentService.isLoading(false);
totalsService.isLoading(false);
}
);
}
}
}, this);
if (!customer.isLoggedIn()) {
quote.shippingAddress.subscribe(function (address) {
if (_.isUndefined(address.street) || address.street.length == 0) {
address.street = ["", ""];
}
}, this);
}
},
/**
* @returns {*}
*/
_isAddressSameAsShipping: function () {
return registry.get('checkout.steps.billing-step.payment.payments-list.billing-address-form-shared').isAddressSameAsShipping();
}
});
});
define(
[
'jquery',
'ko',
'uiComponent'
],
function (
$,
ko,
Component
) {
'use strict';
return Component.extend({
defaults: {
template: 'Rokanthemes_OnePageCheckout/widget/opc-widget'
},
getOpcWidget: function (position) {
var widgetList = window.checkoutConfig.opcWidget,
result = ko.observableArray([]);
if (position == "widget_after_placeorder") {
$.each(widgetList.widget_after_placeorder, function (index, value) {
result.push(value);
});
}
return result;
}
});
}
);
define([
'jquery',
'underscore',
'uiComponent',
'ko',
'Magento_Checkout/js/model/quote',
'Rokanthemes_OnePageCheckout/js/model/step-navigator',
'Magento_Checkout/js/model/payment-service',
'Magento_Checkout/js/model/payment/method-converter',
'Magento_Checkout/js/action/get-payment-information',
'Magento_Checkout/js/model/checkout-data-resolver',
'mage/translate',
'Rokanthemes_OnePageCheckout/js/model/payment-service'
], function (
$,
_,
Component,
ko,
quote,
stepNavigator,
paymentService,
methodConverter,
getPaymentInformation,
checkoutDataResolver,
$t,
paymentServiceCt
) {
'use strict';
/** Set payment methods to collection */
paymentService.setPaymentMethods(methodConverter(window.checkoutConfig.paymentMethods));
return Component.extend({
defaults: {
template: 'Magento_Checkout/payment',
activeMethod: ''
},
isVisible: ko.observable(true),
quoteIsVirtual: quote.isVirtual(),
isLoading: paymentServiceCt.isLoading,
isPaymentMethodsAvailable: ko.computed(function () {
return paymentService.getAvailablePaymentMethods().length > 0;
}),
/** @inheritdoc */
initialize: function () {
this._super();
checkoutDataResolver.resolvePaymentMethod();
stepNavigator.registerStep(
'payment',
null,
$t('Review & Payments'),
this.isVisible,
_.bind(this.navigate, this),
20
);
this.navigate();
return this;
},
/**
* Navigate method.
*/
navigate: function () {
var self = this;
getPaymentInformation().done(function () {
self.isVisible(true);
});
},
/**
* @return {*}
*/
getFormKey: function () {
return window.checkoutConfig.formKey;
}
});
});
define(
[
'jquery',
'ko',
'uiComponent',
'Magento_Checkout/js/model/quote',
'Magento_SalesRule/js/action/set-coupon-code',
'Magento_SalesRule/js/action/cancel-coupon',
'Rokanthemes_OnePageCheckout/js/model/payment-service'
],
function ($, ko, Component, quote, setCouponCodeAction, cancelCouponAction, paymentServiceOpc) {
'use strict';
var totals = quote.getTotals(),
couponCode = ko.observable(null),
isApplied = paymentServiceOpc.isAppliedCoupon;
if (totals()) {
couponCode(totals()['coupon_code']);
}
return Component.extend({
defaults: {
template: 'Magento_SalesRule/payment/discount'
},
couponCode: couponCode,
/**
* Applied flag
*/
isApplied: isApplied,
/**
* Coupon code application procedure
*/
apply: function() {
if (this.validate()) {
setCouponCodeAction(couponCode(), isApplied);
}
},
/**
* Cancel using coupon
*/
cancel: function() {
if (this.validate()) {
couponCode('');
cancelCouponAction(isApplied);
}
},
/**
* Coupon form validation
*
* @returns {Boolean}
*/
validate: function () {
var form = '#discount-form';
return $(form).validation() && $(form).validation('isValid');
}
});
}
);
define([
'underscore',
'Magento_Checkout/js/view/payment/list'
], function (_, Component) {
'use strict';
return Component.extend({
/** @inheritdoc */
initialize: function () {
this._super();
},
/**
* Returns payment group title
*
* @param {Object} group
* @returns {String}
*/
getGroupTitle: function (group) {
var title = group().title;
if (group().isDefault() && this.paymentGroupsList().length > 1) {
title = this.defaultGroupTitle;
}
return title;
},
/**
* @param {Object} group
* @returns {Boolean}
*/
showFormShared: function (group) {
var isShow = false;
if (this.paymentGroupsList().length) {
if (_.first(this.paymentGroupsList()).alias == group().alias) {
isShow = true;
}
}
return isShow;
}
});
});
define([
'jquery',
'uiRegistry',
'Magento_Checkout/js/model/quote',
'Magento_Checkout/js/model/payment/additional-validators',
'Magento_Paypal/js/in-context/express-checkout-smart-buttons',
'Rokanthemes_OnePageCheckout/js/action/validate-shipping-information',
'Magento_Checkout/js/action/select-billing-address',
'Magento_Checkout/js/model/full-screen-loader',
'mage/translate'
], function ($, registry, quote, additionalValidators, checkoutSmartButtons, validateShippingInformationAction, selectBillingAddress, fullScreenLoader) {
'use strict';
var buttonId = 'paypay-in-context-button',
errorId = 'paypay-in-context-validate-error',
/* html = '<p id="' + errorId + '" style="display:none">' + $.mage.__('Please Fill All Require Field!') + '</p><p class="action primary" id="' + buttonId + '" style="display:none">' + $.mage.__('Continue Paypal') + '</p>', */
html = '<p id="' + errorId + '" >' + $.mage.__('Please Fill All Require Field!') + '</p><p class="action primary" id="' + buttonId + '" >' + $.mage.__('Continue Paypal') + '</p>',
mixin = {
/**
* Listens element on change and validate it.
*
* @param {HTMLElement} context
*/
initListeners: function (context) {
$(context).find('.payment-method-content').append(html);
var seft = this;
quote.billingAddress.subscribe(function (address) {
if (quote.isVirtual()) {
if (address !== null && quote.paymentMethod() != null) {
$('#' + buttonId).removeClass('disable');
return;
}
} else {
if (address !== null && quote.paymentMethod() != null && quote.shippingMethod() != null) {
$('#' + buttonId).removeClass('disable');
return;
}
}
if (!$('#' + buttonId).hasClass('disable')) {
$('#' + buttonId).addClass('disable');
}
}, this);
this.customValidate(seft);
$('#' + buttonId).click(function () {
if (!$(this).hasClass('disable')) {
$(this).addClass('disable');
seft.customValidate(seft);
}
})
this.fieldChange();
},
/**
* Validates Smart Buttons
*/
validate: function () {
if (this.actions) {
this.actions.enable();
}
},
fieldChange: function () {
$('input[type=radio], input[type=checkbox], select').change(function () {
$('#' + buttonId).parent().find('.actions-toolbar').html('');
$('#' + buttonId).show();
$('#' + errorId).hide();
$('#' + buttonId).removeClass('disable');
if ($(this).val() == 'paypal_express') {
$('#' + buttonId).trigger('click');
}
});
$("input[type=text], textarea").keyup(function(){
$('#' + buttonId).parent().find('.actions-toolbar').html('');
$('#' + buttonId).show();
$('#' + buttonId).removeClass('disable');
});
$("input[type=text], textarea").keydown(function(){
$('#' + buttonId).parent().find('.actions-toolbar').html('');
$('#' + buttonId).show();
$('#' + buttonId).removeClass('disable');
});
},
customValidate: function (seft) {
var shippingAddressComponent = registry.get('checkout.steps.shipping-step.shippingAddress');
if (additionalValidators.validate() == true) {
if (!quote.isVirtual()) {
if (shippingAddressComponent.validateShippingInformation()) {
validateShippingInformationAction().done(
function () {
$('#' + buttonId).hide();
$('#' + errorId).hide();
checkoutSmartButtons(seft.prepareClientConfig(), window.paypalElement);
}
).fail(
function () {
$('#' + buttonId).show();
$('#' + errorId).show();
$('#' + buttonId).removeClass('disable');
fullScreenLoader.stopLoader();
}
);
return;
}
}
}
$('#' + buttonId).show();
$('#' + errorId).show();
$('#' + buttonId).removeClass('disable');
}
};
return function (target) {
return target.extend(mixin);
};
});
define([
'ko',
'jquery',
'uiComponent',
'uiRegistry',
'mage/translate',
'Magento_Checkout/js/model/quote',
'Rokanthemes_OnePageCheckout/js/model/shipping-rate-processor/new-address',
'Rokanthemes_OnePageCheckout/js/model/shipping-rate-processor/customer-address',
'Rokanthemes_OnePageCheckout/js/action/validate-shipping-information',
// 'Rokanthemes_OnePageCheckout/js/action/validate-gift-wrap-before-order',
'Magento_Checkout/js/model/full-screen-loader',
'Magento_Checkout/js/action/select-billing-address',
'Magento_Checkout/js/model/payment/additional-validators',
'Magento_Checkout/js/model/shipping-service',
'Magento_Checkout/js/model/shipping-rate-registry',
'underscore',
'Magento_Ui/js/modal/alert',
'Magento_Checkout/js/checkout-data',
'Magento_Checkout/js/model/totals',
'Amazon_Payment/js/model/storage'
], function (
ko,
$,
Component,
registry,
$t,
quote,
DefaultProcessor,
CustomerAddressProcessor,
validateShippingInformationAction,
// validateGiftWrapAction,
fullScreenLoader,
selectBillingAddress,
additionalValidators,
shippingService,
rateRegistry,
_,
alert,
checkoutData,
totals,
amazonStorage
) {
'use strict';
return Component.extend({
defaults: {
template: 'Rokanthemes_OnePageCheckout/place-order-btn'
},
placeOrderLabel: ko.observable($t(window.checkoutConfig.OnePageCheckout.titlePlaceOrder)),
isVisible: ko.observable(true),
isPlaceOrderActionAllowed: ko.observable(quote.billingAddress() != null && quote.paymentMethod() != null),
/** @inheritdoc */
initialize: function () {
window.isPlaceOrderDispatched = false;
this._super();
var self = this;
quote.billingAddress.subscribe(function (address) {
if (quote.isVirtual()) {
setTimeout(function () {
self.isPlaceOrderActionAllowed(address !== null && quote.paymentMethod() != null);
}, 500);
} else {
self.isPlaceOrderActionAllowed(address !== null && quote.paymentMethod() != null && quote.shippingMethod() != null);
}
}, this);
quote.paymentMethod.subscribe(function (newMethod) {
if (quote.isVirtual()) {
self.isPlaceOrderActionAllowed(newMethod !== null && quote.billingAddress() != null);
} else {
self.isPlaceOrderActionAllowed(newMethod !== null && quote.billingAddress() != null && quote.shippingMethod() != null);
}
if ((newMethod.method === "amazonlogin" && !amazonStorage.isAmazonAccountLoggedIn()) ||
newMethod.method === "braintree_paypal"
) {
self.isVisible(false);
}
}, this);
if (!quote.isVirtual()) {
quote.shippingMethod.subscribe(function (method) {
var availableRate,
shippingRates = shippingService.getShippingRates();
if (method) {
availableRate = _.find(shippingRates(), function (rate) {
return rate['carrier_code'] + '_' + rate['method_code'] === method['carrier_code'] + '_' + method['method_code'];
});
}
self.isPlaceOrderActionAllowed(availableRate && quote.paymentMethod() != null && quote.billingAddress() != null);
}, this);
}
if (
window.checkoutConfig.paypal_in_context == true || !_.isEmpty(window.checkoutConfig.amazonLogin)
) {
var selectedPaymentMethod = checkoutData.getSelectedPaymentMethod();
if (selectedPaymentMethod == "paypal_express" ||
selectedPaymentMethod == "amazonlogin" ||
selectedPaymentMethod == "braintree_paypal") {
self.isVisible(false);
}
$(document).on('change', '.payment-method .radio', function () {
if ($('.payment-method._active').find('.actions-toolbar').is('#paypal-express-in-context-button') ||
($(this).attr('id') === 'amazonlogin') ||
($(this).attr('id') === 'braintree_paypal')
) {
self.isVisible(false);
} else {
self.isVisible(true);
}
});
}
},
placeOrder: function (data, event) {
var self = this;
var shippingAddressComponent = registry.get('checkout.steps.shipping-step.shippingAddress');
window.isPlaceOrderDispatched = true;
if (event) {
event.preventDefault();
}
if (additionalValidators.validate()) {
if (quote.isVirtual()) {
$('input#' + self.getCode())
.closest('.payment-method').find('.payment-method-content .actions-toolbar:not([style*="display: none"]) button.action.checkout')
.trigger('click');
} else {
if (shippingAddressComponent.validateShippingInformation()) {
var reSelectShippingAddress = false;
if (typeof window.shippingAddress !== "undefined" || !$.isEmptyObject(window.shippingAddress)) {
quote.shippingAddress(window.shippingAddress);
var type = quote.shippingAddress().getType();
if (type == 'customer-address') {
var cache = rateRegistry.get(quote.shippingAddress().getKey());
if (!cache) {
reSelectShippingAddress = true;
CustomerAddressProcessor(quote.shippingAddress()).done(function (result) {
self.placeOrderContinue();
}).fail(function (response) {
}).always(function () {
window.shippingAddress = {};
});
} else {
window.shippingAddress = {};
}
} else {
var cache = rateRegistry.get(quote.shippingAddress().getCacheKey());
if (!cache) {
reSelectShippingAddress = true;
DefaultProcessor(quote.shippingAddress()).done(function (result) {
self.placeOrderContinue();
}).fail(function (response) {
}).always(function () {
window.shippingAddress = {};
});
} else {
window.shippingAddress = {};
}
}
}
if (!reSelectShippingAddress) {
self.placeOrderContinue();
}
}
}
}
return false;
},
placeOrderContinue: function () {
var self = this;
var billingAddressComponent = registry.get('checkout.steps.billing-step.payment.payments-list.billing-address-form-shared');
if (billingAddressComponent.isAddressSameAsShipping()) {
fullScreenLoader.startLoader();
selectBillingAddress(quote.shippingAddress());
}
validateShippingInformationAction().done(
function () {
fullScreenLoader.stopLoader();
$('input#' + self.getCode())
.closest('.payment-method').find('.payment-method-content .actions-toolbar:not([style*="display: none"]) button.action.checkout')
.trigger('click');
}
).fail(
function () {
fullScreenLoader.stopLoader();
}
);
},
getCode: function () {
return quote.paymentMethod().method;
}
});
});
define([
'underscore',
'ko',
'mageUtils',
'Magento_Checkout/js/view/shipping-address/list',
'uiLayout'
], function (_, ko, utils, Component, layout) {
'use strict';
var defaultRendererTemplate = {
parent: '${ $.$data.parentName }',
name: '${ $.$data.name }',
component: 'Magento_Checkout/js/view/shipping-address/address-renderer/default',
template: 'Rokanthemes_OnePageCheckout/shipping-address/address-renderer/default'
};
return Component.extend({
/**
* Create new component that will render given address in the address list
*
* @param {Object} address
* @param {*} index
*/
createRendererComponent: function (address, index) {
var rendererTemplate, templateData, rendererComponent;
if (index in this.rendererComponents) {
this.rendererComponents[index].address(address);
} else {
// rendererTemplates are provided via layout
rendererTemplate = address.getType() != undefined && this.rendererTemplates[address.getType()] != undefined ? //eslint-disable-line
utils.extend({}, defaultRendererTemplate, this.rendererTemplates[address.getType()]) :
defaultRendererTemplate;
templateData = {
parentName: this.name,
name: index
};
rendererComponent = utils.template(rendererTemplate, templateData);
utils.extend(rendererComponent, {
address: ko.observable(address)
});
layout([rendererComponent]);
this.rendererComponents[index] = rendererComponent;
}
}
});
});
define([
'jquery',
'underscore',
'Magento_Ui/js/form/form',
'ko',
'Magento_Customer/js/model/customer',
'Magento_Customer/js/model/address-list',
'Magento_Checkout/js/model/address-converter',
'Magento_Checkout/js/model/quote',
'Magento_Checkout/js/action/create-shipping-address',
'Magento_Checkout/js/action/select-shipping-address',
'Rokanthemes_OnePageCheckout/js/model/shipping-rates-validator',
'Magento_Checkout/js/model/shipping-address/form-popup-state',
'Magento_Checkout/js/model/shipping-service',
'Magento_Checkout/js/action/select-shipping-method',
'Magento_Checkout/js/model/shipping-rate-registry',
'Magento_Checkout/js/action/set-shipping-information',
'Magento_Checkout/js/model/step-navigator',
'Magento_Ui/js/modal/modal',
'Magento_Checkout/js/model/checkout-data-resolver',
'Magento_Checkout/js/checkout-data',
'uiRegistry',
'mage/translate',
'Magento_Checkout/js/model/shipping-rate-service'
], function (
$,
_,
Component,
ko,
customer,
addressList,
addressConverter,
quote,
createShippingAddress,
selectShippingAddress,
shippingRatesValidator,
formPopUpState,
shippingService,
selectShippingMethodAction,
rateRegistry,
setShippingInformationAction,
stepNavigator,
modal,
checkoutDataResolver,
checkoutData,
registry,
$t
) {
'use strict';
var popUp = null;
return Component.extend({
defaults: {
template: 'Magento_Checkout/shipping',
shippingFormTemplate: 'Rokanthemes_OnePageCheckout/shipping-address/form',
shippingMethodListTemplate: 'Magento_Checkout/shipping-address/shipping-method-list',
shippingMethodItemTemplate: 'Magento_Checkout/shipping-address/shipping-method-item'
},
visible: ko.observable(!quote.isVirtual()),
errorValidationMessage: ko.observable(false),
isCustomerLoggedIn: customer.isLoggedIn,
isFormPopUpVisible: formPopUpState.isVisible,
isFormInline: addressList().length === 0,
isNewAddressAdded: ko.observable(false),
saveInAddressBook: 1,
quoteIsVirtual: quote.isVirtual(),
/**
* @return {exports}
*/
initialize: function () {
var self = this,
hasNewAddress,
fieldsetName = 'checkout.steps.shipping-step.shippingAddress.shipping-address-fieldset';
this._super();
if (!quote.isVirtual()) {
stepNavigator.registerStep(
'shipping',
'',
$t('Shipping'),
this.visible,
_.bind(this.navigate, this),
10
);
}
checkoutDataResolver.resolveShippingAddress();
hasNewAddress = addressList.some(function (address) {
return address.getType() == 'new-customer-address'; //eslint-disable-line eqeqeq
});
this.isNewAddressAdded(hasNewAddress);
this.isFormPopUpVisible.subscribe(function (value) {
if (value) {
self.getPopUp().openModal();
}
});
quote.shippingMethod.subscribe(function () {
self.errorValidationMessage(false);
});
registry.async('checkoutProvider')(function (checkoutProvider) {
var shippingAddressData = checkoutData.getShippingAddressFromData();
if (shippingAddressData) {
checkoutProvider.set(
'shippingAddress',
$.extend(true, {}, checkoutProvider.get('shippingAddress'), shippingAddressData)
);
}
checkoutProvider.on('shippingAddress', function (shippingAddrsData) {
checkoutData.setShippingAddressFromData(shippingAddrsData);
});
shippingRatesValidator.initFields(fieldsetName);
});
return this;
},
/**
* Navigator change hash handler.
*
* @param {Object} step - navigation step
*/
navigate: function (step) {
step && step.isVisible(true);
},
/**
* @return {*}
*/
getPopUp: function () {
var self = this,
buttons;
if (!popUp) {
buttons = this.popUpForm.options.buttons;
this.popUpForm.options.buttons = [
{
text: buttons.save.text ? buttons.save.text : $t('Save Address'),
class: buttons.save.class ? buttons.save.class : 'action primary action-save-address',
click: self.saveNewAddress.bind(self)
},
{
text: buttons.cancel.text ? buttons.cancel.text : $t('Cancel'),
class: buttons.cancel.class ? buttons.cancel.class : 'action secondary action-hide-popup',
/** @inheritdoc */
click: this.onClosePopUp.bind(this)
}
];
/** @inheritdoc */
this.popUpForm.options.closed = function () {
self.isFormPopUpVisible(false);
};
this.popUpForm.options.modalCloseBtnHandler = this.onClosePopUp.bind(this);
this.popUpForm.options.keyEventHandlers = {
escapeKey: this.onClosePopUp.bind(this)
};
/** @inheritdoc */
this.popUpForm.options.opened = function () {
// Store temporary address for revert action in case when user click cancel action
self.temporaryAddress = $.extend(true, {}, checkoutData.getShippingAddressFromData());
};
popUp = modal(this.popUpForm.options, $(this.popUpForm.element));
}
self.autoFillAddress(this.popUpForm.element);
return popUp;
},
/**
* Revert address and close modal.
*/
onClosePopUp: function () {
checkoutData.setShippingAddressFromData($.extend(true, {}, this.temporaryAddress));
this.getPopUp().closeModal();
},
/**
* Show address form popup
*/
showFormPopUp: function () {
this.isFormPopUpVisible(true);
},
/**
* Save new shipping address
*/
saveNewAddress: function () {
var addressData,
newShippingAddress;
this.source.set('params.invalid', false);
this.triggerShippingDataValidateEvent();
if (!this.source.get('params.invalid')) {
addressData = this.source.get('shippingAddress');
// if user clicked the checkbox, its value is true or false. Need to convert.
addressData['save_in_address_book'] = this.saveInAddressBook ? 1 : 0;
// New address must be selected as a shipping address
newShippingAddress = createShippingAddress(addressData);
selectShippingAddress(newShippingAddress);
checkoutData.setSelectedShippingAddress(newShippingAddress.getKey());
checkoutData.setNewCustomerShippingAddress($.extend(true, {}, addressData));
this.getPopUp().closeModal();
this.isNewAddressAdded(true);
}
},
/**
* Shipping Method View
*/
rates: shippingService.getShippingRates(),
isLoading: shippingService.isLoading,
isSelected: ko.computed(function () {
return quote.shippingMethod() ?
quote.shippingMethod()['carrier_code'] + '_' + quote.shippingMethod()['method_code'] :
null;
}),
/**
* @param {Object} shippingMethod
* @return {Boolean}
*/
selectShippingMethod: function (shippingMethod) {
selectShippingMethodAction(shippingMethod);
checkoutData.setSelectedShippingRate(shippingMethod['carrier_code'] + '_' + shippingMethod['method_code']);
return true;
},
/**
* Set shipping information handler
*/
setShippingInformation: function () {
if (this.validateShippingInformation()) {
setShippingInformationAction().done(
function () {
stepNavigator.next();
}
);
}
},
/**
* @return {Boolean}
*/
validateShippingInformation: function () {
var shippingAddress,
addressData,
loginFormSelector = 'form[data-role=email-with-possible-login]',
emailValidationResult = customer.isLoggedIn(),
field;
if (!quote.shippingMethod()) {
this.errorValidationMessage($t('Please specify a shipping method.'));
return false;
}
if (!customer.isLoggedIn()) {
$(loginFormSelector).validation();
emailValidationResult = Boolean($(loginFormSelector + ' input[name=username]').valid());
}
if (this.isFormInline) {
this.source.set('params.invalid', false);
this.triggerShippingDataValidateEvent();
if (emailValidationResult &&
this.source.get('params.invalid') ||
!quote.shippingMethod()['method_code'] ||
!quote.shippingMethod()['carrier_code']
) {
this.focusInvalid();
return false;
}
shippingAddress = quote.shippingAddress();
addressData = addressConverter.formAddressDataToQuoteAddress(
this.source.get('shippingAddress')
);
//Copy form data to quote shipping address object
for (field in addressData) {
if (addressData.hasOwnProperty(field) && //eslint-disable-line max-depth
shippingAddress.hasOwnProperty(field) &&
typeof addressData[field] != 'function' &&
_.isEqual(shippingAddress[field], addressData[field])
) {
shippingAddress[field] = addressData[field];
} else if (typeof addressData[field] != 'function' &&
!_.isEqual(shippingAddress[field], addressData[field])) {
shippingAddress = addressData;
break;
}
}
if (customer.isLoggedIn()) {
shippingAddress['save_in_address_book'] = 1;
}
window.shippingAddress = shippingAddress;
//selectShippingAddress(shippingAddress);
}
if (!emailValidationResult) {
$(loginFormSelector + ' input[name=username]').focus();
return false;
}
return true;
},
/**
* Trigger Shipping data Validate Event.
*/
triggerShippingDataValidateEvent: function () {
this.source.trigger('shippingAddress.data.validate');
if (this.source.get('shippingAddress.custom_attributes')) {
this.source.trigger('shippingAddress.custom_attributes.data.validate');
}
},
/**
* Auto Fill Address
* @param element
*/
autoFillAddress: function (element) {
var self = this;
if (typeof(element) === "object") {
var formId = element.id;
} else if (typeof(element) === "string") {
var formId = element.replace("#", "");
}
if (this.isFormInline || typeof(element) === "string") {
setTimeout(function(){
var streetId = $('#' + formId + ' [name="street[0]"]').id;
var street = $('#' + formId + ' [name="street[0]"]').val();
if (street == '') {
self.fillCountry(formId);
}
}, 500);
}
},
/**
* Fill Address
* @param address
* @param id
*/
fillInAddress: function (address, id) {
var componentFields = [
'country_id',
'postcode',
'region_id',
'region',
'city',
'street'
];
var country = false,
countryList = window.checkoutConfig.OnePageCheckout.googleApiListCountries,
useRegionId = false,
countryElement = false,
regionIdElement = false,
component = 'checkout.steps.shipping-step.shippingAddress.shipping-address-fieldset';
registry.get(component, function (formComponent) {
$.each(componentFields, function (index, field) {
var element = formComponent.getChild(field);
if (field === 'region') {
element = formComponent.getChild('region_id_input');
}
if (field == 'country_id' && field in address) {
$('#' + element.uid).find('option').each(function () {
if ($(this).attr('value') == address[field]) {
var currentCountry = element.value();
element.value(address[field]);
country = address[field];
countryElement = element;
if (($.inArray(currentCountry, countryList) === -1 && $.inArray(address[field], countryList) !== -1) ||
($.inArray(currentCountry, countryList) !== -1 && $.inArray(address[field], countryList) !== -1 && currentCountry != address[field])
) {
element.trigger('change');
}
return false;
}
});
}
if (field == 'region_id' && field in address && country != false && $.inArray(country, countryList) !== -1) {
$('#' + element.uid).find('option').each(function () {
if ($(this).attr('data-title') == address[field]) {
element.value($(this).attr('value'));
regionIdElement = element;
return false;
}
});
useRegionId = true;
}
if (field == 'region' && country != false && useRegionId == false) {
if ('region_id' in address) {
element.value(address['region_id']);
} else {
element.value('');
}
}
if (field == 'street' && field in address) {
element = formComponent.getChild(field).getChild(0);
element.value(address[field]);
}
if ((field == 'postcode' || field == 'city')) {
if (field in address) {
element.value(address[field]);
} else {
element.value('');
}
}
});
});
if (country != '' && component == shipping) {
if (useRegionId == true && regionIdElement != false) {
regionIdElement.trigger('change');
} else {
if (countryElement != false) {
countryElement.trigger('change');
}
}
}
},
/**
* Fill Country
* @param id
* @param countryCode
*/
fillCountry: function (formId) {
var countryCode = window.checkoutConfig.OnePageCheckout.googleApiCustomerCountry,
countrySelector = $('#' + formId + ' [name="country_id"]'),
currentCountry = countrySelector.val();
if (currentCountry == countryCode) {
return;
}
countrySelector.find('option').each(function () {
if ($(this).attr('value') == countryCode) {
countrySelector.val(countryCode);
countrySelector.trigger('change');
return false;
}
});
}
});
});
define([
'jquery',
'Magento_Checkout/js/view/summary/item/details',
'mage/translate',
'ko',
'underscore',
'Magento_Customer/js/customer-data',
'Rokanthemes_OnePageCheckout/js/action/update-item',
'Magento_Checkout/js/model/quote'
], function ($, Component, $t, ko, _, customerData, updateItemAction, quote) {
'use strict';
return Component.extend({
defaults: {
template: 'Rokanthemes_OnePageCheckout/summary/item/details'
},
titleQtyBox: ko.observable($t('Qty')),
number: null,
/**
* @param {Object} item
* @returns void
*/
updateQty: function (item) {
if (item.qty < 0) {
$(".error-message[itemId = '" + item.item_id + "']").text($t('Please enter the number greater than or equal to 0!'));
return;
}
if (parseFloat(item.qty) != item.qty) {
$(".error-message[itemId = '" + item.item_id + "']").text($t('Please enter number!'));
return;
}
$(".error-message[itemId = '" + item.item_id + "']").text($t(''));
updateItemAction(item).done(
function (response) {
var totals = response.totals,
data = JSON.parse(this.data),
itemId = data.itemId,
itemsOrigin = [],
quoteItemData = window.checkoutConfig.quoteItemData;
if (!response.status) {
var originItem = _.find(quoteItemData, function (index) {
return index.item_id == itemId;
});
$.each(totals.items, function (index) {
if (this.item_id == originItem.item_id) {
this.qty = originItem.qty;
}
itemsOrigin[index] = this;
});
totals.items = itemsOrigin;
} else {
customerData.reload('cart');
}
quote.setTotals(totals);
}
);
},
/**
* @param data
* @param event
*/
updateQtyButton: function (data, event) {
var element = event.target,
action = element.getAttribute('action'),
itemId = element.getAttribute('itemId'),
qtyInput = $('[itemId = ' + itemId + ']').parent().parent().find('input');
if (typeof action === "undefined" || typeof itemId === "undefined" || typeof qtyInput === "undefined") {
return;
}
var currentQty = parseFloat(qtyInput.val());
currentQty = Math.round(currentQty * 100);
if (this.number != null && currentQty >= 100) {
clearTimeout(this.number);
}
if (action == 'increase') {
var nextQty = (currentQty + 100)/100;
nextQty = +nextQty.toFixed(2);
qtyInput.val(nextQty);
this.number = setTimeout(function () {
qtyInput.trigger('change');
}, 1000);
} else {
if (currentQty >= 100) {
var nextQty = (currentQty - 100)/100;
nextQty = +nextQty.toFixed(2);
qtyInput.val(nextQty);
this.number = setTimeout(function () {
qtyInput.trigger('change');
}, 1000);
}
}
},
/**
* @param {*} itemId
* @returns {String}
*/
getProductUrl: function (itemId) {
if (_.isUndefined(customerData.get('cart')())) {
customerData.reload('cart');
}
var productUrl = 'javascript:void(0)',
cartData = customerData.get('cart')(),
items = cartData.items;
var item = _.find(items, function (item) {
return item.item_id == itemId;
});
if (!_.isUndefined(item) && item.product_has_url) {
productUrl = item.product_url;
}
return productUrl;
}
});
});
<div class="checkout-billing-address">
<div class="billing-address-same-as-shipping-block field choice" data-bind="visible: canUseShippingAddress()">
<input type="checkbox" name="billing-address-same-as-shipping"
data-bind="checked: isAddressSameAsShipping, click: useShippingAddress, attr: {id: 'billing-address-same-as-shipping-' + getCode($parent)}"/>
<label data-bind="attr: {for: 'billing-address-same-as-shipping-' + getCode($parent)}"><span
data-bind="i18n: 'My billing and shipping address are the same'"></span></label>
</div>
<!-- ko ifnot: isAddressSameAsShipping -->
<!-- ko template: 'Magento_Checkout/billing-address/details' --><!-- /ko -->
<!-- /ko -->
<fieldset class="fieldset" data-bind="visible: !isAddressDetailsVisible()">
<!-- ko template: 'Magento_Checkout/billing-address/list' --><!-- /ko -->
<!-- ko template: 'Magento_Checkout/billing-address/form' --><!-- /ko -->
<div class="actions-toolbar">
<div class="primary">
<button class="action action-update" type="button" data-bind="click: updateAddress">
<span data-bind="i18n: 'Update'"></span>
</button>
<button class="action action-cancel" type="button" data-bind="click: cancelAddressEdit">
<span data-bind="i18n: 'Cancel'"></span>
</button>
</div>
</div>
</fieldset>
</div>
<div class="billing-address-form" data-bind="fadeVisible: isAddressFormVisible">
<!-- ko foreach: getRegion('before-fields') -->
<!-- ko template: getTemplate() --><!-- /ko -->
<!--/ko-->
<form data-bind="afterRender: autoFillAddress, attr: {'data-hasrequired': $t('* Required Fields')}" class="form form-billing-address" id="co-billing-form">
<fieldset
data-bind="attr: { id:'billing-new-address-form-'+index, value:index}"
class="billing-new-address-form fieldset address">
<!-- ko foreach: getRegion('additional-fieldsets') -->
<!-- ko template: getTemplate() --><!-- /ko -->
<!--/ko-->
<!-- ko if: (isCustomerLoggedIn && customerHasAddresses) -->
<div class="choice field">
<input type="checkbox" class="checkbox" data-bind="checked: saveInAddressBook, attr: {id: 'billing-save-in-address-book-' + getCode($parent)}" />
<label class="label" data-bind="attr: {for: 'billing-save-in-address-book-' + getCode($parent)}" >
<span data-bind="i18n: 'Save in address book'"></span>
</label>
</div>
<!-- /ko -->
</fieldset>
</form>
</div>
<div class="checkout-agreements-block">
<form id="onepagecheckout-form-checkout-agreements" class="form" novalidate="novalidate">
<div data-role="checkout-agreements">
<div class="checkout-agreements" data-bind="visible: isVisible">
<!-- ko foreach: agreements -->
<!-- ko if: ($parent.isAgreementRequired($data)) -->
<div class="checkout-agreement">
<input type="checkbox" class="required-entry"
data-bind="attr: {
'id': 'agreement_' + agreementId,
'name': 'agreement[' + agreementId + ']',
'value': agreementId
}"
data-validate="{required:true}" />
<label data-bind="attr: {'for': 'agreement_' + agreementId}">
<button type="button"
class="action action-show"
data-bind="click: function(data, event) { return $parent.showContent(data, event) }"
>
<span data-bind="html: checkboxText"></span>
</button>
</label>
</div>
<!-- /ko -->
<!-- ko ifnot: ($parent.isAgreementRequired($data)) -->
<div class="checkout-agreement">
<button type="button" class="action action-show"
data-bind="click: function(data, event) { return $parent.showContent(data, event) }">
<span data-bind="html: checkboxText"></span>
</button>
</div>
<!-- /ko -->
<!-- /ko -->
<div id="checkout-agreements-modal" data-bind="afterRender: initModal" style="display: none">
<div class="checkout-agreements-item-content" data-bind="html: modalContent"></div>
</div>
</div>
</div>
</form>
</div>
<!-- ko foreach: getRegion('amazon-button-region') -->
<!-- ko template: getTemplate() --><!-- /ko -->
<!-- /ko -->
<!-- ko ifnot: isCustomerLoggedIn() -->
<!-- ko foreach: getRegion('before-login-form') -->
<!-- ko template: getTemplate() --><!-- /ko -->
<!-- /ko -->
<form class="form form-login" data-role="email-with-possible-login"
data-bind="submit:login"
method="post">
<fieldset id="customer-email-fieldset" class="fieldset" data-bind="blockLoader: isLoading">
<div class="field required">
<label class="label" for="customer-email">
<span data-bind="i18n: 'Email Address'"></span>
</label>
<div class="control _with-tooltip">
<!-- ko if: window.checkoutConfig.rewrite_email_element -->
<input class="input-text"
type="email"
data-bind="
textInput: email,
hasFocus: emailFocused,
mageInit: {'mage/trim-input':{}}"
name="username"
data-validate="{required:true, 'validate-email':true}"
id="customer-email" />
<!-- /ko -->
<!-- ko ifnot: window.checkoutConfig.rewrite_email_element -->
<input class="input-text"
type="email"
data-bind="
textInput: email,
hasFocus: emailFocused"
name="username"
data-validate="{required:true, 'validate-email':true}"
id="customer-email" />
<!-- /ko -->
<!-- ko template: 'ui/form/element/helper/tooltip' --><!-- /ko -->
<span class="note" data-bind="fadeVisible: isPasswordVisible() == false"><!-- ko i18n: 'You can create an account after checkout.'--><!-- /ko --></span>
</div>
</div>
<!--Hidden fields -->
<fieldset class="fieldset hidden-fields" data-bind="fadeVisible: isPasswordVisible">
<div class="field">
<label class="label" for="customer-password">
<span data-bind="i18n: 'Password'"></span>
</label>
<div class="control">
<input class="input-text"
data-bind="
attr: {
placeholder: $t('Password'),
}"
type="password"
name="password"
id="customer-password"
data-validate="{required:true}" autocomplete="off"/>
<span class="note" data-bind="i18n: 'You already have an account with us. Sign in or continue as guest.'"></span>
</div>
</div>
<!-- ko foreach: getRegion('additional-login-form-fields') -->
<!-- ko template: getTemplate() --><!-- /ko -->
<!-- /ko -->
<div class="actions-toolbar">
<input name="context" type="hidden" value="checkout" />
<div class="primary">
<button type="submit" class="action login primary" data-action="checkout-method-login"><span data-bind="i18n: 'Login'"></span></button>
</div>
<div class="secondary">
<a class="action remind" data-bind="attr: { href: forgotPasswordUrl }">
<span data-bind="i18n: 'Forgot Your Password?'"></span>
</a>
</div>
</div>
</fieldset>
<!--Hidden fields -->
<!-- ko if: createNewAccountConfig() -->
<fieldset class="fieldset hidden-fields create-account" data-bind="fadeVisible: isPasswordVisible() == false">
<div class="field">
<input class="checkbox"
data-bind="click: createNewAccountChecked($element.id)"
type="checkbox"
name="createnewcustomer"
id="create-new-customer"
autocomplete="off"/>
<label class="label">
<span data-bind="i18n: 'Create New Account'"></span>
</label>
</div>
<div class="field _required pass" data-bind="fadeVisible: createNewAccount()">
<label class="label" for="new-customer-password">
<span data-bind="i18n: 'Password'"></span>
</label>
<div class="control">
<input class="input-text"
data-bind="
attr: {
placeholder: $t('Password'),
'data-password-min-length': minLength(),
'data-password-min-character-sets': minCharacterSets()
}"
type="password"
name="newcustomerpassword"
id="new-customer-password"
data-validate="{required: true, 'validate-customer-password':true}" autocomplete="off"/>
</div>
</div>
<div class="field _required confirm-pass" data-bind="fadeVisible: createNewAccount()">
<label class="label" for="new-customer-password-confirmation">
<span data-bind="i18n: 'Confirm Password'"></span>
</label>
<div class="control">
<input class="input-text"
data-bind="
attr: {
placeholder: $t('Confirm Password'),
}"
type="password"
name="newcustomerpassword_confirmation"
id="new-customer-password-confirmation"
data-validate="{required: true, equalTo:'#new-customer-password'}" autocomplete="off"/>
</div>
</div>
</fieldset>
<!-- /ko -->
</fieldset>
</form>
<!-- /ko -->
<div class="order-comment-block">
<label class="label">
<span data-bind="i18n: 'Order comment'"></span>
</label>
<div class="control">
<textarea class="admin__control-textarea" data-bind="
value: value,
valueUpdate: valueUpdate,
hasFocus: focused,
attr: {
name: inputName,
cols: cols,
rows: rows,
'aria-describedby': noticeId,
placeholder: placeholder,
id: uid,
disabled: disabled
}"
/>
</div>
</div>
<!-- ko if: isActive() || hasActiveOptions() -->
<div class="cart-gift-item" data-bind="blockLoader: isLoading">
<div class="gift-item-block block"
data-collapsible="true"
data-bind="css: {_active: formBlockVisibility() || resultBlockVisibility()}">
<div class="title" data-role="title" data-bind="click: $data.toggleFormBlockVisibility.bind($data)">
<span data-bind="i18n: 'Gift options'"></span>
</div>
<div class="content" data-role="content" data-bind="visible: formBlockVisibility() || resultBlockVisibility()">
<!-- ko ifnot: resultBlockVisibility() -->
<div class="gift-options">
<!-- ko foreach: getRegion('additionalOptions') -->
<!-- ko template: getTemplate() --><!-- /ko -->
<!-- /ko -->
<!-- ko template: formTemplate --><!--/ko-->
</div>
<!-- /ko -->
<div class="gift-summary">
<!-- ko if: resultBlockVisibility() -->
<!-- ko foreach: getRegion('additionalOptions') -->
<!--ko template: appliedTemplate --><!-- /ko -->
<!-- /ko -->
<!-- ko if: getObservable('message') -->
<div class="gift-message-summary">
<span data-bind="i18n: 'Message:'"></span>
<!-- ko text: getObservable('message') --><!-- /ko -->
</div>
<!-- /ko -->
<div class="actions-toolbar">
<div class="secondary">
<button type="submit"
class="action action-edit"
data-bind="attr: {title: $t('Edit')}, click: $data.editOptions.bind($data)">
<span data-bind="i18n: 'Edit'"></span>
</button>
<button class="action action-delete"
data-bind="attr: {title: $t('Delete')}, click: $data.deleteOptions.bind($data)">
<span data-bind="i18n: 'Delete'"></span>
</button>
</div>
</div>
<!-- /ko -->
</div>
</div>
</div>
</div>
<!-- /ko -->
<div if="isPaymentMethodsAvailable()"
class="items payment-methods">
<div repeat="foreach: paymentGroupsList, item: '$group'"
class="payment-group">
<!-- ko if: showFormShared($group) -->
<!-- ko foreach: getRegion('billing-address-form-shared') -->
<!-- ko template: getTemplate() --><!-- /ko -->
<!--/ko-->
<!--/ko-->
<each args="data: getRegion($group().displayArea), as: 'method'" render=""/>
</div>
</div>
<div ifnot="isPaymentMethodsAvailable()"
class="no-payments-block"
translate="'No Payment Methods'">
</div>
<li id="payment" role="presentation" class="checkout-payment-method" data-bind="fadeVisible: isVisible, blockLoader: isLoading, css: {'payment-virtual' : quoteIsVirtual}"">
<div id="checkout-step-payment"
class="step-content"
data-role="content"
role="tabpanel"
aria-hidden="false">
<!-- ko if: (quoteIsVirtual) -->
<!-- ko foreach: getRegion('customer-email') -->
<!-- ko template: getTemplate() --><!-- /ko -->
<!--/ko-->
<!--/ko-->
<form id="co-payment-form" class="form payments" novalidate="novalidate">
<input data-bind='attr: {value: getFormKey()}' type="hidden" name="form_key"/>
<fieldset class="fieldset">
<div class="step-title" data-bind="i18n: 'Payment Method'"></div>
<!-- ko foreach: getRegion('beforeMethods') -->
<!-- ko template: getTemplate() --><!-- /ko -->
<!-- /ko -->
<div id="checkout-payment-method-load" class="opc-payment" data-bind="visible: isPaymentMethodsAvailable">
<!-- ko foreach: getRegion('payment-methods-list') -->
<!-- ko template: getTemplate() --><!-- /ko -->
<!-- /ko -->
</div>
<div class="no-quotes-block" data-bind="visible: isPaymentMethodsAvailable() == false">
<!-- ko i18n: 'No Payment method available.'--><!-- /ko -->
</div>
<!-- ko foreach: getRegion('afterMethods') -->
<!-- ko template: getTemplate() --><!-- /ko -->
<!-- /ko -->
</fieldset>
</form>
</div>
</li>
<style type="text/css">
@media(max-width: 1024px){
.payment-option.opc-payment-additional.discount-code{
margin-bottom: 100px;
}
}
</style>
<div class="payment-option opc-payment-additional discount-code" style="background-color: #f9f9f9;padding: 15px;">
<div class="payment-option-content" data-role="content">
<!-- ko foreach: getRegion('messages') -->
<!-- ko template: getTemplate() --><!-- /ko -->
<!--/ko-->
<form class="form form-discount" id="discount-form">
<div class="payment-option-inner">
<div class="field">
<div class="control">
<input class="input-text"
type="text"
id="discount-code"
name="discount_code"
data-validate="{'required-entry':true}"
data-bind="value: couponCode, attr:{placeholder: $t('Enter discount code')} " />
</div>
</div>
</div>
<div class="actions-toolbar">
<div class="primary">
<!-- ko ifnot: isApplied() -->
<button class="action action-apply" type="submit" data-bind="'value': $t('Apply Discount'), click: apply">
<span><!-- ko i18n: 'Apply Discount'--><!-- /ko --></span>
</button>
<!-- /ko -->
<!-- ko if: isApplied() -->
<button class="action action-cancel" type="submit" data-bind="'value': $t('Cancel'), click: cancel">
<span><!-- ko i18n: 'Cancel coupon'--><!-- /ko --></span>
</button>
<!-- /ko -->
</div>
</div>
</form>
</div>
</div>
<div class="actions-toolbar">
<div class="primary">
<button class="action primary checkout btn-placeorder"
type="submit"
data-bind="
enable: isPlaceOrderActionAllowed(),
click: placeOrder,
attr: {
title: placeOrderLabel()
},
css: {disabled: !isPlaceOrderActionAllowed()},
fadeVisible: isVisible
" disabled>
<span data-bind="text: placeOrderLabel()"></span>
</button>
</div>
</div>
<div class="shipping-address-item" data-bind="click: selectAddress, css: isSelected() ? 'selected-item' : 'not-selected-item'">
<!-- ko text: address().prefix --><!-- /ko --> <!-- ko text: address().firstname --><!-- /ko --> <!-- ko text: address().middlename --><!-- /ko -->
<!-- ko text: address().lastname --><!-- /ko --> <!-- ko text: address().suffix --><!-- /ko --><br/>
<!-- ko text: _.values(address().street).join(", ") --><!-- /ko --><br/>
<!-- ko text: address().city --><!-- /ko -->, <span data-bind="html: address().region"></span> <!-- ko text: address().postcode --><!-- /ko --><br/>
<!-- ko text: getCountryName(address().countryId) --><!-- /ko --><br/>
<!-- ko if: (address().telephone) -->
<a data-bind="text: address().telephone, attr: {'href': 'tel:' + address().telephone}"></a>
<!-- /ko --><br/>
<!-- ko foreach: { data: address().customAttributes, as: 'element' } -->
<!-- ko foreach: { data: Object.keys(element), as: 'attribute' } -->
<!-- ko if: (typeof element[attribute] === "object") -->
<!-- ko text: element[attribute].value --><!-- /ko -->
<!-- /ko -->
<!-- ko if: (typeof element[attribute] === "string") -->
<!-- ko text: element[attribute] --><!-- /ko -->
<!-- /ko --><br/>
<!-- /ko -->
<!-- /ko -->
<!-- ko if: (address().isEditable()) -->
<button type="button"
class="action edit-address-link"
data-bind="click: editAddress, visible: address().isEditable()">
<span data-bind="i18n: 'Edit'"></span>
</button>
<!-- /ko -->
</div>
<form class="form form-shipping-address" id="co-shipping-form" data-bind="afterRender: autoFillAddress, attr: {'data-hasrequired': $t('* Required Fields')}">
<!-- ko foreach: getRegion('before-fields') -->
<!-- ko template: getTemplate() --><!-- /ko -->
<!--/ko-->
<div id="shipping-new-address-form" class="fieldset address">
<!-- ko foreach: getRegion('additional-fieldsets') -->
<!-- ko template: getTemplate() --><!-- /ko -->
<!--/ko-->
<!-- ko if: (isCustomerLoggedIn) -->
<div class="field choice" data-bind="visible: !isFormInline">
<input type="checkbox" class="checkbox" id="shipping-save-in-address-book" data-bind="checked: saveInAddressBook" />
<label class="label" for="shipping-save-in-address-book">
<span data-bind="i18n: 'Save in address book'"></span>
</label>
</div>
<!-- /ko -->
</div>
</form>
<div id="opc-sidebar">
<!-- ko foreach: getRegion('summary') -->
<!-- ko template: getTemplate() --><!-- /ko -->
<!--/ko-->
<div class="opc-block-shipping-information">
<!-- ko foreach: getRegion('shipping-information') -->
<!-- ko template: getTemplate() --><!-- /ko -->
<!--/ko-->
</div>
</div>
<!-- ko foreach: getRegion('before_details') -->
<!-- ko template: getTemplate() --><!-- /ko -->
<!-- /ko -->
<div class="product-item-details">
<div class="product-item-inner">
<div class="product-item-name-block">
<strong class="product-item-name">
<a data-bind="html: $parent.name, attr: {href: getProductUrl($parent.item_id)}"></a>
</strong>
<div class="details-qty">
<span class="label"><!-- ko i18n: 'Qty' --><!-- /ko --></span>
<input type="number" class="input-text qty" data-bind="
value: $parent.qty,
event: {
change: function () {updateQty($parent);}
},
attr: {
title: titleQtyBox
}"/>
<span class="qty-button">
<span class="increase" data-bind="attr: {action: 'increase', itemId: $parent.item_id}, click: updateQtyButton">&nbsp;</span>
<span class="decrease" data-bind="attr: {action: 'decrease', itemId: $parent.item_id}, click: updateQtyButton">&nbsp;</span>
</span>
<span class="error-message" data-bind="attr: {itemId: $parent.item_id}"></span>
</div>
</div>
<!-- ko foreach: getRegion('after_details') -->
<!-- ko template: getTemplate() --><!-- /ko -->
<!-- /ko -->
</div>
<!-- ko if: (JSON.parse($parent.options).length > 0)-->
<div class="product options" data-bind="mageInit: {'collapsible':{'openedState': 'active'}}">
<span data-role="title" class="toggle"><!-- ko i18n: 'View Details' --><!-- /ko --></span>
<div data-role="content" class="content">
<strong class="subtitle"><!-- ko i18n: 'Options Details' --><!-- /ko --></strong>
<dl class="item-options">
<!--ko foreach: JSON.parse($parent.options)-->
<dt class="label" data-bind="text: label"></dt>
<!-- ko if: ($data.full_view)-->
<dd class="values" data-bind="html: full_view"></dd>
<!-- /ko -->
<!-- ko ifnot: ($data.full_view)-->
<dd class="values" data-bind="html: value"></dd>
<!-- /ko -->
<!-- /ko -->
</dl>
</div>
</div>
<!-- /ko -->
</div>
<!-- ko foreach: getOpcWidget('widget_after_placeorder') -->
<div data-bind="html: $data"></div>
<!--/ko-->
<?php
/**
* Copyright 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
/**
* Field renderer for PayPal merchant country selector
*/
namespace Rokanthemes\RokanBase\Block\Adminhtml\Button\Export;
use Magento\Paypal\Model\Config\StructurePlugin;
class Block extends \Magento\Config\Block\System\Config\Form\Field
{
/**
* Config path for merchant country selector
*/
const FIELD_CONFIG_PATH = 'paypal/general/merchant_country';
/**
* Request parameter name for default country
*/
const REQUEST_PARAM_DEFAULT_COUNTRY = 'paypal_default_country';
/**
* Country of default scope
*
* @var string
*/
protected $_defaultCountry;
/**
* @var \Magento\Backend\Model\Url
*/
protected $_url;
/**
* @var \Magento\Framework\View\Helper\Js
*/
protected $_jsHelper;
/**
* @var \Magento\Directory\Helper\Data
*/
protected $directoryHelper;
/**
* @param \Magento\Backend\Block\Template\Context $context
* @param \Magento\Backend\Model\Url $url
* @param \Magento\Framework\View\Helper\Js $jsHelper
* @param \Magento\Directory\Helper\Data $directoryHelper
* @param array $data
*/
public function __construct(
\Magento\Backend\Block\Template\Context $context,
\Magento\Backend\Model\Url $url,
\Magento\Framework\View\Helper\Js $jsHelper,
\Magento\Directory\Helper\Data $directoryHelper,
array $data = []
) {
parent::__construct($context, $data);
$this->_url = $url;
$this->_jsHelper = $jsHelper;
$this->directoryHelper = $directoryHelper;
}
/**
* Get country selector html
*
* @param \Magento\Framework\Data\Form\Element\AbstractElement $element
* @return string
*/
protected function _getElementHtml(\Magento\Framework\Data\Form\Element\AbstractElement $element)
{
/** @var \Magento\Backend\Block\Widget\Button $buttonBlock */
$buttonBlock = $this->getForm()->getLayout()->createBlock('Magento\Backend\Block\Widget\Button');
$params = [
'website' => $buttonBlock->getRequest()->getParam('website')
];
$url = $this->getUrl("*/rokanbase/exportblock", $params);
$data = [
'id' => 'export_block' ,
'label' => __('Export Blocks'),
'onclick' => "setLocation('" . $url . "')",
];
$html = $buttonBlock->setData($data)->toHtml();
return $html;
}
}
<?php
/**
* Copyright 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
/**
* Field renderer for PayPal merchant country selector
*/
namespace Rokanthemes\RokanBase\Block\Adminhtml\Button\Export;
use Magento\Paypal\Model\Config\StructurePlugin;
class Page extends \Magento\Config\Block\System\Config\Form\Field
{
/**
* Config path for merchant country selector
*/
const FIELD_CONFIG_PATH = 'paypal/general/merchant_country';
/**
* Request parameter name for default country
*/
const REQUEST_PARAM_DEFAULT_COUNTRY = 'paypal_default_country';
/**
* Country of default scope
*
* @var string
*/
protected $_defaultCountry;
/**
* @var \Magento\Backend\Model\Url
*/
protected $_url;
/**
* @var \Magento\Framework\View\Helper\Js
*/
protected $_jsHelper;
/**
* @var \Magento\Directory\Helper\Data
*/
protected $directoryHelper;
/**
* @param \Magento\Backend\Block\Template\Context $context
* @param \Magento\Backend\Model\Url $url
* @param \Magento\Framework\View\Helper\Js $jsHelper
* @param \Magento\Directory\Helper\Data $directoryHelper
* @param array $data
*/
public function __construct(
\Magento\Backend\Block\Template\Context $context,
\Magento\Backend\Model\Url $url,
\Magento\Framework\View\Helper\Js $jsHelper,
\Magento\Directory\Helper\Data $directoryHelper,
array $data = []
) {
parent::__construct($context, $data);
$this->_url = $url;
$this->_jsHelper = $jsHelper;
$this->directoryHelper = $directoryHelper;
}
/**
* Get country selector html
*
* @param \Magento\Framework\Data\Form\Element\AbstractElement $element
* @return string
*/
protected function _getElementHtml(\Magento\Framework\Data\Form\Element\AbstractElement $element)
{
/** @var \Magento\Backend\Block\Widget\Button $buttonBlock */
$buttonBlock = $this->getForm()->getLayout()->createBlock('Magento\Backend\Block\Widget\Button');
$params = [
'website' => $buttonBlock->getRequest()->getParam('website')
];
$url = $this->getUrl("*/rokanbase/exportpage", $params);
$data = [
'id' => 'export_page' ,
'label' => __('Export Pages'),
'onclick' => "setLocation('" . $url . "')",
];
$html = $buttonBlock->setData($data)->toHtml();
return $html;
}
}
<?php
/**
* Copyright 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
/**
* Field renderer for PayPal merchant country selector
*/
namespace Rokanthemes\RokanBase\Block\Adminhtml\Button\Import;
use Magento\Paypal\Model\Config\StructurePlugin;
class Block extends \Magento\Config\Block\System\Config\Form\Field
{
/**
* Config path for merchant country selector
*/
const FIELD_CONFIG_PATH = 'paypal/general/merchant_country';
/**
* Request parameter name for default country
*/
const REQUEST_PARAM_DEFAULT_COUNTRY = 'paypal_default_country';
/**
* Country of default scope
*
* @var string
*/
protected $_defaultCountry;
/**
* @var \Magento\Backend\Model\Url
*/
protected $_url;
/**
* @var \Magento\Framework\View\Helper\Js
*/
protected $_jsHelper;
/**
* @var \Magento\Directory\Helper\Data
*/
protected $directoryHelper;
/**
* @param \Magento\Backend\Block\Template\Context $context
* @param \Magento\Backend\Model\Url $url
* @param \Magento\Framework\View\Helper\Js $jsHelper
* @param \Magento\Directory\Helper\Data $directoryHelper
* @param array $data
*/
public function __construct(
\Magento\Backend\Block\Template\Context $context,
\Magento\Backend\Model\Url $url,
\Magento\Framework\View\Helper\Js $jsHelper,
\Magento\Directory\Helper\Data $directoryHelper,
array $data = []
) {
parent::__construct($context, $data);
$this->_url = $url;
$this->_jsHelper = $jsHelper;
$this->directoryHelper = $directoryHelper;
}
/**
* Get country selector html
*
* @param \Magento\Framework\Data\Form\Element\AbstractElement $element
* @return string
*/
protected function _getElementHtml(\Magento\Framework\Data\Form\Element\AbstractElement $element)
{
/** @var \Magento\Backend\Block\Widget\Button $buttonBlock */
$buttonBlock = $this->getForm()->getLayout()->createBlock('Magento\Backend\Block\Widget\Button');
$params = [
'website' => $buttonBlock->getRequest()->getParam('website')
];
$url = $this->getUrl("*/rokanbase/importblock", $params);
$data = [
'id' => 'import_block' ,
'label' => __('Import Block'),
'onclick' => "setLocation('" . $url . "')",
];
$html = $buttonBlock->setData($data)->toHtml();
return $html;
}
}
<?php
/**
* Copyright 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
/**
* Field renderer for PayPal merchant country selector
*/
namespace Rokanthemes\RokanBase\Block\Adminhtml\Button\Import;
use Magento\Paypal\Model\Config\StructurePlugin;
class Page extends \Magento\Config\Block\System\Config\Form\Field
{
/**
* Config path for merchant country selector
*/
const FIELD_CONFIG_PATH = 'paypal/general/merchant_country';
/**
* Request parameter name for default country
*/
const REQUEST_PARAM_DEFAULT_COUNTRY = 'paypal_default_country';
/**
* Country of default scope
*
* @var string
*/
protected $_defaultCountry;
/**
* @var \Magento\Backend\Model\Url
*/
protected $_url;
/**
* @var \Magento\Framework\View\Helper\Js
*/
protected $_jsHelper;
/**
* @var \Magento\Directory\Helper\Data
*/
protected $directoryHelper;
/**
* @param \Magento\Backend\Block\Template\Context $context
* @param \Magento\Backend\Model\Url $url
* @param \Magento\Framework\View\Helper\Js $jsHelper
* @param \Magento\Directory\Helper\Data $directoryHelper
* @param array $data
*/
public function __construct(
\Magento\Backend\Block\Template\Context $context,
\Magento\Backend\Model\Url $url,
\Magento\Framework\View\Helper\Js $jsHelper,
\Magento\Directory\Helper\Data $directoryHelper,
array $data = []
) {
parent::__construct($context, $data);
$this->_url = $url;
$this->_jsHelper = $jsHelper;
$this->directoryHelper = $directoryHelper;
}
/**
* Get country selector html
*
* @param \Magento\Framework\Data\Form\Element\AbstractElement $element
* @return string
*/
protected function _getElementHtml(\Magento\Framework\Data\Form\Element\AbstractElement $element)
{
/** @var \Magento\Backend\Block\Widget\Button $buttonBlock */
$buttonBlock = $this->getForm()->getLayout()->createBlock('Magento\Backend\Block\Widget\Button');
$params = [
'website' => $buttonBlock->getRequest()->getParam('website')
];
$url = $this->getUrl("*/rokanbase/importpage", $params);
$data = [
'id' => 'import_page' ,
'label' => __('Import Page'),
'onclick' => "setLocation('" . $url . "')",
];
$html = $buttonBlock->setData($data)->toHtml();
return $html;
}
}
<?php
/**
*
* Copyright 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Rokanthemes\RokanBase\Controller\Adminhtml\Rokanbase;
use Magento\Framework\App\Filesystem\DirectoryList;
class Exportblock extends \Magento\Backend\App\Action
{
/**
* @var \Magento\Backend\App\Response\Http\FileFactory
*/
protected $fileFactory;
protected $_parser;
/**
* @var \Magento\PageCache\Model\Config
*/
protected $config;
/**
* @param \Magento\Backend\App\Action\Context $context
* @param \Magento\Framework\App\Response\Http\FileFactory $fileFactory
* @param \Magento\PageCache\Model\Config $config
*/
public function __construct(
\Magento\Backend\App\Action\Context $context,
\Magento\Framework\App\Response\Http\FileFactory $fileFactory,
\Magento\PageCache\Model\Config $config
) {
parent::__construct($context);
$this->config = $config;
$this->_importPath = BP . '/' . DirectoryList::VAR_DIR . '/';
$this->fileFactory = $fileFactory;
$this->_parser = new \Magento\Framework\Xml\Parser();
}
/**
* Export Varnish Configuration as .vcl
*
* @return \Magento\Framework\App\ResponseInterface
*/
public function execute()
{
$fileName = 'cms_blocks.xml';
$varnishVersion = $this->getRequest()->getParam('varnish');
$collection = $this->_objectManager->get('Magento\Cms\Model\Block')->getCollection();
$dom = $this->_parser->getDom();
$dom->formatOutput = true;
$root = $dom->createElement('root');
$blocks = $dom->createElement('blocks');
$skipKeys = array('block_id', 'creation_time', 'update_time', '_first_store_id', 'store_code');
foreach($collection as $block)
{
$item = $dom->createElement('item');
foreach($block->getData() as $key=>$value)
{
if(in_array($key, $skipKeys))
continue;
$element = $dom->createElement($key);
if(is_array($value) && $key == 'store_id')
{
foreach($value as $key2=>$value2)
{
$element2 = $dom->createElement('id');
$content = $dom->createCDATASection($value2);
$element2->appendChild($content);
$element->appendChild($element2);
}
$item->appendChild($element);
continue;
}
if(is_array($value))
$value = implode(',', $value);
$element = $dom->createElement($key);
$content = $dom->createCDATASection($value);
$element->appendChild($content);
$item->appendChild($element);
}
$blocks->appendChild($item);
}
$root->appendChild($blocks);
$dom->appendChild($root);
$content = $dom->saveXML();
$dom->save($this->_importPath . $fileName);
$this->messageManager->addSuccess(__('Blocks exported to folder var.'));
$this->_redirect('adminhtml/system_config/edit/section/import_export');
}
}
?>
\ No newline at end of file
<?php
/**
*
* Copyright 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Rokanthemes\RokanBase\Controller\Adminhtml\Rokanbase;
use Magento\Framework\App\Filesystem\DirectoryList;
class Exportpage extends \Magento\Backend\App\Action
{
/**
* @var \Magento\Backend\App\Response\Http\FileFactory
*/
protected $fileFactory;
protected $_parser;
/**
* @var \Magento\PageCache\Model\Config
*/
protected $config;
/**
* @param \Magento\Backend\App\Action\Context $context
* @param \Magento\Framework\App\Response\Http\FileFactory $fileFactory
* @param \Magento\PageCache\Model\Config $config
*/
public function __construct(
\Magento\Backend\App\Action\Context $context,
\Magento\Framework\App\Response\Http\FileFactory $fileFactory,
\Magento\PageCache\Model\Config $config
) {
parent::__construct($context);
$this->config = $config;
$this->fileFactory = $fileFactory;
$this->_importPath = BP . '/' . DirectoryList::VAR_DIR . '/';
$this->_parser = new \Magento\Framework\Xml\Parser();
}
/**
* Export Varnish Configuration as .vcl
*
* @return \Magento\Framework\App\ResponseInterface
*/
public function execute()
{
$fileName = 'cms_pages.xml';
$varnishVersion = $this->getRequest()->getParam('varnish');
$collection = $this->_objectManager->get('Magento\Cms\Model\Page')->getCollection();
$dom = $this->_parser->getDom();
$dom->formatOutput = true;
$root = $dom->createElement('root');
$blocks = $dom->createElement('pages');
$skipKeys = array('page_id', 'creation_time', 'update_time', '_first_store_id', 'store_code');
foreach($collection as $block)
{
$item = $dom->createElement('item');
foreach($block->getData() as $key=>$value)
{
if(in_array($key, $skipKeys))
continue;
$element = $dom->createElement($key);
if(is_array($value) && $key == 'store_id')
{
foreach($value as $key2=>$value2)
{
$element2 = $dom->createElement('id');
$content = $dom->createCDATASection($value2);
$element2->appendChild($content);
$element->appendChild($element2);
}
$item->appendChild($element);
continue;
}
if(is_array($value))
$value = implode(',', $value);
$content = $dom->createCDATASection($value);
$element->appendChild($content);
$item->appendChild($element);
}
$blocks->appendChild($item);
}
$root->appendChild($blocks);
$dom->appendChild($root);
$content = $dom->saveXML();
$dom->save($this->_importPath . $fileName);
$this->messageManager->addSuccess(__('Pages exported to folder var.'));
$this->_redirect('adminhtml/system_config/edit/section/import_export');
}
}
?>
\ No newline at end of file
<?php
/**
*
* Copyright 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Rokanthemes\RokanBase\Controller\Adminhtml\Rokanbase;
use Magento\Framework\App\Filesystem\DirectoryList;
class Importblock extends \Magento\Backend\App\Action
{
/**
* @var \Magento\Backend\App\Response\Http\FileFactory
*/
protected $fileFactory;
/**
* @var \Magento\PageCache\Model\Config
*/
protected $config;
protected $_helperModule;
/**
* @param \Magento\Backend\App\Action\Context $context
* @param \Magento\Framework\App\Response\Http\FileFactory $fileFactory
* @param \Magento\PageCache\Model\Config $config
*/
public function __construct(
\Magento\Backend\App\Action\Context $context,
\Magento\Framework\App\Response\Http\FileFactory $fileFactory,
\Magento\PageCache\Model\Config $config,
\Rokanthemes\RokanBase\Helper\Data $helperModule
) {
parent::__construct($context);
$this->_helperModule = $helperModule;
$this->config = $config;
$this->fileFactory = $fileFactory;
$this->_importPath = BP . '/' . DirectoryList::VAR_DIR . '/';
$this->_parser = new \Magento\Framework\Xml\Parser();
}
/**
* Export Varnish Configuration as .vcl
*
* @return \Magento\Framework\App\ResponseInterface
*/
public function execute()
{
try {
$xmlPath = $this->_importPath . 'cms_blocks.xml';
$overwrite = false;
if($this->_helperModule->getConfigData("import_export/import/overwrite_blocks")) {
$overwrite = true;
}
if (!is_readable($xmlPath))
{
throw new \Exception(
__("Can't get the data file for import cms blocks/pages: ".$xmlPath)
);
}
$data = $this->_parser->load($xmlPath)->xmlToArray();
$cms_collection = null;
$conflictingOldItems = array();
$i = 0;
foreach($data['root']['blocks']['item'] as $_item) {
$exist = false;
$collection = $this->_objectManager->create('Magento\Cms\Model\Block')->getCollection();
$collection->addFieldToFilter('identifier', $_item['identifier']);
if($collection->getSize())
$exist = true;
$block = $this->_objectManager->create('Magento\Cms\Model\Block');
if($overwrite) {
if($exist) {
$conflictingOldItems[] = $_item['identifier'];
$block->load($_item['identifier']);
}
} else {
if($exist) {
continue;
}
}
$conflictingOldItems[] = $_item['identifier'];
$_item['store_id'] = array(0);
$block->addData($_item)->save();
$i++;
}
$this->messageManager->addSuccess(__('Imported %1 Item(s). ( %2 )', $i, implode("\n", $conflictingOldItems)));
} catch (\Exception $exception) {
$this->messageManager->addError($exception->getMessage());
}
$this->_redirect('*/system_config/edit/section/import_export', array('website' => $this->getRequest()->getParam('website')));
}
}
?>
\ No newline at end of file
<?php
/**
*
* Copyright 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Rokanthemes\RokanBase\Controller\Adminhtml\Rokanbase;
use Magento\Framework\App\Filesystem\DirectoryList;
use Rokanthemes\RokanBase\Helper\Data;
class Importpage extends \Magento\Backend\App\Action
{
/**
* @var \Magento\Backend\App\Response\Http\FileFactory
*/
protected $fileFactory;
/**
* @var \Magento\PageCache\Model\Config
*/
protected $_helperModule;
/**
* @param \Magento\Backend\App\Action\Context $context
* @param \Magento\Framework\App\Response\Http\FileFactory $fileFactory
* @param \Magento\PageCache\Model\Config $config
*/
public function __construct(
\Magento\Backend\App\Action\Context $context,
\Magento\Framework\App\Response\Http\FileFactory $fileFactory,
\Magento\PageCache\Model\Config $config,
\Rokanthemes\RokanBase\Helper\Data $helperModule
) {
parent::__construct($context);
$this->_helperModule = $helperModule;
$this->config = $config;
$this->fileFactory = $fileFactory;
$this->_importPath = BP . '/' . DirectoryList::VAR_DIR . '/';
$this->_parser = new \Magento\Framework\Xml\Parser();
}
/**
* Export Varnish Configuration as .vcl
*
* @return \Magento\Framework\App\ResponseInterface
*/
public function execute()
{
try {
$xmlPath = $this->_importPath . 'cms_pages.xml';
$overwrite = false;
if($this->_helperModule->getConfigData("import_export/import/overwrite_pages")) {
$overwrite = true;
}
if (!is_readable($xmlPath))
{
throw new \Exception(
__("Can't get the data file for import cms blocks/pages: ".$xmlPath)
);
}
$data = $this->_parser->load($xmlPath)->xmlToArray();
$cms_collection = null;
$conflictingOldItems = array();
$i = 0;
foreach($data['root']['pages']['item'] as $_item) {
$exist = false;
$collection = $this->_objectManager->create('Magento\Cms\Model\Page')->getCollection();
$collection->addFieldToFilter('identifier', $_item['identifier']);
if($collection->getSize())
$exist = true;
$page = $this->_objectManager->create('Magento\Cms\Model\Page');
if($overwrite) {
if($exist) {
$conflictingOldItems[] = $_item['identifier'];
$page->load($_item['identifier']);
}
} else {
if($exist) {
continue;
}
}
$_item['store_id'] = array(0);
$page->addData($_item)->save();
$i++;
}
$this->messageManager->addSuccess(__('Imported %1 Item(s). ( %2 )', $i, implode("\n", $conflictingOldItems)));
} catch (\Exception $exception) {
$this->messageManager->addError($exception->getMessage());
}
$this->_redirect('*/system_config/edit/section/import_export', array('website' => $this->getRequest()->getParam('website')));
}
}
?>
\ No newline at end of file
<?php
/**
*
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Rokanthemes\RokanBase\Controller\Catalog\Product\Compare;
use Magento\Framework\Exception\NoSuchEntityException;
class Add extends \Magento\Catalog\Controller\Product\Compare
{
/**
* Add item to compare list
*
* @return \Magento\Framework\Controller\ResultInterface
*/
public function execute()
{
$resultRedirect = $this->resultRedirectFactory->create();
if (!$this->_formKeyValidator->validate($this->getRequest())) {
$resultRedirect->setPath('catalog/product_compare/index');
return $resultRedirect;
}
$productId = (int)$this->getRequest()->getParam('product');
if ($productId && ($this->_customerVisitor->getId() || $this->_customerSession->isLoggedIn())) {
$storeId = $this->_storeManager->getStore()->getId();
try {
$product = $this->productRepository->getById($productId, false, $storeId);
} catch (NoSuchEntityException $e) {
$product = null;
}
if ($product) {
$this->_catalogProductCompareList->addProduct($product);
$productName = $this->_objectManager->get(
\Magento\Framework\Escaper::class
)->escapeHtml($product->getName());
$this->messageManager->addSuccess(__('You added product %1 to the comparison list.', $productName));
$this->_eventManager->dispatch('catalog_product_compare_add_product', ['product' => $product]);
}
$this->_objectManager->get(\Magento\Catalog\Helper\Product\Compare::class)->calculate();
}
$resultRedirect->setPath('catalog/product_compare/index');
return $resultRedirect;
}
}
<?php
/**
*
* Copyright © 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Rokanthemes\RokanBase\Controller\Checkout\Cart;
use Magento\Catalog\Api\ProductRepositoryInterface;
use Magento\Checkout\Model\Cart as CustomerCart;
use Magento\Framework\Exception\NoSuchEntityException;
/**
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class Add extends \Magento\Checkout\Controller\Cart\Add
{
/**
* Add product to shopping cart action
*
* @return \Magento\Framework\Controller\Result\Redirect
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
protected $_messege = '';
protected $_result = [];
public function execute()
{
if (!$this->_formKeyValidator->validate($this->getRequest())) {
return $this->resultRedirectFactory->create()->setPath('*/*/');
}
$params = $this->getRequest()->getParams();
try {
if (isset($params['qty'])) {
$filter = new \Zend_Filter_LocalizedToNormalized(
['locale' => $this->_objectManager->get('Magento\Framework\Locale\ResolverInterface')->getLocale()]
);
$params['qty'] = $filter->filter($params['qty']);
}
$product = $this->_initProduct();
$related = $this->getRequest()->getParam('related_product');
/**
* Check product availability
*/
if (!$product) {
return $this->goBack();
}
$this->cart->addProduct($product, $params);
if (!empty($related)) {
$this->cart->addProductsByIds(explode(',', $related));
}
$this->cart->save();
/**
* @todo remove wishlist observer \Magento\Wishlist\Observer\AddToCart
*/
$this->_eventManager->dispatch(
'checkout_cart_add_product_complete',
['product' => $product, 'request' => $this->getRequest(), 'response' => $this->getResponse()]
);
if (!$this->_checkoutSession->getNoCartRedirect(true)) {
if (!$this->cart->getQuote()->getHasError()) {
$message = __(
'You added %1 to your shopping cart.',
$product->getName()
);
$this->_messege = $message;
$this->messageManager->addSuccessMessage($message);
}
$this->_result['html'] = $this->_getHtmlResponeAjaxCart($product);
return $this->goBack(null, $product);
}
} catch (\Magento\Framework\Exception\LocalizedException $e) {
if ($this->_checkoutSession->getUseNotice(true)) {
$this->messageManager->addNotice(
$this->_objectManager->get('Magento\Framework\Escaper')->escapeHtml($e->getMessage())
);
} else {
$messages = array_unique(explode("\n", $e->getMessage()));
foreach ($messages as $message) {
$this->messageManager->addError(
$this->_objectManager->get('Magento\Framework\Escaper')->escapeHtml($message)
);
}
$messages = $this->messageManager->getMessages(true);
}
$url = $this->_checkoutSession->getRedirectUrl(true);
if (!$url) {
$cartUrl = $this->_objectManager->get('Magento\Checkout\Helper\Cart')->getCartUrl();
$url = $this->_redirect->getRedirectUrl($cartUrl);
}
return $this->goBack($url);
} catch (\Exception $e) {
$this->messageManager->addException($e, __('We can\'t add this item to your shopping cart right now.'));
$this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e);
return $this->goBack();
}
}
/**
* Resolve response
*
* @param string $backUrl
* @param \Magento\Catalog\Model\Product $product
* @return $this|\Magento\Framework\Controller\Result\Redirect
*/
protected function goBack($backUrl = null, $product = null)
{
if (!$this->getRequest()->isAjax()) {
return parent::_goBack($backUrl);
}
$result = $this->_result;
if ($backUrl || $backUrl = $this->getBackUrl()) {
$result['backUrl'] = $backUrl;
} else {
if ($product && !$product->getIsSalable()) {
$result['product'] = [
'statusText' => __('Out of stock')
];
}
}
$this->getResponse()->representJson(
$this->_objectManager->get('Magento\Framework\Json\Helper\Data')->jsonEncode($result)
);
}
protected function _getHtmlResponeAjaxCart($product)
{
$message = __('You added <a href="'. $product->getProductUrl() .'">%1</a> to your shopping cart.',
$product->getName()
);
$html = '<div class="popup_avaiable">'.$message.'<br>
<div class="action_button">
<ul>
<li>
<button title="'. __('Continue Shopping') . '" class="button btn-continue" onclick="jQuery.fancybox.close();">'. __('Continue Shopping') . '</button>
</li>
<li>
<a title="Checkout" class="button btn-viewcart" href="'. $this->_url->getUrl('checkout/cart') .'"><span>'. __('View cart &amp; checkout'). '</span></a>
</li>
</ul>
</div>
</div>';
return $html;
}
}
<?php
/**
* @Author: Harry - Hai Le
* @Email: hailt1911@gmail.com
* @File Name: Data.php
* @File Path:
* @Date: 2015-04-07 19:26:42
* @Last Modified by: zero
* @Last Modified time: 2015-07-28 08:35:17
*/
namespace Rokanthemes\RokanBase\Helper;
class Data extends \Magento\Framework\App\Helper\AbstractHelper {
public function __construct(
\Magento\Framework\App\Helper\Context $context
) {
parent::__construct($context);
}
public function getConfigData($path)
{
$value = $this->scopeConfig->getValue($path, \Magento\Store\Model\ScopeInterface::SCOPE_STORE);
return $value;
}
public function getInstockLabel($product)
{
if($label = $product->getDeliveryLabel())
return $label;
if($label = $this->getConfigData('cataloginventory/options/delivery_label'))
return $label;
return __('In Stock');
}
}
<?php
namespace Rokanthemes\RokanBase\Model\Rewrite\Store;
class StoreManager extends \Magento\Store\Model\StoreManager
{
public function getStore($storeId = null)
{
if (!isset($storeId) || '' === $storeId || $storeId === true) {
if (null === $this->currentStoreId || '' === $this->currentStoreId) {
\Magento\Framework\Profiler::start('store.resolve');
$this->currentStoreId = $this->storeResolver->getCurrentStoreId();
\Magento\Framework\Profiler::stop('store.resolve');
}
$storeId = $this->currentStoreId;
}
if ($storeId instanceof \Magento\Store\Api\Data\StoreInterface) {
return $storeId;
}
$store = is_numeric($storeId)
? $this->storeRepository->getById($storeId)
: $this->storeRepository->get($storeId);
return $store;
}
}
<?php
namespace Rokanthemes\RokanBase\Setup;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Eav\Setup\EavSetupFactory;
use Magento\Eav\Setup\EavSetup;
/**
* @codeCoverageIgnore
*/
class InstallData implements InstallDataInterface{
/**
* {@inheritdoc}
*/
/**
* EAV setup factory
*
* @var EavSetupFactory
*/
private $eavSetupFactory;
/**
* Init
*
* @param EavSetupFactory $eavSetupFactory
*/
public function __construct(EavSetupFactory $eavSetupFactory)
{
$this->eavSetupFactory = $eavSetupFactory;
}
public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
{
/** @var EavSetup $eavSetup */
$eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);
$installer = $setup;
$installer->startSetup();
$installer->endSetup();
}
}
{
"name": "rokanthemes/module-RokanBase",
"description": "N/A",
"require": {
"php": "~5.5.0|~5.6.0|~7.0.0"
},
"type": "magento2-module",
"version": "1.0.0",
"license": [
"OSL-3.0",
"AFL-3.0"
],
"autoload": {
"files": [ "registration.php" ],
"psr-4": {
"Rokanthemes\\RokanBase\\": ""
}
}
}
<?xml version="1.0"?>
<!--
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Acl/etc/acl.xsd">
<acl>
<resources>
<resource id="Magento_Backend::admin">
<resource id="Rokanthemes_RokanBase::rokanbase" title="Rokanthemes" translate="title" sortOrder="30">
<resource id="Rokanthemes_RokanBase::rokanbase_setting" title="Configuration" translate="title" sortOrder="10">
<resource id="Rokanthemes_RokanBase::rokanbase_import_export" title="Import and Export" translate="title" sortOrder="10" />
</resource>
</resource>
</resource>
</resources>
</acl>
</config>
<?xml version="1.0"?>
<!--
/**
* Copyright © 2015 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Backend:etc/menu.xsd">
<menu>
<add id="Rokanthemes_RokanBase::rokanbase" title="Rokanthemes" module="Rokanthemes_RokanBase" sortOrder="50" resource="Rokanthemes_RokanBase::rokanbase"/>
<add id="Rokanthemes_RokanBase::rokanbase_setting" parent="Rokanthemes_RokanBase::rokanbase" title="Configuration" module="Rokanthemes_RokanBase" sortOrder="100" resource="Rokanthemes_RokanBase::rokanbase_setting"/>
<add id="Rokanthemes_RokanBase::rokanbase_import_export" parent="Rokanthemes_RokanBase::rokanbase_setting" title="Import and Export" module="Rokanthemes_RokanBase" sortOrder="100" resource="Rokanthemes_RokanBase::rokanbase_import_export" action="adminhtml/system_config/edit/section/import_export" />
</menu>
</config>
<?xml version="1.0"?>
<!--
/**
* Copyright © 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
<router id="admin">
<route id="adminhtml">
<module name="Rokanthemes_RokanBase" before="Magento_Backend" />
</route>
</router>
</config>
<?xml version="1.0"?>
<!--
/**
* Copyright © 2015 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../Config/etc/system_file.xsd">
<system>
<tab id="rokanthemes" translate="label" sortOrder="400">
<label>Rokanthemes</label>
</tab>
<section id="import_export" translate="label" type="text" sortOrder="500" showInDefault="1" showInWebsite="1" showInStore="1">
<class>separator-top</class>
<label>Import - Export</label>
<tab>rokanthemes</tab>
<resource>Rokanthemes_RokanBase::rokanbase_import_export</resource>
<group id="import" translate="label" type="text" sortOrder="10" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Import</label>
<field id="overwrite_blocks" translate="label comment" type="select" sortOrder="0" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Overwrite Blocks</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<comment>Set to 'Yes', if you want to overwrite blocks.</comment>
</field>
<field id="static_block" translate="label comment" type="button" sortOrder="0" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Static Blocks</label>
<frontend_model>Rokanthemes\RokanBase\Block\Adminhtml\Button\Import\Block</frontend_model>
</field>
<field id="overwrite_pages" translate="label comment" type="select" sortOrder="0" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Overwrite Pages</label>
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<comment>Set to 'Yes', if you want to overwrite blocks.</comment>
</field>
<field id="import_pages" translate="label comment" type="button" sortOrder="0" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Custom Pages</label>
<frontend_model>Rokanthemes\RokanBase\Block\Adminhtml\Button\Import\Page</frontend_model>
</field>
</group>
<group id="export" translate="label" type="text" sortOrder="20" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Export</label>
<field id="static_block" translate="label comment" type="button" sortOrder="0" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Static Blocks</label>
<frontend_model>Rokanthemes\RokanBase\Block\Adminhtml\Button\Export\Block</frontend_model>
</field>
<field id="export_pages" translate="label comment" type="button" sortOrder="0" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Custom Pages</label>
<frontend_model>Rokanthemes\RokanBase\Block\Adminhtml\Button\Export\Page</frontend_model>
</field>
</group>
</section>
<section id="general">
<group id="country">
<field id="flag" translate="label" type="image" sortOrder="100" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Flag Image</label>
<comment>Allowed file types:PNG, GIF, JPG, JPEG, SVG.</comment>
<backend_model>Magento\Config\Model\Config\Backend\Image\Logo</backend_model>
<base_url type="media" scope_info="1">logo</base_url>
</field>
</group>
</section>
</system>
</config>
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../Magento/Store/etc/config.xsd">
<default>
<cataloginventory>
<options>
<delivery_label>Ship In 3 - 5 days</delivery_label>
</options>
</cataloginventory>
<csp>
<mode>
<storefront>
<report_only>0</report_only>
</storefront>
<admin>
<report_only>0</report_only>
</admin>
</mode>
</csp>
</default>
</config>
<?xml version="1.0"?>
<csp_whitelist xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Csp/etc/csp_whitelist.xsd">
<policies>
<policy id="script-src">
<values>
<value id="cloudflare" type="host">*.cloudflare.com</value>
<value id="twitter.com" type="host">*.twitter.com</value>
<value id="google-analytics" type="host">*.google-analytics.com</value>
<value id="twimg" type="host">*.twimg.com</value>
<value id="gstatic" type="host">*.gstatic.com</value>
<value id="trustedshops" type="host">*.trustedshops.com</value>
<value id="usercentrics" type="host">*.usercentrics.eu</value>
<value id="fontawesome" type="host">*.fontawesome.com</value>
<value id="google.com" type="host">*.google.com</value>
<value id="youtube.com" type="host">*.youtube.com</value>
<value id="maps.googleapis.com" type="host">maps.googleapis.com</value>
<value id="scontent.cdninstagram.com" type="host">scontent.cdninstagram.com</value>
</values>
</policy>
<policy id="style-src">
<values>
<value id="cloudflare" type="host">*.cloudflare.com</value>
<value id="googleapis" type="host">*.googleapis.com</value>
<value id="twitter.com" type="host">*.twitter.com</value>
<value id="twimg" type="host">*.twimg.com</value>
<value id="gstatic" type="host">*.gstatic.com</value>
<value id="typekit" type="host">*.typekit.net</value>
<value id="trustedshops" type="host">*.trustedshops.com</value>
<value id="usercentrics" type="host">*.usercentrics.eu</value>
<value id="fontawesome" type="host">*.fontawesome.com</value>
<value id="google.com" type="host">*.google.com</value>
<value id="youtube.com" type="host">*.youtube.com</value>
<value id="maps.googleapis.com" type="host">maps.googleapis.com</value>
<value id="scontent.cdninstagram.com" type="host">scontent.cdninstagram.com</value>
</values>
</policy>
<policy id="img-src">
<values>
<value id="cloudflare" type="host">*.cloudflare.com</value>
<value id="klarna-base" type="host">*.klarna.com</value>
<value id="googleadservices" type="host">*.googleadservices.com</value>
<value id="google-analytics" type="host">*.google-analytics.com</value>
<value id="paypal" type="host">*.paypal.com</value>
<value id="twitter.com" type="host">*.twitter.com</value>
<value id="twimg" type="host">*.twimg.com</value>
<value id="vimeocdn" type="host">*.vimeocdn.com</value>
<value id="youtube-img" type="host">*.ytimg.com</value>
<value id="data" type="host">'self' data:</value>
<value id="lightemporium" type="host">*.lightemporium.com</value>
<value id="usercentrics" type="host">*.usercentrics.eu</value>
<value id="google.com" type="host">*.google.com</value>
<value id="youtube.com" type="host">*.youtube.com</value>
<value id="maps.googleapis.com" type="host">maps.googleapis.com</value>
<value id="scontent.cdninstagram.com" type="host">scontent.cdninstagram.com</value>
</values>
</policy>
<policy id="connect-src">
<values>
<value id="cloudflare" type="host">*.cloudflare.com</value>
<value id="twitter.com" type="host">*.twitter.com</value>
<value id="paypal" type="host">*.paypal.com</value>
<value id="twimg" type="host">*.twimg.com</value>
<value id="google.com" type="host">*.google.com</value>
<value id="youtube.com" type="host">*.youtube.com</value>
<value id="maps.googleapis.com" type="host">maps.googleapis.com</value>
<value id="scontent.cdninstagram.com" type="host">scontent.cdninstagram.com</value>
</values>
</policy>
<policy id="font-src">
<values>
<value id="cloudflare" type="host">*.cloudflare.com</value>
<value id="twitter.com" type="host">*.twitter.com</value>
<value id="gstatic" type="host">*.gstatic.com</value>
<value id="typekit" type="host">*.typekit.net</value>
<value id="twimg" type="host">*.twimg.com</value>
<value id="trustedshops" type="host">*.trustedshops.com</value>
<value id="googleapis" type="host">*.googleapis.com</value>
<value id="google.com" type="host">*.google.com</value>
<value id="youtube.com" type="host">*.youtube.com</value>
<value id="maps.googleapis.com" type="host">maps.googleapis.com</value>
<value id="scontent.cdninstagram.com" type="host">scontent.cdninstagram.com</value>
</values>
</policy>
<policy id="frame-src">
<values>
<value id="twitter.com" type="host">*.twitter.com</value>
<value id="google.com" type="host">*.google.com</value>
<value id="youtube.com" type="host">*.youtube.com</value>
<value id="maps.googleapis.com" type="host">maps.googleapis.com</value>
<value id="scontent.cdninstagram.com" type="host">scontent.cdninstagram.com</value>
</values>
</policy>
<policy id="form-action">
<values>
<value id="twitter.com" type="host">*.twitter.com</value>
<value id="google.com" type="host">*.google.com</value>
<value id="youtube.com" type="host">*.youtube.com</value>
<value id="maps.googleapis.com" type="host">maps.googleapis.com</value>
<value id="scontent.cdninstagram.com" type="host">scontent.cdninstagram.com</value>
</values>
</policy>
</policies>
</csp_whitelist>
\ No newline at end of file
<?xml version="1.0"?>
<!--
/**
* Copyright © 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\Checkout\Controller\Cart\Add" type="Rokanthemes\RokanBase\Controller\Checkout\Cart\Add" />
<!-- <preference for="Magento\Catalog\Controller\Product\Compare\Add" type="Rokanthemes\RokanBase\Controller\Catalog\Product\Compare\Add" /> -->
<!--<preference for="Magento\Store\Model\StoreManager" type="Rokanthemes\RokanBase\Model\Rewrite\Store\StoreManager" />-->
</config>
<?xml version="1.0"?>
<!--
/**
* Copyright © 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
<router id="standard">
<route id="rokanbase" frontName="rokanbase">
<module name="Rokanthemes_RokanBase" />
</route>
</router>
</config>
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
<module name="Rokanthemes_RokanBase" setup_version="1.0.0" />
</config>
<?php
/**
* Copyright © 2015 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Rokanthemes_RokanBase',
__DIR__
);
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd">
<head>
<link src="Rokanthemes_RokanBase::css/chosen.css"/>
<link src="Rokanthemes_RokanBase::css/jquery.fancybox.css"/>
</head>
</page>
/**
* Copyright © 2015 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
var config = {
"shim": {
"rokanthemes/owl": ["jquery"],
"rokanthemes/elevatezoom": ["jquery"],
"rokanthemes/choose": ["jquery"],
"rokanthemes/fancybox": ["jquery"],
"rokanthemes/lazyloadimg": ["jquery"]
},
'paths': {
'rokanthemes/fancybox': 'Rokanthemes_RokanBase/js/jquery_fancybox',
"rokanthemes/owl": "Rokanthemes_RokanBase/js/owl_carousel",
"rokanthemes/elevatezoom": "Rokanthemes_RokanBase/js/jquery.elevatezoom",
"rokanthemes/choose": "Rokanthemes_RokanBase/js/jquery_choose",
"rokanthemes/equalheight": "Rokanthemes_RokanBase/js/equalheight",
'rokanthemes/lazyloadimg': 'Rokanthemes_RokanBase/js/jquery.lazyload.min'
},
"deps": ['rokanthemes/theme']
};
/*!
Chosen, a Select Box Enhancer for jQuery and Prototype
by Patrick Filler for Harvest, http://getharvest.com
Version 1.4.2
Full source at https://github.com/harvesthq/chosen
Copyright (c) 2011-2015 Harvest http://getharvest.com
MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
This file is generated by `grunt build`, do not edit it by hand.
*/
/* @group Base */
.chosen-container {
position: relative;
display: inline-block;
vertical-align: middle;
zoom: 1;
*display: inline;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
}
.chosen-container * {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.chosen-container .chosen-drop {
position: absolute;
top: 100%;
left: -9999px;
z-index: 1010;
width: 100%;
border: 1px solid #e8e8e8;
border-top: 0;
background: #fff;
}
.chosen-container.chosen-with-drop .chosen-drop {
left: 0;
}
.chosen-container a {
cursor: pointer;
}
.chosen-container .search-choice .group-name, .chosen-container .chosen-single .group-name {
margin-right: 4px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
font-weight: normal;
color: #999999;
}
.chosen-container .search-choice .group-name:after, .chosen-container .chosen-single .group-name:after {
content: ":";
padding-left: 2px;
vertical-align: top;
}
/* @end */
/* @group Single Chosen */
.chosen-container-single .chosen-single {
position: relative;
display: block;
border: 1px solid #e8e8e8;
background-color: #fff;
text-decoration: none;
white-space: nowrap;
padding: 6px 15px;
color: inherit;
}
.chosen-container-single .chosen-default {
color: #999;
}
.chosen-container-single .chosen-single span {
display: block;
overflow: hidden;
margin-right: 26px;
text-overflow: ellipsis;
white-space: nowrap;
}
.chosen-container-single .chosen-single-with-deselect span {
margin-right: 38px;
}
.chosen-container-single .chosen-single abbr {
position: absolute;
top: 6px;
right: 26px;
display: block;
width: 12px;
height: 12px;
background: url('chosen-sprite.png') -42px 1px no-repeat;
font-size: 1px;
}
.chosen-container-single .chosen-single abbr:hover {
background-position: -42px -10px;
}
.chosen-container-single.chosen-disabled .chosen-single abbr:hover {
background-position: -42px -10px;
}
.chosen-container-single .chosen-single div {
position: absolute;
top: 50%;
right: 10px;
display: block;
width: 20px;
height: 20px;
text-align: center;
line-height: 20px;
-webkit-transform: translateY(-50%);
-ms-transform: translateY(-50%);
-o-transform: translateY(-50%);
transform: translateY(-50%);
}
.chosen-container-single .chosen-single div b {
display: block;
width: 100%;
height: 100%;
}
.chosen-container-single .chosen-single div b:before{
font-family: 'FontAwesome';
content: "\f0d7";
}
.chosen-container-single .chosen-search {
position: relative;
z-index: 1010;
margin: 0;
padding: 3px 4px;
white-space: nowrap;
}
.chosen-container-single .chosen-search input[type="text"] {
margin: 1px 0;
padding: 6px 15px;
width: 100%;
height: auto;
outline: 0;
border: 1px solid #e8e8e8;
line-height: normal;
border-radius: 0;
}
.chosen-container-single .chosen-drop {
margin-top: -1px;
background-clip: padding-box;
}
.chosen-container-single.chosen-container-single-nosearch .chosen-search {
position: absolute;
left: -9999px;
}
/* @end */
/* @group Results */
.chosen-container .chosen-results {
position: relative;
overflow-x: hidden;
overflow-y: auto;
margin: 0 4px 4px 0;
padding: 0 0 0 4px;
max-height: 240px;
-webkit-overflow-scrolling: touch;
}
.chosen-container .chosen-results li {
display: none;
margin: 0;
padding: 5px 6px;
list-style: none;
word-wrap: break-word;
-webkit-touch-callout: none;
}
.chosen-container .chosen-results li.active-result {
display: list-item;
cursor: pointer;
}
.chosen-container .chosen-results li.disabled-result {
display: list-item;
color: #ccc;
cursor: default;
}
.chosen-container .chosen-results li.highlighted {
background-color: #b11e22;
color: #fff;
}
.chosen-container .chosen-results li.no-results {
color: #777;
display: list-item;
background: #fafafa;
}
.chosen-container .chosen-results li.group-result {
display: list-item;
font-weight: bold;
cursor: default;
}
.chosen-container .chosen-results li.group-option {
padding-left: 15px;
}
.chosen-container .chosen-results li em {
font-style: normal;
text-decoration: underline;
}
/* @end */
/* @group Multi Chosen */
.chosen-container-multi .chosen-choices {
position: relative;
overflow: hidden;
margin: 0;
padding: 0 5px;
width: 100%;
height: auto !important;
height: 1%;
border: 1px solid #aaa;
background-color: #fff;
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
background-image: -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%);
background-image: -moz-linear-gradient(#eeeeee 1%, #ffffff 15%);
background-image: -o-linear-gradient(#eeeeee 1%, #ffffff 15%);
background-image: linear-gradient(#eeeeee 1%, #ffffff 15%);
cursor: text;
}
.chosen-container-multi .chosen-choices li {
float: left;
list-style: none;
}
.chosen-container-multi .chosen-choices li.search-field {
margin: 0;
padding: 0;
white-space: nowrap;
}
.chosen-container-multi .chosen-choices li.search-field input[type="text"] {
margin: 1px 0;
padding: 0;
height: 25px;
outline: 0;
border: 0 !important;
background: transparent !important;
box-shadow: none;
color: #999;
font-size: 100%;
font-family: sans-serif;
line-height: normal;
border-radius: 0;
}
.chosen-container-multi .chosen-choices li.search-choice {
position: relative;
margin: 3px 5px 3px 0;
padding: 3px 20px 3px 5px;
border: 1px solid #aaa;
max-width: 100%;
border-radius: 3px;
background-color: #eeeeee;
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
background-image: -webkit-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
background-image: -moz-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
background-image: -o-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
background-size: 100% 19px;
background-repeat: repeat-x;
background-clip: padding-box;
box-shadow: 0 0 2px white inset, 0 1px 0 rgba(0, 0, 0, 0.05);
color: #333;
line-height: 13px;
cursor: default;
}
.chosen-container-multi .chosen-choices li.search-choice span {
word-wrap: break-word;
}
.chosen-container-multi .chosen-choices li.search-choice .search-choice-close {
position: absolute;
top: 4px;
right: 3px;
display: block;
width: 12px;
height: 12px;
background: url('chosen-sprite.png') -42px 1px no-repeat;
font-size: 1px;
}
.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover {
background-position: -42px -10px;
}
.chosen-container-multi .chosen-choices li.search-choice-disabled {
padding-right: 5px;
border: 1px solid #ccc;
background-color: #e4e4e4;
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
color: #666;
}
.chosen-container-multi .chosen-choices li.search-choice-focus {
background: #d4d4d4;
}
.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close {
background-position: -42px -10px;
}
.chosen-container-multi .chosen-results {
margin: 0;
padding: 0;
}
.chosen-container-multi .chosen-drop .result-selected {
display: list-item;
color: #ccc;
cursor: default;
}
/* @end */
/* @group Active */
.chosen-container-active.chosen-with-drop .chosen-single div {
border-left: none;
background: transparent;
}
.chosen-container-active .chosen-choices li.search-field input[type="text"] {
color: #222 !important;
}
/* @end */
/* @group Disabled Support */
.chosen-disabled {
opacity: 0.5 !important;
cursor: default;
}
.chosen-disabled .chosen-single {
cursor: default;
}
.chosen-disabled .chosen-choices .search-choice .search-choice-close {
cursor: default;
}
/* @end */
/* @group Right to Left */
.chosen-rtl {
text-align: right;
}
.chosen-rtl .chosen-single {
overflow: visible;
padding: 0 8px 0 0;
}
.chosen-rtl .chosen-single span {
margin-right: 0;
margin-left: 26px;
direction: rtl;
}
.chosen-rtl .chosen-single-with-deselect span {
margin-left: 38px;
}
.chosen-rtl .chosen-single div {
right: auto;
left: 3px;
}
.chosen-rtl .chosen-single abbr {
right: auto;
left: 26px;
}
.chosen-rtl .chosen-choices li {
float: right;
}
.chosen-rtl .chosen-choices li.search-field input[type="text"] {
direction: rtl;
}
.chosen-rtl .chosen-choices li.search-choice {
margin: 3px 5px 3px 0;
padding: 3px 5px 3px 19px;
}
.chosen-rtl .chosen-choices li.search-choice .search-choice-close {
right: auto;
left: 4px;
}
.chosen-rtl.chosen-container-single-nosearch .chosen-search,
.chosen-rtl .chosen-drop {
left: 9999px;
}
.chosen-rtl.chosen-container-single .chosen-results {
margin: 0 0 4px 4px;
padding: 0 4px 0 0;
}
.chosen-rtl .chosen-results li.group-option {
padding-right: 15px;
padding-left: 0;
}
.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div {
border-right: none;
}
.chosen-rtl .chosen-search input[type="text"] {
padding: 4px 5px 4px 20px;
background: white url('chosen-sprite.png') no-repeat -30px -20px;
background: url('chosen-sprite.png') no-repeat -30px -20px;
direction: rtl;
}
.chosen-rtl.chosen-container-single .chosen-single div b {
background-position: 6px 2px;
}
.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b {
background-position: -12px 2px;
}
/* @end */
#fancybox-buttons {
position: fixed;
left: 0;
width: 100%;
z-index: 8050;
}
#fancybox-buttons.top {
top: 10px;
}
#fancybox-buttons.bottom {
bottom: 10px;
}
#fancybox-buttons ul {
display: block;
width: 166px;
height: 30px;
margin: 0 auto;
padding: 0;
list-style: none;
border: 1px solid #111;
border-radius: 3px;
-webkit-box-shadow: inset 0 0 0 1px rgba(255,255,255,.05);
-moz-box-shadow: inset 0 0 0 1px rgba(255,255,255,.05);
box-shadow: inset 0 0 0 1px rgba(255,255,255,.05);
background: rgb(50,50,50);
background: -moz-linear-gradient(top, rgb(68,68,68) 0%, rgb(52,52,52) 50%, rgb(41,41,41) 50%, rgb(51,51,51) 100%);
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgb(68,68,68)), color-stop(50%,rgb(52,52,52)), color-stop(50%,rgb(41,41,41)), color-stop(100%,rgb(51,51,51)));
background: -webkit-linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%);
background: -o-linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%);
background: -ms-linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%);
background: linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#444444', endColorstr='#222222',GradientType=0 );
}
#fancybox-buttons ul li {
float: left;
margin: 0;
padding: 0;
}
#fancybox-buttons a {
display: block;
width: 30px;
height: 30px;
text-indent: -9999px;
background-color: transparent;
background-image: url('fancybox_buttons.png');
background-repeat: no-repeat;
outline: none;
opacity: 0.8;
}
#fancybox-buttons a:hover {
opacity: 1;
}
#fancybox-buttons a.btnPrev {
background-position: 5px 0;
}
#fancybox-buttons a.btnNext {
background-position: -33px 0;
border-right: 1px solid #3e3e3e;
}
#fancybox-buttons a.btnPlay {
background-position: 0 -30px;
}
#fancybox-buttons a.btnPlayOn {
background-position: -30px -30px;
}
#fancybox-buttons a.btnToggle {
background-position: 3px -60px;
border-left: 1px solid #111;
border-right: 1px solid #3e3e3e;
width: 35px
}
#fancybox-buttons a.btnToggleOn {
background-position: -27px -60px;
}
#fancybox-buttons a.btnClose {
border-left: 1px solid #111;
width: 35px;
background-position: -56px 0px;
}
#fancybox-buttons a.btnDisabled {
opacity : 0.4;
cursor: default;
}
\ No newline at end of file
/*!
* Buttons helper for fancyBox
* version: 1.0.5 (Mon, 15 Oct 2012)
* @requires fancyBox v2.0 or later
*
* Usage:
* $(".fancybox").fancybox({
* helpers : {
* buttons: {
* position : 'top'
* }
* }
* });
*
*/
(function ($) {
//Shortcut for fancyBox object
var F = $.fancybox;
//Add helper object
F.helpers.buttons = {
defaults : {
skipSingle : false, // disables if gallery contains single image
position : 'top', // 'top' or 'bottom'
tpl : '<div id="fancybox-buttons"><ul><li><a class="btnPrev" title="Previous" href="javascript:;"></a></li><li><a class="btnPlay" title="Start slideshow" href="javascript:;"></a></li><li><a class="btnNext" title="Next" href="javascript:;"></a></li><li><a class="btnToggle" title="Toggle size" href="javascript:;"></a></li><li><a class="btnClose" title="Close" href="javascript:;"></a></li></ul></div>'
},
list : null,
buttons: null,
beforeLoad: function (opts, obj) {
//Remove self if gallery do not have at least two items
if (opts.skipSingle && obj.group.length < 2) {
obj.helpers.buttons = false;
obj.closeBtn = true;
return;
}
//Increase top margin to give space for buttons
obj.margin[ opts.position === 'bottom' ? 2 : 0 ] += 30;
},
onPlayStart: function () {
if (this.buttons) {
this.buttons.play.attr('title', 'Pause slideshow').addClass('btnPlayOn');
}
},
onPlayEnd: function () {
if (this.buttons) {
this.buttons.play.attr('title', 'Start slideshow').removeClass('btnPlayOn');
}
},
afterShow: function (opts, obj) {
var buttons = this.buttons;
if (!buttons) {
this.list = $(opts.tpl).addClass(opts.position).appendTo('body');
buttons = {
prev : this.list.find('.btnPrev').click( F.prev ),
next : this.list.find('.btnNext').click( F.next ),
play : this.list.find('.btnPlay').click( F.play ),
toggle : this.list.find('.btnToggle').click( F.toggle ),
close : this.list.find('.btnClose').click( F.close )
}
}
//Prev
if (obj.index > 0 || obj.loop) {
buttons.prev.removeClass('btnDisabled');
} else {
buttons.prev.addClass('btnDisabled');
}
//Next / Play
if (obj.loop || obj.index < obj.group.length - 1) {
buttons.next.removeClass('btnDisabled');
buttons.play.removeClass('btnDisabled');
} else {
buttons.next.addClass('btnDisabled');
buttons.play.addClass('btnDisabled');
}
this.buttons = buttons;
this.onUpdate(opts, obj);
},
onUpdate: function (opts, obj) {
var toggle;
if (!this.buttons) {
return;
}
toggle = this.buttons.toggle.removeClass('btnDisabled btnToggleOn');
//Size toggle button
if (obj.canShrink) {
toggle.addClass('btnToggleOn');
} else if (!obj.canExpand) {
toggle.addClass('btnDisabled');
}
},
beforeClose: function () {
if (this.list) {
this.list.remove();
}
this.list = null;
this.buttons = null;
}
};
}(jQuery));
/*!
* Media helper for fancyBox
* version: 1.0.6 (Fri, 14 Jun 2013)
* @requires fancyBox v2.0 or later
*
* Usage:
* $(".fancybox").fancybox({
* helpers : {
* media: true
* }
* });
*
* Set custom URL parameters:
* $(".fancybox").fancybox({
* helpers : {
* media: {
* youtube : {
* params : {
* autoplay : 0
* }
* }
* }
* }
* });
*
* Or:
* $(".fancybox").fancybox({,
* helpers : {
* media: true
* },
* youtube : {
* autoplay: 0
* }
* });
*
* Supports:
*
* Youtube
* http://www.youtube.com/watch?v=opj24KnzrWo
* http://www.youtube.com/embed/opj24KnzrWo
* http://youtu.be/opj24KnzrWo
* http://www.youtube-nocookie.com/embed/opj24KnzrWo
* Vimeo
* http://vimeo.com/40648169
* http://vimeo.com/channels/staffpicks/38843628
* http://vimeo.com/groups/surrealism/videos/36516384
* http://player.vimeo.com/video/45074303
* Metacafe
* http://www.metacafe.com/watch/7635964/dr_seuss_the_lorax_movie_trailer/
* http://www.metacafe.com/watch/7635964/
* Dailymotion
* http://www.dailymotion.com/video/xoytqh_dr-seuss-the-lorax-premiere_people
* Twitvid
* http://twitvid.com/QY7MD
* Twitpic
* http://twitpic.com/7p93st
* Instagram
* http://instagr.am/p/IejkuUGxQn/
* http://instagram.com/p/IejkuUGxQn/
* Google maps
* http://maps.google.com/maps?q=Eiffel+Tower,+Avenue+Gustave+Eiffel,+Paris,+France&t=h&z=17
* http://maps.google.com/?ll=48.857995,2.294297&spn=0.007666,0.021136&t=m&z=16
* http://maps.google.com/?ll=48.859463,2.292626&spn=0.000965,0.002642&t=m&z=19&layer=c&cbll=48.859524,2.292532&panoid=YJ0lq28OOy3VT2IqIuVY0g&cbp=12,151.58,,0,-15.56
*/
(function ($) {
"use strict";
//Shortcut for fancyBox object
var F = $.fancybox,
format = function( url, rez, params ) {
params = params || '';
if ( $.type( params ) === "object" ) {
params = $.param(params, true);
}
$.each(rez, function(key, value) {
url = url.replace( '$' + key, value || '' );
});
if (params.length) {
url += ( url.indexOf('?') > 0 ? '&' : '?' ) + params;
}
return url;
};
//Add helper object
F.helpers.media = {
defaults : {
youtube : {
matcher : /(youtube\.com|youtu\.be|youtube-nocookie\.com)\/(watch\?v=|v\/|u\/|embed\/?)?(videoseries\?list=(.*)|[\w-]{11}|\?listType=(.*)&list=(.*)).*/i,
params : {
autoplay : 1,
autohide : 1,
fs : 1,
rel : 0,
hd : 1,
wmode : 'opaque',
enablejsapi : 1
},
type : 'iframe',
url : '//www.youtube.com/embed/$3'
},
vimeo : {
matcher : /(?:vimeo(?:pro)?.com)\/(?:[^\d]+)?(\d+)(?:.*)/,
params : {
autoplay : 1,
hd : 1,
show_title : 1,
show_byline : 1,
show_portrait : 0,
fullscreen : 1
},
type : 'iframe',
url : '//player.vimeo.com/video/$1'
},
metacafe : {
matcher : /metacafe.com\/(?:watch|fplayer)\/([\w\-]{1,10})/,
params : {
autoPlay : 'yes'
},
type : 'swf',
url : function( rez, params, obj ) {
obj.swf.flashVars = 'playerVars=' + $.param( params, true );
return '//www.metacafe.com/fplayer/' + rez[1] + '/.swf';
}
},
dailymotion : {
matcher : /dailymotion.com\/video\/(.*)\/?(.*)/,
params : {
additionalInfos : 0,
autoStart : 1
},
type : 'swf',
url : '//www.dailymotion.com/swf/video/$1'
},
twitvid : {
matcher : /twitvid\.com\/([a-zA-Z0-9_\-\?\=]+)/i,
params : {
autoplay : 0
},
type : 'iframe',
url : '//www.twitvid.com/embed.php?guid=$1'
},
twitpic : {
matcher : /twitpic\.com\/(?!(?:place|photos|events)\/)([a-zA-Z0-9\?\=\-]+)/i,
type : 'image',
url : '//twitpic.com/show/full/$1/'
},
instagram : {
matcher : /(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i,
type : 'image',
url : '//$1/p/$2/media/?size=l'
},
google_maps : {
matcher : /maps\.google\.([a-z]{2,3}(\.[a-z]{2})?)\/(\?ll=|maps\?)(.*)/i,
type : 'iframe',
url : function( rez ) {
return '//maps.google.' + rez[1] + '/' + rez[3] + '' + rez[4] + '&output=' + (rez[4].indexOf('layer=c') > 0 ? 'svembed' : 'embed');
}
}
},
beforeLoad : function(opts, obj) {
var url = obj.href || '',
type = false,
what,
item,
rez,
params;
for (what in opts) {
if (opts.hasOwnProperty(what)) {
item = opts[ what ];
rez = url.match( item.matcher );
if (rez) {
type = item.type;
params = $.extend(true, {}, item.params, obj[ what ] || ($.isPlainObject(opts[ what ]) ? opts[ what ].params : null));
url = $.type( item.url ) === "function" ? item.url.call( this, rez, params, obj ) : format( item.url, rez, params );
break;
}
}
}
if (type) {
obj.href = url;
obj.type = type;
obj.autoHeight = false;
}
}
};
}(jQuery));
\ No newline at end of file
#fancybox-thumbs {
position: fixed;
left: 0;
width: 100%;
overflow: hidden;
z-index: 8050;
}
#fancybox-thumbs.bottom {
bottom: 2px;
}
#fancybox-thumbs.top {
top: 2px;
}
#fancybox-thumbs ul {
position: relative;
list-style: none;
margin: 0;
padding: 0;
}
#fancybox-thumbs ul li {
float: left;
padding: 1px;
opacity: 0.5;
}
#fancybox-thumbs ul li.active {
opacity: 0.75;
padding: 0;
border: 1px solid #fff;
}
#fancybox-thumbs ul li:hover {
opacity: 1;
}
#fancybox-thumbs ul li a {
display: block;
position: relative;
overflow: hidden;
border: 1px solid #222;
background: #111;
outline: none;
}
#fancybox-thumbs ul li img {
display: block;
position: relative;
border: 0;
padding: 0;
max-width: none;
}
\ No newline at end of file
/*!
* Thumbnail helper for fancyBox
* version: 1.0.7 (Mon, 01 Oct 2012)
* @requires fancyBox v2.0 or later
*
* Usage:
* $(".fancybox").fancybox({
* helpers : {
* thumbs: {
* width : 50,
* height : 50
* }
* }
* });
*
*/
(function ($) {
//Shortcut for fancyBox object
var F = $.fancybox;
//Add helper object
F.helpers.thumbs = {
defaults : {
width : 50, // thumbnail width
height : 50, // thumbnail height
position : 'bottom', // 'top' or 'bottom'
source : function ( item ) { // function to obtain the URL of the thumbnail image
var href;
if (item.element) {
href = $(item.element).find('img').attr('src');
}
if (!href && item.type === 'image' && item.href) {
href = item.href;
}
return href;
}
},
wrap : null,
list : null,
width : 0,
init: function (opts, obj) {
var that = this,
list,
thumbWidth = opts.width,
thumbHeight = opts.height,
thumbSource = opts.source;
//Build list structure
list = '';
for (var n = 0; n < obj.group.length; n++) {
list += '<li><a style="width:' + thumbWidth + 'px;height:' + thumbHeight + 'px;" href="javascript:jQuery.fancybox.jumpto(' + n + ');"></a></li>';
}
this.wrap = $('<div id="fancybox-thumbs"></div>').addClass(opts.position).appendTo('body');
this.list = $('<ul>' + list + '</ul>').appendTo(this.wrap);
//Load each thumbnail
$.each(obj.group, function (i) {
var href = thumbSource( obj.group[ i ] );
if (!href) {
return;
}
$("<img />").load(function () {
var width = this.width,
height = this.height,
widthRatio, heightRatio, parent;
if (!that.list || !width || !height) {
return;
}
//Calculate thumbnail width/height and center it
widthRatio = width / thumbWidth;
heightRatio = height / thumbHeight;
parent = that.list.children().eq(i).find('a');
if (widthRatio >= 1 && heightRatio >= 1) {
if (widthRatio > heightRatio) {
width = Math.floor(width / heightRatio);
height = thumbHeight;
} else {
width = thumbWidth;
height = Math.floor(height / widthRatio);
}
}
$(this).css({
width : width,
height : height,
top : Math.floor(thumbHeight / 2 - height / 2),
left : Math.floor(thumbWidth / 2 - width / 2)
});
parent.width(thumbWidth).height(thumbHeight);
$(this).hide().appendTo(parent).fadeIn(300);
}).attr('src', href);
});
//Set initial width
this.width = this.list.children().eq(0).outerWidth(true);
this.list.width(this.width * (obj.group.length + 1)).css('left', Math.floor($(window).width() * 0.5 - (obj.index * this.width + this.width * 0.5)));
},
beforeLoad: function (opts, obj) {
//Remove self if gallery do not have at least two items
if (obj.group.length < 2) {
obj.helpers.thumbs = false;
return;
}
//Increase bottom margin to give space for thumbs
obj.margin[ opts.position === 'top' ? 0 : 2 ] += ((opts.height) + 15);
},
afterShow: function (opts, obj) {
//Check if exists and create or update list
if (this.list) {
this.onUpdate(opts, obj);
} else {
this.init(opts, obj);
}
//Set active element
this.list.children().removeClass('active').eq(obj.index).addClass('active');
},
//Center list
onUpdate: function (opts, obj) {
if (this.list) {
this.list.stop(true).animate({
'left': Math.floor($(window).width() * 0.5 - (obj.index * this.width + this.width * 0.5))
}, 150);
}
},
beforeClose: function () {
if (this.wrap) {
this.wrap.remove();
}
this.wrap = null;
this.list = null;
this.width = 0;
}
}
}(jQuery));
\ No newline at end of file
/*! fancyBox v2.1.5 fancyapps.com | fancyapps.com/fancybox/#license */
.fancybox-wrap,
.fancybox-skin,
.fancybox-outer,
.fancybox-inner,
.fancybox-image,
.fancybox-wrap iframe,
.fancybox-wrap object,
.fancybox-nav,
.fancybox-nav span,
.fancybox-tmp
{
padding: 0;
margin: 0;
border: 0;
outline: none;
vertical-align: top;
}
.fancybox-wrap {
position: absolute;
top: 0;
left: 0;
z-index: 8020;
}
.fancybox-skin {
position: relative;
background: #f9f9f9;
color: #444;
text-shadow: none;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
}
.fancybox-opened {
z-index: 8030;
}
.fancybox-opened .fancybox-skin {
-webkit-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
-moz-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
}
.fancybox-outer, .fancybox-inner {
position: relative;
}
.fancybox-inner {
overflow: hidden;
}
.fancybox-type-iframe .fancybox-inner {
-webkit-overflow-scrolling: touch;
}
.fancybox-error {
color: #444;
font: 14px/20px "Helvetica Neue",Helvetica,Arial,sans-serif;
margin: 0;
padding: 15px;
white-space: nowrap;
}
.fancybox-image, .fancybox-iframe {
display: block;
width: 100%;
height: 100%;
}
.fancybox-image {
max-width: 100%;
max-height: 100%;
}
#fancybox-loading, .fancybox-close, .fancybox-prev span, .fancybox-next span {
background-image: url('fancybox_sprite.png');
}
#fancybox-loading {
position: fixed;
top: 50%;
left: 50%;
margin-top: -22px;
margin-left: -22px;
background-position: 0 -108px;
opacity: 0.8;
cursor: pointer;
z-index: 8060;
}
#fancybox-loading div {
width: 44px;
height: 44px;
background: url('fancybox_loading.gif') center center no-repeat;
}
.fancybox-close {
position: absolute;
top: -18px;
right: -18px;
width: 36px;
height: 36px;
cursor: pointer;
z-index: 8040;
}
.fancybox-nav {
position: absolute;
top: 0;
width: 40%;
height: 100%;
cursor: pointer;
text-decoration: none;
background: transparent url('blank.gif'); /* helps IE */
-webkit-tap-highlight-color: rgba(0,0,0,0);
z-index: 8040;
}
.fancybox-prev {
left: 0;
}
.fancybox-next {
right: 0;
}
.fancybox-nav span {
position: absolute;
top: 50%;
width: 36px;
height: 34px;
margin-top: -18px;
cursor: pointer;
z-index: 8040;
visibility: hidden;
}
.fancybox-prev span {
left: 10px;
background-position: 0 -36px;
}
.fancybox-next span {
right: 10px;
background-position: 0 -72px;
}
.fancybox-nav:hover span {
visibility: visible;
}
.fancybox-tmp {
position: absolute;
top: -99999px;
left: -99999px;
visibility: hidden;
max-width: 99999px;
max-height: 99999px;
overflow: visible !important;
}
/* Overlay helper */
.fancybox-lock {
overflow: hidden !important;
width: auto;
}
.fancybox-lock body {
overflow: hidden !important;
}
.fancybox-lock-test {
overflow-y: hidden !important;
}
.fancybox-overlay {
position: absolute;
top: 0;
left: 0;
overflow: hidden;
display: none;
z-index: 8010;
background: url('fancybox_overlay.png');
}
.fancybox-overlay-fixed {
position: fixed;
bottom: 0;
right: 0;
}
.fancybox-lock .fancybox-overlay {
overflow: auto;
overflow-y: scroll;
}
/* Title helper */
.fancybox-title {
visibility: hidden;
font: normal 13px/20px "Helvetica Neue",Helvetica,Arial,sans-serif;
position: relative;
text-shadow: none;
z-index: 8050;
}
.fancybox-opened .fancybox-title {
visibility: visible;
}
.fancybox-title-float-wrap {
position: absolute;
bottom: 0;
right: 50%;
margin-bottom: -35px;
z-index: 8050;
text-align: center;
}
.fancybox-title-float-wrap .child {
display: inline-block;
margin-right: -100%;
padding: 2px 20px;
background: transparent; /* Fallback for web browsers that doesn't support RGBa */
background: rgba(0, 0, 0, 0.8);
-webkit-border-radius: 15px;
-moz-border-radius: 15px;
border-radius: 15px;
text-shadow: 0 1px 2px #222;
color: #FFF;
font-weight: bold;
line-height: 24px;
white-space: nowrap;
}
.fancybox-title-outside-wrap {
position: relative;
margin-top: 10px;
color: #fff;
}
.fancybox-title-inside-wrap {
padding-top: 10px;
}
.fancybox-title-over-wrap {
position: absolute;
bottom: 0;
left: 0;
color: #fff;
padding: 10px;
background: #000;
background: rgba(0, 0, 0, .8);
}
/*Retina graphics!*/
@media only screen and (-webkit-min-device-pixel-ratio: 1.5),
only screen and (min--moz-device-pixel-ratio: 1.5),
only screen and (min-device-pixel-ratio: 1.5){
#fancybox-loading, .fancybox-close, .fancybox-prev span, .fancybox-next span {
background-image: url('fancybox_sprite@2x.png');
background-size: 44px 152px; /*The size of the normal image, half the size of the hi-res image*/
}
#fancybox-loading div {
background-image: url('fancybox_loading@2x.gif');
background-size: 24px 24px; /*The size of the normal image, half the size of the hi-res image*/
}
}
\ No newline at end of file
/*
* Core Owl Carousel CSS File
* v1.3.3
*/
/* clearfix */
.owl-carousel .owl-wrapper:after {
content: ".";
display: block;
clear: both;
visibility: hidden;
line-height: 0;
height: 0;
}
/* display none until init */
.owl-carousel{
display: none;
position: relative;
width: 100%;
-ms-touch-action: pan-y;
}
.owl-carousel .owl-wrapper{
display: none;
position: relative;
-webkit-transform: translate3d(0px, 0px, 0px);
}
.owl-carousel .owl-wrapper-outer{
overflow: hidden;
position: relative;
width: 100%;
}
.owl-carousel .owl-wrapper-outer.autoHeight{
-webkit-transition: height 500ms ease-in-out;
-moz-transition: height 500ms ease-in-out;
-ms-transition: height 500ms ease-in-out;
-o-transition: height 500ms ease-in-out;
transition: height 500ms ease-in-out;
}
.owl-carousel .owl-item{
float: left;
}
.owl-controls .owl-page,
.owl-controls .owl-buttons div{
cursor: pointer;
}
.owl-controls {
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
/* mouse grab icon */
.grabbing {
cursor:url(images/grabbing.png) 8 8, move;
}
/* fix */
.owl-carousel .owl-wrapper,
.owl-carousel .owl-item{
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
-ms-backface-visibility: hidden;
-webkit-transform: translate3d(0,0,0);
-moz-transform: translate3d(0,0,0);
-ms-transform: translate3d(0,0,0);
}
/****************************************/
/*
* Owl Carousel Owl Demo Theme
* v1.3.3
*/
.owl-theme .owl-pagination{position: absolute; left: 0; right: 0; margin: 0 auto; bottom: 10px; text-align: center;}
.owl-theme .owl-buttons{
text-align: center;
position: absolute;
top: -78px;
right: 15px;
opacity: 1;
width: 65px;
}
.owl-theme .owl-controls .owl-buttons > div{
float: left;
width: 30px;
height: 30px;
font-size: 0;
text-align: center;
color: #333333;
background: #eeeeee;
}
.owl-theme .owl-controls .owl-buttons .owl-next{float: right;}
.owl-theme .owl-controls .owl-buttons > div:before{
content: "\f104";
font-family: FontAwesome;
font-size: 20px;
display: block;
line-height: 28px;
}
.owl-theme .owl-controls .owl-buttons .owl-next:before{
content: "\f105";
}
.owl-theme .owl-controls .owl-buttons > div:hover{color: #fff ;background:#333; }
/* Clickable class fix problem with hover on touch devices */
/* Use it for non-touch hover action */
/* Styling Pagination*/
.owl-theme .owl-controls .owl-page{
display: inline-block;
zoom: 1;
*display: inline;/*IE7 life-saver */
}
.owl-theme .owl-controls .owl-page span{
display: block;
width: 10px;
height: 10px;
margin: 5px 4px;
background: transparent;
}
/* If PaginationNumbers is true */
.owl-theme .owl-controls .owl-page span.owl-numbers{
height: auto;
width: auto;
color: #FFF;
padding: 2px 10px;
font-size: 12px;
-webkit-border-radius: 30px;
-moz-border-radius: 30px;
border-radius: 30px;
}
/* preloading images */
.owl-item.loading{
min-height: 150px;
background: url(images/AjaxLoader.gif) no-repeat center center
}
/**
* Copyright © 2015 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
define([
'jquery',
'mage/translate',
'jquery/ui',
'Magento_Catalog/js/catalog-add-to-cart'
], function($, $t) {
"use strict";
$.widget('mage.catalogAddToCart', {
options: {
processStart: null,
processStop: null,
bindSubmit: true,
minicartSelector: '[data-block="minicart"]',
messagesSelector: '[data-placeholder="messages"]',
productStatusSelector: '.stock.available',
addToCartButtonSelector: '.action.tocart',
addToCartButtonDisabledClass: 'disabled',
addToCartButtonTextWhileAdding: $t('Adding...'),
addToCartButtonTextAdded: $t('Added'),
addToCartButtonTextDefault: $t('Add to Cart')
},
_create: function() {
if (this.options.bindSubmit) {
this._bindSubmit();
}
},
_bindSubmit: function() {
var self = this;
this.element.on('submit', function(e) {
e.preventDefault();
self.submitForm($(this));
});
},
isLoaderEnabled: function() {
return this.options.processStart && this.options.processStop;
},
submitForm: function(form) {
var self = this;
if (form.has('input[type="file"]').length && form.find('input[type="file"]').val() !== '') {
self.element.off('submit');
form.submit();
} else {
self.ajaxSubmit(form);
}
},
ajaxSubmit: function(form) {
var self = this;
self.disableAddToCartButton(form);
var url = form.attr('action');
$.ajax({
url: url,
data: form.serialize(),
type: 'post',
dataType: 'json',
beforeSend: function() {
if (self.isLoaderEnabled()) {
$('body').trigger(self.options.processStart);
}
$('body').append('<div id="add-to-cart-loading-ajax-common"><span></span></div>');
},
success: function(res) {
if (self.isLoaderEnabled()) {
$('body').trigger(self.options.processStop);
}
if (res.backUrl) {
window.location = res.backUrl;
return;
}
$(self.options.minicartSelector).trigger('contentUpdated');
if (res.messages) {
$(self.options.messagesSelector).html(res.messages);
}
if (res.minicart) {
$(self.options.minicartSelector).replaceWith(res.minicart);
$(self.options.minicartSelector).trigger('contentUpdated');
}
if (res.product && res.product.statusText) {
$(self.options.productStatusSelector)
.removeClass('available')
.addClass('unavailable')
.find('span')
.html(res.product.statusText);
}
var width_window = $(window).width();
if(width_window > 480){
window.ajaxCartTransport = true;
}
else{
$('body #add-to-cart-loading-ajax-common').remove();
if(res.html){
require(['jquery', 'rokanthemes/fancybox'], function($){
$.fancybox({
content: res.html,
helpers: {
overlay: {
locked: false
}
}
});
});
}
}
self.enableAddToCartButton(form);
}
});
},
disableAddToCartButton: function(form) {
var addToCartButton = $(form).find(this.options.addToCartButtonSelector);
addToCartButton.addClass(this.options.addToCartButtonDisabledClass);
addToCartButton.attr('title', this.options.addToCartButtonTextWhileAdding);
addToCartButton.find('span').text(this.options.addToCartButtonTextWhileAdding);
},
enableAddToCartButton: function(form) {
var self = this,
addToCartButton = $(form).find(this.options.addToCartButtonSelector);
addToCartButton.find('span').text(this.options.addToCartButtonTextAdded);
addToCartButton.attr('title', this.options.addToCartButtonTextAdded);
setTimeout(function() {
addToCartButton.removeClass(self.options.addToCartButtonDisabledClass);
addToCartButton.find('span').text(self.options.addToCartButtonTextDefault);
addToCartButton.attr('title', self.options.addToCartButtonTextDefault);
}, 1000);
}
});
return $.mage.catalogAddToCart;
});
\ No newline at end of file
/*
* jQuery elevateZoom 3.0.8
* Demo's and documentation:
* www.elevateweb.co.uk/image-zoom
*
* Copyright (c) 2012 Andrew Eades
* www.elevateweb.co.uk
*
* Dual licensed under the GPL and MIT licenses.
* http://en.wikipedia.org/wiki/MIT_License
* http://en.wikipedia.org/wiki/GNU_General_Public_License
*
/*
* jQuery elevateZoom 3.0.3
* Demo's and documentation:
* www.elevateweb.co.uk/image-zoom
*
* Copyright (c) 2012 Andrew Eades
* www.elevateweb.co.uk
*
* Dual licensed under the GPL and MIT licenses.
* http://en.wikipedia.org/wiki/MIT_License
* http://en.wikipedia.org/wiki/GNU_General_Public_License
*/
if ( typeof Object.create !== 'function' ) {
Object.create = function( obj ) {
function F() {};
F.prototype = obj;
return new F();
};
}
(function( $, window, document, undefined ) {
var ElevateZoom = {
init: function( options, elem ) {
var self = this;
self.elem = elem;
self.$elem = $( elem );
self.imageSrc = self.$elem.data("zoom-image") ? self.$elem.data("zoom-image") : self.$elem.attr("src");
self.options = $.extend( {}, $.fn.elevateZoom.options, options );
//TINT OVERRIDE SETTINGS
if(self.options.tint) {
self.options.lensColour = "none", //colour of the lens background
self.options.lensOpacity = "1" //opacity of the lens
}
//INNER OVERRIDE SETTINGS
if(self.options.zoomType == "inner") {self.options.showLens = false;}
//Remove alt on hover
self.$elem.parent().removeAttr('title').removeAttr('alt');
self.zoomImage = self.imageSrc;
self.refresh( 1 );
//Create the image swap from the gallery
$('#'+self.options.gallery + ' a').click( function(e) {
//Set a class on the currently active gallery image
if(self.options.galleryActiveClass){
$('#'+self.options.gallery + ' a').removeClass(self.options.galleryActiveClass);
$(this).addClass(self.options.galleryActiveClass);
}
//stop any link on the a tag from working
e.preventDefault();
//call the swap image function
if($(this).data("zoom-image")){self.zoomImagePre = $(this).data("zoom-image")}
else{self.zoomImagePre = $(this).data("image");}
self.swaptheimage($(this).data("image"), self.zoomImagePre);
return false;
});
},
refresh: function( length ) {
var self = this;
setTimeout(function() {
self.fetch(self.imageSrc);
}, length || self.options.refresh );
},
fetch: function(imgsrc) {
//get the image
var self = this;
var newImg = new Image();
newImg.onload = function() {
//set the large image dimensions - used to calculte ratio's
self.largeWidth = newImg.width;
self.largeHeight = newImg.height;
//once image is loaded start the calls
self.startZoom();
self.currentImage = self.imageSrc;
//let caller know image has been loaded
self.options.onZoomedImageLoaded(self.$elem);
}
newImg.src = imgsrc; // this must be done AFTER setting onload
return;
},
startZoom: function( ) {
var self = this;
//get dimensions of the non zoomed image
self.nzWidth = self.$elem.width();
self.nzHeight = self.$elem.height();
//activated elements
self.isWindowActive = false;
self.isLensActive = false;
self.isTintActive = false;
self.overWindow = false;
//CrossFade Wrappe
if(self.options.imageCrossfade){
self.zoomWrap = self.$elem.wrap('<div style="height:'+self.nzHeight+'px;width:'+self.nzWidth+'px;" class="zoomWrapper" />');
self.$elem.css('position', 'absolute');
}
self.zoomLock = 1;
self.scrollingLock = false;
self.changeBgSize = false;
self.currentZoomLevel = self.options.zoomLevel;
//get offset of the non zoomed image
self.nzOffset = self.$elem.offset();
//calculate the width ratio of the large/small image
self.widthRatio = (self.largeWidth/self.currentZoomLevel) / self.nzWidth;
self.heightRatio = (self.largeHeight/self.currentZoomLevel) / self.nzHeight;
//if window zoom
if(self.options.zoomType == "window") {
self.zoomWindowStyle = "overflow: hidden;"
+ "background-position: 0px 0px;text-align:center;"
+ "background-color: " + String(self.options.zoomWindowBgColour)
+ ";width: " + String(self.options.zoomWindowWidth) + "px;"
+ "height: " + String(self.options.zoomWindowHeight)
+ "px;float: left;"
+ "background-size: "+ self.largeWidth/self.currentZoomLevel+ "px " +self.largeHeight/self.currentZoomLevel + "px;"
+ "display: none;z-index:100;"
+ "border: " + String(self.options.borderSize)
+ "px solid " + self.options.borderColour
+ ";background-repeat: no-repeat;"
+ "position: absolute;";
}
//if inner zoom
if(self.options.zoomType == "inner") {
//has a border been put on the image? Lets cater for this
var borderWidth = self.$elem.css("border-left-width");
self.zoomWindowStyle = "overflow: hidden;"
+ "margin-left: " + String(borderWidth) + ";"
+ "margin-top: " + String(borderWidth) + ";"
+ "background-position: 0px 0px;"
+ "width: " + String(self.nzWidth) + "px;"
+ "height: " + String(self.nzHeight) + "px;"
+ "px;float: left;"
+ "display: none;"
+ "cursor:"+(self.options.cursor)+";"
+ "px solid " + self.options.borderColour
+ ";background-repeat: no-repeat;"
+ "position: absolute;";
}
//lens style for window zoom
if(self.options.zoomType == "window") {
// adjust images less than the window height
if(self.nzHeight < self.options.zoomWindowWidth/self.widthRatio){
lensHeight = self.nzHeight;
}
else{
lensHeight = String((self.options.zoomWindowHeight/self.heightRatio))
}
if(self.largeWidth < self.options.zoomWindowWidth){
lensWidth = self.nzWidth;
}
else{
lensWidth = (self.options.zoomWindowWidth/self.widthRatio);
}
self.lensStyle = "background-position: 0px 0px;width: " + String((self.options.zoomWindowWidth)/self.widthRatio) + "px;height: " + String((self.options.zoomWindowHeight)/self.heightRatio)
+ "px;float: right;display: none;"
+ "overflow: hidden;"
+ "z-index: 999;"
+ "-webkit-transform: translateZ(0);"
+ "opacity:"+(self.options.lensOpacity)+";filter: alpha(opacity = "+(self.options.lensOpacity*100)+"); zoom:1;"
+ "width:"+lensWidth+"px;"
+ "height:"+lensHeight+"px;"
+ "background-color:"+(self.options.lensColour)+";"
+ "cursor:"+(self.options.cursor)+";"
+ "border: "+(self.options.lensBorderSize)+"px" +
" solid "+(self.options.lensBorderColour)+";background-repeat: no-repeat;position: absolute;";
}
//tint style
self.tintStyle = "display: block;"
+ "position: absolute;"
+ "background-color: "+self.options.tintColour+";"
+ "filter:alpha(opacity=0);"
+ "opacity: 0;"
+ "width: " + self.nzWidth + "px;"
+ "height: " + self.nzHeight + "px;"
;
//lens style for lens zoom with optional round for modern browsers
self.lensRound = '';
if(self.options.zoomType == "lens") {
self.lensStyle = "background-position: 0px 0px;"
+ "float: left;display: none;"
+ "border: " + String(self.options.borderSize) + "px solid " + self.options.borderColour+";"
+ "width:"+ String(self.options.lensSize) +"px;"
+ "height:"+ String(self.options.lensSize)+"px;"
+ "background-repeat: no-repeat;position: absolute;";
}
//does not round in all browsers
if(self.options.lensShape == "round") {
self.lensRound = "border-top-left-radius: " + String(self.options.lensSize / 2 + self.options.borderSize) + "px;"
+ "border-top-right-radius: " + String(self.options.lensSize / 2 + self.options.borderSize) + "px;"
+ "border-bottom-left-radius: " + String(self.options.lensSize / 2 + self.options.borderSize) + "px;"
+ "border-bottom-right-radius: " + String(self.options.lensSize / 2 + self.options.borderSize) + "px;";
}
//create the div's + ""
//self.zoomContainer = $('<div/>').addClass('zoomContainer').css({"position":"relative", "height":self.nzHeight, "width":self.nzWidth});
self.zoomContainer = $('<div class="zoomContainer" style="-webkit-transform: translateZ(0);position:absolute;left:'+self.nzOffset.left+'px;top:'+self.nzOffset.top+'px;height:'+self.nzHeight+'px;width:'+self.nzWidth+'px;"></div>');
$('body').append(self.zoomContainer);
//this will add overflow hidden and contrain the lens on lens mode
if(self.options.containLensZoom && self.options.zoomType == "lens"){
self.zoomContainer.css("overflow", "hidden");
}
if(self.options.zoomType != "inner") {
self.zoomLens = $("<div class='zoomLens' style='" + self.lensStyle + self.lensRound +"'>&nbsp;</div>")
.appendTo(self.zoomContainer)
.click(function () {
self.$elem.trigger('click');
});
if(self.options.tint) {
self.tintContainer = $('<div/>').addClass('tintContainer');
self.zoomTint = $("<div class='zoomTint' style='"+self.tintStyle+"'></div>");
self.zoomLens.wrap(self.tintContainer);
self.zoomTintcss = self.zoomLens.after(self.zoomTint);
//if tint enabled - set an image to show over the tint
self.zoomTintImage = $('<img style="position: absolute; left: 0px; top: 0px; max-width: none; width: '+self.nzWidth+'px; height: '+self.nzHeight+'px;" src="'+self.imageSrc+'">')
.appendTo(self.zoomLens)
.click(function () {
self.$elem.trigger('click');
});
}
}
//create zoom window
if(isNaN(self.options.zoomWindowPosition)){
self.zoomWindow = $("<div style='z-index:999;left:"+(self.windowOffsetLeft)+"px;top:"+(self.windowOffsetTop)+"px;" + self.zoomWindowStyle + "' class='zoomWindow'>&nbsp;</div>")
.appendTo('body')
.click(function () {
self.$elem.trigger('click');
});
}else{
self.zoomWindow = $("<div style='z-index:999;left:"+(self.windowOffsetLeft)+"px;top:"+(self.windowOffsetTop)+"px;" + self.zoomWindowStyle + "' class='zoomWindow'>&nbsp;</div>")
.appendTo(self.zoomContainer)
.click(function () {
self.$elem.trigger('click');
});
}
self.zoomWindowContainer = $('<div/>').addClass('zoomWindowContainer').css("width",self.options.zoomWindowWidth);
self.zoomWindow.wrap(self.zoomWindowContainer);
// self.captionStyle = "text-align: left;background-color: black;color: white;font-weight: bold;padding: 10px;font-family: sans-serif;font-size: 11px";
// self.zoomCaption = $('<div class="elevatezoom-caption" style="'+self.captionStyle+'display: block; width: 280px;">INSERT ALT TAG</div>').appendTo(self.zoomWindow.parent());
if(self.options.zoomType == "lens") {
self.zoomLens.css({ backgroundImage: "url('" + self.imageSrc + "')" });
}
if(self.options.zoomType == "window") {
self.zoomWindow.css({ backgroundImage: "url('" + self.imageSrc + "')" });
}
if(self.options.zoomType == "inner") {
self.zoomWindow.css({ backgroundImage: "url('" + self.imageSrc + "')" });
}
/*-------------------END THE ZOOM WINDOW AND LENS----------------------------------*/
//touch events
self.$elem.bind('touchmove', function(e){
e.preventDefault();
var touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0];
self.setPosition(touch);
});
self.zoomContainer.bind('touchmove', function(e){
if(self.options.zoomType == "inner") {
self.showHideWindow("show");
}
e.preventDefault();
var touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0];
self.setPosition(touch);
});
self.zoomContainer.bind('touchend', function(e){
self.showHideWindow("hide");
if(self.options.showLens) {self.showHideLens("hide");}
if(self.options.tint && self.options.zoomType != "inner") {self.showHideTint("hide");}
});
self.$elem.bind('touchend', function(e){
self.showHideWindow("hide");
if(self.options.showLens) {self.showHideLens("hide");}
if(self.options.tint && self.options.zoomType != "inner") {self.showHideTint("hide");}
});
if(self.options.showLens) {
self.zoomLens.bind('touchmove', function(e){
e.preventDefault();
var touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0];
self.setPosition(touch);
});
self.zoomLens.bind('touchend', function(e){
self.showHideWindow("hide");
if(self.options.showLens) {self.showHideLens("hide");}
if(self.options.tint && self.options.zoomType != "inner") {self.showHideTint("hide");}
});
}
//Needed to work in IE
self.$elem.bind('mousemove', function(e){
if(self.overWindow == false){self.setElements("show");}
//make sure on orientation change the setposition is not fired
if(self.lastX !== e.clientX || self.lastY !== e.clientY){
self.setPosition(e);
self.currentLoc = e;
}
self.lastX = e.clientX;
self.lastY = e.clientY;
});
self.zoomContainer.bind('mousemove', function(e){
if(self.overWindow == false){self.setElements("show");}
//make sure on orientation change the setposition is not fired
if(self.lastX !== e.clientX || self.lastY !== e.clientY){
self.setPosition(e);
self.currentLoc = e;
}
self.lastX = e.clientX;
self.lastY = e.clientY;
});
if(self.options.zoomType != "inner") {
self.zoomLens.bind('mousemove', function(e){
//make sure on orientation change the setposition is not fired
if(self.lastX !== e.clientX || self.lastY !== e.clientY){
self.setPosition(e);
self.currentLoc = e;
}
self.lastX = e.clientX;
self.lastY = e.clientY;
});
}
if(self.options.tint && self.options.zoomType != "inner") {
self.zoomTint.bind('mousemove', function(e){
//make sure on orientation change the setposition is not fired
if(self.lastX !== e.clientX || self.lastY !== e.clientY){
self.setPosition(e);
self.currentLoc = e;
}
self.lastX = e.clientX;
self.lastY = e.clientY;
});
}
if(self.options.zoomType == "inner") {
self.zoomWindow.bind('mousemove', function(e) {
//self.overWindow = true;
//make sure on orientation change the setposition is not fired
if(self.lastX !== e.clientX || self.lastY !== e.clientY){
self.setPosition(e);
self.currentLoc = e;
}
self.lastX = e.clientX;
self.lastY = e.clientY;
});
}
// lensFadeOut: 500, zoomTintFadeIn
self.zoomContainer.add(self.$elem).mouseenter(function(){
if(self.overWindow == false){self.setElements("show");}
}).mouseleave(function(){
if(!self.scrollLock){
self.setElements("hide");
self.options.onDestroy(self.$elem);
}
});
//end ove image
if(self.options.zoomType != "inner") {
self.zoomWindow.mouseenter(function(){
self.overWindow = true;
self.setElements("hide");
}).mouseleave(function(){
self.overWindow = false;
});
}
//end ove image
// var delta = parseInt(e.originalEvent.wheelDelta || -e.originalEvent.detail);
// $(this).empty();
// return false;
//fix for initial zoom setting
if (self.options.zoomLevel != 1){
// self.changeZoomLevel(self.currentZoomLevel);
}
//set the min zoomlevel
if(self.options.minZoomLevel){
self.minZoomLevel = self.options.minZoomLevel;
}
else{
self.minZoomLevel = self.options.scrollZoomIncrement * 2;
}
if(self.options.scrollZoom){
self.zoomContainer.add(self.$elem).bind('mousewheel DOMMouseScroll MozMousePixelScroll', function(e){
// in IE there is issue with firing of mouseleave - So check whether still scrolling
// and on mouseleave check if scrolllock
self.scrollLock = true;
clearTimeout($.data(this, 'timer'));
$.data(this, 'timer', setTimeout(function() {
self.scrollLock = false;
//do something
}, 250));
var theEvent = e.originalEvent.wheelDelta || e.originalEvent.detail*-1
//this.scrollTop += ( delta < 0 ? 1 : -1 ) * 30;
// e.preventDefault();
e.stopImmediatePropagation();
e.stopPropagation();
e.preventDefault();
if(theEvent /120 > 0) {
//scrolling up
if(self.currentZoomLevel >= self.minZoomLevel){
self.changeZoomLevel(self.currentZoomLevel-self.options.scrollZoomIncrement);
}
}
else{
//scrolling down
if(self.options.maxZoomLevel){
if(self.currentZoomLevel <= self.options.maxZoomLevel){
self.changeZoomLevel(parseFloat(self.currentZoomLevel)+self.options.scrollZoomIncrement);
}
}
else{
//andy
self.changeZoomLevel(parseFloat(self.currentZoomLevel)+self.options.scrollZoomIncrement);
}
}
return false;
});
}
},
setElements: function(type) {
var self = this;
if(!self.options.zoomEnabled){return false;}
if(type=="show"){
if(self.isWindowSet){
if(self.options.zoomType == "inner") {self.showHideWindow("show");}
if(self.options.zoomType == "window") {self.showHideWindow("show");}
if(self.options.showLens) {self.showHideLens("show");}
if(self.options.tint && self.options.zoomType != "inner") {self.showHideTint("show");
}
}
}
if(type=="hide"){
if(self.options.zoomType == "window") {self.showHideWindow("hide");}
if(!self.options.tint) {self.showHideWindow("hide");}
if(self.options.showLens) {self.showHideLens("hide");}
if(self.options.tint) { self.showHideTint("hide");}
}
},
setPosition: function(e) {
var self = this;
if(!self.options.zoomEnabled){return false;}
//recaclc offset each time in case the image moves
//this can be caused by other on page elements
self.nzHeight = self.$elem.height();
self.nzWidth = self.$elem.width();
self.nzOffset = self.$elem.offset();
if(self.options.tint && self.options.zoomType != "inner") {
self.zoomTint.css({ top: 0});
self.zoomTint.css({ left: 0});
}
//set responsive
//will checking if the image needs changing before running this code work faster?
if(self.options.responsive && !self.options.scrollZoom){
if(self.options.showLens){
if(self.nzHeight < self.options.zoomWindowWidth/self.widthRatio){
lensHeight = self.nzHeight;
}
else{
lensHeight = String((self.options.zoomWindowHeight/self.heightRatio))
}
if(self.largeWidth < self.options.zoomWindowWidth){
lensWidth = self.nzWidth;
}
else{
lensWidth = (self.options.zoomWindowWidth/self.widthRatio);
}
self.widthRatio = self.largeWidth / self.nzWidth;
self.heightRatio = self.largeHeight / self.nzHeight;
if(self.options.zoomType != "lens") {
//possibly dont need to keep recalcalculating
//if the lens is heigher than the image, then set lens size to image size
if(self.nzHeight < self.options.zoomWindowWidth/self.widthRatio){
lensHeight = self.nzHeight;
}
else{
lensHeight = String((self.options.zoomWindowHeight/self.heightRatio))
}
if(self.nzWidth < self.options.zoomWindowHeight/self.heightRatio){
lensWidth = self.nzWidth;
}
else{
lensWidth = String((self.options.zoomWindowWidth/self.widthRatio));
}
self.zoomLens.css('width', lensWidth);
self.zoomLens.css('height', lensHeight);
if(self.options.tint){
self.zoomTintImage.css('width', self.nzWidth);
self.zoomTintImage.css('height', self.nzHeight);
}
}
if(self.options.zoomType == "lens") {
self.zoomLens.css({ width: String(self.options.lensSize) + 'px', height: String(self.options.lensSize) + 'px' })
}
//end responsive image change
}
}
//container fix
self.zoomContainer.css({ top: self.nzOffset.top});
self.zoomContainer.css({ left: self.nzOffset.left});
self.mouseLeft = parseInt(e.pageX - self.nzOffset.left);
self.mouseTop = parseInt(e.pageY - self.nzOffset.top);
//calculate the Location of the Lens
//calculate the bound regions - but only if zoom window
if(self.options.zoomType == "window") {
self.Etoppos = (self.mouseTop < (self.zoomLens.height()/2));
self.Eboppos = (self.mouseTop > self.nzHeight - (self.zoomLens.height()/2)-(self.options.lensBorderSize*2));
self.Eloppos = (self.mouseLeft < 0+((self.zoomLens.width()/2)));
self.Eroppos = (self.mouseLeft > (self.nzWidth - (self.zoomLens.width()/2)-(self.options.lensBorderSize*2)));
}
//calculate the bound regions - but only for inner zoom
if(self.options.zoomType == "inner"){
self.Etoppos = (self.mouseTop < ((self.nzHeight/2)/self.heightRatio) );
self.Eboppos = (self.mouseTop > (self.nzHeight - ((self.nzHeight/2)/self.heightRatio)));
self.Eloppos = (self.mouseLeft < 0+(((self.nzWidth/2)/self.widthRatio)));
self.Eroppos = (self.mouseLeft > (self.nzWidth - (self.nzWidth/2)/self.widthRatio-(self.options.lensBorderSize*2)));
}
// if the mouse position of the slider is one of the outerbounds, then hide window and lens
if (self.mouseLeft < 0 || self.mouseTop < 0 || self.mouseLeft > self.nzWidth || self.mouseTop > self.nzHeight ) {
self.setElements("hide");
return;
}
//else continue with operations
else {
//lens options
if(self.options.showLens) {
// self.showHideLens("show");
//set background position of lens
self.lensLeftPos = String(Math.floor(self.mouseLeft - self.zoomLens.width() / 2));
self.lensTopPos = String(Math.floor(self.mouseTop - self.zoomLens.height() / 2));
}
//adjust the background position if the mouse is in one of the outer regions
//Top region
if(self.Etoppos){
self.lensTopPos = 0;
}
//Left Region
if(self.Eloppos){
self.windowLeftPos = 0;
self.lensLeftPos = 0;
self.tintpos=0;
}
//Set bottom and right region for window mode
if(self.options.zoomType == "window") {
if(self.Eboppos){
self.lensTopPos = Math.max( (self.nzHeight)-self.zoomLens.height()-(self.options.lensBorderSize*2), 0 );
}
if(self.Eroppos){
self.lensLeftPos = (self.nzWidth-(self.zoomLens.width())-(self.options.lensBorderSize*2));
}
}
//Set bottom and right region for inner mode
if(self.options.zoomType == "inner") {
if(self.Eboppos){
self.lensTopPos = Math.max( ((self.nzHeight)-(self.options.lensBorderSize*2)), 0 );
}
if(self.Eroppos){
self.lensLeftPos = (self.nzWidth-(self.nzWidth)-(self.options.lensBorderSize*2));
}
}
//if lens zoom
if(self.options.zoomType == "lens") {
self.windowLeftPos = String(((e.pageX - self.nzOffset.left) * self.widthRatio - self.zoomLens.width() / 2) * (-1));
self.windowTopPos = String(((e.pageY - self.nzOffset.top) * self.heightRatio - self.zoomLens.height() / 2) * (-1));
self.zoomLens.css({ backgroundPosition: self.windowLeftPos + 'px ' + self.windowTopPos + 'px' });
if(self.changeBgSize){
if(self.nzHeight>self.nzWidth){
if(self.options.zoomType == "lens"){
self.zoomLens.css({ "background-size": self.largeWidth/self.newvalueheight + 'px ' + self.largeHeight/self.newvalueheight + 'px' });
}
self.zoomWindow.css({ "background-size": self.largeWidth/self.newvalueheight + 'px ' + self.largeHeight/self.newvalueheight + 'px' });
}
else{
if(self.options.zoomType == "lens"){
self.zoomLens.css({ "background-size": self.largeWidth/self.newvaluewidth + 'px ' + self.largeHeight/self.newvaluewidth + 'px' });
}
self.zoomWindow.css({ "background-size": self.largeWidth/self.newvaluewidth + 'px ' + self.largeHeight/self.newvaluewidth + 'px' });
}
self.changeBgSize = false;
}
self.setWindowPostition(e);
}
//if tint zoom
if(self.options.tint && self.options.zoomType != "inner") {
self.setTintPosition(e);
}
//set the css background position
if(self.options.zoomType == "window") {
self.setWindowPostition(e);
}
if(self.options.zoomType == "inner") {
self.setWindowPostition(e);
}
if(self.options.showLens) {
if(self.fullwidth && self.options.zoomType != "lens"){
self.lensLeftPos = 0;
}
self.zoomLens.css({ left: self.lensLeftPos + 'px', top: self.lensTopPos + 'px' })
}
} //end else
},
showHideWindow: function(change) {
var self = this;
if(change == "show"){
if(!self.isWindowActive){
if(self.options.zoomWindowFadeIn){
self.zoomWindow.stop(true, true, false).fadeIn(self.options.zoomWindowFadeIn);
}
else{self.zoomWindow.show();}
self.isWindowActive = true;
}
}
if(change == "hide"){
if(self.isWindowActive){
if(self.options.zoomWindowFadeOut){
self.zoomWindow.stop(true, true).fadeOut(self.options.zoomWindowFadeOut, function () {
if (self.loop) {
//stop moving the zoom window when zoom window is faded out
clearInterval(self.loop);
self.loop = false;
}
});
}
else{self.zoomWindow.hide();}
self.isWindowActive = false;
}
}
},
showHideLens: function(change) {
var self = this;
if(change == "show"){
if(!self.isLensActive){
if(self.options.lensFadeIn){
self.zoomLens.stop(true, true, false).fadeIn(self.options.lensFadeIn);
}
else{self.zoomLens.show();}
self.isLensActive = true;
}
}
if(change == "hide"){
if(self.isLensActive){
if(self.options.lensFadeOut){
self.zoomLens.stop(true, true).fadeOut(self.options.lensFadeOut);
}
else{self.zoomLens.hide();}
self.isLensActive = false;
}
}
},
showHideTint: function(change) {
var self = this;
if(change == "show"){
if(!self.isTintActive){
if(self.options.zoomTintFadeIn){
self.zoomTint.css({opacity:self.options.tintOpacity}).animate().stop(true, true).fadeIn("slow");
}
else{
self.zoomTint.css({opacity:self.options.tintOpacity}).animate();
self.zoomTint.show();
}
self.isTintActive = true;
}
}
if(change == "hide"){
if(self.isTintActive){
if(self.options.zoomTintFadeOut){
self.zoomTint.stop(true, true).fadeOut(self.options.zoomTintFadeOut);
}
else{self.zoomTint.hide();}
self.isTintActive = false;
}
}
},
setLensPostition: function( e ) {
},
setWindowPostition: function( e ) {
//return obj.slice( 0, count );
var self = this;
if(!isNaN(self.options.zoomWindowPosition)){
switch (self.options.zoomWindowPosition) {
case 1: //done
self.windowOffsetTop = (self.options.zoomWindowOffety);//DONE - 1
self.windowOffsetLeft =(+self.nzWidth); //DONE 1, 2, 3, 4, 16
break;
case 2:
if(self.options.zoomWindowHeight > self.nzHeight){ //positive margin
self.windowOffsetTop = ((self.options.zoomWindowHeight/2)-(self.nzHeight/2))*(-1);
self.windowOffsetLeft =(self.nzWidth); //DONE 1, 2, 3, 4, 16
}
else{ //negative margin
}
break;
case 3: //done
self.windowOffsetTop = (self.nzHeight - self.zoomWindow.height() - (self.options.borderSize*2)); //DONE 3,9
self.windowOffsetLeft =(self.nzWidth); //DONE 1, 2, 3, 4, 16
break;
case 4: //done
self.windowOffsetTop = (self.nzHeight); //DONE - 4,5,6,7,8
self.windowOffsetLeft =(self.nzWidth); //DONE 1, 2, 3, 4, 16
break;
case 5: //done
self.windowOffsetTop = (self.nzHeight); //DONE - 4,5,6,7,8
self.windowOffsetLeft =(self.nzWidth-self.zoomWindow.width()-(self.options.borderSize*2)); //DONE - 5,15
break;
case 6:
if(self.options.zoomWindowHeight > self.nzHeight){ //positive margin
self.windowOffsetTop = (self.nzHeight); //DONE - 4,5,6,7,8
self.windowOffsetLeft =((self.options.zoomWindowWidth/2)-(self.nzWidth/2)+(self.options.borderSize*2))*(-1);
}
else{ //negative margin
}
break;
case 7: //done
self.windowOffsetTop = (self.nzHeight); //DONE - 4,5,6,7,8
self.windowOffsetLeft = 0; //DONE 7, 13
break;
case 8: //done
self.windowOffsetTop = (self.nzHeight); //DONE - 4,5,6,7,8
self.windowOffsetLeft =(self.zoomWindow.width()+(self.options.borderSize*2) )* (-1); //DONE 8,9,10,11,12
break;
case 9: //done
self.windowOffsetTop = (self.nzHeight - self.zoomWindow.height() - (self.options.borderSize*2)); //DONE 3,9
self.windowOffsetLeft =(self.zoomWindow.width()+(self.options.borderSize*2) )* (-1); //DONE 8,9,10,11,12
break;
case 10:
if(self.options.zoomWindowHeight > self.nzHeight){ //positive margin
self.windowOffsetTop = ((self.options.zoomWindowHeight/2)-(self.nzHeight/2))*(-1);
self.windowOffsetLeft =(self.zoomWindow.width()+(self.options.borderSize*2) )* (-1); //DONE 8,9,10,11,12
}
else{ //negative margin
}
break;
case 11:
self.windowOffsetTop = (self.options.zoomWindowOffety);
self.windowOffsetLeft =(self.zoomWindow.width()+(self.options.borderSize*2) )* (-1); //DONE 8,9,10,11,12
break;
case 12: //done
self.windowOffsetTop = (self.zoomWindow.height()+(self.options.borderSize*2))*(-1); //DONE 12,13,14,15,16
self.windowOffsetLeft =(self.zoomWindow.width()+(self.options.borderSize*2) )* (-1); //DONE 8,9,10,11,12
break;
case 13: //done
self.windowOffsetTop = (self.zoomWindow.height()+(self.options.borderSize*2))*(-1); //DONE 12,13,14,15,16
self.windowOffsetLeft =(0); //DONE 7, 13
break;
case 14:
if(self.options.zoomWindowHeight > self.nzHeight){ //positive margin
self.windowOffsetTop = (self.zoomWindow.height()+(self.options.borderSize*2))*(-1); //DONE 12,13,14,15,16
self.windowOffsetLeft =((self.options.zoomWindowWidth/2)-(self.nzWidth/2)+(self.options.borderSize*2))*(-1);
}
else{ //negative margin
}
break;
case 15://done
self.windowOffsetTop = (self.zoomWindow.height()+(self.options.borderSize*2))*(-1); //DONE 12,13,14,15,16
self.windowOffsetLeft =(self.nzWidth-self.zoomWindow.width()-(self.options.borderSize*2)); //DONE - 5,15
break;
case 16: //done
self.windowOffsetTop = (self.zoomWindow.height()+(self.options.borderSize*2))*(-1); //DONE 12,13,14,15,16
self.windowOffsetLeft =(self.nzWidth); //DONE 1, 2, 3, 4, 16
break;
default: //done
self.windowOffsetTop = (self.options.zoomWindowOffety);//DONE - 1
self.windowOffsetLeft =(self.nzWidth); //DONE 1, 2, 3, 4, 16
}
} //end isNAN
else{
//WE CAN POSITION IN A CLASS - ASSUME THAT ANY STRING PASSED IS
self.externalContainer = $('#'+self.options.zoomWindowPosition);
self.externalContainerWidth = self.externalContainer.width();
self.externalContainerHeight = self.externalContainer.height();
self.externalContainerOffset = self.externalContainer.offset();
self.windowOffsetTop = self.externalContainerOffset.top;//DONE - 1
self.windowOffsetLeft =self.externalContainerOffset.left; //DONE 1, 2, 3, 4, 16
}
self.isWindowSet = true;
self.windowOffsetTop = self.windowOffsetTop + self.options.zoomWindowOffety;
self.windowOffsetLeft = self.windowOffsetLeft + self.options.zoomWindowOffetx;
self.zoomWindow.css({ top: self.windowOffsetTop});
self.zoomWindow.css({ left: self.windowOffsetLeft});
if(self.options.zoomType == "inner") {
self.zoomWindow.css({ top: 0});
self.zoomWindow.css({ left: 0});
}
self.windowLeftPos = String(((e.pageX - self.nzOffset.left) * self.widthRatio - self.zoomWindow.width() / 2) * (-1));
self.windowTopPos = String(((e.pageY - self.nzOffset.top) * self.heightRatio - self.zoomWindow.height() / 2) * (-1));
if(self.Etoppos){self.windowTopPos = 0;}
if(self.Eloppos){self.windowLeftPos = 0;}
if(self.Eboppos){self.windowTopPos = (self.largeHeight/self.currentZoomLevel-self.zoomWindow.height())*(-1); }
if(self.Eroppos){self.windowLeftPos = ((self.largeWidth/self.currentZoomLevel-self.zoomWindow.width())*(-1));}
//stops micro movements
if(self.fullheight){
self.windowTopPos = 0;
}
if(self.fullwidth){
self.windowLeftPos = 0;
}
//set the css background position
if(self.options.zoomType == "window" || self.options.zoomType == "inner") {
if(self.zoomLock == 1){
//overrides for images not zoomable
if(self.widthRatio <= 1){
self.windowLeftPos = 0;
}
if(self.heightRatio <= 1){
self.windowTopPos = 0;
}
}
// adjust images less than the window height
if (self.options.zoomType == "window") {
if (self.largeHeight < self.options.zoomWindowHeight) {
self.windowTopPos = 0;
}
if (self.largeWidth < self.options.zoomWindowWidth) {
self.windowLeftPos = 0;
}
}
//set the zoomwindow background position
if (self.options.easing){
// if(self.changeZoom){
// clearInterval(self.loop);
// self.changeZoom = false;
// self.loop = false;
// }
//set the pos to 0 if not set
if(!self.xp){self.xp = 0;}
if(!self.yp){self.yp = 0;}
//if loop not already started, then run it
if (!self.loop){
self.loop = setInterval(function(){
//using zeno's paradox
self.xp += (self.windowLeftPos - self.xp) / self.options.easingAmount;
self.yp += (self.windowTopPos - self.yp) / self.options.easingAmount;
if(self.scrollingLock){
clearInterval(self.loop);
self.xp = self.windowLeftPos;
self.yp = self.windowTopPos
self.xp = ((e.pageX - self.nzOffset.left) * self.widthRatio - self.zoomWindow.width() / 2) * (-1);
self.yp = (((e.pageY - self.nzOffset.top) * self.heightRatio - self.zoomWindow.height() / 2) * (-1));
if(self.changeBgSize){
if(self.nzHeight>self.nzWidth){
if(self.options.zoomType == "lens"){
self.zoomLens.css({ "background-size": self.largeWidth/self.newvalueheight + 'px ' + self.largeHeight/self.newvalueheight + 'px' });
}
self.zoomWindow.css({ "background-size": self.largeWidth/self.newvalueheight + 'px ' + self.largeHeight/self.newvalueheight + 'px' });
}
else{
if(self.options.zoomType != "lens"){
self.zoomLens.css({ "background-size": self.largeWidth/self.newvaluewidth + 'px ' + self.largeHeight/self.newvalueheight + 'px' });
}
self.zoomWindow.css({ "background-size": self.largeWidth/self.newvaluewidth + 'px ' + self.largeHeight/self.newvaluewidth + 'px' });
}
/*
if(!self.bgxp){self.bgxp = self.largeWidth/self.newvalue;}
if(!self.bgyp){self.bgyp = self.largeHeight/self.newvalue ;}
if (!self.bgloop){
self.bgloop = setInterval(function(){
self.bgxp += (self.largeWidth/self.newvalue - self.bgxp) / self.options.easingAmount;
self.bgyp += (self.largeHeight/self.newvalue - self.bgyp) / self.options.easingAmount;
self.zoomWindow.css({ "background-size": self.bgxp + 'px ' + self.bgyp + 'px' });
}, 16);
}
*/
self.changeBgSize = false;
}
self.zoomWindow.css({ backgroundPosition: self.windowLeftPos + 'px ' + self.windowTopPos + 'px' });
self.scrollingLock = false;
self.loop = false;
}
else if (Math.round(Math.abs(self.xp - self.windowLeftPos) + Math.abs(self.yp - self.windowTopPos)) < 1) {
//stops micro movements
clearInterval(self.loop);
self.zoomWindow.css({ backgroundPosition: self.windowLeftPos + 'px ' + self.windowTopPos + 'px' });
self.loop = false;
}
else{
if(self.changeBgSize){
if(self.nzHeight>self.nzWidth){
if(self.options.zoomType == "lens"){
self.zoomLens.css({ "background-size": self.largeWidth/self.newvalueheight + 'px ' + self.largeHeight/self.newvalueheight + 'px' });
}
self.zoomWindow.css({ "background-size": self.largeWidth/self.newvalueheight + 'px ' + self.largeHeight/self.newvalueheight + 'px' });
}
else{
if(self.options.zoomType != "lens"){
self.zoomLens.css({ "background-size": self.largeWidth/self.newvaluewidth + 'px ' + self.largeHeight/self.newvaluewidth + 'px' });
}
self.zoomWindow.css({ "background-size": self.largeWidth/self.newvaluewidth + 'px ' + self.largeHeight/self.newvaluewidth + 'px' });
}
self.changeBgSize = false;
}
self.zoomWindow.css({ backgroundPosition: self.xp + 'px ' + self.yp + 'px' });
}
}, 16);
}
}
else{
if(self.changeBgSize){
if(self.nzHeight>self.nzWidth){
if(self.options.zoomType == "lens"){
self.zoomLens.css({ "background-size": self.largeWidth/self.newvalueheight + 'px ' + self.largeHeight/self.newvalueheight + 'px' });
}
self.zoomWindow.css({ "background-size": self.largeWidth/self.newvalueheight + 'px ' + self.largeHeight/self.newvalueheight + 'px' });
}
else{
if(self.options.zoomType == "lens"){
self.zoomLens.css({ "background-size": self.largeWidth/self.newvaluewidth + 'px ' + self.largeHeight/self.newvaluewidth + 'px' });
}
if((self.largeHeight/self.newvaluewidth) < self.options.zoomWindowHeight){
self.zoomWindow.css({ "background-size": self.largeWidth/self.newvaluewidth + 'px ' + self.largeHeight/self.newvaluewidth + 'px' });
}
else{
self.zoomWindow.css({ "background-size": self.largeWidth/self.newvalueheight + 'px ' + self.largeHeight/self.newvalueheight + 'px' });
}
}
self.changeBgSize = false;
}
self.zoomWindow.css({ backgroundPosition: self.windowLeftPos + 'px ' + self.windowTopPos + 'px' });
}
}
},
setTintPosition: function(e){
var self = this;
self.nzOffset = self.$elem.offset();
self.tintpos = String(((e.pageX - self.nzOffset.left)-(self.zoomLens.width() / 2)) * (-1));
self.tintposy = String(((e.pageY - self.nzOffset.top) - self.zoomLens.height() / 2) * (-1));
if(self.Etoppos){
self.tintposy = 0;
}
if(self.Eloppos){
self.tintpos=0;
}
if(self.Eboppos){
self.tintposy = (self.nzHeight-self.zoomLens.height()-(self.options.lensBorderSize*2))*(-1);
}
if(self.Eroppos){
self.tintpos = ((self.nzWidth-self.zoomLens.width()-(self.options.lensBorderSize*2))*(-1));
}
if(self.options.tint) {
//stops micro movements
if(self.fullheight){
self.tintposy = 0;
}
if(self.fullwidth){
self.tintpos = 0;
}
self.zoomTintImage.css({'left': self.tintpos+'px'});
self.zoomTintImage.css({'top': self.tintposy+'px'});
}
},
swaptheimage: function(smallimage, largeimage){
var self = this;
var newImg = new Image();
if(self.options.loadingIcon){
self.spinner = $('<div style="background: url(\''+self.options.loadingIcon+'\') no-repeat center;height:'+self.nzHeight+'px;width:'+self.nzWidth+'px;z-index: 2000;position: absolute; background-position: center center;"></div>');
self.$elem.after(self.spinner);
}
self.options.onImageSwap(self.$elem);
newImg.onload = function() {
self.largeWidth = newImg.width;
self.largeHeight = newImg.height;
self.zoomImage = largeimage;
self.zoomWindow.css({ "background-size": self.largeWidth + 'px ' + self.largeHeight + 'px' });
self.swapAction(smallimage, largeimage);
return;
}
newImg.src = largeimage; // this must be done AFTER setting onload
},
swapAction: function(smallimage, largeimage){
var self = this;
var newImg2 = new Image();
newImg2.onload = function() {
//re-calculate values
self.nzHeight = newImg2.height;
self.nzWidth = newImg2.width;
self.options.onImageSwapComplete(self.$elem);
self.doneCallback();
return;
}
newImg2.src = smallimage;
//reset the zoomlevel to that initially set in options
self.currentZoomLevel = self.options.zoomLevel;
self.options.maxZoomLevel = false;
//swaps the main image
//self.$elem.attr("src",smallimage);
//swaps the zoom image
if(self.options.zoomType == "lens") {
self.zoomLens.css({ backgroundImage: "url('" + largeimage + "')" });
}
if(self.options.zoomType == "window") {
self.zoomWindow.css({ backgroundImage: "url('" + largeimage + "')" });
}
if(self.options.zoomType == "inner") {
self.zoomWindow.css({ backgroundImage: "url('" + largeimage + "')" });
}
self.currentImage = largeimage;
if(self.options.imageCrossfade){
var oldImg = self.$elem;
var newImg = oldImg.clone();
self.$elem.attr("src",smallimage)
self.$elem.after(newImg);
newImg.stop(true).fadeOut(self.options.imageCrossfade, function() {
$(this).remove();
});
// if(self.options.zoomType == "inner"){
//remove any attributes on the cloned image so we can resize later
self.$elem.width("auto").removeAttr("width");
self.$elem.height("auto").removeAttr("height");
// }
oldImg.fadeIn(self.options.imageCrossfade);
if(self.options.tint && self.options.zoomType != "inner") {
var oldImgTint = self.zoomTintImage;
var newImgTint = oldImgTint.clone();
self.zoomTintImage.attr("src",largeimage)
self.zoomTintImage.after(newImgTint);
newImgTint.stop(true).fadeOut(self.options.imageCrossfade, function() {
$(this).remove();
});
oldImgTint.fadeIn(self.options.imageCrossfade);
//self.zoomTintImage.attr("width",elem.data("image"));
//resize the tint window
self.zoomTint.css({ height: self.$elem.height()});
self.zoomTint.css({ width: self.$elem.width()});
}
self.zoomContainer.css("height", self.$elem.height());
self.zoomContainer.css("width", self.$elem.width());
if(self.options.zoomType == "inner"){
if(!self.options.constrainType){
self.zoomWrap.parent().css("height", self.$elem.height());
self.zoomWrap.parent().css("width", self.$elem.width());
self.zoomWindow.css("height", self.$elem.height());
self.zoomWindow.css("width", self.$elem.width());
}
}
if(self.options.imageCrossfade){
self.zoomWrap.css("height", self.$elem.height());
self.zoomWrap.css("width", self.$elem.width());
}
}
else{
self.$elem.attr("src",smallimage);
if(self.options.tint) {
self.zoomTintImage.attr("src",largeimage);
//self.zoomTintImage.attr("width",elem.data("image"));
self.zoomTintImage.attr("height",self.$elem.height());
//self.zoomTintImage.attr('src') = elem.data("image");
self.zoomTintImage.css({ height: self.$elem.height()});
self.zoomTint.css({ height: self.$elem.height()});
}
self.zoomContainer.css("height", self.$elem.height());
self.zoomContainer.css("width", self.$elem.width());
if(self.options.imageCrossfade){
self.zoomWrap.css("height", self.$elem.height());
self.zoomWrap.css("width", self.$elem.width());
}
}
if(self.options.constrainType){
//This will contrain the image proportions
if(self.options.constrainType == "height"){
self.zoomContainer.css("height", self.options.constrainSize);
self.zoomContainer.css("width", "auto");
if(self.options.imageCrossfade){
self.zoomWrap.css("height", self.options.constrainSize);
self.zoomWrap.css("width", "auto");
self.constwidth = self.zoomWrap.width();
}
else{
self.$elem.css("height", self.options.constrainSize);
self.$elem.css("width", "auto");
self.constwidth = self.$elem.width();
}
if(self.options.zoomType == "inner"){
self.zoomWrap.parent().css("height", self.options.constrainSize);
self.zoomWrap.parent().css("width", self.constwidth);
self.zoomWindow.css("height", self.options.constrainSize);
self.zoomWindow.css("width", self.constwidth);
}
if(self.options.tint){
self.tintContainer.css("height", self.options.constrainSize);
self.tintContainer.css("width", self.constwidth);
self.zoomTint.css("height", self.options.constrainSize);
self.zoomTint.css("width", self.constwidth);
self.zoomTintImage.css("height", self.options.constrainSize);
self.zoomTintImage.css("width", self.constwidth);
}
}
if(self.options.constrainType == "width"){
self.zoomContainer.css("height", "auto");
self.zoomContainer.css("width", self.options.constrainSize);
if(self.options.imageCrossfade){
self.zoomWrap.css("height", "auto");
self.zoomWrap.css("width", self.options.constrainSize);
self.constheight = self.zoomWrap.height();
}
else{
self.$elem.css("height", "auto");
self.$elem.css("width", self.options.constrainSize);
self.constheight = self.$elem.height();
}
if(self.options.zoomType == "inner"){
self.zoomWrap.parent().css("height", self.constheight);
self.zoomWrap.parent().css("width", self.options.constrainSize);
self.zoomWindow.css("height", self.constheight);
self.zoomWindow.css("width", self.options.constrainSize);
}
if(self.options.tint){
self.tintContainer.css("height", self.constheight);
self.tintContainer.css("width", self.options.constrainSize);
self.zoomTint.css("height", self.constheight);
self.zoomTint.css("width", self.options.constrainSize);
self.zoomTintImage.css("height", self.constheight);
self.zoomTintImage.css("width", self.options.constrainSize);
}
}
}
},
doneCallback: function(){
var self = this;
if(self.options.loadingIcon){
self.spinner.hide();
}
self.nzOffset = self.$elem.offset();
self.nzWidth = self.$elem.width();
self.nzHeight = self.$elem.height();
// reset the zoomlevel back to default
self.currentZoomLevel = self.options.zoomLevel;
//ratio of the large to small image
self.widthRatio = self.largeWidth / self.nzWidth;
self.heightRatio = self.largeHeight / self.nzHeight;
//NEED TO ADD THE LENS SIZE FOR ROUND
// adjust images less than the window height
if(self.options.zoomType == "window") {
if(self.nzHeight < self.options.zoomWindowWidth/self.widthRatio){
lensHeight = self.nzHeight;
}
else{
lensHeight = String((self.options.zoomWindowHeight/self.heightRatio))
}
if(self.options.zoomWindowWidth < self.options.zoomWindowWidth){
lensWidth = self.nzWidth;
}
else{
lensWidth = (self.options.zoomWindowWidth/self.widthRatio);
}
if(self.zoomLens){
self.zoomLens.css('width', lensWidth);
self.zoomLens.css('height', lensHeight);
}
}
},
getCurrentImage: function(){
var self = this;
return self.zoomImage;
},
getGalleryList: function(){
var self = this;
//loop through the gallery options and set them in list for fancybox
self.gallerylist = [];
if (self.options.gallery){
$('#'+self.options.gallery + ' a').each(function() {
var img_src = '';
if($(this).data("zoom-image")){
img_src = $(this).data("zoom-image");
}
else if($(this).data("image")){
img_src = $(this).data("image");
}
//put the current image at the start
if(img_src == self.zoomImage){
self.gallerylist.unshift({
href: ''+img_src+'',
title: $(this).find('img').attr("title")
});
}
else{
self.gallerylist.push({
href: ''+img_src+'',
title: $(this).find('img').attr("title")
});
}
});
}
//if no gallery - return current image
else{
self.gallerylist.push({
href: ''+self.zoomImage+'',
title: $(this).find('img').attr("title")
});
}
return self.gallerylist;
},
changeZoomLevel: function(value){
var self = this;
//flag a zoom, so can adjust the easing during setPosition
self.scrollingLock = true;
//round to two decimal places
self.newvalue = parseFloat(value).toFixed(2);
newvalue = parseFloat(value).toFixed(2);
//maxwidth & Maxheight of the image
maxheightnewvalue = self.largeHeight/((self.options.zoomWindowHeight / self.nzHeight) * self.nzHeight);
maxwidthtnewvalue = self.largeWidth/((self.options.zoomWindowWidth / self.nzWidth) * self.nzWidth);
//calculate new heightratio
if(self.options.zoomType != "inner")
{
if(maxheightnewvalue <= newvalue){
self.heightRatio = (self.largeHeight/maxheightnewvalue) / self.nzHeight;
self.newvalueheight = maxheightnewvalue;
self.fullheight = true;
}
else{
self.heightRatio = (self.largeHeight/newvalue) / self.nzHeight;
self.newvalueheight = newvalue;
self.fullheight = false;
}
// calculate new width ratio
if(maxwidthtnewvalue <= newvalue){
self.widthRatio = (self.largeWidth/maxwidthtnewvalue) / self.nzWidth;
self.newvaluewidth = maxwidthtnewvalue;
self.fullwidth = true;
}
else{
self.widthRatio = (self.largeWidth/newvalue) / self.nzWidth;
self.newvaluewidth = newvalue;
self.fullwidth = false;
}
if(self.options.zoomType == "lens"){
if(maxheightnewvalue <= newvalue){
self.fullwidth = true;
self.newvaluewidth = maxheightnewvalue;
} else{
self.widthRatio = (self.largeWidth/newvalue) / self.nzWidth;
self.newvaluewidth = newvalue;
self.fullwidth = false;
}}
}
if(self.options.zoomType == "inner")
{
maxheightnewvalue = parseFloat(self.largeHeight/self.nzHeight).toFixed(2);
maxwidthtnewvalue = parseFloat(self.largeWidth/self.nzWidth).toFixed(2);
if(newvalue > maxheightnewvalue){
newvalue = maxheightnewvalue;
}
if(newvalue > maxwidthtnewvalue){
newvalue = maxwidthtnewvalue;
}
if(maxheightnewvalue <= newvalue){
self.heightRatio = (self.largeHeight/newvalue) / self.nzHeight;
if(newvalue > maxheightnewvalue){
self.newvalueheight = maxheightnewvalue;
}else{
self.newvalueheight = newvalue;
}
self.fullheight = true;
}
else{
self.heightRatio = (self.largeHeight/newvalue) / self.nzHeight;
if(newvalue > maxheightnewvalue){
self.newvalueheight = maxheightnewvalue;
}else{
self.newvalueheight = newvalue;
}
self.fullheight = false;
}
if(maxwidthtnewvalue <= newvalue){
self.widthRatio = (self.largeWidth/newvalue) / self.nzWidth;
if(newvalue > maxwidthtnewvalue){
self.newvaluewidth = maxwidthtnewvalue;
}else{
self.newvaluewidth = newvalue;
}
self.fullwidth = true;
}
else{
self.widthRatio = (self.largeWidth/newvalue) / self.nzWidth;
self.newvaluewidth = newvalue;
self.fullwidth = false;
}
} //end inner
scrcontinue = false;
if(self.options.zoomType == "inner"){
if(self.nzWidth >= self.nzHeight){
if( self.newvaluewidth <= maxwidthtnewvalue){
scrcontinue = true;
}
else{
scrcontinue = false;
self.fullheight = true;
self.fullwidth = true;
}
}
if(self.nzHeight > self.nzWidth){
if( self.newvaluewidth <= maxwidthtnewvalue){
scrcontinue = true;
}
else{
scrcontinue = false;
self.fullheight = true;
self.fullwidth = true;
}
}
}
if(self.options.zoomType != "inner"){
scrcontinue = true;
}
if(scrcontinue){
self.zoomLock = 0;
self.changeZoom = true;
//if lens height is less than image height
if(((self.options.zoomWindowHeight)/self.heightRatio) <= self.nzHeight){
self.currentZoomLevel = self.newvalueheight;
if(self.options.zoomType != "lens" && self.options.zoomType != "inner") {
self.changeBgSize = true;
self.zoomLens.css({height: String((self.options.zoomWindowHeight)/self.heightRatio) + 'px' })
}
if(self.options.zoomType == "lens" || self.options.zoomType == "inner") {
self.changeBgSize = true;
}
}
if((self.options.zoomWindowWidth/self.widthRatio) <= self.nzWidth){
if(self.options.zoomType != "inner"){
if(self.newvaluewidth > self.newvalueheight) {
self.currentZoomLevel = self.newvaluewidth;
}
}
if(self.options.zoomType != "lens" && self.options.zoomType != "inner") {
self.changeBgSize = true;
self.zoomLens.css({width: String((self.options.zoomWindowWidth)/self.widthRatio) + 'px' })
}
if(self.options.zoomType == "lens" || self.options.zoomType == "inner") {
self.changeBgSize = true;
}
}
if(self.options.zoomType == "inner"){
self.changeBgSize = true;
if(self.nzWidth > self.nzHeight){
self.currentZoomLevel = self.newvaluewidth;
}
if(self.nzHeight > self.nzWidth){
self.currentZoomLevel = self.newvaluewidth;
}
}
} //under
//sets the boundry change, called in setWindowPos
self.setPosition(self.currentLoc);
//
},
closeAll: function(){
if(self.zoomWindow){self.zoomWindow.hide();}
if(self.zoomLens){self.zoomLens.hide();}
if(self.zoomTint){self.zoomTint.hide();}
},
changeState: function(value){
var self = this;
if(value == 'enable'){self.options.zoomEnabled = true;}
if(value == 'disable'){self.options.zoomEnabled = false;}
}
};
$.fn.elevateZoom = function( options ) {
return this.each(function() {
var elevate = Object.create( ElevateZoom );
elevate.init( options, this );
$.data( this, 'elevateZoom', elevate );
});
};
$.fn.elevateZoom.options = {
zoomActivation: "hover", // Can also be click (PLACEHOLDER FOR NEXT VERSION)
zoomEnabled: true, //false disables zoomwindow from showing
preloading: 1, //by default, load all the images, if 0, then only load images after activated (PLACEHOLDER FOR NEXT VERSION)
zoomLevel: 1, //default zoom level of image
scrollZoom: false, //allow zoom on mousewheel, true to activate
scrollZoomIncrement: 0.1, //steps of the scrollzoom
minZoomLevel: false,
maxZoomLevel: false,
easing: false,
easingAmount: 12,
lensSize: 200,
zoomWindowWidth: 400,
zoomWindowHeight: 400,
zoomWindowOffetx: 0,
zoomWindowOffety: 0,
zoomWindowPosition: 1,
zoomWindowBgColour: "#fff",
lensFadeIn: false,
lensFadeOut: false,
debug: false,
zoomWindowFadeIn: false,
zoomWindowFadeOut: false,
zoomWindowAlwaysShow: false,
zoomTintFadeIn: false,
zoomTintFadeOut: false,
borderSize: 4,
showLens: true,
borderColour: "#888",
lensBorderSize: 1,
lensBorderColour: "#000",
lensShape: "square", //can be "round"
zoomType: "window", //window is default, also "lens" available -
containLensZoom: false,
lensColour: "white", //colour of the lens background
lensOpacity: 0.4, //opacity of the lens
lenszoom: false,
tint: false, //enable the tinting
tintColour: "#333", //default tint color, can be anything, red, #ccc, rgb(0,0,0)
tintOpacity: 0.4, //opacity of the tint
gallery: false,
galleryActiveClass: "zoomGalleryActive",
imageCrossfade: false,
constrainType: false, //width or height
constrainSize: false, //in pixels the dimensions you want to constrain on
loadingIcon: false, //http://www.example.com/spinner.gif
cursor:"default", // user should set to what they want the cursor as, if they have set a click function
responsive:true,
onComplete: $.noop,
onDestroy: function() {},
onZoomedImageLoaded: function() {},
onImageSwap: $.noop,
onImageSwapComplete: $.noop
};
})( jQuery, window, document );
\ No newline at end of file
/*! jQuery v1.10.1 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
//@ sourceMappingURL=jquery-1.10.1.min.map
*/
(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.1",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=lt(),k=lt(),E=lt(),S=!1,A=function(){return 0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=bt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+xt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return At(e.replace(z,"$1"),t,n,i)}function st(e){return K.test(e+"")}function lt(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function ut(e){return e[b]=!0,e}function ct(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function pt(e,t,n){e=e.split("|");var r,i=e.length,a=n?null:t;while(i--)(r=o.attrHandle[e[i]])&&r!==t||(o.attrHandle[e[i]]=a)}function ft(e,t){var n=e.getAttributeNode(t);return n&&n.specified?n.value:e[t]===!0?t.toLowerCase():null}function dt(e,t){return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}function ht(e){return"input"===e.nodeName.toLowerCase()?e.defaultValue:t}function gt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function mt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function yt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function vt(e){return ut(function(t){return t=+t,ut(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.parentWindow;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.frameElement&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ct(function(e){return e.innerHTML="<a href='#'></a>",pt("type|href|height|width",dt,"#"===e.firstChild.getAttribute("href")),pt(B,ft,null==e.getAttribute("disabled")),e.className="i",!e.getAttribute("className")}),r.input=ct(function(e){return e.innerHTML="<input>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")}),pt("value",ht,r.attributes&&r.input),r.getElementsByTagName=ct(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ct(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ct(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=st(n.querySelectorAll))&&(ct(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ct(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=st(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ct(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=st(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},r.sortDetached=ct(function(e){return 1&e.compareDocumentPosition(n.createElement("div"))}),A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return gt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?gt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:ut,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=bt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?ut(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ut(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?ut(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ut(function(e){return function(t){return at(e,t).length>0}}),contains:ut(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:ut(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:vt(function(){return[0]}),last:vt(function(e,t){return[t-1]}),eq:vt(function(e,t,n){return[0>n?n+t:n]}),even:vt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:vt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:vt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:vt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=mt(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=yt(n);function bt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function xt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function wt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function Tt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function Ct(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function Nt(e,t,n,r,i,o){return r&&!r[b]&&(r=Nt(r)),i&&!i[b]&&(i=Nt(i,o)),ut(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||St(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:Ct(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=Ct(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=Ct(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function kt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=wt(function(e){return e===t},s,!0),p=wt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[wt(Tt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return Nt(l>1&&Tt(f),l>1&&xt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&kt(e.slice(l,r)),i>r&&kt(e=e.slice(r)),i>r&&xt(e))}f.push(n)}return Tt(f)}function Et(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=Ct(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?ut(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=bt(e)),n=t.length;while(n--)o=kt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Et(i,r))}return o};function St(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function At(e,t,n,i){var a,s,u,c,p,f=bt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&xt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}o.pseudos.nth=o.pseudos.eq;function jt(){}jt.prototype=o.filters=o.pseudos,o.setFilters=new jt,r.sortStable=b.split("").sort(A).join("")===b,p(),[0,0].sort(A),r.detectDuplicates=S,x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!l||i&&!u||(n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav></:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)
}),n=s=l=u=r=o=null,t}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=x(this),l=t,u=e.match(T)||[];while(o=u[a++])l=r?l:!s.hasClass(o),s[l?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Ct=/^(?:checkbox|radio)$/i,Nt=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle);
u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=un(e,t),Pt.detach()),Gt[e]=n),n}function un(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,n){x.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(x.css(e,"display"))?x.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x.support.opacity||(x.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=x.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===x.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,n){return n?x.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,n){x.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?x(e).position()[n]+"px":r):t}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!x.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||x.css(e,"display"))},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(x.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Ct.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),x.param=function(e,n){var r,i=[],o=function(e,t){t=x.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}x.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var mn,yn,vn=x.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Cn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Nn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=x.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=o.href}catch(Ln){yn=a.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(T)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(l){var u;return o[l]=!0,x.each(e[l]||[],function(e,l){var c=l(n,r,i);return"string"!=typeof c||a||o[c]?a?!(u=c):t:(n.dataTypes.unshift(c),s(c),!1)}),u}return s(n.dataTypes[0])||!o["*"]&&s("*")}function _n(e,n){var r,i,o=x.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,l=e.indexOf(" ");return l>=0&&(i=e.slice(l,e.length),e=e.slice(0,l)),x.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&x.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?x("<div>").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks("once memory"),m=p.statusCode||{},y={},v={},b=0,w="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||"*").toLowerCase().match(T)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(mn[3]||("http:"===mn[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&C.setRequestHeader("If-None-Match",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w="abort";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger("ajaxSend",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort("timeout")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||"",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader("Last-Modified"),T&&(x.lastModified[o]=T),T=C.getResponseHeader("etag"),T&&(x.etag[o]=T)),204===e||"HEAD"===p.type?N="nocontent":304===e?N="notmodified":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+"",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger("ajaxComplete",[C,p]),--x.active||x.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,n){return x.get(e,t,n,"script")}}),x.each(["get","post"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+" "+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(p){return{state:"parsererror",error:a?p:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),x.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=a.head||x("head")[0]||a.documentElement;return{send:function(t,i){n=a.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Fn.pop()||x.expando+"_"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return l||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||x.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&"withCredentials"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),"string"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+w+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),a=(x.cssNumber[e]||"px"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,"fxshow");n.queue||(s=x._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(x.support.inlineBlockNeedsLayout&&"inline"!==ln(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?"hidden"in d&&(f=d.hidden):d=x._data(e,"fxshow",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);(i||x._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=x._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,"position");"static"===r&&(e.style.position="relative");var i=x(e),o=i.offset(),a=x.css(e,"top"),s=x.css(e,"left"),l=("absolute"===r||"fixed"===r)&&x.inArray("auto",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),"using"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===x.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(n=e.offset()),n.top+=x.css(e[0],"borderTopWidth",!0),n.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-x.css(r,"marginTop",!0),left:t.left-n.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:"height",Width:"width"},function(e,n){x.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}))})(window);
/*! Lazy Load 1.9.7 - MIT license - Copyright 2010-2015 Mika Tuupola */
!function(a,b,c,d){var e=a(b);a.fn.lazyload=function(f){function g(){var b=0;i.each(function(){var c=a(this);if(!j.skip_invisible||c.is(":visible"))if(a.abovethetop(this,j)||a.leftofbegin(this,j));else if(a.belowthefold(this,j)||a.rightoffold(this,j)){if(++b>j.failure_limit)return!1}else c.trigger("appear"),b=0})}var h,i=this,j={threshold:0,failure_limit:0,event:"scroll",effect:"show",container:b,data_attribute:"original",skip_invisible:!1,appear:null,load:null,placeholder:"data:image/gif;base64,R0lGODlh9AH0AfewAERERHt7e3h4eHZ2dv7+/n19ff39/X9/f3x8fPz8/Pn5+X5+fm5ubvv7+6GhofPz8////4GBgfT09L6+vvf396mpqdHR0e7u7sPDw/X19aCgoPb29ubm5vj4+Hl5efDw8KSkpOvr693d3e3t7eTk5Pr6+o6OjtTU1JCQkOrq6s3Nzefn59jY2MHBwcfHx56envHx8bq6unNzc9bW1tzc3IaGhpiYmJaWlrW1teHh4ZKSkoWFheDg4Hd3d7e3t7Ozs2tra4yMjLi4uNPT08TExOPj48XFxd7e3qOjo7GxsZSUlGFhYezs7IeHh42NjaampkVFRYiIiNra2vLy8oSEhIODg7y8vNvb24CAgIKCgr29vYqKisvLy9/f34uLi66urrS0tMjIyOnp6e/v76ysrNnZ2aurq8rKypycnJOTk+jo6Jubm52dnbu7u8nJyeLi4s7OzkZGRsLCwszMzI+Pj6KiopmZmeXl5ba2ttDQ0HR0dNfX13p6erm5udLS0qenp7KysqioqMDAwMbGxp+fn9XV1ZeXl5qamqWlpYmJic/Pz29vb62trZGRka+vr7CwsL+/v5WVlUhISKqqqktLS3JycnV1dUlJSUdHR2xsbE5OTnFxcWRkZEpKSk1NTVZWVnBwcG1tbUxMTFFRUVNTU2hoaFJSUlBQUFVVVVRUVF9fX2BgYFlZWU9PT2VlZVtbW////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6N0QzQTcxRTE5QTJCMTFFNzhFQTNFODBFOEM2MzhBMUYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6N0QzQTcxRTI5QTJCMTFFNzhFQTNFODBFOEM2MzhBMUYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3RDNBNzFERjlBMkIxMUU3OEVBM0U4MEU4QzYzOEExRiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3RDNBNzFFMDlBMkIxMUU3OEVBM0U4MEU4QzYzOEExRiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAUEALAALAAAAAD0AfQBAAj/AGEJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDNr3sy5s+fPoEOLHk26tOnTqFOrXs26tevXsGPLnk27tu3buHPr3s27t+/fwIMLH068uPHjyJMrX868ufPn0KNLn069uvXr2LNr3869u/fv4MOL/x9Pvrz58+jTq1/Pvr379/Djy59Pv779+/jz69/Pv7///wAGKOCABBZo4IEIJqjgggw26OCDEEYo4YQUVmjhhRhmqOGGHHbo4YcghijiiCSWaOKJKKao4oostujiizDGKOOMNNZo44045qjjjjz26OOPQAYp5JBEFmnkkUgmqeSSTDbp5JNQRinllFRWaeWVWGap5ZZcdunll2CGKeaYZJZp5plopqnmmmy26eabcMYp55x01mnnnXjmqeeefPbp55+ABirooIQWauihiCaq6KKMNuroo5BGKumklFZq6aWYZqrpppx26umnoIYq6qiklmrqqaimquqqrLbq6quwxv8q66y01mrrrbjmquuuvPbq66/ABivssMQWa+yxyCar7LLMNuvss9BGK+201FZr7bXYZqvtttx26+234IYr7rjk7koABxg4gIITL8QgggLlDvQBCAEAYO+99gaAAg+lEmBATwbQi+/A9wbgBAyfZiBHEwE0HEAEeIyAUwgLEGxxwSpwSgEa9VocgBch1MRDxxdfHEAMXmZwxRluzPCBTSeQXHIAPsw0gswle2zEll3cIPPHFsyEAc4zOxATAQfkrDQAAaSAZcBE53sDBTCxEPXMj8BUwdJLU3GlATcsHcUGLilwdc4BFOHSA2dznW/QVW7NtRIQtOSA2wR73RIZeCv/fUCVRbQ9sBssdSD4zDm0dLjbAUg8pR1970DASmf0TfALLIWwuNtyTGm45SushILlAwfAkgqk55zGlEWQTrhKm5tcwkqPpD7zlCeQjjLstt/7wEoa9O4x7qQLsVLsF/+u0gvCE2y6lDm4frzwAcCr0hfNlz4lBcgDELpKJlDPkgvZ4+sElWHjncXkKpHfuw0srVD+vVZQOTLeLrCUQfcFi8ASAfwzmRqqBAK3pYF9K4Fc6hbgkuCV73lUakAauiYBl+yPdAHwX0tuVr6dWakBGjhbGjIAEy4gLwBPgAkasreAumGJBSb42Q5U4EKY4GBzAYAfTMxGPQ1qCQYnwIAc/yzgOJoMbWkB+MNMuhBApv1AUx9AwdUexi+aqIB/KOzUCJKAgI41zAFvwInV+hYAHISKAB2gQAJ4kgEpIvEAVRQXD7YwRQRwIV4CyYAFQBCBhiEADUYoIh4HSchCGvKQiEykIhfJyEY68pGQjKQkJ0nJSlrykpjMpCY3yclOevKToAylKEdJylKa8pSoTKUqV8nKVrrylbCMpSxnScta2vKWuMylLnfJy1768pfADKYwh0nMYhrzmMhMpjKXycxmOvOZ0IymNKdJzWpa85rYzKY2t8nNbnrzm+AMpzjHSc5ymvOc6EynOtfJzna6853wjKc850nPetrznvjMpz73yW7PfvrznwANqEAHStCCGvSgCE2oQhfK0IY69KEQjahEJ0rRilr0ohjNqEY3ytGOevSjIA2pSEdK0pKa9KQoTalKV8rSlrr0pTCNqUxnStOa2vSmOM2pTnfK05769KdADapQh0rUohr1qEhNqp0CAgAh+QQFBACwACypAOsApAAeAAAI/wBhCRxIsKDBgwgTKlzIsKHDhxARGiiixUaNCJF+lFEQsaPHjyBDimR4YQ0DAChTomSwQ0THBg+YMIHBcaTNhQYS3NyJMIFJlUBTMojwoWGCLj90nKJESZMJMzM68LwpwUoABlgZ6PkSYupOMZuCihUaZiGPF5LGxlFyQqdXjxR0nBTL4ICYtyFpzB07lsGPnkQC8E0p6dEGvBDz7OXL4BHijiEWDw7KAJLBBEIwTU4JBUmGxwy1SGZsCLRDA5U2D2agpiARzapRQvni1rTBE6NXV7C90EHswT0IFkHwOyUmOLwLdsg9mQGP5AenMC/OYI7ABL6LpwwiAbpAG9pTBv/3ThBJ+LGVBBbpdB4AFOvQKUxvfoT8wPnUu8Zoj/KFAeiD8AeAEvbBIgZ+xVmRgCECjvIAdDUIyECBYQgYVBQbpCLgJRxAh+BqNXlXgYVAMQCDJgLGUV9yHw42hX0MkijUiSm6xKKFL5IXiYxCbUCKgJLc4aGEUpH3BI8rLdhgjrxlIWGBLSAJQASwCCHgGrXZFiV/JhR4h5Q4wMJDWudBURZ0ErRIWRkFGqBmcx02wEZ7UcBAngntbVKgQDGSOKFAR1ASXhxnepdmeAywuWdkMlomEARaxKHdEyF6N8ibDLCx50A6kLgJBASV8AgUv63BpH1ftMhAl5sKpMCbaxqMpEAb7E0WRwWnFijaZgy80CpBV8AqlBkIEcCCIbAFBYUXZ5Twq0AX7MCcVjQ8S1AYwma6UAczVPCJKJJcQgkpDszxoLUDhVDBInNhZUMX6BaEG3VfOAQBBUzcUUQKEvwXr0EGdEBBlv8OJIG0vFZiY8EM20bDAdMuMkjDFCcnwRxr6IHVIjpAwoRCAQEAIfkEBQQAsAAspwDqAKYAIAAACP8AYQkcSJAgAQIFEypcyLChw4cQI0qcSJHiBRWMDunQYeiJHA4JKoocSbKkSYEG7rR4ESTRGh80FFA0wIINAgA4c+KEosONzJNAgwqtOEbDAJ06BwTpElHMCyhIo+IMwmKoUAMhrWqFlcDBUalJE31waAELWLAehBjYWjGDoCoD4g5A8IMJ25MpPJyVOoALQxd89oKFYibrXYcUbHyNOqBGisMijywWnFSIQj+BKYMFA7nhkMlgB3DuHJEJaM04B2AoGKIKarA9LJBO2OJ06BezHRrI/BrpADEDCTjoDTbRg9wCZ9g+O4AR8oVPiEs9MFBEHOlSYyBXsHzvgDfPCz7/6P56gCKBGrBLrUEh9wv11MMPDKQ+Kh9YMArUj3pidgfy3vEgn0AAlsfEEPtF9cVsbux3yIApFPiaIGAkiJQSCHUWxH4DDMiFhTqZkB6IOGnyE2QSMncicoyQmJoNLgJAyQakpXjWFPKxEeMAMLo4Y40J4hjeGjuOSKInK95lI19JzmbGjoDESMdanW3B4YBGxJiICjFWMBsR+ykx4Aox9nGBJC6eR1oGSyZFw4AGtMmcGhAcQmIVEuQWiXoeDCiQjiB2CMsJUFkICHJsSjfAm36aBuJqXPW4XxUXPOfGkgMg4edAktbnAQQDFaFffVAYIR8gKQ4g5qYCccchowMZnKGXek9QGV5tlGXKKkEiyJnaIwr1cZ10LzSJ3BhBLDfXEbsWxIWcuioEQQs3vQZFBcaGx8QXPXwV1ws5NKuQcr0NcGhDNOiAWhUu2CquAR1QYJi4CmWQbK58MPWQAi4EUahUVeAwFr0EU3REDcr24AZFDXTRBxtBaKLJKIY8Ukh7BWdMUQaKOIBAXD3YgMEIJiVQggINgKrxyp0FBAAh+QQJBACwACymAOoApwAgAAAI/wBhCRxIEFYJHhMc3NDBBkchCQUjSpxIsaLFixgzatzI8WKRQwcAiBwp8oAXOAQ6qlzJsqVLAhyMIFLSqI6VIyU4jmgUEsDEkVUKuRxKtGjLD38OTDygJEfGFj0xAjjgwIDRogSsXt060EAgpRYPNJpi8atPjSLp5OTa0YiXA3AP1BAygi1RJlk2HoBDsULIjiK9JLCLsQMhsBEP0GFCeGUOxBoPWJGI4e9KAIcaV5wBeWkMzRtHdI7souAFy5cPlAZd0MjopYhYXyRQpeWBEASVnG0JAMta2WVeUzzwQ3ZFMkOjDOSAmrcQ47CEVzxAArpE6ZH9CHSw22VvCLJjq/9Ubp2go6K1DTT3Xp019ulFyg98H3kEh+5DATwHPaelA/mwMEGfRka4gZ93jbCmhG0A8mXUDWQcyBsW7tn2G3TFGXUAIRKyNFWFLT0gHwhXbdhhaiCyJGJ5dZRYwYkqAZAXaAMOB2ASJRoBI2B0sKYDg/K5cVUjOezIEQA4giYkS2gAqMZVE5SwHm9HyFZjYlXKR8CVYYkByw1GZtSbVqCxsdKMAJJIFFgiTBkjcsZxKdABWQIoGlGrwZJImBZNBZFxKnB5QAUAEkTIUGjCQoKbaB2wH3RC1HhAk4UOJKVtdQqUBKNSBQGgaxcdMEmlBfEg53w4SHSISDFWsUGhHyh7IZxcTpFakCKnDjoRATdwKpFIVXxg6wg/YAEWXIjEZ6tEwen16ER+8TkVHRQsOxABCnRg7UWyhlpFrRaxUMVIFJU02bbobpQDHbNiocJGBLhRQ08kjYRFEtWmq+9GfgQy7wFYEOLCBSyNMAghUWSRRQ03xHBHSvtGTFhAACH5BAkEALAALAAAAAD0AfQBAAj/AGEJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDNr3sy5s+fPoEOLHk26tOnTqFOrXs26tevXsGPLnk27tu3buHPr3s27t+/fwIMLH068uPHjyJMrX868ufPn0KNLn069uvXr2LNr3869u/fv4MOL/x9Pvrz58+jTq1/Pvr379/Djy59Pv779+/jz69/Pv7///wAGKOCABBZo4IEIJqjgggw26OCDEEYo4YQUVmjhhRhmqOGGHHbo4YcghijiiCSWaOKJKKao4oostujiizDGKOOMNNZo44045qjjjjz26OOPQAYp5JBEFmnkkUgmqeSSTDbp5JNQRinllFRWaeWVWGap5ZZcdunll2CGKeaYZJZp5plopqnmmmy26eabcMYp55x01mnnnXjmqeeefPbp55+ABirooIQWauihiCaq6KKMNuroo5BGKumklFZq6aWYZqrpppx26umnoIYq6qiklmrqqaimquqqrLbq6quwxv8q66y01mrrrbjmquuuvPbq66/ABivssMQWa+yxyCar7LLMNuvss9BGK+201FZr7bXYZqvtttx26+234IYr7rgmQtBAAwSQixABVzwRQQAAABDAAjYo0kFfBHCAgQMoOPFCDCIo8GUDeCAQ78EIy/sCDHl9AAK8CccbAAo8cGmBwRFnHMAPNxFgQE8GPJxxwgE4wTCWFUA8csQllxBTBnI0EcDMAUSAxwg4hbDAyhqrcCUaKvMcMRUCt0QB0CMH4EUINfEQtNAHBxBDlSlDvfIWELB0wtMa+zDTCFxbLa8RU24t9soVrIRB2Bo7EBMBB5ytcQpRGrCz3BpzkBILbCf//QhMFeCdMRVRWiH4yCagpEDfKwdQhEsPMC52ABY8CQHGh5OMs0kOZE54S2RkHvEBT74hesYcl9SB5I3n0BLrk2/O5COnR5yFSWec/gJLIcAuthxORlE7yQ2UhMLpAbCkwvAIp+Ek5swDcPJIviftskq0Ry9vkwRULzbdJHmf8QMraaD99kx2fz4AapQkfsTkq/TC+ck3+b7QH7iPfNEpfUG/kzug3/VGYgLkscQF53OCkwKnPdKVBIGiswFLVnA+KzjpCudLW0kycD95iYAl6mNeANrXJANAD3l6M4kdMrcAl5hPhFDyH/OagBIOCi4AH2wJ2JhHticp4ISHC8AV/1LCBe8F4AkwQcPwFpA1KBmhgwezw0pw4LsASBAmi0NeDqO0QtFFoHhqY10A/jCTLnRwY1QigBMyh4D8teQDKGBbzSpGExW874hWIsANxBeB6blkBElAAMRm5oA34IRvcgsADrIUgyqiAYwzIUAHKJAAnmQgjlALwAHomCUYvIBxAdgCJ+3Cgy3IEQFc+NIG5OCEoAWACklgGl8yYAEQvCsACECDEWQXJgJQAAYfyMDH1EXMYhrzmMhMpjKXycxmOvOZ0IymNKdJzWpa85rYzKY2t8nNbnrzm+AMpzjHSc5ymvOc6EynOtfJzna6853wjKc850nPetrznvjMpz73ycfPfvrznwANqEAHStCCGvSgCE2oQhfK0IY69KEQjahEJ0rRilr0ohjNqEY3ytGOevSjIA2pSEdK0pKa9KQoTalKV8rSlrr0pTCNqUxnStOa2vSmOM2pTnfK05769KdADapQh0rUohr1qEhNqlKXytSmOvWpUI2qVKdK1apa9apYzapWt8rVrnr1q2ANq1jHStaymvWsaE2rWtfK1ra69a1wjatc50rXutr1rnjNq173yte++vWvgA2sYAdL2MIa9rCITaxiPRUQACH5BAkEALAALAAAAAD0AfQBAAj/AGEJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDNr3sy5s+fPoEOLHk26tOnTqFOrXs26tevXsGPLnk27tu3buHPr3s27t+/fwIMLH068uPHjyJMrX868ufPn0KNLn069uvXr2LNr3869u/fv4MOL/x9Pvrz58+jTq1/Pvr379/Djy59Pv779+/jz69/Pv7///wAGKOCABBZo4IEIJqjgggw26OCDEEYo4YQUVmjhhRhmqOGGHHbo4YcghijiiCSWaOKJKKao4oostujiizDGKOOMNNZo44045qjjjjz26OOPQAYp5JBEFmnkkUgmqeSSTDbp5JNQRinllFRWaeWVWGap5ZZcdunll2CGKeaYZJZp5plopqnmmmy26eabcMYp55x01mnnnXjmqeeefPbp55+ABirooIQWauihiCaq6KKMNuroo5BGKumklFZq6aWYZqrpppx26umnoIYq6qiklmrqqaimquqqrLbq6quwxv8q66y01mrrrbjmquuuvPbq66/ABivssMQWa+yxyCar7LLMNuvss9BGK+201FZr7bXYZqvtttx26+234IYr7rjk1igBCVLskQMMBPxlwB1yaGCCF2wIQYMCYa6AhAcCAOCvvwIowcJeH9TR778IC2ACD12m4MXBCCd8wBA3lfDAFB3wZAASEEecsBcwaIlHxx4nbEgCMhUxyQEHC4CABnsYcFMICJRsMwACzIElGiTf/G8VG7zEgQk9/0wxTV0U7TPOfVh5iNJLZ9FAS21A/a8AdcgcExNW+ywAEVQK0bXPOrBExtj/6oDySwbUvLTXKUg5Ato3CzCISlrQ/S8bMAX/8vbbWUhpwt9Le7C2SWroffUZLj2guM0C5AEl14QvDfZJOlQe8QFTszSJ5j4jACUZoN9cxUmJl/5vGC09XjcTT7qtesQCBF0SILP7awJLIbh+cwtOKuC7zTSYVEPuOJew0hzIe9yIkyE0HzEGJRkw/L8hrOSI9Ak7WQT3/+JRUgfS57DSC+AD7OQb6QMARkkUSM+wSmy0L4CTKbQPPEkJXO9v3CohXfru1yQK+C9iZTBJFZAnAHypZBDt80LswCeAB5iEEciT4EpW0L42PAkJ4DvASYpwPeqtxHoUVMOTOHBAf3nwJEGYnQcceD4KRikK0msgSnLgOgHIwSWUk97l/55EAv8JoGkpAcPjlACTQ0gPARCQUiCuVwOWaEBvXqBhS4THwOJNaXCqQ4AEWnK2twngBlp0yRGGJ4AkVMkAMQQdAmDnkjLsIHR3o8kcegiCK0HgioQTQBQyEBMC7IFnCdPBGZRnkz0oTgDvyxILWFY4LdjEAA8Qgxo+cDicZIBoZkTA/LZUiCD0TABZkEPn8NKFKChNAB5gHJgasII8YKAFc8gBBf6SgTwggWWwPAQRRlCuYhrzmMhMpjKXycxmOvOZ0IymNKdJzWpa85rYzKY2t8nNbnrzm+AMpzjHSc5ymvOc6EynOtfJzna6853wjKc850nPetrznvjMpz73ycrPfvrznwANqEAHStCCGvSgCE2oQhfK0IY69KEQjahEJ0rRilr0ohjNqEY3ytGOevSjIA2pSEdK0pKa9KQoTalKV8rSlrr0pTCNqUxnStOa2vSmOM2pTnfK05769KdADapQh0rUohr1qEhNqlKXytSmOvWpUI2qVKdK1apa9apYzapWt8rVrnr1q2ANq1jHStaymvWsaE2rWtfK1ra69a1wjatc50rXutr1rnjNq173yte++vWvgA2sYAdL2MIa9rCITaxiF8tYrgQEACH5BAkEALAALAAAAAD0AfQBAAj/AGEJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDNr3sy5s+fPoEOLHk26tOnTqFOrXs26tevXsGPLnk27tu3buHPr3s27t+/fwIMLH068uPHjyJMrX868ufPn0KNLn069uvXr2LNr3869u/fv4MOL/x9Pvrz58+jTq1/Pvr379/Djy59Pv779+/jz69/Pv7///wAGKOCABBZo4IEIJqjgggw26OCDEEYo4YQUVmjhhRhmqOGGHHbo4YcghijiiCSWaOKJKKao4oostujiizDGKOOMNNZo44045qjjjjz26OOPQAYp5JBEFmnkkUgmqeSSTDbp5JNQRinllFRWaeWVWGap5ZZcdunll2CGKeaYZJZp5plopqnmmmy26eabcMYp55x01mnnnXjmqeeefPbp55+ABirooIQWauihiCaq6KKMNuroo5BGKumklFZq6aWYZqrpppx26umnoIYq6qiklmrqqaimquqqrLbq6quwxv8q66y01mrrrbjmquuuvPbq66/ABivssMQWa+yxyCar7LLMNuvss9BGK+201FZr7bXYZqvtttx26+234IYr7rhnEmCAAQSQixABI1gABiGrqILGF2Fw0ABPBrxhxQ1VHKBDEiwoMGYIRjhARxBrWPGGATQlcIUDnkABwMQUA0DJDSpsgNMFNgBRccVAZEGDlw3gsYjHHwOQyQswxCQGCJKknDIUOpQBQcN2oCwzxUAcMMaWLmSyM8gVvDREFUPLTIkg97rMQNIpA+FCljfoDDUQHmi8kgqWQC1zHGCUABMNVns9MRCAXFlD2V5XojVKhXRtdspxtJFuSymwPTcQE1T/WfXcH1tyt0kpIA14yp0U0pIBixwe9QpTcqH33GicZEAFjsscRMsrEZJ5ypZIacDTn58thklHXFJ6xVAIshIMkx8OBBdRWrE6xYmUBMEft1ecyNsnOdA7xYtEWcnwQAAP0genDD9xHHuoFLvjQKTw5AfTA077SHtI7DwAYKQkRvaHt/GkIt/fQFIb309sA8MnudA+ADU86cj3HpDEe/ufdIDS/t8DwpNe8L3iiQQCBGyfKSSAkkjMT4BOWkMBR0KABH5vgSjRwQOfRIbvhW4kIJgfKpQHwg06iQvfiwRJ+jC/GyQAJYKY3wGeNALymW1qI7GA95zniJSQYH7he1Lj/3oHhAeQZASe+B4UhpASA9jQbEC4A5SSMLwZksQAnnNeFaagEgc6D4JPKoHQVgeELphkDzEbXh9Wkjfn9S1KWniizExwkhJYcHVVGAFL6DA8BtxMSlEoXSXEdpIiFOB2ktjeShQgR5kBoQxUMgACMseAEKiEC2nMHBS+8MKWXKGRRLNSAqogx0roUSUEEEQmAQeFP5BQJS4AJQCAsIYsOYJ8QNBB01ZiABd44HCSSMIrVzKERgKBDFt6ABomB4QakCAmR7jBDocGhRqooJMykUAWcLmIkXXJYWSogQAscQBCKGKYLNkAF3Sguq9FwQo/uwkNEMDMTBgBVArggSAc8P+KT3yCFWvAAwsYuBMJcMEOlQACEDJBhwlYklQEaEAHKFCCwanrohjNqEY3ytGOevSjIA2pSEdK0pKa9KQoTalKV8rSlrr0pTCNqUxnStOa2vSmOM2pTnfK05769KdADapQh0rUohr1qEhNqlKXytSmOvWpUI2qVKdK1apa9apYzapWt8rVrnr1q2ANq1jHStaymvWsaE2rWtfK1ra69a1wjatc50rXutr1rnjNq173yte++vWvgA2sYAdL2MIa9rCITaxiF8vYxjr2sZCNrGQnS9nKWvaymM2sZjfL2c569rOgDa1oR0va0pr2tKhNrWpXy9rWuva1sI2tbGdL29o62va2uM2tbnfL29769rfADa5wh0vc4hr3uMhNrnKXy9zmOve50I2udKdL3epa97rYza52t8vd7m4pIAAh+QQJBACwACwAAAAA9AH0AQAI/wBhCRxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1LtqzZs2jTql3Ltq3bt3Djyp1Lt67du3jz6t3Lt6/fv4ADCx5MuLDhw4gTK17MuLHjx5AjS55MubLly5gza97MubPnz6BDix5NurTp06hTq17NurXr17Bjy55Nu7bt27hz697Nu7fv38CDCx9OvLjx48iTK1/OvLnz59CjS59Ovbr169iza9/Ovbv37+DDi/8fT768+fPo06tfz769+/fw48ufT7++/fv48+vfz7+///8ABijggAQWaOCBCCao4IIMNujggxBGKOGEFFZo4YUYZqjhhhx26OGHIIYo4ogklmjiiSimqOKKLLbo4oswxijjjDTWaOONOOao44489ujjj0AGKeSQRBZp5JFIJqnkkkw26eSTUEYp5ZRUVmnllVhmqeWWXHbp5ZdghinmmGSWaeaZaKap5ppstunmm3DGKeecdNZp55145qnnnnz26eefgAYq6KCEFmrooYgmquiijDbq6KOQRirppJRWaumlmGaq6aacdurpp6CGKuqopJZq6qmopqrqqqy26uqrsMb/KuustNZq66245qrrrrz26uuvwAYr7LDEFmvsscgmq+yyzDbr7LPQRivttNRWa+212Gar7bbcduvtt+CGG2QDIcyAQQx9QAIHCR2IW5ABXZjRRBwA1GsvFBG8YEG74pZxA732BixwE0Q08O0DT/Qg8MILo/DGTQaQAAkaW9RgBw5XKGAmAQbQVMQWDIcsMB9h0DTGCzKELMMWR4D5QRs16CHDzFh8wcFLNGAh8s726qFFTAkQkjLPMtTwAZcrbDH0wjIsUAhLd+jM89Q9YPBSCgpPba8MZ2g5ydIiy4CCwShlALLWU/NxRUtHgI22DHhcSQAKbu/MxwMoVYA22lts/7BSCHW/LYeVKOxtLx8alyRC1obzjINKBjDeeL0yiEHlF4FPvUVJBKwx+dQLHI0SCJ8LXMCUgJcuQ8kjkQBw6SK3gdIUmRsuAxxSFg57DwSMlATsPAeRwElPAB9wD1FKUDvaM4hkQBDGixyH5SYtb3sIUBIRvQ4ifSBJ9CKzTlIK1hsOCZS6A6+HSEeAL3ISJp3hfr1BQCm56ol/NMf8DL9gkhn8kwGUyqc1vIEEA/xbmA1M4rn5CfBJBJzaFEIihwQK7AYmsUMA7Rc9GfDrI/KzoL38VxK9ORBK0DPe+kJSBhHaywwm0d78agAlSETPCSJhwussaLWScIB/QoDSB/8iKDLchaQBTXBhHEhgEgMQkWgriFISd9cxkZjQgk3IH0ka2EEpkeCJAZPBz0ZCAyiIEH4nSV30BiclB5SuCiVJQPrmxwc1pOQG0esBBKZEACpMrgcGJIkFzMi/P6hEAWAUmAzWRqUGVMFwPUjBSQyABv5h4QIrEUEiKfeFKxlgDeWTQRUCaZIQRMB9UOgaS86QSBk4QEtlWEDtesBGlZyAD+BLwh5bMoMnygCNWyoCCPgwNBnowQZ76F1LzoBL4FVgeC+RgNKmJoMetAxMBuhAB6AZEwssoHR6+AE3YXKEKmTOmOLDFAfSMLkIGLEmEoADIYhpzBvIgQmeKgEG/Kj/NT6YQXTg2kAYbvA9hsVhC3jAnrsEQgAYnKANFXDAC0AAhjmIgWwLzahGN8rRjnr0oyANqUhHStKSmvSkKE2pSlfK0pa69KUwjalMZ0rTmtr0pjjNqU53ytOe+vSnQA2qUIdK1KIa9ahITapSl8rUpjr1qVCNqlSnStWqWvWqWM2qVrfK1a569atgDatYx0rWspr1rGhNq1rXyta2uvWtcI2rXOdK17ra9a54zate98rXvvr1r4ANrGAHS9jCGvawiE2sYhfL2MY69rGQjaxkJ0vZylr2spjNrGY3y9nOevazoA2taEdL2tKa9rSoTa1qV8va1rr2tbCNrWxnS9vaPNr2trjNrW53y9ve+va3wA2ucIdL3OIa97jITa5yl8vc5jr3udCNrnSnS93qWve62M2udrfL3e56lzwBAQAh+QQJBACwACwAAAAA9AH0AQAI/wBhCRxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1LtqzZs2jTql3Ltq3bt3Djyp1Lt67du3jz6t3Lt6/fv4ADCx5MuLDhw4gTK17MuLHjx5AjS55MubLly5gza97MubPnz6BDix5NurTp06hTq17NurXr17Bjy55Nu7bt27hz697Nu7fv38CDCx9OvLjx48iTK1/OvLnz59CjS59Ovbr169iza9/Ovbv37+DDi/8fT768+fPo06tfz769+/fw48ufT7++/fv48+vfz7+///8ABijggAQWaOCBCCao4IIMNujggxBGKOGEFFZo4YUYZqjhhhx26OGHIIYo4ogklmjiiSimqOKKLLbo4oswxijjjDTWaOONOOao44489ujjj0AGKeSQRBZp5JFIJqnkkkw26eSTUEYp5ZRUVmnllVhmqeWWXHbp5ZdghinmmGSWaeaZaKap5ppstunmm3DGKeecdNZp55145qnnnnz26eefgAYq6KCEFmrooYgmquiijDbq6KOQRirppJRWaumlmGaq6aacdurpp6CGKuqopJZq6qmopqrqqqy26uqrsMb/KuustNZq66245qrrrrz26uuvwAYr7LDEFmvsscgmq+yyzDbr7LPQRivttNRWa+212Gar7bbcduvtt+C+qIAYM6jgxhBvPBAuQiEwUsAAAMQr7wA92CAFAevCQkMN8Mrr778eCIKvtxLQ0e+/CPtbgBTdntBDwhD/O0AFNhlwRwsvBJHIGj7QoMCmExwc8cgD6DAwTGNoILK/AwTRhZgNMPFGDmJ0AFPII+fsrw4wJeDAygkPkMgHXSbgQhUiD1CAEBuwNAPQOkM8gAYupeBB1PNysaULV0c8wCMnm7RB11jrPIAKLB0Bdc4DCIElAUqs/W8VGaCkRNlle/BxSkzI/802BlYSsAXefKhbUg5+4/3vEykZwIfiEotRpSGQH2BASYlAjvUAFKD0hOb/HkClColDjARJY5QOOgBWnPSA6mwrIiUBZCs+wBgj4bB61AicFMju/vIhpSK7ny4SFsCzXXdJsJvNRJSZr95D2B010DzoLJSUwvU5CwKlAdwj/DxIFySvcwwlcWG+vCZAOUXyhYTEw/ojv1ASI/QDMACUYiTvQkgzyB/ElFASNuRvf0/qH/D+B5IAChBhPCPJGg4IpQ8kbwghOcIDEcaGkpiBgk9KQPj+lYKQhGCD//pBSYyQv0REqQa7G8DlQKKAEeLNAiVZQf76ECU37K6DIkEACv/jNQCikQR86xuAGqKUgIdpbgCSE0kFhggAD5zEgOZDYJQwMEIgimQFNowaI07SN/MBbkomgBwfGlCSA6BwABdAiQ2S5wEIUKkByCtbD0JgEguEcWQEREkNY0gDKzUgEapDwPhMAkMB3k4lIrDh17LkA79NjY0oEcMfETYAQLCEC+EbgPGyRAEw8CFpPUBCHFdihU36KwgueRreOvmlB+RgCBaggRFdggRXAuAAJXhJBoJQugHw4WWWUhnwsNC0mByBX1LrgRs0BQhJBiGYNMmAIhyAgAHQywYYGEGnRCBE2/ngWwQQghPNZoMprCsBKoBm0BCAA8PlSyANKIIbvoD/hBeYYQI0WN49B0rQghr0oAhNqEIXytCGOvShEI2oRCdK0Ypa9KIYzahGN8rRjnr0oyANqUhHStKSmvSkKE2pSlfK0pa69KUwjalMZ0rTmtr0pjjNqU53ytOe+vSnQA2qUIdK1KIa9ahITapSl8rUpjr1qVCNqlSnStWqWvWqWM2qVrfK1a569atgDatYx0rWspr1rGhNq1rXyta2uvWtcI2rXOdK17ra9a54zate98rXvvr1r4ANrGAHS9jCGvawiE2sYhfL2MY69rGQjaxkJ0vZylr2spjNrGY3y9nOevazoA2taEdL2tKa9rSoTa1qV8va1rr2tbCNrWxnS9vaHNr2trjNrW53y9ve+va3wA2ucIdL3OIa97ibCggAIfkECQQAsAAsAAAAAPQB9AEACP8AYQkcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gw4odS7as2bNo06pdy7at27dw48qdS7eu3bt48+rdy7ev37+AAwseTLiw4cOIEytezLix48eQI0ueTLmy5cuYM2vezLmz58+gQ4seTbq06dOoU6tezbq169ewY8ueTbu27du4c+vezbu379/AgwsfTry48ePIkytfzry58+fQo0ufTr269evYs2vfzr279+/gw4v/H0++vPnz6NOrX8++vfv38OPLn0+/vv37+PPr38+/v///AAYo4IAEFmjggQgmqOCCDDbo4IMQRijhhBRWaOGFGGao4YYcdujhhyCGKOKIJJZo4okopqjiiiy26OKLMMYo44w01mjjjTjmqOOOPPbo449ABinkkEQWaeSRSCap5JJMNunkk1BGKeWUVFZp5ZVYZqnlllx26eWXYIYp5phklmnmmWimqeaabLbp5ptwxinnnHTWaeedeOap55589unnn4AGKuighBZq6KGIJqrooow26uijkEYq6aSUVmrppZhmqummnHbq6aeghirqqKSWauqpqKaq6qqsturqq7DG/yrrrLTWauutuOaq66689urrr8AGK+ywxBZr7LHIJqvsssw26+yz0EYr7bTUVmvttdhmq+223Hbr7bfghhukBIXgcAgdTkRixhkhQCAuQSXIQUUBANRrr70LmHGBuATgscC9AANcgA0PfHsHFQEnLLAcNxHAARFI6ECHBm2IUAKnRNCr8Mb1FsCGuzJ9gIjGARegQw6Z9kEyxxzrQABMBjyxssIF0AHDlwrQ0EYgT+BRiAQvGTEzyxvb8FIIWBB9bwFwcJmCDUMXsAUNLHEwtNIJF4BHSzxczXIBbWQJwSRedxyJAilBgDDWShcgxkojlP31IFcmgALWVHyAUhtss/8dhEoERNB3ySlYSUffEXRgUgL/Dk50ASKkZIbjAddQJSNyJ4yCSWdQrjQdKD2Qedt+THnB6CVbUFITnj+ewUmMtA5wBFNq4DkVJHWAuuelm7T74yNEmcDvAhcukgiyE12HSSEQzzIGUb4huyAjCZI8y5aXBMf19yoRZRiyszESItxvXIBJgJTfcZR4yP63SIeon/XLJNUh//lQtt/6+yHZIH/J9BuJ7dSHvycRQXaHGAkS/icwkzjiflHigey0MBK+MdBeuCsJ+NQHOiiVwHn2KsAKRrKHC9orgSVRg/woGCX/UY52I5EACNkWBpMQYIZZe1uUxADCApyhJGtjYAH/9GYS+3GvgFEi3+C2YBILMrAJKIkb9+g2JQIkom9YKFhJKIBDlikiJWy4HhZANiUFsE5pWNChSQLBQCqQ0SQflB3krmQANsitAEEAGkpKkDQClmElXcBhAcCgJR44IWpUyANLhtDFgC2PJXDoYSC69ABFmMEGNkDEIILnEjM00l5NMIBLykA8rVlKA5+kguJekgEdjK4AEUDZpQLRxUSsMiY8CILXCrCAOWwqDD1EQgBnkgE/PGFevGTDIPbVqQdADWsFoALVwpUCO3IMj4V410Aa0AVA0AELBSgAFhKBBAvoUZvoTKc618nOdrrznfCMpzznSc962vOe+MynPvfJ989++vOfAA2oQAdK0IIa9KAITahCF8rQhjr0oRCNqEQnStGKWvSiGM2oRjfK0Y569KMgDalIR0rSkpr0pChNqUpXytKWuvSlMI2pTGdK05ra9KY4zalOd8rTnvr0p0ANqlCHStSiGvWoSE2qUpfK1KY69alQjapUp0rVqlr1qljNqla3ytWuevWrYA2rWMdK1rKa9axoTata18rWtrr1rXCNq1znSte62vWueM2rXvfK17769a+ADaxgB0vYwhr2sIhNrGIXy9jGOvaxkI2sZCdL2cpa9rKYzaxmN8vZznr2s6ANrWhHS9rSmva0qE2talfL2taSJyAAIfkECQQAsAAsAAAAAPQB9AEACP8AYQkcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gw4odS7as2bNo06pdy7at27dw48qdS7eu3bt48+rdy7ev37+AAwseTLiw4cOIEytezLix48eQI0ueTLmy5cuYM2vezLmz58+gQ4seTbq06dOoU6tezbq169ewY8ueTbu27du4c+vezbu379/AgwsfTry48ePIkytfzry58+fQo0ufTr269evYs2vfzr279+/gw4v/H0++vPnz6NOrX8++vfv38OPLn0+/vv37+PPr38+/v///AAYo4IAEFmjggQgmqOCCDDbo4IMQRijhhBRWaOGFGGao4YYcdujhhyCGKOKIJJZo4okopqjiiiy26OKLMMYo44w01mjjjTjmqOOOPPbo449ABinkkEQWaeSRSCap5JJMNunkk1BGKeWUVFZp5ZVYZqnlllx26eWXYIYp5phklmnmmWimqeaabLbp5ptwxinnnHTWaeedeOap55589unnn4AGKuighBZq6KGIJqrooow26uijkEYq6aSUVmrppZhmqummnHbq6aeghirqqKSWauqpqKaq6qqsturqq7DG/yrrrLTWauutuOaq66689urrr8AGK+ywxBZr7LHIJqvsssw26+yz0EYr7bTUVmvttdhmq+223Hbr7bfghkukAQ2UYIC4Cklwxg0ICAAAAAJ44EUbKaA7UA5BuPvuvvwKcMAZEIT7QCP68mswvwdIgZMEeUyiQw1VmIAEESF0OocHB2dssACI1ESDEgVvvEMY52IKRsgaayyACSW/9AHIKfNbBQ2X4oFyzBqbELBLhWCMc79gdEnAHi8cIIAACNwARwMu5XHzzxm/4FIYT+MsAAhbhoGAymAQsJIEPkNt9Rws7VH1zwI4gmUCBONcBQwqKSG22AiUoNIUYc/d7xBWJv+wg9gefIASB2frzW8SKhlieMYH2E2lDnof0DJJci+OswcJoJRD4XP3QeUcnB8ciEkUhG453yfZYXnGmE+5teECZFDSEKv/fMNJpdd+8B5SdmH6wVqURIjuMXtw0gzEGzyJlIGsXkNJWSSv8gYmgSH9vlFIWcPqAng90u+W11sSGte/232Ur1vueEgGgL94ESaZUP67TEOZt+Hrg9T+/AbnED//+WvS3yx3vu/xj19qMInqylfAJyFidVUoyQEOuC8JmMQR84tglGiwOh+URHEUbOBI/DA/rEWJAOmbmwAeUJIzUBAAJjiJBNyHMz9MaRA0rINJHkBDsYUBJY24ngD/AvikIOgNAfUrSRQOKIAOoMRs0mNElRQwQah5QHwmKUMPcabDlMiPeB6Q3RSjwLkDVCwl22OgBVOSgi3uSwBEyFIb7vdGRCQRJWpw48EE4MGV4LB2UtNSA+agg3bFywuQoF5L+qBHfgXBJTaznBImtyUDUNIlhGgkAA6ggJdAwn0C0MAlIYUGPR5AjC95Qxp/5oEfYsoRPVwZEVtigDBk4WwCAAMFNkWDKopNAG3ACQmEoARDeiAIjGBB5jpFAAy0y2p/UOROCDDKT+UABM98owdukIdZoqsBMAhBCj7QSXuZ85zoTKc618nOdrrznfCMpzznSc962vOe+MynPvfJ9c9++vOfAA2oQAdK0IIa9KAITahCF8rQhjr0oRCNqEQnStGKWvSiGM2oRjfK0Y569KMgDalIR0rSkpr0pChNqUpXytKWuvSlMI2pTGdK05ra9KY4zalOd8rTnvr0p0ANqlCHStSiGvWoSE2qUpfK1KY69alQjapUp0rVqlr1qljNqla3ytWuevWrYA2rWMdK1rKa9axoTata18rWtrr1rXCNq1znSte62vWueM2rXvfK17769a+ADaxgB0vYwhr2sIhNrGIXy9jGOvaxkI2sZCdL2cpa9rKYzaxmN8vZznr2s6ANrWhHS9rSmva0qE2taleLnoAAACH5BAkEALAALAAAAAD0AfQBAAj/AGEJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDNr3sy5s+fPoEOLHk26tOnTqFOrXs26tevXsGPLnk27tu3buHPr3s27t+/fwIMLH068uPHjyJMrX868ufPn0KNLn069uvXr2LNr3869u/fv4MOL/x9Pvrz58+jTq1/Pvr379/Djy59Pv779+/jz69/Pv7///wAGKOCABBZo4IEIJqjgggw26OCDEEYo4YQUVmjhhRhmqOGGHHbo4YcghijiiCSWaOKJKKao4oostujiizDGKOOMNNZo44045qjjjjz26OOPQAYp5JBEFmnkkUgmqeSSTDbp5JNQRinllFRWaeWVWGap5ZZcdunll2CGKeaYZJZp5plopqnmmmy26eabcMYp55x01mnnnXjmqeeefPbp55+ABirooIQWauihiCaq6KKMNuroo5BGKumklFZq6aWYZqrpppx26umnoIYq6qiklmrqqaimquqqrLbq6quwxv8q66y01mrrrbjmquuuvPbq66/ABivssMQWa+yxyCar7LLMNuvss9BGK+201FZr7bXYZqvtttx26+234IaLqAJizDDIBFZg4EcRGUAwqgEX0JAHHDOIocBOCXThSBOUQAHAvwBAcQkqDgyxgacNhBHAEgADvEQoSUxhEwFS2HBJwxgDHEcTLnSgqQGTMJwxxkt48cFMU0zSycgsAxCHDjlgyoIrLY+8xBcxFeFFzTUP4Ia7lJIhMs8kY2GASzQsQHTNnQhCwKRoDL00xnocvVIRSk/d8iUucDnFHSSM8TRMjEitdcMBrDTFzme3LAMNWIrRyBJDL0EF3C1JYXbb/y7/4UBKEDDiL98sRyFBlQbMzfISCxysEgGlEG7zHSjRQInkLEPRB5UdLEI0J2qolATmIw9wkgEvkM5yABdISQAoU3PyAEoGcKI6yTGXVMTlt2MMhSBSRnK26Sfl0TvGJpjkw/EZm1AClCPsXfMSfpy0A/MOjy1SAyZg3zAlK0CJBt96nCT97eGPNIIn3gMMxRxQ2t72Eh6TJMH5qrtBkgiYtA8wGE+iAP5qlruRkMB/AJgESeAwOP/9zUkjkFz1SEIDBK6BJC5A4L9sADQmRZBweSiJFBBoA5IYQYMAsIH2lrSBAbasgCJ5AwKfQJI5oFADUHKhzShQkikgEAMkkUIc/zSYBCgJr22gMAkBdEi4N5AkBaLQYBiglAImOgx+JglA+5aQAJIooAkI7EQRokSHsyXxJCf0HhZMwggE7qB+T0pAJqa2hDGgpARWpOMMTEIDSfgPgFLKwBx5xgkYmiR1zMvESUrQiPZpIn1SakAUzreEAcBgJQqQ3+2WsMeTDMGP2CNDB6eUgx1IbQk9GIJLBpHHmnkhJQ0gBPYWwIQsGSAEIqCBGhoQEx20cmShsBpKxJC1210CDpKiwi8bVorDrWQGMrhdHMAgTEiZYJkACEUGXDIH2GEuDox4HqV80Mol0KGaLBkCHyR3CR+Is1JTMCXRlrAIKcyEBJEY4tmwkP+HFVpqBA7ghPSWEAW80aQDRqCCPnk2AEe0zlMwmEEMyFABMMBBDP6siQTOYINWLNR9lPBCG8QgLoLAawaCIAMSHFCBPsBhBfcqqUxnStOa2vSmOM2pTnfK05769KdADapQh0rUohr1qEhNqlKXytSmOvWpUI2qVKdK1apa9apYzapWt8rVrnr1q2ANq1jHStaymvWsaE2rWtfK1ra69a1wjatc50rXutr1rnjNq173yte++vWvgA2sYAdL2MIa9rCITaxiF8vYxjr2sZCNrGQnS9nKWvaymM2sZjfL2c569rOgDa1oR0va0pr2tKhNrWpXy9rWuva1sI2tbGdL29pe2va2uM2tbnfL29769rfADa5wh0vc4hr3uMhNrnKXy9zmOve50I2udKdL3epa97rYza52t8vd7nr3u+ANr3jHS97ymve86E2vetfL3va6973wja9850vf+tr3vmUKCAAh+QQJBACwACwAAAAA9AH0AQAI/wBhCRxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1LtqzZs2jTql3Ltq3bt3Djyp1Lt67du3jz6t3Lt6/fv4ADCx5MuLDhw4gTK17MuLHjx5AjS55MubLly5gza97MubPnz6BDix5NurTp06hTq17NurXr17Bjy55Nu7bt27hz697Nu7fv38CDCx9OvLjx48iTK1/OvLnz59CjS59Ovbr169iza9/Ovbv37+DDi/8fT768+fPo06tfz769+/fw48ufT7++/fv48+vfz7+///8ABijggAQWaOCBCCao4IIMNujggxBGKOGEFFZo4YUYZqjhhhx26OGHIIYo4ogklmjiiSimqOKKLLbo4oswxijjjDTWaOONOOao44489ujjj0AGKeSQRBZp5JFIJqnkkkw26eSTUEYp5ZRUVmnllVhmqeWWXHbp5ZdghinmmGSWaeaZaKap5ppstunmm3DGKeecdNZp55145qnnnnz26eefgAYq6KCEFmrooYgmquiijDbq6KOQRirppJRWaumlmGaq6aacdurpp6CGKuqopJZq6qmopqrqqqy26uqrsMb/KuustNZq66245qrrrrz26uuvwAYr7LDEFmvsscgmq+yyzDbr7LPQRivttNRWa+212Gar7bbcduttkwlkwAQHJKQAQwnfKnTBIC/s0EkcUMQryQFKCMFDAukKZEAZNugBwL8AB/xvHFG0sMG3POgAhcAMM3zAIPhq28AP/jZsccBQRBLCpgnwoMUaJkRhyA8sUEDTFJFcrLLAB8yAKQk6MGAxAwfkEdMIXqysM8B6zFHpGDXIvDIDerDg0hQ576y0HidM2oLQSjOwBgErNWCI0lgDIMAdkSIBddZZNKASDllnHUQHj3pddsAHGIASCZasjbUQV6pBhBkVQPIG1S9h//C13DqcRMDVcivdQwpUElHJ34v8wPdKU/wtNwNhmETDwoUrbYaUHUQgOcCWMMFS0pkDvEjEI71QutICPAClAnGvvMjGKanxeeF0jzRFD6srXfmTOyyNuklr9B7wJiTBYfzONjx5xu0NP4ESAYss/y8DXIuEhPUrI2BykxVHLbZJK3D/Lw4iERCF+RfHsUKTF0BvcSEnhcG+FyJ1IAr7F/vRpPJlq8BJzMA+PYgEBpLgn8Uw0KQYrK0RJyme+RYhEibEQYENi0EDHxhB9lEwJBbEIMM0yKQ5rE2AJnkC+yohkg9gQoQCa0GTmCC/hjXNJERgXw1EsgFKwDBgcHBS+P92xgB0maQI7PuCSAxQgx/+CwpFcNIgahgwJKAkAVQsWxdS50QAUEICT4qA0ioxvpOYgHuLeBxIcuhEHahxSRQYosUWwQGVHCGLSkOhSELwwh+2IUobQAD09FDHlRxgeQz4nkggoIMf6oF2UWpD9QS2iAoMLyUcwKPKGIC+ksABcxhcQ5Ug8IYYOOAFOLjCJVfyBU1aLAsnacD6MLiJIziqEa4UmB7QdpITXFCBVnyUCXL5Lz24DiUQcIACD3CBrrmSATXgZUoe0ETzbcJ/krqCHrK4iD+25A0B4B4UvEmpMwjgdgzYxCMUAJMyCGB5UHAcpj4QhjUcQA+V6IEJhFD/SJnwQIyrq4QVIICtCxgClGs7wA2zlQAiHLJslXjCB7z1ACE8VGeWcEAU89WBEyBhB33EGAIM0YJm5qsgDbgADeYwCAycoRBiUORJZ0rTmtr0pjjNqU53ytOe+vSnQA2qUIdK1KIa9ahITapSl8rUpjr1qVCNqlSnStWqWvWqWM2qVrfK1a569atgDatYx0rWspr1rGhNq1rXyta2uvWtcI2rXOdK17ra9a54zate98rXvvr1r4ANrGAHS9jCGvawiE2sYhfL2MY69rGQjaxkJ0vZylr2spjNrGY3y9nOevazoA2taEdL2tKa9rSoTa1qV8va1rr2tbCNrWxnS9vaXdr2trjNrW53y9ve+va3wA2ucIdL3OIa97jITa5yl8vc5jr3udCNrnSnS93qWve62M2udrfL3e5697vgDa94x0ve8pr3vOhNr3rXy972uve98I2vfOdL3/ra11MBAQAh+QQJBACwACwAAAAA9AH0AQAI/wBhCRxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1LtqzZs2jTql3Ltq3bt3Djyp1Lt67du3jz6t3Lt6/fv4ADCx5MuLDhw4gTK17MuLHjx5AjS55MubLly5gza97MubPnz6BDix5NurTp06hTq17NurXr17Bjy55Nu7bt27hz697Nu7fv38CDCx9OvLjx48iTK1/OvLnz59CjS59Ovbr169iza9/Ovbv37+DDi/8fT768+fPo06tfz769+/fw48ufT7++/fv48+vfz7+///8ABijggAQWaOCBCCao4IIMNujggxBGKOGEFFZo4YUYZqjhhhx26OGHIIYo4ogklmjiiSimqOKKLLbo4oswxijjjDTWaOONOOao44489ujjj0AGKeSQRBZp5JFIJqnkkkw26eSTUEYp5ZRUVmnllVhmqeWWXHbp5ZdghinmmGSWaeaZaKap5ppstunmm3DGKeecdNZp55145qnnnnz26eefgAYq6KCEFmrooYgmquiijDbq6KOQRirppJRWaumlmGaq6aacdurpp6CGKuqopJZq6qmopqrqqqy26uqrsMb/KuustNZq66245qrrrrz26uuvwAYr7LDEFmvsscgmq+yyzDbr7LPQRivttNRWa+212Gar7bbcdosjAQpk8EAHCXjLUAeFaFDAAAC0C8AAHpiAwQjmFiQCHey6q6++AxTQQrne8lBFvvsWrG8PVkCwbQKHEGzww+4ecEe2YiAA8cX7DmCFpwYAXBMNPWAssrsDPIEpBDyYgcUALA+AwAt+lBATDQ6PjPEADlRqgBUhQ4zzAy6l0LPNNg8AyKQs8FG0ECwlUADRUL8rRaSM1HyzCR6f9ELUUfcgs6MaWD1yFQ2gRILYXF+cc6NfoD1yIijVkHbUA3xAJQxW1OBBD1Uk/5ECTFK4PfIAZpj0huBzG/yClAm8YPUAdGTQEgEWJ97uAH+TZIjlUA9Q9pMZPA2xBxyw1ALn7tJBUgOIo66vCk86LbIHQKvkgevv2i0SDbjbrMOTSNgchEoctE60DyOZ0fvIPSjMZAbGv1tESmAsX8VIci8vcu1LEgE1EiklsvwABog0tPYQv9GkDlDzkdL5rnPvkQHR935Ckwd07rxJ9dtML0gKQJ/IuIA//aGkfyP730cCKMCLuaFJdGhfSm63PPl1JAEIRJ0fmnQ6omkgJdnD3QCy5pEMck4ETXpA9AaQg5R8YXkFGEn+Gvgw3TFJAzaDW0p4sLwvjGRrNCwY+f+c1IDKXawHNjwJAeCXOMyNxA9BLFgNoDQF0T2sB+pbSfVcN8WRQC+K+ppAlErQMCEGYQotKQEFLcfCkogPjO+yoJMuAIYq7O0AZlgBTLhgQn2xwSR+6GPUhscoxyXuAOUziRFpOIAsMsoEc+ODHEWiAkEK71EQsAECsSC58AVxABeI1ARW+IJEpuQDTBRhHyaVgbBdbABbmFhLFGFJiP2uUh1wgQl6QLABVEEIY4iJEGopRVNeSgESeAAFCFATMBDTXTX4HLWIQMwBKIGZ1xKDFdOmsW0RAAcZHIAJkqitDiQhlQYbgA5KVy9YEIAGSOCD2CDnAgq08yAKYMIRZnD/AhrcIQP7u6dAB0rQghr0oAhNqEIXytCGOvShEI2oRCdK0Ypa9KIYzahGN8rRjnr0oyANqUhHStKSmvSkKE2pSlfK0pa69KUwjalMZ0rTmtr0pjjNqU53ytOe+vSnQA2qUIdK1KIa9ahITapSl8rUpjr1qVCNqlSnStWqWvWqWM2qVrfK1a569atgDatYx0rWspr1rGhNq1rXyta2uvWtcI2rXOdK17ra9a54zate98rXvvr1r4ANrGAHS9jCGvawiE2sYhfL2MY69rGQjaxkJ0vZylr2spjNrGY3y9nOevazoA2taEdL2tKa9rSoTa1qV8va1rr2tbCNrWxnS9vaGNr2trjNrW53y9ve+va3wA2ucIdL3LcGBAAh+QQJBACwACwAAAAA9AH0AQAI/wBhCRxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1LtqzZs2jTql3Ltq3bt3Djyp1Lt67du3jz6t3Lt6/fv4ADCx5MuLDhw4gTK17MuLHjx5AjS55MubLly5gza97MubPnz6BDix5NurTp06hTq17NurXr17Bjy55Nu7bt27hz697Nu7fv38CDCx9OvLjx48iTK1/OvLnz59CjS59Ovbr169iza9/Ovbv37+DDi/8fT768+fPo06tfz769+/fw48ufT7++/fv48+vfz7+///8ABijggAQWaOCBCCao4IIMNujggxBGKOGEFFZo4YUYZqjhhhx26OGHIIYo4ogklmjiiSimqOKKLLbo4oswxijjjDTWaOONOOao44489ujjj0AGKeSQRBZp5JFIJqnkkkw26eSTUEYp5ZRUVmnllVhmqeWWXHbp5ZdghinmmGSWaeaZaKap5ppstunmm3DGKeecdNZp55145qnnnnz26eefgAYq6KCEFmrooYgmquiijDbq6KOQRirppJRWaumlmGaq6aacdurpp6CGKuqopJZq6qmopqrqqqy26uqrsMb/KuustNZq66245qrrrrz26uuvwAYr7LDEFmvsscgmq+yyzDbr7LPQRivttNRWa+212Gar7bbcduttkxmQcMIZYeRBwwcGfIuQASwc4oEAAMQrLwACRNFCBuoKpAAgHszrr78CKLHCt1rA++/B8wpgyAbbPlCDwQhHHK8HeWR7RL8SZxyvAJNwSoEaXRzBgQQ1DQGxxhkL8AKmTJCBwMkCeHDIETEdcTLKKf9R6QUm3AxwFlK4JAHGOOMsgByTFmz0C+muFEXRUNPLRKQa+JxxFCWohIHVUUccBaR1cJ3xDk2b1ADRXaMsQMVVpgBJIEhoQYJMkIitsSEoCZF21AdQ/3nCywkLgMFLMNitsQBwmAQBAntDLUAXUlaNsAAmENCSEo3Li4DlJB2ROdSHRBl2xiaw9IHhOM9REhKfFy0A502ygLoAWqwERuvx1lAS47ijLMaTBxhd9knB4y6AAiMpgHrvAJzh5AXLxxs0Sg1Ej3IOI4XAPModNzkH1N2f9MH2zovk+fYZK+EkHlA3kpIa29cu0gzoZxyEk7cX7T5KK8Q/0hD1k5gXnHQGqAUiJRfYXhhGQoMARkx9TYJe0cqQkhJYT2M0E0n/HHgwJDyJd4cbnkmK1zoBMEwkG7jg54jwpBnMrg8rmUTvslAStHEwXm+AEiEMN8CVhECFCEMaSf8MccOENSBKL+CaAIIgQpQEoXUeOCJJ8lBEefUwSnl4F8Dk1xIxADFhkDDbF7vmhyqtoA11IAQeeAA7lzhijAC4YknqUEUENBFRmEvbATqAkinAEWdteBQBGqHCA8BAJYG4oR0j9YfoUY6PKkkACNEngD1MqgtZMBwCBuGSHPwxYoiw1BWU4DMB1OAMd0yJ0rYXBAhgygAh2AO5/LCCrM3kjcyrQQKs1YdP0ssEu7zWDGwYNQEcUFsZuMEXDzA9bnXBC9ZDQAva2K0QTEKLk1PCHqiZrymwoA1IsIMSCOEIOIghlflKpzrXyc52uvOd8IynPOdJz3ra8574zKc+98n2z376858ADahAB0rQghr0oAhNqEIXytCGOvShEI2oRCdK0Ypa9KIYzahGN8rRjnr0oyANqUhHStKSmvSkKE2pSlfK0pa69KUwjalMZ0rTmtr0pjjNqU53ytOe+vSnQA2qUIdK1KIa9ahITapSl8rUpjr1qVCNqlSnStWqWvWqWM2qVrfK1a569atgDatYx0rWspr1rGhNq1rXyta2uvWtcI2rXOdK17ra9a54zate98rXvvr1r4ANrGAHS9jCGvawiE2sYhfL2MY69rGQjaxkJ0vZylr2spjNrGY3y9nOevazoA2taEdL2tKa9rSoTa1qV8tasgYEACH5BAkEALAALAAAAAD0AfQBAAj/AGEJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDNr3sy5s+fPoEOLHk26tOnTqFOrXs26tevXsGPLnk27tu3buHPr3s27t+/fwIMLH068uPHjyJMrX868ufPn0KNLn069uvXr2LNr3869u/fv4MOL/x9Pvrz58+jTq1/Pvr379/Djy59Pv779+/jz69/Pv7///wAGKOCABBZo4IEIJqjgggw26OCDEEYo4YQUVmjhhRhmqOGGHHbo4YcghijiiCSWaOKJKKao4oostujiizDGKOOMNNZo44045qjjjjz26OOPQAYp5JBEFmnkkUgmqeSSTDbp5JNQRinllFRWaeWVWGap5ZZcdunll2CGKeaYZJZp5plopqnmmmy26eabcMYp55x01mnnnXjmqeeefPbp55+ABirooIQWauihiCaq6KKMNuroo5BGKumklFZq6aWYZqrpppx26umnoIYq6qiklmrqqaimquqqrLbq6quwxv8q66y01mrrrbjmquuuvPbq66/ABivssMQWa+yxyCar7LLMNuvss9BGK+201FZr7bXYZqvtttx26+23YEIQAhdkKOHFFiho0AIPJYBr0AogIADAvPTWG4ATQxDgbg5bBFDvvwAv0IK3JaDhL8AI20tFEdsWcUDCEP8bgBDZDnFwxBgDEAAIm8JgwQ8gaPDFGSlAMNMJF2eMcQAaXGqAERGkTC8Cj2wAEwcyqxxxAF9UesICGQcQg0sNPKzz0QHMMOkfOSccgAntrqTB0VQDgEADka7RdMRUKKASCVtXnXAFV6bQQgUgTEDCTBWEHfEWKpkgNtUB2DzlzykHEAARMLH/4PbOPZ8Uwt9z/5vElA5sHQAK+rJEgNGFBzDGSWQUTjUCUoLwNwotcWE5vS+cBPTnKgewApRlEB7ABCztQLrGUY8EA+GvAzD0kxHoHIABKm1Ae8YslHRC7Spz7uQYvwNwhUpSEE9GSUIQnzHmTqpA9fMpTUC8EyVNLf3OjTPpA9VpqJQE8VSUdMP3GGPdJA7kq/QF8VmUpAT7EbvPpOdHk52SFcTzQklegD+nhW9JF0ieFFQyA+I9oSSPKCDCqOek0QWNdymZQvIiNoSSKEKCAIPbk2agutupJHekCwAFShICEP4rcE9KHMa4xxI5vO4GJiHABi3XBSlpQHEmOGBK/xIgL8uZ7iRocOG8ApCAKVkAATJbHUxUsMN6OQAlPKhi1VpWpRVYAQQO8AEPhNiSJM4tCxg8CRVcGIAQPIoAThDbAh6gEouBEIeQIsANkkcFOq5EbgUMwBQm1QLVPSGNKvmAFldmhUpR4AtFBFgA1uDGl3BhkRBTAqYIQAIrrMEJW7jBD64QO5jgAJMhRKS0HoFKem2hlNQq5OcCcANVVosDWYgc67gFgRhEsnR2kAC4GiCHLPwNAX+4gLsI8oEzoIEKetPbAdIQAw6QcZkEIcA1scnNbnrzm+AMpzjHSc5ymvOc6EynOtfJzna6853wjKc850nPetrznvjMpz73yeTPfvrznwANqEAHStCCGvSgCE2oQhfK0IY69KEQjahEJ0rRilr0ohjNqEY3ytGOevSjIA2pSEdK0pKa9KQoTalKV8rSlrr0pTCNqUxnStOa2vSmOM2pTnfK05769KdADapQh0rUohr1qEhNqlKXytSmOvWpUI2qVKdK1apa9apYzapWt8rVrnr1q2ANq1jHStaymvWsaE2rWtfK1ra69a1wjatc50rXutr1rnjNq173yte++vWvgA2sYAdL2MIa9rCITaxiF8vYxjr2sZCNrGQnS9nKWvaymM2sZjfL2c569rPZCQgAIfkECQQAsAAsAAAAAPQB9AEACP8AYQkcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gw4odS7as2bNo06pdy7at27dw48qdS7eu3bt48+rdy7ev37+AAwseTLiw4cOIEytezLix48eQI0ueTLmy5cuYM2vezLmz58+gQ4seTbq06dOoU6tezbq169ewY8ueTbu27du4c+vezbu379/AgwsfTry48ePIkytfzry58+fQo0ufTr269evYs2vfzr279+/gw4v/H0++vPnz6NOrX8++vfv38OPLn0+/vv37+PPr38+/v///AAYo4IAEFmjggQgmqOCCDDbo4IMQRijhhBRWaOGFGGao4YYcdujhhyCGKOKIJJZo4okopqjiiiy26OKLMMYo44w01mjjjTjmqOOOPPbo449ABinkkEQWaeSRSCap5JJMNunkk1BGKeWUVFZp5ZVYZqnlllx26eWXYIYp5phklmnmmWimqeaabLbp5ptwxinnnHTWaeedeOap55589unnn4AGKuighBZq6KGIJqrooow26uijkEYq6aSUVmrppZhmqummnHbq6aeghirqqKSWauqpqKaq6qqsturqq7DG/yrrrLTWauutuOaq66689urrr8AGK+ywxBZr7LHIJqvsssw26+yz0EYr7bTUVmvttdhmq+223Hbr7bdkGqCAAg2Ay9AKVpiAQAAAABBAADtUcEW55gpUQgwHsNvuvvy6q8EI5k6AQL8E9xvAGht0e8EO+hbscLsBqLDtCQ0/bHEAT2TrRsUWX7yGphK4oMQC7yLgRAwhzDQDxx1f7MClF9zAMsRRiADTBwO3rDPELVTqw8wGv2CAS03sbLS7TExqB9AF70ABSy0wfTTBTmCZQgsVgDABCTStIXXT9KKUQM5T6xyAFFWeQDK/7xIRUwxfO3yDSnKUfXQUVDoAdAAoEP/gEgxxOxyAHylFYLfRAVwgJQhfo+DSC4e3GwFKIwQeOQB4RFlG3AFMwBIFlgt+xElEXL7zDlEabvbQKiliOgAvm3TD6y0HkMCTY4R+xUqQm77ASQfQ3vIHT6pwNBkrUfF6AGGLBEHolxfxpA9Hp7HSArQnTJIBwre8u5M4VL8S2ZdrPxL33VuMtpNcHF3BSqpfznxJz6f/8BtPXhD6+inZ8frvJiGf/fgFsCdhb3UrccPrPmYSFAyQYAEoAZRWVrsYsEQC0CsYC04Sgwf2a3JR0lvHqtYSJVxuAX4zCQc8yK/3SUkDezNBClkSggzuKwAuQAkEBGi/AHBtShZYl8H/PAeTL9gQACRESRJYCIADXAldIHCAD3gwQ5g4cGoHeFpKNnDEnbkhUgYwwdEOQLyVVMCDEaiioyDwBM6hQIsrScAB0xeA703qDVvY2wEk9hIRdPFhGbuUGh7BMIgdAASjk4kQ/kg1CGyKAA0ogRplQgZG7qsJzaPWDxgZABNkslp+4OHOAuDCbW1gaUcLQBYS6a0VyKx2WVBEvQSyAReg4F0G28EPUjDLg2wgBBwoghoewLpeGvOYyEymMpfJzGY685nQjKY0p0nNalrzmtjMpja3yc1uevOb4AynOMdJznKa85zoTKc618nOdrrznfCMpzznSc962vOe+MynPvfJxs9++vOfAA2oQAdK0IIa9KAITahCF8rQhjr0oRCNqEQnStGKWvSiGM2oRjfK0Y569KMgDalIR0rSkpr0pChNqUpXytKWuvSlMI2pTGdK05ra9KY4zalOd8rTnvr0p0ANqlCHStSiGvWoSE2qUpfK1KY69alQjapUp0rVqlr1qljNqla3ytWuevWrYA2rWMdK1rKa9axoTata18rWtrr1rXCNq1znSte62vWueM2rXvfK17769a+ADaxgB0vYwhr2sIhN7DoDAgAh+QQJBACwACwAAAAA9AH0AQAI/wBhCRxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1LtqzZs2jTql3Ltq3bt3Djyp1Lt67du3jz6t3Lt6/fv4ADCx5MuLDhw4gTK17MuLHjx5AjS55MubLly5gza97MubPnz6BDix5NurTp06hTq17NurXr17Bjy55Nu7bt27hz697Nu7fv38CDCx9OvLjx48iTK1/OvLnz59CjS59Ovbr169iza9/Ovbv37+DDi/8fT768+fPo06tfz769+/fw48ufT7++/fv48+vfz7+///8ABijggAQWaOCBCCao4IIMNujggxBGKOGEFFZo4YUYZqjhhhx26OGHIIYo4ogklmjiiSimqOKKLLbo4oswxijjjDTWaOONOOao44489ujjj0AGKeSQRBZp5JFIJqnkkkw26eSTUEYp5ZRUVmnllVhmqeWWXHbp5ZdghinmmGSWaeaZaKap5ppstunmm3DGKeecdNZp55145qnnnnz26eefgAYq6KCEFmrooYgmquiijDbq6KOQRirppJRWaumlmGaq6aacdurpp6CGKuqopJZq6qmopqrqqqy26uqrsMb/KuustNZq66245qrrrrz26uuvwAYr7LDEFmvsscgmq+yyzDbr7LPQRivttNRWa+212Gar7bbcduvtt+Da2cAINAxhgRQcbBAuQmOAgcUAAMQr7wAeaJDDugK9sQW88vbb7wAIuABuB5Hw6+/B8x7AQ7c09IDww/4OAMi2LhgM8cUD2NCpAR+scMcFJdhU8cUkzxtJpgQosu+/WEyggEwiWFwyxk9caoEHGPsAkwI4z+zzAENUyobMCA9QQwcuHeLz0gB40ACWYkzwhANWFFGTCURDjAAFLK2QNdMPM2LlEB5YPMAAcsj0wtcQVwHBSnSAvfQAL0+59sMDBEHASyew/32xGSo94Lfc/hIxpQaDB/ESH4QDMMADKU3QuM9VSMnC4I5b0VIhmEMMOEo1TD7zAEhDicDPBrAU9+Q9oGRA56KLAOUFsAMgxUoQ1F70BydNIbrPLUDJBdOBrJTB7wDQcNIdyJdc85NgMG3CShcgr8JJIjRPMhtQAiL9SiNYfxIN2l98CJRuMP18Ssf/frtJRZQPMRKz187CSgTojvAFJ40h/8Oag1LPSjaABLAkCKLrwdtM0gD9ye1+UOIcAYXQEkWIjn4oOcD/Iga5KN3tYolwiQEcRrgB8A8l3tugvPhApaHhbQupcwkXHAgAB6iECTT0GRiqpIgeyGwAAYSJEv/kVgADqqQKKnRcB6vEgT5o4AVg6MLeZGKA0C3NA7xbyeVUuIZJJYAOnTsADFyyhQ0+rlITICHenhDDltBOfkC8VAmsUACz9cAMU5AJEXKIMB1sigJ3kMIM3rDEmZiBj/2qghGt9QREAqAKdcNWDHI4AB0sMlskOID+BjABcAligCQbgAYysC4CnCAIXxvAASagLnwNxABqUIQPzPCEH7iAB1xzpS53ycte+vKXwAymMIdJzGIa85jITKYyl8nMZjrzmdCMpjSnSc1qWvOa2MymNrfJzW5685vgDKc4x0nOcprznOhMpzrXyc52uvOd8IynPOdJz3ra8574zKc+98m3z376858ADahAB0rQghr0oAhNqEIXytCGOvShEI2oRCdK0Ypa9KIYzahGN8rRjnr0oyANqUhHStKSmvSkKE2pSlfK0pa69KUwjalMZ0rTmtr0pjjNqU53ytOe+vSnQA2qUIdK1KIa9ahITapSl8rUpjr1qVCNqlSnStWqWvWqWM2qVrfK1a569atgDatYx0rWspr1rGhNq1rXyta2uvWtcI2rXOdK17ra9a54zate98rXvvq1SgEBACH5BAkEALAALAAAAAD0AfQBAAj/AGEJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDNr3sy5s+fPoEOLHk26tOnTqFOrXs26tevXsGPLnk27tu3buHPr3s27t+/fwIMLH068uPHjyJMrX868ufPn0KNLn069uvXr2LNr3869u/fv4MOL/x9Pvrz58+jTq1/Pvr379/Djy59Pv779+/jz69/Pv7///wAGKOCABBZo4IEIJqjgggw26OCDEEYo4YQUVmjhhRhmqOGGHHbo4YcghijiiCSWaOKJKKao4oostujiizDGKOOMNNZo44045qjjjjz26OOPQAYp5JBEFmnkkUgmqeSSTDbp5JNQRinllFRWaeWVWGap5ZZcdunll2CGKeaYZJZp5plopqnmmmy26eabcMYp55x01mnnnXjmqeeefPbp55+ABirooIQWauihiCaq6KKMNuroo5BGKumklFZq6aWYZqrpppx26umnoIYq6qiklmrqqaimquqqrLbq6quwxv8q66y01mrrrbjmquuuvPbq66/ABivssMQWa+yxyCar7LLMNuvss9BGK+201FZr7bXYZqvtttx26+234IaLKAVSaFGHDTqwAYgFH4hbUAJnNFEAAPTWS28BCwAyhbgQaLGAvQADXIAGG3ybAhUBJyxwGN1yMa/CEN9bx7aCPBxxxAXYwGkCOWDwiCNaSEFBTXBYfDHGbGQ6hgYm34vCGzKF0PLJEBegxaWAzGxvAWskAFMTNAcNQAEjZJmCHGY8IcgdNRGgg84BUyGBSxhALXTAdFxZCBYmF1CAETMpcTUVJbBEwL9X01wAzFQiAXUBOhAAEw5WKxwJS3mkLfTdUyL/UjcAOrwEw98JF8DCSkHoHXQBHUgpBeEFCOISIooD0IRKJRBeOQB7SImw2gawZIDmhY+R0hub01xBlGOQDgANLK2QOsMohZH6yVtECcfVjLC0++ZIpMTI7RcvEGUfVyvBkhapB45SHcRjHCUeybPURvMpaRB9zRBAOcfVZrDEReoTo2TG9gobD2XrQkvB0h2pE5GSHOgnfHmUWCwe+koJuC5wCCkRQf0CVj4o7QFybXCJ9hRHBZVQwH9pU8SU3HaxrLnkAhAcmgVW8rkBDm1qU6rD21Agt5ecL20WVAkRPEivIFjJDwtoWeRkAgEnXA0LBVuJAjJ4sgIUAksr0AIi/5DQhxyUUCYNSBzNInABlzzCgw2kFAH8hjEdjMwlCcgf+grQhUtx4GkBK0AiOheTx6EvEJraQCEAoQE2MAIO7aIJGHgYsCAcsVpPoGO9alC2bDlCj07oo7YUgbarFaAC3esWBdhAugI0gW3gugAiClk4FMDOXQIxQBH6YAMqYGEBEaCDGfZwRUya8pSoTKUqV8nKVrrylbCMpSxnScta2vKWuMylLnfJy1768pfADKYwh0nMYhrzmMhMpjKXycxmOvOZ0IymNKdJzWpa85rYzKY2t8nNbnrzm+AMpzjHSc5ymvOc6EynOtfJzna6853wjKc850nPetrznvjMpz73yZ3PfvrznwANqEAHStCCGvSgCE2oQhfK0IY69KEQjahEJ0rRilr0ohjNqEY3ytGOevSjIA2pSEdK0pKa9KQoTalKV8rSlrr0pTCNqUxnStOa2vSmOM2pTnfK05769KdADapQh0rUohr1qEhNqlKXytSmOvWpUI2qVKdK1apa9apYzapWt8rVrnr1q2ANq1jHStaymvWsaE2rWtfamYAAACH5BAkEALAALAAAAAD0AfQBAAj/AGEJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDNr3sy5s+fPoEOLHk26tOnTqFOrXs26tevXsGPLnk27tu3buHPr3s27t+/fwIMLH068uPHjyJMrX868ufPn0KNLn069uvXr2LNr3869u/fv4MOL/x9Pvrz58+jTq1/Pvr379/Djy59Pv779+/jz69/Pv7///wAGKOCABBZo4IEIJqjgggw26OCDEEYo4YQUVmjhhRhmqOGGHHbo4YcghijiiCSWaOKJKKao4oostujiizDGKOOMNNZo44045qjjjjz26OOPQAYp5JBEFmnkkUgmqeSSTDbp5JNQRinllFRWaeWVWGap5ZZcdunll2CGKeaYZJZp5plopqnmmmy26eabcMYp55x01mnnnXjmqeeefPbp55+ABirooIQWauihiCaq6KKMNuroo5BGKumklFZq6aWYZqrpppx26umnoIYq6qiklmrqqaimquqqrLbq6quwxv8q66y01mrrrbjmquuuvPbq66/ABivssMQWa+yxyCar7LLMNuvss9BGK+201FZr7bXYZqvtttx26+234Ia7KAQGJECAuApRYMELEQQAAAABLJAGBhegO9AKN7j77r78BrCDBeJuYIe+/Ba8bwBU5PDtCQgY7HDBAXzR7QQEP2xxADacy2kDIRwhwgoU3ESxxSTze8OmQzRRcbwYJDATCxWXfPETmBZxQMz9qhATBQvI7DO8J2iZQgsVgDABCTaNXHIAIMCExs8/L+CylScssHIARMzUAs4PB+CASyFwDbXDMVjpgNgBoKCxSxyI3bURLa0x9s8IrB0lCG6/iwJMEcz/Da8CK5WQt9/7SjFlGYPDO4FLMBOexEplEO7zC1P27XMABrTkhOQBrFSB5DIjIOUYie97BUsGlO5wAPWmFAXoSwMOpQpjk8ESDLDPoFLDsJPc+pM+jJ0GSxzA7oJKqhOuRpQ4CE887HCjBEHyfq8QJRdjV8DSB7AHnRL1c48Q5QXJG75SAuAfLH5KO/R+cchR9nx55iy9TnjnKjng/sOiSzlD4gEoW0uGkD4AaE8lFtifw042pbOVzAkwkd/YArCBlWyggDJTRJU0gDYT2I0lXaBeAFuCAgX2qwRWsgACYhaAxckEB6rDmEt4gEGL2Q5LK7ACCBzgAx58ECY/AKAd/2BiAhMCAAEVrBQLeNc1F75kBDWEWAswRQAMWK1fAfhBB2YihyjuSwmcykAOLGABEcDgJn/w4g4aoC28gW4HW9yWD9IXgBtMjVsk2EHyEJC1cKmgXSVDQBLiiC4OfCELK0OABmZAP3sRxAAZ+MAFHsBGR1rykpjMpCY3yclOevKToAylKEdJylKa8pSoTKUqV8nKVrrylbCMpSxnScta2vKWuMylLnfJy1768pfADKYwh0nMYhrzmMhMpjKXycxmOvOZ0IymNKdJzWpa85rYzKY2t8nNbnrzm+AMpzjHSc5ymvOc6EynOtfJzna6853wjKc850nPetrznvjMpz73yYXPfvrznwANqEAHStCCGvSgCE2oQhfK0IY69KEQjahEJ0rRilr0ohjNqEY3ytGOevSjIA2pSEdK0pKa9KQoTalKV8rSlrr0pTCNqUxnStOa2vSmOM2pTnfK05769KdADapQh0rUohr1qEhNqlKXytSmOvWpUI2qVKdK1apa9apYzapWaxoQACH5BAkEALAALAAAAAD0AfQBAAj/AGEJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDNr3sy5s+fPoEOLHk26tOnTqFOrXs26tevXsGPLnk27tu3buHPr3s27t+/fwIMLH068uPHjyJMrX868ufPn0KNLn069uvXr2LNr3869u/fv4MOL/x9Pvrz58+jTq1/Pvr379/Djy59Pv779+/jz69/Pv7///wAGKOCABBZo4IEIJqjgggw26OCDEEYo4YQUVmjhhRhmqOGGHHbo4YcghijiiCSWaOKJKKao4oostujiizDGKOOMNNZo44045qjjjjz26OOPQAYp5JBEFmnkkUgmqeSSTDbp5JNQRinllFRWaeWVWGap5ZZcdunll2CGKeaYZJZp5plopqnmmmy26eabcMYp55x01mnnnXjmqeeefPbp55+ABirooIQWauihiCaq6KKMNuroo5BGKumklFZq6aWYZqrpppx26umnoIYq6qiklmrqqaimquqqrLbq6quwxv8q66y01mrrrbjmquuuvPbq66/ABivssMQWa+yxyCar7LLMNuvss9BGK+201FZr7bXYZqvtttx26+234IYr7qYQSHAHDVe88YEB4xpkwB5KeADAvPQKEAUGFLQLgRby0uuvvwLUsUG4JBzw78H/eoDBt5AIgPDD9R4CgacNhHAEDSvkexMYDkPsMQAmELCpHzt0PK8ACMiRAE0tmPwxxDdkWgQCLv8rwBwycVDzywgLIMSWKUASCBJakGCTFjsfHHBMWfDMswAXYHkCzQALsLBMDTstACEvEZG00webcKUGXwsQMkw6gw2AAES0BAECar8sQAhV1vE1vWK/ZHDcAij/wBINcfOMCJUs3F2vFi7tYTjEjrD0QuAve0Dl3nKzy5IXkK/NUr+ZPwy1lBcs7q8ULBkguudRp6TA6YHvIeUcak/C0gedAzCDSkzU7jHiUeKhdiMscVD7ICrdoTvEgEgJxu8sGd952ymRcPzDjUd5htqBzF77CSqFMD3CbYDOOgBlsJTA+DYzodIG6IM9xJRwP235SjVkLsDm3/9Lt5QziC5AHy7xQ/vmlb2VKCF/9RLZlAixOC/AJH5qE8DAVjIEBM7rEFZ6QdmCML+WHAF9/2uJATg3PQHk4Ep58EDNBMC7mHBMazFzyfLyVwMtraANdSAEHnigwJkAwn+GgEkC/yCoOxNeag8kVFoLX9K/6SEhUwaQA9XqJYAkdIAmkxjgv6LQw0xlIAd5yAMNYIATNmhxXgfw27YQocUoqJFbZ0jixwSAiIl9iwIMlFsU7tAuCQjhADsTgAfqsIJ2FWQDOZgDJLQQhit8wJCQjKQkJ0nJSlrykpjMpCY3yclOevKToAylKEdJylKa8pSoTKUqV8nKVrrylbCMpSxnScta2vKWuMylLnfJy1768pfADKYwh0nMYhrzmMhMpjKXycxmOvOZ0IymNKdJzWpa85rYzKY2t8nNbnrzm+AMpzjHSc5ymvOc6EynOtfJzna6853wjKc850nPetrznvjMpz73yX7PfvrznwANqEAHStCCGvSgCE2oQhfK0IY69KEQjahEJ0rRilr0ohjNqEY3ytGOevSjIA2pSEdK0pKa9KQoTalKV8rSlrr0pTCNqUxnStOa2vSmOM2pTnfK05769KdADapQh0rUohr1qEhNqlKXytSmOvWpUI2qVKdK1ao6KyAAIfkECQQAsAAsAAAAAPQB9AEACP8AYQkcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gw4odS7as2bNo06pdy7at27dw48qdS7eu3bt48+rdy7ev37+AAwseTLiw4cOIEytezLix48eQI0ueTLmy5cuYM2vezLmz58+gQ4seTbq06dOoU6tezbq169ewY8ueTbu27du4c+vezbu379/AgwsfTry48ePIkytfzry58+fQo0ufTr269evYs2vfzr279+/gw4v/H0++vPnz6NOrX8++vfv38OPLn0+/vv37+PPr38+/v///AAYo4IAEFmjggQgmqOCCDDbo4IMQRijhhBRWaOGFGGao4YYcdujhhyCGKOKIJJZo4okopqjiiiy26OKLMMYo44w01mjjjTjmqOOOPPbo449ABinkkEQWaeSRSCap5JJMNunkk1BGKeWUVFZp5ZVYZqnlllx26eWXYIYp5phklmnmmWimqeaabLbp5ptwxinnnHTWaeedeOap55589unnn4AGKuighBZq6KGIJqrooow26uijkEYq6aSUVmrppZhmqummnHbq6aeghirqqKSWauqpqKaq6qqsturqq7DG/yrrrLTWauutuOaq66689urrr8AGK+ywxBZr7LHIJqvsssw26+yz0EYr7bTUVmvttdhmq+223Hbr7bfghivuuKsSIMYZjtTBRgUY8FACuQSFgEgBANRrb70F6CAFuRLYQO+9AONbwxvhwvFvwAgDUIAZoDYQQhciqNFBTjgcnDDC+RrA6QmJWFwAFkQkUBMeFl+csA4QZFpEBCXfWwAcM1nQsskII8FlCnKY8YQgd9gkyMwAF4BITBQsQPPRCheSZSFYeFyAETPJAXTABdj8EhtIIx0BAVciAXS+XL/EwdQYD+LSGGRnba/ZVc5Lsw4wUaG2vQUo0JIZcx9NRZVSpP+tsCAuleE3woC0ZHTeJhcwApVyI12AxizRgTi+LF0w+NxETIm22jSwZMDlVI+xUiGT08zGlHDMzQhLMJRe7x4rteH6xTVM2cfcSrDEwexhrMTI7AljMSUeuOs+O9sp/Q58wMJLOcfcDK/0wexKq3T78gDvLeXmWe+7UgKgB724SnlgD7ANVGKR9eMtbVF6ASylYP69WlC5h98FtOHSCeHbG71KBOgfzQqghip5jWZ0gIn68laADbREA/MDQPOqVIevoSBsLulC+PLnkhUI8GJ9wJIfFlCyAgBOJiRb3yFgggLzLeBdWVqBFhCBhD7kAIMyqdjRCrCGmFhueU/DVBn/DpcwE87kZ8CLhKYIQISmuawAYJgYTSrouiY0oFMZeIMf/CACGOREAx9sAgW8lUK1FcAGIvtWEZowOCycgVx7CMLXqCCINMIrA0MwAwqaUIMgICEM44OXIAdJyEIa8pCITKQiF8nIRjrykZCMpCQnSclKWvKSmMykJjfJyU568pOgDKUoR0nKUprylKhMpSpXycpWuvKVsIylLGdJy1ra8pa4zKUud8nLXvryl8AMpjCHScxiGvOYyEymMpfJzGY685nQjKY0p0nNalrzmtjMpja3yc1uevOb4AynOMdJznKa85zoTKc618nOdrrznfCMpzznSc962vOe+MynPvfJbc9++vOfAA2oQAdK0IIa9KAITahCF8rQhjr0oRCNqEQnStGKWvSiGM2oRjfK0Y569KMgDalIR0rSkpr0pChNqUpXytKWuvSlMI2pTGdK05ra9KY4zalOd8rTnvr0p0ANqlCHStSiGvWoSJ1QQAAAIfkECQQAsAAsAAAAAPQB9AEACP8AYQkcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gw4odS7as2bNo06pdy7at27dw48qdS7eu3bt48+rdy7ev37+AAwseTLiw4cOIEytezLix48eQI0ueTLmy5cuYM2vezLmz58+gQ4seTbq06dOoU6tezbq169ewY8ueTbu27du4c+vezbu379/AgwsfTry48ePIkytfzry58+fQo0ufTr269evYs2vfzr279+/gw4v/H0++vPnz6NOrX8++vfv38OPLn0+/vv37+PPr38+/v///AAYo4IAEFmjggQgmqOCCDDbo4IMQRijhhBRWaOGFGGao4YYcdujhhyCGKOKIJJZo4okopqjiiiy26OKLMMYo44w01mjjjTjmqOOOPPbo449ABinkkEQWaeSRSCap5JJMNunkk1BGKeWUVFZp5ZVYZqnlllx26eWXYIYp5phklmnmmWimqeaabLbp5ptwxinnnHTWaeedeOap55589unnn4AGKuighBZq6KGIJqrooow26uijkEYq6aSUVmrppZhmqummnHbq6aeghirqqKSWauqpqKaq6qqsturqq7DG/yrrrLTWauutuOaq66689urrr8AGK+ywxBZr7LHIJqvsssw26+yz0EYr7bTUVmvttdhmq+223Hbr7bfghivuuK9CQAC5CnGAhxcIBODuDn9IYQC6sBBgxAEBAKDvvvsGQAYF43YRAb8EE4yAHKE2EMIRIqwAcE4+5FvwxPoGcMO5nA7RhMQVL4BBAjZVwDHFFHsxb6ZF4EtyACrQJMTIJFOcRpcptFABCBOQYNMEME8cAAgyvdFzzAUH4IOWJywwsrtEzNTC0D47EFMWRFcNQAAfYOkA1AGggLFLHEBNcQBGvMSF2Fbva8eVIKANAAowDZx2vwq4RPXcMQcgQZVluP999QQuseD3xEm0FMLgabdQpdxVB3DySk7gzW8ALU0gOdFeUDkG4gBcwZIBnBMcwAUs3XB53l9DqQLeZLAEw+n7zsAS47AX/HCUPuA980oc1A6ACywh4PvEU0yJg+4s9V572SsJPzzBMEzJBd4VsPSB7yewtMDzBG8w5QWcS8FSAqFPPgJLKHDfb+pQbm+14y1FATvlLAmhvr5NVDmD3wHE4NIQ5dNX9ZIXQJIJwUpbI5oTYOI+vAXAey1p4PCwdiUNcM0E7FtJF0LXv5dYjntww5IF2iU6wMkEB4gLgA1gYgAJzm8FW1qBFUDgAB/wIIMv+QH/1haTExSQX0/IFAv/nDc2E8rkDz8EQBNwOCkCYEBpkwvADzpgExsUMAK321QGcmABC4ggejlJIN6iQMVvuYGIRAtABZiorQ6QAW0WSwG9GpAHO0DxaghwQgseQC+DNIACFChBHwdJyEIa8pCITKQiF8nIRjrykZCMpCQnSclKWvKSmMykJjfJyU568pOgDKUoR0nKUprylKhMpSpXycpWuvKVsIylLGdJy1ra8pa4zKUud8nLXvryl8AMpjCHScxiGvOYyEymMpfJzGY685nQjKY0p0nNalrzmtjMpja3yc1uevOb4AynOMdJznKa85zoTKc618nOdrrznfCMpzznSc962vOe+MynPvfJbc9++vOfAA2oQAdK0IIa9KAITahCF8rQhjr0oRCNqEQnStGKWvSiGM2oRjfK0Y569KMgDalIR0rSkpr0pChNqUpXytKWuvSlMI2pTGdK05ra9KY4zalOd8rTnvr0p0ANqlCHStSiGvWoSI1mQAAAIfkECQQAsAAsAAAAAPQB9AEACP8AYQkcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gw4odS7as2bNo06pdy7at27dw48qdS7eu3bt48+rdy7ev37+AAwseTLiw4cOIEytezLix48eQI0ueTLmy5cuYM2vezLmz58+gQ4seTbq06dOoU6tezbq169ewY8ueTbu27du4c+vezbu379/AgwsfTry48ePIkytfzry58+fQo0ufTr269evYs2vfzr279+/gw4v/H0++vPnz6NOrX8++vfv38OPLn0+/vv37+PPr38+/v///AAYo4IAEFmjggQgmqOCCDDbo4IMQRijhhBRWaOGFGGao4YYcdujhhyCGKOKIJJZo4okopqjiiiy26OKLMMYo44w01mjjjTjmqOOOPPbo449ABinkkEQWaeSRSCap5JJMNunkk1BGKeWUVFZp5ZVYZqnlllx26eWXYIYp5phklmnmmWimqeaabLbp5ptwxinnnHTWaeedeOap55589unnn4AGKuighBZq6KGIJqrooow26uijkEYq6aSUVmrppZhmqummnHbq6aeghirqqKSWauqpqKaq6qqsturqq7DG/yrrrLTWauutuOaq66689urrr8AGK+ywxBZr7LHIJqvsssw26+yz0EYr7bTUVmvttdhmq+223Hbr7bfghivuuOT2WsIIdxQRAgXlGvQBIAcIAMC8AAjgQR0ktPuAIfLS6++8AuyQg6gNhHAEDSuwqxMR/f7rcL0gQOCpHzs0XC8CciRw0x8WP+xwEA1sWgQCHfsrwBw1BVKyx/9GQUCXKUASCBJa5FuTFiv/K0AdM4WRM8v+vrDlCSSbLAAGM0Hys86ExJTB0kADXEiWGuQsgAkvv8QB1DoTARMaUYcNwAFY1gG1CTAdILbOCrgkAddhCzCElSxwLYAWLu0Bt8OOuP+kxdphe2Gl2mILYEBLXgCus0s7KA60ACFPecHeAEjBkgGU63zB5ZlHvQKVcyg+CUsfOP7vDCw9YDrQeVCJh+KNsMTB6vQOwhITtHvs9ZRgwM7SHbkDsLtKIQTvMNJTnqF4IKQHfwJLMBj/LxxUTg54GSwl0Dm9AjCR/fYs2zwlAmsb3lINtAvgUhbSA9w2lTPY3YdLfoDPfEuAtA/ADlcSArXgLyGf4wSwAZdYT3pnwNILrBaEw73kCJkTwPxeogPpIcCBV8qDBzp2t5mAYW8CuEFMDpi+MHBpBW2oAyHwwIOszQQQdjPETHwAvnnFLlN78MDj8EYTO4DvACXYlAH/5FA07gkgCR24Cb8cl4UMfCoDOchDHmgAg504AoRKCGK47lADqCEAZeXKwSF0qDMv5MGF7SLAB2iQBziwIASRa5cc50jHOtrxjnjMox73yMc++vGPgAykIAdJyEIa8pCITKQiF8nIRjrykZCMpCQnSclKWvKSmMykJjfJyU568pOgDKUoR0nKUprylKhMpSpXycpWuvKVsIylLGdJy1ra8pa4zKUud8nLXvryl8AMpjCHScxiGvOYyEymMpfJzGY685nQjKY0p0nNalrzmtjMpja3yc1uevOb4AynOMdJznKa85zoTKc618nOdrrznfCMpzznSc962vOe+MynPvfJV89++vOfAA2oQAdK0IIa9KAITahCF8rQhjr0oRCNqEQnStGKWvSiGM2oRjfK0Y569KMgDalIR0rSkpr0pChNqUpXytKWuvSlMI2pTGdK05ra9KY4XWZAAAAh+QQFBACwACwAAAAA9AH0AQAI/wBhCRxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1LtqzZs2jTql3Ltq3bt3Djyp1Lt67du3jz6t3Lt6/fv4ADCx5MuLDhw4gTK17MuLHjx5AjS55MubLly5gza97MubPnz6BDix5NurTp06hTq17NurXr17Bjy55Nu7bt27hz697Nu7fv38CDCx9OvLjx48iTK1/OvLnz59CjS59Ovbr169iza9/Ovbv37+DDi/8fT768+fPo06tfz769+/fw48ufT7++/fv48+vfz7+///8ABijggAQWaOCBCCao4IIMNujggxBGKOGEFFZo4YUYZqjhhhx26OGHIIYo4ogklmjiiSimqOKKLLbo4oswxijjjDTWaOONOOao44489ujjj0AGKeSQRBZp5JFIJqnkkkw26eSTUEYp5ZRUVmnllVhmqeWWXHbp5ZdghinmmGSWaeaZaKap5ppstunmm3DGKeecdNZp55145qnnnnz26eefgAYq6KCEFmrooYgmquiijDbq6KOQRirppJRWaumlmGaq6aacdurpp6CGKuqopJZq6qmopqrqqqy26uqrsMb/KuustNZq66245qrrrrz26uuvwAYr7LDEFmvsscgmq+yyzDbr7LPQRivttNRWa+212Gar7bbcduvtt+CGK+645P6aQAMElIsQCV8gEEAAALyrAQsGqAuLCu4CoO+++wbwQ72hNhDCESKsQMFODzQBL78M93vFp0MozG8AC2CQwE0iLNzwxvEKwWkRB2jccAAq1JQxxyjH64OXKbRQAQgTkGDTBCJzHAAIM0lQc8oMB3DClicsIPK7RMzUws42OyDTFjzzHIACWTqAdLwopPsSB1PbbARMFmTdtL4aYAmC1wCgAFMEX/cMtUtop41yAAdXWQbZ8U7gEgt0b5yES2rk/910C1a23XQAAK/khNs9uyQE4ilnUeUYfgPw8EoGRN7zBS3twPjbVkupAuJksATD5vzO0JLlPEtApQ+Ip8ESB6Tv6wJLEKCe8ghU4tD667Hru/VKBNiOMhNUcoF4BSx90DsAP7MkPMeqT3lB5FKwlMDzAeDOkuDLx3sxlQukTXhLUcQegEtJdL/vAVbOQHcAMbg0hPDIt0TC8wzHb6XUPDsBU/iMC8AGXoIA9QVgCljSwNQCYILOtaQLloMfTFyAP33dQEsWyNfE7CYTHPgtADaQCfc2F4AHcGkFVgCBA3zAAwfG5Afvs8NMUoA9DGiKBQV8GwdnogLbBeAJnCIABv+ENjF/deAmbojgH0CVgRxYwAIigMFOSJDDwc1OXATwYMoCgIYMqMsAFkDBu/q1AwwM0F4EUYAEHtABCKDxjXCMoxznSMc62vGOeMyjHvfIxz768Y+ADKQgB0nIQhrykIhMpCIXychGOvKRkIykJCdJyUpa8pKYzKQmN8nJTnryk6AMpShHScpSmvKUqEylKlfJyla68pWwjKUsZ0nLWtrylrjMpS53ycte+vKXwAymMIdJzGIa85jITKYyl8nMZjrzmdCMpjSnSc1qWvOa2MymNrfJzW5685vgDKc4x0nOcprznOhMpzrXyc52uvOd8IynPOdJz3ra8574zKc+98lSz376858ADahAB0rQghr0oAhNqEIXytCGOvShEI2oRCdK0Ypa9KIYzahGN8rRjnr0oyANqUhHStKSmvSkKE2pSlfK0pa69KUwjalMZ0rTms4mIAAh+QQFBACwACwAAAAAAQABAAAIBABhBQQAIfkEBQQAsAAsAAAAAAEAAQAACAQAYQUEACH5BAUEALAALAAAAAABAAEAAAgEAGEFBAAh+QQFBACwACwAAAAAAQABAAAIBABhBQQAIfkEBQQAsAAsAAAAAAEAAQAACAQAYQUEACH5BAUEALAALAAAAAABAAEAAAgEAGEFBAAh+QQFBACwACwAAAAAAQABAAAIBABhBQQAIfkEBQQAsAAsAAAAAAEAAQAACAQAYQUEACH5BAUEALAALAAAAAABAAEAAAgEAGEFBAA7"};return f&&(d!==f.failurelimit&&(f.failure_limit=f.failurelimit,delete f.failurelimit),d!==f.effectspeed&&(f.effect_speed=f.effectspeed,delete f.effectspeed),a.extend(j,f)),h=j.container===d||j.container===b?e:a(j.container),0===j.event.indexOf("scroll")&&h.bind(j.event,function(){return g()}),this.each(function(){var b=this,c=a(b);b.loaded=!1,(c.attr("src")===d||c.attr("src")===!1)&&c.is("img")&&c.attr("src",j.placeholder),c.one("appear",function(){if(!this.loaded){if(j.appear){var d=i.length;j.appear.call(b,d,j)}a("<img />").bind("load",function(){var d=c.attr("data-"+j.data_attribute);c.hide(),c.is("img")?c.attr("src",d):c.css("background-image","url('"+d+"')"),c[j.effect](j.effect_speed),b.loaded=!0;var e=a.grep(i,function(a){return!a.loaded});if(i=a(e),j.load){var f=i.length;j.load.call(b,f,j)}}).attr("src",c.attr("data-"+j.data_attribute))}}),0!==j.event.indexOf("scroll")&&c.bind(j.event,function(){b.loaded||c.trigger("appear")})}),e.bind("resize",function(){g()}),/(?:iphone|ipod|ipad).*os 5/gi.test(navigator.appVersion)&&e.bind("pageshow",function(b){b.originalEvent&&b.originalEvent.persisted&&i.each(function(){a(this).trigger("appear")})}),a(c).ready(function(){g()}),this},a.belowthefold=function(c,f){var g;return g=f.container===d||f.container===b?(b.innerHeight?b.innerHeight:e.height())+e.scrollTop():a(f.container).offset().top+a(f.container).height(),g<=a(c).offset().top-f.threshold},a.rightoffold=function(c,f){var g;return g=f.container===d||f.container===b?e.width()+e.scrollLeft():a(f.container).offset().left+a(f.container).width(),g<=a(c).offset().left-f.threshold},a.abovethetop=function(c,f){var g;return g=f.container===d||f.container===b?e.scrollTop():a(f.container).offset().top,g>=a(c).offset().top+f.threshold+a(c).height()},a.leftofbegin=function(c,f){var g;return g=f.container===d||f.container===b?e.scrollLeft():a(f.container).offset().left,g>=a(c).offset().left+f.threshold+a(c).width()},a.inviewport=function(b,c){return!(a.rightoffold(b,c)||a.leftofbegin(b,c)||a.belowthefold(b,c)||a.abovethetop(b,c))},a.extend(a.expr[":"],{"below-the-fold":function(b){return a.belowthefold(b,{threshold:0})},"above-the-top":function(b){return!a.belowthefold(b,{threshold:0})},"right-of-screen":function(b){return a.rightoffold(b,{threshold:0})},"left-of-screen":function(b){return!a.rightoffold(b,{threshold:0})},"in-viewport":function(b){return a.inviewport(b,{threshold:0})},"above-the-fold":function(b){return!a.belowthefold(b,{threshold:0})},"right-of-fold":function(b){return a.rightoffold(b,{threshold:0})},"left-of-fold":function(b){return!a.rightoffold(b,{threshold:0})}})}(jQuery,window,document);
\ No newline at end of file
/* Chosen v1.4.2 | (c) 2011-2015 by Harvest | MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md */
(function(){var a,AbstractChosen,Chosen,SelectParser,b,c={}.hasOwnProperty,d=function(a,b){function d(){this.constructor=a}for(var e in b)c.call(b,e)&&(a[e]=b[e]);return d.prototype=b.prototype,a.prototype=new d,a.__super__=b.prototype,a};SelectParser=function(){function SelectParser(){this.options_index=0,this.parsed=[]}return SelectParser.prototype.add_node=function(a){return"OPTGROUP"===a.nodeName.toUpperCase()?this.add_group(a):this.add_option(a)},SelectParser.prototype.add_group=function(a){var b,c,d,e,f,g;for(b=this.parsed.length,this.parsed.push({array_index:b,group:!0,label:this.escapeExpression(a.label),title:a.title?a.title:void 0,children:0,disabled:a.disabled,classes:a.className}),f=a.childNodes,g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(this.add_option(c,b,a.disabled));return g},SelectParser.prototype.add_option=function(a,b,c){return"OPTION"===a.nodeName.toUpperCase()?(""!==a.text?(null!=b&&(this.parsed[b].children+=1),this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,value:a.value,text:a.text,html:a.innerHTML,title:a.title?a.title:void 0,selected:a.selected,disabled:c===!0?c:a.disabled,group_array_index:b,group_label:null!=b?this.parsed[b].label:null,classes:a.className,style:a.style.cssText})):this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,empty:!0}),this.options_index+=1):void 0},SelectParser.prototype.escapeExpression=function(a){var b,c;return null==a||a===!1?"":/[\&\<\>\"\'\`]/.test(a)?(b={"<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"},c=/&(?!\w+;)|[\<\>\"\'\`]/g,a.replace(c,function(a){return b[a]||"&amp;"})):a},SelectParser}(),SelectParser.select_to_array=function(a){var b,c,d,e,f;for(c=new SelectParser,f=a.childNodes,d=0,e=f.length;e>d;d++)b=f[d],c.add_node(b);return c.parsed},AbstractChosen=function(){function AbstractChosen(a,b){this.form_field=a,this.options=null!=b?b:{},AbstractChosen.browser_is_supported()&&(this.is_multiple=this.form_field.multiple,this.set_default_text(),this.set_default_values(),this.setup(),this.set_up_html(),this.register_observers(),this.on_ready())}return AbstractChosen.prototype.set_default_values=function(){var a=this;return this.click_test_action=function(b){return a.test_active_click(b)},this.activate_action=function(b){return a.activate_field(b)},this.active_field=!1,this.mouse_on_container=!1,this.results_showing=!1,this.result_highlighted=null,this.allow_single_deselect=null!=this.options.allow_single_deselect&&null!=this.form_field.options[0]&&""===this.form_field.options[0].text?this.options.allow_single_deselect:!1,this.disable_search_threshold=this.options.disable_search_threshold||0,this.disable_search=this.options.disable_search||!1,this.enable_split_word_search=null!=this.options.enable_split_word_search?this.options.enable_split_word_search:!0,this.group_search=null!=this.options.group_search?this.options.group_search:!0,this.search_contains=this.options.search_contains||!1,this.single_backstroke_delete=null!=this.options.single_backstroke_delete?this.options.single_backstroke_delete:!0,this.max_selected_options=this.options.max_selected_options||1/0,this.inherit_select_classes=this.options.inherit_select_classes||!1,this.display_selected_options=null!=this.options.display_selected_options?this.options.display_selected_options:!0,this.display_disabled_options=null!=this.options.display_disabled_options?this.options.display_disabled_options:!0,this.include_group_label_in_selected=this.options.include_group_label_in_selected||!1},AbstractChosen.prototype.set_default_text=function(){return this.default_text=this.form_field.getAttribute("data-placeholder")?this.form_field.getAttribute("data-placeholder"):this.is_multiple?this.options.placeholder_text_multiple||this.options.placeholder_text||AbstractChosen.default_multiple_text:this.options.placeholder_text_single||this.options.placeholder_text||AbstractChosen.default_single_text,this.results_none_found=this.form_field.getAttribute("data-no_results_text")||this.options.no_results_text||AbstractChosen.default_no_result_text},AbstractChosen.prototype.choice_label=function(a){return this.include_group_label_in_selected&&null!=a.group_label?"<b class='group-name'>"+a.group_label+"</b>"+a.html:a.html},AbstractChosen.prototype.mouse_enter=function(){return this.mouse_on_container=!0},AbstractChosen.prototype.mouse_leave=function(){return this.mouse_on_container=!1},AbstractChosen.prototype.input_focus=function(){var a=this;if(this.is_multiple){if(!this.active_field)return setTimeout(function(){return a.container_mousedown()},50)}else if(!this.active_field)return this.activate_field()},AbstractChosen.prototype.input_blur=function(){var a=this;return this.mouse_on_container?void 0:(this.active_field=!1,setTimeout(function(){return a.blur_test()},100))},AbstractChosen.prototype.results_option_build=function(a){var b,c,d,e,f;for(b="",f=this.results_data,d=0,e=f.length;e>d;d++)c=f[d],b+=c.group?this.result_add_group(c):this.result_add_option(c),(null!=a?a.first:void 0)&&(c.selected&&this.is_multiple?this.choice_build(c):c.selected&&!this.is_multiple&&this.single_set_selected_text(this.choice_label(c)));return b},AbstractChosen.prototype.result_add_option=function(a){var b,c;return a.search_match?this.include_option_in_results(a)?(b=[],a.disabled||a.selected&&this.is_multiple||b.push("active-result"),!a.disabled||a.selected&&this.is_multiple||b.push("disabled-result"),a.selected&&b.push("result-selected"),null!=a.group_array_index&&b.push("group-option"),""!==a.classes&&b.push(a.classes),c=document.createElement("li"),c.className=b.join(" "),c.style.cssText=a.style,c.setAttribute("data-option-array-index",a.array_index),c.innerHTML=a.search_text,a.title&&(c.title=a.title),this.outerHTML(c)):"":""},AbstractChosen.prototype.result_add_group=function(a){var b,c;return a.search_match||a.group_match?a.active_options>0?(b=[],b.push("group-result"),a.classes&&b.push(a.classes),c=document.createElement("li"),c.className=b.join(" "),c.innerHTML=a.search_text,a.title&&(c.title=a.title),this.outerHTML(c)):"":""},AbstractChosen.prototype.results_update_field=function(){return this.set_default_text(),this.is_multiple||this.results_reset_cleanup(),this.result_clear_highlight(),this.results_build(),this.results_showing?this.winnow_results():void 0},AbstractChosen.prototype.reset_single_select_options=function(){var a,b,c,d,e;for(d=this.results_data,e=[],b=0,c=d.length;c>b;b++)a=d[b],a.selected?e.push(a.selected=!1):e.push(void 0);return e},AbstractChosen.prototype.results_toggle=function(){return this.results_showing?this.results_hide():this.results_show()},AbstractChosen.prototype.results_search=function(){return this.results_showing?this.winnow_results():this.results_show()},AbstractChosen.prototype.winnow_results=function(){var a,b,c,d,e,f,g,h,i,j,k,l;for(this.no_results_clear(),d=0,f=this.get_search_text(),a=f.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),i=new RegExp(a,"i"),c=this.get_search_regex(a),l=this.results_data,j=0,k=l.length;k>j;j++)b=l[j],b.search_match=!1,e=null,this.include_option_in_results(b)&&(b.group&&(b.group_match=!1,b.active_options=0),null!=b.group_array_index&&this.results_data[b.group_array_index]&&(e=this.results_data[b.group_array_index],0===e.active_options&&e.search_match&&(d+=1),e.active_options+=1),b.search_text=b.group?b.label:b.html,(!b.group||this.group_search)&&(b.search_match=this.search_string_match(b.search_text,c),b.search_match&&!b.group&&(d+=1),b.search_match?(f.length&&(g=b.search_text.search(i),h=b.search_text.substr(0,g+f.length)+"</em>"+b.search_text.substr(g+f.length),b.search_text=h.substr(0,g)+"<em>"+h.substr(g)),null!=e&&(e.group_match=!0)):null!=b.group_array_index&&this.results_data[b.group_array_index].search_match&&(b.search_match=!0)));return this.result_clear_highlight(),1>d&&f.length?(this.update_results_content(""),this.no_results(f)):(this.update_results_content(this.results_option_build()),this.winnow_results_set_highlight())},AbstractChosen.prototype.get_search_regex=function(a){var b;return b=this.search_contains?"":"^",new RegExp(b+a,"i")},AbstractChosen.prototype.search_string_match=function(a,b){var c,d,e,f;if(b.test(a))return!0;if(this.enable_split_word_search&&(a.indexOf(" ")>=0||0===a.indexOf("["))&&(d=a.replace(/\[|\]/g,"").split(" "),d.length))for(e=0,f=d.length;f>e;e++)if(c=d[e],b.test(c))return!0},AbstractChosen.prototype.choices_count=function(){var a,b,c,d;if(null!=this.selected_option_count)return this.selected_option_count;for(this.selected_option_count=0,d=this.form_field.options,b=0,c=d.length;c>b;b++)a=d[b],a.selected&&(this.selected_option_count+=1);return this.selected_option_count},AbstractChosen.prototype.choices_click=function(a){return a.preventDefault(),this.results_showing||this.is_disabled?void 0:this.results_show()},AbstractChosen.prototype.keyup_checker=function(a){var b,c;switch(b=null!=(c=a.which)?c:a.keyCode,this.search_field_scale(),b){case 8:if(this.is_multiple&&this.backstroke_length<1&&this.choices_count()>0)return this.keydown_backstroke();if(!this.pending_backstroke)return this.result_clear_highlight(),this.results_search();break;case 13:if(a.preventDefault(),this.results_showing)return this.result_select(a);break;case 27:return this.results_showing&&this.results_hide(),!0;case 9:case 38:case 40:case 16:case 91:case 17:break;default:return this.results_search()}},AbstractChosen.prototype.clipboard_event_checker=function(){var a=this;return setTimeout(function(){return a.results_search()},50)},AbstractChosen.prototype.container_width=function(){return null!=this.options.width?this.options.width:""+this.form_field.offsetWidth+"px"},AbstractChosen.prototype.include_option_in_results=function(a){return this.is_multiple&&!this.display_selected_options&&a.selected?!1:!this.display_disabled_options&&a.disabled?!1:a.empty?!1:!0},AbstractChosen.prototype.search_results_touchstart=function(a){return this.touch_started=!0,this.search_results_mouseover(a)},AbstractChosen.prototype.search_results_touchmove=function(a){return this.touch_started=!1,this.search_results_mouseout(a)},AbstractChosen.prototype.search_results_touchend=function(a){return this.touch_started?this.search_results_mouseup(a):void 0},AbstractChosen.prototype.outerHTML=function(a){var b;return a.outerHTML?a.outerHTML:(b=document.createElement("div"),b.appendChild(a),b.innerHTML)},AbstractChosen.browser_is_supported=function(){return"Microsoft Internet Explorer"===window.navigator.appName?document.documentMode>=8:/iP(od|hone)/i.test(window.navigator.userAgent)?!1:/Android/i.test(window.navigator.userAgent)&&/Mobile/i.test(window.navigator.userAgent)?!1:!0},AbstractChosen.default_multiple_text="Select Some Options",AbstractChosen.default_single_text="Select an Option",AbstractChosen.default_no_result_text="No results match",AbstractChosen}(),a=jQuery,a.fn.extend({chosen:function(b){return AbstractChosen.browser_is_supported()?this.each(function(){var c,d;c=a(this),d=c.data("chosen"),"destroy"===b&&d instanceof Chosen?d.destroy():d instanceof Chosen||c.data("chosen",new Chosen(this,b))}):this}}),Chosen=function(c){function Chosen(){return b=Chosen.__super__.constructor.apply(this,arguments)}return d(Chosen,c),Chosen.prototype.setup=function(){return this.form_field_jq=a(this.form_field),this.current_selectedIndex=this.form_field.selectedIndex,this.is_rtl=this.form_field_jq.hasClass("chosen-rtl")},Chosen.prototype.set_up_html=function(){var b,c;return b=["chosen-container"],b.push("chosen-container-"+(this.is_multiple?"multi":"single")),this.inherit_select_classes&&this.form_field.className&&b.push(this.form_field.className),this.is_rtl&&b.push("chosen-rtl"),c={"class":b.join(" "),style:"width: "+this.container_width()+";",title:this.form_field.title},this.form_field.id.length&&(c.id=this.form_field.id.replace(/[^\w]/g,"_")+"_chosen"),this.container=a("<div />",c),this.is_multiple?this.container.html('<ul class="chosen-choices"><li class="search-field"><input type="text" value="'+this.default_text+'" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chosen-drop"><ul class="chosen-results"></ul></div>'):this.container.html('<a class="chosen-single chosen-default" tabindex="-1"><span>'+this.default_text+'</span><div><b></b></div></a><div class="chosen-drop"><div class="chosen-search"><input type="text" autocomplete="off" /></div><ul class="chosen-results"></ul></div>'),this.form_field_jq.hide().after(this.container),this.dropdown=this.container.find("div.chosen-drop").first(),this.search_field=this.container.find("input").first(),this.search_results=this.container.find("ul.chosen-results").first(),this.search_field_scale(),this.search_no_results=this.container.find("li.no-results").first(),this.is_multiple?(this.search_choices=this.container.find("ul.chosen-choices").first(),this.search_container=this.container.find("li.search-field").first()):(this.search_container=this.container.find("div.chosen-search").first(),this.selected_item=this.container.find(".chosen-single").first()),this.results_build(),this.set_tab_index(),this.set_label_behavior()},Chosen.prototype.on_ready=function(){return this.form_field_jq.trigger("chosen:ready",{chosen:this})},Chosen.prototype.register_observers=function(){var a=this;return this.container.bind("touchstart.chosen",function(b){return a.container_mousedown(b),b.preventDefault()}),this.container.bind("touchend.chosen",function(b){return a.container_mouseup(b),b.preventDefault()}),this.container.bind("mousedown.chosen",function(b){a.container_mousedown(b)}),this.container.bind("mouseup.chosen",function(b){a.container_mouseup(b)}),this.container.bind("mouseenter.chosen",function(b){a.mouse_enter(b)}),this.container.bind("mouseleave.chosen",function(b){a.mouse_leave(b)}),this.search_results.bind("mouseup.chosen",function(b){a.search_results_mouseup(b)}),this.search_results.bind("mouseover.chosen",function(b){a.search_results_mouseover(b)}),this.search_results.bind("mouseout.chosen",function(b){a.search_results_mouseout(b)}),this.search_results.bind("mousewheel.chosen DOMMouseScroll.chosen",function(b){a.search_results_mousewheel(b)}),this.search_results.bind("touchstart.chosen",function(b){a.search_results_touchstart(b)}),this.search_results.bind("touchmove.chosen",function(b){a.search_results_touchmove(b)}),this.search_results.bind("touchend.chosen",function(b){a.search_results_touchend(b)}),this.form_field_jq.bind("chosen:updated.chosen",function(b){a.results_update_field(b)}),this.form_field_jq.bind("chosen:activate.chosen",function(b){a.activate_field(b)}),this.form_field_jq.bind("chosen:open.chosen",function(b){a.container_mousedown(b)}),this.form_field_jq.bind("chosen:close.chosen",function(b){a.input_blur(b)}),this.search_field.bind("blur.chosen",function(b){a.input_blur(b)}),this.search_field.bind("keyup.chosen",function(b){a.keyup_checker(b)}),this.search_field.bind("keydown.chosen",function(b){a.keydown_checker(b)}),this.search_field.bind("focus.chosen",function(b){a.input_focus(b)}),this.search_field.bind("cut.chosen",function(b){a.clipboard_event_checker(b)}),this.search_field.bind("paste.chosen",function(b){a.clipboard_event_checker(b)}),this.is_multiple?this.search_choices.bind("click.chosen",function(b){a.choices_click(b)}):this.container.bind("click.chosen",function(a){a.preventDefault()})},Chosen.prototype.destroy=function(){return a(this.container[0].ownerDocument).unbind("click.chosen",this.click_test_action),this.search_field[0].tabIndex&&(this.form_field_jq[0].tabIndex=this.search_field[0].tabIndex),this.container.remove(),this.form_field_jq.removeData("chosen"),this.form_field_jq.show()},Chosen.prototype.search_field_disabled=function(){return this.is_disabled=this.form_field_jq[0].disabled,this.is_disabled?(this.container.addClass("chosen-disabled"),this.search_field[0].disabled=!0,this.is_multiple||this.selected_item.unbind("focus.chosen",this.activate_action),this.close_field()):(this.container.removeClass("chosen-disabled"),this.search_field[0].disabled=!1,this.is_multiple?void 0:this.selected_item.bind("focus.chosen",this.activate_action))},Chosen.prototype.container_mousedown=function(b){return this.is_disabled||(b&&"mousedown"===b.type&&!this.results_showing&&b.preventDefault(),null!=b&&a(b.target).hasClass("search-choice-close"))?void 0:(this.active_field?this.is_multiple||!b||a(b.target)[0]!==this.selected_item[0]&&!a(b.target).parents("a.chosen-single").length||(b.preventDefault(),this.results_toggle()):(this.is_multiple&&this.search_field.val(""),a(this.container[0].ownerDocument).bind("click.chosen",this.click_test_action),this.results_show()),this.activate_field())},Chosen.prototype.container_mouseup=function(a){return"ABBR"!==a.target.nodeName||this.is_disabled?void 0:this.results_reset(a)},Chosen.prototype.search_results_mousewheel=function(a){var b;return a.originalEvent&&(b=a.originalEvent.deltaY||-a.originalEvent.wheelDelta||a.originalEvent.detail),null!=b?(a.preventDefault(),"DOMMouseScroll"===a.type&&(b=40*b),this.search_results.scrollTop(b+this.search_results.scrollTop())):void 0},Chosen.prototype.blur_test=function(){return!this.active_field&&this.container.hasClass("chosen-container-active")?this.close_field():void 0},Chosen.prototype.close_field=function(){return a(this.container[0].ownerDocument).unbind("click.chosen",this.click_test_action),this.active_field=!1,this.results_hide(),this.container.removeClass("chosen-container-active"),this.clear_backstroke(),this.show_search_field_default(),this.search_field_scale()},Chosen.prototype.activate_field=function(){return this.container.addClass("chosen-container-active"),this.active_field=!0,this.search_field.val(this.search_field.val()),this.search_field.focus()},Chosen.prototype.test_active_click=function(b){var c;return c=a(b.target).closest(".chosen-container"),c.length&&this.container[0]===c[0]?this.active_field=!0:this.close_field()},Chosen.prototype.results_build=function(){return this.parsing=!0,this.selected_option_count=null,this.results_data=SelectParser.select_to_array(this.form_field),this.is_multiple?this.search_choices.find("li.search-choice").remove():this.is_multiple||(this.single_set_selected_text(),this.disable_search||this.form_field.options.length<=this.disable_search_threshold?(this.search_field[0].readOnly=!0,this.container.addClass("chosen-container-single-nosearch")):(this.search_field[0].readOnly=!1,this.container.removeClass("chosen-container-single-nosearch"))),this.update_results_content(this.results_option_build({first:!0})),this.search_field_disabled(),this.show_search_field_default(),this.search_field_scale(),this.parsing=!1},Chosen.prototype.result_do_highlight=function(a){var b,c,d,e,f;if(a.length){if(this.result_clear_highlight(),this.result_highlight=a,this.result_highlight.addClass("highlighted"),d=parseInt(this.search_results.css("maxHeight"),10),f=this.search_results.scrollTop(),e=d+f,c=this.result_highlight.position().top+this.search_results.scrollTop(),b=c+this.result_highlight.outerHeight(),b>=e)return this.search_results.scrollTop(b-d>0?b-d:0);if(f>c)return this.search_results.scrollTop(c)}},Chosen.prototype.result_clear_highlight=function(){return this.result_highlight&&this.result_highlight.removeClass("highlighted"),this.result_highlight=null},Chosen.prototype.results_show=function(){return this.is_multiple&&this.max_selected_options<=this.choices_count()?(this.form_field_jq.trigger("chosen:maxselected",{chosen:this}),!1):(this.container.addClass("chosen-with-drop"),this.results_showing=!0,this.search_field.focus(),this.search_field.val(this.search_field.val()),this.winnow_results(),this.form_field_jq.trigger("chosen:showing_dropdown",{chosen:this}))},Chosen.prototype.update_results_content=function(a){return this.search_results.html(a)},Chosen.prototype.results_hide=function(){return this.results_showing&&(this.result_clear_highlight(),this.container.removeClass("chosen-with-drop"),this.form_field_jq.trigger("chosen:hiding_dropdown",{chosen:this})),this.results_showing=!1},Chosen.prototype.set_tab_index=function(){var a;return this.form_field.tabIndex?(a=this.form_field.tabIndex,this.form_field.tabIndex=-1,this.search_field[0].tabIndex=a):void 0},Chosen.prototype.set_label_behavior=function(){var b=this;return this.form_field_label=this.form_field_jq.parents("label"),!this.form_field_label.length&&this.form_field.id.length&&(this.form_field_label=a("label[for='"+this.form_field.id+"']")),this.form_field_label.length>0?this.form_field_label.bind("click.chosen",function(a){return b.is_multiple?b.container_mousedown(a):b.activate_field()}):void 0},Chosen.prototype.show_search_field_default=function(){return this.is_multiple&&this.choices_count()<1&&!this.active_field?(this.search_field.val(this.default_text),this.search_field.addClass("default")):(this.search_field.val(""),this.search_field.removeClass("default"))},Chosen.prototype.search_results_mouseup=function(b){var c;return c=a(b.target).hasClass("active-result")?a(b.target):a(b.target).parents(".active-result").first(),c.length?(this.result_highlight=c,this.result_select(b),this.search_field.focus()):void 0},Chosen.prototype.search_results_mouseover=function(b){var c;return c=a(b.target).hasClass("active-result")?a(b.target):a(b.target).parents(".active-result").first(),c?this.result_do_highlight(c):void 0},Chosen.prototype.search_results_mouseout=function(b){return a(b.target).hasClass("active-result")?this.result_clear_highlight():void 0},Chosen.prototype.choice_build=function(b){var c,d,e=this;return c=a("<li />",{"class":"search-choice"}).html("<span>"+this.choice_label(b)+"</span>"),b.disabled?c.addClass("search-choice-disabled"):(d=a("<a />",{"class":"search-choice-close","data-option-array-index":b.array_index}),d.bind("click.chosen",function(a){return e.choice_destroy_link_click(a)}),c.append(d)),this.search_container.before(c)},Chosen.prototype.choice_destroy_link_click=function(b){return b.preventDefault(),b.stopPropagation(),this.is_disabled?void 0:this.choice_destroy(a(b.target))},Chosen.prototype.choice_destroy=function(a){return this.result_deselect(a[0].getAttribute("data-option-array-index"))?(this.show_search_field_default(),this.is_multiple&&this.choices_count()>0&&this.search_field.val().length<1&&this.results_hide(),a.parents("li").first().remove(),this.search_field_scale()):void 0},Chosen.prototype.results_reset=function(){return this.reset_single_select_options(),this.form_field.options[0].selected=!0,this.single_set_selected_text(),this.show_search_field_default(),this.results_reset_cleanup(),this.form_field_jq.trigger("change"),this.active_field?this.results_hide():void 0},Chosen.prototype.results_reset_cleanup=function(){return this.current_selectedIndex=this.form_field.selectedIndex,this.selected_item.find("abbr").remove()},Chosen.prototype.result_select=function(a){var b,c;return this.result_highlight?(b=this.result_highlight,this.result_clear_highlight(),this.is_multiple&&this.max_selected_options<=this.choices_count()?(this.form_field_jq.trigger("chosen:maxselected",{chosen:this}),!1):(this.is_multiple?b.removeClass("active-result"):this.reset_single_select_options(),b.addClass("result-selected"),c=this.results_data[b[0].getAttribute("data-option-array-index")],c.selected=!0,this.form_field.options[c.options_index].selected=!0,this.selected_option_count=null,this.is_multiple?this.choice_build(c):this.single_set_selected_text(this.choice_label(c)),(a.metaKey||a.ctrlKey)&&this.is_multiple||this.results_hide(),this.search_field.val(""),(this.is_multiple||this.form_field.selectedIndex!==this.current_selectedIndex)&&this.form_field_jq.trigger("change",{selected:this.form_field.options[c.options_index].value}),this.current_selectedIndex=this.form_field.selectedIndex,a.preventDefault(),this.search_field_scale())):void 0},Chosen.prototype.single_set_selected_text=function(a){return null==a&&(a=this.default_text),a===this.default_text?this.selected_item.addClass("chosen-default"):(this.single_deselect_control_build(),this.selected_item.removeClass("chosen-default")),this.selected_item.find("span").html(a)},Chosen.prototype.result_deselect=function(a){var b;return b=this.results_data[a],this.form_field.options[b.options_index].disabled?!1:(b.selected=!1,this.form_field.options[b.options_index].selected=!1,this.selected_option_count=null,this.result_clear_highlight(),this.results_showing&&this.winnow_results(),this.form_field_jq.trigger("change",{deselected:this.form_field.options[b.options_index].value}),this.search_field_scale(),!0)},Chosen.prototype.single_deselect_control_build=function(){return this.allow_single_deselect?(this.selected_item.find("abbr").length||this.selected_item.find("span").first().after('<abbr class="search-choice-close"></abbr>'),this.selected_item.addClass("chosen-single-with-deselect")):void 0},Chosen.prototype.get_search_text=function(){return a("<div/>").text(a.trim(this.search_field.val())).html()},Chosen.prototype.winnow_results_set_highlight=function(){var a,b;return b=this.is_multiple?[]:this.search_results.find(".result-selected.active-result"),a=b.length?b.first():this.search_results.find(".active-result").first(),null!=a?this.result_do_highlight(a):void 0},Chosen.prototype.no_results=function(b){var c;return c=a('<li class="no-results">'+this.results_none_found+' "<span></span>"</li>'),c.find("span").first().html(b),this.search_results.append(c),this.form_field_jq.trigger("chosen:no_results",{chosen:this})},Chosen.prototype.no_results_clear=function(){return this.search_results.find(".no-results").remove()},Chosen.prototype.keydown_arrow=function(){var a;return this.results_showing&&this.result_highlight?(a=this.result_highlight.nextAll("li.active-result").first())?this.result_do_highlight(a):void 0:this.results_show()},Chosen.prototype.keyup_arrow=function(){var a;return this.results_showing||this.is_multiple?this.result_highlight?(a=this.result_highlight.prevAll("li.active-result"),a.length?this.result_do_highlight(a.first()):(this.choices_count()>0&&this.results_hide(),this.result_clear_highlight())):void 0:this.results_show()},Chosen.prototype.keydown_backstroke=function(){var a;return this.pending_backstroke?(this.choice_destroy(this.pending_backstroke.find("a").first()),this.clear_backstroke()):(a=this.search_container.siblings("li.search-choice").last(),a.length&&!a.hasClass("search-choice-disabled")?(this.pending_backstroke=a,this.single_backstroke_delete?this.keydown_backstroke():this.pending_backstroke.addClass("search-choice-focus")):void 0)},Chosen.prototype.clear_backstroke=function(){return this.pending_backstroke&&this.pending_backstroke.removeClass("search-choice-focus"),this.pending_backstroke=null},Chosen.prototype.keydown_checker=function(a){var b,c;switch(b=null!=(c=a.which)?c:a.keyCode,this.search_field_scale(),8!==b&&this.pending_backstroke&&this.clear_backstroke(),b){case 8:this.backstroke_length=this.search_field.val().length;break;case 9:this.results_showing&&!this.is_multiple&&this.result_select(a),this.mouse_on_container=!1;break;case 13:this.results_showing&&a.preventDefault();break;case 32:this.disable_search&&a.preventDefault();break;case 38:a.preventDefault(),this.keyup_arrow();break;case 40:a.preventDefault(),this.keydown_arrow()}},Chosen.prototype.search_field_scale=function(){var b,c,d,e,f,g,h,i,j;if(this.is_multiple){for(d=0,h=0,f="position:absolute; left: -1000px; top: -1000px; display:none;",g=["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"],i=0,j=g.length;j>i;i++)e=g[i],f+=e+":"+this.search_field.css(e)+";";return b=a("<div />",{style:f}),b.text(this.search_field.val()),a("body").append(b),h=b.width()+25,b.remove(),c=this.container.outerWidth(),h>c-10&&(h=c-10),this.search_field.css({width:h+"px"})}},Chosen}(AbstractChosen)}).call(this);
\ No newline at end of file
/*!
* fancyBox - jQuery Plugin
* version: 2.1.5 (Fri, 14 Jun 2013)
* @requires jQuery v1.6 or later
*
* Examples at http://fancyapps.com/fancybox/
* License: www.fancyapps.com/fancybox/#license
*
* Copyright 2012 Janis Skarnelis - janis@fancyapps.com
*
*/
(function (window, document, $, undefined) {
"use strict";
var H = $("html"),
W = $(window),
D = $(document),
F = $.fancybox = function () {
F.open.apply( this, arguments );
},
IE = navigator.userAgent.match(/msie/i),
didUpdate = null,
isTouch = document.createTouch !== undefined,
isQuery = function(obj) {
return obj && obj.hasOwnProperty && obj instanceof $;
},
isString = function(str) {
return str && $.type(str) === "string";
},
isPercentage = function(str) {
return isString(str) && str.indexOf('%') > 0;
},
isScrollable = function(el) {
return (el && !(el.style.overflow && el.style.overflow === 'hidden') && ((el.clientWidth && el.scrollWidth > el.clientWidth) || (el.clientHeight && el.scrollHeight > el.clientHeight)));
},
getScalar = function(orig, dim) {
var value = parseInt(orig, 10) || 0;
if (dim && isPercentage(orig)) {
value = F.getViewport()[ dim ] / 100 * value;
}
return Math.ceil(value);
},
getValue = function(value, dim) {
return getScalar(value, dim) + 'px';
};
$.extend(F, {
// The current version of fancyBox
version: '2.1.5',
defaults: {
padding : 15,
margin : 20,
width : 800,
height : 600,
minWidth : 100,
minHeight : 100,
maxWidth : 9999,
maxHeight : 9999,
pixelRatio: 1, // Set to 2 for retina display support
autoSize : true,
autoHeight : false,
autoWidth : false,
autoResize : true,
autoCenter : !isTouch,
fitToView : true,
aspectRatio : false,
topRatio : 0.5,
leftRatio : 0.5,
scrolling : 'auto', // 'auto', 'yes' or 'no'
wrapCSS : '',
arrows : true,
closeBtn : true,
closeClick : false,
nextClick : false,
mouseWheel : true,
autoPlay : false,
playSpeed : 3000,
preload : 3,
modal : false,
loop : true,
ajax : {
dataType : 'html',
headers : { 'X-fancyBox': true }
},
iframe : {
scrolling : 'auto',
preload : true
},
swf : {
wmode: 'transparent',
allowfullscreen : 'true',
allowscriptaccess : 'always'
},
keys : {
next : {
13 : 'left', // enter
34 : 'up', // page down
39 : 'left', // right arrow
40 : 'up' // down arrow
},
prev : {
8 : 'right', // backspace
33 : 'down', // page up
37 : 'right', // left arrow
38 : 'down' // up arrow
},
close : [27], // escape key
play : [32], // space - start/stop slideshow
toggle : [70] // letter "f" - toggle fullscreen
},
direction : {
next : 'left',
prev : 'right'
},
scrollOutside : true,
// Override some properties
index : 0,
type : null,
href : null,
content : null,
title : null,
// HTML templates
tpl: {
wrap : '<div class="fancybox-wrap" tabIndex="-1"><div class="fancybox-skin"><div class="fancybox-outer"><div class="fancybox-inner"></div></div></div></div>',
image : '<img class="fancybox-image" src="{href}" alt="" />',
iframe : '<iframe id="fancybox-frame{rnd}" name="fancybox-frame{rnd}" class="fancybox-iframe" frameborder="0" vspace="0" hspace="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen' + (IE ? ' allowtransparency="true"' : '') + '></iframe>',
error : '<p class="fancybox-error">The requested content cannot be loaded.<br/>Please try again later.</p>',
closeBtn : '<a title="Close" class="fancybox-item fancybox-close" href="javascript:;"></a>',
next : '<a title="Next" class="fancybox-nav fancybox-next" href="javascript:;"><span></span></a>',
prev : '<a title="Previous" class="fancybox-nav fancybox-prev" href="javascript:;"><span></span></a>'
},
// Properties for each animation type
// Opening fancyBox
openEffect : 'fade', // 'elastic', 'fade' or 'none'
openSpeed : 250,
openEasing : 'swing',
openOpacity : true,
openMethod : 'zoomIn',
// Closing fancyBox
closeEffect : 'fade', // 'elastic', 'fade' or 'none'
closeSpeed : 250,
closeEasing : 'swing',
closeOpacity : true,
closeMethod : 'zoomOut',
// Changing next gallery item
nextEffect : 'elastic', // 'elastic', 'fade' or 'none'
nextSpeed : 250,
nextEasing : 'swing',
nextMethod : 'changeIn',
// Changing previous gallery item
prevEffect : 'elastic', // 'elastic', 'fade' or 'none'
prevSpeed : 250,
prevEasing : 'swing',
prevMethod : 'changeOut',
// Enable default helpers
helpers : {
overlay : true,
title : true
},
// Callbacks
onCancel : $.noop, // If canceling
beforeLoad : $.noop, // Before loading
afterLoad : $.noop, // After loading
beforeShow : $.noop, // Before changing in current item
afterShow : $.noop, // After opening
beforeChange : $.noop, // Before changing gallery item
beforeClose : $.noop, // Before closing
afterClose : $.noop // After closing
},
//Current state
group : {}, // Selected group
opts : {}, // Group options
previous : null, // Previous element
coming : null, // Element being loaded
current : null, // Currently loaded element
isActive : false, // Is activated
isOpen : false, // Is currently open
isOpened : false, // Have been fully opened at least once
wrap : null,
skin : null,
outer : null,
inner : null,
player : {
timer : null,
isActive : false
},
// Loaders
ajaxLoad : null,
imgPreload : null,
// Some collections
transitions : {},
helpers : {},
/*
* Static methods
*/
open: function (group, opts) {
if (!group) {
return;
}
if (!$.isPlainObject(opts)) {
opts = {};
}
// Close if already active
if (false === F.close(true)) {
return;
}
// Normalize group
if (!$.isArray(group)) {
group = isQuery(group) ? $(group).get() : [group];
}
// Recheck if the type of each element is `object` and set content type (image, ajax, etc)
$.each(group, function(i, element) {
var obj = {},
href,
title,
content,
type,
rez,
hrefParts,
selector;
if ($.type(element) === "object") {
// Check if is DOM element
if (element.nodeType) {
element = $(element);
}
if (isQuery(element)) {
obj = {
href : element.data('fancybox-href') || element.attr('href'),
title : element.data('fancybox-title') || element.attr('title'),
isDom : true,
element : element
};
if ($.metadata) {
$.extend(true, obj, element.metadata());
}
} else {
obj = element;
}
}
href = opts.href || obj.href || (isString(element) ? element : null);
title = opts.title !== undefined ? opts.title : obj.title || '';
content = opts.content || obj.content;
type = content ? 'html' : (opts.type || obj.type);
if (!type && obj.isDom) {
type = element.data('fancybox-type');
if (!type) {
rez = element.prop('class').match(/fancybox\.(\w+)/);
type = rez ? rez[1] : null;
}
}
if (isString(href)) {
// Try to guess the content type
if (!type) {
if (F.isImage(href)) {
type = 'image';
} else if (F.isSWF(href)) {
type = 'swf';
} else if (href.charAt(0) === '#') {
type = 'inline';
} else if (isString(element)) {
type = 'html';
content = element;
}
}
// Split url into two pieces with source url and content selector, e.g,
// "/mypage.html #my_id" will load "/mypage.html" and display element having id "my_id"
if (type === 'ajax') {
hrefParts = href.split(/\s+/, 2);
href = hrefParts.shift();
selector = hrefParts.shift();
}
}
if (!content) {
if (type === 'inline') {
if (href) {
content = $( isString(href) ? href.replace(/.*(?=#[^\s]+$)/, '') : href ); //strip for ie7
} else if (obj.isDom) {
content = element;
}
} else if (type === 'html') {
content = href;
} else if (!type && !href && obj.isDom) {
type = 'inline';
content = element;
}
}
$.extend(obj, {
href : href,
type : type,
content : content,
title : title,
selector : selector
});
group[ i ] = obj;
});
// Extend the defaults
F.opts = $.extend(true, {}, F.defaults, opts);
// All options are merged recursive except keys
if (opts.keys !== undefined) {
F.opts.keys = opts.keys ? $.extend({}, F.defaults.keys, opts.keys) : false;
}
F.group = group;
return F._start(F.opts.index);
},
// Cancel image loading or abort ajax request
cancel: function () {
var coming = F.coming;
if (!coming || false === F.trigger('onCancel')) {
return;
}
F.hideLoading();
if (F.ajaxLoad) {
F.ajaxLoad.abort();
}
F.ajaxLoad = null;
if (F.imgPreload) {
F.imgPreload.onload = F.imgPreload.onerror = null;
}
if (coming.wrap) {
coming.wrap.stop(true, true).trigger('onReset').remove();
}
F.coming = null;
// If the first item has been canceled, then clear everything
if (!F.current) {
F._afterZoomOut( coming );
}
},
// Start closing animation if is open; remove immediately if opening/closing
close: function (event) {
F.cancel();
if (false === F.trigger('beforeClose')) {
return;
}
F.unbindEvents();
if (!F.isActive) {
return;
}
if (!F.isOpen || event === true) {
$('.fancybox-wrap').stop(true).trigger('onReset').remove();
F._afterZoomOut();
} else {
F.isOpen = F.isOpened = false;
F.isClosing = true;
$('.fancybox-item, .fancybox-nav').remove();
F.wrap.stop(true, true).removeClass('fancybox-opened');
F.transitions[ F.current.closeMethod ]();
}
},
// Manage slideshow:
// $.fancybox.play(); - toggle slideshow
// $.fancybox.play( true ); - start
// $.fancybox.play( false ); - stop
play: function ( action ) {
var clear = function () {
clearTimeout(F.player.timer);
},
set = function () {
clear();
if (F.current && F.player.isActive) {
F.player.timer = setTimeout(F.next, F.current.playSpeed);
}
},
stop = function () {
clear();
D.unbind('.player');
F.player.isActive = false;
F.trigger('onPlayEnd');
},
start = function () {
if (F.current && (F.current.loop || F.current.index < F.group.length - 1)) {
F.player.isActive = true;
D.bind({
'onCancel.player beforeClose.player' : stop,
'onUpdate.player' : set,
'beforeLoad.player' : clear
});
set();
F.trigger('onPlayStart');
}
};
if (action === true || (!F.player.isActive && action !== false)) {
start();
} else {
stop();
}
},
// Navigate to next gallery item
next: function ( direction ) {
var current = F.current;
if (current) {
if (!isString(direction)) {
direction = current.direction.next;
}
F.jumpto(current.index + 1, direction, 'next');
}
},
// Navigate to previous gallery item
prev: function ( direction ) {
var current = F.current;
if (current) {
if (!isString(direction)) {
direction = current.direction.prev;
}
F.jumpto(current.index - 1, direction, 'prev');
}
},
// Navigate to gallery item by index
jumpto: function ( index, direction, router ) {
var current = F.current;
if (!current) {
return;
}
index = getScalar(index);
F.direction = direction || current.direction[ (index >= current.index ? 'next' : 'prev') ];
F.router = router || 'jumpto';
if (current.loop) {
if (index < 0) {
index = current.group.length + (index % current.group.length);
}
index = index % current.group.length;
}
if (current.group[ index ] !== undefined) {
F.cancel();
F._start(index);
}
},
// Center inside viewport and toggle position type to fixed or absolute if needed
reposition: function (e, onlyAbsolute) {
var current = F.current,
wrap = current ? current.wrap : null,
pos;
if (wrap) {
pos = F._getPosition(onlyAbsolute);
if (e && e.type === 'scroll') {
delete pos.position;
wrap.stop(true, true).animate(pos, 200);
} else {
wrap.css(pos);
current.pos = $.extend({}, current.dim, pos);
}
}
},
update: function (e) {
var type = (e && e.type),
anyway = !type || type === 'orientationchange';
if (anyway) {
clearTimeout(didUpdate);
didUpdate = null;
}
if (!F.isOpen || didUpdate) {
return;
}
didUpdate = setTimeout(function() {
var current = F.current;
if (!current || F.isClosing) {
return;
}
F.wrap.removeClass('fancybox-tmp');
if (anyway || type === 'load' || (type === 'resize' && current.autoResize)) {
F._setDimension();
}
if (!(type === 'scroll' && current.canShrink)) {
F.reposition(e);
}
F.trigger('onUpdate');
didUpdate = null;
}, (anyway && !isTouch ? 0 : 300));
},
// Shrink content to fit inside viewport or restore if resized
toggle: function ( action ) {
if (F.isOpen) {
F.current.fitToView = $.type(action) === "boolean" ? action : !F.current.fitToView;
// Help browser to restore document dimensions
if (isTouch) {
F.wrap.removeAttr('style').addClass('fancybox-tmp');
F.trigger('onUpdate');
}
F.update();
}
},
hideLoading: function () {
D.unbind('.loading');
$('#fancybox-loading').remove();
},
showLoading: function () {
var el, viewport;
F.hideLoading();
el = $('<div id="fancybox-loading"><div></div></div>').click(F.cancel).appendTo('body');
// If user will press the escape-button, the request will be canceled
D.bind('keydown.loading', function(e) {
if ((e.which || e.keyCode) === 27) {
e.preventDefault();
F.cancel();
}
});
if (!F.defaults.fixed) {
viewport = F.getViewport();
el.css({
position : 'absolute',
top : (viewport.h * 0.5) + viewport.y,
left : (viewport.w * 0.5) + viewport.x
});
}
},
getViewport: function () {
var locked = (F.current && F.current.locked) || false,
rez = {
x: W.scrollLeft(),
y: W.scrollTop()
};
if (locked) {
rez.w = locked[0].clientWidth;
rez.h = locked[0].clientHeight;
} else {
// See http://bugs.jquery.com/ticket/6724
rez.w = isTouch && window.innerWidth ? window.innerWidth : W.width();
rez.h = isTouch && window.innerHeight ? window.innerHeight : W.height();
}
return rez;
},
// Unbind the keyboard / clicking actions
unbindEvents: function () {
if (F.wrap && isQuery(F.wrap)) {
F.wrap.unbind('.fb');
}
D.unbind('.fb');
W.unbind('.fb');
},
bindEvents: function () {
var current = F.current,
keys;
if (!current) {
return;
}
// Changing document height on iOS devices triggers a 'resize' event,
// that can change document height... repeating infinitely
W.bind('orientationchange.fb' + (isTouch ? '' : ' resize.fb') + (current.autoCenter && !current.locked ? ' scroll.fb' : ''), F.update);
keys = current.keys;
if (keys) {
D.bind('keydown.fb', function (e) {
var code = e.which || e.keyCode,
target = e.target || e.srcElement;
// Skip esc key if loading, because showLoading will cancel preloading
if (code === 27 && F.coming) {
return false;
}
// Ignore key combinations and key events within form elements
if (!e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey && !(target && (target.type || $(target).is('[contenteditable]')))) {
$.each(keys, function(i, val) {
if (current.group.length > 1 && val[ code ] !== undefined) {
F[ i ]( val[ code ] );
e.preventDefault();
return false;
}
if ($.inArray(code, val) > -1) {
F[ i ] ();
e.preventDefault();
return false;
}
});
}
});
}
if ($.fn.mousewheel && current.mouseWheel) {
F.wrap.bind('mousewheel.fb', function (e, delta, deltaX, deltaY) {
var target = e.target || null,
parent = $(target),
canScroll = false;
while (parent.length) {
if (canScroll || parent.is('.fancybox-skin') || parent.is('.fancybox-wrap')) {
break;
}
canScroll = isScrollable( parent[0] );
parent = $(parent).parent();
}
if (delta !== 0 && !canScroll) {
if (F.group.length > 1 && !current.canShrink) {
if (deltaY > 0 || deltaX > 0) {
F.prev( deltaY > 0 ? 'down' : 'left' );
} else if (deltaY < 0 || deltaX < 0) {
F.next( deltaY < 0 ? 'up' : 'right' );
}
e.preventDefault();
}
}
});
}
},
trigger: function (event, o) {
var ret, obj = o || F.coming || F.current;
if (!obj) {
return;
}
if ($.isFunction( obj[event] )) {
ret = obj[event].apply(obj, Array.prototype.slice.call(arguments, 1));
}
if (ret === false) {
return false;
}
if (obj.helpers) {
$.each(obj.helpers, function (helper, opts) {
if (opts && F.helpers[helper] && $.isFunction(F.helpers[helper][event])) {
F.helpers[helper][event]($.extend(true, {}, F.helpers[helper].defaults, opts), obj);
}
});
}
D.trigger(event);
},
isImage: function (str) {
return isString(str) && str.match(/(^data:image\/.*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg)((\?|#).*)?$)/i);
},
isSWF: function (str) {
return isString(str) && str.match(/\.(swf)((\?|#).*)?$/i);
},
_start: function (index) {
var coming = {},
obj,
href,
type,
margin,
padding;
index = getScalar( index );
obj = F.group[ index ] || null;
if (!obj) {
return false;
}
coming = $.extend(true, {}, F.opts, obj);
// Convert margin and padding properties to array - top, right, bottom, left
margin = coming.margin;
padding = coming.padding;
if ($.type(margin) === 'number') {
coming.margin = [margin, margin, margin, margin];
}
if ($.type(padding) === 'number') {
coming.padding = [padding, padding, padding, padding];
}
// 'modal' propery is just a shortcut
if (coming.modal) {
$.extend(true, coming, {
closeBtn : false,
closeClick : false,
nextClick : false,
arrows : false,
mouseWheel : false,
keys : null,
helpers: {
overlay : {
closeClick : false
}
}
});
}
// 'autoSize' property is a shortcut, too
if (coming.autoSize) {
coming.autoWidth = coming.autoHeight = true;
}
if (coming.width === 'auto') {
coming.autoWidth = true;
}
if (coming.height === 'auto') {
coming.autoHeight = true;
}
/*
* Add reference to the group, so it`s possible to access from callbacks, example:
* afterLoad : function() {
* this.title = 'Image ' + (this.index + 1) + ' of ' + this.group.length + (this.title ? ' - ' + this.title : '');
* }
*/
coming.group = F.group;
coming.index = index;
// Give a chance for callback or helpers to update coming item (type, title, etc)
F.coming = coming;
if (false === F.trigger('beforeLoad')) {
F.coming = null;
return;
}
type = coming.type;
href = coming.href;
if (!type) {
F.coming = null;
//If we can not determine content type then drop silently or display next/prev item if looping through gallery
if (F.current && F.router && F.router !== 'jumpto') {
F.current.index = index;
return F[ F.router ]( F.direction );
}
return false;
}
F.isActive = true;
if (type === 'image' || type === 'swf') {
coming.autoHeight = coming.autoWidth = false;
coming.scrolling = 'visible';
}
if (type === 'image') {
coming.aspectRatio = true;
}
if (type === 'iframe' && isTouch) {
coming.scrolling = 'scroll';
}
// Build the neccessary markup
coming.wrap = $(coming.tpl.wrap).addClass('fancybox-' + (isTouch ? 'mobile' : 'desktop') + ' fancybox-type-' + type + ' fancybox-tmp ' + coming.wrapCSS).appendTo( coming.parent || 'body' );
$.extend(coming, {
skin : $('.fancybox-skin', coming.wrap),
outer : $('.fancybox-outer', coming.wrap),
inner : $('.fancybox-inner', coming.wrap)
});
$.each(["Top", "Right", "Bottom", "Left"], function(i, v) {
coming.skin.css('padding' + v, getValue(coming.padding[ i ]));
});
F.trigger('onReady');
// Check before try to load; 'inline' and 'html' types need content, others - href
if (type === 'inline' || type === 'html') {
if (!coming.content || !coming.content.length) {
return F._error( 'content' );
}
} else if (!href) {
return F._error( 'href' );
}
if (type === 'image') {
F._loadImage();
} else if (type === 'ajax') {
F._loadAjax();
} else if (type === 'iframe') {
F._loadIframe();
} else {
F._afterLoad();
}
},
_error: function ( type ) {
$.extend(F.coming, {
type : 'html',
autoWidth : true,
autoHeight : true,
minWidth : 0,
minHeight : 0,
scrolling : 'no',
hasError : type,
content : F.coming.tpl.error
});
F._afterLoad();
},
_loadImage: function () {
// Reset preload image so it is later possible to check "complete" property
var img = F.imgPreload = new Image();
img.onload = function () {
this.onload = this.onerror = null;
F.coming.width = this.width / F.opts.pixelRatio;
F.coming.height = this.height / F.opts.pixelRatio;
F._afterLoad();
};
img.onerror = function () {
this.onload = this.onerror = null;
F._error( 'image' );
};
img.src = F.coming.href;
if (img.complete !== true) {
F.showLoading();
}
},
_loadAjax: function () {
var coming = F.coming;
F.showLoading();
F.ajaxLoad = $.ajax($.extend({}, coming.ajax, {
url: coming.href,
error: function (jqXHR, textStatus) {
if (F.coming && textStatus !== 'abort') {
F._error( 'ajax', jqXHR );
} else {
F.hideLoading();
}
},
success: function (data, textStatus) {
if (textStatus === 'success') {
coming.content = data;
F._afterLoad();
}
}
}));
},
_loadIframe: function() {
var coming = F.coming,
iframe = $(coming.tpl.iframe.replace(/\{rnd\}/g, new Date().getTime()))
.attr('scrolling', isTouch ? 'auto' : coming.iframe.scrolling)
.attr('src', coming.href);
// This helps IE
$(coming.wrap).bind('onReset', function () {
try {
$(this).find('iframe').hide().attr('src', '//about:blank').end().empty();
} catch (e) {}
});
if (coming.iframe.preload) {
F.showLoading();
iframe.one('load', function() {
$(this).data('ready', 1);
// iOS will lose scrolling if we resize
if (!isTouch) {
$(this).bind('load.fb', F.update);
}
// Without this trick:
// - iframe won't scroll on iOS devices
// - IE7 sometimes displays empty iframe
$(this).parents('.fancybox-wrap').width('100%').removeClass('fancybox-tmp').show();
F._afterLoad();
});
}
coming.content = iframe.appendTo( coming.inner );
if (!coming.iframe.preload) {
F._afterLoad();
}
},
_preloadImages: function() {
var group = F.group,
current = F.current,
len = group.length,
cnt = current.preload ? Math.min(current.preload, len - 1) : 0,
item,
i;
for (i = 1; i <= cnt; i += 1) {
item = group[ (current.index + i ) % len ];
if (item.type === 'image' && item.href) {
new Image().src = item.href;
}
}
},
_afterLoad: function () {
var coming = F.coming,
previous = F.current,
placeholder = 'fancybox-placeholder',
current,
content,
type,
scrolling,
href,
embed;
F.hideLoading();
if (!coming || F.isActive === false) {
return;
}
if (false === F.trigger('afterLoad', coming, previous)) {
coming.wrap.stop(true).trigger('onReset').remove();
F.coming = null;
return;
}
if (previous) {
F.trigger('beforeChange', previous);
previous.wrap.stop(true).removeClass('fancybox-opened')
.find('.fancybox-item, .fancybox-nav')
.remove();
}
F.unbindEvents();
current = coming;
content = coming.content;
type = coming.type;
scrolling = coming.scrolling;
$.extend(F, {
wrap : current.wrap,
skin : current.skin,
outer : current.outer,
inner : current.inner,
current : current,
previous : previous
});
href = current.href;
switch (type) {
case 'inline':
case 'ajax':
case 'html':
if (current.selector) {
content = $('<div>').html(content).find(current.selector);
} else if (isQuery(content)) {
if (!content.data(placeholder)) {
content.data(placeholder, $('<div class="' + placeholder + '"></div>').insertAfter( content ).hide() );
}
content = content.show().detach();
current.wrap.bind('onReset', function () {
if ($(this).find(content).length) {
content.hide().replaceAll( content.data(placeholder) ).data(placeholder, false);
}
});
}
break;
case 'image':
content = current.tpl.image.replace('{href}', href);
break;
case 'swf':
content = '<object id="fancybox-swf" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="100%"><param name="movie" value="' + href + '"></param>';
embed = '';
$.each(current.swf, function(name, val) {
content += '<param name="' + name + '" value="' + val + '"></param>';
embed += ' ' + name + '="' + val + '"';
});
content += '<embed src="' + href + '" type="application/x-shockwave-flash" width="100%" height="100%"' + embed + '></embed></object>';
break;
}
if (!(isQuery(content) && content.parent().is(current.inner))) {
current.inner.append( content );
}
// Give a chance for helpers or callbacks to update elements
F.trigger('beforeShow');
// Set scrolling before calculating dimensions
current.inner.css('overflow', scrolling === 'yes' ? 'scroll' : (scrolling === 'no' ? 'hidden' : scrolling));
// Set initial dimensions and start position
F._setDimension();
F.reposition();
F.isOpen = false;
F.coming = null;
F.bindEvents();
if (!F.isOpened) {
$('.fancybox-wrap').not( current.wrap ).stop(true).trigger('onReset').remove();
} else if (previous.prevMethod) {
F.transitions[ previous.prevMethod ]();
}
F.transitions[ F.isOpened ? current.nextMethod : current.openMethod ]();
F._preloadImages();
},
_setDimension: function () {
var viewport = F.getViewport(),
steps = 0,
canShrink = false,
canExpand = false,
wrap = F.wrap,
skin = F.skin,
inner = F.inner,
current = F.current,
width = current.width,
height = current.height,
minWidth = current.minWidth,
minHeight = current.minHeight,
maxWidth = current.maxWidth,
maxHeight = current.maxHeight,
scrolling = current.scrolling,
scrollOut = current.scrollOutside ? current.scrollbarWidth : 0,
margin = current.margin,
wMargin = getScalar(margin[1] + margin[3]),
hMargin = getScalar(margin[0] + margin[2]),
wPadding,
hPadding,
wSpace,
hSpace,
origWidth,
origHeight,
origMaxWidth,
origMaxHeight,
ratio,
width_,
height_,
maxWidth_,
maxHeight_,
iframe,
body;
// Reset dimensions so we could re-check actual size
wrap.add(skin).add(inner).width('auto').height('auto').removeClass('fancybox-tmp');
wPadding = getScalar(skin.outerWidth(true) - skin.width());
hPadding = getScalar(skin.outerHeight(true) - skin.height());
// Any space between content and viewport (margin, padding, border, title)
wSpace = wMargin + wPadding;
hSpace = hMargin + hPadding;
origWidth = isPercentage(width) ? (viewport.w - wSpace) * getScalar(width) / 100 : width;
origHeight = isPercentage(height) ? (viewport.h - hSpace) * getScalar(height) / 100 : height;
if (current.type === 'iframe') {
iframe = current.content;
if (current.autoHeight && iframe.data('ready') === 1) {
try {
if (iframe[0].contentWindow.document.location) {
inner.width( origWidth ).height(9999);
body = iframe.contents().find('body');
if (scrollOut) {
body.css('overflow-x', 'hidden');
}
origHeight = body.outerHeight(true);
}
} catch (e) {}
}
} else if (current.autoWidth || current.autoHeight) {
inner.addClass( 'fancybox-tmp' );
// Set width or height in case we need to calculate only one dimension
if (!current.autoWidth) {
inner.width( origWidth );
}
if (!current.autoHeight) {
inner.height( origHeight );
}
if (current.autoWidth) {
origWidth = inner.width();
}
if (current.autoHeight) {
origHeight = inner.height();
}
inner.removeClass( 'fancybox-tmp' );
}
width = getScalar( origWidth );
height = getScalar( origHeight );
ratio = origWidth / origHeight;
// Calculations for the content
minWidth = getScalar(isPercentage(minWidth) ? getScalar(minWidth, 'w') - wSpace : minWidth);
maxWidth = getScalar(isPercentage(maxWidth) ? getScalar(maxWidth, 'w') - wSpace : maxWidth);
minHeight = getScalar(isPercentage(minHeight) ? getScalar(minHeight, 'h') - hSpace : minHeight);
maxHeight = getScalar(isPercentage(maxHeight) ? getScalar(maxHeight, 'h') - hSpace : maxHeight);
// These will be used to determine if wrap can fit in the viewport
origMaxWidth = maxWidth;
origMaxHeight = maxHeight;
if (current.fitToView) {
maxWidth = Math.min(viewport.w - wSpace, maxWidth);
maxHeight = Math.min(viewport.h - hSpace, maxHeight);
}
maxWidth_ = viewport.w - wMargin;
maxHeight_ = viewport.h - hMargin;
if (current.aspectRatio) {
if (width > maxWidth) {
width = maxWidth;
height = getScalar(width / ratio);
}
if (height > maxHeight) {
height = maxHeight;
width = getScalar(height * ratio);
}
if (width < minWidth) {
width = minWidth;
height = getScalar(width / ratio);
}
if (height < minHeight) {
height = minHeight;
width = getScalar(height * ratio);
}
} else {
width = Math.max(minWidth, Math.min(width, maxWidth));
if (current.autoHeight && current.type !== 'iframe') {
inner.width( width );
height = inner.height();
}
height = Math.max(minHeight, Math.min(height, maxHeight));
}
// Try to fit inside viewport (including the title)
if (current.fitToView) {
inner.width( width ).height( height );
wrap.width( width + wPadding );
// Real wrap dimensions
width_ = wrap.width();
height_ = wrap.height();
if (current.aspectRatio) {
while ((width_ > maxWidth_ || height_ > maxHeight_) && width > minWidth && height > minHeight) {
if (steps++ > 19) {
break;
}
height = Math.max(minHeight, Math.min(maxHeight, height - 10));
width = getScalar(height * ratio);
if (width < minWidth) {
width = minWidth;
height = getScalar(width / ratio);
}
if (width > maxWidth) {
width = maxWidth;
height = getScalar(width / ratio);
}
inner.width( width ).height( height );
wrap.width( width + wPadding );
width_ = wrap.width();
height_ = wrap.height();
}
} else {
width = Math.max(minWidth, Math.min(width, width - (width_ - maxWidth_)));
height = Math.max(minHeight, Math.min(height, height - (height_ - maxHeight_)));
}
}
if (scrollOut && scrolling === 'auto' && height < origHeight && (width + wPadding + scrollOut) < maxWidth_) {
width += scrollOut;
}
inner.width( width ).height( height );
wrap.width( width + wPadding );
width_ = wrap.width();
height_ = wrap.height();
canShrink = (width_ > maxWidth_ || height_ > maxHeight_) && width > minWidth && height > minHeight;
canExpand = current.aspectRatio ? (width < origMaxWidth && height < origMaxHeight && width < origWidth && height < origHeight) : ((width < origMaxWidth || height < origMaxHeight) && (width < origWidth || height < origHeight));
$.extend(current, {
dim : {
width : getValue( width_ ),
height : getValue( height_ )
},
origWidth : origWidth,
origHeight : origHeight,
canShrink : canShrink,
canExpand : canExpand,
wPadding : wPadding,
hPadding : hPadding,
wrapSpace : height_ - skin.outerHeight(true),
skinSpace : skin.height() - height
});
if (!iframe && current.autoHeight && height > minHeight && height < maxHeight && !canExpand) {
inner.height('auto');
}
},
_getPosition: function (onlyAbsolute) {
var current = F.current,
viewport = F.getViewport(),
margin = current.margin,
width = F.wrap.width() + margin[1] + margin[3],
height = F.wrap.height() + margin[0] + margin[2],
rez = {
position: 'absolute',
top : margin[0],
left : margin[3]
};
if (current.autoCenter && current.fixed && !onlyAbsolute && height <= viewport.h && width <= viewport.w) {
rez.position = 'fixed';
} else if (!current.locked) {
rez.top += viewport.y;
rez.left += viewport.x;
}
rez.top = getValue(Math.max(rez.top, rez.top + ((viewport.h - height) * current.topRatio)));
rez.left = getValue(Math.max(rez.left, rez.left + ((viewport.w - width) * current.leftRatio)));
return rez;
},
_afterZoomIn: function () {
var current = F.current;
if (!current) {
return;
}
F.isOpen = F.isOpened = true;
F.wrap.css('overflow', 'visible').addClass('fancybox-opened');
F.update();
// Assign a click event
if ( current.closeClick || (current.nextClick && F.group.length > 1) ) {
F.inner.css('cursor', 'pointer').bind('click.fb', function(e) {
if (!$(e.target).is('a') && !$(e.target).parent().is('a')) {
e.preventDefault();
F[ current.closeClick ? 'close' : 'next' ]();
}
});
}
// Create a close button
if (current.closeBtn) {
$(current.tpl.closeBtn).appendTo(F.skin).bind('click.fb', function(e) {
e.preventDefault();
F.close();
});
}
// Create navigation arrows
if (current.arrows && F.group.length > 1) {
if (current.loop || current.index > 0) {
$(current.tpl.prev).appendTo(F.outer).bind('click.fb', F.prev);
}
if (current.loop || current.index < F.group.length - 1) {
$(current.tpl.next).appendTo(F.outer).bind('click.fb', F.next);
}
}
F.trigger('afterShow');
// Stop the slideshow if this is the last item
if (!current.loop && current.index === current.group.length - 1) {
F.play( false );
} else if (F.opts.autoPlay && !F.player.isActive) {
F.opts.autoPlay = false;
F.play();
}
},
_afterZoomOut: function ( obj ) {
obj = obj || F.current;
$('.fancybox-wrap').trigger('onReset').remove();
$.extend(F, {
group : {},
opts : {},
router : false,
current : null,
isActive : false,
isOpened : false,
isOpen : false,
isClosing : false,
wrap : null,
skin : null,
outer : null,
inner : null
});
F.trigger('afterClose', obj);
}
});
/*
* Default transitions
*/
F.transitions = {
getOrigPosition: function () {
var current = F.current,
element = current.element,
orig = current.orig,
pos = {},
width = 50,
height = 50,
hPadding = current.hPadding,
wPadding = current.wPadding,
viewport = F.getViewport();
if (!orig && current.isDom && element.is(':visible')) {
orig = element.find('img:first');
if (!orig.length) {
orig = element;
}
}
if (isQuery(orig)) {
pos = orig.offset();
if (orig.is('img')) {
width = orig.outerWidth();
height = orig.outerHeight();
}
} else {
pos.top = viewport.y + (viewport.h - height) * current.topRatio;
pos.left = viewport.x + (viewport.w - width) * current.leftRatio;
}
if (F.wrap.css('position') === 'fixed' || current.locked) {
pos.top -= viewport.y;
pos.left -= viewport.x;
}
pos = {
top : getValue(pos.top - hPadding * current.topRatio),
left : getValue(pos.left - wPadding * current.leftRatio),
width : getValue(width + wPadding),
height : getValue(height + hPadding)
};
return pos;
},
step: function (now, fx) {
var ratio,
padding,
value,
prop = fx.prop,
current = F.current,
wrapSpace = current.wrapSpace,
skinSpace = current.skinSpace;
if (prop === 'width' || prop === 'height') {
ratio = fx.end === fx.start ? 1 : (now - fx.start) / (fx.end - fx.start);
if (F.isClosing) {
ratio = 1 - ratio;
}
padding = prop === 'width' ? current.wPadding : current.hPadding;
value = now - padding;
F.skin[ prop ]( getScalar( prop === 'width' ? value : value - (wrapSpace * ratio) ) );
F.inner[ prop ]( getScalar( prop === 'width' ? value : value - (wrapSpace * ratio) - (skinSpace * ratio) ) );
}
},
zoomIn: function () {
var current = F.current,
startPos = current.pos,
effect = current.openEffect,
elastic = effect === 'elastic',
endPos = $.extend({opacity : 1}, startPos);
// Remove "position" property that breaks older IE
delete endPos.position;
if (elastic) {
startPos = this.getOrigPosition();
if (current.openOpacity) {
startPos.opacity = 0.1;
}
} else if (effect === 'fade') {
startPos.opacity = 0.1;
}
F.wrap.css(startPos).animate(endPos, {
duration : effect === 'none' ? 0 : current.openSpeed,
easing : current.openEasing,
step : elastic ? this.step : null,
complete : F._afterZoomIn
});
},
zoomOut: function () {
var current = F.current,
effect = current.closeEffect,
elastic = effect === 'elastic',
endPos = {opacity : 0.1};
if (elastic) {
endPos = this.getOrigPosition();
if (current.closeOpacity) {
endPos.opacity = 0.1;
}
}
F.wrap.animate(endPos, {
duration : effect === 'none' ? 0 : current.closeSpeed,
easing : current.closeEasing,
step : elastic ? this.step : null,
complete : F._afterZoomOut
});
},
changeIn: function () {
var current = F.current,
effect = current.nextEffect,
startPos = current.pos,
endPos = { opacity : 1 },
direction = F.direction,
distance = 200,
field;
startPos.opacity = 0.1;
if (effect === 'elastic') {
field = direction === 'down' || direction === 'up' ? 'top' : 'left';
if (direction === 'down' || direction === 'right') {
startPos[ field ] = getValue(getScalar(startPos[ field ]) - distance);
endPos[ field ] = '+=' + distance + 'px';
} else {
startPos[ field ] = getValue(getScalar(startPos[ field ]) + distance);
endPos[ field ] = '-=' + distance + 'px';
}
}
// Workaround for http://bugs.jquery.com/ticket/12273
if (effect === 'none') {
F._afterZoomIn();
} else {
F.wrap.css(startPos).animate(endPos, {
duration : current.nextSpeed,
easing : current.nextEasing,
complete : F._afterZoomIn
});
}
},
changeOut: function () {
var previous = F.previous,
effect = previous.prevEffect,
endPos = { opacity : 0.1 },
direction = F.direction,
distance = 200;
if (effect === 'elastic') {
endPos[ direction === 'down' || direction === 'up' ? 'top' : 'left' ] = ( direction === 'up' || direction === 'left' ? '-' : '+' ) + '=' + distance + 'px';
}
previous.wrap.animate(endPos, {
duration : effect === 'none' ? 0 : previous.prevSpeed,
easing : previous.prevEasing,
complete : function () {
$(this).trigger('onReset').remove();
}
});
}
};
/*
* Overlay helper
*/
F.helpers.overlay = {
defaults : {
closeClick : true, // if true, fancyBox will be closed when user clicks on the overlay
speedOut : 200, // duration of fadeOut animation
showEarly : true, // indicates if should be opened immediately or wait until the content is ready
css : {}, // custom CSS properties
locked : !isTouch, // if true, the content will be locked into overlay
fixed : true // if false, the overlay CSS position property will not be set to "fixed"
},
overlay : null, // current handle
fixed : false, // indicates if the overlay has position "fixed"
el : $('html'), // element that contains "the lock"
// Public methods
create : function(opts) {
opts = $.extend({}, this.defaults, opts);
if (this.overlay) {
this.close();
}
this.overlay = $('<div class="fancybox-overlay"></div>').appendTo( F.coming ? F.coming.parent : opts.parent );
this.fixed = false;
if (opts.fixed && F.defaults.fixed) {
this.overlay.addClass('fancybox-overlay-fixed');
this.fixed = true;
}
},
open : function(opts) {
var that = this;
opts = $.extend({}, this.defaults, opts);
if (this.overlay) {
this.overlay.unbind('.overlay').width('auto').height('auto');
} else {
this.create(opts);
}
if (!this.fixed) {
W.bind('resize.overlay', $.proxy( this.update, this) );
this.update();
}
if (opts.closeClick) {
this.overlay.bind('click.overlay', function(e) {
if ($(e.target).hasClass('fancybox-overlay')) {
if (F.isActive) {
F.close();
} else {
that.close();
}
return false;
}
});
}
this.overlay.css( opts.css ).show();
},
close : function() {
var scrollV, scrollH;
W.unbind('resize.overlay');
if (this.el.hasClass('fancybox-lock')) {
$('.fancybox-margin').removeClass('fancybox-margin');
scrollV = W.scrollTop();
scrollH = W.scrollLeft();
this.el.removeClass('fancybox-lock');
W.scrollTop( scrollV ).scrollLeft( scrollH );
}
$('.fancybox-overlay').remove().hide();
$.extend(this, {
overlay : null,
fixed : false
});
},
// Private, callbacks
update : function () {
var width = '100%', offsetWidth;
// Reset width/height so it will not mess
this.overlay.width(width).height('100%');
// jQuery does not return reliable result for IE
if (IE) {
offsetWidth = Math.max(document.documentElement.offsetWidth, document.body.offsetWidth);
if (D.width() > offsetWidth) {
width = D.width();
}
} else if (D.width() > W.width()) {
width = D.width();
}
this.overlay.width(width).height(D.height());
},
// This is where we can manipulate DOM, because later it would cause iframes to reload
onReady : function (opts, obj) {
var overlay = this.overlay;
$('.fancybox-overlay').stop(true, true);
if (!overlay) {
this.create(opts);
}
if (opts.locked && this.fixed && obj.fixed) {
if (!overlay) {
this.margin = D.height() > W.height() ? $('html').css('margin-right').replace("px", "") : false;
}
obj.locked = this.overlay.append( obj.wrap );
obj.fixed = false;
}
if (opts.showEarly === true) {
this.beforeShow.apply(this, arguments);
}
},
beforeShow : function(opts, obj) {
var scrollV, scrollH;
if (obj.locked) {
if (this.margin !== false) {
$('*').filter(function(){
return ($(this).css('position') === 'fixed' && !$(this).hasClass("fancybox-overlay") && !$(this).hasClass("fancybox-wrap") );
}).addClass('fancybox-margin');
this.el.addClass('fancybox-margin');
}
scrollV = W.scrollTop();
scrollH = W.scrollLeft();
this.el.addClass('fancybox-lock');
W.scrollTop( scrollV ).scrollLeft( scrollH );
}
this.open(opts);
},
onUpdate : function() {
if (!this.fixed) {
this.update();
}
},
afterClose: function (opts) {
// Remove overlay if exists and fancyBox is not opening
// (e.g., it is not being open using afterClose callback)
//if (this.overlay && !F.isActive) {
if (this.overlay && !F.coming) {
this.overlay.fadeOut(opts.speedOut, $.proxy( this.close, this ));
}
}
};
/*
* Title helper
*/
F.helpers.title = {
defaults : {
type : 'float', // 'float', 'inside', 'outside' or 'over',
position : 'bottom' // 'top' or 'bottom'
},
beforeShow: function (opts) {
var current = F.current,
text = current.title,
type = opts.type,
title,
target;
if ($.isFunction(text)) {
text = text.call(current.element, current);
}
if (!isString(text) || $.trim(text) === '') {
return;
}
title = $('<div class="fancybox-title fancybox-title-' + type + '-wrap">' + text + '</div>');
switch (type) {
case 'inside':
target = F.skin;
break;
case 'outside':
target = F.wrap;
break;
case 'over':
target = F.inner;
break;
default: // 'float'
target = F.skin;
title.appendTo('body');
if (IE) {
title.width( title.width() );
}
title.wrapInner('<span class="child"></span>');
//Increase bottom margin so this title will also fit into viewport
F.current.margin[2] += Math.abs( getScalar(title.css('margin-bottom')) );
break;
}
title[ (opts.position === 'top' ? 'prependTo' : 'appendTo') ](target);
}
};
// jQuery plugin initialization
$.fn.fancybox = function (options) {
var index,
that = $(this),
selector = this.selector || '',
run = function(e) {
var what = $(this).blur(), idx = index, relType, relVal;
if (!(e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) && !what.is('.fancybox-wrap')) {
relType = options.groupAttr || 'data-fancybox-group';
relVal = what.attr(relType);
if (!relVal) {
relType = 'rel';
relVal = what.get(0)[ relType ];
}
if (relVal && relVal !== '' && relVal !== 'nofollow') {
what = selector.length ? $(selector) : that;
what = what.filter('[' + relType + '="' + relVal + '"]');
idx = what.index(this);
}
options.index = idx;
// Stop an event from bubbling if everything is fine
if (F.open(what, options) !== false) {
e.preventDefault();
}
}
};
options = options || {};
index = options.index || 0;
if (!selector || options.live === false) {
that.unbind('click.fb-start').bind('click.fb-start', run);
} else {
D.undelegate(selector, 'click.fb-start').delegate(selector + ":not('.fancybox-item, .fancybox-nav')", 'click.fb-start', run);
}
this.filter('[data-fancybox-start=1]').trigger('click');
return this;
};
// Tests that need a body at doc ready
D.ready(function() {
var w1, w2;
if ( $.scrollbarWidth === undefined ) {
// http://benalman.com/projects/jquery-misc-plugins/#scrollbarwidth
$.scrollbarWidth = function() {
var parent = $('<div style="width:50px;height:50px;overflow:auto"><div/></div>').appendTo('body'),
child = parent.children(),
width = child.innerWidth() - child.height( 99 ).innerWidth();
parent.remove();
return width;
};
}
if ( $.support.fixedPosition === undefined ) {
$.support.fixedPosition = (function() {
var elem = $('<div style="position:fixed;top:20px;"></div>').appendTo('body'),
fixed = ( elem[0].offsetTop === 20 || elem[0].offsetTop === 15 );
elem.remove();
return fixed;
}());
}
$.extend(F.defaults, {
scrollbarWidth : $.scrollbarWidth(),
fixed : $.support.fixedPosition,
parent : $('body')
});
//Get real width of page scroll-bar
w1 = $(window).width();
H.addClass('fancybox-lock-test');
w2 = $(window).width();
H.removeClass('fancybox-lock-test');
$("<style type='text/css'>.fancybox-margin{margin-right:" + (w2 - w1) + "px;}</style>").appendTo("head");
});
}(window, document, jQuery));
\ No newline at end of file
/*
* jQuery OwlCarousel v1.3.3
*
* Copyright (c) 2013 Bartosz Wojciechowski
* http://www.owlgraphic.com/owlcarousel/
*
* Licensed under MIT
*
*/
/*JS Lint helpers: */
/*global dragMove: false, dragEnd: false, $, jQuery, alert, window, document */
/*jslint nomen: true, continue:true */
if (typeof Object.create !== "function") {
Object.create = function (obj) {
function F() {}
F.prototype = obj;
return new F();
};
}
(function ($, window, document) {
var Carousel = {
init : function (options, el) {
var base = this;
base.$elem = $(el);
base.options = $.extend({}, $.fn.owlCarousel.options, base.$elem.data(), options);
base.userOptions = options;
base.loadContent();
},
loadContent : function () {
var base = this, url;
function getData(data) {
var i, content = "";
if (typeof base.options.jsonSuccess === "function") {
base.options.jsonSuccess.apply(this, [data]);
} else {
for (i in data.owl) {
if (data.owl.hasOwnProperty(i)) {
content += data.owl[i].item;
}
}
base.$elem.html(content);
}
base.logIn();
}
if (typeof base.options.beforeInit === "function") {
base.options.beforeInit.apply(this, [base.$elem]);
}
if (typeof base.options.jsonPath === "string") {
url = base.options.jsonPath;
$.getJSON(url, getData);
} else {
base.logIn();
}
},
logIn : function () {
var base = this;
base.$elem.data("owl-originalStyles", base.$elem.attr("style"));
base.$elem.data("owl-originalClasses", base.$elem.attr("class"));
base.$elem.css({opacity: 0});
base.orignalItems = base.options.items;
base.checkBrowser();
base.wrapperWidth = 0;
base.checkVisible = null;
base.setVars();
},
setVars : function () {
var base = this;
if (base.$elem.children().length === 0) {return false; }
base.baseClass();
base.eventTypes();
base.$userItems = base.$elem.children();
base.itemsAmount = base.$userItems.length;
base.wrapItems();
base.$owlItems = base.$elem.find(".owl-item");
base.$owlWrapper = base.$elem.find(".owl-wrapper");
base.playDirection = "next";
base.prevItem = 0;
base.prevArr = [0];
base.currentItem = 0;
base.customEvents();
base.onStartup();
},
onStartup : function () {
var base = this;
base.updateItems();
base.calculateAll();
base.buildControls();
base.updateControls();
base.response();
base.moveEvents();
base.stopOnHover();
base.owlStatus();
if (base.options.transitionStyle !== false) {
base.transitionTypes(base.options.transitionStyle);
}
if (base.options.autoPlay === true) {
base.options.autoPlay = 5000;
}
base.play();
base.$elem.find(".owl-wrapper").css("display", "block");
if (!base.$elem.is(":visible")) {
base.watchVisibility();
} else {
base.$elem.css("opacity", 1);
}
base.onstartup = false;
base.eachMoveUpdate();
if (typeof base.options.afterInit === "function") {
base.options.afterInit.apply(this, [base.$elem]);
}
},
eachMoveUpdate : function () {
var base = this;
if (base.options.lazyLoad === true) {
base.lazyLoad();
}
if (base.options.autoHeight === true) {
base.autoHeight();
}
base.onVisibleItems();
if (typeof base.options.afterAction === "function") {
base.options.afterAction.apply(this, [base.$elem]);
}
},
updateVars : function () {
var base = this;
if (typeof base.options.beforeUpdate === "function") {
base.options.beforeUpdate.apply(this, [base.$elem]);
}
base.watchVisibility();
base.updateItems();
base.calculateAll();
base.updatePosition();
base.updateControls();
base.eachMoveUpdate();
if (typeof base.options.afterUpdate === "function") {
base.options.afterUpdate.apply(this, [base.$elem]);
}
},
reload : function () {
var base = this;
window.setTimeout(function () {
base.updateVars();
}, 0);
},
watchVisibility : function () {
var base = this;
if (base.$elem.is(":visible") === false) {
base.$elem.css({opacity: 0});
window.clearInterval(base.autoPlayInterval);
window.clearInterval(base.checkVisible);
} else {
return false;
}
base.checkVisible = window.setInterval(function () {
if (base.$elem.is(":visible")) {
base.reload();
base.$elem.animate({opacity: 1}, 200);
window.clearInterval(base.checkVisible);
}
}, 500);
},
wrapItems : function () {
var base = this;
base.$userItems.wrapAll("<div class=\"owl-wrapper\">").wrap("<div class=\"owl-item\"></div>");
base.$elem.find(".owl-wrapper").wrap("<div class=\"owl-wrapper-outer\">");
base.wrapperOuter = base.$elem.find(".owl-wrapper-outer");
base.$elem.css("display", "block");
},
baseClass : function () {
var base = this,
hasBaseClass = base.$elem.hasClass(base.options.baseClass),
hasThemeClass = base.$elem.hasClass(base.options.theme);
if (!hasBaseClass) {
base.$elem.addClass(base.options.baseClass);
}
if (!hasThemeClass) {
base.$elem.addClass(base.options.theme);
}
},
updateItems : function () {
var base = this, width, i;
if (base.options.responsive === false) {
return false;
}
if (base.options.singleItem === true) {
base.options.items = base.orignalItems = 1;
base.options.itemsCustom = false;
base.options.itemsDesktop = false;
base.options.itemsDesktopSmall = false;
base.options.itemsTablet = false;
base.options.itemsTabletSmall = false;
base.options.itemsMobile = false;
return false;
}
width = $(base.options.responsiveBaseWidth).width();
if (width > (base.options.itemsDesktop[0] || base.orignalItems)) {
base.options.items = base.orignalItems;
}
if (base.options.itemsCustom !== false) {
//Reorder array by screen size
base.options.itemsCustom.sort(function (a, b) {return a[0] - b[0]; });
for (i = 0; i < base.options.itemsCustom.length; i += 1) {
if (base.options.itemsCustom[i][0] <= width) {
base.options.items = base.options.itemsCustom[i][1];
}
}
} else {
if (width <= base.options.itemsDesktop[0] && base.options.itemsDesktop !== false) {
base.options.items = base.options.itemsDesktop[1];
}
if (width <= base.options.itemsDesktopSmall[0] && base.options.itemsDesktopSmall !== false) {
base.options.items = base.options.itemsDesktopSmall[1];
}
if (width <= base.options.itemsTablet[0] && base.options.itemsTablet !== false) {
base.options.items = base.options.itemsTablet[1];
}
if (width <= base.options.itemsTabletSmall[0] && base.options.itemsTabletSmall !== false) {
base.options.items = base.options.itemsTabletSmall[1];
}
if (width <= base.options.itemsMobile[0] && base.options.itemsMobile !== false) {
base.options.items = base.options.itemsMobile[1];
}
}
//if number of items is less than declared
if (base.options.items > base.itemsAmount && base.options.itemsScaleUp === true) {
base.options.items = base.itemsAmount;
}
},
response : function () {
var base = this,
smallDelay,
lastWindowWidth;
if (base.options.responsive !== true) {
return false;
}
lastWindowWidth = $(window).width();
base.resizer = function () {
if ($(window).width() !== lastWindowWidth) {
if (base.options.autoPlay !== false) {
window.clearInterval(base.autoPlayInterval);
}
window.clearTimeout(smallDelay);
smallDelay = window.setTimeout(function () {
lastWindowWidth = $(window).width();
base.updateVars();
}, base.options.responsiveRefreshRate);
}
};
$(window).resize(base.resizer);
},
updatePosition : function () {
var base = this;
base.jumpTo(base.currentItem);
if (base.options.autoPlay !== false) {
base.checkAp();
}
},
appendItemsSizes : function () {
var base = this,
roundPages = 0,
lastItem = base.itemsAmount - base.options.items;
base.$owlItems.each(function (index) {
var $this = $(this);
$this
.css({"width": base.itemWidth})
.data("owl-item", Number(index));
if (index % base.options.items === 0 || index === lastItem) {
if (!(index > lastItem)) {
roundPages += 1;
}
}
$this.data("owl-roundPages", roundPages);
});
},
appendWrapperSizes : function () {
var base = this,
width = base.$owlItems.length * base.itemWidth;
base.$owlWrapper.css({
"width": width * 2,
"left": 0
});
base.appendItemsSizes();
},
calculateAll : function () {
var base = this;
base.calculateWidth();
base.appendWrapperSizes();
base.loops();
base.max();
},
calculateWidth : function () {
var base = this;
base.itemWidth = Math.round(base.$elem.width() / base.options.items);
},
max : function () {
var base = this,
maximum = ((base.itemsAmount * base.itemWidth) - base.options.items * base.itemWidth) * -1;
if (base.options.items > base.itemsAmount) {
base.maximumItem = 0;
maximum = 0;
base.maximumPixels = 0;
} else {
base.maximumItem = base.itemsAmount - base.options.items;
base.maximumPixels = maximum;
}
return maximum;
},
min : function () {
return 0;
},
loops : function () {
var base = this,
prev = 0,
elWidth = 0,
i,
item,
roundPageNum;
base.positionsInArray = [0];
base.pagesInArray = [];
for (i = 0; i < base.itemsAmount; i += 1) {
elWidth += base.itemWidth;
base.positionsInArray.push(-elWidth);
if (base.options.scrollPerPage === true) {
item = $(base.$owlItems[i]);
roundPageNum = item.data("owl-roundPages");
if (roundPageNum !== prev) {
base.pagesInArray[prev] = base.positionsInArray[i];
prev = roundPageNum;
}
}
}
},
buildControls : function () {
var base = this;
if (base.options.navigation === true || base.options.pagination === true) {
base.owlControls = $("<div class=\"owl-controls\"/>").toggleClass("clickable", !base.browser.isTouch).appendTo(base.$elem);
}
if (base.options.pagination === true) {
base.buildPagination();
}
if (base.options.navigation === true) {
base.buildButtons();
}
},
buildButtons : function () {
var base = this,
buttonsWrapper = $("<div class=\"owl-buttons\"/>");
base.owlControls.append(buttonsWrapper);
base.buttonPrev = $("<div/>", {
"class" : "owl-prev",
"html" : base.options.navigationText[0] || ""
});
base.buttonNext = $("<div/>", {
"class" : "owl-next",
"html" : base.options.navigationText[1] || ""
});
buttonsWrapper
.append(base.buttonPrev)
.append(base.buttonNext);
buttonsWrapper.on("touchstart.owlControls mousedown.owlControls", "div[class^=\"owl\"]", function (event) {
event.preventDefault();
});
buttonsWrapper.on("touchend.owlControls mouseup.owlControls", "div[class^=\"owl\"]", function (event) {
event.preventDefault();
if ($(this).hasClass("owl-next")) {
base.next();
} else {
base.prev();
}
});
},
buildPagination : function () {
var base = this;
base.paginationWrapper = $("<div class=\"owl-pagination\"/>");
base.owlControls.append(base.paginationWrapper);
base.paginationWrapper.on("touchend.owlControls mouseup.owlControls", ".owl-page", function (event) {
event.preventDefault();
if (Number($(this).data("owl-page")) !== base.currentItem) {
base.goTo(Number($(this).data("owl-page")), true);
}
});
},
updatePagination : function () {
var base = this,
counter,
lastPage,
lastItem,
i,
paginationButton,
paginationButtonInner;
if (base.options.pagination === false) {
return false;
}
base.paginationWrapper.html("");
counter = 0;
lastPage = base.itemsAmount - base.itemsAmount % base.options.items;
for (i = 0; i < base.itemsAmount; i += 1) {
if (i % base.options.items === 0) {
counter += 1;
if (lastPage === i) {
lastItem = base.itemsAmount - base.options.items;
}
paginationButton = $("<div/>", {
"class" : "owl-page"
});
paginationButtonInner = $("<span></span>", {
"text": base.options.paginationNumbers === true ? counter : "",
"class": base.options.paginationNumbers === true ? "owl-numbers" : ""
});
paginationButton.append(paginationButtonInner);
paginationButton.data("owl-page", lastPage === i ? lastItem : i);
paginationButton.data("owl-roundPages", counter);
base.paginationWrapper.append(paginationButton);
}
}
base.checkPagination();
},
checkPagination : function () {
var base = this;
if (base.options.pagination === false) {
return false;
}
base.paginationWrapper.find(".owl-page").each(function () {
if ($(this).data("owl-roundPages") === $(base.$owlItems[base.currentItem]).data("owl-roundPages")) {
base.paginationWrapper
.find(".owl-page")
.removeClass("active");
$(this).addClass("active");
}
});
},
checkNavigation : function () {
var base = this;
if (base.options.navigation === false) {
return false;
}
if (base.options.rewindNav === false) {
if (base.currentItem === 0 && base.maximumItem === 0) {
base.buttonPrev.addClass("disabled");
base.buttonNext.addClass("disabled");
} else if (base.currentItem === 0 && base.maximumItem !== 0) {
base.buttonPrev.addClass("disabled");
base.buttonNext.removeClass("disabled");
} else if (base.currentItem === base.maximumItem) {
base.buttonPrev.removeClass("disabled");
base.buttonNext.addClass("disabled");
} else if (base.currentItem !== 0 && base.currentItem !== base.maximumItem) {
base.buttonPrev.removeClass("disabled");
base.buttonNext.removeClass("disabled");
}
}
},
updateControls : function () {
var base = this;
base.updatePagination();
base.checkNavigation();
if (base.owlControls) {
if (base.options.items >= base.itemsAmount) {
base.owlControls.hide();
} else {
base.owlControls.show();
}
}
},
destroyControls : function () {
var base = this;
if (base.owlControls) {
base.owlControls.remove();
}
},
next : function (speed) {
var base = this;
if (base.isTransition) {
return false;
}
base.currentItem += base.options.scrollPerPage === true ? base.options.items : 1;
if (base.currentItem > base.maximumItem + (base.options.scrollPerPage === true ? (base.options.items - 1) : 0)) {
if (base.options.rewindNav === true) {
base.currentItem = 0;
speed = "rewind";
} else {
base.currentItem = base.maximumItem;
return false;
}
}
base.goTo(base.currentItem, speed);
},
prev : function (speed) {
var base = this;
if (base.isTransition) {
return false;
}
if (base.options.scrollPerPage === true && base.currentItem > 0 && base.currentItem < base.options.items) {
base.currentItem = 0;
} else {
base.currentItem -= base.options.scrollPerPage === true ? base.options.items : 1;
}
if (base.currentItem < 0) {
if (base.options.rewindNav === true) {
base.currentItem = base.maximumItem;
speed = "rewind";
} else {
base.currentItem = 0;
return false;
}
}
base.goTo(base.currentItem, speed);
},
goTo : function (position, speed, drag) {
var base = this,
goToPixel;
if (base.isTransition) {
return false;
}
if (typeof base.options.beforeMove === "function") {
base.options.beforeMove.apply(this, [base.$elem]);
}
if (position >= base.maximumItem) {
position = base.maximumItem;
} else if (position <= 0) {
position = 0;
}
base.currentItem = base.owl.currentItem = position;
if (base.options.transitionStyle !== false && drag !== "drag" && base.options.items === 1 && base.browser.support3d === true) {
base.swapSpeed(0);
if (base.browser.support3d === true) {
base.transition3d(base.positionsInArray[position]);
} else {
base.css2slide(base.positionsInArray[position], 1);
}
base.afterGo();
base.singleItemTransition();
return false;
}
goToPixel = base.positionsInArray[position];
if (base.browser.support3d === true) {
base.isCss3Finish = false;
if (speed === true) {
base.swapSpeed("paginationSpeed");
window.setTimeout(function () {
base.isCss3Finish = true;
}, base.options.paginationSpeed);
} else if (speed === "rewind") {
base.swapSpeed(base.options.rewindSpeed);
window.setTimeout(function () {
base.isCss3Finish = true;
}, base.options.rewindSpeed);
} else {
base.swapSpeed("slideSpeed");
window.setTimeout(function () {
base.isCss3Finish = true;
}, base.options.slideSpeed);
}
base.transition3d(goToPixel);
} else {
if (speed === true) {
base.css2slide(goToPixel, base.options.paginationSpeed);
} else if (speed === "rewind") {
base.css2slide(goToPixel, base.options.rewindSpeed);
} else {
base.css2slide(goToPixel, base.options.slideSpeed);
}
}
base.afterGo();
},
jumpTo : function (position) {
var base = this;
if (typeof base.options.beforeMove === "function") {
base.options.beforeMove.apply(this, [base.$elem]);
}
if (position >= base.maximumItem || position === -1) {
position = base.maximumItem;
} else if (position <= 0) {
position = 0;
}
base.swapSpeed(0);
if (base.browser.support3d === true) {
base.transition3d(base.positionsInArray[position]);
} else {
base.css2slide(base.positionsInArray[position], 1);
}
base.currentItem = base.owl.currentItem = position;
base.afterGo();
},
afterGo : function () {
var base = this;
base.prevArr.push(base.currentItem);
base.prevItem = base.owl.prevItem = base.prevArr[base.prevArr.length - 2];
base.prevArr.shift(0);
if (base.prevItem !== base.currentItem) {
base.checkPagination();
base.checkNavigation();
base.eachMoveUpdate();
if (base.options.autoPlay !== false) {
base.checkAp();
}
}
if (typeof base.options.afterMove === "function" && base.prevItem !== base.currentItem) {
base.options.afterMove.apply(this, [base.$elem]);
}
},
stop : function () {
var base = this;
base.apStatus = "stop";
window.clearInterval(base.autoPlayInterval);
},
checkAp : function () {
var base = this;
if (base.apStatus !== "stop") {
base.play();
}
},
play : function () {
var base = this;
base.apStatus = "play";
if (base.options.autoPlay === false) {
return false;
}
window.clearInterval(base.autoPlayInterval);
base.autoPlayInterval = window.setInterval(function () {
base.next(true);
}, base.options.autoPlay);
},
swapSpeed : function (action) {
var base = this;
if (action === "slideSpeed") {
base.$owlWrapper.css(base.addCssSpeed(base.options.slideSpeed));
} else if (action === "paginationSpeed") {
base.$owlWrapper.css(base.addCssSpeed(base.options.paginationSpeed));
} else if (typeof action !== "string") {
base.$owlWrapper.css(base.addCssSpeed(action));
}
},
addCssSpeed : function (speed) {
return {
"-webkit-transition": "all " + speed + "ms ease",
"-moz-transition": "all " + speed + "ms ease",
"-o-transition": "all " + speed + "ms ease",
"transition": "all " + speed + "ms ease"
};
},
removeTransition : function () {
return {
"-webkit-transition": "",
"-moz-transition": "",
"-o-transition": "",
"transition": ""
};
},
doTranslate : function (pixels) {
return {
"-webkit-transform": "translate3d(" + pixels + "px, 0px, 0px)",
"-moz-transform": "translate3d(" + pixels + "px, 0px, 0px)",
"-o-transform": "translate3d(" + pixels + "px, 0px, 0px)",
"-ms-transform": "translate3d(" + pixels + "px, 0px, 0px)",
"transform": "translate3d(" + pixels + "px, 0px,0px)"
};
},
transition3d : function (value) {
var base = this;
base.$owlWrapper.css(base.doTranslate(value));
},
css2move : function (value) {
var base = this;
base.$owlWrapper.css({"left" : value});
},
css2slide : function (value, speed) {
var base = this;
base.isCssFinish = false;
base.$owlWrapper.stop(true, true).animate({
"left" : value
}, {
duration : speed || base.options.slideSpeed,
complete : function () {
base.isCssFinish = true;
}
});
},
checkBrowser : function () {
var base = this,
translate3D = "translate3d(0px, 0px, 0px)",
tempElem = document.createElement("div"),
regex,
asSupport,
support3d,
isTouch;
tempElem.style.cssText = " -moz-transform:" + translate3D +
"; -ms-transform:" + translate3D +
"; -o-transform:" + translate3D +
"; -webkit-transform:" + translate3D +
"; transform:" + translate3D;
regex = /translate3d\(0px, 0px, 0px\)/g;
asSupport = tempElem.style.cssText.match(regex);
support3d = (asSupport !== null && asSupport.length === 1);
isTouch = "ontouchstart" in window || window.navigator.msMaxTouchPoints;
base.browser = {
"support3d" : support3d,
"isTouch" : isTouch
};
},
moveEvents : function () {
var base = this;
if (base.options.mouseDrag !== false || base.options.touchDrag !== false) {
base.gestures();
base.disabledEvents();
}
},
eventTypes : function () {
var base = this,
types = ["s", "e", "x"];
base.ev_types = {};
if (base.options.mouseDrag === true && base.options.touchDrag === true) {
types = [
"touchstart.owl mousedown.owl",
"touchmove.owl mousemove.owl",
"touchend.owl touchcancel.owl mouseup.owl"
];
} else if (base.options.mouseDrag === false && base.options.touchDrag === true) {
types = [
"touchstart.owl",
"touchmove.owl",
"touchend.owl touchcancel.owl"
];
} else if (base.options.mouseDrag === true && base.options.touchDrag === false) {
types = [
"mousedown.owl",
"mousemove.owl",
"mouseup.owl"
];
}
base.ev_types.start = types[0];
base.ev_types.move = types[1];
base.ev_types.end = types[2];
},
disabledEvents : function () {
var base = this;
base.$elem.on("dragstart.owl", function (event) { event.preventDefault(); });
base.$elem.on("mousedown.disableTextSelect", function (e) {
return $(e.target).is('input, textarea, select, option');
});
},
gestures : function () {
/*jslint unparam: true*/
var base = this,
locals = {
offsetX : 0,
offsetY : 0,
baseElWidth : 0,
relativePos : 0,
position: null,
minSwipe : null,
maxSwipe: null,
sliding : null,
dargging: null,
targetElement : null
};
base.isCssFinish = true;
function getTouches(event) {
if (event.touches !== undefined) {
return {
x : event.touches[0].pageX,
y : event.touches[0].pageY
};
}
if (event.touches === undefined) {
if (event.pageX !== undefined) {
return {
x : event.pageX,
y : event.pageY
};
}
if (event.pageX === undefined) {
return {
x : event.clientX,
y : event.clientY
};
}
}
}
function swapEvents(type) {
if (type === "on") {
$(document).on(base.ev_types.move, dragMove);
$(document).on(base.ev_types.end, dragEnd);
} else if (type === "off") {
$(document).off(base.ev_types.move);
$(document).off(base.ev_types.end);
}
}
function dragStart(event) {
var ev = event.originalEvent || event || window.event,
position;
if (ev.which === 3) {
return false;
}
if (base.itemsAmount <= base.options.items) {
return;
}
if (base.isCssFinish === false && !base.options.dragBeforeAnimFinish) {
return false;
}
if (base.isCss3Finish === false && !base.options.dragBeforeAnimFinish) {
return false;
}
if (base.options.autoPlay !== false) {
window.clearInterval(base.autoPlayInterval);
}
if (base.browser.isTouch !== true && !base.$owlWrapper.hasClass("grabbing")) {
base.$owlWrapper.addClass("grabbing");
}
base.newPosX = 0;
base.newRelativeX = 0;
$(this).css(base.removeTransition());
position = $(this).position();
locals.relativePos = position.left;
locals.offsetX = getTouches(ev).x - position.left;
locals.offsetY = getTouches(ev).y - position.top;
swapEvents("on");
locals.sliding = false;
locals.targetElement = ev.target || ev.srcElement;
}
function dragMove(event) {
var ev = event.originalEvent || event || window.event,
minSwipe,
maxSwipe;
base.newPosX = getTouches(ev).x - locals.offsetX;
base.newPosY = getTouches(ev).y - locals.offsetY;
base.newRelativeX = base.newPosX - locals.relativePos;
if (typeof base.options.startDragging === "function" && locals.dragging !== true && base.newRelativeX !== 0) {
locals.dragging = true;
base.options.startDragging.apply(base, [base.$elem]);
}
if ((base.newRelativeX > 8 || base.newRelativeX < -8) && (base.browser.isTouch === true)) {
if (ev.preventDefault !== undefined) {
ev.preventDefault();
} else {
ev.returnValue = false;
}
locals.sliding = true;
}
if ((base.newPosY > 10 || base.newPosY < -10) && locals.sliding === false) {
$(document).off("touchmove.owl");
}
minSwipe = function () {
return base.newRelativeX / 5;
};
maxSwipe = function () {
return base.maximumPixels + base.newRelativeX / 5;
};
base.newPosX = Math.max(Math.min(base.newPosX, minSwipe()), maxSwipe());
if (base.browser.support3d === true) {
base.transition3d(base.newPosX);
} else {
base.css2move(base.newPosX);
}
}
function dragEnd(event) {
var ev = event.originalEvent || event || window.event,
newPosition,
handlers,
owlStopEvent;
ev.target = ev.target || ev.srcElement;
locals.dragging = false;
if (base.browser.isTouch !== true) {
base.$owlWrapper.removeClass("grabbing");
}
if (base.newRelativeX < 0) {
base.dragDirection = base.owl.dragDirection = "left";
} else {
base.dragDirection = base.owl.dragDirection = "right";
}
if (base.newRelativeX !== 0) {
newPosition = base.getNewPosition();
base.goTo(newPosition, false, "drag");
if (locals.targetElement === ev.target && base.browser.isTouch !== true) {
$(ev.target).on("click.disable", function (ev) {
ev.stopImmediatePropagation();
ev.stopPropagation();
ev.preventDefault();
$(ev.target).off("click.disable");
});
handlers = $._data(ev.target, "events").click;
owlStopEvent = handlers.pop();
handlers.splice(0, 0, owlStopEvent);
}
}
swapEvents("off");
}
base.$elem.on(base.ev_types.start, ".owl-wrapper", dragStart);
},
getNewPosition : function () {
var base = this,
newPosition = base.closestItem();
if (newPosition > base.maximumItem) {
base.currentItem = base.maximumItem;
newPosition = base.maximumItem;
} else if (base.newPosX >= 0) {
newPosition = 0;
base.currentItem = 0;
}
return newPosition;
},
closestItem : function () {
var base = this,
array = base.options.scrollPerPage === true ? base.pagesInArray : base.positionsInArray,
goal = base.newPosX,
closest = null;
$.each(array, function (i, v) {
if (goal - (base.itemWidth / 20) > array[i + 1] && goal - (base.itemWidth / 20) < v && base.moveDirection() === "left") {
closest = v;
if (base.options.scrollPerPage === true) {
base.currentItem = $.inArray(closest, base.positionsInArray);
} else {
base.currentItem = i;
}
} else if (goal + (base.itemWidth / 20) < v && goal + (base.itemWidth / 20) > (array[i + 1] || array[i] - base.itemWidth) && base.moveDirection() === "right") {
if (base.options.scrollPerPage === true) {
closest = array[i + 1] || array[array.length - 1];
base.currentItem = $.inArray(closest, base.positionsInArray);
} else {
closest = array[i + 1];
base.currentItem = i + 1;
}
}
});
return base.currentItem;
},
moveDirection : function () {
var base = this,
direction;
if (base.newRelativeX < 0) {
direction = "right";
base.playDirection = "next";
} else {
direction = "left";
base.playDirection = "prev";
}
return direction;
},
customEvents : function () {
/*jslint unparam: true*/
var base = this;
base.$elem.on("owl.next", function () {
base.next();
});
base.$elem.on("owl.prev", function () {
base.prev();
});
base.$elem.on("owl.play", function (event, speed) {
base.options.autoPlay = speed;
base.play();
base.hoverStatus = "play";
});
base.$elem.on("owl.stop", function () {
base.stop();
base.hoverStatus = "stop";
});
base.$elem.on("owl.goTo", function (event, item) {
base.goTo(item);
});
base.$elem.on("owl.jumpTo", function (event, item) {
base.jumpTo(item);
});
},
stopOnHover : function () {
var base = this;
if (base.options.stopOnHover === true && base.browser.isTouch !== true && base.options.autoPlay !== false) {
base.$elem.on("mouseover", function () {
base.stop();
});
base.$elem.on("mouseout", function () {
if (base.hoverStatus !== "stop") {
base.play();
}
});
}
},
lazyLoad : function () {
var base = this,
i,
$item,
itemNumber,
$lazyImg,
follow;
if (base.options.lazyLoad === false) {
return false;
}
for (i = 0; i < base.itemsAmount; i += 1) {
$item = $(base.$owlItems[i]);
if ($item.data("owl-loaded") === "loaded") {
continue;
}
itemNumber = $item.data("owl-item");
$lazyImg = $item.find(".lazyOwl");
if (typeof $lazyImg.data("src") !== "string") {
$item.data("owl-loaded", "loaded");
continue;
}
if ($item.data("owl-loaded") === undefined) {
$lazyImg.hide();
$item.addClass("loading").data("owl-loaded", "checked");
}
if (base.options.lazyFollow === true) {
follow = itemNumber >= base.currentItem;
} else {
follow = true;
}
if (follow && itemNumber < base.currentItem + base.options.items && $lazyImg.length) {
base.lazyPreload($item, $lazyImg);
}
}
},
lazyPreload : function ($item, $lazyImg) {
var base = this,
iterations = 0,
isBackgroundImg;
if ($lazyImg.prop("tagName") === "DIV") {
$lazyImg.css("background-image", "url(" + $lazyImg.data("src") + ")");
isBackgroundImg = true;
} else {
$lazyImg[0].src = $lazyImg.data("src");
}
function showImage() {
$item.data("owl-loaded", "loaded").removeClass("loading");
$lazyImg.removeAttr("data-src");
if (base.options.lazyEffect === "fade") {
$lazyImg.fadeIn(400);
} else {
$lazyImg.show();
}
if (typeof base.options.afterLazyLoad === "function") {
base.options.afterLazyLoad.apply(this, [base.$elem]);
}
}
function checkLazyImage() {
iterations += 1;
if (base.completeImg($lazyImg.get(0)) || isBackgroundImg === true) {
showImage();
} else if (iterations <= 100) {//if image loads in less than 10 seconds
window.setTimeout(checkLazyImage, 100);
} else {
showImage();
}
}
checkLazyImage();
},
autoHeight : function () {
var base = this,
$currentimg = $(base.$owlItems[base.currentItem]).find("img"),
iterations;
function addHeight() {
var $currentItem = $(base.$owlItems[base.currentItem]).height();
base.wrapperOuter.css("height", $currentItem + "px");
if (!base.wrapperOuter.hasClass("autoHeight")) {
window.setTimeout(function () {
base.wrapperOuter.addClass("autoHeight");
}, 0);
}
}
function checkImage() {
iterations += 1;
if (base.completeImg($currentimg.get(0))) {
addHeight();
} else if (iterations <= 100) { //if image loads in less than 10 seconds
window.setTimeout(checkImage, 100);
} else {
base.wrapperOuter.css("height", ""); //Else remove height attribute
}
}
if ($currentimg.get(0) !== undefined) {
iterations = 0;
checkImage();
} else {
addHeight();
}
},
completeImg : function (img) {
var naturalWidthType;
if (!img.complete) {
return false;
}
naturalWidthType = typeof img.naturalWidth;
if (naturalWidthType !== "undefined" && img.naturalWidth === 0) {
return false;
}
return true;
},
onVisibleItems : function () {
var base = this,
i;
if (base.options.addClassActive === true) {
base.$owlItems.removeClass("active");
}
base.visibleItems = [];
for (i = base.currentItem; i < base.currentItem + base.options.items; i += 1) {
base.visibleItems.push(i);
if (base.options.addClassActive === true) {
$(base.$owlItems[i]).addClass("active");
}
}
base.owl.visibleItems = base.visibleItems;
},
transitionTypes : function (className) {
var base = this;
//Currently available: "fade", "backSlide", "goDown", "fadeUp"
base.outClass = "owl-" + className + "-out";
base.inClass = "owl-" + className + "-in";
},
singleItemTransition : function () {
var base = this,
outClass = base.outClass,
inClass = base.inClass,
$currentItem = base.$owlItems.eq(base.currentItem),
$prevItem = base.$owlItems.eq(base.prevItem),
prevPos = Math.abs(base.positionsInArray[base.currentItem]) + base.positionsInArray[base.prevItem],
origin = Math.abs(base.positionsInArray[base.currentItem]) + base.itemWidth / 2,
animEnd = 'webkitAnimationEnd oAnimationEnd MSAnimationEnd animationend';
base.isTransition = true;
base.$owlWrapper
.addClass('owl-origin')
.css({
"-webkit-transform-origin" : origin + "px",
"-moz-perspective-origin" : origin + "px",
"perspective-origin" : origin + "px"
});
function transStyles(prevPos) {
return {
"position" : "relative",
"left" : prevPos + "px"
};
}
$prevItem
.css(transStyles(prevPos, 10))
.addClass(outClass)
.on(animEnd, function () {
base.endPrev = true;
$prevItem.off(animEnd);
base.clearTransStyle($prevItem, outClass);
});
$currentItem
.addClass(inClass)
.on(animEnd, function () {
base.endCurrent = true;
$currentItem.off(animEnd);
base.clearTransStyle($currentItem, inClass);
});
},
clearTransStyle : function (item, classToRemove) {
var base = this;
item.css({
"position" : "",
"left" : ""
}).removeClass(classToRemove);
if (base.endPrev && base.endCurrent) {
base.$owlWrapper.removeClass('owl-origin');
base.endPrev = false;
base.endCurrent = false;
base.isTransition = false;
}
},
owlStatus : function () {
var base = this;
base.owl = {
"userOptions" : base.userOptions,
"baseElement" : base.$elem,
"userItems" : base.$userItems,
"owlItems" : base.$owlItems,
"currentItem" : base.currentItem,
"prevItem" : base.prevItem,
"visibleItems" : base.visibleItems,
"isTouch" : base.browser.isTouch,
"browser" : base.browser,
"dragDirection" : base.dragDirection
};
},
clearEvents : function () {
var base = this;
base.$elem.off(".owl owl mousedown.disableTextSelect");
$(document).off(".owl owl");
$(window).off("resize", base.resizer);
},
unWrap : function () {
var base = this;
if (base.$elem.children().length !== 0) {
base.$owlWrapper.unwrap();
base.$userItems.unwrap().unwrap();
if (base.owlControls) {
base.owlControls.remove();
}
}
base.clearEvents();
base.$elem
.attr("style", base.$elem.data("owl-originalStyles") || "")
.attr("class", base.$elem.data("owl-originalClasses"));
},
destroy : function () {
var base = this;
base.stop();
window.clearInterval(base.checkVisible);
base.unWrap();
base.$elem.removeData();
},
reinit : function (newOptions) {
var base = this,
options = $.extend({}, base.userOptions, newOptions);
base.unWrap();
base.init(options, base.$elem);
},
addItem : function (htmlString, targetPosition) {
var base = this,
position;
if (!htmlString) {return false; }
if (base.$elem.children().length === 0) {
base.$elem.append(htmlString);
base.setVars();
return false;
}
base.unWrap();
if (targetPosition === undefined || targetPosition === -1) {
position = -1;
} else {
position = targetPosition;
}
if (position >= base.$userItems.length || position === -1) {
base.$userItems.eq(-1).after(htmlString);
} else {
base.$userItems.eq(position).before(htmlString);
}
base.setVars();
},
removeItem : function (targetPosition) {
var base = this,
position;
if (base.$elem.children().length === 0) {
return false;
}
if (targetPosition === undefined || targetPosition === -1) {
position = -1;
} else {
position = targetPosition;
}
base.unWrap();
base.$userItems.eq(position).remove();
base.setVars();
}
};
$.fn.owlCarousel = function (options) {
return this.each(function () {
if ($(this).data("owl-init") === true) {
return false;
}
$(this).data("owl-init", true);
var carousel = Object.create(Carousel);
carousel.init(options, this);
$.data(this, "owlCarousel", carousel);
});
};
$.fn.owlCarousel.options = {
items : 5,
itemsCustom : false,
itemsDesktop : [1199, 4],
itemsDesktopSmall : [979, 3],
itemsTablet : [768, 2],
itemsTabletSmall : false,
itemsMobile : [479, 1],
singleItem : false,
itemsScaleUp : false,
slideSpeed : 200,
paginationSpeed : 800,
rewindSpeed : 1000,
autoPlay : false,
stopOnHover : false,
navigation : false,
navigationText : ["prev", "next"],
rewindNav : true,
scrollPerPage : false,
pagination : true,
paginationNumbers : false,
responsive : true,
responsiveRefreshRate : 200,
responsiveBaseWidth : window,
baseClass : "owl-carousel",
theme : "owl-theme",
lazyLoad : false,
lazyFollow : true,
lazyEffect : "fade",
autoHeight : false,
jsonPath : false,
jsonSuccess : false,
dragBeforeAnimFinish : true,
mouseDrag : true,
touchDrag : true,
addClassActive : false,
transitionStyle : false,
beforeUpdate : false,
afterUpdate : false,
beforeInit : false,
afterInit : false,
beforeMove : false,
afterMove : false,
afterAction : false,
startDragging : false,
afterLazyLoad: false
};
}(jQuery, window, document));
...@@ -11,17 +11,12 @@ ...@@ -11,17 +11,12 @@
.checkout-index-index{ .checkout-index-index{
font-family: 'Outfit-Regular', sans-serif; font-family: 'Outfit-Regular', sans-serif;
} }
.page-header .header.content .logo{
position: unset;
left: unset;
}
.header.content .logo:after{ .header.content .logo:after{
content: ''; content: '';
display: inline-block; display: inline-block;
width: 1px; width: 1px;
height: 30px; height: 30px;
margin-left: 10px; margin-left: 10px;
background-color: #ccc;
vertical-align: middle; vertical-align: middle;
-webkit-transform: rotate(30deg); -webkit-transform: rotate(30deg);
transform: rotate(30deg); transform: rotate(30deg);
...@@ -64,6 +59,11 @@ ...@@ -64,6 +59,11 @@
.header.content{padding-top: 15px !important;margin-bottom: 0px !important;} .header.content{padding-top: 15px !important;margin-bottom: 0px !important;}
} }
@media(min-width: 1024px){
li#payment{
margin-top: -9%;
}
}
@media(max-width: 639.98px){ @media(max-width: 639.98px){
.header.content{padding-top: 15px !important;margin-bottom: 0px !important;} .header.content{padding-top: 15px !important;margin-bottom: 0px !important;}
.page-layout-checkout .header.content{justify-content:unset;gap:unset;} .page-layout-checkout .header.content{justify-content:unset;gap:unset;}
...@@ -72,6 +72,7 @@ ...@@ -72,6 +72,7 @@
.header.content .secure-wrapper em{top: unset !important;font-size: 16px !important;} .header.content .secure-wrapper em{top: unset !important;font-size: 16px !important;}
.header.content .logo:after{left: 5px;} .header.content .logo:after{left: 5px;}
.header.content .logo img{max-width: 60%;} .header.content .logo img{max-width: 60%;}
.payment-method-note{font-size: 12px;}
} }
.opc>li{padding: 0;padding-bottom: 20px;} .opc>li{padding: 0;padding-bottom: 20px;}
...@@ -194,8 +195,9 @@ ...@@ -194,8 +195,9 @@
button.action.secondary{ button.action.secondary{
background: #000000; background: #000000;
} }
cc
.checkout-payment-method .opc-payment-additional.discount-code{ .checkout-payment-method .opc-payment-additional.discount-code{
display: none;
} }
.opc-block-summary .payment-option .form-discount .actions-toolbar .action{ .opc-block-summary .payment-option .form-discount .actions-toolbar .action{
background: #000000; background: #000000;
...@@ -323,10 +325,7 @@ ...@@ -323,10 +325,7 @@
margin-top: 100px; margin-top: 100px;
} }
#opc-sidebar{ #opc-sidebar{
margin-top: 30px; margin-top: -5%;
}
.header.content > a{
margin-left: 0 !important;
} }
} }
@media(max-width: 639.98px){ @media(max-width: 639.98px){
...@@ -368,7 +367,6 @@ ...@@ -368,7 +367,6 @@
vertical-align: bottom; vertical-align: bottom;
margin-right: 15px; margin-right: 15px;
} }
#checkout-step-shipping_method{padding-bottom: 50px;}
} }
</style> </style>
<div id="checkout" data-bind="scope:'checkout'" class="checkout-container"> <div id="checkout" data-bind="scope:'checkout'" class="checkout-container">
......
...@@ -8,6 +8,11 @@ ...@@ -8,6 +8,11 @@
* @var \Magento\Paypal\Block\Express\Shortcut $block * @var \Magento\Paypal\Block\Express\Shortcut $block
*/ */
?> ?>
<style type="text/css">
.displayno{
display: none;
}
</style>
<?php <?php
$labelPosition = ''; $labelPosition = '';
if ($block->isOrPositionBefore()) { if ($block->isOrPositionBefore()) {
...@@ -37,7 +42,7 @@ if ($block->getIsInCatalogProduct()) { ...@@ -37,7 +42,7 @@ if ($block->getIsInCatalogProduct()) {
$class = 'checkout-logo-medium'; $class = 'checkout-logo-medium';
} else { } else {
$imgsrc = $block->getViewFileUrl('Magento_Paypal::images/paypal-credit.png'); $imgsrc = $block->getViewFileUrl('Magento_Paypal::images/paypal-credit.png');
$class = 'paypal-credit'; $class = 'paypal-credit displayno';
} }
?> ?>
<div class="<?= $class ?>"> <div class="<?= $class ?>">
......
...@@ -19,22 +19,16 @@ $logoHeight = $logoSizeResolver !== null && $logoSizeResolver->getHeight() ...@@ -19,22 +19,16 @@ $logoHeight = $logoSizeResolver !== null && $logoSizeResolver->getHeight()
? $logoSizeResolver->getHeight() ? $logoSizeResolver->getHeight()
: $block->getLogoHeight(); : $block->getLogoHeight();
?> ?>
<span data-action="toggle-nav" class="action nav-toggle"><span><?= $block->escapeHtml(__('Toggle Nav')) ?></span></span> <span data-action="toggle-nav" class="action nav-toggle"><span><?= $block->escapeHtml(__('Toggle Nav')) ?></span></span>
<a <a
class="logo" class="logo"
href="<?= $block->escapeUrl($block->getUrl('')) ?>" href="<?= $block->escapeUrl($block->getUrl('')) ?>"
title="<?= $block->escapeHtmlAttr($storeName) ?>" title="<?= $block->escapeHtmlAttr($storeName) ?>"
aria-label="store logo"> aria-label="store logo">
<img src="<?= $block->escapeUrl($block->getLogoSrc()) ?>" <img src="<?= $block->escapeUrl($block->getLogoSrc()) ?>"
title="<?= $block->escapeHtmlAttr($block->getLogoAlt()) ?>" title="<?= $block->escapeHtmlAttr($block->getLogoAlt()) ?>"
alt="<?= $block->escapeHtmlAttr($block->getLogoAlt()) ?>" alt="<?= $block->escapeHtmlAttr($block->getLogoAlt()) ?>"
<?= $logoWidth ? 'width="' . $block->escapeHtmlAttr($logoWidth) . '"' : '' ?> <?= $logoWidth ? 'width="' . $block->escapeHtmlAttr($logoWidth) . '"' : '' ?>
<?= $logoHeight ? 'height="' . $block->escapeHtmlAttr($logoHeight) . '"' : '' ?> <?= $logoHeight ? 'height="' . $block->escapeHtmlAttr($logoHeight) . '"' : '' ?>
/> />
</a> </a>
<span class="secure-wrapper">
<i class="iconfont icon-safepay"></i>
<em>SECURE CHECKOUT</em>
</span>
\ No newline at end of file
...@@ -135,7 +135,7 @@ ...@@ -135,7 +135,7 @@
right: 112px !important; right: 112px !important;
} }
.header.content > a{ .header.content > a{
margin-left: 15%; margin-left: 17%;
} }
//.page-header { //.page-header {
...@@ -2472,6 +2472,13 @@ span.qty-wrapper { ...@@ -2472,6 +2472,13 @@ span.qty-wrapper {
.product.actions.product-item-actions{ .product.actions.product-item-actions{
display: none; display: none;
} }
.payment-option .form-discount .actions-toolbar .action{
background-color: #000000;
}
.opc-block-summary {
margin-bottom: 0px !important;
}
button.primary.action.create { button.primary.action.create {
background: #000; background: #000;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment