Commit 94a98b12 by lmf

增加onepagecheckout插件

parent d6818c77
......@@ -137,13 +137,13 @@ class Add extends \Magento\Checkout\Controller\Cart implements HttpPostActionInt
);
if (!$this->_checkoutSession->getNoCartRedirect(true)) {
if ($this->shouldRedirectToCart()) {
$message = __(
'You added %1 to your shopping cart.',
$product->getName()
);
$this->messageManager->addSuccessMessage($message);
}
// if ($this->shouldRedirectToCart()) {
// $message = __(
// 'You added %1 to your shopping cart.',
// $product->getName()
// );
// $this->messageManager->addSuccessMessage($message);
// }
if ($this->cart->getQuote()->getHasError()) {
$errors = $this->cart->getQuote()->getErrors();
foreach ($errors as $error) {
......
......@@ -65,7 +65,7 @@ Message,Message
"Print receipt","Print receipt"
"Apply Discount Code","Apply Discount Code"
"Enter discount code","Enter discount code"
"Apply Discount","Apply Discount"
"Apply Discount","Apply Code"
"Cancel Coupon","Cancel Coupon"
"Shopping Cart Items","Shopping Cart Items"
Item,Item
......
<?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
}
}
}
};
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': 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>
<div class="payment-option opc-payment-additional discount-code">
<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));
......@@ -7,7 +7,6 @@
-->
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="checkout" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceBlock name="page.bottom.container" remove="true"/>
<referenceContainer name="content">
<block class="Magento\Checkout\Block\Onepage" name="checkout.root" template="Magento_Checkout::onepage.phtml" cacheable="false">
<arguments>
......
......@@ -69,7 +69,7 @@
class="message notice">
<span text="errorValidationMessage()" />
</div>
<div class="actions-toolbar" id="shipping-method-buttons-container">
<div class="actions-toolbar" id="shipping-method-buttons-container" style="display: none;">
<div class="primary">
<button data-role="opc-continue" type="submit" class="button action continue primary">
<span data-v-20221108="" class="secure"><img data-v-b14bd780="" alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADEAAAA3CAYAAAClxaIBAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjMyODNDODA2MkIwNTExRUNCNUFCRkFGMzY4RjkyOTdCIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjMyODNDODA3MkIwNTExRUNCNUFCRkFGMzY4RjkyOTdCIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MzI4M0M4MDQyQjA1MTFFQ0I1QUJGQUYzNjhGOTI5N0IiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MzI4M0M4MDUyQjA1MTFFQ0I1QUJGQUYzNjhGOTI5N0IiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7niMRCAAAEKklEQVR42tSaW0gVQRjHt01SwiyTJKuHiugiEVIUVhBlPRRBN7ppUCT2EGVB0A2SoB6iJ596iPJBLJPM7B5SdDXNyjIxy0iLIsEoNYuu1vb/8DuwnM7OzszZPR7/8FNxZ3b2f+ab2ZlvTj/LsgyPlQhWgvlgNkgAXaAS3ABnQIenLZIJj0gGB8EHSyy6fgCM9KptL24yCOwFbZaaPnG9xN40EQ+2gxYrPL0DO/l+Ws/ST2NMDAM5YBMY42Fkt4BCUADeq1RUMTELrAVZIMnwT1/AKTZU5YWJiWAxWAOmG5HXA1AKroM6WRNxIJ1ZAqaCWKP3RQ9ZDS6AGnAf/LCbSMPvuWAeSAXjjOhXM2jk984tMvEUf0wx+q7qTX6b9mV9Nu2x1Uf1g0z8jsYQAY9AJq+/RPpp8rwcbQYaeEovAfEu5btMz1eU4RugN/Y62/9GuNRpj8GPzigx8Bjs5hebXaNc6nWQidYoMbCReyLUWk2k92TiXRQYoPB54XB9iEv9t6bqitGHMbBdYIBkCq79okgyOZxae8nAYd62Cgeu4NqbQE+08lo+0gbOgWKJsq9dTHSQib/gVYRNvAT7JctWOQx40nN7vNVFeI+QqVj+l8O1WruJ2giGUR7oVqgzQ7BIrbGnbAaCdstfPQVHFBIA48FVrhdKTYGyMezoG7taqPnpdvMsskC02gRbJO+5A2xw2efcCzUH39U0cAtM40brBeXyJe9ZIGGAdDNUBjBNMTQucpfb75HvUL5cMoTOC8LHru8gySl51ijx8NVghcND0Nh6EqLOOAkD1yQNkM7Z6wa/0ktdQqcMzARnHcrQ2CoPCqtKiffQNZCssNcvESWUJwvcD1WYWWptveCWnqxQ6AFSJ+d/HXuigfM7obReYcAXcm9cAV8F5S6D4YrZlqL/dqMhPplMwXh4CHIke4PGToLgepFiDwQ0SSYrPgC8kZiZkl1MjBVcy9c0UKGS2t8qcUOahVZrpOKzNQ2QMlRMxEqc+AR65ZCCgbQwDNzmKVzpkGWbwovvpISBATxOdJUOTFUT/UGzgpHzLibKwzBwTHRv0f71D8iVnPZoihwNrjpc3wPGai7fKS+2S5z4dw+DYsU11eWg+qlhjANLZvKQMTEYdCgaKQtaE+nqksyEESOTOgeb+RxNNrRIR/kwJFkzjGg3ly13jiQ/PR63IqtFfpxjm7zsiITy/DzHTuHMiG6IyIjCNkulgs5hfBqvdON8MEBb5DmqlUyNhqgnlvlgoMnoOTM3ImGCVKGYAHMTpVEzdE+tzDAapi3iKg8MPDN6ztG1k9pmmA9AX8CiQ/w2zfp32EB4ZyQefXGKshn1itPoSSuKvrRlX/UWShrY52G7npoIkMvJrVD6CJZ43aYfJogJ4HSQgRMgxY/2dF52KloOlnKy7YJfjfwTYAD0328CQiS8EQAAAABJRU5ErkJggg=="></span>
......
......@@ -19,8 +19,6 @@ $logoHeight = $logoSizeResolver !== null && $logoSizeResolver->getHeight()
? $logoSizeResolver->getHeight()
: $block->getLogoHeight();
?>
<span data-action="toggle-nav" class="action nav-toggle"><span><?= $block->escapeHtml(__('Toggle Nav')) ?></span></span>
<a
class="logo"
......@@ -34,7 +32,3 @@ $logoHeight = $logoSizeResolver !== null && $logoSizeResolver->getHeight()
<?= $logoHeight ? 'height="' . $block->escapeHtmlAttr($logoHeight) . '"' : '' ?>
/>
</a>
<span class="secure-wrapper">
<i class="iconfont icon-safepay"></i>
<em>SECURE CHECKOUT</em>
</span>
\ No newline at end of file
......@@ -2454,5 +2454,12 @@ span.qty-wrapper {
.product.actions.product-item-actions{
display: none;
}
.payment-option .form-discount .actions-toolbar .action{
background-color: #000000;
}
.opc-block-summary {
margin-bottom: 0px !important;
}
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