diff --git a/.gitignore b/.gitignore index 1f08e5627debd6fb4107eedb52fc085707a752fd..490342a4bd161785436404e9141103b271782ea1 100644 --- a/.gitignore +++ b/.gitignore @@ -28,4 +28,6 @@ atlassian* /pub/media/* /pub/media/customer/* /pub/media/downloadable/* +/pub/media/theme/* +/pub/media/theme/customization/* /var/* diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown index 32e34eceb038f78b37f2774d60edce5e4f8ea082..4fe70ee312a9377c9fc99add85911b304fc27497 100644 --- a/CHANGELOG.markdown +++ b/CHANGELOG.markdown @@ -1,3 +1,47 @@ +2.0.0.0-dev41 +============= +* All-new look & feel of backend UI -- "Magento 2 backend" theme + * This theme includes "Magento User Interface Library" -- a set of reusable CSS-classes, icons and fonts +* Theme editing features (in backend UI): + * Ability to view static resources, such as CSS and JavaScript files, which are inherited by virtual themes from physical themes and application, and library + * Ability to upload and edit custom CSS/JavaScript code assigned to a particular virtual theme + * Ability to manage image and font assets for virtual themes + * The uploaded or edited theme resources are used in page generation + * Ability to rename virtual themes + * Physical themes are read-only +* Visual design editor: + * Ability to enter a "Design Mode" directly from the list of "My Customizations" in "Design Gallery" + * Updated styling of theme selector and VDE toolbars +* Added functional limitations (managed through configuration files): + * Ability to limit maximum number of store views in the system + * Ability to limit maximum number of admin user records in the system +* Introduced mechanism of early discovery of memory leaks in integration tests: + * Added ability to integration testing framework to detect usage of memory and estimate memory leaks using OS tools outside of PHP process + * Also ability to set memory usage threshold which would deliberately trigger error, if integration tests reach it +* Refactoring in integration tests: + * Broke down `Magento_Test_Bootstrap` into smaller testable classes + * Minimized amount of logic in `bootstrap.php` of integration tests + * Factored out memory utility functions from memory integration tests into a separate helper + * Removed hard-coding of the default setting values from `Magento_Test_Bootstrap` in favor of requiring some crucial settings + * Fixed integration tests dependency on `app/etc/local.xml`, changes in which were involved into the sandbox hash calculation `dev/tests/integration/tmp/sandbox-<db_vendor>-<hash>` +* Improvements in JavaScript widget "Suggest" (`pub/lib/mage/backend/suggest.js`): + * Added ability to set callback for "item selection" + * Added ability to provide a template in widget options + * Implemented "multiple suggestions" ability directly in this widget and removed the "multisuggest" widget +* Converted several grids in backend from PHP implementation to declarations in layout +* Other various improvements: + * Factored out logic of handling theme images from `Mage_Core_Model_Theme` into `Mage_Core_Model_Theme_Image` + * Ability to filter file extensions in uploader component + * Publication of resources linked in CSS-files will only log error instead of crashing page generation process +* Bug fixes: + * Fixed several memory leaks in different places, related with dispatching controller actions multiple times in integration tests and with excessive reference to `Mage_Core_Model_App` object + * Fixed integration test in `Mage_Install` module that verifies encryption key length + * Fixed DHL shipping carrier declaration in config that caused inability to use it with shopping cart price rules + * Fixed issues in generating of configurable product variations when the button "Generate" is invoked second time + * Fixed an error that caused inability to create a theme in Windows environment in developer mode + * Fixed various errors in JavaScript tests for visual design editor + * Fixed broken "Edit" link on backend product management page + 2.0.0.0-dev40 ============= * Implemented ability to customize all the main directory paths for the application, i.e. locations of `var`, `etc`, `media` and other directories diff --git a/app/Mage.php b/app/Mage.php index 02c46493940c31431cbebad64edd8a414ef9939e..825c050ee57bf87a0b47da71fa8f161da4617265 100644 --- a/app/Mage.php +++ b/app/Mage.php @@ -175,7 +175,7 @@ final class Mage 'revision' => '0', 'patch' => '0', 'stability' => 'dev', - 'number' => '40', + 'number' => '41', ); } diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit.php index 1191baec997544c16c53e5bcc19b99f4a2bb073c..1be54193cdc44da39c7526ff541c58020b2dfed8 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit.php @@ -61,9 +61,10 @@ class Mage_Adminhtml_Block_Catalog_Product_Edit extends Mage_Adminhtml_Block_Wid if (!$this->getRequest()->getParam('popup')) { $this->addChild('back_button', 'Mage_Adminhtml_Block_Widget_Button', array( 'label' => Mage::helper('Mage_Catalog_Helper_Data')->__('Back'), + 'title' => Mage::helper('Mage_Catalog_Helper_Data')->__('Back'), 'onclick' => 'setLocation(\'' . $this->getUrl('*/*/', array('store' => $this->getRequest()->getParam('store', 0))) . '\')', - 'class' => 'back' + 'class' => 'action-back' )); } else { $this->addChild('back_button', 'Mage_Adminhtml_Block_Widget_Button', array( diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Attributes.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Attributes.php index a3cdf785afcd58ab0711ecb8df3ed19451b103c6..98097ed1090dafd2e140b5502ebde87e5a2f556d 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Attributes.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Attributes.php @@ -62,7 +62,7 @@ class Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Attributes extends Mage_Admi $fieldset = $form->addFieldset('group_fields' . $group->getId(), array( 'legend' => Mage::helper('Mage_Catalog_Helper_Data')->__($group->getAttributeGroupName()), - 'class' => 'fieldset-wide' + 'collapsable' => true )); $attributes = $this->getGroupAttributes(); diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Attributes/Create.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Attributes/Create.php index 1b873fe6f2c04de8a5f85ff1968cd94658d4eae1..82f66b6658b0ed9d7765db3924733b925107d9bf 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Attributes/Create.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Attributes/Create.php @@ -59,8 +59,8 @@ class Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Attributes_Create extends Ma $this->setId('create_attribute_' . $this->getConfig()->getGroupId()) ->setOnClick($this->getJsObjectName() . '.create();') ->setType('button') - ->setClass('add') - ->setLabel(Mage::helper('Mage_Adminhtml_Helper_Data')->__('Create New Attribute')); + ->setClass('action-add') + ->setLabel(Mage::helper('Mage_Adminhtml_Helper_Data')->__('Add Attribute')); $this->getConfig() ->setUrl($this->getUrl( diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Options/Option.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Options/Option.php index fae5ad7042fdc0177380e641bde97a07cba7817d..586e53d870c7166f12bf5a1911b898a81be089d0 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Options/Option.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Options/Option.php @@ -154,7 +154,7 @@ class Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Options_Option extends Mage_ public function getTypeSelectHtml() { - $select = $this->getLayout()->createBlock('Mage_Core_Block_Html_Select') + $select = $this->getLayout()->createBlock('Mage_Adminhtml_Block_Html_Select') ->setData(array( 'id' => $this->getFieldId().'_{{id}}_type', 'class' => 'select select-product-option-type required-option-select' @@ -167,7 +167,7 @@ class Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Options_Option extends Mage_ public function getRequireSelectHtml() { - $select = $this->getLayout()->createBlock('Mage_Core_Block_Html_Select') + $select = $this->getLayout()->createBlock('Mage_Adminhtml_Block_Html_Select') ->setData(array( 'id' => $this->getFieldId().'_{{id}}_is_require', 'class' => 'select' diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Options/Type/Abstract.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Options/Type/Abstract.php index 7724605a743323ec24b7ff304b0cbe4505be9775..f23fc2bc472f7272b805503d6c83cc7e55589062 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Options/Type/Abstract.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Options/Type/Abstract.php @@ -39,7 +39,7 @@ class Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Options_Type_Abstract extend protected function _prepareLayout() { $this->setChild('option_price_type', - $this->getLayout()->addBlock('Mage_Core_Block_Html_Select', '', $this->getNameInLayout()) + $this->getLayout()->addBlock('Mage_Adminhtml_Block_Html_Select', '', $this->getNameInLayout()) ->setData(array( 'id' => 'product_option_{{option_id}}_price_type', 'class' => 'select product-option-price-type' diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Frontend/Product/Watermark.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Frontend/Product/Watermark.php index b94eff85227c3bafdd256c041a874d51465756b0..944de19715da715b8337f06ac6c6243fbad54c3f 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Frontend/Product/Watermark.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Frontend/Product/Watermark.php @@ -32,7 +32,7 @@ * @author Magento Core Team <core@magentocommerce.com> */ class Mage_Adminhtml_Block_Catalog_Product_Frontend_Product_Watermark - extends Mage_Core_Block_Template + extends Mage_Backend_Block_Abstract implements Varien_Data_Form_Element_Renderer_Interface { const XML_PATH_IMAGE_TYPES = 'global/catalog/product/media/image_types'; diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/BaseImage.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/BaseImage.php index 04859509b5aec7e6c53bd089d03f253f3556aee8..edb316cbd43db15d5f3acfabed261000de19b261 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/BaseImage.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/BaseImage.php @@ -112,22 +112,24 @@ class Mage_Adminhtml_Block_Catalog_Product_Helper_Form_BaseImage extends Varien_ $html = '<input id="' . $htmlId .'-upload" type="file" name="image" ' . 'data-url="' . $uploadUrl . '" style="display:none" />' . '<input id="' . $htmlId . '" type="hidden" name="'. $this->getName() .'" />' - . '<div id="' . $htmlId . '-container" data-main="' . $this->getEscapedValue() . '" ' + . '<div id="' . $htmlId . '-container" class="images" data-main="' . $this->getEscapedValue() . '" ' . 'data-images="' . $this->_coreHelper->escapeHtml( - $this->_coreHelper->jsonEncode($gallery ? $gallery->toArray() : array()) - ) . '">' - . '<span id="' . $htmlId . '-upload-placeholder"></span>' + $this->_coreHelper->jsonEncode($gallery ? $gallery->toArray() : array()) + ) . '">' + . '<div class="image image-placeholder" id="' . $htmlId . '-upload-placeholder"><p class="image-placeholder-text">' . $this->helper('Mage_Catalog_Helper_Data')->__('Click here or drag and drop to add images') . '</p></div>' . '<script id="' . $htmlId . '-template" type="text/x-jquery-tmpl">' - . '<span class="container">' - . '<span class="main-sticker">' . $this->helper('Mage_Catalog_Helper_Data')->__('Main') . '</span>' - . '<span class="close">×</span>' - . '<img class="base-image-uploader" src="${url}" data-position="${position}" alt="${label}" />' - . '<div class="drag-zone">' - . '<button class="make-main" type="button">' - . $this->helper('Mage_Catalog_Helper_Data')->__('Make Main') - . '</button>' - . '</div>' - . '</span>' + . '<div class="image" data-image-label="' . $this->helper('Mage_Catalog_Helper_Data')->__('Main') . '">' + . '<img class="base-image-uploader" src="${url}" data-position="${position}" alt="${label}" />' + . '<div class="actions">' + . '<button class="action-delete" title="' . $this->helper('Mage_Catalog_Helper_Data')->__('Delete image') . '">' + . '<span>' . $this->helper('Mage_Catalog_Helper_Data')->__('Delete image') . '</span>' + . '</button>' + . '<button class="action-make-main" title="' . $this->helper('Mage_Catalog_Helper_Data')->__('Make Main') . '">' + . '<span>' . $this->helper('Mage_Catalog_Helper_Data')->__('Make Main') . '</span>' + . '</button>' + . '<div class="draggable-handle"></div>' + . '</div>' + . '</div>' . '</script>' . '</div>'; $html .= $this->_getJs(); diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/Category.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/Category.php index 3bee6f60ffb272e7254c4853b43ae49d20f20198..16c2065e0d160421238a026ccbc7b8249f390745 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/Category.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/Category.php @@ -131,7 +131,8 @@ class Mage_Adminhtml_Block_Catalog_Product_Helper_Form_Category extends Varien_D 'valueField' => '#' . $this->getHtmlId(), 'template' => '#' . $this->getHtmlId() . '-template', 'control' => 'jstree', - 'className' => 'category-select' + 'className' => 'category-select', + 'multiselect' => true, ); } } diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/Weight/Renderer.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/Weight/Renderer.php index 50ac9c2d5ac615fa3a80d12f0f5e0c9fa39a927c..6bc2ca2ab74d475e1630d59b07b9ac1179b9d3e0 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/Weight/Renderer.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/Weight/Renderer.php @@ -70,7 +70,10 @@ class Mage_Adminhtml_Block_Catalog_Product_Helper_Form_Weight_Renderer extends V if (!$this->getForm()->getDataObject()->getTypeInstance()->hasWeight()) { $this->_virtual->setChecked('checked'); } - return parent::getElementHtml() . $this->_virtual->getElementHtml() . $this->_virtual->getLabelHtml(); + return '<div class="fields-group-2"><div class="field"><div class="control">' + . parent::getElementHtml() . '</div></div><div class="field choice">' + . $this->_virtual->getElementHtml() . $this->_virtual->getLabelHtml() + . '</div></div>'; } /** diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Options/Ajax.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Options/Ajax.php index 171985da8a1f5b055e1915d1ad804bc3a2a74ca8..c7d8b7fbc85ed93102665da9a7aa1067a90caad9 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Options/Ajax.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Options/Ajax.php @@ -31,7 +31,7 @@ * @package Mage_Adminhtml * @author Magento Core Team <core@magentocommerce.com> */ -class Mage_Adminhtml_Block_Catalog_Product_Options_Ajax extends Mage_Core_Block_Template +class Mage_Adminhtml_Block_Catalog_Product_Options_Ajax extends Mage_Backend_Block_Abstract { /** * Return product custom options in JSON format diff --git a/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Renderer/Newpass.php b/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Renderer/Newpass.php index bb570115e480a8c2cf38016eebf02c677a8d1509..86f5f1c825414bd775d023a31f5b86486c46582c 100644 --- a/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Renderer/Newpass.php +++ b/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Renderer/Newpass.php @@ -32,25 +32,24 @@ * @author Magento Core Team <core@magentocommerce.com> */ class Mage_Adminhtml_Block_Customer_Edit_Renderer_Newpass - extends Mage_Core_Block_Template + extends Mage_Backend_Block_Abstract implements Varien_Data_Form_Element_Renderer_Interface { public function render(Varien_Data_Form_Element_Abstract $element) { - $html = '<tr>'; - $html.= '<td class="label">'.$element->getLabelHtml().'</td>'; - $html.= '<td class="value">'.$element->getElementHtml().'</td>'; - $html.= '</tr>'."\n"; - $html.= '<tr>'; - $html.= '<td class="label"><label> </label></td>'; - $html.= '<td class="value">'.Mage::helper('Mage_Customer_Helper_Data')->__('or').'</td>'; - $html.= '</tr>'."\n"; - $html.= '<tr>'; - $html.= '<td class="label"><label> </label></td>'; - $html.= '<td class="value"><input type="checkbox" id="account-send-pass" name="'.$element->getName().'" value="auto" onclick="setElementDisable(\''.$element->getHtmlId().'\', this.checked)"/> '; - $html.= '<label for="account-send-pass">'.Mage::helper('Mage_Customer_Helper_Data')->__('Send auto-generated password').'</label></td>'; - $html.= '</tr>'."\n"; + $html = '<div class="field field-'.$element->getHtmlId().'">'; + $html.= $element->getLabelHtml(); + $html.= '<div class="control">'.$element->getElementHtml(); + $html.= '<div class="nested">'; + $html.= '<div class="field choice">'; + $html.= '<label for="account-send-pass" class="addbefore"><span>'.Mage::helper('Mage_Customer_Helper_Data')->__('or ').'</span></label>'; + $html.= '<input type="checkbox" id="account-send-pass" name="'.$element->getName().'" value="auto" onclick="setElementDisable(\''.$element->getHtmlId().'\', this.checked)" />'; + $html.= '<label class="label" for="account-send-pass"><span>'.Mage::helper('Mage_Customer_Helper_Data')->__(' Send auto-generated password').'</span></label>'; + $html.= '</div>'."\n"; + $html.= '</div>'."\n"; + $html.= '</div>'."\n"; + $html.= '</div>'."\n"; return $html; } diff --git a/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Renderer/Region.php b/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Renderer/Region.php index 7a011f5e6ff2ffdfc68c7c48cd04f6ee088b5a44..9b2c372299642d3849b6c74df30673caa8534d90 100644 --- a/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Renderer/Region.php +++ b/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Renderer/Region.php @@ -30,7 +30,7 @@ * @author Magento Core Team <core@magentocommerce.com> */ class Mage_Adminhtml_Block_Customer_Edit_Renderer_Region - extends Mage_Core_Block_Template + extends Mage_Backend_Block_Abstract implements Varien_Data_Form_Element_Renderer_Interface { /** @@ -50,10 +50,10 @@ class Mage_Adminhtml_Block_Customer_Edit_Renderer_Region $regionId = $element->getForm()->getElement('region_id')->getValue(); - $html = '<tr>'; + $html = '<div class="field field-state required">'; $element->setClass('input-text'); $element->setRequired(true); - $html .= '<td class="label">' . $element->getLabelHtml() . '</td><td class="value">'; + $html .= $element->getLabelHtml() . '<div class="control">'; $html .= $element->getElementHtml(); $selectName = str_replace('region', 'region_id', $element->getName()); @@ -69,7 +69,7 @@ class Mage_Adminhtml_Block_Customer_Edit_Renderer_Region . '", "' . $selectId . '", ' . $this->helper('Mage_Directory_Helper_Data')->getRegionJson() . ');' . "\n"; $html .= '</script>' . "\n"; - $html .= '</td></tr>' . "\n"; + $html .= '</div></div>' . "\n"; return $html; } diff --git a/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/Newsletter.php b/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/Newsletter.php index c42f97b35cd0c993242cb2cfd71c969917fb5a88..b2dc256d3b335ce64f6757b2423e847710db1730 100644 --- a/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/Newsletter.php +++ b/app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/Newsletter.php @@ -47,7 +47,7 @@ class Mage_Adminhtml_Block_Customer_Edit_Tab_Newsletter extends Mage_Adminhtml_B $fieldset->addField('subscription', 'checkbox', array( - 'label' => Mage::helper('Mage_Customer_Helper_Data')->__('Subscribed to Newsletter?'), + 'label' => Mage::helper('Mage_Customer_Helper_Data')->__('Subscribed to Newsletter'), 'name' => 'subscription' ) ); diff --git a/app/code/core/Mage/Adminhtml/Block/Html/Date.php b/app/code/core/Mage/Adminhtml/Block/Html/Date.php new file mode 100644 index 0000000000000000000000000000000000000000..283746501823d80510b7bedbca226689249e03ee --- /dev/null +++ b/app/code/core/Mage/Adminhtml/Block/Html/Date.php @@ -0,0 +1,76 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Adminhtml + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Adminhtml HTML select element block + * + * @category Mage + * @package Mage_Core + * @author Magento Core Team <core@magentocommerce.com> + */ +class Mage_Adminhtml_Block_Html_Date extends Mage_Core_Block_Html_Date +{ + /** + * @param Mage_Core_Controller_Request_Http $request + * @param Mage_Core_Model_Layout $layout + * @param Mage_Core_Model_Event_Manager $eventManager + * @param Mage_Backend_Model_Url $urlBuilder + * @param Mage_Core_Model_Translate $translator + * @param Mage_Core_Model_Cache $cache + * @param Mage_Core_Model_Design_Package $designPackage + * @param Mage_Core_Model_Session $session + * @param Mage_Core_Model_Store_Config $storeConfig + * @param Mage_Core_Controller_Varien_Front $frontController + * @param Mage_Core_Model_Factory_Helper $helperFactory + * @param Mage_Core_Model_Dir $dirs + * @param Mage_Core_Model_Logger $logger + * @param Magento_Filesystem $filesystem + * @param array $data + * + * @SuppressWarnings(PHPMD.ExcessiveParameterList) + */ + public function __construct( + Mage_Core_Controller_Request_Http $request, + Mage_Core_Model_Layout $layout, + Mage_Core_Model_Event_Manager $eventManager, + Mage_Backend_Model_Url $urlBuilder, + Mage_Core_Model_Translate $translator, + Mage_Core_Model_Cache $cache, + Mage_Core_Model_Design_Package $designPackage, + Mage_Core_Model_Session $session, + Mage_Core_Model_Store_Config $storeConfig, + Mage_Core_Controller_Varien_Front $frontController, + Mage_Core_Model_Factory_Helper $helperFactory, + Mage_Core_Model_Dir $dirs, + Mage_Core_Model_Logger $logger, + Magento_Filesystem $filesystem, + array $data = array() + ) { + parent::__construct($request, $layout, $eventManager, $urlBuilder, $translator, $cache, $designPackage, + $session, $storeConfig, $frontController, $helperFactory, $dirs, $logger, $filesystem, $data + ); + } +} diff --git a/app/code/core/Mage/Adminhtml/Block/Html/Select.php b/app/code/core/Mage/Adminhtml/Block/Html/Select.php new file mode 100644 index 0000000000000000000000000000000000000000..3326a5c1a737dfc1d2ce7e63183f426b89e4adee --- /dev/null +++ b/app/code/core/Mage/Adminhtml/Block/Html/Select.php @@ -0,0 +1,70 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Adminhtml + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Adminhtml HTML select element block + * + * @category Mage + * @package Mage_Core + * @author Magento Core Team <core@magentocommerce.com> + */ +class Mage_Adminhtml_Block_Html_Select extends Mage_Core_Block_Html_Select +{ + /** + * @param Mage_Core_Controller_Request_Http $request + * @param Mage_Core_Model_Layout $layout + * @param Mage_Core_Model_Event_Manager $eventManager + * @param Mage_Backend_Model_Url $urlBuilder + * @param Mage_Core_Model_Translate $translator + * @param Mage_Core_Model_Cache $cache + * @param Mage_Core_Model_Design_Package $designPackage + * @param Mage_Core_Model_Session $session + * @param Mage_Core_Model_Store_Config $storeConfig + * @param Mage_Core_Controller_Varien_Front $frontController + * @param Mage_Core_Model_Factory_Helper $helperFactory + * @param array $data + * + * @SuppressWarnings(PHPMD.ExcessiveParameterList) + */ + public function __construct( + Mage_Core_Controller_Request_Http $request, + Mage_Core_Model_Layout $layout, + Mage_Core_Model_Event_Manager $eventManager, + Mage_Backend_Model_Url $urlBuilder, + Mage_Core_Model_Translate $translator, + Mage_Core_Model_Cache $cache, + Mage_Core_Model_Design_Package $designPackage, + Mage_Core_Model_Session $session, + Mage_Core_Model_Store_Config $storeConfig, + Mage_Core_Controller_Varien_Front $frontController, + Mage_Core_Model_Factory_Helper $helperFactory, + array $data = array() + ) { + parent::__construct($request, $layout, $eventManager, $urlBuilder, $translator, $cache, $designPackage, + $session, $storeConfig, $frontController, $helperFactory, $data + ); + } +} diff --git a/app/code/core/Mage/Adminhtml/Block/Messages.php b/app/code/core/Mage/Adminhtml/Block/Messages.php new file mode 100644 index 0000000000000000000000000000000000000000..2b815058e001391941fbaf0dc56a9d19c97be6ef --- /dev/null +++ b/app/code/core/Mage/Adminhtml/Block/Messages.php @@ -0,0 +1,77 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Adminhtml + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + + +/** + * Adminhtml messages block + * + * @category Mage + * @package Mage_Adminhtml + * @author Magento Core Team <core@magentocommerce.com> + */ +class Mage_Adminhtml_Block_Messages extends Mage_Core_Block_Messages +{ + /** + * @param Mage_Core_Controller_Request_Http $request + * @param Mage_Core_Model_Layout $layout + * @param Mage_Core_Model_Event_Manager $eventManager + * @param Mage_Backend_Model_Url $urlBuilder + * @param Mage_Core_Model_Translate $translator + * @param Mage_Core_Model_Cache $cache + * @param Mage_Core_Model_Design_Package $designPackage + * @param Mage_Core_Model_Session $session + * @param Mage_Core_Model_Store_Config $storeConfig + * @param Mage_Core_Controller_Varien_Front $frontController + * @param Mage_Core_Model_Factory_Helper $helperFactory + * @param Mage_Core_Model_Dir $dirs + * @param Mage_Core_Model_Logger $logger + * @param Magento_Filesystem $filesystem + * @param array $data + * + * @SuppressWarnings(PHPMD.ExcessiveParameterList) + */ + public function __construct( + Mage_Core_Controller_Request_Http $request, + Mage_Core_Model_Layout $layout, + Mage_Core_Model_Event_Manager $eventManager, + Mage_Backend_Model_Url $urlBuilder, + Mage_Core_Model_Translate $translator, + Mage_Core_Model_Cache $cache, + Mage_Core_Model_Design_Package $designPackage, + Mage_Core_Model_Session $session, + Mage_Core_Model_Store_Config $storeConfig, + Mage_Core_Controller_Varien_Front $frontController, + Mage_Core_Model_Factory_Helper $helperFactory, + Mage_Core_Model_Dir $dirs, + Mage_Core_Model_Logger $logger, + Magento_Filesystem $filesystem, + array $data = array() + ) { + parent::__construct($request, $layout, $eventManager, $urlBuilder, $translator, $cache, $designPackage, + $session, $storeConfig, $frontController, $helperFactory, $dirs, $logger, $filesystem, $data + ); + } +} diff --git a/app/code/core/Mage/Adminhtml/Block/Page/Footer.php b/app/code/core/Mage/Adminhtml/Block/Page/Footer.php index 7005c3ddbbce93d97ff9b2480d0d85388c4a06c5..e478fdffe24375aa3d4ea25137397e0288411fea 100644 --- a/app/code/core/Mage/Adminhtml/Block/Page/Footer.php +++ b/app/code/core/Mage/Adminhtml/Block/Page/Footer.php @@ -67,7 +67,7 @@ class Mage_Adminhtml_Block_Page_Footer extends Mage_Adminhtml_Block_Template $html = Mage::app()->loadCache($cacheId); if (!$html) { - $html = $this->getLayout()->createBlock('Mage_Core_Block_Html_Select') + $html = $this->getLayout()->createBlock('Mage_Adminhtml_Block_Html_Select') ->setName('locale') ->setId('interface_locale') ->setTitle(Mage::helper('Mage_Page_Helper_Data')->__('Interface Language')) diff --git a/app/code/core/Mage/Adminhtml/Block/Poll/Edit/Tab/Answers/List.php b/app/code/core/Mage/Adminhtml/Block/Poll/Edit/Tab/Answers/List.php index e7038ed029cef58f89380fe09cf22f065df2d837..b3cde73d7290af98de329a5afd5a8bd72077c403 100644 --- a/app/code/core/Mage/Adminhtml/Block/Poll/Edit/Tab/Answers/List.php +++ b/app/code/core/Mage/Adminhtml/Block/Poll/Edit/Tab/Answers/List.php @@ -54,14 +54,12 @@ class Mage_Adminhtml_Block_Poll_Edit_Tab_Answers_List extends Mage_Adminhtml_Blo { $this->addChild('deleteButton', 'Mage_Adminhtml_Block_Widget_Button', array( 'label' => Mage::helper('Mage_Poll_Helper_Data')->__('Delete'), - 'onclick' => 'answer.del(this)', - 'class' => 'delete' + 'class' => 'action-delete action- delete icon-btn' )); $this->addChild('addButton', 'Mage_Adminhtml_Block_Widget_Button', array( 'label' => Mage::helper('Mage_Poll_Helper_Data')->__('Add New Answer'), - 'onclick' => 'answer.add(this)', - 'class' => 'add' + 'class' => 'action-add' )); return parent::_prepareLayout(); } diff --git a/app/code/core/Mage/Adminhtml/Block/Promo/Quote/Edit/Tab/Main/Renderer/Checkbox.php b/app/code/core/Mage/Adminhtml/Block/Promo/Quote/Edit/Tab/Main/Renderer/Checkbox.php index 8e103aeca0c375c4f3000c0cae4029b51e3e3a46..33e20fd7a6ca5dd8a58e2306068e2cd5178d6cd5 100644 --- a/app/code/core/Mage/Adminhtml/Block/Promo/Quote/Edit/Tab/Main/Renderer/Checkbox.php +++ b/app/code/core/Mage/Adminhtml/Block/Promo/Quote/Edit/Tab/Main/Renderer/Checkbox.php @@ -32,7 +32,7 @@ * @author Magento Core Team <core@magentocommerce.com> */ class Mage_Adminhtml_Block_Promo_Quote_Edit_Tab_Main_Renderer_Checkbox - extends Mage_Core_Block_Template + extends Mage_Backend_Block_Abstract implements Varien_Data_Form_Element_Renderer_Interface { /** diff --git a/app/code/core/Mage/Adminhtml/Block/Promo/Widget/Chooser/Daterange.php b/app/code/core/Mage/Adminhtml/Block/Promo/Widget/Chooser/Daterange.php index 0030bce0a1824986595fdaa88d17c82be9982227..d559151880ba16d83c2a37fa6838f6eaedb84c95 100644 --- a/app/code/core/Mage/Adminhtml/Block/Promo/Widget/Chooser/Daterange.php +++ b/app/code/core/Mage/Adminhtml/Block/Promo/Widget/Chooser/Daterange.php @@ -28,7 +28,7 @@ * Date range promo widget chooser * Currently works without localized format */ -class Mage_Adminhtml_Block_Promo_Widget_Chooser_Daterange extends Mage_Core_Block_Template +class Mage_Adminhtml_Block_Promo_Widget_Chooser_Daterange extends Mage_Backend_Block_Abstract { /** * HTML ID of the element that will obtain the joined chosen values diff --git a/app/code/core/Mage/Adminhtml/Block/Rating/Grid.php b/app/code/core/Mage/Adminhtml/Block/Rating/Grid.php deleted file mode 100644 index 387a67a9c084ddc63d9c9966a30e72a27e8c80a4..0000000000000000000000000000000000000000 --- a/app/code/core/Mage/Adminhtml/Block/Rating/Grid.php +++ /dev/null @@ -1,100 +0,0 @@ -<?php -/** - * Magento - * - * NOTICE OF LICENSE - * - * This source file is subject to the Open Software License (OSL 3.0) - * that is bundled with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://opensource.org/licenses/osl-3.0.php - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@magentocommerce.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade Magento to newer - * versions in the future. If you wish to customize Magento for your - * needs please refer to http://www.magentocommerce.com for more information. - * - * @category Mage - * @package Mage_Adminhtml - * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) - * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) - */ - -/** - * description - * - * @category Mage - * @package Mage_Adminhtml - * @author Magento Core Team <core@magentocommerce.com> - */ -class Mage_Adminhtml_Block_Rating_Grid extends Mage_Adminhtml_Block_Widget_Grid -{ - - protected function _construct() - { - parent::_construct(); - $this->setId('ratingsGrid'); - $this->setDefaultSort('rating_code'); - $this->setDefaultDir('ASC'); - $this->setSaveParametersInSession(true); - } - - protected function _prepareCollection() - { - $collection = Mage::getModel('Mage_Rating_Model_Rating') - ->getResourceCollection() - ->addEntityFilter(Mage::registry('entityId')); - $this->setCollection($collection); - return parent::_prepareCollection(); - } - - /** - * Prepare Rating Grid colunms - * - * @return Mage_Adminhtml_Block_Rating_Grid - */ - protected function _prepareColumns() - { - $this->addColumn('rating_id', array( - 'header' => Mage::helper('Mage_Rating_Helper_Data')->__('ID'), - 'align' =>'right', - 'width' => '50px', - 'index' => 'rating_id', - )); - - $this->addColumn('rating_code', array( - 'header' => Mage::helper('Mage_Rating_Helper_Data')->__('Rating Name'), - 'index' => 'rating_code', - )); - - $this->addColumn('position', array( - 'header' => Mage::helper('Mage_Rating_Helper_Data')->__('Sort Order'), - 'align' => 'left', - 'width' => '100px', - 'index' => 'position', - )); - - $this->addColumn('is_active', array( - 'header' => Mage::helper('Mage_Rating_Helper_Data')->__('Is Active'), - 'align' => 'left', - 'type' => 'options', - 'index' => 'is_active', - 'options' => array( - '1' => Mage::helper('Mage_Rating_Helper_Data')->__('Active'), - '0' => Mage::helper('Mage_Rating_Helper_Data')->__('Inactive') - ), - )); - - return parent::_prepareColumns(); - } - - public function getRowUrl($row) - { - return $this->getUrl('*/*/edit', array('id' => $row->getId())); - } - -} diff --git a/app/code/core/Mage/Adminhtml/Block/Rating/Rating.php b/app/code/core/Mage/Adminhtml/Block/Rating/Rating.php index ee5ed6a60a2527cf82c16ad57365f25d8de945f7..8d2f1c7d9c2d6fa75021ee99c2f0b68ab75abe09 100644 --- a/app/code/core/Mage/Adminhtml/Block/Rating/Rating.php +++ b/app/code/core/Mage/Adminhtml/Block/Rating/Rating.php @@ -31,8 +31,7 @@ * @package Mage_Adminhtml * @author Magento Core Team <core@magentocommerce.com> */ - -class Mage_Adminhtml_Block_Rating_Rating extends Mage_Adminhtml_Block_Widget_Grid_Container +class Mage_Adminhtml_Block_Rating_Rating extends Mage_Backend_Block_Widget_Grid_Container { protected function _construct() { diff --git a/app/code/core/Mage/Adminhtml/Block/Report/Search.php b/app/code/core/Mage/Adminhtml/Block/Report/Search.php index a6d781d10b08ed881c785430cf37c4fc750258de..26de765abf8825e91a655692f16b6256f57e063c 100644 --- a/app/code/core/Mage/Adminhtml/Block/Report/Search.php +++ b/app/code/core/Mage/Adminhtml/Block/Report/Search.php @@ -32,7 +32,7 @@ * @author Magento Core Team <core@magentocommerce.com> */ -class Mage_Adminhtml_Block_Report_Search extends Mage_Adminhtml_Block_Widget_Grid_Container +class Mage_Adminhtml_Block_Report_Search extends Mage_Backend_Block_Widget_Grid_Container { /** * Initialize Grid Container diff --git a/app/code/core/Mage/Adminhtml/Block/Report/Search/Grid.php b/app/code/core/Mage/Adminhtml/Block/Report/Search/Grid.php deleted file mode 100644 index d17b6e1537559d5b5b74fced50be137096fca87f..0000000000000000000000000000000000000000 --- a/app/code/core/Mage/Adminhtml/Block/Report/Search/Grid.php +++ /dev/null @@ -1,123 +0,0 @@ -<?php -/** - * Magento - * - * NOTICE OF LICENSE - * - * This source file is subject to the Open Software License (OSL 3.0) - * that is bundled with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://opensource.org/licenses/osl-3.0.php - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@magentocommerce.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade Magento to newer - * versions in the future. If you wish to customize Magento for your - * needs please refer to http://www.magentocommerce.com for more information. - * - * @category Mage - * @package Mage_Adminhtml - * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) - * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) - */ - -/** - * Adminhtml search report grid block - * - * @category Mage - * @package Mage_Adminhtml - * @author Magento Core Team <core@magentocommerce.com> - */ -class Mage_Adminhtml_Block_Report_Search_Grid extends Mage_Adminhtml_Block_Widget_Grid -{ - /** - * Initialize Grid Properties - * - */ - protected function _construct() - { - parent::_construct(); - $this->setId('searchReportGrid'); - $this->setDefaultSort('query_id'); - $this->setDefaultDir('desc'); - } - - /** - * Prepare Search Report collection for grid - * - * @return Mage_Adminhtml_Block_Report_Search_Grid - */ - protected function _prepareCollection() - { - $collection = Mage::getResourceModel('Mage_CatalogSearch_Model_Resource_Query_Collection'); - $this->setCollection($collection); - - return parent::_prepareCollection(); - } - - /** - * Prepare Grid columns - * - * @return Mage_Adminhtml_Block_Report_Search_Grid - */ - protected function _prepareColumns() - { - $this->addColumn('query_id', array( - 'header' =>Mage::helper('Mage_Reports_Helper_Data')->__('ID'), - 'width' =>'50px', - 'filter' =>false, - 'index' =>'query_id', - 'type' =>'number' - )); - - $this->addColumn('query_text', array( - 'header' =>Mage::helper('Mage_Reports_Helper_Data')->__('Search Query'), - 'index' =>'query_text' - )); - - if (!Mage::app()->isSingleStoreMode()) { - $this->addColumn('store_id', array( - 'header' => Mage::helper('Mage_Catalog_Helper_Data')->__('Store'), - 'index' => 'store_id', - 'type' => 'store', - 'store_view' => true, - 'sortable' => false - )); - } - - $this->addColumn('num_results', array( - 'header' =>Mage::helper('Mage_Reports_Helper_Data')->__('Results'), - 'width' =>'50px', - 'align' =>'right', - 'type' =>'number', - 'index' =>'num_results' - )); - - $this->addColumn('popularity', array( - 'header' =>Mage::helper('Mage_Reports_Helper_Data')->__('Hits'), - 'width' =>'50px', - 'align' =>'right', - 'type' =>'number', - 'index' =>'popularity' - )); - - $this->addExportType('*/*/exportSearchCsv', Mage::helper('Mage_Reports_Helper_Data')->__('CSV')); - $this->addExportType('*/*/exportSearchExcel', Mage::helper('Mage_Reports_Helper_Data')->__('Excel XML')); - - return parent::_prepareColumns(); - } - - /** - * Retrieve Row Click callback URL - * - * @return string - */ - public function getRowUrl($row) - { - return $this->getUrl('*/catalog_search/edit', array('id' => $row->getId())); - } -} - diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Messages.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Messages.php index 034f003835a62702f44722504261316a7b15c9af..d650589a44fe80b24593701b932cf835fd013f66 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Messages.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Messages.php @@ -31,7 +31,7 @@ * @package Mage_Adminhtml * @author Magento Core Team <core@magentocommerce.com> */ -class Mage_Adminhtml_Block_Sales_Order_Create_Messages extends Mage_Core_Block_Messages +class Mage_Adminhtml_Block_Sales_Order_Create_Messages extends Mage_Adminhtml_Block_Messages { public function _prepareLayout() diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Sidebar.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Sidebar.php index 01179106eb44fc69dbd5dc4a2c89b80775f26e37..b7a59d53e107158733bae8b3c3ceecee4fdb01c2 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Sidebar.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Sidebar.php @@ -40,7 +40,7 @@ class Mage_Adminhtml_Block_Sales_Order_Create_Sidebar extends Mage_Adminhtml_Blo $button = $this->getLayout()->createBlock('Mage_Adminhtml_Block_Widget_Button')->setData(array( 'label' => Mage::helper('Mage_Sales_Helper_Data')->__('Update Changes'), 'onclick' => 'order.sidebarApplyChanges()', - 'before_html' => '<div class="sub-btn-set">', + 'before_html' => '<div class="actions">', 'after_html' => '</div>' )); $this->setChild('top_button', $button); diff --git a/app/code/core/Mage/Adminhtml/Block/Sales/Order/View/Messages.php b/app/code/core/Mage/Adminhtml/Block/Sales/Order/View/Messages.php index 4fad233aa8588ab7c3adeb5b69d510a303ae590b..649fbf39db9cceb2bc699931362f43a177be8d00 100644 --- a/app/code/core/Mage/Adminhtml/Block/Sales/Order/View/Messages.php +++ b/app/code/core/Mage/Adminhtml/Block/Sales/Order/View/Messages.php @@ -31,7 +31,7 @@ * @package Mage_Adminhtml * @author Magento Core Team <core@magentocommerce.com> */ -class Mage_Adminhtml_Block_Sales_Order_View_Messages extends Mage_Core_Block_Messages +class Mage_Adminhtml_Block_Sales_Order_View_Messages extends Mage_Adminhtml_Block_Messages { protected function _getOrder() diff --git a/app/code/core/Mage/Adminhtml/Block/System/Account/Edit/Form.php b/app/code/core/Mage/Adminhtml/Block/System/Account/Edit/Form.php index 4f4f269c38eebce9ff1dd3cc33a5a9e3723d5ea0..e76e2db681553bbd0db9985ee53415b5ada7435c 100644 --- a/app/code/core/Mage/Adminhtml/Block/System/Account/Edit/Form.php +++ b/app/code/core/Mage/Adminhtml/Block/System/Account/Edit/Form.php @@ -83,7 +83,7 @@ class Mage_Adminhtml_Block_System_Account_Edit_Form extends Mage_Adminhtml_Block ); $fieldset->addField('password', 'password', array( - 'name' => 'new_password', + 'name' => 'password', 'label' => Mage::helper('Mage_Adminhtml_Helper_Data')->__('New Password'), 'title' => Mage::helper('Mage_Adminhtml_Helper_Data')->__('New Password'), 'class' => 'input-text validate-admin-password', diff --git a/app/code/core/Mage/Adminhtml/Block/System/Currency/Rate/Services.php b/app/code/core/Mage/Adminhtml/Block/System/Currency/Rate/Services.php index f1e276eafe4c51fd60733fbde9502d6d38d6c668..d29e500b04c452a62fa72fa051ef3522cd6111a7 100644 --- a/app/code/core/Mage/Adminhtml/Block/System/Currency/Rate/Services.php +++ b/app/code/core/Mage/Adminhtml/Block/System/Currency/Rate/Services.php @@ -44,7 +44,7 @@ class Mage_Adminhtml_Block_System_Currency_Rate_Services extends Mage_Adminhtml_ protected function _prepareLayout() { $this->setChild('import_services', - $this->getLayout()->createBlock('Mage_Core_Block_Html_Select') + $this->getLayout()->createBlock('Mage_Adminhtml_Block_Html_Select') ->setOptions(Mage::getModel('Mage_Backend_Model_Config_Source_Currency_Service')->toOptionArray(0)) ->setId('rate_services') ->setName('rate_services') diff --git a/app/code/core/Mage/Adminhtml/Block/System/Store/Store.php b/app/code/core/Mage/Adminhtml/Block/System/Store/Store.php index cb62c679b22720aedc7e96fbb9b5a82c3405ec33..3428b267eea6a2ea907af2a1e4167c085c6fd3c5 100644 --- a/app/code/core/Mage/Adminhtml/Block/System/Store/Store.php +++ b/app/code/core/Mage/Adminhtml/Block/System/Store/Store.php @@ -32,8 +32,13 @@ * @author Magento Core Team <core@magentocommerce.com> */ -class Mage_Adminhtml_Block_System_Store_Store extends Mage_Adminhtml_Block_Widget_Grid_Container +class Mage_Adminhtml_Block_System_Store_Store extends Mage_Backend_Block_Widget_Grid_Container { + /** + * @var string + */ + protected $_blockGroup = 'Mage_Adminhtml'; + protected function _construct() { $this->_controller = 'system_store'; @@ -55,11 +60,16 @@ class Mage_Adminhtml_Block_System_Store_Store extends Mage_Adminhtml_Block_Widge )); /* Add Store button */ - $this->_addButton('add_store', array( - 'label' => Mage::helper('Mage_Core_Helper_Data')->__('Create Store View'), - 'onclick' => 'setLocation(\'' . $this->getUrl('*/*/newStore') .'\')', - 'class' => 'add', - )); + + /** @var $limitation Mage_Core_Model_Store_Limitation */ + $limitation = Mage::getObjectManager()->get('Mage_Core_Model_Store_Limitation'); + if ($limitation->canCreate()) { + $this->_addButton('add_store', array( + 'label' => Mage::helper('Mage_Core_Helper_Data')->__('Create Store View'), + 'onclick' => 'setLocation(\'' . $this->getUrl('*/*/newStore') .'\')', + 'class' => 'add', + )); + } return parent::_prepareLayout(); } diff --git a/app/code/core/Mage/Adminhtml/Model/Customer/Renderer/Region.php b/app/code/core/Mage/Adminhtml/Model/Customer/Renderer/Region.php index 4e6139e57206162691afbffc2b53b071053ad812..402411ca0fe7a14d28022d8b3da562c59e9d2643 100644 --- a/app/code/core/Mage/Adminhtml/Model/Customer/Renderer/Region.php +++ b/app/code/core/Mage/Adminhtml/Model/Customer/Renderer/Region.php @@ -46,7 +46,7 @@ class Mage_Adminhtml_Model_Customer_Renderer_Region implements Varien_Data_Form_ public function render(Varien_Data_Form_Element_Abstract $element) { - $html = '<tr>'."\n"; + $html = '<div class="field field-region">'."\n"; $countryId = false; if ($country = $element->getForm()->getElement('country_id')) { @@ -85,8 +85,8 @@ class Mage_Adminhtml_Model_Customer_Renderer_Region implements Varien_Data_Form_ if ($regionCollection && count($regionCollection) > 0) { $elementClass = $element->getClass(); - $html.= '<td class="label">'.$element->getLabelHtml().'</td>'; - $html.= '<td class="value">'; + $html.= '<label class="label" for="' . $regionIdHtmlId . '"><span>'.$element->getLabelHtml().'</span><span class="required" style="display:none">*</span></label>'; + $html.= '<div class="control">'; $html .= '<select id="' . $regionIdHtmlId . '" name="' . $regionIdHtmlName . '" ' . $element->serialize($htmlAttributes) .'>' . "\n"; @@ -100,23 +100,23 @@ class Mage_Adminhtml_Model_Customer_Renderer_Region implements Varien_Data_Form_ $html .= '<input type="hidden" name="' . $regionHtmlName . '" id="' . $regionHtmlId . '" value=""/>'; - $html.= '</td>'; + $html.= '</div>'; $element->setClass($elementClass); } else { $element->setClass('input-text'); - $html.= '<td class="label"><label for="'.$element->getHtmlId().'">' + $html.= '<label class="label" for="' . $regionHtmlId . '"><label for="'.$element->getHtmlId().'">' . $element->getLabel() - . ' <span class="required" style="display:none">*</span></label></td>'; + . '</span><span class="required" style="display:none">*</span></label>'; $element->setRequired(false); - $html.= '<td class="value">'; + $html.= '<div class="control">'; $html .= '<input id="' . $regionHtmlId . '" name="' . $regionHtmlName . '" value="' . $element->getEscapedValue() . '" ' . $element->serialize($htmlAttributes) . "/>" . "\n"; $html .= '<input type="hidden" name="' . $regionIdHtmlName . '" id="' . $regionIdHtmlId . '" value=""/>'; - $html .= '</td>'."\n"; + $html .= '</div>'."\n"; } - $html.= '</tr>'."\n"; + $html.= '</div>'."\n"; return $html; } } diff --git a/app/code/core/Mage/Adminhtml/controllers/RatingController.php b/app/code/core/Mage/Adminhtml/controllers/RatingController.php index 9c2b9e9e515b4f107996ce799f69acdb80b52e0e..4dcff17556400c8e7451e9df8c0596794433a132 100644 --- a/app/code/core/Mage/Adminhtml/controllers/RatingController.php +++ b/app/code/core/Mage/Adminhtml/controllers/RatingController.php @@ -41,7 +41,6 @@ class Mage_Adminhtml_RatingController extends Mage_Adminhtml_Controller_Action $this->_setActiveMenu('Mage_Review::catalog_reviews_ratings_ratings'); $this->_addBreadcrumb(Mage::helper('Mage_Adminhtml_Helper_Data')->__('Manage Ratings'), Mage::helper('Mage_Adminhtml_Helper_Data')->__('Manage Ratings')); - $this->_addContent($this->getLayout()->createBlock('Mage_Adminhtml_Block_Rating_Rating')); $this->renderLayout(); } diff --git a/app/code/core/Mage/Adminhtml/controllers/ReportController.php b/app/code/core/Mage/Adminhtml/controllers/ReportController.php index 6a35e0b1eddb16694db89c7f7646f714d7d4f774..979938a8252372274a97debc439a9655907ebdfe 100644 --- a/app/code/core/Mage/Adminhtml/controllers/ReportController.php +++ b/app/code/core/Mage/Adminhtml/controllers/ReportController.php @@ -49,8 +49,8 @@ class Mage_Adminhtml_ReportController extends Mage_Adminhtml_Controller_Action $this->_initAction() ->_setActiveMenu('Mage_Reports::report_search') - ->_addBreadcrumb(Mage::helper('Mage_Adminhtml_Helper_Data')->__('Search Terms'), Mage::helper('Mage_Adminhtml_Helper_Data')->__('Search Terms')) - ->_addContent($this->getLayout()->createBlock('Mage_Adminhtml_Block_Report_Search')) + ->_addBreadcrumb(Mage::helper('Mage_Adminhtml_Helper_Data') + ->__('Search Terms'), Mage::helper('Mage_Adminhtml_Helper_Data')->__('Search Terms')) ->renderLayout(); } @@ -59,11 +59,9 @@ class Mage_Adminhtml_ReportController extends Mage_Adminhtml_Controller_Action */ public function exportSearchCsvAction() { - $fileName = 'search.csv'; - $content = $this->getLayout()->createBlock('Mage_Adminhtml_Block_Report_Search_Grid') - ->getCsvFile(); - - $this->_prepareDownloadResponse($fileName, $content); + $this->loadLayout(false); + $content = $this->getLayout()->getChildBlock('adminhtml.report.search.grid', 'grid.export'); + $this->_prepareDownloadResponse('search.csv', $content->getCsvFile()); } /** @@ -71,11 +69,9 @@ class Mage_Adminhtml_ReportController extends Mage_Adminhtml_Controller_Action */ public function exportSearchExcelAction() { - $fileName = 'search.xml'; - $content = $this->getLayout()->createBlock('Mage_Adminhtml_Block_Report_Search_Grid') - ->getExcelFile($fileName); - - $this->_prepareDownloadResponse($fileName, $content); + $this->loadLayout(false); + $content = $this->getLayout()->getChildBlock('adminhtml.report.search.grid', 'grid.export'); + $this->_prepareDownloadResponse('search.xml', $content->getExcelFile()); } protected function _isAllowed() diff --git a/app/code/core/Mage/Adminhtml/controllers/System/AccountController.php b/app/code/core/Mage/Adminhtml/controllers/System/AccountController.php index c31828c0d38b3e9757ae31dc690fca0177b92811..739e018bcc92b683ef873274b83f5722175fe930 100644 --- a/app/code/core/Mage/Adminhtml/controllers/System/AccountController.php +++ b/app/code/core/Mage/Adminhtml/controllers/System/AccountController.php @@ -50,8 +50,10 @@ class Mage_Adminhtml_System_AccountController extends Mage_Adminhtml_Controller_ public function saveAction() { $userId = Mage::getSingleton('Mage_Backend_Model_Auth_Session')->getUser()->getId(); - $pwd = null; + $password = (string)$this->getRequest()->getParam('password'); + $passwordConfirmation = (string)$this->getRequest()->getParam('password_confirmation'); + /** @var $user Mage_User_Model_User */ $user = Mage::getModel('Mage_User_Model_User')->load($userId); $user->setId($userId) @@ -59,32 +61,25 @@ class Mage_Adminhtml_System_AccountController extends Mage_Adminhtml_Controller_ ->setFirstname($this->getRequest()->getParam('firstname', false)) ->setLastname($this->getRequest()->getParam('lastname', false)) ->setEmail(strtolower($this->getRequest()->getParam('email', false))); - if ( $this->getRequest()->getParam('new_password', false) ) { - $user->setNewPassword($this->getRequest()->getParam('new_password', false)); - } - if ($this->getRequest()->getParam('password_confirmation', false)) { - $user->setPasswordConfirmation($this->getRequest()->getParam('password_confirmation', false)); + if ($password !== '') { + $user->setPassword($password); } - - $result = $user->validate(); - if (is_array($result)) { - foreach($result as $error) { - Mage::getSingleton('Mage_Adminhtml_Model_Session')->addError($error); - } - $this->getResponse()->setRedirect($this->getUrl("*/*/")); - return; + if ($passwordConfirmation !== '') { + $user->setPasswordConfirmation($passwordConfirmation); } try { $user->save(); - Mage::getSingleton('Mage_Adminhtml_Model_Session')->addSuccess(Mage::helper('Mage_Adminhtml_Helper_Data')->__('The account has been saved.')); - } - catch (Mage_Core_Exception $e) { - Mage::getSingleton('Mage_Adminhtml_Model_Session')->addError($e->getMessage()); - } - catch (Exception $e) { - Mage::getSingleton('Mage_Adminhtml_Model_Session')->addError(Mage::helper('Mage_Adminhtml_Helper_Data')->__('An error occurred while saving account.')); + $this->_getSession()->addSuccess( + Mage::helper('Mage_Adminhtml_Helper_Data')->__('The account has been saved.') + ); + } catch (Mage_Core_Exception $e) { + $this->_getSession()->addMessages($e->getMessages()); + } catch (Exception $e) { + $this->_getSession()->addError( + Mage::helper('Mage_Adminhtml_Helper_Data')->__('An error occurred while saving account.') + ); } $this->getResponse()->setRedirect($this->getUrl("*/*/")); } diff --git a/app/code/core/Mage/Adminhtml/controllers/System/StoreController.php b/app/code/core/Mage/Adminhtml/controllers/System/StoreController.php index bfb25b65c38c53a0e7aefa0f8f0189d9242dc358..6c00e323b2b648d06db4c4a7a4e971f57bfebe1a 100644 --- a/app/code/core/Mage/Adminhtml/controllers/System/StoreController.php +++ b/app/code/core/Mage/Adminhtml/controllers/System/StoreController.php @@ -55,6 +55,14 @@ class Mage_Adminhtml_System_StoreController extends Mage_Adminhtml_Controller_Ac $this->_title($this->__('System')) ->_title($this->__('Stores')); + /** @var $limitation Mage_Core_Model_Store_Limitation */ + $limitation = $this->_objectManager->get('Mage_Core_Model_Store_Limitation'); + if (!$limitation->canCreate()) { + /** @var $session Mage_Adminhtml_Model_Session */ + $session = Mage::getSingleton('Mage_Adminhtml_Model_Session'); + $session->addNotice($limitation->getCreateRestrictionMessage()); + } + $this->_initAction() ->renderLayout(); } @@ -233,7 +241,7 @@ class Mage_Adminhtml_System_StoreController extends Mage_Adminhtml_Controller_Ac return; } catch (Mage_Core_Exception $e) { - $session->addError($e->getMessage()); + $this->_getSession()->addMessages($e->getMessages()); $session->setPostData($postData); } catch (Exception $e) { diff --git a/app/code/core/Mage/Adminhtml/etc/config.xml b/app/code/core/Mage/Adminhtml/etc/config.xml index 2a48404f4a06f25838764f63b3515fe65220be19..896f64bd38d3302aefc28a2eb7e88b29767aa0e9 100644 --- a/app/code/core/Mage/Adminhtml/etc/config.xml +++ b/app/code/core/Mage/Adminhtml/etc/config.xml @@ -139,6 +139,9 @@ <promo module="Mage_Adminhtml"> <file>promo.xml</file> </promo> + <rating module="Mage_Adminhtml"> + <file>rating.xml</file> + </rating> <report module="Mage_Adminhtml"> <file>report.xml</file> </report> @@ -160,6 +163,9 @@ <system_variable module="Mage_Adminhtml"> <file>variable.xml</file> </system_variable> + <system_search module="Mage_Adminhtml"> + <file>search.xml</file> + </system_search> </updates> </layout> <sales> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/admin/page.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/admin/page.phtml index 229f8befe96cdbf80a15b2a808831dce8dca37fa..8f80cb2adb97e246a6efeaaa856f1e99a9c4652b 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/admin/page.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/admin/page.phtml @@ -37,54 +37,57 @@ }, "vars":{} }*/ ?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $this->getLang() ?>" lang="<?php echo $this->getLang() ?>"> + +<!doctype html> +<html lang="<?php echo $this->getLang() ?>" class="no-js"> + <head> <?php echo $this->getChildHtml('head') ?> </head> <body id="html-body"<?php echo $this->getBodyClass() ? ' class="' . $this->getBodyClass() . '"' : ''; ?>> -<?php echo $this->getChildHtml('notification_window'); ?> -<div class="wrapper"> - <?php echo $this->getChildHtml('global_notices') ?> - <div class="header"> - <?php echo $this->getChildHtml('header') ?> - <div class="clear"></div> - <?php echo $this->getChildHtml('menu') ?> - </div> + <div class="wrapper"> + <?php echo $this->getChildHtml('notification_window'); ?> + <?php echo $this->getChildHtml('global_notices') ?> + <?php echo $this->getChildHtml('header') ?> + <?php echo $this->getChildHtml('menu') ?> <?php echo $this->getChildHtml('notifications'); ?> - <div class="middle" id="anchor-content"> - <div id="page:main-container"> + + <section class="page-content" id="anchor-content"> + <?php echo $this->getChildHtml('main-top'); ?> + <div class="messages"> + <?php echo $this->getMessagesBlock()->getGroupedHtml() ?> + </div> + <?php if($this->getChildHtml('left')): ?> - <div class="columns <?php echo $this->getContainerCssClass() ?>"> + <div id="page:main-container" class="<?php echo $this->getContainerCssClass() ?> col-2-left-layout"> + <div class="main-col" id="content"> + <?php echo $this->getChildHtml('content') ?> + </div> + <div class="side-col" id="page:left"> <?php echo $this->getChildHtml('left') ?> </div> - <div class="main-col" id="content"> - <div class="main-col-inner"> - <div id="messages"><?php echo $this->getMessagesBlock()->getGroupedHtml() ?></div> - <?php echo $this->getChildHtml('content') ?> - </div> - </div> </div> <?php else: ?> - <div id="messages"><?php echo $this->getMessagesBlock()->getGroupedHtml() ?></div> - <?php echo $this->getChildHtml('content') ?> + <div id="page:main-container" class="col-1-layout"> + <?php echo $this->getChildHtml('content') ?> + </div> <?php endif; ?> - </div> - </div> - <div class="footer"> - <?php echo $this->getChildHtml('footer') ?> + </section> + + <?php echo $this->getChildHtml('js') ?> + <!-- TODO: remove this popup after refactoring of "varienLoader.js" file --> + <div class="loading-old" id="loading-mask" style="display:none;"> + <div class="loader" id="loading_mask_loader"><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('Please wait...') ?></div> </div> </div> - <?php echo $this->getChildHtml('js') ?> -<div id="loading-mask" style="display:none"> - <p class="loader" id="loading_mask_loader"><img src="<?php echo $this->getViewFileUrl('images/ajax-loader-tr.gif') ?>" alt="<?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('Loading...') ?>"/><br/><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('Please wait...') ?></p> -</div> - -<?php echo $this->getChildHtml('before_body_end') ?> + <footer class="footer"> + <div class="footer-content"><?php echo $this->getChildHtml('footer') ?></div> + </footer> + <?php echo $this->getChildHtml('before_body_end') ?> </body> </html> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/admin/popup.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/admin/popup.phtml index 15977fdb50de5b52979859a5cf2d8fd0c5978237..67db3a7e85d4a26f41d8da4c6cd46edf2b55a974 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/admin/popup.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/admin/popup.phtml @@ -37,8 +37,8 @@ }, "vars":{} }*/ ?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $this->getLang() ?>" lang="<?php echo $this->getLang() ?>"> +<!doctype html> +<html lang="<?php echo $this->getLang() ?>" class="no-js"> <head> <?php echo $this->getChildHtml('head') ?> </head> @@ -47,7 +47,7 @@ <div class="middle" id="anchor-content"> <div id="page:main-container"> <?php if($this->getChildHtml('left')): ?> - <div class="columns <?php echo $this->getContainerCssClass() ?>" id="page:container"> + <div class="col-2-left-layout<?php echo $this->getContainerCssClass() ?>" id="page:container"> <div id="page:left" class="side-col"> <?php echo $this->getChildHtml('left') ?> </div> @@ -70,8 +70,10 @@ </div> <?php endif; ?> <?php echo $this->getChildHtml('js') ?> - <div id="loading-mask" style="display:none;"> - <p class="loader" id="loading_mask_loader"><img src="<?php echo $this->getViewFileUrl('images/ajax-loader-tr.gif') ?>" alt="<?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('Loading...') ?>" /><br /><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('Please wait...') ?></p> + + <!-- TODO: remove this popup after refactoring of "varienLoader.js" file --> + <div class="loading-old" id="loading-mask" style="display:none;"> + <div class="loader" id="loading_mask_loader"><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('Please wait...') ?></div> </div> </div> <?php echo $this->getChildHtml('before_body_end') ?> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/backup/dialogs.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/backup/dialogs.phtml index c49eec828d6ae5251273e4443579ff491ef67469..68f1ffcdcca6cec3e9d33c0e8cd12aafa53767db 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/backup/dialogs.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/backup/dialogs.phtml @@ -24,155 +24,130 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="backup-dialog" style="display: none;" id="rollback-warning"> - <div class="entry-edit"> - <div class="entry-edit-head"> - <h4 class="head-edit-form fieldset-legend"><?php echo $this->__('Warning') ?></h4> - </div> - <div class="content"> - <div><?php echo $this->__('Any data created since the backup was made will be lost including admin users, customers and orders.')?></div> - <div class="question"><?php echo $this->__('Are you sure you want to proceed?')?></div> - </div> - <div class="buttons-set"> - <div class="f-right"> - <button type="button" class="scalable " onclick="backup.requestPassword()"><span><?php echo $this->__('OK')?></span></button> - <button type="button" class="scalable " onclick="backup.hidePopups()"><span><?php echo $this->__('Cancel')?></span></button> +<!-- TODO: refactor form styles and js --> +<div class="fade backup-dialog" id="rollback-warning" style="display: none;"> + <div class="popup popup-notice"> + <div class="popup-inner"> + <header class="popup-header"> + <h2 class="popup-title"><?php echo $this->__('Warning') ?></h2> + </header> + <div class="popup-content"> + <p class="message-text"><?php echo $this->__('Any data created since the backup was made will be lost including admin users, customers and orders.')?></p> + <p class="message-text"><?php echo $this->__('Are you sure you want to proceed?')?></p> + <button type="button" onclick="backup.requestPassword()"><?php echo $this->__('OK')?></button> + <button type="button" onclick="backup.hidePopups()"><?php echo $this->__('Cancel')?></button> </div> </div> </div> </div> -<div class="backup-dialog" style="display: none;" id="backup-warning"> - <div class="entry-edit"> - <div class="entry-edit-head"> - <h4 class="head-edit-form fieldset-legend"><?php echo $this->__('Warning') ?></h4> - </div> - <div class="content"> - <div class="backup-messages" style="display: none;"><ul class="messages"></ul></div> - <div><?php echo $this->__("The backup's creation process will take time.")?></div> - <div><?php echo $this->__('You will need to wait when the action ends.')?></div> - <div><?php echo $this->__('Do you really want to proceed?')?></div> - </div> - <div class="buttons-set"> - <div class="f-right"> - <button type="button" class="scalable " onclick="backup.requestBackupOptions()"><span><?php echo $this->__('OK')?></span></button> - <button type="button" class="scalable " onclick="backup.hidePopups()"><span><?php echo $this->__('Cancel')?></span></button> +<div class="fade backup-dialog" id="backup-warning" style="display: none;"> + <div class="popup popup-notice"> + <div class="popup-inner"> + <header class="popup-header"> + <h2 class="popup-title"><?php echo $this->__('Warning') ?></h2> + </header> + <div class="popup-content"> + <p class="message-text"> + <?php echo $this->__("The backup's creation process will take time.")?><br> + <?php echo $this->__('You will need to wait when the action ends.')?><br> + <?php echo $this->__('Do you really want to proceed?')?> + </p> + <button type="button" onclick="backup.requestBackupOptions()"><?php echo $this->__('OK')?></button> + <button type="button" onclick="backup.hidePopups()"><?php echo $this->__('Cancel')?></button> </div> </div> </div> </div> -<div class="backup-dialog" style="display: none;" id="backup-options"> - <div class="entry-edit"> - <div class="entry-edit-head"> - <h4 class="head-edit-form fieldset-legend"><?php echo $this->__('Backup options') ?></h4> - </div> - <div class="content"> - <div class="backup-messages" style="display: none;"><ul class="messages"></ul></div> - <div><?php echo $this->__('Please specify backup creation options')?></div> - <form action="" method="post" id="backup-form" onsubmit="return backup.submitBackup();"> - <table class="form-list question" cellspacing="0"> - <tr> - <td style="padding-right: 8px;"><label for="backup_name" class="nobr"><?php echo $this->__('Backup Name')?></label></td> - <td> - <input type="text" name="backup_name" id="backup_name" class="validate-alphanum-with-spaces validate-length maximum-length-50" style="width: 343px" maxlength="50" /> - <p class="note"><span><?php echo $this->__('Please use only letters (a-z or A-Z), numbers (0-9) or spaces in this field.'); ?></span></p> - </td> - </tr> - <tr> - <td> </td> - <td class="maintenance-checkbox-container"> - <input type="checkbox" name="maintenance_mode" value="1" id="backup_maintenance_mode"/> - <label for="backup_maintenance_mode"><?php echo $this->__('Put store on the maintenance mode while backup creation')?></label> - </td> - </tr> - <tr id="exclude-media-checkbox-container" style="display: none;"> - <td> </td> - <td> - <input type="checkbox" name="exclude_media" value="1" id="exclude_media"/> - <label for="exclude_media"><?php echo $this->__('Exclude media folder from backup')?></label> - </td> - </tr> - </table> - </form> - </div> - <div class="buttons-set"> - <div class="f-right"> - <button type="button" class="scalable " onclick="backup.submitBackup()"><span><?php echo $this->__('OK')?></span></button> - <button type="button" class="scalable " onclick="backup.hidePopups()"><span><?php echo $this->__('Cancel')?></span></button> - </div> - </div> - </div> - </div> +<div class="fade backup-dialog" id="backup-options" style="display: none;"> + <div class="popup popup-notice"> + <div class="popup-inner"> + <header class="popup-header"> + <h2 class="popup-title"><?php echo $this->__('Backup options') ?></h2> + </header> + <div class="popup-content"> + <div style="display: none;"><ul class="messages"></ul></div> + <p class="message-text"><?php echo $this->__('Please specify backup creation options')?></p> + <form action="" method="post" id="backup-form" onsubmit="return backup.submitBackup();"> + <div class="form-list question"> -<div class="backup-dialog" style="display: none;" id="rollback-request-password"> - <div class="entry-edit"> - <div class="entry-edit-head"> - <h4 class="head-edit-form fieldset-legend"><?php echo $this->__('Please enter password') ?></h4> - </div> - <div class="content"> - <div class="backup-messages" style="display: none;"><ul class="messages"></ul></div> - <div><?php echo $this->__('Please enter password to confirm rollback.')?></div> - <div><?php echo $this->__('This action cannot be undone.')?></div> - <div class="question"><?php echo $this->__('Are you sure you want to proceed?')?></div> - <form action="" method="post" id="rollback-form" onsubmit="return backup.submitRollback();"> - <div class="password-box-container"> - <table class="form-list" cellspacing="0"> - <tr> - <td style="padding-right: 8px;"><label for="password" class="nobr"><?php echo $this->__('User Password')?> <span class="required">*</span></label></td> - <td><input type="password" name="password" id="password" class="required-entry"></td> - </tr> - <tr> - <td> </td> - <td class="maintenance-checkbox-container"> - <input type="checkbox" name="maintenance_mode" value="1" id="rollback_maintenance_mode"/> - <label for="rollback_maintenance_mode"><?php echo $this->__('Put store on the maintenance mode while rollback processing')?></label> - </td> - </tr> - <tr id="use-ftp-checkbox-row" style="display: none;"> - <td> </td> - <td><input type="checkbox" name="use_ftp" value="1" id="use_ftp" onClick="backup.toggleFtpCredentialsForm();"/> <label for="use_ftp"><?php echo $this->__('Use FTP Connection')?></label></td> - </tr> - </table> - </div> - <div class="entry-edit" id="ftp-credentials-container" style="display: none;"> - <div class="entry-edit-head"> - <h4 class=""><?php echo $this->__('FTP credentials')?></h4> + <label for="backup_name" class="nobr"><?php echo $this->__('Backup Name')?></label> + <input type="text" name="backup_name" id="backup_name" class="validate-alphanum-with-spaces validate-length maximum-length-50" maxlength="50" /> + <div class="note"><?php echo $this->__('Please use only letters (a-z or A-Z), numbers (0-9) or spaces in this field.'); ?></div> + + <div class="maintenance-checkbox-container"> + <input type="checkbox" name="maintenance_mode" value="1" id="backup_maintenance_mode"/> + <label for="backup_maintenance_mode"><?php echo $this->__('Put store on the maintenance mode while backup creation')?></label> + </div> + + <div id="exclude-media-checkbox-container" style="display: none;"> + <input type="checkbox" name="exclude_media" value="1" id="exclude_media"/> + <label for="exclude_media"><?php echo $this->__('Exclude media folder from backup')?></label> + </div> </div> - <fieldset> - <table class="form-list" cellspacing="0"> - <tr> - <td class="label"><label for="ftp_host"><?php echo $this->__('FTP Host')?> <span class="required">*</span></label></td> - <td class="value"><input type="text" name="ftp_host" id="ftp_host"></td> - </tr> - <tr> - <td class="label"><label for="ftp_user"><?php echo $this->__('FTP Login')?> <span class="required">*</span></label></td> - <td class="value"><input type="text" name="ftp_user" id="ftp_user"></td> - </tr> - <tr> - <td class="label"><label for="ftp_pass"><?php echo $this->__('FTP Password')?> <span class="required">*</span></label></td> - <td class="value"><input type="password" name="ftp_pass" id="ftp_pass"></td> - </tr> - <tr> - <td class="label"><label for="ftp_path"><?php echo $this->__('Magento root directory')?></label></td> - <td class="value"><input type="text" name="ftp_path" id="ftp_path"></td> - </tr> - </table> - </fieldset> - </div> - </form> + </form> + + <button type="button" onclick="backup.submitBackup()"><?php echo $this->__('OK')?></button> + <button type="button" onclick="backup.hidePopups()"><?php echo $this->__('Cancel')?></button> + </div> </div> - <div class="buttons-set"> - <div class="f-right"> - <button type="button" class="scalable " onclick="backup.submitRollback()"><span><?php echo $this->__('OK')?></span></button> - <button type="button" class="scalable " onclick="backup.hidePopups()"><span><?php echo $this->__('Cancel')?></span></button> + </div> + </div> + +<div class="fade backup-dialog" id="rollback-request-password" style="display: none;"> + <div class="popup popup-notice"> + <div class="popup-inner"> + <header class="popup-header"> + <h2 class="popup-title"><?php echo $this->__('Please enter password') ?></h2> + </header> + <div class="popup-content"> + <div class="backup-messages" style="display: none;"><ul class="messages"></ul></div> + <p class="message-text"> + <?php echo $this->__('Please enter password to confirm rollback.')?><br> + <?php echo $this->__('This action cannot be undone.')?> + </p> + <p class="message-text"><?php echo $this->__('Are you sure you want to proceed?')?></p> + <form action="" method="post" id="rollback-form" onsubmit="return backup.submitRollback();"> + <div class="password-box-container"> + + <label for="password" class="nobr"><?php echo $this->__('User Password')?> <span class="required">*</span></label> + <input type="password" name="password" id="password" class="required-entry"> + + <div class="maintenance-checkbox-container"> + <input type="checkbox" name="maintenance_mode" value="1" id="rollback_maintenance_mode"/> + <label for="rollback_maintenance_mode"><?php echo $this->__('Put store on the maintenance mode while rollback processing')?></label> + </div> + + <div id="use-ftp-checkbox-row" style="display: none;"> + <input type="checkbox" name="use_ftp" value="1" id="use_ftp" onClick="backup.toggleFtpCredentialsForm();"/> <label for="use_ftp"><?php echo $this->__('Use FTP Connection')?></label> + </div> + </div> + <div class="entry-edit" id="ftp-credentials-container" style="display: none;"> + <h4><?php echo $this->__('FTP credentials')?></h4> + <fieldset> + <label for="ftp_host"><?php echo $this->__('FTP Host')?> <span class="required">*</span></label> + <input type="text" name="ftp_host" id="ftp_host"> + <br> + <label for="ftp_user"><?php echo $this->__('FTP Login')?> <span class="required">*</span></label> + <input type="text" name="ftp_user" id="ftp_user"> + <br> + <label for="ftp_pass"><?php echo $this->__('FTP Password')?> <span class="required">*</span></label> + <input type="password" name="ftp_pass" id="ftp_pass"> + <br> + <label for="ftp_path"><?php echo $this->__('Magento root directory')?></label> + <input type="text" name="ftp_path" id="ftp_path"> + </fieldset> + </div> + </form> + + <button type="button" onclick="backup.submitRollback()"><?php echo $this->__('OK')?></button> + <button type="button" onclick="backup.hidePopups()"><?php echo $this->__('Cancel')?></button> </div> </div> </div> </div> -<div id="popup-window-mask" style="display: none;"></div> - <?php $helper = Mage::helper('Mage_Backup_Helper_Data'); $rollbackUrl = $this->getUrl('*/*/rollback'); diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/backup/list.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/backup/list.phtml index a57455a1cdfe5919520011c8da6fc5a0a099d51d..1910577b98d42b8667aa83e185be28c60aacba03 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/backup/list.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/backup/list.phtml @@ -24,17 +24,10 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> -<table cellspacing="0"> - <tr> - <td style="width:50%;"><h3 class="icon-head head-backups-control"><?php echo Mage::helper('Mage_Backup_Helper_Data')->__('Backups') ?></h3></td> - <td class="form-buttons"> - <?php echo $this->getCreateSnapshotButtonHtml(); ?> - <?php echo $this->getCreateMediaBackupButtonHtml(); ?> - <?php echo $this->getCreateButtonHtml(); ?> - </td> - </tr> -</table> +<div class="page-actions"> + <?php echo $this->getCreateSnapshotButtonHtml(); ?> + <?php echo $this->getCreateMediaBackupButtonHtml(); ?> + <?php echo $this->getCreateButtonHtml(); ?> </div> <?php echo $this->getChildHtml('grid') ?> <?php echo $this->getGridHtml() ?> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog.xml b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog.xml index 341c97801ef48c29ce433853b493f9067eb3185d..890a1aedcd874c7b45a4ee429aeb07f40d17815a 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog.xml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog.xml @@ -43,7 +43,6 @@ <adminhtml_catalog_product_new> <update handle="editor"/> <reference name="head"> - <action method="addCss"><file>Mage_Catalog::product/product.css</file></action> <action method="addCss"><file>Mage_Adminhtml::jquery/fileUploader/css/jquery.fileupload-ui.css</file></action> <action method="addJs"><file>Mage_Adminhtml::jquery/fileUploader/jquery.iframe-transport.js</file></action> <action method="addJs"><file>Mage_Adminhtml::jquery/fileUploader/jquery.fileupload.js</file></action> @@ -61,7 +60,6 @@ <action method="addJs"><file>Mage_Adminhtml::catalog/type-switcher.js</file></action> <action method="addJs"><file>Mage_Adminhtml::catalog/product-variation.js</file></action> <action method="addJs"><file>Mage_Adminhtml::catalog/base-image-uploader.js</file></action> - <action method="addCss"><file>Mage_Adminhtml::catalog/base-image-uploader.css</file></action> <action method="addCss"><file>Mage_Adminhtml::catalog/configurable-product.css</file></action> </reference> <reference name="content"> @@ -97,7 +95,6 @@ <adminhtml_catalog_product_edit> <update handle="editor"/> <reference name="head"> - <action method="addCss"><file>Mage_Catalog::product/product.css</file></action> <action method="addCss"><file>Mage_Adminhtml::jquery/fileUploader/css/jquery.fileupload-ui.css</file></action> <action method="addJs"><file>Mage_Adminhtml::jquery/fileUploader/jquery.iframe-transport.js</file></action> <action method="addJs"><file>Mage_Adminhtml::jquery/fileUploader/jquery.fileupload.js</file></action> @@ -115,7 +112,6 @@ <action method="addJs"><file>Mage_Adminhtml::catalog/type-switcher.js</file></action> <action method="addJs"><file>Mage_Adminhtml::catalog/product-variation.js</file></action> <action method="addJs"><file>Mage_Adminhtml::catalog/base-image-uploader.js</file></action> - <action method="addCss"><file>Mage_Adminhtml::catalog/base-image-uploader.css</file></action> <action method="addCss"><file>Mage_Adminhtml::catalog/configurable-product.css</file></action> </reference> <reference name="content"> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/base-image-uploader.css b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/base-image-uploader.css deleted file mode 100644 index dcf636b05a8b28965df663af239ff9450bb2bab9..0000000000000000000000000000000000000000 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/base-image-uploader.css +++ /dev/null @@ -1,156 +0,0 @@ -/** - * Magento - * - * NOTICE OF LICENSE - * - * This source file is subject to the Academic Free License (AFL 3.0) - * that is bundled with this package in the file LICENSE_AFL.txt. - * It is also available through the world-wide-web at this URL: - * http://opensource.org/licenses/afl-3.0.php - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@magentocommerce.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade Magento to newer - * versions in the future. If you wish to customize Magento for your - * needs please refer to http://www.magentocommerce.com for more information. - * - * @category Mage - * @package Mage_Adminhtml - * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) - * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) - */ - -#product-edit-form-tabs > div:first-of-type .hor-scroll { - width: auto; - overflow: visible; - position: relative; -} - - - -#product-edit-form-tabs #qty { - width: 50px; - margin-right: 16px; - text-align: right; - padding-right: 3px; -} - -#product-edit-form-tabs #quantity_and_stock_status { - width: 204px; -} - -#product-edit-form-tabs #short_description { - height: auto; - min-height: 3em; -} - -#product-edit-form-tabs #image-container { - border: 2px dotted #CCC; - border-radius: 5px; - padding: 6px 15px; - margin-right: 8px; - height: 140px; -} - -#product-edit-form-tabs #image-container > span.container { - padding: 3px; - margin: 3px; - cursor: move; - display: inline-block; - vertical-align: top; - background: #fff; - border: 1px solid #ccc; - border-radius: 3px; - width: 100px; - height: 120px; - overflow: hidden; -} - -#product-edit-form-tabs #image-container > span:hover { - box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); -} - -#product-edit-form-tabs .base-image-uploader { - max-height: 80px; - max-width: 100px; -} - -#product-edit-form-tabs #image-upload-placeholder { - width: 100px; - height: 120px; - background: #fff url('Mage_Adminhtml::images/image-placeholder.png') no-repeat; - vertical-align: top; - display: inline-block; - border: 1px solid #ccc; - border-radius: 3px; - padding: 3px; - margin: 3px; -} - -#product-edit-form-tabs #image-container .container .main-sticker { - display: none; -} - -#product-edit-form-tabs #image-container .container.base-image .main-sticker { - color: #fff; - background-color: orange; - padding: 0 39px 0 25px; - -moz-transform: rotate(-50deg); - -webkit-transform: rotate(-50deg); - -o-transform: rotate(-50deg); - -ms-transform: rotate(-50deg); - transform: rotate(-50deg); - display: block; - margin-left: -64px; -} - -#product-edit-form-tabs #image-container .container .close { - font-size: 20px; - line-height: 10px; - float: right; - cursor: pointer; - position: relative; - margin-bottom: -20px; - padding-top: 10px; - z-index: 1; - visibility: hidden; - background: #fff; -} - -#product-edit-form-tabs #image-container .container.base-image .close { - top: -18px; -} - -#product-edit-form-tabs #image-container .container.active .close { - visibility: visible; -} - -#product-edit-form-tabs #image-container .container .drag-zone button, -#product-edit-form-tabs #image-container .container.base-image .drag-zone button.make-main { - display: none; -} - -#product-edit-form-tabs #image-container .container, #product-edit-form-tabs #image-container .container .drag-zone { - text-align: center; -} - -#product-edit-form-tabs #image-container .container .drag-zone { - position: absolute; - top: 145px; - width: 100px; -} - -#product-edit-form-tabs #image-container .container.active .drag-zone button { - display: inline-block; -} - -#product-edit-form-tabs #image-container .container img { - margin-top: 10px; -} - -#product-edit-form-tabs #image-container .container.base-image img { - margin-top: -8px; -} diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/base-image-uploader.js b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/base-image-uploader.js index f9bdf5ecb86d94ac3ecd2be0d9177949034c30cf..3e148a98c4e87d9be4661001b6bda157516077a9 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/base-image-uploader.js +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/base-image-uploader.js @@ -62,14 +62,14 @@ function BaseImageUploader(id, maxFileSize) { $('input[name="product[name]"]').focus().blur(); // prevent just inserted image selection }); - $container.on('click', '.container', function (event) { + $container.on('click', '.image', function (event) { $(this).toggleClass('active').siblings().removeClass('active'); }); - $container.on('click', '.make-main', function (event) { - var $imageContainer = $(this).closest('.container'), + $container.on('click', '.action-make-main', function (event) { + var $imageContainer = $(this).closest('.image'), image = $imageContainer.data('image'); - $container.find('.container').removeClass(mainClass); + $container.find('.image').removeClass(mainClass); $imageContainer.addClass(mainClass); mainImage = image.file; @@ -86,8 +86,8 @@ function BaseImageUploader(id, maxFileSize) { _getGalleryRowByImage(image).find(radiosToSwitch).trigger('click'); }); - $container.on('click', '.close', function (event) { - var $imageContainer = $(this).closest('.container'), + $container.on('click', '.action-delete', function (event) { + var $imageContainer = $(this).closest('.image'), image = $imageContainer.data('image'), $galleryRow = _getGalleryRowByImage(image); @@ -114,7 +114,7 @@ function BaseImageUploader(id, maxFileSize) { $container.sortable({ axis: 'x', - handle: '.container' + handle: '.image' }); $dropPlaceholder.on('click', function(e) { diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/category-selector.css b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/category-selector.css index e24950e4af7a430390204c6e6605d86f9213e26d..797a22a0dea3add4af5f9c67f70a3405bccc9e9f 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/category-selector.css +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/category-selector.css @@ -22,564 +22,121 @@ * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ -.category-selector-container { - position:relative; - display:inline-block; - vertical-align:top; - width:99%; - margin-bottom: 6px; -} - -.category-selector-container, -.category-selector-drop, -.category-selector-search, -.category-selector-search input { - -moz-box-sizing:border-box; - -ms-box-sizing:border-box; - -webkit-box-sizing:border-box; - -khtml-box-sizing:border-box; - box-sizing:border-box; -} - -.category-selector-container .category-selector-choice { - background-color:#fff; - background-image:-webkit-gradient(linear, left bottom, left top, color-stop(0, #eeeeee), color-stop(0.5, white)); - background-image:-webkit-linear-gradient(center bottom, #eeeeee 0%, white 50%); - background-image:-moz-linear-gradient(center bottom, #eeeeee 0%, white 50%); - background-image:-o-linear-gradient(bottom, #eeeeee 0%, #ffffff 50%); - background-image:-ms-linear-gradient(top, #eeeeee 0%, #ffffff 50%); - background-image:linear-gradient(top, #eeeeee 0%, #ffffff 50%); - border-radius:4px; - background-clip:padding-box; - border:1px solid #aaa; - display:block; - overflow:hidden; - white-space:nowrap; - position:relative; - height:26px; - line-height:26px; - padding:0 0 0 8px; - color:#444; - text-decoration:none; -} - -.category-selector-container.category-selector-drop-above .category-selector-choice { - border-bottom-color:#aaa; - border-radius:0px 0px 4px 4px; - background-image:-webkit-gradient(linear, left bottom, left top, color-stop(0, #eeeeee), color-stop(0.9, white)); - background-image:-webkit-linear-gradient(center bottom, #eeeeee 0%, white 90%); - background-image:-moz-linear-gradient(center bottom, #eeeeee 0%, white 90%); - background-image:-o-linear-gradient(bottom, #eeeeee 0%, white 90%); - background-image:-ms-linear-gradient(top, #eeeeee 0%, #ffffff 90%); - background-image:linear-gradient(top, #eeeeee 0%, #ffffff 90%); -} - -.category-selector-container .category-selector-choice span { - margin-right:26px; - display:block; - overflow:hidden; - white-space:nowrap; - -o-text-overflow:ellipsis; - -ms-text-overflow:ellipsis; - text-overflow:ellipsis; -} - -.category-selector-container .category-selector-choice abbr { - display:block; - position:absolute; - right:26px; - top:8px; - width:12px; - height:12px; - font-size:1px; - background:url('images/select2.png') right top no-repeat; - cursor:pointer; - text-decoration:none; - border:0; - outline:0; -} -.category-selector-container .category-selector-choice abbr:hover { - background-position:right -11px; - cursor:pointer; -} - -.category-selector-drop { - background:#fff; - color:#000; - border:1px solid #ccc; - border-top:0; - position:absolute; - top:100%; - box-shadow: 0 3px 6px rgba(0, 0, 0, 0.2); - z-index:9999; - width:100%; - margin-top:-3px; - border-radius:0 0 3px 3px; -} - -.category-selector-drop.category-selector-drop-above { - border-radius:3px 3px 0 0; - margin-top:3px; - border-top:1px solid #ccc; - border-bottom:0; - box-shadow: 0 -3px 6px rgba(0, 0, 0, 0.2); -} - -.category-selector-container .category-selector-choice div { - border-radius:0 4px 4px 0; - background-clip:padding-box; - background:#ccc; - background-image:-webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee)); - background-image:-webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%); - background-image:-moz-linear-gradient(center bottom, #ccc 0%, #eee 60%); - background-image:-o-linear-gradient(bottom, #ccc 0%, #eee 60%); - background-image:-ms-linear-gradient(top, #cccccc 0%, #eeeeee 60%); - background-image:linear-gradient(top, #cccccc 0%, #eeeeee 60%); - border-left:1px solid #aaa; - position:absolute; - right:0; - top:0; - display:block; - height:100%; - width:18px; -} - -.category-selector-container .category-selector-choice div b { - background:url('images/select2.png') no-repeat 0 1px; - display:block; - width:100%; - height:100%; -} - -.category-selector-search { - display:inline-block; - white-space:nowrap; - z-index:10000; - min-height:26px; - width:100%; - margin:0; - padding-left:4px; - padding-right:4px; -} - -.category-selector-search-hidden { - display:block; - position:absolute; - left:-10000px; -} - -.category-selector-search input { - background:#fff url('images/select2.png') no-repeat 100% -22px; - background:url('images/select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee)); - background:url('images/select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background:url('images/select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background:url('images/select2.png') no-repeat 100% -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%); - background:url('images/select2.png') no-repeat 100% -22px, -ms-linear-gradient(top, #ffffff 85%, #eeeeee 99%); - background:url('images/select2.png') no-repeat 100% -22px, linear-gradient(top, #ffffff 85%, #eeeeee 99%); - padding:4px 20px 4px 5px; - outline:0; - border:1px solid #aaa; - font-family:sans-serif; - font-size:1em; - width:100%; - margin:0; - height:auto !important; - min-height:26px; - box-shadow:none; - border-radius:0; -} - -.category-selector-drop.category-selector-drop-above .category-selector-search input { - margin-top:4px; -} - -.category-selector-search input.ui-autocomplete-loading, input.input-text.ui-autocomplete-loading { - background:#fff url('images/spinner.gif') no-repeat 100%; - background:url('images/spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee)); - background:url('images/spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background:url('images/spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background:url('images/spinner.gif') no-repeat 100%, -o-linear-gradient(bottom, white 85%, #eeeeee 99%); - background:url('images/spinner.gif') no-repeat 100%, -ms-linear-gradient(top, #ffffff 85%, #eeeeee 99%); - background:url('images/spinner.gif') no-repeat 100%, linear-gradient(top, #ffffff 85%, #eeeeee 99%); -} - -.category-selector-container-active .category-selector-choice, -.category-selector-container-active .category-selector-choices { - box-shadow:0 0 5px rgba(0, 0, 0, .3); - border:1px solid #74B9EF; - outline:none; -} - -.category-selector-dropdown-open .category-selector-choice { - border:1px solid #aaa; - border-bottom-color:transparent; - box-shadow:0 1px 0 #fff inset; - background-color:#eee; - background-image:-webkit-gradient(linear, left bottom, left top, color-stop(0, white), color-stop(0.5, #eeeeee)); - background-image:-webkit-linear-gradient(center bottom, white 0%, #eeeeee 50%); - background-image:-moz-linear-gradient(center bottom, white 0%, #eeeeee 50%); - background-image:-o-linear-gradient(bottom, white 0%, #eeeeee 50%); - background-image:-ms-linear-gradient(top, #ffffff 0%, #eeeeee 50%); - background-image:linear-gradient(top, #ffffff 0%, #eeeeee 50%); - -webkit-border-bottom-left-radius:0; - -webkit-border-bottom-right-radius:0; - -moz-border-radius-bottomleft:0; - -moz-border-radius-bottomright:0; - border-bottom-left-radius:0; - border-bottom-right-radius:0; -} - -.category-selector-dropdown-open .category-selector-choice div { - background:transparent; - border-left:none; -} -.category-selector-dropdown-open .category-selector-choice div b { - background-position:-18px 1px; -} - -/* results */ -.category-selector-results { - margin:4px 4px 4px 0; - padding:0 0 0 4px; - position:relative; - overflow-x:hidden; - overflow-y:auto; - max-height:200px; -} - -.category-selector-results ul.category-selector-result-sub { - margin:0; - padding:0; -} - -.category-selector-results ul.category-selector-result-sub > li .category-selector-result-label { padding-left:20px } -.category-selector-results ul.category-selector-result-sub ul.category-selector-result-sub > li .category-selector-result-label { padding-left:40px } -.category-selector-results ul.category-selector-result-sub ul.category-selector-result-sub ul.category-selector-result-sub > li .category-selector-result-label { padding-left:60px } -.category-selector-results ul.category-selector-result-sub ul.category-selector-result-sub ul.category-selector-result-sub ul.category-selector-result-sub > li .category-selector-result-label { padding-left:80px } -.category-selector-results ul.category-selector-result-sub ul.category-selector-result-sub ul.category-selector-result-sub ul.category-selector-result-sub ul.category-selector-result-sub > li .category-selector-result-label { padding-left:100px } -.category-selector-results ul.category-selector-result-sub ul.category-selector-result-sub ul.category-selector-result-sub ul.category-selector-result-sub ul.category-selector-result-sub ul.category-selector-result-sub > li .category-selector-result-label { padding-left:110px } -.category-selector-results ul.category-selector-result-sub ul.category-selector-result-sub ul.category-selector-result-sub ul.category-selector-result-sub ul.category-selector-result-sub ul.category-selector-result-sub ul.category-selector-result-sub > li .category-selector-result-label { padding-left:120px } -.category-selector-results li { - list-style:none; - display:list-item; -} - -.category-selector-results li.category-selector-result-with-children > .category-selector-result-label { - font-weight:bold; -} - -.category-selector-results .category-selector-result-label { - padding:3px 7px 4px; - margin:0; - cursor:pointer; +.category-selector-container { + position: relative; + display: inline-block; + vertical-align: top; + margin: 0 6px 6px 0; + width: 73.6%; + padding: 2px; + padding-right: 30px; + background-color: #fff; + border: 1px solid #ccc; + border-radius: 3px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } -.category-selector-results .category-selector-highlighted { - background:#3875d7; - color:#fff; -} -.category-selector-results li em { - background:#feffde; - font-style:normal; -} -.category-selector-results .category-selector-highlighted em { - background:transparent; -} -.category-selector-results .category-selector-no-results { - padding:3px; -} -.category-selector-results .category-selector-no-results, -.category-selector-results .category-selector-searching, -.category-selector-results .category-selector-selection-limit { - background:#f4f4f4; - display:list-item; -} -.category-selector-results .category-selector-disabled { - display:none; -} -.category-selector-more-results.ui-autocomplete-loading { - background:#f4f4f4 url('images/spinner.gif') no-repeat 100%; +.category-selector-container:after { + position: absolute; + top: 0; + right: 5px; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e013'; /* unordered list icon */ + font-size: 20px; + color: #b2b2b2; } -.category-selector-more-results { - background:#f4f4f4; - display:list-item; +.category-selector-choices { + margin: 0; + padding: 0; + list-style: none; } -/* disabled styles */ -.category-selector-container.category-selector-container-disabled .category-selector-choice { - background-color:#f4f4f4; - background-image:none; - border:1px solid #ddd; - cursor:default; +.category-selector-choices > li { + display: inline-block; } -.category-selector-container.category-selector-container-disabled .category-selector-choice div { - background-color:#f4f4f4; - background-image:none; - border-left:0; +.category-selector-search-field { + white-space: nowrap; + margin: 0; + padding: 0; } -/* multiselect */ - -.category-selector-container-multi .category-selector-choices { - background-color:#fff; - border:1px solid #ccc; - margin:0; - padding:0; - cursor:text; - overflow:hidden; - min-height:28px; - position:relative; - box-sizing:border-box; - border-radius:3px; - box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition:border linear 0.2s, box-shadow linear 0.2s; - -moz-transition:border linear 0.2s, box-shadow linear 0.2s; - -ms-transition:border linear 0.2s, box-shadow linear 0.2s; - -o-transition:border linear 0.2s, box-shadow linear 0.2s; - transition:border linear 0.2s, box-shadow linear 0.2s; +.category-selector-search-field > input, +.category-selector-search-field > input:focus, +.category-selector-search-field > input:active { + height: 22px; + line-height: 22px; + outline: 0 none; + border: 0 none; + box-shadow: none; + padding: 0 3px; } -.category-selector-container-multi.category-selector-container-active .category-selector-choices { - box-shadow:0 0 5px rgba(0, 0, 0, .3); - border:1px solid #74B9EF; - outline:none; -} -.category-selector-container-multi .category-selector-choices li { - float:left; - list-style:none; -} -.category-selector-container-multi .category-selector-choices .category-selector-search-field { - white-space:nowrap; - margin:0; - padding:0; +.category-selector-search-field > input.ui-autocomplete-loading { + background: #fff url('images/spinner.gif') no-repeat 100%; } -.category-selector-container-multi .category-selector-choices .category-selector-search-field input { - color:#666; - background:transparent !important; - font-family:sans-serif; - font-size:100%; - height:22px; - padding:5px; - margin:1px 0; - outline:0; - border:0; - box-shadow:none; +.category-selector-search-choice { + position: relative; + background: #cdecf6; + border: 1px solid #a7cedb; + border-radius: 3px; + padding: 2px 22px 1px 9px; + margin: 0 2px 2px 0; + vertical-align: top; + cursor: default; + -moz-transition: background .3s; + -webkit-transition: background .3s; + transition: background .3s; } -.category-selector-container-multi .category-selector-choices .category-selector-search-field input.ui-autocomplete-loading { - background:#fff url('images/spinner.gif') no-repeat 100% !important; +.category-selector-search-choice:hover { + background: #aae3f5; } -.category-selector-default { - color:#999 !important; +.category-selector-search-choice > input { } -.category-selector-container-multi .category-selector-choices .category-selector-search-choice { - margin:3px 0 3px 5px; - padding-left:15px; - position:relative; - cursor:default; -} -.category-selector-container-multi .category-selector-choices .category-selector-search-choice span { - cursor:default; -} -.category-selector-container-multi .category-selector-choices .category-selector-search-choice-focus { - background:#d4d4d4; +.category-selector-search-choice > div { } .category-selector-search-choice-close { - display:block; - position:absolute; - right:3px; - top:4px; - width:12px; - height:13px; - font-size:1px; - background:url('images/select2.png') right top no-repeat; - outline:none; -} - -.category-selector-container-multi .category-selector-search-choice-close { - left:3px; - top:7px; -} - -.category-selector-container-multi .category-selector-choices .category-selector-search-choice .category-selector-search-choice-close:hover { - background-position:right -11px; -} -.category-selector-container-multi .category-selector-choices .category-selector-search-choice-focus .category-selector-search-choice-close { - background-position:right -11px; -} - -/* disabled styles */ - -.category-selector-container-multi.category-selector-container-disabled .category-selector-choices { - background-color:#f4f4f4; - background-image:none; - border:1px solid #ddd; - cursor:default; -} - -.category-selector-container-multi.category-selector-container-disabled .category-selector-choices .category-selector-search-choice { - background-image:none; - background-color:#f4f4f4; - border:1px solid #ddd; - padding:3px 5px 3px 5px; -} - -.category-disabled a{ - color: #808080; -} - -.category-selected a{ - background-color: #0000ff; - color: #FFF; -} -.category-selector-container-multi.category-selector-container-disabled .category-selector-choices .category-selector-search-choice .category-selector-search-choice-close { - display:none; -} -/* end multiselect */ - -.category-selector-result-selectable .category-selector-match, -.category-selector-result-unselectable .category-selector-result-selectable .category-selector-match { - text-decoration:underline; -} -.category-selector-result-unselectable .category-selector-match { - text-decoration:none; -} - -.category-selector-offscreen { - position:absolute; left:-10000px; -} - -.category-selector-results li { - margin-bottom:1px; + position: absolute; + top: 0; + right: 0; + bottom: 0; + width: 20px; + line-height: 16px; + text-align: center; + color: #7b94a1; + cursor: pointer; } -.parent { - font-weight:bold; -} -.parent.level-1 { - margin-left:0; -} -.level-1, -.parent.level-2 { - margin-left:15px; -} -.level-2, -.parent.level-3 { - margin-left:25px; -} -.level-3, -.parent.level-4 { - margin-left:35px; -} -.level-4, -.parent.level-5{ - margin-left:45px; -} -.level-5 { - margin-left:55px; +.category-selector-search-choice-close:hover { + color: #000; } -/* Retina-ize icons */ -@media only screen and (-webkit-min-device-pixel-ratio: 1.5) { - .category-selector-search input, - .category-selector-search-choice-close, - .category-selector-container .category-selector-choice abbr, - .category-selector-container .category-selector-choice div b { - background-image:url(images/select2x2.png) !important; - background-repeat:no-repeat !important; - background-size:60px 40px !important; - } - .category-selector-search input { - background-position:100% -21px !important; - } +.category-selector-search-choice-close:before { + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e07d'; /* close icon */ + font-size: 6px; } -/* TODO: remove after Magento User Interface framework integration */ -/* ============================================================================= - Buttons - ========================================================================== */ -.button { - position:relative; - display: inline-block; - padding: 4px 10px; - margin-bottom: 0; - font-size: 13px; - line-height: 18px; - color: #333; - text-align: center; - text-decoration:none; - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - vertical-align: middle; - cursor: pointer; - background: #ffffff; - background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNlNmU2ZTYiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); - background: -moz-linear-gradient(top, #ffffff 0%, #e6e6e6 100%); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ffffff), color-stop(100%,#e6e6e6)); - background: -webkit-linear-gradient(top, #ffffff 0%,#e6e6e6 100%); - background: -o-linear-gradient(top, #ffffff 0%,#e6e6e6 100%); - background: -ms-linear-gradient(top, #ffffff 0%,#e6e6e6 100%); - background: linear-gradient(to bottom, #ffffff 0%,#e6e6e6 100%); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#e6e6e6',GradientType=0 ); - border: 1px solid #ccc; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -webkit-touch-callout: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.ie9 .button { - padding-top:5px; - padding-bottom:3px; - filter:none; +.category-selector-input { } -.button:hover { - text-decoration: none; - background: #f9f9f9; - background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y5ZjlmOSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNlNmU2ZTYiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); - background: -moz-linear-gradient(top, #f9f9f9 0%, #e6e6e6 100%); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f9f9f9), color-stop(100%,#e6e6e6)); - background: -webkit-linear-gradient(top, #f9f9f9 0%,#e6e6e6 100%); - background: -o-linear-gradient(top, #f9f9f9 0%,#e6e6e6 100%); - background: -ms-linear-gradient(top, #f9f9f9 0%,#e6e6e6 100%); - background: linear-gradient(to bottom, #f9f9f9 0%,#e6e6e6 100%); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f9f9f9', endColorstr='#e6e6e6',GradientType=0 ); -} -.button:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.button:active -.button.active { - background-color: #e6e6e6; - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -} -.button[disabled] { - cursor: not-allowed; - background-color: #e6e6e6; - background-image: none; - opacity: 0.65; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -.button:visited { - color:#333; -} +.ui-helper-hidden-accessible { + display: none; +} \ No newline at end of file diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/category-selector.js b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/category-selector.js index 3ca48f75a23651d757d1be0908b0af1faf7b9631..6d509ab3880c66830ef71f087e076ebbb4faced3 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/category-selector.js +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/category-selector.js @@ -63,10 +63,10 @@ }; $this.bind('categorySelector:add', function(event, args) { - $('<li class="category-selector-search-choice button"/>') + $('<li class="category-selector-search-choice"/>') .data(args.data || {}) .append($('<input type="hidden" />').attr('name', name).val(args.value)) - .append($('<div/>').text(args.text)) + .append($('<strong/>').text(args.text)) .append('<span ' + 'class="category-selector-search-choice-close" tabindex="-1"></span>' ) @@ -135,7 +135,7 @@ .attr('title', item.path) .addClass('level-' + level) .text(item.label) - .css({marginLeft: level * 16}) + .css({paddingLeft: level * 16}) ); if (window.parseInt(item.item.is_active, 10) === 0) { $li.addClass('category-disabled'); diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/category/edit.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/category/edit.phtml index e516d31ee3defd36b231d1f76f29569f7585ae08..4eeb86245821196b09fe229745b5e82b69e7a650 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/category/edit.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/category/edit.phtml @@ -72,7 +72,7 @@ params.form_key = FORM_KEY; } - jQuery('.content-header').floatingHeader('destroy'); + jQuery('.page-actions').floatingHeader('destroy'); /*if(params.node_name) { @@ -96,7 +96,7 @@ if (refreshTree) { thisObj.refreshTreeArea(); } - jQuery('.content-header').floatingHeader(); + jQuery('.page-actions').floatingHeader({ 'title': '.category-edit-title'}); } catch (e) { alert(e.message); }; @@ -186,13 +186,9 @@ } } } - - function displayLoadingMask() - { - var loaderArea = $$('#html-body .wrapper')[0]; // Blocks all page - Position.clone($(loaderArea), $('loading-mask'), {offsetLeft:-2}); - toggleSelectsUnderBlock($('loading-mask'), false); - Element.show('loading-mask'); + /* TODO: Convert to jQuery all js in this file */ + function displayLoadingMask() { + $('body').loadingPopup(); } //]]> </script> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/category/edit/form.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/category/edit/form.phtml index b9fa3d8214d4583805003f0ff373612b585d6e4d..8329f79f0cd4ab8838a3a7234e345577fa2ae84a 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/category/edit/form.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/category/edit/form.phtml @@ -24,47 +24,48 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> - -<div class="content-header"> - <h3 class="icon-head head-categories"><?php echo $this->escapeHtml($this->getHeader()) . ($this->getCategoryId() ? ' (' . Mage::helper('Mage_Catalog_Helper_Data')->__('ID: %s', $this->getCategoryId()) . ')' : '') ?></h3> - <p class="content-buttons form-buttons"> - <?php echo $this->getResetButtonHtml() ?> - <?php if($this->getCategoryId()): ?> - <?php echo $this->getDeleteButtonHtml() ?> - <?php endif; ?> - <?php echo $this->getAdditionalButtonsHtml(); ?> - <?php echo $this->getSaveButtonHtml() ?> - </p> +<div class="category-edit-title"> + <h3 class="title"><?php echo $this->escapeHtml($this->getHeader()) . ($this->getCategoryId() ? ' (' . Mage::helper('Mage_Catalog_Helper_Data')->__('ID: %s', $this->getCategoryId()) . ')' : '') ?></h3> +</div> +<div class="page-actions"> + <?php echo $this->getResetButtonHtml() ?> + <?php if ($this->getCategoryId()): ?> + <?php echo $this->getDeleteButtonHtml() ?> + <?php endif; ?> + <?php echo $this->getAdditionalButtonsHtml(); ?> + <?php echo $this->getSaveButtonHtml() ?> </div> -<?php if($this->hasStoreRootCategory()): ?> +<?php if ($this->hasStoreRootCategory()): ?> <?php echo $this->getTabsHtml() ?> <?php else: ?> <div class="messages warning-msg"> <?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Set root category for this store in the <a href="%s">configuration</a>', $this->getStoreConfigurationUrl()) ?> </div> <?php endif; ?> -<iframe name="iframeSave" style="display:none; width:100%;" src="<?php echo $this->getViewFileUrl('blank.html') ?>"></iframe> -<form target="iframeSave" id="category_edit_form" action="<?php echo $this->getSaveUrl() ?>" method="post" enctype="multipart/form-data"> +<iframe name="iframeSave" style="display:none; width:100%;" + src="<?php echo $this->getViewFileUrl('blank.html') ?>"></iframe> +<form target="iframeSave" id="category_edit_form" action="<?php echo $this->getSaveUrl() ?>" method="post" + enctype="multipart/form-data"> <div class="no-display"> - <input type="hidden" name="isIframe" value="1" /> - <input name="form_key" type="hidden" value="<?php echo $this->getFormKey() ?>" /> - <input type="hidden" name="category_products" id="in_category_products" value="" /> - <input type="hidden" name="active_tab_id" id="active_tab_id" value="" /> + <input type="hidden" name="isIframe" value="1"/> + <input name="form_key" type="hidden" value="<?php echo $this->getFormKey() ?>"/> + <input type="hidden" name="category_products" id="in_category_products" value=""/> + <input type="hidden" name="active_tab_id" id="active_tab_id" value=""/> </div> <div id="category_tab_content"></div> </form> <script type="text/javascript"> (function($) { $.mage.extend('categoryForm', 'form', - '<?php echo $this->getViewFileUrl('Mage_Adminhtml::catalog/category/form.js') ?>'); + '<?php echo $this->getViewFileUrl('Mage_Adminhtml::catalog/category/form.js') ?>'); $('#category_edit_form') - .mage('categoryForm', {refreshUrl: '<?php echo $this->getRefreshPathUrl() ?>'}) - .mage('validation', {submitHandler: function(form){ - form.submit(); - displayLoadingMask(); - }}); + .mage('categoryForm', {refreshUrl: '<?php echo $this->getRefreshPathUrl() ?>'}) + .mage('validation', {submitHandler: function(form){ + form.submit(); + displayLoadingMask(); + }}); })(jQuery); -<?php if(($block = $this->getLayout()->getBlock('category.product.grid')) && ($_gridJsObject=$block->getJsObjectName())): ?> + <?php if(($block = $this->getLayout()->getBlock('category.product.grid')) && ($_gridJsObject=$block->getJsObjectName())): ?> var categoryProducts = $H(<?php echo $this->getProductsJson() ?>); $('in_category_products').value = categoryProducts.toQueryString(); @@ -118,19 +119,19 @@ } - <?php echo $_gridJsObject ?>.rowClickCallback = categoryProductRowClick; - <?php echo $_gridJsObject ?>.initRowCallback = categoryProductRowInit; - <?php echo $_gridJsObject ?>.checkboxCheckCallback = registerCategoryProduct; - <?php echo $_gridJsObject ?>.rows.each(function(row){categoryProductRowInit(<?php echo $_gridJsObject ?>, row)}); + <?php echo $_gridJsObject ?>.rowClickCallback = categoryProductRowClick; + <?php echo $_gridJsObject ?>.initRowCallback = categoryProductRowInit; + <?php echo $_gridJsObject ?>.checkboxCheckCallback = registerCategoryProduct; + <?php echo $_gridJsObject ?>.rows.each(function(row){categoryProductRowInit(<?php echo $_gridJsObject ?>, row)}); -<?php endif; ?> -<?php if($this->isAjax() && ($block = $this->getLayout()->getBlock('tabs')) && ($_tabsJsObject=$block->getJsObjectName())): ?> + <?php endif; ?> + <?php if($this->isAjax() && ($block = $this->getLayout()->getBlock('tabs')) && ($_tabsJsObject=$block->getJsObjectName())): ?> // Temporary solution, will be replaced after refactoring of manage category functionality - <?php $tabsBlock = $this->getLayout()->getBlock('tabs'); ?> + <?php $tabsBlock = $this->getLayout()->getBlock('tabs'); ?> var activeAnchor = jQuery('#<?php echo $tabsBlock->getId() ?>').tabs('activeAnchor'); if (activeAnchor.length) { $('active_tab_id').value = activeAnchor.prop('id'); } $('active_tab_id').tabsJsObject = jQuery('#<?php echo $tabsBlock->getId() ?>'); -<?php endif; ?> + <?php endif; ?> </script> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/category/tree.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/category/tree.phtml index 08791d07d511256e1d08c8c41483b17c1d516fcf..79db1d967b92b3a71b422ce67d8ac23caeebce0c 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/category/tree.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/category/tree.phtml @@ -25,22 +25,24 @@ */ ?> <div class="categories-side-col"> - <div class="content-header"> - <h3 class="icon-head head-categories"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Categories') ?></h3> - <?php if ($this->getRoot()): ?> - <?php echo $this->getAddRootButtonHtml() ?><br /> - <?php echo $this->getAddSubButtonHtml() ?> - <?php endif; ?> - </div> - <?php echo $this->getStoreSwitcherHtml();?> +<div class="sidebar-actions"> + <?php if ($this->getRoot()): ?> + <?php echo $this->getAddRootButtonHtml() ?><br/> + <?php echo $this->getAddSubButtonHtml() ?> + <?php endif; ?> +</div> +<?php echo $this->getStoreSwitcherHtml(); ?> <div class="tree-actions"> - <?php if($this->getRoot()): ?> - <?php //echo $this->getCollapseButtonHtml() ?> - <?php //echo $this->getExpandButtonHtml() ?> - <a href="#" onclick="tree.collapseTree(); return false;"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Collapse All'); ?></a> <span class="separator">|</span> <a href="#" onclick="tree.expandTree(); return false;"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Expand All'); ?></a> + <?php if ($this->getRoot()): ?> + <?php //echo $this->getCollapseButtonHtml() ?> + <?php //echo $this->getExpandButtonHtml() ?> + <a href="#" + onclick="tree.collapseTree(); return false;"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Collapse All'); ?></a> + <span class="separator">|</span> <a href="#" + onclick="tree.expandTree(); return false;"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Expand All'); ?></a> <?php endif; ?> </div> - <?php if ($this->getRoot()): ?> +<?php if ($this->getRoot()): ?> <div class="tree-holder"> <div id="tree-div" style="width:100%; overflow:auto;"></div> </div> @@ -52,31 +54,29 @@ var tree; /** * Fix ext compatibility with prototype 1.6 */ -Ext.lib.Event.getTarget = function(e) { +Ext.lib.Event.getTarget = function (e) { var ee = e.browserEvent || e; return ee.target ? Event.element(ee) : null; }; -Ext.tree.TreePanel.Enhanced = function(el, config) -{ +Ext.tree.TreePanel.Enhanced = function (el, config) { Ext.tree.TreePanel.Enhanced.superclass.constructor.call(this, el, config); }; Ext.extend(Ext.tree.TreePanel.Enhanced, Ext.tree.TreePanel, { - loadTree : function(config, firstLoad) - { + loadTree:function (config, firstLoad) { var parameters = config['parameters']; var data = config['data']; this.storeId = parameters['store_id']; - if ( this.storeId != 0 && $('add_root_category_button')) { + if (this.storeId != 0 && $('add_root_category_button')) { $('add_root_category_button').hide(); } if ((typeof parameters['root_visible']) != 'undefined') { - this.rootVisible = parameters['root_visible']*1; + this.rootVisible = parameters['root_visible'] * 1; } var root = new Ext.tree.TreeNode(parameters); @@ -106,13 +106,12 @@ Ext.extend(Ext.tree.TreePanel.Enhanced, Ext.tree.TreePanel, { this.selectCurrentNode(); // Temporary solution will be replaced after refactoring of tree functionality - jQuery('body').off('tabsactivate.tree').on('tabsactivate.tree', jQuery.proxy(function(e, ui){ + jQuery('body').off('tabsactivate.tree').on('tabsactivate.tree', jQuery.proxy(function (e, ui) { this.activeTab = jQuery(ui.newTab).find('a').prop('id'); }, this)) }, - request : function(url, params) - { + request:function (url, params) { if (!params) { if (this.activeTab) { var params = {active_tab_id:this.activeTab}; @@ -125,24 +124,23 @@ Ext.extend(Ext.tree.TreePanel.Enhanced, Ext.tree.TreePanel, { params.form_key = FORM_KEY; } var result = new Ajax.Request( - url + (url.match(new RegExp('\\?')) ? '&isAjax=true' : '?isAjax=true' ), - { - parameters: params, - method: 'post' - } + url + (url.match(new RegExp('\\?')) ? '&isAjax=true' : '?isAjax=true' ), + { + parameters:params, + method:'post' + } ); return result; }, - selectCurrentNode : function() - { + selectCurrentNode:function () { if (this.currentNodeId) { var selectedNode = this.getNodeById(this.currentNodeId); - if ((typeof selectedNode.attributes.path)!='undefined') { + if ((typeof selectedNode.attributes.path) != 'undefined') { var path = selectedNode.attributes.path; if (!this.storeId) { - path = '0/'+path; + path = '0/' + path; } this.selectPath(path); } else { @@ -151,8 +149,7 @@ Ext.extend(Ext.tree.TreePanel.Enhanced, Ext.tree.TreePanel, { } }, - collapseTree : function() - { + collapseTree:function () { this.collapseAll(); this.selectCurrentNode(); @@ -164,8 +161,7 @@ Ext.extend(Ext.tree.TreePanel.Enhanced, Ext.tree.TreePanel, { } }, - expandTree : function() - { + expandTree:function () { this.expandAll(); if (this.collapsed) { this.collapsed = false; @@ -174,10 +170,9 @@ Ext.extend(Ext.tree.TreePanel.Enhanced, Ext.tree.TreePanel, { } }, - categoryClick : function(node, e) - { + categoryClick:function (node, e) { var baseUrl = '<?php echo $this->getEditUrl() ?>'; - var urlExt = (this.storeId?'store/'+this.storeId+'/':'')+'id/'+node.id+'/'; + var urlExt = (this.storeId ? 'store/' + this.storeId + '/' : '') + 'id/' + node.id + '/'; var url = parseSidUrl(baseUrl, urlExt); this.currentNodeId = node.id; @@ -192,20 +187,19 @@ Ext.extend(Ext.tree.TreePanel.Enhanced, Ext.tree.TreePanel, { } }); -function reRenderTree(event, switcher) -{ +function reRenderTree(event, switcher) { // re-render tree by store switcher if (tree && event) { var obj = event.target; var newStoreId = obj.value * 1; - var storeParam = newStoreId ? 'store/'+newStoreId + '/' : ''; + var storeParam = newStoreId ? 'store/' + newStoreId + '/' : ''; if (obj.switchParams) { storeParam += obj.switchParams; } if (switcher.useConfirm) { - if (!confirm("<?php echo $this->__('Please confirm site switching. All data that hasn\'t been saved will be lost.') ?>")){ - obj.value = '<?php echo (int) $this->getStoreId() ?>'; + if (!confirm("<?php echo $this->__('Please confirm site switching. All data that hasn\'t been saved will be lost.') ?>")) { + obj.value = '<?php echo (int)$this->getStoreId() ?>'; return false; } } @@ -226,9 +220,9 @@ function reRenderTree(event, switcher) // load from cache // load from ajax new Ajax.Request(url + (url.match(new RegExp('\\?')) ? '&isAjax=true' : '?isAjax=true' ), { - parameters : {store: newStoreId, form_key: FORM_KEY}, - method : 'post', - onComplete : function(transport) { + parameters:{store:newStoreId, form_key:FORM_KEY}, + method:'post', + onComplete:function (transport) { var response = eval('(' + transport.responseText + ')'); if (!response['parameters']) { return false; @@ -244,8 +238,7 @@ function reRenderTree(event, switcher) } } -function _renderNewTree(config, storeParam) -{ +function _renderNewTree(config, storeParam) { if (!config) { var config = defaultLoadTreeParams; } @@ -268,21 +261,20 @@ function _renderNewTree(config, storeParam) if (storeParam) { url = url + storeParam; } - <?php if ($this->isClearEdit()):?> - if (selectedNode) { - url = url + 'id/' + config.parameters.category_id; - } - <?php endif;?> + <?php if ($this->isClearEdit()): ?> + if (selectedNode) { + url = url + 'id/' + config.parameters.category_id; + } + <?php endif;?> updateContent(url); } -Ext.onReady(function() -{ +Ext.onReady(function () { categoryLoader = new Ext.tree.TreeLoader({ - dataUrl: '<?php echo $this->getLoadTreeUrl() ?>' + dataUrl:'<?php echo $this->getLoadTreeUrl() ?>' }); - categoryLoader.createNode = function(config) { + categoryLoader.createNode = function (config) { var node; var _node = Object.clone(config); if (config.children && !config.children.length) { @@ -295,11 +287,10 @@ Ext.onReady(function() return node; }; - categoryLoader.buildCategoryTree = function(parent, config) - { + categoryLoader.buildCategoryTree = function (parent, config) { if (!config) return null; - if (parent && config && config.length){ + if (parent && config && config.length) { for (var i = 0; i < config.length; i++) { var node; var _node = Object.clone(config[i]); @@ -318,13 +309,12 @@ Ext.onReady(function() } }; - categoryLoader.buildHash = function(node) - { + categoryLoader.buildHash = function (node) { var hash = {}; hash = this.toArray(node.attributes); - if (node.childNodes.length>0 || (node.loaded==false && node.loading==false)) { + if (node.childNodes.length > 0 || (node.loaded == false && node.loading == false)) { hash['children'] = new Array; for (var i = 0, len = node.childNodes.length; i < len; i++) { @@ -338,8 +328,8 @@ Ext.onReady(function() return hash; }; - categoryLoader.toArray = function(attributes) { - var data = {form_key: FORM_KEY}; + categoryLoader.toArray = function (attributes) { + var data = {form_key:FORM_KEY}; for (var key in attributes) { var value = attributes[key]; data[key] = value; @@ -348,51 +338,50 @@ Ext.onReady(function() return data; }; - categoryLoader.on("beforeload", function(treeLoader, node) { + categoryLoader.on("beforeload", function (treeLoader, node) { treeLoader.baseParams.id = node.attributes.id; treeLoader.baseParams.store = node.attributes.store; treeLoader.baseParams.form_key = FORM_KEY; }); - categoryLoader.on("load", function(treeLoader, node, config) { + categoryLoader.on("load", function (treeLoader, node, config) { varienWindowOnload(); }); - if ((typeof varienStoreSwitcher)!='undefined') { + if ((typeof varienStoreSwitcher) != 'undefined') { varienStoreSwitcher.storeSelectorClickCallback = reRenderTree; } newTreeParams = { - animate : false, - loader : categoryLoader, - enableDD : true, - containerScroll : true, - selModel : new Ext.tree.CheckNodeMultiSelectionModel(), - rootVisible : '<?php echo $this->getRoot()->getIsVisible() ?>', - useAjax : <?php echo $this->getUseAjax() ?>, - switchTreeUrl : '<?php echo $this->getSwitchTreeUrl() ?>', - editUrl : '<?php echo $this->getEditUrl() ?>', - currentNodeId : <?php echo (int) $this->getCategoryId() ?> + animate:false, + loader:categoryLoader, + enableDD:true, + containerScroll:true, + selModel:new Ext.tree.CheckNodeMultiSelectionModel(), + rootVisible:'<?php echo $this->getRoot()->getIsVisible() ?>', + useAjax: <?php echo $this->getUseAjax() ?>, + switchTreeUrl:'<?php echo $this->getSwitchTreeUrl() ?>', + editUrl:'<?php echo $this->getEditUrl() ?>', + currentNodeId: <?php echo (int)$this->getCategoryId() ?> }; defaultLoadTreeParams = { - parameters : { - text : '<?php echo htmlentities($this->getRoot()->getName()) ?>', - draggable : false, - allowDrop : <?php if ($this->getRoot()->getIsVisible()): ?>true<?php else : ?>false<?php endif; ?>, - id : <?php echo (int) $this->getRoot()->getId() ?>, - expanded : <?php echo (int) $this->getIsWasExpanded() ?>, - store_id : <?php echo (int) $this->getStore()->getId() ?>, - category_id : <?php echo (int) $this->getCategoryId() ?> + parameters:{ + text:'<?php echo htmlentities($this->getRoot()->getName()) ?>', + draggable:false, + allowDrop : <?php if ($this->getRoot()->getIsVisible()): ?>true<?php else : ?>false<?php endif; ?>, + id: <?php echo (int)$this->getRoot()->getId() ?>, + expanded: <?php echo (int)$this->getIsWasExpanded() ?>, + store_id: <?php echo (int)$this->getStore()->getId() ?>, + category_id: <?php echo (int)$this->getCategoryId() ?> }, - data : <?php echo $this->getTreeJson() ?> + data: <?php echo $this->getTreeJson() ?> }; reRenderTree(); }); -function addNew(url, isRoot) -{ +function addNew(url, isRoot) { if (isRoot) { tree.currentNodeId = tree.root.id; } @@ -400,17 +389,16 @@ function addNew(url, isRoot) if (/store\/\d+/.test(url)) { url = url.replace(/store\/\d+/, "store/" + tree.storeId); } - else { - url+= "store/" + tree.storeId + "/"; + else { + url += "store/" + tree.storeId + "/"; } - url+= 'parent/'+tree.currentNodeId; + url += 'parent/' + tree.currentNodeId; updateContent(url); } -function categoryMove(obj) -{ - var data = {id: obj.dropNode.id, form_key: FORM_KEY}; +function categoryMove(obj) { + var data = {id:obj.dropNode.id, form_key:FORM_KEY}; data.point = obj.point; switch (obj.point) { @@ -426,7 +414,7 @@ function categoryMove(obj) case 'below' : data.pid = obj.target.parentNode.id; data.aid = obj.target.id; - break; + break; case 'append' : data.pid = obj.target.id; data.paid = obj.dropNode.parentNode.id; @@ -435,16 +423,16 @@ function categoryMove(obj) } else { data.aid = 0; } - break; + break; default : obj.cancel = true; return obj; } - var success = function(o) { + var success = function (o) { try { - if(o.responseText){ - if(o.responseText==='SUCCESS'){ + if (o.responseText) { + if (o.responseText === 'SUCCESS') { jQuery(obj.tree.container.dom).trigger('categoryMove.tree'); } else { alert(o.responseText); @@ -452,11 +440,11 @@ function categoryMove(obj) } } } - catch(e) { + catch (e) { } }; - var failure = function(o) { + var failure = function (o) { try { console.log(o.statusText); } catch (e2) { @@ -466,18 +454,18 @@ function categoryMove(obj) }; var pd = []; - for(var key in data) { + for (var key in data) { pd.push(encodeURIComponent(key), "=", encodeURIComponent(data[key]), "&"); } - pd.splice(pd.length-1,1); + pd.splice(pd.length - 1, 1); new Ajax.Request( - '<?php echo $this->getMoveUrl() ?>', - { - method: 'POST', - parameters: pd.join(""), - onSuccess : success, - onFailure : failure - } + '<?php echo $this->getMoveUrl() ?>', + { + method:'POST', + parameters:pd.join(""), + onSuccess:success, + onFailure:failure + } ); } //]]> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/form/renderer/fieldset/element.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/form/renderer/fieldset/element.phtml index 50b7fa4f54b7336cfaad5ad2f756c34fc554424f..a87b8dbc00769cd02e5a55706d767166844f91c1 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/form/renderer/fieldset/element.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/form/renderer/fieldset/element.phtml @@ -29,32 +29,53 @@ * @see Mage_Adminhtml_Block_Catalog_Form_Renderer_Fieldset_Element */ ?> -<?php $_element = $this->getElement() ?> +<?php +/* @var $this Mage_Backend_Block_Widget_Form_Renderer_Fieldset_Element */ +$element = $this->getElement(); +$note = $element->getNote() ? '<div class="note">' . $element->getNote() . '</div>' : ''; +$elementBeforeLabel = $element->getExtType() == 'checkbox' || $element->getExtType() == 'radio'; +$addOn = $element->getBeforeElementHtml() || $element->getAfterElementHtml(); +$fieldId = ($element->getHtmlId()) ? ' id="attribute-' . $element->getHtmlId() . '-container"' : ''; +$fieldClass = "field field-{$element->getId()} {$element->getCssClass()}"; +$fieldClass .= ($elementBeforeLabel) ? ' choice' : ''; +$fieldClass .= ($addOn) ? ' with-addon' : ''; +$fieldClass .= ($element->getRequired()) ? ' required' : ''; +$fieldClass .= ($note) ? ' with-note' : ''; + +$fieldAttributes = $fieldId . ' class="' . $fieldClass . '" ' + . $this->getUiId('form-field', $element->getId()); +?> + <?php $this->checkFieldDisable() ?> <?php - $elementToggleCode = $_element->getToggleCode() ? $_element->getToggleCode() - : 'toggleValueElements(this, this.parentNode.parentNode)'; + $elementToggleCode = $element->getToggleCode() ? $element->getToggleCode() + : 'toggleValueElements(this, this.parentNode.parentNode.parentNode)'; ?> -<?php if ($_element->getType()=='hidden'): ?> -<tr> - <td class="hidden" colspan="100"><?php echo trim($_element->getElementHtml()) ?></td> -</tr> -<?php else: ?> -<tr id="attribute-<?php echo $_element->getHtmlId()?>-container"> - <td class="label"><?php echo trim($this->getElementLabelHtml()) ?></td> - <td class="value"> - <?php echo trim($this->getElementHtml()) ?> - <?php if ($_element->getNote()) : ?> - <p class="note"><?php echo $_element->getNote() ?></p> +<?php if (!$element->getNoDisplay()): ?> + <?php if ($element->getType() == 'hidden'): ?> + <?php echo $element->getElementHtml() ?> + <?php else: ?> + <div<?php echo $fieldAttributes ?>> + <?php if ($elementBeforeLabel): ?> + <?php echo $element->getElementHtml() ?> + <?php echo $element->getLabelHtml() ?> + <?php echo $note ?> + <?php else: ?> + <?php echo $element->getLabelHtml() ?> + <div class="control"> + <?php echo ($addOn) ? '<div class="addon">' . $element->getElementHtml() . '</div>' : $element->getElementHtml(); ?> + <?php echo $note ?> + </div> <?php endif; ?> - </td> - <td class="scope-label"><span class="nobr"><?php echo $this->getScopeLabel() ?></span></td> - <?php if ($this->canDisplayUseDefault()): ?> - <td class="value use-default"> - <input <?php if($_element->getReadonly()):?> disabled="disabled"<?php endif; ?> type="checkbox" name="use_default[]" id="<?php echo $_element->getHtmlId() ?>_default"<?php if ($this->usedDefault()): ?> checked="checked"<?php endif; ?> onclick="<?php echo $elementToggleCode; ?>" value="<?php echo $this->getAttributeCode() ?>"/> - <label for="<?php echo $_element->getHtmlId() ?>_default" class="normal"><?php echo $this->__('Use Default Value') ?></label> - </td> + <div class="field-service" value-scope="<?php echo $this->getScopeLabel()?>"> + <?php if ($this->canDisplayUseDefault()): ?> + <label for="<?php echo $element->getHtmlId() ?>_default" class="choice action-default"> + <input <?php if($element->getReadonly()):?> disabled="disabled"<?php endif; ?> type="checkbox" name="use_default[]" id="<?php echo $element->getHtmlId() ?>_default"<?php if($this->usedDefault()): ?> checked="checked"<?php endif; ?> onclick="<?php echo $elementToggleCode; ?>" value="<?php echo $this->getAttributeCode() ?>"/> + <?php echo $this->__('Use Default Value') ?> + </label> + <?php endif; ?> + </div> + </div> <?php endif; ?> -</tr> <?php endif; ?> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product.phtml index 95a7227f1f9b8653fc62a2c4affa2b701c958979..fc0de4bcca8df1e233554e75427135ac70ef6af6 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product.phtml @@ -29,19 +29,8 @@ * @see Mage_Adminhtml_Block_Catalog_Product */ ?> -<div class="content-header"> -<table cellspacing="0"> - <tr> - <td style="width:50%;"><h3 class="icon-head head-products"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Manage Products') ?></h3></td> - <td class="a-right"> - <?php echo $this->getButtonsHtml() ?> - </td> - </tr> -</table> -</div> +<div class="page-actions"><?php echo $this->getButtonsHtml() ?></div> <?php if( !$this->isSingleStoreMode() ): ?> -<?php echo $this->getChildHtml('store_switcher');?> + <?php echo $this->getChildHtml('store_switcher');?> <?php endif;?> -<div> - <?php echo $this->getGridHtml() ?> -</div> +<?php echo $this->getGridHtml() ?> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/attribute/options.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/attribute/options.phtml index f70691c02a159f7bb0398a6853a88e3433098a0d..d63b631d53562c85074496f307923be7c2f32c24 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/attribute/options.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/attribute/options.phtml @@ -31,78 +31,77 @@ * @var $this Mage_Adminhtml_Block_Catalog_Product_Attribute_Edit_Tab_Options */ ?> -<div> -<ul class="messages"> - <li class="notice-msg"> - <ul> - <li><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('If you do not specify an option value for a specific store view then the default (Admin) value will be used.') ?></li> - </ul> - </li> -</ul> -</div> -<div class="entity-edit"> - <div class="entry-edit-head"> - <h4 class="icon-head head-edit-form fieldset-legend"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Manage Titles (Size, Color, etc.)') ?></h4> - </div> - <div class="box"> - <div class="hor-scroll"> - <table class="dynamic-grid" cellspacing="0" id="attribute-labels-table"> - <tr> - <?php foreach ($this->getStores() as $_store): ?> - <th><?php echo $_store->getName() ?></th> - <?php endforeach; ?> - </tr> - <tr> - <?php $_labels = $this->getLabelValues() ?> - <?php foreach ($this->getStores() as $_store): ?> - <td> - <input class="input-text<?php if ($_store->getId() == Mage_Core_Model_App::ADMIN_STORE_ID): ?> required-option<?php endif; ?>" type="text" name="frontend_label[<?php echo $_store->getId() ?>]" value="<?php echo $this->escapeHtml($_labels[$_store->getId()]) ?>"<?php if ($this->getReadOnly()):?> disabled="disabled"<?php endif;?>/> - </td> - <?php endforeach; ?> - </tr> - </table> - </div> - </div> -</div> -<br/> -<div class="entity-edit" id="matage-options-panel"> - <div class="entry-edit-head"> - <h4 class="icon-head head-edit-form fieldset-legend"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Manage Options (values of your attribute)') ?></h4> +<fieldset class="fieldset"> + <legend class="legend"><span><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Manage Titles (Size, Color, etc.)') ?></span></legend> + <br> + <div class="message message-info"> + <div class="message-inner"> + <div class="message-content"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('If you do not specify an option value for a specific store view then the default (Admin) value will be used.') ?></div> + </div> </div> - <div class="box"> - <div class="hor-scroll"> - <table class="dynamic-grid" cellspacing="0" cellpadding="0"> + + <table class="data-table" cellspacing="0" id="attribute-labels-table"> + <tr> + <?php foreach ($this->getStores() as $_store): ?> + <th><?php echo $_store->getName() ?></th> + <?php endforeach; ?> + </tr> + <tr> + <?php $_labels = $this->getLabelValues() ?> + <?php foreach ($this->getStores() as $_store): ?> + <td> + <input class="input-text<?php if ($_store->getId() == Mage_Core_Model_App::ADMIN_STORE_ID): ?> required-option<?php endif; ?>" type="text" name="frontend_label[<?php echo $_store->getId() ?>]" value="<?php echo $this->escapeHtml($_labels[$_store->getId()]) ?>"<?php if ($this->getReadOnly()):?> disabled="disabled"<?php endif;?>/> + </td> + <?php endforeach; ?> + </tr> + </table> +</fieldset> + +<fieldset class="fieldset"> + <legend class="legend"><span><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Manage Options (values of your attribute)') ?></span></legend> + <br> + <div id="matage-options-panel"> + <table class="data-table" cellspacing="0"> + <thead> <tr id="attribute-options-table"> - <?php foreach ($this->getStores() as $_store): ?> + <th class="col-default"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Is Default') ?></th> + <?php + $storelist = $this->getStores(); + foreach ($storelist as $_store): + ?> <th><?php echo $_store->getName() ?></th> - <?php endforeach; ?> + <?php endforeach; + $storetotal = count($storelist) + 3; + ?> <th><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Position') ?></th> - <th class="nobr a-center"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Is Default') ?></th> - <th> - <?php if (!$this->getReadOnly() && !$this->canManageOptionDefaultOnly()):?> - <?php echo $this->getAddNewButtonHtml() ?> - <?php endif;?> - </th> + <th class="col-delete"> </th> </tr> - <tr class="no-display template" id="row-template"> - <?php foreach ($this->getStores() as $_store): ?> - <td><input name="option[value][{{id}}][<?php echo $_store->getId() ?>]" value="{{store<?php echo $_store->getId() ?>}}" class="input-text<?php if ($_store->getId() == Mage_Core_Model_App::ADMIN_STORE_ID): ?> required-option<?php endif; ?>" type="text" <?php if ($this->getReadOnly() || $this->canManageOptionDefaultOnly()):?> disabled="disabled"<?php endif;?>/></td> - <?php endforeach; ?> - <td class="a-center"><input class="input-text" type="text" name="option[order][{{id}}]" value="{{sort_order}}" <?php if ($this->getReadOnly() || $this->canManageOptionDefaultOnly()):?> disabled="disabled"<?php endif;?>/></td> - <td><input class="input-radio" type="radio" name="default[]" value="{{id}}" <?php if ($this->getReadOnly()):?> disabled="disabled"<?php endif;?>/></td> - <td class="a-left"> - <input type="hidden" class="delete-flag" name="option[delete][{{id}}]" value="" /> - <?php if (!$this->getReadOnly() && !$this->canManageOptionDefaultOnly()):?> - <?php echo $this->getDeleteButtonHtml() ?> - <?php endif;?> - </td> - </tr> - </table> - </div> + </thead> + <tr class="no-display template" id="row-template"> + <td class="col-default"><input class="input-radio" type="radio" name="default[]" value="{{id}}" <?php if ($this->getReadOnly()):?> disabled="disabled"<?php endif;?>/></td> + <?php foreach ($this->getStores() as $_store): ?> + <td class="col-{{id}}"><input name="option[value][{{id}}][<?php echo $_store->getId() ?>]" value="{{store<?php echo $_store->getId() ?>}}" class="input-text<?php if ($_store->getId() == Mage_Core_Model_App::ADMIN_STORE_ID): ?> required-option<?php endif; ?>" type="text" <?php if ($this->getReadOnly() || $this->canManageOptionDefaultOnly()):?> disabled="disabled"<?php endif;?>/></td> + <?php endforeach; ?> + <td><input class="input-text" type="text" name="option[order][{{id}}]" value="{{sort_order}}" <?php if ($this->getReadOnly() || $this->canManageOptionDefaultOnly()):?> disabled="disabled"<?php endif;?>/></td> + <td> + <input type="hidden" class="delete-flag" name="option[delete][{{id}}]" value="" /> + <?php if (!$this->getReadOnly() && !$this->canManageOptionDefaultOnly()):?> + <?php echo $this->getDeleteButtonHtml() ?> + <?php endif;?> + </td> + </tr> + <tfoot> + <th colspan="<?php echo $storetotal; ?>"> + <?php if (!$this->getReadOnly() && !$this->canManageOptionDefaultOnly()):?> + <?php echo $this->getAddNewButtonHtml() ?> + <?php endif;?> + </th> + </tfoot> + </table> <input type="hidden" id="option-count-check" value="" /> </div> -</div> +</fieldset> <script type="text/javascript"> //<![CDATA[ var optionDefaultInputType = 'radio'; @@ -110,12 +109,12 @@ var optionDefaultInputType = 'radio'; // IE removes quotes from element.innerHTML whenever it thinks they're not needed, which breaks html. var templateText = '<tr class="option-row">'+ + '<td class="col-default"><input class="input-radio" type="{{intype}}" name="default[]" value="{{id}}" {{checked}} <?php if ($this->getReadOnly()):?> disabled="disabled"<?php endif;?>/><\/td>'+ <?php foreach ($this->getStores() as $_store): ?> '<td><input name="option[value][{{id}}][<?php echo $_store->getId() ?>]" value="{{store<?php echo $_store->getId() ?>}}" class="input-text<?php if ($_store->getId() == Mage_Core_Model_App::ADMIN_STORE_ID): ?> required-option<?php endif; ?>" type="text" <?php if ($this->getReadOnly() || $this->canManageOptionDefaultOnly()):?> disabled="disabled"<?php endif;?><?php if ($_store->getId() == Mage_Core_Model_App::ADMIN_STORE_ID && $this->canManageOptionDefaultOnly()):?> style="width:196px"<?php endif;?> /><\/td>'+ <?php endforeach; ?> '<td><input class="input-text" type="text" name="option[order][{{id}}]" value="{{sort_order}}" <?php if ($this->getReadOnly() || $this->canManageOptionDefaultOnly()):?> disabled="disabled"<?php endif;?>/><\/td>'+ - '<td class="a-center"><input class="input-radio" type="{{intype}}" name="default[]" value="{{id}}" {{checked}} <?php if ($this->getReadOnly()):?> disabled="disabled"<?php endif;?>/><\/td>'+ - '<td class="a-left" id="delete_button_container_{{id}}">'+ + '<td id="delete_button_container_{{id}}" class="col-delete">'+ '<input type="hidden" class="delete-flag" name="option[delete][{{id}}]" value="" />'+ <?php if (!$this->getReadOnly() && !$this->canManageOptionDefaultOnly()):?> <?php echo Mage::helper('Mage_Core_Helper_Data')->jsonEncode($this->getDeleteButtonHtml()) ?> + diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/attribute/set/main.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/attribute/set/main.phtml index dd2e78148bceb43533c02b1d00af0cf7629243fa..ba8496febaeee03eb3490f4b18ccb54c957e64a8 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/attribute/set/main.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/attribute/set/main.phtml @@ -24,57 +24,36 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td style="width:50%;"><h3 class="icon-head head-product-attribute-sets"><?php echo $this->escapeHtml($this->_getHeader()) ?></h3></td> - <td class="form-buttons"> - <?php echo $this->getBackButtonHtml() ?> - <?php echo $this->getResetButtonHtml() ?> - <?php echo $this->getDeleteButtonHtml() ?> - <?php echo $this->getSaveButtonHtml() ?> - </td> - </tr> - </table> +<div class="page-actions"> + <?php echo $this->getBackButtonHtml() ?> + <?php echo $this->getResetButtonHtml() ?> + <?php echo $this->getDeleteButtonHtml() ?> + <?php echo $this->getSaveButtonHtml() ?> </div> -<table cellspacing="0" width="100%"> - <tr> - <td width="360" style="border-right:1px solid #ddd; padding:0 23px 23px 0;" class="edit-attribute-set"> - <?php echo $this->getSetFormHtml() ?> - <script type="text/javascript"> - jQuery('#set-prop-form').mage('validation', {errorClass: 'mage-error'}); - </script> - </td> - <td width="320" style="border-right:1px solid #ddd; padding:0 23px 23px 23px;"> - <div class="content-header skip-header"> - <table cellspacing="0"> - <tbody> - <tr> - <td><h3><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Groups') ?></h3></td> - </tr> - </tbody> - </table> - </div> - - <?php if (!$this->getIsReadOnly()): ?> - <p><?php echo $this->getAddGroupButton() ?> <?php echo $this->getDeleteGroupButton() ?></p> - <p class="note-block"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Double click on a group to rename it') ?></p> - <?php endif; ?> - - <?php echo $this->getSetsFilterHtml() ?> - <?php echo $this->getGroupTreeHtml() ?> - </td> - <td style="padding:0 0 23px 23px;"> - <div class="content-header skip-header"> - <table cellspacing="0"> - <tbody> - <tr> - <td><h3><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Unassigned Attributes') ?></h3></td> - </tr> - </tbody> - </table> - </div> - <div id="tree-div2" style="height:400px; margin-top:5px;overflow:auto"></div> +<div class="attribute-set"> + <div class="edit-attribute-set attribute-set-col"> + <?php echo $this->getSetFormHtml() ?> + <script type="text/javascript"> + jQuery('#set-prop-form').mage('validation', {errorClass: 'mage-error'}); + </script> + </div> + <div class="attribute-set-col fieldset-wrapper"> + <div class="fieldset-wrapper-title"> + <span class="title"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Groups') ?></span> + </div> + <?php if (!$this->getIsReadOnly()): ?> + <?php echo $this->getAddGroupButton() ?> <?php echo $this->getDeleteGroupButton() ?> + <p class="note-block"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Double click on a group to rename it') ?></p> + <?php endif; ?> + + <?php echo $this->getSetsFilterHtml() ?> + <?php echo $this->getGroupTreeHtml() ?> + </div> + <div class="attribute-set-col fieldset-wrapper"> + <div class="fieldset-wrapper-title"> + <span class="title"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Unassigned Attributes') ?></span> + </div> + <div id="tree-div2" class="attribute-set-tree"></div> <script type="text/javascript"> //<![CDATA[ var allowDragAndDrop = <?php echo ($this->getIsReadOnly() ? 'false' : 'true'); ?>; @@ -337,7 +316,9 @@ }, save : function() { - $('messages').update(); + if ($('messages')) { + $('messages').update(); + } TreePanels.rebuildTrees(); if(!jQuery('#set-prop-form').valid()) { return; @@ -456,6 +437,5 @@ Ext.EventManager.onDocumentReady(TreePanels.init, TreePanels, true); //]]> </script> - </td> - </tr> -</table> + </div> +</div> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/attribute/set/toolbar/add.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/attribute/set/toolbar/add.phtml index 53746ec35abf26f69e21d182599c4a2c58cd47d8..991450269db76c73c61030357460c698dd796e07 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/attribute/set/toolbar/add.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/attribute/set/toolbar/add.phtml @@ -24,16 +24,9 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td style="width:50%;"><h3 class="icon-head head-product-attribute-sets"><?php echo $this->_getHeader() ?></h3></td> - <td class="form-buttons"> - <?php echo $this->getBackButtonHtml() ?> - <?php echo $this->getSaveButtonHtml() ?> - </td> - </tr> - </table> +<div class="page-actions"> + <?php echo $this->getBackButtonHtml() ?> + <?php echo $this->getSaveButtonHtml() ?> </div> <?php echo $this->getFormHtml() ?> <script type="text/javascript"> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/attribute/set/toolbar/main.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/attribute/set/toolbar/main.phtml index 13609d8e159f691e17c232dff105f421196dd514..bbcfcaa31c2ffd356accb10d9d9304a291f39ad6 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/attribute/set/toolbar/main.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/attribute/set/toolbar/main.phtml @@ -24,16 +24,5 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td style="width:50%;"><h3 class="icon-head head-product-attribute-sets"><?php echo $this->_getHeader() ?></h3></td> - <td class="form-buttons"> - <?php echo $this->getNewButtonHtml() ?> - </td> - </tr> - </table> -</div> -<div> - <?php echo $this->getChildHtml('grid') ?> -</div> +<div class="page-actions"><?php echo $this->getNewButtonHtml() ?></div> +<?php echo $this->getChildHtml('grid') ?> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit.phtml index d12e65c82947f2766b5d15e36829ee0625c273c5..a412f2495ad2ae5a0760e50e1329caaec4137479 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit.phtml @@ -30,10 +30,19 @@ */ ?> -<div class="content-header"> +<!-- <h3 class="icon-head head-products"><?php echo $this->getHeader() ?></h3> - <div class="content-buttons form-buttons"><?php echo $this->getBackButtonHtml() ?> - <?php echo $this->getCancelButtonHtml() ?> +--> + +<div class="page-actions"> + <div class="switcher" onselectstart='return false;'> + <label class="switcher-label" for="product-online-switcher" title="Product online status"> + <strong>Product online</strong> + <input type="checkbox" id="product-online-switcher" checked /> + <span></span> + </label> + </div> + <?php if($this->getProductId()): ?> <?php echo $this->getDeleteButtonHtml() ?> <?php if($this->getProductSetId() && $this->getIsConfigured()): ?> @@ -44,8 +53,9 @@ <?php echo $this->getChangeAttributeSetButtonHtml() ?> <?php echo $this->getSaveSplitButtonHtml(); ?> <?php endif; ?> - </div> + <?php echo $this->getBackButtonHtml() ?> </div> + <form action="<?php echo $this->getSaveUrl() ?>" method="post" id="product-edit-form" enctype="multipart/form-data"> <?php echo $this->getBlockHtml('formkey')?> <div id="product-edit-form-tabs"></div> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/action/attribute.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/action/attribute.phtml index 8889d02204064d6f98f182e5ec680a6971168de0..b8ae6cff87f4144a804078bd9297e84a832b00c9 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/action/attribute.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/action/attribute.phtml @@ -24,17 +24,10 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td><h3><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Update attributes') ?></h3></td> - <td class="form-buttons"> - <?php echo $this->getBackButtonHtml() ?> - <?php echo $this->getCancelButtonHtml() ?> - <?php echo $this->getSaveButtonHtml() ?> - </td> - </tr> - </table> +<div class="page-actions"> + <?php echo $this->getBackButtonHtml() ?> + <?php echo $this->getCancelButtonHtml() ?> + <?php echo $this->getSaveButtonHtml() ?> </div> <form action="<?php echo $this->getSaveUrl() ?>" method="post" id="attributes-edit-form" enctype="multipart/form-data"> <?php echo $this->getBlockHtml('formkey')?> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/options.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/options.phtml index e1bf3bf7e7bb441bf64e63d42b84147753ad0671..20199e488720cdd7722a9587c63e54a8add5c251 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/options.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/options.phtml @@ -24,25 +24,22 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="entry-edit custom-options product-custom-options"> - <div id="dynamic-price-warning" style="display:none"> - <ul class="messages"> - <li class="error-msg"> - <ul> - <li><?php echo $this->__('Bundle with dynamic pricing cannot include custom defined options. Options will not be saved.') ?></li> - </ul> - </li> - </ul> - </div> - <div class="entry-edit-head"> - <h4><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Custom Options') ?></h4> - <div class="right"> +<div class="product-custom-options"> + <div class="fieldset"> + <legend class="legend"><span><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Custom Options') ?></span></legend> + <br> + <div class="message message-error" id="dynamic-price-warning" style="display:none"> + <div class="message-inner"> + <div class="message-content"><?php echo $this->__('Bundle with dynamic pricing cannot include custom defined options. Options will not be saved.') ?></div> + </div> + </div> + <div> <?php echo $this->getChildHtml('import_button') ?> <?php echo $this->getAddButtonHtml() ?> </div> </div> - <div id="product_options_container" class="box"> + <div id="product_options_container"> <div id="product_options_container_top"></div> <?php echo $this->getOptionsBoxHtml() ?> </div> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/options/option.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/options/option.phtml index 82395c69ab62ce78c48357aa46b78c96fdc6fb40..a11a6dbe53da066b3a318f06ad9d44f71c464df7 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/options/option.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/options/option.phtml @@ -29,8 +29,8 @@ <script type="text/javascript"> //<![CDATA[ -window.firstStepTemplate = '<div class="option-box" id="option_{{id}}">'+ - '<table id="<?php echo $this->getFieldId() ?>_{{id}}" class="option-header" cellpadding="0" cellspacing="0">'+ +window.firstStepTemplate = '<div class="fieldset" id="option_{{id}}">'+ + '<table id="<?php echo $this->getFieldId() ?>_{{id}}" class="data-table" cellspacing="0">'+ '<input type="hidden" id="<?php echo $this->getFieldId() ?>_{{id}}_is_delete" name="<?php echo $this->getFieldName() ?>[{{id}}][is_delete]" value="" />'+ '<input type="hidden" id="<?php echo $this->getFieldId() ?>_{{id}}_previous_type" name="<?php echo $this->getFieldName() ?>[{{id}}][previous_type]" value="{{type}}" />'+ '<input type="hidden" id="<?php echo $this->getFieldId() ?>_{{id}}_previous_group" name="<?php echo $this->getFieldName() ?>[{{id}}][previous_group]" value="" />'+ @@ -38,19 +38,19 @@ window.firstStepTemplate = '<div class="option-box" id="option_{{id}}">'+ '<input type="hidden" id="<?php echo $this->getFieldId() ?>_{{id}}_option_id" name="<?php echo $this->getFieldName() ?>[{{id}}][option_id]" value="{{option_id}}" />'+ '<thead>'+ '<tr>'+ - '<th class="opt-title"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Title') ?> <span class="required">*</span></th>'+ - '<th class="opt-type"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Input Type') ?> <span class="required">*</span></th>'+ - '<th class="opt-req"><?php echo $this->jsQuoteEscape(Mage::helper('Mage_Catalog_Helper_Data')->__('Is Required')) ?></th>'+ - '<th class="opt-order"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Sort Order') ?></th>'+ - '<th class="a-right">' + <?php echo Mage::helper('Mage_Core_Helper_Data')->jsonEncode($this->getDeleteButtonHtml()) ?> + '</th>'+ + '<th><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Title') ?> <span class="required">*</span></th>'+ + '<th><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Input Type') ?> <span class="required">*</span></th>'+ + '<th><?php echo $this->jsQuoteEscape(Mage::helper('Mage_Catalog_Helper_Data')->__('Is Required')) ?></th>'+ + '<th><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Sort Order') ?></th>'+ + '<th class="col-delete">' + <?php echo Mage::helper('Mage_Core_Helper_Data')->jsonEncode($this->getDeleteButtonHtml()) ?> + '</th>'+ '</tr>'+ '</thead>'+ '<tr>'+ '<td><input type="text" class="required-entry input-text" id="<?php echo $this->getFieldId() ?>_{{id}}_title" name="<?php echo $this->getFieldName() ?>[{{id}}][title]" value="{{title}}">{{checkboxScopeTitle}}</td>'+ '<td><?php echo $this->getTypeSelectHtml() ?></td>'+ - '<td class="opt-req"><?php echo $this->getRequireSelectHtml() ?></td>'+ + '<td><?php echo $this->getRequireSelectHtml() ?></td>'+ '<td><input type="text" class="validate-zero-or-greater input-text" name="<?php echo $this->getFieldName() ?>[{{id}}][sort_order]" value="{{sort_order}}"></td>'+ - '<td> </td>'+ + '<td class="col-delete"> </td>'+ '</tr></table></div>'; window.productOption = { @@ -197,7 +197,7 @@ window.productOptionType = { $(element.readAttribute('id')+'_'+group).show(); } else { - template = '<div id="'+element.readAttribute('id')+'_'+group+'" class="grid tier form-list">'+template+'</div><div id="'+element.readAttribute('id')+'_'+group+'_advice"></div'; + template = '<div id="'+element.readAttribute('id')+'_'+group+'" class="tier form-list">'+template+'</div><div id="'+element.readAttribute('id')+'_'+group+'_advice"></div'; this.secondTemplate = new Template(template, this.templateSyntax); data = {}; @@ -248,7 +248,7 @@ window.productOptionType = { $('<?php echo $this->getFieldId() ?>_'+data.id+'_previous_group').value = group; - template = '<div id="<?php echo $this->getFieldId() ?>_{{id}}_type_'+group+'" class="grid tier form-list">'+template+'</div><div id="<?php echo $this->getFieldId() ?>_{{id}}_type_'+group+'_advice"></div>'; + template = '<div id="<?php echo $this->getFieldId() ?>_{{id}}_type_'+group+'" class="tier form-list">'+template+'</div><div id="<?php echo $this->getFieldId() ?>_{{id}}_type_'+group+'_advice"></div>'; this.secondTemplate = new Template(template, this.templateSyntax); @@ -424,8 +424,6 @@ window.productOptionScope.bindScopeCheckbox(); //]]> </script> -<div><?php if (!$this->isReadonly()):?><input type="hidden" name="affect_product_custom_options" value="1" /><?php endif;?></div> - +<?php if (!$this->isReadonly()):?><input type="hidden" name="affect_product_custom_options" value="1" /><?php endif;?> <div id="import-container" style="display: none;"></div> - diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/options/type/date.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/options/type/date.phtml index e87a5d03857bfa001ca3f745595f54ba8374a1b0..ebf0a8badd2b9e5137888d2834cb6577688df79b 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/options/type/date.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/options/type/date.phtml @@ -26,14 +26,14 @@ ?> <script type="text/javascript"> -OptionTemplateDate = '<table class="border" cellpadding="0" cellspacing="0">'+ - '<tr class="headings">'+ +OptionTemplateDate = '<table class="data-table" cellspacing="0">'+ + '<thead><tr class="headings">'+ <?php if ($this->getCanReadPrice() !== false) : ?> - '<th class="type-price"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Price') ?></th>' + - '<th class="type-type"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Price Type') ?></th>' + + '<th><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Price') ?></th>' + + '<th><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Price Type') ?></th>' + <?php endif; ?> - '<th class="last"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('SKU') ?></th>'+ - '</tr>'+ + '<th><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('SKU') ?></th>'+ + '</tr></thead>'+ '<tr>'+ <?php if ($this->getCanReadPrice() !== false) : ?> '<td><input type="text" class="input-text validate-number product-option-price" id="product_option_{{option_id}}_price" name="product[options][{{option_id}}][price]" value="{{price}}"<?php if ($this->getCanEditPrice() === false) : ?> disabled="disabled"<?php endif; ?>></td>' + @@ -42,7 +42,7 @@ OptionTemplateDate = '<table class="border" cellpadding="0" cellspacing="0">'+ '<input type="hidden" id="product_option_{{option_id}}_price" name="product[options][{{option_id}}][price]">' + '<input type="hidden" name="product[options][{{option_id}}][price_type]" id="product_option_{{option_id}}_price_type">' + <?php endif; ?> - '<td class="last"><input type="text" class="input-text type-sku" name="product[options][{{option_id}}][sku]" value="{{sku}}"></td>'+ + '<td><input type="text" class="input-text type-sku" name="product[options][{{option_id}}][sku]" value="{{sku}}"></td>'+ '</tr>'+ '</table>'; diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/options/type/file.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/options/type/file.phtml index b7b8acbd013049300ead5228c8550be844d8fc09..07eb8c0f5015cd36493e7c42194f47bc43fa6786 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/options/type/file.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/options/type/file.phtml @@ -26,16 +26,16 @@ ?> <script type="text/javascript"> -OptionTemplateFile = '<table class="border" cellpadding="0" cellspacing="0">'+ - '<tr class="headings">'+ +OptionTemplateFile = '<table class="data-table" cellspacing="0">'+ + '<thead><tr>'+ <?php if ($this->getCanReadPrice() !== false) : ?> - '<th class="type-price">' + <?php echo $this->helper('Mage_Core_Helper_Data')->jsonEncode(Mage::helper('Mage_Catalog_Helper_Data')->__('Price')); ?> + '</th>' + - '<th class="type-type">' + <?php echo $this->helper('Mage_Core_Helper_Data')->jsonEncode(Mage::helper('Mage_Catalog_Helper_Data')->__('Price Type')); ?> + '</th>' + + '<th>' + <?php echo $this->helper('Mage_Core_Helper_Data')->jsonEncode(Mage::helper('Mage_Catalog_Helper_Data')->__('Price')); ?> + '</th>' + + '<th>' + <?php echo $this->helper('Mage_Core_Helper_Data')->jsonEncode(Mage::helper('Mage_Catalog_Helper_Data')->__('Price Type')); ?> + '</th>' + <?php endif; ?> - '<th class="type-sku">' + <?php echo $this->helper('Mage_Core_Helper_Data')->jsonEncode(Mage::helper('Mage_Catalog_Helper_Data')->__('SKU')); ?> + '</th>' + - '<th class="type-title">' + <?php echo $this->helper('Mage_Core_Helper_Data')->jsonEncode(Mage::helper('Mage_Catalog_Helper_Data')->__('Allowed File Extensions')); ?> + '</th>'+ - '<th class="last">' + <?php echo $this->helper('Mage_Core_Helper_Data')->jsonEncode(Mage::helper('Mage_Catalog_Helper_Data')->__('Maximum Image Size')); ?> + '</th>' + - '</tr>' + + '<th>' + <?php echo $this->helper('Mage_Core_Helper_Data')->jsonEncode(Mage::helper('Mage_Catalog_Helper_Data')->__('SKU')); ?> + '</th>' + + '<th>' + <?php echo $this->helper('Mage_Core_Helper_Data')->jsonEncode(Mage::helper('Mage_Catalog_Helper_Data')->__('Allowed File Extensions')); ?> + '</th>'+ + '<th>' + <?php echo $this->helper('Mage_Core_Helper_Data')->jsonEncode(Mage::helper('Mage_Catalog_Helper_Data')->__('Maximum Image Size')); ?> + '</th>' + + '</tr></thead>' + '<tr>' + <?php if ($this->getCanReadPrice() !== false) : ?> '<td><input class="input-text validate-zero-or-greater" type="text" name="product[options][{{option_id}}][price]" value="{{price}}"<?php if ($this->getCanEditPrice() === false) : ?> disabled="disabled"<?php endif; ?>></td>' + @@ -46,7 +46,7 @@ OptionTemplateFile = '<table class="border" cellpadding="0" cellspacing="0">'+ <?php endif; ?> '<td><input type="text" class="input-text" name="product[options][{{option_id}}][sku]" value="{{sku}}"></td>' + '<td><input class="input-text" type="text" name="product[options][{{option_id}}][file_extension]" value="{{file_extension}}"></td>' + - '<td class="type-last last" nowrap><input class="input-text" type="text" name="product[options][{{option_id}}][image_size_x]" value="{{image_size_x}}">' + + '<td class="col-file"><input class="input-text" type="text" name="product[options][{{option_id}}][image_size_x]" value="{{image_size_x}}">' + <?php echo $this->helper('Mage_Core_Helper_Data')->jsonEncode(Mage::helper('Mage_Catalog_Helper_Data')->__('x')) ?> + '<input class="input-text" type="text" name="product[options][{{option_id}}][image_size_y]" value="{{image_size_y}}">' + <?php echo $this->helper('Mage_Core_Helper_Data')->jsonEncode(Mage::helper('Mage_Catalog_Helper_Data')->__('px.')) ?> + diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/options/type/select.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/options/type/select.phtml index 7ee4245dd379c5d870c6e5d80ee214f604511f96..9ea1f6f004cfd78c836c1f8cbee25f318491ed45 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/options/type/select.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/options/type/select.phtml @@ -27,25 +27,23 @@ <script type="text/javascript"> //<![CDATA[ -OptionTemplateSelect = '<table class="border" cellpadding="0" cellspacing="0">'+ +OptionTemplateSelect = '<table class="data-table" cellspacing="0">'+ '<input type="hidden" class="required-option-select-type-rows" name="validation_{{option_id}}_result" value="" >'+ - '<thead>'+ - '<tr class="headings">'+ - '<th class="type-title"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Title') ?> <span class="required">*</span></th>'+ + '<thead><tr>'+ + '<th><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Title') ?> <span class="required">*</span></th>'+ <?php if ($this->getCanReadPrice() !== false) : ?> - '<th class="type-price"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Price') ?></th>' + - '<th class="type-type"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Price Type') ?></th>' + + '<th><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Price') ?></th>' + + '<th><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Price Type') ?></th>' + <?php endif; ?> - '<th class="type-sku"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('SKU') ?></th>'+ - '<th class="type-order"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Sort Order') ?></th>'+ - '<th class="type-butt last"> </th>'+ - '</tr>'+ - '</thead>'+ + '<th><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('SKU') ?></th>'+ + '<th><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Sort Order') ?></th>'+ + '<th class="col-delete"> </th>'+ + '</tr></thead>'+ '<tbody id="select_option_type_row_{{option_id}}">'+ '</tbody>'+ '<tfoot>'+ '<tr>'+ - '<td colspan="100" class="a-right">' + <?php echo Mage::helper('Mage_Core_Helper_Data')->jsonEncode($this->getAddButtonHtml()) ?> + '</td>'+ + '<td colspan="6">' + <?php echo Mage::helper('Mage_Core_Helper_Data')->jsonEncode($this->getAddButtonHtml()) ?> + '</td>'+ '</tr>'+ '</tfoot>'+ '</table>'; @@ -64,7 +62,7 @@ OptionTemplateSelectRow = '<tr id="product_option_{{id}}_select_{{select_id}}">' <?php endif; ?> '<td><input type="text" class="input-text" name="product[options][{{id}}][values][{{select_id}}][sku]" value="{{sku}}"></td>'+ '<td><input type="text" class="validate-zero-or-greater input-text" name="product[options][{{id}}][values][{{select_id}}][sort_order]" value="{{sort_order}}"></td>'+ - '<td class="last"><span title="Delete row">' + <?php echo Mage::helper('Mage_Core_Helper_Data')->jsonEncode($this->getDeleteButtonHtml()) ?> + '</span></td>'+ + '<td class="col-delete">' + <?php echo Mage::helper('Mage_Core_Helper_Data')->jsonEncode($this->getDeleteButtonHtml()) ?> + '</td>'+ '</tr>'; selectOptionType = { diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/options/type/text.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/options/type/text.phtml index 8b9f3583022ccab7fc969eccff6bbaf894fd204b..8088faba61e48b912c2519cdf1e6a3bb489ffb35 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/options/type/text.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/options/type/text.phtml @@ -26,15 +26,15 @@ ?> <script type="text/javascript"> //<![CDATA[ -OptionTemplateText = '<table class="border" cellpadding="0" cellspacing="0">'+ - '<tr class="headings">'+ +OptionTemplateText = '<table class="data-table" cellspacing="0">'+ + '<thead><tr>'+ <?php if ($this->getCanReadPrice() !== false) : ?> '<th class="type-price"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Price') ?></th>' + '<th class="type-type"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Price Type') ?></th>' + <?php endif; ?> '<th class="type-sku"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('SKU') ?></th>'+ '<th class="type-last last"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Max Characters') ?> </th>'+ - '</tr>'+ + '</tr></thead>'+ '<tr>'+ <?php if ($this->getCanReadPrice() !== false) : ?> '<td><input type="text" class="input-text validate-number product-option-price" id="product_option_{{option_id}}_price" name="product[options][{{option_id}}][price]" value="{{price}}"<?php if ($this->getCanEditPrice() === false) : ?> disabled="disabled"<?php endif; ?>></td>' + @@ -44,7 +44,7 @@ OptionTemplateText = '<table class="border" cellpadding="0" cellspacing="0">'+ '<input type="hidden" name="product[options][{{option_id}}][price_type]" id="product_option_{{option_id}}_price_type">' + <?php endif; ?> '<td><input type="text" class="input-text" name="product[options][{{option_id}}][sku]" value="{{sku}}"></td>'+ - '<td class="type-last last"><input type="text" class="input-text validate-zero-or-greater" name="product[options][{{option_id}}][max_characters]" value="{{max_characters}}"></td>'+ + '<td><input type="text" class="input-text validate-zero-or-greater" name="product[options][{{option_id}}][max_characters]" value="{{max_characters}}"></td>'+ '</tr>'+ '</table>'; diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/price/group.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/price/group.phtml index 84a39696166c3446dfc01819863509cb372d21ed..ce92dbe9d8eca382d22004c8b0d9b804723a83ed 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/price/group.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/price/group.phtml @@ -1,4 +1,4 @@ -<?php + <?php /** * Magento * @@ -34,32 +34,25 @@ $_priceValueValidation = $this->getPriceValidation('validate-zero-or-greater'); $_showWebsite= $this->isMultiWebsites(); ?> -<tr id="attribute-<?php echo $_htmlId?>-container"> - <td class="label"><?php echo $this->getElement()->getLabel(); ?></td> - <td colspan="10" class="grid tier"> - <table cellspacing="0" class="data border" id="group_prices_table"> - <?php if ($_showWebsite) : ?> - <col width="135" /> - <?php endif; ?> - <col width="120" /> - <col /> - <col width="1" /> - <thead> - <tr class="headings"> - <th <?php if (!$_showWebsite): ?>style="display: none;"<?php endif; ?>><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Website'); ?></th> - <th><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Customer Group'); ?></th> - <th><?php echo $this->getPriceColumnHeader(Mage::helper('Mage_Catalog_Helper_Data')->__('Price')); ?></th> - <th class="last"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Action'); ?></th> - </tr> - </thead> - <tbody id="<?php echo $_htmlId; ?>_container"></tbody> - <tfoot> - <tr> - <td <?php if (!$_showWebsite): ?>style="display: none;"<?php endif; ?>></td> - <td colspan="4" class="a-right"><?php echo $this->getAddButtonHtml(); ?></td> - </tr> - </tfoot> - </table> +<div class="field" id="attribute-<?php echo $_htmlId?>-container"> + <label class="label"><span><?php echo $this->getElement()->getLabel(); ?></span></label> + <div class="control"> + <table cellspacing="0" class="data-table" id="group_prices_table"> + <thead> + <tr> + <th <?php if (!$_showWebsite): ?>style="display: none;"<?php endif; ?>><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Website'); ?></th> + <th><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Customer Group'); ?></th> + <th><?php echo $this->getPriceColumnHeader(Mage::helper('Mage_Catalog_Helper_Data')->__('Price')); ?></th> + <th class="col-delete"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Action'); ?></th> + </tr> + </thead> + <tbody id="<?php echo $_htmlId; ?>_container"></tbody> + <tfoot> + <tr> + <td colspan="<?php if (!$_showWebsite): ?>5<?php else: ?>4<?php endif; ?>"><?php echo $this->getAddButtonHtml(); ?></td> + </tr> + </tfoot> + </table> <script type="text/javascript"> //<![CDATA[ @@ -76,8 +69,8 @@ var groupPriceRowTemplate = '<tr>' <?php endforeach; ?> + '</select></td>' + '<td><input class="<?php echo $_htmlClass; ?> required-entry <?php echo $_priceValueValidation; ?>" type="text" name="<?php echo $_htmlName; ?>[{{index}}][price]" value="{{price}}" id="group_price_row_{{index}}_price" /></td>' - + '<td class="last"><input type="hidden" name="<?php echo $_htmlName; ?>[{{index}}][delete]" class="delete" value="" id="group_price_row_{{index}}_delete" />' - + '<button title="<?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Delete Group Price'); ?>" type="button" class="scalable delete icon-btn delete-product-option" id="group_price_row_{{index}}_delete_button" onclick="return groupPriceControl.deleteItem(event);">' + + '<td class="col-delete"><input type="hidden" name="<?php echo $_htmlName; ?>[{{index}}][delete]" class="delete" value="" id="group_price_row_{{index}}_delete" />' + + '<button title="<?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Delete Group Price'); ?>" type="button" class="action- scalable delete icon-btn delete-product-option" id="group_price_row_{{index}}_delete_button" onclick="return groupPriceControl.deleteItem(event);">' + '<span><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Delete'); ?></span></button></td>' + '</tr>'; @@ -166,4 +159,5 @@ $('<?php echo $_htmlId; ?>_container').up('table').select('button') <?php endif; ?> //]]> </script> -</td></tr> + </div> +</div> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/price/tier.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/price/tier.phtml index 641603eb2869b84b38b03269092ab5883e3665e9..ab3b8e302b9104237e81a30346e3af1d648e30d7 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/price/tier.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/price/tier.phtml @@ -36,34 +36,26 @@ <?php $_showWebsite = $this->isShowWebsiteColumn(); ?> <?php $_showWebsite= $this->isMultiWebsites(); ?> -<tr id="attribute-<?php echo $_htmlId?>-container"> - <td class="label"><?php echo $this->getElement()->getLabel() ?></td> - <td colspan="10" class="grid tier"> - <table cellspacing="0" class="data border" id="tiers_table"> - <?php if ($_showWebsite): ?> - <col width="135" /> - <?php endif; ?> - <col width="120" /> - <col width="95" /> - <col /> - <col width="1" /> - <thead> - <tr class="headings"> - <th <?php if (!$_showWebsite): ?>style="display:none"<?php endif; ?>><?php echo Mage::helper('Mage_Sales_Helper_Data')->__('Website') ?></th> - <th><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Customer Group') ?></th> - <th><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Qty') ?></th> - <th><?php echo $this->getPriceColumnHeader(Mage::helper('Mage_Catalog_Helper_Data')->__('Price')) ?></th> - <th class="last"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Action') ?></th> - </tr> - </thead> - <tbody id="<?php echo $_htmlId ?>_container"></tbody> - <tfoot> - <tr> - <td <?php if (!$_showWebsite): ?>style="display:none"<?php endif; ?>></td> - <td colspan="4" class="a-right"><?php echo $this->getAddButtonHtml() ?></td> - </tr> - </tfoot> - </table> +<div class="field" id="attribute-<?php echo $_htmlId?>-container"> + <label class="label"><span><?php echo $this->getElement()->getLabel() ?></span></label> + <div class="control"> + <table cellspacing="0" class="data-table" id="tiers_table"> + <thead> + <tr> + <th <?php if (!$_showWebsite): ?>style="display:none"<?php endif; ?>><?php echo Mage::helper('Mage_Sales_Helper_Data')->__('Website') ?></th> + <th><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Customer Group') ?></th> + <th><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Qty') ?></th> + <th><?php echo $this->getPriceColumnHeader(Mage::helper('Mage_Catalog_Helper_Data')->__('Price')) ?></th> + <th class="col-delete"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Action') ?></th> + </tr> + </thead> + <tbody id="<?php echo $_htmlId ?>_container"></tbody> + <tfoot> + <tr> + <td colspan="<?php if (!$_showWebsite): ?>4<?php else: ?>5<?php endif; ?>"><?php echo $this->getAddButtonHtml() ?></td> + </tr> + </tfoot> + </table> <script type="text/javascript"> //<![CDATA[ @@ -79,12 +71,12 @@ var tierPriceRowTemplate = '<tr>' + '<option value="<?php echo $_groupId ?>"><?php echo $this->jsQuoteEscape($this->escapeHtml($_groupName)) ?></option>' <?php endforeach ?> + '</select></td>' - + '<td class="nobr"><input class="<?php echo $_htmlClass ?> qty required-entry validate-greater-than-zero" type="text" name="<?php echo $_htmlName ?>[{{index}}][price_qty]" value="{{qty}}" id="tier_price_row_{{index}}_qty" />' + + '<td class="col-qty"><input class="<?php echo $_htmlClass ?> qty required-entry validate-greater-than-zero" type="text" name="<?php echo $_htmlName ?>[{{index}}][price_qty]" value="{{qty}}" id="tier_price_row_{{index}}_qty" />' + ' <small class="nobr"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__("and above")?></small></td>' - + '<td><input class="<?php echo $_htmlClass ?> required-entry <?php echo $_priceValueValidation ?>" type="text" name="<?php echo $_htmlName ?>[{{index}}][price]" value="{{price}}" id="tier_price_row_{{index}}_price" /></td>' - + '<td class="last"><input type="hidden" name="<?php echo $_htmlName ?>[{{index}}][delete]" class="delete" value="" id="tier_price_row_{{index}}_delete" />' - + '<button title="<?php echo Mage::helper('Mage_Catalog_Helper_Data')->__("Delete Tier") ?>" type="button" class="scalable delete icon-btn delete-product-option" id="tier_price_row_{{index}}_delete_button" onclick="return tierPriceControl.deleteItem(event);">' - + '<span><span><span><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__("Delete") ?></span></span></span></button></td>' + + '<td class="col-price"><input class="<?php echo $_htmlClass ?> required-entry <?php echo $_priceValueValidation ?>" type="text" name="<?php echo $_htmlName ?>[{{index}}][price]" value="{{price}}" id="tier_price_row_{{index}}_price" /></td>' + + '<td class="col-delete"><input type="hidden" name="<?php echo $_htmlName ?>[{{index}}][delete]" class="delete" value="" id="tier_price_row_{{index}}_delete" />' + + '<button title="<?php echo Mage::helper('Mage_Catalog_Helper_Data')->__("Delete Tier") ?>" type="button" class="action- scalable delete icon-btn delete-product-option" id="tier_price_row_{{index}}_delete_button" onclick="return tierPriceControl.deleteItem(event);">' + + '<span><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__("Delete") ?></span></button></td>' + '</tr>'; var tierPriceControl = { @@ -168,4 +160,5 @@ $('<?php echo $_htmlId ?>_container').up('table').select('button') <?php endif; ?> //]]> </script> -</td></tr> + </div> +</div> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/websites.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/websites.phtml index 85de3ec58a48ce7b8a601109bb58efc4bd9e16b5..df570e2c7db45e1ed6deeee24811642bf720e8f2 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/websites.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/edit/websites.phtml @@ -24,70 +24,64 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="entry-edit"> - <div class="entry-edit-head"> - <h4 class="icon-head head-edit-form fieldset-legend"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Product In Websites') ?></h4> +<fieldset id="grop_fields" class="fieldset"> + <legend class="legend"><span><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Product In Websites') ?></span></legend> + <br> + <?php if ($this->getProductId()): ?> + <div class="message message-info"> + <div class="message-inner"> + <div class="message-content"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__("Items that you don't want to show in the catalog or search results should have status 'Disabled' in the desired store.") ?></div> + </div> </div> - <fieldset id="grop_fields"> - <?php if($this->getProductId()): ?> - <ul class="messages"> - <li class="notice-msg"> - <ul> - <li><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__("Items that you don't want to show in the catalog or search results should have status 'Disabled' in the desired store.") ?></li> - </ul> - </li> - </ul> <?php endif; ?> <div class="store-scope"> <?php echo $this->getHintHtml() ?> - <div class="tree-store-scope"> + <div class="store-tree"> <?php foreach ($this->getWebsiteCollection() as $_website): ?> <div class="website-name"> - <input name="product[website_ids][]" value="<?php echo $_website->getId() ?>" <?php if ($this->isReadonly()):?> disabled="disabled"<?php endif;?> class="checkbox website-checkbox" id="product_website_<?php echo $_website->getId() ?>" type="checkbox"<?php if($this->hasWebsite($_website->getId())): ?> checked="checked"<?php endif; ?> /> - <big><strong><label for="product_website_<?php echo $_website->getId() ?>"><?php echo $this->escapeHtml($_website->getName()) ?></label></strong></big> + <input name="product[website_ids][]" value="<?php echo $_website->getId() ?>" <?php if ($this->isReadonly()): ?> disabled="disabled"<?php endif;?> class="checkbox website-checkbox" id="product_website_<?php echo $_website->getId() ?>" type="checkbox"<?php if ($this->hasWebsite($_website->getId())): ?> checked="checked"<?php endif; ?> /> + <label for="product_website_<?php echo $_website->getId() ?>"><?php echo $this->escapeHtml($_website->getName()) ?></label> </div> - <div class="webiste-groups" id="product_website_<?php echo $_website->getId() ?>_data"> - <?php foreach ($this->getGroupCollection($_website) as $_group): ?> - <h4><?php echo $this->escapeHtml($_group->getName()) ?></h4> - <div class="group-stores"> - <table> - <?php foreach ($this->getStoreCollection($_group) as $_store): ?> - <tr> - <td><?php echo $this->escapeHtml($_store->getName()) ?></td> - <td> - <?php if($this->getWebsites() && !$this->hasWebsite($_website->getId())): ?> + <dl class="webiste-groups" id="product_website_<?php echo $_website->getId() ?>_data"> + <?php foreach ($this->getGroupCollection($_website) as $_group): ?> + <dt><?php echo $this->escapeHtml($_group->getName()) ?></dt> + <dd> + <ul> + <?php foreach ($this->getStoreCollection($_group) as $_store): ?> + <li> + <?php echo $this->escapeHtml($_store->getName()) ?> + <?php if ($this->getWebsites() && !$this->hasWebsite($_website->getId())): ?> <span class="website-<?php echo $_website->getId() ?>-select" style="display:none"> <?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('(Copy data from: %s)', $this->getChooseFromStoreHtml($_store)) ?> </span> - <?php endif; ?> - </td> - </tr> + <?php endif; ?> + </li> + <?php endforeach; ?> + </ul> + </dd> <?php endforeach; ?> - </table> - </div> - <?php endforeach; ?> - </div> + </dl> <?php endforeach; ?> </div> </div> - </fieldset> -</div> +</fieldset> + <script type="text/javascript"> -//<![CDATA[ + //<![CDATA[ var productWebsiteCheckboxes = $$('.website-checkbox'); - for(var i=0;i<productWebsiteCheckboxes.length;i++){ + for (var i = 0; i < productWebsiteCheckboxes.length; i++) { Event.observe(productWebsiteCheckboxes[i], 'click', toggleStoreFromChoosers); } - function toggleStoreFromChoosers(event){ + function toggleStoreFromChoosers(event) { var element = Event.element(event); - var selects = $('product_website_'+element.value+'_data').getElementsBySelector('select'); - var selectBlocks = $('product_website_'+element.value+'_data').getElementsByClassName('website-'+element.value+'-select'); - for (var i=0; i<selects.length; i++) { - selects[i].disabled=!element.checked; + var selects = $('product_website_' + element.value + '_data').getElementsBySelector('select'); + var selectBlocks = $('product_website_' + element.value + '_data').getElementsByClassName('website-' + element.value + '-select'); + for (var i = 0; i < selects.length; i++) { + selects[i].disabled = !element.checked; } - for (var i=0; i<selectBlocks.length; i++) { + for (var i = 0; i < selectBlocks.length; i++) { if (element.checked) { selectBlocks[i].show(); } @@ -96,5 +90,5 @@ } } } -//]]> + //]]> </script> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/helper/gallery.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/helper/gallery.phtml index 46cd83ab91fae02ad7ef644dfc211decfaf8fb2f..5da5b5a3312f689bf9a2d746abef129f4f8c575b 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/helper/gallery.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/helper/gallery.phtml @@ -33,93 +33,127 @@ $_block = $this; /* @var $_block Mage_Adminhtml_Block_Catalog_Product_Helper_Form_Gallery_Content */ ?> -<div id="<?php echo $_block->getHtmlId() ?>" > -<ul class="messages"> - <li class="notice-msg"> - <ul> - <li> - <?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Image type and information need to be specified for each store view.'); ?> - </li> - </ul> - </li> -</ul> -<div class="grid"> -<table cellspacing="0" class="data border" id="<?php echo $_block->getHtmlId() ?>_grid" width="100%"> - <col width="1" /> - <col /> - <col width="70" /> - <?php foreach ($_block->getImageTypes() as $typeId=>$type): ?> - <col /> - <?php endforeach; ?> - <col width="70" /> - <col width="70" /> - <thead> - <tr class="headings"> - <th><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Image') ?></th> - <th><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Label') ?></th> - <th><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Sort Order') ?></th> - <?php foreach ($_block->getImageTypes() as $typeId=>$type): ?> - <th><?php echo $type['label'] ?></th> +<div id="<?php echo $_block->getHtmlId() ?>"> + <div class="message message-info"> + <div class="message-inner"> + <div class="message-content"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Image type and information need to be specified for each store view.'); ?></div> + </div> + </div> + <div class="grid"> + <table cellspacing="0" class="data border" id="<?php echo $_block->getHtmlId() ?>_grid" width="100%"> + <col width="1"/> + <col/> + <col width="70"/> + <?php foreach ($_block->getImageTypes() as $typeId => $type): ?> + <col/> <?php endforeach; ?> - <th><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Exclude') ?></th> - <th class="last"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Remove') ?></th> - </tr> - </thead> - <tbody id="<?php echo $_block->getHtmlId() ?>_list"> - <tr id="<?php echo $_block->getHtmlId() ?>_template" class="template no-display"> - <td class="cell-image"><div class="place-holder" onmouseover="<?php echo $_block->getJsObjectName(); ?>.loadImage('__file__')"><span><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Roll Over for preview') ?></span></div><img src="<?php echo $this->getViewFileUrl('images/spacer.gif')?>" width="100" style="display:none;" alt="" /></td> - <td class="cell-label"><input type="text" <?php if($_block->getElement()->getReadonly()):?> disabled="disabled"<?php endif;?> class="input-text" onkeyup="<?php echo $_block->getJsObjectName(); ?>.updateImage('__file__')" onchange="<?php echo $_block->getJsObjectName(); ?>.updateImage('__file__')" /></td> - <td class="cell-position"><input type="text" <?php if($_block->getElement()->getReadonly()):?> disabled="disabled"<?php endif;?> class="input-text validate-number" onkeyup="<?php echo $_block->getJsObjectName(); ?>.updateImage('__file__')" onchange="<?php echo $_block->getJsObjectName(); ?>.updateImage('__file__')" /></td> - <?php foreach ($_block->getImageTypes() as $typeId=>$type): ?> - <td class="cell-<?php echo $typeId ?> a-center"><input <?php if($_block->getElement()->getAttributeReadonly($typeId)) :?> disabled="disabled" <?php endif;?> type="radio" name="<?php echo $type['field'] ?>" onclick="<?php echo $_block->getJsObjectName(); ?>.setProductImages('__file__')" value="__file__" /></td> + <col width="70"/> + <col width="70"/> + <thead> + <tr class="headings"> + <th><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Image') ?></th> + <th><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Label') ?></th> + <th><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Sort Order') ?></th> + <?php foreach ($_block->getImageTypes() as $typeId => $type): ?> + <th><?php echo $type['label'] ?></th> <?php endforeach; ?> - <td class="cell-disable a-center"><input type="checkbox" <?php if($_block->getElement()->getReadonly()):?> disabled="disabled"<?php endif;?> onclick="<?php echo $_block->getJsObjectName(); ?>.updateImage('__file__')" /></td> - <td class="cell-remove a-center last"><input type="checkbox" <?php if($_block->getElement()->getReadonly()):?> disabled="disabled"<?php endif;?> onclick="<?php echo $_block->getJsObjectName(); ?>.updateImage('__file__')" /></td> - </tr> - <?php if($_block->hasUseDefault()): ?> - <tr id="<?php echo $_block->getHtmlId() ?>_default"> + <th><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Exclude') ?></th> + <th class="last"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Remove') ?></th> + </tr> + </thead> + <tbody id="<?php echo $_block->getHtmlId() ?>_list"> + <tr id="<?php echo $_block->getHtmlId() ?>_template" class="template no-display"> + <td class="cell-image"> + <div class="place-holder" + onmouseover="<?php echo $_block->getJsObjectName(); ?>.loadImage('__file__')"> + <span><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Roll Over for preview') ?></span> + </div> + <img src="<?php echo $this->getViewFileUrl('images/spacer.gif')?>" width="100" style="display:none;" + alt=""/> + </td> + <td class="cell-label"><input type="text" <?php if ($_block->getElement()->getReadonly()): ?> + disabled="disabled"<?php endif;?> class="input-text" + onkeyup="<?php echo $_block->getJsObjectName(); ?>.updateImage('__file__')" + onchange="<?php echo $_block->getJsObjectName(); ?>.updateImage('__file__')"/> + </td> + <td class="cell-position"><input type="text" <?php if ($_block->getElement()->getReadonly()): ?> + disabled="disabled"<?php endif;?> class="input-text validate-number" + onkeyup="<?php echo $_block->getJsObjectName(); ?>.updateImage('__file__')" + onchange="<?php echo $_block->getJsObjectName(); ?>.updateImage('__file__')"/> + </td> + <?php foreach ($_block->getImageTypes() as $typeId => $type): ?> + <td class="cell-<?php echo $typeId ?> a-center"> + <input <?php if ($_block->getElement()->getAttributeReadonly($typeId)) : ?> + disabled="disabled" <?php endif;?> type="radio" name="<?php echo $type['field'] ?>" + onclick="<?php echo $_block->getJsObjectName(); ?>.setProductImages('__file__')" + value="__file__"/> + </td> + <?php endforeach; ?> + <td class="cell-disable a-center"><input + type="checkbox" <?php if ($_block->getElement()->getReadonly()): ?> + disabled="disabled"<?php endif;?> + onclick="<?php echo $_block->getJsObjectName(); ?>.updateImage('__file__')"/></td> + <td class="cell-remove a-center last"><input + type="checkbox" <?php if ($_block->getElement()->getReadonly()): ?> + disabled="disabled"<?php endif;?> + onclick="<?php echo $_block->getJsObjectName(); ?>.updateImage('__file__')"/></td> + </tr> + <?php if ($_block->hasUseDefault()): ?> + <tr id="<?php echo $_block->getHtmlId() ?>_default"> <td><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Use Default Value') ?></td> <td> </td> <td> </td> <?php foreach ($_block->getMediaAttributes() as $_attribute): ?> <td class="a-center"> - <?php if($_block->getElement()->canDisplayUseDefault($_attribute)): ?> - <input class="default-checkbox" name="use_default[]" type="checkbox" <?php if($_block->getElement()->getAttributeReadonly($_attribute->getAttributeCode())):?> disabled="disabled" <?php endif;?> onclick="<?php echo $_block->getJsObjectName(); ?>.updateUseDefault()" -<?php if($_block->getElement()->usedDefault($_attribute)): ?>checked<?php endif; ?> value="<?php echo $_attribute->getAttributeCode() ?>" /> - <?php endif ?> + <?php if ($_block->getElement()->canDisplayUseDefault($_attribute)): ?> + <input class="default-checkbox" name="use_default[]" + type="checkbox" <?php if ($_block->getElement()->getAttributeReadonly($_attribute->getAttributeCode())): ?> + disabled="disabled" <?php endif;?> + onclick="<?php echo $_block->getJsObjectName(); ?>.updateUseDefault()" <?php if ($_block->getElement()->usedDefault($_attribute)): ?>checked<?php endif; ?> + value="<?php echo $_attribute->getAttributeCode() ?>"/> + <?php endif ?> </td> <?php endforeach; ?> <td> </td> <td class="last"> </td> - </tr> - <?php endif ?> - <tr id="<?php echo $_block->getHtmlId() ?>-image-0"> + </tr> + <?php endif ?> + <tr id="<?php echo $_block->getHtmlId() ?>-image-0"> <td class="cell-image"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('No image') ?></td> - <td class="cell-label"><input type="hidden" /> </td> - <td class="cell-position"><input type="hidden" /> </td> - <?php foreach ($_block->getImageTypes() as $typeId=>$type): ?> - <td class="cell-<?php echo $typeId ?> a-center"><input type="radio" <?php if($_block->getElement()->getAttributeReadonly($typeId)) :?> disabled="disabled" <?php endif;?> name="<?php echo $type['field'] ?>" onclick="<?php echo $_block->getJsObjectName(); ?>.setProductImages('no_selection')" value="no_selection" /></td> + <td class="cell-label"><input type="hidden"/> </td> + <td class="cell-position"><input type="hidden"/> </td> + <?php foreach ($_block->getImageTypes() as $typeId => $type): ?> + <td class="cell-<?php echo $typeId ?> a-center"><input + type="radio" <?php if ($_block->getElement()->getAttributeReadonly($typeId)) : ?> + disabled="disabled" <?php endif;?> name="<?php echo $type['field'] ?>" + onclick="<?php echo $_block->getJsObjectName(); ?>.setProductImages('no_selection')" + value="no_selection"/></td> <?php endforeach; ?> - <td class="cell-disable"><input type="hidden" /> </td> - <td class="cell-remove last"><input type="hidden" /> </td> - </tr> - </tbody> -<?php if (!$_block->getElement()->getReadonly()):?> - <tfoot> - <tr> - <td colspan="100" class="last" style="padding:8px"> - <?php echo $_block->getUploaderHtml() ?> - </td> - </tr> - </tfoot> -<?php endif;?> -</table> -</div> + <td class="cell-disable"><input type="hidden"/> </td> + <td class="cell-remove last"><input type="hidden"/> </td> + </tr> + </tbody> + <?php if (!$_block->getElement()->getReadonly()): ?> + <tfoot> + <tr> + <td colspan="100" class="last" style="padding:8px"> + <?php echo $_block->getUploaderHtml() ?> + </td> + </tr> + </tfoot> + <?php endif;?> + </table> + </div> </div> -<input type="hidden" id="<?php echo $_block->getHtmlId() ?>_save" name="<?php echo $_block->getElement()->getName() ?>[images]" value="<?php echo $_block->escapeHtml($_block->getImagesJson()) ?>" /> -<input type="hidden" id="<?php echo $_block->getHtmlId() ?>_save_image" name="<?php echo $_block->getElement()->getName() ?>[values]" value="<?php echo $_block->escapeHtml($_block->getImagesValuesJson()) ?>" /> +<input type="hidden" id="<?php echo $_block->getHtmlId() ?>_save" + name="<?php echo $_block->getElement()->getName() ?>[images]" + value="<?php echo $_block->escapeHtml($_block->getImagesJson()) ?>"/> +<input type="hidden" id="<?php echo $_block->getHtmlId() ?>_save_image" + name="<?php echo $_block->getElement()->getName() ?>[values]" + value="<?php echo $_block->escapeHtml($_block->getImagesValuesJson()) ?>"/> <script type="text/javascript"> -//<![CDATA[ -var <?php echo $_block->getJsObjectName(); ?> = new Product.Gallery('<?php echo $_block->getHtmlId() ?>', null, <?php echo $_block->getImageTypesJson() ?>); -//]]> + //<![CDATA[ + var <?php echo $_block->getJsObjectName(); ?> = + new Product.Gallery('<?php echo $_block->getHtmlId() ?>', null, <?php echo $_block->getImageTypesJson() ?>); + //]]> </script> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/tab/inventory.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/tab/inventory.phtml index b1ff06f43a5acb675fc9c16a53386130dad6b021..68d8c23d72f0b1fbfb34e36d4541f568bcf47532 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/tab/inventory.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/catalog/product/tab/inventory.phtml @@ -23,201 +23,253 @@ * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ - /** @var $this Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Inventory */ +/** @var $this Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Inventory */ ?> -<?php if ($this->isReadonly()):?> -<?php $_readonly = ' disabled="disabled" ';?> +<?php if ($this->isReadonly()): ?> +<?php $_readonly = ' disabled="disabled" '; ?> <?php else: ?> -<?php $_readonly = '';?> +<?php $_readonly = ''; ?> <?php endif; ?> -<div class="entry-edit"> - <div class="entry-edit-head"> - <h4 class="icon-head head-edit-form fieldset-legend"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Inventory') ?></h4> +<fieldset class="fieldset form-inline"> +<legend class="legend"><span><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Inventory') ?></span></legend> +<br> +<div id="table_cataloginventory"> +<div class="field"> + <label class="label" for="inventory_manage_stock"> + <span><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Manage Stock') ?></span> + </label> + <div class="control"> + <select id="inventory_manage_stock" name="<?php echo $this->getFieldSuffix() ?>[stock_data][manage_stock]" <?php echo $_readonly;?>> + <option value="1"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Yes') ?></option> + <option value="0"<?php if ($this->getConfigFieldValue('manage_stock') == 0): ?> selected="selected"<?php endif; ?>><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('No') ?></option> + </select> + <input type="hidden" id="inventory_manage_stock_default" value="<?php echo $this->getDefaultConfigValue('manage_stock'); ?>"> + <?php $_checked = ($this->getFieldValue('use_config_manage_stock') || $this->IsNew()) ? 'checked="checked"' : '' ?> + <input type="checkbox" id="inventory_use_config_manage_stock" name="<?php echo $this->getFieldSuffix() ?>[stock_data][use_config_manage_stock]" value="1" <?php echo $_checked ?> onclick="toggleValueElements(this, this.parentNode);" <?php echo $_readonly;?>> + <label for="inventory_use_config_manage_stock"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Use Config Settings') ?></label> + <?php if (!$this->isReadonly()): ?> + <script type="text/javascript">toggleValueElements($('inventory_use_config_manage_stock'), $('inventory_use_config_manage_stock').parentNode);</script> + <?php endif; ?> </div> - <fieldset> - - <legend><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Inventory') ?></legend> - <table cellspacing="0" class="form-list" id="table_cataloginventory"> - <tr> - <td class="label"><label for="inventory_manage_stock"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Manage Stock') ?></label></td> - <td class="value"><select id="inventory_manage_stock" name="<?php echo $this->getFieldSuffix() ?>[stock_data][manage_stock]" class="select" <?php echo $_readonly;?>> - <option value="1"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Yes') ?></option> - <option value="0"<?php if ($this->getConfigFieldValue('manage_stock') == 0): ?> selected="selected"<?php endif; ?>><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('No') ?></option> - </select> - <input type="hidden" id="inventory_manage_stock_default" value="<?php echo $this->getDefaultConfigValue('manage_stock'); ?>" /> - - <?php $_checked = ($this->getFieldValue('use_config_manage_stock') || $this->IsNew()) ? 'checked="checked"' : '' ?> - <input type="checkbox" id="inventory_use_config_manage_stock" name="<?php echo $this->getFieldSuffix() ?>[stock_data][use_config_manage_stock]" value="1" <?php echo $_checked ?> onclick="toggleValueElements(this, this.parentNode);" class="checkbox" <?php echo $_readonly;?>/> - <label for="inventory_use_config_manage_stock" class="normal"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Use Config Settings') ?></label> - <?php if (!$this->isReadonly()):?><script type="text/javascript">toggleValueElements($('inventory_use_config_manage_stock'), $('inventory_use_config_manage_stock').parentNode);</script><?php endif; ?></td> - <?php if (!Mage::app()->isSingleStoreMode()): ?> - <td class="value scope-label"><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('[GLOBAL]') ?></td> - <?php endif; ?> - </tr> + <?php if (!Mage::app()->isSingleStoreMode()): ?> + <div class="field-service"><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('[GLOBAL]') ?></div> + <?php endif; ?> +</div> <?php if (!$this->getProduct()->isComposite()): ?> - <tr> - <td class="label"><label for="inventory_qty"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Qty') ?></label></td> - <td class="value"> - <?php if (!$_readonly):?> - <input type="hidden" id="original_inventory_qty" name="<?php echo $this->getFieldSuffix() ?>[stock_data][original_inventory_qty]" value="<?php echo $this->getFieldValue('qty')*1 ?>"/> - <?php endif;?> - <input type="text" class="input-text validate-number" id="inventory_qty" name="<?php echo $this->getFieldSuffix() ?>[stock_data][qty]" value="<?php echo $this->getFieldValue('qty')*1 ?>" <?php echo $_readonly;?>/> - </td> - <?php if (!Mage::app()->isSingleStoreMode()): ?> - <td class="value scope-label"><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('[GLOBAL]') ?></td> - <?php endif; ?> - </tr> - - <tr> - <td class="label"><label for="inventory_min_qty"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Qty for Item\'s Status to Become Out of Stock') ?></label></td> - <td class="value"><input type="text" class="input-text validate-number" id="inventory_min_qty" name="<?php echo $this->getFieldSuffix() ?>[stock_data][min_qty]" value="<?php echo $this->getFieldValue('min_qty')*1 ?>" <?php echo $_readonly;?>/> - - <?php $_checked = ($this->getFieldValue('use_config_min_qty') || $this->IsNew()) ? 'checked="checked"' : '' ?> - <input type="checkbox" id="inventory_use_config_min_qty" name="<?php echo $this->getFieldSuffix() ?>[stock_data][use_config_min_qty]" value="1" <?php echo $_checked ?> onclick="toggleValueElements(this, this.parentNode);" <?php echo $_readonly;?> /> - <label for="inventory_use_config_min_qty" class="normal"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Use Config Settings') ?></label> - <?php if (!$this->isReadonly()):?><script type="text/javascript">toggleValueElements($('inventory_use_config_min_qty'), $('inventory_use_config_min_qty').parentNode);</script><?php endif; ?></td> - <?php if (!Mage::app()->isSingleStoreMode()): ?> - <td class="value scope-label"><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('[GLOBAL]') ?></td> - <?php endif; ?> - </tr> - - <tr> - <td class="label"><label for="inventory_min_sale_qty"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Minimum Qty Allowed in Shopping Cart') ?></label></td> - <td class="value"><input type="text" class="input-text validate-number" id="inventory_min_sale_qty" name="<?php echo $this->getFieldSuffix() ?>[stock_data][min_sale_qty]" value="<?php echo $this->getFieldValue('min_sale_qty')*1 ?>" <?php echo $_readonly;?>/> +<div class="field"> + <label class="label" for="inventory_qty"> + <span><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Qty') ?></span> + </label> + <div class="control"> + <?php if (!$_readonly): ?> + <input type="hidden" id="original_inventory_qty" name="<?php echo $this->getFieldSuffix() ?>[stock_data][original_inventory_qty]" value="<?php echo $this->getFieldValue('qty') * 1 ?>"> + <?php endif;?> + <input type="text" class="input-text validate-number" id="inventory_qty" name="<?php echo $this->getFieldSuffix() ?>[stock_data][qty]" value="<?php echo $this->getFieldValue('qty') * 1 ?>" <?php echo $_readonly;?>> + </div> + <?php if (!Mage::app()->isSingleStoreMode()): ?> + <div class="field-service"><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('[GLOBAL]') ?></div> + <?php endif; ?> +</div> - <?php $_checked = ($this->getFieldValue('use_config_min_sale_qty') || $this->IsNew()) ? 'checked="checked"' : '' ?> - <input type="checkbox" id="inventory_use_config_min_sale_qty" name="<?php echo $this->getFieldSuffix() ?>[stock_data][use_config_min_sale_qty]" value="1" <?php echo $_checked ?> onclick="toggleValueElements(this, this.parentNode);" class="checkbox" <?php echo $_readonly;?> /> - <label for="inventory_use_config_min_sale_qty" class="normal"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Use Config Settings') ?></label> - <?php if (!$this->isReadonly()):?><script type="text/javascript">toggleValueElements($('inventory_use_config_min_sale_qty'), $('inventory_use_config_min_sale_qty').parentNode);</script><?php endif; ?></td> - <?php if (!Mage::app()->isSingleStoreMode()): ?> - <td class="value scope-label"><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('[GLOBAL]') ?></td> - <?php endif; ?> - </tr> +<div class="field"> + <label class="label" for="inventory_min_qty"> + <span><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Qty for Item\'s Status to Become Out of Stock') ?></span> + </label> + <div class="control"> + <input type="text" class="input-text validate-number" id="inventory_min_qty" name="<?php echo $this->getFieldSuffix() ?>[stock_data][min_qty]" value="<?php echo $this->getFieldValue('min_qty') * 1 ?>" <?php echo $_readonly;?>> + <?php $_checked = ($this->getFieldValue('use_config_min_qty') || $this->IsNew()) ? 'checked="checked"' : '' ?> + <input type="checkbox" id="inventory_use_config_min_qty" name="<?php echo $this->getFieldSuffix() ?>[stock_data][use_config_min_qty]" value="1" <?php echo $_checked ?> onclick="toggleValueElements(this, this.parentNode);" <?php echo $_readonly;?>> + <label for="inventory_use_config_min_qty"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Use Config Settings') ?></label> + <?php if (!$this->isReadonly()): ?> + <script type="text/javascript">toggleValueElements($('inventory_use_config_min_qty'), $('inventory_use_config_min_qty').parentNode);</script> + <?php endif; ?> + </div> + <?php if (!Mage::app()->isSingleStoreMode()): ?> + <div class="field-service"><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('[GLOBAL]') ?></div> + <?php endif; ?> +</div> - <tr> - <td class="label"><label for="inventory_max_sale_qty"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Maximum Qty Allowed in Shopping Cart') ?></label></td> - <td class="value"><input type="text" class="input-text validate-number" id="inventory_max_sale_qty" name="<?php echo $this->getFieldSuffix() ?>[stock_data][max_sale_qty]" value="<?php echo $this->getFieldValue('max_sale_qty')*1 ?>" <?php echo $_readonly;?> /> +<div class="field"> + <label class="label" for="inventory_min_sale_qty"> + <span><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Minimum Qty Allowed in Shopping Cart') ?></span> + </label> + <div class="control"> + <input type="text" class="input-text validate-number" id="inventory_min_sale_qty" + name="<?php echo $this->getFieldSuffix() ?>[stock_data][min_sale_qty]" + value="<?php echo $this->getFieldValue('min_sale_qty') * 1 ?>" <?php echo $_readonly;?>> + <?php $_checked = ($this->getFieldValue('use_config_min_sale_qty') || $this->IsNew()) ? 'checked="checked"' : '' ?> + <input type="checkbox" id="inventory_use_config_min_sale_qty" name="<?php echo $this->getFieldSuffix() ?>[stock_data][use_config_min_sale_qty]" value="1" <?php echo $_checked ?> onclick="toggleValueElements(this, this.parentNode);" class="checkbox" <?php echo $_readonly;?>> + <label for="inventory_use_config_min_sale_qty"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Use Config Settings') ?></label> + <?php if (!$this->isReadonly()): ?> + <script type="text/javascript">toggleValueElements($('inventory_use_config_min_sale_qty'), $('inventory_use_config_min_sale_qty').parentNode);</script> + <?php endif; ?> + </div> + <?php if (!Mage::app()->isSingleStoreMode()): ?> + <div class="field-service"><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('[GLOBAL]') ?></div> + <?php endif; ?> +</div> - <?php $_checked = ($this->getFieldValue('use_config_max_sale_qty') || $this->IsNew()) ? 'checked="checked"' : '' ?> - <input type="checkbox" id="inventory_use_config_max_sale_qty" name="<?php echo $this->getFieldSuffix() ?>[stock_data][use_config_max_sale_qty]" value="1" <?php echo $_checked ?> onclick="toggleValueElements(this, this.parentNode);" class="checkbox" <?php echo $_readonly;?> /> - <label for="inventory_use_config_max_sale_qty" class="normal"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Use Config Settings') ?></label> - <?php if (!$this->isReadonly()):?><script type="text/javascript">toggleValueElements($('inventory_use_config_max_sale_qty'), $('inventory_use_config_max_sale_qty').parentNode);</script><?php endif; ?></td> - <?php if (!Mage::app()->isSingleStoreMode()): ?> - <td class="value scope-label"><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('[GLOBAL]') ?></td> - <?php endif; ?> - </tr> +<div class="field"> + <label class="label" for="inventory_max_sale_qty"> + <span><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Maximum Qty Allowed in Shopping Cart') ?></span> + </label> + <div class="control"> + <input type="text" class="input-text validate-number" id="inventory_max_sale_qty" name="<?php echo $this->getFieldSuffix() ?>[stock_data][max_sale_qty]" value="<?php echo $this->getFieldValue('max_sale_qty') * 1 ?>" <?php echo $_readonly;?>> + <?php $_checked = ($this->getFieldValue('use_config_max_sale_qty') || $this->IsNew()) ? 'checked="checked"' : '' ?> + <input type="checkbox" id="inventory_use_config_max_sale_qty" name="<?php echo $this->getFieldSuffix() ?>[stock_data][use_config_max_sale_qty]" value="1" <?php echo $_checked ?> onclick="toggleValueElements(this, this.parentNode);" class="checkbox" <?php echo $_readonly;?>> + <label for="inventory_use_config_max_sale_qty"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Use Config Settings') ?></label> + <?php if (!$this->isReadonly()): ?> + <script type="text/javascript">toggleValueElements($('inventory_use_config_max_sale_qty'), $('inventory_use_config_max_sale_qty').parentNode);</script> + <?php endif; ?> + </div> + <?php if (!Mage::app()->isSingleStoreMode()): ?> + <div class="field-service"><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('[GLOBAL]') ?></div> + <?php endif; ?> +</div> - <?php if($this->canUseQtyDecimals()): ?> - <tr> - <td class="label"><label for="inventory_is_qty_decimal"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Qty Uses Decimals') ?></label></td> - <td class="value"><select id="inventory_is_qty_decimal" name="<?php echo $this->getFieldSuffix() ?>[stock_data][is_qty_decimal]" class="select" <?php echo $_readonly;?>> + <?php if ($this->canUseQtyDecimals()): ?> + <div class="field"> + <label class="label" for="inventory_is_qty_decimal"> + <span><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Qty Uses Decimals') ?></span> + </label> + <div class="control"> + <select id="inventory_is_qty_decimal" name="<?php echo $this->getFieldSuffix() ?>[stock_data][is_qty_decimal]" <?php echo $_readonly;?>> <option value="0"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('No') ?></option> - <option value="1"<?php if($this->getFieldValue('is_qty_decimal')==1): ?> selected="selected"<?php endif; ?>><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Yes') ?></option> + <option value="1"<?php if ($this->getFieldValue('is_qty_decimal') == 1): ?> selected="selected"<?php endif; ?>><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Yes') ?></option> </select> - </td> - <?php if (!Mage::app()->isSingleStoreMode()): ?> - <td class="value scope-label"><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('[GLOBAL]') ?></td> - <?php endif; ?> - </tr> + </div> + <?php if (!Mage::app()->isSingleStoreMode()): ?> + <div class="field-service"><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('[GLOBAL]') ?></div> + <?php endif; ?> + </div> <?php if (!$this->isVirtual()) : ?> - <tr> - <td class="label"><label for="inventory_is_decimal_divided"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Can be Divided into Multiple Boxes for Shipping') ?></label></td> - <td class="value"><select id="inventory_is_decimal_divided" name="<?php echo $this->getFieldSuffix() ?>[stock_data][is_decimal_divided]" class="select" <?php echo $_readonly;?>> - <option value="0"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('No') ?></option> - <option value="1"<?php if($this->getFieldValue('is_decimal_divided') == 1): ?> selected="selected"<?php endif; ?>><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Yes') ?></option> - </select> - </td> + <div class="field"> + <label class="label" for="inventory_is_decimal_divided"> + <span><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Can be Divided into Multiple Boxes for Shipping') ?></span> + </label> + <div class="control"> + <select id="inventory_is_decimal_divided" name="<?php echo $this->getFieldSuffix() ?>[stock_data][is_decimal_divided]" <?php echo $_readonly;?>> + <option value="0"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('No') ?></option> + <option value="1"<?php if ($this->getFieldValue('is_decimal_divided') == 1): ?> selected="selected"<?php endif; ?>><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Yes') ?></option> + </select> + </div> <?php if (!Mage::app()->isSingleStoreMode()): ?> - <td class="value scope-label"><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('[GLOBAL]') ?></td> + <div class="field-service"><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('[GLOBAL]') ?></div> + <?php endif; ?> + </div> <?php endif; ?> - </tr> - <?php endif; ?> - <?php endif; ?> - <tr> - <td class="label"><label for="inventory_backorders"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Backorders') ?></label></td> - <td class="value"><select id="inventory_backorders" name="<?php echo $this->getFieldSuffix() ?>[stock_data][backorders]" class="select" <?php echo $_readonly;?>> +<div class="field"> + <label class="label" for="inventory_backorders"> + <span><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Backorders') ?></span> + </label> + <div class="control"> + <select id="inventory_backorders" name="<?php echo $this->getFieldSuffix() ?>[stock_data][backorders]" <?php echo $_readonly;?>> <?php foreach ($this->getBackordersOption() as $option): ?> - <?php $_selected = ($option['value'] == $this->getFieldValue('backorders')) ? 'selected="selected"' : '' ?> - <option value="<?php echo $option['value'] ?>" <?php echo $_selected ?>><?php echo $option['label'] ?></option> + <?php $_selected = ($option['value'] == $this->getFieldValue('backorders')) ? 'selected="selected"' : '' ?> + <option value="<?php echo $option['value'] ?>" <?php echo $_selected ?>><?php echo $option['label'] ?></option> <?php endforeach; ?> - </select> + </select> + <?php $_checked = ($this->getFieldValue('use_config_backorders') || $this->IsNew()) ? 'checked="checked"' : '' ?> + <input type="checkbox" id="inventory_use_config_backorders" name="<?php echo $this->getFieldSuffix() ?>[stock_data][use_config_backorders]" value="1" <?php echo $_checked ?> onclick="toggleValueElements(this, this.parentNode);" <?php echo $_readonly;?>> + <label for="inventory_use_config_backorders"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Use Config Settings') ?></label> + <?php if (!$this->isReadonly()): ?> + <script type="text/javascript">toggleValueElements($('inventory_use_config_backorders'), $('inventory_use_config_backorders').parentNode);</script> + <?php endif; ?> + </div> + <?php if (!Mage::app()->isSingleStoreMode()): ?> + <div class="field-service"><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('[GLOBAL]') ?></div> + <?php endif; ?> +</div> - <?php $_checked = ($this->getFieldValue('use_config_backorders') || $this->IsNew()) ? 'checked="checked"' : '' ?> - <input type="checkbox" id="inventory_use_config_backorders" name="<?php echo $this->getFieldSuffix() ?>[stock_data][use_config_backorders]" value="1" <?php echo $_checked ?> onclick="toggleValueElements(this, this.parentNode);" class="checkbox" <?php echo $_readonly;?> /> - <label for="inventory_use_config_backorders" class="normal"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Use Config Settings') ?></label> - <?php if (!$this->isReadonly()):?><script type="text/javascript">toggleValueElements($('inventory_use_config_backorders'), $('inventory_use_config_backorders').parentNode);</script><?php endif; ?></td> - <?php if (!Mage::app()->isSingleStoreMode()): ?> - <td class="value scope-label"><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('[GLOBAL]') ?></td> - <?php endif; ?> - </tr> - <tr> - <td class="label"><label for="inventory_notify_stock_qty"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Notify for Quantity Below') ?></label></td> - <td class="value"><input type="text" class="input-text validate-number" id="inventory_notify_stock_qty" name="<?php echo $this->getFieldSuffix() ?>[stock_data][notify_stock_qty]" value="<?php echo $this->getFieldValue('notify_stock_qty')*1 ?>" <?php echo $_readonly;?>/> +<div class="field"> + <label class="label" for="inventory_notify_stock_qty"> + <span><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Notify for Quantity Below') ?></span> + </label> + <div class="control"> + <input type="text" class="input-text validate-number" id="inventory_notify_stock_qty" name="<?php echo $this->getFieldSuffix() ?>[stock_data][notify_stock_qty]" value="<?php echo $this->getFieldValue('notify_stock_qty') * 1 ?>" <?php echo $_readonly;?>> + <?php $_checked = ($this->getFieldValue('use_config_notify_stock_qty') || $this->IsNew()) ? 'checked="checked"' : '' ?> + <input type="checkbox" id="inventory_use_config_notify_stock_qty" name="<?php echo $this->getFieldSuffix() ?>[stock_data][use_config_notify_stock_qty]" value="1" <?php echo $_checked ?> onclick="toggleValueElements(this, this.parentNode);" <?php echo $_readonly;?>> + <label for="inventory_use_config_notify_stock_qty"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Use Config Settings') ?></label> + <?php if (!$this->isReadonly()): ?> + <script type="text/javascript">toggleValueElements($('inventory_use_config_notify_stock_qty'), $('inventory_use_config_notify_stock_qty').parentNode);</script> + <?php endif; ?> + </div> + <?php if (!Mage::app()->isSingleStoreMode()): ?> + <div class="field-service"><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('[GLOBAL]') ?></div> + <?php endif; ?> +</div> - <?php $_checked = ($this->getFieldValue('use_config_notify_stock_qty') || $this->IsNew()) ? 'checked="checked"' : '' ?> - <input type="checkbox" id="inventory_use_config_notify_stock_qty" name="<?php echo $this->getFieldSuffix() ?>[stock_data][use_config_notify_stock_qty]" value="1" <?php echo $_checked ?> onclick="toggleValueElements(this, this.parentNode);" class="checkbox" <?php echo $_readonly;?>/> - <label for="inventory_use_config_notify_stock_qty" class="normal"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Use Config Settings') ?></label> - <?php if (!$this->isReadonly()):?><script type="text/javascript">toggleValueElements($('inventory_use_config_notify_stock_qty'), $('inventory_use_config_notify_stock_qty').parentNode);</script><?php endif; ?></td> - <?php if (!Mage::app()->isSingleStoreMode()): ?> - <td class="value scope-label"><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('[GLOBAL]') ?></td> - <?php endif; ?> - </tr> -<?php endif; ?> - <tr> - <td class="label"><label for="inventory_enable_qty_increments"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Enable Qty Increments') ?></label></td> - <td class="value"><select id="inventory_enable_qty_increments" name="<?php echo $this->getFieldSuffix() ?>[stock_data][enable_qty_increments]" class="select" <?php echo $_readonly;?>> - <option value="1"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Yes') ?></option> - <option value="0"<?php if ($this->getConfigFieldValue('enable_qty_increments') == 0): ?> selected="selected"<?php endif; ?>><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('No') ?></option> - </select> - <input type="hidden" id="inventory_enable_qty_increments_default" value="<?php echo $this->getDefaultConfigValue('enable_qty_increments'); ?>" /> + <?php endif; ?> +<div class="field"> + <label class="label" for="inventory_enable_qty_increments"> + <span><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Enable Qty Increments') ?></span> + </label> + <div class="control"> + <select id="inventory_enable_qty_increments" name="<?php echo $this->getFieldSuffix() ?>[stock_data][enable_qty_increments]" <?php echo $_readonly;?>> + <option value="1"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Yes') ?></option> + <option value="0"<?php if ($this->getConfigFieldValue('enable_qty_increments') == 0): ?> selected="selected"<?php endif; ?>><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('No') ?></option> + </select> + <input type="hidden" id="inventory_enable_qty_increments_default" value="<?php echo $this->getDefaultConfigValue('enable_qty_increments'); ?>"> + <?php $_checked = ($this->getFieldValue('use_config_enable_qty_inc') || $this->IsNew()) ? 'checked="checked"' : '' ?> + <input type="checkbox" id="inventory_use_config_enable_qty_increments" name="<?php echo $this->getFieldSuffix() ?>[stock_data][use_config_enable_qty_increments]" value="1" <?php echo $_checked ?> onclick="toggleValueElements(this, this.parentNode);" <?php echo $_readonly;?>> + <label for="inventory_use_config_enable_qty_increments"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Use Config Settings') ?></label> + <?php if (!$this->isReadonly()): ?> + <script type="text/javascript">toggleValueElements($('inventory_use_config_enable_qty_increments'), $('inventory_use_config_enable_qty_increments').parentNode);</script> + <?php endif; ?> + </div> + <?php if (!Mage::app()->isSingleStoreMode()): ?> + <div class="field-service"><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('[GLOBAL]') ?></div> + <?php endif; ?> +</div> - <?php $_checked = ($this->getFieldValue('use_config_enable_qty_inc') || $this->IsNew()) ? 'checked="checked"' : '' ?> - <input type="checkbox" id="inventory_use_config_enable_qty_increments" name="<?php echo $this->getFieldSuffix() ?>[stock_data][use_config_enable_qty_increments]" value="1" <?php echo $_checked ?> onclick="toggleValueElements(this, this.parentNode);" class="checkbox" <?php echo $_readonly;?>/> - <label for="inventory_use_config_enable_qty_increments" class="normal"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Use Config Settings') ?></label> - <?php if (!$this->isReadonly()):?><script type="text/javascript">toggleValueElements($('inventory_use_config_enable_qty_increments'), $('inventory_use_config_enable_qty_increments').parentNode);</script><?php endif; ?></td> - <?php if (!Mage::app()->isSingleStoreMode()): ?> - <td class="value scope-label"><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('[GLOBAL]') ?></td> - <?php endif; ?> - </tr> - <tr> - <td class="label"><label for="inventory_qty_increments"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Qty Increments') ?></label></td> - <td class="value"> - <input type="text" class="input-text validate-digits" id="inventory_qty_increments" name="<?php echo $this->getFieldSuffix() ?>[stock_data][qty_increments]" value="<?php echo $this->getFieldValue('qty_increments')*1 ?>" <?php echo $_readonly;?>/> - <?php $_checked = ($this->getFieldValue('use_config_qty_increments') || $this->IsNew()) ? 'checked="checked"' : '' ?> - <input type="checkbox" id="inventory_use_config_qty_increments" name="<?php echo $this->getFieldSuffix() ?>[stock_data][use_config_qty_increments]" value="1" <?php echo $_checked ?> onclick="toggleValueElements(this, this.parentNode);" class="checkbox" <?php echo $_readonly;?>/> - <label for="inventory_use_config_qty_increments" class="normal"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Use Config Settings') ?></label> - <?php if (!$this->isReadonly()):?><script type="text/javascript">toggleValueElements($('inventory_use_config_qty_increments'), $('inventory_use_config_qty_increments').parentNode);</script><?php endif; ?></td> - <?php if (!Mage::app()->isSingleStoreMode()): ?> - <td class="value scope-label"><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('[GLOBAL]') ?></td> - <?php endif; ?> - </tr> - <tr> - <td class="label"><label for="inventory_stock_availability"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Stock Availability') ?></label></td> - <td class="value"><select id="inventory_stock_availability" name="<?php echo $this->getFieldSuffix() ?>[stock_data][is_in_stock]" class="select" <?php echo $_readonly;?>> +<div class="field"> + <label class="label" for="inventory_qty_increments"> + <span><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Qty Increments') ?></span> + </label> + <div class="control"> + <input type="text" class="input-text validate-digits" id="inventory_qty_increments" name="<?php echo $this->getFieldSuffix() ?>[stock_data][qty_increments]" value="<?php echo $this->getFieldValue('qty_increments') * 1 ?>" <?php echo $_readonly;?>> + <?php $_checked = ($this->getFieldValue('use_config_qty_increments') || $this->IsNew()) ? 'checked="checked"' : '' ?> + <input type="checkbox" id="inventory_use_config_qty_increments" name="<?php echo $this->getFieldSuffix() ?>[stock_data][use_config_qty_increments]" value="1" <?php echo $_checked ?> onclick="toggleValueElements(this, this.parentNode);" <?php echo $_readonly;?>> + <label for="inventory_use_config_qty_increments"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Use Config Settings') ?></label> + <?php if (!$this->isReadonly()): ?> + <script type="text/javascript">toggleValueElements($('inventory_use_config_qty_increments'), $('inventory_use_config_qty_increments').parentNode);</script> + <?php endif; ?> + </div> + <?php if (!Mage::app()->isSingleStoreMode()): ?> + <div class="field-service"><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('[GLOBAL]') ?></div> + <?php endif; ?> +</div> + +<div class="field"> + <label class="label" for="inventory_stock_availability"> + <span><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Stock Availability') ?></span> + </label> + <div class="control"> + <select id="inventory_stock_availability" name="<?php echo $this->getFieldSuffix() ?>[stock_data][is_in_stock]" <?php echo $_readonly;?>> <?php foreach ($this->getStockOption() as $option): ?> - <?php $_selected = ($option['value'] == $this->getFieldValue('is_in_stock')) ? 'selected="selected"' : '' ?> - <option value="<?php echo $option['value'] ?>" <?php echo $_selected ?>><?php echo $option['label'] ?></option> + <?php $_selected = ($option['value'] == $this->getFieldValue('is_in_stock')) ? 'selected="selected"' : '' ?> + <option value="<?php echo $option['value'] ?>" <?php echo $_selected ?>><?php echo $option['label'] ?></option> <?php endforeach; ?> - </select> - </td> - <?php if (!Mage::app()->isSingleStoreMode()): ?> - <td class="value scope-label"><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('[GLOBAL]') ?></td> - <?php endif; ?> - </tr> - </table> - </fieldset> + </select> + </div> + <?php if (!Mage::app()->isSingleStoreMode()): ?> + <div class="field-service"><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('[GLOBAL]') ?></div> + <?php endif; ?> </div> +</div> +</fieldset> + <script type="text/javascript"> -//<![CDATA[ + //<![CDATA[ function changeManageStockOption() { var manageStock = $('inventory_use_config_manage_stock').checked - ? $('inventory_manage_stock_default').value - : $('inventory_manage_stock').value; + ? $('inventory_manage_stock_default').value + : $('inventory_manage_stock').value; var catalogInventoryNotManageStockFields = { inventory_min_sale_qty: true, inventory_max_sale_qty: true, @@ -244,8 +296,8 @@ function applyEnableQtyIncrements() { var enableQtyIncrements = $('inventory_use_config_enable_qty_increments').checked - ? $('inventory_enable_qty_increments_default').value - : $('inventory_enable_qty_increments').value; + ? $('inventory_enable_qty_increments_default').value + : $('inventory_enable_qty_increments').value; $('inventory_qty_increments').up('tr')[enableQtyIncrements == 1 ? 'show' : 'hide'](); } @@ -284,5 +336,5 @@ applyEnableDecimalDivided(); } }); -//]]> + //]]> </script> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/customer/edit/tab/account/form/renderer/group.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/customer/edit/tab/account/form/renderer/group.phtml index 0c58f7fce3732ef03dfb040d6970fcc00f0c82c7..9ab1096c7a9e0f01942f3a30b8a9aced35d9886a 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/customer/edit/tab/account/form/renderer/group.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/customer/edit/tab/account/form/renderer/group.phtml @@ -27,26 +27,28 @@ <?php $_element = $this->getElement(); $_note = $_element->getNote(); -$_trId = $_element->getHtmlContainerId(); -$_class = $_element->getFieldsetHtmlClass(); -?> +$_class = $_element->getFieldsetHtmlClass();?> + <?php if (!$_element->getNoDisplay()): ?> -<tr<?php if ($_trId): ?> id="<?php echo $_trId; ?>"<?php endif; ?>> - <?php if ($_element->getType() == 'hidden'): ?> - <td colspan="2" class="hidden"><?php echo trim($_element->getElementHtml()); ?></td> - <?php else: ?> - <td class="label<?php echo $_class ? " {$_class}-label" : ''; ?>"><?php echo trim($_element->getLabelHtml()); ?></td> - <td class="<?php echo $_element->hasValueClass() ? $_element->getValueClass() : 'value'; ?><?php echo $_class ? " {$_class}-value" : ''; ?>"> - <?php echo trim($_element->getElementHtml()); ?> - <?php if ($this->getDisableAutoGroupChangeAttribute()): ?> - <br/> - <input id="<?php echo $this->escapeHtml($this->getDisableAutoGroupChangeCheckboxElementId()); ?>" name="<?php echo $this->escapeHtml($this->getDisableAutoGroupChangeCheckboxElementName()); ?>" type="checkbox"<?php if ($this->getDisableAutoGroupChangeCheckboxState() == 'checked') :?> checked="checked"<?php endif; ?> value="1"/> - <label for="<?php echo $this->escapeHtml($this->getDisableAutoGroupChangeCheckboxElementId()); ?>"><?php echo $this->escapeHtml($this->getDisableAutoGroupChangeCheckboxLabel()); ?></label> + <div class="field with-note"> + <?php if ($_element->getType() == 'hidden'): ?> + <div class="hidden"><?php echo $_element->getElementHtml(); ?></div> + <?php else: ?> + <?php echo $_element->getLabelHtml(); ?> + <div class="control"> + <?php echo $_element->getElementHtml(); ?> + <?php if ($this->getDisableAutoGroupChangeAttribute()): ?> + <div class="nested"> + <div class="field choice"> + <input id="<?php echo $this->escapeHtml($this->getDisableAutoGroupChangeCheckboxElementId()); ?>" name="<?php echo $this->escapeHtml($this->getDisableAutoGroupChangeCheckboxElementName()); ?>" type="checkbox" <?php if ($this->getDisableAutoGroupChangeCheckboxState() == 'checked') :?> checked="checked"<?php endif; ?> value="1" class="addbefore" /> + <label for="<?php echo $this->escapeHtml($this->getDisableAutoGroupChangeCheckboxElementId()); ?>"><span><?php echo $this->escapeHtml($this->getDisableAutoGroupChangeCheckboxLabel()); ?></span></label> + <?php if ($_note): ?> + <p class="note <?php echo $_class ? " {$_class}-note" : ''; ?>" id="note_<?php echo $_element->getId(); ?>"><?php echo $_note; ?></p> + <?php endif ?> + </div> + </div> + <?php endif; ?> + </div> <?php endif; ?> - <?php if ($_note): ?> - <p class="note<?php echo $_class ? " {$_class}-note" : ''; ?>" id="note_<?php echo $_element->getId(); ?>"><span><?php echo $_note; ?></span></p> - <?php endif ?> - </td> - <?php endif; ?> -</tr> + </div> <?php endif; ?> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/customer/online.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/customer/online.phtml index d978a17da7ca26cf8eb23f2d42b77463407758c9..75f3b898ba5d109a9b669a032385e228c60265ed 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/customer/online.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/customer/online.phtml @@ -24,11 +24,4 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td><h3 class="icon-head head-online-visitors"><?php echo Mage::helper('Mage_Customer_Helper_Data')->__('Online Customers') ?></h3></td> - </tr> - </table> -</div> <?php echo $this->getChildHtml('grid') ?> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/customer/sales/order/create/address/form/renderer/vat.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/customer/sales/order/create/address/form/renderer/vat.phtml index 0c6eabb6a3d524736692a7012457ebfae4dc9a58..fe859a3106f783ca79029c6ace0fedccc5f919d5 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/customer/sales/order/create/address/form/renderer/vat.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/customer/sales/order/create/address/form/renderer/vat.phtml @@ -27,26 +27,26 @@ <?php $_element = $this->getElement(); $_note = $_element->getNote(); -$_trId = $_element->getHtmlContainerId(); $_class = $_element->getFieldsetHtmlClass(); $_validateButton = $this->getValidateButton(); ?> <?php if (!$_element->getNoDisplay()): ?> -<tr<?php if($_trId): ?> id="<?php echo $_trId; ?>"<?php endif; ?>> +<div class="field field-vat-number"> <?php if ($_element->getType()=='hidden'): ?> - <td colspan="2" class="hidden"><?php echo trim($_element->getElementHtml()); ?></td> + <div class="hidden"><?php echo $_element->getElementHtml(); ?></div> <?php else: ?> - <td class="label<?php echo $_class ? " {$_class}-label" : ''?>"><?php echo trim($_element->getLabelHtml()); ?></td> - <td class="<?php echo $_element->hasValueClass() ? $_element->getValueClass() : 'value'; ?><?php echo $_class ? " {$_class}-value" : ''; ?>"> - <?php echo trim($_element->getElementHtml()); ?> + <?php echo $_element->getLabelHtml(); ?> + <div class="control <?php echo $_element->hasValueClass() ? $_element->getValueClass() : 'value'; ?><?php echo $_class ? " {$_class}-value" : ''; ?>"> + <?php echo $_element->getElementHtml(); ?> <?php if ($_note): ?> - <p class="note<?php echo $_class ? " {$_class}-note" : ''; ?>" id="note_<?php echo $_element->getId(); ?>"><span><?php echo $_note; ?></span></p> + <div class="note<?php echo $_class ? " {$_class}-note" : ''; ?>" id="note_<?php echo $_element->getId(); ?>"> + <span><?php echo $_note; ?></span> + </div> <?php endif; ?> - <div class="validate-vat"> + <div class="actions"> <?php echo $_validateButton->toHtml(); ?> </div> - </td> + </div> <?php endif; ?> - -</tr> +</div> <?php endif; ?> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/customer/system/config/validatevat.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/customer/system/config/validatevat.phtml index 02bd36fa951364524928e74ba4b3f22ae007e938..d513f6de1eefe18c48839ab6338442bf4130181e 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/customer/system/config/validatevat.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/customer/system/config/validatevat.phtml @@ -35,8 +35,8 @@ var elem = $('<?php echo $this->getHtmlId() ?>'); params = { - country: $('general_store_information_merchant_country').value, - vat: $('general_store_information_merchant_vat_number').value + country: $('<?php echo $this->getMerchantCountryField(); ?>').value, + vat: $('<?php echo $this->getMerchantVatNumberField(); ?>').value }; new Ajax.Request('<?php echo $this->getAjaxUrl() ?>', { @@ -60,6 +60,8 @@ } //]]> </script> -<button onclick="javascript:validateVat(); return false;" class="scalable" type="button" id="<?php echo $this->getHtmlId() ?>"> - <span id="validation_result"><?php echo $this->escapeHtml($this->getButtonLabel()) ?></span> -</button> +<div class="actions actions-validate-vat"> + <button onclick="javascript:validateVat(); return false;" class="scalable" type="button" id="<?php echo $this->getHtmlId() ?>"> + <span id="validation_result"><?php echo $this->escapeHtml($this->getButtonLabel()) ?></span> + </button> +</div> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/customer/tab/addresses.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/customer/tab/addresses.phtml index 3c3ca0ba97ce72cb789ae7c2feea336ca9eb217a..220b0a29561017f0d101a143a2adce5d71d7b4c4 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/customer/tab/addresses.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/customer/tab/addresses.phtml @@ -25,6 +25,8 @@ */ ?> <!-- Addresses list --> +<div class="fieldset-wrapper"> + <table cellspacing="0" class="form-edit"> <tr> <td class="address-list"> @@ -638,3 +640,4 @@ customerAddresses = new addressesModel(); </td> </tr> </table> +</div> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/customer/tab/view.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/customer/tab/view.phtml index dcd1ecafdc47fa4ca250b64eedf6e9eea96d7aae..82f565cd3ed6d081b4245b7345c860c23d8f0f78 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/customer/tab/view.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/customer/tab/view.phtml @@ -36,47 +36,51 @@ $lastLoginDateStore = $this->getStoreLastLoginDate(); $createDateAdmin = $this->getCreateDate(); $createDateStore = $this->getStoreCreateDate(); ?> -<div class="entry-edit"> - <div class="entry-edit-head"><h4 class="icon-head head-customer-view"><?php echo Mage::helper('Mage_Customer_Helper_Data')->__('Personal Information') ?></h4></div> - <fieldset> - <table cellspacing="2" class="box-left"> - <tr> - <td><strong><?php echo $this->__('Last Logged In:') ?></strong></td> - <td><?php echo $lastLoginDateAdmin ?> (<?php echo $this->getCurrentStatus() ?>)</td> - </tr> - <?php if ($lastLoginDateAdmin != $lastLoginDateStore): ?> - <tr> - <td><strong><?php echo $this->__('Last Logged In (%s):', $this->getStoreLastLoginDateTimezone()) ?></strong></td> - <td><?php echo $lastLoginDateStore ?> (<?php echo $this->getCurrentStatus() ?>)</td> - </tr> - <?php endif; ?> - <tr> - <td><strong><?php echo $this->__('Confirmed email:') ?></strong></td> - <td><?php echo $this->getIsConfirmedStatus() ?></td> - </tr> - <tr> - <td><strong><?php echo $this->__('Account Created on:') ?></strong></td> - <td><?php echo $createDateAdmin ?></td> - </tr> - <?php if ($createDateAdmin != $createDateStore): ?> - <tr> - <td><strong><?php echo $this->__('Account Created on (%s):', $this->getStoreCreateDateTimezone()) ?></strong></td> - <td><?php echo $createDateStore ?></td> - </tr> - <?php endif; ?> - <tr> - <td><strong><?php echo $this->__('Account Created in:') ?></strong></td> - <td><?php echo $this->getCreatedInStore() ?></td> - </tr> - <tr> - <td><strong><?php echo $this->__('Customer Group:') ?></strong></td> - <td><?php echo $this->getGroupName() ?></td> - </tr> - </table> - <address class="box-right"> - <strong><?php echo $this->__('Default Billing Address') ?></strong><br/> - <?php echo $this->getBillingAddressHtml() ?> - </address> - </fieldset> + +<div class="entry-edit fieldset-wrapper"> + + <div class="fieldset-wrapper-title"> + <span class="title"><?php echo Mage::helper('Mage_Customer_Helper_Data')->__('Personal Information') ?></span> + </div> + + <table cellspacing="2"> + <tr> + <td><strong><?php echo $this->__('Last Logged In:') ?></strong></td> + <td><?php echo $lastLoginDateAdmin ?> (<?php echo $this->getCurrentStatus() ?>)</td> + </tr> + <?php if ($lastLoginDateAdmin != $lastLoginDateStore): ?> + <tr> + <td><strong><?php echo $this->__('Last Logged In (%s):', $this->getStoreLastLoginDateTimezone()) ?></strong></td> + <td><?php echo $lastLoginDateStore ?> (<?php echo $this->getCurrentStatus() ?>)</td> + </tr> + <?php endif; ?> + <tr> + <td><strong><?php echo $this->__('Confirmed email:') ?></strong></td> + <td><?php echo $this->getIsConfirmedStatus() ?></td> + </tr> + <tr> + <td><strong><?php echo $this->__('Account Created on:') ?></strong></td> + <td><?php echo $createDateAdmin ?></td> + </tr> + <?php if ($createDateAdmin != $createDateStore): ?> + <tr> + <td><strong><?php echo $this->__('Account Created on (%s):', $this->getStoreCreateDateTimezone()) ?></strong></td> + <td><?php echo $createDateStore ?></td> + </tr> + <?php endif; ?> + <tr> + <td><strong><?php echo $this->__('Account Created in:') ?></strong></td> + <td><?php echo $this->getCreatedInStore() ?></td> + </tr> + <tr> + <td><strong><?php echo $this->__('Customer Group:') ?></strong></td> + <td><?php echo $this->getGroupName() ?></td> + </tr> + </table> + <address> + <strong><?php echo $this->__('Default Billing Address') ?></strong><br/> + <?php echo $this->getBillingAddressHtml() ?> + </address> + </div> <?php echo $this->getChildHtml('', true); ?> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/customer/tab/view/sales.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/customer/tab/view/sales.phtml index c603971c81d2166039d75de3cbb9b362db0630f2..69775c400f14e851b0fd954785e690b7fa49bc34 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/customer/tab/view/sales.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/customer/tab/view/sales.phtml @@ -24,8 +24,12 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="entry-edit"> - <div class="entry-edit-head"><h4 class="icon-head head-customer-sales-statistics"><?php echo Mage::helper('Mage_Customer_Helper_Data')->__('Sales Statistics') ?></h4></div> +<div class="entry-edit fieldset-wrapper"> + + <div class="fieldset-wrapper-title"> + <span class="title"><?php echo Mage::helper('Mage_Customer_Helper_Data')->__('Sales Statistics') ?></span> + </div> + <div class="grid"> <table cellspacing="0" class="data"> <thead> @@ -89,5 +93,3 @@ </table> </div> </div> -<div class="clear"></div> -<br/> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/dashboard/index.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/dashboard/index.phtml index bba2cc0db4ec7e60925d397091d0c8c9378d146b..4e28869cb3cc8eba67809e8c113024d2ea453900 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/dashboard/index.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/dashboard/index.phtml @@ -88,46 +88,39 @@ function toggleCal(id) { //]]> </script> <?php endif; ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td><h3 class="head-dashboard"><?php echo $this->__('Dashboard') ?></h3></td> - </tr> - </table> -</div> -<div class="dashboard-container"> - <?php echo $this->getChildHtml('store_switcher') ?> - <table cellspacing="25" width="100%"> - <tr> - <td><?php echo $this->getChildHtml('sales') ?> - <div class="entry-edit"> - <div class="entry-edit-head"><h4><?php echo $this->__('Last 5 Orders') ?></h4></div> - <fieldset class="np"><?php echo $this->getChildHtml('lastOrders'); ?></fieldset> +<!-- TODO: redesign dashboard --> + <div class="dashboard-container columns col-2-left-layout"> + <div class="columns-content"> + <div class="main-col"> + <?php echo $this->getChildHtml('store_switcher') ?> + <div class="entry-edit" style="border:1px solid #ccc;"> + <?php echo $this->getChildHtml('diagrams') ?> + <?php if (is_array($this->getChildBlock('diagrams')->getTabsIds())) : ?> + <div id="diagram_tab_content"></div> + <?php endif; ?> + <div style="margin:20px;"> + <?php echo $this->getChildHtml('totals') ?> </div> - <div class="entry-edit"> - <div class="entry-edit-head"><h4><?php echo $this->__('Last 5 Search Terms') ?></h4></div> - <fieldset class="np"><?php echo $this->getChildHtml('lastSearches'); ?></fieldset> + <div style="margin:20px;"> + <?php echo $this->getChildHtml('grids') ?> + <div id="grid_tab_content"></div> </div> - <div class="entry-edit"> - <div class="entry-edit-head"><h4><?php echo $this->__('Top 5 Search Terms') ?></h4></div> - <fieldset class="np"><?php echo $this->getChildHtml('topSearches'); ?></fieldset> - </div> - </td> - <td> - <div class="entry-edit" style="border:1px solid #ccc;"> - <?php echo $this->getChildHtml('diagrams') ?> - <?php if (is_array($this->getChildBlock('diagrams')->getTabsIds())) : ?> - <div id="diagram_tab_content"></div> - <?php endif; ?> - <div style="margin:20px;"> - <?php echo $this->getChildHtml('totals') ?> - </div> - <div style="margin:20px;"> - <?php echo $this->getChildHtml('grids') ?> - <div id="grid_tab_content"></div> - </div> - </div> - </td> - </tr> - </table> -</div> + </div> + </div> + <div class="side-col"> + <?php echo $this->getChildHtml('sales') ?> + <div class="entry-edit"> + <div class="entry-edit-head"><h4><?php echo $this->__('Last 5 Orders') ?></h4></div> + <fieldset class="np"><?php echo $this->getChildHtml('lastOrders'); ?></fieldset> + </div> + <div class="entry-edit"> + <div class="entry-edit-head"><h4><?php echo $this->__('Last 5 Search Terms') ?></h4></div> + <fieldset class="np"><?php echo $this->getChildHtml('lastSearches'); ?></fieldset> + </div> + <div class="entry-edit"> + <div class="entry-edit-head"><h4><?php echo $this->__('Top 5 Search Terms') ?></h4></div> + <fieldset class="np"><?php echo $this->getChildHtml('topSearches'); ?></fieldset> + </div> + </div> + </div> + </div> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/main.xml b/app/code/core/Mage/Adminhtml/view/adminhtml/main.xml index ff9a18fb391ab377aa73cef8a7f03211f9a79464..3d16204850474e6df511b18f6d8e6948bc2ca3d4 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/main.xml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/main.xml @@ -61,6 +61,7 @@ Supported layout update handles (special): <action method="addJs"><file>head.load.min.js</file></action> <action method="addJs"><file>mage/mage.js</file></action> <action method="addJs"><file>jquery/jquery.tmpl.min.js</file></action> + <action method="addJs"><file>jquery/jquery.hoverIntent.js</file></action> <action method="addJs"><file>mage/translate.js</file></action> <action method="addJs"><file>mage/backend/bootstrap.js</file></action> <action method="addJs"><file>mage/backend/floating-header.js</file></action> @@ -123,6 +124,13 @@ Supported layout update handles (special): <!-- deprecated since 1.7.0.0 see Mage_Page_Block_Js_Translate --> <block type="Mage_Page_Block_Js_Translate" name="js_translate" as="js_translate" template="Mage_Adminhtml::page/js/translate.phtml"/> + <container name="main-top" label="main-top" as="main-top"> + <block name="page-title" type="Mage_Page_Block_Html_Title" template="title.phtml" > + <!-- + <action method="setPageTitle" translate=""><value>Example title set from layout</value></action> + --> + </block> + </container> <container name="left" as="left" label="Left Column"/> <container name="content" as="content" label="Content"/> <block type="Mage_Core_Block_Messages" name="messages" as="messages"/> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/newsletter/preview/iframeswitcher.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/newsletter/preview/iframeswitcher.phtml index b0d4d9bcb59a2d31dcf731e92aad25499aa91b79..74d7a10b0faa4e68b5b7131c15dcde938cc4255a 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/newsletter/preview/iframeswitcher.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/newsletter/preview/iframeswitcher.phtml @@ -48,14 +48,10 @@ <iframe name="preview_iframe" id="preview_iframe" frameborder="0"></iframe> <?php echo $this->getChildHtml('preview_form'); ?> </div> -<div id="loading-mask" style="display:none"> - <p class="loader" id="loading_mask_loader"><img src="<?php echo $this->getViewFileUrl('images/ajax-loader-tr.gif') ?>" alt="<?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('Loading...') ?>"/><br/><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('Please wait...') ?></p> -</div> <script type="text/javascript"> //<![CDATA[ var previewForm = $('preview_form'); -var loadingMask = $('loading-mask'); var previewIframe = $('preview_iframe'); function preview() { @@ -65,22 +61,13 @@ function preview() { } function blockPreview() { - var cumulativeOffset = $('preview').cumulativeOffset(); - $('loading-mask').setStyle({ - top: ( cumulativeOffset.top ) + 'px', - left: ( cumulativeOffset.left ) + 'px', - width: $('preview').getWidth() + 'px', - height: $('preview').getHeight() + 'px' + $('body').loadingPopup({ + timeout: false }); - - toggleSelectsUnderBlock($('loading-mask'), false); - Element.show('loading-mask'); - setLoaderPosition(); } function unBlockPreview() { - toggleSelectsUnderBlock(loadingMask, true); - Element.hide(loadingMask); + jQuery('body').trigger('hideLoadingPopup'); } Event.observe(window, 'load', preview); diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/newsletter/problem/list.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/newsletter/problem/list.phtml index c8afe2e6ffd1cf5505ef9cdf7ba15bccd60c272e..46fe9fa9b25432e0628cc1911088903a73c4e820 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/newsletter/problem/list.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/newsletter/problem/list.phtml @@ -24,45 +24,34 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td style="width:50%;"><h3 class="icon-head head-newsletter-report"><?php echo Mage::helper('Mage_Newsletter_Helper_Data')->__('Newsletter Problem Reports') ?></h3></td> - <td class="form-buttons"> +<?php echo $this->getChildHtml('grid') ?> - </td> - </tr> - </table> -</div> -<div> - <?php echo $this->getChildHtml('grid') ?> -</div> -<?php if($this->getShowButtons()): ?> +<?php if ($this->getShowButtons()): ?> <div class="form-buttons"> <?php echo $this->getUnsubscribeButtonHtml(); ?> <?php echo $this->getDeleteButtonHtml(); ?> </div> <?php endif ?> <script type="text/javascript"> -<!-- + <!-- var problemController = { - checkCheckboxes: function(controlCheckbox) { + checkCheckboxes:function (controlCheckbox) { var elements = $('problemGrid').getElementsByClassName('problemCheckbox'); - elements.each(function(obj){ + elements.each(function (obj) { obj.checked = controlCheckbox.checked; }); }, - rowClick: function (e) { - if(!Event.element(e).hasClassName('problemCheckbox')) { + rowClick:function (e) { + if (!Event.element(e).hasClassName('problemCheckbox')) { var elements = Event.findElement(e, 'tr').getElementsByClassName('problemCheckbox'); - if(elements.length != 1) { + if (elements.length != 1) { return; } elements[0].checked = !elements[0].checked; } }, - unsubscribe: function () { + unsubscribe:function () { var elements = $$('input.problemCheckbox'); var serializedElements = Form.serializeElements(elements, true); serializedElements._unsubscribe = '1'; @@ -70,12 +59,12 @@ var url = problemGridJsObject.url; new Ajax.Updater('problemGrid', url + '?ajax=1', - {parameters: serializedElements, - evalScripts: true, - onComplete:problemGridJsObject.initGrid.bind(problemGridJsObject)}); + {parameters:serializedElements, + evalScripts:true, + onComplete:problemGridJsObject.initGrid.bind(problemGridJsObject)}); }, - deleteSelected: function () { + deleteSelected:function () { var elements = $$('input.problemCheckbox'); var serializedElements = Form.serializeElements(elements, true); serializedElements._delete = '1'; @@ -83,12 +72,12 @@ var url = problemGridJsObject.url; new Ajax.Updater('problemGrid', url + '?ajax=1', - {parameters: serializedElements, - evalScripts: true, - onComplete:problemGridJsObject.initGrid.bind(problemGridJsObject)}); + {parameters:serializedElements, + evalScripts:true, + onComplete:problemGridJsObject.initGrid.bind(problemGridJsObject)}); } } varienGlobalEvents.attachEventHandler('gridRowClick', problemController.rowClick.bind(problemController)); -//--> + //--> </script> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/newsletter/queue/edit.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/newsletter/queue/edit.phtml index 1ebbe7102828bf75ef39942f880946179767ba14..ab59cba44c760a24390a22815a120930476132b8 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/newsletter/queue/edit.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/newsletter/queue/edit.phtml @@ -25,24 +25,18 @@ */ /* @var $this Mage_Adminhtml_Block_Newsletter_Queue_Edit */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td><h3><?php echo $this->getHeaderText() ?></h3></td> - <td class="form-buttons"> - <?php echo $this->getBackButtonHtml() ?> - <?php echo $this->getPreviewButtonHtml(); ?> - <?php if(!$this->getIsPreview()): ?> - <?php echo $this->getResetButtonHtml() ?> - <?php echo $this->getSaveButtonHtml() ?> - <?php endif ?> - <?php if($this->getCanResume()): ?> - <?php echo $this->getResumeButtonHtml() ?> - <?php endif ?> - </td> - </tr> - </table> +<div class="page-actions"> + <?php echo $this->getBackButtonHtml() ?> + <?php echo $this->getPreviewButtonHtml(); ?> + <?php if(!$this->getIsPreview()): ?> + <?php echo $this->getResetButtonHtml() ?> + <?php echo $this->getSaveButtonHtml() ?> + <?php endif ?> + <?php if($this->getCanResume()): ?> + <?php echo $this->getResumeButtonHtml() ?> + <?php endif ?> </div> + <form action="<?php echo $this->getSaveUrl() ?>" method="post" id="queue_edit_form"> <?php echo $this->getBlockHtml('formkey')?> <?php echo $this->getChildHtml('form') ?> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/newsletter/subscriber/list.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/newsletter/subscriber/list.phtml index 8162b17c6ec9539f3ba645582a659a582cf5c485..86b382a3e4ec14b8f2b1fe6ad7d85af1302fc04d 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/newsletter/subscriber/list.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/newsletter/subscriber/list.phtml @@ -24,16 +24,7 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td style="width:50%;"><h3><?php echo Mage::helper('Mage_Newsletter_Helper_Data')->__('Newsletter Subscribers') ?></h3></td> - </tr> - </table> -</div> -<div> - <?php echo $this->getChildHtml('grid') ?> -</div> +<?php echo $this->getChildHtml('grid') ?> <?php if(count($this->getQueueAsOptions())>0 && $this->getShowQueueAdd()): ?> <div class="form-buttons"> <select id="queueList" name="queue"> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/newsletter/template/edit.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/newsletter/template/edit.phtml index 5210ceb5748988da015abbf438a24d7d918fa4e8..9f3b19ba9c49413a1a6a2e4bcceed7d986a526cf 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/newsletter/template/edit.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/newsletter/template/edit.phtml @@ -25,24 +25,21 @@ */ /* @var $this Mage_Adminhtml_Block_Newsletter_Template_Edit */ ?> -<div class="content-header"> - <h3 class="icon-head head-newsletter-list"><?php echo $this->getHeaderText() ?></h3> - <p class="content-buttons form-buttons"> - <?php echo $this->getBackButtonHtml(); ?> - <?php echo $this->getResetButtonHtml(); ?> - <?php if(!$this->isTextType()): ?> - <?php echo $this->getToPlainButtonHtml(); ?> - <?php echo $this->getToHtmlButtonHtml(); ?> - <?php endif ?> - <?php echo $this->getPreviewButtonHtml(); ?> - <?php if($this->getEditMode()): ?> - <?php echo $this->getDeleteButtonHtml(); ?> - <?php endif ?> - <?php if($this->getEditMode()): ?> - <?php echo $this->getSaveAsButtonHtml(); ?> - <?php endif ?> - <?php echo $this->getSaveButtonHtml(); ?> - </p> +<div class="page-actions"> + <?php echo $this->getBackButtonHtml(); ?> + <?php echo $this->getResetButtonHtml(); ?> + <?php if(!$this->isTextType()): ?> + <?php echo $this->getToPlainButtonHtml(); ?> + <?php echo $this->getToHtmlButtonHtml(); ?> + <?php endif ?> + <?php echo $this->getPreviewButtonHtml(); ?> + <?php if($this->getEditMode()): ?> + <?php echo $this->getDeleteButtonHtml(); ?> + <?php endif ?> + <?php if($this->getEditMode()): ?> + <?php echo $this->getSaveAsButtonHtml(); ?> + <?php endif ?> + <?php echo $this->getSaveButtonHtml(); ?> </div> <form action="<?php echo $this->getSaveUrl() ?>" method="post" id="newsletter_template_edit_form"> <?php echo $this->getBlockHtml('formkey')?> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/newsletter/template/list.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/newsletter/template/list.phtml index 0480788fb1e90c5237417f9c0689616342aca307..597bc5b214a997e3a1a71f4edb1fb6c32c5fd519 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/newsletter/template/list.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/newsletter/template/list.phtml @@ -24,16 +24,9 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td style="width:50%;"><h3 class="icon-head head-newsletter-list"><?php echo $this->getHeaderText() ?></h3></td> - <td class="form-buttons"> - <button class="scalable add" onclick="window.location='<?php echo $this->getCreateUrl() ?>'"><span><span><span><?php echo Mage::helper('Mage_Newsletter_Helper_Data')->__('Add New Template'); ?></span></span></span></button> - </td> - </tr> - </table> -</div> -<div> - <?php echo $this->getChildHtml('grid') ?> +<div class="page-actions"> + <button class="scalable add" onclick="window.location='<?php echo $this->getCreateUrl() ?>'"> + <?php echo Mage::helper('Mage_Newsletter_Helper_Data')->__('Add New Template'); ?> + </button> </div> +<?php echo $this->getChildHtml('grid') ?> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/notification/baseurl.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/notification/baseurl.phtml index ef5a21c7abcfc0dd4f65d22fcb318808e156602e..ebff7bf992d5d90db553adf344af7fb19b3b5225 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/notification/baseurl.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/notification/baseurl.phtml @@ -29,7 +29,11 @@ ?> <?php $_url = $this->getConfigUrl()?> <?php if ($_url): ?> -<div class="notification-global notification-global-notice"> - <?php echo $this->helper('Mage_Adminhtml_Helper_Data')->__('{{base_url}} is not recommended to use in a production environment to declare the Base Unsecure URL / Base Secure URL. It is highly recommended to change this value in your Magento <a href="%s">configuration</a>.', $_url)?> +<div class="message message-system"> + <div class="message-inner"> + <div class="message-content"> + <?php echo $this->helper('Mage_Adminhtml_Helper_Data')->__('{{base_url}} is not recommended to use in a production environment to declare the Base Unsecure URL / Base Secure URL. It is highly recommended to change this value in your Magento <a href="%s">configuration</a>.', $_url)?> + </div> + </div> </div> <?php endif; ?> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/notification/security.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/notification/security.phtml index 70500f2eadb5507df74dc80fb956c105511d75e8..862357529acda6138bcb1a21891e1aa30d6ba6a5 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/notification/security.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/notification/security.phtml @@ -27,6 +27,10 @@ * @see Mage_Adminhtml_Block_Notification_Baseurl */ ?> -<div class="notification-global notification-global-notice"> - <?php echo $this->helper('Mage_Adminhtml_Helper_Data')->__('Your web server is configured incorrectly. As a result, configuration files with sensitive information are accessible from the outside. Please contact your hosting provider.')?> +<div class="message message-system"> + <div class="message-inner"> + <div class="message-content"> + <?php echo $this->helper('Mage_Adminhtml_Helper_Data')->__('Your web server is configured incorrectly. As a result, configuration files with sensitive information are accessible from the outside. Please contact your hosting provider.')?> + </div> + </div> </div> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/notification/survey.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/notification/survey.phtml index 28fe9790ec541dd4955cbc15f24c9e8ce7ed31f2..a5d4a3fc24d65296f33d27510b440ce0cf37250a 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/notification/survey.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/notification/survey.phtml @@ -49,8 +49,11 @@ }); } </script> - <div id="survey_notification" class="notification-global notification-global-notice"> - <?php echo $this->helper('Mage_Adminhtml_Helper_Data')->__('We appreciate our merchants\' feedback, please <a href="#" onclick="surveyAction(\'yes\'); return false;">take our survey</a> to provide insight on the features you would like included in Magento. <a href="#" onclick="surveyAction(\'no\'); return false;">Remove this notification</a>') ?> - + <div id="survey_notification" class="message message-system"> + <div class="message-inner"> + <div class="message-content"> + <?php echo $this->helper('Mage_Adminhtml_Helper_Data')->__('We appreciate our merchants\' feedback, please <a href="#" onclick="surveyAction(\'yes\'); return false;">take our survey</a> to provide insight on the features you would like included in Magento. <a href="#" onclick="surveyAction(\'no\'); return false;">Remove this notification</a>') ?> + </div> + </div> </div> <?php endif; ?> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/notification/toolbar.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/notification/toolbar.phtml index 56c60e63a3085d4a3b3b62029f3745ada866b076..4e8e8cf25acd7c919e6fa77db4fd38bb11ff3f9b 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/notification/toolbar.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/notification/toolbar.phtml @@ -30,54 +30,58 @@ */ ?> <?php if ($this->isShow()): ?> -<div class="notification-global"> - <?php - $sParts = array(); +<div class="message message-system"> + <div class="message-inner"> + <div class="message-content"> + <?php + $sParts = array(); - if ($this->getCriticalCount()): - $sParts[] = '<span class="critical"><strong>'.$this->getCriticalCount().'</strong> '.$this->__('critical').'</span>'; - endif; + if ($this->getCriticalCount()): + $sParts[] = '<span class="critical"><strong>'.$this->getCriticalCount().'</strong> '.$this->__('critical').'</span>'; + endif; - if ($this->getMajorCount()): - $sParts[] = '<strong>'.$this->getMajorCount().'</strong> '.$this->__('major'); - endif; + if ($this->getMajorCount()): + $sParts[] = '<strong>'.$this->getMajorCount().'</strong> '.$this->__('major'); + endif; - if ($this->getMinorCount()): - $sParts[] = '<strong>'.$this->getMinorCount().'</strong> '.$this->__('minor'); - endif; + if ($this->getMinorCount()): + $sParts[] = '<strong>'.$this->getMinorCount().'</strong> '.$this->__('minor'); + endif; - if ($this->getNoticeCount()): - $sParts[] = '<strong>'.$this->getNoticeCount().'</strong> '.$this->__('notice'); - endif; + if ($this->getNoticeCount()): + $sParts[] = '<strong>'.$this->getNoticeCount().'</strong> '.$this->__('notice'); + endif; - $msgStats = ''; - $c = count($sParts); - for ($i = 0; $i < $c; $i++) { - $msgStats .= $sParts[$i] . ($i == $c-1 ? '' : ($i == $c-2 ? $this->__(' and ') : ', ')); - } + $msgStats = ''; + $c = count($sParts); + for ($i = 0; $i < $c; $i++) { + $msgStats .= $sParts[$i] . ($i == $c-1 ? '' : ($i == $c-2 ? $this->__(' and ') : ', ')); + } - $latestNoticeUrl = $this->getLatestNoticeUrl(); - ?> - <?php /* - <span class="f-right"><?php echo $this->__('You have %s unread message(s). <a href="%s">Go to messages inbox</a>.', $msgStats, $this->getNoticesInboxUrl());?></span> - */?> + $latestNoticeUrl = $this->getLatestNoticeUrl(); + ?> + <?php /* + <span class="f-right"><?php echo $this->__('You have %s unread message(s). <a href="%s">Go to messages inbox</a>.', $msgStats, $this->getNoticesInboxUrl());?></span> + */?> - <span class="f-right"> - <?php $goToBoxMessage = (!empty($latestNoticeUrl)) ? $this->__('Go to messages inbox') : $this->__('Go to notifications') ?> - <?php echo $this->__('You have %s unread message(s).', $msgStats) ?> <a href="<?php echo $this->getNoticesInboxUrl() ?>"><?php echo $goToBoxMessage ?></a> - </span> -<?php /* ********** temporary commented - <span class="f-right"><?php echo $this->__('You have %s, %s and %s unread messages. <a href="%s">Go to messages inbox</a>.', '<span class="critical"><strong>'.$this->getCriticalCount().'</strong> '.$this->__('critical').'</span>', '<strong>'.$this->getMajorCount().'</strong> '.$this->__('major'), '<strong>'.$this->getMinorCount().'</strong> '.$this->__('minor'), $this->getNoticesInboxUrl());?></span> -******** */?> - <?php if ($this->isMessageWindowAvailable()): ?> - <strong class="label clickable" onclick="openMessagePopup()"> - <?php else: ?> - <strong class="label"> - <?php endif; ?> + <span class="messages-inbox"> + <?php $goToBoxMessage = (!empty($latestNoticeUrl)) ? $this->__('Go to messages inbox') : $this->__('Go to notifications') ?> + <?php echo $this->__('You have %s unread message(s).', $msgStats) ?> <a href="<?php echo $this->getNoticesInboxUrl() ?>"><?php echo $goToBoxMessage ?></a> + </span> + <?php /* ********** temporary commented + <span class="f-right"><?php echo $this->__('You have %s, %s and %s unread messages. <a href="%s">Go to messages inbox</a>.', '<span class="critical"><strong>'.$this->getCriticalCount().'</strong> '.$this->__('critical').'</span>', '<strong>'.$this->getMajorCount().'</strong> '.$this->__('major'), '<strong>'.$this->getMinorCount().'</strong> '.$this->__('minor'), $this->getNoticesInboxUrl());?></span> + ******** */?> + <?php if ($this->isMessageWindowAvailable()): ?> + <strong class="clickable" onclick="openMessagePopup()"> + <?php else: ?> + <strong> + <?php endif; ?> - <?php echo $this->__('Latest Message:') ?></strong> <?php echo $this->getLatestNotice() ?> - <?php if (!empty($latestNoticeUrl)): ?> - <a href="<?php echo $this->escapeHtml($latestNoticeUrl) ?>" onclick="this.target='_blank';"><?php echo $this->__('Read details') ?></a> - <?php endif; ?> + <?php echo $this->__('Latest Message:') ?></strong> <?php echo $this->getLatestNotice() ?> + <?php if (!empty($latestNoticeUrl)): ?> + <a href="<?php echo $this->escapeHtml($latestNoticeUrl) ?>" onclick="this.target='_blank';"><?php echo $this->__('Read details') ?></a> + <?php endif; ?> + </div> + </div> </div> <?php endif; ?> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/notification/window.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/notification/window.phtml index dcb7f05987ad4b61f426011d92da3253ca814747..6d1b7a5f4c0c0d69587df1bedde69d754957a5a0 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/notification/window.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/notification/window.phtml @@ -30,48 +30,20 @@ */ ?> <?php if ($this->canShow()): ?> -<script type="text/javascript"> -//<![CDATA[ - var messagePopupClosed = false; - function openMessagePopup() { - var height = $('html-body').getHeight(); - $('message-popup-window-mask').setStyle({'height':height+'px'}); - toggleSelectsUnderBlock($('message-popup-window-mask'), false); - Element.show('message-popup-window-mask'); - $('message-popup-window').addClassName('show'); - } +<div class="fade"> + <div class="popup popup-<?php echo preg_replace('#[^a-z0-9]+#', '-', strtolower($this->getSeverityText())) ?>"> + <div class="popup-inner"> + <header class="popup-header"> + <h2 class="popup-title"><?php echo $this->getHeaderText(); ?></h2> + </header> + <div class="popup-content"> + <span><?php echo $this->getSeverityText();?></span> + <p class="message-text"><?php echo $this->getNoticeMessageText(); ?></p> - function closeMessagePopup() { - toggleSelectsUnderBlock($('message-popup-window-mask'), true); - Element.hide('message-popup-window-mask'); - $('message-popup-window').removeClassName('show'); - messagePopupClosed = true; - } - - Event.observe(window, 'load', openMessagePopup); - Event.observe(window, 'keyup', function(evt) { - if(messagePopupClosed) return; - var code; - if (evt.keyCode) code = evt.keyCode; - else if (evt.which) code = evt.which; - if (code == Event.KEY_ESC) { - closeMessagePopup(); - } - }); -//]]> -</script> -<div id="message-popup-window-mask" style="display:none;"></div> -<div id="message-popup-window" class="message-popup"> - <div class="message-popup-head"> - <a href="#" onclick="closeMessagePopup(); return false;" title="<?php echo $this->getCloseText(); ?>"><span><?php echo $this->getCloseText(); ?></span></a> - <h2><?php echo $this->getHeaderText(); ?></h2> - </div> - <div class="message-popup-content"> - <div class="message"> - <span class="message-icon message-<?php echo $this->getSeverityText();?>" style="background-image:url(<?php echo $this->getSeverityIconsUrl() ?>);"><?php echo $this->getSeverityText();?></span> - <p class="message-text"><?php echo $this->getNoticeMessageText(); ?></p> + <a href="<?php echo $this->getNoticeMessageUrl(); ?>" class="action-more"><?php echo $this->getReadDetailsText(); ?></a> + </div> + <span class="close" data-dismiss="popup" title="<?php echo $this->__('Close popup'); ?>"><?php echo $this->__('Close'); ?></span> </div> - <p class="read-more"><a href="<?php echo $this->getNoticeMessageUrl(); ?>" onclick="this.target='_blank';"><?php echo $this->getReadDetailsText(); ?></a></p> </div> </div> <?php endif; ?> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/page/footer.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/page/footer.phtml index 68a5805a6aca64243a514633ffe9243ed643584e..f4fbe887b374ad89ff674de1d54935666a44aa87 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/page/footer.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/page/footer.phtml @@ -24,24 +24,6 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<p class="bug-report"> - <a href="<?php echo $this->getBugreportUrl() ?>" id="footer_bug_tracking"><?php echo $this->__('Help Us Keep Magento Healthy - Report All Bugs') ?></a><br/> - <?php echo $this->__('Interface Locale: %s', $this->getLanguageSelect()) ?> -</p> -<p class="legality"> - <a href="http://www.magentocommerce.com" id="footer_connect"><?php echo $this->__('Connect with the Magento Community') ?></a><br/> - <img src="<?php echo $this->getSkinUrl('images/varien_logo.gif') ?>" class="v-middle" alt="" /> - <?php echo $this->__('Magento™ is a trademark of Magento Inc.<br/>Copyright © %s Magento Inc.', date('Y')) ?> -</p> + +<?php echo $this->__('Copyright © %s Magento Inc. All rights reserved.', date('Y')) ?> / <?php echo $this->__('Magento ver. %s', Mage::getVersion()) ?> -<script type="text/javascript"> - $('footer_bug_tracking').target = 'Varien_External'; - $('footer_connect').target = 'Varien_External'; - function setInterfaceLanguage(evt){ - var elem = Event.element(evt); - if(elem){ - setLocation('<?php echo $this->getChangeLocaleUrl() ?>locale/'+elem.value+'/<?php echo $this->getRefererParamName() ?>/<?php echo $this->getUrlForReferer() ?>'); - } - } - Event.observe('interface_locale', 'change', setInterfaceLanguage) -</script> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/page/header.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/page/header.phtml index 1e8a1039d64448b5e1fffa079e29e74c985a3d66..f40a9d1383e657ca872269da6a589c0ec0cde97f 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/page/header.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/page/header.phtml @@ -26,39 +26,96 @@ /** @var $this Mage_Adminhtml_Block_Page_Header */ ?> -<div class="header-top"> - <a href="<?php echo $this->getHomeLink() ?>"><img src="<?php echo $this->getViewFileUrl('images/logo.gif') ?>" alt="<?php echo $this->__('Magento Logo') ?>" class="logo"/></a> - <div class="header-right"> - <p class="super"> - <?php echo $this->__("Logged in as %s", $this->escapeHtml($this->getUser()->getUsername())) ?><span class="separator">|</span><?php echo $this->formatDate(null, 'full') ?><span class="separator">|</span><a href="http://golinks.magento.com/CE15" onclick="this.target='_blank'" class="go-try"><?php echo $this->__('Try Magento Go for Free') ?></a><span class="separator">|</span><a href="<?php echo $this->getLogoutLink() ?>" class="link-logout"><?php echo $this->__('Log Out') ?></a> - </p> - <?php if ( Mage::getSingleton('Mage_Core_Model_Authorization')->isAllowed('Mage_Adminhtml::global_search') ): ?> - <fieldset> - <legend>Search</legend> - <span id="global_search_indicator" class="autocomplete-indicator" style="display: none"> - <img src="<?php echo $this->getViewFileUrl('images/ajax-loader.gif') ?>" alt="<?php echo $this->__('Loading...') ?>" class="v-middle"/> - </span> - <?php $defSearch = $this->__('Global Record Search') ?> - <input id="global_search" name="query" type="text" class="input-text" value="<?php if(!empty($query)): ?><?php echo $query ?><?php else: ?><?php echo $defSearch ?><?php endif ?>" onfocus="if(this.value=='<?php echo $defSearch ?>')this.value=''; " onblur="if(this.value=='')this.value='<?php echo $defSearch ?>';" /> - <div id="global_search_autocomplete" class="autocomplete"></div> +<header class="header"> + <div class="header-inner"> + <a href="<?php echo $this->getHomeLink() ?>" class="logo" title="<?php echo $this->__('Magento Admin Panel') ?>"><span><?php echo $this->__('Magento Admin Panel') ?></span></a> + <div class="header-panel"> + <div class="account"> + <a href="<?php echo $this->getUrl('adminhtml/system_account/index') ?>" class="account-avatar" title="<?php echo $this->__('My Account') ?>" data-toggle="dropdown"> + <?php echo $this->escapeHtml($this->getUser()->getUsername()); ?> + </a> + <ul class="dropdown-menu"> + <li class="first"> + <a href="<?php echo $this->getUrl('adminhtml/system_account/index') ?>" title="<?php echo $this->__('Account Setting') ?>"><?php echo $this->__('Account Setting') ?></a> + <div><?php echo $this->escapeHtml($this->getUser()->getUsername()); ?></div> + </li> + <li class="last"> + <a href="<?php echo $this->getLogoutLink() ?>" class="account-signout" title="<?php echo $this->__('Sign Out') ?>"><?php echo $this->__('Sign Out') ?></a> + </li> + </ul> + </div> + <a href="<?php echo Mage::getBaseUrl(); ?>" title="<?php echo $this->__('Customer View'); ?>" target="_blank" class="store-front"><?php echo $this->__('Customer View'); ?></a> + <div class="notifications"> + <a href="<?php echo $this->getUrl('adminhtml/notification/index') ?>" class="notifications-icon" title="<?php echo $this->__('Notifications') ?>" data-toggle="dropdown"> + <span class="value">10</span> + </a> + <!-- @TODO: Replace with real data --> + <ul class="dropdown-menu"> + <li class="first new"> + <strong>Mike Lastnamelong</strong> + <a href="#">Lorem ipsum dolor sit amet dolor adipiscing lollipop guild...</a> + <time>2:52 pm</time> + <button class="action-close">Close</button> + </li> + <li> + <strong>Mike Lastnamelong</strong> + <a href="#">Lorem ipsum dolor sit amet dolor adipiscing lollipop guild...</a> + <time>2:52 pm</time> + <button class="action-close">Close</button> + </li> + <li> + <strong>Mike Lastnamelong</strong> + <a href="#">Lorem ipsum dolor sit amet dolor adipiscing lollipop guild...</a> + <time>2:52 pm</time> + <button class="action-close">Close</button> + </li> + <li> + <strong>Mike Lastnamelong</strong> + <a href="#">Lorem ipsum dolor sit amet dolor adipiscing lollipop guild...</a> + <time>2:52 pm</time> + <button class="action-close">Close</button> + </li> + <li class="last"> + <a href="<?php echo $this->getUrl('adminhtml/notification/index') ?>" class="action-more"><?php echo $this->__('See All') ?></a> + </li> + </ul> + </div> + <?php if (Mage::getSingleton('Mage_Core_Model_Authorization')->isAllowed('Mage_Adminhtml::global_search')): ?> + <div class="search"> + <form action="" method="post" id="form-search"> + <label for="search-global"> + <input type="text" id="search-global" name="query"> + </label> + <button type="submit" title="<?php echo $this->__('Search') ?>"><?php echo $this->__('Search') ?></button> + </form> + <div id="search-global-autocomplete" class="autocomplete-results"></div> + </div> <script type="text/javascript"> + (function($){ + $('#form-search') + .off('submit') + .on('submit.siteSearch',function(e){ + e.preventDefault(); + return false; + }); + })(jQuery); + new Ajax.Autocompleter( - 'global_search', - 'global_search_autocomplete', + 'search-global', + 'search-global-autocomplete', '<?php echo $this->getUrl('adminhtml/index/globalSearch') ?>', { - paramName:"query", - minChars:2, - indicator:"global_search_indicator", - updateElement:getSelectionId, - evalJSON:'force' + parent: "form-search", + paramName: "query", + minChars: 2, + updateElement: function(e) { + return false; + }, + evalJSON: 'force' } - ); - function getSelectionId(li) { - location.href = li.getAttribute('url'); - } + ) </script> - </fieldset> - <?php endif; ?> + <?php endif; ?> + </div> </div> -</div> +</header> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/page/notices.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/page/notices.phtml index d807fd9046206f53bd345ae43be68dc3b9089fde..a00224c3ef1ab799c891992798da73e7b1eb2d8a 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/page/notices.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/page/notices.phtml @@ -31,14 +31,22 @@ ?> <?php if ($this->displayNoscriptNotice()): ?> <noscript> - <div class="noscript"> - <div class="noscript-inner"> - <p><strong><?php echo $this->__('JavaScript seems to be disabled in your browser.'); ?></strong></p> - <p><?php echo $this->__('You must have JavaScript enabled in your browser to utilize the functionality of this website.'); ?></p> + <div class="message message-noscript"> + <div class="message-inner"> + <div class="message-content"> + <strong><?php echo $this->__('JavaScript seems to be disabled in your browser.'); ?></strong> + <?php echo $this->__('You must have JavaScript enabled in your browser to utilize the functionality of this website.'); ?> + </div> </div> </div> </noscript> <?php endif; ?> <?php if ($this->displayDemoNotice()): ?> - <p class="demo-notice"><?php echo $this->__('This is a demo store. Any orders placed through this store will not be honored or fulfilled.') ?></p> + <div class="message message-demo-mode"> + <div class="message-inner"> + <div class="message-content"> + <?php echo $this->__('This is a demo store. Any orders placed through this store will not be honored or fulfilled.') ?> + </div> + </div> + </div> <?php endif; ?> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/poll/answers/list.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/poll/answers/list.phtml index 4a84e1c77c4aba4747038609040bd8f35ab71bf9..82e9b26f525bfe9d117a2686a3997b9d68f4d349 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/poll/answers/list.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/poll/answers/list.phtml @@ -24,101 +24,132 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div id="answers_container"> -<?php if( !$answers ): ?> -<?php else: ?> - <div class="entry-edit-head"> - <h4 class="icon-head head-edit-form fieldset-legend"><?php echo Mage::helper('Mage_Poll_Helper_Data')->__('Assigned Answers') ?></h4> - </div> - <?php foreach($answers->getItems() as $_item): ?> - <div class="fieldset fieldset-wide" id="poll_answer_fieldset_<?php echo $_item->getId() ?>"> - <table cellspacing="0" class="form-list"> - <tr> - <td class="label"><label for="answer_<?php echo $_item->getId() ?>"><?php echo Mage::helper('Mage_Poll_Helper_Data')->__('Answer Title:') ?> <span class="required">*</span></label></td> - <td class="value"><input type="text" id="answer_<?php echo $_item->getId() ?>" name="answer[<?php echo $_item->getId() ?>][title]" value="<?php echo $this->escapeHtml($_item->getAnswerTitle()) ?>" class="input-text required-entry" /></td> - </tr> - <tr> - <td class="label"><label for="answer_votes_<?php echo $_item->getId() ?>"><?php echo Mage::helper('Mage_Poll_Helper_Data')->__('Votes Count:') ?> <span class="required">*</span></label></td> - <td class="value"><input type="text" id="answer_votes_<?php echo $_item->getId() ?>" name="answer[<?php echo $_item->getId() ?>][votes]" value="<?php echo $_item->getVotesCount() ?>" class="input-text required-entry validate-not-negative-number" /> - <p class="a-left" style="margin:7px 0 0;"><?php echo $this->getDeleteButtonHtml() ?></p> - </td> - </tr> - </table> - <input type="hidden" id="id_poll_answer_fieldset_<?php echo $_item->getId() ?>" value="<?php echo $_item->getId() ?>" /> + +<div class="fieldset-wrapper"> + <?php if($answers): ?> + <div class="fieldset-wrapper-title"> + <span class="title"><?php echo Mage::helper('Mage_Poll_Helper_Data')->__('Assigned Answers') ?></span> </div> - <?php endforeach; ?> -<?php endif; ?> -</div> -<p class="a-right" style="margin:7px 0 0;"><?php echo $this->getAddButtonHtml(); ?></p> -<script type="text/template" id="pollTemplate"> -<div class="fieldset fieldset-wide" id="poll_answer_fieldset_#{id}"> - <table cellspacing="0" class="form-list"> - <tr> - <td class="label"> - <label for="answer_#{id}"> - <?php echo Mage::helper('Mage_Poll_Helper_Data')->__('Answer Title:') ?> - <span class="required">*</span> - </label> - </td> - <td class="value"> - <input type="text" id="answer_#{id}" name="answer[#{id}][title]" value="" class="input-text required-entry" /> - </td> - </tr> - <tr> - <td class="label"> - <label for="answer_votes_#{id}"> - <?php echo Mage::helper('Mage_Poll_Helper_Data')->__('Votes Count:') ?> - <span class="required">*</span></label> - </td> - <td class="value"> - <input type="text" id="answer_votes_#{id}" name="answer[#{id}][votes]" value="0" class="input-text required-entry validate-not-negative-number" /> - <p class="a-left" style="margin:7px 0 0;"> - <?php echo $this->getDeleteButtonHtml() ?> - </p> - </td> - </tr> - </table> - <input type="hidden" id="id_poll_answer_fieldset_#{id}" value="#{id}" /> + + <div class="field"> + <div class="control"> + <table class="data-table"> + <thead> + <tr> + <th><?php echo Mage::helper('Mage_Poll_Helper_Data')->__('Answer Title') ?></th> + <th><?php echo Mage::helper('Mage_Poll_Helper_Data')->__('Votes Count') ?></th> + <th class="col-delete"><?php echo Mage::helper('Mage_Poll_Helper_Data')->__('Action') ?></th> + </tr> + </thead> + <tbody id="answers_container"> + <?php foreach($answers->getItems() as $_item): ?> + <tr id="poll_answer_fieldset_<?php echo $_item->getId() ?>"> + <td> + <input type="text" id="answer_<?php echo $_item->getId() ?>" name="answer[<?php echo $_item->getId() ?>][title]" value="<?php echo $this->escapeHtml($_item->getAnswerTitle()) ?>" class="required-entry" /> + </td> + <td> + <input type="text" id="answer_votes_<?php echo $_item->getId() ?>" name="answer[<?php echo $_item->getId() ?>][votes]" value="<?php echo $_item->getVotesCount() ?>" class="required-entry validate-not-negative-number" /> + </td> + <td> + <?php echo $this->getDeleteButtonHtml() ?> + <input type="hidden" id="id_poll_answer_fieldset_<?php echo $_item->getId() ?>" value="<?php echo $_item->getId() ?>" /> + </td> + </tr> + <?php endforeach; ?> + </tbody> + <tfoot> + <tr> + <td colspan="3"> + <?php echo $this->getAddButtonHtml(); ?> + </td> + </tr> + </tfoot> + </table> + </div> + </div> + + <?php endif; ?> </div> + + + + +<script type="text/template" id="templatePollAnswer"> + <tr id="poll_answer_fieldset_#{id}"> + <td> + <input type="text" id="answer_#{id}" name="answer[#{id}][title]" value="" class="required-entry" /> + </td> + <td> + <input type="text" id="answer_votes_#{id}" name="answer[#{id}][votes]" value="0" class="required-entry validate-not-negative-number" /> + </td> + <td> + <?php echo $this->getDeleteButtonHtml() ?> + <input type="hidden" id="id_poll_answer_fieldset_#{id}" value="#{id}" /> + </td> + </tr> +</script> + + + + +<script type="text/template" id="templatePollHidden"> + <input type="hidden" name="deleteAnswer[]" value="#{id}" /> </script> + + + + <script type="text/javascript"> -//<![CDATA[ - var lastId = 0; - var answer = function() { - return { - del : function(obj) { - if( confirm('<?php echo Mage::helper('Mage_Poll_Helper_Data')->__('Are you sure you want to delete it?') ?>') ) { - fieldSet = obj.up('div.fieldset'); - if( $('id_' + fieldSet.id) ) { - var itemId = $('id_' + fieldSet.id).value; - var newElement = document.createElement('input'); - newElement.type = 'hidden'; - newElement.value = itemId; - newElement.name = 'deleteAnswer[]'; - $('answers_container').appendChild(newElement); - } - fieldSet.remove(); - } - }, - - add : function(obj) { - var newElement = document.createElement('div'); - newElement.innerHTML = this.getTemplate(); - $('answers_container').appendChild(newElement); - }, - - getTemplate : function() { - var id = this.createId(), - // Should be changed due refactoring of Poll module - template = new Template($('pollTemplate').innerHTML) - - return template.evaluate({id:id}); - }, - - createId : function () { - return --lastId; +(function($) { + 'use strict'; + + $.widget('mage.poll', { + options: { + }, + + lastId: 0, + + _init: function() { + this.templatePollAnswer = new Template($('#templatePollAnswer').html()); + this.templatePollHidden = new Template($('#templatePollHidden').html()); + this.container = $('#answers_container'); + }, + + _create: function() { + this._bind(); + }, + + _bind: function() { + var self = this; + + $('body') + .on('click.btnPollAddAnswer', '.action-add', function() { + self.addAnswer(); + }) + .on('click.btnPollDeleteAnswer', '.action-delete', function() { + self.deleteAnswer(this); + }); + }, + + addAnswer: function() { + this.container.append(this.templatePollAnswer.evaluate({ + id: --this.lastId + })); + }, + + deleteAnswer: function(el) { + if(confirm('<?php echo Mage::helper('Mage_Poll_Helper_Data')->__('Are you sure you want to delete it?') ?>')) { + var fieldset = $(el).closest('tr'); + var hidden = $('#id_' + fieldset.attr("id")); + var id = hidden.attr("value"); + hidden.after(this.templatePollHidden.evaluate({ + id: id + })); + fieldset.hide(); } } - }(); -//]]> + }); + + $('#poll_tabs_answers_section_content').poll(); +})(jQuery); </script> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/promo/fieldset.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/promo/fieldset.phtml index bdbb71b32512ff0affc84e8d4776e11ac7b74000..7e75e2dcfaa17ec51037db60b5c9d69b26fb9bc6 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/promo/fieldset.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/promo/fieldset.phtml @@ -26,10 +26,9 @@ ?> <?php $_element = $this->getElement() ?> <div class="rule-tree"> - <div class="entry-edit-head"> - <h4 class="icon-head head-edit-form fieldset-legend"><?php echo $_element->getLegend() ?></h4> - </div> - <fieldset id="<?php echo $_element->getHtmlId() ?>" <?php echo $_element->serialize(array('class')) ?>> + <fieldset id="<?php echo $_element->getHtmlId() ?>" <?php echo $_element->serialize(array('class')) ?> class="fieldset"> + <legend class="legend"><span><?php echo $_element->getLegend() ?></span></legend> + <br> <?php if ($_element->getComment()): ?> <p class="comment"><?php echo $this->escapeHtml($_element->getComment()) ?></p> <?php endif; ?> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/rating.xml b/app/code/core/Mage/Adminhtml/view/adminhtml/rating.xml new file mode 100644 index 0000000000000000000000000000000000000000..93d61d25a4e4ec736624680d3188272953fc0e02 --- /dev/null +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/rating.xml @@ -0,0 +1,91 @@ +<?xml version="1.0"?> +<!-- +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category design + * @package default_default + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ +--> +<layout> + <adminhtml_rating_index> + <update handle="formkey"/> + <update handle="adminhtml_rating_block"/> + <reference name="content"> + <block type="Mage_Adminhtml_Block_Rating_Rating" name="adminhtml.rating.container"/> + </reference> + </adminhtml_rating_index> + + <adminhtml_rating_block> + <reference name='adminhtml.rating.container'> + <block type="Mage_Backend_Block_Widget_Grid" name='adminhtml.rating.grid' as='grid'> + <arguments> + <id>ratingsGrid</id> + <dataSource type="object">Mage_Rating_Model_Resource_Rating_Grid_Collection</dataSource> + <default_sort>rating_code</default_sort> + <default_dir>ASC</default_dir> + <save_parameters_in_session>1</save_parameters_in_session> + </arguments> + <block type='Mage_Backend_Block_Widget_Grid_ColumnSet' name='adminhtml.rating.grid.columnSet' as='grid.columnSet'> + <arguments> + <rowUrl> + <path>*/*/edit</path> + <extraParamsTemplate> + <id>getId</id> + </extraParamsTemplate> + </rowUrl> + </arguments> + <block type='Mage_Backend_Block_Widget_Grid_Column' as='rating_id'> + <arguments> + <header translate='true' module='Mage_Rating'>ID</header> + <align>right</align> + <width>50px</width> + <index>rating_id</index> + </arguments> + </block> + <block type='Mage_Backend_Block_Widget_Grid_Column' as='rating_code'> + <arguments> + <header translate='true' module='Mage_Rating'>Rating Name</header> + <index>rating_code</index> + </arguments> + </block> + <block type='Mage_Backend_Block_Widget_Grid_Column' as='position'> + <arguments> + <header translate='true' module='Mage_Rating'>Sort Order</header> + <align>left</align> + <width>100px</width> + <index>position</index> + </arguments> + </block> + <block type='Mage_Backend_Block_Widget_Grid_Column' as='is_active'> + <arguments> + <header translate='true' module='Mage_Rating'>Is Active</header> + <align>left</align> + <index>is_active</index> + <type>options</type> + <options type="options">Mage_Rating_Model_Resource_Rating_Grid_Statuses</options> + </arguments> + </block> + </block> + </block> + </reference> + </adminhtml_rating_block> +</layout> \ No newline at end of file diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/report/grid/container.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/report/grid/container.phtml index fd02700c80c414b6a9b81e7b338ea8d33523d9c2..7d744da71d16c33c71d15c3a0041d6ce63f5e151 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/report/grid/container.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/report/grid/container.phtml @@ -24,14 +24,7 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td style="<?php echo $this->getHeaderWidth() ?>"><?php echo $this->getHeaderHtml() ?></td> - <td class="form-buttons"><?php echo $this->getButtonsHtml() ?></td> - </tr> - </table> -</div> +<div class="page-actions"><?php echo $this->getButtonsHtml() ?></div> <div> <?php echo $this->getChildHtml('store.switcher') ?> </div> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/report/refresh/statistics.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/report/refresh/statistics.phtml index eb651e3cb970c2587e9783203f7eb18108028051..787cc25ee43a565695618ac6fa5fd42c90565158 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/report/refresh/statistics.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/report/refresh/statistics.phtml @@ -24,14 +24,5 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td style="<?php echo $this->getHeaderWidth() ?>" class="<?php echo $this->getHeaderCssClass()?>"><?php echo $this->getHeaderHtml() ?></td> - <td class="form-buttons"><?php echo $this->getButtonsHtml() ?></td> - </tr> - </table> -</div> -<div> - <?php echo $this->getChildHtml('grid') ?> -</div> +<div class="page-actions"><?php echo $this->getButtonsHtml() ?></div> +<?php echo $this->getChildHtml('grid') ?> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/report/wishlist.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/report/wishlist.phtml index 7a209b8a95cdf9cf0246d1b427c106d7f0216c9c..a28c486ded0f7db49636d97adf1d08aa095d98d2 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/report/wishlist.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/report/wishlist.phtml @@ -24,13 +24,6 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td><h3 class="icon-head head-online-visitors"><?php echo Mage::helper('Mage_Reports_Helper_Data')->__('Wishlist Report') ?></h3></td> - </tr> - </table> -</div> <?php echo $this->getChildHtml('grid') ?> <div class="switcher f-left" style="margin: 10px 10px 10px 0px; padding:15px;"> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/review/add.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/review/add.phtml index edcc6aacd06848bc24b2b8c0df2737a84c515827..5f6dbc8e2ec531cbb31bdceb1e904a54e00b0411 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/review/add.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/review/add.phtml @@ -24,23 +24,15 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td><h3><?php echo $this->getHeaderText() ?></h3></td> - <td class="form-buttons"> - <?php echo $this->getBackButtonHtml() ?> - <?php echo $this->getResetButtonHtml() ?> - <span style="display:none;" id="formButtons"> - <?php echo $this->getSaveButtonHtml() ?> - </span> - </td> - </tr> - </table> +<div class="page-actions"> + <?php echo $this->getBackButtonHtml() ?> + <?php echo $this->getResetButtonHtml() ?> + <span class="hidden" id="formButtons"> + <?php echo $this->getSaveButtonHtml() ?> + </span> </div> - -<div style="display:none;" id="formContainer"> -<?php echo $this->getFormHtml() ?> +<div class="hidden" id="formContainer"> + <?php echo $this->getFormHtml() ?> </div> <script type="text/javascript"> jQuery('#edit_form').mage('form').mage('validation'); diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/sales/order/address/form.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/sales/order/address/form.phtml index 332e8b74485fd3def584d12d12111e4408cd6d10..dee361d6ad602dbb042db05b978a81caeee7fa91 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/sales/order/address/form.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/sales/order/address/form.phtml @@ -24,14 +24,10 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div> -<ul class="messages"> - <li class="notice-msg"> - <ul> - <li><?php echo Mage::helper('Mage_Sales_Helper_Data')->__('Changing address information will not recalculate shipping, tax or other order amount.') ?></li> - </ul> - </li> -</ul> +<div class="message message-info"> + <div class="message-inner"> + <div class="message-content"><?php echo Mage::helper('Mage_Sales_Helper_Data')->__('Changing address information will not recalculate shipping, tax or other order amount.') ?></div> + </div> </div> <div class="entry-edit"> <div class="entry-edit-head"> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/sales/order/create/data.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/sales/order/create/data.phtml index f11b7bce1dfcf01149c94bf94cb14857f15739c4..e2bd70df03f1c786dcf7d7459a97c27f40f2dc88 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/sales/order/create/data.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/sales/order/create/data.phtml @@ -25,59 +25,54 @@ */ ?> <div class="page-create-order"> -<p class="switcher"> -<label for="currency_switcher"><?php echo Mage::helper('Mage_Sales_Helper_Data')->__('Order Currency:') ?></label> -<select id="currency_switcher" name="order[currency]" onchange="order.setCurrencyId(this.value); order.setCurrencySymbol(this.options[this.selectedIndex].getAttribute('symbol'));"> - <?php foreach ($this->getAvailableCurrencies() as $_code): ?> - <option value="<?php echo $_code ?>"<?php if($_code==$this->getCurrentCurrencyCode()): ?> selected="selected"<?php endif; ?> symbol="<?php echo $this->getCurrencySymbol($_code) ?>"><?php echo $this->getCurrencyName($_code) ?></option> - <?php endforeach; ?> -</select> -</p> -<script type="text/javascript">order.setCurrencySymbol('<?php echo $this->getCurrencySymbol($this->getCurrentCurrencyCode()) ?>')</script> -<table cellspacing="0" width="100%"> -<tr> + <p class="switcher"> + <label for="currency_switcher"><?php echo Mage::helper('Mage_Sales_Helper_Data')->__('Order Currency:') ?></label> + <select id="currency_switcher" name="order[currency]" onchange="order.setCurrencyId(this.value); order.setCurrencySymbol(this.options[this.selectedIndex].getAttribute('symbol'));"> + <?php foreach ($this->getAvailableCurrencies() as $_code): ?> + <option value="<?php echo $_code ?>"<?php if($_code==$this->getCurrentCurrencyCode()): ?> selected="selected"<?php endif; ?> symbol="<?php echo $this->getCurrencySymbol($_code) ?>"> + <?php echo $this->getCurrencyName($_code) ?> + </option> + <?php endforeach; ?> + </select> + </p> + <script type="text/javascript">order.setCurrencySymbol('<?php echo $this->getCurrencySymbol($this->getCurrentCurrencyCode()) ?>')</script> <?php if($this->getCustomerId()): ?> - <td class="side-col" style="background:none; padding:0;"> - <div id="order-sidebar"><?php echo $this->getChildHtml('sidebar') ?></div> - </td> + <div class="customer-current-activity" id="order-sidebar"> + <div class="customer-current-activity-inner"><?php echo $this->getChildHtml('sidebar') ?></div> + </div> <?php endif; ?> - <td <?php if($this->getCustomerId()): ?>class="main-col"<?php endif; ?>> - <div id="order-additional_area" style="display:none" class="order-additional-area"><?php echo $this->getChildHtml('additional_area') ?></div> - <div id="order-search" style="display:none" class="order-search-items"><?php echo $this->getChildHtml('search') ?></div> - <div id="order-items"><?php echo $this->getChildHtml('items') ?></div> - <div id="order-errors"><?php echo $this->getChildHtml('errors') ?></div> - <div id="order-form_account"><?php echo $this->getChildHtml('form_account') ?></div> - <div id="order-addresses"> - <div id="order-billing_address" class="box-left"><?php echo $this->getChildHtml('billing_address') ?></div> - <div id="order-shipping_address" class="box-right"><?php echo $this->getChildHtml('shipping_address') ?></div> - </div> - <div class="clear"></div> - <div id="order-methods"> - <div id="order-billing_method" class="box-left payments"><?php echo $this->getChildHtml('billing_method') ?></div> - <div id="order-shipping_method" class="box-right"><?php echo $this->getChildHtml('shipping_method') ?></div> - </div> + <div class="order-details<?php if($this->getCustomerId()): ?> order-details-existing-customer<?php endif; ?>"> + <div class="order-details-inner"> + <div id="order-additional_area" style="display:none" class="order-additional-area"><?php echo $this->getChildHtml('additional_area') ?></div> + <div id="order-search" style="display:none" class="order-search-items"><?php echo $this->getChildHtml('search') ?></div> + <div id="order-items" class="order-items"><?php echo $this->getChildHtml('items') ?></div> + <div id="order-errors" class="order-errors"><?php echo $this->getChildHtml('errors') ?></div> + <div id="order-form_account" class="order-account-information"><?php echo $this->getChildHtml('form_account') ?></div> + <div id="order-addresses" class="order-addresses"> + <div id="order-billing_address" class="order-billing-address"><?php echo $this->getChildHtml('billing_address') ?></div> + <div id="order-shipping_address" class="order-shipping-address"><?php echo $this->getChildHtml('shipping_address') ?></div> + </div> + <div id="order-methods" class="order-methods"> + <div id="order-billing_method" class="order-billing-method"><?php echo $this->getChildHtml('billing_method') ?></div> + <div id="order-shipping_method" class="order-shipping-method"><?php echo $this->getChildHtml('shipping_method') ?></div> + </div> - <?php if($this->getChildBlock('card_validation')): ?> - <div class="clear"></div> - <div id="order-methods"> - <div id="order-card_validation" class="box-left payments"><?php echo $this->getChildHtml('card_validation') ?></div> - </div> - <?php endif; ?> + <?php if($this->getChildBlock('card_validation')): ?> + <div id="order-card_validation" class="order-card-validation"><?php echo $this->getChildHtml('card_validation') ?></div> + <?php endif; ?> - <div class="clear"></div> - <?php echo $this->getChildHtml('gift_options') ?> + <?php echo $this->getChildHtml('gift_options') ?> - <div class="clear"></div> - <div class="box-left entry-edit"> - <div class="entry-edit-head"><h4><?php echo Mage::helper('Mage_Sales_Helper_Data')->__('Order History') ?></h4></div> - <fieldset id="order-comment"><?php echo $this->getChildHtml('comment') ?></fieldset> - </div> - <div class="box-right entry-edit"> - <div class="entry-edit-head"><h4><?php echo Mage::helper('Mage_Sales_Helper_Data')->__('Order Totals') ?></h4></div> - <div id="order-totals" class="order-totals"><?php echo $this->getChildHtml('totals') ?></div> + <div class="order-summary"> + <div class="order-history"> + <div class="entry-edit-head"><h4><?php echo Mage::helper('Mage_Sales_Helper_Data')->__('Order History') ?></h4></div> + <fieldset class="fieldset" id="order-comment"><?php echo $this->getChildHtml('comment') ?></fieldset> + </div> + <div class="order-totals"> + <div class="entry-edit-head"><h4><?php echo Mage::helper('Mage_Sales_Helper_Data')->__('Order Totals') ?></h4></div> + <div id="order-totals" class="order-totals-content"><?php echo $this->getChildHtml('totals') ?></div> + </div> + </div> </div> - <div class="clear"></div> - </td> -</tr> -</table> + </div> </div> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/sales/transactions/detail.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/sales/transactions/detail.phtml index 6b3654c55ca8027983b42c94a4cff9b162a2439f..96107f53b68a0fabb0b2e75d31a200edb4dbf6ea 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/sales/transactions/detail.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/sales/transactions/detail.phtml @@ -24,15 +24,7 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td style="<?php echo $this->getHeaderWidth() ?>"><?php echo $this->getHeaderHtml() ?></td> - <td class="form-buttons"><?php echo $this->getButtonsHtml() ?></td> - </tr> - </table> -</div> - +<div class="page-actions"><?php echo $this->getButtonsHtml() ?></div> <div class="entry-edit"> <div class="entry-edit"> <div class="entry-edit-head"> @@ -40,45 +32,45 @@ </div> <div id="log_details_fieldset" class="log-details"> <table cellspacing="0" class="log-info table"> - <col width="25%" /> - <col /> + <col width="25%"/> + <col/> <tbody> - <tr> - <th><?php echo $this->__('Transaction ID'); ?></th> - <td><?php echo $this->getTxnIdHtml() ?></td> - </tr> - <tr> - <th><?php echo $this->__('Parent Transaction ID'); ?></th> - <td> - <?php if ($this->getParentTxnIdHtml()): ?> - <a href="<?php echo $this->getParentTxnIdUrlHtml() ?>"> - <?php echo $this->getParentTxnIdHtml(); ?> - </a> - <?php else :?> - <?php echo $this->__('N/A'); ?> - <?php endif; ?> - </td> - </tr> - <tr> - <th><?php echo $this->__('Order ID'); ?></th> - <td> - <a href="<?php echo $this->getOrderIdUrlHtml(); ?>"> - <?php echo $this->getOrderIncrementIdHtml() ?> - </a> - </td> - </tr> - <tr> - <th><?php echo $this->__('Transaction Type'); ?></th> - <td><?php echo $this->getTxnTypeHtml() ?></td> - </tr> - <tr> - <th><?php echo $this->__('Is Closed'); ?></th> - <td><?php echo $this->getIsClosedHtml(); ?></td> - </tr> - <tr> - <th><?php echo $this->__('Created At'); ?></th> - <td><?php echo $this->getCreatedAtHtml(); ?></td> - </tr> + <tr> + <th><?php echo $this->__('Transaction ID'); ?></th> + <td><?php echo $this->getTxnIdHtml() ?></td> + </tr> + <tr> + <th><?php echo $this->__('Parent Transaction ID'); ?></th> + <td> + <?php if ($this->getParentTxnIdHtml()): ?> + <a href="<?php echo $this->getParentTxnIdUrlHtml() ?>"> + <?php echo $this->getParentTxnIdHtml(); ?> + </a> + <?php else : ?> + <?php echo $this->__('N/A'); ?> + <?php endif; ?> + </td> + </tr> + <tr> + <th><?php echo $this->__('Order ID'); ?></th> + <td> + <a href="<?php echo $this->getOrderIdUrlHtml(); ?>"> + <?php echo $this->getOrderIncrementIdHtml() ?> + </a> + </td> + </tr> + <tr> + <th><?php echo $this->__('Transaction Type'); ?></th> + <td><?php echo $this->getTxnTypeHtml() ?></td> + </tr> + <tr> + <th><?php echo $this->__('Is Closed'); ?></th> + <td><?php echo $this->getIsClosedHtml(); ?></td> + </tr> + <tr> + <th><?php echo $this->__('Created At'); ?></th> + <td><?php echo $this->getCreatedAtHtml(); ?></td> + </tr> </tbody> </table> </div> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/search.xml b/app/code/core/Mage/Adminhtml/view/adminhtml/search.xml new file mode 100644 index 0000000000000000000000000000000000000000..dcc63cd8cf63ce823c24d80a8f42dbcfe9376d87 --- /dev/null +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/search.xml @@ -0,0 +1,126 @@ +<?xml version="1.0"?> +<!-- +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category design + * @package default_default + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ +--> +<layout> + <adminhtml_report_search> + <update handle="adminhtml_report_search_block"/> + <reference name="content"> + <block type="Mage_Adminhtml_Block_Report_Search" name="report.search.grid.container"/> + </reference> + </adminhtml_report_search> + + <adminhtml_report_exportsearchcsv> + <update handle="formkey"/> + <update handle="adminhtml_report_search_block"/> + <container name="report.search.grid.container" label="Report Search Container"/> + </adminhtml_report_exportsearchcsv> + + <adminhtml_report_exportsearchexcel> + <update handle="formkey"/> + <update handle="adminhtml_report_search_block"/> + <container name="report.search.grid.container" label="Report Search Container"/> + </adminhtml_report_exportsearchexcel> + + <adminhtml_report_search_block> + <reference name="report.search.grid.container"> + <block type="Mage_Backend_Block_Widget_Grid" name="adminhtml.report.search.grid" as="grid"> + <arguments> + <id>searchReportGrid</id> + <dataSource type="object">Mage_CatalogSearch_Model_Resource_Query_Collection</dataSource> + <default_sort>query_id</default_sort> + <default_dir>DESC</default_dir> + </arguments> + <block type="Mage_Backend_Block_Widget_Grid_Export" name="adminhtml.report.search.grid.export" as="grid.export"> + <arguments> + <exportTypes> + <csv> + <urlPath>*/*/exportSearchCsv</urlPath> + <label translate="true" module="Mage_Reports">CSV</label> + </csv> + <excel> + <urlPath>*/*/exportSearchExcel</urlPath> + <label translate="true" module="Mage_Reports">Excel XML</label> + </excel> + </exportTypes> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_ColumnSet" as="grid.columnSet" name="adminhtml.report.search.grid.columnSet"> + <arguments> + <rowUrl> + <path>*/catalog_search/edit</path> + <extraParamsTemplate> + <id>getId</id> + </extraParamsTemplate> + </rowUrl> + </arguments> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="query_id"> + <arguments> + <header translate="true" module="Mage_Reports">ID</header> + <width>50px</width> + <filter>0</filter> + <index>query_id</index> + <type>number</type> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="query_text"> + <arguments> + <header translate="true" module="Mage_Reports">Search Query</header> + <index>query_text</index> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_Column_Multistore" as="store_id"> + <arguments> + <header translate="true" module="Mage_Catalog">Store</header> + <index>store_id</index> + <type>store</type> + <store_view>1</store_view> + <sortable>0</sortable> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="num_results"> + <arguments> + <header translate="true" module="Mage_Reports">Results</header> + <width>50px</width> + <align>right</align> + <type>number</type> + <index>num_results</index> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="popularity"> + <arguments> + <header translate="true" module="Mage_Reports">Hits</header> + <width>50px</width> + <align>right</align> + <type>number</type> + <index>popularity</index> + </arguments> + </block> + </block> + </block> + </reference> + </adminhtml_report_search_block> +</layout> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/system/autocomplete.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/system/autocomplete.phtml index 35978b11474df3cd61a164c098cccfd0ac7dc967..c8812b8ddbc36738b6f26fc1c9b158238345c1ba 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/system/autocomplete.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/system/autocomplete.phtml @@ -24,12 +24,12 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<ul> -<?php foreach ($items as $item): ?> - <li id="<?php echo $item['id'] ?>" url="<?php echo $item['url'] ?>"> - <div style="float:right; color:red; font-weight:bold;">[<?php echo $item['type'] ?>]</div> - <strong><?php echo $this->escapeHtml($item['name']) ?></strong><br/> - <span class="informal"><?php echo $this->escapeHtml($item['description']) ?></span> +<ul class="dropdown-menu"> + <?php foreach ($items as $item): ?> + <li id="<?php echo $item['id'] ?>" class="item"> + <a href="<?php echo $item['url'] ?>" class="title"><?php echo $this->escapeHtml($item['name']) ?></a> + <div class="type"><?php echo $item['type'] ?></div> + <?php echo $this->escapeHtml($item['description']) ?> </li> -<?php endforeach ?> + <?php endforeach ?> </ul> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/system/cache/additional.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/system/cache/additional.phtml index 6e24f212ead752a43077eaa561e363b5c6231a23..f698944d06bdbe77abf921753bed1fb3e11647c7 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/system/cache/additional.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/system/cache/additional.phtml @@ -24,30 +24,24 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<br/> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td><h3><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('Additional Cache Management') ?></h3></td><td class="form-buttons"></td> - </tr> - </table> +<div class="fieldset"> + <div class="legend"> + <span><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('Additional Cache Management') ?></span> + </div> + <div class="field"> + <button onclick="setLocation('<?php echo $this->getCleanImagesUrl()?>')" type="button"> + <?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('Flush Catalog Images Cache') ?> + </button> + <span class="label"><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('Pregenerated product images files.')?></span> + </div> + <div class="field"> + <button onclick="setLocation('<?php echo $this->getCleanMediaUrl()?>')" type="button"> + <?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('Flush JavaScript/CSS Cache') ?> + </button> + <span class="label"><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('Themes JavaScript and CSS files combined to one file.')?></span> + </div> + <?php echo $this->getChildHtml(); ?> </div> -<table class="form-list"> - <tr> - <td class="scope-label"> - <button onclick="setLocation('<?php echo $this->getCleanImagesUrl()?>')" type="button" class="scalable"><span><span><span><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('Flush Catalog Images Cache') ?></span></span></span></button> - </td> - <td class="scope-label"> - <?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('Pregenerated product images files.')?> - </td> - </tr> - <tr> - <td class="scope-label"> - <button onclick="setLocation('<?php echo $this->getCleanMediaUrl()?>')" type="button" class="scalable"><span><span><span><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('Flush JavaScript/CSS Cache') ?></span></span></span></button> - </td> - <td class="scope-label"> - <?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('Themes JavaScript and CSS files combined to one file.')?> - </td> - </tr> -</table> -<?php echo $this->getChildHtml(); ?> + + + diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/system/cache/edit.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/system/cache/edit.phtml index ba3bedfe3e2ba6d61bc9111906eefeaf16a9d1da..1fe3ccd5272778e82e905012a793f0ae96eeaaf9 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/system/cache/edit.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/system/cache/edit.phtml @@ -33,19 +33,12 @@ * getForm() - html */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td><h3><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__($this->getTitle()) ?></h3></td><td class="form-buttons"><?php echo $this->getSaveButtonHtml() ?></td> - </tr> - </table> -</div> +<div class="page-actions"><?php echo $this->getSaveButtonHtml() ?></div> <form action="<?php echo $this->getSaveUrl() ?>" method="post" id="config-edit-form" enctype="multipart/form-data"> <?php echo $this->getBlockHtml('formkey')?> <script type="text/javascript"> - function setCacheAction(id, button) - { + function setCacheAction(id, button) { $(id).value = button.id; configForm.submit(); } diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/system/cache/notifications.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/system/cache/notifications.phtml index 9cd9d35c06db61aa28f60489b22250776b28f31c..22787dc528ead7edca3a5ad52b216cbc36514cd3 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/system/cache/notifications.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/system/cache/notifications.phtml @@ -26,9 +26,13 @@ ?> <?php $_processes = $this->getCacheTypesForRefresh()?> <?php if($_processes):?> -<div class="notification-global"> - <strong><?php echo $this->helper('Mage_Adminhtml_Helper_Data')->__('One or more of the Cache Types are invalidated:') ?></strong> - <?php echo implode(', ', $_processes)?>. - <?php echo $this->helper('Mage_Index_Helper_Data')->__('Click here to go to <a href="%s">Cache Management</a> and refresh cache types.', $this->getManageUrl());?> +<div class="message message-system"> + <div class="message-inner"> + <div class="message-content"> + <strong><?php echo $this->helper('Mage_Adminhtml_Helper_Data')->__('One or more of the Cache Types are invalidated:') ?></strong> + <?php echo implode(', ', $_processes)?>. + <?php echo $this->helper('Mage_Index_Helper_Data')->__('Click here to go to <a href="%s">Cache Management</a> and refresh cache types.', $this->getManageUrl());?> + </div> + </div> </div> <?php endif;?> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/system/currency/rate/matrix.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/system/currency/rate/matrix.phtml index 258c8ca6d5429d84cfec9b77ed22c9e094ade0f1..e2d40080e8eb0b323f509a0ffa6e8d4acb938adb 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/system/currency/rate/matrix.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/system/currency/rate/matrix.phtml @@ -38,7 +38,7 @@ $_rates = ( $_newRates ) ? $_newRates : $_oldRates; <tr class="headings"> <th class="a-right"> </th> <?php $_i = 0; foreach( $this->getAllowedCurrencies() as $_currencyCode ): ?> - <th class="<?php echo (( ++$_i == (sizeof($this->getAllowedCurrencies())) ) ? 'last' : '' ) ?> a-right"><strong><?php echo $_currencyCode ?><strong></th> + <th class="<?php echo (( ++$_i == (sizeof($this->getAllowedCurrencies())) ) ? 'last' : '' ) ?> a-right"><span><?php echo $_currencyCode ?></span></th> <?php endforeach; ?> </tr> </thead> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/system/currency/rates.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/system/currency/rates.phtml index 8e7029680d78c68b998910166fd8cbd30e6af319..81d5b188d6ea57f36f3981f3ed9bda363011f1c5 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/system/currency/rates.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/system/currency/rates.phtml @@ -29,20 +29,14 @@ * @var $this Mage_Adminhtml_Block_System_Currency */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td style="width:50%;"><h3 class="icon-head head-system-currency"><?php echo $this->getHeader() ?></h3></td> - <td class="form-buttons"> - <form action="<?php echo $this->getImportFormAction() ?>" method="post"> - <?php echo $this->getBlockHtml('formkey')?> - <?php echo $this->getServicesHtml() ?> - <?php echo $this->getImportButtonHtml() ?> - </form> - <?php echo $this->getResetButtonHtml() ?> - <?php echo $this->getSaveButtonHtml() ?> - </td> - </tr> - </table> +<div class="page-actions"> + <form action="<?php echo $this->getImportFormAction() ?>" method="post"> + <?php echo $this->getBlockHtml('formkey')?> + <?php echo $this->getServicesHtml() ?> + <?php echo $this->getImportButtonHtml() ?> + </form> + <?php echo $this->getResetButtonHtml() ?> + <?php echo $this->getSaveButtonHtml() ?> </div> + <?php echo $this->getRatesMatrixHtml() ?> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/system/design/edit.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/system/design/edit.phtml index e094f48b5066d9c5d450fb641ea7c5a6296e2fe7..a1fe5885e83a765d735f6140fdeb4e9b093b803e 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/system/design/edit.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/system/design/edit.phtml @@ -24,19 +24,12 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td><h3 class="icon-head head-products"><?php echo $this->getHeader() ?></h3></td> - <td class="form-buttons"> - <?php echo $this->getChildHtml('back_button') ?> - <?php if($this->getDesignChangeId()): ?> - <?php echo $this->getChildHtml('delete_button') ?> - <?php endif; ?> - <?php echo $this->getChildHtml('save_button') ?> - </td> - </tr> - </table> +<div class="page-actions"> + <?php echo $this->getChildHtml('back_button') ?> + <?php if($this->getDesignChangeId()): ?> + <?php echo $this->getChildHtml('delete_button') ?> + <?php endif; ?> + <?php echo $this->getChildHtml('save_button') ?> </div> <form action="<?php echo $this->getSaveUrl() ?>" method="post" id="design-edit-form"> <?php echo $this->getBlockHtml('formkey')?> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/system/design/index.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/system/design/index.phtml index 5007f9b4aac70cedad2cd5afc1941b53f9dae15d..20b3ab283ff7ca5cc73114cb503157409a804937 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/system/design/index.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/system/design/index.phtml @@ -24,16 +24,5 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> -<table cellspacing="0"> - <tr> - <td style="width:50%;"><h3 class="icon-head head-products"><?php echo Mage::helper('Mage_Catalog_Helper_Data')->__('Design') ?></h3></td> - <td class="form-buttons"> - <?php echo $this->getChildHtml('add_new_button') ?> - </td> - </tr> -</table> -</div> -<div> - <?php echo $this->getChildHtml('grid') ?> -</div> +<div class="page-actions"><?php echo $this->getChildHtml('add_new_button') ?></div> +<?php echo $this->getChildHtml('grid') ?> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/system/email/template/edit.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/system/email/template/edit.phtml index 58cde56f2587f7e9abbc9c098f0fd0b1023c0447..cd3df7068a4982b6f3f7d53c5c738b8d3df33a92 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/system/email/template/edit.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/system/email/template/edit.phtml @@ -24,82 +24,55 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> - <h3 class="icon-head head-system-email-template"><?php echo $this->getHeaderText() ?></h3> - <p class="content-buttons form-buttons"> - <?php echo $this->getBackButtonHtml(); ?> - <?php echo $this->getResetButtonHtml(); ?> - <?php if($this->getEditMode()): ?> - <?php echo $this->getDeleteButtonHtml(); ?> - <?php endif ?> - <?php if(!$this->isTextType()): ?> - <?php echo $this->getToPlainButtonHtml(); ?> - <?php echo $this->getToHtmlButtonHtml(); ?> - <?php endif ?> - <?php echo $this->getPreviewButtonHtml(); ?> - <?php echo $this->getSaveButtonHtml(); ?> - </p> +<div class="page-actions"> + <?php echo $this->getBackButtonHtml(); ?> + <?php echo $this->getResetButtonHtml(); ?> + <?php if($this->getEditMode()): ?> + <?php echo $this->getDeleteButtonHtml(); ?> + <?php endif ?> + <?php if(!$this->isTextType()): ?> + <?php echo $this->getToPlainButtonHtml(); ?> + <?php echo $this->getToHtmlButtonHtml(); ?> + <?php endif ?> + <?php echo $this->getPreviewButtonHtml(); ?> + <?php echo $this->getSaveButtonHtml(); ?> </div> <?php if (!$this->getEditMode()): ?> <form action="<?php echo $this->getLoadUrl() ?>" method="post" id="email_template_load_form"> <?php echo $this->getBlockHtml('formkey')?> - <div class="entry-edit"> - <div class="entry-edit-head"> - <h4 class="icon-head head-edit-form fieldset-legend"> - <?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('Load default template') ?> - </h4> - <div class="form-buttons"></div> + <fieldset class="fieldset form-inline"> + <legend class="legend"><span><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('Load default template') ?></span></legend> + <div class="field required"> + <label class="label" for="template_select"><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('Template') ?></label> + <div class="control"> + <select id="template_select" name="code" class="select required-entry"> + <?php foreach ($this->getTemplateOptions() as $group => $options): ?> + <?php if ($group): ?> + <optgroup label="<?php echo $this->escapeHtml($group) ?>"> + <?php endif; ?> + <?php foreach ($options as $option): ?> + <option value="<?php echo $this->escapeHtml($option['value']) ?>"<?php echo $this->getOrigTemplateCode() == $option['value'] ? ' selected="selected"' : '' ?>><?php echo $this->escapeHtml($option['label']) ?></option> + <?php endforeach; ?> + <?php if ($group): ?> + </optgroup> + <?php endif; ?> + <?php endforeach; ?> + </select> + </div> </div> - <div class="fieldset"> - <table class="form-list" cellspacing="0"> - <tbody> - <tr> - <td class="label"> - <label for="template_select"> - <?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('Template') ?> - <span class="required">*</span> - </label> - </td> - <td class="value"> - <select id="template_select" name="code" class="select required-entry"> - <?php foreach ($this->getTemplateOptions() as $group => $options): ?> - <?php if ($group): ?> - <optgroup label="<?php echo $this->escapeHtml($group) ?>"> - <?php endif; ?> - <?php foreach ($options as $option): ?> - <option value="<?php echo $this->escapeHtml($option['value']) ?>"<?php echo $this->getOrigTemplateCode() == $option['value'] ? ' selected="selected"' : '' ?>><?php echo $this->escapeHtml($option['label']) ?></option> - <?php endforeach; ?> - <?php if ($group): ?> - </optgroup> - <?php endif; ?> - - <?php endforeach; ?> - </select> - </td> - <td></td> - </tr> - <tr> - <td class="label"> - <label> </label> - </td> - <td class="value"> - <?php echo $this->getLoadButtonHtml() ?> - </td> - <td></td> - </tr> - </tbody> - </table> + <div class="field required"> + <div class="control"> + <?php echo $this->getLoadButtonHtml() ?> + </div> </div> - </div> + </fieldset> </form> <?php endif ?> <form action="<?php echo $this->getSaveUrl() ?>" method="post" id="email_template_edit_form"> <?php echo $this->getBlockHtml('formkey')?> - <fieldset> - <input type="hidden" id="change_flag_element" name="_change_type_flag" value="" /> - <input type="hidden" id="orig_template_code" name="orig_template_code" value="<?php echo $this->getOrigTemplateCode() ?>" /> - <?php echo $this->getFormHtml() ?> - </fieldset> + <input type="hidden" id="change_flag_element" name="_change_type_flag" value="" /> + <input type="hidden" id="orig_template_code" name="orig_template_code" value="<?php echo $this->getOrigTemplateCode() ?>" /> + <?php echo $this->getFormHtml() ?> </form> <form action="<?php echo $this->getPreviewUrl() ?>" method="post" id="email_template_preview_form" target="_blank"> <?php echo $this->getBlockHtml('formkey')?> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/system/email/template/list.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/system/email/template/list.phtml index 17e6dff307f728299af90b3cf0c84399608136e5..13b521b7a0e7ca701c8c7157f3c101e3a9e9b79f 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/system/email/template/list.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/system/email/template/list.phtml @@ -24,16 +24,5 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td style="width:50%;"><h3 class="icon-head head-system-email-template"><?php echo $this->getHeaderText() ?></h3></td> - <td class="form-buttons"> - <?php echo $this->getChildHtml('add_button') ?> - </td> - </tr> - </table> -</div> -<div> - <?php echo $this->getChildHtml('grid') ?> -</div> +<div class="page-actions"><?php echo $this->getChildHtml('add_button') ?></div> +<?php echo $this->getChildHtml('grid') ?> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/tax/class/page/edit.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/tax/class/page/edit.phtml index ce287f5447f17f9885ab90bdd71fd741b6ae0925..424e4fcb3a48a0a8b4ea0da532658cf020bb1679 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/tax/class/page/edit.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/tax/class/page/edit.phtml @@ -24,18 +24,11 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td style="width:50%;"><h3><?php echo $this->_getHeader() ?></h3></td> - <td class="form-buttons"> - <?php echo $this->getBackButtonHtml(); ?> - <?php echo $this->getResetButtonHtml(); ?> - <?php echo $this->getDeleteButtonHtml(); ?> - <?php echo $this->getSaveButtonHtml(); ?> - </td> - </tr> - </table> +<div class="page-actions"> + <?php echo $this->getBackButtonHtml(); ?> + <?php echo $this->getResetButtonHtml(); ?> + <?php echo $this->getDeleteButtonHtml(); ?> + <?php echo $this->getSaveButtonHtml(); ?> </div> <?php echo $this->_getRenameFormHtml(); ?> <script type="text/javascript"> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/tax/importExport.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/tax/importExport.phtml index 9309ad091a9f4b0530ba6b4bbf2afc576e275c86..a33297ae92ccd498f6581503410be2fafe51450d 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/tax/importExport.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/tax/importExport.phtml @@ -24,16 +24,13 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="entry-edit"> +<div class="import-export-tax-rates"> <?php if (!$this->getIsReadonly()): ?> - <div class="box-left"> + <div class="import-tax-rates"> <form id="import-form" action="<?php echo $this->getUrl('*/tax_rate/importPost') ?>" method="post" enctype="multipart/form-data"> <?php echo $this->getBlockHtml('formkey')?> - <div class="entry-edit-head"> - <h4 class="icon-head head-edit-form fieldset-legend"><?php echo Mage::helper('Mage_Tax_Helper_Data')->__('Import Tax Rates') ?></h4> - </div> - <fieldset> - <legend><?php echo Mage::helper('Mage_Tax_Helper_Data')->__('Import Tax Rates') ?></legend> + <fieldset class="fieldset"> + <legend class="legend"><span><?php echo Mage::helper('Mage_Tax_Helper_Data')->__('Import Tax Rates') ?></span></legend> <input type="file" name="import_rates_file" class="input-file required-entry"/> <?php echo $this->getButtonHtml('Import Tax Rates', '', 'import-submit') ?> </fieldset> @@ -43,18 +40,10 @@ (function ($) { $('.import-submit').click(function(){ if($(':input[name="import_rates_file"]').val()) { - var loaderArea = $('#html-body .wrapper')[0], - loadingMask = $('#loading-mask'); - - loadingMask.css({ - top: 0, - left: 0, - width: document.body.offsetWidth, - height: document.body.offsetHeight, - 'z-index':1005 + $('body').loadingPopup({ + timeout: false }); - loadingMask.toggle(); - toggleSelectsUnderBlock($('loading-mask'), false); + $(this.form).submit(); } }); @@ -62,17 +51,13 @@ </script> </div> <?php endif; ?> - <div class="<?php if ($this->getIsReadonly()): ?>box-left<?php else: ?>box-right<?php endif; ?>"> + <div class="export-tax-rates"> <form id="export_form" action="<?php echo $this->getUrl('*/tax_rate/exportPost') ?>" method="post" enctype="multipart/form-data"> <?php echo $this->getBlockHtml('formkey')?> - <div class="entry-edit-head"> - <h4 class="icon-head head-edit-form fieldset-legend"><?php echo Mage::helper('Mage_Tax_Helper_Data')->__('Export Tax Rates') ?></h4> - </div> - <fieldset> - <legend><?php echo Mage::helper('Mage_Tax_Helper_Data')->__('Export Tax Rates') ?></legend> + <fieldset class="fieldset"> + <legend class="legend"><span><?php echo Mage::helper('Mage_Tax_Helper_Data')->__('Export Tax Rates') ?></span></legend> <?php echo $this->getButtonHtml('Export Tax Rates', "this.form.submit()") ?> </fieldset> </form> </div> - <div class="clear"></div> </div> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/tax/importExportHeader.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/tax/importExportHeader.phtml index ebee6ab487affe32407570322af296180ddc3a9d..3c4b39e1837e9eb3012b02daad3ae8094264164d 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/tax/importExportHeader.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/tax/importExportHeader.phtml @@ -24,10 +24,3 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td><h3 class="icon-head head-tax-rate-importExport"><?php echo Mage::helper('Mage_Tax_Helper_Data')->__('Import/Export Tax Rates') ?></h3></td> - </tr> - </table> -</div> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/tax/rate/title.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/tax/rate/title.phtml index cecede346636b1359cb468ed2141146cdae345ca..09c46880e5184b1c8e745e5307cd0bc304d159b1 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/tax/rate/title.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/tax/rate/title.phtml @@ -24,23 +24,17 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<?php /* <table class="dynamic-grid" cellspacing="0" id="tax-rate-titles-table"> */ ?> - <tr class="dynamic-grid"> +<div id="tax-rate-titles-table" class="form-inline"> + <?php $_labels = $this->getTitles() ?> <?php foreach ($this->getStores() as $_store): ?> - <th><?php echo $_store->getName() ?></th> + <div class="field"> + <label class="label"><span><?php echo $_store->getName() ?></span></label> + <div class="control"> + <input class="input-text<?php if ($_store->getId() == 0): ?> required-entry<?php endif; ?>" type="text" name="title[<?php echo $_store->getId() ?>]" value="<?php echo $_labels[$_store->getId()] ?>"/> + </div> + </div> <?php endforeach; ?> - </tr> - <tr class="dynamic-grid"> - <?php $_labels = $this->getTitles() ?> - <?php foreach ($this->getStores() as $_store): ?> - <td> - <input class="input-text<?php if($_store->getId()==0): ?> required-entry<?php endif; ?>" type="text" name="title[<?php echo $_store->getId() ?>]" value="<?php echo $_labels[$_store->getId()] ?>" /> - </td> - <?php endforeach; ?> - </tr> - <tr class="dynamic-grid"> - <td colspan="<?php echo count($this->getStores()); ?>" class="tax-rate-titles-note-td"> - <p><strong><?php echo $this->__('Note:'); ?></strong> <?php echo $this->__('Leave empty to use tax identifier'); ?></p> - </td> - </tr> -<?php /* </table> */ ?> + <div class="tax-rate-titles-note-td"> + <strong><?php echo $this->__('Note:'); ?></strong> <?php echo $this->__('Leave empty to use tax identifier'); ?> + </div> +</div> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/tax/rule/edit.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/tax/rule/edit.phtml index 512fd4f47ec13378dbb2c6be8d534b1b8ed3664a..510ed9317fe40b20961f6472cd45080df198de98 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/tax/rule/edit.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/tax/rule/edit.phtml @@ -27,116 +27,99 @@ /** @var $this Mage_Adminhtml_Block_Tax_Rule_Edit_Form */ ?> <script type="text/javascript"> - (function ($) { - function toggleLoadingMask() - { - var loaderArea = $('#html-body .wrapper')[0], - loadingMask = $('#loading-mask'), - flag = $('#loading-mask').is(':visible'); - - loadingMask.css({ - top: 0, - left: 0, - width: document.body.offsetWidth, - height: document.body.offsetHeight, - 'z-index':1005 +(function ($) { + $.widget("adminhtml.dialogRates", $.ui.dialog, { + options: { + itemRate: {}, + itemRateDefault: {} + }, + _create: function() { + $.ui.dialog.prototype._create.apply(this); + this._getFormData(this.options.itemRateDefault); + }, + open: function() { + if (this._trigger('beforeOpen', null, this) === false) { + return; + } + this._applyItem(this.options.itemRateDefault); + if (this.options.itemRate && !$.isEmptyObject(this.options.itemRate)) { + this._applyItem(this.options.itemRate); + } + $.ui.dialog.prototype.open.apply(this); + + }, + close: function() { + $.ui.dialog.prototype.close.apply(this); + }, + _applyItem: function(rate) { + var dialogElement = this.uiDialog; + $.each(rate, function(key, value) { + dialogElement.find('[name="' + key + '"]').attr('value', value); }); - loadingMask.toggle(); - toggleSelectsUnderBlock($('loading-mask'), flag); - } - $.widget("adminhtml.dialogRates", $.ui.dialog, { - options: { - itemRate: {}, - itemRateDefault: {} - }, - _create: function() { - $.ui.dialog.prototype._create.apply(this); - this._getFormData(this.options.itemRateDefault); - }, - open: function() { - if (this._trigger('beforeOpen', null, this) === false) { - return; - } - this._applyItem(this.options.itemRateDefault); - if (this.options.itemRate && !$.isEmptyObject(this.options.itemRate)) { - this._applyItem(this.options.itemRate); + }, + updateItemRate: function() { + this._getFormData(this.options.itemRate); + }, + _getFormData: function(data) { + $.each(this.uiDialog.find(':input'), function() { + if (this.name) { + data[this.name] = this.value } - $.ui.dialog.prototype.open.apply(this); - - }, - close: function() { - $.ui.dialog.prototype.close.apply(this); - }, - _applyItem: function(rate) { - var dialogElement = this.uiDialog; - $.each(rate, function(key, value) { - dialogElement.find('[name="' + key + '"]').attr('value', value); - }); - - }, - updateItemRate: function() { - this._getFormData(this.options.itemRate); - }, - _getFormData: function(data) { - $.each(this.uiDialog.find(':input'), function() { - if (this.name) { - data[this.name] = this.value - } - }); - } - }); + }); + } + }); - TaxRateEditableMultiselect = function (settings) { - this.settings = settings || {}; - this.isEntityEditable = this.settings.is_entity_editable || false; + TaxRateEditableMultiselect = function (settings) { + this.settings = settings || {}; + this.isEntityEditable = this.settings.is_entity_editable || false; - this.edit = function() { - var that = $(this), + this.edit = function() { + var that = $(this), index = that.parent().index(), select = that.closest('.mselect-list').prev(), id = select.find('option').eq(index).attr('value'), item; - for(var i = 0, c = taxRateCollection.length; i < c; i++) { - if (taxRateCollection[i].tax_calculation_rate_id == id) { - item = taxRateCollection[i]; - break; - } + for(var i = 0, c = taxRateCollection.length; i < c; i++) { + if (taxRateCollection[i].tax_calculation_rate_id == id) { + item = taxRateCollection[i]; + break; } - item.itemElement = that.prev(); - $('#tax-rate-form') + } + item.itemElement = that.prev(); + $('#tax-rate-form') .dialogRates({itemRate: item}) .dialogRates('open'); - } + } - TaxRateEditableMultiselect.prototype.init = function () { - var options = { - toggleAddButton:false, - addText: '<?php echo Mage::helper('Mage_Tax_Helper_Data')->__('Add New Tax Rate'); ?>', - parse: null, - mselectInputSubmitCallback: function (value, options) { - var select = $('#tax_rate'); - select.append('<option value="" selected="selected">' + value + '</option>'); - var mselectItemHtml = $(options.item.replace(/%value%|%label%/gi, value) + TaxRateEditableMultiselect.prototype.init = function () { + var options = { + toggleAddButton:false, + addText: '<?php echo Mage::helper('Mage_Tax_Helper_Data')->__('Add New Tax Rate'); ?>', + parse: null, + mselectInputSubmitCallback: function (value, options) { + var select = $('#tax_rate'); + select.append('<option value="" selected="selected">' + value + '</option>'); + var mselectItemHtml = $(options.item.replace(/%value%|%label%/gi, value) .replace(/%mselectDisabledClass%|%iseditable%|%isremovable%/gi, '') .replace(/%mselectListItemClass%/gi, options.mselectListItemClass)) .find('[type=checkbox]') .attr('checked', true) .addClass(options.mselectCheckedClass) .end(); - var itemsWrapper = select.next().find('.' + options.mselectItemsWrapperClass + ''); - itemsWrapper.children('.' + options.mselectListItemClass + '').length + var itemsWrapper = select.next().find('.' + options.mselectItemsWrapperClass + ''); + itemsWrapper.children('.' + options.mselectListItemClass + '').length ? itemsWrapper.children('.' + options.mselectListItemClass + ':last').after(mselectItemHtml) : itemsWrapper.prepend(mselectItemHtml); - } - }; - var taxRateField = $('#tax_rate').parent(), + } + }; + var taxRateField = $('#tax_rate').parent(), taxRateForm = $('#tax-rate-form'); - if (!this.isEntityEditable) { - // Override default layout of editable multiselect - options['layout'] = '<section class="block %mselectListClass%">' + if (!this.isEntityEditable) { + // Override default layout of editable multiselect + options['layout'] = '<section class="block %mselectListClass%">' + '<div class="block-content"><div class="%mselectItemsWrapperClass%">' + '%items%' + '</div></div>' @@ -146,14 +129,14 @@ + '<span class="%mselectButtonSaveClass%" title="Add"></span>' + '</div>' + '</section>'; - options['mselectInputSubmitCallback'] = null; - } + options['mselectInputSubmitCallback'] = null; + } - $('#tax_rate').multiselect(options); + $('#tax_rate').multiselect(options); - taxRateField.find('.mselect-button-add').off('click'); + taxRateField.find('.mselect-button-add').off('click'); - taxRateField.find('.mselect-list') + taxRateField.find('.mselect-list') .on('click.mselect-edit', '.mselect-edit', this.edit) .on("click.mselect-delete", ".mselect-delete", function () { if (!confirm('<?php echo Mage::helper('Mage_Tax_Helper_Data')->__('Do you really want to delete this tax rate'); ?>')) { @@ -161,8 +144,8 @@ } var that = $(this), - index = that.parent().index(), - select = that.closest('.mselect-list').prev(); + index = that.parent().index(), + select = that.closest('.mselect-list').prev(); var ajaxOptions = { type: 'POST', @@ -186,76 +169,76 @@ }) .on('click.mselectAdd', '.mselect-button-add', function () { taxRateForm - .dialogRates({itemRate: {}}) - .dialogRates('open'); + .dialogRates({itemRate: {}}) + .dialogRates('open'); }) .on('click.mselect-checked', '.mselect-list-item input', function (event) { var el = $(this), - checkedClassName = 'mselect-checked'; + checkedClassName = 'mselect-checked'; el[el.is(':checked') ? 'addClass' : 'removeClass'](checkedClassName); }) .on('dblclick.mselect-list-item', '.mselect-list-item label span', this.edit); - taxRateForm.dialogRates({ - title: '<?php echo Mage::helper('Mage_Tax_Helper_Data')->__('Tax Rate'); ?>', - autoOpen: false, - id: '<?php echo $this->getJsId() ?>', - minWidth: 560, - modal: true, - resizable: false, - buttons: [{ - text: '<?php echo Mage::helper('Mage_Tax_Helper_Data')->__('Cancel'); ?>', - id: '<?php echo $this->getJsId('close-button') ?>', - click: function() { - $(this).dialogRates("close"); - } - }, { - text: '<?php echo Mage::helper('Mage_Tax_Helper_Data')->__('Save'); ?>', - id: '<?php echo $this->getJsId('apply-button') ?>', - click: function() { - $(this).dialogRates('updateItemRate'); - var itemRate = $(this).dialogRates('option').itemRate, + taxRateForm.dialogRates({ + title: '<?php echo Mage::helper('Mage_Tax_Helper_Data')->__('Tax Rate'); ?>', + autoOpen: false, + id: '<?php echo $this->getJsId() ?>', + minWidth: 560, + modal: true, + resizable: false, + buttons: [{ + text: '<?php echo Mage::helper('Mage_Tax_Helper_Data')->__('Cancel'); ?>', + id: '<?php echo $this->getJsId('close-button') ?>', + click: function() { + $(this).dialogRates("close"); + } + }, { + text: '<?php echo Mage::helper('Mage_Tax_Helper_Data')->__('Save'); ?>', + id: '<?php echo $this->getJsId('apply-button') ?>', + click: function() { + $(this).dialogRates('updateItemRate'); + var itemRate = $(this).dialogRates('option').itemRate, itemRateData = $.extend({}, itemRate); - if (itemRateData.itemElement) { - delete itemRateData.itemElement; - } + if (itemRateData.itemElement) { + delete itemRateData.itemElement; + } - toggleLoadingMask(); + $('body').loadingPopup(); - var ajaxOptions = { - type: 'POST', - data: itemRateData, - dataType: 'json', - url: '<?php echo $this->getTaxRateSaveUrl()?>', - success: function(result, status) { - if (result.success) { - itemRate.code = result.code; - if (itemRate.tax_calculation_rate_id) { - itemRate.itemElement.find('span').html(itemRate.code); - var index = itemRate.itemElement.parent().index(); - itemRate.itemElement.closest('.mselect-list').prev().find('option').eq(index) + var ajaxOptions = { + type: 'POST', + data: itemRateData, + dataType: 'json', + url: '<?php echo $this->getTaxRateSaveUrl()?>', + success: function(result, status) { + if (result.success) { + itemRate.code = result.code; + if (itemRate.tax_calculation_rate_id) { + itemRate.itemElement.find('span').html(itemRate.code); + var index = itemRate.itemElement.parent().index(); + itemRate.itemElement.closest('.mselect-list').prev().find('option').eq(index) .html(itemRate.code) .val(itemRate.tax_calculation_rate_id); - } else { - itemRate.tax_calculation_rate_id = result.tax_calculation_rate_id; - taxRateField.find('.mselect-input').val(itemRate.code); - taxRateField.find('.mselect-save').trigger('mousedown'); - taxRateField.find('option[value=""]:last') - .val(itemRate.tax_calculation_rate_id); - } - taxRateForm.dialogRates("close"); - taxRateCollection.push(itemRate); } else { - alert(result.error_message); + itemRate.tax_calculation_rate_id = result.tax_calculation_rate_id; + taxRateField.find('.mselect-input').val(itemRate.code); + taxRateField.find('.mselect-save').trigger('mousedown'); + taxRateField.find('option[value=""]:last') + .val(itemRate.tax_calculation_rate_id); } - toggleLoadingMask(); + taxRateForm.dialogRates("close"); + taxRateCollection.push(itemRate); + } else { + alert(result.error_message); } - }; - $.ajax(ajaxOptions); - } - }] - }); - } + $('body').trigger('hideLoadingPopup'); + } + }; + $.ajax(ajaxOptions); + } + }] + }); } - })(jQuery); + } +})(jQuery); </script> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/tax/toolbar/class/add.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/tax/toolbar/class/add.phtml index bfeb7b5b4f1c5f9412e1c84a2f6cbfec80bfaa61..af08b2ec4d6db82a7ee16f8f12d4811efdf693f5 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/tax/toolbar/class/add.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/tax/toolbar/class/add.phtml @@ -24,13 +24,8 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td style="width:50%;"><h3 class="icon-head head-tax"><?php echo $header ?></h3></td> - <td class="form-buttons"> - <button class="scalable add" onclick="window.location.href='<?php echo $createUrl ?>'"><span><span><span><?php echo Mage::helper('Mage_Tax_Helper_Data')->__('Add New Class') ?></span></span></span></button> - </td> - </tr> - </table> +<div class="page-actions"> + <button onclick="window.location.href='<?php echo $createUrl ?>'"> + <?php echo Mage::helper('Mage_Tax_Helper_Data')->__('Add New Class') ?> + </button> </div> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/tax/toolbar/class/save.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/tax/toolbar/class/save.phtml index 223320bec105263f2caab640291bca377e36645f..66b8798da73884bc1937faa4e8e2f8dbb948b176 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/tax/toolbar/class/save.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/tax/toolbar/class/save.phtml @@ -24,19 +24,12 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td style="width:50%;"><h3><?php echo $header ?></h3></td> - <td class="form-buttons"> - <?php echo $this->getBackButtonHtml() ?> - <?php echo $this->getResetButtonHtml() ?> - <?php echo $this->getSaveButtonHtml() ?> - </td> - </tr> - </table> +<div class="page-actions"> + <?php echo $this->getBackButtonHtml() ?> + <?php echo $this->getResetButtonHtml() ?> + <?php echo $this->getSaveButtonHtml() ?> </div> -<?php if( $form ): ?> +<?php if ($form): ?> <?php echo $form->toHtml(); ?> <script type="text/javascript"> jQuery('#<?php echo $form->getForm()->getId() ?>').mage('form').mage('validation'); diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/tax/toolbar/rate/add.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/tax/toolbar/rate/add.phtml index 1c7f2bd4e1ac4ca76bd9945213e48849b6cbaf57..f10ced60284c473193e2659ee22aaf1f6cf2c08d 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/tax/toolbar/rate/add.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/tax/toolbar/rate/add.phtml @@ -24,14 +24,5 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td style="width:50%;"><h3 class="icon-head head-tax"><?php echo Mage::helper('Mage_Tax_Helper_Data')->__('Manage Tax Rates') ?></h3></td> - <td class="form-buttons"> - <?php echo $this->getChildHtml('addButton') ?> - </td> - </tr> - </table> -</div> +<div class="page-actions"><?php echo $this->getChildHtml('addButton') ?></div> <?php echo $this->getChildhtml('grid') ?> \ No newline at end of file diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/tax/toolbar/rate/save.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/tax/toolbar/rate/save.phtml index f6d3117fccabe82f19dc0cd2d9e8d16f559f023d..6dde4c18c75fe6c2f422b0039f87b56a34f19d66 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/tax/toolbar/rate/save.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/tax/toolbar/rate/save.phtml @@ -24,18 +24,11 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td style="width:50%;"><h3 class="icon-head head-tax"><?php echo $header ?></h3></td> - <td class="form-buttons"> - <?php echo $this->getBackButtonHtml(); ?> - <?php echo $this->getResetButtonHtml(); ?> - <?php echo $this->getDeleteButtonHtml(); ?> - <?php echo $this->getSaveButtonHtml(); ?> - </td> - </tr> - </table> +<div class="page-actions"> + <?php echo $this->getBackButtonHtml(); ?> + <?php echo $this->getResetButtonHtml(); ?> + <?php echo $this->getDeleteButtonHtml(); ?> + <?php echo $this->getSaveButtonHtml(); ?> </div> <?php if( $form ): ?> <?php echo $form->toHtml();?> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/tax/toolbar/rule/add.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/tax/toolbar/rule/add.phtml index 1603f7f004fa51bc03bb99347ae20c86c61912cb..13a4865141a5baa99bceb1a48514f9fa07ccaaa4 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/tax/toolbar/rule/add.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/tax/toolbar/rule/add.phtml @@ -24,13 +24,8 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td style="width:50%;"><h3 class="icon-head head-tax"><?php echo $header ?></h3></td> - <td class="form-buttons"> - <button class="scalable add" onclick="window.location.href='<?php echo $createUrl ?>'"><span><span><span><?php echo Mage::helper('Mage_Tax_Helper_Data')->__('Add New Tax Rule') ?></span></span></span></button> - </td> - </tr> - </table> +<div class="page-actions"> + <button onclick="window.location.href='<?php echo $createUrl ?>'"> + <?php echo Mage::helper('Mage_Tax_Helper_Data')->__('Add New Tax Rule') ?> + </button> </div> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/tax/toolbar/rule/save.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/tax/toolbar/rule/save.phtml index 91519871d12efefb127d9f1b242b70b0410bfc71..5c0860788d41db51a607bbd3b1b67fba2cd981ff 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/tax/toolbar/rule/save.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/tax/toolbar/rule/save.phtml @@ -24,20 +24,13 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td style="width:50%;"><h3><?php echo $header ?></h3></td> - <td class="form-buttons"> - <?php echo $this->getBackButtonHtml(); ?> - <?php echo $this->getResetButtonHtml(); ?> - <?php echo $this->getSaveButtonHtml(); ?> - <?php echo $this->getDeleteButtonHtml(); ?> - </td> - </tr> - </table> +<div class="page-actions"> + <?php echo $this->getBackButtonHtml(); ?> + <?php echo $this->getResetButtonHtml(); ?> + <?php echo $this->getSaveButtonHtml(); ?> + <?php echo $this->getDeleteButtonHtml(); ?> </div> -<?php if( $form ): ?> +<?php if ($form): ?> <?php echo $form->toHtml(); ?> <script type="text/javascript"> jQuery('#<?php echo $form->getForm()->getId() ?>').mage('form').mage('validation'); diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/urlrewrite/categories.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/urlrewrite/categories.phtml index 744eb173190f8282f6c429421057c99a21185682..44bf35abf73cb95ec446a019e5af962e6dd4f69e 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/urlrewrite/categories.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/urlrewrite/categories.phtml @@ -30,15 +30,13 @@ * @see Mage_Adminhtml_Block_Urlrewrite_Catalog_Category_Tree */ ?> -<div class="entry-edit"> - <div class="entry-edit-head"> - <h4 class="icon-head head-edit-form fieldset-legend"><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('Select Category') ?></h4> - </div> - <fieldset> - <input type="hidden" name="categories" id="product_categories" value="" /> - <div id="tree-div" class="tree" style="width:auto;"></div> - </fieldset> -</div> +<fieldset class="fieldset"> + <legend class="legend"><span><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__('Select Category') ?></span></legend> + <br /> + <br> + <input type="hidden" name="categories" id="product_categories" value="" /> + <div id="tree-div" class="tree" style="width:auto;"></div> +</fieldset> <?php if ($this->getRoot()): ?> <script type="text/javascript"> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/urlrewrite/edit.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/urlrewrite/edit.phtml index 02da27505cb6319e04a2eec537b60a4d7db66df6..de2ba09eab890837aefca9f58311ed073aad9c77 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/urlrewrite/edit.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/urlrewrite/edit.phtml @@ -30,11 +30,7 @@ * @see Mage_Adminhtml_Block_Urlrewrite_Edit */ ?> -<div class="content-header"> - <?php echo $this->getHeaderHtml() ?> - <p class="content-buttons form-buttons"><?php echo $this->getButtonsHtml() ?></p> -</div> - +<div class="page-actions"><?php echo $this->getButtonsHtml() ?></div> <?php echo $this->getChildHtml() ?> <?php if ($this->getChildBlock('form')): ?> diff --git a/app/code/core/Mage/Adminhtml/view/adminhtml/urlrewrite/selector.phtml b/app/code/core/Mage/Adminhtml/view/adminhtml/urlrewrite/selector.phtml index cc614ae54f8450a1812fe0c09d802734a709f523..1737a33b5c8def1c2f771e60db3f1fafda3f3749 100644 --- a/app/code/core/Mage/Adminhtml/view/adminhtml/urlrewrite/selector.phtml +++ b/app/code/core/Mage/Adminhtml/view/adminhtml/urlrewrite/selector.phtml @@ -30,21 +30,18 @@ * @see Mage_Adminhtml_Block_Urlrewrite_Selector */ ?> -<div class="entry-edit"> -<div class="fieldset"> - -<table cellspacing="0" class="form-list"> - <tr> - <td class="label"><?php echo $this->getSelectorLabel() ?></td> - <td class="value"> - <?php $url = Mage::helper('Mage_Adminhtml_Helper_Data')->getUrl('*/*/*')?> - <select class="select" onchange="window.location = this.value;"> - <?php foreach ($this->getModes() as $mode => $label): ?> - <option <?php echo ($this->isMode($mode) ? 'selected="selected" ' :'' ) ?>value="<?php echo $url . $mode ?>"><?php echo $label ?></option> - <?php endforeach; ?> - </select> - </td> - </tr> -</table> -</div> +<div class="form-inline"> + <fieldset class="fieldset"> + <div class="field"> + <label for="url-rewrite-option-select" class="label"><?php echo $this->getSelectorLabel() ?></label> + <div class="control"> + <?php $url = Mage::helper('Mage_Adminhtml_Helper_Data')->getUrl('*/*/*')?> + <select id="url-rewrite-option-select" class="select" onchange="window.location = this.value;"> + <?php foreach ($this->getModes() as $mode => $label): ?> + <option <?php echo ($this->isMode($mode) ? 'selected="selected" ' :'' ) ?>value="<?php echo $url . $mode ?>"><?php echo $label ?></option> + <?php endforeach; ?> + </select> + </div> + </div> + </fieldset> </div> diff --git a/app/code/core/Mage/Backend/Block/Menu.php b/app/code/core/Mage/Backend/Block/Menu.php index ff9043ba04eef267cbb4cf76404bf223be65441e..4ca7000adacd5eef604bad32a1f9af4d34891683 100644 --- a/app/code/core/Mage/Backend/Block/Menu.php +++ b/app/code/core/Mage/Backend/Block/Menu.php @@ -168,7 +168,7 @@ class Mage_Backend_Block_Menu extends Mage_Backend_Block_Template $output = ($this->_isItemActive($menuItem, $level) ? 'active' : '') . ' ' . ($menuItem->hasChildren() ? 'parent' : '') . ' ' . $isLast - . ' ' . 'level' . $level; + . ' ' . 'level-' . $level; return $output; } @@ -207,7 +207,7 @@ class Mage_Backend_Block_Menu extends Mage_Backend_Block_Template protected function _afterToHtml($html) { $html = preg_replace_callback( - '#'.Mage_Backend_Model_Url::SECRET_KEY_PARAM_NAME.'/\$([^\/].*)/([^\/].*)/([^\$].*)\$#U', + '#' . Mage_Backend_Model_Url::SECRET_KEY_PARAM_NAME . '/\$([^\/].*)/([^\/].*)/([^\$].*)\$#U', array($this, '_callbackSecretKey'), $html ); @@ -297,6 +297,128 @@ class Mage_Backend_Block_Menu extends Mage_Backend_Block_Template return $output; } + /** + * Count All Subnavigation Items + * + * @param Mage_Backend_Model_Menu $items + * @return int + */ + protected function _countItems($items) + { + $total = count($items); + foreach ($items as $item) { + /** @var $item Mage_Backend_Model_Menu_Item */ + if ($item->hasChildren()) { + $total += $this->_countItems($item->getChildren()); + } + } + return $total; + } + + /** + * Building Array with Column Brake Stops + * + * @param Mage_Backend_Model_Menu $items + * @param int $limit + * @return array + * @todo: Add Depth Level limit, and better logic for columns + */ + protected function _columnBrake($items, $limit) + { + $total = $this->_countItems($items); + if ($total <= $limit) { + return; + } + $result[] = array( + 'total' => $total, + 'max' => ceil($total / ceil($total / $limit)) + ); + $count = 0; + foreach ($items as $item) { + $place = $this->_countItems($item->getChildren()) + 1; + $count += $place; + if ($place - $result[0]['max'] > $limit - $result[0]['max']) { + $colbrake = true; + $count = 0; + } elseif ($count - $result[0]['max'] > $limit - $result[0]['max']) { + $colbrake = true; + $count = $place; + } else { + $colbrake = false; + } + $result[] = array( + 'place' => $place, + 'colbrake' => $colbrake + ); + } + return $result; + } + + /** + * Add sub menu HTML code for current menu item + * + * @param $menuItem Mage_Backend_Model_Menu_Item + * @param $level int + * @param $limit int + * @return string HTML code + */ + protected function _addSubMenu($menuItem, $level, $limit) + { + $output = ''; + if (!$menuItem->hasChildren()) { + return $output; + } + $output .= '<div class="submenu">'; + $colStops = null; + if ($level == 0 && $limit) { + $colStops = $this->_columnBrake($menuItem->getChildren(), $limit); + } + $output .= $this->renderNavigation($menuItem->getChildren(), $level + 1, $limit, $colStops); + $output .= '</div>'; + return $output; + } + + /** + * Render Navigation + * + * @param Mage_Backend_Model_Menu $menu + * @param int $level + * @param int $limit + * @param array $colBrakes + * @return string HTML + */ + public function renderNavigation($menu, $level = 0, $limit = 0, $colBrakes = array()) + { + $itemPosition = 1; + $outputStart = '<ul ' . (0 == $level ? 'id="nav"' : '') . ' >'; + $output = ''; + + /** @var $menuItem Mage_Backend_Model_Menu_Item */ + foreach ($this->_getMenuIterator($menu) as $menuItem) { + $menuId = $menuItem->getId(); + $itemName = substr($menuId, strrpos($menuId, '::') + 2); + $itemClass = str_replace('_', '-', strtolower($itemName)); + + if (count($colBrakes) && $colBrakes[$itemPosition]['colbrake']) { + $output .= '</ul></li><li class="column"><ul>'; + } + + $output .= '<li ' . $this->getUiId($menuItem->getId()) + . ' class="item-' . $itemClass . ' ' + . $this->_renderItemCssClass($menuItem, $level) . '">' + . $this->_renderAnchor($menuItem, $level) + . $this->_addSubMenu($menuItem, $level, $limit) + . '</li>'; + $itemPosition++; + } + + if (count($colBrakes) && $limit) { + $output = '<li class="column"><ul>' . $output . '</ul></li>'; + } + + return $outputStart . $output . '</ul>';; + } + /** * Get current selected menu item * diff --git a/app/code/core/Mage/Backend/Block/System/Config/Form/Field.php b/app/code/core/Mage/Backend/Block/System/Config/Form/Field.php index 1d2239516bb93a6633694bb89258dc56f45669c2..6ef2cb1645dcb8a58d0f6ec534fc966569398fea 100644 --- a/app/code/core/Mage/Backend/Block/System/Config/Form/Field.php +++ b/app/code/core/Mage/Backend/Block/System/Config/Form/Field.php @@ -34,7 +34,7 @@ * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class Mage_Backend_Block_System_Config_Form_Field - extends Mage_Core_Block_Template + extends Mage_Backend_Block_Abstract implements Varien_Data_Form_Element_Renderer_Interface { /** diff --git a/app/code/core/Mage/Backend/Block/System/Config/Form/Field/Heading.php b/app/code/core/Mage/Backend/Block/System/Config/Form/Field/Heading.php index 6a532dcfcb457d2063375948cee882956089c478..037b7de0a44b18acded42d661ad79320093f5bb2 100644 --- a/app/code/core/Mage/Backend/Block/System/Config/Form/Field/Heading.php +++ b/app/code/core/Mage/Backend/Block/System/Config/Form/Field/Heading.php @@ -31,7 +31,7 @@ * @author Magento Core Team <core@magentocommerce.com> */ class Mage_Backend_Block_System_Config_Form_Field_Heading - extends Mage_Core_Block_Template implements Varien_Data_Form_Element_Renderer_Interface + extends Mage_Backend_Block_Abstract implements Varien_Data_Form_Element_Renderer_Interface { /** * Render element html diff --git a/app/code/core/Mage/Backend/Block/System/Config/Form/Fieldset.php b/app/code/core/Mage/Backend/Block/System/Config/Form/Fieldset.php index 64386ce1b164efedd2667919ea466058c421cc44..a3c0ec18aca22c126c18c2c61a220a09efc8ff07 100644 --- a/app/code/core/Mage/Backend/Block/System/Config/Form/Fieldset.php +++ b/app/code/core/Mage/Backend/Block/System/Config/Form/Fieldset.php @@ -33,7 +33,7 @@ * @author Magento Core Team <core@magentocommerce.com> */ class Mage_Backend_Block_System_Config_Form_Fieldset - extends Mage_Core_Block_Template + extends Mage_Backend_Block_Abstract implements Varien_Data_Form_Element_Renderer_Interface { @@ -70,7 +70,7 @@ class Mage_Backend_Block_System_Config_Form_Fieldset { $default = !$this->getRequest()->getParam('website') && !$this->getRequest()->getParam('store'); - $html = '<div><div>'; + $html = ''; $html .= '<div class="entry-edit-head collapseable" ><a id="' . $element->getHtmlId() . '-head" href="#" onclick="Fieldset.toggleCollapse(\'' . $element->getHtmlId() . '\', \'' . $this->getUrl('*/*/state') . '\'); return false;">' . $element->getLegend() . '</a></div>'; @@ -125,7 +125,7 @@ class Mage_Backend_Block_System_Config_Form_Fieldset } } $html .= '</fieldset>' . $this->_getExtraJs($element, $tooltipsExist); - $html .= '</div></div>'; + $html .= ''; return $html; } diff --git a/app/code/core/Mage/Backend/Block/Widget/Button.php b/app/code/core/Mage/Backend/Block/Widget/Button.php index a8a4a3cae259e7c723432a37c99a1b90a66f1e94..aac5175536264ec87de15ce907853dbf3cdb6bb0 100644 --- a/app/code/core/Mage/Backend/Block/Widget/Button.php +++ b/app/code/core/Mage/Backend/Block/Widget/Button.php @@ -82,7 +82,7 @@ class Mage_Backend_Block_Widget_Button extends Mage_Backend_Block_Widget 'name' => $this->getElementName(), 'title' => $title, 'type' => $this->getType(), - 'class' => 'scalable ' . $this->getClass() . ' ' . $disabled, + 'class' => 'action- scalable ' . $this->getClass() . ' ' . $disabled, 'onclick' => $this->getOnClick(), 'style' => $this->getStyle(), 'value' => $this->getValue(), diff --git a/app/code/core/Mage/Backend/Block/Widget/Container.php b/app/code/core/Mage/Backend/Block/Widget/Container.php index bc26ef437dcd4f4d6cb30260ddcaffb762413296..e208261bd21bd9f29fb22f2aafb003a2618fe48e 100644 --- a/app/code/core/Mage/Backend/Block/Widget/Container.php +++ b/app/code/core/Mage/Backend/Block/Widget/Container.php @@ -33,6 +33,12 @@ */ class Mage_Backend_Block_Widget_Container extends Mage_Backend_Block_Template { + /**#@+ + * Initialization parameters in pseudo-constructor + */ + const PARAM_CONTROLLER = 'controller'; + const PARAM_HEADER_TEXT = 'header_text'; + /**#@-*/ /** * So called "container controller" to specify group of blocks participating in some action @@ -60,6 +66,20 @@ class Mage_Backend_Block_Widget_Container extends Mage_Backend_Block_Template */ protected $_headerText = 'Container Widget Header'; + /** + * Initialize "controller" and "header text" + */ + protected function _construct() + { + parent::_construct(); + if ($this->hasData(self::PARAM_CONTROLLER)) { + $this->_controller = $this->_getData(self::PARAM_CONTROLLER); + } + if ($this->hasData(self::PARAM_HEADER_TEXT)) { + $this->_headerText = $this->_getData(self::PARAM_HEADER_TEXT); + } + } + /** * Add a button * diff --git a/app/code/core/Mage/Backend/Block/Widget/Form.php b/app/code/core/Mage/Backend/Block/Widget/Form.php index 3dc283e4ea16d9e5bbeef4219b3c2b2a2f3b110a..7b413bcfbaa2591cb36c7db2eb2a3adff928f8c8 100644 --- a/app/code/core/Mage/Backend/Block/Widget/Form.php +++ b/app/code/core/Mage/Backend/Block/Widget/Form.php @@ -27,9 +27,8 @@ /** * Backend form widget * - * @category Mage - * @package Mage_Backend - * @author Magento Core Team <core@magentocommerce.com> + * @SuppressWarnings(PHPMD.NumberOfChildren) + * @SuppressWarnings(PHPMD.numberOfChildren) */ class Mage_Backend_Block_Widget_Form extends Mage_Backend_Block_Widget { diff --git a/app/code/core/Mage/Backend/Block/Widget/Form/Element/Dependence.php b/app/code/core/Mage/Backend/Block/Widget/Form/Element/Dependence.php index 464ccd6377df0a9a8b9563e8698ef1333ca1c7e7..9429e122de3aa645aabd4072e6ffc9be8f40be8c 100644 --- a/app/code/core/Mage/Backend/Block/Widget/Form/Element/Dependence.php +++ b/app/code/core/Mage/Backend/Block/Widget/Form/Element/Dependence.php @@ -29,7 +29,7 @@ * Assumes that one element may depend on other element values. * Will toggle as "enabled" only if all elements it depends from toggle as true. */ -class Mage_Backend_Block_Widget_Form_Element_Dependence extends Mage_Core_Block_Template +class Mage_Backend_Block_Widget_Form_Element_Dependence extends Mage_Backend_Block_Abstract { /** * name => id mapper diff --git a/app/code/core/Mage/Backend/Block/Widget/Grid/Column/Filter/Abstract.php b/app/code/core/Mage/Backend/Block/Widget/Grid/Column/Filter/Abstract.php index d1255f361323aba6c28677197fe14f3cea184e37..8ffe8e654359cd6dc821798861c85579b412bfe8 100644 --- a/app/code/core/Mage/Backend/Block/Widget/Grid/Column/Filter/Abstract.php +++ b/app/code/core/Mage/Backend/Block/Widget/Grid/Column/Filter/Abstract.php @@ -31,7 +31,7 @@ * @package Mage_Backend * @author Magento Core Team <core@magentocommerce.com> */ -class Mage_Backend_Block_Widget_Grid_Column_Filter_Abstract extends Mage_Core_Block_Template +class Mage_Backend_Block_Widget_Grid_Column_Filter_Abstract extends Mage_Backend_Block_Abstract implements Mage_Backend_Block_Widget_Grid_Column_Filter_Interface { diff --git a/app/code/core/Mage/Backend/Block/Widget/Grid/Column/Renderer/Abstract.php b/app/code/core/Mage/Backend/Block/Widget/Grid/Column/Renderer/Abstract.php index cacd32d8e9921631a995cf6b8efe5b02911f993f..3d5d3b39490d9133cd1287235b9edf47c68c914f 100644 --- a/app/code/core/Mage/Backend/Block/Widget/Grid/Column/Renderer/Abstract.php +++ b/app/code/core/Mage/Backend/Block/Widget/Grid/Column/Renderer/Abstract.php @@ -33,7 +33,7 @@ */ abstract class Mage_Backend_Block_Widget_Grid_Column_Renderer_Abstract - extends Mage_Core_Block_Template implements Mage_Backend_Block_Widget_Grid_Column_Renderer_Interface + extends Mage_Backend_Block_Abstract implements Mage_Backend_Block_Widget_Grid_Column_Renderer_Interface { protected $_defaultWidth; protected $_column; diff --git a/app/code/core/Mage/Backend/Block/Widget/Grid/Container.php b/app/code/core/Mage/Backend/Block/Widget/Grid/Container.php index cf07f7932c7cce4a8ea3f72e48f46e5c2ee90891..68dab15d48a770830b482cc5bb5498206f1fc066 100644 --- a/app/code/core/Mage/Backend/Block/Widget/Grid/Container.php +++ b/app/code/core/Mage/Backend/Block/Widget/Grid/Container.php @@ -34,6 +34,13 @@ class Mage_Backend_Block_Widget_Grid_Container extends Mage_Backend_Block_Widget_Container { + /**#@+ + * Initialization parameters in pseudo-constructor + */ + const PARAM_BLOCK_GROUP = 'block_group'; + const PARAM_BUTTON_NEW = 'button_new'; + const PARAM_BUTTON_BACK = 'button_back'; + /**#@-*/ protected $_addButtonLabel; protected $_backButtonLabel; @@ -41,25 +48,32 @@ class Mage_Backend_Block_Widget_Grid_Container extends Mage_Backend_Block_Widget protected $_template = 'Mage_Backend::widget/grid/container.phtml'; - + /** + * Initialize object state with incoming parameters + */ protected function _construct() { - if (is_null($this->_addButtonLabel)) { - $this->_addButtonLabel = $this->__('Add New'); + parent::_construct(); + if ($this->hasData(self::PARAM_BLOCK_GROUP)) { + $this->_blockGroup = $this->_getData(self::PARAM_BLOCK_GROUP); } - if (is_null($this->_backButtonLabel)) { - $this->_backButtonLabel = $this->__('Back'); + if ($this->hasData(self::PARAM_BUTTON_NEW)) { + $this->_addButtonLabel = $this->_getData(self::PARAM_BUTTON_NEW); + } else { + // legacy logic to support all descendants + if (is_null($this->_addButtonLabel)) { + $this->_addButtonLabel = $this->__('Add New'); + } + $this->_addNewButton(); + } + if ($this->hasData(self::PARAM_BUTTON_BACK)) { + $this->_backButtonLabel = $this->_getData(self::PARAM_BUTTON_BACK); + } else { + // legacy logic + if (is_null($this->_backButtonLabel)) { + $this->_backButtonLabel = $this->__('Back'); + } } - - parent::_construct(); - - - - $this->_addButton('add', array( - 'label' => $this->getAddButtonLabel(), - 'onclick' => 'setLocation(\'' . $this->getCreateUrl() .'\')', - 'class' => 'add', - )); } protected function _prepareLayout() @@ -90,16 +104,28 @@ class Mage_Backend_Block_Widget_Grid_Container extends Mage_Backend_Block_Widget return $this->getChildHtml('grid'); } - protected function getAddButtonLabel() + public function getAddButtonLabel() { return $this->_addButtonLabel; } - protected function getBackButtonLabel() + public function getBackButtonLabel() { return $this->_backButtonLabel; } + /** + * Create "New" button + */ + protected function _addNewButton() + { + $this->_addButton('add', array( + 'label' => $this->getAddButtonLabel(), + 'onclick' => 'setLocation(\'' . $this->getCreateUrl() .'\')', + 'class' => 'add', + )); + } + protected function _addBackButton() { $this->_addButton('back', array( diff --git a/app/code/core/Mage/Backend/Controller/Router/Default.php b/app/code/core/Mage/Backend/Controller/Router/Default.php index b0ecdc8f920293ee8700e286fb9d31c247be0aaf..e7c11d8133f6b1a2d08bc0b86b1c3dbbddf18701 100644 --- a/app/code/core/Mage/Backend/Controller/Router/Default.php +++ b/app/code/core/Mage/Backend/Controller/Router/Default.php @@ -49,7 +49,6 @@ class Mage_Backend_Controller_Router_Default extends Mage_Core_Controller_Varien /** * @param Mage_Core_Controller_Varien_Action_Factory $controllerFactory * @param Magento_Filesystem $filesystem - * @param Mage_Core_Model_App $app * @param string $areaCode * @param string $baseController * @throws InvalidArgumentException @@ -57,11 +56,10 @@ class Mage_Backend_Controller_Router_Default extends Mage_Core_Controller_Varien public function __construct( Mage_Core_Controller_Varien_Action_Factory $controllerFactory, Magento_Filesystem $filesystem, - Mage_Core_Model_App $app, $areaCode, $baseController ) { - parent::__construct($controllerFactory, $filesystem, $app, $areaCode, $baseController); + parent::__construct($controllerFactory, $filesystem, $areaCode, $baseController); $this->_areaFrontName = Mage::helper('Mage_Backend_Helper_Data')->getAreaFrontName(); if (empty($this->_areaFrontName)) { diff --git a/app/code/core/Mage/Backend/Model/Menu/Factory.php b/app/code/core/Mage/Backend/Model/Menu/Factory.php index 76faa242b7a89065c4b26943e841df0327b5eb1e..57d50040b7b789175a8331ed1b857978c04b2a89 100644 --- a/app/code/core/Mage/Backend/Model/Menu/Factory.php +++ b/app/code/core/Mage/Backend/Model/Menu/Factory.php @@ -31,7 +31,7 @@ class Mage_Backend_Model_Menu_Factory protected $_logger; /** - * @var Magento_ObjectManager + * @var Magento_ObjectManager_Zend */ protected $_factory; diff --git a/app/code/core/Mage/Backend/view/adminhtml/admin/login.phtml b/app/code/core/Mage/Backend/view/adminhtml/admin/login.phtml index c4da2e60f9c95b668e42cee543c8c7e98ad68e8a..909a5e6905e87f446125442663eb3eb4fd220159 100644 --- a/app/code/core/Mage/Backend/view/adminhtml/admin/login.phtml +++ b/app/code/core/Mage/Backend/view/adminhtml/admin/login.phtml @@ -24,61 +24,76 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<!doctype html> <html lang="en"> + <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title><?php echo Mage::helper('Mage_Backend_Helper_Data')->__('Log into Magento Admin Page') ?></title> - <link type="text/css" rel="stylesheet" href="<?php echo $this->getViewFileUrl('reset.css') ?>" media="all" /> - <link type="text/css" rel="stylesheet" href="<?php echo $this->getViewFileUrl('boxes.css') ?>" media="all" /> + <link rel="icon" href="<?php echo $this->getViewFileUrl('Mage_Page::favicon.ico') ?>" type="image/x-icon" /> <link rel="shortcut icon" href="<?php echo $this->getViewFileUrl('Mage_Page::favicon.ico') ?>" type="image/x-icon" /> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('jquery/jquery.min.js') ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('mage/jquery-no-conflict.js') ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('jquery/jquery-ui.custom.min.js') ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('jquery/jquery.tmpl.min.js') ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('jquery/jquery.validate.js') ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('mage/validation.js') ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('mage/backend/validation.js') ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('mage/backend/form.js') ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('mage/translate.js') ?>"></script> + <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('mui/reset.css') ?>" media="all" /> + <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('mui/base.css') ?>" media="all" /> + <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('mui/elements.css') ?>" media="all" /> + <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('mui/form.css') ?>" media="all" /> + <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('css/admin.css') ?>" media="all" /> + <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('mui/utils.css') ?>" media="all" /> + <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('css/debug.css') ?>" media="all" /> + - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('prototype/prototype.js') ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('scriptaculous/effects.js') ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('mage/captcha.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('jquery/jquery.min.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('mage/jquery-no-conflict.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('jquery/jquery-ui.custom.min.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('jquery/jquery.tmpl.min.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('jquery/jquery.validate.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('mage/validation.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('mage/backend/validation.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('mage/backend/form.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('mage/translate.js') ?>"></script> - <!--[if IE]> <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('iestyles.css') ?>" type="text/css" media="all" /> <![endif]--> - <!--[if lt IE 7]> <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('below_ie7.css') ?>" type="text/css" media="all" /> <![endif]--> - <!--[if IE 7]> <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('ie7.css') ?>" type="text/css" media="all" /> <![endif]--> -</head> -<body id="page-login" onload="document.forms['login-form'].username.focus();"> -<div class="login-container"> - <div class="login-box"> - <form method="post" action="" id="login-form"> - <div class="login-form"> - <input name="form_key" type="hidden" value="<?php echo $this->getFormKey() ?>" /> - <h2><?php echo Mage::helper('Mage_Backend_Helper_Data')->__('Log in to Admin Panel') ?></h2> - <div id="messages"> - <?php echo $this->getMessagesBlock()->getGroupedHtml() ?> - </div> - <div class="input-box input-left"><label for="username"><?php echo Mage::helper('Mage_Backend_Helper_Data')->__('User Name:') ?></label><br/> - <input type="text" id="username" name="login[username]" value="" class="required-entry input-text" /></div> - <div class="input-box input-right"><label for="login"><?php echo Mage::helper('Mage_Backend_Helper_Data')->__('Password:') ?></label><br /> - <input type="password" id="login" name="login[password]" class="required-entry input-text" value="" /></div> - <?php echo $this->getChildHtml('form.additional.info'); ?> - <div class="clear"></div> - <div class="form-buttons"> - <?php echo $this->getChildHtml('form.buttons'); ?> - </div> + <script src="<?php echo $this->getViewFileUrl('prototype/prototype.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('scriptaculous/effects.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('mage/captcha.js') ?>"></script> +<body id="page-login" class="page-login" onload="document.forms['login-form'].username.focus();"> +<div class="wrapper"> + <header class="header"> + <div class="logo" title="<?php echo $this->__('Magento Admin Panel') ?>"><span><?php echo $this->__('Magento Admin Panel') ?></span></div> + </header> + <div class="form-login form-inline"> + <div id="messages"> + <?php echo $this->getMessagesBlock()->getGroupedHtml() ?> </div> - <p class="legal"><?php echo Mage::helper('Mage_Backend_Helper_Data')->__('Magento® is a trademark of X.commerce, Inc. Copyright © %s X.commerce, Inc.', date('Y')) ?></p> - </form> - <div class="bottom"></div> - <script type="text/javascript"> - jQuery('#login-form').form().validation(); - </script> + <form method="post" action="" id="login-form"> + <fieldset class="fieldset"> + <legend class="legend"><span><?php echo Mage::helper('Mage_Backend_Helper_Data')->__('Log in to Admin Panel') ?></span></legend><br/> + <input name="form_key" type="hidden" value="<?php echo $this->getFormKey() ?>" /> + <div class="field field-username"> + <label for="username" class="label"><span><?php echo Mage::helper('Mage_Backend_Helper_Data')->__('User Name:') ?></span></label> + <div class="control"> + <input type="text" id="username" name="login[username]" value="" class="required-entry input-text" /> + </div> + </div> + <div class="field field-password"> + <label for="login" class="label"><?php echo Mage::helper('Mage_Backend_Helper_Data')->__('Password:') ?></label> + <div class="control"> + <input type="password" id="login" name="login[password]" class="required-entry input-text" value="" /> + </div> + </div> + <?php echo $this->getChildHtml('form.additional.info'); ?> + <div class="form-actions"> + <?php echo $this->getChildHtml('form.buttons'); ?> + </div> + </fieldset> + </form> + <script type="text/javascript"> + jQuery('#login-form').form().validation(); + </script> </div> + <footer class="footer"> + <div class="footer-content"> + <?php echo Mage::helper('Mage_Backend_Helper_Data')->__('Magento® is a trademark of X.commerce, Inc. Copyright © %s X.commerce, Inc.', date('Y')) ?> + </div> + </footer> </div> -</body> -</html> diff --git a/app/code/core/Mage/Backend/view/adminhtml/admin/login_buttons.phtml b/app/code/core/Mage/Backend/view/adminhtml/admin/login_buttons.phtml index 3e86fbb4de8e7385f364bec77e63a1afa3dd53eb..93d3f0ebdae923f07361a6474bf0fc223f731538 100644 --- a/app/code/core/Mage/Backend/view/adminhtml/admin/login_buttons.phtml +++ b/app/code/core/Mage/Backend/view/adminhtml/admin/login_buttons.phtml @@ -24,10 +24,8 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<input - type="submit" - class="form-button" - value="<?php echo Mage::helper('Mage_Backend_Helper_Data')->__('Login')?>" - title="<?php echo Mage::helper('Mage_Backend_Helper_Data')->__('Login')?>" - <?php $this->getUiId(); ?> - /> +<div class="actions"> + <button <?php $this->getUiId(); ?> class="action-login primary" title="<?php echo Mage::helper('Mage_Backend_Helper_Data')->__('Login')?>" type="submit"> + <span><?php echo Mage::helper('Mage_Backend_Helper_Data')->__('Login')?></span> + </button> +</div> diff --git a/app/code/core/Mage/Backend/view/adminhtml/menu.phtml b/app/code/core/Mage/Backend/view/adminhtml/menu.phtml index 94d7fef1287713c96964d7a6118fc307b392b5a3..377f70eb3131fe197032e75099620e836674fcd1 100644 --- a/app/code/core/Mage/Backend/view/adminhtml/menu.phtml +++ b/app/code/core/Mage/Backend/view/adminhtml/menu.phtml @@ -24,9 +24,12 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> +<nav class="navigation"> + <?php echo $this->renderNavigation($this->getMenuModel(), 0, 12); ?> +</nav> + +<?php /* @TODO: find the place for the help ?> +<a id="page-help-link" href="<?php echo Mage::helper('Mage_Backend_Helper_Data')->getPageHelpUrl() ?>"><?php echo $this->__('Get help for this page') ?></a> +<script type="text/javascript">$('page-help-link').target = 'magento_page_help'</script> +<?php */ ?> -<div class="nav-bar"> - <?php echo $this->renderMenu($this->getMenuModel()); ?> - <a id="page-help-link" href="<?php echo Mage::helper('Mage_Backend_Helper_Data')->getPageHelpUrl() ?>"><?php echo $this->__('Get help for this page') ?></a> - <script type="text/javascript">$('page-help-link').target = 'magento_page_help'</script> -</div> diff --git a/app/code/core/Mage/Backend/view/adminhtml/store/switcher/form/renderer/fieldset.phtml b/app/code/core/Mage/Backend/view/adminhtml/store/switcher/form/renderer/fieldset.phtml index 563d47bb39814658b0c61d84f059ad730ff6bbeb..a894c993279106d7f44ef5c528e2a1ce7e95684e 100644 --- a/app/code/core/Mage/Backend/view/adminhtml/store/switcher/form/renderer/fieldset.phtml +++ b/app/code/core/Mage/Backend/view/adminhtml/store/switcher/form/renderer/fieldset.phtml @@ -26,38 +26,35 @@ ?> <?php $_element = $this->getElement() ?> <?php if ($_element->getFieldsetContainerId()): ?> -<div id="<?php echo $_element->getFieldsetContainerId(); ?>"> -<?php endif; ?> -<?php if ($_element->getLegend()): ?> -<div class="entry-edit-head"> - <h4 class="icon-head head-edit-form fieldset-legend"><?php echo $_element->getLegend() ?></h4> - <div class="form-buttons"><?php echo $_element->getHeaderBar() ?></div> -</div> + <div id="<?php echo $_element->getFieldsetContainerId(); ?>">789 <?php endif; ?> + <?php if (!$_element->getNoContainer()): ?> - <div class="fieldset <?php echo $_element->getClass() ?>" id="<?php echo $_element->getHtmlId() ?>"> + <fieldset class="fieldset <?php echo $_element->getClass() ?>" id="<?php echo $_element->getHtmlId() ?>"> <?php endif; ?> -<div class="store-scope"> - <?php echo $this->getHintHtml() ?> - <div class="tree-store-scope"> - <?php if ($_element->getComment()): ?> + + <?php if ($_element->getLegend()): ?> + <legend class="legend"> + <span><?php echo $_element->getLegend() ?></span> + </legend> + <?php echo $_element->getHeaderBar() ?> + <?php endif; ?> + <?php echo $this->getHintHtml() ?> + <div class="tree-store-scope"> + <?php if ($_element->getComment()): ?> <p class="comment"><?php echo $this->escapeHtml($_element->getComment()) ?></p> - <?php endif; ?> - <?php if ($_element->hasHtmlContent()): ?> - <?php echo $_element->getHtmlContent(); ?> - <?php else: ?> - <table cellspacing="0" class="<?php echo $_element->hasTableClass() ? $_element->getTableClass() : 'form-list'?>"> - <tbody> + <?php endif; ?> + <?php if ($_element->hasHtmlContent()): ?> + <?php echo $_element->getHtmlContent(); ?> + <?php else: ?> <?php echo $_element->getChildrenHtml(); ?> - </tbody> - </table> - <?php endif; ?> - </div> -</div> - <?php echo $_element->getSubFieldsetHtml() ?> + <?php endif; ?> + </div> +<?php echo $_element->getSubFieldsetHtml() ?> + <?php if (!$_element->getNoContainer()): ?> - </div> + </fieldset> <?php endif; ?> <?php if ($_element->getFieldsetContainerId()): ?> -</div> + </div> <?php endif; ?> diff --git a/app/code/core/Mage/Backend/view/adminhtml/store/switcher/form/renderer/fieldset/element.phtml b/app/code/core/Mage/Backend/view/adminhtml/store/switcher/form/renderer/fieldset/element.phtml index 80f59f566b74f7af04f43ab52aebd2e4ec17483d..6c7fffc5c6439e42c32310bcaa1612f5b747bec5 100644 --- a/app/code/core/Mage/Backend/view/adminhtml/store/switcher/form/renderer/fieldset/element.phtml +++ b/app/code/core/Mage/Backend/view/adminhtml/store/switcher/form/renderer/fieldset/element.phtml @@ -20,31 +20,50 @@ * * @category design * @package default_default - * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) - * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> <?php -$_element = $this->getElement(); -$_note = $_element->getNote(); -$_trId = $_element->getHtmlContainerId(); -$_class = $_element->getFieldsetHtmlClass(); +/* @var $this Mage_Backend_Block_Widget_Form_Renderer_Fieldset_Element */ +$element = $this->getElement(); +$note = $element->getNote() ? '<div class="note">' . $element->getNote() . '</div>' : ''; +$elementBeforeLabel = $element->getExtType() == 'checkbox' || $element->getExtType() == 'radio'; +$addOn = $element->getBeforeElementHtml() || $element->getAfterElementHtml(); +$fieldId = ($element->getHtmlContainerId()) ? ' id="' . $element->getHtmlContainerId() . '"' : ''; +$fieldClass = "field field-{$element->getId()} {$element->getCssClass()}"; +$fieldClass .= ($elementBeforeLabel) ? ' choice' : ''; +$fieldClass .= ($addOn) ? ' with-addon' : ''; +$fieldClass .= ($element->getRequired()) ? ' required' : ''; +$fieldClass .= ($note) ? ' with-note' : ''; + +$fieldAttributes = $fieldId . ' class="' . $fieldClass . '" ' + . $this->getUiId('form-field', $element->getId()); ?> -<?php if (!$_element->getNoDisplay()): ?> -<tr<?php if ($_trId): ?> id="<?php echo $_trId ?>"<?php endif; ?>> - <?php if ($_element->getType()=='hidden'): ?> - <td colspan="2" class="hidden"><?php echo trim($_element->getElementHtml()) ?></td> + +<?php if (!$element->getNoDisplay()): ?> + <?php if ($element->getType() == 'hidden'): ?> + <?php echo $element->getElementHtml() ?> <?php else: ?> - <td class="label<?php echo $_class ? " {$_class}-label" : ''?>"><?php echo trim($_element->getLabelHtml()) ?></td> - <td class="<?php echo $_element->hasValueClass() ? $_element->getValueClass() : 'value' ?><?php echo $_class ? " {$_class}-value" : ''?>"> - <div class="store-scope"> - <?php echo trim($_element->getElementHtml()) ?> - <?php echo $this->getHintHtml() ?> + <div<?php echo $fieldAttributes ?>> + <?php if ($elementBeforeLabel): ?> + <?php echo $element->getElementHtml() ?> + <?php echo $element->getLabelHtml() ?> + <?php echo $note ?> + <?php else: ?> + <?php echo $element->getLabelHtml() ?> + <div class="control"> + <?php echo ($addOn) ? '<div class="addon">' . $element->getElementHtml() . '</div>' : $element->getElementHtml(); ?> + <?php echo $note ?> + </div> + <?php endif; ?> + <?php if ($element->getScopeLabel()): ?> + <div class="field-service" value-scope="<?php echo $element->getScopeLabel()?>"> + </div> + <?php endif;?> + <div class="tooltip"> + <span class="help"><?php echo $this->getHintHtml() ?></span> </div> - <?php if ($_note): ?> - <p class="note<?php echo $_class ? " {$_class}-note" : ''?>" id="note_<?php echo $_element->getId()?>"><span><?php echo $_note ?></span></p> - <?php endif ?> - </td> + </div> <?php endif; ?> -</tr> <?php endif; ?> diff --git a/app/code/core/Mage/Backend/view/adminhtml/system/config/edit.phtml b/app/code/core/Mage/Backend/view/adminhtml/system/config/edit.phtml index ebb5b8946669894890653d09481a0474ebf87b49..56868d16ab137ecf31155117590d91a6409ffa22 100644 --- a/app/code/core/Mage/Backend/view/adminhtml/system/config/edit.phtml +++ b/app/code/core/Mage/Backend/view/adminhtml/system/config/edit.phtml @@ -33,20 +33,12 @@ * getForm() - html */ ?> - -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td> - <h3<?php if ($this->getHeaderCss()): ?> class="<?php echo $this->getHeaderCss()?>"<?php endif; ?>><?php echo Mage::helper('Mage_Backend_Helper_Data')->__($this->getTitle()) ?></h3> - </td> - <td class="form-buttons"><?php echo $this->getSaveButtonHtml() ?></td> - </tr> - </table> -</div> +<div class="page-actions"><?php echo $this->getSaveButtonHtml() ?></div> <form action="<?php echo $this->getSaveUrl() ?>" method="post" id="config-edit-form" enctype="multipart/form-data"> <?php echo $this->getBlockHtml('formkey')?> - <?php echo $this->getChildHtml('form') ?> + <div class="accordion"> + <?php echo $this->getChildHtml('form') ?> + </div> </form> <script type="text/javascript"> jQuery('#config-edit-form').mage('form').mage('validation'); diff --git a/app/code/core/Mage/Backend/view/adminhtml/system/config/system/storage/media/synchronize.phtml b/app/code/core/Mage/Backend/view/adminhtml/system/config/system/storage/media/synchronize.phtml index 09e9506128d9c968026c267d4dae4eaf86ca3241..e5d0dce7020d57717b9de3b1ce584c9d4c0058f9 100644 --- a/app/code/core/Mage/Backend/view/adminhtml/system/config/system/storage/media/synchronize.phtml +++ b/app/code/core/Mage/Backend/view/adminhtml/system/config/system/storage/media/synchronize.phtml @@ -144,8 +144,8 @@ if (response.state == '<?php echo Mage_Core_Model_File_Storage_Flag::STATE_NOTIFIED ?>') { if (response.html && response.html != '') { - $$('div.notification-global').each(function(e) { - if (!e.hasClassName('notification-global-notice')) { + $$('.message-system').each(function(e) { + if (!e.hasClassName('message-system')) { e.hide(); } }); diff --git a/app/code/core/Mage/Backend/view/adminhtml/system/config/tabs.phtml b/app/code/core/Mage/Backend/view/adminhtml/system/config/tabs.phtml index 3f6e4c014fb16317642b76c5a92e46f838c3d98d..dc174ccf1c9afba627b44f274591661092a14917 100644 --- a/app/code/core/Mage/Backend/view/adminhtml/system/config/tabs.phtml +++ b/app/code/core/Mage/Backend/view/adminhtml/system/config/tabs.phtml @@ -30,28 +30,28 @@ <h3><?php echo $this->getTitle() ?></h3> <?php endif ?> <?php if ($this->getTabs()): ?> -<ul id="<?php echo $this->getId() ?>" class="tabs config-tabs"> +<ul id="<?php echo $this->getId() ?>" class="config-nav"> <?php /** @var $_tab Mage_Backend_Model_Config_Structure_Element_Tab */ foreach ($this->getTabs() as $_tab): ?> - <li <?php if ($_tab->getClass()): ?>class="<?php echo $_tab->getClass() ?>"<?php endif ?>> - <dl> - <dt class="label" style=""><?php echo $_tab->getLabel() ?></dt> + <li class="config-nav-block <?php if ($_tab->getClass()): ?><?php echo $_tab->getClass() ?><?php endif ?>"> + <h4 class="title"><?php echo $_tab->getLabel() ?></h4> + <ul class="items"> <?php $_iterator = 1; ?> <?php /** @var $_section Mage_Backend_Model_Config_Structure_Element_Section */ foreach ($_tab->getChildren() as $_section): ?> - <dd> - <a href="<?php echo $this->getSectionUrl($_section) ?>" class="<?php echo $_section->getClass() ?><?php if ($this->isSectionActive($_section)): ?> active<?php endif ?> <?php echo $_tab->getChildren()->isLast($_section) ? 'last' : '' ?>"> - <span> - <?php echo $_section->getLabel() ?> - </span> - </a> - </dd> + <li class="item"> + <a href="<?php echo $this->getSectionUrl($_section) ?>" class="item-nav <?php echo $_section->getClass() ?><?php if ($this->isSectionActive($_section)): ?> active<?php endif ?> <?php echo $_tab->getChildren()->isLast($_section) ? 'last' : '' ?>"> + <span> + <?php echo $_section->getLabel() ?> + </span> + </a> + </li> <?php $_iterator++ ; ?> <?php endforeach; ?> - </dl> + </ul> </li> <?php endforeach; diff --git a/app/code/core/Mage/Backend/view/adminhtml/widget/accordion.phtml b/app/code/core/Mage/Backend/view/adminhtml/widget/accordion.phtml index 91eac6e0c069fa6c9dc21cfd91eeb21ce7aea7b4..56f6a7424f6900dfd306c5dbe0e154338b9dae7a 100644 --- a/app/code/core/Mage/Backend/view/adminhtml/widget/accordion.phtml +++ b/app/code/core/Mage/Backend/view/adminhtml/widget/accordion.phtml @@ -28,12 +28,15 @@ /** * Template for Mage_Backend_Block_Widget_Accordion */ +$items = $this->getItems(); ?> -<dl id="tab_content_<?php echo $this->getHtmlId() ?>" name="tab_content_<?php echo $this->getHtmlId() ?>" class="accordion"> -<?php foreach ($this->getItems() as $_item): ?> - <?php echo $this->getChildHtml($_item->getId()) ?> -<?php endforeach ?> -</dl> -<script type="text/javascript"> - tab_content_<?php echo $this->getHtmlId() ?>AccordionJs = new varienAccordion('tab_content_<?php echo $this->getHtmlId() ?>', '<?php echo $this->getShowOnlyOne() ?>'); -</script> +<?php if(!empty($items)): ?> + <dl id="tab_content_<?php echo $this->getHtmlId() ?>" name="tab_content_<?php echo $this->getHtmlId() ?>" class="accordion"> + <?php foreach ($items as $_item): ?> + <?php echo $this->getChildHtml($_item->getId()) ?> + <?php endforeach ?> + </dl> + <script type="text/javascript"> + tab_content_<?php echo $this->getHtmlId() ?>AccordionJs = new varienAccordion('tab_content_<?php echo $this->getHtmlId() ?>', '<?php echo $this->getShowOnlyOne() ?>'); + </script> +<?php endif; ?> diff --git a/app/code/core/Mage/Backend/view/adminhtml/widget/button.phtml b/app/code/core/Mage/Backend/view/adminhtml/widget/button.phtml index 4005ef6c931d87d72e9b5e871faf44ecbc78d32a..5e093dc51bd614917fe043549e08d2d4483ee587 100644 --- a/app/code/core/Mage/Backend/view/adminhtml/widget/button.phtml +++ b/app/code/core/Mage/Backend/view/adminhtml/widget/button.phtml @@ -31,6 +31,6 @@ ?> <?php echo $this->getBeforeHtml(); ?> <button <?php echo $this->getAttributesHtml(), $this->getUiId(); ?>> - <span><span><span><?php echo $this->getLabel(); ?></span></span></span> + <span><?php echo $this->getLabel(); ?></span> </button> <?php echo $this->getAfterHtml(); ?> diff --git a/app/code/core/Mage/Backend/view/adminhtml/widget/button/split.phtml b/app/code/core/Mage/Backend/view/adminhtml/widget/button/split.phtml index 2d0e80a9336c9ffd31b23a6b0af80835d1fbce2d..539ac0702f0e50690e3231fa2e1d9730526b6b42 100644 --- a/app/code/core/Mage/Backend/view/adminhtml/widget/button/split.phtml +++ b/app/code/core/Mage/Backend/view/adminhtml/widget/button/split.phtml @@ -29,25 +29,28 @@ /** @var $_helper Mage_Core_Helper_Data */ $_helper = $this->helper('Mage_Core_Helper_Data'); ?> -<div id="<?php echo $this->getId(); ?>" class="buttons-group widget-button-split <?php echo $this->getButtonClass() ?: '' ?>"> - <div id="<?php echo $this->getId(); ?>-main-button" class="main-control button <?php echo $this->getClass() ?: '' ?>"<?php echo $this->getUiId(); ?>> + +<div id="<?php echo $this->getId(); ?>" class="actions-split <?php echo $this->getButtonClass() ?: '' ?>"> + <button class="action-default primary <?php echo $this->getClass() ?: '' ?>" <?php echo $this->getUiId(); ?>> <span><?php echo $this->escapeHtml($this->getLabel()); ?></span> - </div> - <div class="button btn-toggle" data-toggle="dropdown" <?php echo $this->getUiId('dropdown'); ?>><span>Select</span></div> + </button> + <button class="action-toggle primary" data-toggle="dropdown" <?php echo $this->getUiId('dropdown'); ?>> + <span>Select</span> + </button> <ul class="dropdown-menu" <?php echo $this->getUiId("dropdown-menu"); ?>> <?php foreach ($this->getOptions() as $key => $option): ?> <li> <span class="item<?php if (!empty($option['default'])):?> item-default<?php endif; ?>" - <?php + <?php echo isset($option['id']) ? ' id="' . $this->getId() . '-' . $option['id'] . '"' : '', - isset($option['onclick']) ? 'onclick="' . $option['onclick'] . '"' : '', - $this->getUiId(isset($option['id']) ? $option['id'] : 'item' . '-' . $key); + isset($option['onclick']) ? 'onclick="' . $option['onclick'] . '"' : '', + $this->getUiId(isset($option['id']) ? $option['id'] : 'item' . '-' . $key); if (isset($option['data_attribute'])) { foreach ($option['data_attribute'] as $dataKey => $data) { echo ' data-', $dataKey, '="', $_helper->escapeHtml($_helper->jsonEncode($data)), '"'; } } - ?>> + ?>> <?php echo $this->escapeHtml($option['label']); ?> </span> <?php if (isset($option['hint'])): ?> @@ -61,18 +64,14 @@ $_helper = $this->helper('Mage_Core_Helper_Data'); <?php endforeach; ?> </ul> </div> -<script> -jQuery(function($) { - $('.widget-button-split') - .on('click.splitToggle', '.btn-toggle', function(event) { - if (!$(event.target).is('.disabled')) { - $(this).toggleClass('active').parent().toggleClass('active'); - } - }) - .on('click.splitDefault', '.main-control', function(event) { - if (!$(event.target).is('.disabled')) { + +<script type="text/javascript"> + (function($) { + 'use strict'; + + $('.actions-split') + .on('click.splitDefault', '.action-default', function() { $(this).siblings('.dropdown-menu').find('.item-default').trigger('click'); - } - }); -}); + }); + })(window.jQuery); </script> diff --git a/app/code/core/Mage/Backend/view/adminhtml/widget/form.phtml b/app/code/core/Mage/Backend/view/adminhtml/widget/form.phtml index 965e373752dd43559d822d5817743d6d7256cc9e..a5ceaeb20539b10b25a050d4f8449a5a92e71955 100644 --- a/app/code/core/Mage/Backend/view/adminhtml/widget/form.phtml +++ b/app/code/core/Mage/Backend/view/adminhtml/widget/form.phtml @@ -25,7 +25,8 @@ */ /** $this Mage_Backend_Block_Widget_Form */ ?> -<div class="entry-edit"> +<?php /* @todo replace .form-inline with better class name */?> +<div class="entry-edit form-inline"> <?php echo $this->getFormHtml();?> </div> <?php echo $this->getChildHtml('form_after');?> diff --git a/app/code/core/Mage/Backend/view/adminhtml/widget/form/container.phtml b/app/code/core/Mage/Backend/view/adminhtml/widget/form/container.phtml index 63964c7497e0c742ff474c37005cb2aaf0c245ae..1069523530631820e087671632987f7ca4446728 100644 --- a/app/code/core/Mage/Backend/view/adminhtml/widget/form/container.phtml +++ b/app/code/core/Mage/Backend/view/adminhtml/widget/form/container.phtml @@ -30,10 +30,7 @@ */ ?> <?php echo $this->getFormInitScripts() ?> -<div class="content-header" <?php echo $this->getUiId('content-header') ?>> - <?php echo $this->getHeaderHtml() ?> - <p class="form-buttons"><?php echo $this->getButtonsHtml('header') ?></p> -</div> +<div class="page-actions" <?php echo $this->getUiId('content-header') ?>><?php echo $this->getButtonsHtml('header') ?></div> <?php echo $this->getFormHtml() ?> <?php if ($this->hasFooterButtons()): ?> <div class="content-footer"> diff --git a/app/code/core/Mage/Backend/view/adminhtml/widget/form/element.phtml b/app/code/core/Mage/Backend/view/adminhtml/widget/form/element.phtml index 2ad108006f6ad9841e4e500318266d4e8c12efc0..306240644c15e16b870888271e7c57668e0ffc0f 100644 --- a/app/code/core/Mage/Backend/view/adminhtml/widget/form/element.phtml +++ b/app/code/core/Mage/Backend/view/adminhtml/widget/form/element.phtml @@ -27,9 +27,8 @@ <?php switch ($element->getType()){ case 'fieldset': ?> - <h3><?php echo $element->getLegend() ?></h3> <fieldset> - <legend><?php echo $element->getLegend() ?></legend> + <legend><?php echo $element->getLegend() ?></legend><br /> <?php foreach ($element->getElements() as $_element): ?> <?php echo $formBlock->drawElement($_element) ?> <?php endforeach; ?> diff --git a/app/code/core/Mage/Backend/view/adminhtml/widget/form/renderer/fieldset.phtml b/app/code/core/Mage/Backend/view/adminhtml/widget/form/renderer/fieldset.phtml index bc6732d762d54e0c9968ebfe4f6dc8164321e5f7..21fe279f4781eb7ab9421c42ccaf337ae3a8e5b8 100644 --- a/app/code/core/Mage/Backend/view/adminhtml/widget/form/renderer/fieldset.phtml +++ b/app/code/core/Mage/Backend/view/adminhtml/widget/form/renderer/fieldset.phtml @@ -24,67 +24,100 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<?php /** @var $_element Varien_Data_Form_Element_Fieldset */ ?> -<?php $_element = $this->getElement() ?> -<?php if ($_element->getFieldsetContainerId()): ?> -<div id="<?php echo $_element->getFieldsetContainerId(); ?>"<?php echo $_element->serialize(array('style')) ?>> -<?php endif; ?> -<?php if ($_element->getLegend()): ?> -<div class="entry-edit-head"<?php echo $_element->serialize(array('style')) ?> - id="head-<?php echo $_element->getHtmlId() ?>"> - <h4 class="icon-head head-edit-form fieldset-legend"><?php echo $_element->getLegend() ?></h4> - <div class="form-buttons"><?php echo $_element->getHeaderBar() ?></div> -</div> -<?php endif; ?> -<?php if (!$_element->getNoContainer()): ?> - <div class="fieldset <?php echo $_element->getClass() ?>" id="<?php echo $_element->getHtmlId() ?>" - <?php echo $_element->serialize(array('style')) ?>> +<?php +/** @var $element Varien_Data_Form_Element_Fieldset */ +$element = $this->getElement(); +$containerId = $element->getFieldsetContainerId(); +$id = $element->getHtmlId(); +$isCollapsable = $element->getCollapsable(); +$isWrapped = $containerId || $element->getHeaderBar() || $isCollapsable; +$titleActions = $element->getHeaderBar() ? '<div class="actions">' . $element->getHeaderBar() . '</div>' : ''; +$isField = $element->getFieldsetType() == 'field'; +$advancedAfter = $element->getAdvancedPosition() == 'after'; // To place advanced options inside or after fieldset + +$cssClass = ($isField) ? 'field ' . $element->getClass() : 'fieldset ' . $element->getClass(); + +if ($isField) { + $count = $element->getCountBasicChildren(); + $cssClass .= ($element->hasAdvanced()) ? ' complex' : ''; +} +?> + +<?php +/** +* @todo investigate situations, when the following is needed: +* echo $element->getHeaderBar(); +* echo $element->getSubFieldsetHtml(); +*/ ?> + +<?php if ($isWrapped): ?> + <div class="fieldset-wrapper" id="<?php echo $containerId ? $containerId : $id . '-wrapper';?>"> + <div class="fieldset-wrapper-title"> + <strong class="title"<?php echo ($isCollapsable) ? ' data-toggle="collapse" data-target="#' . $id . '-content"' : ''; ?>> + <span><?php echo $element->getLegend() ?></span> + </strong> + <?php echo $titleActions; ?> + </div> + <div class="fieldset-wrapper-content<?php echo ($isCollapsable) ? ' collapse' : ''; ?>" id="<?php echo $id ?>-content"> <?php endif; ?> - <div class="hor-scroll"> - <?php if ($_element->getComment()): ?> - <p class="comment"><?php echo $this->escapeHtml($_element->getComment()) ?></p> + + <?php if (!$element->getNoContainer()): ?> + <fieldset class="<?php echo $cssClass ?>" id="<?php echo $id ?>"> + <?php if ($element->getLegend() && !$isWrapped): ?> + <legend class="<?php echo $isField ? 'label' : 'legend'?>"> + <span><?php echo $element->getLegend() ?></span> + </legend><br /> <?php endif; ?> - <?php if ($_element->hasHtmlContent()): ?> - <?php echo $_element->getHtmlContent(); ?> - <?php else: ?> - <table cellspacing="0" class="<?php echo $_element->hasTableClass() ? $_element->getTableClass() : 'form-list'?>"> - <tbody> - <?php echo $_element->getBasicChildrenHtml(); ?> - </tbody> - </table> - <?php if ($_element->hasAdvanced()): ?> - <div style="border:1px solid #d3d3d3;"> - <h3 style="padding-left: 2em; cursor: " id="advanced_block_title"> <span id="advanced_block_indicator">+</span> <?php echo $_element->getAdvancedLabel() ?></h3> - <div style="padding: 0em; display:none;" id="advanced_block_content"> - <table cellspacing="0" class="<?php echo $_element->hasTableClass() ? $_element->getTableClass() : 'form-list'?>"> - <tbody> - <?php echo $_element->getAdvancedChildrenHtml(); ?> - </tbody> - </table> - </div> - </div> - <script type="text/javascript"> - (function($) { - $(function() { - $( "#advanced_block_title" ).click(function() { - $('#advanced_block_content').toggle(); - if ($('#advanced_block_content').css('display') == 'block') { - $('#advanced_block_indicator').html('-'); - } else { - $('#advanced_block_indicator').html('+'); - - } - }); - }); - })(jQuery); - </script> + <?php endif; ?> + + <?php if ($element->getComment() && !$isField): ?> + <div class="comment"><?php echo $this->escapeHtml($element->getComment()) ?></div> + <?php endif; ?> + + <?php echo ($isField) ? '<div class="control">' : ''; ?> + + <?php if ($element->hasHtmlContent() && !$isField): ?> + <?php echo $element->getHtmlContent(); ?> + <?php else: ?> + + <?php if ($isField && $count > 1):?> + <div class="fields-group-<?php echo $count?>"> <?php endif; ?> + + <?php echo $element->getBasicChildrenHtml(); ?> + + <?php echo ($isField && $count > 1) ? '</div>' : '' ?> + + <?php if ($element->getComment() && $isField): ?> + <div class="note"><?php echo $this->escapeHtml($element->getComment()) ?></div> <?php endif; ?> + + <?php if ($element->hasAdvanced() && !$isField): ?> + <?php echo (!$element->getNoContainer() && $advancedAfter) ? '</fieldset>' : ''?> + <details class="details" id="details<?php echo $id ?>"> + <summary class="details-summary" id="details-summary<?php echo $id ?>"> + <span><?php echo $element->getAdvancedLabel() ?></span> + </summary> + <div class="details-content" id="details-content<?php echo $id ?>"> + <?php echo $element->getAdvancedChildrenHtml(); ?> + </div> + </details> + <?php elseif ($element->hasAdvanced() && $isField): ?> + <div class="nested" id="nested<?php echo $id ?>"> + <?php echo $element->getAdvancedChildrenHtml(); ?> + </div> + <?php endif; ?> + + <?php echo ($isField) ? '</div>' : ''; ?> + + <?php endif; ?> + + + <?php if (!$element->getNoContainer() && !$advancedAfter): ?> + </fieldset> + <?php endif; ?> + +<?php if ($isWrapped): ?> + </div> </div> - <?php echo $_element->getSubFieldsetHtml() ?> -<?php if (!$_element->getNoContainer()): ?> - </div> -<?php endif; ?> -<?php if ($_element->getFieldsetContainerId()): ?> -</div> <?php endif; ?> diff --git a/app/code/core/Mage/Backend/view/adminhtml/widget/form/renderer/fieldset/element.phtml b/app/code/core/Mage/Backend/view/adminhtml/widget/form/renderer/fieldset/element.phtml index 14e1819d21d29499bece1495de007e6c2bd62c97..d17598f1c6f8b618a39f0e5f637f6d3a0d7a37cc 100644 --- a/app/code/core/Mage/Backend/view/adminhtml/widget/form/renderer/fieldset/element.phtml +++ b/app/code/core/Mage/Backend/view/adminhtml/widget/form/renderer/fieldset/element.phtml @@ -26,23 +26,41 @@ ?> <?php /* @var $this Mage_Backend_Block_Widget_Form_Renderer_Fieldset_Element */ -$_element = $this->getElement(); -$_note = $_element->getNote(); -$_trId = $_element->getHtmlContainerId(); -$_class = $_element->getFieldsetHtmlClass(); +$element = $this->getElement(); +$note = $element->getNote() ? '<div class="note">' . $element->getNote() . '</div>' : ''; +$elementBeforeLabel = $element->getExtType() == 'checkbox' || $element->getExtType() == 'radio'; +$addOn = $element->getBeforeElementHtml() || $element->getAfterElementHtml(); +$fieldId = ($element->getHtmlContainerId()) ? ' id="' . $element->getHtmlContainerId() . '"' : ''; +$fieldClass = "field field-{$element->getId()} {$element->getCssClass()}"; +$fieldClass .= ($elementBeforeLabel) ? ' choice' : ''; +$fieldClass .= ($addOn) ? ' with-addon' : ''; +$fieldClass .= ($element->getRequired()) ? ' required' : ''; +$fieldClass .= ($note) ? ' with-note' : ''; + +$fieldAttributes = $fieldId . ' class="' . $fieldClass . '" ' + . $this->getUiId('form-field', $element->getId()); ?> -<?php if (!$_element->getNoDisplay()): ?> -<tr<?php if ($_trId): ?> id="<?php echo $_trId ?>"<?php endif; ?> <?php echo $this->getUiId('form-row',$_element->getId()) ?>> - <?php if ($_element->getType()=='hidden'): ?> - <td colspan="2" class="hidden" <?php echo $this->getUiId($_element->getId()) ?>><?php echo trim($_element->getElementHtml()) ?></td> + +<?php if (!$element->getNoDisplay()): ?> + <?php if ($element->getType() == 'hidden'): ?> + <?php echo $element->getElementHtml() ?> <?php else: ?> - <td class="label<?php echo $_class ? " {$_class}-label" : ''?>" <?php echo $this->getUiId('cell', $_element->getId(), 'label') ?>><?php echo trim($_element->getLabelHtml()) ?></td> - <td class="<?php echo $_element->hasValueClass() ? $_element->getValueClass() : 'value' ?><?php echo $_class ? " {$_class}-value" : ''?>" <?php echo $this->getUiId('cell',$_element->getId(), 'value') ?>> - <?php echo trim($_element->getElementHtml()) ?> - <?php if ($_note): ?> - <p class="note<?php echo $_class ? " {$_class}-note" : ''?>" id="note_<?php echo $_element->getId()?>"><span><?php echo $_note ?></span></p> - <?php endif ?> - </td> + <div<?php echo $fieldAttributes ?>> + <?php if ($elementBeforeLabel): ?> + <?php echo $element->getElementHtml() ?> + <?php echo $element->getLabelHtml() ?> + <?php echo $note ?> + <?php else: ?> + <?php echo $element->getLabelHtml() ?> + <div class="control"> + <?php echo ($addOn) ? '<div class="addon">' . $element->getElementHtml() . '</div>' : $element->getElementHtml(); ?> + <?php echo $note ?> + </div> + <?php endif; ?> + <?php if ($element->getScopeLabel()): ?> + <div class="field-service" value-scope="<?php echo $element->getScopeLabel()?>"> + </div> + <?php endif;?> + </div> <?php endif; ?> -</tr> <?php endif; ?> diff --git a/app/code/core/Mage/Backend/view/adminhtml/widget/grid.phtml b/app/code/core/Mage/Backend/view/adminhtml/widget/grid.phtml index dbff31c365f00b1e57061a160922bf055b3d5027..5f17756e836f2ab8ec89dcaceb55196d55629339 100644 --- a/app/code/core/Mage/Backend/view/adminhtml/widget/grid.phtml +++ b/app/code/core/Mage/Backend/view/adminhtml/widget/grid.phtml @@ -39,117 +39,136 @@ $numColumns = sizeof($this->getColumns()); ?> <?php if ($this->getCollection()): ?> - <?php if ($this->canDisplayContainer()): ?> - <?php if ($this->getGridHeader()): ?> - <div class="content-header"> - <table cellspacing="0"> - <tr> - <td style="width:50%;"><h2><?php echo $this->getGridHeader(); ?></h2></td> - </tr> - </table> +<?php if ($this->canDisplayContainer()): ?> + <?php if ($this->getGridHeader()): ?> + <div class="page-title"> + <div class="page-title-inner"> + <h1 class="title"><?php echo $this->getGridHeader(); ?></h1> + </div> </div> <?php endif ?> <div id="<?php echo $this->getId() ?>"> <?php else: ?> <?php echo $this->getMessagesBlock()->getGroupedHtml() ?> - <?php endif; ?> -<?php if ($this->getPagerVisibility() || $this->getExportTypes() || $this->getChildBlock('grid.columnSet')->getFilterVisibility()): ?> - <table cellspacing="0" class="actions"> - <tr> - <?php if ($this->getPagerVisibility()): ?> - <td class="pager"> - <?php echo $this->__('Page') ?> - - <?php $_curPage = $this->getCollection()->getCurPage() ?> - <?php $_lastPage = $this->getCollection()->getLastPageNumber() ?> - <?php if ($_curPage>1): ?> - <a href="#" title="<?php echo $this->__('Previous page') ?>" onclick="<?php echo $this->getJsObjectName() ?>.setPage('<?php echo ($_curPage-1) ?>');return false;" <?php echo $this->getUiId('previous') ?>><img src="<?php echo $this->getViewFileUrl('images/pager_arrow_left.gif') ?>" alt="Go to Previous page" class="arrow"/></a> - <?php else: ?> - <img src="<?php echo $this->getViewFileUrl('images/pager_arrow_left_off.gif') ?>" alt="Go to Previous page" class="arrow"/> + <?php endif; ?> + <?php if ($this->getPagerVisibility() || $this->getExportTypes() || $this->getChildBlock('grid.columnSet')->getFilterVisibility()): ?> + <div class="grid-actions"> + <?php if ($this->getChildBlock('grid.export')): ?> + <div class="export"> + <?php echo $this->getChildHtml('grid.export');?> + </div> <?php endif; ?> + <div class="filter-actions"> + <?php echo $this->getMainButtonsHtml() ?> + </div> + <?php if ($this->getPagerVisibility()): ?> + <div class="pager"> + <?php echo $this->__('Page') ?> - <input type="text" name="<?php echo $this->getVarNamePage() ?>" value="<?php echo $_curPage ?>" class="input-text page" onkeypress="<?php echo $this->getJsObjectName() ?>.inputPage(event, '<?php echo $_lastPage ?>')" <?php echo $this->getUiId('current-page') ?>/> + <?php $_curPage = $this->getCollection()->getCurPage() ?> + <?php $_lastPage = $this->getCollection()->getLastPageNumber() ?> + <?php if ($_curPage > 1): ?> + <a href="#" title="<?php echo $this->__('Previous page') ?>" + onclick="<?php echo $this->getJsObjectName() ?>.setPage('<?php echo ($_curPage - 1) ?>');return false;" <?php echo $this->getUiId('previous') ?>><img + src="<?php echo $this->getViewFileUrl('images/pager_arrow_left.gif') ?>" + alt="Go to Previous page" class="arrow"/></a> + <?php else: ?> + <img src="<?php echo $this->getViewFileUrl('images/pager_arrow_left_off.gif') ?>" + alt="Go to Previous page" class="arrow"/> + <?php endif; ?> - <?php if ($_curPage < $_lastPage): ?> - <a href="#" title="<?php echo $this->__('Next page') ?>" onclick="<?php echo $this->getJsObjectName() ?>.setPage('<?php echo ($_curPage+1) ?>');return false;"<?php echo $this->getUiId('next') ?>><img src="<?php echo $this->getViewFileUrl('images/pager_arrow_right.gif') ?>" alt="Go to Next page" class="arrow"/></a> - <?php else: ?> - <img src="<?php echo $this->getViewFileUrl('images/pager_arrow_right_off.gif') ?>" alt="Go to Previous page" class="arrow"/> - <?php endif; ?> + <input type="text" name="<?php echo $this->getVarNamePage() ?>" value="<?php echo $_curPage ?>" + class="input-text page" + onkeypress="<?php echo $this->getJsObjectName() ?>.inputPage(event, '<?php echo $_lastPage ?>')" <?php echo $this->getUiId('current-page') ?>/> + + <?php if ($_curPage < $_lastPage): ?> + <a href="#" title="<?php echo $this->__('Next page') ?>" + onclick="<?php echo $this->getJsObjectName() ?>.setPage('<?php echo ($_curPage + 1) ?>');return false;"<?php echo $this->getUiId('next') ?>><img + src="<?php echo $this->getViewFileUrl('images/pager_arrow_right.gif') ?>" + alt="Go to Next page" class="arrow"/></a> + <?php else: ?> + <img src="<?php echo $this->getViewFileUrl('images/pager_arrow_right_off.gif') ?>" + alt="Go to Previous page" class="arrow"/> + <?php endif; ?> - <?php echo $this->__('of %s pages', $this->getCollection()->getLastPageNumber()) ?> - <span class="separator">|</span> - <?php echo $this->__('View') ?> - <select name="<?php echo $this->getVarNameLimit() ?>" onchange="<?php echo $this->getJsObjectName() ?>.loadByElement(this)" <?php echo $this->getUiId('per-page') ?>> - <option value="20"<?php if ($this->getCollection()->getPageSize()==20): ?> selected="selected"<?php endif; ?>>20</option> - <option value="30"<?php if ($this->getCollection()->getPageSize()==30): ?> selected="selected"<?php endif; ?>>30</option> - <option value="50"<?php if ($this->getCollection()->getPageSize()==50): ?> selected="selected"<?php endif; ?>>50</option> - <option value="100"<?php if ($this->getCollection()->getPageSize()==100): ?> selected="selected"<?php endif; ?>>100</option> - <option value="200"<?php if ($this->getCollection()->getPageSize()==200): ?> selected="selected"<?php endif; ?>>200</option> - </select> - <?php echo $this->__('per page') ?><span class="separator">|</span> - <?php $countRecords = $this->getCollection()->getSize(); ?> - <?php echo $this->__('Total %d records found', $countRecords) ?> - <span id="<?php echo $this->getHtmlId() ?>-total-count" class="total-count no-display"<?php echo $this->getUiId('total-count') ?>><?php echo $countRecords ?></span> - <?php if ($this->getRssLists()): ?> + <?php echo $this->__('of %s pages', $this->getCollection()->getLastPageNumber()) ?> + <span class="separator">|</span> + <?php echo $this->__('View') ?> + <select name="<?php echo $this->getVarNameLimit() ?>" + onchange="<?php echo $this->getJsObjectName() ?>.loadByElement(this)" <?php echo $this->getUiId('per-page') ?>> + <option value="20"<?php if ($this->getCollection()->getPageSize() == 20): ?> + selected="selected"<?php endif; ?>>20 + </option> + <option value="30"<?php if ($this->getCollection()->getPageSize() == 30): ?> + selected="selected"<?php endif; ?>>30 + </option> + <option value="50"<?php if ($this->getCollection()->getPageSize() == 50): ?> + selected="selected"<?php endif; ?>>50 + </option> + <option value="100"<?php if ($this->getCollection()->getPageSize() == 100): ?> + selected="selected"<?php endif; ?>>100 + </option> + <option value="200"<?php if ($this->getCollection()->getPageSize() == 200): ?> + selected="selected"<?php endif; ?>>200 + </option> + </select> + <?php echo $this->__('per page') ?><span class="separator">|</span> + <?php $countRecords = $this->getCollection()->getSize(); ?> + <?php echo $this->__('Total %d records found', $countRecords) ?> + <span id="<?php echo $this->getHtmlId() ?>-total-count" + class="total-count no-display"<?php echo $this->getUiId('total-count') ?>><?php echo $countRecords ?></span> + <?php if ($this->getRssLists()): ?> <?php foreach ($this->getRssLists() as $_rss): ?> - <span class="separator">|</span><a href="<?php echo $_rss->getUrl() ?>" class="link-feed"><?php echo $_rss->getLabel() ?></a> - <?php endforeach ?> - <?php endif; ?> - </td> - <?php endif ?> - <?php if ($this->getChildBlock('grid.export')): ?> - <td class="export a-right"> - <?php echo $this->getChildHtml('grid.export');?> - </td> - <?php endif; ?> - <td class="filter-actions a-right"> - <?php echo $this->getMainButtonsHtml() ?> - </td> - </tr> - </table> -<?php endif; ?> -<?php if ($this->getChildBlock('grid.massaction') && $this->getChildBlock('grid.massaction')->isAvailable()): ?> - <?php echo $this->getChildHtml('grid.massaction') ?> -<?php endif ?> -<div class="grid"> + <span class="separator">|</span><a href="<?php echo $_rss->getUrl() ?>" + class="link-feed"><?php echo $_rss->getLabel() ?></a> + <?php endforeach ?> + <?php endif; ?> + </div> + <?php endif ?> + </div> + <?php endif; ?> + <?php if ($this->getChildBlock('grid.massaction') && $this->getChildBlock('grid.massaction')->isAvailable()): ?> + <?php echo $this->getChildHtml('grid.massaction') ?> + <?php endif ?> <div class="grid"> - <div class="hor-scroll"> - <table cellspacing="0" class="data" id="<?php echo $this->getId() ?>_table"> - <!-- Rendering column set --> - <?php echo $this->getChildHtml('grid.columnSet'); ?> - </table> + <div class="grid"> + <div class="hor-scroll"> + <table cellspacing="0" class="data" id="<?php echo $this->getId() ?>_table"> + <!-- Rendering column set --> + <?php echo $this->getChildHtml('grid.columnSet'); ?> + </table> + </div> </div> </div> -</div> -<?php if ($this->canDisplayContainer()): ?> + <?php if ($this->canDisplayContainer()): ?> </div> <script type="text/javascript"> -//<![CDATA[ - <?php echo $this->getJsObjectName() ?>= new varienGrid('<?php echo $this->getId() ?>', '<?php echo $this->getGridUrl() ?>', '<?php echo $this->getVarNamePage() ?>', '<?php echo $this->getVarNameSort() ?>', '<?php echo $this->getVarNameDir() ?>', '<?php echo $this->getVarNameFilter() ?>'); - <?php echo $this->getJsObjectName() ?>.useAjax = '<?php echo $this->getUseAjax() ?>'; - <?php if ($this->getRowClickCallback()): ?> + //<![CDATA[ + <?php echo $this->getJsObjectName() ?>= new varienGrid('<?php echo $this->getId() ?>', '<?php echo $this->getGridUrl() ?>', '<?php echo $this->getVarNamePage() ?>', '<?php echo $this->getVarNameSort() ?>', '<?php echo $this->getVarNameDir() ?>', '<?php echo $this->getVarNameFilter() ?>'); + <?php echo $this->getJsObjectName() ?>.useAjax = '<?php echo $this->getUseAjax() ?>'; + <?php if ($this->getRowClickCallback()): ?> <?php echo $this->getJsObjectName() ?>.rowClickCallback = <?php echo $this->getRowClickCallback() ?>; - <?php endif; ?> - <?php if ($this->getCheckboxCheckCallback()): ?> + <?php endif; ?> + <?php if ($this->getCheckboxCheckCallback()): ?> <?php echo $this->getJsObjectName() ?>.checkboxCheckCallback = <?php echo $this->getCheckboxCheckCallback() ?>; - <?php endif; ?> - <?php if ($this->getSortableUpdateCallback()): ?> + <?php endif; ?> + <?php if ($this->getSortableUpdateCallback()): ?> <?php echo $this->getJsObjectName() ?>.sortableUpdateCallback = <?php echo $this->getSortableUpdateCallback()?>; - <?php endif; ?> - <?php echo $this->getJsObjectName() ?>.bindSortable(); - <?php if ($this->getRowInitCallback()): ?> + <?php endif; ?> + <?php echo $this->getJsObjectName() ?>.bindSortable(); + <?php if ($this->getRowInitCallback()): ?> <?php echo $this->getJsObjectName() ?>.initRowCallback = <?php echo $this->getRowInitCallback() ?>; <?php echo $this->getJsObjectName() ?>.initGridRows(); - <?php endif; ?> - <?php if ($this->getChildBlock('grid.massaction') && $this->getChildBlock('grid.massaction')->isAvailable()): ?> - <?php echo $this->getChildBlock('grid.massaction')->getJavaScript() ?> - <?php endif ?> - <?php echo $this->getAdditionalJavaScript(); ?> -//]]> + <?php endif; ?> + <?php if ($this->getChildBlock('grid.massaction') && $this->getChildBlock('grid.massaction')->isAvailable()): ?> + <?php echo $this->getChildBlock('grid.massaction')->getJavaScript() ?> + <?php endif ?> + <?php echo $this->getAdditionalJavaScript(); ?> + //]]> </script> -<?php endif; ?> + <?php endif; ?> <?php if ($this->getChildBlock('grid.js')): ?> - <?php echo $this->getChildHtml('grid.js');?> -<?php endif;?> + <?php echo $this->getChildHtml('grid.js'); ?> + <?php endif; ?> <?php endif ?> diff --git a/app/code/core/Mage/Backend/view/adminhtml/widget/grid/container.phtml b/app/code/core/Mage/Backend/view/adminhtml/widget/grid/container.phtml index 0a3d9a8f26839ea5654d663fc02deca84185095f..214639b1f07570755979af0970c28c48a87dbc96 100644 --- a/app/code/core/Mage/Backend/view/adminhtml/widget/grid/container.phtml +++ b/app/code/core/Mage/Backend/view/adminhtml/widget/grid/container.phtml @@ -24,14 +24,5 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td style="<?php echo $this->getHeaderWidth() ?>"><?php echo $this->getHeaderHtml() ?></td> - <td class="form-buttons"><?php echo $this->getButtonsHtml() ?></td> - </tr> - </table> -</div> -<div> - <?php echo $this->getGridHtml() ?> -</div> +<div class="page-actions"><?php echo $this->getButtonsHtml() ?></div> +<?php echo $this->getGridHtml() ?> diff --git a/app/code/core/Mage/Backend/view/adminhtml/widget/grid/export.phtml b/app/code/core/Mage/Backend/view/adminhtml/widget/grid/export.phtml index 7e41f72e168335428dbb881408d2c3a456665585..afef21508f216c6d7c02a1f29d3306ef431d977b 100644 --- a/app/code/core/Mage/Backend/view/adminhtml/widget/grid/export.phtml +++ b/app/code/core/Mage/Backend/view/adminhtml/widget/grid/export.phtml @@ -25,7 +25,7 @@ */ ?> -<img src="<?php echo $this->getViewFileUrl('images/icon_export.gif') ?>" alt="" class="v-middle"/> <?php echo $this->__('Export to:') ?> +<?php echo $this->__('Export to:') ?> <select name="<?php echo $this->getId() ?>_export" id="<?php echo $this->getId() ?>_export" style="width:8em;"> <?php foreach ($this->getExportTypes() as $_type): ?> <option value="<?php echo $_type->getUrl() ?>"><?php echo $_type->getLabel() ?></option> diff --git a/app/code/core/Mage/Backend/view/adminhtml/widget/grid/extended.phtml b/app/code/core/Mage/Backend/view/adminhtml/widget/grid/extended.phtml index 6c76ad7e36f76157d93be5f408b6a8740ff5c2e5..99eef185e90f7668e546a730d1f963eaca08e8ac 100644 --- a/app/code/core/Mage/Backend/view/adminhtml/widget/grid/extended.phtml +++ b/app/code/core/Mage/Backend/view/adminhtml/widget/grid/extended.phtml @@ -41,192 +41,210 @@ $numColumns = sizeof($this->getColumns()); */ ?> <?php if ($this->getCollection()): ?> - <?php if ($this->canDisplayContainer()): ?> - <?php if ($this->getGridHeader()): ?> - <div class="content-header"> - <table cellspacing="0"> - <tr> - <td style="width:50%;"><h2><?php echo $this->getGridHeader(); ?></h2></td> - </tr> - </table> +<?php if ($this->canDisplayContainer()): ?> + <?php if ($this->getGridHeader()): ?> + <div class="page-title"> + <div class="page-title-inner"> + <h1 class="title"><?php echo $this->getGridHeader(); ?></h1> + </div> </div> <?php endif ?> <div id="<?php echo $this->getId() ?>"> <?php else: ?> <?php echo $this->getMessagesBlock()->getGroupedHtml() ?> - <?php endif; ?> -<?php if ($this->getPagerVisibility() || $this->getExportTypes() || $this->getFilterVisibility()): ?> - <table cellspacing="0" class="actions"> - <tr> - <?php if ($this->getPagerVisibility()): ?> - <td class="pager"> - <?php echo $this->__('Page') ?> - - <?php $_curPage = $this->getCollection()->getCurPage() ?> - <?php $_lastPage = $this->getCollection()->getLastPageNumber() ?> - <?php if ($_curPage>1): ?> - <a href="#" title="<?php echo $this->__('Previous page') ?>" onclick="<?php echo $this->getJsObjectName() ?>.setPage('<?php echo ($_curPage-1) ?>');return false;"><img src="<?php echo $this->getViewFileUrl('images/pager_arrow_left.gif') ?>" alt="Go to Previous page" class="arrow"/></a> - <?php else: ?> - <img src="<?php echo $this->getViewFileUrl('images/pager_arrow_left_off.gif') ?>" alt="Go to Previous page" class="arrow"/> + <?php endif; ?> + <?php if ($this->getPagerVisibility() || $this->getExportTypes() || $this->getFilterVisibility()): ?> + <div class="grid-actions"> + <div class="filter-actions"> + <?php echo $this->getMainButtonsHtml() ?> + </div> + <?php if ($this->getExportTypes()): ?> + <div class="export"> + <?php echo $this->__('Export to:') ?> + <select name="<?php echo $this->getId() ?>_export" id="<?php echo $this->getId() ?>_export" + style="width:8em;"> + <?php foreach ($this->getExportTypes() as $_type): ?> + <option value="<?php echo $_type->getUrl() ?>"><?php echo $_type->getLabel() ?></option> + <?php endforeach; ?> + </select> + <?php echo $this->getExportButtonHtml() ?> + </div> <?php endif; ?> + <?php if ($this->getPagerVisibility()): ?> + <div class="pager"> + <?php echo $this->__('Page') ?> - <input type="text" name="<?php echo $this->getVarNamePage() ?>" value="<?php echo $_curPage ?>" class="input-text page" onkeypress="<?php echo $this->getJsObjectName() ?>.inputPage(event, '<?php echo $_lastPage ?>')"/> + <?php $_curPage = $this->getCollection()->getCurPage() ?> + <?php $_lastPage = $this->getCollection()->getLastPageNumber() ?> + <?php if ($_curPage > 1): ?> + <a href="#" title="<?php echo $this->__('Previous page') ?>" class="action-previous" onclick="<?php echo $this->getJsObjectName() ?>.setPage('<?php echo ($_curPage - 1) ?>');return false;">Previous Page</a> + <?php else: ?> + <span class="action-previous disabled">Previous Page</span> + <?php endif; ?> - <?php if ($_curPage < $_lastPage): ?> - <a href="#" title="<?php echo $this->__('Next page') ?>" onclick="<?php echo $this->getJsObjectName() ?>.setPage('<?php echo ($_curPage+1) ?>');return false;"><img src="<?php echo $this->getViewFileUrl('images/pager_arrow_right.gif') ?>" alt="Go to Next page" class="arrow"/></a> - <?php else: ?> - <img src="<?php echo $this->getViewFileUrl('images/pager_arrow_right_off.gif') ?>" alt="Go to Previous page" class="arrow"/> - <?php endif; ?> + <input type="text" name="<?php echo $this->getVarNamePage() ?>" value="<?php echo $_curPage ?>" + class="input-text page" + onkeypress="<?php echo $this->getJsObjectName() ?>.inputPage(event, '<?php echo $_lastPage ?>')"/> - <?php echo $this->__('of %s pages', $this->getCollection()->getLastPageNumber()) ?> - <span class="separator">|</span> - <?php echo $this->__('View') ?> - <select name="<?php echo $this->getVarNameLimit() ?>" onchange="<?php echo $this->getJsObjectName() ?>.loadByElement(this)"> - <option value="20"<?php if ($this->getCollection()->getPageSize()==20): ?> selected="selected"<?php endif; ?>>20</option> - <option value="30"<?php if ($this->getCollection()->getPageSize()==30): ?> selected="selected"<?php endif; ?>>30</option> - <option value="50"<?php if ($this->getCollection()->getPageSize()==50): ?> selected="selected"<?php endif; ?>>50</option> - <option value="100"<?php if ($this->getCollection()->getPageSize()==100): ?> selected="selected"<?php endif; ?>>100</option> - <option value="200"<?php if ($this->getCollection()->getPageSize()==200): ?> selected="selected"<?php endif; ?>>200</option> - </select> - <?php echo $this->__('per page') ?><span class="separator">|</span> - <?php echo $this->__('Total %d records found', $this->getCollection()->getSize()) ?> - <span id="<?php echo $this->getHtmlId() ?>-total-count" class="no-display"><?php echo $this->getCollection()->getSize() ?></span> - <?php if ($this->getRssLists()): ?> + <?php if ($_curPage < $_lastPage): ?> + <a href="#" title="<?php echo $this->__('Next page') ?>" class="action-next" onclick="<?php echo $this->getJsObjectName() ?>.setPage('<?php echo ($_curPage + 1) ?>');return false;">Next Page</a> + <?php else: ?> + <span class="action-next disabled">Next page</span> + <?php endif; ?> + + <?php echo $this->__('of %s pages', $this->getCollection()->getLastPageNumber()) ?> + <span class="separator">|</span> + <?php echo $this->__('View') ?> + <select name="<?php echo $this->getVarNameLimit() ?>" + onchange="<?php echo $this->getJsObjectName() ?>.loadByElement(this)"> + <option value="20"<?php if ($this->getCollection()->getPageSize() == 20): ?> + selected="selected"<?php endif; ?>>20 + </option> + <option value="30"<?php if ($this->getCollection()->getPageSize() == 30): ?> + selected="selected"<?php endif; ?>>30 + </option> + <option value="50"<?php if ($this->getCollection()->getPageSize() == 50): ?> + selected="selected"<?php endif; ?>>50 + </option> + <option value="100"<?php if ($this->getCollection()->getPageSize() == 100): ?> + selected="selected"<?php endif; ?>>100 + </option> + <option value="200"<?php if ($this->getCollection()->getPageSize() == 200): ?> + selected="selected"<?php endif; ?>>200 + </option> + </select> + <?php echo $this->__('per page') ?><span class="separator">|</span> + <?php echo $this->__('Total %d records found', $this->getCollection()->getSize()) ?> + <span id="<?php echo $this->getHtmlId() ?>-total-count" + class="no-display"><?php echo $this->getCollection()->getSize() ?></span> + <?php if ($this->getRssLists()): ?> <?php foreach ($this->getRssLists() as $_rss): ?> - <span class="separator">|</span><a href="<?php echo $_rss->getUrl() ?>" class="link-feed"><?php echo $_rss->getLabel() ?></a> - <?php endforeach ?> - <?php endif; ?> - </td> - <?php endif ?> - <?php if ($this->getExportTypes()): ?> - <td class="export a-right"> - <img src="<?php echo $this->getViewFileUrl('images/icon_export.gif') ?>" alt="" class="v-middle"/> <?php echo $this->__('Export to:') ?> - <select name="<?php echo $this->getId() ?>_export" id="<?php echo $this->getId() ?>_export" style="width:8em;"> - <?php foreach ($this->getExportTypes() as $_type): ?> - <option value="<?php echo $_type->getUrl() ?>"><?php echo $_type->getLabel() ?></option> - <?php endforeach; ?> - </select> - <?php echo $this->getExportButtonHtml() ?> - </td> - <?php endif; ?> - <td class="filter-actions a-right"> - <?php echo $this->getMainButtonsHtml() ?> - </td> - </tr> - </table> -<?php endif; ?> -<?php if ($this->getMassactionBlock()->isAvailable()): ?> -<?php echo $this->getMassactionBlockHtml() ?> -<?php endif ?> -<div class="grid"> - <div class="hor-scroll"> - <table cellspacing="0" class="data" id="<?php echo $this->getId() ?>_table"> - <?php foreach ($this->getColumns() as $_column): ?> - <col <?php echo $_column->getHtmlProperty() ?> /> - <?php endforeach; ?> - <?php if ($this->getHeadersVisibility() || $this->getFilterVisibility()): ?> - <thead> - <?php if ($this->getHeadersVisibility()): ?> - <tr class="headings"> - <?php foreach ($this->getColumns() as $_column): ?> - <th<?php echo $_column->getHeaderHtmlProperty() ?>><span class="nobr"><?php echo $_column->getHeaderHtml() ?></span></th> - <?php endforeach; ?> - </tr> + <span class="separator">|</span><a href="<?php echo $_rss->getUrl() ?>" + class="link-feed"><?php echo $_rss->getLabel() ?></a> + <?php endforeach ?> <?php endif; ?> - <?php if ($this->getFilterVisibility()): ?> - <tr class="filter"> - <?php $i=0;foreach ($this->getColumns() as $_column): ?> - <th<?php echo $_column->getHeaderHtmlProperty() ?>><?php echo $_column->getFilterHtml() ?></th> - <?php endforeach; ?> - </tr> - <?php endif ?> - </thead> + </div> + <?php endif ?> + </div> <?php endif; ?> - <?php if ($this->getCountTotals()): ?> - <tfoot> - <tr class="totals"> + <?php if ($this->getMassactionBlock()->isAvailable()): ?> + <?php echo $this->getMassactionBlockHtml() ?> + <?php endif ?> + <div class="grid"> + <div class="hor-scroll"> + <table cellspacing="0" class="data" id="<?php echo $this->getId() ?>_table"> <?php foreach ($this->getColumns() as $_column): ?> - <th class="<?php echo $_column->getCssProperty() ?>"><?php echo ($_column->hasTotalsLabel()) ? $_column->getTotalsLabel() : $_column->getRowField($_column->getGrid()->getTotals()) ?> </th> + <col <?php echo $_column->getHtmlProperty() ?> /> <?php endforeach; ?> + <?php if ($this->getHeadersVisibility() || $this->getFilterVisibility()): ?> + <thead> + <?php if ($this->getHeadersVisibility()): ?> + <tr class="headings"> + <?php foreach ($this->getColumns() as $_column): ?> + <th<?php echo $_column->getHeaderHtmlProperty() ?>> + <span><?php echo $_column->getHeaderHtml() ?></span> + </th> + <?php endforeach; ?> </tr> - </tfoot> - <?php endif; ?> + <?php endif; ?> + <?php if ($this->getFilterVisibility()): ?> + <tr class="filter"> + <?php $i = 0;foreach ($this->getColumns() as $_column): ?> + <th<?php echo $_column->getHeaderHtmlProperty() ?>><?php echo $_column->getFilterHtml() ?></th> + <?php endforeach; ?> + </tr> + <?php endif ?> + </thead> + <?php endif; ?> + <?php if ($this->getCountTotals()): ?> + <tfoot> + <tr class="totals"> + <?php foreach ($this->getColumns() as $_column): ?> + <th class="<?php echo $_column->getCssProperty() ?>"><?php echo ($_column->hasTotalsLabel()) ? $_column->getTotalsLabel() : $_column->getRowField($_column->getGrid()->getTotals()) ?> + </th> + <?php endforeach; ?> + </tr> + </tfoot> + <?php endif; ?> - <tbody> - <?php if (($this->getCollection()->getSize()>0) && (!$this->getIsCollapsed())): ?> - <?php foreach ($this->getCollection() as $_index=>$_item): ?> - <tr title="<?php echo $this->getRowUrl($_item) ?>"<?php if ($_class = $this->getRowClass($_item)):?> class="<?php echo $_class; ?>"<?php endif;?> > - <?php $i=0;foreach ($this->getColumns() as $_column): ?> + <tbody> + <?php if (($this->getCollection()->getSize() > 0) && (!$this->getIsCollapsed())): ?> + <?php foreach ($this->getCollection() as $_index => $_item): ?> + <tr title="<?php echo $this->getRowUrl($_item) ?>"<?php if ($_class = $this->getRowClass($_item)): ?> + class="<?php echo $_class; ?>"<?php endif;?> > + <?php $i = 0;foreach ($this->getColumns() as $_column): ?> - <?php if ($this->shouldRenderCell($_item, $_column)):?> - <?php $_rowspan = $this->getRowspan($_item, $_column);?> - <td <?php echo ($_rowspan ? 'rowspan="' . $_rowspan . '" ' : '') ?>class="<?php echo $_column->getCssProperty() ?> <?php echo ++$i==$numColumns?'last':'' ?>"> - <?php echo (($_html = $_column->getRowField($_item)) != '' ? $_html : ' ') ?> - </td> - <?php if ($this->shouldRenderEmptyCell($_item, $_column)):?> - <td colspan="<?php echo $this->getEmptyCellColspan($_item)?>" class="last"><?php echo $this->getEmptyCellLabel()?></td> - <?php endif;?> - <?php endif;?> + <?php if ($this->shouldRenderCell($_item, $_column)): ?> + <?php $_rowspan = $this->getRowspan($_item, $_column); ?> + <td <?php echo ($_rowspan ? 'rowspan="' . $_rowspan . '" ' : '') ?>class="<?php echo $_column->getCssProperty() ?> <?php echo ++$i == $numColumns ? 'last' : '' ?>"> + <?php echo (($_html = $_column->getRowField($_item)) != '' ? $_html : ' ') ?> + </td> + <?php if ($this->shouldRenderEmptyCell($_item, $_column)): ?> + <td colspan="<?php echo $this->getEmptyCellColspan($_item)?>" + class="last"><?php echo $this->getEmptyCellLabel()?></td> + <?php endif; ?> + <?php endif; ?> - <?php endforeach; ?> - </tr> - <?php if ($_multipleRows = $this->getMultipleRows($_item)):?> - <?php foreach ($_multipleRows as $_i):?> - <tr> - <?php $i=0;foreach ($this->getMultipleRowColumns($_i) as $_column): ?> - <td class="<?php echo $_column->getCssProperty() ?> <?php echo ++$i==$numColumns-1?'last':'' ?>"> - <?php echo (($_html = $_column->getRowField($_i)) != '' ? $_html : ' ') ?> - </td> - <?php endforeach; ?> - </tr> - <?php endforeach;?> - <?php endif;?> + <?php endforeach; ?> + </tr> + <?php if ($_multipleRows = $this->getMultipleRows($_item)): ?> + <?php foreach ($_multipleRows as $_i): ?> + <tr> + <?php $i = 0;foreach ($this->getMultipleRowColumns($_i) as $_column): ?> + <td class="<?php echo $_column->getCssProperty() ?> <?php echo ++$i == $numColumns - 1 ? 'last' : '' ?>"> + <?php echo (($_html = $_column->getRowField($_i)) != '' ? $_html : ' ') ?> + </td> + <?php endforeach; ?> + </tr> + <?php endforeach; ?> + <?php endif; ?> - <?php if ($this->shouldRenderSubTotal($_item)): ?> - <tr class="subtotals"> - <?php $i = 0; foreach ($this->getSubTotalColumns() as $_column): ?> - <td class="<?php echo $_column->getCssProperty() ?> <?php echo ++$i == $numColumns ? 'last' : '' ?>"> - <?php echo ($_column->hasSubtotalsLabel() ? $_column->getSubtotalsLabel() : + <?php if ($this->shouldRenderSubTotal($_item)): ?> + <tr class="subtotals"> + <?php $i = 0; foreach ($this->getSubTotalColumns() as $_column): ?> + <td class="<?php echo $_column->getCssProperty() ?> <?php echo ++$i == $numColumns ? 'last' : '' ?>"> + <?php echo ($_column->hasSubtotalsLabel() ? $_column->getSubtotalsLabel() : $_column->getRowField($this->getSubTotalItem($_item)) ); - ?> - </td> - <?php endforeach; ?> + ?> + </td> + <?php endforeach; ?> + </tr> + <?php endif; ?> + <?php endforeach; ?> + <?php elseif ($this->getEmptyText()): ?> + <tr> + <td class="empty-text <?php echo $this->getEmptyTextClass() ?>" + colspan="<?php echo $numColumns ?>"><?php echo $this->getEmptyText() ?></td> </tr> - <?php endif; ?> - <?php endforeach; ?> - <?php elseif ($this->getEmptyText()): ?> - <tr> - <td class="empty-text <?php echo $this->getEmptyTextClass() ?>" colspan="<?php echo $numColumns ?>"><?php echo $this->getEmptyText() ?></td> - </tr> - <?php endif; ?> - </tbody> + <?php endif; ?> + </tbody> - </table> + </table> + </div> </div> -</div> -<?php if ($this->canDisplayContainer()): ?> + <?php if ($this->canDisplayContainer()): ?> </div> <script type="text/javascript"> -//<![CDATA[ - <?php echo $this->getJsObjectName() ?> = new varienGrid('<?php echo $this->getId() ?>', '<?php echo $this->getGridUrl() ?>', '<?php echo $this->getVarNamePage() ?>', '<?php echo $this->getVarNameSort() ?>', '<?php echo $this->getVarNameDir() ?>', '<?php echo $this->getVarNameFilter() ?>'); - <?php echo $this->getJsObjectName() ?>.useAjax = '<?php echo $this->getUseAjax() ?>'; - <?php if ($this->getRowClickCallback()): ?> + //<![CDATA[ + <?php echo $this->getJsObjectName() ?> = new varienGrid('<?php echo $this->getId() ?>', '<?php echo $this->getGridUrl() ?>', '<?php echo $this->getVarNamePage() ?>', '<?php echo $this->getVarNameSort() ?>', '<?php echo $this->getVarNameDir() ?>', '<?php echo $this->getVarNameFilter() ?>'); + <?php echo $this->getJsObjectName() ?>.useAjax = '<?php echo $this->getUseAjax() ?>'; + <?php if ($this->getRowClickCallback()): ?> <?php echo $this->getJsObjectName() ?>.rowClickCallback = <?php echo $this->getRowClickCallback() ?>; - <?php endif; ?> - <?php if ($this->getCheckboxCheckCallback()): ?> + <?php endif; ?> + <?php if ($this->getCheckboxCheckCallback()): ?> <?php echo $this->getJsObjectName() ?>.checkboxCheckCallback = <?php echo $this->getCheckboxCheckCallback() ?>; - <?php endif; ?> - <?php if ($this->getRowInitCallback()): ?> + <?php endif; ?> + <?php if ($this->getRowInitCallback()): ?> <?php echo $this->getJsObjectName() ?>.initRowCallback = <?php echo $this->getRowInitCallback() ?>; <?php echo $this->getJsObjectName() ?>.initGridRows(); - <?php endif; ?> - <?php if ($this->getMassactionBlock()->isAvailable()): ?> - <?php echo $this->getMassactionBlock()->getJavaScript() ?> - <?php endif ?> - <?php echo $this->getAdditionalJavaScript(); ?> -//]]> + <?php endif; ?> + <?php if ($this->getMassactionBlock()->isAvailable()): ?> + <?php echo $this->getMassactionBlock()->getJavaScript() ?> + <?php endif ?> + <?php echo $this->getAdditionalJavaScript(); ?> + //]]> </script> -<?php endif; ?> + <?php endif; ?> <?php endif ?> diff --git a/app/code/core/Mage/Backend/view/adminhtml/widget/grid/massaction.phtml b/app/code/core/Mage/Backend/view/adminhtml/widget/grid/massaction.phtml index a68669fbd91ca9f55e601c0eecae171461824ece..1e9af9773446358470a94f4819e74f4bd39ed9d1 100644 --- a/app/code/core/Mage/Backend/view/adminhtml/widget/grid/massaction.phtml +++ b/app/code/core/Mage/Backend/view/adminhtml/widget/grid/massaction.phtml @@ -25,61 +25,61 @@ */ ?> <div id="<?php echo $this->getHtmlId() ?>"> -<table cellspacing="0" cellpadding="0" class="massaction"> -<tr> - <td><?php if ($this->getUseSelectAll()):?> - <a href="#" onclick="return <?php echo $this->getJsObjectName() ?>.selectAll()"<?php echo $this->getUiId('select','all','link') ?>><?php echo $this->__('Select All') ?></a> - <span class="separator">|</span> - <a href="#" onclick="return <?php echo $this->getJsObjectName() ?>.unselectAll()"<?php echo $this->getUiId('unselect','all','link') ?>><?php echo $this->__('Unselect All') ?></a> - <span class="separator">|</span> - <?php endif; ?> - <a href="#" onclick="return <?php echo $this->getJsObjectName() ?>.selectVisible()"<?php echo $this->getUiId('select','visible','link') ?>><?php echo $this->__('Select Visible') ?></a> - <span class="separator">|</span> - <a href="#" onclick="return <?php echo $this->getJsObjectName() ?>.unselectVisible()"<?php echo $this->getUiId('unselect','visible','link') ?>><?php echo $this->__('Unselect Visible') ?></a> - <span class="separator">|</span> - <strong id="<?php echo $this->getHtmlId() ?>-count">0</strong> <?php echo $this->__('items selected') ?> - </td> - <td> - <div class="right"> - <div class="entry-edit"> - <?php if ($this->getHideFormElement() !== true):?> - <form action="" id="<?php echo $this->getHtmlId() ?>-form" method="post"> - <?php endif ?> - <?php echo $this->getBlockHtml('formkey')?> - <fieldset> - <span class="field-row"> - <label><?php echo $this->__('Actions') ?></label> - <select id="<?php echo $this->getHtmlId() ?>-select" class="required-entry select absolute-advice local-validation"<?php echo $this->getUiId('select') ?>> - <option value=""></option> - <?php foreach ($this->getItems() as $_item):?> - <option value="<?php echo $_item->getId() ?>"<?php echo ($_item->getSelected() ? ' selected="selected"' : '')?>><?php echo $_item->getLabel() ?></option> - <?php endforeach; ?> - </select> - </span> - <span class="outer-span" id="<?php echo $this->getHtmlId() ?>-form-hiddens"></span> - <span class="outer-span" id="<?php echo $this->getHtmlId() ?>-form-additional"></span> - <span class="field-row"> - <?php echo $this->getApplyButtonHtml() ?> - </span> - </fieldset> - <?php if ($this->getHideFormElement() !== true):?> - </form> - <?php endif ?> - </div> - - <div class="no-display"> - <?php foreach ($this->getItems() as $_item): ?> - <div id="<?php echo $this->getHtmlId() ?>-item-<?php echo $_item->getId() ?>-block"> - <?php if ('' != $_item->getBlockName()):?> - <?php echo $this->getChildHtml($_item->getBlockName());?> - <?php endif;?> - </div> - <?php endforeach; ?> +<div class="massaction"> + <div class="entry-edit"> + <?php if ($this->getHideFormElement() !== true):?> + <form action="" id="<?php echo $this->getHtmlId() ?>-form" method="post"> + <?php endif ?> + <?php echo $this->getBlockHtml('formkey')?> + <fieldset> + <span class="field-row"> + <label><?php echo $this->__('Actions') ?></label> + <select id="<?php echo $this->getHtmlId() ?>-select" class="required-entry select absolute-advice local-validation"<?php echo $this->getUiId('select') ?>> + <option value=""></option> + <?php foreach ($this->getItems() as $_item):?> + <option value="<?php echo $_item->getId() ?>"<?php echo ($_item->getSelected() ? ' selected="selected"' : '')?>><?php echo $_item->getLabel() ?></option> + <?php endforeach; ?> + </select> + </span> + <span class="outer-span" id="<?php echo $this->getHtmlId() ?>-form-hiddens"></span> + <span class="outer-span" id="<?php echo $this->getHtmlId() ?>-form-additional"></span> + <span class="field-row"> + <?php echo $this->getApplyButtonHtml() ?> + </span> + </fieldset> + <?php if ($this->getHideFormElement() !== true):?> + </form> + <?php endif ?> + <div class="no-display"> + <?php foreach ($this->getItems() as $_item): ?> + <div id="<?php echo $this->getHtmlId() ?>-item-<?php echo $_item->getId() ?>-block"> + <?php if ('' != $_item->getBlockName()):?> + <?php echo $this->getChildHtml($_item->getBlockName());?> + <?php endif;?> </div> + <?php endforeach; ?> </div> - </td> -</tr> -</table> + </div> + <ul> + <?php if ($this->getUseSelectAll()):?> + <li> + <a href="#" onclick="return <?php echo $this->getJsObjectName() ?>.selectAll()"<?php echo $this->getUiId('select','all','link') ?>><?php echo $this->__('Select All') ?></a> + </li> + <li> + <a href="#" onclick="return <?php echo $this->getJsObjectName() ?>.unselectAll()"<?php echo $this->getUiId('unselect','all','link') ?>><?php echo $this->__('Unselect All') ?></a> + </li> + <?php endif; ?> + <li> + <a href="#" onclick="return <?php echo $this->getJsObjectName() ?>.selectVisible()"<?php echo $this->getUiId('select','visible','link') ?>><?php echo $this->__('Select Visible') ?></a> + </li> + <li> + <a href="#" onclick="return <?php echo $this->getJsObjectName() ?>.unselectVisible()"<?php echo $this->getUiId('unselect','visible','link') ?>><?php echo $this->__('Unselect Visible') ?></a> + </li> + <li> + <strong id="<?php echo $this->getHtmlId() ?>-count">0</strong> <?php echo $this->__('items selected') ?> + </li> + </ul> +</div> <?php if (!$this->getParentBlock()->canDisplayContainer()): ?> <script type="text/javascript"> <?php echo $this->getJsObjectName() ?>.setGridIds('<?php echo $this->getGridIdsJson() ?>'); diff --git a/app/code/core/Mage/Backend/view/adminhtml/widget/grid/massaction_extended.phtml b/app/code/core/Mage/Backend/view/adminhtml/widget/grid/massaction_extended.phtml index 076cc58e634d6909c9584250c00544112aec52f5..8efb5bc41e82041817285760cfacdfb92087a807 100644 --- a/app/code/core/Mage/Backend/view/adminhtml/widget/grid/massaction_extended.phtml +++ b/app/code/core/Mage/Backend/view/adminhtml/widget/grid/massaction_extended.phtml @@ -28,59 +28,59 @@ */ ?> <div id="<?php echo $this->getHtmlId() ?>"> -<table cellspacing="0" cellpadding="0" class="massaction"> -<tr> - <td><?php if ($this->getUseSelectAll()):?> - <a href="#" onclick="return <?php echo $this->getJsObjectName() ?>.selectAll()"><?php echo $this->__('Select All') ?></a> - <span class="separator">|</span> - <a href="#" onclick="return <?php echo $this->getJsObjectName() ?>.unselectAll()"><?php echo $this->__('Unselect All') ?></a> - <span class="separator">|</span> - <?php endif; ?> - <a href="#" onclick="return <?php echo $this->getJsObjectName() ?>.selectVisible()"><?php echo $this->__('Select Visible') ?></a> - <span class="separator">|</span> - <a href="#" onclick="return <?php echo $this->getJsObjectName() ?>.unselectVisible()"><?php echo $this->__('Unselect Visible') ?></a> - <span class="separator">|</span> - <strong id="<?php echo $this->getHtmlId() ?>-count">0</strong> <?php echo $this->__('items selected') ?> - </td> - <td> - <div class="right"> - <div class="entry-edit"> - <?php if ($this->getHideFormElement() !== true):?> - <form action="" id="<?php echo $this->getHtmlId() ?>-form" method="post"> - <?php endif ?> - <?php echo $this->getBlockHtml('formkey')?> - <fieldset> - <span class="field-row"> - <label><?php echo $this->__('Actions') ?></label> - <select id="<?php echo $this->getHtmlId() ?>-select" class="required-entry select absolute-advice local-validation"> - <option value=""></option> - <?php foreach ($this->getItems() as $_item): ?> - <option value="<?php echo $_item->getId() ?>"<?php echo ($_item->getSelected() ? ' selected="selected"' : '')?>><?php echo $_item->getLabel() ?></option> - <?php endforeach; ?> - </select> - </span> - <span class="outer-span" id="<?php echo $this->getHtmlId() ?>-form-hiddens"></span> - <span class="outer-span" id="<?php echo $this->getHtmlId() ?>-form-additional"></span> - <span class="field-row"> - <?php echo $this->getApplyButtonHtml() ?> - </span> - </fieldset> - <?php if ($this->getHideFormElement() !== true):?> - </form> - <?php endif ?> - </div> - - <div class="no-display"> +<div class="massaction"> + <div class="entry-edit"> + <?php if ($this->getHideFormElement() !== true):?> + <form action="" id="<?php echo $this->getHtmlId() ?>-form" method="post"> + <?php endif ?> + <?php echo $this->getBlockHtml('formkey')?> + <fieldset> + <span class="field-row"> + <label><?php echo $this->__('Actions') ?></label> + <select id="<?php echo $this->getHtmlId() ?>-select" class="required-entry select absolute-advice local-validation"> + <option value=""></option> + <?php foreach ($this->getItems() as $_item): ?> + <option value="<?php echo $_item->getId() ?>"<?php echo ($_item->getSelected() ? ' selected="selected"' : '')?>><?php echo $_item->getLabel() ?></option> + <?php endforeach; ?> + </select> + </span> + <span class="outer-span" id="<?php echo $this->getHtmlId() ?>-form-hiddens"></span> + <span class="outer-span" id="<?php echo $this->getHtmlId() ?>-form-additional"></span> + <span class="field-row"> + <?php echo $this->getApplyButtonHtml() ?> + </span> + </fieldset> + <?php if ($this->getHideFormElement() !== true):?> + </form> + <?php endif ?> + <div class="no-display"> <?php foreach ($this->getItems() as $_item): ?> <div id="<?php echo $this->getHtmlId() ?>-item-<?php echo $_item->getId() ?>-block"> <?php echo $_item->getAdditionalActionBlockHtml() ?> </div> <?php endforeach; ?> - </div> </div> - </td> -</tr> -</table> + </div> + <ul> + <?php if ($this->getUseSelectAll()):?> + <li> + <a href="#" onclick="return <?php echo $this->getJsObjectName() ?>.selectAll()"><?php echo $this->__('Select All') ?></a> + </li> + <li> + <a href="#" onclick="return <?php echo $this->getJsObjectName() ?>.unselectAll()"><?php echo $this->__('Unselect All') ?></a> + </li> + <?php endif; ?> + <li> + <a href="#" onclick="return <?php echo $this->getJsObjectName() ?>.selectVisible()"><?php echo $this->__('Select Visible') ?></a> + </li> + <li> + <a href="#" onclick="return <?php echo $this->getJsObjectName() ?>.unselectVisible()"><?php echo $this->__('Unselect Visible') ?></a> + </li> + <li> + <strong id="<?php echo $this->getHtmlId() ?>-count">0</strong> <?php echo $this->__('items selected') ?> + </li> + </ul> +</div> <?php if (!$this->getParentBlock()->canDisplayContainer()): ?> <script type="text/javascript"> <?php echo $this->getJsObjectName() ?>.setGridIds('<?php echo $this->getGridIdsJson() ?>'); diff --git a/app/code/core/Mage/Backend/view/adminhtml/widget/view/container.phtml b/app/code/core/Mage/Backend/view/adminhtml/widget/view/container.phtml index 1063d75d25b50af9cbf3125a9a2258857b593a22..e429e86ce92e43224aab10107f43fe8c05b2d6ba 100644 --- a/app/code/core/Mage/Backend/view/adminhtml/widget/view/container.phtml +++ b/app/code/core/Mage/Backend/view/adminhtml/widget/view/container.phtml @@ -24,14 +24,5 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td><h3><?php echo $this->getHeaderText() ?></h3></td> - <td class="form-buttons"> - <?php echo $this->getButtonsHtml() ?> - </td> - </tr> - </table> -</div> +<div class="page-actions"><?php echo $this->getButtonsHtml() ?></div> <?php echo $this->getViewHtml() ?> diff --git a/app/code/core/Mage/Bundle/Block/Adminhtml/Catalog/Product/Edit/Tab/Bundle/Option.php b/app/code/core/Mage/Bundle/Block/Adminhtml/Catalog/Product/Edit/Tab/Bundle/Option.php index 7cb28967d4efda3fb785154de323865de396a9cf..649087198ce8f8831c4c896518fc9f166e124d0f 100644 --- a/app/code/core/Mage/Bundle/Block/Adminhtml/Catalog/Product/Edit/Tab/Bundle/Option.php +++ b/app/code/core/Mage/Bundle/Block/Adminhtml/Catalog/Product/Edit/Tab/Bundle/Option.php @@ -219,7 +219,7 @@ class Mage_Bundle_Block_Adminhtml_Catalog_Product_Edit_Tab_Bundle_Option extends public function getTypeSelectHtml() { - $select = $this->getLayout()->createBlock('Mage_Core_Block_Html_Select') + $select = $this->getLayout()->createBlock('Mage_Adminhtml_Block_Html_Select') ->setData(array( 'id' => $this->getFieldId().'_{{index}}_type', 'class' => 'select select-product-option-type required-option-select', @@ -233,7 +233,7 @@ class Mage_Bundle_Block_Adminhtml_Catalog_Product_Edit_Tab_Bundle_Option extends public function getRequireSelectHtml() { - $select = $this->getLayout()->createBlock('Mage_Core_Block_Html_Select') + $select = $this->getLayout()->createBlock('Mage_Adminhtml_Block_Html_Select') ->setData(array( 'id' => $this->getFieldId().'_{{index}}_required', 'class' => 'select' diff --git a/app/code/core/Mage/Bundle/Block/Adminhtml/Catalog/Product/Edit/Tab/Bundle/Option/Selection.php b/app/code/core/Mage/Bundle/Block/Adminhtml/Catalog/Product/Edit/Tab/Bundle/Option/Selection.php index 1aaacc3843dd8c53fb8a4f896563e61dda3e342d..e42ee4cccd70dfd1bc2f43c5a517ccff27b5bc34 100644 --- a/app/code/core/Mage/Bundle/Block/Adminhtml/Catalog/Product/Edit/Tab/Bundle/Option/Selection.php +++ b/app/code/core/Mage/Bundle/Block/Adminhtml/Catalog/Product/Edit/Tab/Bundle/Option/Selection.php @@ -97,7 +97,7 @@ class Mage_Bundle_Block_Adminhtml_Catalog_Product_Edit_Tab_Bundle_Option_Selecti */ public function getPriceTypeSelectHtml() { - $select = $this->getLayout()->createBlock('Mage_Core_Block_Html_Select') + $select = $this->getLayout()->createBlock('Mage_Adminhtml_Block_Html_Select') ->setData(array( 'id' => $this->getFieldId() . '_{{index}}_price_type', 'class' => 'select select-product-option-type required-option-select' @@ -117,7 +117,7 @@ class Mage_Bundle_Block_Adminhtml_Catalog_Product_Edit_Tab_Bundle_Option_Selecti */ public function getQtyTypeSelectHtml() { - $select = $this->getLayout()->createBlock('Mage_Core_Block_Html_Select') + $select = $this->getLayout()->createBlock('Mage_Adminhtml_Block_Html_Select') ->setData(array( 'id' => $this->getFieldId().'_{{index}}_can_change_qty', 'class' => 'select' diff --git a/app/code/core/Mage/Bundle/view/adminhtml/product/edit/bundle.phtml b/app/code/core/Mage/Bundle/view/adminhtml/product/edit/bundle.phtml index 7b02d320e23932dc66f46ddf035b5fc126da6ce2..807865ffa3bd42771a285fd6216e9d173a3bf3e0 100644 --- a/app/code/core/Mage/Bundle/view/adminhtml/product/edit/bundle.phtml +++ b/app/code/core/Mage/Bundle/view/adminhtml/product/edit/bundle.phtml @@ -84,4 +84,4 @@ jQuery(function($) { }); </script> -<div><input type="hidden" name="affect_bundle_product_selections" value="1" /></div> +<input type="hidden" name="affect_bundle_product_selections" value="1" /> diff --git a/app/code/core/Mage/Catalog/Model/Product/Type.php b/app/code/core/Mage/Catalog/Model/Product/Type.php index a98a8c9f767f741172f93c318af1e3f81db62fc3..25dd3d938f52adac05d1ecb2ca01b7628a5b7156 100644 --- a/app/code/core/Mage/Catalog/Model/Product/Type.php +++ b/app/code/core/Mage/Catalog/Model/Product/Type.php @@ -102,7 +102,7 @@ class Mage_Catalog_Model_Product_Type static public function getOptionArray() { $options = array(); - foreach(self::getTypes() as $typeId=>$type) { + foreach (self::getTypes() as $typeId => $type) { $options[$typeId] = Mage::helper('Mage_Catalog_Helper_Data')->__($type['label']); } diff --git a/app/code/core/Mage/Connect/Block/Adminhtml/Extension/Custom/Edit/Tab/Local.php b/app/code/core/Mage/Connect/Block/Adminhtml/Extension/Custom/Edit/Tab/Local.php index e7f6898aa722bc05201e25e0c83c497cb0ff79c3..dc3b57d1dda7c54b6cee44c478bbe115fe4a16ff 100644 --- a/app/code/core/Mage/Connect/Block/Adminhtml/Extension/Custom/Edit/Tab/Local.php +++ b/app/code/core/Mage/Connect/Block/Adminhtml/Extension/Custom/Edit/Tab/Local.php @@ -32,7 +32,7 @@ * @author Magento Core Team <core@magentocommerce.com> */ class Mage_Connect_Block_Adminhtml_Extension_Custom_Edit_Tab_Local - extends Mage_Core_Block_Template + extends Mage_Backend_Block_Abstract implements Mage_Adminhtml_Block_Widget_Tab_Interface { /** diff --git a/app/code/core/Mage/Connect/view/adminhtml/extension/custom/authors.phtml b/app/code/core/Mage/Connect/view/adminhtml/extension/custom/authors.phtml index 8306c510947e26f3e7a8b59505a2d100251dfa6d..1986966db774a523839c2b60072bd3b1d8031552 100644 --- a/app/code/core/Mage/Connect/view/adminhtml/extension/custom/authors.phtml +++ b/app/code/core/Mage/Connect/view/adminhtml/extension/custom/authors.phtml @@ -28,16 +28,16 @@ var id = 0; var authorTemplate = '<tr>'+ - '<td style="margin-bottom:5px;">'+ - '<input class="input-text required-entry" style="width:160px;" name="authors[name][]" id="authors_name_{{id}}" value="{{name}}"/>'+ + '<td>'+ + '<input type="text" class="input-text required-entry" name="authors[name][]" id="authors_name_{{id}}" value="{{name}}"/>'+ '</td>'+ - '<td style="margin-bottom:5px;">'+ - '<input class="input-text required-entry" style="width:140px;" name="authors[user][]" id="authors_user_{{id}}" value="{{user}}"/>'+ + '<td>'+ + '<input type="text" class="input-text required-entry" name="authors[user][]" id="authors_user_{{id}}" value="{{user}}"/>'+ '</td>'+ - '<td style="margin-bottom:5px;">'+ - '<input class="input-text required-entry validate-email" style="width:160px;" name="authors[email][]" id="authors_email_{{id}}" value="{{email}}"/>'+ + '<td>'+ + '<input type="text" class="input-text required-entry validate-email" name="authors[email][]" id="authors_email_{{id}}" value="{{email}}"/>'+ '</td>'+ - '<td style="margin-bottom:5px;">'+ + '<td class="col-delete">'+ <?php echo Mage::helper('Mage_Core_Helper_Data')->jsonEncode($this->getRemoveRowButtonHtml('tr')) ?> + '</td>'+ '</tr>'; @@ -54,20 +54,18 @@ function addAuthor(data) } </script> -<div class="entry-edit"> +<fieldset class="fieldset"> <?php echo $this->getFormHtml() ?> - <div class="entry-edit-head"> - <h4 class="icon-head head-edit-form fieldset-legend"><?php echo $this->__("Authors") ?></h4> - </div> - <fieldset id="authors_fieldset" class="grid"> - <legend><?php echo $this->__("Authors") ?></legend> - <table class="data" cellspacing="0"> + <legend class="legend"><span><?php echo $this->__("Authors") ?></span></legend> + <br> + <div id="authors_fieldset"> + <table class="data-table" cellspacing="0"> <thead> - <tr class="headings"> - <th><?php echo $this->__("Name") ?> <span class="required">*</span></th> - <th><?php echo $this->__("User") ?> <span class="required">*</span></th> - <th><?php echo $this->__("Email") ?> <span class="required">*</span></th> - <th><?php echo $this->__("Remove") ?></th> + <tr> + <th><?php echo $this->__("Name") ?><span class="required">*</span></th> + <th><?php echo $this->__("User") ?><span class="required">*</span></th> + <th><?php echo $this->__("Email") ?><span class="required">*</span></th> + <th class="col-delete"><?php echo $this->__("Remove") ?><span class="required">*</span></th> </tr> </thead> <tbody id="authors_container"> @@ -83,9 +81,9 @@ function addAuthor(data) </tbody> <tfoot> <tr> - <td class="a-right" colspan="4"><?php echo $this->getAddAuthorButtonHtml() ?></td> + <td colspan="4"><?php echo $this->getAddAuthorButtonHtml() ?></td> </tr> </tfoot> </table> - </fieldset> -</div> + </div> +</fieldset> diff --git a/app/code/core/Mage/Connect/view/adminhtml/extension/custom/contents.phtml b/app/code/core/Mage/Connect/view/adminhtml/extension/custom/contents.phtml index 865bc5792370ab776ad226062659c8cb8373784e..48c6ebc35ea1c2dc1dad1385a743e742b8d4d141 100644 --- a/app/code/core/Mage/Connect/view/adminhtml/extension/custom/contents.phtml +++ b/app/code/core/Mage/Connect/view/adminhtml/extension/custom/contents.phtml @@ -25,67 +25,68 @@ */ ?> -<div class="entry-edit"> - <?php echo $this->getFormHtml() ?> - - <div class="entry-edit-head"> - <h4 class="icon-head head-edit-form fieldset-legend"><?php echo $this->__("Contents") ?></h4> - </div> - <fieldset id="contents_fieldset" class="grid"> - <legend><?php echo $this->__("Contents") ?></legend> - <table class="data" cellspacing="0"> - <thead> - <tr class="headings"> - <th><?php echo $this->__("Target") ?></th> - <th><?php echo $this->__("Path") ?></th> - <th><?php echo $this->__("Type") ?></th> - <th><?php echo $this->__("Include") ?></th> - <th><?php echo $this->__("Ignore") ?></th> - <th><?php echo $this->__("Action") ?></th> - </tr> - <tr id="contents_template" style="display:none"> -<?php function showContentsTemplate($self, $_i=0) { ?> - <td style="margin-bottom:5px;"> - <select name="contents[target][]" style="width:170px"> - <optgroup label="Magento"> - <?php foreach ($self->getMageTargets() as $_value=>$_label): ?> - <option value="<?php echo $_value ?>" <?php echo $self->getSelected('contents/target/'.$_i, $_value) ?>><?php echo $_label ?></option> +<?php echo $this->getFormHtml() ?> +<fieldset id="contents_fieldset" class="fieldset"> + <legend class="legend"><span><?php echo $this->__("Contents") ?></span></legend> + <table class="data-table" cellspacing="0"> + <thead> + <tr> + <th><?php echo $this->__("Target") ?></th> + <th><?php echo $this->__("Path") ?></th> + <th><?php echo $this->__("Type") ?></th> + <th><?php echo $this->__("Include") ?></th> + <th><?php echo $this->__("Ignore") ?></th> + <th class="col-delete"><?php echo $this->__("Action") ?></th> + </tr> + <tr id="contents_template" style="display:none"> + <?php function showContentsTemplate($self, $_i = 0) + { ?> + <td> + <select name="contents[target][]"> + <optgroup label="Magento"> + <?php foreach ($self->getMageTargets() as $_value => $_label): ?> + <option value="<?php echo $_value ?>" <?php echo $self->getSelected('contents/target/' . $_i, $_value) ?>><?php echo $_label ?></option> <?php endforeach ?> - </optgroup> - </select> - </td><td style="margin-bottom:5px;"> - <input class="input-text" style="width:150px" name="contents[path][]" value="<?php echo $self->getValue('contents/path/'.$_i) ?>"/> - </td><td style="margin-bottom:5px;"> - <select name="contents[type][]" style="width:100px"> - <option value="file" <?php echo $self->getSelected('contents/type/'.$_i, 'file') ?>><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__("File") ?></option> - <option value="dir" <?php echo $self->getSelected('contents/type/'.$_i, 'dir') ?>><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__("Recursive Dir") ?></option> - </select> - </td><td style="margin-bottom:5px;"> - <input class="input-text" style="width:100px" name="contents[include][]" value="<?php echo $self->getValue('contents/include/'.$_i) ?>"/> - </td><td style="margin-bottom:5px;"> - <input class="input-text" style="width:100px" name="contents[ignore][]" value="<?php echo $self->getValue('contents/ignore/'.$_i) ?>"/> - </td><td style="margin-bottom:5px;"> - <?php echo $self->getRemoveRowButtonHtml('tr') ?> - </td> -<?php } ?> -<?php showContentsTemplate($this) ?> - </tr> - </thead> - <tbody id="contents_container"> - <?php if ($this->getData('contents/target')): ?> - <?php foreach ($this->getData('contents/target') as $_i=>$_dbField): ?> - <?php if (0===$_i) continue; ?> - <tr> -<?php showContentsTemplate($this, $_i) ?> - </tr> - <?php endforeach ?> - <?php endif ?> - </tbody> - <tfoot> - <tr> - <td class="a-right" colspan="6"><?php echo $this->getAddRowButtonHtml('contents_container', 'contents_template', $this->__('Add Contents Path')) ?></td> - </tr> - </tfoot> - </table> - </fieldset> -</div> + </optgroup> + </select> + </td> + <td> + <input type="text" class="input-text" name="contents[path][]" value="<?php echo $self->getValue('contents/path/' . $_i) ?>"/> + </td> + <td> + <select name="contents[type][]"> + <option value="file" <?php echo $self->getSelected('contents/type/' . $_i, 'file') ?>><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__("File") ?></option> + <option value="dir" <?php echo $self->getSelected('contents/type/' . $_i, 'dir') ?>><?php echo Mage::helper('Mage_Adminhtml_Helper_Data')->__("Recursive Dir") ?></option> + </select> + </td> + <td> + <input type="text" class="input-text" name="contents[include][]" value="<?php echo $self->getValue('contents/include/' . $_i) ?>"/> + </td> + <td> + <input type="text" class="input-text" name="contents[ignore][]" value="<?php echo $self->getValue('contents/ignore/' . $_i) ?>"/> + </td> + <td class="col-delete"> + <?php echo $self->getRemoveRowButtonHtml('tr') ?> + </td> + <?php } ?> + <?php showContentsTemplate($this) ?> + </tr> + </thead> + <tbody id="contents_container"> + <?php if ($this->getData('contents/target')): ?> + <?php foreach ($this->getData('contents/target') as $_i => $_dbField): ?> + <?php if (0 === $_i) continue; ?> + <tr> + <?php showContentsTemplate($this, $_i) ?> + </tr> + <?php endforeach ?> + <?php endif ?> + </tbody> + <tfoot> + <tr> + <td colspan="6"><?php echo $this->getAddRowButtonHtml('contents_container', 'contents_template', $this->__('Add Contents Path')) ?></td> + </tr> + </tfoot> + </table> +</fieldset> + diff --git a/app/code/core/Mage/Connect/view/adminhtml/extension/custom/depends.phtml b/app/code/core/Mage/Connect/view/adminhtml/extension/custom/depends.phtml index 97e8e07ee5dc604ff0b39a389ea947e6fe81c561..edc15010af0d00661b280e55de63b6997854239a 100644 --- a/app/code/core/Mage/Connect/view/adminhtml/extension/custom/depends.phtml +++ b/app/code/core/Mage/Connect/view/adminhtml/extension/custom/depends.phtml @@ -24,114 +24,113 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="entry-edit"> - <?php echo $this->getFormHtml() ?> - <div class="entry-edit-head"> - <h4 class="icon-head head-edit-form fieldset-legend"><?php echo $this->__("Packages") ?></h4> - </div> - <fieldset id="depends_packages_fieldset" class="grid"> - <legend><?php echo $this->__("Packages") ?></legend> - <table class="data" cellspacing="0"> - <thead> - <tr class="headings"> - <th><?php echo $this->__("Package") ?></th> - <th><?php echo $this->__("Channel") ?></th> - <th><?php echo $this->__("Min") ?></th> - <th><?php echo $this->__("Max") ?></th> - <th><?php echo $this->__("Files") ?></th> - <th><?php echo $this->__("Action") ?></th> - </tr> - <tr id="depends_packages_template" style="display:none"> -<?php function showDependsPackageTemplate($self, $_i=0) { - $filesClass = "files"; -?> - - - <td style="margin-bottom:5px;"> - <input class="input-text" style="width:200px;" name="depends[package][name][]" value="<?php echo $self->getValue('depends/package/name/'.$_i) ?>"/> - </td><td style="margin-bottom:5px;"> - <input class="input-text" style="width:200px;" name="depends[package][channel][]" value="<?php echo $self->getValue('depends/package/channel/'.$_i) ?>"/> - </td><td style="margin-bottom:5px;"> - <input class="input-text" style="width:50px;" name="depends[package][min][]" value="<?php echo $self->getValue('depends/package/min/'.$_i) ?>"/> - </td><td style="margin-bottom:5px;"> - <input class="input-text" style="width:50px;" name="depends[package][max][]" value="<?php echo $self->getValue('depends/package/max/'.$_i) ?>"/> - </td><td style="margin-bottom:5px;"> - <textarea class="<?php echo $filesClass ?>" style="width:300px;display:none" name="depends[package][files][]"><?php echo $self->getValue('depends/package/files/'.$_i)?> </textarea> - <?php echo $self->getAddFileDepsRowButtonHtml("tr", $filesClass) ?> - </td><td style="margin-bottom:5px;"> - <?php echo $self->getRemoveRowButtonHtml('tr') ?> - </td> -<?php } ?> -<?php showDependsPackageTemplate($this) ?> - </tr> - </thead> - <tbody id="depends_packages_container"> - <?php if ($this->getData('depends/package/name')): ?> - <?php foreach ($this->getData('depends/package/name') as $_i=>$_dbField): ?> - <?php if (0===$_i) continue; ?> +<?php echo $this->getFormHtml() ?> + +<fieldset id="depends_packages_fieldset" class="fieldset"> + <legend class="legend"><span><?php echo $this->__("Packages") ?></span></legend> + <table class="data-table" cellspacing="0"> + <thead> + <tr> + <th><?php echo $this->__("Package") ?></th> + <th><?php echo $this->__("Channel") ?></th> + <th><?php echo $this->__("Min") ?></th> + <th><?php echo $this->__("Max") ?></th> + <th><?php echo $this->__("Files") ?></th> + <th class="col-delete"><?php echo $this->__("Action") ?></th> + </tr> + <tr id="depends_packages_template" style="display:none"> + <?php function showDependsPackageTemplate($self, $_i = 0) + { + $filesClass = "files"; + ?> + <td> + <input type="text" class="input-text" name="depends[package][name][]" value="<?php echo $self->getValue('depends/package/name/' . $_i) ?>"/> + </td> + <td> + <input type="text" class="input-text" name="depends[package][channel][]" value="<?php echo $self->getValue('depends/package/channel/' . $_i) ?>"/> + </td> + <td> + <input type="text" class="input-text" name="depends[package][min][]" value="<?php echo $self->getValue('depends/package/min/' . $_i) ?>"/> + </td> + <td> + <input type="text" class="input-text" name="depends[package][max][]" value="<?php echo $self->getValue('depends/package/max/' . $_i) ?>"/> + </td> + <td> + <textarea class="<?php echo $filesClass ?>" style="display:none" name="depends[package][files][]"><?php echo $self->getValue('depends/package/files/' . $_i)?> </textarea> + <?php echo $self->getAddFileDepsRowButtonHtml("tr", $filesClass) ?> + </td> + <td class="col-delete"> + <?php echo $self->getRemoveRowButtonHtml('tr') ?> + </td> + <?php } ?> + <?php showDependsPackageTemplate($this) ?> + </tr> + </thead> + <tbody id="depends_packages_container"> + <?php if ($this->getData('depends/package/name')): ?> + <?php foreach ($this->getData('depends/package/name') as $_i => $_dbField): ?> + <?php if (0 === $_i) continue; ?> <tr> -<?php showDependsPackageTemplate($this, $_i) ?> + <?php showDependsPackageTemplate($this, $_i) ?> </tr> <?php endforeach ?> - <?php endif ?> - </tbody> - <tfoot> - <tr> - <td class="a-right" colspan="8"><?php echo $this->getAddRowButtonHtml('depends_packages_container', 'depends_packages_template', $this->__('Add Package dependency')) ?></td> - </tr> - </tfoot> - </table> - </fieldset> + <?php endif ?> + </tbody> + <tfoot> + <tr> + <td colspan="8"><?php echo $this->getAddRowButtonHtml('depends_packages_container', 'depends_packages_template', $this->__('Add Package dependency')) ?></td> + </tr> + </tfoot> + </table> +</fieldset> - <div class="entry-edit-head"> - <h4 class="icon-head head-edit-form fieldset-legend"><?php echo $this->__("Extensions") ?></h4> - </div> - <fieldset id="depends_extensions_fieldset" class="grid"> - <legend><?php echo $this->__("Extensions") ?></legend> - <table class="data" cellspacing="0"> - <thead> - <tr class="headings"> - <th><?php echo $this->__("Extension") ?></th> - <th><?php echo $this->__("Min") ?></th> - <th><?php echo $this->__("Max") ?></th> - <th><?php echo $this->__("Action") ?></th> - </tr> - <tr id="depends_extensions_template" style="display:none"> -<?php function showDependsExtensionsTemplate($self, $_i=0) { ?> - <td style="margin-bottom:5px;"> - <select name="depends[extension][name][]" style="width:100px"> - <?php foreach ($self->getExtensions() as $_value=>$_label): ?> - <option value="<?php echo $_value ?>" <?php echo $self->getSelected('depends/extension/name/'.$_i, $_value) ?>><?php echo $_label ?></option> +<fieldset id="depends_extensions_fieldset" class="fieldset"> + <legend class="legend"><span><?php echo $this->__("Extensions") ?></span></legend> + <table class="data-table" cellspacing="0"> + <thead> + <tr> + <th><?php echo $this->__("Extension") ?></th> + <th><?php echo $this->__("Min") ?></th> + <th><?php echo $this->__("Max") ?></th> + <th><?php echo $this->__("Action") ?></th> + </tr> + <tr id="depends_extensions_template" style="display:none"> + <?php function showDependsExtensionsTemplate($self, $_i=0) { ?> + <td> + <select name="depends[extension][name][]" style="width:100px"> + <?php foreach ($self->getExtensions() as $_value => $_label): ?> + <option value="<?php echo $_value ?>" <?php echo $self->getSelected('depends/extension/name/' . $_i, $_value) ?>><?php echo $_label ?></option> <?php endforeach ?> - </select> - </td><td style="margin-bottom:5px;"> - <input class="input-text" style="width:50px;" name="depends[extension][min][]" value="<?php echo $self->getValue('depends/extension/min/'.$_i) ?>"/> - </td><td style="margin-bottom:5px;"> - <input class="input-text" style="width:50px;" name="depends[extension][max][]" value="<?php echo $self->getValue('depends/extension/max/'.$_i) ?>"/> - </td><td style="margin-bottom:5px;"> - <?php echo $self->getRemoveRowButtonHtml('tr') ?> - </td> -<?php } ?> -<?php showDependsExtensionsTemplate($this) ?> - </tr> - </thead> - <tbody id="depends_extensions_container"> - <?php if ($this->getData('depends/extension/name')): ?> + </select> + </td> + <td> + <input type="text" class="input-text" name="depends[extension][min][]" value="<?php echo $self->getValue('depends/extension/min/' . $_i) ?>"/> + </td> + <td> + <input type="text" class="input-text" name="depends[extension][max][]" value="<?php echo $self->getValue('depends/extension/max/' . $_i) ?>"/> + </td> + <td class="col-delete"> + <?php echo $self->getRemoveRowButtonHtml('tr') ?> + </td> + <?php } ?> + <?php showDependsExtensionsTemplate($this) ?> + </tr> + </thead> + <tbody id="depends_extensions_container"> + <?php if ($this->getData('depends/extension/name')): ?> <?php foreach ($this->getData('depends/extension/name') as $_i=>$_dbField): ?> <?php if (0===$_i) continue; ?> <tr> -<?php showDependsExtensionsTemplate($this, $_i) ?> + <?php showDependsExtensionsTemplate($this, $_i) ?> </tr> <?php endforeach ?> - <?php endif ?> - </tbody> - <tfoot> - <tr> - <td class="a-right" colspan="7"><?php echo $this->getAddRowButtonHtml('depends_extensions_container', 'depends_extensions_template', $this->__('Add PHP Extension dependency')) ?></td> - </tr> - </tfoot> - </table> - </fieldset> - -</div> + <?php endif ?> + </tbody> + <tfoot> + <tr> + <td colspan="7"><?php echo $this->getAddRowButtonHtml('depends_extensions_container', 'depends_extensions_template', $this->__('Add PHP Extension dependency')) ?></td> + </tr> + </tfoot> + </table> +</fieldset> diff --git a/app/code/core/Mage/Core/Block/Html/Date.php b/app/code/core/Mage/Core/Block/Html/Date.php index 068cd3e787dc78e7b96c544be3762ff2a9b0b303..724d8e619152fddd4608f793e559371e4e8593b4 100644 --- a/app/code/core/Mage/Core/Block/Html/Date.php +++ b/app/code/core/Mage/Core/Block/Html/Date.php @@ -34,7 +34,6 @@ */ class Mage_Core_Block_Html_Date extends Mage_Core_Block_Template { - protected function _toHtml() { $html = '<input type="text" name="' . $this->getName() . '" id="' . $this->getId() . '" '; @@ -74,5 +73,4 @@ class Mage_Core_Block_Html_Date extends Mage_Core_Block_Template { return $this->toHtml(); } - } diff --git a/app/code/core/Mage/Core/Controller/Varien/Action.php b/app/code/core/Mage/Core/Controller/Varien/Action.php index 6fa69f84e8beb2152263ffcd8ce9f7859e98c984..bf4916b90b967c3dc3cea4bfcd465626c29eca69 100755 --- a/app/code/core/Mage/Core/Controller/Varien/Action.php +++ b/app/code/core/Mage/Core/Controller/Varien/Action.php @@ -533,22 +533,10 @@ abstract class Mage_Core_Controller_Varien_Action extends Mage_Core_Controller_V { $area = Mage::app()->getArea($this->getLayout()->getArea()); $area->load(); - $this->_initDefaultTheme(); $area->detectDesign($this->getRequest()); return $this; } - /** - * Initialize theme - * - * @return Mage_Core_Controller_Varien_Action - */ - protected function _initDefaultTheme() - { - Mage::getDesign()->setDefaultDesignTheme(); - return $this; - } - /** * Dispatch event before action * @@ -1043,7 +1031,7 @@ abstract class Mage_Core_Controller_Varien_Action extends Mage_Core_Controller_V array_unshift($this->_titles, $title); } } - $titleBlock->setTitle(implode(' / ', array_reverse($this->_titles))); + $titleBlock->setTitle(array_reverse($this->_titles)); } } } diff --git a/app/code/core/Mage/Core/Controller/Varien/Router/Base.php b/app/code/core/Mage/Core/Controller/Varien/Router/Base.php index cc761c071b5c9e1629ec17eda8dea1c775f328e2..d714be5457f095b0443546e204b1179b64e2e2e6 100644 --- a/app/code/core/Mage/Core/Controller/Varien/Router/Base.php +++ b/app/code/core/Mage/Core/Controller/Varien/Router/Base.php @@ -55,15 +55,9 @@ class Mage_Core_Controller_Varien_Router_Base extends Mage_Core_Controller_Varie */ protected $_baseController; - /** - * @var Mage_Core_Model_App - */ - protected $_app; - /** * @param Mage_Core_Controller_Varien_Action_Factory $controllerFactory * @param Magento_Filesystem $filesystem - * @param Mage_Core_Model_App $app * @param string $areaCode * @param string $baseController * @throws InvalidArgumentException @@ -71,13 +65,11 @@ class Mage_Core_Controller_Varien_Router_Base extends Mage_Core_Controller_Varie public function __construct( Mage_Core_Controller_Varien_Action_Factory $controllerFactory, Magento_Filesystem $filesystem, - Mage_Core_Model_App $app, $areaCode, $baseController ) { parent::__construct($controllerFactory); - $this->_app = $app; $this->_filesystem = $filesystem; $this->_areaCode = $areaCode; $this->_baseController = $baseController; @@ -178,8 +170,6 @@ class Mage_Core_Controller_Varien_Router_Base extends Mage_Core_Controller_Varie return null; } - $this->_app->getConfig()->loadDiConfiguration($this->_areaCode); - return $this->_matchController($request, $params); } diff --git a/app/code/core/Mage/Core/Helper/Abstract.php b/app/code/core/Mage/Core/Helper/Abstract.php index 2c8df4835e4b15e083bbcaf027c45117303f7c27..2ef160537cb81c7e6e2c0739ee31bb5c58656b4b 100755 --- a/app/code/core/Mage/Core/Helper/Abstract.php +++ b/app/code/core/Mage/Core/Helper/Abstract.php @@ -26,8 +26,6 @@ /** * Abstract helper - * - * @author Magento Core Team <core@magentocommerce.com> */ abstract class Mage_Core_Helper_Abstract { @@ -68,37 +66,38 @@ abstract class Mage_Core_Helper_Abstract /** * Loading cache data * - * @param string $id + * @param string $cacheId * @return mixed */ - protected function _loadCache($id) + protected function _loadCache($cacheId) { - return Mage::app()->loadCache($id); + return Mage::app()->loadCache($cacheId); } /** * Saving cache * - * @param mixed $data - * @param string $id - * @param array $tags - * @return Mage_Core_Helper_Abstract + * @param mixed $data + * @param string $cacheId + * @param array $tags + * @param bool $lifeTime + * @return Mage_Core_Helper_Abstract */ - protected function _saveCache($data, $id, $tags=array(), $lifeTime=false) + protected function _saveCache($data, $cacheId, $tags = array(), $lifeTime = false) { - Mage::app()->saveCache($data, $id, $tags, $lifeTime); + Mage::app()->saveCache($data, $cacheId, $tags, $lifeTime); return $this; } /** * Removing cache * - * @param string $id + * @param string $cacheId * @return Mage_Core_Helper_Abstract */ - protected function _removeCache($id) + protected function _removeCache($cacheId) { - Mage::app()->removeCache($id); + Mage::app()->removeCache($cacheId); return $this; } @@ -176,6 +175,7 @@ abstract class Mage_Core_Helper_Abstract /** * Translate * + * @SuppressWarnings(PHPMD.ShortMethodName) * @return string */ public function __() @@ -218,11 +218,11 @@ abstract class Mage_Core_Helper_Abstract return $result; } - /** + /** * Remove html tags, but leave "<" and ">" signs * - * @param string $html - * @return string + * @param string $html + * @return string */ public function removeTags($html) { @@ -232,7 +232,7 @@ abstract class Mage_Core_Helper_Abstract } /** - * Wrapper for standart strip_tags() function with extra functionality for html entities + * Wrapper for standard strip_tags() function with extra functionality for html entities * * @param string $data * @param string $allowableTags @@ -259,20 +259,20 @@ abstract class Mage_Core_Helper_Abstract /** * Escape quotes in java script * - * @param moxed $data + * @param mixed $data * @param string $quote * @return mixed */ - public function jsQuoteEscape($data, $quote='\'') + public function jsQuoteEscape($data, $quote = '\'') { if (is_array($data)) { $result = array(); foreach ($data as $item) { - $result[] = str_replace($quote, '\\'.$quote, $item); + $result[] = str_replace($quote, '\\' . $quote, $item); } return $result; } - return str_replace($quote, '\\'.$quote, $data); + return str_replace($quote, '\\' . $quote, $data); } /** @@ -326,10 +326,10 @@ abstract class Mage_Core_Helper_Abstract } /** - * base64_encode() for URLs encoding + * base64_encode() for URLs encoding * - * @param string $url - * @return string + * @param string $url + * @return string */ public function urlEncode($url) { @@ -337,10 +337,10 @@ abstract class Mage_Core_Helper_Abstract } /** - * base64_dencode() for URLs dencoding + * base64_decode() for URLs decoding * - * @param string $url - * @return string + * @param string $url + * @return string */ public function urlDecode($url) { @@ -351,8 +351,8 @@ abstract class Mage_Core_Helper_Abstract /** * Translate array * - * @param array $arr - * @return array + * @param array $arr + * @return array */ public function translateArray($arr = array()) { diff --git a/app/code/core/Mage/Core/Model/Abstract.php b/app/code/core/Mage/Core/Model/Abstract.php index bd635203ebd288bef4cd309c0a5bc7c48d494842..0c709a43a491b0eda128df9e4f81bb807bdf090d 100644 --- a/app/code/core/Mage/Core/Model/Abstract.php +++ b/app/code/core/Mage/Core/Model/Abstract.php @@ -102,6 +102,13 @@ abstract class Mage_Core_Model_Abstract extends Varien_Object */ protected $_isObjectNew = null; + /** + * Validator for checking the model state before saving it + * + * @var Zend_Validate_Interface|bool|null + */ + protected $_validatorBeforeSave = null; + /** * Application Event Dispatcher * @@ -353,6 +360,7 @@ abstract class Mage_Core_Model_Abstract extends Varien_Object } $this->_getResource()->beginTransaction(); try { + $this->_validateBeforeSave(); $this->_beforeSave(); if ($this->_dataSaveAllowed) { $this->_getResource()->save($this); @@ -412,10 +420,81 @@ abstract class Mage_Core_Model_Abstract extends Varien_Object $this->isObjectNew(true); } $this->_eventDispatcher->dispatch('model_save_before', array('object'=>$this)); - $this->_eventDispatcher->dispatch($this->_eventPrefix.'_save_before', $this->_getEventData()); + $this->_eventDispatcher->dispatch($this->_eventPrefix . '_save_before', $this->_getEventData()); return $this; } + /** + * Validate model before saving it + * + * @return Mage_Core_Model_Abstract + * @throws Mage_Core_Exception + */ + protected function _validateBeforeSave() + { + $validator = $this->_getValidatorBeforeSave(); + if ($validator && !$validator->isValid($this)) { + $errors = $validator->getMessages(); + $exception = new Mage_Core_Exception(implode(PHP_EOL, $errors)); + foreach ($errors as $errorMessage) { + $exception->addMessage(new Mage_Core_Model_Message_Error($errorMessage)); + } + throw $exception; + } + return $this; + } + + /** + * Returns validator, which contains all rules to validate this model. + * Returns FALSE, if no validation rules exist. + * + * @return Zend_Validate_Interface|false + */ + protected function _getValidatorBeforeSave() + { + if ($this->_validatorBeforeSave === null) { + $this->_validatorBeforeSave = $this->_createValidatorBeforeSave(); + } + return $this->_validatorBeforeSave; + } + + /** + * Creates validator for the model with all validation rules in it. + * Returns FALSE, if no validation rules exist. + * + * @return Zend_Validate_Interface|bool + */ + protected function _createValidatorBeforeSave() + { + $modelRules = $this->_getValidationRulesBeforeSave(); + $resourceRules = $this->_getResource()->getValidationRulesBeforeSave(); + if (!$modelRules && !$resourceRules) { + return false; + } + + if ($modelRules && $resourceRules) { + $validator = new Zend_Validate(); + $validator->addValidator($modelRules); + $validator->addValidator($resourceRules); + } else if ($modelRules) { + $validator = $modelRules; + } else { + $validator = $resourceRules; + } + + return $validator; + } + + /** + * Template method to return validate rules for the entity + * + * @return Zend_Validate_Interface|null + */ + protected function _getValidationRulesBeforeSave() + { + return null; + } + /** * Get list of cache tags applied to model object. * Return false if cache tags are not supported by model diff --git a/app/code/core/Mage/Core/Model/App.php b/app/code/core/Mage/Core/Model/App.php index aa38dca9352f83accf8311240b1b6d0ad6bb22f5..c8393e2e8a92f07ae561a8c80e0912e17d7dd3dc 100644 --- a/app/code/core/Mage/Core/Model/App.php +++ b/app/code/core/Mage/Core/Model/App.php @@ -63,8 +63,14 @@ class Mage_Core_Model_App const SCOPE_TYPE_WEBSITE = 'website'; /**#@-*/ + /** + * Xml path install date + */ const XML_PATH_INSTALL_DATE = 'global/install/date'; + /** + * Xml path: global skip modules update + */ const XML_PATH_SKIP_PROCESS_MODULES_UPDATES = 'global/skip_process_modules_updates'; /** @@ -72,6 +78,9 @@ class Mage_Core_Model_App */ const XML_PATH_IGNORE_DEV_MODE = 'global/skip_process_modules_updates_ignore_dev_mode'; + /** + * Default error handler + */ const DEFAULT_ERROR_HANDLER = 'mageCoreErrorHandler'; /** @@ -88,13 +97,13 @@ class Mage_Core_Model_App /** * Default store Id (for install) */ - const DISTRO_STORE_ID = 1; + const DISTRO_STORE_ID = 1; /** * Default store code (for install) * */ - const DISTRO_STORE_CODE = Mage_Core_Model_Store::DEFAULT_CODE; + const DISTRO_STORE_CODE = Mage_Core_Model_Store::DEFAULT_CODE; /** * Admin store Id @@ -102,7 +111,6 @@ class Mage_Core_Model_App */ const ADMIN_STORE_ID = 0; - /** * Application loaded areas array * @@ -138,13 +146,6 @@ class Mage_Core_Model_App */ protected $_translator; - /** - * Application design package object - * - * @var Mage_Core_Model_Design_Package - */ - protected $_design; - /** * Initialization parameters * @@ -273,9 +274,9 @@ class Mage_Core_Model_App /** * Cache locked flag * - * @var null|bool + * @var bool */ - protected $_isCacheLocked = null; + protected $_isCacheLocked; /** * Object manager @@ -722,6 +723,9 @@ class Mage_Core_Model_App return $this; } + /** + * Re-init stores + */ public function reinitStores() { return $this->_initStores(); @@ -1514,16 +1518,29 @@ class Mage_Core_Model_App return $this; } + /** + * Set update process run flag + * + * @param bool $value + */ public function setUpdateMode($value) { $this->_updateMode = $value; } + /** + * Get update process run flag + * + * @return bool + */ public function getUpdateMode() { return $this->_updateMode; } + /** + * @throws Mage_Core_Model_Store_Exception + */ public function throwStoreException() { throw new Mage_Core_Model_Store_Exception(''); diff --git a/app/code/core/Mage/Core/Model/App/Area.php b/app/code/core/Mage/Core/Model/App/Area.php index d3fc995d152d9497f27a46984008da117f2e74a0..71d636cbe63ea9a6a94c386cbf9837c6bc6499d8 100644 --- a/app/code/core/Mage/Core/Model/App/Area.php +++ b/app/code/core/Mage/Core/Model/App/Area.php @@ -201,6 +201,6 @@ class Mage_Core_Model_App_Area if (Mage::app()->getRequest()->isStraight()) { return; } - $this->_getDesign()->setArea($this->_code); + $this->_getDesign()->setArea($this->_code)->setDefaultDesignTheme(); } } diff --git a/app/code/core/Mage/Core/Model/Config.php b/app/code/core/Mage/Core/Model/Config.php index 788c0ced7595eb42db7ec03a45924cf6494f88f7..1a721e2843b6345a4d8b638810676ac92b4d5638 100644 --- a/app/code/core/Mage/Core/Model/Config.php +++ b/app/code/core/Mage/Core/Model/Config.php @@ -37,7 +37,7 @@ class Mage_Core_Model_Config extends Mage_Core_Model_Config_Base /** * Dependency injection configuration node name */ - const CONFIGURATION_DI_NODE = 'di'; + const XML_PATH_DI_CONFIG = 'global/di'; /** * Configuration cache tag @@ -443,7 +443,7 @@ class Mage_Core_Model_Config extends Mage_Core_Model_Config_Base Magento_Profiler::stop('init_modules_config_cache'); if ($loaded) { $this->_useCache = true; - $this->loadDiConfiguration(); + $this->_loadDiConfiguration(); return true; } } @@ -471,7 +471,7 @@ class Mage_Core_Model_Config extends Mage_Core_Model_Config_Base $this->_loadLocalConfig(); $this->applyExtends(); - $this->loadDiConfiguration(); + $this->_loadDiConfiguration(); Magento_Profiler::stop('load_modules'); Magento_Profiler::stop('config'); return $this; @@ -479,12 +479,10 @@ class Mage_Core_Model_Config extends Mage_Core_Model_Config_Base /** * Load di configuration for given area - * - * @param string $areaCode */ - public function loadDiConfiguration($areaCode = Mage_Core_Model_App_Area::AREA_GLOBAL) + protected function _loadDiConfiguration() { - $configurationNode = $this->getNode($areaCode . '/' . self::CONFIGURATION_DI_NODE); + $configurationNode = $this->getNode(self::XML_PATH_DI_CONFIG); if ($configurationNode) { $configuration = $configurationNode->asArray(); $this->_objectManager->setConfiguration($configuration); diff --git a/app/code/core/Mage/Core/Model/Design/Fallback.php b/app/code/core/Mage/Core/Model/Design/Fallback.php index a12d50f48e5541c1609965c32104ae3748a0d610..2e7e9df07c98864b053a0afdb69beb9e24451d69 100644 --- a/app/code/core/Mage/Core/Model/Design/Fallback.php +++ b/app/code/core/Mage/Core/Model/Design/Fallback.php @@ -101,13 +101,13 @@ class Mage_Core_Model_Design_Fallback implements Mage_Core_Model_Design_Fallback } /** - * Get theme code + * Get theme identification code * * @return string */ public function getTheme() { - return $this->_theme->getThemeCode(); + return $this->_theme->getId() ?: $this->_theme->getThemePath(); } /** @@ -133,8 +133,10 @@ class Mage_Core_Model_Design_Fallback implements Mage_Core_Model_Design_Fallback $dirs = array(); $themeModel = $this->_theme; while ($themeModel) { - list($package, $theme) = $this->_getInheritedTheme($themeModel); - $dirs[] = "{$dir}/{$this->_area}/{$package}/{$theme}"; + $themePath = $themeModel->getThemePath(); + if ($themePath) { + $dirs[] = "{$dir}/{$this->_area}/{$themePath}"; + } $themeModel = $themeModel->getParentTheme(); } @@ -159,8 +161,10 @@ class Mage_Core_Model_Design_Fallback implements Mage_Core_Model_Design_Fallback $dirs = array(); $themeModel = $this->_theme; while ($themeModel) { - list($package, $theme) = $this->_getInheritedTheme($themeModel); - $dirs[] = "{$dir}/{$this->_area}/{$package}/{$theme}/locale/{$this->_locale}"; + $themePath = $themeModel->getThemePath(); + if ($themePath) { + $dirs[] = "{$dir}/{$this->_area}/{$themePath}/locale/{$this->_locale}"; + } $themeModel = $themeModel->getParentTheme(); } @@ -182,23 +186,20 @@ class Mage_Core_Model_Design_Fallback implements Mage_Core_Model_Design_Fallback $dirs = array(); $themeModel = $this->_theme; while ($themeModel) { - list($package, $theme) = $this->_getInheritedTheme($themeModel); - $dirs[] = "{$dir}/{$this->_area}/{$package}/{$theme}/locale/{$this->_locale}"; - $dirs[] = "{$dir}/{$this->_area}/{$package}/{$theme}"; + $themePath = $themeModel->getThemePath(); + if ($themePath) { + $dirs[] = "{$dir}/{$this->_area}/{$themePath}/locale/{$this->_locale}"; + $dirs[] = "{$dir}/{$this->_area}/{$themePath}"; + } $themeModel = $themeModel->getParentTheme(); } - $extraDirs = array( - $this->_dirs->getDir(Mage_Core_Model_Dir::PUB_LIB), - Mage::getDesign()->getCustomizationDir() - ); - return $this->_fallback( $file, $dirs, $module, array("{$moduleDir}/{$this->_area}/locale/{$this->_locale}", "{$moduleDir}/{$this->_area}"), - $extraDirs + array($this->_dirs->getDir(Mage_Core_Model_Dir::PUB_LIB)) ); } @@ -216,15 +217,22 @@ class Mage_Core_Model_Design_Fallback implements Mage_Core_Model_Design_Fallback */ protected function _fallback($file, $themeDirs, $module = false, $moduleDirs = array(), $extraDirs = array()) { + // add customization path + $dirs = array(); + if ($this->_theme->getCustomizationPath()) { + $dirs[] = $this->_theme->getCustomizationPath(); + } + // add modules to lookup - $dirs = $themeDirs; + $dirs = array_merge($dirs, $themeDirs); if ($module) { array_walk($themeDirs, function (&$dir) use ($module) { $dir = "{$dir}/{$module}"; }); - $dirs = array_merge($themeDirs, $moduleDirs); + $dirs = array_merge($dirs, $themeDirs, $moduleDirs); } $dirs = array_merge($dirs, $extraDirs); + // look for files $tryFile = ''; foreach ($dirs as $dir) { @@ -235,33 +243,4 @@ class Mage_Core_Model_Design_Fallback implements Mage_Core_Model_Design_Fallback } return $tryFile; } - - /** - * Get the name of the inherited theme - * - * If the specified theme inherits other theme the result is the name of inherited theme. - * If the specified theme does not inherit other theme the result is null. - * - * @param Mage_Core_Model_Theme $themeModel - * @return string|null - */ - protected function _getInheritedTheme($themeModel) - { - $themePath = $themeModel->getThemePath(); - return $themePath ? explode('/', $themePath) : null; - } - - /** - * Object notified, that theme file was published, thus it can return published file name on next calls - * - * @param string $publicFilePath - * @param string $file - * @param string|null $module - * @return Mage_Core_Model_Design_FallbackInterface - */ - public function notifyViewFilePublished($publicFilePath, $file, $module = null) - { - // Do nothing - we don't cache file paths in real fallback - return $this; - } } diff --git a/app/code/core/Mage/Core/Model/Design/Fallback/CachingProxy.php b/app/code/core/Mage/Core/Model/Design/Fallback/CachingProxy.php index 6d0ab0f4b39f378ed3db2bb07a0ba6c4b006cf33..05643ec81344c28fd70a87af31eef9a055dcc7cc 100644 --- a/app/code/core/Mage/Core/Model/Design/Fallback/CachingProxy.php +++ b/app/code/core/Mage/Core/Model/Design/Fallback/CachingProxy.php @@ -135,7 +135,7 @@ class Mage_Core_Model_Design_Fallback_CachingProxy implements Mage_Core_Model_De $mapKey = "$prefix|$file|$module"; if (isset($this->_map[$mapKey])) { $value = $this->_map[$mapKey]; - if ((string) $value !== '') { + if ('' !== (string)$value) { return $this->_baseDir . DIRECTORY_SEPARATOR . $value; } else { return $value; @@ -218,16 +218,16 @@ class Mage_Core_Model_Design_Fallback_CachingProxy implements Mage_Core_Model_De } /** - * Object notified, that view file was published, thus it can return published file name on next calls + * Set file path to map. * - * @param string $publicFilePath + * @param string $filePath * @param string $file * @param string|null $module * @return Mage_Core_Model_Design_Fallback_CachingProxy */ - public function notifyViewFilePublished($publicFilePath, $file, $module = null) + public function setFilePathToMap($filePath, $file, $module = null) { - $this->_setToMap('view', $file, $module, $publicFilePath); + $this->_setToMap('view', $file, $module, $filePath); return $this; } } diff --git a/app/code/core/Mage/Core/Model/Design/FallbackInterface.php b/app/code/core/Mage/Core/Model/Design/FallbackInterface.php index fcb1cf0c98ceb8d48ac27d58549374a46d853a11..4ee91a2b1c1818a105a6783ae0d25de92e08d269 100644 --- a/app/code/core/Mage/Core/Model/Design/FallbackInterface.php +++ b/app/code/core/Mage/Core/Model/Design/FallbackInterface.php @@ -54,14 +54,4 @@ interface Mage_Core_Model_Design_FallbackInterface * @return string */ public function getViewFile($file, $module = null); - - /** - * Object notified, that theme file was published, thus it can return published file name on next calls - * - * @param string $publicFilePath - * @param string $file - * @param string|null $module - * @return Mage_Core_Model_Design_FallbackInterface - */ - public function notifyViewFilePublished($publicFilePath, $file, $module = null); } diff --git a/app/code/core/Mage/Core/Model/Design/Package.php b/app/code/core/Mage/Core/Model/Design/Package.php index 97b7c23ad9b918943148ca5573231493be3bcfbb..1a7dff400723abe6ea7ad1329b3172d54adb44d5 100644 --- a/app/code/core/Mage/Core/Model/Design/Package.php +++ b/app/code/core/Mage/Core/Model/Design/Package.php @@ -38,14 +38,9 @@ class Mage_Core_Model_Design_Package const SCOPE_SEPARATOR = '::'; /** - * Public directory which contain theme files + * Public directory which contains theme files */ - const PUBLIC_BASE_THEME_DIR = 'theme'; - - /** - * Public directory which contain virtual themes files - */ - const PUBLIC_CUSTOMIZATION_THEME_DIR = 'customization'; + const PUBLIC_BASE_THEME_DIR = 'static'; /**#@+ * Public directories prefix group @@ -135,13 +130,6 @@ class Mage_Core_Model_Design_Package */ protected $_callbackFileDir; - /** - * List of theme configuration objects per area - * - * @var array - */ - protected $_themeConfigs = array(); - /** * List of view configuration objects per theme * @@ -414,6 +402,26 @@ class Mage_Core_Model_Design_Package return $file; } + /** + * Update file path in map while we use caching mechanism + * + * @param string $targetPath + * @param string $themeFile + * @param array $params + * @return Mage_Core_Model_Design_Package + */ + public function updateFilePathInMap($targetPath, $themeFile, $params) + { + $themeFile = $this->_extractScope($themeFile, $params); + $this->_updateParamDefaults($params); + $fallback = $this->_getFallback($params); + /** @var $fallback Mage_Core_Model_Design_Fallback_CachingProxy */ + if ($fallback instanceof Mage_Core_Model_Design_Fallback_CachingProxy) { + $fallback->setFilePathToMap($targetPath, $themeFile, $params['module']); + } + return $this; + } + /** * Return most appropriate model to perform fallback * @@ -692,7 +700,7 @@ class Mage_Core_Model_Design_Package } } - $this->_getFallback($params)->notifyViewFilePublished($targetPath, $themeFile, $params['module']); + $this->updateFilePathInMap($targetPath, $themeFile, $params); return $targetPath; } @@ -725,11 +733,6 @@ class Mage_Core_Model_Design_Package return false; } - $customizationPath = $this->getCustomizationDir(); - if (strncmp($filePath, $customizationPath, strlen($customizationPath)) === 0) { - return false; - } - $protectedExtensions = array(self::CONTENT_TYPE_PHP, self::CONTENT_TYPE_PHTML, self::CONTENT_TYPE_XML); if (in_array($this->_getExtension($filePath), $protectedExtensions)) { return false; @@ -773,18 +776,7 @@ class Mage_Core_Model_Design_Package */ public function getPublicDir() { - return Mage::getBaseDir(Mage_Core_Model_Dir::MEDIA) . DIRECTORY_SEPARATOR . self::PUBLIC_BASE_THEME_DIR; - } - - /** - * Get customization directory - * - * @return string - */ - public function getCustomizationDir() - { - return Mage::getBaseDir(Mage_Core_Model_Dir::MEDIA) . DIRECTORY_SEPARATOR . Mage_Core_Model_Design_Package::PUBLIC_BASE_THEME_DIR - . DIRECTORY_SEPARATOR . Mage_Core_Model_Design_Package::PUBLIC_CUSTOMIZATION_THEME_DIR; + return Mage::getBaseDir(Mage_Core_Model_Dir::THEME) . DIRECTORY_SEPARATOR . self::PUBLIC_BASE_THEME_DIR; } /** @@ -862,14 +854,18 @@ class Mage_Core_Model_Design_Package $content = $this->_filesystem->read($filePath); $relativeUrls = $this->_extractCssRelativeUrls($content); foreach ($relativeUrls as $urlNotation => $fileUrl) { - $relatedFilePathPublic = $this->_publishRelatedViewFile($fileUrl, $filePath, $fileName, $params); - $fileUrlNew = basename($relatedFilePathPublic); - $offset = $this->_getFilesOffset($relatedFilePathPublic, $publicDir); - if ($offset) { - $fileUrlNew = $this->_canonize($offset . '/' . $fileUrlNew, true); + try { + $relatedFilePathPublic = $this->_publishRelatedViewFile($fileUrl, $filePath, $fileName, $params); + $fileUrlNew = basename($relatedFilePathPublic); + $offset = $this->_getFilesOffset($relatedFilePathPublic, $publicDir); + if ($offset) { + $fileUrlNew = $this->_canonize($offset . '/' . $fileUrlNew, true); + } + $urlNotationNew = str_replace($fileUrl, $fileUrlNew, $urlNotation); + $content = str_replace($urlNotation, $urlNotationNew, $content); + } catch (Magento_Exception $e) { + Mage::logException($e); } - $urlNotationNew = str_replace($fileUrl, $fileUrlNew, $urlNotation); - $content = str_replace($urlNotation, $urlNotationNew, $content); } return $content; } @@ -1132,7 +1128,8 @@ class Mage_Core_Model_Design_Package protected function _loadPublicCache($cacheKey) { if (!isset($this->_publicCache[$cacheKey])) { - if ($cache = Mage::app()->loadCache($cacheKey)) { + $cache = Mage::app()->loadCache($cacheKey); + if ($cache) { $this->_publicCache[$cacheKey] = unserialize($cache); } else { $this->_publicCache[$cacheKey] = array(); @@ -1154,7 +1151,7 @@ class Mage_Core_Model_Design_Package $configFiles = Mage::getConfig()->getModuleConfigurationFiles('view.xml'); $themeConfigFile = $this->getFilename('view.xml', array()); - if ($this->_filesystem->has($themeConfigFile)) { + if ($themeConfigFile && $this->_filesystem->has($themeConfigFile)) { $configFiles[] = $themeConfigFile; } $config = new Magento_Config_View($configFiles); diff --git a/app/code/core/Mage/Core/Model/Dir.php b/app/code/core/Mage/Core/Model/Dir.php index 02d94af059f9f80d4b4a0ebfff40b5e4bdecb17c..acd4012573b98d5cc28eb886c7b2b3e4244281aa 100644 --- a/app/code/core/Mage/Core/Model/Dir.php +++ b/app/code/core/Mage/Core/Model/Dir.php @@ -98,6 +98,11 @@ class Mage_Core_Model_Dir */ const LOG = 'log'; + /** + * Theme customization files + */ + const THEME = 'theme'; + /** * File system session directory (if file system session storage is used) */ @@ -132,6 +137,7 @@ class Mage_Core_Model_Dir self::PUB_LIB => 'pub/lib', self::MEDIA => 'pub/media', self::UPLOAD => 'pub/media/upload', + self::THEME => 'pub/media/theme' ); /** diff --git a/app/code/core/Mage/Core/Model/Layout.php b/app/code/core/Mage/Core/Model/Layout.php index 086577be1effb237b9a294e663ddbb7532f11b41..3d0e8fa04d3e5b9e206b375f21bfc3c3bdf512ef 100644 --- a/app/code/core/Mage/Core/Model/Layout.php +++ b/app/code/core/Mage/Core/Model/Layout.php @@ -568,7 +568,7 @@ class Mage_Core_Model_Layout extends Varien_Simplexml_Config list( $row[self::SCHEDULED_STRUCTURE_INDEX_SIBLING_NAME], $row[self::SCHEDULED_STRUCTURE_INDEX_IS_AFTER] - ) = $this->_beforeAfterToSibling($node); + ) = $this->_beforeAfterToSibling($node); // materialized path for referencing nodes in the plain array of _scheduledStructure if ($this->_scheduledStructure->hasPath($parentName)) { @@ -691,6 +691,7 @@ class Mage_Core_Model_Layout extends Varien_Simplexml_Config * * @param string $name * @param string $type + * @param string $class * @return string */ protected function _createStructuralElement($name, $type, $class) @@ -705,6 +706,7 @@ class Mage_Core_Model_Layout extends Varien_Simplexml_Config /** * Generate anonymous element name for structure * + * @param string $class * @return string */ protected function _generateAnonymousName($class) diff --git a/app/code/core/Mage/Core/Model/Observer.php b/app/code/core/Mage/Core/Model/Observer.php index 2229101f412323d4d0806a65beb19ba2f6ffc725..958cb8a778e807725c4f1920812ca03f69601137 100644 --- a/app/code/core/Mage/Core/Model/Observer.php +++ b/app/code/core/Mage/Core/Model/Observer.php @@ -123,22 +123,4 @@ class Mage_Core_Model_Observer } return $this; } - - /** - * Add theme customization - * - * @param Varien_Event_Observer $observer - * @return Mage_Core_Model_Observer - */ - public function addThemeCustomization(Varien_Event_Observer $observer) - { - /** @var $layout Mage_Core_Model_Layout */ - $layout = $observer->getEvent()->getLayout(); - - /** @var $themeService Mage_Core_Model_Theme_Service */ - $themeService = Mage::getObjectManager()->get('Mage_Core_Model_Theme_Service'); - $themeService->addThemeCustomization($layout); - - return $this; - } } diff --git a/app/code/core/Mage/Core/Model/Resource/Abstract.php b/app/code/core/Mage/Core/Model/Resource/Abstract.php index e5db22d3cd23b3e2f1e32f380e6d946f65ba3373..8a1794a5597bb9c5af2118096963de2975930d38 100644 --- a/app/code/core/Mage/Core/Model/Resource/Abstract.php +++ b/app/code/core/Mage/Core/Model/Resource/Abstract.php @@ -241,4 +241,14 @@ abstract class Mage_Core_Model_Resource_Abstract } return $value; } + + /** + * Template method to return validate rules to be executed before entity is saved + * + * @return Zend_Validate_Interface|null + */ + public function getValidationRulesBeforeSave() + { + return null; + } } diff --git a/app/code/core/Mage/Core/Model/Resource/Store.php b/app/code/core/Mage/Core/Model/Resource/Store.php index 1de9afb624908135d1ad61483cfd4c446011dc33..680fc17eefaf02910f8173820d0dbd6034f42ab9 100644 --- a/app/code/core/Mage/Core/Model/Resource/Store.php +++ b/app/code/core/Mage/Core/Model/Resource/Store.php @@ -44,32 +44,34 @@ class Mage_Core_Model_Resource_Store extends Mage_Core_Model_Resource_Db_Abstrac } /** - * Initialize unique fields + * Count number of all entities in the system * - * @return Mage_Core_Model_Resource_Store + * By default won't count admin store + * + * @param bool $countAdmin + * @return int */ - protected function _initUniqueFields() + public function countAll($countAdmin = false) { - $this->_uniqueFields = array(array( - 'field' => 'code', - 'title' => Mage::helper('Mage_Core_Helper_Data')->__('Store with the same code') - )); - return $this; + $adapter = $this->_getReadAdapter(); + $select = $adapter->select()->from($this->getMainTable(), 'COUNT(*)'); + if (!$countAdmin) { + $select->where(sprintf('%s <> %s', $adapter->quoteIdentifier('code'), $adapter->quote('admin'))); + } + return (int)$adapter->fetchOne($select); } /** - * Check store code before save + * Initialize unique fields * - * @param Mage_Core_Model_Abstract $model * @return Mage_Core_Model_Resource_Store */ - protected function _beforeSave(Mage_Core_Model_Abstract $model) + protected function _initUniqueFields() { - if (!preg_match('/^[a-z]+[a-z0-9_]*$/', $model->getCode())) { - Mage::throwException( - Mage::helper('Mage_Core_Helper_Data')->__('The store code may contain only letters (a-z), numbers (0-9) or underscore(_), the first character must be a letter')); - } - + $this->_uniqueFields = array(array( + 'field' => 'code', + 'title' => Mage::helper('Mage_Core_Helper_Data')->__('Store with the same code') + )); return $this; } diff --git a/app/code/core/Mage/Core/Model/Resource/Theme/Collection.php b/app/code/core/Mage/Core/Model/Resource/Theme/Collection.php index d6cf2ed12c434a6314a47c5ef970a539f51f1ed8..b524e6c2a7d7d57ddd73fb5fc81d5ee40297fd0d 100644 --- a/app/code/core/Mage/Core/Model/Resource/Theme/Collection.php +++ b/app/code/core/Mage/Core/Model/Resource/Theme/Collection.php @@ -76,7 +76,7 @@ class Mage_Core_Model_Resource_Theme_Collection extends Mage_Core_Model_Resource */ public function toOptionArray() { - return$this->_toOptionArray('theme_id', 'theme_title'); + return $this->_toOptionArray('theme_id', 'theme_title'); } /** @@ -99,8 +99,11 @@ class Mage_Core_Model_Resource_Theme_Collection extends Mage_Core_Model_Resource /** @var $theme Mage_Core_Model_Theme */ foreach ($this as $theme) { if ($theme->getParentId()) { - $theme->setParentId($this->_getParentThemeRecursively($theme->getParentId())); - $theme->save(); + $newParentId = $this->_getParentThemeRecursively($theme->getParentId()); + if ($newParentId != $theme->getParentId()) { + $theme->setParentId($newParentId); + $theme->save(); + } } } return $this; @@ -149,4 +152,22 @@ class Mage_Core_Model_Resource_Theme_Collection extends Mage_Core_Model_Resource { return parent::setPageSize($size); } + + /** + * Update all child themes relations + * + * @param Mage_Core_Model_Theme $themeModel + * @return Mage_Core_Model_Resource_Theme_Collection + */ + public function updateChildRelations(Mage_Core_Model_Theme $themeModel) + { + $parentThemeId = $themeModel->getParentId(); + $this->addFieldToFilter('parent_id', array('eq' => $themeModel->getId()))->load(); + + /** @var $theme Mage_Core_Model_Theme */ + foreach ($this->getItems() as $theme) { + $theme->setParentId($parentThemeId)->save(); + } + return $this; + } } diff --git a/app/code/core/Mage/Core/Service/ServiceAbstract.php b/app/code/core/Mage/Core/Model/Resource/Theme/Customization/Link.php similarity index 69% rename from app/code/core/Mage/Core/Service/ServiceAbstract.php rename to app/code/core/Mage/Core/Model/Resource/Theme/Customization/Link.php index 007c9547277079847a7f5b2b1250aca351a26dd2..86fe6419e0a6a4938fe23353343347c4e5569545 100644 --- a/app/code/core/Mage/Core/Service/ServiceAbstract.php +++ b/app/code/core/Mage/Core/Model/Resource/Theme/Customization/Link.php @@ -1,7 +1,5 @@ <?php /** - * Abstract Service Layer - * * Magento * * NOTICE OF LICENSE @@ -20,21 +18,22 @@ * versions in the future. If you wish to customize Magento for your * needs please refer to http://www.magentocommerce.com for more information. * + * @category Mage + * @package Mage_Core * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) */ -abstract class Mage_Core_Service_ServiceAbstract + +/** + * Theme customization link resource model + */ +class Mage_Core_Model_Resource_Theme_Customization_Link extends Mage_Core_Model_Resource_Db_Abstract { /** - * Sets each value from data to entity Varien_Object using setter method. - * - * @param Varien_Object $entity - * @param array $data + * Resource initialization */ - protected function _setDataUsingMethods($entity, array $data) + protected function _construct() { - foreach ($data as $property => $value) { - $entity->setDataUsingMethod($property, $value); - } + $this->_init('core_theme_files_link', 'files_link_id'); } } diff --git a/app/code/core/Mage/Core/Model/Resource/Theme/Files/Collection.php b/app/code/core/Mage/Core/Model/Resource/Theme/Files/Collection.php index ad40a166c582e08fa5a54d4471184798bfd2ba35..5d33e4a6b7679b7821f6d6f3de6c982c5119aa28 100644 --- a/app/code/core/Mage/Core/Model/Resource/Theme/Files/Collection.php +++ b/app/code/core/Mage/Core/Model/Resource/Theme/Files/Collection.php @@ -36,4 +36,29 @@ class Mage_Core_Model_Resource_Theme_Files_Collection extends Mage_Core_Model_Re { $this->_init('Mage_Core_Model_Theme_Files', 'Mage_Core_Model_Resource_Theme_Files'); } + + /** + * Add select order + * + * $field is properly quoted, lately it was treated field "order" as special SQL word and was not working + * + * @param string $field + * @param string $direction + * @return Mage_Core_Model_Resource_Theme_Files_Collection|Varien_Data_Collection|Varien_Data_Collection_Db + */ + public function setOrder($field, $direction = self::SORT_ORDER_DESC) + { + return parent::setOrder($this->getConnection()->quoteIdentifier($field), $direction); + } + + /** + * Set default order + * + * @param string $direction + * @return Mage_Core_Model_Resource_Theme_Files_Collection + */ + public function setDefaultOrder($direction) + { + return $this->setOrder('sort_order', $direction); + } } diff --git a/app/code/core/Mage/Core/Model/Resource/Theme/Grid/Collection.php b/app/code/core/Mage/Core/Model/Resource/Theme/Grid/Collection.php new file mode 100644 index 0000000000000000000000000000000000000000..63676de39565dae4116ab33dc9a51fd070630ee7 --- /dev/null +++ b/app/code/core/Mage/Core/Model/Resource/Theme/Grid/Collection.php @@ -0,0 +1,43 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Core + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Theme grid collection + */ +class Mage_Core_Model_Resource_Theme_Grid_Collection extends Mage_Core_Model_Resource_Theme_Collection +{ + /** + * Add area filter + * + * @return Mage_Core_Model_Resource_Db_Collection_Abstract|Mage_Core_Model_Resource_Theme_Grid_Collection + */ + protected function _initSelect() + { + parent::_initSelect(); + $this->addAreaFilter(Mage_Core_Model_App_Area::AREA_FRONTEND)->addParentTitle(); + return $this; + } +} diff --git a/app/code/core/Mage/Core/Model/Store.php b/app/code/core/Mage/Core/Model/Store.php index 87c2a644dc04a52346701c9d968cfea65733ed57..2299654447b73be892296e7fc8b14298d3c91618 100644 --- a/app/code/core/Mage/Core/Model/Store.php +++ b/app/code/core/Mage/Core/Model/Store.php @@ -271,6 +271,43 @@ class Mage_Core_Model_Store extends Mage_Core_Model_Abstract return $this->_session; } + /** + * Validation rules for store + * + * @return Zend_Validate_Interface|null + */ + protected function _getValidationRulesBeforeSave() + { + $validator = new Magento_Validator_Composite_VarienObject(); + + $storeLabelRule = new Zend_Validate_NotEmpty(); + $storeLabelRule->setMessage( + Mage::helper('Mage_Core_Helper_Data')->__('Name is required'), + Zend_Validate_NotEmpty::IS_EMPTY + ); + $validator->addRule($storeLabelRule, 'name'); + + $storeCodeRule = new Zend_Validate_Regex('/^[a-z]+[a-z0-9_]*$/'); + $storeCodeRule->setMessage( + Mage::helper('Mage_Core_Helper_Data')->__('The store code may contain only letters (a-z), numbers (0-9) or underscore(_), the first character must be a letter'), + Zend_Validate_Regex::NOT_MATCH + ); + $validator->addRule($storeCodeRule, 'code'); + + if ($this->isObjectNew()) { + /** @var $limitation Mage_Core_Model_Store_Limitation */ + $limitation = Mage::getObjectManager()->get('Mage_Core_Model_Store_Limitation'); + $storeSavingAllowance = new Zend_Validate_Callback(array($limitation, 'canCreate')); + $storeSavingAllowance->setMessage( + $limitation->getCreateRestrictionMessage(), Zend_Validate_Callback::INVALID_VALUE + ); + + $validator->addRule($storeSavingAllowance); + } + + return $validator; + } + /** * Loading store data * diff --git a/app/code/core/Mage/Core/Model/Store/Limitation.php b/app/code/core/Mage/Core/Model/Store/Limitation.php new file mode 100644 index 0000000000000000000000000000000000000000..90d82677bdc394f5ee35b200b22ab2faed0af05a --- /dev/null +++ b/app/code/core/Mage/Core/Model/Store/Limitation.php @@ -0,0 +1,82 @@ +<?php +/** + * Functional limitation for number of stores + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +class Mage_Core_Model_Store_Limitation +{ + /** + * @var Mage_Core_Model_Resource_Store + */ + private $_resource; + + /** + * @var int + */ + private $_allowedQty = 0; + + /** + * @var bool + */ + private $_isRestricted = false; + + /** + * Determine restriction + * + * @param Mage_Core_Model_Resource_Store $resource + * @param Mage_Core_Model_Config $config + */ + public function __construct(Mage_Core_Model_Resource_Store $resource, Mage_Core_Model_Config $config) + { + $this->_resource = $resource; + $allowedQty = (string)$config->getNode('global/functional_limitation/max_store_count'); + if ('' === $allowedQty) { + return; + } + $this->_allowedQty = (int)$allowedQty; + $this->_isRestricted = true; + } + + /** + * Whether it is permitted to create new items + * + * @return bool + */ + public function canCreate() + { + if ($this->_isRestricted) { + return $this->_resource->countAll() < $this->_allowedQty; + } + return true; + } + + /** + * User notification message about the restriction + * + * @return string + */ + public static function getCreateRestrictionMessage() + { + return Mage::helper('Mage_Core_Helper_Data')->__('You are using the maximum number of store views allowed.'); + } +} diff --git a/app/code/core/Mage/Core/Model/Theme.php b/app/code/core/Mage/Core/Model/Theme.php index ab0f6e6484e81a53e82a44236f4604ac8277d863..b8d6869719f113d49aa8eb0c9d84e458aae31360 100644 --- a/app/code/core/Mage/Core/Model/Theme.php +++ b/app/code/core/Mage/Core/Model/Theme.php @@ -30,14 +30,11 @@ * @method Mage_Core_Model_Theme save() * @method string getPackageCode() * @method string getThemePath() - * @method string getThemeTitle() getThemeTitle() * @method string getParentThemePath() - * @method string getPreviewImage() - * @method string getThemeDirectory() * @method string getParentId() * @method string getArea() * @method string getThemeTitle() - * @method string getThemeId() + * @method int getThemeId() * @method Mage_Core_Model_Theme setAssignedStores(array $stores) * @method array getAssignedStores() * @method Mage_Core_Model_Theme addData(array $data) @@ -45,7 +42,6 @@ * @method Mage_Core_Model_Theme setParentTheme($parentTheme) * @method Mage_Core_Model_Theme setPackageCode(string $packageCode) * @method Mage_Core_Model_Theme setThemeCode(string $themeCode) - * @method Mage_Core_Model_Theme setPreviewImage(string $previewImage) * @method Mage_Core_Model_Theme setThemePath(string $themePath) * @method Mage_Core_Model_Theme setThemeVersion(string $themeVersion) * @method Mage_Core_Model_Theme setArea(string $area) @@ -56,6 +52,7 @@ * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class Mage_Core_Model_Theme extends Mage_Core_Model_Abstract + implements Mage_Core_Model_Theme_Customization_CustomizedInterface { /** * Cache tag for empty theme @@ -68,24 +65,9 @@ class Mage_Core_Model_Theme extends Mage_Core_Model_Abstract const PATH_SEPARATOR = '/'; /** - * Preview image directory + * Path prefix to customized theme files */ - const IMAGE_DIR_PREVIEW = 'preview'; - - /** - * Origin image directory - */ - const IMAGE_DIR_ORIGIN = 'origin'; - - /** - * Preview image width - */ - const PREVIEW_IMAGE_WIDTH = 200; - - /** - * Preview image height - */ - const PREVIEW_IMAGE_HEIGHT = 200; + const PATH_PREFIX_CUSTOMIZATION = 'customization'; /** * Labels collection array @@ -110,9 +92,16 @@ class Mage_Core_Model_Theme extends Mage_Core_Model_Abstract protected $_helper; /** - * @var Magento_Filesystem + * Array of theme customizations for save + * + * @var array + */ + protected $_themeCustomizations = array(); + + /** + * @var Mage_Core_Model_Theme_Image */ - protected $_filesystem; + protected $_themeImage; /** * Initialize dependencies @@ -122,7 +111,7 @@ class Mage_Core_Model_Theme extends Mage_Core_Model_Abstract * @param Magento_ObjectManager $objectManager * @param Mage_Core_Model_Theme_Factory $themeFactory * @param Mage_Core_Helper_Data $helper - * @param Magento_Filesystem $filesystem + * @param Mage_Core_Model_Theme_Image $themeImage * @param Mage_Core_Model_Resource_Theme $resource * @param Mage_Core_Model_Resource_Theme_Collection $resourceCollection * @param array $data @@ -135,7 +124,7 @@ class Mage_Core_Model_Theme extends Mage_Core_Model_Abstract Magento_ObjectManager $objectManager, Mage_Core_Model_Theme_Factory $themeFactory, Mage_Core_Helper_Data $helper, - Magento_Filesystem $filesystem, + Mage_Core_Model_Theme_Image $themeImage, Mage_Core_Model_Resource_Theme $resource, Mage_Core_Model_Resource_Theme_Collection $resourceCollection = null, array $data = array() @@ -144,7 +133,8 @@ class Mage_Core_Model_Theme extends Mage_Core_Model_Abstract $this->_objectManager = $objectManager; $this->_themeFactory = $themeFactory; $this->_helper = $helper; - $this->_filesystem = $filesystem; + $this->_themeImage = $themeImage; + $this->_themeImage->setTheme($this); } /** @@ -156,15 +146,13 @@ class Mage_Core_Model_Theme extends Mage_Core_Model_Abstract } /** - * Return custom css file + * Get theme image model * - * @return Mage_Core_Model_Theme_Files + * @return Mage_Core_Model_Theme_Image */ - public function getCustomCssFile() + public function getThemeImage() { - /** @var $cssFile Mage_Core_Model_Theme_Files_Css */ - $cssFile = $this->_objectManager->get('Mage_Core_Model_Theme_Files_Css'); - return $cssFile->getFileByTheme($this); + return $this->_themeImage; } /** @@ -180,8 +168,8 @@ class Mage_Core_Model_Theme extends Mage_Core_Model_Abstract /** * Validate theme data * - * @throws Mage_Core_Exception * @return Mage_Core_Model_Theme + * @throws Mage_Core_Exception */ protected function _validate() { @@ -232,156 +220,175 @@ class Mage_Core_Model_Theme extends Mage_Core_Model_Abstract */ public function hasChildThemes() { - $childThemes = $this->getCollection()->addFieldToFilter('parent_id', array('eq' => $this->getId()))->load(); - return (bool)count($childThemes); + return (bool)$this->getCollection()->addFieldToFilter('parent_id', array('eq' => $this->getId()))->getSize(); } /** - * Update all child themes relations + * Return path to customized theme files * - * @return Mage_Core_Model_Theme + * @return string|null */ - protected function _updateChildRelations() + public function getCustomizationPath() { - $parentThemeId = $this->getParentId(); - /** @var $childThemes Mage_Core_Model_Resource_Theme_Collection */ - $childThemes = $this->getCollection(); - $childThemes->addFieldToFilter('parent_id', array('eq' => $this->getId()))->load(); - - /** @var $theme Mage_Core_Model_Theme */ - foreach ($childThemes->getItems() as $theme) { - $theme->setParentId($parentThemeId)->save(); + $customPath = $this->getData('customization_path'); + if ($this->getId() && empty($customPath)) { + /** @var $modelDir Mage_Core_Model_Dir */ + $modelDir = $this->_objectManager->get('Mage_Core_Model_Dir'); + $customPath = $modelDir->getDir(Mage_Core_Model_Dir::THEME) . DIRECTORY_SEPARATOR + . self::PATH_PREFIX_CUSTOMIZATION . DIRECTORY_SEPARATOR . $this->getId(); + $this->setData('customization_path', $customPath); } + return $customPath; + } - return $this; + /** + * Return theme customization collection by type + * + * @param string $type + * @return Varien_Data_Collection + * @throws InvalidArgumentException + */ + public function getCustomizationData($type) + { + if (!isset($this->_themeCustomizations[$type])) { + throw new InvalidArgumentException('Customization is not present'); + } + return $this->_themeCustomizations[$type]->getCollectionByTheme($this); } /** - * Before theme save + * Add theme customization * + * @param Mage_Core_Model_Theme_Customization_CustomizationInterface $customization * @return Mage_Core_Model_Theme */ - protected function _beforeSave() + public function setCustomization(Mage_Core_Model_Theme_Customization_CustomizationInterface $customization) { - $this->_validate(); - return parent::_beforeSave(); + $this->_themeCustomizations[$customization->getType()] = $customization; + return $this; } /** - * Processing theme before deleting data + * Save all theme customization object * - * @throws Mage_Core_Exception * @return Mage_Core_Model_Theme */ - protected function _beforeDelete() + public function saveThemeCustomization() { - if (!$this->isDeletable()) { - Mage::throwException($this->_helper->__('Theme isn\'t deletable.')); + /** @var $file Mage_Core_Model_Theme_Customization_CustomizationInterface */ + foreach ($this->_themeCustomizations as $file) { + $file->saveData($this); } - $this->removePreviewImage(); - return parent::_beforeDelete(); + return $this; } /** - * Update all relations after deleting theme + * Include customized files on default handle * * @return Mage_Core_Model_Theme */ - protected function _afterDelete() + protected function _applyCustomizationFiles() { - $this->_updateChildRelations(); - return parent::_afterDelete(); + /** @var $link Mage_Core_Model_Theme_Customization_Link */ + $link = $this->_objectManager->create('Mage_Core_Model_Theme_Customization_Link'); + $link->setThemeId($this->getId())->changeCustomFilesUpdate(); + return $this; } /** - * Get parent theme model + * Check if theme object data was changed. * - * @return Mage_Core_Model_Theme|null + * @return bool */ - public function getParentTheme() + public function hasDataChanges() { - if ($this->hasData('parent_theme')) { - return $this->getData('parent_theme'); - } + return parent::hasDataChanges() || $this->isCustomized(); + } - $theme = null; - if ($this->getParentId()) { - $theme = $this->_themeFactory->create()->load($this->getParentId()); - } - $this->setParentTheme($theme); - return $theme; + /** + * Check whether present customization objects + * + * @return bool + */ + public function isCustomized() + { + return !empty($this->_themeCustomizations); } /** - * Save preview image + * Update all relations after deleting theme * * @return Mage_Core_Model_Theme */ - public function savePreviewImage() + protected function _afterSave() { - if (!$this->getPreviewImage() || !$this->getThemeDirectory()) { - return $this; + $this->saveThemeCustomization(); + if ($this->isCustomized()) { + $this->_applyCustomizationFiles(); } - $currentWorkingDir = getcwd(); - - chdir($this->getThemeDirectory()); - $imagePath = realpath($this->getPreviewImage()); - - if (0 === strpos($imagePath, $this->getThemeDirectory())) { - $this->createPreviewImage($imagePath); + /** @var $service Mage_Core_Model_Theme_Service */ + $service = $this->_objectManager->get('Mage_Core_Model_Theme_Service'); + if ($service->isThemeAssignedToStore($this)) { + $this->_eventDispatcher->dispatch('assigned_theme_save_after'); } - - chdir($currentWorkingDir); - - return $this; + return parent::_afterSave(); } /** - * Get themes root directory absolute path + * Before theme save * - * @return string + * @return Mage_Core_Model_Theme */ - protected function _getPreviewImagePublishedRootDir() + protected function _beforeSave() { - /** @var $design Mage_Core_Model_Design_Package */ - $design = $this->_objectManager->get('Mage_Core_Model_Design_Package'); - $dirPath = $design->getPublicDir(); - $this->_filesystem->setIsAllowCreateDirectories(true); - $this->_filesystem->ensureDirectoryExists($dirPath); - $this->_filesystem->setWorkingDirectory($dirPath); - return $dirPath; + $this->_validate(); + return parent::_beforeSave(); } /** - * Get directory path for origin image + * Processing theme before deleting data * - * @return string + * @throws Mage_Core_Exception + * @return Mage_Core_Model_Theme */ - public function getImagePathOrigin() + protected function _beforeDelete() { - return $this->_getPreviewImagePublishedRootDir() . DIRECTORY_SEPARATOR . self::IMAGE_DIR_ORIGIN; + if (!$this->isDeletable()) { + Mage::throwException($this->_helper->__('Theme isn\'t deletable.')); + } + $this->getThemeImage()->removePreviewImage(); + return parent::_beforeDelete(); } /** - * Get directory path for preview image + * Update all relations after deleting theme * - * @return string + * @return Mage_Core_Model_Theme */ - protected function _getImagePathPreview() + protected function _afterDelete() { - return $this->_getPreviewImagePublishedRootDir() . DIRECTORY_SEPARATOR . self::IMAGE_DIR_PREVIEW; + $this->getCollection()->updateChildRelations($this); + return parent::_afterDelete(); } /** - * Get preview image directory url + * Get parent theme model * - * @return string + * @return Mage_Core_Model_Theme|null */ - public static function getPreviewImageDirectoryUrl() + public function getParentTheme() { - return Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_MEDIA) - . Mage_Core_Model_Design_Package::PUBLIC_BASE_THEME_DIR . '/' . self::IMAGE_DIR_PREVIEW . '/'; + if ($this->hasData('parent_theme')) { + return $this->getData('parent_theme'); + } + + $theme = null; + if ($this->getParentId()) { + $theme = $this->_themeFactory->create()->load($this->getParentId()); + } + $this->setParentTheme($theme); + return $theme; } /** @@ -406,126 +413,14 @@ class Mage_Core_Model_Theme extends Mage_Core_Model_Abstract $this->addData($themeData); if (isset($previewImageData['delete'])) { - $this->removePreviewImage(); + $this->getThemeImage()->removePreviewImage(); } - $this->uploadPreviewImage('preview_image'); + $this->getThemeImage()->uploadPreviewImage('preview_image'); $this->setArea(Mage_Core_Model_App_Area::AREA_FRONTEND)->save(); return $this; } - /** - * Upload and create preview image - * - * @throws Mage_Core_Exception - * @param string $scope the request key for file - * @return bool - */ - public function uploadPreviewImage($scope) - { - $adapter = new Zend_File_Transfer_Adapter_Http(); - if (!$adapter->isUploaded($scope)) { - return false; - } - if (!$adapter->isValid($scope)) { - Mage::throwException($this->_helper->__('Uploaded image is not valid')); - } - $upload = new Varien_File_Uploader($scope); - $upload->setAllowCreateFolders(true); - $upload->setAllowedExtensions(array('jpg', 'jpeg', 'gif', 'png', 'xbm', 'wbmp')); - $upload->setAllowRenameFiles(true); - $upload->setFilesDispersion(false); - - if (!$upload->save($this->getImagePathOrigin())) { - Mage::throwException($this->_helper->__('Image can not be saved.')); - } - - $fileName = $this->getImagePathOrigin() . DS . $upload->getUploadedFileName(); - $this->removePreviewImage()->createPreviewImage($fileName); - $this->_filesystem->delete($fileName); - return true; - } - - /** - * Create preview image - * - * @param string $imagePath - * @return string - */ - public function createPreviewImage($imagePath) - { - $adapter = $this->_helper->getImageAdapterType(); - $image = new Varien_Image($imagePath, $adapter); - $image->keepTransparency(true); - $image->constrainOnly(true); - $image->keepFrame(true); - $image->keepAspectRatio(true); - $image->backgroundColor(array(255, 255, 255)); - $image->resize(self::PREVIEW_IMAGE_WIDTH, self::PREVIEW_IMAGE_HEIGHT); - - $imageName = uniqid('preview_image_') . image_type_to_extension($image->getMimeType()); - $image->save($this->_getImagePathPreview(), $imageName); - - $this->setPreviewImage($imageName); - - return $imageName; - } - - /** - * Create preview image copy - * - * @return Mage_Core_Model_Theme - */ - public function createPreviewImageCopy() - { - $filePath = $this->_getImagePathPreview() . DIRECTORY_SEPARATOR . $this->getPreviewImage(); - $destinationFileName = Varien_File_Uploader::getNewFileName($filePath); - $this->_filesystem->copy( - $this->_getImagePathPreview() . DIRECTORY_SEPARATOR . $this->getPreviewImage(), - $this->_getImagePathPreview() . DIRECTORY_SEPARATOR . $destinationFileName - ); - $this->setPreviewImage($destinationFileName); - return $this; - } - - /** - * Delete preview image - * - * @return Mage_Core_Model_Theme - */ - public function removePreviewImage() - { - $previewImage = $this->getPreviewImage(); - $this->setPreviewImage(''); - if ($previewImage) { - $this->_filesystem->delete($this->_getImagePathPreview() . DIRECTORY_SEPARATOR . $previewImage); - } - return $this; - } - - /** - * Get url for themes preview image - * - * @return string - */ - public function getPreviewImageUrl() - { - if (!$this->getPreviewImage()) { - return $this->_getPreviewImageDefaultUrl(); - } - return self::getPreviewImageDirectoryUrl() . $this->getPreviewImage(); - } - - /** - * Return default themes preview image url - * - * @return string - */ - protected function _getPreviewImageDefaultUrl() - { - return Mage::getDesign()->getViewFileUrl('Mage_Core::theme/default_preview.jpg'); - } - /** * Return cache key for current theme * @@ -550,7 +445,7 @@ class Mage_Core_Model_Theme extends Mage_Core_Model_Abstract */ public function getFullPath() { - return $this->getArea() . '/' . $this->getThemePath(); + return $this->getArea() . self::PATH_SEPARATOR . $this->getThemePath(); } /** diff --git a/app/code/core/Mage/Core/Model/Theme/Collection.php b/app/code/core/Mage/Core/Model/Theme/Collection.php index 56e8382bc96b9ba8ce4ef515b7c8f8e508358d5c..574956d16ad513d5f1f871ad2d0ca1c8811d2fc3 100644 --- a/app/code/core/Mage/Core/Model/Theme/Collection.php +++ b/app/code/core/Mage/Core/Model/Theme/Collection.php @@ -143,7 +143,6 @@ class Mage_Core_Model_Theme_Collection extends Varien_Data_Collection /** * Return target dir for themes with theme configuration file * - * * @throws Magento_Exception * @return array|string */ diff --git a/app/code/core/Mage/Core/Model/Theme/Customization/CustomizationInterface.php b/app/code/core/Mage/Core/Model/Theme/Customization/CustomizationInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..4daccaa218a26fc16061b8385227230deea4f382 --- /dev/null +++ b/app/code/core/Mage/Core/Model/Theme/Customization/CustomizationInterface.php @@ -0,0 +1,57 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Core + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Theme customization interface + */ +interface Mage_Core_Model_Theme_Customization_CustomizationInterface +{ + /** + * Return customization type + */ + public function getType(); + + /** + * Setter for data for save + * + * @param mixed $data + */ + public function setDataForSave($data); + + /** + * Return collection customization form theme + * + * @param Mage_Core_Model_Theme_Customization_CustomizedInterface $theme + */ + public function getCollectionByTheme(Mage_Core_Model_Theme_Customization_CustomizedInterface $theme); + + /** + * Save data + * + * @param Mage_Core_Model_Theme_Customization_CustomizedInterface $theme + */ + public function saveData(Mage_Core_Model_Theme_Customization_CustomizedInterface $theme); +} diff --git a/app/code/core/Mage/Core/Model/Theme/Customization/CustomizedInterface.php b/app/code/core/Mage/Core/Model/Theme/Customization/CustomizedInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..1346a159279e45b24092a0a56ed7750f45adcd63 --- /dev/null +++ b/app/code/core/Mage/Core/Model/Theme/Customization/CustomizedInterface.php @@ -0,0 +1,62 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Core + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Theme customized interface + */ +interface Mage_Core_Model_Theme_Customization_CustomizedInterface +{ + /** + * Setter customization to customized theme + * + * @var Mage_Core_Model_Theme_Customization_CustomizationInterface $customization + */ + public function setCustomization(Mage_Core_Model_Theme_Customization_CustomizationInterface $customization); + + /** + * Return theme customization collection by type + * + * @param string $type + */ + public function getCustomizationData($type); + + /** + * Save theme customizations + */ + public function saveThemeCustomization(); + + /** + * Check whether present customization objects + */ + public function isCustomized(); + + /** + * Return path to customized theme files + * + * @return string|null + */ + public function getCustomizationPath(); +} diff --git a/app/code/core/Mage/Core/Model/Theme/Files/Css.php b/app/code/core/Mage/Core/Model/Theme/Customization/Files/Css.php similarity index 51% rename from app/code/core/Mage/Core/Model/Theme/Files/Css.php rename to app/code/core/Mage/Core/Model/Theme/Customization/Files/Css.php index 76e28f20be8d60d40c8ccb47637fd457d8767271..3683c9d64040d57829736bac093e10307ee54321 100644 --- a/app/code/core/Mage/Core/Model/Theme/Files/Css.php +++ b/app/code/core/Mage/Core/Model/Theme/Customization/Files/Css.php @@ -27,60 +27,55 @@ /** * Theme css file model class */ -class Mage_Core_Model_Theme_Files_Css +class Mage_Core_Model_Theme_Customization_Files_Css extends Mage_Core_Model_Theme_Customization_Files_FilesAbstract { /** * Css file name */ - const FILE_NAME = 'custom.css'; + const FILE_PATH = 'css/custom.css'; /** - * @var Mage_Core_Model_Theme_Files + * Css file type customization */ - protected $_themeFiles; + const TYPE = 'css_file'; /** - * @param Mage_Core_Model_Theme_Files $themeFiles + * Return css file customization type + * + * @return string */ - public function __construct(Mage_Core_Model_Theme_Files $themeFiles) + public function getType() { - $this->_themeFiles = $themeFiles; + return self::TYPE; } /** - * Save data from form + * Return file type * - * @param $theme Mage_Core_Model_Theme - * @param string $themeCssData - * @return Mage_Core_Model_Theme_Files + * @return string */ - public function saveFormData($theme, $themeCssData) + protected function _getFileType() { - /** @var $cssModel Mage_Core_Model_Theme_Files */ - $cssFile = $this->getFileByTheme($theme); - $cssFile->addData(array( - 'theme_id' => $theme->getId(), - 'file_name' => self::FILE_NAME, - 'file_type' => Mage_Core_Model_Theme_Files::TYPE_CSS, - 'content' => $themeCssData - ))->save(); - return $cssFile; + return Mage_Core_Model_Theme_Files::TYPE_CSS; } /** - * Return theme css file by theme + * Save data * * @param $theme Mage_Core_Model_Theme - * @return Mage_Core_Model_Theme_Files + * @return Mage_Core_Model_Theme_Customization_Files_Css */ - public function getFileByTheme($theme) + protected function _save($theme) { - /** @var $cssModel Mage_Core_Model_Theme_Files */ - $cssFile = $this->_themeFiles->getCollection() - ->addFilter('theme_id', $theme->getId()) - ->addFilter('file_type', Mage_Core_Model_Theme_Files::TYPE_CSS) - ->getFirstItem(); + /** @var $cssFile Mage_Core_Model_Theme_Files */ + $cssFile = $this->getCollectionByTheme($theme)->getFirstItem(); + $cssFile->addData(array( + 'theme_id' => $theme->getId(), + 'file_path' => self::FILE_PATH, + 'file_type' => $this->_getFileType(), + 'content' => $this->_dataForSave + ))->save(); - return $cssFile; + return $this; } } diff --git a/app/code/core/Mage/Core/Model/Theme/Customization/Files/FilesAbstract.php b/app/code/core/Mage/Core/Model/Theme/Customization/Files/FilesAbstract.php new file mode 100644 index 0000000000000000000000000000000000000000..c0650eb61bd08bed907843d55e43b7fa7e8a06de --- /dev/null +++ b/app/code/core/Mage/Core/Model/Theme/Customization/Files/FilesAbstract.php @@ -0,0 +1,107 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Core + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Theme files abstract class + */ +abstract class Mage_Core_Model_Theme_Customization_Files_FilesAbstract extends Varien_Object + implements Mage_Core_Model_Theme_Customization_CustomizationInterface +{ + /** + * @var Mage_Core_Model_Theme_Files + */ + protected $_themeFiles; + + /** + * Data for save + * + * @var mixed + */ + protected $_dataForSave; + + /** + * @param Mage_Core_Model_Theme_Files $themeFiles + */ + public function __construct(Mage_Core_Model_Theme_Files $themeFiles) + { + $this->_themeFiles = $themeFiles; + } + + /** + * Setter for data for save + * + * @param mixed $data + * @return Mage_Core_Model_Theme_Customization_Files_FilesAbstract + */ + public function setDataForSave($data) + { + $this->_dataForSave = $data; + return $this; + } + + /** + * Save data + * + * @param Mage_Core_Model_Theme_Customization_CustomizedInterface $theme + * @return Mage_Core_Model_Theme_Customization_Files_FilesAbstract + */ + public function saveData(Mage_Core_Model_Theme_Customization_CustomizedInterface $theme) + { + if (null !== $this->_dataForSave) { + $this->_save($theme); + } + return $this; + } + + /** + * Save data + * + * @param Mage_Core_Model_Theme_Customization_CustomizedInterface $theme + * @return Mage_Core_Model_Resource_Theme_Files_Collection + */ + public function getCollectionByTheme(Mage_Core_Model_Theme_Customization_CustomizedInterface $theme) + { + /** @var $filesCollection Mage_Core_Model_Resource_Theme_Files_Collection */ + $filesCollection = $this->_themeFiles->getCollection()->addFilter('theme_id', $theme->getId()) + ->addFilter('file_type', $this->_getFileType()); + + return $filesCollection; + } + + /** + * Return file type + * + * @return string + */ + abstract protected function _getFileType(); + + /** + * Save data + * + * @param Mage_Core_Model_Theme $theme + */ + abstract protected function _save($theme); +} diff --git a/app/code/core/Mage/Core/Model/Theme/Customization/Files/Js.php b/app/code/core/Mage/Core/Model/Theme/Customization/Files/Js.php new file mode 100644 index 0000000000000000000000000000000000000000..a2fc125b08d521ed2e896c6c12df3a544c3d8d1a --- /dev/null +++ b/app/code/core/Mage/Core/Model/Theme/Customization/Files/Js.php @@ -0,0 +1,252 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Core + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Theme js file model class + * + * @method array getJsOrderData() + * @method Mage_Core_Model_Theme_Customization_Files_Js setJsOrderData(array) + * @method bool hasJsOrderData() + */ +class Mage_Core_Model_Theme_Customization_Files_Js extends Mage_Core_Model_Theme_Customization_Files_FilesAbstract +{ + /** + * Css file type customization + */ + const TYPE = 'js_file'; + + /** + * @var array + */ + protected $_dataForDelete; + + /** + * Return js file customization type + * + * @return string + */ + public function getType() + { + return self::TYPE; + } + + /** + * Return file type + * + * @return string + */ + protected function _getFileType() + { + return Mage_Core_Model_Theme_Files::TYPE_JS; + } + + /** + * Sets data for files deletion + * + * @param array $data + * @return Mage_Core_Model_Theme_Customization_Files_Js + */ + public function setDataForDelete(array $data) + { + $this->_dataForDelete = $data; + return $this; + } + + /** + * Save data + * + * @param Mage_Core_Model_Theme_Customization_CustomizedInterface $theme + * @return Mage_Core_Model_Theme_Customization_Files_FilesAbstract + */ + public function saveData(Mage_Core_Model_Theme_Customization_CustomizedInterface $theme) + { + if (null !== $this->_dataForDelete) { + $this->_delete($theme); + } + parent::saveData($theme); + if ($this->hasJsOrderData()) { + $this->_reorder($theme, $this->getJsOrderData()); + } + + return $this; + } + + /** + * Delete js files from theme + * + * @param $theme Mage_Core_Model_Theme + * @return Mage_Core_Model_Theme_Customization_Files_Js + */ + protected function _delete(Mage_Core_Model_Theme $theme) + { + /** @var $jsCollection Mage_Core_Model_Resource_Theme_Files_Collection */ + $jsCollection = $this->getCollectionByTheme($theme); + /** @var $jsFile Mage_Core_Model_Theme_Files */ + foreach ($jsCollection as $jsFile) { + if (in_array($jsFile->getId(), $this->_dataForDelete)) { + $jsFile->delete(); + } + } + + return $this; + } + + /** + * Remove temporary files + * + * @param Mage_Core_Model_Theme $theme + * @return Mage_Core_Model_Theme_Customization_Files_Js + */ + public function removeTemporaryFiles($theme) + { + /** @var $jsFiles Mage_Core_Model_Resource_Theme_Files_Collection */ + $jsFiles = $this->_themeFiles->getCollection() + ->addFilter('is_temporary', true) + ->addFilter('theme_id', $theme->getId()) + ->addFilter('file_type', Mage_Core_Model_Theme_Files::TYPE_JS); + + /** @var $file Mage_Core_Model_Theme_Files */ + foreach ($jsFiles as $file) { + $file->delete(); + } + + return $this; + } + + /** + * Save form data + * + * @param Mage_Core_Model_Theme $theme + * @return Mage_Core_Model_Theme_Customization_Files_Js + */ + protected function _save($theme) + { + $themeFile = $this->_themeFiles; + $themeJsFiles = (array)$this->_dataForSave; + foreach ($themeJsFiles as $fileId) { + $themeFile->load($fileId); + if ($themeFile->getId() && ($themeFile->getThemeId() == $theme->getId())) { + $themeFile->setIsTemporary(false)->save(); + } + } + return $this; + } + + /** + * Save js file + * + * @param Mage_Core_Model_Theme $theme + * @param array $file + * @param bool $temporary + * @return Mage_Core_Model_Theme_Files + */ + public function saveJsFile($theme, $file, $temporary = true) + { + $newFileModel = $this->_themeFiles->unsetData(); + return $newFileModel->addData(array( + 'theme_id' => $theme->getId(), + 'file_path' => 'js/' . $this->_prepareFileName($theme, $file['name']), + 'file_type' => Mage_Core_Model_Theme_Files::TYPE_JS, + 'content' => $file['content'], + 'is_temporary' => $temporary + ))->save(); + } + + /** + * Prepare file name + * + * @param Mage_Core_Model_Theme $theme + * @param string $newFileName + * @return string + */ + protected function _prepareFileName($theme, $newFileName) + { + $fileInfo = pathinfo($newFileName); + $index = 1; + while ($this->_getThemeFileByName($theme, $newFileName)->getId()) { + $newFileName = $fileInfo['filename'] . '_' . $index . '.' . $fileInfo['extension']; + $index++; + } + + return $newFileName; + } + + /** + * Get theme js files by name + * + * @param Mage_Core_Model_Theme $theme + * @param string $fileName + * @return Mage_Core_Model_Resource_Theme_Files_Collection + */ + protected function _getThemeFileByName($theme, $fileName) + { + /** @var $jsFile Mage_Core_Model_Resource_Theme_Files_Collection */ + $jsFile = parent::getCollectionByTheme($theme) + ->addFieldToFilter('file_path', array('like' => "%{$fileName}")) + ->getFirstItem(); + + return $jsFile; + } + + /** + * Save data + * + * @param Mage_Core_Model_Theme_Customization_CustomizedInterface $theme + * @param string $order + * @return Mage_Core_Model_Resource_Theme_Files_Collection|Mage_Core_Model_Resource_Db_Collection_Abstract + */ + public function getCollectionByTheme( + Mage_Core_Model_Theme_Customization_CustomizedInterface $theme, + $order = Varien_Data_Collection::SORT_ORDER_ASC + ) { + return parent::getCollectionByTheme($theme)->setDefaultOrder($order); + } + + /** + * Reorder theme JS files + * + * @param Mage_Core_Model_Theme $theme + * @param array $orderData + * @return Mage_Core_Model_Theme_Customization_Files_Js + */ + public function _reorder(Mage_Core_Model_Theme $theme, $orderData) + { + /** @var $collection Mage_Core_Model_Resource_Theme_Files_Collection */ + $collection = $this->getCollectionByTheme($theme); + /** @var $file Mage_Core_Model_Theme_Files */ + foreach ($collection as $file) { + $position = array_search($file->getFileName(), $orderData); + if ($position === false) { + //uploaded files will be on top + $file->setSortOrder(0); + } + $file->setSortOrder($position + 1); + } + $collection->save(); + + return $this; + } +} diff --git a/app/code/core/Mage/Core/Model/Theme/Customization/Link.php b/app/code/core/Mage/Core/Model/Theme/Customization/Link.php new file mode 100644 index 0000000000000000000000000000000000000000..5351243895943ac055a0fda1afc5e6612c895c72 --- /dev/null +++ b/app/code/core/Mage/Core/Model/Theme/Customization/Link.php @@ -0,0 +1,238 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Core + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Theme customization link model + * + * @method int getLayoutLinkId() + * @method Mage_Core_Model_Theme_Customization_Link setThemeId() + */ +class Mage_Core_Model_Theme_Customization_Link extends Mage_Core_Model_Abstract +{ + /** + * @var Magento_ObjectManager + */ + protected $_objectManager; + + /** + * @var Mage_Core_Model_Theme_Files + */ + protected $_themeFiles; + + /** + * @var Mage_Core_Model_Design_Package + */ + protected $_designPackage; + + /** + * Initialize dependencies + * + * @param Mage_Core_Model_Theme_Files $themeFiles + * @param Mage_Core_Model_Design_Package $designPackage + * @param Mage_Core_Model_Event_Manager $eventDispatcher + * @param Mage_Core_Model_Cache $cacheManager + * @param Magento_ObjectManager $objectManager + * @param Mage_Core_Model_Resource_Theme_Customization_Link $resource + * @param Varien_Data_Collection_Db $resourceCollection + * @param array $data + */ + public function __construct( + Mage_Core_Model_Theme_Files $themeFiles, + Mage_Core_Model_Design_Package $designPackage, + Mage_Core_Model_Event_Manager $eventDispatcher, + Mage_Core_Model_Cache $cacheManager, + Magento_ObjectManager $objectManager, + Mage_Core_Model_Resource_Theme_Customization_Link $resource, + Varien_Data_Collection_Db $resourceCollection = null, + array $data = array() + ) { + parent::__construct($eventDispatcher, $cacheManager, $resource, $resourceCollection, $data); + $this->_objectManager = $objectManager; + $this->_themeFiles = $themeFiles; + $this->_designPackage = $designPackage; + } + + /** + * Get theme id + * + * @return int + * @throws Magento_Exception + */ + public function getThemeId() + { + if (!$this->hasData('theme_id')) { + throw new Magento_Exception('Theme id should be set'); + } + return $this->getData('theme_id'); + } + + /** + * Get layout link id for current theme customization files + * + * @return Mage_Core_Model_Layout_Link + */ + protected function _getLinkByTheme() + { + if (!$this->getId()) { + $this->load($this->getThemeId(), 'theme_id'); + } + + /** @var $link Mage_Core_Model_Layout_Update */ + $link = $this->_objectManager->create('Mage_Core_Model_Layout_Link'); + $linkId = $this->getLayoutLinkId(); + if ($linkId) { + $link->load($linkId); + } + return $link; + } + + /** + * Get update model + * + * @param int $updateId + * @return Mage_Core_Model_Layout_Update + */ + protected function _getUpdate($updateId) + { + /** @var $update Mage_Core_Model_Layout_Update */ + $update = $this->_objectManager->create('Mage_Core_Model_Layout_Update'); + if ($updateId) { + $update->load($updateId); + } + return $update; + } + + /** + * Get files collection for current theme + * + * @return Mage_Core_Model_Resource_Theme_Files_Collection + */ + protected function _getFilesCollection() + { + $filesCollection = $this->_themeFiles->getCollection() + ->setDefaultOrder(Varien_Data_Collection::SORT_ORDER_ASC) + ->addFilter('theme_id', $this->getThemeId()); + return $filesCollection; + } + + /** + * Remove relation and layout update + * + * @return Mage_Core_Model_Theme_Customization_Link + */ + public function _beforeDelete() + { + $link = $this->_getLinkByTheme(); + $update = $this->_getUpdate($link->getLayoutUpdateId()); + $link->delete(); + $update->delete(); + return parent::_beforeDelete(); + } + + /** + * Add custom files to inclusion on frontend page + * + * @param string $handle + * @return Mage_Core_Model_Theme_Customization_Link + */ + public function changeCustomFilesUpdate($handle = 'default') + { + $link = $this->_getLinkByTheme(); + $customFiles = $this->_getFilesCollection()->getItems(); + if (empty($customFiles) && !$link->getId()) { + return $this; + } elseif (empty($customFiles) && $link->getId()) { + $this->delete(); + return $this; + } + + $update = $this->_getUpdate($link->getLayoutUpdateId()); + $this->_prepareUpdate($update, $customFiles); + $update->setHandle($handle)->save(); + + if (!$link->getId()) { + $link->setThemeId($this->getThemeId()) + ->setLayoutUpdateId($update->getId()) + ->save(); + $this->setLayoutLinkId($link->getId())->save(); + } + return $this; + } + + /** + * Add layout update for custom files + * + * @param Mage_Core_Model_Layout_Update $update + * @param array $customFiles + * @return Mage_Core_Model_Theme_Customization_Link + */ + public function _prepareUpdate(Mage_Core_Model_Layout_Update $update, array $customFiles) + { + $xmlActions = ''; + /** @var $customFile Mage_Core_Model_Theme_Files */ + foreach ($customFiles as $customFile) { + if ($customFile->hasContent()) { + $xmlActions .= $this->_getInclusionAction($customFile); + $params = array( + 'area' => Mage_Core_Model_Design_Package::DEFAULT_AREA, + 'themeModel' => $customFile->getTheme() + ); + $this->_designPackage->updateFilePathInMap( + $customFile->getFullPath(), + $customFile->getRelativePath(), + $params + ); + } + } + if (!empty($xmlActions)) { + $update->setXml('<reference name="head">' . $xmlActions . '</reference>')->save(); + } + return $this; + } + + /** + * Generate piece of layout update + * + * @param Mage_Core_Model_Theme_Files $customFile + * @throws Magento_Exception + * @return string + */ + public function _getInclusionAction(Mage_Core_Model_Theme_Files $customFile) + { + switch ($customFile->getFileType()) { + case Mage_Core_Model_Theme_Files::TYPE_CSS: + $action = "<action method=\"addCss\"><file>{$customFile->getRelativePath()}</file></action>"; + break; + case Mage_Core_Model_Theme_Files::TYPE_JS: + $action = "<action method=\"addJs\"><file>{$customFile->getRelativePath()}</file></action>"; + break; + default: + throw new Magento_Exception('Unsupported file type format'); + break; + } + return $action; + } +} diff --git a/app/code/core/Mage/Core/Model/Theme/Files.php b/app/code/core/Mage/Core/Model/Theme/Files.php index 5c0095bce31ac7b8ad5abe9592d2028eea70dd15..277d37dc66dd0e9eb209968155e7789f02288783 100644 --- a/app/code/core/Mage/Core/Model/Theme/Files.php +++ b/app/code/core/Mage/Core/Model/Theme/Files.php @@ -26,23 +26,46 @@ /** * Theme files model class + * + * @method int getThemeId() + * @method string getFileName() + * @method string getFileType() + * @method string getContent() + * @method string getOrder() + * @method bool getIsTemporary() + * @method Mage_Core_Model_Resource_Theme_Files_Collection getCollection() + * @method setThemeId(int $id) + * @method setFileName(string $filename) + * @method setFileType(string $type) + * @method setContent(string $content) + * @method setSortOrder(string $order) + * @method Mage_Core_Model_Theme_Files setUpdatedAt($time) + * @method Mage_Core_Model_Theme_Files setLayoutLinkId($id) + * @method string getFilePath() Relative path to file + * @method string getContent() + * @method int getLayoutLinkId() */ class Mage_Core_Model_Theme_Files extends Mage_Core_Model_Abstract { /** - * css file type + * Css file type */ const TYPE_CSS = 'css'; /** - * @var Varien_Io_File + * Js file type */ - protected $_ioFile; + const TYPE_JS = 'js'; /** - * @var Mage_Core_Model_Design_Package + * Path prefix to customized static files */ - protected $_design; + const PATH_PREFIX_CUSTOMIZED = '_Customized'; + + /** + * @var Varien_Io_File + */ + protected $_ioFile; /** * @var Magento_ObjectManager @@ -50,12 +73,14 @@ class Mage_Core_Model_Theme_Files extends Mage_Core_Model_Abstract protected $_objectManager; /** + * Initialize dependencies + * * @param Mage_Core_Model_Event_Manager $eventDispatcher * @param Mage_Core_Model_Cache $cacheManager - * @param Mage_Core_Model_Resource_Abstract $resource - * @param Varien_Data_Collection_Db $resourceCollection * @param Varien_Io_File $ioFile * @param Magento_ObjectManager $objectManager + * @param Mage_Core_Model_Resource_Abstract $resource + * @param Varien_Data_Collection_Db $resourceCollection * @param array $data */ public function __construct( @@ -71,7 +96,6 @@ class Mage_Core_Model_Theme_Files extends Mage_Core_Model_Abstract $this->_ioFile = $ioFile; $this->_objectManager = $objectManager; - $this->_design = $this->_objectManager->get('Mage_Core_Model_Design_Package'); } /** @@ -82,6 +106,29 @@ class Mage_Core_Model_Theme_Files extends Mage_Core_Model_Abstract $this->_init('Mage_Core_Model_Resource_Theme_Files'); } + /** + * Get theme model + * + * @return Mage_Core_Model_Theme + * @throws Magento_Exception + */ + public function getTheme() + { + if ($this->hasData('theme')) { + return $this->getData('theme'); + } + + /** @var $theme Mage_Core_Model_Theme */ + $theme = $this->_objectManager->create('Mage_Core_Model_Theme'); + $themeId = $this->getData('theme_id'); + if ($themeId && $theme->load($themeId)->getId()) { + $this->setData('theme', $theme); + } else { + throw new Magento_Exception('Theme id should be set'); + } + return $theme; + } + /** * Create/update/delete file after save * Delete file if only file is empty @@ -90,10 +137,10 @@ class Mage_Core_Model_Theme_Files extends Mage_Core_Model_Abstract */ protected function _afterSave() { - if ($this->getContent()) { + if ($this->hasContent()) { $this->_saveFile(); } else { - $this->_deleteFile(); + $this->delete(); } return parent::_afterSave(); } @@ -106,7 +153,6 @@ class Mage_Core_Model_Theme_Files extends Mage_Core_Model_Abstract protected function _afterDelete() { $this->_deleteFile(); - return parent::_afterDelete(); } @@ -117,10 +163,9 @@ class Mage_Core_Model_Theme_Files extends Mage_Core_Model_Abstract */ protected function _saveFile() { - $filePath = $this->getFilePath(true); + $filePath = $this->getFullPath(); $this->_ioFile->checkAndCreateFolder(dirname($filePath)); $result = $this->_ioFile->write($filePath, $this->getContent()); - $this->_design->cleanMergedJsCss(); return $result; } @@ -131,26 +176,52 @@ class Mage_Core_Model_Theme_Files extends Mage_Core_Model_Abstract */ protected function _deleteFile() { - $result = $this->_ioFile->rm($this->getFilePath(true)); - $this->_design->cleanMergedJsCss(); + $result = $this->_ioFile->rm($this->getFullPath()); return $result; } /** - * Return file path in file system + * Check if file has content * - * @param bool $fullPath - * @return string|bool + * @return bool */ - public function getFilePath($fullPath = false) + public function hasContent() { - if (!$this->getId()) { - return false; - } - $filePath = $this->getThemeId() . DIRECTORY_SEPARATOR . $this->getFileName(); - if ($fullPath) { - $filePath = $this->_design->getCustomizationDir() . DIRECTORY_SEPARATOR . $filePath; + return (bool)trim($this->getContent()); + } + + /** + * Return path to customization directory + * + * @return string + */ + public function getRelativePath() + { + return self::PATH_PREFIX_CUSTOMIZED . '/' . $this->getFilePath(); + } + + /** + * Get file name of customization file + * + * @return string + */ + public function getFileName() + { + return basename($this->getFilePath()); + } + + /** + * Return absolute path to file of customization + * + * @return null|string + */ + public function getFullPath() + { + $path = null; + if ($this->getId()) { + $path = $this->getTheme()->getCustomizationPath(). DIRECTORY_SEPARATOR . $this->getRelativePath(); + $path = str_replace('/', DIRECTORY_SEPARATOR, $path); } - return $filePath; + return $path; } } diff --git a/app/code/core/Mage/Core/Model/Theme/Image.php b/app/code/core/Mage/Core/Model/Theme/Image.php new file mode 100644 index 0000000000000000000000000000000000000000..083dcbd1701a8d4fd2f84373c4f0349027a1b044 --- /dev/null +++ b/app/code/core/Mage/Core/Model/Theme/Image.php @@ -0,0 +1,317 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Core + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Theme Image model class + */ +class Mage_Core_Model_Theme_Image extends Varien_Object +{ + /** + * Preview image width + */ + const PREVIEW_IMAGE_WIDTH = 200; + + /** + * Preview image height + */ + const PREVIEW_IMAGE_HEIGHT = 200; + + /** + * Preview image directory + */ + const IMAGE_DIR_PREVIEW = 'preview'; + + /** + * Origin image directory + */ + const IMAGE_DIR_ORIGIN = 'origin'; + + /** + * @var Mage_Core_Helper_Data + */ + protected $_helper; + + /** + * @var Magento_Filesystem + */ + protected $_filesystem; + + /** + * @var Mage_Core_Model_Theme + */ + protected $_theme; + + /** + * Initialize dependencies + * + * @param Magento_ObjectManager $objectManager + * @param Mage_Core_Helper_Data $helper + * @param Magento_Filesystem $filesystem + */ + public function __construct( + Magento_ObjectManager $objectManager, + Mage_Core_Helper_Data $helper, + Magento_Filesystem $filesystem + ) { + $this->_objectManager = $objectManager; + $this->_helper = $helper; + $this->_filesystem = $filesystem; + } + + /** + * Setter for theme object + * + * @param Mage_Core_Model_Theme $theme + * @return Mage_Core_Model_Theme_Image + */ + public function setTheme($theme) + { + $this->_theme = $theme; + return $this; + } + + /** + * Getter for theme object + * + * @return Mage_Core_Model_Theme + * @throws BadMethodCallException + */ + public function getTheme() + { + if (null === $this->_theme) { + throw new BadMethodCallException('Theme was not set'); + } + return $this->_theme; + } + + /** + * Getter for theme preview image + * + * @return string + */ + public function getPreviewImage() + { + return $this->getTheme()->getPreviewImage(); + } + + /** + * Setter for theme preview image + * + * @param string $imageName + * @return Mage_Core_Model_Theme_Image + */ + public function setPreviewImage($imageName) + { + $this->getTheme()->setPreviewImage($imageName); + return $this; + } + + /** + * Save preview image + * + * @return Mage_Core_Model_Theme_Image + */ + public function savePreviewImage() + { + if (!$this->getPreviewImage() || !$this->getTheme()->getThemeDirectory()) { + return $this; + } + $currentWorkingDir = getcwd(); + + chdir($this->getTheme()->getThemeDirectory()); + + $imagePath = realpath($this->getPreviewImage()); + + if (0 === strpos($imagePath, $this->getTheme()->getThemeDirectory())) { + $this->createPreviewImage($imagePath); + } + + chdir($currentWorkingDir); + + return $this; + } + + /** + * Get directory path for origin image + * + * @return string + */ + public function getImagePathOrigin() + { + return $this->_getPreviewImagePublishedRootDir() . DIRECTORY_SEPARATOR . self::IMAGE_DIR_ORIGIN; + } + + /** + * Get themes root directory absolute path + * + * @return string + */ + protected function _getPreviewImagePublishedRootDir() + { + /** @var $design Mage_Core_Model_Design_Package */ + $design = $this->_objectManager->get('Mage_Core_Model_Design_Package'); + $dirPath = $design->getPublicDir(); + $this->_filesystem->setIsAllowCreateDirectories(true); + $this->_filesystem->ensureDirectoryExists($dirPath); + $this->_filesystem->setWorkingDirectory($dirPath); + return $dirPath; + } + + /** + * Get preview image directory url + * + * @return string + */ + public function getPreviewImageDirectoryUrl() + { + return $this->_objectManager->get('Mage_Core_Model_App')->getStore()->getBaseUrl( + Mage_Core_Model_Store::URL_TYPE_MEDIA + ) . Mage_Core_Model_Dir::THEME . '/' . self::IMAGE_DIR_PREVIEW . '/'; + } + + /** + * Upload and create preview image + * + * @param string $scope the request key for file + * @return bool + * @throws Mage_Core_Exception + */ + public function uploadPreviewImage($scope) + { + $adapter = new Zend_File_Transfer_Adapter_Http(); + if (!$adapter->isUploaded($scope)) { + return false; + } + if (!$adapter->isValid($scope)) { + Mage::throwException($this->_helper->__('Uploaded image is not valid')); + } + $upload = new Varien_File_Uploader($scope); + $upload->setAllowCreateFolders(true); + $upload->setAllowedExtensions(array('jpg', 'jpeg', 'gif', 'png', 'xbm', 'wbmp')); + $upload->setAllowRenameFiles(true); + $upload->setFilesDispersion(false); + + if (!$upload->save($this->getImagePathOrigin())) { + Mage::throwException($this->_helper->__('Image can not be saved.')); + } + + $fileName = $this->getImagePathOrigin() . DS . $upload->getUploadedFileName(); + $this->removePreviewImage()->createPreviewImage($fileName); + $this->_filesystem->delete($fileName); + return true; + } + + /** + * Create preview image + * + * @param string $imagePath + * @return string + */ + public function createPreviewImage($imagePath) + { + $adapter = $this->_helper->getImageAdapterType(); + $image = new Varien_Image($imagePath, $adapter); + $image->keepTransparency(true); + $image->constrainOnly(true); + $image->keepFrame(true); + $image->keepAspectRatio(true); + $image->backgroundColor(array(255, 255, 255)); + $image->resize(self::PREVIEW_IMAGE_WIDTH, self::PREVIEW_IMAGE_HEIGHT); + + $imageName = uniqid('preview_image_') . image_type_to_extension($image->getMimeType()); + $image->save($this->_getImagePathPreview(), $imageName); + + $this->setPreviewImage($imageName); + + return $imageName; + } + + /** + * Get directory path for preview image + * + * @return string + */ + protected function _getImagePathPreview() + { + return $this->_getPreviewImagePublishedRootDir() . DIRECTORY_SEPARATOR . self::IMAGE_DIR_PREVIEW; + } + + /** + * Create preview image copy + * + * @return Mage_Core_Model_Theme_Image + */ + public function createPreviewImageCopy() + { + $filePath = $this->_getImagePathPreview() . DIRECTORY_SEPARATOR . $this->getPreviewImage(); + $destinationFileName = Varien_File_Uploader::getNewFileName($filePath); + $this->_filesystem->copy( + $this->_getImagePathPreview() . DIRECTORY_SEPARATOR . $this->getPreviewImage(), + $this->_getImagePathPreview() . DIRECTORY_SEPARATOR . $destinationFileName + ); + $this->setPreviewImage($destinationFileName); + return $this; + } + + /** + * Delete preview image + * + * @return Mage_Core_Model_Theme_Image + */ + public function removePreviewImage() + { + $previewImage = $this->getPreviewImage(); + $this->setPreviewImage(''); + if ($previewImage) { + $this->_filesystem->delete($this->_getImagePathPreview() . DIRECTORY_SEPARATOR . $previewImage); + } + return $this; + } + + /** + * Get url for themes preview image + * + * @return string + */ + public function getPreviewImageUrl() + { + if (!$this->getPreviewImage()) { + return $this->_getPreviewImageDefaultUrl(); + } + return $this->getPreviewImageDirectoryUrl() . $this->getPreviewImage(); + } + + /** + * Return default themes preview image url + * + * @return string + */ + protected function _getPreviewImageDefaultUrl() + { + return $this->_objectManager->get('Mage_Core_Model_Design_Package') + ->getViewFileUrl('Mage_Core::theme/default_preview.jpg'); + } +} diff --git a/app/code/core/Mage/Core/Model/Theme/Registration.php b/app/code/core/Mage/Core/Model/Theme/Registration.php index 5671f1504715ced2c5d39f028671553030b7ca53..79867abfb5e3f12f16df16f6926452bda612f7dd 100644 --- a/app/code/core/Mage/Core/Model/Theme/Registration.php +++ b/app/code/core/Mage/Core/Model/Theme/Registration.php @@ -133,7 +133,9 @@ class Mage_Core_Model_Theme_Registration $theme->setParentId($parentTheme->getId()); } - $theme->savePreviewImage()->save(); + $theme->getThemeImage()->savePreviewImage(); + $theme->save(); + return $this; } diff --git a/app/code/core/Mage/Core/Model/Theme/Service.php b/app/code/core/Mage/Core/Model/Theme/Service.php index dbbd7e2bc11a6630d284906ed670be44971500a2..08f0e57bd4c98d98ce2d19facd90d419f1545662 100644 --- a/app/code/core/Mage/Core/Model/Theme/Service.php +++ b/app/code/core/Mage/Core/Model/Theme/Service.php @@ -114,7 +114,6 @@ class Mage_Core_Model_Theme_Service * @param int $themeId * @param array $stores * @param string $scope - * @param string $area * @return Mage_Core_Model_Theme * @throws UnexpectedValueException */ @@ -184,7 +183,8 @@ class Mage_Core_Model_Theme_Service /** @var $themeCustomization Mage_Core_Model_Theme */ $themeCustomization = $this->_themeFactory->create()->setData($themeData); - $themeCustomization->createPreviewImageCopy()->save(); + $themeCustomization->getThemeImage()->createPreviewImageCopy(); + $themeCustomization->save(); return $themeCustomization; } @@ -237,7 +237,7 @@ class Mage_Core_Model_Theme_Service } /** - * Return frontend theme collection by page. Theme customizations are not included, only phisical themes. + * Return frontend theme collection by page. Theme customizations are not included, only physical themes. * * @param int $page * @param int $pageSize @@ -253,6 +253,18 @@ class Mage_Core_Model_Theme_Service return $collection->setCurPage($page); } + /** + * Check if current theme has assigned to any store + * + * @param Mage_Core_Model_Theme $theme + * @return bool + */ + public function isThemeAssignedToStore(Mage_Core_Model_Theme $theme) + { + $assignedThemes = $this->getAssignedThemeCustomizations(); + return isset($assignedThemes[$theme->getId()]); + } + /** * Return theme customizations which are assigned to store views * @@ -302,9 +314,9 @@ class Mage_Core_Model_Theme_Service foreach ($themeCustomizations as $theme) { if (isset($assignedThemes[$theme->getId()])) { $theme->setAssignedStores($assignedThemes[$theme->getId()]); - $this->_assignedThemeCustomizations[] = $theme; + $this->_assignedThemeCustomizations[$theme->getId()] = $theme; } else { - $this->_unassignedThemeCustomizations[] = $theme; + $this->_unassignedThemeCustomizations[$theme->getId()] = $theme; } } return $this; @@ -347,32 +359,4 @@ class Mage_Core_Model_Theme_Service return $storesByThemes; } - - /** - * Add theme customization - * - * @param Mage_Core_Model_Layout $layout - * @return Mage_Core_Model_Theme_Service - */ - public function addThemeCustomization($layout) - { - $this->_addCssCustomization($layout); - return $this; - } - - /** - * Add css customization - * - * @param Mage_Core_Model_Layout $layout - * @return Mage_Core_Model_Theme_Service - */ - protected function _addCssCustomization($layout) - { - /** @var $theme Mage_Core_Model_Theme_Files */ - $customCssFile = $this->_design->getDesignTheme()->getCustomCssFile(); - if ($customCssFile->getContent()) { - $layout->getBlock('head')->addCss($customCssFile->getFilePath()); - } - return $this; - } } diff --git a/app/code/core/Mage/Core/Model/Translate.php b/app/code/core/Mage/Core/Model/Translate.php index 6d4f65d0c668789cb164de32ff2a7fc75aefe357..a3b1083c0211e0d2954b5d62f642319db22f734d 100644 --- a/app/code/core/Mage/Core/Model/Translate.php +++ b/app/code/core/Mage/Core/Model/Translate.php @@ -26,20 +26,47 @@ /** * Translate model - * - * @author Magento Core Team <core@magentocommerce.com> */ class Mage_Core_Model_Translate { + /** + * CSV separator + */ const CSV_SEPARATOR = ','; + + /** + * Scope separator + */ const SCOPE_SEPARATOR = '::'; + + /** + * Cache tag + */ const CACHE_TAG = 'translate'; + /** + * Configuration area key + */ const CONFIG_KEY_AREA = 'area'; + + /** + * Configuration locale kay + */ const CONFIG_KEY_LOCALE = 'locale'; + + /** + * Configuration store key + */ const CONFIG_KEY_STORE = 'store'; + + /** + * Configuration theme key + */ const CONFIG_KEY_DESIGN_THEME = 'theme'; + /** + * Xml path locale inheritance + */ const XML_PATH_LOCALE_INHERITANCE = 'global/locale/inheritance'; /** @@ -68,6 +95,9 @@ class Mage_Core_Model_Translate */ protected $_config; + /** + * @var bool + */ protected $_useCache = true; /** @@ -148,10 +178,10 @@ class Mage_Core_Model_Translate */ public function init($area, $forceReload = false) { - $this->setConfig(array(self::CONFIG_KEY_AREA=>$area)); + $this->setConfig(array(self::CONFIG_KEY_AREA => $area)); $this->_translateInline = Mage::getSingleton('Mage_Core_Model_Translate_Inline') - ->isAllowed($area=='adminhtml' ? 'admin' : null); + ->isAllowed($area == 'adminhtml' ? 'admin' : null); if (!$forceReload) { if ($this->_canUseCache()) { @@ -165,7 +195,7 @@ class Mage_Core_Model_Translate $this->_data = array(); - foreach ($this->getModulesConfig() as $moduleName=>$info) { + foreach ($this->getModulesConfig() as $moduleName => $info) { $info = $info->asArray(); $this->_loadModuleTranslation($moduleName, $info['files'], $forceReload); } @@ -187,11 +217,12 @@ class Mage_Core_Model_Translate */ public function getModulesConfig() { - if (!Mage::getConfig()->getNode($this->getConfig(self::CONFIG_KEY_AREA).'/translate/modules')) { + if (!Mage::getConfig()->getNode($this->getConfig(self::CONFIG_KEY_AREA) . '/translate/modules')) { return array(); } - $config = Mage::getConfig()->getNode($this->getConfig(self::CONFIG_KEY_AREA).'/translate/modules')->children(); + $config = Mage::getConfig()->getNode($this->getConfig(self::CONFIG_KEY_AREA) + . '/translate/modules')->children(); if (!$config) { return array(); } @@ -276,7 +307,7 @@ class Mage_Core_Model_Translate * @param boolean $forceReload * @return Mage_Core_Model_Translate */ - protected function _addData($data, $scope, $forceReload=false) + protected function _addData($data, $scope, $forceReload = false) { foreach ($data as $key => $value) { if ($key === $value) { @@ -286,7 +317,7 @@ class Mage_Core_Model_Translate $value = $this->_prepareDataString($value); if ($scope && isset($this->_dataScope[$key]) && !$forceReload ) { /** - * Checking previos value + * Checking previous value */ $scopeKey = $this->_dataScope[$key] . self::SCOPE_SEPARATOR . $key; if (!isset($this->_data[$scopeKey])) { @@ -297,15 +328,20 @@ class Mage_Core_Model_Translate } $scopeKey = $scope . self::SCOPE_SEPARATOR . $key; $this->_data[$scopeKey] = $value; - } - else { - $this->_data[$key] = $value; + } else { + $this->_data[$key] = $value; $this->_dataScope[$key]= $scope; } } return $this; } + /** + * Prepare data string + * + * @param string $string + * @return string + */ protected function _prepareDataString($string) { return str_replace('""', '"', $string); @@ -319,10 +355,18 @@ class Mage_Core_Model_Translate */ protected function _loadThemeTranslation($forceReload = false) { + if (!$this->_config[self::CONFIG_KEY_DESIGN_THEME]) { + return $this; + } + $requiredLocaleList = $this->_composeRequiredLocaleList($this->getLocale()); foreach ($requiredLocaleList as $locale) { $file = $this->_designPackage->getLocaleFileName('translate.csv', array('locale' => $locale)); - $this->_addData($this->_getFileData($file), false, $forceReload); + $this->_addData( + $this->_getFileData($file), + self::CONFIG_KEY_DESIGN_THEME . $this->_config[self::CONFIG_KEY_DESIGN_THEME], + $forceReload + ); } return $this; } @@ -401,7 +445,13 @@ class Mage_Core_Model_Translate return $this->_locale; } - public function setLocale( $locale ) + /** + * Set locale + * + * @param string $locale + * @return Mage_Core_Model_Translate + */ + public function setLocale($locale) { $this->_locale = $locale; return $this; @@ -410,7 +460,7 @@ class Mage_Core_Model_Translate /** * Retrieve DB resource model * - * @return unknown + * @return Mage_Core_Model_Resource_Translate */ public function getResource() { @@ -433,32 +483,31 @@ class Mage_Core_Model_Translate /** * Translate * - * @param array $args - * @return string + * @param array $args + * @return string + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * @SuppressWarnings(PHPMD.NPathComplexity) */ public function translate($args) { $text = array_shift($args); - if (is_string($text) && '' == $text - || is_null($text) - || is_bool($text) && false === $text - || is_object($text) && '' == $text->getText()) { + if ($this->_isEmptyTranslateArg($text)) { return ''; } + if ($text instanceof Mage_Core_Model_Translate_Expr) { $code = $text->getCode(self::SCOPE_SEPARATOR); $module = $text->getModule(); $text = $text->getText(); $translated = $this->_getTranslatedString($text, $code); - } - else { + } else { if (!empty($_REQUEST['theme'])) { - $module = 'frontend/default/' . $_REQUEST['theme']; + $module = self::CONFIG_KEY_DESIGN_THEME . $_REQUEST['theme']; } else { - $module = 'frontend/default/demo'; + $module = self::CONFIG_KEY_DESIGN_THEME . $this->_config[self::CONFIG_KEY_DESIGN_THEME]; } - $code = $module.self::SCOPE_SEPARATOR.$text; + $code = $module . self::SCOPE_SEPARATOR . $text; $translated = $this->_getTranslatedString($text, $code); } @@ -468,23 +517,44 @@ class Mage_Core_Model_Translate } if ($this->_translateInline && $this->getTranslateInline()) { - if (strpos($result, '{{{')===false || strpos($result, '}}}')===false || strpos($result, '}}{{')===false) { - $result = '{{{'.$result.'}}{{'.$translated.'}}{{'.$text.'}}{{'.$module.'}}}'; + if (strpos($result, '{{{') === false + || strpos($result, '}}}') === false + || strpos($result, '}}{{') === false + ) { + $result = '{{{' . $result . '}}{{' . $translated . '}}{{' . $text . '}}{{' . $module . '}}}'; } } return $result; } + /** + * Check is empty translate argument + * + * @param mixed $text + * @return bool + */ + protected function _isEmptyTranslateArg($text) + { + if (is_string($text) && '' == $text + || is_null($text) + || is_bool($text) && false === $text + || is_object($text) && '' == $text->getText() + ) { + return true; + } + return false; + } + /** * Set Translate inline mode * * @param bool $flag * @return Mage_Core_Model_Translate */ - public function setTranslateInline($flag=null) + public function setTranslateInline($flag = null) { - $this->_canUseInline = (bool) $flag; + $this->_canUseInline = (bool)$flag; return $this; } @@ -492,6 +562,7 @@ class Mage_Core_Model_Translate * Retrieve active translate mode * * @return bool + * @SuppressWarnings(PHPMD.BooleanGetMethodName) */ public function getTranslateInline() { @@ -508,16 +579,16 @@ class Mage_Core_Model_Translate if (is_null($this->_cacheId)) { $this->_cacheId = 'translate'; if (isset($this->_config[self::CONFIG_KEY_LOCALE])) { - $this->_cacheId.= '_'.$this->_config[self::CONFIG_KEY_LOCALE]; + $this->_cacheId .= '_' . $this->_config[self::CONFIG_KEY_LOCALE]; } if (isset($this->_config[self::CONFIG_KEY_AREA])) { - $this->_cacheId.= '_'.$this->_config[self::CONFIG_KEY_AREA]; + $this->_cacheId .= '_' . $this->_config[self::CONFIG_KEY_AREA]; } if (isset($this->_config[self::CONFIG_KEY_STORE])) { - $this->_cacheId.= '_'.$this->_config[self::CONFIG_KEY_STORE]; + $this->_cacheId .= '_' . $this->_config[self::CONFIG_KEY_STORE]; } if (isset($this->_config[self::CONFIG_KEY_DESIGN_THEME])) { - $this->_cacheId.= '_'.$this->_config[self::CONFIG_KEY_DESIGN_THEME]; + $this->_cacheId .= '_' . $this->_config[self::CONFIG_KEY_DESIGN_THEME]; } } return $this->_cacheId; @@ -548,7 +619,7 @@ class Mage_Core_Model_Translate if (!$this->_canUseCache()) { return $this; } - Mage::app()->saveCache(serialize($this->getData()), $this->getCacheId(), array(self::CACHE_TAG), null); + Mage::app()->saveCache(serialize($this->getData()), $this->getCacheId(), array(self::CACHE_TAG), false); return $this; } @@ -571,14 +642,11 @@ class Mage_Core_Model_Translate */ protected function _getTranslatedString($text, $code) { - $translated = ''; if (array_key_exists($code, $this->getData())) { $translated = $this->_data[$code]; - } - elseif (array_key_exists($text, $this->getData())) { + } elseif (array_key_exists($text, $this->getData())) { $translated = $this->_data[$text]; - } - else { + } else { $translated = $text; } return $translated; diff --git a/app/code/core/Mage/Core/Model/Translate/Expr.php b/app/code/core/Mage/Core/Model/Translate/Expr.php index 081dbe8358826d31f20500041ae57c44a5c4c50b..d15abf9f4dfe41e6eeb30598528ae77b9a62fa39 100644 --- a/app/code/core/Mage/Core/Model/Translate/Expr.php +++ b/app/code/core/Mage/Core/Model/Translate/Expr.php @@ -23,35 +23,60 @@ * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) */ - + /** * Translate expression object - * - * @author Magento Core Team <core@magentocommerce.com> */ class Mage_Core_Model_Translate_Expr { + /** + * Text to translate + * + * @var string + */ protected $_text; + + /** + * Module + * + * @var string + */ protected $_module; - - public function __construct($text='', $module='') + + /** + * Set string and module + * + * @param string $text + * @param string $module + */ + public function __construct($text = '', $module = '') { $this->_text = $text; $this->_module = $module; } - + + /** + * @param string $text + * @return Mage_Core_Model_Translate_Expr + */ public function setText($text) { $this->_text = $text; return $this; } - + + /** + * Set expression module + * + * @param string $module + * @return Mage_Core_Model_Translate_Expr + */ public function setModule($module) { $this->_module = $module; return $this; } - + /** * Retrieve expression text * @@ -61,7 +86,7 @@ class Mage_Core_Model_Translate_Expr { return $this->_text; } - + /** * Retrieve expression module * @@ -71,15 +96,15 @@ class Mage_Core_Model_Translate_Expr { return $this->_module; } - + /** * Retrieve expression code * * @param string $separator * @return string */ - public function getCode($separator='::') + public function getCode($separator = Mage_Core_Model_Translate::SCOPE_SEPARATOR) { - return $this->getModule().$separator.$this->getText(); + return $this->getModule() . $separator . $this->getText(); } } diff --git a/app/code/core/Mage/Core/etc/config.xml b/app/code/core/Mage/Core/etc/config.xml index c93420ebf083785935fda18577171d527c3fbd7b..c83669fcdbac8822bad6476af0b8f150457f83b4 100644 --- a/app/code/core/Mage/Core/etc/config.xml +++ b/app/code/core/Mage/Core/etc/config.xml @@ -28,7 +28,7 @@ <config> <modules> <Mage_Core> - <version>1.6.0.9</version> + <version>1.6.0.10</version> <active>true</active> <codePool>core</codePool> </Mage_Core> @@ -118,6 +118,9 @@ </parameters> <shared>0</shared> </Magento_Filesystem> + <Mage_Core_Model_Theme_Image> + <shared>0</shared> + </Mage_Core_Model_Theme_Image> </di> </global> <frontend> @@ -126,16 +129,6 @@ <full_name>default/demo</full_name> </theme> </design> - <events> - <controller_action_layout_generate_blocks_after> - <observers> - <add_theme_customization> - <class>Mage_Core_Model_Observer</class> - <method>addThemeCustomization</method> - </add_theme_customization> - </observers> - </controller_action_layout_generate_blocks_after> - </events> <routers> <core> <use>standard</use> @@ -200,7 +193,7 @@ </events> <design> <theme> - <full_name>default/basic</full_name> + <full_name>default/backend</full_name> </theme> </design> <di> diff --git a/app/code/core/Mage/Core/sql/core_setup/upgrade-1.6.0.9-1.6.0.10.php b/app/code/core/Mage/Core/sql/core_setup/upgrade-1.6.0.9-1.6.0.10.php new file mode 100644 index 0000000000000000000000000000000000000000..0ac8c501b2f0eff7c382e70fe64ca04a2c82eabf --- /dev/null +++ b/app/code/core/Mage/Core/sql/core_setup/upgrade-1.6.0.9-1.6.0.10.php @@ -0,0 +1,81 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Core + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/* @var $installer Mage_Core_Model_Resource_Setup */ +$installer = $this; + +$installer->startSetup(); +$connection = $installer->getConnection(); + +$connection->addColumn($installer->getTable('core_theme_files'), 'is_temporary', array( + 'type' => Varien_Db_Ddl_Table::TYPE_BOOLEAN, + 'nullable' => false, + 'default' => 0, + 'comment' => 'Is Temporary File' +)); + +$connection->changeColumn($installer->getTable('core_theme_files'), 'file_name', 'file_path', array( + 'type' => Varien_Db_Ddl_Table::TYPE_TEXT, + 'length' => 255, + 'nullable' => true, + 'comment' => 'Relative path to file' +)); + +$connection->changeColumn($installer->getTable('core_theme_files'), 'order', 'sort_order', array( + 'type' => Varien_Db_Ddl_Table::TYPE_SMALLINT, +)); + +/** + * Create table 'core_theme_files_link' + */ +$table = $connection->newTable($installer->getTable('core_theme_files_link')) + ->addColumn('files_link_id', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array( + 'identity' => true, + 'nullable' => false, + 'unsigned' => true, + 'primary' => true + ), 'Customization link id') + ->addColumn('theme_id', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array( + 'nullable' => false, + 'unsigned' => true, + ), 'Theme Id') + ->addColumn('layout_link_id', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array( + 'nullable' => false, + 'unsigned' => true, + ), 'Theme layout link id') + ->addForeignKey( + $installer->getFkName('core_theme_files_link', 'theme_id', 'core_theme', 'theme_id'), + 'theme_id', + $installer->getTable('core_theme'), + 'theme_id', + Varien_Db_Ddl_Table::ACTION_CASCADE, + Varien_Db_Ddl_Table::ACTION_CASCADE + ) + ->setComment('Core theme link on layout update'); + +$installer->getConnection()->createTable($table); + +$installer->endSetup(); diff --git a/app/code/core/Mage/CurrencySymbol/view/adminhtml/grid.phtml b/app/code/core/Mage/CurrencySymbol/view/adminhtml/grid.phtml index 3682c609bb4b6261cd5f13f66278850edf87a5de..3ea8ab69994460fad828d1195d39f59828c9cd14 100644 --- a/app/code/core/Mage/CurrencySymbol/view/adminhtml/grid.phtml +++ b/app/code/core/Mage/CurrencySymbol/view/adminhtml/grid.phtml @@ -29,56 +29,41 @@ * @var $this Mage_CurrencySymbol_Block_Adminhtml_System_Currencysymbol */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td style="width:50%;"><h3 class="icon-head head-system-currency"><?php echo $this->getHeader() ?></h3></td> - <td class="form-buttons"> - <?php - echo $this->getSaveButtonHtml(); - ?> - </td> - </tr> - </table> -</div> +<div class="page-actions"><?php echo $this->getSaveButtonHtml(); ?></div> <?php $this->getCurrencySymbolsData();?> <form id="currency-symbols-form" action="<?php echo $this->getFormActionUrl() ?>" method="post"> <input name="form_key" type="hidden" value="<?php echo $this->getFormKey() ?>" /> - <div class="entry-edit"> - <div class="fieldset fieldset-wide"> - <div class="grid"> - <div class="hor-scroll"> - <table cellspacing="0" class="data table-cat-img-sizes"> - <colgroup> - <col width="15%"/> - <col /> - </colgroup> - <thead> - <tr class="headings"> - <th><span class="nobr"><span class="not-sort"><?php echo $this->__('Currency'); ?></span></span></th> - <th><span class="nobr"><span class="not-sort"><?php echo $this->__('Symbol'); ?><span class="required"><em>*</em></span></span></span></th> - </tr> - </thead> - <tbody> - <?php foreach($this->getCurrencySymbolsData() as $code => $data): ?> - <tr> - <td class="label"> - <label for="custom_currency_symbol<?php echo $code; ?>"><?php echo $code; ?> (<?php echo $data['displayName']; ?>)</label> - </td> - <td class="value"> - <input id="custom_currency_symbol<?php echo $code; ?>" class=" required-entry input-text" type="text" value="<?php echo Mage::helper('Mage_Core_Helper_Data')->quoteEscape($data['displaySymbol']); ?>"<?php echo $data['inherited'] ? ' disabled="disabled"' : '';?> name="custom_currency_symbol[<?php echo $code; ?>]"> - <input id="custom_currency_symbol_inherit<?php echo $code; ?>" class="checkbox config-inherit" type="checkbox" onclick="toggleUseDefault(<?php echo '\'' . $code . '\',\'' . Mage::helper('Mage_Core_Helper_Data')->quoteEscape($data['parentSymbol'], true) . '\''; ?>)"<?php echo $data['inherited'] ? ' checked="checked"' : ''; ?> value="1" name="inherit_custom_currency_symbol[<?php echo $code; ?>]"> - <label class="inherit" title="" for="custom_currency_symbol_inherit<?php echo $code; ?>"><?php echo $this->getInheritText(); ?></label> - </td> - </tr> - <?php endforeach; ?> - </tbody> - </table> - </div> - </div> + <div class="grid"> + <div class="hor-scroll"> + <table cellspacing="0" class="data table-cat-img-sizes"> + <colgroup> + <col width="15%"/> + <col /> + </colgroup> + <thead> + <tr class="headings"> + <th><span class="nobr"><span class="not-sort"><?php echo $this->__('Currency'); ?></span></span></th> + <th><span class="nobr"><span class="not-sort"><?php echo $this->__('Symbol'); ?><span class="required"><em>*</em></span></span></span></th> + </tr> + </thead> + <tbody> + <?php foreach($this->getCurrencySymbolsData() as $code => $data): ?> + <tr> + <td class="label"> + <label for="custom_currency_symbol<?php echo $code; ?>"><?php echo $code; ?> (<?php echo $data['displayName']; ?>)</label> + </td> + <td class="value"> + <input id="custom_currency_symbol<?php echo $code; ?>" class=" required-entry input-text" type="text" value="<?php echo Mage::helper('Mage_Core_Helper_Data')->quoteEscape($data['displaySymbol']); ?>"<?php echo $data['inherited'] ? ' disabled="disabled"' : '';?> name="custom_currency_symbol[<?php echo $code; ?>]"> + <input id="custom_currency_symbol_inherit<?php echo $code; ?>" class="checkbox config-inherit" type="checkbox" onclick="toggleUseDefault(<?php echo '\'' . $code . '\',\'' . Mage::helper('Mage_Core_Helper_Data')->quoteEscape($data['parentSymbol'], true) . '\''; ?>)"<?php echo $data['inherited'] ? ' checked="checked"' : ''; ?> value="1" name="inherit_custom_currency_symbol[<?php echo $code; ?>]"> + <label for="custom_currency_symbol_inherit<?php echo $code; ?>"><?php echo $this->getInheritText(); ?></label> + </td> + </tr> + <?php endforeach; ?> + </tbody> + </table> </div> </div> </form> diff --git a/app/code/core/Mage/Customer/Service/Customer.php b/app/code/core/Mage/Customer/Service/Customer.php index 83537f61f8394f0c3277ba14582c96ab7289f180..753034c1363fb221909a73534928271cfa54ea0f 100644 --- a/app/code/core/Mage/Customer/Service/Customer.php +++ b/app/code/core/Mage/Customer/Service/Customer.php @@ -23,7 +23,7 @@ * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) */ -class Mage_Customer_Service_Customer extends Mage_Core_Service_ServiceAbstract +class Mage_Customer_Service_Customer { /** * @var callable @@ -192,6 +192,19 @@ class Mage_Customer_Service_Customer extends Mage_Core_Service_ServiceAbstract return $this; } + /** + * Sets each value from data to entity Varien_Object using setter method. + * + * @param Varien_Object $entity + * @param array $data + */ + protected function _setDataUsingMethods($entity, array $data) + { + foreach ($data as $property => $value) { + $entity->setDataUsingMethod($property, $value); + } + } + /** * Trigger before save logic * diff --git a/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme.php b/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme.php index f523e3d8034bd3d9f1fff761eab0d64ff4005caa..7167643ce0ecb82e7d286647898e5a45cf13aac2 100644 --- a/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme.php +++ b/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme.php @@ -121,7 +121,7 @@ class Mage_DesignEditor_Block_Adminhtml_Theme extends Mage_Backend_Block_Templat $saveButton = $this->getLayout()->createBlock('Mage_Backend_Block_Widget_Button'); $saveButton->setData(array( 'label' => $this->__('Save'), - 'class' => 'save', + 'class' => 'action-save', )); return $saveButton; } diff --git a/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/List/Abstract.php b/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/List/Abstract.php index a5ff2933c1bda0b92df5e01fbf0f0223e257f2f4..2f35d962925fc31e944147ec8fa410d471542748 100644 --- a/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/List/Abstract.php +++ b/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/List/Abstract.php @@ -172,7 +172,7 @@ abstract class Mage_DesignEditor_Block_Adminhtml_Theme_Selector_List_Abstract $previewButton = $this->getLayout()->createBlock('Mage_Backend_Block_Widget_Button'); $previewButton->setData(array( 'label' => $this->__('Preview Theme'), - 'class' => 'preview-default', + 'class' => 'action-theme-preview', 'data_attribute' => array( 'mage-init' => array( 'button' => array( @@ -202,7 +202,7 @@ abstract class Mage_DesignEditor_Block_Adminhtml_Theme_Selector_List_Abstract $editButton = $this->getLayout()->createBlock('Mage_Backend_Block_Widget_Button'); $editButton->setData(array( 'label' => $this->__('Edit Theme'), - 'class' => 'add edit-theme', + 'class' => 'add action-edit', 'data_attribute' => array( 'mage-init' => array( 'button' => array( diff --git a/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/List/Available.php b/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/List/Available.php index 26bead77691ee5ab4165115ed1d9c1ac1d6aa434..fe3b65ea49221e350bf4763a5b1f9bac6163ce12 100644 --- a/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/List/Available.php +++ b/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/List/Available.php @@ -131,7 +131,7 @@ class Mage_DesignEditor_Block_Adminhtml_Theme_Selector_List_Available $demoButton = $this->getLayout()->createBlock('Mage_Backend_Block_Widget_Button'); $demoButton->setData(array( 'label' => $this->__('Theme Demo'), - 'class' => 'preview-demo', + 'class' => 'action-theme-preview', 'data_attribute' => array( 'mage-init' => array( 'button' => array( diff --git a/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/List/Unassigned.php b/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/List/Unassigned.php index da38b88520d5d953552b6a2e4f9519f6e3113da7..72043fbe5f486c007035802bc69389aa3147765c 100644 --- a/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/List/Unassigned.php +++ b/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/List/Unassigned.php @@ -53,7 +53,7 @@ class Mage_DesignEditor_Block_Adminhtml_Theme_Selector_List_Unassigned $removeButton = $this->getLayout()->createBlock('Mage_Backend_Block_Widget_Button'); $removeButton->setData(array( - 'label' => $this->__('Remove Button'), + 'label' => $this->__('Remove'), 'data_attribute' => array( 'mage-init' => array( 'button' => array( @@ -68,7 +68,7 @@ class Mage_DesignEditor_Block_Adminhtml_Theme_Selector_List_Unassigned ), ), ), - 'class' => 'save delete-theme', + 'class' => 'action-delete', 'target' => '_blank' )); diff --git a/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/StoreView.php b/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/StoreView.php index 0aa20e7f09eb312bb232115e736c1c13c762c9ea..4031c6d363012ac61631bf3ca147d1b12e406663 100644 --- a/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/StoreView.php +++ b/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/StoreView.php @@ -139,8 +139,8 @@ class Mage_DesignEditor_Block_Adminhtml_Theme_Selector_StoreView extends Mage_Ba /** @var $assignSaveButton Mage_Backend_Block_Widget_Button */ $assignSaveButton = $this->getLayout()->createBlock('Mage_Backend_Block_Widget_Button'); $assignSaveButton->setData(array( - 'label' => $this->__('Done'), - 'class' => 'store-assign-done save', + 'label' => $this->__('Assign'), + 'class' => 'action-save', 'data_attribute' => array( 'mage-init' => array( 'button' => array( diff --git a/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/Tab/Available.php b/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/Tab/Available.php index c2379d93575a04cc024a79970b4e66b3e9f71abb..de66a46ce35f28e8116059df2eadd5127ac0f3a7 100644 --- a/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/Tab/Available.php +++ b/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/Tab/Available.php @@ -28,8 +28,7 @@ * Theme selector tab for available themes */ class Mage_DesignEditor_Block_Adminhtml_Theme_Selector_Tab_Available - extends Mage_Backend_Block_Template - implements Mage_Backend_Block_Widget_Tab_Interface + extends Mage_DesignEditor_Block_Adminhtml_Theme_Selector_Tab_TabAbstract { /** * Return tab content, available theme list @@ -51,34 +50,4 @@ class Mage_DesignEditor_Block_Adminhtml_Theme_Selector_Tab_Available { return $this->__('Available Themes'); } - - /** - * Return Tab label - * - * @return string - */ - public function getTabLabel() - { - return $this->getTabTitle(); - } - - /** - * Can show tab in tabs - * - * @return boolean - */ - public function canShowTab() - { - return true; - } - - /** - * Tab is hidden - * - * @return boolean - */ - public function isHidden() - { - return false; - } } diff --git a/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/Tab/Customizations.php b/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/Tab/Customizations.php index 0f9a1ae0b05918ce9008049a00235738054d7922..6639b710a9fc1bb3e4fb90340ceb84f66dba4eeb 100644 --- a/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/Tab/Customizations.php +++ b/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/Tab/Customizations.php @@ -28,8 +28,7 @@ * Theme selector tab for customized themes */ class Mage_DesignEditor_Block_Adminhtml_Theme_Selector_Tab_Customizations - extends Mage_Backend_Block_Template - implements Mage_Backend_Block_Widget_Tab_Interface + extends Mage_DesignEditor_Block_Adminhtml_Theme_Selector_Tab_TabAbstract { /** * Initialize tab block @@ -49,34 +48,4 @@ class Mage_DesignEditor_Block_Adminhtml_Theme_Selector_Tab_Customizations { return $this->__('My Customizations'); } - - /** - * Return Tab label - * - * @return string - */ - public function getTabLabel() - { - return $this->getTabTitle(); - } - - /** - * Can show tab in tabs - * - * @return boolean - */ - public function canShowTab() - { - return true; - } - - /** - * Tab is hidden - * - * @return boolean - */ - public function isHidden() - { - return false; - } } diff --git a/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/Tab/TabAbstract.php b/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/Tab/TabAbstract.php new file mode 100644 index 0000000000000000000000000000000000000000..3e07839178e8c09fc74f7c87841ad1bbdb0aa2e4 --- /dev/null +++ b/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/Tab/TabAbstract.php @@ -0,0 +1,63 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_DesignEditor + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Theme selector abstract tab + */ +abstract class Mage_DesignEditor_Block_Adminhtml_Theme_Selector_Tab_TabAbstract + extends Mage_Backend_Block_Template + implements Mage_Backend_Block_Widget_Tab_Interface +{ + /** + * Return Tab label + * + * @return string + */ + public function getTabLabel() + { + return $this->getTabTitle(); + } + + /** + * Can show tab in tabs + * + * @return boolean + */ + public function canShowTab() + { + return true; + } + + /** + * Tab is hidden + * + * @return boolean + */ + public function isHidden() + { + return false; + } +} diff --git a/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/Tabs.php b/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/Tabs.php index db972857d9e94e0b038294dc9add3e316b1bfeda..26f2b95fc882679fc9d2ca182250f2b3f4d515b2 100644 --- a/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/Tabs.php +++ b/app/code/core/Mage/DesignEditor/Block/Adminhtml/Theme/Selector/Tabs.php @@ -48,6 +48,6 @@ class Mage_DesignEditor_Block_Adminhtml_Theme_Selector_Tabs extends Mage_Backend */ protected function _toHtml() { - return parent::_toHtml() . '<div id="' . $this->getDestElementId() . '"><div>'; + return parent::_toHtml() . '<div id="' . $this->getDestElementId() . '" class="theme-selector"><div>'; } } diff --git a/app/code/core/Mage/DesignEditor/Controller/Varien/Router/Standard.php b/app/code/core/Mage/DesignEditor/Controller/Varien/Router/Standard.php index f402c76a0743e603fddb29e1cc1abc774f0575c9..4adae5b9a4bc5ab9dfbb794298a86684a9fc5f89 100644 --- a/app/code/core/Mage/DesignEditor/Controller/Varien/Router/Standard.php +++ b/app/code/core/Mage/DesignEditor/Controller/Varien/Router/Standard.php @@ -42,7 +42,6 @@ class Mage_DesignEditor_Controller_Varien_Router_Standard extends Mage_Core_Cont * @param Mage_Core_Controller_Varien_Action_Factory $controllerFactory * @param Magento_ObjectManager $objectManager * @param Magento_Filesystem $filesystem - * @param Mage_Core_Model_App $app * @param string $areaCode * @param string $baseController * @throws InvalidArgumentException @@ -51,11 +50,10 @@ class Mage_DesignEditor_Controller_Varien_Router_Standard extends Mage_Core_Cont Mage_Core_Controller_Varien_Action_Factory $controllerFactory, Magento_ObjectManager $objectManager, Magento_Filesystem $filesystem, - Mage_Core_Model_App $app, $areaCode, $baseController ) { - parent::__construct($controllerFactory, $filesystem, $app, $areaCode, $baseController); + parent::__construct($controllerFactory, $filesystem, $areaCode, $baseController); $this->_objectManager = $objectManager; } diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/MUI-Icons.eot b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/MUI-Icons.eot new file mode 100755 index 0000000000000000000000000000000000000000..78bd9fc51718fdebfb87534ceebcdca06a705ab2 Binary files /dev/null and b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/MUI-Icons.eot differ diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/MUI-Icons.svg b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/MUI-Icons.svg new file mode 100755 index 0000000000000000000000000000000000000000..316f9b877c05d190507bbca10dcaa85701490736 --- /dev/null +++ b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/MUI-Icons.svg @@ -0,0 +1,671 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG font generated by IcoMoon. +0 +</metadata> +<defs> +<font id="MUI-Icons" horiz-adv-x="512" > +<font-face units-per-em="512" ascent="480" descent="-32" /> +<missing-glyph horiz-adv-x="512" /> +<glyph unicode="" d="M 470.70,72.193l-2.688,2.688l 0.006,0.002L 360.505,182.408c 14.938,25.732, 23.612,55.564, 23.816,87.451 + c 0.626,97.615-77.986,177.243-175.599,177.857c-0.394,0.001-0.771,0.002-1.168,0.002 + c-97.06-0.006-176.063-78.391-176.688-175.598c-0.618-97.609, 77.999-177.236, 175.597-177.859 + c 0.389-0.002, 0.766-0.004, 1.155-0.004c 32.438,0.00, 62.846,8.79, 88.998,24.075l 107.415-107.433l 0.014,0.01l 2.688-2.688 + c 8.125-8.123, 21.293-8.114, 29.41,0.00l 34.562,34.557C 478.819,50.895, 478.822,64.07, 470.70,72.193z M 300.39,177.58 + c-24.834-24.67-57.78-38.252-92.768-38.252l-0.874,0.00 c-72.589,0.467-131.271,59.908-130.813,132.503 + c 0.465,72.128, 59.516,130.811, 131.626,130.815l 0.879-0.002c 35.168-0.22, 68.146-14.123, 92.852-39.148 + c 24.706-25.025, 38.188-58.178, 37.966-93.352C 339.031,235.128, 325.229,202.25, 300.39,177.58zM 128.503,287.997L 287.501,287.997L 287.501,256.203L 128.503,256.203z" /> +<glyph unicode="" d="M 470.70,72.193l-2.688,2.688l 0.006,0.002L 360.505,182.408c 14.938,25.732, 23.612,55.564, 23.816,87.451 + c 0.626,97.615-77.986,177.243-175.599,177.857c-0.394,0.001-0.771,0.002-1.168,0.002 + c-97.06-0.006-176.063-78.391-176.688-175.598c-0.618-97.609, 77.999-177.236, 175.597-177.859 + c 0.389-0.002, 0.766-0.004, 1.155-0.004c 32.438,0.00, 62.846,8.79, 88.998,24.075l 107.415-107.433l 0.014,0.01l 2.688-2.688 + c 8.125-8.123, 21.293-8.114, 29.41,0.00l 34.562,34.557C 478.819,50.895, 478.822,64.07, 470.70,72.193z M 300.39,177.58 + c-24.834-24.67-57.78-38.252-92.768-38.252l-0.874,0.00 c-72.589,0.467-131.271,59.908-130.813,132.503 + c 0.465,72.128, 59.516,130.811, 131.626,130.815l 0.879-0.002c 35.168-0.22, 68.146-14.123, 92.852-39.148 + c 24.706-25.025, 38.188-58.178, 37.966-93.352C 339.031,235.128, 325.229,202.25, 300.39,177.58zM 223.902,351.597L 192.104,351.597L 192.104,287.997L 128.503,287.997L 128.503,256.203L 192.104,256.203L 192.104,192.604L 223.902,192.604L 223.902,256.203L 287.501,256.203L 287.501,287.997L 223.902,287.997 z" /> +<glyph unicode="" d="M 466.996,351.685c-3.893,12.271-9.538,21.313-21.31,21.313c0.00,0.00-80.181,11.00-189.351,11.00c-109.169,0.00-188.677-11.00-188.677-11.00 + c-11.77,0.00-16.889-8.316-21.313-21.313c0.00,0.00-13.67-31.687-13.67-127.685s 13.67-131.685, 13.67-131.685 + c 5.282-11.107, 9.543-21.313, 21.313-21.313c0.00,0.00, 92.343-7.00, 188.34-7.00s 189.688,9.00, 189.688,9.00c 11.771,0.00, 18.218,10.248, 21.31,21.313 + c0.00,0.00, 13.00,49.185, 13.00,129.185S 466.996,351.685, 466.996,351.685z M 192.002,134.882L 192.002,313.118 L 346.358,224.00L 192.002,134.882z" /> +<glyph unicode="" d="M 259.559,206.271L 198.73,29.528c 18.165-5.344, 37.372-8.263, 57.27-8.263c 23.607,0.00, 46.25,4.077, 67.32,11.492 + c-0.539,0.868-1.039,1.793-1.451,2.795L 259.559,206.271z M 392.855,234.231c0.00,25.062-9.006,42.404-16.719,55.904 + c-10.273,16.708-19.912,30.844-19.912,47.551c0.00,18.63, 14.131,35.979, 34.045,35.979c 0.896,0.00, 1.754-0.108, 2.625-0.165 + c-36.064,33.048-84.119,53.225-136.896,53.225c-70.82,0.00-133.128-36.34-169.375-91.37c 4.757-0.153, 9.241-0.244, 13.044-0.244 + c 21.196,0.00, 54.027,2.576, 54.027,2.576c 10.929,0.639, 12.213-15.416, 1.30-16.707c0.00,0.00-10.985-1.282-23.198-1.929l 73.815-219.589 + l 44.372,133.051l-31.584,86.541c-10.92,0.645-21.262,1.926-21.262,1.926c-10.927,0.646-9.646,17.347, 1.288,16.707 + c0.00,0.00, 33.47-2.576, 53.39-2.576c 21.199,0.00, 54.031,2.576, 54.031,2.576c 10.93,0.64, 12.217-15.414, 1.297-16.707 + c0.00,0.00-11.00-1.281-23.203-1.926l 73.262-217.916l 20.23,67.559C 386.182,196.747, 392.855,216.881, 392.855,234.231z M 357.918,48.78 + c 60.27,35.14, 100.803,100.438, 100.803,175.227c0.00,35.246-9.004,68.381-24.83,97.254c 0.871-6.455, 1.365-13.382, 1.365-20.847 + c0.00-20.563-3.854-43.688-15.416-72.608L 357.918,48.78z M 53.28,224.007c0.00-80.24, 46.624-149.592, 114.259-182.448l-96.705,264.95 + C 59.581,281.298, 53.28,253.397, 53.28,224.007z M 255.996-19.985c-134.53,0.00-243.98,109.457-243.98,243.993 + c0.00,134.527, 109.448,243.978, 243.98,243.978c 134.528,0.00, 243.988-109.449, 243.988-243.978 + C 499.986,89.472, 390.526-19.985, 255.996-19.985z" /> +<glyph unicode="" d="M 511.998,192.10L 224.002,192.10L 224.002,7.489L 511.998-32.01 + zM 192.002,192.10L-0.012,192.10L-0.012,39.671L 192.002,10.416 + zM 192.002,406.668L-0.012,377.284L-0.012,223.598L 192.002,223.598 + zM 511.998,223.598L 511.998,447.50L 224.002,409.463L 224.002,223.598 + z" /> +<glyph unicode="" d="M 206.569,224.042c-23.637,12.147-46.615,18.31-68.313,18.31c-2.951,0.00-5.921-0.088-8.892-0.35 + c-27.686-2.292-52.974-9.595-69.239-15.273c-4.314-1.584-8.736-3.258-13.292-5.106L 2.331,67.344 + c 30.569,11.313, 57.616,16.814, 82.378,16.814c 40.054,0.00, 69.128-14.966, 93.14-30.373c 11.376,38.604, 38.667,131.833, 46.812,159.694 + C 218.738,217.089, 212.731,220.697, 206.569,224.042z M 264.10,184.824l-44.812-155.644c 13.294-7.615, 58.017-31.732, 92.259-31.732 + c 27.641,0.00, 58.588,7.082, 94.547,21.695l 42.786,149.614c-29.05-9.375-56.915-14.131-82.97-14.131 + C 318.371,154.627, 285.096,170.035, 264.10,184.824z M 147.409,294.954c 38.208-0.396, 66.464-14.967, 89.882-29.976l 45.954,157.227 + c-9.685,5.547-35.081,19.369-53.438,24.079c-12.082,2.816-24.782,4.269-38.251,4.269c-25.663-0.483-53.701-6.909-85.657-19.719 + L 62.082,276.949c 32.109,12.107, 59.773,18.005, 85.259,18.005C 147.364,294.954, 147.409,294.954, 147.409,294.954z M 509.669,379.509 + c-29.14-11.313-57.575-17.076-84.735-17.076c-45.426,0.00-78.922,15.756-100.623,30.899l-45.556-157.67 + c 30.592-19.672, 63.561-29.666, 98.158-29.666c 28.215,0.00, 57.442,6.776, 86.933,20.158l-0.091,1.102l 1.851,0.438L 509.669,379.509z" /> +<glyph unicode="" d="M 497.573,54.108L 268.433,440.634c-2.945,5.237-8.634,8.138-14.595,7.183c-4.403-0.699-8.153-3.409-10.269-7.183 + L 14.429,54.108c-2.514-4.467-2.518-10.199,0.00-14.646c 2.553-4.506, 7.277-7.46, 12.423-7.46l 458.294,0.00 + c 5.135,0.00, 9.876,2.954, 12.428,7.46C 500.087,43.909, 500.087,49.642, 497.573,54.108z M 61.171,64.149L 256.00,395.105 + l 194.557-330.956L 61.171,64.149 zM 257.251,138.854c-13.655,0.00-24.724-11.319-24.724-25.289c0.00-13.971, 11.068-25.29, 24.724-25.29 + s 24.724,11.319, 24.724,25.29C 281.975,127.535, 270.906,138.854, 257.251,138.854zM 239.835,160.002L 272.693,160.002L 279.811,319.998L 232.729,319.998 z" /> +<glyph unicode="" d="M 428.26,271.336c-17.425,0.00-164.791,0.00-164.791,0.00s 12.625,48.421, 17.183,81.404 + c 4.653,33.547-5.064,60.663-5.064,60.663s-16.546,42.303-21.052,44.116c-27.224,10.979-41.333-4.307-41.333-4.307 + s0.00-62.789,0.00-71.317c0.00-7.919-1.445-13.601-1.445-13.601s-68.23-106.349-76.179-114.113 + c-7.955-7.778-39.428-22.117-39.428-22.117s0.00-175.948,0.00-192.961c 1.949-3.057, 33.037,1.104, 33.831-5.85 + c 0.788-6.943, 35.429-33.252, 35.429-33.252s 163.579,0.00, 181.953,0.00s 49.90,8.939, 54.987,20.781 + c 8.712,20.289-2.082,33.68-1.728,39.291c 0.357,5.609, 27.639,9.498, 27.639,33.52c 3.612,29.285-14.391,27.271-13.421,34.07 + c 0.98,6.801, 22.257,9.203, 26.379,24.717c 3.155,11.947, 5.866,34.635-12.967,44.708 + C 490.329,218.555, 458.143,271.336, 428.26,271.336z" /> +<glyph unicode="" d="M 428.26,250.91c 18.83,10.072, 16.122,32.761, 12.968,44.708c-4.123,15.515-25.402,17.917-26.38,24.717 + c-0.973,6.799, 17.033,4.783, 13.421,34.069c0.00,24.023-27.281,27.912-27.636,33.521c-0.354,5.609, 10.437,19.003, 1.725,39.29 + c-5.087,11.844-36.612,20.782-54.987,20.782c-18.374,0.00-181.953,0.00-181.953,0.00s-34.638-26.308-35.429-33.25 + c-0.794-6.955-31.882-2.792-33.831-5.85c0.00-17.015,0.00-192.964,0.00-192.964s 31.474-14.338, 39.428-22.117 + c 7.948-7.764, 76.183-114.111, 76.183-114.111s 1.441-5.684, 1.441-13.60c0.00-8.529,0.00-71.318,0.00-71.318 + s 14.109-15.285, 41.333-4.309c 4.508,1.814, 21.053,44.117, 21.053,44.117s 9.718,27.115, 5.067,60.66 + c-4.559,32.984-17.187,81.404-17.187,81.404s 147.366,0.00, 164.792,0.00C 458.143,176.662, 490.329,229.444, 428.26,250.91z" /> +<glyph unicode="" d="M 479.194,328.27c-25.192-141.915-165.958-262.095-208.297-289.552c-42.348-27.455-80.973,10.994-94.983,40.054 + c-16.035,33.166-64.104,212.868-76.683,227.765c-12.585,14.866-50.354-14.896-50.354-14.896L 30.56,315.658 + c0.00,0.00, 76.695,91.58, 135.047,103.026c 61.872,12.141, 61.781-95.006, 76.663-154.485c 14.389-57.542, 24.063-90.471, 36.626-90.471 + c 12.591,0.00, 36.636,32.096, 62.947,81.286c 26.363,49.242-1.139,92.74-52.649,61.791C 309.804,440.436, 504.375,470.161, 479.194,328.27z" /> +<glyph unicode="" d="M 352.264,277.059l0.00-106.112 L 480.00,95.498L 480.00,351.497 L 352.264,277.059z M 299.569,351.497L 53.988,351.497 + c-11.77,0.00-21.313-9.542-21.313-21.313l0.00-212.869 c0.00-11.771, 9.543-21.313, 21.313-21.313l 245.581,0.00 + c 11.771,0.00, 21.31,9.537, 21.31,21.313L 320.879,330.184 C 320.876,341.955, 311.341,351.497, 299.569,351.497" /> +<glyph unicode="" d="M 412.316,125.949c-20.918,8.813-76.904,30.871-82.859,32.495c-7.107,4.888-14.07,21.151-17.877,29.236 + c-3.789,0.544-7.574,1.087-11.377,1.624c 0.586,12.514, 8.334,13.182, 11.377,22.742c 2.676,8.432, 0.279,19.387, 4.527,27.197 + c 2.945,5.422, 9.617,5.457, 12.949,10.104c 3.02,4.216, 5.016,11.567, 5.955,16.732c 1.715,9.441, 3.217,22.354-1.268,31.716 + c-2.57,5.38-4.199,5.897-4.918,12.426c-0.867,7.914, 2.332,33.72, 2.467,39.30c 0.326,14.477-0.025,15.654-3.527,29.754 + c0.00,0.00-4.254,12.773-10.924,16.631L 303.547,398.20l-8.217,7.615c-33.106,20.365-68.602,6.081-87.613-1.623 + c-27.389-8.893-44.709-35.711-32.618-93.018c 2.063-9.789-5.361-14.164-4.877-19.502c 1.062-11.678, 1.287-39.758, 12.322-46.672 + c 1.024-0.642, 8.854-2.605, 8.803-2.068c 1.085-11.375, 2.167-22.754, 3.247-34.125c 2.756-7.553, 9.366-8.383, 11.288-19.063 + l-8.459-2.063c-3.802-8.085-10.771-24.341-17.876-29.236c-5.955-1.624-61.941-23.683-82.861-32.495 + c-19.05-8.036-34.543-21.347-34.543-47.359c0.00-26.015-0.388-29.216-0.058-45.959l 384.914-0.918 + c0.00,17.815, 0.059,33.315, 0.059,46.877C 447.057,102.137, 431.367,117.913, 412.316,125.949zM 493.723,177.562c-11.002,4.635-40.446,16.237-43.581,17.091c-3.737,2.57-7.399,11.124-9.401,15.376 + c-1.993,0.286-3.983,0.572-5.983,0.854c 0.307,6.581, 4.383,6.934, 5.983,11.961c 1.407,4.434, 0.147,10.197, 2.382,14.305 + c 1.55,2.852, 5.058,2.87, 6.812,5.314c 1.587,2.218, 2.638,6.084, 3.131,8.80c 0.901,4.966, 1.691,11.758-0.667,16.682 + c-1.353,2.829-2.208,3.101-2.585,6.535c-0.459,4.163, 1.225,17.735, 1.297,20.67c 0.171,7.615-0.013,8.233-1.856,15.649 + c0.00,0.00-2.236,6.718-5.746,8.748l-6.99,1.206l-4.322,4.005c-17.412,10.711-36.081,3.198-46.081-0.854 + c-14.404-4.677-23.515-18.782-17.154-48.923c 1.085-5.148-2.82-7.45-2.566-10.257c 0.559-6.143, 0.676-20.912, 6.481-24.548 + c 0.538-0.337, 4.655-1.37, 4.629-1.087c 0.571-5.983, 1.14-11.967, 1.708-17.947c 1.449-3.973, 4.927-4.409, 5.938-10.027l-4.448-1.085 + c-2.00-4.252-5.665-12.802-9.402-15.376c-1.837-0.501-12.729-4.70-23.643-9.022c-2.173-0.861, 2.669-8.846, 14.237-12.501 + c 40.043-12.647, 94.992-44.956, 94.992-44.956l 55.079-0.176c0.00,9.37, 0.032,17.522, 0.032,24.655 + C 511.996,165.037, 503.744,173.335, 493.723,177.562zM 18.275,177.562c 11.002,4.635, 40.447,16.237, 43.581,17.091c 3.738,2.57, 7.40,11.124, 9.402,15.376 + c 1.993,0.286, 3.983,0.572, 5.983,0.854c-0.307,6.581-4.383,6.934-5.983,11.961c-1.407,4.434-0.147,10.197-2.382,14.305 + c-1.549,2.852-5.058,2.87-6.811,5.314c-1.588,2.218-2.639,6.084-3.132,8.80c-0.902,4.966-1.691,11.758, 0.667,16.682 + c 1.353,2.829, 2.209,3.101, 2.586,6.535c 0.458,4.163-1.227,17.735-1.297,20.67c-0.171,7.615, 0.013,8.233, 1.856,15.649 + c0.00,0.00, 2.237,6.718, 5.746,8.748l 6.992,1.206l 4.321,4.005c 17.413,10.711, 36.082,3.198, 46.081-0.854 + c 14.405-4.677, 23.515-18.782, 17.155-48.923c-1.085-5.148, 2.82-7.45, 2.565-10.257c-0.559-6.143-0.676-20.912-6.48-24.548 + c-0.539-0.337-4.657-1.37-4.63-1.087c-0.571-5.983-1.141-11.967-1.708-17.947c-1.449-3.973-4.926-4.409-5.937-10.027l 4.449-1.085 + c 2.00-4.252, 5.665-12.802, 9.402-15.376c 1.837-0.501, 12.729-4.70, 23.642-9.022c 2.174-0.861-2.667-8.846-14.237-12.501 + c-40.042-12.647-94.991-44.956-94.991-44.956l-55.081-0.176c0.00,9.37-0.031,17.522-0.031,24.655 + C 0.002,165.037, 8.254,173.335, 18.275,177.562z" /> +<glyph unicode="" d="M 461.996,351.998L 273.498,351.998 L 238.50,351.998 L 50.002,351.998 c-9.941,0.00-18.00-8.059-18.00-18.00l0.00-251.996 c0.00-9.941, 8.059-18.00, 18.00-18.00c0.00,0.00, 60.537,0.00, 67.082,0.00 + s 10.918,4.455, 10.918,10.824c0.00,4.139,0.00,8.244,0.00,10.467c0.00,5.588-4.325,10.721-9.813,10.721c-3.684,0.00-7.893,0.00-11.67,0.00 + c-6.102,0.00-10.514,4.307-10.514,10.203c0.00,4.529,0.00,5.345,0.00,11.125s 3.349,10.66, 10.514,10.66c 3.366,0.00, 17.463,0.00, 33.267,0.00 + c 2.776,0.00, 5.604,0.00, 8.437,0.00c 15.804,0.00, 29.90,0.00, 33.267,0.00c 7.165,0.00, 10.514-4.88, 10.514-10.66s0.00-6.596,0.00-11.125 + c0.00-5.896-4.412-10.203-10.514-10.203c-3.777,0.00-7.986,0.00-11.67,0.00c-5.488,0.00-9.813-5.133-9.813-10.721c0.00-2.119,0.00-5.949,0.00-9.889 + c0.00-4.417, 3.161-11.402, 9.888-11.402c 2.066,0.00, 30.587,0.00, 69.107,0.00c 11.868,0.00, 23.317,0.00, 33.999,0.00c 38.52,0.00, 67.04,0.00, 69.106,0.00 + c 6.727,0.00, 9.888,6.985, 9.888,11.402c0.00,3.939,0.00,7.77,0.00,9.889c0.00,5.588-4.325,10.721-9.813,10.721c-3.684,0.00-7.893,0.00-11.67,0.00 + c-6.102,0.00-10.514,4.307-10.514,10.203c0.00,4.529,0.00,5.345,0.00,11.125s 3.349,10.66, 10.514,10.66c 3.366,0.00, 17.463,0.00, 33.267,0.00 + c 2.833,0.00, 5.66,0.00, 8.437,0.00c 15.804,0.00, 29.90,0.00, 33.267,0.00c 7.165,0.00, 10.514-4.88, 10.514-10.66s0.00-6.596,0.00-11.125 + c0.00-5.896-4.412-10.203-10.514-10.203c-3.777,0.00-7.986,0.00-11.67,0.00c-5.488,0.00-9.813-5.133-9.813-10.721c0.00-2.223,0.00-6.328,0.00-10.467 + c0.00-6.369, 4.373-10.824, 10.918-10.824s 67.082,0.00, 67.082,0.00c 9.941,0.00, 18.00,8.059, 18.00,18.00L 480.00,333.998 + C 479.996,343.938, 471.938,351.998, 461.996,351.998z M 222.797,160.861l-7.598,0.00 c 0.001,6.537, 0.022,12.242, 0.022,17.241 + c0.00,8.832-5.885,14.749-13.03,17.763c-7.848,3.307-28.846,11.579-31.08,12.188c-2.667,1.834-5.28,7.935-6.706,10.968 + c-1.421,0.203-2.84,0.407-4.267,0.607c 0.219,4.693, 3.126,4.947, 4.267,8.532c 1.003,3.162, 0.104,7.271, 1.698,10.20 + c 1.105,2.035, 3.607,2.048, 4.858,3.791c 1.131,1.582, 1.881,4.339, 2.232,6.277c 0.645,3.541, 1.208,8.384-0.474,11.896 + c-0.965,2.017-1.576,2.211-1.846,4.66c-0.325,2.97, 0.875,12.648, 0.926,14.742c 0.122,5.431-0.01,5.872-1.323,11.16 + c0.00,0.00-1.596,4.792-4.098,6.238l-4.986,0.86l-3.082,2.856c-12.417,7.638-25.731,2.281-32.863-0.608 + c-10.272-3.336-16.77-13.396-12.234-34.89c 0.774-3.672-2.011-5.313-1.829-7.315c 0.397-4.38, 0.482-14.913, 4.622-17.506 + c 0.383-0.24, 3.32-0.977, 3.301-0.776c 0.407-4.266, 0.813-8.535, 1.219-12.799c 1.033-2.833, 3.513-3.144, 4.233-7.149l-3.172-0.774 + c-1.427-3.033-4.041-9.13-6.706-10.968c-2.233-0.608-23.233-8.881-31.08-12.188c-7.145-3.014-12.956-8.007-12.956-17.763 + c0.00-9.759-0.145-10.958-0.022-17.239l 0.818-0.002l-7.482,0.00 L 64.159,319.50 l 158.638,0.00 L 222.797,160.861 z M 447.996,192.002L 256.002,192.002 l0.00,20.896 l 191.994,0.00 + L 447.996,192.002 z M 447.996,234.831L 256.002,234.831 l0.00,20.896 l 191.994,0.00 L 447.996,234.831 z M 447.996,288.409L 256.002,288.409 L 256.002,319.50 l 191.994,0.00 L 447.996,288.409 z" /> +<glyph unicode="" d="M 341.438,405.093c 4.086-16.444, 4.494-17.816, 4.115-34.70c-0.157-6.507-3.89-36.603-2.878-45.832 + c 0.838-7.614, 2.737-8.217, 5.736-14.491c 5.229-10.918, 3.478-25.977, 1.478-36.987c-1.095-6.023-3.424-14.597-6.944-19.514 + c-3.886-5.418-11.666-5.459-15.102-11.782c-4.955-9.108-2.16-21.884-5.28-31.717 + c-3.549-11.149-12.585-11.928-13.267-26.521c 4.435-0.626, 8.848-1.26, 13.267-1.895c 4.439-9.428, 12.56-28.395, 20.848-34.095 + c 6.946-1.894, 72.235-27.618, 96.632-37.896c 22.216-9.371, 40.514-27.77, 40.514-55.229c0.00-15.816-0.068-33.892-0.068-54.668 + l-448.883,1.07c-0.385,19.526, 0.067,23.259, 0.067,53.598c0.00,30.335, 18.068,45.858, 40.284,55.229 + c 24.396,10.277, 89.688,36.002, 96.632,37.896c 8.287,5.709, 16.414,24.667, 20.848,34.095l 9.865,2.406 + c-2.241,12.455-9.95,13.424-13.164,22.231c-1.259,13.261-2.521,26.53-3.787,39.795c 0.059-0.626-9.072,1.665-10.267,2.413 + c-12.869,8.063-13.131,40.81-14.369,54.429c-0.565,6.225, 8.094,11.327, 5.688,22.743 + C 149.30,392.502, 169.50,423.777, 201.44,434.148c 22.171,8.984, 63.565,25.642, 102.174,1.893l 9.581-8.88l 15.504-2.673 + C 336.478,419.988, 341.438,405.093, 341.438,405.093" /> +<glyph unicode="" d="M 388.92,302.163c-7.027,0.00-13.911-0.609-20.617-1.732c-16.737,54.689-68.557,94.554-129.936,94.554 + c-74.919,0.00-135.636-59.366-135.636-132.605c0.00-6.534, 0.51-12.956, 1.446-19.247c-3.597,0.413-7.228,0.692-10.935,0.692 + c-50.938,0.00-92.237-40.385-92.237-90.168c0.00-49.81, 41.299-90.174, 92.237-90.174l 130.76,0.00 l0.00,64.52 l-56.678,0.00 l 89.248,117.308 + l 89.245-117.308L 288.00,128.003 l0.00-64.519 l 100.921,0.00 c 67.425,0.00, 122.069,53.43, 122.069,119.339 + C 510.992,248.735, 456.348,302.163, 388.92,302.163z" /> +<glyph unicode="" d="M 384.00,256.00L 256.00,384.00L 128.00,256.00L 384.00,256.00 z M 128.00,160.00l 128.00-128.00l 128.00,128.00L 128.00,160.00 z" /> +<glyph unicode="" d="M 202.56,278.828l-55.689,55.691c 28.066,27.734, 66.521,44.819, 109.13,44.819 + c 42.994-0.015, 81.616-17.334, 109.84-45.497c 28.158-28.218, 45.479-66.842, 45.492-109.847l 67.541,0.00 + C 478.85,347.104, 379.10,446.855, 255.998,446.88c-61.131,0.00-116.631-24.702-156.896-64.598L 47.707,433.679l 0.003-154.851L 202.56,278.828 z + M 366.408,114.775c-28.175-28.492-67.166-46.114-110.409-46.105c-43.007,0.008-81.625,17.331-109.841,45.492 + c-28.173,28.214-45.483,66.832-45.50,109.832L 33.126,223.994 c 0.018-123.10, 99.767-222.846, 222.873-222.874 + c 61.783,0.008, 117.812,25.24, 158.173,65.894l 50.007-50.011L 464.179,168.10 L 313.086,168.10 L 366.408,114.775z" /> +<glyph unicode="" d="M 402.127,223.999l-38.709,0.00 L 199.585,223.999 l-0.003,72.491c0.00,28.30-10.741,54.276-28.521,73.284 + c-17.706,19.012-43.014,31.258-70.917,31.235c-27.905,0.022-53.211-12.224-70.917-31.235 + c-17.785-19.008-28.521-44.985-28.522-73.285l0.00-73.395 l 51.881,0.00 l0.00,11.458 L 22.26,264.875l 30.322,0.00 l0.00,31.613 + c0.00,15.106, 5.712,28.409, 14.524,37.845c 8.897,9.432, 20.351,14.772, 33.035,14.793c 12.688-0.021, 24.13-5.361, 33.027-14.793 + c 8.823-9.436, 15.436-22.738, 15.432-37.845l0.00-72.49 l-0.021,0.00 l-38.708,0.00 c-7.66,0.00-13.869-6.206-13.869-13.865l0.00-164.199 + c0.00-7.66, 6.209-13.869, 13.869-13.869l 292.255,0.00 c 7.665,0.00, 13.869,6.209, 13.869,13.869L 415.995,210.132 + C 415.996,217.793, 409.792,223.999, 402.127,223.999z" /> +<glyph unicode="" d="M 224.00,92.186L 224.00-32.00 L 32.00,160.00l 192.00,192.00l0.00-126.912 C 447.375,219.848, 437.794,376.984, 380.931,480.00 + C 521.285,328.293, 491.48,85.215, 224.00,92.186z" /> +<glyph unicode="" d="M 79.536,313.536c 26.688,0.00, 48.317,21.619, 48.317,48.307c0.00,26.688-21.633,48.308-48.317,48.308 + c-26.688,0.00-48.321-21.621-48.321-48.308C 31.215,335.156, 52.849,313.536, 79.536,313.536z M 80.632,273.397 + c-26.688,0.00-48.321-21.633-48.321-48.307c0.00-26.688, 21.634-48.32, 48.321-48.32c 26.661,0.00, 48.294,21.633, 48.294,48.32 + C 128.927,251.764, 107.293,273.397, 80.632,273.397z M 79.536,134.49c-26.688,0.00-48.321-21.633-48.321-48.32 + s 21.634-48.321, 48.321-48.321c 26.687,0.00, 48.317,21.636, 48.317,48.321C 127.856,112.857, 106.224,134.49, 79.536,134.49z + M 479.93,401.18L 179.733,401.18 l0.00-82.189 L 479.93,318.991 L 479.93,401.18 z M 179.733,44.587l 301.051,0.00 l0.00,83.06 L 179.733,127.647 L 179.733,44.587 z M 179.733,264.546l0.00-83.045 + l 301.051,0.00 l0.00,83.045 L 179.733,264.546 z" /> +<glyph unicode="" d="M 512.00,382.791c-18.839-8.354-39.082-14.001-60.33-16.54c 21.686,13.00, 38.343,33.585, 46.186,58.115 + c-20.298-12.039-42.778-20.78-66.705-25.49c-19.16,20.415-46.461,33.17-76.673,33.17c-58.011,0.00-105.044-47.029-105.044-105.039 + c0.00-8.233, 0.929-16.25, 2.72-23.939c-87.30,4.382-164.70,46.20-216.509,109.753c-9.042-15.514-14.223-33.558-14.223-52.809 + c0.00-36.444, 18.544-68.596, 46.729-87.433c-17.219,0.546-33.416,5.271-47.576,13.139c-0.011-0.438-0.011-0.878-0.011-1.321 + c0.00-50.894, 36.209-93.348, 84.262-103.00c-8.813-2.399-18.095-3.686-27.675-3.686c-6.769,0.00-13.349,0.66-19.764,1.886 + c 13.368-41.729, 52.16-72.103, 98.126-72.948c-35.95-28.174-81.243-44.967-130.458-44.967c-8.479,0.00-16.84,0.497-25.058,1.471 + c 46.485-29.806, 101.701-47.197, 161.021-47.197c 193.211,0.00, 298.868,160.063, 298.868,298.872c0.00,4.554-0.104,9.084-0.305,13.59 + C 480.109,343.227, 497.918,361.727, 512.00,382.791z" /> +<glyph unicode="" d="M 442.164,448.415l-141.789-0.003L 34.382,183.809l 183.987-183.992l 261.465,261.466L 479.834,410.746 L 442.164,448.415z + M 431.832,346.733c-14.828-14.833-38.88-14.833-53.709,0.00c-14.834,14.827-14.834,38.876,0.00,53.707 + c 14.826,14.839, 38.881,14.839, 53.709,0.004C 446.664,385.61, 446.665,361.559, 431.832,346.733" /> +<glyph unicode="" d="M 63.50,416.50l 385.00,0.00 l0.00-385.00 l-385.00,0.00 L 63.50,416.50 z" /> +<glyph unicode="" d="M 256.004,377.987l 47.684-99.429c 4.326-9.021, 12.865-15.292, 22.768-16.721l 91.258-13.162l-64.933-67.069 + c-6.173-6.376-9.206-15.158-8.284-23.984l 10.294-98.526l-82.57,52.256c-4.80,3.038-10.363,4.65-16.044,4.65l-0.304,0.00 + L 256.004,377.987 M 256.006,447.361L 181.263,291.53L 31.897,271.076l 105.769-110.336l-16.769-159.911l 134.975,85.174 + c 0.11,0.00, 0.177,0.00, 0.304,0.00l 134.885-85.363l-16.727,160.101l 105.769,109.248L 330.737,291.53L 256.006,447.361L 256.006,447.361z" /> +<glyph unicode="" d="M 256.004,377.987l 47.684-99.429c 4.326-9.021, 12.865-15.292, 22.768-16.721l 91.258-13.162l-64.933-67.069 + c-6.173-6.376-9.206-15.158-8.284-23.984l 10.294-98.526l-82.57,52.256c-4.80,3.038-10.363,4.65-16.044,4.65l-0.304,0.00 + c-5.667,0.00-11.218-1.605-16.01-4.629l-82.68-52.174l 10.32,98.411c 0.92,8.778-2.072,17.518-8.18,23.889L 94.29,249.34 + l 91.043,12.468c 9.987,1.368, 18.62,7.66, 22.979,16.749L 256.004,377.987 M 256.006,447.361L 181.263,291.53L 31.897,271.076 + l 105.769-110.336l-16.769-159.911l 134.975,85.174c 0.11,0.00, 0.177,0.00, 0.304,0.00l 134.885-85.363l-16.727,160.101l 105.769,109.248 + L 330.737,291.53L 256.006,447.361L 256.006,447.361z" /> +<glyph unicode="" d="M 391.061,0.639l-16.727,160.101l 105.769,109.248L 330.737,291.53L 256.006,447.361L 181.263,291.53L 31.897,271.076 + l 105.769-110.336l-16.769-159.911l 134.975,85.174c 0.11,0.00, 0.177,0.00, 0.304,0.00L 391.061,0.639z" /> +<glyph unicode="" d="M 32.005,64.994L 96.50,64.994L 96.50,0.496L 32.005,0.496zM 32.005,160.745L 192.024,160.745L 192.024,96.248L 32.005,96.248zM 32.005,256.496L 288.00,256.496L 288.00,191.998L 32.005,191.998zM 32.005,352.247L 383.996,352.247L 383.996,287.75L 32.005,287.75zM 32.005,447.998L 479.996,447.998L 479.996,383.501L 32.005,383.501z" /> +<glyph unicode="" d="M 32.005,447.998L 96.50,447.998L 96.50,383.50L 32.005,383.50zM 32.005,352.247L 192.024,352.247L 192.024,287.749L 32.005,287.749zM 32.005,256.496L 288.00,256.496L 288.00,191.998L 32.005,191.998zM 32.005,160.744L 383.996,160.744L 383.996,96.247L 32.005,96.247zM 32.005,64.993L 479.996,64.993L 479.996,0.496L 32.005,0.496z" /> +<glyph unicode="" d="M 160.187,61.865c-16.125,0.00-29.188-13.065-29.188-29.19c0.00-16.127, 13.063-29.188, 29.188-29.188 + c 16.113,0.00, 29.188,13.062, 29.188,29.188C 189.372,48.80, 176.30,61.865, 160.187,61.865z M 255.917,61.865 + c-16.126,0.00-29.19-13.065-29.19-29.19c0.00-16.127, 13.064-29.188, 29.19-29.188c 16.108,0.00, 29.179,13.062, 29.179,29.188 + C 285.096,48.80, 272.028,61.865, 255.917,61.865z M 255.909,13.776c-10.436,0.00-18.894,8.459-18.894,18.891 + c0.00,10.447, 8.458,18.905, 18.894,18.905c 10.435,0.00, 18.892-8.458, 18.892-18.905 + C 274.801,22.235, 266.344,13.776, 255.909,13.776z M 32.479,416.00l0.00-320.00 l 449.247,0.00 L 481.726,416.00 L 32.479,416.00 z M 441.835,136.352L 73.713,136.352 + l-0.021,238.021l 366.813,0.00 l0.00-0.012 l 1.329,0.00 L 441.835,136.352L 441.835,136.352z M 351.763,61.865 + c-16.126,0.00-29.188-13.065-29.188-29.19c0.00-16.127, 13.063-29.188, 29.188-29.188c 16.112,0.00, 29.183,13.062, 29.183,29.188 + C 380.94,48.80, 367.875,61.865, 351.763,61.865z M 351.755,13.776c-10.436,0.00-18.894,8.459-18.894,18.891 + c0.00,10.447, 8.458,18.905, 18.894,18.905c 10.438,0.00, 18.896-8.458, 18.896-18.905 + C 370.646,22.235, 362.188,13.776, 351.755,13.776z" /> +<glyph unicode="" d="M 470.70,72.193l-2.688,2.688l 0.006,0.002L 360.505,182.408c 14.938,25.732, 23.612,55.564, 23.816,87.451 + c 0.626,97.615-77.986,177.243-175.599,177.857c-0.394,0.001-0.771,0.002-1.168,0.002 + c-97.06-0.006-176.063-78.391-176.688-175.598c-0.618-97.609, 77.999-177.236, 175.597-177.859 + c 0.389-0.002, 0.766-0.004, 1.155-0.004c 32.438,0.00, 62.846,8.79, 88.998,24.075l 107.415-107.433l 0.014,0.01l 2.688-2.688 + c 8.125-8.123, 21.293-8.114, 29.41,0.00l 34.562,34.557C 478.819,50.895, 478.822,64.07, 470.70,72.193z M 300.39,177.58 + c-24.834-24.67-57.78-38.252-92.768-38.252l-0.874,0.00 c-72.589,0.467-131.271,59.908-130.813,132.503 + c 0.465,72.128, 59.516,130.811, 131.626,130.815l 0.879-0.002c 35.168-0.22, 68.146-14.123, 92.852-39.148 + c 24.706-25.025, 38.188-58.178, 37.966-93.352C 339.031,235.128, 325.229,202.25, 300.39,177.58z" /> +<glyph unicode="" d="M 33.736,60.543A60.868,61.532 180.00 1,0 155.472,60.543000000000006A60.868,61.532 180.00 1,0 33.736,60.543000000000006zM 327.928-0.988l-86.229,0.00 c0.00,116.114-93.109,210.243-207.963,210.243l0.00,0.00l0.00,87.168 + C 196.222,296.423, 327.928,163.273, 327.928-0.988zM 388.798-0.988c0.00,198.244-158.96,358.949-355.062,358.949L 33.736,447.697 c 245.118,0.00, 443.826-200.885, 443.826-448.686L 388.798-0.989 + z" /> +<glyph unicode="" d="M 32.005,447.998L 479.996,447.998L 479.996,383.50L 32.005,383.50zM 32.005,352.247L 479.996,352.247L 479.996,287.749L 32.005,287.749zM 32.005,256.496L 479.996,256.496L 479.996,191.998L 32.005,191.998zM 32.005,160.744L 479.996,160.744L 479.996,96.247L 32.005,96.247zM 32.005,64.993L 479.996,64.993L 479.996,0.496L 32.005,0.496z" /> +<glyph unicode="" d="M 224.01,351.904l-67.942,0.00 L 256.012,472.979L 355.937,351.90l-67.932,0.00 l-0.001-255.803l 67.932,0.00 L 255.99-24.979 + l-99.927,121.076l 67.943,0.00 L 224.01,351.904z" /> +<glyph unicode="" d="M 383.904,255.996l0.00,67.942 l 121.074-99.944L 383.90,124.069l0.00,67.932 l-255.803,0.001l0.00-67.932 L 7.022,224.016 + l 121.076,99.926l0.00-67.943 L 383.904,255.996z" /> +<glyph unicode="" d="M 288.00,355.814L 288.00,480.00 l 192.00-192.00L 288.00,96.00L 288.00,222.912 C 64.625,228.153, 74.206,71.016, 131.069-32.00 + C-9.286,119.707, 20.52,362.785, 288.00,355.814z" /> +<glyph unicode="" d="M 346.842,54.611c 21.076,11.557, 39.271,26.125, 54.399,43.698c 15.199,17.575, 26.912,37.946, 35.285,61.009 + c 7.671,21.094, 11.471,40.729, 11.471,64.424c0.00,2.285-0.105,192.828-0.105,192.828L 256.00,416.57 l0.00-192.018 l 93.728,0.00 + c-0.599-26.107-5.876-45.195-15.728-63.121c-10.163-18.525-29.167-32.827-58.054-42.75l-3.201-1.092l0.00-85.777 l 5.313,0.703 + C 302.758,35.683, 325.696,43.07, 346.842,54.611M 51.917,118.301l-3.171-1.092l0.00-85.779 l 5.316,0.704c 24.666,3.168, 47.64,10.556, 68.791,22.097 + c 21.074,11.557, 39.229,26.125, 54.392,43.698c 15.206,17.575, 26.949,37.947, 35.288,61.01 + c 7.67,21.093, 11.469,40.728, 11.469,64.424c0.00,2.284-0.076,192.825-0.076,192.825L 32.005,416.188 l0.00-192.017 l 93.729,0.00 + c-0.563-26.107-5.872-45.194-15.724-63.122C 99.839,142.525, 80.804,128.223, 51.917,118.301" /> +<glyph unicode="" d="M 133.16,393.389c-21.076-11.557-39.271-26.125-54.399-43.698c-15.199-17.575-26.912-37.947-35.285-61.009 + c-7.671-21.094-11.471-40.728-11.471-64.423c0.00-2.285, 0.105-192.828, 0.105-192.828l 191.892,0.00 L 224.002,223.447 l-93.728,0.00 + c 0.599,26.107, 5.876,45.195, 15.728,63.122c 10.163,18.524, 29.167,32.827, 58.054,42.75l 3.201,1.091L 207.257,416.188 l-5.313-0.704 + C 177.244,412.317, 154.306,404.929, 133.16,393.389M 428.085,329.699l 3.171,1.091L 431.256,416.57 l-5.316-0.704c-24.666-3.168-47.64-10.555-68.791-22.097 + c-21.074-11.557-39.229-26.125-54.392-43.698c-15.206-17.576-26.949-37.947-35.288-61.01 + C 259.799,267.968, 256.00,248.334, 256.00,224.638c0.00-2.284, 0.076-192.825, 0.076-192.825l 191.921,0.00 L 447.997,223.829 l-93.729,0.00 + c 0.563,26.107, 5.872,45.195, 15.724,63.122C 380.163,305.475, 399.198,319.777, 428.085,329.699" /> +<glyph unicode="" d="M 461.998,287.998l-44.865,0.00 l0.00,74.991 l-85.277,85.21L 96.004,448.199 l0.00-160.201 l-46.00,0.00 c-9.941,0.00-18.00-8.059-18.00-18.00l0.00-187.996 + c0.00-9.941, 8.059-18.00, 18.00-18.00l 46.00,0.00 l0.00-64.50 l 321.128,0.00 l0.00,64.50 l 44.865,0.00 c 9.941,0.00, 18.00,8.059, 18.00,18.00L 479.997,269.998 + C 479.998,279.938, 471.939,287.998, 461.998,287.998z M 96.004,97.50L 64.255,97.50 l0.00,93.654 l0.00,0.848 l 31.749,0.00 L 96.004,97.50 z M 319.37,415.375 + l 64.453-63.377L 319.37,351.998 L 319.37,415.375 z M 383.998,32.002L 128.004,32.002 l0.00,160.00 l 255.994,0.00 L 383.998,32.002 z M 383.998,287.998L 128.004,287.998 l0.00,128.00 l 159.998,0.00 l0.00-96.00 + l 95.996,0.00 L 383.998,287.998 z M 448.298,97.50l-31.165,0.00 l0.00,94.502 l 30.118,0.00 l 1.047,0.00 L 448.298,97.50 zM 160.127,96.002L 351.50,96.002L 351.50,62.629L 160.127,62.629zM 160.127,161.437L 351.50,161.437L 351.50,128.064L 160.127,128.064z" /> +<glyph unicode="" d="M 427.182,320.352L 325.629,320.352 c 6.396,3.992, 12.695,8.69, 18.575,14.393c 30.401,29.163, 39.269,69.303, 19.804,89.555 + c-7.468,7.76-17.991,11.484-29.858,11.484c-19.118,0.00-41.686-9.681-60.437-27.676c-7.679-7.383-13.959-15.469-18.775-23.762 + c-4.834,8.293-11.11,16.378-18.793,23.762c-18.751,18.001-41.301,27.676-60.419,27.676c-11.881,0.00-22.435-3.724-29.903-11.484 + c-19.458-20.252-10.587-60.392, 19.814-89.555c 5.896-5.703, 12.166-10.401, 18.606-14.393L 84.818,320.352 L 64.002,320.352 l0.00-98.164 l 32.00,0.00 l0.00-222.048 l 319.994,0.00 + L 415.996,222.188 l 32.00,0.00 l0.00,98.164 L 427.182,320.352 z M 272.212,353.958c 2.513,11.443, 10.075,23.888, 20.734,34.136 + c 15.289,14.705, 31.298,19.919, 41.21,19.919c 2.606,0.00, 7.359-0.37, 9.83-2.943c 2.662-2.773, 3.327-8.961, 1.711-16.206 + c-2.525-11.47-10.088-23.908-20.733-34.146c-15.303-14.691-31.298-19.905-41.196-19.905c-2.607,0.00-7.359,0.383-9.845,2.943 + C 271.248,340.529, 270.61,346.714, 272.212,353.958z M 275.77,316.343l0.00-92.344 l-41.668,0.00 l0.00,92.344 L 275.77,316.343 z M 164.137,388.864 + c-1.599,7.244-0.954,13.432, 1.71,16.206c 2.481,2.573, 7.22,2.943, 9.872,2.943c 9.885,0.00, 25.894-5.214, 41.183-19.933 + c 10.659-10.241, 18.208-22.686, 20.73-34.122c 1.599-7.244, 0.954-13.429-1.724-16.202c-2.469-2.56-7.238-2.943-9.845-2.943 + c-9.892,0.00-25.867,5.214-41.183,19.905C 174.235,364.957, 166.672,377.394, 164.137,388.864z M 411.896,128.002L 275.77,128.002 l0.00-124.127 l-41.668,0.00 + L 234.102,128.002 L 100.935,128.002 l0.00,32.165 l 133.167,0.00 l0.00,46.00 l 41.668,0.00 l0.00-46.00 l 136.126,0.00 L 411.896,128.002 z" /> +<glyph unicode="" d="M 255.982,360.004L 418.982,128.01L 93.018,128.002 z" /> +<glyph unicode="" d="M 392.004,223.983L 160.01,386.982L 160.002,61.018 z" /> +<glyph unicode="" d="M 119.995,223.983L 351.988,386.982L 351.996,61.018 z" /> +<glyph unicode="" d="M 255.982,87.996L 418.982,319.99L 93.018,319.998 z" /> +<glyph unicode="" d="M 415.996,255.998L 287.998,255.998L 287.998,383.998L 224.002,383.998L 224.002,255.998L 96.002,255.998L 96.002,192.002L 224.002,192.002L 224.002,64.002L 287.998,64.002L 287.998,192.002L 415.996,192.002 z" /> +<glyph unicode="" d="M 96.002,451.331L 436.998,224.00L 96.002-3.331L 96.002,451.331 z" /> +<glyph unicode="" d="M 461.173,351.998L 351.786,351.998 l-25.911,53.007c0.00,0.00-5.165,10.993-18.42,10.993c-10.21,0.00-74.079,0.00-102.888,0.00 + c-14.414,0.00-19.231-10.909-19.231-10.909l-25.131-53.091L 49.372,351.998 c-9.941,0.00-18.00-8.06-18.00-18.00l0.00-251.736 c0.00-9.941, 8.059-18.00, 18.00-18.00l 411.801,0.00 + c 9.941,0.00, 18.00,8.059, 18.00,18.00L 479.173,333.998 C 479.173,343.938, 471.114,351.998, 461.173,351.998z M 255.271,105.43 + c-60.684,0.00-110.007,49.37-110.007,110.016c0.00,60.665, 49.339,110.012, 110.007,110.012c 60.656,0.00, 110.022-49.347, 110.022-110.012 + C 365.294,154.791, 315.928,105.43, 255.271,105.43zM 255.271,281.456c-36.397,0.00-66.007-29.597-66.007-66.01c0.00-36.39, 29.609-66.001, 66.007-66.001 + c 36.404,0.00, 66.008,29.611, 66.008,66.001C 321.279,251.859, 291.676,281.456, 255.271,281.456z" /> +<glyph unicode="" d="M 351.528,188.046c-6.412,3.971-16.018,2.871-21.464-2.468l-42.484-42.472 + c-5.434-5.339-14.086-5.339-19.425,0.00l-95.473,95.506c-5.345,5.346-5.345,14.079,0.00,19.424l 40.016,40.003 + c 5.353,5.346, 6.131,14.763, 1.798,20.933L 141.695,422.18c-4.299,6.164-12.724,7.372-18.626,2.676c0.00,0.00-56.792-45.067-56.792-86.471 + c0.00-169.442, 137.367-306.795, 306.795-306.795c 41.425,0.00, 81.708,76.009, 81.708,76.009c 3.542,6.666, 1.194,15.413-5.217,19.383 + L 351.528,188.046z" /> +<glyph unicode="" d="M 440.316,414.613c 12.849-6.288, 24.047-15.243, 32.251-26.241c 17.269-23.15, 22.118-54.686, 14.418-93.733 + c-7.78-39.513-25.208-72.868-50.583-97.022c-4.641-4.852-9.611-9.373-14.902-13.54c-27.178-21.401-61.498-32.714-99.254-32.714 + l-6.056,0.00 L 202.217,151.363 L 169.935,0.00l-66.212,0.00 l 5.043,23.15l 23.064,0.00 l 32.281,151.363l 94.136,0.00 c 90.124,0.00, 165.469,55.538, 185.629,149.967 + C 466.736,431.398, 390.076,480.00, 324.171,480.00L 99.532,480.00 L0.00,23.15l 76.016,0.00 L 64.00-32.00l 131.83,0.00 l 32.281,151.363l 94.135,0.00 + c 90.125,0.00, 165.47,55.539, 185.63,149.968C 524.733,348.171, 487.474,395.297, 440.316,414.613z M 211.172,386.959l 64.565,0.00 + c 32.296,0.00, 53.801-27.769, 44.394-62.478c-8.068-34.72-41.693-62.488-75.32-62.488l-61.879,0.00 L 211.172,386.959z" /> +<glyph unicode="" d="M 96.002,415.333l 96.00,0.00 l0.00-382.667 l-96.00,0.00 L 96.002,415.333 z M 321.413,415.333l 94.583,0.00 l0.00-382.667 l-94.583,0.00 L 321.413,415.333 z" /> +<glyph unicode="" d="M 68.436,311.144l 22.881,0.00 L 91.317,424.772 L 72.669,424.772 c0.00-0.991-0.271-2.505-0.857-4.541c-0.991-3.39-2.465-6.122-4.367-8.158 + c-2.813-2.975-6.479-4.957-10.958-5.948c-2.813-0.63-7.739-1.099-14.763-1.42l0.00-15.192 l 26.712,0.00 L 68.436,311.144 z M 64.685,219.003 + c-11.843-8.466-19.345-16.45-22.532-24.032c-3.296-6.726-5.033-14.174-5.252-22.318l 77.729,0.00 l0.00,19.666 L 65.09,192.319 + c 1.393,2.357, 3.135,4.396, 5.197,6.162c 2.063,1.795, 5.895,4.662, 11.49,8.627l 8.926,6.324 + c 7.525,5.33, 12.938,10.153, 16.233,14.494c 5.01,6.523, 7.528,13.985, 7.528,22.385c0.00,10.959-3.563,19.76-10.663,26.404 + c-7.101,6.658-16.666,9.98-28.669,9.98c-15.191,0.00-25.774-5.653-31.723-16.986c-3.139-5.948-4.876-13.745-5.251-23.391 + l 21.675,0.00 c 0.269,6.363, 1.099,10.999, 2.492,13.933c 2.465,5.051, 7.069,7.582, 13.879,7.582c 4.956,0.00, 8.761-1.594, 11.413-4.769 + c 2.648-3.188, 3.988-7.167, 3.988-11.977c0.00-5.895-2.331-11.32-6.966-16.276C 81.618,231.623, 74.974,226.358, 64.685,219.003z + M 110.151,86.539c-4.18,3.832-7.364,5.732-9.592,5.732c 2.947,1.146, 5.813,3.297, 8.547,6.432 + c 4.341,5.037, 6.515,11.199, 6.515,18.514c0.00,10.344-3.617,18.567-10.905,24.73c-7.261,6.135-16.825,9.217-28.722,9.217 + c-6.381,0.00-11.789-0.777-16.156-2.331c-4.396-1.526-8.198-3.778-11.391-6.672c-4.283-4.126-7.422-8.601-9.431-13.45 + c-1.876-5.546-2.947-11.413-3.162-17.576l 22.801,0.00 c-0.104,6.109, 1.183,10.985, 3.889,14.656s 6.938,5.492, 12.70,5.492 + c 5.01,0.00, 8.896-1.50, 11.651-4.447c 2.759-3.001, 4.152-6.859, 4.152-11.574c0.00-7.342-2.706-12.164-8.118-14.576 + c-3.135-1.439-8.654-2.189-16.558-2.304l0.00-17.495 c 8.063,0.00, 13.981-0.771, 17.764-2.305c 6.591-2.76, 9.913-8.199, 9.913-16.371 + c0.00-6.162-1.795-10.904-5.358-14.20c-3.563-3.269-7.717-4.896-12.513-4.896c-7.823,0.00-13.209,2.974-16.156,8.976 + c-1.604,3.271-2.411,7.396-2.411,12.354L 33.632,64.445 c 0.402-9.893, 2.385-17.87, 6.002-23.979 + c 6.832-11.494, 19.05-17.228, 36.625-17.228c 14.254,0.00, 25.025,3.985, 32.312,11.943c 7.288,7.957, 10.936,17.20, 10.936,27.73 + C 119.503,72.90, 116.368,80.777, 110.151,86.539z M 480.145,401.296L 179.949,401.296 l0.00-82.189 l 300.188,0.00 L 480.145,401.296L 480.145,401.296z + M 179.949,44.703L 481.00,44.703 l0.00,83.059 L 179.949,127.762 L 179.949,44.703 z M 179.949,264.663l0.00-83.045 L 481.00,181.618 l0.00,83.045 L 179.949,264.663 z" /> +<glyph unicode="" d="M 409.947,370.39c-12.927,12.917-33.873,12.917-46.794,0.00c-12.92-12.922-12.92-33.87,0.00-46.794l0.00,0.006 + c 29.647-29.682, 44.347-68.266, 44.382-107.154c-0.035-38.892-14.729-77.478-44.382-107.157 + c-29.673-29.648-68.26-44.339-107.149-44.376c-38.896,0.037-77.481,14.731-107.146,44.376 + c-29.653,29.68-44.353,68.266-44.389,107.157c 0.036,38.894, 14.731,77.472, 44.384,107.148 + c 12.919,12.919, 12.926,33.869, 0.005,46.789c-12.92,12.923-33.869,12.923-46.79,0.006 + c-42.455-42.423-63.812-98.336-63.771-153.942c-0.037-55.606, 21.315-111.52, 63.771-153.944 + c 42.419-42.446, 98.332-63.802, 153.938-63.766l 0.142,0.00 c 55.563-0.002, 111.409,21.35, 153.80,63.766 + c 42.444,42.425, 63.813,98.338, 63.767,153.944C 473.751,272.053, 452.394,327.963, 409.947,370.39zM 256.704,191.357c 18.271,0.00, 33.085,14.812, 33.085,33.083L 289.789,413.278 c0.00,18.271-14.813,33.085-33.085,33.085 + c-18.274,0.00-33.086-14.816-33.086-33.085l0.00-188.836 C 223.618,206.173, 238.429,191.357, 256.704,191.357z" /> +<glyph unicode="" d="M 90.68,160.51L 126.742,124.447L 253.718,251.426L 380.691,124.448L 416.754,160.51L 253.718,323.551 z" /> +<glyph unicode="" d="M 196.729,60.963L 160.666,97.025L 287.643,224.001L 160.667,350.975L 196.729,387.037L 359.768,224.001 z" /> +<glyph unicode="" d="M 317.207,60.963L 353.27,97.025L 226.291,224.001L 353.269,350.975L 317.207,387.037L 154.166,224.001 z" /> +<glyph unicode="" d="M 416.754,287.49L 380.691,323.553L 253.716,196.574L 126.742,323.552L 90.68,287.49L 253.716,124.449 z" /> +<glyph unicode="" d="M 504.979,223.994L 383.904,323.938L 383.904,255.996L 288.005,255.997L 288.005,351.90L 355.937,351.90L 256.012,472.979L 156.067,351.904L 224.01,351.904L 224.009,255.998L 128.098,255.999L 128.098,323.942L 7.021,224.016L 128.098,124.07L 128.098,192.002L 224.008,192.002L 224.007,96.098L 156.063,96.098L 255.99-24.979L 355.936,96.098L 288.004,96.098L 288.004,192.001L 383.90,192.001L 383.90,124.069 z" /> +<glyph unicode="" d="M 96.002,255.998L 415.996,255.998L 415.996,192.002L 96.002,192.002z" /> +<glyph unicode="" d="M 256.00,447.998c-83.058,0.00-150.374-67.286-150.374-150.374c0.00-73.704, 64.874-169.622, 116.446-249.789 + c 39.066-60.729, 29.329-61.07, 67.853-0.004c 50.575,80.171, 116.449,176.088, 116.449,249.773 + C 406.374,380.652, 339.058,447.998, 256.00,447.998z M 256.00,225.785c-39.67,0.00-71.858,32.16-71.858,71.858 + c0.00,39.699, 32.188,71.839, 71.858,71.839c 39.669,0.00, 71.857-32.16, 71.857-71.858C 327.857,257.925, 295.669,225.785, 256.00,225.785z" /> +<glyph unicode="" d="M 256.398,162.378c-4.897,0.00-9.814,1.545-13.934,4.642L 32.156,324.88l0.00-234.203 c0.00-16.487, 13.413-27.675, 29.90-27.675 + l 388.676,0.00 c 16.492,0.00, 29.263,11.188, 29.263,27.675L 479.995,324.88 L 269.999,167.02C 265.882,163.923, 261.288,162.378, 256.398,162.378zM 451.282,352.018L 256.398,205.719L 61.513,352.018 z" /> +<glyph unicode="" d="M 255.875,451.175L 63.605,334.688l0.00-221.367 l 49.933-29.402L 113.538,305.29 l 142.381,86.565l 142.49-86.43 + l 0.599-0.343l-0.059-220.832l 49.445,29.07L 448.394,334.688 L 255.875,451.175z M 281.322,314.901l0.00-258.805 l-25.447-15.566l-25.477,15.624 + L 230.398,314.697 l-65.943-40.617l0.00-221.313 l 91.42-55.942l 92.20,56.333L 348.075,274.234 L 281.322,314.901z" /> +<glyph unicode="" d="M 402.127,223.937l-38.709,0.00 l-0.006,64.061c0.00,30.667-11.64,58.792-30.863,79.345 + c-19.156,20.557-46.447,33.753-76.542,33.729c-30.104,0.024-57.396-13.172-76.551-33.729 + c-19.233-20.553-30.871-48.679-30.876-79.345l0.00-64.061 l-38.708,0.00 c-7.66,0.00-13.869-6.205-13.869-13.864l0.00-164.201 + c0.00-7.659, 6.209-13.869, 13.869-13.869l 292.255,0.00 c 7.665,0.00, 13.869,6.21, 13.869,13.869L 415.996,210.07 + C 415.996,217.731, 409.792,223.937, 402.127,223.937z M 312.404,223.937L 199.588,223.937 l0.00,64.061 c0.00,17.699, 6.701,33.356, 17.115,44.50 + c 10.497,11.135, 24.163,17.544, 39.304,17.566c 15.13-0.022, 28.798-6.427, 39.287-17.566c 10.416-11.143, 17.11-26.801, 17.11-44.50 + L 312.404,223.937 z" /> +<glyph unicode="" d="M 221.533,116.203l-37.033-34.33c-8.995-8.319-20.297-12.079-31.93-11.681c-11.109,0.454-21.96,5.06-30.329,14.057 + l-3.382,3.668c-8.303,8.996-12.084,20.234-11.68,31.698c 0.463,11.303, 5.053,22.158, 14.054,30.524l 85.934,79.645 + c 5.046,4.659, 10.772,7.889, 16.835,9.763c0.00,8.613, 0.088,61.287, 0.088,72.72c-23.642-2.68-46.787-12.709-65.50-30.063 + l-85.936-79.642c-23.266-21.53-35.834-50.785-36.921-80.225c-1.155-29.401, 9.047-59.642, 30.701-83.012l 3.384-3.651 + c 21.434-23.149, 50.545-35.81, 80.027-36.919l 0.164-0.006c 29.321-1.117, 59.624,8.968, 83.062,30.703l 37.031,34.311 + c 14.476,13.415, 15.337,36.023, 1.922,50.495C 258.617,128.737, 236.008,129.60, 221.533,116.203zM 476.256,325.848c 1.204,29.423-9.102,59.554-30.659,82.823l-3.384,3.669c-21.592,23.319-50.937,35.824-80.354,36.912 + c-29.42,1.152-59.596-9.082-82.895-30.69l-35.342-32.747c-14.475-13.428-15.338-36.038-1.926-50.513s 36.02-15.337, 50.497-1.925 + l 35.336,32.748c 9.029,8.334, 20.232,12.101, 31.604,11.716c 11.40-0.484, 22.282-5.09, 30.62-14.086l 3.416-3.654 + c 8.303-9.013, 12.081-20.216, 11.683-31.538c-0.469-11.435-5.095-22.336-14.095-30.703l-85.932-79.628 + c-5.012-4.634-10.729-7.859-16.826-9.736c0.00-14.327,0.00-56.327,0.00-72.708c 23.514,2.70, 46.64,12.627, 65.392,30.027l 85.967,79.63 + C 462.698,267.083, 475.199,296.426, 476.256,325.848zM 119.299,339.487c 2.929-2.929, 6.768-4.394, 10.606-4.394s 7.678,1.464, 10.606,4.394c 5.858,5.858, 5.858,15.355,0.00,21.213 + L 44.314,456.897c-5.857,5.858-15.355,5.858-21.213,0.00c-5.858-5.858-5.858-15.355,0.00-21.213L 119.299,339.487zM 192.002,352.095c 8.284,0.00, 15.00,6.716, 15.00,15.00L 207.002,446.436 c0.00,8.284-6.716,15.00-15.00,15.00s-15.00-6.716-15.00-15.00l0.00-79.341 + C 177.002,358.811, 183.718,352.095, 192.002,352.095zM 126.343,287.913c0.00,8.284-6.716,15.00-15.00,15.00L 32.002,302.913 c-8.284,0.00-15.00-6.716-15.00-15.00s 6.716-15.00, 15.00-15.00l 79.341,0.00 + C 119.627,272.913, 126.343,279.629, 126.343,287.913zM 392.621,108.95c-5.857,5.857-15.355,5.857-21.213,0.00c-5.858-5.857-5.858-15.355,0.00-21.213l 96.198-96.198 + c 2.929-2.929, 6.768-4.394, 10.606-4.394s 7.678,1.465, 10.606,4.394c 5.858,5.857, 5.858,15.355,0.00,21.213L 392.621,108.95zM 319.919,96.342c-8.284,0.00-15.00-6.716-15.00-15.00l0.00-79.341 c0.00-8.284, 6.716-15.00, 15.00-15.00s 15.00,6.716, 15.00,15.00l0.00,79.341 + C 334.919,89.626, 328.203,96.342, 319.919,96.342zM 385.577,160.523c0.00-8.284, 6.716-15.00, 15.00-15.00l 79.342,0.00 c 8.284,0.00, 15.00,6.716, 15.00,15.00s-6.716,15.00-15.00,15.00l-79.342,0.00 + C 392.293,175.523, 385.577,168.808, 385.577,160.523z" /> +<glyph unicode="" d="M 221.533,116.203l-37.033-34.33c-8.995-8.319-20.297-12.079-31.93-11.681c-11.109,0.454-21.96,5.06-30.329,14.057 + l-3.382,3.668c-8.303,8.996-12.084,20.234-11.68,31.698c 0.463,11.303, 5.053,22.158, 14.054,30.524l 85.934,79.645 + c 9.028,8.335, 20.233,12.099, 31.639,11.698c 11.368-0.465, 22.252-5.074, 30.62-14.072l 3.381-3.669l 52.421,48.589l-3.386,3.652 + l-6.175,6.648c-2.637,2.84-5.609,5.156-8.84,6.959c-19.25,14.601-42.242,22.475-65.31,23.321 + c-29.449,1.155-59.625-9.097-82.928-30.707l-85.936-79.642c-23.266-21.53-35.834-50.785-36.921-80.225 + c-1.155-29.401, 9.047-59.642, 30.701-83.012l 3.384-3.651c 21.434-23.149, 50.545-35.81, 80.027-36.919l 0.164-0.006 + c 29.321-1.117, 59.624,8.968, 83.062,30.703l 37.031,34.311c 14.476,13.415, 15.337,36.023, 1.922,50.495 + C 258.617,128.737, 236.008,129.60, 221.533,116.203zM 445.597,408.67l-3.384,3.669c-21.592,23.319-50.937,35.824-80.354,36.912c-29.42,1.152-59.596-9.082-82.895-30.69 + l-35.342-32.747c-14.475-13.428-15.338-36.038-1.926-50.513s 36.02-15.337, 50.497-1.925l 35.336,32.748 + c 9.029,8.334, 20.232,12.101, 31.604,11.716c 11.40-0.484, 22.282-5.09, 30.62-14.086l 3.416-3.654 + c 8.303-9.013, 12.081-20.216, 11.683-31.538c-0.469-11.435-5.095-22.336-14.095-30.703l-85.932-79.628 + c-8.996-8.318-20.266-12.10-31.931-11.687c-11.108,0.447-21.927,5.045-30.295,14.061l-3.386,3.652l-52.42-48.587l 3.38-3.654 + c 21.403-23.132, 50.511-35.808, 79.998-36.896l 0.194-0.008c 29.318-1.118, 59.588,8.954, 83.024,30.702l 85.967,79.63 + c 23.34,21.639, 35.841,50.982, 36.897,80.404C 477.46,355.271, 467.154,385.401, 445.597,408.67z" /> +<glyph unicode="" d="M 351.996,415.998L 351.996,237.18L 96.002,448.00L 96.002,0.00L 351.996,210.82L 351.996,32.002L 447.996,32.002L 447.996,415.998 z" /> +<glyph unicode="" d="M 482.178,233.834L 342.742,379.832c-2.575,2.665-6.122,4.166-9.828,4.166L 45.484,383.998 c-7.561,0.00-13.687-6.126-13.687-13.688 + l0.00-291.995 c0.00-7.562, 6.126-13.688, 13.687-13.688l 287.43,0.00 c 3.706,0.00, 7.253,1.502, 9.828,4.166l 139.436,145.998 + C 487.324,220.098, 487.324,228.527, 482.178,233.834z M 327.112,95.931L 64.002,95.931 L 64.002,352.124 l 263.11,0.00 l 126.18-127.811L 327.112,95.931zM 267.427,325.312L 193.763,250.351L 120.094,325.312L 94.06,299.724L 168.178,224.312L 94.06,148.894L 120.094,123.306L 193.763,198.27L 267.427,123.306L 293.464,148.894L 219.349,224.312L 293.464,299.724 z" /> +<glyph unicode="" d="M 29.815,214.791l 139.436-145.998c 2.575-2.664, 6.122-4.166, 9.828-4.166l 287.429,0.00 c 7.562,0.00, 13.688,6.127, 13.688,13.688 + L 480.196,370.31 c0.00,7.561-6.126,13.688-13.688,13.688L 179.079,383.998 c-3.706,0.00-7.253-1.501-9.828-4.166L 29.815,233.834 + C 24.669,228.527, 24.669,220.098, 29.815,214.791z M 58.701,224.312l 126.18,127.811l 263.108,0.00 l0.00-256.193 L 184.881,95.93 L 58.701,224.312zM 218.529,299.724L 292.644,224.312L 218.529,148.894L 244.566,123.306L 318.229,198.27L 391.898,123.306L 417.932,148.894L 343.814,224.312L 417.932,299.724L 391.898,325.312L 318.229,250.351L 244.566,325.312 z" /> +<glyph unicode="" d="M 48.073,0.002l 79.011,0.017l 0.01,45.529l 49.23,0.013l 0.007,50.45l 47.674-0.009L 224.00,141.556 + l 50.566,0.009l 37.571,32.034c 44.065-12.063, 92.902-1.09, 127.277,33.169c 51.184,51.347, 50.762,134.801-0.911,186.701 + c-51.781,51.553-135.238,51.98-186.399,0.611c-34.485-34.339-45.464-83.306-33.298-127.414L 32.002,79.861l 0.291-64.071 + C 32.355,4.206, 36.603,0.243, 48.073,0.002z M 361.38,316.957c-13.714,13.921-13.843,36.085-0.298,49.49 + c 13.639,13.763, 35.798,13.644, 49.488-0.301c 13.755-13.50, 13.886-35.67, 0.313-49.499 + C 397.273,303.30, 375.108,303.429, 361.38,316.957z" /> +<glyph unicode="" d="M 295.446,31.498L 108.404,31.498 l 3.648,21.205c 21.455,8.767, 42.379,14.598, 62.836,17.525l 91.339,305.806 + c-9.792,1.964-45.405,14.313-54.792,18.273l 5.114,21.19l 187.044,0.00 l-4.396-21.19c-22.019-8.825-58.625-17.432-62.836-18.273 + l-91.311-305.806c 10.509-2.121, 47.089-13.814, 54.069-17.525L 295.446,31.498z" /> +<glyph unicode="" d="M 335.49,115.189c-9.558,0.00-47.096-57.998-67.553-57.998c-5.459,0.00-8.17,4.787-8.17,9.558 + c0.00,10.909, 7.506,27.979, 11.58,38.216l 49.13,133.011c 24.56,66.191-6.834,83.922-36.151,83.922 + c-39.572,0.00-75.062-19.786-102.332-45.708c-5.076-5.068-16.971-16.651-26.377-27.822c-7.691-9.13-6.813-18.64-2.32-21.406 + c 5.626-3.464, 14.265,3.051, 18.405,7.886c 14.991,17.518, 34.313,42.019, 50.521,42.019c 5.462,0.00, 11.605-6.136, 6.832-18.407 + l-47.737-120.078c-4.796-11.606-27.983-67.556-27.983-100.294c0.00-25.929, 17.049-37.517, 41.61-37.517 + c 68.91,0.00, 148.724,84.603, 148.724,104.389C 343.668,111.104, 338.891,115.189, 335.49,115.189zM 321.828,447.423c-30.018,0.00-55.938-24.553-55.938-54.568c0.00-27.979, 18.435-46.41, 46.398-46.41 + c 30.703,0.00, 56.615,23.196, 56.615,54.591C 368.904,429.016, 349.137,447.423, 321.828,447.423z" /> +<glyph unicode="" d="M 352.381,251.944c 19.508,0.00, 35.292,16.00, 35.292,35.758c0.00,19.743-15.784,35.765-35.292,35.765 + c-19.45,0.00-35.277-16.022-35.277-35.765C 317.104,267.944, 332.931,251.944, 352.381,251.944zM 244.799,175.919l-88.125,94.968L 96.748,158.586l0.00-30.938 l 297.645,0.00 C 356.489,160.775, 276.541,231.63, 276.541,231.63 + L 244.799,175.919zM 32.00,384.00l0.00-319.782 l 447.50,0.00 L 479.50,384.00 L 32.00,384.00 z M 73.072,104.542l-0.019,237.854l 365.385,0.00 l0.00-0.012 l 1.32,0.00 l 0.005-237.842L 73.072,104.542 z" /> +<glyph unicode="" d="M 395.841,276.128L 395.841,360.032L 339.902,360.032L 339.902,332.064L 256.00,415.968L 32.255,191.932L 96.50,191.932L 96.50,31.598L 224.551,31.598L 224.551,159.598L 288.50,159.598L 288.50,31.598L 416.50,31.598L 416.50,191.932L 479.742,191.932 + z" /> +<glyph unicode="" d="M 415.459,383.458C 372.866,426.051, 316.235,449.508, 256.00,449.508c-60.235,0.00-116.865-23.457-159.458-66.05 + C 53.949,340.865, 30.492,284.235, 30.492,224.00s 23.457-116.866, 66.05-159.459c 42.593-42.593, 99.223-66.05, 159.458-66.05 + c 60.235,0.00, 116.866,23.457, 159.459,66.05s 66.05,99.224, 66.05,159.459S 458.052,340.865, 415.459,383.458z M 256.00,31.092 + C 149.631,31.092, 63.093,117.63, 63.093,224.00c0.00,106.369, 86.538,192.907, 192.907,192.907 + c 106.37,0.00, 192.908-86.538, 192.908-192.907C 448.908,117.63, 362.37,31.092, 256.00,31.092zM 342.291,356.486c-21.754,19.24-51.033,28.861-87.842,28.861c-34.986,0.00-63.238-9.507-84.759-28.519 + c-21.525-19.015-27.814-41.741-29.486-68.966l 55.262,0.271c 4.107,19.011, 9.93,25.194, 20.881,34.474 + c 10.951,9.275, 24.563,13.917, 40.843,13.917c 16.882,0.00, 30.305-4.449, 40.269-13.346c 9.959-8.898, 14.943-19.586, 14.943-32.056 + c0.00-8.976-2.816-17.19-8.441-24.641c-3.651-4.716-14.83-14.68-33.538-29.887c-18.711-15.212-31.186-28.917-37.421-41.083 + c-6.238-12.17-9.277-27.145-9.125-35.508l 64.113,0.00 c-0.307,17.643, 10.188,26.305, 23.728,37.561 + c 26.158,21.766, 43.235,38.952, 51.22,51.578c 7.986,12.624, 11.979,26.01, 11.979,40.155 + C 374.916,314.849, 364.039,337.244, 342.291,356.486zM 223.877,128.011L 287.99,128.011L 287.99,63.903L 223.877,63.903z" /> +<glyph unicode="" d="M 32.002,447.998L 160.002,447.998L 160.002,319.998L 32.002,319.998zM 192.00,447.998L 320.00,447.998L 320.00,319.998L 192.00,319.998zM 351.996,447.998L 479.996,447.998L 479.996,319.998L 351.996,319.998zM 32.002,288.00L 160.002,288.00L 160.002,160.00L 32.002,160.00zM 192.00,288.00L 320.00,288.00L 320.00,160.00L 192.00,160.00zM 351.996,288.00L 479.996,288.00L 479.996,160.00L 351.996,160.00zM 32.002,128.002L 160.002,128.002L 160.002,0.002L 32.002,0.002zM 192.00,128.002L 320.00,128.002L 320.00,0.002L 192.00,0.002zM 351.996,128.002L 479.996,128.002L 479.996,0.002L 351.996,0.002z" /> +<glyph unicode="" d="M 279.533,448.00c0.00,0.00-100.479,0.00-133.971,0.00c-60.06,0.00-116.585-45.503-116.585-98.211c0.00-53.863, 40.941-97.333, 102.044-97.333 + c 4.249,0.00, 8.378,0.085, 12.421,0.376c-3.965-7.593-6.801-16.144-6.801-25.021c0.00-14.969, 8.052-27.105, 18.234-37.012 + c-7.693,0.00-15.121-0.224-23.227-0.224C 57.259,190.576,0.00,143.195,0.00,94.064c0.00-48.389, 62.771-78.656, 137.167-78.656 + c 84.812,0.00, 131.652,48.122, 131.652,96.514c0.00,38.801-11.447,62.036-46.843,87.067c-12.107,8.571-35.265,29.418-35.265,41.672 + c0.00,14.36, 4.098,21.434, 25.714,38.323c 22.156,17.312, 37.836,41.651, 37.836,69.958c0.00,33.703-15.01,66.549-43.186,77.386l 42.477,0.00 + L 279.533,448.00z M 232.74,120.271c 1.063-4.486, 1.642-9.104, 1.642-13.814c0.00-39.10-25.196-69.655-97.487-69.655 + c-51.421,0.00-88.558,32.552-88.558,71.65c0.00,38.321, 46.063,70.222, 97.481,69.666c 12.00-0.127, 23.185-2.058, 33.335-5.345 + C 207.066,153.359, 227.092,142.393, 232.74,120.271z M 150.409,266.112c-34.52,1.032-67.318,38.613-73.276,83.93 + c-5.958,45.333, 17.185,80.021, 51.694,78.995c 34.505-1.037, 67.318-37.407, 73.278-82.729 + C 208.059,300.978, 184.911,265.079, 150.409,266.112z M 416.00,352.00L 416.00,448.00 l-32.00,0.00 l0.00-96.00 l-96.00,0.00 l0.00-32.00 l 96.00,0.00 l0.00-96.00 l 32.00,0.00 l0.00,96.00 l 96.00,0.00 l0.00,32.00 L 416.00,352.00 z" /> +<glyph unicode="" d="M 248.023,234.684L 247.35,235.809L 246.563,238.057L 247.124,238.73L 246.786,240.303L 244.764,238.73L 245.214,237.381L 245.775,235.248L 244.764,235.248L 244.764,234.237L 245.889,233.562 zM 241.955,236.259L 242.293,234.684L 243.979,235.471L 244.426,236.82L 243.753,237.493 zM 244.09,245.134L 244.426,246.033L 243.529,246.932L 241.73,247.043L 241.843,245.697 zM 256.338,254.011L 256.898,253.788L 257.012,254.684L 256.338,255.022L 256.785,256.145L 254.764,255.022L 255.55,253.338 zM 261.279,257.27L 260.158,257.831L 259.37,257.043L 260.831,256.82 zM 256.00,449.078C 131.695,449.078, 30.922,348.308, 30.922,224.00S 131.695-1.078, 256.00-1.078 + c 124.303,0.00, 225.078,100.771, 225.078,225.078S 380.303,449.078, 256.00,449.078z M 62.028,224.00c0.00,41.132, 12.838,79.241, 34.674,110.627 + l 2.504-1.877l-1.513-6.073l 5.559-1.521l-1.013,8.093l 4.553,0.503l0.00,10.625 l 4.552,0.00 c0.00,0.00, 0.80-2.062, 1.642-4.224 + c 0.923-2.376, 1.899-4.88, 1.899-4.88l 5.055-5.568c0.00,0.00-6.068-1.508-8.088-1.508c-2.022,0.00-1.013-8.093-1.013-8.093l 7.077-2.525 + l 4.572,8.444l 10.601,11.782l 5.056,15.674l 9.612,9.111l-5.565,4.033l 6.073,4.047l 0.505,5.568l-17.701-5.056l-0.558,0.666 + c 9.638,8.19, 20.077,15.455, 31.201,21.653l 8.299-3.614l-5.559-10.623l-11.133,0.00 l-2.024-9.604l 9.106,0.00 l 13.149,8.095l 9.106,9.096 + l 1.513,8.599l-13.149,1.009l 9.103,6.073l 8.598-1.521l-1.514-9.099l 11.632,7.091l 2.027-5.568l 2.53-8.095l-6.577-8.093 + l-7.082-6.572l-10.623,1.521l 5.06-10.619l-9.61,1.517l-16.184-16.692l 4.046-5.567l 13.149,1.018l 11.128,3.546l 14.167,1.508 + l 6.572,1.519c0.00,0.00,0.00,4.046-0.507,6.572c-0.501,2.53, 5.06-0.50, 5.06-0.50l 6.071,3.532l 4.552,14.167l 16.688,7.595l-2.525,4.037 + l 4.046,5.064l-13.148,2.026l 3.539,5.056l-16.692,5.568l-8.599,0.00 l 3.034,7.581l 3.539,3.547l-0.284,0.284 + c 14.076,3.244, 28.72,5.018, 43.787,5.018c 23.479,0.00, 45.979-4.172, 66.808-11.817l-0.507-1.191l-8.423,0.563l0.00-5.064 l 3.376-2.246 + l0.00-4.493 l 2.806-3.93l-10.111,6.176l-6.735-3.372l 3.368-7.873l 1.688-8.986l 4.492-5.064l 10.665-1.684l-2.242-4.493l-2.25-6.752 + l 9.556-6.176l-0.563-2.81l-17.979,15.176l-1.116-5.627l 7.859-7.865l 4.493-1.684l-10.11-2.246l-1.126-5.064l-7.298,7.315 + l-4.501,9.548l-1.688,9.557l-4.501-5.618l 3.376-13.487l 5.618-3.943l-2.242-12.914l-3.376,1.688l 0.563-6.752l-5.063,0.563 + l-5.052,7.315l-6.176,0.00 l-8.995,1.125l-8.999-0.563l-8.423-6.752l-5.622-9.548l-11.804-8.994l-1.125-5.056l0.00-6.189 l 2.809-6.177 + l 5.623,4.493l 1.683-3.367l 2.814-5.056l 0.563-1.134l 2.809-3.372l 5.061,3.368l-0.563,12.366l 6.176,7.873 + c0.00,0.00, 0.313,1.332, 0.664,2.869c 0.479,2.046, 1.024,4.433, 1.024,4.433l 2.242,6.19l 3.943-0.563l-1.122-5.064l-2.259-11.232 + l 10.691,1.125l 3.935-1.125l-8.436-2.255l 1.12-5.618l-9.557-6.176l 0.563-6.19l-8.423-2.25l-1.684-4.493l-6.748,2.247l-4.497,0.00 + l0.00,9.557 l-5.06-1.697l0.00-5.055 l-14.051-11.245l-7.869-2.809l-3.369-3.93l-11.245,2.809l-0.563-5.056l 7.306-2.817l-0.563-10.104 + l-20.235,0.563l-2.81-4.493l-2.809-7.874l-3.376-6.752l 5.06-5.618l 5.623-6.739L 207.109,224.00l 1.125,6.739l 3.939,3.38l 6.743,2.247 + l-0.563,4.493l 6.185,1.688l 8.988,1.684l 5.623-6.739l 10.115-7.315l 4.496-7.297l0.00-3.371 l 5.614,3.371l-2.805,5.051l 1.122,5.626 + l-5.057,2.247l-4.496,6.176l 2.809,8.999l 5.051-7.311l 7.302-5.618l 2.805-10.12l 7.311-5.614l 1.696-6.189l 3.372,7.311l-1.125,3.372 + l 1.685,2.809l 10.664,8.994l 2.251,11.246l 4.501,3.372l 5.618-0.563l 8.432,8.436l 0.563-6.752l 12.353-3.93l0.00-6.19 l-10.103,0.00 + l-15.175-7.86l-12.366-6.752l 3.371-7.302l 11.236-2.246l 6.19-2.81l 6.743,4.492l 0.554-19.113l-19.113-3.93l-20.209,5.627 + l-7.873-6.189l 3.367-3.368l-6.189,1.121l-19.664,7.311l-5.618-0.571l-4.496,7.311l0.00,8.995 l-10.121,0.00 l-5.617,1.125l-17.987-3.943 + l-14.05,1.134l-6.181-3.381l-3.934-0.563l-2.251-7.297l-12.924-8.999l-17.989-13.486l-1.125-17.413l-5.06-11.245l 0.563-6.735 + l 4.497-7.878l 12.929-21.91l 13.487-6.185l 22.481-1.688l-1.125,9.562l-5.06,2.806l 2.247,5.055l 3.938-4.492l 3.93-11.805 + l 16.861-1.125l 6.743-6.734l 9.553-3.943l 1.125-16.297l 10.121-12.928l 9.553-16.855l-8.428-10.119l 8.607-13.391 + C 145.055,33.967, 62.028,119.269, 62.028,224.00z M 322.468,41.723l 23.449,17.047l-8.423,20.802l 26.975,35.397l 8.423,22.482 + l 3.93,12.37l-14.032-6.753l-8.44-1.688l-20.784,12.933l-6.19,14.05l-7.868,7.869l-10.111,22.473l 8.423-6.739l 15.747-17.422 + l 5.618-7.868l 11.228-5.619l 3.376-14.612l 13.495,8.986l 16.292,20.238l 7.869,20.79l-6.186,5.051l-3.372,6.189l-3.938-7.311 + l-7.864-8.985l-11.24,12.366l-3.368,9.544l 7.869-1.685l 7.864-3.93l 11.241,3.93l 6.753-2.245l 17.967,12.365l 10.133-5.626 + l 6.176,3.38l 13.438-21.158l 6.656,6.348l 0.132,8.063l 0.554,24.169l 4.132,11.452c 1.008-7.99, 1.583-16.116, 1.583-24.38 + C 449.972,140.229, 396.859,68.854, 322.468,41.723z" /> +<glyph unicode="" d="M 116.838,355.64c-25.396,0.00-47.242-8.403-65.542-25.208c-19.043-17.926-28.57-40.33-28.57-67.218 + c0.00-17.926, 5.188-34.731, 15.647-50.416c 9.337-14.563, 19.09-23.903, 31.889-28.012l0.00-1.121 + c-12.799-5.224-18.482-18.295-18.482-39.209c0.00-16.062, 5.686-28.011, 18.482-35.854l0.00-1.121 + c-35.327-11.572-51.496-33.047-51.496-64.414c0.00-27.268, 11.874-47.244, 35.033-59.939C 72.094-26.959, 95.588-32.00, 123.972-32.00 + c 69.085,0.00, 103.703,28.941, 103.703,86.832c0.00,36.223-26.661,58.441-80.063,66.658c-12.323,1.863-21.644,6.348-27.991,13.445 + c-4.854,4.854-7.271,9.709-7.271,14.563c0.00,13.816, 7.479,21.848, 22.41,24.088c 22.779,3.357, 41.364,13.912, 55.743,31.648 + c 14.375,17.74, 21.565,38.559, 21.565,62.458c0.00,7.469-2.26,15.498-5.244,24.086c 9.709,2.244, 16.524,4.297, 21.646,6.166L 228.47,355.64 + c-22.526-8.964-43.495-13.442-61.421-13.442C 151.361,351.159, 135.136,355.64, 116.838,355.64z M 123.00,76.115 + c 31.372,0.00, 47.052-9.521, 47.052-28.57c0.00-20.168-14.377-30.246-43.132-30.246c-32.862,0.00-49.293,9.711-49.293,29.127 + C 77.626,66.221, 92.749,76.115, 123.00,76.115z M 119.079,224.00c-23.527,0.00-35.293,12.882-35.293,38.654 + c0.00,27.631, 11.766,41.453, 35.293,41.453c 11.201,0.00, 19.979-4.298, 26.326-12.884c 5.229-7.845, 7.845-17.18, 7.845-28.011 + C 153.25,237.073, 141.857,224.00, 119.079,224.00z M 289.395,480.00c-10.828,0.00-20.069-4.107-27.727-12.324 + c-7.661-8.218-11.489-18.108-11.489-29.688c0.00-11.205, 3.829-20.91, 11.489-29.129c 7.654-8.217, 16.896-12.32, 27.727-12.32 + c 10.455,0.00, 19.514,4.104, 27.17,12.32c 7.656,8.219, 11.48,17.924, 11.48,29.129c0.00,11.58-3.824,21.472-11.48,29.688 + C 308.905,475.893, 299.85,480.00, 289.395,480.00z M 320.768,352.001l-63.303,0.00 c 0.748-7.168-0.32-18.021-0.32-35.57l0.00-174.216 + c0.00-17.928, 1.068-32.387, 0.32-38.018l 63.303,0.00 c-0.75,8.188-2.697,22.334-2.697,41.379L 318.071,317.549 + C 318.067,333.981, 320.018,344.833, 320.768,352.001z M 460.371,157.90c-16.437,0.00-24.541,12.514-24.541,37.533L 435.83,298.753 l 24.932,0.00 + c 4.479,0.00, 8.516,0.246, 13.559-0.123c 5.043-0.374, 7.076-0.125, 9.64-0.125L 483.961,352.00 l-48.129,0.00 l0.00,23.808 c0.00,8.961, 1.407,17.151, 2.526,22.271 + l-64.979,0.00 c 1.121-5.12, 1.014-12.938, 1.014-23.395L 374.393,352.00 l-28.16,0.00 l0.00-53.494 c 7.683,1.12, 14.545,1.678, 19.398,1.678l 8.762-0.559l0.00-0.292 l0.00,0.00 + l0.00-101.101 c0.00-31.371, 3.979-54.336, 11.818-68.90c 10.461-19.42, 28.811-29.129, 56.067-29.129c 19.425,0.00, 36.56,3.732, 49.357,11.205 + l0.00,56.016 C 481.398,161.074, 471.944,157.90, 460.371,157.90z" /> +<glyph unicode="" d="M 444.797,255.998L 398.073,302.721L 479.835,384.482L 416.485,447.833L 334.724,366.071L 288.00,412.795L 288.00,255.998 + zM 67.123,255.998L 113.847,302.721L 32.085,384.482L 95.435,447.833L 177.196,366.071L 223.92,412.795L 223.92,255.998 + zM 444.797,191.92L 398.073,145.196L 479.835,63.436L 416.485,0.085L 334.724,81.846L 288.00,35.123L 288.00,191.92 + zM 67.123,191.92L 113.847,145.196L 32.085,63.436L 95.435,0.085L 177.196,81.846L 223.92,35.123L 223.92,191.92 + z" /> +<glyph unicode="" d="M 177.285,208.636L 78.726,110.077L 32.004,156.801L 32.004,0.004L 188.801,0.004L 142.079,46.728L 240.636,145.286 zM 188.801,447.996L 32.004,447.996L 32.004,291.199L 78.726,337.922L 177.285,239.364L 240.636,302.714L 142.079,401.272 zM 334.714,208.636L 271.364,145.286L 369.923,46.728L 323.199,0.004L 479.996,0.004L 479.996,156.801L 433.272,110.077 zM 323.199,447.996L 369.923,401.272L 271.364,302.714L 334.714,239.364L 433.272,337.922L 479.996,291.199L 479.996,447.996 z" /> +<glyph unicode="" d="M 466.766,288.599c-68.667,0.00-338.019,0.00-356.766,0.00c-21.50,0.00-26.203-21.411-26.203-21.411L 55.08,82.854 + c-1.239-7.888-14.837-6.083-13.466,2.646l 15.637,202.498c0.00,0.00, 4.249,32.602, 39.249,32.602c 28.227,0.00, 262.052,0.00, 351.496,0.00L 447.996,335.31 + c0.00,9.222-7.475,16.688-16.691,16.688L 216.757,351.998 l-43.624,58.994l-0.089-0.026c-3.031,3.094-7.244,5.032-11.916,5.032L 48.686,415.998 + c-9.211,0.00-16.683-7.475-16.683-22.561l 1.505-312.185c0.00-9.223, 7.472-16.688, 16.683-16.688l 381.114,0.00 + c 9.217,0.00, 16.688,7.465, 16.691,16.688l 35.601,185.334C 483.597,266.586, 489.336,288.285, 466.766,288.599z" /> +<glyph unicode="" d="M 431.305,351.998L 216.757,351.998 l-43.624,58.994l-0.089-0.026c-3.031,3.094-7.244,5.032-11.916,5.032L 48.686,415.998 + c-9.211,0.00-16.683-7.475-16.683-22.561l 1.505-312.185c0.00-9.223, 7.472-16.688, 16.683-16.688l 381.114,0.00 + c 9.217,0.00, 16.688,7.465, 16.691,16.688L 447.996,287.50 l0.00,47.81 C 447.996,344.532, 440.521,351.998, 431.305,351.998z M 240.00,95.205 + c-62.186,0.00-112.596,50.41-112.596,112.596c0.00,62.181, 50.41,112.591, 112.596,112.591c 62.184,0.00, 112.596-50.41, 112.596-112.591 + C 352.596,145.615, 302.184,95.205, 240.00,95.205zM 223.48,241.22L 161.002,241.223L 161.002,174.746L 223.478,174.745L 223.478,130.076L 317.874,207.981L 223.48,285.901 z" /> +<glyph unicode="" d="M 160.50,223.696L 319.50,223.696L 319.50,191.902L 160.50,191.902zM 431.305,351.998L 216.757,351.998 l-43.624,58.994l-0.089-0.026c-3.031,3.094-7.244,5.032-11.916,5.032L 48.686,415.998 + c-9.211,0.00-16.683-7.475-16.683-22.561l 1.505-312.185c0.00-9.223, 7.472-16.688, 16.683-16.688l 381.114,0.00 + c 9.217,0.00, 16.688,7.465, 16.691,16.688L 447.996,287.50 l0.00,47.81 C 447.996,344.532, 440.521,351.998, 431.305,351.998z M 240.00,95.205 + c-62.186,0.00-112.596,50.41-112.596,112.596c0.00,62.181, 50.41,112.591, 112.596,112.591c 62.184,0.00, 112.596-50.41, 112.596-112.591 + C 352.596,145.615, 302.184,95.205, 240.00,95.205z" /> +<glyph unicode="" d="M 431.305,351.998L 216.757,351.998 l-43.624,58.994l-0.089-0.026c-3.031,3.094-7.244,5.032-11.916,5.032L 48.686,415.998 + c-9.211,0.00-16.683-7.475-16.683-22.561l 1.505-312.185c0.00-9.223, 7.472-16.688, 16.683-16.688l 381.114,0.00 + c 9.217,0.00, 16.688,7.465, 16.691,16.688L 447.996,287.50 l0.00,47.81 C 447.996,344.532, 440.521,351.998, 431.305,351.998z M 240.00,95.205 + c-62.186,0.00-112.596,50.41-112.596,112.596c0.00,62.181, 50.41,112.591, 112.596,112.591c 62.184,0.00, 112.596-50.41, 112.596-112.591 + C 352.596,145.615, 302.184,95.205, 240.00,95.205zM 255.898,287.297L 224.102,287.297L 224.102,223.696L 160.50,223.696L 160.50,191.902L 224.102,191.902L 224.102,128.301L 255.898,128.301L 255.898,191.902L 319.50,191.902L 319.50,223.696L 255.898,223.696 z" /> +<glyph unicode="" d="M 431.305,351.998L 216.757,351.998 l-43.624,58.994l-0.089-0.026c-3.031,3.094-7.244,5.032-11.916,5.032L 48.686,415.998 + c-9.211,0.00-16.683-7.475-16.683-22.561l 1.505-312.185c0.00-9.223, 7.472-16.688, 16.683-16.688l 381.114,0.00 + c 9.217,0.00, 16.688,7.465, 16.691,16.688L 447.996,287.50 l0.00,47.81 C 447.996,344.532, 440.521,351.998, 431.305,351.998z" /> +<glyph unicode="" d="M 63.252,447.998L 95.65,447.998L 95.65,0.002L 63.252,0.002zM 401.471,415.998l-95.14-95.145l 96.834-96.851L 160.01,224.002 L 160.01,415.998 L 401.471,415.998 M 478.723,447.998L 128.01,447.998 l0.00-255.996 l 352.40,0.00 + L 351.583,320.851L 478.723,447.998L 478.723,447.998z" /> +<glyph unicode="" d="M 351.583,320.851L 478.723,447.998L 128.01,447.998L 128.01,192.002L 480.41,192.002 zM 63.252,447.998L 95.65,447.998L 95.65,0.002L 63.252,0.002z" /> +<glyph unicode="" d="M 160.003,415.998L 160.003,237.18L 415.996,448.00L 415.996,0.00L 160.003,210.82L 160.003,32.002L 64.003,32.002L 64.003,415.998 z" /> +<glyph unicode="" d="M 63.145,447.998L 63.145,383.998L 213.144,212.286L 213.144,40.859L 298.856-1.997L 298.856,212.286L 448.855,383.998L 448.855,447.998 z" /> +<glyph unicode="" d="M 503.611,146.991l-45.414,44.548c 13.105,11.496, 24.191,22.291, 32.663,31.172 + c-2.193,2.337-23.248,22.273-27.113,26.138c-2.402-2.128-104.908-114.769-207.756-114.769 + c-86.444,0.00-181.754,86.349-207.225,115.06c-7.362-6.769-24.63-23.638-27.437-26.429 + c 8.803-9.076, 19.852-19.751, 32.662-30.985L 8.387,146.991c-8.287-8.13-8.416-21.441-0.285-29.729 + c 4.118-4.196, 9.559-6.301, 15.007-6.301c 5.313,0.00, 10.63,2.001, 14.723,6.017l 48.974,48.041 + c 15.042-11.323, 31.434-22.418, 48.718-32.302l-29.787-62.356c-5.004-10.48-0.569-23.027, 9.908-28.036 + c 2.051-0.979, 4.182-1.594, 6.316-1.876c 8.783-1.159, 17.691,3.36, 21.715,11.785l 29.501,61.759 + c 20.12-8.455, 40.923-14.608, 61.80-17.17l0.00-64.193 c0.00-11.61, 9.412-21.022, 21.023-21.022s 21.023,9.412, 21.023,21.022l0.00,64.198 + c 20.775,2.549, 41.49,8.65, 61.519,17.008l 30.169-61.632c 4.108-8.391, 13.056-12.824, 21.826-11.583 + c 2.136,0.304, 4.261,0.941, 6.299,1.943c 10.428,5.108, 14.742,17.697, 9.639,28.126l-30.236,61.768 + c 17.484,9.933, 34.023,21.076, 49.119,32.401l 48.812-47.88c 4.092-4.018, 9.407-6.018, 14.72-6.018 + c 5.447,0.00, 10.89,2.104, 15.009,6.301C 512.029,125.55, 511.90,138.861, 503.611,146.991z" /> +<glyph unicode="" d="M 255.992,349.715c-116.967,0.00-234.758-127.177-234.758-127.177s 117.791-127.166, 234.758-127.166 + c 116.984,0.00, 234.773,127.166, 234.773,127.166S 372.977,349.715, 255.992,349.715z M 255.992,133.905 + c-49.705,0.00-90.00,40.261-90.00,90.011c0.00,49.703, 40.296,89.989, 90.00,89.989c 49.729,0.00, 90.023-40.286, 90.023-89.989 + C 346.018,174.166, 305.721,133.905, 255.992,133.905zM 255.992,268.006c-24.32,0.00-44.104-19.78-44.104-44.09c0.00-24.313, 19.784-44.112, 44.104-44.112 + c 24.332,0.00, 44.126,19.80, 44.126,44.112C 300.12,248.225, 280.326,268.006, 255.992,268.006z" /> +<glyph unicode="" d="M 468.328,387.262l-47.784,48.149c-12.065,12.141-31.647,12.192-43.80,0.158l-30.197-29.965l 91.373-92.049 + l 30.208,29.928C 480.271,355.555, 480.381,375.141, 468.328,387.262z M 85.751,146.693l 91.38-92.024l 238.881,237.066 + l-91.432,92.096L 85.751,146.693z M 49.536,65.123L 32.512,2.57l 62.703,16.563l 58.26,15.346l-88.153,88.86L 49.536,65.123z" /> +<glyph unicode="" d="M 322.097,448.198L 64.002,448.198 l0.00-448.696 l 352.527,0.00 L 416.529,354.50 L 322.097,448.198z M 319.368,415.375l 64.453-63.377l-64.453,0.00 L 319.368,415.375 z + M 383.996,32.002L 96.002,32.002 L 96.002,415.998 L 288.00,415.998 l0.00-96.00 l 95.996,0.00 L 383.996,32.002 zM 127.404,207.801c0.00-62.186, 50.41-112.596, 112.596-112.596c 62.184,0.00, 112.596,50.41, 112.596,112.596 + c0.00,62.181-50.412,112.591-112.596,112.591C 177.814,320.392, 127.404,269.982, 127.404,207.801z M 319.50,223.696l0.00-31.794 l-159.00,0.00 l0.00,31.794 + L 319.50,223.696 z" /> +<glyph unicode="" d="M 322.097,448.198L 64.002,448.198 l0.00-448.696 l 352.527,0.00 L 416.529,354.50 L 322.097,448.198z M 319.368,415.375l 64.453-63.377l-64.453,0.00 L 319.368,415.375 z + M 383.996,32.002L 96.002,32.002 L 96.002,415.998 L 288.00,415.998 l0.00-96.00 l 95.996,0.00 L 383.996,32.002 zM 127.404,207.801c0.00-62.186, 50.41-112.596, 112.596-112.596c 62.184,0.00, 112.596,50.41, 112.596,112.596 + c0.00,62.181-50.412,112.591-112.596,112.591C 177.814,320.392, 127.404,269.982, 127.404,207.801z M 319.50,223.696l0.00-31.794 l-63.602,0.00 + l0.00-63.602 l-31.797,0.00 l0.00,63.602 L 160.50,191.902 l0.00,31.794 l 63.602,0.00 l0.00,63.601 l 31.797,0.00 l0.00-63.601 L 319.50,223.696 z" /> +<glyph unicode="" d="M 322.097,448.198L 64.002,448.198 l0.00-448.696 l 352.527,0.00 L 416.529,354.50 L 322.097,448.198z M 319.368,415.375l 64.453-63.377l-64.453,0.00 L 319.368,415.375 z + M 96.002,32.002L 96.002,415.998 L 288.00,415.998 l0.00-96.00 l 95.996,0.00 l0.00-287.996 L 96.002,32.002 z" /> +<glyph unicode="" d="M 339.229,149.373c 0.009-0.672, 0.054-1.321, 0.054-1.988c0.00-68.036-55.351-123.383-123.39-123.383 + c-68.031,0.00-123.383,55.347-123.383,123.383c0.00,41.116, 20.236,77.581, 51.258,100.014l-4.197,36.865 + c-47.956-26.845-80.46-78.124-80.46-136.878c0.00-86.454, 70.329-156.783, 156.783-156.783c 73.287,0.00, 134.963,50.55, 152.064,118.604 + L 339.229,149.373zM 155.871,409.356A39.893,39.893 180.00 1,0 235.657,409.356A39.893,39.893 180.00 1,0 155.871,409.356zM 452.941,100.229l-89.518,125.166c-4.685,6.555-12.505,9.654-20.441,8.976c-0.591,0.056-1.184,0.105-1.783,0.105 + L 238.941,234.476 l-2.539,22.263l 76.006,0.00 c 8.842,0.00, 16.009,7.165, 16.009,16.004c0.00,8.837-7.167,16.001-16.009,16.001l-79.647,0.00 l-4.157,36.556 + c-2.432,21.383-21.74,36.741-43.119,34.307c-21.383-2.437-36.741-21.741-34.305-43.117l 11.749-103.237 + c 2.276-19.967, 19.247-34.658, 38.883-34.55c 0.067,0.00, 0.129-0.015, 0.201-0.015l 133.794,0.00 l 76.77-107.339 + c 7.328-10.256, 22.315-12.11, 33.468-4.13C 457.188,75.191, 460.277,89.973, 452.941,100.229z" /> +<glyph unicode="" d="M 380.476,96.165A36.94,36.94 180.00 1,0 454.356,96.16500000000002A36.94,36.94 180.00 1,0 380.476,96.16500000000002zM 137.084,133.105c-20.396,0.00-36.936-16.539-36.936-36.939c0.00-20.402, 16.54-36.941, 36.936-36.941 + c 20.406,0.00, 36.945,16.539, 36.945,36.941C 174.03,116.566, 157.491,133.105, 137.084,133.105zM 32.089,351.998L 319.996,351.998L 319.996,160.002L 32.089,160.002zM 447.996,287.998l-96.123,0.00 L 351.873,133.11 L 165.726,133.11 c 11.016-8.554, 18.113-21.914, 18.113-36.944l 186.825,0.00 + c0.00,25.823, 20.926,46.754, 46.752,46.754c 25.818,0.00, 46.752-20.931, 46.752-46.754l 6.414,0.00 c 5.15,0.00, 9.328,4.176, 9.328,9.332l0.00,18.005 + L 479.91,223.999 L 447.996,287.998z M 384.295,209.539l 0.115,46.223l 41.301,0.00 l 22.285-46.223L 384.295,209.539 zM 108.444,133.11L 32.196,133.11 L 32.10,119.348c0.00,0.00-1.209-23.182, 22.168-23.182s 25.151,0.00, 25.151,0.00L 90.33,96.166 + C 90.33,111.196, 97.428,124.557, 108.444,133.11z" /> +<glyph unicode="" d="M 462.879,367.121L 399.121,430.885L 256.00,287.769L 111.883,431.883L 48.119,368.119L 192.234,224.002L 47.115,78.885L 110.879,15.114L 256.00,160.239L 400.125,16.112L 463.883,79.883L 319.762,224.002 z" /> +<glyph unicode="" d="M 256.50,450.167c-123.433,0.00-223.495-30.976-223.495-58.084c0.00-7.91,0.00-78.09,0.00-86.00c0.00-27.108, 100.063-58.084, 223.495-58.084 + c 123.434,0.00, 223.496,30.976, 223.496,58.084c0.00,7.91,0.00,78.09,0.00,86.00C 479.996,419.19, 379.934,450.167, 256.50,450.167z M 256.50,352.218 + c-92.096,0.00-166.755,16.965-166.755,34.191c0.00,17.226, 74.659,37.191, 166.755,37.191c 92.097,0.00, 166.757-19.965, 166.757-37.191 + C 423.257,369.183, 348.597,352.218, 256.50,352.218zM 256.50,74.967c-121.174,0.00-219.815,27.18-223.385,53.602c-0.066-0.492-0.11-0.986-0.11-1.482c0.00-7.91,0.00-70.09,0.00-78.00 + c0.00-27.108, 100.063-58.084, 223.495-58.084c 123.434,0.00, 223.496,30.976, 223.496,58.084c0.00,7.91,0.00,70.09,0.00,78.00 + c0.00,0.496-0.044,0.99-0.11,1.482C 476.315,102.146, 377.675,74.967, 256.50,74.967zM 256.50,199.684c-121.174,0.00-219.815,30.18-223.385,56.602c-0.066-0.492-0.11-0.986-0.11-1.482c0.00-7.91,0.00-70.09,0.00-78.00 + c0.00-27.108, 100.063-58.084, 223.495-58.084c 123.434,0.00, 223.496,30.976, 223.496,58.084c0.00,7.91,0.00,70.09,0.00,78.00 + c0.00,0.496-0.044,0.99-0.11,1.482C 476.315,229.863, 377.675,199.684, 256.50,199.684z" /> +<glyph unicode="" d="M 32.003,384.085l0.00-256.083 l 447.994,0.00 L 479.997,384.085 L 32.003,384.085 z M 447.997,192.002 + c-16.979,0.00-31.844-16.662-31.844-32.00c-85.539,0.00-312.823,0.00-319.494,0.00c0.00,15.988-12.478,33.004-32.656,33.004 + c0.00,34.088,0.00,115.911,0.00,126.904c 23.808,0.00, 30.772,17.437, 30.772,32.176c 13.851,0.00, 306.301,0.00, 321.537,0.00 + c0.00-15.313, 14.154-31.521, 31.685-31.521C 447.997,310.141, 447.997,199.875, 447.997,192.002zM 195.765,256.043A60.235,76.165 180.00 1,0 316.235,256.043A60.235,76.165 180.00 1,0 195.765,256.043zM 32.003,96.002L 479.997,96.002L 479.997,64.002L 32.003,64.002z" /> +<glyph unicode="" d="M 479.748,355.514c0.00,15.757-12.77,28.528-28.528,28.528L 60.78,384.042 c-15.756,0.00-28.528-12.771-28.528-28.528l0.00-263.027 + c0.00-15.759, 12.772-28.528, 28.528-28.528l 390.44,0.00 c 15.759,0.00, 28.528,12.77, 28.528,28.528L 479.748,355.514 z M 75.163,352.042l 362.455,0.00 + c 5.122,0.00, 10.629-5.509, 10.629-10.628l0.00-53.173 L 64.252,288.241 l0.00,53.173 C 64.252,346.533, 70.047,352.042, 75.163,352.042z M 437.617,96.046 + L 75.163,96.046 c-5.116,0.00-10.91,3.203-10.91,8.32L 64.253,223.217 l 383.994,0.00 l0.00-118.851 C 448.246,99.249, 442.739,96.046, 437.617,96.046z" /> +<glyph unicode="" d="M 259.116,414.717C 136.071,417.138, 34.79,341.32, 32.90,245.367c-0.652-33.359, 10.793-64.75, 31.171-91.627l-0.004,0.00 + c 35.045-45.026-32.065-135.984-32.065-135.984l 141.793,62.193c 24.33-7.688, 50.769-12.167, 78.473-12.713 + c 123.042-2.428, 224.325,73.396, 226.217,169.349C 480.369,332.54, 382.155,412.291, 259.116,414.717z" /> +<glyph unicode="" d="M 256.00-0.496C 132.211-0.496, 31.504,100.216, 31.504,224.00C 31.504,347.789, 132.211,448.496, 256.00,448.496 + c 123.789,0.00, 224.496-100.708, 224.496-224.496C 480.496,100.216, 379.789-0.496, 256.00-0.496z M 256.00,394.617 + c-94.078,0.00-170.617-76.539-170.617-170.617c0.00-94.082, 76.54-170.617, 170.617-170.617c 94.087,0.00, 170.617,76.535, 170.617,170.617 + C 426.617,318.078, 350.087,394.617, 256.00,394.617zM 357.43,238.941l-83.642,0.00 l0.00,102.79 c0.00,12.339-9.996,22.339-22.345,22.339c-12.339,0.00-22.344-10.00-22.344-22.339l0.00-125.454 + c0.00-12.165, 9.87-22.025, 22.029-22.025L 357.43,194.252 c 12.339,0.00, 22.345,10.005, 22.345,22.344 + C 379.774,228.936, 369.769,238.941, 357.43,238.941z" /> +<glyph unicode="" d="M 182.964,32.002c-25.798,69.719-85.798,136.165-148.651,176.979l 29.583,48.595 + c 36.183-14.439, 115.92-60.484, 144.845-103.773c 47.26,107.101, 130.196,204.28, 238.443,265.649l 30.501-48.477 + c-106.48-79.458-184.927-215.304-222.155-338.973L 182.964,32.002 z" /> +<glyph unicode="" d="M 463.271,351.953L 127.855,351.953 L 53.729,425.512C 43.326,435.835, 26.523,435.77, 16.20,425.367 + C 5.877,414.964, 5.942,398.162, 16.345,387.839l 86.328-85.666l 34.09-156.646c0.00-9.678, 7.846-17.525, 17.525-17.525l 268.546,0.00 + c 9.686,0.00, 17.525,7.848, 17.525,17.525l 40.437,188.903C 480.797,344.112, 472.957,351.953, 463.271,351.953zM 334.075,48.083A47.978,47.978 180.00 1,0 430.031,48.08300000000003A47.978,47.978 180.00 1,0 334.075,48.08300000000003zM 144.259,48.083A47.978,47.978 180.00 1,0 240.215,48.08300000000003A47.978,47.978 180.00 1,0 144.259,48.08300000000003z" /> +<glyph unicode="" d="M 256.00,447.998C 132.289,447.998, 32.001,347.711, 32.001,224.00S 132.289,0.002, 256.00,0.002S 479.999,100.289, 479.999,224.00 + S 379.711,447.998, 256.00,447.998z M 145.692,334.307c 29.464,29.464, 68.639,45.691, 110.308,45.691 + c 28.047,0.00, 54.958-7.361, 78.544-21.152L 121.152,145.459c-13.79,23.585-21.151,50.495-21.151,78.541 + C 100.001,265.668, 116.228,304.843, 145.692,334.307z M 366.308,113.693c-29.464-29.465-68.639-45.691-110.308-45.691 + c-28.047,0.00-54.958,7.361-78.544,21.153l 213.387,213.394c 13.794-23.587, 21.156-50.50, 21.156-78.549 + C 411.999,182.331, 395.772,143.157, 366.308,113.693z" /> +<glyph unicode="" d="M 172.063,193.823L 217.844,193.823L 217.844,148.066L 172.063,148.066zM 236.52,132.598L 282.242,132.598L 282.242,86.848L 236.52,86.848zM 172.063,132.598L 217.844,132.598L 217.844,86.848L 172.063,86.848zM 172.063,255.05L 217.844,255.05L 217.844,209.319L 172.063,209.319zM 368.475,344.174c 10.469,0.00, 18.949,8.495, 18.949,18.977L 387.424,428.535 c-0.001,10.481-8.481,18.964-18.949,18.964 + c-10.494,0.00-18.979-8.483-18.979-18.964l0.00-65.385 C 349.50,352.669, 357.981,344.174, 368.475,344.174zM 144.372,344.174c 10.467,0.00, 18.946,8.495, 18.946,18.977L 163.318,428.535 c0.00,10.481-8.479,18.964-18.946,18.964 + c-10.495,0.00-18.979-8.483-18.979-18.964l0.00-65.385 C 125.395,352.669, 133.877,344.174, 144.372,344.174zM 107.603,193.823L 153.36,193.823L 153.36,148.066L 107.603,148.066zM 107.603,132.598L 153.36,132.598L 153.36,86.848L 107.603,86.848zM 236.52,193.823L 282.242,193.823L 282.242,148.066L 236.52,148.066zM 365.40,193.823L 411.155,193.823L 411.155,148.066L 365.40,148.066zM 365.40,255.05L 411.155,255.05L 411.155,209.319L 365.40,209.319zM 393.676,414.993l0.00-20.091 c 7.886-6.972, 12.886-17.154, 12.886-28.519c0.00-21.04-17.044-38.116-38.088-38.116 + c-21.069,0.00-38.114,17.076-38.114,38.116c0.00,11.365, 5.001,21.547, 12.885,28.519L 343.245,414.993 L 169.575,414.993 l0.00-20.091 + c 7.885-6.972, 12.885-17.154, 12.885-28.519c0.00-21.04-17.044-38.116-38.087-38.116c-21.07,0.00-38.114,17.076-38.114,38.116 + c0.00,11.365, 5.00,21.547, 12.884,28.519L 119.143,414.993 L 32.91,414.993 l0.00-415.021 l 447.103,0.00 L 480.013,414.993 L 393.676,414.993 z M 75.331,42.393L 75.331,307.647 l 363.134,0.00 + l 0.001-265.254L 75.331,42.393 zM 236.52,255.05L 282.242,255.05L 282.242,209.319L 236.52,209.319zM 300.972,255.05L 346.727,255.05L 346.727,209.319L 300.972,209.319zM 300.972,132.598L 346.727,132.598L 346.727,86.848L 300.972,86.848zM 300.972,193.823L 346.727,193.823L 346.727,148.066L 300.972,148.066z" /> +<glyph unicode="" d="M 317.874,207.586L 223.48,285.505L 223.48,240.826L 161.002,240.828L 161.002,174.352L 223.478,174.35L 223.478,129.682 zM 127.404,207.801c0.00,33.476, 14.616,63.534, 37.808,84.158L 32.002,336.244l0.00-260.247 L 224.50,12.002l0.00,84.27 + C 169.65,103.824, 127.404,150.875, 127.404,207.801zM 240.00,320.392c 15.104,0.00, 29.512-2.982, 42.674-8.377l 166.323,55.294L 240.50,436.634L 32.002,367.309l 165.772-55.11 + C 210.815,317.478, 225.066,320.392, 240.00,320.392zM 352.596,207.801c0.00-56.84-42.12-103.833-96.848-111.494l0.00-84.305 l 192.497,63.995L 448.245,336.244 l-133.391-44.345 + C 338.008,271.276, 352.596,241.244, 352.596,207.801z" /> +<glyph unicode="" d="M 32.002,75.997L 224.50,12.002L 224.50,272.249L 32.002,336.244 zM 240.50,436.634L 32.002,367.309L 240.50,297.995L 448.997,367.309 zM 255.748,12.002L 448.245,75.997L 448.245,336.244L 255.748,272.249 z" /> +<glyph unicode="" d="M 381.254,375.126c 11.729-16.323, 17.626-35.857, 17.626-58.604c0.00-23.444-5.932-42.296-17.78-56.524 + c-6.646-7.991-16.385-15.30-29.295-21.893c 19.581-7.107, 34.383-18.403, 44.349-33.856 + c 9.959-15.455, 14.956-34.229, 14.956-56.263c0.00-22.745-5.709-43.133-17.101-61.193 + c-7.229-11.979-16.293-22.063-27.188-30.225c-12.258-9.372-26.718-15.826-43.383-19.271 + c-16.664-3.508-34.728-5.213-54.244-5.213l-173.00,0.00 L 96.194,416.011 l 185.54,0.00 C 328.561,415.327, 361.734,401.689, 381.254,375.126z + M 172.782,349.338l0.00-84.655 l 93.312,0.00 c 16.665,0.00, 30.194,3.166, 40.59,9.496c 10.396,6.346, 15.609,17.581, 15.609,33.748 + c0.00,17.875-6.893,29.682-20.639,35.423c-11.854,3.987-26.969,5.988-45.366,5.988L 172.782,349.338 z M 172.782,201.115l0.00-102.344 l 93.22,0.00 + c 16.632,0.00, 29.604,2.229, 38.885,6.765c 16.813,8.317, 25.229,24.298, 25.229,47.914c0.00,19.983-8.161,33.698-24.479,41.147 + c-9.093,4.188-21.879,6.324-38.354,6.518L 172.782,201.115 z" /> +<glyph unicode="" d="M 448.146,103.733c-32.37,33.626-39.422,96.247-46.244,144.357C 391.786,319.403, 389.655,399.545, 288.00,410.034L 288.00,422.951 + c0.00,12.958-19.774,23.464-32.732,23.464c-12.957,0.00-31.266-10.506-31.266-23.464l0.00-12.935 + c-100.815-10.558-104.324-90.674-114.348-161.949c-6.768-48.132-13.766-110.76-45.87-144.402 + c-6.481-6.794-8.294-16.796-4.60-25.428c 3.698-8.639, 12.184-14.235, 21.576-14.235l 350.482,0.00 c 9.406,0.00, 17.907,5.619, 21.597,14.286 + C 456.516,86.938, 454.672,96.957, 448.146,103.733zM 256.00-14.555c 25.712,0.00, 46.557,20.845, 46.557,46.557l-93.113,0.00 C 209.443,6.29, 230.287-14.555, 256.00-14.555z" /> +<glyph unicode="" d="M 460.282,399.933c-29.559,29.429-80.832,26.523-110.294-3.051L 141.657,187.507 + c-21.036-21.129-23.084-57.451-1.914-78.236c 21.114-21.168, 57.359-19.016, 78.394,2.113l 129.454,130.282 + c 5.135,4.709, 5.525,12.354, 0.21,18.147c-4.96,5.409-15.472,5.629-19.813,1.268L 199.015,131.397l0.00,0.00 + c-12.636-12.629-25.909-14.955-38.576-2.518c-12.674,12.531-12.258,27.254, 0.345,39.916l0.00,0.00l 206.882,207.896l0.00,0.00l-0.04,0.037 + c 21.007,21.043, 50.964,23.467, 72.00,2.515c 20.731-20.977, 21.542-54.067, 0.265-75.111l 0.007,0.045L 186.923,49.795l 0.01-0.031 + c-28.166-26.053-75.066-31.572-106.799-0.541c-29.505,29.422-26.095,77.855, 0.506,107.701l 175.476,176.465 + c 2.717,2.805, 5.619,13.408-0.289,18.62c-5.189,4.579-15.311,5.955-18.934,2.314L 61.859,177.889 + c-43.236-45.451-41.512-112.49-3.464-150.205c 38.01-37.904, 106.534-40.826, 149.494,2.51L 461.10,284.58 + C 490.632,314.03, 489.853,370.50, 460.282,399.933z" /> +<glyph unicode="" d="M 256.023,463.354L 32.188,192.187L 160.536,192.187L 160.531-1.098L 351.492-1.098L 351.498,192.18L 479.813,192.18 z" /> +<glyph unicode="" d="M 496.124,223.978L 224.957,447.812L 224.957,319.464L 31.672,319.469L 31.672,128.508L 224.949,128.502L 224.949,0.188 z" /> +<glyph unicode="" d="M 15.544,223.978L 286.711,447.812L 286.711,319.464L 479.996,319.469L 479.996,128.508L 286.719,128.502L 286.719,0.188 z" /> +<glyph unicode="" d="M 255.977-15.256L 479.813,255.912L 351.463,255.912L 351.469,449.198L 160.507,449.198L 160.501,255.92L 32.188,255.92 z" /> +<glyph unicode="" d="M 395.786,207.949c-0.646,64.859, 52.894,95.965, 55.287,97.51c-30.085,44.022-76.946,50.053-93.647,50.749 + c-39.881,4.039-77.818-23.48-98.059-23.48c-20.189,0.00-51.423,22.884-84.50,22.281c-43.47-0.646-83.552-25.275-105.935-64.207 + c-45.164-78.371-11.565-194.472, 32.454-258.033c 21.51-31.111, 47.159-66.057, 80.835-64.808 + c 32.43,1.295, 44.693,20.983, 83.90,20.983c 39.208,0.00, 50.229-20.983, 84.549-20.339c 34.896,0.648, 57.006,31.707, 78.366,62.914 + c 24.702,36.094, 34.872,71.038, 35.472,72.832C 463.735,104.708, 396.461,130.479, 395.786,207.949z M 331.301,398.287 + c 17.874,21.685, 29.938,51.77, 26.647,81.783c-25.746-1.048-56.954-17.149-75.426-38.785 + c-16.575-19.194-31.083-49.826-27.194-79.24C 284.069,359.802, 313.408,376.65, 331.301,398.287z" /> +<glyph unicode="" d="M 432.00,320.00c-17.601,0.00-32.00-14.40-32.00-32.00l0.00-128.00 c0.00-17.60, 14.399-32.00, 32.00-32.00c 17.60,0.00, 32.00,14.40, 32.00,32.00L 464.00,288.00 C 464.00,305.60, 449.60,320.00, 432.00,320.00z + M 48.00,320.00c-17.601,0.00-32.00-14.40-32.00-32.00l0.00-128.00 c0.00-17.60, 14.399-32.00, 32.00-32.00c 17.60,0.00, 32.00,14.40, 32.00,32.00L 80.00,288.00 C 80.00,305.60, 65.599,320.00, 48.00,320.00z M 96.00,112.00 + c0.00-26.51, 21.49-48.00, 48.00-48.00l 16.00,0.00 l0.00-64.00 c0.00-17.60, 14.399-32.00, 32.00-32.00c 17.60,0.00, 32.00,14.40, 32.00,32.00l0.00,64.00 l 32.00,0.00 l0.00-64.00 c0.00-17.60, 14.40-32.00, 32.00-32.00 + c 17.599,0.00, 32.00,14.40, 32.00,32.00l0.00,64.00 l 16.00,0.00 c 26.51,0.00, 48.00,21.49, 48.00,48.00L 384.00,288.00 L 96.00,288.00 L 96.00,112.00 z M 299.299,435.253l 20.252,38.903 + c 1.016,1.951, 0.25,4.379-1.701,5.395c-1.951,1.016-4.379,0.25-5.396-1.701l-20.559-39.493C 275.797,444.581, 258.299,448.00, 240.00,448.00 + c-18.298,0.00-35.796-3.419-51.898-9.643L 167.544,477.849c-1.017,1.951-3.443,2.717-5.396,1.701 + c-1.952-1.016-2.717-3.443-1.701-5.395l 20.25-38.904c-45.314-20.509-78.119-63.792-83.81-115.252l 286.22,0.00 + C 377.42,371.461, 344.614,414.743, 299.299,435.253z M 176.00,344.80c-12.813,0.00-23.20,10.387-23.20,23.20s 10.387,23.20, 23.20,23.20 + c 12.813,0.00, 23.20-10.387, 23.20-23.20C 199.199,355.187, 188.813,344.80, 176.00,344.80z M 304.00,344.80c-12.813,0.00-23.201,10.387-23.201,23.20 + S 291.188,391.20, 304.00,391.20c 12.812,0.00, 23.198-10.387, 23.198-23.20S 316.813,344.80, 304.00,344.80z" /> +<glyph unicode="" d="M 32.74,415.823l0.00-64.651 L 480.00,351.172 L 480.00,415.823 L 32.74,415.823 z M 480.00,320.151L 32.74,320.151 l0.00-64.652 L 480.00,255.499 L 480.00,320.151 z M 480.00,223.831L 32.74,223.831 l0.00-64.667 L 480.00,159.164 + L 480.00,223.831 z M 479.854,127.831L 241.426,127.831 l0.00-64.667 l 238.428,0.00 L 479.854,127.831 z" /> +<glyph unicode="" d="M 32.741,415.823l0.00-64.651 L 480.00,351.172 L 480.00,415.823 L 32.741,415.823 z M 32.741,255.861L 480.00,255.861 l0.00,64.652 L 32.741,320.513 L 32.741,255.861 z M 32.741,159.164L 480.00,159.164 + l0.00,64.667 L 32.741,223.831 L 32.741,159.164 z M 32.887,63.164l 238.427,0.00 l0.00,64.668 L 32.887,127.832 L 32.887,63.164 z" /> +<glyph unicode="" d="M 32.37,415.823l0.00-64.651 l 447.26,0.00 L 479.63,415.823 L 32.37,415.823 z M 32.37,255.861l 447.26,0.00 l0.00,64.652 L 32.37,320.513 L 32.37,255.861 z M 32.37,158.99l 447.26,0.00 + l0.00,64.666 L 32.37,223.656 L 32.37,158.99 z M 136.786,63.164l 238.428,0.00 l0.00,64.668 L 136.786,127.832 L 136.786,63.164 z" /> +<glyph unicode="" d="M 55.773,415.998L 89.242,65.979L 179.998,156.734L 316.659,20.057L 451.689,155.088L 315.025,291.759L 405.758,382.491 z" /> +<glyph unicode="" d="M 451.689,415.998L 418.221,65.979L 327.465,156.734L 190.804,20.057L 55.773,155.088L 192.438,291.759L 101.705,382.491 z" /> +<glyph unicode="" d="M 55.773,28.153L 89.242,378.178L 179.998,287.422L 316.659,424.10L 451.689,289.069L 315.025,152.393L 405.758,61.661 z" /> +<glyph unicode="" d="M 451.689,28.153L 418.221,378.178L 327.465,287.422L 190.804,424.10L 55.773,289.069L 192.438,152.393L 101.705,61.661 z" /> +<glyph unicode="" d="M 255.50,479.00L 31.938,255.437L 159.688,255.437L 159.688-32.00L 351.313-32.00L 351.313,255.437L 479.063,255.437 z" /> +<glyph unicode="" d="M 142.056-32.649L-0.909,156.133L 88.021,223.45L 182.043,99.299L 418.531,479.002L 513.212,420.044L 233.86-32.649 + z" /> +<glyph unicode="" d="M 511.352,435.355L 467.354,479.351L 256.00,267.998L 44.646,479.351L 0.649,435.355L 212.003,224.00L 0.649,12.647L 44.646-31.351L 256.00,180.004L 467.354-31.351L 511.352,12.647L 299.997,224.00 + z" /> +<glyph unicode="" d="M 432.324,224.013c0.00,27.226, 16.741,48.712, 41.994,63.479c-4.563,15.178-10.563,29.739-17.998,43.431 + c-28.278-7.384-51.198,3.691-70.452,22.971c-19.254,19.228-25.15,42.149-17.741,70.453c-13.69,7.409-28.253,13.434-43.456,17.972 + c-14.767-25.254-41.456-41.996-68.685-41.996c-27.226,0.00-53.889,16.741-68.682,41.996c-15.204-4.539-29.74-10.563-43.456-17.972 + c 7.409-28.304, 1.512-51.225-17.742-70.453c-19.254-19.279-42.149-30.354-70.453-22.971c-7.409-13.692-13.434-28.253-17.972-43.431 + c 25.228-14.767, 41.996-36.252, 41.996-63.479c0.00-27.228-16.768-53.942-41.996-68.71c 4.539-15.177, 10.563-29.74, 17.972-43.43 + c 28.304,7.383, 51.199,1.488, 70.453-17.74c 19.254-19.28, 25.151-42.175, 17.742-70.454c 13.715-7.436, 28.251-13.459, 43.456-17.997 + c 14.793,25.228, 41.457,41.994, 68.682,41.994c 27.229,0.00, 53.918-16.767, 68.685-41.994c 15.203,4.538, 29.766,10.562, 43.456,17.997 + c-7.383,28.279-1.513,51.174, 17.741,70.454c 19.254,19.229, 42.174,30.327, 70.452,22.918c 7.436,13.692, 13.436,28.253, 17.998,43.482 + C 449.065,175.301, 432.324,196.785, 432.324,224.013z M 255.986,129.051c-52.428,0.00-94.936,42.508-94.936,94.962 + c0.00,52.43, 42.508,94.911, 94.936,94.911c 52.456,0.00, 94.938-42.481, 94.938-94.911C 350.924,171.559, 308.442,129.051, 255.986,129.051z" /> +<glyph unicode="" d="M 427.555,397.486L 84.457,397.486 l-28.806-54.838L 456.35,342.648 L 427.555,397.486zM 321.42,449.405L 189.754,449.405 l0.00-26.547 L 321.42,422.858 L 321.42,449.405 zM 114.156-1.405l 283.702,0.00 l 28.795,317.869L 85.348,316.464 L 114.156-1.405z M 322.633,288.831l 25.488,0.00 l0.00-261.495 l-25.488,0.00 L 322.633,288.831 z + M 242.424,288.831l 26.314,0.00 l0.00-261.495 l-26.314,0.00 L 242.424,288.831 z M 163.04,288.831l 26.328,0.00 l0.00-261.495 L 163.04,27.336 L 163.04,288.831 z" /> +<glyph class="hidden" unicode="" d="M0,480L 512 -32L0 -32 z" horiz-adv-x="0" /> +</font></defs></svg> \ No newline at end of file diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/MUI-Icons.ttf b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/MUI-Icons.ttf new file mode 100755 index 0000000000000000000000000000000000000000..ad27935ff5672575c593a4b1b86e8bd019b50456 Binary files /dev/null and b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/MUI-Icons.ttf differ diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/MUI-Icons.woff b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/MUI-Icons.woff new file mode 100755 index 0000000000000000000000000000000000000000..699a9a667f4701a1cacffaf63f4951fc48f11c6c Binary files /dev/null and b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/MUI-Icons.woff differ diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansBlack-webfont.eot b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansBlack-webfont.eot new file mode 100755 index 0000000000000000000000000000000000000000..ff6a97e9ddf5f08b1d7a94e4395af25df88ba01f Binary files /dev/null and b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansBlack-webfont.eot differ diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansBlack-webfont.svg b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansBlack-webfont.svg new file mode 100755 index 0000000000000000000000000000000000000000..2e269097b519972a056ef51e9c37d6dac9a7b145 --- /dev/null +++ b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansBlack-webfont.svg @@ -0,0 +1,244 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Fontspring. +</metadata> +<defs> +<font id="webfont85gDAx2H" horiz-adv-x="1648" > +<font-face units-per-em="2048" ascent="1536" descent="-512" /> +<missing-glyph horiz-adv-x="491" /> +<glyph unicode=" " horiz-adv-x="491" /> +<glyph unicode="	" horiz-adv-x="491" /> +<glyph unicode=" " horiz-adv-x="491" /> +<glyph unicode="!" horiz-adv-x="598" d="M119 152q0 74 52 127t124 53q74 0 126 -53.5t52 -126.5q0 -72 -52 -124.5t-126 -52.5q-72 0 -124 52.5t-52 124.5zM129 1391h354l-59 -895h-240z" /> +<glyph unicode=""" horiz-adv-x="835" d="M106 788v578h261v-76l-84 -502h-177zM504 788v578h262v-76l-88 -502h-174z" /> +<glyph unicode="#" horiz-adv-x="1443" d="M68 215l22 160h283l57 272h-278l24 158h287l78 379h166l-78 -379h280l78 379h166l-78 -379h301l-24 -158h-310l-55 -272h305l-22 -160h-316l-80 -397h-167l79 397h-276l-82 -397h-168l82 397h-274zM541 375h278l58 272h-281z" /> +<glyph unicode="$" horiz-adv-x="993" d="M70 82l61 250q12 -10 33.5 -25.5t101.5 -43t170 -34.5l6 234q-180 61 -270 146t-90 208q0 127 93 223.5t286 116.5l6 182h104l-6 -176q90 0 170 -15t115 -30l35 -16l-78 -240q-90 47 -248 56l-6 -232q203 -66 287 -144.5t84 -195.5q0 -143 -102.5 -240.5t-286.5 -115.5 l-5 -172h-104l4 166q-213 6 -356 96zM346 831q0 -70 105 -110l4 197q-109 -11 -109 -87zM541 229q109 12 108 90q0 41 -25.5 65t-76.5 44z" /> +<glyph unicode="%" horiz-adv-x="1603" d="M63 1049q0 139 98.5 233t252 94t252 -94t98.5 -233q0 -141 -98.5 -237.5t-252 -96.5t-252 96.5t-98.5 237.5zM246 0l979 1407l110 -74l-923 -1333h-166zM254 1049q0 -63 43 -110.5t116.5 -47.5t116.5 47t43 111q0 61 -43 109t-116.5 48t-116.5 -48t-43 -109zM838 307 q0 139 98 234.5t251.5 95.5t253 -95.5t99.5 -234.5t-99.5 -235.5t-253 -96.5t-251.5 96.5t-98 235.5zM1030 307.5q0 -63.5 42 -109.5t116 -46t118 46t44 109q0 61 -43 108.5t-117 47.5t-117 -46t-43 -109.5z" /> +<glyph unicode="&" horiz-adv-x="1468" d="M61 350q0 227 258 365q-90 162 -90 311q0 152 102.5 258.5t305.5 106.5q188 0 292.5 -93.5t104.5 -250.5q0 -143 -81 -232.5t-222 -159.5q16 -20 27 -28q100 -113 200 -207q150 199 177 518h274q-43 -424 -252 -686q137 -106 250 -146l-100 -192q-147 18 -355 158 q-160 -96 -370 -97q-94 0 -180.5 19.5t-166 60.5t-127 117t-47.5 178zM346 362q0 -70 58.5 -110.5t160.5 -40.5q92 0 166 31q-141 123 -248 247q-2 2 -8 9.5t-11 14.5t-7 11q-111 -70 -111 -162zM532 1026q0 -82 60 -182q178 86 178 196q0 51 -31.5 83t-85.5 32 q-121 0 -121 -129z" /> +<glyph unicode="'" horiz-adv-x="442" d="M106 788v578h283v-76l-141 -502h-142z" /> +<glyph unicode="(" horiz-adv-x="638" d="M82 553q0 150 32.5 297t80 249.5t94.5 184.5t80 121l32 41l209 -72l-32 -40q-20 -26 -71.5 -109.5t-90.5 -173.5t-72 -226.5t-33 -271.5q0 -150 32 -294t77 -244.5t90 -179.5t76 -118l32 -39l-206 -79q-14 14 -36 42.5t-79 125t-100 201t-79 264t-36 321.5z" /> +<glyph unicode=")" horiz-adv-x="638" d="M18 -322l34 40q22 26 75 114t93 183.5t74 241.5t34 296q0 135 -31 270t-75 230.5t-89 170t-76 111.5l-30 39l211 72q12 -14 33.5 -42t76.5 -118t97 -188.5t77 -247t35 -297.5q0 -162 -34 -320.5t-82 -268t-97 -195.5t-82 -129l-35 -41z" /> +<glyph unicode="*" horiz-adv-x="1048" d="M68 854l323 84l47 -82l-233 -240zM68 1065l137 238l233 -240l-47 -80zM387 510l90 324h92l93 -324h-275zM387 1409h275l-93 -324h-92zM608 856l47 82l324 -84l-137 -238zM608 1063l234 240l137 -238l-324 -82z" /> +<glyph unicode="+" horiz-adv-x="1064" d="M43 436v185h395v409h191v-409h385v-185h-385v-436h-191v436h-395z" /> +<glyph unicode="," horiz-adv-x="530" d="M45 -311l83 81.5t50.5 77t26.5 111.5q0 53 -26.5 108.5t-106.5 178.5l268 86q100 -150 100 -283q0 -213 -293 -467z" /> +<glyph unicode="-" horiz-adv-x="792" d="M102 442v170h588v-170h-588z" /> +<glyph unicode="." horiz-adv-x="534" d="M90 152q0 74 52.5 127t123.5 53q74 0 126 -53.5t52 -126.5q0 -72 -52 -124.5t-126 -52.5q-72 0 -124 52.5t-52 124.5z" /> +<glyph unicode="/" horiz-adv-x="964" d="M37 -401l682 1767h188l-680 -1767h-190z" /> +<glyph unicode="0" horiz-adv-x="1157" d="M76 479q0 207 135 366t377 159q229 0 364 -146.5t135 -345.5q0 -131 -56 -251t-176 -203t-280 -83q-233 0 -366 149.5t-133 354.5zM354 489q0 -113 54.5 -195.5t173.5 -82.5q115 0 170 83t55 195q0 117 -54.5 198t-168.5 81q-121 0 -175.5 -81t-54.5 -198z" /> +<glyph unicode="1" horiz-adv-x="950" d="M98 0v233h262v492h-258v254h562v-746h237v-233h-803z" /> +<glyph unicode="2" horiz-adv-x="974" d="M72 874q16 14 47 36t129 58t196 36q172 0 276.5 -93.5t104.5 -234.5q0 -88 -49 -174t-104.5 -139.5t-149.5 -131.5h389v-231h-835l6 168q16 12 46 32.5t102.5 79t129 112.5t102.5 122t46 117q0 55 -32 88t-97 33q-41 0 -88 -17.5t-74 -34.5l-29 -16z" /> +<glyph unicode="3" horiz-adv-x="856" d="M12 870q18 14 51 37t131.5 60t196.5 37q160 0 265.5 -84t105.5 -213q0 -199 -252 -340q135 -37 209 -126t74 -204q0 -203 -198 -326t-478 -123q-45 0 -66 2l-24 232q53 -4 82 -4q156 0 261 60.5t105 162.5q0 164 -285 164h-32v221q109 4 198.5 71.5t89.5 153.5 q0 49 -31.5 75t-80.5 26q-39 0 -87 -19.5t-77 -38.5l-29 -18z" /> +<glyph unicode="4" horiz-adv-x="1124" d="M45 12v203l510 760h342v-744h176v-219h-176v-407h-297v407h-555zM332 231h268v435z" /> +<glyph unicode="5" horiz-adv-x="854" d="M68 -176q51 -6 100 -6q143 0 232 52t89 165q0 66 -32.5 114t-95 77.5t-126 45t-153.5 29.5v678h661v-231h-366v-254q430 -106 430 -435q0 -225 -178 -348t-467 -123q-45 0 -68 2z" /> +<glyph unicode="6" horiz-adv-x="1083" d="M66 563q0 156 53 299.5t153.5 260t261 188t361.5 80.5l18 -238q-422 -31 -516 -365q94 115 244 115q174 0 281.5 -127t107.5 -309q0 -199 -128 -345.5t-347 -146.5q-236 0 -362.5 170t-126.5 418zM373 567q6 -356 194 -356q72 0 113 62.5t41 164.5q0 221 -156 221 q-100 0 -192 -92z" /> +<glyph unicode="7" horiz-adv-x="972" d="M43 717v262h895v-172q-229 -578 -565 -1233l-299 59q324 610 512 1084h-543z" /> +<glyph unicode="8" horiz-adv-x="1064" d="M78 334q0 121 62.5 205t170.5 153q-186 141 -186 322q0 156 115.5 266.5t306.5 110.5q168 0 291 -90.5t123 -253.5q0 -186 -195 -328q104 -68 162.5 -144.5t58.5 -185.5q0 -166 -130 -290t-341 -124q-170 0 -304 89.5t-134 269.5zM340 354q0 -63 46 -108t118 -45 q76 0 129 48t53 111q0 53 -45 100.5t-131 100.5q-170 -105 -170 -207zM430 1042q0 -106 135 -198q127 82 127 188q0 57 -32.5 95t-102.5 38q-72 0 -99.5 -38t-27.5 -85z" /> +<glyph unicode="9" horiz-adv-x="1110" d="M80 506q0 197 130 347.5t351 150.5q236 0 364 -170t128 -418q0 -156 -53.5 -300.5t-154 -260t-262 -188.5t-362.5 -81l-18 238q442 35 520 383q-92 -123 -256 -123q-170 0 -278.5 124t-108.5 298zM389 530q0 -80 35 -140t123 -60q63 0 117.5 31.5t78.5 58.5 q-4 152 -56 250t-144 98q-74 0 -114 -63.5t-40 -174.5z" /> +<glyph unicode=":" horiz-adv-x="577" d="M113 152q0 74 51 127t124.5 53t126 -53.5t52.5 -126.5q0 -72 -52.5 -124.5t-126 -52.5t-124.5 52.5t-51 124.5zM113 795q0 74 51 127t124.5 53t126 -53.5t52.5 -126.5q0 -72 -52.5 -124.5t-126 -52.5t-124.5 52.5t-51 124.5z" /> +<glyph unicode=";" horiz-adv-x="571" d="M66 -311q59 57 82.5 81.5t50 77t26.5 111.5q0 53 -26.5 108.5t-106.5 178.5l268 86q100 -150 101 -283q0 -213 -293 -467zM109 795q0 74 52 127t124 53q74 0 126 -53.5t52 -126.5q0 -72 -52.5 -124.5t-125.5 -52.5q-72 0 -124 52.5t-52 124.5z" /> +<glyph unicode="<" horiz-adv-x="1064" d="M47 479v94l873 469l47 -186l-650 -330l650 -350l-47 -184z" /> +<glyph unicode="=" horiz-adv-x="1064" d="M90 252v180h885v-180h-885zM90 594v180h885v-180h-885z" /> +<glyph unicode=">" horiz-adv-x="1064" d="M100 176l648 350l-648 330l47 186l873 -469v-94l-873 -487z" /> +<glyph unicode="?" horiz-adv-x="825" d="M82 1206l70 271q12 -4 33.5 -10.5t85 -30t121 -49t127 -67.5t119.5 -86t85 -103.5t35 -120.5q0 -68 -46 -137.5t-101.5 -120t-101.5 -120t-46 -136.5h-250q-2 20 -2 34q0 74 32.5 147t72.5 119t73 93t33 76q0 55 -85 115.5t-169 93.5zM166 152q0 74 51 127t125 53 t126 -53.5t52 -126.5q0 -72 -52 -124.5t-126 -52.5t-125 52.5t-51 124.5z" /> +<glyph unicode="@" horiz-adv-x="1822" d="M70 391q0 166 65.5 319.5t179 269.5t282.5 185.5t364 69.5q342 0 560 -194.5t218 -487.5q0 -141 -57.5 -264t-174.5 -193q-68 -41 -216 -73.5t-195 -47.5q-23 88 -41 146q-29 -57 -102.5 -101.5t-157.5 -44.5q-131 0 -219.5 106.5t-88.5 280.5q0 242 167 388.5t409 146.5 q43 0 92 -5t78 -11l29 -4v-486l18 -176q117 2 178.5 95t61.5 227q0 217 -150.5 367.5t-406.5 150.5q-293 0 -479.5 -194.5t-186.5 -457.5q0 -250 170 -410.5t381 -172.5l-35 -199q-317 23 -530 239t-213 531zM764 365q0 -172 94 -172q59 0 121 83v420q-94 0 -154.5 -96 t-60.5 -235z" /> +<glyph unicode="A" horiz-adv-x="1320" d="M2 0l508 1376h301l508 -1376h-322l-86 246h-510l-86 -246h-313zM494 512h325l-164 463z" /> +<glyph unicode="B" horiz-adv-x="1255" d="M154 0v1366h510q244 0 353 -95t109 -233q0 -162 -165 -286q88 -47 155.5 -134.5t67.5 -220.5q0 -180 -130 -288.5t-337 -108.5h-563zM471 264h215q168 0 168 152q0 66 -42 105.5t-126 39.5h-215v-297zM471 815h262q63 45 64 141q0 145 -164 146h-162v-287z" /> +<glyph unicode="C" horiz-adv-x="1384" d="M70 653q0 317 212 527.5t566 210.5q295 0 471 -103l12 -8l-117 -264q-14 10 -41.5 26.5t-125 44t-207.5 27.5q-203 0 -327 -115.5t-124 -316.5q0 -207 129 -318.5t313 -111.5q111 0 209.5 29.5t141.5 58.5l43 31l129 -230q-6 -6 -19.5 -17t-62.5 -40t-105.5 -50.5 t-151.5 -40t-202 -18.5q-315 0 -529 179.5t-214 498.5z" /> +<glyph unicode="D" horiz-adv-x="1497" d="M154 0v1366h526q143 0 271 -36t236.5 -111.5t172 -207.5t63.5 -306q0 -336 -224 -520.5t-597 -184.5h-448zM471 264h111q260 0 386 119t126 313q0 186 -112 296t-331 110h-180v-838z" /> +<glyph unicode="E" horiz-adv-x="1134" d="M154 0v1366h893v-264h-576v-277h455v-268h-455v-293h602v-264h-919z" /> +<glyph unicode="F" horiz-adv-x="1105" d="M154 0v1366h899v-264h-582v-291h461v-262h-461v-549h-317z" /> +<glyph unicode="G" horiz-adv-x="1456" d="M66 657q0 305 217 519.5t583 214.5q127 0 245 -25t171 -49l55 -25l-116 -266q-156 88 -365 88q-219 0 -344 -124t-125 -316q0 -201 135 -311.5t332 -110.5l193 14v240h-265v266h576v-737q-317 -59 -524 -60q-334 0 -551 187.5t-217 494.5z" /> +<glyph unicode="H" horiz-adv-x="1570" d="M154 0v1366h317v-535h631v535h315v-1366h-315v563h-631v-563h-317z" /> +<glyph unicode="I" horiz-adv-x="626" d="M154 0v1366h317v-1366h-317z" /> +<glyph unicode="J" horiz-adv-x="624" d="M-115 -127q270 20 271 393v1100h317v-1090q0 -131 -20.5 -233t-71.5 -197.5t-153.5 -158t-254.5 -82.5z" /> +<glyph unicode="K" horiz-adv-x="1327" d="M154 0v1366h317v-516h43l410 516h393l-543 -637l574 -729h-400l-434 582h-43v-582h-317z" /> +<glyph unicode="L" horiz-adv-x="1097" d="M154 0v1366h317v-1102h596v-264h-913z" /> +<glyph unicode="M" horiz-adv-x="1824" d="M129 0l51 1366h453l282 -850l283 850h449l49 -1366h-307l-35 1016l-346 -1016h-201l-338 999l-33 -999h-307z" /> +<glyph unicode="N" horiz-adv-x="1529" d="M154 0v1366h321l590 -874v874h311v-1366h-325l-586 874v-874h-311z" /> +<glyph unicode="O" d="M66 680q0 182 85 341t262 264.5t414 105.5q342 0 549 -198t207 -484q0 -295 -215 -514.5t-559 -219.5q-225 0 -397 100.5t-259 259.5t-87 345zM395 686q0 -174 110.5 -309t309.5 -135t317.5 133t118.5 317q0 178 -112.5 305t-313 127t-315.5 -128t-115 -310z" /> +<glyph unicode="P" horiz-adv-x="1226" d="M154 0v1366h522q252 0 383 -128t131 -325q0 -221 -146.5 -353t-367.5 -132h-205v-428h-317zM471 692h158q115 0 173 55.5t58 151.5q0 203 -231 203h-158v-410z" /> +<glyph unicode="Q" d="M63 680q0 135 51.5 260t144.5 226.5t241.5 163t328.5 61.5q342 0 547 -198t205 -484q0 -229 -136 -422t-370 -271q39 -51 73 -84.5t93 -71.5t142 -55q66 -13 148 -13q20 0 42 1l-47 -282q-9 0 -18 -1q-127 0 -232 28q-113 30 -189.5 83t-119.5 94t-90 97q-10 14 -17 20 l-61 72q-20 25 -60.5 49t-74.5 33q-279 55 -440 246.5t-161 447.5zM395 686q0 -180 110.5 -316.5t309.5 -136.5t317.5 136.5t118.5 320.5q0 182 -112.5 308t-315.5 126q-201 0 -314.5 -128t-113.5 -310z" /> +<glyph unicode="R" horiz-adv-x="1333" d="M154 0v1366h508q254 0 383 -119t129 -311q0 -252 -211 -369l370 -567h-377l-305 481h-180v-481h-317zM471 743h113q147 0 203.5 48.5t56.5 136.5q0 174 -232 174h-141v-359z" /> +<glyph unicode="S" horiz-adv-x="1062" d="M72 90l92 277l45 -33q29 -20 114 -53t166 -33q84 0 133.5 31.5t49.5 85.5q0 55 -60.5 102t-145.5 88t-170 90t-145.5 134t-60.5 198q0 172 131 293t352 121q88 0 183.5 -15.5t148.5 -32.5l51 -14l-43 -280q-166 70 -329 69q-84 0 -129 -28.5t-45 -77.5q0 -55 60 -101.5 t145 -85.5t170 -88t145.5 -137t60.5 -207q0 -188 -141 -303t-350 -115q-233 0 -418 109z" /> +<glyph unicode="T" horiz-adv-x="1239" d="M35 1102v264h1169v-264h-422v-1102h-317v1102h-430z" /> +<glyph unicode="U" horiz-adv-x="1449" d="M139 522v844h318v-819q0 -305 270 -305q127 0 199.5 78.5t72.5 218.5v827h316v-815q0 -270 -167 -423t-423 -153q-262 0 -424 133t-162 414z" /> +<glyph unicode="V" horiz-adv-x="1259" d="M2 1366h336l295 -891l299 891h325l-477 -1376h-301z" /> +<glyph unicode="W" horiz-adv-x="2013" d="M29 1366h327l262 -946l277 946h231l277 -938l258 938h321l-405 -1376h-324l-252 815l-241 -815h-324z" /> +<glyph unicode="X" horiz-adv-x="1306" d="M20 0l445 676l-445 690h373l262 -430l267 430h362l-442 -682l442 -684h-375l-262 428l-260 -428h-367z" /> +<glyph unicode="Y" horiz-adv-x="1284" d="M-10 1366h372l279 -502l295 502h358l-493 -807v-559h-318v557z" /> +<glyph unicode="Z" horiz-adv-x="1196" d="M74 0v197l608 905h-586v264h998v-197l-598 -905h626v-264h-1048z" /> +<glyph unicode="[" horiz-adv-x="598" d="M141 -340v1706h432v-162h-225v-1382h225v-162h-432z" /> +<glyph unicode="\" horiz-adv-x="978" d="M57 1366h201l682 -1767h-203z" /> +<glyph unicode="]" horiz-adv-x="591" d="M16 -209h228v1442h-228v133h435v-1706h-435v131z" /> +<glyph unicode="^" horiz-adv-x="937" d="M-53 512l438 879h166l438 -879h-203l-319 647l-322 -647h-198z" /> +<glyph unicode="_" horiz-adv-x="1040" d="M10 -76h1024v-151h-1024v151z" /> +<glyph unicode="`" horiz-adv-x="1052" d="M268 1456h283l215 -332l-162 -82z" /> +<glyph unicode="a" horiz-adv-x="1034" d="M43 229q0 287 541 359v35q0 61 -24.5 89.5t-82.5 28.5q-156 0 -305 -110l-6 -4l-66 211q18 14 54 34.5t154 55.5t245 35q188 0 264 -75t76 -235v-329q0 -84 90 -97l16 -2l-86 -239h-6q-206 0 -286 133q-16 -29 -44 -57.5t-92.5 -57.5t-146.5 -29q-133 0 -214 70.5 t-81 183.5zM354 258q0 -70 68 -70q82 0 162 101v139q-230 -35 -230 -170z" /> +<glyph unicode="b" horiz-adv-x="1107" d="M106 39v1384l312 50v-582q88 72 217 72q201 0 307.5 -130.5t106.5 -330.5q0 -227 -139.5 -377t-422.5 -150q-92 0 -187 16.5t-144 33.5zM418 201q33 -18 88 -19q102 0 164.5 80t62.5 227q0 117 -47 181.5t-121 64.5q-76 0 -147 -49v-485z" /> +<glyph unicode="c" horiz-adv-x="966" d="M53 446q0 211 150.5 364t380.5 153q96 0 183 -22.5t126 -47.5l41 -23l-103 -221q-96 84 -210 84q-106 0 -178 -67.5t-72 -200.5q0 -123 63.5 -191.5t165.5 -68.5q61 0 121.5 23.5t89.5 45.5l29 23l94 -203q-12 -12 -37 -32.5t-117 -53.5t-202 -33q-238 0 -381.5 135 t-143.5 336z" /> +<glyph unicode="d" horiz-adv-x="1118" d="M59 440q0 135 51.5 252t162 194t259.5 77q88 0 160 -27v487l309 50v-1188q0 -49 11.5 -121t21.5 -119l10 -45l-286 -14q-18 66 -29 133q-98 -143 -276.5 -143.5t-286 133.5t-107.5 331zM377 459q0 -123 40 -193.5t115 -70.5q88 0 160 96v352q-6 96 -123 96 q-90 0 -141 -70.5t-51 -209.5z" /> +<glyph unicode="e" horiz-adv-x="1017" d="M59 465q0 211 131.5 354.5t341.5 143.5q186 0 299 -123t115 -363l-162 -45l-409 -53q53 -174 223 -174q139 0 285 108l4 4l80 -213q-18 -14 -52 -35.5t-141.5 -57.5t-216.5 -36q-236 0 -367 141.5t-131 348.5zM360 541l261 34q0 6 -1.5 17.5t-8.5 40.5t-17 50.5 t-33.5 38.5t-54.5 17q-63 0 -101.5 -54t-44.5 -144z" /> +<glyph unicode="f" horiz-adv-x="770" d="M37 723v170l145 49v66q0 238 137.5 373t348.5 135q82 0 156.5 -20.5t107.5 -41.5l33 -18l-97 -228q-86 66 -192 66q-182 0 -182 -242v-94h245v-215h-245v-723h-312v723h-145z" /> +<glyph unicode="g" horiz-adv-x="1062" d="M39 -250q0 131 215 260q-76 31 -107.5 63.5t-31.5 82.5q0 109 147 196q-92 43 -141 118t-49 167q0 152 125 239t301 87q66 0 145.5 -19.5t130.5 -19.5h127l129 20l14 -207h-94q-14 0 -71 8q55 -63 55 -139q0 -131 -134 -213t-317 -82q-37 0 -53 2q-57 -39 -57 -59 q0 -16 35.5 -29.5t140.5 -44.5l129 -37q70 -20 113 -36.5t102 -48t90 -80t31 -109.5q0 -141 -152.5 -247.5t-382.5 -106.5q-178 0 -309 64.5t-131 170.5zM309 -190q0 -90 187 -91q100 0 167.5 27t67.5 70q0 18 -11 32.5t-44 27.5t-60 22l-88 26l-98 27q-121 -75 -121 -141z M356 633q0 -45 38 -85t104 -40q63 0 104 39t41 88q0 47 -36 88t-103 41q-70 0 -109 -43t-39 -88z" /> +<glyph unicode="h" horiz-adv-x="1107" d="M115 0v1423l311 50v-670q137 160 317 160q262 0 263 -304v-659h-310v514q0 102 -16 141t-59 39q-80 0 -195 -123v-571h-311z" /> +<glyph unicode="i" horiz-adv-x="540" d="M96 1286q0 74 47 118t125 44t126 -44t48 -118t-48 -118t-126 -44t-125 44t-47 118zM115 0v938h311v-938h-311z" /> +<glyph unicode="j" horiz-adv-x="540" d="M-150 -250q121 16 193 84t72 229v875h311v-875q0 -250 -136 -385t-347 -163zM94 1286q0 74 47 118t125 44t126 -44t48 -118t-48 -118t-126 -44t-125 44t-47 118z" /> +<glyph unicode="k" horiz-adv-x="1122" d="M115 0v1423l311 50v-836h35l272 301h389l-395 -408l401 -530h-376l-295 412h-31v-412h-311z" /> +<glyph unicode="l" horiz-adv-x="540" d="M115 0v1423l311 50v-1473h-311z" /> +<glyph unicode="m" horiz-adv-x="1679" d="M111 0v913l295 48v-166q160 168 323 168q201 0 250 -172q156 172 332 172q266 0 266 -304v-659h-309v561q0 76 -18.5 104.5t-63.5 28.5q-78 0 -191 -112v-582h-311v561q0 76 -19.5 104.5t-58.5 28.5q-76 0 -184 -114v-580h-311z" /> +<glyph unicode="n" horiz-adv-x="1103" d="M111 0v913l295 48v-168q147 170 333 170q262 0 262 -304v-659h-311v514q0 102 -12 141t-62 39q-82 0 -194 -116v-578h-311z" /> +<glyph unicode="o" horiz-adv-x="1171" d="M57 467q0 92 29 177t89.5 157.5t165.5 117t245 44.5q260 0 396 -139.5t136 -338.5q0 -88 -28.5 -173t-88 -162.5t-168 -126t-251.5 -48.5q-254 0 -389.5 142.5t-135.5 349.5zM375 479q0 -113 56 -198.5t153 -85.5q90 0 153.5 74.5t63.5 191.5q0 111 -56.5 195.5 t-156.5 84.5q-90 0 -151.5 -72.5t-61.5 -189.5z" /> +<glyph unicode="p" horiz-adv-x="1116" d="M111 -485v1398l297 48v-154q78 156 260 156q180 0 285.5 -133.5t105.5 -329.5q0 -213 -124 -369t-351 -156q-113 0 -162 31v-442zM422 258q0 -25 29.5 -43t83.5 -18q86 0 146 72.5t60 211.5q0 115 -41 181.5t-100 66.5q-96 0 -178 -127v-344z" /> +<glyph unicode="q" horiz-adv-x="1110" d="M59 430q0 225 138.5 379t392.5 154q76 0 178 -14.5t168 -28.5l65 -15v-1341l-311 -49v530q-78 -70 -213 -70q-205 0 -311.5 130t-106.5 325zM375 453q0 -115 47 -179.5t118.5 -64.5t149.5 45v479q-51 20 -96 21q-94 0 -156.5 -80t-62.5 -221z" /> +<glyph unicode="r" horiz-adv-x="784" d="M111 0v913l295 48v-197q127 199 284 199q23 0 43.5 -4.5t28.5 -8.5l8 -2l-41 -289q-45 18 -94 19q-109 0 -213 -131v-547h-311z" /> +<glyph unicode="s" horiz-adv-x="868" d="M55 57l62 248l35 -27q23 -17 95 -45t148 -28q113 0 113 57q0 29 -44 52.5t-107.5 47t-126 56.5t-106.5 94t-44 145q0 127 103.5 216.5t316.5 89.5q78 0 148.5 -12.5t101.5 -24.5l32 -15l-57 -247q-94 70 -236 69q-104 0 -104 -55q0 -29 44 -53.5t106.5 -48t126 -56.5 t107.5 -93t44 -142q0 -135 -110.5 -222.5t-307.5 -87.5q-94 0 -179 20.5t-122 41.5z" /> +<glyph unicode="t" horiz-adv-x="854" d="M33 723v168l164 51v221l297 56v-281h278v-215h-276v-377q0 -121 86 -121q63 0 172 76l86 -219q-16 -12 -45 -29.5t-117 -47.5t-172 -30q-145 0 -233.5 78t-88.5 217v453h-151z" /> +<glyph unicode="u" horiz-adv-x="1112" d="M104 258v680h312v-557q0 -76 17.5 -108.5t60.5 -32.5q78 0 188 104v594h311v-653l41 -279l-299 -26q-16 84 -26 151q-160 -156 -342 -156q-117 0 -190 71t-73 212z" /> +<glyph unicode="v" horiz-adv-x="997" d="M0 938h324l176 -541l186 541h313l-364 -942h-277z" /> +<glyph unicode="w" horiz-adv-x="1601" d="M18 938h314l157 -592l183 592h260l196 -594l144 594h307l-274 -942h-301l-199 561l-180 -561h-303z" /> +<glyph unicode="x" horiz-adv-x="1017" d="M14 0l322 467l-322 471h348l150 -236l156 236h333l-321 -463l321 -475h-337l-158 240l-158 -240h-334z" /> +<glyph unicode="y" horiz-adv-x="995" d="M-4 938h317l191 -592l184 592h309l-374 -1004q-59 -158 -199.5 -281.5t-323.5 -137.5l-92 239q106 8 200.5 64.5t127.5 136.5l22 53z" /> +<glyph unicode="z" horiz-adv-x="942" d="M68 0v190l393 517h-377v231h774v-190l-401 -517h415v-231h-804z" /> +<glyph unicode="{" horiz-adv-x="684" d="M16 459v157q39 2 71 15.5t53.5 42t37 56.5t25.5 77t15 84t8 97.5t3 97.5v104q0 166 123 247t328 81v-152q-51 -4 -87 -12t-62.5 -16.5t-42 -28t-25.5 -34.5t-15.5 -51t-6.5 -61.5t-3 -81.5q-4 -186 -31.5 -297.5t-67.5 -161t-110 -81.5v-4q104 -49 152.5 -173t56.5 -391 q2 -76 5 -107.5t15.5 -72.5t38 -55t68.5 -28.5t115 -20.5v-152q-264 0 -357.5 94.5t-93.5 339.5q0 478 -213 488z" /> +<glyph unicode="|" horiz-adv-x="487" d="M139 -461v1995h209v-1995h-209z" /> +<glyph unicode="}" horiz-adv-x="684" d="M6 -311q59 6 97 13t66 25.5t41 34t21.5 52t9.5 66.5l3 93q8 274 59 395t154 169v4q-109 49 -157 161.5t-56 378.5q-2 92 -6.5 131t-28 78t-70.5 53.5t-133 22.5v152q250 0 348.5 -93.5t98.5 -345.5q0 -459 215 -463v-157q-27 0 -51.5 -9.5t-56.5 -40t-54.5 -80.5 t-37.5 -143.5t-15 -218.5q0 -242 -92.5 -336t-354.5 -94v152z" /> +<glyph unicode="~" horiz-adv-x="1187" d="M100 336q0 184 78 273t219 89q82 0 142.5 -29.5t90 -65.5t69.5 -65.5t83 -29.5q70 0 98.5 57.5t28.5 124.5h187q0 -184 -78 -273t-219 -89q-82 0 -142.5 29.5t-90 65.5t-69.5 65.5t-83 29.5q-70 0 -98.5 -57.5t-28.5 -124.5h-187z" /> +<glyph unicode="¡" horiz-adv-x="610" d="M129 -455l59 895h240l55 -895h-354zM139 784q0 72 52.5 124.5t125.5 52.5q72 0 124.5 -52.5t52.5 -124.5q0 -74 -52.5 -127t-124.5 -53q-74 0 -126 53t-52 127z" /> +<glyph unicode="¢" horiz-adv-x="999" d="M66 569q0 180 122.5 307.5t341.5 139.5l9 182h104l-10 -184q188 -20 293 -111l-146 -186q-63 49 -157 61l-21 -405q51 6 105.5 26.5t83.5 38.5l26 17l92 -203q-12 -12 -34.5 -29.5t-104.5 -49.5t-178 -38l-6 -180h-103l9 180q-197 14 -311.5 137t-114.5 297zM365 580 q0 -78 35.5 -131.5t101.5 -69.5l18 397q-155 -30 -155 -196z" /> +<glyph unicode="£" horiz-adv-x="1148" d="M70 135q14 6 36.5 17.5t62.5 57.5t46 101l21 178h-123v127h137l18 162q20 180 129 288t295 108q195 0 320 -109l8 -8l-146 -185q-76 72 -174 72q-59 0 -92 -37t-45 -135l-16 -156h325l-16 -127h-321q-8 -72 -23.5 -135t-28.5 -92l-12 -29q80 -49 199 -49q190 0 202 164 h209q-20 -184 -96 -291.5t-250 -107.5q-92 0 -216 46t-189 46q-70 0 -219 -41z" /> +<glyph unicode="¥" horiz-adv-x="1171" d="M70 1149h317l199 -395l200 395h308l-252 -463h211v-127h-281l-35 -63v-88h316v-127h-316v-281h-309v281h-295v127h295v86l-37 65h-258v127h189z" /> +<glyph unicode="¦" horiz-adv-x="471" d="M131 -362v733h209v-733h-209zM131 688v733h209v-733h-209z" /> +<glyph unicode="§" horiz-adv-x="1013" d="M57 -379l62 152q141 -96 301 -97q111 0 168 82t57 211q0 47 -10 109l-103 573q-23 113 -22 209q0 135 53 209l160 -22q-35 -76 -35 -189q0 -53 10 -115l113 -649q12 -68 12 -135q0 -193 -100 -318.5t-299 -125.5q-94 0 -185.5 26.5t-136.5 52.5zM168 946q0 193 100.5 319 t296.5 126q94 0 186.5 -27t137.5 -53l45 -27l-62 -151q-141 96 -303 96q-109 0 -166 -82t-57 -211q0 -47 10 -109l107 -573q20 -102 20 -209q0 -135 -51 -209l-160 23q35 82 35 188q0 53 -10 115l-117 649q-12 67 -12 135z" /> +<glyph unicode="¨" horiz-adv-x="1052" d="M135 1282q0 70 41 109t112.5 39t112.5 -39t41 -109t-41 -107.5t-112.5 -37.5t-112.5 37.5t-41 107.5zM610 1282q0 70 41 109t113 39t113 -39t41 -109t-41 -107.5t-113 -37.5q-74 0 -114 37.5t-40 107.5z" /> +<glyph unicode="©" horiz-adv-x="1556" d="M70 682q0 293 206.5 500t499.5 207t500 -207t207 -500t-207 -500t-500 -207t-499.5 207t-206.5 500zM190 682q0 -246 170 -421t416 -175q248 0 419 174t171 422t-171 422t-419 174q-246 0 -416 -175t-170 -421zM381 682q0 166 112.5 293t303.5 127q184 0 286 -113l11 -10 l-93 -143q-8 10 -23 26.5t-66.5 43t-108.5 26.5q-106 0 -163.5 -69.5t-57.5 -166.5q0 -106 61.5 -179t165.5 -73q131 4 225 99l56 -150q-10 -12 -31 -32.5t-97.5 -53.5t-166.5 -33q-180 0 -297 117t-117 291z" /> +<glyph unicode="ª" horiz-adv-x="813" d="M63 879q0 205 381 251v23q0 76 -73 76q-47 0 -102.5 -22.5t-88.5 -43.5l-30 -22l-48 159q14 10 40 24.5t112 39.5t178 25q137 0 191.5 -53.5t54.5 -161.5v-236q8 -63 74 -74l-56 -159q-170 0 -229 90q-70 -96 -186 -97q-98 0 -158 50.5t-60 130.5zM299 905 q0 -23 14.5 -37t36.5 -14q41 0 94 49v109q-145 -23 -145 -107z" /> +<glyph unicode="«" horiz-adv-x="1042" d="M25 510v8q31 25 206 225l177 203l157 -47l-284 -385l284 -385l-157 -47l-161 182l-107 121l-57 66q-26 29 -36 39t-22 20zM430 510v8q31 25 205 223l180 205l158 -47l-285 -385l285 -385l-158 -47l-163 182l-106 121l-58 66q-26 29 -36 39t-22 20z" /> +<glyph unicode="¬" horiz-adv-x="1155" d="M88 633v180h954v-586h-188v406h-766z" /> +<glyph unicode="­" horiz-adv-x="792" d="M102 442v170h588v-170h-588z" /> +<glyph unicode="®" horiz-adv-x="854" d="M72 1087.5q0 145.5 104.5 250t249.5 104.5t249.5 -104.5t104.5 -250t-104.5 -250t-249.5 -104.5t-249.5 104.5t-104.5 250zM152 1087.5q0 -112.5 82.5 -198.5t191.5 -86t192.5 86t83.5 198.5t-83.5 197.5t-192.5 85t-191.5 -85t-82.5 -197.5zM295 918v348h123 q143 0 143 -105q0 -61 -57 -94l110 -149h-110l-88 126h-21v-126h-100zM395 1110h29q39 0 39 45q0 43 -53 43h-15v-88z" /> +<glyph unicode="¯" horiz-adv-x="937" d="M188 1171v179h562v-179h-562z" /> +<glyph unicode="°" horiz-adv-x="630" d="M66 1144.5q0 102.5 72.5 174.5t177 72t177 -72t72.5 -174.5t-72.5 -174t-177 -71.5t-177 71.5t-72.5 174zM188 1145q0 -55 37 -92t90.5 -37t89 37t35.5 92t-35.5 91t-89 36t-90.5 -36t-37 -91z" /> +<glyph unicode="±" horiz-adv-x="1064" d="M100 616v183h338v344h193v-344h330v-183h-330v-323h-193v323h-338zM121 0v182h829v-182h-829z" /> +<glyph unicode="²" horiz-adv-x="724" d="M49 1499q12 12 36 30.5t98.5 50.5t152.5 32q129 0 213 -72t84 -188q0 -100 -66.5 -193.5t-204.5 -216.5h308v-172h-598l-19 139l70 62l74 65l62 59q44 42 62.5 64.5t43 56t34 61.5t9.5 52q0 82 -103 82q-39 0 -74.5 -14.5t-50.5 -28.5l-16 -14z" /> +<glyph unicode="³" horiz-adv-x="692" d="M33 836l96 155q74 -55 162 -55q49 0 75.5 22.5t26.5 59.5q0 76 -127 76h-80v168q170 8 170 100q0 61 -75 61q-68 0 -129 -45l-95 144q14 10 38 25.5t97.5 40t147.5 24.5q123 0 190.5 -60.5t67.5 -144.5q0 -70 -45 -127t-98 -78q82 -16 131 -67.5t49 -122.5 q0 -102 -95.5 -181t-236.5 -79q-70 0 -137.5 21.5t-99.5 41.5z" /> +<glyph unicode="´" horiz-adv-x="1095" d="M291 1124l213 332h280l-335 -414z" /> +<glyph unicode="µ" horiz-adv-x="1234" d="M121 -442q20 199 20 362v1018h308v-545q0 -86 18 -119.5t57 -33.5q78 0 195 104v594h309v-623q0 -84 22.5 -103t110.5 -19v-207q-96 -10 -151 -11q-248 0 -277 148q-152 -147 -332 -148q-29 0 -41 2q8 -86 38 -235.5t30 -183.5h-307z" /> +<glyph unicode="μ" horiz-adv-x="1234" d="M121 -442q20 199 20 362v1018h308v-545q0 -86 18 -119.5t57 -33.5q78 0 195 104v594h309v-623q0 -84 22.5 -103t110.5 -19v-207q-96 -10 -151 -11q-248 0 -277 148q-152 -147 -332 -148q-29 0 -41 2q8 -86 38 -235.5t30 -183.5h-307z" /> +<glyph unicode="¶" horiz-adv-x="1394" d="M59 864q0 203 155 352.5t431 149.5h660v-147h-152v-1219h-158v1219h-153v-1260q0 -444 -391 -444l-31 159q133 0 193.5 74t60.5 242v377h-19q-291 0 -443.5 145t-152.5 352z" /> +<glyph unicode="·" horiz-adv-x="538" d="M92 524.5q0 71.5 52.5 124.5t123.5 53q74 0 127.5 -53t53.5 -124.5t-53.5 -124t-127.5 -52.5q-72 0 -124 52.5t-52 124z" /> +<glyph unicode="¸" horiz-adv-x="1052" d="M324 -422l51 123q74 -59 164 -59q41 0 66.5 13t25.5 33.5t-28 39t-60.5 31t-60 38t-27.5 60.5q0 37 30 92l27 51h137l-20 -41q-16 -43 -17 -49q0 -20 29 -35.5t63.5 -28t63.5 -46t29 -85.5q0 -88 -71 -144t-187 -56q-133 0 -215 63z" /> +<glyph unicode="¹" horiz-adv-x="681" d="M61 770v164h199v500h-182v163h403v-663h178v-164h-598z" /> +<glyph unicode="º" horiz-adv-x="892" d="M63 1042q0 139 95.5 243t287.5 104q186 0 284.5 -98.5t98.5 -235.5t-95 -247t-290 -110q-184 0 -282.5 100.5t-98.5 243.5zM307 1047q0 -74 37 -131.5t102 -57.5q59 0 99.5 50t40.5 130q0 76 -36 133.5t-99 57.5q-59 0 -101.5 -51t-42.5 -131z" /> +<glyph unicode="»" horiz-adv-x="1042" d="M72 129l282 385l-282 385l157 47q348 -397 369 -416q6 -6 14 -12v-8q-12 -10 -22 -20.5l-36 -38.5l-57 -66l-107 -121l-161 -182zM477 129l285 385l-285 385l156 47l184 -209q172 -195 203 -219v-8q-12 -10 -22.5 -20.5t-35.5 -38.5l-59 -66l-107 -121l-163 -182z" /> +<glyph unicode="¼" horiz-adv-x="1777" d="M86 535v163h199v500h-183v164h404v-664h178v-163h-598zM475 0l819 1423l144 -65l-781 -1358h-182zM1024 319l307 510h275v-499h106v-164h-106v-166h-213v166h-349zM1200 330h193v315z" /> +<glyph unicode="½" horiz-adv-x="1841" d="M84 535v163h199v500h-183v164h404v-664h178v-163h-598zM535 0l819 1423l143 -65l-780 -1358h-182zM1153 729q12 12 35.5 30.5t98.5 50.5t153 32q129 0 213 -72t84 -188q0 -100 -66.5 -193.5t-204.5 -216.5h308v-172h-598l-19 139l70 62l73 65l63 59q44 42 62.5 64.5 t43 56t33.5 61.5t9 52q0 82 -102 82q-39 0 -75 -14.5t-52 -28.5l-14 -14z" /> +<glyph unicode="¾" horiz-adv-x="1812" d="M66 600l96 156q74 -55 162 -56q49 0 75.5 22.5t26.5 59.5q0 76 -127 76h-80v168q170 8 170 100q0 61 -76 62q-68 0 -129 -45l-94 143q14 10 38 25.5t97.5 40t147.5 24.5q123 0 190.5 -60.5t67.5 -144.5q0 -70 -45 -127t-99 -77q82 -16 131.5 -67.5t49.5 -123.5 q0 -102 -95.5 -181t-236.5 -79q-70 0 -137.5 20.5t-100.5 41.5zM508 0l819 1423l143 -65l-780 -1358h-182zM1057 319l307 510h274v-499h107v-164h-107v-166h-213v166h-348zM1233 330h192v315z" /> +<glyph unicode="¿" horiz-adv-x="813" d="M66 -51q0 63 46 130.5t101 116t101 116t46 130.5h250q2 -23 2 -34q0 -70 -32.5 -139.5t-72.5 -113.5t-73 -89.5t-33 -71.5q0 -55 85 -115.5t169 -93.5l86 -33l-69 -270q-12 4 -34 10t-85.5 29.5t-120.5 49.5t-126.5 66.5t-120 86t-85 105t-34.5 120.5zM303 786 q0 72 52.5 124.5t126 52.5t124.5 -52.5t51 -124.5q0 -76 -51 -128t-124.5 -52t-126 52t-52.5 128z" /> +<glyph unicode="À" horiz-adv-x="1320" d="M2 0l508 1376h301l508 -1376h-322l-86 246h-510l-86 -246h-313zM365 1583l75 207l471 -195l-59 -155zM494 512h325l-164 463z" /> +<glyph unicode="Á" horiz-adv-x="1320" d="M2 0l508 1376h301l508 -1376h-322l-86 246h-510l-86 -246h-313zM401 1595l471 195l74 -207l-487 -143zM494 512h325l-164 463z" /> +<glyph unicode="Â" horiz-adv-x="1320" d="M2 0l508 1376h301l508 -1376h-322l-86 246h-510l-86 -246h-313zM281 1565l258 219h235l256 -219l-156 -95l-221 168l-219 -168zM494 512h325l-164 463z" /> +<glyph unicode="Ã" horiz-adv-x="1320" d="M2 0l508 1376h301l508 -1376h-322l-86 246h-510l-86 -246h-313zM258 1528q0 39 8 75.5t29.5 79.5t71 69t122.5 26q80 0 146.5 -33t112 -64.5t75.5 -31.5q59 0 60 96l-2 27h174q2 -14 2 -41q0 -39 -8.5 -76t-30 -82t-73.5 -72.5t-126 -27.5q-66 0 -118 20t-80.5 45 t-62.5 45.5t-62 20.5q-63 0 -64 -95l2 -28h-174q-2 18 -2 47zM494 512h325l-164 463z" /> +<glyph unicode="Ä" horiz-adv-x="1320" d="M2 0l508 1376h301l508 -1376h-322l-86 246h-510l-86 -246h-313zM227 1628.5q0 69.5 44 111.5t116 42t116 -42t44 -111.5t-44 -110.5t-116 -41t-116 41t-44 110.5zM494 512h325l-164 463zM764 1628.5q0 69.5 44 111.5t115.5 42t115.5 -42t44 -111.5t-44 -110.5t-115.5 -41 t-115.5 41t-44 110.5z" /> +<glyph unicode="Å" horiz-adv-x="1320" d="M2 0l508 1376h301l508 -1376h-322l-86 246h-510l-86 -246h-313zM440 1622q0 68 54.5 115t161 47t159.5 -47t53 -115q0 -78 -52 -127t-160.5 -49t-162 49t-53.5 127zM494 512h325l-164 463zM565 1620q0 -84 90 -84q43 0 68 22.5t25 61.5q0 29 -25 51.5t-68 22.5 q-45 0 -67.5 -22.5t-22.5 -51.5z" /> +<glyph unicode="Æ" horiz-adv-x="1886" d="M-31 0l768 1366h1059v-264h-573v-277h454v-268h-454v-293h602v-264h-920v336h-416l-182 -336h-338zM635 602h270v496z" /> +<glyph unicode="Ç" horiz-adv-x="1384" d="M72 653q0 317 212 527.5t566 210.5q295 0 471 -103l12 -8l-116 -264q-14 10 -42 26.5t-125.5 44t-207.5 27.5q-203 0 -327 -115.5t-124 -316.5q0 -207 129 -318.5t314 -111.5q111 0 209 29.5t141 58.5l43 31l129 -230q-6 -6 -19.5 -17t-59.5 -39t-101.5 -49.5t-146.5 -40 t-191 -20.5l-9 -16q-16 -43 -16 -49q0 -20 28.5 -35.5t63.5 -28t63.5 -46t28.5 -85.5q0 -88 -70.5 -144t-187.5 -56q-133 0 -215 63l51 123q74 -59 164 -59q41 0 66.5 13t25.5 33.5t-27.5 39t-60 31t-60.5 38t-28 60.5q0 37 31 92l16 33q-276 31 -453 205.5t-177 465.5z" /> +<glyph unicode="È" horiz-adv-x="1134" d="M154 0v1366h893v-264h-576v-277h455v-268h-455v-293h602v-264h-919zM317 1583l76 207l471 -195l-59 -155z" /> +<glyph unicode="É" horiz-adv-x="1134" d="M154 0v1366h893v-264h-576v-277h455v-268h-455v-293h602v-264h-919zM354 1595l471 195l74 -207l-487 -143z" /> +<glyph unicode="Ê" horiz-adv-x="1134" d="M154 0v1366h893v-264h-576v-277h455v-268h-455v-293h602v-264h-919zM233 1565l259 219h235l256 -219l-156 -95l-221 168l-219 -168z" /> +<glyph unicode="Ë" horiz-adv-x="1134" d="M154 0v1366h893v-264h-576v-277h455v-268h-455v-293h602v-264h-919zM180 1628.5q0 69.5 44 111.5t116 42t116 -42t44 -111.5t-44 -110.5t-116 -41t-116 41t-44 110.5zM717 1628.5q0 69.5 44 111.5t115.5 42t115.5 -42t44 -111.5t-44 -110.5t-115.5 -41t-115.5 41 t-44 110.5z" /> +<glyph unicode="Ì" horiz-adv-x="626" d="M27 1583l75 207l471 -195l-59 -155zM154 0v1366h317v-1366h-317z" /> +<glyph unicode="Í" horiz-adv-x="626" d="M63 1595l472 195l73 -207l-487 -143zM154 0v1366h317v-1366h-317z" /> +<glyph unicode="Î" horiz-adv-x="626" d="M-57 1565l258 219h235l256 -219l-155 -95l-222 168l-219 -168zM154 0v1366h317v-1366h-317z" /> +<glyph unicode="Ï" horiz-adv-x="626" d="M-72 1634.5q0 69.5 41 108.5t113 39t113 -39t41 -108.5t-41 -107.5t-113 -38t-113 38t-41 107.5zM154 0v1366h317v-1366h-317zM403 1634.5q0 69.5 41 108.5t113 39t113 -39t41 -108.5t-41 -107.5t-113 -38q-74 0 -114 38t-40 107.5z" /> +<glyph unicode="Ð" horiz-adv-x="1533" d="M45 575v238h148v553h524q143 0 271 -36t237.5 -111.5t173 -207.5t63.5 -306q0 -336 -225 -520.5t-598 -184.5h-446v575h-148zM508 264h110q262 0 389.5 119t127.5 313q0 184 -114 295t-333 111h-180v-289h299v-238h-299v-311z" /> +<glyph unicode="Ñ" horiz-adv-x="1529" d="M154 0v1366h321l590 -874v874h311v-1366h-325l-586 874v-874h-311zM367 1528q0 39 8 75.5t29.5 79.5t70.5 69t123 26q80 0 146.5 -33t111.5 -64.5t76 -31.5q59 0 59 96l-2 27h174q2 -14 2 -41q0 -39 -8 -76t-29.5 -82t-74 -72.5t-125.5 -27.5q-63 0 -116.5 20t-82.5 45 t-61.5 45.5t-63.5 20.5q-63 0 -63 -95l2 -28h-174q-2 18 -2 47z" /> +<glyph unicode="Ò" d="M66 680q0 182 85 341t262 264.5t414 105.5q342 0 549 -198t207 -484q0 -295 -215 -514.5t-559 -219.5q-225 0 -397 100.5t-259 259.5t-87 345zM395 686q0 -174 110.5 -309t309.5 -135t317.5 133t118.5 317q0 178 -112.5 305t-313 127t-315.5 -128t-115 -310zM532 1583 l76 207l471 -195l-59 -155z" /> +<glyph unicode="Ó" d="M66 680q0 182 85 341t262 264.5t414 105.5q342 0 549 -198t207 -484q0 -295 -215 -514.5t-559 -219.5q-225 0 -397 100.5t-259 259.5t-87 345zM395 686q0 -174 110.5 -309t309.5 -135t317.5 133t118.5 317q0 178 -112.5 305t-313 127t-315.5 -128t-115 -310zM569 1595 l471 195l74 -207l-487 -143z" /> +<glyph unicode="Ô" d="M66 680q0 182 85 341t262 264.5t414 105.5q342 0 549 -198t207 -484q0 -295 -215 -514.5t-559 -219.5q-225 0 -397 100.5t-259 259.5t-87 345zM395 686q0 -174 110.5 -309t309.5 -135t317.5 133t118.5 317q0 178 -112.5 305t-313 127t-315.5 -128t-115 -310zM449 1565 l258 219h235l256 -219l-156 -95l-221 168l-219 -168z" /> +<glyph unicode="Õ" d="M66 680q0 182 85 341t262 264.5t414 105.5q342 0 549 -198t207 -484q0 -295 -215 -514.5t-559 -219.5q-225 0 -397 100.5t-259 259.5t-87 345zM395 686q0 -174 110.5 -309t309.5 -135t317.5 133t118.5 317q0 178 -112.5 305t-313 127t-315.5 -128t-115 -310zM426 1528 q0 39 8 75.5t29.5 79.5t71 69t122.5 26q80 0 146.5 -33t112 -64.5t75.5 -31.5q59 0 60 96l-2 27h174q2 -14 2 -41q0 -39 -8.5 -76t-30 -82t-73.5 -72.5t-126 -27.5q-66 0 -118 20t-80.5 45t-62.5 45.5t-62 20.5q-63 0 -64 -95l2 -28h-174q-2 18 -2 47z" /> +<glyph unicode="Ö" d="M66 680q0 182 85 341t262 264.5t414 105.5q342 0 549 -198t207 -484q0 -295 -215 -514.5t-559 -219.5q-225 0 -397 100.5t-259 259.5t-87 345zM395 686q0 -174 110.5 -309t309.5 -135t317.5 133t118.5 317q0 178 -112.5 305t-313 127t-315.5 -128t-115 -310zM395 1628.5 q0 69.5 44 111.5t116 42t116 -42t44 -111.5t-44 -110.5t-116 -41t-116 41t-44 110.5zM932 1628.5q0 69.5 44 111.5t115.5 42t115.5 -42t44 -111.5t-44 -110.5t-115.5 -41t-115.5 41t-44 110.5z" /> +<glyph unicode="×" horiz-adv-x="1064" d="M66 168l344 354l-344 355l122 124l344 -354l345 354l122 -124l-346 -355l346 -354l-125 -125l-342 352l-342 -352z" /> +<glyph unicode="Ø" d="M66 680q0 182 85 341t262 264.5t414 105.5q209 0 375 -80l88 116h176l-143 -190q125 -94 192.5 -232.5t67.5 -295.5q0 -295 -215 -514.5t-559 -219.5q-209 0 -379 88l-96 -124h-178l155 202q-119 98 -182 239.5t-63 299.5zM395 686q0 -176 103 -299l528 692 q-96 45 -201 45q-201 0 -315.5 -128t-114.5 -310zM604 293q98 -51 211 -51q199 0 317.5 133t118.5 317.5t-112 302.5z" /> +<glyph unicode="Ù" horiz-adv-x="1449" d="M139 522v844h318v-819q0 -305 270 -305q127 0 199.5 78.5t72.5 218.5v827h316v-815q0 -270 -167 -423t-423 -153q-262 0 -424 133t-162 414zM434 1583l76 207l471 -195l-59 -155z" /> +<glyph unicode="Ú" horiz-adv-x="1449" d="M139 522v844h318v-819q0 -305 270 -305q127 0 199.5 78.5t72.5 218.5v827h316v-815q0 -270 -167 -423t-423 -153q-262 0 -424 133t-162 414zM471 1595l471 195l74 -207l-488 -143z" /> +<glyph unicode="Û" horiz-adv-x="1449" d="M139 522v844h318v-819q0 -305 270 -305q127 0 199.5 78.5t72.5 218.5v827h316v-815q0 -270 -167 -423t-423 -153q-262 0 -424 133t-162 414zM350 1565l258 219h236l256 -219l-156 -95l-221 168l-219 -168z" /> +<glyph unicode="Ü" horiz-adv-x="1449" d="M139 522v844h318v-819q0 -305 270 -305q127 0 199.5 78.5t72.5 218.5v827h316v-815q0 -270 -167 -423t-423 -153q-262 0 -424 133t-162 414zM297 1628.5q0 69.5 44 111.5t115.5 42t115.5 -42t44 -111.5t-44 -110.5t-115.5 -41t-115.5 41t-44 110.5zM834 1628.5 q0 69.5 44 111.5t115.5 42t115.5 -42t44 -111.5t-44 -110.5t-115.5 -41t-115.5 41t-44 110.5z" /> +<glyph unicode="Ý" horiz-adv-x="1284" d="M-10 1366h372l279 -502l295 502h358l-493 -807v-559h-318v557zM383 1595l471 195l74 -207l-488 -143z" /> +<glyph unicode="Þ" horiz-adv-x="1218" d="M154 0v1366h317v-262h221q244 0 363 -110.5t119 -284.5q0 -199 -134.5 -314.5t-347.5 -115.5h-221v-279h-317zM471 547h172q201 0 201 147q0 70 -42 108t-159 38h-172v-293z" /> +<glyph unicode="ß" horiz-adv-x="1259" d="M37 723v170l145 49v68q0 231 122 357t351 126q193 0 309.5 -87t116.5 -235q0 -88 -45 -158.5t-89 -123.5t-44 -98q0 -41 34 -79t81 -71t94 -73t81 -104.5t34 -144.5q0 -154 -110.5 -249t-303.5 -95q-59 0 -112.5 9.5t-77.5 19.5l-25 10l39 238q61 -47 141 -47 q61 0 96 32.5t35 79.5q0 39 -28.5 72t-69.5 59.5t-81 59.5t-68.5 89t-28.5 128q0 68 24.5 122t55 86t55.5 82t25 109q0 147 -138 148q-84 0 -122.5 -59.5t-38.5 -194.5v-1018h-312v723h-145z" /> +<glyph unicode="à" horiz-adv-x="1034" d="M43 229q0 287 541 359v35q0 61 -24.5 89.5t-82.5 28.5q-156 0 -305 -110l-6 -4l-66 211q18 14 54 34.5t154 55.5t245 35q188 0 264 -75t76 -235v-329q0 -84 90 -97l16 -2l-86 -239q-211 -2 -292 133q-16 -29 -44 -57.5t-92.5 -57.5t-146.5 -29q-133 0 -214 70.5 t-81 183.5zM131 1456h283l215 -332l-162 -82zM354 258q0 -70 68 -70q82 0 162 101v139q-230 -35 -230 -170z" /> +<glyph unicode="á" horiz-adv-x="1034" d="M43 229q0 287 541 359v35q0 61 -24.5 89.5t-82.5 28.5q-156 0 -305 -110l-6 -4l-66 211q18 14 54 34.5t154 55.5t245 35q188 0 264 -75t76 -235v-329q0 -84 90 -97l16 -2l-86 -239q-211 -2 -292 133q-16 -29 -44 -57.5t-92.5 -57.5t-146.5 -29q-133 0 -214 70.5 t-81 183.5zM338 1124l213 332h280l-335 -414zM354 258q0 -70 68 -70q82 0 162 101v139q-230 -35 -230 -170z" /> +<glyph unicode="â" horiz-adv-x="1034" d="M43 229q0 287 541 359v35q0 61 -24.5 89.5t-82.5 28.5q-156 0 -305 -110l-6 -4l-66 211q18 14 54 34.5t154 55.5t245 35q188 0 264 -75t76 -235v-329q0 -84 90 -97l16 -2l-86 -239q-211 -2 -292 133q-16 -29 -44 -57.5t-92.5 -57.5t-146.5 -29q-133 0 -214 70.5 t-81 183.5zM156 1106l237 350h182l240 -354l-164 -62l-168 238l-168 -238zM354 258q0 -70 68 -70q82 0 162 101v139q-230 -35 -230 -170z" /> +<glyph unicode="ã" horiz-adv-x="1034" d="M43 229q0 287 541 359v35q0 61 -24.5 89.5t-82.5 28.5q-156 0 -305 -110l-6 -4l-66 211q18 14 54 34.5t154 55.5t245 35q188 0 264 -75t76 -235v-329q0 -84 90 -97l16 -2l-86 -239q-211 -2 -292 133q-16 -29 -44 -57.5t-92.5 -57.5t-146.5 -29q-133 0 -214 70.5 t-81 183.5zM106 1153q0 39 7.5 78t28 86t69.5 76.5t119 29.5q61 0 112.5 -23.5t79 -53t58 -53t55.5 -23.5q57 0 57 102l-2 37h184q2 -14 3 -35q0 -39 -7.5 -78t-29 -88t-71.5 -79.5t-122 -30.5q-61 0 -110.5 23.5t-75 53t-54 53t-55.5 23.5q-61 0 -61 -106l2 -31h-184 q-3 14 -3 39zM354 258q0 -70 68 -70q82 0 162 101v139q-230 -35 -230 -170z" /> +<glyph unicode="ä" horiz-adv-x="1034" d="M43 229q0 287 541 359v35q0 61 -24.5 89.5t-82.5 28.5q-156 0 -305 -110l-6 -4l-66 211q18 14 54 34.5t154 55.5t245 35q188 0 264 -75t76 -235v-329q0 -84 90 -97l16 -2l-86 -239q-211 -2 -292 133q-16 -29 -44 -57.5t-92.5 -57.5t-146.5 -29q-133 0 -214 70.5 t-81 183.5zM92 1282q0 70 41 109t112.5 39t112.5 -39t41 -109t-41 -107.5t-112.5 -37.5t-112.5 37.5t-41 107.5zM354 258q0 -70 68 -70q82 0 162 101v139q-230 -35 -230 -170zM567 1282q0 70 41 109t113 39t112.5 -39t40.5 -109t-40.5 -107.5t-112.5 -37.5q-74 0 -114 37.5 t-40 107.5z" /> +<glyph unicode="å" horiz-adv-x="1034" d="M43 229q0 287 541 359v35q0 61 -24.5 89.5t-82.5 28.5q-156 0 -305 -110l-6 -4l-66 211q18 14 54 34.5t154 55.5t245 35q188 0 264 -75t76 -235v-329q0 -84 90 -97l16 -2l-86 -239q-211 -2 -292 133q-16 -29 -44 -57.5t-92.5 -57.5t-146.5 -29q-133 0 -214 70.5 t-81 183.5zM264 1290q0 72 56.5 129.5t162.5 57.5q104 0 159.5 -57.5t55.5 -129.5q0 -74 -55 -135t-160 -61q-106 0 -162.5 61t-56.5 135zM354 258q0 -70 68 -70q82 0 162 101v139q-230 -35 -230 -170zM391 1288q0 -35 25.5 -61.5t66.5 -26.5t66.5 26.5t25.5 61.5 t-24.5 59.5t-67.5 24.5t-67.5 -24.5t-24.5 -59.5z" /> +<glyph unicode="æ" horiz-adv-x="1538" d="M43 225q0 264 545 332v43q0 80 -23.5 116t-93.5 36q-141 0 -301 -113l-4 -4l-66 203q20 14 57.5 34.5t148 55.5t216.5 35q178 0 254 -117q111 117 279 117q184 0 297.5 -119t115.5 -352l-161 -54l-414 -45q53 -197 237 -196q68 0 138.5 28.5t107.5 57.5l37 30l72 -209 q-18 -14 -51 -35.5t-138.5 -57.5t-214.5 -36q-246 0 -374 189q-41 -70 -131.5 -129.5t-225.5 -59.5q-141 0 -224 70.5t-83 179.5zM344 248q0 -35 22.5 -53.5t57.5 -18.5q63 0 115.5 58.5t52.5 144.5q-248 -20 -248 -131zM885 569l260 29q0 6 -1 16.5t-8.5 36t-17.5 45 t-33.5 36t-54.5 16.5q-59 0 -98 -47.5t-47 -131.5z" /> +<glyph unicode="ç" horiz-adv-x="970" d="M55 446q0 211 150.5 364t380.5 153q96 0 183 -22.5t128 -47.5l39 -23l-102 -221q-96 84 -211 84q-106 0 -178 -67.5t-72 -200.5q0 -123 63.5 -191.5t165.5 -68.5q61 0 121.5 23.5t89.5 45.5l29 23l94 -203q-12 -12 -34.5 -30.5t-108.5 -51t-191 -37.5l-8 -16 q-16 -43 -16 -49q0 -20 28.5 -35.5t63.5 -28t63.5 -46t28.5 -85.5q0 -88 -70.5 -144t-187.5 -56q-133 0 -215 63l51 123q74 -59 164 -59q41 0 66.5 13t25.5 33.5t-27.5 39t-60.5 31t-60.5 38t-27.5 60.5q0 37 31 92l18 35q-190 31 -302 158.5t-112 303.5z" /> +<glyph unicode="è" horiz-adv-x="1017" d="M59 465q0 211 131.5 354.5t341.5 143.5q186 0 299 -123t115 -363l-162 -45l-409 -53q53 -174 223 -174q139 0 285 108l4 4l80 -213q-18 -14 -52 -35.5t-141.5 -57.5t-216.5 -36q-236 0 -367 141.5t-131 348.5zM162 1456h282l215 -332l-161 -82zM360 541l261 34 q0 6 -1.5 17.5t-8.5 40.5t-17 50.5t-33.5 38.5t-54.5 17q-63 0 -101.5 -54t-44.5 -144z" /> +<glyph unicode="é" horiz-adv-x="1017" d="M59 465q0 211 131.5 354.5t341.5 143.5q186 0 299 -123t115 -363l-162 -45l-409 -53q53 -174 223 -174q139 0 285 108l4 4l80 -213q-18 -14 -52 -35.5t-141.5 -57.5t-216.5 -36q-236 0 -367 141.5t-131 348.5zM360 541l261 34q0 6 -1.5 17.5t-8.5 40.5t-17 50.5 t-33.5 38.5t-54.5 17q-63 0 -101.5 -54t-44.5 -144zM371 1124l213 332h280l-336 -414z" /> +<glyph unicode="ê" horiz-adv-x="1017" d="M59 465q0 211 131.5 354.5t341.5 143.5q186 0 299 -123t115 -363l-162 -45l-409 -53q53 -174 223 -174q139 0 285 108l4 4l80 -213q-18 -14 -52 -35.5t-141.5 -57.5t-216.5 -36q-236 0 -367 141.5t-131 348.5zM188 1106l238 350h182l240 -354l-164 -62l-168 238 l-168 -238zM360 541l261 34q0 6 -1.5 17.5t-8.5 40.5t-17 50.5t-33.5 38.5t-54.5 17q-63 0 -101.5 -54t-44.5 -144z" /> +<glyph unicode="ë" horiz-adv-x="1017" d="M59 465q0 211 131.5 354.5t341.5 143.5q186 0 299 -123t115 -363l-162 -45l-409 -53q53 -174 223 -174q139 0 285 108l4 4l80 -213q-18 -14 -52 -35.5t-141.5 -57.5t-216.5 -36q-236 0 -367 141.5t-131 348.5zM125 1282q0 70 41 109t112.5 39t112.5 -39t41 -109 t-41 -107.5t-112.5 -37.5t-112.5 37.5t-41 107.5zM360 541l261 34q0 6 -1.5 17.5t-8.5 40.5t-17 50.5t-33.5 38.5t-54.5 17q-63 0 -101.5 -54t-44.5 -144zM600 1282q0 70 41 109t112.5 39t112.5 -39t41 -109t-41 -107.5t-112 -37.5q-74 0 -114 37.5t-40 107.5z" /> +<glyph unicode="ì" horiz-adv-x="540" d="M-82 1456h283l215 -332l-162 -82zM115 0v938h311v-938h-311z" /> +<glyph unicode="í" horiz-adv-x="540" d="M115 0v938h311v-938h-311zM127 1124l213 332h281l-336 -414z" /> +<glyph unicode="î" horiz-adv-x="540" d="M-55 1106l237 350h183l239 -354l-164 -62l-168 238l-168 -238zM115 0v938h311v-938h-311z" /> +<glyph unicode="ï" horiz-adv-x="540" d="M-119 1282q0 70 41 109t112.5 39t112.5 -39t41 -109t-41 -107.5t-112.5 -37.5t-112.5 37.5t-41 107.5zM115 0v938h311v-938h-311zM356 1282q0 70 41 109t113 39t113 -39t41 -109t-41 -107.5t-113 -37.5q-74 0 -114 37.5t-40 107.5z" /> +<glyph unicode="ð" horiz-adv-x="1128" d="M57 442q0 203 127 362t332 159q25 0 48.5 -3.5t41 -7.5t31.5 -9t24.5 -10t16.5 -9t10 -6l4 -5q-68 133 -192 228l-277 -152l-71 137l192 107q-117 49 -231 74l59 219q233 -43 422 -156l303 166l70 -139l-236 -129q152 -129 236 -306.5t84 -381.5q0 -262 -137.5 -433.5 t-378.5 -171.5q-223 0 -350.5 135t-127.5 332zM354 461q0 -102 47.5 -184t141.5 -82q92 0 153.5 80.5t61.5 263.5q0 82 -42 142t-128 60q-102 0 -168 -78.5t-66 -201.5z" /> +<glyph unicode="ñ" horiz-adv-x="1103" d="M111 0v913l295 48v-168q147 170 333 170q262 0 262 -304v-659h-311v514q0 102 -12 141t-62 39q-82 0 -194 -116v-578h-311zM190 1153q0 39 7.5 78t28 86t69.5 76.5t119 29.5q61 0 112.5 -23.5t79 -53t58 -53t55.5 -23.5q57 0 57 102l-2 37h184q2 -14 3 -35 q0 -39 -7.5 -78t-29 -88t-71.5 -79.5t-122 -30.5q-61 0 -110.5 23.5t-75 53t-54 53t-55.5 23.5q-61 0 -61 -106l2 -31h-184q-3 14 -3 39z" /> +<glyph unicode="ò" horiz-adv-x="1171" d="M57 467q0 92 29 177t89.5 157.5t165.5 117t245 44.5q260 0 396 -139.5t136 -338.5q0 -88 -28.5 -173t-88 -162.5t-168 -126t-251.5 -48.5q-254 0 -389.5 142.5t-135.5 349.5zM238 1456h282l215 -332l-162 -82zM375 479q0 -113 56 -198.5t153 -85.5q90 0 153.5 74.5 t63.5 191.5q0 111 -56.5 195.5t-156.5 84.5q-90 0 -151.5 -72.5t-61.5 -189.5z" /> +<glyph unicode="ó" horiz-adv-x="1171" d="M57 467q0 92 29 177t89.5 157.5t165.5 117t245 44.5q260 0 396 -139.5t136 -338.5q0 -88 -28.5 -173t-88 -162.5t-168 -126t-251.5 -48.5q-254 0 -389.5 142.5t-135.5 349.5zM375 479q0 -113 56 -198.5t153 -85.5q90 0 153.5 74.5t63.5 191.5q0 111 -56.5 195.5 t-156.5 84.5q-90 0 -151.5 -72.5t-61.5 -189.5zM444 1124l213 332h281l-336 -414z" /> +<glyph unicode="ô" horiz-adv-x="1171" d="M57 467q0 92 29 177t89.5 157.5t165.5 117t245 44.5q260 0 396 -139.5t136 -338.5q0 -88 -28.5 -173t-88 -162.5t-168 -126t-251.5 -48.5q-254 0 -389.5 142.5t-135.5 349.5zM260 1106l238 350h182l240 -354l-164 -62l-168 238l-168 -238zM375 479q0 -113 56 -198.5 t153 -85.5q90 0 153.5 74.5t63.5 191.5q0 111 -56.5 195.5t-156.5 84.5q-90 0 -151.5 -72.5t-61.5 -189.5z" /> +<glyph unicode="õ" horiz-adv-x="1171" d="M57 467q0 92 29 177t89.5 157.5t165.5 117t245 44.5q260 0 396 -139.5t136 -338.5q0 -88 -28.5 -173t-88 -162.5t-168 -126t-251.5 -48.5q-254 0 -389.5 142.5t-135.5 349.5zM211 1153q0 39 7 78t27.5 86t70 76.5t118.5 29.5q61 0 112.5 -23.5t79 -53t58.5 -53t55 -23.5 q57 0 58 102l-2 37h184q2 -14 2 -35q0 -39 -7 -78t-28.5 -88t-72 -79.5t-121.5 -30.5q-61 0 -110.5 23.5t-75 53t-54.5 53t-55 23.5q-61 0 -62 -106l2 -31h-184q-2 14 -2 39zM375 479q0 -113 56 -198.5t153 -85.5q90 0 153.5 74.5t63.5 191.5q0 111 -56.5 195.5t-156.5 84.5 q-90 0 -151.5 -72.5t-61.5 -189.5z" /> +<glyph unicode="ö" horiz-adv-x="1171" d="M57 467q0 92 29 177t89.5 157.5t165.5 117t245 44.5q260 0 396 -139.5t136 -338.5q0 -88 -28.5 -173t-88 -162.5t-168 -126t-251.5 -48.5q-254 0 -389.5 142.5t-135.5 349.5zM197 1282q0 70 41 109t112.5 39t112.5 -39t41 -109t-41 -107.5t-112.5 -37.5t-112.5 37.5 t-41 107.5zM375 479q0 -113 56 -198.5t153 -85.5q90 0 153.5 74.5t63.5 191.5q0 111 -56.5 195.5t-156.5 84.5q-90 0 -151.5 -72.5t-61.5 -189.5zM672 1282q0 70 41 109t112.5 39t112.5 -39t41 -109t-41 -107.5t-113 -37.5q-74 0 -113.5 37.5t-39.5 107.5z" /> +<glyph unicode="÷" horiz-adv-x="1064" d="M74 430v182h917v-182h-917zM383 143q0 66 43 112t106 46q66 0 110 -46t44 -112q0 -63 -44 -107t-110 -44q-63 0 -106 44t-43 107zM383 899.5q0 63.5 43 108.5t106 45q66 0 110 -45t44 -108.5t-44 -109t-110 -45.5q-63 0 -106 45.5t-43 109z" /> +<glyph unicode="ø" horiz-adv-x="1171" d="M57 467q0 94 29 178t89.5 158t167 117t247.5 43q135 0 244 -45l61 81h152l-107 -143q178 -133 178 -367q0 -90 -28.5 -176t-88 -163.5t-168 -126t-251.5 -48.5q-150 0 -258 52l-68 -88h-152l115 153q-162 135 -162 375zM375 485q0 -84 24 -149l283 379q-43 27 -96 26 q-88 0 -149.5 -73.5t-61.5 -182.5zM475 231q51 -37 113 -36q86 0 149.5 75.5t63.5 192.5q0 86 -37 158z" /> +<glyph unicode="ù" horiz-adv-x="1110" d="M104 258v680h312v-557q0 -76 17.5 -108.5t60.5 -32.5q78 0 188 104v594h311v-653l41 -279l-299 -26q-16 84 -26 151q-160 -156 -342 -156q-117 0 -190 71t-73 212zM197 1456h282l215 -332l-162 -82z" /> +<glyph unicode="ú" horiz-adv-x="1110" d="M104 258v680h312v-557q0 -76 17.5 -108.5t60.5 -32.5q78 0 188 104v594h311v-653l41 -279l-299 -26q-16 84 -26 151q-160 -156 -342 -156q-117 0 -190 71t-73 212zM403 1124l213 332h281l-336 -414z" /> +<glyph unicode="û" horiz-adv-x="1110" d="M104 258v680h312v-557q0 -76 17.5 -108.5t60.5 -32.5q78 0 188 104v594h311v-653l41 -279l-299 -26q-16 84 -26 151q-160 -156 -342 -156q-117 0 -190 71t-73 212zM219 1106l238 350h182l240 -354l-164 -62l-168 238l-168 -238z" /> +<glyph unicode="ü" horiz-adv-x="1110" d="M104 258v680h312v-557q0 -76 17.5 -108.5t60.5 -32.5q78 0 188 104v594h311v-653l41 -279l-299 -26q-16 84 -26 151q-160 -156 -342 -156q-117 0 -190 71t-73 212zM156 1282q0 70 41 109t112.5 39t112.5 -39t41 -109t-41 -107.5t-112.5 -37.5t-112.5 37.5t-41 107.5z M631 1282q0 70 41 109t112.5 39t112.5 -39t41 -109t-41 -107.5t-113 -37.5q-74 0 -113.5 37.5t-39.5 107.5z" /> +<glyph unicode="ý" horiz-adv-x="995" d="M-4 938h317l191 -592l184 592h309l-374 -1004q-59 -158 -199.5 -281.5t-323.5 -137.5l-92 239q106 8 200.5 64.5t127.5 136.5l22 53zM356 1124l213 332h281l-336 -414z" /> +<glyph unicode="þ" horiz-adv-x="1120" d="M115 -485v1908l311 50v-658q74 147 246 148q180 0 285.5 -133.5t105.5 -327.5q0 -215 -123 -371t-348 -156q-115 0 -166 31v-442zM426 266q0 -72 115 -71q88 0 145 71.5t57 214.5q0 117 -36.5 182.5t-102.5 65.5q-94 0 -178 -127v-336z" /> +<glyph unicode="ÿ" horiz-adv-x="995" d="M-4 938h317l191 -592l184 592h309l-374 -1004q-59 -158 -199.5 -281.5t-323.5 -137.5l-92 239q106 8 200.5 64.5t127.5 136.5l22 53zM109 1282q0 70 40.5 109t112.5 39t113 -39t41 -109t-41 -107.5t-113 -37.5t-112.5 37.5t-40.5 107.5zM584 1282q0 70 41 109t112.5 39 t112.5 -39t41 -109t-41 -107.5t-113 -37.5q-74 0 -113.5 37.5t-39.5 107.5z" /> +<glyph unicode="Œ" horiz-adv-x="2035" d="M66 680q0 133 51 260t143 227.5t237.5 162t317.5 61.5q143 0 256 -25h877v-264h-574v-277h455v-268h-455v-293h600v-264h-917q-147 -25 -262 -25q-324 0 -526.5 208t-202.5 497zM395 686q0 -174 111.5 -309t292.5 -135q166 0 258 30v811q-109 41 -244 41 q-188 0 -303 -130t-115 -308z" /> +<glyph unicode="œ" horiz-adv-x="1751" d="M57 469q0 197 136.5 345.5t390.5 148.5q236 0 366 -162q125 162 324 162q186 0 295.5 -130.5t111.5 -363.5l-159 -47l-398 -51q23 -82 80.5 -128t136.5 -46q68 0 138.5 28.5t107.5 57.5l37 30l74 -209q-18 -14 -52 -35.5t-137.5 -57.5t-208.5 -36q-223 0 -356 152 q-133 -152 -373 -152q-246 0 -380 143.5t-134 350.5zM375 479q0 -113 56 -198.5t153 -85.5q86 0 145 74.5t59 191.5q0 111 -53 195.5t-147 84.5q-90 0 -151.5 -72.5t-61.5 -189.5zM1104 541l264 34q0 6 -1 17.5t-9 40.5t-20.5 50.5t-37 38.5t-59.5 17q-57 0 -94 -54 t-43 -144z" /> +<glyph unicode="Ÿ" horiz-adv-x="1284" d="M-10 1366h372l279 -502l295 502h358l-493 -807v-559h-318v557zM209 1628.5q0 69.5 44 111.5t115.5 42t115.5 -42t44 -111.5t-44 -110.5t-115.5 -41t-115.5 41t-44 110.5zM745 1628.5q0 69.5 44.5 111.5t116 42t115.5 -42t44 -111.5t-44 -110.5t-115.5 -41t-116 41 t-44.5 110.5z" /> +<glyph unicode="ˆ" horiz-adv-x="1052" d="M199 1106l237 350h182l240 -354l-164 -62l-168 238l-168 -238z" /> +<glyph unicode="˜" horiz-adv-x="1052" d="M156 1153q0 39 7 78t27.5 86t69.5 76.5t119 29.5q61 0 112.5 -23.5t79 -53t58 -53t55.5 -23.5q57 0 57 102l-2 37h185q2 -14 2 -35q0 -39 -7.5 -78t-29 -88t-71.5 -79.5t-122 -30.5q-61 0 -110 23.5t-75 53t-54.5 53t-55.5 23.5q-61 0 -61 -106l2 -31h-184q-2 14 -2 39z " /> +<glyph unicode=" " horiz-adv-x="895" /> +<glyph unicode=" " horiz-adv-x="1790" /> +<glyph unicode=" " horiz-adv-x="895" /> +<glyph unicode=" " horiz-adv-x="1790" /> +<glyph unicode=" " horiz-adv-x="596" /> +<glyph unicode=" " horiz-adv-x="447" /> +<glyph unicode=" " horiz-adv-x="298" /> +<glyph unicode=" " horiz-adv-x="298" /> +<glyph unicode=" " horiz-adv-x="223" /> +<glyph unicode=" " horiz-adv-x="358" /> +<glyph unicode=" " horiz-adv-x="99" /> +<glyph unicode="‐" horiz-adv-x="792" d="M102 442v170h588v-170h-588z" /> +<glyph unicode="‑" horiz-adv-x="792" d="M102 442v170h588v-170h-588z" /> +<glyph unicode="‒" horiz-adv-x="792" d="M102 442v170h588v-170h-588z" /> +<glyph unicode="–" horiz-adv-x="1044" d="M102 436v182h840v-182h-840z" /> +<glyph unicode="—" horiz-adv-x="1843" d="M102 436v182h1639v-182h-1639z" /> +<glyph unicode="‘" horiz-adv-x="473" d="M74 1130q0 217 239 408l97 -104q-141 -109 -142 -232q0 -51 30 -103t118 -155l-223 -121q-119 166 -119 307z" /> +<glyph unicode="’" horiz-adv-x="450" d="M49 1417l221 121q123 -168 123 -307q0 -215 -243 -408l-93 105q139 111 140 229q0 53 -30 104.5t-118 155.5z" /> +<glyph unicode="‚" horiz-adv-x="499" d="M86 225l213 121q119 -166 119 -309q0 -215 -240 -408l-92 107q135 109 135 229q0 55 -26.5 108.5t-108.5 151.5z" /> +<glyph unicode="“" horiz-adv-x="897" d="M74 1133q0 215 239 405l97 -104q-141 -109 -142 -230q0 -59 27 -110.5t121 -149.5l-223 -121q-119 167 -119 310zM498 1133q0 215 241 405l95 -104q-139 -109 -140 -230q0 -59 27 -110.5t121 -149.5l-224 -121q-120 165 -120 310z" /> +<glyph unicode="”" horiz-adv-x="876" d="M49 1417l221 121q123 -168 123 -307q0 -215 -243 -408l-93 105q139 111 140 229q0 53 -30 104.5t-118 155.5zM475 1417l221 121q121 -168 121 -307q0 -215 -244 -408l-92 105q141 111 142 229q0 53 -30 103.5t-118 156.5z" /> +<glyph unicode="„" horiz-adv-x="925" d="M86 225l213 121q119 -166 119 -309q0 -215 -240 -408l-92 107q135 109 135 229q0 55 -26.5 108.5t-108.5 151.5zM510 225l213 121q119 -162 119 -309q0 -217 -240 -408l-92 107q137 106 137 229q0 55 -27.5 108.5t-109.5 151.5z" /> +<glyph unicode="•" horiz-adv-x="864" d="M106 524.5q0 137.5 94.5 231.5t231.5 94q139 0 232.5 -93t93.5 -232.5t-93.5 -232.5t-232.5 -93q-137 0 -231.5 94t-94.5 231.5z" /> +<glyph unicode="…" horiz-adv-x="1695" d="M90 152q0 74 52.5 127t123.5 53q74 0 126 -53.5t52 -126.5q0 -72 -52 -124.5t-126 -52.5q-72 0 -124 52.5t-52 124.5zM670 152q0 74 52 127t124 53q74 0 127 -53.5t53 -126.5q0 -72 -53 -124.5t-127 -52.5q-72 0 -124 52.5t-52 124.5zM1251 152q0 74 52.5 127t123.5 53 q74 0 126.5 -53.5t52.5 -127t-51.5 -125t-127.5 -51.5q-72 0 -124 52.5t-52 124.5z" /> +<glyph unicode=" " horiz-adv-x="358" /> +<glyph unicode="‹" horiz-adv-x="634" d="M25 510v8q31 25 206 225l177 203l157 -47l-284 -385l284 -385l-157 -47l-161 182l-107 121l-57 66q-26 29 -36 39t-22 20z" /> +<glyph unicode="›" horiz-adv-x="634" d="M72 129l282 385l-282 385l157 47q348 -397 369 -416q6 -6 14 -12v-8q-12 -10 -22 -20.5l-36 -38.5l-57 -66l-107 -121l-161 -182z" /> +<glyph unicode=" " horiz-adv-x="447" /> +<glyph unicode="€" horiz-adv-x="1163" d="M68 643v127h135q61 182 206.5 293t346.5 111q80 0 161.5 -18.5t122.5 -37.5l41 -18l-73 -228q-109 72 -238 72q-182 0 -248 -174h455l-37 -127h-448q-2 -23 -3 -68q0 -55 5 -79h405l-37 -127h-338q72 -164 252 -164q51 0 110.5 14t94.5 27l35 14l49 -215 q-131 -70 -317 -70q-209 0 -354.5 106.5t-198.5 287.5h-125v127h104q-4 37 -4 59q0 45 6 88h-108z" /> +<glyph unicode="™" horiz-adv-x="1476" d="M70 1247v119h510v-119h-179v-426h-153v426h-178zM666 821l20 545h219l111 -326l114 326h213l21 -545h-150l-14 381l-135 -381h-100l-138 383l-10 -383h-151z" /> +<glyph unicode="" horiz-adv-x="940" d="M0 940h940v-940h-940v940z" /> +<glyph unicode="fi" horiz-adv-x="1193" d="M37 723v170l145 49v45q0 246 143.5 387.5t364.5 141.5q82 0 158 -20.5t110 -41.5l35 -18l-100 -213q-94 63 -203 63q-197 0 -196 -274v-74h585v-938h-309v733h-276v-733h-312v723h-145z" /> +<glyph unicode="fl" horiz-adv-x="1232" d="M37 723v170l145 49v45q0 246 143.5 387.5t364.5 141.5q156 0 279 -68l149 25v-1473h-307v1257q-66 29 -121 29q-197 0 -196 -274v-74h190v-215h-190v-723h-312v723h-145z" /> +<glyph unicode="ffi" horiz-adv-x="1845" d="M37 723v170l145 49v16q0 238 137.5 373t348.5 135q82 0 156.5 -22.5t103 -41t39.5 -28.5q135 141 354 142q82 0 156.5 -20.5t107.5 -41.5l35 -18l-98 -213q-86 63 -193 63q-182 0 -182 -254v-94h584v-938h-308v733h-276v-733h-309v733h-344v-733h-312v723h-145zM494 938 h344v70q0 80 16 157q-84 72 -178 72q-182 0 -182 -254v-45z" /> +<glyph unicode="ffl" horiz-adv-x="1886" d="M37 723v170l145 49v16q0 238 137.5 373t348.5 135q176 0 297 -90q129 139 346 140q156 0 274 -74l187 31v-1473h-310v1245q-74 41 -145 41q-170 0 -170 -244v-104h190v-215h-190v-723h-309v733h-344v-733h-312v723h-145zM494 938h344v82q0 86 16 145q-84 72 -178 72 q-182 0 -182 -254v-45z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansBlack-webfont.ttf b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansBlack-webfont.ttf new file mode 100755 index 0000000000000000000000000000000000000000..dd75879f10c52328758b7a0b67d0af7d950cdbea Binary files /dev/null and b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansBlack-webfont.ttf differ diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansBlack-webfont.woff b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansBlack-webfont.woff new file mode 100755 index 0000000000000000000000000000000000000000..537ba7898eb8431a9bc9a54aa9701d273ff29546 Binary files /dev/null and b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansBlack-webfont.woff differ diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansBold-webfont.eot b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansBold-webfont.eot new file mode 100755 index 0000000000000000000000000000000000000000..007016f5d8eeb02a321ba78ef96ca4bf57cc2a73 Binary files /dev/null and b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansBold-webfont.eot differ diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansBold-webfont.svg b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansBold-webfont.svg new file mode 100755 index 0000000000000000000000000000000000000000..d21027074de70f8ebc829752d4546b93b07f9eab --- /dev/null +++ b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansBold-webfont.svg @@ -0,0 +1,244 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Fontspring. +</metadata> +<defs> +<font id="webfontHPO6NoNQ" horiz-adv-x="1640" > +<font-face units-per-em="2048" ascent="1536" descent="-512" /> +<missing-glyph horiz-adv-x="491" /> +<glyph unicode=" " horiz-adv-x="491" /> +<glyph unicode="	" horiz-adv-x="491" /> +<glyph unicode=" " horiz-adv-x="491" /> +<glyph unicode="!" horiz-adv-x="583" d="M131 131q0 66 46 113t111.5 47t111.5 -47t46 -113q0 -63 -46 -109.5t-111 -46.5q-63 0 -110.5 46.5t-47.5 109.5zM150 1391h292l-47 -930h-202z" /> +<glyph unicode=""" horiz-adv-x="792" d="M115 823v543h221v-76l-70 -467h-151zM483 823v543h222v-76l-70 -467h-152z" /> +<glyph unicode="#" horiz-adv-x="1400" d="M70 229l22 144h273l57 278h-270l22 144h277l79 389h148l-80 -389h291l80 389h149l-80 -389h293l-22 -144h-299l-58 -278h297l-22 -144h-303l-84 -411h-152l86 411h-291l-84 -411h-149l84 411h-264zM512 373h291l57 278h-291z" /> +<glyph unicode="$" horiz-adv-x="976" d="M74 84l53 211q12 -10 34.5 -25.5t102.5 -43t170 -33.5l8 288q-168 57 -260 139t-92 205q0 125 91 217.5t278 110.5l6 180h98l-6 -176q86 -2 163 -17.5t111 -29.5l33 -14l-65 -203q-98 49 -246 57l-8 -280q172 -57 263 -134t91 -206q0 -137 -99.5 -229.5t-273.5 -110.5 l-4 -172h-98l4 168q-211 6 -350 96zM317 842q0 -51 32 -81t100 -59l6 248q-138 -12 -138 -108zM532 193q133 14 134 116q0 49 -30 80t-97 57z" /> +<glyph unicode="%" horiz-adv-x="1564" d="M70 1044.5q0 135.5 95 228.5t241 93q143 0 238 -93t95 -228.5t-95 -229.5t-238 -94q-145 0 -240.5 94t-95.5 229.5zM231 1044.5q0 -67.5 49.5 -121t125 -53.5t124 53.5t48.5 121t-48.5 120t-124 52.5t-125 -52.5t-49.5 -120zM236 0l968 1397l103 -70l-922 -1327h-149z M827 299q0 135 95.5 228.5t238.5 93.5q145 0 240.5 -93.5t95.5 -228.5t-95 -229.5t-241 -94.5q-143 0 -238.5 94.5t-95.5 229.5zM989 299q0 -70 48 -122t124 -52t125 52t49 122q0 68 -49 120t-125 52t-124 -52t-48 -120z" /> +<glyph unicode="&" horiz-adv-x="1441" d="M70 340q0 127 72.5 215t201.5 162q-104 182 -104 327q0 141 97 244t288 103q170 0 266 -87t96 -231q0 -139 -82 -229t-227 -170q37 -51 74 -90q74 -90 186 -199q160 207 186 547h228q-37 -416 -252 -688q164 -125 282 -164l-86 -166q-154 20 -366 170 q-162 -109 -371 -109q-197 0 -343 90.5t-146 274.5zM309 352q0 -84 68.5 -130t177.5 -46t203 49q-127 111 -234 238l-71 88q-144 -90 -144 -199zM502 1047q0 -90 65 -211q94 51 144.5 103t50.5 122q0 55 -35 92t-96 37q-63 0 -96 -41t-33 -102z" /> +<glyph unicode="'" horiz-adv-x="423" d="M115 823v543h235v-76l-106 -467h-129z" /> +<glyph unicode="(" horiz-adv-x="618" d="M90 553q0 152 33 298t79 246.5t92 180.5t79 119l33 39l178 -60l-32 -39q-19 -25 -70.5 -109.5t-91.5 -173.5t-71.5 -226.5t-31.5 -274.5q0 -150 31.5 -296t75.5 -246.5t89 -179.5t78 -118l31 -37l-176 -67q-12 14 -35 43t-79 123t-99 196.5t-78 261t-35 320.5z" /> +<glyph unicode=")" horiz-adv-x="618" d="M27 -324l32 40q20 26 73.5 114t93.5 183.5t73 242.5t33 297q0 393 -232 737l-65 86l178 60l34 -41q22 -27 76 -115t96 -184.5t75.5 -243.5t33.5 -299q0 -162 -33.5 -319.5t-81.5 -265t-95.5 -192.5t-79.5 -126l-35 -41z" /> +<glyph unicode="*" horiz-adv-x="1026" d="M76 854l313 92l41 -69l-235 -226zM76 1090l119 202l235 -225l-41 -72zM395 535l78 315h82l76 -315h-236zM395 1409h236l-76 -317h-82zM598 877l39 69l313 -92l-116 -203zM598 1067l236 225l116 -202l-313 -95z" /> +<glyph unicode="+" horiz-adv-x="1064" d="M51 440v166h395v414h175v-414h389v-166h-389v-440h-175v440h-395z" /> +<glyph unicode="," horiz-adv-x="507" d="M55 -301q94 90 119 131q31 53 31 121q0 55 -25.5 111.5t-95.5 156.5l231 76q94 -131 95 -260q0 -213 -263 -428z" /> +<glyph unicode="-" horiz-adv-x="755" d="M106 440v164h543v-164h-543z" /> +<glyph unicode="." horiz-adv-x="518" d="M100 131q0 66 46.5 113t112 47t111.5 -47t46 -113q0 -63 -47 -109.5t-110.5 -46.5t-111 46.5t-47.5 109.5z" /> +<glyph unicode="/" horiz-adv-x="956" d="M41 -401l682 1767h172l-680 -1767h-174z" /> +<glyph unicode="0" horiz-adv-x="1146" d="M84 475q0 209 131 365.5t367 156.5q225 0 353 -144t128 -343q0 -133 -52.5 -252t-169 -201t-274.5 -82q-225 0 -354 148.5t-129 351.5zM324 481q0 -129 60 -217t189 -88q131 0 191.5 88t60.5 219t-60 222.5t-190 91.5q-131 0 -191 -91.5t-60 -224.5z" /> +<glyph unicode="1" horiz-adv-x="874" d="M100 0v199h246v567h-237v207h487v-774h225v-199h-721z" /> +<glyph unicode="2" horiz-adv-x="950" d="M80 868q16 14 47 36t125 57.5t188 35.5q158 0 257.5 -88t99.5 -225q0 -127 -94.5 -242.5t-251.5 -244.5h432v-197h-797v143q18 12 48 35t107.5 87.5t137 124t108 133t48.5 126.5q0 61 -40 99t-106 38q-104 0 -209 -75z" /> +<glyph unicode="3" horiz-adv-x="841" d="M20 866q18 14 50 36t128.5 58.5t190.5 36.5q147 0 246.5 -80.5t99.5 -201.5q0 -205 -252 -340q135 -37 209 -126t74 -202q0 -207 -185.5 -328.5t-459.5 -121.5q-41 0 -62 2l-22 192q49 -4 72 -4q172 0 283.5 67.5t111.5 192.5q0 96 -88 139t-207 43h-43v189 q111 6 209 81.5t98 172.5q0 53 -37 83.5t-94 30.5q-47 0 -99.5 -20.5t-80.5 -40.5l-29 -23z" /> +<glyph unicode="4" horiz-adv-x="1101" d="M49 27v168l547 784h266v-764h182v-188h-182v-422h-248v422h-565zM295 215h319v483z" /> +<glyph unicode="5" horiz-adv-x="841" d="M66 -207q57 -4 84 -4q162 0 264 62.5t102 191.5q0 61 -27.5 108.5t-52 72t-98.5 50t-97.5 30.5t-113.5 22q-27 6 -39 8v639h631v-197h-385v-280q94 -25 164.5 -55.5t138.5 -80t104.5 -126t36.5 -177.5q0 -219 -174 -339.5t-450 -120.5q-43 0 -66 2z" /> +<glyph unicode="6" horiz-adv-x="1069" d="M76 565q0 156 50 299.5t146.5 259t251 187t346.5 80.5l17 -199q-442 -33 -533 -412q92 115 260 115q174 0 282 -127t108 -309q0 -195 -123 -339.5t-332 -144.5q-227 0 -350 170t-123 420zM334 588q0 -182 60.5 -297t170.5 -115q84 0 133.5 71.5t49.5 184.5q0 100 -43 178 t-150 78q-121 0 -221 -100z" /> +<glyph unicode="7" horiz-adv-x="958" d="M51 752v221h862v-150q-229 -580 -569 -1241l-246 51q311 584 527 1119h-574z" /> +<glyph unicode="8" horiz-adv-x="1056" d="M86 336q0 119 68.5 205t189.5 161q-195 158 -194 332q0 152 111.5 254.5t287.5 102.5q162 0 274.5 -88.5t112.5 -241.5q0 -186 -209 -336q115 -76 180.5 -157t65.5 -195q0 -158 -126 -278t-323 -120q-174 0 -306 96.5t-132 264.5zM309 348q0 -76 58.5 -127t138.5 -51 q86 0 149.5 56.5t63.5 127.5q0 43 -33 87t-69.5 72t-108.5 77q-96 -61 -147.5 -116.5t-51.5 -125.5zM403 1055q0 -113 156 -219q152 104 152 215q0 66 -43 105.5t-115 39.5t-111 -40t-39 -101z" /> +<glyph unicode="9" horiz-adv-x="1083" d="M88 514q0 193 123 338t332 145q227 0 350 -170t123 -419q0 -154 -50.5 -295.5t-146.5 -256t-250.5 -185t-347.5 -79.5l-16 199q444 33 532 416q-90 -119 -260 -119q-174 0 -281.5 125t-107.5 301zM346 541q0 -59 13.5 -109.5t58.5 -93.5t121 -43q121 0 219 98 q-2 176 -61.5 290t-168.5 114q-86 0 -134 -71.5t-48 -184.5z" /> +<glyph unicode=":" horiz-adv-x="569" d="M127 131q0 66 46 113t111.5 47t111.5 -47t46 -113q0 -63 -46 -109.5t-111 -46.5q-63 0 -110.5 46.5t-47.5 109.5zM127 797q0 66 46 111.5t111.5 45.5t111.5 -46t46 -111.5t-46 -110.5t-111.5 -45t-111.5 46.5t-46 109.5z" /> +<glyph unicode=";" horiz-adv-x="563" d="M84 -301q94 90 119 131q31 53 30 121q0 55 -25.5 111.5t-94.5 156.5l231 76q94 -131 94 -260q0 -213 -262 -428zM123 795q0 66 46 112.5t111.5 46.5t111.5 -47t46 -112q0 -63 -47 -109.5t-110.5 -46.5t-110.5 46.5t-47 109.5z" /> +<glyph unicode="<" horiz-adv-x="1064" d="M53 473v94l873 469l41 -170l-676 -346l676 -368l-41 -166z" /> +<glyph unicode="=" horiz-adv-x="1064" d="M84 252v164h897v-164h-897zM84 610v164h897v-164h-897z" /> +<glyph unicode=">" horiz-adv-x="1064" d="M98 152l674 368l-674 346l41 170l873 -469v-94l-873 -487z" /> +<glyph unicode="?" horiz-adv-x="790" d="M86 1235l57 227q23 -6 62 -19t139 -56.5t176 -90.5t138.5 -122.5t62.5 -155.5q0 -53 -31 -107.5t-76 -102.5l-90 -98q-45 -50 -75.5 -115t-30.5 -134h-207q-4 25 -4 47q0 82 36 161t80 129t79.5 102t35.5 85q0 53 -88 115.5t-176 99.5zM162 131q0 66 46 113t109 47 q66 0 113 -47t47 -113q0 -63 -47 -109.5t-113 -46.5q-63 0 -109 46.5t-46 109.5z" /> +<glyph unicode="@" horiz-adv-x="1779" d="M76 395q0 219 106.5 408.5t305 307.5t448.5 118q332 0 543 -193.5t211 -486.5q0 -307 -217 -449q-47 -31 -104.5 -50t-153 -39.5t-146.5 -35.5q-37 143 -39 146q-31 -59 -102.5 -102.5t-151.5 -43.5q-131 0 -220 107.5t-89 284.5q0 242 170 390t407 148q37 0 80 -4t68 -8 l27 -4v-535q0 -41 4 -84t8 -65l4 -23q129 8 195.5 105.5t66.5 242.5q0 229 -150.5 385t-408.5 156q-295 0 -481.5 -199.5t-186.5 -472.5q0 -256 167 -424t382 -180l-31 -166q-303 18 -507.5 235.5t-204.5 530.5zM709 377q0 -88 28.5 -150.5t83.5 -62.5q90 0 158 108v459 q-117 0 -193.5 -104.5t-76.5 -249.5z" /> +<glyph unicode="A" horiz-adv-x="1300" d="M10 0l514 1376h252l514 -1376h-268l-111 307h-528l-111 -307h-262zM461 526h370l-184 516z" /> +<glyph unicode="B" horiz-adv-x="1234" d="M170 0v1366h455q244 0 353 -95t109 -233q0 -170 -159 -297q86 -41 155.5 -123.5t69.5 -220.5q0 -180 -130 -288.5t-337 -108.5h-516zM434 221h221q223 0 224 185q0 82 -56.5 132t-167.5 50h-221v-367zM434 801h277q8 2 28.5 19.5t46 62.5t25.5 98q0 164 -217 164h-160 v-344z" /> +<glyph unicode="C" horiz-adv-x="1382" d="M80 662q0 313 209 521t555 208q276 0 461 -107l12 -6l-100 -223q-16 12 -45 29.5t-129.5 47t-208.5 29.5q-221 0 -352.5 -134t-131.5 -343q0 -217 138.5 -348t340.5 -131q109 0 208.5 30.5t146.5 63.5l45 31l106 -193q-6 -6 -20.5 -17t-63.5 -39t-104 -49.5t-145.5 -39 t-188.5 -17.5q-311 0 -522 186t-211 501z" /> +<glyph unicode="D" horiz-adv-x="1490" d="M170 0v1366h485q145 0 274.5 -36t238 -111.5t173 -207.5t64.5 -306q0 -336 -226.5 -520.5t-600.5 -184.5h-408zM434 221h123q295 0 434 129t139 342q0 209 -129 331t-374 122h-193v-924z" /> +<glyph unicode="E" horiz-adv-x="1126" d="M170 0v1366h862v-221h-598v-342h471v-219h-471v-363h613v-221h-877z" /> +<glyph unicode="F" horiz-adv-x="1083" d="M170 0v1366h858v-221h-594v-352h471v-220h-471v-573h-264z" /> +<glyph unicode="G" horiz-adv-x="1447" d="M78 659q0 197 90 361t270 267.5t420 103.5q262 0 457 -97l8 -4l-100 -223q-18 10 -50 25.5t-130.5 42t-194.5 26.5q-236 0 -368 -139t-132 -346q0 -215 144.5 -343t365.5 -128l217 20v301h-274v219h532v-708q-293 -61 -497 -62q-326 0 -542 187.5t-216 496.5z" /> +<glyph unicode="H" horiz-adv-x="1562" d="M170 0v1366h264v-559h694v559h263v-1366h-263v588h-694v-588h-264z" /> +<glyph unicode="I" horiz-adv-x="604" d="M170 0v1366h264v-1366h-264z" /> +<glyph unicode="J" horiz-adv-x="604" d="M-86 -164q258 23 258 389v1141h264v-1133q0 -117 -19.5 -212t-65.5 -183t-136 -146.5t-219 -76.5z" /> +<glyph unicode="K" horiz-adv-x="1277" d="M170 0v1366h264v-541h37l461 541h325l-563 -639l592 -727h-334l-481 606h-37v-606h-264z" /> +<glyph unicode="L" horiz-adv-x="1083" d="M170 0v1366h264v-1145h619v-221h-883z" /> +<glyph unicode="M" horiz-adv-x="1802" d="M147 0l50 1366h378l330 -948l330 948h373l49 -1366h-256l-39 1069l-379 -1069h-172l-375 1067l-35 -1067h-254z" /> +<glyph unicode="N" horiz-adv-x="1529" d="M170 0v1366h266l666 -963v963h258v-1366h-268l-664 956v-956h-258z" /> +<glyph unicode="O" d="M78 680q0 182 84 342t258 264.5t405 104.5q332 0 534 -197t202 -485q0 -190 -90.5 -357.5t-265.5 -272t-398 -104.5q-328 0 -528.5 207t-200.5 498zM354 688q0 -193 122 -341t337 -148t344 147.5t129 345.5q0 195 -124 335t-341 140t-342 -141t-125 -338z" /> +<glyph unicode="P" horiz-adv-x="1200" d="M170 0v1366h477q250 0 377 -122t127 -312q0 -215 -142.5 -342t-361.5 -127h-213v-463h-264zM434 684h170q270 0 270 234q0 227 -270 227h-170v-461z" /> +<glyph unicode="Q" d="M78 680q0 182 84 342t258 264.5t405 104.5q332 0 534 -197t202 -485q0 -236 -139.5 -430.5t-374.5 -268.5q41 -55 77.5 -93t98 -82t144.5 -65q76 -20 166 -20h17l-37 -235q-57 0 -110 6t-96 15t-86 28l-74 33q-31 14 -66 41l-54 41q-19 15 -48 46l-40 42 q-11 12 -34.5 40.5t-27.5 32.5l-62 72q-47 57 -129 72q-279 47 -443.5 240.5t-164.5 455.5zM354 688q0 -195 122 -345t337 -150t344 149.5t129 349.5q0 195 -124 335t-341 140t-342 -141t-125 -338z" /> +<glyph unicode="R" horiz-adv-x="1290" d="M170 0v1366h455q252 0 377.5 -113.5t125.5 -294.5q0 -127 -64.5 -224t-172.5 -152l385 -582h-311l-336 516h-195v-516h-264zM434 735h150q133 0 200.5 55.5t67.5 155.5q0 199 -270 199h-148v-410z" /> +<glyph unicode="S" horiz-adv-x="1054" d="M80 90l76 234q16 -14 45.5 -35t119.5 -53q84 -31 163 -31h10q90 0 152.5 39t62.5 106.5t-62.5 120.5t-153 97t-179.5 94.5t-151.5 136.5t-62.5 200q0 164 127 278t344 114q84 0 177.5 -15.5t144.5 -32.5l49 -14l-43 -237q-160 70 -324 69q-92 0 -150 -35.5t-58 -99.5 q0 -49 33.5 -91t87 -73t118 -62.5t129 -69.5t117.5 -84t87 -116.5t34 -158.5q0 -180 -136.5 -288t-338.5 -108q-111 0 -215.5 29t-153.5 57z" /> +<glyph unicode="T" horiz-adv-x="1230" d="M35 1145v221h1161v-221h-448v-1145h-263v1145h-450z" /> +<glyph unicode="U" horiz-adv-x="1458" d="M154 512v854h264v-827q0 -176 84 -258t229.5 -82t228 85t82.5 246v836h265v-825q0 -266 -164 -416t-414 -150q-258 0 -416.5 130.5t-158.5 406.5z" /> +<glyph unicode="V" horiz-adv-x="1239" d="M10 1366h281l334 -981l333 981h271l-484 -1376h-251z" /> +<glyph unicode="W" horiz-adv-x="1984" d="M37 1366h272l285 -1001l297 1001h209l297 -1001l286 1001h265l-412 -1376h-268l-277 907l-274 -907h-271z" /> +<glyph unicode="X" horiz-adv-x="1271" d="M31 0l448 678l-448 688h311l297 -473l299 473h303l-448 -682l448 -684h-311l-297 471l-297 -471h-305z" /> +<glyph unicode="Y" horiz-adv-x="1245" d="M-2 1366h309l316 -535l325 535h299l-491 -795v-571h-264v569z" /> +<glyph unicode="Z" horiz-adv-x="1191" d="M74 0v160l676 985h-646v221h986v-160l-666 -985h690v-221h-1040z" /> +<glyph unicode="[" horiz-adv-x="593" d="M152 -332v1698h413v-143h-231v-1409h231v-146h-413z" /> +<glyph unicode="\" horiz-adv-x="964" d="M61 1366h179l682 -1767h-181z" /> +<glyph unicode="]" horiz-adv-x="589" d="M25 -207h231v1448h-231v125h413v-1698h-413v125z" /> +<glyph unicode="^" horiz-adv-x="964" d="M-27 512l439 879h141l438 -879h-184l-328 655l-325 -655h-181z" /> +<glyph unicode="_" horiz-adv-x="1062" d="M18 -76h1024v-141h-1024v141z" /> +<glyph unicode="`" horiz-adv-x="1044" d="M291 1448h241l211 -334l-135 -74z" /> +<glyph unicode="a" horiz-adv-x="1007" d="M53 219q0 289 545 361v32q0 78 -24.5 116t-104.5 38q-145 -2 -295 -111l-61 181q18 14 53 33.5t146.5 53t228.5 33.5q174 0 243.5 -71.5t69.5 -231.5v-360q0 -92 88 -107l16 -2l-73 -198q-197 6 -260 137q-96 -147 -291 -148q-125 0 -203 69t-78 175zM313 240 q0 -78 90 -78q92 0 195 121v149q-285 -40 -285 -192z" /> +<glyph unicode="b" horiz-adv-x="1093" d="M123 27v1400l256 41v-600q88 88 231 88q197 0 304.5 -129t107.5 -325q0 -221 -137 -374t-389 -153q-70 0 -163 12.5t-149.5 25t-60.5 14.5zM379 174q57 -18 119 -18q119 0 190.5 86t71.5 241q0 131 -53.5 205t-143.5 74t-184 -72v-516z" /> +<glyph unicode="c" horiz-adv-x="956" d="M66 449q0 207 142 357t367 150q195 0 328 -90l4 -4l-90 -186q-96 84 -223 84q-115 0 -189.5 -80t-74.5 -217q0 -131 70.5 -211t185.5 -80q63 0 124.5 23.5t90.5 46.5l28 24l78 -172q-12 -12 -35.5 -32.5t-111.5 -53.5t-193 -33q-225 0 -363 135.5t-138 338.5z" /> +<glyph unicode="d" horiz-adv-x="1110" d="M70 438q0 213 129 365.5t360 152.5q90 0 162 -28v499l254 41v-1183q0 -49 10 -121t23 -119l10 -45l-238 -14q-18 70 -28 135q-84 -145 -285 -146q-178 0 -287.5 133t-109.5 330zM336 455q0 -135 48 -212t138 -77q117 0 199 123v360q0 117 -143 117q-115 0 -178.5 -80.5 t-63.5 -230.5z" /> +<glyph unicode="e" horiz-adv-x="1009" d="M70 461q0 209 129 352t333 143q180 0 289 -118.5t111 -337.5l-139 -41l-461 -60q23 -104 90 -165.5t172 -61.5q68 0 138.5 28.5t107.5 57.5l37 29l65 -181q-6 -6 -17.5 -14t-50 -30.5t-80.5 -40t-109 -32t-134 -14.5q-227 0 -354 140.5t-127 345.5zM326 547l329 43 q0 6 -1 18.5t-9 43t-21.5 53t-42 42t-67.5 19.5q-80 0 -129 -60.5t-59 -158.5z" /> +<glyph unicode="f" horiz-adv-x="733" d="M45 750v137l145 51v78q0 229 125 360t322 131q168 -2 285 -80l-91 -190q-88 66 -190 66q-195 0 -195 -269v-102h250v-182h-250v-750h-256v750h-145z" /> +<glyph unicode="g" horiz-adv-x="1050" d="M47 -246q0 143 225 269q-74 27 -110.5 59.5t-36.5 79.5q0 94 147 182q-90 43 -139 119t-49 168q0 152 120 238.5t290 86.5q63 0 143 -19t129 -19h117q29 0 60.5 5t47.5 11l17 4l14 -184h-100q-37 0 -76 6q61 -61 61 -156q0 -135 -129 -218t-299 -83q-41 0 -59 2 q-70 -39 -70 -65q0 -29 207 -82l88 -25q76 -20 120 -36.5t103.5 -47.5t89 -78t29.5 -108q0 -141 -149.5 -244.5t-368.5 -103.5q-172 0 -297 64t-125 175zM272 -199q0 -51 56.5 -79.5t152.5 -28.5q115 0 192 37t77 94q0 39 -45.5 63.5t-167.5 59.5l-101 28q-4 -2 -25.5 -16 t-28.5 -19l-26 -19q-18 -13 -26 -21l-22 -22q-13 -13 -19 -24.5t-11.5 -25t-5.5 -27.5zM326 627q0 -59 44 -106.5t124 -47.5q76 0 124 43t48 107q0 61 -45.5 112t-125 51t-124.5 -49t-45 -110z" /> +<glyph unicode="h" horiz-adv-x="1099" d="M129 0v1427l256 41v-684q158 172 340 172q254 0 254 -292v-664h-254v555q0 96 -21.5 138t-72.5 42q-100 0 -246 -155v-580h-256z" /> +<glyph unicode="i" horiz-adv-x="514" d="M106 1277.5q0 63.5 43.5 103.5t109 40t107.5 -40t42 -103.5t-42 -103t-107.5 -39.5t-109 39.5t-43.5 103zM129 0v932h256v-932h-256z" /> +<glyph unicode="j" horiz-adv-x="514" d="M-119 -287q115 18 181.5 90t66.5 232v897h256v-885q0 -244 -116.5 -374t-311.5 -158zM104 1277.5q0 63.5 43 103.5t109 40t108 -40t42 -103.5t-42 -103t-108 -39.5t-109 39.5t-43 103z" /> +<glyph unicode="k" horiz-adv-x="1064" d="M129 0v1427l256 41v-858h33l305 322h324l-410 -408l428 -524h-317l-330 424h-33v-424h-256z" /> +<glyph unicode="l" horiz-adv-x="514" d="M129 0v1427l256 41v-1468h-256z" /> +<glyph unicode="m" horiz-adv-x="1669" d="M125 0v911l246 41v-170q160 174 342 174q193 0 237 -176q166 176 346 176q252 0 252 -292v-664h-254v555q0 96 -21.5 138t-72.5 42q-92 0 -235 -143v-592h-254v555q0 96 -21.5 138t-73.5 42q-94 0 -235 -145v-590h-256z" /> +<glyph unicode="n" horiz-adv-x="1095" d="M125 0v911l246 41v-172q162 176 352 176q252 0 252 -292v-664h-254v555q0 96 -21.5 138t-72.5 42q-98 0 -246 -147v-588h-256z" /> +<glyph unicode="o" horiz-adv-x="1142" d="M68 463q0 92 29.5 176t88 156.5t158.5 116.5t231 44q238 0 369 -139t131 -332q0 -90 -28.5 -176t-87 -162.5t-160 -124t-232.5 -47.5q-238 0 -368.5 143.5t-130.5 344.5zM332 481q0 -131 62.5 -223t178.5 -92q102 0 170 82t68 211q0 123 -61.5 215t-178.5 92 q-102 0 -170.5 -80t-68.5 -205z" /> +<glyph unicode="p" horiz-adv-x="1101" d="M125 -481v1392l246 41v-151q80 156 268 155q178 0 284.5 -132t106.5 -328q0 -213 -125 -367t-346 -154q-115 0 -178 39v-454zM381 250q0 -39 36 -61.5t99 -22.5q113 0 181.5 81t68.5 232q0 129 -48 203t-128 74q-113 0 -209 -140v-366z" /> +<glyph unicode="q" horiz-adv-x="1095" d="M70 430q0 221 137 373.5t389 152.5q72 0 165 -13t150 -25l58 -13v-1345l-254 -41v544q-84 -88 -234 -88q-195 0 -303 130t-108 325zM334 449q0 -129 52 -201t144 -72q90 0 185 68v512q-59 20 -119 20q-119 0 -190.5 -85.5t-71.5 -241.5z" /> +<glyph unicode="r" horiz-adv-x="747" d="M125 0v911l246 41v-192q117 197 278 196l80 -16l-41 -246q-43 18 -88 19q-115 0 -219 -154v-559h-256z" /> +<glyph unicode="s" horiz-adv-x="843" d="M66 57l53 209q12 -10 34.5 -26.5t91 -43t136.5 -26.5q145 0 145 80q0 41 -68.5 80t-150.5 69.5t-150.5 101t-68.5 167.5q0 123 95.5 205.5t291.5 82.5q172 0 277 -51l-54 -207q-102 63 -223 64q-133 0 -133 -74q0 -35 45 -63.5t109.5 -56t128 -62.5t108.5 -94.5 t45 -139.5q0 -133 -102.5 -215t-284.5 -82q-90 0 -171 20.5t-118 41.5z" /> +<glyph unicode="t" horiz-adv-x="813" d="M43 750v137l154 51v217l247 49v-272h285v-182h-285v-426q0 -139 97 -140q63 0 180 80l70 -186q-14 -12 -42 -28.5t-109 -45.5t-161 -29q-133 0 -212 74t-79 213v488h-145z" /> +<glyph unicode="u" horiz-adv-x="1095" d="M119 256v676h256v-555q0 -94 19.5 -137t76.5 -43q92 0 236 127v608h254v-647q0 -49 10 -120t20 -116l10 -45l-245 -22q-20 90 -29 157q-158 -164 -352 -164q-117 0 -186.5 69t-69.5 212z" /> +<glyph unicode="v" horiz-adv-x="972" d="M12 932h269l200 -604l226 604h258l-373 -938h-232z" /> +<glyph unicode="w" horiz-adv-x="1570" d="M27 932h262l178 -647l213 647h217l209 -647l182 647h256l-303 -938h-248l-209 608l-206 -608h-250z" /> +<glyph unicode="x" horiz-adv-x="987" d="M29 0l319 465l-319 467h290l179 -273l178 273h282l-321 -461l321 -471h-284l-182 279l-187 -279h-276z" /> +<glyph unicode="y" horiz-adv-x="972" d="M8 932h266l218 -610l213 610h258l-388 -1000q-63 -162 -188 -281.5t-289 -135.5l-78 196q100 12 188.5 81t125.5 155l33 78z" /> +<glyph unicode="z" horiz-adv-x="921" d="M74 0v156l426 579h-410v197h741v-156l-434 -579h451v-197h-774z" /> +<glyph unicode="{" horiz-adv-x="688" d="M23 467v141q55 2 97 26.5t66.5 76t40 96.5t20.5 122t6 115.5t1 114.5v31q0 166 119 247t317 81v-136q-88 -6 -138 -22.5t-76.5 -56t-33 -86t-6.5 -136.5q0 -459 -213 -540v-4q213 -82 213 -564q0 -90 6.5 -136t33 -85t76.5 -55t138 -25v-135q-436 0 -436 328v31 q0 74 -1 116.5t-6 120.5t-20.5 126t-40 100.5t-66.5 79t-97 28.5z" /> +<glyph unicode="|" horiz-adv-x="483" d="M150 -461v1995h184v-1995h-184z" /> +<glyph unicode="}" horiz-adv-x="688" d="M-2 -328q88 8 138 24.5t77 55.5t33 85t6 136q0 481 213 564v4q-213 82 -213 540q0 90 -6 136.5t-33 86t-77 56t-138 22.5v136q201 0 318.5 -81t117.5 -247q0 -268 27 -377q51 -201 205 -205v-141q-55 -2 -97.5 -28.5t-67 -80t-40 -100.5t-20.5 -127t-6 -120t-1 -115v-31 q0 -328 -436 -328v135z" /> +<glyph unicode="~" horiz-adv-x="1189" d="M111 344q0 176 75.5 261t210.5 85q66 0 118 -19.5t84 -48t59.5 -57t60.5 -48t69 -19.5q72 0 101 57t29 127h167q0 -176 -75.5 -261t-210.5 -85q-66 0 -118 19.5t-84 48t-59.5 57t-60.5 48t-69 19.5q-72 0 -100.5 -57t-28.5 -127h-168z" /> +<glyph unicode="¡" horiz-adv-x="579" d="M139 799q0 63 46 109t112 46q63 0 110.5 -46t47.5 -109q0 -66 -46.5 -113t-112 -47t-111.5 47t-46 113zM143 -461l47 930h203l43 -930h-293z" /> +<glyph unicode="¢" horiz-adv-x="970" d="M74 569q0 174 113.5 301t314.5 142l8 180h98l-8 -180q88 -8 161 -37t101 -53l29 -27l-125 -158q-72 59 -174 74l-19 -475q57 4 113.5 26.5t85.5 43.5l29 20l78 -172q-12 -12 -35 -29.5t-105 -50.5t-174 -39l-6 -180h-98l6 182q-180 20 -286.5 141t-106.5 291zM324 578 q0 -84 39.5 -147.5t111.5 -84.5l19 461q-78 -16 -124 -76.5t-46 -152.5z" /> +<glyph unicode="£" horiz-adv-x="1132" d="M74 127q6 2 14 6t31.5 19.5t42 34t36 50t21.5 68.5l21 184h-123v119h137l20 164q20 182 121 288.5t281 106.5q188 0 309 -110l8 -8l-125 -158q-78 80 -194 80q-70 0 -106 -44t-48 -161l-16 -158h344l-14 -119h-340q-8 -76 -24.5 -146.5t-29.5 -102.5l-12 -33 q106 -57 234 -57q104 0 154 40.5t58 149.5h181q-18 -178 -92 -284.5t-242 -106.5q-90 0 -223 44t-195 44q-68 0 -188 -37z" /> +<glyph unicode="¥" horiz-adv-x="1161" d="M74 1143h270l236 -436l241 436h258l-270 -467h211v-119h-281l-34 -61v-86h315v-119h-315v-291h-254v291h-295v119h295v84l-37 63h-258v119h188z" /> +<glyph unicode="¦" horiz-adv-x="483" d="M150 365h186v-734h-186v734zM150 682v733h186v-733h-186z" /> +<glyph unicode="§" horiz-adv-x="1009" d="M57 -379l62 135q137 -96 291 -96q115 0 175 85t60 220q0 47 -10 113l-107 590q-23 131 -22 206q0 137 53 211l141 -22q-35 -76 -34 -189q0 -53 10 -114l119 -666q12 -68 12 -137q0 -193 -99.5 -317.5t-293.5 -124.5q-190 0 -351 102zM178 946q0 193 99.5 319t293.5 126 q190 0 351 -103l6 -4l-62 -135q-137 96 -291 96q-115 0 -175 -86t-60 -219q0 -63 10 -113l109 -589q20 -123 20 -207q0 -135 -51 -211l-143 22q35 82 34 189q0 53 -10 114l-119 666q-12 67 -12 135z" /> +<glyph unicode="¨" horiz-adv-x="1044" d="M168 1276q0 59 38 95t97 36q61 0 99 -36t38 -95t-37.5 -95t-99.5 -36q-59 0 -97 36t-38 95zM604 1276q0 59 38 95t97 36q61 0 99.5 -36t38.5 -95t-38 -95t-100 -36q-59 0 -97 36t-38 95z" /> +<glyph unicode="©" horiz-adv-x="1568" d="M78 682q0 293 207 500t499.5 207t499.5 -207t207 -500t-207 -500t-499.5 -207t-499.5 207t-207 500zM193 682q0 -250 172 -426t419.5 -176t419.5 176t172 426t-172 426t-419.5 176t-419.5 -176t-172 -426zM389 680q0 168 111.5 295t304.5 127q182 0 287 -113l10 -10 l-92 -133q-8 10 -24.5 26.5t-70 43t-110.5 26.5q-109 0 -168 -71.5t-59 -176.5q0 -109 64.5 -184.5t174.5 -75.5q131 4 225 98l56 -139q-10 -12 -32 -32.5t-97.5 -53.5t-165.5 -33q-180 0 -297 117t-117 289z" /> +<glyph unicode="ª" horiz-adv-x="804" d="M76 877q0 203 383 253v21q0 47 -15.5 71.5t-66.5 24.5q-49 0 -103.5 -21.5t-85.5 -41.5l-28 -21l-43 142q14 10 38.5 23t106.5 37t168 24q127 0 177 -51.5t50 -159.5v-252q0 -35 18.5 -54.5t37.5 -21.5l18 -2l-51 -139q-154 2 -199 86q-70 -92 -200 -93 q-92 0 -148.5 48.5t-56.5 126.5zM279 899q0 -59 57 -59t123 73v107q-180 -29 -180 -121z" /> +<glyph unicode="«" horiz-adv-x="1044" d="M33 510v8q31 25 200 217l189 211l141 -41l-293 -391l293 -391l-141 -41l-165 182l-107 121l-59 66q-26 29 -36 39t-22 20zM434 510v8q31 25 201 217l188 211l142 -41l-293 -391l293 -391l-142 -41l-165 182l-107 121l-58 66q-26 29 -36.5 39t-22.5 20z" /> +<glyph unicode="¬" horiz-adv-x="1163" d="M96 643v164h948v-580h-170v416h-778z" /> +<glyph unicode="­" horiz-adv-x="755" d="M106 440v164h543v-164h-543z" /> +<glyph unicode="®" horiz-adv-x="864" d="M78 1087.5q0 145.5 104.5 250t250 104.5t249.5 -104.5t104 -250t-104 -250t-249.5 -104.5t-250 104.5t-104.5 250zM154 1087q0 -117 82.5 -202.5t195.5 -85.5q111 0 195 87t84 201.5t-84 200.5t-195 86q-113 0 -195.5 -86t-82.5 -201zM301 918v348h123q143 0 143 -105 q0 -63 -61 -96l108 -147h-104l-88 126h-27v-126h-94zM395 1106h35q41 0 41 47q0 49 -55 49h-21v-96z" /> +<glyph unicode="¯" horiz-adv-x="964" d="M219 1182v159h526v-159h-526z" /> +<glyph unicode="°" horiz-adv-x="649" d="M74 1144.5q0 102.5 72.5 174.5t177 72t177 -72t72.5 -174.5t-72.5 -174t-177 -71.5t-177 71.5t-72.5 174zM190 1144.5q0 -57.5 39 -97t94.5 -39.5t94.5 39.5t39 97t-39 96.5t-94.5 39t-94.5 -39t-39 -96.5z" /> +<glyph unicode="±" horiz-adv-x="1064" d="M92 625v166h354v352h175v-352h348v-166h-348v-349h-175v349h-354zM106 0v164h857v-164h-857z" /> +<glyph unicode="²" horiz-adv-x="716" d="M55 883q23 23 71 66l74 69l65 64q40 40 62.5 69t46 62.5t34 64.5t10.5 59q0 102 -115 103q-84 0 -147 -62l-99 121q10 12 32 30.5t94.5 50.5t154.5 32q123 0 199.5 -67.5t76.5 -180.5q0 -184 -278 -444h323v-150h-589z" /> +<glyph unicode="³" horiz-adv-x="681" d="M39 829l82 136q76 -53 162 -54q59 0 92 30t33 71q0 47 -46.5 69.5t-105.5 22.5h-70v149q70 2 127.5 38t57.5 91q0 68 -82 68q-35 0 -71 -12.5t-54 -24.5l-19 -10l-79 123q111 86 266 86q113 0 179.5 -56.5t66.5 -138.5q0 -74 -49.5 -132t-114.5 -79q201 -43 200 -192 q0 -106 -90 -183t-229 -77q-68 0 -131.5 18.5t-93.5 38.5z" /> +<glyph unicode="´" horiz-adv-x="1071" d="M301 1114l211 334h244l-318 -408z" /> +<glyph unicode="µ" horiz-adv-x="1204" d="M129 -442q20 199 21 362v1012h256v-555q0 -94 19 -137t77 -43q96 0 235 127v608h254v-645q0 -84 22.5 -103.5t110.5 -19.5v-178q-82 -10 -129 -11q-121 0 -176 41t-71 115q-156 -156 -342 -156q-33 0 -66 7q6 -86 28.5 -237t22.5 -187h-262z" /> +<glyph unicode="μ" horiz-adv-x="1204" d="M129 -442q20 199 21 362v1012h256v-555q0 -94 19 -137t77 -43q96 0 235 127v608h254v-645q0 -84 22.5 -103.5t110.5 -19.5v-178q-82 -10 -129 -11q-121 0 -176 41t-71 115q-156 -156 -342 -156q-33 0 -66 7q6 -86 28.5 -237t22.5 -187h-262z" /> +<glyph unicode="¶" horiz-adv-x="1380" d="M63 864q0 203 155 352.5t431 149.5h635v-137h-151v-1229h-146v1229h-153v-1270q0 -444 -379 -444l-31 149q133 0 193.5 74t60.5 242v387h-19q-291 0 -443.5 145t-152.5 352z" /> +<glyph unicode="·" horiz-adv-x="530" d="M106 522q0 66 46.5 112t112 46t111.5 -46t46 -111.5t-46 -110.5t-111.5 -45t-112 46t-46.5 109z" /> +<glyph unicode="¸" horiz-adv-x="1044" d="M328 -422l49 115q70 -59 155 -60q43 0 70 16.5t27 39.5q0 20 -27 38.5t-59.5 31t-59 38t-26.5 58t32 98.5l25 47h125l-18 -39q-18 -41 -19 -55q0 -20 28.5 -36.5t61.5 -29t61.5 -46.5t28.5 -83q0 -84 -68.5 -140t-178.5 -56q-57 0 -108.5 15t-74.5 32z" /> +<glyph unicode="¹" horiz-adv-x="643" d="M63 770v141h189v545h-172v141h364v-686h172v-141h-553z" /> +<glyph unicode="º" horiz-adv-x="876" d="M74 1042.5q0 139.5 92 243t276 103.5q170 0 265.5 -97.5t95.5 -232.5q0 -137 -92.5 -247t-274.5 -110q-172 0 -267 100.5t-95 240zM281 1057q0 -90 40.5 -152.5t118.5 -62.5q68 0 112 56t44 142t-40 146.5t-118 60.5q-68 0 -112.5 -54t-44.5 -136z" /> +<glyph unicode="»" horiz-adv-x="1044" d="M80 123l295 391l-295 391l141 41q356 -399 375 -416q6 -6 14 -12v-8q-12 -10 -22 -20.5l-36 -38.5l-58 -66l-108 -121l-165 -182zM481 123l293 391l-293 391l142 41q356 -399 374 -416q6 -6 15 -12v-8q-12 -10 -22.5 -20.5t-36.5 -38.5l-58 -66l-108 -121l-164 -182z" /> +<glyph unicode="¼" horiz-adv-x="1738" d="M90 541v141h189v545h-173v141h365v-686h172v-141h-553zM432 0l815 1417l135 -57l-782 -1360h-168zM997 311l340 520h219v-503h115v-144h-115v-184h-184v184h-358zM1163 328h209v317z" /> +<glyph unicode="½" horiz-adv-x="1822" d="M88 541v141h188v545h-172v141h365v-686h172v-141h-553zM469 0l815 1417l135 -57l-782 -1360h-168zM1149 113q23 23 71 66l73 69l66 64q40 40 62.5 69t46 62.5t33.5 64.5t10 59q0 102 -114 103q-84 0 -148 -62l-98 121q10 12 31.5 30.5t94.5 50.5t155 32 q123 0 199.5 -67.5t76.5 -180.5q0 -184 -278 -444h323v-150h-590z" /> +<glyph unicode="¾" horiz-adv-x="1751" d="M72 600l82 135q76 -53 161 -53q59 0 92 29.5t33 70.5q0 47 -46 69.5t-105 22.5h-70v150q70 2 127 38t57 91q0 68 -81 68q-35 0 -71 -12.5t-54 -24.5l-19 -10l-80 122q111 86 267 86q113 0 179 -56t66 -138q0 -74 -49 -132.5t-115 -78.5q201 -43 201 -193q0 -106 -90 -183 t-229 -77q-68 0 -131.5 18.5t-94.5 39.5zM444 0l816 1417l135 -57l-783 -1360h-168zM1010 311l340 520h219v-503h114v-144h-114v-184h-185v184h-358zM1176 328h208v317z" /> +<glyph unicode="¿" horiz-adv-x="778" d="M68 -66q0 51 30.5 102.5t75.5 97.5l90 95q45 49 76 111.5t31 130.5h207q4 -25 4 -49q0 -78 -36 -152.5t-80 -123t-80 -97.5t-36 -82q0 -53 88 -115.5t176 -97.5l88 -37l-57 -227q-23 6 -61.5 19.5t-139 56.5t-176 90t-138 122.5t-62.5 155.5zM311 798.5 q0 65.5 47.5 111.5t112.5 46q63 0 109.5 -47t46.5 -110.5t-46 -110.5t-110 -47q-66 0 -113 46t-47 111.5z" /> +<glyph unicode="À" horiz-adv-x="1300" d="M10 0l514 1376h252l514 -1376h-268l-111 307h-528l-111 -307h-262zM362 1593l72 189l443 -195l-52 -137zM461 526h370l-184 516z" /> +<glyph unicode="Á" horiz-adv-x="1300" d="M10 0l514 1376h252l514 -1376h-268l-111 307h-528l-111 -307h-262zM418 1587l442 195l72 -189l-465 -143zM461 526h370l-184 516z" /> +<glyph unicode="Â" horiz-adv-x="1300" d="M10 0l514 1376h252l514 -1376h-268l-111 307h-528l-111 -307h-262zM287 1559l258 225h200l256 -225l-131 -89l-225 181l-225 -181zM461 526h370l-184 516z" /> +<glyph unicode="Ã" horiz-adv-x="1300" d="M10 0l514 1376h252l514 -1376h-268l-111 307h-528l-111 -307h-262zM260 1522q0 27 4 54.5t17.5 63t36 62.5t65.5 46t100 19q76 0 138.5 -32.5t106.5 -65.5t79 -33q68 0 67 107v20h158v-30q0 -37 -7 -72t-27.5 -80t-70.5 -72.5t-122 -27.5q-61 0 -111.5 20.5t-78 45 t-60.5 45t-63 20.5q-74 0 -74 -105l2 -18h-158q-2 13 -2 33zM461 526h370l-184 516z" /> +<glyph unicode="Ä" horiz-adv-x="1300" d="M10 0l514 1376h252l514 -1376h-268l-111 307h-528l-111 -307h-262zM250 1626q0 61 39 98t100.5 37t101 -36.5t39.5 -98.5q0 -59 -39.5 -97t-101.5 -38q-59 0 -99 38t-40 97zM461 526h370l-184 516zM762 1626q0 61 40 98t101.5 37t100 -36.5t38.5 -98.5q0 -59 -39.5 -97 t-99.5 -38q-61 0 -101 38t-40 97z" /> +<glyph unicode="Å" horiz-adv-x="1300" d="M10 0l514 1376h252l514 -1376h-268l-111 307h-528l-111 -307h-262zM438 1622q0 66 52.5 114t155 48t154.5 -48t52 -114q0 -74 -52 -123t-154.5 -49t-155 49t-52.5 123zM461 526h370l-184 516zM553 1620q0 -39 23.5 -63.5t68.5 -24.5q43 0 68.5 24.5t25.5 63.5 q0 33 -24.5 57.5t-69.5 24.5t-68.5 -24.5t-23.5 -57.5z" /> +<glyph unicode="Æ" horiz-adv-x="1843" d="M-23 0l771 1366h1001v-221h-598v-342h471v-219h-471v-363h612v-221h-874v379h-420l-209 -379h-283zM592 600h297v537z" /> +<glyph unicode="Ç" horiz-adv-x="1384" d="M82 662q0 313 209 521t555 208q276 0 461 -107l12 -6l-100 -223q-16 12 -45 29.5t-129.5 47t-208.5 29.5q-221 0 -352.5 -134t-131.5 -343q0 -217 138.5 -348t340.5 -131q109 0 208.5 30.5t144.5 63.5l47 31l106 -193q-6 -6 -20 -16t-61.5 -38t-101.5 -48.5t-142 -39 t-183 -20.5l-6 -14q-18 -41 -18 -55q0 -20 27.5 -36.5t62.5 -29t62.5 -46.5t27.5 -83q0 -84 -68.5 -140t-179.5 -56q-57 0 -108 15t-76 32l-23 16l50 115q70 -59 155 -60q43 0 69.5 16.5t26.5 39.5q0 20 -26.5 38.5t-59 31t-59.5 38t-27 58t33 98.5l15 29 q-272 33 -448.5 213t-176.5 467z" /> +<glyph unicode="È" horiz-adv-x="1126" d="M170 0v1366h862v-221h-598v-342h471v-219h-471v-363h613v-221h-877zM326 1593l71 189l443 -195l-52 -137z" /> +<glyph unicode="É" horiz-adv-x="1126" d="M170 0v1366h862v-221h-598v-342h471v-219h-471v-363h613v-221h-877zM383 1587l442 195l72 -189l-465 -143z" /> +<glyph unicode="Ê" horiz-adv-x="1126" d="M170 0v1366h862v-221h-598v-342h471v-219h-471v-363h613v-221h-877zM252 1559l258 225h201l256 -225l-131 -89l-226 181l-225 -181z" /> +<glyph unicode="Ë" horiz-adv-x="1126" d="M170 0v1366h862v-221h-598v-342h471v-219h-471v-363h613v-221h-877zM215 1626q0 61 39 98t100.5 37t101.5 -36.5t40 -98.5q0 -59 -40 -97t-102 -38q-59 0 -99 38t-40 97zM727 1626q0 61 40 98t101.5 37t100.5 -36.5t39 -98.5q0 -59 -40 -97t-100 -38q-61 0 -101 38 t-40 97z" /> +<glyph unicode="Ì" horiz-adv-x="604" d="M23 1593l71 189l443 -195l-52 -137zM170 0v1366h264v-1366h-264z" /> +<glyph unicode="Í" horiz-adv-x="604" d="M78 1587l442 195l72 -189l-465 -143zM170 0v1366h264v-1366h-264z" /> +<glyph unicode="Î" horiz-adv-x="604" d="M-53 1559l258 225h201l256 -225l-132 -89l-225 181l-225 -181zM170 0v1366h264v-1366h-264z" /> +<glyph unicode="Ï" horiz-adv-x="604" d="M-47 1630.5q0 59.5 38 95t97 35.5q61 0 99 -35.5t38 -95t-37.5 -95.5t-99.5 -36q-59 0 -97 36t-38 95.5zM170 0v1366h264v-1366h-264zM389 1630.5q0 59.5 38 95t97 35.5q61 0 99.5 -35.5t38.5 -95t-38 -95.5t-100 -36q-59 0 -97 36t-38 95.5z" /> +<glyph unicode="Ð" horiz-adv-x="1521" d="M53 592v203h148v571h485q145 0 274.5 -36t238 -111.5t173 -207.5t64.5 -306q0 -336 -226.5 -520.5t-601.5 -184.5h-407v592h-148zM465 221h123q295 0 434 129t139 342q0 209 -129 331t-375 122h-192v-350h315v-203h-315v-371z" /> +<glyph unicode="Ñ" horiz-adv-x="1529" d="M170 0v1366h266l666 -963v963h258v-1366h-268l-664 956v-956h-258zM379 1522q0 27 4 54.5t17.5 63t36 62.5t65.5 46t100 19q76 0 138.5 -32.5t106.5 -65.5t79 -33q68 0 67 107v20h158v-30q0 -37 -7 -72t-27.5 -80t-71 -72.5t-121.5 -27.5q-61 0 -111.5 20.5t-78 45 t-60.5 45t-64 20.5q-74 0 -73 -105l2 -18h-158q-2 13 -2 33z" /> +<glyph unicode="Ò" d="M78 680q0 182 84 342t258 264.5t405 104.5q332 0 534 -197t202 -485q0 -190 -90.5 -357.5t-265.5 -272t-398 -104.5q-328 0 -528.5 207t-200.5 498zM354 688q0 -193 122 -341t337 -148t344 147.5t129 345.5q0 195 -124 335t-341 140t-342 -141t-125 -338zM535 1593 l71 189l443 -195l-52 -137z" /> +<glyph unicode="Ó" d="M78 680q0 182 84 342t258 264.5t405 104.5q332 0 534 -197t202 -485q0 -190 -90.5 -357.5t-265.5 -272t-398 -104.5q-328 0 -528.5 207t-200.5 498zM354 688q0 -193 122 -341t337 -148t344 147.5t129 345.5q0 195 -124 335t-341 140t-342 -141t-125 -338zM592 1587 l442 195l72 -189l-465 -143z" /> +<glyph unicode="Ô" d="M78 680q0 182 84 342t258 264.5t405 104.5q332 0 534 -197t202 -485q0 -190 -90.5 -357.5t-265.5 -272t-398 -104.5q-328 0 -528.5 207t-200.5 498zM354 688q0 -193 122 -341t337 -148t344 147.5t129 345.5q0 195 -124 335t-341 140t-342 -141t-125 -338zM461 1559 l258 225h201l256 -225l-132 -89l-225 181l-225 -181z" /> +<glyph unicode="Õ" d="M78 680q0 182 84 342t258 264.5t405 104.5q332 0 534 -197t202 -485q0 -190 -90.5 -357.5t-265.5 -272t-398 -104.5q-328 0 -528.5 207t-200.5 498zM354 688q0 -193 122 -341t337 -148t344 147.5t129 345.5q0 195 -124 335t-341 140t-342 -141t-125 -338zM434 1522 q0 27 4 54.5t17.5 63t36 62.5t65.5 46t100 19q76 0 138.5 -32.5t106.5 -65.5t79 -33q68 0 68 107v20h157v-30q0 -37 -7 -72t-27.5 -80t-70.5 -72.5t-122 -27.5q-61 0 -111.5 20.5t-78 45t-60.5 45t-63 20.5q-74 0 -74 -105l2 -18h-158q-2 13 -2 33z" /> +<glyph unicode="Ö" d="M78 680q0 182 84 342t258 264.5t405 104.5q332 0 534 -197t202 -485q0 -190 -90.5 -357.5t-265.5 -272t-398 -104.5q-328 0 -528.5 207t-200.5 498zM354 688q0 -193 122 -341t337 -148t344 147.5t129 345.5q0 195 -124 335t-341 140t-342 -141t-125 -338zM424 1626 q0 61 39 98t100.5 37t101.5 -36.5t40 -98.5q0 -59 -40 -97t-102 -38q-59 0 -99 38t-40 97zM936 1626q0 61 40 98t101.5 37t100.5 -36.5t39 -98.5q0 -59 -40 -97t-100 -38q-61 0 -101 38t-40 97z" /> +<glyph unicode="×" horiz-adv-x="1064" d="M72 160l348 358l-348 361l110 114l350 -360l351 360l110 -114l-350 -361l350 -358l-112 -115l-349 358l-348 -358z" /> +<glyph unicode="Ø" d="M78 680q0 182 84 342t258 264.5t405 104.5q211 0 377 -86l94 122h162l-145 -192q119 -94 183.5 -231.5t64.5 -294.5q0 -190 -90.5 -357.5t-265.5 -272t-398 -104.5q-213 0 -381 95l-100 -131h-164l157 206q-117 98 -179 237.5t-62 297.5zM354 688q0 -201 119 -340 l582 762q-98 57 -234 57q-217 0 -342 -141t-125 -338zM571 264q104 -66 242 -65q215 0 344 147.5t129 345.5q0 201 -129 340z" /> +<glyph unicode="Ù" horiz-adv-x="1458" d="M154 512v854h264v-827q0 -176 84 -258t229.5 -82t228 85t82.5 246v836h265v-825q0 -266 -164 -416t-414 -150q-258 0 -416.5 130.5t-158.5 406.5zM444 1593l72 189l442 -195l-51 -137z" /> +<glyph unicode="Ú" horiz-adv-x="1458" d="M154 512v854h264v-827q0 -176 84 -258t229.5 -82t228 85t82.5 246v836h265v-825q0 -266 -164 -416t-414 -150q-258 0 -416.5 130.5t-158.5 406.5zM502 1587l442 195l72 -189l-465 -143z" /> +<glyph unicode="Û" horiz-adv-x="1458" d="M154 512v854h264v-827q0 -176 84 -258t229.5 -82t228 85t82.5 246v836h265v-825q0 -266 -164 -416t-414 -150q-258 0 -416.5 130.5t-158.5 406.5zM371 1559l258 225h200l256 -225l-131 -89l-225 181l-225 -181z" /> +<glyph unicode="Ü" horiz-adv-x="1458" d="M154 512v854h264v-827q0 -176 84 -258t229.5 -82t228 85t82.5 246v836h265v-825q0 -266 -164 -416t-414 -150q-258 0 -416.5 130.5t-158.5 406.5zM334 1626q0 61 39 98t100.5 37t101 -36.5t39.5 -98.5q0 -59 -39.5 -97t-101.5 -38q-59 0 -99 38t-40 97zM846 1626 q0 61 40 98t101.5 37t100 -36.5t38.5 -98.5q0 -59 -39.5 -97t-99.5 -38q-61 0 -101 38t-40 97z" /> +<glyph unicode="Ý" horiz-adv-x="1245" d="M-2 1366h309l316 -535l325 535h299l-491 -795v-571h-264v569zM395 1587l443 195l71 -189l-465 -143z" /> +<glyph unicode="Þ" horiz-adv-x="1191" d="M170 0v1366h264v-281h234q244 0 358.5 -106.5t114.5 -276.5q0 -195 -130 -306t-343 -111h-234v-285h-264zM434 506h193q240 0 239 182q0 178 -239 178h-193v-360z" /> +<glyph unicode="ß" horiz-adv-x="1222" d="M45 750v137l145 51v72q0 227 115 351t332 124q182 0 288.5 -84t106.5 -221q0 -70 -28.5 -131.5t-64.5 -97.5t-64.5 -82t-28.5 -89q0 -47 34.5 -90t83.5 -80l97 -78q49 -41 84 -103t35 -140q0 -139 -104.5 -226.5t-282.5 -87.5q-147 0 -234 52l37 202q76 -59 176 -59 q68 0 105.5 33t37.5 84q0 43 -30.5 78.5t-74.5 65.5t-89 65.5t-76 95t-31 137.5q0 74 27 135.5t59.5 95t59 83t26.5 102.5q0 78 -45 113.5t-112 35.5q-182 0 -183 -276v-1018h-256v750h-145z" /> +<glyph unicode="à" horiz-adv-x="1007" d="M53 219q0 289 545 361v32q0 78 -24.5 116t-104.5 38q-145 -2 -295 -111l-61 181q18 14 53 33.5t146.5 53t228.5 33.5q174 0 243.5 -71.5t69.5 -231.5v-360q0 -92 88 -107l16 -2l-73 -198q-197 6 -260 137q-96 -147 -291 -148q-125 0 -203 69t-78 175zM145 1448h242 l211 -334l-135 -74zM313 240q0 -78 90 -78q92 0 195 121v149q-285 -40 -285 -192z" /> +<glyph unicode="á" horiz-adv-x="1007" d="M53 219q0 289 545 361v32q0 78 -24.5 116t-104.5 38q-145 -2 -295 -111l-61 181q18 14 53 33.5t146.5 53t228.5 33.5q174 0 243.5 -71.5t69.5 -231.5v-360q0 -92 88 -107l16 -2l-73 -198q-197 6 -260 137q-96 -147 -291 -148q-125 0 -203 69t-78 175zM313 240 q0 -78 90 -78q92 0 195 121v149q-285 -40 -285 -192zM350 1114l211 334h244l-318 -408z" /> +<glyph unicode="â" horiz-adv-x="1007" d="M53 219q0 289 545 361v32q0 78 -24.5 116t-104.5 38q-145 -2 -295 -111l-61 181q18 14 53 33.5t146.5 53t228.5 33.5q174 0 243.5 -71.5t69.5 -231.5v-360q0 -92 88 -107l16 -2l-73 -198q-197 6 -260 137q-96 -147 -291 -148q-125 0 -203 69t-78 175zM162 1098l235 350 h158l233 -352l-139 -58l-174 244l-172 -244zM313 240q0 -78 90 -78q92 0 195 121v149q-285 -40 -285 -192z" /> +<glyph unicode="ã" horiz-adv-x="1007" d="M53 219q0 289 545 361v32q0 78 -24.5 116t-104.5 38q-145 -2 -295 -111l-61 181q18 14 53 33.5t146.5 53t228.5 33.5q174 0 243.5 -71.5t69.5 -231.5v-360q0 -92 88 -107l16 -2l-73 -198q-197 6 -260 137q-96 -147 -291 -148q-125 0 -203 69t-78 175zM127 1151q0 37 6 73 t25.5 82t64.5 74.5t111 28.5q70 0 124 -39t92 -78t68 -39q59 0 60 117v25h156v-29q0 -37 -7.5 -74t-26 -84t-65.5 -76.5t-114 -29.5q-70 0 -121 39t-87 77.5t-69 38.5q-59 0 -59 -118v-19h-156q-2 13 -2 31zM313 240q0 -78 90 -78q92 0 195 121v149q-285 -40 -285 -192z" /> +<glyph unicode="ä" horiz-adv-x="1007" d="M53 219q0 289 545 361v32q0 78 -24.5 116t-104.5 38q-145 -2 -295 -111l-61 181q18 14 53 33.5t146.5 53t228.5 33.5q174 0 243.5 -71.5t69.5 -231.5v-360q0 -92 88 -107l16 -2l-73 -198q-197 6 -260 137q-96 -147 -291 -148q-125 0 -203 69t-78 175zM121 1276 q0 59 38 95t97 36q61 0 99 -36t38 -95t-38 -95t-99 -36q-59 0 -97 36t-38 95zM313 240q0 -78 90 -78q92 0 195 121v149q-285 -40 -285 -192zM557 1276q0 59 38 95t97 36q61 0 99 -36t38 -95t-37.5 -95t-99.5 -36q-59 0 -97 36t-38 95z" /> +<glyph unicode="å" horiz-adv-x="1007" d="M53 219q0 289 545 361v32q0 78 -24.5 116t-104.5 38q-145 -2 -295 -111l-61 181q18 14 53 33.5t146.5 53t228.5 33.5q174 0 243.5 -71.5t69.5 -231.5v-360q0 -92 88 -107l16 -2l-73 -198q-197 6 -260 137q-96 -147 -291 -148q-125 0 -203 69t-78 175zM268 1282 q0 72 53.5 126t153.5 54t153.5 -54t53.5 -126t-53.5 -129t-153.5 -57t-153.5 57t-53.5 129zM313 240q0 -78 90 -78q92 0 195 121v149q-285 -40 -285 -192zM383 1280q0 -37 24.5 -62.5t67.5 -25.5t68.5 26.5t25.5 61.5t-24.5 60.5t-69.5 25.5t-68.5 -25.5t-23.5 -60.5z" /> +<glyph unicode="æ" horiz-adv-x="1538" d="M53 219q0 262 557 328v51q0 88 -24.5 128t-106.5 40q-70 0 -145.5 -27.5t-116.5 -54.5l-43 -29l-61 181q18 14 53 33.5t143.5 53t220.5 33.5q190 0 254 -118q109 119 277 118q180 0 288.5 -115.5t110.5 -330.5l-139 -41l-463 -57q18 -111 88 -175.5t176 -64.5 q68 0 138.5 28.5t107.5 57.5l37 29l68 -181q-16 -14 -48 -35.5t-134.5 -58.5t-211.5 -37q-254 0 -381 195q-39 -76 -130 -135.5t-224 -59.5q-131 0 -211 69t-80 175zM313 240q0 -78 101 -78q82 0 138 61.5t56 177.5q-295 -30 -295 -161zM856 561l328 39q0 6 -1 17.5t-9.5 40 t-21.5 50t-42 40t-68 18.5q-78 0 -126 -56.5t-60 -148.5z" /> +<glyph unicode="ç" horiz-adv-x="958" d="M66 449q0 207 142 357t367 150q195 0 328 -90l4 -4l-90 -186q-96 84 -223 84q-115 0 -189.5 -80t-74.5 -217q0 -131 70.5 -211t185.5 -80q63 0 124.5 23.5t90.5 46.5l28 24l78 -172q-12 -12 -34.5 -31.5t-107.5 -52.5t-185 -35l-7 -14q-18 -41 -18 -55q0 -20 27.5 -36.5 t62.5 -29t62.5 -46.5t27.5 -83q0 -84 -68.5 -140t-179.5 -56q-57 0 -108 15t-76 32l-22 16l49 115q70 -59 155 -60q43 0 70 16.5t27 39.5q0 20 -27 38.5t-59.5 31t-59 38t-26.5 58t32 98.5l17 33q-180 31 -286.5 159t-106.5 304z" /> +<glyph unicode="è" horiz-adv-x="1009" d="M70 461q0 209 129 352t333 143q180 0 289 -118.5t111 -337.5l-139 -41l-461 -60q23 -104 90 -165.5t172 -61.5q68 0 138.5 28.5t107.5 57.5l37 29l65 -181q-6 -6 -17.5 -14t-50 -30.5t-80.5 -40t-109 -32t-134 -14.5q-227 0 -354 140.5t-127 345.5zM184 1448h242 l211 -334l-135 -74zM326 547l329 43q0 6 -1 18.5t-9 43t-21.5 53t-42 42t-67.5 19.5q-80 0 -129 -60.5t-59 -158.5z" /> +<glyph unicode="é" horiz-adv-x="1009" d="M70 461q0 209 129 352t333 143q180 0 289 -118.5t111 -337.5l-139 -41l-461 -60q23 -104 90 -165.5t172 -61.5q68 0 138.5 28.5t107.5 57.5l37 29l65 -181q-6 -6 -17.5 -14t-50 -30.5t-80.5 -40t-109 -32t-134 -14.5q-227 0 -354 140.5t-127 345.5zM326 547l329 43 q0 6 -1 18.5t-9 43t-21.5 53t-42 42t-67.5 19.5q-80 0 -129 -60.5t-59 -158.5zM389 1114l211 334h244l-318 -408z" /> +<glyph unicode="ê" horiz-adv-x="1009" d="M70 461q0 209 129 352t333 143q180 0 289 -118.5t111 -337.5l-139 -41l-461 -60q23 -104 90 -165.5t172 -61.5q68 0 138.5 28.5t107.5 57.5l37 29l65 -181q-6 -6 -17.5 -14t-50 -30.5t-80.5 -40t-109 -32t-134 -14.5q-227 0 -354 140.5t-127 345.5zM203 1098l235 350h158 l233 -352l-139 -58l-174 244l-172 -244zM326 547l329 43q0 6 -1 18.5t-9 43t-21.5 53t-42 42t-67.5 19.5q-80 0 -129 -60.5t-59 -158.5z" /> +<glyph unicode="ë" horiz-adv-x="1009" d="M70 461q0 209 129 352t333 143q180 0 289 -118.5t111 -337.5l-139 -41l-461 -60q23 -104 90 -165.5t172 -61.5q68 0 138.5 28.5t107.5 57.5l37 29l65 -181q-6 -6 -17.5 -14t-50 -30.5t-80.5 -40t-109 -32t-134 -14.5q-227 0 -354 140.5t-127 345.5zM162 1276q0 59 38 95 t97 36q61 0 99 -36t38 -95t-38 -95t-99 -36q-59 0 -97 36t-38 95zM326 547l329 43q0 6 -1 18.5t-9 43t-21.5 53t-42 42t-67.5 19.5q-80 0 -129 -60.5t-59 -158.5zM598 1276q0 59 38 95t97 36q61 0 99 -36t38 -95t-37.5 -95t-99.5 -36q-59 0 -97 36t-38 95z" /> +<glyph unicode="ì" horiz-adv-x="514" d="M-72 1448h242l211 -334l-135 -74zM129 0v932h256v-932h-256z" /> +<glyph unicode="í" horiz-adv-x="514" d="M129 0v932h256v-932h-256zM133 1114l211 334h244l-318 -408z" /> +<glyph unicode="î" horiz-adv-x="514" d="M-55 1098l235 350h158l233 -352l-139 -58l-174 244l-172 -244zM129 0v932h256v-932h-256z" /> +<glyph unicode="ï" horiz-adv-x="514" d="M-96 1276q0 59 38 95t97 36q61 0 99 -36t38 -95t-38 -95t-99 -36q-59 0 -97 36t-38 95zM129 0v932h256v-932h-256zM340 1276q0 59 38 95t97 36q61 0 99 -36t38 -95t-37.5 -95t-99.5 -36q-59 0 -97 36t-38 95z" /> +<glyph unicode="ð" horiz-adv-x="1120" d="M68 444q0 201 128 356.5t328 155.5q133 0 201 -67q-68 156 -203 266l-270 -154l-70 129l201 113q-102 59 -248 94l47 185q229 -43 410 -158l297 168l67 -131l-237 -135q309 -276 309 -688q0 -264 -133 -433.5t-365 -169.5q-215 0 -338.5 137t-123.5 332zM319 463 q0 -115 55.5 -206t164.5 -91q106 0 175.5 92t69.5 289q0 94 -50 156.5t-150 62.5q-117 0 -191 -86t-74 -217z" /> +<glyph unicode="ñ" horiz-adv-x="1095" d="M125 0v911l246 41v-172q162 176 352 176q252 0 252 -292v-664h-254v555q0 96 -21.5 138t-72.5 42q-98 0 -246 -147v-588h-256zM213 1151q0 37 6 73t25.5 82t64.5 74.5t111 28.5q70 0 124 -39t92 -78t69 -39q59 0 59 117v25h156v-29q0 -37 -7.5 -74t-26 -84t-65.5 -76.5 t-114 -29.5q-70 0 -121 39t-87 77.5t-69 38.5q-59 0 -59 -118v-19h-156q-2 13 -2 31z" /> +<glyph unicode="ò" horiz-adv-x="1142" d="M68 463q0 92 29.5 176t88 156.5t158.5 116.5t231 44q238 0 369 -139t131 -332q0 -90 -28.5 -176t-87 -162.5t-160 -124t-232.5 -47.5q-238 0 -368.5 143.5t-130.5 344.5zM244 1448h241l211 -334l-135 -74zM332 481q0 -131 62.5 -223t178.5 -92q102 0 170 82t68 211 q0 123 -61.5 215t-178.5 92q-102 0 -170.5 -80t-68.5 -205z" /> +<glyph unicode="ó" horiz-adv-x="1142" d="M68 463q0 92 29.5 176t88 156.5t158.5 116.5t231 44q238 0 369 -139t131 -332q0 -90 -28.5 -176t-87 -162.5t-160 -124t-232.5 -47.5q-238 0 -368.5 143.5t-130.5 344.5zM332 481q0 -131 62.5 -223t178.5 -92q102 0 170 82t68 211q0 123 -61.5 215t-178.5 92 q-102 0 -170.5 -80t-68.5 -205zM446 1114l211 334h244l-317 -408z" /> +<glyph unicode="ô" horiz-adv-x="1142" d="M68 463q0 92 29.5 176t88 156.5t158.5 116.5t231 44q238 0 369 -139t131 -332q0 -90 -28.5 -176t-87 -162.5t-160 -124t-232.5 -47.5q-238 0 -368.5 143.5t-130.5 344.5zM258 1098l236 350h157l234 -352l-140 -58l-174 244l-172 -244zM332 481q0 -131 62.5 -223 t178.5 -92q102 0 170 82t68 211q0 123 -61.5 215t-178.5 92q-102 0 -170.5 -80t-68.5 -205z" /> +<glyph unicode="õ" horiz-adv-x="1142" d="M68 463q0 92 29.5 176t88 156.5t158.5 116.5t231 44q238 0 369 -139t131 -332q0 -90 -28.5 -176t-87 -162.5t-160 -124t-232.5 -47.5q-238 0 -368.5 143.5t-130.5 344.5zM223 1151q0 37 6.5 73t25.5 82t64.5 74.5t110.5 28.5q70 0 124 -39t92 -78t69 -39q59 0 59 117v25 h156v-29q0 -37 -7.5 -74t-25.5 -84t-65.5 -76.5t-114.5 -29.5q-70 0 -121 39t-87 77.5t-69 38.5q-59 0 -59 -118v-19h-156q-2 13 -2 31zM332 481q0 -131 62.5 -223t178.5 -92q102 0 170 82t68 211q0 123 -61.5 215t-178.5 92q-102 0 -170.5 -80t-68.5 -205z" /> +<glyph unicode="ö" horiz-adv-x="1142" d="M68 463q0 92 29.5 176t88 156.5t158.5 116.5t231 44q238 0 369 -139t131 -332q0 -90 -28.5 -176t-87 -162.5t-160 -124t-232.5 -47.5q-238 0 -368.5 143.5t-130.5 344.5zM217 1276q0 59 38 95t97 36q61 0 99 -36t38 -95t-37.5 -95t-99.5 -36q-59 0 -97 36t-38 95z M332 481q0 -131 62.5 -223t178.5 -92q102 0 170 82t68 211q0 123 -61.5 215t-178.5 92q-102 0 -170.5 -80t-68.5 -205zM653 1276q0 59 38 95t97 36q61 0 99.5 -36t38.5 -95t-38 -95t-100 -36q-59 0 -97 36t-38 95z" /> +<glyph unicode="÷" horiz-adv-x="1064" d="M74 436v166h917v-166h-917zM391 135q0 59 41 101.5t100.5 42.5t101.5 -42t42 -101.5t-42 -100.5t-102 -41q-57 0 -99 42t-42 99zM391 901.5q0 59.5 42 101t99 41.5q59 0 101.5 -41.5t42.5 -101t-42 -101.5t-102 -42q-57 0 -99 42t-42 101.5z" /> +<glyph unicode="ø" horiz-adv-x="1142" d="M68 463q0 92 29.5 176t88 156.5t158.5 116.5t231 44q137 0 244 -51l68 88h143l-115 -151q160 -135 160 -357q0 -90 -28.5 -176t-87 -162.5t-160 -124t-232.5 -47.5q-141 0 -252 56l-69 -92h-146l119 159q-151 138 -151 365zM332 481q0 -102 37 -182l321 430 q-49 37 -119 37q-102 0 -170.5 -80t-68.5 -205zM444 205q55 -39 129 -39q102 0 170 82t68 211q0 102 -43 184z" /> +<glyph unicode="ù" horiz-adv-x="1095" d="M119 256v676h256v-555q0 -94 19.5 -137t76.5 -43q92 0 236 127v608h254v-647q0 -49 10 -120t20 -116l10 -45l-245 -22q-20 90 -29 157q-158 -164 -352 -164q-117 0 -186.5 69t-69.5 212zM211 1448h242l211 -334l-136 -74z" /> +<glyph unicode="ú" horiz-adv-x="1095" d="M119 256v676h256v-555q0 -94 19.5 -137t76.5 -43q92 0 236 127v608h254v-647q0 -49 10 -120t20 -116l10 -45l-245 -22q-20 90 -29 157q-158 -164 -352 -164q-117 0 -186.5 69t-69.5 212zM416 1114l211 334h243l-317 -408z" /> +<glyph unicode="û" horiz-adv-x="1095" d="M119 256v676h256v-555q0 -94 19.5 -137t76.5 -43q92 0 236 127v608h254v-647q0 -49 10 -120t20 -116l10 -45l-245 -22q-20 90 -29 157q-158 -164 -352 -164q-117 0 -186.5 69t-69.5 212zM225 1098l236 350h157l234 -352l-139 -58l-174 244l-172 -244z" /> +<glyph unicode="ü" horiz-adv-x="1095" d="M119 256v676h256v-555q0 -94 19.5 -137t76.5 -43q92 0 236 127v608h254v-647q0 -49 10 -120t20 -116l10 -45l-245 -22q-20 90 -29 157q-158 -164 -352 -164q-117 0 -186.5 69t-69.5 212zM184 1276q0 59 38 95t97 36q61 0 99.5 -36t38.5 -95t-38 -95t-100 -36 q-59 0 -97 36t-38 95zM621 1276q0 59 37.5 95t97.5 36q61 0 99 -36t38 -95t-38 -95t-99 -36q-59 0 -97 36t-38 95z" /> +<glyph unicode="ý" horiz-adv-x="972" d="M8 932h266l218 -610l213 610h258l-388 -1000q-63 -162 -188 -281.5t-289 -135.5l-78 196q100 12 188.5 81t125.5 155l33 78zM367 1114l211 334h243l-317 -408z" /> +<glyph unicode="þ" horiz-adv-x="1105" d="M129 -481v1908l256 41v-659q80 147 258 147t284.5 -132t106.5 -328q0 -213 -125 -367t-346 -154q-115 0 -178 39v-454zM385 252q0 -86 135 -86q113 0 181.5 81t68.5 232q0 129 -48 203t-128 74q-113 0 -209 -140v-364z" /> +<glyph unicode="ÿ" horiz-adv-x="972" d="M8 932h266l218 -610l213 610h258l-388 -1000q-63 -162 -188 -281.5t-289 -135.5l-78 196q100 12 188.5 81t125.5 155l33 78zM137 1276q0 59 38 95t97 36q61 0 99.5 -36t38.5 -95t-38 -95t-100 -36q-59 0 -97 36t-38 95zM573 1276q0 59 38 95t98 36q61 0 99 -36t38 -95 t-38 -95t-99 -36q-59 0 -97.5 36t-38.5 95z" /> +<glyph unicode="Œ" horiz-adv-x="2027" d="M78 680q0 182 84 342t258 264.5t405 104.5q139 0 256 -25h852v-221h-598v-342h471v-219h-471v-363h613v-221h-877q-137 -25 -264 -25q-328 0 -528.5 207t-200.5 498zM354 688q0 -190 122 -339.5t337 -149.5q154 0 258 26v905q-111 37 -250 37q-217 0 -342 -141t-125 -338 z" /> +<glyph unicode="œ" horiz-adv-x="1746" d="M68 463q0 92 29.5 176t88 156.5t158.5 116.5t231 44q233 0 365 -168q125 168 330 168q180 0 288.5 -118.5t110.5 -337.5l-139 -41l-461 -60q23 -104 90.5 -165.5t171.5 -61.5q68 0 138.5 28.5t107.5 57.5l37 29l65 -181q-6 -6 -17 -14t-50 -30.5t-81 -40t-108.5 -32 t-134.5 -14.5q-227 0 -352 168q-131 -168 -368.5 -168t-368.5 143.5t-131 344.5zM332 481q0 -131 62.5 -223t178.5 -92q102 0 170 82t68 211q0 123 -61.5 215t-178.5 92q-102 0 -170.5 -80t-68.5 -205zM1063 549l330 41q0 6 -1 18.5t-9.5 43t-21.5 53t-42 42t-68 19.5 q-80 0 -129 -59.5t-59 -157.5z" /> +<glyph unicode="Ÿ" horiz-adv-x="1245" d="M-2 1366h309l316 -535l325 535h299l-491 -795v-571h-264v569zM227 1626q0 61 39 98t100.5 37t101.5 -36.5t40 -98.5q0 -59 -40 -97t-101 -38q-59 0 -99.5 38t-40.5 97zM739 1626q0 61 40 98t101.5 37t100.5 -36.5t39 -98.5q0 -59 -40 -97t-99 -38q-61 0 -101.5 38 t-40.5 97z" /> +<glyph unicode="ˆ" horiz-adv-x="1044" d="M209 1098l235 350h158l234 -352l-140 -58l-174 244l-172 -244z" /> +<glyph unicode="˜" horiz-adv-x="1044" d="M178 1151q0 37 6 73t25.5 82t64.5 74.5t111 28.5q70 0 124 -39t92 -78t69 -39q59 0 59 117v25h156v-29q0 -37 -7.5 -74t-25.5 -84t-65.5 -76.5t-114.5 -29.5q-70 0 -121 39t-87 77.5t-69 38.5q-59 0 -59 -118v-19h-156q-2 13 -2 31z" /> +<glyph unicode=" " horiz-adv-x="892" /> +<glyph unicode=" " horiz-adv-x="1784" /> +<glyph unicode=" " horiz-adv-x="892" /> +<glyph unicode=" " horiz-adv-x="1784" /> +<glyph unicode=" " horiz-adv-x="594" /> +<glyph unicode=" " horiz-adv-x="446" /> +<glyph unicode=" " horiz-adv-x="297" /> +<glyph unicode=" " horiz-adv-x="297" /> +<glyph unicode=" " horiz-adv-x="223" /> +<glyph unicode=" " horiz-adv-x="356" /> +<glyph unicode=" " horiz-adv-x="99" /> +<glyph unicode="‐" horiz-adv-x="755" d="M106 440v164h543v-164h-543z" /> +<glyph unicode="‑" horiz-adv-x="755" d="M106 440v164h543v-164h-543z" /> +<glyph unicode="‒" horiz-adv-x="755" d="M106 440v164h543v-164h-543z" /> +<glyph unicode="–" horiz-adv-x="1052" d="M106 442v166h840v-166h-840z" /> +<glyph unicode="—" horiz-adv-x="1851" d="M106 442v166h1639v-166h-1639z" /> +<glyph unicode="‘" horiz-adv-x="458" d="M82 1153q0 203 221 377l84 -94q-125 -100 -125 -211q0 -51 30 -102.5t114 -141.5l-209 -111q-115 142 -115 283z" /> +<glyph unicode="’" horiz-adv-x="442" d="M47 1419l211 111q113 -139 113 -281q0 -205 -219 -379l-86 95q127 100 127 213q0 51 -31 103t-115 138z" /> +<glyph unicode="‚" horiz-adv-x="495" d="M78 199l211 110q115 -141 114 -280q0 -203 -221 -377l-86 92q127 100 127 213q0 53 -30.5 103.5t-114.5 138.5z" /> +<glyph unicode="“" horiz-adv-x="849" d="M82 1153q0 203 221 377l84 -94q-125 -100 -125 -211q0 -51 30 -102.5t114 -141.5l-209 -111q-115 142 -115 283zM473 1153q0 203 221 377l84 -94q-125 -100 -125 -211q0 -51 30 -102.5t114 -141.5l-209 -111q-115 142 -115 283z" /> +<glyph unicode="”" horiz-adv-x="833" d="M47 1419l211 111q113 -139 113 -281q0 -205 -219 -379l-86 95q127 100 127 213q0 51 -31 103t-115 138zM440 1419l209 111q113 -139 113 -281q0 -205 -219 -379l-86 95q127 100 127 213q0 51 -31 103t-113 138z" /> +<glyph unicode="„" horiz-adv-x="886" d="M78 199l211 110q115 -141 114 -280q0 -203 -221 -377l-86 92q127 100 127 213q0 53 -30.5 103.5t-114.5 138.5zM469 199l211 110q115 -141 115 -280q0 -205 -222 -377l-86 92q127 100 127 213q0 53 -30.5 103.5t-114.5 138.5z" /> +<glyph unicode="•" horiz-adv-x="833" d="M106 524q0 131 90.5 221.5t221.5 90.5t220 -90.5t89 -221.5t-89 -221t-220 -90t-221.5 90t-90.5 221z" /> +<glyph unicode="…" horiz-adv-x="1658" d="M100 131q0 66 46.5 113t112 47t111.5 -47t46 -113q0 -63 -47 -109.5t-110.5 -46.5t-111 46.5t-47.5 109.5zM672 131q0 66 46 113t109 47q66 0 113 -47t47 -113q0 -63 -47 -109.5t-113 -46.5q-63 0 -109 46.5t-46 109.5zM1243 131q0 66 46 113t110 47q66 0 113 -47 t47 -113q0 -63 -47.5 -109.5t-112.5 -46.5q-63 0 -109.5 46.5t-46.5 109.5z" /> +<glyph unicode=" " horiz-adv-x="356" /> +<glyph unicode="‹" horiz-adv-x="643" d="M33 510v8q31 25 200 217l189 211l141 -41l-293 -391l293 -391l-141 -41l-165 182l-107 121l-59 66q-26 29 -36 39t-22 20z" /> +<glyph unicode="›" horiz-adv-x="643" d="M80 123l295 391l-295 391l141 41q356 -399 375 -416q6 -6 14 -12v-8q-12 -10 -22 -20.5l-36 -38.5l-58 -66l-108 -121l-165 -182z" /> +<glyph unicode=" " horiz-adv-x="446" /> +<glyph unicode="€" horiz-adv-x="1155" d="M76 365v118h106q-4 45 -4 74q0 27 4 84h-106v119h131q53 182 195.5 294.5t342.5 112.5q82 0 162 -18.5t121 -38.5l39 -18l-63 -197q-113 76 -254 76q-205 0 -279 -211h494l-35 -119h-486q-2 -23 -2 -68q0 -47 7 -90h438l-35 -118h-373q80 -193 279 -193q57 0 119.5 15.5 t97.5 29.5l33 16l49 -182q-127 -76 -318 -76q-201 0 -342 104.5t-194 285.5h-127z" /> +<glyph unicode="™" horiz-adv-x="1433" d="M72 1257v109h493v-109h-178v-436h-137v436h-178zM653 821l21 545h194l117 -340l119 340h192l21 -545h-133l-17 396l-139 -396h-90l-139 398l-13 -398h-133z" /> +<glyph unicode="" horiz-adv-x="930" d="M0 930h930v-930h-930v930z" /> +<glyph unicode="fi" horiz-adv-x="1150" d="M45 750v137l145 51v57q0 240 130.5 376t338.5 136q172 -2 293 -80l-90 -180q-96 63 -205 64q-211 0 -211 -297v-82h574v-932h-254v760h-320v-760h-256v750h-145z" /> +<glyph unicode="fl" horiz-adv-x="1187" d="M45 750v137l145 51v57q0 240 130.5 376t338.5 136q131 0 261 -61l137 22v-1468h-254v1276q-82 35 -146 35q-211 0 -211 -297v-82h250v-182h-250v-750h-256v750h-145z" /> +<glyph unicode="ffi" horiz-adv-x="1781" d="M45 750v137l145 51v29q0 229 128 360t329 131q170 0 293 -90q123 139 330 139q166 -2 282 -80l-90 -180q-88 63 -190 64q-195 0 -195 -277v-102h576v-932h-256v760h-320v-760h-254v760h-377v-760h-256v750h-145zM446 932h377v84q0 96 23 176q-90 70 -195 70 q-205 0 -205 -277v-53z" /> +<glyph unicode="ffl" horiz-adv-x="1818" d="M45 750v137l145 51v29q0 229 128 360t329 131q170 0 293 -90q123 139 330 139q143 0 258 -65l162 26v-1468h-256v1266q-86 45 -160 45q-197 0 -197 -277v-102h250v-182h-250v-750h-254v760h-377v-760h-256v750h-145zM446 932h377v84q0 92 23 176q-90 70 -195 70 q-205 0 -205 -277v-53z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansBold-webfont.ttf b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansBold-webfont.ttf new file mode 100755 index 0000000000000000000000000000000000000000..65b27a67a74d75fe8c06d5ef38f2ee6d024a09ba Binary files /dev/null and b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansBold-webfont.ttf differ diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansBold-webfont.woff b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansBold-webfont.woff new file mode 100755 index 0000000000000000000000000000000000000000..9b82237317f9a7be251948eb43fbf6ecb286c481 Binary files /dev/null and b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansBold-webfont.woff differ diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansLight-webfont.eot b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansLight-webfont.eot new file mode 100755 index 0000000000000000000000000000000000000000..cbc96985981d657802c40a0ec9b343b4f4a4f7c5 Binary files /dev/null and b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansLight-webfont.eot differ diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansLight-webfont.svg b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansLight-webfont.svg new file mode 100755 index 0000000000000000000000000000000000000000..6d39d5257985e88944fa56cec61371b5b4cc8bb0 --- /dev/null +++ b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansLight-webfont.svg @@ -0,0 +1,244 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Fontspring. +</metadata> +<defs> +<font id="webfonty8j6eXvh" horiz-adv-x="1073" > +<font-face units-per-em="2048" ascent="1536" descent="-512" /> +<missing-glyph horiz-adv-x="491" /> +<glyph unicode=" " horiz-adv-x="491" /> +<glyph unicode="	" horiz-adv-x="491" /> +<glyph unicode=" " horiz-adv-x="491" /> +<glyph unicode="!" horiz-adv-x="544" d="M164 86q0 45 32.5 78t77.5 33t78 -33t33 -78t-33 -78t-78 -33t-77.5 33t-32.5 78zM195 1391h153l-20 -1010h-119z" /> +<glyph unicode=""" horiz-adv-x="684" d="M137 903v463h127v-76l-39 -387h-88zM438 903v463h127v-76l-39 -387h-88z" /> +<glyph unicode="#" horiz-adv-x="1298" d="M76 266l18 101h238l59 295h-239l20 102h242l86 420h108l-86 -420h318l86 420h108l-86 -420h273l-21 -102h-272l-62 -295h277l-19 -101h-278l-90 -448h-111l92 448h-317l-90 -448h-111l92 448h-235zM440 367h318l59 295h-315z" /> +<glyph unicode="$" horiz-adv-x="935" d="M84 86l33 123l39 -27q25 -16 105.5 -46t164.5 -34l10 422q-55 20 -88 33.5t-84 43.5t-80.5 60.5t-52 81t-22.5 109.5q0 121 86 199.5t258 89.5l6 178h88l-6 -178q170 -6 278 -60l-39 -112q-104 49 -241 59l-11 -397q315 -119 316 -346q0 -125 -89 -203t-245 -90l-4 -174 h-88l4 170q-96 2 -180 26.5t-121 46.5zM248 860q0 -76 47 -119t145 -79l11 366q-203 -12 -203 -168zM514 106q193 25 193 179q0 76 -47.5 122t-135.5 82z" /> +<glyph unicode="%" horiz-adv-x="1472" d="M84 1036q0 127 87 215t212 88q127 0 214 -88t87 -215t-87 -214t-214 -87q-125 0 -212 87t-87 214zM180 1036q0 -84 59.5 -147.5t143.5 -63.5t143.5 63.5t59.5 147.5t-59.5 147.5t-145.5 63.5q-82 0 -141.5 -63.5t-59.5 -147.5zM209 0l950 1370l80 -57l-915 -1313h-115z M797 276q0 127 87 215.5t214 88.5q125 0 212 -88.5t87 -215.5q0 -125 -87 -213t-212 -88q-127 0 -214 88t-87 213zM895 276.5q0 -83.5 59.5 -147t143.5 -63.5t142 63.5t58 147t-59 147t-145 63.5q-82 0 -140.5 -63.5t-58.5 -147z" /> +<glyph unicode="&" horiz-adv-x="1378" d="M94 313q0 127 80 221.5t225 196.5q-121 213 -120 356q0 113 78.5 208.5t234.5 95.5q131 0 204.5 -73t73.5 -185q0 -127 -78.5 -221.5t-226.5 -198.5q72 -115 164 -232q76 -96 164 -184q176 236 205 621h123q-10 -156 -74 -352.5t-174 -342.5q199 -176 354 -207l-57 -102 q-182 35 -383 213q-166 -152 -379 -152q-172 0 -293 91t-121 247zM223 326q0 -113 90 -173.5t211 -60.5q154 0 281 111q-98 102 -174 196q-88 106 -174 236q-115 -82 -174.5 -152.5t-59.5 -156.5zM422 1092q0 -113 88 -283q113 80 170 146.5t57 150.5q0 70 -40 119t-113 49 q-76 0 -119 -53t-43 -129z" /> +<glyph unicode="'" horiz-adv-x="380" d="M137 903v463h121v-76l-25 -387h-96z" /> +<glyph unicode="(" horiz-adv-x="573" d="M115 553q0 154 30.5 298t74.5 240.5t88 172t75 110.5l31 35l108 -31l-32 -39q-19 -25 -68 -107.5t-88 -172.5t-70 -228.5t-31 -277.5q0 -152 31 -299.5t74 -247.5t86 -178t74 -115l30 -39l-104 -34l-34 39q-22 26 -75 115t-93 187.5t-73.5 254t-33.5 317.5z" /> +<glyph unicode=")" horiz-adv-x="573" d="M45 -326q12 14 31.5 40t71 113t90 182t70.5 243.5t32 300.5q0 139 -29.5 275.5t-72.5 231.5t-85 170t-71 111l-31 37l109 31q12 -12 32.5 -36.5t71.5 -107.5t90 -175.5t72 -237.5t33 -299q0 -459 -236 -815q-41 -63 -73 -98z" /> +<glyph unicode="*" horiz-adv-x="978" d="M98 854l285 115l29 -47l-244 -191zM98 1143l70 123l244 -191l-29 -47zM420 588l43 303h53l43 -303h-139zM420 1409h139l-43 -303h-53zM567 922l27 47l287 -115l-70 -123zM567 1075l244 191l70 -123l-287 -115z" /> +<glyph unicode="+" horiz-adv-x="1064" d="M68 449v120h403v424h131v-424h397v-120h-397v-449h-131v449h-403z" /> +<glyph unicode="," horiz-adv-x="456" d="M82 -274q51 45 70.5 64.5t36 55t16.5 82.5q0 111 -88 230l145 49q72 -82 72 -209q0 -205 -187 -338z" /> +<glyph unicode="-" horiz-adv-x="669" d="M117 438v142h434v-142h-434z" /> +<glyph unicode="." horiz-adv-x="477" d="M127 86q0 45 33 78t80 33q45 0 76.5 -33t31.5 -78t-31.5 -78t-76.5 -33q-47 0 -80 33t-33 78z" /> +<glyph unicode="/" horiz-adv-x="931" d="M49 -401l682 1767h131l-680 -1767h-133z" /> +<glyph unicode="0" horiz-adv-x="1116" d="M109 473q0 207 118.5 358.5t337.5 151.5q211 0 327 -141.5t116 -343.5q0 -133 -45 -248t-151.5 -195t-256.5 -80q-213 0 -329.5 146.5t-116.5 351.5zM240 483q0 -160 83 -275.5t240 -115.5q150 0 232 117t82 276q0 156 -83 268.5t-230.5 112.5t-235.5 -114.5t-88 -268.5z " /> +<glyph unicode="1" horiz-adv-x="694" d="M106 0v115h203v745h-186v98h313v-843h193v-115h-523z" /> +<glyph unicode="2" horiz-adv-x="894" d="M94 90l54 40q34 26 120 100.5t151.5 145t120 162t54.5 162.5q0 74 -51 122t-131 48q-57 0 -120 -25.5t-95 -49.5l-35 -25l-60 84q16 14 46 35.5t117 57.5t167 36q129 0 212 -76t83 -196q0 -78 -40 -161t-114.5 -166t-134 -138.5t-147.5 -128.5h522v-117h-696z" /> +<glyph unicode="3" horiz-adv-x="804" d="M45 856q16 14 46 35.5t117 56.5t167 35q129 0 213 -73.5t84 -192.5q0 -104 -76 -194.5t-180 -147.5q139 -27 215 -111t76 -211q0 -193 -160 -316.5t-416 -123.5q-37 0 -55 2l-13 104q20 -2 60 -2q190 0 320 86t130 234q0 131 -92 188.5t-229 57.5h-64v110 q121 14 235 112.5t114 205.5q0 72 -47.5 115.5t-124.5 43.5q-61 0 -125 -23.5t-97 -47.5l-30 -25z" /> +<glyph unicode="4" horiz-adv-x="1050" d="M59 63v87l631 839h88v-815h199v-111h-199v-458h-127v458h-592zM207 174h444v578z" /> +<glyph unicode="5" horiz-adv-x="808" d="M63 -283q18 -2 60 -2q188 0 321.5 88t133.5 246q0 96 -42 166t-118 107.5t-148.5 57t-167.5 32.5v546h562v-114h-439v-334q215 -41 350.5 -149.5t135.5 -305.5q0 -201 -163 -321.5t-417 -120.5q-39 0 -57 2z" /> +<glyph unicode="6" horiz-adv-x="1030" d="M106 567q0 156 44.5 297.5t128 258t223 188t313.5 80.5l10 -107q-236 -12 -381 -157.5t-188 -366.5q88 113 274 112q195 0 303.5 -124.5t108.5 -307.5q0 -186 -109.5 -325.5t-297.5 -139.5q-207 0 -318 170t-111 422zM242 586q0 -207 75.5 -350.5t219.5 -143.5 q123 0 196.5 96.5t73.5 235.5q0 78 -20.5 147.5t-88 128t-174.5 58.5q-162 0 -282 -121v-51z" /> +<glyph unicode="7" horiz-adv-x="919" d="M68 831v127h792v-94q-219 -541 -586 -1263l-122 32q291 526 563 1198h-647z" /> +<glyph unicode="8" horiz-adv-x="1040" d="M104 317q0 123 83 216.5t235 199.5q-227 178 -227 363q0 137 101 216t251 79q147 0 237 -82t90 -207q0 -104 -66.5 -188.5t-184.5 -170.5q74 -55 116.5 -91t95 -90t77 -112.5t24.5 -121.5q0 -147 -122 -250t-300 -103q-188 0 -299 101.5t-111 240.5zM233 328 q0 -111 85 -172.5t204 -61.5q113 0 195 61.5t82 166.5q0 49 -19.5 92t-74 94t-82.5 74l-111 84q-135 -92 -207 -169t-72 -169zM332 1098q0 -78 52 -145.5t151 -141.5q102 76 157.5 140.5t55.5 142.5q0 90 -65 134t-144 44q-78 0 -142.5 -43t-64.5 -131z" /> +<glyph unicode="9" horiz-adv-x="1024" d="M106 538.5q0 182.5 104.5 313.5t289.5 131q207 0 318.5 -170t111.5 -414q0 -319 -187.5 -549.5t-521.5 -242.5l-10 106q250 18 390 152.5t179 343.5q-92 -113 -274 -113q-188 0 -294 130t-106 312.5zM244 553q0 -55 11 -108.5t40 -109.5t86 -90t137 -34q156 0 275 119 q2 14 2 45q0 207 -79 349t-224 142q-113 0 -180.5 -87t-67.5 -226z" /> +<glyph unicode=":" horiz-adv-x="550" d="M166 86q0 45 31.5 78t78.5 33q45 0 78 -33t33 -78t-32.5 -78t-78.5 -33q-47 0 -78.5 33t-31.5 78zM166 799q0 45 31.5 77.5t78.5 32.5q45 0 78 -32.5t33 -77.5t-32.5 -78t-78.5 -33q-47 0 -78.5 33t-31.5 78z" /> +<glyph unicode=";" horiz-adv-x="540" d="M129 -274q51 45 70.5 64.5t36 55t16.5 82.5q0 111 -88 230l145 49q72 -82 72 -209q0 -205 -186 -338zM158 799q0 45 32.5 77.5t79.5 32.5q45 0 77 -32.5t32 -77.5t-32 -78t-77 -33q-47 0 -79.5 33t-32.5 78z" /> +<glyph unicode="<" horiz-adv-x="1064" d="M68 459v94l872 469l27 -129l-736 -387l736 -408l-27 -127z" /> +<glyph unicode="=" horiz-adv-x="1064" d="M70 252v123h925v-123h-925zM70 651v123h925v-123h-925z" /> +<glyph unicode=">" horiz-adv-x="1064" d="M96 98l731 408l-731 387l27 129l872 -469v-94l-872 -488z" /> +<glyph unicode="?" horiz-adv-x="710" d="M96 1303l29 122l55 -17q35 -11 123 -50t154.5 -81t122 -105.5t55.5 -129.5q0 -51 -34 -104t-82 -105.5t-96 -113t-82 -148.5t-34 -190h-102q-6 29 -6 76q0 96 44 190t96 153.5t96 123t44 106.5q0 66 -96 134.5t-190 103.5zM154 86q0 45 31.5 78t78.5 33t79 -33t32 -78 t-32 -78t-79 -33t-78.5 33t-31.5 78z" /> +<glyph unicode="@" horiz-adv-x="1673" d="M90 401q0 213 97.5 397.5t280.5 300t413 115.5q303 0 494.5 -190t191.5 -477q0 -299 -178 -438q-41 -33 -102.5 -57.5t-99.5 -35t-145 -32.5l-34 -9q-16 80 -25 148q-39 -63 -109.5 -105.5t-148.5 -42.5q-123 0 -204 106.5t-81 285.5q0 252 163 406.5t388 154.5l119 -6 v-654q0 -47 4 -88t8 -57l2 -19q164 20 243 131t79 287q0 258 -151.5 424t-411.5 166q-297 0 -485.5 -212t-188.5 -509q0 -274 159.5 -456.5t383.5 -192.5l-17 -94q-180 6 -329.5 112.5t-232.5 276t-83 364.5zM580 381q0 -121 51 -203t131 -82q113 0 217 158v561 q-174 0 -286.5 -126t-112.5 -308z" /> +<glyph unicode="A" horiz-adv-x="1255" d="M35 0l528 1376h129l529 -1376h-144l-170 449h-565l-170 -449h-137zM385 563h479l-239 631z" /> +<glyph unicode="B" horiz-adv-x="1189" d="M211 0v1366h321q244 0 353.5 -95t109.5 -233q0 -176 -166 -307q37 -12 72 -31.5t80 -56.5t72.5 -100.5t27.5 -145.5q0 -180 -130 -288.5t-337 -108.5h-403zM346 113h238q176 0 263 70.5t87 195.5t-87 197.5t-263 72.5h-238v-536zM346 764h332q6 4 18.5 11t42 31.5 t52 53.5t41 77t18.5 99q0 217 -348 217h-156v-489z" /> +<glyph unicode="C" horiz-adv-x="1376" d="M111 678q0 303 199.5 508t523.5 205q115 0 226 -30t165 -58l53 -31l-55 -125q-18 14 -53 35.5t-140.5 57.5t-210.5 36q-137 0 -247.5 -52.5t-177 -138.5t-101.5 -188t-35 -211q0 -244 160 -420t409 -176q207 0 396 131l14 10l55 -102q-8 -6 -23.5 -16.5t-64.5 -37 t-101 -47t-132 -37t-158 -16.5q-307 0 -504.5 200t-197.5 503z" /> +<glyph unicode="D" horiz-adv-x="1476" d="M211 0v1366h389q147 0 277.5 -36t242 -111.5t177 -207.5t65.5 -306q0 -336 -229.5 -520.5t-610.5 -184.5h-311zM346 113h156q373 0 544 156.5t171 414.5q0 264 -168 416.5t-478 152.5h-225v-1140z" /> +<glyph unicode="E" horiz-adv-x="1103" d="M211 0v1366h784v-113h-649v-497h514v-113h-514v-530h641v-113h-776z" /> +<glyph unicode="F" horiz-adv-x="1036" d="M211 0v1366h762v-113h-627v-503h496v-123h-496v-627h-135z" /> +<glyph unicode="G" horiz-adv-x="1423" d="M111 666q0 301 194.5 513t528.5 212q119 0 231.5 -26t165.5 -50l53 -27l-55 -127q-18 12 -53 31.5t-140.5 51.5t-212.5 32q-182 0 -314 -89t-192.5 -221t-60.5 -288q0 -254 165 -421t447 -167q61 0 130 10.5t108 20.5l37 10v440h-299v113h434v-645q-238 -63 -436 -64 q-309 0 -520 188t-211 503z" /> +<glyph unicode="H" horiz-adv-x="1538" d="M211 0v1366h135v-612h846v612h135v-1366h-135v641h-846v-641h-135z" /> +<glyph unicode="I" horiz-adv-x="557" d="M211 0v1366h135v-1366h-135z" /> +<glyph unicode="J" horiz-adv-x="559" d="M-16 -252q72 8 120 50t70.5 103.5t30.5 115t8 110.5v1239h135v-1239q0 -82 -16.5 -159t-50 -147.5t-95 -118.5t-143.5 -60z" /> +<glyph unicode="K" horiz-adv-x="1155" d="M211 0v1366h135v-594h25l577 594h172l-633 -641l658 -725h-182l-592 659h-25v-659h-135z" /> +<glyph unicode="L" horiz-adv-x="1044" d="M211 0v1366h135v-1253h668v-113h-803z" /> +<glyph unicode="M" horiz-adv-x="1755" d="M190 0l48 1366h192l442 -1192l449 1192h195l49 -1366h-131l-43 1196l-461 -1196h-111l-461 1210l-36 -1210h-132z" /> +<glyph unicode="N" horiz-adv-x="1529" d="M211 0v1366h133l844 -1167v1167h131v-1366h-133l-844 1149v-1149h-131z" /> +<glyph unicode="O" horiz-adv-x="1624" d="M111 680q0 289 194.5 500t517.5 211q305 0 497.5 -196t192.5 -486q0 -299 -200.5 -516.5t-507.5 -217.5q-301 0 -497.5 206t-196.5 499zM256 694q0 -147 62.5 -282.5t193.5 -227.5t299 -92q250 0 402.5 182.5t152.5 418t-150.5 408.5t-404.5 173q-252 0 -403.5 -175.5 t-151.5 -404.5z" /> +<glyph unicode="P" horiz-adv-x="1138" d="M211 0v1366h367q248 0 364.5 -109.5t116.5 -281.5q0 -201 -131 -314.5t-350 -113.5h-232v-547h-135zM346 659h205q182 0 272 78t90 224q0 131 -87 211.5t-275 80.5h-205v-594z" /> +<glyph unicode="Q" horiz-adv-x="1624" d="M115 680q0 186 80.5 346t244.5 262.5t377 102.5q309 0 504 -196t195 -486q0 -252 -148.5 -452t-390.5 -261q55 -74 93 -116t106.5 -104.5t149.5 -93t173 -32.5l-18 -125h-15q-68 0 -133 16q-72 18 -122 45t-103 72t-80 72.5t-65.5 73.5t-44.5 55l-62 71q-35 43 -119 47 q-276 25 -449 227t-173 476zM260 694q0 -150 61.5 -284t190.5 -225t299 -91q248 0 403.5 183.5t155.5 416.5q0 229 -150.5 404.5t-404.5 175.5q-168 0 -298 -86t-193.5 -217.5t-63.5 -276.5z" /> +<glyph unicode="R" horiz-adv-x="1189" d="M211 0v1366h326q246 0 363.5 -103.5t117.5 -256.5q0 -139 -89 -236.5t-210 -148.5l424 -621h-160l-410 596h-227v-596h-135zM346 711h238q100 0 193 75.5t93 202.5q0 113 -87 188.5t-273 75.5h-164v-542z" /> +<glyph unicode="S" horiz-adv-x="1038" d="M104 90l35 131q18 -14 51 -34.5t127.5 -55.5t184.5 -35q127 0 210 57.5t83 159.5q0 92 -69 163t-166 121l-194 104q-97 54 -166 141.5t-69 204.5q0 152 115.5 248t318.5 96q178 0 340 -62l-43 -129q-147 70 -305 70q-129 0 -210 -53.5t-81 -153.5q0 -94 68.5 -165 t166.5 -121l194 -103q97 -53 166 -141.5t69 -208.5q0 -168 -124 -258.5t-314 -90.5q-104 0 -200.5 29t-141.5 57z" /> +<glyph unicode="T" horiz-adv-x="1206" d="M35 1253v113h1136v-113h-507v-1253h-134v1253h-495z" /> +<glyph unicode="U" horiz-adv-x="1476" d="M193 485v881h133v-846q0 -215 113.5 -321.5t299.5 -106.5q184 0 298 103.5t114 310.5v860h133v-852q0 -256 -153.5 -397.5t-393.5 -141.5q-244 0 -394 124t-150 386z" /> +<glyph unicode="V" horiz-adv-x="1193" d="M35 1366h141l422 -1182l424 1182h137l-497 -1376h-132z" /> +<glyph unicode="W" horiz-adv-x="1916" d="M55 1366h138l354 -1180l336 1180h157l332 -1176l359 1176h133l-422 -1376h-137l-344 1173l-347 -1173h-137z" /> +<glyph unicode="X" horiz-adv-x="1191" d="M57 0l461 680l-461 686h160l381 -580l381 580h154l-459 -682l459 -684h-158l-381 580l-383 -580h-154z" /> +<glyph unicode="Y" horiz-adv-x="1153" d="M23 1366h159l398 -635l401 635h149l-485 -762v-604h-135v602z" /> +<glyph unicode="Z" horiz-adv-x="1183" d="M74 0v74l831 1179h-778v113h954v-74l-821 -1179h830v-113h-1016z" /> +<glyph unicode="[" horiz-adv-x="585" d="M182 -313v1679h361v-100h-246v-1477h246v-102h-361z" /> +<glyph unicode="\" horiz-adv-x="927" d="M70 1366h127l682 -1767h-129z" /> +<glyph unicode="]" horiz-adv-x="587" d="M43 -205h246v1462h-246v109h363v-1679h-363v108z" /> +<glyph unicode="^" horiz-adv-x="1028" d="M33 512l438 879h88l438 -879h-145l-340 682l-340 -682h-139z" /> +<glyph unicode="_" horiz-adv-x="1110" d="M43 -76h1024v-114h-1024v114z" /> +<glyph unicode="`" horiz-adv-x="1028" d="M338 1425h154l206 -342l-84 -49z" /> +<glyph unicode="a" horiz-adv-x="944" d="M80 201q0 279 557 354v61q0 39 -1 61.5t-10.5 53.5t-25.5 48.5t-47 29.5t-76 12q-152 -2 -287 -98l-45 111q16 12 47 30.5t127.5 48t192.5 29.5q133 0 191.5 -67.5t58.5 -221.5v-436q0 -55 25.5 -87t52.5 -36l24 -4l-47 -104q-84 14 -123 52t-51 101q-18 -25 -43 -52.5 t-103.5 -69.5t-164.5 -42q-115 0 -183.5 63t-68.5 163zM219 209q0 -111 131 -111q59 0 117.5 31t90.5 60.5t79 80.5v179q-217 -37 -317.5 -93.5t-100.5 -146.5z" /> +<glyph unicode="b" horiz-adv-x="1056" d="M162 16v1420l125 24v-651q35 51 110.5 92t169.5 41q172 0 281.5 -129t109.5 -328q0 -215 -130 -359t-379 -151h-10q-107 0 -277 41zM287 115q68 -25 164 -25q168 0 270 101.5t102 285.5q0 160 -73.5 253t-194.5 93q-154 0 -268 -143v-565z" /> +<glyph unicode="c" horiz-adv-x="925" d="M98 446.5q0 200.5 121 348t332 147.5q86 0 159.5 -25.5t104.5 -52.5l31 -24l-66 -103q-10 10 -30.5 24.5t-82 38t-124.5 23.5q-143 0 -227.5 -106.5t-84.5 -255.5q0 -154 86 -260.5t232 -106.5q68 0 130 24.5t91 49.5l29 27l47 -101q-12 -12 -37 -32.5t-106.5 -53.5 t-170.5 -33q-193 0 -313.5 135.5t-120.5 336z" /> +<glyph unicode="d" horiz-adv-x="1085" d="M100 428q0 213 134.5 363.5t369.5 150.5q111 0 187 -33v527l124 24v-1175q0 -49 10.5 -121t20.5 -119l10 -45l-129 -14q-18 88 -28 153q-43 -70 -124 -117t-183 -47q-172 0 -282 130t-110 323zM236 438q0 -158 76.5 -250t191.5 -92q162 0 287 187v397q0 147 -187 147 q-164 0 -266 -104.5t-102 -284.5z" /> +<glyph unicode="e" horiz-adv-x="993" d="M100 434q0 221 122 364.5t313 143.5q160 0 259 -105.5t99 -289.5l-84 -25l-571 -73q8 -162 92 -258.5t227 -96.5q72 0 144.5 29t109.5 57l39 31l39 -107q-14 -14 -41 -35.5t-116 -57.5t-183 -36q-215 0 -332 134.5t-117 324.5zM244 561l510 66q0 8 -3 21.5t-18.5 49 t-38 62t-66.5 48t-100 21.5q-115 0 -189.5 -74.5t-94.5 -193.5z" /> +<glyph unicode="f" horiz-adv-x="647" d="M61 809v63l146 58v104q0 215 95 333t263 118q66 0 127.5 -19.5t89.5 -38.5l31 -18l-68 -104q-94 66 -188 65q-96 0 -160.5 -81t-64.5 -249v-122h264v-109h-264v-809h-125v809h-146z" /> +<glyph unicode="g" horiz-adv-x="1017" d="M63 -236q0 168 246 281q-154 45 -153 127q0 31 25.5 63.5t46.5 48.5l63 44q-82 43 -128 120.5t-46 172.5q0 145 107.5 233t258.5 88q57 0 137 -19.5t130 -19.5h90q25 0 55.5 5t46.5 10l19 6l14 -129h-123q-57 0 -72 2q68 -76 68 -195q0 -150 -117 -233.5t-260 -83.5 q-49 0 -82 8q-90 -66 -90 -94q0 -31 53.5 -48.5t179.5 -41.5q23 -4 35 -7q84 -16 136.5 -31.5t110.5 -43t86 -71.5t28 -103q0 -141 -144.5 -239.5t-339.5 -98.5q-156 0 -268.5 65t-112.5 184zM184 -221q0 -86 87 -124t188 -38q135 0 234.5 66.5t99.5 152.5q0 66 -59.5 99.5 t-168.5 56.5q-90 16 -137 26q-78 -41 -121 -67.5t-83 -73.5t-40 -98zM254 612q0 -94 58.5 -158.5t170.5 -64.5q100 0 165 53.5t65 149.5t-61.5 171t-174.5 75q-100 0 -161.5 -64t-61.5 -162z" /> +<glyph unicode="h" horiz-adv-x="1075" d="M166 0v1436l125 24v-710q199 193 391 192q106 0 172 -64.5t66 -205.5v-672h-125v649q0 180 -138 180q-141 0 -366 -208v-621h-125z" /> +<glyph unicode="i" horiz-adv-x="454" d="M133 1262q0 41 30 69.5t68.5 28.5t67.5 -30t29 -68q0 -41 -29 -71t-67.5 -30t-68.5 30t-30 71zM166 0v918h125v-918h-125z" /> +<glyph unicode="j" horiz-adv-x="454" d="M-47 -375q213 45 213 342v951h125v-912q0 -231 -72 -348t-225 -143zM131 1262q0 41 28.5 69.5t69.5 28.5q39 0 68 -30t29 -68q0 -41 -29 -71t-68 -30t-68.5 30t-29.5 71z" /> +<glyph unicode="k" horiz-adv-x="931" d="M166 0v1436l125 24v-909h18l387 367h172l-442 -408l489 -510h-172l-432 457h-20v-457h-125z" /> +<glyph unicode="l" horiz-adv-x="454" d="M166 0v1436l125 24v-1460h-125z" /> +<glyph unicode="m" horiz-adv-x="1638" d="M162 0v905l125 25v-187q215 199 385 199q178 0 215 -180q188 180 373 180q98 0 160.5 -65.5t62.5 -204.5v-672h-125v649q0 180 -121 180q-131 0 -342 -188v-641h-125v649q0 180 -123 180q-59 0 -142 -47t-131 -88t-87 -80v-614h-125z" /> +<glyph unicode="n" d="M162 0v905l125 25v-187q215 199 395 199q104 0 170 -65.5t66 -204.5v-672h-125v649q0 180 -136 180q-88 0 -194.5 -72.5t-175.5 -142.5v-614h-125z" /> +<glyph unicode="o" d="M98 463q0 193 119 336t317.5 143t319.5 -140t121 -335t-120 -343.5t-320 -148.5q-197 0 -317 146.5t-120 341.5zM231 475q0 -156 80 -269.5t226 -113.5q135 0 220 100.5t85 260.5q0 154 -78 263t-229 109q-139 0 -221.5 -97t-82.5 -253z" /> +<glyph unicode="p" horiz-adv-x="1062" d="M162 -473v1378l123 25v-142q37 66 111.5 110t176.5 44q176 0 283 -131t107 -326q0 -217 -129 -363.5t-336 -146.5q-133 0 -211 64v-488zM287 227q2 -66 57 -101.5t143 -35.5q154 0 247 104.5t93 280.5q0 158 -74.5 250t-189.5 92q-162 0 -276 -162v-428z" /> +<glyph unicode="q" horiz-adv-x="1056" d="M98 430q0 213 133.5 362.5t378.5 149.5q63 0 134 -10t112 -21l39 -10v-1350l-125 -24v586q-33 -53 -106.5 -95.5t-171.5 -42.5q-174 0 -284 128t-110 327zM233 438q0 -156 76 -250t195 -94q156 0 266 146v565q-74 23 -172 22q-162 0 -263.5 -102.5t-101.5 -286.5z" /> +<glyph unicode="r" horiz-adv-x="661" d="M162 0v905l125 25v-185q117 197 268 197q23 0 43 -4t29 -8l8 -6l-39 -138q-37 14 -76 15q-119 0 -233 -209v-592h-125z" /> +<glyph unicode="s" horiz-adv-x="790" d="M92 57l29 117q119 -88 266 -88q88 0 135 37t47 100q0 61 -47 105.5t-114.5 74t-135 63.5t-114.5 93t-47 141q0 109 79.5 175.5t237.5 66.5q66 0 128 -12t91 -25l29 -14l-39 -109q-113 49 -225 49q-84 0 -128 -32.5t-44 -87.5q0 -57 47 -99.5t114.5 -72t135 -64.5 t114.5 -96.5t47 -147.5q0 -121 -87 -188.5t-234 -67.5q-174 2 -285 82z" /> +<glyph unicode="t" horiz-adv-x="714" d="M74 809v68l125 53v200l125 35v-247h305v-109h-305v-541q0 -96 29.5 -137t88.5 -41q45 0 95.5 21.5t76.5 44.5l29 20l31 -110q-12 -10 -34 -25.5t-88.5 -40.5t-131.5 -25q-221 0 -221 263v571h-125z" /> +<glyph unicode="u" horiz-adv-x="1054" d="M152 250v668h124v-650q0 -180 144 -180q145 0 340 188v642h125v-633q0 -49 10 -121t20 -119l11 -47l-125 -10q-23 100 -31 166q-178 -178 -371 -179q-247 1 -247 275z" /> +<glyph unicode="v" horiz-adv-x="919" d="M45 918h133l258 -764l316 764h133l-396 -930h-122z" /> +<glyph unicode="w" horiz-adv-x="1499" d="M49 918h133l234 -773l282 773h119l221 -773l291 773h135l-377 -930h-120l-224 741l-280 -741h-121z" /> +<glyph unicode="x" horiz-adv-x="915" d="M66 0l315 459l-315 459h153l240 -361l241 361h150l-315 -455l315 -463h-145l-250 371l-250 -371h-139z" /> +<glyph unicode="y" horiz-adv-x="921" d="M41 918h137l289 -672l278 672h138l-422 -988q-80 -188 -161 -293.5t-208 -121.5l-41 110q94 18 158.5 93t122.5 206l69 158z" /> +<glyph unicode="z" horiz-adv-x="876" d="M88 0v76l508 731h-492v111h666v-74l-514 -731h535v-113h-703z" /> +<glyph unicode="{" horiz-adv-x="698" d="M37 485v105q55 2 99 23.5t72 50t48 82t29.5 95.5t14.5 113.5t6 114.5t1 121q0 166 111.5 247t298.5 81v-95q-70 -6 -117 -14t-80 -30.5t-49 -41t-25.5 -65.5t-11.5 -81t-4 -110q-6 -260 -59.5 -376.5t-161.5 -163.5v-4q104 -47 159.5 -172t61.5 -392q2 -74 4 -108.5 t11.5 -80.5t26.5 -65.5t49 -41t79 -30.5t117 -16v-94q-244 0 -327 95.5t-83 336.5q0 117 -13 207t-39 143.5t-51.5 89t-60 51t-56 19.5t-50.5 6z" /> +<glyph unicode="|" horiz-adv-x="475" d="M180 -461v1995h115v-1995h-115z" /> +<glyph unicode="}" horiz-adv-x="698" d="M-18 -369q59 4 102 14.5t74.5 20.5t51 35t31 42t17.5 61t7 74t3 95q6 266 61.5 391t159.5 173v4q-106 47 -160.5 159.5t-60.5 380.5q-2 74 -4 109t-11 81t-26.5 65.5t-49.5 42t-79 30.5t-116 14v95q229 0 319 -93.5t90 -349.5q0 -131 22.5 -227t50.5 -143.5t72 -75 t68.5 -32.5t59.5 -7v-105q-51 -2 -91.5 -19t-85.5 -66.5t-70.5 -159t-25.5 -273.5q0 -240 -82 -335t-327 -95v94z" /> +<glyph unicode="~" horiz-adv-x="1191" d="M137 362q0 309 260 310q80 0 142.5 -32t94.5 -68.5t76 -68.5t93 -32q137 0 137 193h119q0 -309 -260 -310q-80 0 -142.5 32t-94.5 69t-76 68.5t-93 31.5q-137 0 -137 -193h-119z" /> +<glyph unicode="¡" horiz-adv-x="503" d="M137 831.5q0 45.5 32 78t79 32.5t78.5 -32.5t31.5 -78t-31.5 -78t-78.5 -32.5t-79 32.5t-32 78zM174 -473l21 1010h118l15 -1010h-154z" /> +<glyph unicode="¢" horiz-adv-x="903" d="M90 569.5q0 157.5 92 280.5t254 147l4 181h88l-4 -174q176 -6 275 -115l8 -10l-80 -97q-8 10 -24.5 24.5t-70.5 42.5t-112 34l-14 -627h4q68 0 130 25.5t91 50.5l29 24l47 -100q-12 -12 -35.5 -32.5t-101.5 -53.5t-162 -33h-4l-4 -182h-86l4 190q-150 31 -239 149 t-89 275.5zM229 575q0 -109 50.5 -191.5t140.5 -113.5l14 609q-96 -23 -150.5 -108t-54.5 -196z" /> +<glyph unicode="£" horiz-adv-x="1091" d="M84 104q6 2 14 5.5t31 17.5t41 33.5t35.5 54.5t23.5 76l25 198h-127v97h139l23 172q23 188 102.5 291.5t243.5 103.5q182 0 291 -113l8 -10l-80 -96q-8 10 -25.5 27.5t-77 45t-124.5 27.5q-90 0 -143.5 -61.5t-69.5 -220.5l-19 -166h398l-11 -97h-395q-10 -98 -28.5 -187 t-32.5 -128l-15 -39q217 -70 344 -69q197 0 222 190l8 66h110q-35 -373 -313 -373q-80 0 -235.5 39t-200.5 39q-53 0 -121 -27z" /> +<glyph unicode="¥" horiz-adv-x="1130" d="M84 1128h152l329 -512l336 512h139l-313 -479h215v-98h-280l-35 -55v-80h315v-99h-315v-317h-125v317h-295v99h295v78l-39 57h-256v98h192z" /> +<glyph unicode="¦" horiz-adv-x="516" d="M193 350h133v-733h-133v733zM193 668v733h133v-733h-133z" /> +<glyph unicode="§" horiz-adv-x="999" d="M57 -379l62 94q127 -96 264 -96q127 0 195.5 93t68.5 241q0 59 -12 125l-115 631q-23 131 -22 204q0 135 53 213l102 -22q-35 -76 -35 -189q0 -53 11 -114l125 -707q12 -70 12 -139q0 -190 -96.5 -315t-282.5 -125q-176 0 -324 102zM205 948q0 190 96 316.5t285 126.5 q84 0 166 -27t120 -53l41 -27l-61 -94q-125 96 -262 96q-129 0 -197.5 -94t-68.5 -242q0 -61 12 -123l115 -630q20 -119 20 -205q0 -137 -51 -213l-103 22q35 82 35 189q0 53 -10 114l-125 707q-12 69 -12 137z" /> +<glyph unicode="¨" horiz-adv-x="1028" d="M246 1261.5q0 36.5 29.5 65.5t66.5 29q35 0 63.5 -29t28.5 -65.5t-28.5 -65.5t-63.5 -29q-37 0 -66.5 29t-29.5 65.5zM590 1261.5q0 36.5 29.5 65.5t64.5 29q37 0 65.5 -29t28.5 -65.5t-28.5 -65.5t-65.5 -29q-35 0 -64.5 29t-29.5 65.5z" /> +<glyph unicode="©" horiz-adv-x="1601" d="M94 682q0 293 207 500t500 207t499.5 -207t206.5 -500t-206.5 -500t-499.5 -207t-500 207t-207 500zM195 682q0 -256 176 -436t430 -180t430 180t176 436t-176 436t-430 180t-430 -180t-176 -436zM406 674q0 174 110.5 301t306.5 127q172 0 285 -113l10 -10l-92 -107 q-8 10 -25.5 26.5t-72 43.5t-111.5 27q-113 0 -181.5 -83t-68.5 -200t77 -197.5t202 -80.5q59 0 112.5 24.5t77.5 48.5l23 25l55 -113q-10 -12 -31.5 -32.5t-96.5 -53.5t-161 -33q-184 0 -301.5 116t-117.5 284z" /> +<glyph unicode="ª" horiz-adv-x="786" d="M104 872q0 207 392 261v28q0 47 -4.5 70.5t-29 44t-71.5 20.5q-49 0 -101 -19.5t-81 -39.5l-27 -20l-32 98q109 76 272 76q104 0 146 -46.5t42 -156.5v-293q8 -74 74 -82l-37 -94q-121 6 -145 104q-88 -111 -221 -110q-80 0 -128.5 43.5t-48.5 115.5zM229 879 q0 -72 76 -72q39 0 79 23.5t59.5 44t52.5 61.5v111q-141 -27 -204 -67t-63 -101z" /> +<glyph unicode="«" horiz-adv-x="1046" d="M55 510v8q35 27 281 295l123 133l98 -26l-313 -406l313 -405l-98 -27l-170 182l-112 121l-61 66l-38 38q-11 11 -23 21zM442 510v8q35 27 281 295l123 133l100 -26l-315 -406l315 -405l-100 -27l-170 182l-112 121l-61 66l-38 38q-11 11 -23 21z" /> +<glyph unicode="¬" horiz-adv-x="1181" d="M115 670v123h936v-566h-131v443h-805z" /> +<glyph unicode="­" horiz-adv-x="669" d="M117 438v142h434v-142h-434z" /> +<glyph unicode="®" horiz-adv-x="890" d="M92 1087.5q0 145.5 104.5 250t250 104.5t250 -104.5t104.5 -250t-104.5 -250t-250 -104.5t-250 104.5t-104.5 250zM160 1087.5q0 -120.5 83 -208.5t199 -88q119 0 205 88t86 208.5t-86 207.5t-205 87q-117 0 -199.5 -87t-82.5 -207.5zM315 918v348h123q143 0 144 -105 q0 -70 -72 -100l104 -143h-90l-88 126h-41v-126h-80zM395 1098h49q53 0 54 55q0 57 -68 57h-35v-112z" /> +<glyph unicode="¯" horiz-adv-x="1028" d="M291 1212v113h446v-113h-446z" /> +<glyph unicode="°" horiz-adv-x="692" d="M96 1144.5q0 102.5 73 174.5t177.5 72t177 -72t72.5 -174.5t-72.5 -174t-177 -71.5t-177.5 71.5t-73 174zM193 1144.5q0 -65.5 44 -110.5t109 -45q63 0 107.5 45t44.5 110.5t-44 112t-107.5 46.5t-108.5 -46.5t-45 -112z" /> +<glyph unicode="±" horiz-adv-x="1064" d="M70 0v121h925v-121h-925zM74 647v121h389v375h131v-375h397v-121h-397v-411h-131v411h-389z" /> +<glyph unicode="²" horiz-adv-x="692" d="M57 819l86 86q59 59 84 86l70 75q45 48 64 78l45 69q25 40 34 75t9 70q0 72 -40 111.5t-100 39.5q-41 0 -83 -19.5t-64 -39.5l-23 -18l-63 71q10 12 31.5 30.5t89 48.5t139.5 30q113 0 174 -69.5t61 -166.5q0 -104 -80.5 -225t-248.5 -283h391v-98h-565z" /> +<glyph unicode="³" horiz-adv-x="655" d="M53 815l47 90q78 -47 174 -47q78 0 125 35t47 96q0 70 -63.5 108t-157.5 38h-39v96q84 8 154 58t70 126q0 96 -111 96q-90 0 -164 -55l-47 78q100 78 219 78q96 0 160.5 -51.5t64.5 -133.5q0 -121 -165 -213q92 -20 147 -80.5t55 -138.5q0 -102 -88 -170.5t-213 -68.5 q-129 0 -215 59z" /> +<glyph unicode="´" horiz-adv-x="1017" d="M330 1083l205 342h155l-276 -391z" /> +<glyph unicode="µ" horiz-adv-x="1128" d="M152 -442q20 199 20 362v998h125v-650q0 -180 143 -180q152 0 340 188v642h125v-703q0 -82 24.5 -107.5t108.5 -25.5v-96q-55 -10 -88 -11q-88 0 -126 46.5t-44 130.5q-176 -176 -360 -177q-76 0 -127 25q2 -90 7 -248t5 -194h-153z" /> +<glyph unicode="μ" horiz-adv-x="1128" d="M152 -442q20 199 20 362v998h125v-650q0 -180 143 -180q152 0 340 188v642h125v-703q0 -82 24.5 -107.5t108.5 -25.5v-96q-55 -10 -88 -11q-88 0 -126 46.5t-44 130.5q-176 -176 -360 -177q-76 0 -127 25q2 -90 7 -248t5 -194h-153z" /> +<glyph unicode="¶" horiz-adv-x="1343" d="M72 864q0 203 154.5 352.5t430.5 149.5h582v-111h-152v-1255h-118v1255h-154v-1296q0 -444 -352 -444l-31 123q133 0 193.5 73.5t60.5 241.5v414h-18q-291 0 -443.5 145t-152.5 352z" /> +<glyph unicode="·" horiz-adv-x="505" d="M143 520q0 45 33 77t78 32t76.5 -32t31.5 -77t-31.5 -77.5t-76.5 -32.5t-78 32.5t-33 77.5z" /> +<glyph unicode="¸" horiz-adv-x="1028" d="M338 -422l41 96q66 -57 139 -57q45 0 77 21.5t32 50.5q0 25 -26 43t-56.5 29.5t-56 34t-25.5 52.5q0 16 6 35t17.5 45.5t13.5 32.5l16 39h96l-16 -33q-25 -59 -25 -71q0 -23 27 -42.5t59.5 -33t59 -44t26.5 -73.5q0 -74 -63.5 -131t-155.5 -57q-104 0 -186 63z" /> +<glyph unicode="¹" horiz-adv-x="550" d="M70 770v90h166v647h-154v90h274v-737h158v-90h-444z" /> +<glyph unicode="º" horiz-adv-x="835" d="M94 1047q0 133 89 238.5t237 105.5q141 0 229 -97.5t88 -228.5q0 -135 -86 -243.5t-237 -108.5q-143 0 -231.5 101.5t-88.5 232.5zM215 1061q0 -104 52 -179t151 -75q88 0 143 66.5t55 173.5q0 102 -50 175.5t-150 73.5q-92 0 -146.5 -64.5t-54.5 -170.5z" /> +<glyph unicode="»" horiz-adv-x="1050" d="M104 109l316 405l-316 406l101 26q362 -395 403 -428v-8q-10 -8 -21.5 -18.5l-24.5 -23.5t-43 -46l-64 -71l-104 -111l-146 -158zM492 109l315 405l-315 406l100 26q367 -397 393 -420q4 -4 10 -8v-8q-12 -10 -22 -21l-38 -38l-62 -66l-111 -121l-170 -182z" /> +<glyph unicode="¼" horiz-adv-x="1646" d="M98 553v90h166v647h-153v90h274v-737h158v-90h-445zM332 0l811 1403l104 -37l-784 -1366h-131zM936 289l418 545h90v-512h127v-95h-127v-227h-117v227h-383zM1073 322h254v329z" /> +<glyph unicode="½" horiz-adv-x="1779" d="M96 553v90h166v647h-153v90h274v-737h158v-90h-445zM317 0l811 1403l105 -37l-784 -1366h-132zM1130 49l87 86q59 59 83 86l70 75q45 48 65 78l44 69q25 40 34 75t9 70q0 72 -40 111.5t-100 39.5q-41 0 -83 -19.5t-64 -39.5l-23 -18l-63 71q10 12 31.5 30.5t89 48.5 t139.5 30q113 0 174.5 -70t61.5 -166q0 -104 -81 -225t-249 -283h391v-98h-565z" /> +<glyph unicode="¾" horiz-adv-x="1611" d="M86 598l47 90q78 -47 174 -47q78 0 125 35t47 96q0 70 -63.5 108t-157.5 38h-39v96q84 8 153.5 58t69.5 126q0 96 -110 96q-90 0 -164 -55l-47 78q100 78 219 78q96 0 160.5 -51.5t64.5 -133.5q0 -121 -166 -213q92 -20 147.5 -80.5t55.5 -138.5q0 -102 -88 -170.5 t-213 -68.5q-129 0 -215 59zM295 0l811 1403l104 -37l-784 -1366h-131zM901 289l418 545h90v-512h127v-95h-127v-227h-117v227h-383zM1038 322h254v329z" /> +<glyph unicode="¿" horiz-adv-x="694" d="M74 -104q0 49 33.5 101t82 103.5t96.5 109.5t81.5 143t33.5 184h103q6 -29 6 -76q0 -94 -44 -184.5t-96.5 -147.5t-96.5 -118.5t-44 -102.5q0 -66 96.5 -134.5t190.5 -103.5l96 -35l-28 -122l-56 17q-35 11 -123 50t-154.5 81t-121.5 105.5t-55 129.5zM334 831.5 q0 45.5 31.5 78t79 32.5t79 -32.5t31.5 -78t-31.5 -78t-79 -32.5t-79 32.5t-31.5 78z" /> +<glyph unicode="À" horiz-adv-x="1255" d="M35 0l528 1376h129l529 -1376h-144l-170 449h-565l-170 -449h-137zM354 1624l60 133l379 -194l-35 -86zM385 563h479l-239 631z" /> +<glyph unicode="Á" horiz-adv-x="1255" d="M35 0l528 1376h129l529 -1376h-144l-170 449h-565l-170 -449h-137zM385 563h479l-239 631zM457 1563l377 194l61 -133l-403 -147z" /> +<glyph unicode="Â" horiz-adv-x="1255" d="M35 0l528 1376h129l529 -1376h-144l-170 449h-565l-170 -449h-137zM307 1544l258 240h121l256 -240l-78 -74l-237 211l-242 -211zM385 563h479l-239 631z" /> +<glyph unicode="Ã" horiz-adv-x="1255" d="M35 0l528 1376h129l529 -1376h-144l-170 449h-565l-170 -449h-137zM268 1505q0 18 5.5 46t22.5 76t64.5 81t116.5 33q66 0 116 -35t89 -68.5t82 -33.5q33 0 55.5 18t30.5 46t10 44.5t2 28.5h117q0 -8 -2 -22.5t-7 -45.5t-19.5 -59.5t-37 -56t-61.5 -44t-88 -16.5 q-53 0 -95 21.5t-65.5 47t-56.5 47t-65.5 21.5t-55.5 -18.5t-30 -46t-9 -40.5t-2 -24h-117zM385 563h479l-239 631z" /> +<glyph unicode="Ä" horiz-adv-x="1255" d="M35 0l528 1376h129l529 -1376h-144l-170 449h-565l-170 -449h-137zM305 1624q0 35 28.5 63.5t65.5 28.5q35 0 64 -28.5t29 -63.5q0 -37 -29 -65.5t-64 -28.5q-37 0 -65.5 27.5t-28.5 66.5zM385 563h479l-239 631zM760 1624q0 35 28.5 63.5t63.5 28.5q37 0 65.5 -28.5 t28.5 -63.5q0 -39 -28.5 -66.5t-65.5 -27.5q-35 0 -63.5 28.5t-28.5 65.5z" /> +<glyph unicode="Å" horiz-adv-x="1255" d="M35 0l528 1376h129l529 -1376h-144l-170 449h-565l-170 -449h-137zM385 563h479l-239 631zM436 1622q0 66 49.5 114t139.5 48t139 -48t49 -114q0 -68 -49 -116t-139 -48t-139.5 48t-49.5 116zM526 1620q0 -39 26 -67.5t73 -28.5t73.5 28.5t26.5 67.5q0 41 -25.5 69.5 t-75 28.5t-74 -28.5t-24.5 -69.5z" /> +<glyph unicode="Æ" horiz-adv-x="1740" d="M2 0l760 1366h870v-113h-651v-497h516v-113h-516v-530h643v-113h-776v485h-434l-269 -485h-143zM475 598h373v672z" /> +<glyph unicode="Ç" horiz-adv-x="1384" d="M113 678q0 303 199.5 508t523.5 205q115 0 226.5 -30t164.5 -58l53 -31l-55 -125q-18 14 -53 35.5t-140.5 57.5t-210.5 36q-137 0 -247.5 -52.5t-177 -138.5t-101.5 -188t-35 -211q0 -244 160 -420t409 -176q207 0 396 131l14 10l55 -102q-8 -6 -23.5 -16.5t-64.5 -37 t-101 -47t-132 -37t-158 -16.5h-10l-4 -8q-25 -59 -25 -71q0 -23 26.5 -42.5t59.5 -33t59.5 -44t26.5 -73.5q0 -74 -63.5 -131t-155.5 -57q-104 0 -186 63l41 96q66 -57 139 -57q45 0 76.5 21.5t31.5 50.5q0 25 -25.5 43t-56 29.5t-56 34t-25.5 52.5q0 16 6 35t17 45.5 t14 32.5l8 23q-266 33 -433 225.5t-167 468.5z" /> +<glyph unicode="È" horiz-adv-x="1103" d="M211 0v1366h784v-113h-649v-497h514v-113h-514v-530h641v-113h-776zM346 1624l60 133l378 -194l-34 -86z" /> +<glyph unicode="É" horiz-adv-x="1103" d="M211 0v1366h784v-113h-649v-497h514v-113h-514v-530h641v-113h-776zM449 1563l376 194l62 -133l-404 -147z" /> +<glyph unicode="Ê" horiz-adv-x="1103" d="M211 0v1366h784v-113h-649v-497h514v-113h-514v-530h641v-113h-776zM299 1544l258 240h121l256 -240l-78 -74l-238 211l-241 -211z" /> +<glyph unicode="Ë" horiz-adv-x="1103" d="M211 0v1366h784v-113h-649v-497h514v-113h-514v-530h641v-113h-776zM297 1624q0 35 28.5 63.5t65.5 28.5q35 0 63.5 -28.5t28.5 -63.5q0 -37 -28.5 -65.5t-63.5 -28.5q-37 0 -65.5 27.5t-28.5 66.5zM752 1624q0 35 28.5 63.5t63.5 28.5q37 0 65.5 -28.5t28.5 -63.5 q0 -39 -28.5 -66.5t-65.5 -27.5q-35 0 -63.5 28.5t-28.5 65.5z" /> +<glyph unicode="Ì" horiz-adv-x="557" d="M8 1624l60 133l378 -194l-34 -86zM211 0v1366h135v-1366h-135z" /> +<glyph unicode="Í" horiz-adv-x="557" d="M111 1563l376 194l62 -133l-404 -147zM211 0v1366h135v-1366h-135z" /> +<glyph unicode="Î" horiz-adv-x="557" d="M-39 1544l258 240h121l256 -240l-78 -74l-237 211l-242 -211zM211 0v1366h135v-1366h-135z" /> +<glyph unicode="Ï" horiz-adv-x="557" d="M14 1622q0 37 30 65.5t67 28.5q35 0 63.5 -28.5t28.5 -65.5t-29 -65.5t-63 -28.5q-37 0 -67 28.5t-30 65.5zM211 0v1366h135v-1366h-135zM358 1622q0 37 30 65.5t65 28.5q37 0 65.5 -28.5t28.5 -65.5t-29 -65.5t-65 -28.5q-35 0 -65 28.5t-30 65.5z" /> +<glyph unicode="Ð" horiz-adv-x="1488" d="M76 633v119h147v614h387q147 0 278.5 -36t243 -111.5t177 -207.5t65.5 -306q0 -336 -230.5 -520.5t-611.5 -184.5h-309v633h-147zM356 113h156q373 0 543 156.5t170 414.5q0 264 -167 416.5t-476 152.5h-226v-501h365v-119h-365v-520z" /> +<glyph unicode="Ñ" horiz-adv-x="1529" d="M211 0v1366h133l844 -1167v1167h131v-1366h-133l-844 1149v-1149h-131zM408 1505q0 18 5 46t22.5 76t64.5 81t116 33q66 0 116 -35t89 -68.5t82 -33.5q33 0 55.5 18t30.5 46t10 44.5t2 28.5h117q0 -8 -2 -22.5t-7 -45.5t-19.5 -59.5t-37 -56t-61.5 -44t-88 -16.5 q-53 0 -95 21.5t-65.5 47t-56.5 47t-65.5 21.5t-55 -18.5t-30 -46t-9.5 -40.5t-2 -24h-116z" /> +<glyph unicode="Ò" horiz-adv-x="1624" d="M111 680q0 289 194.5 500t517.5 211q305 0 497.5 -196t192.5 -486q0 -299 -200.5 -516.5t-507.5 -217.5q-301 0 -497.5 206t-196.5 499zM256 694q0 -147 62.5 -282.5t193.5 -227.5t299 -92q250 0 402.5 182.5t152.5 418t-150.5 408.5t-404.5 173q-252 0 -403.5 -175.5 t-151.5 -404.5zM541 1624l59 133l379 -194l-35 -86z" /> +<glyph unicode="Ó" horiz-adv-x="1624" d="M111 680q0 289 194.5 500t517.5 211q305 0 497.5 -196t192.5 -486q0 -299 -200.5 -516.5t-507.5 -217.5q-301 0 -497.5 206t-196.5 499zM256 694q0 -147 62.5 -282.5t193.5 -227.5t299 -92q250 0 402.5 182.5t152.5 418t-150.5 408.5t-404.5 173q-252 0 -403.5 -175.5 t-151.5 -404.5zM643 1563l377 194l61 -133l-403 -147z" /> +<glyph unicode="Ô" horiz-adv-x="1624" d="M111 680q0 289 194.5 500t517.5 211q305 0 497.5 -196t192.5 -486q0 -299 -200.5 -516.5t-507.5 -217.5q-301 0 -497.5 206t-196.5 499zM256 694q0 -147 62.5 -282.5t193.5 -227.5t299 -92q250 0 402.5 182.5t152.5 418t-150.5 408.5t-404.5 173q-252 0 -403.5 -175.5 t-151.5 -404.5zM494 1544l258 240h120l256 -240l-77 -74l-238 211l-242 -211z" /> +<glyph unicode="Õ" horiz-adv-x="1624" d="M111 680q0 289 194.5 500t517.5 211q305 0 497.5 -196t192.5 -486q0 -299 -200.5 -516.5t-507.5 -217.5q-301 0 -497.5 206t-196.5 499zM256 694q0 -147 62.5 -282.5t193.5 -227.5t299 -92q250 0 402.5 182.5t152.5 418t-150.5 408.5t-404.5 173q-252 0 -403.5 -175.5 t-151.5 -404.5zM455 1505q0 18 5 46t22.5 76t64.5 81t117 33q66 0 115.5 -35t88.5 -68.5t82 -33.5q33 0 55.5 18t30.5 46t10.5 44.5t2.5 28.5h116q0 -8 -2 -22.5t-7 -45.5t-19.5 -59.5t-37 -56t-61.5 -44t-88 -16.5q-53 0 -95 21.5t-65.5 47t-56.5 47t-65.5 21.5t-55 -18.5 t-30 -46t-9.5 -40.5t-2 -24h-116z" /> +<glyph unicode="Ö" horiz-adv-x="1624" d="M111 680q0 289 194.5 500t517.5 211q305 0 497.5 -196t192.5 -486q0 -299 -200.5 -516.5t-507.5 -217.5q-301 0 -497.5 206t-196.5 499zM256 694q0 -147 62.5 -282.5t193.5 -227.5t299 -92q250 0 402.5 182.5t152.5 418t-150.5 408.5t-404.5 173q-252 0 -403.5 -175.5 t-151.5 -404.5zM492 1624q0 35 28.5 63.5t65.5 28.5q35 0 63.5 -28.5t28.5 -63.5q0 -37 -28.5 -65.5t-63.5 -28.5q-37 0 -65.5 27.5t-28.5 66.5zM946 1624q0 35 29 63.5t63 28.5q37 0 66 -28.5t29 -63.5q0 -39 -29 -66.5t-66 -27.5q-35 0 -63.5 28.5t-28.5 65.5z" /> +<glyph unicode="×" horiz-adv-x="1064" d="M86 137l363 373l-363 375l82 86l364 -375l365 375l82 -86l-365 -375l365 -373l-84 -86l-363 373l-362 -373z" /> +<glyph unicode="Ø" horiz-adv-x="1624" d="M111 680q0 289 194.5 500t517.5 211q211 0 381 -105l107 141h125l-152 -198q229 -197 229 -520q0 -299 -200.5 -516.5t-507.5 -217.5q-217 0 -387 115l-115 -151h-127l162 213q-227 204 -227 528zM256 694q0 -256 166 -434l700 922q-135 92 -311 92q-252 0 -403.5 -176.5 t-151.5 -403.5zM496 195q139 -102 315 -103q250 0 402.5 182.5t152.5 417.5q0 254 -166 424z" /> +<glyph unicode="Ù" horiz-adv-x="1476" d="M193 485v881h133v-846q0 -215 113.5 -321.5t299.5 -106.5q184 0 298 103.5t114 310.5v860h133v-852q0 -256 -153.5 -397.5t-393.5 -141.5q-244 0 -394 124t-150 386zM467 1624l59 133l379 -194l-35 -86z" /> +<glyph unicode="Ú" horiz-adv-x="1476" d="M193 485v881h133v-846q0 -215 113.5 -321.5t299.5 -106.5q184 0 298 103.5t114 310.5v860h133v-852q0 -256 -153.5 -397.5t-393.5 -141.5q-244 0 -394 124t-150 386zM569 1563l377 194l62 -133l-404 -147z" /> +<glyph unicode="Û" horiz-adv-x="1476" d="M193 485v881h133v-846q0 -215 113.5 -321.5t299.5 -106.5q184 0 298 103.5t114 310.5v860h133v-852q0 -256 -153.5 -397.5t-393.5 -141.5q-244 0 -394 124t-150 386zM420 1544l258 240h121l256 -240l-78 -74l-238 211l-241 -211z" /> +<glyph unicode="Ü" horiz-adv-x="1476" d="M193 485v881h133v-846q0 -215 113.5 -321.5t299.5 -106.5q184 0 298 103.5t114 310.5v860h133v-852q0 -256 -153.5 -397.5t-393.5 -141.5q-244 0 -394 124t-150 386zM418 1624q0 35 28.5 63.5t65.5 28.5q35 0 63.5 -28.5t28.5 -63.5q0 -37 -28.5 -65.5t-63.5 -28.5 q-37 0 -65.5 27.5t-28.5 66.5zM872 1624q0 35 29 63.5t64 28.5q37 0 65.5 -28.5t28.5 -63.5q0 -39 -29 -66.5t-65 -27.5q-35 0 -64 28.5t-29 65.5z" /> +<glyph unicode="Ý" horiz-adv-x="1153" d="M23 1366h159l398 -635l401 635h149l-485 -762v-604h-135v602zM424 1563l377 194l61 -133l-403 -147z" /> +<glyph unicode="Þ" horiz-adv-x="1132" d="M211 0v1366h135v-324h266q240 0 345.5 -98t105.5 -256q0 -184 -120 -286.5t-331 -102.5h-266v-299h-135zM346 412h240q332 0 332 262q0 256 -332 256h-240v-518z" /> +<glyph unicode="ß" horiz-adv-x="1134" d="M61 809v63l146 58v80q0 215 99.5 335.5t277.5 120.5q160 0 244.5 -86t84.5 -192q0 -57 -32.5 -116.5t-72.5 -101.5t-73 -101.5t-33 -114.5q0 -57 37 -108.5t90 -92.5l107 -83q53 -42 90 -102.5t37 -129.5q0 -119 -84 -191t-229 -72q-78 0 -149 20.5t-101 41.5l-33 22 l35 119q115 -92 254 -92q84 0 129 40t45 103q0 66 -56.5 126.5t-123 103.5t-123 116.5t-56.5 161.5q0 66 32 129.5t69 105.5t68.5 98t31.5 110q0 78 -59.5 122t-139.5 44q-106 0 -173.5 -80t-67.5 -248v-1018h-125v809h-146z" /> +<glyph unicode="à" horiz-adv-x="944" d="M80 201q0 279 557 354v61q0 39 -1 61.5t-10.5 53.5t-25.5 48.5t-47 29.5t-76 12q-152 -2 -287 -98l-45 111q16 12 47 30.5t127.5 48t192.5 29.5q133 0 191.5 -67.5t58.5 -221.5v-436q0 -55 25.5 -87t52.5 -36l24 -4l-47 -104q-84 14 -123 52t-51 101q-18 -25 -43 -52.5 t-103.5 -69.5t-164.5 -42q-115 0 -183.5 63t-68.5 163zM176 1425h154l207 -342l-84 -49zM219 209q0 -111 131 -111q59 0 117.5 31t90.5 60.5t79 80.5v179q-217 -37 -317.5 -93.5t-100.5 -146.5z" /> +<glyph unicode="á" horiz-adv-x="944" d="M80 201q0 279 557 354v61q0 39 -1 61.5t-10.5 53.5t-25.5 48.5t-47 29.5t-76 12q-152 -2 -287 -98l-45 111q16 12 47 30.5t127.5 48t192.5 29.5q133 0 191.5 -67.5t58.5 -221.5v-436q0 -55 25.5 -87t52.5 -36l24 -4l-47 -104q-84 14 -123 52t-51 101q-18 -25 -43 -52.5 t-103.5 -69.5t-164.5 -42q-115 0 -183.5 63t-68.5 163zM219 209q0 -111 131 -111q59 0 117.5 31t90.5 60.5t79 80.5v179q-217 -37 -317.5 -93.5t-100.5 -146.5zM381 1083l205 342h155l-276 -391z" /> +<glyph unicode="â" horiz-adv-x="944" d="M80 201q0 279 557 354v61q0 39 -1 61.5t-10.5 53.5t-25.5 48.5t-47 29.5t-76 12q-152 -2 -287 -98l-45 111q16 12 47 30.5t127.5 48t192.5 29.5q133 0 191.5 -67.5t58.5 -221.5v-436q0 -55 25.5 -87t52.5 -36l24 -4l-47 -104q-84 14 -123 52t-51 101q-18 -25 -43 -52.5 t-103.5 -69.5t-164.5 -42q-115 0 -183.5 63t-68.5 163zM184 1081l228 344h94l227 -344l-86 -49l-188 260l-189 -260zM219 209q0 -111 131 -111q59 0 117.5 31t90.5 60.5t79 80.5v179q-217 -37 -317.5 -93.5t-100.5 -146.5z" /> +<glyph unicode="ã" horiz-adv-x="944" d="M80 201q0 279 557 354v61q0 39 -1 61.5t-10.5 53.5t-25.5 48.5t-47 29.5t-76 12q-152 -2 -287 -98l-45 111q16 12 47 30.5t127.5 48t192.5 29.5q133 0 191.5 -67.5t58.5 -221.5v-436q0 -55 25.5 -87t52.5 -36l24 -4l-47 -104q-84 14 -123 52t-51 101q-18 -25 -43 -52.5 t-103.5 -69.5t-164.5 -42q-115 0 -183.5 63t-68.5 163zM174 1135q0 10 1 25.5t9.5 56t23.5 71.5t49 56.5t81 25.5t85 -24.5t57.5 -54t44 -54.5t48.5 -25q66 10 72 146h94q0 -10 -1 -26.5t-9 -58.5t-24.5 -75t-51.5 -59.5t-82 -26.5q-59 0 -101 40t-71.5 80t-60.5 40 t-48.5 -34t-19.5 -69l-2 -34h-94zM219 209q0 -111 131 -111q59 0 117.5 31t90.5 60.5t79 80.5v179q-217 -37 -317.5 -93.5t-100.5 -146.5z" /> +<glyph unicode="ä" horiz-adv-x="944" d="M80 201q0 279 557 354v61q0 39 -1 61.5t-10.5 53.5t-25.5 48.5t-47 29.5t-76 12q-152 -2 -287 -98l-45 111q16 12 47 30.5t127.5 48t192.5 29.5q133 0 191.5 -67.5t58.5 -221.5v-436q0 -55 25.5 -87t52.5 -36l24 -4l-47 -104q-84 14 -123 52t-51 101q-18 -25 -43 -52.5 t-103.5 -69.5t-164.5 -42q-115 0 -183.5 63t-68.5 163zM190 1261.5q0 36.5 30 65.5t67 29q35 0 63.5 -29t28.5 -65.5t-28.5 -65.5t-63.5 -29q-37 0 -67 29t-30 65.5zM219 209q0 -111 131 -111q59 0 117.5 31t90.5 60.5t79 80.5v179q-217 -37 -317.5 -93.5t-100.5 -146.5z M535 1261.5q0 36.5 29.5 65.5t64.5 29q37 0 65.5 -29t28.5 -65.5t-28.5 -65.5t-65.5 -29q-35 0 -64.5 29t-29.5 65.5z" /> +<glyph unicode="å" horiz-adv-x="944" d="M80 201q0 279 557 354v61q0 39 -1 61.5t-10.5 53.5t-25.5 48.5t-47 29.5t-76 12q-152 -2 -287 -98l-45 111q16 12 47 30.5t127.5 48t192.5 29.5q133 0 191.5 -67.5t58.5 -221.5v-436q0 -55 25.5 -87t52.5 -36l24 -4l-47 -104q-84 14 -123 52t-51 101q-18 -25 -43 -52.5 t-103.5 -69.5t-164.5 -42q-115 0 -183.5 63t-68.5 163zM219 209q0 -111 131 -111q59 0 117.5 31t90.5 60.5t79 80.5v179q-217 -37 -317.5 -93.5t-100.5 -146.5zM276 1266q0 68 46.5 113.5t136.5 45.5t136 -46t46 -113q0 -70 -46 -119t-136 -49t-136.5 49t-46.5 119z M365 1264q0 -39 22.5 -64.5t71.5 -25.5q47 0 71.5 26.5t24.5 63t-23.5 62.5t-72.5 26q-94 0 -94 -88z" /> +<glyph unicode="æ" horiz-adv-x="1538" d="M80 205q0 274 582 342v49q0 127 -33 176t-129 49q-74 0 -152 -24.5t-119 -48.5l-39 -25l-45 111q16 12 48 30.5t127.5 48t191.5 29.5q109 0 167 -38t81 -118q125 156 323 156q156 0 256.5 -105.5t98.5 -283.5l-84 -29l-574 -73q6 -156 92 -256.5t228 -100.5 q154 0 280 109l6 4l54 -94q-6 -6 -16.5 -15.5t-44 -33t-71.5 -42t-97.5 -33t-120.5 -14.5q-129 0 -228.5 60.5t-152.5 171.5q-41 -94 -128 -163t-221 -69q-121 0 -200.5 62t-79.5 168zM219 209q0 -53 40 -84t114 -31q125 0 200.5 91t75.5 253q-430 -65 -430 -229zM788 563 l510 68q0 8 -3 21.5t-18 47t-37.5 60t-68 48t-102.5 21.5q-113 0 -185.5 -72.5t-95.5 -193.5z" /> +<glyph unicode="ç" horiz-adv-x="925" d="M98 446q0 201 121 348.5t332 147.5q86 0 159.5 -25.5t104.5 -52.5l31 -24l-66 -103q-10 10 -30.5 24.5t-82 38t-124.5 23.5q-143 0 -227.5 -106.5t-84.5 -255.5q0 -154 86 -260.5t232 -106.5q68 0 130 24.5t91 49.5l29 27l47 -101q-12 -12 -37 -32.5t-106.5 -53.5 t-170.5 -33h-10l-4 -10q-25 -59 -24 -71q0 -23 26.5 -42.5t59 -33t59.5 -44t27 -73.5q0 -74 -63.5 -131t-156.5 -57q-104 0 -186 63l41 96q66 -57 139 -57q45 0 77 21.5t32 50.5q0 25 -25.5 43t-56.5 29.5t-56.5 34t-25.5 52.5q0 16 6 35t17.5 45.5t13.5 32.5l10 27 q-152 33 -243 160.5t-91 299.5z" /> +<glyph unicode="è" horiz-adv-x="993" d="M100 434q0 221 122 364.5t313 143.5q160 0 259 -105.5t99 -289.5l-84 -25l-571 -73q8 -162 92 -258.5t227 -96.5q72 0 144.5 29t109.5 57l39 31l39 -107q-14 -14 -41 -35.5t-116 -57.5t-183 -36q-215 0 -332 134.5t-117 324.5zM231 1425h154l207 -342l-84 -49zM244 561 l510 66q0 8 -3 21.5t-18.5 49t-38 62t-66.5 48t-100 21.5q-115 0 -189.5 -74.5t-94.5 -193.5z" /> +<glyph unicode="é" horiz-adv-x="993" d="M100 434q0 221 122 364.5t313 143.5q160 0 259 -105.5t99 -289.5l-84 -25l-571 -73q8 -162 92 -258.5t227 -96.5q72 0 144.5 29t109.5 57l39 31l39 -107q-14 -14 -41 -35.5t-116 -57.5t-183 -36q-215 0 -332 134.5t-117 324.5zM244 561l510 66q0 8 -3 21.5t-18.5 49 t-38 62t-66.5 48t-100 21.5q-115 0 -189.5 -74.5t-94.5 -193.5zM436 1083l205 342h156l-277 -391z" /> +<glyph unicode="ê" horiz-adv-x="993" d="M100 434q0 221 122 364.5t313 143.5q160 0 259 -105.5t99 -289.5l-84 -25l-571 -73q8 -162 92 -258.5t227 -96.5q72 0 144.5 29t109.5 57l39 31l39 -107q-14 -14 -41 -35.5t-116 -57.5t-183 -36q-215 0 -332 134.5t-117 324.5zM240 1081l227 344h94l227 -344l-86 -49 l-188 260l-188 -260zM244 561l510 66q0 8 -3 21.5t-18.5 49t-38 62t-66.5 48t-100 21.5q-115 0 -189.5 -74.5t-94.5 -193.5z" /> +<glyph unicode="ë" horiz-adv-x="993" d="M100 434q0 221 122 364.5t313 143.5q160 0 259 -105.5t99 -289.5l-84 -25l-571 -73q8 -162 92 -258.5t227 -96.5q72 0 144.5 29t109.5 57l39 31l39 -107q-14 -14 -41 -35.5t-116 -57.5t-183 -36q-215 0 -332 134.5t-117 324.5zM244 561l510 66q0 8 -3 21.5t-18.5 49 t-38 62t-66.5 48t-100 21.5q-115 0 -189.5 -74.5t-94.5 -193.5zM246 1261.5q0 36.5 29.5 65.5t66.5 29q35 0 63.5 -29t28.5 -65.5t-28.5 -65.5t-63.5 -29q-37 0 -66.5 29t-29.5 65.5zM590 1261.5q0 36.5 29.5 65.5t64.5 29q37 0 65.5 -29t28.5 -65.5t-28.5 -65.5t-65.5 -29 q-35 0 -64.5 29t-29.5 65.5z" /> +<glyph unicode="ì" horiz-adv-x="454" d="M-55 1425h153l207 -342l-84 -49zM166 0v918h125v-918h-125z" /> +<glyph unicode="í" horiz-adv-x="454" d="M152 1083l204 342h156l-276 -391zM166 0v918h125v-918h-125z" /> +<glyph unicode="î" horiz-adv-x="454" d="M-47 1081l227 344h94l228 -344l-86 -49l-189 260l-188 -260zM166 0v918h125v-918h-125z" /> +<glyph unicode="ï" horiz-adv-x="454" d="M-41 1261.5q0 36.5 29.5 65.5t66.5 29q35 0 63.5 -29t28.5 -65.5t-28.5 -65.5t-63.5 -29q-37 0 -66.5 29t-29.5 65.5zM166 0v918h125v-918h-125zM303 1261.5q0 36.5 29.5 65.5t64.5 29q37 0 66 -29t29 -65.5t-29 -65.5t-66 -29q-35 0 -64.5 29t-29.5 65.5z" /> +<glyph unicode="ð" horiz-adv-x="1097" d="M98 451q0 197 128 344t315 147q178 0 264 -94q-74 211 -242 356l-252 -157l-57 92l219 137q-135 88 -291 133l31 104q209 -53 371 -167l282 176l54 -95l-246 -153q303 -274 303 -703q0 -270 -123 -433t-334 -163q-193 0 -307.5 145t-114.5 331zM236 465q0 -143 78.5 -256 t215.5 -113q139 0 227.5 117t88.5 356q0 119 -66.5 185.5t-204.5 66.5q-152 0 -245.5 -100t-93.5 -256z" /> +<glyph unicode="ñ" d="M162 0v905l125 25v-187q215 199 395 199q104 0 170 -65.5t66 -204.5v-672h-125v649q0 180 -136 180q-88 0 -194.5 -72.5t-175.5 -142.5v-614h-125zM262 1135q0 10 1 25.5t9.5 56t23.5 71.5t49 56.5t81 25.5t85 -24.5t57.5 -54t44 -54.5t49.5 -25q66 10 71 146h94 q0 -10 -1 -26.5t-9 -58.5t-24.5 -75t-51 -59.5t-82.5 -26.5q-59 0 -101 40t-71.5 80t-60.5 40t-48.5 -34t-19.5 -69l-2 -34h-94z" /> +<glyph unicode="ò" d="M98 463q0 193 119 336t317.5 143t319.5 -140t121 -335t-120 -343.5t-320 -148.5q-197 0 -317 146.5t-120 341.5zM231 475q0 -156 80 -269.5t226 -113.5q135 0 220 100.5t85 260.5q0 154 -78 263t-229 109q-139 0 -221.5 -97t-82.5 -253zM252 1425h154l206 -342l-84 -49z " /> +<glyph unicode="ó" d="M98 463q0 193 119 336t317.5 143t319.5 -140t121 -335t-120 -343.5t-320 -148.5q-197 0 -317 146.5t-120 341.5zM231 475q0 -156 80 -269.5t226 -113.5q135 0 220 100.5t85 260.5q0 154 -78 263t-229 109q-139 0 -221.5 -97t-82.5 -253zM459 1083l205 342h155l-276 -391z " /> +<glyph unicode="ô" d="M98 463q0 193 119 336t317.5 143t319.5 -140t121 -335t-120 -343.5t-320 -148.5q-197 0 -317 146.5t-120 341.5zM231 475q0 -156 80 -269.5t226 -113.5q135 0 220 100.5t85 260.5q0 154 -78 263t-229 109q-139 0 -221.5 -97t-82.5 -253zM260 1081l227 344h95l227 -344 l-86 -49l-188 260l-189 -260z" /> +<glyph unicode="õ" d="M98 463q0 193 119 336t317.5 143t319.5 -140t121 -335t-120 -343.5t-320 -148.5q-197 0 -317 146.5t-120 341.5zM231 475q0 -156 80 -269.5t226 -113.5q135 0 220 100.5t85 260.5q0 154 -78 263t-229 109q-139 0 -221.5 -97t-82.5 -253zM250 1135q0 10 1 25.5t9 56 t23.5 71.5t49.5 56.5t81 25.5t85 -24.5t57 -54t44 -54.5t49 -25q66 10 72 146h94q0 -10 -1 -26.5t-9 -58.5t-24.5 -75t-51.5 -59.5t-82 -26.5q-59 0 -101 40t-72 80t-60.5 40t-48 -34t-19.5 -69l-2 -34h-94z" /> +<glyph unicode="ö" d="M98 463q0 193 119 336t317.5 143t319.5 -140t121 -335t-120 -343.5t-320 -148.5q-197 0 -317 146.5t-120 341.5zM231 475q0 -156 80 -269.5t226 -113.5q135 0 220 100.5t85 260.5q0 154 -78 263t-229 109q-139 0 -221.5 -97t-82.5 -253zM266 1261.5q0 36.5 30 65.5t66 29 q35 0 64 -29t29 -65.5t-29 -65.5t-64 -29q-37 0 -66.5 29t-29.5 65.5zM610 1261.5q0 36.5 30 65.5t65 29q37 0 65.5 -29t28.5 -65.5t-29 -65.5t-65 -29q-35 0 -65 29t-30 65.5z" /> +<glyph unicode="÷" horiz-adv-x="1064" d="M74 451v120h917v-120h-917zM416 117q0 47 34.5 80.5t82 33.5t82 -33.5t34.5 -80.5q0 -49 -34.5 -83t-82 -34t-82 34t-34.5 83zM416 907q0 47 34.5 81t82 34t82 -34t34.5 -81q0 -49 -34.5 -82.5t-82 -33.5t-82 33.5t-34.5 82.5z" /> +<glyph unicode="ø" d="M92 -61l131 176q-125 141 -125 340q0 186 120 336.5t321 150.5q137 0 245 -76l84 113h121l-133 -178q119 -137 119 -324q0 -119 -49 -230.5t-153.5 -191.5t-242.5 -80q-133 0 -233 72l-82 -108h-123zM231 473q0 -152 70 -254l410 549q-74 53 -176 53q-139 0 -221.5 -94 t-82.5 -254zM371 145q70 -49 166 -49q139 0 222 98.5t83 256.5q0 143 -64 243z" /> +<glyph unicode="ù" horiz-adv-x="1056" d="M154 250v668h125v-650q0 -180 143 -180q145 0 340 188v642h125v-633q0 -49 10 -121t21 -119l10 -47l-125 -10q-23 100 -31 166q-178 -178 -371 -179q-247 1 -247 275zM242 1425h153l207 -342l-84 -49z" /> +<glyph unicode="ú" horiz-adv-x="1056" d="M154 250v668h125v-650q0 -180 143 -180q145 0 340 188v642h125v-633q0 -49 10 -121t21 -119l10 -47l-125 -10q-23 100 -31 166q-178 -178 -371 -179q-247 1 -247 275zM446 1083l205 342h156l-277 -391z" /> +<glyph unicode="û" horiz-adv-x="1056" d="M154 250v668h125v-650q0 -180 143 -180q145 0 340 188v642h125v-633q0 -49 10 -121t21 -119l10 -47l-125 -10q-23 100 -31 166q-178 -178 -371 -179q-247 1 -247 275zM250 1081l227 344h94l228 -344l-86 -49l-189 260l-188 -260z" /> +<glyph unicode="ü" horiz-adv-x="1056" d="M154 250v668h125v-650q0 -180 143 -180q145 0 340 188v642h125v-633q0 -49 10 -121t21 -119l10 -47l-125 -10q-23 100 -31 166q-178 -178 -371 -179q-247 1 -247 275zM256 1261.5q0 36.5 29.5 65.5t66.5 29q35 0 63.5 -29t28.5 -65.5t-28.5 -65.5t-63.5 -29 q-37 0 -66.5 29t-29.5 65.5zM600 1261.5q0 36.5 29.5 65.5t64.5 29q37 0 65.5 -29t28.5 -65.5t-28.5 -65.5t-65.5 -29q-35 0 -64.5 29t-29.5 65.5z" /> +<glyph unicode="ý" horiz-adv-x="921" d="M41 918h137l289 -672l278 672h138l-422 -988q-80 -188 -161 -293.5t-208 -121.5l-41 110q94 18 158.5 93t122.5 206l69 158zM395 1083l205 342h156l-277 -391z" /> +<glyph unicode="þ" horiz-adv-x="1067" d="M166 -473v1909l125 24v-665q37 63 110.5 105t173.5 42q178 0 285 -131t107 -330q0 -213 -130 -359.5t-343 -146.5q-137 0 -203 62v-486zM291 227q0 -131 184 -131q168 0 262 101.5t94 275.5q0 160 -74.5 253t-189.5 93q-70 0 -136 -38t-94 -67.5t-46 -58.5v-428z" /> +<glyph unicode="ÿ" horiz-adv-x="921" d="M41 918h137l289 -672l278 672h138l-422 -988q-80 -188 -161 -293.5t-208 -121.5l-41 110q94 18 158.5 93t122.5 206l69 158zM205 1261.5q0 36.5 29.5 65.5t66.5 29q35 0 63.5 -29t28.5 -65.5t-28.5 -65.5t-63.5 -29q-37 0 -66.5 29t-29.5 65.5zM549 1261.5 q0 36.5 29.5 65.5t64.5 29q37 0 65.5 -29t28.5 -65.5t-28.5 -65.5t-65.5 -29q-35 0 -64.5 29t-29.5 65.5z" /> +<glyph unicode="Œ" horiz-adv-x="2002" d="M111 680q0 188 78.5 346t251.5 261.5t415 103.5q121 0 256 -25h782v-113h-651v-497h516v-113h-516v-530h643v-113h-776q-152 -25 -270 -25q-336 0 -532.5 203t-196.5 502zM256 694q0 -104 33 -205.5t100.5 -192.5t187 -147.5t275.5 -56.5q131 0 258 19v1134 q-117 29 -270 29q-190 0 -326.5 -87t-197 -215t-60.5 -278z" /> +<glyph unicode="œ" horiz-adv-x="1736" d="M98 453q0 199 116 344t325 145q125 0 224 -58.5t155 -154.5q57 100 148 156.5t208 56.5q162 0 262 -105.5t100 -289.5l-84 -25l-579 -76q8 -164 96 -258t227 -94q156 0 281 107l6 6l53 -94l-15 -16q-9 -9 -44 -32.5t-73 -42t-97 -33t-121 -14.5q-129 0 -229.5 59.5 t-153.5 158.5q-127 -217 -373 -218q-197 0 -314.5 142.5t-117.5 335.5zM231 465q0 -160 85 -266.5t227 -106.5q135 0 217 101.5t82 261.5q0 154 -77 262t-226 108q-141 0 -224.5 -102t-83.5 -258zM979 559l516 68q0 8 -3 21.5t-18.5 49t-38 62t-67.5 48t-104 21.5 q-115 0 -190 -75.5t-95 -194.5z" /> +<glyph unicode="Ÿ" horiz-adv-x="1153" d="M23 1366h159l398 -635l401 635h149l-485 -762v-604h-135v602zM272 1624q0 35 29 63.5t66 28.5q35 0 63.5 -28.5t28.5 -63.5q0 -37 -29 -65.5t-63 -28.5q-37 0 -66 27.5t-29 66.5zM727 1624q0 35 28.5 63.5t63.5 28.5q37 0 65.5 -28.5t28.5 -63.5q0 -39 -28.5 -66.5 t-65.5 -27.5q-35 0 -63.5 28.5t-28.5 65.5z" /> +<glyph unicode="ˆ" horiz-adv-x="1028" d="M240 1081l227 344h94l227 -344l-86 -49l-188 260l-188 -260z" /> +<glyph unicode="˜" horiz-adv-x="1028" d="M227 1135q0 10 1 25.5t9.5 56t23.5 71.5t49 56.5t81 25.5t85 -24.5t57.5 -54t44 -54.5t49.5 -25q66 10 71 146h95q0 -10 -1 -26.5t-9.5 -58.5t-25 -75t-51 -59.5t-81.5 -26.5q-59 0 -101.5 40t-72 80t-60.5 40t-48 -34t-19 -69l-2 -34h-95z" /> +<glyph unicode=" " horiz-adv-x="892" /> +<glyph unicode=" " horiz-adv-x="1784" /> +<glyph unicode=" " horiz-adv-x="892" /> +<glyph unicode=" " horiz-adv-x="1784" /> +<glyph unicode=" " horiz-adv-x="594" /> +<glyph unicode=" " horiz-adv-x="446" /> +<glyph unicode=" " horiz-adv-x="297" /> +<glyph unicode=" " horiz-adv-x="297" /> +<glyph unicode=" " horiz-adv-x="223" /> +<glyph unicode=" " horiz-adv-x="356" /> +<glyph unicode=" " horiz-adv-x="99" /> +<glyph unicode="‐" horiz-adv-x="669" d="M117 438v142h434v-142h-434z" /> +<glyph unicode="‑" horiz-adv-x="669" d="M117 438v142h434v-142h-434z" /> +<glyph unicode="‒" horiz-adv-x="669" d="M117 438v142h434v-142h-434z" /> +<glyph unicode="–" horiz-adv-x="1075" d="M117 457v121h839v-121h-839z" /> +<glyph unicode="—" horiz-adv-x="1873" d="M117 457v121h1638v-121h-1638z" /> +<glyph unicode="‘" horiz-adv-x="421" d="M106 1204q0 84 45.5 165t120.5 138l68 -65q-92 -74 -92 -170q0 -104 94 -203l-137 -82q-99 82 -99 217z" /> +<glyph unicode="’" horiz-adv-x="417" d="M88 1425l137 82q98 -84 99 -215q0 -84 -45.5 -167t-120.5 -138l-68 66q92 74 92 170q0 106 -94 202z" /> +<glyph unicode="‚" horiz-adv-x="485" d="M109 137l153 84q104 -90 105 -217q0 -84 -49.5 -166t-124.5 -139l-66 68q98 80 98 167q1 80 -116 203z" /> +<glyph unicode="“" horiz-adv-x="733" d="M106 1200q0 182 166 307l68 -65q-92 -76 -92 -176q0 -98 94 -197l-137 -82q-99 82 -99 213zM418 1200q0 182 166 307l65 -65q-90 -72 -90 -178q0 -94 92 -195l-135 -82q-98 82 -98 213z" /> +<glyph unicode="”" horiz-adv-x="727" d="M88 1425l137 82q98 -84 99 -215q0 -84 -45.5 -167t-120.5 -138l-68 66q92 74 92 170q0 106 -94 202zM399 1425l136 82q98 -82 98 -215q0 -84 -45 -167t-121 -138l-66 66q90 72 91 170q-1 106 -93 202z" /> +<glyph unicode="„" horiz-adv-x="794" d="M109 137l153 84q104 -90 105 -217q0 -84 -49.5 -166t-124.5 -139l-66 68q98 80 98 167q1 80 -116 203zM418 137l153 84q106 -90 107 -217q0 -84 -49 -166t-125 -139l-68 68q100 78 101 167q0 80 -119 203z" /> +<glyph unicode="•" horiz-adv-x="757" d="M106 524.5q0 114.5 79 193.5t194 79t193.5 -79t78.5 -193.5t-78.5 -193.5t-193.5 -79t-194 79t-79 193.5z" /> +<glyph unicode="…" horiz-adv-x="1570" d="M127 86q0 45 33 78t80 33q45 0 76.5 -33t31.5 -78t-31.5 -78t-76.5 -33q-47 0 -80 33t-33 78zM674 86q0 45 32.5 78t77.5 33q47 0 79 -33t32 -78t-32 -78t-79 -33q-45 0 -77.5 33t-32.5 78zM1221 86q0 45 32.5 78t77.5 33t78 -33t33 -78t-33 -78t-78 -33t-77.5 33 t-32.5 78z" /> +<glyph unicode=" " horiz-adv-x="356" /> +<glyph unicode="‹" horiz-adv-x="659" d="M55 510v8q35 27 281 295l123 133l98 -26l-313 -406l313 -405l-98 -27l-170 182l-112 121l-61 66l-38 38q-11 11 -23 21z" /> +<glyph unicode="›" horiz-adv-x="661" d="M104 109l316 405l-316 406l101 26q362 -395 403 -428v-8q-10 -8 -21.5 -18.5l-24.5 -23.5t-43 -46l-64 -71l-104 -111l-146 -158z" /> +<glyph unicode=" " horiz-adv-x="446" /> +<glyph unicode="€" horiz-adv-x="1138" d="M90 379v96h109q-4 27 -4 84q0 51 2 76h-103v98h119q43 190 174 305t332 115q180 -2 309 -80l-35 -127q-14 10 -38.5 24.5t-100.5 39t-149 24.5q-145 0 -234.5 -84t-124.5 -217h586l-29 -98h-573q-2 -23 -2 -64q0 -51 6 -96h522l-29 -96h-471q41 -131 134.5 -208 t224.5 -77q70 0 136.5 18.5t98.5 39.5l33 18l49 -104q-14 -10 -38.5 -25.5t-107.5 -40.5t-173 -25q-186 0 -318.5 110t-179.5 294h-125z" /> +<glyph unicode="™" horiz-adv-x="1333" d="M78 1284v82h450v-82h-178v-463h-94v463h-178zM621 821l20 545h141l131 -379l131 379h138l20 -545h-90l-16 432l-154 -432h-63l-152 430l-12 -430h-94z" /> +<glyph unicode="" horiz-adv-x="920" d="M0 920h920v-920h-920v920z" /> +<glyph unicode="fi" horiz-adv-x="1048" d="M61 809v63l146 58v84q0 223 101.5 347t275.5 124q72 0 140.5 -19.5t100.5 -38.5l33 -18l-67 -109q-102 66 -211 66q-104 0 -176 -85t-72 -261v-102h551v-918h-125v819h-426v-819h-125v809h-146z" /> +<glyph unicode="fl" horiz-adv-x="1077" d="M61 809v63l146 58v84q0 223 101.5 347t275.5 124q119 0 217 -47l110 22v-1460h-125v1303q-115 63 -206 63q-104 0 -176 -85t-72 -261v-102h264v-109h-264v-809h-125v809h-146z" /> +<glyph unicode="ffi" horiz-adv-x="1628" d="M61 809v63l146 58v53q0 215 105.5 333t289.5 118q139 0 270 -80q98 131 273 131q66 0 128 -19.5t91 -38.5l29 -18l-68 -109q-92 66 -186 66q-96 0 -161 -79t-65 -247v-122h551v-918h-127v819h-424v-819h-127v819h-454v-819h-125v809h-146zM332 918h454v116q0 121 31 209 q-121 72 -221 72q-115 0 -189.5 -79t-74.5 -249v-69z" /> +<glyph unicode="ffl" horiz-adv-x="1656" d="M61 809v63l146 58v53q0 215 105.5 333t289.5 118q145 0 279 -86q104 137 290 137q109 0 218 -45l104 20v-1460h-127v1309q-109 57 -201 57q-109 0 -180.5 -88t-71.5 -266v-94h265v-109h-265v-809h-127v819h-454v-819h-125v809h-146zM332 918h454v90q0 133 37 231 q-123 76 -227 76q-115 0 -189.5 -79t-74.5 -249v-69z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansLight-webfont.ttf b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansLight-webfont.ttf new file mode 100755 index 0000000000000000000000000000000000000000..5eacf6d088d7d4420657c3d251df206908e89535 Binary files /dev/null and b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansLight-webfont.ttf differ diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansLight-webfont.woff b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansLight-webfont.woff new file mode 100755 index 0000000000000000000000000000000000000000..08c76f87126d89b7b8c6859a833329998d591970 Binary files /dev/null and b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansLight-webfont.woff differ diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansRegular-webfont.eot b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansRegular-webfont.eot new file mode 100755 index 0000000000000000000000000000000000000000..db87f6c488d72297e573d5bfac2ebe17e637cca9 Binary files /dev/null and b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansRegular-webfont.eot differ diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansRegular-webfont.svg b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansRegular-webfont.svg new file mode 100755 index 0000000000000000000000000000000000000000..19d66bb96d160c2dc121842892f9363feda1f58b --- /dev/null +++ b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansRegular-webfont.svg @@ -0,0 +1,244 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Fontspring. +</metadata> +<defs> +<font id="webfontnehNrF5g" horiz-adv-x="1064" > +<font-face units-per-em="2048" ascent="1536" descent="-512" /> +<missing-glyph horiz-adv-x="491" /> +<glyph unicode=" " horiz-adv-x="491" /> +<glyph unicode="	" horiz-adv-x="491" /> +<glyph unicode=" " horiz-adv-x="491" /> +<glyph unicode="!" horiz-adv-x="555" d="M156 98.5q0 51.5 35.5 87t87 35.5t87 -35.5t35.5 -87t-35.5 -87.5t-87 -36t-87 36t-35.5 87.5zM182 1391h191l-27 -990h-141z" /> +<glyph unicode=""" horiz-adv-x="712" d="M131 883v483h152v-76l-47 -407h-105zM451 883v483h151v-76l-47 -407h-104z" /> +<glyph unicode="#" horiz-adv-x="1325" d="M74 256l20 113h246l59 290h-247l20 113h252l84 412h119l-84 -412h311l84 412h119l-84 -412h276l-20 -113h-281l-59 -290h282l-20 -113h-285l-88 -438h-121l91 438h-312l-88 -438h-121l90 438h-243zM459 369h311l59 290h-311z" /> +<glyph unicode="$" horiz-adv-x="946" d="M82 86l37 145l39 -26q25 -16 105.5 -46t164.5 -34l10 387q-72 27 -119 49.5t-102 61.5t-84 95t-29 128q0 121 87.5 204t263.5 95l6 178h90l-4 -176q174 -6 284 -62l-47 -137q-102 49 -241 60l-11 -367q150 -55 238 -135t88 -209t-91 -210t-253 -95l-4 -174h-90l4 170 q-96 2 -182 26.5t-123 46.5zM266 856q0 -70 44 -110.5t132 -73.5l11 336q-187 -13 -187 -152zM518 127q178 23 178 164q0 70 -43 111.5t-125 74.5z" /> +<glyph unicode="%" horiz-adv-x="1497" d="M80 1038q0 129 89 218.5t220 89.5t220 -89.5t89 -218.5t-89 -218t-220 -89t-220 89t-89 218zM195 1038q0 -80 56 -140t138 -60t138.5 60t56.5 140t-56.5 140.5t-140.5 60.5q-80 0 -136 -60.5t-56 -140.5zM215 0l956 1376l86 -59l-917 -1317h-125zM805 283q0 129 89 218 t220 89t220 -89t89 -218t-89 -218.5t-220 -89.5t-220 89.5t-89 218.5zM920 282.5q0 -79.5 56 -140t138 -60.5t138.5 60.5t56.5 140t-56.5 140t-140.5 60.5q-80 0 -136 -60.5t-56 -140z" /> +<glyph unicode="&" horiz-adv-x="1394" d="M88 319q0 127 79 219.5t220 184.5q-119 211 -119 352q0 121 84 218.5t248 97.5q141 0 221 -76t80 -199q0 -127 -81 -219t-230 -192q74 -111 145 -197q92 -113 170 -189q172 229 199 603h151q-12 -162 -74.5 -354.5t-174.5 -338.5q186 -160 335 -196l-65 -119 q-168 27 -379 201q-164 -139 -375 -140q-178 0 -306 90t-128 254zM246 332q0 -104 85 -160.5t201 -56.5q143 0 263 90q-90 84 -193 211q-70 82 -149 198q-207 -143 -207 -282zM442 1079q0 -109 84 -266q104 70 160.5 135.5t56.5 145.5q0 66 -38.5 111.5t-108.5 45.5 q-74 0 -114 -50t-40 -122z" /> +<glyph unicode="'" horiz-adv-x="393" d="M131 883v483h152v-76l-47 -407h-105z" /> +<glyph unicode="(" horiz-adv-x="585" d="M109 553q0 432 231 772q41 57 72 90l127 -37l-32 -39q-19 -25 -69.5 -108.5t-88.5 -173.5t-69.5 -227.5t-31.5 -276.5q0 -434 229 -786q39 -59 68 -93l-123 -43l-34 41q-22 27 -76 117t-95 189.5t-74.5 256t-33.5 318.5z" /> +<glyph unicode=")" horiz-adv-x="585" d="M41 -326q12 14 31.5 40t71 113t91 182t71.5 243.5t32 300.5q0 399 -227 741l-64 84l127 37q12 -12 32.5 -36.5t73 -109.5t92.5 -177.5t72.5 -239.5t32.5 -299q0 -459 -237 -821q-43 -66 -76 -101z" /> +<glyph unicode="*" horiz-adv-x="991" d="M92 854l293 109l31 -54l-242 -198zM92 1128l82 144l242 -199l-31 -53zM414 573l51 308h61l52 -308h-164zM414 1409h164l-52 -307h-61zM575 909l31 54l293 -109l-82 -143zM575 1073l242 199l82 -144l-293 -108z" /> +<glyph unicode="+" d="M63 446v134h402v419h141v-419h395v-134h-395v-446h-141v446h-402z" /> +<glyph unicode="," horiz-adv-x="471" d="M76 -281q53 47 71.5 66.5t38 59.5t19.5 89q0 104 -96 240l167 55q78 -92 78 -221q0 -205 -207 -362z" /> +<glyph unicode="-" horiz-adv-x="692" d="M115 438v148h463v-148h-463z" /> +<glyph unicode="." horiz-adv-x="487" d="M121 98.5q0 51.5 36 87t87 35.5t87 -35.5t36 -87t-36 -87.5t-87 -36t-87 36t-36 87.5z" /> +<glyph unicode="/" horiz-adv-x="937" d="M47 -401l682 1767h141l-680 -1767h-143z" /> +<glyph unicode="0" horiz-adv-x="1124" d="M102 467q0 213 123 366.5t346 153.5q217 0 334 -140t117 -339q0 -137 -46 -254t-156.5 -198t-266.5 -81q-209 0 -330 147.5t-121 344.5zM262 485q0 -150 81 -260t218 -110q147 0 224 109.5t77 264.5q0 145 -77.5 252t-221.5 107q-139 0 -220 -109t-81 -254z" /> +<glyph unicode="1" horiz-adv-x="741" d="M104 0v137h215v699h-200v127h360v-826h201v-137h-576z" /> +<glyph unicode="2" horiz-adv-x="909" d="M92 104l53 39q33 25 116 97.5t147.5 141.5t117 156t52.5 154q0 70 -48.5 113t-123.5 43q-55 0 -116 -23.5t-93 -46.5l-31 -24l-70 104q16 14 47 35.5t119 57.5t170 36q135 0 224 -79t89 -195q0 -78 -35.5 -158t-106.5 -160t-128 -133t-143 -125h499v-137h-722z" /> +<glyph unicode="3" horiz-adv-x="815" d="M41 858q16 14 47 35.5t119 57.5t172 36q133 0 221 -75.5t88 -194.5q0 -106 -72.5 -195.5t-175.5 -148.5q135 -29 209 -114t74 -208q0 -197 -167 -319.5t-429 -122.5q-37 0 -55 2l-15 127q20 -2 62 -2q186 0 311 81t125 222q0 121 -91 175t-224 54h-58v131 q119 12 228.5 105.5t109.5 195.5q0 68 -45 108t-117 40q-127 -2 -247 -94z" /> +<glyph unicode="4" d="M57 53v109l609 825h135v-803h194v-131h-194v-448h-160v448h-584zM231 184h410v555z" /> +<glyph unicode="5" horiz-adv-x="817" d="M63 -262q20 -2 64 -2q182 0 308 81t126 230q0 74 -29.5 132.5t-71.5 93t-109.5 60t-123 37t-129.5 21.5v572h580v-138h-424v-319q475 -96 475 -451q0 -205 -166 -325.5t-426 -120.5q-39 0 -59 2z" /> +<glyph unicode="6" horiz-adv-x="1040" d="M98 567q0 156 46 298.5t133.5 258t229.5 187t322 80.5l13 -131q-238 -14 -377 -149.5t-182 -344.5q90 113 270 113q190 0 297.5 -126t107.5 -309q0 -188 -112.5 -328.5t-306.5 -140.5q-213 0 -327 170t-114 422zM266 623q0 -240 73 -374t210 -134q111 0 176.5 89 t65.5 222q0 53 -11.5 102.5t-38 99.5t-80 80.5t-129.5 30.5q-155 1 -266 -116z" /> +<glyph unicode="7" horiz-adv-x="929" d="M63 811v152h811v-109q-221 -551 -581 -1257l-156 36q295 539 553 1178h-627z" /> +<glyph unicode="8" horiz-adv-x="1044" d="M100 334q0 119 79 207t222 184q-219 174 -219 354q0 141 104.5 226.5t260.5 85.5q152 0 248 -83t96 -216q0 -106 -63.5 -190.5t-176.5 -164.5q139 -98 216 -188t77 -209q0 -152 -122 -258.5t-306 -106.5q-182 0 -299 106t-117 253zM254 340q0 -98 80 -161.5t184.5 -63.5 t181 59t76.5 156q0 59 -44 118.5t-87 93.5l-135 101q-127 -84 -191.5 -151.5t-64.5 -151.5zM350 1085q0 -74 49.5 -136t141.5 -132q94 68 145 129.5t51 134.5q0 84 -58 127t-136 43q-76 0 -134.5 -42t-58.5 -124z" /> +<glyph unicode="9" horiz-adv-x="1040" d="M102 532q0 184 110 319.5t300 135.5q213 0 326.5 -170t113.5 -422q0 -152 -46 -288t-133 -247.5t-229.5 -180t-322.5 -76.5l-12 131q238 12 377 144t182 327q-90 -111 -268 -111q-186 0 -292 128t-106 310zM270 561q0 -57 10.5 -109.5t36 -104.5t77.5 -83t126 -31 q150 0 264 115q0 225 -72.5 362.5t-209.5 137.5q-104 0 -168 -83t-64 -204z" /> +<glyph unicode=":" horiz-adv-x="555" d="M156 98.5q0 51.5 35.5 87t87 35.5t87 -35.5t35.5 -87t-35.5 -87.5t-87 -36t-87 36t-35.5 87.5zM156 799q0 51 35.5 87t87 36t87 -36t35.5 -87t-35.5 -87t-87 -36t-87 36t-35.5 87z" /> +<glyph unicode=";" horiz-adv-x="546" d="M119 -281q53 47 71.5 66.5t38 59.5t19.5 89q0 104 -96 240l167 55q78 -92 78 -221q0 -205 -207 -362zM150 799q0 51 35.5 87t87 36t87 -36t35.5 -87t-35.5 -87t-87 -36t-87 36t-35.5 87z" /> +<glyph unicode="<" d="M63 463v94l873 469l31 -139l-719 -377l719 -397l-31 -138z" /> +<glyph unicode="=" d="M74 252v133h917v-133h-917zM74 641v133h917v-133h-917z" /> +<glyph unicode=">" d="M96 113l717 397l-717 377l31 139l872 -469v-94l-872 -488z" /> +<glyph unicode="?" horiz-adv-x="731" d="M94 1284l35 152q20 -6 56 -18.5t127 -52.5t161 -83t127 -110.5t57 -135.5q0 -51 -32.5 -105t-80.5 -105.5t-95.5 -109t-80 -140t-32.5 -175.5h-129q-6 29 -6 70q0 92 42 182t92 147.5t92 117t42 100.5q0 115 -293 235zM156 98.5q0 51.5 35.5 87t87 35.5t87 -35.5 t35.5 -87t-35.5 -87.5t-87 -36t-87 36t-35.5 87.5z" /> +<glyph unicode="@" horiz-adv-x="1701" d="M86 399q0 213 99.5 399.5t288 303.5t421.5 117q311 0 507.5 -191.5t196.5 -480.5q0 -299 -188 -441q-23 -18 -51.5 -32.5t-51 -23.5t-64.5 -21.5t-61.5 -16.5t-77.5 -17t-81 -20q-18 84 -29 152q-35 -63 -105.5 -107.5t-152.5 -44.5q-123 0 -207 107.5t-84 284.5 q0 250 165 402.5t393 152.5l135 -9v-622q0 -45 4 -87t8 -61l2 -18q156 18 231.5 124.5t75.5 274.5q0 250 -152.5 414t-410.5 164q-295 0 -483.5 -209t-188.5 -500q0 -270 162 -448t383 -189l-20 -112q-283 12 -473.5 232t-190.5 523zM614 379q0 -113 45.5 -188.5 t116.5 -75.5q51 0 102.5 37.5t75.5 76.5l25 37v527q-160 0 -262.5 -120t-102.5 -294z" /> +<glyph unicode="A" horiz-adv-x="1267" d="M29 0l524 1376h162l524 -1376h-176l-154 412h-557l-153 -412h-170zM406 553h450l-225 602z" /> +<glyph unicode="B" horiz-adv-x="1202" d="M201 0v1366h356q244 0 353.5 -95t109.5 -233q0 -178 -166 -305q37 -12 73 -32.5t78 -59.5t68.5 -101.5t26.5 -142.5q0 -180 -130 -288.5t-337 -108.5h-432zM369 141h233q160 0 239 65.5t79 178.5q0 115 -79 181.5t-239 66.5h-233v-492zM369 774h317l16.5 10.5t37 29 t47 49t37 69.5t16.5 90q0 203 -314 203h-157v-451z" /> +<glyph unicode="C" horiz-adv-x="1378" d="M102 674q0 305 202 511t532 206q121 0 234.5 -30t166.5 -58l51 -29l-67 -152q-18 14 -51 35t-136.5 54.5t-210.5 33.5q-172 0 -298 -83t-184 -207t-58 -269q0 -238 154.5 -401.5t389.5 -163.5q211 0 394 127l14 10l70 -127q-23 -18 -63 -44t-168 -69t-261 -43 q-309 0 -510 197t-201 502z" /> +<glyph unicode="D" horiz-adv-x="1480" d="M201 0v1366h413q147 0 277.5 -36t241 -111.5t176 -207.5t65.5 -306q0 -336 -229.5 -520.5t-607.5 -184.5h-336zM369 141h147q352 0 515 149.5t163 395.5q0 250 -157.5 394.5t-450.5 144.5h-217v-1084z" /> +<glyph unicode="E" horiz-adv-x="1110" d="M201 0v1366h805v-141h-637v-457h503v-141h-503v-486h635v-141h-803z" /> +<glyph unicode="F" horiz-adv-x="1048" d="M201 0v1366h786v-141h-618v-463h489v-150h-489v-612h-168z" /> +<glyph unicode="G" horiz-adv-x="1429" d="M102 664q0 303 199 515t539 212q121 0 234.5 -26t166.5 -50l53 -27l-67 -151q-18 12 -52 30.5t-138.5 48t-207.5 29.5q-260 0 -404 -167t-144 -400q0 -244 159.5 -400.5t425.5 -156.5l258 35v403h-293v141h461v-661q-252 -63 -452 -64q-313 0 -525.5 188t-212.5 501z" /> +<glyph unicode="H" horiz-adv-x="1544" d="M201 0v1366h168v-598h807v598h167v-1366h-167v627h-807v-627h-168z" /> +<glyph unicode="I" horiz-adv-x="569" d="M201 0v1366h168v-1366h-168z" /> +<glyph unicode="J" horiz-adv-x="571" d="M-35 -229q238 29 238 383v1212h168v-1210q0 -92 -17.5 -174t-54.5 -157t-105.5 -125t-162.5 -65z" /> +<glyph unicode="K" horiz-adv-x="1187" d="M201 0v1366h168v-580h28l547 580h213l-614 -641l639 -725h-221l-564 645h-28v-645h-168z" /> +<glyph unicode="L" horiz-adv-x="1054" d="M201 0v1366h168v-1225h655v-141h-823z" /> +<glyph unicode="M" horiz-adv-x="1767" d="M178 0l49 1366h242l412 -1128l417 1128h242l49 -1366h-164l-43 1161l-438 -1161h-127l-438 1176l-37 -1176h-164z" /> +<glyph unicode="N" horiz-adv-x="1529" d="M201 0v1366h168l796 -1114v1114h164v-1366h-168l-796 1098v-1098h-164z" /> +<glyph unicode="O" horiz-adv-x="1628" d="M102 680q0 184 82 344t250 263.5t389 103.5q313 0 508 -196t195 -486q0 -299 -203 -516.5t-518 -217.5q-307 0 -505 207t-198 498zM283 692q0 -221 144 -396t384 -175q242 0 388.5 173t146.5 398q0 223 -144.5 388t-388.5 165q-242 0 -386 -166t-144 -387z" /> +<glyph unicode="P" horiz-adv-x="1155" d="M201 0v1366h395q248 0 367.5 -112.5t119.5 -290.5q0 -205 -134 -322t-353 -117h-227v-524h-168zM369 666h196q170 0 254 73.5t84 208.5q0 125 -81 201t-257 76h-196v-559z" /> +<glyph unicode="Q" horiz-adv-x="1628" d="M104 680q0 184 82 344t248 263.5t385 103.5q315 0 512 -196t197 -486q0 -248 -146.5 -447t-386.5 -262l69 -87q26 -32 80 -83t102 -80t119 -51.5t148 -22.5l-24 -153h-15q-72 0 -141 17q-76 19 -125 42t-107.5 71t-81 70.5t-66.5 76t-46 55.5l-61 71q-37 45 -123 54 q-276 31 -447.5 229.5t-171.5 470.5zM285 692q0 -104 34.5 -204.5t98 -183.5t166 -133t227.5 -50q240 0 388.5 174t148.5 399q0 219 -143.5 385t-387.5 166q-242 0 -387 -166t-145 -387z" /> +<glyph unicode="R" horiz-adv-x="1216" d="M201 0v1366h358q248 0 368 -106.5t120 -266.5q0 -137 -82 -234t-201 -149l414 -610h-199l-391 575h-219v-575h-168zM369 717h215q109 0 195.5 70.5t86.5 189.5q0 106 -82 177t-256 71h-159v-508z" /> +<glyph unicode="S" horiz-adv-x="1042" d="M98 90l45 158q18 -14 50 -34.5t125.5 -54.5t181.5 -34q117 0 194.5 52t77.5 147q0 86 -66.5 151.5t-162.5 114.5l-192 102q-95 53 -161.5 140.5t-66.5 201.5q0 154 118.5 255.5t325.5 101.5q80 0 167 -15.5t134 -32.5l47 -14l-43 -158q-152 70 -311 70q-119 0 -193.5 -49 t-74.5 -139q0 -86 66.5 -152.5t162.5 -114t191.5 -100.5t162 -141t66.5 -209q0 -172 -127 -266.5t-321 -94.5q-106 0 -205 29t-146 57z" /> +<glyph unicode="T" horiz-adv-x="1212" d="M35 1225v141h1143v-141h-492v-1225h-168v1225h-483z" /> +<glyph unicode="U" horiz-adv-x="1472" d="M182 492v874h168v-842q0 -205 105.5 -304t281.5 -99q174 0 279.5 98t105.5 293v854h168v-846q0 -258 -157.5 -401.5t-397.5 -143.5q-248 0 -400.5 126.5t-152.5 390.5z" /> +<glyph unicode="V" horiz-adv-x="1206" d="M29 1366h178l399 -1128l400 1128h172l-494 -1376h-164z" /> +<glyph unicode="W" horiz-adv-x="1935" d="M51 1366h172l336 -1130l326 1130h172l323 -1130l338 1130h168l-420 -1376h-172l-325 1102l-328 -1102h-172z" /> +<glyph unicode="X" horiz-adv-x="1212" d="M51 0l457 680l-457 686h199l358 -551l361 551h192l-456 -682l456 -684h-198l-359 551l-360 -551h-193z" /> +<glyph unicode="Y" horiz-adv-x="1177" d="M16 1366h199l377 -608l381 608h188l-487 -770v-596h-168v594z" /> +<glyph unicode="Z" horiz-adv-x="1185" d="M74 0v96l794 1129h-747v141h962v-96l-784 -1129h797v-141h-1022z" /> +<glyph unicode="[" horiz-adv-x="587" d="M174 -317v1683h375v-113h-242v-1458h242v-112h-375z" /> +<glyph unicode="\" horiz-adv-x="937" d="M68 1366h141l682 -1767h-143z" /> +<glyph unicode="]" horiz-adv-x="587" d="M39 -205h242v1458h-242v113h375v-1683h-375v112z" /> +<glyph unicode="^" horiz-adv-x="1011" d="M16 512l439 879h102l438 -879h-155l-336 676l-336 -676h-152z" /> +<glyph unicode="_" horiz-adv-x="1097" d="M37 -76h1024v-121h-1024v121z" /> +<glyph unicode="`" horiz-adv-x="1032" d="M328 1432h174l207 -340l-95 -56z" /> +<glyph unicode="a" horiz-adv-x="960" d="M74 207q0 141 143 230t410 124v35q0 45 -1 65.5t-8.5 54.5t-22.5 49t-45 28.5t-75 13.5q-150 -2 -289 -102l-49 129q16 12 49 30.5t132.5 50t201.5 31.5q147 0 206.5 -67.5t59.5 -225.5v-415q0 -104 88 -121l15 -2l-53 -129q-164 18 -199 149q-10 -16 -30.5 -37.5 t-57.5 -52.5t-94.5 -50.5t-122.5 -19.5q-117 0 -187.5 65t-70.5 167zM244 217q0 -102 121 -102q125 0 262 159v170q-199 -33 -291 -86t-92 -141z" /> +<glyph unicode="b" horiz-adv-x="1067" d="M152 16v1418l159 28v-637q94 121 267 121q180 0 288.5 -129t108.5 -325q0 -215 -133 -366t-381 -151q-145 0 -309 41zM311 129q70 -20 158 -20q152 0 245 97t93 275q0 150 -68.5 238t-181.5 88q-135 0 -246 -123v-555z" /> +<glyph unicode="c" horiz-adv-x="933" d="M90 451q0 201 128 348t343 147q88 0 163 -24.5t107 -49.5l31 -26l-71 -125q-10 10 -31 24.5t-83.5 38t-125.5 23.5q-133 0 -213 -100.5t-80 -247.5q0 -145 81 -244.5t218 -99.5q143 4 250 98l55 -119q-12 -12 -35.5 -32.5t-106.5 -53.5t-175 -33q-201 0 -328 135.5 t-127 340.5z" /> +<glyph unicode="d" horiz-adv-x="1091" d="M92 430q0 213 133 364.5t369 151.5q100 0 178 -33v521l160 28v-1177q0 -49 10 -121t21 -119l10 -45l-158 -14q-18 84 -29 147q-98 -158 -299 -158q-176 0 -285.5 130t-109.5 325zM262 440q0 -150 69.5 -237.5t176.5 -87.5q66 0 128 36.5t89 68.5t47 63v397 q-6 131 -176 131q-150 0 -242 -98.5t-92 -272.5z" /> +<glyph unicode="e" horiz-adv-x="997" d="M92 440q0 219 124 362.5t319 143.5q164 0 266 -109.5t102 -301.5l-98 -29l-543 -72q10 -145 91 -232t214 -87q70 0 142.5 28.5t109.5 57.5l37 30l47 -122q-14 -14 -43 -37t-121 -60t-190 -37q-217 0 -337 135t-120 330zM264 557l463 59q0 8 -3 21.5t-15.5 47.5t-33 59.5 t-60.5 47t-91 21.5q-106 0 -174 -71.5t-86 -184.5z" /> +<glyph unicode="f" horiz-adv-x="669" d="M57 793v84l146 55v98q0 217 103.5 339t277.5 122q68 0 132 -19.5t95 -37.5l31 -21l-74 -127q-92 66 -188 66q-94 0 -156 -76t-62 -238v-116h261v-129h-261v-793h-159v793h-146z" /> +<glyph unicode="g" horiz-adv-x="1026" d="M59 -240q0 158 240 281q-154 45 -154 125t142 164q-84 43 -131 120.5t-47 174.5q0 145 111.5 233t268.5 88q53 0 134.5 -19.5t130.5 -19.5h98q27 0 56.5 5.5t45.5 9.5l19 6l14 -144h-117q-35 0 -75 4q70 -76 69 -180q0 -152 -118.5 -235.5t-272.5 -83.5q-39 0 -74 6 q-82 -59 -82 -86t58.5 -46.5t199.5 -49.5q8 -2 13 -2q82 -18 133 -34t108.5 -44.5t86 -73.5t28.5 -104q0 -139 -146.5 -239.5t-344.5 -100.5q-162 0 -278 64t-116 181zM207 -217q0 -76 80 -110.5t178 -34.5q129 0 222 58t93 136q0 61 -61.5 94t-183.5 60q-41 10 -103 20 q-57 -31 -83.5 -47t-66.5 -47t-57.5 -61.5t-17.5 -67.5zM272 614q0 -84 55.5 -143t159.5 -59q94 0 153.5 50t59.5 138q0 86 -57 154.5t-160 68.5q-96 0 -153.5 -59.5t-57.5 -149.5z" /> +<glyph unicode="h" horiz-adv-x="1081" d="M156 0v1434l159 28v-704q176 188 379 188q111 0 176.5 -67.5t65.5 -208.5v-670h-160v625q0 180 -125 180q-127 0 -336 -195v-610h-159z" /> +<glyph unicode="i" horiz-adv-x="471" d="M127 1266q0 45 33 77.5t78 32.5t77.5 -32.5t32.5 -77.5t-32.5 -78t-77.5 -33t-78 33t-33 78zM156 0v922h159v-922h-159z" /> +<glyph unicode="j" horiz-adv-x="471" d="M-66 -352q221 43 222 338v936h159v-906q0 -233 -84 -354t-247 -147zM125 1266q0 45 31.5 77.5t79 32.5t79 -32.5t31.5 -77.5t-31.5 -78t-79 -33t-79 33t-31.5 78z" /> +<glyph unicode="k" horiz-adv-x="966" d="M156 0v1434l159 28v-895h23l364 355h213l-430 -408l469 -514h-215l-399 449h-25v-449h-159z" /> +<glyph unicode="l" horiz-adv-x="471" d="M156 0v1434l159 28v-1462h-159z" /> +<glyph unicode="m" horiz-adv-x="1646" d="M152 0v907l159 29v-178q176 188 371 188q184 0 221 -184q184 184 367 184q104 0 167.5 -67.5t63.5 -208.5v-670h-160v625q0 180 -114 180q-121 0 -314 -180v-625h-159v625q0 180 -115 180q-133 0 -328 -195v-610h-159z" /> +<glyph unicode="n" horiz-adv-x="1079" d="M152 0v907l159 29v-180q184 190 381 190q111 0 176.5 -67.5t65.5 -208.5v-670h-160v625q0 180 -125 180q-135 0 -338 -197v-608h-159z" /> +<glyph unicode="o" horiz-adv-x="1091" d="M90 457q0 121 49 229.5t156.5 184t253.5 75.5q205 0 328.5 -139t123.5 -328q0 -119 -48 -230.5t-157.5 -192.5t-254.5 -81q-205 0 -328 143.5t-123 338.5zM258 475.5q0 -149.5 74 -255t215 -105.5q129 0 208 94t79 244q0 147 -72 250.5t-217 103.5q-131 0 -209 -91 t-78 -240.5z" /> +<glyph unicode="p" horiz-adv-x="1073" d="M152 -475v1382l155 29v-143q37 66 108.5 109.5t174.5 43.5q176 0 283.5 -131t107.5 -328q0 -215 -128 -363.5t-335 -148.5q-133 0 -207 58v-479zM311 231q0 -121 174 -120q150 0 238 97t88 267q0 152 -67.5 240t-174.5 88q-150 0 -258 -158v-414z" /> +<glyph unicode="q" horiz-adv-x="1067" d="M92 430q0 215 133 365.5t381 150.5l309 -41v-1351l-159 -29v573q-84 -123 -267 -123q-180 0 -288.5 129t-108.5 326zM260 440q0 -147 68.5 -234t181.5 -87q131 0 246 121v551q-70 20 -158 20q-152 0 -245 -96.5t-93 -274.5z" /> +<glyph unicode="r" horiz-adv-x="684" d="M152 0v907l159 29v-182q39 70 107.5 131t161.5 61q23 0 43 -4t28 -8l8 -6l-41 -172q-41 16 -77 16q-121 0 -230 -188v-584h-159z" /> +<glyph unicode="s" horiz-adv-x="804" d="M86 57l35 142q117 -90 264 -90q84 0 128 32.5t44 87.5q0 53 -47 94.5t-112.5 71t-132 63.5t-114 93t-47.5 141q0 113 84 183.5t252 70.5q70 0 133.5 -12t94.5 -25l28 -14l-43 -135q-111 53 -225 53q-80 0 -121 -29.5t-41 -78.5q0 -51 47 -90.5t113 -68t132.5 -63 t113.5 -96t47 -145.5q0 -123 -91 -195t-247 -72q-82 0 -155.5 20.5t-106.5 41.5z" /> +<glyph unicode="t" horiz-adv-x="741" d="M66 793v86l131 53v205l159 39v-254h299v-129h-299v-506q0 -172 113 -172q94 0 195 84l38 -129q-12 -10 -35.5 -25.5t-93 -42.5t-137.5 -27q-240 0 -239 269v549h-131z" /> +<glyph unicode="u" d="M143 252v670h160v-625q0 -180 131 -180q139 0 311 172v633h160v-637q0 -49 10.5 -121t20.5 -119l10 -45l-158 -14q-23 102 -30 168q-166 -178 -365 -179q-250 1 -250 277z" /> +<glyph unicode="v" horiz-adv-x="933" d="M37 922h168l244 -723l290 723h166l-389 -932h-151z" /> +<glyph unicode="w" horiz-adv-x="1517" d="M43 922h168l219 -742l264 742h144l221 -742l260 742h166l-357 -932h-155l-219 702l-260 -702h-156z" /> +<glyph unicode="x" horiz-adv-x="933" d="M55 0l318 461l-318 461h191l223 -338l225 338h185l-318 -457l318 -465h-183l-231 346l-234 -346h-176z" /> +<glyph unicode="y" horiz-adv-x="935" d="M33 922h174l268 -652l260 652h168l-411 -992q-74 -178 -167.5 -288.5t-230.5 -126.5l-51 133q180 37 289 282l59 138z" /> +<glyph unicode="z" horiz-adv-x="888" d="M84 96l491 688h-475v138h686v-97l-499 -688h518v-137h-719z" /> +<glyph unicode="{" horiz-adv-x="696" d="M33 481v113q53 2 96 24.5t69.5 52t46 85t29 95.5t14.5 109.5t5 102.5v98v29q0 166 113.5 247t304.5 81v-105q-98 -6 -153.5 -24.5t-83.5 -63.5t-35 -95t-7 -149q0 -457 -219 -540v-4q94 -37 156.5 -171.5t62.5 -392.5q0 -98 7 -148t35 -94t83 -62.5t154 -26.5v-105 q-418 0 -418 328v29v100q0 37 -5 106.5t-14.5 112.5t-29 99.5t-46 88t-69.5 55t-96 25.5z" /> +<glyph unicode="|" horiz-adv-x="477" d="M172 -461v1995h133v-1995h-133z" /> +<glyph unicode="}" horiz-adv-x="696" d="M-14 -358q98 8 153.5 26.5t83 62.5t34.5 94t7 148q0 258 62.5 392.5t156.5 171.5v4q-219 84 -219 540q0 98 -7 148.5t-34.5 95.5t-83 63.5t-153.5 24.5v105q190 0 303.5 -81t113.5 -247v-29v-98q0 -35 5.5 -102.5t14.5 -109.5t28.5 -95.5t46 -84t69.5 -53t97 -24.5v-113 q-53 -2 -96.5 -25.5t-70 -55t-46 -88t-28.5 -99.5t-14.5 -113.5t-5.5 -105.5v-100v-29q0 -328 -417 -328v105z" /> +<glyph unicode="~" horiz-adv-x="1191" d="M131 358q0 317 266 318q80 0 141.5 -31t93.5 -68.5t76 -68.5t91 -31q135 0 135 191h131q0 -317 -266 -318q-80 0 -141.5 31t-93.5 68.5t-76 68.5t-91 31q-135 0 -135 -191h-131z" /> +<glyph unicode="¡" horiz-adv-x="524" d="M137 823q0 51 36 87t87 36t87 -36t36 -87t-36 -87t-87 -36t-87 36t-36 87zM166 -469l27 989h141l22 -989h-190z" /> +<glyph unicode="¢" horiz-adv-x="921" d="M86 569q0 162 97.5 286t269.5 146l6 181h90l-4 -178q176 -8 278 -113l6 -8l-92 -113q-76 82 -196 94l-17 -588q139 4 246 99l55 -119q-12 -12 -35.5 -31.5t-102.5 -53.5t-167 -34l-4 -182h-90l4 188q-156 27 -250 146.5t-94 279.5zM254 575q0 -100 47 -179t133 -107 l15 571q-92 -20 -143.5 -99.5t-51.5 -185.5z" /> +<glyph unicode="£" horiz-adv-x="1101" d="M82 111q14 4 35.5 14t61.5 57t48 113l23 194h-125v103h137l23 170q49 395 360 395q182 0 295 -113l10 -10l-92 -112q-8 10 -25.5 26.5t-75 43t-118.5 26.5q-84 0 -133 -57.5t-64 -204.5l-16 -164h381l-10 -103h-381q-8 -90 -26.5 -174t-33.5 -122l-14 -39 q184 -66 322 -66q98 0 152 53.5t67 184.5h129q-8 -76 -24.5 -136.5t-50.5 -119t-96.5 -90t-148.5 -31.5q-82 0 -232.5 40t-199.5 40q-61 0 -137 -29z" /> +<glyph unicode="¥" horiz-adv-x="1138" d="M82 1133h182l305 -496l312 496h170l-303 -478h215v-102h-281l-35 -57v-82h316v-103h-316v-311h-160v311h-294v103h294v80l-38 59h-256v102h192z" /> +<glyph unicode="¦" horiz-adv-x="507" d="M180 354h148v-733h-148v733zM180 672v733h148v-733h-148z" /> +<glyph unicode="§" horiz-adv-x="1001" d="M57 -379l62 105q129 -96 270 -97q125 0 190.5 91.5t65.5 236.5q0 70 -10 121l-113 620q-23 131 -22 205q0 135 53 213l113 -22q-35 -76 -35 -189q0 -53 10 -114l123 -697q12 -70 12 -139q0 -190 -96 -315t-287 -125q-86 0 -170 26.5t-125 52.5zM199 948q0 193 97 318 t286 125q86 0 170 -27t125 -53l41 -27l-62 -104q-129 96 -270 96q-125 0 -191.5 -92t-66.5 -236q0 -59 12 -121l113 -620q20 -119 20 -205q0 -137 -51 -213l-113 23q35 82 35 188q0 53 -10 115l-123 696q-12 69 -12 137z" /> +<glyph unicode="¨" horiz-adv-x="1032" d="M225 1266q0 43 32 73.5t75 30.5q41 0 72.5 -30.5t31.5 -73.5t-31.5 -74t-72.5 -31q-43 0 -75 31t-32 74zM594 1266q0 43 31.5 73.5t72.5 30.5q43 0 75 -30.5t32 -73.5t-32 -74t-75 -31q-41 0 -72.5 31t-31.5 74z" /> +<glyph unicode="©" horiz-adv-x="1593" d="M90 682q0 293 207 500t500 207t499.5 -207t206.5 -500t-206.5 -500t-499.5 -207t-500 207t-207 500zM195 682q0 -254 175 -433t427 -179t427 179t175 433t-175 433t-427 179t-427 -179t-175 -433zM401 676q0 172 111 299t307 127q180 0 285 -113l10 -10l-92 -113l-28 27 q-17 16 -73.5 43t-113.5 27q-113 0 -175.5 -78t-62.5 -193q0 -117 72 -197.5t190 -80.5q129 4 224 98l55 -119q-10 -12 -31.5 -32.5t-97.5 -53.5t-162 -33q-182 0 -300 116t-118 286z" /> +<glyph unicode="ª" horiz-adv-x="790" d="M96 874q0 205 389 259v22q0 70 -18 99.5t-80 29.5q-49 0 -101.5 -20.5t-80.5 -40.5l-29 -21l-35 111q111 78 283 78q111 0 155 -47.5t44 -157.5v-283q8 -74 73 -80l-41 -106q-131 6 -159 100q-84 -106 -215 -106q-84 0 -134.5 44.5t-50.5 118.5zM242 885q0 -68 71 -68 q76 0 172 113v108q-127 -23 -185 -59.5t-58 -93.5z" /> +<glyph unicode="«" horiz-adv-x="1046" d="M49 510v8q35 27 285 303l115 125l110 -31l-309 -401l309 -401l-110 -31l-168 182l-111 121l-60 66l-38 38q-11 11 -23 21zM440 510v8q35 27 285 303l115 125l110 -31l-309 -401l309 -401l-110 -31l-168 182l-111 121l-60 66l-38 38q-11 11 -23 21z" /> +<glyph unicode="¬" horiz-adv-x="1177" d="M111 664v133h938v-570h-142v437h-796z" /> +<glyph unicode="­" horiz-adv-x="692" d="M115 438v148h463v-148h-463z" /> +<glyph unicode="®" horiz-adv-x="884" d="M88 1087.5q0 145.5 104.5 250t250 104.5t250 -104.5t104.5 -250t-104.5 -250t-250 -104.5t-250 104.5t-104.5 250zM158 1087.5q0 -120.5 83 -207.5t199.5 -87t201.5 87t85 207q0 119 -85 206t-201.5 87t-199.5 -86t-83 -206.5zM311 918v348h123q143 0 144 -105 q0 -68 -68 -100l104 -143h-94l-88 126h-37v-126h-84zM395 1100h45q51 0 52 53q0 55 -66 55h-31v-108z" /> +<glyph unicode="¯" horiz-adv-x="1011" d="M272 1204v125h467v-125h-467z" /> +<glyph unicode="°" horiz-adv-x="679" d="M90 1144.5q0 102.5 73 174.5t177 72t177 -72t73 -174.5t-73 -174t-177 -71.5t-177 71.5t-73 174zM193 1144.5q0 -63.5 43 -107.5t104 -44t104 44t43 107.5t-43 107.5t-104 44t-104 -44t-43 -107.5z" /> +<glyph unicode="±" d="M78 641v133h381v369h141v-369h385v-133h-385v-395h-141v395h-381zM80 0v133h907v-133h-907z" /> +<glyph unicode="²" horiz-adv-x="698" d="M57 836q213 207 271 274q113 139 112 248q0 63 -37.5 98t-97.5 35q-39 0 -79 -18.5t-62 -36.5l-21 -19l-71 82q10 12 30.5 30.5t90 50.5t143.5 32q117 0 182.5 -66.5t65.5 -171.5q0 -96 -65.5 -201.5t-248.5 -289.5h369v-113h-571z" /> +<glyph unicode="³" horiz-adv-x="661" d="M49 819l55 99q78 -45 172 -46q74 0 117 34t43 89q0 63 -58.5 97t-144.5 34h-47v111q80 6 146.5 53t66.5 117q0 88 -102 88q-39 0 -80 -12.5t-61 -24.5l-21 -14l-53 88q96 80 231 80q100 0 166 -52.5t66 -134.5q0 -131 -166 -213q94 -20 148.5 -77.5t54.5 -135.5 q0 -102 -88 -172.5t-220 -70.5q-59 0 -115.5 15t-82.5 32z" /> +<glyph unicode="´" horiz-adv-x="1032" d="M324 1092l206 340h175l-287 -396z" /> +<glyph unicode="µ" horiz-adv-x="1148" d="M145 -442q20 199 21 362v1002h160v-625q0 -180 131 -180q139 0 311 172v633h160v-684q0 -82 22.5 -102.5t110.5 -20.5v-129q-61 -10 -98 -11q-172 0 -191 170q-164 -170 -356 -170q-61 0 -111 19q2 -88 12.5 -244t10.5 -192h-183z" /> +<glyph unicode="μ" horiz-adv-x="1148" d="M145 -442q20 199 21 362v1002h160v-625q0 -180 131 -180q139 0 311 172v633h160v-684q0 -82 22.5 -102.5t110.5 -20.5v-129q-61 -10 -98 -11q-172 0 -191 170q-164 -170 -356 -170q-61 0 -111 19q2 -88 12.5 -244t10.5 -192h-183z" /> +<glyph unicode="¶" horiz-adv-x="1353" d="M70 864q0 203 154.5 352.5t430.5 149.5h596v-117h-151v-1249h-127v1249h-154v-1290q0 -444 -358 -444l-31 129q133 0 193.5 73.5t60.5 241.5v408h-18q-291 0 -443.5 145t-152.5 352z" /> +<glyph unicode="·" horiz-adv-x="512" d="M133 520q0 51 36 87t87 36t87 -36t36 -87t-36 -87t-87 -36t-87 36t-36 87z" /> +<glyph unicode="¸" horiz-adv-x="1032" d="M336 -422l43 100q66 -57 143 -57q45 0 75 19.5t30 48.5q0 23 -26 41t-57.5 30.5t-57 36t-25.5 53.5q0 25 37 109l18 41h102l-16 -35q-23 -49 -22 -67q0 -23 27.5 -40.5t59 -30.5t59.5 -45t28 -77q0 -76 -65.5 -133t-162.5 -57q-49 0 -97 15t-71 32z" /> +<glyph unicode="¹" horiz-adv-x="575" d="M68 770v104h172v619h-158v104h297v-723h162v-104h-473z" /> +<glyph unicode="º" horiz-adv-x="845" d="M90 1049q0 133 90 237.5t246 104.5q150 0 240 -97.5t90 -230.5t-89 -242.5t-247 -109.5q-150 0 -240 100.5t-90 237.5zM233 1061q0 -100 48.5 -172t142.5 -72q86 0 137 63.5t51 163.5q0 98 -48 169t-142 71q-86 0 -137.5 -61.5t-51.5 -161.5z" /> +<glyph unicode="»" horiz-adv-x="1048" d="M98 113l310 401l-310 401l111 31q362 -397 389 -420q4 -2 10 -8v-8q-12 -10 -22 -21l-38 -38l-61 -66l-110 -121l-168 -182zM489 113l310 401l-310 401l111 31q362 -397 389 -420q4 -2 10 -8v-8q-12 -10 -22 -21l-38 -38l-60 -66l-111 -121l-168 -182z" /> +<glyph unicode="¼" horiz-adv-x="1671" d="M96 549v104h172v619h-157v104h297v-723h161v-104h-473zM354 0l813 1407l117 -43l-784 -1364h-146zM952 295l398 539h125v-510h122v-109h-122v-215h-136v215h-376zM1098 324h241v325z" /> +<glyph unicode="½" horiz-adv-x="1792" d="M94 549v104h172v619h-157v104h297v-723h161v-104h-473zM354 0l813 1407l117 -43l-784 -1364h-146zM1137 66q213 207 270 274q113 139 113 248q0 63 -38 98t-98 35q-39 0 -78.5 -18.5t-60.5 -36.5l-22 -19l-72 82q10 12 30.5 30.5t90 50.5t143.5 32q117 0 182.5 -66.5 t65.5 -171.5q0 -96 -65.5 -201.5t-247.5 -289.5h368v-113h-571z" /> +<glyph unicode="¾" horiz-adv-x="1648" d="M82 598l55 98q78 -45 172 -45q74 0 117 34t43 89q0 63 -58.5 97t-144.5 34h-47v111q80 6 146.5 53t66.5 117q0 88 -102 88q-39 0 -80 -12.5t-62 -24.5l-20 -14l-53 88q96 80 231 80q100 0 166 -52.5t66 -134.5q0 -131 -166 -213q94 -20 148 -77.5t54 -135.5 q0 -102 -88 -172.5t-219 -70.5q-59 0 -115.5 15t-82.5 32zM332 0l813 1407l117 -43l-785 -1364h-145zM930 295l397 539h125v-510h123v-109h-123v-215h-135v215h-377zM1075 324h242v325z" /> +<glyph unicode="¿" horiz-adv-x="716" d="M72 -94q0 49 32.5 101t79.5 103l96 106q48 56 80.5 135t32.5 169h129q6 -29 6 -69q0 -90 -42 -176.5t-92 -141.5t-92 -112.5t-42 -96.5q0 -115 293 -235l82 -31l-35 -152q-20 6 -56 18.5t-127 52.5t-161 83t-127 110.5t-57 135.5zM328 823q0 51 35.5 87t87 36t87 -36 t35.5 -87t-35.5 -87t-87 -36t-87 36t-35.5 87z" /> +<glyph unicode="À" horiz-adv-x="1267" d="M29 0l524 1376h162l524 -1376h-176l-154 412h-557l-153 -412h-170zM356 1616l64 147l395 -194l-39 -99zM406 553h450l-225 602z" /> +<glyph unicode="Á" horiz-adv-x="1267" d="M29 0l524 1376h162l524 -1376h-176l-154 412h-557l-153 -412h-170zM406 553h450l-225 602zM446 1569l396 194l63 -147l-420 -146z" /> +<glyph unicode="Â" horiz-adv-x="1267" d="M29 0l524 1376h162l524 -1376h-176l-154 412h-557l-153 -412h-170zM303 1548l258 236h141l256 -236l-92 -78l-233 203l-238 -203zM406 553h450l-225 602z" /> +<glyph unicode="Ã" horiz-adv-x="1267" d="M29 0l524 1376h162l524 -1376h-176l-154 412h-557l-153 -412h-170zM268 1501v12q0 29 6.5 60t23.5 75t63.5 71.5t113.5 27.5q70 0 123 -34t95 -67.5t83 -33.5q90 0 90 119v16h127v-14q0 -29 -6 -61t-24.5 -77t-65.5 -73.5t-116.5 -28.5t-122 34t-92.5 67.5t-81 33.5 q-90 0 -90 -115v-12h-127zM406 553h450l-225 602z" /> +<glyph unicode="Ä" horiz-adv-x="1267" d="M29 0l524 1376h162l524 -1376h-176l-154 412h-557l-153 -412h-170zM291 1624q0 43 31.5 74t74.5 31q41 0 73 -31t32 -74t-32 -73.5t-73 -30.5q-43 0 -74.5 30.5t-31.5 73.5zM406 553h450l-225 602zM762 1624q0 43 31.5 74t72.5 31q43 0 75 -31t32 -74t-32 -73.5 t-75 -30.5q-41 0 -72.5 30.5t-31.5 73.5z" /> +<glyph unicode="Å" horiz-adv-x="1267" d="M29 0l524 1376h162l524 -1376h-176l-154 412h-557l-153 -412h-170zM406 553h450l-225 602zM438 1622q0 66 50.5 114t142.5 48t142 -48t50 -114q0 -68 -50 -117t-142 -49t-142.5 49t-50.5 117zM535 1620q0 -39 24.5 -66.5t71.5 -27.5q45 0 71.5 28.5t26.5 65.5 q0 39 -25.5 66.5t-72.5 27.5q-49 0 -72.5 -27.5t-23.5 -66.5z" /> +<glyph unicode="Æ" horiz-adv-x="1767" d="M-4 0l762 1366h905v-141h-637v-457h504v-141h-504v-486h635v-141h-803v457h-430l-252 -457h-180zM506 598h352v637z" /> +<glyph unicode="Ç" horiz-adv-x="1384" d="M104 674q0 305 202 511t532 206q121 0 234.5 -30t164.5 -58l53 -29l-67 -152q-18 14 -51 35t-136.5 54.5t-210.5 33.5q-172 0 -298 -83t-184 -207t-58 -269q0 -238 154.5 -401.5t389.5 -163.5q211 0 394 127l14 10l70 -127q-23 -18 -63 -44t-168 -69t-261 -43h-4l-4 -10 q-23 -49 -23 -67q0 -23 28 -40.5t59.5 -30.5t59 -45t27.5 -77q0 -76 -65.5 -133t-161.5 -57q-49 0 -97 15t-71 32l-22 16l43 100q66 -57 143 -57q45 0 74.5 19.5t29.5 48.5q0 23 -25.5 41t-57 30.5t-57 36t-25.5 53.5q0 25 36 109l11 23q-270 33 -439.5 223t-169.5 469z" /> +<glyph unicode="È" horiz-adv-x="1110" d="M201 0v1366h805v-141h-637v-457h503v-141h-503v-486h635v-141h-803zM340 1616l63 147l396 -194l-39 -99z" /> +<glyph unicode="É" horiz-adv-x="1110" d="M201 0v1366h805v-141h-637v-457h503v-141h-503v-486h635v-141h-803zM430 1569l395 194l64 -147l-420 -146z" /> +<glyph unicode="Ê" horiz-adv-x="1110" d="M201 0v1366h805v-141h-637v-457h503v-141h-503v-486h635v-141h-803zM287 1548l258 236h141l256 -236l-92 -78l-234 203l-237 -203z" /> +<glyph unicode="Ë" horiz-adv-x="1110" d="M201 0v1366h805v-141h-637v-457h503v-141h-503v-486h635v-141h-803zM274 1624q0 43 32 74t75 31q41 0 72.5 -31t31.5 -74t-31.5 -73.5t-72.5 -30.5q-43 0 -75 30.5t-32 73.5zM745 1624q0 43 32 74t73 31q43 0 74.5 -31t31.5 -74t-31.5 -73.5t-74.5 -30.5q-41 0 -73 30.5 t-32 73.5z" /> +<glyph unicode="Ì" horiz-adv-x="569" d="M10 1616l64 147l395 -194l-39 -99zM201 0v1366h168v-1366h-168z" /> +<glyph unicode="Í" horiz-adv-x="569" d="M100 1569l396 194l63 -147l-420 -146zM201 0v1366h168v-1366h-168z" /> +<glyph unicode="Î" horiz-adv-x="569" d="M-43 1548l258 236h141l256 -236l-92 -78l-233 203l-238 -203zM201 0v1366h168v-1366h-168z" /> +<glyph unicode="Ï" horiz-adv-x="569" d="M-2 1624q0 43 31.5 74t74.5 31q41 0 73 -31t32 -74t-32 -73.5t-73 -30.5q-43 0 -74.5 30.5t-31.5 73.5zM201 0v1366h168v-1366h-168zM367 1624q0 43 31.5 74t72.5 31q43 0 75 -31t32 -74t-32 -73.5t-75 -30.5q-41 0 -72.5 30.5t-31.5 73.5z" /> +<glyph unicode="Ð" horiz-adv-x="1497" d="M70 623v141h147v602h414q147 0 277 -36t241 -111.5t176.5 -207.5t65.5 -306q0 -336 -229.5 -520.5t-608.5 -184.5h-336v623h-147zM385 141h147q350 0 513 149.5t163 395.5q0 250 -157.5 394.5t-448.5 144.5h-217v-461h352v-141h-352v-482z" /> +<glyph unicode="Ñ" horiz-adv-x="1529" d="M201 0v1366h168l796 -1114v1114h164v-1366h-168l-796 1098v-1098h-164zM401 1501v12q0 29 6.5 60t24 75t63.5 71.5t113 27.5q70 0 123 -34t95 -67.5t83 -33.5q90 0 90 119v16h127v-14q0 -29 -6 -61t-24.5 -77t-65.5 -73.5t-116.5 -28.5t-122 34t-92.5 67.5t-81 33.5 q-90 0 -90 -115v-12h-127z" /> +<glyph unicode="Ò" horiz-adv-x="1628" d="M102 680q0 184 82 344t250 263.5t389 103.5q313 0 508 -196t195 -486q0 -299 -203 -516.5t-518 -217.5q-307 0 -505 207t-198 498zM283 692q0 -221 144 -396t384 -175q242 0 388.5 173t146.5 398q0 223 -144.5 388t-388.5 165q-242 0 -386 -166t-144 -387zM539 1616 l63 147l395 -194l-39 -99z" /> +<glyph unicode="Ó" horiz-adv-x="1628" d="M102 680q0 184 82 344t250 263.5t389 103.5q313 0 508 -196t195 -486q0 -299 -203 -516.5t-518 -217.5q-307 0 -505 207t-198 498zM283 692q0 -221 144 -396t384 -175q242 0 388.5 173t146.5 398q0 223 -144.5 388t-388.5 165q-242 0 -386 -166t-144 -387zM629 1569 l395 194l63 -147l-419 -146z" /> +<glyph unicode="Ô" horiz-adv-x="1628" d="M102 680q0 184 82 344t250 263.5t389 103.5q313 0 508 -196t195 -486q0 -299 -203 -516.5t-518 -217.5q-307 0 -505 207t-198 498zM283 692q0 -221 144 -396t384 -175q242 0 388.5 173t146.5 398q0 223 -144.5 388t-388.5 165q-242 0 -386 -166t-144 -387zM485 1548 l258 236h142l256 -236l-92 -78l-234 203l-237 -203z" /> +<glyph unicode="Õ" horiz-adv-x="1628" d="M102 680q0 184 82 344t250 263.5t389 103.5q313 0 508 -196t195 -486q0 -299 -203 -516.5t-518 -217.5q-307 0 -505 207t-198 498zM283 692q0 -221 144 -396t384 -175q242 0 388.5 173t146.5 398q0 223 -144.5 388t-388.5 165q-242 0 -386 -166t-144 -387zM451 1501v12 q0 29 6 60t23.5 75t63.5 71.5t113 27.5q70 0 123.5 -34t95.5 -67.5t82 -33.5q90 0 91 119v16h127v-14q0 -29 -6.5 -61t-25 -77t-65.5 -73.5t-116.5 -28.5t-122 34t-92 67.5t-80.5 33.5q-90 0 -90 -115v-12h-127z" /> +<glyph unicode="Ö" horiz-adv-x="1628" d="M102 680q0 184 82 344t250 263.5t389 103.5q313 0 508 -196t195 -486q0 -299 -203 -516.5t-518 -217.5q-307 0 -505 207t-198 498zM283 692q0 -221 144 -396t384 -175q242 0 388.5 173t146.5 398q0 223 -144.5 388t-388.5 165q-242 0 -386 -166t-144 -387zM473 1624 q0 43 32 74t75 31q41 0 72.5 -31t31.5 -74t-31.5 -73.5t-72.5 -30.5q-43 0 -75 30.5t-32 73.5zM944 1624q0 43 32 74t73 31q43 0 74.5 -31t31.5 -74t-31.5 -73.5t-74.5 -30.5q-41 0 -73 30.5t-32 73.5z" /> +<glyph unicode="×" d="M82 143l358 369l-358 371l90 94l360 -371l361 371l90 -94l-360 -371l360 -369l-92 -94l-359 369l-358 -369z" /> +<glyph unicode="Ø" horiz-adv-x="1628" d="M102 680q0 184 82 344t250 263.5t389 103.5q215 0 381 -99l103 135h135l-150 -196q233 -199 234 -522q0 -299 -203 -516.5t-518 -217.5q-219 0 -385 109l-111 -145h-137l160 211q-230 206 -230 530zM283 692q0 -238 153 -407l668 878q-125 82 -291 82q-242 0 -386 -167 t-144 -386zM516 211q131 -90 295 -90q242 0 388.5 173t146.5 398q0 240 -158 402z" /> +<glyph unicode="Ù" horiz-adv-x="1472" d="M182 492v874h168v-842q0 -205 105.5 -304t281.5 -99q174 0 279.5 98t105.5 293v854h168v-846q0 -258 -157.5 -401.5t-397.5 -143.5q-248 0 -400.5 126.5t-152.5 390.5zM461 1616l63 147l396 -194l-39 -99z" /> +<glyph unicode="Ú" horiz-adv-x="1472" d="M182 492v874h168v-842q0 -205 105.5 -304t281.5 -99q174 0 279.5 98t105.5 293v854h168v-846q0 -258 -157.5 -401.5t-397.5 -143.5q-248 0 -400.5 126.5t-152.5 390.5zM551 1569l395 194l64 -147l-420 -146z" /> +<glyph unicode="Û" horiz-adv-x="1472" d="M182 492v874h168v-842q0 -205 105.5 -304t281.5 -99q174 0 279.5 98t105.5 293v854h168v-846q0 -258 -157.5 -401.5t-397.5 -143.5q-248 0 -400.5 126.5t-152.5 390.5zM408 1548l258 236h141l256 -236l-92 -78l-234 203l-237 -203z" /> +<glyph unicode="Ü" horiz-adv-x="1472" d="M182 492v874h168v-842q0 -205 105.5 -304t281.5 -99q174 0 279.5 98t105.5 293v854h168v-846q0 -258 -157.5 -401.5t-397.5 -143.5q-248 0 -400.5 126.5t-152.5 390.5zM395 1624q0 43 32 74t75 31q41 0 72.5 -31t31.5 -74t-31.5 -73.5t-72.5 -30.5q-43 0 -75 30.5 t-32 73.5zM866 1624q0 43 32 74t73 31q43 0 74.5 -31t31.5 -74t-31.5 -73.5t-74.5 -30.5q-41 0 -73 30.5t-32 73.5z" /> +<glyph unicode="Ý" horiz-adv-x="1177" d="M16 1366h199l377 -608l381 608h188l-487 -770v-596h-168v594zM416 1569l395 194l63 -147l-419 -146z" /> +<glyph unicode="Þ" horiz-adv-x="1148" d="M201 0v1366h168v-311h258q242 0 349 -101.5t107 -261.5q0 -188 -121.5 -292.5t-334.5 -104.5h-258v-295h-168zM369 436h227q307 0 307 242q0 236 -307 235h-227v-477z" /> +<glyph unicode="ß" horiz-adv-x="1157" d="M57 793v84l146 55v78q0 219 102.5 339.5t292.5 120.5q164 0 255 -85t91 -199q0 -76 -49 -150l-98 -142q-49 -69 -49 -134q0 -57 35.5 -107.5t86.5 -90.5l102 -83q50 -43 86 -103.5t36 -133.5q0 -123 -91.5 -195t-242.5 -72q-78 0 -144.5 18.5t-95.5 39.5l-28 18l34 142 q102 -84 238 -84q78 0 120 33.5t42 90.5q0 51 -35 97.5t-86 85.5l-102 81q-50 42 -84.5 103.5t-34.5 134.5q0 68 29.5 131.5t66.5 103.5t66.5 94t29.5 107q0 76 -55 118t-133 42q-100 0 -163 -76.5t-63 -236.5v-1018h-159v793h-146z" /> +<glyph unicode="à" horiz-adv-x="960" d="M74 207q0 141 143 230t410 124v35q0 45 -1 65.5t-8.5 54.5t-22.5 49t-45 28.5t-75 13.5q-150 -2 -289 -102l-49 129q16 12 49 30.5t132.5 50t201.5 31.5q147 0 206.5 -67.5t59.5 -225.5v-415q0 -104 88 -121l15 -2l-53 -129q-164 18 -199 149q-10 -16 -30.5 -37.5 t-57.5 -52.5t-94.5 -50.5t-122.5 -19.5q-117 0 -187.5 65t-70.5 167zM170 1432h174l207 -340l-94 -56zM244 217q0 -102 121 -102q125 0 262 159v170q-199 -33 -291 -86t-92 -141z" /> +<glyph unicode="á" horiz-adv-x="960" d="M74 207q0 141 143 230t410 124v35q0 45 -1 65.5t-8.5 54.5t-22.5 49t-45 28.5t-75 13.5q-150 -2 -289 -102l-49 129q16 12 49 30.5t132.5 50t201.5 31.5q147 0 206.5 -67.5t59.5 -225.5v-415q0 -104 88 -121l15 -2l-53 -129q-164 18 -199 149q-10 -16 -30.5 -37.5 t-57.5 -52.5t-94.5 -50.5t-122.5 -19.5q-117 0 -187.5 65t-70.5 167zM244 217q0 -102 121 -102q125 0 262 159v170q-199 -33 -291 -86t-92 -141zM375 1092l207 340h174l-287 -396z" /> +<glyph unicode="â" horiz-adv-x="960" d="M74 207q0 141 143 230t410 124v35q0 45 -1 65.5t-8.5 54.5t-22.5 49t-45 28.5t-75 13.5q-150 -2 -289 -102l-49 129q16 12 49 30.5t132.5 50t201.5 31.5q147 0 206.5 -67.5t59.5 -225.5v-415q0 -104 88 -121l15 -2l-53 -129q-164 18 -199 149q-10 -16 -30.5 -37.5 t-57.5 -52.5t-94.5 -50.5t-122.5 -19.5q-117 0 -187.5 65t-70.5 167zM178 1085l230 347h110l230 -347l-101 -51l-184 256l-184 -256zM244 217q0 -102 121 -102q125 0 262 159v170q-199 -33 -291 -86t-92 -141z" /> +<glyph unicode="ã" horiz-adv-x="960" d="M74 207q0 141 143 230t410 124v35q0 45 -1 65.5t-8.5 54.5t-22.5 49t-45 28.5t-75 13.5q-150 -2 -289 -102l-49 129q16 12 49 30.5t132.5 50t201.5 31.5q147 0 206.5 -67.5t59.5 -225.5v-415q0 -104 88 -121l15 -2l-53 -129q-164 18 -199 149q-10 -16 -30.5 -37.5 t-57.5 -52.5t-94.5 -50.5t-122.5 -19.5q-117 0 -187.5 65t-70.5 167zM162 1130v11q0 20 2 42.5t12 60.5t27.5 65.5t51.5 49t81 21.5q49 0 90 -24.5t61.5 -54t46 -54t50.5 -24.5q61 0 69 131v14h111v-10q0 -29 -5 -60.5t-20.5 -79t-55.5 -78t-97 -30.5q-49 0 -89 24.5 t-60.5 54.5t-46 54.5t-50.5 24.5q-68 0 -68 -129v-9h-110zM244 217q0 -102 121 -102q125 0 262 159v170q-199 -33 -291 -86t-92 -141z" /> +<glyph unicode="ä" horiz-adv-x="960" d="M74 207q0 141 143 230t410 124v35q0 45 -1 65.5t-8.5 54.5t-22.5 49t-45 28.5t-75 13.5q-150 -2 -289 -102l-49 129q16 12 49 30.5t132.5 50t201.5 31.5q147 0 206.5 -67.5t59.5 -225.5v-415q0 -104 88 -121l15 -2l-53 -129q-164 18 -199 149q-10 -16 -30.5 -37.5 t-57.5 -52.5t-94.5 -50.5t-122.5 -19.5q-117 0 -187.5 65t-70.5 167zM172 1266q0 43 32 73.5t75 30.5q41 0 72.5 -30.5t31.5 -73.5t-32 -74t-72 -31q-43 0 -75 31t-32 74zM244 217q0 -102 121 -102q125 0 262 159v170q-199 -33 -291 -86t-92 -141zM541 1266q0 43 31.5 73.5 t72.5 30.5q43 0 75 -30.5t32 -73.5t-32 -74t-75 -31q-41 0 -72.5 31t-31.5 74z" /> +<glyph unicode="å" horiz-adv-x="960" d="M74 207q0 141 143 230t410 124v35q0 45 -1 65.5t-8.5 54.5t-22.5 49t-45 28.5t-75 13.5q-150 -2 -289 -102l-49 129q16 12 49 30.5t132.5 50t201.5 31.5q147 0 206.5 -67.5t59.5 -225.5v-415q0 -104 88 -121l15 -2l-53 -129q-164 18 -199 149q-10 -16 -30.5 -37.5 t-57.5 -52.5t-94.5 -50.5t-122.5 -19.5q-117 0 -187.5 65t-70.5 167zM244 217q0 -102 121 -102q125 0 262 159v170q-199 -33 -291 -86t-92 -141zM274 1269.5q0 69.5 48.5 118t140.5 48.5t140 -48.5t48 -118t-48 -120.5t-140 -51t-140.5 51t-48.5 120.5zM369 1268 q0 -37 23.5 -63.5t70.5 -26.5t71.5 26.5t24.5 63.5t-23.5 62.5t-72.5 25.5q-94 0 -94 -88z" /> +<glyph unicode="æ" horiz-adv-x="1538" d="M74 207q0 131 147.5 219t425.5 121v49q0 57 -3 85t-16.5 62.5t-46 49t-87.5 14.5q-72 0 -149 -25.5t-118 -52.5l-41 -24l-49 129q18 12 50 30.5t131.5 50t197.5 31.5q201 0 250 -139q123 139 311 139q162 0 264.5 -108.5t102.5 -296.5l-98 -29l-545 -72q10 -143 91 -234 t214 -91q72 0 143.5 28.5t106.5 57.5l35 26l57 -116q-14 -14 -43 -37t-123 -61t-195 -38q-266 0 -380 222q-41 -88 -130.5 -155t-216.5 -67q-125 0 -205.5 66t-80.5 166zM244 217q0 -102 137 -102q117 0 187.5 83t70.5 230q-395 -57 -395 -211zM807 563l461 60q0 8 -3 20 t-15.5 45t-33 58.5t-61.5 46t-94 20.5q-102 0 -169 -68.5t-85 -181.5z" /> +<glyph unicode="ç" horiz-adv-x="933" d="M90 451q0 201 128 348t343 147q88 0 163 -24.5t107 -49.5l31 -26l-71 -125q-10 10 -31 24.5t-83.5 38t-125.5 23.5q-133 0 -213 -100.5t-80 -247.5q0 -145 81 -244.5t218 -99.5q143 4 250 98l55 -119q-12 -12 -35.5 -32.5t-106.5 -53.5t-175 -33h-6l-7 -12 q-23 -49 -22 -67q0 -23 27.5 -40.5t59.5 -30.5t59.5 -45t27.5 -77q0 -76 -65.5 -133t-161.5 -57q-49 0 -97.5 16t-70.5 33l-23 14l43 100q66 -57 144 -57q45 0 74.5 19.5t29.5 48.5q0 23 -25.5 41t-57.5 30.5t-57.5 36t-25.5 53.5q0 25 37 109l12 29q-160 33 -255 161 t-95 304z" /> +<glyph unicode="è" horiz-adv-x="997" d="M92 440q0 219 124 362.5t319 143.5q164 0 266 -109.5t102 -301.5l-98 -29l-543 -72q10 -145 91 -232t214 -87q70 0 142.5 28.5t109.5 57.5l37 30l47 -122q-14 -14 -43 -37t-121 -60t-190 -37q-217 0 -337 135t-120 330zM221 1432h174l207 -340l-94 -56zM264 557l463 59 q0 8 -3 21.5t-15.5 47.5t-33 59.5t-60.5 47t-91 21.5q-106 0 -174 -71.5t-86 -184.5z" /> +<glyph unicode="é" horiz-adv-x="997" d="M92 440q0 219 124 362.5t319 143.5q164 0 266 -109.5t102 -301.5l-98 -29l-543 -72q10 -145 91 -232t214 -87q70 0 142.5 28.5t109.5 57.5l37 30l47 -122q-14 -14 -43 -37t-121 -60t-190 -37q-217 0 -337 135t-120 330zM264 557l463 59q0 8 -3 21.5t-15.5 47.5t-33 59.5 t-60.5 47t-91 21.5q-106 0 -174 -71.5t-86 -184.5zM426 1092l207 340h174l-287 -396z" /> +<glyph unicode="ê" horiz-adv-x="997" d="M92 440q0 219 124 362.5t319 143.5q164 0 266 -109.5t102 -301.5l-98 -29l-543 -72q10 -145 91 -232t214 -87q70 0 142.5 28.5t109.5 57.5l37 30l47 -122q-14 -14 -43 -37t-121 -60t-190 -37q-217 0 -337 135t-120 330zM229 1085l230 347h110l230 -347l-101 -51l-184 256 l-184 -256zM264 557l463 59q0 8 -3 21.5t-15.5 47.5t-33 59.5t-60.5 47t-91 21.5q-106 0 -174 -71.5t-86 -184.5z" /> +<glyph unicode="ë" horiz-adv-x="997" d="M92 440q0 219 124 362.5t319 143.5q164 0 266 -109.5t102 -301.5l-98 -29l-543 -72q10 -145 91 -232t214 -87q70 0 142.5 28.5t109.5 57.5l37 30l47 -122q-14 -14 -43 -37t-121 -60t-190 -37q-217 0 -337 135t-120 330zM223 1266q0 43 32 73.5t75 30.5q41 0 72.5 -30.5 t31.5 -73.5t-31.5 -74t-72.5 -31q-43 0 -75 31t-32 74zM264 557l463 59q0 8 -3 21.5t-15.5 47.5t-33 59.5t-60.5 47t-91 21.5q-106 0 -174 -71.5t-86 -184.5zM592 1266q0 43 31.5 73.5t72.5 30.5q43 0 75 -30.5t32 -73.5t-32 -74t-75 -31q-41 0 -72.5 31t-31.5 74z" /> +<glyph unicode="ì" horiz-adv-x="471" d="M-57 1432h174l207 -340l-95 -56zM156 0v922h159v-922h-159z" /> +<glyph unicode="í" horiz-adv-x="471" d="M147 1092l207 340h174l-286 -396zM156 0v922h159v-922h-159z" /> +<glyph unicode="î" horiz-adv-x="471" d="M-49 1085l229 347h111l229 -347l-100 -51l-184 256l-185 -256zM156 0v922h159v-922h-159z" /> +<glyph unicode="ï" horiz-adv-x="471" d="M-55 1266q0 43 31.5 73.5t74.5 30.5q41 0 73 -30.5t32 -73.5t-32 -74t-73 -31q-43 0 -74.5 31t-31.5 74zM156 0v922h159v-922h-159zM313 1266q0 43 32 73.5t73 30.5q43 0 74.5 -30.5t31.5 -73.5t-31.5 -74t-74.5 -31q-41 0 -73 31t-32 74z" /> +<glyph unicode="ð" horiz-adv-x="1103" d="M90 449q0 199 128 348t319 149q166 0 247 -88q-74 197 -231 334l-258 -158l-59 103l215 131q-131 80 -281 123l35 125q215 -43 385 -164l282 172l58 -103l-244 -147q145 -135 225 -317.5t80 -383.5q0 -270 -125 -434t-344 -164q-197 0 -314.5 143t-117.5 331zM258 465 q0 -135 71.5 -242.5t203 -107.5t214 110.5t82.5 337.5q0 111 -62 177.5t-189 66.5q-141 0 -230.5 -96t-89.5 -246z" /> +<glyph unicode="ñ" horiz-adv-x="1079" d="M152 0v907l159 29v-180q184 190 381 190q111 0 176.5 -67.5t65.5 -208.5v-670h-160v625q0 180 -125 180q-135 0 -338 -197v-608h-159zM250 1130v11q0 20 2 42.5t12 60.5t27.5 65.5t51.5 49t81 21.5q49 0 90 -24.5t61.5 -54t46 -54t50.5 -24.5q61 0 69 131v14h111v-10 q0 -29 -5 -60.5t-20.5 -79t-55.5 -78t-97 -30.5q-49 0 -89 24.5t-60.5 54.5t-46 54.5t-50.5 24.5q-68 0 -68 -129v-9h-110z" /> +<glyph unicode="ò" horiz-adv-x="1091" d="M90 457q0 121 49 229.5t156.5 184t253.5 75.5q205 0 328.5 -139t123.5 -328q0 -119 -48 -230.5t-157.5 -192.5t-254.5 -81q-205 0 -328 143.5t-123 338.5zM252 1432h174l207 -340l-94 -56zM258 475.5q0 -149.5 74 -255t215 -105.5q129 0 208 94t79 244q0 147 -72 250.5 t-217 103.5q-131 0 -209 -91t-78 -240.5z" /> +<glyph unicode="ó" horiz-adv-x="1091" d="M90 457q0 121 49 229.5t156.5 184t253.5 75.5q205 0 328.5 -139t123.5 -328q0 -119 -48 -230.5t-157.5 -192.5t-254.5 -81q-205 0 -328 143.5t-123 338.5zM258 475.5q0 -149.5 74 -255t215 -105.5q129 0 208 94t79 244q0 147 -72 250.5t-217 103.5q-131 0 -209 -91 t-78 -240.5zM457 1092l207 340h174l-287 -396z" /> +<glyph unicode="ô" horiz-adv-x="1091" d="M90 457q0 121 49 229.5t156.5 184t253.5 75.5q205 0 328.5 -139t123.5 -328q0 -119 -48 -230.5t-157.5 -192.5t-254.5 -81q-205 0 -328 143.5t-123 338.5zM258 475.5q0 -149.5 74 -255t215 -105.5q129 0 208 94t79 244q0 147 -72 250.5t-217 103.5q-131 0 -209 -91 t-78 -240.5zM260 1085l229 347h111l229 -347l-100 -51l-184 256l-185 -256z" /> +<glyph unicode="õ" horiz-adv-x="1091" d="M90 457q0 121 49 229.5t156.5 184t253.5 75.5q205 0 328.5 -139t123.5 -328q0 -119 -48 -230.5t-157.5 -192.5t-254.5 -81q-205 0 -328 143.5t-123 338.5zM244 1130v11q0 20 2 42.5t12 60.5t27.5 65.5t51.5 49t81 21.5q49 0 90 -24.5t61.5 -54t46 -54t50.5 -24.5 q61 0 69 131v14h111v-10q0 -29 -5 -60.5t-20.5 -79t-55.5 -78t-97 -30.5q-49 0 -89 24.5t-60.5 54.5t-46.5 54.5t-50 24.5q-68 0 -68 -129v-9h-110zM258 475.5q0 -149.5 74 -255t215 -105.5q129 0 208 94t79 244q0 147 -72 250.5t-217 103.5q-131 0 -209 -91t-78 -240.5z " /> +<glyph unicode="ö" horiz-adv-x="1091" d="M90 457q0 121 49 229.5t156.5 184t253.5 75.5q205 0 328.5 -139t123.5 -328q0 -119 -48 -230.5t-157.5 -192.5t-254.5 -81q-205 0 -328 143.5t-123 338.5zM254 1266q0 43 31.5 73.5t74.5 30.5q41 0 73 -30.5t32 -73.5t-32 -74t-73 -31q-43 0 -74.5 31t-31.5 74z M258 475.5q0 -149.5 74 -255t215 -105.5q129 0 208 94t79 244q0 147 -72 250.5t-217 103.5q-131 0 -209 -91t-78 -240.5zM623 1266q0 43 31.5 73.5t72.5 30.5q43 0 75 -30.5t32 -73.5t-32 -74t-75 -31q-41 0 -72.5 31t-31.5 74z" /> +<glyph unicode="÷" d="M74 446v134h917v-134h-917zM410 121q0 51 35.5 87t87 36t87 -36t35.5 -87t-35.5 -87t-87 -36t-87 36t-35.5 87zM410 905q0 51 35.5 87t87 36t87 -36t35.5 -87t-35.5 -87t-87 -36t-87 36t-35.5 87z" /> +<glyph unicode="ø" horiz-adv-x="1091" d="M90 457q0 121 49 229.5t156.5 184t253.5 75.5q137 0 244 -69l79 106h127l-127 -172q129 -139 129 -332q0 -119 -48 -230.5t-157.5 -192.5t-254.5 -81q-137 0 -240 68l-78 -104h-129l127 170q-131 141 -131 348zM258 475q0 -141 61 -235l386 518q-66 49 -160 49 q-131 0 -209 -91t-78 -241zM389 162q70 -47 158 -47q129 0 208 94t79 244q0 133 -58 229z" /> +<glyph unicode="ù" horiz-adv-x="1067" d="M145 252v670h160v-625q0 -180 131 -180q139 0 312 172v633h159v-637q0 -49 10.5 -121t20.5 -119l10 -45l-157 -14q-23 102 -31 168q-166 -178 -365 -179q-250 1 -250 277zM236 1432h174l206 -340l-94 -56z" /> +<glyph unicode="ú" horiz-adv-x="1067" d="M145 252v670h160v-625q0 -180 131 -180q139 0 312 172v633h159v-637q0 -49 10.5 -121t20.5 -119l10 -45l-157 -14q-23 102 -31 168q-166 -178 -365 -179q-250 1 -250 277zM440 1092l207 340h174l-286 -396z" /> +<glyph unicode="û" horiz-adv-x="1067" d="M145 252v670h160v-625q0 -180 131 -180q139 0 312 172v633h159v-637q0 -49 10.5 -121t20.5 -119l10 -45l-157 -14q-23 102 -31 168q-166 -178 -365 -179q-250 1 -250 277zM244 1085l229 347h111l229 -347l-100 -51l-185 256l-184 -256z" /> +<glyph unicode="ü" horiz-adv-x="1067" d="M145 252v670h160v-625q0 -180 131 -180q139 0 312 172v633h159v-637q0 -49 10.5 -121t20.5 -119l10 -45l-157 -14q-23 102 -31 168q-166 -178 -365 -179q-250 1 -250 277zM238 1266q0 43 31.5 73.5t74.5 30.5q41 0 73 -30.5t32 -73.5t-32 -74t-73 -31q-43 0 -74.5 31 t-31.5 74zM606 1266q0 43 32 73.5t73 30.5q43 0 74.5 -30.5t31.5 -73.5t-31.5 -74t-74.5 -31q-41 0 -73 31t-32 74z" /> +<glyph unicode="ý" horiz-adv-x="935" d="M33 922h174l268 -652l260 652h168l-411 -992q-74 -178 -167.5 -288.5t-230.5 -126.5l-51 133q180 37 289 282l59 138zM389 1092l207 340h174l-287 -396z" /> +<glyph unicode="þ" horiz-adv-x="1077" d="M156 -475v1909l159 28v-663q88 147 279 147q178 0 284.5 -131t106.5 -330q0 -213 -129 -361.5t-344 -148.5q-131 0 -197 56v-477zM315 231q0 -117 172 -116q154 0 241 96t87 264q0 152 -67.5 240t-174.5 88q-150 0 -258 -158v-414z" /> +<glyph unicode="ÿ" horiz-adv-x="935" d="M33 922h174l268 -652l260 652h168l-411 -992q-74 -178 -167.5 -288.5t-230.5 -126.5l-51 133q180 37 289 282l59 138zM186 1266q0 43 32 73.5t75 30.5q41 0 72.5 -30.5t31.5 -73.5t-31.5 -74t-72.5 -31q-43 0 -75 31t-32 74zM555 1266q0 43 31.5 73.5t72.5 30.5 q43 0 75 -30.5t32 -73.5t-32 -74t-75 -31q-41 0 -72.5 31t-31.5 74z" /> +<glyph unicode="Œ" horiz-adv-x="2009" d="M102 680q0 139 47.5 265t137.5 226.5t235.5 160t325.5 59.5q127 0 256 -25h801v-141h-637v-457h504v-141h-504v-486h635v-141h-803q-141 -25 -269 -25q-334 0 -531.5 204t-197.5 501zM283 692q0 -100 31.5 -197.5t96 -183.5t176 -138t255 -52t258.5 20v1073 q-117 31 -264 31q-264 0 -408.5 -164t-144.5 -389z" /> +<glyph unicode="œ" horiz-adv-x="1738" d="M90 457q0 121 49 229.5t156.5 184t253.5 75.5q244 0 375 -201q119 201 352 201q164 0 266.5 -109.5t102.5 -301.5l-99 -29l-549 -72q10 -145 92 -232t220 -87q70 0 140.5 28.5t106.5 57.5l35 26l58 -116q-16 -14 -45 -37t-122 -61t-192 -38q-254 0 -377 203 q-131 -203 -372 -203q-205 0 -328 143.5t-123 338.5zM258 475.5q0 -149.5 74 -255t215 -105.5q129 0 208 94t79 244q0 147 -72 250.5t-217 103.5q-131 0 -209 -91t-78 -240.5zM999 555l469 61q0 8 -3 21.5t-15 47.5t-32.5 59.5t-60.5 47t-91 21.5q-111 0 -180 -71.5 t-87 -186.5z" /> +<glyph unicode="Ÿ" horiz-adv-x="1177" d="M16 1366h199l377 -608l381 608h188l-487 -770v-596h-168v594zM260 1624q0 43 32 74t75 31q41 0 72.5 -31t31.5 -74t-31.5 -73.5t-72.5 -30.5q-43 0 -75 30.5t-32 73.5zM731 1624q0 43 32 74t73 31q43 0 74.5 -31t31.5 -74t-31.5 -73.5t-74.5 -30.5q-41 0 -73 30.5 t-32 73.5z" /> +<glyph unicode="ˆ" horiz-adv-x="1032" d="M231 1085l230 347h110l230 -347l-101 -51l-184 256l-184 -256z" /> +<glyph unicode="˜" horiz-adv-x="1032" d="M215 1130v11q0 20 2 42.5t12.5 60.5t27.5 65.5t51 49t81 21.5q49 0 90 -24.5t61.5 -54t46 -54t50.5 -24.5q61 0 70 131v14h110v-10q0 -29 -5 -60.5t-20.5 -79t-55.5 -78t-97 -30.5q-49 0 -89 24.5t-60.5 54.5t-46 54.5t-50.5 24.5q-68 0 -67 -129v-9h-111z" /> +<glyph unicode=" " horiz-adv-x="892" /> +<glyph unicode=" " horiz-adv-x="1784" /> +<glyph unicode=" " horiz-adv-x="892" /> +<glyph unicode=" " horiz-adv-x="1784" /> +<glyph unicode=" " horiz-adv-x="594" /> +<glyph unicode=" " horiz-adv-x="446" /> +<glyph unicode=" " horiz-adv-x="297" /> +<glyph unicode=" " horiz-adv-x="297" /> +<glyph unicode=" " horiz-adv-x="223" /> +<glyph unicode=" " horiz-adv-x="356" /> +<glyph unicode=" " horiz-adv-x="99" /> +<glyph unicode="‐" horiz-adv-x="692" d="M115 438v148h463v-148h-463z" /> +<glyph unicode="‑" horiz-adv-x="692" d="M115 438v148h463v-148h-463z" /> +<glyph unicode="‒" horiz-adv-x="692" d="M115 438v148h463v-148h-463z" /> +<glyph unicode="–" horiz-adv-x="1069" d="M115 453v133h839v-133h-839z" /> +<glyph unicode="—" horiz-adv-x="1867" d="M115 453v133h1638v-133h-1638z" /> +<glyph unicode="‘" horiz-adv-x="432" d="M100 1190q0 186 181 323l71 -73q-100 -80 -100 -180q0 -102 106 -213l-155 -91q-103 97 -103 234z" /> +<glyph unicode="’" horiz-adv-x="423" d="M78 1423l155 90q102 -96 103 -233q0 -186 -180 -324l-72 74q100 80 100 180q0 102 -106 213z" /> +<glyph unicode="‚" horiz-adv-x="487" d="M100 154l168 90q109 -102 109 -234q0 -88 -50.5 -173t-136.5 -150l-71 73q106 84 106 181q0 82 -125 213z" /> +<glyph unicode="“" horiz-adv-x="763" d="M100 1190q0 186 181 323l71 -73q-100 -80 -100 -180q0 -102 106 -213l-155 -91q-103 97 -103 234zM432 1190q0 186 180 323l72 -73q-100 -80 -100 -180q0 -102 106 -213l-155 -91q-103 97 -103 234z" /> +<glyph unicode="”" horiz-adv-x="755" d="M78 1423l155 90q102 -96 103 -233q0 -186 -180 -324l-72 74q100 80 100 180q0 102 -106 213zM410 1423l155 90q102 -96 103 -233q0 -186 -181 -324l-71 74q100 80 100 180q0 102 -106 213z" /> +<glyph unicode="„" horiz-adv-x="819" d="M100 154l168 90q109 -102 109 -234q0 -88 -50.5 -173t-136.5 -150l-71 73q106 84 106 181q0 82 -125 213zM432 154l168 90q109 -102 109 -234q0 -88 -50.5 -173t-136.5 -150l-71 73q106 84 106 181q0 82 -125 213z" /> +<glyph unicode="•" horiz-adv-x="778" d="M106 524.5q0 118.5 82 200.5t201 82t201 -82t82 -200.5t-82 -200.5t-201 -82t-201 82t-82 200.5z" /> +<glyph unicode="…" horiz-adv-x="1593" d="M121 98.5q0 51.5 36 87t87 35.5t87 -35.5t36 -87t-36 -87.5t-87 -36t-87 36t-36 87.5zM674 98.5q0 51.5 35.5 87t87 35.5t87.5 -35.5t36 -87t-36 -87.5t-87.5 -36t-87 36t-35.5 87.5zM1227 98.5q0 51.5 35.5 87t87 35.5t87.5 -35.5t36 -87t-36 -87.5t-87.5 -36t-87 36 t-35.5 87.5z" /> +<glyph unicode=" " horiz-adv-x="356" /> +<glyph unicode="‹" horiz-adv-x="655" d="M49 510v8q35 27 285 303l115 125l110 -31l-309 -401l309 -401l-110 -31l-168 182l-111 121l-60 66l-38 38q-11 11 -23 21z" /> +<glyph unicode="›" horiz-adv-x="657" d="M98 113l310 401l-310 401l111 31q362 -397 389 -420q4 -2 10 -8v-8q-12 -10 -22 -21l-38 -38l-61 -66l-110 -121l-168 -182z" /> +<glyph unicode=" " horiz-adv-x="446" /> +<glyph unicode="€" horiz-adv-x="1142" d="M86 375v102h109q-4 27 -5 82q0 25 5 78h-105v102h121q45 188 179 303t335 115q180 -2 313 -80l-43 -145q-119 86 -278 86q-137 0 -221 -77t-117 -202h561l-31 -102h-549q-2 -23 -2 -66q0 -47 7 -94h499l-30 -102h-445q39 -119 127 -189.5t211 -70.5q66 0 131.5 18.5 t97.5 34.5l33 18l49 -125q-14 -10 -39.5 -24t-110.5 -38t-173 -24q-190 0 -322.5 107.5t-179.5 292.5h-127z" /> +<glyph unicode="™" horiz-adv-x="1359" d="M76 1278v88h463v-88h-179v-457h-106v457h-178zM629 821l20 545h156l127 -371l129 371h151l21 -545h-103l-16 422l-149 -422h-70l-150 424l-12 -424h-104z" /> +<glyph unicode="" horiz-adv-x="920" d="M0 920h920v-920h-920v920z" /> +<glyph unicode="fi" horiz-adv-x="1075" d="M57 793v84l146 55v78q0 225 108.5 353t292.5 128q162 0 279 -78l-74 -127q-100 66 -209 66q-102 0 -170 -82t-68 -252v-96h558v-922h-160v803h-398v-803h-159v793h-146z" /> +<glyph unicode="fl" horiz-adv-x="1105" d="M57 793v84l146 55v78q0 225 108.5 353t292.5 128q115 0 227 -51l119 22v-1462h-159v1296q-98 55 -191 56q-102 0 -170 -82t-68 -252v-96h261v-129h-261v-793h-159v793h-146z" /> +<glyph unicode="ffi" horiz-adv-x="1669" d="M57 793v84l146 55v47q0 217 111.5 339t299.5 122q141 0 275 -82q104 133 289 133q68 0 132 -19.5t95 -37.5l31 -21l-74 -127q-92 66 -188 66q-94 0 -156 -76t-62 -238v-116h557v-922h-159v803h-398v-803h-159v803h-435v-803h-159v793h-146zM362 922h435v108q0 109 28 199 q-115 72 -215 71q-109 0 -178.5 -75.5t-69.5 -237.5v-65z" /> +<glyph unicode="ffl" horiz-adv-x="1699" d="M57 793v84l146 55v47q0 217 111.5 339t299.5 122q147 0 283 -88q109 139 301 139q115 0 227 -51l119 22v-1462h-160v1296q-98 55 -190 56q-102 0 -170 -82t-68 -252v-96h261v-129h-261v-793h-159v803h-435v-803h-159v793h-146zM362 922h435v88q0 125 32 215 q-119 76 -219 75q-109 0 -178.5 -75.5t-69.5 -237.5v-65z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansRegular-webfont.ttf b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansRegular-webfont.ttf new file mode 100755 index 0000000000000000000000000000000000000000..9856192a5d6fc9a8c0f7c17c5135d6ccc7df2520 Binary files /dev/null and b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansRegular-webfont.ttf differ diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansRegular-webfont.woff b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansRegular-webfont.woff new file mode 100755 index 0000000000000000000000000000000000000000..9477ccebc8b71a1372e3dcb2dd9f51abdc13cb46 Binary files /dev/null and b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansRegular-webfont.woff differ diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansSemiBold-webfont.eot b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansSemiBold-webfont.eot new file mode 100755 index 0000000000000000000000000000000000000000..2833c1bf81cfc3be091dbe4aa7f8c920db677c9f Binary files /dev/null and b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansSemiBold-webfont.eot differ diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansSemiBold-webfont.svg b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansSemiBold-webfont.svg new file mode 100755 index 0000000000000000000000000000000000000000..ef1eaf6677446007fb75d3fde3e01940f2594aa8 --- /dev/null +++ b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansSemiBold-webfont.svg @@ -0,0 +1,243 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Fontspring. +</metadata> +<defs> +<font id="webfontFCImWf6J" horiz-adv-x="491" > +<font-face units-per-em="2048" ascent="1536" descent="-512" /> +<missing-glyph horiz-adv-x="500" /> +<glyph unicode=" " /> +<glyph unicode="!" horiz-adv-x="567" d="M145 112.5q0 57.5 40 98.5t97.5 41t98.5 -40t41 -99q0 -57 -41 -97.5t-98.5 -40.5t-97.5 40t-40 97.5zM168 1391h235l-34 -963h-170z" /> +<glyph unicode=""" horiz-adv-x="747" d="M125 856v510h182v-76l-57 -434h-125zM465 856v510h184v-76l-59 -434h-125z" /> +<glyph unicode="#" horiz-adv-x="1359" d="M72 244l22 127h256l60 284h-258l20 127h262l84 402h131l-82 -402h301l84 402h131l-82 -402h285l-22 -127h-289l-57 -284h288l-20 -127h-295l-86 -426h-133l86 426h-301l-86 -426h-133l86 426h-252zM483 371h301l60 284h-303z" /> +<glyph unicode="$" horiz-adv-x="960" d="M78 86l45 174q12 -10 35.5 -26.5t103.5 -45t168 -34.5l10 344q-160 57 -251 134t-91 206q0 123 89 210t270 101l6 178h94l-6 -176q82 -2 155.5 -17.5t106.5 -29.5l33 -14l-55 -166q-100 49 -244 57l-8 -328q160 -57 249 -135t89 -207q0 -133 -94.5 -219t-262.5 -100 l-4 -174h-94l4 170q-98 2 -185 26.5t-126 46.5zM289 850q0 -61 39 -96t116 -68l9 295q-164 -16 -164 -131zM524 156q158 20 158 143q0 61 -36 97t-114 67z" /> +<glyph unicode="%" horiz-adv-x="1527" d="M76 1040q0 131 91 222.5t228 91.5q139 0 230.5 -91.5t91.5 -222.5t-92.5 -222t-229.5 -91t-228 91t-91 222zM211 1040q0 -74 53 -131t131 -57q80 0 133.5 57.5t53.5 130.5q0 76 -53.5 132.5t-133.5 56.5t-132 -56.5t-52 -132.5zM223 0l963 1384l94 -63l-920 -1321h-137z M815 289q0 131 91 223t229 92q139 0 230 -91t91 -224q0 -131 -92 -222.5t-229.5 -91.5t-228.5 91.5t-91 222.5zM950 289q0 -74 53.5 -130.5t131.5 -56.5q80 0 133 56.5t53 130.5q0 76 -53.5 132t-133 56t-132 -56t-52.5 -132z" /> +<glyph unicode="&" horiz-adv-x="1415" d="M80 328q0 127 75.5 218t211.5 173q-111 199 -111 342q0 131 89 230.5t265 99.5q156 0 243 -82t87 -213q0 -133 -81 -223.5t-230 -182.5q68 -96 112 -147q72 -88 179 -195q166 221 192 578h186q-14 -168 -76.5 -357.5t-172.5 -332.5q180 -145 311 -183l-76 -139 q-158 23 -373 184q-162 -123 -372 -123q-186 0 -322.5 90.5t-136.5 262.5zM274 340q0 -94 78 -146.5t191 -52.5q125 0 235 72q-92 82 -211 223q-68 82 -114 148q-179 -117 -179 -244zM469 1065q0 -100 76 -240q207 125 207 254q0 61 -37 103.5t-103 42.5q-70 0 -106.5 -46 t-36.5 -114z" /> +<glyph unicode="'" horiz-adv-x="407" d="M125 856v510h188v-76l-73 -434h-115z" /> +<glyph unicode="(" horiz-adv-x="600" d="M100 553q0 152 32 297t78 244.5t91 177.5t76 114l33 37l149 -45l-32 -39q-19 -25 -69 -108.5t-89 -173.5t-71 -228.5t-32 -275.5q0 -152 31 -298t75 -246.5t88 -179.5t75 -116l30 -39l-145 -53q-12 14 -33.5 42t-77 119t-97.5 192.5t-77 259t-35 319.5z" /> +<glyph unicode=")" horiz-adv-x="600" d="M35 -326l33 40q20 26 71 114t91 183t73 242.5t33 299.5q0 137 -31 273.5t-74 231.5t-86 171t-73 112l-31 37l152 45l32 -39q20 -25 73.5 -110.5t94.5 -180t74 -241.5t33 -299q0 -459 -242 -829q-43 -66 -76 -103z" /> +<glyph unicode="*" horiz-adv-x="1007" d="M86 854l301 102l35 -61l-240 -211zM86 1110l96 170l240 -209l-35 -61zM406 555l63 311h70l63 -311h-196zM406 1409h196l-63 -311h-70zM586 895l35 61l301 -102l-99 -170zM586 1071l237 209l99 -170l-301 -100z" /> +<glyph unicode="+" horiz-adv-x="1064" d="M57 444v148h400v416h155v-416h394v-148h-394v-444h-155v444h-400z" /> +<glyph unicode="," horiz-adv-x="487" d="M68 -289q90 82 110 119q27 47 27 111q0 102 -107 254l197 63q84 -111 84 -238q0 -207 -232 -393z" /> +<glyph unicode="-" horiz-adv-x="720" d="M111 438v156h499v-156h-499z" /> +<glyph unicode="." horiz-adv-x="501" d="M113 112.5q0 57.5 40 98.5t97 41t98 -41t41 -98.5t-41 -97.5t-98 -40t-97 40t-40 97.5z" /> +<glyph unicode="/" horiz-adv-x="946" d="M45 -401l682 1767h154l-680 -1767h-156z" /> +<glyph unicode="0" horiz-adv-x="1134" d="M94 471q0 209 127 364.5t354 155.5q221 0 343 -142t122 -341q0 -135 -49 -253t-161.5 -199t-270.5 -81q-217 0 -341 147.5t-124 348.5zM289 483q0 -139 71.5 -240.5t206.5 -101.5q139 0 209 100.5t70 245.5q0 139 -69.5 238.5t-207 99.5t-209 -100.5t-71.5 -241.5z" /> +<glyph unicode="1" horiz-adv-x="800" d="M102 0v164h230v641h-217v162h417v-803h211v-164h-641z" /> +<glyph unicode="2" horiz-adv-x="927" d="M90 123l50 38q32 24 113 92.5t142.5 132t111.5 144t50 142.5q0 66 -44 107.5t-114 41.5q-53 0 -109.5 -21.5t-86.5 -43.5l-31 -23l-82 129q16 14 47 36t121 57.5t178 35.5q145 0 238.5 -83t93.5 -208q0 -96 -65.5 -202.5t-136 -175t-179.5 -158.5h467v-164h-756z" /> +<glyph unicode="3" horiz-adv-x="827" d="M35 862q16 14 47 36t122 57.5t179 35.5q141 0 233.5 -77.5t92.5 -196.5q0 -109 -73 -197t-177 -145q137 -33 210.5 -120t73.5 -206q0 -201 -176 -323.5t-444 -122.5q-37 0 -57 2l-17 157q23 -2 66 -2q180 0 298.5 74t118.5 209q0 109 -90 158t-217 49h-49v158 q113 10 218.5 95t105.5 185q0 59 -42 96t-106 37q-109 0 -229 -88z" /> +<glyph unicode="4" horiz-adv-x="1081" d="M53 41v135l582 807h192v-784h191v-158h-191v-436h-198v436h-576zM260 199h369v522z" /> +<glyph unicode="5" horiz-adv-x="827" d="M63 -238q199 -16 338.5 54.5t139.5 228.5q0 70 -29 124t-69 85t-107.5 55.5t-115.5 33.5t-126 22v602h602v-164h-407v-299q207 -49 335 -152.5t128 -296.5q0 -223 -189.5 -345t-480.5 -105z" /> +<glyph unicode="6" horiz-adv-x="1052" d="M88 567q0 156 48 298.5t139.5 258t239 187t333.5 80.5l14 -162q-238 -16 -372 -141t-175 -318q88 115 265 115q184 0 291.5 -126t107.5 -308q0 -193 -117 -334.5t-319 -141.5q-219 0 -337 170t-118 422zM297 586q0 -190 67.5 -317.5t190.5 -127.5q100 0 157.5 81 t57.5 206q0 70 -16.5 129t-69.5 109.5t-141 50.5q-137 0 -246 -109v-22z" /> +<glyph unicode="7" horiz-adv-x="942" d="M57 784v183h836v-127q-221 -551 -578 -1250l-196 43q301 557 540 1151h-602z" /> +<glyph unicode="8" horiz-adv-x="1050" d="M94 334q0 119 75 207t206 174q-207 166 -207 344q0 145 107.5 238.5t271.5 93.5q158 0 261 -86t103 -228q0 -106 -60 -187t-169 -157q129 -88 200.5 -175t71.5 -204q0 -154 -122.5 -266.5t-311.5 -112.5q-178 0 -302 101.5t-124 257.5zM279 344q0 -88 69.5 -146.5 t163.5 -58.5q96 0 167 58.5t71 142.5q0 51 -38 104.5t-80 87t-124 89.5q-113 -74 -171 -136.5t-58 -140.5zM375 1071q0 -119 174 -246q176 125 176 242q0 76 -52 118t-126 42t-123 -42t-49 -114z" /> +<glyph unicode="9" horiz-adv-x="1060" d="M96 524q0 188 116 327.5t314 139.5q219 0 337 -170t118 -420q0 -154 -48 -292t-139.5 -250.5t-238.5 -182t-334 -77.5l-14 161q240 14 374 137t175 310q-88 -115 -267 -115q-180 0 -286.5 127t-106.5 305zM305 553q0 -51 9.5 -97t32 -93.5t69.5 -75t112 -27.5 q137 0 244 107v6q0 199 -66.5 325.5t-191.5 126.5q-96 0 -152.5 -77.5t-56.5 -194.5z" /> +<glyph unicode=":" horiz-adv-x="561" d="M143 112.5q0 57.5 40 98.5t98 41q59 0 99 -40t40 -99q0 -57 -41 -97.5t-98.5 -40.5t-97.5 40t-40 97.5zM143 798.5q0 57.5 40 97.5t97.5 40t98.5 -40t41 -97.5t-41 -98.5t-98.5 -41t-97.5 41t-40 98.5z" /> +<glyph unicode=";" horiz-adv-x="552" d="M104 -289q90 82 111 119q27 47 27 111q0 102 -107 254l197 63q84 -111 84 -238q0 -207 -232 -393zM139 796.5q0 57.5 40 98.5t97.5 41t98.5 -41t41 -98.5t-41 -97.5t-98.5 -40t-97.5 40t-40 97.5z" /> +<glyph unicode="<" horiz-adv-x="1064" d="M59 467v94l873 469l35 -151l-699 -365l699 -383l-35 -151z" /> +<glyph unicode="=" horiz-adv-x="1064" d="M78 252v147h909v-147h-909zM78 627v147h909v-147h-909z" /> +<glyph unicode=">" horiz-adv-x="1064" d="M96 131l699 383l-699 365l37 151l873 -469v-94l-873 -487z" /> +<glyph unicode="?" horiz-adv-x="757" d="M90 1262l45 186q23 -6 59.5 -18.5t132 -54.5t168 -87t132 -115.5t59.5 -144.5q0 -53 -32.5 -106.5t-79 -103.5t-91.5 -104.5t-77.5 -129t-32.5 -156.5h-164q-6 27 -6 59q0 88 39 173t87 138.5t87 111t39 94.5q0 57 -91.5 121.5t-183.5 99.5zM158 112.5q0 57.5 41 98.5 t98 41t98 -41t41 -98.5t-41 -97.5t-98 -40t-98 40t-41 97.5z" /> +<glyph unicode="@" horiz-adv-x="1736" d="M82 397q0 217 102.5 404.5t295 304.5t433.5 117q322 0 524.5 -192.5t202.5 -483.5q0 -133 -49 -252t-153 -191q-35 -25 -84 -45t-81 -29.5t-113 -27.5l-116 -27q-20 84 -32 150q-33 -61 -104.5 -105.5t-151.5 -44.5q-129 0 -215 107.5t-86 284.5q0 246 168 397t399 151 l152 -12v-584l16 -167q143 12 215 115.5t72 258.5q0 242 -151.5 401.5t-410.5 159.5q-295 0 -482 -204.5t-187 -487.5q0 -264 163.5 -436t383.5 -184l-25 -137q-293 14 -489.5 233t-196.5 526zM657 379q0 -102 37 -172t103 -70q100 0 182 131v498q-139 0 -230.5 -113.5 t-91.5 -273.5z" /> +<glyph unicode="A" horiz-adv-x="1282" d="M20 0l521 1376h200l521 -1376h-218l-135 365h-544l-134 -365h-211zM430 541h416l-209 565z" /> +<glyph unicode="B" horiz-adv-x="1216" d="M186 0v1366h402q244 0 353.5 -95t109.5 -233q0 -174 -164 -301q238 -98 237 -340q0 -180 -130 -288.5t-337 -108.5h-471zM397 176h230q137 0 205.5 58.5t68.5 159t-68.5 159.5t-205.5 59h-230v-436zM397 786h299q6 2 14.5 8.5t31 26t40 43t31.5 61.5t14 79 q0 186 -270 186h-160v-404z" /> +<glyph unicode="C" horiz-adv-x="1380" d="M92 667.5q0 309.5 206 516.5t542 207q127 0 242.5 -29t166.5 -57l51 -29l-81 -184q-16 12 -48 31.5t-134.5 52t-209.5 32.5q-240 0 -377 -152.5t-137 -369.5q0 -229 146.5 -378.5t367.5 -149.5q106 0 208 33.5t149 66.5l49 33l86 -158l-23 -17q-14 -11 -63 -38 t-103.5 -47.5t-140.5 -38t-176 -17.5q-309 0 -515 191.5t-206 501z" /> +<glyph unicode="D" horiz-adv-x="1484" d="M186 0v1366h447q145 0 275 -36t241 -111.5t175.5 -207.5t64.5 -306q0 -336 -227.5 -520.5t-606.5 -184.5h-369zM397 176h138q326 0 478 140.5t152 371.5q0 233 -144 367.5t-417 134.5h-207v-1014z" /> +<glyph unicode="E" horiz-adv-x="1116" d="M186 0v1366h832v-176h-621v-406h490v-178h-490v-430h627v-176h-838z" /> +<glyph unicode="F" horiz-adv-x="1064" d="M186 0v1366h820v-176h-609v-414h482v-182h-482v-594h-211z" /> +<glyph unicode="G" horiz-adv-x="1437" d="M92 662q0 303 204 516t552 213q258 0 450 -99l9 -4l-82 -182q-18 12 -52 28.5t-135.5 45t-199.5 28.5q-248 0 -387.5 -154.5t-139.5 -375.5q0 -231 152.5 -375.5t398.5 -144.5q53 0 112.5 7t94.5 15l33 6v359h-285v176h494v-682q-270 -63 -473 -64q-319 0 -532.5 188 t-213.5 499z" /> +<glyph unicode="H" horiz-adv-x="1552" d="M186 0v1366h211v-580h758v580h209v-1366h-209v608h-758v-608h-211z" /> +<glyph unicode="I" horiz-adv-x="585" d="M186 0v1366h211v-1366h-211z" /> +<glyph unicode="J" horiz-adv-x="585" d="M-57 -201q246 25 245 387v1180h211v-1176q0 -506 -385 -563z" /> +<glyph unicode="K" horiz-adv-x="1228" d="M186 0v1366h211v-561h33l508 561h264l-592 -641l619 -725h-273l-526 627h-33v-627h-211z" /> +<glyph unicode="L" horiz-adv-x="1067" d="M186 0v1366h211v-1190h639v-176h-850z" /> +<glyph unicode="M" horiz-adv-x="1783" d="M164 0l49 1366h303l375 -1051l379 1051h301l49 -1366h-205l-41 1118l-411 -1118h-148l-412 1126l-34 -1126h-205z" /> +<glyph unicode="N" horiz-adv-x="1529" d="M186 0v1366h213l738 -1047v1047h206v-1366h-213l-737 1034v-1034h-207z" /> +<glyph unicode="O" horiz-adv-x="1634" d="M92 680q0 184 83 344t253 263.5t395 103.5q324 0 521.5 -196t197.5 -486q0 -299 -207 -516.5t-530 -217.5q-315 0 -514 207t-199 498zM315 690q0 -209 134.5 -371.5t361.5 -162.5q229 0 368.5 161.5t139.5 374.5q0 211 -135 364.5t-366.5 153.5t-367 -154.5 t-135.5 -365.5z" /> +<glyph unicode="P" horiz-adv-x="1175" d="M186 0v1366h432q250 0 373 -118t123 -300q0 -209 -138 -329.5t-358 -120.5h-221v-498h-211zM397 674h187q307 0 307 260q0 117 -73 186.5t-234 69.5h-187v-516z" /> +<glyph unicode="Q" horiz-adv-x="1634" d="M92 680q0 184 83 344t253 263.5t393 103.5q324 0 522.5 -196t198.5 -486q0 -242 -143.5 -439.5t-380.5 -265.5q49 -63 85 -102t100.5 -91.5t146.5 -77.5q76 -24 165 -24h15l-31 -190q-11 0 -22 -1q-61 0 -118 10q-67 11 -123 36.5t-98 49.5t-85 64l-64 61q-20 19 -56 62 t-40 47l-62 72q-41 49 -124 62q-279 37 -447 234.5t-168 463.5zM315 690q0 -211 133.5 -373.5t362.5 -162.5t369.5 162.5t140.5 377.5q0 207 -135 361.5t-366.5 154.5t-368 -155.5t-136.5 -364.5z" /> +<glyph unicode="R" horiz-adv-x="1249" d="M186 0v1366h402q250 0 372.5 -110.5t122.5 -278.5q0 -131 -74.5 -228.5t-187.5 -150.5l402 -598h-250l-365 549h-211v-549h-211zM397 725h187q119 0 197.5 63.5t78.5 174.5q0 100 -73.5 163.5t-233.5 63.5h-156v-465z" /> +<glyph unicode="S" horiz-adv-x="1048" d="M90 90l60 193q16 -14 46.5 -35t122 -54.5t179.5 -33.5q104 0 174.5 47t70.5 129q0 66 -47 120t-116 90l-152 82q-82 46 -151.5 92t-116.5 124t-47 174q0 160 122.5 266.5t333.5 106.5q184 0 359 -62l-43 -192q-156 70 -318 69q-106 0 -173.5 -44t-67.5 -122 q0 -66 47 -120t116.5 -88.5t151.5 -79.5t151.5 -92.5t116.5 -127t47 -180.5q0 -176 -132 -276.5t-328 -100.5q-106 0 -208 29t-149 57z" /> +<glyph unicode="T" horiz-adv-x="1220" d="M35 1190v176h1151v-176h-473v-1190h-209v1190h-469z" /> +<glyph unicode="U" horiz-adv-x="1466" d="M170 500v866h211v-836q0 -193 96 -283.5t258 -90.5q160 0 256 92t96 272v846h209v-838q0 -260 -160.5 -406.5t-402.5 -146.5q-252 0 -407.5 128.5t-155.5 396.5z" /> +<glyph unicode="V" horiz-adv-x="1220" d="M20 1366h224l370 -1063l371 1063h215l-489 -1376h-203z" /> +<glyph unicode="W" horiz-adv-x="1957" d="M45 1366h217l313 -1071l312 1071h190l309 -1073l316 1073h211l-416 -1376h-215l-303 1014l-303 -1014h-217z" /> +<glyph unicode="X" horiz-adv-x="1239" d="M43 0l453 680l-453 686h248l332 -516l331 516h242l-453 -682l453 -684h-248l-332 516l-331 -516h-242z" /> +<glyph unicode="Y" horiz-adv-x="1208" d="M8 1366h248l350 -575l357 575h237l-489 -780v-586h-211v584z" /> +<glyph unicode="Z" horiz-adv-x="1187" d="M74 0v125l741 1065h-700v176h970v-125l-731 -1065h750v-176h-1030z" /> +<glyph unicode="[" horiz-adv-x="589" d="M164 -324v1690h391v-127h-236v-1436h236v-127h-391z" /> +<glyph unicode="\" horiz-adv-x="950" d="M66 1366h157l682 -1767h-160z" /> +<glyph unicode="]" horiz-adv-x="587" d="M33 -205h237v1452h-237v119h391v-1690h-391v119z" /> +<glyph unicode="^" horiz-adv-x="991" d="M-4 512l438 879h121l438 -879h-168l-331 668l-332 -668h-166z" /> +<glyph unicode="_" horiz-adv-x="1081" d="M29 -76h1024v-129h-1024v129z" /> +<glyph unicode="`" horiz-adv-x="1038" d="M311 1438h205l209 -336l-113 -64z" /> +<glyph unicode="a" horiz-adv-x="980" d="M66 213q0 285 548 356v17q0 43 -1 64.5t-8 53t-21.5 47t-42 26.5t-68.5 11q-68 0 -140.5 -26.5t-111.5 -52.5l-41 -27l-53 152q18 12 51 31.5t137.5 52t212.5 32.5q162 0 225.5 -68.5t63.5 -228.5v-391q0 -51 25.5 -79.5t50.5 -32.5l27 -5l-62 -159q-180 12 -227 143 q-18 -29 -48 -58.5t-99.5 -62.5t-151.5 -33q-121 0 -193.5 67t-72.5 171zM274 227q0 -92 109 -92t231 144v159q-340 -51 -340 -211z" /> +<glyph unicode="b" horiz-adv-x="1079" d="M139 20v1412l203 32v-618q92 104 250 104q186 0 294.5 -129t108.5 -325q0 -217 -134 -369t-384 -152q-145 0 -338 45zM342 150q63 -20 139 -21q137 0 221 92t84 260q0 143 -62 224t-165 81q-111 0 -217 -96v-540z" /> +<glyph unicode="c" horiz-adv-x="944" d="M80 451q0 203 134 351t353 148q90 0 169 -24.5t112 -48.5l35 -25l-80 -152q-96 86 -232 86q-125 0 -202.5 -91t-77.5 -234q0 -139 75.5 -229.5t202.5 -90.5q141 4 248 97l66 -144q-12 -12 -36 -32.5t-109 -53.5t-183 -33q-213 0 -344 135.5t-131 340.5z" /> +<glyph unicode="d" horiz-adv-x="1099" d="M82 434q0 213 131 364.5t365 151.5q92 0 172 -30v512l202 32v-1179q0 -49 10.5 -121t20.5 -119l10 -45l-194 -14q-18 76 -29 141q-94 -152 -291 -152q-178 0 -287.5 132t-109.5 327zM295 446q0 -143 60.5 -226t158.5 -83q135 0 236 150v381q-6 123 -162 123 q-135 0 -214 -90.5t-79 -254.5z" /> +<glyph unicode="e" horiz-adv-x="1003" d="M82 449q0 215 126 358t327 143q170 0 275 -113.5t105 -318.5l-116 -33l-506 -67q16 -129 92 -203t195 -74q70 0 140.5 29t106.5 57l37 29l58 -147q-16 -14 -46 -37t-127.5 -60t-199.5 -37q-221 0 -344 137.5t-123 336.5zM293 553l401 51q0 8 -2 20.5t-13 45t-27.5 57.5 t-51.5 45.5t-80 20.5q-94 0 -153.5 -67t-73.5 -173z" /> +<glyph unicode="f" horiz-adv-x="698" d="M51 772v109l146 53v90q0 223 113.5 348t297.5 125q72 0 139.5 -19.5t98.5 -39.5l31 -19l-80 -155q-90 66 -191 65q-90 0 -148.5 -70.5t-58.5 -222.5v-110h256v-154h-256v-772h-202v772h-146z" /> +<glyph unicode="g" horiz-adv-x="1036" d="M53 -242q0 152 236 275q-152 51 -152 131q0 90 146 172q-88 43 -136.5 119.5t-48.5 171.5q0 150 115 236.5t279 86.5q57 0 138 -19.5t130 -19.5h106q27 0 57.5 5.5t47.5 9.5l18 6l15 -162h-111q-39 0 -76 6q68 -78 68 -170q0 -143 -124 -227t-286 -84q-47 0 -67 4 q-76 -51 -76 -76q0 -33 235 -90l47 -12q63 -16 101.5 -27.5t91.5 -34t83 -47t52.5 -64.5t22.5 -89q0 -141 -148.5 -242.5t-357.5 -101.5q-166 0 -286 64t-120 179zM236 -209q0 -63 68.5 -96t166.5 -33q123 0 209 48t86 118q0 55 -58.5 84t-209.5 68q-20 6 -62 14 q-63 -35 -95 -55.5t-68.5 -62.5t-36.5 -85zM297 621q0 -74 50 -128.5t142 -54.5q86 0 140.5 47t54.5 125q0 76 -51 136.5t-144 60.5q-88 0 -140 -55t-52 -131z" /> +<glyph unicode="h" horiz-adv-x="1089" d="M143 0v1432l203 32v-694q170 180 363 180q117 0 182 -69.5t65 -212.5v-668h-202v594q0 180 -111 180q-119 0 -297 -178v-596h-203z" /> +<glyph unicode="i" d="M119 1272q0 53 37 89t90 36q55 0 92 -36t37 -89t-37 -89t-92 -36q-53 0 -90 36t-37 89zM143 0v926h203v-926h-203z" /> +<glyph unicode="j" d="M-90 -324q111 20 172 96t61 236v918h203v-895q0 -457 -375 -516zM117 1272q0 53 36.5 89t90.5 36q55 0 92 -36t37 -89t-37 -89t-92 -36q-53 0 -90 36t-37 89z" /> +<glyph unicode="k" horiz-adv-x="1011" d="M143 0v1432l203 32v-876h29l336 338h264l-422 -406l451 -520h-261l-368 438h-29v-438h-203z" /> +<glyph unicode="l" d="M143 0v1432l203 32v-1464h-203z" /> +<glyph unicode="m" horiz-adv-x="1656" d="M139 0v909l199 33v-174q166 182 358 182q188 0 230 -182q168 182 356 182q113 0 176.5 -69.5t63.5 -212.5v-668h-201v594q0 180 -106.5 180t-278.5 -168v-606h-203v594q0 180 -104 180q-115 0 -287 -172v-602h-203z" /> +<glyph unicode="n" horiz-adv-x="1085" d="M139 0v909l199 33v-176q168 184 369 184q115 0 180 -69.5t65 -212.5v-668h-202v594q0 180 -111 180q-117 0 -297 -174v-600h-203z" /> +<glyph unicode="o" horiz-adv-x="1114" d="M80 459q0 195 125 343t356 148q219 0 346 -139t127 -330q0 -88 -29.5 -175t-85 -161.5t-151.5 -122t-215 -47.5q-219 0 -346 143.5t-127 340.5zM291 477q0 -141 68.5 -240.5t199.5 -99.5q117 0 190.5 89t73.5 229q0 137 -67.5 235t-198.5 98q-119 0 -192.5 -86 t-73.5 -225z" /> +<glyph unicode="p" horiz-adv-x="1085" d="M139 -477v1386l197 33v-147q84 156 276 155q178 0 285 -132t107 -326q0 -215 -127 -366t-340 -151q-127 0 -195 50v-469zM342 240q0 -104 158 -105q133 0 212 89t79 253q0 141 -58.5 223t-154.5 82q-133 0 -236 -149v-393z" /> +<glyph unicode="q" horiz-adv-x="1079" d="M82 430q0 217 135 368.5t385 151.5l338 -45v-1349l-203 -33v555q-94 -102 -252 -103q-186 0 -294.5 129t-108.5 326zM293 444q0 -139 61.5 -219t163.5 -80q115 0 219 95v534q-66 20 -139 21q-137 0 -221 -91.5t-84 -259.5z" /> +<glyph unicode="r" horiz-adv-x="712" d="M139 0v909l199 33v-186q113 195 272 194l80 -16l-41 -205q-41 16 -82 16q-117 0 -225 -172v-573h-203z" /> +<glyph unicode="s" horiz-adv-x="823" d="M78 57l43 172q12 -10 34.5 -25.5t92 -42t135.5 -26.5q78 0 119 27.5t41 75.5q0 53 -70 98t-152.5 76.5t-152.5 101.5t-70 168q0 117 89 192.5t270 75.5q162 0 264 -51l-47 -166q-106 57 -225 58q-147 0 -148 -93q0 -43 46 -77.5t110.5 -63.5t130 -63.5t111.5 -95 t46 -142.5q0 -127 -96 -204t-264 -77q-86 0 -163 20.5t-111 41.5z" /> +<glyph unicode="t" horiz-adv-x="774" d="M55 772v111l142 51v211l198 43v-262h293v-154h-293v-469q0 -158 107 -158q27 0 59.5 11.5t52.5 23.5l48 30q27 17 28 17l51 -153l-39 -27q-25 -16 -98.5 -44t-146.5 -28q-125 0 -194.5 69t-69.5 208v520h-138z" /> +<glyph unicode="u" horiz-adv-x="1079" d="M133 254v672h203v-594q0 -180 115 -180q113 0 276 151v623h203v-641q0 -49 10 -120t21 -116l10 -47l-197 -18q-20 96 -31 163q-162 -172 -358 -172q-252 0 -252 279z" /> +<glyph unicode="v" horiz-adv-x="952" d="M27 926h213l225 -672l260 672h207l-381 -934h-189z" /> +<glyph unicode="w" horiz-adv-x="1542" d="M37 926h209l203 -701l239 701h176l217 -697l224 697h206l-331 -934h-199l-213 659l-238 -659h-196z" /> +<glyph unicode="x" horiz-adv-x="958" d="M43 0l319 463l-319 463h236l202 -308l205 308h227l-317 -459l317 -467h-227l-209 315l-213 -315h-221z" /> +<glyph unicode="y" horiz-adv-x="952" d="M23 926h215l243 -635l240 635h209l-402 -996q-156 -385 -432 -415l-63 161q98 16 177 88t122 173l49 110z" /> +<glyph unicode="z" horiz-adv-x="903" d="M80 0v123l461 639h-445v164h711v-123l-471 -639h487v-164h-743z" /> +<glyph unicode="{" horiz-adv-x="692" d="M29 475v125q45 2 81.5 16.5t61.5 46t43 61.5t29.5 82t17.5 86t9 95.5t3 87.5v84v31q0 166 117 247t311 81v-119q-94 -6 -147 -23.5t-79.5 -60.5t-34 -91t-7.5 -143q0 -457 -217 -540v-4q92 -35 154.5 -169.5t62.5 -394.5q0 -76 4 -117.5t18.5 -82.5t44 -61.5t78 -35 t123.5 -20.5v-119q-428 0 -428 328q0 279 -28 393q-55 213 -217 217z" /> +<glyph unicode="|" horiz-adv-x="479" d="M162 -461v1995h155v-1995h-155z" /> +<glyph unicode="}" horiz-adv-x="692" d="M-8 -344q76 6 123 20.5t76.5 35t44 61.5t18.5 83t4 117q0 260 62.5 394.5t154.5 169.5v4q-217 84 -217 540q0 94 -7 143.5t-34 91.5t-79 59.5t-146 23.5v119q195 0 310.5 -81t115.5 -247q0 -268 28 -377q53 -209 218 -213v-125q-45 -2 -82 -17.5t-61.5 -48t-43 -64.5 t-30 -86t-17.5 -90t-9 -99.5t-3 -89.5v-84v-31q0 -328 -426 -328v119z" /> +<glyph unicode="~" horiz-adv-x="1191" d="M123 352q0 330 274 330q80 0 141.5 -30.5t92.5 -67.5t74 -68t90 -31q133 0 133 189h145q0 -330 -274 -330q-80 0 -141.5 31t-92 67.5t-73.5 67.5t-91 31q-133 0 -133 -189h-145z" /> +<glyph unicode=" " /> +<glyph unicode="¡" horiz-adv-x="548" d="M137 813q0 57 41 97t98.5 40t97.5 -40t40 -97t-40 -98t-98 -41q-59 0 -99 40t-40 99zM156 -465l34 963h170l31 -963h-235z" /> +<glyph unicode="¢" horiz-adv-x="944" d="M80 569q0 168 104.5 293t290.5 144l6 180h94l-6 -178q178 -12 281 -113l6 -6l-106 -133q-72 70 -185 84l-18 -537q59 2 118.5 25.5t88.5 46.5l30 22l66 -141q-12 -12 -35.5 -31.5t-102.5 -52.5t-169 -35l-6 -182h-95l7 186q-168 25 -268.5 144.5t-100.5 283.5zM285 575 q0 -92 44 -163.5t124 -96.5l16 521q-86 -20 -135 -91.5t-49 -169.5z" /> +<glyph unicode="£" horiz-adv-x="1116" d="M78 117q6 2 14 5t31.5 18.5t42 34t36 52t21.5 72.5l23 190h-125v109h139l21 168q49 395 378 395q57 0 110.5 -12t88.5 -29.5t61.5 -36t38.5 -30.5l13 -13l-109 -133q-8 10 -24.5 25.5t-70.5 40t-112 24.5q-78 0 -122 -52t-56 -185l-16 -162h364l-12 -109h-362 q-8 -84 -25.5 -161.5t-32.5 -114.5l-12 -35q150 -63 283 -63q178 0 204 149l13 68h151q-8 -80 -26.5 -141.5t-53 -120t-97 -90t-150.5 -31.5q-86 0 -227.5 42t-196.5 42q-70 0 -162 -33z" /> +<glyph unicode="¥" horiz-adv-x="1148" d="M78 1137h221l274 -471l281 471h209l-289 -473h215v-109h-280l-35 -59v-84h315v-109h-315v-303h-203v303h-295v109h295v82l-39 61h-256v109h191z" /> +<glyph unicode="¦" horiz-adv-x="497" d="M166 358h166v-733h-166v733zM166 676v733h166v-733h-166z" /> +<glyph unicode="§" horiz-adv-x="1005" d="M57 -379l62 119q133 -96 278 -96q121 0 184.5 88t63.5 229q0 66 -10 117l-111 606q-23 131 -22 205q0 135 53 213l127 -23q-35 -76 -35 -188q0 -53 10 -115l121 -682q12 -70 13 -137q0 -193 -98.5 -317.5t-291.5 -124.5q-184 0 -338 102zM190 948q0 193 97.5 318 t290.5 125q184 0 337 -103l7 -4l-62 -119q-133 96 -278 97q-121 0 -184.5 -89.5t-63.5 -228.5q0 -68 10 -117l111 -606q20 -119 20 -205q0 -137 -51 -213l-125 23q35 82 35 188q0 53 -10 115l-121 682q-13 69 -13 137z" /> +<glyph unicode="¨" horiz-adv-x="1038" d="M199 1270q0 51 34.5 83.5t86 32.5t85 -32.5t33.5 -83.5t-33.5 -83t-85 -32t-86 33t-34.5 82zM598 1270q0 51 34 83.5t85 32.5t86 -32.5t35 -83.5q0 -49 -35 -82t-86 -33t-85 32t-34 83z" /> +<glyph unicode="©" horiz-adv-x="1583" d="M84 682q0 293 208 500t498.5 207t498.5 -207t208 -500t-208 -500t-498.5 -207t-498.5 207t-208 500zM195 682q0 -252 173 -430t423 -178q252 0 425 178t173 430t-173.5 430t-424.5 178q-250 0 -423 -178t-173 -430zM395 678q0 170 111.5 297t306.5 127q180 0 287 -113 l8 -10l-92 -121q-8 10 -25.5 26.5t-72 43t-111.5 26.5q-111 0 -172.5 -75.5t-61.5 -186.5q0 -113 69 -191.5t183 -78.5q129 4 224 98l55 -127q-10 -12 -31.5 -32.5t-96.5 -53.5t-163 -33q-184 0 -301 116t-117 288z" /> +<glyph unicode="ª" horiz-adv-x="796" d="M88 874q0 201 387 256q0 76 -16.5 107t-75.5 31q-109 0 -213 -84l-39 125q115 80 295 80q119 0 166 -48.5t47 -158.5v-269q8 -72 74 -79l-45 -121q-143 6 -179 94q-78 -100 -208 -100q-86 0 -139.5 45.5t-53.5 121.5zM258 891q0 -63 66 -64q68 0 151 97v106 q-217 -35 -217 -139z" /> +<glyph unicode="«" horiz-adv-x="1046" d="M43 510v8q31 23 199 211l194 217l125 -35l-303 -397l303 -397l-125 -35l-166 182l-109 121l-60 66q-26 29 -36 39t-22 20zM438 510v8q29 23 197 209l199 219l122 -35l-301 -397l301 -397l-122 -35l-168 182l-109 121l-59 66q-27 29 -37.5 39t-22.5 20z" /> +<glyph unicode="¬" horiz-adv-x="1171" d="M104 655v146h943v-574h-154v428h-789z" /> +<glyph unicode="­" horiz-adv-x="720" d="M111 438v156h499v-156h-499z" /> +<glyph unicode="®" horiz-adv-x="876" d="M84 1087.5q0 145.5 104.5 250t250 104.5t250 -104.5t104.5 -250t-104.5 -250t-250 -104.5t-250 104.5t-104.5 250zM156 1087.5q0 -118.5 83 -205.5t197.5 -87t199.5 87t85 205.5t-85 204.5t-199.5 86t-197.5 -86t-83 -204.5zM307 918v348h123q143 0 143 -105 q0 -66 -65 -98l106 -145h-98l-88 126h-33v-126h-88zM395 1102h41q47 0 47 51q0 53 -61 53h-27v-104z" /> +<glyph unicode="¯" horiz-adv-x="991" d="M248 1194v141h493v-141h-493z" /> +<glyph unicode="°" horiz-adv-x="665" d="M84 1144.5q0 102.5 72.5 174.5t177 72t177.5 -72t73 -174.5t-73 -174t-177.5 -71.5t-177 71.5t-72.5 174zM193 1144.5q0 -61.5 40.5 -103.5t100 -42t99.5 42t40 103.5t-40 103.5t-99.5 42t-100 -42t-40.5 -103.5z" /> +<glyph unicode="±" horiz-adv-x="1064" d="M84 635v145h369v363h155v-363h371v-145h-371v-375h-155v375h-369zM92 0v147h885v-147h-885z" /> +<glyph unicode="²" horiz-adv-x="706" d="M57 856l76 74l78 76l67 68q44 46 63 74l45 65q26 38 35 71t9 66q0 57 -35 87.5t-90 30.5q-39 0 -78 -17t-59 -34l-18 -18l-84 100q10 12 31.5 30.5t91 50.5t147.5 32q121 0 191.5 -66.5t70.5 -175.5q0 -96 -65.5 -200.5t-235.5 -270.5h350v-129h-579z" /> +<glyph unicode="³" horiz-adv-x="669" d="M45 823l66 115q78 -47 168 -47q68 0 106.5 31.5t38.5 78.5q0 57 -53.5 86t-126.5 29h-58v127q76 4 138.5 47t62.5 107q0 78 -94 78q-37 0 -76 -12.5t-57 -24.5l-21 -13l-63 105q102 82 246 82q106 0 171.5 -54.5t65.5 -136.5q0 -72 -47 -127t-117 -84q94 -20 147.5 -73.5 t53.5 -130.5q0 -104 -89 -177t-224 -73q-140 -1 -238 67z" /> +<glyph unicode="´" horiz-adv-x="1050" d="M313 1102l209 336h205l-301 -400z" /> +<glyph unicode="µ" horiz-adv-x="1173" d="M139 -442q20 199 21 362v1006h200v-594q0 -180 117 -180q111 0 277 151v623h202v-666q0 -84 22.5 -103.5t111.5 -19.5v-151q-72 -10 -113 -11q-106 0 -153.5 43t-59.5 121q-164 -164 -352 -164q-49 0 -93 13q4 -86 20.5 -240t16.5 -190h-217z" /> +<glyph unicode="μ" horiz-adv-x="1173" d="M139 -442q20 199 21 362v1006h200v-594q0 -180 117 -180q111 0 277 151v623h202v-666q0 -84 22.5 -103.5t111.5 -19.5v-151q-72 -10 -113 -11q-106 0 -153.5 43t-59.5 121q-164 -164 -352 -164q-49 0 -93 13q4 -86 20.5 -240t16.5 -190h-217z" /> +<glyph unicode="¶" horiz-adv-x="1366" d="M68 864q0 203 154.5 352.5t430.5 149.5h613v-125h-152v-1241h-135v1241h-154v-1282q0 -444 -366 -444l-31 137q133 0 193.5 73.5t60.5 241.5v400h-18q-291 0 -443.5 145t-152.5 352z" /> +<glyph unicode="·" horiz-adv-x="520" d="M121 520q0 57 41 98t98 41t98 -40.5t41 -98.5q0 -55 -41 -96t-98 -41t-98 41t-41 96z" /> +<glyph unicode="¸" horiz-adv-x="1038" d="M332 -422l47 107q66 -57 147 -58q45 0 73 17.5t28 44.5q0 23 -27 41t-57.5 30.5t-57 36t-26.5 56.5q0 25 35 104l22 43h111l-17 -37q-20 -41 -20 -61q0 -23 27.5 -40.5t60.5 -29.5t60.5 -45t27.5 -80q0 -78 -66.5 -135t-169.5 -57q-53 0 -102 15t-72 32z" /> +<glyph unicode="¹" horiz-adv-x="606" d="M66 770v121h180v586h-164v120h326v-706h167v-121h-509z" /> +<glyph unicode="º" horiz-adv-x="860" d="M84 1044q0 135 91 240t259 105q160 0 252 -97.5t92 -230.5q0 -135 -91 -244.5t-259 -109.5q-160 0 -252 100t-92 237zM256 1059q0 -96 45 -164t131 -68q78 0 126 60.5t48 154.5q0 92 -44 159t-132 67q-78 0 -126 -58.5t-48 -150.5z" /> +<glyph unicode="»" horiz-adv-x="1046" d="M90 117l303 397l-303 397l125 35q360 -399 379 -418q6 -4 14 -10v-8q-12 -10 -22.5 -20.5t-35.5 -38.5l-60 -66l-109 -121l-166 -182zM485 117l303 397l-303 397l125 35q360 -401 396 -428v-8q-12 -10 -22.5 -20.5l-38.5 -39.5l-59 -66l-109 -120l-167 -182z" /> +<glyph unicode="¼" horiz-adv-x="1701" d="M94 545v121h180v585h-163v121h325v-706h168v-121h-510zM389 0l813 1411l125 -49l-782 -1362h-156zM973 301l373 533h165v-508h119v-125h-119v-201h-155v201h-371zM1126 326h230v325z" /> +<glyph unicode="½" horiz-adv-x="1806" d="M92 545v121h180v585h-163v121h325v-706h168v-121h-510zM408 0l813 1411l125 -49l-783 -1362h-155zM1143 86l76 74l77 76l67 68q44 46 63 74l45 65q26 38 35.5 71t9.5 66q0 57 -35 87.5t-90 30.5q-39 0 -78 -17t-60 -34l-18 -18l-84 100q10 12 31.5 30.5t91 50.5t147.5 32 q121 0 191.5 -66.5t70.5 -175.5q0 -96 -65.5 -200.5t-235.5 -270.5h351v-129h-580z" /> +<glyph unicode="¾" horiz-adv-x="1695" d="M78 598l65 115q78 -47 168 -47q68 0 107 31.5t39 78.5q0 57 -53.5 86t-127.5 29h-57v127q76 4 138.5 47t62.5 106q0 78 -94 78q-37 0 -76 -12t-57 -25l-21 -12l-63 105q102 82 245 81q106 0 172 -54t66 -136q0 -72 -47 -127t-117 -84q94 -20 147.5 -73.5t53.5 -131.5 q0 -104 -89 -177t-225 -73q-139 0 -237 68zM383 0l813 1411l125 -49l-782 -1362h-156zM967 301l372 533h166v-508h119v-125h-119v-201h-155v201h-371zM1120 326h230v325z" /> +<glyph unicode="¿" horiz-adv-x="743" d="M70 -82q0 49 32.5 101.5t77.5 100.5l91 100q46 52 79 125t33 153h164q6 -27 6 -60q0 -84 -39 -166t-87 -133t-87 -105t-39 -91q0 -57 91 -122t181 -100l93 -36l-45 -187q-23 6 -60 18.5t-132 54.5t-168 87t-132 115.5t-59 144.5zM319 813q0 57 41 97t98.5 40t98.5 -40 t41 -97t-41 -98t-98.5 -41t-98.5 41t-41 98z" /> +<glyph unicode="À" horiz-adv-x="1282" d="M20 0l521 1376h200l521 -1376h-218l-135 365h-544l-134 -365h-211zM358 1606l68 166l416 -195l-43 -115zM430 541h416l-209 565z" /> +<glyph unicode="Á" horiz-adv-x="1282" d="M20 0l521 1376h200l521 -1376h-218l-135 365h-544l-134 -365h-211zM430 541h416l-209 565zM434 1577l416 195l68 -166l-441 -144z" /> +<glyph unicode="Â" horiz-adv-x="1282" d="M20 0l521 1376h200l521 -1376h-218l-135 365h-544l-134 -365h-211zM297 1552l258 232h168l256 -232l-111 -82l-229 191l-233 -191zM430 541h416l-209 565z" /> +<glyph unicode="Ã" horiz-adv-x="1282" d="M20 0l521 1376h200l521 -1376h-218l-135 365h-544l-134 -365h-211zM266 1495q4 2 0 26.5t7.5 64.5t28.5 78t64.5 64.5t112.5 26.5q72 0 129.5 -33.5t100.5 -66.5t82 -33q80 16 79 131h142q-4 -2 0 -27.5t-8.5 -66.5t-31 -79t-66.5 -65.5t-115 -27.5q-72 0 -127.5 33.5 t-95.5 67.5t-79 34q-82 -16 -83 -127h-140zM430 541h416l-209 565z" /> +<glyph unicode="Ä" horiz-adv-x="1282" d="M20 0l521 1376h200l521 -1376h-218l-135 365h-544l-134 -365h-211zM272 1624q0 51 35 85t88 34q49 0 84 -34t35 -85q0 -49 -35 -83t-84 -34q-51 0 -87 34t-36 83zM430 541h416l-209 565zM762 1624q0 51 34.5 85t86 34t86.5 -34t35 -85q0 -49 -35 -83t-86.5 -34t-86 34 t-34.5 83z" /> +<glyph unicode="Å" horiz-adv-x="1282" d="M20 0l521 1376h200l521 -1376h-218l-135 365h-544l-134 -365h-211zM430 541h416l-209 565zM438 1622q0 66 51.5 114t147.5 48t147.5 -48t51.5 -114q0 -72 -50.5 -120t-148.5 -48t-148.5 48t-50.5 120zM543 1620q0 -39 24.5 -65.5t69.5 -26.5q43 0 69.5 27.5t26.5 64.5 q0 35 -24.5 61.5t-71.5 26.5t-70.5 -25.5t-23.5 -62.5z" /> +<glyph unicode="Æ" horiz-adv-x="1802" d="M-12 0l766 1366h948v-176h-621v-406h490v-178h-490v-430h627v-176h-836v422h-426l-233 -422h-225zM543 598h329v592z" /> +<glyph unicode="Ç" horiz-adv-x="1384" d="M94 668q0 309 206 516t542 207q127 0 242.5 -29t166.5 -57l52 -29l-82 -184q-16 12 -48 31.5t-134.5 52t-209.5 32.5q-240 0 -377 -152.5t-137 -369.5q0 -229 146.5 -378.5t367.5 -149.5q106 0 208 33.5t151 66.5l47 33l86 -158l-22 -16q-13 -10 -62 -38t-103.5 -48.5 t-139.5 -38t-175 -17.5l-4 -12q-20 -41 -20 -61q0 -23 27.5 -40.5t60 -29.5t60.5 -45t28 -80q0 -78 -66.5 -135t-169.5 -57q-53 0 -102 15t-72 32l-24 16l47 107q66 -57 147 -58q45 0 72.5 17.5t27.5 44.5q0 23 -26.5 41t-57 30.5t-57 36t-26.5 56.5q0 25 34 104l13 25 q-270 31 -443.5 217t-173.5 469z" /> +<glyph unicode="È" horiz-adv-x="1116" d="M186 0v1366h832v-176h-621v-406h490v-178h-490v-430h627v-176h-838zM334 1606l67 166l416 -195l-43 -115z" /> +<glyph unicode="É" horiz-adv-x="1116" d="M186 0v1366h832v-176h-621v-406h490v-178h-490v-430h627v-176h-838zM410 1577l415 195l68 -166l-440 -144z" /> +<glyph unicode="Ê" horiz-adv-x="1116" d="M186 0v1366h832v-176h-621v-406h490v-178h-490v-430h627v-176h-838zM272 1552l258 232h168l256 -232l-110 -82l-230 191l-233 -191z" /> +<glyph unicode="Ë" horiz-adv-x="1116" d="M186 0v1366h832v-176h-621v-406h490v-178h-490v-430h627v-176h-838zM248 1624q0 51 34.5 85t88.5 34q49 0 83.5 -34t34.5 -85q0 -49 -34.5 -83t-83.5 -34q-51 0 -87 34t-36 83zM737 1624q0 51 35 85t86 34t86 -34t35 -85q0 -49 -35 -83t-86 -34t-86 34t-35 83z" /> +<glyph unicode="Ì" horiz-adv-x="585" d="M14 1606l68 166l416 -195l-43 -115zM186 0v1366h211v-1366h-211z" /> +<glyph unicode="Í" horiz-adv-x="585" d="M90 1577l416 195l67 -166l-440 -144zM186 0v1366h211v-1366h-211z" /> +<glyph unicode="Î" horiz-adv-x="585" d="M-47 1552l258 232h168l256 -232l-111 -82l-229 191l-234 -191zM186 0v1366h211v-1366h-211z" /> +<glyph unicode="Ï" horiz-adv-x="585" d="M-23 1626q0 51 35 84t86.5 33t85 -33t33.5 -84t-33.5 -83t-85 -32t-86.5 33t-35 82zM186 0v1366h211v-1366h-211zM377 1626q0 51 33.5 84t85 33t86 -33t34.5 -84q0 -49 -34.5 -82t-86 -33t-85 32t-33.5 83z" /> +<glyph unicode="Ð" horiz-adv-x="1507" d="M63 608v170h148v588h444q145 0 275.5 -36t241 -111.5t175 -207.5t64.5 -306q0 -336 -227.5 -520.5t-605.5 -184.5h-367v608h-148zM420 176h137q326 0 478.5 140.5t152.5 372t-145.5 366.5t-415.5 135h-207v-412h338v-170h-338v-432z" /> +<glyph unicode="Ñ" horiz-adv-x="1529" d="M186 0v1366h213l738 -1047v1047h206v-1366h-213l-737 1034v-1034h-207zM393 1495q4 2 0 26.5t7.5 64.5t28.5 78t64.5 64.5t112.5 26.5q72 0 129.5 -33.5t100.5 -66.5t82 -33q80 16 79 131h142q-4 -2 0 -27.5t-8.5 -66.5t-31 -79t-66.5 -65.5t-115 -27.5 q-72 0 -127.5 33.5t-95.5 67.5t-79 34q-82 -16 -84 -127h-139z" /> +<glyph unicode="Ò" horiz-adv-x="1634" d="M92 680q0 184 83 344t253 263.5t395 103.5q324 0 521.5 -196t197.5 -486q0 -299 -207 -516.5t-530 -217.5q-315 0 -514 207t-199 498zM315 690q0 -209 134.5 -371.5t361.5 -162.5q229 0 368.5 161.5t139.5 374.5q0 211 -135 364.5t-366.5 153.5t-367 -154.5 t-135.5 -365.5zM537 1606l67 166l416 -195l-43 -115z" /> +<glyph unicode="Ó" horiz-adv-x="1634" d="M92 680q0 184 83 344t253 263.5t395 103.5q324 0 521.5 -196t197.5 -486q0 -299 -207 -516.5t-530 -217.5q-315 0 -514 207t-199 498zM315 690q0 -209 134.5 -371.5t361.5 -162.5q229 0 368.5 161.5t139.5 374.5q0 211 -135 364.5t-366.5 153.5t-367 -154.5 t-135.5 -365.5zM612 1577l416 195l68 -166l-441 -144z" /> +<glyph unicode="Ô" horiz-adv-x="1634" d="M92 680q0 184 83 344t253 263.5t395 103.5q324 0 521.5 -196t197.5 -486q0 -299 -207 -516.5t-530 -217.5q-315 0 -514 207t-199 498zM315 690q0 -209 134.5 -371.5t361.5 -162.5q229 0 368.5 161.5t139.5 374.5q0 211 -135 364.5t-366.5 153.5t-367 -154.5 t-135.5 -365.5zM475 1552l258 232h168l256 -232l-110 -82l-230 191l-233 -191z" /> +<glyph unicode="Õ" horiz-adv-x="1634" d="M92 680q0 184 83 344t253 263.5t395 103.5q324 0 521.5 -196t197.5 -486q0 -299 -207 -516.5t-530 -217.5q-315 0 -514 207t-199 498zM315 690q0 -209 134.5 -371.5t361.5 -162.5q229 0 368.5 161.5t139.5 374.5q0 211 -135 364.5t-366.5 153.5t-367 -154.5 t-135.5 -365.5zM444 1495q4 2 0 26.5t7.5 64.5t29 78t64.5 64.5t112 26.5q72 0 129.5 -33.5t100.5 -66.5t82 -33q80 16 80 131h141q-4 -2 0 -27.5t-8.5 -66.5t-30.5 -79t-66.5 -65.5t-115.5 -27.5q-72 0 -127.5 33.5t-95 67.5t-78.5 34q-82 -16 -84 -127h-140z" /> +<glyph unicode="Ö" horiz-adv-x="1634" d="M92 680q0 184 83 344t253 263.5t395 103.5q324 0 521.5 -196t197.5 -486q0 -299 -207 -516.5t-530 -217.5q-315 0 -514 207t-199 498zM315 690q0 -209 134.5 -371.5t361.5 -162.5q229 0 368.5 161.5t139.5 374.5q0 211 -135 364.5t-366.5 153.5t-367 -154.5 t-135.5 -365.5zM451 1624q0 51 34.5 85t87.5 34q49 0 84 -34t35 -85q0 -49 -34.5 -83t-84.5 -34q-51 0 -86.5 34t-35.5 83zM940 1624q0 51 35 85t86 34t86 -34t35 -85q0 -49 -35 -83t-86 -34t-86 34t-35 83z" /> +<glyph unicode="×" horiz-adv-x="1064" d="M78 150l354 364l-354 367l98 102l356 -367l357 367l98 -102l-356 -367l356 -364l-100 -103l-355 365l-354 -365z" /> +<glyph unicode="Ø" horiz-adv-x="1634" d="M92 680q0 184 83 344t253 263.5t395 103.5q213 0 381 -95l99 131h145l-148 -194q115 -94 178.5 -230.5t63.5 -293.5q0 -299 -207 -516.5t-530 -217.5q-211 0 -383 103l-107 -139h-147l160 208q-236 207 -236 533zM315 690q0 -221 138 -377l630 826q-117 72 -266 71 q-231 0 -366.5 -155.5t-135.5 -364.5zM541 236q119 -80 270 -80q229 0 368.5 161.5t139.5 374.5q0 223 -145 375z" /> +<glyph unicode="Ù" horiz-adv-x="1466" d="M170 500v866h211v-836q0 -193 96 -283.5t258 -90.5q160 0 256 92t96 272v846h209v-838q0 -260 -160.5 -406.5t-402.5 -146.5q-252 0 -407.5 128.5t-155.5 396.5zM453 1606l67 166l416 -195l-43 -115z" /> +<glyph unicode="Ú" horiz-adv-x="1466" d="M170 500v866h211v-836q0 -193 96 -283.5t258 -90.5q160 0 256 92t96 272v846h209v-838q0 -260 -160.5 -406.5t-402.5 -146.5q-252 0 -407.5 128.5t-155.5 396.5zM528 1577l416 195l68 -166l-441 -144z" /> +<glyph unicode="Û" horiz-adv-x="1466" d="M170 500v866h211v-836q0 -193 96 -283.5t258 -90.5q160 0 256 92t96 272v846h209v-838q0 -260 -160.5 -406.5t-402.5 -146.5q-252 0 -407.5 128.5t-155.5 396.5zM391 1552l258 232h168l256 -232l-110 -82l-230 191l-233 -191z" /> +<glyph unicode="Ü" horiz-adv-x="1466" d="M170 500v866h211v-836q0 -193 96 -283.5t258 -90.5q160 0 256 92t96 272v846h209v-838q0 -260 -160.5 -406.5t-402.5 -146.5q-252 0 -407.5 128.5t-155.5 396.5zM367 1624q0 51 34.5 85t87.5 34q49 0 84 -34t35 -85q0 -49 -34.5 -83t-84.5 -34q-51 0 -86.5 34t-35.5 83z M856 1624q0 51 35 85t86 34t86 -34t35 -85q0 -49 -35 -83t-86 -34t-86 34t-35 83z" /> +<glyph unicode="Ý" horiz-adv-x="1208" d="M8 1366h248l350 -575l357 575h237l-489 -780v-586h-211v584zM408 1577l415 195l68 -166l-440 -144z" /> +<glyph unicode="Þ" horiz-adv-x="1169" d="M186 0v1366h211v-297h248q242 0 353.5 -104.5t111.5 -268.5q0 -190 -126 -297.5t-339 -107.5h-248v-291h-211zM397 467h213q276 0 277 215q0 211 -277 211h-213v-426z" /> +<glyph unicode="ß" horiz-adv-x="1185" d="M51 772v109l146 53v76q0 223 108.5 345t310.5 122q172 0 269.5 -84t97.5 -209q0 -66 -29.5 -126.5t-65.5 -99t-65.5 -91t-29.5 -99.5q0 -53 34.5 -99t84.5 -85l101 -81q50 -42 85 -104.5t35 -136.5q0 -129 -97.5 -208t-261.5 -79q-158 0 -252 66l35 168q92 -74 211 -74 q72 0 113 34t41 89q0 47 -34 89t-81 77t-94 74t-81 99t-34 136q0 72 28.5 133.5t62.5 98t62.5 89t28.5 105.5q0 76 -51 116t-123 40q-96 0 -151.5 -73t-55.5 -224v-1018h-202v772h-146z" /> +<glyph unicode="à" horiz-adv-x="980" d="M66 213q0 285 548 356v17q0 43 -1 64.5t-8 53t-21.5 47t-42 26.5t-68.5 11q-68 0 -140.5 -26.5t-111.5 -52.5l-41 -27l-53 152q18 12 51 31.5t137.5 52t212.5 32.5q162 0 225.5 -68.5t63.5 -228.5v-391q0 -51 25.5 -79.5t50.5 -32.5l27 -5l-62 -159q-180 12 -227 143 q-18 -29 -48 -58.5t-99.5 -62.5t-151.5 -33q-121 0 -193.5 67t-72.5 171zM160 1438h205l208 -336l-112 -64zM274 227q0 -92 109 -92t231 144v159q-340 -51 -340 -211z" /> +<glyph unicode="á" horiz-adv-x="980" d="M66 213q0 285 548 356v17q0 43 -1 64.5t-8 53t-21.5 47t-42 26.5t-68.5 11q-68 0 -140.5 -26.5t-111.5 -52.5l-41 -27l-53 152q18 12 51 31.5t137.5 52t212.5 32.5q162 0 225.5 -68.5t63.5 -228.5v-391q0 -51 25.5 -79.5t50.5 -32.5l27 -5l-62 -159q-180 12 -227 143 q-18 -29 -48 -58.5t-99.5 -62.5t-151.5 -33q-121 0 -193.5 67t-72.5 171zM274 227q0 -92 109 -92t231 144v159q-340 -51 -340 -211zM365 1102l208 336h205l-301 -400z" /> +<glyph unicode="â" horiz-adv-x="980" d="M66 213q0 285 548 356v17q0 43 -1 64.5t-8 53t-21.5 47t-42 26.5t-68.5 11q-68 0 -140.5 -26.5t-111.5 -52.5l-41 -27l-53 152q18 12 51 31.5t137.5 52t212.5 32.5q162 0 225.5 -68.5t63.5 -228.5v-391q0 -51 25.5 -79.5t50.5 -32.5l27 -5l-62 -159q-180 12 -227 143 q-18 -29 -48 -58.5t-99.5 -62.5t-151.5 -33q-121 0 -193.5 67t-72.5 171zM170 1092l233 346h132l231 -348l-119 -54l-180 250l-178 -250zM274 227q0 -92 109 -92t231 144v159q-340 -51 -340 -211z" /> +<glyph unicode="ã" horiz-adv-x="980" d="M66 213q0 285 548 356v17q0 43 -1 64.5t-8 53t-21.5 47t-42 26.5t-68.5 11q-68 0 -140.5 -26.5t-111.5 -52.5l-41 -27l-53 152q18 12 51 31.5t137.5 52t212.5 32.5q162 0 225.5 -68.5t63.5 -228.5v-391q0 -51 25.5 -79.5t50.5 -32.5l27 -5l-62 -159q-180 12 -227 143 q-18 -29 -48 -58.5t-99.5 -62.5t-151.5 -33q-121 0 -193.5 67t-72.5 171zM145 1126q4 2 0 28t6.5 67t26 78.5t56 65.5t100.5 28q53 0 96 -25t65.5 -53.5t50 -53t52.5 -24.5q66 10 66 143h131q-4 -2 0 -28.5t-7.5 -68.5t-27 -81t-58.5 -67.5t-102 -28.5q-53 0 -95 24.5 t-63.5 54t-48 54.5t-53.5 25q-63 -8 -64 -138h-131zM274 227q0 -92 109 -92t231 144v159q-340 -51 -340 -211z" /> +<glyph unicode="ä" horiz-adv-x="980" d="M66 213q0 285 548 356v17q0 43 -1 64.5t-8 53t-21.5 47t-42 26.5t-68.5 11q-68 0 -140.5 -26.5t-111.5 -52.5l-41 -27l-53 152q18 12 51 31.5t137.5 52t212.5 32.5q162 0 225.5 -68.5t63.5 -228.5v-391q0 -51 25.5 -79.5t50.5 -32.5l27 -5l-62 -159q-180 12 -227 143 q-18 -29 -48 -58.5t-99.5 -62.5t-151.5 -33q-121 0 -193.5 67t-72.5 171zM147 1270q0 51 35 83.5t86 32.5t85 -32.5t34 -83.5t-34 -83t-85 -32t-86 33t-35 82zM274 227q0 -92 109 -92t231 144v159q-340 -51 -340 -211zM547 1270q0 51 33.5 83.5t85 32.5t86 -32.5t34.5 -83.5 q0 -49 -34.5 -82t-86 -33t-85 32t-33.5 83z" /> +<glyph unicode="å" horiz-adv-x="980" d="M66 213q0 285 548 356v17q0 43 -1 64.5t-8 53t-21.5 47t-42 26.5t-68.5 11q-68 0 -140.5 -26.5t-111.5 -52.5l-41 -27l-53 152q18 12 51 31.5t137.5 52t212.5 32.5q162 0 225.5 -68.5t63.5 -228.5v-391q0 -51 25.5 -79.5t50.5 -32.5l27 -5l-62 -159q-180 12 -227 143 q-18 -29 -48 -58.5t-99.5 -62.5t-151.5 -33q-121 0 -193.5 67t-72.5 171zM270 1276q0 70 50.5 121t146.5 51t146.5 -51t50.5 -121q0 -72 -50.5 -125t-146.5 -53t-146.5 53t-50.5 125zM274 227q0 -92 109 -92t231 144v159q-340 -51 -340 -211zM375 1274q0 -37 23.5 -63.5 t68.5 -26.5t70.5 26.5t25.5 63.5q0 35 -24.5 60.5t-71.5 25.5t-69.5 -24.5t-22.5 -61.5z" /> +<glyph unicode="æ" horiz-adv-x="1538" d="M66 213q0 266 565 334v49q0 68 -6.5 102.5t-39 62t-98.5 27.5q-152 0 -303 -104l-4 -2l-53 152q18 12 51 31.5t136.5 52t207.5 32.5q197 0 252 -129q117 129 297 129q170 0 274.5 -111.5t104.5 -312.5l-115 -34l-508 -64q12 -129 88 -208t197 -79q72 0 142.5 28t105.5 56 l37 29l61 -145q-16 -14 -46 -37t-127 -60t-202 -37q-262 0 -381 209q-39 -82 -129 -145.5t-219 -63.5t-208.5 67t-79.5 171zM274 227q0 -92 121 -92q92 0 161 69.5t69 172.5v39q-351 -46 -351 -189zM829 563l402 49q0 8 -2 19.5t-13.5 43.5t-29 55.5t-52 43t-81.5 19.5 q-92 0 -150 -64t-74 -166z" /> +<glyph unicode="ç" horiz-adv-x="944" d="M80 451q0 203 134 351t353 148q90 0 169 -24.5t112 -48.5l35 -25l-80 -152q-96 86 -232 86q-125 0 -202.5 -91t-77.5 -234q0 -139 75.5 -229.5t202.5 -90.5q141 4 248 97l66 -144q-12 -12 -36 -31.5t-108 -53.5t-182 -34l-6 -14q-20 -41 -21 -61q0 -23 28 -40.5 t60.5 -29.5t60.5 -45t28 -80q0 -78 -67 -135t-169 -57q-53 0 -102.5 16t-73.5 33l-23 14l47 107q66 -57 148 -58q45 0 72.5 17.5t27.5 44.5q0 23 -26.5 41t-57 30.5t-57.5 36t-27 55.5q0 25 35 105l15 31q-170 33 -269.5 160t-99.5 305z" /> +<glyph unicode="è" horiz-adv-x="1003" d="M82 449q0 215 126 358t327 143q170 0 275 -113.5t105 -318.5l-116 -33l-506 -67q16 -129 92 -203t195 -74q70 0 140.5 29t106.5 57l37 29l58 -147q-16 -14 -46 -37t-127.5 -60t-199.5 -37q-221 0 -344 137.5t-123 336.5zM205 1438h205l208 -336l-112 -64zM293 553l401 51 q0 8 -2 20.5t-13 45t-27.5 57.5t-51.5 45.5t-80 20.5q-94 0 -153.5 -67t-73.5 -173z" /> +<glyph unicode="é" horiz-adv-x="1003" d="M82 449q0 215 126 358t327 143q170 0 275 -113.5t105 -318.5l-116 -33l-506 -67q16 -129 92 -203t195 -74q70 0 140.5 29t106.5 57l37 29l58 -147q-16 -14 -46 -37t-127.5 -60t-199.5 -37q-221 0 -344 137.5t-123 336.5zM293 553l401 51q0 8 -2 20.5t-13 45t-27.5 57.5 t-51.5 45.5t-80 20.5q-94 0 -153.5 -67t-73.5 -173zM410 1102l208 336h205l-301 -400z" /> +<glyph unicode="ê" horiz-adv-x="1003" d="M82 449q0 215 126 358t327 143q170 0 275 -113.5t105 -318.5l-116 -33l-506 -67q16 -129 92 -203t195 -74q70 0 140.5 29t106.5 57l37 29l58 -147q-16 -14 -46 -37t-127.5 -60t-199.5 -37q-221 0 -344 137.5t-123 336.5zM217 1092l234 346h131l231 -348l-119 -54 l-180 250l-178 -250zM293 553l401 51q0 8 -2 20.5t-13 45t-27.5 57.5t-51.5 45.5t-80 20.5q-94 0 -153.5 -67t-73.5 -173z" /> +<glyph unicode="ë" horiz-adv-x="1003" d="M82 449q0 215 126 358t327 143q170 0 275 -113.5t105 -318.5l-116 -33l-506 -67q16 -129 92 -203t195 -74q70 0 140.5 29t106.5 57l37 29l58 -147q-16 -14 -46 -37t-127.5 -60t-199.5 -37q-221 0 -344 137.5t-123 336.5zM195 1270q0 51 34.5 83.5t86 32.5t85 -32.5 t33.5 -83.5t-33.5 -83t-85 -32t-86 33t-34.5 82zM293 553l401 51q0 8 -2 20.5t-13 45t-27.5 57.5t-51.5 45.5t-80 20.5q-94 0 -153.5 -67t-73.5 -173zM594 1270q0 51 34 83.5t85 32.5t86 -32.5t35 -83.5q0 -49 -35 -82t-86 -33t-85 32t-34 83z" /> +<glyph unicode="ì" d="M-63 1438h204l209 -336l-112 -64zM143 0v926h203v-926h-203z" /> +<glyph unicode="í" d="M141 1102l209 336h205l-301 -400zM143 0v926h203v-926h-203z" /> +<glyph unicode="î" d="M-53 1092l233 346h131l232 -348l-119 -54l-180 250l-178 -250zM143 0v926h203v-926h-203z" /> +<glyph unicode="ï" d="M-76 1270q0 51 35 83.5t86 32.5t85 -32.5t34 -83.5t-34 -83t-85 -32t-86 33t-35 82zM143 0v926h203v-926h-203zM324 1270q0 51 33.5 83.5t85 32.5t86 -32.5t34.5 -83.5q0 -49 -34.5 -82t-86 -33t-85 32t-33.5 83z" /> +<glyph unicode="ð" horiz-adv-x="1110" d="M80 446q0 201 128 352.5t322 151.5q158 0 228 -78q-72 176 -219 304l-265 -156l-63 115l209 122q-117 70 -266 109l41 152q217 -41 395 -160l289 170l63 -115l-242 -141q147 -133 227.5 -313.5t80.5 -383.5q0 -268 -128 -434t-354 -166q-205 0 -325.5 140.5t-120.5 330.5 zM285 465q0 -127 65.5 -227.5t184.5 -100.5q121 0 197.5 102.5t76.5 317.5q0 102 -57.5 166.5t-171.5 64.5q-129 0 -212 -91t-83 -232z" /> +<glyph unicode="ñ" horiz-adv-x="1085" d="M139 0v909l199 33v-176q168 184 369 184q115 0 180 -69.5t65 -212.5v-668h-202v594q0 180 -111 180q-117 0 -297 -174v-600h-203zM233 1126q4 2 0 28t6.5 67t26 78.5t56 65.5t100.5 28q53 0 96 -25t65.5 -53.5t50.5 -53t52 -24.5q66 10 66 143h131q-4 -2 0 -28.5 t-7.5 -68.5t-26.5 -81t-58 -67.5t-103 -28.5q-53 0 -95 24.5t-63.5 54t-48 54.5t-53.5 25q-63 -8 -63 -138h-132z" /> +<glyph unicode="ò" horiz-adv-x="1114" d="M80 459q0 195 125 343t356 148q219 0 346 -139t127 -330q0 -88 -29.5 -175t-85 -161.5t-151.5 -122t-215 -47.5q-219 0 -346 143.5t-127 340.5zM248 1438h205l209 -336l-113 -64zM291 477q0 -141 68.5 -240.5t199.5 -99.5q117 0 190.5 89t73.5 229q0 137 -67.5 235 t-198.5 98q-119 0 -192.5 -86t-73.5 -225z" /> +<glyph unicode="ó" horiz-adv-x="1114" d="M80 459q0 195 125 343t356 148q219 0 346 -139t127 -330q0 -88 -29.5 -175t-85 -161.5t-151.5 -122t-215 -47.5q-219 0 -346 143.5t-127 340.5zM291 477q0 -141 68.5 -240.5t199.5 -99.5q117 0 190.5 89t73.5 229q0 137 -67.5 235t-198.5 98q-119 0 -192.5 -86 t-73.5 -225zM453 1102l209 336h204l-301 -400z" /> +<glyph unicode="ô" horiz-adv-x="1114" d="M80 459q0 195 125 343t356 148q219 0 346 -139t127 -330q0 -88 -29.5 -175t-85 -161.5t-151.5 -122t-215 -47.5q-219 0 -346 143.5t-127 340.5zM260 1092l234 346h131l231 -348l-119 -54l-180 250l-178 -250zM291 477q0 -141 68.5 -240.5t199.5 -99.5q117 0 190.5 89 t73.5 229q0 137 -67.5 235t-198.5 98q-119 0 -192.5 -86t-73.5 -225z" /> +<glyph unicode="õ" horiz-adv-x="1114" d="M80 459q0 195 125 343t356 148q219 0 346 -139t127 -330q0 -88 -29.5 -175t-85 -161.5t-151.5 -122t-215 -47.5q-219 0 -346 143.5t-127 340.5zM236 1126q4 2 -0.5 28t6 67t26 78.5t56.5 65.5t100 28q53 0 96 -25t65.5 -53.5t50.5 -53t52 -24.5q66 10 66 143h131 q-4 -2 0 -28.5t-7.5 -68.5t-26.5 -81t-58 -67.5t-103 -28.5q-53 0 -95 24.5t-63.5 54t-48 54.5t-53.5 25q-63 -8 -63 -138h-131zM291 477q0 -141 68.5 -240.5t199.5 -99.5q117 0 190.5 89t73.5 229q0 137 -67.5 235t-198.5 98q-119 0 -192.5 -86t-73.5 -225z" /> +<glyph unicode="ö" horiz-adv-x="1114" d="M80 459q0 195 125 343t356 148q219 0 346 -139t127 -330q0 -88 -29.5 -175t-85 -161.5t-151.5 -122t-215 -47.5q-219 0 -346 143.5t-127 340.5zM238 1270q0 51 34.5 83.5t86 32.5t85 -32.5t33.5 -83.5t-33.5 -83t-85 -32t-86 33t-34.5 82zM291 477q0 -141 68.5 -240.5 t199.5 -99.5q117 0 190.5 89t73.5 229q0 137 -67.5 235t-198.5 98q-119 0 -192.5 -86t-73.5 -225zM637 1270q0 51 34 83.5t85 32.5t86 -32.5t35 -83.5q0 -49 -35 -82t-86 -33t-85 32t-34 83z" /> +<glyph unicode="÷" horiz-adv-x="1064" d="M74 442v148h917v-148h-917zM401 127q0 55 39 94t92 39q55 0 93.5 -39t38.5 -94q0 -53 -38 -92t-94 -39q-53 0 -92 39t-39 92zM401 903q0 53 39 92t92 39q55 0 93.5 -39t38.5 -92t-38 -92t-94 -39q-53 0 -92 39t-39 92z" /> +<glyph unicode="ø" horiz-adv-x="1114" d="M80 459q0 195 125 343t356 148q137 0 244 -61l74 98h135l-121 -162q141 -137 141 -344q0 -88 -29.5 -175t-85 -161.5t-151.5 -122t-215 -47.5q-133 0 -246 62l-74 -98h-137l123 165q-139 140 -139 355zM291 477q0 -121 49 -211l358 479q-59 43 -141 43q-119 0 -192.5 -86 t-73.5 -225zM414 182q61 -45 145 -45q117 0 190.5 89t73.5 229q0 119 -51 209z" /> +<glyph unicode="ù" horiz-adv-x="1079" d="M135 254v672h203v-594q0 -180 115 -180q113 0 276 151v623h203v-641q0 -49 10 -120t21 -116l10 -47l-197 -18q-20 96 -31 163q-162 -172 -358 -172q-252 0 -252 279zM225 1438h205l209 -336l-113 -64z" /> +<glyph unicode="ú" horiz-adv-x="1079" d="M135 254v672h203v-594q0 -180 115 -180q113 0 276 151v623h203v-641q0 -49 10 -120t21 -116l10 -47l-197 -18q-20 96 -31 163q-162 -172 -358 -172q-252 0 -252 279zM430 1102l209 336h205l-301 -400z" /> +<glyph unicode="û" horiz-adv-x="1079" d="M135 254v672h203v-594q0 -180 115 -180q113 0 276 151v623h203v-641q0 -49 10 -120t21 -116l10 -47l-197 -18q-20 96 -31 163q-162 -172 -358 -172q-252 0 -252 279zM236 1092l233 346h131l231 -348l-118 -54l-181 250l-178 -250z" /> +<glyph unicode="ü" horiz-adv-x="1079" d="M135 254v672h203v-594q0 -180 115 -180q113 0 276 151v623h203v-641q0 -49 10 -120t21 -116l10 -47l-197 -18q-20 96 -31 163q-162 -172 -358 -172q-252 0 -252 279zM213 1270q0 51 35 83.5t86 32.5t85 -32.5t34 -83.5t-34 -83t-85 -32t-86 33t-35 82zM612 1270 q0 51 34 83.5t85 32.5t86 -32.5t35 -83.5q0 -49 -35 -82t-86 -33t-85 32t-34 83z" /> +<glyph unicode="ý" horiz-adv-x="952" d="M23 926h215l243 -635l240 635h209l-402 -996q-156 -385 -432 -415l-63 161q98 16 177 88t122 173l49 110zM379 1102l209 336h205l-301 -400z" /> +<glyph unicode="þ" horiz-adv-x="1089" d="M143 -477v1909l203 32v-661q86 147 270 147q178 0 285 -131t107 -330q0 -213 -127 -363.5t-346 -150.5q-123 0 -189 50v-469zM346 236q0 -47 42 -73t114 -26q135 0 214 89t79 251q0 141 -58.5 223t-154.5 82q-129 0 -236 -149v-397z" /> +<glyph unicode="ÿ" horiz-adv-x="952" d="M23 926h215l243 -635l240 635h209l-402 -996q-156 -385 -432 -415l-63 161q98 16 177 88t122 173l49 110zM164 1270q0 51 34.5 83.5t86 32.5t85 -32.5t33.5 -83.5t-33.5 -83t-85 -32t-86 33t-34.5 82zM563 1270q0 51 34 83.5t85 32.5t86 -32.5t35 -83.5q0 -49 -35 -82 t-86 -33t-85 32t-34 83z" /> +<glyph unicode="Œ" horiz-adv-x="2017" d="M92 680q0 137 48 263t139.5 226.5t235.5 161t323 60.5q133 0 256 -25h823v-176h-619v-406h490v-178h-490v-430h625v-176h-836q-133 -25 -266 -25q-332 0 -530.5 205t-198.5 500zM315 690q0 -96 31 -188t91.5 -171t161.5 -127t230 -48q154 0 258 22v1000q-113 33 -258 32 q-242 0 -378 -153.5t-136 -366.5z" /> +<glyph unicode="œ" horiz-adv-x="1742" d="M80 459q0 195 125 343t356 148q240 0 369 -184q125 184 344 184q170 0 275.5 -113.5t105.5 -318.5l-115 -33l-512 -69q16 -127 92 -201t199 -74q70 0 140.5 28t105.5 56l37 29l61 -145q-16 -14 -46 -37t-127 -60t-200 -37q-242 0 -368 187q-131 -186 -369 -187 q-219 0 -346 143.5t-127 340.5zM291 477q0 -141 68.5 -240.5t199.5 -99.5q117 0 190.5 89t73.5 229q0 137 -67.5 235t-198.5 98q-119 0 -192.5 -86t-73.5 -225zM1028 553l406 51q0 8 -2 20.5t-12.5 45t-28 57.5t-52 45.5t-79.5 20.5q-98 0 -158 -67t-74 -173z" /> +<glyph unicode="Ÿ" horiz-adv-x="1208" d="M8 1366h248l350 -575l357 575h237l-489 -780v-586h-211v584zM246 1624q0 51 34.5 85t88.5 34q49 0 83.5 -34t34.5 -85q0 -49 -34.5 -83t-83.5 -34q-51 0 -87 34t-36 83zM735 1624q0 51 35 85t86 34t86 -34t35 -85q0 -49 -35 -83t-86 -34t-86 34t-35 83z" /> +<glyph unicode="ˆ" horiz-adv-x="1038" d="M221 1092l234 346h131l231 -348l-119 -54l-180 250l-178 -250z" /> +<glyph unicode="˜" horiz-adv-x="1038" d="M199 1126q4 2 0 28t6 67t25.5 78.5t56.5 65.5t100 28q53 0 96 -25t65.5 -53.5t50.5 -53t52 -24.5q66 10 66 143h131q-4 -2 0 -28.5t-7.5 -68.5t-26.5 -81t-58 -67.5t-103 -28.5q-53 0 -95 24.5t-63.5 54t-48 54.5t-53.5 25q-63 -8 -63 -138h-131z" /> +<glyph unicode=" " horiz-adv-x="892" /> +<glyph unicode=" " horiz-adv-x="1784" /> +<glyph unicode=" " horiz-adv-x="892" /> +<glyph unicode=" " horiz-adv-x="1784" /> +<glyph unicode=" " horiz-adv-x="594" /> +<glyph unicode=" " horiz-adv-x="446" /> +<glyph unicode=" " horiz-adv-x="297" /> +<glyph unicode=" " horiz-adv-x="297" /> +<glyph unicode=" " horiz-adv-x="223" /> +<glyph unicode=" " horiz-adv-x="356" /> +<glyph unicode=" " horiz-adv-x="99" /> +<glyph unicode="‐" horiz-adv-x="720" d="M111 438v156h499v-156h-499z" /> +<glyph unicode="‑" horiz-adv-x="720" d="M111 438v156h499v-156h-499z" /> +<glyph unicode="‒" horiz-adv-x="720" d="M111 438v156h499v-156h-499z" /> +<glyph unicode="–" horiz-adv-x="1062" d="M111 449v147h839v-147h-839z" /> +<glyph unicode="—" horiz-adv-x="1861" d="M111 449v147h1638v-147h-1638z" /> +<glyph unicode="‘" horiz-adv-x="444" d="M92 1174q0 195 199 346l78 -82q-113 -86 -113 -195q0 -94 123 -225l-178 -100q-109 117 -109 256z" /> +<glyph unicode="’" horiz-adv-x="432" d="M63 1421l181 99q109 -115 108 -254q0 -193 -198 -348l-78 83q113 86 112 195q0 51 -26.5 101t-98.5 124z" /> +<glyph unicode="‚" d="M90 174l186 98q113 -119 113 -254q0 -190 -203 -348l-77 84q117 90 116 193q0 49 -29.5 99t-105.5 128z" /> +<glyph unicode="“" horiz-adv-x="802" d="M92 1174q0 195 199 346l78 -82q-113 -86 -113 -195q0 -94 123 -225l-178 -100q-109 117 -109 256zM451 1174q0 195 198 346l78 -82q-113 -86 -113 -195q0 -94 123 -225l-178 -100q-108 117 -108 256z" /> +<glyph unicode="”" horiz-adv-x="790" d="M63 1421l181 99q109 -115 108 -254q0 -193 -198 -348l-78 83q113 86 112 195q0 51 -26.5 101t-98.5 124zM424 1421l178 99q109 -115 109 -254q0 -193 -199 -348l-78 83q113 86 113 195q0 94 -123 225z" /> +<glyph unicode="„" horiz-adv-x="849" d="M90 174l186 98q113 -119 113 -254q0 -190 -203 -348l-77 84q117 90 116 193q0 49 -29.5 99t-105.5 128zM449 174l186 98q113 -119 113 -254q0 -190 -203 -348l-78 84q117 90 117 193q0 49 -29.5 99t-105.5 128z" /> +<glyph unicode="•" horiz-adv-x="802" d="M106 524q0 125 85 210t210 85t210 -85t85 -210t-85 -210t-210 -85t-210 85t-85 210z" /> +<glyph unicode="…" horiz-adv-x="1622" d="M113 112.5q0 57.5 40 98.5t97 41t98 -41t41 -98.5t-41 -97.5t-98 -40t-97 40t-40 97.5zM674 112.5q0 57.5 40 98.5t97 41t98 -41t41 -98.5t-41 -97.5t-98 -40t-97 40t-40 97.5zM1233 112.5q0 57.5 41 98.5t98.5 41t98 -41t40.5 -98.5t-40.5 -97.5t-98 -40t-98.5 40 t-41 97.5z" /> +<glyph unicode=" " horiz-adv-x="356" /> +<glyph unicode="‹" horiz-adv-x="649" d="M43 510v8q31 23 199 211l194 217l125 -35l-303 -397l303 -397l-125 -35l-166 182l-109 121l-60 66q-26 29 -36 39t-22 20z" /> +<glyph unicode="›" horiz-adv-x="651" d="M90 117l303 397l-303 397l125 35q360 -399 379 -418q6 -4 14 -10v-8q-12 -10 -22.5 -20.5t-35.5 -38.5l-60 -66l-109 -121l-166 -182z" /> +<glyph unicode=" " horiz-adv-x="446" /> +<glyph unicode="€" horiz-adv-x="1148" d="M82 371v108h106q-4 25 -4 80q0 53 4 80h-104v109h123q49 186 187 299.5t339 113.5q82 0 162 -19.5t117 -39.5l39 -19l-52 -168q-117 82 -268 82q-123 0 -201.5 -68.5t-111.5 -180.5h532l-32 -109h-521q-2 -23 -2 -68q0 -49 6 -92h473l-32 -108h-414q39 -106 119 -168 t194 -62q61 0 125 16.5t97 32.5l34 17l50 -150q-127 -82 -322 -82t-332 106.5t-186 289.5h-125z" /> +<glyph unicode="™" horiz-adv-x="1392" d="M74 1270v96h477v-96h-178v-449h-121v449h-178zM639 821l20 545h175l122 -358l125 358h168l21 -545h-115l-16 412l-146 -412h-78l-145 414l-12 -414h-119z" /> +<glyph unicode="" horiz-adv-x="925" d="M0 925h925v-925h-925v925z" /> +<glyph unicode="fi" horiz-adv-x="1110" d="M51 772v109l146 53v70q0 231 118.5 362t313.5 131q168 -2 284 -78l-79 -151q-98 66 -207 65q-100 0 -164 -76.5t-64 -240.5v-90h566v-926h-203v782h-363v-782h-202v772h-146z" /> +<glyph unicode="fl" horiz-adv-x="1142" d="M51 772v109l146 53v70q0 231 118.5 362t313.5 131q125 0 241 -53l127 20v-1464h-200v1288q-94 45 -170 45q-100 0 -164 -76.5t-64 -240.5v-90h256v-154h-256v-772h-202v772h-146z" /> +<glyph unicode="ffi" horiz-adv-x="1720" d="M51 772v109l146 53v39q0 225 118.5 350t313.5 125q145 0 282 -86q113 135 308 135q72 0 139 -19.5t100 -39.5l31 -19l-82 -151q-90 66 -188 65q-92 0 -149.5 -70.5t-57.5 -226.5v-110h563v-926h-201v782h-362v-782h-203v782h-410v-782h-202v772h-146zM399 926h410v98 q0 102 25 186q-100 72 -205 72q-102 0 -166 -70.5t-64 -224.5v-61z" /> +<glyph unicode="ffl" horiz-adv-x="1753" d="M51 772v109l146 53v39q0 225 118.5 350t313.5 125q158 0 289 -90q115 139 313 139q125 0 239 -55l140 22v-1464h-203v1282q-96 51 -178 51q-96 0 -156.5 -74.5t-60.5 -234.5v-98h254v-154h-254v-772h-203v782h-410v-782h-202v772h-146zM399 926h410v86q0 106 29 196 q-106 74 -209 74t-166.5 -70.5t-63.5 -224.5v-61z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansSemiBold-webfont.ttf b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansSemiBold-webfont.ttf new file mode 100755 index 0000000000000000000000000000000000000000..b6a7ac228aca0015479521d21c48781ce909df52 Binary files /dev/null and b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansSemiBold-webfont.ttf differ diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansSemiBold-webfont.woff b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansSemiBold-webfont.woff new file mode 100755 index 0000000000000000000000000000000000000000..f643b28633bbcd624879f20e9bebe37cd92af384 Binary files /dev/null and b/app/code/core/Mage/DesignEditor/view/adminhtml/css/fonts/calluna/CallunaSansSemiBold-webfont.woff differ diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/css/styles.css b/app/code/core/Mage/DesignEditor/view/adminhtml/css/styles.css index cc28641a64e45987cbe26c6f88f6676344336d7d..d5aa9405d1444b8176ca673d08d77edf6a75293c 100644 --- a/app/code/core/Mage/DesignEditor/view/adminhtml/css/styles.css +++ b/app/code/core/Mage/DesignEditor/view/adminhtml/css/styles.css @@ -22,192 +22,743 @@ * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ -.theme-element { + +/* +Fonts +-------------------------------------- */ +@font-face { + font-family: 'CallunaSans'; + src: url('Mage_DesignEditor::/css/fonts/calluna/CallunaSansLight-webfont.woff'); + src: url('Mage_DesignEditor::/css/fonts/calluna/CallunaSansLight-webfont.eot?#iefix') format('embedded-opentype'), url('Mage_DesignEditor::/css/fonts/calluna/CallunaSansLight-webfont.svg#webfont85gDAx2H') format('svg'), url('Mage_DesignEditor::/css/fonts/calluna/CallunaSansLight-webfont.woff') format('woff'), url('Mage_DesignEditor::/css/fonts/calluna/CallunaSansLight-webfont.ttf') format('truetype'); + font-style: normal; + font-weight: 200; +} + +@font-face { + font-family: 'CallunaSans'; + src: url('Mage_DesignEditor::/css/fonts/calluna/CallunaSansRegular-webfont.woff'); + src: url('Mage_DesignEditor::/css/fonts/calluna/CallunaSansRegular-webfont.eot?#iefix') format('embedded-opentype'), url('Mage_DesignEditor::/css/fonts/calluna/CallunaSansRegular-webfont.svg#webfont85gDAx2D') format('svg'), url('Mage_DesignEditor::/css/fonts/calluna/CallunaSansRegular-webfont.woff') format('woff'), url('Mage_DesignEditor::/css/fonts/calluna/CallunaSansRegular-webfont.ttf') format('truetype'); + font-style: normal; + font-weight: 400; +} + +@font-face { + font-family: 'CallunaSans'; + src: url('Mage_DesignEditor::/css/fonts/calluna/CallunaSansSemiBold-webfont.woff'); + src: url('Mage_DesignEditor::/css/fonts/calluna/CallunaSansSemiBold-webfont.eot?#iefix') format('embedded-opentype'), url('Mage_DesignEditor::/css/fonts/calluna/CallunaSansSemiBold-webfont.svg#webfont85gDAx2A') format('svg'), url('Mage_DesignEditor::/css/fonts/calluna/CallunaSansSemiBold-webfont.woff') format('woff'), url('Mage_DesignEditor::/css/fonts/calluna/CallunaSansSemiBold-webfont.ttf') format('truetype'); + font-style: normal; + font-weight: 500; +} + +@font-face { + font-family: 'CallunaSans'; + src: url('Mage_DesignEditor::/css/fonts/calluna/CallunaSansBold-webfont.woff'); + src: url('Mage_DesignEditor::/css/fonts/calluna/CallunaSansBold-webfont.eot?#iefix') format('embedded-opentype'), url('Mage_DesignEditor::/css/fonts/calluna/CallunaSansBold-webfont.svg#webfont85gDAx2C') format('svg'), url('Mage_DesignEditor::/css/fonts/calluna/CallunaSansBold-webfont.woff') format('woff'), url('Mage_DesignEditor::/css/fonts/calluna/CallunaSansBold-webfont.ttf') format('truetype'); + font-style: normal; + font-weight: 600; +} + +@font-face { + font-family: 'MUI-Icons'; + src: url('Mage_DesignEditor::/css/fonts/MUI-Icons.eot'); + src: url('Mage_DesignEditor::/css/fonts/MUI-Icons.eot?#iefix') format('embedded-opentype'), url('Mage_DesignEditor::/css/fonts/MUI-Icons.svg#MUI-Icons') format('svg'), url('Mage_DesignEditor::/css/fonts/MUI-Icons.woff') format('woff'), url('Mage_DesignEditor::/css/fonts/MUI-Icons.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} + +/* + Actions look like buttons +-------------------------------------- */ +.action-theme-preview, +.action-theme-preview:visited, +.action-theme-assign, +.action-theme-assign:visited, +.action-save, +.action-save:visited { + font-family: 'CallunaSans'; + font-size: 13px; + font-weight: 500; + color: #676056; position: relative; - height:351px; - width:351px; + display: inline-block; + padding: 4px 10px; + margin-bottom: 0; + line-height: 18px; + text-align: center; + text-decoration: none; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + vertical-align: top; + cursor: pointer; + background: #ffffff; + background: -moz-linear-gradient(top, #ffffff 0%, #e6e6e6 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #e6e6e6)); + background: -webkit-linear-gradient(top, #ffffff 0%, #e6e6e6 100%); + background: -o-linear-gradient(top, #ffffff 0%, #e6e6e6 100%); + background: -ms-linear-gradient(top, #ffffff 0%, #e6e6e6 100%); + background: linear-gradient(to bottom, #ffffff 0%, #e6e6e6 100%); + border: 1px solid #c0bcb8; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } -.theme-front { - position: absolute; +.action-theme-preview:hover, +.action-theme-assign:hover, +.action-save:hover, +#vde_toolbar_buttons .action-theme-assign, +#vde_toolbar_buttons .action-theme-assign:visited, +.popup .action-save, +.popup .action-save:visited { + border: 1px solid #b6754a; + color: #fff; + text-decoration: none; + text-shadow: 0 -1px 1px rgba(1, 1, 1, 0.5); + background: #f4863e; + background: -moz-linear-gradient(top, #f4863e 0%, #e97d37 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f4863e), color-stop(100%, #e97d37)); + background: -webkit-linear-gradient(top, #f4863e 0%, #e97d37 100%); + background: -o-linear-gradient(top, #f4863e 0%, #e97d37 100%); + background: -ms-linear-gradient(top, #f4863e 0%, #e97d37 100%); + background: linear-gradient(to bottom, #f4863e 0%, #e97d37 100%); } -.theme-back { - background-color: #424242; - display: block; - position: absolute; - width: 100%; - height: 100%; +.action-theme-preview:focus, +.action-theme-assign:focus, +.action-save:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} - opacity: 0; +.action-theme-preview:active, +.action-theme-preview.active, +.action-theme-assign:active, +.action-theme-assign.active, +.action-save:active, +.action-save.active { + border: 1px solid #b6754a; + color: #fff; + text-decoration: none; + text-shadow: 0 -1px 1px rgba(1, 1, 1, 0.5); + background: #f4863e; + background: -moz-linear-gradient(top, #f4863e 0%, #e97d37 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f4863e), color-stop(100%, #e97d37)); + background: -webkit-linear-gradient(top, #f4863e 0%, #e97d37 100%); + background: -o-linear-gradient(top, #f4863e 0%, #e97d37 100%); + background: -ms-linear-gradient(top, #f4863e 0%, #e97d37 100%); + background: linear-gradient(to bottom, #f4863e 0%, #e97d37 100%); +} - transition: opacity .25s ease-in-out; - -moz-transition: opacity .25s ease-in-out; - -webkit-transition: opacity .25s ease-in-out; +.action-theme-preview[disabled], +.action-theme-assign[disabled], +.action-save[disabled] { + cursor: not-allowed; + background-color: #e6e6e6; + background-image: none; + opacity: 0.65; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; } -.theme-title { - color: white; - font-size: 20px; - line-height: 24px; +/* + Actions look like links +-------------------------------------- */ +.popup .action-close { + background: none; + border: none; + color: #6d665e; + font-weight: normal; + font-size: 12px; + cursor: pointer; + border-bottom: 1px solid #b5b3af; } -.theme-title input { - font-size: 20px; - line-height: 24px; + +.popup .action-close:hover { + color: #000; + border-bottom-color: #000; } -.theme-control-title { - position: relative; - margin: 0; - min-height: 40px; + +/* + Themes Inputs +-------------------------------------- */ +.theme input[type=text] { + font: 13px/18px Arial, Helvetica, sans-serif; + display: inline-block; + height: 28px; + padding: 4px 4px; + margin: 0 0 8px; + color: #333; + background-color: #fff; + border: 1px solid #ccc; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -ms-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; } -.theme-title.text-field { - padding: 5px 0 5px 10px; + +.theme input[type=text]:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); } -.theme-title.input-field { - position: absolute; - top: 0; - left: 0; + +/* + Popups +-------------------------------------- */ +.fade { display: none; + position: fixed; + left: 0; + top: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, .45); + padding: 15%; + z-index: 999; } -.theme-title.input-field input { - padding: 5px 0 5px 10px; - width: 250px; - -moz-box-sizing: content-box; - -webkit-box-sizing: content-box; - box-sizing: content-box; + +.no-rgba .fade { + background-color: #000; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=45)"; } -.theme-title.input-field .control { - float: left; + +.fade .popup { + position: absolute; + left: 35%; + right: 35%; + display: inline-block; + padding: 0; + background: #fff; + font-size: 13px; + min-width: 440px; + box-shadow: 0 2px 10px 0 #333; } -.theme-back:hover { - opacity: 1; +.fade .popup-header { + color: #676056; + padding: 18px 50px 18px 24px; + background: #f3efea; +} + +.fade .popup-title { + font: 20px/1 'CallunaSans', Arial, sans-serif; + font-weight: 300; +} + +.fade .popup .actions { + margin: 15px 0 0; +} + +.fade .popup .actions button, +.fade .popup .actions [class^="action-"] { + margin-right: 10px; + vertical-align: baseline; +} + +.fade .popup-footer { + padding: 24px; +} + +.action-close-popup { + position: absolute; + top: 20px; + right: 15px; + width: 20px; + height: 20px; + overflow: hidden; + text-indent: -999em; + cursor: pointer; } +.action-close-popup:before { + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e061'; /* close icon */ + font-size: 20px; + color: #676056; + position: absolute; + right: 0; + top: 0; + text-indent: 0; +} + +.action-close-popup:hover:before { + color: #000; +} + +/* + Infinite Scroll +-------------------------------------- */ .infinite_scroll { - height:100%; - width: 900px; position: relative; + max-width: 1300px; + height: 100%; + margin: 0 auto; +} + +/* + Theme Loader +-------------------------------------- */ +.theme-loader { + width: 75px; + height: 75px; + border: 1px solid #f98e4e; + position: fixed; + left: 50%; + top: 50%; + margin: -50px 0 0 -50px; + background-color: rgba(255, 246, 237, .8); + text-align: center; + line-height: 100px; +} + +/* + Themes Tabs +-------------------------------------- */ +/* TODO: remove after unified tabs implementation */ +#theme_selector_tabs { + +} + +#theme_selector_tabs .tabs-horiz { + margin: 0; + padding: 0; + background: none; + list-style: none; + border-bottom: 1px solid #ccc; } -div.theme-preview-actions .theme-preview-about { +#theme_selector_tabs .tabs-horiz > li { + margin: 0 -1px -1px 0; float: left; - display: none; + background: #eaeaea; + background: -moz-linear-gradient(top, #eaeaea 0%, #dfdfdf 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #eaeaea), color-stop(100%, #dfdfdf)); + background: -webkit-linear-gradient(top, #eaeaea 0%, #dfdfdf 100%); + background: -o-linear-gradient(top, #eaeaea 0%, #dfdfdf 100%); + background: -ms-linear-gradient(top, #eaeaea 0%, #dfdfdf 100%); + background: linear-gradient(to bottom, #eaeaea 0%, #dfdfdf 100%); } -div.theme-preview-actions .btn-apply-theme { - float: right; + +#theme_selector_tabs .tabs-horiz > li:hover { + background: #dfdfdf; + background: -moz-linear-gradient(top, #dfdfdf 0%, #eaeaea 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #dfdfdf), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(top, #dfdfdf 0%, #eaeaea 100%); + background: -o-linear-gradient(top, #dfdfdf 0%, #eaeaea 100%); + background: -ms-linear-gradient(top, #dfdfdf 0%, #eaeaea 100%); + background: linear-gradient(to bottom, #dfdfdf 0%, #eaeaea 100%); } -div.theme-preview-actions .theme-preview-window { - margin: 0 10px; - display: none; + +#theme_selector_tabs .tabs-horiz > li a { + padding-right: 12px; + padding-left: 12px; + padding-top: 8px; + padding-bottom: 8px; + line-height: 18px; + border: 1px solid #ccc; + text-decoration: none; + color: #666; +} + +#theme_selector_tabs .tabs-horiz .ui-tabs-active a { + border-bottom-color: #fff; +} + +/* + Themes Tabs Panel +-------------------------------------- */ +.theme-selector { + border: solid #ccc; + border-width: 0 1px 1px; + overflow: auto; +} + +.theme-selector .ui-tabs-panel { + padding: 20px 20px 0; +} + +/* + Themes +-------------------------------------- */ +.themes { + margin: 0 0 40px; + padding: 0; + list-style: none; + overflow: hidden; } -div.theme-preview-actions .theme-preview-back, -span.back-to-selected-theme { + +.theme { + position: relative; + width: 30%; float: left; - cursor: pointer; - margin: 0 20px 0 0; - width: 28px; - height: 29px; - background: url(../images/theme-preview-back.png) 0 0 no-repeat; + margin: 0 5% 5% 0; + padding: 40px 0 0; } -.theme-element-customizations{ - width:351px; +.ie8 .theme { + margin-right: 3%; } -.theme-assigned-to-storeview .theme-title{ - color: black; +@media screen and (min-width: 1280px) { + .theme:nth-child(3n+3) { + margin-right: 0; + } } -.theme-front-customizations{ + +@media screen and (max-width: 1280px) { + .theme { + width: 47%; + margin-right: 6%; + } + + .theme:nth-child(even) { + margin-right: 0; + } +} + +.theme-content { position: relative; - height:351px; - width:351px; + border: 1px solid #cac2b5; + background: #f8f8f8; + text-align: center; + min-height: 350px; } -.theme-front-customizations .theme-buttons{ - padding: 30px; - margin-top: -100px; - display: block; + +.theme-content img { + max-width: 100%; + height: 350px; +} + +.theme-data { position: absolute; - z-index: 1; - background-color: #424242; + left: 0; + top: 0; + right: 0; + bottom: 0; + opacity: 0; + text-align: left; + color: #f2ebde; + padding: 15% 10% 0; + background: #242320; + background: -moz-linear-gradient(top, #31302b 0%, #1f1e1c 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #31302b), color-stop(100%, #1f1e1c)); + background: -webkit-linear-gradient(top, #31302b 0%, #1f1e1c 100%); + background: -o-linear-gradient(top, #31302b 0%, #1f1e1c 100%); + background: -ms-linear-gradient(top, #31302b 0%, #1f1e1c 100%); + background: linear-gradient(to bottom, #31302b 0%, #1f1e1c 100%); } -.theme-loader { - display: none; - position: relative; - float: left; +.theme-data:hover { + -webkit-transition: opacity .5s ease-in-out; + -moz-transition: opacity .5s ease-in-out; + -ms-transition: opacity .5s ease-in-out; + -o-transition: opacity .5s ease-in-out; + transition: opacity .5s ease-in-out; + opacity: 1; } -.theme-container { - float: left; +.theme-title { + color: #f2ebde; + font-family: 'CallunaSans', Arial, sans-serif; + font-weight: 200; + font-size: 24px; +} + +.theme-data p { + max-height: 50%; + margin: 20px 0 30px 0; + font: 14px/1.5 Arial, Helvetica, sans-serif; + color: #B9B4AA; + overflow: hidden; +} + +.theme-data .actions { + text-align: right; + position: absolute; + bottom: 30px; + left: 10%; + right: 10%; + white-space: nowrap; +} + +.theme-data .action-theme-assign { + margin-left: 8px; +} + +.theme-data .action-theme-assign span { + background: none; + padding-left: 4px; +} + +.theme-data .action-theme-preview:hover, +.theme-data .action-theme-preview:active, +.theme-data .action-theme-assign:hover, +.theme-data .action-theme-assign:active { + background: #31302b; + border-color: #31302b; + color: #fff; + text-shadow: none; + box-shadow: none; +} + +.theme-data .action-edit, +.theme-data .action-delete { + color: #fff; + text-decoration: none; + font-size: 16px; + vertical-align: middle; + margin: 3px 0 0 7px; +} + +.theme-data .action-edit:before, +.theme-data .action-delete:before { + display: inline-block; + text-indent: 0; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: "\e05b"; +} + +.theme-data .action-delete:before { + content: "\e07f"; +} + +.theme-data .action-edit, +.theme-data .action-delete { + background: none; + border: none; + display: inline-block; + width: 22px; + height: 24px; + overflow: hidden; +} + +.theme-data .action-edit span { + background: none; + padding: 0; +} + +/* + My Customizations Tab +-------------------------------------- */ +.themes-customizations .theme-data { + opacity: 1; + top: auto; + padding: 0; + height: 70px; +} + +.themes-customizations .theme-data .actions { + bottom: 20px; +} + +.themes-customizations h3 { + margin-bottom: 16px; } +.themes-customizations .theme-title { + color: #000; + font-size: 18px; + position: absolute; + left: 0; + right: 50%; + top: 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + + +/* + Unassigned Themes +-------------------------------------- */ +.themes-unassigned .theme-title { + right: 0; +} + +/* + Theme Title Quick Save Form +-------------------------------------- */ +.edit-theme-title-form { + position: absolute; + top: 0; + left: 0; + right: 0; +} +.edit-theme-title-form > input[type="text"] { + width: 70%; +} + +.themes-assigned .edit-theme-title-form { + right: 50%; +} + +.themes-unassigned .edit-theme-title-form > input[type="text"] { + width: 50%; +} + +/* + Applied to storeview +-------------------------------------- */ +.theme-assigned-to-storeview { + text-align: right; + position: absolute; + top: 5px; + right: 0; + left: 52%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.theme-assigned-to-storeview span { + color: #959393; +} + +/* + Websites/Stores/Storeviews List in Popup +-------------------------------------- */ +.website { + padding: 10px 0 0; +} + +.website-title, +.store-title { + border-bottom: 1px solid #dfdfdf; + padding: 0 24px 5px; +} + +.store-title { + padding-left: 40px; +} + +.storeview { + padding-left: 60px; + margin: 0 0 5px 0; +} + +.storeview-selector-control { + margin: -3px 3px 0 0; +} + +/* + VDE +-------------------------------------- */ #vde_toolbar { position: fixed; margin-top: -54pt; width: 100%; - z-index: 999; - font:10pt Arial, Helvetica, sans-serif; - color:#555; - text-align:left; - box-shadow:0 0 4pt 1pt #cbcbcb; + z-index: 997; + font: 10pt Arial, Helvetica, sans-serif; + color: #555; + text-align: left; + box-shadow: 0 0 4pt 1pt #cbcbcb; } + .vde_breadcrumbs, #vde_toolbar_row { - padding:0 0 0 1em; - height:26pt; - line-height:26pt; - vertical-align:middle; + padding: 0 0 0 1em; + height: 26pt; + line-height: 26pt; + vertical-align: middle; } + .vde_breadcrumbs { - text-transform:uppercase; - background:white; + text-transform: uppercase; + background: white; } #vde_toolbar_row { - background:#f0efe9; - border-top:1pt solid #dddcd8; - border-bottom:1pt solid #dddcd8; - position:relative; + background: #f0efe9; + border-top: 1pt solid #dddcd8; + border-bottom: 1pt solid #dddcd8; + position: relative; } #vde_toolbar_row .vde_toolbar_cell { float: left; - margin-left:-11pt; - margin-right:10pt; - border-right:1pt solid transparent; - border-left:1pt solid transparent; - padding:0 10pt; - position:relative; + margin-left: -11pt; + margin-right: 10pt; + border-right: 1pt solid transparent; + border-left: 1pt solid transparent; + padding: 0 10pt; + position: relative; } + #vde_toolbar_row .vde_toolbar_cell:hover, #vde_toolbar_row .vde_toolbar_cell.active { - background-color:white; - border-right:1pt solid #deddd9; - border-left:1pt solid #deddd9; + background-color: white; + border-right: 1pt solid #deddd9; + border-left: 1pt solid #deddd9; } + #vde_toolbar_buttons { float: right; - z-index: 1000; + z-index: 998; position: relative; - line-height:21pt; - padding:2pt 0; -} -#vde_toolbar_buttons a.vde_button { - display:block; - border:1px solid #c9c6be; - box-shadow:0 0 1pt 0 #c9c6be; - border-radius:3pt; - padding:0 1.7em; - color:#555; - text-decoration:none; - background-image:url(../images/button.png); - background-size:contain; + line-height: 21pt; + padding: 2pt 0; +} +.action-switch-mode { float: left; - margin-right:3px; + background: none; + border: 0; + height: 30px; + line-height: 30px; + font-weight: normal; } -#vde_toolbar_buttons a.vde_button:hover { - box-shadow:0 0 1pt 1pt #c9c6be; - background-image:url(../images/button_hover.png); + +#vde_toolbar_buttons a.vde_button, +.action-switch-mode { + display: block; + border: 1px solid #c9c6be; + box-shadow: 0 0 1pt 0 #c9c6be; + border-radius: 3pt; + padding: 0 1.7em; + color: #555; + text-decoration: none; + background-image: url(../images/button.png); + background-size: contain; + background-color:#f4f3f1 !important; + float: left; + margin-right: 3px; } + +#vde_toolbar_buttons a.vde_button:hover, +.action-switch-mode:hover { + box-shadow: 0 0 1pt 1pt #c9c6be; + background-image: url(../images/button_hover.png); +} + +#vde_toolbar_buttons .action-theme-assign { + float: right; + margin-right: 10px; + height: 30px; +} + #vde_toolbar .item-msg { border-style: solid; border-width: 1px; @@ -221,74 +772,90 @@ span.back-to-selected-theme { .vde_toolbar_cell_title { font-weight: bold; cursor: pointer; - padding-right:12pt; + padding-right: 12pt; background: url(../images/arrow_down.png) right center no-repeat; } + .vde_toolbar_cell.active .vde_toolbar_cell_title { background-image: url(../images/arrow_up.png); } + .vde_toolbar_cell_value { font-weight: normal; } -#vde_toolbar_row .vde_toolbar_cell_content, #vde_toolbar_row .vde_toolbar_cell_content * { - color:#f0efe9; + +#vde_toolbar_row .vde_toolbar_cell_content, +#vde_toolbar_row .vde_toolbar_cell_content * { + color: #f0efe9; } + .vde_toolbar_cell_content { display: none; position: absolute; - top:2.5em; - left:0; + top: 2.5em; + left: 0; background: #494949; - padding:.5em 0; + padding: .5em 0; z-index: 190; - min-width:20em; - margin-top:1pt; - border-radius:0 0 5pt 5pt; - -moz-box-shadow:0 1pt 2pt 1pt #6c6c6c; - -webkit-box-shadow:0 1pt 2pt 1pt #6c6c6c; - box-shadow:0 1pt 2pt 1pt #6c6c6c; + min-width: 20em; + margin-top: 1pt; + border-radius: 0 0 5pt 5pt; + -moz-box-shadow: 0 1pt 2pt 1pt #6c6c6c; + -webkit-box-shadow: 0 1pt 2pt 1pt #6c6c6c; + box-shadow: 0 1pt 2pt 1pt #6c6c6c; } + .vde_toolbar_cell.active .vde_toolbar_cell_content { display: block; } + .vde_toolbar_cell_content > div { white-space: nowrap; vertical-align: middle; padding: 0 10px; } + .vde_toolbar_cell_content .vde_cell_list_item { - padding-left:18pt; + padding-left: 18pt; cursor: pointer; } + .vde_toolbar_cell_content .vde_cell_list_group { - padding-left:5pt; - font-style:italic; - cursor:default; + padding-left: 5pt; + font-style: italic; + cursor: default; } + .vde_toolbar_cell_content .vde_cell_list_item:hover, #vde_handles_tree .jstree-clicked, #vde_handles_tree .jstree-hovered { - background-color:#7b7b7b; + background-color: #7b7b7b; } + .vde_toolbar_cell_content .checked { - background:url(../images/checked.png) no-repeat 5pt center; + background: url(../images/checked.png) no-repeat 5pt center; } + .vde_breadcrumbs a { font-weight: bold; text-decoration: none; color: #2483c7; } + .vde_breadcrumbs a:hover { text-decoration: underline; } + .vde_breadcrumbs .vde_breadcrumbs_separator { - margin:0 0.3em; + margin: 0 .3em; } + #visual_design_editor_theme a { - display:block; - text-decoration:none; + display: block; + text-decoration: none; } #vde_handles_hierarchy .vde_toolbar_cell_content { padding: 1em .5em 1em 0; } + #vde_handles_tree { max-height: 30em; /* max allowed height */ overflow: hidden; /* don't display native scrollbars */ @@ -296,28 +863,58 @@ span.back-to-selected-theme { text-align: left; background-color: transparent; } + #vde_handles_tree li { overflow: hidden; } + #vde_handles_tree a { margin-left: .5em; padding: .5em; width: 100%; } + #vde_handles_tree .jstree-clicked, #vde_handles_tree .jstree-hovered { border: none; } + #vde_handles_tree .jstree-closed > .jstree-icon { background: url(../images/jstree_plus_minus.png) top left no-repeat; } + #vde_handles_tree .jstree-open > .jstree-icon { background: url(../images/jstree_plus_minus.png) top right no-repeat; } + #vde_handles_tree .vde_option_fragment a { color: #eea243; } + .vde_container_frame { border: none; - margin-top: 0px; + margin-top: 0; width: 100%; } + +/* + Clearfix +-------------------------------------- */ +.themes:before, +.themes:after, +.clearfix:before, +.clearfix:after { + content: ""; + display: table; +} + +.themes:after, +.clearfix:after { + clear: both; +} + +/* + Utils +-------------------------------------- */ +.hidden { + display: none; +} diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/js/design_editor.js b/app/code/core/Mage/DesignEditor/view/adminhtml/js/design_editor.js index d05c77cae94bb1b74e0971baa714b3c7fce869d0..6c6fe8800693a5917a87a558834bbcd23c11db99 100644 --- a/app/code/core/Mage/DesignEditor/view/adminhtml/js/design_editor.js +++ b/app/code/core/Mage/DesignEditor/view/adminhtml/js/design_editor.js @@ -204,9 +204,11 @@ $(window).on('resize', $.proxy(this._resizeFrame, this)); }, _resizeFrame: function() { - var height = $(window).innerHeight(); - var offset = $(this.options.frameSelector).offset(); - $(this.options.frameSelector).height(height - parseInt(offset.top) - 5); + if ($(this.options.frameSelector).length) { + var height = $(window).innerHeight(); + var offset = $(this.options.frameSelector).offset(); + $(this.options.frameSelector).height(height - parseInt(offset.top) - 5); + } }, _initFrame: function() { this._resizeFrame(); diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/js/infinitescroll.js b/app/code/core/Mage/DesignEditor/view/adminhtml/js/infinitescroll.js index e23b201b4b8482431817ff71bad62a8636e8b7fd..07d7dc26257c7219414862a458dae56178ec7d16 100644 --- a/app/code/core/Mage/DesignEditor/view/adminhtml/js/infinitescroll.js +++ b/app/code/core/Mage/DesignEditor/view/adminhtml/js/infinitescroll.js @@ -28,7 +28,7 @@ $.widget('vde.infinite_scroll', { _locked: false, _loader: '.theme-loader', - _container: '.theme-container', + _container: '#available-themes-container', _defaultElementSize: 400, _elementsInRow: 2, _pageSize: 4, diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/js/theme-selector.js b/app/code/core/Mage/DesignEditor/view/adminhtml/js/theme-selector.js index 7cc136e50cd92933aa9bbd97b38114e89d2dea00..e5ac5caed9d82e415a201d56acc879edabfab5ed 100644 --- a/app/code/core/Mage/DesignEditor/view/adminhtml/js/theme-selector.js +++ b/app/code/core/Mage/DesignEditor/view/adminhtml/js/theme-selector.js @@ -35,6 +35,7 @@ storeView: { windowSelector: '#store-view-window' }, + closePopupBtn: '[class^="action-close"]', assignSaveUrl: null, afterAssignSaveUrl: null, storesByThemes: {}, @@ -68,12 +69,11 @@ this.element.on(this.options.previewEvent, $.proxy(this._onPreview, this)); this.element.on(this.options.editEvent, $.proxy(this._onEdit, this)); this.element.on(this.options.deleteEvent, $.proxy(this._onDelete, this)); + this.element.on('click.closePopup', this.options.closePopupBtn, $.proxy(this._closePopup, this)); this.element.on('keyup', $.proxy(function(e) { //ESC button if (e.keyCode === 27) { - var popUp = $(this.options.storeView.windowSelector); - popUp.hide(); - this.themeId = null; + this._closePopup(); } }, this)); this.element.on(this.options.loadEvent, $.proxy(function() { @@ -105,6 +105,11 @@ deleteConfirm($.mage.__('Are you sure you want to do this?'), data.url); }, + _closePopup: function(event, data) { + $(this.options.storeView.windowSelector).hide(); + this.themeId = null; + }, + /** * Assign event handler * @protected @@ -275,9 +280,23 @@ * @protected */ _init: function() { - this.options._control.on('click', $.proxy(this._onEdit, this)); - this.options._saveControl.on('click', $.proxy(this._onSave, this)); - this.document.on('click', $.proxy(this._onCancel, this)); + this.options._textControl.on('click.editThemeTitle', $.proxy(this._onEdit, this)); + this.options._saveTitleBtn.on('click.submitForm', $.proxy(function() { + this.options._formControl.trigger('submit'); + return false; + }, this)); + this.options._formControl.on('submit.saveThemeTitle', $.proxy(function() { + this._onSave(); + return false; + }, this)); + this.document + .on('click.cancelEditThemeTitle', $.proxy(this._onCancel, this)) + .on('keyup', $.proxy(function(e) { + //ESC button + if (e.keyCode === 27) { + this._cancelEdit(); + } + }, this)); }, /** @@ -285,9 +304,10 @@ * @protected */ _create: function() { - this.options._textControl = this.widget().find('.theme-title.text-field'); - this.options._inputControl = this.widget().find('.theme-title.input-field'); - this.options._saveControl = this.widget().find('.save'); + this.options._textControl = this.widget().find('.theme-title'); + this.options._inputControl = this.widget().find('.edit-theme-title-form'); + this.options._formControl = this.widget().find('.edit-theme-title-form'); + this.options._saveTitleBtn = this.widget().find('.action-save'); this.options._control = this.widget().find('.theme-control-title'); this.options.themeData = this.widget().data('widget-options'); @@ -346,7 +366,7 @@ * @protected */ _getThemeTitle: function() { - return this.options._inputControl.find('input').val(); + return this.options._inputControl.find('input').val(); }, /** @@ -356,7 +376,9 @@ * @protected */ _setThemeTitle: function(title) { - this.options._textControl.html(title); + this.options._textControl + .text(title) + .attr('title', title); this.options._inputControl.find('input').val(title); return this; }, @@ -367,7 +389,7 @@ * @protected */ _onCancel: function(event) { - if (this.options.isActive && this.options._control.has($(event.target)).length === 0) { + if (this.options.isActive && this.widget().has($(event.target)).length === 0) { this._cancelEdit(); } }, diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/theme/available.phtml b/app/code/core/Mage/DesignEditor/view/adminhtml/theme/available.phtml index cd58919e12b6478f7658d66a9c57eb6f957939be..54e5bf5dc8714dd969583180cd1efa2bb1f5d7b5 100644 --- a/app/code/core/Mage/DesignEditor/view/adminhtml/theme/available.phtml +++ b/app/code/core/Mage/DesignEditor/view/adminhtml/theme/available.phtml @@ -27,20 +27,16 @@ <?php /** @var $this Mage_DesignEditor_Block_Adminhtml_Theme */?> -<li class="theme" id="theme-id-<?php echo $this->getTheme()->getId() ?>" style="margin:20px; float:left;"> - <ul class="theme-element"> - <li class="theme-front"> - <div style="margin:0 auto; height:350px; width:350px; border:1px solid black;"> - <img src="<?php echo $this->getTheme()->getPreviewImageUrl() ?>" style="display:block; height:350px; width:350px;" alt="" /> - </div> - </li> - <li class="theme-back"> - <div style="padding: 30px;"> - <div class="theme-title"> - <?php echo $this->getTheme()->getThemeTitle() ?> - </div> +<li class="theme" id="theme-id-<?php echo $this->getTheme()->getId() ?>"> + <div class="theme-content"> + <img src="<?php echo $this->getTheme()->getThemeImage()->getPreviewImageUrl() ?>" alt="<?php echo $this->getTheme()->getThemeTitle() ?>" /> + <article class="theme-data"> + <h4 class="theme-title" title="<?php echo $this->getTheme()->getThemeTitle() ?>"><?php echo $this->getTheme()->getThemeTitle() ?></h4> + <!-- TODO: placeholder for theme description --> + <!-- <p>Our responsive theme designed by Magento pros to be best in breed for Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis</p> --> + <div class="actions"> <?php echo $this->getButtonsHtml() ?> </div> - </li> - </ul> + </article> + </div> </li> diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/theme/customized.phtml b/app/code/core/Mage/DesignEditor/view/adminhtml/theme/customized.phtml index cf70cdd9997d23117d997d2e1f07c300c1914428..cc3f752e910dc22dfceff718fba2228b44b04768 100644 --- a/app/code/core/Mage/DesignEditor/view/adminhtml/theme/customized.phtml +++ b/app/code/core/Mage/DesignEditor/view/adminhtml/theme/customized.phtml @@ -30,31 +30,24 @@ $themeTitle = $this->quoteEscape($this->getTheme()->getThemeTitle()); ?> -<li class="theme" id="theme-id-<?php echo $this->getTheme()->getId() ?>" style="margin:20px; float:left;"> - <ul class="theme-element-customizations" data-widget-options="<?php echo $this->escapeHtml($this->getOptionsJson()); ?>"> - <li class="theme-assigned-to-storeview theme-control-title""> - <span class="theme-title text-field"> - <?php echo $this->getTheme()->getThemeTitle() ?> - </span> - <div class="theme-title input-field"> - <div class="control"> - <input type="text" value="<?php echo $themeTitle ?>" data-title-original="<?php echo $themeTitle ?>" class="input-text" /> - </div> - <?php echo $this->getQuickSaveButton()->toHtml() ?> +<li class="theme" id="theme-id-<?php echo $this->getTheme()->getId() ?>" data-widget-options="<?php echo $this->escapeHtml($this->getOptionsJson()); ?>"> + <form action="" method="post" class="edit-theme-title-form hidden"> + <input type="text" value="<?php echo $themeTitle ?>" data-title-original="<?php echo $themeTitle ?>" required autofocus /> + <?php echo $this->getQuickSaveButton()->toHtml() ?> + </form> + <h4 class="theme-title" title="<?php echo $themeTitle ?>"><?php echo $themeTitle ?></h4> + <?php if ($this->getTheme()->getAssignedStores()): ?> + <p class="theme-assigned-to-storeview"> + <span><?php echo $this->__('Store View applied to: ')?></span> + <strong title="<?php echo implode(', ', $this->getStoresTitles()) ?>"><?php echo implode(', ', $this->getStoresTitles()) ?></strong> + </p> + <?php endif; ?> + <div class="theme-content"> + <img src="<?php echo $this->getTheme()->getThemeImage()->getPreviewImageUrl() ?>" alt="<?php echo $themeTitle ?>"/> + <article class="theme-data"> + <div class="actions"> + <?php echo $this->getButtonsHtml() ?> </div> - </li> - <li> - <?php if ($this->getTheme()->getAssignedStores()): ?> - <?php echo $this->__('Store View applied to:') . ' ' . implode(', ', $this->getStoresTitles()) ?> - <?php endif; ?> - </li> - <li class="theme-front-customizations"> - <div style="margin:0 auto; height:350px; width:350px; border:1px solid black;"> - <img src="<?php echo $this->getTheme()->getPreviewImageUrl() ?>" style="display:block; height:350px; width:350px;" alt="" /> - <div class="theme-buttons"> - <?php echo $this->getButtonsHtml() ?> - </div> - </div> - </li> - </ul> + </article> + </div> </li> diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/theme/list/available.phtml b/app/code/core/Mage/DesignEditor/view/adminhtml/theme/list/available.phtml index 2d1f0a55bd613ed82f79e076774d11f1d072bc62..4d85757aaf6cd2df162699b59c14e6046b5fc1d1 100644 --- a/app/code/core/Mage/DesignEditor/view/adminhtml/theme/list/available.phtml +++ b/app/code/core/Mage/DesignEditor/view/adminhtml/theme/list/available.phtml @@ -26,14 +26,13 @@ ?> <?php /** @var $this Mage_DesignEditor_Block_Adminhtml_Theme_Selector_List_Available */?> -<div class="entry-edit"> - <div class="infinite_scroll"> - <ul id="theme-container" class="theme-container"></ul> - <div class="theme-loader"> - <img src="<?php echo $this->getViewFileUrl('images/ajax-loader-tr.gif') ?>"/> - </div> +<div class="infinite_scroll"> + <ul class="themes" id="available-themes-container"></ul> + <div class="theme-loader"> + <img src="<?php echo $this->getViewFileUrl('images/ajax-loader-tr.gif') ?>"/> </div> </div> + <script type="text/javascript"> (function ($) { $( document ).ready(function( ) { @@ -52,3 +51,550 @@ }); })(jQuery); </script> + +<section class="vde-tools hidden"> + <header class="vde-tools-header"> + <div class="vde-tools-header-inner"> + <button class="action-close" title="<?php echo $this->__('Close Panel'); ?>"> + <span><?php echo $this->__('Close Panel'); ?></span> + </button> + </div> + </header> + <div class="vde-tools-content"> + <div class="vde-tools-content-inner"> + <div class="vde-tools-handler-container"></div> + <div class="vde-tab-content tab-panel active" id="vde-tab-design"> + <div class="vde-tab-content-header"> + <h4 class="vde-tab-content-title"><?php echo $this->__('Design'); ?></h4> + </div> + <div class="vde-tab-content-inner"> + <div class="vde-tab-data"> + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat nonproident, sunt in culpa qui officia deserunt mollit anim id est laborum. + </div> + </div> + </div> + <div class="vde-tab-content tab-panel" id="vde-tab-block"> + <div class="vde-tab-content-header"> + <h4 class="vde-tab-content-title"><?php echo $this->__('Block'); ?></h4> + </div> + <div class="vde-tab-content-inner"> + <div class="vde-tab-data"> + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat nonproident, sunt in culpa qui officia deserunt mollit anim id est laborum. + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat nonproident, sunt in culpa qui officia deserunt mollit anim id est laborum. + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat nonproident, sunt in culpa qui officia deserunt mollit anim id est laborum. + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat nonproident, sunt in culpa qui officia deserunt mollit anim id est laborum. + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat nonproident, sunt in culpa qui officia deserunt mollit anim id est laborum. + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat nonproident, sunt in culpa qui officia deserunt mollit anim id est laborum. + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat nonproident, sunt in culpa qui officia deserunt mollit anim id est laborum. + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat nonproident, sunt in culpa qui officia deserunt mollit anim id est laborum. + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat nonproident, sunt in culpa qui officia deserunt mollit anim id est laborum. + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat nonproident, sunt in culpa qui officia deserunt mollit anim id est laborum. + Design Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat nonproident, sunt in culpa qui officia deserunt mollit anim id est laborum. + Design Lorem isum dolor sit amet, t amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat nonproident, sunt in culpa qui officia deserunt mollit anim id est laborum. + </div> + </div> + </div> + <div class="vde-tab-content tab-panel" id="vde-tab-settings"> + <div class="vde-tab-content-header"> + <h4 class="vde-tab-content-title"><?php echo $this->__('Settings'); ?></h4> + </div> + <div class="vde-tab-content-inner"> + <div class="vde-tab-data"> + Design Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat nonproident, sunt in culpa qui officia deserunt mollit anim id est laborum. + Design Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat nonproident, sunt in culpa qui officia deserunt mollit anim id est laborum. + Design rem ipsum dolor sit aet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat nonproident, sunt in culpa qui officia deserunt mollit anim id est laborum. + Design Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat nonproident, sunt in culpa qui officia deserunt mollit anim id est laborum. + Design Lorem ipsum dolor sit amet, t amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat nonproident, sunt in culpa qui officia deserunt mollit anim id est laborum. + </div> + </div> + </div> + <div class="vde-tab-content tab-panel" id="vde-tab-code"> + <div class="vde-tab-content-header"> + <h4 class="vde-tab-content-title"><?php echo $this->__('Scripts'); ?></h4> + + <div class="vde-tools-tabs"> + <ul class="vde-tab-controls"> + <li class="item active"><a href="#vde-tab-css" data-toggle="tab"><?php echo $this->__('Css'); ?></a></li> + <li class="item"><a href="#vde-tab-js" data-toggle="tab"><?php echo $this->__('JS'); ?></a></li> + <li class="item"><a href="#vde-tab-custom" data-toggle="tab"><?php echo $this->__('Custom'); ?></a></li> + </ul> + </div> + </div> + <div class="vde-tab-content-inner"> + <div class="vde-tab-data"> + <div class="tab-panel active" id="vde-tab-css"> + + <div class="vde-message"> + <div class="message-inner"> + <div class="message-content"> + Oops! Your upload did not finish. Try checking that thing that you need to check and try again. + </div> + <button class="action-close" title="<?php echo $this->__('Close Message'); ?>"> + <span><?php echo $this->__('Close Message'); ?></span> + </button> + </div> + </div> + <div class="files-wrapper"> + <div class="files-list"> + <div class="files-list-header"> + <h5 class="title">Title of Group</h5> + <a href="#vde-tab-custom" class="action-add" data-toggle="tab" title="<?php echo $this->__('Add Custom'); ?>"> + <span><?php echo $this->__('Add Custom'); ?></span> + </a> + </div> + <div class="files-list-content"> + <ul class="items"> + <li class="item"> + <span class="filename">print.css</span> + <a href="#" class="action-download" title="<?php echo $this->__('Download file'); ?>"> + <span><?php echo $this->__('Download file'); ?></span> + </a> + </li> + <li class="item"> + <span class="filename">styles-ie.css</span> + <a href="#" class="action-download" title="<?php echo $this->__('Download file'); ?>"> + <span><?php echo $this->__('Download file'); ?></span> + </a> + </li> + <li class="item"> + <span class="filename">style.css</span> + <a href="#" class="action-download" title="<?php echo $this->__('Download file'); ?>"> + <span><?php echo $this->__('Download file'); ?></span> + </a> + </li> + <li class="item"> + <span class="filename">widget.css</span> + <a href="#" class="action-download" title="<?php echo $this->__('Download file'); ?>"> + <span><?php echo $this->__('Download file'); ?></span> + </a> + </li> + <li class="item"> + <span class="filename">global_settings.css</span> + <a href="#" class="action-download" title="<?php echo $this->__('Download file'); ?>"> + <span><?php echo $this->__('Download file'); ?></span> + </a> + </li> + <li class="item"> + <span class="filename">custom.css</span> + <a href="#" class="action-download" title="<?php echo $this->__('Download file'); ?>"> + <span><?php echo $this->__('Download file'); ?></span> + </a> + <a href="#vde-tab-custom" class="action-edit" title="<?php echo $this->__('Edit Custom CSS'); ?>"> + <span><?php echo $this->__('Edit Custom CSS'); ?></span> + </a> + </li> + </ul> + </div> + </div> + + <div class="files-list"> + <div class="files-list-header"> + <h5 class="title">Title of Group</h5> + <a href="#vde-tab-custom" class="action-add" data-toggle="tab" title="<?php echo $this->__('Add Custom'); ?>"> + <span><?php echo $this->__('Add Custom'); ?></span> + </a> + </div> + <div class="files-list-content"> + <ul class="items"> + <li class="item"> + <span class="filename">print.css</span> + <a href="#" class="action-download" title="<?php echo $this->__('Download file'); ?>"> + <span><?php echo $this->__('Download file'); ?></span> + </a> + </li> + <li class="item"> + <span class="filename">styles-ie.css</span> + <a href="#" class="action-download" title="<?php echo $this->__('Download file'); ?>"> + <span><?php echo $this->__('Download file'); ?></span> + </a> + </li> + <li class="item"> + <span class="filename">style.css</span> + <a href="#" class="action-download" title="<?php echo $this->__('Download file'); ?>"> + <span><?php echo $this->__('Download file'); ?></span> + </a> + </li> + </ul> + </div> + </div> + + <div class="files-list"> + <div class="files-list-header"> + <h5 class="title">Title of Group</h5> + <a href="#vde-tab-custom" class="action-add" data-toggle="tab" title="<?php echo $this->__('Add Custom'); ?>"> + <span><?php echo $this->__('Add Custom'); ?></span> + </a> + </div> + <div class="files-list-content"> + <ul class="items"> + <li class="item"> + <span class="filename">print.css</span> + <a href="#" class="action-download" title="<?php echo $this->__('Download file'); ?>"> + <span><?php echo $this->__('Download file'); ?></span> + </a> + </li> + <li class="item"> + <span class="filename">styles-ie.css</span> + <a href="#" class="action-download" title="<?php echo $this->__('Download file'); ?>"> + <span><?php echo $this->__('Download file'); ?></span> + </a> + </li> + </ul> + </div> + </div> + + <div class="files-list"> + <div class="files-list-header"> + <h5 class="title">Title of Group</h5> + <a href="#vde-tab-custom" class="action-add" data-toggle="tab" title="<?php echo $this->__('Add Custom'); ?>"> + <span><?php echo $this->__('Add Custom'); ?></span> + </a> + </div> + <div class="files-list-content"> + <ul class="items"> + <li class="item"> + <span class="filename">print.css</span> + <a href="#" class="action-download" title="<?php echo $this->__('Download file'); ?>"> + <span><?php echo $this->__('Download file'); ?></span> + </a> + </li> + <li class="item"> + <span class="filename">styles-ie.css</span> + <a href="#" class="action-download" title="<?php echo $this->__('Download file'); ?>"> + <span><?php echo $this->__('Download file'); ?></span> + </a> + </li> + </ul> + </div> + </div> + + <div class="files-list"> + <div class="files-list-header"> + <h5 class="title">Title of Group</h5> + <a href="#vde-tab-custom" class="action-add" data-toggle="tab" title="<?php echo $this->__('Add Custom'); ?>"> + <span><?php echo $this->__('Add Custom'); ?></span> + </a> + </div> + <div class="files-list-content"> + <ul class="items"> + <li class="item"> + <span class="filename">print.css</span> + <a href="#" class="action-download" title="<?php echo $this->__('Download file'); ?>"> + <span><?php echo $this->__('Download file'); ?></span> + </a> + </li> + <li class="item"> + <span class="filename">styles-ie.css</span> + <a href="#" class="action-download" title="<?php echo $this->__('Download file'); ?>"> + <span><?php echo $this->__('Download file'); ?></span> + </a> + </li> + <li class="item"> + <span class="filename">style.css</span> + <a href="#" class="action-download" title="<?php echo $this->__('Download file'); ?>"> + <span><?php echo $this->__('Download file'); ?></span> + </a> + </li> + <li class="item"> + <span class="filename">widget.css</span> + <a href="#" class="action-download" title="<?php echo $this->__('Download file'); ?>"> + <span><?php echo $this->__('Download file'); ?></span> + </a> + </li> + <li class="item"> + <span class="filename">global_settings.css</span> + <a href="#" class="action-download" title="<?php echo $this->__('Download file'); ?>"> + <span><?php echo $this->__('Download file'); ?></span> + </a> + </li> + </ul> + </div> + </div> + + <div class="files-list"> + <div class="files-list-header"> + <h5 class="title">Title of Group</h5> + <a href="#vde-tab-custom" class="action-add" data-toggle="tab" title="<?php echo $this->__('Add Custom'); ?>"> + <span><?php echo $this->__('Add Custom'); ?></span> + </a> + </div> + <div class="files-list-content"> + <ul class="items"> + <li class="item"> + <span class="filename">print.css</span> + <a href="#" class="action-download" title="<?php echo $this->__('Download file'); ?>"> + <span><?php echo $this->__('Download file'); ?></span> + </a> + </li> + <li class="item"> + <span class="filename">styles-ie.css</span> + <a href="#" class="action-download" title="<?php echo $this->__('Download file'); ?>"> + <span><?php echo $this->__('Download file'); ?></span> + </a> + </li> + <li class="item"> + <span class="filename">style.css</span> + <a href="#" class="action-download" title="<?php echo $this->__('Download file'); ?>"> + <span><?php echo $this->__('Download file'); ?></span> + </a> + </li> + <li class="item"> + <span class="filename">widget.css</span> + <a href="#" class="action-download" title="<?php echo $this->__('Download file'); ?>"> + <span><?php echo $this->__('Download file'); ?></span> + </a> + </li> + <li class="item"> + <span class="filename">global_settings.css</span> + <a href="#" class="action-download" title="<?php echo $this->__('Download file'); ?>"> + <span><?php echo $this->__('Download file'); ?></span> + </a> + </li> + </ul> + </div> + </div> + + <div class="files-list"> + <div class="files-list-header"> + <h5 class="title">Title of Group</h5> + <a href="#vde-tab-custom" class="action-add" data-toggle="tab" title="<?php echo $this->__('Add Custom'); ?>"> + <span><?php echo $this->__('Add Custom'); ?></span> + </a> + </div> + <div class="files-list-content"> + <ul class="items"> + <li class="item"> + <span class="filename">print.css</span> + <a href="#" class="action-download" title="<?php echo $this->__('Download file'); ?>"> + <span><?php echo $this->__('Download file'); ?></span> + </a> + </li> + <li class="item"> + <span class="filename">styles-ie.css</span> + <a href="#" class="action-download" title="<?php echo $this->__('Download file'); ?>"> + <span><?php echo $this->__('Download file'); ?></span> + </a> + </li> + <li class="item"> + <span class="filename">style.css</span> + <a href="#" class="action-download" title="<?php echo $this->__('Download file'); ?>"> + <span><?php echo $this->__('Download file'); ?></span> + </a> + </li> + <li class="item"> + <span class="filename">widget.css</span> + <a href="#" class="action-download" title="<?php echo $this->__('Download file'); ?>"> + <span><?php echo $this->__('Download file'); ?></span> + </a> + </li> + <li class="item"> + <span class="filename">global_settings.css</span> + <a href="#" class="action-download" title="<?php echo $this->__('Download file'); ?>"> + <span><?php echo $this->__('Download file'); ?></span> + </a> + </li> + </ul> + </div> + </div> + </div> + </div> + <div class="tab-panel" id="vde-tab-js"> + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat nonproident, sunt in culpa qui officia deserunt mollit anim id est laborum. + </div> + <div class="tab-panel" id="vde-tab-custom"> + <div class="custom-code-description"> + <h5 class="title">Custom CSS</h5> + <p>Update the custom.css file to right in order to overwrite the default styles.</p> + <p>Or, replace, delete or download the file:</p> + <div class="custom-file"> + <span class="filename">custom.css</span> + + <button class="action-download" title="<?php echo $this->__('Download file'); ?>"> + <span><?php echo $this->__('Download file'); ?></span> + </button> + <button class="action-delete" title="<?php echo $this->__('Delete file'); ?>"> + <span><?php echo $this->__('Delete file'); ?></span> + </button> + + <form action="#" method="post"> + <input type="file" class="action-add" /> + </form> + </div> + </div> + <div class="custom-code"> + <form action="#" method="post"> + <div class="textarea-container"> + <textarea name="custom_code" id="custom_code" cols="30" rows="10">.files-list-header > .action-add { display: inline-block; float: right; margin: 6px 0 0 0; width: 16px; height: 16px; line-height: 16px; text-align: center; color: #000; background: #9f978b; border-radius: 4px; text-decoration: none; -moz-transition: background .5s ease; -webkit-transition: background .5s ease; transition: background .5s ease; }</textarea> + </div> + <button class="action-update" title="<?php echo $this->__('Update'); ?>"><?php echo $this->__('Update'); ?></button> + </form> + </div> + </div> + </div> + </div> + </div> + </div> + </div> + <footer class="vde-tools-footer"> + <div class="vde-tools-footer-inner"> + <div class="vde-tools-tabs"> + <ul class="vde-tab-controls"> + <li class="item item-design"> + <a href="#vde-tab-design" data-toggle="tab" title="<?php echo $this->__('Design'); ?>"> + <span><?php echo $this->__('Design'); ?></span> + </a> + </li> + <li class="item item-block"> + <a href="#vde-tab-block" data-toggle="tab" title="<?php echo $this->__('Block'); ?>"> + <span><?php echo $this->__('Block'); ?></span> + </a> + </li> + <li class="item item-settings"> + <a href="#vde-tab-settings" data-toggle="tab" title="<?php echo $this->__('Settings'); ?>"> + <span><?php echo $this->__('Settings'); ?></span> + </a> + </li> + <li class="item item-code"> + <a href="#vde-tab-code" data-toggle="tab" title="<?php echo $this->__('Code'); ?>"> + <span><?php echo $this->__('Code'); ?></span> + </a> + </li> + </ul> + </div> + </div> + </footer> +</section> + +<script type="text/javascript"> + (function($) { + 'use strict'; + + $.widget('vde.toolsPanel', { + options: { + openedPanelClass: 'opened', + activeTabClass: 'active', + panelDefaultHeight: 500, + showHidePanelAnimationSpeed: 300, + resizableArea: '.vde-tools-content', + resizableAreaInner: '.vde-tab-content.active .vde-tab-content-inner', + panelHeader: '.vde-tab-content-header', + panelTab: 'a[data-toggle="tab"]', + resizeHandlerControl: '.ui-resizable-handle', + resizeHandlerControlContainer: '.vde-tools-handler-container', + scrollExistClass: 'hasScroll', + mainTabs: '.vde-tools-footer .vde-tab-controls > .item', + btnClose: '.vde-tools-header .action-close' + }, + + _create: function() { + this.panel = this.element; + + this.resizableArea = $(this.options.resizableArea); + this.resizableAreaInner = $(this.options.resizableAreaInner); + this.panelTab = $(this.options.panelTab); + this.resizeHandlerControlContainer = $(this.options.resizeHandlerControlContainer); + this.panelHeaderHeight = $(this.options.panelHeader).height(); + this.btnClose = $(this.options.btnClose, this.panel); + this.mainTabs = $(this.options.mainTabs); + + this._events(); + }, + + _init: function() { + $(this.options.resizeHandlerControl).prependTo(this.resizeHandlerControlContainer); + this._recalcDataHeight(this._getResizableAreaHeight()); + }, + + _events: function() { + var self = this; + + this.resizableArea + .resizable({ + handles: 'n', + minHeight: 100, + maxHeight: 700, + resize: function(event, ui) { + self._recalcDataHeight(ui.size.height); + } + }).bind('resize.vdeToolsResize', function () { + self._recalcDataHeight(self._getResizableAreaHeight()); + $(this).css('top', 'auto'); + }); + + this.panelTab + .on('shown', function () { + if (!self.panel.hasClass(self.options.openedPanelClass)) { + self._show(); + } else { + self._recalcDataHeight(self.options.panelDefaultHeight); + } + self.resizableArea.trigger('resize.vdeToolsResize'); + }); + + this.btnClose + .on('click.hideVDEToolsPanel', $.proxy(this._hide, this)); + }, + + _toggleClassIfScrollBarExist: function(elem) { + elem.toggleClass(this.options.scrollExistClass, elem.get(0).scrollHeight > elem.height()); + }, + + _getActiveResizableAreaInner: function() { + return $(this.options.resizableAreaInner); + }, + + _getResizableAreaHeight: function() { + return this.resizableArea.height(); + }, + + _recalcDataHeight: function(height) { + var elem = this._getActiveResizableAreaInner(); + + elem.height(height - this.panelHeaderHeight); + this._toggleClassIfScrollBarExist(elem); + }, + + _show: function() { + var self = this; + + this.panel.addClass(this.options.openedPanelClass); + + this.resizableArea.animate({ + height: self.options.panelDefaultHeight - self.panelHeaderHeight + }, self.options.showHidePanelAnimationSpeed, function() { + self.resizableArea.trigger('resize.vdeToolsResize'); + }); + }, + + _hide: function() { + var self = this; + + this.resizableArea.animate({ + height: 0 + }, self.options.showHidePanelAnimationSpeed, function() { + self.panel + .removeClass(self.options.openedPanelClass); + + self.mainTabs + .removeClass(self.options.activeTabClass); + }); + } + }); + + $('.vde-tools').toolsPanel(); + + /* Activate "Scripts" tab */ + $('.vde-tools-footer .item-code > a').tab('show'); + + $('[class^="action-"][href="#vde-tab-custom"]') + .on('click.activateCustomCodeTab', function() { + $('.vde-tab-controls a[href="#vde-tab-custom"]').trigger('click'); + }); + + $('.action-edit[href="#vde-tab-custom"]') + .on('click.focusOnCustomCodeTextarea', function() { + $('#custom_code').focus(); + }); + + })(window.jQuery); +</script> \ No newline at end of file diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/theme/list/customized.phtml b/app/code/core/Mage/DesignEditor/view/adminhtml/theme/list/customized.phtml index 7c856c7fbea1ad30a778e241a1146b3fb8f547f7..6e9ddbfa250c46caba2d6f85ff77b42a5583af7b 100644 --- a/app/code/core/Mage/DesignEditor/view/adminhtml/theme/list/customized.phtml +++ b/app/code/core/Mage/DesignEditor/view/adminhtml/theme/list/customized.phtml @@ -26,9 +26,9 @@ ?> <?php /** @var $this Mage_DesignEditor_Block_Adminhtml_Theme_Selector_List_Abstract */?> -<div> +<div class="themes-customizations"> <h3><?php echo $this->getTabTitle() ?></h3> - <ul> + <ul class="themes"> <?php $themeItems = $this->getListItems(); ?> <?php if ($themeItems): ?> <?php echo join("\n", $themeItems) ?> diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/theme/selector/my_customizations_tab.phtml b/app/code/core/Mage/DesignEditor/view/adminhtml/theme/selector/my_customizations_tab.phtml index 81603a2281587c54b943384d296041176513272a..cfee0411bf936cddced4f0dcb8b51acffb940ef2 100644 --- a/app/code/core/Mage/DesignEditor/view/adminhtml/theme/selector/my_customizations_tab.phtml +++ b/app/code/core/Mage/DesignEditor/view/adminhtml/theme/selector/my_customizations_tab.phtml @@ -26,9 +26,8 @@ ?> <?php /** @var $this Mage_Backend_Block_Template */?> -<div><?php echo $this->getChildHtml('assigned.theme.list') ?></div> -<hr style="clear: both; margin-bottom: 40px;" /> -<div><?php echo $this->getChildHtml('unassigned.theme.list') ?></div> +<div class="themes-assigned"><?php echo $this->getChildHtml('assigned.theme.list') ?></div> +<div class="themes-unassigned"><?php echo $this->getChildHtml('unassigned.theme.list') ?></div> <script type="text/javascript"> <?php if ($this->getTabId()): ?> diff --git a/app/code/core/Mage/DesignEditor/view/adminhtml/theme/selector/storeview.phtml b/app/code/core/Mage/DesignEditor/view/adminhtml/theme/selector/storeview.phtml index 4ccf99c8f533fab79f30a4d1c2f8b8ebadb6fe7d..a56552bf1517cfc535e94265166392c36afe259c 100644 --- a/app/code/core/Mage/DesignEditor/view/adminhtml/theme/selector/storeview.phtml +++ b/app/code/core/Mage/DesignEditor/view/adminhtml/theme/selector/storeview.phtml @@ -27,54 +27,56 @@ <?php /** @var $this Mage_DesignEditor_Block_Adminhtml_Theme_Selector_StoreView */?> -<div style="position:absolute; z-index:500;"> - <div id="store-view-window" style="position:fixed; left:50%; margin-left:-355px; width:650px; top:15%; border:2px solid #555; background:#fff; display:none;"> - <div style="padding-top:10px; text-align:center; border-bottom:2px solid #555; background-color:#eee;"> - <h2><?php echo $this->__('Select Storeviews to make your changes live:') ?></h2> - </div> - <form method="post" action=""> - <ul class="websites"> - <?php foreach ($this->getWebsiteStructure() as $website => $stores): ?> - <li class="website"> - <p class="title" style="font-size:1.7em; color:#777; font-weight:bold; padding:15px 20px;"> - <?php echo $website; ?> - </p> - <ul class="stores"> - <?php foreach ($stores as $store => $storeViews): ?> - <li class="store"> - <p class="title" style="font-size:1.7em; color:#777; padding:15px 25px; border-top:2px solid #ccc; border-bottom:2px solid #ccc;"> - <?php echo $store; ?> - </p> - <ul class="storeviews"> - <?php foreach ($storeViews as $storeView => $id): ?> - <li class="storeview"> - <p class="title" style="font-size:1.7em; color:#777; padding:10px 40px;"> - <input type="hidden" name="storeviews[<?php echo $id; ?>]" value="0" /> - <input type="checkbox" id="storeview_<?php echo $id ?>" name="storeviews[<?php echo $id; ?>]" value="1" style="position:relative; top:-1px;" /> - <label for="storeview_<?php echo $id ?>" style="color:rgb(0,176,244); margin-left:5px;"> - <?php echo $storeView; ?> - </label> - </p> + +<div class="fade" id="store-view-window"> + <div class="popup"> + <header class="popup-header"> + <strong class="popup-title"><?php echo $this->__('Select Storeviews to make your changes live:') ?></strong> + </header> + <div class="popup-content"> + <form method="post" action=""> + <ul class="websites"> + <?php foreach ($this->getWebsiteStructure() as $website => $stores): ?> + <li class="website"> + <h3 class="website-title"><?php echo $website; ?></h3> + <ul class="stores"> + <?php foreach ($stores as $store => $storeViews): ?> + <li class="store"> + <h4 class="store-title"><?php echo $store; ?></h4> + <ul class="storeviews"> + <?php foreach ($storeViews as $storeView => $id): ?> + <li class="storeview"> + <input type="hidden" name="storeviews[<?php echo $id; ?>]" value="0" /> + <label for="storeview_<?php echo $id ?>"> + <input type="checkbox" id="storeview_<?php echo $id ?>" class="storeview-selector-control" name="storeviews[<?php echo $id; ?>]" value="1" /> + <span class="storeview-name"><?php echo $storeView; ?></span> + </label> + </li> + <?php endforeach; ?> + </ul> </li> - <?php endforeach; ?> + <?php endforeach; ?> </ul> </li> - <?php endforeach; ?> + <?php endforeach; ?> </ul> - </li> - <?php endforeach; ?> - </ul> - <div style="text-align:right; padding:10px;"> - <?php echo $this->getAssignSaveButtonHtml(); ?> + </form> </div> - </form> + <footer class="popup-footer"> + <div class="actions"> + <?php echo $this->getAssignSaveButtonHtml(); ?> + <span class="action-close" title="<?php echo $this->__('Close Popup') ?>"><?php echo $this->__('Close') ?></span> + </div> + </footer> + <span class="action-close-popup" data-dismiss="popup" title="<?php echo $this->__('Close Popup') ?>"><?php echo $this->__('Close Popup') ?></span> </div> </div> + <script type="text/javascript"> (function ($) { $( document ).ready(function( ) { $( 'body' ).themeSelector(<?php echo $this->getOptionsJson(); ?>); }); - $('.theme-element-customizations').themeControl({url: '<?php echo $this->getUrl('*/*/quickEdit') ?>'}); + $('.themes-customizations .theme').themeControl({url: '<?php echo $this->getUrl('*/*/quickEdit') ?>'}); })(jQuery); </script> diff --git a/app/code/core/Mage/Directory/view/adminhtml/js/optional_zip_countries.phtml b/app/code/core/Mage/Directory/view/adminhtml/js/optional_zip_countries.phtml index 2ec1f699f21816781de7b25501a8e01d11b4b9ce..bb7643f38ba0c45fa6c7ce6f83109fcf8eff7dbc 100644 --- a/app/code/core/Mage/Directory/view/adminhtml/js/optional_zip_countries.phtml +++ b/app/code/core/Mage/Directory/view/adminhtml/js/optional_zip_countries.phtml @@ -54,10 +54,10 @@ function setPostcodeOptional(zipElement, country) { while (zipElement.hasClassName('required-entry')) { zipElement.removeClassName('required-entry'); } - zipElement.up(1).down('label > span.required').hide(); + zipElement.up('div.field').removeClassName('required'); } else { zipElement.addClassName('required-entry'); - zipElement.up(1).down('label > span.required').show(); + zipElement.up('div.field').addClassName('required'); } } diff --git a/app/code/core/Mage/Downloadable/Block/Adminhtml/Catalog/Product/Edit/Tab/Downloadable/Links.php b/app/code/core/Mage/Downloadable/Block/Adminhtml/Catalog/Product/Edit/Tab/Downloadable/Links.php index d9ebf8ef1902fbdba89250a434bc0ba17cd995d4..2b69a9385e4f85c4d5455b8d33b39eb917e7f806 100644 --- a/app/code/core/Mage/Downloadable/Block/Adminhtml/Catalog/Product/Edit/Tab/Downloadable/Links.php +++ b/app/code/core/Mage/Downloadable/Block/Adminhtml/Catalog/Product/Edit/Tab/Downloadable/Links.php @@ -96,7 +96,7 @@ class Mage_Downloadable_Block_Adminhtml_Catalog_Product_Edit_Tab_Downloadable_Li */ public function getPurchasedSeparatelySelect() { - $select = $this->getLayout()->createBlock('Mage_Core_Block_Html_Select') + $select = $this->getLayout()->createBlock('Mage_Adminhtml_Block_Html_Select') ->setName('product[links_purchased_separately]') ->setId('downloadable_link_purchase_type') ->setOptions(Mage::getSingleton('Mage_Backend_Model_Config_Source_Yesno')->toOptionArray()) diff --git a/app/code/core/Mage/Downloadable/view/adminhtml/product/edit/downloadable/links.phtml b/app/code/core/Mage/Downloadable/view/adminhtml/product/edit/downloadable/links.phtml index d198bfb1f76ef6b4d93a762f98c7230d735c6f06..5878d7e7e5fe0029e13c98f444079384b6ac973d 100644 --- a/app/code/core/Mage/Downloadable/view/adminhtml/product/edit/downloadable/links.phtml +++ b/app/code/core/Mage/Downloadable/view/adminhtml/product/edit/downloadable/links.phtml @@ -32,78 +32,60 @@ ?> <?php $_product = $this->getProduct()?> <?php $this->getConfigJson() ?> -<div class="fieldset"> -<table cellspacing="0" class="form-list"> - <tbody> - <tr class="headings"> - <td class="label"><label for="name"><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('Title')?></label> - </td> - <td class="value"> - <input type="text" class="input-text" id="downloadable_links_title" name="product[links_title]" value="<?php echo $this->getLinksTitle() ?>" <?php echo ($_product->getStoreId() && $this->getUsedDefault())?'disabled="disabled"':'' ?> /> - </td> - <td class="scope-label"><?php echo !Mage::app()->isSingleStoreMode() ? Mage::helper('Mage_Adminhtml_Helper_Data')->__('[STORE VIEW]') : ''; ?></td> - <td class="value use-default"> +<div class="form-inline"> + <div class="field"> + <label class="label" for="name"><span><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('Title')?></span></label> + <div class="control"> + <input type="text" class="input-text" id="downloadable_links_title" name="product[links_title]" value="<?php echo $this->getLinksTitle() ?>" <?php echo ($_product->getStoreId() && $this->getUsedDefault())?'disabled="disabled"':'' ?>> <?php if($_product->getStoreId()): ?> <input id="link_title_default" type="checkbox" name="use_default[]" value="links_title" onclick="toggleValueElements(this, this.parentNode.parentNode)" <?php echo $this->getUsedDefault()?'checked="checked"':'' ?> /> <label class="normal" for="link_title_default"><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('Use Default Value'); ?></label> <?php endif; ?> - </td> - </tr> - </tbody> -</table> -<br /> -<table cellspacing="0" class="form-list"> - <tbody> - <tr class="headings"> - <td class="label"><label for="name"><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('Links can be purchased separately')?></label> - </td> - <td class="value"> - <?php echo $this->getPurchasedSeparatelySelect()?> - </td> - <td class="scope-label"><?php echo !Mage::app()->isSingleStoreMode() ? Mage::helper('Mage_Adminhtml_Helper_Data')->__('[GLOBAL]') : ''; ?></td> - <td><small> </small></td> - </tr> - </tbody> -</table> -<br /> -<div class="grid"> -<div class="hor-scroll"> -<table cellspacing="0" class="data border"> - <col width="33%" /> - <col /> - <col /> - <col /> - <col width="1" /> - <col width="1" /> - <col width="1" /> - <col width="1" /> - <thead> - <tr class="headings"> - <th><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('Title')?> <span class="required">*</span></th> - <?php if ($this->getCanReadPrice() !== false) : ?> - <th><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('Price')?></th> - <?php endif; ?> - <th><span class="nobr"><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('Max. Downloads')?></span></th> - <th><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('Shareable')?></th> - <th><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('Sample')?></th> - <th><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('File')?></th> - <th><span class="nobr"><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('Sort Order')?></span></th> - <th> </th> - </tr> - </thead> - <tfoot> - <tr> - <td colspan="8" class="a-right"><?php echo $this->getAddButtonHtml()?></td> - </tr> - </tfoot> - <tbody id="link_items_body"> - </tbody> -</table> + </div> + <div class="field-service"> + <?php echo !Mage::app()->isSingleStoreMode() ? Mage::helper('Mage_Adminhtml_Helper_Data')->__('[STORE VIEW]') : ''; ?> + </div> + </div> + + <div class="field"> + <label class="label" for="name"><span><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('Links can be purchased separately')?></span></label> + <div class="control"> + <?php echo $this->getPurchasedSeparatelySelect()?> + </div> + <div class="field-service"> + <?php echo !Mage::app()->isSingleStoreMode() ? Mage::helper('Mage_Adminhtml_Helper_Data')->__('[GLOBAL]') : ''; ?> + </div> + </div> + + + <table cellspacing="0" class="data-table"> + <thead> + <tr> + <th><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('Title')?> <span class="required">*</span></th> + <?php if ($this->getCanReadPrice() !== false) : ?> + <th><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('Price')?></th> + <?php endif; ?> + <th><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('Max. Downloads')?></th> + <th><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('Shareable')?></th> + <th><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('Sample')?></th> + <th><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('File')?></th> + <th><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('Sort Order')?></th> + <th class="col-delete"> </th> + </tr> + </thead> + <tfoot> + <tr> + <td colspan="8" class="a-right"><?php echo $this->getAddButtonHtml()?></td> + </tr> + </tfoot> + <tbody id="link_items_body"> + </tbody> + </table> + <div><small><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('Alphanumeric, dash and underscore characters are recommended for filenames. Improper characters are replaced with \'_\'.')?></small></div> -</div> -</div> -</div> + +</div> <script type="text/javascript"> //<![CDATA[ var linkTemplate = '<tr>'+ @@ -129,7 +111,7 @@ var linkTemplate = '<tr>'+ <?php endif; ?> '<td><input type="text" id="downloadable_link_{{id}}_downloads" name="downloadable[link][{{id}}][number_of_downloads]" class="input-text downloads" value="{{number_of_downloads}}" />'+ '<p><input type="checkbox" class="checkbox" id="downloadable_link_{{id}}_is_unlimited" name="downloadable[link][{{id}}][is_unlimited]" value="1" {{is_unlimited}} /> <label for="downloadable_link_{{id}}_is_unlimited">Unlimited</label></p></td>'+ - '<td class="a-center">'+ + '<td>'+ '<select id="downloadable_link _{{id}}_shareable" name="downloadable[link][{{id}}][is_shareable]">'+ '<option value="1">Yes</option>'+ '<option value="0">No</option>'+ @@ -192,9 +174,9 @@ var linkTemplate = '<tr>'+ '</div>'+ '</div>'+ '</td>'+ - '<td class="a-center"><input type="text" name="downloadable[link][{{id}}][sort_order]" value="{{sort_order}}" class="input-text sort" /></td>'+ - '<td>'+ - '<button id="downloadable_link_{{id}}_delete_button" type="button" class="scalable delete icon-btn delete-link-item"><span><span><span><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('Delete'); ?></span></span></span></button>'+ + '<td><input type="text" name="downloadable[link][{{id}}][sort_order]" value="{{sort_order}}" class="input-text sort" /></td>'+ + '<td class="col-delete">'+ + '<button id="downloadable_link_{{id}}_delete_button" type="button" class="action- scalable delete delete-link-item"><span><span><span><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('Delete'); ?></span></span></span></button>'+ '</td>'+ '</tr>'; diff --git a/app/code/core/Mage/Downloadable/view/adminhtml/product/edit/downloadable/samples.phtml b/app/code/core/Mage/Downloadable/view/adminhtml/product/edit/downloadable/samples.phtml index a1aafe8b27ebc8f4365be0435d4c27320b3eef2f..0167559c1c704dba0311211f00305c9bf5e940b3 100644 --- a/app/code/core/Mage/Downloadable/view/adminhtml/product/edit/downloadable/samples.phtml +++ b/app/code/core/Mage/Downloadable/view/adminhtml/product/edit/downloadable/samples.phtml @@ -32,52 +32,40 @@ $_product = $this->getProduct(); $this->getConfigJson(); ?> -<div class="fieldset"> - <table cellspacing="0" class="form-list"> - <tbody> - <tr class="headings"> - <td class="label"><label for="name"><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('Title')?></label> - </td> - <td class="value"> - <input type="text" class="input-text" name="product[samples_title]" value="<?php echo $this->getSamplesTitle() ?>" <?php echo ($_product->getStoreId() && $this->getUsedDefault())?'disabled="disabled"':'' ?> /> - </td> - <td class="scope-label"><?php echo !Mage::app()->isSingleStoreMode() ? Mage::helper('Mage_Adminhtml_Helper_Data')->__('[STORE VIEW]') : ''; ?></td> - <td class="value use-default"> - <?php if($_product->getStoreId()): ?> - <input id="sample_title_default" type="checkbox" name="use_default[]" value="samples_title" onclick="toggleValueElements(this, this.parentNode.parentNode)" <?php echo $this->getUsedDefault()?'checked="checked"':'' ?> /> - <label class="normal" for="sample_title_default">Use Default Value</label> - <?php endif; ?> - </td> +<div class="form-inline"> + <div class="field"> + <label class="label" for="name"><span><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('Title')?></span></label> + <div class="control"> + <input type="text" class="input-text" name="product[samples_title]" value="<?php echo $this->getSamplesTitle() ?>" <?php echo ($_product->getStoreId() && $this->getUsedDefault())?'disabled="disabled"':'' ?>> + <?php if($_product->getStoreId()): ?> + <input id="sample_title_default" type="checkbox" name="use_default[]" value="samples_title" onclick="toggleValueElements(this, this.parentNode.parentNode)" <?php echo $this->getUsedDefault()?'checked="checked"':'' ?> /> + <label class="normal" for="sample_title_default">Use Default Value</label> + <?php endif; ?> + </div> + <div class="field-service"> + <?php echo !Mage::app()->isSingleStoreMode() ? Mage::helper('Mage_Adminhtml_Helper_Data')->__('[STORE VIEW]') : ''; ?> + </div> + </div> + + <table cellspacing="0" class="data-table"> + <thead> + <tr> + <th><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('Title') ?> <span class="required">*</span></th> + <th><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('File') ?></th> + <th><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('Sort Order') ?></th> + <th class="col-delete"> </th> + </tr> + </thead> + <tfoot> + <tr> + <td colspan="4" class="a-right"><?php echo $this->getAddButtonHtml() ?></td> </tr> + </tfoot> + <tbody id="sample_items_body"> </tbody> </table> - <br /> - <div class="grid"> - <div class="hor-scroll"> - <table cellspacing="0" class="data border"> - <col /> - <col width="1" /> - <col width="1" /> - <col width="1" /> - <thead> - <tr class="headings"> - <th><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('Title') ?> <span class="required">*</span></th> - <th><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('File') ?></th> - <th><span class="nobr"><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('Sort Order') ?></span></th> - <th> </th> - </tr> - </thead> - <tfoot> - <tr> - <td colspan="4" class="a-right"><?php echo $this->getAddButtonHtml() ?></td> - </tr> - </tfoot> - <tbody id="sample_items_body"> - </tbody> - </table> - <div><small><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('Alphanumeric, dash and underscore characters are recommended for filenames. Improper characters are replaced with \'_\'.')?></small></div> - </div> - </div> + + <div><small><?php echo Mage::helper('Mage_Downloadable_Helper_Data')->__('Alphanumeric, dash and underscore characters are recommended for filenames. Improper characters are replaced with \'_\'.')?></small></div> </div> <script type="text/javascript"> //<![CDATA[> @@ -117,9 +105,9 @@ var sampleTemplate = '<tr>'+ '</div>'+ '</td>'+ - '<td class="a-center"><input type="text" name="downloadable[sample][{{id}}][sort_order]" value="{{sort_order}}" class="input-text sort" /></td>'+ - '<td>'+ - '<button type="button" class="scalable delete icon-btn delete-sample-item"><span><span><span>Delete</span></span></span></button>'+ + '<td><input type="text" name="downloadable[sample][{{id}}][sort_order]" value="{{sort_order}}" class="input-text sort" /></td>'+ + '<td class="col-delete">'+ + '<button type="button" class="action- scalable delete icon-btn delete-sample-item"><span>Delete</span></button>'+ '</td>'+ '</tr>'; var sampleItems = { diff --git a/app/code/core/Mage/Eav/Model/Validator/Attribute/Backend.php b/app/code/core/Mage/Eav/Model/Validator/Attribute/Backend.php index 1ad02e04156c568ed513169c87aa0e7c254c3e3f..c406d1fda40e1e00dded68f7d45f3fb20907579d 100644 --- a/app/code/core/Mage/Eav/Model/Validator/Attribute/Backend.php +++ b/app/code/core/Mage/Eav/Model/Validator/Attribute/Backend.php @@ -33,11 +33,6 @@ */ class Mage_Eav_Model_Validator_Attribute_Backend extends Magento_Validator_ValidatorAbstract { - /** - * @var array - */ - protected $_messages; - /** * Returns true if and only if $value meets the validation requirements. * @@ -79,14 +74,4 @@ class Mage_Eav_Model_Validator_Attribute_Backend extends Magento_Validator_Valid } return 0 == count($this->_messages); } - - /** - * Returns an array of messages that explain why the most recent isValid() call returned false. - * - * @return array - */ - public function getMessages() - { - return $this->_messages; - } } diff --git a/app/code/core/Mage/Eav/Model/Validator/Attribute/Data.php b/app/code/core/Mage/Eav/Model/Validator/Attribute/Data.php index b6b4527ec566912f6c443a083ac8d94a3ee7df5c..28e0e335365b75fc51cca4189cd9181100117d36 100644 --- a/app/code/core/Mage/Eav/Model/Validator/Attribute/Data.php +++ b/app/code/core/Mage/Eav/Model/Validator/Attribute/Data.php @@ -33,11 +33,6 @@ */ class Mage_Eav_Model_Validator_Attribute_Data extends Magento_Validator_ValidatorAbstract { - /** - * @var array - */ - protected $_messages = array(); - /** * @var array */ @@ -235,14 +230,4 @@ class Mage_Eav_Model_Validator_Attribute_Data extends Magento_Validator_Validato $this->_messages[$code] = array_merge($this->_messages[$code], $messages); } } - - /** - * Get validation messages - * - * @return array - */ - public function getMessages() - { - return $this->_messages; - } } diff --git a/app/code/core/Mage/GoogleShopping/Block/Adminhtml/Types.php b/app/code/core/Mage/GoogleShopping/Block/Adminhtml/Types.php index 81404afa2d8578e6d0f48888923b6f9ba2982aae..6e70b57f4046174d7f3df55139e44675e4219f92 100644 --- a/app/code/core/Mage/GoogleShopping/Block/Adminhtml/Types.php +++ b/app/code/core/Mage/GoogleShopping/Block/Adminhtml/Types.php @@ -31,8 +31,7 @@ * @package Mage_GoogleShopping * @author Magento Core Team <core@magentocommerce.com> */ - -class Mage_GoogleShopping_Block_Adminhtml_Types extends Mage_Adminhtml_Block_Widget_Grid_Container +class Mage_GoogleShopping_Block_Adminhtml_Types extends Mage_Backend_Block_Widget_Grid_Container { protected function _construct() { diff --git a/app/code/core/Mage/GoogleShopping/Block/Adminhtml/Types/Edit/Attributes.php b/app/code/core/Mage/GoogleShopping/Block/Adminhtml/Types/Edit/Attributes.php index ead66fc53bf0692883f6456894369b8d6ab749d4..88033575fa80a3f8e63e6a06b76068af98ca848e 100644 --- a/app/code/core/Mage/GoogleShopping/Block/Adminhtml/Types/Edit/Attributes.php +++ b/app/code/core/Mage/GoogleShopping/Block/Adminhtml/Types/Edit/Attributes.php @@ -124,7 +124,7 @@ class Mage_GoogleShopping_Block_Adminhtml_Types_Edit_Attributes */ public function getAttributesSelectHtml($escapeJsQuotes = false) { - $select = $this->getLayout()->createBlock('Mage_Core_Block_Html_Select') + $select = $this->getLayout()->createBlock('Mage_Adminhtml_Block_Html_Select') ->setId($this->getFieldId().'_{{index}}_attribute') ->setName($this->getFieldName().'[{{index}}][attribute_id]') ->setOptions($this->_getAttributes($this->getAttributeSetId(), $escapeJsQuotes)); diff --git a/app/code/core/Mage/GoogleShopping/Block/Adminhtml/Types/Grid.php b/app/code/core/Mage/GoogleShopping/Block/Adminhtml/Types/Grid.php deleted file mode 100644 index 7bb33eb7dd5d999deff7c70d64640c0248855fee..0000000000000000000000000000000000000000 --- a/app/code/core/Mage/GoogleShopping/Block/Adminhtml/Types/Grid.php +++ /dev/null @@ -1,110 +0,0 @@ -<?php -/** - * Magento - * - * NOTICE OF LICENSE - * - * This source file is subject to the Open Software License (OSL 3.0) - * that is bundled with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://opensource.org/licenses/osl-3.0.php - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@magentocommerce.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade Magento to newer - * versions in the future. If you wish to customize Magento for your - * needs please refer to http://www.magentocommerce.com for more information. - * - * @category Mage - * @package Mage_GoogleShopping - * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) - * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) - */ - -/** - * Adminhtml Google Content Item Types Mapping grid - * - * @category Mage - * @package Mage_GoogleShopping - * @author Magento Core Team <core@magentocommerce.com> - */ -class Mage_GoogleShopping_Block_Adminhtml_Types_Grid extends Mage_Adminhtml_Block_Widget_Grid -{ - protected function _construct() - { - parent::_construct(); - $this->setId('types_grid'); - $this->setSaveParametersInSession(true); - $this->setUseAjax(true); - } - - /** - * Prepare grid collection object - * - * @return Mage_GoogleShopping_Block_Adminhtml_Types_Grid - */ - protected function _prepareCollection() - { - $collection = Mage::getResourceModel('Mage_GoogleShopping_Model_Resource_Type_Collection')->addItemsCount(); - $this->setCollection($collection); - parent::_prepareCollection(); - return $this; - } - - /** - * Prepare grid colunms - * - * @return Mage_GoogleShopping_Block_Adminhtml_Types_Grid - */ - protected function _prepareColumns() - { - $this->addColumn('attribute_set_name', - array( - 'header' => $this->__('Attributes Set'), - 'index' => 'attribute_set_name', - )); - - $this->addColumn('target_country', - array( - 'header' => $this->__('Target Country'), - 'width' => '150px', - 'index' => 'target_country', - 'renderer' => 'Mage_GoogleShopping_Block_Adminhtml_Types_Renderer_Country', - 'filter' => false - )); - - $this->addColumn('items_total', - array( - 'header' => Mage::helper('Mage_Catalog_Helper_Data')->__('Total Qty Content Items'), - 'width' => '150px', - 'index' => 'items_total', - 'filter' => false - )); - - return parent::_prepareColumns(); - } - - /** - * Return row url for js event handlers - * - * @param Varien_Object - * @return string - */ - public function getRowUrl($row) - { - return $this->getUrl('*/*/edit', array('id'=>$row->getId(), '_current'=>true)); - } - - /** - * Grid url getter - * - * @return string current grid url - */ - public function getGridUrl() - { - return $this->getUrl('*/*/grid', array('_current'=>true)); - } -} diff --git a/app/code/core/Mage/GoogleShopping/Model/Resource/Grid/Collection.php b/app/code/core/Mage/GoogleShopping/Model/Resource/Grid/Collection.php new file mode 100644 index 0000000000000000000000000000000000000000..f6c0e5c72656ed4f5f73421f8440820fa06d67ba --- /dev/null +++ b/app/code/core/Mage/GoogleShopping/Model/Resource/Grid/Collection.php @@ -0,0 +1,47 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_GoogleShopping + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * GoogleShopping Types collection + * + * @category Mage + * @package Mage_GoogleShopping + * @author Magento Core Team <core@magentocommerce.com> + */ +class Mage_GoogleShopping_Model_Resource_Grid_Collection extends Mage_GoogleShopping_Model_Resource_Type_Collection +{ + /** + * Add total count of Items for each type + * + * @return Mage_GoogleShopping_Model_Resource_Grid_Collection|Mage_GoogleShopping_Model_Resource_Type_Collection + */ + protected function _initSelect() + { + parent::_initSelect(); + $this->addItemsCount(); + return $this; + } +} diff --git a/app/code/core/Mage/GoogleShopping/controllers/Adminhtml/Googleshopping/TypesController.php b/app/code/core/Mage/GoogleShopping/controllers/Adminhtml/Googleshopping/TypesController.php index fdae4a4ded61bbb2aed9a51fa7a967d7790764b4..bb2c11c93c4d8a5b127ed5dfc5a1e98dd898fdce 100644 --- a/app/code/core/Mage/GoogleShopping/controllers/Adminhtml/Googleshopping/TypesController.php +++ b/app/code/core/Mage/GoogleShopping/controllers/Adminhtml/Googleshopping/TypesController.php @@ -90,7 +90,6 @@ class Mage_GoogleShopping_Adminhtml_Googleshopping_TypesController extends Mage_ $this->_initAction() ->_addBreadcrumb(Mage::helper('Mage_GoogleShopping_Helper_Data')->__('Attribute Maps'), Mage::helper('Mage_GoogleShopping_Helper_Data')->__('Attribute Maps')) - ->_addContent($this->getLayout()->createBlock('Mage_GoogleShopping_Block_Adminhtml_Types')) ->renderLayout(); } @@ -99,9 +98,8 @@ class Mage_GoogleShopping_Adminhtml_Googleshopping_TypesController extends Mage_ */ public function gridAction() { - $this->getResponse()->setBody( - $this->getLayout()->createBlock('Mage_GoogleShopping_Block_Adminhtml_Types_Grid')->toHtml() - ); + $this->loadLayout('false'); + $this->renderLayout(); } /** diff --git a/app/code/core/Mage/GoogleShopping/view/adminhtml/layout.xml b/app/code/core/Mage/GoogleShopping/view/adminhtml/layout.xml index 480c4757a2407a37ed2455d669ffe2e5238a5210..38128fee5b666302a575ae7afada371d43ba0f5a 100644 --- a/app/code/core/Mage/GoogleShopping/view/adminhtml/layout.xml +++ b/app/code/core/Mage/GoogleShopping/view/adminhtml/layout.xml @@ -32,4 +32,74 @@ <action method="addJs"><file>Mage_GoogleShopping::googleshopping.js</file></action> </reference> </adminhtml_googleshopping_items_index> + + <adminhtml_googleshopping_types_index> + <update handle="formkey"/> + <update handle="adminhtml_googleshopping_types_block"/> + <reference name="content"> + <block type="Mage_GoogleShopping_Block_Adminhtml_Types" name="googleshopping.types.container" /> + </reference> + </adminhtml_googleshopping_types_index> + + <adminhtml_googleshopping_types_grid> + <update handle="formkey"/> + <update handle="adminhtml_googleshopping_types_block"/> + <container label="Mage GoogleShopping Block Types Container" name="googleshopping.types.container" output="1" /> + </adminhtml_googleshopping_types_grid> + + <adminhtml_googleshopping_types_block> + <reference name="googleshopping.types.container"> + <block type="Mage_Backend_Block_Widget_Grid" name="adminhtml.googleshopping.types.grid" as="grid"> + <arguments> + <id>types_grid</id> + <dataSource type="object">Mage_GoogleShopping_Model_Resource_Grid_Collection</dataSource> + <save_parameters_in_session>1</save_parameters_in_session> + <use_ajax>1</use_ajax> + <grid_url type="url"> + <path>*/*/grid</path> + <params> + <_current>1</_current> + </params> + </grid_url> + </arguments> + <block type="Mage_Backend_Block_Widget_Grid_ColumnSet" as="grid.columnSet" name="googleshopping.types.grid.columnSet"> + <arguments> + <id>types_grid</id> + <rowUrl> + <path>*/*/edit</path> + <params> + <_current>1</_current> + </params> + <extraParamsTemplate> + <id>getId</id> + </extraParamsTemplate> + </rowUrl> + </arguments> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="attribute_set_name"> + <arguments> + <header translate="true" module="Mage_GoogleShopping">Attributes Set</header> + <index>attribute_set_name</index> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="target_country"> + <arguments> + <header translate="true" module="Mage_GoogleShopping">Target Country</header> + <index>target_country</index> + <width>150px</width> + <renderer>Mage_GoogleShopping_Block_Adminhtml_Types_Renderer_Country</renderer> + <filter>0</filter> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="items_total"> + <arguments> + <header translate="true" module="Mage_Catalog">Total Qty Content Items</header> + <index>items_total</index> + <width>150px</width> + <filter>0</filter> + </arguments> + </block> + </block> + </block> + </reference> + </adminhtml_googleshopping_types_block> </layout> diff --git a/app/code/core/Mage/ImportExport/view/adminhtml/busy.phtml b/app/code/core/Mage/ImportExport/view/adminhtml/busy.phtml index 3ac7d0abe1b4cb6ec75fd6953ff37364c641aade..8a60aa0a5cb8ecce7fb124be30d95b5526e63b3f 100644 --- a/app/code/core/Mage/ImportExport/view/adminhtml/busy.phtml +++ b/app/code/core/Mage/ImportExport/view/adminhtml/busy.phtml @@ -24,9 +24,6 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> - <h3><?php echo $this->__('System busy'); ?></h3> -</div> <div class="entry-edit"> <div class="entry-edit-head"> <h4><?php echo $this->__('Status'); ?></h4> diff --git a/app/code/core/Mage/Index/view/adminhtml/notifications.phtml b/app/code/core/Mage/Index/view/adminhtml/notifications.phtml index 7dad411f83d283334082caa22471bebdab86ffcf..da109a6705a27622ef0198f866fe4671053245b6 100644 --- a/app/code/core/Mage/Index/view/adminhtml/notifications.phtml +++ b/app/code/core/Mage/Index/view/adminhtml/notifications.phtml @@ -26,9 +26,13 @@ ?> <?php $_processes = $this->getProcessesForReindex()?> <?php if($_processes):?> -<div class="notification-global"> - <strong><?php echo $this->helper('Mage_Index_Helper_Data')->__('One or more of the Indexes are not up to date:') ?></strong> - <?php echo implode(', ', $_processes)?>. - <?php echo $this->helper('Mage_Index_Helper_Data')->__('Click here to go to <a href="%s">Index Management</a> and rebuild required indexes.', $this->getManageUrl());?> +<div class="message message-system"> + <div class="message-inner"> + <div class="message-content"> + <strong><?php echo $this->helper('Mage_Index_Helper_Data')->__('One or more of the Indexes are not up to date:') ?></strong> + <?php echo implode(', ', $_processes)?>. + <?php echo $this->helper('Mage_Index_Helper_Data')->__('Click here to go to <a href="%s">Index Management</a> and rebuild required indexes.', $this->getManageUrl());?> + </div> + </div> </div> <?php endif;?> diff --git a/app/code/core/Mage/Install/Controller/Action.php b/app/code/core/Mage/Install/Controller/Action.php index fafe41b9b8344bbd19637b7265bf21e55bea8a9c..6094000a7d1ec09279185a5aa21164ec9fa4ac48 100644 --- a/app/code/core/Mage/Install/Controller/Action.php +++ b/app/code/core/Mage/Install/Controller/Action.php @@ -35,20 +35,39 @@ class Mage_Install_Controller_Action extends Mage_Core_Controller_Varien_Action $this->setFlag('', self::FLAG_NO_CHECK_INSTALLATION, true); } + /** + * Initialize area and design + * + * @return Mage_Install_Controller_Action + */ + protected function _initDesign() + { + $areaCode = $this->getLayout()->getArea(); + $area = Mage::app()->getArea($areaCode); + $area->load(Mage_Core_Model_App_Area::PART_CONFIG) + ->load(Mage_Core_Model_App_Area::PART_EVENTS); + $this->_initDefaultTheme($areaCode); + $area->detectDesign($this->getRequest()); + $area->load(Mage_Core_Model_App_Area::PART_TRANSLATE); + return $this; + } + /** * Initialize theme * + * @param string $areaCode * @return Mage_Install_Controller_Action */ - protected function _initDefaultTheme() + protected function _initDefaultTheme($areaCode) { - $design = Mage::getDesign(); + /** @var $design Mage_Core_Model_Design_Package */ + $design = Mage::getObjectManager()->get('Mage_Core_Model_Design_Package'); /** @var $themesCollection Mage_Core_Model_Theme_Collection */ - $themesCollection = Mage::getModel('Mage_Core_Model_Theme_Collection'); - $themeModel = $themesCollection->addDefaultPattern($design->getArea()) - ->addFilter('theme_path', $design->getConfigurationDesignTheme($design->getArea(), array('useId' => false))) + $themesCollection = Mage::getObjectManager()->create('Mage_Core_Model_Theme_Collection'); + $themeModel = $themesCollection->addDefaultPattern($areaCode) + ->addFilter('theme_path', $design->getConfigurationDesignTheme($areaCode)) ->getFirstItem(); - $design->setDesignTheme($themeModel); + $design->setArea($areaCode)->setDesignTheme($themeModel); return $this; } } diff --git a/app/code/core/Mage/Install/Model/Installer.php b/app/code/core/Mage/Install/Model/Installer.php index 3a39c9e8eb8d5bb9b28200efc359e3ee126475a0..2e9c96e6238c4380db77f8b31f5716fd0e4ef181 100644 --- a/app/code/core/Mage/Install/Model/Installer.php +++ b/app/code/core/Mage/Install/Model/Installer.php @@ -236,101 +236,52 @@ class Mage_Install_Model_Installer extends Varien_Object } /** - * Prepare admin user data in model and validate it. - * Returns TRUE or array of error messages. + * Create an admin user * * @param array $data - * @return mixed - */ - public function validateAndPrepareAdministrator($data) - { - $user = Mage::getModel('Mage_User_Model_User') - ->load($data['username'], 'username'); - $user->addData($data); - - $result = $user->validate(); - if (is_array($result)) { - foreach ($result as $error) { - $this->getDataModel()->addError($error); - } - return $result; - } - return $user; - } - - /** - * Create admin user. - * Paramater can be prepared user model or array of data. - * Returns TRUE or throws exception. - * - * @param mixed $data - * @return bool */ public function createAdministrator($data) { - $user = Mage::getModel('Mage_User_Model_User') - ->load('admin', 'username'); - if ($user && $user->getPassword() == '4297f44b13955235245b2497399d7a93') { - $user->delete(); - } - - //to support old logic checking if real data was passed - if (is_array($data)) { - $data = $this->validateAndPrepareAdministrator($data); - if (is_array($data)) { - throw new Exception(Mage::helper('Mage_Install_Helper_Data')->__('Please correct the user data and try again.')); - } - } - - //run time flag to force saving entered password - $data->setForceNewPassword(true) + /** @var $user Mage_User_Model_User */ + $user = Mage::getModel('Mage_User_Model_User'); + $user->loadByUsername($data['username']); + $user->addData($data) + ->setForceNewPassword(true) // run-time flag to force saving of the entered password ->setRoleId(1) ->save(); - - return true; } /** - * Validating encryption key. - * Returns TRUE or array of error messages. + * Install encryption key into the application, generate and return a random one, if no value is specified * - * @param $key - * @return unknown_type + * @param string $key + * @return Mage_Install_Model_Installer */ - public function validateEncryptionKey($key) + public function installEncryptionKey($key) { - $errors = array(); - - try { - if ($key) { - Mage::helper('Mage_Core_Helper_Data')->validateKey($key); - } - } catch (Exception $e) { - $errors[] = $e->getMessage(); - $this->getDataModel()->addError($e->getMessage()); - } - - if (!empty($errors)) { - return $errors; - } - - return true; + /** @var $helper Mage_Core_Helper_Data */ + $helper = Mage::helper('Mage_Core_Helper_Data'); + $helper->validateKey($key); + Mage::getSingleton('Mage_Install_Model_Installer_Config')->replaceTmpEncryptKey($key); + $this->_refreshConfig(); + return $this; } /** - * Set encryption key + * Return a validated encryption key, generating a random one, if no value was initially provided * - * @param string $key - * @return Mage_Install_Model_Installer + * @param string|null $key + * @return string */ - public function installEnryptionKey($key) + public function getValidEncryptionKey($key = null) { - if ($key) { - Mage::helper('Mage_Core_Helper_Data')->validateKey($key); + /** @var $helper Mage_Core_Helper_Data */ + $helper = Mage::helper('Mage_Core_Helper_Data'); + if (!$key) { + $key = md5($helper->getRandomString(10)); } - Mage::getSingleton('Mage_Install_Model_Installer_Config')->replaceTmpEncryptKey($key); - $this->_refreshConfig(); - return $this; + $helper->validateKey($key); + return $key; } public function finish() diff --git a/app/code/core/Mage/Install/Model/Installer/Config.php b/app/code/core/Mage/Install/Model/Installer/Config.php index 5287116ac352ae98d3e3ac45b3e0809809b41804..63c272038d41c77d6549e43392d1cb19c18726c8 100644 --- a/app/code/core/Mage/Install/Model/Installer/Config.php +++ b/app/code/core/Mage/Install/Model/Installer/Config.php @@ -238,21 +238,18 @@ class Mage_Install_Model_Installer_Config extends Mage_Install_Model_Installer_A return null; } - public function replaceTmpInstallDate($date = null) + public function replaceTmpInstallDate($date = 'now') { $stamp = strtotime((string) $date); $localXml = $this->_filesystem->read($this->_localConfigFile); - $localXml = str_replace(self::TMP_INSTALL_DATE_VALUE, date('r', $stamp ? $stamp : time()), $localXml); + $localXml = str_replace(self::TMP_INSTALL_DATE_VALUE, date('r', $stamp), $localXml); $this->_filesystem->write($this->_localConfigFile, $localXml); return $this; } - public function replaceTmpEncryptKey($key = null) + public function replaceTmpEncryptKey($key) { - if (!$key) { - $key = md5(Mage::helper('Mage_Core_Helper_Data')->getRandomString(10)); - } $localXml = $this->_filesystem->read($this->_localConfigFile); $localXml = str_replace(self::TMP_ENCRYPT_KEY_VALUE, $key, $localXml); $this->_filesystem->write($this->_localConfigFile, $localXml); diff --git a/app/code/core/Mage/Install/Model/Installer/Console.php b/app/code/core/Mage/Install/Model/Installer/Console.php index d8de080187c7edb9c9db29f35c5ccadf7a9f9f87..a7c39168b592a07d6120cdd1f4329c4f886ba81b 100644 --- a/app/code/core/Mage/Install/Model/Installer/Console.php +++ b/app/code/core/Mage/Install/Model/Installer/Console.php @@ -280,7 +280,7 @@ class Mage_Install_Model_Installer_Console extends Mage_Install_Model_Installer_ 'lastname' => $options['admin_lastname'], 'email' => $options['admin_email'], 'username' => $options['admin_username'], - 'new_password' => $options['admin_password'], + 'password' => $options['admin_password'], )); $installer = $this->_getInstaller(); @@ -311,44 +311,12 @@ class Mage_Install_Model_Installer_Console extends Mage_Install_Model_Installer_ Mage_Core_Model_Resource_Setup::applyAllDataUpdates(); /** - * Validate entered data for administrator user + * Create primary administrator user & install encryption key */ - $user = $installer->validateAndPrepareAdministrator($this->_getDataModel()->getAdminData()); - - if ($this->hasErrors()) { - return false; - } - - /** - * Prepare encryption key and validate it - */ - $encryptionKey = empty($options['encryption_key']) - ? $this->generateEncryptionKey() - : $options['encryption_key']; - $this->_getDataModel()->setEncryptionKey($encryptionKey); - $installer->validateEncryptionKey($encryptionKey); - - if ($this->hasErrors()) { - return false; - } - - /** - * Create primary administrator user - */ - $installer->createAdministrator($user); - - if ($this->hasErrors()) { - return false; - } - - /** - * Save encryption key or create if empty - */ - $installer->installEnryptionKey($encryptionKey); - - if ($this->hasErrors()) { - return false; - } + $encryptionKey = !empty($options['encryption_key']) ? $options['encryption_key'] : null; + $encryptionKey = $installer->getValidEncryptionKey($encryptionKey); + $installer->createAdministrator($this->_getDataModel()->getAdminData()); + $installer->installEncryptionKey($encryptionKey); /** * Installation finish @@ -365,25 +333,17 @@ class Mage_Install_Model_Installer_Console extends Mage_Install_Model_Installer_ $this->_filesystem->changePermissions(Mage::getBaseDir('var'), 0777, true); return $encryptionKey; } catch (Exception $e) { - $this->addError('ERROR: ' . $e->getMessage()); + if ($e instanceof Mage_Core_Exception) { + foreach ($e->getMessages(Mage_Core_Model_Message::ERROR) as $errorMessage) { + $this->addError($errorMessage); + } + } else { + $this->addError('ERROR: ' . $e->getMessage()); + } return false; } } - /** - * Generate pseudorandom encryption key - * - * @param Mage_Core_Helper_Data $helper - * @return string - */ - public function generateEncryptionKey($helper = null) - { - if ($helper === null) { - $helper = Mage::helper('Mage_Core_Helper_Data'); - } - return md5($helper->getRandomString(10)); - } - /** * Cleanup database use system configuration */ diff --git a/app/code/core/Mage/Install/controllers/WizardController.php b/app/code/core/Mage/Install/controllers/WizardController.php index 6b030c247e0bd9ba5097726a25716d375e0ef9d6..1dccf7cfde5ee5544447a3d8b8ba1dcad19ec750 100644 --- a/app/code/core/Mage/Install/controllers/WizardController.php +++ b/app/code/core/Mage/Install/controllers/WizardController.php @@ -399,7 +399,7 @@ class Mage_Install_WizardController extends Mage_Install_Controller_Action } /** - * Process administrator instalation POST data + * Process administrator installation POST data */ public function administratorPostAction() { @@ -409,37 +409,22 @@ class Mage_Install_WizardController extends Mage_Install_Controller_Action $adminData = $this->getRequest()->getPost('admin'); $encryptionKey = $this->getRequest()->getPost('encryption_key'); - $errors = array(); - - //preparing admin user model with data and validate it - $user = $this->_getInstaller()->validateAndPrepareAdministrator($adminData); - if (is_array($user)) { - $errors = $user; - } - - //checking if valid encryption key was entered - $result = $this->_getInstaller()->validateEncryptionKey($encryptionKey); - if (is_array($result)) { - $errors = array_merge($errors, $result); - } - - if (!empty($errors)) { - Mage::getSingleton('Mage_Install_Model_Session')->setAdminData($adminData); - $this->getResponse()->setRedirect($step->getUrl()); - return false; - } - try { - $this->_getInstaller()->createAdministrator($user); - $this->_getInstaller()->installEnryptionKey($encryptionKey); + $encryptionKey = $this->_getInstaller()->getValidEncryptionKey($encryptionKey); + $this->_getInstaller()->createAdministrator($adminData); + $this->_getInstaller()->installEncryptionKey($encryptionKey); + $this->getResponse()->setRedirect($step->getNextUrl()); } catch (Exception $e){ - Mage::getSingleton('Mage_Install_Model_Session') - ->setAdminData($adminData) - ->addError($e->getMessage()); + /** @var $session Mage_Install_Model_Session */ + $session = Mage::getSingleton('Mage_Install_Model_Session'); + $session->setAdminData($adminData); + if ($e instanceof Mage_Core_Exception) { + $session->addMessages($e->getMessages()); + } else { + $session->addError($e->getMessage()); + } $this->getResponse()->setRedirect($step->getUrl()); - return false; } - $this->getResponse()->setRedirect($step->getNextUrl()); } /** diff --git a/app/code/core/Mage/Install/view/install/create_admin.phtml b/app/code/core/Mage/Install/view/install/create_admin.phtml index 57999d2f569e3dae7f891208be6918a81b0e7001..fb76b3395b72747114149e8af7b25f286ebd4cbc 100644 --- a/app/code/core/Mage/Install/view/install/create_admin.phtml +++ b/app/code/core/Mage/Install/view/install/create_admin.phtml @@ -79,7 +79,7 @@ <div class="input-box"> <label for="password"><?php echo $this->__('Password') ?> <span class="required">*</span></label><br/> - <input type="password" name="admin[new_password]" id="password" + <input type="password" name="admin[password]" id="password" title="<?php echo $this->__('Password') ?>" data-validate="{required:true,'validate-admin-password':true}" class="input-text"/> </div> diff --git a/app/code/core/Mage/Newsletter/view/adminhtml/queue/list.phtml b/app/code/core/Mage/Newsletter/view/adminhtml/queue/list.phtml index 44de7d319ba8c9f2d3ce8a53e4f6c1b1b54b914c..5f871d9c4bcf03dba8d927a02185fbf2d19d598f 100644 --- a/app/code/core/Mage/Newsletter/view/adminhtml/queue/list.phtml +++ b/app/code/core/Mage/Newsletter/view/adminhtml/queue/list.phtml @@ -24,16 +24,5 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td style="width:50%;"><h3 class="icon-head head-newsletter-queue"><?php echo Mage::helper('Mage_Newsletter_Helper_Data')->__('Newsletter Queue') ?></h3></td> - <td class="form-buttons"> - - </td> - </tr> - </table> -</div> -<div> - <?php echo $this->getChildHtml('grid'); ?> -</div> +<div class="page-actions"><?php echo $this->getButtonsHtml() ?></div> +<?php echo $this->getChildHtml('grid'); ?> diff --git a/app/code/core/Mage/Page/Block/Html/Head.php b/app/code/core/Mage/Page/Block/Html/Head.php index 1068e502f8ca519a616c5322db2aadf1fda023a7..619157c348e9153a77e05c495eda3979512406f6 100644 --- a/app/code/core/Mage/Page/Block/Html/Head.php +++ b/app/code/core/Mage/Page/Block/Html/Head.php @@ -41,6 +41,19 @@ class Mage_Page_Block_Html_Head extends Mage_Core_Block_Template */ protected $_template = 'html/head.phtml'; + /** + * Chunks of title (necessary for backend) + * + * @var array + */ + protected $_titleChunks; + + /** + * Page title without prefix and suffix when not chunked + * + * @var string + */ + protected $_pureTitle; /** * Add CSS file to HEAD entity * @@ -293,11 +306,17 @@ class Mage_Page_Block_Html_Head extends Mage_Core_Block_Template /** * Set title element text * - * @param string $title + * @param string|array $title * @return Mage_Page_Block_Html_Head */ public function setTitle($title) { + if (is_array($title)) { + $this->_titleChunks = $title; + $title = implode(' / ', $title); + } else { + $this->_pureTitle = $title; + } $this->_data['title'] = Mage::getStoreConfig('design/head/title_prefix') . ' ' . $title . ' ' . Mage::getStoreConfig('design/head/title_suffix'); return $this; @@ -316,6 +335,20 @@ class Mage_Page_Block_Html_Head extends Mage_Core_Block_Template return htmlspecialchars(html_entity_decode(trim($this->_data['title']), ENT_QUOTES, 'UTF-8')); } + /** + * Same as getTitle(), but return only first item from chunk for backend pages + * + * @return mixed|string + */ + public function getShortTitle() + { + if (!empty($this->_titleChunks)) { + return reset($this->_titleChunks); + } else { + return $this->_pureTitle; + } + } + /** * Retrieve default title text * diff --git a/app/code/core/Mage/Page/Block/Html/Title.php b/app/code/core/Mage/Page/Block/Html/Title.php new file mode 100644 index 0000000000000000000000000000000000000000..294532797b926ca20b02d9544478033b961e4925 --- /dev/null +++ b/app/code/core/Mage/Page/Block/Html/Title.php @@ -0,0 +1,64 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Core + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + + +/** + * Template title block + * + * @author Magento Core Team <core@magentocommerce.com> + */ +class Mage_Page_Block_Html_Title extends Mage_Core_Block_Template +{ + /** + * Own page title to display on the page + * + * @var string + */ + protected $_pageTitle; + + /** + * Provide own page title or pick it from Head Block + * + * @return string + */ + public function getPageTitle() + { + if (!empty($this->_pageTitle)) { + return $this->_pageTitle; + } + return $this->getLayout()->getBlock('head')->getShortTitle(); + } + + /** + * Set own page title + * + * @param $pageTitle + */ + public function setPageTitle($pageTitle) + { + $this->_pageTitle = $pageTitle; + } +} diff --git a/app/code/core/Mage/Page/view/adminhtml/title.phtml b/app/code/core/Mage/Page/view/adminhtml/title.phtml new file mode 100644 index 0000000000000000000000000000000000000000..6d7025b4d5df9e29b831215c6e2fdf07f0948d31 --- /dev/null +++ b/app/code/core/Mage/Page/view/adminhtml/title.phtml @@ -0,0 +1,35 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category design + * @package base_default + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ + +/** + * @var $this Mage_Page_Block_Html_Title + */ +?> +<div class="page-title"> + <div class="page-title-inner"> + <h1 class="title"><?php echo $this->getPageTitle(); ?></h1> + </div> +</div> \ No newline at end of file diff --git a/app/code/core/Mage/Paypal/Block/Adminhtml/System/Config/Fieldset/Global.php b/app/code/core/Mage/Paypal/Block/Adminhtml/System/Config/Fieldset/Global.php index f2ed6c4c2fbfb85fad0df0f3f221323e155dfc21..090400f8ef33243f20ee847f9c7b3d86aba773c4 100644 --- a/app/code/core/Mage/Paypal/Block/Adminhtml/System/Config/Fieldset/Global.php +++ b/app/code/core/Mage/Paypal/Block/Adminhtml/System/Config/Fieldset/Global.php @@ -29,7 +29,7 @@ * @author Magento Core Team <core@magentocommerce.com> */ class Mage_Paypal_Block_Adminhtml_System_Config_Fieldset_Global - extends Mage_Core_Block_Template + extends Mage_Backend_Block_Abstract implements Varien_Data_Form_Element_Renderer_Interface { /** diff --git a/app/code/core/Mage/Paypal/Block/Adminhtml/System/Config/Fieldset/Hint.php b/app/code/core/Mage/Paypal/Block/Adminhtml/System/Config/Fieldset/Hint.php index ce0ab92157d9caa526803d87c44cc649a6a09a9b..0b1862d0a7d01780b4e4b9bf935620cc6f8407d9 100644 --- a/app/code/core/Mage/Paypal/Block/Adminhtml/System/Config/Fieldset/Hint.php +++ b/app/code/core/Mage/Paypal/Block/Adminhtml/System/Config/Fieldset/Hint.php @@ -30,7 +30,7 @@ * @author Magento Core Team <core@magentocommerce.com> */ class Mage_Paypal_Block_Adminhtml_System_Config_Fieldset_Hint - extends Mage_Core_Block_Template + extends Mage_Backend_Block_Abstract implements Varien_Data_Form_Element_Renderer_Interface { protected $_template = 'Mage_Paypal::system/config/fieldset/hint.phtml'; diff --git a/app/code/core/Mage/Paypal/Block/Adminhtml/System/Config/Fieldset/Store.php b/app/code/core/Mage/Paypal/Block/Adminhtml/System/Config/Fieldset/Store.php index f2b861e70e31ffa8fefade6d2d72c93863672119..649b2afb0eef99b875863d5c3e5173fcc8ade999 100644 --- a/app/code/core/Mage/Paypal/Block/Adminhtml/System/Config/Fieldset/Store.php +++ b/app/code/core/Mage/Paypal/Block/Adminhtml/System/Config/Fieldset/Store.php @@ -30,7 +30,7 @@ * @author Magento Core Team <core@magentocommerce.com> */ class Mage_Paypal_Block_Adminhtml_System_Config_Fieldset_Store - extends Mage_Core_Block_Template + extends Mage_Backend_Block_Abstract implements Varien_Data_Form_Element_Renderer_Interface { /** diff --git a/app/code/core/Mage/Paypal/Block/Adminhtml/System/Config/Payflowlink/Info.php b/app/code/core/Mage/Paypal/Block/Adminhtml/System/Config/Payflowlink/Info.php index 4bc68dc0f746edb13c82781d43e8a5ad8aab63da..8ae5cab0ba74924d010cf1b0e7c4cb71d393ad82 100644 --- a/app/code/core/Mage/Paypal/Block/Adminhtml/System/Config/Payflowlink/Info.php +++ b/app/code/core/Mage/Paypal/Block/Adminhtml/System/Config/Payflowlink/Info.php @@ -31,8 +31,8 @@ * @package Mage_Paypal * @author Magento Core Team <core@magentocommerce.com> */ -class Mage_Paypal_Block_Adminhtml_System_Config_Payflowlink_Info - extends Mage_Core_Block_Template + class Mage_Paypal_Block_Adminhtml_System_Config_Payflowlink_Info + extends Mage_Backend_Block_Abstract implements Varien_Data_Form_Element_Renderer_Interface { /** diff --git a/app/code/core/Mage/Rating/Model/Resource/Rating/Grid/Collection.php b/app/code/core/Mage/Rating/Model/Resource/Rating/Grid/Collection.php new file mode 100644 index 0000000000000000000000000000000000000000..5315f8727959c0407647ea2b9a3d1eefe2ddc66f --- /dev/null +++ b/app/code/core/Mage/Rating/Model/Resource/Rating/Grid/Collection.php @@ -0,0 +1,47 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Rating + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Rating grid collection + * + * @category Mage + * @package Mage_Rating + * @author Magento Core Team <core@magentocommerce.com> + */ +class Mage_Rating_Model_Resource_Rating_Grid_Collection extends Mage_Rating_Model_Resource_Rating_Collection +{ + /** + * Add entity filter + * + * @return Mage_Core_Model_Resource_Db_Collection_Abstract|Mage_Rating_Model_Resource_Rating_Grid_Collection + */ + public function _initSelect() + { + parent::_initSelect(); + $this->addEntityFilter(Mage::registry('entityId')); + return $this; + } +} diff --git a/app/code/core/Mage/Rating/Model/Resource/Rating/Grid/Statuses.php b/app/code/core/Mage/Rating/Model/Resource/Rating/Grid/Statuses.php new file mode 100644 index 0000000000000000000000000000000000000000..ba5b6a16f091969751e68d5501a4ed65cb0ba307 --- /dev/null +++ b/app/code/core/Mage/Rating/Model/Resource/Rating/Grid/Statuses.php @@ -0,0 +1,61 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Rating + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Rating grid statuses option array + * + * @category Mage + * @package Mage_Rating + * @author Magento Core Team <core@magentocommerce.com> + */ +class Mage_Rating_Model_Resource_Rating_Grid_Statuses implements Mage_Core_Model_Option_ArrayInterface +{ + /** + * @var Mage_Rating_Helper_Data + */ + protected $_helper; + + /** + * @param Mage_Rating_Helper_Data $ratingHelper + */ + public function __construct(Mage_Rating_Helper_Data $ratingHelper) + { + $this->_helper = $ratingHelper; + } + + /** + * Return statuses option array + * + * @return array + */ + public function toOptionArray() + { + return array( + '1' => $this->_helper->__('Active'), + '0' => $this->_helper->__('Inactive') + ); + } +} diff --git a/app/code/core/Mage/Reports/view/adminhtml/grid.phtml b/app/code/core/Mage/Reports/view/adminhtml/grid.phtml index 351ca41150fc39f38077677a37f1c591b986e159..44ae66b9aee4adbc35087eba8ba4589fcb5fbd5f 100644 --- a/app/code/core/Mage/Reports/view/adminhtml/grid.phtml +++ b/app/code/core/Mage/Reports/view/adminhtml/grid.phtml @@ -28,97 +28,99 @@ /** @var $this Mage_Reports_Block_Adminhtml_Grid */ $numColumns = sizeof($this->getColumns()); ?> -<?php if($this->getCollection()): ?> - <?php if($this->canDisplayContainer()): ?> - <?php if($this->getGridHeader()): ?> - <div class="content-header"> - <table cellspacing="0"> - <tr> - <td style="width:50%;"><h2><?php echo $this->getGridHeader(); ?></h2></td> - </tr> - </table> - </div> - <?php endif ?> +<?php if ($this->getCollection()): ?> +<?php if ($this->canDisplayContainer()): ?> <div id="<?php echo $this->getId() ?>"> <?php else: ?> <?php echo $this->getMessagesBlock()->getGroupedHtml() ?> - <?php endif; ?> - <?php if($this->getStoreSwitcherVisibility() || $this->getDateFilterVisibility()): ?> - <?php if($this->getStoreSwitcherVisibility()): ?> + <?php endif; ?> + <?php if ($this->getStoreSwitcherVisibility() || $this->getDateFilterVisibility()): ?> + <?php if ($this->getStoreSwitcherVisibility()): ?> <?php echo $this->getStoreSwitcherHtml() ?> - <?php endif ?> + <?php endif ?> <table cellspacing="0" class="actions"> <tr> - <?php if($this->getDateFilterVisibility()): ?> - <td class="a-left filter" id="<?php echo $this->getSuffixId('period_date_range')?>"> - <div class="f-left"> - <div><?php echo $this->__('From') ?>: <input class="input-text no-changes required-entry" type="text" id="<?php echo $this->getSuffixId('period_date_from')?>" name="report_from" value="<?php echo $this->getFilter('report_from') ?>" style="width:5em" /> </div> - <div id="<?php echo $this->getSuffixId('period_date_from_advice')?>"></div> - </div> + <?php if ($this->getDateFilterVisibility()): ?> + <td class="a-left filter" id="<?php echo $this->getSuffixId('period_date_range')?>"> + <div class="f-left"> + <div><?php echo $this->__('From') ?>: <input class="input-text no-changes required-entry" + type="text" + id="<?php echo $this->getSuffixId('period_date_from')?>" + name="report_from" + value="<?php echo $this->getFilter('report_from') ?>" + style="width:5em"/> </div> + <div id="<?php echo $this->getSuffixId('period_date_from_advice')?>"></div> + </div> - <div class="f-left"> - <div><?php echo $this->__('To') ?>: <input class="input-text no-changes required-entry" type="text" id="<?php echo $this->getSuffixId('period_date_to')?>" name="report_to" value="<?php echo $this->getFilter('report_to') ?>" style="width:5em" /> </div> - <div id="<?php echo $this->getSuffixId('period_date_to_advice')?>"></div> - </div> + <div class="f-left"> + <div><?php echo $this->__('To') ?>: <input class="input-text no-changes required-entry" + type="text" + id="<?php echo $this->getSuffixId('period_date_to')?>" + name="report_to" + value="<?php echo $this->getFilter('report_to') ?>" + style="width:5em"/> </div> + <div id="<?php echo $this->getSuffixId('period_date_to_advice')?>"></div> + </div> - <div class="f-left"> - <?php echo $this->__('Show By') ?>: - <select name="report_period" id="<?php echo $this->getSuffixId('report_period')?>" style="width:6em;"> - <?php foreach ($this->getPeriods() as $_value=>$_label): ?> - <option value="<?php echo $_value ?>" <?php if($this->getFilter('report_period')==$_value): ?> selected<?php endif; ?>><?php echo $_label ?></option> - <?php endforeach; ?> - </select> - <?php echo $this->getRefreshButtonHtml() ?> - </div> - <script type="text/javascript"> - (function( $ ) { - $("#<?php echo $this->getSuffixId('period_date_range') ?>").dateRange({ - dateFormat: "<?php echo $this->getDateFormat() ?>", - buttonImage: "<?php echo $this->getViewFileUrl('images/grid-cal.gif') ?>", - buttonText: "<?php echo $this->__('Select Date') ?>", - from: { - id: "<?php echo $this->getSuffixId('period_date_from')?>" - }, - to: { - id: "<?php echo $this->getSuffixId('period_date_to')?>" - } - }) - })(jQuery) - </script> - </td> - <?php endif; ?> - <?php if($this->getChildBlock('grid.export')): ?> - <td class="export a-right"> - <?php echo $this->getChildHtml('grid.export');?> - </td> - <?php endif; ?> + <div class="f-left"> + <?php echo $this->__('Show By') ?>: + <select name="report_period" id="<?php echo $this->getSuffixId('report_period')?>" + style="width:6em;"> + <?php foreach ($this->getPeriods() as $_value => $_label): ?> + <option value="<?php echo $_value ?>" <?php if ($this->getFilter('report_period') == $_value): ?> + selected<?php endif; ?>><?php echo $_label ?></option> + <?php endforeach; ?> + </select> + <?php echo $this->getRefreshButtonHtml() ?> + </div> + <script type="text/javascript"> + (function ($) { + $("#<?php echo $this->getSuffixId('period_date_range') ?>").dateRange({ + dateFormat:"<?php echo $this->getDateFormat() ?>", + buttonImage:"<?php echo $this->getViewFileUrl('images/grid-cal.gif') ?>", + buttonText:"<?php echo $this->__('Select Date') ?>", + from:{ + id:"<?php echo $this->getSuffixId('period_date_from')?>" + }, + to:{ + id:"<?php echo $this->getSuffixId('period_date_to')?>" + } + }) + })(jQuery) + </script> + </td> + <?php endif; ?> + <?php if ($this->getChildBlock('grid.export')): ?> + <td class="export a-right"> + <?php echo $this->getChildHtml('grid.export');?> + </td> + <?php endif; ?> </tr> </table> - <?php endif; ?> + <?php endif; ?> <div class="grid"> <div class="hor-scroll"> <table cellspacing="0" class="data" id="<?php echo $this->getId() ?>_table"> - <!-- Rendering column set --> - <?php echo $this->getChildHtml('grid.columnSet'); ?> + <!-- Rendering column set --> + <?php echo $this->getChildHtml('grid.columnSet'); ?> </table> </div> </div> </div> -<?php if($this->canDisplayContainer()): ?> -<script type="text/javascript"> -//<![CDATA[ - <?php echo $this->getJsObjectName() ?> = new varienGrid('<?php echo $this->getId() ?>', '<?php echo $this->getGridUrl() ?>', '<?php echo $this->getVarNamePage() ?>', '<?php echo $this->getVarNameSort() ?>', '<?php echo $this->getVarNameDir() ?>', '<?php echo $this->getVarNameFilter() ?>'); - <?php echo $this->getJsObjectName() ?>.useAjax = '<?php if ($this->getUseAjax()): echo $this->getUseAjax(); endif; ?>'; - <?php if($this->getDateFilterVisibility()):?> - <?php echo $this->getJsObjectName() ?>.doFilterCallback = validateFilterDate; +<?php if ($this->canDisplayContainer()): ?> + <script type="text/javascript"> + //<![CDATA[ + <?php echo $this->getJsObjectName() ?> = new varienGrid('<?php echo $this->getId() ?>', '<?php echo $this->getGridUrl() ?>', '<?php echo $this->getVarNamePage() ?>', '<?php echo $this->getVarNameSort() ?>', '<?php echo $this->getVarNameDir() ?>', '<?php echo $this->getVarNameFilter() ?>'); + <?php echo $this->getJsObjectName() ?>.useAjax = '<?php if ($this->getUseAjax()): echo $this->getUseAjax(); endif; ?>'; + <?php if ($this->getDateFilterVisibility()): ?> + <?php echo $this->getJsObjectName() ?>.doFilterCallback = validateFilterDate; var period_date_from = $('<?php echo $this->getSuffixId('period_date_from')?>'); - var period_date_to = $('<?php echo $this->getSuffixId('period_date_to')?>'); + var period_date_to = $('<?php echo $this->getSuffixId('period_date_to')?>'); period_date_from.adviceContainer = $('<?php echo $this->getSuffixId('period_date_from_advice')?>'); period_date_to.adviceContainer = $('<?php echo $this->getSuffixId('period_date_to_advice')?>'); - function validateFilterDate() - { + function validateFilterDate() { if (period_date_from && period_date_to) { return Validation.validate(period_date_from) && Validation.validate(period_date_to); } @@ -126,10 +128,10 @@ $numColumns = sizeof($this->getColumns()); return true; } } - <?php endif;?> - <?php if($this->getStoreSwitcherVisibility()): ?> + <?php endif;?> + <?php if ($this->getStoreSwitcherVisibility()): ?> /* Overwrite function from switcher.phtml widget*/ - function switchStore(obj){ + function switchStore(obj) { if (obj.options[obj.selectedIndex].getAttribute('website') == 'true') { var selectionType = 'website'; } else if (obj.options[obj.selectedIndex].getAttribute('group') == 'true') { @@ -138,22 +140,22 @@ $numColumns = sizeof($this->getColumns()); var selectionType = 'store'; } var storeParam = obj.value ? selectionType + '/' + obj.value + '/' : ''; - if(obj.switchParams){ - storeParam+= obj.switchParams; + if (obj.switchParams) { + storeParam += obj.switchParams; } var formParam = new Array('<?php echo $this->getSuffixId('period_date_from')?>', '<?php echo $this->getSuffixId('period_date_to')?>', '<?php echo $this->getSuffixId('report_period')?>'); var paramURL = ''; - var switchURL = '<?php echo $this->getAbsoluteGridUrl(array('_current' => false)); ?>'.replace(/(store|group|website)\/\d+\//,''); + var switchURL = '<?php echo $this->getAbsoluteGridUrl(array('_current' => false)); ?>'.replace(/(store|group|website)\/\d+\//, ''); - for(var i=0;i<formParam.length;i++){ + for (var i = 0; i < formParam.length; i++) { if ($(formParam[i]).value && $(formParam[i]).name) { - paramURL+= $(formParam[i]).name + '=' + escape($(formParam[i]).value) + '&'; + paramURL += $(formParam[i]).name + '=' + escape($(formParam[i]).value) + '&'; } } setLocation(switchURL + storeParam + '?' + paramURL); } + <?php endif; ?> + //]]> + </script> <?php endif; ?> -//]]> -</script> -<?php endif; ?> <?php endif; ?> \ No newline at end of file diff --git a/app/code/core/Mage/Sales/Block/Adminhtml/Billing/Agreement/View/Tab/Info.php b/app/code/core/Mage/Sales/Block/Adminhtml/Billing/Agreement/View/Tab/Info.php index bb35772e5035ffdcfd238aaeae3c45c6b40808cc..3088de94da134b347d0cc89b7c17b921f38377a1 100644 --- a/app/code/core/Mage/Sales/Block/Adminhtml/Billing/Agreement/View/Tab/Info.php +++ b/app/code/core/Mage/Sales/Block/Adminhtml/Billing/Agreement/View/Tab/Info.php @@ -29,7 +29,7 @@ * * @author Magento Core Team <core@magentocommerce.com> */ -class Mage_Sales_Block_Adminhtml_Billing_Agreement_View_Tab_Info extends Mage_Core_Block_Template +class Mage_Sales_Block_Adminhtml_Billing_Agreement_View_Tab_Info extends Mage_Backend_Block_Abstract implements Mage_Backend_Block_Widget_Tab_Interface { protected $_template = 'billing/agreement/view/tab/info.phtml'; diff --git a/app/code/core/Mage/Sales/Block/Adminhtml/Recurring/Profile/Edit/Form.php b/app/code/core/Mage/Sales/Block/Adminhtml/Recurring/Profile/Edit/Form.php index 9647d2b8a60bb8242c20d14b8ccf3feabe5d0bbb..1714903667360087e647c02ff5c8182028bf17ce 100644 --- a/app/code/core/Mage/Sales/Block/Adminhtml/Recurring/Profile/Edit/Form.php +++ b/app/code/core/Mage/Sales/Block/Adminhtml/Recurring/Profile/Edit/Form.php @@ -28,7 +28,7 @@ * Recurring profile editing form * Can work in scope of product edit form */ -class Mage_Sales_Block_Adminhtml_Recurring_Profile_Edit_Form extends Mage_Core_Block_Template +class Mage_Sales_Block_Adminhtml_Recurring_Profile_Edit_Form extends Mage_Backend_Block_Abstract { /** * Reference to the parent element (optional) diff --git a/app/code/core/Mage/Tag/Block/Adminhtml/Edit/Form.php b/app/code/core/Mage/Tag/Block/Adminhtml/Edit/Form.php index 5d358150b0c48737757c1033fb4c0eca2b323eba..d8f53793a2e83be51ed3ff057615cdc5c3403b2a 100644 --- a/app/code/core/Mage/Tag/Block/Adminhtml/Edit/Form.php +++ b/app/code/core/Mage/Tag/Block/Adminhtml/Edit/Form.php @@ -79,7 +79,7 @@ class Mage_Tag_Block_Adminhtml_Edit_Form extends Mage_Adminhtml_Block_Widget_For 'label' => Mage::helper('Mage_Tag_Helper_Data')->__('Tag Name'), 'title' => Mage::helper('Mage_Tag_Helper_Data')->__('Tag Name'), 'required' => true, - 'after_element_html' => ' ' . Mage::helper('Mage_Tag_Helper_Data')->__('[GLOBAL]'), + 'scope_label' => ' ' . Mage::helper('Mage_Tag_Helper_Data')->__('[GLOBAL]'), )); $fieldset->addField('status', 'select', array( @@ -92,14 +92,14 @@ class Mage_Tag_Block_Adminhtml_Edit_Form extends Mage_Adminhtml_Block_Widget_For Mage_Tag_Model_Tag::STATUS_PENDING => Mage::helper('Mage_Tag_Helper_Data')->__('Pending'), Mage_Tag_Model_Tag::STATUS_APPROVED => Mage::helper('Mage_Tag_Helper_Data')->__('Approved'), ), - 'after_element_html' => ' ' . Mage::helper('Mage_Tag_Helper_Data')->__('[GLOBAL]'), + 'scope_label' => ' ' . Mage::helper('Mage_Tag_Helper_Data')->__('[GLOBAL]'), )); $fieldset->addField('base_popularity', 'text', array( 'name' => 'base_popularity', 'label' => Mage::helper('Mage_Tag_Helper_Data')->__('Base Popularity'), 'title' => Mage::helper('Mage_Tag_Helper_Data')->__('Base Popularity'), - 'after_element_html' => ' ' . Mage::helper('Mage_Tag_Helper_Data')->__('[STORE VIEW]'), + 'scope_label' => ' ' . Mage::helper('Mage_Tag_Helper_Data')->__('[STORE VIEW]'), )); if (!$model->getId() && !Mage::getSingleton('Mage_Adminhtml_Model_Session')->getTagData() ) { diff --git a/app/code/core/Mage/Tag/Block/Adminhtml/Report/Customer.php b/app/code/core/Mage/Tag/Block/Adminhtml/Report/Customer.php index 870de339403334970765b98f67c639f7d078de91..14625191c271e8dbedc2c41a164e23b97996fa3c 100644 --- a/app/code/core/Mage/Tag/Block/Adminhtml/Report/Customer.php +++ b/app/code/core/Mage/Tag/Block/Adminhtml/Report/Customer.php @@ -31,8 +31,7 @@ * @package Mage_Tag * @author Magento Core Team <core@magentocommerce.com> */ - -class Mage_Tag_Block_Adminhtml_Report_Customer extends Mage_Adminhtml_Block_Widget_Grid_Container +class Mage_Tag_Block_Adminhtml_Report_Customer extends Mage_Backend_Block_Widget_Grid_Container { public function _construct() { @@ -42,5 +41,4 @@ class Mage_Tag_Block_Adminhtml_Report_Customer extends Mage_Adminhtml_Block_Widg parent::_construct(); $this->_removeButton('add'); } - } diff --git a/app/code/core/Mage/Tag/Block/Adminhtml/Report/Customer/Detail.php b/app/code/core/Mage/Tag/Block/Adminhtml/Report/Customer/Detail.php index 72b76033089830f938b01150cf65b2e5e33ee456..3a8ba5ff96b2932c3d904f05a412689ddb2109dd 100644 --- a/app/code/core/Mage/Tag/Block/Adminhtml/Report/Customer/Detail.php +++ b/app/code/core/Mage/Tag/Block/Adminhtml/Report/Customer/Detail.php @@ -31,9 +31,8 @@ * @package Mage_Tag * @author Magento Core Team <core@magentocommerce.com> */ -class Mage_Tag_Block_Adminhtml_Report_Customer_Detail extends Mage_Adminhtml_Block_Widget_Grid_Container +class Mage_Tag_Block_Adminhtml_Report_Customer_Detail extends Mage_Backend_Block_Widget_Grid_Container { - protected function _construct() { $this->_blockGroup = 'Mage_Tag'; @@ -47,5 +46,4 @@ class Mage_Tag_Block_Adminhtml_Report_Customer_Detail extends Mage_Adminhtml_Blo $this->setBackUrl($this->getUrl('*/report_tag/customer/')); $this->_addBackButton(); } - } diff --git a/app/code/core/Mage/Tag/Block/Adminhtml/Report/Customer/Detail/Grid.php b/app/code/core/Mage/Tag/Block/Adminhtml/Report/Customer/Detail/Grid.php deleted file mode 100644 index 5924e5a885d4794b9f0c8423d01d0974953acd80..0000000000000000000000000000000000000000 --- a/app/code/core/Mage/Tag/Block/Adminhtml/Report/Customer/Detail/Grid.php +++ /dev/null @@ -1,103 +0,0 @@ -<?php -/** - * Magento - * - * NOTICE OF LICENSE - * - * This source file is subject to the Open Software License (OSL 3.0) - * that is bundled with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://opensource.org/licenses/osl-3.0.php - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@magentocommerce.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade Magento to newer - * versions in the future. If you wish to customize Magento for your - * needs please refer to http://www.magentocommerce.com for more information. - * - * @category Mage - * @package Mage_Tag - * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) - * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) - */ - -/** - * Adminhtml tags detail for customer report grid block - * - * @category Mage - * @package Mage_Tag - * @author Magento Core Team <core@magentocommerce.com> - */ -class Mage_Tag_Block_Adminhtml_Report_Customer_Detail_Grid extends Mage_Adminhtml_Block_Widget_Grid -{ - - protected function _construct() - { - parent::_construct(); - $this->setId('customers_grid'); - } - - protected function _prepareCollection() - { - $collection = Mage::getModel('Mage_Tag_Model_Tag') - ->getEntityCollection() - ->joinAttribute('original_name', 'catalog_product/name', 'entity_id') - ->addCustomerFilter($this->getRequest()->getParam('id')) - ->addStatusFilter(Mage_Tag_Model_Tag::STATUS_APPROVED) - ->addStoresVisibility() - ->setActiveFilter() - ->addGroupByTag() - ->setRelationId(); - - $this->setCollection($collection); - - return parent::_prepareCollection(); - } - - protected function _prepareColumns() - { - $this->addColumn('name', array( - 'header' =>Mage::helper('Mage_Tag_Helper_Data')->__('Product Name'), - 'index' =>'original_name' - )); - - $this->addColumn('tag_name', array( - 'header' =>Mage::helper('Mage_Tag_Helper_Data')->__('Tag Name'), - 'index' =>'tag_name' - )); - - if (!Mage::app()->isSingleStoreMode()) { - $this->addColumn('visible', array( - 'header' => Mage::helper('Mage_Tag_Helper_Data')->__('Visible In'), - 'index' => 'stores', - 'type' => 'store', - 'sortable' => false, - 'store_view'=> true - )); - - $this->addColumn('added_in', array( - 'header' =>Mage::helper('Mage_Tag_Helper_Data')->__('Submitted In'), - 'index' =>'store_id', - 'type' =>'store', - 'store_view'=>true - )); - } - - $this->addColumn('created_at', array( - 'header' =>Mage::helper('Mage_Tag_Helper_Data')->__('Submitted On'), - 'width' => '140px', - 'type' => 'datetime', - 'index' => 'created_at' - )); - - $this->setFilterVisibility(false); - - $this->addExportType('*/*/exportCustomerDetailCsv', Mage::helper('Mage_Tag_Helper_Data')->__('CSV')); - $this->addExportType('*/*/exportCustomerDetailExcel', Mage::helper('Mage_Tag_Helper_Data')->__('Excel XML')); - - return parent::_prepareColumns(); - } -} diff --git a/app/code/core/Mage/Tag/Block/Adminhtml/Report/Customer/Grid.php b/app/code/core/Mage/Tag/Block/Adminhtml/Report/Customer/Grid.php deleted file mode 100644 index c9e5af16fdbe28e4f41e14b93f5c3589fdd2da5a..0000000000000000000000000000000000000000 --- a/app/code/core/Mage/Tag/Block/Adminhtml/Report/Customer/Grid.php +++ /dev/null @@ -1,118 +0,0 @@ -<?php -/** - * Magento - * - * NOTICE OF LICENSE - * - * This source file is subject to the Open Software License (OSL 3.0) - * that is bundled with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://opensource.org/licenses/osl-3.0.php - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@magentocommerce.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade Magento to newer - * versions in the future. If you wish to customize Magento for your - * needs please refer to http://www.magentocommerce.com for more information. - * - * @category Mage - * @package Mage_Tag - * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) - * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) - */ - -/** - * Adminhtml tags by customers report grid block - * - * @category Mage - * @package Mage_Tag - * @author Magento Core Team <core@magentocommerce.com> - */ -class Mage_Tag_Block_Adminhtml_Report_Customer_Grid extends Mage_Adminhtml_Block_Widget_Grid -{ - - protected function _construct() - { - parent::_construct(); - $this->setId('grid'); - } - - protected function _prepareCollection() - { - - $collection = Mage::getResourceModel('Mage_Tag_Model_Resource_Reports_Customer_Collection'); - - $collection->addStatusFilter(Mage_Tag_Model_Tag::STATUS_APPROVED) - ->addGroupByCustomer() - ->addTagedCount(); - - $this->setCollection($collection); - return parent::_prepareCollection(); - } - - protected function _prepareColumns() - { - - $this->addColumn('entity_id', array( - 'header' =>Mage::helper('Mage_Tag_Helper_Data')->__('ID'), - 'width' => '50px', - 'align' =>'right', - 'index' =>'entity_id' - )); - - $this->addColumn('firstname', array( - 'header' =>Mage::helper('Mage_Tag_Helper_Data')->__('First Name'), - 'index' =>'firstname' - )); - - $this->addColumn('lastname', array( - 'header' =>Mage::helper('Mage_Tag_Helper_Data')->__('Last Name'), - 'index' =>'lastname' - )); - - $this->addColumn('taged', array( - 'header' =>Mage::helper('Mage_Tag_Helper_Data')->__('Total Tags'), - 'width' =>'50px', - 'align' =>'right', - 'index' =>'taged' - )); - - $this->addColumn('action', - array( - 'header' => Mage::helper('Mage_Tag_Helper_Data')->__('Action'), - 'width' => '100%', - 'type' => 'action', - 'getter' => 'getId', - 'actions' => array( - array( - 'caption' => Mage::helper('Mage_Tag_Helper_Data')->__('Show Tags'), - 'url' => array( - 'base'=>'*/*/customerDetail' - ), - 'field' => 'id' - ) - ), - 'is_system' => true, - 'filter' => false, - 'sortable' => false, - 'index' => 'stores', - )); - - $this->setFilterVisibility(false); - - $this->addExportType('*/*/exportCustomerCsv', Mage::helper('Mage_Tag_Helper_Data')->__('CSV')); - $this->addExportType('*/*/exportCustomerExcel', Mage::helper('Mage_Tag_Helper_Data')->__('Excel XML')); - - return parent::_prepareColumns(); - } - - public function getRowUrl($row) - { - return $this->getUrl('*/*/customerDetail', array('id'=>$row->getId())); - } - -} - diff --git a/app/code/core/Mage/Tag/Block/Adminhtml/Report/Popular/Detail.php b/app/code/core/Mage/Tag/Block/Adminhtml/Report/Popular/Detail.php index 3202ad73ee20bca312deb7ddbb072c9a1aa0d72e..bba18eff087638b52ba9cc91fcf9a1f1a31b2aa5 100644 --- a/app/code/core/Mage/Tag/Block/Adminhtml/Report/Popular/Detail.php +++ b/app/code/core/Mage/Tag/Block/Adminhtml/Report/Popular/Detail.php @@ -31,9 +31,8 @@ * @package Mage_Tag * @author Magento Core Team <core@magentocommerce.com> */ -class Mage_Tag_Block_Adminhtml_Report_Popular_Detail extends Mage_Adminhtml_Block_Widget_Grid_Container +class Mage_Tag_Block_Adminhtml_Report_Popular_Detail extends Mage_Backend_Block_Widget_Grid_Container { - protected function _construct() { $this->_blockGroup = 'Mage_Tag'; diff --git a/app/code/core/Mage/Tag/Block/Adminhtml/Report/Popular/Detail/Grid.php b/app/code/core/Mage/Tag/Block/Adminhtml/Report/Popular/Detail/Grid.php deleted file mode 100644 index c3917633f2847f5f3421cad4f556acc11834ab8a..0000000000000000000000000000000000000000 --- a/app/code/core/Mage/Tag/Block/Adminhtml/Report/Popular/Detail/Grid.php +++ /dev/null @@ -1,101 +0,0 @@ -<?php -/** - * Magento - * - * NOTICE OF LICENSE - * - * This source file is subject to the Open Software License (OSL 3.0) - * that is bundled with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://opensource.org/licenses/osl-3.0.php - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@magentocommerce.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade Magento to newer - * versions in the future. If you wish to customize Magento for your - * needs please refer to http://www.magentocommerce.com for more information. - * - * @category Mage - * @package Mage_Tag - * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) - * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) - */ - -/** - * Adminhtml tags detail for product report grid block - * - * @category Mage - * @package Mage_Tag - * @author Magento Core Team <core@magentocommerce.com> - */ -class Mage_Tag_Block_Adminhtml_Report_Popular_Detail_Grid extends Mage_Adminhtml_Block_Widget_Grid -{ - - protected function _construct() - { - parent::_construct(); - $this->setId('tag_grid'); - } - - /** - * Prepare collection for grid - * - * @return Mage_Tag_Block_Adminhtml_Report_Popular_Detail_Grid - */ - protected function _prepareCollection() - { - /* @var $collection Mage_Tag_Model_Resource_Reports_Customer_Collection */ - $collection = Mage::getResourceModel('Mage_Tag_Model_Resource_Reports_Customer_Collection'); - $collection->addStatusFilter(Mage::getModel('Mage_Tag_Model_Tag')->getApprovedStatus()) - ->addTagFilter($this->getRequest()->getParam('id')) - ->addProductToSelect(); - - $this->setCollection($collection); - - return parent::_prepareCollection(); - } - - /** - * Form columns for the grid - * - * @return Mage_Tag_Block_Adminhtml_Report_Popular_Detail_Grid - */ - protected function _prepareColumns() - { - - $this->addColumn('firstname', array( - 'header' =>Mage::helper('Mage_Tag_Helper_Data')->__('First Name'), - 'index' =>'firstname' - )); - - $this->addColumn('lastname', array( - 'header' =>Mage::helper('Mage_Tag_Helper_Data')->__('Last Name'), - 'index' =>'lastname' - )); - - $this->addColumn('product', array( - 'header' =>Mage::helper('Mage_Tag_Helper_Data')->__('Product Name'), - 'index' =>'product_name' - )); - - if (!Mage::app()->isSingleStoreMode()) { - $this->addColumn('added_in', array( - 'header' => Mage::helper('Mage_Tag_Helper_Data')->__('Submitted In'), - 'index' => 'added_in', - 'type' => 'store', - 'store_view'=> true - )); - } - - $this->setFilterVisibility(false); - - $this->addExportType('*/*/exportTagDetailCsv', Mage::helper('Mage_Tag_Helper_Data')->__('CSV')); - $this->addExportType('*/*/exportTagDetailExcel', Mage::helper('Mage_Tag_Helper_Data')->__('Excel XML')); - - return parent::_prepareColumns(); - } - -} diff --git a/app/code/core/Mage/Tag/Block/Adminhtml/Report/Product.php b/app/code/core/Mage/Tag/Block/Adminhtml/Report/Product.php index b120a4f4747b14b322ba2fecdd4d55136b6c84b7..aa71badb7a7d22ee4f6d3e6669cf2aac90c145e3 100644 --- a/app/code/core/Mage/Tag/Block/Adminhtml/Report/Product.php +++ b/app/code/core/Mage/Tag/Block/Adminhtml/Report/Product.php @@ -31,7 +31,7 @@ * @package Mage_Tag * @author Magento Core Team <core@magentocommerce.com> */ -class Mage_Tag_Block_Adminhtml_Report_Product extends Mage_Adminhtml_Block_Widget_Grid_Container +class Mage_Tag_Block_Adminhtml_Report_Product extends Mage_Backend_Block_Widget_Grid_Container { public function _construct() { diff --git a/app/code/core/Mage/Tag/Block/Adminhtml/Report/Product/Detail.php b/app/code/core/Mage/Tag/Block/Adminhtml/Report/Product/Detail.php index 1bb251364edb170ca9cae27512a66e0ee2c7ae26..5548880832fda6fb6d8687016bc6935b4ccf6ee2 100644 --- a/app/code/core/Mage/Tag/Block/Adminhtml/Report/Product/Detail.php +++ b/app/code/core/Mage/Tag/Block/Adminhtml/Report/Product/Detail.php @@ -31,10 +31,8 @@ * @package Mage_Tag * @author Magento Core Team <core@magentocommerce.com> */ - -class Mage_Tag_Block_Adminhtml_Report_Product_Detail extends Mage_Adminhtml_Block_Widget_Grid_Container +class Mage_Tag_Block_Adminhtml_Report_Product_Detail extends Mage_Backend_Block_Widget_Grid_Container { - protected function _construct() { $this->_blockGroup = 'Mage_Tag'; @@ -48,5 +46,4 @@ class Mage_Tag_Block_Adminhtml_Report_Product_Detail extends Mage_Adminhtml_Bloc $this->setBackUrl($this->getUrl('*/report_tag/product/')); $this->_addBackButton(); } - } diff --git a/app/code/core/Mage/Tag/Block/Adminhtml/Report/Product/Detail/Grid.php b/app/code/core/Mage/Tag/Block/Adminhtml/Report/Product/Detail/Grid.php deleted file mode 100644 index 87a764608c0ad6240fece368678f35bf8313fa60..0000000000000000000000000000000000000000 --- a/app/code/core/Mage/Tag/Block/Adminhtml/Report/Product/Detail/Grid.php +++ /dev/null @@ -1,93 +0,0 @@ -<?php -/** - * Magento - * - * NOTICE OF LICENSE - * - * This source file is subject to the Open Software License (OSL 3.0) - * that is bundled with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://opensource.org/licenses/osl-3.0.php - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@magentocommerce.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade Magento to newer - * versions in the future. If you wish to customize Magento for your - * needs please refer to http://www.magentocommerce.com for more information. - * - * @category Mage - * @package Mage_Tag - * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) - * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) - */ - -/** - * Adminhtml tags detail for product report grid block - * - * @category Mage - * @package Mage_Tag - * @author Magento Core Team <core@magentocommerce.com> - */ -class Mage_Tag_Block_Adminhtml_Report_Product_Detail_Grid extends Mage_Adminhtml_Block_Widget_Grid -{ - - protected function _construct() - { - parent::_construct(); - $this->setId('grid'); - } - - protected function _prepareCollection() - { - /** @var $collection Mage_Tag_Model_Resource_Reports_Product_Collection */ - $collection = Mage::getResourceModel('Mage_Tag_Model_Resource_Reports_Product_Collection'); - - $collection->addTagedCount() - ->addProductFilter($this->getRequest()->getParam('id')) - ->addStatusFilter(Mage::getModel('Mage_Tag_Model_Tag')->getApprovedStatus()) - ->addStoresVisibility() - ->setActiveFilter() - ->addGroupByTag() - ->setRelationId(); - - $this->setCollection($collection); - return parent::_prepareCollection(); - } - - protected function _prepareColumns() - { - - $this->addColumn('tag_name', array( - 'header' =>Mage::helper('Mage_Tag_Helper_Data')->__('Tag Name'), - 'index' =>'tag_name' - )); - - $this->addColumn('taged', array( - 'header' =>Mage::helper('Mage_Tag_Helper_Data')->__('Tag Use'), - 'index' =>'taged', - 'align' => 'right' - )); - - if (!Mage::app()->isSingleStoreMode()) { - $this->addColumn('visible', array( - 'header' => Mage::helper('Mage_Tag_Helper_Data')->__('Visible In'), - 'sortable' => false, - 'index' => 'stores', - 'type' => 'store', - 'store_view'=> true - )); - } - - $this->addExportType('*/*/exportProductDetailCsv', Mage::helper('Mage_Tag_Helper_Data')->__('CSV')); - $this->addExportType('*/*/exportProductDetailExcel', Mage::helper('Mage_Tag_Helper_Data')->__('Excel XML')); - - $this->setFilterVisibility(false); - - return parent::_prepareColumns(); - } - -} - diff --git a/app/code/core/Mage/Tag/Block/Adminhtml/Report/Product/Grid.php b/app/code/core/Mage/Tag/Block/Adminhtml/Report/Product/Grid.php deleted file mode 100644 index f7225213c4019a6cdf24031807176506cb51056d..0000000000000000000000000000000000000000 --- a/app/code/core/Mage/Tag/Block/Adminhtml/Report/Product/Grid.php +++ /dev/null @@ -1,120 +0,0 @@ -<?php -/** - * Magento - * - * NOTICE OF LICENSE - * - * This source file is subject to the Open Software License (OSL 3.0) - * that is bundled with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://opensource.org/licenses/osl-3.0.php - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@magentocommerce.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade Magento to newer - * versions in the future. If you wish to customize Magento for your - * needs please refer to http://www.magentocommerce.com for more information. - * - * @category Mage - * @package Mage_Tag - * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) - * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) - */ - -/** - * Adminhtml tags by products report grid block - * - * @category Mage - * @package Mage_Tag - * @author Magento Core Team <core@magentocommerce.com> - */ -class Mage_Tag_Block_Adminhtml_Report_Product_Grid extends Mage_Adminhtml_Block_Widget_Grid -{ - - protected function _construct() - { - parent::_construct(); - $this->setId('gridProducts'); - } - - protected function _prepareCollection() - { - /** @var $collection Mage_Tag_Model_Resource_Reports_Product_Collection */ - $collection = Mage::getResourceModel('Mage_Tag_Model_Resource_Reports_Product_Collection'); - - $collection->addUniqueTagedCount() - ->addAllTagedCount() - ->addStatusFilter(Mage::getModel('Mage_Tag_Model_Tag')->getApprovedStatus()) - ->addGroupByProduct(); - - $this->setCollection($collection); - return parent::_prepareCollection(); - } - - protected function _prepareColumns() - { - - $this->addColumn('entity_id', array( - 'header' =>Mage::helper('Mage_Tag_Helper_Data')->__('ID'), - 'width' =>'50px', - 'align' =>'right', - 'index' =>'entity_id' - )); - - $this->addColumn('name', array( - 'header' =>Mage::helper('Mage_Tag_Helper_Data')->__('Product Name'), - 'index' =>'name' - )); - - $this->addColumn('utaged', array( - 'header' =>Mage::helper('Mage_Tag_Helper_Data')->__('Number of Unique Tags'), - 'width' =>'50px', - 'align' =>'right', - 'index' =>'utaged' - )); - - $this->addColumn('taged', array( - 'header' =>Mage::helper('Mage_Tag_Helper_Data')->__('Number of Total Tags'), - 'width' =>'50px', - 'align' =>'right', - 'index' =>'taged' - )); - - $this->addColumn('action', - array( - 'header' => Mage::helper('Mage_Tag_Helper_Data')->__('Action'), - 'width' => '100%', - 'type' => 'action', - 'getter' => 'getId', - 'actions' => array( - array( - 'caption' => Mage::helper('Mage_Tag_Helper_Data')->__('Show Tags'), - 'url' => array( - 'base'=>'*/*/productDetail' - ), - 'field' => 'id' - ) - ), - 'is_system' => true, - 'filter' => false, - 'sortable' => false, - 'index' => 'stores', - )); - - $this->setFilterVisibility(false); - - $this->addExportType('*/*/exportProductCsv', Mage::helper('Mage_Tag_Helper_Data')->__('CSV')); - $this->addExportType('*/*/exportProductExcel', Mage::helper('Mage_Tag_Helper_Data')->__('Excel XML')); - - return parent::_prepareColumns(); - } - - public function getRowUrl($row) - { - return $this->getUrl('*/*/productDetail', array('id'=>$row->getId())); - } - -} diff --git a/app/code/core/Mage/Tag/Model/Resource/Reports/Customer/Detail/Collection.php b/app/code/core/Mage/Tag/Model/Resource/Reports/Customer/Detail/Collection.php new file mode 100644 index 0000000000000000000000000000000000000000..46e3346e39f6ab0320152e31d3e5560fb9f37006 --- /dev/null +++ b/app/code/core/Mage/Tag/Model/Resource/Reports/Customer/Detail/Collection.php @@ -0,0 +1,72 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Tag + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Report Customers Detail Tags grid collection + * + * @category Mage + * @package Mage_Tag + * @author Magento Core Team <core@magentocommerce.com> + */ +class Mage_Tag_Model_Resource_Reports_Customer_Detail_Collection extends Mage_Tag_Model_Resource_Product_Collection +{ + /** + * @var Mage_Core_Controller_Request_Http + */ + protected $_request; + + /** + * @param Mage_Core_Controller_Request_Http $request + * @param null $resource + */ + public function __construct( + Mage_Core_Controller_Request_Http $request, + $resource = null) + { + $this->_request = $request; + parent::__construct($resource); + } + + /** + * @return Mage_Core_Controller_Request_Http + */ + public function getRequest() + { + return $this->_request; + } + + /** + * @return Mage_Tag_Model_Resource_Product_Collection|Mage_Tag_Model_Resource_Reports_Customer_Detail_Collection + */ + public function _initSelect() + { + parent::_initSelect(); + $this->joinAttribute('original_name', 'catalog_product/name', 'entity_id')->addCustomerFilter($this + ->getRequest()->getParam('id'))->addStatusFilter(Mage_Tag_Model_Tag::STATUS_APPROVED)->addStoresVisibility() + ->setActiveFilter()->addGroupByTag()->setRelationId(); + return $this; + } +} diff --git a/app/code/core/Mage/Tag/Model/Resource/Reports/Customer/Grid/Collection.php b/app/code/core/Mage/Tag/Model/Resource/Reports/Customer/Grid/Collection.php new file mode 100644 index 0000000000000000000000000000000000000000..3968cf9dc16589c24640d5bc30f06afb13e49e62 --- /dev/null +++ b/app/code/core/Mage/Tag/Model/Resource/Reports/Customer/Grid/Collection.php @@ -0,0 +1,45 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Tag + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Report Customers Tags grid collection + * + * @category Mage + * @package Mage_Tag + * @author Magento Core Team <core@magentocommerce.com> + */ +class Mage_Tag_Model_Resource_Reports_Customer_Grid_Collection extends Mage_Tag_Model_Resource_Reports_Customer_Collection +{ + /** + * @return Mage_Tag_Model_Resource_Customer_Collection|Mage_Tag_Model_Resource_Reports_Customer_Grid_Collection + */ + public function _initSelect() + { + parent::_initSelect(); + $this->addStatusFilter(Mage_Tag_Model_Tag::STATUS_APPROVED)->addGroupByCustomer()->addTagedCount(); + return $this; + } +} diff --git a/app/code/core/Mage/Tag/Model/Resource/Reports/Detail/Collection.php b/app/code/core/Mage/Tag/Model/Resource/Reports/Detail/Collection.php new file mode 100644 index 0000000000000000000000000000000000000000..c56e569ebf8e0a04c6ba327b31a28f63c352b288 --- /dev/null +++ b/app/code/core/Mage/Tag/Model/Resource/Reports/Detail/Collection.php @@ -0,0 +1,80 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Tag + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Report Popular Tags Details grid collection + * + * @category Mage + * @package Mage_Tag + * @author Magento Core Team <core@magentocommerce.com> + */ +class Mage_Tag_Model_Resource_Reports_Detail_Collection + extends Mage_Tag_Model_Resource_Reports_Customer_Collection +{ + /** + * @var Mage_Tag_Model_Tag + */ + protected $_model; + + /** + * @var Mage_Core_Controller_Request_Http + */ + protected $_request; + + /** + * @param Mage_Tag_Model_Tag $tagModel + * @param Mage_Core_Controller_Request_Http $request + * @param null $resource + */ + public function __construct( + Mage_Tag_Model_Tag $tagModel, + Mage_Core_Controller_Request_Http $request, + $resource = null) + { + $this->_model = $tagModel; + $this->_request = $request; + parent::__construct($resource); + } + + /** + * @return Mage_Core_Controller_Request_Http + */ + public function getRequest() + { + return $this->_request; + } + /** + * @return Mage_Tag_Model_Resource_Customer_Collection|Mage_Tag_Model_Resource_Reports_Customer_Grid_Collection + */ + public function _initSelect() + { + parent::_initSelect(); + $this->addStatusFilter($this->_model->getApprovedStatus()) + ->addTagFilter($this->getRequest()->getParam('id')) + ->addProductToSelect(); + return $this; + } +} diff --git a/app/code/core/Mage/Tag/Model/Resource/Reports/Product/Detail/Collection.php b/app/code/core/Mage/Tag/Model/Resource/Reports/Product/Detail/Collection.php new file mode 100644 index 0000000000000000000000000000000000000000..8fd0269c110442b76f21de675aa8b029b0e09b90 --- /dev/null +++ b/app/code/core/Mage/Tag/Model/Resource/Reports/Product/Detail/Collection.php @@ -0,0 +1,81 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Tag + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Report Tags Product Detail submitted grid collection + * + * @category Mage + * @package Mage_Tag + * @author Magento Core Team <core@magentocommerce.com> + */ +class Mage_Tag_Model_Resource_Reports_Product_Detail_Collection + extends Mage_Tag_Model_Resource_Reports_Product_Collection +{ + /** + * @var Mage_Tag_Model_Tag + */ + protected $_model; + + /** + * @var Mage_Core_Controller_Request_Http + */ + protected $_request; + + /** + * @param Mage_Tag_Model_Tag $tagModel + * @param Mage_Core_Controller_Request_Http $request + * @param null $resource + */ + public function __construct( + Mage_Tag_Model_Tag $tagModel, + Mage_Core_Controller_Request_Http $request, + $resource = null) + { + $this->_model = $tagModel; + $this->_request = $request; + parent::__construct($resource); + } + + /** + * @return Mage_Core_Controller_Request_Http + */ + public function getRequest() + { + return $this->_request; + } + + /** + * @return Mage_Tag_Model_Resource_Product_Collection|void + */ + protected function _initSelect() + { + parent::_initSelect(); + $this->addTagedCount()->addProductFilter($this->getRequest()->getParam('id')) + ->addStatusFilter($this->_model->getApprovedStatus())->addStoresVisibility()->setActiveFilter() + ->addGroupByTag()->setRelationId(); + return $this; + } +} diff --git a/app/code/core/Mage/Tag/Model/Resource/Reports/Product/Grid/Collection.php b/app/code/core/Mage/Tag/Model/Resource/Reports/Product/Grid/Collection.php new file mode 100644 index 0000000000000000000000000000000000000000..3015117c52c94768b5bb0462f19fa954a8778efa --- /dev/null +++ b/app/code/core/Mage/Tag/Model/Resource/Reports/Product/Grid/Collection.php @@ -0,0 +1,64 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Tag + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Report Products Tags grid collection + * + * @category Mage + * @package Mage_Tag + * @author Magento Core Team <core@magentocommerce.com> + */ +class Mage_Tag_Model_Resource_Reports_Product_Grid_Collection extends Mage_Tag_Model_Resource_Reports_Product_Collection +{ + /** + * @var Mage_Tag_Model_Tag + */ + protected $_model; + + /** + * @param Mage_Tag_Model_Tag $tagModel + * @param null $resource + */ + public function __construct(Mage_Tag_Model_Tag $tagModel, $resource = null) + { + $this->_model = $tagModel; + parent::__construct($resource); + } + + /** + * @return Mage_Tag_Model_Resource_Product_Collection|void + */ + protected function _initSelect() + { + parent::_initSelect(); + $this->addUniqueTagedCount() + ->addAllTagedCount() + ->addStatusFilter($this->_model->getApprovedStatus()) + ->addGroupByProduct(); + return $this; + + } +} diff --git a/app/code/core/Mage/Tag/controllers/Adminhtml/Report/TagController.php b/app/code/core/Mage/Tag/controllers/Adminhtml/Report/TagController.php index 6c960f10c91a8e82579c4088cc8171fb7f83d4d6..c98ec10a1a3e404eb94b6f8d6ccf294db89f7047 100644 --- a/app/code/core/Mage/Tag/controllers/Adminhtml/Report/TagController.php +++ b/app/code/core/Mage/Tag/controllers/Adminhtml/Report/TagController.php @@ -58,9 +58,7 @@ class Mage_Tag_Adminhtml_Report_TagController extends Mage_Adminhtml_Controller_ ->_setActiveMenu('Mage_Tag::report_tags_customer') ->_addBreadcrumb( Mage::helper('Mage_Tag_Helper_Data')->__('Customers Report'), - Mage::helper('Mage_Tag_Helper_Data')->__('Customers Report') - ) - ->_addContent($this->getLayout()->createBlock('Mage_Tag_Block_Adminhtml_Report_Customer')) + Mage::helper('Mage_Tag_Helper_Data')->__('Customers Report')) ->renderLayout(); } @@ -69,11 +67,9 @@ class Mage_Tag_Adminhtml_Report_TagController extends Mage_Adminhtml_Controller_ */ public function exportCustomerCsvAction() { - $fileName = 'tag_customer.csv'; - $content = $this->getLayout()->createBlock('Mage_Tag_Block_Adminhtml_Report_Customer_Grid') - ->getCsvFile(); - - $this->_prepareDownloadResponse($fileName, $content); + $this->loadLayout(false); + $content = $this->getLayout()->getChildBlock('adminhtml.report.tag.customer.grid','grid.export'); + $this->_prepareDownloadResponse('tag_customer.csv', $content->getCsvFile()); } /** @@ -81,11 +77,9 @@ class Mage_Tag_Adminhtml_Report_TagController extends Mage_Adminhtml_Controller_ */ public function exportCustomerExcelAction() { - $fileName = 'tag_customer.xml'; - $content = $this->getLayout()->createBlock('Mage_Tag_Block_Adminhtml_Report_Customer_Grid') - ->getExcelFile($fileName); - - $this->_prepareDownloadResponse($fileName, $content); + $this->loadLayout(false); + $content = $this->getLayout()->getChildBlock('adminhtml.report.tag.customer.grid','grid.export'); + $this->_prepareDownloadResponse('tag_customer.xml', $content->getExcelFile()); } public function productAction() @@ -100,7 +94,6 @@ class Mage_Tag_Adminhtml_Report_TagController extends Mage_Adminhtml_Controller_ Mage::helper('Mage_Tag_Helper_Data')->__('Poducts Report'), Mage::helper('Mage_Tag_Helper_Data')->__('Products Report') ) - ->_addContent($this->getLayout()->createBlock('Mage_Tag_Block_Adminhtml_Report_Product')) ->renderLayout(); } @@ -109,11 +102,9 @@ class Mage_Tag_Adminhtml_Report_TagController extends Mage_Adminhtml_Controller_ */ public function exportProductCsvAction() { - $fileName = 'tag_product.csv'; - $content = $this->getLayout()->createBlock('Mage_Tag_Block_Adminhtml_Report_Product_Grid') - ->getCsvFile(); - - $this->_prepareDownloadResponse($fileName, $content); + $this->loadLayout(false); + $content = $this->getLayout()->getChildBlock('adminhtml.report.tag.product.grid','grid.export'); + $this->_prepareDownloadResponse('tag_product.csv', $content->getCsvFile()); } /** @@ -121,11 +112,9 @@ class Mage_Tag_Adminhtml_Report_TagController extends Mage_Adminhtml_Controller_ */ public function exportProductExcelAction() { - $fileName = 'tag_product.xml'; - $content = $this->getLayout()->createBlock('Mage_Tag_Block_Adminhtml_Report_Product_Grid') - ->getExcelFile($fileName); - - $this->_prepareDownloadResponse($fileName, $content); + $this->loadLayout(false); + $content = $this->getLayout()->getChildBlock('adminhtml.report.tag.product.grid','grid.export'); + $this->_prepareDownloadResponse('tag_product.xml', $content->getExcelFile()); } public function popularAction() @@ -173,24 +162,15 @@ class Mage_Tag_Adminhtml_Report_TagController extends Mage_Adminhtml_Controller_ $this->_initAction(); /** @var $detailBlock Mage_Tag_Block_Adminhtml_Report_Customer_Detail */ - $detailBlock = $this->getLayout()->createBlock('Mage_Tag_Block_Adminhtml_Report_Customer_Detail'); + $detailBlock = $this->getLayout()->getBlock('report.tag.customer.detail.container'); - $this->_title($this->__('Reports')) - ->_title($this->__('Tags')) - ->_title($this->__('Customers')) - ->_title($detailBlock->getHeaderText()); + $this->_title($this->__('Reports'))->_title($this->__('Tags'))->_title($this->__('Customers')) + ->_title($detailBlock->getHeaderText()); - $this->_setActiveMenu('Mage_Tag::report_tags') - ->_addBreadcrumb( - Mage::helper('Mage_Tag_Helper_Data')->__('Customers Report'), - Mage::helper('Mage_Tag_Helper_Data')->__('Customers Report') - ) - ->_addBreadcrumb( - Mage::helper('Mage_Tag_Helper_Data')->__('Customer Tags'), - Mage::helper('Mage_Tag_Helper_Data')->__('Customer Tags') - ) - ->_addContent($detailBlock) - ->renderLayout(); + $this->_setActiveMenu('Mage_Tag::report_tags')->_addBreadcrumb(Mage::helper('Mage_Tag_Helper_Data') + ->__('Customers Report'), Mage::helper('Mage_Tag_Helper_Data')->__('Customers Report')) + ->_addBreadcrumb(Mage::helper('Mage_Tag_Helper_Data')->__('Customer Tags'), + Mage::helper('Mage_Tag_Helper_Data')->__('Customer Tags'))->renderLayout(); } /** @@ -198,11 +178,9 @@ class Mage_Tag_Adminhtml_Report_TagController extends Mage_Adminhtml_Controller_ */ public function exportCustomerDetailCsvAction() { - $fileName = 'tag_customer_detail.csv'; - $content = $this->getLayout()->createBlock('Mage_Tag_Block_Adminhtml_Report_Customer_Detail_Grid') - ->getCsvFile(); - - $this->_prepareDownloadResponse($fileName, $content); + $this->loadLayout(false); + $content = $this->getLayout()->getChildBlock('adminhtml.report.tag.customer.detail.grid','grid.export'); + $this->_prepareDownloadResponse('tag_customer_detail.csv', $content->getCsvFile()); } /** @@ -210,11 +188,9 @@ class Mage_Tag_Adminhtml_Report_TagController extends Mage_Adminhtml_Controller_ */ public function exportCustomerDetailExcelAction() { - $fileName = 'tag_customer_detail.xml'; - $content = $this->getLayout()->createBlock('Mage_Tag_Block_Adminhtml_Report_Customer_Detail_Grid') - ->getExcelFile($fileName); - - $this->_prepareDownloadResponse($fileName, $content); + $this->loadLayout(false); + $content = $this->getLayout()->getChildBlock('adminhtml.report.tag.customer.detail.grid', 'grid.export'); + $this->_prepareDownloadResponse('tag_customer_detail.xml', $content->getExcelFile()); } public function productDetailAction() @@ -222,12 +198,12 @@ class Mage_Tag_Adminhtml_Report_TagController extends Mage_Adminhtml_Controller_ $this->_initAction(); /** @var $detailBlock Mage_Tag_Block_Adminhtml_Report_Product_Detail */ - $detailBlock = $this->getLayout()->createBlock('Mage_Tag_Block_Adminhtml_Report_Product_Detail'); + $detailBlock = $this->getLayout()->getBlock('report.tag.product.productdetail.container'); $this->_title($this->__('Reports')) - ->_title($this->__('Tags')) - ->_title($this->__('Products')) - ->_title($detailBlock->getHeaderText()); + ->_title($this->__('Tags')) + ->_title($this->__('Products')) + ->_title($detailBlock->getHeaderText()); $this->_setActiveMenu('Mage_Tag::report_tags') ->_addBreadcrumb( @@ -237,9 +213,7 @@ class Mage_Tag_Adminhtml_Report_TagController extends Mage_Adminhtml_Controller_ ->_addBreadcrumb( Mage::helper('Mage_Tag_Helper_Data')->__('Product Tags'), Mage::helper('Mage_Tag_Helper_Data')->__('Product Tags') - ) - ->_addContent($detailBlock) - ->renderLayout(); + )->renderLayout(); } /** @@ -247,11 +221,9 @@ class Mage_Tag_Adminhtml_Report_TagController extends Mage_Adminhtml_Controller_ */ public function exportProductDetailCsvAction() { - $fileName = 'tag_product_detail.csv'; - $content = $this->getLayout()->createBlock('Mage_Tag_Block_Adminhtml_Report_Product_Detail_Grid') - ->getCsvFile(); - - $this->_prepareDownloadResponse($fileName, $content); + $this->loadLayout(false); + $content = $this->getLayout()->getChildBlock('adminhtml.report.tag.product.productdetail.grid','grid.export'); + $this->_prepareDownloadResponse('tag_product_detail.csv', $content->getCsvFile()); } /** @@ -259,11 +231,9 @@ class Mage_Tag_Adminhtml_Report_TagController extends Mage_Adminhtml_Controller_ */ public function exportProductDetailExcelAction() { - $fileName = 'tag_product_detail.xml'; - $content = $this->getLayout()->createBlock('Mage_Tag_Block_Adminhtml_Report_Product_Detail_Grid') - ->getExcelFile($fileName); - - $this->_prepareDownloadResponse($fileName, $content); + $this->loadLayout(false); + $content = $this->getLayout()->getChildBlock('adminhtml.report.tag.product.productdetail.grid','grid.export'); + $this->_prepareDownloadResponse('tag_product_detail.xml', $content->getExcelFile()); } public function tagDetailAction() @@ -271,7 +241,7 @@ class Mage_Tag_Adminhtml_Report_TagController extends Mage_Adminhtml_Controller_ $this->_initAction(); /** @var $detailBlock Mage_Tag_Block_Adminhtml_Report_Popular_Detail */ - $detailBlock = $this->getLayout()->createBlock('Mage_Tag_Block_Adminhtml_Report_Popular_Detail'); + $detailBlock = $this->getLayout()->getBlock('report.tag.detail.container'); $this->_title($this->__('Reports')) ->_title($this->__('Tags')) @@ -285,9 +255,7 @@ class Mage_Tag_Adminhtml_Report_TagController extends Mage_Adminhtml_Controller_ ) ->_addBreadcrumb( Mage::helper('Mage_Tag_Helper_Data')->__('Tag Detail'), - Mage::helper('Mage_Tag_Helper_Data')->__('Tag Detail') - ) - ->_addContent($detailBlock) + Mage::helper('Mage_Tag_Helper_Data')->__('Tag Detail')) ->renderLayout(); } @@ -296,11 +264,9 @@ class Mage_Tag_Adminhtml_Report_TagController extends Mage_Adminhtml_Controller_ */ public function exportTagDetailCsvAction() { - $fileName = 'tag_detail.csv'; - $content = $this->getLayout()->createBlock('Mage_Tag_Block_Adminhtml_Report_Popular_Detail_Grid') - ->getCsvFile(); - - $this->_prepareDownloadResponse($fileName, $content); + $this->loadLayout(false); + $content = $this->getLayout()->getChildBlock('adminhtml.report.tag.detail.grid','grid.export'); + $this->_prepareDownloadResponse('tag_detail.csv', $content->getCsvFile()); } /** @@ -308,11 +274,9 @@ class Mage_Tag_Adminhtml_Report_TagController extends Mage_Adminhtml_Controller_ */ public function exportTagDetailExcelAction() { - $fileName = 'tag_detail.xml'; - $content = $this->getLayout()->createBlock('Mage_Tag_Block_Adminhtml_Report_Popular_Detail_Grid') - ->getExcelFile($fileName); - - $this->_prepareDownloadResponse($fileName, $content); + $this->loadLayout(false); + $content = $this->getLayout()->getChildBlock('adminhtml.report.tag.detail.grid','grid.export'); + $this->_prepareDownloadResponse('tag_detail.xml', $content->getExcelFile()); } protected function _isAllowed() diff --git a/app/code/core/Mage/Tag/etc/config.xml b/app/code/core/Mage/Tag/etc/config.xml index 68cdec0ac5b56d7df9456fa208d2b80d9cf5f142..a1a9209761167774d89535baabb6aae9a0e2c0ab 100644 --- a/app/code/core/Mage/Tag/etc/config.xml +++ b/app/code/core/Mage/Tag/etc/config.xml @@ -147,6 +147,9 @@ <tag module="Mage_Tag"> <file>tag.xml</file> </tag> + <tag_report module="Mage_Tag"> + <file>report.xml</file> + </tag_report> </updates> </layout> </adminhtml> diff --git a/app/code/core/Mage/Tag/view/adminhtml/report.xml b/app/code/core/Mage/Tag/view/adminhtml/report.xml new file mode 100644 index 0000000000000000000000000000000000000000..a835baa78406906083a6f6baef263a5e197d3d11 --- /dev/null +++ b/app/code/core/Mage/Tag/view/adminhtml/report.xml @@ -0,0 +1,475 @@ +<?xml version="1.0"?> +<!-- +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Tag + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ +--> +<layout> + <adminhtml_report_tag_product> + <update handle="formkey"/> + <update handle="adminhtml_report_tag_product_block"/> + <reference name="content"> + <block type="Mage_Tag_Block_Adminhtml_Report_Product" name="report.tag.product.container" /> + </reference> + </adminhtml_report_tag_product> + + <adminhtml_report_tag_exportproductcsv> + <update handle="formkey"/> + <update handle="adminhtml_report_tag_product_block"/> + <container name="report.tag.product.container" label="Report Tag Product Container"/> + </adminhtml_report_tag_exportproductcsv> + + <adminhtml_report_tag_exportproductexcel> + <update handle="formkey"/> + <update handle="adminhtml_report_tag_product_block"/> + <container name="report.tag.product.container" label="Report Tag Product Container"/> + </adminhtml_report_tag_exportproductexcel> + + <adminhtml_report_tag_product_block> + <reference name="report.tag.product.container"> + <block type="Mage_Backend_Block_Widget_Grid" name="adminhtml.report.tag.product.grid" as="grid"> + <arguments> + <id>gridProducts</id> + <dataSource type="object">Mage_Tag_Model_Resource_Reports_Product_Grid_Collection</dataSource> + </arguments> + <block type="Mage_Backend_Block_Widget_Grid_Export" name="adminhtml.report.tag.product.grid.export" as="grid.export"> + <arguments> + <exportTypes> + <csv> + <urlPath>*/*/exportProductCsv</urlPath> + <label translate="true" module="Mage_Tag">CSV</label> + </csv> + <excel> + <urlPath>*/*/exportProductExcel</urlPath> + <label translate="true" module="Mage_Tag">Excel XML</label> + </excel> + </exportTypes> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_ColumnSet" as="grid.columnSet" name="adminhtml.report.tag.product.grid.columnSet"> + <arguments> + <filter_visibility>0</filter_visibility> + <rowUrl> + <path>*/*/productDetail</path> + <extraParamsTemplate> + <id>getId</id> + </extraParamsTemplate> + </rowUrl> + </arguments> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="entity_id"> + <arguments> + <header translate="true" module="Mage_Tag">ID</header> + <width>50px</width> + <align>right</align> + <index>entity_id</index> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="name"> + <arguments> + <header translate="true" module="Mage_Tag">Product Name</header> + <index>name</index> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="utaged"> + <arguments> + <header translate="true" module="Mage_Tag">Number of Unique Tags</header> + <width>50px</width> + <align>right</align> + <index>utaged</index> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="taged"> + <arguments> + <header translate="true" module="Mage_Tag">Number of Total Tags</header> + <width>50px</width> + <align>right</align> + <index>taged</index> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="action"> + <arguments> + <header translate="true" module="Mage_Tag">Action</header> + <width>100%</width> + <type>action</type> + <getter>getId</getter> + <index>stores</index> + <is_system>1</is_system> + <filter>0</filter> + <sortable>0</sortable> + <actions> + <show_tag> + <caption translate="true" module="Mage_Tag">Show Tags</caption> + <url> + <base>*/*/productDetail</base> + </url> + <field>id</field> + </show_tag> + </actions> + </arguments> + </block> + </block> + </block> + </reference> + </adminhtml_report_tag_product_block> + + <adminhtml_report_tag_productdetail> + <update handle="formkey"/> + <update handle="adminhtml_report_tag_productdetail_block"/> + <reference name="content"> + <block type="Mage_Tag_Block_Adminhtml_Report_Product_Detail" name="report.tag.product.productdetail.container" /> + </reference> + </adminhtml_report_tag_productdetail> + + <adminhtml_report_tag_exportproductdetailcsv> + <update handle="formkey"/> + <update handle="adminhtml_report_tag_productdetail_block"/> + <container name="report.tag.product.productdetail.container" label="Report Tag Product Detail Container"/> + </adminhtml_report_tag_exportproductdetailcsv> + + <adminhtml_report_tag_exportproductdetailexcel> + <update handle="formkey"/> + <update handle="adminhtml_report_tag_productdetail_block"/> + <container name="report.tag.product.productdetail.container" label="Report Tag Product Detail Container"/> + </adminhtml_report_tag_exportproductdetailexcel> + + <adminhtml_report_tag_productdetail_block> + <reference name="report.tag.product.productdetail.container"> + <block type="Mage_Backend_Block_Widget_Grid" name="adminhtml.report.tag.product.productdetail.grid" as="grid"> + <arguments> + <id>grid</id> + <dataSource type="object">Mage_Tag_Model_Resource_Reports_Product_Detail_Collection</dataSource> + </arguments> + <block type="Mage_Backend_Block_Widget_Grid_Export" name="adminhtml.report.tag.productdetail.grid.export" as="grid.export"> + <arguments> + <exportTypes> + <csv> + <urlPath>*/*/exportProductDetailCsv</urlPath> + <label translate="true" module="Mage_Tag">CSV</label> + </csv> + <excel> + <urlPath>*/*/exportProductDetailExcel</urlPath> + <label translate="true" module="Mage_Tag">Excel XML</label> + </excel> + </exportTypes> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_ColumnSet" as="grid.columnSet" name="adminhtml.report.tag.product.productdetail.grid.columnSet"> + <arguments> + <filter_visibility>0</filter_visibility> + </arguments> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="tag_name"> + <arguments> + <header translate="true" module="Mage_Tag">Tag Name</header> + <index>tag_name</index> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="taged"> + <arguments> + <header translate="true" module="Mage_Tag">Tag Use</header> + <index>taged</index> + <align>right</align> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_Column_Multistore" as="visible"> + <arguments> + <header translate="true" module="Mage_Tag">Visible In</header> + <sortable>0</sortable> + <index>stores</index> + <type>store</type> + <store_view>1</store_view> + </arguments> + </block> + </block> + </block> + </reference> + </adminhtml_report_tag_productdetail_block> + + <adminhtml_report_tag_customer> + <update handle="formkey"/> + <update handle="adminhtml_report_tag_customer_block"/> + <reference name="content"> + <block type="Mage_Tag_Block_Adminhtml_Report_Customer" name="report.tag.customer.container" /> + </reference> + </adminhtml_report_tag_customer> + + <adminhtml_report_tag_exportcustomercsv> + <update handle="formkey"/> + <update handle="adminhtml_report_tag_customer_block"/> + <container name="report.tag.customer.container" label="Report Tag Customer Container"/> + </adminhtml_report_tag_exportcustomercsv> + + <adminhtml_report_tag_exportcustomerexcel> + <update handle="formkey"/> + <update handle="adminhtml_report_tag_customer_block"/> + <container name="report.tag.customer.container" label="Report Tag Customer Container"/> + </adminhtml_report_tag_exportcustomerexcel> + + <adminhtml_report_tag_customer_block> + <reference name="report.tag.customer.container"> + <block type="Mage_Backend_Block_Widget_Grid" name="adminhtml.report.tag.customer.grid" as="grid"> + <arguments> + <id>grid</id> + <dataSource type="object">Mage_Tag_Model_Resource_Reports_Customer_Grid_Collection</dataSource> + </arguments> + <block type="Mage_Backend_Block_Widget_Grid_Export" name="adminhtml.report.tag.customer.grid.export" as="grid.export"> + <arguments> + <exportTypes> + <csv> + <urlPath>*/*/exportCustomerCsv</urlPath> + <label translate="true" module="Mage_Tag">CSV</label> + </csv> + <excel> + <urlPath>*/*/exportCustomerExcel</urlPath> + <label translate="true" module="Mage_Tag">Excel XML</label> + </excel> + </exportTypes> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_ColumnSet" as="grid.columnSet" name="adminhtml.report.tag.customer.grid.columnSet"> + <arguments> + <filter_visibility>0</filter_visibility> + <rowUrl> + <path>*/*/customerDetail</path> + <extraParamsTemplate> + <id>getId</id> + </extraParamsTemplate> + </rowUrl> + </arguments> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="entity_id"> + <arguments> + <header translate="true" module="Mage_Tag">ID</header> + <index>entity_id</index> + <align>right</align> + <width>50px</width> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="firstname"> + <arguments> + <header translate="true" module="Mage_Tag">First Name</header> + <index>firstname</index> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="lastname"> + <arguments> + <header translate="true" module="Mage_Tag">Last Name</header> + <index>lastname</index> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="taged"> + <arguments> + <header translate="true" module="Mage_Tag">Total Tags</header> + <index>taged</index> + <width>50px</width> + <align>right</align> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="action"> + <arguments> + <header translate="true" module="Mage_Tag">Action</header> + <width>100%</width> + <type>action</type> + <getter>getId</getter> + <index>stores</index> + <is_system>1</is_system> + <filter>0</filter> + <sortable>0</sortable> + <actions> + <show_tag> + <caption translate="true" module="Mage_Tag">Show Tags</caption> + <url> + <base>*/*/customerDetail</base> + </url> + <field>id</field> + </show_tag> + </actions> + </arguments> + </block> + </block> + </block> + </reference> + </adminhtml_report_tag_customer_block> + + <adminhtml_report_tag_tagdetail> + <update handle="formkey"/> + <update handle="adminhtml_report_tag_detail_block"/> + <reference name="content"> + <block type="Mage_Tag_Block_Adminhtml_Report_Popular_Detail" name="report.tag.detail.container" /> + </reference> + </adminhtml_report_tag_tagdetail> + + <adminhtml_report_tag_exporttagdetailcsv> + <update handle="formkey"/> + <update handle="adminhtml_report_tag_detail_block"/> + <container name="report.tag.detail.container" label="Report Tag Detail Container"/> + </adminhtml_report_tag_exporttagdetailcsv> + + <adminhtml_report_tag_exporttagdetailexcel> + <update handle="formkey"/> + <update handle="adminhtml_report_tag_detail_block"/> + <container name="report.tag.detail.container" label="Report Tag Detail Container"/> + </adminhtml_report_tag_exporttagdetailexcel> + + <adminhtml_report_tag_detail_block> + <reference name="report.tag.detail.container"> + <block type="Mage_Backend_Block_Widget_Grid" name="adminhtml.report.tag.detail.grid" as="grid"> + <arguments> + <id>tag_grid</id> + <dataSource type="object">Mage_Tag_Model_Resource_Reports_Detail_Collection</dataSource> + </arguments> + <block type="Mage_Backend_Block_Widget_Grid_Export" name="adminhtml.report.tag.detail.grid.export" as="grid.export"> + <arguments> + <exportTypes> + <csv> + <urlPath>*/*/exportTagDetailCsv</urlPath> + <label translate="true" module="Mage_Tag">CSV</label> + </csv> + <excel> + <urlPath>*/*/exportTagDetailExcel</urlPath> + <label translate="true" module="Mage_Tag">Excel XML</label> + </excel> + </exportTypes> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_ColumnSet" as="grid.columnSet" name="adminhtml.report.tag.detail.grid.columnSet"> + <arguments> + <filter_visibility>0</filter_visibility> + </arguments> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="firstname"> + <arguments> + <header translate="true" module="Mage_Tag">First Name</header> + <index>firstname</index> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="lastname"> + <arguments> + <header translate="true" module="Mage_Tag">Last Name</header> + <index>lastname</index> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="product"> + <arguments> + <header translate="true" module="Mage_Tag">Product Name</header> + <index>product_name</index> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_Column_Multistore" as="added_in"> + <arguments> + <header translate="true" module="Mage_Tag">Submitted In</header> + <index>added_in</index> + <type>store</type> + <store_view>1</store_view> + </arguments> + </block> + </block> + </block> + </reference> + </adminhtml_report_tag_detail_block> + + <adminhtml_report_tag_customerdetail> + <update handle="formkey"/> + <update handle="adminhtml_report_tag_customer_detail_block"/> + <reference name="content"> + <block type="Mage_Tag_Block_Adminhtml_Report_Customer_Detail" name="report.tag.customer.detail.container" /> + </reference> + </adminhtml_report_tag_customerdetail> + + <adminhtml_report_tag_exportcustomerdetailcsv> + <update handle="formkey"/> + <update handle="adminhtml_report_tag_customer_detail_block"/> + <container name="report.tag.customer.detail.container" label="Report Tag Customer Detail Container"/> + </adminhtml_report_tag_exportcustomerdetailcsv> + + <adminhtml_report_tag_exportcustomerdetailexcel> + <update handle="formkey"/> + <update handle="adminhtml_report_tag_customer_detail_block"/> + <container name="report.tag.customer.detail.container" label="Report Tag Customer Detail Container"/> + </adminhtml_report_tag_exportcustomerdetailexcel> + + <adminhtml_report_tag_customer_detail_block> + <reference name="report.tag.customer.detail.container"> + <block type="Mage_Backend_Block_Widget_Grid" name="adminhtml.report.tag.customer.detail.grid" as="grid"> + <arguments> + <id>customers_grid</id> + <dataSource type="object">Mage_Tag_Model_Resource_Reports_Customer_Detail_Collection</dataSource> + </arguments> + <block type="Mage_Backend_Block_Widget_Grid_Export" name="adminhtml.report.tag.customer.detail.grid.export" as="grid.export"> + <arguments> + <exportTypes> + <csv> + <urlPath>*/*/exportCustomerDetailCsv</urlPath> + <label translate="true" module="Mage_Tag">CSV</label> + </csv> + <excel> + <urlPath>*/*/exportCustomerDetailExcel</urlPath> + <label translate="true" module="Mage_Tag">Excel XML</label> + </excel> + </exportTypes> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_ColumnSet" as="grid.columnSet" name="adminhtml.report.tag.customer.detail.grid.columnSet"> + <arguments> + <filter_visibility>0</filter_visibility> + </arguments> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="name"> + <arguments> + <header translate="true" module="Mage_Tag">Product Name</header> + <index>original_name</index> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="tag_name"> + <arguments> + <header translate="true" module="Mage_Tag">Tag Name</header> + <index>tag_name</index> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_Column_Multistore" as="visible"> + <arguments> + <header translate="true" module="Mage_Tag">Visible In</header> + <sortable>0</sortable> + <index>stores</index> + <type>store</type> + <store_view>1</store_view> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="added_in"> + <arguments> + <header translate="true" module="Mage_Tag">Submitted In</header> + <index>store_id</index> + <type>store</type> + <store_view>1</store_view> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="created_at"> + <arguments> + <header translate="true" module="Mage_Tag">Submitted On</header> + <index>created_at</index> + <width>140px</width> + <type>datetime</type> + </arguments> + </block> + </block> + </block> + </reference> + </adminhtml_report_tag_customer_detail_block> +</layout> diff --git a/app/code/core/Mage/Tag/view/adminhtml/tag/index.phtml b/app/code/core/Mage/Tag/view/adminhtml/tag/index.phtml index b9a0714dd7a469305d03e9c09c2cddef693c2aa5..a23c3a3c12b2badba3b48904fd8f807280d0d8ba 100644 --- a/app/code/core/Mage/Tag/view/adminhtml/tag/index.phtml +++ b/app/code/core/Mage/Tag/view/adminhtml/tag/index.phtml @@ -24,14 +24,7 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> -<table cellspacing="0"> - <tr> - <td style="width:80%;"><h3 class="<?php echo $this->getHeaderCssClass() ?>"><?php echo $this->getHeaderHtml(); ?></h3></td> - <td class="form-buttons"><?php echo $this->getCreateButtonHtml(); ?></td> - </tr> -</table> -</div> +<div class="page-actions"><?php echo $this->getCreateButtonHtml(); ?></div> <div id="tag_frame"> <?php echo $this->getGridHtml() ?> </div> diff --git a/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit.php b/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit.php index a59442a62f1b6b8b9be153c6a6a3a9f0c52b2287..71f38143d69d13320fd21874e7375156aa7d8d60 100644 --- a/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit.php +++ b/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit.php @@ -41,7 +41,7 @@ class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit extends Mage_Backend_B $this->setId('theme_edit'); /** @var $theme Mage_Core_Model_Theme */ - $theme = Mage::registry('current_theme'); + $theme = $this->_getCurrentTheme(); if ($theme) { if ($theme->isEditable()) { $this->_addButton('save_and_continue', array( @@ -88,11 +88,23 @@ class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit extends Mage_Backend_B */ public function getHeaderText() { - if (Mage::registry('current_theme')->getId()) { - $header = $this->__('Theme: %s', Mage::registry('current_theme')->getThemeTitle()); + /** @var $theme Mage_Core_Model_Theme */ + $theme = $this->_getCurrentTheme(); + if ($theme->getId()) { + $header = $this->__('Theme: %s', $theme->getThemeTitle()); } else { $header = $this->__('New Theme'); } return $header; } + + /** + * Get current theme + * + * @return Mage_Core_Model_Theme + */ + protected function _getCurrentTheme() + { + return Mage::registry('current_theme'); + } } diff --git a/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit/Form/Element/File.php b/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit/Form/Element/File.php new file mode 100644 index 0000000000000000000000000000000000000000..4fd6687f61a1aff5c07113f9463f4f41614543d4 --- /dev/null +++ b/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit/Form/Element/File.php @@ -0,0 +1,49 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Theme + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Form element renderer to display file element + */ +class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Form_Element_File extends Varien_Data_Form_Element_File +{ + /** + * Additional html attributes + * + * @var array + */ + protected $_htmlAttributes = array('accept', 'multiple'); + + /** + * Html attributes + * + * @return array + */ + public function getHtmlAttributes() + { + $attributes = parent::getHtmlAttributes(); + return array_merge($attributes, $this->_htmlAttributes); + } +} diff --git a/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit/Form/Element/Image.php b/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit/Form/Element/Image.php index 9dc4e17e290f86f479c71d30c46db9db36e0bcee..13fc478cb5cc3dededd9e14d827717c6aa7d8a4b 100644 --- a/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit/Form/Element/Image.php +++ b/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit/Form/Element/Image.php @@ -38,7 +38,8 @@ class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Form_Element_Image ext { $url = false; if ($this->getValue()) { - $url = Mage_Core_Model_Theme::getPreviewImageDirectoryUrl() . $this->getValue(); + $url = Mage::getObjectManager()->get('Mage_Core_Model_Theme_Image')->getPreviewImageDirectoryUrl() + . $this->getValue(); } return $url; } diff --git a/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit/Form/Element/Links.php b/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit/Form/Element/Links.php index daf598ade40ef639f66e32f47cae296b736eb974..e52aab08a1ac96fe47874005af283d1a25ffb976 100644 --- a/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit/Form/Element/Links.php +++ b/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit/Form/Element/Links.php @@ -50,6 +50,7 @@ class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Form_Element_Links ext $html = '<div id="'.$this->getHtmlId().'" ' . $this->serialize($this->getHtmlAttributes()) . '>'."\n"; $values = $this->getValues(); + if ($values) { foreach ($values as $option) { $html .= $this->_optionToHtml($option); diff --git a/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit/Tab/Css.php b/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit/Tab/Css.php index e316a844e119e5c1b751688f16a6c146794a5157..588213d7f6738d19822b76cfec7a299a56ec553c 100644 --- a/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit/Tab/Css.php +++ b/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit/Tab/Css.php @@ -31,16 +31,11 @@ * @method array getFiles() * * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + * @SuppressWarnings(PHPMD.DepthOfInheritance) */ class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Css - extends Mage_Backend_Block_Widget_Form - implements Mage_Backend_Block_Widget_Tab_Interface + extends Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_TabAbstract { - /** - * @var Magento_ObjectManager - */ - protected $_objectManager; - /** * Uploader service * @@ -48,6 +43,13 @@ class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Css */ protected $_uploaderService; + /** + * Theme custom css file + * + * @var Mage_Core_Model_Theme_Files + */ + protected $_customCssFile; + /** * @param Mage_Core_Controller_Request_Http $request * @param Mage_Core_Model_Layout $layout @@ -65,6 +67,7 @@ class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Css * @param Magento_Filesystem $filesystem * @param Magento_ObjectManager $objectManager * @param Mage_Theme_Model_Uploader_Service $uploaderService + * @param Magento_Filesystem $filesystem * @param array $data * * @SuppressWarnings(PHPMD.ExcessiveParameterList) @@ -89,9 +92,8 @@ class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Css array $data = array() ) { parent::__construct($request, $layout, $eventManager, $urlBuilder, $translator, $cache, $designPackage, - $session, $storeConfig, $frontController, $helperFactory, $dirs, $logger, $filesystem, $data + $session, $storeConfig, $frontController, $helperFactory, $dirs, $logger, $filesystem, $objectManager, $data ); - $this->_objectManager = $objectManager; $this->_uploaderService = $uploaderService; } @@ -105,9 +107,14 @@ class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Css $form = new Varien_Data_Form(); $this->setForm($form); $this->_addThemeCssFieldset(); + + $this->_customCssFile = $this->_getCurrentTheme() + ->getCustomizationData(Mage_Core_Model_Theme_Customization_Files_Css::TYPE)->getFirstItem(); + $this->_addCustomCssFieldset(); - $formData['custom_css_content'] = $this->_getCurrentTheme()->getCustomCssFile()->getContent(); + $formData['custom_css_content'] = $this->_customCssFile->getContent(); + /** @var $session Mage_Backend_Model_Session */ $session = $this->_objectManager->get('Mage_Backend_Model_Session'); $cssFileContent = $session->getThemeCustomCssData(); @@ -116,6 +123,7 @@ class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Css $session->unsThemeCustomCssData(); } $form->addValues($formData); + parent::_prepareForm(); return $this; } @@ -153,13 +161,15 @@ class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Css */ protected function _getThemeCss($fileTitle, $filePath) { + $appPath = $this->_dirs->getDir(Mage_Core_Model_Dir::APP); + $shownFilePath = str_ireplace($appPath, '', $filePath); return array( 'href' => $this->getUrl('*/*/downloadCss', array( 'theme_id' => $this->_getCurrentTheme()->getId(), 'file' => $this->_helperFactory->get('Mage_Theme_Helper_Data')->urlEncode($fileTitle)) ), 'label' => $fileTitle, - 'title' => $filePath, + 'title' => $shownFilePath, 'delimiter' => '<br />' ); } @@ -176,13 +186,14 @@ class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Css 'legend' => $this->__('Custom CSS'), 'class' => 'fieldset-wide' )); + $this->_addElementTypes($themeFieldset); - $themeFieldset->addField('css_file_uploader', 'file', array( + $themeFieldset->addField('css_file_uploader', 'css_file', array( 'name' => 'css_file_uploader', 'label' => $this->__('Select CSS File to Upload'), 'title' => $this->__('Select CSS File to Upload'), - 'note' => $this->__('Allowed file types *.css.') - . ' ' . $this->__('The file you upload will replace the existing custom.css file (shown below).') + 'accept' => 'text/css', + 'note' => $this->_getUploadCssFileNote() )); $themeFieldset->addField('css_uploader_button', 'button', array( @@ -191,6 +202,65 @@ class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Css 'disabled' => 'disabled', )); + $downloadButtonConfig = array( + 'name' => 'css_download_button', + 'value' => $this->__('Download CSS File'), + 'onclick' => "setLocation('" . $this->getUrl('*/*/downloadCustomCss', array( + 'theme_id' => $this->_getCurrentTheme()->getId())) . "');" + ); + if (!$this->_customCssFile->getContent()) { + $downloadButtonConfig['disabled'] = 'disabled'; + } + $themeFieldset->addField('css_download_button', 'button', $downloadButtonConfig); + + /** @var $imageButton Mage_Backend_Block_Widget_Button */ + $imageButton = $this->getLayout()->createBlock('Mage_Adminhtml_Block_Widget_Button') + ->setData(array( + 'id' => 'css_images_manager', + 'label' => $this->__('Manage'), + 'class' => 'button', + 'onclick' => "MediabrowserUtility.openDialog('" + . $this->getUrl('*/system_design_wysiwyg_files/index', array( + 'target_element_id' => 'custom_css_content', + Mage_Theme_Helper_Storage::PARAM_THEME_ID => $this->_getCurrentTheme()->getId(), + Mage_Theme_Helper_Storage::PARAM_CONTENT_TYPE => Mage_Theme_Model_Wysiwyg_Storage::TYPE_IMAGE + )) + . "', null, null,'" + . $this->quoteEscape( + $this->__('Upload Images...'), true + ) + . "');" + )); + + $themeFieldset->addField('css_browse_image_button', 'note', array( + 'label' => $this->__("Images Assets"), + 'text' => $imageButton->toHtml() + )); + + /** @var $fontButton Mage_Backend_Block_Widget_Button */ + $fontButton = $this->getLayout()->createBlock('Mage_Adminhtml_Block_Widget_Button') + ->setData(array( + 'id' => 'css_fonts_manager', + 'label' => $this->__('Manage'), + 'class' => 'button', + 'onclick' => "MediabrowserUtility.openDialog('" + . $this->getUrl('*/system_design_wysiwyg_files/index', array( + 'target_element_id' => 'custom_css_content', + Mage_Theme_Helper_Storage::PARAM_THEME_ID => $this->_getCurrentTheme()->getId(), + Mage_Theme_Helper_Storage::PARAM_CONTENT_TYPE => Mage_Theme_Model_Wysiwyg_Storage::TYPE_FONT + )) + . "', null, null,'" + . $this->quoteEscape( + $this->__('Upload fonts...'), true + ) + . "');", + )); + + $themeFieldset->addField('css_browse_font_button', 'note', array( + 'label' => $this->__("Fonts Assets"), + 'text' => $fontButton->toHtml() + )); + $themeFieldset->addField('custom_css_content', 'textarea', array( 'label' => $this->__('Edit custom.css'), 'title' => $this->__('Edit custom.css'), @@ -201,13 +271,24 @@ class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Css } /** - * Get current theme + * Get note string for css file to Upload * - * @return Mage_Core_Model_Theme + * @return string */ - protected function _getCurrentTheme() + protected function _getUploadCssFileNote() { - return Mage::registry('current_theme'); + $messages = array( + $this->__('Allowed file types *.css.'), + $this->__('The file you upload will replace the existing custom.css file (shown below).') + ); + $maxFileSize = $this->_objectManager->get('Magento_File_Size')->getMaxFileSizeInMb(); + if ($maxFileSize) { + $messages[] = $this->__('Max file size to upload %sM', $maxFileSize); + } else { + $messages[] = $this->__('System doesn\'t allow to get file upload settings'); + } + + return implode('<br />', $messages); } /** @@ -217,9 +298,11 @@ class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Css */ protected function _getAdditionalElementTypes() { - $element = Mage::getConfig() + $linksElement = $this->_objectManager->get('Mage_Core_Model_Config') ->getBlockClassName('Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Form_Element_Links'); - return array('links' => $element); + $fileElement = $this->_objectManager->get('Mage_Core_Model_Config') + ->getBlockClassName('Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Form_Element_File'); + return array('links' => $linksElement, 'css_file' => $fileElement); } /** @@ -248,7 +331,7 @@ class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Css } if (count($themes) > 1) { - $this->_sortThemes($themes); + $themes = $this->_sortThemesByHierarchy($themes); } $order = array_merge(array($codeDir, $jsDir), array_map(function ($theme) { @@ -259,7 +342,7 @@ class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Css $labels = $this->_getGroupLabels($themes); foreach ($groups as $key => $group) { - usort($group, array($this, '_sortGroupFiles')); + usort($group, array($this, '_sortGroupFilesCallback')); $groups[$labels[$key]] = $group; unset($groups[$key]); } @@ -269,20 +352,20 @@ class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Css /** * Sort files inside group * - * @param array $item1 - * @param array $item2 + * @param array $firstGroup + * @param array $secondGroup * @return int */ - protected function _sortGroupFiles ($item1, $item2) + protected function _sortGroupFilesCallback($firstGroup, $secondGroup) { - $hasModuleContext = strpos($item1['label'], '::') !== false; - $hasModuleContext2 = strpos($item2['label'], '::') !== false; - - if ($hasModuleContext && $hasModuleContext2) { - $result = strcmp($item1['label'], $item2['label']); - } elseif (!$hasModuleContext && !$hasModuleContext2) { - $result = strcmp($item1['label'], $item2['label']); - } elseif ($hasModuleContext) { + $hasContextFirst = strpos($firstGroup['label'], '::') !== false; + $hasContextSecond = strpos($secondGroup['label'], '::') !== false; + + if ($hasContextFirst && $hasContextSecond) { + $result = strcmp($firstGroup['label'], $secondGroup['label']); + } elseif (!$hasContextFirst && !$hasContextSecond) { + $result = strcmp($firstGroup['label'], $secondGroup['label']); + } elseif ($hasContextFirst) { //case when first item has module context and second item doesn't $result = 1; } else { @@ -297,6 +380,7 @@ class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Css * * @param string $filename * @return array + * @throws Mage_Core_Exception */ protected function _getGroup($filename) { @@ -307,7 +391,7 @@ class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Css $group = null; $theme = null; if (substr($filename, 0, strlen($designDir)) == $designDir) { - $theme = $this->_getThemeByFilename($filename); + $theme = $this->_getThemeByFilename(substr($filename, strlen($designDir))); $group = $theme->getThemeId(); } elseif (substr($filename, 0, strlen($jsDir)) == $jsDir) { $group = $jsDir; @@ -324,37 +408,52 @@ class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Css * Sort themes according to their hierarchy * * @param array $themes - * @return Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Css + * @return array */ - protected function _sortThemes(&$themes) + protected function _sortThemesByHierarchy($themes) { - uasort($themes, function($theme, $theme2) { - /** @var $theme Mage_Core_Model_Theme */ - /** @var $theme2 Mage_Core_Model_Theme */ - while ($parentTheme = $theme->getParentTheme()) { - if ($parentTheme->getId() == $theme2->getId()) { - return -1; - } - } - return 1; - }); + uasort($themes, array($this, '_sortThemesByHierarchyCallback')); + return $themes; + } - return $this; + /** + * Sort themes by hierarchy callback + * + * @param Mage_Core_Model_Theme $firstTheme + * @param Mage_Core_Model_Theme $secondTheme + * @return int + */ + protected function _sortThemesByHierarchyCallback($firstTheme, $secondTheme) + { + $parentTheme = $firstTheme->getParentTheme(); + while ($parentTheme) { + if ($parentTheme->getId() == $secondTheme->getId()) { + return -1; + } + $parentTheme = $parentTheme->getParentTheme(); + } + return 1; } /** - * Get theme object that contains gien file + * Get theme object that contains given file * * @param string $filename * @return Mage_Core_Model_Theme + * @throws InvalidArgumentException */ protected function _getThemeByFilename($filename) { - $designDir = $this->_dirs->getDir(Mage_Core_Model_Dir::THEMES); - list(, $area, $package, $theme,) = explode('/', substr($filename, strlen($designDir)), 5); + $area = strtok($filename, DIRECTORY_SEPARATOR); + $package = strtok(DIRECTORY_SEPARATOR); + $theme = strtok(DIRECTORY_SEPARATOR); + + if ($area === false || $package === false || $theme === false) { + throw new InvalidArgumentException('Theme path does not recognized'); + } /** @var $collection Mage_Core_Model_Resource_Theme_Collection */ - $collection = Mage::getModel('Mage_Core_Model_Resource_Theme_Collection'); - return $collection->getThemeByFullPath(join('/', array($area, $package, $theme))); + $collection = $this->_objectManager->create('Mage_Core_Model_Resource_Theme_Collection'); + return $collection->getThemeByFullPath($area . '/' . $package . '/' . $theme); } /** @@ -366,14 +465,13 @@ class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Css protected function _getGroupLabels($themes) { $labels = array( - $this->_dirs->getDir(Mage_Core_Model_Dir::PUB_LIB) => $this->__('Library files'), - $this->_dirs->getDir(Mage_Core_Model_Dir::MODULES) => $this->__('Framework files') + $this->_dirs->getDir(Mage_Core_Model_Dir::PUB_LIB) => $this->__('Library files'), + $this->_dirs->getDir(Mage_Core_Model_Dir::MODULES) => $this->__('Framework files') ); foreach ($themes as $theme) { /** @var $theme Mage_Core_Model_Theme */ $labels[$theme->getThemeId()] = $this->__('"%s" Theme files', $theme->getThemeTitle()); } - return $labels; } @@ -417,34 +515,4 @@ class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Css { return $this->__('CSS Editor'); } - - /** - * Return Tab title - * - * @return string - */ - public function getTabTitle() - { - return $this->getTabLabel(); - } - - /** - * Can show tab in tabs - * - * @return boolean - */ - public function canShowTab() - { - return $this->_getCurrentTheme()->isVirtual() && $this->_getCurrentTheme()->getId(); - } - - /** - * Tab is hidden - * - * @return boolean - */ - public function isHidden() - { - return false; - } } diff --git a/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit/Tab/General.php b/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit/Tab/General.php index 4e98092ae7296d75e3dd81854a1f5cb857a73fed..10e522ef3d4a531a43f564bda4023e5d980c724e 100644 --- a/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit/Tab/General.php +++ b/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit/Tab/General.php @@ -26,10 +26,11 @@ /** * Theme form, general tab + * + * @SuppressWarnings(PHPMD.DepthOfInheritance) */ class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_General - extends Mage_Backend_Block_Widget_Form - implements Mage_Backend_Block_Widget_Tab_Interface + extends Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_TabAbstract { /** * Whether theme is editable @@ -46,7 +47,7 @@ class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_General protected function _prepareForm() { /** @var $session Mage_Backend_Model_Session */ - $session = Mage::getSingleton('Mage_Backend_Model_Session'); + $session = $this->_objectManager->get('Mage_Backend_Model_Session'); $formDataFromSession = $session->getThemeData(); $this->_isThemeEditable = $this->_getCurrentTheme()->isVirtual(); $formData = $this->_getCurrentTheme()->getData(); @@ -92,17 +93,17 @@ class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_General } /** @var $themesCollections Mage_Core_Model_Theme_Collection */ - $themesCollections = Mage::getResourceModel('Mage_Core_Model_Theme_Collection'); + $themesCollections = $this->_objectManager->create('Mage_Core_Model_Theme_Collection'); /** @var $helper Mage_Core_Helper_Data */ - $helper = Mage::helper('Mage_Core_Helper_Data'); + $helper = $this->_objectManager->get('Mage_Core_Helper_Data'); $onChangeScript = sprintf('parentThemeOnChange(this.value, %s)', str_replace( '"', '\'', $helper->jsonEncode($this->_getDefaultsInherited($themesCollections->addDefaultPattern())) )); /** @var $parentTheme Mage_Core_Model_Theme */ - $parentTheme = Mage::getModel('Mage_Core_Model_Theme'); + $parentTheme = $this->_objectManager->create('Mage_Core_Model_Theme'); if (!empty($formData['parent_id'])) { $parentTheme->load($formData['parent_id']); } @@ -162,8 +163,8 @@ class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_General 'label' => $this->__('Theme Preview Image'), 'title' => $this->__('Theme Preview Image'), 'name' => 'preview_image', - 'after_element_html' => '<img width="50" src="' . Mage_Core_Model_Theme::getPreviewImageDirectoryUrl() - . $formData['preview_image'] . '" />' + 'after_element_html' => '<img width="50" src="' . $parentTheme->getThemeImage() + ->getPreviewImageDirectoryUrl() . $formData['preview_image'] . '" />' )); } @@ -239,21 +240,11 @@ class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_General */ protected function _getAdditionalElementTypes() { - $element = Mage::getConfig() + $element = $this->_objectManager->get('Mage_Core_Model_Config') ->getBlockClassName('Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Form_Element_Image'); return array('image' => $element); } - /** - * Get current theme - * - * @return Mage_Core_Model_Theme - */ - protected function _getCurrentTheme() - { - return Mage::registry('current_theme'); - } - /** * Prepare label for tab * @@ -264,16 +255,6 @@ class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_General return $this->__('General'); } - /** - * Prepare title for tab - * - * @return string - */ - public function getTabTitle() - { - return $this->__('General'); - } - /** * Returns status flag about this tab can be shown or not * @@ -284,16 +265,6 @@ class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_General return true; } - /** - * Returns status flag about this tab hidden or not - * - * @return bool - */ - public function isHidden() - { - return false; - } - /** * Get theme default values * diff --git a/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit/Tab/Js.php b/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit/Tab/Js.php new file mode 100644 index 0000000000000000000000000000000000000000..7076c3aa325e1709863a43717ffb9a3c7bae80af --- /dev/null +++ b/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit/Tab/Js.php @@ -0,0 +1,132 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Theme + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Theme form, Js editor tab + * + * @SuppressWarnings(PHPMD.DepthOfInheritance) + */ +class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Js + extends Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_TabAbstract +{ + /** + * Create a form element with necessary controls + * + * @return Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Js + */ + protected function _prepareForm() + { + $form = new Varien_Data_Form(); + $this->setForm($form); + $this->_addThemeJsFieldset(); + parent::_prepareForm(); + return $this; + } + + /** + * Set theme js fieldset + * + * @return Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Js + */ + protected function _addThemeJsFieldset() + { + $form = $this->getForm(); + $themeFieldset = $form->addFieldset('theme_js', array( + 'legend' => $this->__('Theme Java Script'), + )); + + $customJsFiles = $this->_getCurrentTheme() + ->getCustomizationData(Mage_Core_Model_Theme_Customization_Files_Js::TYPE); + + /** @var $jsFieldsetRenderer Mage_Backend_Block_Widget_Form_Renderer_Fieldset */ + $jsFieldsetRenderer = $this->getChildBlock('theme_edit_tabs_tab_js_tab_content'); + $jsFieldsetRenderer->setJsFiles($customJsFiles); + + $jsFieldset = $themeFieldset->addFieldset('js_fieldset_javascript_content', array('class' => 'fieldset-wide')); + + $this->_addElementTypes($themeFieldset); + + $themeFieldset->addField('js_files_uploader', 'js_files', array( + 'name' => 'js_files_uploader', + 'label' => $this->__('Select JS Files to Upload'), + 'title' => $this->__('Select JS Files to Upload'), + 'accept' => 'application/x-javascript', + 'multiple' => '', + 'note' => $this->_getUploadJsFileNote() + )); + + $themeFieldset->addField('js_uploader_button', 'button', array( + 'name' => 'js_uploader_button', + 'value' => $this->__('Upload JS Files'), + 'disabled' => 'disabled', + )); + + $jsFieldset->setRenderer($jsFieldsetRenderer); + return $this; + } + + /** + * Set additional form field type + * + * @return array + */ + protected function _getAdditionalElementTypes() + { + $fileElement = $this->_objectManager->get('Mage_Core_Model_Config') + ->getBlockClassName('Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Form_Element_File'); + return array('js_files' => $fileElement); + } + + /** + * Return Tab label + * + * @return string + */ + public function getTabLabel() + { + return $this->__('JS Editor'); + } + + /** + * Get upload js url + * + * @return string + */ + public function getJsUploadUrl() + { + return $this->getUrl('*/system_design_theme/uploadjs', array('id' => $this->_getCurrentTheme()->getId())); + } + + /** + * Get note string for js file to Upload + * + * @return string + */ + protected function _getUploadJsFileNote() + { + return $this->__('Allowed file types *.js.'); + } +} diff --git a/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit/TabAbstract.php b/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit/TabAbstract.php new file mode 100644 index 0000000000000000000000000000000000000000..468a1e9bfd045a101bdb54d80ff4334e56887897 --- /dev/null +++ b/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit/TabAbstract.php @@ -0,0 +1,124 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Theme + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Theme form tab abstract block + * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +abstract class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_TabAbstract + extends Mage_Backend_Block_Widget_Form + implements Mage_Backend_Block_Widget_Tab_Interface +{ + /** + * @var Magento_ObjectManager + */ + protected $_objectManager; + + /** + * @param Mage_Core_Controller_Request_Http $request + * @param Mage_Core_Model_Layout $layout + * @param Mage_Core_Model_Event_Manager $eventManager + * @param Mage_Backend_Model_Url $urlBuilder + * @param Mage_Core_Model_Translate $translator + * @param Mage_Core_Model_Cache $cache + * @param Mage_Core_Model_Design_Package $designPackage + * @param Mage_Core_Model_Session $session + * @param Mage_Core_Model_Store_Config $storeConfig + * @param Mage_Core_Controller_Varien_Front $frontController + * @param Mage_Core_Model_Factory_Helper $helperFactory + * @param Mage_Core_Model_Dir $dirs + * @param Mage_Core_Model_Logger $logger + * @param Magento_Filesystem $filesystem + * @param Magento_ObjectManager $objectManager + * @param array $data + * + * @SuppressWarnings(PHPMD.ExcessiveParameterList) + */ + public function __construct( + Mage_Core_Controller_Request_Http $request, + Mage_Core_Model_Layout $layout, + Mage_Core_Model_Event_Manager $eventManager, + Mage_Backend_Model_Url $urlBuilder, + Mage_Core_Model_Translate $translator, + Mage_Core_Model_Cache $cache, + Mage_Core_Model_Design_Package $designPackage, + Mage_Core_Model_Session $session, + Mage_Core_Model_Store_Config $storeConfig, + Mage_Core_Controller_Varien_Front $frontController, + Mage_Core_Model_Factory_Helper $helperFactory, + Mage_Core_Model_Dir $dirs, + Mage_Core_Model_Logger $logger, + Magento_Filesystem $filesystem, + Magento_ObjectManager $objectManager, + array $data = array() + ) { + parent::__construct($request, $layout, $eventManager, $urlBuilder, $translator, $cache, $designPackage, + $session, $storeConfig, $frontController, $helperFactory, $dirs, $logger, $filesystem, $data + ); + $this->_objectManager = $objectManager; + } + + /** + * Get theme that is edited currently + * + * @return Mage_Core_Model_Theme + */ + protected function _getCurrentTheme() + { + return Mage::registry('current_theme'); + } + + /** + * Return Tab title + * + * @return string + */ + public function getTabTitle() + { + return $this->getTabLabel(); + } + + /** + * Can show tab in tabs + * + * @return boolean + */ + public function canShowTab() + { + return $this->_getCurrentTheme()->isVirtual() && $this->_getCurrentTheme()->getId(); + } + + /** + * Tab is hidden + * + * @return boolean + */ + public function isHidden() + { + return false; + } +} diff --git a/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Grid.php b/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Grid.php deleted file mode 100644 index 4a29c364bb3dcb939bb50f1ffc7c066fb9bc5ae8..0000000000000000000000000000000000000000 --- a/app/code/core/Mage/Theme/Block/Adminhtml/System/Design/Theme/Grid.php +++ /dev/null @@ -1,130 +0,0 @@ -<?php -/** - * Magento - * - * NOTICE OF LICENSE - * - * This source file is subject to the Open Software License (OSL 3.0) - * that is bundled with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://opensource.org/licenses/osl-3.0.php - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@magentocommerce.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade Magento to newer - * versions in the future. If you wish to customize Magento for your - * needs please refer to http://www.magentocommerce.com for more information. - * - * @category Mage - * @package Mage_Theme - * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) - * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) - */ - -/** - * Themes grid - */ -class Mage_Theme_Block_Adminhtml_System_Design_Theme_Grid extends Mage_Adminhtml_Block_Widget_Grid -{ - /** - * Init Grid properties - */ - public function _construct() - { - parent::_construct(); - $this->setId('theme_grid'); - $this->setSaveParametersInSession(true); - $this->setUseAjax(true); - } - - /** - * Prepare grid data collection - * - * @return Mage_Theme_Block_Adminhtml_System_Design_Theme_Grid|Mage_Backend_Block_Widget_Grid - */ - protected function _prepareCollection() - { - /** @var $collection Mage_Core_Model_Resource_Theme_Collection */ - $collection = Mage::getResourceModel('Mage_Core_Model_Resource_Theme_Collection'); - $collection->addAreaFilter(Mage_Core_Model_App_Area::AREA_FRONTEND)->addParentTitle(); - $this->setCollection($collection); - parent::_prepareCollection(); - return $this; - } - - /** - * Define grid columns - * - * @return Mage_Backend_Block_Widget_Grid - */ - protected function _prepareColumns() - { - $this->addColumn('theme_title', array( - 'header' => $this->__('Theme Title'), - 'index' => 'theme_title', - 'filter_index' => 'main_table.theme_title', - 'column_css_class' => 'theme-title' - )); - - $this->addColumn('parent_theme_title', array( - 'header' => $this->__('Parent Theme'), - 'index' => 'parent_theme_title', - 'filter_index' => 'parent.theme_title', - 'column_css_class' => 'parent-theme-title' - )); - - $this->addColumn('theme_path', array( - 'header' => $this->__('Theme Path'), - 'index' => 'theme_path', - 'filter_index' => 'main_table.theme_path', - 'column_css_class' => 'theme-path' - )); - - $this->addColumn('theme_version', array( - 'header' => $this->__('Theme Version'), - 'index' => 'theme_version', - 'filter_index' => 'main_table.theme_version', - 'column_css_class' => 'theme-version' - )); - - $this->addColumn('magento_version_from', array( - 'header' => $this->__('Magento Version From'), - 'index' => 'magento_version_from', - 'filter_index' => 'main_table.magento_version_from', - 'column_css_class' => 'magento-version-from' - )); - - $this->addColumn('magento_version_to', array( - 'header' => $this->__('Magento Version To'), - 'index' => 'magento_version_to', - 'filter_index' => 'main_table.magento_version_to', - 'column_css_class' => 'magento-version-to' - )); - - return parent::_prepareColumns(); - } - - /** - * Prepare row click url - * - * @param Varien_Object $row - * @return string - */ - public function getRowUrl($row) - { - return $this->getUrl('*/*/edit', array('id' => $row->getId())); - } - - /** - * Prepare grid url - * - * @return string - */ - public function getGridUrl() - { - return $this->getUrl('*/*/grid', array('_current' => true)); - } -} diff --git a/app/code/core/Mage/Theme/Block/Adminhtml/Wysiwyg/Files/Content.php b/app/code/core/Mage/Theme/Block/Adminhtml/Wysiwyg/Files/Content.php new file mode 100644 index 0000000000000000000000000000000000000000..70ab37cdefd81ac1d2f7f54a589f6935e65d6c04 --- /dev/null +++ b/app/code/core/Mage/Theme/Block/Adminhtml/Wysiwyg/Files/Content.php @@ -0,0 +1,209 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Theme + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Files content block + * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class Mage_Theme_Block_Adminhtml_Wysiwyg_Files_Content extends Mage_Backend_Block_Widget_Container +{ + /** + * @var Mage_Theme_Helper_Storage + */ + protected $_helperStorage; + + /** + * Initialize dependencies + * + * @param Mage_Core_Controller_Request_Http $request + * @param Mage_Core_Model_Layout $layout + * @param Mage_Core_Model_Event_Manager $eventManager + * @param Mage_Backend_Model_Url $urlBuilder + * @param Mage_Core_Model_Translate $translator + * @param Mage_Core_Model_Cache $cache + * @param Mage_Core_Model_Design_Package $designPackage + * @param Mage_Core_Model_Session $session + * @param Mage_Core_Model_Store_Config $storeConfig + * @param Mage_Core_Controller_Varien_Front $frontController + * @param Mage_Core_Model_Factory_Helper $helperFactory + * @param Mage_Core_Model_Dir $dirs + * @param Mage_Core_Model_Logger $logger + * @param Magento_Filesystem $filesystem + * @param Mage_Theme_Helper_Storage $helperStorage + * @param array $data + * + * @SuppressWarnings(PHPMD.ExcessiveParameterList) + */ + public function __construct( + Mage_Core_Controller_Request_Http $request, + Mage_Core_Model_Layout $layout, + Mage_Core_Model_Event_Manager $eventManager, + Mage_Backend_Model_Url $urlBuilder, + Mage_Core_Model_Translate $translator, + Mage_Core_Model_Cache $cache, + Mage_Core_Model_Design_Package $designPackage, + Mage_Core_Model_Session $session, + Mage_Core_Model_Store_Config $storeConfig, + Mage_Core_Controller_Varien_Front $frontController, + Mage_Core_Model_Factory_Helper $helperFactory, + Mage_Core_Model_Dir $dirs, + Mage_Core_Model_Logger $logger, + Magento_Filesystem $filesystem, + Mage_Theme_Helper_Storage $helperStorage, + array $data = array() + ) { + $this->_helperStorage = $helperStorage; + parent::__construct($request, $layout, $eventManager, $urlBuilder, $translator, $cache, $designPackage, + $session, $storeConfig, $frontController, $helperFactory, $dirs, $logger, $filesystem, $data); + } + + /** + * Block construction + */ + protected function _construct() + { + parent::_construct(); + $this->_headerText = $this->__('Media Storage'); + $this->_removeButton('back')->_removeButton('edit'); + $this->_addButton('newfolder', array( + 'class' => 'save', + 'label' => $this->__('Create Folder...'), + 'type' => 'button', + 'onclick' => 'MediabrowserInstance.newFolder();' + )); + + $this->_addButton('delete_folder', array( + 'class' => 'delete no-display', + 'label' => $this->__('Delete Folder'), + 'type' => 'button', + 'onclick' => 'MediabrowserInstance.deleteFolder();', + 'id' => 'button_delete_folder' + )); + + $this->_addButton('delete_files', array( + 'class' => 'delete no-display', + 'label' => $this->__('Delete File'), + 'type' => 'button', + 'onclick' => 'MediabrowserInstance.deleteFiles();', + 'id' => 'button_delete_files' + )); + + $this->_addButton('insert_files', array( + 'class' => 'save no-display', + 'label' => $this->__('Insert File'), + 'type' => 'button', + 'onclick' => 'MediabrowserInstance.insert();', + 'id' => 'button_insert_files' + )); + } + + /** + * Files action source URL + * + * @return string + */ + public function getContentsUrl() + { + return $this->getUrl('*/*/contents', array('type' => $this->getRequest()->getParam('type')) + + $this->_helperStorage->getRequestParams()); + } + + /** + * Javascript setup object for filebrowser instance + * + * @return string + */ + public function getFilebrowserSetupObject() + { + $setupObject = new Varien_Object(); + + $setupObject->setData(array( + 'newFolderPrompt' => $this->__('New Folder Name:'), + 'deleteFolderConfirmationMessage' => $this->__('Are you sure you want to delete current folder?'), + 'deleteFileConfirmationMessage' => $this->__('Are you sure you want to delete the selected file?'), + 'targetElementId' => $this->getTargetElementId(), + 'contentsUrl' => $this->getContentsUrl(), + 'onInsertUrl' => $this->getOnInsertUrl(), + 'newFolderUrl' => $this->getNewfolderUrl(), + 'deleteFolderUrl' => $this->getDeletefolderUrl(), + 'deleteFilesUrl' => $this->getDeleteFilesUrl(), + 'headerText' => $this->getHeaderText() + )); + + return $this->helper('Mage_Core_Helper_Data')->jsonEncode($setupObject); + } + + /** + * New directory action target URL + * + * @return string + */ + public function getNewfolderUrl() + { + return $this->getUrl('*/*/newFolder', $this->_helperStorage->getRequestParams()); + } + + /** + * Delete directory action target URL + * + * @return string + */ + protected function getDeletefolderUrl() + { + return $this->getUrl('*/*/deleteFolder', $this->_helperStorage->getRequestParams()); + } + + /** + * Delete files action target URL + * + * @return string + */ + public function getDeleteFilesUrl() + { + return $this->getUrl('*/*/deleteFiles', $this->_helperStorage->getRequestParams()); + } + + /** + * Insert file action target URL + * + * @return string + */ + public function getOnInsertUrl() + { + return $this->getUrl('*/*/onInsert', $this->_helperStorage->getRequestParams()); + } + + /** + * Target element ID getter + * + * @return string + */ + public function getTargetElementId() + { + return $this->getRequest()->getParam('target_element_id'); + } +} diff --git a/app/code/core/Mage/Theme/Block/Adminhtml/Wysiwyg/Files/Content/Files.php b/app/code/core/Mage/Theme/Block/Adminhtml/Wysiwyg/Files/Content/Files.php new file mode 100644 index 0000000000000000000000000000000000000000..15d5e332abf31c4da83071a578126ccc7fde8bbb --- /dev/null +++ b/app/code/core/Mage/Theme/Block/Adminhtml/Wysiwyg/Files/Content/Files.php @@ -0,0 +1,65 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Theme + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Files files block + * + * @method Mage_Theme_Block_Adminhtml_Wysiwyg_Files_Content_Files setStorage(Mage_Theme_Model_Wysiwyg_Storage $storage) + * @method Mage_Theme_Model_Wysiwyg_Storage getStorage + */ +class Mage_Theme_Block_Adminhtml_Wysiwyg_Files_Content_Files extends Mage_Backend_Block_Template +{ + /** + * Files list + * + * @var null|array + */ + protected $_files; + + /** + * Get files + * + * @return array + */ + public function getFiles() + { + if (null === $this->_files && $this->getStorage()) { + $this->_files = $this->getStorage()->getFilesCollection(); + } + + return $this->_files; + } + + /** + * Get files count + * + * @return int + */ + public function getFilesCount() + { + return count($this->getFiles()); + } +} diff --git a/app/code/core/Mage/Theme/Block/Adminhtml/Wysiwyg/Files/Content/Uploader.php b/app/code/core/Mage/Theme/Block/Adminhtml/Wysiwyg/Files/Content/Uploader.php new file mode 100644 index 0000000000000000000000000000000000000000..a4a21ff6c4b45e759f09d6655d42fddf87d8e02d --- /dev/null +++ b/app/code/core/Mage/Theme/Block/Adminhtml/Wysiwyg/Files/Content/Uploader.php @@ -0,0 +1,105 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Theme + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Files uploader block + * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class Mage_Theme_Block_Adminhtml_Wysiwyg_Files_Content_Uploader extends Mage_Adminhtml_Block_Media_Uploader +{ + /** + * @var Mage_Theme_Helper_Storage + */ + protected $_helperStorage; + + /** + * Initialize dependencies + * + * @param Mage_Core_Controller_Request_Http $request + * @param Mage_Core_Model_Layout $layout + * @param Mage_Core_Model_Event_Manager $eventManager + * @param Mage_Backend_Model_Url $urlBuilder + * @param Mage_Core_Model_Translate $translator + * @param Mage_Core_Model_Cache $cache + * @param Mage_Core_Model_Design_Package $designPackage + * @param Mage_Core_Model_Session $session + * @param Mage_Core_Model_Store_Config $storeConfig + * @param Mage_Core_Controller_Varien_Front $frontController + * @param Mage_Core_Model_Factory_Helper $helperFactory + * @param Mage_Core_Model_Dir $dirs + * @param Mage_Core_Model_Logger $logger + * @param Magento_Filesystem $filesystem + * @param Mage_Theme_Helper_Storage $helperStorage + * @param array $data + * + * @SuppressWarnings(PHPMD.ExcessiveParameterList) + */ + public function __construct( + Mage_Core_Controller_Request_Http $request, + Mage_Core_Model_Layout $layout, + Mage_Core_Model_Event_Manager $eventManager, + Mage_Backend_Model_Url $urlBuilder, + Mage_Core_Model_Translate $translator, + Mage_Core_Model_Cache $cache, + Mage_Core_Model_Design_Package $designPackage, + Mage_Core_Model_Session $session, + Mage_Core_Model_Store_Config $storeConfig, + Mage_Core_Controller_Varien_Front $frontController, + Mage_Core_Model_Factory_Helper $helperFactory, + Mage_Core_Model_Dir $dirs, + Mage_Core_Model_Logger $logger, + Magento_Filesystem $filesystem, + Mage_Theme_Helper_Storage $helperStorage, + array $data = array() + ) { + $this->_helperStorage = $helperStorage; + parent::__construct($request, $layout, $eventManager, $urlBuilder, $translator, $cache, $designPackage, + $session, $storeConfig, $frontController, $helperFactory, $dirs, $logger, $filesystem, $data); + } + + /** + * Change upload url in configuration + * + * @return Mage_Theme_Block_Adminhtml_Wysiwyg_Files_Content_Uploader + */ + protected function _construct() + { + parent::_construct(); + $this->getConfig()->setUrl($this->getUrl('*/*/upload', $this->_helperStorage->getRequestParams())); + return $this; + } + + /** + * Return storage helper + * + * @return Mage_Theme_Helper_Storage + */ + public function getHelperStorage() + { + return $this->_helperStorage; + } +} diff --git a/app/code/core/Mage/Theme/Block/Adminhtml/Wysiwyg/Files/Tree.php b/app/code/core/Mage/Theme/Block/Adminhtml/Wysiwyg/Files/Tree.php new file mode 100644 index 0000000000000000000000000000000000000000..28226ca61c4829cd1ebf8d9492398b8a42c858dd --- /dev/null +++ b/app/code/core/Mage/Theme/Block/Adminhtml/Wysiwyg/Files/Tree.php @@ -0,0 +1,136 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Theme + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Files tree block + * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class Mage_Theme_Block_Adminhtml_Wysiwyg_Files_Tree extends Mage_Backend_Block_Template +{ + /** + * @var Mage_Theme_Helper_Storage + */ + protected $_helperStorage; + + /** + * Initialize dependencies + * + * @param Mage_Core_Controller_Request_Http $request + * @param Mage_Core_Model_Layout $layout + * @param Mage_Core_Model_Event_Manager $eventManager + * @param Mage_Backend_Model_Url $urlBuilder + * @param Mage_Core_Model_Translate $translator + * @param Mage_Core_Model_Cache $cache + * @param Mage_Core_Model_Design_Package $designPackage + * @param Mage_Core_Model_Session $session + * @param Mage_Core_Model_Store_Config $storeConfig + * @param Mage_Core_Controller_Varien_Front $frontController + * @param Mage_Core_Model_Factory_Helper $helperFactory + * @param Mage_Core_Model_Dir $dirs + * @param Mage_Core_Model_Logger $logger + * @param Magento_Filesystem $filesystem + * @param Mage_Theme_Helper_Storage $helperStorage + * @param array $data + * + * @SuppressWarnings(PHPMD.ExcessiveParameterList) + */ + public function __construct( + Mage_Core_Controller_Request_Http $request, + Mage_Core_Model_Layout $layout, + Mage_Core_Model_Event_Manager $eventManager, + Mage_Backend_Model_Url $urlBuilder, + Mage_Core_Model_Translate $translator, + Mage_Core_Model_Cache $cache, + Mage_Core_Model_Design_Package $designPackage, + Mage_Core_Model_Session $session, + Mage_Core_Model_Store_Config $storeConfig, + Mage_Core_Controller_Varien_Front $frontController, + Mage_Core_Model_Factory_Helper $helperFactory, + Mage_Core_Model_Dir $dirs, + Mage_Core_Model_Logger $logger, + Magento_Filesystem $filesystem, + Mage_Theme_Helper_Storage $helperStorage, + array $data = array() + ) { + $this->_helperStorage = $helperStorage; + parent::__construct($request, $layout, $eventManager, $urlBuilder, $translator, $cache, $designPackage, + $session, $storeConfig, $frontController, $helperFactory, $dirs, $logger, $filesystem, $data); + } + + /** + * Json source URL + * + * @return string + */ + public function getTreeLoaderUrl() + { + return $this->getUrl('*/*/treeJson', $this->_helperStorage->getRequestParams()); + } + + /** + * Get tree json + * + * @param array $data + * @return string + */ + public function getTreeJson($data) + { + return Zend_Json::encode($data); + } + + /** + * Get root node name of tree + * + * @return string + */ + public function getRootNodeName() + { + return $this->__('Storage Root'); + } + + /** + * Return tree node full path based on current path + * + * @return string + */ + public function getTreeCurrentPath() + { + $treePath = '/root'; + $path = $this->_helperStorage->getSession()->getCurrentPath(); + if ($path) { + $path = str_replace($this->_helperStorage->getStorageRoot(), '', $path); + $relative = ''; + foreach (explode(DIRECTORY_SEPARATOR, $path) as $dirName) { + if ($dirName) { + $relative .= DIRECTORY_SEPARATOR . $dirName; + $treePath .= '/' . $this->_helperStorage->urlEncode($relative); + } + } + } + return $treePath; + } +} diff --git a/app/code/core/Mage/Theme/Helper/Storage.php b/app/code/core/Mage/Theme/Helper/Storage.php new file mode 100644 index 0000000000000000000000000000000000000000..24681c73cf677330eaf393b7b921b38ee8bcee71 --- /dev/null +++ b/app/code/core/Mage/Theme/Helper/Storage.php @@ -0,0 +1,323 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Theme + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Theme storage helper + */ +class Mage_Theme_Helper_Storage extends Mage_Core_Helper_Abstract +{ + /** + * Parameter name of node + */ + const PARAM_NODE = 'node'; + + /** + * Parameter name of content type + */ + const PARAM_CONTENT_TYPE = 'content_type'; + + /** + * Parameter name of theme identification number + */ + const PARAM_THEME_ID = 'theme_id'; + + /** + * Parameter name of filename + */ + const PARAM_FILENAME = 'filename'; + + /** + * Root node value identification number + */ + const NODE_ROOT = 'root'; + + /** + * Current directory path + * + * @var string + */ + protected $_currentPath; + + /** + * Current storage root path + * + * @var string + */ + protected $_storageRoot; + + + /** + * Magento filesystem + * + * @var Magento_Filesystem + */ + protected $_filesystem; + + /** + * @var Mage_Backend_Model_Session + */ + protected $_session; + + /** + * @var Mage_Core_Model_Theme_Factory + */ + protected $_themeFactory; + + /** + * Constructor + * + * @param Magento_Filesystem $filesystem + * @param Mage_Backend_Model_Session $session + * @param Mage_Core_Model_Theme_Factory $themeFactory + */ + public function __construct( + Magento_Filesystem $filesystem, + Mage_Backend_Model_Session $session, + Mage_Core_Model_Theme_Factory $themeFactory + ) { + $this->_filesystem = $filesystem; + $this->_session = $session; + $this->_themeFactory = $themeFactory; + + $this->_filesystem->setIsAllowCreateDirectories(true); + $this->_filesystem->ensureDirectoryExists($this->getStorageRoot()); + } + + /** + * Convert path to id + * + * @param string $path + * @return string + */ + public function convertPathToId($path) + { + $path = str_replace($this->getStorageRoot(), '', $path); + return $this->urlEncode($path); + } + + /** + * Convert id to path + * + * @param string $value + * @return string + */ + public function convertIdToPath($value) + { + $path = $this->urlDecode($value); + if (!strstr($path, $this->getStorageRoot())) { + $path = $this->getStorageRoot() . $path; + } + return $path; + } + + /** + * Get short file name + * + * @param string $filename + * @param int $maxLength + * @return string + */ + public function getShortFilename($filename, $maxLength = 20) + { + return strlen($filename) <= $maxLength ? $filename : substr($filename, 0, $maxLength) . '...'; + } + + /** + * Get storage root directory + * + * @return string + */ + public function getStorageRoot() + { + if (null === $this->_storageRoot) { + $this->_storageRoot = implode(Magento_Filesystem::DIRECTORY_SEPARATOR, array( + Magento_Filesystem::fixSeparator($this->_getTheme()->getCustomizationPath()), + Mage_Core_Model_Theme_Files::PATH_PREFIX_CUSTOMIZED, + $this->getStorageType() + )); + } + return $this->_storageRoot; + } + + /** + * Get theme module for custom static files + * + * @return Mage_Core_Model_Theme + * @throws InvalidArgumentException + */ + protected function _getTheme() + { + $themeId = $this->_getRequest()->getParam(self::PARAM_THEME_ID); + $theme = $this->_themeFactory->create(); + if (!$themeId || $themeId && !$theme->load($themeId)->getId()) { + throw new InvalidArgumentException('Theme was not found.'); + } + return $theme; + } + + /** + * Get storage type + * + * @return string + * @throws Magento_Exception + */ + public function getStorageType() + { + $allowedTypes = array( + Mage_Theme_Model_Wysiwyg_Storage::TYPE_FONT, + Mage_Theme_Model_Wysiwyg_Storage::TYPE_IMAGE + ); + $type = (string)$this->_getRequest()->getParam(self::PARAM_CONTENT_TYPE); + if (!in_array($type, $allowedTypes)) { + throw new Magento_Exception('Invalid type'); + } + return $type; + } + + /** + * Relative url to static content + * + * @return string + */ + public function getRelativeUrl() + { + $pathPieces = array('..', $this->getStorageType()); + $node = $this->_getRequest()->getParam(self::PARAM_NODE); + if ($node !== self::NODE_ROOT) { + $node = $this->urlDecode($node); + $nodes = explode( + Magento_Filesystem::DIRECTORY_SEPARATOR, + trim($node, Magento_Filesystem::DIRECTORY_SEPARATOR) + ); + $pathPieces = array_merge($pathPieces, $nodes); + } + $pathPieces[] = $this->urlDecode($this->_getRequest()->getParam(self::PARAM_FILENAME)); + return implode('/', $pathPieces); + } + + /** + * Get current path + * + * @return string + */ + public function getCurrentPath() + { + if (!$this->_currentPath) { + $currentPath = $this->getStorageRoot(); + $path = $this->_getRequest()->getParam(self::PARAM_NODE); + if ($path && $path !== self::NODE_ROOT) { + $path = $this->convertIdToPath($path); + if ($this->_filesystem->isDirectory($path) + && $this->_filesystem->isPathInDirectory($path, $currentPath) + ) { + $currentPath = $this->_filesystem->getAbsolutePath($path); + } + } + $this->_currentPath = $currentPath; + } + return $this->_currentPath; + } + + /** + * Get thumbnail directory for path + * + * @param string $path + * @return string + */ + public function getThumbnailDirectory($path) + { + return pathinfo($path, PATHINFO_DIRNAME) . Magento_Filesystem::DIRECTORY_SEPARATOR + . Mage_Theme_Model_Wysiwyg_Storage::THUMBNAIL_DIRECTORY; + } + + /** + * Get thumbnail path in current directory by image name + * + * @param $imageName + * @return string + * @throws InvalidArgumentException + */ + public function getThumbnailPath($imageName) + { + $imagePath = $this->getCurrentPath() . Magento_Filesystem::DIRECTORY_SEPARATOR . $imageName; + if (!$this->_filesystem->has($imagePath) + || !$this->_filesystem->isPathInDirectory($imagePath, $this->getStorageRoot()) + ) { + throw new InvalidArgumentException('The image not found.'); + } + return $this->getThumbnailDirectory($imagePath) . Magento_Filesystem::DIRECTORY_SEPARATOR + . pathinfo($imageName, PATHINFO_BASENAME); + } + + /** + * Request params for selected theme + * + * @return array + */ + public function getRequestParams() + { + $themeId = $this->_getRequest()->getParam(self::PARAM_THEME_ID); + $contentType = $this->_getRequest()->getParam(self::PARAM_CONTENT_TYPE); + $node = $this->_getRequest()->getParam(self::PARAM_NODE); + return array( + self::PARAM_THEME_ID => $themeId, + self::PARAM_CONTENT_TYPE => $contentType, + self::PARAM_NODE => $node + ); + } + + /** + * Get allowed extensions by type + * + * @return array + * @throws Magento_Exception + */ + public function getAllowedExtensionsByType() + { + switch ($this->getStorageType()) { + case Mage_Theme_Model_Wysiwyg_Storage::TYPE_FONT: + $extensions = array('ttf', 'otf', 'eot', 'svg', 'woff'); + break; + case Mage_Theme_Model_Wysiwyg_Storage::TYPE_IMAGE: + $extensions = array('jpg', 'jpeg', 'gif', 'png', 'xbm', 'wbmp'); + break; + default: + throw new Magento_Exception('Invalid type'); + } + + return $extensions; + } + + /** + * Get session model + * + * @return Mage_Backend_Model_Session + */ + public function getSession() + { + return $this->_session; + } +} diff --git a/app/code/core/Mage/Theme/Model/Uploader/Service.php b/app/code/core/Mage/Theme/Model/Uploader/Service.php index ba6467824bbf589b9df99b17ac11f1e160d807b3..4e03e9acc0c2d04f4a8b17ff18b66df386eecf8b 100644 --- a/app/code/core/Mage/Theme/Model/Uploader/Service.php +++ b/app/code/core/Mage/Theme/Model/Uploader/Service.php @@ -34,6 +34,11 @@ class Mage_Theme_Model_Uploader_Service extends Mage_Core_Model_Abstract */ const XML_PATH_CSS_UPLOAD_LIMIT = 'global/theme/css/upload_limit'; + /** + * Js file upload limit + */ + const XML_PATH_JS_UPLOAD_LIMIT = 'global/theme/js/upload_limit'; + /** * Uploaded file path * @@ -55,6 +60,13 @@ class Mage_Theme_Model_Uploader_Service extends Mage_Core_Model_Abstract */ protected $_fileSize; + /** + * Files js model + * + * @var Mage_Core_Model_Theme_Customization_Files_Js + */ + protected $_filesJs; + /** * File uploader * @@ -62,6 +74,13 @@ class Mage_Theme_Model_Uploader_Service extends Mage_Core_Model_Abstract */ protected $_uploader; + /** + * Object manager + * + * @var Magento_ObjectManager + */ + protected $_objectManager; + /** * @param Mage_Core_Model_Event_Manager $eventDispatcher * @param Mage_Core_Model_Cache $cacheManager @@ -69,6 +88,8 @@ class Mage_Theme_Model_Uploader_Service extends Mage_Core_Model_Abstract * @param Mage_Core_Model_Resource_Abstract $resource * @param Varien_Data_Collection_Db $resourceCollection * @param Magento_File_Size $fileSize + * @param Mage_Core_Model_Theme_Customization_Files_Js $filesJs + * @param Magento_ObjectManager $objectManager * @param array $data */ public function __construct( @@ -76,12 +97,16 @@ class Mage_Theme_Model_Uploader_Service extends Mage_Core_Model_Abstract Mage_Core_Model_Cache $cacheManager, Varien_Io_File $fileIo, Magento_File_Size $fileSize, + Mage_Core_Model_Theme_Customization_Files_Js $filesJs, + Magento_ObjectManager $objectManager, Mage_Core_Model_Resource_Abstract $resource = null, Varien_Data_Collection_Db $resourceCollection = null, array $data = array() ) { $this->_fileIo = $fileIo; $this->_fileSize = $fileSize; + $this->_filesJs = $filesJs; + $this->_objectManager = $objectManager; parent::__construct($eventDispatcher, $cacheManager, $resource, $resourceCollection, $data); } @@ -90,6 +115,7 @@ class Mage_Theme_Model_Uploader_Service extends Mage_Core_Model_Abstract * * @param string $type * @return Mage_Theme_Model_Uploader_Service + * @throws Mage_Core_Exception */ public function uploadCssFile($type) { @@ -99,13 +125,50 @@ class Mage_Theme_Model_Uploader_Service extends Mage_Core_Model_Abstract $fileUploader->setAllowRenameFiles(true); $fileUploader->setAllowCreateFolders(true); - $this->_validateCssMaxFileSize($fileUploader->getFileSize()); + $isValidFileSize = $this->_validateFileSize($fileUploader->getFileSize(), $this->getCssUploadMaxSize()); + if (!$isValidFileSize) { + Mage::throwException($this->_objectManager->get('Mage_Core_Helper_Data')->__( + 'CSS file size should be less than %sM.', $this->getCssUploadMaxSizeInMb() + )); + } $file = $fileUploader->validateFile(); $this->setFilePath($file['tmp_name']); return $this; } + /** + * Upload js file + * + * @param string $type + * @param Mage_Core_Model_Theme $theme + * @return Mage_Theme_Model_Uploader_Service + * @throws Mage_Core_Exception + */ + public function uploadJsFile($type, $theme) + { + /** @var $fileUploader Mage_Core_Model_File_Uploader */ + $fileUploader = Mage::getObjectManager()->get('Mage_Core_Model_File_Uploader', array($type)); + $fileUploader->setAllowedExtensions(array('js')); + $fileUploader->setAllowRenameFiles(true); + $fileUploader->setAllowCreateFolders(true); + + $isValidFileSize = $this->_validateFileSize($fileUploader->getFileSize(), $this->getJsUploadMaxSize()); + if (!$isValidFileSize) { + Mage::throwException($this->_objectManager->get('Mage_Core_Helper_Data')->__( + 'JS file size should be less than %sM.', $this->getJsUploadMaxSizeInMb() + )); + } + + $file = $fileUploader->validateFile(); + $this->setFilePath($file['tmp_name']); + $file['content'] = $this->getFileContent(); + + $this->_filesJs->saveJsFile($theme, $file, true); + + return $this; + } + /** * Get uploaded file content * @@ -122,9 +185,30 @@ class Mage_Theme_Model_Uploader_Service extends Mage_Core_Model_Abstract * @return int */ public function getCssUploadMaxSize() + { + return $this->_getMaxUploadSize(self::XML_PATH_CSS_UPLOAD_LIMIT); + } + + /** + * Get js upload max size + * + * @return int + */ + public function getJsUploadMaxSize() + { + return $this->_getMaxUploadSize(self::XML_PATH_JS_UPLOAD_LIMIT); + } + + /** + * Get max upload size + * + * @param string $node + * @return int + */ + protected function _getMaxUploadSize($node) { $maxCssUploadSize = $this->_fileSize->convertSizeToInteger( - (string)Mage::getConfig()->getNode(self::XML_PATH_CSS_UPLOAD_LIMIT) + (string)Mage::getConfig()->getNode($node) ); $maxIniUploadSize = $this->_fileSize->getMaxFileSize(); return min($maxCssUploadSize, $maxIniUploadSize); @@ -141,16 +225,27 @@ class Mage_Theme_Model_Uploader_Service extends Mage_Core_Model_Abstract } /** - * Validate CSS max file size + * Get js upload max size in megabytes + * + * @return float + */ + public function getJsUploadMaxSizeInMb() + { + return $this->_fileSize->getFileSizeInMb($this->getJsUploadMaxSize()); + } + + /** + * Validate max file size * * @param int $fileSize - * @return Mage_Theme_Model_Uploader_Service + * @param int $maxFileSize + * @return bool */ - protected function _validateCssMaxFileSize($fileSize) + protected function _validateFileSize($fileSize, $maxFileSize) { - if ($fileSize > $this->getCssUploadMaxSize()) { - Mage::throwException("File size should be less than {$this->getCssUploadMaxSizeInMb()}M."); + if ($fileSize > $maxFileSize) { + return false; } - return $this; + return true; } } diff --git a/app/code/core/Mage/Theme/Model/Wysiwyg/Storage.php b/app/code/core/Mage/Theme/Model/Wysiwyg/Storage.php new file mode 100644 index 0000000000000000000000000000000000000000..9d1f615df372050cf8db7fd5e79c64a7672fdb28 --- /dev/null +++ b/app/code/core/Mage/Theme/Model/Wysiwyg/Storage.php @@ -0,0 +1,315 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Theme + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Theme wysiwyg storage model + */ +class Mage_Theme_Model_Wysiwyg_Storage +{ + /** + * Type font + */ + const TYPE_FONT = 'font'; + + /** + * Type image + */ + const TYPE_IMAGE = 'image'; + + /** + * Directory for image thumbnail + */ + const THUMBNAIL_DIRECTORY = '.thumbnail'; + + /** + * Image thumbnail width + */ + const THUMBNAIL_WIDTH = 100; + + /** + * Image thumbnail height + */ + const THUMBNAIL_HEIGHT = 100; + + /** + * Directory name regular expression + */ + const DIRECTORY_NAME_REGEXP = '/^[a-z0-9\-\_]+$/si'; + + /** + * @var Magento_Filesystem + */ + protected $_filesystem; + + /** + * Storage helper + * + * @var Mage_Theme_Helper_Storage + */ + protected $_helper; + + /** + * @var Magento_ObjectManager + */ + protected $_objectManager; + + /** + * Initialize dependencies + * + * @param Magento_Filesystem $filesystem + * @param Mage_Theme_Helper_Storage $helper + * @param Magento_ObjectManager $objectManager + */ + public function __construct( + Magento_Filesystem $filesystem, + Mage_Theme_Helper_Storage $helper, + Magento_ObjectManager $objectManager + ) { + $this->_filesystem = $filesystem; + $this->_filesystem->setIsAllowCreateDirectories(true); + $this->_helper = $helper; + $this->_objectManager = $objectManager; + } + + /** + * Upload file + * + * @param string $targetPath + * @return bool + * @throws Mage_Core_Exception + */ + public function uploadFile($targetPath) + { + /** @var $uploader Mage_Core_Model_File_Uploader */ + $uploader = $this->_objectManager->create('Mage_Core_Model_File_Uploader', array('file')); + $uploader->setAllowedExtensions($this->_helper->getAllowedExtensionsByType()); + $uploader->setAllowRenameFiles(true); + $uploader->setFilesDispersion(false); + $result = $uploader->save($targetPath); + + if (!$result) { + Mage::throwException($this->_helper->__('Cannot upload file.') ); + } + + $this->_createThumbnail( + $targetPath . Magento_Filesystem::DIRECTORY_SEPARATOR . $uploader->getUploadedFileName() + ); + + $result['cookie'] = array( + 'name' => $this->_helper->getSession()->getSessionName(), + 'value' => $this->_helper->getSession()->getSessionId(), + 'lifetime' => $this->_helper->getSession()->getCookieLifetime(), + 'path' => $this->_helper->getSession()->getCookiePath(), + 'domain' => $this->_helper->getSession()->getCookieDomain() + ); + + return $result; + } + + /** + * Create thumbnail for image and save it to thumbnails directory + * + * @param string $source + * @return bool|string Resized filepath or false if errors were occurred + */ + public function _createThumbnail($source) + { + if (self::TYPE_IMAGE != $this->_helper->getStorageType() || !$this->_filesystem->isFile($source) + || !$this->_filesystem->isReadable($source) + ) { + return false; + } + $thumbnailDir = $this->_helper->getThumbnailDirectory($source); + $thumbnailPath = $thumbnailDir . Magento_Filesystem::DIRECTORY_SEPARATOR . pathinfo($source, PATHINFO_BASENAME); + try { + $this->_filesystem->ensureDirectoryExists($thumbnailDir); + $adapter = $this->_objectManager->get('Mage_Core_Helper_Data')->getImageAdapterType(); + $image = Varien_Image_Adapter::factory($adapter); + $image->open($source); + $image->keepAspectRatio(true); + $image->resize(self::THUMBNAIL_WIDTH, self::THUMBNAIL_HEIGHT); + $image->save($thumbnailPath); + } catch (Magento_Filesystem_Exception $e) { + $this->_objectManager->get('Mage_Core_Model_Logger')->logException($e); + return false; + } + + if ($this->_filesystem->isFile($thumbnailPath)) { + return $thumbnailPath; + } + return false; + } + + /** + * Create folder + * + * @param string $name + * @param string $path + * @return array + * @throws Mage_Core_Exception + */ + public function createFolder($name, $path) + { + if (!preg_match(self::DIRECTORY_NAME_REGEXP, $name)) { + Mage::throwException($this->_helper->__('Invalid folder name.')); + } + if (!$this->_filesystem->isWritable($path)) { + $path = $this->_helper->getStorageRoot(); + } + + $newPath = $path . Magento_Filesystem::DIRECTORY_SEPARATOR . $name; + + if ($this->_filesystem->has($newPath)) { + Mage::throwException($this->_helper->__('A directory with the same name already exists.')); + } + + $this->_filesystem->ensureDirectoryExists($newPath); + + $result = array( + 'name' => $name, + 'short_name' => $this->_helper->getShortFilename($name), + 'path' => str_replace($this->_helper->getStorageRoot(), '', $newPath), + 'id' => $this->_helper->convertPathToId($newPath) + ); + + return $result; + } + + /** + * Delete file + * + * @param string $file + * @return Mage_Theme_Model_Wysiwyg_Storage + */ + public function deleteFile($file) + { + $file = $this->_helper->urlDecode($file); + $path = $this->_helper->getSession()->getStoragePath(); + + $_filePath = $this->_filesystem->getAbsolutePath($path . Magento_Filesystem::DIRECTORY_SEPARATOR . $file); + $_thumbnailPath = $this->_helper->getThumbnailDirectory($_filePath) + . Magento_Filesystem::DIRECTORY_SEPARATOR + . $file; + + if ($this->_filesystem->isPathInDirectory($_filePath, $path) + && $this->_filesystem->isPathInDirectory($_filePath, $this->_helper->getStorageRoot()) + ) { + $this->_filesystem->delete($_filePath); + $this->_filesystem->delete($_thumbnailPath); + } + return $this; + } + + /** + * Get directory collection + * + * @param string $currentPath + * @return array + * @throws Mage_Core_Exception + */ + public function getDirsCollection($currentPath) + { + if (!$this->_filesystem->has($currentPath)) { + Mage::throwException($this->_helper->__('A directory with the name not exists.')); + } + + $paths = $this->_filesystem->searchKeys($currentPath, '*'); + $directories = array(); + foreach ($paths as $path) { + if ($this->_filesystem->isDirectory($path)) { + $directories[] = $path; + } + } + return $directories; + } + + /** + * Get files collection + * + * @return array + */ + public function getFilesCollection() + { + $paths = $this->_filesystem->searchKeys($this->_helper->getCurrentPath(), '*'); + $files = array(); + $requestParams = $this->_helper->getRequestParams(); + $storageType = $this->_helper->getStorageType(); + foreach ($paths as $path) { + if (!$this->_filesystem->isFile($path)) { + continue; + } + $fileName = pathinfo($path, PATHINFO_BASENAME); + $file = array( + 'text' => $fileName, + 'id' => $this->_helper->urlEncode($fileName) + ); + if (self::TYPE_IMAGE == $storageType) { + $requestParams['file'] = $fileName; + $file['thumbnailParams'] = $requestParams; + } + $files[] = $file; + } + return $files; + } + + /** + * Get directories tree array + * + * @return array + */ + public function getTreeArray() + { + $directories = $this->getDirsCollection($this->_helper->getCurrentPath()); + $resultArray = array(); + foreach ($directories as $path) { + $resultArray[] = array( + 'text' => $this->_helper->getShortFilename(pathinfo($path, PATHINFO_BASENAME), 20), + 'id' => $this->_helper->convertPathToId($path), + 'cls' => 'folder' + ); + } + return $resultArray; + } + + /** + * Delete directory + * + * @param string $path + * @return bool + * @throws Mage_Core_Exception + */ + public function deleteDirectory($path) + { + $rootCmp = rtrim($this->_helper->getStorageRoot(), Magento_Filesystem::DIRECTORY_SEPARATOR); + $pathCmp = rtrim($path, Magento_Filesystem::DIRECTORY_SEPARATOR); + + if ($rootCmp == $pathCmp) { + Mage::throwException($this->_helper->__('Cannot delete root directory %s.', $path)); + } + + return $this->_filesystem->delete($path); + } +} diff --git a/app/code/core/Mage/Theme/controllers/Adminhtml/System/Design/ThemeController.php b/app/code/core/Mage/Theme/controllers/Adminhtml/System/Design/ThemeController.php index d78ec42811c0f0f4377e2fab70e5fd249545d48b..673a3d9c4499cc087bf0a2790df348150d2ea9aa 100644 --- a/app/code/core/Mage/Theme/controllers/Adminhtml/System/Design/ThemeController.php +++ b/app/code/core/Mage/Theme/controllers/Adminhtml/System/Design/ThemeController.php @@ -29,40 +29,6 @@ */ class Mage_Theme_Adminhtml_System_Design_ThemeController extends Mage_Adminhtml_Controller_Action { - /** - * Theme service model - * - * @var Mage_Theme_Model_Uploader_Service - */ - protected $_serviceModel; - - /** - * @param Mage_Core_Controller_Request_Http $request - * @param Mage_Core_Controller_Response_Http $response - * @param string $areaCode - * @param Magento_ObjectManager $objectManager - * @param Mage_Core_Controller_Varien_Front $frontController - * @param Mage_Core_Model_Layout_Factory $layoutFactory - * @param Mage_Theme_Model_Uploader_Service $service - * @param array $invokeArgs - */ - public function __construct( - Mage_Core_Controller_Request_Http $request, - Mage_Core_Controller_Response_Http $response, - $areaCode = null, - Magento_ObjectManager $objectManager, - Mage_Core_Controller_Varien_Front $frontController, - Mage_Core_Model_Layout_Factory $layoutFactory, - Mage_Theme_Model_Uploader_Service $service, - array $invokeArgs = array() - ) { - $this->_serviceModel = $service; - - parent::__construct($request, $response, $areaCode, $objectManager, $frontController, $layoutFactory, - $invokeArgs - ); - } - /** * Index action */ @@ -79,7 +45,7 @@ class Mage_Theme_Adminhtml_System_Design_ThemeController extends Mage_Adminhtml_ */ public function gridAction() { - $this->loadLayout(); + $this->loadLayout(false); $this->renderLayout(); } @@ -103,10 +69,16 @@ class Mage_Theme_Adminhtml_System_Design_ThemeController extends Mage_Adminhtml_ if ($themeId && !$theme->load($themeId)->getId()) { Mage::throwException($this->__('Theme was not found.')); } + /** @var $cssFileModel Mage_Core_Model_Theme_Customization_Files_Css */ + $cssFileModel = $this->_objectManager->create('Mage_Core_Model_Theme_Customization_Files_Css'); + /** @var $jsFileModel Mage_Core_Model_Theme_Customization_Files_Js */ + $jsFileModel = $this->_objectManager->create('Mage_Core_Model_Theme_Customization_Files_Js'); + $theme->setCustomization($cssFileModel)->setCustomization($jsFileModel); + + $jsFileModel->removeTemporaryFiles($theme); Mage::register('current_theme', $theme); $this->loadLayout(); - /** @var $tab Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Css */ $tab = $this->getLayout()->getBlock('theme_edit_tabs_tab_css_tab'); if ($tab && $tab->canShowTab()) { @@ -136,15 +108,27 @@ class Mage_Theme_Adminhtml_System_Design_ThemeController extends Mage_Adminhtml_ $redirectBack = (bool)$this->getRequest()->getParam('back', false); /** @var $theme Mage_Core_Model_Theme */ $theme = $this->_objectManager->create('Mage_Core_Model_Theme'); - /** @var $themeCss Mage_Core_Model_Theme_Files_Css */ - $themeCss = $this->_objectManager->create('Mage_Core_Model_Theme_Files_Css'); + /** @var $themeCss Mage_Core_Model_Theme_Customization_Files_Css */ + $themeCss = $this->_objectManager->create('Mage_Core_Model_Theme_Customization_Files_Css'); + /** @var $themeJs Mage_Core_Model_Theme_Customization_Files_Js */ + $themeJs = $this->_objectManager->create('Mage_Core_Model_Theme_Customization_Files_Js'); try { if ($this->getRequest()->getPost()) { $themeData = $this->getRequest()->getParam('theme'); $customCssData = $this->getRequest()->getParam('custom_css_content'); + $uploadJsFiles = (array)$this->getRequest()->getParam('js_uploaded_files'); + $removeJsFiles = (array)$this->getRequest()->getParam('js_removed_files'); + $reorderJsFiles = array_keys($this->getRequest()->getParam('js_order', array())); + + $themeCss->setDataForSave($customCssData); + $theme->setCustomization($themeCss); + + $themeJs->setDataForSave($uploadJsFiles); + $themeJs->setDataForDelete($removeJsFiles); + $themeJs->setJsOrderData($reorderJsFiles); + $theme->setCustomization($themeJs); $theme->saveFormData($themeData); - $themeCss->saveFormData($theme, $customCssData); $this->_getSession()->addSuccess($this->__('The theme has been saved.')); } @@ -199,7 +183,8 @@ class Mage_Theme_Adminhtml_System_Design_ThemeController extends Mage_Adminhtml_ */ public function uploadCssAction() { - $serviceModel = $this->_serviceModel; + /** @var $serviceModel Mage_Theme_Model_Uploader_Service */ + $serviceModel = $this->_objectManager->get('Mage_Theme_Model_Uploader_Service'); try { $cssFileContent = $serviceModel->uploadCssFile('css_file_uploader')->getFileContent(); $result = array('error' => false, 'content' => $cssFileContent); @@ -212,6 +197,76 @@ class Mage_Theme_Adminhtml_System_Design_ThemeController extends Mage_Adminhtml_ $this->getResponse()->setBody($this->_objectManager->get('Mage_Core_Helper_Data')->jsonEncode($result)); } + /** + * Upload js file + * + * @throws Mage_Core_Exception + */ + public function uploadJsAction() + { + /** @var $serviceModel Mage_Theme_Model_Uploader_Service */ + $serviceModel = $this->_objectManager->get('Mage_Theme_Model_Uploader_Service'); + $themeId = $this->getRequest()->getParam('id'); + try { + /** @var $theme Mage_Core_Model_Theme */ + $theme = $this->_objectManager->create('Mage_Core_Model_Theme')->load($themeId); + if (!$theme->getId()) { + Mage::throwException($this->__('Theme with id "%d" is not found.', $themeId)); + } + $serviceModel->uploadJsFile('js_files_uploader', $theme); + + $this->loadLayout(); + + /** @var $filesJs Mage_Core_Model_Theme_Customization_Files_Js */ + $filesJs = $this->_objectManager->create('Mage_Core_Model_Theme_Customization_Files_Js'); + $customJsFiles = $theme->setCustomization($filesJs) + ->getCustomizationData(Mage_Core_Model_Theme_Customization_Files_Js::TYPE); + + $jsItemsBlock = $this->getLayout()->getBlock('theme_js_file_list'); + $jsItemsBlock->setJsFiles($customJsFiles); + $result = array('content' => $jsItemsBlock->toHtml()); + } catch (Mage_Core_Exception $e) { + $result = array('error' => true, 'message' => $e->getMessage()); + } catch (Exception $e) { + $result = array('error' => true, 'message' => $this->__('Cannot upload js file')); + $this->_objectManager->get('Mage_Core_Model_Logger')->logException($e); + } + $this->getResponse()->setBody($this->_objectManager->get('Mage_Core_Helper_Data')->jsonEncode($result)); + } + + /** + * Download custom css file + */ + public function downloadCustomCssAction() + { + $themeId = $this->getRequest()->getParam('theme_id'); + try { + /** @var $theme Mage_Core_Model_Theme */ + $theme = $this->_objectManager->create('Mage_Core_Model_Theme')->load($themeId); + if (!$theme->getId()) { + throw new InvalidArgumentException('Theme with id ' . $themeId . ' is not found.'); + } + + /** @var $filesCss Mage_Core_Model_Theme_Customization_Files_Css */ + $filesCss = $this->_objectManager->create('Mage_Core_Model_Theme_Customization_Files_Css'); + /** @var $customCssFile Mage_Core_Model_Theme_Files */ + $customCssFile = $theme->setCustomization($filesCss) + ->getCustomizationData(Mage_Core_Model_Theme_Customization_Files_Css::TYPE)->getFirstItem(); + + if ($customCssFile->getContent()) { + $this->_prepareDownloadResponse(Mage_Core_Model_Theme_Customization_Files_Css::FILE_PATH, array( + 'type' => 'filename', + 'value' => $customCssFile->getFullPath() + )); + } + } catch (Exception $e) { + $this->_getSession()->addException($e, + $this->__('File "%s" is not found.', Mage_Core_Model_Theme_Customization_Files_Css::FILE_PATH)); + $this->_redirectUrl($this->_getRefererUrl()); + $this->_objectManager->get('Mage_Core_Model_Logger')->logException($e); + } + } + /** * Download css file */ @@ -244,6 +299,7 @@ class Mage_Theme_Adminhtml_System_Design_ThemeController extends Mage_Adminhtml_ } catch (Exception $e) { $this->_getSession()->addException($e, $this->__('File "%s" is not found.', $fileName)); $this->_redirectUrl($this->_getRefererUrl()); + $this->_objectManager->get('Mage_Core_Model_Logger')->logException($e); } } diff --git a/app/code/core/Mage/Theme/controllers/Adminhtml/System/Design/Wysiwyg/FilesController.php b/app/code/core/Mage/Theme/controllers/Adminhtml/System/Design/Wysiwyg/FilesController.php new file mode 100644 index 0000000000000000000000000000000000000000..3e0777a96efef4bf00214df1d946eda96c81d340 --- /dev/null +++ b/app/code/core/Mage/Theme/controllers/Adminhtml/System/Design/Wysiwyg/FilesController.php @@ -0,0 +1,184 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Theme + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Files controller + */ +class Mage_Theme_Adminhtml_System_Design_Wysiwyg_FilesController extends Mage_Adminhtml_Controller_Action +{ + /** + * Index action + */ + public function indexAction() + { + $this->loadLayout('overlay_popup'); + $this->renderLayout(); + } + + /** + * Tree json action + */ + public function treeJsonAction() + { + try { + $this->getResponse()->setBody( + $this->getLayout()->createBlock('Mage_Theme_Block_Adminhtml_Wysiwyg_Files_Tree') + ->getTreeJson($this->_getStorage()->getTreeArray()) + ); + } catch (Exception $e) { + $this->_objectManager->get('Mage_Core_Model_Logger')->logException($e); + $this->getResponse()->setBody($this->_objectManager->get('Mage_Core_Helper_Data')->jsonEncode(array())); + } + } + + /** + * New folder action + */ + public function newFolderAction() + { + $name = $this->getRequest()->getPost('name'); + try { + $path = $this->_getSession()->getStoragePath(); + $result = $this->_getStorage()->createFolder($name, $path); + } catch (Mage_Core_Exception $e) { + $result = array('error' => true, 'message' => $e->getMessage()); + $this->_redirect('*/*/'); + } catch (Exception $e) { + $result = array('error' => true, 'message' => $this->__('Unknown error')); + $this->_objectManager->get('Mage_Core_Model_Logger')->logException($e); + $this->_redirect('*/*/'); + } + $this->getResponse()->setBody($this->_objectManager->get('Mage_Core_Helper_Data')->jsonEncode($result)); + } + + /** + * Delete folder action + */ + public function deleteFolderAction() + { + try { + $path = $this->_getSession()->getStoragePath(); + $this->_getStorage()->deleteDirectory($path); + } catch (Exception $e) { + $result = array('error' => true, 'message' => $e->getMessage()); + $this->getResponse()->setBody($this->_objectManager->get('Mage_Core_Helper_Data')->jsonEncode($result)); + } + } + + /** + * Contents action + */ + public function contentsAction() + { + try { + $this->loadLayout('empty'); + $this->getLayout()->getBlock('wysiwyg_files.files')->setStorage($this->_getStorage()); + $this->renderLayout(); + + $this->_getSession()->setStoragePath( + $this->_objectManager->get('Mage_Theme_Helper_Storage')->getCurrentPath() + ); + } catch (Exception $e) { + $result = array('error' => true, 'message' => $e->getMessage()); + $this->getResponse()->setBody($this->_objectManager->get('Mage_Core_Helper_Data')->jsonEncode($result)); + } + } + + /** + * Files upload action + */ + public function uploadAction() + { + try { + $path = $this->_getSession()->getStoragePath(); + $result = $this->_getStorage()->uploadFile($path); + } catch (Exception $e) { + $result = array('error' => $e->getMessage(), 'errorcode' => $e->getCode()); + } + $this->getResponse()->setBody($this->_objectManager->get('Mage_Core_Helper_Data')->jsonEncode($result)); + } + + /** + * Preview image action + */ + public function previewImageAction() + { + $file = $this->getRequest()->getParam('file'); + /** @var $helper Mage_Theme_Helper_Storage */ + $helper = $this->_objectManager->get('Mage_Theme_Helper_Storage'); + try { + $this->_prepareDownloadResponse($file, array( + 'type' => 'filename', + 'value' => $helper->getThumbnailPath($file) + )); + } catch (Exception $e) { + $this->_objectManager->get('Mage_Core_Model_Logger')->logException($e); + $this->_redirect('core/index/notfound'); + } + } + + /** + * Delete file from media storage + * @throws Exception + */ + public function deleteFilesAction() + { + try { + if (!$this->getRequest()->isPost()) { + throw new Exception ('Wrong request.'); + } + $files = $this->_objectManager->get('Mage_Core_Helper_Data')->jsonDecode( + $this->getRequest()->getParam('files') + ); + foreach ($files as $file) { + $this->_getStorage()->deleteFile($file); + } + } catch (Exception $e) { + $result = array('error' => true, 'message' => $e->getMessage()); + $this->getResponse()->setBody($this->_objectManager->get('Mage_Core_Helper_Data')->jsonEncode($result)); + } + } + + /** + * Fire when select image + */ + public function onInsertAction() + { + /** @var $helperStorage Mage_Theme_Helper_Storage */ + $helperStorage = $this->_objectManager->get('Mage_Theme_Helper_Storage'); + $this->getResponse()->setBody($helperStorage->getRelativeUrl()); + } + + /** + * Get storage + * + * @return Mage_Theme_Model_Wysiwyg_Storage + */ + protected function _getStorage() + { + return $this->_objectManager->get('Mage_Theme_Model_Wysiwyg_Storage'); + } +} diff --git a/app/code/core/Mage/Theme/etc/config.xml b/app/code/core/Mage/Theme/etc/config.xml index fe7f4b0dd17f85f4ef145e66e0b93b0d7b0a5b39..bc5834bbd49bf553964365968c551e797a20e1c9 100644 --- a/app/code/core/Mage/Theme/etc/config.xml +++ b/app/code/core/Mage/Theme/etc/config.xml @@ -38,6 +38,9 @@ <css> <upload_limit>2M</upload_limit> </css> + <js> + <upload_limit>2M</upload_limit> + </js> </theme> </global> <admin> diff --git a/app/code/core/Mage/Theme/view/adminhtml/browser/content.phtml b/app/code/core/Mage/Theme/view/adminhtml/browser/content.phtml new file mode 100644 index 0000000000000000000000000000000000000000..1a9647ceb557112e9a45fde17028f86a28db2ef4 --- /dev/null +++ b/app/code/core/Mage/Theme/view/adminhtml/browser/content.phtml @@ -0,0 +1,49 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category design + * @package Mage_Theme + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ +?> +<?php +/** + * Wysiwyg Images content template + * + * @var $this Mage_Theme_Block_Adminhtml_Wysiwyg_Files_Content + */ +?> +<?php echo $this->getChildHtml('wysiwyg_files.js') ?> + +<div class="content-header skip-header" id="content_header"> + <table cellspacing="0"> + <tr> + <td><h3 id="content_header_text"><?php echo $this->getHeaderText() ?></h3></td> + <td class="form-buttons"> + <?php echo $this->getButtonsHtml() ?> + </td> + </tr> + </table> +</div> + +<div id="contents-uploader"><?php echo $this->getChildHtml('wysiwyg_files.uploader') ?></div> +<div id="contents"></div> +<div id="contents-newfolder" class="no-display"><?php echo $this->getChildHtml('wysiwyg_files.newfolder') ?></div> diff --git a/app/code/core/Mage/Theme/view/adminhtml/browser/content/files.phtml b/app/code/core/Mage/Theme/view/adminhtml/browser/content/files.phtml new file mode 100644 index 0000000000000000000000000000000000000000..7b4c95a2b98f01ede05366ce05d1668d6e39d494 --- /dev/null +++ b/app/code/core/Mage/Theme/view/adminhtml/browser/content/files.phtml @@ -0,0 +1,45 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category design + * @package Mage_Theme + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ +?> + +<?php +/** @var $this Mage_Theme_Block_Adminhtml_Wysiwyg_Files_Content_Files */ +?> + +<?php if ($this->getFilesCount() > 0): ?> + <?php foreach ($this->getFiles() as $file): ?> + <div class="filecnt file-font" id="<?php echo $file['id'] ?>"> + <p class="nm"> + <?php echo $file['text'] ?> + <?php if (isset($file['thumbnailParams'])): ?> + <img src="<?php echo $this->getUrl('*/*/previewImage', $file['thumbnailParams']) ?>"> + <?php endif; ?> + </p> + </div> + <?php endforeach; ?> +<?php else: ?> + <?php echo $this->__('No files found') ?> +<?php endif; ?> diff --git a/app/code/core/Mage/Theme/view/adminhtml/browser/content/uploader.phtml b/app/code/core/Mage/Theme/view/adminhtml/browser/content/uploader.phtml new file mode 100644 index 0000000000000000000000000000000000000000..75a1f96fb6d60fe90c72ab7d5024f53a36730a55 --- /dev/null +++ b/app/code/core/Mage/Theme/view/adminhtml/browser/content/uploader.phtml @@ -0,0 +1,100 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category design + * @package Mage_Theme + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ +?> +<?php +/** @var $this Mage_Theme_Block_Adminhtml_Wysiwyg_Files_Content_Uploader */ +?> + +<div id="<?php echo $this->getHtmlId() ?>" class="uploader"> + <span class="fileinput-button form-buttons"> + <span><?php echo $this->__('Browse Files...') ?></span> + <input id="fileupload" type="file" name="<?php echo $this->getConfig()->getFileField() ?>" + data-url="<?php echo $this->getConfig()->getUrl() ?>" multiple> + </span> + <div class="clear"></div> + <div class="no-display" id="<?php echo $this->getHtmlId() ?>-template"> + <div id="{{id}}" class="file-row"> + <span class="file-info">{{name}} ({{size}})</span> + <div class="progressbar-container"> + <div class="progressbar upload-progress" style="width: 0%;"></div> + </div> + <div class="clear"></div> + </div> + </div> +</div> + +<script type="text/javascript"> +//<![CDATA[ +(function($) { + $(function () { + $('#fileupload').fileupload({ + dataType: 'json', + formData: { + isAjax: 'true', + form_key: FORM_KEY + }, + sequentialUploads: true, + maxFileSize: <?php echo Mage::getObjectManager()->get('Magento_File_Size')->getMaxFileSize()?>, + add: function(e, data) { + $.each(data.files, function (index, file) { + data.fileId = Math.random().toString(36).substr(2,9); + var progressTmpl = $('#<?php echo $this->getHtmlId(); ?>-template').children(':first').clone(); + progressTmpl.attr('id', data.fileId); + var fileInfoHtml = progressTmpl.html().replace('{{size}}', byteConvert(file.size)) + .replace('{{name}}', file.name); + progressTmpl.html(fileInfoHtml) ; + + progressTmpl.appendTo('#<?php echo $this->getHtmlId() ?>'); + + }); + $(this).fileupload('process', data).done(function () { + data.submit(); + }); + }, + done: function(e, data) { + var progressSelector = '#' + data.fileId + ' .progressbar-container .progressbar'; + $(progressSelector).css('width','100%'); + if (data.result && !data.result.hasOwnProperty('errorcode')) { + $(progressSelector).removeClass('upload-progress').addClass('upload-success'); + MediabrowserInstance.handleUploadComplete(); + } else { + $(progressSelector).removeClass('upload-progress').addClass('upload-failure'); + } + }, + progress: function(e, data) { + var progress = parseInt(data.loaded / data.total * 100, 10); + var progressSelector = '#' + data.fileId + ' .progressbar-container .progressbar'; + $(progressSelector).css('width', progress + '%'); + }, + fail: function(e, data) { + var progressSelector = '#' + data.fileId + ' .progressbar-container .progressbar'; + $(progressSelector).removeClass('upload-progress').addClass('upload-failure'); + } + }); + }); +})(jQuery); +//]]> +</script> diff --git a/app/code/core/Mage/Theme/view/adminhtml/css/theme.css b/app/code/core/Mage/Theme/view/adminhtml/css/theme.css new file mode 100644 index 0000000000000000000000000000000000000000..61c39c3b3d2fdeca68aed0bbea81ed55ea9e32dc --- /dev/null +++ b/app/code/core/Mage/Theme/view/adminhtml/css/theme.css @@ -0,0 +1,73 @@ +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category design + * @package Mage_Theme + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ + +.js-files-container .js-file { + background: url("Mage_Theme::/images/js_icon.gif") no-repeat scroll 5px 50% #ECECEC; + border: 1px solid #CCCCCC; + padding: 5px 5px 10px 30px; + margin-left: 10px; +} + +.js-files-container li { + padding: 1px 1px 1px 14px; + position: relative; + z-index: 1; +} + +.js-files-container li:after { + clear: both; + content: "."; + display: block; + font-size: 0; + height: 0; + line-height: 0; + overflow: hidden; +} + +.js-files-container li .up, .js-files-container li .down { + border: 1px solid #CCCCCC; + cursor: pointer; + display: block; + height: 15px; + left: 0; + margin: 2px 5px; + outline: medium none; + overflow: hidden; + position: absolute; + top: -1px; + width: 15px; +} +.js-files-container li .up { + background: url("Mage_Theme::/images/bkg_movable-arrows.png") no-repeat scroll 50% 3px #ECECEC; +} + +.js-files-container li .down { + background: url("Mage_Theme::/images/bkg_movable-arrows.png") no-repeat scroll 50% -27px #ECECEC; + bottom: 0; + top: auto; +} +.js-files-container .js-file .remove-js{ + float: right; +} diff --git a/app/code/core/Mage/Theme/view/adminhtml/images/bkg_movable-arrows.png b/app/code/core/Mage/Theme/view/adminhtml/images/bkg_movable-arrows.png new file mode 100644 index 0000000000000000000000000000000000000000..8e55d39feb12a53533d5b53cec7d219862696b2d Binary files /dev/null and b/app/code/core/Mage/Theme/view/adminhtml/images/bkg_movable-arrows.png differ diff --git a/app/code/core/Mage/Theme/view/adminhtml/images/js_icon.gif b/app/code/core/Mage/Theme/view/adminhtml/images/js_icon.gif new file mode 100644 index 0000000000000000000000000000000000000000..3617bedc7ff42d40f1d14d94f9641516b6f0f552 Binary files /dev/null and b/app/code/core/Mage/Theme/view/adminhtml/images/js_icon.gif differ diff --git a/app/code/core/Mage/Theme/view/adminhtml/js/sortable.js b/app/code/core/Mage/Theme/view/adminhtml/js/sortable.js new file mode 100644 index 0000000000000000000000000000000000000000..7369c8ea87987dcc2f77e66e643a354264e3c1dd --- /dev/null +++ b/app/code/core/Mage/Theme/view/adminhtml/js/sortable.js @@ -0,0 +1,66 @@ +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Theme + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ + +(function($) { + /** + * Widget panel + */ + $.widget('mage.sortable', $.ui.sortable, { + options: { + moveUpEvent: 'moveUp', + moveDownEvent: 'moveDown' + }, + + _create: function() { + this._super(); + this.initButtons(); + this.bind(); + }, + + initButtons: function() { + this.element.find('input.up').on('click', $.proxy(function(event){ + $('body').trigger(this.options.moveUpEvent, {item:$(event.target).parent('li')}); + }, this)); + this.element.find('input.down').on('click', $.proxy(function(event){ + $('body').trigger(this.options.moveDownEvent, {item:$(event.target).parent('li')}); + }, this)); + }, + + bind: function() { + var $body = $('body'); + $body.on(this.options.moveUpEvent, $.proxy(this._onMoveUp, this)); + $body.on(this.options.moveDownEvent, $.proxy(this._onMoveDown, this)); + }, + + _onMoveUp: function(event, data) { + data.item.insertBefore(data.item.prev()); + }, + + _onMoveDown: function(event, data) { + data.item.insertAfter(data.item.next()); + } + }); + +})(jQuery); diff --git a/app/code/core/Mage/Theme/view/adminhtml/layout.xml b/app/code/core/Mage/Theme/view/adminhtml/layout.xml index 417502ee3405a82904602dad47de15baea09960c..8a30e08142003b73f705f65981f5eb9fa837da31 100644 --- a/app/code/core/Mage/Theme/view/adminhtml/layout.xml +++ b/app/code/core/Mage/Theme/view/adminhtml/layout.xml @@ -27,25 +27,118 @@ --> <layout> <adminhtml_system_design_theme_index> + <update handle="formkey"/> + <update handle="adminhtml_system_design_theme_block"/> <reference name="content"> - <block type="Mage_Theme_Block_Adminhtml_System_Design_Theme" name="design_theme"> - <block type="Mage_Theme_Block_Adminhtml_System_Design_Theme_Grid" name="theme_grid" as="grid"/> - </block> + <block type="Mage_Theme_Block_Adminhtml_System_Design_Theme" name="design_theme"/> </reference> </adminhtml_system_design_theme_index> <adminhtml_system_design_theme_grid> - <container name="root" label="Root" output="1"> - <block type="Mage_Theme_Block_Adminhtml_System_Design_Theme_Grid" name="theme_grid" as="grid"/> - </container> + <update handle="formkey"/> + <update handle="adminhtml_system_design_theme_block"/> + <container label="Mage Theme Design Container" name="design_theme" output="1"/> </adminhtml_system_design_theme_grid> + <adminhtml_system_design_theme_block> + <reference name="design_theme"> + <block type="Mage_Backend_Block_Widget_Grid" name="theme.grid" as="grid"> + <arguments> + <id>theme_grid</id> + <dataSource type="object">Mage_Core_Model_Resource_Theme_Grid_Collection</dataSource> + <save_parameters_in_session>1</save_parameters_in_session> + <use_ajax>1</use_ajax> + <grid_url type="url"> + <path>*/*/grid</path> + <params> + <_current>1</_current> + </params> + </grid_url> + </arguments> + <block type="Mage_Backend_Block_Widget_Grid_ColumnSet" as="grid.columnSet" name="theme.grid.columnSet"> + <arguments> + <id>theme_grid</id> + <rowUrl> + <path>*/*/edit</path> + <extraParamsTemplate> + <id>getId</id> + </extraParamsTemplate> + </rowUrl> + </arguments> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="theme_title"> + <arguments> + <header translate="true" module="Mage_Theme">Theme Title</header> + <index>theme_title</index> + <filter_index>main_table.theme_title</filter_index> + <column_css_class>theme-title</column_css_class> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="parent_theme_title"> + <arguments> + <header translate="true" module="Mage_Theme">Parent Theme</header> + <index>parent_theme_title</index> + <filter_index>parent.theme_title</filter_index> + <column_css_class>parent-theme-title</column_css_class> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="theme_path"> + <arguments> + <header translate="true" module="Mage_Theme">Theme Path</header> + <index>theme_path</index> + <filter_index>main_table.theme_path</filter_index> + <column_css_class>theme-path</column_css_class> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="theme_version"> + <arguments> + <header translate="true" module="Mage_Theme">Theme Version</header> + <index>theme_version</index> + <filter_index>main_table.theme_version</filter_index> + <column_css_class>theme-version</column_css_class> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="magento_version_from"> + <arguments> + <header translate="true" module="Mage_Theme">Magento Version From</header> + <index>magento_version_from</index> + <filter_index>main_table.magento_version_from</filter_index> + <column_css_class>magento-version-from</column_css_class> + </arguments> + </block> + <block type="Mage_Backend_Block_Widget_Grid_Column" as="magento_version_to"> + <arguments> + <header translate="true" module="Mage_Theme">Magento Version To</header> + <index>magento_version_to</index> + <filter_index>main_table.magento_version_to</filter_index> + <column_css_class>magento-version-to</column_css_class> + </arguments> + </block> + </block> + </block> + </reference> + </adminhtml_system_design_theme_block> + <adminhtml_system_design_theme_edit> <reference name="head"> + <action method="setCanLoadExtJs"><flag>1</flag></action> + <action method="setCanLoadTinyMce"><flag>1</flag></action> + + <action method="addCss"><file>Mage_Adminhtml::jquery/fileUploader/css/jquery.fileupload-ui.css</file></action> <action method="addJs"><file>Mage_Adminhtml::jquery/fileUploader/jquery.iframe-transport.js</file></action> <action method="addJs"><file>Mage_Adminhtml::jquery/fileUploader/jquery.fileupload.js</file></action> + <action method="addJs"><file>Mage_Adminhtml::jquery/fileUploader/load-image.min.js</file></action> + <action method="addJs"><file>Mage_Adminhtml::jquery/fileUploader/canvas-to-blob.min.js</file></action> + <action method="addJs"><file>Mage_Adminhtml::jquery/fileUploader/jquery.fileupload-fp.js</file></action> + + <action method="addJs"><file>mage/adminhtml/browser.js</file></action> + + <action method="addJs"><file>Mage_Adminhtml::jquery/fileUploader/jquery.fileupload-ui.js</file></action> <action method="addJs"><file>Mage_Theme::js/form.js</file></action> + <action method="addJs"><file>Mage_Theme::js/sortable.js</file></action> + <action method="addCss"><file>Mage_Theme::css/theme.css</file></action> + <action method="addCss"><file>prototype/windows/themes/default.css</file></action> + <action method="addCss"><file>Mage_Core::prototype/magento.css</file></action> </reference> <reference name="content"> <block type="Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit" name="theme_edit"/> @@ -54,6 +147,11 @@ <block type="Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tabs" name="theme_edit_tabs"> <block template="tabs/css.phtml" type="Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Css" name="theme_edit_tabs_tab_css_tab" /> + <block template="tabs/js.phtml" type="Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Js" name="theme_edit_tabs_tab_js_tab"> + <block template="Mage_Theme::tabs/fieldset/js.phtml" type="Mage_Backend_Block_Widget_Form_Renderer_Fieldset" name="theme_edit_tabs_tab_js_tab_content"> + <block template="Mage_Theme::tabs/fieldset/js_items.phtml" type="Mage_Backend_Block_Template" name="theme_edit_tabs_tab_js_items" as="theme.edit.tabs.tab.js.items" /> + </block> + </block> <action method="addTab"> <name>general_section</name> @@ -61,8 +159,37 @@ </action> <action method="addTab"> <name>css_tab</name> - <block>theme_edit_tabs_tab_css_tab</block></action> + <block>theme_edit_tabs_tab_css_tab</block> + </action> + <action method="addTab"> + <name>js_tab</name> + <block>theme_edit_tabs_tab_js_tab</block> + </action> </block> </reference> </adminhtml_system_design_theme_edit> + + <adminhtml_system_design_theme_uploadjs> + <container name="root" label="Root" output="1"> + <block template="Mage_Theme::tabs/fieldset/js_items.phtml" type="Mage_Backend_Block_Template" name="theme_js_file_list" as="js_files" /> + </container> + </adminhtml_system_design_theme_uploadjs> + + <adminhtml_system_design_wysiwyg_files_index> + <remove name="footer" /> + <remove name="head" /> + <reference name="left"> + <block name="wysiwyg_files.js" type="Mage_Theme_Block_Adminhtml_Wysiwyg_Files_Content" template="Mage_Adminhtml::cms/browser/js.phtml" /> + <block name="wysiwyg_files.tree" type="Mage_Theme_Block_Adminhtml_Wysiwyg_Files_Tree" template="Mage_Adminhtml::cms/browser/tree.phtml" /> + </reference> + <reference name="content"> + <block name="wysiwyg_files.content" type="Mage_Theme_Block_Adminhtml_Wysiwyg_Files_Content" template="browser/content.phtml"> + <block name="wysiwyg_files.uploader" type="Mage_Theme_Block_Adminhtml_Wysiwyg_Files_Content_Uploader" template="browser/content/uploader.phtml" /> + </block> + </reference> + </adminhtml_system_design_wysiwyg_files_index> + + <adminhtml_system_design_wysiwyg_files_contents> + <block name="wysiwyg_files.files" type="Mage_Theme_Block_Adminhtml_Wysiwyg_Files_Content_Files" template="browser/content/files.phtml" output="1" /> + </adminhtml_system_design_wysiwyg_files_contents> </layout> diff --git a/app/code/core/Mage/Theme/view/adminhtml/tabs/css.phtml b/app/code/core/Mage/Theme/view/adminhtml/tabs/css.phtml index 50a3be32295deef9c10c8dd83d5ac84119431790..7a2091537223693d83e2eb0694b18d69323da88f 100644 --- a/app/code/core/Mage/Theme/view/adminhtml/tabs/css.phtml +++ b/app/code/core/Mage/Theme/view/adminhtml/tabs/css.phtml @@ -19,7 +19,7 @@ * needs please refer to http://www.magentocommerce.com for more information. * * @category design - * @package Mage_DesignEditor + * @package Mage_Theme * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ @@ -36,6 +36,7 @@ dataType: 'json', replaceFileInput: false, url : '<?php echo $this->getUrl('*/system_design_theme/uploadcss') ?>', + acceptFileTypes: /(.|\/)(css)$/i, /** * Add data @@ -71,6 +72,16 @@ contentArea.val(data.result.content); contentArea.trigger('focusout'); } + }, + + /** + * Fail event + * @param e + * @param data + */ + fail: function(e, data) { + $(this).val(''); + alert($.mage.__('File extension not known or unsupported type.')); } }); diff --git a/app/code/core/Mage/Theme/view/adminhtml/tabs/fieldset/js.phtml b/app/code/core/Mage/Theme/view/adminhtml/tabs/fieldset/js.phtml new file mode 100644 index 0000000000000000000000000000000000000000..21e0a45c95dfc2b2cb5e9bbe67ef0545290876e0 --- /dev/null +++ b/app/code/core/Mage/Theme/view/adminhtml/tabs/fieldset/js.phtml @@ -0,0 +1,53 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category design + * @package Mage_Theme + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ +?> +<?php /** @var $this Mage_Backend_Block_Widget_Form_Renderer_Fieldset */ ?> + +<div id="js-file-uploader" class="uploader"> +</div> + +<div class="no-display" id="js-file-uploader-template"> + <div id="{{id}}" class="file-row"> + <span class="file-info">{{name}} ({{size}})</span> + <div class="progressbar-container"> + <div class="progressbar upload-progress" style="width: 0%;"></div> + </div> + <div class="clear"></div> + </div> +</div> + +<ul class="js-files-container ui-sortable"> + <?php echo $this->getChildBlock('theme.edit.tabs.tab.js.items')->setJsFiles($this->getJsFiles())->toHtml(); ?> +</ul> + +<script type="text/javascript"> +(function($) { + $(function() { + $('.ui-sortable').sortable(); + $('.ui-sortable').disableSelection(); + }); +})(jQuery); +</script> diff --git a/app/code/core/Mage/Theme/view/adminhtml/tabs/fieldset/js_items.phtml b/app/code/core/Mage/Theme/view/adminhtml/tabs/fieldset/js_items.phtml new file mode 100644 index 0000000000000000000000000000000000000000..d4f696d99c1a06230024e3139bb1655748759e35 --- /dev/null +++ b/app/code/core/Mage/Theme/view/adminhtml/tabs/fieldset/js_items.phtml @@ -0,0 +1,48 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category design + * @package Mage_Theme + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ +?> +<?php if (!$this->getJsFiles()->count()): ?> + <li><?php echo $this->__('No files found') ?></li> +<?php else: ?> + <?php /** @var $file Mage_Core_Model_Theme_Files */ ?> + <?php foreach ($this->getJsFiles() as $file): ?> + <li> + <input class="up" type="button" value=""> + <input class="down" type="button" value=""> + <input type="hidden" name="js_order[<?php echo $file->getFileName() ?>]" value="1"> + <div class="js-file"> + <?php echo $file->getFileName() ?> + <div class="remove-js"> + <input type="checkbox" id="remove_js_files_<?php echo $file->getId() ?>" name="js_removed_files[]" value="<?php echo $file->getId() ?>" /> + <label for="remove_js_files_<?php echo $file->getId() ?>"><?php echo $this->__('Remove') ?></label> + </div> + </div> + <?php if ($file->getIsTemporary()): ?> + <input type="hidden" name="js_uploaded_files[]" value="<?php echo $file->getId(); ?>" /> + <?php endif; ?> + </li> + <?php endforeach; ?> +<?php endif; ?> diff --git a/app/code/core/Mage/Theme/view/adminhtml/tabs/js.phtml b/app/code/core/Mage/Theme/view/adminhtml/tabs/js.phtml new file mode 100644 index 0000000000000000000000000000000000000000..32ce6fcb1a6b9b70d4b24ea7dbf486dc6e79061e --- /dev/null +++ b/app/code/core/Mage/Theme/view/adminhtml/tabs/js.phtml @@ -0,0 +1,121 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category design + * @package Mage_Theme + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ +?> +<?php /** @var $this Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Js */ ?> +<?php echo $this->getFormHtml(); ?> + +<script type="text/javascript"> + (function ($) { + + $('#js_files_uploader').fileupload({ + dataType: 'json', + replaceFileInput: false, + sequentialUploads: true, + url : '<?php echo $this->getJsUploadUrl(); ?>', + + /** + * Add data + * @param e + * @param data + */ + add: function (e, data) { + $.each(data.files, function (index, file) { + data.fileId = Math.random().toString(36).substr(2,9); + var progressTmpl = $('#js-file-uploader-template').children(':first').clone(); + progressTmpl.attr('id', data.fileId); + var fileInfoHtml = progressTmpl.html().replace('{{size}}', byteConvert(file.size)) + .replace('{{name}}', file.name); + progressTmpl.html(fileInfoHtml) ; + progressTmpl.appendTo('#js-file-uploader'); + }); + + var uploadButton = $('#js_uploader_button'); + uploadButton.removeAttr('disabled'); + + uploadButton.click(function () { + $('#messages').html(''); + $(this).attr('disabled', 'disabled'); + + data.submit(); + }); + }, + + /** + * On done event + * @param e + * @param data + */ + done: function (e, data) { + var progressSelector = '#' + data.fileId + ' .progressbar-container .progressbar'; + $(progressSelector).css('width','100%'); + + var contentArea = $('.js-files-container'); + $(this).val(''); + + if (!data.result.error) { + $(progressSelector).removeClass('upload-progress').addClass('upload-success') + $('#' + data.fileId).delay(2000).fadeOut(2000); + contentArea.html(data.result.content); + } else { + $(progressSelector).removeClass('upload-progress').addClass('upload-failure'); + } + + $('.ui-sortable').sortable('initButtons'); + }, + + /** + * On progress + * @param e + * @param data + */ + progress: function(e, data) { + var progress = parseInt(data.loaded / data.total * 100, 10); + var progressSelector = '#' + data.fileId + ' .progressbar-container .progressbar'; + $(progressSelector).css('width', progress + '%'); + }, + + /** + * Fail event + * @param e + * @param data + */ + fail: function(e, data) { + var progressSelector = '#' + data.fileId + ' .progressbar-container .progressbar'; + $(progressSelector).removeClass('upload-progress').addClass('upload-failure'); + + $(this).val(''); + alert($.mage.__('File extension not known or unsupported type.')); + } + }); + + $('#js_files_uploader').click(function () { + /** Unbind click event on file change */ + $('#js-file-uploader').html(''); + $('#js_uploader_button').unbind('click'); + }); + + })(jQuery); +</script> diff --git a/app/code/core/Mage/User/Block/User.php b/app/code/core/Mage/User/Block/User.php index c2224e96f2ef27379087525818d71ca896cdb585..ad158636dced80b6fc28b70249e6a8eb3d85cf7b 100644 --- a/app/code/core/Mage/User/Block/User.php +++ b/app/code/core/Mage/User/Block/User.php @@ -35,10 +35,12 @@ class Mage_User_Block_User extends Mage_Backend_Block_Widget_Grid_Container { protected function _construct() { - $this->_controller = 'user'; - $this->_blockGroup = 'Mage_User'; - $this->_headerText = Mage::helper('Mage_User_Helper_Data')->__('Users'); - $this->_addButtonLabel = Mage::helper('Mage_User_Helper_Data')->__('Add New User'); + $this->addData(array( + Mage_Backend_Block_Widget_Container::PARAM_CONTROLLER => 'user', + Mage_Backend_Block_Widget_Grid_Container::PARAM_BLOCK_GROUP => 'Mage_User', + Mage_Backend_Block_Widget_Grid_Container::PARAM_BUTTON_NEW => $this->__('Add New User'), + Mage_Backend_Block_Widget_Container::PARAM_HEADER_TEXT => $this->__('Users'), + )); parent::_construct(); } @@ -50,6 +52,11 @@ class Mage_User_Block_User extends Mage_Backend_Block_Widget_Grid_Container protected function _toHtml() { Mage::dispatchEvent('permissions_user_html_before', array('block' => $this)); + /** @var $model Mage_User_Model_Resource_User */ + $model = Mage::getObjectManager()->get('Mage_User_Model_Resource_User'); + if ($model->canCreateUser()) { + $this->_addNewButton(); + } return parent::_toHtml(); } } diff --git a/app/code/core/Mage/User/Block/User/Edit/Tab/Main.php b/app/code/core/Mage/User/Block/User/Edit/Tab/Main.php index 0a404300c2814fda816af9bf49846f760878fdfa..09e80c5fdbd02060924015dca134d5733c245945 100644 --- a/app/code/core/Mage/User/Block/User/Edit/Tab/Main.php +++ b/app/code/core/Mage/User/Block/User/Edit/Tab/Main.php @@ -37,6 +37,7 @@ class Mage_User_Block_User_Edit_Tab_Main extends Mage_Backend_Block_Widget_Form protected function _prepareForm() { + /** @var $model Mage_User_Model_User */ $model = Mage::registry('permissions_user'); $form = new Varien_Data_Form(); @@ -91,11 +92,14 @@ class Mage_User_Block_User_Edit_Tab_Main extends Mage_Backend_Block_Widget_Form 'required' => true, )); - if ($model->getUserId()) { - $this->_addRegisteredUserPasswordFields($fieldset); + $isNewObject = $model->isObjectNew(); + if ($isNewObject) { + $passwordLabel = Mage::helper('Mage_User_Helper_Data')->__('Password'); } else { - $this->_addNewUserPasswordFields($fieldset); + $passwordLabel = Mage::helper('Mage_User_Helper_Data')->__('New Password'); } + $confirmationLabel = Mage::helper('Mage_User_Helper_Data')->__('Password Confirmation'); + $this->_addPasswordFields($fieldset, $passwordLabel, $confirmationLabel, $isNewObject); if (Mage::getSingleton('Mage_Backend_Model_Auth_Session')->getUser()->getId() != $model->getUserId()) { $fieldset->addField('is_active', 'select', array( @@ -129,50 +133,32 @@ class Mage_User_Block_User_Edit_Tab_Main extends Mage_Backend_Block_Widget_Form } /** - * Add password change fields in registered user edit form - * - * @param Varien_Data_Form_Element_Fieldset $fieldset - */ - protected function _addRegisteredUserPasswordFields(Varien_Data_Form_Element_Fieldset $fieldset) - { - $fieldset->addField('password', 'password', array( - 'name' => 'new_password', - 'label' => Mage::helper('Mage_User_Helper_Data')->__('New Password'), - 'id' => 'new_pass', - 'title' => Mage::helper('Mage_User_Helper_Data')->__('New Password'), - 'class' => 'input-text validate-admin-password', - )); - - $fieldset->addField('confirmation', 'password', array( - 'name' => 'password_confirmation', - 'label' => Mage::helper('Mage_User_Helper_Data')->__('Password Confirmation'), - 'id' => 'confirmation', - 'class' => 'input-text validate-cpassword', - )); - } - - /** - * Add password creation fields in new user form + * Add password input fields * * @param Varien_Data_Form_Element_Fieldset $fieldset + * @param string $passwordLabel + * @param string $confirmationLabel + * @param bool $isRequired */ - protected function _addNewUserPasswordFields(Varien_Data_Form_Element_Fieldset $fieldset) - { + protected function _addPasswordFields( + Varien_Data_Form_Element_Fieldset $fieldset, $passwordLabel, $confirmationLabel, $isRequired = false + ) { + $requiredFieldClass = ($isRequired ? ' required-entry' : ''); $fieldset->addField('password', 'password', array( 'name' => 'password', - 'label' => Mage::helper('Mage_User_Helper_Data')->__('Password'), + 'label' => $passwordLabel, 'id' => 'customer_pass', - 'title' => Mage::helper('Mage_User_Helper_Data')->__('Password'), - 'class' => 'input-text required-entry validate-admin-password', - 'required' => true, + 'title' => $passwordLabel, + 'class' => 'input-text validate-admin-password' . $requiredFieldClass, + 'required' => $isRequired, )); $fieldset->addField('confirmation', 'password', array( 'name' => 'password_confirmation', - 'label' => Mage::helper('Mage_User_Helper_Data')->__('Password Confirmation'), + 'label' => $confirmationLabel, 'id' => 'confirmation', - 'title' => Mage::helper('Mage_User_Helper_Data')->__('Password Confirmation'), - 'class' => 'input-text required-entry validate-cpassword', - 'required' => true, + 'title' => $confirmationLabel, + 'class' => 'input-text validate-cpassword' . $requiredFieldClass, + 'required' => $isRequired, )); } } diff --git a/app/code/core/Mage/User/Model/Resource/User.php b/app/code/core/Mage/User/Model/Resource/User.php index dee85ef8f178a68f2e5675e85828a1269d20790e..932ba5c9727621b06a16d9b4a404df345fe59786 100755 --- a/app/code/core/Mage/User/Model/Resource/User.php +++ b/app/code/core/Mage/User/Model/Resource/User.php @@ -379,6 +379,17 @@ class Mage_User_Model_Resource_User extends Mage_Core_Model_Resource_Db_Abstract return $adapter->fetchRow($select, $binds); } + /** + * Whether a user's identity is confirmed + * + * @param Mage_Core_Model_Abstract $user + * @return bool + */ + public function isUserUnique(Mage_Core_Model_Abstract $user) + { + return !$this->userExists($user); + } + /** * Save user extra data * @@ -398,4 +409,81 @@ class Mage_User_Model_Resource_User extends Mage_Core_Model_Resource_Db_Abstract return $this; } + + /** + * Whether functional restrictions allow to create a new user + * + * @return bool + */ + public function canCreateUser() + { + $maxUserCount = (string)Mage::getConfig()->getNode('global/functional_limitation/max_admin_user_count'); + if ('0' === $maxUserCount) { + return false; + } + $maxUserCount = (int)$maxUserCount; + return ($maxUserCount ? $this->_getTotalUserCount() < $maxUserCount : true); + } + + /** + * Whether the functional limitations permit a user saving + * + * @param Mage_Core_Model_Abstract $user + * @return bool + */ + public function isUserSavingAllowed(Mage_Core_Model_Abstract $user) + { + return (!$user->isObjectNew() || $this->canCreateUser()); + } + + /** + * Retrieve the total user count bypassing any restrictions/filters applied to collections + * + * @return int + */ + protected function _getTotalUserCount() + { + $adapter = $this->_getReadAdapter(); + $select = $adapter->select(); + $select->from($this->getMainTable(), 'COUNT(*)'); + $result = (int)$adapter->fetchOne($select); + return $result; + } + + /** + * Add validation rules to be applied before saving an entity + * + * @return Zend_Validate_Interface $validator + */ + public function getValidationRulesBeforeSave() + { + $userIdentity = new Zend_Validate_Callback(array($this, 'isUserUnique')); + $userIdentity->setMessage( + Mage::helper('Mage_User_Helper_Data')->__('A user with the same user name or email already exists.'), + Zend_Validate_Callback::INVALID_VALUE + ); + + $userSavingAllowance = new Zend_Validate_Callback(array($this, 'isUserSavingAllowed')); + $userSavingAllowance->setMessage( + $this->getMessageUserCreationProhibited(), Zend_Validate_Callback::INVALID_VALUE + ); + + /** @var $validator Magento_Validator_Composite_VarienObject */ + $validator = new Magento_Validator_Composite_VarienObject; + $validator + ->addRule($userIdentity) + ->addRule($userSavingAllowance) + ; + return $validator; + } + + /** + * Return the error message to be used when the user creation is prohibited due to the functional restrictions + * + * @return string + */ + public static function getMessageUserCreationProhibited() + { + return Mage::helper('Mage_User_Helper_Data')->__('You are using the maximum number of admin accounts allowed.'); + } } diff --git a/app/code/core/Mage/User/Model/User.php b/app/code/core/Mage/User/Model/User.php index bb6ae57e950ba5af49686db0752a45cf4639d3c4..c2e00e33b42a383f78d0e4136318d957b8a2e6d2 100644 --- a/app/code/core/Mage/User/Model/User.php +++ b/app/code/core/Mage/User/Model/User.php @@ -58,6 +58,11 @@ * @package Mage_User * @author Magento Core Team <core@magentocommerce.com> */ + +/** + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + * @SuppressWarnings(PHPMD.couplingBetweenObjects) + */ class Mage_User_Model_User extends Mage_Core_Model_Abstract implements Mage_Backend_Model_Auth_Credential_StorageInterface @@ -132,11 +137,7 @@ class Mage_User_Model_User $data['username'] = $this->getUsername(); } - if ($this->getNewPassword()) { - // Change password - $data['password'] = $this->_getEncodedPassword($this->getNewPassword()); - } elseif ($this->getPassword() && $this->getPassword() != $this->getOrigData('password')) { - // New user password + if ($this->_willSavePassword()) { $data['password'] = $this->_getEncodedPassword($this->getPassword()); } @@ -149,6 +150,97 @@ class Mage_User_Model_User return parent::_beforeSave(); } + /** + * Whether the password saving is going to occur + * + * @return bool + */ + protected function _willSavePassword() + { + return ($this->isObjectNew() || ($this->hasData('password') && $this->dataHasChangedFor('password'))); + } + + /** + * Add validation rules for particular fields + * + * @return Zend_Validate_Interface + */ + protected function _getValidationRulesBeforeSave() + { + $userNameNotEmpty = new Zend_Validate_NotEmpty(); + $userNameNotEmpty->setMessage( + Mage::helper('Mage_User_Helper_Data')->__('User Name is required field.'), + Zend_Validate_NotEmpty::IS_EMPTY + ); + $firstNameNotEmpty = new Zend_Validate_NotEmpty(); + $firstNameNotEmpty->setMessage( + Mage::helper('Mage_User_Helper_Data')->__('First Name is required field.'), + Zend_Validate_NotEmpty::IS_EMPTY + ); + $lastNameNotEmpty = new Zend_Validate_NotEmpty(); + $lastNameNotEmpty->setMessage( + Mage::helper('Mage_User_Helper_Data')->__('Last Name is required field.'), + Zend_Validate_NotEmpty::IS_EMPTY + ); + $emailValidity = new Zend_Validate_EmailAddress(); + $emailValidity->setMessage( + Mage::helper('Mage_User_Helper_Data')->__('Please enter a valid email.'), + Zend_Validate_EmailAddress::INVALID + ); + + /** @var $validator Magento_Validator_Composite_VarienObject */ + $validator = Mage::getModel('Magento_Validator_Composite_VarienObject'); + $validator + ->addRule($userNameNotEmpty, 'username') + ->addRule($firstNameNotEmpty, 'firstname') + ->addRule($lastNameNotEmpty, 'lastname') + ->addRule($emailValidity, 'email') + ; + + if ($this->_willSavePassword()) { + $this->_addPasswordValidation($validator); + } + return $validator; + } + + /** + * Add validation rules for the password management fields + * + * @param Magento_Validator_Composite_VarienObject $validator + */ + protected function _addPasswordValidation(Magento_Validator_Composite_VarienObject $validator) + { + $passwordNotEmpty = new Zend_Validate_NotEmpty(); + $passwordNotEmpty->setMessage( + Mage::helper('Mage_User_Helper_Data')->__('Password is required field.'), + Zend_Validate_NotEmpty::IS_EMPTY + ); + $minPassLength = self::MIN_PASSWORD_LENGTH; + $passwordLength = new Zend_Validate_StringLength(array('min' => $minPassLength, 'encoding' => 'UTF-8')); + $passwordLength->setMessage( + Mage::helper('Mage_User_Helper_Data')->__('Password must be at least of %d characters.', $minPassLength), + Zend_Validate_StringLength::TOO_SHORT + ); + $passwordChars = new Zend_Validate_Regex('/[a-z].*\d|\d.*[a-z]/iu'); + $passwordChars->setMessage( + Mage::helper('Mage_User_Helper_Data')->__('Password must include both numeric and alphabetic characters.'), + Zend_Validate_Regex::NOT_MATCH + ); + $validator + ->addRule($passwordNotEmpty, 'password') + ->addRule($passwordLength, 'password') + ->addRule($passwordChars, 'password') + ; + if ($this->hasPasswordConfirmation()) { + $passwordConfirmation = new Zend_Validate_Identical($this->getPasswordConfirmation()); + $passwordConfirmation->setMessage( + Mage::helper('Mage_User_Helper_Data')->__('Password confirmation must be same as password.'), + Zend_Validate_Identical::NOT_SAME + ); + $validator->addRule($passwordConfirmation, 'password'); + } + } + /** * Process data after model is saved * @@ -224,17 +316,6 @@ class Mage_User_Model_User return (is_array($result) && count($result) > 0) ? true : false; } - /** - * Check if user exists based on its id, username and email - * - * @return boolean - */ - public function userExists() - { - $result = $this->_getResource()->userExists($this); - return (is_array($result) && count($result) > 0) ? true : false; - } - /** * Retrieve admin user collection * @@ -446,80 +527,6 @@ class Mage_User_Model_User protected function _getEncodedPassword($password) { return Mage::helper('Mage_Core_Helper_Data')->getHash($password, 2); - } - - /** - * Validate user attribute values. - * Returns TRUE or array of errors. - * - * @return mixed - */ - public function validate() - { - $errors = array(); - - if (!Zend_Validate::is($this->getUsername(), 'NotEmpty')) { - $errors[] = Mage::helper('Mage_User_Helper_Data')->__('User Name is required field.'); - } - - if (!Zend_Validate::is($this->getFirstname(), 'NotEmpty')) { - $errors[] = Mage::helper('Mage_User_Helper_Data')->__('First Name is required field.'); - } - - if (!Zend_Validate::is($this->getLastname(), 'NotEmpty')) { - $errors[] = Mage::helper('Mage_User_Helper_Data')->__('Last Name is required field.'); - } - - if (!Zend_Validate::is($this->getEmail(), 'EmailAddress')) { - $errors[] = Mage::helper('Mage_User_Helper_Data')->__('Please enter a valid email.'); - } - - if ($this->hasNewPassword()) { - $errors = array_merge($errors, $this->_validatePassword()); - } - - if ($this->userExists()) { - // @codingStandardsIgnoreStart - $errors[] = Mage::helper('Mage_User_Helper_Data')->__('A user with the same user name or email aleady exists.'); - // @codingStandardsIgnoreEnd - } - - if (empty($errors)) { - return true; - } - return $errors; - } - - /** - * Validate user password - * - * @return array - */ - protected function _validatePassword() - { - $errors = array(); - - if (Mage::helper('Mage_Core_Helper_String')->strlen($this->getNewPassword()) < self::MIN_PASSWORD_LENGTH) { - // @codingStandardsIgnoreStart - $errors[] = Mage::helper('Mage_User_Helper_Data')->__('Password must be at least of %d characters.', self::MIN_PASSWORD_LENGTH); - // @codingStandardsIgnoreEnd - } - - if (!preg_match('/[a-z]/iu', $this->getNewPassword()) - || !preg_match('/[0-9]/u', $this->getNewPassword()) - ) { - // @codingStandardsIgnoreStart - $errors[] = Mage::helper('Mage_User_Helper_Data')->__('Password must include both numeric and alphabetic characters.'); - // @codingStandardsIgnoreEnd - } - - if ($this->hasPasswordConfirmation() && $this->getNewPassword() != $this->getPasswordConfirmation()) { - // @codingStandardsIgnoreStart - $errors[] = Mage::helper('Mage_User_Helper_Data')->__('Password confirmation must be same as password.'); - // @codingStandardsIgnoreEnd - } - - return $errors; } /** diff --git a/app/code/core/Mage/User/controllers/Adminhtml/AuthController.php b/app/code/core/Mage/User/controllers/Adminhtml/AuthController.php index 8efa1f219b266798c0d6c37950c56e5d79d6fdb8..08bb316621574e04945d5f93ded80a04c09564e8 100644 --- a/app/code/core/Mage/User/controllers/Adminhtml/AuthController.php +++ b/app/code/core/Mage/User/controllers/Adminhtml/AuthController.php @@ -130,51 +130,25 @@ class Mage_User_Adminhtml_AuthController extends Mage_Backend_Controller_ActionA return; } - $errorMessages = array(); - if (iconv_strlen($password) <= 0) { - array_push( - $errorMessages, - Mage::helper('Mage_User_Helper_Data')->__('New password field cannot be empty.') - ); - } /** @var $user Mage_User_Model_User */ $user = Mage::getModel('Mage_User_Model_User')->load($userId); - - $user->setNewPassword($password); - $user->setPasswordConfirmation($passwordConfirmation); - $validationErrors = $user->validate(); - if (is_array($validationErrors)) { - $errorMessages = array_merge($errorMessages, $validationErrors); + if ($password !== '') { + $user->setPassword($password); } - - if (!empty($errorMessages)) { - foreach ($errorMessages as $errorMessage) { - $this->_getSession()->addError($errorMessage); - } - - $this->_redirect('*/auth/resetpassword', array( - '_nosecret' => true, - '_query' => array( - 'id' => $userId, - 'token' => $passwordResetToken - ) - )); - return; + if ($passwordConfirmation !== '') { + $user->setPasswordConfirmation($passwordConfirmation); } - + // Empty current reset password token i.e. invalidate it + $user->setRpToken(null); + $user->setRpTokenCreatedAt(null); try { - // Empty current reset password token i.e. invalidate it - $user->setRpToken(null); - $user->setRpTokenCreatedAt(null); - $user->setPasswordConfirmation(null); $user->save(); $this->_getSession()->addSuccess( Mage::helper('Mage_User_Helper_Data')->__('Your password has been updated.') ); $this->getResponse()->setRedirect(Mage::helper('Mage_Backend_Helper_Data')->getHomePageUrl()); - } catch (Exception $exception) { - $this->_getSession()->addError($exception->getMessage()); - + } catch (Mage_Core_Exception $exception) { + $this->_getSession()->addMessages($exception->getMessages()); $this->_redirect('*/auth/resetpassword', array( '_nosecret' => true, '_query' => array( @@ -182,7 +156,6 @@ class Mage_User_Adminhtml_AuthController extends Mage_Backend_Controller_ActionA 'token' => $passwordResetToken ) )); - return; } } diff --git a/app/code/core/Mage/User/controllers/Adminhtml/UserController.php b/app/code/core/Mage/User/controllers/Adminhtml/UserController.php index 9b003052bd873b2d61f32e1652d01f8aa0f12bd7..d83ae45ca7d402d5fc76997c489f8c747feeb878 100644 --- a/app/code/core/Mage/User/controllers/Adminhtml/UserController.php +++ b/app/code/core/Mage/User/controllers/Adminhtml/UserController.php @@ -42,7 +42,13 @@ class Mage_User_Adminhtml_UserController extends Mage_Backend_Controller_ActionA $this->_title($this->__('System')) ->_title($this->__('Permissions')) ->_title($this->__('Users')); - + /** @var $model Mage_User_Model_Resource_User */ + $model = Mage::getObjectManager()->get('Mage_User_Model_Resource_User'); + if (!$model->canCreateUser()) { + /** @var $session Mage_Adminhtml_Model_Session */ + $session = Mage::getSingleton('Mage_Adminhtml_Model_Session'); + $session->addNotice($model->getMessageUserCreationProhibited()); + } $this->_initAction(); $this->renderLayout(); } @@ -91,76 +97,51 @@ class Mage_User_Adminhtml_UserController extends Mage_Backend_Controller_ActionA public function saveAction() { - $userId = $this->getRequest()->getParam('user_id'); + $userId = (int)$this->getRequest()->getParam('user_id'); $data = $this->getRequest()->getPost(); if (!$data) { $this->_redirect('*/*/'); - return null; + return; } - - $model = $this->_prepareUserForSave($userId, $data); - - if (is_null($model)) { + /** @var $model Mage_User_Model_User */ + $model = $this->_objectManager->create('Mage_User_Model_User')->load($userId); + if ($userId && $model->isObjectNew()) { + $this->_getSession()->addError($this->__('This user no longer exists.')); + $this->_redirect('*/*/'); return; } - + $model->setData($this->_getAdminUserData($data)); + $uRoles = $this->getRequest()->getParam('roles', array()); + if (count($uRoles)) { + $model->setRoleId($uRoles[0]); + } try { - $uRoles = $this->getRequest()->getParam('roles', array()); - if (count($uRoles)) { - $model->setRoleId($uRoles[0]); - } $model->save(); - Mage::getSingleton('Mage_Backend_Model_Session')->addSuccess($this->__('The user has been saved.')); - Mage::getSingleton('Mage_Backend_Model_Session')->setUserData(false); + $this->_getSession()->addSuccess($this->__('The user has been saved.')); + $this->_getSession()->setUserData(false); $this->_redirect('*/*/'); - return; } catch (Mage_Core_Exception $e) { - Mage::getSingleton('Mage_Backend_Model_Session')->addError($e->getMessage()); - Mage::getSingleton('Mage_Backend_Model_Session')->setUserData($data); - $this->_redirect('*/*/edit', array('user_id' => $model->getUserId())); - return; + $this->_getSession()->addMessages($e->getMessages()); + $this->_getSession()->setUserData($data); + $this->_redirect('*/*/edit', array('_current' => true)); } - - $this->_redirect('*/*/'); } /** - * Retrieve user save params and validate them + * Retrieve well-formed admin user data from the form input * - * @param int $userId * @param array $data - * @return Mage_Core_Model_Abstract|null + * @return array */ - protected function _prepareUserForSave($userId, array $data) + protected function _getAdminUserData(array $data) { - $model = Mage::getModel('Mage_User_Model_User')->load($userId); - if (!$model->getId() && $userId) { - Mage::getSingleton('Mage_Backend_Model_Session')->addError($this->__('This user no longer exists.')); - $this->_redirect('*/*/'); - return null; + if (isset($data['password']) && $data['password'] === '') { + unset($data['password']); } - $model->setData($data); - - /* - * Unsetting new password and password confirmation if they are blank - */ - if ($model->hasNewPassword() && $model->getNewPassword() === '') { - $model->unsNewPassword(); - } - if ($model->hasPasswordConfirmation() && $model->getPasswordConfirmation() === '') { - $model->unsPasswordConfirmation(); - } - - $result = $model->validate(); - if (is_array($result)) { - Mage::getSingleton('Mage_Backend_Model_Session')->setUserData($data); - foreach ($result as $message) { - Mage::getSingleton('Mage_Backend_Model_Session')->addError($message); - } - $this->_redirect('*/*/edit', array('_current' => true)); - return null; + if (isset($data['password_confirmation']) && $data['password_confirmation'] === '') { + unset($data['password_confirmation']); } - return $model; + return $data; } public function deleteAction() diff --git a/app/code/core/Mage/User/view/adminhtml/admin/forgotpassword.phtml b/app/code/core/Mage/User/view/adminhtml/admin/forgotpassword.phtml index 1073bd744849ea1104cf985ca02608bec330c653..376932092cca7da0e676decfdea44d6d8fe5154e 100644 --- a/app/code/core/Mage/User/view/adminhtml/admin/forgotpassword.phtml +++ b/app/code/core/Mage/User/view/adminhtml/admin/forgotpassword.phtml @@ -24,61 +24,76 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<!doctype html> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title><?php echo Mage::helper('Mage_User_Helper_Data')->__('Log into Magento Admin Page'); ?></title> - <link type="text/css" rel="stylesheet" href="<?php echo $this->getViewFileUrl('reset.css'); ?>" media="all" /> - <link type="text/css" rel="stylesheet" href="<?php echo $this->getViewFileUrl('boxes.css'); ?>" media="all" /> + <link rel="icon" href="<?php echo $this->getViewFileUrl('Mage_Page::favicon.ico'); ?>" type="image/x-icon" /> <link rel="shortcut icon" href="<?php echo $this->getViewFileUrl('Mage_Page::favicon.ico'); ?>" type="image/x-icon" /> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('jquery/jquery.min.js') ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('mage/jquery-no-conflict.js') ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('jquery/jquery-ui.custom.min.js') ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('jquery/jquery.tmpl.min.js') ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('jquery/jquery.validate.js') ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('mage/validation.js') ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('mage/backend/validation.js') ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('mage/backend/form.js') ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('mage/translate.js') ?>"></script> - - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('prototype/prototype.js'); ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('mage/adminhtml/events.js'); ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('scriptaculous/effects.js'); ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('mage/captcha.js') ?>"></script> - <!--[if IE]> <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('iestyles.css'); ?>" type="text/css" media="all" /> <![endif]--> - <!--[if lt IE 7]> <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('below_ie7.css'); ?>" type="text/css" media="all" /> <![endif]--> - <!--[if IE 7]> <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('ie7.css'); ?>" type="text/css" media="all" /> <![endif]--> -</head> -<body id="page-login"> -<div class="login-container"> - <div class="login-box"> - <form method="post" action="" id="login-form"> - <fieldset class="login-form"> - <input name="form_key" type="hidden" value="<?php echo $this->getFormKey(); ?>" /> - <h2><?php echo Mage::helper('Mage_User_Helper_Data')->__('Forgot your user name or password?'); ?></h2> - <div id="messages"> - <?php echo $this->getMessagesBlock()->getGroupedHtml(); ?> - </div> - <div class="input-box forgot-password"><label for="email"><?php echo Mage::helper('Mage_User_Helper_Data')->__('Email Address:'); ?></label><br /> - <input type="text" id="email" name="email" value="" class="required-entry input-text forgot-password validate-email" style="width:461px;" /> - </div> - <?php echo $this->getChildHtml('form.additional.info'); ?> - <div class="clear"></div> - <div class="form-buttons"> - <a class="left" href="<?php echo $this->getUrl('adminhtml', array('_nosecret' => true)); ?>">« <?php echo Mage::helper('Mage_User_Helper_Data')->__('Back to Login'); ?></a> - <button class="forgot-password" type="submit"><span><span><span><?php echo Mage::helper('Mage_User_Helper_Data')->__('Retrieve Password'); ?></span></span></span></button> - </div> - </fieldset> - <p class="legal"><?php echo Mage::helper('Mage_Backend_Helper_Data')->__('Magento® is a trademark of X.commerce, Inc. Copyright © %s X.commerce, Inc.', date('Y')); ?></p> - </form> - <div class="bottom"></div> - <script type="text/javascript"> - jQuery('#login-form').form().validation(); - </script> + <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('mui/reset.css') ?>" media="all" /> + <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('mui/base.css') ?>" media="all" /> + <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('mui/elements.css') ?>" media="all" /> + <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('mui/form.css') ?>" media="all" /> + <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('css/admin.css') ?>" media="all" /> + <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('mui/utils.css') ?>" media="all" /> + <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('css/debug.css') ?>" media="all" /> + + <script src="<?php echo $this->getViewFileUrl('jquery/jquery.min.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('mage/jquery-no-conflict.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('jquery/jquery-ui.custom.min.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('jquery/jquery.tmpl.min.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('jquery/jquery.validate.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('mage/validation.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('mage/backend/validation.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('mage/backend/form.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('mage/translate.js') ?>"></script> + + <script src="<?php echo $this->getViewFileUrl('prototype/prototype.js'); ?>"></script> + <script src="<?php echo $this->getViewFileUrl('mage/adminhtml/events.js'); ?>"></script> + <script src="<?php echo $this->getViewFileUrl('scriptaculous/effects.js'); ?>"></script> + <script src="<?php echo $this->getViewFileUrl('mage/captcha.js') ?>"></script> +<body id="page-login" class="page-login page-forgotpassword"> +<div class="wrapper"> + <header class="header"> + <div class="logo" title="<?php echo $this->__('Magento Admin Panel') ?>"><span><?php echo $this->__('Magento Admin Panel') ?></span></div> + </header> + <div class="form-login form-inline"> + <div id="messages"> + <?php echo $this->getMessagesBlock()->getGroupedHtml(); ?> + </div> + <form method="post" action="" id="login-form"> + <fieldset class="fieldset"> + <legend class="legend"><span><?php echo Mage::helper('Mage_User_Helper_Data')->__('Forgot your user name or password?'); ?></span></legend><br/> + <input name="form_key" type="hidden" value="<?php echo $this->getFormKey(); ?>" /> + <div class="field field-email"> + <label for="email" class="label"><span><?php echo Mage::helper('Mage_User_Helper_Data')->__('Email Address:'); ?></span></label> + <div class="control"> + <input type="text" id="email" name="email" value="" class="required-entry input-text forgot-password validate-email" /> + </div> + </div> + <?php echo $this->getChildHtml('form.additional.info'); ?> + <div class="form-actions"> + <div class="actions"> + <button class="action-retrieve primary" type="submit"><span><?php echo Mage::helper('Mage_User_Helper_Data')->__('Retrieve Password'); ?></span></button> + </div> + <div class="links"> + <a class="action-back" href="<?php echo $this->getUrl('adminhtml', array('_nosecret' => true)); ?>"> + <?php echo Mage::helper('Mage_User_Helper_Data')->__('Back to Login'); ?> + </a> + </div> + </div> + </fieldset> + </form> + <script type="text/javascript"> + jQuery('#login-form').form().validation(); + </script> </div> + <footer class="footer"> + <div class="footer-content"> + <?php echo Mage::helper('Mage_Backend_Helper_Data')->__('Magento® is a trademark of X.commerce, Inc. Copyright © %s X.commerce, Inc.', date('Y')) ?> + </div> + </footer> </div> -</body> -</html> diff --git a/app/code/core/Mage/User/view/adminhtml/admin/forgotpassword_url.phtml b/app/code/core/Mage/User/view/adminhtml/admin/forgotpassword_url.phtml index 13a155e5a805b90df9d988ac2fbc41ad60176d5b..3f61d518d8f6c06e0dfc95b417973299674b00cd 100644 --- a/app/code/core/Mage/User/view/adminhtml/admin/forgotpassword_url.phtml +++ b/app/code/core/Mage/User/view/adminhtml/admin/forgotpassword_url.phtml @@ -24,4 +24,6 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<a class="left" href="<?php echo Mage::helper('Mage_Backend_Helper_Data')->getUrl('adminhtml/auth/forgotpassword', array('_nosecret' => true))?>"><?php echo Mage::helper('Mage_User_Helper_Data')->__('Forgot your password?') ?></a> +<div class="links"> +<a class="action-forgotpassword" href="<?php echo Mage::helper('Mage_Backend_Helper_Data')->getUrl('adminhtml/auth/forgotpassword', array('_nosecret' => true))?>"><?php echo Mage::helper('Mage_User_Helper_Data')->__('Forgot your password?') ?></a> +</div> diff --git a/app/code/core/Mage/User/view/adminhtml/admin/resetforgottenpassword.phtml b/app/code/core/Mage/User/view/adminhtml/admin/resetforgottenpassword.phtml index 05e773d7a2f747b9f8ea5a0fc4ba3d4f60acc261..78b5316ebdd3b0562f16b68915a89ddc3ff17070 100644 --- a/app/code/core/Mage/User/view/adminhtml/admin/resetforgottenpassword.phtml +++ b/app/code/core/Mage/User/view/adminhtml/admin/resetforgottenpassword.phtml @@ -26,64 +26,76 @@ ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html lang="en"> - <head> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <title><?php echo Mage::helper('Mage_User_Helper_Data')->__('Reset a Password'); ?></title> - <link type="text/css" rel="stylesheet" href="<?php echo $this->getViewFileUrl('reset.css'); ?>" media="all" /> - <link type="text/css" rel="stylesheet" href="<?php echo $this->getViewFileUrl('boxes.css'); ?>" media="all" /> - <link rel="icon" href="<?php echo $this->getViewFileUrl('Mage_Page::favicon.ico'); ?>" type="image/x-icon" /> - <link rel="shortcut icon" href="<?php echo $this->getViewFileUrl('Mage_Page::favicon.ico'); ?>" type="image/x-icon" /> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <title><?php echo Mage::helper('Mage_User_Helper_Data')->__('Reset a Password'); ?></title> + <link rel="icon" href="<?php echo $this->getViewFileUrl('Mage_Page::favicon.ico'); ?>" type="image/x-icon" /> + <link rel="shortcut icon" href="<?php echo $this->getViewFileUrl('Mage_Page::favicon.ico'); ?>" type="image/x-icon" /> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('jquery/jquery.min.js') ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('mage/jquery-no-conflict.js') ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('jquery/jquery-ui.custom.min.js') ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('jquery/jquery.tmpl.min.js') ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('jquery/jquery.validate.js') ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('mage/validation.js') ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('mage/backend/validation.js') ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('mage/backend/form.js') ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('mage/translate.js') ?>"></script> - - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('prototype/prototype.js'); ?>"></script> - <script type="text/javascript" src="<?php echo $this->getViewFileUrl('scriptaculous/effects.js'); ?>"></script> + <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('mui/reset.css') ?>" media="all" /> + <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('mui/base.css') ?>" media="all" /> + <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('mui/elements.css') ?>" media="all" /> + <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('mui/form.css') ?>" media="all" /> + <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('css/admin.css') ?>" media="all" /> + <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('mui/utils.css') ?>" media="all" /> + <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('css/debug.css') ?>" media="all" /> - <!--[if IE]> <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('iestyles.css'); ?>" type="text/css" media="all" /> <![endif]--> - <!--[if lt IE 7]> <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('below_ie7.css'); ?>" type="text/css" media="all" /> <![endif]--> - <!--[if IE 7]> <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('ie7.css'); ?>" type="text/css" media="all" /> <![endif]--> - </head> - <body id="page-login"> - <div class="login-container"> - <div class="login-box"> - <form method="post" action="<?php echo $this->getUrl('*/auth/resetpasswordpost', array('_query' => array('id' => $this->getUserId(), 'token' => $this->getResetPasswordLinkToken()))); ?>" id="reset-password-form"> - <fieldset class="login-form"> - <input name="form_key" type="hidden" value="<?php echo $this->getFormKey(); ?>" /> - <h2><?php echo Mage::helper('Mage_User_Helper_Data')->__('Reset a Password'); ?></h2> - <div id="messages"> - <?php echo $this->getMessagesBlock()->getGroupedHtml(); ?> - </div> - <div class="input-box f-left"> - <label for="password"><em class="required">*</em> <?php echo Mage::helper('Mage_User_Helper_Data')->__('New Password'); ?></label> - <br /> - <input type="password" class="input-text required-entry validate-admin-password" name="password" id="password" /> - </div> - <div class="input-box f-right"> - <label for="confirmation"><em class="required">*</em> <?php echo Mage::helper('Mage_User_Helper_Data')->__('Confirm New Password'); ?></label> - <br /> - <input type="password" class="input-text required-entry validate-cpassword" name="confirmation" id="confirmation" /> - </div> - <div class="clear"></div> - <div class="form-buttons"> - <a class="left" href="<?php echo $this->getUrl('adminhtml', array('_nosecret' => true)) ?>">« <?php echo Mage::helper('Mage_User_Helper_Data')->__('Back to Login'); ?></a> - <button type="submit" title="<?php echo Mage::helper('Mage_User_Helper_Data')->__('Reset Password'); ?>" class="forgot-password"><span><span><span><?php echo Mage::helper('Mage_User_Helper_Data')->__('Reset Password'); ?></span></span></span></button> - </div> - </fieldset> - <p class="legal"><?php echo Mage::helper('Mage_User_Helper_Data')->__('Magento® is a trademark of X.commerce, Inc. Copyright © %s X.commerce, Inc.', date('Y')); ?></p> - </form> - <div class="bottom"></div> - <script type="text/javascript"> - jQuery('#reset-password-form').form().validation(); - </script> - </div> + <script src="<?php echo $this->getViewFileUrl('jquery/jquery.min.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('mage/jquery-no-conflict.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('jquery/jquery-ui.custom.min.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('jquery/jquery.tmpl.min.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('jquery/jquery.validate.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('mage/validation.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('mage/backend/validation.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('mage/backend/form.js') ?>"></script> + <script src="<?php echo $this->getViewFileUrl('mage/translate.js') ?>"></script> + + <script src="<?php echo $this->getViewFileUrl('prototype/prototype.js'); ?>"></script> + <script src="<?php echo $this->getViewFileUrl('scriptaculous/effects.js'); ?>"></script> +<body id="page-login" class="page-login page-resetpass"> +<div class="wrapper"> + <header class="header"> + <div class="logo" title="<?php echo $this->__('Magento Admin Panel') ?>"><span><?php echo $this->__('Magento Admin Panel') ?></span></div> + </header> + <div class="form-inline form-login"> + <div id="messages"> + <?php echo $this->getMessagesBlock()->getGroupedHtml(); ?> + </div> + <form method="post" action="<?php echo $this->getUrl('*/auth/resetpasswordpost', array('_query' => array('id' => $this->getUserId(), 'token' => $this->getResetPasswordLinkToken()))); ?>" id="reset-password-form"> + <fieldset class="fieldset"> + <legend class="legend"><span><?php echo Mage::helper('Mage_User_Helper_Data')->__('Reset a Password'); ?></span></legend><br /> + <input name="form_key" type="hidden" value="<?php echo $this->getFormKey(); ?>" /> + <div class="field field-password"> + <label for="password"><span><?php echo Mage::helper('Mage_User_Helper_Data')->__('New Password'); ?></span></label> + <div class="control"> + <input type="password" class="input-text required-entry validate-admin-password" name="password" id="password" /> + </div> + </div> + <div class="field field-confirmation"> + <label for="confirmation"><span><?php echo Mage::helper('Mage_User_Helper_Data')->__('Confirm New Password'); ?></span></label> + <div class="control"> + <input type="password" class="input-text required-entry validate-cpassword" name="confirmation" id="confirmation" /> + </div> + </div> + <div class="form-actions"> + + <div class="actions"> + <button type="submit" title="<?php echo Mage::helper('Mage_User_Helper_Data')->__('Reset Password'); ?>" class="action-reset primary"><span><?php echo Mage::helper('Mage_User_Helper_Data')->__('Reset Password'); ?></span></button> + </div> + <div class="links"> + <a class="action-back" href="<?php echo $this->getUrl('adminhtml', array('_nosecret' => true)) ?>"><?php echo Mage::helper('Mage_User_Helper_Data')->__('Back to Login'); ?></a> + </div> + </div> + </fieldset> + </form> + <script type="text/javascript"> + jQuery('#reset-password-form').form().validation(); + </script> + </div> + <footer class="footer"> + <div class="footer-content"> + <?php echo Mage::helper('Mage_Backend_Helper_Data')->__('Magento® is a trademark of X.commerce, Inc. Copyright © %s X.commerce, Inc.', date('Y')) ?> </div> - </body> -</html> + </footer> +</div> + diff --git a/app/code/core/Mage/User/view/adminhtml/role/edit.phtml b/app/code/core/Mage/User/view/adminhtml/role/edit.phtml index 95c23c5e9f47e2ee8bf9305ad2cc3b4c8e9d170c..dca29c33aa652f39f8cae2a739afe2a2e8860710 100644 --- a/app/code/core/Mage/User/view/adminhtml/role/edit.phtml +++ b/app/code/core/Mage/User/view/adminhtml/role/edit.phtml @@ -33,30 +33,28 @@ <?php echo $this->getChildHtml(); ?> -<div class="entry-edit"> - <div class="entry-edit-head"> - <h4 class="icon-head head-edit-form fieldset-legend"><?php echo $this->__('Roles Resources') ?></h4> - </div> - <input type="hidden" name="resource" id="role_resources" value="" /> - <fieldset id="role_resources"> - <span class="field-row"> - <label for="all"><?php echo $this->__('Resource Access') ?></label> - <select id="all" name="all" onchange="$('resources_container').toggle()" class="select"> +<input type="hidden" name="resource" id="role_resources" value="" /> +<fieldset id="role_resources" class="fieldset form-inline"> + <legend class="legend"><span><?php echo $this->__('Roles Resources') ?></span></legend> + + <div class="field"> + <label class="label" for="all"><span><?php echo $this->__('Resource Access') ?></span></label> + <div class="control"> + <select id="all" name="all" onchange="$('resources_container').toggle()"> <option value="0" <?php echo ($this->isEverythingAllowed()?'':'selected'); ?>><?php echo $this->__('Custom') ?></option> <option value="1" <?php echo ($this->isEverythingAllowed()?'selected':''); ?>><?php echo $this->__('All') ?></option> </select> - </span> + </div> + </div> + + <div id="resources_container"> + <label><?php echo $this->__('Resources') ?></label> + <div class="tree x-tree" id="resource-tree"></div> + </div> - <span class="field-row" id="resources_container"> - <label><?php echo $this->__('Resources') ?></label> - <div class="f-left"> - <div class="tree x-tree" id="resource-tree"></div> - </div> - </span> +</fieldset> - </fieldset> -</div> <!-- Draw Resources Tree --> <script type="text/javascript"> <?php if($this->isEverythingAllowed()): ?> diff --git a/app/code/core/Mage/User/view/adminhtml/role/info.phtml b/app/code/core/Mage/User/view/adminhtml/role/info.phtml index 994dc0f3af62a8b516da23edbd1832f45e1b7f57..11bdf33604166c42f54a43a5170090ab6412c6b7 100644 --- a/app/code/core/Mage/User/view/adminhtml/role/info.phtml +++ b/app/code/core/Mage/User/view/adminhtml/role/info.phtml @@ -24,18 +24,11 @@ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ ?> -<div class="content-header"> - <table cellspacing="0"> - <tr> - <td style="width:50%;"><h3 class="icon-head head-permissions-role"><?php echo ($this->getRoleId() > 0 ) ? ($this->__('Edit Role') . " '{$this->escapeHtml($this->getRoleInfo()->getRoleName())}'") : $this->__('Add New Role') ?></h3></td> - <td class="form-buttons"> - <?php echo $this->getBackButtonHtml() ?> - <?php echo $this->getResetButtonHtml() ?> - <?php echo $this->getDeleteButtonHtml() ?> - <?php echo $this->getSaveButtonHtml() ?> - </td> - </tr> - </table> +<div class="page-actions"> + <?php echo $this->getBackButtonHtml() ?> + <?php echo $this->getResetButtonHtml() ?> + <?php echo $this->getDeleteButtonHtml() ?> + <?php echo $this->getSaveButtonHtml() ?> </div> <form action="<?php echo $this->getUrl('*/*/saverole') ?>" method="post" id="role-edit-form"> <?php echo $this->getBlockHtml('formkey')?> diff --git a/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansBlack-webfont.eot b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansBlack-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..ff6a97e9ddf5f08b1d7a94e4395af25df88ba01f Binary files /dev/null and b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansBlack-webfont.eot differ diff --git a/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansBlack-webfont.svg b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansBlack-webfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..6c5ffea8d6a9231c4d9f8156e97f9d4b55d8a766 --- /dev/null +++ b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansBlack-webfont.svg @@ -0,0 +1,244 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Fontspring. +</metadata> +<defs> +<font id="webfont85gDAx2H" horiz-adv-x="1648" > +<font-face units-per-em="2048" ascent="1536" descent="-512" /> +<missing-glyph horiz-adv-x="491" /> +<glyph unicode=" " horiz-adv-x="491" /> +<glyph unicode="	" horiz-adv-x="491" /> +<glyph unicode=" " horiz-adv-x="491" /> +<glyph unicode="!" horiz-adv-x="598" d="M119 152q0 74 52 127t124 53q74 0 126 -53.5t52 -126.5q0 -72 -52 -124.5t-126 -52.5q-72 0 -124 52.5t-52 124.5zM129 1391h354l-59 -895h-240z" /> +<glyph unicode=""" horiz-adv-x="835" d="M106 788v578h261v-76l-84 -502h-177zM504 788v578h262v-76l-88 -502h-174z" /> +<glyph unicode="#" horiz-adv-x="1443" d="M68 215l22 160h283l57 272h-278l24 158h287l78 379h166l-78 -379h280l78 379h166l-78 -379h301l-24 -158h-310l-55 -272h305l-22 -160h-316l-80 -397h-167l79 397h-276l-82 -397h-168l82 397h-274zM541 375h278l58 272h-281z" /> +<glyph unicode="$" horiz-adv-x="993" d="M70 82l61 250q12 -10 33.5 -25.5t101.5 -43t170 -34.5l6 234q-180 61 -270 146t-90 208q0 127 93 223.5t286 116.5l6 182h104l-6 -176q90 0 170 -15t115 -30l35 -16l-78 -240q-90 47 -248 56l-6 -232q203 -66 287 -144.5t84 -195.5q0 -143 -102.5 -240.5t-286.5 -115.5 l-5 -172h-104l4 166q-213 6 -356 96zM346 831q0 -70 105 -110l4 197q-109 -11 -109 -87zM541 229q109 12 108 90q0 41 -25.5 65t-76.5 44z" /> +<glyph unicode="%" horiz-adv-x="1603" d="M63 1049q0 139 98.5 233t252 94t252 -94t98.5 -233q0 -141 -98.5 -237.5t-252 -96.5t-252 96.5t-98.5 237.5zM246 0l979 1407l110 -74l-923 -1333h-166zM254 1049q0 -63 43 -110.5t116.5 -47.5t116.5 47t43 111q0 61 -43 109t-116.5 48t-116.5 -48t-43 -109zM838 307 q0 139 98 234.5t251.5 95.5t253 -95.5t99.5 -234.5t-99.5 -235.5t-253 -96.5t-251.5 96.5t-98 235.5zM1030 307.5q0 -63.5 42 -109.5t116 -46t118 46t44 109q0 61 -43 108.5t-117 47.5t-117 -46t-43 -109.5z" /> +<glyph unicode="&" horiz-adv-x="1468" d="M61 350q0 227 258 365q-90 162 -90 311q0 152 102.5 258.5t305.5 106.5q188 0 292.5 -93.5t104.5 -250.5q0 -143 -81 -232.5t-222 -159.5q16 -20 27 -28q100 -113 200 -207q150 199 177 518h274q-43 -424 -252 -686q137 -106 250 -146l-100 -192q-147 18 -355 158 q-160 -96 -370 -97q-94 0 -180.5 19.5t-166 60.5t-127 117t-47.5 178zM346 362q0 -70 58.5 -110.5t160.5 -40.5q92 0 166 31q-141 123 -248 247q-2 2 -8 9.5t-11 14.5t-7 11q-111 -70 -111 -162zM532 1026q0 -82 60 -182q178 86 178 196q0 51 -31.5 83t-85.5 32 q-121 0 -121 -129z" /> +<glyph unicode="'" horiz-adv-x="442" d="M106 788v578h283v-76l-141 -502h-142z" /> +<glyph unicode="(" horiz-adv-x="638" d="M82 553q0 150 32.5 297t80 249.5t94.5 184.5t80 121l32 41l209 -72l-32 -40q-20 -26 -71.5 -109.5t-90.5 -173.5t-72 -226.5t-33 -271.5q0 -150 32 -294t77 -244.5t90 -179.5t76 -118l32 -39l-206 -79q-14 14 -36 42.5t-79 125t-100 201t-79 264t-36 321.5z" /> +<glyph unicode=")" horiz-adv-x="638" d="M18 -322l34 40q22 26 75 114t93 183.5t74 241.5t34 296q0 135 -31 270t-75 230.5t-89 170t-76 111.5l-30 39l211 72q12 -14 33.5 -42t76.5 -118t97 -188.5t77 -247t35 -297.5q0 -162 -34 -320.5t-82 -268t-97 -195.5t-82 -129l-35 -41z" /> +<glyph unicode="*" horiz-adv-x="1048" d="M68 854l323 84l47 -82l-233 -240zM68 1065l137 238l233 -240l-47 -80zM387 510l90 324h92l93 -324h-275zM387 1409h275l-93 -324h-92zM608 856l47 82l324 -84l-137 -238zM608 1063l234 240l137 -238l-324 -82z" /> +<glyph unicode="+" horiz-adv-x="1064" d="M43 436v185h395v409h191v-409h385v-185h-385v-436h-191v436h-395z" /> +<glyph unicode="," horiz-adv-x="530" d="M45 -311l83 81.5t50.5 77t26.5 111.5q0 53 -26.5 108.5t-106.5 178.5l268 86q100 -150 100 -283q0 -213 -293 -467z" /> +<glyph unicode="-" horiz-adv-x="792" d="M102 442v170h588v-170h-588z" /> +<glyph unicode="." horiz-adv-x="534" d="M90 152q0 74 52.5 127t123.5 53q74 0 126 -53.5t52 -126.5q0 -72 -52 -124.5t-126 -52.5q-72 0 -124 52.5t-52 124.5z" /> +<glyph unicode="/" horiz-adv-x="964" d="M37 -401l682 1767h188l-680 -1767h-190z" /> +<glyph unicode="0" horiz-adv-x="1157" d="M76 479q0 207 135 366t377 159q229 0 364 -146.5t135 -345.5q0 -131 -56 -251t-176 -203t-280 -83q-233 0 -366 149.5t-133 354.5zM354 489q0 -113 54.5 -195.5t173.5 -82.5q115 0 170 83t55 195q0 117 -54.5 198t-168.5 81q-121 0 -175.5 -81t-54.5 -198z" /> +<glyph unicode="1" horiz-adv-x="950" d="M98 0v233h262v492h-258v254h562v-746h237v-233h-803z" /> +<glyph unicode="2" horiz-adv-x="974" d="M72 874q16 14 47 36t129 58t196 36q172 0 276.5 -93.5t104.5 -234.5q0 -88 -49 -174t-104.5 -139.5t-149.5 -131.5h389v-231h-835l6 168q16 12 46 32.5t102.5 79t129 112.5t102.5 122t46 117q0 55 -32 88t-97 33q-41 0 -88 -17.5t-74 -34.5l-29 -16z" /> +<glyph unicode="3" horiz-adv-x="856" d="M12 870q18 14 51 37t131.5 60t196.5 37q160 0 265.5 -84t105.5 -213q0 -199 -252 -340q135 -37 209 -126t74 -204q0 -203 -198 -326t-478 -123q-45 0 -66 2l-24 232q53 -4 82 -4q156 0 261 60.5t105 162.5q0 164 -285 164h-32v221q109 4 198.5 71.5t89.5 153.5 q0 49 -31.5 75t-80.5 26q-39 0 -87 -19.5t-77 -38.5l-29 -18z" /> +<glyph unicode="4" horiz-adv-x="1124" d="M45 12v203l510 760h342v-744h176v-219h-176v-407h-297v407h-555zM332 231h268v435z" /> +<glyph unicode="5" horiz-adv-x="854" d="M68 -176q51 -6 100 -6q143 0 232 52t89 165q0 66 -32.5 114t-95 77.5t-126 45t-153.5 29.5v678h661v-231h-366v-254q430 -106 430 -435q0 -225 -178 -348t-467 -123q-45 0 -68 2z" /> +<glyph unicode="6" horiz-adv-x="1083" d="M66 563q0 156 53 299.5t153.5 260t261 188t361.5 80.5l18 -238q-422 -31 -516 -365q94 115 244 115q174 0 281.5 -127t107.5 -309q0 -199 -128 -345.5t-347 -146.5q-236 0 -362.5 170t-126.5 418zM373 567q6 -356 194 -356q72 0 113 62.5t41 164.5q0 221 -156 221 q-100 0 -192 -92z" /> +<glyph unicode="7" horiz-adv-x="972" d="M43 717v262h895v-172q-229 -578 -565 -1233l-299 59q324 610 512 1084h-543z" /> +<glyph unicode="8" horiz-adv-x="1064" d="M78 334q0 121 62.5 205t170.5 153q-186 141 -186 322q0 156 115.5 266.5t306.5 110.5q168 0 291 -90.5t123 -253.5q0 -186 -195 -328q104 -68 162.5 -144.5t58.5 -185.5q0 -166 -130 -290t-341 -124q-170 0 -304 89.5t-134 269.5zM340 354q0 -63 46 -108t118 -45 q76 0 129 48t53 111q0 53 -45 100.5t-131 100.5q-170 -105 -170 -207zM430 1042q0 -106 135 -198q127 82 127 188q0 57 -32.5 95t-102.5 38q-72 0 -99.5 -38t-27.5 -85z" /> +<glyph unicode="9" horiz-adv-x="1110" d="M80 506q0 197 130 347.5t351 150.5q236 0 364 -170t128 -418q0 -156 -53.5 -300.5t-154 -260t-262 -188.5t-362.5 -81l-18 238q442 35 520 383q-92 -123 -256 -123q-170 0 -278.5 124t-108.5 298zM389 530q0 -80 35 -140t123 -60q63 0 117.5 31.5t78.5 58.5 q-4 152 -56 250t-144 98q-74 0 -114 -63.5t-40 -174.5z" /> +<glyph unicode=":" horiz-adv-x="577" d="M113 152q0 74 51 127t124.5 53t126 -53.5t52.5 -126.5q0 -72 -52.5 -124.5t-126 -52.5t-124.5 52.5t-51 124.5zM113 795q0 74 51 127t124.5 53t126 -53.5t52.5 -126.5q0 -72 -52.5 -124.5t-126 -52.5t-124.5 52.5t-51 124.5z" /> +<glyph unicode=";" horiz-adv-x="571" d="M66 -311q59 57 82.5 81.5t50 77t26.5 111.5q0 53 -26.5 108.5t-106.5 178.5l268 86q100 -150 101 -283q0 -213 -293 -467zM109 795q0 74 52 127t124 53q74 0 126 -53.5t52 -126.5q0 -72 -52.5 -124.5t-125.5 -52.5q-72 0 -124 52.5t-52 124.5z" /> +<glyph unicode="<" horiz-adv-x="1064" d="M47 479v94l873 469l47 -186l-650 -330l650 -350l-47 -184z" /> +<glyph unicode="=" horiz-adv-x="1064" d="M90 252v180h885v-180h-885zM90 594v180h885v-180h-885z" /> +<glyph unicode=">" horiz-adv-x="1064" d="M100 176l648 350l-648 330l47 186l873 -469v-94l-873 -487z" /> +<glyph unicode="?" horiz-adv-x="825" d="M82 1206l70 271q12 -4 33.5 -10.5t85 -30t121 -49t127 -67.5t119.5 -86t85 -103.5t35 -120.5q0 -68 -46 -137.5t-101.5 -120t-101.5 -120t-46 -136.5h-250q-2 20 -2 34q0 74 32.5 147t72.5 119t73 93t33 76q0 55 -85 115.5t-169 93.5zM166 152q0 74 51 127t125 53 t126 -53.5t52 -126.5q0 -72 -52 -124.5t-126 -52.5t-125 52.5t-51 124.5z" /> +<glyph unicode="@" horiz-adv-x="1822" d="M70 391q0 166 65.5 319.5t179 269.5t282.5 185.5t364 69.5q342 0 560 -194.5t218 -487.5q0 -141 -57.5 -264t-174.5 -193q-68 -41 -216 -73.5t-195 -47.5q-23 88 -41 146q-29 -57 -102.5 -101.5t-157.5 -44.5q-131 0 -219.5 106.5t-88.5 280.5q0 242 167 388.5t409 146.5 q43 0 92 -5t78 -11l29 -4v-486l18 -176q117 2 178.5 95t61.5 227q0 217 -150.5 367.5t-406.5 150.5q-293 0 -479.5 -194.5t-186.5 -457.5q0 -250 170 -410.5t381 -172.5l-35 -199q-317 23 -530 239t-213 531zM764 365q0 -172 94 -172q59 0 121 83v420q-94 0 -154.5 -96 t-60.5 -235z" /> +<glyph unicode="A" horiz-adv-x="1320" d="M2 0l508 1376h301l508 -1376h-322l-86 246h-510l-86 -246h-313zM494 512h325l-164 463z" /> +<glyph unicode="B" horiz-adv-x="1255" d="M154 0v1366h510q244 0 353 -95t109 -233q0 -162 -165 -286q88 -47 155.5 -134.5t67.5 -220.5q0 -180 -130 -288.5t-337 -108.5h-563zM471 264h215q168 0 168 152q0 66 -42 105.5t-126 39.5h-215v-297zM471 815h262q63 45 64 141q0 145 -164 146h-162v-287z" /> +<glyph unicode="C" horiz-adv-x="1384" d="M70 653q0 317 212 527.5t566 210.5q295 0 471 -103l12 -8l-117 -264q-14 10 -41.5 26.5t-125 44t-207.5 27.5q-203 0 -327 -115.5t-124 -316.5q0 -207 129 -318.5t313 -111.5q111 0 209.5 29.5t141.5 58.5l43 31l129 -230q-6 -6 -19.5 -17t-62.5 -40t-105.5 -50.5 t-151.5 -40t-202 -18.5q-315 0 -529 179.5t-214 498.5z" /> +<glyph unicode="D" horiz-adv-x="1497" d="M154 0v1366h526q143 0 271 -36t236.5 -111.5t172 -207.5t63.5 -306q0 -336 -224 -520.5t-597 -184.5h-448zM471 264h111q260 0 386 119t126 313q0 186 -112 296t-331 110h-180v-838z" /> +<glyph unicode="E" horiz-adv-x="1134" d="M154 0v1366h893v-264h-576v-277h455v-268h-455v-293h602v-264h-919z" /> +<glyph unicode="F" horiz-adv-x="1105" d="M154 0v1366h899v-264h-582v-291h461v-262h-461v-549h-317z" /> +<glyph unicode="G" horiz-adv-x="1456" d="M66 657q0 305 217 519.5t583 214.5q127 0 245 -25t171 -49l55 -25l-116 -266q-156 88 -365 88q-219 0 -344 -124t-125 -316q0 -201 135 -311.5t332 -110.5l193 14v240h-265v266h576v-737q-317 -59 -524 -60q-334 0 -551 187.5t-217 494.5z" /> +<glyph unicode="H" horiz-adv-x="1570" d="M154 0v1366h317v-535h631v535h315v-1366h-315v563h-631v-563h-317z" /> +<glyph unicode="I" horiz-adv-x="626" d="M154 0v1366h317v-1366h-317z" /> +<glyph unicode="J" horiz-adv-x="624" d="M-115 -127q270 20 271 393v1100h317v-1090q0 -131 -20.5 -233t-71.5 -197.5t-153.5 -158t-254.5 -82.5z" /> +<glyph unicode="K" horiz-adv-x="1327" d="M154 0v1366h317v-516h43l410 516h393l-543 -637l574 -729h-400l-434 582h-43v-582h-317z" /> +<glyph unicode="L" horiz-adv-x="1097" d="M154 0v1366h317v-1102h596v-264h-913z" /> +<glyph unicode="M" horiz-adv-x="1824" d="M129 0l51 1366h453l282 -850l283 850h449l49 -1366h-307l-35 1016l-346 -1016h-201l-338 999l-33 -999h-307z" /> +<glyph unicode="N" horiz-adv-x="1529" d="M154 0v1366h321l590 -874v874h311v-1366h-325l-586 874v-874h-311z" /> +<glyph unicode="O" d="M66 680q0 182 85 341t262 264.5t414 105.5q342 0 549 -198t207 -484q0 -295 -215 -514.5t-559 -219.5q-225 0 -397 100.5t-259 259.5t-87 345zM395 686q0 -174 110.5 -309t309.5 -135t317.5 133t118.5 317q0 178 -112.5 305t-313 127t-315.5 -128t-115 -310z" /> +<glyph unicode="P" horiz-adv-x="1226" d="M154 0v1366h522q252 0 383 -128t131 -325q0 -221 -146.5 -353t-367.5 -132h-205v-428h-317zM471 692h158q115 0 173 55.5t58 151.5q0 203 -231 203h-158v-410z" /> +<glyph unicode="Q" d="M63 680q0 135 51.5 260t144.5 226.5t241.5 163t328.5 61.5q342 0 547 -198t205 -484q0 -229 -136 -422t-370 -271q39 -51 73 -84.5t93 -71.5t142 -55q66 -13 148 -13q20 0 42 1l-47 -282q-9 0 -18 -1q-127 0 -232 28q-113 30 -189.5 83t-119.5 94t-90 97q-10 14 -17 20 l-61 72q-20 25 -60.5 49t-74.5 33q-279 55 -440 246.5t-161 447.5zM395 686q0 -180 110.5 -316.5t309.5 -136.5t317.5 136.5t118.5 320.5q0 182 -112.5 308t-315.5 126q-201 0 -314.5 -128t-113.5 -310z" /> +<glyph unicode="R" horiz-adv-x="1333" d="M154 0v1366h508q254 0 383 -119t129 -311q0 -252 -211 -369l370 -567h-377l-305 481h-180v-481h-317zM471 743h113q147 0 203.5 48.5t56.5 136.5q0 174 -232 174h-141v-359z" /> +<glyph unicode="S" horiz-adv-x="1062" d="M72 90l92 277l45 -33q29 -20 114 -53t166 -33q84 0 133.5 31.5t49.5 85.5q0 55 -60.5 102t-145.5 88t-170 90t-145.5 134t-60.5 198q0 172 131 293t352 121q88 0 183.5 -15.5t148.5 -32.5l51 -14l-43 -280q-166 70 -329 69q-84 0 -129 -28.5t-45 -77.5q0 -55 60 -101.5 t145 -85.5t170 -88t145.5 -137t60.5 -207q0 -188 -141 -303t-350 -115q-233 0 -418 109z" /> +<glyph unicode="T" horiz-adv-x="1239" d="M35 1102v264h1169v-264h-422v-1102h-317v1102h-430z" /> +<glyph unicode="U" horiz-adv-x="1449" d="M139 522v844h318v-819q0 -305 270 -305q127 0 199.5 78.5t72.5 218.5v827h316v-815q0 -270 -167 -423t-423 -153q-262 0 -424 133t-162 414z" /> +<glyph unicode="V" horiz-adv-x="1259" d="M2 1366h336l295 -891l299 891h325l-477 -1376h-301z" /> +<glyph unicode="W" horiz-adv-x="2013" d="M29 1366h327l262 -946l277 946h231l277 -938l258 938h321l-405 -1376h-324l-252 815l-241 -815h-324z" /> +<glyph unicode="X" horiz-adv-x="1306" d="M20 0l445 676l-445 690h373l262 -430l267 430h362l-442 -682l442 -684h-375l-262 428l-260 -428h-367z" /> +<glyph unicode="Y" horiz-adv-x="1284" d="M-10 1366h372l279 -502l295 502h358l-493 -807v-559h-318v557z" /> +<glyph unicode="Z" horiz-adv-x="1196" d="M74 0v197l608 905h-586v264h998v-197l-598 -905h626v-264h-1048z" /> +<glyph unicode="[" horiz-adv-x="598" d="M141 -340v1706h432v-162h-225v-1382h225v-162h-432z" /> +<glyph unicode="\" horiz-adv-x="978" d="M57 1366h201l682 -1767h-203z" /> +<glyph unicode="]" horiz-adv-x="591" d="M16 -209h228v1442h-228v133h435v-1706h-435v131z" /> +<glyph unicode="^" horiz-adv-x="937" d="M-53 512l438 879h166l438 -879h-203l-319 647l-322 -647h-198z" /> +<glyph unicode="_" horiz-adv-x="1040" d="M10 -76h1024v-151h-1024v151z" /> +<glyph unicode="`" horiz-adv-x="1052" d="M268 1456h283l215 -332l-162 -82z" /> +<glyph unicode="a" horiz-adv-x="1034" d="M43 229q0 287 541 359v35q0 61 -24.5 89.5t-82.5 28.5q-156 0 -305 -110l-6 -4l-66 211q18 14 54 34.5t154 55.5t245 35q188 0 264 -75t76 -235v-329q0 -84 90 -97l16 -2l-86 -239h-6q-206 0 -286 133q-16 -29 -44 -57.5t-92.5 -57.5t-146.5 -29q-133 0 -214 70.5 t-81 183.5zM354 258q0 -70 68 -70q82 0 162 101v139q-230 -35 -230 -170z" /> +<glyph unicode="b" horiz-adv-x="1107" d="M106 39v1384l312 50v-582q88 72 217 72q201 0 307.5 -130.5t106.5 -330.5q0 -227 -139.5 -377t-422.5 -150q-92 0 -187 16.5t-144 33.5zM418 201q33 -18 88 -19q102 0 164.5 80t62.5 227q0 117 -47 181.5t-121 64.5q-76 0 -147 -49v-485z" /> +<glyph unicode="c" horiz-adv-x="966" d="M53 446q0 211 150.5 364t380.5 153q96 0 183 -22.5t126 -47.5l41 -23l-103 -221q-96 84 -210 84q-106 0 -178 -67.5t-72 -200.5q0 -123 63.5 -191.5t165.5 -68.5q61 0 121.5 23.5t89.5 45.5l29 23l94 -203q-12 -12 -37 -32.5t-117 -53.5t-202 -33q-238 0 -381.5 135 t-143.5 336z" /> +<glyph unicode="d" horiz-adv-x="1118" d="M59 440q0 135 51.5 252t162 194t259.5 77q88 0 160 -27v487l309 50v-1188q0 -49 11.5 -121t21.5 -119l10 -45l-286 -14q-18 66 -29 133q-98 -143 -276.5 -143.5t-286 133.5t-107.5 331zM377 459q0 -123 40 -193.5t115 -70.5q88 0 160 96v352q-6 96 -123 96 q-90 0 -141 -70.5t-51 -209.5z" /> +<glyph unicode="e" horiz-adv-x="1017" d="M59 465q0 211 131.5 354.5t341.5 143.5q186 0 299 -123t115 -363l-162 -45l-409 -53q53 -174 223 -174q139 0 285 108l4 4l80 -213q-18 -14 -52 -35.5t-141.5 -57.5t-216.5 -36q-236 0 -367 141.5t-131 348.5zM360 541l261 34q0 6 -1.5 17.5t-8.5 40.5t-17 50.5 t-33.5 38.5t-54.5 17q-63 0 -101.5 -54t-44.5 -144z" /> +<glyph unicode="f" horiz-adv-x="770" d="M37 723v170l145 49v66q0 238 137.5 373t348.5 135q82 0 156.5 -20.5t107.5 -41.5l33 -18l-97 -228q-86 66 -192 66q-182 0 -182 -242v-94h245v-215h-245v-723h-312v723h-145z" /> +<glyph unicode="g" horiz-adv-x="1062" d="M39 -250q0 131 215 260q-76 31 -107.5 63.5t-31.5 82.5q0 109 147 196q-92 43 -141 118t-49 167q0 152 125 239t301 87q66 0 145.5 -19.5t130.5 -19.5h127l129 20l14 -207h-94q-14 0 -71 8q55 -63 55 -139q0 -131 -134 -213t-317 -82q-37 0 -53 2q-57 -39 -57 -59 q0 -16 35.5 -29.5t140.5 -44.5l129 -37q70 -20 113 -36.5t102 -48t90 -80t31 -109.5q0 -141 -152.5 -247.5t-382.5 -106.5q-178 0 -309 64.5t-131 170.5zM309 -190q0 -90 187 -91q100 0 167.5 27t67.5 70q0 18 -11 32.5t-44 27.5t-60 22l-88 26l-98 27q-121 -75 -121 -141z M356 633q0 -45 38 -85t104 -40q63 0 104 39t41 88q0 47 -36 88t-103 41q-70 0 -109 -43t-39 -88z" /> +<glyph unicode="h" horiz-adv-x="1107" d="M115 0v1423l311 50v-670q137 160 317 160q262 0 263 -304v-659h-310v514q0 102 -16 141t-59 39q-80 0 -195 -123v-571h-311z" /> +<glyph unicode="i" horiz-adv-x="540" d="M96 1286q0 74 47 118t125 44t126 -44t48 -118t-48 -118t-126 -44t-125 44t-47 118zM115 0v938h311v-938h-311z" /> +<glyph unicode="j" horiz-adv-x="540" d="M-150 -250q121 16 193 84t72 229v875h311v-875q0 -250 -136 -385t-347 -163zM94 1286q0 74 47 118t125 44t126 -44t48 -118t-48 -118t-126 -44t-125 44t-47 118z" /> +<glyph unicode="k" horiz-adv-x="1122" d="M115 0v1423l311 50v-836h35l272 301h389l-395 -408l401 -530h-376l-295 412h-31v-412h-311z" /> +<glyph unicode="l" horiz-adv-x="540" d="M115 0v1423l311 50v-1473h-311z" /> +<glyph unicode="m" horiz-adv-x="1679" d="M111 0v913l295 48v-166q160 168 323 168q201 0 250 -172q156 172 332 172q266 0 266 -304v-659h-309v561q0 76 -18.5 104.5t-63.5 28.5q-78 0 -191 -112v-582h-311v561q0 76 -19.5 104.5t-58.5 28.5q-76 0 -184 -114v-580h-311z" /> +<glyph unicode="n" horiz-adv-x="1103" d="M111 0v913l295 48v-168q147 170 333 170q262 0 262 -304v-659h-311v514q0 102 -12 141t-62 39q-82 0 -194 -116v-578h-311z" /> +<glyph unicode="o" horiz-adv-x="1171" d="M57 467q0 92 29 177t89.5 157.5t165.5 117t245 44.5q260 0 396 -139.5t136 -338.5q0 -88 -28.5 -173t-88 -162.5t-168 -126t-251.5 -48.5q-254 0 -389.5 142.5t-135.5 349.5zM375 479q0 -113 56 -198.5t153 -85.5q90 0 153.5 74.5t63.5 191.5q0 111 -56.5 195.5 t-156.5 84.5q-90 0 -151.5 -72.5t-61.5 -189.5z" /> +<glyph unicode="p" horiz-adv-x="1116" d="M111 -485v1398l297 48v-154q78 156 260 156q180 0 285.5 -133.5t105.5 -329.5q0 -213 -124 -369t-351 -156q-113 0 -162 31v-442zM422 258q0 -25 29.5 -43t83.5 -18q86 0 146 72.5t60 211.5q0 115 -41 181.5t-100 66.5q-96 0 -178 -127v-344z" /> +<glyph unicode="q" horiz-adv-x="1110" d="M59 430q0 225 138.5 379t392.5 154q76 0 178 -14.5t168 -28.5l65 -15v-1341l-311 -49v530q-78 -70 -213 -70q-205 0 -311.5 130t-106.5 325zM375 453q0 -115 47 -179.5t118.5 -64.5t149.5 45v479q-51 20 -96 21q-94 0 -156.5 -80t-62.5 -221z" /> +<glyph unicode="r" horiz-adv-x="784" d="M111 0v913l295 48v-197q127 199 284 199q23 0 43.5 -4.5t28.5 -8.5l8 -2l-41 -289q-45 18 -94 19q-109 0 -213 -131v-547h-311z" /> +<glyph unicode="s" horiz-adv-x="868" d="M55 57l62 248l35 -27q23 -17 95 -45t148 -28q113 0 113 57q0 29 -44 52.5t-107.5 47t-126 56.5t-106.5 94t-44 145q0 127 103.5 216.5t316.5 89.5q78 0 148.5 -12.5t101.5 -24.5l32 -15l-57 -247q-94 70 -236 69q-104 0 -104 -55q0 -29 44 -53.5t106.5 -48t126 -56.5 t107.5 -93t44 -142q0 -135 -110.5 -222.5t-307.5 -87.5q-94 0 -179 20.5t-122 41.5z" /> +<glyph unicode="t" horiz-adv-x="854" d="M33 723v168l164 51v221l297 56v-281h278v-215h-276v-377q0 -121 86 -121q63 0 172 76l86 -219q-16 -12 -45 -29.5t-117 -47.5t-172 -30q-145 0 -233.5 78t-88.5 217v453h-151z" /> +<glyph unicode="u" horiz-adv-x="1112" d="M104 258v680h312v-557q0 -76 17.5 -108.5t60.5 -32.5q78 0 188 104v594h311v-653l41 -279l-299 -26q-16 84 -26 151q-160 -156 -342 -156q-117 0 -190 71t-73 212z" /> +<glyph unicode="v" horiz-adv-x="997" d="M0 938h324l176 -541l186 541h313l-364 -942h-277z" /> +<glyph unicode="w" horiz-adv-x="1601" d="M18 938h314l157 -592l183 592h260l196 -594l144 594h307l-274 -942h-301l-199 561l-180 -561h-303z" /> +<glyph unicode="x" horiz-adv-x="1017" d="M14 0l322 467l-322 471h348l150 -236l156 236h333l-321 -463l321 -475h-337l-158 240l-158 -240h-334z" /> +<glyph unicode="y" horiz-adv-x="995" d="M-4 938h317l191 -592l184 592h309l-374 -1004q-59 -158 -199.5 -281.5t-323.5 -137.5l-92 239q106 8 200.5 64.5t127.5 136.5l22 53z" /> +<glyph unicode="z" horiz-adv-x="942" d="M68 0v190l393 517h-377v231h774v-190l-401 -517h415v-231h-804z" /> +<glyph unicode="{" horiz-adv-x="684" d="M16 459v157q39 2 71 15.5t53.5 42t37 56.5t25.5 77t15 84t8 97.5t3 97.5v104q0 166 123 247t328 81v-152q-51 -4 -87 -12t-62.5 -16.5t-42 -28t-25.5 -34.5t-15.5 -51t-6.5 -61.5t-3 -81.5q-4 -186 -31.5 -297.5t-67.5 -161t-110 -81.5v-4q104 -49 152.5 -173t56.5 -391 q2 -76 5 -107.5t15.5 -72.5t38 -55t68.5 -28.5t115 -20.5v-152q-264 0 -357.5 94.5t-93.5 339.5q0 478 -213 488z" /> +<glyph unicode="|" horiz-adv-x="487" d="M139 -461v1995h209v-1995h-209z" /> +<glyph unicode="}" horiz-adv-x="684" d="M6 -311q59 6 97 13t66 25.5t41 34t21.5 52t9.5 66.5l3 93q8 274 59 395t154 169v4q-109 49 -157 161.5t-56 378.5q-2 92 -6.5 131t-28 78t-70.5 53.5t-133 22.5v152q250 0 348.5 -93.5t98.5 -345.5q0 -459 215 -463v-157q-27 0 -51.5 -9.5t-56.5 -40t-54.5 -80.5 t-37.5 -143.5t-15 -218.5q0 -242 -92.5 -336t-354.5 -94v152z" /> +<glyph unicode="~" horiz-adv-x="1187" d="M100 336q0 184 78 273t219 89q82 0 142.5 -29.5t90 -65.5t69.5 -65.5t83 -29.5q70 0 98.5 57.5t28.5 124.5h187q0 -184 -78 -273t-219 -89q-82 0 -142.5 29.5t-90 65.5t-69.5 65.5t-83 29.5q-70 0 -98.5 -57.5t-28.5 -124.5h-187z" /> +<glyph unicode="¡" horiz-adv-x="610" d="M129 -455l59 895h240l55 -895h-354zM139 784q0 72 52.5 124.5t125.5 52.5q72 0 124.5 -52.5t52.5 -124.5q0 -74 -52.5 -127t-124.5 -53q-74 0 -126 53t-52 127z" /> +<glyph unicode="¢" horiz-adv-x="999" d="M66 569q0 180 122.5 307.5t341.5 139.5l9 182h104l-10 -184q188 -20 293 -111l-146 -186q-63 49 -157 61l-21 -405q51 6 105.5 26.5t83.5 38.5l26 17l92 -203q-12 -12 -34.5 -29.5t-104.5 -49.5t-178 -38l-6 -180h-103l9 180q-197 14 -311.5 137t-114.5 297zM365 580 q0 -78 35.5 -131.5t101.5 -69.5l18 397q-155 -30 -155 -196z" /> +<glyph unicode="£" horiz-adv-x="1148" d="M70 135q14 6 36.5 17.5t62.5 57.5t46 101l21 178h-123v127h137l18 162q20 180 129 288t295 108q195 0 320 -109l8 -8l-146 -185q-76 72 -174 72q-59 0 -92 -37t-45 -135l-16 -156h325l-16 -127h-321q-8 -72 -23.5 -135t-28.5 -92l-12 -29q80 -49 199 -49q190 0 202 164 h209q-20 -184 -96 -291.5t-250 -107.5q-92 0 -216 46t-189 46q-70 0 -219 -41z" /> +<glyph unicode="¥" horiz-adv-x="1171" d="M70 1149h317l199 -395l200 395h308l-252 -463h211v-127h-281l-35 -63v-88h316v-127h-316v-281h-309v281h-295v127h295v86l-37 65h-258v127h189z" /> +<glyph unicode="¦" horiz-adv-x="471" d="M131 -362v733h209v-733h-209zM131 688v733h209v-733h-209z" /> +<glyph unicode="§" horiz-adv-x="1013" d="M57 -379l62 152q141 -96 301 -97q111 0 168 82t57 211q0 47 -10 109l-103 573q-23 113 -22 209q0 135 53 209l160 -22q-35 -76 -35 -189q0 -53 10 -115l113 -649q12 -68 12 -135q0 -193 -100 -318.5t-299 -125.5q-94 0 -185.5 26.5t-136.5 52.5zM168 946q0 193 100.5 319 t296.5 126q94 0 186.5 -27t137.5 -53l45 -27l-62 -151q-141 96 -303 96q-109 0 -166 -82t-57 -211q0 -47 10 -109l107 -573q20 -102 20 -209q0 -135 -51 -209l-160 23q35 82 35 188q0 53 -10 115l-117 649q-12 67 -12 135z" /> +<glyph unicode="¨" horiz-adv-x="1052" d="M135 1282q0 70 41 109t112.5 39t112.5 -39t41 -109t-41 -107.5t-112.5 -37.5t-112.5 37.5t-41 107.5zM610 1282q0 70 41 109t113 39t113 -39t41 -109t-41 -107.5t-113 -37.5q-74 0 -114 37.5t-40 107.5z" /> +<glyph unicode="©" horiz-adv-x="1556" d="M70 682q0 293 206.5 500t499.5 207t500 -207t207 -500t-207 -500t-500 -207t-499.5 207t-206.5 500zM190 682q0 -246 170 -421t416 -175q248 0 419 174t171 422t-171 422t-419 174q-246 0 -416 -175t-170 -421zM381 682q0 166 112.5 293t303.5 127q184 0 286 -113l11 -10 l-93 -143q-8 10 -23 26.5t-66.5 43t-108.5 26.5q-106 0 -163.5 -69.5t-57.5 -166.5q0 -106 61.5 -179t165.5 -73q131 4 225 99l56 -150q-10 -12 -31 -32.5t-97.5 -53.5t-166.5 -33q-180 0 -297 117t-117 291z" /> +<glyph unicode="ª" horiz-adv-x="813" d="M63 879q0 205 381 251v23q0 76 -73 76q-47 0 -102.5 -22.5t-88.5 -43.5l-30 -22l-48 159q14 10 40 24.5t112 39.5t178 25q137 0 191.5 -53.5t54.5 -161.5v-236q8 -63 74 -74l-56 -159q-170 0 -229 90q-70 -96 -186 -97q-98 0 -158 50.5t-60 130.5zM299 905 q0 -23 14.5 -37t36.5 -14q41 0 94 49v109q-145 -23 -145 -107z" /> +<glyph unicode="«" horiz-adv-x="1042" d="M25 510v8q31 25 206 225l177 203l157 -47l-284 -385l284 -385l-157 -47l-161 182l-107 121l-57 66q-26 29 -36 39t-22 20zM430 510v8q31 25 205 223l180 205l158 -47l-285 -385l285 -385l-158 -47l-163 182l-106 121l-58 66q-26 29 -36 39t-22 20z" /> +<glyph unicode="¬" horiz-adv-x="1155" d="M88 633v180h954v-586h-188v406h-766z" /> +<glyph unicode="­" horiz-adv-x="792" d="M102 442v170h588v-170h-588z" /> +<glyph unicode="®" horiz-adv-x="854" d="M72 1087.5q0 145.5 104.5 250t249.5 104.5t249.5 -104.5t104.5 -250t-104.5 -250t-249.5 -104.5t-249.5 104.5t-104.5 250zM152 1087.5q0 -112.5 82.5 -198.5t191.5 -86t192.5 86t83.5 198.5t-83.5 197.5t-192.5 85t-191.5 -85t-82.5 -197.5zM295 918v348h123 q143 0 143 -105q0 -61 -57 -94l110 -149h-110l-88 126h-21v-126h-100zM395 1110h29q39 0 39 45q0 43 -53 43h-15v-88z" /> +<glyph unicode="¯" horiz-adv-x="937" d="M188 1171v179h562v-179h-562z" /> +<glyph unicode="°" horiz-adv-x="630" d="M66 1144.5q0 102.5 72.5 174.5t177 72t177 -72t72.5 -174.5t-72.5 -174t-177 -71.5t-177 71.5t-72.5 174zM188 1145q0 -55 37 -92t90.5 -37t89 37t35.5 92t-35.5 91t-89 36t-90.5 -36t-37 -91z" /> +<glyph unicode="±" horiz-adv-x="1064" d="M100 616v183h338v344h193v-344h330v-183h-330v-323h-193v323h-338zM121 0v182h829v-182h-829z" /> +<glyph unicode="²" horiz-adv-x="724" d="M49 1499q12 12 36 30.5t98.5 50.5t152.5 32q129 0 213 -72t84 -188q0 -100 -66.5 -193.5t-204.5 -216.5h308v-172h-598l-19 139l70 62l74 65l62 59q44 42 62.5 64.5t43 56t34 61.5t9.5 52q0 82 -103 82q-39 0 -74.5 -14.5t-50.5 -28.5l-16 -14z" /> +<glyph unicode="³" horiz-adv-x="692" d="M33 836l96 155q74 -55 162 -55q49 0 75.5 22.5t26.5 59.5q0 76 -127 76h-80v168q170 8 170 100q0 61 -75 61q-68 0 -129 -45l-95 144q14 10 38 25.5t97.5 40t147.5 24.5q123 0 190.5 -60.5t67.5 -144.5q0 -70 -45 -127t-98 -78q82 -16 131 -67.5t49 -122.5 q0 -102 -95.5 -181t-236.5 -79q-70 0 -137.5 21.5t-99.5 41.5z" /> +<glyph unicode="´" horiz-adv-x="1095" d="M291 1124l213 332h280l-335 -414z" /> +<glyph unicode="µ" horiz-adv-x="1234" d="M121 -442q20 199 20 362v1018h308v-545q0 -86 18 -119.5t57 -33.5q78 0 195 104v594h309v-623q0 -84 22.5 -103t110.5 -19v-207q-96 -10 -151 -11q-248 0 -277 148q-152 -147 -332 -148q-29 0 -41 2q8 -86 38 -235.5t30 -183.5h-307z" /> +<glyph unicode="μ" horiz-adv-x="1234" d="M121 -442q20 199 20 362v1018h308v-545q0 -86 18 -119.5t57 -33.5q78 0 195 104v594h309v-623q0 -84 22.5 -103t110.5 -19v-207q-96 -10 -151 -11q-248 0 -277 148q-152 -147 -332 -148q-29 0 -41 2q8 -86 38 -235.5t30 -183.5h-307z" /> +<glyph unicode="¶" horiz-adv-x="1394" d="M59 864q0 203 155 352.5t431 149.5h660v-147h-152v-1219h-158v1219h-153v-1260q0 -444 -391 -444l-31 159q133 0 193.5 74t60.5 242v377h-19q-291 0 -443.5 145t-152.5 352z" /> +<glyph unicode="·" horiz-adv-x="538" d="M92 524.5q0 71.5 52.5 124.5t123.5 53q74 0 127.5 -53t53.5 -124.5t-53.5 -124t-127.5 -52.5q-72 0 -124 52.5t-52 124z" /> +<glyph unicode="¸" horiz-adv-x="1052" d="M324 -422l51 123q74 -59 164 -59q41 0 66.5 13t25.5 33.5t-28 39t-60.5 31t-60 38t-27.5 60.5q0 37 30 92l27 51h137l-20 -41q-16 -43 -17 -49q0 -20 29 -35.5t63.5 -28t63.5 -46t29 -85.5q0 -88 -71 -144t-187 -56q-133 0 -215 63z" /> +<glyph unicode="¹" horiz-adv-x="681" d="M61 770v164h199v500h-182v163h403v-663h178v-164h-598z" /> +<glyph unicode="º" horiz-adv-x="892" d="M63 1042q0 139 95.5 243t287.5 104q186 0 284.5 -98.5t98.5 -235.5t-95 -247t-290 -110q-184 0 -282.5 100.5t-98.5 243.5zM307 1047q0 -74 37 -131.5t102 -57.5q59 0 99.5 50t40.5 130q0 76 -36 133.5t-99 57.5q-59 0 -101.5 -51t-42.5 -131z" /> +<glyph unicode="»" horiz-adv-x="1042" d="M72 129l282 385l-282 385l157 47q348 -397 369 -416q6 -6 14 -12v-8q-12 -10 -22 -20.5l-36 -38.5l-57 -66l-107 -121l-161 -182zM477 129l285 385l-285 385l156 47l184 -209q172 -195 203 -219v-8q-12 -10 -22.5 -20.5t-35.5 -38.5l-59 -66l-107 -121l-163 -182z" /> +<glyph unicode="¼" horiz-adv-x="1777" d="M86 535v163h199v500h-183v164h404v-664h178v-163h-598zM475 0l819 1423l144 -65l-781 -1358h-182zM1024 319l307 510h275v-499h106v-164h-106v-166h-213v166h-349zM1200 330h193v315z" /> +<glyph unicode="½" horiz-adv-x="1841" d="M84 535v163h199v500h-183v164h404v-664h178v-163h-598zM535 0l819 1423l143 -65l-780 -1358h-182zM1153 729q12 12 35.5 30.5t98.5 50.5t153 32q129 0 213 -72t84 -188q0 -100 -66.5 -193.5t-204.5 -216.5h308v-172h-598l-19 139l70 62l73 65l63 59q44 42 62.5 64.5 t43 56t33.5 61.5t9 52q0 82 -102 82q-39 0 -75 -14.5t-52 -28.5l-14 -14z" /> +<glyph unicode="¾" horiz-adv-x="1812" d="M66 600l96 156q74 -55 162 -56q49 0 75.5 22.5t26.5 59.5q0 76 -127 76h-80v168q170 8 170 100q0 61 -76 62q-68 0 -129 -45l-94 143q14 10 38 25.5t97.5 40t147.5 24.5q123 0 190.5 -60.5t67.5 -144.5q0 -70 -45 -127t-99 -77q82 -16 131.5 -67.5t49.5 -123.5 q0 -102 -95.5 -181t-236.5 -79q-70 0 -137.5 20.5t-100.5 41.5zM508 0l819 1423l143 -65l-780 -1358h-182zM1057 319l307 510h274v-499h107v-164h-107v-166h-213v166h-348zM1233 330h192v315z" /> +<glyph unicode="¿" horiz-adv-x="813" d="M66 -51q0 63 46 130.5t101 116t101 116t46 130.5h250q2 -23 2 -34q0 -70 -32.5 -139.5t-72.5 -113.5t-73 -89.5t-33 -71.5q0 -55 85 -115.5t169 -93.5l86 -33l-69 -270q-12 4 -34 10t-85.5 29.5t-120.5 49.5t-126.5 66.5t-120 86t-85 105t-34.5 120.5zM303 786 q0 72 52.5 124.5t126 52.5t124.5 -52.5t51 -124.5q0 -76 -51 -128t-124.5 -52t-126 52t-52.5 128z" /> +<glyph unicode="À" horiz-adv-x="1320" d="M2 0l508 1376h301l508 -1376h-322l-86 246h-510l-86 -246h-313zM365 1583l75 207l471 -195l-59 -155zM494 512h325l-164 463z" /> +<glyph unicode="Á" horiz-adv-x="1320" d="M2 0l508 1376h301l508 -1376h-322l-86 246h-510l-86 -246h-313zM401 1595l471 195l74 -207l-487 -143zM494 512h325l-164 463z" /> +<glyph unicode="Â" horiz-adv-x="1320" d="M2 0l508 1376h301l508 -1376h-322l-86 246h-510l-86 -246h-313zM281 1565l258 219h235l256 -219l-156 -95l-221 168l-219 -168zM494 512h325l-164 463z" /> +<glyph unicode="Ã" horiz-adv-x="1320" d="M2 0l508 1376h301l508 -1376h-322l-86 246h-510l-86 -246h-313zM258 1528q0 39 8 75.5t29.5 79.5t71 69t122.5 26q80 0 146.5 -33t112 -64.5t75.5 -31.5q59 0 60 96l-2 27h174q2 -14 2 -41q0 -39 -8.5 -76t-30 -82t-73.5 -72.5t-126 -27.5q-66 0 -118 20t-80.5 45 t-62.5 45.5t-62 20.5q-63 0 -64 -95l2 -28h-174q-2 18 -2 47zM494 512h325l-164 463z" /> +<glyph unicode="Ä" horiz-adv-x="1320" d="M2 0l508 1376h301l508 -1376h-322l-86 246h-510l-86 -246h-313zM227 1628.5q0 69.5 44 111.5t116 42t116 -42t44 -111.5t-44 -110.5t-116 -41t-116 41t-44 110.5zM494 512h325l-164 463zM764 1628.5q0 69.5 44 111.5t115.5 42t115.5 -42t44 -111.5t-44 -110.5t-115.5 -41 t-115.5 41t-44 110.5z" /> +<glyph unicode="Å" horiz-adv-x="1320" d="M2 0l508 1376h301l508 -1376h-322l-86 246h-510l-86 -246h-313zM440 1622q0 68 54.5 115t161 47t159.5 -47t53 -115q0 -78 -52 -127t-160.5 -49t-162 49t-53.5 127zM494 512h325l-164 463zM565 1620q0 -84 90 -84q43 0 68 22.5t25 61.5q0 29 -25 51.5t-68 22.5 q-45 0 -67.5 -22.5t-22.5 -51.5z" /> +<glyph unicode="Æ" horiz-adv-x="1886" d="M-31 0l768 1366h1059v-264h-573v-277h454v-268h-454v-293h602v-264h-920v336h-416l-182 -336h-338zM635 602h270v496z" /> +<glyph unicode="Ç" horiz-adv-x="1384" d="M72 653q0 317 212 527.5t566 210.5q295 0 471 -103l12 -8l-116 -264q-14 10 -42 26.5t-125.5 44t-207.5 27.5q-203 0 -327 -115.5t-124 -316.5q0 -207 129 -318.5t314 -111.5q111 0 209 29.5t141 58.5l43 31l129 -230q-6 -6 -19.5 -17t-59.5 -39t-101.5 -49.5t-146.5 -40 t-191 -20.5l-9 -16q-16 -43 -16 -49q0 -20 28.5 -35.5t63.5 -28t63.5 -46t28.5 -85.5q0 -88 -70.5 -144t-187.5 -56q-133 0 -215 63l51 123q74 -59 164 -59q41 0 66.5 13t25.5 33.5t-27.5 39t-60 31t-60.5 38t-28 60.5q0 37 31 92l16 33q-276 31 -453 205.5t-177 465.5z" /> +<glyph unicode="È" horiz-adv-x="1134" d="M154 0v1366h893v-264h-576v-277h455v-268h-455v-293h602v-264h-919zM317 1583l76 207l471 -195l-59 -155z" /> +<glyph unicode="É" horiz-adv-x="1134" d="M154 0v1366h893v-264h-576v-277h455v-268h-455v-293h602v-264h-919zM354 1595l471 195l74 -207l-487 -143z" /> +<glyph unicode="Ê" horiz-adv-x="1134" d="M154 0v1366h893v-264h-576v-277h455v-268h-455v-293h602v-264h-919zM233 1565l259 219h235l256 -219l-156 -95l-221 168l-219 -168z" /> +<glyph unicode="Ë" horiz-adv-x="1134" d="M154 0v1366h893v-264h-576v-277h455v-268h-455v-293h602v-264h-919zM180 1628.5q0 69.5 44 111.5t116 42t116 -42t44 -111.5t-44 -110.5t-116 -41t-116 41t-44 110.5zM717 1628.5q0 69.5 44 111.5t115.5 42t115.5 -42t44 -111.5t-44 -110.5t-115.5 -41t-115.5 41 t-44 110.5z" /> +<glyph unicode="Ì" horiz-adv-x="626" d="M27 1583l75 207l471 -195l-59 -155zM154 0v1366h317v-1366h-317z" /> +<glyph unicode="Í" horiz-adv-x="626" d="M63 1595l472 195l73 -207l-487 -143zM154 0v1366h317v-1366h-317z" /> +<glyph unicode="Î" horiz-adv-x="626" d="M-57 1565l258 219h235l256 -219l-155 -95l-222 168l-219 -168zM154 0v1366h317v-1366h-317z" /> +<glyph unicode="Ï" horiz-adv-x="626" d="M-72 1634.5q0 69.5 41 108.5t113 39t113 -39t41 -108.5t-41 -107.5t-113 -38t-113 38t-41 107.5zM154 0v1366h317v-1366h-317zM403 1634.5q0 69.5 41 108.5t113 39t113 -39t41 -108.5t-41 -107.5t-113 -38q-74 0 -114 38t-40 107.5z" /> +<glyph unicode="Ð" horiz-adv-x="1533" d="M45 575v238h148v553h524q143 0 271 -36t237.5 -111.5t173 -207.5t63.5 -306q0 -336 -225 -520.5t-598 -184.5h-446v575h-148zM508 264h110q262 0 389.5 119t127.5 313q0 184 -114 295t-333 111h-180v-289h299v-238h-299v-311z" /> +<glyph unicode="Ñ" horiz-adv-x="1529" d="M154 0v1366h321l590 -874v874h311v-1366h-325l-586 874v-874h-311zM367 1528q0 39 8 75.5t29.5 79.5t70.5 69t123 26q80 0 146.5 -33t111.5 -64.5t76 -31.5q59 0 59 96l-2 27h174q2 -14 2 -41q0 -39 -8 -76t-29.5 -82t-74 -72.5t-125.5 -27.5q-63 0 -116.5 20t-82.5 45 t-61.5 45.5t-63.5 20.5q-63 0 -63 -95l2 -28h-174q-2 18 -2 47z" /> +<glyph unicode="Ò" d="M66 680q0 182 85 341t262 264.5t414 105.5q342 0 549 -198t207 -484q0 -295 -215 -514.5t-559 -219.5q-225 0 -397 100.5t-259 259.5t-87 345zM395 686q0 -174 110.5 -309t309.5 -135t317.5 133t118.5 317q0 178 -112.5 305t-313 127t-315.5 -128t-115 -310zM532 1583 l76 207l471 -195l-59 -155z" /> +<glyph unicode="Ó" d="M66 680q0 182 85 341t262 264.5t414 105.5q342 0 549 -198t207 -484q0 -295 -215 -514.5t-559 -219.5q-225 0 -397 100.5t-259 259.5t-87 345zM395 686q0 -174 110.5 -309t309.5 -135t317.5 133t118.5 317q0 178 -112.5 305t-313 127t-315.5 -128t-115 -310zM569 1595 l471 195l74 -207l-487 -143z" /> +<glyph unicode="Ô" d="M66 680q0 182 85 341t262 264.5t414 105.5q342 0 549 -198t207 -484q0 -295 -215 -514.5t-559 -219.5q-225 0 -397 100.5t-259 259.5t-87 345zM395 686q0 -174 110.5 -309t309.5 -135t317.5 133t118.5 317q0 178 -112.5 305t-313 127t-315.5 -128t-115 -310zM449 1565 l258 219h235l256 -219l-156 -95l-221 168l-219 -168z" /> +<glyph unicode="Õ" d="M66 680q0 182 85 341t262 264.5t414 105.5q342 0 549 -198t207 -484q0 -295 -215 -514.5t-559 -219.5q-225 0 -397 100.5t-259 259.5t-87 345zM395 686q0 -174 110.5 -309t309.5 -135t317.5 133t118.5 317q0 178 -112.5 305t-313 127t-315.5 -128t-115 -310zM426 1528 q0 39 8 75.5t29.5 79.5t71 69t122.5 26q80 0 146.5 -33t112 -64.5t75.5 -31.5q59 0 60 96l-2 27h174q2 -14 2 -41q0 -39 -8.5 -76t-30 -82t-73.5 -72.5t-126 -27.5q-66 0 -118 20t-80.5 45t-62.5 45.5t-62 20.5q-63 0 -64 -95l2 -28h-174q-2 18 -2 47z" /> +<glyph unicode="Ö" d="M66 680q0 182 85 341t262 264.5t414 105.5q342 0 549 -198t207 -484q0 -295 -215 -514.5t-559 -219.5q-225 0 -397 100.5t-259 259.5t-87 345zM395 686q0 -174 110.5 -309t309.5 -135t317.5 133t118.5 317q0 178 -112.5 305t-313 127t-315.5 -128t-115 -310zM395 1628.5 q0 69.5 44 111.5t116 42t116 -42t44 -111.5t-44 -110.5t-116 -41t-116 41t-44 110.5zM932 1628.5q0 69.5 44 111.5t115.5 42t115.5 -42t44 -111.5t-44 -110.5t-115.5 -41t-115.5 41t-44 110.5z" /> +<glyph unicode="×" horiz-adv-x="1064" d="M66 168l344 354l-344 355l122 124l344 -354l345 354l122 -124l-346 -355l346 -354l-125 -125l-342 352l-342 -352z" /> +<glyph unicode="Ø" d="M66 680q0 182 85 341t262 264.5t414 105.5q209 0 375 -80l88 116h176l-143 -190q125 -94 192.5 -232.5t67.5 -295.5q0 -295 -215 -514.5t-559 -219.5q-209 0 -379 88l-96 -124h-178l155 202q-119 98 -182 239.5t-63 299.5zM395 686q0 -176 103 -299l528 692 q-96 45 -201 45q-201 0 -315.5 -128t-114.5 -310zM604 293q98 -51 211 -51q199 0 317.5 133t118.5 317.5t-112 302.5z" /> +<glyph unicode="Ù" horiz-adv-x="1449" d="M139 522v844h318v-819q0 -305 270 -305q127 0 199.5 78.5t72.5 218.5v827h316v-815q0 -270 -167 -423t-423 -153q-262 0 -424 133t-162 414zM434 1583l76 207l471 -195l-59 -155z" /> +<glyph unicode="Ú" horiz-adv-x="1449" d="M139 522v844h318v-819q0 -305 270 -305q127 0 199.5 78.5t72.5 218.5v827h316v-815q0 -270 -167 -423t-423 -153q-262 0 -424 133t-162 414zM471 1595l471 195l74 -207l-488 -143z" /> +<glyph unicode="Û" horiz-adv-x="1449" d="M139 522v844h318v-819q0 -305 270 -305q127 0 199.5 78.5t72.5 218.5v827h316v-815q0 -270 -167 -423t-423 -153q-262 0 -424 133t-162 414zM350 1565l258 219h236l256 -219l-156 -95l-221 168l-219 -168z" /> +<glyph unicode="Ü" horiz-adv-x="1449" d="M139 522v844h318v-819q0 -305 270 -305q127 0 199.5 78.5t72.5 218.5v827h316v-815q0 -270 -167 -423t-423 -153q-262 0 -424 133t-162 414zM297 1628.5q0 69.5 44 111.5t115.5 42t115.5 -42t44 -111.5t-44 -110.5t-115.5 -41t-115.5 41t-44 110.5zM834 1628.5 q0 69.5 44 111.5t115.5 42t115.5 -42t44 -111.5t-44 -110.5t-115.5 -41t-115.5 41t-44 110.5z" /> +<glyph unicode="Ý" horiz-adv-x="1284" d="M-10 1366h372l279 -502l295 502h358l-493 -807v-559h-318v557zM383 1595l471 195l74 -207l-488 -143z" /> +<glyph unicode="Þ" horiz-adv-x="1218" d="M154 0v1366h317v-262h221q244 0 363 -110.5t119 -284.5q0 -199 -134.5 -314.5t-347.5 -115.5h-221v-279h-317zM471 547h172q201 0 201 147q0 70 -42 108t-159 38h-172v-293z" /> +<glyph unicode="ß" horiz-adv-x="1259" d="M37 723v170l145 49v68q0 231 122 357t351 126q193 0 309.5 -87t116.5 -235q0 -88 -45 -158.5t-89 -123.5t-44 -98q0 -41 34 -79t81 -71t94 -73t81 -104.5t34 -144.5q0 -154 -110.5 -249t-303.5 -95q-59 0 -112.5 9.5t-77.5 19.5l-25 10l39 238q61 -47 141 -47 q61 0 96 32.5t35 79.5q0 39 -28.5 72t-69.5 59.5t-81 59.5t-68.5 89t-28.5 128q0 68 24.5 122t55 86t55.5 82t25 109q0 147 -138 148q-84 0 -122.5 -59.5t-38.5 -194.5v-1018h-312v723h-145z" /> +<glyph unicode="à" horiz-adv-x="1034" d="M43 229q0 287 541 359v35q0 61 -24.5 89.5t-82.5 28.5q-156 0 -305 -110l-6 -4l-66 211q18 14 54 34.5t154 55.5t245 35q188 0 264 -75t76 -235v-329q0 -84 90 -97l16 -2l-86 -239q-211 -2 -292 133q-16 -29 -44 -57.5t-92.5 -57.5t-146.5 -29q-133 0 -214 70.5 t-81 183.5zM131 1456h283l215 -332l-162 -82zM354 258q0 -70 68 -70q82 0 162 101v139q-230 -35 -230 -170z" /> +<glyph unicode="á" horiz-adv-x="1034" d="M43 229q0 287 541 359v35q0 61 -24.5 89.5t-82.5 28.5q-156 0 -305 -110l-6 -4l-66 211q18 14 54 34.5t154 55.5t245 35q188 0 264 -75t76 -235v-329q0 -84 90 -97l16 -2l-86 -239q-211 -2 -292 133q-16 -29 -44 -57.5t-92.5 -57.5t-146.5 -29q-133 0 -214 70.5 t-81 183.5zM338 1124l213 332h280l-335 -414zM354 258q0 -70 68 -70q82 0 162 101v139q-230 -35 -230 -170z" /> +<glyph unicode="â" horiz-adv-x="1034" d="M43 229q0 287 541 359v35q0 61 -24.5 89.5t-82.5 28.5q-156 0 -305 -110l-6 -4l-66 211q18 14 54 34.5t154 55.5t245 35q188 0 264 -75t76 -235v-329q0 -84 90 -97l16 -2l-86 -239q-211 -2 -292 133q-16 -29 -44 -57.5t-92.5 -57.5t-146.5 -29q-133 0 -214 70.5 t-81 183.5zM156 1106l237 350h182l240 -354l-164 -62l-168 238l-168 -238zM354 258q0 -70 68 -70q82 0 162 101v139q-230 -35 -230 -170z" /> +<glyph unicode="ã" horiz-adv-x="1034" d="M43 229q0 287 541 359v35q0 61 -24.5 89.5t-82.5 28.5q-156 0 -305 -110l-6 -4l-66 211q18 14 54 34.5t154 55.5t245 35q188 0 264 -75t76 -235v-329q0 -84 90 -97l16 -2l-86 -239q-211 -2 -292 133q-16 -29 -44 -57.5t-92.5 -57.5t-146.5 -29q-133 0 -214 70.5 t-81 183.5zM106 1153q0 39 7.5 78t28 86t69.5 76.5t119 29.5q61 0 112.5 -23.5t79 -53t58 -53t55.5 -23.5q57 0 57 102l-2 37h184q2 -14 3 -35q0 -39 -7.5 -78t-29 -88t-71.5 -79.5t-122 -30.5q-61 0 -110.5 23.5t-75 53t-54 53t-55.5 23.5q-61 0 -61 -106l2 -31h-184 q-3 14 -3 39zM354 258q0 -70 68 -70q82 0 162 101v139q-230 -35 -230 -170z" /> +<glyph unicode="ä" horiz-adv-x="1034" d="M43 229q0 287 541 359v35q0 61 -24.5 89.5t-82.5 28.5q-156 0 -305 -110l-6 -4l-66 211q18 14 54 34.5t154 55.5t245 35q188 0 264 -75t76 -235v-329q0 -84 90 -97l16 -2l-86 -239q-211 -2 -292 133q-16 -29 -44 -57.5t-92.5 -57.5t-146.5 -29q-133 0 -214 70.5 t-81 183.5zM92 1282q0 70 41 109t112.5 39t112.5 -39t41 -109t-41 -107.5t-112.5 -37.5t-112.5 37.5t-41 107.5zM354 258q0 -70 68 -70q82 0 162 101v139q-230 -35 -230 -170zM567 1282q0 70 41 109t113 39t112.5 -39t40.5 -109t-40.5 -107.5t-112.5 -37.5q-74 0 -114 37.5 t-40 107.5z" /> +<glyph unicode="å" horiz-adv-x="1034" d="M43 229q0 287 541 359v35q0 61 -24.5 89.5t-82.5 28.5q-156 0 -305 -110l-6 -4l-66 211q18 14 54 34.5t154 55.5t245 35q188 0 264 -75t76 -235v-329q0 -84 90 -97l16 -2l-86 -239q-211 -2 -292 133q-16 -29 -44 -57.5t-92.5 -57.5t-146.5 -29q-133 0 -214 70.5 t-81 183.5zM264 1290q0 72 56.5 129.5t162.5 57.5q104 0 159.5 -57.5t55.5 -129.5q0 -74 -55 -135t-160 -61q-106 0 -162.5 61t-56.5 135zM354 258q0 -70 68 -70q82 0 162 101v139q-230 -35 -230 -170zM391 1288q0 -35 25.5 -61.5t66.5 -26.5t66.5 26.5t25.5 61.5 t-24.5 59.5t-67.5 24.5t-67.5 -24.5t-24.5 -59.5z" /> +<glyph unicode="æ" horiz-adv-x="1538" d="M43 225q0 264 545 332v43q0 80 -23.5 116t-93.5 36q-141 0 -301 -113l-4 -4l-66 203q20 14 57.5 34.5t148 55.5t216.5 35q178 0 254 -117q111 117 279 117q184 0 297.5 -119t115.5 -352l-161 -54l-414 -45q53 -197 237 -196q68 0 138.5 28.5t107.5 57.5l37 30l72 -209 q-18 -14 -51 -35.5t-138.5 -57.5t-214.5 -36q-246 0 -374 189q-41 -70 -131.5 -129.5t-225.5 -59.5q-141 0 -224 70.5t-83 179.5zM344 248q0 -35 22.5 -53.5t57.5 -18.5q63 0 115.5 58.5t52.5 144.5q-248 -20 -248 -131zM885 569l260 29q0 6 -1 16.5t-8.5 36t-17.5 45 t-33.5 36t-54.5 16.5q-59 0 -98 -47.5t-47 -131.5z" /> +<glyph unicode="ç" horiz-adv-x="970" d="M55 446q0 211 150.5 364t380.5 153q96 0 183 -22.5t128 -47.5l39 -23l-102 -221q-96 84 -211 84q-106 0 -178 -67.5t-72 -200.5q0 -123 63.5 -191.5t165.5 -68.5q61 0 121.5 23.5t89.5 45.5l29 23l94 -203q-12 -12 -34.5 -30.5t-108.5 -51t-191 -37.5l-8 -16 q-16 -43 -16 -49q0 -20 28.5 -35.5t63.5 -28t63.5 -46t28.5 -85.5q0 -88 -70.5 -144t-187.5 -56q-133 0 -215 63l51 123q74 -59 164 -59q41 0 66.5 13t25.5 33.5t-27.5 39t-60.5 31t-60.5 38t-27.5 60.5q0 37 31 92l18 35q-190 31 -302 158.5t-112 303.5z" /> +<glyph unicode="è" horiz-adv-x="1017" d="M59 465q0 211 131.5 354.5t341.5 143.5q186 0 299 -123t115 -363l-162 -45l-409 -53q53 -174 223 -174q139 0 285 108l4 4l80 -213q-18 -14 -52 -35.5t-141.5 -57.5t-216.5 -36q-236 0 -367 141.5t-131 348.5zM162 1456h282l215 -332l-161 -82zM360 541l261 34 q0 6 -1.5 17.5t-8.5 40.5t-17 50.5t-33.5 38.5t-54.5 17q-63 0 -101.5 -54t-44.5 -144z" /> +<glyph unicode="é" horiz-adv-x="1017" d="M59 465q0 211 131.5 354.5t341.5 143.5q186 0 299 -123t115 -363l-162 -45l-409 -53q53 -174 223 -174q139 0 285 108l4 4l80 -213q-18 -14 -52 -35.5t-141.5 -57.5t-216.5 -36q-236 0 -367 141.5t-131 348.5zM360 541l261 34q0 6 -1.5 17.5t-8.5 40.5t-17 50.5 t-33.5 38.5t-54.5 17q-63 0 -101.5 -54t-44.5 -144zM371 1124l213 332h280l-336 -414z" /> +<glyph unicode="ê" horiz-adv-x="1017" d="M59 465q0 211 131.5 354.5t341.5 143.5q186 0 299 -123t115 -363l-162 -45l-409 -53q53 -174 223 -174q139 0 285 108l4 4l80 -213q-18 -14 -52 -35.5t-141.5 -57.5t-216.5 -36q-236 0 -367 141.5t-131 348.5zM188 1106l238 350h182l240 -354l-164 -62l-168 238 l-168 -238zM360 541l261 34q0 6 -1.5 17.5t-8.5 40.5t-17 50.5t-33.5 38.5t-54.5 17q-63 0 -101.5 -54t-44.5 -144z" /> +<glyph unicode="ë" horiz-adv-x="1017" d="M59 465q0 211 131.5 354.5t341.5 143.5q186 0 299 -123t115 -363l-162 -45l-409 -53q53 -174 223 -174q139 0 285 108l4 4l80 -213q-18 -14 -52 -35.5t-141.5 -57.5t-216.5 -36q-236 0 -367 141.5t-131 348.5zM125 1282q0 70 41 109t112.5 39t112.5 -39t41 -109 t-41 -107.5t-112.5 -37.5t-112.5 37.5t-41 107.5zM360 541l261 34q0 6 -1.5 17.5t-8.5 40.5t-17 50.5t-33.5 38.5t-54.5 17q-63 0 -101.5 -54t-44.5 -144zM600 1282q0 70 41 109t112.5 39t112.5 -39t41 -109t-41 -107.5t-112 -37.5q-74 0 -114 37.5t-40 107.5z" /> +<glyph unicode="ì" horiz-adv-x="540" d="M-82 1456h283l215 -332l-162 -82zM115 0v938h311v-938h-311z" /> +<glyph unicode="í" horiz-adv-x="540" d="M115 0v938h311v-938h-311zM127 1124l213 332h281l-336 -414z" /> +<glyph unicode="î" horiz-adv-x="540" d="M-55 1106l237 350h183l239 -354l-164 -62l-168 238l-168 -238zM115 0v938h311v-938h-311z" /> +<glyph unicode="ï" horiz-adv-x="540" d="M-119 1282q0 70 41 109t112.5 39t112.5 -39t41 -109t-41 -107.5t-112.5 -37.5t-112.5 37.5t-41 107.5zM115 0v938h311v-938h-311zM356 1282q0 70 41 109t113 39t113 -39t41 -109t-41 -107.5t-113 -37.5q-74 0 -114 37.5t-40 107.5z" /> +<glyph unicode="ð" horiz-adv-x="1128" d="M57 442q0 203 127 362t332 159q25 0 48.5 -3.5t41 -7.5t31.5 -9t24.5 -10t16.5 -9t10 -6l4 -5q-68 133 -192 228l-277 -152l-71 137l192 107q-117 49 -231 74l59 219q233 -43 422 -156l303 166l70 -139l-236 -129q152 -129 236 -306.5t84 -381.5q0 -262 -137.5 -433.5 t-378.5 -171.5q-223 0 -350.5 135t-127.5 332zM354 461q0 -102 47.5 -184t141.5 -82q92 0 153.5 80.5t61.5 263.5q0 82 -42 142t-128 60q-102 0 -168 -78.5t-66 -201.5z" /> +<glyph unicode="ñ" horiz-adv-x="1103" d="M111 0v913l295 48v-168q147 170 333 170q262 0 262 -304v-659h-311v514q0 102 -12 141t-62 39q-82 0 -194 -116v-578h-311zM190 1153q0 39 7.5 78t28 86t69.5 76.5t119 29.5q61 0 112.5 -23.5t79 -53t58 -53t55.5 -23.5q57 0 57 102l-2 37h184q2 -14 3 -35 q0 -39 -7.5 -78t-29 -88t-71.5 -79.5t-122 -30.5q-61 0 -110.5 23.5t-75 53t-54 53t-55.5 23.5q-61 0 -61 -106l2 -31h-184q-3 14 -3 39z" /> +<glyph unicode="ò" horiz-adv-x="1171" d="M57 467q0 92 29 177t89.5 157.5t165.5 117t245 44.5q260 0 396 -139.5t136 -338.5q0 -88 -28.5 -173t-88 -162.5t-168 -126t-251.5 -48.5q-254 0 -389.5 142.5t-135.5 349.5zM238 1456h282l215 -332l-162 -82zM375 479q0 -113 56 -198.5t153 -85.5q90 0 153.5 74.5 t63.5 191.5q0 111 -56.5 195.5t-156.5 84.5q-90 0 -151.5 -72.5t-61.5 -189.5z" /> +<glyph unicode="ó" horiz-adv-x="1171" d="M57 467q0 92 29 177t89.5 157.5t165.5 117t245 44.5q260 0 396 -139.5t136 -338.5q0 -88 -28.5 -173t-88 -162.5t-168 -126t-251.5 -48.5q-254 0 -389.5 142.5t-135.5 349.5zM375 479q0 -113 56 -198.5t153 -85.5q90 0 153.5 74.5t63.5 191.5q0 111 -56.5 195.5 t-156.5 84.5q-90 0 -151.5 -72.5t-61.5 -189.5zM444 1124l213 332h281l-336 -414z" /> +<glyph unicode="ô" horiz-adv-x="1171" d="M57 467q0 92 29 177t89.5 157.5t165.5 117t245 44.5q260 0 396 -139.5t136 -338.5q0 -88 -28.5 -173t-88 -162.5t-168 -126t-251.5 -48.5q-254 0 -389.5 142.5t-135.5 349.5zM260 1106l238 350h182l240 -354l-164 -62l-168 238l-168 -238zM375 479q0 -113 56 -198.5 t153 -85.5q90 0 153.5 74.5t63.5 191.5q0 111 -56.5 195.5t-156.5 84.5q-90 0 -151.5 -72.5t-61.5 -189.5z" /> +<glyph unicode="õ" horiz-adv-x="1171" d="M57 467q0 92 29 177t89.5 157.5t165.5 117t245 44.5q260 0 396 -139.5t136 -338.5q0 -88 -28.5 -173t-88 -162.5t-168 -126t-251.5 -48.5q-254 0 -389.5 142.5t-135.5 349.5zM211 1153q0 39 7 78t27.5 86t70 76.5t118.5 29.5q61 0 112.5 -23.5t79 -53t58.5 -53t55 -23.5 q57 0 58 102l-2 37h184q2 -14 2 -35q0 -39 -7 -78t-28.5 -88t-72 -79.5t-121.5 -30.5q-61 0 -110.5 23.5t-75 53t-54.5 53t-55 23.5q-61 0 -62 -106l2 -31h-184q-2 14 -2 39zM375 479q0 -113 56 -198.5t153 -85.5q90 0 153.5 74.5t63.5 191.5q0 111 -56.5 195.5t-156.5 84.5 q-90 0 -151.5 -72.5t-61.5 -189.5z" /> +<glyph unicode="ö" horiz-adv-x="1171" d="M57 467q0 92 29 177t89.5 157.5t165.5 117t245 44.5q260 0 396 -139.5t136 -338.5q0 -88 -28.5 -173t-88 -162.5t-168 -126t-251.5 -48.5q-254 0 -389.5 142.5t-135.5 349.5zM197 1282q0 70 41 109t112.5 39t112.5 -39t41 -109t-41 -107.5t-112.5 -37.5t-112.5 37.5 t-41 107.5zM375 479q0 -113 56 -198.5t153 -85.5q90 0 153.5 74.5t63.5 191.5q0 111 -56.5 195.5t-156.5 84.5q-90 0 -151.5 -72.5t-61.5 -189.5zM672 1282q0 70 41 109t112.5 39t112.5 -39t41 -109t-41 -107.5t-113 -37.5q-74 0 -113.5 37.5t-39.5 107.5z" /> +<glyph unicode="÷" horiz-adv-x="1064" d="M74 430v182h917v-182h-917zM383 143q0 66 43 112t106 46q66 0 110 -46t44 -112q0 -63 -44 -107t-110 -44q-63 0 -106 44t-43 107zM383 899.5q0 63.5 43 108.5t106 45q66 0 110 -45t44 -108.5t-44 -109t-110 -45.5q-63 0 -106 45.5t-43 109z" /> +<glyph unicode="ø" horiz-adv-x="1171" d="M57 467q0 94 29 178t89.5 158t167 117t247.5 43q135 0 244 -45l61 81h152l-107 -143q178 -133 178 -367q0 -90 -28.5 -176t-88 -163.5t-168 -126t-251.5 -48.5q-150 0 -258 52l-68 -88h-152l115 153q-162 135 -162 375zM375 485q0 -84 24 -149l283 379q-43 27 -96 26 q-88 0 -149.5 -73.5t-61.5 -182.5zM475 231q51 -37 113 -36q86 0 149.5 75.5t63.5 192.5q0 86 -37 158z" /> +<glyph unicode="ù" horiz-adv-x="1110" d="M104 258v680h312v-557q0 -76 17.5 -108.5t60.5 -32.5q78 0 188 104v594h311v-653l41 -279l-299 -26q-16 84 -26 151q-160 -156 -342 -156q-117 0 -190 71t-73 212zM197 1456h282l215 -332l-162 -82z" /> +<glyph unicode="ú" horiz-adv-x="1110" d="M104 258v680h312v-557q0 -76 17.5 -108.5t60.5 -32.5q78 0 188 104v594h311v-653l41 -279l-299 -26q-16 84 -26 151q-160 -156 -342 -156q-117 0 -190 71t-73 212zM403 1124l213 332h281l-336 -414z" /> +<glyph unicode="û" horiz-adv-x="1110" d="M104 258v680h312v-557q0 -76 17.5 -108.5t60.5 -32.5q78 0 188 104v594h311v-653l41 -279l-299 -26q-16 84 -26 151q-160 -156 -342 -156q-117 0 -190 71t-73 212zM219 1106l238 350h182l240 -354l-164 -62l-168 238l-168 -238z" /> +<glyph unicode="ü" horiz-adv-x="1110" d="M104 258v680h312v-557q0 -76 17.5 -108.5t60.5 -32.5q78 0 188 104v594h311v-653l41 -279l-299 -26q-16 84 -26 151q-160 -156 -342 -156q-117 0 -190 71t-73 212zM156 1282q0 70 41 109t112.5 39t112.5 -39t41 -109t-41 -107.5t-112.5 -37.5t-112.5 37.5t-41 107.5z M631 1282q0 70 41 109t112.5 39t112.5 -39t41 -109t-41 -107.5t-113 -37.5q-74 0 -113.5 37.5t-39.5 107.5z" /> +<glyph unicode="ý" horiz-adv-x="995" d="M-4 938h317l191 -592l184 592h309l-374 -1004q-59 -158 -199.5 -281.5t-323.5 -137.5l-92 239q106 8 200.5 64.5t127.5 136.5l22 53zM356 1124l213 332h281l-336 -414z" /> +<glyph unicode="þ" horiz-adv-x="1120" d="M115 -485v1908l311 50v-658q74 147 246 148q180 0 285.5 -133.5t105.5 -327.5q0 -215 -123 -371t-348 -156q-115 0 -166 31v-442zM426 266q0 -72 115 -71q88 0 145 71.5t57 214.5q0 117 -36.5 182.5t-102.5 65.5q-94 0 -178 -127v-336z" /> +<glyph unicode="ÿ" horiz-adv-x="995" d="M-4 938h317l191 -592l184 592h309l-374 -1004q-59 -158 -199.5 -281.5t-323.5 -137.5l-92 239q106 8 200.5 64.5t127.5 136.5l22 53zM109 1282q0 70 40.5 109t112.5 39t113 -39t41 -109t-41 -107.5t-113 -37.5t-112.5 37.5t-40.5 107.5zM584 1282q0 70 41 109t112.5 39 t112.5 -39t41 -109t-41 -107.5t-113 -37.5q-74 0 -113.5 37.5t-39.5 107.5z" /> +<glyph unicode="Œ" horiz-adv-x="2035" d="M66 680q0 133 51 260t143 227.5t237.5 162t317.5 61.5q143 0 256 -25h877v-264h-574v-277h455v-268h-455v-293h600v-264h-917q-147 -25 -262 -25q-324 0 -526.5 208t-202.5 497zM395 686q0 -174 111.5 -309t292.5 -135q166 0 258 30v811q-109 41 -244 41 q-188 0 -303 -130t-115 -308z" /> +<glyph unicode="œ" horiz-adv-x="1751" d="M57 469q0 197 136.5 345.5t390.5 148.5q236 0 366 -162q125 162 324 162q186 0 295.5 -130.5t111.5 -363.5l-159 -47l-398 -51q23 -82 80.5 -128t136.5 -46q68 0 138.5 28.5t107.5 57.5l37 30l74 -209q-18 -14 -52 -35.5t-137.5 -57.5t-208.5 -36q-223 0 -356 152 q-133 -152 -373 -152q-246 0 -380 143.5t-134 350.5zM375 479q0 -113 56 -198.5t153 -85.5q86 0 145 74.5t59 191.5q0 111 -53 195.5t-147 84.5q-90 0 -151.5 -72.5t-61.5 -189.5zM1104 541l264 34q0 6 -1 17.5t-9 40.5t-20.5 50.5t-37 38.5t-59.5 17q-57 0 -94 -54 t-43 -144z" /> +<glyph unicode="Ÿ" horiz-adv-x="1284" d="M-10 1366h372l279 -502l295 502h358l-493 -807v-559h-318v557zM209 1628.5q0 69.5 44 111.5t115.5 42t115.5 -42t44 -111.5t-44 -110.5t-115.5 -41t-115.5 41t-44 110.5zM745 1628.5q0 69.5 44.5 111.5t116 42t115.5 -42t44 -111.5t-44 -110.5t-115.5 -41t-116 41 t-44.5 110.5z" /> +<glyph unicode="ˆ" horiz-adv-x="1052" d="M199 1106l237 350h182l240 -354l-164 -62l-168 238l-168 -238z" /> +<glyph unicode="˜" horiz-adv-x="1052" d="M156 1153q0 39 7 78t27.5 86t69.5 76.5t119 29.5q61 0 112.5 -23.5t79 -53t58 -53t55.5 -23.5q57 0 57 102l-2 37h185q2 -14 2 -35q0 -39 -7.5 -78t-29 -88t-71.5 -79.5t-122 -30.5q-61 0 -110 23.5t-75 53t-54.5 53t-55.5 23.5q-61 0 -61 -106l2 -31h-184q-2 14 -2 39z " /> +<glyph unicode=" " horiz-adv-x="895" /> +<glyph unicode=" " horiz-adv-x="1790" /> +<glyph unicode=" " horiz-adv-x="895" /> +<glyph unicode=" " horiz-adv-x="1790" /> +<glyph unicode=" " horiz-adv-x="596" /> +<glyph unicode=" " horiz-adv-x="447" /> +<glyph unicode=" " horiz-adv-x="298" /> +<glyph unicode=" " horiz-adv-x="298" /> +<glyph unicode=" " horiz-adv-x="223" /> +<glyph unicode=" " horiz-adv-x="358" /> +<glyph unicode=" " horiz-adv-x="99" /> +<glyph unicode="‐" horiz-adv-x="792" d="M102 442v170h588v-170h-588z" /> +<glyph unicode="‑" horiz-adv-x="792" d="M102 442v170h588v-170h-588z" /> +<glyph unicode="‒" horiz-adv-x="792" d="M102 442v170h588v-170h-588z" /> +<glyph unicode="–" horiz-adv-x="1044" d="M102 436v182h840v-182h-840z" /> +<glyph unicode="—" horiz-adv-x="1843" d="M102 436v182h1639v-182h-1639z" /> +<glyph unicode="‘" horiz-adv-x="473" d="M74 1130q0 217 239 408l97 -104q-141 -109 -142 -232q0 -51 30 -103t118 -155l-223 -121q-119 166 -119 307z" /> +<glyph unicode="’" horiz-adv-x="450" d="M49 1417l221 121q123 -168 123 -307q0 -215 -243 -408l-93 105q139 111 140 229q0 53 -30 104.5t-118 155.5z" /> +<glyph unicode="‚" horiz-adv-x="499" d="M86 225l213 121q119 -166 119 -309q0 -215 -240 -408l-92 107q135 109 135 229q0 55 -26.5 108.5t-108.5 151.5z" /> +<glyph unicode="“" horiz-adv-x="897" d="M74 1133q0 215 239 405l97 -104q-141 -109 -142 -230q0 -59 27 -110.5t121 -149.5l-223 -121q-119 167 -119 310zM498 1133q0 215 241 405l95 -104q-139 -109 -140 -230q0 -59 27 -110.5t121 -149.5l-224 -121q-120 165 -120 310z" /> +<glyph unicode="”" horiz-adv-x="876" d="M49 1417l221 121q123 -168 123 -307q0 -215 -243 -408l-93 105q139 111 140 229q0 53 -30 104.5t-118 155.5zM475 1417l221 121q121 -168 121 -307q0 -215 -244 -408l-92 105q141 111 142 229q0 53 -30 103.5t-118 156.5z" /> +<glyph unicode="„" horiz-adv-x="925" d="M86 225l213 121q119 -166 119 -309q0 -215 -240 -408l-92 107q135 109 135 229q0 55 -26.5 108.5t-108.5 151.5zM510 225l213 121q119 -162 119 -309q0 -217 -240 -408l-92 107q137 106 137 229q0 55 -27.5 108.5t-109.5 151.5z" /> +<glyph unicode="•" horiz-adv-x="864" d="M106 524.5q0 137.5 94.5 231.5t231.5 94q139 0 232.5 -93t93.5 -232.5t-93.5 -232.5t-232.5 -93q-137 0 -231.5 94t-94.5 231.5z" /> +<glyph unicode="…" horiz-adv-x="1695" d="M90 152q0 74 52.5 127t123.5 53q74 0 126 -53.5t52 -126.5q0 -72 -52 -124.5t-126 -52.5q-72 0 -124 52.5t-52 124.5zM670 152q0 74 52 127t124 53q74 0 127 -53.5t53 -126.5q0 -72 -53 -124.5t-127 -52.5q-72 0 -124 52.5t-52 124.5zM1251 152q0 74 52.5 127t123.5 53 q74 0 126.5 -53.5t52.5 -127t-51.5 -125t-127.5 -51.5q-72 0 -124 52.5t-52 124.5z" /> +<glyph unicode=" " horiz-adv-x="358" /> +<glyph unicode="‹" horiz-adv-x="634" d="M25 510v8q31 25 206 225l177 203l157 -47l-284 -385l284 -385l-157 -47l-161 182l-107 121l-57 66q-26 29 -36 39t-22 20z" /> +<glyph unicode="›" horiz-adv-x="634" d="M72 129l282 385l-282 385l157 47q348 -397 369 -416q6 -6 14 -12v-8q-12 -10 -22 -20.5l-36 -38.5l-57 -66l-107 -121l-161 -182z" /> +<glyph unicode=" " horiz-adv-x="447" /> +<glyph unicode="€" horiz-adv-x="1163" d="M68 643v127h135q61 182 206.5 293t346.5 111q80 0 161.5 -18.5t122.5 -37.5l41 -18l-73 -228q-109 72 -238 72q-182 0 -248 -174h455l-37 -127h-448q-2 -23 -3 -68q0 -55 5 -79h405l-37 -127h-338q72 -164 252 -164q51 0 110.5 14t94.5 27l35 14l49 -215 q-131 -70 -317 -70q-209 0 -354.5 106.5t-198.5 287.5h-125v127h104q-4 37 -4 59q0 45 6 88h-108z" /> +<glyph unicode="™" horiz-adv-x="1476" d="M70 1247v119h510v-119h-179v-426h-153v426h-178zM666 821l20 545h219l111 -326l114 326h213l21 -545h-150l-14 381l-135 -381h-100l-138 383l-10 -383h-151z" /> +<glyph unicode="" horiz-adv-x="940" d="M0 940h940v-940h-940v940z" /> +<glyph unicode="fi" horiz-adv-x="1193" d="M37 723v170l145 49v45q0 246 143.5 387.5t364.5 141.5q82 0 158 -20.5t110 -41.5l35 -18l-100 -213q-94 63 -203 63q-197 0 -196 -274v-74h585v-938h-309v733h-276v-733h-312v723h-145z" /> +<glyph unicode="fl" horiz-adv-x="1232" d="M37 723v170l145 49v45q0 246 143.5 387.5t364.5 141.5q156 0 279 -68l149 25v-1473h-307v1257q-66 29 -121 29q-197 0 -196 -274v-74h190v-215h-190v-723h-312v723h-145z" /> +<glyph unicode="ffi" horiz-adv-x="1845" d="M37 723v170l145 49v16q0 238 137.5 373t348.5 135q82 0 156.5 -22.5t103 -41t39.5 -28.5q135 141 354 142q82 0 156.5 -20.5t107.5 -41.5l35 -18l-98 -213q-86 63 -193 63q-182 0 -182 -254v-94h584v-938h-308v733h-276v-733h-309v733h-344v-733h-312v723h-145zM494 938 h344v70q0 80 16 157q-84 72 -178 72q-182 0 -182 -254v-45z" /> +<glyph unicode="ffl" horiz-adv-x="1886" d="M37 723v170l145 49v16q0 238 137.5 373t348.5 135q176 0 297 -90q129 139 346 140q156 0 274 -74l187 31v-1473h-310v1245q-74 41 -145 41q-170 0 -170 -244v-104h190v-215h-190v-723h-309v733h-344v-733h-312v723h-145zM494 938h344v82q0 86 16 145q-84 72 -178 72 q-182 0 -182 -254v-45z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansBlack-webfont.ttf b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansBlack-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..dd75879f10c52328758b7a0b67d0af7d950cdbea Binary files /dev/null and b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansBlack-webfont.ttf differ diff --git a/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansBlack-webfont.woff b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansBlack-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..537ba7898eb8431a9bc9a54aa9701d273ff29546 Binary files /dev/null and b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansBlack-webfont.woff differ diff --git a/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansBold-webfont.eot b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansBold-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..007016f5d8eeb02a321ba78ef96ca4bf57cc2a73 Binary files /dev/null and b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansBold-webfont.eot differ diff --git a/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansBold-webfont.svg b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansBold-webfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..7c25c8168325979b2cc4862ad141eb74413c1478 --- /dev/null +++ b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansBold-webfont.svg @@ -0,0 +1,244 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Fontspring. +</metadata> +<defs> +<font id="webfontHPO6NoNQ" horiz-adv-x="1640" > +<font-face units-per-em="2048" ascent="1536" descent="-512" /> +<missing-glyph horiz-adv-x="491" /> +<glyph unicode=" " horiz-adv-x="491" /> +<glyph unicode="	" horiz-adv-x="491" /> +<glyph unicode=" " horiz-adv-x="491" /> +<glyph unicode="!" horiz-adv-x="583" d="M131 131q0 66 46 113t111.5 47t111.5 -47t46 -113q0 -63 -46 -109.5t-111 -46.5q-63 0 -110.5 46.5t-47.5 109.5zM150 1391h292l-47 -930h-202z" /> +<glyph unicode=""" horiz-adv-x="792" d="M115 823v543h221v-76l-70 -467h-151zM483 823v543h222v-76l-70 -467h-152z" /> +<glyph unicode="#" horiz-adv-x="1400" d="M70 229l22 144h273l57 278h-270l22 144h277l79 389h148l-80 -389h291l80 389h149l-80 -389h293l-22 -144h-299l-58 -278h297l-22 -144h-303l-84 -411h-152l86 411h-291l-84 -411h-149l84 411h-264zM512 373h291l57 278h-291z" /> +<glyph unicode="$" horiz-adv-x="976" d="M74 84l53 211q12 -10 34.5 -25.5t102.5 -43t170 -33.5l8 288q-168 57 -260 139t-92 205q0 125 91 217.5t278 110.5l6 180h98l-6 -176q86 -2 163 -17.5t111 -29.5l33 -14l-65 -203q-98 49 -246 57l-8 -280q172 -57 263 -134t91 -206q0 -137 -99.5 -229.5t-273.5 -110.5 l-4 -172h-98l4 168q-211 6 -350 96zM317 842q0 -51 32 -81t100 -59l6 248q-138 -12 -138 -108zM532 193q133 14 134 116q0 49 -30 80t-97 57z" /> +<glyph unicode="%" horiz-adv-x="1564" d="M70 1044.5q0 135.5 95 228.5t241 93q143 0 238 -93t95 -228.5t-95 -229.5t-238 -94q-145 0 -240.5 94t-95.5 229.5zM231 1044.5q0 -67.5 49.5 -121t125 -53.5t124 53.5t48.5 121t-48.5 120t-124 52.5t-125 -52.5t-49.5 -120zM236 0l968 1397l103 -70l-922 -1327h-149z M827 299q0 135 95.5 228.5t238.5 93.5q145 0 240.5 -93.5t95.5 -228.5t-95 -229.5t-241 -94.5q-143 0 -238.5 94.5t-95.5 229.5zM989 299q0 -70 48 -122t124 -52t125 52t49 122q0 68 -49 120t-125 52t-124 -52t-48 -120z" /> +<glyph unicode="&" horiz-adv-x="1441" d="M70 340q0 127 72.5 215t201.5 162q-104 182 -104 327q0 141 97 244t288 103q170 0 266 -87t96 -231q0 -139 -82 -229t-227 -170q37 -51 74 -90q74 -90 186 -199q160 207 186 547h228q-37 -416 -252 -688q164 -125 282 -164l-86 -166q-154 20 -366 170 q-162 -109 -371 -109q-197 0 -343 90.5t-146 274.5zM309 352q0 -84 68.5 -130t177.5 -46t203 49q-127 111 -234 238l-71 88q-144 -90 -144 -199zM502 1047q0 -90 65 -211q94 51 144.5 103t50.5 122q0 55 -35 92t-96 37q-63 0 -96 -41t-33 -102z" /> +<glyph unicode="'" horiz-adv-x="423" d="M115 823v543h235v-76l-106 -467h-129z" /> +<glyph unicode="(" horiz-adv-x="618" d="M90 553q0 152 33 298t79 246.5t92 180.5t79 119l33 39l178 -60l-32 -39q-19 -25 -70.5 -109.5t-91.5 -173.5t-71.5 -226.5t-31.5 -274.5q0 -150 31.5 -296t75.5 -246.5t89 -179.5t78 -118l31 -37l-176 -67q-12 14 -35 43t-79 123t-99 196.5t-78 261t-35 320.5z" /> +<glyph unicode=")" horiz-adv-x="618" d="M27 -324l32 40q20 26 73.5 114t93.5 183.5t73 242.5t33 297q0 393 -232 737l-65 86l178 60l34 -41q22 -27 76 -115t96 -184.5t75.5 -243.5t33.5 -299q0 -162 -33.5 -319.5t-81.5 -265t-95.5 -192.5t-79.5 -126l-35 -41z" /> +<glyph unicode="*" horiz-adv-x="1026" d="M76 854l313 92l41 -69l-235 -226zM76 1090l119 202l235 -225l-41 -72zM395 535l78 315h82l76 -315h-236zM395 1409h236l-76 -317h-82zM598 877l39 69l313 -92l-116 -203zM598 1067l236 225l116 -202l-313 -95z" /> +<glyph unicode="+" horiz-adv-x="1064" d="M51 440v166h395v414h175v-414h389v-166h-389v-440h-175v440h-395z" /> +<glyph unicode="," horiz-adv-x="507" d="M55 -301q94 90 119 131q31 53 31 121q0 55 -25.5 111.5t-95.5 156.5l231 76q94 -131 95 -260q0 -213 -263 -428z" /> +<glyph unicode="-" horiz-adv-x="755" d="M106 440v164h543v-164h-543z" /> +<glyph unicode="." horiz-adv-x="518" d="M100 131q0 66 46.5 113t112 47t111.5 -47t46 -113q0 -63 -47 -109.5t-110.5 -46.5t-111 46.5t-47.5 109.5z" /> +<glyph unicode="/" horiz-adv-x="956" d="M41 -401l682 1767h172l-680 -1767h-174z" /> +<glyph unicode="0" horiz-adv-x="1146" d="M84 475q0 209 131 365.5t367 156.5q225 0 353 -144t128 -343q0 -133 -52.5 -252t-169 -201t-274.5 -82q-225 0 -354 148.5t-129 351.5zM324 481q0 -129 60 -217t189 -88q131 0 191.5 88t60.5 219t-60 222.5t-190 91.5q-131 0 -191 -91.5t-60 -224.5z" /> +<glyph unicode="1" horiz-adv-x="874" d="M100 0v199h246v567h-237v207h487v-774h225v-199h-721z" /> +<glyph unicode="2" horiz-adv-x="950" d="M80 868q16 14 47 36t125 57.5t188 35.5q158 0 257.5 -88t99.5 -225q0 -127 -94.5 -242.5t-251.5 -244.5h432v-197h-797v143q18 12 48 35t107.5 87.5t137 124t108 133t48.5 126.5q0 61 -40 99t-106 38q-104 0 -209 -75z" /> +<glyph unicode="3" horiz-adv-x="841" d="M20 866q18 14 50 36t128.5 58.5t190.5 36.5q147 0 246.5 -80.5t99.5 -201.5q0 -205 -252 -340q135 -37 209 -126t74 -202q0 -207 -185.5 -328.5t-459.5 -121.5q-41 0 -62 2l-22 192q49 -4 72 -4q172 0 283.5 67.5t111.5 192.5q0 96 -88 139t-207 43h-43v189 q111 6 209 81.5t98 172.5q0 53 -37 83.5t-94 30.5q-47 0 -99.5 -20.5t-80.5 -40.5l-29 -23z" /> +<glyph unicode="4" horiz-adv-x="1101" d="M49 27v168l547 784h266v-764h182v-188h-182v-422h-248v422h-565zM295 215h319v483z" /> +<glyph unicode="5" horiz-adv-x="841" d="M66 -207q57 -4 84 -4q162 0 264 62.5t102 191.5q0 61 -27.5 108.5t-52 72t-98.5 50t-97.5 30.5t-113.5 22q-27 6 -39 8v639h631v-197h-385v-280q94 -25 164.5 -55.5t138.5 -80t104.5 -126t36.5 -177.5q0 -219 -174 -339.5t-450 -120.5q-43 0 -66 2z" /> +<glyph unicode="6" horiz-adv-x="1069" d="M76 565q0 156 50 299.5t146.5 259t251 187t346.5 80.5l17 -199q-442 -33 -533 -412q92 115 260 115q174 0 282 -127t108 -309q0 -195 -123 -339.5t-332 -144.5q-227 0 -350 170t-123 420zM334 588q0 -182 60.5 -297t170.5 -115q84 0 133.5 71.5t49.5 184.5q0 100 -43 178 t-150 78q-121 0 -221 -100z" /> +<glyph unicode="7" horiz-adv-x="958" d="M51 752v221h862v-150q-229 -580 -569 -1241l-246 51q311 584 527 1119h-574z" /> +<glyph unicode="8" horiz-adv-x="1056" d="M86 336q0 119 68.5 205t189.5 161q-195 158 -194 332q0 152 111.5 254.5t287.5 102.5q162 0 274.5 -88.5t112.5 -241.5q0 -186 -209 -336q115 -76 180.5 -157t65.5 -195q0 -158 -126 -278t-323 -120q-174 0 -306 96.5t-132 264.5zM309 348q0 -76 58.5 -127t138.5 -51 q86 0 149.5 56.5t63.5 127.5q0 43 -33 87t-69.5 72t-108.5 77q-96 -61 -147.5 -116.5t-51.5 -125.5zM403 1055q0 -113 156 -219q152 104 152 215q0 66 -43 105.5t-115 39.5t-111 -40t-39 -101z" /> +<glyph unicode="9" horiz-adv-x="1083" d="M88 514q0 193 123 338t332 145q227 0 350 -170t123 -419q0 -154 -50.5 -295.5t-146.5 -256t-250.5 -185t-347.5 -79.5l-16 199q444 33 532 416q-90 -119 -260 -119q-174 0 -281.5 125t-107.5 301zM346 541q0 -59 13.5 -109.5t58.5 -93.5t121 -43q121 0 219 98 q-2 176 -61.5 290t-168.5 114q-86 0 -134 -71.5t-48 -184.5z" /> +<glyph unicode=":" horiz-adv-x="569" d="M127 131q0 66 46 113t111.5 47t111.5 -47t46 -113q0 -63 -46 -109.5t-111 -46.5q-63 0 -110.5 46.5t-47.5 109.5zM127 797q0 66 46 111.5t111.5 45.5t111.5 -46t46 -111.5t-46 -110.5t-111.5 -45t-111.5 46.5t-46 109.5z" /> +<glyph unicode=";" horiz-adv-x="563" d="M84 -301q94 90 119 131q31 53 30 121q0 55 -25.5 111.5t-94.5 156.5l231 76q94 -131 94 -260q0 -213 -262 -428zM123 795q0 66 46 112.5t111.5 46.5t111.5 -47t46 -112q0 -63 -47 -109.5t-110.5 -46.5t-110.5 46.5t-47 109.5z" /> +<glyph unicode="<" horiz-adv-x="1064" d="M53 473v94l873 469l41 -170l-676 -346l676 -368l-41 -166z" /> +<glyph unicode="=" horiz-adv-x="1064" d="M84 252v164h897v-164h-897zM84 610v164h897v-164h-897z" /> +<glyph unicode=">" horiz-adv-x="1064" d="M98 152l674 368l-674 346l41 170l873 -469v-94l-873 -487z" /> +<glyph unicode="?" horiz-adv-x="790" d="M86 1235l57 227q23 -6 62 -19t139 -56.5t176 -90.5t138.5 -122.5t62.5 -155.5q0 -53 -31 -107.5t-76 -102.5l-90 -98q-45 -50 -75.5 -115t-30.5 -134h-207q-4 25 -4 47q0 82 36 161t80 129t79.5 102t35.5 85q0 53 -88 115.5t-176 99.5zM162 131q0 66 46 113t109 47 q66 0 113 -47t47 -113q0 -63 -47 -109.5t-113 -46.5q-63 0 -109 46.5t-46 109.5z" /> +<glyph unicode="@" horiz-adv-x="1779" d="M76 395q0 219 106.5 408.5t305 307.5t448.5 118q332 0 543 -193.5t211 -486.5q0 -307 -217 -449q-47 -31 -104.5 -50t-153 -39.5t-146.5 -35.5q-37 143 -39 146q-31 -59 -102.5 -102.5t-151.5 -43.5q-131 0 -220 107.5t-89 284.5q0 242 170 390t407 148q37 0 80 -4t68 -8 l27 -4v-535q0 -41 4 -84t8 -65l4 -23q129 8 195.5 105.5t66.5 242.5q0 229 -150.5 385t-408.5 156q-295 0 -481.5 -199.5t-186.5 -472.5q0 -256 167 -424t382 -180l-31 -166q-303 18 -507.5 235.5t-204.5 530.5zM709 377q0 -88 28.5 -150.5t83.5 -62.5q90 0 158 108v459 q-117 0 -193.5 -104.5t-76.5 -249.5z" /> +<glyph unicode="A" horiz-adv-x="1300" d="M10 0l514 1376h252l514 -1376h-268l-111 307h-528l-111 -307h-262zM461 526h370l-184 516z" /> +<glyph unicode="B" horiz-adv-x="1234" d="M170 0v1366h455q244 0 353 -95t109 -233q0 -170 -159 -297q86 -41 155.5 -123.5t69.5 -220.5q0 -180 -130 -288.5t-337 -108.5h-516zM434 221h221q223 0 224 185q0 82 -56.5 132t-167.5 50h-221v-367zM434 801h277q8 2 28.5 19.5t46 62.5t25.5 98q0 164 -217 164h-160 v-344z" /> +<glyph unicode="C" horiz-adv-x="1382" d="M80 662q0 313 209 521t555 208q276 0 461 -107l12 -6l-100 -223q-16 12 -45 29.5t-129.5 47t-208.5 29.5q-221 0 -352.5 -134t-131.5 -343q0 -217 138.5 -348t340.5 -131q109 0 208.5 30.5t146.5 63.5l45 31l106 -193q-6 -6 -20.5 -17t-63.5 -39t-104 -49.5t-145.5 -39 t-188.5 -17.5q-311 0 -522 186t-211 501z" /> +<glyph unicode="D" horiz-adv-x="1490" d="M170 0v1366h485q145 0 274.5 -36t238 -111.5t173 -207.5t64.5 -306q0 -336 -226.5 -520.5t-600.5 -184.5h-408zM434 221h123q295 0 434 129t139 342q0 209 -129 331t-374 122h-193v-924z" /> +<glyph unicode="E" horiz-adv-x="1126" d="M170 0v1366h862v-221h-598v-342h471v-219h-471v-363h613v-221h-877z" /> +<glyph unicode="F" horiz-adv-x="1083" d="M170 0v1366h858v-221h-594v-352h471v-220h-471v-573h-264z" /> +<glyph unicode="G" horiz-adv-x="1447" d="M78 659q0 197 90 361t270 267.5t420 103.5q262 0 457 -97l8 -4l-100 -223q-18 10 -50 25.5t-130.5 42t-194.5 26.5q-236 0 -368 -139t-132 -346q0 -215 144.5 -343t365.5 -128l217 20v301h-274v219h532v-708q-293 -61 -497 -62q-326 0 -542 187.5t-216 496.5z" /> +<glyph unicode="H" horiz-adv-x="1562" d="M170 0v1366h264v-559h694v559h263v-1366h-263v588h-694v-588h-264z" /> +<glyph unicode="I" horiz-adv-x="604" d="M170 0v1366h264v-1366h-264z" /> +<glyph unicode="J" horiz-adv-x="604" d="M-86 -164q258 23 258 389v1141h264v-1133q0 -117 -19.5 -212t-65.5 -183t-136 -146.5t-219 -76.5z" /> +<glyph unicode="K" horiz-adv-x="1277" d="M170 0v1366h264v-541h37l461 541h325l-563 -639l592 -727h-334l-481 606h-37v-606h-264z" /> +<glyph unicode="L" horiz-adv-x="1083" d="M170 0v1366h264v-1145h619v-221h-883z" /> +<glyph unicode="M" horiz-adv-x="1802" d="M147 0l50 1366h378l330 -948l330 948h373l49 -1366h-256l-39 1069l-379 -1069h-172l-375 1067l-35 -1067h-254z" /> +<glyph unicode="N" horiz-adv-x="1529" d="M170 0v1366h266l666 -963v963h258v-1366h-268l-664 956v-956h-258z" /> +<glyph unicode="O" d="M78 680q0 182 84 342t258 264.5t405 104.5q332 0 534 -197t202 -485q0 -190 -90.5 -357.5t-265.5 -272t-398 -104.5q-328 0 -528.5 207t-200.5 498zM354 688q0 -193 122 -341t337 -148t344 147.5t129 345.5q0 195 -124 335t-341 140t-342 -141t-125 -338z" /> +<glyph unicode="P" horiz-adv-x="1200" d="M170 0v1366h477q250 0 377 -122t127 -312q0 -215 -142.5 -342t-361.5 -127h-213v-463h-264zM434 684h170q270 0 270 234q0 227 -270 227h-170v-461z" /> +<glyph unicode="Q" d="M78 680q0 182 84 342t258 264.5t405 104.5q332 0 534 -197t202 -485q0 -236 -139.5 -430.5t-374.5 -268.5q41 -55 77.5 -93t98 -82t144.5 -65q76 -20 166 -20h17l-37 -235q-57 0 -110 6t-96 15t-86 28l-74 33q-31 14 -66 41l-54 41q-19 15 -48 46l-40 42 q-11 12 -34.5 40.5t-27.5 32.5l-62 72q-47 57 -129 72q-279 47 -443.5 240.5t-164.5 455.5zM354 688q0 -195 122 -345t337 -150t344 149.5t129 349.5q0 195 -124 335t-341 140t-342 -141t-125 -338z" /> +<glyph unicode="R" horiz-adv-x="1290" d="M170 0v1366h455q252 0 377.5 -113.5t125.5 -294.5q0 -127 -64.5 -224t-172.5 -152l385 -582h-311l-336 516h-195v-516h-264zM434 735h150q133 0 200.5 55.5t67.5 155.5q0 199 -270 199h-148v-410z" /> +<glyph unicode="S" horiz-adv-x="1054" d="M80 90l76 234q16 -14 45.5 -35t119.5 -53q84 -31 163 -31h10q90 0 152.5 39t62.5 106.5t-62.5 120.5t-153 97t-179.5 94.5t-151.5 136.5t-62.5 200q0 164 127 278t344 114q84 0 177.5 -15.5t144.5 -32.5l49 -14l-43 -237q-160 70 -324 69q-92 0 -150 -35.5t-58 -99.5 q0 -49 33.5 -91t87 -73t118 -62.5t129 -69.5t117.5 -84t87 -116.5t34 -158.5q0 -180 -136.5 -288t-338.5 -108q-111 0 -215.5 29t-153.5 57z" /> +<glyph unicode="T" horiz-adv-x="1230" d="M35 1145v221h1161v-221h-448v-1145h-263v1145h-450z" /> +<glyph unicode="U" horiz-adv-x="1458" d="M154 512v854h264v-827q0 -176 84 -258t229.5 -82t228 85t82.5 246v836h265v-825q0 -266 -164 -416t-414 -150q-258 0 -416.5 130.5t-158.5 406.5z" /> +<glyph unicode="V" horiz-adv-x="1239" d="M10 1366h281l334 -981l333 981h271l-484 -1376h-251z" /> +<glyph unicode="W" horiz-adv-x="1984" d="M37 1366h272l285 -1001l297 1001h209l297 -1001l286 1001h265l-412 -1376h-268l-277 907l-274 -907h-271z" /> +<glyph unicode="X" horiz-adv-x="1271" d="M31 0l448 678l-448 688h311l297 -473l299 473h303l-448 -682l448 -684h-311l-297 471l-297 -471h-305z" /> +<glyph unicode="Y" horiz-adv-x="1245" d="M-2 1366h309l316 -535l325 535h299l-491 -795v-571h-264v569z" /> +<glyph unicode="Z" horiz-adv-x="1191" d="M74 0v160l676 985h-646v221h986v-160l-666 -985h690v-221h-1040z" /> +<glyph unicode="[" horiz-adv-x="593" d="M152 -332v1698h413v-143h-231v-1409h231v-146h-413z" /> +<glyph unicode="\" horiz-adv-x="964" d="M61 1366h179l682 -1767h-181z" /> +<glyph unicode="]" horiz-adv-x="589" d="M25 -207h231v1448h-231v125h413v-1698h-413v125z" /> +<glyph unicode="^" horiz-adv-x="964" d="M-27 512l439 879h141l438 -879h-184l-328 655l-325 -655h-181z" /> +<glyph unicode="_" horiz-adv-x="1062" d="M18 -76h1024v-141h-1024v141z" /> +<glyph unicode="`" horiz-adv-x="1044" d="M291 1448h241l211 -334l-135 -74z" /> +<glyph unicode="a" horiz-adv-x="1007" d="M53 219q0 289 545 361v32q0 78 -24.5 116t-104.5 38q-145 -2 -295 -111l-61 181q18 14 53 33.5t146.5 53t228.5 33.5q174 0 243.5 -71.5t69.5 -231.5v-360q0 -92 88 -107l16 -2l-73 -198q-197 6 -260 137q-96 -147 -291 -148q-125 0 -203 69t-78 175zM313 240 q0 -78 90 -78q92 0 195 121v149q-285 -40 -285 -192z" /> +<glyph unicode="b" horiz-adv-x="1093" d="M123 27v1400l256 41v-600q88 88 231 88q197 0 304.5 -129t107.5 -325q0 -221 -137 -374t-389 -153q-70 0 -163 12.5t-149.5 25t-60.5 14.5zM379 174q57 -18 119 -18q119 0 190.5 86t71.5 241q0 131 -53.5 205t-143.5 74t-184 -72v-516z" /> +<glyph unicode="c" horiz-adv-x="956" d="M66 449q0 207 142 357t367 150q195 0 328 -90l4 -4l-90 -186q-96 84 -223 84q-115 0 -189.5 -80t-74.5 -217q0 -131 70.5 -211t185.5 -80q63 0 124.5 23.5t90.5 46.5l28 24l78 -172q-12 -12 -35.5 -32.5t-111.5 -53.5t-193 -33q-225 0 -363 135.5t-138 338.5z" /> +<glyph unicode="d" horiz-adv-x="1110" d="M70 438q0 213 129 365.5t360 152.5q90 0 162 -28v499l254 41v-1183q0 -49 10 -121t23 -119l10 -45l-238 -14q-18 70 -28 135q-84 -145 -285 -146q-178 0 -287.5 133t-109.5 330zM336 455q0 -135 48 -212t138 -77q117 0 199 123v360q0 117 -143 117q-115 0 -178.5 -80.5 t-63.5 -230.5z" /> +<glyph unicode="e" horiz-adv-x="1009" d="M70 461q0 209 129 352t333 143q180 0 289 -118.5t111 -337.5l-139 -41l-461 -60q23 -104 90 -165.5t172 -61.5q68 0 138.5 28.5t107.5 57.5l37 29l65 -181q-6 -6 -17.5 -14t-50 -30.5t-80.5 -40t-109 -32t-134 -14.5q-227 0 -354 140.5t-127 345.5zM326 547l329 43 q0 6 -1 18.5t-9 43t-21.5 53t-42 42t-67.5 19.5q-80 0 -129 -60.5t-59 -158.5z" /> +<glyph unicode="f" horiz-adv-x="733" d="M45 750v137l145 51v78q0 229 125 360t322 131q168 -2 285 -80l-91 -190q-88 66 -190 66q-195 0 -195 -269v-102h250v-182h-250v-750h-256v750h-145z" /> +<glyph unicode="g" horiz-adv-x="1050" d="M47 -246q0 143 225 269q-74 27 -110.5 59.5t-36.5 79.5q0 94 147 182q-90 43 -139 119t-49 168q0 152 120 238.5t290 86.5q63 0 143 -19t129 -19h117q29 0 60.5 5t47.5 11l17 4l14 -184h-100q-37 0 -76 6q61 -61 61 -156q0 -135 -129 -218t-299 -83q-41 0 -59 2 q-70 -39 -70 -65q0 -29 207 -82l88 -25q76 -20 120 -36.5t103.5 -47.5t89 -78t29.5 -108q0 -141 -149.5 -244.5t-368.5 -103.5q-172 0 -297 64t-125 175zM272 -199q0 -51 56.5 -79.5t152.5 -28.5q115 0 192 37t77 94q0 39 -45.5 63.5t-167.5 59.5l-101 28q-4 -2 -25.5 -16 t-28.5 -19l-26 -19q-18 -13 -26 -21l-22 -22q-13 -13 -19 -24.5t-11.5 -25t-5.5 -27.5zM326 627q0 -59 44 -106.5t124 -47.5q76 0 124 43t48 107q0 61 -45.5 112t-125 51t-124.5 -49t-45 -110z" /> +<glyph unicode="h" horiz-adv-x="1099" d="M129 0v1427l256 41v-684q158 172 340 172q254 0 254 -292v-664h-254v555q0 96 -21.5 138t-72.5 42q-100 0 -246 -155v-580h-256z" /> +<glyph unicode="i" horiz-adv-x="514" d="M106 1277.5q0 63.5 43.5 103.5t109 40t107.5 -40t42 -103.5t-42 -103t-107.5 -39.5t-109 39.5t-43.5 103zM129 0v932h256v-932h-256z" /> +<glyph unicode="j" horiz-adv-x="514" d="M-119 -287q115 18 181.5 90t66.5 232v897h256v-885q0 -244 -116.5 -374t-311.5 -158zM104 1277.5q0 63.5 43 103.5t109 40t108 -40t42 -103.5t-42 -103t-108 -39.5t-109 39.5t-43 103z" /> +<glyph unicode="k" horiz-adv-x="1064" d="M129 0v1427l256 41v-858h33l305 322h324l-410 -408l428 -524h-317l-330 424h-33v-424h-256z" /> +<glyph unicode="l" horiz-adv-x="514" d="M129 0v1427l256 41v-1468h-256z" /> +<glyph unicode="m" horiz-adv-x="1669" d="M125 0v911l246 41v-170q160 174 342 174q193 0 237 -176q166 176 346 176q252 0 252 -292v-664h-254v555q0 96 -21.5 138t-72.5 42q-92 0 -235 -143v-592h-254v555q0 96 -21.5 138t-73.5 42q-94 0 -235 -145v-590h-256z" /> +<glyph unicode="n" horiz-adv-x="1095" d="M125 0v911l246 41v-172q162 176 352 176q252 0 252 -292v-664h-254v555q0 96 -21.5 138t-72.5 42q-98 0 -246 -147v-588h-256z" /> +<glyph unicode="o" horiz-adv-x="1142" d="M68 463q0 92 29.5 176t88 156.5t158.5 116.5t231 44q238 0 369 -139t131 -332q0 -90 -28.5 -176t-87 -162.5t-160 -124t-232.5 -47.5q-238 0 -368.5 143.5t-130.5 344.5zM332 481q0 -131 62.5 -223t178.5 -92q102 0 170 82t68 211q0 123 -61.5 215t-178.5 92 q-102 0 -170.5 -80t-68.5 -205z" /> +<glyph unicode="p" horiz-adv-x="1101" d="M125 -481v1392l246 41v-151q80 156 268 155q178 0 284.5 -132t106.5 -328q0 -213 -125 -367t-346 -154q-115 0 -178 39v-454zM381 250q0 -39 36 -61.5t99 -22.5q113 0 181.5 81t68.5 232q0 129 -48 203t-128 74q-113 0 -209 -140v-366z" /> +<glyph unicode="q" horiz-adv-x="1095" d="M70 430q0 221 137 373.5t389 152.5q72 0 165 -13t150 -25l58 -13v-1345l-254 -41v544q-84 -88 -234 -88q-195 0 -303 130t-108 325zM334 449q0 -129 52 -201t144 -72q90 0 185 68v512q-59 20 -119 20q-119 0 -190.5 -85.5t-71.5 -241.5z" /> +<glyph unicode="r" horiz-adv-x="747" d="M125 0v911l246 41v-192q117 197 278 196l80 -16l-41 -246q-43 18 -88 19q-115 0 -219 -154v-559h-256z" /> +<glyph unicode="s" horiz-adv-x="843" d="M66 57l53 209q12 -10 34.5 -26.5t91 -43t136.5 -26.5q145 0 145 80q0 41 -68.5 80t-150.5 69.5t-150.5 101t-68.5 167.5q0 123 95.5 205.5t291.5 82.5q172 0 277 -51l-54 -207q-102 63 -223 64q-133 0 -133 -74q0 -35 45 -63.5t109.5 -56t128 -62.5t108.5 -94.5 t45 -139.5q0 -133 -102.5 -215t-284.5 -82q-90 0 -171 20.5t-118 41.5z" /> +<glyph unicode="t" horiz-adv-x="813" d="M43 750v137l154 51v217l247 49v-272h285v-182h-285v-426q0 -139 97 -140q63 0 180 80l70 -186q-14 -12 -42 -28.5t-109 -45.5t-161 -29q-133 0 -212 74t-79 213v488h-145z" /> +<glyph unicode="u" horiz-adv-x="1095" d="M119 256v676h256v-555q0 -94 19.5 -137t76.5 -43q92 0 236 127v608h254v-647q0 -49 10 -120t20 -116l10 -45l-245 -22q-20 90 -29 157q-158 -164 -352 -164q-117 0 -186.5 69t-69.5 212z" /> +<glyph unicode="v" horiz-adv-x="972" d="M12 932h269l200 -604l226 604h258l-373 -938h-232z" /> +<glyph unicode="w" horiz-adv-x="1570" d="M27 932h262l178 -647l213 647h217l209 -647l182 647h256l-303 -938h-248l-209 608l-206 -608h-250z" /> +<glyph unicode="x" horiz-adv-x="987" d="M29 0l319 465l-319 467h290l179 -273l178 273h282l-321 -461l321 -471h-284l-182 279l-187 -279h-276z" /> +<glyph unicode="y" horiz-adv-x="972" d="M8 932h266l218 -610l213 610h258l-388 -1000q-63 -162 -188 -281.5t-289 -135.5l-78 196q100 12 188.5 81t125.5 155l33 78z" /> +<glyph unicode="z" horiz-adv-x="921" d="M74 0v156l426 579h-410v197h741v-156l-434 -579h451v-197h-774z" /> +<glyph unicode="{" horiz-adv-x="688" d="M23 467v141q55 2 97 26.5t66.5 76t40 96.5t20.5 122t6 115.5t1 114.5v31q0 166 119 247t317 81v-136q-88 -6 -138 -22.5t-76.5 -56t-33 -86t-6.5 -136.5q0 -459 -213 -540v-4q213 -82 213 -564q0 -90 6.5 -136t33 -85t76.5 -55t138 -25v-135q-436 0 -436 328v31 q0 74 -1 116.5t-6 120.5t-20.5 126t-40 100.5t-66.5 79t-97 28.5z" /> +<glyph unicode="|" horiz-adv-x="483" d="M150 -461v1995h184v-1995h-184z" /> +<glyph unicode="}" horiz-adv-x="688" d="M-2 -328q88 8 138 24.5t77 55.5t33 85t6 136q0 481 213 564v4q-213 82 -213 540q0 90 -6 136.5t-33 86t-77 56t-138 22.5v136q201 0 318.5 -81t117.5 -247q0 -268 27 -377q51 -201 205 -205v-141q-55 -2 -97.5 -28.5t-67 -80t-40 -100.5t-20.5 -127t-6 -120t-1 -115v-31 q0 -328 -436 -328v135z" /> +<glyph unicode="~" horiz-adv-x="1189" d="M111 344q0 176 75.5 261t210.5 85q66 0 118 -19.5t84 -48t59.5 -57t60.5 -48t69 -19.5q72 0 101 57t29 127h167q0 -176 -75.5 -261t-210.5 -85q-66 0 -118 19.5t-84 48t-59.5 57t-60.5 48t-69 19.5q-72 0 -100.5 -57t-28.5 -127h-168z" /> +<glyph unicode="¡" horiz-adv-x="579" d="M139 799q0 63 46 109t112 46q63 0 110.5 -46t47.5 -109q0 -66 -46.5 -113t-112 -47t-111.5 47t-46 113zM143 -461l47 930h203l43 -930h-293z" /> +<glyph unicode="¢" horiz-adv-x="970" d="M74 569q0 174 113.5 301t314.5 142l8 180h98l-8 -180q88 -8 161 -37t101 -53l29 -27l-125 -158q-72 59 -174 74l-19 -475q57 4 113.5 26.5t85.5 43.5l29 20l78 -172q-12 -12 -35 -29.5t-105 -50.5t-174 -39l-6 -180h-98l6 182q-180 20 -286.5 141t-106.5 291zM324 578 q0 -84 39.5 -147.5t111.5 -84.5l19 461q-78 -16 -124 -76.5t-46 -152.5z" /> +<glyph unicode="£" horiz-adv-x="1132" d="M74 127q6 2 14 6t31.5 19.5t42 34t36 50t21.5 68.5l21 184h-123v119h137l20 164q20 182 121 288.5t281 106.5q188 0 309 -110l8 -8l-125 -158q-78 80 -194 80q-70 0 -106 -44t-48 -161l-16 -158h344l-14 -119h-340q-8 -76 -24.5 -146.5t-29.5 -102.5l-12 -33 q106 -57 234 -57q104 0 154 40.5t58 149.5h181q-18 -178 -92 -284.5t-242 -106.5q-90 0 -223 44t-195 44q-68 0 -188 -37z" /> +<glyph unicode="¥" horiz-adv-x="1161" d="M74 1143h270l236 -436l241 436h258l-270 -467h211v-119h-281l-34 -61v-86h315v-119h-315v-291h-254v291h-295v119h295v84l-37 63h-258v119h188z" /> +<glyph unicode="¦" horiz-adv-x="483" d="M150 365h186v-734h-186v734zM150 682v733h186v-733h-186z" /> +<glyph unicode="§" horiz-adv-x="1009" d="M57 -379l62 135q137 -96 291 -96q115 0 175 85t60 220q0 47 -10 113l-107 590q-23 131 -22 206q0 137 53 211l141 -22q-35 -76 -34 -189q0 -53 10 -114l119 -666q12 -68 12 -137q0 -193 -99.5 -317.5t-293.5 -124.5q-190 0 -351 102zM178 946q0 193 99.5 319t293.5 126 q190 0 351 -103l6 -4l-62 -135q-137 96 -291 96q-115 0 -175 -86t-60 -219q0 -63 10 -113l109 -589q20 -123 20 -207q0 -135 -51 -211l-143 22q35 82 34 189q0 53 -10 114l-119 666q-12 67 -12 135z" /> +<glyph unicode="¨" horiz-adv-x="1044" d="M168 1276q0 59 38 95t97 36q61 0 99 -36t38 -95t-37.5 -95t-99.5 -36q-59 0 -97 36t-38 95zM604 1276q0 59 38 95t97 36q61 0 99.5 -36t38.5 -95t-38 -95t-100 -36q-59 0 -97 36t-38 95z" /> +<glyph unicode="©" horiz-adv-x="1568" d="M78 682q0 293 207 500t499.5 207t499.5 -207t207 -500t-207 -500t-499.5 -207t-499.5 207t-207 500zM193 682q0 -250 172 -426t419.5 -176t419.5 176t172 426t-172 426t-419.5 176t-419.5 -176t-172 -426zM389 680q0 168 111.5 295t304.5 127q182 0 287 -113l10 -10 l-92 -133q-8 10 -24.5 26.5t-70 43t-110.5 26.5q-109 0 -168 -71.5t-59 -176.5q0 -109 64.5 -184.5t174.5 -75.5q131 4 225 98l56 -139q-10 -12 -32 -32.5t-97.5 -53.5t-165.5 -33q-180 0 -297 117t-117 289z" /> +<glyph unicode="ª" horiz-adv-x="804" d="M76 877q0 203 383 253v21q0 47 -15.5 71.5t-66.5 24.5q-49 0 -103.5 -21.5t-85.5 -41.5l-28 -21l-43 142q14 10 38.5 23t106.5 37t168 24q127 0 177 -51.5t50 -159.5v-252q0 -35 18.5 -54.5t37.5 -21.5l18 -2l-51 -139q-154 2 -199 86q-70 -92 -200 -93 q-92 0 -148.5 48.5t-56.5 126.5zM279 899q0 -59 57 -59t123 73v107q-180 -29 -180 -121z" /> +<glyph unicode="«" horiz-adv-x="1044" d="M33 510v8q31 25 200 217l189 211l141 -41l-293 -391l293 -391l-141 -41l-165 182l-107 121l-59 66q-26 29 -36 39t-22 20zM434 510v8q31 25 201 217l188 211l142 -41l-293 -391l293 -391l-142 -41l-165 182l-107 121l-58 66q-26 29 -36.5 39t-22.5 20z" /> +<glyph unicode="¬" horiz-adv-x="1163" d="M96 643v164h948v-580h-170v416h-778z" /> +<glyph unicode="­" horiz-adv-x="755" d="M106 440v164h543v-164h-543z" /> +<glyph unicode="®" horiz-adv-x="864" d="M78 1087.5q0 145.5 104.5 250t250 104.5t249.5 -104.5t104 -250t-104 -250t-249.5 -104.5t-250 104.5t-104.5 250zM154 1087q0 -117 82.5 -202.5t195.5 -85.5q111 0 195 87t84 201.5t-84 200.5t-195 86q-113 0 -195.5 -86t-82.5 -201zM301 918v348h123q143 0 143 -105 q0 -63 -61 -96l108 -147h-104l-88 126h-27v-126h-94zM395 1106h35q41 0 41 47q0 49 -55 49h-21v-96z" /> +<glyph unicode="¯" horiz-adv-x="964" d="M219 1182v159h526v-159h-526z" /> +<glyph unicode="°" horiz-adv-x="649" d="M74 1144.5q0 102.5 72.5 174.5t177 72t177 -72t72.5 -174.5t-72.5 -174t-177 -71.5t-177 71.5t-72.5 174zM190 1144.5q0 -57.5 39 -97t94.5 -39.5t94.5 39.5t39 97t-39 96.5t-94.5 39t-94.5 -39t-39 -96.5z" /> +<glyph unicode="±" horiz-adv-x="1064" d="M92 625v166h354v352h175v-352h348v-166h-348v-349h-175v349h-354zM106 0v164h857v-164h-857z" /> +<glyph unicode="²" horiz-adv-x="716" d="M55 883q23 23 71 66l74 69l65 64q40 40 62.5 69t46 62.5t34 64.5t10.5 59q0 102 -115 103q-84 0 -147 -62l-99 121q10 12 32 30.5t94.5 50.5t154.5 32q123 0 199.5 -67.5t76.5 -180.5q0 -184 -278 -444h323v-150h-589z" /> +<glyph unicode="³" horiz-adv-x="681" d="M39 829l82 136q76 -53 162 -54q59 0 92 30t33 71q0 47 -46.5 69.5t-105.5 22.5h-70v149q70 2 127.5 38t57.5 91q0 68 -82 68q-35 0 -71 -12.5t-54 -24.5l-19 -10l-79 123q111 86 266 86q113 0 179.5 -56.5t66.5 -138.5q0 -74 -49.5 -132t-114.5 -79q201 -43 200 -192 q0 -106 -90 -183t-229 -77q-68 0 -131.5 18.5t-93.5 38.5z" /> +<glyph unicode="´" horiz-adv-x="1071" d="M301 1114l211 334h244l-318 -408z" /> +<glyph unicode="µ" horiz-adv-x="1204" d="M129 -442q20 199 21 362v1012h256v-555q0 -94 19 -137t77 -43q96 0 235 127v608h254v-645q0 -84 22.5 -103.5t110.5 -19.5v-178q-82 -10 -129 -11q-121 0 -176 41t-71 115q-156 -156 -342 -156q-33 0 -66 7q6 -86 28.5 -237t22.5 -187h-262z" /> +<glyph unicode="μ" horiz-adv-x="1204" d="M129 -442q20 199 21 362v1012h256v-555q0 -94 19 -137t77 -43q96 0 235 127v608h254v-645q0 -84 22.5 -103.5t110.5 -19.5v-178q-82 -10 -129 -11q-121 0 -176 41t-71 115q-156 -156 -342 -156q-33 0 -66 7q6 -86 28.5 -237t22.5 -187h-262z" /> +<glyph unicode="¶" horiz-adv-x="1380" d="M63 864q0 203 155 352.5t431 149.5h635v-137h-151v-1229h-146v1229h-153v-1270q0 -444 -379 -444l-31 149q133 0 193.5 74t60.5 242v387h-19q-291 0 -443.5 145t-152.5 352z" /> +<glyph unicode="·" horiz-adv-x="530" d="M106 522q0 66 46.5 112t112 46t111.5 -46t46 -111.5t-46 -110.5t-111.5 -45t-112 46t-46.5 109z" /> +<glyph unicode="¸" horiz-adv-x="1044" d="M328 -422l49 115q70 -59 155 -60q43 0 70 16.5t27 39.5q0 20 -27 38.5t-59.5 31t-59 38t-26.5 58t32 98.5l25 47h125l-18 -39q-18 -41 -19 -55q0 -20 28.5 -36.5t61.5 -29t61.5 -46.5t28.5 -83q0 -84 -68.5 -140t-178.5 -56q-57 0 -108.5 15t-74.5 32z" /> +<glyph unicode="¹" horiz-adv-x="643" d="M63 770v141h189v545h-172v141h364v-686h172v-141h-553z" /> +<glyph unicode="º" horiz-adv-x="876" d="M74 1042.5q0 139.5 92 243t276 103.5q170 0 265.5 -97.5t95.5 -232.5q0 -137 -92.5 -247t-274.5 -110q-172 0 -267 100.5t-95 240zM281 1057q0 -90 40.5 -152.5t118.5 -62.5q68 0 112 56t44 142t-40 146.5t-118 60.5q-68 0 -112.5 -54t-44.5 -136z" /> +<glyph unicode="»" horiz-adv-x="1044" d="M80 123l295 391l-295 391l141 41q356 -399 375 -416q6 -6 14 -12v-8q-12 -10 -22 -20.5l-36 -38.5l-58 -66l-108 -121l-165 -182zM481 123l293 391l-293 391l142 41q356 -399 374 -416q6 -6 15 -12v-8q-12 -10 -22.5 -20.5t-36.5 -38.5l-58 -66l-108 -121l-164 -182z" /> +<glyph unicode="¼" horiz-adv-x="1738" d="M90 541v141h189v545h-173v141h365v-686h172v-141h-553zM432 0l815 1417l135 -57l-782 -1360h-168zM997 311l340 520h219v-503h115v-144h-115v-184h-184v184h-358zM1163 328h209v317z" /> +<glyph unicode="½" horiz-adv-x="1822" d="M88 541v141h188v545h-172v141h365v-686h172v-141h-553zM469 0l815 1417l135 -57l-782 -1360h-168zM1149 113q23 23 71 66l73 69l66 64q40 40 62.5 69t46 62.5t33.5 64.5t10 59q0 102 -114 103q-84 0 -148 -62l-98 121q10 12 31.5 30.5t94.5 50.5t155 32 q123 0 199.5 -67.5t76.5 -180.5q0 -184 -278 -444h323v-150h-590z" /> +<glyph unicode="¾" horiz-adv-x="1751" d="M72 600l82 135q76 -53 161 -53q59 0 92 29.5t33 70.5q0 47 -46 69.5t-105 22.5h-70v150q70 2 127 38t57 91q0 68 -81 68q-35 0 -71 -12.5t-54 -24.5l-19 -10l-80 122q111 86 267 86q113 0 179 -56t66 -138q0 -74 -49 -132.5t-115 -78.5q201 -43 201 -193q0 -106 -90 -183 t-229 -77q-68 0 -131.5 18.5t-94.5 39.5zM444 0l816 1417l135 -57l-783 -1360h-168zM1010 311l340 520h219v-503h114v-144h-114v-184h-185v184h-358zM1176 328h208v317z" /> +<glyph unicode="¿" horiz-adv-x="778" d="M68 -66q0 51 30.5 102.5t75.5 97.5l90 95q45 49 76 111.5t31 130.5h207q4 -25 4 -49q0 -78 -36 -152.5t-80 -123t-80 -97.5t-36 -82q0 -53 88 -115.5t176 -97.5l88 -37l-57 -227q-23 6 -61.5 19.5t-139 56.5t-176 90t-138 122.5t-62.5 155.5zM311 798.5 q0 65.5 47.5 111.5t112.5 46q63 0 109.5 -47t46.5 -110.5t-46 -110.5t-110 -47q-66 0 -113 46t-47 111.5z" /> +<glyph unicode="À" horiz-adv-x="1300" d="M10 0l514 1376h252l514 -1376h-268l-111 307h-528l-111 -307h-262zM362 1593l72 189l443 -195l-52 -137zM461 526h370l-184 516z" /> +<glyph unicode="Á" horiz-adv-x="1300" d="M10 0l514 1376h252l514 -1376h-268l-111 307h-528l-111 -307h-262zM418 1587l442 195l72 -189l-465 -143zM461 526h370l-184 516z" /> +<glyph unicode="Â" horiz-adv-x="1300" d="M10 0l514 1376h252l514 -1376h-268l-111 307h-528l-111 -307h-262zM287 1559l258 225h200l256 -225l-131 -89l-225 181l-225 -181zM461 526h370l-184 516z" /> +<glyph unicode="Ã" horiz-adv-x="1300" d="M10 0l514 1376h252l514 -1376h-268l-111 307h-528l-111 -307h-262zM260 1522q0 27 4 54.5t17.5 63t36 62.5t65.5 46t100 19q76 0 138.5 -32.5t106.5 -65.5t79 -33q68 0 67 107v20h158v-30q0 -37 -7 -72t-27.5 -80t-70.5 -72.5t-122 -27.5q-61 0 -111.5 20.5t-78 45 t-60.5 45t-63 20.5q-74 0 -74 -105l2 -18h-158q-2 13 -2 33zM461 526h370l-184 516z" /> +<glyph unicode="Ä" horiz-adv-x="1300" d="M10 0l514 1376h252l514 -1376h-268l-111 307h-528l-111 -307h-262zM250 1626q0 61 39 98t100.5 37t101 -36.5t39.5 -98.5q0 -59 -39.5 -97t-101.5 -38q-59 0 -99 38t-40 97zM461 526h370l-184 516zM762 1626q0 61 40 98t101.5 37t100 -36.5t38.5 -98.5q0 -59 -39.5 -97 t-99.5 -38q-61 0 -101 38t-40 97z" /> +<glyph unicode="Å" horiz-adv-x="1300" d="M10 0l514 1376h252l514 -1376h-268l-111 307h-528l-111 -307h-262zM438 1622q0 66 52.5 114t155 48t154.5 -48t52 -114q0 -74 -52 -123t-154.5 -49t-155 49t-52.5 123zM461 526h370l-184 516zM553 1620q0 -39 23.5 -63.5t68.5 -24.5q43 0 68.5 24.5t25.5 63.5 q0 33 -24.5 57.5t-69.5 24.5t-68.5 -24.5t-23.5 -57.5z" /> +<glyph unicode="Æ" horiz-adv-x="1843" d="M-23 0l771 1366h1001v-221h-598v-342h471v-219h-471v-363h612v-221h-874v379h-420l-209 -379h-283zM592 600h297v537z" /> +<glyph unicode="Ç" horiz-adv-x="1384" d="M82 662q0 313 209 521t555 208q276 0 461 -107l12 -6l-100 -223q-16 12 -45 29.5t-129.5 47t-208.5 29.5q-221 0 -352.5 -134t-131.5 -343q0 -217 138.5 -348t340.5 -131q109 0 208.5 30.5t144.5 63.5l47 31l106 -193q-6 -6 -20 -16t-61.5 -38t-101.5 -48.5t-142 -39 t-183 -20.5l-6 -14q-18 -41 -18 -55q0 -20 27.5 -36.5t62.5 -29t62.5 -46.5t27.5 -83q0 -84 -68.5 -140t-179.5 -56q-57 0 -108 15t-76 32l-23 16l50 115q70 -59 155 -60q43 0 69.5 16.5t26.5 39.5q0 20 -26.5 38.5t-59 31t-59.5 38t-27 58t33 98.5l15 29 q-272 33 -448.5 213t-176.5 467z" /> +<glyph unicode="È" horiz-adv-x="1126" d="M170 0v1366h862v-221h-598v-342h471v-219h-471v-363h613v-221h-877zM326 1593l71 189l443 -195l-52 -137z" /> +<glyph unicode="É" horiz-adv-x="1126" d="M170 0v1366h862v-221h-598v-342h471v-219h-471v-363h613v-221h-877zM383 1587l442 195l72 -189l-465 -143z" /> +<glyph unicode="Ê" horiz-adv-x="1126" d="M170 0v1366h862v-221h-598v-342h471v-219h-471v-363h613v-221h-877zM252 1559l258 225h201l256 -225l-131 -89l-226 181l-225 -181z" /> +<glyph unicode="Ë" horiz-adv-x="1126" d="M170 0v1366h862v-221h-598v-342h471v-219h-471v-363h613v-221h-877zM215 1626q0 61 39 98t100.5 37t101.5 -36.5t40 -98.5q0 -59 -40 -97t-102 -38q-59 0 -99 38t-40 97zM727 1626q0 61 40 98t101.5 37t100.5 -36.5t39 -98.5q0 -59 -40 -97t-100 -38q-61 0 -101 38 t-40 97z" /> +<glyph unicode="Ì" horiz-adv-x="604" d="M23 1593l71 189l443 -195l-52 -137zM170 0v1366h264v-1366h-264z" /> +<glyph unicode="Í" horiz-adv-x="604" d="M78 1587l442 195l72 -189l-465 -143zM170 0v1366h264v-1366h-264z" /> +<glyph unicode="Î" horiz-adv-x="604" d="M-53 1559l258 225h201l256 -225l-132 -89l-225 181l-225 -181zM170 0v1366h264v-1366h-264z" /> +<glyph unicode="Ï" horiz-adv-x="604" d="M-47 1630.5q0 59.5 38 95t97 35.5q61 0 99 -35.5t38 -95t-37.5 -95.5t-99.5 -36q-59 0 -97 36t-38 95.5zM170 0v1366h264v-1366h-264zM389 1630.5q0 59.5 38 95t97 35.5q61 0 99.5 -35.5t38.5 -95t-38 -95.5t-100 -36q-59 0 -97 36t-38 95.5z" /> +<glyph unicode="Ð" horiz-adv-x="1521" d="M53 592v203h148v571h485q145 0 274.5 -36t238 -111.5t173 -207.5t64.5 -306q0 -336 -226.5 -520.5t-601.5 -184.5h-407v592h-148zM465 221h123q295 0 434 129t139 342q0 209 -129 331t-375 122h-192v-350h315v-203h-315v-371z" /> +<glyph unicode="Ñ" horiz-adv-x="1529" d="M170 0v1366h266l666 -963v963h258v-1366h-268l-664 956v-956h-258zM379 1522q0 27 4 54.5t17.5 63t36 62.5t65.5 46t100 19q76 0 138.5 -32.5t106.5 -65.5t79 -33q68 0 67 107v20h158v-30q0 -37 -7 -72t-27.5 -80t-71 -72.5t-121.5 -27.5q-61 0 -111.5 20.5t-78 45 t-60.5 45t-64 20.5q-74 0 -73 -105l2 -18h-158q-2 13 -2 33z" /> +<glyph unicode="Ò" d="M78 680q0 182 84 342t258 264.5t405 104.5q332 0 534 -197t202 -485q0 -190 -90.5 -357.5t-265.5 -272t-398 -104.5q-328 0 -528.5 207t-200.5 498zM354 688q0 -193 122 -341t337 -148t344 147.5t129 345.5q0 195 -124 335t-341 140t-342 -141t-125 -338zM535 1593 l71 189l443 -195l-52 -137z" /> +<glyph unicode="Ó" d="M78 680q0 182 84 342t258 264.5t405 104.5q332 0 534 -197t202 -485q0 -190 -90.5 -357.5t-265.5 -272t-398 -104.5q-328 0 -528.5 207t-200.5 498zM354 688q0 -193 122 -341t337 -148t344 147.5t129 345.5q0 195 -124 335t-341 140t-342 -141t-125 -338zM592 1587 l442 195l72 -189l-465 -143z" /> +<glyph unicode="Ô" d="M78 680q0 182 84 342t258 264.5t405 104.5q332 0 534 -197t202 -485q0 -190 -90.5 -357.5t-265.5 -272t-398 -104.5q-328 0 -528.5 207t-200.5 498zM354 688q0 -193 122 -341t337 -148t344 147.5t129 345.5q0 195 -124 335t-341 140t-342 -141t-125 -338zM461 1559 l258 225h201l256 -225l-132 -89l-225 181l-225 -181z" /> +<glyph unicode="Õ" d="M78 680q0 182 84 342t258 264.5t405 104.5q332 0 534 -197t202 -485q0 -190 -90.5 -357.5t-265.5 -272t-398 -104.5q-328 0 -528.5 207t-200.5 498zM354 688q0 -193 122 -341t337 -148t344 147.5t129 345.5q0 195 -124 335t-341 140t-342 -141t-125 -338zM434 1522 q0 27 4 54.5t17.5 63t36 62.5t65.5 46t100 19q76 0 138.5 -32.5t106.5 -65.5t79 -33q68 0 68 107v20h157v-30q0 -37 -7 -72t-27.5 -80t-70.5 -72.5t-122 -27.5q-61 0 -111.5 20.5t-78 45t-60.5 45t-63 20.5q-74 0 -74 -105l2 -18h-158q-2 13 -2 33z" /> +<glyph unicode="Ö" d="M78 680q0 182 84 342t258 264.5t405 104.5q332 0 534 -197t202 -485q0 -190 -90.5 -357.5t-265.5 -272t-398 -104.5q-328 0 -528.5 207t-200.5 498zM354 688q0 -193 122 -341t337 -148t344 147.5t129 345.5q0 195 -124 335t-341 140t-342 -141t-125 -338zM424 1626 q0 61 39 98t100.5 37t101.5 -36.5t40 -98.5q0 -59 -40 -97t-102 -38q-59 0 -99 38t-40 97zM936 1626q0 61 40 98t101.5 37t100.5 -36.5t39 -98.5q0 -59 -40 -97t-100 -38q-61 0 -101 38t-40 97z" /> +<glyph unicode="×" horiz-adv-x="1064" d="M72 160l348 358l-348 361l110 114l350 -360l351 360l110 -114l-350 -361l350 -358l-112 -115l-349 358l-348 -358z" /> +<glyph unicode="Ø" d="M78 680q0 182 84 342t258 264.5t405 104.5q211 0 377 -86l94 122h162l-145 -192q119 -94 183.5 -231.5t64.5 -294.5q0 -190 -90.5 -357.5t-265.5 -272t-398 -104.5q-213 0 -381 95l-100 -131h-164l157 206q-117 98 -179 237.5t-62 297.5zM354 688q0 -201 119 -340 l582 762q-98 57 -234 57q-217 0 -342 -141t-125 -338zM571 264q104 -66 242 -65q215 0 344 147.5t129 345.5q0 201 -129 340z" /> +<glyph unicode="Ù" horiz-adv-x="1458" d="M154 512v854h264v-827q0 -176 84 -258t229.5 -82t228 85t82.5 246v836h265v-825q0 -266 -164 -416t-414 -150q-258 0 -416.5 130.5t-158.5 406.5zM444 1593l72 189l442 -195l-51 -137z" /> +<glyph unicode="Ú" horiz-adv-x="1458" d="M154 512v854h264v-827q0 -176 84 -258t229.5 -82t228 85t82.5 246v836h265v-825q0 -266 -164 -416t-414 -150q-258 0 -416.5 130.5t-158.5 406.5zM502 1587l442 195l72 -189l-465 -143z" /> +<glyph unicode="Û" horiz-adv-x="1458" d="M154 512v854h264v-827q0 -176 84 -258t229.5 -82t228 85t82.5 246v836h265v-825q0 -266 -164 -416t-414 -150q-258 0 -416.5 130.5t-158.5 406.5zM371 1559l258 225h200l256 -225l-131 -89l-225 181l-225 -181z" /> +<glyph unicode="Ü" horiz-adv-x="1458" d="M154 512v854h264v-827q0 -176 84 -258t229.5 -82t228 85t82.5 246v836h265v-825q0 -266 -164 -416t-414 -150q-258 0 -416.5 130.5t-158.5 406.5zM334 1626q0 61 39 98t100.5 37t101 -36.5t39.5 -98.5q0 -59 -39.5 -97t-101.5 -38q-59 0 -99 38t-40 97zM846 1626 q0 61 40 98t101.5 37t100 -36.5t38.5 -98.5q0 -59 -39.5 -97t-99.5 -38q-61 0 -101 38t-40 97z" /> +<glyph unicode="Ý" horiz-adv-x="1245" d="M-2 1366h309l316 -535l325 535h299l-491 -795v-571h-264v569zM395 1587l443 195l71 -189l-465 -143z" /> +<glyph unicode="Þ" horiz-adv-x="1191" d="M170 0v1366h264v-281h234q244 0 358.5 -106.5t114.5 -276.5q0 -195 -130 -306t-343 -111h-234v-285h-264zM434 506h193q240 0 239 182q0 178 -239 178h-193v-360z" /> +<glyph unicode="ß" horiz-adv-x="1222" d="M45 750v137l145 51v72q0 227 115 351t332 124q182 0 288.5 -84t106.5 -221q0 -70 -28.5 -131.5t-64.5 -97.5t-64.5 -82t-28.5 -89q0 -47 34.5 -90t83.5 -80l97 -78q49 -41 84 -103t35 -140q0 -139 -104.5 -226.5t-282.5 -87.5q-147 0 -234 52l37 202q76 -59 176 -59 q68 0 105.5 33t37.5 84q0 43 -30.5 78.5t-74.5 65.5t-89 65.5t-76 95t-31 137.5q0 74 27 135.5t59.5 95t59 83t26.5 102.5q0 78 -45 113.5t-112 35.5q-182 0 -183 -276v-1018h-256v750h-145z" /> +<glyph unicode="à" horiz-adv-x="1007" d="M53 219q0 289 545 361v32q0 78 -24.5 116t-104.5 38q-145 -2 -295 -111l-61 181q18 14 53 33.5t146.5 53t228.5 33.5q174 0 243.5 -71.5t69.5 -231.5v-360q0 -92 88 -107l16 -2l-73 -198q-197 6 -260 137q-96 -147 -291 -148q-125 0 -203 69t-78 175zM145 1448h242 l211 -334l-135 -74zM313 240q0 -78 90 -78q92 0 195 121v149q-285 -40 -285 -192z" /> +<glyph unicode="á" horiz-adv-x="1007" d="M53 219q0 289 545 361v32q0 78 -24.5 116t-104.5 38q-145 -2 -295 -111l-61 181q18 14 53 33.5t146.5 53t228.5 33.5q174 0 243.5 -71.5t69.5 -231.5v-360q0 -92 88 -107l16 -2l-73 -198q-197 6 -260 137q-96 -147 -291 -148q-125 0 -203 69t-78 175zM313 240 q0 -78 90 -78q92 0 195 121v149q-285 -40 -285 -192zM350 1114l211 334h244l-318 -408z" /> +<glyph unicode="â" horiz-adv-x="1007" d="M53 219q0 289 545 361v32q0 78 -24.5 116t-104.5 38q-145 -2 -295 -111l-61 181q18 14 53 33.5t146.5 53t228.5 33.5q174 0 243.5 -71.5t69.5 -231.5v-360q0 -92 88 -107l16 -2l-73 -198q-197 6 -260 137q-96 -147 -291 -148q-125 0 -203 69t-78 175zM162 1098l235 350 h158l233 -352l-139 -58l-174 244l-172 -244zM313 240q0 -78 90 -78q92 0 195 121v149q-285 -40 -285 -192z" /> +<glyph unicode="ã" horiz-adv-x="1007" d="M53 219q0 289 545 361v32q0 78 -24.5 116t-104.5 38q-145 -2 -295 -111l-61 181q18 14 53 33.5t146.5 53t228.5 33.5q174 0 243.5 -71.5t69.5 -231.5v-360q0 -92 88 -107l16 -2l-73 -198q-197 6 -260 137q-96 -147 -291 -148q-125 0 -203 69t-78 175zM127 1151q0 37 6 73 t25.5 82t64.5 74.5t111 28.5q70 0 124 -39t92 -78t68 -39q59 0 60 117v25h156v-29q0 -37 -7.5 -74t-26 -84t-65.5 -76.5t-114 -29.5q-70 0 -121 39t-87 77.5t-69 38.5q-59 0 -59 -118v-19h-156q-2 13 -2 31zM313 240q0 -78 90 -78q92 0 195 121v149q-285 -40 -285 -192z" /> +<glyph unicode="ä" horiz-adv-x="1007" d="M53 219q0 289 545 361v32q0 78 -24.5 116t-104.5 38q-145 -2 -295 -111l-61 181q18 14 53 33.5t146.5 53t228.5 33.5q174 0 243.5 -71.5t69.5 -231.5v-360q0 -92 88 -107l16 -2l-73 -198q-197 6 -260 137q-96 -147 -291 -148q-125 0 -203 69t-78 175zM121 1276 q0 59 38 95t97 36q61 0 99 -36t38 -95t-38 -95t-99 -36q-59 0 -97 36t-38 95zM313 240q0 -78 90 -78q92 0 195 121v149q-285 -40 -285 -192zM557 1276q0 59 38 95t97 36q61 0 99 -36t38 -95t-37.5 -95t-99.5 -36q-59 0 -97 36t-38 95z" /> +<glyph unicode="å" horiz-adv-x="1007" d="M53 219q0 289 545 361v32q0 78 -24.5 116t-104.5 38q-145 -2 -295 -111l-61 181q18 14 53 33.5t146.5 53t228.5 33.5q174 0 243.5 -71.5t69.5 -231.5v-360q0 -92 88 -107l16 -2l-73 -198q-197 6 -260 137q-96 -147 -291 -148q-125 0 -203 69t-78 175zM268 1282 q0 72 53.5 126t153.5 54t153.5 -54t53.5 -126t-53.5 -129t-153.5 -57t-153.5 57t-53.5 129zM313 240q0 -78 90 -78q92 0 195 121v149q-285 -40 -285 -192zM383 1280q0 -37 24.5 -62.5t67.5 -25.5t68.5 26.5t25.5 61.5t-24.5 60.5t-69.5 25.5t-68.5 -25.5t-23.5 -60.5z" /> +<glyph unicode="æ" horiz-adv-x="1538" d="M53 219q0 262 557 328v51q0 88 -24.5 128t-106.5 40q-70 0 -145.5 -27.5t-116.5 -54.5l-43 -29l-61 181q18 14 53 33.5t143.5 53t220.5 33.5q190 0 254 -118q109 119 277 118q180 0 288.5 -115.5t110.5 -330.5l-139 -41l-463 -57q18 -111 88 -175.5t176 -64.5 q68 0 138.5 28.5t107.5 57.5l37 29l68 -181q-16 -14 -48 -35.5t-134.5 -58.5t-211.5 -37q-254 0 -381 195q-39 -76 -130 -135.5t-224 -59.5q-131 0 -211 69t-80 175zM313 240q0 -78 101 -78q82 0 138 61.5t56 177.5q-295 -30 -295 -161zM856 561l328 39q0 6 -1 17.5t-9.5 40 t-21.5 50t-42 40t-68 18.5q-78 0 -126 -56.5t-60 -148.5z" /> +<glyph unicode="ç" horiz-adv-x="958" d="M66 449q0 207 142 357t367 150q195 0 328 -90l4 -4l-90 -186q-96 84 -223 84q-115 0 -189.5 -80t-74.5 -217q0 -131 70.5 -211t185.5 -80q63 0 124.5 23.5t90.5 46.5l28 24l78 -172q-12 -12 -34.5 -31.5t-107.5 -52.5t-185 -35l-7 -14q-18 -41 -18 -55q0 -20 27.5 -36.5 t62.5 -29t62.5 -46.5t27.5 -83q0 -84 -68.5 -140t-179.5 -56q-57 0 -108 15t-76 32l-22 16l49 115q70 -59 155 -60q43 0 70 16.5t27 39.5q0 20 -27 38.5t-59.5 31t-59 38t-26.5 58t32 98.5l17 33q-180 31 -286.5 159t-106.5 304z" /> +<glyph unicode="è" horiz-adv-x="1009" d="M70 461q0 209 129 352t333 143q180 0 289 -118.5t111 -337.5l-139 -41l-461 -60q23 -104 90 -165.5t172 -61.5q68 0 138.5 28.5t107.5 57.5l37 29l65 -181q-6 -6 -17.5 -14t-50 -30.5t-80.5 -40t-109 -32t-134 -14.5q-227 0 -354 140.5t-127 345.5zM184 1448h242 l211 -334l-135 -74zM326 547l329 43q0 6 -1 18.5t-9 43t-21.5 53t-42 42t-67.5 19.5q-80 0 -129 -60.5t-59 -158.5z" /> +<glyph unicode="é" horiz-adv-x="1009" d="M70 461q0 209 129 352t333 143q180 0 289 -118.5t111 -337.5l-139 -41l-461 -60q23 -104 90 -165.5t172 -61.5q68 0 138.5 28.5t107.5 57.5l37 29l65 -181q-6 -6 -17.5 -14t-50 -30.5t-80.5 -40t-109 -32t-134 -14.5q-227 0 -354 140.5t-127 345.5zM326 547l329 43 q0 6 -1 18.5t-9 43t-21.5 53t-42 42t-67.5 19.5q-80 0 -129 -60.5t-59 -158.5zM389 1114l211 334h244l-318 -408z" /> +<glyph unicode="ê" horiz-adv-x="1009" d="M70 461q0 209 129 352t333 143q180 0 289 -118.5t111 -337.5l-139 -41l-461 -60q23 -104 90 -165.5t172 -61.5q68 0 138.5 28.5t107.5 57.5l37 29l65 -181q-6 -6 -17.5 -14t-50 -30.5t-80.5 -40t-109 -32t-134 -14.5q-227 0 -354 140.5t-127 345.5zM203 1098l235 350h158 l233 -352l-139 -58l-174 244l-172 -244zM326 547l329 43q0 6 -1 18.5t-9 43t-21.5 53t-42 42t-67.5 19.5q-80 0 -129 -60.5t-59 -158.5z" /> +<glyph unicode="ë" horiz-adv-x="1009" d="M70 461q0 209 129 352t333 143q180 0 289 -118.5t111 -337.5l-139 -41l-461 -60q23 -104 90 -165.5t172 -61.5q68 0 138.5 28.5t107.5 57.5l37 29l65 -181q-6 -6 -17.5 -14t-50 -30.5t-80.5 -40t-109 -32t-134 -14.5q-227 0 -354 140.5t-127 345.5zM162 1276q0 59 38 95 t97 36q61 0 99 -36t38 -95t-38 -95t-99 -36q-59 0 -97 36t-38 95zM326 547l329 43q0 6 -1 18.5t-9 43t-21.5 53t-42 42t-67.5 19.5q-80 0 -129 -60.5t-59 -158.5zM598 1276q0 59 38 95t97 36q61 0 99 -36t38 -95t-37.5 -95t-99.5 -36q-59 0 -97 36t-38 95z" /> +<glyph unicode="ì" horiz-adv-x="514" d="M-72 1448h242l211 -334l-135 -74zM129 0v932h256v-932h-256z" /> +<glyph unicode="í" horiz-adv-x="514" d="M129 0v932h256v-932h-256zM133 1114l211 334h244l-318 -408z" /> +<glyph unicode="î" horiz-adv-x="514" d="M-55 1098l235 350h158l233 -352l-139 -58l-174 244l-172 -244zM129 0v932h256v-932h-256z" /> +<glyph unicode="ï" horiz-adv-x="514" d="M-96 1276q0 59 38 95t97 36q61 0 99 -36t38 -95t-38 -95t-99 -36q-59 0 -97 36t-38 95zM129 0v932h256v-932h-256zM340 1276q0 59 38 95t97 36q61 0 99 -36t38 -95t-37.5 -95t-99.5 -36q-59 0 -97 36t-38 95z" /> +<glyph unicode="ð" horiz-adv-x="1120" d="M68 444q0 201 128 356.5t328 155.5q133 0 201 -67q-68 156 -203 266l-270 -154l-70 129l201 113q-102 59 -248 94l47 185q229 -43 410 -158l297 168l67 -131l-237 -135q309 -276 309 -688q0 -264 -133 -433.5t-365 -169.5q-215 0 -338.5 137t-123.5 332zM319 463 q0 -115 55.5 -206t164.5 -91q106 0 175.5 92t69.5 289q0 94 -50 156.5t-150 62.5q-117 0 -191 -86t-74 -217z" /> +<glyph unicode="ñ" horiz-adv-x="1095" d="M125 0v911l246 41v-172q162 176 352 176q252 0 252 -292v-664h-254v555q0 96 -21.5 138t-72.5 42q-98 0 -246 -147v-588h-256zM213 1151q0 37 6 73t25.5 82t64.5 74.5t111 28.5q70 0 124 -39t92 -78t69 -39q59 0 59 117v25h156v-29q0 -37 -7.5 -74t-26 -84t-65.5 -76.5 t-114 -29.5q-70 0 -121 39t-87 77.5t-69 38.5q-59 0 -59 -118v-19h-156q-2 13 -2 31z" /> +<glyph unicode="ò" horiz-adv-x="1142" d="M68 463q0 92 29.5 176t88 156.5t158.5 116.5t231 44q238 0 369 -139t131 -332q0 -90 -28.5 -176t-87 -162.5t-160 -124t-232.5 -47.5q-238 0 -368.5 143.5t-130.5 344.5zM244 1448h241l211 -334l-135 -74zM332 481q0 -131 62.5 -223t178.5 -92q102 0 170 82t68 211 q0 123 -61.5 215t-178.5 92q-102 0 -170.5 -80t-68.5 -205z" /> +<glyph unicode="ó" horiz-adv-x="1142" d="M68 463q0 92 29.5 176t88 156.5t158.5 116.5t231 44q238 0 369 -139t131 -332q0 -90 -28.5 -176t-87 -162.5t-160 -124t-232.5 -47.5q-238 0 -368.5 143.5t-130.5 344.5zM332 481q0 -131 62.5 -223t178.5 -92q102 0 170 82t68 211q0 123 -61.5 215t-178.5 92 q-102 0 -170.5 -80t-68.5 -205zM446 1114l211 334h244l-317 -408z" /> +<glyph unicode="ô" horiz-adv-x="1142" d="M68 463q0 92 29.5 176t88 156.5t158.5 116.5t231 44q238 0 369 -139t131 -332q0 -90 -28.5 -176t-87 -162.5t-160 -124t-232.5 -47.5q-238 0 -368.5 143.5t-130.5 344.5zM258 1098l236 350h157l234 -352l-140 -58l-174 244l-172 -244zM332 481q0 -131 62.5 -223 t178.5 -92q102 0 170 82t68 211q0 123 -61.5 215t-178.5 92q-102 0 -170.5 -80t-68.5 -205z" /> +<glyph unicode="õ" horiz-adv-x="1142" d="M68 463q0 92 29.5 176t88 156.5t158.5 116.5t231 44q238 0 369 -139t131 -332q0 -90 -28.5 -176t-87 -162.5t-160 -124t-232.5 -47.5q-238 0 -368.5 143.5t-130.5 344.5zM223 1151q0 37 6.5 73t25.5 82t64.5 74.5t110.5 28.5q70 0 124 -39t92 -78t69 -39q59 0 59 117v25 h156v-29q0 -37 -7.5 -74t-25.5 -84t-65.5 -76.5t-114.5 -29.5q-70 0 -121 39t-87 77.5t-69 38.5q-59 0 -59 -118v-19h-156q-2 13 -2 31zM332 481q0 -131 62.5 -223t178.5 -92q102 0 170 82t68 211q0 123 -61.5 215t-178.5 92q-102 0 -170.5 -80t-68.5 -205z" /> +<glyph unicode="ö" horiz-adv-x="1142" d="M68 463q0 92 29.5 176t88 156.5t158.5 116.5t231 44q238 0 369 -139t131 -332q0 -90 -28.5 -176t-87 -162.5t-160 -124t-232.5 -47.5q-238 0 -368.5 143.5t-130.5 344.5zM217 1276q0 59 38 95t97 36q61 0 99 -36t38 -95t-37.5 -95t-99.5 -36q-59 0 -97 36t-38 95z M332 481q0 -131 62.5 -223t178.5 -92q102 0 170 82t68 211q0 123 -61.5 215t-178.5 92q-102 0 -170.5 -80t-68.5 -205zM653 1276q0 59 38 95t97 36q61 0 99.5 -36t38.5 -95t-38 -95t-100 -36q-59 0 -97 36t-38 95z" /> +<glyph unicode="÷" horiz-adv-x="1064" d="M74 436v166h917v-166h-917zM391 135q0 59 41 101.5t100.5 42.5t101.5 -42t42 -101.5t-42 -100.5t-102 -41q-57 0 -99 42t-42 99zM391 901.5q0 59.5 42 101t99 41.5q59 0 101.5 -41.5t42.5 -101t-42 -101.5t-102 -42q-57 0 -99 42t-42 101.5z" /> +<glyph unicode="ø" horiz-adv-x="1142" d="M68 463q0 92 29.5 176t88 156.5t158.5 116.5t231 44q137 0 244 -51l68 88h143l-115 -151q160 -135 160 -357q0 -90 -28.5 -176t-87 -162.5t-160 -124t-232.5 -47.5q-141 0 -252 56l-69 -92h-146l119 159q-151 138 -151 365zM332 481q0 -102 37 -182l321 430 q-49 37 -119 37q-102 0 -170.5 -80t-68.5 -205zM444 205q55 -39 129 -39q102 0 170 82t68 211q0 102 -43 184z" /> +<glyph unicode="ù" horiz-adv-x="1095" d="M119 256v676h256v-555q0 -94 19.5 -137t76.5 -43q92 0 236 127v608h254v-647q0 -49 10 -120t20 -116l10 -45l-245 -22q-20 90 -29 157q-158 -164 -352 -164q-117 0 -186.5 69t-69.5 212zM211 1448h242l211 -334l-136 -74z" /> +<glyph unicode="ú" horiz-adv-x="1095" d="M119 256v676h256v-555q0 -94 19.5 -137t76.5 -43q92 0 236 127v608h254v-647q0 -49 10 -120t20 -116l10 -45l-245 -22q-20 90 -29 157q-158 -164 -352 -164q-117 0 -186.5 69t-69.5 212zM416 1114l211 334h243l-317 -408z" /> +<glyph unicode="û" horiz-adv-x="1095" d="M119 256v676h256v-555q0 -94 19.5 -137t76.5 -43q92 0 236 127v608h254v-647q0 -49 10 -120t20 -116l10 -45l-245 -22q-20 90 -29 157q-158 -164 -352 -164q-117 0 -186.5 69t-69.5 212zM225 1098l236 350h157l234 -352l-139 -58l-174 244l-172 -244z" /> +<glyph unicode="ü" horiz-adv-x="1095" d="M119 256v676h256v-555q0 -94 19.5 -137t76.5 -43q92 0 236 127v608h254v-647q0 -49 10 -120t20 -116l10 -45l-245 -22q-20 90 -29 157q-158 -164 -352 -164q-117 0 -186.5 69t-69.5 212zM184 1276q0 59 38 95t97 36q61 0 99.5 -36t38.5 -95t-38 -95t-100 -36 q-59 0 -97 36t-38 95zM621 1276q0 59 37.5 95t97.5 36q61 0 99 -36t38 -95t-38 -95t-99 -36q-59 0 -97 36t-38 95z" /> +<glyph unicode="ý" horiz-adv-x="972" d="M8 932h266l218 -610l213 610h258l-388 -1000q-63 -162 -188 -281.5t-289 -135.5l-78 196q100 12 188.5 81t125.5 155l33 78zM367 1114l211 334h243l-317 -408z" /> +<glyph unicode="þ" horiz-adv-x="1105" d="M129 -481v1908l256 41v-659q80 147 258 147t284.5 -132t106.5 -328q0 -213 -125 -367t-346 -154q-115 0 -178 39v-454zM385 252q0 -86 135 -86q113 0 181.5 81t68.5 232q0 129 -48 203t-128 74q-113 0 -209 -140v-364z" /> +<glyph unicode="ÿ" horiz-adv-x="972" d="M8 932h266l218 -610l213 610h258l-388 -1000q-63 -162 -188 -281.5t-289 -135.5l-78 196q100 12 188.5 81t125.5 155l33 78zM137 1276q0 59 38 95t97 36q61 0 99.5 -36t38.5 -95t-38 -95t-100 -36q-59 0 -97 36t-38 95zM573 1276q0 59 38 95t98 36q61 0 99 -36t38 -95 t-38 -95t-99 -36q-59 0 -97.5 36t-38.5 95z" /> +<glyph unicode="Œ" horiz-adv-x="2027" d="M78 680q0 182 84 342t258 264.5t405 104.5q139 0 256 -25h852v-221h-598v-342h471v-219h-471v-363h613v-221h-877q-137 -25 -264 -25q-328 0 -528.5 207t-200.5 498zM354 688q0 -190 122 -339.5t337 -149.5q154 0 258 26v905q-111 37 -250 37q-217 0 -342 -141t-125 -338 z" /> +<glyph unicode="œ" horiz-adv-x="1746" d="M68 463q0 92 29.5 176t88 156.5t158.5 116.5t231 44q233 0 365 -168q125 168 330 168q180 0 288.5 -118.5t110.5 -337.5l-139 -41l-461 -60q23 -104 90.5 -165.5t171.5 -61.5q68 0 138.5 28.5t107.5 57.5l37 29l65 -181q-6 -6 -17 -14t-50 -30.5t-81 -40t-108.5 -32 t-134.5 -14.5q-227 0 -352 168q-131 -168 -368.5 -168t-368.5 143.5t-131 344.5zM332 481q0 -131 62.5 -223t178.5 -92q102 0 170 82t68 211q0 123 -61.5 215t-178.5 92q-102 0 -170.5 -80t-68.5 -205zM1063 549l330 41q0 6 -1 18.5t-9.5 43t-21.5 53t-42 42t-68 19.5 q-80 0 -129 -59.5t-59 -157.5z" /> +<glyph unicode="Ÿ" horiz-adv-x="1245" d="M-2 1366h309l316 -535l325 535h299l-491 -795v-571h-264v569zM227 1626q0 61 39 98t100.5 37t101.5 -36.5t40 -98.5q0 -59 -40 -97t-101 -38q-59 0 -99.5 38t-40.5 97zM739 1626q0 61 40 98t101.5 37t100.5 -36.5t39 -98.5q0 -59 -40 -97t-99 -38q-61 0 -101.5 38 t-40.5 97z" /> +<glyph unicode="ˆ" horiz-adv-x="1044" d="M209 1098l235 350h158l234 -352l-140 -58l-174 244l-172 -244z" /> +<glyph unicode="˜" horiz-adv-x="1044" d="M178 1151q0 37 6 73t25.5 82t64.5 74.5t111 28.5q70 0 124 -39t92 -78t69 -39q59 0 59 117v25h156v-29q0 -37 -7.5 -74t-25.5 -84t-65.5 -76.5t-114.5 -29.5q-70 0 -121 39t-87 77.5t-69 38.5q-59 0 -59 -118v-19h-156q-2 13 -2 31z" /> +<glyph unicode=" " horiz-adv-x="892" /> +<glyph unicode=" " horiz-adv-x="1784" /> +<glyph unicode=" " horiz-adv-x="892" /> +<glyph unicode=" " horiz-adv-x="1784" /> +<glyph unicode=" " horiz-adv-x="594" /> +<glyph unicode=" " horiz-adv-x="446" /> +<glyph unicode=" " horiz-adv-x="297" /> +<glyph unicode=" " horiz-adv-x="297" /> +<glyph unicode=" " horiz-adv-x="223" /> +<glyph unicode=" " horiz-adv-x="356" /> +<glyph unicode=" " horiz-adv-x="99" /> +<glyph unicode="‐" horiz-adv-x="755" d="M106 440v164h543v-164h-543z" /> +<glyph unicode="‑" horiz-adv-x="755" d="M106 440v164h543v-164h-543z" /> +<glyph unicode="‒" horiz-adv-x="755" d="M106 440v164h543v-164h-543z" /> +<glyph unicode="–" horiz-adv-x="1052" d="M106 442v166h840v-166h-840z" /> +<glyph unicode="—" horiz-adv-x="1851" d="M106 442v166h1639v-166h-1639z" /> +<glyph unicode="‘" horiz-adv-x="458" d="M82 1153q0 203 221 377l84 -94q-125 -100 -125 -211q0 -51 30 -102.5t114 -141.5l-209 -111q-115 142 -115 283z" /> +<glyph unicode="’" horiz-adv-x="442" d="M47 1419l211 111q113 -139 113 -281q0 -205 -219 -379l-86 95q127 100 127 213q0 51 -31 103t-115 138z" /> +<glyph unicode="‚" horiz-adv-x="495" d="M78 199l211 110q115 -141 114 -280q0 -203 -221 -377l-86 92q127 100 127 213q0 53 -30.5 103.5t-114.5 138.5z" /> +<glyph unicode="“" horiz-adv-x="849" d="M82 1153q0 203 221 377l84 -94q-125 -100 -125 -211q0 -51 30 -102.5t114 -141.5l-209 -111q-115 142 -115 283zM473 1153q0 203 221 377l84 -94q-125 -100 -125 -211q0 -51 30 -102.5t114 -141.5l-209 -111q-115 142 -115 283z" /> +<glyph unicode="”" horiz-adv-x="833" d="M47 1419l211 111q113 -139 113 -281q0 -205 -219 -379l-86 95q127 100 127 213q0 51 -31 103t-115 138zM440 1419l209 111q113 -139 113 -281q0 -205 -219 -379l-86 95q127 100 127 213q0 51 -31 103t-113 138z" /> +<glyph unicode="„" horiz-adv-x="886" d="M78 199l211 110q115 -141 114 -280q0 -203 -221 -377l-86 92q127 100 127 213q0 53 -30.5 103.5t-114.5 138.5zM469 199l211 110q115 -141 115 -280q0 -205 -222 -377l-86 92q127 100 127 213q0 53 -30.5 103.5t-114.5 138.5z" /> +<glyph unicode="•" horiz-adv-x="833" d="M106 524q0 131 90.5 221.5t221.5 90.5t220 -90.5t89 -221.5t-89 -221t-220 -90t-221.5 90t-90.5 221z" /> +<glyph unicode="…" horiz-adv-x="1658" d="M100 131q0 66 46.5 113t112 47t111.5 -47t46 -113q0 -63 -47 -109.5t-110.5 -46.5t-111 46.5t-47.5 109.5zM672 131q0 66 46 113t109 47q66 0 113 -47t47 -113q0 -63 -47 -109.5t-113 -46.5q-63 0 -109 46.5t-46 109.5zM1243 131q0 66 46 113t110 47q66 0 113 -47 t47 -113q0 -63 -47.5 -109.5t-112.5 -46.5q-63 0 -109.5 46.5t-46.5 109.5z" /> +<glyph unicode=" " horiz-adv-x="356" /> +<glyph unicode="‹" horiz-adv-x="643" d="M33 510v8q31 25 200 217l189 211l141 -41l-293 -391l293 -391l-141 -41l-165 182l-107 121l-59 66q-26 29 -36 39t-22 20z" /> +<glyph unicode="›" horiz-adv-x="643" d="M80 123l295 391l-295 391l141 41q356 -399 375 -416q6 -6 14 -12v-8q-12 -10 -22 -20.5l-36 -38.5l-58 -66l-108 -121l-165 -182z" /> +<glyph unicode=" " horiz-adv-x="446" /> +<glyph unicode="€" horiz-adv-x="1155" d="M76 365v118h106q-4 45 -4 74q0 27 4 84h-106v119h131q53 182 195.5 294.5t342.5 112.5q82 0 162 -18.5t121 -38.5l39 -18l-63 -197q-113 76 -254 76q-205 0 -279 -211h494l-35 -119h-486q-2 -23 -2 -68q0 -47 7 -90h438l-35 -118h-373q80 -193 279 -193q57 0 119.5 15.5 t97.5 29.5l33 16l49 -182q-127 -76 -318 -76q-201 0 -342 104.5t-194 285.5h-127z" /> +<glyph unicode="™" horiz-adv-x="1433" d="M72 1257v109h493v-109h-178v-436h-137v436h-178zM653 821l21 545h194l117 -340l119 340h192l21 -545h-133l-17 396l-139 -396h-90l-139 398l-13 -398h-133z" /> +<glyph unicode="" horiz-adv-x="930" d="M0 930h930v-930h-930v930z" /> +<glyph unicode="fi" horiz-adv-x="1150" d="M45 750v137l145 51v57q0 240 130.5 376t338.5 136q172 -2 293 -80l-90 -180q-96 63 -205 64q-211 0 -211 -297v-82h574v-932h-254v760h-320v-760h-256v750h-145z" /> +<glyph unicode="fl" horiz-adv-x="1187" d="M45 750v137l145 51v57q0 240 130.5 376t338.5 136q131 0 261 -61l137 22v-1468h-254v1276q-82 35 -146 35q-211 0 -211 -297v-82h250v-182h-250v-750h-256v750h-145z" /> +<glyph unicode="ffi" horiz-adv-x="1781" d="M45 750v137l145 51v29q0 229 128 360t329 131q170 0 293 -90q123 139 330 139q166 -2 282 -80l-90 -180q-88 63 -190 64q-195 0 -195 -277v-102h576v-932h-256v760h-320v-760h-254v760h-377v-760h-256v750h-145zM446 932h377v84q0 96 23 176q-90 70 -195 70 q-205 0 -205 -277v-53z" /> +<glyph unicode="ffl" horiz-adv-x="1818" d="M45 750v137l145 51v29q0 229 128 360t329 131q170 0 293 -90q123 139 330 139q143 0 258 -65l162 26v-1468h-256v1266q-86 45 -160 45q-197 0 -197 -277v-102h250v-182h-250v-750h-254v760h-377v-760h-256v750h-145zM446 932h377v84q0 92 23 176q-90 70 -195 70 q-205 0 -205 -277v-53z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansBold-webfont.ttf b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansBold-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..65b27a67a74d75fe8c06d5ef38f2ee6d024a09ba Binary files /dev/null and b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansBold-webfont.ttf differ diff --git a/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansBold-webfont.woff b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansBold-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..9b82237317f9a7be251948eb43fbf6ecb286c481 Binary files /dev/null and b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansBold-webfont.woff differ diff --git a/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansLight-webfont.eot b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansLight-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..cbc96985981d657802c40a0ec9b343b4f4a4f7c5 Binary files /dev/null and b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansLight-webfont.eot differ diff --git a/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansLight-webfont.svg b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansLight-webfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..616b462d1354740bbf518ba49cb5ed024358c47d --- /dev/null +++ b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansLight-webfont.svg @@ -0,0 +1,244 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Fontspring. +</metadata> +<defs> +<font id="webfonty8j6eXvh" horiz-adv-x="1073" > +<font-face units-per-em="2048" ascent="1536" descent="-512" /> +<missing-glyph horiz-adv-x="491" /> +<glyph unicode=" " horiz-adv-x="491" /> +<glyph unicode="	" horiz-adv-x="491" /> +<glyph unicode=" " horiz-adv-x="491" /> +<glyph unicode="!" horiz-adv-x="544" d="M164 86q0 45 32.5 78t77.5 33t78 -33t33 -78t-33 -78t-78 -33t-77.5 33t-32.5 78zM195 1391h153l-20 -1010h-119z" /> +<glyph unicode=""" horiz-adv-x="684" d="M137 903v463h127v-76l-39 -387h-88zM438 903v463h127v-76l-39 -387h-88z" /> +<glyph unicode="#" horiz-adv-x="1298" d="M76 266l18 101h238l59 295h-239l20 102h242l86 420h108l-86 -420h318l86 420h108l-86 -420h273l-21 -102h-272l-62 -295h277l-19 -101h-278l-90 -448h-111l92 448h-317l-90 -448h-111l92 448h-235zM440 367h318l59 295h-315z" /> +<glyph unicode="$" horiz-adv-x="935" d="M84 86l33 123l39 -27q25 -16 105.5 -46t164.5 -34l10 422q-55 20 -88 33.5t-84 43.5t-80.5 60.5t-52 81t-22.5 109.5q0 121 86 199.5t258 89.5l6 178h88l-6 -178q170 -6 278 -60l-39 -112q-104 49 -241 59l-11 -397q315 -119 316 -346q0 -125 -89 -203t-245 -90l-4 -174 h-88l4 170q-96 2 -180 26.5t-121 46.5zM248 860q0 -76 47 -119t145 -79l11 366q-203 -12 -203 -168zM514 106q193 25 193 179q0 76 -47.5 122t-135.5 82z" /> +<glyph unicode="%" horiz-adv-x="1472" d="M84 1036q0 127 87 215t212 88q127 0 214 -88t87 -215t-87 -214t-214 -87q-125 0 -212 87t-87 214zM180 1036q0 -84 59.5 -147.5t143.5 -63.5t143.5 63.5t59.5 147.5t-59.5 147.5t-145.5 63.5q-82 0 -141.5 -63.5t-59.5 -147.5zM209 0l950 1370l80 -57l-915 -1313h-115z M797 276q0 127 87 215.5t214 88.5q125 0 212 -88.5t87 -215.5q0 -125 -87 -213t-212 -88q-127 0 -214 88t-87 213zM895 276.5q0 -83.5 59.5 -147t143.5 -63.5t142 63.5t58 147t-59 147t-145 63.5q-82 0 -140.5 -63.5t-58.5 -147z" /> +<glyph unicode="&" horiz-adv-x="1378" d="M94 313q0 127 80 221.5t225 196.5q-121 213 -120 356q0 113 78.5 208.5t234.5 95.5q131 0 204.5 -73t73.5 -185q0 -127 -78.5 -221.5t-226.5 -198.5q72 -115 164 -232q76 -96 164 -184q176 236 205 621h123q-10 -156 -74 -352.5t-174 -342.5q199 -176 354 -207l-57 -102 q-182 35 -383 213q-166 -152 -379 -152q-172 0 -293 91t-121 247zM223 326q0 -113 90 -173.5t211 -60.5q154 0 281 111q-98 102 -174 196q-88 106 -174 236q-115 -82 -174.5 -152.5t-59.5 -156.5zM422 1092q0 -113 88 -283q113 80 170 146.5t57 150.5q0 70 -40 119t-113 49 q-76 0 -119 -53t-43 -129z" /> +<glyph unicode="'" horiz-adv-x="380" d="M137 903v463h121v-76l-25 -387h-96z" /> +<glyph unicode="(" horiz-adv-x="573" d="M115 553q0 154 30.5 298t74.5 240.5t88 172t75 110.5l31 35l108 -31l-32 -39q-19 -25 -68 -107.5t-88 -172.5t-70 -228.5t-31 -277.5q0 -152 31 -299.5t74 -247.5t86 -178t74 -115l30 -39l-104 -34l-34 39q-22 26 -75 115t-93 187.5t-73.5 254t-33.5 317.5z" /> +<glyph unicode=")" horiz-adv-x="573" d="M45 -326q12 14 31.5 40t71 113t90 182t70.5 243.5t32 300.5q0 139 -29.5 275.5t-72.5 231.5t-85 170t-71 111l-31 37l109 31q12 -12 32.5 -36.5t71.5 -107.5t90 -175.5t72 -237.5t33 -299q0 -459 -236 -815q-41 -63 -73 -98z" /> +<glyph unicode="*" horiz-adv-x="978" d="M98 854l285 115l29 -47l-244 -191zM98 1143l70 123l244 -191l-29 -47zM420 588l43 303h53l43 -303h-139zM420 1409h139l-43 -303h-53zM567 922l27 47l287 -115l-70 -123zM567 1075l244 191l70 -123l-287 -115z" /> +<glyph unicode="+" horiz-adv-x="1064" d="M68 449v120h403v424h131v-424h397v-120h-397v-449h-131v449h-403z" /> +<glyph unicode="," horiz-adv-x="456" d="M82 -274q51 45 70.5 64.5t36 55t16.5 82.5q0 111 -88 230l145 49q72 -82 72 -209q0 -205 -187 -338z" /> +<glyph unicode="-" horiz-adv-x="669" d="M117 438v142h434v-142h-434z" /> +<glyph unicode="." horiz-adv-x="477" d="M127 86q0 45 33 78t80 33q45 0 76.5 -33t31.5 -78t-31.5 -78t-76.5 -33q-47 0 -80 33t-33 78z" /> +<glyph unicode="/" horiz-adv-x="931" d="M49 -401l682 1767h131l-680 -1767h-133z" /> +<glyph unicode="0" horiz-adv-x="1116" d="M109 473q0 207 118.5 358.5t337.5 151.5q211 0 327 -141.5t116 -343.5q0 -133 -45 -248t-151.5 -195t-256.5 -80q-213 0 -329.5 146.5t-116.5 351.5zM240 483q0 -160 83 -275.5t240 -115.5q150 0 232 117t82 276q0 156 -83 268.5t-230.5 112.5t-235.5 -114.5t-88 -268.5z " /> +<glyph unicode="1" horiz-adv-x="694" d="M106 0v115h203v745h-186v98h313v-843h193v-115h-523z" /> +<glyph unicode="2" horiz-adv-x="894" d="M94 90l54 40q34 26 120 100.5t151.5 145t120 162t54.5 162.5q0 74 -51 122t-131 48q-57 0 -120 -25.5t-95 -49.5l-35 -25l-60 84q16 14 46 35.5t117 57.5t167 36q129 0 212 -76t83 -196q0 -78 -40 -161t-114.5 -166t-134 -138.5t-147.5 -128.5h522v-117h-696z" /> +<glyph unicode="3" horiz-adv-x="804" d="M45 856q16 14 46 35.5t117 56.5t167 35q129 0 213 -73.5t84 -192.5q0 -104 -76 -194.5t-180 -147.5q139 -27 215 -111t76 -211q0 -193 -160 -316.5t-416 -123.5q-37 0 -55 2l-13 104q20 -2 60 -2q190 0 320 86t130 234q0 131 -92 188.5t-229 57.5h-64v110 q121 14 235 112.5t114 205.5q0 72 -47.5 115.5t-124.5 43.5q-61 0 -125 -23.5t-97 -47.5l-30 -25z" /> +<glyph unicode="4" horiz-adv-x="1050" d="M59 63v87l631 839h88v-815h199v-111h-199v-458h-127v458h-592zM207 174h444v578z" /> +<glyph unicode="5" horiz-adv-x="808" d="M63 -283q18 -2 60 -2q188 0 321.5 88t133.5 246q0 96 -42 166t-118 107.5t-148.5 57t-167.5 32.5v546h562v-114h-439v-334q215 -41 350.5 -149.5t135.5 -305.5q0 -201 -163 -321.5t-417 -120.5q-39 0 -57 2z" /> +<glyph unicode="6" horiz-adv-x="1030" d="M106 567q0 156 44.5 297.5t128 258t223 188t313.5 80.5l10 -107q-236 -12 -381 -157.5t-188 -366.5q88 113 274 112q195 0 303.5 -124.5t108.5 -307.5q0 -186 -109.5 -325.5t-297.5 -139.5q-207 0 -318 170t-111 422zM242 586q0 -207 75.5 -350.5t219.5 -143.5 q123 0 196.5 96.5t73.5 235.5q0 78 -20.5 147.5t-88 128t-174.5 58.5q-162 0 -282 -121v-51z" /> +<glyph unicode="7" horiz-adv-x="919" d="M68 831v127h792v-94q-219 -541 -586 -1263l-122 32q291 526 563 1198h-647z" /> +<glyph unicode="8" horiz-adv-x="1040" d="M104 317q0 123 83 216.5t235 199.5q-227 178 -227 363q0 137 101 216t251 79q147 0 237 -82t90 -207q0 -104 -66.5 -188.5t-184.5 -170.5q74 -55 116.5 -91t95 -90t77 -112.5t24.5 -121.5q0 -147 -122 -250t-300 -103q-188 0 -299 101.5t-111 240.5zM233 328 q0 -111 85 -172.5t204 -61.5q113 0 195 61.5t82 166.5q0 49 -19.5 92t-74 94t-82.5 74l-111 84q-135 -92 -207 -169t-72 -169zM332 1098q0 -78 52 -145.5t151 -141.5q102 76 157.5 140.5t55.5 142.5q0 90 -65 134t-144 44q-78 0 -142.5 -43t-64.5 -131z" /> +<glyph unicode="9" horiz-adv-x="1024" d="M106 538.5q0 182.5 104.5 313.5t289.5 131q207 0 318.5 -170t111.5 -414q0 -319 -187.5 -549.5t-521.5 -242.5l-10 106q250 18 390 152.5t179 343.5q-92 -113 -274 -113q-188 0 -294 130t-106 312.5zM244 553q0 -55 11 -108.5t40 -109.5t86 -90t137 -34q156 0 275 119 q2 14 2 45q0 207 -79 349t-224 142q-113 0 -180.5 -87t-67.5 -226z" /> +<glyph unicode=":" horiz-adv-x="550" d="M166 86q0 45 31.5 78t78.5 33q45 0 78 -33t33 -78t-32.5 -78t-78.5 -33q-47 0 -78.5 33t-31.5 78zM166 799q0 45 31.5 77.5t78.5 32.5q45 0 78 -32.5t33 -77.5t-32.5 -78t-78.5 -33q-47 0 -78.5 33t-31.5 78z" /> +<glyph unicode=";" horiz-adv-x="540" d="M129 -274q51 45 70.5 64.5t36 55t16.5 82.5q0 111 -88 230l145 49q72 -82 72 -209q0 -205 -186 -338zM158 799q0 45 32.5 77.5t79.5 32.5q45 0 77 -32.5t32 -77.5t-32 -78t-77 -33q-47 0 -79.5 33t-32.5 78z" /> +<glyph unicode="<" horiz-adv-x="1064" d="M68 459v94l872 469l27 -129l-736 -387l736 -408l-27 -127z" /> +<glyph unicode="=" horiz-adv-x="1064" d="M70 252v123h925v-123h-925zM70 651v123h925v-123h-925z" /> +<glyph unicode=">" horiz-adv-x="1064" d="M96 98l731 408l-731 387l27 129l872 -469v-94l-872 -488z" /> +<glyph unicode="?" horiz-adv-x="710" d="M96 1303l29 122l55 -17q35 -11 123 -50t154.5 -81t122 -105.5t55.5 -129.5q0 -51 -34 -104t-82 -105.5t-96 -113t-82 -148.5t-34 -190h-102q-6 29 -6 76q0 96 44 190t96 153.5t96 123t44 106.5q0 66 -96 134.5t-190 103.5zM154 86q0 45 31.5 78t78.5 33t79 -33t32 -78 t-32 -78t-79 -33t-78.5 33t-31.5 78z" /> +<glyph unicode="@" horiz-adv-x="1673" d="M90 401q0 213 97.5 397.5t280.5 300t413 115.5q303 0 494.5 -190t191.5 -477q0 -299 -178 -438q-41 -33 -102.5 -57.5t-99.5 -35t-145 -32.5l-34 -9q-16 80 -25 148q-39 -63 -109.5 -105.5t-148.5 -42.5q-123 0 -204 106.5t-81 285.5q0 252 163 406.5t388 154.5l119 -6 v-654q0 -47 4 -88t8 -57l2 -19q164 20 243 131t79 287q0 258 -151.5 424t-411.5 166q-297 0 -485.5 -212t-188.5 -509q0 -274 159.5 -456.5t383.5 -192.5l-17 -94q-180 6 -329.5 112.5t-232.5 276t-83 364.5zM580 381q0 -121 51 -203t131 -82q113 0 217 158v561 q-174 0 -286.5 -126t-112.5 -308z" /> +<glyph unicode="A" horiz-adv-x="1255" d="M35 0l528 1376h129l529 -1376h-144l-170 449h-565l-170 -449h-137zM385 563h479l-239 631z" /> +<glyph unicode="B" horiz-adv-x="1189" d="M211 0v1366h321q244 0 353.5 -95t109.5 -233q0 -176 -166 -307q37 -12 72 -31.5t80 -56.5t72.5 -100.5t27.5 -145.5q0 -180 -130 -288.5t-337 -108.5h-403zM346 113h238q176 0 263 70.5t87 195.5t-87 197.5t-263 72.5h-238v-536zM346 764h332q6 4 18.5 11t42 31.5 t52 53.5t41 77t18.5 99q0 217 -348 217h-156v-489z" /> +<glyph unicode="C" horiz-adv-x="1376" d="M111 678q0 303 199.5 508t523.5 205q115 0 226 -30t165 -58l53 -31l-55 -125q-18 14 -53 35.5t-140.5 57.5t-210.5 36q-137 0 -247.5 -52.5t-177 -138.5t-101.5 -188t-35 -211q0 -244 160 -420t409 -176q207 0 396 131l14 10l55 -102q-8 -6 -23.5 -16.5t-64.5 -37 t-101 -47t-132 -37t-158 -16.5q-307 0 -504.5 200t-197.5 503z" /> +<glyph unicode="D" horiz-adv-x="1476" d="M211 0v1366h389q147 0 277.5 -36t242 -111.5t177 -207.5t65.5 -306q0 -336 -229.5 -520.5t-610.5 -184.5h-311zM346 113h156q373 0 544 156.5t171 414.5q0 264 -168 416.5t-478 152.5h-225v-1140z" /> +<glyph unicode="E" horiz-adv-x="1103" d="M211 0v1366h784v-113h-649v-497h514v-113h-514v-530h641v-113h-776z" /> +<glyph unicode="F" horiz-adv-x="1036" d="M211 0v1366h762v-113h-627v-503h496v-123h-496v-627h-135z" /> +<glyph unicode="G" horiz-adv-x="1423" d="M111 666q0 301 194.5 513t528.5 212q119 0 231.5 -26t165.5 -50l53 -27l-55 -127q-18 12 -53 31.5t-140.5 51.5t-212.5 32q-182 0 -314 -89t-192.5 -221t-60.5 -288q0 -254 165 -421t447 -167q61 0 130 10.5t108 20.5l37 10v440h-299v113h434v-645q-238 -63 -436 -64 q-309 0 -520 188t-211 503z" /> +<glyph unicode="H" horiz-adv-x="1538" d="M211 0v1366h135v-612h846v612h135v-1366h-135v641h-846v-641h-135z" /> +<glyph unicode="I" horiz-adv-x="557" d="M211 0v1366h135v-1366h-135z" /> +<glyph unicode="J" horiz-adv-x="559" d="M-16 -252q72 8 120 50t70.5 103.5t30.5 115t8 110.5v1239h135v-1239q0 -82 -16.5 -159t-50 -147.5t-95 -118.5t-143.5 -60z" /> +<glyph unicode="K" horiz-adv-x="1155" d="M211 0v1366h135v-594h25l577 594h172l-633 -641l658 -725h-182l-592 659h-25v-659h-135z" /> +<glyph unicode="L" horiz-adv-x="1044" d="M211 0v1366h135v-1253h668v-113h-803z" /> +<glyph unicode="M" horiz-adv-x="1755" d="M190 0l48 1366h192l442 -1192l449 1192h195l49 -1366h-131l-43 1196l-461 -1196h-111l-461 1210l-36 -1210h-132z" /> +<glyph unicode="N" horiz-adv-x="1529" d="M211 0v1366h133l844 -1167v1167h131v-1366h-133l-844 1149v-1149h-131z" /> +<glyph unicode="O" horiz-adv-x="1624" d="M111 680q0 289 194.5 500t517.5 211q305 0 497.5 -196t192.5 -486q0 -299 -200.5 -516.5t-507.5 -217.5q-301 0 -497.5 206t-196.5 499zM256 694q0 -147 62.5 -282.5t193.5 -227.5t299 -92q250 0 402.5 182.5t152.5 418t-150.5 408.5t-404.5 173q-252 0 -403.5 -175.5 t-151.5 -404.5z" /> +<glyph unicode="P" horiz-adv-x="1138" d="M211 0v1366h367q248 0 364.5 -109.5t116.5 -281.5q0 -201 -131 -314.5t-350 -113.5h-232v-547h-135zM346 659h205q182 0 272 78t90 224q0 131 -87 211.5t-275 80.5h-205v-594z" /> +<glyph unicode="Q" horiz-adv-x="1624" d="M115 680q0 186 80.5 346t244.5 262.5t377 102.5q309 0 504 -196t195 -486q0 -252 -148.5 -452t-390.5 -261q55 -74 93 -116t106.5 -104.5t149.5 -93t173 -32.5l-18 -125h-15q-68 0 -133 16q-72 18 -122 45t-103 72t-80 72.5t-65.5 73.5t-44.5 55l-62 71q-35 43 -119 47 q-276 25 -449 227t-173 476zM260 694q0 -150 61.5 -284t190.5 -225t299 -91q248 0 403.5 183.5t155.5 416.5q0 229 -150.5 404.5t-404.5 175.5q-168 0 -298 -86t-193.5 -217.5t-63.5 -276.5z" /> +<glyph unicode="R" horiz-adv-x="1189" d="M211 0v1366h326q246 0 363.5 -103.5t117.5 -256.5q0 -139 -89 -236.5t-210 -148.5l424 -621h-160l-410 596h-227v-596h-135zM346 711h238q100 0 193 75.5t93 202.5q0 113 -87 188.5t-273 75.5h-164v-542z" /> +<glyph unicode="S" horiz-adv-x="1038" d="M104 90l35 131q18 -14 51 -34.5t127.5 -55.5t184.5 -35q127 0 210 57.5t83 159.5q0 92 -69 163t-166 121l-194 104q-97 54 -166 141.5t-69 204.5q0 152 115.5 248t318.5 96q178 0 340 -62l-43 -129q-147 70 -305 70q-129 0 -210 -53.5t-81 -153.5q0 -94 68.5 -165 t166.5 -121l194 -103q97 -53 166 -141.5t69 -208.5q0 -168 -124 -258.5t-314 -90.5q-104 0 -200.5 29t-141.5 57z" /> +<glyph unicode="T" horiz-adv-x="1206" d="M35 1253v113h1136v-113h-507v-1253h-134v1253h-495z" /> +<glyph unicode="U" horiz-adv-x="1476" d="M193 485v881h133v-846q0 -215 113.5 -321.5t299.5 -106.5q184 0 298 103.5t114 310.5v860h133v-852q0 -256 -153.5 -397.5t-393.5 -141.5q-244 0 -394 124t-150 386z" /> +<glyph unicode="V" horiz-adv-x="1193" d="M35 1366h141l422 -1182l424 1182h137l-497 -1376h-132z" /> +<glyph unicode="W" horiz-adv-x="1916" d="M55 1366h138l354 -1180l336 1180h157l332 -1176l359 1176h133l-422 -1376h-137l-344 1173l-347 -1173h-137z" /> +<glyph unicode="X" horiz-adv-x="1191" d="M57 0l461 680l-461 686h160l381 -580l381 580h154l-459 -682l459 -684h-158l-381 580l-383 -580h-154z" /> +<glyph unicode="Y" horiz-adv-x="1153" d="M23 1366h159l398 -635l401 635h149l-485 -762v-604h-135v602z" /> +<glyph unicode="Z" horiz-adv-x="1183" d="M74 0v74l831 1179h-778v113h954v-74l-821 -1179h830v-113h-1016z" /> +<glyph unicode="[" horiz-adv-x="585" d="M182 -313v1679h361v-100h-246v-1477h246v-102h-361z" /> +<glyph unicode="\" horiz-adv-x="927" d="M70 1366h127l682 -1767h-129z" /> +<glyph unicode="]" horiz-adv-x="587" d="M43 -205h246v1462h-246v109h363v-1679h-363v108z" /> +<glyph unicode="^" horiz-adv-x="1028" d="M33 512l438 879h88l438 -879h-145l-340 682l-340 -682h-139z" /> +<glyph unicode="_" horiz-adv-x="1110" d="M43 -76h1024v-114h-1024v114z" /> +<glyph unicode="`" horiz-adv-x="1028" d="M338 1425h154l206 -342l-84 -49z" /> +<glyph unicode="a" horiz-adv-x="944" d="M80 201q0 279 557 354v61q0 39 -1 61.5t-10.5 53.5t-25.5 48.5t-47 29.5t-76 12q-152 -2 -287 -98l-45 111q16 12 47 30.5t127.5 48t192.5 29.5q133 0 191.5 -67.5t58.5 -221.5v-436q0 -55 25.5 -87t52.5 -36l24 -4l-47 -104q-84 14 -123 52t-51 101q-18 -25 -43 -52.5 t-103.5 -69.5t-164.5 -42q-115 0 -183.5 63t-68.5 163zM219 209q0 -111 131 -111q59 0 117.5 31t90.5 60.5t79 80.5v179q-217 -37 -317.5 -93.5t-100.5 -146.5z" /> +<glyph unicode="b" horiz-adv-x="1056" d="M162 16v1420l125 24v-651q35 51 110.5 92t169.5 41q172 0 281.5 -129t109.5 -328q0 -215 -130 -359t-379 -151h-10q-107 0 -277 41zM287 115q68 -25 164 -25q168 0 270 101.5t102 285.5q0 160 -73.5 253t-194.5 93q-154 0 -268 -143v-565z" /> +<glyph unicode="c" horiz-adv-x="925" d="M98 446.5q0 200.5 121 348t332 147.5q86 0 159.5 -25.5t104.5 -52.5l31 -24l-66 -103q-10 10 -30.5 24.5t-82 38t-124.5 23.5q-143 0 -227.5 -106.5t-84.5 -255.5q0 -154 86 -260.5t232 -106.5q68 0 130 24.5t91 49.5l29 27l47 -101q-12 -12 -37 -32.5t-106.5 -53.5 t-170.5 -33q-193 0 -313.5 135.5t-120.5 336z" /> +<glyph unicode="d" horiz-adv-x="1085" d="M100 428q0 213 134.5 363.5t369.5 150.5q111 0 187 -33v527l124 24v-1175q0 -49 10.5 -121t20.5 -119l10 -45l-129 -14q-18 88 -28 153q-43 -70 -124 -117t-183 -47q-172 0 -282 130t-110 323zM236 438q0 -158 76.5 -250t191.5 -92q162 0 287 187v397q0 147 -187 147 q-164 0 -266 -104.5t-102 -284.5z" /> +<glyph unicode="e" horiz-adv-x="993" d="M100 434q0 221 122 364.5t313 143.5q160 0 259 -105.5t99 -289.5l-84 -25l-571 -73q8 -162 92 -258.5t227 -96.5q72 0 144.5 29t109.5 57l39 31l39 -107q-14 -14 -41 -35.5t-116 -57.5t-183 -36q-215 0 -332 134.5t-117 324.5zM244 561l510 66q0 8 -3 21.5t-18.5 49 t-38 62t-66.5 48t-100 21.5q-115 0 -189.5 -74.5t-94.5 -193.5z" /> +<glyph unicode="f" horiz-adv-x="647" d="M61 809v63l146 58v104q0 215 95 333t263 118q66 0 127.5 -19.5t89.5 -38.5l31 -18l-68 -104q-94 66 -188 65q-96 0 -160.5 -81t-64.5 -249v-122h264v-109h-264v-809h-125v809h-146z" /> +<glyph unicode="g" horiz-adv-x="1017" d="M63 -236q0 168 246 281q-154 45 -153 127q0 31 25.5 63.5t46.5 48.5l63 44q-82 43 -128 120.5t-46 172.5q0 145 107.5 233t258.5 88q57 0 137 -19.5t130 -19.5h90q25 0 55.5 5t46.5 10l19 6l14 -129h-123q-57 0 -72 2q68 -76 68 -195q0 -150 -117 -233.5t-260 -83.5 q-49 0 -82 8q-90 -66 -90 -94q0 -31 53.5 -48.5t179.5 -41.5q23 -4 35 -7q84 -16 136.5 -31.5t110.5 -43t86 -71.5t28 -103q0 -141 -144.5 -239.5t-339.5 -98.5q-156 0 -268.5 65t-112.5 184zM184 -221q0 -86 87 -124t188 -38q135 0 234.5 66.5t99.5 152.5q0 66 -59.5 99.5 t-168.5 56.5q-90 16 -137 26q-78 -41 -121 -67.5t-83 -73.5t-40 -98zM254 612q0 -94 58.5 -158.5t170.5 -64.5q100 0 165 53.5t65 149.5t-61.5 171t-174.5 75q-100 0 -161.5 -64t-61.5 -162z" /> +<glyph unicode="h" horiz-adv-x="1075" d="M166 0v1436l125 24v-710q199 193 391 192q106 0 172 -64.5t66 -205.5v-672h-125v649q0 180 -138 180q-141 0 -366 -208v-621h-125z" /> +<glyph unicode="i" horiz-adv-x="454" d="M133 1262q0 41 30 69.5t68.5 28.5t67.5 -30t29 -68q0 -41 -29 -71t-67.5 -30t-68.5 30t-30 71zM166 0v918h125v-918h-125z" /> +<glyph unicode="j" horiz-adv-x="454" d="M-47 -375q213 45 213 342v951h125v-912q0 -231 -72 -348t-225 -143zM131 1262q0 41 28.5 69.5t69.5 28.5q39 0 68 -30t29 -68q0 -41 -29 -71t-68 -30t-68.5 30t-29.5 71z" /> +<glyph unicode="k" horiz-adv-x="931" d="M166 0v1436l125 24v-909h18l387 367h172l-442 -408l489 -510h-172l-432 457h-20v-457h-125z" /> +<glyph unicode="l" horiz-adv-x="454" d="M166 0v1436l125 24v-1460h-125z" /> +<glyph unicode="m" horiz-adv-x="1638" d="M162 0v905l125 25v-187q215 199 385 199q178 0 215 -180q188 180 373 180q98 0 160.5 -65.5t62.5 -204.5v-672h-125v649q0 180 -121 180q-131 0 -342 -188v-641h-125v649q0 180 -123 180q-59 0 -142 -47t-131 -88t-87 -80v-614h-125z" /> +<glyph unicode="n" d="M162 0v905l125 25v-187q215 199 395 199q104 0 170 -65.5t66 -204.5v-672h-125v649q0 180 -136 180q-88 0 -194.5 -72.5t-175.5 -142.5v-614h-125z" /> +<glyph unicode="o" d="M98 463q0 193 119 336t317.5 143t319.5 -140t121 -335t-120 -343.5t-320 -148.5q-197 0 -317 146.5t-120 341.5zM231 475q0 -156 80 -269.5t226 -113.5q135 0 220 100.5t85 260.5q0 154 -78 263t-229 109q-139 0 -221.5 -97t-82.5 -253z" /> +<glyph unicode="p" horiz-adv-x="1062" d="M162 -473v1378l123 25v-142q37 66 111.5 110t176.5 44q176 0 283 -131t107 -326q0 -217 -129 -363.5t-336 -146.5q-133 0 -211 64v-488zM287 227q2 -66 57 -101.5t143 -35.5q154 0 247 104.5t93 280.5q0 158 -74.5 250t-189.5 92q-162 0 -276 -162v-428z" /> +<glyph unicode="q" horiz-adv-x="1056" d="M98 430q0 213 133.5 362.5t378.5 149.5q63 0 134 -10t112 -21l39 -10v-1350l-125 -24v586q-33 -53 -106.5 -95.5t-171.5 -42.5q-174 0 -284 128t-110 327zM233 438q0 -156 76 -250t195 -94q156 0 266 146v565q-74 23 -172 22q-162 0 -263.5 -102.5t-101.5 -286.5z" /> +<glyph unicode="r" horiz-adv-x="661" d="M162 0v905l125 25v-185q117 197 268 197q23 0 43 -4t29 -8l8 -6l-39 -138q-37 14 -76 15q-119 0 -233 -209v-592h-125z" /> +<glyph unicode="s" horiz-adv-x="790" d="M92 57l29 117q119 -88 266 -88q88 0 135 37t47 100q0 61 -47 105.5t-114.5 74t-135 63.5t-114.5 93t-47 141q0 109 79.5 175.5t237.5 66.5q66 0 128 -12t91 -25l29 -14l-39 -109q-113 49 -225 49q-84 0 -128 -32.5t-44 -87.5q0 -57 47 -99.5t114.5 -72t135 -64.5 t114.5 -96.5t47 -147.5q0 -121 -87 -188.5t-234 -67.5q-174 2 -285 82z" /> +<glyph unicode="t" horiz-adv-x="714" d="M74 809v68l125 53v200l125 35v-247h305v-109h-305v-541q0 -96 29.5 -137t88.5 -41q45 0 95.5 21.5t76.5 44.5l29 20l31 -110q-12 -10 -34 -25.5t-88.5 -40.5t-131.5 -25q-221 0 -221 263v571h-125z" /> +<glyph unicode="u" horiz-adv-x="1054" d="M152 250v668h124v-650q0 -180 144 -180q145 0 340 188v642h125v-633q0 -49 10 -121t20 -119l11 -47l-125 -10q-23 100 -31 166q-178 -178 -371 -179q-247 1 -247 275z" /> +<glyph unicode="v" horiz-adv-x="919" d="M45 918h133l258 -764l316 764h133l-396 -930h-122z" /> +<glyph unicode="w" horiz-adv-x="1499" d="M49 918h133l234 -773l282 773h119l221 -773l291 773h135l-377 -930h-120l-224 741l-280 -741h-121z" /> +<glyph unicode="x" horiz-adv-x="915" d="M66 0l315 459l-315 459h153l240 -361l241 361h150l-315 -455l315 -463h-145l-250 371l-250 -371h-139z" /> +<glyph unicode="y" horiz-adv-x="921" d="M41 918h137l289 -672l278 672h138l-422 -988q-80 -188 -161 -293.5t-208 -121.5l-41 110q94 18 158.5 93t122.5 206l69 158z" /> +<glyph unicode="z" horiz-adv-x="876" d="M88 0v76l508 731h-492v111h666v-74l-514 -731h535v-113h-703z" /> +<glyph unicode="{" horiz-adv-x="698" d="M37 485v105q55 2 99 23.5t72 50t48 82t29.5 95.5t14.5 113.5t6 114.5t1 121q0 166 111.5 247t298.5 81v-95q-70 -6 -117 -14t-80 -30.5t-49 -41t-25.5 -65.5t-11.5 -81t-4 -110q-6 -260 -59.5 -376.5t-161.5 -163.5v-4q104 -47 159.5 -172t61.5 -392q2 -74 4 -108.5 t11.5 -80.5t26.5 -65.5t49 -41t79 -30.5t117 -16v-94q-244 0 -327 95.5t-83 336.5q0 117 -13 207t-39 143.5t-51.5 89t-60 51t-56 19.5t-50.5 6z" /> +<glyph unicode="|" horiz-adv-x="475" d="M180 -461v1995h115v-1995h-115z" /> +<glyph unicode="}" horiz-adv-x="698" d="M-18 -369q59 4 102 14.5t74.5 20.5t51 35t31 42t17.5 61t7 74t3 95q6 266 61.5 391t159.5 173v4q-106 47 -160.5 159.5t-60.5 380.5q-2 74 -4 109t-11 81t-26.5 65.5t-49.5 42t-79 30.5t-116 14v95q229 0 319 -93.5t90 -349.5q0 -131 22.5 -227t50.5 -143.5t72 -75 t68.5 -32.5t59.5 -7v-105q-51 -2 -91.5 -19t-85.5 -66.5t-70.5 -159t-25.5 -273.5q0 -240 -82 -335t-327 -95v94z" /> +<glyph unicode="~" horiz-adv-x="1191" d="M137 362q0 309 260 310q80 0 142.5 -32t94.5 -68.5t76 -68.5t93 -32q137 0 137 193h119q0 -309 -260 -310q-80 0 -142.5 32t-94.5 69t-76 68.5t-93 31.5q-137 0 -137 -193h-119z" /> +<glyph unicode="¡" horiz-adv-x="503" d="M137 831.5q0 45.5 32 78t79 32.5t78.5 -32.5t31.5 -78t-31.5 -78t-78.5 -32.5t-79 32.5t-32 78zM174 -473l21 1010h118l15 -1010h-154z" /> +<glyph unicode="¢" horiz-adv-x="903" d="M90 569.5q0 157.5 92 280.5t254 147l4 181h88l-4 -174q176 -6 275 -115l8 -10l-80 -97q-8 10 -24.5 24.5t-70.5 42.5t-112 34l-14 -627h4q68 0 130 25.5t91 50.5l29 24l47 -100q-12 -12 -35.5 -32.5t-101.5 -53.5t-162 -33h-4l-4 -182h-86l4 190q-150 31 -239 149 t-89 275.5zM229 575q0 -109 50.5 -191.5t140.5 -113.5l14 609q-96 -23 -150.5 -108t-54.5 -196z" /> +<glyph unicode="£" horiz-adv-x="1091" d="M84 104q6 2 14 5.5t31 17.5t41 33.5t35.5 54.5t23.5 76l25 198h-127v97h139l23 172q23 188 102.5 291.5t243.5 103.5q182 0 291 -113l8 -10l-80 -96q-8 10 -25.5 27.5t-77 45t-124.5 27.5q-90 0 -143.5 -61.5t-69.5 -220.5l-19 -166h398l-11 -97h-395q-10 -98 -28.5 -187 t-32.5 -128l-15 -39q217 -70 344 -69q197 0 222 190l8 66h110q-35 -373 -313 -373q-80 0 -235.5 39t-200.5 39q-53 0 -121 -27z" /> +<glyph unicode="¥" horiz-adv-x="1130" d="M84 1128h152l329 -512l336 512h139l-313 -479h215v-98h-280l-35 -55v-80h315v-99h-315v-317h-125v317h-295v99h295v78l-39 57h-256v98h192z" /> +<glyph unicode="¦" horiz-adv-x="516" d="M193 350h133v-733h-133v733zM193 668v733h133v-733h-133z" /> +<glyph unicode="§" horiz-adv-x="999" d="M57 -379l62 94q127 -96 264 -96q127 0 195.5 93t68.5 241q0 59 -12 125l-115 631q-23 131 -22 204q0 135 53 213l102 -22q-35 -76 -35 -189q0 -53 11 -114l125 -707q12 -70 12 -139q0 -190 -96.5 -315t-282.5 -125q-176 0 -324 102zM205 948q0 190 96 316.5t285 126.5 q84 0 166 -27t120 -53l41 -27l-61 -94q-125 96 -262 96q-129 0 -197.5 -94t-68.5 -242q0 -61 12 -123l115 -630q20 -119 20 -205q0 -137 -51 -213l-103 22q35 82 35 189q0 53 -10 114l-125 707q-12 69 -12 137z" /> +<glyph unicode="¨" horiz-adv-x="1028" d="M246 1261.5q0 36.5 29.5 65.5t66.5 29q35 0 63.5 -29t28.5 -65.5t-28.5 -65.5t-63.5 -29q-37 0 -66.5 29t-29.5 65.5zM590 1261.5q0 36.5 29.5 65.5t64.5 29q37 0 65.5 -29t28.5 -65.5t-28.5 -65.5t-65.5 -29q-35 0 -64.5 29t-29.5 65.5z" /> +<glyph unicode="©" horiz-adv-x="1601" d="M94 682q0 293 207 500t500 207t499.5 -207t206.5 -500t-206.5 -500t-499.5 -207t-500 207t-207 500zM195 682q0 -256 176 -436t430 -180t430 180t176 436t-176 436t-430 180t-430 -180t-176 -436zM406 674q0 174 110.5 301t306.5 127q172 0 285 -113l10 -10l-92 -107 q-8 10 -25.5 26.5t-72 43.5t-111.5 27q-113 0 -181.5 -83t-68.5 -200t77 -197.5t202 -80.5q59 0 112.5 24.5t77.5 48.5l23 25l55 -113q-10 -12 -31.5 -32.5t-96.5 -53.5t-161 -33q-184 0 -301.5 116t-117.5 284z" /> +<glyph unicode="ª" horiz-adv-x="786" d="M104 872q0 207 392 261v28q0 47 -4.5 70.5t-29 44t-71.5 20.5q-49 0 -101 -19.5t-81 -39.5l-27 -20l-32 98q109 76 272 76q104 0 146 -46.5t42 -156.5v-293q8 -74 74 -82l-37 -94q-121 6 -145 104q-88 -111 -221 -110q-80 0 -128.5 43.5t-48.5 115.5zM229 879 q0 -72 76 -72q39 0 79 23.5t59.5 44t52.5 61.5v111q-141 -27 -204 -67t-63 -101z" /> +<glyph unicode="«" horiz-adv-x="1046" d="M55 510v8q35 27 281 295l123 133l98 -26l-313 -406l313 -405l-98 -27l-170 182l-112 121l-61 66l-38 38q-11 11 -23 21zM442 510v8q35 27 281 295l123 133l100 -26l-315 -406l315 -405l-100 -27l-170 182l-112 121l-61 66l-38 38q-11 11 -23 21z" /> +<glyph unicode="¬" horiz-adv-x="1181" d="M115 670v123h936v-566h-131v443h-805z" /> +<glyph unicode="­" horiz-adv-x="669" d="M117 438v142h434v-142h-434z" /> +<glyph unicode="®" horiz-adv-x="890" d="M92 1087.5q0 145.5 104.5 250t250 104.5t250 -104.5t104.5 -250t-104.5 -250t-250 -104.5t-250 104.5t-104.5 250zM160 1087.5q0 -120.5 83 -208.5t199 -88q119 0 205 88t86 208.5t-86 207.5t-205 87q-117 0 -199.5 -87t-82.5 -207.5zM315 918v348h123q143 0 144 -105 q0 -70 -72 -100l104 -143h-90l-88 126h-41v-126h-80zM395 1098h49q53 0 54 55q0 57 -68 57h-35v-112z" /> +<glyph unicode="¯" horiz-adv-x="1028" d="M291 1212v113h446v-113h-446z" /> +<glyph unicode="°" horiz-adv-x="692" d="M96 1144.5q0 102.5 73 174.5t177.5 72t177 -72t72.5 -174.5t-72.5 -174t-177 -71.5t-177.5 71.5t-73 174zM193 1144.5q0 -65.5 44 -110.5t109 -45q63 0 107.5 45t44.5 110.5t-44 112t-107.5 46.5t-108.5 -46.5t-45 -112z" /> +<glyph unicode="±" horiz-adv-x="1064" d="M70 0v121h925v-121h-925zM74 647v121h389v375h131v-375h397v-121h-397v-411h-131v411h-389z" /> +<glyph unicode="²" horiz-adv-x="692" d="M57 819l86 86q59 59 84 86l70 75q45 48 64 78l45 69q25 40 34 75t9 70q0 72 -40 111.5t-100 39.5q-41 0 -83 -19.5t-64 -39.5l-23 -18l-63 71q10 12 31.5 30.5t89 48.5t139.5 30q113 0 174 -69.5t61 -166.5q0 -104 -80.5 -225t-248.5 -283h391v-98h-565z" /> +<glyph unicode="³" horiz-adv-x="655" d="M53 815l47 90q78 -47 174 -47q78 0 125 35t47 96q0 70 -63.5 108t-157.5 38h-39v96q84 8 154 58t70 126q0 96 -111 96q-90 0 -164 -55l-47 78q100 78 219 78q96 0 160.5 -51.5t64.5 -133.5q0 -121 -165 -213q92 -20 147 -80.5t55 -138.5q0 -102 -88 -170.5t-213 -68.5 q-129 0 -215 59z" /> +<glyph unicode="´" horiz-adv-x="1017" d="M330 1083l205 342h155l-276 -391z" /> +<glyph unicode="µ" horiz-adv-x="1128" d="M152 -442q20 199 20 362v998h125v-650q0 -180 143 -180q152 0 340 188v642h125v-703q0 -82 24.5 -107.5t108.5 -25.5v-96q-55 -10 -88 -11q-88 0 -126 46.5t-44 130.5q-176 -176 -360 -177q-76 0 -127 25q2 -90 7 -248t5 -194h-153z" /> +<glyph unicode="μ" horiz-adv-x="1128" d="M152 -442q20 199 20 362v998h125v-650q0 -180 143 -180q152 0 340 188v642h125v-703q0 -82 24.5 -107.5t108.5 -25.5v-96q-55 -10 -88 -11q-88 0 -126 46.5t-44 130.5q-176 -176 -360 -177q-76 0 -127 25q2 -90 7 -248t5 -194h-153z" /> +<glyph unicode="¶" horiz-adv-x="1343" d="M72 864q0 203 154.5 352.5t430.5 149.5h582v-111h-152v-1255h-118v1255h-154v-1296q0 -444 -352 -444l-31 123q133 0 193.5 73.5t60.5 241.5v414h-18q-291 0 -443.5 145t-152.5 352z" /> +<glyph unicode="·" horiz-adv-x="505" d="M143 520q0 45 33 77t78 32t76.5 -32t31.5 -77t-31.5 -77.5t-76.5 -32.5t-78 32.5t-33 77.5z" /> +<glyph unicode="¸" horiz-adv-x="1028" d="M338 -422l41 96q66 -57 139 -57q45 0 77 21.5t32 50.5q0 25 -26 43t-56.5 29.5t-56 34t-25.5 52.5q0 16 6 35t17.5 45.5t13.5 32.5l16 39h96l-16 -33q-25 -59 -25 -71q0 -23 27 -42.5t59.5 -33t59 -44t26.5 -73.5q0 -74 -63.5 -131t-155.5 -57q-104 0 -186 63z" /> +<glyph unicode="¹" horiz-adv-x="550" d="M70 770v90h166v647h-154v90h274v-737h158v-90h-444z" /> +<glyph unicode="º" horiz-adv-x="835" d="M94 1047q0 133 89 238.5t237 105.5q141 0 229 -97.5t88 -228.5q0 -135 -86 -243.5t-237 -108.5q-143 0 -231.5 101.5t-88.5 232.5zM215 1061q0 -104 52 -179t151 -75q88 0 143 66.5t55 173.5q0 102 -50 175.5t-150 73.5q-92 0 -146.5 -64.5t-54.5 -170.5z" /> +<glyph unicode="»" horiz-adv-x="1050" d="M104 109l316 405l-316 406l101 26q362 -395 403 -428v-8q-10 -8 -21.5 -18.5l-24.5 -23.5t-43 -46l-64 -71l-104 -111l-146 -158zM492 109l315 405l-315 406l100 26q367 -397 393 -420q4 -4 10 -8v-8q-12 -10 -22 -21l-38 -38l-62 -66l-111 -121l-170 -182z" /> +<glyph unicode="¼" horiz-adv-x="1646" d="M98 553v90h166v647h-153v90h274v-737h158v-90h-445zM332 0l811 1403l104 -37l-784 -1366h-131zM936 289l418 545h90v-512h127v-95h-127v-227h-117v227h-383zM1073 322h254v329z" /> +<glyph unicode="½" horiz-adv-x="1779" d="M96 553v90h166v647h-153v90h274v-737h158v-90h-445zM317 0l811 1403l105 -37l-784 -1366h-132zM1130 49l87 86q59 59 83 86l70 75q45 48 65 78l44 69q25 40 34 75t9 70q0 72 -40 111.5t-100 39.5q-41 0 -83 -19.5t-64 -39.5l-23 -18l-63 71q10 12 31.5 30.5t89 48.5 t139.5 30q113 0 174.5 -70t61.5 -166q0 -104 -81 -225t-249 -283h391v-98h-565z" /> +<glyph unicode="¾" horiz-adv-x="1611" d="M86 598l47 90q78 -47 174 -47q78 0 125 35t47 96q0 70 -63.5 108t-157.5 38h-39v96q84 8 153.5 58t69.5 126q0 96 -110 96q-90 0 -164 -55l-47 78q100 78 219 78q96 0 160.5 -51.5t64.5 -133.5q0 -121 -166 -213q92 -20 147.5 -80.5t55.5 -138.5q0 -102 -88 -170.5 t-213 -68.5q-129 0 -215 59zM295 0l811 1403l104 -37l-784 -1366h-131zM901 289l418 545h90v-512h127v-95h-127v-227h-117v227h-383zM1038 322h254v329z" /> +<glyph unicode="¿" horiz-adv-x="694" d="M74 -104q0 49 33.5 101t82 103.5t96.5 109.5t81.5 143t33.5 184h103q6 -29 6 -76q0 -94 -44 -184.5t-96.5 -147.5t-96.5 -118.5t-44 -102.5q0 -66 96.5 -134.5t190.5 -103.5l96 -35l-28 -122l-56 17q-35 11 -123 50t-154.5 81t-121.5 105.5t-55 129.5zM334 831.5 q0 45.5 31.5 78t79 32.5t79 -32.5t31.5 -78t-31.5 -78t-79 -32.5t-79 32.5t-31.5 78z" /> +<glyph unicode="À" horiz-adv-x="1255" d="M35 0l528 1376h129l529 -1376h-144l-170 449h-565l-170 -449h-137zM354 1624l60 133l379 -194l-35 -86zM385 563h479l-239 631z" /> +<glyph unicode="Á" horiz-adv-x="1255" d="M35 0l528 1376h129l529 -1376h-144l-170 449h-565l-170 -449h-137zM385 563h479l-239 631zM457 1563l377 194l61 -133l-403 -147z" /> +<glyph unicode="Â" horiz-adv-x="1255" d="M35 0l528 1376h129l529 -1376h-144l-170 449h-565l-170 -449h-137zM307 1544l258 240h121l256 -240l-78 -74l-237 211l-242 -211zM385 563h479l-239 631z" /> +<glyph unicode="Ã" horiz-adv-x="1255" d="M35 0l528 1376h129l529 -1376h-144l-170 449h-565l-170 -449h-137zM268 1505q0 18 5.5 46t22.5 76t64.5 81t116.5 33q66 0 116 -35t89 -68.5t82 -33.5q33 0 55.5 18t30.5 46t10 44.5t2 28.5h117q0 -8 -2 -22.5t-7 -45.5t-19.5 -59.5t-37 -56t-61.5 -44t-88 -16.5 q-53 0 -95 21.5t-65.5 47t-56.5 47t-65.5 21.5t-55.5 -18.5t-30 -46t-9 -40.5t-2 -24h-117zM385 563h479l-239 631z" /> +<glyph unicode="Ä" horiz-adv-x="1255" d="M35 0l528 1376h129l529 -1376h-144l-170 449h-565l-170 -449h-137zM305 1624q0 35 28.5 63.5t65.5 28.5q35 0 64 -28.5t29 -63.5q0 -37 -29 -65.5t-64 -28.5q-37 0 -65.5 27.5t-28.5 66.5zM385 563h479l-239 631zM760 1624q0 35 28.5 63.5t63.5 28.5q37 0 65.5 -28.5 t28.5 -63.5q0 -39 -28.5 -66.5t-65.5 -27.5q-35 0 -63.5 28.5t-28.5 65.5z" /> +<glyph unicode="Å" horiz-adv-x="1255" d="M35 0l528 1376h129l529 -1376h-144l-170 449h-565l-170 -449h-137zM385 563h479l-239 631zM436 1622q0 66 49.5 114t139.5 48t139 -48t49 -114q0 -68 -49 -116t-139 -48t-139.5 48t-49.5 116zM526 1620q0 -39 26 -67.5t73 -28.5t73.5 28.5t26.5 67.5q0 41 -25.5 69.5 t-75 28.5t-74 -28.5t-24.5 -69.5z" /> +<glyph unicode="Æ" horiz-adv-x="1740" d="M2 0l760 1366h870v-113h-651v-497h516v-113h-516v-530h643v-113h-776v485h-434l-269 -485h-143zM475 598h373v672z" /> +<glyph unicode="Ç" horiz-adv-x="1384" d="M113 678q0 303 199.5 508t523.5 205q115 0 226.5 -30t164.5 -58l53 -31l-55 -125q-18 14 -53 35.5t-140.5 57.5t-210.5 36q-137 0 -247.5 -52.5t-177 -138.5t-101.5 -188t-35 -211q0 -244 160 -420t409 -176q207 0 396 131l14 10l55 -102q-8 -6 -23.5 -16.5t-64.5 -37 t-101 -47t-132 -37t-158 -16.5h-10l-4 -8q-25 -59 -25 -71q0 -23 26.5 -42.5t59.5 -33t59.5 -44t26.5 -73.5q0 -74 -63.5 -131t-155.5 -57q-104 0 -186 63l41 96q66 -57 139 -57q45 0 76.5 21.5t31.5 50.5q0 25 -25.5 43t-56 29.5t-56 34t-25.5 52.5q0 16 6 35t17 45.5 t14 32.5l8 23q-266 33 -433 225.5t-167 468.5z" /> +<glyph unicode="È" horiz-adv-x="1103" d="M211 0v1366h784v-113h-649v-497h514v-113h-514v-530h641v-113h-776zM346 1624l60 133l378 -194l-34 -86z" /> +<glyph unicode="É" horiz-adv-x="1103" d="M211 0v1366h784v-113h-649v-497h514v-113h-514v-530h641v-113h-776zM449 1563l376 194l62 -133l-404 -147z" /> +<glyph unicode="Ê" horiz-adv-x="1103" d="M211 0v1366h784v-113h-649v-497h514v-113h-514v-530h641v-113h-776zM299 1544l258 240h121l256 -240l-78 -74l-238 211l-241 -211z" /> +<glyph unicode="Ë" horiz-adv-x="1103" d="M211 0v1366h784v-113h-649v-497h514v-113h-514v-530h641v-113h-776zM297 1624q0 35 28.5 63.5t65.5 28.5q35 0 63.5 -28.5t28.5 -63.5q0 -37 -28.5 -65.5t-63.5 -28.5q-37 0 -65.5 27.5t-28.5 66.5zM752 1624q0 35 28.5 63.5t63.5 28.5q37 0 65.5 -28.5t28.5 -63.5 q0 -39 -28.5 -66.5t-65.5 -27.5q-35 0 -63.5 28.5t-28.5 65.5z" /> +<glyph unicode="Ì" horiz-adv-x="557" d="M8 1624l60 133l378 -194l-34 -86zM211 0v1366h135v-1366h-135z" /> +<glyph unicode="Í" horiz-adv-x="557" d="M111 1563l376 194l62 -133l-404 -147zM211 0v1366h135v-1366h-135z" /> +<glyph unicode="Î" horiz-adv-x="557" d="M-39 1544l258 240h121l256 -240l-78 -74l-237 211l-242 -211zM211 0v1366h135v-1366h-135z" /> +<glyph unicode="Ï" horiz-adv-x="557" d="M14 1622q0 37 30 65.5t67 28.5q35 0 63.5 -28.5t28.5 -65.5t-29 -65.5t-63 -28.5q-37 0 -67 28.5t-30 65.5zM211 0v1366h135v-1366h-135zM358 1622q0 37 30 65.5t65 28.5q37 0 65.5 -28.5t28.5 -65.5t-29 -65.5t-65 -28.5q-35 0 -65 28.5t-30 65.5z" /> +<glyph unicode="Ð" horiz-adv-x="1488" d="M76 633v119h147v614h387q147 0 278.5 -36t243 -111.5t177 -207.5t65.5 -306q0 -336 -230.5 -520.5t-611.5 -184.5h-309v633h-147zM356 113h156q373 0 543 156.5t170 414.5q0 264 -167 416.5t-476 152.5h-226v-501h365v-119h-365v-520z" /> +<glyph unicode="Ñ" horiz-adv-x="1529" d="M211 0v1366h133l844 -1167v1167h131v-1366h-133l-844 1149v-1149h-131zM408 1505q0 18 5 46t22.5 76t64.5 81t116 33q66 0 116 -35t89 -68.5t82 -33.5q33 0 55.5 18t30.5 46t10 44.5t2 28.5h117q0 -8 -2 -22.5t-7 -45.5t-19.5 -59.5t-37 -56t-61.5 -44t-88 -16.5 q-53 0 -95 21.5t-65.5 47t-56.5 47t-65.5 21.5t-55 -18.5t-30 -46t-9.5 -40.5t-2 -24h-116z" /> +<glyph unicode="Ò" horiz-adv-x="1624" d="M111 680q0 289 194.5 500t517.5 211q305 0 497.5 -196t192.5 -486q0 -299 -200.5 -516.5t-507.5 -217.5q-301 0 -497.5 206t-196.5 499zM256 694q0 -147 62.5 -282.5t193.5 -227.5t299 -92q250 0 402.5 182.5t152.5 418t-150.5 408.5t-404.5 173q-252 0 -403.5 -175.5 t-151.5 -404.5zM541 1624l59 133l379 -194l-35 -86z" /> +<glyph unicode="Ó" horiz-adv-x="1624" d="M111 680q0 289 194.5 500t517.5 211q305 0 497.5 -196t192.5 -486q0 -299 -200.5 -516.5t-507.5 -217.5q-301 0 -497.5 206t-196.5 499zM256 694q0 -147 62.5 -282.5t193.5 -227.5t299 -92q250 0 402.5 182.5t152.5 418t-150.5 408.5t-404.5 173q-252 0 -403.5 -175.5 t-151.5 -404.5zM643 1563l377 194l61 -133l-403 -147z" /> +<glyph unicode="Ô" horiz-adv-x="1624" d="M111 680q0 289 194.5 500t517.5 211q305 0 497.5 -196t192.5 -486q0 -299 -200.5 -516.5t-507.5 -217.5q-301 0 -497.5 206t-196.5 499zM256 694q0 -147 62.5 -282.5t193.5 -227.5t299 -92q250 0 402.5 182.5t152.5 418t-150.5 408.5t-404.5 173q-252 0 -403.5 -175.5 t-151.5 -404.5zM494 1544l258 240h120l256 -240l-77 -74l-238 211l-242 -211z" /> +<glyph unicode="Õ" horiz-adv-x="1624" d="M111 680q0 289 194.5 500t517.5 211q305 0 497.5 -196t192.5 -486q0 -299 -200.5 -516.5t-507.5 -217.5q-301 0 -497.5 206t-196.5 499zM256 694q0 -147 62.5 -282.5t193.5 -227.5t299 -92q250 0 402.5 182.5t152.5 418t-150.5 408.5t-404.5 173q-252 0 -403.5 -175.5 t-151.5 -404.5zM455 1505q0 18 5 46t22.5 76t64.5 81t117 33q66 0 115.5 -35t88.5 -68.5t82 -33.5q33 0 55.5 18t30.5 46t10.5 44.5t2.5 28.5h116q0 -8 -2 -22.5t-7 -45.5t-19.5 -59.5t-37 -56t-61.5 -44t-88 -16.5q-53 0 -95 21.5t-65.5 47t-56.5 47t-65.5 21.5t-55 -18.5 t-30 -46t-9.5 -40.5t-2 -24h-116z" /> +<glyph unicode="Ö" horiz-adv-x="1624" d="M111 680q0 289 194.5 500t517.5 211q305 0 497.5 -196t192.5 -486q0 -299 -200.5 -516.5t-507.5 -217.5q-301 0 -497.5 206t-196.5 499zM256 694q0 -147 62.5 -282.5t193.5 -227.5t299 -92q250 0 402.5 182.5t152.5 418t-150.5 408.5t-404.5 173q-252 0 -403.5 -175.5 t-151.5 -404.5zM492 1624q0 35 28.5 63.5t65.5 28.5q35 0 63.5 -28.5t28.5 -63.5q0 -37 -28.5 -65.5t-63.5 -28.5q-37 0 -65.5 27.5t-28.5 66.5zM946 1624q0 35 29 63.5t63 28.5q37 0 66 -28.5t29 -63.5q0 -39 -29 -66.5t-66 -27.5q-35 0 -63.5 28.5t-28.5 65.5z" /> +<glyph unicode="×" horiz-adv-x="1064" d="M86 137l363 373l-363 375l82 86l364 -375l365 375l82 -86l-365 -375l365 -373l-84 -86l-363 373l-362 -373z" /> +<glyph unicode="Ø" horiz-adv-x="1624" d="M111 680q0 289 194.5 500t517.5 211q211 0 381 -105l107 141h125l-152 -198q229 -197 229 -520q0 -299 -200.5 -516.5t-507.5 -217.5q-217 0 -387 115l-115 -151h-127l162 213q-227 204 -227 528zM256 694q0 -256 166 -434l700 922q-135 92 -311 92q-252 0 -403.5 -176.5 t-151.5 -403.5zM496 195q139 -102 315 -103q250 0 402.5 182.5t152.5 417.5q0 254 -166 424z" /> +<glyph unicode="Ù" horiz-adv-x="1476" d="M193 485v881h133v-846q0 -215 113.5 -321.5t299.5 -106.5q184 0 298 103.5t114 310.5v860h133v-852q0 -256 -153.5 -397.5t-393.5 -141.5q-244 0 -394 124t-150 386zM467 1624l59 133l379 -194l-35 -86z" /> +<glyph unicode="Ú" horiz-adv-x="1476" d="M193 485v881h133v-846q0 -215 113.5 -321.5t299.5 -106.5q184 0 298 103.5t114 310.5v860h133v-852q0 -256 -153.5 -397.5t-393.5 -141.5q-244 0 -394 124t-150 386zM569 1563l377 194l62 -133l-404 -147z" /> +<glyph unicode="Û" horiz-adv-x="1476" d="M193 485v881h133v-846q0 -215 113.5 -321.5t299.5 -106.5q184 0 298 103.5t114 310.5v860h133v-852q0 -256 -153.5 -397.5t-393.5 -141.5q-244 0 -394 124t-150 386zM420 1544l258 240h121l256 -240l-78 -74l-238 211l-241 -211z" /> +<glyph unicode="Ü" horiz-adv-x="1476" d="M193 485v881h133v-846q0 -215 113.5 -321.5t299.5 -106.5q184 0 298 103.5t114 310.5v860h133v-852q0 -256 -153.5 -397.5t-393.5 -141.5q-244 0 -394 124t-150 386zM418 1624q0 35 28.5 63.5t65.5 28.5q35 0 63.5 -28.5t28.5 -63.5q0 -37 -28.5 -65.5t-63.5 -28.5 q-37 0 -65.5 27.5t-28.5 66.5zM872 1624q0 35 29 63.5t64 28.5q37 0 65.5 -28.5t28.5 -63.5q0 -39 -29 -66.5t-65 -27.5q-35 0 -64 28.5t-29 65.5z" /> +<glyph unicode="Ý" horiz-adv-x="1153" d="M23 1366h159l398 -635l401 635h149l-485 -762v-604h-135v602zM424 1563l377 194l61 -133l-403 -147z" /> +<glyph unicode="Þ" horiz-adv-x="1132" d="M211 0v1366h135v-324h266q240 0 345.5 -98t105.5 -256q0 -184 -120 -286.5t-331 -102.5h-266v-299h-135zM346 412h240q332 0 332 262q0 256 -332 256h-240v-518z" /> +<glyph unicode="ß" horiz-adv-x="1134" d="M61 809v63l146 58v80q0 215 99.5 335.5t277.5 120.5q160 0 244.5 -86t84.5 -192q0 -57 -32.5 -116.5t-72.5 -101.5t-73 -101.5t-33 -114.5q0 -57 37 -108.5t90 -92.5l107 -83q53 -42 90 -102.5t37 -129.5q0 -119 -84 -191t-229 -72q-78 0 -149 20.5t-101 41.5l-33 22 l35 119q115 -92 254 -92q84 0 129 40t45 103q0 66 -56.5 126.5t-123 103.5t-123 116.5t-56.5 161.5q0 66 32 129.5t69 105.5t68.5 98t31.5 110q0 78 -59.5 122t-139.5 44q-106 0 -173.5 -80t-67.5 -248v-1018h-125v809h-146z" /> +<glyph unicode="à" horiz-adv-x="944" d="M80 201q0 279 557 354v61q0 39 -1 61.5t-10.5 53.5t-25.5 48.5t-47 29.5t-76 12q-152 -2 -287 -98l-45 111q16 12 47 30.5t127.5 48t192.5 29.5q133 0 191.5 -67.5t58.5 -221.5v-436q0 -55 25.5 -87t52.5 -36l24 -4l-47 -104q-84 14 -123 52t-51 101q-18 -25 -43 -52.5 t-103.5 -69.5t-164.5 -42q-115 0 -183.5 63t-68.5 163zM176 1425h154l207 -342l-84 -49zM219 209q0 -111 131 -111q59 0 117.5 31t90.5 60.5t79 80.5v179q-217 -37 -317.5 -93.5t-100.5 -146.5z" /> +<glyph unicode="á" horiz-adv-x="944" d="M80 201q0 279 557 354v61q0 39 -1 61.5t-10.5 53.5t-25.5 48.5t-47 29.5t-76 12q-152 -2 -287 -98l-45 111q16 12 47 30.5t127.5 48t192.5 29.5q133 0 191.5 -67.5t58.5 -221.5v-436q0 -55 25.5 -87t52.5 -36l24 -4l-47 -104q-84 14 -123 52t-51 101q-18 -25 -43 -52.5 t-103.5 -69.5t-164.5 -42q-115 0 -183.5 63t-68.5 163zM219 209q0 -111 131 -111q59 0 117.5 31t90.5 60.5t79 80.5v179q-217 -37 -317.5 -93.5t-100.5 -146.5zM381 1083l205 342h155l-276 -391z" /> +<glyph unicode="â" horiz-adv-x="944" d="M80 201q0 279 557 354v61q0 39 -1 61.5t-10.5 53.5t-25.5 48.5t-47 29.5t-76 12q-152 -2 -287 -98l-45 111q16 12 47 30.5t127.5 48t192.5 29.5q133 0 191.5 -67.5t58.5 -221.5v-436q0 -55 25.5 -87t52.5 -36l24 -4l-47 -104q-84 14 -123 52t-51 101q-18 -25 -43 -52.5 t-103.5 -69.5t-164.5 -42q-115 0 -183.5 63t-68.5 163zM184 1081l228 344h94l227 -344l-86 -49l-188 260l-189 -260zM219 209q0 -111 131 -111q59 0 117.5 31t90.5 60.5t79 80.5v179q-217 -37 -317.5 -93.5t-100.5 -146.5z" /> +<glyph unicode="ã" horiz-adv-x="944" d="M80 201q0 279 557 354v61q0 39 -1 61.5t-10.5 53.5t-25.5 48.5t-47 29.5t-76 12q-152 -2 -287 -98l-45 111q16 12 47 30.5t127.5 48t192.5 29.5q133 0 191.5 -67.5t58.5 -221.5v-436q0 -55 25.5 -87t52.5 -36l24 -4l-47 -104q-84 14 -123 52t-51 101q-18 -25 -43 -52.5 t-103.5 -69.5t-164.5 -42q-115 0 -183.5 63t-68.5 163zM174 1135q0 10 1 25.5t9.5 56t23.5 71.5t49 56.5t81 25.5t85 -24.5t57.5 -54t44 -54.5t48.5 -25q66 10 72 146h94q0 -10 -1 -26.5t-9 -58.5t-24.5 -75t-51.5 -59.5t-82 -26.5q-59 0 -101 40t-71.5 80t-60.5 40 t-48.5 -34t-19.5 -69l-2 -34h-94zM219 209q0 -111 131 -111q59 0 117.5 31t90.5 60.5t79 80.5v179q-217 -37 -317.5 -93.5t-100.5 -146.5z" /> +<glyph unicode="ä" horiz-adv-x="944" d="M80 201q0 279 557 354v61q0 39 -1 61.5t-10.5 53.5t-25.5 48.5t-47 29.5t-76 12q-152 -2 -287 -98l-45 111q16 12 47 30.5t127.5 48t192.5 29.5q133 0 191.5 -67.5t58.5 -221.5v-436q0 -55 25.5 -87t52.5 -36l24 -4l-47 -104q-84 14 -123 52t-51 101q-18 -25 -43 -52.5 t-103.5 -69.5t-164.5 -42q-115 0 -183.5 63t-68.5 163zM190 1261.5q0 36.5 30 65.5t67 29q35 0 63.5 -29t28.5 -65.5t-28.5 -65.5t-63.5 -29q-37 0 -67 29t-30 65.5zM219 209q0 -111 131 -111q59 0 117.5 31t90.5 60.5t79 80.5v179q-217 -37 -317.5 -93.5t-100.5 -146.5z M535 1261.5q0 36.5 29.5 65.5t64.5 29q37 0 65.5 -29t28.5 -65.5t-28.5 -65.5t-65.5 -29q-35 0 -64.5 29t-29.5 65.5z" /> +<glyph unicode="å" horiz-adv-x="944" d="M80 201q0 279 557 354v61q0 39 -1 61.5t-10.5 53.5t-25.5 48.5t-47 29.5t-76 12q-152 -2 -287 -98l-45 111q16 12 47 30.5t127.5 48t192.5 29.5q133 0 191.5 -67.5t58.5 -221.5v-436q0 -55 25.5 -87t52.5 -36l24 -4l-47 -104q-84 14 -123 52t-51 101q-18 -25 -43 -52.5 t-103.5 -69.5t-164.5 -42q-115 0 -183.5 63t-68.5 163zM219 209q0 -111 131 -111q59 0 117.5 31t90.5 60.5t79 80.5v179q-217 -37 -317.5 -93.5t-100.5 -146.5zM276 1266q0 68 46.5 113.5t136.5 45.5t136 -46t46 -113q0 -70 -46 -119t-136 -49t-136.5 49t-46.5 119z M365 1264q0 -39 22.5 -64.5t71.5 -25.5q47 0 71.5 26.5t24.5 63t-23.5 62.5t-72.5 26q-94 0 -94 -88z" /> +<glyph unicode="æ" horiz-adv-x="1538" d="M80 205q0 274 582 342v49q0 127 -33 176t-129 49q-74 0 -152 -24.5t-119 -48.5l-39 -25l-45 111q16 12 48 30.5t127.5 48t191.5 29.5q109 0 167 -38t81 -118q125 156 323 156q156 0 256.5 -105.5t98.5 -283.5l-84 -29l-574 -73q6 -156 92 -256.5t228 -100.5 q154 0 280 109l6 4l54 -94q-6 -6 -16.5 -15.5t-44 -33t-71.5 -42t-97.5 -33t-120.5 -14.5q-129 0 -228.5 60.5t-152.5 171.5q-41 -94 -128 -163t-221 -69q-121 0 -200.5 62t-79.5 168zM219 209q0 -53 40 -84t114 -31q125 0 200.5 91t75.5 253q-430 -65 -430 -229zM788 563 l510 68q0 8 -3 21.5t-18 47t-37.5 60t-68 48t-102.5 21.5q-113 0 -185.5 -72.5t-95.5 -193.5z" /> +<glyph unicode="ç" horiz-adv-x="925" d="M98 446q0 201 121 348.5t332 147.5q86 0 159.5 -25.5t104.5 -52.5l31 -24l-66 -103q-10 10 -30.5 24.5t-82 38t-124.5 23.5q-143 0 -227.5 -106.5t-84.5 -255.5q0 -154 86 -260.5t232 -106.5q68 0 130 24.5t91 49.5l29 27l47 -101q-12 -12 -37 -32.5t-106.5 -53.5 t-170.5 -33h-10l-4 -10q-25 -59 -24 -71q0 -23 26.5 -42.5t59 -33t59.5 -44t27 -73.5q0 -74 -63.5 -131t-156.5 -57q-104 0 -186 63l41 96q66 -57 139 -57q45 0 77 21.5t32 50.5q0 25 -25.5 43t-56.5 29.5t-56.5 34t-25.5 52.5q0 16 6 35t17.5 45.5t13.5 32.5l10 27 q-152 33 -243 160.5t-91 299.5z" /> +<glyph unicode="è" horiz-adv-x="993" d="M100 434q0 221 122 364.5t313 143.5q160 0 259 -105.5t99 -289.5l-84 -25l-571 -73q8 -162 92 -258.5t227 -96.5q72 0 144.5 29t109.5 57l39 31l39 -107q-14 -14 -41 -35.5t-116 -57.5t-183 -36q-215 0 -332 134.5t-117 324.5zM231 1425h154l207 -342l-84 -49zM244 561 l510 66q0 8 -3 21.5t-18.5 49t-38 62t-66.5 48t-100 21.5q-115 0 -189.5 -74.5t-94.5 -193.5z" /> +<glyph unicode="é" horiz-adv-x="993" d="M100 434q0 221 122 364.5t313 143.5q160 0 259 -105.5t99 -289.5l-84 -25l-571 -73q8 -162 92 -258.5t227 -96.5q72 0 144.5 29t109.5 57l39 31l39 -107q-14 -14 -41 -35.5t-116 -57.5t-183 -36q-215 0 -332 134.5t-117 324.5zM244 561l510 66q0 8 -3 21.5t-18.5 49 t-38 62t-66.5 48t-100 21.5q-115 0 -189.5 -74.5t-94.5 -193.5zM436 1083l205 342h156l-277 -391z" /> +<glyph unicode="ê" horiz-adv-x="993" d="M100 434q0 221 122 364.5t313 143.5q160 0 259 -105.5t99 -289.5l-84 -25l-571 -73q8 -162 92 -258.5t227 -96.5q72 0 144.5 29t109.5 57l39 31l39 -107q-14 -14 -41 -35.5t-116 -57.5t-183 -36q-215 0 -332 134.5t-117 324.5zM240 1081l227 344h94l227 -344l-86 -49 l-188 260l-188 -260zM244 561l510 66q0 8 -3 21.5t-18.5 49t-38 62t-66.5 48t-100 21.5q-115 0 -189.5 -74.5t-94.5 -193.5z" /> +<glyph unicode="ë" horiz-adv-x="993" d="M100 434q0 221 122 364.5t313 143.5q160 0 259 -105.5t99 -289.5l-84 -25l-571 -73q8 -162 92 -258.5t227 -96.5q72 0 144.5 29t109.5 57l39 31l39 -107q-14 -14 -41 -35.5t-116 -57.5t-183 -36q-215 0 -332 134.5t-117 324.5zM244 561l510 66q0 8 -3 21.5t-18.5 49 t-38 62t-66.5 48t-100 21.5q-115 0 -189.5 -74.5t-94.5 -193.5zM246 1261.5q0 36.5 29.5 65.5t66.5 29q35 0 63.5 -29t28.5 -65.5t-28.5 -65.5t-63.5 -29q-37 0 -66.5 29t-29.5 65.5zM590 1261.5q0 36.5 29.5 65.5t64.5 29q37 0 65.5 -29t28.5 -65.5t-28.5 -65.5t-65.5 -29 q-35 0 -64.5 29t-29.5 65.5z" /> +<glyph unicode="ì" horiz-adv-x="454" d="M-55 1425h153l207 -342l-84 -49zM166 0v918h125v-918h-125z" /> +<glyph unicode="í" horiz-adv-x="454" d="M152 1083l204 342h156l-276 -391zM166 0v918h125v-918h-125z" /> +<glyph unicode="î" horiz-adv-x="454" d="M-47 1081l227 344h94l228 -344l-86 -49l-189 260l-188 -260zM166 0v918h125v-918h-125z" /> +<glyph unicode="ï" horiz-adv-x="454" d="M-41 1261.5q0 36.5 29.5 65.5t66.5 29q35 0 63.5 -29t28.5 -65.5t-28.5 -65.5t-63.5 -29q-37 0 -66.5 29t-29.5 65.5zM166 0v918h125v-918h-125zM303 1261.5q0 36.5 29.5 65.5t64.5 29q37 0 66 -29t29 -65.5t-29 -65.5t-66 -29q-35 0 -64.5 29t-29.5 65.5z" /> +<glyph unicode="ð" horiz-adv-x="1097" d="M98 451q0 197 128 344t315 147q178 0 264 -94q-74 211 -242 356l-252 -157l-57 92l219 137q-135 88 -291 133l31 104q209 -53 371 -167l282 176l54 -95l-246 -153q303 -274 303 -703q0 -270 -123 -433t-334 -163q-193 0 -307.5 145t-114.5 331zM236 465q0 -143 78.5 -256 t215.5 -113q139 0 227.5 117t88.5 356q0 119 -66.5 185.5t-204.5 66.5q-152 0 -245.5 -100t-93.5 -256z" /> +<glyph unicode="ñ" d="M162 0v905l125 25v-187q215 199 395 199q104 0 170 -65.5t66 -204.5v-672h-125v649q0 180 -136 180q-88 0 -194.5 -72.5t-175.5 -142.5v-614h-125zM262 1135q0 10 1 25.5t9.5 56t23.5 71.5t49 56.5t81 25.5t85 -24.5t57.5 -54t44 -54.5t49.5 -25q66 10 71 146h94 q0 -10 -1 -26.5t-9 -58.5t-24.5 -75t-51 -59.5t-82.5 -26.5q-59 0 -101 40t-71.5 80t-60.5 40t-48.5 -34t-19.5 -69l-2 -34h-94z" /> +<glyph unicode="ò" d="M98 463q0 193 119 336t317.5 143t319.5 -140t121 -335t-120 -343.5t-320 -148.5q-197 0 -317 146.5t-120 341.5zM231 475q0 -156 80 -269.5t226 -113.5q135 0 220 100.5t85 260.5q0 154 -78 263t-229 109q-139 0 -221.5 -97t-82.5 -253zM252 1425h154l206 -342l-84 -49z " /> +<glyph unicode="ó" d="M98 463q0 193 119 336t317.5 143t319.5 -140t121 -335t-120 -343.5t-320 -148.5q-197 0 -317 146.5t-120 341.5zM231 475q0 -156 80 -269.5t226 -113.5q135 0 220 100.5t85 260.5q0 154 -78 263t-229 109q-139 0 -221.5 -97t-82.5 -253zM459 1083l205 342h155l-276 -391z " /> +<glyph unicode="ô" d="M98 463q0 193 119 336t317.5 143t319.5 -140t121 -335t-120 -343.5t-320 -148.5q-197 0 -317 146.5t-120 341.5zM231 475q0 -156 80 -269.5t226 -113.5q135 0 220 100.5t85 260.5q0 154 -78 263t-229 109q-139 0 -221.5 -97t-82.5 -253zM260 1081l227 344h95l227 -344 l-86 -49l-188 260l-189 -260z" /> +<glyph unicode="õ" d="M98 463q0 193 119 336t317.5 143t319.5 -140t121 -335t-120 -343.5t-320 -148.5q-197 0 -317 146.5t-120 341.5zM231 475q0 -156 80 -269.5t226 -113.5q135 0 220 100.5t85 260.5q0 154 -78 263t-229 109q-139 0 -221.5 -97t-82.5 -253zM250 1135q0 10 1 25.5t9 56 t23.5 71.5t49.5 56.5t81 25.5t85 -24.5t57 -54t44 -54.5t49 -25q66 10 72 146h94q0 -10 -1 -26.5t-9 -58.5t-24.5 -75t-51.5 -59.5t-82 -26.5q-59 0 -101 40t-72 80t-60.5 40t-48 -34t-19.5 -69l-2 -34h-94z" /> +<glyph unicode="ö" d="M98 463q0 193 119 336t317.5 143t319.5 -140t121 -335t-120 -343.5t-320 -148.5q-197 0 -317 146.5t-120 341.5zM231 475q0 -156 80 -269.5t226 -113.5q135 0 220 100.5t85 260.5q0 154 -78 263t-229 109q-139 0 -221.5 -97t-82.5 -253zM266 1261.5q0 36.5 30 65.5t66 29 q35 0 64 -29t29 -65.5t-29 -65.5t-64 -29q-37 0 -66.5 29t-29.5 65.5zM610 1261.5q0 36.5 30 65.5t65 29q37 0 65.5 -29t28.5 -65.5t-29 -65.5t-65 -29q-35 0 -65 29t-30 65.5z" /> +<glyph unicode="÷" horiz-adv-x="1064" d="M74 451v120h917v-120h-917zM416 117q0 47 34.5 80.5t82 33.5t82 -33.5t34.5 -80.5q0 -49 -34.5 -83t-82 -34t-82 34t-34.5 83zM416 907q0 47 34.5 81t82 34t82 -34t34.5 -81q0 -49 -34.5 -82.5t-82 -33.5t-82 33.5t-34.5 82.5z" /> +<glyph unicode="ø" d="M92 -61l131 176q-125 141 -125 340q0 186 120 336.5t321 150.5q137 0 245 -76l84 113h121l-133 -178q119 -137 119 -324q0 -119 -49 -230.5t-153.5 -191.5t-242.5 -80q-133 0 -233 72l-82 -108h-123zM231 473q0 -152 70 -254l410 549q-74 53 -176 53q-139 0 -221.5 -94 t-82.5 -254zM371 145q70 -49 166 -49q139 0 222 98.5t83 256.5q0 143 -64 243z" /> +<glyph unicode="ù" horiz-adv-x="1056" d="M154 250v668h125v-650q0 -180 143 -180q145 0 340 188v642h125v-633q0 -49 10 -121t21 -119l10 -47l-125 -10q-23 100 -31 166q-178 -178 -371 -179q-247 1 -247 275zM242 1425h153l207 -342l-84 -49z" /> +<glyph unicode="ú" horiz-adv-x="1056" d="M154 250v668h125v-650q0 -180 143 -180q145 0 340 188v642h125v-633q0 -49 10 -121t21 -119l10 -47l-125 -10q-23 100 -31 166q-178 -178 -371 -179q-247 1 -247 275zM446 1083l205 342h156l-277 -391z" /> +<glyph unicode="û" horiz-adv-x="1056" d="M154 250v668h125v-650q0 -180 143 -180q145 0 340 188v642h125v-633q0 -49 10 -121t21 -119l10 -47l-125 -10q-23 100 -31 166q-178 -178 -371 -179q-247 1 -247 275zM250 1081l227 344h94l228 -344l-86 -49l-189 260l-188 -260z" /> +<glyph unicode="ü" horiz-adv-x="1056" d="M154 250v668h125v-650q0 -180 143 -180q145 0 340 188v642h125v-633q0 -49 10 -121t21 -119l10 -47l-125 -10q-23 100 -31 166q-178 -178 -371 -179q-247 1 -247 275zM256 1261.5q0 36.5 29.5 65.5t66.5 29q35 0 63.5 -29t28.5 -65.5t-28.5 -65.5t-63.5 -29 q-37 0 -66.5 29t-29.5 65.5zM600 1261.5q0 36.5 29.5 65.5t64.5 29q37 0 65.5 -29t28.5 -65.5t-28.5 -65.5t-65.5 -29q-35 0 -64.5 29t-29.5 65.5z" /> +<glyph unicode="ý" horiz-adv-x="921" d="M41 918h137l289 -672l278 672h138l-422 -988q-80 -188 -161 -293.5t-208 -121.5l-41 110q94 18 158.5 93t122.5 206l69 158zM395 1083l205 342h156l-277 -391z" /> +<glyph unicode="þ" horiz-adv-x="1067" d="M166 -473v1909l125 24v-665q37 63 110.5 105t173.5 42q178 0 285 -131t107 -330q0 -213 -130 -359.5t-343 -146.5q-137 0 -203 62v-486zM291 227q0 -131 184 -131q168 0 262 101.5t94 275.5q0 160 -74.5 253t-189.5 93q-70 0 -136 -38t-94 -67.5t-46 -58.5v-428z" /> +<glyph unicode="ÿ" horiz-adv-x="921" d="M41 918h137l289 -672l278 672h138l-422 -988q-80 -188 -161 -293.5t-208 -121.5l-41 110q94 18 158.5 93t122.5 206l69 158zM205 1261.5q0 36.5 29.5 65.5t66.5 29q35 0 63.5 -29t28.5 -65.5t-28.5 -65.5t-63.5 -29q-37 0 -66.5 29t-29.5 65.5zM549 1261.5 q0 36.5 29.5 65.5t64.5 29q37 0 65.5 -29t28.5 -65.5t-28.5 -65.5t-65.5 -29q-35 0 -64.5 29t-29.5 65.5z" /> +<glyph unicode="Œ" horiz-adv-x="2002" d="M111 680q0 188 78.5 346t251.5 261.5t415 103.5q121 0 256 -25h782v-113h-651v-497h516v-113h-516v-530h643v-113h-776q-152 -25 -270 -25q-336 0 -532.5 203t-196.5 502zM256 694q0 -104 33 -205.5t100.5 -192.5t187 -147.5t275.5 -56.5q131 0 258 19v1134 q-117 29 -270 29q-190 0 -326.5 -87t-197 -215t-60.5 -278z" /> +<glyph unicode="œ" horiz-adv-x="1736" d="M98 453q0 199 116 344t325 145q125 0 224 -58.5t155 -154.5q57 100 148 156.5t208 56.5q162 0 262 -105.5t100 -289.5l-84 -25l-579 -76q8 -164 96 -258t227 -94q156 0 281 107l6 6l53 -94l-15 -16q-9 -9 -44 -32.5t-73 -42t-97 -33t-121 -14.5q-129 0 -229.5 59.5 t-153.5 158.5q-127 -217 -373 -218q-197 0 -314.5 142.5t-117.5 335.5zM231 465q0 -160 85 -266.5t227 -106.5q135 0 217 101.5t82 261.5q0 154 -77 262t-226 108q-141 0 -224.5 -102t-83.5 -258zM979 559l516 68q0 8 -3 21.5t-18.5 49t-38 62t-67.5 48t-104 21.5 q-115 0 -190 -75.5t-95 -194.5z" /> +<glyph unicode="Ÿ" horiz-adv-x="1153" d="M23 1366h159l398 -635l401 635h149l-485 -762v-604h-135v602zM272 1624q0 35 29 63.5t66 28.5q35 0 63.5 -28.5t28.5 -63.5q0 -37 -29 -65.5t-63 -28.5q-37 0 -66 27.5t-29 66.5zM727 1624q0 35 28.5 63.5t63.5 28.5q37 0 65.5 -28.5t28.5 -63.5q0 -39 -28.5 -66.5 t-65.5 -27.5q-35 0 -63.5 28.5t-28.5 65.5z" /> +<glyph unicode="ˆ" horiz-adv-x="1028" d="M240 1081l227 344h94l227 -344l-86 -49l-188 260l-188 -260z" /> +<glyph unicode="˜" horiz-adv-x="1028" d="M227 1135q0 10 1 25.5t9.5 56t23.5 71.5t49 56.5t81 25.5t85 -24.5t57.5 -54t44 -54.5t49.5 -25q66 10 71 146h95q0 -10 -1 -26.5t-9.5 -58.5t-25 -75t-51 -59.5t-81.5 -26.5q-59 0 -101.5 40t-72 80t-60.5 40t-48 -34t-19 -69l-2 -34h-95z" /> +<glyph unicode=" " horiz-adv-x="892" /> +<glyph unicode=" " horiz-adv-x="1784" /> +<glyph unicode=" " horiz-adv-x="892" /> +<glyph unicode=" " horiz-adv-x="1784" /> +<glyph unicode=" " horiz-adv-x="594" /> +<glyph unicode=" " horiz-adv-x="446" /> +<glyph unicode=" " horiz-adv-x="297" /> +<glyph unicode=" " horiz-adv-x="297" /> +<glyph unicode=" " horiz-adv-x="223" /> +<glyph unicode=" " horiz-adv-x="356" /> +<glyph unicode=" " horiz-adv-x="99" /> +<glyph unicode="‐" horiz-adv-x="669" d="M117 438v142h434v-142h-434z" /> +<glyph unicode="‑" horiz-adv-x="669" d="M117 438v142h434v-142h-434z" /> +<glyph unicode="‒" horiz-adv-x="669" d="M117 438v142h434v-142h-434z" /> +<glyph unicode="–" horiz-adv-x="1075" d="M117 457v121h839v-121h-839z" /> +<glyph unicode="—" horiz-adv-x="1873" d="M117 457v121h1638v-121h-1638z" /> +<glyph unicode="‘" horiz-adv-x="421" d="M106 1204q0 84 45.5 165t120.5 138l68 -65q-92 -74 -92 -170q0 -104 94 -203l-137 -82q-99 82 -99 217z" /> +<glyph unicode="’" horiz-adv-x="417" d="M88 1425l137 82q98 -84 99 -215q0 -84 -45.5 -167t-120.5 -138l-68 66q92 74 92 170q0 106 -94 202z" /> +<glyph unicode="‚" horiz-adv-x="485" d="M109 137l153 84q104 -90 105 -217q0 -84 -49.5 -166t-124.5 -139l-66 68q98 80 98 167q1 80 -116 203z" /> +<glyph unicode="“" horiz-adv-x="733" d="M106 1200q0 182 166 307l68 -65q-92 -76 -92 -176q0 -98 94 -197l-137 -82q-99 82 -99 213zM418 1200q0 182 166 307l65 -65q-90 -72 -90 -178q0 -94 92 -195l-135 -82q-98 82 -98 213z" /> +<glyph unicode="”" horiz-adv-x="727" d="M88 1425l137 82q98 -84 99 -215q0 -84 -45.5 -167t-120.5 -138l-68 66q92 74 92 170q0 106 -94 202zM399 1425l136 82q98 -82 98 -215q0 -84 -45 -167t-121 -138l-66 66q90 72 91 170q-1 106 -93 202z" /> +<glyph unicode="„" horiz-adv-x="794" d="M109 137l153 84q104 -90 105 -217q0 -84 -49.5 -166t-124.5 -139l-66 68q98 80 98 167q1 80 -116 203zM418 137l153 84q106 -90 107 -217q0 -84 -49 -166t-125 -139l-68 68q100 78 101 167q0 80 -119 203z" /> +<glyph unicode="•" horiz-adv-x="757" d="M106 524.5q0 114.5 79 193.5t194 79t193.5 -79t78.5 -193.5t-78.5 -193.5t-193.5 -79t-194 79t-79 193.5z" /> +<glyph unicode="…" horiz-adv-x="1570" d="M127 86q0 45 33 78t80 33q45 0 76.5 -33t31.5 -78t-31.5 -78t-76.5 -33q-47 0 -80 33t-33 78zM674 86q0 45 32.5 78t77.5 33q47 0 79 -33t32 -78t-32 -78t-79 -33q-45 0 -77.5 33t-32.5 78zM1221 86q0 45 32.5 78t77.5 33t78 -33t33 -78t-33 -78t-78 -33t-77.5 33 t-32.5 78z" /> +<glyph unicode=" " horiz-adv-x="356" /> +<glyph unicode="‹" horiz-adv-x="659" d="M55 510v8q35 27 281 295l123 133l98 -26l-313 -406l313 -405l-98 -27l-170 182l-112 121l-61 66l-38 38q-11 11 -23 21z" /> +<glyph unicode="›" horiz-adv-x="661" d="M104 109l316 405l-316 406l101 26q362 -395 403 -428v-8q-10 -8 -21.5 -18.5l-24.5 -23.5t-43 -46l-64 -71l-104 -111l-146 -158z" /> +<glyph unicode=" " horiz-adv-x="446" /> +<glyph unicode="€" horiz-adv-x="1138" d="M90 379v96h109q-4 27 -4 84q0 51 2 76h-103v98h119q43 190 174 305t332 115q180 -2 309 -80l-35 -127q-14 10 -38.5 24.5t-100.5 39t-149 24.5q-145 0 -234.5 -84t-124.5 -217h586l-29 -98h-573q-2 -23 -2 -64q0 -51 6 -96h522l-29 -96h-471q41 -131 134.5 -208 t224.5 -77q70 0 136.5 18.5t98.5 39.5l33 18l49 -104q-14 -10 -38.5 -25.5t-107.5 -40.5t-173 -25q-186 0 -318.5 110t-179.5 294h-125z" /> +<glyph unicode="™" horiz-adv-x="1333" d="M78 1284v82h450v-82h-178v-463h-94v463h-178zM621 821l20 545h141l131 -379l131 379h138l20 -545h-90l-16 432l-154 -432h-63l-152 430l-12 -430h-94z" /> +<glyph unicode="" horiz-adv-x="920" d="M0 920h920v-920h-920v920z" /> +<glyph unicode="fi" horiz-adv-x="1048" d="M61 809v63l146 58v84q0 223 101.5 347t275.5 124q72 0 140.5 -19.5t100.5 -38.5l33 -18l-67 -109q-102 66 -211 66q-104 0 -176 -85t-72 -261v-102h551v-918h-125v819h-426v-819h-125v809h-146z" /> +<glyph unicode="fl" horiz-adv-x="1077" d="M61 809v63l146 58v84q0 223 101.5 347t275.5 124q119 0 217 -47l110 22v-1460h-125v1303q-115 63 -206 63q-104 0 -176 -85t-72 -261v-102h264v-109h-264v-809h-125v809h-146z" /> +<glyph unicode="ffi" horiz-adv-x="1628" d="M61 809v63l146 58v53q0 215 105.5 333t289.5 118q139 0 270 -80q98 131 273 131q66 0 128 -19.5t91 -38.5l29 -18l-68 -109q-92 66 -186 66q-96 0 -161 -79t-65 -247v-122h551v-918h-127v819h-424v-819h-127v819h-454v-819h-125v809h-146zM332 918h454v116q0 121 31 209 q-121 72 -221 72q-115 0 -189.5 -79t-74.5 -249v-69z" /> +<glyph unicode="ffl" horiz-adv-x="1656" d="M61 809v63l146 58v53q0 215 105.5 333t289.5 118q145 0 279 -86q104 137 290 137q109 0 218 -45l104 20v-1460h-127v1309q-109 57 -201 57q-109 0 -180.5 -88t-71.5 -266v-94h265v-109h-265v-809h-127v819h-454v-819h-125v809h-146zM332 918h454v90q0 133 37 231 q-123 76 -227 76q-115 0 -189.5 -79t-74.5 -249v-69z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansLight-webfont.ttf b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansLight-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5eacf6d088d7d4420657c3d251df206908e89535 Binary files /dev/null and b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansLight-webfont.ttf differ diff --git a/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansLight-webfont.woff b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansLight-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..08c76f87126d89b7b8c6859a833329998d591970 Binary files /dev/null and b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansLight-webfont.woff differ diff --git a/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansRegular-webfont.eot b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansRegular-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..db87f6c488d72297e573d5bfac2ebe17e637cca9 Binary files /dev/null and b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansRegular-webfont.eot differ diff --git a/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansRegular-webfont.svg b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansRegular-webfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..6fd374788dfd55d86182cf5fe95aa3e3005d6218 --- /dev/null +++ b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansRegular-webfont.svg @@ -0,0 +1,244 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Fontspring. +</metadata> +<defs> +<font id="webfontnehNrF5g" horiz-adv-x="1064" > +<font-face units-per-em="2048" ascent="1536" descent="-512" /> +<missing-glyph horiz-adv-x="491" /> +<glyph unicode=" " horiz-adv-x="491" /> +<glyph unicode="	" horiz-adv-x="491" /> +<glyph unicode=" " horiz-adv-x="491" /> +<glyph unicode="!" horiz-adv-x="555" d="M156 98.5q0 51.5 35.5 87t87 35.5t87 -35.5t35.5 -87t-35.5 -87.5t-87 -36t-87 36t-35.5 87.5zM182 1391h191l-27 -990h-141z" /> +<glyph unicode=""" horiz-adv-x="712" d="M131 883v483h152v-76l-47 -407h-105zM451 883v483h151v-76l-47 -407h-104z" /> +<glyph unicode="#" horiz-adv-x="1325" d="M74 256l20 113h246l59 290h-247l20 113h252l84 412h119l-84 -412h311l84 412h119l-84 -412h276l-20 -113h-281l-59 -290h282l-20 -113h-285l-88 -438h-121l91 438h-312l-88 -438h-121l90 438h-243zM459 369h311l59 290h-311z" /> +<glyph unicode="$" horiz-adv-x="946" d="M82 86l37 145l39 -26q25 -16 105.5 -46t164.5 -34l10 387q-72 27 -119 49.5t-102 61.5t-84 95t-29 128q0 121 87.5 204t263.5 95l6 178h90l-4 -176q174 -6 284 -62l-47 -137q-102 49 -241 60l-11 -367q150 -55 238 -135t88 -209t-91 -210t-253 -95l-4 -174h-90l4 170 q-96 2 -182 26.5t-123 46.5zM266 856q0 -70 44 -110.5t132 -73.5l11 336q-187 -13 -187 -152zM518 127q178 23 178 164q0 70 -43 111.5t-125 74.5z" /> +<glyph unicode="%" horiz-adv-x="1497" d="M80 1038q0 129 89 218.5t220 89.5t220 -89.5t89 -218.5t-89 -218t-220 -89t-220 89t-89 218zM195 1038q0 -80 56 -140t138 -60t138.5 60t56.5 140t-56.5 140.5t-140.5 60.5q-80 0 -136 -60.5t-56 -140.5zM215 0l956 1376l86 -59l-917 -1317h-125zM805 283q0 129 89 218 t220 89t220 -89t89 -218t-89 -218.5t-220 -89.5t-220 89.5t-89 218.5zM920 282.5q0 -79.5 56 -140t138 -60.5t138.5 60.5t56.5 140t-56.5 140t-140.5 60.5q-80 0 -136 -60.5t-56 -140z" /> +<glyph unicode="&" horiz-adv-x="1394" d="M88 319q0 127 79 219.5t220 184.5q-119 211 -119 352q0 121 84 218.5t248 97.5q141 0 221 -76t80 -199q0 -127 -81 -219t-230 -192q74 -111 145 -197q92 -113 170 -189q172 229 199 603h151q-12 -162 -74.5 -354.5t-174.5 -338.5q186 -160 335 -196l-65 -119 q-168 27 -379 201q-164 -139 -375 -140q-178 0 -306 90t-128 254zM246 332q0 -104 85 -160.5t201 -56.5q143 0 263 90q-90 84 -193 211q-70 82 -149 198q-207 -143 -207 -282zM442 1079q0 -109 84 -266q104 70 160.5 135.5t56.5 145.5q0 66 -38.5 111.5t-108.5 45.5 q-74 0 -114 -50t-40 -122z" /> +<glyph unicode="'" horiz-adv-x="393" d="M131 883v483h152v-76l-47 -407h-105z" /> +<glyph unicode="(" horiz-adv-x="585" d="M109 553q0 432 231 772q41 57 72 90l127 -37l-32 -39q-19 -25 -69.5 -108.5t-88.5 -173.5t-69.5 -227.5t-31.5 -276.5q0 -434 229 -786q39 -59 68 -93l-123 -43l-34 41q-22 27 -76 117t-95 189.5t-74.5 256t-33.5 318.5z" /> +<glyph unicode=")" horiz-adv-x="585" d="M41 -326q12 14 31.5 40t71 113t91 182t71.5 243.5t32 300.5q0 399 -227 741l-64 84l127 37q12 -12 32.5 -36.5t73 -109.5t92.5 -177.5t72.5 -239.5t32.5 -299q0 -459 -237 -821q-43 -66 -76 -101z" /> +<glyph unicode="*" horiz-adv-x="991" d="M92 854l293 109l31 -54l-242 -198zM92 1128l82 144l242 -199l-31 -53zM414 573l51 308h61l52 -308h-164zM414 1409h164l-52 -307h-61zM575 909l31 54l293 -109l-82 -143zM575 1073l242 199l82 -144l-293 -108z" /> +<glyph unicode="+" d="M63 446v134h402v419h141v-419h395v-134h-395v-446h-141v446h-402z" /> +<glyph unicode="," horiz-adv-x="471" d="M76 -281q53 47 71.5 66.5t38 59.5t19.5 89q0 104 -96 240l167 55q78 -92 78 -221q0 -205 -207 -362z" /> +<glyph unicode="-" horiz-adv-x="692" d="M115 438v148h463v-148h-463z" /> +<glyph unicode="." horiz-adv-x="487" d="M121 98.5q0 51.5 36 87t87 35.5t87 -35.5t36 -87t-36 -87.5t-87 -36t-87 36t-36 87.5z" /> +<glyph unicode="/" horiz-adv-x="937" d="M47 -401l682 1767h141l-680 -1767h-143z" /> +<glyph unicode="0" horiz-adv-x="1124" d="M102 467q0 213 123 366.5t346 153.5q217 0 334 -140t117 -339q0 -137 -46 -254t-156.5 -198t-266.5 -81q-209 0 -330 147.5t-121 344.5zM262 485q0 -150 81 -260t218 -110q147 0 224 109.5t77 264.5q0 145 -77.5 252t-221.5 107q-139 0 -220 -109t-81 -254z" /> +<glyph unicode="1" horiz-adv-x="741" d="M104 0v137h215v699h-200v127h360v-826h201v-137h-576z" /> +<glyph unicode="2" horiz-adv-x="909" d="M92 104l53 39q33 25 116 97.5t147.5 141.5t117 156t52.5 154q0 70 -48.5 113t-123.5 43q-55 0 -116 -23.5t-93 -46.5l-31 -24l-70 104q16 14 47 35.5t119 57.5t170 36q135 0 224 -79t89 -195q0 -78 -35.5 -158t-106.5 -160t-128 -133t-143 -125h499v-137h-722z" /> +<glyph unicode="3" horiz-adv-x="815" d="M41 858q16 14 47 35.5t119 57.5t172 36q133 0 221 -75.5t88 -194.5q0 -106 -72.5 -195.5t-175.5 -148.5q135 -29 209 -114t74 -208q0 -197 -167 -319.5t-429 -122.5q-37 0 -55 2l-15 127q20 -2 62 -2q186 0 311 81t125 222q0 121 -91 175t-224 54h-58v131 q119 12 228.5 105.5t109.5 195.5q0 68 -45 108t-117 40q-127 -2 -247 -94z" /> +<glyph unicode="4" d="M57 53v109l609 825h135v-803h194v-131h-194v-448h-160v448h-584zM231 184h410v555z" /> +<glyph unicode="5" horiz-adv-x="817" d="M63 -262q20 -2 64 -2q182 0 308 81t126 230q0 74 -29.5 132.5t-71.5 93t-109.5 60t-123 37t-129.5 21.5v572h580v-138h-424v-319q475 -96 475 -451q0 -205 -166 -325.5t-426 -120.5q-39 0 -59 2z" /> +<glyph unicode="6" horiz-adv-x="1040" d="M98 567q0 156 46 298.5t133.5 258t229.5 187t322 80.5l13 -131q-238 -14 -377 -149.5t-182 -344.5q90 113 270 113q190 0 297.5 -126t107.5 -309q0 -188 -112.5 -328.5t-306.5 -140.5q-213 0 -327 170t-114 422zM266 623q0 -240 73 -374t210 -134q111 0 176.5 89 t65.5 222q0 53 -11.5 102.5t-38 99.5t-80 80.5t-129.5 30.5q-155 1 -266 -116z" /> +<glyph unicode="7" horiz-adv-x="929" d="M63 811v152h811v-109q-221 -551 -581 -1257l-156 36q295 539 553 1178h-627z" /> +<glyph unicode="8" horiz-adv-x="1044" d="M100 334q0 119 79 207t222 184q-219 174 -219 354q0 141 104.5 226.5t260.5 85.5q152 0 248 -83t96 -216q0 -106 -63.5 -190.5t-176.5 -164.5q139 -98 216 -188t77 -209q0 -152 -122 -258.5t-306 -106.5q-182 0 -299 106t-117 253zM254 340q0 -98 80 -161.5t184.5 -63.5 t181 59t76.5 156q0 59 -44 118.5t-87 93.5l-135 101q-127 -84 -191.5 -151.5t-64.5 -151.5zM350 1085q0 -74 49.5 -136t141.5 -132q94 68 145 129.5t51 134.5q0 84 -58 127t-136 43q-76 0 -134.5 -42t-58.5 -124z" /> +<glyph unicode="9" horiz-adv-x="1040" d="M102 532q0 184 110 319.5t300 135.5q213 0 326.5 -170t113.5 -422q0 -152 -46 -288t-133 -247.5t-229.5 -180t-322.5 -76.5l-12 131q238 12 377 144t182 327q-90 -111 -268 -111q-186 0 -292 128t-106 310zM270 561q0 -57 10.5 -109.5t36 -104.5t77.5 -83t126 -31 q150 0 264 115q0 225 -72.5 362.5t-209.5 137.5q-104 0 -168 -83t-64 -204z" /> +<glyph unicode=":" horiz-adv-x="555" d="M156 98.5q0 51.5 35.5 87t87 35.5t87 -35.5t35.5 -87t-35.5 -87.5t-87 -36t-87 36t-35.5 87.5zM156 799q0 51 35.5 87t87 36t87 -36t35.5 -87t-35.5 -87t-87 -36t-87 36t-35.5 87z" /> +<glyph unicode=";" horiz-adv-x="546" d="M119 -281q53 47 71.5 66.5t38 59.5t19.5 89q0 104 -96 240l167 55q78 -92 78 -221q0 -205 -207 -362zM150 799q0 51 35.5 87t87 36t87 -36t35.5 -87t-35.5 -87t-87 -36t-87 36t-35.5 87z" /> +<glyph unicode="<" d="M63 463v94l873 469l31 -139l-719 -377l719 -397l-31 -138z" /> +<glyph unicode="=" d="M74 252v133h917v-133h-917zM74 641v133h917v-133h-917z" /> +<glyph unicode=">" d="M96 113l717 397l-717 377l31 139l872 -469v-94l-872 -488z" /> +<glyph unicode="?" horiz-adv-x="731" d="M94 1284l35 152q20 -6 56 -18.5t127 -52.5t161 -83t127 -110.5t57 -135.5q0 -51 -32.5 -105t-80.5 -105.5t-95.5 -109t-80 -140t-32.5 -175.5h-129q-6 29 -6 70q0 92 42 182t92 147.5t92 117t42 100.5q0 115 -293 235zM156 98.5q0 51.5 35.5 87t87 35.5t87 -35.5 t35.5 -87t-35.5 -87.5t-87 -36t-87 36t-35.5 87.5z" /> +<glyph unicode="@" horiz-adv-x="1701" d="M86 399q0 213 99.5 399.5t288 303.5t421.5 117q311 0 507.5 -191.5t196.5 -480.5q0 -299 -188 -441q-23 -18 -51.5 -32.5t-51 -23.5t-64.5 -21.5t-61.5 -16.5t-77.5 -17t-81 -20q-18 84 -29 152q-35 -63 -105.5 -107.5t-152.5 -44.5q-123 0 -207 107.5t-84 284.5 q0 250 165 402.5t393 152.5l135 -9v-622q0 -45 4 -87t8 -61l2 -18q156 18 231.5 124.5t75.5 274.5q0 250 -152.5 414t-410.5 164q-295 0 -483.5 -209t-188.5 -500q0 -270 162 -448t383 -189l-20 -112q-283 12 -473.5 232t-190.5 523zM614 379q0 -113 45.5 -188.5 t116.5 -75.5q51 0 102.5 37.5t75.5 76.5l25 37v527q-160 0 -262.5 -120t-102.5 -294z" /> +<glyph unicode="A" horiz-adv-x="1267" d="M29 0l524 1376h162l524 -1376h-176l-154 412h-557l-153 -412h-170zM406 553h450l-225 602z" /> +<glyph unicode="B" horiz-adv-x="1202" d="M201 0v1366h356q244 0 353.5 -95t109.5 -233q0 -178 -166 -305q37 -12 73 -32.5t78 -59.5t68.5 -101.5t26.5 -142.5q0 -180 -130 -288.5t-337 -108.5h-432zM369 141h233q160 0 239 65.5t79 178.5q0 115 -79 181.5t-239 66.5h-233v-492zM369 774h317l16.5 10.5t37 29 t47 49t37 69.5t16.5 90q0 203 -314 203h-157v-451z" /> +<glyph unicode="C" horiz-adv-x="1378" d="M102 674q0 305 202 511t532 206q121 0 234.5 -30t166.5 -58l51 -29l-67 -152q-18 14 -51 35t-136.5 54.5t-210.5 33.5q-172 0 -298 -83t-184 -207t-58 -269q0 -238 154.5 -401.5t389.5 -163.5q211 0 394 127l14 10l70 -127q-23 -18 -63 -44t-168 -69t-261 -43 q-309 0 -510 197t-201 502z" /> +<glyph unicode="D" horiz-adv-x="1480" d="M201 0v1366h413q147 0 277.5 -36t241 -111.5t176 -207.5t65.5 -306q0 -336 -229.5 -520.5t-607.5 -184.5h-336zM369 141h147q352 0 515 149.5t163 395.5q0 250 -157.5 394.5t-450.5 144.5h-217v-1084z" /> +<glyph unicode="E" horiz-adv-x="1110" d="M201 0v1366h805v-141h-637v-457h503v-141h-503v-486h635v-141h-803z" /> +<glyph unicode="F" horiz-adv-x="1048" d="M201 0v1366h786v-141h-618v-463h489v-150h-489v-612h-168z" /> +<glyph unicode="G" horiz-adv-x="1429" d="M102 664q0 303 199 515t539 212q121 0 234.5 -26t166.5 -50l53 -27l-67 -151q-18 12 -52 30.5t-138.5 48t-207.5 29.5q-260 0 -404 -167t-144 -400q0 -244 159.5 -400.5t425.5 -156.5l258 35v403h-293v141h461v-661q-252 -63 -452 -64q-313 0 -525.5 188t-212.5 501z" /> +<glyph unicode="H" horiz-adv-x="1544" d="M201 0v1366h168v-598h807v598h167v-1366h-167v627h-807v-627h-168z" /> +<glyph unicode="I" horiz-adv-x="569" d="M201 0v1366h168v-1366h-168z" /> +<glyph unicode="J" horiz-adv-x="571" d="M-35 -229q238 29 238 383v1212h168v-1210q0 -92 -17.5 -174t-54.5 -157t-105.5 -125t-162.5 -65z" /> +<glyph unicode="K" horiz-adv-x="1187" d="M201 0v1366h168v-580h28l547 580h213l-614 -641l639 -725h-221l-564 645h-28v-645h-168z" /> +<glyph unicode="L" horiz-adv-x="1054" d="M201 0v1366h168v-1225h655v-141h-823z" /> +<glyph unicode="M" horiz-adv-x="1767" d="M178 0l49 1366h242l412 -1128l417 1128h242l49 -1366h-164l-43 1161l-438 -1161h-127l-438 1176l-37 -1176h-164z" /> +<glyph unicode="N" horiz-adv-x="1529" d="M201 0v1366h168l796 -1114v1114h164v-1366h-168l-796 1098v-1098h-164z" /> +<glyph unicode="O" horiz-adv-x="1628" d="M102 680q0 184 82 344t250 263.5t389 103.5q313 0 508 -196t195 -486q0 -299 -203 -516.5t-518 -217.5q-307 0 -505 207t-198 498zM283 692q0 -221 144 -396t384 -175q242 0 388.5 173t146.5 398q0 223 -144.5 388t-388.5 165q-242 0 -386 -166t-144 -387z" /> +<glyph unicode="P" horiz-adv-x="1155" d="M201 0v1366h395q248 0 367.5 -112.5t119.5 -290.5q0 -205 -134 -322t-353 -117h-227v-524h-168zM369 666h196q170 0 254 73.5t84 208.5q0 125 -81 201t-257 76h-196v-559z" /> +<glyph unicode="Q" horiz-adv-x="1628" d="M104 680q0 184 82 344t248 263.5t385 103.5q315 0 512 -196t197 -486q0 -248 -146.5 -447t-386.5 -262l69 -87q26 -32 80 -83t102 -80t119 -51.5t148 -22.5l-24 -153h-15q-72 0 -141 17q-76 19 -125 42t-107.5 71t-81 70.5t-66.5 76t-46 55.5l-61 71q-37 45 -123 54 q-276 31 -447.5 229.5t-171.5 470.5zM285 692q0 -104 34.5 -204.5t98 -183.5t166 -133t227.5 -50q240 0 388.5 174t148.5 399q0 219 -143.5 385t-387.5 166q-242 0 -387 -166t-145 -387z" /> +<glyph unicode="R" horiz-adv-x="1216" d="M201 0v1366h358q248 0 368 -106.5t120 -266.5q0 -137 -82 -234t-201 -149l414 -610h-199l-391 575h-219v-575h-168zM369 717h215q109 0 195.5 70.5t86.5 189.5q0 106 -82 177t-256 71h-159v-508z" /> +<glyph unicode="S" horiz-adv-x="1042" d="M98 90l45 158q18 -14 50 -34.5t125.5 -54.5t181.5 -34q117 0 194.5 52t77.5 147q0 86 -66.5 151.5t-162.5 114.5l-192 102q-95 53 -161.5 140.5t-66.5 201.5q0 154 118.5 255.5t325.5 101.5q80 0 167 -15.5t134 -32.5l47 -14l-43 -158q-152 70 -311 70q-119 0 -193.5 -49 t-74.5 -139q0 -86 66.5 -152.5t162.5 -114t191.5 -100.5t162 -141t66.5 -209q0 -172 -127 -266.5t-321 -94.5q-106 0 -205 29t-146 57z" /> +<glyph unicode="T" horiz-adv-x="1212" d="M35 1225v141h1143v-141h-492v-1225h-168v1225h-483z" /> +<glyph unicode="U" horiz-adv-x="1472" d="M182 492v874h168v-842q0 -205 105.5 -304t281.5 -99q174 0 279.5 98t105.5 293v854h168v-846q0 -258 -157.5 -401.5t-397.5 -143.5q-248 0 -400.5 126.5t-152.5 390.5z" /> +<glyph unicode="V" horiz-adv-x="1206" d="M29 1366h178l399 -1128l400 1128h172l-494 -1376h-164z" /> +<glyph unicode="W" horiz-adv-x="1935" d="M51 1366h172l336 -1130l326 1130h172l323 -1130l338 1130h168l-420 -1376h-172l-325 1102l-328 -1102h-172z" /> +<glyph unicode="X" horiz-adv-x="1212" d="M51 0l457 680l-457 686h199l358 -551l361 551h192l-456 -682l456 -684h-198l-359 551l-360 -551h-193z" /> +<glyph unicode="Y" horiz-adv-x="1177" d="M16 1366h199l377 -608l381 608h188l-487 -770v-596h-168v594z" /> +<glyph unicode="Z" horiz-adv-x="1185" d="M74 0v96l794 1129h-747v141h962v-96l-784 -1129h797v-141h-1022z" /> +<glyph unicode="[" horiz-adv-x="587" d="M174 -317v1683h375v-113h-242v-1458h242v-112h-375z" /> +<glyph unicode="\" horiz-adv-x="937" d="M68 1366h141l682 -1767h-143z" /> +<glyph unicode="]" horiz-adv-x="587" d="M39 -205h242v1458h-242v113h375v-1683h-375v112z" /> +<glyph unicode="^" horiz-adv-x="1011" d="M16 512l439 879h102l438 -879h-155l-336 676l-336 -676h-152z" /> +<glyph unicode="_" horiz-adv-x="1097" d="M37 -76h1024v-121h-1024v121z" /> +<glyph unicode="`" horiz-adv-x="1032" d="M328 1432h174l207 -340l-95 -56z" /> +<glyph unicode="a" horiz-adv-x="960" d="M74 207q0 141 143 230t410 124v35q0 45 -1 65.5t-8.5 54.5t-22.5 49t-45 28.5t-75 13.5q-150 -2 -289 -102l-49 129q16 12 49 30.5t132.5 50t201.5 31.5q147 0 206.5 -67.5t59.5 -225.5v-415q0 -104 88 -121l15 -2l-53 -129q-164 18 -199 149q-10 -16 -30.5 -37.5 t-57.5 -52.5t-94.5 -50.5t-122.5 -19.5q-117 0 -187.5 65t-70.5 167zM244 217q0 -102 121 -102q125 0 262 159v170q-199 -33 -291 -86t-92 -141z" /> +<glyph unicode="b" horiz-adv-x="1067" d="M152 16v1418l159 28v-637q94 121 267 121q180 0 288.5 -129t108.5 -325q0 -215 -133 -366t-381 -151q-145 0 -309 41zM311 129q70 -20 158 -20q152 0 245 97t93 275q0 150 -68.5 238t-181.5 88q-135 0 -246 -123v-555z" /> +<glyph unicode="c" horiz-adv-x="933" d="M90 451q0 201 128 348t343 147q88 0 163 -24.5t107 -49.5l31 -26l-71 -125q-10 10 -31 24.5t-83.5 38t-125.5 23.5q-133 0 -213 -100.5t-80 -247.5q0 -145 81 -244.5t218 -99.5q143 4 250 98l55 -119q-12 -12 -35.5 -32.5t-106.5 -53.5t-175 -33q-201 0 -328 135.5 t-127 340.5z" /> +<glyph unicode="d" horiz-adv-x="1091" d="M92 430q0 213 133 364.5t369 151.5q100 0 178 -33v521l160 28v-1177q0 -49 10 -121t21 -119l10 -45l-158 -14q-18 84 -29 147q-98 -158 -299 -158q-176 0 -285.5 130t-109.5 325zM262 440q0 -150 69.5 -237.5t176.5 -87.5q66 0 128 36.5t89 68.5t47 63v397 q-6 131 -176 131q-150 0 -242 -98.5t-92 -272.5z" /> +<glyph unicode="e" horiz-adv-x="997" d="M92 440q0 219 124 362.5t319 143.5q164 0 266 -109.5t102 -301.5l-98 -29l-543 -72q10 -145 91 -232t214 -87q70 0 142.5 28.5t109.5 57.5l37 30l47 -122q-14 -14 -43 -37t-121 -60t-190 -37q-217 0 -337 135t-120 330zM264 557l463 59q0 8 -3 21.5t-15.5 47.5t-33 59.5 t-60.5 47t-91 21.5q-106 0 -174 -71.5t-86 -184.5z" /> +<glyph unicode="f" horiz-adv-x="669" d="M57 793v84l146 55v98q0 217 103.5 339t277.5 122q68 0 132 -19.5t95 -37.5l31 -21l-74 -127q-92 66 -188 66q-94 0 -156 -76t-62 -238v-116h261v-129h-261v-793h-159v793h-146z" /> +<glyph unicode="g" horiz-adv-x="1026" d="M59 -240q0 158 240 281q-154 45 -154 125t142 164q-84 43 -131 120.5t-47 174.5q0 145 111.5 233t268.5 88q53 0 134.5 -19.5t130.5 -19.5h98q27 0 56.5 5.5t45.5 9.5l19 6l14 -144h-117q-35 0 -75 4q70 -76 69 -180q0 -152 -118.5 -235.5t-272.5 -83.5q-39 0 -74 6 q-82 -59 -82 -86t58.5 -46.5t199.5 -49.5q8 -2 13 -2q82 -18 133 -34t108.5 -44.5t86 -73.5t28.5 -104q0 -139 -146.5 -239.5t-344.5 -100.5q-162 0 -278 64t-116 181zM207 -217q0 -76 80 -110.5t178 -34.5q129 0 222 58t93 136q0 61 -61.5 94t-183.5 60q-41 10 -103 20 q-57 -31 -83.5 -47t-66.5 -47t-57.5 -61.5t-17.5 -67.5zM272 614q0 -84 55.5 -143t159.5 -59q94 0 153.5 50t59.5 138q0 86 -57 154.5t-160 68.5q-96 0 -153.5 -59.5t-57.5 -149.5z" /> +<glyph unicode="h" horiz-adv-x="1081" d="M156 0v1434l159 28v-704q176 188 379 188q111 0 176.5 -67.5t65.5 -208.5v-670h-160v625q0 180 -125 180q-127 0 -336 -195v-610h-159z" /> +<glyph unicode="i" horiz-adv-x="471" d="M127 1266q0 45 33 77.5t78 32.5t77.5 -32.5t32.5 -77.5t-32.5 -78t-77.5 -33t-78 33t-33 78zM156 0v922h159v-922h-159z" /> +<glyph unicode="j" horiz-adv-x="471" d="M-66 -352q221 43 222 338v936h159v-906q0 -233 -84 -354t-247 -147zM125 1266q0 45 31.5 77.5t79 32.5t79 -32.5t31.5 -77.5t-31.5 -78t-79 -33t-79 33t-31.5 78z" /> +<glyph unicode="k" horiz-adv-x="966" d="M156 0v1434l159 28v-895h23l364 355h213l-430 -408l469 -514h-215l-399 449h-25v-449h-159z" /> +<glyph unicode="l" horiz-adv-x="471" d="M156 0v1434l159 28v-1462h-159z" /> +<glyph unicode="m" horiz-adv-x="1646" d="M152 0v907l159 29v-178q176 188 371 188q184 0 221 -184q184 184 367 184q104 0 167.5 -67.5t63.5 -208.5v-670h-160v625q0 180 -114 180q-121 0 -314 -180v-625h-159v625q0 180 -115 180q-133 0 -328 -195v-610h-159z" /> +<glyph unicode="n" horiz-adv-x="1079" d="M152 0v907l159 29v-180q184 190 381 190q111 0 176.5 -67.5t65.5 -208.5v-670h-160v625q0 180 -125 180q-135 0 -338 -197v-608h-159z" /> +<glyph unicode="o" horiz-adv-x="1091" d="M90 457q0 121 49 229.5t156.5 184t253.5 75.5q205 0 328.5 -139t123.5 -328q0 -119 -48 -230.5t-157.5 -192.5t-254.5 -81q-205 0 -328 143.5t-123 338.5zM258 475.5q0 -149.5 74 -255t215 -105.5q129 0 208 94t79 244q0 147 -72 250.5t-217 103.5q-131 0 -209 -91 t-78 -240.5z" /> +<glyph unicode="p" horiz-adv-x="1073" d="M152 -475v1382l155 29v-143q37 66 108.5 109.5t174.5 43.5q176 0 283.5 -131t107.5 -328q0 -215 -128 -363.5t-335 -148.5q-133 0 -207 58v-479zM311 231q0 -121 174 -120q150 0 238 97t88 267q0 152 -67.5 240t-174.5 88q-150 0 -258 -158v-414z" /> +<glyph unicode="q" horiz-adv-x="1067" d="M92 430q0 215 133 365.5t381 150.5l309 -41v-1351l-159 -29v573q-84 -123 -267 -123q-180 0 -288.5 129t-108.5 326zM260 440q0 -147 68.5 -234t181.5 -87q131 0 246 121v551q-70 20 -158 20q-152 0 -245 -96.5t-93 -274.5z" /> +<glyph unicode="r" horiz-adv-x="684" d="M152 0v907l159 29v-182q39 70 107.5 131t161.5 61q23 0 43 -4t28 -8l8 -6l-41 -172q-41 16 -77 16q-121 0 -230 -188v-584h-159z" /> +<glyph unicode="s" horiz-adv-x="804" d="M86 57l35 142q117 -90 264 -90q84 0 128 32.5t44 87.5q0 53 -47 94.5t-112.5 71t-132 63.5t-114 93t-47.5 141q0 113 84 183.5t252 70.5q70 0 133.5 -12t94.5 -25l28 -14l-43 -135q-111 53 -225 53q-80 0 -121 -29.5t-41 -78.5q0 -51 47 -90.5t113 -68t132.5 -63 t113.5 -96t47 -145.5q0 -123 -91 -195t-247 -72q-82 0 -155.5 20.5t-106.5 41.5z" /> +<glyph unicode="t" horiz-adv-x="741" d="M66 793v86l131 53v205l159 39v-254h299v-129h-299v-506q0 -172 113 -172q94 0 195 84l38 -129q-12 -10 -35.5 -25.5t-93 -42.5t-137.5 -27q-240 0 -239 269v549h-131z" /> +<glyph unicode="u" d="M143 252v670h160v-625q0 -180 131 -180q139 0 311 172v633h160v-637q0 -49 10.5 -121t20.5 -119l10 -45l-158 -14q-23 102 -30 168q-166 -178 -365 -179q-250 1 -250 277z" /> +<glyph unicode="v" horiz-adv-x="933" d="M37 922h168l244 -723l290 723h166l-389 -932h-151z" /> +<glyph unicode="w" horiz-adv-x="1517" d="M43 922h168l219 -742l264 742h144l221 -742l260 742h166l-357 -932h-155l-219 702l-260 -702h-156z" /> +<glyph unicode="x" horiz-adv-x="933" d="M55 0l318 461l-318 461h191l223 -338l225 338h185l-318 -457l318 -465h-183l-231 346l-234 -346h-176z" /> +<glyph unicode="y" horiz-adv-x="935" d="M33 922h174l268 -652l260 652h168l-411 -992q-74 -178 -167.5 -288.5t-230.5 -126.5l-51 133q180 37 289 282l59 138z" /> +<glyph unicode="z" horiz-adv-x="888" d="M84 96l491 688h-475v138h686v-97l-499 -688h518v-137h-719z" /> +<glyph unicode="{" horiz-adv-x="696" d="M33 481v113q53 2 96 24.5t69.5 52t46 85t29 95.5t14.5 109.5t5 102.5v98v29q0 166 113.5 247t304.5 81v-105q-98 -6 -153.5 -24.5t-83.5 -63.5t-35 -95t-7 -149q0 -457 -219 -540v-4q94 -37 156.5 -171.5t62.5 -392.5q0 -98 7 -148t35 -94t83 -62.5t154 -26.5v-105 q-418 0 -418 328v29v100q0 37 -5 106.5t-14.5 112.5t-29 99.5t-46 88t-69.5 55t-96 25.5z" /> +<glyph unicode="|" horiz-adv-x="477" d="M172 -461v1995h133v-1995h-133z" /> +<glyph unicode="}" horiz-adv-x="696" d="M-14 -358q98 8 153.5 26.5t83 62.5t34.5 94t7 148q0 258 62.5 392.5t156.5 171.5v4q-219 84 -219 540q0 98 -7 148.5t-34.5 95.5t-83 63.5t-153.5 24.5v105q190 0 303.5 -81t113.5 -247v-29v-98q0 -35 5.5 -102.5t14.5 -109.5t28.5 -95.5t46 -84t69.5 -53t97 -24.5v-113 q-53 -2 -96.5 -25.5t-70 -55t-46 -88t-28.5 -99.5t-14.5 -113.5t-5.5 -105.5v-100v-29q0 -328 -417 -328v105z" /> +<glyph unicode="~" horiz-adv-x="1191" d="M131 358q0 317 266 318q80 0 141.5 -31t93.5 -68.5t76 -68.5t91 -31q135 0 135 191h131q0 -317 -266 -318q-80 0 -141.5 31t-93.5 68.5t-76 68.5t-91 31q-135 0 -135 -191h-131z" /> +<glyph unicode="¡" horiz-adv-x="524" d="M137 823q0 51 36 87t87 36t87 -36t36 -87t-36 -87t-87 -36t-87 36t-36 87zM166 -469l27 989h141l22 -989h-190z" /> +<glyph unicode="¢" horiz-adv-x="921" d="M86 569q0 162 97.5 286t269.5 146l6 181h90l-4 -178q176 -8 278 -113l6 -8l-92 -113q-76 82 -196 94l-17 -588q139 4 246 99l55 -119q-12 -12 -35.5 -31.5t-102.5 -53.5t-167 -34l-4 -182h-90l4 188q-156 27 -250 146.5t-94 279.5zM254 575q0 -100 47 -179t133 -107 l15 571q-92 -20 -143.5 -99.5t-51.5 -185.5z" /> +<glyph unicode="£" horiz-adv-x="1101" d="M82 111q14 4 35.5 14t61.5 57t48 113l23 194h-125v103h137l23 170q49 395 360 395q182 0 295 -113l10 -10l-92 -112q-8 10 -25.5 26.5t-75 43t-118.5 26.5q-84 0 -133 -57.5t-64 -204.5l-16 -164h381l-10 -103h-381q-8 -90 -26.5 -174t-33.5 -122l-14 -39 q184 -66 322 -66q98 0 152 53.5t67 184.5h129q-8 -76 -24.5 -136.5t-50.5 -119t-96.5 -90t-148.5 -31.5q-82 0 -232.5 40t-199.5 40q-61 0 -137 -29z" /> +<glyph unicode="¥" horiz-adv-x="1138" d="M82 1133h182l305 -496l312 496h170l-303 -478h215v-102h-281l-35 -57v-82h316v-103h-316v-311h-160v311h-294v103h294v80l-38 59h-256v102h192z" /> +<glyph unicode="¦" horiz-adv-x="507" d="M180 354h148v-733h-148v733zM180 672v733h148v-733h-148z" /> +<glyph unicode="§" horiz-adv-x="1001" d="M57 -379l62 105q129 -96 270 -97q125 0 190.5 91.5t65.5 236.5q0 70 -10 121l-113 620q-23 131 -22 205q0 135 53 213l113 -22q-35 -76 -35 -189q0 -53 10 -114l123 -697q12 -70 12 -139q0 -190 -96 -315t-287 -125q-86 0 -170 26.5t-125 52.5zM199 948q0 193 97 318 t286 125q86 0 170 -27t125 -53l41 -27l-62 -104q-129 96 -270 96q-125 0 -191.5 -92t-66.5 -236q0 -59 12 -121l113 -620q20 -119 20 -205q0 -137 -51 -213l-113 23q35 82 35 188q0 53 -10 115l-123 696q-12 69 -12 137z" /> +<glyph unicode="¨" horiz-adv-x="1032" d="M225 1266q0 43 32 73.5t75 30.5q41 0 72.5 -30.5t31.5 -73.5t-31.5 -74t-72.5 -31q-43 0 -75 31t-32 74zM594 1266q0 43 31.5 73.5t72.5 30.5q43 0 75 -30.5t32 -73.5t-32 -74t-75 -31q-41 0 -72.5 31t-31.5 74z" /> +<glyph unicode="©" horiz-adv-x="1593" d="M90 682q0 293 207 500t500 207t499.5 -207t206.5 -500t-206.5 -500t-499.5 -207t-500 207t-207 500zM195 682q0 -254 175 -433t427 -179t427 179t175 433t-175 433t-427 179t-427 -179t-175 -433zM401 676q0 172 111 299t307 127q180 0 285 -113l10 -10l-92 -113l-28 27 q-17 16 -73.5 43t-113.5 27q-113 0 -175.5 -78t-62.5 -193q0 -117 72 -197.5t190 -80.5q129 4 224 98l55 -119q-10 -12 -31.5 -32.5t-97.5 -53.5t-162 -33q-182 0 -300 116t-118 286z" /> +<glyph unicode="ª" horiz-adv-x="790" d="M96 874q0 205 389 259v22q0 70 -18 99.5t-80 29.5q-49 0 -101.5 -20.5t-80.5 -40.5l-29 -21l-35 111q111 78 283 78q111 0 155 -47.5t44 -157.5v-283q8 -74 73 -80l-41 -106q-131 6 -159 100q-84 -106 -215 -106q-84 0 -134.5 44.5t-50.5 118.5zM242 885q0 -68 71 -68 q76 0 172 113v108q-127 -23 -185 -59.5t-58 -93.5z" /> +<glyph unicode="«" horiz-adv-x="1046" d="M49 510v8q35 27 285 303l115 125l110 -31l-309 -401l309 -401l-110 -31l-168 182l-111 121l-60 66l-38 38q-11 11 -23 21zM440 510v8q35 27 285 303l115 125l110 -31l-309 -401l309 -401l-110 -31l-168 182l-111 121l-60 66l-38 38q-11 11 -23 21z" /> +<glyph unicode="¬" horiz-adv-x="1177" d="M111 664v133h938v-570h-142v437h-796z" /> +<glyph unicode="­" horiz-adv-x="692" d="M115 438v148h463v-148h-463z" /> +<glyph unicode="®" horiz-adv-x="884" d="M88 1087.5q0 145.5 104.5 250t250 104.5t250 -104.5t104.5 -250t-104.5 -250t-250 -104.5t-250 104.5t-104.5 250zM158 1087.5q0 -120.5 83 -207.5t199.5 -87t201.5 87t85 207q0 119 -85 206t-201.5 87t-199.5 -86t-83 -206.5zM311 918v348h123q143 0 144 -105 q0 -68 -68 -100l104 -143h-94l-88 126h-37v-126h-84zM395 1100h45q51 0 52 53q0 55 -66 55h-31v-108z" /> +<glyph unicode="¯" horiz-adv-x="1011" d="M272 1204v125h467v-125h-467z" /> +<glyph unicode="°" horiz-adv-x="679" d="M90 1144.5q0 102.5 73 174.5t177 72t177 -72t73 -174.5t-73 -174t-177 -71.5t-177 71.5t-73 174zM193 1144.5q0 -63.5 43 -107.5t104 -44t104 44t43 107.5t-43 107.5t-104 44t-104 -44t-43 -107.5z" /> +<glyph unicode="±" d="M78 641v133h381v369h141v-369h385v-133h-385v-395h-141v395h-381zM80 0v133h907v-133h-907z" /> +<glyph unicode="²" horiz-adv-x="698" d="M57 836q213 207 271 274q113 139 112 248q0 63 -37.5 98t-97.5 35q-39 0 -79 -18.5t-62 -36.5l-21 -19l-71 82q10 12 30.5 30.5t90 50.5t143.5 32q117 0 182.5 -66.5t65.5 -171.5q0 -96 -65.5 -201.5t-248.5 -289.5h369v-113h-571z" /> +<glyph unicode="³" horiz-adv-x="661" d="M49 819l55 99q78 -45 172 -46q74 0 117 34t43 89q0 63 -58.5 97t-144.5 34h-47v111q80 6 146.5 53t66.5 117q0 88 -102 88q-39 0 -80 -12.5t-61 -24.5l-21 -14l-53 88q96 80 231 80q100 0 166 -52.5t66 -134.5q0 -131 -166 -213q94 -20 148.5 -77.5t54.5 -135.5 q0 -102 -88 -172.5t-220 -70.5q-59 0 -115.5 15t-82.5 32z" /> +<glyph unicode="´" horiz-adv-x="1032" d="M324 1092l206 340h175l-287 -396z" /> +<glyph unicode="µ" horiz-adv-x="1148" d="M145 -442q20 199 21 362v1002h160v-625q0 -180 131 -180q139 0 311 172v633h160v-684q0 -82 22.5 -102.5t110.5 -20.5v-129q-61 -10 -98 -11q-172 0 -191 170q-164 -170 -356 -170q-61 0 -111 19q2 -88 12.5 -244t10.5 -192h-183z" /> +<glyph unicode="μ" horiz-adv-x="1148" d="M145 -442q20 199 21 362v1002h160v-625q0 -180 131 -180q139 0 311 172v633h160v-684q0 -82 22.5 -102.5t110.5 -20.5v-129q-61 -10 -98 -11q-172 0 -191 170q-164 -170 -356 -170q-61 0 -111 19q2 -88 12.5 -244t10.5 -192h-183z" /> +<glyph unicode="¶" horiz-adv-x="1353" d="M70 864q0 203 154.5 352.5t430.5 149.5h596v-117h-151v-1249h-127v1249h-154v-1290q0 -444 -358 -444l-31 129q133 0 193.5 73.5t60.5 241.5v408h-18q-291 0 -443.5 145t-152.5 352z" /> +<glyph unicode="·" horiz-adv-x="512" d="M133 520q0 51 36 87t87 36t87 -36t36 -87t-36 -87t-87 -36t-87 36t-36 87z" /> +<glyph unicode="¸" horiz-adv-x="1032" d="M336 -422l43 100q66 -57 143 -57q45 0 75 19.5t30 48.5q0 23 -26 41t-57.5 30.5t-57 36t-25.5 53.5q0 25 37 109l18 41h102l-16 -35q-23 -49 -22 -67q0 -23 27.5 -40.5t59 -30.5t59.5 -45t28 -77q0 -76 -65.5 -133t-162.5 -57q-49 0 -97 15t-71 32z" /> +<glyph unicode="¹" horiz-adv-x="575" d="M68 770v104h172v619h-158v104h297v-723h162v-104h-473z" /> +<glyph unicode="º" horiz-adv-x="845" d="M90 1049q0 133 90 237.5t246 104.5q150 0 240 -97.5t90 -230.5t-89 -242.5t-247 -109.5q-150 0 -240 100.5t-90 237.5zM233 1061q0 -100 48.5 -172t142.5 -72q86 0 137 63.5t51 163.5q0 98 -48 169t-142 71q-86 0 -137.5 -61.5t-51.5 -161.5z" /> +<glyph unicode="»" horiz-adv-x="1048" d="M98 113l310 401l-310 401l111 31q362 -397 389 -420q4 -2 10 -8v-8q-12 -10 -22 -21l-38 -38l-61 -66l-110 -121l-168 -182zM489 113l310 401l-310 401l111 31q362 -397 389 -420q4 -2 10 -8v-8q-12 -10 -22 -21l-38 -38l-60 -66l-111 -121l-168 -182z" /> +<glyph unicode="¼" horiz-adv-x="1671" d="M96 549v104h172v619h-157v104h297v-723h161v-104h-473zM354 0l813 1407l117 -43l-784 -1364h-146zM952 295l398 539h125v-510h122v-109h-122v-215h-136v215h-376zM1098 324h241v325z" /> +<glyph unicode="½" horiz-adv-x="1792" d="M94 549v104h172v619h-157v104h297v-723h161v-104h-473zM354 0l813 1407l117 -43l-784 -1364h-146zM1137 66q213 207 270 274q113 139 113 248q0 63 -38 98t-98 35q-39 0 -78.5 -18.5t-60.5 -36.5l-22 -19l-72 82q10 12 30.5 30.5t90 50.5t143.5 32q117 0 182.5 -66.5 t65.5 -171.5q0 -96 -65.5 -201.5t-247.5 -289.5h368v-113h-571z" /> +<glyph unicode="¾" horiz-adv-x="1648" d="M82 598l55 98q78 -45 172 -45q74 0 117 34t43 89q0 63 -58.5 97t-144.5 34h-47v111q80 6 146.5 53t66.5 117q0 88 -102 88q-39 0 -80 -12.5t-62 -24.5l-20 -14l-53 88q96 80 231 80q100 0 166 -52.5t66 -134.5q0 -131 -166 -213q94 -20 148 -77.5t54 -135.5 q0 -102 -88 -172.5t-219 -70.5q-59 0 -115.5 15t-82.5 32zM332 0l813 1407l117 -43l-785 -1364h-145zM930 295l397 539h125v-510h123v-109h-123v-215h-135v215h-377zM1075 324h242v325z" /> +<glyph unicode="¿" horiz-adv-x="716" d="M72 -94q0 49 32.5 101t79.5 103l96 106q48 56 80.5 135t32.5 169h129q6 -29 6 -69q0 -90 -42 -176.5t-92 -141.5t-92 -112.5t-42 -96.5q0 -115 293 -235l82 -31l-35 -152q-20 6 -56 18.5t-127 52.5t-161 83t-127 110.5t-57 135.5zM328 823q0 51 35.5 87t87 36t87 -36 t35.5 -87t-35.5 -87t-87 -36t-87 36t-35.5 87z" /> +<glyph unicode="À" horiz-adv-x="1267" d="M29 0l524 1376h162l524 -1376h-176l-154 412h-557l-153 -412h-170zM356 1616l64 147l395 -194l-39 -99zM406 553h450l-225 602z" /> +<glyph unicode="Á" horiz-adv-x="1267" d="M29 0l524 1376h162l524 -1376h-176l-154 412h-557l-153 -412h-170zM406 553h450l-225 602zM446 1569l396 194l63 -147l-420 -146z" /> +<glyph unicode="Â" horiz-adv-x="1267" d="M29 0l524 1376h162l524 -1376h-176l-154 412h-557l-153 -412h-170zM303 1548l258 236h141l256 -236l-92 -78l-233 203l-238 -203zM406 553h450l-225 602z" /> +<glyph unicode="Ã" horiz-adv-x="1267" d="M29 0l524 1376h162l524 -1376h-176l-154 412h-557l-153 -412h-170zM268 1501v12q0 29 6.5 60t23.5 75t63.5 71.5t113.5 27.5q70 0 123 -34t95 -67.5t83 -33.5q90 0 90 119v16h127v-14q0 -29 -6 -61t-24.5 -77t-65.5 -73.5t-116.5 -28.5t-122 34t-92.5 67.5t-81 33.5 q-90 0 -90 -115v-12h-127zM406 553h450l-225 602z" /> +<glyph unicode="Ä" horiz-adv-x="1267" d="M29 0l524 1376h162l524 -1376h-176l-154 412h-557l-153 -412h-170zM291 1624q0 43 31.5 74t74.5 31q41 0 73 -31t32 -74t-32 -73.5t-73 -30.5q-43 0 -74.5 30.5t-31.5 73.5zM406 553h450l-225 602zM762 1624q0 43 31.5 74t72.5 31q43 0 75 -31t32 -74t-32 -73.5 t-75 -30.5q-41 0 -72.5 30.5t-31.5 73.5z" /> +<glyph unicode="Å" horiz-adv-x="1267" d="M29 0l524 1376h162l524 -1376h-176l-154 412h-557l-153 -412h-170zM406 553h450l-225 602zM438 1622q0 66 50.5 114t142.5 48t142 -48t50 -114q0 -68 -50 -117t-142 -49t-142.5 49t-50.5 117zM535 1620q0 -39 24.5 -66.5t71.5 -27.5q45 0 71.5 28.5t26.5 65.5 q0 39 -25.5 66.5t-72.5 27.5q-49 0 -72.5 -27.5t-23.5 -66.5z" /> +<glyph unicode="Æ" horiz-adv-x="1767" d="M-4 0l762 1366h905v-141h-637v-457h504v-141h-504v-486h635v-141h-803v457h-430l-252 -457h-180zM506 598h352v637z" /> +<glyph unicode="Ç" horiz-adv-x="1384" d="M104 674q0 305 202 511t532 206q121 0 234.5 -30t164.5 -58l53 -29l-67 -152q-18 14 -51 35t-136.5 54.5t-210.5 33.5q-172 0 -298 -83t-184 -207t-58 -269q0 -238 154.5 -401.5t389.5 -163.5q211 0 394 127l14 10l70 -127q-23 -18 -63 -44t-168 -69t-261 -43h-4l-4 -10 q-23 -49 -23 -67q0 -23 28 -40.5t59.5 -30.5t59 -45t27.5 -77q0 -76 -65.5 -133t-161.5 -57q-49 0 -97 15t-71 32l-22 16l43 100q66 -57 143 -57q45 0 74.5 19.5t29.5 48.5q0 23 -25.5 41t-57 30.5t-57 36t-25.5 53.5q0 25 36 109l11 23q-270 33 -439.5 223t-169.5 469z" /> +<glyph unicode="È" horiz-adv-x="1110" d="M201 0v1366h805v-141h-637v-457h503v-141h-503v-486h635v-141h-803zM340 1616l63 147l396 -194l-39 -99z" /> +<glyph unicode="É" horiz-adv-x="1110" d="M201 0v1366h805v-141h-637v-457h503v-141h-503v-486h635v-141h-803zM430 1569l395 194l64 -147l-420 -146z" /> +<glyph unicode="Ê" horiz-adv-x="1110" d="M201 0v1366h805v-141h-637v-457h503v-141h-503v-486h635v-141h-803zM287 1548l258 236h141l256 -236l-92 -78l-234 203l-237 -203z" /> +<glyph unicode="Ë" horiz-adv-x="1110" d="M201 0v1366h805v-141h-637v-457h503v-141h-503v-486h635v-141h-803zM274 1624q0 43 32 74t75 31q41 0 72.5 -31t31.5 -74t-31.5 -73.5t-72.5 -30.5q-43 0 -75 30.5t-32 73.5zM745 1624q0 43 32 74t73 31q43 0 74.5 -31t31.5 -74t-31.5 -73.5t-74.5 -30.5q-41 0 -73 30.5 t-32 73.5z" /> +<glyph unicode="Ì" horiz-adv-x="569" d="M10 1616l64 147l395 -194l-39 -99zM201 0v1366h168v-1366h-168z" /> +<glyph unicode="Í" horiz-adv-x="569" d="M100 1569l396 194l63 -147l-420 -146zM201 0v1366h168v-1366h-168z" /> +<glyph unicode="Î" horiz-adv-x="569" d="M-43 1548l258 236h141l256 -236l-92 -78l-233 203l-238 -203zM201 0v1366h168v-1366h-168z" /> +<glyph unicode="Ï" horiz-adv-x="569" d="M-2 1624q0 43 31.5 74t74.5 31q41 0 73 -31t32 -74t-32 -73.5t-73 -30.5q-43 0 -74.5 30.5t-31.5 73.5zM201 0v1366h168v-1366h-168zM367 1624q0 43 31.5 74t72.5 31q43 0 75 -31t32 -74t-32 -73.5t-75 -30.5q-41 0 -72.5 30.5t-31.5 73.5z" /> +<glyph unicode="Ð" horiz-adv-x="1497" d="M70 623v141h147v602h414q147 0 277 -36t241 -111.5t176.5 -207.5t65.5 -306q0 -336 -229.5 -520.5t-608.5 -184.5h-336v623h-147zM385 141h147q350 0 513 149.5t163 395.5q0 250 -157.5 394.5t-448.5 144.5h-217v-461h352v-141h-352v-482z" /> +<glyph unicode="Ñ" horiz-adv-x="1529" d="M201 0v1366h168l796 -1114v1114h164v-1366h-168l-796 1098v-1098h-164zM401 1501v12q0 29 6.5 60t24 75t63.5 71.5t113 27.5q70 0 123 -34t95 -67.5t83 -33.5q90 0 90 119v16h127v-14q0 -29 -6 -61t-24.5 -77t-65.5 -73.5t-116.5 -28.5t-122 34t-92.5 67.5t-81 33.5 q-90 0 -90 -115v-12h-127z" /> +<glyph unicode="Ò" horiz-adv-x="1628" d="M102 680q0 184 82 344t250 263.5t389 103.5q313 0 508 -196t195 -486q0 -299 -203 -516.5t-518 -217.5q-307 0 -505 207t-198 498zM283 692q0 -221 144 -396t384 -175q242 0 388.5 173t146.5 398q0 223 -144.5 388t-388.5 165q-242 0 -386 -166t-144 -387zM539 1616 l63 147l395 -194l-39 -99z" /> +<glyph unicode="Ó" horiz-adv-x="1628" d="M102 680q0 184 82 344t250 263.5t389 103.5q313 0 508 -196t195 -486q0 -299 -203 -516.5t-518 -217.5q-307 0 -505 207t-198 498zM283 692q0 -221 144 -396t384 -175q242 0 388.5 173t146.5 398q0 223 -144.5 388t-388.5 165q-242 0 -386 -166t-144 -387zM629 1569 l395 194l63 -147l-419 -146z" /> +<glyph unicode="Ô" horiz-adv-x="1628" d="M102 680q0 184 82 344t250 263.5t389 103.5q313 0 508 -196t195 -486q0 -299 -203 -516.5t-518 -217.5q-307 0 -505 207t-198 498zM283 692q0 -221 144 -396t384 -175q242 0 388.5 173t146.5 398q0 223 -144.5 388t-388.5 165q-242 0 -386 -166t-144 -387zM485 1548 l258 236h142l256 -236l-92 -78l-234 203l-237 -203z" /> +<glyph unicode="Õ" horiz-adv-x="1628" d="M102 680q0 184 82 344t250 263.5t389 103.5q313 0 508 -196t195 -486q0 -299 -203 -516.5t-518 -217.5q-307 0 -505 207t-198 498zM283 692q0 -221 144 -396t384 -175q242 0 388.5 173t146.5 398q0 223 -144.5 388t-388.5 165q-242 0 -386 -166t-144 -387zM451 1501v12 q0 29 6 60t23.5 75t63.5 71.5t113 27.5q70 0 123.5 -34t95.5 -67.5t82 -33.5q90 0 91 119v16h127v-14q0 -29 -6.5 -61t-25 -77t-65.5 -73.5t-116.5 -28.5t-122 34t-92 67.5t-80.5 33.5q-90 0 -90 -115v-12h-127z" /> +<glyph unicode="Ö" horiz-adv-x="1628" d="M102 680q0 184 82 344t250 263.5t389 103.5q313 0 508 -196t195 -486q0 -299 -203 -516.5t-518 -217.5q-307 0 -505 207t-198 498zM283 692q0 -221 144 -396t384 -175q242 0 388.5 173t146.5 398q0 223 -144.5 388t-388.5 165q-242 0 -386 -166t-144 -387zM473 1624 q0 43 32 74t75 31q41 0 72.5 -31t31.5 -74t-31.5 -73.5t-72.5 -30.5q-43 0 -75 30.5t-32 73.5zM944 1624q0 43 32 74t73 31q43 0 74.5 -31t31.5 -74t-31.5 -73.5t-74.5 -30.5q-41 0 -73 30.5t-32 73.5z" /> +<glyph unicode="×" d="M82 143l358 369l-358 371l90 94l360 -371l361 371l90 -94l-360 -371l360 -369l-92 -94l-359 369l-358 -369z" /> +<glyph unicode="Ø" horiz-adv-x="1628" d="M102 680q0 184 82 344t250 263.5t389 103.5q215 0 381 -99l103 135h135l-150 -196q233 -199 234 -522q0 -299 -203 -516.5t-518 -217.5q-219 0 -385 109l-111 -145h-137l160 211q-230 206 -230 530zM283 692q0 -238 153 -407l668 878q-125 82 -291 82q-242 0 -386 -167 t-144 -386zM516 211q131 -90 295 -90q242 0 388.5 173t146.5 398q0 240 -158 402z" /> +<glyph unicode="Ù" horiz-adv-x="1472" d="M182 492v874h168v-842q0 -205 105.5 -304t281.5 -99q174 0 279.5 98t105.5 293v854h168v-846q0 -258 -157.5 -401.5t-397.5 -143.5q-248 0 -400.5 126.5t-152.5 390.5zM461 1616l63 147l396 -194l-39 -99z" /> +<glyph unicode="Ú" horiz-adv-x="1472" d="M182 492v874h168v-842q0 -205 105.5 -304t281.5 -99q174 0 279.5 98t105.5 293v854h168v-846q0 -258 -157.5 -401.5t-397.5 -143.5q-248 0 -400.5 126.5t-152.5 390.5zM551 1569l395 194l64 -147l-420 -146z" /> +<glyph unicode="Û" horiz-adv-x="1472" d="M182 492v874h168v-842q0 -205 105.5 -304t281.5 -99q174 0 279.5 98t105.5 293v854h168v-846q0 -258 -157.5 -401.5t-397.5 -143.5q-248 0 -400.5 126.5t-152.5 390.5zM408 1548l258 236h141l256 -236l-92 -78l-234 203l-237 -203z" /> +<glyph unicode="Ü" horiz-adv-x="1472" d="M182 492v874h168v-842q0 -205 105.5 -304t281.5 -99q174 0 279.5 98t105.5 293v854h168v-846q0 -258 -157.5 -401.5t-397.5 -143.5q-248 0 -400.5 126.5t-152.5 390.5zM395 1624q0 43 32 74t75 31q41 0 72.5 -31t31.5 -74t-31.5 -73.5t-72.5 -30.5q-43 0 -75 30.5 t-32 73.5zM866 1624q0 43 32 74t73 31q43 0 74.5 -31t31.5 -74t-31.5 -73.5t-74.5 -30.5q-41 0 -73 30.5t-32 73.5z" /> +<glyph unicode="Ý" horiz-adv-x="1177" d="M16 1366h199l377 -608l381 608h188l-487 -770v-596h-168v594zM416 1569l395 194l63 -147l-419 -146z" /> +<glyph unicode="Þ" horiz-adv-x="1148" d="M201 0v1366h168v-311h258q242 0 349 -101.5t107 -261.5q0 -188 -121.5 -292.5t-334.5 -104.5h-258v-295h-168zM369 436h227q307 0 307 242q0 236 -307 235h-227v-477z" /> +<glyph unicode="ß" horiz-adv-x="1157" d="M57 793v84l146 55v78q0 219 102.5 339.5t292.5 120.5q164 0 255 -85t91 -199q0 -76 -49 -150l-98 -142q-49 -69 -49 -134q0 -57 35.5 -107.5t86.5 -90.5l102 -83q50 -43 86 -103.5t36 -133.5q0 -123 -91.5 -195t-242.5 -72q-78 0 -144.5 18.5t-95.5 39.5l-28 18l34 142 q102 -84 238 -84q78 0 120 33.5t42 90.5q0 51 -35 97.5t-86 85.5l-102 81q-50 42 -84.5 103.5t-34.5 134.5q0 68 29.5 131.5t66.5 103.5t66.5 94t29.5 107q0 76 -55 118t-133 42q-100 0 -163 -76.5t-63 -236.5v-1018h-159v793h-146z" /> +<glyph unicode="à" horiz-adv-x="960" d="M74 207q0 141 143 230t410 124v35q0 45 -1 65.5t-8.5 54.5t-22.5 49t-45 28.5t-75 13.5q-150 -2 -289 -102l-49 129q16 12 49 30.5t132.5 50t201.5 31.5q147 0 206.5 -67.5t59.5 -225.5v-415q0 -104 88 -121l15 -2l-53 -129q-164 18 -199 149q-10 -16 -30.5 -37.5 t-57.5 -52.5t-94.5 -50.5t-122.5 -19.5q-117 0 -187.5 65t-70.5 167zM170 1432h174l207 -340l-94 -56zM244 217q0 -102 121 -102q125 0 262 159v170q-199 -33 -291 -86t-92 -141z" /> +<glyph unicode="á" horiz-adv-x="960" d="M74 207q0 141 143 230t410 124v35q0 45 -1 65.5t-8.5 54.5t-22.5 49t-45 28.5t-75 13.5q-150 -2 -289 -102l-49 129q16 12 49 30.5t132.5 50t201.5 31.5q147 0 206.5 -67.5t59.5 -225.5v-415q0 -104 88 -121l15 -2l-53 -129q-164 18 -199 149q-10 -16 -30.5 -37.5 t-57.5 -52.5t-94.5 -50.5t-122.5 -19.5q-117 0 -187.5 65t-70.5 167zM244 217q0 -102 121 -102q125 0 262 159v170q-199 -33 -291 -86t-92 -141zM375 1092l207 340h174l-287 -396z" /> +<glyph unicode="â" horiz-adv-x="960" d="M74 207q0 141 143 230t410 124v35q0 45 -1 65.5t-8.5 54.5t-22.5 49t-45 28.5t-75 13.5q-150 -2 -289 -102l-49 129q16 12 49 30.5t132.5 50t201.5 31.5q147 0 206.5 -67.5t59.5 -225.5v-415q0 -104 88 -121l15 -2l-53 -129q-164 18 -199 149q-10 -16 -30.5 -37.5 t-57.5 -52.5t-94.5 -50.5t-122.5 -19.5q-117 0 -187.5 65t-70.5 167zM178 1085l230 347h110l230 -347l-101 -51l-184 256l-184 -256zM244 217q0 -102 121 -102q125 0 262 159v170q-199 -33 -291 -86t-92 -141z" /> +<glyph unicode="ã" horiz-adv-x="960" d="M74 207q0 141 143 230t410 124v35q0 45 -1 65.5t-8.5 54.5t-22.5 49t-45 28.5t-75 13.5q-150 -2 -289 -102l-49 129q16 12 49 30.5t132.5 50t201.5 31.5q147 0 206.5 -67.5t59.5 -225.5v-415q0 -104 88 -121l15 -2l-53 -129q-164 18 -199 149q-10 -16 -30.5 -37.5 t-57.5 -52.5t-94.5 -50.5t-122.5 -19.5q-117 0 -187.5 65t-70.5 167zM162 1130v11q0 20 2 42.5t12 60.5t27.5 65.5t51.5 49t81 21.5q49 0 90 -24.5t61.5 -54t46 -54t50.5 -24.5q61 0 69 131v14h111v-10q0 -29 -5 -60.5t-20.5 -79t-55.5 -78t-97 -30.5q-49 0 -89 24.5 t-60.5 54.5t-46 54.5t-50.5 24.5q-68 0 -68 -129v-9h-110zM244 217q0 -102 121 -102q125 0 262 159v170q-199 -33 -291 -86t-92 -141z" /> +<glyph unicode="ä" horiz-adv-x="960" d="M74 207q0 141 143 230t410 124v35q0 45 -1 65.5t-8.5 54.5t-22.5 49t-45 28.5t-75 13.5q-150 -2 -289 -102l-49 129q16 12 49 30.5t132.5 50t201.5 31.5q147 0 206.5 -67.5t59.5 -225.5v-415q0 -104 88 -121l15 -2l-53 -129q-164 18 -199 149q-10 -16 -30.5 -37.5 t-57.5 -52.5t-94.5 -50.5t-122.5 -19.5q-117 0 -187.5 65t-70.5 167zM172 1266q0 43 32 73.5t75 30.5q41 0 72.5 -30.5t31.5 -73.5t-32 -74t-72 -31q-43 0 -75 31t-32 74zM244 217q0 -102 121 -102q125 0 262 159v170q-199 -33 -291 -86t-92 -141zM541 1266q0 43 31.5 73.5 t72.5 30.5q43 0 75 -30.5t32 -73.5t-32 -74t-75 -31q-41 0 -72.5 31t-31.5 74z" /> +<glyph unicode="å" horiz-adv-x="960" d="M74 207q0 141 143 230t410 124v35q0 45 -1 65.5t-8.5 54.5t-22.5 49t-45 28.5t-75 13.5q-150 -2 -289 -102l-49 129q16 12 49 30.5t132.5 50t201.5 31.5q147 0 206.5 -67.5t59.5 -225.5v-415q0 -104 88 -121l15 -2l-53 -129q-164 18 -199 149q-10 -16 -30.5 -37.5 t-57.5 -52.5t-94.5 -50.5t-122.5 -19.5q-117 0 -187.5 65t-70.5 167zM244 217q0 -102 121 -102q125 0 262 159v170q-199 -33 -291 -86t-92 -141zM274 1269.5q0 69.5 48.5 118t140.5 48.5t140 -48.5t48 -118t-48 -120.5t-140 -51t-140.5 51t-48.5 120.5zM369 1268 q0 -37 23.5 -63.5t70.5 -26.5t71.5 26.5t24.5 63.5t-23.5 62.5t-72.5 25.5q-94 0 -94 -88z" /> +<glyph unicode="æ" horiz-adv-x="1538" d="M74 207q0 131 147.5 219t425.5 121v49q0 57 -3 85t-16.5 62.5t-46 49t-87.5 14.5q-72 0 -149 -25.5t-118 -52.5l-41 -24l-49 129q18 12 50 30.5t131.5 50t197.5 31.5q201 0 250 -139q123 139 311 139q162 0 264.5 -108.5t102.5 -296.5l-98 -29l-545 -72q10 -143 91 -234 t214 -91q72 0 143.5 28.5t106.5 57.5l35 26l57 -116q-14 -14 -43 -37t-123 -61t-195 -38q-266 0 -380 222q-41 -88 -130.5 -155t-216.5 -67q-125 0 -205.5 66t-80.5 166zM244 217q0 -102 137 -102q117 0 187.5 83t70.5 230q-395 -57 -395 -211zM807 563l461 60q0 8 -3 20 t-15.5 45t-33 58.5t-61.5 46t-94 20.5q-102 0 -169 -68.5t-85 -181.5z" /> +<glyph unicode="ç" horiz-adv-x="933" d="M90 451q0 201 128 348t343 147q88 0 163 -24.5t107 -49.5l31 -26l-71 -125q-10 10 -31 24.5t-83.5 38t-125.5 23.5q-133 0 -213 -100.5t-80 -247.5q0 -145 81 -244.5t218 -99.5q143 4 250 98l55 -119q-12 -12 -35.5 -32.5t-106.5 -53.5t-175 -33h-6l-7 -12 q-23 -49 -22 -67q0 -23 27.5 -40.5t59.5 -30.5t59.5 -45t27.5 -77q0 -76 -65.5 -133t-161.5 -57q-49 0 -97.5 16t-70.5 33l-23 14l43 100q66 -57 144 -57q45 0 74.5 19.5t29.5 48.5q0 23 -25.5 41t-57.5 30.5t-57.5 36t-25.5 53.5q0 25 37 109l12 29q-160 33 -255 161 t-95 304z" /> +<glyph unicode="è" horiz-adv-x="997" d="M92 440q0 219 124 362.5t319 143.5q164 0 266 -109.5t102 -301.5l-98 -29l-543 -72q10 -145 91 -232t214 -87q70 0 142.5 28.5t109.5 57.5l37 30l47 -122q-14 -14 -43 -37t-121 -60t-190 -37q-217 0 -337 135t-120 330zM221 1432h174l207 -340l-94 -56zM264 557l463 59 q0 8 -3 21.5t-15.5 47.5t-33 59.5t-60.5 47t-91 21.5q-106 0 -174 -71.5t-86 -184.5z" /> +<glyph unicode="é" horiz-adv-x="997" d="M92 440q0 219 124 362.5t319 143.5q164 0 266 -109.5t102 -301.5l-98 -29l-543 -72q10 -145 91 -232t214 -87q70 0 142.5 28.5t109.5 57.5l37 30l47 -122q-14 -14 -43 -37t-121 -60t-190 -37q-217 0 -337 135t-120 330zM264 557l463 59q0 8 -3 21.5t-15.5 47.5t-33 59.5 t-60.5 47t-91 21.5q-106 0 -174 -71.5t-86 -184.5zM426 1092l207 340h174l-287 -396z" /> +<glyph unicode="ê" horiz-adv-x="997" d="M92 440q0 219 124 362.5t319 143.5q164 0 266 -109.5t102 -301.5l-98 -29l-543 -72q10 -145 91 -232t214 -87q70 0 142.5 28.5t109.5 57.5l37 30l47 -122q-14 -14 -43 -37t-121 -60t-190 -37q-217 0 -337 135t-120 330zM229 1085l230 347h110l230 -347l-101 -51l-184 256 l-184 -256zM264 557l463 59q0 8 -3 21.5t-15.5 47.5t-33 59.5t-60.5 47t-91 21.5q-106 0 -174 -71.5t-86 -184.5z" /> +<glyph unicode="ë" horiz-adv-x="997" d="M92 440q0 219 124 362.5t319 143.5q164 0 266 -109.5t102 -301.5l-98 -29l-543 -72q10 -145 91 -232t214 -87q70 0 142.5 28.5t109.5 57.5l37 30l47 -122q-14 -14 -43 -37t-121 -60t-190 -37q-217 0 -337 135t-120 330zM223 1266q0 43 32 73.5t75 30.5q41 0 72.5 -30.5 t31.5 -73.5t-31.5 -74t-72.5 -31q-43 0 -75 31t-32 74zM264 557l463 59q0 8 -3 21.5t-15.5 47.5t-33 59.5t-60.5 47t-91 21.5q-106 0 -174 -71.5t-86 -184.5zM592 1266q0 43 31.5 73.5t72.5 30.5q43 0 75 -30.5t32 -73.5t-32 -74t-75 -31q-41 0 -72.5 31t-31.5 74z" /> +<glyph unicode="ì" horiz-adv-x="471" d="M-57 1432h174l207 -340l-95 -56zM156 0v922h159v-922h-159z" /> +<glyph unicode="í" horiz-adv-x="471" d="M147 1092l207 340h174l-286 -396zM156 0v922h159v-922h-159z" /> +<glyph unicode="î" horiz-adv-x="471" d="M-49 1085l229 347h111l229 -347l-100 -51l-184 256l-185 -256zM156 0v922h159v-922h-159z" /> +<glyph unicode="ï" horiz-adv-x="471" d="M-55 1266q0 43 31.5 73.5t74.5 30.5q41 0 73 -30.5t32 -73.5t-32 -74t-73 -31q-43 0 -74.5 31t-31.5 74zM156 0v922h159v-922h-159zM313 1266q0 43 32 73.5t73 30.5q43 0 74.5 -30.5t31.5 -73.5t-31.5 -74t-74.5 -31q-41 0 -73 31t-32 74z" /> +<glyph unicode="ð" horiz-adv-x="1103" d="M90 449q0 199 128 348t319 149q166 0 247 -88q-74 197 -231 334l-258 -158l-59 103l215 131q-131 80 -281 123l35 125q215 -43 385 -164l282 172l58 -103l-244 -147q145 -135 225 -317.5t80 -383.5q0 -270 -125 -434t-344 -164q-197 0 -314.5 143t-117.5 331zM258 465 q0 -135 71.5 -242.5t203 -107.5t214 110.5t82.5 337.5q0 111 -62 177.5t-189 66.5q-141 0 -230.5 -96t-89.5 -246z" /> +<glyph unicode="ñ" horiz-adv-x="1079" d="M152 0v907l159 29v-180q184 190 381 190q111 0 176.5 -67.5t65.5 -208.5v-670h-160v625q0 180 -125 180q-135 0 -338 -197v-608h-159zM250 1130v11q0 20 2 42.5t12 60.5t27.5 65.5t51.5 49t81 21.5q49 0 90 -24.5t61.5 -54t46 -54t50.5 -24.5q61 0 69 131v14h111v-10 q0 -29 -5 -60.5t-20.5 -79t-55.5 -78t-97 -30.5q-49 0 -89 24.5t-60.5 54.5t-46 54.5t-50.5 24.5q-68 0 -68 -129v-9h-110z" /> +<glyph unicode="ò" horiz-adv-x="1091" d="M90 457q0 121 49 229.5t156.5 184t253.5 75.5q205 0 328.5 -139t123.5 -328q0 -119 -48 -230.5t-157.5 -192.5t-254.5 -81q-205 0 -328 143.5t-123 338.5zM252 1432h174l207 -340l-94 -56zM258 475.5q0 -149.5 74 -255t215 -105.5q129 0 208 94t79 244q0 147 -72 250.5 t-217 103.5q-131 0 -209 -91t-78 -240.5z" /> +<glyph unicode="ó" horiz-adv-x="1091" d="M90 457q0 121 49 229.5t156.5 184t253.5 75.5q205 0 328.5 -139t123.5 -328q0 -119 -48 -230.5t-157.5 -192.5t-254.5 -81q-205 0 -328 143.5t-123 338.5zM258 475.5q0 -149.5 74 -255t215 -105.5q129 0 208 94t79 244q0 147 -72 250.5t-217 103.5q-131 0 -209 -91 t-78 -240.5zM457 1092l207 340h174l-287 -396z" /> +<glyph unicode="ô" horiz-adv-x="1091" d="M90 457q0 121 49 229.5t156.5 184t253.5 75.5q205 0 328.5 -139t123.5 -328q0 -119 -48 -230.5t-157.5 -192.5t-254.5 -81q-205 0 -328 143.5t-123 338.5zM258 475.5q0 -149.5 74 -255t215 -105.5q129 0 208 94t79 244q0 147 -72 250.5t-217 103.5q-131 0 -209 -91 t-78 -240.5zM260 1085l229 347h111l229 -347l-100 -51l-184 256l-185 -256z" /> +<glyph unicode="õ" horiz-adv-x="1091" d="M90 457q0 121 49 229.5t156.5 184t253.5 75.5q205 0 328.5 -139t123.5 -328q0 -119 -48 -230.5t-157.5 -192.5t-254.5 -81q-205 0 -328 143.5t-123 338.5zM244 1130v11q0 20 2 42.5t12 60.5t27.5 65.5t51.5 49t81 21.5q49 0 90 -24.5t61.5 -54t46 -54t50.5 -24.5 q61 0 69 131v14h111v-10q0 -29 -5 -60.5t-20.5 -79t-55.5 -78t-97 -30.5q-49 0 -89 24.5t-60.5 54.5t-46.5 54.5t-50 24.5q-68 0 -68 -129v-9h-110zM258 475.5q0 -149.5 74 -255t215 -105.5q129 0 208 94t79 244q0 147 -72 250.5t-217 103.5q-131 0 -209 -91t-78 -240.5z " /> +<glyph unicode="ö" horiz-adv-x="1091" d="M90 457q0 121 49 229.5t156.5 184t253.5 75.5q205 0 328.5 -139t123.5 -328q0 -119 -48 -230.5t-157.5 -192.5t-254.5 -81q-205 0 -328 143.5t-123 338.5zM254 1266q0 43 31.5 73.5t74.5 30.5q41 0 73 -30.5t32 -73.5t-32 -74t-73 -31q-43 0 -74.5 31t-31.5 74z M258 475.5q0 -149.5 74 -255t215 -105.5q129 0 208 94t79 244q0 147 -72 250.5t-217 103.5q-131 0 -209 -91t-78 -240.5zM623 1266q0 43 31.5 73.5t72.5 30.5q43 0 75 -30.5t32 -73.5t-32 -74t-75 -31q-41 0 -72.5 31t-31.5 74z" /> +<glyph unicode="÷" d="M74 446v134h917v-134h-917zM410 121q0 51 35.5 87t87 36t87 -36t35.5 -87t-35.5 -87t-87 -36t-87 36t-35.5 87zM410 905q0 51 35.5 87t87 36t87 -36t35.5 -87t-35.5 -87t-87 -36t-87 36t-35.5 87z" /> +<glyph unicode="ø" horiz-adv-x="1091" d="M90 457q0 121 49 229.5t156.5 184t253.5 75.5q137 0 244 -69l79 106h127l-127 -172q129 -139 129 -332q0 -119 -48 -230.5t-157.5 -192.5t-254.5 -81q-137 0 -240 68l-78 -104h-129l127 170q-131 141 -131 348zM258 475q0 -141 61 -235l386 518q-66 49 -160 49 q-131 0 -209 -91t-78 -241zM389 162q70 -47 158 -47q129 0 208 94t79 244q0 133 -58 229z" /> +<glyph unicode="ù" horiz-adv-x="1067" d="M145 252v670h160v-625q0 -180 131 -180q139 0 312 172v633h159v-637q0 -49 10.5 -121t20.5 -119l10 -45l-157 -14q-23 102 -31 168q-166 -178 -365 -179q-250 1 -250 277zM236 1432h174l206 -340l-94 -56z" /> +<glyph unicode="ú" horiz-adv-x="1067" d="M145 252v670h160v-625q0 -180 131 -180q139 0 312 172v633h159v-637q0 -49 10.5 -121t20.5 -119l10 -45l-157 -14q-23 102 -31 168q-166 -178 -365 -179q-250 1 -250 277zM440 1092l207 340h174l-286 -396z" /> +<glyph unicode="û" horiz-adv-x="1067" d="M145 252v670h160v-625q0 -180 131 -180q139 0 312 172v633h159v-637q0 -49 10.5 -121t20.5 -119l10 -45l-157 -14q-23 102 -31 168q-166 -178 -365 -179q-250 1 -250 277zM244 1085l229 347h111l229 -347l-100 -51l-185 256l-184 -256z" /> +<glyph unicode="ü" horiz-adv-x="1067" d="M145 252v670h160v-625q0 -180 131 -180q139 0 312 172v633h159v-637q0 -49 10.5 -121t20.5 -119l10 -45l-157 -14q-23 102 -31 168q-166 -178 -365 -179q-250 1 -250 277zM238 1266q0 43 31.5 73.5t74.5 30.5q41 0 73 -30.5t32 -73.5t-32 -74t-73 -31q-43 0 -74.5 31 t-31.5 74zM606 1266q0 43 32 73.5t73 30.5q43 0 74.5 -30.5t31.5 -73.5t-31.5 -74t-74.5 -31q-41 0 -73 31t-32 74z" /> +<glyph unicode="ý" horiz-adv-x="935" d="M33 922h174l268 -652l260 652h168l-411 -992q-74 -178 -167.5 -288.5t-230.5 -126.5l-51 133q180 37 289 282l59 138zM389 1092l207 340h174l-287 -396z" /> +<glyph unicode="þ" horiz-adv-x="1077" d="M156 -475v1909l159 28v-663q88 147 279 147q178 0 284.5 -131t106.5 -330q0 -213 -129 -361.5t-344 -148.5q-131 0 -197 56v-477zM315 231q0 -117 172 -116q154 0 241 96t87 264q0 152 -67.5 240t-174.5 88q-150 0 -258 -158v-414z" /> +<glyph unicode="ÿ" horiz-adv-x="935" d="M33 922h174l268 -652l260 652h168l-411 -992q-74 -178 -167.5 -288.5t-230.5 -126.5l-51 133q180 37 289 282l59 138zM186 1266q0 43 32 73.5t75 30.5q41 0 72.5 -30.5t31.5 -73.5t-31.5 -74t-72.5 -31q-43 0 -75 31t-32 74zM555 1266q0 43 31.5 73.5t72.5 30.5 q43 0 75 -30.5t32 -73.5t-32 -74t-75 -31q-41 0 -72.5 31t-31.5 74z" /> +<glyph unicode="Œ" horiz-adv-x="2009" d="M102 680q0 139 47.5 265t137.5 226.5t235.5 160t325.5 59.5q127 0 256 -25h801v-141h-637v-457h504v-141h-504v-486h635v-141h-803q-141 -25 -269 -25q-334 0 -531.5 204t-197.5 501zM283 692q0 -100 31.5 -197.5t96 -183.5t176 -138t255 -52t258.5 20v1073 q-117 31 -264 31q-264 0 -408.5 -164t-144.5 -389z" /> +<glyph unicode="œ" horiz-adv-x="1738" d="M90 457q0 121 49 229.5t156.5 184t253.5 75.5q244 0 375 -201q119 201 352 201q164 0 266.5 -109.5t102.5 -301.5l-99 -29l-549 -72q10 -145 92 -232t220 -87q70 0 140.5 28.5t106.5 57.5l35 26l58 -116q-16 -14 -45 -37t-122 -61t-192 -38q-254 0 -377 203 q-131 -203 -372 -203q-205 0 -328 143.5t-123 338.5zM258 475.5q0 -149.5 74 -255t215 -105.5q129 0 208 94t79 244q0 147 -72 250.5t-217 103.5q-131 0 -209 -91t-78 -240.5zM999 555l469 61q0 8 -3 21.5t-15 47.5t-32.5 59.5t-60.5 47t-91 21.5q-111 0 -180 -71.5 t-87 -186.5z" /> +<glyph unicode="Ÿ" horiz-adv-x="1177" d="M16 1366h199l377 -608l381 608h188l-487 -770v-596h-168v594zM260 1624q0 43 32 74t75 31q41 0 72.5 -31t31.5 -74t-31.5 -73.5t-72.5 -30.5q-43 0 -75 30.5t-32 73.5zM731 1624q0 43 32 74t73 31q43 0 74.5 -31t31.5 -74t-31.5 -73.5t-74.5 -30.5q-41 0 -73 30.5 t-32 73.5z" /> +<glyph unicode="ˆ" horiz-adv-x="1032" d="M231 1085l230 347h110l230 -347l-101 -51l-184 256l-184 -256z" /> +<glyph unicode="˜" horiz-adv-x="1032" d="M215 1130v11q0 20 2 42.5t12.5 60.5t27.5 65.5t51 49t81 21.5q49 0 90 -24.5t61.5 -54t46 -54t50.5 -24.5q61 0 70 131v14h110v-10q0 -29 -5 -60.5t-20.5 -79t-55.5 -78t-97 -30.5q-49 0 -89 24.5t-60.5 54.5t-46 54.5t-50.5 24.5q-68 0 -67 -129v-9h-111z" /> +<glyph unicode=" " horiz-adv-x="892" /> +<glyph unicode=" " horiz-adv-x="1784" /> +<glyph unicode=" " horiz-adv-x="892" /> +<glyph unicode=" " horiz-adv-x="1784" /> +<glyph unicode=" " horiz-adv-x="594" /> +<glyph unicode=" " horiz-adv-x="446" /> +<glyph unicode=" " horiz-adv-x="297" /> +<glyph unicode=" " horiz-adv-x="297" /> +<glyph unicode=" " horiz-adv-x="223" /> +<glyph unicode=" " horiz-adv-x="356" /> +<glyph unicode=" " horiz-adv-x="99" /> +<glyph unicode="‐" horiz-adv-x="692" d="M115 438v148h463v-148h-463z" /> +<glyph unicode="‑" horiz-adv-x="692" d="M115 438v148h463v-148h-463z" /> +<glyph unicode="‒" horiz-adv-x="692" d="M115 438v148h463v-148h-463z" /> +<glyph unicode="–" horiz-adv-x="1069" d="M115 453v133h839v-133h-839z" /> +<glyph unicode="—" horiz-adv-x="1867" d="M115 453v133h1638v-133h-1638z" /> +<glyph unicode="‘" horiz-adv-x="432" d="M100 1190q0 186 181 323l71 -73q-100 -80 -100 -180q0 -102 106 -213l-155 -91q-103 97 -103 234z" /> +<glyph unicode="’" horiz-adv-x="423" d="M78 1423l155 90q102 -96 103 -233q0 -186 -180 -324l-72 74q100 80 100 180q0 102 -106 213z" /> +<glyph unicode="‚" horiz-adv-x="487" d="M100 154l168 90q109 -102 109 -234q0 -88 -50.5 -173t-136.5 -150l-71 73q106 84 106 181q0 82 -125 213z" /> +<glyph unicode="“" horiz-adv-x="763" d="M100 1190q0 186 181 323l71 -73q-100 -80 -100 -180q0 -102 106 -213l-155 -91q-103 97 -103 234zM432 1190q0 186 180 323l72 -73q-100 -80 -100 -180q0 -102 106 -213l-155 -91q-103 97 -103 234z" /> +<glyph unicode="”" horiz-adv-x="755" d="M78 1423l155 90q102 -96 103 -233q0 -186 -180 -324l-72 74q100 80 100 180q0 102 -106 213zM410 1423l155 90q102 -96 103 -233q0 -186 -181 -324l-71 74q100 80 100 180q0 102 -106 213z" /> +<glyph unicode="„" horiz-adv-x="819" d="M100 154l168 90q109 -102 109 -234q0 -88 -50.5 -173t-136.5 -150l-71 73q106 84 106 181q0 82 -125 213zM432 154l168 90q109 -102 109 -234q0 -88 -50.5 -173t-136.5 -150l-71 73q106 84 106 181q0 82 -125 213z" /> +<glyph unicode="•" horiz-adv-x="778" d="M106 524.5q0 118.5 82 200.5t201 82t201 -82t82 -200.5t-82 -200.5t-201 -82t-201 82t-82 200.5z" /> +<glyph unicode="…" horiz-adv-x="1593" d="M121 98.5q0 51.5 36 87t87 35.5t87 -35.5t36 -87t-36 -87.5t-87 -36t-87 36t-36 87.5zM674 98.5q0 51.5 35.5 87t87 35.5t87.5 -35.5t36 -87t-36 -87.5t-87.5 -36t-87 36t-35.5 87.5zM1227 98.5q0 51.5 35.5 87t87 35.5t87.5 -35.5t36 -87t-36 -87.5t-87.5 -36t-87 36 t-35.5 87.5z" /> +<glyph unicode=" " horiz-adv-x="356" /> +<glyph unicode="‹" horiz-adv-x="655" d="M49 510v8q35 27 285 303l115 125l110 -31l-309 -401l309 -401l-110 -31l-168 182l-111 121l-60 66l-38 38q-11 11 -23 21z" /> +<glyph unicode="›" horiz-adv-x="657" d="M98 113l310 401l-310 401l111 31q362 -397 389 -420q4 -2 10 -8v-8q-12 -10 -22 -21l-38 -38l-61 -66l-110 -121l-168 -182z" /> +<glyph unicode=" " horiz-adv-x="446" /> +<glyph unicode="€" horiz-adv-x="1142" d="M86 375v102h109q-4 27 -5 82q0 25 5 78h-105v102h121q45 188 179 303t335 115q180 -2 313 -80l-43 -145q-119 86 -278 86q-137 0 -221 -77t-117 -202h561l-31 -102h-549q-2 -23 -2 -66q0 -47 7 -94h499l-30 -102h-445q39 -119 127 -189.5t211 -70.5q66 0 131.5 18.5 t97.5 34.5l33 18l49 -125q-14 -10 -39.5 -24t-110.5 -38t-173 -24q-190 0 -322.5 107.5t-179.5 292.5h-127z" /> +<glyph unicode="™" horiz-adv-x="1359" d="M76 1278v88h463v-88h-179v-457h-106v457h-178zM629 821l20 545h156l127 -371l129 371h151l21 -545h-103l-16 422l-149 -422h-70l-150 424l-12 -424h-104z" /> +<glyph unicode="" horiz-adv-x="920" d="M0 920h920v-920h-920v920z" /> +<glyph unicode="fi" horiz-adv-x="1075" d="M57 793v84l146 55v78q0 225 108.5 353t292.5 128q162 0 279 -78l-74 -127q-100 66 -209 66q-102 0 -170 -82t-68 -252v-96h558v-922h-160v803h-398v-803h-159v793h-146z" /> +<glyph unicode="fl" horiz-adv-x="1105" d="M57 793v84l146 55v78q0 225 108.5 353t292.5 128q115 0 227 -51l119 22v-1462h-159v1296q-98 55 -191 56q-102 0 -170 -82t-68 -252v-96h261v-129h-261v-793h-159v793h-146z" /> +<glyph unicode="ffi" horiz-adv-x="1669" d="M57 793v84l146 55v47q0 217 111.5 339t299.5 122q141 0 275 -82q104 133 289 133q68 0 132 -19.5t95 -37.5l31 -21l-74 -127q-92 66 -188 66q-94 0 -156 -76t-62 -238v-116h557v-922h-159v803h-398v-803h-159v803h-435v-803h-159v793h-146zM362 922h435v108q0 109 28 199 q-115 72 -215 71q-109 0 -178.5 -75.5t-69.5 -237.5v-65z" /> +<glyph unicode="ffl" horiz-adv-x="1699" d="M57 793v84l146 55v47q0 217 111.5 339t299.5 122q147 0 283 -88q109 139 301 139q115 0 227 -51l119 22v-1462h-160v1296q-98 55 -190 56q-102 0 -170 -82t-68 -252v-96h261v-129h-261v-793h-159v803h-435v-803h-159v793h-146zM362 922h435v88q0 125 32 215 q-119 76 -219 75q-109 0 -178.5 -75.5t-69.5 -237.5v-65z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansRegular-webfont.ttf b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansRegular-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9856192a5d6fc9a8c0f7c17c5135d6ccc7df2520 Binary files /dev/null and b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansRegular-webfont.ttf differ diff --git a/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansRegular-webfont.woff b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansRegular-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..9477ccebc8b71a1372e3dcb2dd9f51abdc13cb46 Binary files /dev/null and b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansRegular-webfont.woff differ diff --git a/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansSemiBold-webfont.eot b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansSemiBold-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..2833c1bf81cfc3be091dbe4aa7f8c920db677c9f Binary files /dev/null and b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansSemiBold-webfont.eot differ diff --git a/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansSemiBold-webfont.svg b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansSemiBold-webfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..3cee70eab9e0f457c5185043f43f62851e594dd6 --- /dev/null +++ b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansSemiBold-webfont.svg @@ -0,0 +1,243 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG webfont generated by Fontspring. +</metadata> +<defs> +<font id="webfontFCImWf6J" horiz-adv-x="491" > +<font-face units-per-em="2048" ascent="1536" descent="-512" /> +<missing-glyph horiz-adv-x="500" /> +<glyph unicode=" " /> +<glyph unicode="!" horiz-adv-x="567" d="M145 112.5q0 57.5 40 98.5t97.5 41t98.5 -40t41 -99q0 -57 -41 -97.5t-98.5 -40.5t-97.5 40t-40 97.5zM168 1391h235l-34 -963h-170z" /> +<glyph unicode=""" horiz-adv-x="747" d="M125 856v510h182v-76l-57 -434h-125zM465 856v510h184v-76l-59 -434h-125z" /> +<glyph unicode="#" horiz-adv-x="1359" d="M72 244l22 127h256l60 284h-258l20 127h262l84 402h131l-82 -402h301l84 402h131l-82 -402h285l-22 -127h-289l-57 -284h288l-20 -127h-295l-86 -426h-133l86 426h-301l-86 -426h-133l86 426h-252zM483 371h301l60 284h-303z" /> +<glyph unicode="$" horiz-adv-x="960" d="M78 86l45 174q12 -10 35.5 -26.5t103.5 -45t168 -34.5l10 344q-160 57 -251 134t-91 206q0 123 89 210t270 101l6 178h94l-6 -176q82 -2 155.5 -17.5t106.5 -29.5l33 -14l-55 -166q-100 49 -244 57l-8 -328q160 -57 249 -135t89 -207q0 -133 -94.5 -219t-262.5 -100 l-4 -174h-94l4 170q-98 2 -185 26.5t-126 46.5zM289 850q0 -61 39 -96t116 -68l9 295q-164 -16 -164 -131zM524 156q158 20 158 143q0 61 -36 97t-114 67z" /> +<glyph unicode="%" horiz-adv-x="1527" d="M76 1040q0 131 91 222.5t228 91.5q139 0 230.5 -91.5t91.5 -222.5t-92.5 -222t-229.5 -91t-228 91t-91 222zM211 1040q0 -74 53 -131t131 -57q80 0 133.5 57.5t53.5 130.5q0 76 -53.5 132.5t-133.5 56.5t-132 -56.5t-52 -132.5zM223 0l963 1384l94 -63l-920 -1321h-137z M815 289q0 131 91 223t229 92q139 0 230 -91t91 -224q0 -131 -92 -222.5t-229.5 -91.5t-228.5 91.5t-91 222.5zM950 289q0 -74 53.5 -130.5t131.5 -56.5q80 0 133 56.5t53 130.5q0 76 -53.5 132t-133 56t-132 -56t-52.5 -132z" /> +<glyph unicode="&" horiz-adv-x="1415" d="M80 328q0 127 75.5 218t211.5 173q-111 199 -111 342q0 131 89 230.5t265 99.5q156 0 243 -82t87 -213q0 -133 -81 -223.5t-230 -182.5q68 -96 112 -147q72 -88 179 -195q166 221 192 578h186q-14 -168 -76.5 -357.5t-172.5 -332.5q180 -145 311 -183l-76 -139 q-158 23 -373 184q-162 -123 -372 -123q-186 0 -322.5 90.5t-136.5 262.5zM274 340q0 -94 78 -146.5t191 -52.5q125 0 235 72q-92 82 -211 223q-68 82 -114 148q-179 -117 -179 -244zM469 1065q0 -100 76 -240q207 125 207 254q0 61 -37 103.5t-103 42.5q-70 0 -106.5 -46 t-36.5 -114z" /> +<glyph unicode="'" horiz-adv-x="407" d="M125 856v510h188v-76l-73 -434h-115z" /> +<glyph unicode="(" horiz-adv-x="600" d="M100 553q0 152 32 297t78 244.5t91 177.5t76 114l33 37l149 -45l-32 -39q-19 -25 -69 -108.5t-89 -173.5t-71 -228.5t-32 -275.5q0 -152 31 -298t75 -246.5t88 -179.5t75 -116l30 -39l-145 -53q-12 14 -33.5 42t-77 119t-97.5 192.5t-77 259t-35 319.5z" /> +<glyph unicode=")" horiz-adv-x="600" d="M35 -326l33 40q20 26 71 114t91 183t73 242.5t33 299.5q0 137 -31 273.5t-74 231.5t-86 171t-73 112l-31 37l152 45l32 -39q20 -25 73.5 -110.5t94.5 -180t74 -241.5t33 -299q0 -459 -242 -829q-43 -66 -76 -103z" /> +<glyph unicode="*" horiz-adv-x="1007" d="M86 854l301 102l35 -61l-240 -211zM86 1110l96 170l240 -209l-35 -61zM406 555l63 311h70l63 -311h-196zM406 1409h196l-63 -311h-70zM586 895l35 61l301 -102l-99 -170zM586 1071l237 209l99 -170l-301 -100z" /> +<glyph unicode="+" horiz-adv-x="1064" d="M57 444v148h400v416h155v-416h394v-148h-394v-444h-155v444h-400z" /> +<glyph unicode="," horiz-adv-x="487" d="M68 -289q90 82 110 119q27 47 27 111q0 102 -107 254l197 63q84 -111 84 -238q0 -207 -232 -393z" /> +<glyph unicode="-" horiz-adv-x="720" d="M111 438v156h499v-156h-499z" /> +<glyph unicode="." horiz-adv-x="501" d="M113 112.5q0 57.5 40 98.5t97 41t98 -41t41 -98.5t-41 -97.5t-98 -40t-97 40t-40 97.5z" /> +<glyph unicode="/" horiz-adv-x="946" d="M45 -401l682 1767h154l-680 -1767h-156z" /> +<glyph unicode="0" horiz-adv-x="1134" d="M94 471q0 209 127 364.5t354 155.5q221 0 343 -142t122 -341q0 -135 -49 -253t-161.5 -199t-270.5 -81q-217 0 -341 147.5t-124 348.5zM289 483q0 -139 71.5 -240.5t206.5 -101.5q139 0 209 100.5t70 245.5q0 139 -69.5 238.5t-207 99.5t-209 -100.5t-71.5 -241.5z" /> +<glyph unicode="1" horiz-adv-x="800" d="M102 0v164h230v641h-217v162h417v-803h211v-164h-641z" /> +<glyph unicode="2" horiz-adv-x="927" d="M90 123l50 38q32 24 113 92.5t142.5 132t111.5 144t50 142.5q0 66 -44 107.5t-114 41.5q-53 0 -109.5 -21.5t-86.5 -43.5l-31 -23l-82 129q16 14 47 36t121 57.5t178 35.5q145 0 238.5 -83t93.5 -208q0 -96 -65.5 -202.5t-136 -175t-179.5 -158.5h467v-164h-756z" /> +<glyph unicode="3" horiz-adv-x="827" d="M35 862q16 14 47 36t122 57.5t179 35.5q141 0 233.5 -77.5t92.5 -196.5q0 -109 -73 -197t-177 -145q137 -33 210.5 -120t73.5 -206q0 -201 -176 -323.5t-444 -122.5q-37 0 -57 2l-17 157q23 -2 66 -2q180 0 298.5 74t118.5 209q0 109 -90 158t-217 49h-49v158 q113 10 218.5 95t105.5 185q0 59 -42 96t-106 37q-109 0 -229 -88z" /> +<glyph unicode="4" horiz-adv-x="1081" d="M53 41v135l582 807h192v-784h191v-158h-191v-436h-198v436h-576zM260 199h369v522z" /> +<glyph unicode="5" horiz-adv-x="827" d="M63 -238q199 -16 338.5 54.5t139.5 228.5q0 70 -29 124t-69 85t-107.5 55.5t-115.5 33.5t-126 22v602h602v-164h-407v-299q207 -49 335 -152.5t128 -296.5q0 -223 -189.5 -345t-480.5 -105z" /> +<glyph unicode="6" horiz-adv-x="1052" d="M88 567q0 156 48 298.5t139.5 258t239 187t333.5 80.5l14 -162q-238 -16 -372 -141t-175 -318q88 115 265 115q184 0 291.5 -126t107.5 -308q0 -193 -117 -334.5t-319 -141.5q-219 0 -337 170t-118 422zM297 586q0 -190 67.5 -317.5t190.5 -127.5q100 0 157.5 81 t57.5 206q0 70 -16.5 129t-69.5 109.5t-141 50.5q-137 0 -246 -109v-22z" /> +<glyph unicode="7" horiz-adv-x="942" d="M57 784v183h836v-127q-221 -551 -578 -1250l-196 43q301 557 540 1151h-602z" /> +<glyph unicode="8" horiz-adv-x="1050" d="M94 334q0 119 75 207t206 174q-207 166 -207 344q0 145 107.5 238.5t271.5 93.5q158 0 261 -86t103 -228q0 -106 -60 -187t-169 -157q129 -88 200.5 -175t71.5 -204q0 -154 -122.5 -266.5t-311.5 -112.5q-178 0 -302 101.5t-124 257.5zM279 344q0 -88 69.5 -146.5 t163.5 -58.5q96 0 167 58.5t71 142.5q0 51 -38 104.5t-80 87t-124 89.5q-113 -74 -171 -136.5t-58 -140.5zM375 1071q0 -119 174 -246q176 125 176 242q0 76 -52 118t-126 42t-123 -42t-49 -114z" /> +<glyph unicode="9" horiz-adv-x="1060" d="M96 524q0 188 116 327.5t314 139.5q219 0 337 -170t118 -420q0 -154 -48 -292t-139.5 -250.5t-238.5 -182t-334 -77.5l-14 161q240 14 374 137t175 310q-88 -115 -267 -115q-180 0 -286.5 127t-106.5 305zM305 553q0 -51 9.5 -97t32 -93.5t69.5 -75t112 -27.5 q137 0 244 107v6q0 199 -66.5 325.5t-191.5 126.5q-96 0 -152.5 -77.5t-56.5 -194.5z" /> +<glyph unicode=":" horiz-adv-x="561" d="M143 112.5q0 57.5 40 98.5t98 41q59 0 99 -40t40 -99q0 -57 -41 -97.5t-98.5 -40.5t-97.5 40t-40 97.5zM143 798.5q0 57.5 40 97.5t97.5 40t98.5 -40t41 -97.5t-41 -98.5t-98.5 -41t-97.5 41t-40 98.5z" /> +<glyph unicode=";" horiz-adv-x="552" d="M104 -289q90 82 111 119q27 47 27 111q0 102 -107 254l197 63q84 -111 84 -238q0 -207 -232 -393zM139 796.5q0 57.5 40 98.5t97.5 41t98.5 -41t41 -98.5t-41 -97.5t-98.5 -40t-97.5 40t-40 97.5z" /> +<glyph unicode="<" horiz-adv-x="1064" d="M59 467v94l873 469l35 -151l-699 -365l699 -383l-35 -151z" /> +<glyph unicode="=" horiz-adv-x="1064" d="M78 252v147h909v-147h-909zM78 627v147h909v-147h-909z" /> +<glyph unicode=">" horiz-adv-x="1064" d="M96 131l699 383l-699 365l37 151l873 -469v-94l-873 -487z" /> +<glyph unicode="?" horiz-adv-x="757" d="M90 1262l45 186q23 -6 59.5 -18.5t132 -54.5t168 -87t132 -115.5t59.5 -144.5q0 -53 -32.5 -106.5t-79 -103.5t-91.5 -104.5t-77.5 -129t-32.5 -156.5h-164q-6 27 -6 59q0 88 39 173t87 138.5t87 111t39 94.5q0 57 -91.5 121.5t-183.5 99.5zM158 112.5q0 57.5 41 98.5 t98 41t98 -41t41 -98.5t-41 -97.5t-98 -40t-98 40t-41 97.5z" /> +<glyph unicode="@" horiz-adv-x="1736" d="M82 397q0 217 102.5 404.5t295 304.5t433.5 117q322 0 524.5 -192.5t202.5 -483.5q0 -133 -49 -252t-153 -191q-35 -25 -84 -45t-81 -29.5t-113 -27.5l-116 -27q-20 84 -32 150q-33 -61 -104.5 -105.5t-151.5 -44.5q-129 0 -215 107.5t-86 284.5q0 246 168 397t399 151 l152 -12v-584l16 -167q143 12 215 115.5t72 258.5q0 242 -151.5 401.5t-410.5 159.5q-295 0 -482 -204.5t-187 -487.5q0 -264 163.5 -436t383.5 -184l-25 -137q-293 14 -489.5 233t-196.5 526zM657 379q0 -102 37 -172t103 -70q100 0 182 131v498q-139 0 -230.5 -113.5 t-91.5 -273.5z" /> +<glyph unicode="A" horiz-adv-x="1282" d="M20 0l521 1376h200l521 -1376h-218l-135 365h-544l-134 -365h-211zM430 541h416l-209 565z" /> +<glyph unicode="B" horiz-adv-x="1216" d="M186 0v1366h402q244 0 353.5 -95t109.5 -233q0 -174 -164 -301q238 -98 237 -340q0 -180 -130 -288.5t-337 -108.5h-471zM397 176h230q137 0 205.5 58.5t68.5 159t-68.5 159.5t-205.5 59h-230v-436zM397 786h299q6 2 14.5 8.5t31 26t40 43t31.5 61.5t14 79 q0 186 -270 186h-160v-404z" /> +<glyph unicode="C" horiz-adv-x="1380" d="M92 667.5q0 309.5 206 516.5t542 207q127 0 242.5 -29t166.5 -57l51 -29l-81 -184q-16 12 -48 31.5t-134.5 52t-209.5 32.5q-240 0 -377 -152.5t-137 -369.5q0 -229 146.5 -378.5t367.5 -149.5q106 0 208 33.5t149 66.5l49 33l86 -158l-23 -17q-14 -11 -63 -38 t-103.5 -47.5t-140.5 -38t-176 -17.5q-309 0 -515 191.5t-206 501z" /> +<glyph unicode="D" horiz-adv-x="1484" d="M186 0v1366h447q145 0 275 -36t241 -111.5t175.5 -207.5t64.5 -306q0 -336 -227.5 -520.5t-606.5 -184.5h-369zM397 176h138q326 0 478 140.5t152 371.5q0 233 -144 367.5t-417 134.5h-207v-1014z" /> +<glyph unicode="E" horiz-adv-x="1116" d="M186 0v1366h832v-176h-621v-406h490v-178h-490v-430h627v-176h-838z" /> +<glyph unicode="F" horiz-adv-x="1064" d="M186 0v1366h820v-176h-609v-414h482v-182h-482v-594h-211z" /> +<glyph unicode="G" horiz-adv-x="1437" d="M92 662q0 303 204 516t552 213q258 0 450 -99l9 -4l-82 -182q-18 12 -52 28.5t-135.5 45t-199.5 28.5q-248 0 -387.5 -154.5t-139.5 -375.5q0 -231 152.5 -375.5t398.5 -144.5q53 0 112.5 7t94.5 15l33 6v359h-285v176h494v-682q-270 -63 -473 -64q-319 0 -532.5 188 t-213.5 499z" /> +<glyph unicode="H" horiz-adv-x="1552" d="M186 0v1366h211v-580h758v580h209v-1366h-209v608h-758v-608h-211z" /> +<glyph unicode="I" horiz-adv-x="585" d="M186 0v1366h211v-1366h-211z" /> +<glyph unicode="J" horiz-adv-x="585" d="M-57 -201q246 25 245 387v1180h211v-1176q0 -506 -385 -563z" /> +<glyph unicode="K" horiz-adv-x="1228" d="M186 0v1366h211v-561h33l508 561h264l-592 -641l619 -725h-273l-526 627h-33v-627h-211z" /> +<glyph unicode="L" horiz-adv-x="1067" d="M186 0v1366h211v-1190h639v-176h-850z" /> +<glyph unicode="M" horiz-adv-x="1783" d="M164 0l49 1366h303l375 -1051l379 1051h301l49 -1366h-205l-41 1118l-411 -1118h-148l-412 1126l-34 -1126h-205z" /> +<glyph unicode="N" horiz-adv-x="1529" d="M186 0v1366h213l738 -1047v1047h206v-1366h-213l-737 1034v-1034h-207z" /> +<glyph unicode="O" horiz-adv-x="1634" d="M92 680q0 184 83 344t253 263.5t395 103.5q324 0 521.5 -196t197.5 -486q0 -299 -207 -516.5t-530 -217.5q-315 0 -514 207t-199 498zM315 690q0 -209 134.5 -371.5t361.5 -162.5q229 0 368.5 161.5t139.5 374.5q0 211 -135 364.5t-366.5 153.5t-367 -154.5 t-135.5 -365.5z" /> +<glyph unicode="P" horiz-adv-x="1175" d="M186 0v1366h432q250 0 373 -118t123 -300q0 -209 -138 -329.5t-358 -120.5h-221v-498h-211zM397 674h187q307 0 307 260q0 117 -73 186.5t-234 69.5h-187v-516z" /> +<glyph unicode="Q" horiz-adv-x="1634" d="M92 680q0 184 83 344t253 263.5t393 103.5q324 0 522.5 -196t198.5 -486q0 -242 -143.5 -439.5t-380.5 -265.5q49 -63 85 -102t100.5 -91.5t146.5 -77.5q76 -24 165 -24h15l-31 -190q-11 0 -22 -1q-61 0 -118 10q-67 11 -123 36.5t-98 49.5t-85 64l-64 61q-20 19 -56 62 t-40 47l-62 72q-41 49 -124 62q-279 37 -447 234.5t-168 463.5zM315 690q0 -211 133.5 -373.5t362.5 -162.5t369.5 162.5t140.5 377.5q0 207 -135 361.5t-366.5 154.5t-368 -155.5t-136.5 -364.5z" /> +<glyph unicode="R" horiz-adv-x="1249" d="M186 0v1366h402q250 0 372.5 -110.5t122.5 -278.5q0 -131 -74.5 -228.5t-187.5 -150.5l402 -598h-250l-365 549h-211v-549h-211zM397 725h187q119 0 197.5 63.5t78.5 174.5q0 100 -73.5 163.5t-233.5 63.5h-156v-465z" /> +<glyph unicode="S" horiz-adv-x="1048" d="M90 90l60 193q16 -14 46.5 -35t122 -54.5t179.5 -33.5q104 0 174.5 47t70.5 129q0 66 -47 120t-116 90l-152 82q-82 46 -151.5 92t-116.5 124t-47 174q0 160 122.5 266.5t333.5 106.5q184 0 359 -62l-43 -192q-156 70 -318 69q-106 0 -173.5 -44t-67.5 -122 q0 -66 47 -120t116.5 -88.5t151.5 -79.5t151.5 -92.5t116.5 -127t47 -180.5q0 -176 -132 -276.5t-328 -100.5q-106 0 -208 29t-149 57z" /> +<glyph unicode="T" horiz-adv-x="1220" d="M35 1190v176h1151v-176h-473v-1190h-209v1190h-469z" /> +<glyph unicode="U" horiz-adv-x="1466" d="M170 500v866h211v-836q0 -193 96 -283.5t258 -90.5q160 0 256 92t96 272v846h209v-838q0 -260 -160.5 -406.5t-402.5 -146.5q-252 0 -407.5 128.5t-155.5 396.5z" /> +<glyph unicode="V" horiz-adv-x="1220" d="M20 1366h224l370 -1063l371 1063h215l-489 -1376h-203z" /> +<glyph unicode="W" horiz-adv-x="1957" d="M45 1366h217l313 -1071l312 1071h190l309 -1073l316 1073h211l-416 -1376h-215l-303 1014l-303 -1014h-217z" /> +<glyph unicode="X" horiz-adv-x="1239" d="M43 0l453 680l-453 686h248l332 -516l331 516h242l-453 -682l453 -684h-248l-332 516l-331 -516h-242z" /> +<glyph unicode="Y" horiz-adv-x="1208" d="M8 1366h248l350 -575l357 575h237l-489 -780v-586h-211v584z" /> +<glyph unicode="Z" horiz-adv-x="1187" d="M74 0v125l741 1065h-700v176h970v-125l-731 -1065h750v-176h-1030z" /> +<glyph unicode="[" horiz-adv-x="589" d="M164 -324v1690h391v-127h-236v-1436h236v-127h-391z" /> +<glyph unicode="\" horiz-adv-x="950" d="M66 1366h157l682 -1767h-160z" /> +<glyph unicode="]" horiz-adv-x="587" d="M33 -205h237v1452h-237v119h391v-1690h-391v119z" /> +<glyph unicode="^" horiz-adv-x="991" d="M-4 512l438 879h121l438 -879h-168l-331 668l-332 -668h-166z" /> +<glyph unicode="_" horiz-adv-x="1081" d="M29 -76h1024v-129h-1024v129z" /> +<glyph unicode="`" horiz-adv-x="1038" d="M311 1438h205l209 -336l-113 -64z" /> +<glyph unicode="a" horiz-adv-x="980" d="M66 213q0 285 548 356v17q0 43 -1 64.5t-8 53t-21.5 47t-42 26.5t-68.5 11q-68 0 -140.5 -26.5t-111.5 -52.5l-41 -27l-53 152q18 12 51 31.5t137.5 52t212.5 32.5q162 0 225.5 -68.5t63.5 -228.5v-391q0 -51 25.5 -79.5t50.5 -32.5l27 -5l-62 -159q-180 12 -227 143 q-18 -29 -48 -58.5t-99.5 -62.5t-151.5 -33q-121 0 -193.5 67t-72.5 171zM274 227q0 -92 109 -92t231 144v159q-340 -51 -340 -211z" /> +<glyph unicode="b" horiz-adv-x="1079" d="M139 20v1412l203 32v-618q92 104 250 104q186 0 294.5 -129t108.5 -325q0 -217 -134 -369t-384 -152q-145 0 -338 45zM342 150q63 -20 139 -21q137 0 221 92t84 260q0 143 -62 224t-165 81q-111 0 -217 -96v-540z" /> +<glyph unicode="c" horiz-adv-x="944" d="M80 451q0 203 134 351t353 148q90 0 169 -24.5t112 -48.5l35 -25l-80 -152q-96 86 -232 86q-125 0 -202.5 -91t-77.5 -234q0 -139 75.5 -229.5t202.5 -90.5q141 4 248 97l66 -144q-12 -12 -36 -32.5t-109 -53.5t-183 -33q-213 0 -344 135.5t-131 340.5z" /> +<glyph unicode="d" horiz-adv-x="1099" d="M82 434q0 213 131 364.5t365 151.5q92 0 172 -30v512l202 32v-1179q0 -49 10.5 -121t20.5 -119l10 -45l-194 -14q-18 76 -29 141q-94 -152 -291 -152q-178 0 -287.5 132t-109.5 327zM295 446q0 -143 60.5 -226t158.5 -83q135 0 236 150v381q-6 123 -162 123 q-135 0 -214 -90.5t-79 -254.5z" /> +<glyph unicode="e" horiz-adv-x="1003" d="M82 449q0 215 126 358t327 143q170 0 275 -113.5t105 -318.5l-116 -33l-506 -67q16 -129 92 -203t195 -74q70 0 140.5 29t106.5 57l37 29l58 -147q-16 -14 -46 -37t-127.5 -60t-199.5 -37q-221 0 -344 137.5t-123 336.5zM293 553l401 51q0 8 -2 20.5t-13 45t-27.5 57.5 t-51.5 45.5t-80 20.5q-94 0 -153.5 -67t-73.5 -173z" /> +<glyph unicode="f" horiz-adv-x="698" d="M51 772v109l146 53v90q0 223 113.5 348t297.5 125q72 0 139.5 -19.5t98.5 -39.5l31 -19l-80 -155q-90 66 -191 65q-90 0 -148.5 -70.5t-58.5 -222.5v-110h256v-154h-256v-772h-202v772h-146z" /> +<glyph unicode="g" horiz-adv-x="1036" d="M53 -242q0 152 236 275q-152 51 -152 131q0 90 146 172q-88 43 -136.5 119.5t-48.5 171.5q0 150 115 236.5t279 86.5q57 0 138 -19.5t130 -19.5h106q27 0 57.5 5.5t47.5 9.5l18 6l15 -162h-111q-39 0 -76 6q68 -78 68 -170q0 -143 -124 -227t-286 -84q-47 0 -67 4 q-76 -51 -76 -76q0 -33 235 -90l47 -12q63 -16 101.5 -27.5t91.5 -34t83 -47t52.5 -64.5t22.5 -89q0 -141 -148.5 -242.5t-357.5 -101.5q-166 0 -286 64t-120 179zM236 -209q0 -63 68.5 -96t166.5 -33q123 0 209 48t86 118q0 55 -58.5 84t-209.5 68q-20 6 -62 14 q-63 -35 -95 -55.5t-68.5 -62.5t-36.5 -85zM297 621q0 -74 50 -128.5t142 -54.5q86 0 140.5 47t54.5 125q0 76 -51 136.5t-144 60.5q-88 0 -140 -55t-52 -131z" /> +<glyph unicode="h" horiz-adv-x="1089" d="M143 0v1432l203 32v-694q170 180 363 180q117 0 182 -69.5t65 -212.5v-668h-202v594q0 180 -111 180q-119 0 -297 -178v-596h-203z" /> +<glyph unicode="i" d="M119 1272q0 53 37 89t90 36q55 0 92 -36t37 -89t-37 -89t-92 -36q-53 0 -90 36t-37 89zM143 0v926h203v-926h-203z" /> +<glyph unicode="j" d="M-90 -324q111 20 172 96t61 236v918h203v-895q0 -457 -375 -516zM117 1272q0 53 36.5 89t90.5 36q55 0 92 -36t37 -89t-37 -89t-92 -36q-53 0 -90 36t-37 89z" /> +<glyph unicode="k" horiz-adv-x="1011" d="M143 0v1432l203 32v-876h29l336 338h264l-422 -406l451 -520h-261l-368 438h-29v-438h-203z" /> +<glyph unicode="l" d="M143 0v1432l203 32v-1464h-203z" /> +<glyph unicode="m" horiz-adv-x="1656" d="M139 0v909l199 33v-174q166 182 358 182q188 0 230 -182q168 182 356 182q113 0 176.5 -69.5t63.5 -212.5v-668h-201v594q0 180 -106.5 180t-278.5 -168v-606h-203v594q0 180 -104 180q-115 0 -287 -172v-602h-203z" /> +<glyph unicode="n" horiz-adv-x="1085" d="M139 0v909l199 33v-176q168 184 369 184q115 0 180 -69.5t65 -212.5v-668h-202v594q0 180 -111 180q-117 0 -297 -174v-600h-203z" /> +<glyph unicode="o" horiz-adv-x="1114" d="M80 459q0 195 125 343t356 148q219 0 346 -139t127 -330q0 -88 -29.5 -175t-85 -161.5t-151.5 -122t-215 -47.5q-219 0 -346 143.5t-127 340.5zM291 477q0 -141 68.5 -240.5t199.5 -99.5q117 0 190.5 89t73.5 229q0 137 -67.5 235t-198.5 98q-119 0 -192.5 -86 t-73.5 -225z" /> +<glyph unicode="p" horiz-adv-x="1085" d="M139 -477v1386l197 33v-147q84 156 276 155q178 0 285 -132t107 -326q0 -215 -127 -366t-340 -151q-127 0 -195 50v-469zM342 240q0 -104 158 -105q133 0 212 89t79 253q0 141 -58.5 223t-154.5 82q-133 0 -236 -149v-393z" /> +<glyph unicode="q" horiz-adv-x="1079" d="M82 430q0 217 135 368.5t385 151.5l338 -45v-1349l-203 -33v555q-94 -102 -252 -103q-186 0 -294.5 129t-108.5 326zM293 444q0 -139 61.5 -219t163.5 -80q115 0 219 95v534q-66 20 -139 21q-137 0 -221 -91.5t-84 -259.5z" /> +<glyph unicode="r" horiz-adv-x="712" d="M139 0v909l199 33v-186q113 195 272 194l80 -16l-41 -205q-41 16 -82 16q-117 0 -225 -172v-573h-203z" /> +<glyph unicode="s" horiz-adv-x="823" d="M78 57l43 172q12 -10 34.5 -25.5t92 -42t135.5 -26.5q78 0 119 27.5t41 75.5q0 53 -70 98t-152.5 76.5t-152.5 101.5t-70 168q0 117 89 192.5t270 75.5q162 0 264 -51l-47 -166q-106 57 -225 58q-147 0 -148 -93q0 -43 46 -77.5t110.5 -63.5t130 -63.5t111.5 -95 t46 -142.5q0 -127 -96 -204t-264 -77q-86 0 -163 20.5t-111 41.5z" /> +<glyph unicode="t" horiz-adv-x="774" d="M55 772v111l142 51v211l198 43v-262h293v-154h-293v-469q0 -158 107 -158q27 0 59.5 11.5t52.5 23.5l48 30q27 17 28 17l51 -153l-39 -27q-25 -16 -98.5 -44t-146.5 -28q-125 0 -194.5 69t-69.5 208v520h-138z" /> +<glyph unicode="u" horiz-adv-x="1079" d="M133 254v672h203v-594q0 -180 115 -180q113 0 276 151v623h203v-641q0 -49 10 -120t21 -116l10 -47l-197 -18q-20 96 -31 163q-162 -172 -358 -172q-252 0 -252 279z" /> +<glyph unicode="v" horiz-adv-x="952" d="M27 926h213l225 -672l260 672h207l-381 -934h-189z" /> +<glyph unicode="w" horiz-adv-x="1542" d="M37 926h209l203 -701l239 701h176l217 -697l224 697h206l-331 -934h-199l-213 659l-238 -659h-196z" /> +<glyph unicode="x" horiz-adv-x="958" d="M43 0l319 463l-319 463h236l202 -308l205 308h227l-317 -459l317 -467h-227l-209 315l-213 -315h-221z" /> +<glyph unicode="y" horiz-adv-x="952" d="M23 926h215l243 -635l240 635h209l-402 -996q-156 -385 -432 -415l-63 161q98 16 177 88t122 173l49 110z" /> +<glyph unicode="z" horiz-adv-x="903" d="M80 0v123l461 639h-445v164h711v-123l-471 -639h487v-164h-743z" /> +<glyph unicode="{" horiz-adv-x="692" d="M29 475v125q45 2 81.5 16.5t61.5 46t43 61.5t29.5 82t17.5 86t9 95.5t3 87.5v84v31q0 166 117 247t311 81v-119q-94 -6 -147 -23.5t-79.5 -60.5t-34 -91t-7.5 -143q0 -457 -217 -540v-4q92 -35 154.5 -169.5t62.5 -394.5q0 -76 4 -117.5t18.5 -82.5t44 -61.5t78 -35 t123.5 -20.5v-119q-428 0 -428 328q0 279 -28 393q-55 213 -217 217z" /> +<glyph unicode="|" horiz-adv-x="479" d="M162 -461v1995h155v-1995h-155z" /> +<glyph unicode="}" horiz-adv-x="692" d="M-8 -344q76 6 123 20.5t76.5 35t44 61.5t18.5 83t4 117q0 260 62.5 394.5t154.5 169.5v4q-217 84 -217 540q0 94 -7 143.5t-34 91.5t-79 59.5t-146 23.5v119q195 0 310.5 -81t115.5 -247q0 -268 28 -377q53 -209 218 -213v-125q-45 -2 -82 -17.5t-61.5 -48t-43 -64.5 t-30 -86t-17.5 -90t-9 -99.5t-3 -89.5v-84v-31q0 -328 -426 -328v119z" /> +<glyph unicode="~" horiz-adv-x="1191" d="M123 352q0 330 274 330q80 0 141.5 -30.5t92.5 -67.5t74 -68t90 -31q133 0 133 189h145q0 -330 -274 -330q-80 0 -141.5 31t-92 67.5t-73.5 67.5t-91 31q-133 0 -133 -189h-145z" /> +<glyph unicode=" " /> +<glyph unicode="¡" horiz-adv-x="548" d="M137 813q0 57 41 97t98.5 40t97.5 -40t40 -97t-40 -98t-98 -41q-59 0 -99 40t-40 99zM156 -465l34 963h170l31 -963h-235z" /> +<glyph unicode="¢" horiz-adv-x="944" d="M80 569q0 168 104.5 293t290.5 144l6 180h94l-6 -178q178 -12 281 -113l6 -6l-106 -133q-72 70 -185 84l-18 -537q59 2 118.5 25.5t88.5 46.5l30 22l66 -141q-12 -12 -35.5 -31.5t-102.5 -52.5t-169 -35l-6 -182h-95l7 186q-168 25 -268.5 144.5t-100.5 283.5zM285 575 q0 -92 44 -163.5t124 -96.5l16 521q-86 -20 -135 -91.5t-49 -169.5z" /> +<glyph unicode="£" horiz-adv-x="1116" d="M78 117q6 2 14 5t31.5 18.5t42 34t36 52t21.5 72.5l23 190h-125v109h139l21 168q49 395 378 395q57 0 110.5 -12t88.5 -29.5t61.5 -36t38.5 -30.5l13 -13l-109 -133q-8 10 -24.5 25.5t-70.5 40t-112 24.5q-78 0 -122 -52t-56 -185l-16 -162h364l-12 -109h-362 q-8 -84 -25.5 -161.5t-32.5 -114.5l-12 -35q150 -63 283 -63q178 0 204 149l13 68h151q-8 -80 -26.5 -141.5t-53 -120t-97 -90t-150.5 -31.5q-86 0 -227.5 42t-196.5 42q-70 0 -162 -33z" /> +<glyph unicode="¥" horiz-adv-x="1148" d="M78 1137h221l274 -471l281 471h209l-289 -473h215v-109h-280l-35 -59v-84h315v-109h-315v-303h-203v303h-295v109h295v82l-39 61h-256v109h191z" /> +<glyph unicode="¦" horiz-adv-x="497" d="M166 358h166v-733h-166v733zM166 676v733h166v-733h-166z" /> +<glyph unicode="§" horiz-adv-x="1005" d="M57 -379l62 119q133 -96 278 -96q121 0 184.5 88t63.5 229q0 66 -10 117l-111 606q-23 131 -22 205q0 135 53 213l127 -23q-35 -76 -35 -188q0 -53 10 -115l121 -682q12 -70 13 -137q0 -193 -98.5 -317.5t-291.5 -124.5q-184 0 -338 102zM190 948q0 193 97.5 318 t290.5 125q184 0 337 -103l7 -4l-62 -119q-133 96 -278 97q-121 0 -184.5 -89.5t-63.5 -228.5q0 -68 10 -117l111 -606q20 -119 20 -205q0 -137 -51 -213l-125 23q35 82 35 188q0 53 -10 115l-121 682q-13 69 -13 137z" /> +<glyph unicode="¨" horiz-adv-x="1038" d="M199 1270q0 51 34.5 83.5t86 32.5t85 -32.5t33.5 -83.5t-33.5 -83t-85 -32t-86 33t-34.5 82zM598 1270q0 51 34 83.5t85 32.5t86 -32.5t35 -83.5q0 -49 -35 -82t-86 -33t-85 32t-34 83z" /> +<glyph unicode="©" horiz-adv-x="1583" d="M84 682q0 293 208 500t498.5 207t498.5 -207t208 -500t-208 -500t-498.5 -207t-498.5 207t-208 500zM195 682q0 -252 173 -430t423 -178q252 0 425 178t173 430t-173.5 430t-424.5 178q-250 0 -423 -178t-173 -430zM395 678q0 170 111.5 297t306.5 127q180 0 287 -113 l8 -10l-92 -121q-8 10 -25.5 26.5t-72 43t-111.5 26.5q-111 0 -172.5 -75.5t-61.5 -186.5q0 -113 69 -191.5t183 -78.5q129 4 224 98l55 -127q-10 -12 -31.5 -32.5t-96.5 -53.5t-163 -33q-184 0 -301 116t-117 288z" /> +<glyph unicode="ª" horiz-adv-x="796" d="M88 874q0 201 387 256q0 76 -16.5 107t-75.5 31q-109 0 -213 -84l-39 125q115 80 295 80q119 0 166 -48.5t47 -158.5v-269q8 -72 74 -79l-45 -121q-143 6 -179 94q-78 -100 -208 -100q-86 0 -139.5 45.5t-53.5 121.5zM258 891q0 -63 66 -64q68 0 151 97v106 q-217 -35 -217 -139z" /> +<glyph unicode="«" horiz-adv-x="1046" d="M43 510v8q31 23 199 211l194 217l125 -35l-303 -397l303 -397l-125 -35l-166 182l-109 121l-60 66q-26 29 -36 39t-22 20zM438 510v8q29 23 197 209l199 219l122 -35l-301 -397l301 -397l-122 -35l-168 182l-109 121l-59 66q-27 29 -37.5 39t-22.5 20z" /> +<glyph unicode="¬" horiz-adv-x="1171" d="M104 655v146h943v-574h-154v428h-789z" /> +<glyph unicode="­" horiz-adv-x="720" d="M111 438v156h499v-156h-499z" /> +<glyph unicode="®" horiz-adv-x="876" d="M84 1087.5q0 145.5 104.5 250t250 104.5t250 -104.5t104.5 -250t-104.5 -250t-250 -104.5t-250 104.5t-104.5 250zM156 1087.5q0 -118.5 83 -205.5t197.5 -87t199.5 87t85 205.5t-85 204.5t-199.5 86t-197.5 -86t-83 -204.5zM307 918v348h123q143 0 143 -105 q0 -66 -65 -98l106 -145h-98l-88 126h-33v-126h-88zM395 1102h41q47 0 47 51q0 53 -61 53h-27v-104z" /> +<glyph unicode="¯" horiz-adv-x="991" d="M248 1194v141h493v-141h-493z" /> +<glyph unicode="°" horiz-adv-x="665" d="M84 1144.5q0 102.5 72.5 174.5t177 72t177.5 -72t73 -174.5t-73 -174t-177.5 -71.5t-177 71.5t-72.5 174zM193 1144.5q0 -61.5 40.5 -103.5t100 -42t99.5 42t40 103.5t-40 103.5t-99.5 42t-100 -42t-40.5 -103.5z" /> +<glyph unicode="±" horiz-adv-x="1064" d="M84 635v145h369v363h155v-363h371v-145h-371v-375h-155v375h-369zM92 0v147h885v-147h-885z" /> +<glyph unicode="²" horiz-adv-x="706" d="M57 856l76 74l78 76l67 68q44 46 63 74l45 65q26 38 35 71t9 66q0 57 -35 87.5t-90 30.5q-39 0 -78 -17t-59 -34l-18 -18l-84 100q10 12 31.5 30.5t91 50.5t147.5 32q121 0 191.5 -66.5t70.5 -175.5q0 -96 -65.5 -200.5t-235.5 -270.5h350v-129h-579z" /> +<glyph unicode="³" horiz-adv-x="669" d="M45 823l66 115q78 -47 168 -47q68 0 106.5 31.5t38.5 78.5q0 57 -53.5 86t-126.5 29h-58v127q76 4 138.5 47t62.5 107q0 78 -94 78q-37 0 -76 -12.5t-57 -24.5l-21 -13l-63 105q102 82 246 82q106 0 171.5 -54.5t65.5 -136.5q0 -72 -47 -127t-117 -84q94 -20 147.5 -73.5 t53.5 -130.5q0 -104 -89 -177t-224 -73q-140 -1 -238 67z" /> +<glyph unicode="´" horiz-adv-x="1050" d="M313 1102l209 336h205l-301 -400z" /> +<glyph unicode="µ" horiz-adv-x="1173" d="M139 -442q20 199 21 362v1006h200v-594q0 -180 117 -180q111 0 277 151v623h202v-666q0 -84 22.5 -103.5t111.5 -19.5v-151q-72 -10 -113 -11q-106 0 -153.5 43t-59.5 121q-164 -164 -352 -164q-49 0 -93 13q4 -86 20.5 -240t16.5 -190h-217z" /> +<glyph unicode="μ" horiz-adv-x="1173" d="M139 -442q20 199 21 362v1006h200v-594q0 -180 117 -180q111 0 277 151v623h202v-666q0 -84 22.5 -103.5t111.5 -19.5v-151q-72 -10 -113 -11q-106 0 -153.5 43t-59.5 121q-164 -164 -352 -164q-49 0 -93 13q4 -86 20.5 -240t16.5 -190h-217z" /> +<glyph unicode="¶" horiz-adv-x="1366" d="M68 864q0 203 154.5 352.5t430.5 149.5h613v-125h-152v-1241h-135v1241h-154v-1282q0 -444 -366 -444l-31 137q133 0 193.5 73.5t60.5 241.5v400h-18q-291 0 -443.5 145t-152.5 352z" /> +<glyph unicode="·" horiz-adv-x="520" d="M121 520q0 57 41 98t98 41t98 -40.5t41 -98.5q0 -55 -41 -96t-98 -41t-98 41t-41 96z" /> +<glyph unicode="¸" horiz-adv-x="1038" d="M332 -422l47 107q66 -57 147 -58q45 0 73 17.5t28 44.5q0 23 -27 41t-57.5 30.5t-57 36t-26.5 56.5q0 25 35 104l22 43h111l-17 -37q-20 -41 -20 -61q0 -23 27.5 -40.5t60.5 -29.5t60.5 -45t27.5 -80q0 -78 -66.5 -135t-169.5 -57q-53 0 -102 15t-72 32z" /> +<glyph unicode="¹" horiz-adv-x="606" d="M66 770v121h180v586h-164v120h326v-706h167v-121h-509z" /> +<glyph unicode="º" horiz-adv-x="860" d="M84 1044q0 135 91 240t259 105q160 0 252 -97.5t92 -230.5q0 -135 -91 -244.5t-259 -109.5q-160 0 -252 100t-92 237zM256 1059q0 -96 45 -164t131 -68q78 0 126 60.5t48 154.5q0 92 -44 159t-132 67q-78 0 -126 -58.5t-48 -150.5z" /> +<glyph unicode="»" horiz-adv-x="1046" d="M90 117l303 397l-303 397l125 35q360 -399 379 -418q6 -4 14 -10v-8q-12 -10 -22.5 -20.5t-35.5 -38.5l-60 -66l-109 -121l-166 -182zM485 117l303 397l-303 397l125 35q360 -401 396 -428v-8q-12 -10 -22.5 -20.5l-38.5 -39.5l-59 -66l-109 -120l-167 -182z" /> +<glyph unicode="¼" horiz-adv-x="1701" d="M94 545v121h180v585h-163v121h325v-706h168v-121h-510zM389 0l813 1411l125 -49l-782 -1362h-156zM973 301l373 533h165v-508h119v-125h-119v-201h-155v201h-371zM1126 326h230v325z" /> +<glyph unicode="½" horiz-adv-x="1806" d="M92 545v121h180v585h-163v121h325v-706h168v-121h-510zM408 0l813 1411l125 -49l-783 -1362h-155zM1143 86l76 74l77 76l67 68q44 46 63 74l45 65q26 38 35.5 71t9.5 66q0 57 -35 87.5t-90 30.5q-39 0 -78 -17t-60 -34l-18 -18l-84 100q10 12 31.5 30.5t91 50.5t147.5 32 q121 0 191.5 -66.5t70.5 -175.5q0 -96 -65.5 -200.5t-235.5 -270.5h351v-129h-580z" /> +<glyph unicode="¾" horiz-adv-x="1695" d="M78 598l65 115q78 -47 168 -47q68 0 107 31.5t39 78.5q0 57 -53.5 86t-127.5 29h-57v127q76 4 138.5 47t62.5 106q0 78 -94 78q-37 0 -76 -12t-57 -25l-21 -12l-63 105q102 82 245 81q106 0 172 -54t66 -136q0 -72 -47 -127t-117 -84q94 -20 147.5 -73.5t53.5 -131.5 q0 -104 -89 -177t-225 -73q-139 0 -237 68zM383 0l813 1411l125 -49l-782 -1362h-156zM967 301l372 533h166v-508h119v-125h-119v-201h-155v201h-371zM1120 326h230v325z" /> +<glyph unicode="¿" horiz-adv-x="743" d="M70 -82q0 49 32.5 101.5t77.5 100.5l91 100q46 52 79 125t33 153h164q6 -27 6 -60q0 -84 -39 -166t-87 -133t-87 -105t-39 -91q0 -57 91 -122t181 -100l93 -36l-45 -187q-23 6 -60 18.5t-132 54.5t-168 87t-132 115.5t-59 144.5zM319 813q0 57 41 97t98.5 40t98.5 -40 t41 -97t-41 -98t-98.5 -41t-98.5 41t-41 98z" /> +<glyph unicode="À" horiz-adv-x="1282" d="M20 0l521 1376h200l521 -1376h-218l-135 365h-544l-134 -365h-211zM358 1606l68 166l416 -195l-43 -115zM430 541h416l-209 565z" /> +<glyph unicode="Á" horiz-adv-x="1282" d="M20 0l521 1376h200l521 -1376h-218l-135 365h-544l-134 -365h-211zM430 541h416l-209 565zM434 1577l416 195l68 -166l-441 -144z" /> +<glyph unicode="Â" horiz-adv-x="1282" d="M20 0l521 1376h200l521 -1376h-218l-135 365h-544l-134 -365h-211zM297 1552l258 232h168l256 -232l-111 -82l-229 191l-233 -191zM430 541h416l-209 565z" /> +<glyph unicode="Ã" horiz-adv-x="1282" d="M20 0l521 1376h200l521 -1376h-218l-135 365h-544l-134 -365h-211zM266 1495q4 2 0 26.5t7.5 64.5t28.5 78t64.5 64.5t112.5 26.5q72 0 129.5 -33.5t100.5 -66.5t82 -33q80 16 79 131h142q-4 -2 0 -27.5t-8.5 -66.5t-31 -79t-66.5 -65.5t-115 -27.5q-72 0 -127.5 33.5 t-95.5 67.5t-79 34q-82 -16 -83 -127h-140zM430 541h416l-209 565z" /> +<glyph unicode="Ä" horiz-adv-x="1282" d="M20 0l521 1376h200l521 -1376h-218l-135 365h-544l-134 -365h-211zM272 1624q0 51 35 85t88 34q49 0 84 -34t35 -85q0 -49 -35 -83t-84 -34q-51 0 -87 34t-36 83zM430 541h416l-209 565zM762 1624q0 51 34.5 85t86 34t86.5 -34t35 -85q0 -49 -35 -83t-86.5 -34t-86 34 t-34.5 83z" /> +<glyph unicode="Å" horiz-adv-x="1282" d="M20 0l521 1376h200l521 -1376h-218l-135 365h-544l-134 -365h-211zM430 541h416l-209 565zM438 1622q0 66 51.5 114t147.5 48t147.5 -48t51.5 -114q0 -72 -50.5 -120t-148.5 -48t-148.5 48t-50.5 120zM543 1620q0 -39 24.5 -65.5t69.5 -26.5q43 0 69.5 27.5t26.5 64.5 q0 35 -24.5 61.5t-71.5 26.5t-70.5 -25.5t-23.5 -62.5z" /> +<glyph unicode="Æ" horiz-adv-x="1802" d="M-12 0l766 1366h948v-176h-621v-406h490v-178h-490v-430h627v-176h-836v422h-426l-233 -422h-225zM543 598h329v592z" /> +<glyph unicode="Ç" horiz-adv-x="1384" d="M94 668q0 309 206 516t542 207q127 0 242.5 -29t166.5 -57l52 -29l-82 -184q-16 12 -48 31.5t-134.5 52t-209.5 32.5q-240 0 -377 -152.5t-137 -369.5q0 -229 146.5 -378.5t367.5 -149.5q106 0 208 33.5t151 66.5l47 33l86 -158l-22 -16q-13 -10 -62 -38t-103.5 -48.5 t-139.5 -38t-175 -17.5l-4 -12q-20 -41 -20 -61q0 -23 27.5 -40.5t60 -29.5t60.5 -45t28 -80q0 -78 -66.5 -135t-169.5 -57q-53 0 -102 15t-72 32l-24 16l47 107q66 -57 147 -58q45 0 72.5 17.5t27.5 44.5q0 23 -26.5 41t-57 30.5t-57 36t-26.5 56.5q0 25 34 104l13 25 q-270 31 -443.5 217t-173.5 469z" /> +<glyph unicode="È" horiz-adv-x="1116" d="M186 0v1366h832v-176h-621v-406h490v-178h-490v-430h627v-176h-838zM334 1606l67 166l416 -195l-43 -115z" /> +<glyph unicode="É" horiz-adv-x="1116" d="M186 0v1366h832v-176h-621v-406h490v-178h-490v-430h627v-176h-838zM410 1577l415 195l68 -166l-440 -144z" /> +<glyph unicode="Ê" horiz-adv-x="1116" d="M186 0v1366h832v-176h-621v-406h490v-178h-490v-430h627v-176h-838zM272 1552l258 232h168l256 -232l-110 -82l-230 191l-233 -191z" /> +<glyph unicode="Ë" horiz-adv-x="1116" d="M186 0v1366h832v-176h-621v-406h490v-178h-490v-430h627v-176h-838zM248 1624q0 51 34.5 85t88.5 34q49 0 83.5 -34t34.5 -85q0 -49 -34.5 -83t-83.5 -34q-51 0 -87 34t-36 83zM737 1624q0 51 35 85t86 34t86 -34t35 -85q0 -49 -35 -83t-86 -34t-86 34t-35 83z" /> +<glyph unicode="Ì" horiz-adv-x="585" d="M14 1606l68 166l416 -195l-43 -115zM186 0v1366h211v-1366h-211z" /> +<glyph unicode="Í" horiz-adv-x="585" d="M90 1577l416 195l67 -166l-440 -144zM186 0v1366h211v-1366h-211z" /> +<glyph unicode="Î" horiz-adv-x="585" d="M-47 1552l258 232h168l256 -232l-111 -82l-229 191l-234 -191zM186 0v1366h211v-1366h-211z" /> +<glyph unicode="Ï" horiz-adv-x="585" d="M-23 1626q0 51 35 84t86.5 33t85 -33t33.5 -84t-33.5 -83t-85 -32t-86.5 33t-35 82zM186 0v1366h211v-1366h-211zM377 1626q0 51 33.5 84t85 33t86 -33t34.5 -84q0 -49 -34.5 -82t-86 -33t-85 32t-33.5 83z" /> +<glyph unicode="Ð" horiz-adv-x="1507" d="M63 608v170h148v588h444q145 0 275.5 -36t241 -111.5t175 -207.5t64.5 -306q0 -336 -227.5 -520.5t-605.5 -184.5h-367v608h-148zM420 176h137q326 0 478.5 140.5t152.5 372t-145.5 366.5t-415.5 135h-207v-412h338v-170h-338v-432z" /> +<glyph unicode="Ñ" horiz-adv-x="1529" d="M186 0v1366h213l738 -1047v1047h206v-1366h-213l-737 1034v-1034h-207zM393 1495q4 2 0 26.5t7.5 64.5t28.5 78t64.5 64.5t112.5 26.5q72 0 129.5 -33.5t100.5 -66.5t82 -33q80 16 79 131h142q-4 -2 0 -27.5t-8.5 -66.5t-31 -79t-66.5 -65.5t-115 -27.5 q-72 0 -127.5 33.5t-95.5 67.5t-79 34q-82 -16 -84 -127h-139z" /> +<glyph unicode="Ò" horiz-adv-x="1634" d="M92 680q0 184 83 344t253 263.5t395 103.5q324 0 521.5 -196t197.5 -486q0 -299 -207 -516.5t-530 -217.5q-315 0 -514 207t-199 498zM315 690q0 -209 134.5 -371.5t361.5 -162.5q229 0 368.5 161.5t139.5 374.5q0 211 -135 364.5t-366.5 153.5t-367 -154.5 t-135.5 -365.5zM537 1606l67 166l416 -195l-43 -115z" /> +<glyph unicode="Ó" horiz-adv-x="1634" d="M92 680q0 184 83 344t253 263.5t395 103.5q324 0 521.5 -196t197.5 -486q0 -299 -207 -516.5t-530 -217.5q-315 0 -514 207t-199 498zM315 690q0 -209 134.5 -371.5t361.5 -162.5q229 0 368.5 161.5t139.5 374.5q0 211 -135 364.5t-366.5 153.5t-367 -154.5 t-135.5 -365.5zM612 1577l416 195l68 -166l-441 -144z" /> +<glyph unicode="Ô" horiz-adv-x="1634" d="M92 680q0 184 83 344t253 263.5t395 103.5q324 0 521.5 -196t197.5 -486q0 -299 -207 -516.5t-530 -217.5q-315 0 -514 207t-199 498zM315 690q0 -209 134.5 -371.5t361.5 -162.5q229 0 368.5 161.5t139.5 374.5q0 211 -135 364.5t-366.5 153.5t-367 -154.5 t-135.5 -365.5zM475 1552l258 232h168l256 -232l-110 -82l-230 191l-233 -191z" /> +<glyph unicode="Õ" horiz-adv-x="1634" d="M92 680q0 184 83 344t253 263.5t395 103.5q324 0 521.5 -196t197.5 -486q0 -299 -207 -516.5t-530 -217.5q-315 0 -514 207t-199 498zM315 690q0 -209 134.5 -371.5t361.5 -162.5q229 0 368.5 161.5t139.5 374.5q0 211 -135 364.5t-366.5 153.5t-367 -154.5 t-135.5 -365.5zM444 1495q4 2 0 26.5t7.5 64.5t29 78t64.5 64.5t112 26.5q72 0 129.5 -33.5t100.5 -66.5t82 -33q80 16 80 131h141q-4 -2 0 -27.5t-8.5 -66.5t-30.5 -79t-66.5 -65.5t-115.5 -27.5q-72 0 -127.5 33.5t-95 67.5t-78.5 34q-82 -16 -84 -127h-140z" /> +<glyph unicode="Ö" horiz-adv-x="1634" d="M92 680q0 184 83 344t253 263.5t395 103.5q324 0 521.5 -196t197.5 -486q0 -299 -207 -516.5t-530 -217.5q-315 0 -514 207t-199 498zM315 690q0 -209 134.5 -371.5t361.5 -162.5q229 0 368.5 161.5t139.5 374.5q0 211 -135 364.5t-366.5 153.5t-367 -154.5 t-135.5 -365.5zM451 1624q0 51 34.5 85t87.5 34q49 0 84 -34t35 -85q0 -49 -34.5 -83t-84.5 -34q-51 0 -86.5 34t-35.5 83zM940 1624q0 51 35 85t86 34t86 -34t35 -85q0 -49 -35 -83t-86 -34t-86 34t-35 83z" /> +<glyph unicode="×" horiz-adv-x="1064" d="M78 150l354 364l-354 367l98 102l356 -367l357 367l98 -102l-356 -367l356 -364l-100 -103l-355 365l-354 -365z" /> +<glyph unicode="Ø" horiz-adv-x="1634" d="M92 680q0 184 83 344t253 263.5t395 103.5q213 0 381 -95l99 131h145l-148 -194q115 -94 178.5 -230.5t63.5 -293.5q0 -299 -207 -516.5t-530 -217.5q-211 0 -383 103l-107 -139h-147l160 208q-236 207 -236 533zM315 690q0 -221 138 -377l630 826q-117 72 -266 71 q-231 0 -366.5 -155.5t-135.5 -364.5zM541 236q119 -80 270 -80q229 0 368.5 161.5t139.5 374.5q0 223 -145 375z" /> +<glyph unicode="Ù" horiz-adv-x="1466" d="M170 500v866h211v-836q0 -193 96 -283.5t258 -90.5q160 0 256 92t96 272v846h209v-838q0 -260 -160.5 -406.5t-402.5 -146.5q-252 0 -407.5 128.5t-155.5 396.5zM453 1606l67 166l416 -195l-43 -115z" /> +<glyph unicode="Ú" horiz-adv-x="1466" d="M170 500v866h211v-836q0 -193 96 -283.5t258 -90.5q160 0 256 92t96 272v846h209v-838q0 -260 -160.5 -406.5t-402.5 -146.5q-252 0 -407.5 128.5t-155.5 396.5zM528 1577l416 195l68 -166l-441 -144z" /> +<glyph unicode="Û" horiz-adv-x="1466" d="M170 500v866h211v-836q0 -193 96 -283.5t258 -90.5q160 0 256 92t96 272v846h209v-838q0 -260 -160.5 -406.5t-402.5 -146.5q-252 0 -407.5 128.5t-155.5 396.5zM391 1552l258 232h168l256 -232l-110 -82l-230 191l-233 -191z" /> +<glyph unicode="Ü" horiz-adv-x="1466" d="M170 500v866h211v-836q0 -193 96 -283.5t258 -90.5q160 0 256 92t96 272v846h209v-838q0 -260 -160.5 -406.5t-402.5 -146.5q-252 0 -407.5 128.5t-155.5 396.5zM367 1624q0 51 34.5 85t87.5 34q49 0 84 -34t35 -85q0 -49 -34.5 -83t-84.5 -34q-51 0 -86.5 34t-35.5 83z M856 1624q0 51 35 85t86 34t86 -34t35 -85q0 -49 -35 -83t-86 -34t-86 34t-35 83z" /> +<glyph unicode="Ý" horiz-adv-x="1208" d="M8 1366h248l350 -575l357 575h237l-489 -780v-586h-211v584zM408 1577l415 195l68 -166l-440 -144z" /> +<glyph unicode="Þ" horiz-adv-x="1169" d="M186 0v1366h211v-297h248q242 0 353.5 -104.5t111.5 -268.5q0 -190 -126 -297.5t-339 -107.5h-248v-291h-211zM397 467h213q276 0 277 215q0 211 -277 211h-213v-426z" /> +<glyph unicode="ß" horiz-adv-x="1185" d="M51 772v109l146 53v76q0 223 108.5 345t310.5 122q172 0 269.5 -84t97.5 -209q0 -66 -29.5 -126.5t-65.5 -99t-65.5 -91t-29.5 -99.5q0 -53 34.5 -99t84.5 -85l101 -81q50 -42 85 -104.5t35 -136.5q0 -129 -97.5 -208t-261.5 -79q-158 0 -252 66l35 168q92 -74 211 -74 q72 0 113 34t41 89q0 47 -34 89t-81 77t-94 74t-81 99t-34 136q0 72 28.5 133.5t62.5 98t62.5 89t28.5 105.5q0 76 -51 116t-123 40q-96 0 -151.5 -73t-55.5 -224v-1018h-202v772h-146z" /> +<glyph unicode="à" horiz-adv-x="980" d="M66 213q0 285 548 356v17q0 43 -1 64.5t-8 53t-21.5 47t-42 26.5t-68.5 11q-68 0 -140.5 -26.5t-111.5 -52.5l-41 -27l-53 152q18 12 51 31.5t137.5 52t212.5 32.5q162 0 225.5 -68.5t63.5 -228.5v-391q0 -51 25.5 -79.5t50.5 -32.5l27 -5l-62 -159q-180 12 -227 143 q-18 -29 -48 -58.5t-99.5 -62.5t-151.5 -33q-121 0 -193.5 67t-72.5 171zM160 1438h205l208 -336l-112 -64zM274 227q0 -92 109 -92t231 144v159q-340 -51 -340 -211z" /> +<glyph unicode="á" horiz-adv-x="980" d="M66 213q0 285 548 356v17q0 43 -1 64.5t-8 53t-21.5 47t-42 26.5t-68.5 11q-68 0 -140.5 -26.5t-111.5 -52.5l-41 -27l-53 152q18 12 51 31.5t137.5 52t212.5 32.5q162 0 225.5 -68.5t63.5 -228.5v-391q0 -51 25.5 -79.5t50.5 -32.5l27 -5l-62 -159q-180 12 -227 143 q-18 -29 -48 -58.5t-99.5 -62.5t-151.5 -33q-121 0 -193.5 67t-72.5 171zM274 227q0 -92 109 -92t231 144v159q-340 -51 -340 -211zM365 1102l208 336h205l-301 -400z" /> +<glyph unicode="â" horiz-adv-x="980" d="M66 213q0 285 548 356v17q0 43 -1 64.5t-8 53t-21.5 47t-42 26.5t-68.5 11q-68 0 -140.5 -26.5t-111.5 -52.5l-41 -27l-53 152q18 12 51 31.5t137.5 52t212.5 32.5q162 0 225.5 -68.5t63.5 -228.5v-391q0 -51 25.5 -79.5t50.5 -32.5l27 -5l-62 -159q-180 12 -227 143 q-18 -29 -48 -58.5t-99.5 -62.5t-151.5 -33q-121 0 -193.5 67t-72.5 171zM170 1092l233 346h132l231 -348l-119 -54l-180 250l-178 -250zM274 227q0 -92 109 -92t231 144v159q-340 -51 -340 -211z" /> +<glyph unicode="ã" horiz-adv-x="980" d="M66 213q0 285 548 356v17q0 43 -1 64.5t-8 53t-21.5 47t-42 26.5t-68.5 11q-68 0 -140.5 -26.5t-111.5 -52.5l-41 -27l-53 152q18 12 51 31.5t137.5 52t212.5 32.5q162 0 225.5 -68.5t63.5 -228.5v-391q0 -51 25.5 -79.5t50.5 -32.5l27 -5l-62 -159q-180 12 -227 143 q-18 -29 -48 -58.5t-99.5 -62.5t-151.5 -33q-121 0 -193.5 67t-72.5 171zM145 1126q4 2 0 28t6.5 67t26 78.5t56 65.5t100.5 28q53 0 96 -25t65.5 -53.5t50 -53t52.5 -24.5q66 10 66 143h131q-4 -2 0 -28.5t-7.5 -68.5t-27 -81t-58.5 -67.5t-102 -28.5q-53 0 -95 24.5 t-63.5 54t-48 54.5t-53.5 25q-63 -8 -64 -138h-131zM274 227q0 -92 109 -92t231 144v159q-340 -51 -340 -211z" /> +<glyph unicode="ä" horiz-adv-x="980" d="M66 213q0 285 548 356v17q0 43 -1 64.5t-8 53t-21.5 47t-42 26.5t-68.5 11q-68 0 -140.5 -26.5t-111.5 -52.5l-41 -27l-53 152q18 12 51 31.5t137.5 52t212.5 32.5q162 0 225.5 -68.5t63.5 -228.5v-391q0 -51 25.5 -79.5t50.5 -32.5l27 -5l-62 -159q-180 12 -227 143 q-18 -29 -48 -58.5t-99.5 -62.5t-151.5 -33q-121 0 -193.5 67t-72.5 171zM147 1270q0 51 35 83.5t86 32.5t85 -32.5t34 -83.5t-34 -83t-85 -32t-86 33t-35 82zM274 227q0 -92 109 -92t231 144v159q-340 -51 -340 -211zM547 1270q0 51 33.5 83.5t85 32.5t86 -32.5t34.5 -83.5 q0 -49 -34.5 -82t-86 -33t-85 32t-33.5 83z" /> +<glyph unicode="å" horiz-adv-x="980" d="M66 213q0 285 548 356v17q0 43 -1 64.5t-8 53t-21.5 47t-42 26.5t-68.5 11q-68 0 -140.5 -26.5t-111.5 -52.5l-41 -27l-53 152q18 12 51 31.5t137.5 52t212.5 32.5q162 0 225.5 -68.5t63.5 -228.5v-391q0 -51 25.5 -79.5t50.5 -32.5l27 -5l-62 -159q-180 12 -227 143 q-18 -29 -48 -58.5t-99.5 -62.5t-151.5 -33q-121 0 -193.5 67t-72.5 171zM270 1276q0 70 50.5 121t146.5 51t146.5 -51t50.5 -121q0 -72 -50.5 -125t-146.5 -53t-146.5 53t-50.5 125zM274 227q0 -92 109 -92t231 144v159q-340 -51 -340 -211zM375 1274q0 -37 23.5 -63.5 t68.5 -26.5t70.5 26.5t25.5 63.5q0 35 -24.5 60.5t-71.5 25.5t-69.5 -24.5t-22.5 -61.5z" /> +<glyph unicode="æ" horiz-adv-x="1538" d="M66 213q0 266 565 334v49q0 68 -6.5 102.5t-39 62t-98.5 27.5q-152 0 -303 -104l-4 -2l-53 152q18 12 51 31.5t136.5 52t207.5 32.5q197 0 252 -129q117 129 297 129q170 0 274.5 -111.5t104.5 -312.5l-115 -34l-508 -64q12 -129 88 -208t197 -79q72 0 142.5 28t105.5 56 l37 29l61 -145q-16 -14 -46 -37t-127 -60t-202 -37q-262 0 -381 209q-39 -82 -129 -145.5t-219 -63.5t-208.5 67t-79.5 171zM274 227q0 -92 121 -92q92 0 161 69.5t69 172.5v39q-351 -46 -351 -189zM829 563l402 49q0 8 -2 19.5t-13.5 43.5t-29 55.5t-52 43t-81.5 19.5 q-92 0 -150 -64t-74 -166z" /> +<glyph unicode="ç" horiz-adv-x="944" d="M80 451q0 203 134 351t353 148q90 0 169 -24.5t112 -48.5l35 -25l-80 -152q-96 86 -232 86q-125 0 -202.5 -91t-77.5 -234q0 -139 75.5 -229.5t202.5 -90.5q141 4 248 97l66 -144q-12 -12 -36 -31.5t-108 -53.5t-182 -34l-6 -14q-20 -41 -21 -61q0 -23 28 -40.5 t60.5 -29.5t60.5 -45t28 -80q0 -78 -67 -135t-169 -57q-53 0 -102.5 16t-73.5 33l-23 14l47 107q66 -57 148 -58q45 0 72.5 17.5t27.5 44.5q0 23 -26.5 41t-57 30.5t-57.5 36t-27 55.5q0 25 35 105l15 31q-170 33 -269.5 160t-99.5 305z" /> +<glyph unicode="è" horiz-adv-x="1003" d="M82 449q0 215 126 358t327 143q170 0 275 -113.5t105 -318.5l-116 -33l-506 -67q16 -129 92 -203t195 -74q70 0 140.5 29t106.5 57l37 29l58 -147q-16 -14 -46 -37t-127.5 -60t-199.5 -37q-221 0 -344 137.5t-123 336.5zM205 1438h205l208 -336l-112 -64zM293 553l401 51 q0 8 -2 20.5t-13 45t-27.5 57.5t-51.5 45.5t-80 20.5q-94 0 -153.5 -67t-73.5 -173z" /> +<glyph unicode="é" horiz-adv-x="1003" d="M82 449q0 215 126 358t327 143q170 0 275 -113.5t105 -318.5l-116 -33l-506 -67q16 -129 92 -203t195 -74q70 0 140.5 29t106.5 57l37 29l58 -147q-16 -14 -46 -37t-127.5 -60t-199.5 -37q-221 0 -344 137.5t-123 336.5zM293 553l401 51q0 8 -2 20.5t-13 45t-27.5 57.5 t-51.5 45.5t-80 20.5q-94 0 -153.5 -67t-73.5 -173zM410 1102l208 336h205l-301 -400z" /> +<glyph unicode="ê" horiz-adv-x="1003" d="M82 449q0 215 126 358t327 143q170 0 275 -113.5t105 -318.5l-116 -33l-506 -67q16 -129 92 -203t195 -74q70 0 140.5 29t106.5 57l37 29l58 -147q-16 -14 -46 -37t-127.5 -60t-199.5 -37q-221 0 -344 137.5t-123 336.5zM217 1092l234 346h131l231 -348l-119 -54 l-180 250l-178 -250zM293 553l401 51q0 8 -2 20.5t-13 45t-27.5 57.5t-51.5 45.5t-80 20.5q-94 0 -153.5 -67t-73.5 -173z" /> +<glyph unicode="ë" horiz-adv-x="1003" d="M82 449q0 215 126 358t327 143q170 0 275 -113.5t105 -318.5l-116 -33l-506 -67q16 -129 92 -203t195 -74q70 0 140.5 29t106.5 57l37 29l58 -147q-16 -14 -46 -37t-127.5 -60t-199.5 -37q-221 0 -344 137.5t-123 336.5zM195 1270q0 51 34.5 83.5t86 32.5t85 -32.5 t33.5 -83.5t-33.5 -83t-85 -32t-86 33t-34.5 82zM293 553l401 51q0 8 -2 20.5t-13 45t-27.5 57.5t-51.5 45.5t-80 20.5q-94 0 -153.5 -67t-73.5 -173zM594 1270q0 51 34 83.5t85 32.5t86 -32.5t35 -83.5q0 -49 -35 -82t-86 -33t-85 32t-34 83z" /> +<glyph unicode="ì" d="M-63 1438h204l209 -336l-112 -64zM143 0v926h203v-926h-203z" /> +<glyph unicode="í" d="M141 1102l209 336h205l-301 -400zM143 0v926h203v-926h-203z" /> +<glyph unicode="î" d="M-53 1092l233 346h131l232 -348l-119 -54l-180 250l-178 -250zM143 0v926h203v-926h-203z" /> +<glyph unicode="ï" d="M-76 1270q0 51 35 83.5t86 32.5t85 -32.5t34 -83.5t-34 -83t-85 -32t-86 33t-35 82zM143 0v926h203v-926h-203zM324 1270q0 51 33.5 83.5t85 32.5t86 -32.5t34.5 -83.5q0 -49 -34.5 -82t-86 -33t-85 32t-33.5 83z" /> +<glyph unicode="ð" horiz-adv-x="1110" d="M80 446q0 201 128 352.5t322 151.5q158 0 228 -78q-72 176 -219 304l-265 -156l-63 115l209 122q-117 70 -266 109l41 152q217 -41 395 -160l289 170l63 -115l-242 -141q147 -133 227.5 -313.5t80.5 -383.5q0 -268 -128 -434t-354 -166q-205 0 -325.5 140.5t-120.5 330.5 zM285 465q0 -127 65.5 -227.5t184.5 -100.5q121 0 197.5 102.5t76.5 317.5q0 102 -57.5 166.5t-171.5 64.5q-129 0 -212 -91t-83 -232z" /> +<glyph unicode="ñ" horiz-adv-x="1085" d="M139 0v909l199 33v-176q168 184 369 184q115 0 180 -69.5t65 -212.5v-668h-202v594q0 180 -111 180q-117 0 -297 -174v-600h-203zM233 1126q4 2 0 28t6.5 67t26 78.5t56 65.5t100.5 28q53 0 96 -25t65.5 -53.5t50.5 -53t52 -24.5q66 10 66 143h131q-4 -2 0 -28.5 t-7.5 -68.5t-26.5 -81t-58 -67.5t-103 -28.5q-53 0 -95 24.5t-63.5 54t-48 54.5t-53.5 25q-63 -8 -63 -138h-132z" /> +<glyph unicode="ò" horiz-adv-x="1114" d="M80 459q0 195 125 343t356 148q219 0 346 -139t127 -330q0 -88 -29.5 -175t-85 -161.5t-151.5 -122t-215 -47.5q-219 0 -346 143.5t-127 340.5zM248 1438h205l209 -336l-113 -64zM291 477q0 -141 68.5 -240.5t199.5 -99.5q117 0 190.5 89t73.5 229q0 137 -67.5 235 t-198.5 98q-119 0 -192.5 -86t-73.5 -225z" /> +<glyph unicode="ó" horiz-adv-x="1114" d="M80 459q0 195 125 343t356 148q219 0 346 -139t127 -330q0 -88 -29.5 -175t-85 -161.5t-151.5 -122t-215 -47.5q-219 0 -346 143.5t-127 340.5zM291 477q0 -141 68.5 -240.5t199.5 -99.5q117 0 190.5 89t73.5 229q0 137 -67.5 235t-198.5 98q-119 0 -192.5 -86 t-73.5 -225zM453 1102l209 336h204l-301 -400z" /> +<glyph unicode="ô" horiz-adv-x="1114" d="M80 459q0 195 125 343t356 148q219 0 346 -139t127 -330q0 -88 -29.5 -175t-85 -161.5t-151.5 -122t-215 -47.5q-219 0 -346 143.5t-127 340.5zM260 1092l234 346h131l231 -348l-119 -54l-180 250l-178 -250zM291 477q0 -141 68.5 -240.5t199.5 -99.5q117 0 190.5 89 t73.5 229q0 137 -67.5 235t-198.5 98q-119 0 -192.5 -86t-73.5 -225z" /> +<glyph unicode="õ" horiz-adv-x="1114" d="M80 459q0 195 125 343t356 148q219 0 346 -139t127 -330q0 -88 -29.5 -175t-85 -161.5t-151.5 -122t-215 -47.5q-219 0 -346 143.5t-127 340.5zM236 1126q4 2 -0.5 28t6 67t26 78.5t56.5 65.5t100 28q53 0 96 -25t65.5 -53.5t50.5 -53t52 -24.5q66 10 66 143h131 q-4 -2 0 -28.5t-7.5 -68.5t-26.5 -81t-58 -67.5t-103 -28.5q-53 0 -95 24.5t-63.5 54t-48 54.5t-53.5 25q-63 -8 -63 -138h-131zM291 477q0 -141 68.5 -240.5t199.5 -99.5q117 0 190.5 89t73.5 229q0 137 -67.5 235t-198.5 98q-119 0 -192.5 -86t-73.5 -225z" /> +<glyph unicode="ö" horiz-adv-x="1114" d="M80 459q0 195 125 343t356 148q219 0 346 -139t127 -330q0 -88 -29.5 -175t-85 -161.5t-151.5 -122t-215 -47.5q-219 0 -346 143.5t-127 340.5zM238 1270q0 51 34.5 83.5t86 32.5t85 -32.5t33.5 -83.5t-33.5 -83t-85 -32t-86 33t-34.5 82zM291 477q0 -141 68.5 -240.5 t199.5 -99.5q117 0 190.5 89t73.5 229q0 137 -67.5 235t-198.5 98q-119 0 -192.5 -86t-73.5 -225zM637 1270q0 51 34 83.5t85 32.5t86 -32.5t35 -83.5q0 -49 -35 -82t-86 -33t-85 32t-34 83z" /> +<glyph unicode="÷" horiz-adv-x="1064" d="M74 442v148h917v-148h-917zM401 127q0 55 39 94t92 39q55 0 93.5 -39t38.5 -94q0 -53 -38 -92t-94 -39q-53 0 -92 39t-39 92zM401 903q0 53 39 92t92 39q55 0 93.5 -39t38.5 -92t-38 -92t-94 -39q-53 0 -92 39t-39 92z" /> +<glyph unicode="ø" horiz-adv-x="1114" d="M80 459q0 195 125 343t356 148q137 0 244 -61l74 98h135l-121 -162q141 -137 141 -344q0 -88 -29.5 -175t-85 -161.5t-151.5 -122t-215 -47.5q-133 0 -246 62l-74 -98h-137l123 165q-139 140 -139 355zM291 477q0 -121 49 -211l358 479q-59 43 -141 43q-119 0 -192.5 -86 t-73.5 -225zM414 182q61 -45 145 -45q117 0 190.5 89t73.5 229q0 119 -51 209z" /> +<glyph unicode="ù" horiz-adv-x="1079" d="M135 254v672h203v-594q0 -180 115 -180q113 0 276 151v623h203v-641q0 -49 10 -120t21 -116l10 -47l-197 -18q-20 96 -31 163q-162 -172 -358 -172q-252 0 -252 279zM225 1438h205l209 -336l-113 -64z" /> +<glyph unicode="ú" horiz-adv-x="1079" d="M135 254v672h203v-594q0 -180 115 -180q113 0 276 151v623h203v-641q0 -49 10 -120t21 -116l10 -47l-197 -18q-20 96 -31 163q-162 -172 -358 -172q-252 0 -252 279zM430 1102l209 336h205l-301 -400z" /> +<glyph unicode="û" horiz-adv-x="1079" d="M135 254v672h203v-594q0 -180 115 -180q113 0 276 151v623h203v-641q0 -49 10 -120t21 -116l10 -47l-197 -18q-20 96 -31 163q-162 -172 -358 -172q-252 0 -252 279zM236 1092l233 346h131l231 -348l-118 -54l-181 250l-178 -250z" /> +<glyph unicode="ü" horiz-adv-x="1079" d="M135 254v672h203v-594q0 -180 115 -180q113 0 276 151v623h203v-641q0 -49 10 -120t21 -116l10 -47l-197 -18q-20 96 -31 163q-162 -172 -358 -172q-252 0 -252 279zM213 1270q0 51 35 83.5t86 32.5t85 -32.5t34 -83.5t-34 -83t-85 -32t-86 33t-35 82zM612 1270 q0 51 34 83.5t85 32.5t86 -32.5t35 -83.5q0 -49 -35 -82t-86 -33t-85 32t-34 83z" /> +<glyph unicode="ý" horiz-adv-x="952" d="M23 926h215l243 -635l240 635h209l-402 -996q-156 -385 -432 -415l-63 161q98 16 177 88t122 173l49 110zM379 1102l209 336h205l-301 -400z" /> +<glyph unicode="þ" horiz-adv-x="1089" d="M143 -477v1909l203 32v-661q86 147 270 147q178 0 285 -131t107 -330q0 -213 -127 -363.5t-346 -150.5q-123 0 -189 50v-469zM346 236q0 -47 42 -73t114 -26q135 0 214 89t79 251q0 141 -58.5 223t-154.5 82q-129 0 -236 -149v-397z" /> +<glyph unicode="ÿ" horiz-adv-x="952" d="M23 926h215l243 -635l240 635h209l-402 -996q-156 -385 -432 -415l-63 161q98 16 177 88t122 173l49 110zM164 1270q0 51 34.5 83.5t86 32.5t85 -32.5t33.5 -83.5t-33.5 -83t-85 -32t-86 33t-34.5 82zM563 1270q0 51 34 83.5t85 32.5t86 -32.5t35 -83.5q0 -49 -35 -82 t-86 -33t-85 32t-34 83z" /> +<glyph unicode="Œ" horiz-adv-x="2017" d="M92 680q0 137 48 263t139.5 226.5t235.5 161t323 60.5q133 0 256 -25h823v-176h-619v-406h490v-178h-490v-430h625v-176h-836q-133 -25 -266 -25q-332 0 -530.5 205t-198.5 500zM315 690q0 -96 31 -188t91.5 -171t161.5 -127t230 -48q154 0 258 22v1000q-113 33 -258 32 q-242 0 -378 -153.5t-136 -366.5z" /> +<glyph unicode="œ" horiz-adv-x="1742" d="M80 459q0 195 125 343t356 148q240 0 369 -184q125 184 344 184q170 0 275.5 -113.5t105.5 -318.5l-115 -33l-512 -69q16 -127 92 -201t199 -74q70 0 140.5 28t105.5 56l37 29l61 -145q-16 -14 -46 -37t-127 -60t-200 -37q-242 0 -368 187q-131 -186 -369 -187 q-219 0 -346 143.5t-127 340.5zM291 477q0 -141 68.5 -240.5t199.5 -99.5q117 0 190.5 89t73.5 229q0 137 -67.5 235t-198.5 98q-119 0 -192.5 -86t-73.5 -225zM1028 553l406 51q0 8 -2 20.5t-12.5 45t-28 57.5t-52 45.5t-79.5 20.5q-98 0 -158 -67t-74 -173z" /> +<glyph unicode="Ÿ" horiz-adv-x="1208" d="M8 1366h248l350 -575l357 575h237l-489 -780v-586h-211v584zM246 1624q0 51 34.5 85t88.5 34q49 0 83.5 -34t34.5 -85q0 -49 -34.5 -83t-83.5 -34q-51 0 -87 34t-36 83zM735 1624q0 51 35 85t86 34t86 -34t35 -85q0 -49 -35 -83t-86 -34t-86 34t-35 83z" /> +<glyph unicode="ˆ" horiz-adv-x="1038" d="M221 1092l234 346h131l231 -348l-119 -54l-180 250l-178 -250z" /> +<glyph unicode="˜" horiz-adv-x="1038" d="M199 1126q4 2 0 28t6 67t25.5 78.5t56.5 65.5t100 28q53 0 96 -25t65.5 -53.5t50.5 -53t52 -24.5q66 10 66 143h131q-4 -2 0 -28.5t-7.5 -68.5t-26.5 -81t-58 -67.5t-103 -28.5q-53 0 -95 24.5t-63.5 54t-48 54.5t-53.5 25q-63 -8 -63 -138h-131z" /> +<glyph unicode=" " horiz-adv-x="892" /> +<glyph unicode=" " horiz-adv-x="1784" /> +<glyph unicode=" " horiz-adv-x="892" /> +<glyph unicode=" " horiz-adv-x="1784" /> +<glyph unicode=" " horiz-adv-x="594" /> +<glyph unicode=" " horiz-adv-x="446" /> +<glyph unicode=" " horiz-adv-x="297" /> +<glyph unicode=" " horiz-adv-x="297" /> +<glyph unicode=" " horiz-adv-x="223" /> +<glyph unicode=" " horiz-adv-x="356" /> +<glyph unicode=" " horiz-adv-x="99" /> +<glyph unicode="‐" horiz-adv-x="720" d="M111 438v156h499v-156h-499z" /> +<glyph unicode="‑" horiz-adv-x="720" d="M111 438v156h499v-156h-499z" /> +<glyph unicode="‒" horiz-adv-x="720" d="M111 438v156h499v-156h-499z" /> +<glyph unicode="–" horiz-adv-x="1062" d="M111 449v147h839v-147h-839z" /> +<glyph unicode="—" horiz-adv-x="1861" d="M111 449v147h1638v-147h-1638z" /> +<glyph unicode="‘" horiz-adv-x="444" d="M92 1174q0 195 199 346l78 -82q-113 -86 -113 -195q0 -94 123 -225l-178 -100q-109 117 -109 256z" /> +<glyph unicode="’" horiz-adv-x="432" d="M63 1421l181 99q109 -115 108 -254q0 -193 -198 -348l-78 83q113 86 112 195q0 51 -26.5 101t-98.5 124z" /> +<glyph unicode="‚" d="M90 174l186 98q113 -119 113 -254q0 -190 -203 -348l-77 84q117 90 116 193q0 49 -29.5 99t-105.5 128z" /> +<glyph unicode="“" horiz-adv-x="802" d="M92 1174q0 195 199 346l78 -82q-113 -86 -113 -195q0 -94 123 -225l-178 -100q-109 117 -109 256zM451 1174q0 195 198 346l78 -82q-113 -86 -113 -195q0 -94 123 -225l-178 -100q-108 117 -108 256z" /> +<glyph unicode="”" horiz-adv-x="790" d="M63 1421l181 99q109 -115 108 -254q0 -193 -198 -348l-78 83q113 86 112 195q0 51 -26.5 101t-98.5 124zM424 1421l178 99q109 -115 109 -254q0 -193 -199 -348l-78 83q113 86 113 195q0 94 -123 225z" /> +<glyph unicode="„" horiz-adv-x="849" d="M90 174l186 98q113 -119 113 -254q0 -190 -203 -348l-77 84q117 90 116 193q0 49 -29.5 99t-105.5 128zM449 174l186 98q113 -119 113 -254q0 -190 -203 -348l-78 84q117 90 117 193q0 49 -29.5 99t-105.5 128z" /> +<glyph unicode="•" horiz-adv-x="802" d="M106 524q0 125 85 210t210 85t210 -85t85 -210t-85 -210t-210 -85t-210 85t-85 210z" /> +<glyph unicode="…" horiz-adv-x="1622" d="M113 112.5q0 57.5 40 98.5t97 41t98 -41t41 -98.5t-41 -97.5t-98 -40t-97 40t-40 97.5zM674 112.5q0 57.5 40 98.5t97 41t98 -41t41 -98.5t-41 -97.5t-98 -40t-97 40t-40 97.5zM1233 112.5q0 57.5 41 98.5t98.5 41t98 -41t40.5 -98.5t-40.5 -97.5t-98 -40t-98.5 40 t-41 97.5z" /> +<glyph unicode=" " horiz-adv-x="356" /> +<glyph unicode="‹" horiz-adv-x="649" d="M43 510v8q31 23 199 211l194 217l125 -35l-303 -397l303 -397l-125 -35l-166 182l-109 121l-60 66q-26 29 -36 39t-22 20z" /> +<glyph unicode="›" horiz-adv-x="651" d="M90 117l303 397l-303 397l125 35q360 -399 379 -418q6 -4 14 -10v-8q-12 -10 -22.5 -20.5t-35.5 -38.5l-60 -66l-109 -121l-166 -182z" /> +<glyph unicode=" " horiz-adv-x="446" /> +<glyph unicode="€" horiz-adv-x="1148" d="M82 371v108h106q-4 25 -4 80q0 53 4 80h-104v109h123q49 186 187 299.5t339 113.5q82 0 162 -19.5t117 -39.5l39 -19l-52 -168q-117 82 -268 82q-123 0 -201.5 -68.5t-111.5 -180.5h532l-32 -109h-521q-2 -23 -2 -68q0 -49 6 -92h473l-32 -108h-414q39 -106 119 -168 t194 -62q61 0 125 16.5t97 32.5l34 17l50 -150q-127 -82 -322 -82t-332 106.5t-186 289.5h-125z" /> +<glyph unicode="™" horiz-adv-x="1392" d="M74 1270v96h477v-96h-178v-449h-121v449h-178zM639 821l20 545h175l122 -358l125 358h168l21 -545h-115l-16 412l-146 -412h-78l-145 414l-12 -414h-119z" /> +<glyph unicode="" horiz-adv-x="925" d="M0 925h925v-925h-925v925z" /> +<glyph unicode="fi" horiz-adv-x="1110" d="M51 772v109l146 53v70q0 231 118.5 362t313.5 131q168 -2 284 -78l-79 -151q-98 66 -207 65q-100 0 -164 -76.5t-64 -240.5v-90h566v-926h-203v782h-363v-782h-202v772h-146z" /> +<glyph unicode="fl" horiz-adv-x="1142" d="M51 772v109l146 53v70q0 231 118.5 362t313.5 131q125 0 241 -53l127 20v-1464h-200v1288q-94 45 -170 45q-100 0 -164 -76.5t-64 -240.5v-90h256v-154h-256v-772h-202v772h-146z" /> +<glyph unicode="ffi" horiz-adv-x="1720" d="M51 772v109l146 53v39q0 225 118.5 350t313.5 125q145 0 282 -86q113 135 308 135q72 0 139 -19.5t100 -39.5l31 -19l-82 -151q-90 66 -188 65q-92 0 -149.5 -70.5t-57.5 -226.5v-110h563v-926h-201v782h-362v-782h-203v782h-410v-782h-202v772h-146zM399 926h410v98 q0 102 25 186q-100 72 -205 72q-102 0 -166 -70.5t-64 -224.5v-61z" /> +<glyph unicode="ffl" horiz-adv-x="1753" d="M51 772v109l146 53v39q0 225 118.5 350t313.5 125q158 0 289 -90q115 139 313 139q125 0 239 -55l140 22v-1464h-203v1282q-96 51 -178 51q-96 0 -156.5 -74.5t-60.5 -234.5v-98h254v-154h-254v-772h-203v782h-410v-782h-202v772h-146zM399 926h410v86q0 106 29 196 q-106 74 -209 74t-166.5 -70.5t-63.5 -224.5v-61z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansSemiBold-webfont.ttf b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansSemiBold-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b6a7ac228aca0015479521d21c48781ce909df52 Binary files /dev/null and b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansSemiBold-webfont.ttf differ diff --git a/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansSemiBold-webfont.woff b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansSemiBold-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..f643b28633bbcd624879f20e9bebe37cd92af384 Binary files /dev/null and b/app/design/adminhtml/default/backend/Mage_Backend/fonts/calluna/CallunaSansSemiBold-webfont.woff differ diff --git a/app/design/adminhtml/default/backend/Mage_Backend/fonts/icons/admin-icons.eot b/app/design/adminhtml/default/backend/Mage_Backend/fonts/icons/admin-icons.eot new file mode 100644 index 0000000000000000000000000000000000000000..d6211f438c18f823f468026f13495ac70bfee627 Binary files /dev/null and b/app/design/adminhtml/default/backend/Mage_Backend/fonts/icons/admin-icons.eot differ diff --git a/app/design/adminhtml/default/backend/Mage_Backend/fonts/icons/admin-icons.svg b/app/design/adminhtml/default/backend/Mage_Backend/fonts/icons/admin-icons.svg new file mode 100644 index 0000000000000000000000000000000000000000..5c68a1ff608df85b16c6a7860425dd307e4c8cfa --- /dev/null +++ b/app/design/adminhtml/default/backend/Mage_Backend/fonts/icons/admin-icons.svg @@ -0,0 +1,146 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG font generated by IcoMoon. +0 +</metadata> +<defs> +<font id="admin-icons" horiz-adv-x="512" > +<font-face units-per-em="512" ascent="480" descent="-32" /> +<missing-glyph horiz-adv-x="512" /> +<glyph unicode="" d="M 253.209,59.768 L 411.197,147.535 L 492.585,102.318 L 253.209-30.666 L 13.834,102.318 L 95.222,147.535 ZM 492.585,224.667 L 411.197,179.455 L 253.209,91.684 L 95.222,179.455 L 13.834,224.667 L 95.222,269.88 L 176.61,224.667 L 253.209,182.109 L 329.81,224.667 L 411.197,269.88 ZM 492.585,347.01 L 411.197,301.803 L 329.81,256.583 L 253.209,214.025 L 176.61,256.583 L 95.222,301.803 L 13.834,347.01 L 253.209,480.00 Z" /> +<glyph unicode="" d="M 394.648,479.998L 103.009,479.998 c-39.626,0.00-71.729-32.091-71.729-71.729l0.00-368.367 l0.00-0.024 c0.00-39.614, 32.103-71.729, 71.729-71.729 + l 291.639,0.00 c 39.663,0.00, 71.754,32.115, 71.754,71.729l0.00,0.024 L 466.402,408.269 C 466.402,447.906, 434.311,479.998, 394.648,479.998z M 167.101,42.327 + c0.00-9.822-7.973-17.796-17.805-17.796L 98.823,24.531 c-9.834,0.00-17.808,7.974-17.808,17.796l0.00,17.844 c0.00,9.797, 7.973,17.771, 17.808,17.771 + l 50.474,0.00 c 9.832,0.00, 17.805-7.974, 17.805-17.771L 167.102,42.327 z M 167.101,135.499c0.00-9.821-7.973-17.819-17.805-17.819L 98.823,117.68 + c-9.834,0.00-17.808,7.998-17.808,17.819l0.00,17.819 c0.00,9.823, 7.973,17.821, 17.808,17.821l 50.474,0.00 c 9.832,0.00, 17.805-7.998, 17.805-17.821 + L 167.102,135.499 z M 167.101,228.696c0.00-9.821-7.973-17.845-17.805-17.845L 98.823,210.851 c-9.834,0.00-17.808,7.998-17.808,17.845l0.00,17.77 + c0.00,9.848, 7.973,17.82, 17.808,17.82l 50.474,0.00 c 9.832,0.00, 17.805-7.973, 17.805-17.82L 167.102,228.696 z M 290.703,42.327 + c0.00-9.822-7.997-17.796-17.818-17.796l-50.45,0.00 c-9.859,0.00-17.832,7.974-17.832,17.796l0.00,17.844 c0.00,9.797, 7.973,17.771, 17.832,17.771 + l 50.45,0.00 c 9.821,0.00, 17.818-7.974, 17.818-17.771L 290.703,42.327 z M 290.703,135.499c0.00-9.821-7.997-17.819-17.818-17.819l-50.45,0.00 + c-9.859,0.00-17.832,7.998-17.832,17.819l0.00,17.819 c0.00,9.823, 7.973,17.821, 17.832,17.821l 50.45,0.00 c 9.821,0.00, 17.818-7.998, 17.818-17.821 + L 290.703,135.499 z M 290.703,228.696c0.00-9.821-7.997-17.845-17.818-17.845l-50.45,0.00 c-9.859,0.00-17.832,7.998-17.832,17.845l0.00,17.77 + c0.00,9.848, 7.973,17.82, 17.832,17.82l 50.45,0.00 c 9.821,0.00, 17.818-7.973, 17.818-17.82L 290.703,228.696 z M 414.292,42.327 + c0.00-9.822-7.974-17.796-17.819-17.796l-50.436,0.00 c-9.848,0.00-17.82,7.974-17.82,17.796l0.00,17.844 c0.00,9.797, 7.973,17.771, 17.82,17.771l 50.436,0.00 + c 9.846,0.00, 17.819-7.974, 17.819-17.771L 414.292,42.327 z M 414.292,135.499c0.00-9.821-7.974-17.819-17.819-17.819l-50.436,0.00 + c-9.848,0.00-17.82,7.998-17.82,17.819l0.00,17.819 c0.00,9.823, 7.973,17.821, 17.82,17.821l 50.436,0.00 c 9.846,0.00, 17.819-7.998, 17.819-17.821L 414.292,135.499 + z M 414.292,228.696c0.00-9.821-7.974-17.845-17.819-17.845l-50.436,0.00 c-9.848,0.00-17.82,7.998-17.82,17.845l0.00,17.77 + c0.00,9.848, 7.973,17.82, 17.82,17.82l 50.436,0.00 c 9.846,0.00, 17.819-7.973, 17.819-17.82L 414.292,228.696 z M 414.942,325.143 + c0.00-9.847-7.973-17.794-17.819-17.794l-298.30,0.00 c-9.834,0.00-17.808,7.948-17.808,17.794L 81.015,403.794 c0.00,9.847, 7.973,17.82, 17.808,17.82l 298.30,0.00 + c 9.847,0.00, 17.819-7.973, 17.819-17.82L 414.942,325.143 z" /> +<glyph unicode="" d="M 392.709,220.055l-5.32,79.017c-0.955,11.449-10.553,20.311-22.279,20.311L 147.767,319.383 + c-11.723,0.00-21.327-8.856-22.342-20.311l-5.171-79.017L 392.709,220.055 z M 438.481,138.986c0.00,20.404-16.465,37.023-36.865,37.023 + c-20.396,0.00-37.037-16.619-37.037-37.023c0.00-20.398, 16.629-36.857, 37.037-36.857C 422.02,102.129, 438.481,118.588, 438.481,138.986 + M 339.891,100.85l0.00,64.135 c0.00,6.381-5.191,11.563-11.568,11.563L 184.037,176.548 c-6.19,0.00-11.387-5.186-11.387-11.563l0.00-64.135 L 339.891,100.85 z + M 111.323,102.088c 20.344,0.00, 36.913,16.475, 36.913,36.898c0.00,20.426-16.574,37.064-36.913,37.064 + c-20.422,0.00-36.99-16.639-36.99-37.064C 74.333,118.562, 90.902,102.088, 111.323,102.088 M 365.114,340.158 + c 22.48,0.00, 41.014-17.445, 42.844-39.52l 5.453-81.398l 54.148-32.75l-0.139-137.531l-24.188,0.00 l 0.139-44.957 + c0.00-19.471-15.736-35.002-35.146-35.002c-19.275,0.00-34.945,15.521-34.945,35.002l0.00,44.957 l-233.75,0.00 l 0.135-44.957 + c0.00-19.471-15.734-35.002-35.158-35.002c-19.265,0.00-34.94,15.521-34.94,35.002l0.00,44.957 L 45.454,48.959 L 45.321,186.49l 54.149,32.75 + l 5.449,81.398c 1.706,22.074, 20.233,39.52, 42.849,39.52L 365.114,340.158 zM 407.178,477.493c 18.719,0.00, 33.844-15.146, 33.844-33.734L 441.022,195.26 l-43.391,21.996l-3.521,80.063 + c-2.787,27.477-27.229,26.353-42.605,38.431L 161.336,335.75 c-28.524-5.882-33.241-8.258-41.718-31.394l-11.805-84.383L 71.715,195.26 + l 0.114,248.499c0.00,18.589, 15.13,33.734, 33.732,33.734L 407.178,477.493 z" /> +<glyph unicode="" d="M 193.573-17.444c 9.323-9.33, 24.442-9.323, 33.764,0.016l 268.751,268.752c 9.338,9.322, 9.338,24.449, 0.016,33.779 + L 388.166,393.049L 85.62,90.502L 193.573-17.444z M 344.421,268.623l 52.246,52.238l 52.215-52.223l-52.23-52.238L 344.421,268.623z + M 286.249,461.163L 17.498,192.41c-9.322-9.338-9.322-24.464,0.00-33.787l 25.246-25.245L 345.291,435.917l-25.246,25.254 + C 310.723,470.493, 295.587,470.484, 286.249,461.163z" /> +<glyph unicode="" d="M 431.972,63.183c-0.861,20.361-31.466,80.906-30.743,104.396c 0.825,26.64, 16.937,59.45, 50.482-4.691 + c 20.104-38.434, 50.956-14.517, 54.70,4.184c 11.31,56.575-5.481,124.432-58.967,190.924C 354.928,472.978, 192.325,504.557, 84.338,428.519 + C-23.639,352.47-25.817,181.222, 72.726,81.974c 89.312-89.927, 212.477-129.458, 315.461-86.11 + C 398.84,0.363, 434.075,14.155, 431.972,63.183z M 142.70,396.594c 19.486,13.721, 46.404,9.055, 60.133-10.438 + c 13.731-19.491, 9.051-46.409-10.435-60.132c-19.50-13.732-46.409-9.055-60.142,10.433C 118.524,355.948, 123.195,382.857, 142.70,396.594z + M 58.567,221.209c-13.724,19.491-9.043,46.41, 10.443,60.129c 19.476,13.723, 46.405,9.067, 60.126-10.424 + c 13.733-19.495, 9.042-46.418-10.432-60.141C 99.218,197.051, 72.289,201.701, 58.567,221.209z M 268.041,333.539 + c-13.736,19.49-9.057,46.419, 10.438,60.139c 19.492,13.723, 46.40,9.052, 60.144-10.444c 13.723-19.486, 9.043-46.399-10.444-60.131 + C 308.684,309.378, 281.774,314.043, 268.041,333.539z M 122.057,111.059c-13.718,19.506-9.058,46.435, 10.428,60.157 + c 19.491,13.722, 46.419,9.051, 60.142-10.435c 13.716-19.495, 9.057-46.424-10.438-60.146 + C 162.708,86.903, 135.784,91.583, 122.057,111.059z" /> +<glyph unicode="" d="M 470.019,422.67L 40.604,422.67 l-40.91-66.455l 0.022,0.00 c 0.044-22.551, 18.303-40.801, 40.887-40.801 + c 12.232,0.00, 23.175,5.395, 30.667,13.903c 7.493-8.508, 18.435-13.903, 30.666-13.903c 12.232,0.00, 23.197,5.395, 30.667,13.903 + c 7.514-8.508, 18.457-13.903, 30.688-13.903c 12.231,0.00, 23.174,5.395, 30.688,13.903c 7.47-8.508, 18.435-13.903, 30.667-13.903 + c 12.231,0.00, 23.174,5.395, 30.666,13.903c 7.492-8.508, 18.435-13.903, 30.666-13.903c 12.255,0.00, 23.196,5.395, 30.688,13.903 + c 7.491-8.508, 18.436-13.903, 30.666-13.903c 12.231,0.00, 23.176,5.395, 30.665,13.903c 7.493-8.508, 18.435-13.903, 30.688-13.903 + c 12.232,0.00, 23.176,5.395, 30.666,13.903c 7.492-8.508, 18.435-13.903, 30.667-13.903c 22.563,0.00, 40.845,18.25, 40.91,40.801l0.00,0.00 + L 470.019,422.67zM 439.352,303.216c-9.238-6.149-19.788-9.501-30.666-9.501s-21.447,3.353-30.688,9.501 + c-9.216-6.149-19.788-9.501-30.665-9.501c-10.878,0.00-21.427,3.353-30.666,9.501c-9.239-6.149-19.81-9.501-30.688-9.501 + c-10.855,0.00-21.427,3.353-30.666,9.501c-9.239-6.149-19.789-9.501-30.666-9.501c-10.878,0.00-21.45,3.353-30.667,9.501 + c-9.261-6.149-19.811-9.501-30.688-9.501c-10.877,0.00-21.428,3.353-30.688,9.501c-9.217-6.149-19.789-9.501-30.667-9.501 + c-10.877,0.00-21.426,3.353-30.666,9.501c-9.238-6.149-19.789-9.501-30.667-9.501L 40.604,64.81 l 46.00,0.00 L 86.604,248.851 l 92.02,0.00 L 178.624,64.81 l 291.394,0.00 L 470.018,293.714 + C 459.162,293.714, 448.593,297.067, 439.352,303.216z M 424.02,131.275L 224.646,131.275 L 224.646,248.851 L 424.02,248.851 L 424.02,131.275 z" /> +<glyph unicode="" d="M 319.651,479.00 L 65.003,479.00 L 65.003-30.998 L 479.002-30.998 L 479.002,351.521 L 319.651,479.00 Z M 320.002,480.00 L 320.002,480.00 L 480.001,352.001 L 480.001-31.998 L 64.002-31.998 L 64.002,480.00 L 320.002,480.00 ZM 320.002,352.001L 320.002,480.00 l-256.00,0.00 l0.00-511.998 l 415.999,0.00 L 480.001,352.001 L 320.002,352.001 z M 128.002,192.001l 224.00,0.00 l0.00-46.109 l-224.00,0.00 L 128.002,192.001 z M 416.001,48.002 + L 128.002,48.002 l0.00,47.999 l 287.999,0.00 L 416.001,48.002 z M 416.001,240.001L 128.002,240.001 l0.00,48.00 l 287.999,0.00 L 416.001,240.001 zM 320.002,480.00L 480.001,352.001L 463.167,352.001L 319.833,465.50 z" /> +<glyph unicode="" d="M 255.925,426.668 L 511.626,199.378 C 511.832,199.195 511.775,199.046 511.50,199.046 L 427.019,199.046 C 426.744,199.046 426.519,198.821 426.519,198.546 L 426.519,0.086 C 426.519-0.189 426.294-0.414 426.019-0.414 L 313.041-0.414 C 312.766-0.414 312.541-0.189 312.541,0.086 L 312.541,170.051 C 312.541,170.326 312.316,170.551 312.041,170.551 L 199.063,170.551 C 198.788,170.551 198.563,170.326 198.563,170.051 L 198.563,0.086 C 198.563-0.189 198.338-0.414 198.063-0.414 L 85.085-0.414 C 84.81-0.414 84.585-0.189 84.585,0.086 L 84.585,198.546 C 84.585,198.821 84.36,199.046 84.085,199.046 L -0.398,199.046 C -0.672,199.046 -0.73,199.195 -0.524,199.378 L 255.178,426.668 C 255.383,426.851 255.719,426.851 255.925,426.668 Z" /> +<glyph unicode="" d="M 408.504,448.00L 103.404,448.00 L0.00,180.309l0.00-180.779 l 511.996,0.00 L 511.996,183.26 L 408.504,448.00z M 350.858,173.588l0.00-48.98 + c0.00-16.045-13.014-29.037-29.029-29.037L 190.182,95.571 c-16.046,0.00-29.046,12.992-29.046,29.037l0.00,48.98 L 56.545,173.588 l 84.684,219.227l 229.596,0.00 + l 85.694-219.227L 350.858,173.588 z M 290.031,353.062l-67.077,0.00 l0.00-80.521 l-62.958,0.00 l 96.511-123.988l 96.482,123.988l-62.958,0.00 L 290.031,353.062 z" /> +<glyph unicode="" d="M 168.141,298.82c-0.589,6.333, 2.041,11.146, 3.621,14.038c 0.298,0.551, 0.701,1.266, 0.894,1.713 + c-1.333,6.394-2.279,12.503-2.913,18.36l-8.136,1.385l-5.164,4.784c-20.848,12.861-43.215,3.859-55.181-0.998 + c-17.257-5.604-28.166-30.012-20.543-66.09c 1.289-6.17-3.391-8.941-3.078-12.294c 0.67-7.362, 0.805-25.05, 7.763-29.401 + c 0.649-0.417, 5.575-1.64, 5.537-1.296c 0.686-7.184, 1.37-14.32, 2.042-21.504c 1.743-4.754, 5.909-5.275, 7.116-11.981l-5.321-1.325 + c-2.407-5.099-6.78-15.32-11.265-18.405c-3.756-1.028-7.51-2.057-11.252-3.07c-13.15-5.408-27.763-11.848-40.943-17.405 + c-11.997-5.065-26.361-6.869-30.697-19.462c0.00-8.522-0.805-28.70-0.582-39.877l 59.37,0.00 c 0.067,3.636, 0.163,7.303, 0.245,10.834 + c 0.186,7.749, 0.366,15.065, 0.366,19.611l0.00,2.443 l 0.789,2.31c 7.065,20.444, 25.654,26.898, 40.586,32.055 + c 3.778,1.311, 7.347,2.533, 10.648,3.935c 7.242,3.054, 14.813,6.303, 22.427,9.596c 11.236,4.798, 22.80,9.775, 33.671,14.276 + c-0.537,1.162-1.036,2.251-1.468,3.16c-2.392,0.342-4.776,0.686-7.16,1.012c 0.358,7.898, 5.245,8.331, 7.16,14.352 + c 1.691,5.306, 0.178,12.22, 2.862,17.106c 1.854,3.428, 6.041,3.458, 8.149,6.364c 1.901,2.682, 3.153,7.286, 3.749,10.55 + c 0.328,1.759, 0.611,3.681, 0.819,5.693c-11.399,10.535-12.822,30.921-13.769,44.855C 168.364,295.913, 168.26,297.479, 168.141,298.82 + M 511.369,135.866c-4.322,12.593-18.703,14.396-30.699,19.462c-13.172,5.558-27.793,11.997-40.949,17.405 + c-3.727,1.014-7.482,2.042-11.234,3.07c-4.502,3.085-8.869,13.307-11.27,18.405c-2.383,0.342-4.77,0.686-7.168,1.012 + c 0.375,7.898, 5.264,8.331, 7.168,14.352c 1.688,5.306, 0.18,12.22, 2.863,17.106c 1.848,3.428, 6.051,3.458, 8.15,6.364 + c 1.893,2.682, 3.174,7.286, 3.756,10.55c 1.088,5.961, 2.014,14.098-0.807,19.984c-1.623,3.383-2.635,3.71-3.10,7.824 + c-0.551,4.977, 1.477,21.25, 1.568,24.752c 0.191,9.15-0.029,17.375-2.236,26.257c0.00,0.00-2.684,8.047-6.885,10.491l-8.375,1.416 + l-5.17,4.784c-20.85,12.861-43.201,3.859-55.182-0.998c-6.664-2.161-12.357-7.168-16.422-14.50c-0.137-2.43-0.182-4.44-0.063-5.469 + c 0.029-0.537, 0.105-0.85, 0.135-0.999c 0.133-0.283, 0.299-0.522, 0.461-0.804c 0.629-1.059, 1.447-2.475, 2.385-4.441 + c 5.875-12.264, 4.145-26.972, 2.326-36.987c-0.895-4.917-3.10-14.186-7.764-20.684c-1.209-1.714-2.578-3.07-3.92-4.202 + c 0.746-7.794, 2.324-16.78, 7.006-19.701c 0.639-0.417, 5.57-1.64, 5.541-1.296c 0.686-7.184, 1.371-14.32, 2.057-21.504 + c 1.729-4.754, 5.90-5.275, 7.094-11.981l-5.318-1.325c-0.418-0.88-0.895-1.924-1.434-3.07c 10.924-4.501, 22.578-9.494, 33.873-14.352 + c 7.629-3.277, 15.199-6.54, 22.473-9.61c 3.307-1.401, 6.854-2.624, 10.625-3.935c 14.945-5.156, 33.543-11.61, 40.58-32.055l 0.803-2.31 + l0.00-2.443 c0.00-4.546, 0.195-11.862, 0.359-19.611c 0.086-3.531, 0.178-7.198, 0.25-10.834l 59.117,0.00 + C 512.174,107.166, 511.369,127.344, 511.369,135.866M 321.922,381.291c 3.098-12.443, 3.396-24.022, 3.129-36.808c-0.119-4.947-2.951-27.763-2.176-34.751 + c 0.625-5.738, 2.057-6.215, 4.338-10.969c 3.963-8.285, 2.637-19.685, 1.115-28.045c-0.834-4.53-2.592-11.043-5.26-14.768 + c-2.951-4.113-8.836-4.143-11.459-8.941c-3.74-6.885-1.609-16.557-3.994-24.007c-2.684-8.465-9.537-9.06-10.043-20.117 + c 3.352-0.477, 6.705-0.954, 10.043-1.416c 3.367-7.167, 9.506-21.52, 15.797-25.84c 5.275-1.445, 10.537-2.892, 15.795-4.321 + c 18.447-7.557, 38.953-16.614, 57.432-24.41c 16.824-7.092, 36.988-9.626, 43.068-27.284c0.00-11.981, 1.133-40.296, 0.832-56.002L 73.833,63.612 + c-0.305,15.706, 0.819,44.021, 0.819,56.002c 6.088,17.658, 26.236,20.192, 43.075,27.284c 18.485,7.796, 38.983,16.854, 57.425,24.41 + c 5.274,1.43, 10.528,2.876, 15.795,4.321c 6.289,4.32, 12.436,18.673, 15.812,25.84l 7.458,1.803c-1.699,9.435-7.533,10.163-9.962,16.84 + c-0.962,10.043-1.923,20.133-2.875,30.177c 0.036-0.477-6.879,1.236-7.78,1.803c-9.752,6.125-9.96,30.921-10.884,41.248 + c-0.434,4.709, 6.131,8.598, 4.306,17.226c-10.699,50.652, 4.612,84.897, 28.82,92.75c 16.796,6.796, 48.157,19.433, 77.409,1.432 + l 7.273-6.736l 11.742-2.026C 318.164,392.616, 321.922,381.291, 321.922,381.291" /> +<glyph unicode="" d="M 32.003,323.36l0.00-87.339 c-18.358,0.435-33.141,19.801-33.141,43.655C-1.138,303.588, 13.645,322.955, 32.003,323.36zM 447.996,345.036c 35.994-6.89, 63.143-37.17, 63.143-73.502c0.00-36.301-27.148-66.582-63.143-73.414L 447.996,345.036 zM 300.849,147.463c 32.046,4.342, 64.99,7.816, 89.147,10.132l-0.044-0.463l0.00-20.612 c0.00,0.00-8.162,4.979-12.968-11.406 + c-4.762-16.327-30.049-133.02-30.049-133.02l-7.513-7.092L 294.35-14.998 l-8.888,4.95l 11.622,94.633l-12.303,2.809l-0.68,18.556 + l 18.426,3.531L 300.849,147.463zM 415.997,349.641 L 415.997,192.165 C 415.997,192.165 307.449,184.736 251.345,165.673 C 195.199,146.642 64.444,64.068 64.444,64.068 L 63.836,479.396 C 63.836,479.396 190.902,387.551 255.656,370.945 C 320.411,354.399 415.996,349.641 415.996,349.641 Z" /> +<glyph unicode="" d="M 51.501,245.209 L 51.501,65.494 L 331.88,65.494 L 331.88,12.213 L 0.003,12.213 L 0.003,245.209 L 51.501,245.209 Z M 143.371,335.263 L 143.371,155.592 L 420.056,155.592 L 420.056,102.276 L 331.88,102.276 L 331.88,102.266 L 88.223,102.266 L 88.223,245.209 L 88.253,245.209 L 88.253,335.263 L 143.371,335.263 Z M 180.151,425.33 L 512.00,425.33 L 512.00,192.344 L 420.056,192.344 L 180.151,192.344 L 180.151,335.263 L 180.151,425.33 Z" /> +<glyph unicode="" d="M0.00,480.00L 512.00,480.00L 512.00,320.00L0.00,320.00zM0.00,288.00L 192.00,288.00L 192.00,128.00L0.00,128.00zM 224.00,288.00L 352.00,288.00L 352.00,128.00L 224.00,128.00zM 384.00,288.00L 512.00,288.00L 512.00,128.00L 384.00,128.00zM0.00,96.00L 192.00,96.00L 192.00-32.00L0.00-32.00zM 224.00,96.00L 352.00,96.00L 352.00-32.00L 224.00-32.00zM 384.00,96.00L 512.00,96.00L 512.00-32.00L 384.00-32.00z" /> +<glyph unicode="" d="M 255.857,477.695 L 470.98,347.534 L 470.98,100.173 L 414.739,67.693 L 414.804,314.448 L 255.906,411.41 L 96.808,314.683 L 96.808,67.32 L 41.013,100.173 L 41.013,347.534 L 255.857,477.695 Z M 284.292,325.422 L 358.881,279.98 L 358.881,32.947 L 255.857-30.00 L 153.705,32.51 L 153.705,279.809 L 227.391,325.192 L 227.391,36.295 L 255.857,18.834 L 284.292,36.23 L 284.292,325.422 Z" /> +<glyph unicode="" d="M 153.705,279.81 L 227.391,325.193 L 227.391,234.821 L 153.705,279.81 Z M 284.292,325.422 L 358.881,279.98 L 284.292,234.245 L 284.292,325.422 Z M 470.98,347.534 L 415.795,314.448 L 255.906,411.41 L 96.808,314.682 L 41.013,347.534 L 255.857,477.695 L 470.98,347.534 Z" /> +<glyph unicode="" d="M 500.13,243.808c-5.10,0.00-8.637,3.54-8.637,8.829c0.00,5.251, 3.614,8.867, 8.637,8.867 + c 5.10,0.00, 8.64-3.577, 8.64-8.867C 508.77,247.386, 505.153,243.808, 500.13,243.808z M 500.13,260.476c-4.109,0.00-7.383-2.815-7.383-7.839 + c0.00-4.985, 3.273-7.801, 7.383-7.801c 4.148,0.00, 7.422,2.815, 7.422,7.801C 507.552,257.661, 504.242,260.476, 500.13,260.476z + M 502.681,247.918l-2.931,4.186l-0.951,0.00 l0.00-4.035 l-1.676,0.00 l0.00,9.781 l 2.971,0.00 c 2.053,0.00, 3.425-1.028, 3.425-2.855 + c0.00-1.407-0.762-2.321-1.979-2.701l 2.815-3.997L 502.681,247.918z M 500.094,256.328l-1.295,0.00 l0.00-2.891 l 1.219,0.00 + c 1.103,0.00, 1.788,0.456, 1.788,1.445C 501.806,255.833, 501.197,256.328, 500.094,256.328zM 103.449,186.019 L 116.274,186.019 L 108.576,284.334 L 92.191,284.334 L 61.557,203.689 L 30.92,284.334 L 14.392,284.334 L 6.556,186.019 L 19.096,186.019 L 25.08,264.246 L 56.143,185.594 L 66.259,185.594 L 97.32,264.246 L 103.449,186.019 ZM 170.415,186.019l-1.424,9.113c-5.414-5.55-12.824-10.535-23.938-10.535 + c-12.252,0.00-19.946,7.408-19.946,18.949c0.00,16.957, 14.531,23.648, 42.889,26.646l0.00,2.849 c0.00,8.547-5.13,11.541-12.971,11.541 + c-8.262,0.00-16.099-2.563-23.506-5.842l-1.712,10.968c 8.124,3.283, 15.82,5.70, 26.361,5.70c 16.526,0.00, 24.509-6.693, 24.509-21.797l0.00-47.592 + L 170.415,186.019 z M 167.995,220.503c-25.083-2.424-30.35-9.265-30.35-16.249c0.00-5.558, 3.703-9.122, 10.117-9.122 + c 7.41,0.00, 14.534,3.711, 20.233,9.554L 167.995,220.503 zM 253.482,254.98l 1.854-11.395l-12.964-1.281c 1.849-3.136, 2.709-6.701, 2.709-10.545 + c0.00-14.534-12.259-23.368-26.078-23.368c-1.709,0.00-3.422,0.143-5.131,0.427c-1.994-1.285-3.417-2.855-3.417-4.132 + c0.00-2.423, 2.417-2.993, 14.391-5.135l 4.846-0.854c 14.392-2.563, 23.365-7.118, 23.365-17.664c0.00-14.249-15.53-20.943-33.199-20.943 + c-17.669,0.00-31.774,5.553-31.774,17.521c0.00,6.987, 4.846,12.398, 14.392,17.522c-2.992,2.142-4.272,4.564-4.272,7.131 + c0.00,3.279, 2.563,6.555, 7.122,9.261c-7.55,3.712-12.679,10.968-12.679,20.235c0.00,14.674, 12.253,23.649, 26.071,23.649 + c 6.837,0.00, 12.824-1.99, 17.528-5.70L 253.482,254.98z M 200.195,178.609c0.00-5.415, 6.981-9.403, 20.231-9.403 + c 13.25,0.00, 20.66,4.56, 20.66,10.256c0.00,4.138-3.133,6.98-12.821,8.691l-8.124,1.429c-3.701,0.708-5.698,1.136-8.406,1.707 + C 203.755,187.302, 200.195,183.31, 200.195,178.609z M 218.716,246.149c-8.549,0.00-13.818-6.558-13.818-14.821 + c0.00-7.835, 5.414-13.959, 13.818-13.959c 8.695,0.00, 14.106,6.408, 14.106,14.533C 232.822,240.022, 227.124,246.149, 218.716,246.149zM 313.901,218.646l-46.167,0.00 c 0.426-15.812, 7.973-23.224, 19.802-23.224 + c 9.834,0.00, 16.958,3.843, 24.368,9.689l 1.849-11.398c-7.266-5.698-15.953-9.117-27.206-9.117c-17.673,0.00-31.498,10.687-31.498,35.62 + c0.00,21.803, 12.827,35.191, 29.926,35.191c 19.80,0.00, 28.927-15.244, 28.927-34.051C 313.901,220.646, 313.901,219.506, 313.901,218.646z + M 284.83,245.433c-7.836,0.00-14.536-5.558-16.528-17.239l 32.77,0.00 C 299.509,239.168, 294.664,245.433, 284.83,245.433zM 367.333,186.019l0.00,46.309 c0.00,6.979-2.995,11.685-10.406,11.685c-6.694,0.00-13.535-4.422-19.664-10.972 + l0.00-47.022 l-12.679,0.00 l0.00,67.966 l 10.115,0.00 l 1.567-9.833c 6.412,5.842, 14.393,11.257, 24.08,11.257c 12.821,0.00, 19.667-7.689, 19.667-19.943l0.00-49.447 + L 367.333,186.019 zM 417.481,184.876c-11.968,0.00-19.802,4.275-19.802,17.959l0.00,40.461 l-10.262,0.00 l0.00,10.688 l 10.262,0.00 L 397.679,276.64 + l 12.396,1.85l0.00-24.506 l 14.674,0.00 l 1.714-10.688l-16.388,0.00 l0.00-38.184 c0.00-5.562, 2.282-8.979, 9.407-8.979c 2.275,0.00, 4.271,0.138, 5.836,0.432 + l 1.713-10.826C 424.89,185.307, 421.901,184.876, 417.481,184.876zM 459.517,184.597c-18.099,0.00-31.209,12.96-31.209,35.336c0.00,22.372, 13.11,35.476, 31.209,35.476 + c 18.237,0.00, 31.632-13.104, 31.632-35.476C 491.149,197.557, 477.754,184.597, 459.517,184.597z M 459.517,244.725 + c-12.253,0.00-18.381-10.545-18.381-24.792c0.00-13.971, 6.412-24.801, 18.381-24.801c 12.539,0.00, 18.808,10.55, 18.808,24.801 + C 478.324,233.896, 471.769,244.725, 459.517,244.725z" /> +<glyph class="hidden" unicode="" d="M0,480L 512 -32L0 -32 z" horiz-adv-x="0" /> +</font></defs></svg> \ No newline at end of file diff --git a/app/design/adminhtml/default/backend/Mage_Backend/fonts/icons/admin-icons.ttf b/app/design/adminhtml/default/backend/Mage_Backend/fonts/icons/admin-icons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3a4c691aae958d35e27322e4a4c5f4965681a0cc Binary files /dev/null and b/app/design/adminhtml/default/backend/Mage_Backend/fonts/icons/admin-icons.ttf differ diff --git a/app/design/adminhtml/default/backend/Mage_Backend/fonts/icons/admin-icons.woff b/app/design/adminhtml/default/backend/Mage_Backend/fonts/icons/admin-icons.woff new file mode 100644 index 0000000000000000000000000000000000000000..67c2fcdb7bf9747d1a884c2e2e94df6e5a91212e Binary files /dev/null and b/app/design/adminhtml/default/backend/Mage_Backend/fonts/icons/admin-icons.woff differ diff --git a/app/design/adminhtml/default/backend/Mage_Backend/images/admin-add-product-btn-bg.png b/app/design/adminhtml/default/backend/Mage_Backend/images/admin-add-product-btn-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..7c775956dcc6a08e737d1bee23c03fe8776015f4 Binary files /dev/null and b/app/design/adminhtml/default/backend/Mage_Backend/images/admin-add-product-btn-bg.png differ diff --git a/app/design/adminhtml/default/backend/Mage_Backend/images/body-bg.jpg b/app/design/adminhtml/default/backend/Mage_Backend/images/body-bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..459ba0af6fdbc40201f14df47cce79c54047cdde Binary files /dev/null and b/app/design/adminhtml/default/backend/Mage_Backend/images/body-bg.jpg differ diff --git a/app/design/adminhtml/default/backend/Mage_Backend/images/datagrid-dropdown-arrow.png b/app/design/adminhtml/default/backend/Mage_Backend/images/datagrid-dropdown-arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..280925e29a24259e407559d77d6bb31b9703261a Binary files /dev/null and b/app/design/adminhtml/default/backend/Mage_Backend/images/datagrid-dropdown-arrow.png differ diff --git a/app/design/adminhtml/default/backend/Mage_Backend/images/datagrid-sorted-th-arrows.png b/app/design/adminhtml/default/backend/Mage_Backend/images/datagrid-sorted-th-arrows.png new file mode 100644 index 0000000000000000000000000000000000000000..4d73368ed7079f978887b32163d7352fd73409a3 Binary files /dev/null and b/app/design/adminhtml/default/backend/Mage_Backend/images/datagrid-sorted-th-arrows.png differ diff --git a/app/design/adminhtml/default/backend/Mage_Backend/images/draggable-handle-bg.gif b/app/design/adminhtml/default/backend/Mage_Backend/images/draggable-handle-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..3f981daf8dd72e39fcb0046d273f1a4a994e0147 Binary files /dev/null and b/app/design/adminhtml/default/backend/Mage_Backend/images/draggable-handle-bg.gif differ diff --git a/app/design/adminhtml/default/backend/Mage_Backend/images/switcher.png b/app/design/adminhtml/default/backend/Mage_Backend/images/switcher.png new file mode 100644 index 0000000000000000000000000000000000000000..686f8c5a1523529a122ec9e6a39bddf6175f91da Binary files /dev/null and b/app/design/adminhtml/default/backend/Mage_Backend/images/switcher.png differ diff --git a/app/design/adminhtml/default/backend/css/admin.css b/app/design/adminhtml/default/backend/css/admin.css new file mode 100644 index 0000000000000000000000000000000000000000..fd97da9b1a2cfee002ba11786bea754a2e0ae176 --- /dev/null +++ b/app/design/adminhtml/default/backend/css/admin.css @@ -0,0 +1,3097 @@ +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ + +/* + Fonts +-------------------------------------- */ + +@font-face { + font-family: 'CallunaSans'; + src: url('Mage_Backend::fonts/calluna/CallunaSansLight-webfont.woff'); + src: url('Mage_Backend::fonts/calluna/CallunaSansLight-webfont.eot?#iefix') format('embedded-opentype'), url('Mage_Backend::fonts/calluna/CallunaSansLight-webfont.svg#webfont85gDAx2H') format('svg'), url('Mage_Backend::fonts/calluna/CallunaSansLight-webfont.woff') format('woff'), url('Mage_Backend::fonts/calluna/CallunaSansLight-webfont.ttf') format('truetype'); + font-style: normal; + font-weight: 200; +} + +@font-face { + font-family: 'CallunaSans'; + src: url('Mage_Backend::fonts/calluna/CallunaSansRegular-webfont.woff'); + src: url('Mage_Backend::fonts/calluna/CallunaSansRegular-webfont.eot?#iefix') format('embedded-opentype'), url('Mage_Backend::fonts/calluna/CallunaSansRegular-webfont.svg#webfont85gDAx2D') format('svg'), url('Mage_Backend::fonts/calluna/CallunaSansRegular-webfont.woff') format('woff'), url('Mage_Backend::fonts/calluna/CallunaSansRegular-webfont.ttf') format('truetype'); + font-style: normal; + font-weight: 400; +} + +@font-face { + font-family: 'CallunaSans'; + src: url('Mage_Backend::fonts/calluna/CallunaSansSemiBold-webfont.woff'); + src: url('Mage_Backend::fonts/calluna/CallunaSansSemiBold-webfont.eot?#iefix') format('embedded-opentype'), url('Mage_Backend::fonts/calluna/CallunaSansSemiBold-webfont.svg#webfont85gDAx2A') format('svg'), url('Mage_Backend::fonts/calluna/CallunaSansSemiBold-webfont.woff') format('woff'), url('Mage_Backend::fonts/calluna/CallunaSansSemiBold-webfont.ttf') format('truetype'); + font-style: normal; + font-weight: 500; +} + +@font-face { + font-family: 'CallunaSans'; + src: url('Mage_Backend::fonts/calluna/CallunaSansBold-webfont.woff'); + src: url('Mage_Backend::fonts/calluna/CallunaSansBold-webfont.eot?#iefix') format('embedded-opentype'), url('Mage_Backend::fonts/calluna/CallunaSansBold-webfont.svg#webfont85gDAx2C') format('svg'), url('Mage_Backend::fonts/calluna/CallunaSansBold-webfont.woff') format('woff'), url('Mage_Backend::fonts/calluna/CallunaSansBold-webfont.ttf') format('truetype'); + font-style: normal; + font-weight: 600; +} + +@font-face { + font-family: 'admin-icons'; + src: url('Mage_Backend::fonts/icons/admin-icons.eot'); + src: url('Mage_Backend::fonts/icons/admin-icons.eot?#iefix') format('embedded-opentype'), url('Mage_Backend::fonts/icons/admin-icons.svg#admin-icons') format('svg'), url('Mage_Backend::fonts/icons/admin-icons.woff') format('woff'), url('Mage_Backend::fonts/icons/admin-icons.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'MUI-Icons'; + src: url('../mui/fonts/MUI-Icons.eot'); + src: url('../mui/fonts/MUI-Icons.eot?#iefix') format('embedded-opentype'), url('../mui/fonts/MUI-Icons.svg#MUI-Icons') format('svg'), url('../mui/fonts/MUI-Icons.woff') format('woff'), url('../mui/fonts/MUI-Icons.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} + +body, html { + min-height: 100%; + height: 100%; +} + +body { + position: relative; + background: url(Mage_Backend::images/body-bg.jpg); + height: auto; +} + +/* + Headers and titles +-------------------------------------- */ +h1, h2, h3, h4, h5, h6 { + font-family: 'CallunaSans', Arial, sans-serif; + font-weight: 400; +} + +h1 { + font-size: 26px; +} + +h2 { + font-size: 22px; +} + +h3 { + font-size: 18px; +} + +h4 { + font-size: 16px; +} + +h5 { + font-size: 14px; +} + +h6 { + font-size: 13px; + font-weight: 500; +} + +/* + Primary "button view" action (default size) +-------------------------------------- */ +input[type=button].primary, +input[type=submit].primary, +input[type=reset].primary, +button.primary, +input[type=button].primary:visited, +input[type=submit].primary:visited, +input[type=reset].primary:visited, +button.primary:visited, +.primary, +.primary:visited { + color: #fff; + background: #f47b20; +} + +input[type=button].primary:hover, +input[type=submit].primary:hover, +input[type=reset].primary:hover, +button.primary:hover, +input[type=button].primary:focus, +input[type=submit].primary:focus, +input[type=reset].primary:focus, +button.primary:focus, +.primary:hover, +.primary:focus { + background: #e2701a; + color: #fff; + text-shadow: 0 -1px 2px #955326; +} + +input[type=button].primary:active, +input[type=submit].primary:active, +input[type=reset].primary:active, +button.primary:active, +input[type=button].primary.active, +input[type=submit].primary.active, +input[type=reset].primary.active, +button.primary.active, +.primary:active, +.primary.active { + box-shadow: 0 1px 5px #955326 inset; +} + +input[type=button].primary[disabled], +input[type=submit].primary[disabled], +input[type=reset].primary[disabled], +button.primary[disabled], +input[type=button].primary.disabled, +input[type=submit].primary.disabled, +input[type=reset].primary.disabled, +button.primary.disabled, +.primary[disabled], +.primary.disabled { + cursor: not-allowed; + opacity: 0.65; + box-shadow: none; + text-shadow: none; + background: #d98236 !important; +} + +/* + Placeholder for all big sized "button" actions (simple/primary). + Usage: + .popup .action-save, + .page-actions .action-open { + // styles + } +-------------------------------------- */ +.dont-use-this-class-big-size { + font-size: 18px; + line-height: 24px; + padding: 8px 19px; +} + +/* + Reset 'button view' for actions +-------------------------------------- */ +.pager .action-next, +.pager .action-previous, +.pager .action-next:hover, +.pager .action-previous:hover, +.action-.delete, +.action-.delete:hover, +.action-.delete:active, +.action-.delete.active, +.action-.delete:disabled, +.fieldset-wrapper-title .action-add, +.fieldset-wrapper-title .action-add:hover, +.fieldset-wrapper-title .action-add:active, +.fieldset-wrapper-title .action-add.active, +.fieldset-wrapper-title .action-add:disabled, +.action-delete, +.action-delete:hover, +.action-delete:active, +.action-delete.active, +.action-delete:disabled, +[class^=" adminhtml-catalog-product-"] .page-actions .action-back, +[class^=" adminhtml-catalog-product-"] .page-actions .action-back:hover, +[class^=" adminhtml-catalog-product-"] .page-actions .action-back:active, +[class^=" adminhtml-catalog-product-"] .page-actions .action-back.active, +[class^=" adminhtml-catalog-product-"] .page-actions .action-back:disabled, +.notifications [class^="action-"], +.notifications [class^="action-"]:hover, +.notifications [class^="action-"]:active, +.notifications [class^="action-"].active, +.notifications [class^="action-"]:disabled, +.notification .action-close, +.notification .action-close:hover, +.notification .action-close:active, +.notification .action-close.active, +.notification .action-close:disabled { + border: none; + border-radius: 0; + background: none; + margin: 0; + padding: 0; + box-shadow: none; + text-shadow: none; +} + +/* + Dropdown menu +-------------------------------------- */ +.dropdown-menu, +.ui-autocomplete { + position: absolute; + display: none; + list-style: none; + min-width: 100px; + margin: 3px 0 0 0; + padding: 0; + right: 0; + top: 100%; + border: 1px solid #cac2b5; + border-radius: 3px; + background: #fff; + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.2); + z-index: 1; +} + +.dropdown-menu > li, +.ui-autocomplete > li { + padding: 5px; + border-bottom: 1px solid #e5e5e5; +} + +.dropdown-menu > li.selected, +.ui-autocomplete > li.selected { + background: #f5f5f5; +} + +.dropdown-menu > li:hover, +.ui-autocomplete > li:hover { + background: #f5f5f5; +} + +.dropdown-menu > li:last-child, +.ui-autocomplete > li:last-child { + border-bottom: none; +} + +.dropdown-menu > li > .item, +.ui-autocomplete > li > .item { + cursor: pointer; +} + +.dropdown-menu-top { + margin: 0 0 3px 0; + top: auto; + bottom: 100%; +} + +.ui-autocomplete { + right: auto; +} + +.ui-autocomplete > li { + padding: 0; +} + +.ui-autocomplete > li > a { + display: block; + padding: 5px; +} + +.ui-autocomplete > li > a.level-0 { + padding-left: 5px !important; +} + +.ui-autocomplete .ui-state-focus { + background: #f5f5f5; +} + +/* + Actions Split +-------------------------------------- */ +.actions-split { + text-align: left; + position: relative; + display: inline-block; +} + +.actions-split > [class^='action-'] { + float: left; + border-radius: 0; +} + +.actions-split > .action-default { + border-radius: 5px 0 0 5px; +} + +.actions-split > .action-toggle { + border-left: 1px solid #c8c3b5; + border-radius: 0 5px 5px 0; + padding: 5px 7px; +} + +.actions-split > .action-toggle > span { + display: none; +} + +.actions-split > .action-toggle:before { + display: block; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e02c'; /* arrow down */ + font-size: 11px; +} + +.actions-split > .action-toggle.active:before { + content: '\e029'; /* arrow up */ +} + +.actions-split > .action-toggle.primary { + border-left: 1px solid #bd6f2c; +} + +.actions-split.active .dropdown-menu { + display: block; +} + +/* + Action delete icon +-------------------------------------- */ +/* TODO: replase ".action-.delete" to ".action-delete" after buttons refactoring */ +.action-.delete span, +.action-delete span { + display: none; +} + +.action-.delete:before, +.action-delete:before { + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + font-size: 18px; + -webkit-font-smoothing: antialiased; + content: '\e07f'; /* delete icon */ + color: #b7b3ad; +} + +input.action-.delete[type="button"], +input.action-.delete[type="submit"], +input.action-.delete[type="reset"], +button.action-.delete, +input.action-.delete[type="button"]:visited, +input.action-.delete[type="submit"]:visited, +input.action-.delete[type="reset"]:visited, +button.action-.delete:visited, +input.action-.delete[type="button"]:hover, +input.action-.delete[type="submit"]:hover, +input.action-.delete[type="reset"]:hover, +button.action-.delete:hover, +input.action-.delete[type="button"]:active, +input.action-.delete[type="submit"]:active, +input.action-.delete[type="reset"]:active, +button.action-.delete:active { + background: transparent; + padding: 3px 7px 0; +} + +input.action-.delete[type=button]:hover:before, +input.action-.delete[type=submit]:hover:before, +input.action-.delete[type=reset]:hover:before, +button.action-.delete:hover:before, +input.action-.delete[type=button]:focus:before, +input.action-.delete[type=submit]:focus:before, +input.action-.delete[type=reset]:focus:before, +button.action-.delete:focus:before { + background: transparent; + color: #a5a29d; +} + +/* + Forms +-------------------------------------- */ + +fieldset { + border: 1px solid #ccc; + padding: 20px; +} + +legend { + padding: 0 10px; + margin: 0 -10px; +} + +fieldset legend + br { + display: none; +} + +label { + display: inline-block; +} + +label > input[type="radio"], +label > input[type="checkbox"] { + margin: -3px 3px 0 0; + vertical-align: middle; +} + +input[type=text], +input[type=password], +input[type=datetime], +input[type=datetime-local], +input[type=date], +input[type=month], +input[type=time], +input[type=week], +input[type=number], +input[type=range], +input[type=email], +input[type=url], +input[type=search], +input[type=tel], +input[type=color], +textarea, +.input-text { + display: inline-block; + padding: 4px; + margin: 0; + background-color: #fff; + height: 28px; + color: #333; + border: 1px solid #ccc; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear 0.5s, box-shadow linear 0.2s; + -moz-transition: border linear 0.5s, box-shadow linear 0.2s; + -ms-transition: border linear 0.5s, box-shadow linear 0.2s; + -o-transition: border linear 0.5s, box-shadow linear 0.2s; + transition: border linear 0.5s, box-shadow linear 0.2s; +} + +textarea, +.input-text { + height: auto; +} + +select { + padding: 4px; + margin: 0 0 8px; + border: 1px solid #ccc; +} + +select[multiple], +select[size] { + height: auto; +} + +input[type=text]:focus, +input[type=password]:focus, +input[type=datetime]:focus, +input[type=datetime-local]:focus, +input[type=date]:focus, +input[type=month]:focus, +input[type=time]:focus, +input[type=week]:focus, +input[type=number]:focus, +input[type=range]:focus, +input[type=email]:focus, +input[type=url]:focus, +input[type=search]:focus, +input[type=tel]:focus, +input[type=color]:focus, +textarea:focus { + outline: 0; + border-color: rgba(82, 168, 236, 0.8); + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); +} + +input[type="radio"], +input[type="checkbox"] { + margin: 3px 0; + line-height: normal; +} + +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: #eee; + border-color: #ddd; +} + +textarea:-moz-placeholder, +input:-moz-placeholder { + color: #999 !important; + font-style: italic; +} + +option.placeholder { + color: #999 !important; + font-style: italic !important; +} + +:-ms-input-placeholder { + color: #999 !important; + font-style: italic; +} + +::-webkit-input-placeholder { + font: normal 14px/20px Arial, Helvetica, sans-serif; + color: #999 !important; +} + +:-moz-placeholder { + font: normal 14px/20px Arial, Helvetica, sans-serif; + color: #999 !important; +} + +.form-inline .label { + width: 20%; +} + +.form-inline .control { + width: 60%; +} + +.form-inline .field-service { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + float: right; + width: 20%; + padding-left: 15px; + font-size: 10px; +} + +.form-inline .field-service[value-scope]:before { + content: attr(value-scope) !important; + font-size: 10px; + color: #6F8992; + white-space: nowrap; + display: block; + margin-bottom: 5px; +} + +.control > input { + width: 100%; +} + +.control > input[type="radio"], +.control > input[type="checkbox"] { + width: auto; +} + +.control > table { + width: 100%; +} + +.multi-input { + margin: 0 0 20px; +} + +.multi-input > input { + width: 100%; +} + +/* + Forms styles +-------------------------------------- */ +.page-content-inner { + position: relative; + background: #f5f2ed; + border: 1px solid #b7b2a6; + border-radius: 5px; + padding: 20px; +} + +.fieldset-wrapper, +.fieldset { + background: #fff; + border: 1px solid #eae6e0; + border-radius: 5px; + margin: 0 0 8px; + padding: 5px 18px 18px; + position: relative; +} + +.eq-ie8 .fieldset { + border-width: 0 0 1px; +} + +.fieldset-wrapper > .fieldset-wrapper-title, +.fieldset > .legend { + position: static; + float: left; + width: 100%; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding: 0; + border-bottom: 1px solid #ededed; + margin: 0 0 18px; +} + +.fieldset-wrapper { + padding-bottom: 2px; +} + +.fieldset-wrapper > .fieldset-wrapper-title { + float: none; + border-bottom: none; + margin-bottom: 0; +} + +.fieldset-wrapper.opened { + padding-bottom: 18px; +} + +.fieldset-wrapper.opened > .fieldset-wrapper-title { + border-bottom: 1px solid #ededed; + margin-bottom: 18px; +} + +.fieldset-wrapper > .fieldset-wrapper-title .title, +.fieldset > .legend span { + font-family: 'CallunaSans', Arial, sans-serif; + font-size: 18px; + color: #666; + font-weight: normal; + padding: 7px 0 10px 10px; + display: inline-block; +} + +.fieldset-wrapper-title .title[data-toggle="collapse"] { + position: relative; + padding-left: 22px; + cursor: pointer; +} + +.fieldset-wrapper-title .title[data-toggle="collapse"]:before { + position: absolute; + left: 0; + top: 7px; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e02a'; /* arrow right icon */ + color: #b2b0ad; +} + +.fieldset-wrapper.opened .fieldset-wrapper-title .title:before { + content: '\e02c'; /* arrow down icon */ +} + +.fieldset-wrapper-title > .actions { + float: right; +} + +.fieldset > .legend + br { + display: block; + height: 0; + overflow: hidden; + clear: left; +} + +.fieldset-wrapper .fieldset, +.fieldset .fieldset { + background: transparent; + padding: 9px 0; + border: none; + border-radius: 0; + margin: 0 0 29px; +} + +.fieldset .legend > span { +} + +.fieldset .field { + margin: 0 0 29px; +} + +[class^="fields-group-"] .field { + margin-bottom: 0; +} + +.fieldset .field:last-child { + margin-bottom: 0; +} + +.fieldset .label { + color: #666; + font-weight: bold; +} + +.with-addon .textarea { + margin: 0 0 6px; +} + +.fieldset .control .textarea { + width: 100%; +} + +.fieldset > .field > input[type="checkbox"] { + margin-top: 10px; +} + +/* + Form item with table +-------------------------------------- */ + +.with-table .label { + float: none; + text-align: left; + width: 100%; +} + +.with-table .control { + clear: left; + float: none; + width: 100%; +} + +/* + Calendar +-------------------------------------- */ +.ui-datepicker { + z-index: 998 !important; +} + +.ui-datepicker .ui-datepicker-calendar td { + padding: 0; +} + +.ui-datepicker .ui-datepicker-calendar th { + background: #efefef; + border: 1px solid #cfcfcf; + padding: 4px; + color: #676056; + font-weight: bold; +} + +.ui-datepicker-calendar tbody tr td, +.ui-datepicker-calendar tbody tr:nth-child(2n+1) td { + background: #fff; +} + +.ui-datepicker .ui-datepicker-prev span, +.ui-datepicker .ui-datepicker-next span { + margin-top: -1px; +} + +/* + Details element +-------------------------------------- */ +summary { + cursor: pointer; + display: inline-block; +} + +.no-details details > * { + display: none; +} + +.no-details details > summary:before { + float: left; + width: 20px; + content: 'â–º '; +} + +.no-details details.open > summary:before { + content: 'â–¼ '; +} + +.no-details details summary { + display: block; +} + +/* + Blockquotes +-------------------------------------- */ +blockquote { + border-left: 2px solid #ccc; + padding-left: 5px; +} + +blockquote small:before { + content: '\2014 \00A0'; +} + +/* + Tables +-------------------------------------- */ +table > caption { + margin-bottom: 5px; +} + +table tfoot, +table th { + background: #e6e6e6; +} + +table tfoot, +table thead { + background: #666158; + color: #cac3b4; +} + +table thead.active { + /*background:#F37B21;*/ +} + +table th { + text-align: left; + background: transparent; + font-weight: normal; +} + +table th, +table td { + border: 1px solid #C0BBAF; + padding: 6px 10px 7px; +} + +table tbody tr td { + background: #F5F2ED; + color: #676056; + padding-top: 12px; +} + +table tbody tr:not(:last-child) td { + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; +} + +table .dropdown-menu li { + padding: 7px 15px; + line-height: 14px; + cursor: pointer; +} + +table tbody tr td:first-child input[type="checkbox"] { + margin-left: 5px; + margin-top: 0; +} + +table tbody tr:nth-child(odd) td, +table tbody tr:nth-child(odd) th { + background-color: #E6E3DE; +} + +table tbody tr.selected td, +table tbody tr.selected th { + border: 1px solid #C0BBAF; +} + +table tbody tr.selected td, +table tbody tr.selected th, +table tbody tr:hover td, +table tbody tr:hover th, +table tbody tr:nth-child(odd):hover td, +table tbody tr:nth-child(odd):hover th { + background-color: #fff; +} + +/* + Styles for "js" tooltip with positionings +-------------------------------------- */ +.tipsy { + padding: 11px; +} + +.tipsy-inner { + padding: 12px 15px; + max-width: 185px; + background: #faf8f6; + border: 1px solid #dcd8ce; + box-shadow: 0 2px 5px rgba(49, 48, 43, 0.4); +} + +.tipsy-inner .error { + width: 158px; +} + +.tipsy-inner .error h5 { + color: #be0a0a; + font-size: 16px; + font-family: "CallunaSans"; + font-weight: 500; + margin: 0 0 6px 0; +} + +.tipsy-inner .error p { + color: #676056; + line-height: 1.5; + margin: 0; +} + +.tipsy-e .tipsy-arrow { + top: 50%; + left: 1px; + margin-top: -10px; + border-top: 10px solid transparent; + border-right: 10px solid #dcd8ce; + border-bottom: 10px solid transparent; + border-left: none; +} + +.tipsy-w .tipsy-arrow { + top: 50%; + right: 0; + margin-top: -10px; + border-top: 10px solid transparent; + border-right: none; + border-bottom: 10px solid transparent; + border-left: 10px solid #dcd8ce; +} + +.tipsy-n .tipsy-arrow, +.tipsy-ne .tipsy-arrow, +.tipsy-nw .tipsy-arrow { + bottom: 1px; + border-top: 10px solid #dcd8ce; + border-right: 10px solid transparent; + border-bottom: none; + border-left: 10px solid transparent; +} + +.tipsy-ne .tipsy-arrow { + left: 16px; +} + +.tipsy-nw .tipsy-arrow { + right: 16px; +} + +.tipsy-s .tipsy-arrow, +.tipsy-se .tipsy-arrow, +.tipsy-sw .tipsy-arrow { + top: 1px; + border-left: 10px solid transparent; + border-right: 10px solid transparent; + border-bottom: 10px solid #dcd8ce; + border-top: none; +} + +.tipsy-se .tipsy-arrow { + left: 16px; +} + +.tipsy-sw .tipsy-arrow { + right: 16px; +} + +.tipsy-arrow:after, +.tipsy-arrow:before { + position: absolute; + width: 0; + height: 0; + content: ''; +} + +.tipsy-e .tipsy-arrow:after { + top: -5px; + left: 2px; + margin-top: -4px; + border-top: 9px solid transparent; + border-right: 9px solid #faf8f6; + border-bottom: 9px solid transparent; +} + +.tipsy-e .tipsy-arrow:before { + top: -8px; + margin-top: 0; + margin-top: 0; + border-top: 10px solid transparent; + border-right: 10px solid rgba(49, 48, 43, 0.1); + border-bottom: 10px solid transparent; +} + +.tipsy-w .tipsy-arrow:after { + top: -5px; + left: -12px; + margin-top: -4px; + border-top: 9px solid transparent; + border-right: none; + border-bottom: 9px solid transparent; + border-left: 9px solid #faf8f6; +} + +.tipsy-w .tipsy-arrow:before { + top: -8px; + left: -10px; + margin-top: 0; + border-top: 10px solid transparent; + border-right: none; + border-bottom: 10px solid transparent; + border-left: 10px solid rgba(49, 48, 43, 0.1); +} + +.tipsy-n .tipsy-arrow:after, +.tipsy-ne .tipsy-arrow:after, +.tipsy-nw .tipsy-arrow:after { + margin-top: -4px; + left: -9px; + top: -7px; + border-top: 9px solid #faf8f6; + border-right: 9px solid transparent; + border-left: 9px solid transparent; +} + +.tipsy-n .tipsy-arrow:before, +.tipsy-ne .tipsy-arrow:before, +.tipsy-nw .tipsy-arrow:before { + left: -10px; + top: -8px; + margin-top: 0; + border-top: 10px solid rgba(49, 48, 43, 0.1); + border-right: 10px solid transparent; + border-left: 10px solid transparent; +} + +.tipsy-s .tipsy-arrow:after, +.tipsy-sw .tipsy-arrow:after, +.tipsy-se .tipsy-arrow:after { + left: -9px; + top: 6px; + margin-top: -4px; + border-top: none; + border-right: 9px solid transparent; + border-bottom: 9px solid #faf8f6; + border-left: 9px solid transparent; +} + +.tipsy-inner dl { + margin: 0; +} + +.tipsy-inner dt { + margin: 0 0 4px; + font-size: 16px; + font-family: 'CallunaSans'; + font-weight: 400; + color: #f47b20; +} + +.tipsy-inner dd { + margin: 0; + color: #676056; + font-size: 12px; + line-height: 18px; + font-family: Arial, Helvetica, sans-serif; +} + +/* + Popups +-------------------------------------- */ +.fade .popup { + padding: 0; + border: 5px solid #969288; + border-radius: 8px; +} + +.fade .popup .popup-inner { + padding: 20px; + border-radius: 3px; +} + +.fade .popup .popup-title { + margin: 0 0 10px; +} + +.popup-loading { + position: fixed; + z-index: 1003; + width: 200px; + background: rgba(255, 255, 255, .8); + left: 50%; + top: 40%; + margin-left: -100px; + color: #d85909; + border-color: #d85909; + font-size: 14px; + font-weight: bold; + text-align: center; + padding: 100px 0 10px; +} + +.popup-loading:after { + position: absolute; + left: 50%; + top: 40%; + background-image: url(../mui/images/ajax-loader-big.gif); + width: 64px; + height: 64px; + margin: -32px 0 0 -32px; + content: ''; + z-index: 2; +} + +.eq-ie8 .popup-loading { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; +} + +/* Old loading popup */ +/* TODO: remove this popup after refactoring of "varienLoader.js" file */ +.loading-old { + border: 1px solid #d85909; + position: fixed; + z-index: 1003; + width: 200px !important; + height: auto !important; + background: rgba(255, 255, 255, .8); + left: 50% !important; + top: 40% !important; + margin-left: -100px; + color: #d85909; + font-size: 14px; + font-weight: bold; + text-align: center; + padding: 100px 0 10px; +} + +.loading-old:after { + position: absolute; + left: 50%; + top: 40%; + background-image: url(../mui/images/ajax-loader-big.gif); + width: 64px; + height: 64px; + margin: -32px 0 0 -32px; + content: ''; + z-index: 2; +} + +.loading-old .loader { + position: relative !important; + left: auto !important; + top: auto !important; +} + +.eq-ie8 .loading-old { + background: #fff; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; +} + +/* Backup popup */ +/* TODO: remove after backups page js refactoring */ +.backup-dialog { + margin-top: inherit !important; +} + +/* Backup popup */ +/* TODO: remove after backups page js refactoring */ +.backup-dialog { + margin-top: inherit !important; +} + +/* + Global Navigation +-------------------------------------- */ + +.navigation { + position: relative; + border-bottom: 1px solid #aaa69c; + background: #726c62; + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzcyNmM2MiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiM2NTYwNTciIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); + background: -moz-linear-gradient(top, #726c62 0%, #656057 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #726c62), color-stop(100%, #656057)); + background: -webkit-linear-gradient(top, #726c62 0%, #656057 100%); + background: -o-linear-gradient(top, #726c62 0%, #656057 100%); + background: -ms-linear-gradient(top, #726c62 0%, #656057 100%); + background: linear-gradient(to bottom, #726c62 0%, #656057 100%); + padding: 0 20px; +} + +.navigation:hover .level-0 > a { + /*background: red !important;*/ +} + +.eq-ie8 .navigation { + background: #726c62; +} + +.navigation:before { + position: absolute; + left: 0; + top: 0; + right: 0; + height: 5px; + box-shadow: 0 2px 4px #46433d inset; + content: ''; + z-index: 991; +} + +.eq-ie8 .navigation:before { + border-top: 1px solid #46433d; +} + +.navigation:after { + position: absolute; + left: 0; + bottom: 0; + right: 0; + height: 1px; + background: #4e483f; + content: ''; + z-index: 1; +} + +.navigation .level-0.reverse > .submenu { + right: 1px; +} + +.navigation > ul { + position: relative; + min-width: 960px; + max-width: 1300px; + margin: 0 auto; + text-align: right; + z-index: 900; +} + +.navigation .level-0 > .submenu { + display: none; + position: absolute; + top: 100%; + padding: 19px 10px; + font-family: Helvetica, Arial, sans-serif; +} + +.navigation .level-0 > .submenu a { + display: block; + color: #19a3d1; + font-size: 13px; + line-height: 1.385; + padding: 5px 20px 4px; + text-decoration: none; + -webkit-transition: color .15s ease-out; + -moz-transition: color .15s ease-out; +} + +.navigation .level-0 > .submenu li { + margin-bottom: 1px; +} + +.navigation .level-0 > .submenu a:focus, +.navigation .level-0 > .submenu a:hover { + background: #19a3d1; + border-radius: 3px; + color: #fff; +} + +.navigation .level-0 > .submenu a[href="#"] { + cursor: default; + display: block; + color: #676056; + font-size: 15px; + font-weight: bold; + line-height: 1; + margin: 7px 0 6px; + padding: 0 20px; + background: transparent; +} + +.navigation .level-0 { + display: inline-block; + float: left; + text-align: left; + -webkit-transition: display .15s ease-out; + -moz-transition: display .15s ease-out; +} + +.navigation .level-0 > a { + background: none; + position: relative; + display: inline-block; + padding: 37px 21px 11px; + color: #fff; + font-family: "CallunaSans", Arial, serif; + font-weight: 500; + font-size: 13px; + text-shadow: 0 1px 3px #222; + text-transform: uppercase; + text-decoration: none; + -webkit-transition: background .15s ease-out; + -moz-transition: background .15s ease-out; +} + +/* TODO IE8 fix for CallunaSans */ +.eq-ie8 .navigation .level-0 > a { + font-size: 12px; +} + +.navigation .level-0.active > a { + background: #625d54; + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIxJSIgc3RvcC1jb2xvcj0iIzYyNWQ1NCIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiM1NjUyNDkiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); + background: -moz-linear-gradient(top, #625d54 1%, #565249 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(1%, #625d54), color-stop(100%, #565249)); + background: -webkit-linear-gradient(top, #625d54 1%, #565249 100%); + background: -o-linear-gradient(top, #625d54 1%, #565249 100%); + background: -ms-linear-gradient(top, #625d54 1%, #565249 100%); + background: linear-gradient(to bottom, #625d54 1%, #565249 100%); +} + +.eq-ie8 .navigation .level-0.active > a { + background: #625d54; +} + +/*.navigation .level-0:hover > a, +.eq-ie8 .navigation .level-0:hover > a,*/ +.navigation .level-0.hover.recent > a, +.navigation .level-0 > a:focus { + background: #fff; + color: #676056; + text-shadow: 0 1px 3px #c1bfbb; +} + +.navigation .level-0 > .submenu { + opacity: 0; + visibility: hidden; +} + +.navigation .level-0.recent.hover > .submenu { + opacity: 1; + visibility: visible; +} + +.no-js .navigation .level-0:hover > .submenu, +.no-js .navigation .level-0.hover > .submenu, +.no-js .navigation .level-0 > a:focus + .submenu { + display: block; +} + +.eq-ie8 .navigation .level-0.active > a, +.eq-ie8 .navigation .level-0:hover > a, +.eq-ie8 .navigation .level-0.hover > a { + border-top: 1px solid #46433d; + padding-top: 36px; +} + +.eq-ie8 .navigation .level-0.item-system > a { + padding-top: 0; +} + +.navigation .level-0 > a:before { + position: absolute; + left: 0; + right: 0; + top: 12px; + text-align: center; + height: 20px; + content: ''; + font-family: 'admin-icons'; + font-size: 18px; + speak: none; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + text-shadow: none; +} + +.navigation .level-0.item-dashboard > a:before, +.navigation .level-0.item-hub > a:before { + content: '\e007'; + font-size: 17px; +} + +.navigation .level-0.item-sales > a:before, +.navigation .level-0.item-sales-and-orders > a:before { + content: '\e008'; +} + +.navigation .level-0.item-catalog > a:before { + content: '\e00b'; +} + +.navigation .level-0.item-customer > a:before, +.navigation .level-0.item-customers > a:before { + content: '\e009'; + font-size: 24px; + top: 10px; +} + +.navigation .level-0.item-promo > a:before, +.navigation .level-0.item-marketing > a:before { + content: '\e00a'; + font-size: 17px; + top: 13px; +} + +.navigation .level-0.item-cms > a:before, +.navigation .level-0.item-content > a:before { + content: '\e006'; + font-size: 16px; +} + +.navigation .level-0.item-report > a:before, +.navigation .level-0.item-reports > a:before { + content: '\e00c'; + font-size: 16px; + top: 13px; +} + +.navigation .level-0.item-newsletter > a:before { + font-family: 'MUI-Icons'; + content: '\e03c'; + font-size: 22px; + top: 9px; +} + +.navigation .level-0 > .submenu { + background: #fff; + box-shadow: 0 3px 3px rgba(49, 48, 43, .5); + border-radius: 0 0 5px 5px; +} + +.no-boxshadow .navigation .level-0 > .submenu { + border: 1px solid #cbc1b4; + border-width: 0 1px 1px; + margin-left: -1px; +} + +.navigation .level-0 > .submenu li { + max-width: 200px; +} + +.navigation .level-0 > .submenu > ul { + white-space: nowrap; +} + +.navigation .level-0 > .submenu .column { + display: inline-block; + vertical-align: top; +} + +.eq-ie8 .navigation .level-0 > .submenu .column { + float: left; +} + +.navigation .level-0 .submenu .level-1 { + white-space: normal; +} + +.navigation .level-0.parent .submenu .level-1.parent { + margin: 17px 0; +} + +.navigation .level-0.parent .level-1.parent:first-child { + margin-top: 0; +} + +.navigation .level-2 .submenu { + margin-left: 7px; +} + +.navigation .level-0 > .submenu .level-2 > a[href="#"] { + font-size: 13px; + margin-top: 10px; + margin-left: 7px; +} + +.navigation .level-2 > .submenu a { + font-size: 12px; + line-height: 1.231; +} + +.navigation .level-0 > .submenu .level-3 > a[href="#"], +.navigation .level-3 .submenu { + margin-left: 15px; +} + +/* + Admin and Store Settings +-------------------------------------- */ +.navigation .level-0.item-system, +.navigation .level-0.item-stores { + float: none; + margin: 21px 0 0; +} + +.navigation .level-0.item-system > .submenu, +.navigation .level-0.item-stores > .submenu { + left: auto; + right: 1px; +} + +.navigation .level-0.item-system.hover:after, +.navigation .level-0.item-stores.hover:after { + color: #c2b59c; +} + +.navigation .level-0.item-system > a, +.navigation .level-0.item-stores > a { + position: relative; + padding: 0; +} + +.eq-ie8 .navigation .level-0.item-system:hover > a, +.eq-ie8 .navigation .level-0.item-system.hover > a { + border-top: 0; +} + +.navigation .level-0.item-system:hover > a, +.navigation .level-0.item-system.hover > a { + background: transparent; +} + +.no-js .navigation .level-0.item-system:hover > a:before, +.navigation .level-0.item-system:hover > a:before, +.navigation .level-0.item-system.hover > a:before, +.no-js .navigation .level-0.item-stores:hover > a:before, +.navigation .level-0.item-stores:hover > a:before, +.navigation .level-0.item-stores.hover > a:before { + display: none; + position: absolute; + top: 1.4em; + left: auto; + right: -19px; + height: 20px; + width: 20px; + content: ''; + border: 10px solid #fff; + border-width: 0 0 10px 10px; + border-radius: 0 0 0 20px; + z-index: 2; +} + +.navigation .level-0.item-system > a:after, +.navigation .level-0.item-stores > a:after { + display: none; + position: absolute; + top: 2em; + left: -20px; + margin-top: -1px; + width: 20px; + height: 20px; + content: ''; + border: 10px solid #fff; + border-width: 0 10px 10px 0; + border-radius: 0 0 20px; + z-index: 1; +} + +.no-js .navigation .level-0.item-system:hover > a:after, +.navigation .level-0.item-system.hover > a:after, +.no-js .navigation .level-0.item-system:hover > a:before, +.navigation .level-0.item-system.hover > a:before, +.no-js .navigation .level-0.item-stores:hover > a:after, +.navigation .level-0.item-stores.hover > a:after, +.no-js .navigation .level-0.item-stores:hover > a:before, +.navigation .level-0.item-stores.hover > a:before { + display: block; +} + +.no-js .navigation .level-0.last:hover > a:before, +.navigation .level-0.last.hover > a:before, +.eq-ie8 .navigation .level-0.item-system > a:before, +.eq-ie8 .navigation .level-0.item-system > a:after, +.eq-ie8 .navigation .level-0.item-stores > a:before, +.eq-ie8 .navigation .level-0.item-stores > a:after { + display: none; +} + +.navigation .level-0.item-system > a span, +.navigation .level-0.item-stores > a span { + display: block; + position: relative; + padding: 4px 20px 5px 10px; + border: 1px solid #4c483f; + border-left: 0; + font: 12px/1.333 "Helvetica", Arial, serif; + text-transform: none; + text-shadow: none; + background: #58534a; + color: #f2ebde; + height: 1.333em; +} + +.no-js .navigation .level-0.item-system:hover > a span, +.navigation .level-0.item-system.hover > a span, +.no-js .navigation .level-0.item-stores:hover > a span, +.navigation .level-0.item-stores.hover > a span { + background: #fff; + color: #676056; + text-shadow: none; + border-bottom: 0; + border-right: 0; + padding-right: 21px; + padding-bottom: 2em; + margin-bottom: -2em; +} + +.no-js .navigation .level-0.last:hover > a span, +.navigation .level-0.last.hover > a span { + background: #fff; + color: #676056; + text-shadow: none; + border-bottom: 0; + border-right: 0; + padding-right: 21px; + padding-bottom: 2em; + margin-bottom: -2em; +} + +.no-js .navigation .level-0.last:hover > a span, +.navigation .level-0.last.hover > a span { + border-right: 1px solid; + padding-right: 20px; +} + +.navigation .level-0.item-system > a span:after, +.navigation .level-0.item-stores > a span:after { + position: absolute; + top: 7px; + right: 7px; + width: 10px; + height: 10px; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: "\e02c"; + font-size: 8px; + text-align: center; + color: #31302b; + z-index: 2; +} + +/*.navigation .level-0.item-stores > a span:before, */ +/* TODO: place the gear icon to the "Stores" nav item when it appears */ +.navigation .level-0.item-system > a span:before { + position: absolute; + left: -22px; + top: -1px; + bottom: -1px; + height: 1.333em; + padding: 0 0 9px; + width: 21px; + border: 1px solid #4c483f; + border-right: 0; + border-radius: 5px 0 0 5px; + font-family: 'MUI-Icons'; + font-style: normal; + font-size: 12px; + line-height: 2; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e07e'; + text-align: center; + color: #31302b; +} + +.navigation .level-0.last > a, +.navigation .level-0.last > a span { + border-radius: 0 5px 5px 0; +} + +.no-js .navigation .level-0.last:hover > a span, +.navigation .level-0.last.hover > a span, +.navigation .level-0.last > a:focus span { + border-radius: 0; +} + +/* + Login page +-------------------------------------- */ + +.page-login { + padding-top: 50px; +} + +.page-login .fieldset { + border-color: #B5DCD6; +} + +.page-login .footer, +.page-login .form-login { + width: 600px; + margin: 0 auto; + position: static; +} + +.page-login .header { + width: 564px; + margin: 0 auto; + padding: 18px; +} + +.page-login .logo { + display: block; + width: 100px; + height: 70px; + margin: 0; + text-indent: -999em; + position: relative; + z-index: 1; +} + +.page-login .logo:before, +.page-login .logo:after { + font-family: 'admin-icons'; + font-size: 68px; + content: '\e00d'; + position: absolute; + bottom: 0; + left: 0; + text-indent: 0; + line-height: 1; + font-weight: normal; +} + +.page-login .logo:before { + content: '\e00d'; + color: #f37b20; +} + +.page-login .logo:after { + content: '\e00e'; + color: #fab57f; +} + +.page-login .logo span:before { + font-family: 'admin-icons'; + content: '\e00f'; + display: block; + position: absolute; + top: 0; + bottom: 0; + left: 80px; + font-size: 154px; + margin-top: -38px; + text-indent: 0; + line-height: 1; + font-weight: normal; + color: #000; +} + +.page-login .form-actions { + padding: 0 20px 0 0; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +.page-login .actions { + margin: 0 18px 0 20%; + padding-left: 4px; +} + +.page-login .actions, +.page-login .links { + display: inline-block; + vertical-align: middle; +} + +/* + Page title +-------------------------------------- */ +.page-title { + position: relative; + margin: 20px 0; +} + +.page-title-inner > .title { + font-family: 'CallunaSans'; + font-size: 26px; + font-weight: 200; + color: #676056; + display: inline-block; + margin: 0; +} + +.page-title-inner .title > h3 { + margin: 0; +} + +.page-title-inner .actions { + float: right; +} + +.page-title-inner .actions form { + display: inline-block; +} + +/* + Messages (Global) +-------------------------------------- */ +.message { + margin: 0; + padding: 10px 26px 10px 32px; + background: #f9f5ec; + border: 0; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; + color: #676056; + text-shadow: none; + border-bottom: 1px solid #c7c2b6; +} + +.message:before, +.message-system .message-inner:before { + position: absolute; + left: 8px; + top: 50%; + margin-top: -8px; + background: none; + text-shadow: none; + width: auto; + height: auto; + border: 0; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + font-size: 16px; + content: '\e006'; /* notification icon */ + color: #6e685e; +} + +.messages-inbox { + float: right; +} + +.messages-inbox .critical { + color: red; +} + +/* System Messages */ +.message-system { + padding: 0; +} + +.message-system:before { + display: none; +} + +.message-system .message-inner { + position: relative; + min-width: 960px; + max-width: 1300px; + margin: 0 auto; +} + +.message-system .message-inner:before { + margin-top: -10px; +} + +.message-system .message-content { + padding: 10px 26px 10px 32px; +} + +/* + No-javaScript-Enabled message +-------------------------------------- */ +.message-noscript { + background: #ff9; + padding: 0; + border: 0; + box-shadow: 0 1px 2px #46433d; + z-index: 994; +} + +.eq-ie8 .message-noscript { + border-bottom: 1px solid #46433d; +} + +.message-noscript .message-content { + margin: 0 auto; + max-width: 1300px; + min-width: 960px; + padding: 3px 0; + position: relative; + text-align: center; +} + +.message-noscript:before { + content: ''; +} + +.message-noscript .message-content:before { + position: relative; + background: none; + text-shadow: none; + width: auto; + height: auto; + vertical-align: middle; + border: 0; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + font-size: 32px; + content: '\e006'; /* notification icon */ + color: #6e685e; +} + +.message-demo-mode { + background: #d75f07; + border: 0; + color: #fff; + text-align: center; + padding: 5px 0; + box-shadow: 0 1px 2px #46433d; + z-index: 993; +} + +.eq-ie8 .message-demo-mode { + border-bottom: 1px solid #46433d; +} + +.message-demo-mode:before { + content: ''; +} + +.message-demo-mode .message-content { + margin: 0 auto; + max-width: 1300px; + min-width: 960px; + position: relative; + text-align: center; +} + +.message-demo-mode .message-content:before { + position: relative; + background: none; + text-shadow: none; + width: auto; + height: auto; + vertical-align: middle; + border: 0; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + font-size: 16px; + content: '\e006'; /* notification icon */ +} + +/* + Information message +-------------------------------------- */ +.message-info { + background: #fffbf0; + border: 1px solid #d87e34; + margin-bottom: 20px; +} + +.message-info:before { + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e046'; /* icon-info */ + color: #d87e34; +} + +/* TODO: implement styles for all types of messages when the new code is integrated */ + +/* + Page Structure +-------------------------------------- */ +.wrapper { + padding: 0 0 60px; +} + +.page-content { + min-width: 960px; + max-width: 1300px; + margin: 0 auto; +} + +.side-col { + position: relative; + width: 20%; +} + +.main-col { + position: relative; + width: 80%; + padding: 0 20px 20px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; +} + +.col-left { + float: left; +} + +.col-right { + float: right; +} + +.col-1-layout .main-col { + width: auto; +} + +.col-2-left-layout .main-col, +.col-2-right-layout .side-col { + float: right; +} + +.col-2-right-layout .main-col, +.col-2-left-layout .side-col { + float: left; +} + +.col-2-left-layout, +.col-1-layout { + position: relative; + background: #f5f2ed; + border: 1px solid #b7b2a6; + border-radius: 5px; +} + +.col-1-layout { + padding: 20px; +} + +.col-2-left-layout:before { + position: absolute; + display: block; + left: 20%; + top: 0; + bottom: 0; + width: 1px; + content: ''; + -webkit-box-shadow: -2px 0 7px #777; + -moz-box-shadow: -2px 0 7px #777; + box-shadow: -2px 0 7px #777; + z-index: 2; +} + +.adminhtml-dashboard-index .side-col { + width: 38%; + padding: 1%; +} + +.adminhtml-dashboard-index .main-col { + width: 58%; +} + +/* Sidebar and main column vertical separator */ +.main-col:after, +.side-col:after { + position: absolute; + top: 0; + bottom: 0; + width: 1px; + background: #d2ccc2; + content: ''; +} + +.col-2-left-layout .side-col:after { + right: 0; +} + +.col-2-right-layout .side-col:after { + left: 0; +} + +.col-2-right-layout .main-col:after { + right: -1px; +} + +.col-2-left-layout .main-col:after { + left: -1px; +} + +/* Sidebar title and store view switcher*/ +/* TODO: temporary styles */ +.side-col h3, +.side-col > .switcher { + padding: 0 17px; +} + +.side-col > .switcher { + padding-top: 20px; +} + +.side-col > .switcher > a { + white-space: nowrap; +} + +/* + Universal Sidebar Tabs +-------------------------------------- */ +/* TODO: for "Product" page only while refactoring */ +.side-col .tabs { + margin: 0 0 30px; + padding: 0; + list-style: none; + font-family: 'CallunaSans', Arial, sans-serif; + font-weight: 500; +} + +.side-col .tabs > li { + border-bottom: 1px solid #e5e1db; +} + +.side-col .tabs > li a { + position: relative; + display: block; + padding: 8px 18px; + text-decoration: none; + color: #676056; + -webkit-transition: background 0.3s ease-in-out; + -moz-transition: background 0.3s ease-in-out; + transition: background 0.3s ease-in-out; +} + +.side-col .tabs > li a:active, +.side-col .tabs > li a:focus { + outline: none; +} + +.side-col .tabs > li a:hover { + background: #fff; +} + +.side-col .tabs > .ui-state-active a { + border-left: 3px solid #d87e34; + padding-left: 15px; + background: #dedcd8; + box-shadow: 0 1px 2px #ccc inset; +} + +.side-col .tabs > .ui-state-active a:after { + position: absolute; + top: 50%; + right: 0; + width: 14px; + margin-top: -14px; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e02b'; /* left turned triangle icon */ + font-size: 22px; + text-shadow: -1px 1px 0 #bdbbb7; + color: #f5f2ed; + overflow: hidden; + z-index: 3; +} + +/* TODO: styles for navigation on System > Configuration page */ + +/* + Horizontal Tabs +-------------------------------------- */ +.tabs-horiz { + list-style: none; + margin: 0; + padding: 5px 5px 0; + border: 1px solid #ccc; + background: #f2e5d7; +} + +.tabs-horiz > li { + float: left; + border: 1px solid #ccc; + border-bottom-width: 0; + margin: 0 -1px 0 0; +} + +.tabs-horiz > li a { + position: relative; + background: #f5f2ed; + display: block; + padding: 8px 18px; + text-decoration: none; + color: #676056; + -webkit-transition: background 0.3s ease-in-out; + -moz-transition: background 0.3s ease-in-out; + transition: background 0.3s ease-in-out; +} + +.tabs-horiz > li a:hover { + background: #fff; +} + +.tabs-horiz > .ui-state-active a { + background: #DEDCD8; + border-top: 3px solid #d87e34; + padding-top: 5px; + box-shadow: 1px 0 3px #aaa; +} + +/* Tabs Loading Spinner */ +.side-col .tabs .loading, +.tabs-horiz .loading { + display: none; + position: absolute; + left: 50%; + margin-top: 9px; +} + +/* + System -> Configuration page navigation in sidebar +-------------------------------------- */ +.config-nav, +.config-nav .items { + margin: 0; + padding: 0; + list-style: none; +} + +.config-nav-block { + +} + +.config-nav-block:last-child { + margin-bottom: 30px; +} + +.config-nav .item { + border-bottom: 1px solid #E5E1DB; +} + +.config-nav .item:last-child { + border: 0; +} + +.config-nav .title { + margin-bottom: 0; + text-transform: uppercase; + color: #444; + border: solid #CCC; + border-width: 1px 0; + opacity: .8; + padding: 7px 17px; + background: #E6E3DE; +} + +.config-nav .item-nav { + position: relative; + display: block; + padding: 8px 18px; + text-decoration: none; + color: #676056; + -webkit-transition: background 0.3s ease-in-out; + -moz-transition: background 0.3s ease-in-out; + transition: background 0.3s ease-in-out; +} + +.config-nav .item-nav:hover { + background: #fff; +} + +.config-nav .item-nav.active { + border-left: 3px solid #d87e34; + padding-left: 15px; + background: #dedcd8; + box-shadow: 0 1px 2px #ccc inset; +} + +.config-nav .item-nav.active:after { + position: absolute; + top: 50%; + right: 0; + width: 14px; + margin-top: -14px; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e02b'; /* left turned triangle icon */ + font-size: 22px; + text-shadow: -1px 1px 0 #bdbbb7; + color: #f5f2ed; + overflow: hidden; + z-index: 3; +} + +/* + Footer +-------------------------------------- */ +.footer { + position: absolute; + left: 0; + right: 0; + bottom: 0; + color: #989288; + font-size: 11px; +} + +.footer-content { + margin: 0 auto; + max-width: 1300px; + min-width: 960px; + padding: 20px; +} + +/* + Switcher +-------------------------------------- */ +.switcher { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.switcher strong { + vertical-align: top; + font-family: "CallunaSans", Arial, sans-serif; + font-size: 12px; + font-weight: 600; + color: #979087; + text-shadow: 0 1px #fff; + text-transform: uppercase; +} + +.switcher input[type="checkbox"] { + width: 1px; + height: 1px; + opacity: 0; + margin: 0; +} + +.switcher input:focus + span { + outline: 1px dotted grey; +} + +.switcher span { + display: inline-block; + width: 34px; + height: 17px; + background: url(Mage_Backend::images/switcher.png) no-repeat; +} + +.switcher input:checked + span { + background-position: -34px 0; +} + +/* TODO: IE8 fix for :checked attr */ +.eq-ie8 .switcher input.checked + span { + background-position: -34px 0; +} + +/* + Content actions panel (with buttons, switchers...) +-------------------------------------- */ +.page-actions { + padding: 14px 0 18px; + text-align: right; +} + +.page-actions .buttons-group { + vertical-align: top; + text-align: left; +} + +.page-actions > .switcher { + display: inline-block; + vertical-align: top; + margin: 6px 10px 0 0; +} + +/* TODO: refactor trees */ +.x-tree ul { + margin: 0; + padding: 0; +} + +.page-actions.fixed { + padding: 0 1px; + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: 9999; +} + +.page-actions.fixed .page-actions-inner { + background: #f7f2ec; + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIxJSIgc3RvcC1jb2xvcj0iI2Y3ZjJlYyIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjYwJSIgc3RvcC1jb2xvcj0iI2ZjZmFmNyIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmZmZmZmYiIHN0b3Atb3BhY2l0eT0iMCIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); + background: -moz-linear-gradient(top, rgba(247,242,236,1) 1%, rgba(252,250,247,1) 70%, rgba(255,255,255,0) 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(1%,rgba(247,242,236,1)), color-stop(70%,rgba(252,250,247,1)), color-stop(100%,rgba(255,255,255,0))); + background: -webkit-linear-gradient(top, rgba(247,242,236,1) 1%,rgba(252,250,247,1) 70%,rgba(255,255,255,0) 100%); + background: -o-linear-gradient(top, rgba(247,242,236,1) 1%,rgba(252,250,247,1) 70%,rgba(255,255,255,0) 100%); + background: -ms-linear-gradient(top, rgba(247,242,236,1) 1%,rgba(252,250,247,1) 70%,rgba(255,255,255,0) 100%); + background: linear-gradient(to bottom, rgba(247,242,236,1) 1%,rgba(252,250,247,1) 70%,rgba(255,255,255,0) 100%); + padding: 11px 20px 11px; + min-height: 36px; + margin: 0 auto; + min-width: 916px; + max-width: 1258px; +} + +.page-actions.fixed .page-actions-inner:before { + content: attr(data-title); + float: left; + font-family: 'CallunaSans'; + font-size: 20px; + max-width: 50%; +} + +/* + Table Grid +-------------------------------------- */ + +/* Grid - General */ +.grid { + border-bottom: 0; + font-size: 13px; + padding-bottom: .5em; +} + +.grid table { + border-collapse: collapse; + border: none; + width: 100%; +} + +.grid table.border { + border: 1px solid #c0bbaf; +} + +.grid tbody { + background: #e6e3de; +} + +.grid tr.even, .grid tr.even tr { + background: #f5f2ed; +} + +.grid tr.on-mouse { + background: #fff; + cursor: pointer; +} + +/* Rows mouse-over */ +.grid tr.invalid { + background-color: #f5d6c7; +} + +.grid th, .grid td { + padding: 2px 4px 2px 4px; +} + +.grid th { + border: none; +} + +.grid td.editable input.input-text { + width: 50px; + margin-left: 4px; +} + +.grid td input.input-text { + width: 86%; +} + +.grid td input.input-inactive { + background: #eee; +} + +.grid table td { + font-size: 14px; + border: solid #c0bbaf; + border-width: 0 1px 1px 0; + padding: 10px 10px 5px; +} + +.grid table td:first-child, +.grid table td:last-child { + border-width: 0 1px 1px; +} + +.grid table.border td { + background: #fff; +} + +.grid table td.product { + text-align: right; +} + +.grid table td.empty-text { + border: 1px solid #c0bbaf; + font-size: 15px; + text-align: center; + padding: 15px; +} + +.grid table td.empty-text:hover { + background: #e6e3de; +} + +.grid table td .action-select { + width: 100%; +} + +.grid tbody.odd tr { + background: #fff; +} + +.grid tbody.even tr { + background: #f6f6f6; +} + +.grid tbody.odd tr td, +.grid tbody.even tr td { + border-bottom: 0; +} + +.grid tbody.odd tr.border td, +.grid tbody.even tr.border td { + border-bottom: 1px solid #dadfe0; +} + +[id$='Grid'] { + font-family: 'CallunaSans'; + font-weight: 400; +} + +/* Grid - Pager and Buttons row */ +.grid-actions { + border: 1px solid #c0bbaf; + border-bottom: 0; + background: rgb(246, 243, 236); + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y2ZjNlYyIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNlZGVhZTEiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); + background: -moz-linear-gradient(top, rgba(246, 243, 236, 1) 0%, rgba(237, 234, 225, 1) 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(246, 243, 236, 1)), color-stop(100%, rgba(237, 234, 225, 1))); + background: -webkit-linear-gradient(top, rgba(246, 243, 236, 1) 0%, rgba(237, 234, 225, 1) 100%); + background: -o-linear-gradient(top, rgba(246, 243, 236, 1) 0%, rgba(237, 234, 225, 1) 100%); + background: -ms-linear-gradient(top, rgba(246, 243, 236, 1) 0%, rgba(237, 234, 225, 1) 100%); + background: linear-gradient(to bottom, rgba(246, 243, 236, 1) 0%, rgba(237, 234, 225, 1) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#f6f3ec', endColorstr = '#edeae1', GradientType = 0); + padding: 10px 10px 5px; + position: relative; +} + +[id$='Grid'] .separator { + padding: 0 4px; + color: #b9b9b9; +} + +.grid-actions select { + margin: 0; + vertical-align: top; +} + +.grid-actions .export, +.grid-actions .filter-actions { + float: right; + margin-left: 30px; +} + +.grid-actions .pager select { + width: 5em; + margin: 0 4px; +} + +.grid-actions .pager input.page { + width: 2em; +} + +.pager .action-next, +.pager .action-previous { + display: inline-block; + position: relative; + text-indent: 100%; + overflow: hidden; + height: 16px; + width: 16px; + vertical-align: middle; + text-decoration: none; +} + +.pager .action-next:after, +.pager .action-previous:after { + font-family: 'MUI-Icons'; + content: "\e02a"; + font-size: 16px; + color: #333; + position: absolute; + top: 0; + left: 0; + line-height: 1; + text-indent: 0; +} + +.pager .action-previous:after { + content: "\e02b"; +} + +.pager span.action-next:after, +.pager span.action-previous:after { + color: #7f7f7f; +} + +/* Grid - Headings */ +.grid tr.headings th { + font-size: 13px; + border-right: 1px solid #837F79; + padding: 0 1px; + vertical-align: bottom; +} + +.grid tr.headings th > span { + display: block; + border-bottom: 5px solid transparent; + padding: 5px 10px; +} + +.grid tr.headings th:hover > span { + border-color: #504841; +} + +.grid tr.headings th a span { + display: block; + padding-right: 20px; +} + +.grid tr.headings th a { + display: block; + color: #cac3b4; + position: relative; + text-decoration: none; +} + +.grid tr.headings th a:after { + background: url(../images/grid-sorted-th-arrows.png) no-repeat 0 -12px; + content: ''; + display: none; + height: 8px; + width: 12px; + position: absolute; + bottom: 5px; + right: 0; +} + +.grid tr.headings th a:hover:after { + background-position: 0 -12px; + display: block; +} + +.grid tr.headings th a.sort-arrow-desc:after { + background-position: 0 0; + display: block; +} + +.grid tr.headings th a.sort-arrow-asc:after { + background-position: -12px 0; + display: block; +} + +.grid tr.headings th a.sort-arrow-desc:hover:after { + background-position: 0 -24px; +} + +.grid tr.headings th a.sort-arrow-asc:hover:after { + background-position: -12px -24px; +} + +/* Grid - Filter */ +.grid .filter { + cursor: default; +} + +.grid .filter th { + padding: 10px 8px 5px; + border-right: 1px solid #837F79; + vertical-align: top; + white-space: normal; +} + +.grid .filter input.input-text { + padding: 2px; + height: 24px; + width: 99%; +} + +.grid .filter select { + padding: 2px; + width: 99%; +} + +.grid .filter .range .range-line { + margin-bottom: 3px; + overflow: hidden; + width: 100px; +} + +.grid .filter .range div.date { + min-width: 121px; +} + +.grid .filter .range input { + float: right; + width: 56px; + margin-top: 0; +} + +.grid .filter .range select { + float: right; + width: 56px; + margin-top: 0; +} + +.grid .filter .range .label { + display: block; + width: 36px; + float: left; + padding-left: 2px; +} + +.grid .filter .date img { + width: 15px; + height: 15px; + cursor: pointer; + vertical-align: middle; +} + +.grid .head-massaction select { + width: 50px; +} + +/* Grid - Mass Action */ +.massaction { + color: #CAC3B4; + padding: 12px 10px; + background: #666158; + box-shadow: 0 2px 3px 0 #504d46 inset, 0 -2px 3px 0 #504d46 inset; + overflow: hidden; +} + +.massaction ul { + list-style: none; + margin: 0; + padding: 4px 0 0; +} + +.massaction li { + display: inline-block; +} + +.massaction li:after { + content: '|'; + display: inline-block; + margin: 0 5px; +} + +.massaction li:last-child:after { + display: none; +} + +.massaction .entry-edit { + float: right; + display: inline-block; +} + +.massaction .entry-edit fieldset { + margin: 0; + padding: 0; + background: none; + border: none; +} + +.massaction .entry-edit fieldset select { + margin: 0; +} + +.massaction .entry-edit fieldset select.validation-failed { + border: 1px dashed #eb340a; + background: #faebe7; +} + +.massaction .entry-edit .field-row, +.massaction .entry-edit .outer-span { + display: inline-block; + vertical-align: middle; +} + +.massaction .entry-edit .outer-span .entry-edit { + float: none; +} + +.massaction .entry-edit .field-row label { + color: #cac3b4; + line-height: 26px; + margin: 0 5px 0 20px; + vertical-align: top; +} + +.massaction .entry-edit .validation-advice { + display: none !important; +} + +.massaction a { + color: #e7e2d7; + text-decoration: none; +} + +/* Grid Footer */ +.grid table tfoot tr { + background: #d7e5ef; +} + +.grid table tfoot tr td { + border-top: 1px solid #9babb9; + background: #e5ecf2; + line-height: 1.7em; +} + +.grid table.border tfoot tr td { + background: #d7e5ef; +} + +/* Dynamic Grid */ +/* Used in pages like Catalog -> Attributes */ +.dynamic-grid th { + padding: 2px; + width: 100px; +} + +.dynamic-grid td { + padding: 2px; +} + +.dynamic-grid td input { + width: 94px; +} + +tr.dynamic-grid td, +tr.dynamic-grid th { + padding: 2px 10px 2px 0; + width: auto; +} + +tr.dynamic-grid input.input-text { + width: 154px; +} + +.available { + color: #080; + font-weight: bold; +} + +.not-available { + color: #800; +} + +.categories-side-col { + padding: 0 3%; +} + +/* + Data table +-------------------------------------- */ +.data-table { + border-collapse: inherit; /* do not remove this! without this rule in FF when table has only 1 row bottom and side borders disappear*/ + width: 100%; +} + +.data-table thead, +.data-table tfoot, +.data-table th { + background: #fff; + color: #666; +} + +.data-table th { + border-color: #c9c2b8; + border-width: 0 0 1px; + padding: 7px; +} + +.data-table td, +.data-table tbody tr:not(:last-child) td, +.data-table tbody tr td { + background: #fff; + padding: 3px 7px; + font-size: 12px; + vertical-align: top; + border: solid #eae8e4; + border-width: 0 0 1px; +} + +.data-table tbody tr.selected td, +.data-table tbody tr.selected th, +.data-table tbody tr:hover td, +.data-table tbody tr:hover th, +.data-table tbody tr:nth-child(odd) th, +.data-table tbody tr:nth-child(odd):hover th { + background: #fff; +} + +.data-table tbody tr:nth-child(odd) td, +.data-table tbody tr:nth-child(odd):hover td { + background: #fbfaf6; +} + +.data-table tfoot td:last-child { + border: 0; +} + +.data-table input[type="text"] { + width: 98%; + padding-left: 1%; + padding-right: 1%; + height: 24px; +} + +.data-table select { + margin: 0; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +/* + Attribute Information +-------------------------------------- */ +.data-table .col-default { + white-space: nowrap; + text-align: center; + vertical-align: middle; +} + +.data-table .col-delete { + text-align: center; + width: 32px; +} + +.data-table .col-price input { + width: 60px; +} + +.data-table .col-qty input { + width: 50px; +} + +.data-table .col-file { + white-space: nowrap; +} + +.data-table .col-file input { + margin: 0 5px; + width: 40%; +} + +.data-table .col-file input:first-child { + margin-left: 0; +} + +/* + Website store views tree +-------------------------------------- */ +.store-tree .website-name { + font-size: 14px; + font-weight: bold; +} + +.store-tree .webiste-groups { + margin: 5px 0 20px 18px; +} + +.store-tree .webiste-groups dt { + font-weight: bold; +} + +.store-tree .webiste-groups dd { + margin: 5px 0 15px 15px; +} + +.store-tree .webiste-groups dd > ul { + list-style: none; + margin: 0; + padding: 0; +} + +.store-tree .webiste-groups dd > ul > li { + margin: 0 0 5px; +} + +.no-display { + display: none; +} + +/* + Clearfix +-------------------------------------- */ +.clearfix:before, +.clearfix:after, +[class$="-layout"]:after, +.footer-content:before, +.footer-content:after, +.page-title-inner:before, +.page-title-inner:after, +.tabs-horiz:before, +.tabs-horiz:after, +.navigation > ul:before, +.navigation > ul:after, +.actions-split:before, +.actions-split:after, +.page-create-order:before, +.page-create-order:after, +.order-addresses:before, +.order-addresses:after, +.order-methods:before, +.order-methods:after, +.order-summary:before, +.order-summary:after, +.order-methods:before, +.order-methods:after, +.grid-actions:before, +.grid-actions:after, +.fieldset-wrapper-title:before, +.fieldset-wrapper-title:after { + content: ""; + display: table; +} + +.clearfix:after, +[class$="-layout"]:after, +.footer-content:after, +.page-title-inner:after, +.tabs-horiz:after, +.navigation > ul:after, +.actions-split:after, +.page-create-order:after, +.order-addresses:after, +.order-methods:after, +.order-summary:after, +.order-methods:after, +.grid-actions:after, +.fieldset-wrapper-title:after { + clear: both; +} diff --git a/app/design/adminhtml/default/backend/css/antiscroll.css b/app/design/adminhtml/default/backend/css/antiscroll.css new file mode 100644 index 0000000000000000000000000000000000000000..18fa63878f74411e6a3497e7f19fd9454bc18dc4 --- /dev/null +++ b/app/design/adminhtml/default/backend/css/antiscroll.css @@ -0,0 +1,78 @@ +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ + +.antiscroll-wrap { + position: relative; + overflow: hidden; +} + +.antiscroll-scrollbar { + background: gray; + background: rgba(0, 0, 0, 0.5); + -webkit-border-radius: 7px; + -moz-border-radius: 7px; + border-radius: 7px; + -webkit-box-shadow: 0 0 1px #fff; + -moz-box-shadow: 0 0 1px #fff; + box-shadow: 0 0 1px #fff; + position: absolute; + opacity: 0; + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); + -webkit-transition: linear 300ms opacity; + -moz-transition: linear 300ms opacity; + -o-transition: linear 300ms opacity; +} + +.antiscroll-scrollbar-shown { + opacity: 1; + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); +} + +.antiscroll-scrollbar-horizontal { + height: 7px; + margin-left: 2px; + bottom: 2px; + left: 0; +} + +.antiscroll-scrollbar-vertical { + width: 7px; + margin-top: 2px; + right: 2px; + top: 0; +} + +.antiscroll-inner { + position: relative; + left: 20px; + height: 100%; + max-height: 100%; + width: 100%; + max-width: 100%; + overflow-y: scroll; +} + +.antiscroll-inner::-webkit-scrollbar, .antiscroll-inner::scrollbar { + width: 0; + height: 0; +} diff --git a/app/design/adminhtml/default/backend/css/debug.css b/app/design/adminhtml/default/backend/css/debug.css new file mode 100644 index 0000000000000000000000000000000000000000..8705b557d40a0aac2ca2415741e963b55ffc8e73 --- /dev/null +++ b/app/design/adminhtml/default/backend/css/debug.css @@ -0,0 +1,543 @@ +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ + +/* + This file was created to debug old classes in order to indicate where we must replase it with new ones + The types of messages are generated in file: \app\code\core\Mage\Core\Block\Messages.php like $html .= '<' . $this->_messagesSecondLevelTagName . ' class="' . $type . '-msg">'; +-------------------------------------- */ + +/* + All messages to identify and refactor: + +label.mage-error, +.notice, +.messages ul, +.messages li, +.messages ul li, +.error-msg, +.success-msg, +.notice-msg, +.warning-msg + +Done: +.notification-global +.notification-global-notice +-------------------------------------- */ +.debug { + border: 1px solid red !important; +} + +.messages ul, +ul.messages { + list-style: none; + margin: 0; + padding: 0; +} + +ul.messages > li { + margin: 20px 0; + +} + +ul.messages li li { + padding: 10px 26px 10px 32px; + border: 0; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; + color: #676056; + text-shadow: none; + position: relative; + background: #fffbf0; + border: 1px solid #d87e34; + margin-top: -1px; +} + +ul.messages li li:first-child { + margin-top: 0; +} + +ul.messages li li:before { + position: absolute; + left: 8px; + top: 50%; + margin-top: -11px; + background: none; + text-shadow: none; + width: auto; + height: auto; + border: 0; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + font-size: 16px; + content: '\e046'; /* icon-info */ + color: #d87e34; +} + +ul.messages li.error-msg li { + color: #963535; + border-color: #963535; + background: #f3dcd8; +} + +ul.messages li.error-msg li:before { + content: '\e069'; + color: #963535; +} + +ul.messages li.success-msg li { + border-color: #185b00; + background: #e6ecc0; + color: #185b00; +} + +ul.messages li.success-msg li:before { + content: '\e067'; + color: #185b00; +} + +label.mage-error { + color: red; +} + +/* + Accordion +------------------------*/ +.accordion { + background: #fff; + border: 1px solid #eae6e0; + border-radius: 5px; + margin: 0 0 8px; + padding: 0; +} + +.accordion > dt, +.accordion .collapseable { + position: relative; + margin: 0 10px; +} + +.accordion > dt a, +.accordion .collapseable > a { + color: #666; + display: block; + padding: 15px 17px 10px 10px; + font-family: 'CallunaSans', Arial, sans-serif; + font-size: 18px; + text-decoration: none; + margin: 0 8px; +} + +.accordion .collapseable a.open { + border-bottom: 1px solid #eee; +} + +.accordion > dt a:before, +.accordion .collapseable > a:before { + float: right; + content: "\e02c"; + color: #b2aa9d; + display: inline-block; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; +} + +.accordion > dt.open a:before, +.accordion .collapseable a.open:before { + content: "\e029"; +} + +.accordion > dt + dd { + display: none; +} + +.accordion > dt + .open { + display: block; + border-top: 1px solid #EDEDED; + margin: 0 10px; + padding: 17px 8px; +} + +.accordion > dd + dt, +.accordion .collapseable { + border-top: 1px solid #eee; +} + +.accordion > .open + dt, +.accordion .collapseable:first-child { + border: none; +} + +.accordion > dt + .open:empty { + background: url(../mui/images/ajax-loader-big.gif) no-repeat center; + height: 100px; +} + +.dashboard-container { + border-radius: 0; +} + +.dashboard-container.col-2-left-layout:before { + left: 40%; +} + +/* TODO: arrange configuration tables */ +.accordion .collapseable.disabled { + margin: 0; + border-color: #fff; +} + +.accordion .collapseable.disabled > a { + background: #f1f1f1; + cursor: not-allowed; + padding: 14px 27px; +} + +.accordion .collapseable.disabled > a:before { + content: ''; +} + +.accordion .config { + border: 0; +} + +.accordion .config legend { + display: none; +} + +.accordion .config table { + width: 100%; +} + +.accordion .config .label { + float: none; + width: 25%; +} + +.accordion .config td { + background: none; + border: 0; + padding: 8px 15px 0 0; + vertical-align: top; + text-align: left; +} + +.accordion .paypal-selection-simplified { + padding-left: 30px; +} + +.accordion .paypal-selection input[type="checkbox"] { + margin: -4px 7px 0 0; +} + +.accordion .config input[type="text"], +.accordion .config input[type="password"], +.accordion .config select, +.accordion .config textarea { + width: 100%; + border-radius: 3px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.accordion .config select.select-date { + width: 20%; +} + +.accordion .config .value { + width: 50%; +} + +.accordion .config .scope-label { + color: #999; + font-size: 12px; +} + +.accordion .config .note { + font-size: 11px; + padding-left: 15px; + margin: 5px 0; + color: #666; +} + +.accordion .config .note:before { + position: absolute; + margin: 4px 0 0 -14px; + content: ''; + display: inline-block; + vertical-align: top; + font-size: 0; + line-height: 0; + width: 0; + border-bottom: 5px solid #666; + border-left: 5px solid transparent; + border-right: 5px solid transparent; +} + +.accordion .config .system-tooltip-box { + position: absolute; +} + +.accordion .paypal-selection { + margin: 10px; + width: 98%; +} + +.accordion .paypal-selection th { + padding: 6px 10px 7px; +} + +.accordion .paypal-selection { + border-bottom: 2px solid #c0bbaf; +} + +.accordion .paypal-payment-notice { + margin: 10px; +} + +.accordion .custom-options { + border: 1px solid #999; + padding: 0 10px; + margin: 0 0 20px; +} + +/* TODO: arrange range inputs width in tables */ +.grid td input.input-text-range { + width: 35%; +} + +.grid td input.input-text-range-date { + width: 31%; +} + +/* TODO: styles for required TH fields */ +th.required:before { + color: red; + content: "*"; +} + +/* TODO: set color for messages in Cache Storage Management */ +.grid-severity-critical, +.grid-severity-notice, +.grid-severity-minor { + display: block; + border: 1px solid #c76f35; + background: #fffbf0; + text-align: center; +} + +.grid-severity-critical { + border-color: #963535; + background: #f3dcd8; + color: #963535; +} + +.grid-severity-notice { + border-color: #185b00; + background: #e6ecc0; + color: #185b00; +} + +/* TODO: Store views tree */ +.tree-store-scope .field { + margin: 0; +} + +.tree-store-scope .field .label { + padding-top: 0; +} + +/* + Sales +-------------------------------------- */ + +.order-items .entry-edit-head .form-buttons { + float: right; +} + +.order-items .entry-edit-head .icon-head { + display: inline; +} + +.order-items .entry-edit-head { + margin-bottom: 20px; +} + +.order-items .entry-edit-head:before, +.order-items .entry-edit-head:after { + content: ""; + display: table; +} + +.order-items .entry-edit-head:after { + clear: both; +} + +/* + Import-export tax rates +-------------------------------------- */ +.import-export-tax-rates input[type=file] { + margin-right: 10px; +} + +.import-tax-rates, +.export-tax-rates { + float: left; + width: 48.9362%; +} + +.export-tax-rates { + margin-left: 2.12766%; +} + +.import-export-tax-rates:before, +.import-export-tax-rates:after { + content: ""; + display: table; +} + +.import-export-tax-rates:after { + clear: both; +} + +.adminhtml-sales-order-index .page-actions { + position: absolute; + z-index: 2; + margin-top: 8px; + margin-left: 15px; + padding: 0; +} + +.adminhtml-sales-order-index .page-actions .add { + width: 36px; + height: 36px; + border-radius: 18px; + background: #f37b21; + overflow: hidden; + position: relative; + z-index: 1; + padding: 0; + text-align: center; +} + +.adminhtml-sales-order-index .page-actions .add > span { + text-indent: -999em; + display: block; + padding: 0; +} + +.adminhtml-sales-order-index .page-actions .add > span:before { + display: block; + text-indent: 0; + content: '+'; + font-weight: normal; + font-size: 36px; + color: #fff; + position: absolute; + line-height: 36px; + height: 36px; + width: 36px; + overflow: hidden; + text-align: center; + top: -4px; + left: -1px; + vertical-align: top; +} + +.adminhtml-sales-order-index .grid-actions { + border-radius: 5px 5px 0 0; + margin-top: 20px; + padding-left: 100px; + padding: 10px 16px 10px 80px; +} + +.adminhtml-sales-order-index .col-1-layout { + padding: 0; + background: transparent; + border: 0; + border-radius: 0; +} + +.sidebar-actions { + padding: 14px 0; +} + +.sidebar-actions button { + margin: 0 0 5px; +} + +/* + Product +-------------------------------------- */ +.tier { + margin: 20px 0 0; +} + +/* + Edit attribute set +-------------------------------------- */ +.attribute-set-col { + display: block; + float: left; + width: 100%; + margin-left: 2.127659574%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + width: 31.9149%; +} + +.attribute-set-col:first-child { + margin-left: 0; +} + +.attribute-set-tree { + margin-top: 5px; + overflow: auto; + height: 400px; + width: 100%; +} + +.attribute-set:before, +.attribute-set:after { + content: ""; + display: table; +} +.attribute-set:after { + clear: both; +} + +/* + Manage Categories +-------------------------------------- */ +.adminhtml-catalog-category-edit .category-edit-title { + float: left; +} \ No newline at end of file diff --git a/app/design/adminhtml/default/backend/css/header.css b/app/design/adminhtml/default/backend/css/header.css new file mode 100644 index 0000000000000000000000000000000000000000..0a3173f2f694bf2465094c219105891f72945df7 --- /dev/null +++ b/app/design/adminhtml/default/backend/css/header.css @@ -0,0 +1,576 @@ +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ + +/* + Header +-------------------------------------- */ +.header { + position: relative; + background: #f5f2ea; + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y1ZjJlYSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmMWVkZTMiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); + background: -moz-linear-gradient(top, #f5f2ea 0%, #f1ede3 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f2ea), color-stop(100%, #f1ede3)); + background: -webkit-linear-gradient(top, #f5f2ea 0%, #f1ede3 100%); + background: -o-linear-gradient(top, #f5f2ea 0%, #f1ede3 100%); + background: -ms-linear-gradient(top, #f5f2ea 0%, #f1ede3 100%); + background: linear-gradient(to bottom, #f5f2ea 0%, #f1ede3 100%); + z-index: 992; + padding: 0 20px; +} + +.eq-ie8 .header { + background: #f5f2ea; +} + +.header-inner { + min-width: 960px; + max-width: 1300px; + margin: 0 auto; + padding: 6px 0 7px; +} + +.header .logo { + display: inline-block; + width: 100px; + height: 27px; + margin: 0; + text-indent: -999em; + position: relative; + z-index: 1; +} + +.header .logo:before, +.header .logo:after { + font-family: 'admin-icons'; + font-size: 26px; + content: '\e00d'; + position: absolute; + bottom: 0; + left: 0; + text-indent: 0; + line-height: 1; + font-weight: normal; +} + +.header .logo:before { + content: '\e00d'; + color: #f37b20; +} + +.header .logo:after { + content: '\e00e'; + color: #fab57f; +} + +.header .logo span:before { + font-family: 'admin-icons'; + content: '\e00f'; + display: block; + position: absolute; + top: 0; + bottom: 0; + left: 28px; + font-size: 65px; + margin-top: -17px; + text-indent: 0; + line-height: 1; + font-weight: normal; + color: #000; +} + +.header-panel { + float: right; + font-size: 12px; +} + +/* + Header Dropdown +-------------------------------------- */ +.header-panel .dropdown-menu { + display: none; + width: 195px; + margin: 8px -87px 0 0; + border: 0; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; + -moz-box-shadow: 0 2px 7px 2px rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 2px 7px 2px rgba(0, 0, 0, 0.2); + box-shadow: 0 2px 7px 2px rgba(0, 0, 0, 0.2); +} + +.eq-ie8 .header-panel .dropdown-menu { + border: 1px solid #c3bcaf; +} + +.header-panel .dropdown-menu > li { + position: relative; + padding: 20px 30px 13px 18px; + background: #f7f3eb; + border-bottom: 1px solid #f7e4d0; + color: #8C867E; + font: 11px/13px Arial, Helvetica, sans-serif; +} + +.header-panel .dropdown-menu > li:first-child:before, +.header-panel .dropdown-menu > li.first:before { + position: absolute; + width: 10px; + height: 10px; + top: -8px; + left: 50%; + margin-left: -5px; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e029'; /* user icon */ + color: #f7f3eb; + font-size: 13px; + text-shadow: 0 -1px 2px #bbb; +} + +.header-panel .dropdown-menu > li:hover { + background: #fff; +} + +.header-panel .dropdown-menu > li:first-child:hover:before, +.header-panel .dropdown-menu > li.first:hover:before { + color: #fff; +} + +.header-panel .dropdown-menu > li a { + display: block; + text-decoration: none; + color: #8c867e; + margin: 0 0 10px; +} + +.header-panel .dropdown-menu > li a:hover { + text-decoration: underline; +} + +.header-panel .dropdown-menu > li:first-child, +.header-panel .dropdown-menu > li.first { + -moz-border-radius: 5px 5px 0 0; + -webkit-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} + +.header-panel .dropdown-menu > li:last-child, +.header-panel .dropdown-menu > li.last { + border-bottom: 0; + -moz-border-radius: 0 0 5px 5px; + -webkit-border-radius: 0 0 5px 5px; + border-radius: 0 0 5px 5px; +} + +/* + Account +-------------------------------------- */ +.header-panel .account { + position: relative; + float: left; + margin: 0 0 0 30px; + padding: 6px 0 0; +} + +.header-panel .account > a { + color: #656057; + position: relative; + display: inline-block; + min-width: 20px; + text-decoration: none; + padding: 0 10px 0 0; +} + +.header-panel .account > a:before { + position: absolute; + top: 2px; + right: 0; + bottom: 0; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + font-size: 9px; + -webkit-font-smoothing: antialiased; + content: '\e02c'; /* icon point down */ +} + +.header-panel .account img { + position: relative; + border-radius: 3px; + z-index: 1; +} + +.no-js .header-panel .account:hover > a { + padding-bottom: 5px; + margin-bottom: -5px; +} + +.header-panel .account.active .dropdown-menu, +.no-js .header-panel .account:hover .dropdown-menu, +.no-js .header-panel .account > a:focus + .dropdown-menu { + display: block; +} + +/* + Link to store front +-------------------------------------- */ +.header-panel .store-front { + color: #676056; + text-decoration: none; + position: relative; + padding: 6px 0 0 20px; + float: left; + margin: 0 0 0 30px; +} + +.header-panel .store-front:before { + font-family: 'admin-icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e005'; /* icon store info */ + font-size: 17px; + position: absolute; + left: 0; + top: 4px; +} + +/* + Messages +-------------------------------------- */ +.header-panel .notifications { + position: relative; + float: left; + margin: 0 0 0 30px; + padding: 4px 0 0; +} + +.header-panel .notifications-icon { + position: relative; + display: inline-block; + height: 13px; + line-height: 1em; + padding: 0 4px 0 3px; + text-align: center; + text-decoration: none; + background: #19a3d1; + box-shadow: 0 1px 1px #000; + border-radius: 2px; + vertical-align: middle; +} + +.header-panel .notifications-icon:before { + position: absolute; + left: 0; + right: 0; + top: 100%; + margin-top: -5px; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e02c'; /* user icon */ + font-size: 8px; + color: #19a3d1; + text-shadow: 0 1px 1px #000; +} + +.eq-ie8 .header-panel .notifications-icon:before { + bottom: -7px; +} + +.header-panel .notifications .value { + font-size: 10px; + font-weight: bold; + color: #fff; + white-space: nowrap; +} + +.header-panel .notifications.active .dropdown-menu { + display: block; + margin-top: 12px; +} + +.header-panel .notifications > .dropdown-menu strong, +.header-panel .account > .dropdown-menu a, +.header-panel .search .autocomplete-results .title { + display: block; + color: #f58220; + font-family: "CallunaSans"; + font-size: 14px; + font-weight: 500; + margin-bottom: 5px; +} + +.header-panel .notifications > .dropdown-menu > li:hover .action-close { + display: block; +} + +.header-panel .notifications > .dropdown-menu > .new, +.header-panel .notifications > .dropdown-menu > .new:hover { + background: #f47b20; + color: #fff; +} + +.header-panel .notifications > .dropdown-menu > li.new:first-child:before, +.header-panel .notifications > .dropdown-menu > li.new.first:before, +.header-panel .notifications > .dropdown-menu > li.new:first-child:hover:before, +.header-panel .notifications > .dropdown-menu > li.new.first:hover:before { + color: #f47b20; +} + +.header-panel .notifications > .dropdown-menu > .new strong, +.header-panel .notifications > .dropdown-menu > .new div, +.header-panel .notifications > .dropdown-menu > .new a, +.header-panel .notifications > .dropdown-menu > .new time, +.header-panel .notifications > .dropdown-menu .new .action-close:hover, +.header-panel .notifications > .dropdown-menu .new .action-close:focus { + color: #fff; +} + +.header-panel .notifications > .dropdown-menu time { + display: block; + margin-top: 10px; +} + +.header-panel .notifications > .dropdown-menu a:focus ~ .action-close, +.header-panel .notifications > .dropdown-menu .action-close:focus { + display: block; +} + +.header-panel .notifications > .dropdown-menu .action-close { + position: absolute; + display: none; + top: 0; + right: 0; + width: 20px; + height: 15px; + padding-left: 3px; + text-indent: -999em; + overflow: hidden; +} + +.header-panel .notifications > .dropdown-menu .action-close:hover { + color: #f47b20; +} + +.header-panel .notifications > .dropdown-menu .action-close:before { + content: '\00D7\00A0'; + display: block; + text-indent: 0; +} + +.eq-ie8 .header-panel .notifications > .dropdown-menu .action-close:before { + line-height: .666; + padding-left: 2px; +} + +.header .header-panel .notifications .dropdown-menu > li.last { + padding: 0; +} + +.header .header-panel .notifications .action-more { + display: block; + background: #676056; + font-size: 13px; + height: 29px; + width: 100%; + border: 0; + color: #fff; + text-shadow: none; + line-height: 2.2; + border-radius: 0 0 5px 5px; + box-shadow: 0 1px 2px #000; + text-align: center; + margin: 0; +} + +.header .header-panel .notifications .action-more:hover { + text-decoration: none; +} + +.eq-ie8 .header .header-panel .notifications .action-more { + margin-bottom: -1px; +} + +/* + Help +-------------------------------------- */ +.header-panel .help { + float: left; + margin: 0 0 0 30px; + padding: 6px 0 0; +} + +/* + Search +-------------------------------------- */ +.search { + position: relative; + float: left; + margin: -4px 0 -5px 50px; +} + +.search form { + position: relative; +} + +.search input { + position: relative; + display: none; + width: 50px; + height: 36px; + line-height: 2; + margin: 0; + padding: 4px 25px 4px 4px; + background: #fff; +} + +.header .search .ajax-loading:before { + display: block; + content: ''; + position: absolute; + top: 10px; + left: -20px; + margin: 0; + width: 16px; + height: 16px; + line-height: 16px; + background-image: url(../mui/images/ajax-loader-small.gif); +} + +.search .dropdown-menu { + display: block; + right: auto; + margin-right: 0; + width: 100%; +} + +.autocomplete-results { + left: 0 !important; /* TODO: Because of script bug in IE9 */ + right: 0; +} + +.eq-ie8 .autocomplete-results { + margin-top: -10px; +} + +.autocomplete-results .title { + display: block; +} + +.autocomplete-results .type { + margin: 0 0 10px; +} + +.header.active .search { + margin-left: 30px; +} + +.header.active .search input { + display: inline-block; +} + +.no-js .search input { + display: inline-block; + width: 350px; +} + +.search button[type="submit"], +.search button[type="submit"]:hover, +.search button[type="submit"]:active, +.search button[type="submit"]:focus { + position: absolute; + top: 2px; + right: 0; + width: 32px; + height: 32px; + background: none; + border: none; + overflow: hidden; + text-indent: -999em; + color: #676056; + text-shadow: 0 1px 0 #fff; + box-shadow: none; +} + +.search button[type="submit"]:hover, +.header.active .search button[type="submit"], +.header.active .search button[type="submit"]:hover, +.header.active .search button[type="submit"]:active, +.header.active .search button[type="submit"]:focus { + color: #201f1c; +} + +.eq-ie9 .search button[type="submit"] { + top: 4px; +} + +.search button[type="submit"]:before { + position: absolute; + display: block; + top: 0; + right: 0; + bottom: 0; + left: 0; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e01f'; /* user icon */ + text-indent: 0; + font-size: 18px; + line-height: 1.7; + text-align: center; +} + +.eq-ie8 .search button[type="submit"]:before { + line-height: 1.3; +} + +/* + Clearfix +-------------------------------------- */ +.header-panel:before, +.header-panel:after, +.header-inner:before, +.header-inner:after, +.clearfix:before, +.clearfix:after { + content: ""; + display: table; +} + +.header-panel:after, +.header-inner:after, +.clearfix:after { + clear: both; +} \ No newline at end of file diff --git a/app/design/adminhtml/default/backend/css/pages.css b/app/design/adminhtml/default/backend/css/pages.css new file mode 100644 index 0000000000000000000000000000000000000000..97238dc745509c650e9671259cd0d62e07fed337 --- /dev/null +++ b/app/design/adminhtml/default/backend/css/pages.css @@ -0,0 +1,289 @@ +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ + +/* + Sales +-------------------------------------- */ + +.customer-current-activity { + float: left; + width: 20%; +} + +.customer-current-activity-inner, +.order-details-inner { + background: #fff; + border: 1px solid #EAE6E0; + padding: 18px; + border-radius: 5px; +} + +.order-details-existing-customer { + padding: 0 1% 1%; + position: relative; + width: 78%; + float: right; +} + +.order-billing-address, +.order-billing-method, +.order-history { + width: 49%; + float: left; +} + +.order-shipping-address, +.order-shipping-method, +.order-totals { + width: 49%; + float: right; +} + +.create-order-sidebar-container > div { + border-bottom: 1px solid #ccc; +} + +.customer-current-activity .actions { + border-bottom: none; + margin-top: 20px; +} + +/* + Product Creation +-------------------------------------- */ + +/* Action "Back" as cross */ +[class^=" adminhtml-catalog-product-"] .page-actions .action-back, +[class^=" adminhtml-catalog-product-"] .page-actions .action-back:hover, +[class^=" adminhtml-catalog-product-"] .page-actions .action-back:active { + overflow: hidden; + padding: 5px 6px 3px; + margin-left: 12px; + color: #7a7976;; +} + +[class^=" adminhtml-catalog-product-"] .page-actions .action-back:hover { + color: #000; +} + +[class^=" adminhtml-catalog-product-"] .page-actions .action-back.mage-error { + color: #b57c72; +} + +[class^=" adminhtml-catalog-product-"] .page-actions .action-back:before { + display: inline-block; + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; + content: '\e07d'; /* close icon */ + font-size: 16px; +} + +[class^=" adminhtml-catalog-product-"] .page-actions .action-back span { + display: inline-block; + overflow: hidden; + text-indent: -999em; +} + +/* Image Management */ +.images { + position: relative; + border: 2px dotted #CCC; + border-radius: 5px; + padding: 5px; +} + +.image { + position: relative; + width: 120px; + height: 120px; + border: 1px solid #ccc; + border-radius: 4px; + float: left; + margin: 0 10px 10px 0; + overflow: hidden; + background: #fff; +} + +.image > img { + width: 120px; + height: 120px; +} + +.image.base-image:before { + position: absolute; + top: 5px; + left: 0; + right: 0; + padding: 5px 0; + background: #d56d27; + text-align: center; + text-transform: uppercase; + text-shadow: 0 1px 2px #000; + font-size: 9px; + font-weight: bold; + color: #fff; + content: attr(data-image-label); + letter-spacing: 1px; + -moz-transform: rotate(-45deg) translate3d(0, 0, 0); + -webkit-transform: rotate(-45deg) translate3d(0, 0, 0); + transform: rotate(-45deg) translate3d(0, 0, 0); + margin-left: -90px; +} + +.image[data-image-hidden]:after { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + background: rgba(247, 242, 236, .8); + content: attr(data-image-hidden); + text-align: center; + text-transform: uppercase; + color: #a69a8f; + font: 18px/120px 'CallunaSans', Arial, sans-serif; + font-weight: 500; + z-index: 1; +} + +.image .actions { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding-top: 70px; + text-align: center; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.image .actions [class^="action-"], +.image[data-image-hidden]:hover .actions [class^="action-"] { + visibility: hidden; +} + +.image:hover .actions [class^="action-"], +.image[data-image-hidden]:hover .actions .action-delete { + visibility: visible; +} + +.image .action-delete { + position: absolute; + top: 2px; + right: 2px; + z-index: 2; +} + +.image .action-make-main { + margin-bottom: 10px; +} + +.draggable-handle { + position: relative; + display: block; + width: 14px; + height: 8px; + cursor: move; + margin: 0 auto; + background: url(Mage_Backend::images/draggable-handle-bg.gif) no-repeat; + z-index: 2; +} + +.image-placeholder { + background: #fff url('Mage_Adminhtml::images/image-placeholder.png') no-repeat 50% 0%; +} + +.image-placeholder-text { + padding: 72px 5px 0; + font-size: 11px; + font-weight: bold; + line-height: 1.333; + text-align: center; + color: #cac8c4; +} + +/* action in fieldset wrapper */ +.fieldset-wrapper-title .action-add, +.fieldset-wrapper-title .action-add:hover, +.fieldset-wrapper-title .action-add:focus, +.fieldset-wrapper-title .action-add:active, +.fieldset-wrapper-title .action-add:hover { + font-size: 12px; + color: #a29c94; + text-decoration: underline; + margin: 8px 20px 0 0; +} + +.fieldset-wrapper-title .action-add:hover { + color: #000; +} + +.fieldset-wrapper-title .action-add span { +} + +/* Quantity filed on product */ +.field-quantity_and_stock_status { +} + +.field-quantity_and_stock_status input[type="text"] { + width: 36%; + margin-right: 15px; +} + +.field-quantity_and_stock_status select { + vertical-align: middle; +} + +/* Weight field */ +.field-weight { +} + +.field-weight .field:first-child { + width: 36%; + margin-right: 15px; +} + +.field-weight .choice input { + margin-right: 5px; +} + +.images:before, +.images:after, +.clearfix:before, +.clearfix:after { + content: ""; + display: table; +} + +.images:after, +.clearfix:after { + clear: both; +} \ No newline at end of file diff --git a/app/design/adminhtml/default/backend/images/ajax-loader-tr.gif b/app/design/adminhtml/default/backend/images/ajax-loader-tr.gif new file mode 100644 index 0000000000000000000000000000000000000000..efb7ba77049448a34cd45c8509e5c63f8ac5fb5b Binary files /dev/null and b/app/design/adminhtml/default/backend/images/ajax-loader-tr.gif differ diff --git a/app/design/adminhtml/default/backend/images/ajax-loader.gif b/app/design/adminhtml/default/backend/images/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..b525a23bdbb3fecbfac17c7d498decfa5b45f18b Binary files /dev/null and b/app/design/adminhtml/default/backend/images/ajax-loader.gif differ diff --git a/app/design/adminhtml/default/backend/images/cancel_icon.gif b/app/design/adminhtml/default/backend/images/cancel_icon.gif new file mode 100644 index 0000000000000000000000000000000000000000..1fd7cfd6a23b77660711f95400ae18e9495bf9d3 Binary files /dev/null and b/app/design/adminhtml/default/backend/images/cancel_icon.gif differ diff --git a/app/design/adminhtml/default/backend/images/edit_icon.gif b/app/design/adminhtml/default/backend/images/edit_icon.gif new file mode 100644 index 0000000000000000000000000000000000000000..8b277aa621877b1cd10e1dddb8d57244334f60f1 Binary files /dev/null and b/app/design/adminhtml/default/backend/images/edit_icon.gif differ diff --git a/app/design/adminhtml/default/backend/images/fam_bin.gif b/app/design/adminhtml/default/backend/images/fam_bin.gif new file mode 100644 index 0000000000000000000000000000000000000000..3cf0aaf9be82f283fef99812ef18ac6ecb6555e9 Binary files /dev/null and b/app/design/adminhtml/default/backend/images/fam_bin.gif differ diff --git a/app/design/adminhtml/default/backend/images/fam_bullet_disk.gif b/app/design/adminhtml/default/backend/images/fam_bullet_disk.gif new file mode 100644 index 0000000000000000000000000000000000000000..d72c413e8ef9454af8bb2fbf526bc9a8161979db Binary files /dev/null and b/app/design/adminhtml/default/backend/images/fam_bullet_disk.gif differ diff --git a/app/design/adminhtml/default/backend/images/fam_link.gif b/app/design/adminhtml/default/backend/images/fam_link.gif new file mode 100644 index 0000000000000000000000000000000000000000..42467ac442ae26f1401e423e8e033c04b5b65dbe Binary files /dev/null and b/app/design/adminhtml/default/backend/images/fam_link.gif differ diff --git a/app/design/adminhtml/default/backend/images/fam_package_go.gif b/app/design/adminhtml/default/backend/images/fam_package_go.gif new file mode 100644 index 0000000000000000000000000000000000000000..70f05046d8d74b31d50afb52024fdc9d786d930d Binary files /dev/null and b/app/design/adminhtml/default/backend/images/fam_package_go.gif differ diff --git a/app/design/adminhtml/default/backend/images/fam_refresh.gif b/app/design/adminhtml/default/backend/images/fam_refresh.gif new file mode 100644 index 0000000000000000000000000000000000000000..14b878b452a210e9fce59948ae9714c24aa66928 Binary files /dev/null and b/app/design/adminhtml/default/backend/images/fam_refresh.gif differ diff --git a/app/design/adminhtml/default/backend/images/grid-cal.gif b/app/design/adminhtml/default/backend/images/grid-cal.gif new file mode 100644 index 0000000000000000000000000000000000000000..4a4fd50b45862befee0512acbdec747d7fa56a3c Binary files /dev/null and b/app/design/adminhtml/default/backend/images/grid-cal.gif differ diff --git a/app/design/adminhtml/default/backend/images/grid-sorted-th-arrows.png b/app/design/adminhtml/default/backend/images/grid-sorted-th-arrows.png new file mode 100644 index 0000000000000000000000000000000000000000..4d73368ed7079f978887b32163d7352fd73409a3 Binary files /dev/null and b/app/design/adminhtml/default/backend/images/grid-sorted-th-arrows.png differ diff --git a/app/design/adminhtml/default/backend/images/grouped_to_order_icon.png b/app/design/adminhtml/default/backend/images/grouped_to_order_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d7e92ab9935186870f484411e687d8802baae010 Binary files /dev/null and b/app/design/adminhtml/default/backend/images/grouped_to_order_icon.png differ diff --git a/app/design/adminhtml/default/backend/images/ico_success.gif b/app/design/adminhtml/default/backend/images/ico_success.gif new file mode 100644 index 0000000000000000000000000000000000000000..f1bce8e97421cf082c0db06da3c9567fdf34c29f Binary files /dev/null and b/app/design/adminhtml/default/backend/images/ico_success.gif differ diff --git a/app/design/adminhtml/default/backend/images/pager_arrow_left_off.gif b/app/design/adminhtml/default/backend/images/pager_arrow_left_off.gif new file mode 100644 index 0000000000000000000000000000000000000000..e057ce0e30cc45efc60e72ea4c53453e4854de8d Binary files /dev/null and b/app/design/adminhtml/default/backend/images/pager_arrow_left_off.gif differ diff --git a/app/design/adminhtml/default/backend/images/pager_arrow_right_off.gif b/app/design/adminhtml/default/backend/images/pager_arrow_right_off.gif new file mode 100644 index 0000000000000000000000000000000000000000..95f17d5face7d7d8c00a9c56a00b8b1c4857b934 Binary files /dev/null and b/app/design/adminhtml/default/backend/images/pager_arrow_right_off.gif differ diff --git a/app/design/adminhtml/default/backend/images/process_spinner.gif b/app/design/adminhtml/default/backend/images/process_spinner.gif new file mode 100644 index 0000000000000000000000000000000000000000..0ebe4d8430c58416a60a055eaf8ff7ec318ab653 Binary files /dev/null and b/app/design/adminhtml/default/backend/images/process_spinner.gif differ diff --git a/app/design/adminhtml/default/backend/images/rule_chooser_trigger.gif b/app/design/adminhtml/default/backend/images/rule_chooser_trigger.gif new file mode 100644 index 0000000000000000000000000000000000000000..673d31ad5e03cb1627797ec84ff47a23bed086ff Binary files /dev/null and b/app/design/adminhtml/default/backend/images/rule_chooser_trigger.gif differ diff --git a/app/design/adminhtml/default/backend/images/rule_component_add.gif b/app/design/adminhtml/default/backend/images/rule_component_add.gif new file mode 100644 index 0000000000000000000000000000000000000000..4032f76a2027f42b04aa0137bd904673092bf4fe Binary files /dev/null and b/app/design/adminhtml/default/backend/images/rule_component_add.gif differ diff --git a/app/design/adminhtml/default/backend/images/rule_component_apply.gif b/app/design/adminhtml/default/backend/images/rule_component_apply.gif new file mode 100644 index 0000000000000000000000000000000000000000..45c61c3247ae622451c924660b5e0cd19dea1ef8 Binary files /dev/null and b/app/design/adminhtml/default/backend/images/rule_component_apply.gif differ diff --git a/app/design/adminhtml/default/backend/images/rule_component_remove.gif b/app/design/adminhtml/default/backend/images/rule_component_remove.gif new file mode 100644 index 0000000000000000000000000000000000000000..9f2f4edf9ced7be6d4acc662d8730f3612623ffb Binary files /dev/null and b/app/design/adminhtml/default/backend/images/rule_component_remove.gif differ diff --git a/app/design/adminhtml/default/backend/js/antiscroll.js b/app/design/adminhtml/default/backend/js/antiscroll.js new file mode 100644 index 0000000000000000000000000000000000000000..bfbe47fbe5b60b5ba43b0cab782c0a4813faa045 --- /dev/null +++ b/app/design/adminhtml/default/backend/js/antiscroll.js @@ -0,0 +1,463 @@ +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ + +(function ($) { + + /** + * Augment jQuery prototype. + */ + + $.fn.antiscroll = function (options) { + return this.each(function () { + if ($(this).data('antiscroll')) { + $(this).data('antiscroll').destroy(); + } + + $(this).data('antiscroll', new $.Antiscroll(this, options)); + }); + }; + + /** + * Expose constructor. + */ + + $.Antiscroll = Antiscroll; + + /** + * Antiscroll pane constructor. + * + * @param {Element|jQuery} main pane + * @parma {Object} options + * @api public + */ + + function Antiscroll (el, opts) { + this.el = $(el); + this.options = opts || {}; + + this.x = false !== this.options.x; + this.y = false !== this.options.y; + this.padding = undefined == this.options.padding ? 2 : this.options.padding; + + this.inner = this.el.find('.antiscroll-inner'); + /*this.inner.css({ + 'width': '+=' + scrollbarSize() + , 'height': '+=' + scrollbarSize() + });*/ + + this.refresh(); + }; + + /** + * refresh scrollbars + * + * @api public + */ + + Antiscroll.prototype.refresh = function() { + var needHScroll = this.inner.get(0).scrollWidth > this.el.width() + , needVScroll = this.inner.get(0).scrollHeight > this.el.height(); + + if (!this.horizontal && needHScroll && this.x) { + this.horizontal = new Scrollbar.Horizontal(this); + } else if (this.horizontal && !needHScroll) { + this.horizontal.destroy(); + this.horizontal = null + } + + if (!this.vertical && needVScroll && this.y) { + this.vertical = new Scrollbar.Vertical(this); + } else if (this.vertical && !needVScroll) { + this.vertical.destroy(); + this.vertical = null + } + }; + + /** + * Cleans up. + * + * @return {Antiscroll} for chaining + * @api public + */ + + Antiscroll.prototype.destroy = function () { + if (this.horizontal) { + this.horizontal.destroy(); + } + if (this.vertical) { + this.vertical.destroy(); + } + return this; + }; + + /** + * Rebuild Antiscroll. + * + * @return {Antiscroll} for chaining + * @api public + */ + + Antiscroll.prototype.rebuild = function () { + this.destroy(); + this.inner.attr('style', ''); + Antiscroll.call(this, this.el, this.options); + return this; + }; + + /** + * Scrollbar constructor. + * + * @param {Element|jQuery} element + * @api public + */ + + function Scrollbar (pane) { + this.pane = pane; + this.pane.el.append(this.el); + this.innerEl = this.pane.inner.get(0); + + this.dragging = false; + this.enter = false; + this.shown = false; + + // hovering + this.pane.el.mouseenter($.proxy(this, 'mouseenter')); + this.pane.el.mouseleave($.proxy(this, 'mouseleave')); + + // dragging + this.el.mousedown($.proxy(this, 'mousedown')); + + // scrolling + this.pane.inner.scroll($.proxy(this, 'scroll')); + + // wheel -optional- + this.pane.inner.bind('mousewheel', $.proxy(this, 'mousewheel')); + + // show + var initialDisplay = this.pane.options.initialDisplay; + + if (initialDisplay !== false) { + this.show(); + this.hiding = setTimeout($.proxy(this, 'hide'), parseInt(initialDisplay, 10) || 3000); + } + }; + + /** + * Cleans up. + * + * @return {Scrollbar} for chaining + * @api public + */ + + Scrollbar.prototype.destroy = function () { + this.el.remove(); + return this; + }; + + /** + * Called upon mouseenter. + * + * @api private + */ + + Scrollbar.prototype.mouseenter = function () { + this.enter = true; + this.show(); + }; + + /** + * Called upon mouseleave. + * + * @api private + */ + + Scrollbar.prototype.mouseleave = function () { + this.enter = false; + + if (!this.dragging) { + this.hide(); + } + } + + /** + * Called upon wrap scroll. + * + * @api private + */ + + Scrollbar.prototype.scroll = function () { + if (!this.shown) { + this.show(); + if (!this.enter && !this.dragging) { + this.hiding = setTimeout($.proxy(this, 'hide'), 1500); + } + } + + this.update(); + }; + + /** + * Called upon scrollbar mousedown. + * + * @api private + */ + + Scrollbar.prototype.mousedown = function (ev) { + ev.preventDefault(); + + this.dragging = true; + + this.startPageY = ev.pageY - parseInt(this.el.css('top'), 10); + this.startPageX = ev.pageX - parseInt(this.el.css('left'), 10); + + // prevent crazy selections on IE + document.onselectstart = function () { return false; }; + + var pane = this.pane + , move = $.proxy(this, 'mousemove') + , self = this + + $(document) + .mousemove(move) + .mouseup(function () { + self.dragging = false; + document.onselectstart = null; + + $(document).unbind('mousemove', move); + + if (!self.enter) { + self.hide(); + } + }) + }; + + /** + * Show scrollbar. + * + * @api private + */ + + Scrollbar.prototype.show = function (duration) { + if (!this.shown) { + this.update(); + this.el.addClass('antiscroll-scrollbar-shown'); + if (this.hiding) { + clearTimeout(this.hiding); + this.hiding = null; + } + this.shown = true; + } + }; + + /** + * Hide scrollbar. + * + * @api private + */ + + Scrollbar.prototype.hide = function () { + var autoHide = this.pane.options.autoHide; + if (autoHide !== false && this.shown) { + // check for dragging + this.el.removeClass('antiscroll-scrollbar-shown'); + this.shown = false; + } + }; + + /** + * Horizontal scrollbar constructor + * + * @api private + */ + + Scrollbar.Horizontal = function (pane) { + this.el = $('<div class="antiscroll-scrollbar antiscroll-scrollbar-horizontal">'); + Scrollbar.call(this, pane); + } + + /** + * Inherits from Scrollbar. + */ + + inherits(Scrollbar.Horizontal, Scrollbar); + + /** + * Updates size/position of scrollbar. + * + * @api private + */ + + Scrollbar.Horizontal.prototype.update = function () { + var paneWidth = this.pane.el.width() + , trackWidth = paneWidth - this.pane.padding * 2 + , innerEl = this.pane.inner.get(0) + + this.el + .css('width', trackWidth * paneWidth / innerEl.scrollWidth) + .css('left', trackWidth * innerEl.scrollLeft / innerEl.scrollWidth) + } + + /** + * Called upon drag. + * + * @api private + */ + + Scrollbar.Horizontal.prototype.mousemove = function (ev) { + var trackWidth = this.pane.el.width() - this.pane.padding * 2 + , pos = ev.pageX - this.startPageX + , barWidth = this.el.width() + , innerEl = this.pane.inner.get(0) + + // minimum top is 0, maximum is the track height + var y = Math.min(Math.max(pos, 0), trackWidth - barWidth) + + innerEl.scrollLeft = (innerEl.scrollWidth - this.pane.el.width()) + * y / (trackWidth - barWidth) + }; + + /** + * Called upon container mousewheel. + * + * @api private + */ + + Scrollbar.Horizontal.prototype.mousewheel = function (ev, delta, x, y) { + if ((x < 0 && 0 == this.pane.inner.get(0).scrollLeft) || + (x > 0 && (this.innerEl.scrollLeft + Math.ceil(this.pane.el.width()) + == this.innerEl.scrollWidth))) { + ev.preventDefault(); + return false; + } + }; + + /** + * Vertical scrollbar constructor + * + * @api private + */ + + Scrollbar.Vertical = function (pane) { + this.el = $('<div class="antiscroll-scrollbar antiscroll-scrollbar-vertical">'); + Scrollbar.call(this, pane); + }; + + /** + * Inherits from Scrollbar. + */ + + inherits(Scrollbar.Vertical, Scrollbar); + + /** + * Updates size/position of scrollbar. + * + * @api private + */ + + Scrollbar.Vertical.prototype.update = function () { + var paneHeight = this.pane.el.height() + , trackHeight = paneHeight - this.pane.padding * 2 + , innerEl = this.innerEl + + this.el + .css('height', trackHeight * paneHeight / innerEl.scrollHeight) + .css('top', trackHeight * innerEl.scrollTop / innerEl.scrollHeight) + }; + + /** + * Called upon drag. + * + * @api private + */ + + Scrollbar.Vertical.prototype.mousemove = function (ev) { + var paneHeight = this.pane.el.height() + , trackHeight = paneHeight - this.pane.padding * 2 + , pos = ev.pageY - this.startPageY + , barHeight = this.el.height() + , innerEl = this.innerEl + + // minimum top is 0, maximum is the track height + var y = Math.min(Math.max(pos, 0), trackHeight - barHeight) + + innerEl.scrollTop = (innerEl.scrollHeight - paneHeight) + * y / (trackHeight - barHeight) + }; + + /** + * Called upon container mousewheel. + * + * @api private + */ + + Scrollbar.Vertical.prototype.mousewheel = function (ev, delta, x, y) { + if ((y > 0 && 0 == this.innerEl.scrollTop) || + (y < 0 && (this.innerEl.scrollTop + Math.ceil(this.pane.el.height()) + == this.innerEl.scrollHeight))) { + ev.preventDefault(); + return false; + } + }; + + /** + * Cross-browser inheritance. + * + * @param {Function} constructor + * @param {Function} constructor we inherit from + * @api private + */ + + function inherits (ctorA, ctorB) { + function f() {}; + f.prototype = ctorB.prototype; + ctorA.prototype = new f; + }; + + /** + * Scrollbar size detection. + */ + + var size; + + function scrollbarSize () { + if (size === undefined) { + var div = $( + '<div style="width:50px;height:50px;overflow:hidden;' + + 'position:absolute;top:-200px;left:-200px;"><div style="height:100px;">' + + '</div>' + ); + + $('body').append(div); + + var w1 = $('div', div).innerWidth(); + div.css('overflow-y', 'scroll'); + var w2 = $('div', div).innerWidth(); + $(div).remove(); + + size = w1 - w2; + } + + return size; + }; + +})(jQuery); diff --git a/app/design/adminhtml/default/backend/js/head.js b/app/design/adminhtml/default/backend/js/head.js new file mode 100644 index 0000000000000000000000000000000000000000..ba5d3d10a6d368883410a13bae0936db83b4e8c2 --- /dev/null +++ b/app/design/adminhtml/default/backend/js/head.js @@ -0,0 +1,356 @@ +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ + +(function (a, w) { + function f(a) { + p[p.length] = a + } + + function m(a) { + q.className = q.className.replace(RegExp("\\b" + a + "\\b"), "") + } + + function k(a, d) { + for (var b = 0, c = a.length; b < c; b++)d.call(a, a[b], b) + } + + function s() { + q.className = q.className.replace(/ (w-|eq-|gt-|gte-|lt-|lte-|portrait|no-portrait|landscape|no-landscape)\d+/g, ""); + var b = a.innerWidth || q.clientWidth, d = a.outerWidth || a.screen.width; + h.screen.innerWidth = b; + h.screen.outerWidth = d; + f("w-" + b); + k(c.screens, function (a) { + b > a ? (c.screensCss.gt && f("gt-" + a), c.screensCss.gte && f("gte-" + + a)) : b < a ? (c.screensCss.lt && f("lt-" + a), c.screensCss.lte && f("lte-" + a)) : b === a && (c.screensCss.lte && f("lte-" + a), c.screensCss.eq && f("e-q" + a), c.screensCss.gte && f("gte-" + a)) + }); + var d = a.innerHeight || q.clientHeight, g = a.outerHeight || a.screen.height; + h.screen.innerHeight = d; + h.screen.outerHeight = g; + h.feature("portrait", d > b); + h.feature("landscape", d < b) + } + + function r() { + a.clearTimeout(u); + u = a.setTimeout(s, 100) + } + + var n = a.document, g = a.navigator, t = a.location, q = n.documentElement, p = [], c = {screens:[240, 320, 480, 640, 768, 800, 1024, 1280, + 1440, 1680, 1920], screensCss:{gt:!0, gte:!1, lt:!0, lte:!1, eq:!1}, browsers:[ + {ie:{min:6, max:10}} + ], browserCss:{gt:!0, gte:!1, lt:!0, lte:!1, eq:!0}, section:"-section", page:"-page", head:"head"}; + if (a.head_conf)for (var b in a.head_conf)a.head_conf[b] !== w && (c[b] = a.head_conf[b]); + var h = a[c.head] = function () { + h.ready.apply(null, arguments) + }; + h.feature = function (a, b, c) { + if (!a)return q.className += " " + p.join(" "), p = [], h; + "[object Function]" === Object.prototype.toString.call(b) && (b = b.call()); + f((b ? "" : "no-") + a); + h[a] = !!b; + c || (m("no-" + + a), m(a), h.feature()); + return h + }; + h.feature("js", !0); + b = g.userAgent.toLowerCase(); + g = /mobile|midp/.test(b); + h.feature("mobile", g, !0); + h.feature("desktop", !g, !0); + b = /(chrome|firefox)[ \/]([\w.]+)/.exec(b) || /(iphone|ipad|ipod)(?:.*version)?[ \/]([\w.]+)/.exec(b) || /(android)(?:.*version)?[ \/]([\w.]+)/.exec(b) || /(webkit|opera)(?:.*version)?[ \/]([\w.]+)/.exec(b) || /(msie) ([\w.]+)/.exec(b) || []; + g = b[1]; + b = parseFloat(b[2]); + switch (g) { + case "msie": + g = "ie"; + b = n.documentMode || b; + break; + case "firefox": + g = "ff"; + break; + case "ipod": + case "ipad": + case "iphone": + g = + "ios"; + break; + case "webkit": + g = "safari" + } + h.browser = {name:g, version:b}; + h.browser[g] = !0; + for (var v = 0, x = c.browsers.length; v < x; v++)for (var i in c.browsers[v])if (g === i) { + f(i); + for (var A = c.browsers[v][i].max, l = c.browsers[v][i].min; l <= A; l++)b > l ? (c.browserCss.gt && f("gt-" + i + l), c.browserCss.gte && f("gte-" + i + l)) : b < l ? (c.browserCss.lt && f("lt-" + i + l), c.browserCss.lte && f("lte-" + i + l)) : b === l && (c.browserCss.lte && f("lte-" + i + l), c.browserCss.eq && f("eq-" + i + l), c.browserCss.gte && f("gte-" + i + l)) + } else f("no-" + i); + "ie" === g && 9 > b && k("abbr article aside audio canvas details figcaption figure footer header hgroup mark meter nav output progress section summary time video".split(" "), + function (a) { + n.createElement(a) + }); + k(t.pathname.split("/"), function (a, b) { + if (2 < this.length && this[b + 1] !== w)b && f(this.slice(1, b + 1).join("-").toLowerCase() + c.section); else { + var g = a || "index", h = g.indexOf("."); + 0 < h && (g = g.substring(0, h)); + q.id = g.toLowerCase() + c.page; + b || f("root" + c.section) + } + }); + h.screen = {height:a.screen.height, width:a.screen.width}; + s(); + var u = 0; + a.addEventListener ? a.addEventListener("resize", r, !1) : a.attachEvent("onresize", r) +})(window); +(function (a, w) { + function f(a) { + var f = a.charAt(0).toUpperCase() + a.substr(1), a = (a + " " + r.join(f + " ") + f).split(" "), c; + a:{ + for (c in a)if (k[a[c]] !== w) { + c = !0; + break a + } + c = !1 + } + return!!c + } + + var m = a.document.createElement("i"), k = m.style, s = " -o- -moz- -ms- -webkit- -khtml- ".split(" "), r = ["Webkit", "Moz", "O", "ms", "Khtml"], n = a[a.head_conf && a.head_conf.head || "head"], g = {gradient:function () { + k.cssText = ("background-image:" + s.join("gradient(linear,left top,right bottom,from(#9f9),to(#fff));background-image:") + s.join("linear-gradient(left top,#eee,#fff);background-image:")).slice(0, + -17); + return!!k.backgroundImage + }, rgba:function () { + k.cssText = "background-color:rgba(0,0,0,0.5)"; + return!!k.backgroundColor + }, opacity:function () { + return"" === m.style.opacity + }, textshadow:function () { + return"" === k.textShadow + }, multiplebgs:function () { + k.cssText = "background:url(//:),url(//:),red url(//:)"; + return/(url\s*\(.*?){3}/.test(k.background) + }, boxshadow:function () { + return f("boxShadow") + }, borderimage:function () { + return f("borderImage") + }, borderradius:function () { + return f("borderRadius") + }, cssreflections:function () { + return f("boxReflect") + }, + csstransforms:function () { + return f("transform") + }, csstransitions:function () { + return f("transition") + }, touch:function () { + return"ontouchstart"in a + }, retina:function () { + return 1 < a.devicePixelRatio + }, fontface:function () { + var a = n.browser.version; + switch (n.browser.name) { + case "ie": + return 9 <= a; + case "chrome": + return 13 <= a; + case "ff": + return 6 <= a; + case "ios": + return 5 <= a; + case "android": + return!1; + case "webkit": + return 5.1 <= a; + case "opera": + return 10 <= a; + default: + return!1 + } + }}, t; + for (t in g)g[t] && n.feature(t, g[t].call(), !0); + n.feature() +})(window); +(function (a, w) { + function f() { + } + + function m(j, a) { + if (j) { + "object" === typeof j && (j = [].slice.call(j)); + for (var b = 0, c = j.length; b < c; b++)a.call(j, j[b], b) + } + } + + function k(a, b) { + var e = Object.prototype.toString.call(b).slice(8, -1); + return b !== w && null !== b && e === a + } + + function s(a) { + return k("Function", a) + } + + function r(a) { + a = a || f; + a._done || (a(), a._done = 1) + } + + function n(a) { + var b = {}; + if ("object" === typeof a)for (var e in a)a[e] && (b = {name:e, url:a[e]}); else b = a.split("/"), b = b[b.length - 1], e = b.indexOf("?"), b = {name:-1 !== e ? b.substring(0, e) : b, url:a}; + return(a = i[b.name]) && a.url === b.url ? a : i[b.name] = b + } + + function g(a) { + var a = a || i, b; + for (b in a)if (a.hasOwnProperty(b) && a[b].state !== y)return!1; + return!0 + } + + function t(a, b) { + b = b || f; + a.state === y ? b() : a.state === D ? d.ready(a.name, b) : a.state === C ? a.onpreload.push(function () { + t(a, b) + }) : (a.state = D, q(a, function () { + a.state = y; + b(); + m(x[a.name], function (a) { + r(a) + }); + u && g() && m(x.ALL, function (a) { + r(a) + }) + })) + } + + function q(j, c) { + var c = c || f, e; + /\.css[^\.]*$/.test(j.url) ? (e = b.createElement("link"), e.type = "text/" + (j.type || "css"), e.rel = "stylesheet", + e.href = j.url) : (e = b.createElement("script"), e.type = "text/" + (j.type || "javascript"), e.src = j.url); + e.onload = e.onreadystatechange = function (j) { + j = j || a.event; + if ("load" === j.type || /loaded|complete/.test(e.readyState) && (!b.documentMode || 9 > b.documentMode))e.onload = e.onreadystatechange = e.onerror = null, c() + }; + e.onerror = function () { + e.onload = e.onreadystatechange = e.onerror = null; + c() + }; + e.async = !1; + e.defer = !1; + var d = b.head || b.getElementsByTagName("head")[0]; + d.insertBefore(e, d.lastChild) + } + + function p() { + b.body ? u || (u = !0, m(h, function (a) { + r(a) + })) : + (a.clearTimeout(d.readyTimeout), d.readyTimeout = a.setTimeout(p, 50)) + } + + function c() { + b.addEventListener ? (b.removeEventListener("DOMContentLoaded", c, !1), p()) : "complete" === b.readyState && (b.detachEvent("onreadystatechange", c), p()) + } + + var b = a.document, h = [], v = [], x = {}, i = {}, A = "async"in b.createElement("script") || "MozAppearance"in b.documentElement.style || a.opera, l, u, B = a.head_conf && a.head_conf.head || "head", d = a[B] = a[B] || function () { + d.ready.apply(null, arguments) + }, C = 1, D = 3, y = 4; + d.load = A ? function () { + var a = arguments, b = a[a.length - + 1], e = {}; + s(b) || (b = null); + m(a, function (c, d) { + c !== b && (c = n(c), e[c.name] = c, t(c, b && d === a.length - 2 ? function () { + g(e) && r(b) + } : null)) + }); + return d + } : function () { + var a = arguments, b = [].slice.call(a, 1), c = b[0]; + if (!l)return v.push(function () { + d.load.apply(null, a) + }), d; + c ? (m(b, function (a) { + if (!s(a)) { + var b = n(a); + b.state === w && (b.state = C, b.onpreload = [], q({url:b.url, type:"cache"}, function () { + b.state = 2; + m(b.onpreload, function (a) { + a.call() + }) + })) + } + }), t(n(a[0]), s(c) ? c : function () { + d.load.apply(null, b) + })) : t(n(a[0])); + return d + }; + d.js = d.load; + d.test = + function (a, b, c, g) { + a = "object" === typeof a ? a : {test:a, success:b ? k("Array", b) ? b : [b] : !1, failure:c ? k("Array", c) ? c : [c] : !1, callback:g || f}; + (b = !!a.test) && a.success ? (a.success.push(a.callback), d.load.apply(null, a.success)) : !b && a.failure ? (a.failure.push(a.callback), d.load.apply(null, a.failure)) : g(); + return d + }; + d.ready = function (a, c) { + if (a === b)return u ? r(c) : h.push(c), d; + s(a) && (c = a, a = "ALL"); + if ("string" !== typeof a || !s(c))return d; + var e = i[a]; + if (e && e.state === y || "ALL" === a && g() && u)return r(c), d; + (e = x[a]) ? e.push(c) : x[a] = [c]; + return d + }; + d.ready(b, function () { + g() && m(x.ALL, function (a) { + r(a) + }); + d.feature && d.feature("domloaded", !0) + }); + if ("complete" === b.readyState)p(); else if (b.addEventListener)b.addEventListener("DOMContentLoaded", c, !1), a.addEventListener("load", p, !1); else { + b.attachEvent("onreadystatechange", c); + a.attachEvent("onload", p); + var z = !1; + try { + z = null == a.frameElement && b.documentElement + } catch (F) { + } + z && z.doScroll && function E() { + if (!u) { + try { + z.doScroll("left") + } catch (b) { + a.clearTimeout(d.readyTimeout); + d.readyTimeout = a.setTimeout(E, 50); + return + } + p() + } + }() + } + setTimeout(function () { + l = !0; + m(v, function (a) { + a() + }) + }, 300) +})(window); diff --git a/app/design/adminhtml/default/backend/js/jquery.details.js b/app/design/adminhtml/default/backend/js/jquery.details.js new file mode 100644 index 0000000000000000000000000000000000000000..c183eb37fab1ed88957a7de32a03186ff6bdd0bd --- /dev/null +++ b/app/design/adminhtml/default/backend/js/jquery.details.js @@ -0,0 +1,170 @@ +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ + +/*! http://mths.be/details v0.0.6 by @mathias | includes http://mths.be/noselect v1.0.3 */ +Modernizr.addTest('details', function() { + var doc = document, + el = doc.createElement('details'), + fake, + root, + diff; + if (!('open' in el)) { // return early if possible; thanks @aFarkas! + return false; + } + root = doc.body || (function() { + var de = doc.documentElement; + fake = true; + return de.insertBefore(doc.createElement('body'), de.firstElementChild || de.firstChild); + }()); + el.innerHTML = '<summary>a</summary>b'; + el.style.display = 'block'; + root.appendChild(el); + diff = el.offsetHeight; + el.open = true; + diff = diff != el.offsetHeight; + root.removeChild(el); + fake && root.parentNode.removeChild(root); + return diff; +}); +;(function(document, $) { + var proto = $.fn, + details, + // :'( + isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]', + // Feature test for native `<details>` support + isDetailsSupported = $('html').hasClass('details'), + toggleOpen = function($details, $detailsSummary, $detailsNotSummary, toggle) { + var isOpen = typeof $details.attr('open') == 'string', + close = isOpen && toggle || !isOpen && !toggle; + if (close) { + $details.removeClass('open').prop('open', false).triggerHandler('close.details'); + $detailsSummary.attr('aria-expanded', false); + $detailsNotSummary.hide(); + } else { + $details.addClass('open').prop('open', true).triggerHandler('open.details'); + $detailsSummary.attr('aria-expanded', true); + $detailsNotSummary.show(); + } + }; + + /* http://mths.be/noselect v1.0.3 */ + proto.noSelect = function() { + + // Since the string 'none' is used three times, storing it in a variable gives better results after minification + var none = 'none'; + + // onselectstart and ondragstart for WebKit & IE + // onmousedown for WebKit & Opera + return this.bind('selectstart dragstart mousedown', function() { + return false; + }).css({ + 'MozUserSelect': none, + 'msUserSelect': none, + 'webkitUserSelect': none, + 'userSelect': none + }); + + }; + + // Execute the fallback only if there’s no native `details` support + if (isDetailsSupported) { + details = proto.details = function() { + + return this.each(function() { + var $details = $(this), + $summary = $('summary', $details).first(); + $summary.attr({ + 'role': 'button', + 'aria-expanded': $details.prop('open') + }).on('click.xxx', function() { + // the value of the `open` property is the old value + var close = $details.prop('open'); + $summary.attr('aria-expanded', !close); + $details.triggerHandler((close ? 'close' : 'open') + '.details'); + }); + }); + + }; + + details.support = isDetailsSupported; + + } else { + details = proto.details = function() { + + // Loop through all `details` elements + return this.each(function() { + + // Store a reference to the current `details` element in a variable + var $details = $(this), + // Store a reference to the `summary` element of the current `details` element (if any) in a variable + $detailsSummary = $('summary', $details).first(), + // Do the same for the info within the `details` element + $detailsNotSummary = $details.children(':not(summary)'), + // This will be used later to look for direct child text nodes + $detailsNotSummaryContents = $details.contents(':not(summary)'); + + // If there is no `summary` in the current `details` element… + if (!$detailsSummary.length) { + // …create one with default text + $detailsSummary = $('<summary>').text('Details').prependTo($details); + } + + // Look for direct child text nodes + if ($detailsNotSummary.length != $detailsNotSummaryContents.length) { + // Wrap child text nodes in a `span` element + $detailsNotSummaryContents.filter(function() { + // Only keep the node in the collection if it’s a text node containing more than only whitespace + // http://www.whatwg.org/specs/web-apps/current-work/multipage/common-microsyntaxes.html#space-character + return this.nodeType == 3 && /[^ \t\n\f\r]/.test(this.data); + }).wrap('<span>'); + // There are now no direct child text nodes anymore — they’re wrapped in `span` elements + $detailsNotSummary = $details.children(':not(summary)'); + } + + // Hide content unless there’s an `open` attribute + toggleOpen($details, $detailsSummary, $detailsNotSummary); + + // Add `role=button` and set the `tabindex` of the `summary` element to `0` to make it keyboard accessible + $detailsSummary.attr('role', 'button').noSelect().prop('tabIndex', 0).off('click').on('click.details', function() { + // Focus on the `summary` element + $detailsSummary.focus(); + // Toggle the `open` and `aria-expanded` attributes and the `open` property of the `details` element and display the additional info + toggleOpen($details, $detailsSummary, $detailsNotSummary, true); + }).keyup(function(event) { + if (32 == event.keyCode || (13 == event.keyCode && !isOpera)) { + // Space or Enter is pressed — trigger the `click` event on the `summary` element + // Opera already seems to trigger the `click` event when Enter is pressed + event.preventDefault(); + $detailsSummary.click(); + } + }); + + }); + + }; + + details.support = isDetailsSupported; + + } + +}(document, jQuery)); \ No newline at end of file diff --git a/app/design/adminhtml/default/backend/js/jquery.details.min.js b/app/design/adminhtml/default/backend/js/jquery.details.min.js new file mode 100644 index 0000000000000000000000000000000000000000..c3175ab0592faf125d1f9dd3638bea7fb66b7d3b --- /dev/null +++ b/app/design/adminhtml/default/backend/js/jquery.details.min.js @@ -0,0 +1,25 @@ +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ + +/*! http://mths.be/details v0.0.6 by @mathias | includes http://mths.be/noselect v1.0.3 */ +;(function(a,$){var e=$.fn,d,c=Object.prototype.toString.call(window.opera)=='[object Opera]',f=(function(k){var i=k.createElement('details'),h,g,j;if(!('open' in i)){return false}g=k.body||(function(){var l=k.documentElement;h=true;return l.insertBefore(k.createElement('body'),l.firstElementChild||l.firstChild)}());i.innerHTML='<summary>a</summary>b';i.style.display='block';g.appendChild(i);j=i.offsetHeight;i.open=true;j=j!=i.offsetHeight;g.removeChild(i);if(h){g.parentNode.removeChild(g)}return j}(a)),b=function(h,k,j,g){var i=typeof h.attr('open')=='string',l=i&&g||!i&&!g;if(l){h.removeClass('open').prop('open',false).triggerHandler('close.details');k.attr('aria-expanded',false);j.hide()}else{h.addClass('open').prop('open',true).triggerHandler('open.details');k.attr('aria-expanded',true);j.show()}};e.noSelect=function(){var g='none';return this.bind('selectstart dragstart mousedown',function(){return false}).css({MozUserSelect:g,msUserSelect:g,webkitUserSelect:g,userSelect:g})};if(f){d=e.details=function(){return this.each(function(){var h=$(this),g=$('summary',h).first();g.attr({role:'button','aria-expanded':h.prop('open')}).on('click',function(){var i=h.prop('open');g.attr('aria-expanded',!i);h.triggerHandler((i?'close':'open')+'.details')})})};d.support=f}else{d=e.details=function(){return this.each(function(){var g=$(this),i=$('summary',g).first(),h=g.children(':not(summary)'),j=g.contents(':not(summary)');if(!i.length){i=$('<summary>').text('Details').prependTo(g)}if(h.length!=j.length){j.filter(function(){return this.nodeType==3&&/[^ \t\n\f\r]/.test(this.data)}).wrap('<span>');h=g.children(':not(summary)')}b(g,i,h);i.attr('role','button').noSelect().prop('tabIndex',0).on('click',function(){i.focus();b(g,i,h,true)}).keyup(function(k){if(32==k.keyCode||(13==k.keyCode&&!c)){k.preventDefault();i.click()}})})};d.support=f}}(document,jQuery)); \ No newline at end of file diff --git a/app/design/adminhtml/default/backend/js/jquery.mousewheel.js b/app/design/adminhtml/default/backend/js/jquery.mousewheel.js new file mode 100644 index 0000000000000000000000000000000000000000..4aa86a7e7d685dc93d7556b5191f1c6711165315 --- /dev/null +++ b/app/design/adminhtml/default/backend/js/jquery.mousewheel.js @@ -0,0 +1,107 @@ +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ + +/*! Copyright (c) 2011 Brandon Aaron (http://brandonaaron.net) + * Licensed under the MIT License (LICENSE.txt). + * + * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers. + * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix. + * Thanks to: Seamus Leahy for adding deltaX and deltaY + * + * Version: 3.0.6 + * + * Requires: 1.2.2+ + */ + +(function($) { + +var types = ['DOMMouseScroll', 'mousewheel']; + +if ($.event.fixHooks) { + for ( var i=types.length; i; ) { + $.event.fixHooks[ types[--i] ] = $.event.mouseHooks; + } +} + +$.event.special.mousewheel = { + setup: function() { + if ( this.addEventListener ) { + for ( var i=types.length; i; ) { + this.addEventListener( types[--i], handler, false ); + } + } else { + this.onmousewheel = handler; + } + }, + + teardown: function() { + if ( this.removeEventListener ) { + for ( var i=types.length; i; ) { + this.removeEventListener( types[--i], handler, false ); + } + } else { + this.onmousewheel = null; + } + } +}; + +$.fn.extend({ + mousewheel: function(fn) { + return fn ? this.bind("mousewheel", fn) : this.trigger("mousewheel"); + }, + + unmousewheel: function(fn) { + return this.unbind("mousewheel", fn); + } +}); + + +function handler(event) { + var orgEvent = event || window.event, args = [].slice.call( arguments, 1 ), delta = 0, returnValue = true, deltaX = 0, deltaY = 0; + event = $.event.fix(orgEvent); + event.type = "mousewheel"; + + // Old school scrollwheel delta + if ( orgEvent.wheelDelta ) { delta = orgEvent.wheelDelta/120; } + if ( orgEvent.detail ) { delta = -orgEvent.detail/3; } + + // New school multidimensional scroll (touchpads) deltas + deltaY = delta; + + // Gecko + if ( orgEvent.axis !== undefined && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) { + deltaY = 0; + deltaX = -1*delta; + } + + // Webkit + if ( orgEvent.wheelDeltaY !== undefined ) { deltaY = orgEvent.wheelDeltaY/120; } + if ( orgEvent.wheelDeltaX !== undefined ) { deltaX = -1*orgEvent.wheelDeltaX/120; } + + // Add event and delta to the front of the arguments + args.unshift(event, delta, deltaX, deltaY); + + return ($.event.dispatch || $.event.handle).apply(this, args); +} + +})(jQuery); diff --git a/app/design/adminhtml/default/backend/js/theme.js b/app/design/adminhtml/default/backend/js/theme.js new file mode 100644 index 0000000000000000000000000000000000000000..29dc3561ed14b094005d898d38075c1587f55649 --- /dev/null +++ b/app/design/adminhtml/default/backend/js/theme.js @@ -0,0 +1,299 @@ +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ + +; +(function($) { + 'use strict'; + + $.widget('mage.globalSearch', { + options: { + header: '.header', + headerActiveClass: 'active', + form: '#form-search', + input: 'input', + inputDefaultWidth: 50, + inputOpenedWidth: 350, + submitButton: 'button[type="submit"]', + timeoutId: null, + actionSpeed: 500 + }, + + _create: function() { + this.header = $(this.options.header); + this.form = $(this.options.form); + this.input = $(this.options.input, this.form); + this.submitButton = $(this.options.submitButton, this.form); + + this._events(); + }, + + _events: function() { + var self = this; + + this.form + .on('submit.submitGlobalSearchRequest', function() { + if (!self.input.val()) { + self.header.addClass(self.options.headerActiveClass); + self.input + .animate({ + width: self.options.inputOpenedWidth + }, self.options.actionSpeed) + .focus(); + } else { + this.submit(); + } + + return false; + }); + + this.input + .on('blur.resetGlobalSearchForm', function() { + if (!self.input.val()) { + self.timeoutId && clearTimeout(self.timeoutId); + self.timeoutId = setTimeout(function() { + self.input + .animate({ + width: self.options.inputDefaultWidth + }, 200, function() { + var callbackTimeout = setTimeout(function() { + self.header.removeClass(self.options.headerActiveClass); + }, self.options.actionSpeed); + }); + }, self.options.actionSpeed); + } + }); + + this.submitButton + .on('click.activateGlobalSearch', function() { + self.timeoutId && clearTimeout(self.timeoutId); + }); + } + }); + + $.widget('mage.globalNavigation', { + options: { + menuCategory: '.level-0.parent', + menuLinks: 'a' + }, + + _create: function() { + this.menu = this.element; + this.menuCategory = $(this.options.menuCategory, this.menu); + this.menuLinks = $(this.options.menuLinks, this.menuCategory); + + this._events(); + }, + + _events: function() { + var self = this; + + var config = { + interval: 100, + over: self._hoverEffects, // function = onMouseOver callback (REQUIRED) + timeout: 700, // number = milliseconds delay before onMouseOut + out: self._leaveEffects // function = onMouseOut callback (REQUIRED) + }; + + this.menuCategory + .hoverIntent(config) + .on('hover', function() { + $(this) + .addClass('recent') + .siblings('.level-0') + .removeClass('recent'); +/* $(this) + .siblings('.level-0') + .removeClass('hover') + .find('> .submenu') + .hide();*/ + }); + + this.menuLinks + .on('focus.tabFocus', function() { + $(this).closest('.level-0.parent') + .trigger('mouseenter'); + }) + .on('blur.tabFocus', function() { + $(this).closest('.level-0.parent') + .trigger('mouseleave'); + }); + }, + + _hoverEffects: function () { + var availableWidth = parseInt($(this).parent().css('width')) - $(this).position().left, + submenu = $('> .submenu', this), + colsWidth = 0; + + $(this) + .addClass('hover') +/* .siblings('.level-0.parent') + .find('> .submenu').hide()*/ + ; + + submenu.show(); + + $.each($('> .submenu > ul li.column', this), function() { + colsWidth = colsWidth + parseInt($(this).css('width')); + }); + + var containerPaddings = parseInt(submenu.css('padding-left')) + parseInt(submenu.css('padding-right')); + + $(this).toggleClass('reverse', (containerPaddings + colsWidth) > availableWidth); + + submenu + .hide() + .slideDown('fast'); + }, + + _leaveEffects: function () { + var self = $(this); + + $('> .submenu', this) + .slideUp('fast', function() { + self.removeClass('hover'); + }); + } + }); + + $.widget('mage.modalPopup', { + options: { + popup: '.popup', + btnClose: '[data-dismiss="popup"]' + }, + + _create: function() { + this.fade = this.element; + this.popup = $(this.options.popup, this.fade); + this.btnClose = $(this.options.btnClose, this.popup); + + this._events(); + }, + + _events: function() { + var self = this; + + this.btnClose + .on('click.closeModalPopup', function() { + self.fade.remove(); + }); + } + }); + + $.widget('mage.loadingPopup', { + options: { + message: 'Please wait...', + timeout: 5000, + timeoutId: null, + callback: null, + template: null + }, + + _create: function() { + this.template = + '<div class="popup popup-loading">' + + '<div class="popup-inner">' + this.options.message + '</div>' + + '</div>'; + + this.popup = $(this.template); + + this._show(); + this._events(); + }, + + _events: function() { + var self = this; + + this.element + .on('showLoadingPopup', function() { + self._show(); + }) + .on('hideLoadingPopup', function() { + self._hide(); + }); + }, + + _show: function() { + var self = this; + + this.element.append(this.popup); + + if (this.options.timeout) { + this.options.timeoutId = setTimeout(function() { + self._hide(); + + self.options.callback && self.options.callback(); + + self.options.timeoutId && clearTimeout(self.options.timeoutId); + }, self.options.timeout); + } + }, + + _hide: function() { + this.popup.remove(); + this.destroy(); + } + }); + + $(document).ready(function() { + $('.header-panel .search').globalSearch(); + $('.navigation').globalNavigation(); + $('.fade').modalPopup(); + $('details').details(); + + /* Listen events on "Collapsable" events */ + $('.collapse') + .on('show', function () { + var fieldsetWrapper = $(this).closest('.fieldset-wrapper'); + + fieldsetWrapper.addClass('opened'); + }) + .on('hide', function () { + var fieldsetWrapper = $(this).closest('.fieldset-wrapper'); + + fieldsetWrapper.removeClass('opened'); + }); + + $.each($('.entry-edit'), function(i, entry) { + $('.collapse:first', entry).collapse('show'); + }); + + + /* Switcher for IE8 */ + if ($.browser.msie && $.browser.version == '8.0') { + var checkboxSwitcher = $('.switcher input'); + + var toggleCheckboxState = function(elem) { + elem.toggleClass('checked', elem.prop('checked')); + }; + toggleCheckboxState(checkboxSwitcher); + + $('.switcher') + .on('change.toggleSwitcher', function() { + toggleCheckboxState(checkboxSwitcher); + }); + } + + $('.page-actions').floatingHeader(); + + }); +})(window.jQuery); \ No newline at end of file diff --git a/app/design/adminhtml/default/backend/local.xml b/app/design/adminhtml/default/backend/local.xml new file mode 100644 index 0000000000000000000000000000000000000000..7e39e80d11c13024a0552ea6d503d9ba7cf8f14f --- /dev/null +++ b/app/design/adminhtml/default/backend/local.xml @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category design + * @package default_default + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ +--> +<layout version="0.1.0"> + <default> + <reference name="head"> + <action method="addCss"><file>mui/reset.css</file></action> + <action method="addCss"><file>mui/base.css</file></action> + <action method="addCss"><file>mui/elements.css</file></action> + <action method="addCss"><file>mui/form.css</file></action> + <action method="addCss"><file>mui/components.css</file></action> + <action method="addCss"><file>css/admin.css</file></action> + <action method="addCss"><file>css/header.css</file></action> + <action method="addCss"><file>css/pages.css</file></action> + <action method="addCss"><file>mui/utils.css</file></action> + + <action method="addCss"><file>css/debug.css</file></action> <!-- temporary to debug --> + + <action method="addCss"><file>mui/print.css</file><params>media="print"</params></action> + + <action method="addJs"><file>lib/modernizr.js</file></action> + <action method="addJs"><file>js/head.js</file></action> + <action method="addJs"><file>jquery/jquery.dropdowns.js</file></action> + <action method="addJs"><file>jquery/jquery.tabs.js</file></action> + <action method="addJs"><file>js/theme.js</file></action> + <action method="addJs"><file>js/jquery.details.js</file></action> + </reference> + </default> +</layout> diff --git a/app/design/adminhtml/default/backend/mui/base.css b/app/design/adminhtml/default/backend/mui/base.css new file mode 100644 index 0000000000000000000000000000000000000000..4ccaba9b49655c793f4cb2afd0ff4ccfdda68d4d --- /dev/null +++ b/app/design/adminhtml/default/backend/mui/base.css @@ -0,0 +1,418 @@ +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ + +@font-face { + font-family: 'MUI-Icons'; + src: url('fonts/MUI-Icons.eot'); + src: url('fonts/MUI-Icons.eot?#iefix') format('embedded-opentype'), url('fonts/MUI-Icons.svg#MUI-Icons') format('svg'), url('fonts/MUI-Icons.woff') format('woff'), url('fonts/MUI-Icons.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} + +/* + Simple 'button view' action (default size) +-------------------------------------- */ +input[type=button], +input[type=submit], +input[type=reset], +button, +input[type=button]:visited, +input[type=submit]:visited, +input[type=reset]:visited, +button:visited, +[class^="action-"], +[class^="action-"]:visited { + font: 14px/18px 'CallunaSans', Arial, Helvetica, sans-serif; + font-weight: 500; + color: #322e2a; + background: #dbd6ce; + display: inline-block; + padding: 5px 14px; + text-align: center; + text-decoration: none; + vertical-align: top; + cursor: pointer; + border: transparent; + border-radius: 5px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +input[type=button]:hover, +input[type=submit]:hover, +input[type=reset]:hover, +button:hover, +input[type=button]:focus, +input[type=submit]:focus, +input[type=reset]:focus, +button:focus, +[class^="action-"]:hover, +[class^="action-"]:focus { + background: #cac2b5; + color: #322e2a; +} + +input[type=button]:active, +input[type=submit]:active, +input[type=reset]:active, +button:active, +input[type=button].active, +input[type=submit].active, +input[type=reset].active, +button.active, +[class^="action-"]:active, +[class^="action-"].active { + box-shadow: 0 1px 5px #aaa59b inset; +} + +input[type=button][disabled], +input[type=submit][disabled], +input[type=reset][disabled], +button[disabled], +input[type=button].disabled, +input[type=submit].disabled, +input[type=reset].disabled, +button.disabled, +input[type=button][disabled]:hover, +input[type=submit][disabled]:hover, +input[type=reset][disabled]:hover, +button[disabled]:hover, +input[type=button].disabled:hover, +input[type=submit].disabled:hover, +input[type=reset].disabled:hover, +button.disabled:hover, +input[type=button][disabled]:focus, +input[type=submit][disabled]:focus, +input[type=reset][disabled]:focus, +button[disabled]:focus, +input[type=button].disabled:focus, +input[type=submit].disabled:focus, +input[type=reset].disabled:focus, +button.disabled:focus, +input[type=button][disabled]:active, +input[type=submit][disabled]:active, +input[type=reset][disabled]:active, +button[disabled]:active, +input[type=button].disabled:active, +input[type=submit].disabled:active, +input[type=reset].disabled:active, +button.disabled:active, +input[type=button][disabled].active, +input[type=submit][disabled].active, +input[type=reset][disabled].active, +button[disabled].active, +input[type=button].disabled.active, +input[type=submit].disabled.active, +input[type=reset].disabled.active, +button.disabled.active, +[class^="action-"][disabled], +[class^="action-"].disabled, +[class^="action-"][disabled]:visited, +[class^="action-"].disabled:visited, +[class^="action-"][disabled]:hover, +[class^="action-"].disabled:hover, +[class^="action-"][disabled]:focus, +[class^="action-"].disabled:focus, +[class^="action-"][disabled]:active, +[class^="action-"].disabled:active, +[class^="action-"][disabled].active, +[class^="action-"].disabled.active { + cursor: not-allowed; + opacity: 0.65; + background: #d9d6cf; + box-shadow: none; + text-shadow: none; +} + +/* + Buttons group +-------------------------------------- */ + +.buttons-group { + position: relative; + display: inline-block; +} + +.buttons-group:before, +.buttons-group:after { + display: table; + content: ""; +} + +.buttons-group:after { + clear: both; +} + +.buttons-group > button, +.buttons-group > .button { + position: relative; + float: left; + margin-left: -1px; + border-radius: 0; +} + +.buttons-group > button:first-child, +.buttons-group > .button:first-child { + margin-left: 0; + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} + +.buttons-group > button:last-child, +.buttons-group > .button:last-child, +.buttons-group > [data-toggle="dropdown"] { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} + +.buttons-group-vertical > .button { + float: none; + display: block; + margin-left: 0; + margin-top: -1px; +} + +.buttons-group-vertical > input[type=button], +.buttons-group-vertical > input[type=submit], +.buttons-group-vertical > input[type=reset], +.buttons-group-vertical > button { + width: 100%; +} + +.buttons-group-vertical > .button:first-child { + margin-top: 0; + border-radius: 4px 4px 0 0; +} + +.buttons-group-vertical > .button:last-child { + border-radius: 0 0 4px 4px; +} + +/* + Button toggle (with dropdown menu) +-------------------------------------- */ + +.dropdown-menu { + position: absolute; + display: none; + list-style: none; + margin: 3px 0 0 0; + padding: 0; + right: 0; + top: 100%; + border: 1px solid #b5b5b5; + border-radius: 3px; + background: #fff; + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.2); +} + +.dropdown-menu li { + padding: 5px; + border-bottom: 1px solid #e5e5e5; +} + +.dropdown-menu li.selected { + background: #f5f5f5; +} + +.dropdown-menu li:hover { + background: #f5f5f5; +} + +.dropdown-menu li:last-child { + border-bottom: none; +} + +.dropdown-menu-top { + margin: 0 0 3px 0; + top: auto; + bottom: 100%; +} + +.buttons-group.active { + z-index: 20; +} + +.buttons-group.active .dropdown-menu { + display: block; +} + +.button .arrow { + color: #919191; + margin: 0 -3px 0 3px; +} + +.button > .arrow { + display: inline-block; + margin: 0 -3px; +} + +/* + Forms +-------------------------------------- */ + +fieldset { + border: 1px solid #ccc; + padding: 20px; +} + +legend { + padding: 0 10px; + margin: 0 -10px; +} + +fieldset legend + br { + display: none; +} + +label { + display: inline-block; +} + +label > input[type="radio"], +label > input[type="checkbox"] { + margin: -3px 3px 0 0; + vertical-align: middle; +} + +input[type=text], +input[type=password], +input[type=datetime], +input[type=datetime-local], +input[type=date], +input[type=month], +input[type=time], +input[type=week], +input[type=number], +input[type=range], +input[type=email], +input[type=url], +input[type=search], +input[type=tel], +input[type=color], +textarea, +.input-text { + display: inline-block; + padding: 4px; + margin: 0 0 8px; + background-color: #fff; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +textarea, +.input-text { + height: auto; +} + +select { + padding: 4px; + margin: 0 0 8px; +} + +select[multiple], +select[size] { + height: auto; +} + +input[type=text]:focus, +input[type=password]:focus, +input[type=datetime]:focus, +input[type=datetime-local]:focus, +input[type=date]:focus, +input[type=month]:focus, +input[type=time]:focus, +input[type=week]:focus, +input[type=number]:focus, +input[type=range]:focus, +input[type=email]:focus, +input[type=url]:focus, +input[type=search]:focus, +input[type=tel]:focus, +input[type=color]:focus, +textarea:focus { + outline: 0; +} + +input[type="radio"], +input[type="checkbox"] { + margin: 3px 0; + line-height: normal; +} + +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; +} + +/* + Blockquotes +-------------------------------------- */ +blockquote { + border-left: 2px solid #ccc; + padding-left: 5px; +} + +blockquote small:before { + content: '\2014 \00A0'; +} + +/* + Tables +-------------------------------------- */ +table > caption { + margin-bottom: 5px; +} + +table tfoot, +table th { + background: #e6e6e6; +} + +table th, +table td { + border: 1px solid #ccc; + padding: 10px 15px; +} + +table tbody tr td { + background: #fff; +} + +table tbody tr:nth-child(odd) td, +table tbody tr:nth-child(odd) th { + background-color: #f9f9f9; +} + +table tbody tr:hover td, +table tbody tr:hover th { + background-color: #fff9e4; +} \ No newline at end of file diff --git a/app/design/adminhtml/default/backend/mui/components.css b/app/design/adminhtml/default/backend/mui/components.css new file mode 100644 index 0000000000000000000000000000000000000000..c13d102bea4ab848a8a0faeda3a95d9828c9d9d0 --- /dev/null +++ b/app/design/adminhtml/default/backend/mui/components.css @@ -0,0 +1,276 @@ +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ + +/* ============================================================================= + Sorter + ========================================================================== */ +.sorter { + line-height: 25px; + padding: 5px 0; + border:solid #999; + border-width: 1px 0; +} +.view-mode { + margin: 0; + float: left; + white-space: nowrap; +} +.sort-by { + float: right; + white-space: nowrap; + line-height: normal; +} +.sort-by select { + width: auto; + margin: 0; +} +.sort-by a { + display: inline-block; + width: 8px; + height: 11px; + margin: 0 0 0 3px; + text-decoration: none; + color: #000; + text-indent: -9999px; + background: url(images/sorter-bg.png) no-repeat 0 0; +} +.sort-by a:hover { + background-position: 0 -12px; +} +.sort-asc a { + background-position: -9px 0; +} +.sort-asc a:hover { + background-position: -9px -12px; +} +.view-icons strong, +.view-icons a { + width: 15px; + height: 15px; + display: inline-block; + text-indent: -9999px; + line-height: normal; + background: url(images/view-mode-bg.png) no-repeat 0 0; +} +.view-icons strong.view-list { + background-position: -16px 0; +} +.view-icons a.view-grid { + background-position: 0 -16px; +} +.view-icons a.view-grid:hover { + background-position: 0 -32px; +} +.view-icons a.view-list { + background-position: -16px -16px; +} + +.view-icons a.view-list:hover { + background-position: -16px -32px; +} +.sorter:after { + content:""; + display:table; + clear: both; +} + + + + +/* ============================================================================= + Footer Blocks + ========================================================================== */ +.footer-links { + margin-bottom: 12px; +} +.switcher {} +.switcher ul { + margin: 0; + padding: 0; + list-style: none; +} +.switcher .current { + display: none; +} +.copyrights { + display: block; + margin: 12px 0; +} +.bug-report { + margin: 12px 0; +} + + + + +/* ============================================================================= + Simple Block + ========================================================================== */ +.block {} +.block-title, +.block-list > li, +.block-footer { + padding:5px 0; +} +.block-subtitle { + margin:5px 0; + font-weight:bold; +} +.block-list { + list-style:none; + padding:0; +} +.block-footer:after { + content:''; + width:100%; + display:table; + clear:both; +} + +/* ============================================================================= + Auth, User Block (Login, Register Pages) + ========================================================================== */ +.block-user { + margin:0 0 15px 0; +} +.block-user .block-title { + text-transform:uppercase; +} +.block-user .forgot-link { + display:inline-block; + margin:7px 0 5px; +} +.block-user .block-footer .button { + float:right; +} +.block-user .block-content { + padding-top:12px; +} +.block-user .block-content p { + margin-top:0; +} +.block-login .block-content { + min-height:150px; +} + +/* ============================================================================= + Logo + ========================================================================== */ +.logo { + float:left; + margin:0 0 10px 0; + text-decoration:none; +} +a.logo { + color:#000; + font-size:34px; + font-weight:bold; +} +.logo strong { + display:none; +} + +/* ============================================================================= + Search Form + ========================================================================== */ +.form-search { + margin:0 0 10px 0; +} +.form-search label { + vertical-align:top; +} +.form-search input[type=search] { + margin-bottom:0; + min-width:160px; +} +.form-search strong { + display:none; +} +.search-form-submit { + +} + +/* ============================================================================= + Quick access links + ========================================================================== */ +.quick-access { + float:right; + margin:12px 0 0 0; +} +.quick-access .nav > ul > li { + margin:0 22px 0 0; +} +.quick-access .nav > ul > li:after { + content:''; +} +.quick-access .items-qty { + font-size:11px; +} +.quick-access .nav > .button { + margin:-3px 0 0 0; +} +.welcome-msg {} +.quick-access-links {} +.quick-access-links ul {} +.quick-access-links li {} +.quick-access-links a {} + +/* ============================================================================= + Header + ========================================================================== */ +.page-header {} +.page-header .arrow { + margin:0 0 0 3px; + cursor:pointer; + color:#919191; + font-size:9px; + vertical-align:middle; +} +.page-header-inner {} +.page-header-inner:after { + content:''; + display:table; + width:100%; +} +.menu-top { + list-style:none; + margin:0 0 10px 0; +} +.menu-top li { + display:inline-block; + margin:0 25px 0 0; +} +.menu-top li a { + text-decoration:underline; +} +.menu-top li a span { + text-transform:none; +} +.menu-top dl {} +.menu-top dt { + display:inline; +} +.menu-top dd { + display:inline; + margin:0 25px 0 0; +} \ No newline at end of file diff --git a/app/design/adminhtml/default/backend/mui/elements.css b/app/design/adminhtml/default/backend/mui/elements.css new file mode 100644 index 0000000000000000000000000000000000000000..3afa0e6fb402cd87206b4e743c887b5c4edf999f --- /dev/null +++ b/app/design/adminhtml/default/backend/mui/elements.css @@ -0,0 +1,1396 @@ +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ + +/* + Close btn +-------------------------------------- */ +.close:before { + content: '\00D7\00A0'; +} + +/* + Tooltips +-------------------------------------- */ + +/* Simple "css" tooltip */ +.tooltip { + display: inline-block; + vertical-align: middle; + line-height: 1.1; +} + +.tooltip .help:before { + content: "?"; + font: 11px/12px bold Arial, Verdana, sans-serif; + display: inline-block; + text-decoration: inherit; + vertical-align: top; + color: #fff; + height: 12px; + width: 12px; + background: #666; + border-radius: 6px; + text-align: center; + text-shadow: none; + margin-right: 3px; +} + +.tooltip-content { + display: none; + position: absolute; + max-width: 200px; + margin-top: 10px; + margin-left: -19px; + padding: 4px 8px; + border-radius: 3px; + background: #000; + background: rgba(0, 0, 0, .8); + color: #fff; + text-shadow: none; + z-index: 20; +} + +.tooltip-content:before { + content: ''; + position: absolute; + width: 0; + height: 0; + top: -5px; + left: 20px; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-bottom: 5px solid #000; + opacity: .8; +} + +.tooltip-content.loading { + position: absolute; +} + +.tooltip-content.loading:before { + border-bottom-color: rgba(0, 0, 0, .3); +} + +.tooltip:hover { + z-index: 20; +} + +.tooltip > .help { + cursor: help; + display: inline-block; + vertical-align: top; + height: 12px; + line-height: 12px; + color: #666; +} + +.tooltip:hover > .tooltip-content { + display: block; +} + +/* "js" tooltip with positions */ +.tipsy { + position: absolute; + left: 0; + top: 0; + display: none; + padding: 5px; + font-size: 12px; + z-index: 998; +} + +.tipsy-inner { + padding: 5px 8px 4px; + background-color: #000; + color: #fff; + max-width: 150px; + border-radius: 3px; +} + +.tipsy-arrow { + position: absolute; + width: 0; + height: 0; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-bottom: 5px solid #000; +} + +.tipsy-s .tipsy-arrow { + top: 0; + left: 50%; + margin-left: -4px; +} + +.tipsy-se .tipsy-arrow { + top: 0; + left: 10px; +} + +.tipsy-sw .tipsy-arrow { + top: 0; + right: 10px; +} + +.tipsy-n .tipsy-arrow, +.tipsy-ne .tipsy-arrow, +.tipsy-nw .tipsy-arrow { + bottom: 0; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-top: 5px solid #000; + border-bottom: none; +} + +.tipsy-n .tipsy-arrow { + left: 50%; + margin-left: -4px; +} + +.tipsy-ne .tipsy-arrow { + left: 10px; +} + +.tipsy-nw .tipsy-arrow { + right: 10px; +} + +.tipsy-w .tipsy-arrow, +.tipsy-e .tipsy-arrow { + top: 50%; + margin-top: -4px; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; +} + +.tipsy-w .tipsy-arrow { + right: 0; + border-right: none; + border-left: 5px solid #000; +} + +.tipsy-e .tipsy-arrow { + left: 0; + border-right: 5px solid #000; + border-left: none; +} + +/* + Messages +-------------------------------------- */ +.message, +.message-success, +.message-error, +.message-under-construction { + position: relative; + margin: 0 0 10px; + padding: 8px 35px; + border: 1px solid #dfc97a; + border-radius: 4px; + text-shadow: 0 1px 0 #fff; + color: #6f4400; + background: #E8E0C6; +} + +.message-header { + font-weight: bold; +} + +.message-header, +.message-content, +.message-footer { +} + +.message-success { + color: #26431c; + background: #E7ECE1; + border-color: #A8B5A0; +} + +.message-error { + color: #6f0300; + background: #E5CECD; + border-color: #CEB2B1; +} + +.message:before, +.message-success:before, +.message-error:before { + position: absolute; + left: 8px; + top: 8px; + width: 14px; + height: 14px; + border-radius: 10px; + color: #fff; + line-height: 14px; + font-size: 13px; + text-align: center; + text-shadow: 0 1px 0 #000; + content: '!'; + font-weight: bold; + border: 1px solid #C76F35; + background: #eecf4f; + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2VlY2Y0ZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwJSIgc3RvcC1jb2xvcj0iI2U0YWIzNyIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjY3JSIgc3RvcC1jb2xvcj0iI2M0NjkzMyIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNkODhjMzMiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); + background: -moz-linear-gradient(top, #eecf4f 0%, #e4ab37 10%, #c46933 67%, #d88c33 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #eecf4f), color-stop(10%, #e4ab37), color-stop(67%, #c46933), color-stop(100%, #d88c33)); + background: -webkit-linear-gradient(top, #eecf4f 0%, #e4ab37 10%, #c46933 67%, #d88c33 100%); + background: -o-linear-gradient(top, #eecf4f 0%, #e4ab37 10%, #c46933 67%, #d88c33 100%); + background: -ms-linear-gradient(top, #eecf4f 0%, #e4ab37 10%, #c46933 67%, #d88c33 100%); + background: linear-gradient(to bottom, #eecf4f 0%, #e4ab37 10%, #c46933 67%, #d88c33 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eecf4f', endColorstr = '#d88c33', GradientType = 0); +} + +.message-success:before { + content: '✔'; + border: 1px solid #185B00; + background: #c1df53; + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2MxZGY1MyIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwJSIgc3RvcC1jb2xvcj0iIzc1YTkzMyIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjY3JSIgc3RvcC1jb2xvcj0iIzQ1NmUyOCIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiM1YjkzMmMiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); + background: -moz-linear-gradient(top, #c1df53 0%, #75a933 10%, #456e28 67%, #5b932c 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #c1df53), color-stop(10%, #75a933), color-stop(67%, #456e28), color-stop(100%, #5b932c)); + background: -webkit-linear-gradient(top, #c1df53 0%, #75a933 10%, #456e28 67%, #5b932c 100%); + background: -o-linear-gradient(top, #c1df53 0%, #75a933 10%, #456e28 67%, #5b932c 100%); + background: -ms-linear-gradient(top, #c1df53 0%, #75a933 10%, #456e28 67%, #5b932c 100%); + background: linear-gradient(to bottom, #c1df53 0%, #75a933 10%, #456e28 67%, #5b932c 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#c1df53', endColorstr = '#5b932c', GradientType = 0); +} + +.message-error:before { + border: 1px solid #963535; + background: #ea8383; + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2VhODM4MyIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwJSIgc3RvcC1jb2xvcj0iI2M2NTA1MCIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjY3JSIgc3RvcC1jb2xvcj0iIzk3MzgzOCIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNiODQzNDMiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); + background: -moz-linear-gradient(top, #ea8383 0%, #c65050 10%, #973838 67%, #b84343 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ea8383), color-stop(10%, #c65050), color-stop(67%, #973838), color-stop(100%, #b84343)); + background: -webkit-linear-gradient(top, #ea8383 0%, #c65050 10%, #973838 67%, #b84343 100%); + background: -o-linear-gradient(top, #ea8383 0%, #c65050 10%, #973838 67%, #b84343 100%); + background: -ms-linear-gradient(top, #ea8383 0%, #c65050 10%, #973838 67%, #b84343 100%); + background: linear-gradient(to bottom, #ea8383 0%, #c65050 10%, #973838 67%, #b84343 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ea8383', endColorstr = '#b84343', GradientType = 0); +} + +.message-under-construction { + padding: 10px 30px; + text-align: center; + background: #FFCC3B; + color: #000; + border: none; + border-radius: 0; +} + +.message-under-construction strong { + position: relative; +} + +.message-under-construction strong:before { + position: absolute; + top: -1px; + left: -25px; + content: ''; + background: #EED61A; + border: 1px solid #000; + width: 14px; + height: 14px; + -webkit-transform: rotate(-45deg); + -moz-transform: rotate(-45deg); + transform: rotate(-45deg); + border-radius: 3px; +} + +.message-under-construction strong:after { + position: absolute; + top: -1px; + left: -19px; + content: '!'; + font-weight: bold; + color: #000; +} + +.message .close { + position: absolute; + top: 0; + right: 0; + font: 20px/18px bold Arial, sans-serif; + text-shadow: 0 1px 0 #fff; + opacity: 0.2; + filter: alpha(opacity = 20); + cursor: pointer; +} + +.message .close:hover { + opacity: 0.4; + filter: alpha(opacity = 40); +} + +.message .buttons-set { + margin-top: 5px; +} + +/* + Pagination +-------------------------------------- */ +.pagination { + margin: 18px 0; + text-align: center; + font-size: 11px; + line-height: 26px; +} + +.pagination-left { + text-align: left; +} + +.pagination-right { + text-align: right; +} + +.pagination ul { + display: inline-block; + margin: 0; + padding: 0; +} + +.pagination li { + display: inline; + line-height: 18px; +} + +.pagination li a, +.pagination li span { + margin: 0 5px; +} + +.pagination .current span { + color: #000; +} + +.pagination .current .button { + color: #fff; +} + +.pagination .amount { + display: inline; + margin: 0 15px 0 0; +} + +.pagination .limiter, +.pagination label { + display: inline; +} + +.pagination .limiter { + margin: 0 0 0 15px; +} + +.pagination select { + width: auto; + margin-right: 5px; +} + +.pagination-alt .amount { + float: left; +} + +.pagination-alt .limiter { + float: right; +} + +.pagination li .pagination-previous, +.pagination li .pagination-next { + display: inline-block; + width: 8px; + height: 12px; + text-indent: -9999px; + text-align: left; + vertical-align: middle; + background: url(images/pagination-arrows-bg.png) no-repeat 0 0; +} + +.pagination li .pagination-previous:hover { + background-position: 0 -13px; +} + +.pagination li.disabled .pagination-previous { + background-position: 0 -26px; +} + +.pagination li .pagination-next { + background-position: -10px 0; +} + +.pagination li .pagination-next:hover { + background-position: -10px -13px; +} + +.pagination li.disabled .pagination-next { + background-position: -10px -26px; +} + +/* + Breadcrumbs +-------------------------------------- */ +.breadcrumbs { + margin: 18px 0; +} + +.breadcrumbs ul { + margin: 0; + padding: 0; +} + +.breadcrumbs li { + display: inline-block; +} + +.breadcrumbs li:after { + content: "/"; + margin: 0 4px; +} + +.breadcrumbs .current:after { + content: ""; +} + +/* + Tags +-------------------------------------- */ +.tags { + margin: 18px 0; + padding: 0; +} + +.tags li { + display: inline-block; + margin: 0 10px 5px 0; + white-space: nowrap; + list-style: none; +} + +/* ============================================================================= + Tabels + ========================================================================== */ + +/* Striped table */ + +.table-striped tbody tr td:nth-child(odd), +.table-striped tbody tr th:nth-child(odd) { + background: #f5f5f5; +} + +.table-striped tbody tr td:nth-child(even), +.table-striped tbody tr th:nth-child(even) { + background: #fff; +} + +.table-striped tbody tr:hover td, +.table-striped tbody tr:hover th { + background-color: #fff9e4; +} + +.table-light th, +.table-light td { + border-width: 1px 0 0 0; +} + +.table-light caption + thead tr:first-child th, +.table-light caption + thead tr:first-child td, +.table-light colgroup + thead tr:first-child th, +.table-light colgroup + thead tr:first-child td, +.table-light thead:first-child tr:first-child th, +.table-light thead:first-child tr:first-child td { + border-top: 0; +} + +.table-light tbody tr:nth-child(odd) td, +.table-light tbody tr:nth-child(odd) th, +.table-light tbody tr:nth-child(even) td, +.table-light tbody tr:nth-child(even) th, +.table-light tfoot tr:nth-child(odd) td, +.table-light tfoot tr:nth-child(odd) th, +.table-light tfoot tr:nth-child(even) td, +.table-light tfoot tr:nth-child(even) th, +.table-light thead tr:nth-child(odd) td, +.table-light thead tr:nth-child(odd) th, +.table-light thead tr:nth-child(even) td, +.table-light thead tr:nth-child(even) th, +.table-light tfoot { + background: none; +} + +.table-light tbody tr:hover td, +.table-light tbody tr:hover th { + background-color: #fff9e4; +} + +.table-full-width { + width: 100%; +} + +/* + Star rating +-------------------------------------- */ +.rating-box { + width: 70px; + height: 13px; + font-size: 0; + line-height: 0; + background: url(images/rating-bg.png) 0 0 repeat-x; + overflow: hidden; +} + +.rating-box .rating { + height: 13px; + background: url(images/rating-bg.png) 0 -13px repeat-x; +} + +/* + Navigation +-------------------------------------- */ +.nav { + background: #e6e6e6; +} + +.menu { + margin: 0; + padding: 0; +} + +/* All Levels */ +.menu li:hover, +.menu li.hovered { + z-index: 990 !important; +} + +.menu li.parent { + position: relative; + z-index: 1; +} + +.menu li a { + font-size: 14px; + font-weight: bold; + color: #000; + text-decoration: none; +} + +.menu li a span { + cursor: pointer; + text-transform: uppercase; +} + +/* 1st Level (Top Level) */ +.level-top > li { + float: left; + margin: 0; + display: inline; + position: relative; + z-index: 1; +} + +.level-top > li > a { + float: left; + font-size: 14px; + height: 36px; + line-height: 36px; + padding: 0 15px; + border: 1px solid transparent; +} + +.level-top > .parent > a span:after { + content: " â–¼"; +} + +.level-top > li > a:hover, +.level-top > li:hover > a, +.level-top > li.hovered > a { + background: #fff; + border-color: #a6a6a6; +} + +.level-top > .parent > a:hover, +.level-top > .parent:hover > a, +.level-top > .parent.hovered > a { + border-color: #a6a6a6; + border-bottom-color: transparent; + position: relative; + z-index: 99999; +} + +/* 2nd Level */ +.menu ul { + margin: 0; + position: absolute; + min-width: 100%; + top: 36px; + left: -10000px; + background: #fff; + padding: 0; + border: 1px solid #a6a6a6; +} + +.menu ul li { + float: none; + height: auto; + display: block; + margin: 0; +} + +.menu ul .parent > a span:after { + content: " â–º" +} + +.menu ul li a { + display: block; + padding: 8px 12px; + line-height: 1.2; +} + +.menu ul li a:hover { + background: #e6e6e6; +} + +/* 3rd+ Level */ +.menu ul ul { + top: 0; +} + +/* Show Menu */ +.menu li:hover > ul, +.menu li.hovered > ul { + left: 0; + z-index: 991; +} + +.menu li:hover > ul > li:hover > ul, +.menu li.hovered > ul > li.hovered > ul { + left: -2px; + margin-left: 100%; +} + +/* Vertical navigation */ +.nav-vertical .menu li { + float: none; + display: block; +} + +.nav-vertical .menu li a { + float: none; + display: block; + height: auto; + line-height: 1.2; + padding: 10px; +} + +.nav-vertical .menu li:hover > ul, +.nav-vertical .menu li.hovered > ul { + left: -1px; + top: 0; + margin-left: 100%; +} + +.nav-vertical .level-top > .parent > a span:after { + content: " â–º"; +} + +.nav-vertical .level-top > .parent > a:hover, +.nav-vertical .level-top > .parent:hover > a, +.nav-vertical .level-top > .parent.hovered > a { + border-color: #a6a6a6; +} + +/* Tree navigation */ +.nav-tree { + background: none; + box-shadow: none; +} + +.nav-tree ul li { + margin: 10px 0; +} + +.nav-tree .level-top > li { + display: block; + float: none; + border: none; +} + +.nav-tree .menu ul { + position: static; + left: 0; + background: none; + box-shadow: none; + margin: 0 0 0 20px; + border: none; +} + +.nav-tree .menu li:hover > ul > li:hover > ul, +.nav-tree .menu li:hover > ul { + left: 0; + top: 0; + margin-left: 20px; +} + +.nav-tree .menu li a { + float: none; + border: none; + font-weight: normal; +} + +.nav-tree .menu li a:link, +.nav-tree .menu li a:visited { + height: auto; + line-height: 1.2; + padding: 0; + display: inline; + text-decoration: underline; +} + +.nav-tree .menu li a:hover, +.nav-tree .menu li a:active { + text-decoration: none; + background: none; + box-shadow: none; +} + +.nav-tree .menu li a span { + text-transform: none; +} + +.nav-tree .menu ul .parent > a span:after, +.nav-tree .level-top > .parent > a span:after { + content: ""; +} + +/* Inline navigation */ +.nav-inline { + background: none; + box-shadow: none; + position: relative; +} + +.nav-inline ul { + display: inline; +} + +.nav-inline .menu ul { + border: none; + top: 16px; + padding: 10px 0; +} + +.nav-inline ul li { + display: inline; + border: none; +} + +.nav-inline .menu li.parent { + position: static; +} + +.nav-inline .menu li:hover > ul > li:hover > ul { + left: 0; + top: 25px; + margin-left: 0; +} + +.nav-inline ul li:after { + content: '|'; + margin: 0 5px; +} + +.nav-inline ul li:last-child:after { + content: ''; +} + +.nav-inline .menu li a { + border: none; + font-weight: normal; +} + +.nav-inline .menu li a:link, +.nav-inline .menu li a:visited { + padding: 0; + line-height: 1.2; + height: auto; + display: inline; + text-decoration: underline; +} + +.nav-inline .menu li a:hover, +.nav-inline .menu li a:active { + text-decoration: none; + background: none; + box-shadow: none; +} + +.nav-inline .menu li a span { + text-transform: none; +} + +.nav-inline .menu ul .parent > a span:after, +.nav-inline .level-top > .parent > a span:after { + content: " â–¼"; +} + +/* + Loaders +-------------------------------------- */ +.loading { + position: relative; +} + +.loading:after { + content: ''; + position: absolute; + width: 24px; + height: 24px; + top: 50%; + left: 50%; + margin: -12px 0 0 -12px; + background: url(images/ajax-loader.gif) no-repeat center; +} + +.loading-message { + position: absolute; + left: 0; + right: 0; + top: 50%; + text-align: center; + z-index: 2; +} + +.button.loading { + padding-right: 25px; +} + +.button.loading:after { + left: auto; + right: 6px; +} + +table.loading:after { + right: -1px; +} + +/* loader with svg */ +.loading-svg { + position: absolute; + top: 50%; + left: 50%; + background-image: url(images/ajax-loader.svg); + background-size: contain; + width: 36px; + height: 36px; + margin: -18px 0 0 -18px; + opacity: .7; + -webkit-animation: rotate 1.5s infinite steps(12); + -moz-animation: rotate 1.5s infinite steps(12); + animation: rotate 1.5s infinite steps(12); +} + +@-moz-keyframes rotate { + 0% { + -moz-transform: rotate(0deg); + } + 100% { + -moz-transform: rotate(360deg); + } +} + +@-webkit-keyframes "rotate" { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + } +} + +/* loader inner */ +.loading-inner { + background: url(images/ajax-loader.gif) no-repeat center; +} + +/* loader sizes */ +.loading-small:after { + background-image: url(images/ajax-loader-small.gif); + width: 16px; + height: 16px; + margin: -8px 0 0 -8px; +} + +.loading-big:after { + background-image: url(images/ajax-loader-big.gif); + width: 64px; + height: 64px; + margin: -32px 0 0 -32px; +} + +/* laoder locker */ +.loading-blocker { + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.loading-blocker:after { + width: auto; + height: auto; + margin: 0; + left: 0; + top: 0; + right: 0; + bottom: 0; + background-color: rgba(255, 255, 255, .65); +} + +/* css3 only loader */ +.loading-arrow { + width: 30px; + height: 30px; + position: absolute; + left: 50%; + top: 50%; + margin: -15px 0 0 -15px; + text-align: center; + font: 32px/1 Arial, Verdana, sans-serif; + color: #AE4444; + text-shadow: 0 0 5px #A5E0FC; + -moz-animation: spin .8s infinite linear; + -webkit-animation: spin .8s infinite linear; + animation: spin .8s infinite linear; +} + +.loading-arrow:before { + content: '↻'; +} + +@-moz-document url-prefix() { + .loading-arrow:after { + font-size:36px; + position: absolute; + left:-1px; + top:-5px; + } +} +@-moz-keyframes spin { + 0% { + -moz-transform: rotate(0deg); + } + 100% { + -moz-transform: rotate(360deg); + } +} + +@-webkit-keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + } +} + +/* + Popups +-------------------------------------- */ + +.fade { + position: fixed; + left: 0; + top: 0; + right: 0; + bottom: 0; + padding: 15%; + background-color: rgba(0, 0, 0, .65); + text-align: center; + z-index: 999; +} + +.ie8 .fade { + background: transparent; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = #99000000, endColorstr = #99000000); +} + +.fade .popup { + text-align: left; + background: #fff; + box-shadow: 0 0 10px 0 #333; +} + +.popup { + position: relative; + display: inline-block; + background: #E6E6E6; + border-radius: 5px; + padding: 20px; + border: 1px solid #b8b8b8; +} + +.popup-header, +.popup-content { +} + +.popup-header { + font-weight: bold; +} + +.popup .buttons-set { + margin: 15px 0 0; +} + +.popup .close { + position: absolute; + right: 0; + top: 0; + cursor: pointer; + font: 20px/18px Arial, sans-serif; + text-shadow: 0 1px 0 #fff; + width: 17px; + height: 20px; + overflow: hidden; + padding-left: 5px; +} + +.popup-system { + padding: 0; + background: #fff; +} + +.popup-system .popup-header { + cursor: move; + padding: 10px 20px; + background: #efefef; + border-bottom: 1px solid #b8b8b8; + border-radius: 5px 5px 0 0; +} + +.popup-system .popup-content { + padding: 20px; +} + +.popup-system .popup-footer { + border-top: 1px solid #b8b8b8; + padding: 10px 20px; +} + +.popup-system .close { + top: 8px; +} + +.popup-system .buttons-set { + margin: 0; +} + +/* popup types */ +.fade [class^='popup-'] .popup-title { + position: relative; + padding-left: 28px; +} + +.fade [class^='popup-'] .popup-title:before { + position: absolute; + left: 0; + top: 2px; + font-family: 'MUI-Icons'; + font-style: normal; + font-size: 20px; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; +} + +.popup-notice .popup-title:before { + content: '\e006'; /* notice icon */ + color: #d98236; +} + +.popup-error .popup-title:before { + content: '\e006'; /* notice icon */ + color: #a32715; +} + +.popup-info .popup-title:before, +.popup-critical .popup-title:before { + top: 5px; + content: '\e046'; /* info icon */ + font-size: 14px; + width: 20px; + height: 20px; + line-height: 20px; + text-align: center; + color: #fff; + background: #6191ad; + border-radius: 10px; +} + +.popup-critical .popup-title:before { + background: #D98236; +} + +/* + Tabs +-------------------------------------- */ +.tabs-nav { + margin: 0; + list-style: none; + border-bottom: 1px solid #ccc; + padding: 0; +} + +.tabs-nav > li > a { + display: block; +} + +.tabs-nav > li > a:hover { + text-decoration: none; +} + +.tabs-nav > li { + float: left; + margin-bottom: -1px; + margin-right: -1px; + background: #eaeaea; + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2VhZWFlYSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNkZmRmZGYiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); + background: -moz-linear-gradient(top, #eaeaea 0%, #dfdfdf 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #eaeaea), color-stop(100%, #dfdfdf)); + background: -webkit-linear-gradient(top, #eaeaea 0%, #dfdfdf 100%); + background: -o-linear-gradient(top, #eaeaea 0%, #dfdfdf 100%); + background: -ms-linear-gradient(top, #eaeaea 0%, #dfdfdf 100%); + background: linear-gradient(to bottom, #eaeaea 0%, #dfdfdf 100%); +} + +.tabs-nav > li:hover { + background: #dfdfdf; + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2RmZGZkZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNlYWVhZWEiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); + background: -moz-linear-gradient(top, #dfdfdf 0%, #eaeaea 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #dfdfdf), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(top, #dfdfdf 0%, #eaeaea 100%); + background: -o-linear-gradient(top, #dfdfdf 0%, #eaeaea 100%); + background: -ms-linear-gradient(top, #dfdfdf 0%, #eaeaea 100%); + background: linear-gradient(to bottom, #dfdfdf 0%, #eaeaea 100%); +} + +.tabs-nav > li > a { + padding: 8px 12px; + line-height: 18px; + border: 1px solid #ccc; + text-decoration: none; + color: #666; +} + +.tabs-nav > .active > a, +.tabs-nav > .active > a:hover { + color: #555; + cursor: default; + background-color: #fff; + border-bottom-color: #fff; +} + +.tab-content { + overflow: auto; + border: solid #ccc; + border-width: 0 1px 1px; +} + +.tabs-below > .tabs-nav, +.tabs-right > .tabs-nav, +.tabs-left > .tabs-nav { + border-bottom: 0; +} + +.tab-content > .tab-pane { + display: none; + padding: 20px 13px; +} + +.tab-content > .active { + display: block; + background: #fff; +} + +.tabs-below > .tabs-nav { + border-top: 1px solid #ccc; +} + +.tabs-below > .tabs-nav > li { + margin-top: -1px; + margin-bottom: 0; +} + +.tabs-below > .tabs-nav > li.active > a { + border: 1px solid #ccc; + border-top-color: transparent; +} + +.tabs-below > .tab-content { + border-width: 1px 1px 0; +} + +.tabs-left > .tabs-nav > li, +.tabs-right > .tabs-nav > li { + float: none; +} + +.tabs-left > .tabs-nav > li > a, +.tabs-right > .tabs-nav > li > a { + min-width: 74px; + margin-right: 0; +} + +.tabs-left > .tabs-nav { + float: left; + margin-right: -1px; + border-right: 1px solid #ccc; +} + +.tabs-left > .tab-content, +.tabs-right > .tab-content { + border-width: 1px; +} + +.tabs-left > .tabs-nav .active > a, +.tabs-left > .tabs-nav .active > a:hover { + border-color: #ccc transparent #ccc #ccc; +} + +.tabs-right > .tabs-nav { + float: right; + margin-left: -1px; +} + +.tabs-right > .tabs-nav .active > a, +.tabs-right > .tabs-nav .active > a:hover { + border-color: #ccc #ccc #ccc transparent; +} + +.accordion { + margin-bottom: 18px; +} + +.accordion-group { + margin: 0 0 5px; + border: 1px solid #ccc; +} + +.accordion-heading { + border-bottom: 0; + background: #eaeaea; + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2VhZWFlYSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNkZmRmZGYiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); + background: -moz-linear-gradient(top, #eaeaea 0%, #dfdfdf 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #eaeaea), color-stop(100%, #dfdfdf)); + background: -webkit-linear-gradient(top, #eaeaea 0%, #dfdfdf 100%); + background: -o-linear-gradient(top, #eaeaea 0%, #dfdfdf 100%); + background: -ms-linear-gradient(top, #eaeaea 0%, #dfdfdf 100%); + background: linear-gradient(to bottom, #eaeaea 0%, #dfdfdf 100%); +} + +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px; + cursor: pointer; + color: #555; + text-decoration: none; +} + +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #ccc; +} + +.collapse { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -moz-transition: height 0.35s ease; + -ms-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; +} + +.collapse.in, +.no-js .collapse { + height: auto !important; +} + +.no-js .tabs-nav > li, +.no-js .tabs-left > .tabs-nav, +.no-js .tabs-right > .tabs-nav { + float: none; +} + +.no-js .tabs-left > .tabs-nav, +.no-js .tabs-nav > li { + margin-right: 0; +} + +.no-js .tabs-right > .tabs-nav { + margin-left: 0; +} + +.no-js .tabs-right > .tabs-nav > .active > a { + border-left-color: #ccc; +} + +.no-js .tabs-left .tabs-nav { + border-right: 1px solid #ccc; +} + +.no-js .tabs-left .tabs-nav > li > a { + border-right: 0; +} + +.no-js .tab-content > .tab-pane { + display: block; + border-bottom: 1px solid #ccc; +} + +.no-js .tab-content > .tab-pane:last-child { + border-bottom: none; +} + +.no-js .tab-content > .active { + background: #fff; +} + +.no-js .tabs-below > .tabs-nav > li.active > a { + border-top: 1px solid #ccc; +} + +/* + Clears +-------------------------------------- */ +.tabs:before, +.tabs:after, +.tabs-nav:before, +.tabs-nav:after { + display: table; + content: ""; +} + +.tabs-nav:after, +.tabs:after { + clear: both; +} \ No newline at end of file diff --git a/app/design/adminhtml/default/backend/mui/fonts/MUI-Icons.eot b/app/design/adminhtml/default/backend/mui/fonts/MUI-Icons.eot new file mode 100644 index 0000000000000000000000000000000000000000..78bd9fc51718fdebfb87534ceebcdca06a705ab2 Binary files /dev/null and b/app/design/adminhtml/default/backend/mui/fonts/MUI-Icons.eot differ diff --git a/app/design/adminhtml/default/backend/mui/fonts/MUI-Icons.svg b/app/design/adminhtml/default/backend/mui/fonts/MUI-Icons.svg new file mode 100644 index 0000000000000000000000000000000000000000..3ec05eb706881eaec28be3f5b21027a897c0d7d0 --- /dev/null +++ b/app/design/adminhtml/default/backend/mui/fonts/MUI-Icons.svg @@ -0,0 +1,671 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +This is a custom SVG font generated by IcoMoon. +0 +</metadata> +<defs> +<font id="MUI-Icons" horiz-adv-x="512" > +<font-face units-per-em="512" ascent="480" descent="-32" /> +<missing-glyph horiz-adv-x="512" /> +<glyph unicode="" d="M 470.70,72.193l-2.688,2.688l 0.006,0.002L 360.505,182.408c 14.938,25.732, 23.612,55.564, 23.816,87.451 + c 0.626,97.615-77.986,177.243-175.599,177.857c-0.394,0.001-0.771,0.002-1.168,0.002 + c-97.06-0.006-176.063-78.391-176.688-175.598c-0.618-97.609, 77.999-177.236, 175.597-177.859 + c 0.389-0.002, 0.766-0.004, 1.155-0.004c 32.438,0.00, 62.846,8.79, 88.998,24.075l 107.415-107.433l 0.014,0.01l 2.688-2.688 + c 8.125-8.123, 21.293-8.114, 29.41,0.00l 34.562,34.557C 478.819,50.895, 478.822,64.07, 470.70,72.193z M 300.39,177.58 + c-24.834-24.67-57.78-38.252-92.768-38.252l-0.874,0.00 c-72.589,0.467-131.271,59.908-130.813,132.503 + c 0.465,72.128, 59.516,130.811, 131.626,130.815l 0.879-0.002c 35.168-0.22, 68.146-14.123, 92.852-39.148 + c 24.706-25.025, 38.188-58.178, 37.966-93.352C 339.031,235.128, 325.229,202.25, 300.39,177.58zM 128.503,287.997L 287.501,287.997L 287.501,256.203L 128.503,256.203z" /> +<glyph unicode="" d="M 470.70,72.193l-2.688,2.688l 0.006,0.002L 360.505,182.408c 14.938,25.732, 23.612,55.564, 23.816,87.451 + c 0.626,97.615-77.986,177.243-175.599,177.857c-0.394,0.001-0.771,0.002-1.168,0.002 + c-97.06-0.006-176.063-78.391-176.688-175.598c-0.618-97.609, 77.999-177.236, 175.597-177.859 + c 0.389-0.002, 0.766-0.004, 1.155-0.004c 32.438,0.00, 62.846,8.79, 88.998,24.075l 107.415-107.433l 0.014,0.01l 2.688-2.688 + c 8.125-8.123, 21.293-8.114, 29.41,0.00l 34.562,34.557C 478.819,50.895, 478.822,64.07, 470.70,72.193z M 300.39,177.58 + c-24.834-24.67-57.78-38.252-92.768-38.252l-0.874,0.00 c-72.589,0.467-131.271,59.908-130.813,132.503 + c 0.465,72.128, 59.516,130.811, 131.626,130.815l 0.879-0.002c 35.168-0.22, 68.146-14.123, 92.852-39.148 + c 24.706-25.025, 38.188-58.178, 37.966-93.352C 339.031,235.128, 325.229,202.25, 300.39,177.58zM 223.902,351.597L 192.104,351.597L 192.104,287.997L 128.503,287.997L 128.503,256.203L 192.104,256.203L 192.104,192.604L 223.902,192.604L 223.902,256.203L 287.501,256.203L 287.501,287.997L 223.902,287.997 z" /> +<glyph unicode="" d="M 466.996,351.685c-3.893,12.271-9.538,21.313-21.31,21.313c0.00,0.00-80.181,11.00-189.351,11.00c-109.169,0.00-188.677-11.00-188.677-11.00 + c-11.77,0.00-16.889-8.316-21.313-21.313c0.00,0.00-13.67-31.687-13.67-127.685s 13.67-131.685, 13.67-131.685 + c 5.282-11.107, 9.543-21.313, 21.313-21.313c0.00,0.00, 92.343-7.00, 188.34-7.00s 189.688,9.00, 189.688,9.00c 11.771,0.00, 18.218,10.248, 21.31,21.313 + c0.00,0.00, 13.00,49.185, 13.00,129.185S 466.996,351.685, 466.996,351.685z M 192.002,134.882L 192.002,313.118 L 346.358,224.00L 192.002,134.882z" /> +<glyph unicode="" d="M 259.559,206.271L 198.73,29.528c 18.165-5.344, 37.372-8.263, 57.27-8.263c 23.607,0.00, 46.25,4.077, 67.32,11.492 + c-0.539,0.868-1.039,1.793-1.451,2.795L 259.559,206.271z M 392.855,234.231c0.00,25.062-9.006,42.404-16.719,55.904 + c-10.273,16.708-19.912,30.844-19.912,47.551c0.00,18.63, 14.131,35.979, 34.045,35.979c 0.896,0.00, 1.754-0.108, 2.625-0.165 + c-36.064,33.048-84.119,53.225-136.896,53.225c-70.82,0.00-133.128-36.34-169.375-91.37c 4.757-0.153, 9.241-0.244, 13.044-0.244 + c 21.196,0.00, 54.027,2.576, 54.027,2.576c 10.929,0.639, 12.213-15.416, 1.30-16.707c0.00,0.00-10.985-1.282-23.198-1.929l 73.815-219.589 + l 44.372,133.051l-31.584,86.541c-10.92,0.645-21.262,1.926-21.262,1.926c-10.927,0.646-9.646,17.347, 1.288,16.707 + c0.00,0.00, 33.47-2.576, 53.39-2.576c 21.199,0.00, 54.031,2.576, 54.031,2.576c 10.93,0.64, 12.217-15.414, 1.297-16.707 + c0.00,0.00-11.00-1.281-23.203-1.926l 73.262-217.916l 20.23,67.559C 386.182,196.747, 392.855,216.881, 392.855,234.231z M 357.918,48.78 + c 60.27,35.14, 100.803,100.438, 100.803,175.227c0.00,35.246-9.004,68.381-24.83,97.254c 0.871-6.455, 1.365-13.382, 1.365-20.847 + c0.00-20.563-3.854-43.688-15.416-72.608L 357.918,48.78z M 53.28,224.007c0.00-80.24, 46.624-149.592, 114.259-182.448l-96.705,264.95 + C 59.581,281.298, 53.28,253.397, 53.28,224.007z M 255.996-19.985c-134.53,0.00-243.98,109.457-243.98,243.993 + c0.00,134.527, 109.448,243.978, 243.98,243.978c 134.528,0.00, 243.988-109.449, 243.988-243.978 + C 499.986,89.472, 390.526-19.985, 255.996-19.985z" /> +<glyph unicode="" d="M 511.998,192.10L 224.002,192.10L 224.002,7.489L 511.998-32.01 + zM 192.002,192.10L-0.012,192.10L-0.012,39.671L 192.002,10.416 + zM 192.002,406.668L-0.012,377.284L-0.012,223.598L 192.002,223.598 + zM 511.998,223.598L 511.998,447.50L 224.002,409.463L 224.002,223.598 + z" /> +<glyph unicode="" d="M 206.569,224.042c-23.637,12.147-46.615,18.31-68.313,18.31c-2.951,0.00-5.921-0.088-8.892-0.35 + c-27.686-2.292-52.974-9.595-69.239-15.273c-4.314-1.584-8.736-3.258-13.292-5.106L 2.331,67.344 + c 30.569,11.313, 57.616,16.814, 82.378,16.814c 40.054,0.00, 69.128-14.966, 93.14-30.373c 11.376,38.604, 38.667,131.833, 46.812,159.694 + C 218.738,217.089, 212.731,220.697, 206.569,224.042z M 264.10,184.824l-44.812-155.644c 13.294-7.615, 58.017-31.732, 92.259-31.732 + c 27.641,0.00, 58.588,7.082, 94.547,21.695l 42.786,149.614c-29.05-9.375-56.915-14.131-82.97-14.131 + C 318.371,154.627, 285.096,170.035, 264.10,184.824z M 147.409,294.954c 38.208-0.396, 66.464-14.967, 89.882-29.976l 45.954,157.227 + c-9.685,5.547-35.081,19.369-53.438,24.079c-12.082,2.816-24.782,4.269-38.251,4.269c-25.663-0.483-53.701-6.909-85.657-19.719 + L 62.082,276.949c 32.109,12.107, 59.773,18.005, 85.259,18.005C 147.364,294.954, 147.409,294.954, 147.409,294.954z M 509.669,379.509 + c-29.14-11.313-57.575-17.076-84.735-17.076c-45.426,0.00-78.922,15.756-100.623,30.899l-45.556-157.67 + c 30.592-19.672, 63.561-29.666, 98.158-29.666c 28.215,0.00, 57.442,6.776, 86.933,20.158l-0.091,1.102l 1.851,0.438L 509.669,379.509z" /> +<glyph unicode="" d="M 497.573,54.108L 268.433,440.634c-2.945,5.237-8.634,8.138-14.595,7.183c-4.403-0.699-8.153-3.409-10.269-7.183 + L 14.429,54.108c-2.514-4.467-2.518-10.199,0.00-14.646c 2.553-4.506, 7.277-7.46, 12.423-7.46l 458.294,0.00 + c 5.135,0.00, 9.876,2.954, 12.428,7.46C 500.087,43.909, 500.087,49.642, 497.573,54.108z M 61.171,64.149L 256.00,395.105 + l 194.557-330.956L 61.171,64.149 zM 257.251,138.854c-13.655,0.00-24.724-11.319-24.724-25.289c0.00-13.971, 11.068-25.29, 24.724-25.29 + s 24.724,11.319, 24.724,25.29C 281.975,127.535, 270.906,138.854, 257.251,138.854zM 239.835,160.002L 272.693,160.002L 279.811,319.998L 232.729,319.998 z" /> +<glyph unicode="" d="M 428.26,271.336c-17.425,0.00-164.791,0.00-164.791,0.00s 12.625,48.421, 17.183,81.404 + c 4.653,33.547-5.064,60.663-5.064,60.663s-16.546,42.303-21.052,44.116c-27.224,10.979-41.333-4.307-41.333-4.307 + s0.00-62.789,0.00-71.317c0.00-7.919-1.445-13.601-1.445-13.601s-68.23-106.349-76.179-114.113 + c-7.955-7.778-39.428-22.117-39.428-22.117s0.00-175.948,0.00-192.961c 1.949-3.057, 33.037,1.104, 33.831-5.85 + c 0.788-6.943, 35.429-33.252, 35.429-33.252s 163.579,0.00, 181.953,0.00s 49.90,8.939, 54.987,20.781 + c 8.712,20.289-2.082,33.68-1.728,39.291c 0.357,5.609, 27.639,9.498, 27.639,33.52c 3.612,29.285-14.391,27.271-13.421,34.07 + c 0.98,6.801, 22.257,9.203, 26.379,24.717c 3.155,11.947, 5.866,34.635-12.967,44.708 + C 490.329,218.555, 458.143,271.336, 428.26,271.336z" /> +<glyph unicode="" d="M 428.26,250.91c 18.83,10.072, 16.122,32.761, 12.968,44.708c-4.123,15.515-25.402,17.917-26.38,24.717 + c-0.973,6.799, 17.033,4.783, 13.421,34.069c0.00,24.023-27.281,27.912-27.636,33.521c-0.354,5.609, 10.437,19.003, 1.725,39.29 + c-5.087,11.844-36.612,20.782-54.987,20.782c-18.374,0.00-181.953,0.00-181.953,0.00s-34.638-26.308-35.429-33.25 + c-0.794-6.955-31.882-2.792-33.831-5.85c0.00-17.015,0.00-192.964,0.00-192.964s 31.474-14.338, 39.428-22.117 + c 7.948-7.764, 76.183-114.111, 76.183-114.111s 1.441-5.684, 1.441-13.60c0.00-8.529,0.00-71.318,0.00-71.318 + s 14.109-15.285, 41.333-4.309c 4.508,1.814, 21.053,44.117, 21.053,44.117s 9.718,27.115, 5.067,60.66 + c-4.559,32.984-17.187,81.404-17.187,81.404s 147.366,0.00, 164.792,0.00C 458.143,176.662, 490.329,229.444, 428.26,250.91z" /> +<glyph unicode="" d="M 479.194,328.27c-25.192-141.915-165.958-262.095-208.297-289.552c-42.348-27.455-80.973,10.994-94.983,40.054 + c-16.035,33.166-64.104,212.868-76.683,227.765c-12.585,14.866-50.354-14.896-50.354-14.896L 30.56,315.658 + c0.00,0.00, 76.695,91.58, 135.047,103.026c 61.872,12.141, 61.781-95.006, 76.663-154.485c 14.389-57.542, 24.063-90.471, 36.626-90.471 + c 12.591,0.00, 36.636,32.096, 62.947,81.286c 26.363,49.242-1.139,92.74-52.649,61.791C 309.804,440.436, 504.375,470.161, 479.194,328.27z" /> +<glyph unicode="" d="M 352.264,277.059l0.00-106.112 L 480.00,95.498L 480.00,351.497 L 352.264,277.059z M 299.569,351.497L 53.988,351.497 + c-11.77,0.00-21.313-9.542-21.313-21.313l0.00-212.869 c0.00-11.771, 9.543-21.313, 21.313-21.313l 245.581,0.00 + c 11.771,0.00, 21.31,9.537, 21.31,21.313L 320.879,330.184 C 320.876,341.955, 311.341,351.497, 299.569,351.497" /> +<glyph unicode="" d="M 412.316,125.949c-20.918,8.813-76.904,30.871-82.859,32.495c-7.107,4.888-14.07,21.151-17.877,29.236 + c-3.789,0.544-7.574,1.087-11.377,1.624c 0.586,12.514, 8.334,13.182, 11.377,22.742c 2.676,8.432, 0.279,19.387, 4.527,27.197 + c 2.945,5.422, 9.617,5.457, 12.949,10.104c 3.02,4.216, 5.016,11.567, 5.955,16.732c 1.715,9.441, 3.217,22.354-1.268,31.716 + c-2.57,5.38-4.199,5.897-4.918,12.426c-0.867,7.914, 2.332,33.72, 2.467,39.30c 0.326,14.477-0.025,15.654-3.527,29.754 + c0.00,0.00-4.254,12.773-10.924,16.631L 303.547,398.20l-8.217,7.615c-33.106,20.365-68.602,6.081-87.613-1.623 + c-27.389-8.893-44.709-35.711-32.618-93.018c 2.063-9.789-5.361-14.164-4.877-19.502c 1.062-11.678, 1.287-39.758, 12.322-46.672 + c 1.024-0.642, 8.854-2.605, 8.803-2.068c 1.085-11.375, 2.167-22.754, 3.247-34.125c 2.756-7.553, 9.366-8.383, 11.288-19.063 + l-8.459-2.063c-3.802-8.085-10.771-24.341-17.876-29.236c-5.955-1.624-61.941-23.683-82.861-32.495 + c-19.05-8.036-34.543-21.347-34.543-47.359c0.00-26.015-0.388-29.216-0.058-45.959l 384.914-0.918 + c0.00,17.815, 0.059,33.315, 0.059,46.877C 447.057,102.137, 431.367,117.913, 412.316,125.949zM 493.723,177.562c-11.002,4.635-40.446,16.237-43.581,17.091c-3.737,2.57-7.399,11.124-9.401,15.376 + c-1.993,0.286-3.983,0.572-5.983,0.854c 0.307,6.581, 4.383,6.934, 5.983,11.961c 1.407,4.434, 0.147,10.197, 2.382,14.305 + c 1.55,2.852, 5.058,2.87, 6.812,5.314c 1.587,2.218, 2.638,6.084, 3.131,8.80c 0.901,4.966, 1.691,11.758-0.667,16.682 + c-1.353,2.829-2.208,3.101-2.585,6.535c-0.459,4.163, 1.225,17.735, 1.297,20.67c 0.171,7.615-0.013,8.233-1.856,15.649 + c0.00,0.00-2.236,6.718-5.746,8.748l-6.99,1.206l-4.322,4.005c-17.412,10.711-36.081,3.198-46.081-0.854 + c-14.404-4.677-23.515-18.782-17.154-48.923c 1.085-5.148-2.82-7.45-2.566-10.257c 0.559-6.143, 0.676-20.912, 6.481-24.548 + c 0.538-0.337, 4.655-1.37, 4.629-1.087c 0.571-5.983, 1.14-11.967, 1.708-17.947c 1.449-3.973, 4.927-4.409, 5.938-10.027l-4.448-1.085 + c-2.00-4.252-5.665-12.802-9.402-15.376c-1.837-0.501-12.729-4.70-23.643-9.022c-2.173-0.861, 2.669-8.846, 14.237-12.501 + c 40.043-12.647, 94.992-44.956, 94.992-44.956l 55.079-0.176c0.00,9.37, 0.032,17.522, 0.032,24.655 + C 511.996,165.037, 503.744,173.335, 493.723,177.562zM 18.275,177.562c 11.002,4.635, 40.447,16.237, 43.581,17.091c 3.738,2.57, 7.40,11.124, 9.402,15.376 + c 1.993,0.286, 3.983,0.572, 5.983,0.854c-0.307,6.581-4.383,6.934-5.983,11.961c-1.407,4.434-0.147,10.197-2.382,14.305 + c-1.549,2.852-5.058,2.87-6.811,5.314c-1.588,2.218-2.639,6.084-3.132,8.80c-0.902,4.966-1.691,11.758, 0.667,16.682 + c 1.353,2.829, 2.209,3.101, 2.586,6.535c 0.458,4.163-1.227,17.735-1.297,20.67c-0.171,7.615, 0.013,8.233, 1.856,15.649 + c0.00,0.00, 2.237,6.718, 5.746,8.748l 6.992,1.206l 4.321,4.005c 17.413,10.711, 36.082,3.198, 46.081-0.854 + c 14.405-4.677, 23.515-18.782, 17.155-48.923c-1.085-5.148, 2.82-7.45, 2.565-10.257c-0.559-6.143-0.676-20.912-6.48-24.548 + c-0.539-0.337-4.657-1.37-4.63-1.087c-0.571-5.983-1.141-11.967-1.708-17.947c-1.449-3.973-4.926-4.409-5.937-10.027l 4.449-1.085 + c 2.00-4.252, 5.665-12.802, 9.402-15.376c 1.837-0.501, 12.729-4.70, 23.642-9.022c 2.174-0.861-2.667-8.846-14.237-12.501 + c-40.042-12.647-94.991-44.956-94.991-44.956l-55.081-0.176c0.00,9.37-0.031,17.522-0.031,24.655 + C 0.002,165.037, 8.254,173.335, 18.275,177.562z" /> +<glyph unicode="" d="M 461.996,351.998L 273.498,351.998 L 238.50,351.998 L 50.002,351.998 c-9.941,0.00-18.00-8.059-18.00-18.00l0.00-251.996 c0.00-9.941, 8.059-18.00, 18.00-18.00c0.00,0.00, 60.537,0.00, 67.082,0.00 + s 10.918,4.455, 10.918,10.824c0.00,4.139,0.00,8.244,0.00,10.467c0.00,5.588-4.325,10.721-9.813,10.721c-3.684,0.00-7.893,0.00-11.67,0.00 + c-6.102,0.00-10.514,4.307-10.514,10.203c0.00,4.529,0.00,5.345,0.00,11.125s 3.349,10.66, 10.514,10.66c 3.366,0.00, 17.463,0.00, 33.267,0.00 + c 2.776,0.00, 5.604,0.00, 8.437,0.00c 15.804,0.00, 29.90,0.00, 33.267,0.00c 7.165,0.00, 10.514-4.88, 10.514-10.66s0.00-6.596,0.00-11.125 + c0.00-5.896-4.412-10.203-10.514-10.203c-3.777,0.00-7.986,0.00-11.67,0.00c-5.488,0.00-9.813-5.133-9.813-10.721c0.00-2.119,0.00-5.949,0.00-9.889 + c0.00-4.417, 3.161-11.402, 9.888-11.402c 2.066,0.00, 30.587,0.00, 69.107,0.00c 11.868,0.00, 23.317,0.00, 33.999,0.00c 38.52,0.00, 67.04,0.00, 69.106,0.00 + c 6.727,0.00, 9.888,6.985, 9.888,11.402c0.00,3.939,0.00,7.77,0.00,9.889c0.00,5.588-4.325,10.721-9.813,10.721c-3.684,0.00-7.893,0.00-11.67,0.00 + c-6.102,0.00-10.514,4.307-10.514,10.203c0.00,4.529,0.00,5.345,0.00,11.125s 3.349,10.66, 10.514,10.66c 3.366,0.00, 17.463,0.00, 33.267,0.00 + c 2.833,0.00, 5.66,0.00, 8.437,0.00c 15.804,0.00, 29.90,0.00, 33.267,0.00c 7.165,0.00, 10.514-4.88, 10.514-10.66s0.00-6.596,0.00-11.125 + c0.00-5.896-4.412-10.203-10.514-10.203c-3.777,0.00-7.986,0.00-11.67,0.00c-5.488,0.00-9.813-5.133-9.813-10.721c0.00-2.223,0.00-6.328,0.00-10.467 + c0.00-6.369, 4.373-10.824, 10.918-10.824s 67.082,0.00, 67.082,0.00c 9.941,0.00, 18.00,8.059, 18.00,18.00L 480.00,333.998 + C 479.996,343.938, 471.938,351.998, 461.996,351.998z M 222.797,160.861l-7.598,0.00 c 0.001,6.537, 0.022,12.242, 0.022,17.241 + c0.00,8.832-5.885,14.749-13.03,17.763c-7.848,3.307-28.846,11.579-31.08,12.188c-2.667,1.834-5.28,7.935-6.706,10.968 + c-1.421,0.203-2.84,0.407-4.267,0.607c 0.219,4.693, 3.126,4.947, 4.267,8.532c 1.003,3.162, 0.104,7.271, 1.698,10.20 + c 1.105,2.035, 3.607,2.048, 4.858,3.791c 1.131,1.582, 1.881,4.339, 2.232,6.277c 0.645,3.541, 1.208,8.384-0.474,11.896 + c-0.965,2.017-1.576,2.211-1.846,4.66c-0.325,2.97, 0.875,12.648, 0.926,14.742c 0.122,5.431-0.01,5.872-1.323,11.16 + c0.00,0.00-1.596,4.792-4.098,6.238l-4.986,0.86l-3.082,2.856c-12.417,7.638-25.731,2.281-32.863-0.608 + c-10.272-3.336-16.77-13.396-12.234-34.89c 0.774-3.672-2.011-5.313-1.829-7.315c 0.397-4.38, 0.482-14.913, 4.622-17.506 + c 0.383-0.24, 3.32-0.977, 3.301-0.776c 0.407-4.266, 0.813-8.535, 1.219-12.799c 1.033-2.833, 3.513-3.144, 4.233-7.149l-3.172-0.774 + c-1.427-3.033-4.041-9.13-6.706-10.968c-2.233-0.608-23.233-8.881-31.08-12.188c-7.145-3.014-12.956-8.007-12.956-17.763 + c0.00-9.759-0.145-10.958-0.022-17.239l 0.818-0.002l-7.482,0.00 L 64.159,319.50 l 158.638,0.00 L 222.797,160.861 z M 447.996,192.002L 256.002,192.002 l0.00,20.896 l 191.994,0.00 + L 447.996,192.002 z M 447.996,234.831L 256.002,234.831 l0.00,20.896 l 191.994,0.00 L 447.996,234.831 z M 447.996,288.409L 256.002,288.409 L 256.002,319.50 l 191.994,0.00 L 447.996,288.409 z" /> +<glyph unicode="" d="M 341.438,405.093c 4.086-16.444, 4.494-17.816, 4.115-34.70c-0.157-6.507-3.89-36.603-2.878-45.832 + c 0.838-7.614, 2.737-8.217, 5.736-14.491c 5.229-10.918, 3.478-25.977, 1.478-36.987c-1.095-6.023-3.424-14.597-6.944-19.514 + c-3.886-5.418-11.666-5.459-15.102-11.782c-4.955-9.108-2.16-21.884-5.28-31.717 + c-3.549-11.149-12.585-11.928-13.267-26.521c 4.435-0.626, 8.848-1.26, 13.267-1.895c 4.439-9.428, 12.56-28.395, 20.848-34.095 + c 6.946-1.894, 72.235-27.618, 96.632-37.896c 22.216-9.371, 40.514-27.77, 40.514-55.229c0.00-15.816-0.068-33.892-0.068-54.668 + l-448.883,1.07c-0.385,19.526, 0.067,23.259, 0.067,53.598c0.00,30.335, 18.068,45.858, 40.284,55.229 + c 24.396,10.277, 89.688,36.002, 96.632,37.896c 8.287,5.709, 16.414,24.667, 20.848,34.095l 9.865,2.406 + c-2.241,12.455-9.95,13.424-13.164,22.231c-1.259,13.261-2.521,26.53-3.787,39.795c 0.059-0.626-9.072,1.665-10.267,2.413 + c-12.869,8.063-13.131,40.81-14.369,54.429c-0.565,6.225, 8.094,11.327, 5.688,22.743 + C 149.30,392.502, 169.50,423.777, 201.44,434.148c 22.171,8.984, 63.565,25.642, 102.174,1.893l 9.581-8.88l 15.504-2.673 + C 336.478,419.988, 341.438,405.093, 341.438,405.093" /> +<glyph unicode="" d="M 388.92,302.163c-7.027,0.00-13.911-0.609-20.617-1.732c-16.737,54.689-68.557,94.554-129.936,94.554 + c-74.919,0.00-135.636-59.366-135.636-132.605c0.00-6.534, 0.51-12.956, 1.446-19.247c-3.597,0.413-7.228,0.692-10.935,0.692 + c-50.938,0.00-92.237-40.385-92.237-90.168c0.00-49.81, 41.299-90.174, 92.237-90.174l 130.76,0.00 l0.00,64.52 l-56.678,0.00 l 89.248,117.308 + l 89.245-117.308L 288.00,128.003 l0.00-64.519 l 100.921,0.00 c 67.425,0.00, 122.069,53.43, 122.069,119.339 + C 510.992,248.735, 456.348,302.163, 388.92,302.163z" /> +<glyph unicode="" d="M 384.00,256.00L 256.00,384.00L 128.00,256.00L 384.00,256.00 z M 128.00,160.00l 128.00-128.00l 128.00,128.00L 128.00,160.00 z" /> +<glyph unicode="" d="M 202.56,278.828l-55.689,55.691c 28.066,27.734, 66.521,44.819, 109.13,44.819 + c 42.994-0.015, 81.616-17.334, 109.84-45.497c 28.158-28.218, 45.479-66.842, 45.492-109.847l 67.541,0.00 + C 478.85,347.104, 379.10,446.855, 255.998,446.88c-61.131,0.00-116.631-24.702-156.896-64.598L 47.707,433.679l 0.003-154.851L 202.56,278.828 z + M 366.408,114.775c-28.175-28.492-67.166-46.114-110.409-46.105c-43.007,0.008-81.625,17.331-109.841,45.492 + c-28.173,28.214-45.483,66.832-45.50,109.832L 33.126,223.994 c 0.018-123.10, 99.767-222.846, 222.873-222.874 + c 61.783,0.008, 117.812,25.24, 158.173,65.894l 50.007-50.011L 464.179,168.10 L 313.086,168.10 L 366.408,114.775z" /> +<glyph unicode="" d="M 402.127,223.999l-38.709,0.00 L 199.585,223.999 l-0.003,72.491c0.00,28.30-10.741,54.276-28.521,73.284 + c-17.706,19.012-43.014,31.258-70.917,31.235c-27.905,0.022-53.211-12.224-70.917-31.235 + c-17.785-19.008-28.521-44.985-28.522-73.285l0.00-73.395 l 51.881,0.00 l0.00,11.458 L 22.26,264.875l 30.322,0.00 l0.00,31.613 + c0.00,15.106, 5.712,28.409, 14.524,37.845c 8.897,9.432, 20.351,14.772, 33.035,14.793c 12.688-0.021, 24.13-5.361, 33.027-14.793 + c 8.823-9.436, 15.436-22.738, 15.432-37.845l0.00-72.49 l-0.021,0.00 l-38.708,0.00 c-7.66,0.00-13.869-6.206-13.869-13.865l0.00-164.199 + c0.00-7.66, 6.209-13.869, 13.869-13.869l 292.255,0.00 c 7.665,0.00, 13.869,6.209, 13.869,13.869L 415.995,210.132 + C 415.996,217.793, 409.792,223.999, 402.127,223.999z" /> +<glyph unicode="" d="M 224.00,92.186L 224.00-32.00 L 32.00,160.00l 192.00,192.00l0.00-126.912 C 447.375,219.848, 437.794,376.984, 380.931,480.00 + C 521.285,328.293, 491.48,85.215, 224.00,92.186z" /> +<glyph unicode="" d="M 79.536,313.536c 26.688,0.00, 48.317,21.619, 48.317,48.307c0.00,26.688-21.633,48.308-48.317,48.308 + c-26.688,0.00-48.321-21.621-48.321-48.308C 31.215,335.156, 52.849,313.536, 79.536,313.536z M 80.632,273.397 + c-26.688,0.00-48.321-21.633-48.321-48.307c0.00-26.688, 21.634-48.32, 48.321-48.32c 26.661,0.00, 48.294,21.633, 48.294,48.32 + C 128.927,251.764, 107.293,273.397, 80.632,273.397z M 79.536,134.49c-26.688,0.00-48.321-21.633-48.321-48.32 + s 21.634-48.321, 48.321-48.321c 26.687,0.00, 48.317,21.636, 48.317,48.321C 127.856,112.857, 106.224,134.49, 79.536,134.49z + M 479.93,401.18L 179.733,401.18 l0.00-82.189 L 479.93,318.991 L 479.93,401.18 z M 179.733,44.587l 301.051,0.00 l0.00,83.06 L 179.733,127.647 L 179.733,44.587 z M 179.733,264.546l0.00-83.045 + l 301.051,0.00 l0.00,83.045 L 179.733,264.546 z" /> +<glyph unicode="" d="M 512.00,382.791c-18.839-8.354-39.082-14.001-60.33-16.54c 21.686,13.00, 38.343,33.585, 46.186,58.115 + c-20.298-12.039-42.778-20.78-66.705-25.49c-19.16,20.415-46.461,33.17-76.673,33.17c-58.011,0.00-105.044-47.029-105.044-105.039 + c0.00-8.233, 0.929-16.25, 2.72-23.939c-87.30,4.382-164.70,46.20-216.509,109.753c-9.042-15.514-14.223-33.558-14.223-52.809 + c0.00-36.444, 18.544-68.596, 46.729-87.433c-17.219,0.546-33.416,5.271-47.576,13.139c-0.011-0.438-0.011-0.878-0.011-1.321 + c0.00-50.894, 36.209-93.348, 84.262-103.00c-8.813-2.399-18.095-3.686-27.675-3.686c-6.769,0.00-13.349,0.66-19.764,1.886 + c 13.368-41.729, 52.16-72.103, 98.126-72.948c-35.95-28.174-81.243-44.967-130.458-44.967c-8.479,0.00-16.84,0.497-25.058,1.471 + c 46.485-29.806, 101.701-47.197, 161.021-47.197c 193.211,0.00, 298.868,160.063, 298.868,298.872c0.00,4.554-0.104,9.084-0.305,13.59 + C 480.109,343.227, 497.918,361.727, 512.00,382.791z" /> +<glyph unicode="" d="M 442.164,448.415l-141.789-0.003L 34.382,183.809l 183.987-183.992l 261.465,261.466L 479.834,410.746 L 442.164,448.415z + M 431.832,346.733c-14.828-14.833-38.88-14.833-53.709,0.00c-14.834,14.827-14.834,38.876,0.00,53.707 + c 14.826,14.839, 38.881,14.839, 53.709,0.004C 446.664,385.61, 446.665,361.559, 431.832,346.733" /> +<glyph unicode="" d="M 63.50,416.50l 385.00,0.00 l0.00-385.00 l-385.00,0.00 L 63.50,416.50 z" /> +<glyph unicode="" d="M 256.004,377.987l 47.684-99.429c 4.326-9.021, 12.865-15.292, 22.768-16.721l 91.258-13.162l-64.933-67.069 + c-6.173-6.376-9.206-15.158-8.284-23.984l 10.294-98.526l-82.57,52.256c-4.80,3.038-10.363,4.65-16.044,4.65l-0.304,0.00 + L 256.004,377.987 M 256.006,447.361L 181.263,291.53L 31.897,271.076l 105.769-110.336l-16.769-159.911l 134.975,85.174 + c 0.11,0.00, 0.177,0.00, 0.304,0.00l 134.885-85.363l-16.727,160.101l 105.769,109.248L 330.737,291.53L 256.006,447.361L 256.006,447.361z" /> +<glyph unicode="" d="M 256.004,377.987l 47.684-99.429c 4.326-9.021, 12.865-15.292, 22.768-16.721l 91.258-13.162l-64.933-67.069 + c-6.173-6.376-9.206-15.158-8.284-23.984l 10.294-98.526l-82.57,52.256c-4.80,3.038-10.363,4.65-16.044,4.65l-0.304,0.00 + c-5.667,0.00-11.218-1.605-16.01-4.629l-82.68-52.174l 10.32,98.411c 0.92,8.778-2.072,17.518-8.18,23.889L 94.29,249.34 + l 91.043,12.468c 9.987,1.368, 18.62,7.66, 22.979,16.749L 256.004,377.987 M 256.006,447.361L 181.263,291.53L 31.897,271.076 + l 105.769-110.336l-16.769-159.911l 134.975,85.174c 0.11,0.00, 0.177,0.00, 0.304,0.00l 134.885-85.363l-16.727,160.101l 105.769,109.248 + L 330.737,291.53L 256.006,447.361L 256.006,447.361z" /> +<glyph unicode="" d="M 391.061,0.639l-16.727,160.101l 105.769,109.248L 330.737,291.53L 256.006,447.361L 181.263,291.53L 31.897,271.076 + l 105.769-110.336l-16.769-159.911l 134.975,85.174c 0.11,0.00, 0.177,0.00, 0.304,0.00L 391.061,0.639z" /> +<glyph unicode="" d="M 32.005,64.994L 96.50,64.994L 96.50,0.496L 32.005,0.496zM 32.005,160.745L 192.024,160.745L 192.024,96.248L 32.005,96.248zM 32.005,256.496L 288.00,256.496L 288.00,191.998L 32.005,191.998zM 32.005,352.247L 383.996,352.247L 383.996,287.75L 32.005,287.75zM 32.005,447.998L 479.996,447.998L 479.996,383.501L 32.005,383.501z" /> +<glyph unicode="" d="M 32.005,447.998L 96.50,447.998L 96.50,383.50L 32.005,383.50zM 32.005,352.247L 192.024,352.247L 192.024,287.749L 32.005,287.749zM 32.005,256.496L 288.00,256.496L 288.00,191.998L 32.005,191.998zM 32.005,160.744L 383.996,160.744L 383.996,96.247L 32.005,96.247zM 32.005,64.993L 479.996,64.993L 479.996,0.496L 32.005,0.496z" /> +<glyph unicode="" d="M 160.187,61.865c-16.125,0.00-29.188-13.065-29.188-29.19c0.00-16.127, 13.063-29.188, 29.188-29.188 + c 16.113,0.00, 29.188,13.062, 29.188,29.188C 189.372,48.80, 176.30,61.865, 160.187,61.865z M 255.917,61.865 + c-16.126,0.00-29.19-13.065-29.19-29.19c0.00-16.127, 13.064-29.188, 29.19-29.188c 16.108,0.00, 29.179,13.062, 29.179,29.188 + C 285.096,48.80, 272.028,61.865, 255.917,61.865z M 255.909,13.776c-10.436,0.00-18.894,8.459-18.894,18.891 + c0.00,10.447, 8.458,18.905, 18.894,18.905c 10.435,0.00, 18.892-8.458, 18.892-18.905 + C 274.801,22.235, 266.344,13.776, 255.909,13.776z M 32.479,416.00l0.00-320.00 l 449.247,0.00 L 481.726,416.00 L 32.479,416.00 z M 441.835,136.352L 73.713,136.352 + l-0.021,238.021l 366.813,0.00 l0.00-0.012 l 1.329,0.00 L 441.835,136.352L 441.835,136.352z M 351.763,61.865 + c-16.126,0.00-29.188-13.065-29.188-29.19c0.00-16.127, 13.063-29.188, 29.188-29.188c 16.112,0.00, 29.183,13.062, 29.183,29.188 + C 380.94,48.80, 367.875,61.865, 351.763,61.865z M 351.755,13.776c-10.436,0.00-18.894,8.459-18.894,18.891 + c0.00,10.447, 8.458,18.905, 18.894,18.905c 10.438,0.00, 18.896-8.458, 18.896-18.905 + C 370.646,22.235, 362.188,13.776, 351.755,13.776z" /> +<glyph unicode="" d="M 470.70,72.193l-2.688,2.688l 0.006,0.002L 360.505,182.408c 14.938,25.732, 23.612,55.564, 23.816,87.451 + c 0.626,97.615-77.986,177.243-175.599,177.857c-0.394,0.001-0.771,0.002-1.168,0.002 + c-97.06-0.006-176.063-78.391-176.688-175.598c-0.618-97.609, 77.999-177.236, 175.597-177.859 + c 0.389-0.002, 0.766-0.004, 1.155-0.004c 32.438,0.00, 62.846,8.79, 88.998,24.075l 107.415-107.433l 0.014,0.01l 2.688-2.688 + c 8.125-8.123, 21.293-8.114, 29.41,0.00l 34.562,34.557C 478.819,50.895, 478.822,64.07, 470.70,72.193z M 300.39,177.58 + c-24.834-24.67-57.78-38.252-92.768-38.252l-0.874,0.00 c-72.589,0.467-131.271,59.908-130.813,132.503 + c 0.465,72.128, 59.516,130.811, 131.626,130.815l 0.879-0.002c 35.168-0.22, 68.146-14.123, 92.852-39.148 + c 24.706-25.025, 38.188-58.178, 37.966-93.352C 339.031,235.128, 325.229,202.25, 300.39,177.58z" /> +<glyph unicode="" d="M 33.736,60.543A60.868,61.532 180.00 1,0 155.472,60.543000000000006A60.868,61.532 180.00 1,0 33.736,60.543000000000006zM 327.928-0.988l-86.229,0.00 c0.00,116.114-93.109,210.243-207.963,210.243l0.00,0.00l0.00,87.168 + C 196.222,296.423, 327.928,163.273, 327.928-0.988zM 388.798-0.988c0.00,198.244-158.96,358.949-355.062,358.949L 33.736,447.697 c 245.118,0.00, 443.826-200.885, 443.826-448.686L 388.798-0.989 + z" /> +<glyph unicode="" d="M 32.005,447.998L 479.996,447.998L 479.996,383.50L 32.005,383.50zM 32.005,352.247L 479.996,352.247L 479.996,287.749L 32.005,287.749zM 32.005,256.496L 479.996,256.496L 479.996,191.998L 32.005,191.998zM 32.005,160.744L 479.996,160.744L 479.996,96.247L 32.005,96.247zM 32.005,64.993L 479.996,64.993L 479.996,0.496L 32.005,0.496z" /> +<glyph unicode="" d="M 224.01,351.904l-67.942,0.00 L 256.012,472.979L 355.937,351.90l-67.932,0.00 l-0.001-255.803l 67.932,0.00 L 255.99-24.979 + l-99.927,121.076l 67.943,0.00 L 224.01,351.904z" /> +<glyph unicode="" d="M 383.904,255.996l0.00,67.942 l 121.074-99.944L 383.90,124.069l0.00,67.932 l-255.803,0.001l0.00-67.932 L 7.022,224.016 + l 121.076,99.926l0.00-67.943 L 383.904,255.996z" /> +<glyph unicode="" d="M 288.00,355.814L 288.00,480.00 l 192.00-192.00L 288.00,96.00L 288.00,222.912 C 64.625,228.153, 74.206,71.016, 131.069-32.00 + C-9.286,119.707, 20.52,362.785, 288.00,355.814z" /> +<glyph unicode="" d="M 346.842,54.611c 21.076,11.557, 39.271,26.125, 54.399,43.698c 15.199,17.575, 26.912,37.946, 35.285,61.009 + c 7.671,21.094, 11.471,40.729, 11.471,64.424c0.00,2.285-0.105,192.828-0.105,192.828L 256.00,416.57 l0.00-192.018 l 93.728,0.00 + c-0.599-26.107-5.876-45.195-15.728-63.121c-10.163-18.525-29.167-32.827-58.054-42.75l-3.201-1.092l0.00-85.777 l 5.313,0.703 + C 302.758,35.683, 325.696,43.07, 346.842,54.611M 51.917,118.301l-3.171-1.092l0.00-85.779 l 5.316,0.704c 24.666,3.168, 47.64,10.556, 68.791,22.097 + c 21.074,11.557, 39.229,26.125, 54.392,43.698c 15.206,17.575, 26.949,37.947, 35.288,61.01 + c 7.67,21.093, 11.469,40.728, 11.469,64.424c0.00,2.284-0.076,192.825-0.076,192.825L 32.005,416.188 l0.00-192.017 l 93.729,0.00 + c-0.563-26.107-5.872-45.194-15.724-63.122C 99.839,142.525, 80.804,128.223, 51.917,118.301" /> +<glyph unicode="" d="M 133.16,393.389c-21.076-11.557-39.271-26.125-54.399-43.698c-15.199-17.575-26.912-37.947-35.285-61.009 + c-7.671-21.094-11.471-40.728-11.471-64.423c0.00-2.285, 0.105-192.828, 0.105-192.828l 191.892,0.00 L 224.002,223.447 l-93.728,0.00 + c 0.599,26.107, 5.876,45.195, 15.728,63.122c 10.163,18.524, 29.167,32.827, 58.054,42.75l 3.201,1.091L 207.257,416.188 l-5.313-0.704 + C 177.244,412.317, 154.306,404.929, 133.16,393.389M 428.085,329.699l 3.171,1.091L 431.256,416.57 l-5.316-0.704c-24.666-3.168-47.64-10.555-68.791-22.097 + c-21.074-11.557-39.229-26.125-54.392-43.698c-15.206-17.576-26.949-37.947-35.288-61.01 + C 259.799,267.968, 256.00,248.334, 256.00,224.638c0.00-2.284, 0.076-192.825, 0.076-192.825l 191.921,0.00 L 447.997,223.829 l-93.729,0.00 + c 0.563,26.107, 5.872,45.195, 15.724,63.122C 380.163,305.475, 399.198,319.777, 428.085,329.699" /> +<glyph unicode="" d="M 461.998,287.998l-44.865,0.00 l0.00,74.991 l-85.277,85.21L 96.004,448.199 l0.00-160.201 l-46.00,0.00 c-9.941,0.00-18.00-8.059-18.00-18.00l0.00-187.996 + c0.00-9.941, 8.059-18.00, 18.00-18.00l 46.00,0.00 l0.00-64.50 l 321.128,0.00 l0.00,64.50 l 44.865,0.00 c 9.941,0.00, 18.00,8.059, 18.00,18.00L 479.997,269.998 + C 479.998,279.938, 471.939,287.998, 461.998,287.998z M 96.004,97.50L 64.255,97.50 l0.00,93.654 l0.00,0.848 l 31.749,0.00 L 96.004,97.50 z M 319.37,415.375 + l 64.453-63.377L 319.37,351.998 L 319.37,415.375 z M 383.998,32.002L 128.004,32.002 l0.00,160.00 l 255.994,0.00 L 383.998,32.002 z M 383.998,287.998L 128.004,287.998 l0.00,128.00 l 159.998,0.00 l0.00-96.00 + l 95.996,0.00 L 383.998,287.998 z M 448.298,97.50l-31.165,0.00 l0.00,94.502 l 30.118,0.00 l 1.047,0.00 L 448.298,97.50 zM 160.127,96.002L 351.50,96.002L 351.50,62.629L 160.127,62.629zM 160.127,161.437L 351.50,161.437L 351.50,128.064L 160.127,128.064z" /> +<glyph unicode="" d="M 427.182,320.352L 325.629,320.352 c 6.396,3.992, 12.695,8.69, 18.575,14.393c 30.401,29.163, 39.269,69.303, 19.804,89.555 + c-7.468,7.76-17.991,11.484-29.858,11.484c-19.118,0.00-41.686-9.681-60.437-27.676c-7.679-7.383-13.959-15.469-18.775-23.762 + c-4.834,8.293-11.11,16.378-18.793,23.762c-18.751,18.001-41.301,27.676-60.419,27.676c-11.881,0.00-22.435-3.724-29.903-11.484 + c-19.458-20.252-10.587-60.392, 19.814-89.555c 5.896-5.703, 12.166-10.401, 18.606-14.393L 84.818,320.352 L 64.002,320.352 l0.00-98.164 l 32.00,0.00 l0.00-222.048 l 319.994,0.00 + L 415.996,222.188 l 32.00,0.00 l0.00,98.164 L 427.182,320.352 z M 272.212,353.958c 2.513,11.443, 10.075,23.888, 20.734,34.136 + c 15.289,14.705, 31.298,19.919, 41.21,19.919c 2.606,0.00, 7.359-0.37, 9.83-2.943c 2.662-2.773, 3.327-8.961, 1.711-16.206 + c-2.525-11.47-10.088-23.908-20.733-34.146c-15.303-14.691-31.298-19.905-41.196-19.905c-2.607,0.00-7.359,0.383-9.845,2.943 + C 271.248,340.529, 270.61,346.714, 272.212,353.958z M 275.77,316.343l0.00-92.344 l-41.668,0.00 l0.00,92.344 L 275.77,316.343 z M 164.137,388.864 + c-1.599,7.244-0.954,13.432, 1.71,16.206c 2.481,2.573, 7.22,2.943, 9.872,2.943c 9.885,0.00, 25.894-5.214, 41.183-19.933 + c 10.659-10.241, 18.208-22.686, 20.73-34.122c 1.599-7.244, 0.954-13.429-1.724-16.202c-2.469-2.56-7.238-2.943-9.845-2.943 + c-9.892,0.00-25.867,5.214-41.183,19.905C 174.235,364.957, 166.672,377.394, 164.137,388.864z M 411.896,128.002L 275.77,128.002 l0.00-124.127 l-41.668,0.00 + L 234.102,128.002 L 100.935,128.002 l0.00,32.165 l 133.167,0.00 l0.00,46.00 l 41.668,0.00 l0.00-46.00 l 136.126,0.00 L 411.896,128.002 z" /> +<glyph unicode="" d="M 255.982,360.004L 418.982,128.01L 93.018,128.002 z" /> +<glyph unicode="" d="M 392.004,223.983L 160.01,386.982L 160.002,61.018 z" /> +<glyph unicode="" d="M 119.995,223.983L 351.988,386.982L 351.996,61.018 z" /> +<glyph unicode="" d="M 255.982,87.996L 418.982,319.99L 93.018,319.998 z" /> +<glyph unicode="" d="M 415.996,255.998L 287.998,255.998L 287.998,383.998L 224.002,383.998L 224.002,255.998L 96.002,255.998L 96.002,192.002L 224.002,192.002L 224.002,64.002L 287.998,64.002L 287.998,192.002L 415.996,192.002 z" /> +<glyph unicode="" d="M 96.002,451.331L 436.998,224.00L 96.002-3.331L 96.002,451.331 z" /> +<glyph unicode="" d="M 461.173,351.998L 351.786,351.998 l-25.911,53.007c0.00,0.00-5.165,10.993-18.42,10.993c-10.21,0.00-74.079,0.00-102.888,0.00 + c-14.414,0.00-19.231-10.909-19.231-10.909l-25.131-53.091L 49.372,351.998 c-9.941,0.00-18.00-8.06-18.00-18.00l0.00-251.736 c0.00-9.941, 8.059-18.00, 18.00-18.00l 411.801,0.00 + c 9.941,0.00, 18.00,8.059, 18.00,18.00L 479.173,333.998 C 479.173,343.938, 471.114,351.998, 461.173,351.998z M 255.271,105.43 + c-60.684,0.00-110.007,49.37-110.007,110.016c0.00,60.665, 49.339,110.012, 110.007,110.012c 60.656,0.00, 110.022-49.347, 110.022-110.012 + C 365.294,154.791, 315.928,105.43, 255.271,105.43zM 255.271,281.456c-36.397,0.00-66.007-29.597-66.007-66.01c0.00-36.39, 29.609-66.001, 66.007-66.001 + c 36.404,0.00, 66.008,29.611, 66.008,66.001C 321.279,251.859, 291.676,281.456, 255.271,281.456z" /> +<glyph unicode="" d="M 351.528,188.046c-6.412,3.971-16.018,2.871-21.464-2.468l-42.484-42.472 + c-5.434-5.339-14.086-5.339-19.425,0.00l-95.473,95.506c-5.345,5.346-5.345,14.079,0.00,19.424l 40.016,40.003 + c 5.353,5.346, 6.131,14.763, 1.798,20.933L 141.695,422.18c-4.299,6.164-12.724,7.372-18.626,2.676c0.00,0.00-56.792-45.067-56.792-86.471 + c0.00-169.442, 137.367-306.795, 306.795-306.795c 41.425,0.00, 81.708,76.009, 81.708,76.009c 3.542,6.666, 1.194,15.413-5.217,19.383 + L 351.528,188.046z" /> +<glyph unicode="" d="M 440.316,414.613c 12.849-6.288, 24.047-15.243, 32.251-26.241c 17.269-23.15, 22.118-54.686, 14.418-93.733 + c-7.78-39.513-25.208-72.868-50.583-97.022c-4.641-4.852-9.611-9.373-14.902-13.54c-27.178-21.401-61.498-32.714-99.254-32.714 + l-6.056,0.00 L 202.217,151.363 L 169.935,0.00l-66.212,0.00 l 5.043,23.15l 23.064,0.00 l 32.281,151.363l 94.136,0.00 c 90.124,0.00, 165.469,55.538, 185.629,149.967 + C 466.736,431.398, 390.076,480.00, 324.171,480.00L 99.532,480.00 L0.00,23.15l 76.016,0.00 L 64.00-32.00l 131.83,0.00 l 32.281,151.363l 94.135,0.00 + c 90.125,0.00, 165.47,55.539, 185.63,149.968C 524.733,348.171, 487.474,395.297, 440.316,414.613z M 211.172,386.959l 64.565,0.00 + c 32.296,0.00, 53.801-27.769, 44.394-62.478c-8.068-34.72-41.693-62.488-75.32-62.488l-61.879,0.00 L 211.172,386.959z" /> +<glyph unicode="" d="M 96.002,415.333l 96.00,0.00 l0.00-382.667 l-96.00,0.00 L 96.002,415.333 z M 321.413,415.333l 94.583,0.00 l0.00-382.667 l-94.583,0.00 L 321.413,415.333 z" /> +<glyph unicode="" d="M 68.436,311.144l 22.881,0.00 L 91.317,424.772 L 72.669,424.772 c0.00-0.991-0.271-2.505-0.857-4.541c-0.991-3.39-2.465-6.122-4.367-8.158 + c-2.813-2.975-6.479-4.957-10.958-5.948c-2.813-0.63-7.739-1.099-14.763-1.42l0.00-15.192 l 26.712,0.00 L 68.436,311.144 z M 64.685,219.003 + c-11.843-8.466-19.345-16.45-22.532-24.032c-3.296-6.726-5.033-14.174-5.252-22.318l 77.729,0.00 l0.00,19.666 L 65.09,192.319 + c 1.393,2.357, 3.135,4.396, 5.197,6.162c 2.063,1.795, 5.895,4.662, 11.49,8.627l 8.926,6.324 + c 7.525,5.33, 12.938,10.153, 16.233,14.494c 5.01,6.523, 7.528,13.985, 7.528,22.385c0.00,10.959-3.563,19.76-10.663,26.404 + c-7.101,6.658-16.666,9.98-28.669,9.98c-15.191,0.00-25.774-5.653-31.723-16.986c-3.139-5.948-4.876-13.745-5.251-23.391 + l 21.675,0.00 c 0.269,6.363, 1.099,10.999, 2.492,13.933c 2.465,5.051, 7.069,7.582, 13.879,7.582c 4.956,0.00, 8.761-1.594, 11.413-4.769 + c 2.648-3.188, 3.988-7.167, 3.988-11.977c0.00-5.895-2.331-11.32-6.966-16.276C 81.618,231.623, 74.974,226.358, 64.685,219.003z + M 110.151,86.539c-4.18,3.832-7.364,5.732-9.592,5.732c 2.947,1.146, 5.813,3.297, 8.547,6.432 + c 4.341,5.037, 6.515,11.199, 6.515,18.514c0.00,10.344-3.617,18.567-10.905,24.73c-7.261,6.135-16.825,9.217-28.722,9.217 + c-6.381,0.00-11.789-0.777-16.156-2.331c-4.396-1.526-8.198-3.778-11.391-6.672c-4.283-4.126-7.422-8.601-9.431-13.45 + c-1.876-5.546-2.947-11.413-3.162-17.576l 22.801,0.00 c-0.104,6.109, 1.183,10.985, 3.889,14.656s 6.938,5.492, 12.70,5.492 + c 5.01,0.00, 8.896-1.50, 11.651-4.447c 2.759-3.001, 4.152-6.859, 4.152-11.574c0.00-7.342-2.706-12.164-8.118-14.576 + c-3.135-1.439-8.654-2.189-16.558-2.304l0.00-17.495 c 8.063,0.00, 13.981-0.771, 17.764-2.305c 6.591-2.76, 9.913-8.199, 9.913-16.371 + c0.00-6.162-1.795-10.904-5.358-14.20c-3.563-3.269-7.717-4.896-12.513-4.896c-7.823,0.00-13.209,2.974-16.156,8.976 + c-1.604,3.271-2.411,7.396-2.411,12.354L 33.632,64.445 c 0.402-9.893, 2.385-17.87, 6.002-23.979 + c 6.832-11.494, 19.05-17.228, 36.625-17.228c 14.254,0.00, 25.025,3.985, 32.312,11.943c 7.288,7.957, 10.936,17.20, 10.936,27.73 + C 119.503,72.90, 116.368,80.777, 110.151,86.539z M 480.145,401.296L 179.949,401.296 l0.00-82.189 l 300.188,0.00 L 480.145,401.296L 480.145,401.296z + M 179.949,44.703L 481.00,44.703 l0.00,83.059 L 179.949,127.762 L 179.949,44.703 z M 179.949,264.663l0.00-83.045 L 481.00,181.618 l0.00,83.045 L 179.949,264.663 z" /> +<glyph unicode="" d="M 409.947,370.39c-12.927,12.917-33.873,12.917-46.794,0.00c-12.92-12.922-12.92-33.87,0.00-46.794l0.00,0.006 + c 29.647-29.682, 44.347-68.266, 44.382-107.154c-0.035-38.892-14.729-77.478-44.382-107.157 + c-29.673-29.648-68.26-44.339-107.149-44.376c-38.896,0.037-77.481,14.731-107.146,44.376 + c-29.653,29.68-44.353,68.266-44.389,107.157c 0.036,38.894, 14.731,77.472, 44.384,107.148 + c 12.919,12.919, 12.926,33.869, 0.005,46.789c-12.92,12.923-33.869,12.923-46.79,0.006 + c-42.455-42.423-63.812-98.336-63.771-153.942c-0.037-55.606, 21.315-111.52, 63.771-153.944 + c 42.419-42.446, 98.332-63.802, 153.938-63.766l 0.142,0.00 c 55.563-0.002, 111.409,21.35, 153.80,63.766 + c 42.444,42.425, 63.813,98.338, 63.767,153.944C 473.751,272.053, 452.394,327.963, 409.947,370.39zM 256.704,191.357c 18.271,0.00, 33.085,14.812, 33.085,33.083L 289.789,413.278 c0.00,18.271-14.813,33.085-33.085,33.085 + c-18.274,0.00-33.086-14.816-33.086-33.085l0.00-188.836 C 223.618,206.173, 238.429,191.357, 256.704,191.357z" /> +<glyph unicode="" d="M 90.68,160.51L 126.742,124.447L 253.718,251.426L 380.691,124.448L 416.754,160.51L 253.718,323.551 z" /> +<glyph unicode="" d="M 196.729,60.963L 160.666,97.025L 287.643,224.001L 160.667,350.975L 196.729,387.037L 359.768,224.001 z" /> +<glyph unicode="" d="M 317.207,60.963L 353.27,97.025L 226.291,224.001L 353.269,350.975L 317.207,387.037L 154.166,224.001 z" /> +<glyph unicode="" d="M 416.754,287.49L 380.691,323.553L 253.716,196.574L 126.742,323.552L 90.68,287.49L 253.716,124.449 z" /> +<glyph unicode="" d="M 504.979,223.994L 383.904,323.938L 383.904,255.996L 288.005,255.997L 288.005,351.90L 355.937,351.90L 256.012,472.979L 156.067,351.904L 224.01,351.904L 224.009,255.998L 128.098,255.999L 128.098,323.942L 7.021,224.016L 128.098,124.07L 128.098,192.002L 224.008,192.002L 224.007,96.098L 156.063,96.098L 255.99-24.979L 355.936,96.098L 288.004,96.098L 288.004,192.001L 383.90,192.001L 383.90,124.069 z" /> +<glyph unicode="" d="M 96.002,255.998L 415.996,255.998L 415.996,192.002L 96.002,192.002z" /> +<glyph unicode="" d="M 256.00,447.998c-83.058,0.00-150.374-67.286-150.374-150.374c0.00-73.704, 64.874-169.622, 116.446-249.789 + c 39.066-60.729, 29.329-61.07, 67.853-0.004c 50.575,80.171, 116.449,176.088, 116.449,249.773 + C 406.374,380.652, 339.058,447.998, 256.00,447.998z M 256.00,225.785c-39.67,0.00-71.858,32.16-71.858,71.858 + c0.00,39.699, 32.188,71.839, 71.858,71.839c 39.669,0.00, 71.857-32.16, 71.857-71.858C 327.857,257.925, 295.669,225.785, 256.00,225.785z" /> +<glyph unicode="" d="M 256.398,162.378c-4.897,0.00-9.814,1.545-13.934,4.642L 32.156,324.88l0.00-234.203 c0.00-16.487, 13.413-27.675, 29.90-27.675 + l 388.676,0.00 c 16.492,0.00, 29.263,11.188, 29.263,27.675L 479.995,324.88 L 269.999,167.02C 265.882,163.923, 261.288,162.378, 256.398,162.378zM 451.282,352.018L 256.398,205.719L 61.513,352.018 z" /> +<glyph unicode="" d="M 255.875,451.175L 63.605,334.688l0.00-221.367 l 49.933-29.402L 113.538,305.29 l 142.381,86.565l 142.49-86.43 + l 0.599-0.343l-0.059-220.832l 49.445,29.07L 448.394,334.688 L 255.875,451.175z M 281.322,314.901l0.00-258.805 l-25.447-15.566l-25.477,15.624 + L 230.398,314.697 l-65.943-40.617l0.00-221.313 l 91.42-55.942l 92.20,56.333L 348.075,274.234 L 281.322,314.901z" /> +<glyph unicode="" d="M 402.127,223.937l-38.709,0.00 l-0.006,64.061c0.00,30.667-11.64,58.792-30.863,79.345 + c-19.156,20.557-46.447,33.753-76.542,33.729c-30.104,0.024-57.396-13.172-76.551-33.729 + c-19.233-20.553-30.871-48.679-30.876-79.345l0.00-64.061 l-38.708,0.00 c-7.66,0.00-13.869-6.205-13.869-13.864l0.00-164.201 + c0.00-7.659, 6.209-13.869, 13.869-13.869l 292.255,0.00 c 7.665,0.00, 13.869,6.21, 13.869,13.869L 415.996,210.07 + C 415.996,217.731, 409.792,223.937, 402.127,223.937z M 312.404,223.937L 199.588,223.937 l0.00,64.061 c0.00,17.699, 6.701,33.356, 17.115,44.50 + c 10.497,11.135, 24.163,17.544, 39.304,17.566c 15.13-0.022, 28.798-6.427, 39.287-17.566c 10.416-11.143, 17.11-26.801, 17.11-44.50 + L 312.404,223.937 z" /> +<glyph unicode="" d="M 221.533,116.203l-37.033-34.33c-8.995-8.319-20.297-12.079-31.93-11.681c-11.109,0.454-21.96,5.06-30.329,14.057 + l-3.382,3.668c-8.303,8.996-12.084,20.234-11.68,31.698c 0.463,11.303, 5.053,22.158, 14.054,30.524l 85.934,79.645 + c 5.046,4.659, 10.772,7.889, 16.835,9.763c0.00,8.613, 0.088,61.287, 0.088,72.72c-23.642-2.68-46.787-12.709-65.50-30.063 + l-85.936-79.642c-23.266-21.53-35.834-50.785-36.921-80.225c-1.155-29.401, 9.047-59.642, 30.701-83.012l 3.384-3.651 + c 21.434-23.149, 50.545-35.81, 80.027-36.919l 0.164-0.006c 29.321-1.117, 59.624,8.968, 83.062,30.703l 37.031,34.311 + c 14.476,13.415, 15.337,36.023, 1.922,50.495C 258.617,128.737, 236.008,129.60, 221.533,116.203zM 476.256,325.848c 1.204,29.423-9.102,59.554-30.659,82.823l-3.384,3.669c-21.592,23.319-50.937,35.824-80.354,36.912 + c-29.42,1.152-59.596-9.082-82.895-30.69l-35.342-32.747c-14.475-13.428-15.338-36.038-1.926-50.513s 36.02-15.337, 50.497-1.925 + l 35.336,32.748c 9.029,8.334, 20.232,12.101, 31.604,11.716c 11.40-0.484, 22.282-5.09, 30.62-14.086l 3.416-3.654 + c 8.303-9.013, 12.081-20.216, 11.683-31.538c-0.469-11.435-5.095-22.336-14.095-30.703l-85.932-79.628 + c-5.012-4.634-10.729-7.859-16.826-9.736c0.00-14.327,0.00-56.327,0.00-72.708c 23.514,2.70, 46.64,12.627, 65.392,30.027l 85.967,79.63 + C 462.698,267.083, 475.199,296.426, 476.256,325.848zM 119.299,339.487c 2.929-2.929, 6.768-4.394, 10.606-4.394s 7.678,1.464, 10.606,4.394c 5.858,5.858, 5.858,15.355,0.00,21.213 + L 44.314,456.897c-5.857,5.858-15.355,5.858-21.213,0.00c-5.858-5.858-5.858-15.355,0.00-21.213L 119.299,339.487zM 192.002,352.095c 8.284,0.00, 15.00,6.716, 15.00,15.00L 207.002,446.436 c0.00,8.284-6.716,15.00-15.00,15.00s-15.00-6.716-15.00-15.00l0.00-79.341 + C 177.002,358.811, 183.718,352.095, 192.002,352.095zM 126.343,287.913c0.00,8.284-6.716,15.00-15.00,15.00L 32.002,302.913 c-8.284,0.00-15.00-6.716-15.00-15.00s 6.716-15.00, 15.00-15.00l 79.341,0.00 + C 119.627,272.913, 126.343,279.629, 126.343,287.913zM 392.621,108.95c-5.857,5.857-15.355,5.857-21.213,0.00c-5.858-5.857-5.858-15.355,0.00-21.213l 96.198-96.198 + c 2.929-2.929, 6.768-4.394, 10.606-4.394s 7.678,1.465, 10.606,4.394c 5.858,5.857, 5.858,15.355,0.00,21.213L 392.621,108.95zM 319.919,96.342c-8.284,0.00-15.00-6.716-15.00-15.00l0.00-79.341 c0.00-8.284, 6.716-15.00, 15.00-15.00s 15.00,6.716, 15.00,15.00l0.00,79.341 + C 334.919,89.626, 328.203,96.342, 319.919,96.342zM 385.577,160.523c0.00-8.284, 6.716-15.00, 15.00-15.00l 79.342,0.00 c 8.284,0.00, 15.00,6.716, 15.00,15.00s-6.716,15.00-15.00,15.00l-79.342,0.00 + C 392.293,175.523, 385.577,168.808, 385.577,160.523z" /> +<glyph unicode="" d="M 221.533,116.203l-37.033-34.33c-8.995-8.319-20.297-12.079-31.93-11.681c-11.109,0.454-21.96,5.06-30.329,14.057 + l-3.382,3.668c-8.303,8.996-12.084,20.234-11.68,31.698c 0.463,11.303, 5.053,22.158, 14.054,30.524l 85.934,79.645 + c 9.028,8.335, 20.233,12.099, 31.639,11.698c 11.368-0.465, 22.252-5.074, 30.62-14.072l 3.381-3.669l 52.421,48.589l-3.386,3.652 + l-6.175,6.648c-2.637,2.84-5.609,5.156-8.84,6.959c-19.25,14.601-42.242,22.475-65.31,23.321 + c-29.449,1.155-59.625-9.097-82.928-30.707l-85.936-79.642c-23.266-21.53-35.834-50.785-36.921-80.225 + c-1.155-29.401, 9.047-59.642, 30.701-83.012l 3.384-3.651c 21.434-23.149, 50.545-35.81, 80.027-36.919l 0.164-0.006 + c 29.321-1.117, 59.624,8.968, 83.062,30.703l 37.031,34.311c 14.476,13.415, 15.337,36.023, 1.922,50.495 + C 258.617,128.737, 236.008,129.60, 221.533,116.203zM 445.597,408.67l-3.384,3.669c-21.592,23.319-50.937,35.824-80.354,36.912c-29.42,1.152-59.596-9.082-82.895-30.69 + l-35.342-32.747c-14.475-13.428-15.338-36.038-1.926-50.513s 36.02-15.337, 50.497-1.925l 35.336,32.748 + c 9.029,8.334, 20.232,12.101, 31.604,11.716c 11.40-0.484, 22.282-5.09, 30.62-14.086l 3.416-3.654 + c 8.303-9.013, 12.081-20.216, 11.683-31.538c-0.469-11.435-5.095-22.336-14.095-30.703l-85.932-79.628 + c-8.996-8.318-20.266-12.10-31.931-11.687c-11.108,0.447-21.927,5.045-30.295,14.061l-3.386,3.652l-52.42-48.587l 3.38-3.654 + c 21.403-23.132, 50.511-35.808, 79.998-36.896l 0.194-0.008c 29.318-1.118, 59.588,8.954, 83.024,30.702l 85.967,79.63 + c 23.34,21.639, 35.841,50.982, 36.897,80.404C 477.46,355.271, 467.154,385.401, 445.597,408.67z" /> +<glyph unicode="" d="M 351.996,415.998L 351.996,237.18L 96.002,448.00L 96.002,0.00L 351.996,210.82L 351.996,32.002L 447.996,32.002L 447.996,415.998 z" /> +<glyph unicode="" d="M 482.178,233.834L 342.742,379.832c-2.575,2.665-6.122,4.166-9.828,4.166L 45.484,383.998 c-7.561,0.00-13.687-6.126-13.687-13.688 + l0.00-291.995 c0.00-7.562, 6.126-13.688, 13.687-13.688l 287.43,0.00 c 3.706,0.00, 7.253,1.502, 9.828,4.166l 139.436,145.998 + C 487.324,220.098, 487.324,228.527, 482.178,233.834z M 327.112,95.931L 64.002,95.931 L 64.002,352.124 l 263.11,0.00 l 126.18-127.811L 327.112,95.931zM 267.427,325.312L 193.763,250.351L 120.094,325.312L 94.06,299.724L 168.178,224.312L 94.06,148.894L 120.094,123.306L 193.763,198.27L 267.427,123.306L 293.464,148.894L 219.349,224.312L 293.464,299.724 z" /> +<glyph unicode="" d="M 29.815,214.791l 139.436-145.998c 2.575-2.664, 6.122-4.166, 9.828-4.166l 287.429,0.00 c 7.562,0.00, 13.688,6.127, 13.688,13.688 + L 480.196,370.31 c0.00,7.561-6.126,13.688-13.688,13.688L 179.079,383.998 c-3.706,0.00-7.253-1.501-9.828-4.166L 29.815,233.834 + C 24.669,228.527, 24.669,220.098, 29.815,214.791z M 58.701,224.312l 126.18,127.811l 263.108,0.00 l0.00-256.193 L 184.881,95.93 L 58.701,224.312zM 218.529,299.724L 292.644,224.312L 218.529,148.894L 244.566,123.306L 318.229,198.27L 391.898,123.306L 417.932,148.894L 343.814,224.312L 417.932,299.724L 391.898,325.312L 318.229,250.351L 244.566,325.312 z" /> +<glyph unicode="" d="M 48.073,0.002l 79.011,0.017l 0.01,45.529l 49.23,0.013l 0.007,50.45l 47.674-0.009L 224.00,141.556 + l 50.566,0.009l 37.571,32.034c 44.065-12.063, 92.902-1.09, 127.277,33.169c 51.184,51.347, 50.762,134.801-0.911,186.701 + c-51.781,51.553-135.238,51.98-186.399,0.611c-34.485-34.339-45.464-83.306-33.298-127.414L 32.002,79.861l 0.291-64.071 + C 32.355,4.206, 36.603,0.243, 48.073,0.002z M 361.38,316.957c-13.714,13.921-13.843,36.085-0.298,49.49 + c 13.639,13.763, 35.798,13.644, 49.488-0.301c 13.755-13.50, 13.886-35.67, 0.313-49.499 + C 397.273,303.30, 375.108,303.429, 361.38,316.957z" /> +<glyph unicode="" d="M 295.446,31.498L 108.404,31.498 l 3.648,21.205c 21.455,8.767, 42.379,14.598, 62.836,17.525l 91.339,305.806 + c-9.792,1.964-45.405,14.313-54.792,18.273l 5.114,21.19l 187.044,0.00 l-4.396-21.19c-22.019-8.825-58.625-17.432-62.836-18.273 + l-91.311-305.806c 10.509-2.121, 47.089-13.814, 54.069-17.525L 295.446,31.498z" /> +<glyph unicode="" d="M 335.49,115.189c-9.558,0.00-47.096-57.998-67.553-57.998c-5.459,0.00-8.17,4.787-8.17,9.558 + c0.00,10.909, 7.506,27.979, 11.58,38.216l 49.13,133.011c 24.56,66.191-6.834,83.922-36.151,83.922 + c-39.572,0.00-75.062-19.786-102.332-45.708c-5.076-5.068-16.971-16.651-26.377-27.822c-7.691-9.13-6.813-18.64-2.32-21.406 + c 5.626-3.464, 14.265,3.051, 18.405,7.886c 14.991,17.518, 34.313,42.019, 50.521,42.019c 5.462,0.00, 11.605-6.136, 6.832-18.407 + l-47.737-120.078c-4.796-11.606-27.983-67.556-27.983-100.294c0.00-25.929, 17.049-37.517, 41.61-37.517 + c 68.91,0.00, 148.724,84.603, 148.724,104.389C 343.668,111.104, 338.891,115.189, 335.49,115.189zM 321.828,447.423c-30.018,0.00-55.938-24.553-55.938-54.568c0.00-27.979, 18.435-46.41, 46.398-46.41 + c 30.703,0.00, 56.615,23.196, 56.615,54.591C 368.904,429.016, 349.137,447.423, 321.828,447.423z" /> +<glyph unicode="" d="M 352.381,251.944c 19.508,0.00, 35.292,16.00, 35.292,35.758c0.00,19.743-15.784,35.765-35.292,35.765 + c-19.45,0.00-35.277-16.022-35.277-35.765C 317.104,267.944, 332.931,251.944, 352.381,251.944zM 244.799,175.919l-88.125,94.968L 96.748,158.586l0.00-30.938 l 297.645,0.00 C 356.489,160.775, 276.541,231.63, 276.541,231.63 + L 244.799,175.919zM 32.00,384.00l0.00-319.782 l 447.50,0.00 L 479.50,384.00 L 32.00,384.00 z M 73.072,104.542l-0.019,237.854l 365.385,0.00 l0.00-0.012 l 1.32,0.00 l 0.005-237.842L 73.072,104.542 z" /> +<glyph unicode="" d="M 395.841,276.128L 395.841,360.032L 339.902,360.032L 339.902,332.064L 256.00,415.968L 32.255,191.932L 96.50,191.932L 96.50,31.598L 224.551,31.598L 224.551,159.598L 288.50,159.598L 288.50,31.598L 416.50,31.598L 416.50,191.932L 479.742,191.932 + z" /> +<glyph unicode="" d="M 415.459,383.458C 372.866,426.051, 316.235,449.508, 256.00,449.508c-60.235,0.00-116.865-23.457-159.458-66.05 + C 53.949,340.865, 30.492,284.235, 30.492,224.00s 23.457-116.866, 66.05-159.459c 42.593-42.593, 99.223-66.05, 159.458-66.05 + c 60.235,0.00, 116.866,23.457, 159.459,66.05s 66.05,99.224, 66.05,159.459S 458.052,340.865, 415.459,383.458z M 256.00,31.092 + C 149.631,31.092, 63.093,117.63, 63.093,224.00c0.00,106.369, 86.538,192.907, 192.907,192.907 + c 106.37,0.00, 192.908-86.538, 192.908-192.907C 448.908,117.63, 362.37,31.092, 256.00,31.092zM 342.291,356.486c-21.754,19.24-51.033,28.861-87.842,28.861c-34.986,0.00-63.238-9.507-84.759-28.519 + c-21.525-19.015-27.814-41.741-29.486-68.966l 55.262,0.271c 4.107,19.011, 9.93,25.194, 20.881,34.474 + c 10.951,9.275, 24.563,13.917, 40.843,13.917c 16.882,0.00, 30.305-4.449, 40.269-13.346c 9.959-8.898, 14.943-19.586, 14.943-32.056 + c0.00-8.976-2.816-17.19-8.441-24.641c-3.651-4.716-14.83-14.68-33.538-29.887c-18.711-15.212-31.186-28.917-37.421-41.083 + c-6.238-12.17-9.277-27.145-9.125-35.508l 64.113,0.00 c-0.307,17.643, 10.188,26.305, 23.728,37.561 + c 26.158,21.766, 43.235,38.952, 51.22,51.578c 7.986,12.624, 11.979,26.01, 11.979,40.155 + C 374.916,314.849, 364.039,337.244, 342.291,356.486zM 223.877,128.011L 287.99,128.011L 287.99,63.903L 223.877,63.903z" /> +<glyph unicode="" d="M 32.002,447.998L 160.002,447.998L 160.002,319.998L 32.002,319.998zM 192.00,447.998L 320.00,447.998L 320.00,319.998L 192.00,319.998zM 351.996,447.998L 479.996,447.998L 479.996,319.998L 351.996,319.998zM 32.002,288.00L 160.002,288.00L 160.002,160.00L 32.002,160.00zM 192.00,288.00L 320.00,288.00L 320.00,160.00L 192.00,160.00zM 351.996,288.00L 479.996,288.00L 479.996,160.00L 351.996,160.00zM 32.002,128.002L 160.002,128.002L 160.002,0.002L 32.002,0.002zM 192.00,128.002L 320.00,128.002L 320.00,0.002L 192.00,0.002zM 351.996,128.002L 479.996,128.002L 479.996,0.002L 351.996,0.002z" /> +<glyph unicode="" d="M 279.533,448.00c0.00,0.00-100.479,0.00-133.971,0.00c-60.06,0.00-116.585-45.503-116.585-98.211c0.00-53.863, 40.941-97.333, 102.044-97.333 + c 4.249,0.00, 8.378,0.085, 12.421,0.376c-3.965-7.593-6.801-16.144-6.801-25.021c0.00-14.969, 8.052-27.105, 18.234-37.012 + c-7.693,0.00-15.121-0.224-23.227-0.224C 57.259,190.576,0.00,143.195,0.00,94.064c0.00-48.389, 62.771-78.656, 137.167-78.656 + c 84.812,0.00, 131.652,48.122, 131.652,96.514c0.00,38.801-11.447,62.036-46.843,87.067c-12.107,8.571-35.265,29.418-35.265,41.672 + c0.00,14.36, 4.098,21.434, 25.714,38.323c 22.156,17.312, 37.836,41.651, 37.836,69.958c0.00,33.703-15.01,66.549-43.186,77.386l 42.477,0.00 + L 279.533,448.00z M 232.74,120.271c 1.063-4.486, 1.642-9.104, 1.642-13.814c0.00-39.10-25.196-69.655-97.487-69.655 + c-51.421,0.00-88.558,32.552-88.558,71.65c0.00,38.321, 46.063,70.222, 97.481,69.666c 12.00-0.127, 23.185-2.058, 33.335-5.345 + C 207.066,153.359, 227.092,142.393, 232.74,120.271z M 150.409,266.112c-34.52,1.032-67.318,38.613-73.276,83.93 + c-5.958,45.333, 17.185,80.021, 51.694,78.995c 34.505-1.037, 67.318-37.407, 73.278-82.729 + C 208.059,300.978, 184.911,265.079, 150.409,266.112z M 416.00,352.00L 416.00,448.00 l-32.00,0.00 l0.00-96.00 l-96.00,0.00 l0.00-32.00 l 96.00,0.00 l0.00-96.00 l 32.00,0.00 l0.00,96.00 l 96.00,0.00 l0.00,32.00 L 416.00,352.00 z" /> +<glyph unicode="" d="M 248.023,234.684L 247.35,235.809L 246.563,238.057L 247.124,238.73L 246.786,240.303L 244.764,238.73L 245.214,237.381L 245.775,235.248L 244.764,235.248L 244.764,234.237L 245.889,233.562 zM 241.955,236.259L 242.293,234.684L 243.979,235.471L 244.426,236.82L 243.753,237.493 zM 244.09,245.134L 244.426,246.033L 243.529,246.932L 241.73,247.043L 241.843,245.697 zM 256.338,254.011L 256.898,253.788L 257.012,254.684L 256.338,255.022L 256.785,256.145L 254.764,255.022L 255.55,253.338 zM 261.279,257.27L 260.158,257.831L 259.37,257.043L 260.831,256.82 zM 256.00,449.078C 131.695,449.078, 30.922,348.308, 30.922,224.00S 131.695-1.078, 256.00-1.078 + c 124.303,0.00, 225.078,100.771, 225.078,225.078S 380.303,449.078, 256.00,449.078z M 62.028,224.00c0.00,41.132, 12.838,79.241, 34.674,110.627 + l 2.504-1.877l-1.513-6.073l 5.559-1.521l-1.013,8.093l 4.553,0.503l0.00,10.625 l 4.552,0.00 c0.00,0.00, 0.80-2.062, 1.642-4.224 + c 0.923-2.376, 1.899-4.88, 1.899-4.88l 5.055-5.568c0.00,0.00-6.068-1.508-8.088-1.508c-2.022,0.00-1.013-8.093-1.013-8.093l 7.077-2.525 + l 4.572,8.444l 10.601,11.782l 5.056,15.674l 9.612,9.111l-5.565,4.033l 6.073,4.047l 0.505,5.568l-17.701-5.056l-0.558,0.666 + c 9.638,8.19, 20.077,15.455, 31.201,21.653l 8.299-3.614l-5.559-10.623l-11.133,0.00 l-2.024-9.604l 9.106,0.00 l 13.149,8.095l 9.106,9.096 + l 1.513,8.599l-13.149,1.009l 9.103,6.073l 8.598-1.521l-1.514-9.099l 11.632,7.091l 2.027-5.568l 2.53-8.095l-6.577-8.093 + l-7.082-6.572l-10.623,1.521l 5.06-10.619l-9.61,1.517l-16.184-16.692l 4.046-5.567l 13.149,1.018l 11.128,3.546l 14.167,1.508 + l 6.572,1.519c0.00,0.00,0.00,4.046-0.507,6.572c-0.501,2.53, 5.06-0.50, 5.06-0.50l 6.071,3.532l 4.552,14.167l 16.688,7.595l-2.525,4.037 + l 4.046,5.064l-13.148,2.026l 3.539,5.056l-16.692,5.568l-8.599,0.00 l 3.034,7.581l 3.539,3.547l-0.284,0.284 + c 14.076,3.244, 28.72,5.018, 43.787,5.018c 23.479,0.00, 45.979-4.172, 66.808-11.817l-0.507-1.191l-8.423,0.563l0.00-5.064 l 3.376-2.246 + l0.00-4.493 l 2.806-3.93l-10.111,6.176l-6.735-3.372l 3.368-7.873l 1.688-8.986l 4.492-5.064l 10.665-1.684l-2.242-4.493l-2.25-6.752 + l 9.556-6.176l-0.563-2.81l-17.979,15.176l-1.116-5.627l 7.859-7.865l 4.493-1.684l-10.11-2.246l-1.126-5.064l-7.298,7.315 + l-4.501,9.548l-1.688,9.557l-4.501-5.618l 3.376-13.487l 5.618-3.943l-2.242-12.914l-3.376,1.688l 0.563-6.752l-5.063,0.563 + l-5.052,7.315l-6.176,0.00 l-8.995,1.125l-8.999-0.563l-8.423-6.752l-5.622-9.548l-11.804-8.994l-1.125-5.056l0.00-6.189 l 2.809-6.177 + l 5.623,4.493l 1.683-3.367l 2.814-5.056l 0.563-1.134l 2.809-3.372l 5.061,3.368l-0.563,12.366l 6.176,7.873 + c0.00,0.00, 0.313,1.332, 0.664,2.869c 0.479,2.046, 1.024,4.433, 1.024,4.433l 2.242,6.19l 3.943-0.563l-1.122-5.064l-2.259-11.232 + l 10.691,1.125l 3.935-1.125l-8.436-2.255l 1.12-5.618l-9.557-6.176l 0.563-6.19l-8.423-2.25l-1.684-4.493l-6.748,2.247l-4.497,0.00 + l0.00,9.557 l-5.06-1.697l0.00-5.055 l-14.051-11.245l-7.869-2.809l-3.369-3.93l-11.245,2.809l-0.563-5.056l 7.306-2.817l-0.563-10.104 + l-20.235,0.563l-2.81-4.493l-2.809-7.874l-3.376-6.752l 5.06-5.618l 5.623-6.739L 207.109,224.00l 1.125,6.739l 3.939,3.38l 6.743,2.247 + l-0.563,4.493l 6.185,1.688l 8.988,1.684l 5.623-6.739l 10.115-7.315l 4.496-7.297l0.00-3.371 l 5.614,3.371l-2.805,5.051l 1.122,5.626 + l-5.057,2.247l-4.496,6.176l 2.809,8.999l 5.051-7.311l 7.302-5.618l 2.805-10.12l 7.311-5.614l 1.696-6.189l 3.372,7.311l-1.125,3.372 + l 1.685,2.809l 10.664,8.994l 2.251,11.246l 4.501,3.372l 5.618-0.563l 8.432,8.436l 0.563-6.752l 12.353-3.93l0.00-6.19 l-10.103,0.00 + l-15.175-7.86l-12.366-6.752l 3.371-7.302l 11.236-2.246l 6.19-2.81l 6.743,4.492l 0.554-19.113l-19.113-3.93l-20.209,5.627 + l-7.873-6.189l 3.367-3.368l-6.189,1.121l-19.664,7.311l-5.618-0.571l-4.496,7.311l0.00,8.995 l-10.121,0.00 l-5.617,1.125l-17.987-3.943 + l-14.05,1.134l-6.181-3.381l-3.934-0.563l-2.251-7.297l-12.924-8.999l-17.989-13.486l-1.125-17.413l-5.06-11.245l 0.563-6.735 + l 4.497-7.878l 12.929-21.91l 13.487-6.185l 22.481-1.688l-1.125,9.562l-5.06,2.806l 2.247,5.055l 3.938-4.492l 3.93-11.805 + l 16.861-1.125l 6.743-6.734l 9.553-3.943l 1.125-16.297l 10.121-12.928l 9.553-16.855l-8.428-10.119l 8.607-13.391 + C 145.055,33.967, 62.028,119.269, 62.028,224.00z M 322.468,41.723l 23.449,17.047l-8.423,20.802l 26.975,35.397l 8.423,22.482 + l 3.93,12.37l-14.032-6.753l-8.44-1.688l-20.784,12.933l-6.19,14.05l-7.868,7.869l-10.111,22.473l 8.423-6.739l 15.747-17.422 + l 5.618-7.868l 11.228-5.619l 3.376-14.612l 13.495,8.986l 16.292,20.238l 7.869,20.79l-6.186,5.051l-3.372,6.189l-3.938-7.311 + l-7.864-8.985l-11.24,12.366l-3.368,9.544l 7.869-1.685l 7.864-3.93l 11.241,3.93l 6.753-2.245l 17.967,12.365l 10.133-5.626 + l 6.176,3.38l 13.438-21.158l 6.656,6.348l 0.132,8.063l 0.554,24.169l 4.132,11.452c 1.008-7.99, 1.583-16.116, 1.583-24.38 + C 449.972,140.229, 396.859,68.854, 322.468,41.723z" /> +<glyph unicode="" d="M 116.838,355.64c-25.396,0.00-47.242-8.403-65.542-25.208c-19.043-17.926-28.57-40.33-28.57-67.218 + c0.00-17.926, 5.188-34.731, 15.647-50.416c 9.337-14.563, 19.09-23.903, 31.889-28.012l0.00-1.121 + c-12.799-5.224-18.482-18.295-18.482-39.209c0.00-16.062, 5.686-28.011, 18.482-35.854l0.00-1.121 + c-35.327-11.572-51.496-33.047-51.496-64.414c0.00-27.268, 11.874-47.244, 35.033-59.939C 72.094-26.959, 95.588-32.00, 123.972-32.00 + c 69.085,0.00, 103.703,28.941, 103.703,86.832c0.00,36.223-26.661,58.441-80.063,66.658c-12.323,1.863-21.644,6.348-27.991,13.445 + c-4.854,4.854-7.271,9.709-7.271,14.563c0.00,13.816, 7.479,21.848, 22.41,24.088c 22.779,3.357, 41.364,13.912, 55.743,31.648 + c 14.375,17.74, 21.565,38.559, 21.565,62.458c0.00,7.469-2.26,15.498-5.244,24.086c 9.709,2.244, 16.524,4.297, 21.646,6.166L 228.47,355.64 + c-22.526-8.964-43.495-13.442-61.421-13.442C 151.361,351.159, 135.136,355.64, 116.838,355.64z M 123.00,76.115 + c 31.372,0.00, 47.052-9.521, 47.052-28.57c0.00-20.168-14.377-30.246-43.132-30.246c-32.862,0.00-49.293,9.711-49.293,29.127 + C 77.626,66.221, 92.749,76.115, 123.00,76.115z M 119.079,224.00c-23.527,0.00-35.293,12.882-35.293,38.654 + c0.00,27.631, 11.766,41.453, 35.293,41.453c 11.201,0.00, 19.979-4.298, 26.326-12.884c 5.229-7.845, 7.845-17.18, 7.845-28.011 + C 153.25,237.073, 141.857,224.00, 119.079,224.00z M 289.395,480.00c-10.828,0.00-20.069-4.107-27.727-12.324 + c-7.661-8.218-11.489-18.108-11.489-29.688c0.00-11.205, 3.829-20.91, 11.489-29.129c 7.654-8.217, 16.896-12.32, 27.727-12.32 + c 10.455,0.00, 19.514,4.104, 27.17,12.32c 7.656,8.219, 11.48,17.924, 11.48,29.129c0.00,11.58-3.824,21.472-11.48,29.688 + C 308.905,475.893, 299.85,480.00, 289.395,480.00z M 320.768,352.001l-63.303,0.00 c 0.748-7.168-0.32-18.021-0.32-35.57l0.00-174.216 + c0.00-17.928, 1.068-32.387, 0.32-38.018l 63.303,0.00 c-0.75,8.188-2.697,22.334-2.697,41.379L 318.071,317.549 + C 318.067,333.981, 320.018,344.833, 320.768,352.001z M 460.371,157.90c-16.437,0.00-24.541,12.514-24.541,37.533L 435.83,298.753 l 24.932,0.00 + c 4.479,0.00, 8.516,0.246, 13.559-0.123c 5.043-0.374, 7.076-0.125, 9.64-0.125L 483.961,352.00 l-48.129,0.00 l0.00,23.808 c0.00,8.961, 1.407,17.151, 2.526,22.271 + l-64.979,0.00 c 1.121-5.12, 1.014-12.938, 1.014-23.395L 374.393,352.00 l-28.16,0.00 l0.00-53.494 c 7.683,1.12, 14.545,1.678, 19.398,1.678l 8.762-0.559l0.00-0.292 l0.00,0.00 + l0.00-101.101 c0.00-31.371, 3.979-54.336, 11.818-68.90c 10.461-19.42, 28.811-29.129, 56.067-29.129c 19.425,0.00, 36.56,3.732, 49.357,11.205 + l0.00,56.016 C 481.398,161.074, 471.944,157.90, 460.371,157.90z" /> +<glyph unicode="" d="M 444.797,255.998L 398.073,302.721L 479.835,384.482L 416.485,447.833L 334.724,366.071L 288.00,412.795L 288.00,255.998 + zM 67.123,255.998L 113.847,302.721L 32.085,384.482L 95.435,447.833L 177.196,366.071L 223.92,412.795L 223.92,255.998 + zM 444.797,191.92L 398.073,145.196L 479.835,63.436L 416.485,0.085L 334.724,81.846L 288.00,35.123L 288.00,191.92 + zM 67.123,191.92L 113.847,145.196L 32.085,63.436L 95.435,0.085L 177.196,81.846L 223.92,35.123L 223.92,191.92 + z" /> +<glyph unicode="" d="M 177.285,208.636L 78.726,110.077L 32.004,156.801L 32.004,0.004L 188.801,0.004L 142.079,46.728L 240.636,145.286 zM 188.801,447.996L 32.004,447.996L 32.004,291.199L 78.726,337.922L 177.285,239.364L 240.636,302.714L 142.079,401.272 zM 334.714,208.636L 271.364,145.286L 369.923,46.728L 323.199,0.004L 479.996,0.004L 479.996,156.801L 433.272,110.077 zM 323.199,447.996L 369.923,401.272L 271.364,302.714L 334.714,239.364L 433.272,337.922L 479.996,291.199L 479.996,447.996 z" /> +<glyph unicode="" d="M 466.766,288.599c-68.667,0.00-338.019,0.00-356.766,0.00c-21.50,0.00-26.203-21.411-26.203-21.411L 55.08,82.854 + c-1.239-7.888-14.837-6.083-13.466,2.646l 15.637,202.498c0.00,0.00, 4.249,32.602, 39.249,32.602c 28.227,0.00, 262.052,0.00, 351.496,0.00L 447.996,335.31 + c0.00,9.222-7.475,16.688-16.691,16.688L 216.757,351.998 l-43.624,58.994l-0.089-0.026c-3.031,3.094-7.244,5.032-11.916,5.032L 48.686,415.998 + c-9.211,0.00-16.683-7.475-16.683-22.561l 1.505-312.185c0.00-9.223, 7.472-16.688, 16.683-16.688l 381.114,0.00 + c 9.217,0.00, 16.688,7.465, 16.691,16.688l 35.601,185.334C 483.597,266.586, 489.336,288.285, 466.766,288.599z" /> +<glyph unicode="" d="M 431.305,351.998L 216.757,351.998 l-43.624,58.994l-0.089-0.026c-3.031,3.094-7.244,5.032-11.916,5.032L 48.686,415.998 + c-9.211,0.00-16.683-7.475-16.683-22.561l 1.505-312.185c0.00-9.223, 7.472-16.688, 16.683-16.688l 381.114,0.00 + c 9.217,0.00, 16.688,7.465, 16.691,16.688L 447.996,287.50 l0.00,47.81 C 447.996,344.532, 440.521,351.998, 431.305,351.998z M 240.00,95.205 + c-62.186,0.00-112.596,50.41-112.596,112.596c0.00,62.181, 50.41,112.591, 112.596,112.591c 62.184,0.00, 112.596-50.41, 112.596-112.591 + C 352.596,145.615, 302.184,95.205, 240.00,95.205zM 223.48,241.22L 161.002,241.223L 161.002,174.746L 223.478,174.745L 223.478,130.076L 317.874,207.981L 223.48,285.901 z" /> +<glyph unicode="" d="M 160.50,223.696L 319.50,223.696L 319.50,191.902L 160.50,191.902zM 431.305,351.998L 216.757,351.998 l-43.624,58.994l-0.089-0.026c-3.031,3.094-7.244,5.032-11.916,5.032L 48.686,415.998 + c-9.211,0.00-16.683-7.475-16.683-22.561l 1.505-312.185c0.00-9.223, 7.472-16.688, 16.683-16.688l 381.114,0.00 + c 9.217,0.00, 16.688,7.465, 16.691,16.688L 447.996,287.50 l0.00,47.81 C 447.996,344.532, 440.521,351.998, 431.305,351.998z M 240.00,95.205 + c-62.186,0.00-112.596,50.41-112.596,112.596c0.00,62.181, 50.41,112.591, 112.596,112.591c 62.184,0.00, 112.596-50.41, 112.596-112.591 + C 352.596,145.615, 302.184,95.205, 240.00,95.205z" /> +<glyph unicode="" d="M 431.305,351.998L 216.757,351.998 l-43.624,58.994l-0.089-0.026c-3.031,3.094-7.244,5.032-11.916,5.032L 48.686,415.998 + c-9.211,0.00-16.683-7.475-16.683-22.561l 1.505-312.185c0.00-9.223, 7.472-16.688, 16.683-16.688l 381.114,0.00 + c 9.217,0.00, 16.688,7.465, 16.691,16.688L 447.996,287.50 l0.00,47.81 C 447.996,344.532, 440.521,351.998, 431.305,351.998z M 240.00,95.205 + c-62.186,0.00-112.596,50.41-112.596,112.596c0.00,62.181, 50.41,112.591, 112.596,112.591c 62.184,0.00, 112.596-50.41, 112.596-112.591 + C 352.596,145.615, 302.184,95.205, 240.00,95.205zM 255.898,287.297L 224.102,287.297L 224.102,223.696L 160.50,223.696L 160.50,191.902L 224.102,191.902L 224.102,128.301L 255.898,128.301L 255.898,191.902L 319.50,191.902L 319.50,223.696L 255.898,223.696 z" /> +<glyph unicode="" d="M 431.305,351.998L 216.757,351.998 l-43.624,58.994l-0.089-0.026c-3.031,3.094-7.244,5.032-11.916,5.032L 48.686,415.998 + c-9.211,0.00-16.683-7.475-16.683-22.561l 1.505-312.185c0.00-9.223, 7.472-16.688, 16.683-16.688l 381.114,0.00 + c 9.217,0.00, 16.688,7.465, 16.691,16.688L 447.996,287.50 l0.00,47.81 C 447.996,344.532, 440.521,351.998, 431.305,351.998z" /> +<glyph unicode="" d="M 63.252,447.998L 95.65,447.998L 95.65,0.002L 63.252,0.002zM 401.471,415.998l-95.14-95.145l 96.834-96.851L 160.01,224.002 L 160.01,415.998 L 401.471,415.998 M 478.723,447.998L 128.01,447.998 l0.00-255.996 l 352.40,0.00 + L 351.583,320.851L 478.723,447.998L 478.723,447.998z" /> +<glyph unicode="" d="M 351.583,320.851L 478.723,447.998L 128.01,447.998L 128.01,192.002L 480.41,192.002 zM 63.252,447.998L 95.65,447.998L 95.65,0.002L 63.252,0.002z" /> +<glyph unicode="" d="M 160.003,415.998L 160.003,237.18L 415.996,448.00L 415.996,0.00L 160.003,210.82L 160.003,32.002L 64.003,32.002L 64.003,415.998 z" /> +<glyph unicode="" d="M 63.145,447.998L 63.145,383.998L 213.144,212.286L 213.144,40.859L 298.856-1.997L 298.856,212.286L 448.855,383.998L 448.855,447.998 z" /> +<glyph unicode="" d="M 503.611,146.991l-45.414,44.548c 13.105,11.496, 24.191,22.291, 32.663,31.172 + c-2.193,2.337-23.248,22.273-27.113,26.138c-2.402-2.128-104.908-114.769-207.756-114.769 + c-86.444,0.00-181.754,86.349-207.225,115.06c-7.362-6.769-24.63-23.638-27.437-26.429 + c 8.803-9.076, 19.852-19.751, 32.662-30.985L 8.387,146.991c-8.287-8.13-8.416-21.441-0.285-29.729 + c 4.118-4.196, 9.559-6.301, 15.007-6.301c 5.313,0.00, 10.63,2.001, 14.723,6.017l 48.974,48.041 + c 15.042-11.323, 31.434-22.418, 48.718-32.302l-29.787-62.356c-5.004-10.48-0.569-23.027, 9.908-28.036 + c 2.051-0.979, 4.182-1.594, 6.316-1.876c 8.783-1.159, 17.691,3.36, 21.715,11.785l 29.501,61.759 + c 20.12-8.455, 40.923-14.608, 61.80-17.17l0.00-64.193 c0.00-11.61, 9.412-21.022, 21.023-21.022s 21.023,9.412, 21.023,21.022l0.00,64.198 + c 20.775,2.549, 41.49,8.65, 61.519,17.008l 30.169-61.632c 4.108-8.391, 13.056-12.824, 21.826-11.583 + c 2.136,0.304, 4.261,0.941, 6.299,1.943c 10.428,5.108, 14.742,17.697, 9.639,28.126l-30.236,61.768 + c 17.484,9.933, 34.023,21.076, 49.119,32.401l 48.812-47.88c 4.092-4.018, 9.407-6.018, 14.72-6.018 + c 5.447,0.00, 10.89,2.104, 15.009,6.301C 512.029,125.55, 511.90,138.861, 503.611,146.991z" /> +<glyph unicode="" d="M 255.992,349.715c-116.967,0.00-234.758-127.177-234.758-127.177s 117.791-127.166, 234.758-127.166 + c 116.984,0.00, 234.773,127.166, 234.773,127.166S 372.977,349.715, 255.992,349.715z M 255.992,133.905 + c-49.705,0.00-90.00,40.261-90.00,90.011c0.00,49.703, 40.296,89.989, 90.00,89.989c 49.729,0.00, 90.023-40.286, 90.023-89.989 + C 346.018,174.166, 305.721,133.905, 255.992,133.905zM 255.992,268.006c-24.32,0.00-44.104-19.78-44.104-44.09c0.00-24.313, 19.784-44.112, 44.104-44.112 + c 24.332,0.00, 44.126,19.80, 44.126,44.112C 300.12,248.225, 280.326,268.006, 255.992,268.006z" /> +<glyph unicode="" d="M 468.328,387.262l-47.784,48.149c-12.065,12.141-31.647,12.192-43.80,0.158l-30.197-29.965l 91.373-92.049 + l 30.208,29.928C 480.271,355.555, 480.381,375.141, 468.328,387.262z M 85.751,146.693l 91.38-92.024l 238.881,237.066 + l-91.432,92.096L 85.751,146.693z M 49.536,65.123L 32.512,2.57l 62.703,16.563l 58.26,15.346l-88.153,88.86L 49.536,65.123z" /> +<glyph unicode="" d="M 322.097,448.198L 64.002,448.198 l0.00-448.696 l 352.527,0.00 L 416.529,354.50 L 322.097,448.198z M 319.368,415.375l 64.453-63.377l-64.453,0.00 L 319.368,415.375 z + M 383.996,32.002L 96.002,32.002 L 96.002,415.998 L 288.00,415.998 l0.00-96.00 l 95.996,0.00 L 383.996,32.002 zM 127.404,207.801c0.00-62.186, 50.41-112.596, 112.596-112.596c 62.184,0.00, 112.596,50.41, 112.596,112.596 + c0.00,62.181-50.412,112.591-112.596,112.591C 177.814,320.392, 127.404,269.982, 127.404,207.801z M 319.50,223.696l0.00-31.794 l-159.00,0.00 l0.00,31.794 + L 319.50,223.696 z" /> +<glyph unicode="" d="M 322.097,448.198L 64.002,448.198 l0.00-448.696 l 352.527,0.00 L 416.529,354.50 L 322.097,448.198z M 319.368,415.375l 64.453-63.377l-64.453,0.00 L 319.368,415.375 z + M 383.996,32.002L 96.002,32.002 L 96.002,415.998 L 288.00,415.998 l0.00-96.00 l 95.996,0.00 L 383.996,32.002 zM 127.404,207.801c0.00-62.186, 50.41-112.596, 112.596-112.596c 62.184,0.00, 112.596,50.41, 112.596,112.596 + c0.00,62.181-50.412,112.591-112.596,112.591C 177.814,320.392, 127.404,269.982, 127.404,207.801z M 319.50,223.696l0.00-31.794 l-63.602,0.00 + l0.00-63.602 l-31.797,0.00 l0.00,63.602 L 160.50,191.902 l0.00,31.794 l 63.602,0.00 l0.00,63.601 l 31.797,0.00 l0.00-63.601 L 319.50,223.696 z" /> +<glyph unicode="" d="M 322.097,448.198L 64.002,448.198 l0.00-448.696 l 352.527,0.00 L 416.529,354.50 L 322.097,448.198z M 319.368,415.375l 64.453-63.377l-64.453,0.00 L 319.368,415.375 z + M 96.002,32.002L 96.002,415.998 L 288.00,415.998 l0.00-96.00 l 95.996,0.00 l0.00-287.996 L 96.002,32.002 z" /> +<glyph unicode="" d="M 339.229,149.373c 0.009-0.672, 0.054-1.321, 0.054-1.988c0.00-68.036-55.351-123.383-123.39-123.383 + c-68.031,0.00-123.383,55.347-123.383,123.383c0.00,41.116, 20.236,77.581, 51.258,100.014l-4.197,36.865 + c-47.956-26.845-80.46-78.124-80.46-136.878c0.00-86.454, 70.329-156.783, 156.783-156.783c 73.287,0.00, 134.963,50.55, 152.064,118.604 + L 339.229,149.373zM 155.871,409.356A39.893,39.893 180.00 1,0 235.657,409.356A39.893,39.893 180.00 1,0 155.871,409.356zM 452.941,100.229l-89.518,125.166c-4.685,6.555-12.505,9.654-20.441,8.976c-0.591,0.056-1.184,0.105-1.783,0.105 + L 238.941,234.476 l-2.539,22.263l 76.006,0.00 c 8.842,0.00, 16.009,7.165, 16.009,16.004c0.00,8.837-7.167,16.001-16.009,16.001l-79.647,0.00 l-4.157,36.556 + c-2.432,21.383-21.74,36.741-43.119,34.307c-21.383-2.437-36.741-21.741-34.305-43.117l 11.749-103.237 + c 2.276-19.967, 19.247-34.658, 38.883-34.55c 0.067,0.00, 0.129-0.015, 0.201-0.015l 133.794,0.00 l 76.77-107.339 + c 7.328-10.256, 22.315-12.11, 33.468-4.13C 457.188,75.191, 460.277,89.973, 452.941,100.229z" /> +<glyph unicode="" d="M 380.476,96.165A36.94,36.94 180.00 1,0 454.356,96.16500000000002A36.94,36.94 180.00 1,0 380.476,96.16500000000002zM 137.084,133.105c-20.396,0.00-36.936-16.539-36.936-36.939c0.00-20.402, 16.54-36.941, 36.936-36.941 + c 20.406,0.00, 36.945,16.539, 36.945,36.941C 174.03,116.566, 157.491,133.105, 137.084,133.105zM 32.089,351.998L 319.996,351.998L 319.996,160.002L 32.089,160.002zM 447.996,287.998l-96.123,0.00 L 351.873,133.11 L 165.726,133.11 c 11.016-8.554, 18.113-21.914, 18.113-36.944l 186.825,0.00 + c0.00,25.823, 20.926,46.754, 46.752,46.754c 25.818,0.00, 46.752-20.931, 46.752-46.754l 6.414,0.00 c 5.15,0.00, 9.328,4.176, 9.328,9.332l0.00,18.005 + L 479.91,223.999 L 447.996,287.998z M 384.295,209.539l 0.115,46.223l 41.301,0.00 l 22.285-46.223L 384.295,209.539 zM 108.444,133.11L 32.196,133.11 L 32.10,119.348c0.00,0.00-1.209-23.182, 22.168-23.182s 25.151,0.00, 25.151,0.00L 90.33,96.166 + C 90.33,111.196, 97.428,124.557, 108.444,133.11z" /> +<glyph unicode="" d="M 462.879,367.121L 399.121,430.885L 256.00,287.769L 111.883,431.883L 48.119,368.119L 192.234,224.002L 47.115,78.885L 110.879,15.114L 256.00,160.239L 400.125,16.112L 463.883,79.883L 319.762,224.002 z" /> +<glyph unicode="" d="M 256.50,450.167c-123.433,0.00-223.495-30.976-223.495-58.084c0.00-7.91,0.00-78.09,0.00-86.00c0.00-27.108, 100.063-58.084, 223.495-58.084 + c 123.434,0.00, 223.496,30.976, 223.496,58.084c0.00,7.91,0.00,78.09,0.00,86.00C 479.996,419.19, 379.934,450.167, 256.50,450.167z M 256.50,352.218 + c-92.096,0.00-166.755,16.965-166.755,34.191c0.00,17.226, 74.659,37.191, 166.755,37.191c 92.097,0.00, 166.757-19.965, 166.757-37.191 + C 423.257,369.183, 348.597,352.218, 256.50,352.218zM 256.50,74.967c-121.174,0.00-219.815,27.18-223.385,53.602c-0.066-0.492-0.11-0.986-0.11-1.482c0.00-7.91,0.00-70.09,0.00-78.00 + c0.00-27.108, 100.063-58.084, 223.495-58.084c 123.434,0.00, 223.496,30.976, 223.496,58.084c0.00,7.91,0.00,70.09,0.00,78.00 + c0.00,0.496-0.044,0.99-0.11,1.482C 476.315,102.146, 377.675,74.967, 256.50,74.967zM 256.50,199.684c-121.174,0.00-219.815,30.18-223.385,56.602c-0.066-0.492-0.11-0.986-0.11-1.482c0.00-7.91,0.00-70.09,0.00-78.00 + c0.00-27.108, 100.063-58.084, 223.495-58.084c 123.434,0.00, 223.496,30.976, 223.496,58.084c0.00,7.91,0.00,70.09,0.00,78.00 + c0.00,0.496-0.044,0.99-0.11,1.482C 476.315,229.863, 377.675,199.684, 256.50,199.684z" /> +<glyph unicode="" d="M 32.003,384.085l0.00-256.083 l 447.994,0.00 L 479.997,384.085 L 32.003,384.085 z M 447.997,192.002 + c-16.979,0.00-31.844-16.662-31.844-32.00c-85.539,0.00-312.823,0.00-319.494,0.00c0.00,15.988-12.478,33.004-32.656,33.004 + c0.00,34.088,0.00,115.911,0.00,126.904c 23.808,0.00, 30.772,17.437, 30.772,32.176c 13.851,0.00, 306.301,0.00, 321.537,0.00 + c0.00-15.313, 14.154-31.521, 31.685-31.521C 447.997,310.141, 447.997,199.875, 447.997,192.002zM 195.765,256.043A60.235,76.165 180.00 1,0 316.235,256.043A60.235,76.165 180.00 1,0 195.765,256.043zM 32.003,96.002L 479.997,96.002L 479.997,64.002L 32.003,64.002z" /> +<glyph unicode="" d="M 479.748,355.514c0.00,15.757-12.77,28.528-28.528,28.528L 60.78,384.042 c-15.756,0.00-28.528-12.771-28.528-28.528l0.00-263.027 + c0.00-15.759, 12.772-28.528, 28.528-28.528l 390.44,0.00 c 15.759,0.00, 28.528,12.77, 28.528,28.528L 479.748,355.514 z M 75.163,352.042l 362.455,0.00 + c 5.122,0.00, 10.629-5.509, 10.629-10.628l0.00-53.173 L 64.252,288.241 l0.00,53.173 C 64.252,346.533, 70.047,352.042, 75.163,352.042z M 437.617,96.046 + L 75.163,96.046 c-5.116,0.00-10.91,3.203-10.91,8.32L 64.253,223.217 l 383.994,0.00 l0.00-118.851 C 448.246,99.249, 442.739,96.046, 437.617,96.046z" /> +<glyph unicode="" d="M 259.116,414.717C 136.071,417.138, 34.79,341.32, 32.90,245.367c-0.652-33.359, 10.793-64.75, 31.171-91.627l-0.004,0.00 + c 35.045-45.026-32.065-135.984-32.065-135.984l 141.793,62.193c 24.33-7.688, 50.769-12.167, 78.473-12.713 + c 123.042-2.428, 224.325,73.396, 226.217,169.349C 480.369,332.54, 382.155,412.291, 259.116,414.717z" /> +<glyph unicode="" d="M 256.00-0.496C 132.211-0.496, 31.504,100.216, 31.504,224.00C 31.504,347.789, 132.211,448.496, 256.00,448.496 + c 123.789,0.00, 224.496-100.708, 224.496-224.496C 480.496,100.216, 379.789-0.496, 256.00-0.496z M 256.00,394.617 + c-94.078,0.00-170.617-76.539-170.617-170.617c0.00-94.082, 76.54-170.617, 170.617-170.617c 94.087,0.00, 170.617,76.535, 170.617,170.617 + C 426.617,318.078, 350.087,394.617, 256.00,394.617zM 357.43,238.941l-83.642,0.00 l0.00,102.79 c0.00,12.339-9.996,22.339-22.345,22.339c-12.339,0.00-22.344-10.00-22.344-22.339l0.00-125.454 + c0.00-12.165, 9.87-22.025, 22.029-22.025L 357.43,194.252 c 12.339,0.00, 22.345,10.005, 22.345,22.344 + C 379.774,228.936, 369.769,238.941, 357.43,238.941z" /> +<glyph unicode="" d="M 182.964,32.002c-25.798,69.719-85.798,136.165-148.651,176.979l 29.583,48.595 + c 36.183-14.439, 115.92-60.484, 144.845-103.773c 47.26,107.101, 130.196,204.28, 238.443,265.649l 30.501-48.477 + c-106.48-79.458-184.927-215.304-222.155-338.973L 182.964,32.002 z" /> +<glyph unicode="" d="M 463.271,351.953L 127.855,351.953 L 53.729,425.512C 43.326,435.835, 26.523,435.77, 16.20,425.367 + C 5.877,414.964, 5.942,398.162, 16.345,387.839l 86.328-85.666l 34.09-156.646c0.00-9.678, 7.846-17.525, 17.525-17.525l 268.546,0.00 + c 9.686,0.00, 17.525,7.848, 17.525,17.525l 40.437,188.903C 480.797,344.112, 472.957,351.953, 463.271,351.953zM 334.075,48.083A47.978,47.978 180.00 1,0 430.031,48.08300000000003A47.978,47.978 180.00 1,0 334.075,48.08300000000003zM 144.259,48.083A47.978,47.978 180.00 1,0 240.215,48.08300000000003A47.978,47.978 180.00 1,0 144.259,48.08300000000003z" /> +<glyph unicode="" d="M 256.00,447.998C 132.289,447.998, 32.001,347.711, 32.001,224.00S 132.289,0.002, 256.00,0.002S 479.999,100.289, 479.999,224.00 + S 379.711,447.998, 256.00,447.998z M 145.692,334.307c 29.464,29.464, 68.639,45.691, 110.308,45.691 + c 28.047,0.00, 54.958-7.361, 78.544-21.152L 121.152,145.459c-13.79,23.585-21.151,50.495-21.151,78.541 + C 100.001,265.668, 116.228,304.843, 145.692,334.307z M 366.308,113.693c-29.464-29.465-68.639-45.691-110.308-45.691 + c-28.047,0.00-54.958,7.361-78.544,21.153l 213.387,213.394c 13.794-23.587, 21.156-50.50, 21.156-78.549 + C 411.999,182.331, 395.772,143.157, 366.308,113.693z" /> +<glyph unicode="" d="M 172.063,193.823L 217.844,193.823L 217.844,148.066L 172.063,148.066zM 236.52,132.598L 282.242,132.598L 282.242,86.848L 236.52,86.848zM 172.063,132.598L 217.844,132.598L 217.844,86.848L 172.063,86.848zM 172.063,255.05L 217.844,255.05L 217.844,209.319L 172.063,209.319zM 368.475,344.174c 10.469,0.00, 18.949,8.495, 18.949,18.977L 387.424,428.535 c-0.001,10.481-8.481,18.964-18.949,18.964 + c-10.494,0.00-18.979-8.483-18.979-18.964l0.00-65.385 C 349.50,352.669, 357.981,344.174, 368.475,344.174zM 144.372,344.174c 10.467,0.00, 18.946,8.495, 18.946,18.977L 163.318,428.535 c0.00,10.481-8.479,18.964-18.946,18.964 + c-10.495,0.00-18.979-8.483-18.979-18.964l0.00-65.385 C 125.395,352.669, 133.877,344.174, 144.372,344.174zM 107.603,193.823L 153.36,193.823L 153.36,148.066L 107.603,148.066zM 107.603,132.598L 153.36,132.598L 153.36,86.848L 107.603,86.848zM 236.52,193.823L 282.242,193.823L 282.242,148.066L 236.52,148.066zM 365.40,193.823L 411.155,193.823L 411.155,148.066L 365.40,148.066zM 365.40,255.05L 411.155,255.05L 411.155,209.319L 365.40,209.319zM 393.676,414.993l0.00-20.091 c 7.886-6.972, 12.886-17.154, 12.886-28.519c0.00-21.04-17.044-38.116-38.088-38.116 + c-21.069,0.00-38.114,17.076-38.114,38.116c0.00,11.365, 5.001,21.547, 12.885,28.519L 343.245,414.993 L 169.575,414.993 l0.00-20.091 + c 7.885-6.972, 12.885-17.154, 12.885-28.519c0.00-21.04-17.044-38.116-38.087-38.116c-21.07,0.00-38.114,17.076-38.114,38.116 + c0.00,11.365, 5.00,21.547, 12.884,28.519L 119.143,414.993 L 32.91,414.993 l0.00-415.021 l 447.103,0.00 L 480.013,414.993 L 393.676,414.993 z M 75.331,42.393L 75.331,307.647 l 363.134,0.00 + l 0.001-265.254L 75.331,42.393 zM 236.52,255.05L 282.242,255.05L 282.242,209.319L 236.52,209.319zM 300.972,255.05L 346.727,255.05L 346.727,209.319L 300.972,209.319zM 300.972,132.598L 346.727,132.598L 346.727,86.848L 300.972,86.848zM 300.972,193.823L 346.727,193.823L 346.727,148.066L 300.972,148.066z" /> +<glyph unicode="" d="M 317.874,207.586L 223.48,285.505L 223.48,240.826L 161.002,240.828L 161.002,174.352L 223.478,174.35L 223.478,129.682 zM 127.404,207.801c0.00,33.476, 14.616,63.534, 37.808,84.158L 32.002,336.244l0.00-260.247 L 224.50,12.002l0.00,84.27 + C 169.65,103.824, 127.404,150.875, 127.404,207.801zM 240.00,320.392c 15.104,0.00, 29.512-2.982, 42.674-8.377l 166.323,55.294L 240.50,436.634L 32.002,367.309l 165.772-55.11 + C 210.815,317.478, 225.066,320.392, 240.00,320.392zM 352.596,207.801c0.00-56.84-42.12-103.833-96.848-111.494l0.00-84.305 l 192.497,63.995L 448.245,336.244 l-133.391-44.345 + C 338.008,271.276, 352.596,241.244, 352.596,207.801z" /> +<glyph unicode="" d="M 32.002,75.997L 224.50,12.002L 224.50,272.249L 32.002,336.244 zM 240.50,436.634L 32.002,367.309L 240.50,297.995L 448.997,367.309 zM 255.748,12.002L 448.245,75.997L 448.245,336.244L 255.748,272.249 z" /> +<glyph unicode="" d="M 381.254,375.126c 11.729-16.323, 17.626-35.857, 17.626-58.604c0.00-23.444-5.932-42.296-17.78-56.524 + c-6.646-7.991-16.385-15.30-29.295-21.893c 19.581-7.107, 34.383-18.403, 44.349-33.856 + c 9.959-15.455, 14.956-34.229, 14.956-56.263c0.00-22.745-5.709-43.133-17.101-61.193 + c-7.229-11.979-16.293-22.063-27.188-30.225c-12.258-9.372-26.718-15.826-43.383-19.271 + c-16.664-3.508-34.728-5.213-54.244-5.213l-173.00,0.00 L 96.194,416.011 l 185.54,0.00 C 328.561,415.327, 361.734,401.689, 381.254,375.126z + M 172.782,349.338l0.00-84.655 l 93.312,0.00 c 16.665,0.00, 30.194,3.166, 40.59,9.496c 10.396,6.346, 15.609,17.581, 15.609,33.748 + c0.00,17.875-6.893,29.682-20.639,35.423c-11.854,3.987-26.969,5.988-45.366,5.988L 172.782,349.338 z M 172.782,201.115l0.00-102.344 l 93.22,0.00 + c 16.632,0.00, 29.604,2.229, 38.885,6.765c 16.813,8.317, 25.229,24.298, 25.229,47.914c0.00,19.983-8.161,33.698-24.479,41.147 + c-9.093,4.188-21.879,6.324-38.354,6.518L 172.782,201.115 z" /> +<glyph unicode="" d="M 448.146,103.733c-32.37,33.626-39.422,96.247-46.244,144.357C 391.786,319.403, 389.655,399.545, 288.00,410.034L 288.00,422.951 + c0.00,12.958-19.774,23.464-32.732,23.464c-12.957,0.00-31.266-10.506-31.266-23.464l0.00-12.935 + c-100.815-10.558-104.324-90.674-114.348-161.949c-6.768-48.132-13.766-110.76-45.87-144.402 + c-6.481-6.794-8.294-16.796-4.60-25.428c 3.698-8.639, 12.184-14.235, 21.576-14.235l 350.482,0.00 c 9.406,0.00, 17.907,5.619, 21.597,14.286 + C 456.516,86.938, 454.672,96.957, 448.146,103.733zM 256.00-14.555c 25.712,0.00, 46.557,20.845, 46.557,46.557l-93.113,0.00 C 209.443,6.29, 230.287-14.555, 256.00-14.555z" /> +<glyph unicode="" d="M 460.282,399.933c-29.559,29.429-80.832,26.523-110.294-3.051L 141.657,187.507 + c-21.036-21.129-23.084-57.451-1.914-78.236c 21.114-21.168, 57.359-19.016, 78.394,2.113l 129.454,130.282 + c 5.135,4.709, 5.525,12.354, 0.21,18.147c-4.96,5.409-15.472,5.629-19.813,1.268L 199.015,131.397l0.00,0.00 + c-12.636-12.629-25.909-14.955-38.576-2.518c-12.674,12.531-12.258,27.254, 0.345,39.916l0.00,0.00l 206.882,207.896l0.00,0.00l-0.04,0.037 + c 21.007,21.043, 50.964,23.467, 72.00,2.515c 20.731-20.977, 21.542-54.067, 0.265-75.111l 0.007,0.045L 186.923,49.795l 0.01-0.031 + c-28.166-26.053-75.066-31.572-106.799-0.541c-29.505,29.422-26.095,77.855, 0.506,107.701l 175.476,176.465 + c 2.717,2.805, 5.619,13.408-0.289,18.62c-5.189,4.579-15.311,5.955-18.934,2.314L 61.859,177.889 + c-43.236-45.451-41.512-112.49-3.464-150.205c 38.01-37.904, 106.534-40.826, 149.494,2.51L 461.10,284.58 + C 490.632,314.03, 489.853,370.50, 460.282,399.933z" /> +<glyph unicode="" d="M 256.023,463.354L 32.188,192.187L 160.536,192.187L 160.531-1.098L 351.492-1.098L 351.498,192.18L 479.813,192.18 z" /> +<glyph unicode="" d="M 496.124,223.978L 224.957,447.812L 224.957,319.464L 31.672,319.469L 31.672,128.508L 224.949,128.502L 224.949,0.188 z" /> +<glyph unicode="" d="M 15.544,223.978L 286.711,447.812L 286.711,319.464L 479.996,319.469L 479.996,128.508L 286.719,128.502L 286.719,0.188 z" /> +<glyph unicode="" d="M 255.977-15.256L 479.813,255.912L 351.463,255.912L 351.469,449.198L 160.507,449.198L 160.501,255.92L 32.188,255.92 z" /> +<glyph unicode="" d="M 395.786,207.949c-0.646,64.859, 52.894,95.965, 55.287,97.51c-30.085,44.022-76.946,50.053-93.647,50.749 + c-39.881,4.039-77.818-23.48-98.059-23.48c-20.189,0.00-51.423,22.884-84.50,22.281c-43.47-0.646-83.552-25.275-105.935-64.207 + c-45.164-78.371-11.565-194.472, 32.454-258.033c 21.51-31.111, 47.159-66.057, 80.835-64.808 + c 32.43,1.295, 44.693,20.983, 83.90,20.983c 39.208,0.00, 50.229-20.983, 84.549-20.339c 34.896,0.648, 57.006,31.707, 78.366,62.914 + c 24.702,36.094, 34.872,71.038, 35.472,72.832C 463.735,104.708, 396.461,130.479, 395.786,207.949z M 331.301,398.287 + c 17.874,21.685, 29.938,51.77, 26.647,81.783c-25.746-1.048-56.954-17.149-75.426-38.785 + c-16.575-19.194-31.083-49.826-27.194-79.24C 284.069,359.802, 313.408,376.65, 331.301,398.287z" /> +<glyph unicode="" d="M 432.00,320.00c-17.601,0.00-32.00-14.40-32.00-32.00l0.00-128.00 c0.00-17.60, 14.399-32.00, 32.00-32.00c 17.60,0.00, 32.00,14.40, 32.00,32.00L 464.00,288.00 C 464.00,305.60, 449.60,320.00, 432.00,320.00z + M 48.00,320.00c-17.601,0.00-32.00-14.40-32.00-32.00l0.00-128.00 c0.00-17.60, 14.399-32.00, 32.00-32.00c 17.60,0.00, 32.00,14.40, 32.00,32.00L 80.00,288.00 C 80.00,305.60, 65.599,320.00, 48.00,320.00z M 96.00,112.00 + c0.00-26.51, 21.49-48.00, 48.00-48.00l 16.00,0.00 l0.00-64.00 c0.00-17.60, 14.399-32.00, 32.00-32.00c 17.60,0.00, 32.00,14.40, 32.00,32.00l0.00,64.00 l 32.00,0.00 l0.00-64.00 c0.00-17.60, 14.40-32.00, 32.00-32.00 + c 17.599,0.00, 32.00,14.40, 32.00,32.00l0.00,64.00 l 16.00,0.00 c 26.51,0.00, 48.00,21.49, 48.00,48.00L 384.00,288.00 L 96.00,288.00 L 96.00,112.00 z M 299.299,435.253l 20.252,38.903 + c 1.016,1.951, 0.25,4.379-1.701,5.395c-1.951,1.016-4.379,0.25-5.396-1.701l-20.559-39.493C 275.797,444.581, 258.299,448.00, 240.00,448.00 + c-18.298,0.00-35.796-3.419-51.898-9.643L 167.544,477.849c-1.017,1.951-3.443,2.717-5.396,1.701 + c-1.952-1.016-2.717-3.443-1.701-5.395l 20.25-38.904c-45.314-20.509-78.119-63.792-83.81-115.252l 286.22,0.00 + C 377.42,371.461, 344.614,414.743, 299.299,435.253z M 176.00,344.80c-12.813,0.00-23.20,10.387-23.20,23.20s 10.387,23.20, 23.20,23.20 + c 12.813,0.00, 23.20-10.387, 23.20-23.20C 199.199,355.187, 188.813,344.80, 176.00,344.80z M 304.00,344.80c-12.813,0.00-23.201,10.387-23.201,23.20 + S 291.188,391.20, 304.00,391.20c 12.812,0.00, 23.198-10.387, 23.198-23.20S 316.813,344.80, 304.00,344.80z" /> +<glyph unicode="" d="M 32.74,415.823l0.00-64.651 L 480.00,351.172 L 480.00,415.823 L 32.74,415.823 z M 480.00,320.151L 32.74,320.151 l0.00-64.652 L 480.00,255.499 L 480.00,320.151 z M 480.00,223.831L 32.74,223.831 l0.00-64.667 L 480.00,159.164 + L 480.00,223.831 z M 479.854,127.831L 241.426,127.831 l0.00-64.667 l 238.428,0.00 L 479.854,127.831 z" /> +<glyph unicode="" d="M 32.741,415.823l0.00-64.651 L 480.00,351.172 L 480.00,415.823 L 32.741,415.823 z M 32.741,255.861L 480.00,255.861 l0.00,64.652 L 32.741,320.513 L 32.741,255.861 z M 32.741,159.164L 480.00,159.164 + l0.00,64.667 L 32.741,223.831 L 32.741,159.164 z M 32.887,63.164l 238.427,0.00 l0.00,64.668 L 32.887,127.832 L 32.887,63.164 z" /> +<glyph unicode="" d="M 32.37,415.823l0.00-64.651 l 447.26,0.00 L 479.63,415.823 L 32.37,415.823 z M 32.37,255.861l 447.26,0.00 l0.00,64.652 L 32.37,320.513 L 32.37,255.861 z M 32.37,158.99l 447.26,0.00 + l0.00,64.666 L 32.37,223.656 L 32.37,158.99 z M 136.786,63.164l 238.428,0.00 l0.00,64.668 L 136.786,127.832 L 136.786,63.164 z" /> +<glyph unicode="" d="M 55.773,415.998L 89.242,65.979L 179.998,156.734L 316.659,20.057L 451.689,155.088L 315.025,291.759L 405.758,382.491 z" /> +<glyph unicode="" d="M 451.689,415.998L 418.221,65.979L 327.465,156.734L 190.804,20.057L 55.773,155.088L 192.438,291.759L 101.705,382.491 z" /> +<glyph unicode="" d="M 55.773,28.153L 89.242,378.178L 179.998,287.422L 316.659,424.10L 451.689,289.069L 315.025,152.393L 405.758,61.661 z" /> +<glyph unicode="" d="M 451.689,28.153L 418.221,378.178L 327.465,287.422L 190.804,424.10L 55.773,289.069L 192.438,152.393L 101.705,61.661 z" /> +<glyph unicode="" d="M 255.50,479.00L 31.938,255.437L 159.688,255.437L 159.688-32.00L 351.313-32.00L 351.313,255.437L 479.063,255.437 z" /> +<glyph unicode="" d="M 142.056-32.649L-0.909,156.133L 88.021,223.45L 182.043,99.299L 418.531,479.002L 513.212,420.044L 233.86-32.649 + z" /> +<glyph unicode="" d="M 511.352,435.355L 467.354,479.351L 256.00,267.998L 44.646,479.351L 0.649,435.355L 212.003,224.00L 0.649,12.647L 44.646-31.351L 256.00,180.004L 467.354-31.351L 511.352,12.647L 299.997,224.00 + z" /> +<glyph unicode="" d="M 432.324,224.013c0.00,27.226, 16.741,48.712, 41.994,63.479c-4.563,15.178-10.563,29.739-17.998,43.431 + c-28.278-7.384-51.198,3.691-70.452,22.971c-19.254,19.228-25.15,42.149-17.741,70.453c-13.69,7.409-28.253,13.434-43.456,17.972 + c-14.767-25.254-41.456-41.996-68.685-41.996c-27.226,0.00-53.889,16.741-68.682,41.996c-15.204-4.539-29.74-10.563-43.456-17.972 + c 7.409-28.304, 1.512-51.225-17.742-70.453c-19.254-19.279-42.149-30.354-70.453-22.971c-7.409-13.692-13.434-28.253-17.972-43.431 + c 25.228-14.767, 41.996-36.252, 41.996-63.479c0.00-27.228-16.768-53.942-41.996-68.71c 4.539-15.177, 10.563-29.74, 17.972-43.43 + c 28.304,7.383, 51.199,1.488, 70.453-17.74c 19.254-19.28, 25.151-42.175, 17.742-70.454c 13.715-7.436, 28.251-13.459, 43.456-17.997 + c 14.793,25.228, 41.457,41.994, 68.682,41.994c 27.229,0.00, 53.918-16.767, 68.685-41.994c 15.203,4.538, 29.766,10.562, 43.456,17.997 + c-7.383,28.279-1.513,51.174, 17.741,70.454c 19.254,19.229, 42.174,30.327, 70.452,22.918c 7.436,13.692, 13.436,28.253, 17.998,43.482 + C 449.065,175.301, 432.324,196.785, 432.324,224.013z M 255.986,129.051c-52.428,0.00-94.936,42.508-94.936,94.962 + c0.00,52.43, 42.508,94.911, 94.936,94.911c 52.456,0.00, 94.938-42.481, 94.938-94.911C 350.924,171.559, 308.442,129.051, 255.986,129.051z" /> +<glyph unicode="" d="M 427.555,397.486L 84.457,397.486 l-28.806-54.838L 456.35,342.648 L 427.555,397.486zM 321.42,449.405L 189.754,449.405 l0.00-26.547 L 321.42,422.858 L 321.42,449.405 zM 114.156-1.405l 283.702,0.00 l 28.795,317.869L 85.348,316.464 L 114.156-1.405z M 322.633,288.831l 25.488,0.00 l0.00-261.495 l-25.488,0.00 L 322.633,288.831 z + M 242.424,288.831l 26.314,0.00 l0.00-261.495 l-26.314,0.00 L 242.424,288.831 z M 163.04,288.831l 26.328,0.00 l0.00-261.495 L 163.04,27.336 L 163.04,288.831 z" /> +<glyph class="hidden" unicode="" d="M0,480L 512 -32L0 -32 z" horiz-adv-x="0" /> +</font></defs></svg> \ No newline at end of file diff --git a/app/design/adminhtml/default/backend/mui/fonts/MUI-Icons.ttf b/app/design/adminhtml/default/backend/mui/fonts/MUI-Icons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ad27935ff5672575c593a4b1b86e8bd019b50456 Binary files /dev/null and b/app/design/adminhtml/default/backend/mui/fonts/MUI-Icons.ttf differ diff --git a/app/design/adminhtml/default/backend/mui/fonts/MUI-Icons.woff b/app/design/adminhtml/default/backend/mui/fonts/MUI-Icons.woff new file mode 100644 index 0000000000000000000000000000000000000000..699a9a667f4701a1cacffaf63f4951fc48f11c6c Binary files /dev/null and b/app/design/adminhtml/default/backend/mui/fonts/MUI-Icons.woff differ diff --git a/app/design/adminhtml/default/backend/mui/form.css b/app/design/adminhtml/default/backend/mui/form.css new file mode 100644 index 0000000000000000000000000000000000000000..42aa654cc903a234ae3d18e0c7f344946a5cb731 --- /dev/null +++ b/app/design/adminhtml/default/backend/mui/form.css @@ -0,0 +1,531 @@ +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ + +/* + Forms +-------------------------------------- */ +.form { +} + +/* + Fieldset +-------------------------------------- */ +.fieldset { + margin: 20px 0; + letter-spacing: -0.31em; /* webkit */ + word-spacing: -0.43em; /* IE < 8 && gecko */ +} + +.fieldset > * { + letter-spacing: normal; + word-spacing: normal; +} + +/* + Legend +-------------------------------------- */ +.legend { +} + +/* + Label +-------------------------------------- */ +.label { + margin: 0; + vertical-align: middle; +} + +/* + Control +-------------------------------------- */ +.control input { + vertical-align: middle; + margin: 0; +} + +.control select, +.control textarea { + margin: 0; + border-radius: 4px; +} + +/* + Field +-------------------------------------- */ +.field { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0 0 12px 0; +} + +.field > .label { + margin: 0 0 6px 6px; +} + +.field > .control { +} + +/* TODO: remove after all templates refactoring */ +span.required { + display: none; +} + +.field.required > .label:after { + content: '*'; + color: red; +} + +.field.alternative { +} + +/* + Radios and Checkboxes +-------------------------------------- */ +/* TODO: rename 'choice' class */ +.choice .control { + display: inline-block; + vertical-align: top; +} + +.choice > .label span:after { + content: ''; + margin: 0; +} + +.choice > .control { + width: auto; +} + +/* TODO: rename or remove 'extra' class */ +.extra { + margin: 5px 0 0; +} + +/* + Control with added before and after content +-------------------------------------- */ +.with-addon { +} + +.addon { + padding: 0; + display: table; + width: 100%; +} + +.addon textarea, +.addon select, +.addon input { + display: table-cell; + width: 100%; + border-radius: 0; + box-shadow: none; + margin: 0; +} + +.addon textarea:first-child, +.addon select:first-child, +.addon input:first-child, +.addon .addbefore:first-child { + border-radius: 4px 0 0 4px; +} + +.addon textarea:last-child, +.addon select:last-child, +.addon input:last-child, +.addon .addafter:last-child { + border-radius: 0 4px 4px 0; +} + +.addon .addbefore, +.addon .addafter { + background: #f5f5f5; + background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(top, #ffffff, #e6e6e6); + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-repeat: repeat-x; + vertical-align: middle; + width: 1px; + color: #666; + font-size: 11px; + font-weight: bold; + height: 0; + white-space: nowrap; + display: inline-block; + display: table-cell; + padding: 4px; + border: solid #ccc; + border-width: 1px 0 1px 1px; +} + +/*.addon {direction: rtl; } +.addon > * {direction: ltr; }*/ + +.addon *:focus ~ .addafter { + +} + +.addon .addafter { + border-width: 1px 1px 1px 0; +} + +.choice .addafter, +.choice .addbefore { + display: inline; +} + +/* Addon left aligned */ +.field-price .addon { + direction: rtl; +} + +.field-price .addon > * { + direction: ltr; +} + +.field-price .addon .addafter { + border-width: 1px 0 1px 1px; + border-radius: 4px 0 0 4px; +} + +.field-price .addon textarea:first-child, +.field-price .addon select:first-child, +.field-price .addon input:first-child { + border-radius: 0 4px 4px 0; +} + +.field-price .addon input:focus { + +} + +.field-price .addon .addafter { + /*background: none;*/ +} + +.field-price .addon .addafter:after { + +} + +.field-price .addon .addafter strong { + +} + +.field-price .addon input { + /*border-left: none;*/ +} + +.field-price .addon input:focus + .addafter { + +} + +/* + Field with note +-------------------------------------- */ +.with-note { +} + +.with-note .note, +.field .note { + font-size: 11px; + padding-left: 15px; + margin: 5px 0; + color: #666; +} + +.with-note .note:before, +.field .note:before { + position: absolute; + margin: 4px 0 0 -14px; + content: ''; + display: inline-block; + vertical-align: top; + font-size: 0; + line-height: 0; + width: 0; + border-bottom: 5px solid #666; + border-left: 5px solid transparent; + border-right: 5px solid transparent; +} + +/* + Form tooltip +-------------------------------------- */ +.with-tooltip.choice { + padding-right: 20px; +} + +.with-tooltip.choice, +.with-tooltip > .control { + position: relative; + z-index: 1; +} + +.with-tooltip.choice:hover, +.with-tooltip:hover > .control { + z-index: 998; +} + +.with-tooltip:not(.choice) .tooltip { + position: absolute; + left: 100%; + top: 3px; + vertical-align: middle; + margin: 4px 0 0 3px; +} + +.with-tooltip:not(.choice) .tooltip .help { + width: 12px; + overflow: hidden; +} + +/* + Form actions +-------------------------------------- */ +.form-actions { + padding: 10px; + margin: 10px 0; +} + +/* + Default view for fields: Labels are above the controls +-------------------------------------- */ +.form-inline .label, +.form-inline .control { + margin: 0; + float: left; + width: 55%; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +.form-inline .label { + width: 45%; + text-align: right; + padding: 5px 15px 0 0; +} + +.form-inline .choice { + position: relative; + z-index: 1; +} + +.form-inline .choice .control { + position: absolute; + margin-top: 4px; + width: auto; + left: 45%; +} + +.form-inline .choice .tooltip { + margin-left: 20px; + position: relative; + z-index: 1; + margin-top: 7px; +} + +.form-inline .with-tooltip:not(.choice) { + padding-top: 20px; +} + +.form-inline .control .control-value { + display: inline-block; + padding: 8px 0 0; +} + +/* + Field with multiple fields +-------------------------------------- */ +/* TODO: rename 'fields-group' class. Propose - 'group' */ + +[class^="fields-group-"] .field { + vertical-align: top; + margin: 0; + display: inline-block; +} + +[class^="fields-group-"] .field .label { + width: auto; + float: none; + text-align: left; + padding-right: 0; +} + +[class^="fields-group-"] .choice .label { + display: inline; +} + +[class^="fields-group-"] .field .control { + float: none; + width: auto; + margin-left: 0; +} + +/*.fields-group-2 .field { + width: 50% !important; + display: inline-block; +} + +.fields-group-3 .field { + width: 33.3% !important; + display: inline-block; +} + +.fields-group-4 .field { + width: 25% !important; + display: inline-block; +} + +.fields-group-5 .field { + width: 20% !important; + display: inline-block; +}*/ + +@media screen and (max-width: 960px) { + [class^="fields-group-"] .field { + width: 100% !important; + margin-bottom: 20px !important; + } +} + +[class^="fields-group-"] { + letter-spacing: -0.31em; /* webkit */ + word-spacing: -0.43em; /* IE < 8 && gecko */ +} + +[class^="fields-group-"] > * { + letter-spacing: normal; + word-spacing: normal; +} + +/* + Form field with nested controls inside +-------------------------------------- */ +.complex { +} + +.nested { + padding: 6px 0 0; +} + +.nested .choice .label, +.nested .choice .control { + float: none; + width: auto; + position: static; + left: auto; + text-align: left; + display: inline; + padding: 0; +} + +.control *:first-child { + margin-top: 0; +} + +.nested .field { + width: auto; + padding: 0; + margin: 5px 0; + display: block; +} + +.nested .field:first-child { + margin-top: 0; +} + +.nested .field:last-child { + margin-bottom: 0; +} + +/* + Cols +-------------------------------------- */ +.form-cols .fieldset { + padding-right: 0; +} + +.form-cols .fieldset > .field { + width: 50%; + display: inline-block; + vertical-align: top; + padding-right: 20px; +} + +.form-cols .fieldset > .with-tooltip:not(.choice) .tooltip { + right: 20px; +} + +@media screen and (max-width: 960px) { + .form-cols .fieldset > .field { + width: 100% !important; + display: block; + } +} + +.buttons[note]:after { + content: '* ' attr(note); + display: block; + clear: both; + font-size: 11px; + color: red; + margin-top: 10px; +} + +.qty .control, +.qty .label { + display: inline-block; + vertical-align: middle; + margin: 0; +} + +.qty .input-text { + width: 3em; + margin: 0; +} + +/* + Clearfix +-------------------------------------- */ +.buttons-set:before, +.buttons-set:after, +.form-inline .field:before, +.form-inline .field:after, +.form-actions:before, +.form-actions:after, +.clearfix:before, +.clearfix:after { + content: ""; + display: table; +} + +.buttons-set:after, +.form-inline .field:after, +.form-actions:after, +.clearfix:after { + clear: both; +} \ No newline at end of file diff --git a/app/design/adminhtml/default/backend/mui/grid.css b/app/design/adminhtml/default/backend/mui/grid.css new file mode 100644 index 0000000000000000000000000000000000000000..22292340518cc4ab982455c546e0fa8fb062bd85 --- /dev/null +++ b/app/design/adminhtml/default/backend/mui/grid.css @@ -0,0 +1,214 @@ +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ + +.grid-row { + width: 100%; +} +.grid-row > [class*="grid"] { + display: block; + float: left; + width: 100%; + margin-left: 2.127659574%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; +} + +.grid-row > [class*="grid"]:first-child { + margin-left: 0; +} + +.grid-row .grid-12 { + width: 99.99999998999999%; +} + +.grid-row .grid-11 { + width: 91.489361693%; +} + +.grid-row .grid-10 { + width: 82.97872339599999%; +} + +.grid-row .grid-9 { + width: 74.468085099%; +} + +.grid-row .grid-8 { + width: 65.95744680199999%; +} + +.grid-row .grid-7 { + width: 57.446808505%; +} + +.grid-row .grid-6 { + width: 48.93617020799999%; +} + +.grid-row .grid-5 { + width: 40.425531911%; +} + +.grid-row .grid-4 { + width: 31.914893614%; +} + +.grid-row .grid-3 { + width: 23.404255317%; +} + +.grid-row .grid-2_4 { + width: 18.29799%; +} + +.grid-row .grid-9_6 { + width: 79.574938722%; +} + +.grid-row .grid-7_2 { + width: 59.149289148%; +} + +.grid-row .grid-4_8 { + width: 38.723639574%; +} + +.grid-row .grid-2 { + width: 14.89361702%; +} + +.grid-row .grid-1 { + width: 6.382978723%; +} + +.grid-gap-1 { + margin-right: 8.510638297%; +} + +.grid-gap-2 { + margin-right: 17.021276594%; +} + +.grid-gap-3 { + margin-right: 25.531914891%; +} + +.grid-gap-4 { + margin-right: 34.042553188%; +} + +.grid-gap-5 { + margin-right: 42.553191485%; +} + +.grid-gap-6 { + margin-right: 51.06382978199999%; +} + +.grid-gap-7 { + margin-right: 59.574468079%; +} + +.grid-gap-8 { + margin-right: 68.08510637599999%; +} + +.grid-gap-9 { + margin-right: 76.595744673%; +} + +.grid-gap-10 { + margin-right: 85.10638296999999%; +} + +.grid-empty { + min-height: 1px; +} + +.grid-collapsed > [class*="grid"] { + margin-left: 0; +} + +.grid-collapsed .grid-1 { + width: 8.333333333%; +} + +.grid-collapsed .grid-2 { + width: 16.666666666%; +} + +.grid-collapsed .grid-3 { + width: 24.999999999%; +} +.grid-collapsed .grid-4 { + width: 33.333333332%; +} + +.grid-collapsed .grid-5 { + width: 41.666666665%; +} + +.grid-collapsed .grid-6 { + width: 49.999999998%; +} + +.grid-collapsed .grid-7 { + width: 58.333333331%; +} + +.grid-collapsed .grid-8 { + width: 66.666666644%; +} + +.grid-collapsed .grid-9 { + width: 74.999999997%; +} + +.grid-collapsed .grid-10 { + width: 83.333333333%; +} + +.grid-collapsed .grid-11 { + width: 91.666666663%; +} + +.grid-row:before, +.grid-row:after { + display: table; + content: ""; +} + +.grid-row:after { + clear: both; +} + +@media screen and (max-width: 960px) { + + .grid-row > [class*="grid"] { + width: 100%; + margin-left: 0; + } + +} \ No newline at end of file diff --git a/app/design/adminhtml/default/backend/mui/icons.css b/app/design/adminhtml/default/backend/mui/icons.css new file mode 100644 index 0000000000000000000000000000000000000000..745b712df364522b3dcc52b68db937dfb88bbb67 --- /dev/null +++ b/app/design/adminhtml/default/backend/mui/icons.css @@ -0,0 +1,560 @@ +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ + +@font-face { + font-family: 'MUI-Icons'; + src: url('fonts/MUI-Icons.eot'); + src: url('fonts/MUI-Icons.eot?#iefix') format('embedded-opentype'), url('fonts/MUI-Icons.svg#MUI-Icons') format('svg'), url('fonts/MUI-Icons.woff') format('woff'), url('fonts/MUI-Icons.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} + +/* Use the following CSS code if you want to use data attributes for inserting your icons */ +[data-icon]:before { + font-family: 'MUI-Icons'; + content: attr(data-icon); + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; +} + +/* Use the following CSS code if you want to have a class per icon */ +[class^="icon-"]:before, [class*=" icon-"]:before { + font-family: 'MUI-Icons'; + font-style: normal; + speak: none; + font-weight: normal; + -webkit-font-smoothing: antialiased; +} + +.icon-zoom-out:before { + content: "\e000"; +} + +.icon-zoom-in:before { + content: "\e001"; +} + +.icon-youtube:before { + content: "\e002"; +} + +.icon-wordpress:before { + content: "\e003"; +} + +.icon-windows-new:before { + content: "\e004"; +} + +.icon-windows:before { + content: "\e005"; +} + +.icon-warning:before { + content: "\e006"; +} + +.icon-vote-up:before { + content: "\e007"; +} + +.icon-vote-down:before { + content: "\e008"; +} + +.icon-vimeo:before { + content: "\e009"; +} + +.icon-video:before { + content: "\e00a"; +} + +.icon-user-group:before { + content: "\e00b"; +} + +.icon-user-card:before { + content: "\e00c"; +} + +.icon-user:before { + content: "\e00d"; +} + +.icon-upload:before { + content: "\e00e"; +} + +.icon-up-down:before { + content: "\e00f"; +} + +.icon-update:before { + content: "\e010"; +} + +.icon-unlock:before { + content: "\e011"; +} + +.icon-undo:before { + content: "\e012"; +} + +.icon-ul:before { + content: "\e013"; +} + +.icon-twitter:before { + content: "\e014"; +} + +.icon-tag:before { + content: "\e016"; +} + +.icon-stop:before { + content: "\e017"; +} + +.icon-star-half:before { + content: "\e018"; +} + +.icon-star-empty:before { + content: "\e019"; +} + +.icon-star:before { + content: "\e01a"; +} + +.icon-sort-desc:before { + content: "\e01b"; +} + +.icon-sort-asc:before { + content: "\e01c"; +} + +.icon-slideshow:before { + content: "\e01d"; +} + +.icon-search:before { + content: "\e01f"; +} + +.icon-rss:before { + content: "\e020"; +} + +.icon-rows:before { + content: "\e021"; +} + +.icon-resize-y:before { + content: "\e022"; +} + +.icon-resize-x:before { + content: "\e023"; +} + +.icon-redo:before { + content: "\e024"; +} + +.icon-quote-right:before { + content: "\e025"; +} + +.icon-quote:before { + content: "\e026"; +} + +.icon-printer:before { + content: "\e027"; +} + +.icon-present:before { + content: "\e028"; +} + +.icon-point-up:before { + content: "\e029"; +} + +.icon-point-right:before { + content: "\e02a"; +} + +.icon-point-left:before { + content: "\e02b"; +} + +.icon-point-down:before { + content: "\e02c"; +} + +.icon-plus:before { + content: "\e02d"; +} + +.icon-play:before { + content: "\e02e"; +} + +.icon-photo:before { + content: "\e02f"; +} + +.icon-phone:before { + content: "\e030"; +} + +.icon-paypal:before { + content: "\e031"; +} + +.icon-pause:before { + content: "\e032"; +} + +.icon-ol:before { + content: "\e033"; +} + +.icon-off:before { + content: "\e034"; +} + +.icon-nav-top:before { + content: "\e035"; +} + +.icon-nav-right:before { + content: "\e036"; +} + +.icon-nav-left:before { + content: "\e037"; +} + +.icon-nav-bottom:before { + content: "\e038"; +} + +.icon-move:before { + content: "\e039"; +} + +.icon-minus:before { + content: "\e03a"; +} + +.icon-map-pin:before { + content: "\e03b"; +} + +.icon-mail:before { + content: "\e03c"; +} + +.icon-magento:before { + content: "\e03d"; +} + +.icon-lock:before { + content: "\e03e"; +} + +.icon-link-break:before { + content: "\e03f"; +} + +.icon-link:before { + content: "\e040"; +} + +.icon-last:before { + content: "\e041"; +} + +.icon-key-delete:before { + content: "\e042"; +} + +.icon-key-backspace:before { + content: "\e043"; +} + +.icon-key:before { + content: "\e044"; +} + +.icon-italic:before { + content: "\e045"; +} + +.icon-info:before { + content: "\e046"; +} + +.icon-image:before { + content: "\e047"; +} + +.icon-home:before { + content: "\e048"; +} + +.icon-help:before { + content: "\e049"; +} + +.icon-grid:before { + content: "\e04a"; +} + +.icon-google-plus:before { + content: "\e04b"; +} + +.icon-globe:before { + content: "\e04c"; +} + +.icon-git:before { + content: "\e04d"; +} + +.icon-fullscreen-off:before { + content: "\e04e"; +} + +.icon-fullscreen:before { + content: "\e04f"; +} + +.icon-folder-open:before { + content: "\e050"; +} + +.icon-folder-move:before { + content: "\e051"; +} + +.icon-folder-delete:before { + content: "\e052"; +} + +.icon-folder-add:before { + content: "\e053"; +} + +.icon-folder:before { + content: "\e054"; +} + +.icon-flag-off:before { + content: "\e055"; +} + +.icon-flag:before { + content: "\e056"; +} + +.icon-first:before { + content: "\e057"; +} + +.icon-filter:before { + content: "\e058"; +} + +.icon-eye-closed:before { + content: "\e059"; +} + +.icon-eye:before { + content: "\e05a"; +} + +.icon-edit:before { + content: "\e05b"; +} + +.icon-document-delete:before { + content: "\e05c"; +} + +.icon-document-add:before { + content: "\e05d"; +} + +.icon-document:before { + content: "\e05e"; +} + +.icon-disabled:before { + content: "\e05f"; +} + +.icon-delivery:before { + content: "\e060"; +} + +.icon-delete:before { + content: "\e061"; +} + +.icon-database:before { + content: "\e062"; +} + +.icon-currency:before { + content: "\e063"; +} + +.icon-credit-card:before { + content: "\e064"; +} + +.icon-comment:before { + content: "\e065"; +} + +.icon-clock:before { + content: "\e066"; +} + +.icon-check-mark:before { + content: "\e067"; +} + +.icon-cart:before { + content: "\e068"; +} + +.icon-cancel:before { + content: "\e069"; +} + +.icon-calendar:before { + content: "\e06a"; +} + +.icon-box-move:before { + content: "\e06b"; +} + +.icon-box:before { + content: "\e06c"; +} + +.icon-bold:before { + content: "\e06d"; +} + +.icon-bell:before { + content: "\e06e"; +} + +.icon-attachment:before { + content: "\e06f"; +} + +.icon-arrow-up:before { + content: "\e070"; +} + +.icon-arrow-right:before { + content: "\e071"; +} + +.icon-arrow-left:before { + content: "\e072"; +} + +.icon-arrow-down:before { + content: "\e073"; +} + +.icon-apple:before { + content: "\e074"; +} + +.icon-android:before { + content: "\e075"; +} + +.icon-align-right:before { + content: "\e076"; +} + +.icon-align-left:before { + content: "\e077"; +} + +.icon-align-center:before { + content: "\e078"; +} + +.icon-arrow-ne:before { + content: "\e079"; +} + +.icon-arrow-nw:before { + content: "\e07a"; +} + +.icon-arrow-se:before { + content: "\e07b"; +} + +.icon-arrow-sw:before { + content: "\e07c"; +} + +.icon-arrow-up-long:before { + content: "\e015"; +} + +.icon-check:before { + content: "\e01e"; +} + +.icon-close:before { + content: "\e07d"; +} + +.icon-settings:before { + content: "\e07e"; +} + +.icon-trash:before { + content: "\e07f"; +} diff --git a/app/design/adminhtml/default/backend/mui/images/ajax-loader-big.gif b/app/design/adminhtml/default/backend/mui/images/ajax-loader-big.gif new file mode 100644 index 0000000000000000000000000000000000000000..d9bb3c55f66d47cbb619df0a930d6104db2375a7 Binary files /dev/null and b/app/design/adminhtml/default/backend/mui/images/ajax-loader-big.gif differ diff --git a/app/design/adminhtml/default/backend/mui/images/ajax-loader-small.gif b/app/design/adminhtml/default/backend/mui/images/ajax-loader-small.gif new file mode 100644 index 0000000000000000000000000000000000000000..5b33f7e54f4e55b6b8774d86d96895db9af044b4 Binary files /dev/null and b/app/design/adminhtml/default/backend/mui/images/ajax-loader-small.gif differ diff --git a/app/design/adminhtml/default/backend/mui/images/ajax-loader-white.gif b/app/design/adminhtml/default/backend/mui/images/ajax-loader-white.gif new file mode 100644 index 0000000000000000000000000000000000000000..2c09be409ab89fe57dc36daacd421a6e7ce74f28 Binary files /dev/null and b/app/design/adminhtml/default/backend/mui/images/ajax-loader-white.gif differ diff --git a/app/design/adminhtml/default/backend/mui/images/ajax-loader.gif b/app/design/adminhtml/default/backend/mui/images/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..1db51bc179425dc53ccc73f92d8330f5fce82e35 Binary files /dev/null and b/app/design/adminhtml/default/backend/mui/images/ajax-loader.gif differ diff --git a/app/design/adminhtml/default/backend/mui/images/ajax-loader.svg b/app/design/adminhtml/default/backend/mui/images/ajax-loader.svg new file mode 100644 index 0000000000000000000000000000000000000000..c70ae7529e9afe45eb082a85c3c99246d5b08c00 --- /dev/null +++ b/app/design/adminhtml/default/backend/mui/images/ajax-loader.svg @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="128px" height="128px" viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve"> +<g id="_x31_6x16_Spinner.psd" display="none"> + <defs> + <rect id="SVGID_1_" width="128" height="128"/> + </defs> + <clipPath id="SVGID_2_" display="inline"> + <use xlink:href="#SVGID_1_" overflow="visible"/> + </clipPath> + <g display="inline" clip-path="url(#SVGID_2_)"> + + <image overflow="visible" width="16" height="16" id="Layer_1_1_" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAFiAAABYgFfJ9BTAAAA +GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAWVJREFUeNqM098rQ3EYx/Fzdhgh +bcWW/GiKxKK2SKTcrP0PuFP+ABf+AP+Cf8OVe5dquMEVlgsZkhiFIys/3t/6HH2ds+GpV+1s5zzP +s+f5HseJRsz6XMQmPOef0YMNZHW9ghslaFbCoUbVTHxgFmu6bkUN70qawrP9gGdVbsMtrrCMYwwg +hx2M4RRlddMF31MXq1jCo27Oq5ttXffjBbvoxhxGcOaqgwwWMKUK60rwZnUaU+JhVHGkbn/EJBbr +zCaIrCp/h+mggDQ+NawSLhokaMc44nrWb9IwUkpQ+2PnprNOtChBpNNeTOjHepHRPZE1mn1PY0br +LGuI4cirgOniwXTsqlpR6zG7P9H/fMK5iiR1AktaaU7z2vKsYQaHJKl1VtCHUVyrsq8CFZ3IuyBB +VV+Y6c7jFXsYRAL76FCySx24ezP48BQTmvCBthIT0+GhEqd/extdDdQeWsHaSjy85i8BBgAjbUmT +DlLqrAAAAABJRU5ErkJggg==" transform="matrix(8 0 0 8 0 0)"> + </image> + </g> +</g> +<line fill="none" stroke="#363636" stroke-width="12" stroke-linecap="round" stroke-miterlimit="10" x1="64.001" y1="8.125" x2="64.001" y2="27.762"/> +<line fill="none" stroke="#484848" stroke-width="12" stroke-linecap="round" stroke-miterlimit="10" x1="36.062" y1="15.611" x2="45.88" y2="32.618"/> +<line fill="none" stroke="#5A5A5A" stroke-width="12" stroke-linecap="round" stroke-miterlimit="10" x1="15.611" y1="36.062" x2="32.618" y2="45.882"/> +<line fill="none" stroke="#6C6C6C" stroke-width="12" stroke-linecap="round" stroke-miterlimit="10" x1="8.126" y1="64" x2="27.764" y2="64"/> +<line fill="none" stroke="#7E7E7E" stroke-width="12" stroke-linecap="round" stroke-miterlimit="10" x1="15.612" y1="91.938" x2="32.619" y2="82.117"/> +<line fill="none" stroke="#909090" stroke-width="12" stroke-linecap="round" stroke-miterlimit="10" x1="36.064" y1="112.389" x2="45.883" y2="95.381"/> +<line fill="none" stroke="#A2A2A2" stroke-width="12" stroke-linecap="round" stroke-miterlimit="10" x1="64.001" y1="119.873" x2="64.001" y2="100.237"/> +<line fill="none" stroke="#B4B4B4" stroke-width="12" stroke-linecap="round" stroke-miterlimit="10" x1="91.939" y1="112.387" x2="82.121" y2="95.381"/> +<line fill="none" stroke="#C6C6C6" stroke-width="12" stroke-linecap="round" stroke-miterlimit="10" x1="112.391" y1="91.935" x2="95.386" y2="82.116"/> +<line fill="none" stroke="#000000" stroke-width="12" stroke-linecap="round" stroke-miterlimit="10" x1="119.875" y1="63.997" x2="100.241" y2="63.998"/> +<line fill="none" stroke="#121212" stroke-width="12" stroke-linecap="round" stroke-miterlimit="10" x1="112.389" y1="36.06" x2="95.384" y2="45.877"/> +<line fill="none" stroke="#242424" stroke-width="12" stroke-linecap="round" stroke-miterlimit="10" x1="91.937" y1="15.609" x2="82.118" y2="32.614"/> +</svg> diff --git a/app/design/adminhtml/default/backend/mui/images/pagination-arrows-bg.png b/app/design/adminhtml/default/backend/mui/images/pagination-arrows-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..5b12d1ab8cad687fd976c12a489aebc92f00510b Binary files /dev/null and b/app/design/adminhtml/default/backend/mui/images/pagination-arrows-bg.png differ diff --git a/app/design/adminhtml/default/backend/mui/images/rating-bg.png b/app/design/adminhtml/default/backend/mui/images/rating-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..e952b0fa4f1adfec1023439957488e107816b4aa Binary files /dev/null and b/app/design/adminhtml/default/backend/mui/images/rating-bg.png differ diff --git a/app/design/adminhtml/default/backend/mui/images/sorter-bg.png b/app/design/adminhtml/default/backend/mui/images/sorter-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..4331b917d955dcb5829cc5993c37fa39b2086998 Binary files /dev/null and b/app/design/adminhtml/default/backend/mui/images/sorter-bg.png differ diff --git a/app/design/adminhtml/default/backend/mui/images/view-mode-bg.png b/app/design/adminhtml/default/backend/mui/images/view-mode-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..54e2a1b9504147b320d3977068e1ab3d94a59021 Binary files /dev/null and b/app/design/adminhtml/default/backend/mui/images/view-mode-bg.png differ diff --git a/app/design/adminhtml/default/backend/mui/print.css b/app/design/adminhtml/default/backend/mui/print.css new file mode 100644 index 0000000000000000000000000000000000000000..670085836e67de8261e32336a4528ba43ae2720f --- /dev/null +++ b/app/design/adminhtml/default/backend/mui/print.css @@ -0,0 +1,87 @@ +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ + +/* ==|== print styles ======================================================= + Print styles. + Inlined to avoid required HTTP connection: h5bp.com/r + ========================================================================== */ + +@media print { + * { + background: transparent !important; + color: black !important; + box-shadow: none !important; + text-shadow: none !important; + filter: none !important; + -ms-filter: none !important; + } + + /* Black prints faster: h5bp.com/s */ + a, a:visited { + text-decoration: underline; + } + + a[href]:after { + content: " (" attr(href) ")"; + } + + abbr[title]:after { + content: " (" attr(title) ")"; + } + + .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { + content: ""; + } + + /* Don't show links for images, or javascript/internal links */ + pre, blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + + thead { + display: table-header-group; + } + + /* h5bp.com/t */ + tr, img { + page-break-inside: avoid; + } + + img { + max-width: 100% !important; + } + + @page { + margin: 0.5cm; + } + + p, h2, h3 { + orphans: 3; + widows: 3; + } + + h2, h3 { + page-break-after: avoid; + } +} diff --git a/app/design/adminhtml/default/backend/mui/reset.css b/app/design/adminhtml/default/backend/mui/reset.css new file mode 100644 index 0000000000000000000000000000000000000000..f50fa69e596f50cd5652f0b0db00d157c6ecdd0e --- /dev/null +++ b/app/design/adminhtml/default/backend/mui/reset.css @@ -0,0 +1,457 @@ +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ + +/*! normalize.css v2.1.0 | MIT License | git.io/normalize */ + +/* ========================================================================== + HTML5 display definitions + ========================================================================== */ + +/** + * Correct `block` display not defined in IE 8/9. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section, +summary { + display: block; +} + +/** + * Correct `inline-block` display not defined in IE 8/9. + */ + +audio, +canvas, +video { + display: inline-block; +} + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Address styling not present in IE 8/9. + */ + +[hidden] { + display: none; +} + +/* ========================================================================== + Base + ========================================================================== */ + +/** + * 1. Set default font family to sans-serif. + * 2. Prevent iOS text size adjust after orientation change, without disabling + * user zoom. + */ + +html { + font-family: sans-serif; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ + -ms-text-size-adjust: 100%; /* 2 */ +} + +html, body, button, input, select, textarea { + color: #676056; + font: 13px/1.333 Arial, Helvetica, sans-serif; +} + +/** + * Remove default margin. + */ + +body { + margin: 0; +} + +/* ========================================================================== + Links + ========================================================================== */ + +/** + * Address `outline` inconsistency between Chrome and other browsers. + */ + +a { + color: #19A3D1; +} + +a:visited { + color: #551a8b; +} + +a:hover { + color: #06e; +} + +a:focus { + outline: thin dotted; +} + +/** + * Improve readability when focused and also mouse hovered in all browsers. + */ + +a:active, +a:hover { + outline: 0; +} + +/* ========================================================================== + Typography + ========================================================================== */ + +/** + * Address variable `h1` font-size and margin within `section` and `article` + * contexts in Firefox 4+, Safari 5, and Chrome. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/** + * Address styling not present in IE 8/9, Safari 5, and Chrome. + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/** + * Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. + */ + +b, +strong { + font-weight: bold; +} + +/** + * Address styling not present in Safari 5 and Chrome. + */ + +dfn { + font-style: italic; +} + +/** + * Address differences between Firefox and other browsers. + */ + +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} + +/** + * Address styling not present in IE 8/9. + */ + +mark { + background: #ff0; + color: #000; +} + +/** + * Correct font family set oddly in Safari 5 and Chrome. + */ + +code, +kbd, +pre, +samp { + font-family: monospace, serif; + font-size: 1em; +} + +/** + * Improve readability of pre-formatted text in all browsers. + */ + +pre { + white-space: pre-wrap; +} + +/** + * Set consistent quote types. + */ + +q { + quotes: "\201C" "\201D" "\2018" "\2019"; +} + +/** + * Address inconsistent and variable font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* ============================================================================= + Lists + ========================================================================== */ + +ul, ol { + margin: 1em 0; + padding: 0 0 0 40px; +} + +dd { + margin: 0 0 0 40px; +} + +nav ul, nav ol { + list-style: none; + list-style-image: none; + margin: 0; + padding: 0; +} + + +/* ========================================================================== + Embedded content + ========================================================================== */ + +/** + * Remove border when inside `a` element in IE 8/9. + */ + +img { + border: 0; +} + +/** + * Correct overflow displayed oddly in IE 9. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* ========================================================================== + Figures + ========================================================================== */ + +/** + * Address margin not present in IE 8/9 and Safari 5. + */ + +figure { + margin: 0; +} + +/* ========================================================================== + Forms + ========================================================================== */ + +/** + * Define consistent border, margin, and padding. + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct `color` not being inherited in IE 8/9. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ + +legend { + border: 0; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * 1. Correct font family not being inherited in all browsers. + * 2. Correct font size not being inherited in all browsers. + * 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome. + */ + +button, +input, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 2 */ + margin: 0; /* 3 */ +} + +/** + * Address Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ + +button, +input { + line-height: normal; +} + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. + * Correct `select` style inheritance in Firefox 4+ and Opera. + */ + +button, +select { + text-transform: none; +} + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + */ + +button, +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ +} + +/** + * Re-set default cursor for disabled elements. + */ + +button[disabled], +html input[disabled] { + cursor: default; +} + +/** + * 1. Address box sizing set to `content-box` in IE 8/9. + * 2. Remove excess padding in IE 8/9. + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome + * (include `-moz` to future-proof). + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; /* 2 */ + box-sizing: content-box; +} + +/** + * Remove inner padding and search cancel button in Safari 5 and Chrome + * on OS X. + */ + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * Remove inner padding and border in Firefox 4+. + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/** + * 1. Remove default vertical scrollbar in IE 8/9. + * 2. Improve readability and alignment in all browsers. + */ + +textarea { + overflow: auto; /* 1 */ + vertical-align: top; /* 2 */ +} + +/* ========================================================================== + Tables + ========================================================================== */ + +/** + * Remove most spacing between table cells. + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} \ No newline at end of file diff --git a/app/design/adminhtml/default/backend/mui/utils.css b/app/design/adminhtml/default/backend/mui/utils.css new file mode 100644 index 0000000000000000000000000000000000000000..a0de0f57d1fa42df68d98cb48569aca80a80cff2 --- /dev/null +++ b/app/design/adminhtml/default/backend/mui/utils.css @@ -0,0 +1,52 @@ +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ + +/* + Helpers and Utils +-------------------------------------- */ + +/* Hide from both screenreaders and browsers: h5bp.com/u */ +.hidden { + display: none !important; + visibility: hidden; +} + +.no-display { + display: none; +} + +/* Hide visually and from screenreaders, but maintain layout */ +.invisible { + visibility: hidden; +} + +/* Contain floats: h5bp.com/q */ +.clearfix:before, +.clearfix:after { + content: ""; + display: table; +} + +.clearfix:after { + clear: both; +} \ No newline at end of file diff --git a/app/design/adminhtml/default/backend/theme.xml b/app/design/adminhtml/default/backend/theme.xml new file mode 100644 index 0000000000000000000000000000000000000000..2315d4040904fc094b81fd5d21168bba8c828188 --- /dev/null +++ b/app/design/adminhtml/default/backend/theme.xml @@ -0,0 +1,37 @@ +<!-- +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Design + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ +--> +<design> + <package code="default"> + <title>Backend</title> + <theme version="1.0.0.0" code="backend"> + <title>Magento 2 backend</title> + <requirements> + <magento_version from="2.0.0.0-dev1" to="*"/> + </requirements> + </theme> + </package> +</design> diff --git a/app/design/adminhtml/default/basic/boxes.css b/app/design/adminhtml/default/basic/boxes.css index 4529bcc78704671927d8da8cc4afba22b7f06226..b094413ced703002fe4c4bddbd8e40aa01ee1292 100644 --- a/app/design/adminhtml/default/basic/boxes.css +++ b/app/design/adminhtml/default/basic/boxes.css @@ -931,6 +931,12 @@ div.autocomplete ul li { padding:.5em .7em; min-height:32px; cursor:pointer; tex margin-left: 7px; font-size: 11px; } +.mage-suggest-dropdown .ui-menu { + float: none; +} +.mage-suggest-dropdown .ui-menu .ui-menu-item{ + margin: 0px; +} /* Footer */ .footer .bug-report { float:left; width:35%; text-align:left; } diff --git a/dev/tests/integration/framework/Magento/Test/Annotation/AppIsolation.php b/dev/tests/integration/framework/Magento/Test/Annotation/AppIsolation.php index 4e8be43ed80ca901046b56b7ba4d376ceb47806a..b0eae59019a795bbfdae74d1069910c0eb3ed877 100644 --- a/dev/tests/integration/framework/Magento/Test/Annotation/AppIsolation.php +++ b/dev/tests/integration/framework/Magento/Test/Annotation/AppIsolation.php @@ -37,11 +37,26 @@ class Magento_Test_Annotation_AppIsolation */ private $_hasNonIsolatedTests = true; + /** + * @var Magento_Test_Application + */ + private $_application; + /** * @var Zend_Cache_Core */ private $_cache; + /** + * Constructor + * + * @param Magento_Test_Application $application + */ + public function __construct(Magento_Test_Application $application) + { + $this->_application = $application; + } + /** * Isolate global application objects */ @@ -49,8 +64,7 @@ class Magento_Test_Annotation_AppIsolation { if ($this->_hasNonIsolatedTests) { $this->_cleanupCache(); - $this->_resetWorkingDirectory(); - Magento_Test_Bootstrap::getInstance()->reinitialize(); + $this->_application->reinitialize(); $this->_hasNonIsolatedTests = false; } } @@ -73,14 +87,6 @@ class Magento_Test_Annotation_AppIsolation ); } - /** - * Reset current working directory (CWD) - */ - protected function _resetWorkingDirectory() - { - chdir(Magento_Test_Bootstrap::getInstance()->getTestsDir()); - } - /** * Isolate application before running test case */ diff --git a/dev/tests/integration/framework/Magento/Test/Application.php b/dev/tests/integration/framework/Magento/Test/Application.php new file mode 100644 index 0000000000000000000000000000000000000000..e3e3ef5a5187e4c62e66358608de5bf20254fe40 --- /dev/null +++ b/dev/tests/integration/framework/Magento/Test/Application.php @@ -0,0 +1,357 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Magento + * @subpackage integration_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Encapsulates application installation, initialization and uninstall + * + * @todo Implement MAGETWO-1689: Standard Installation Method for Integration Tests + */ +class Magento_Test_Application +{ + /** + * DB vendor adapter instance + * + * @var Magento_Test_Db_DbAbstract + */ + protected $_db; + + /** + * @var Varien_Simplexml_Element + */ + protected $_localXml; + + /** + * Application *.xml configuration files + * + * @var array + */ + protected $_globalEtcFiles; + + /** + * Module declaration *.xml configuration files + * + * @var array + */ + protected $_moduleEtcFiles; + + /** + * Installation destination directory + * + * @var string + */ + protected $_installDir; + + /** + * Installation destination directory with configuration files + * + * @var string + */ + protected $_installEtcDir; + + /** + * Application initialization parameters + * + * @var array + */ + protected $_initParams = array(); + + /** + * Whether a developer mode is enabled or not + * + * @var bool + */ + protected $_isDeveloperMode = false; + + /** + * Constructor + * + * @param Magento_Test_Db_DbAbstract $dbInstance + * @param string $installDir + * @param Varien_Simplexml_Element $localXml + * @param array $globalEtcFiles + * @param array $moduleEtcFiles + * @param bool $isDeveloperMode + */ + public function __construct( + Magento_Test_Db_DbAbstract $dbInstance, $installDir, Varien_Simplexml_Element $localXml, + array $globalEtcFiles, array $moduleEtcFiles, $isDeveloperMode + ) { + $this->_db = $dbInstance; + $this->_localXml = $localXml; + $this->_globalEtcFiles = $globalEtcFiles; + $this->_moduleEtcFiles = $moduleEtcFiles; + $this->_isDeveloperMode = $isDeveloperMode; + + $this->_installDir = $installDir; + $this->_installEtcDir = "$installDir/etc"; + + $this->_initParams = array( + Mage_Core_Model_App::INIT_OPTION_DIRS => array( + Mage_Core_Model_Dir::CONFIG => $this->_installEtcDir, + Mage_Core_Model_Dir::VAR_DIR => $installDir, + Mage_Core_Model_Dir::MEDIA => "$installDir/media", + ), + ); + } + + /** + * Retrieve the database adapter instance + * + * @return Magento_Test_Db_DbAbstract + */ + public function getDbInstance() + { + return $this->_db; + } + + /** + * Get directory path with application instance custom data (cache, temporary directory, etc...) + */ + public function getInstallDir() + { + return $this->_installDir; + } + + /** + * Retrieve application initialization parameters + * + * @return array + */ + public function getInitParams() + { + return $this->_initParams; + } + + /** + * Weather the application is installed or not + * + * @return bool + */ + public function isInstalled() + { + return is_file($this->_installEtcDir . '/local.xml'); + } + + /** + * Initialize an already installed application + * + * @param array $overriddenParams + */ + public function initialize($overriddenParams = array()) + { + Mage::setIsDeveloperMode($this->_isDeveloperMode); + Mage::$headersSentThrowsException = false; + Mage::app($this->_customizeParams($overriddenParams)); + } + + /** + * Reset and initialize again an already installed application + * + * @param array $overriddenParams + */ + public function reinitialize(array $overriddenParams = array()) + { + $this->_resetApp(); + $this->initialize($overriddenParams); + } + + /** + * Run application normally, but with encapsulated initialization options + * + * @param array $overriddenParams + */ + public function run(array $overriddenParams) + { + Mage::run($this->_customizeParams($overriddenParams)); + } + + /** + * Cleanup both the database and the file system + */ + public function cleanup() + { + $this->_db->cleanup(); + $this->_cleanupFilesystem(); + } + + /** + * Install an application + * + * @param string $adminUserName + * @param string $adminPassword + * @param string $adminRoleName + * @throws Magento_Exception + */ + public function install($adminUserName, $adminPassword, $adminRoleName) + { + $this->_ensureDirExists($this->_installDir); + $this->_ensureDirExists($this->_installEtcDir); + $this->_ensureDirExists($this->_installDir . DIRECTORY_SEPARATOR . 'media'); + $this->_ensureDirExists($this->_installDir . DIRECTORY_SEPARATOR . 'theme'); + + /* Copy configuration files */ + $etcDirsToFilesMap = array( + $this->_installEtcDir => $this->_globalEtcFiles, + $this->_installEtcDir . '/modules' => $this->_moduleEtcFiles, + ); + foreach ($etcDirsToFilesMap as $targetEtcDir => $sourceEtcFiles) { + $this->_ensureDirExists($targetEtcDir); + foreach ($sourceEtcFiles as $sourceEtcFile) { + $targetEtcFile = $targetEtcDir . '/' . basename($sourceEtcFile); + copy($sourceEtcFile, $targetEtcFile); + } + } + + /* Make sure that local.xml contains an invalid installation date */ + $installDate = (string)$this->_localXml->global->install->date; + if ($installDate && strtotime($installDate)) { + throw new Magento_Exception('Local configuration must contain an invalid installation date.'); + } + + /* Replace local.xml */ + $targetLocalXml = $this->_installEtcDir . '/local.xml'; + $this->_localXml->asNiceXml($targetLocalXml); + + /* Initialize an application in non-installed mode */ + $this->initialize(); + + /* Run all install and data-install scripts */ + Mage_Core_Model_Resource_Setup::applyAllUpdates(); + Mage_Core_Model_Resource_Setup::applyAllDataUpdates(); + + /* Enable configuration cache by default in order to improve tests performance */ + Mage::app()->getCacheInstance()->saveOptions(array('config' => 1)); + + /* Fill installation date in local.xml to indicate that application is installed */ + $localXml = file_get_contents($targetLocalXml); + $localXml = str_replace($installDate, date('r'), $localXml, $replacementCount); + if ($replacementCount != 1) { + throw new Magento_Exception("Unable to replace installation date properly in '$targetLocalXml' file."); + } + file_put_contents($targetLocalXml, $localXml, LOCK_EX); + + /* Add predefined admin user to the system */ + $this->_createAdminUser($adminUserName, $adminPassword, $adminRoleName); + + /* Switch an application to installed mode */ + $this->initialize(); + } + + /** + * Sub-routine for merging custom parameters with the ones defined in object state + * + * @param array $params + * @return array + */ + private function _customizeParams($params) + { + return array_replace_recursive($this->_initParams, $params); + } + + /** + * Reset application global state + */ + protected function _resetApp() + { + /** @var $objectManager Magento_Test_ObjectManager */ + $objectManager = Mage::getObjectManager(); + $objectManager->clearCache(); + + $resource = Mage::registry('_singleton/Mage_Core_Model_Resource'); + + Mage::reset(); + Varien_Data_Form::setElementRenderer(null); + Varien_Data_Form::setFieldsetRenderer(null); + Varien_Data_Form::setFieldsetElementRenderer(null); + + if ($resource) { + Mage::register('_singleton/Mage_Core_Model_Resource', $resource); + } + } + + /** + * Create a directory with write permissions or don't touch existing one + * + * @throws Magento_Exception + * @param string $dir + */ + protected function _ensureDirExists($dir) + { + if (!file_exists($dir)) { + $old = umask(0); + mkdir($dir, 0777); + umask($old); + } else if (!is_dir($dir)) { + throw new Magento_Exception("'$dir' is not a directory."); + } + } + + /** + * Remove temporary files and directories from the filesystem + */ + protected function _cleanupFilesystem() + { + Varien_Io_File::rmdirRecursive($this->_installDir); + } + + /** + * Creates predefined admin user to be used by tests, where admin session is required + * + * @param string $adminUserName + * @param string $adminPassword + * @param string $adminRoleName + */ + protected function _createAdminUser($adminUserName, $adminPassword, $adminRoleName) + { + /** @var $user Mage_User_Model_User */ + $user = mage::getModel('Mage_User_Model_User'); + $user->setData(array( + 'firstname' => 'firstname', + 'lastname' => 'lastname', + 'email' => 'admin@example.com', + 'username' => $adminUserName, + 'password' => $adminPassword, + 'is_active' => 1 + )); + $user->save(); + + /** @var $roleAdmin Mage_User_Model_Role */ + $roleAdmin = Mage::getModel('Mage_User_Model_Role'); + $roleAdmin->load($adminRoleName, 'role_name'); + + /** @var $roleUser Mage_User_Model_Role */ + $roleUser = Mage::getModel('Mage_User_Model_Role'); + $roleUser->setData(array( + 'parent_id' => $roleAdmin->getId(), + 'tree_level' => $roleAdmin->getTreeLevel() + 1, + 'role_type' => Mage_User_Model_Acl_Role_User::ROLE_TYPE, + 'user_id' => $user->getId(), + 'role_name' => $user->getFirstname(), + )); + $roleUser->save(); + } +} diff --git a/dev/tests/integration/framework/Magento/Test/Bootstrap.php b/dev/tests/integration/framework/Magento/Test/Bootstrap.php index b79a7e56c2eaa69c8d2065c99c54db6354465593..98270cbfb9a4c6279ed033f4070f46acf8d99a04 100644 --- a/dev/tests/integration/framework/Magento/Test/Bootstrap.php +++ b/dev/tests/integration/framework/Magento/Test/Bootstrap.php @@ -26,7 +26,7 @@ */ /** - * Tests entry point. Implements application installation, initialization and uninstall + * Bootstrap for the integration testing environment */ class Magento_Test_Bootstrap { @@ -34,213 +34,102 @@ class Magento_Test_Bootstrap * Predefined admin user credentials */ const ADMIN_NAME = 'user'; - const ADMIN_PASSWORD = 'password'; - - const ADMIN_ROLE_NAME = 'Administrators'; - - /** - * @var Magento_Test_Bootstrap - */ - private static $_instance; + const ADMIN_PASSWORD = 'password1'; /** - * Filename of an existing local.xml configuration file - * - * @var string + * Predefined admin user role name */ - protected $_localXmlFile; + const ADMIN_ROLE_NAME = 'Administrators'; /** - * @var Varien_Simplexml_Element + * @var Magento_Test_Bootstrap_Settings */ - protected $_localXml; + private $_settings; /** - * Root directory of the Magento source code - * * @var string */ - protected $_magentoDir; + private $_dbVendorName; /** - * Root directory of the Magento integration tests - * - * @var string + * @var Magento_Test_Application */ - protected $_testsDir; + private $_application; /** - * Application *.xml configuration files - * - * @var array + * @var Magento_Test_Bootstrap_Environment */ - protected $_globalEtcFiles; + private $_envBootstrap; /** - * Module declaration *.xml configuration files - * - * @var array + * @var Magento_Test_Bootstrap_DocBlock */ - protected $_moduleEtcFiles; + private $_docBlockBootstrap; /** - * Configuration file with custom options - * - * @var array + * @var Magento_Test_Bootstrap_Profiler */ - protected $_customXmlFile; + private $_profilerBootstrap; /** - * Installation destination directory - * - * @var string + * @var Magento_Shell */ - protected $_installDir; + private $_shell; /** - * Installation destination directory with configuration files + * Temporary directory to be used to host the application installation sandbox * * @var string */ - protected $_installEtcDir; - - /** - * Application initialization parameters - * - * @var array - */ - protected $_initParams = array(); - - /** - * DB vendor name - * - * @var string - */ - protected $_dbVendorName = ''; - - /** - * DB vendor adapter instance - * - * @var Magento_Test_Db_DbAbstract - */ - protected $_db = null; - - /** - * Whether a developer mode is enabled or not - * - * @var bool - */ - protected $_isDeveloperMode = false; - - /** - * Set self instance for static access - * - * @param Magento_Test_Bootstrap $instance - */ - public static function setInstance(Magento_Test_Bootstrap $instance) - { - self::$_instance = $instance; - } - - /** - * Self instance getter - * - * @return Magento_Test_Bootstrap - * @throws Magento_Exception - */ - public static function getInstance() - { - if (!self::$_instance) { - throw new Magento_Exception('Bootstrap instance is not defined yet.'); - } - return self::$_instance; - } - - /** - * Check the possibility to send headers or to use headers related function (like set_cookie) - * - * @return bool - */ - public static function canTestHeaders() - { - if (!headers_sent() && extension_loaded('xdebug') && function_exists('xdebug_get_headers')) { - return true; - } - return false; - } + private $_tmpDir; /** - * Initialize DB configuration, db vendor and install dir + * Constructor * - * @param string $magentoDir - * @param string $testsDir - * @param string $localXmlFile - * @param string $globalEtcFiles - * @param string $moduleEtcFiles - * @param string $customXmlFile - * @param string $tmpDir + * @param Magento_Test_Bootstrap_Settings $settings + * @param Magento_Test_Bootstrap_Environment $envBootstrap + * @param Magento_Test_Bootstrap_DocBlock $docBlockBootstrap + * @param Magento_Test_Bootstrap_Profiler $profilerBootstrap * @param Magento_Shell $shell - * @param bool $isCleanupEnabled - * @param bool $isDeveloperMode - * @throws Magento_Exception - * - * @SuppressWarnings(PHPMD.ExcessiveParameterList) + * @param string $tmpDir */ public function __construct( - $magentoDir, $testsDir, $localXmlFile, $globalEtcFiles, $moduleEtcFiles, $customXmlFile, $tmpDir, - Magento_Shell $shell, $isCleanupEnabled = true, $isDeveloperMode = false + Magento_Test_Bootstrap_Settings $settings, + Magento_Test_Bootstrap_Environment $envBootstrap, + Magento_Test_Bootstrap_DocBlock $docBlockBootstrap, + Magento_Test_Bootstrap_Profiler $profilerBootstrap, + Magento_Shell $shell, + $tmpDir ) { - $this->_magentoDir = $magentoDir; - $this->_testsDir = $testsDir; - $this->_localXmlFile = $localXmlFile; - $this->_globalEtcFiles = $this->_exposeFiles($globalEtcFiles); - $this->_moduleEtcFiles = $this->_exposeFiles($moduleEtcFiles); - $this->_customXmlFile = $customXmlFile; - - $this->_readLocalXml(); - $this->_verifyDirectories($tmpDir); - - $sandboxUniqueId = md5(sha1_file($this->_localXmlFile) . '_' . $globalEtcFiles . '_' . $moduleEtcFiles); - $installDir = "{$tmpDir}/sandbox-{$this->_dbVendorName}-{$sandboxUniqueId}"; - $this->_ensureDirExists($installDir); - $this->_installDir = $installDir; - $this->_installEtcDir = "{$installDir}/etc"; - - $this->_initParams = array( - Mage_Core_Model_App::INIT_OPTION_DIRS => array( - Mage_Core_Model_Dir::CONFIG => $this->_installEtcDir, - Mage_Core_Model_Dir::VAR_DIR => $installDir, - Mage_Core_Model_Dir::MEDIA => "{$installDir}/media", + $this->_settings = $settings; + $this->_envBootstrap = $envBootstrap; + $this->_docBlockBootstrap = $docBlockBootstrap; + $this->_profilerBootstrap = $profilerBootstrap; + $this->_shell = $shell; + $this->_tmpDir = $tmpDir; + $this->_application = $this->_createApplication( + array( + $this->_settings->getAsConfigFile('TESTS_LOCAL_CONFIG_FILE'), + $this->_settings->getAsConfigFile('TESTS_LOCAL_CONFIG_EXTRA_FILE'), ), + $this->_settings->getAsMatchingPaths('TESTS_GLOBAL_CONFIG_FILES'), + $this->_settings->getAsMatchingPaths('TESTS_MODULE_CONFIG_FILES'), + $this->_settings->getAsBoolean('TESTS_MAGENTO_DEVELOPER_MODE') ); - - $this->_db = $this->_instantiateDb($shell); - - if ($isCleanupEnabled) { - $this->_cleanup(); - } - - $this->_isDeveloperMode = $isDeveloperMode; - - $this->_emulateEnvironment(); - - if ($this->_isInstalled()) { - $this->_initialize($this->_initParams); - } else { - $this->_install(); - } } /** - * Get directory path with application instance custom data (cache, temporary directory, etc...) + * Retrieve the application instance + * + * @return Magento_Test_Application */ - public function getInstallDir() + public function getApplication() { - return $this->_installDir; + return $this->_application; } /** - * Get DB vendor name + * Retrieve the database vendor name * * @return string */ @@ -250,356 +139,134 @@ class Magento_Test_Bootstrap } /** - * Initialize an already installed Magento application - * - * @param array $initParams - */ - protected function _initialize($initParams) - { - Mage::setIsDeveloperMode($this->_isDeveloperMode); - Mage::$headersSentThrowsException = false; - Mage::app($initParams); - } - - /** - * Initialize an already installed Magento application - * - * @param array $additionalParams - */ - public function reinitialize(array $additionalParams = array()) - { - $this->_resetApp(); - $this->_initialize($this->_customizeParams($additionalParams)); - } - - /** - * Run application normally, but with encapsulated initialization options - * - * @param array $additionalParams - */ - public function runApp(array $additionalParams) - { - Mage::run($this->_customizeParams($additionalParams)); - } - - /** - * Sub-routine for merging custom parameters with the ones defined in object state - * - * @param array $params - * @return array - */ - private function _customizeParams($params) - { - return array_replace_recursive($this->_initParams, $params); - } - - /** - * Reset application global state + * Perform bootstrap actions required to completely setup the testing environment */ - protected function _resetApp() + public function runBootstrap() { - /** @var $objectManager Magento_Test_ObjectManager */ - $objectManager = Mage::getObjectManager(); - $objectManager->clearCache(); - - $resource = Mage::registry('_singleton/Mage_Core_Model_Resource'); + $this->_envBootstrap->emulateHttpRequest($_SERVER); + $this->_envBootstrap->emulateSession($_SESSION); - Mage::reset(); - Varien_Data_Form::setElementRenderer(null); - Varien_Data_Form::setFieldsetRenderer(null); - Varien_Data_Form::setFieldsetElementRenderer(null); + $profilerOutputFile = $this->_settings->getAsFile('TESTS_PROFILER_FILE'); + if ($profilerOutputFile) { + $this->_profilerBootstrap->registerFileProfiler($profilerOutputFile); + } - if ($resource) { - Mage::register('_singleton/Mage_Core_Model_Resource', $resource); + $profilerOutputFile = $this->_settings->getAsFile('TESTS_BAMBOO_PROFILER_FILE'); + $profilerMetricsFile = $this->_settings->getAsFile('TESTS_BAMBOO_PROFILER_METRICS_FILE'); + if ($profilerOutputFile && $profilerMetricsFile) { + $this->_profilerBootstrap->registerBambooProfiler($profilerOutputFile, $profilerMetricsFile); } - } - /** - * Perform the application cleanup - */ - protected function _cleanup() - { - $this->_db->cleanup(); - $this->_cleanupFilesystem(); - } + $memoryBootstrap = $this->_createMemoryBootstrap( + $this->_settings->get('TESTS_MEM_USAGE_LIMIT', 0), $this->_settings->get('TESTS_MEM_LEAK_LIMIT', 0) + ); + $memoryBootstrap->activateStatsDisplaying(); + $memoryBootstrap->activateLimitValidation(); - /** - * Load application local.xml file, determine database vendor name - * - * @throws Magento_Exception - */ - protected function _readLocalXml() - { - if (!is_file($this->_localXmlFile)) { - throw new Magento_Exception("Local XML configuration file '{$this->_localXmlFile}' does not exist."); - } + $this->_docBlockBootstrap->registerAnnotations($this->_application); - // Read local.xml and merge customization file into it - $this->_localXml = simplexml_load_string(file_get_contents($this->_localXmlFile), - 'Varien_Simplexml_Element'); - if ($this->_customXmlFile) { - $additionalOptions = simplexml_load_string( - file_get_contents($this->_customXmlFile), 'Varien_Simplexml_Element' - ); - $this->_localXml->extend($additionalOptions); + if ($this->_settings->getAsBoolean('TESTS_CLEANUP')) { + $this->_application->cleanup(); } - - // Extract db vendor - $dbVendorId = (string)$this->_localXml->global->resources->default_setup->connection->model; - $dbVendorMap = array('mysql4' => 'mysql', 'mssql' => 'mssql', 'oracle' => 'oracle'); - if (!array_key_exists($dbVendorId, $dbVendorMap)) { - throw new Magento_Exception("Database vendor '{$dbVendorId}' is not supported."); + if ($this->_application->isInstalled()) { + $this->_application->initialize(); + } else { + $this->_application->install(self::ADMIN_NAME, self::ADMIN_PASSWORD, self::ADMIN_ROLE_NAME); } - $this->_dbVendorName = $dbVendorMap[$dbVendorId]; } /** - * Check all required directories contents and permissions + * Create and return new memory bootstrap instance * - * @param string $tmpDir - * @throws Magento_Exception when any of required directories is not eligible + * @param int $memUsageLimit + * @param int $memLeakLimit + * @return Magento_Test_Bootstrap_Memory */ - protected function _verifyDirectories($tmpDir) + protected function _createMemoryBootstrap($memUsageLimit, $memLeakLimit) { - /* Magento application dir */ - if (!is_file($this->_magentoDir . '/app/bootstrap.php')) { - throw new Magento_Exception('Unable to locate Magento root folder and bootstrap.php.'); - } - /* Temporary directory */ - if (!is_dir($tmpDir) || !is_writable($tmpDir)) { - throw new Magento_Exception("The '{$tmpDir}' is not a directory or not writable."); - } + return new Magento_Test_Bootstrap_Memory(new Magento_Test_MemoryLimit( + $memUsageLimit, $memLeakLimit, new Magento_Test_Helper_Memory($this->_shell) + )); } /** - * Create object of configured DB vendor adapter + * Create and return new application instance * - * @param Magento_Shell $shell - * @return Magento_Test_Db_DbAbstract + * @param array $localConfigFiles + * @param array $globalConfigFiles + * @param array $moduleConfigFiles + * @param bool $isDeveloperMode + * @return Magento_Test_Application */ - protected function _instantiateDb(Magento_Shell $shell) - { - $suffix = ucfirst($this->_dbVendorName); - require_once dirname(__FILE__) . '/Db/DbAbstract.php'; - require_once dirname(__FILE__) . "/Db/{$suffix}.php"; - $class = "Magento_Test_Db_{$suffix}"; - $dbConfig = $this->_localXml->global->resources->default_setup->connection; - $this->_ensureDirExists($this->_installDir); - return new $class( + protected function _createApplication( + array $localConfigFiles, array $globalConfigFiles, array $moduleConfigFiles, $isDeveloperMode + ) { + $localConfigXml = $this->_loadConfigFiles($localConfigFiles); + $dbConfig = $localConfigXml->global->resources->default_setup->connection; + $this->_dbVendorName = $this->_determineDbVendorName($dbConfig); + $sandboxUniqueId = $this->_calcConfigFilesHash($localConfigFiles); + $installDir = "{$this->_tmpDir}/sandbox-{$this->_dbVendorName}-{$sandboxUniqueId}"; + $dbClass = 'Magento_Test_Db_' . ucfirst($this->_dbVendorName); + /** @var $dbInstance Magento_Test_Db_DbAbstract */ + $dbInstance = new $dbClass( (string)$dbConfig->host, (string)$dbConfig->username, (string)$dbConfig->password, (string)$dbConfig->dbname, - $this->_installDir, - $shell + $this->_tmpDir, + $this->_shell ); - } - - /** - * Weather the application is installed or not - * - * @return bool - */ - protected function _isInstalled() - { - return is_file($this->_installEtcDir . '/local.xml'); - } - - /** - * Set environment variables or apply workarounds, so that they would be closer to real application - */ - protected function _emulateEnvironment() - { - // emulate HTTP request - $_SERVER['HTTP_HOST'] = 'localhost'; - // emulate entry point to ensure that tests generate invariant URLs - $_SERVER['SCRIPT_FILENAME'] = 'index.php'; - // prevent session_start, because it may rely on cookies - $_SESSION = array(); - // application relies on a non-empty session ID - session_id(uniqid()); - } - - /** - * Create a directory with write permissions or don't touch existing one - * - * @throws Magento_Exception - * @param string $dir - */ - protected function _ensureDirExists($dir) - { - if (!file_exists($dir)) { - $old = umask(0); - mkdir($dir, 0777); - umask($old); - } else if (!is_dir($dir)) { - throw new Magento_Exception("'$dir' is not a directory."); - } - } - - /** - * Remove entire directory from the file system - * - * @param string $dir - * @param bool $removeDirItself Whether to remove directory itself along with all its children - */ - protected function _removeDirectory($dir, $removeDirItself = true) - { - foreach (scandir($dir) as $dirOrFile) { - if ($dirOrFile == '.' || $dirOrFile == '..') { - continue; - } - $dirOrFile = $dir . DIRECTORY_SEPARATOR . $dirOrFile; - if (is_dir($dirOrFile)) { - $this->_removeDirectory($dirOrFile); - } else { - unlink($dirOrFile); - } - } - if ($removeDirItself) { - rmdir($dir); - } - } - - /** - * Install application using temporary directory and vendor-specific database settings - * - * @throws Magento_Exception - */ - protected function _install() - { - $this->_ensureDirExists($this->_installDir); - $this->_ensureDirExists($this->_installEtcDir); - $this->_ensureDirExists($this->_installDir . DIRECTORY_SEPARATOR . 'media'); - $this->_ensureDirExists($this->_installDir . DIRECTORY_SEPARATOR . 'theme'); - - /* Copy *.xml configuration files */ - $dirs = array( - $this->_installEtcDir => $this->_globalEtcFiles, - $this->_installEtcDir . '/modules' => $this->_moduleEtcFiles, + return new Magento_Test_Application( + $dbInstance, $installDir, $localConfigXml, $globalConfigFiles, $moduleConfigFiles, $isDeveloperMode ); - foreach ($dirs as $targetEtcDir => $sourceEtcFiles) { - $this->_ensureDirExists($targetEtcDir); - foreach ($sourceEtcFiles as $sourceEtcFile) { - $targetEtcFile = $targetEtcDir . '/' . basename($sourceEtcFile); - copy($sourceEtcFile, $targetEtcFile); - } - } - - /* Make sure that local.xml contains an invalid installation date */ - $installDate = (string)$this->_localXml->global->install->date; - if ($installDate && strtotime($installDate)) { - throw new Magento_Exception( - "Configuration file '$this->_localXmlFile' must contain an invalid installation date." - ); - } - - /* Replace local.xml */ - $targetLocalXml = $this->_installEtcDir . '/local.xml'; - $this->_localXml->asNiceXml($targetLocalXml); - - /* Initialize an application in non-installed mode */ - $this->_initialize($this->_initParams); - - /* Run all install and data-install scripts */ - Mage_Core_Model_Resource_Setup::applyAllUpdates(); - Mage_Core_Model_Resource_Setup::applyAllDataUpdates(); - - /* Enable configuration cache by default in order to improve tests performance */ - Mage::app()->getCacheInstance()->saveOptions(array('config' => 1)); - - /* Fill installation date in local.xml to indicate that application is installed */ - $localXml = file_get_contents($targetLocalXml); - $localXml = str_replace($installDate, date('r'), $localXml, $replacementCount); - if ($replacementCount != 1) { - throw new Magento_Exception("Unable to replace installation date properly in '$targetLocalXml' file."); - } - file_put_contents($targetLocalXml, $localXml, LOCK_EX); - - /* Add predefined admin user to the system */ - $this->_createAdminUser(); - - /* Switch an application to installed mode */ - $this->_initialize($this->_initParams); - } - - /** - * Remove temporary files and directories from the filesystem - */ - protected function _cleanupFilesystem() - { - $this->_removeDirectory($this->_installDir); } /** - * Expose provided pattern to the real files + * Calculate and return hash of config files' contents * - * @param string $pattern - * @return array + * @param array $configFiles + * @return string */ - protected function _exposeFiles($pattern) + protected function _calcConfigFilesHash($configFiles) { $result = array(); - $allPatterns = preg_split('/\s*;\s*/', trim($pattern), -1, PREG_SPLIT_NO_EMPTY); - foreach ($allPatterns as $onePattern) { - /** TODO: fix directory separators */ - $onePattern = dirname(__FILE__) . '/../../../' . $onePattern; - $files = glob($onePattern, GLOB_BRACE); - $result = array_merge($result, $files); + foreach ($configFiles as $configFile) { + $result[] = sha1_file($configFile); } + $result = md5(implode('_', $result)); return $result; } /** - * Creates predefined admin user to be used by tests, where admin session is required + * @param array $configFiles + * @return Varien_Simplexml_Element */ - protected function _createAdminUser() + protected function _loadConfigFiles(array $configFiles) { - /** @var $user Mage_User_Model_User */ - $user = mage::getModel('Mage_User_Model_User'); - $user->setData(array( - 'firstname' => 'firstname', - 'lastname' => 'lastname', - 'email' => 'admin@example.com', - 'username' => self::ADMIN_NAME, - 'password' => self::ADMIN_PASSWORD, - 'is_active' => 1 - )); - $user->save(); - - /** @var $roleAdmin Mage_User_Model_Role */ - $roleAdmin = Mage::getModel('Mage_User_Model_Role'); - $roleAdmin->load(self::ADMIN_ROLE_NAME, 'role_name'); - - /** @var $roleUser Mage_User_Model_Role */ - $roleUser = Mage::getModel('Mage_User_Model_Role'); - $roleUser->setData(array( - 'parent_id' => $roleAdmin->getId(), - 'tree_level' => $roleAdmin->getTreeLevel() + 1, - 'role_type' => Mage_User_Model_Acl_Role_User::ROLE_TYPE, - 'user_id' => $user->getId(), - 'role_name' => $user->getFirstname(), - )); - $roleUser->save(); - } - - /** - * Returns path to integration tests root directory - * - * @return string - */ - public function getTestsDir() - { - return $this->_testsDir; + /** @var $result Varien_Simplexml_Element */ + $result = simplexml_load_string('<config/>', 'Varien_Simplexml_Element'); + foreach ($configFiles as $configFile) { + /** @var $configXml Varien_Simplexml_Element */ + $configXml = simplexml_load_file($configFile, 'Varien_Simplexml_Element'); + $result->extend($configXml); + } + return $result; } /** - * Get application initialization parameters + * Retrieve database vendor name from the database connection XML configuration * - * @return array + * @param SimpleXMLElement $dbConfig + * @return string + * @throws Magento_Exception */ - public function getInitParams() + protected function _determineDbVendorName(SimpleXMLElement $dbConfig) { - return $this->_initParams; + $dbVendorAlias = (string)$dbConfig->model; + $dbVendorMap = array('mysql4' => 'mysql', 'mssql' => 'mssql', 'oracle' => 'oracle'); + if (!array_key_exists($dbVendorAlias, $dbVendorMap)) { + throw new Magento_Exception("Database vendor '$dbVendorAlias' is not supported."); + } + return $dbVendorMap[$dbVendorAlias]; } } diff --git a/dev/tests/integration/framework/Magento/Test/Bootstrap/DocBlock.php b/dev/tests/integration/framework/Magento/Test/Bootstrap/DocBlock.php new file mode 100644 index 0000000000000000000000000000000000000000..beec7e9af9227137ced6b20a01f9089ec4c49771 --- /dev/null +++ b/dev/tests/integration/framework/Magento/Test/Bootstrap/DocBlock.php @@ -0,0 +1,72 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Magento + * @subpackage integration_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Bootstrap of the custom DocBlock annotations + * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class Magento_Test_Bootstrap_DocBlock +{ + /** + * @var string + */ + private $_fixturesBaseDir; + + /** + * @param string $fixturesBaseDir + */ + public function __construct($fixturesBaseDir) + { + $this->_fixturesBaseDir = $fixturesBaseDir; + } + + /** + * Activate custom DocBlock annotations along with more-or-less permanent workarounds + */ + public function registerAnnotations(Magento_Test_Application $application) + { + /* + * Note: order of registering (and applying) annotations is important. + * To allow config fixtures to deal with fixture stores, data fixtures should be processed first. + */ + $eventManager = new Magento_Test_EventManager(array( + new Magento_Test_Workaround_Segfault(), + new Magento_Test_Workaround_Cleanup_TestCaseProperties(), + new Magento_Test_Workaround_Cleanup_StaticProperties(), + new Magento_Test_Isolation_WorkingDirectory(), + new Magento_Test_Annotation_AppIsolation($application), + new Magento_Test_Event_Transaction(new Magento_Test_EventManager(array( + new Magento_Test_Annotation_DbIsolation(), + new Magento_Test_Annotation_DataFixture($this->_fixturesBaseDir), + ))), + new Magento_Test_Annotation_ConfigFixture(), + )); + Magento_Test_Event_PhpUnit::setDefaultEventManager($eventManager); + Magento_Test_Event_Magento::setDefaultEventManager($eventManager); + } +} diff --git a/dev/tests/integration/framework/Magento/Test/Bootstrap/Environment.php b/dev/tests/integration/framework/Magento/Test/Bootstrap/Environment.php new file mode 100644 index 0000000000000000000000000000000000000000..9b720c0ccfa9ad969f6a3433ced0a0ea598e7202 --- /dev/null +++ b/dev/tests/integration/framework/Magento/Test/Bootstrap/Environment.php @@ -0,0 +1,58 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Magento + * @subpackage integration_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Bootstrap of the HTTP environment + */ +class Magento_Test_Bootstrap_Environment +{ + /** + * Emulate properties typical to an HTTP request + * + * @param array $serverVariables + */ + public function emulateHttpRequest(array &$serverVariables) + { + // emulate HTTP request + $serverVariables['HTTP_HOST'] = 'localhost'; + // emulate entry point to ensure that tests generate invariant URLs + $serverVariables['SCRIPT_FILENAME'] = 'index.php'; + } + + /** + * Emulate already started PHP session + * + * @param array|null $sessionVariables + */ + public function emulateSession(&$sessionVariables) + { + // prevent session_start, because it may rely on cookies + $sessionVariables = array(); + // application relies on a non-empty session ID + session_id(uniqid()); + } +} diff --git a/dev/tests/integration/framework/Magento/Test/Bootstrap/Memory.php b/dev/tests/integration/framework/Magento/Test/Bootstrap/Memory.php new file mode 100644 index 0000000000000000000000000000000000000000..d625cf62ee564f82dbd6f423ff16b4afbec106b5 --- /dev/null +++ b/dev/tests/integration/framework/Magento/Test/Bootstrap/Memory.php @@ -0,0 +1,85 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Magento + * @subpackage integration_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Bootstrap of the memory monitoring + */ +class Magento_Test_Bootstrap_Memory +{ + /** + * Policy to perform requested actions on shutdown + */ + const POLICY_SHUTDOWN = 'register_shutdown_function'; + + /** + * @var Magento_Test_MemoryLimit + */ + private $_memoryLimit; + + /** + * @var callable + */ + private $_activationPolicy; + + /** + * @param Magento_Test_MemoryLimit $memoryLimit + * @param callable|string $activationPolicy + * @throws InvalidArgumentException + */ + public function __construct(Magento_Test_MemoryLimit $memoryLimit, $activationPolicy = self::POLICY_SHUTDOWN) + { + if (!is_callable($activationPolicy)) { + throw new InvalidArgumentException('Activation policy is expected to be a callable.'); + } + $this->_memoryLimit = $memoryLimit; + $this->_activationPolicy = $activationPolicy; + } + + /** + * Display memory usage statistics + */ + public function displayStats() + { + echo $this->_memoryLimit->printHeader() . $this->_memoryLimit->printStats() . PHP_EOL; + } + + /** + * Activate displaying of the memory usage statistics + */ + public function activateStatsDisplaying() + { + call_user_func($this->_activationPolicy, array($this, 'displayStats')); + } + + /** + * Activate validation of the memory usage/leak limitations + */ + public function activateLimitValidation() + { + call_user_func($this->_activationPolicy, array($this->_memoryLimit, 'validateUsage')); + } +} diff --git a/dev/tests/integration/framework/Magento/Test/Bootstrap/Profiler.php b/dev/tests/integration/framework/Magento/Test/Bootstrap/Profiler.php new file mode 100644 index 0000000000000000000000000000000000000000..5a86740694abe966031182c8d208e62d7579aa04 --- /dev/null +++ b/dev/tests/integration/framework/Magento/Test/Bootstrap/Profiler.php @@ -0,0 +1,95 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Magento + * @subpackage integration_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Bootstrap of the application profiler + */ +class Magento_Test_Bootstrap_Profiler +{ + /** + * Profiler driver instance + * + * @var Magento_Profiler_Driver_Standard + */ + protected $_driver; + + /** + * Whether a profiler driver has been already registered or not + * + * @var bool + */ + protected $_isDriverRegistered = false; + + /** + * Constructor + * + * @param Magento_Profiler_Driver_Standard $driver + */ + public function __construct(Magento_Profiler_Driver_Standard $driver) + { + $this->_driver = $driver; + } + + /** + * Register profiler driver to involve it into the results processing + */ + protected function _registerDriver() + { + if (!$this->_isDriverRegistered) { + $this->_isDriverRegistered = true; + Magento_Profiler::add($this->_driver); + } + } + + /** + * Register file-based profiling + * + * @param string $profilerOutputFile + */ + public function registerFileProfiler($profilerOutputFile) + { + $this->_registerDriver(); + $this->_driver->registerOutput(new Magento_Profiler_Driver_Standard_Output_Csvfile(array( + 'filePath' => $profilerOutputFile + ))); + } + + /** + * Register profiler with Bamboo-friendly output format + * + * @param string $profilerOutputFile + * @param string $profilerMetricsFile + */ + public function registerBambooProfiler($profilerOutputFile, $profilerMetricsFile) + { + $this->_registerDriver(); + $this->_driver->registerOutput(new Magento_Test_Profiler_OutputBamboo(array( + 'filePath' => $profilerOutputFile, + 'metrics' => require($profilerMetricsFile) + ))); + } +} diff --git a/dev/tests/integration/framework/Magento/Test/Bootstrap/Settings.php b/dev/tests/integration/framework/Magento/Test/Bootstrap/Settings.php new file mode 100644 index 0000000000000000000000000000000000000000..5dd55c6c3c5aadfb9ed2700d18c8824cee0f46c8 --- /dev/null +++ b/dev/tests/integration/framework/Magento/Test/Bootstrap/Settings.php @@ -0,0 +1,167 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Magento + * @subpackage integration_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Convenient access to the bootstrap settings + */ +class Magento_Test_Bootstrap_Settings +{ + /** + * Base directory to be used to resolve relative paths + * + * @var string + */ + private $_baseDir; + + /** + * Key-value pairs of the settings + * + * @var array + */ + private $_settings = array(); + + /** + * Constructor + * + * @param string $baseDir + * @param array $settings + * @throws InvalidArgumentException + */ + public function __construct($baseDir, array $settings) + { + if (!is_dir($baseDir)) { + throw new InvalidArgumentException("Base path '$baseDir' has to be an existing directory."); + } + $this->_baseDir = realpath($baseDir); + $this->_settings = $settings; + } + + /** + * Retrieve a setting value as is + * + * @param string $settingName + * @param mixed $defaultValue + * @return mixed + */ + public function get($settingName, $defaultValue = null) + { + return (array_key_exists($settingName, $this->_settings) ? $this->_settings[$settingName] : $defaultValue); + } + + /** + * Interpret a setting value as a switch and return TRUE when it equals to the string "enabled" or FALSE otherwise + * + * @param string $settingName + * @return bool + * @SuppressWarnings(PHPMD.BooleanGetMethodName) + */ + public function getAsBoolean($settingName) + { + return ($this->get($settingName) === 'enabled'); + } + + /** + * Interpret a setting value as a relative file name and return absolute path to it + * + * @param string $settingName + * @param string $defaultValue + * @return string + */ + public function getAsFile($settingName, $defaultValue = '') + { + $result = $this->get($settingName, $defaultValue); + if ($result !== '') { + $result = $this->_resolvePath($result); + } + return $result; + } + + /** + * Interpret a setting value as a file optionally falling back to the '.dist' file and return absolute path to it + * + * @param string $settingName + * @return string + * @throws Magento_Exception + */ + public function getAsConfigFile($settingName) + { + $result = $this->getAsFile($settingName); + if ($result !== '') { + if (!is_file($result) && substr($result, -5) != '.dist') { + $result .= '.dist'; + } + if (is_file($result)) { + return $result; + } + } + throw new Magento_Exception("Setting '$settingName' specifies the non-existing file '$result'."); + } + + /** + * Interpret a setting value as a semicolon-separated relative glob pattern(s) and return matched absolute paths + * + * @param string $settingName + * @return array + */ + public function getAsMatchingPaths($settingName) + { + $settingValue = $this->get($settingName, ''); + if ($settingValue !== '') { + return $this->_resolvePathPattern($settingValue); + } + return array(); + } + + /** + * Return an absolute path by a relative one without checking its validity + * + * @param string $relativePath + * @return string + */ + protected function _resolvePath($relativePath) + { + return $this->_baseDir . DIRECTORY_SEPARATOR . $relativePath; + } + + /** + * Resolve semicolon-separated relative glob pattern(s) to matched absolute paths + * + * @param string $pattern + * @return array + */ + protected function _resolvePathPattern($pattern) + { + $result = array(); + $allPatterns = preg_split('/\s*;\s*/', trim($pattern), -1, PREG_SPLIT_NO_EMPTY); + foreach ($allPatterns as $onePattern) { + $onePattern = $this->_resolvePath($onePattern); + $files = glob($onePattern, GLOB_BRACE); + $result = array_merge($result, $files); + } + return $result; + } +} diff --git a/dev/tests/integration/framework/Magento/Test/Helper/Bootstrap.php b/dev/tests/integration/framework/Magento/Test/Helper/Bootstrap.php new file mode 100644 index 0000000000000000000000000000000000000000..fd345f57bd0ff20e02ab5db562dc6b23fb444750 --- /dev/null +++ b/dev/tests/integration/framework/Magento/Test/Helper/Bootstrap.php @@ -0,0 +1,145 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Magento + * @subpackage integration_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Helper providing exclusive restricted access to the underlying bootstrap instance + */ +class Magento_Test_Helper_Bootstrap +{ + /** + * @var Magento_Test_Helper_Bootstrap + */ + private static $_instance; + + /** + * @var Magento_Test_Bootstrap + */ + protected $_bootstrap; + + /** + * Set self instance for static access + * + * @param Magento_Test_Helper_Bootstrap $instance + * @throws Magento_Exception + */ + public static function setInstance(Magento_Test_Helper_Bootstrap $instance) + { + if (self::$_instance) { + throw new Magento_Exception('Helper instance cannot be redefined.'); + } + self::$_instance = $instance; + } + + /** + * Self instance getter + * + * @return Magento_Test_Helper_Bootstrap + * @throws Magento_Exception + */ + public static function getInstance() + { + if (!self::$_instance) { + throw new Magento_Exception('Helper instance is not defined yet.'); + } + return self::$_instance; + } + + /** + * Check the possibility to send headers or to use headers related function (like set_cookie) + * + * @return bool + */ + public static function canTestHeaders() + { + if (!headers_sent() && extension_loaded('xdebug') && function_exists('xdebug_get_headers')) { + return true; + } + return false; + } + + /** + * Constructor + * + * @param Magento_Test_Bootstrap $bootstrap + */ + public function __construct(Magento_Test_Bootstrap $bootstrap) + { + $this->_bootstrap = $bootstrap; + } + + /** + * Retrieve application installation directory + * + * @return string + */ + public function getAppInstallDir() + { + return $this->_bootstrap->getApplication()->getInstallDir(); + } + + /** + * Retrieve application initialization options + * + * @return array + */ + public function getAppInitParams() + { + return $this->_bootstrap->getApplication()->getInitParams(); + } + + /** + * Retrieve the database vendor name used by the bootstrap + * + * @return string + */ + public function getDbVendorName() + { + return $this->_bootstrap->getDbVendorName(); + } + + /** + * Reinitialize the application instance optionally passing parameters to be overridden. + * Intended to be used for the tests isolation purposes. + * + * @param array $overriddenParams + */ + public function reinitialize(array $overriddenParams = array()) + { + $this->_bootstrap->getApplication()->reinitialize($overriddenParams); + } + + /** + * Perform the full request processing by the application instance optionally passing parameters to be overridden. + * Intended to be used by the controller tests. + * + * @param array $overriddenParams + */ + public function runApp(array $overriddenParams = array()) + { + $this->_bootstrap->getApplication()->run($overriddenParams); + } +} diff --git a/dev/tests/integration/framework/Magento/Test/Helper/Memory.php b/dev/tests/integration/framework/Magento/Test/Helper/Memory.php new file mode 100644 index 0000000000000000000000000000000000000000..0e017a9849b396bb906d5414979f9eb61ed4fca0 --- /dev/null +++ b/dev/tests/integration/framework/Magento/Test/Helper/Memory.php @@ -0,0 +1,160 @@ +<?php +/** + * Helper for determining system memory usage + * + * Uses OS tools to provide accurate information about factual memory consumption. + * The PHP standard functions may return incorrect information because the process itself may have leaks. + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +class Magento_Test_Helper_Memory +{ + /** + * Prefixes to specify unit of measure for memory amount + * + * Warning: it is important to maintain the exact order of letters in this literal, + * as it is used to convert string with units to bytes + */ + const MEMORY_UNITS = 'BKMGTPE'; + + /** + * @var Magento_Shell + */ + private $_shell; + + /** + * Inject dependencies + * + * @param Magento_Shell $shell + */ + public function __construct(Magento_Shell $shell) + { + $this->_shell = $shell; + } + + /** + * Retrieve the effective memory usage of the current process + * + * memory_get_usage() cannot be used because of the bug + * @link https://bugs.php.net/bug.php?id=62467 + * + * @return int Memory usage in bytes + */ + public function getRealMemoryUsage() + { + $pid = getmypid(); + if (self::isWindowsOs()) { + $result = $this->getWinProcessMemoryUsage($pid); + } else { + $result = $this->getUnixProcessMemoryUsage($pid); + } + return $result; + } + + /** + * Retrieve the current process' memory usage using Unix command line interface + * + * @link http://linux.die.net/man/1/top + * @param int $pid + * @return int Memory usage in bytes + */ + public function getUnixProcessMemoryUsage($pid) + { + $output = $this->_shell->execute('top -p %s -n 1 -b | grep PID -A 1', array($pid)); + + $output = preg_split('/\n+/', $output, -1, PREG_SPLIT_NO_EMPTY); + $keys = preg_split('/\s+/', $output[0], -1, PREG_SPLIT_NO_EMPTY); + $values = preg_split('/\s+/', $output[1], -1, PREG_SPLIT_NO_EMPTY); + $stats = array_combine($keys, $values); + + $result = $stats['RES']; // resident set size, the non-swapped physical memory + + if (is_numeric($result)) { + $result .= 'k'; // kilobytes by default + } + + return self::convertToBytes($result); + } + + /** + * Retrieve the current process' memory usage using Windows command line interface + * + * @link http://technet.microsoft.com/en-us/library/bb491010.aspx + * @param int $pid + * @return int Memory usage in bytes + */ + public function getWinProcessMemoryUsage($pid) + { + $output = $this->_shell->execute('tasklist /fi %s /fo CSV', array("PID eq $pid")); + + /** @link http://www.php.net/manual/en/wrappers.data.php */ + $csvStream = 'data://text/plain;base64,' . base64_encode($output); + $csvHandle = fopen($csvStream, 'r'); + $keys = fgetcsv($csvHandle); + $values = fgetcsv($csvHandle); + fclose($csvHandle); + $stats = array_combine($keys, $values); + + $result = $stats['Mem Usage']; + + return self::convertToBytes($result); + } + + /** + * Whether the operating system belongs to the Windows family + * + * @link http://php.net/manual/en/function.php-uname.php + * @return bool + */ + public static function isWindowsOs() + { + return (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'); + } + + /** + * Convert a number optionally followed by the unit symbol (B, K, M, G, etc.) to bytes + * + * @param string $number String representation of a number + * @return int + * @throws InvalidArgumentException + * @throws OutOfBoundsException + */ + public static function convertToBytes($number) + { + $number = str_replace(array(',', ' '), '', $number); + $number = strtoupper($number); + if (!preg_match('/^(\d+(?:\.\d+)?)([' . self::MEMORY_UNITS . ']?)$/', $number, $matches)) { + throw new InvalidArgumentException("Number format '$number' is not recognized."); + } + $result = (float)$matches[1]; + $unitSymbol = $matches[2]; + $pow = $unitSymbol ? strpos(self::MEMORY_UNITS, $unitSymbol) : 0; + $is32Bit = PHP_INT_SIZE == 4; + if ($is32Bit && $pow >= 4) { + throw new OutOfBoundsException("A 32-bit system is unable to process such a number."); + } + if ($unitSymbol) { + $result *= pow(1024, $pow); + } + return (int)$result; + } +} diff --git a/dev/tests/integration/framework/Magento/Test/Isolation/WorkingDirectory.php b/dev/tests/integration/framework/Magento/Test/Isolation/WorkingDirectory.php new file mode 100644 index 0000000000000000000000000000000000000000..775b2872e3f6b5d961e1776cc2c6ed1eeb2d40e4 --- /dev/null +++ b/dev/tests/integration/framework/Magento/Test/Isolation/WorkingDirectory.php @@ -0,0 +1,61 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Magento + * @subpackage integration_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Isolation of the current working directory changes between tests + */ +class Magento_Test_Isolation_WorkingDirectory +{ + /** + * @var string + */ + private $_currentWorkingDir; + + /** + * Handler for 'endTest' event + * + * @param PHPUnit_Framework_TestCase $test + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function startTest(PHPUnit_Framework_TestCase $test) + { + $this->_currentWorkingDir = getcwd(); + } + + /** + * Handler for 'startTest' event + * + * @param PHPUnit_Framework_TestCase $test + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function endTest(PHPUnit_Framework_TestCase $test) + { + if (getcwd() != $this->_currentWorkingDir) { + chdir($this->_currentWorkingDir); + } + } +} diff --git a/dev/tests/integration/framework/Magento/Test/MemoryLimit.php b/dev/tests/integration/framework/Magento/Test/MemoryLimit.php new file mode 100644 index 0000000000000000000000000000000000000000..8e7785c1ae53a6301f903e206de5559d2691d846 --- /dev/null +++ b/dev/tests/integration/framework/Magento/Test/MemoryLimit.php @@ -0,0 +1,143 @@ +<?php +/** + * A tool for limiting allowed memory usage and memory leaks + * + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +class Magento_Test_MemoryLimit +{ + /** + * @var Magento_Test_Helper_Memory + */ + private $_helper; + + /** + * @var int + */ + private $_memCap = 0; + + /** + * @var int + */ + private $_leakCap = 0; + + /** + * Initialize with the values + * + * @param string $memCap + * @param string $leakCap + * @param Magento_Test_Helper_Memory $helper + * @throws InvalidArgumentException + */ + public function __construct($memCap, $leakCap, Magento_Test_Helper_Memory $helper) + { + $this->_memCap = $memCap ? $helper->convertToBytes($memCap) : 0; + $this->_leakCap = $leakCap ? $helper->convertToBytes($leakCap) : 0; + $this->_helper = $helper; + } + + /** + * Get a header printout + * + * @return string + */ + public static function printHeader() + { + return PHP_EOL . '=== Memory Usage System Stats ===' . PHP_EOL; + } + + /** + * Get statistics printout + * + * @return string + */ + public function printStats() + { + list($usage, $leak) = $this->_getUsage(); + $result = array(); + + $msg = sprintf("Memory usage (OS):\t%s (%.2F%% of %s reported by PHP", + $this->_toMb($usage), + 100 * $usage / ($usage - $leak), + $this->_toMb($usage - $leak) + ); + $percentMsg = '%.2F%% of configured %s limit'; + if ($this->_memCap) { + $msg .= ', ' . sprintf($percentMsg, 100 * $usage / $this->_memCap, $this->_toMb($this->_memCap)); + } + $result[] = "{$msg})"; + + $msg = sprintf("Estimated memory leak:\t%s (%.2F%% of used memory", $this->_toMb($leak), 100 * $leak / $usage); + if ($this->_leakCap) { + $msg .= ', ' . sprintf($percentMsg, 100 * $leak / $this->_leakCap, $this->_toMb($this->_leakCap)); + } + $result[] = "{$msg})"; + + return implode(PHP_EOL, $result) . PHP_EOL; + } + + /** + * Convert bytes to mebibytes (2^20) + * + * @param int $bytes + * @return string + */ + private function _toMb($bytes) + { + return sprintf('%.2FM', $bytes / (1024 * 1024)); + } + + /** + * Raise error if memory usage breaks configured thresholds + * + * @return null + * @throws LogicException + */ + public function validateUsage() + { + if (!$this->_memCap && !$this->_leakCap) { + return null; + } + list($usage, $leak) = $this->_getUsage(); + if ($this->_memCap && ($usage >= $this->_memCap)) { + throw new LogicException( + "Memory limit of {$this->_toMb($this->_memCap)} ({$this->_memCap} bytes) has been reached." + ); + } + if ($this->_leakCap && ($leak >= $this->_leakCap)) { + throw new LogicException("Estimated memory leak limit of {$this->_toMb($this->_leakCap)}" + . " ({$this->_leakCap} bytes) has been reached." + ); + } + } + + /** + * Usage/leak getter sub-routine + * + * @return array + */ + private function _getUsage() + { + $usage = $this->_helper->getRealMemoryUsage(); + return array($usage, $usage - memory_get_usage(true)); + } +} diff --git a/dev/tests/integration/framework/Magento/Test/TestCase/ControllerAbstract.php b/dev/tests/integration/framework/Magento/Test/TestCase/ControllerAbstract.php index e0e64a7dd36b442a062f6891ef41097313c5d2f0..8d0b8a1e257015560fec43ce75e330629020a3b1 100644 --- a/dev/tests/integration/framework/Magento/Test/TestCase/ControllerAbstract.php +++ b/dev/tests/integration/framework/Magento/Test/TestCase/ControllerAbstract.php @@ -52,14 +52,21 @@ abstract class Magento_Test_TestCase_ControllerAbstract extends PHPUnit_Framewor */ protected $_objectManager; + /** + * Whether absence of session error messages has to be asserted automatically upon a test completion + * + * @var bool + */ + protected $_assertSessionErrors = false; + /** * Bootstrap instance getter * - * @return Magento_Test_Bootstrap + * @return Magento_Test_Helper_Bootstrap */ protected function _getBootstrap() { - return Magento_Test_Bootstrap::getInstance(); + return Magento_Test_Helper_Bootstrap::getInstance(); } /** @@ -67,6 +74,7 @@ abstract class Magento_Test_TestCase_ControllerAbstract extends PHPUnit_Framewor */ protected function setUp() { + $this->_assertSessionErrors = false; $this->_objectManager = Mage::getObjectManager(); $this->_runOptions[Mage::INIT_OPTION_REQUEST] = $this->getRequest(); $this->_runOptions[Mage::INIT_OPTION_RESPONSE] = $this->getResponse(); @@ -80,6 +88,17 @@ abstract class Magento_Test_TestCase_ControllerAbstract extends PHPUnit_Framewor $this->_runOptions = array(); } + /** + * Ensure that there were no error messages displayed on the admin panel + */ + protected function assertPostConditions() + { + if ($this->_assertSessionErrors) { + // equalTo() is intentionally used instead of isEmpty() to provide the informative diff + $this->assertSessionMessages($this->equalTo(array()), Mage_Core_Model_Message::ERROR); + } + } + /** * Run request * @@ -89,6 +108,7 @@ abstract class Magento_Test_TestCase_ControllerAbstract extends PHPUnit_Framewor { $this->getRequest()->setRequestUri($uri); $this->_getBootstrap()->runApp($this->_runOptions); + $this->_assertSessionErrors = true; } /** @@ -175,4 +195,28 @@ abstract class Magento_Test_TestCase_ControllerAbstract extends PHPUnit_Framewor $this->assertThat($actualUrl, $urlConstraint, 'Redirection URL does not match expectations'); } } + + /** + * Assert that actual session messages meet expectations: + * Usage examples: + * $this->assertSessionMessages($this->isEmpty(), Mage_Core_Model_Message::ERROR); + * $this->assertSessionMessages($this->equalTo(array('Entity has been saved.')), Mage_Core_Model_Message::SUCCESS); + * + * @param PHPUnit_Framework_Constraint $constraint Constraint to compare actual messages against + * @param string|null $messageType Message type filter, one of the constants Mage_Core_Model_Message::* + * @param string $sessionModel Class of the session model that manages messages + */ + public function assertSessionMessages( + PHPUnit_Framework_Constraint $constraint, $messageType = null, $sessionModel = 'Mage_Core_Model_Session' + ) { + $this->_assertSessionErrors = false; + /** @var $session Mage_Core_Model_Session_Abstract */ + $session = $this->_objectManager->get($sessionModel); + $actualMessages = array(); + /** @var $message Mage_Core_Model_Message_Abstract */ + foreach ($session->getMessages()->getItems($messageType) as $message) { + $actualMessages[] = $message->getText(); + } + $this->assertThat($actualMessages, $constraint, 'Session messages do not meet expectations'); + } } diff --git a/dev/tests/integration/framework/Magento/Test/Workaround/Cleanup/StaticProperties.php b/dev/tests/integration/framework/Magento/Test/Workaround/Cleanup/StaticProperties.php index 54c500ebe3bb97b3685a3942341899ef22f39fa3..4eb386129050117511f65a290c997758cf03df0b 100644 --- a/dev/tests/integration/framework/Magento/Test/Workaround/Cleanup/StaticProperties.php +++ b/dev/tests/integration/framework/Magento/Test/Workaround/Cleanup/StaticProperties.php @@ -48,7 +48,7 @@ class Magento_Test_Workaround_Cleanup_StaticProperties */ protected static $_classesToSkip = array( 'Mage', - 'Magento_Test_Bootstrap', + 'Magento_Test_Helper_Bootstrap', 'Magento_Test_Event_Magento', 'Magento_Test_Event_PhpUnit', 'Magento_Test_Annotation_AppIsolation', diff --git a/dev/tests/integration/framework/bootstrap.php b/dev/tests/integration/framework/bootstrap.php index f6109a62ea5b18bd4c2d8885a98063c482a224b6..3e9283eb325b5478793b5c8b316de5c26725cc8a 100644 --- a/dev/tests/integration/framework/bootstrap.php +++ b/dev/tests/integration/framework/bootstrap.php @@ -37,89 +37,26 @@ Magento_Autoload_IncludePath::addIncludePath(array( "$testsBaseDir/testsuite", )); -if (defined('TESTS_LOCAL_CONFIG_FILE') && TESTS_LOCAL_CONFIG_FILE) { - $localXmlFile = "$testsBaseDir/" . TESTS_LOCAL_CONFIG_FILE; - if (!is_file($localXmlFile) && substr($localXmlFile, -5) != '.dist') { - $localXmlFile .= '.dist'; - } -} else { - $localXmlFile = "$testsBaseDir/etc/local-mysql.xml"; -} - -if (defined('TESTS_GLOBAL_CONFIG_FILES') && TESTS_GLOBAL_CONFIG_FILES) { - $globalEtcFiles = TESTS_GLOBAL_CONFIG_FILES; -} else { - $globalEtcFiles = "../../../app/etc/*.xml"; -} - -if (defined('TESTS_MODULE_CONFIG_FILES') && TESTS_MODULE_CONFIG_FILES) { - $moduleEtcFiles = TESTS_MODULE_CONFIG_FILES; -} else { - $moduleEtcFiles = "../../../app/etc/modules/*.xml"; -} - -$isCleanupEnabled = (defined('TESTS_CLEANUP') && TESTS_CLEANUP == 'enabled'); - -$isDeveloperMode = (defined('TESTS_MAGENTO_DEVELOPER_MODE') && TESTS_MAGENTO_DEVELOPER_MODE == 'enabled'); - -/* Enable profiler if necessary */ -if (defined('TESTS_PROFILER_FILE') && TESTS_PROFILER_FILE) { - $driver = new Magento_Profiler_Driver_Standard(); - $driver->registerOutput(new Magento_Profiler_Driver_Standard_Output_Csvfile(array( - 'baseDir' => $testsBaseDir, - 'filePath' => TESTS_PROFILER_FILE - ))); - Magento_Profiler::add($driver); -} - -/* Enable profiler with bamboo friendly output format */ -if (defined('TESTS_BAMBOO_PROFILER_FILE') && defined('TESTS_BAMBOO_PROFILER_METRICS_FILE')) { - $driver = new Magento_Profiler_Driver_Standard(); - $driver->registerOutput(new Magento_Test_Profiler_OutputBamboo(array( - 'baseDir' => $testsBaseDir, - 'filePath' => TESTS_BAMBOO_PROFILER_FILE, - 'metrics' => require($testsBaseDir . DIRECTORY_SEPARATOR . TESTS_BAMBOO_PROFILER_METRICS_FILE) - ))); - Magento_Profiler::add($driver); -} - -/* - * Activate custom DocBlock annotations. - * Note: order of registering (and applying) annotations is important. - * To allow config fixtures to deal with fixture stores, data fixtures should be processed before config fixtures. - */ -$eventManager = new Magento_Test_EventManager(array( - new Magento_Test_Workaround_Segfault(), - new Magento_Test_Workaround_Cleanup_TestCaseProperties(), - new Magento_Test_Workaround_Cleanup_StaticProperties(), - new Magento_Test_Annotation_AppIsolation(), - new Magento_Test_Event_Transaction(new Magento_Test_EventManager(array( - new Magento_Test_Annotation_DbIsolation(), - new Magento_Test_Annotation_DataFixture("$testsBaseDir/testsuite"), - ))), - new Magento_Test_Annotation_ConfigFixture() -)); -Magento_Test_Event_PhpUnit::setDefaultEventManager($eventManager); -Magento_Test_Event_Magento::setDefaultEventManager($eventManager); - /* Initialize object manager instance */ Mage::initializeObjectManager(null, new Magento_Test_ObjectManager()); /* Bootstrap the application */ -Magento_Test_Bootstrap::setInstance(new Magento_Test_Bootstrap( - $magentoBaseDir, - $testsBaseDir, - $localXmlFile, - $globalEtcFiles, - $moduleEtcFiles, - $testsBaseDir . DIRECTORY_SEPARATOR . 'etc/integration-tests-config.xml', - $testsTmpDir, +$invariantSettings = array( + 'TESTS_LOCAL_CONFIG_EXTRA_FILE' => 'etc/integration-tests-config.xml', +); +$bootstrap = new Magento_Test_Bootstrap( + new Magento_Test_Bootstrap_Settings($testsBaseDir, $invariantSettings + get_defined_constants()), + new Magento_Test_Bootstrap_Environment(), + new Magento_Test_Bootstrap_DocBlock("$testsBaseDir/testsuite"), + new Magento_Test_Bootstrap_Profiler(new Magento_Profiler_Driver_Standard()), new Magento_Shell(), - $isCleanupEnabled, - $isDeveloperMode -)); + $testsTmpDir +); +$bootstrap->runBootstrap(); + +Magento_Test_Helper_Bootstrap::setInstance(new Magento_Test_Helper_Bootstrap($bootstrap)); Utility_Files::init(new Utility_Files($magentoBaseDir)); -/* Unset declared global variables to release PHPUnit from maintaining their values between tests */ -unset($testsBaseDir, $testsTmpDir, $magentoBaseDir, $localXmlFile, $globalEtcFiles, $moduleEtcFiles, $eventManager); +/* Unset declared global variables to release the PHPUnit from maintaining their values between tests */ +unset($bootstrap); diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Annotation/AppIsolationTest.php b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Annotation/AppIsolationTest.php index ac18570616f8cd85e0a5e1056c9108e0ba8b6d89..e661f29eadca502c4dc4f303ab616bf09ce8601b 100644 --- a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Annotation/AppIsolationTest.php +++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Annotation/AppIsolationTest.php @@ -35,14 +35,28 @@ class Magento_Test_Annotation_AppIsolationTest extends PHPUnit_Framework_TestCas */ protected $_object; + /** + * @var Magento_Test_Application|PHPUnit_Framework_MockObject_MockObject + */ + protected $_application; + protected function setUp() { - $this->_object = $this->getMock('Magento_Test_Annotation_AppIsolation', array('_isolateApp')); + $this->_application = $this->getMock('Magento_Test_Application', array('reinitialize'), array(), '', false); + $this->_object = $this->getMock( + 'Magento_Test_Annotation_AppIsolation', array('_cleanupCache'), array($this->_application) + ); + } + + protected function tearDown() + { + $this->_application = null; + $this->_object = null; } public function testStartTestSuite() { - $this->_object->expects($this->once())->method('_isolateApp'); + $this->_application->expects($this->once())->method('reinitialize'); $this->_object->startTestSuite(); } @@ -67,7 +81,7 @@ class Magento_Test_Annotation_AppIsolationTest extends PHPUnit_Framework_TestCas public function testEndTestIsolationDefault() { - $this->_object->expects($this->never())->method('_isolateApp'); + $this->_application->expects($this->never())->method('reinitialize'); $this->_object->endTest($this); } @@ -75,7 +89,7 @@ class Magento_Test_Annotation_AppIsolationTest extends PHPUnit_Framework_TestCas { /** @var $controllerTest Magento_Test_TestCase_ControllerAbstract */ $controllerTest = $this->getMockForAbstractClass('Magento_Test_TestCase_ControllerAbstract'); - $this->_object->expects($this->once())->method('_isolateApp'); + $this->_application->expects($this->once())->method('reinitialize'); $this->_object->endTest($controllerTest); } @@ -84,7 +98,7 @@ class Magento_Test_Annotation_AppIsolationTest extends PHPUnit_Framework_TestCas */ public function testEndTestIsolationDisabled() { - $this->_object->expects($this->never())->method('_isolateApp'); + $this->_application->expects($this->never())->method('reinitialize'); $this->_object->endTest($this); } @@ -93,7 +107,7 @@ class Magento_Test_Annotation_AppIsolationTest extends PHPUnit_Framework_TestCas */ public function testEndTestIsolationEnabled() { - $this->_object->expects($this->once())->method('_isolateApp'); + $this->_application->expects($this->once())->method('reinitialize'); $this->_object->endTest($this); } } diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/DocBlockTest.php b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/DocBlockTest.php new file mode 100644 index 0000000000000000000000000000000000000000..518f0ef1162f5a1dfca6f88c8a46c3b5416abe5d --- /dev/null +++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/DocBlockTest.php @@ -0,0 +1,81 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Magento + * @subpackage integration_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Test class for Magento_Test_Bootstrap_DocBlock. + */ +class Magento_Test_Bootstrap_DocBlockTest extends PHPUnit_Framework_TestCase +{ + /** + * @var Magento_Test_Bootstrap_DocBlock + */ + protected $_object; + + /** + * @var Magento_Test_Application|PHPUnit_Framework_MockObject_MockObject + */ + protected $_application; + + protected function setUp() + { + $this->_object = new Magento_Test_Bootstrap_DocBlock(__DIR__); + $this->_application = $this->getMock('Magento_Test_Application', array(), array(), '', false); + } + + protected function tearDown() + { + $this->_object = null; + $this->_application = null; + } + + /** + * Setup expectation of inability to instantiate an event listener without passing the event manager instance + * + * @param string $listenerClass + * @param string $expectedExceptionMsg + */ + protected function _expectNoListenerCreation($listenerClass, $expectedExceptionMsg) + { + try { + new $listenerClass(); + $this->fail("Inability to instantiate the event listener '$listenerClass' is expected."); + } catch (Magento_Exception $e) { + $this->assertEquals($expectedExceptionMsg, $e->getMessage()); + } + } + + public function testRegisterAnnotations() + { + $this->_expectNoListenerCreation('Magento_Test_Event_PhpUnit', 'Instance of the event manager is required.'); + $this->_expectNoListenerCreation( + 'Magento_Test_Event_Magento', 'Instance of the "Magento_Test_EventManager" is expected.' + ); + $this->_object->registerAnnotations($this->_application); + new Magento_Test_Event_PhpUnit(); + new Magento_Test_Event_Magento(); + } +} diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/EnvironmentTest.php b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/EnvironmentTest.php new file mode 100644 index 0000000000000000000000000000000000000000..f290fd335bbb2eed84baac1d6b78858cef8d589e --- /dev/null +++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/EnvironmentTest.php @@ -0,0 +1,98 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Magento + * @subpackage integration_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Test class for Magento_Test_Bootstrap_Environment. + */ +class Magento_Test_Bootstrap_EnvironmentTest extends PHPUnit_Framework_TestCase +{ + /** + * @var string + */ + protected static $_sessionId = ''; + + /** + * @var Magento_Test_Bootstrap_Environment + */ + protected $_object; + + public static function setUpBeforeClass() + { + self::$_sessionId = session_id(); + } + + public static function tearDownAfterClass() + { + session_id(self::$_sessionId); + } + + protected function setUp() + { + $this->_object = new Magento_Test_Bootstrap_Environment(); + } + + protected function tearDown() + { + $this->_object = null; + } + + /** + * Retrieve the current session's variables + * + * @return array|null + */ + protected function _getSessionVars() + { + return (isset($_SESSION) ? $_SESSION : null); + } + + public function testEmulateHttpRequest() + { + $serverVars = $_SERVER; + $this->assertNotEmpty($serverVars); + + $expectedResult = array('HTTP_HOST' => 'localhost', 'SCRIPT_FILENAME' => 'index.php'); + $actualResult = array('HTTP_HOST' => '127.0.0.1'); + $this->_object->emulateHttpRequest($actualResult); + $this->assertEquals($expectedResult, $actualResult); + + $this->assertSame($serverVars, $_SERVER, 'Super-global $_SERVER must not be affected.'); + } + + public function testEmulateSession() + { + $sessionVars = $this->_getSessionVars(); + $this->assertEmpty(session_id()); + + $actualResult = array('session_data_to_be_erased' => 'some_value'); + $this->_object->emulateSession($actualResult); + $this->assertEquals(array(), $actualResult); + + $this->assertSame($sessionVars, $this->_getSessionVars(), 'Super-global $_SESSION must not be affected.'); + $this->assertNotEmpty(session_id(), 'Global session identified has to be emulated.'); + } +} diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/MemoryTest.php b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/MemoryTest.php new file mode 100644 index 0000000000000000000000000000000000000000..ec46519c18d6395e282d8b176d590f3c41575cc2 --- /dev/null +++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/MemoryTest.php @@ -0,0 +1,104 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Magento + * @subpackage integration_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Test class for Magento_Test_Bootstrap_Memory. + */ +class Magento_Test_Bootstrap_MemoryTest extends PHPUnit_Framework_TestCase +{ + /** + * @var Magento_Test_Bootstrap_Memory + */ + protected $_object; + + /** + * @var Magento_Test_MemoryLimit|PHPUnit_Framework_MockObject_MockObject + */ + protected $_memoryLimit; + + /** + * @var PHPUnit_Framework_MockObject_MockObject + */ + protected $_activationPolicy; + + protected function setUp() + { + $this->_memoryLimit = $this->getMock('Magento_Test_MemoryLimit', array('printStats'), array(), '', false); + $this->_activationPolicy = $this->getMock('stdClass', array('register_shutdown_function')); + $this->_object = new Magento_Test_Bootstrap_Memory( + $this->_memoryLimit, array($this->_activationPolicy, 'register_shutdown_function') + ); + } + + protected function tearDown() + { + $this->_memoryLimit = null; + $this->_activationPolicy = null; + $this->_object = null; + } + + /** + * @expectedException InvalidArgumentException + * @expectedExceptionMessage Activation policy is expected to be a callable. + */ + public function testConstructorException() + { + new Magento_Test_Bootstrap_Memory($this->_memoryLimit, 'non_existing_callable'); + } + + public function testDisplayStats() + { + $eol = PHP_EOL; + $this->expectOutputString("{$eol}=== Memory Usage System Stats ==={$eol}Dummy Statistics{$eol}"); + $this->_memoryLimit + ->expects($this->once()) + ->method('printStats') + ->will($this->returnValue('Dummy Statistics')) + ; + $this->_object->displayStats(); + } + + public function testActivateStatsDisplaying() + { + $this->_activationPolicy + ->expects($this->once()) + ->method('register_shutdown_function') + ->with($this->identicalTo(array($this->_object, 'displayStats'))) + ; + $this->_object->activateStatsDisplaying(); + } + + public function testActivateLimitValidation() + { + $this->_activationPolicy + ->expects($this->once()) + ->method('register_shutdown_function') + ->with($this->identicalTo(array($this->_memoryLimit, 'validateUsage'))) + ; + $this->_object->activateLimitValidation(); + } +} diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/ProfilerTest.php b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/ProfilerTest.php new file mode 100644 index 0000000000000000000000000000000000000000..b2106dbc9c180cc64065814fbed7e11cfbf716db --- /dev/null +++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/ProfilerTest.php @@ -0,0 +1,75 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Magento + * @subpackage integration_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Test class for Magento_Test_Bootstrap_Profiler. + */ +class Magento_Test_Bootstrap_ProfilerTest extends PHPUnit_Framework_TestCase +{ + /** + * @var Magento_Test_Bootstrap_Profiler + */ + protected $_object; + + /** + * @var Magento_Profiler_Driver_Standard|PHPUnit_Framework_MockObject_MockObject + */ + protected $_driver; + + protected function setUp() + { + $this->expectOutputString(''); + $this->_driver = $this->getMock('Magento_Profiler_Driver_Standard', array('registerOutput')); + $this->_object = new Magento_Test_Bootstrap_Profiler($this->_driver); + } + + protected function tearDown() + { + $this->_driver = null; + $this->_object = null; + } + + public function testRegisterFileProfiler() + { + $this->_driver + ->expects($this->once()) + ->method('registerOutput') + ->with($this->isInstanceOf('Magento_Profiler_Driver_Standard_Output_Csvfile')) + ; + $this->_object->registerFileProfiler('php://output'); + } + + public function testRegisterBambooProfiler() + { + $this->_driver + ->expects($this->once()) + ->method('registerOutput') + ->with($this->isInstanceOf('Magento_Test_Profiler_OutputBamboo')) + ; + $this->_object->registerBambooProfiler('php://output', __DIR__ . '/_files/metrics.php'); + } +} diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/SettingsTest.php b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/SettingsTest.php new file mode 100644 index 0000000000000000000000000000000000000000..4a47939a7ef06bafa703fecee05145d521b41c51 --- /dev/null +++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/SettingsTest.php @@ -0,0 +1,243 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Magento + * @subpackage integration_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Test class for Magento_Test_Bootstrap_Settings. + */ +class Magento_Test_Bootstrap_SettingsTest extends PHPUnit_Framework_TestCase +{ + /** + * @var Magento_Test_Bootstrap_Settings + */ + protected $_object; + + /** + * @var string + */ + protected $_fixtureDir; + + /** + * Define the fixture directory to be used in both data providers and tests + * + * @param string|null $name + * @param array $data + * @param string $dataName + */ + public function __construct($name = null, array $data = array(), $dataName = '') + { + parent::__construct($name, $data, $dataName); + $this->_fixtureDir = __DIR__ . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR; + } + + protected function setUp() + { + $this->_object = new Magento_Test_Bootstrap_Settings($this->_fixtureDir, array( + 'item_label' => 'Item Label', + 'number_of_items' => 42, + 'item_price' => 12.99, + 'is_in_stock' => true, + 'free_shipping' => 'enabled', + 'zero_value' => '0', + 'test_file' => 'metrics.php', + 'all_xml_files' => '*.xml', + 'all_xml_or_one_php_file' => '{*.xml,4.php}', + 'one_xml_or_any_php_file' => '1.xml;?.php', + 'config_file_with_dist' => '1.xml', + 'config_file_no_dist' => '2.xml', + 'no_config_file_dist' => '3.xml', + )); + } + + protected function tearDown() + { + $this->_object = null; + } + + /** + * @expectedException InvalidArgumentException + * @expectedExceptionMessage Base path 'non_existing_dir' has to be an existing directory. + */ + public function testConstructorNonExistingBaseDir() + { + new Magento_Test_Bootstrap_Settings('non_existing_dir', array()); + } + + /** + * @param string $settingName + * @param mixed $defaultValue + * @param mixed $expectedResult + * @dataProvider getDataProvider + */ + public function testGet($settingName, $defaultValue, $expectedResult) + { + $this->assertSame($expectedResult, $this->_object->get($settingName, $defaultValue)); + } + + public function getDataProvider() + { + return array( + 'string type' => array('item_label', null, 'Item Label'), + 'integer type' => array('number_of_items', null, 42), + 'float type' => array('item_price', null, 12.99), + 'boolean type' => array('is_in_stock', null, true), + 'non-existing' => array('non_existing', null, null), + 'zero string' => array('zero_value', '1', '0'), + 'default value' => array('non_existing', 'default', 'default'), + ); + } + + /** + * @param string $settingName + * @param bool $expectedResult + * @dataProvider getAsBooleanDataProvider + */ + public function testGetAsBoolean($settingName, $expectedResult) + { + $this->assertSame($expectedResult, $this->_object->getAsBoolean($settingName)); + } + + public function getAsBooleanDataProvider() + { + return array( + 'non-enabled string' => array('item_label', false), + 'non-enabled boolean' => array('is_in_stock', false), + 'enabled string' => array('free_shipping', true), + ); + } + + /** + * @param string $settingName + * @param mixed $defaultValue + * @param string $expectedResult + * @dataProvider getAsFileDataProvider + */ + public function testGetAsFile($settingName, $defaultValue, $expectedResult) + { + $this->assertSame($expectedResult, $this->_object->getAsFile($settingName, $defaultValue)); + } + + public function getAsFileDataProvider() + { + return array( + 'existing file' => array('test_file', '', "{$this->_fixtureDir}metrics.php"), + 'zero value setting' => array('zero_value', 'default_should_be_ignored', "{$this->_fixtureDir}0"), + 'empty default value' => array('non_existing_file', '', ''), + 'zero default value' => array('non_existing_file', '0', "{$this->_fixtureDir}0"), + 'default value' => array('non_existing_file', 'metrics.php', "{$this->_fixtureDir}metrics.php"), + ); + } + + /** + * @param string $settingName + * @param string $expectedResult + * @dataProvider getAsMatchingPathsDataProvider + */ + public function testGetAsMatchingPaths($settingName, $expectedResult) + { + $actualResult = $this->_object->getAsMatchingPaths($settingName); + if (is_array($actualResult)) { + sort($actualResult); + } + $this->assertEquals($expectedResult, $actualResult); + } + + public function getAsMatchingPathsDataProvider() + { + return array( + 'single pattern' => array( + 'all_xml_files', array("{$this->_fixtureDir}1.xml", "{$this->_fixtureDir}2.xml") + ), + 'pattern with braces' => array( + 'all_xml_or_one_php_file', + array("{$this->_fixtureDir}1.xml", "{$this->_fixtureDir}2.xml", "{$this->_fixtureDir}4.php") + ), + 'multiple patterns' => array( + 'one_xml_or_any_php_file', array("{$this->_fixtureDir}1.xml", "{$this->_fixtureDir}4.php") + ), + 'non-existing setting' => array( + 'non_existing', array() + ), + 'setting with zero value' => array( + 'zero_value', array("{$this->_fixtureDir}0") + ), + ); + } + + /** + * @param string $settingName + * @param mixed $expectedResult + * @dataProvider getAsConfigFileDataProvider + */ + public function testGetAsConfigFile($settingName, $expectedResult) + { + $actualResult = $this->_object->getAsConfigFile($settingName); + if (is_array($actualResult)) { + sort($actualResult); + } + $this->assertEquals($expectedResult, $actualResult); + } + + public function getAsConfigFileDataProvider() + { + return array( + 'config file & dist file' => array( + 'config_file_with_dist', "{$this->_fixtureDir}1.xml" + ), + 'config file & no dist file' => array( + 'config_file_no_dist', "{$this->_fixtureDir}2.xml" + ), + 'no config file & dist file' => array( + 'no_config_file_dist', "{$this->_fixtureDir}3.xml.dist" + ), + ); + } + + /** + * @param string $settingName + * @param string $expectedExceptionMsg + * @dataProvider getAsConfigFileExceptionDataProvider + */ + public function testGetAsConfigFileException($settingName, $expectedExceptionMsg) + { + $this->setExpectedException('Magento_Exception', $expectedExceptionMsg); + $this->_object->getAsConfigFile($settingName); + } + + public function getAsConfigFileExceptionDataProvider() + { + return array( + 'non-existing setting' => array( + 'non_existing', + "Setting 'non_existing' specifies the non-existing file ''." + ), + 'non-existing file' => array( + 'item_label', + "Setting 'item_label' specifies the non-existing file '{$this->_fixtureDir}Item Label.dist'." + ), + ); + } +} diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/_files/0 b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/_files/0 new file mode 100644 index 0000000000000000000000000000000000000000..ac3906a8dcc9cad9ad4ad9a1a3fe1967c8c33239 --- /dev/null +++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/_files/0 @@ -0,0 +1 @@ +File with the name "0" diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/_files/local-invalid.xml b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/_files/1.xml similarity index 81% rename from dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/_files/local-invalid.xml rename to dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/_files/1.xml index 2a71e2a016f0d095001fa343be8fd4ac916cee5a..f9bbd87447fb5c7153a22310ea3b7b3bebb3604a 100644 --- a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/_files/local-invalid.xml +++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/_files/1.xml @@ -27,13 +27,5 @@ */ --> <config> - <global> - <resources> - <default_setup> - <connection> - <model><![CDATA[invalid]]></model> - </connection> - </default_setup> - </resources> - </global> + <value>1.xml</value> </config> diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/_files/1.xml.dist b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/_files/1.xml.dist new file mode 100644 index 0000000000000000000000000000000000000000..520a494a913d7e18939bc1242ec2f3c71d956d74 --- /dev/null +++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/_files/1.xml.dist @@ -0,0 +1,31 @@ +<?xml version="1.0"?> +<!-- +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Magento + * @subpackage integration_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ +--> +<config> + <value>1.xml.dist</value> +</config> diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/_files/2.xml b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/_files/2.xml new file mode 100644 index 0000000000000000000000000000000000000000..00cf2f7bc2f31e021fe1ab01e5ae662409c6991e --- /dev/null +++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/_files/2.xml @@ -0,0 +1,31 @@ +<?xml version="1.0"?> +<!-- +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Magento + * @subpackage integration_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ +--> +<config> + <value>2.xml</value> +</config> diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/_files/3.xml.dist b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/_files/3.xml.dist new file mode 100644 index 0000000000000000000000000000000000000000..eca1849a1bbf8546b5060bbe9070a9497fc19a7d --- /dev/null +++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/_files/3.xml.dist @@ -0,0 +1,31 @@ +<?xml version="1.0"?> +<!-- +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Magento + * @subpackage integration_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ +--> +<config> + <value>3.xml.dist</value> +</config> diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/_files/4.php b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/_files/4.php new file mode 100644 index 0000000000000000000000000000000000000000..96877d5a441d9963cb15290eb5e79b4013382989 --- /dev/null +++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/_files/4.php @@ -0,0 +1,28 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Magento + * @subpackage integration_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +return '4.php'; diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/_files/local-custom.xml b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/_files/local-custom.xml deleted file mode 100644 index 4b7b556e7157fac4bdb4d495d6e65fe3abd5b2c2..0000000000000000000000000000000000000000 --- a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/_files/local-custom.xml +++ /dev/null @@ -1,64 +0,0 @@ -<?xml version="1.0"?> -<!-- -/** - * Magento - * - * NOTICE OF LICENSE - * - * This source file is subject to the Academic Free License (AFL 3.0) - * that is bundled with this package in the file LICENSE_AFL.txt. - * It is also available through the world-wide-web at this URL: - * http://opensource.org/licenses/afl-3.0.php - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@magentocommerce.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade Magento to newer - * versions in the future. If you wish to customize Magento for your - * needs please refer to http://www.magentocommerce.com for more information. - * - * @category Magento - * @package Magento - * @subpackage integration_tests - * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) - * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) - */ ---> -<config> - <global> - <install> - <!-- Important: validity of installation date indicates whether an application is installed or not --> - <date><![CDATA[d-d-d-d-d]]></date> - </install> - <crypt> - <key><![CDATA[k-k-k-k-k]]></key> - </crypt> - <disable_local_modules>false</disable_local_modules> - <resources> - <db> - <table_prefix><![CDATA[]]></table_prefix> - </db> - <default_setup> - <connection> - <host><![CDATA[localhost]]></host> - <username><![CDATA[user]]></username> - <password><![CDATA[password]]></password> - <dbname><![CDATA[magento_integration_tests]]></dbname> - <initStatements><![CDATA[]]></initStatements> - <model><![CDATA[mssql]]></model> - <type><![CDATA[pdo_mssql]]></type> - <pdoType><![CDATA[sqlsrv]]></pdoType> - <active>1</active> - </connection> - </default_setup> - </resources> - <session_save><![CDATA[files]]></session_save> - <areas> - <adminhtml> - <frontName><![CDATA[backend]]></frontName> - </adminhtml> - </areas> - </global> -</config> diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/_files/metrics.php b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/_files/metrics.php new file mode 100644 index 0000000000000000000000000000000000000000..1248e9c4e90eafa6f91e10636a98d6ec398ae3c8 --- /dev/null +++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/_files/metrics.php @@ -0,0 +1,30 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Magento + * @subpackage integration_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +return array( + 'Fixture Label' => array('fixture_key_one', 'fixture_key_two'), +); diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/BootstrapTest.php b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/BootstrapTest.php index f4d542cd440108daa6212c00ebdeea1634dd3b5b..b002f7e3e5f02c4b174c071915e812e0e14c8395 100644 --- a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/BootstrapTest.php +++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/BootstrapTest.php @@ -31,303 +31,280 @@ class Magento_Test_BootstrapTest extends PHPUnit_Framework_TestCase { /** - * @var string + * @var Magento_Test_Bootstrap|PHPUnit_Framework_MockObject_MockObject */ - protected static $_magentoDir; - protected static $_testsDir; - protected static $_localXmlFile; - protected static $_tmpDir; - protected static $_globalEtcFiles; - protected static $_moduleEtcFiles; + protected $_object; /** - * @var Magento_Shell|PHPUnit_Framework_MockObject_MockObject + * Setting values required to be specified + * + * @var array */ - protected $_shell; + protected $_requiredSettings = array( + 'TESTS_LOCAL_CONFIG_FILE' => 'etc/local-mysql.xml', + 'TESTS_LOCAL_CONFIG_EXTRA_FILE' => 'etc/integration-tests-config.xml', + ); /** - * @var Magento_Test_Db_DbAbstract|PHPUnit_Framework_MockObject_MockObject + * @var Magento_Test_Bootstrap_Settings */ - protected $_db; + protected $_settings; /** - * @var Magento_Test_Bootstrap|PHPUnit_Framework_MockObject_MockObject + * @var Magento_Test_Bootstrap_Environment|PHPUnit_Framework_MockObject_MockObject */ - protected $_bootstrap; + protected $_envBootstrap; /** - * Calculate directories + * @var Magento_Test_Bootstrap_DocBlock|PHPUnit_Framework_MockObject_MockObject */ - public static function setUpBeforeClass() - { - self::$_magentoDir = realpath(dirname(__FILE__) . '/../../../../../../../../..'); - self::$_testsDir = realpath(dirname(__FILE__) . '/../../../../../..'); - self::$_localXmlFile = realpath(dirname(__FILE__) . '/../../../../../../etc/local-mysql.xml.dist'); - self::$_globalEtcFiles = realpath(dirname(__FILE__) . '/../../../../../../../../../app/etc/*.xml'); - self::$_moduleEtcFiles = realpath(dirname(__FILE__) . '/../../../../../../../../../app/etc/modules/*.xml'); - self::$_tmpDir = realpath(dirname(__FILE__) . '/../../../../../../tmp'); - } + protected $_docBlockBootstrap; + + /** + * @var Magento_Test_Bootstrap_Profiler|PHPUnit_Framework_MockObject_MockObject + */ + protected $_profilerBootstrap; + + /** + * @var Magento_Test_Bootstrap_Memory + */ + protected $_memoryBootstrap; + + /** + * @var Magento_Shell|PHPUnit_Framework_MockObject_MockObject + */ + protected $_shell; + + /** + * @var string + */ + protected $_integrationTestsDir; protected function setUp() { - $this->_shell = $this->getMock('Magento_Shell', array('execute')); - $this->_db = $this->getMock( - 'Magento_Test_Db_DbAbstract', - array('cleanup'), - array('host', 'user', 'password', 'schema', self::$_tmpDir, $this->_shell) + $this->_integrationTestsDir = realpath(__DIR__ . '/../../../../../../'); + $this->_settings = new Magento_Test_Bootstrap_Settings($this->_integrationTestsDir, $this->_requiredSettings); + $this->_envBootstrap = $this->getMock( + 'Magento_Test_Bootstrap_Environment', array('emulateHttpRequest', 'emulateSession') ); - /* Suppress calling the constructor at this step */ - $this->_bootstrap = $this->getMock( - 'Magento_Test_Bootstrap', - array( - '_initialize', - '_resetApp', - '_verifyDirectories', - '_instantiateDb', - '_isInstalled', - '_emulateEnvironment', - '_ensureDirExists', - '_install', - '_cleanupFilesystem', - ), - array(), - '', - false + $this->_docBlockBootstrap = $this->getMock( + 'Magento_Test_Bootstrap_DocBlock', array('registerAnnotations'), array(__DIR__) + ); + $profilerDriver = $this->getMock('Magento_Profiler_Driver_Standard', array('registerOutput')); + $this->_profilerBootstrap = $this->getMock( + 'Magento_Test_Bootstrap_Profiler', array('registerFileProfiler', 'registerBambooProfiler'), + array($profilerDriver) + ); + $this->_memoryBootstrap = $this->getMock( + 'Magento_Test_Bootstrap_Memory', array('activateStatsDisplaying', 'activateLimitValidation'), + array(), '', false + ); + $this->_shell = $this->getMock('Magento_Shell', array('execute')); + $this->_object = new Magento_Test_Bootstrap( + $this->_settings, $this->_envBootstrap, $this->_docBlockBootstrap, $this->_profilerBootstrap, + $this->_shell, __DIR__ ); - /* Setup expectations for methods that are being called within the constructor */ - $this->_bootstrap - ->expects($this->any()) - ->method('_instantiateDb') - ->will($this->returnValue($this->_db)) - ; - /* Call constructor explicitly */ - $this->_callBootstrapConstructor(); } protected function tearDown() { + $this->_object = null; + $this->_settings = null; + $this->_envBootstrap = null; + $this->_docBlockBootstrap = null; + $this->_profilerBootstrap = null; + $this->_memoryBootstrap = null; $this->_shell = null; - $this->_db = null; - $this->_bootstrap = null; } /** - * Explicitly call the constructor method of the underlying bootstrap object - * - * @param string|null $localXmlFile - * @param bool $isCleanupEnabled + * @param array $fixtureSettings + * @return Magento_Test_Application|PHPUnit_Framework_MockObject_MockObject */ - protected function _callBootstrapConstructor($localXmlFile = null, $isCleanupEnabled = false) + protected function _injectApplicationMock(array $fixtureSettings = array()) { - $this->_bootstrap->__construct( - self::$_magentoDir, - self::$_testsDir, - ($localXmlFile ? $localXmlFile : self::$_localXmlFile), - self::$_globalEtcFiles, - self::$_moduleEtcFiles, - '', - self::$_tmpDir, - $this->_shell, - $isCleanupEnabled + $fixtureSettings += $this->_requiredSettings; + $application = $this->getMock( + 'Magento_Test_Application', array('cleanup', 'isInstalled', 'initialize', 'install'), array(), '', false ); + $settings = new Magento_Test_Bootstrap_Settings($this->_integrationTestsDir, $fixtureSettings); + // prevent calling the constructor because of mocking the method it invokes + $this->_object = $this->getMock( + 'Magento_Test_Bootstrap', array('_createApplication', '_createMemoryBootstrap'), array(), '', false + ); + $this->_object + ->expects($this->any()) + ->method('_createApplication') + ->will($this->returnValue($application)) + ; + // invoke the constructor explicitly + $this->_object->__construct( + $settings, $this->_envBootstrap, $this->_docBlockBootstrap, $this->_profilerBootstrap, + $this->_shell, __DIR__ + ); + $this->_object + ->expects($this->any()) + ->method('_createMemoryBootstrap') + ->will($this->returnValue($this->_memoryBootstrap)) + ; + return $application; } - /** - * @expectedException Magento_Exception - */ - public function testGetInstance() - { - Magento_Test_Bootstrap::getInstance(); - } - - /** - * @depends testGetInstance - */ - public function testSetGetInstance() + public function testGetApplication() { - Magento_Test_Bootstrap::setInstance($this->_bootstrap); - $this->assertSame($this->_bootstrap, Magento_Test_Bootstrap::getInstance()); + $application = $this->_object->getApplication(); + $this->assertInstanceOf('Magento_Test_Application', $application); + $this->assertStringStartsWith(__DIR__ . '/sandbox-mysql-', $application->getInstallDir()); + $this->assertInstanceOf('Magento_Test_Db_Mysql', $application->getDbInstance()); + $this->assertSame($application, $this->_object->getApplication()); } - public function testCanTestHeaders() + public function testGetDbVendorName() { - if (!function_exists('xdebug_get_headers')) { - $this->assertFalse(Magento_Test_Bootstrap::canTestHeaders(), 'Expected inability to test headers.'); - return; - } - $expectedHeader = 'SomeHeader: header-value'; - $expectedCookie = 'Set-Cookie: SomeCookie=cookie-value'; - - /* Make sure that chosen reference samples are unique enough to rely on them */ - $actualHeaders = xdebug_get_headers(); - $this->assertNotContains($expectedHeader, $actualHeaders); - $this->assertNotContains($expectedCookie, $actualHeaders); - - /* Determine whether header-related functions can be in fact called with no error */ - $expectedCanTest = true; - set_error_handler(function () use (&$expectedCanTest) { - $expectedCanTest = false; - }); - header($expectedHeader); - setcookie('SomeCookie', 'cookie-value'); - restore_error_handler(); - - $this->assertEquals($expectedCanTest, Magento_Test_Bootstrap::canTestHeaders()); - - if ($expectedCanTest) { - $actualHeaders = xdebug_get_headers(); - $this->assertContains($expectedHeader, $actualHeaders); - $this->assertContains($expectedCookie, $actualHeaders); - } + $this->assertEquals('mysql', $this->_object->getDbVendorName()); } - public function testConstructorInstallation() + public function testRunBootstrapEnvironment() { - $this->_bootstrap - ->expects($this->atLeastOnce()) - ->method('_isInstalled') - ->will($this->returnValue(false)) - ; - $this->_bootstrap + $this->_injectApplicationMock(); + $this->_envBootstrap ->expects($this->once()) - ->method('_install') + ->method('emulateHttpRequest') + ->with($this->identicalTo($_SERVER)) ; - $this->_callBootstrapConstructor(); - } - - public function testConstructorInitialization() - { - $this->_bootstrap - ->expects($this->atLeastOnce()) - ->method('_isInstalled') - ->will($this->returnValue(true)) - ; - $this->_bootstrap + $this->_envBootstrap ->expects($this->once()) - ->method('_initialize') + ->method('emulateSession') + ->with($this->identicalTo(isset($_SESSION) ? $_SESSION : null)) ; - $this->_callBootstrapConstructor(); + $this->_object->runBootstrap(); } - public function testConstructorCleanupDisabled() + public function testRunBootstrapProfilerDisabled() { - $this->_db - ->expects($this->never()) - ->method('cleanup') - ; - $this->_bootstrap + $this->_injectApplicationMock(); + $this->_profilerBootstrap ->expects($this->never()) - ->method('_cleanupFilesystem') + ->method($this->anything()) ; - $this->_callBootstrapConstructor(null, false); + $this->_object->runBootstrap(); } - public function testConstructorCleanupEnabled() + public function testRunBootstrapProfilerEnabled() { - $this->_db + $baseDir = $this->_integrationTestsDir; + $dirSep = DIRECTORY_SEPARATOR; + $this->_injectApplicationMock(array( + 'TESTS_PROFILER_FILE' => 'profiler.csv', + 'TESTS_BAMBOO_PROFILER_FILE' => 'profiler_bamboo.csv', + 'TESTS_BAMBOO_PROFILER_METRICS_FILE' => 'profiler_metrics.php', + )); + $this->_profilerBootstrap ->expects($this->once()) - ->method('cleanup') + ->method('registerFileProfiler') + ->with("{$baseDir}{$dirSep}profiler.csv") ; - $this->_bootstrap + $this->_profilerBootstrap ->expects($this->once()) - ->method('_cleanupFilesystem') + ->method('registerBambooProfiler') + ->with("{$baseDir}{$dirSep}profiler_bamboo.csv", "{$baseDir}{$dirSep}profiler_metrics.php") ; - $this->_callBootstrapConstructor(null, true); - } - - /** - * @dataProvider constructorExceptionDataProvider - * @expectedException Magento_Exception - */ - public function testConstructorException($localXmlFile) - { - $this->_callBootstrapConstructor($localXmlFile); + $this->_object->runBootstrap(); } - public function constructorExceptionDataProvider() + public function testRunBootstrapMemoryWatch() { - return array( - 'non existing local.xml' => array('local-non-existing.xml'), - 'invalid local.xml' => array(dirname(__FILE__) . '/Bootstrap/_files/local-invalid.xml'), - ); - } - - /** - * @dataProvider getDbVendorNameDataProvider - */ - public function testGetDbVendorName($localXmlFile, $expectedDbVendorName) - { - $this->_callBootstrapConstructor($localXmlFile); - $this->assertEquals($expectedDbVendorName, $this->_bootstrap->getDbVendorName()); - } - - public function getDbVendorNameDataProvider() - { - return array( - 'mysql' => array(self::$_localXmlFile, 'mysql'), - 'custom' => array(realpath(__DIR__ . '/Bootstrap/_files/local-custom.xml'), 'mssql'), - ); + $this->_injectApplicationMock(array( + 'TESTS_MEM_USAGE_LIMIT' => 100, + 'TESTS_MEM_LEAK_LIMIT' => 60, + )); + $this->_object + ->expects($this->once()) + ->method('_createMemoryBootstrap') + ->with(100, 60) + ->will($this->returnValue($this->_memoryBootstrap)) + ; + $this->_memoryBootstrap + ->expects($this->once()) + ->method('activateStatsDisplaying') + ; + $this->_memoryBootstrap + ->expects($this->once()) + ->method('activateLimitValidation') + ; + $this->_object->runBootstrap(); } - /** - * @param $origParams - * @param $customParams - * @param $expectedResult - * @dataProvider reinitializeDataProvider - */ - public function testReinitialize($origParams, $customParams, $expectedResult) + public function testRunBootstrapDocBlockAnnotations() { - - $property = new ReflectionProperty(get_class($this->_bootstrap), '_initParams'); - $property->setAccessible(true); - $property->setValue($this->_bootstrap, $origParams); - - $this->_bootstrap->expects($this->once())->method('_resetApp'); - $this->_bootstrap->expects($this->once())->method('_initialize')->with($expectedResult); - - $this->_bootstrap->reinitialize($customParams); + $this->_injectApplicationMock(); + $this->_docBlockBootstrap + ->expects($this->once()) + ->method('registerAnnotations') + ->with($this->isInstanceOf('Magento_Test_Application')) + ; + $this->_object->runBootstrap(); } - /** - * @return array - */ - public function reinitializeDataProvider() + public function testRunBootstrapAppCleanup() { - $origParams = array('one' => array('two' => 'three')); - return array( - array( - $origParams, - array(), - $origParams - ), - array( - $origParams, - array('one' => array('four' => 'five')), - array('one' => array('two' => 'three', 'four' => 'five')) - ), - array( - $origParams, - array('one' => array('two' => 'five')), - array('one' => array('two' => 'five')) - ), - ); + $application = $this->_injectApplicationMock(array( + 'TESTS_CLEANUP' => 'enabled', + )); + $application + ->expects($this->once()) + ->method('cleanup') + ; + $this->_object->runBootstrap(); } - public function testGetTestsDir() + public function testRunBootstrapAppInitialize() { - $this->assertEquals(self::$_testsDir, $this->_bootstrap->getTestsDir()); + $application = $this->_injectApplicationMock(); + $application + ->expects($this->once()) + ->method('isInstalled') + ->will($this->returnValue(true)) + ; + $application + ->expects($this->once()) + ->method('initialize') + ; + $application + ->expects($this->never()) + ->method('install') + ; + $application + ->expects($this->never()) + ->method('cleanup') + ; + $this->_object->runBootstrap(); } - public function testGetInitParams() + public function testRunBootstrapAppInstall() { - $initParams = $this->_bootstrap->getInitParams(); - $this->_bootstrap->expects($this->once()) - ->method('_initialize') - ->with($initParams); - $this->_bootstrap->expects($this->once()) - ->method('_isInstalled') - ->will($this->returnValue(true)); - - $this->_callBootstrapConstructor(); + $adminUserName = Magento_Test_Bootstrap::ADMIN_NAME; + $adminPassword = Magento_Test_Bootstrap::ADMIN_PASSWORD; + $adminRoleName = Magento_Test_Bootstrap::ADMIN_ROLE_NAME; + $application = $this->_injectApplicationMock(); + $application + ->expects($this->once()) + ->method('isInstalled') + ->will($this->returnValue(false)) + ; + $application + ->expects($this->once()) + ->method('install') + ->with($adminUserName, $adminPassword, $adminRoleName) + ; + $application + ->expects($this->never()) + ->method('initialize') + ; + $application + ->expects($this->never()) + ->method('cleanup') + ; + $this->_object->runBootstrap(); } } diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Helper/BootstrapTest.php b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Helper/BootstrapTest.php new file mode 100644 index 0000000000000000000000000000000000000000..7c31c89dd4bad93d15a5e81727c03281a16272e3 --- /dev/null +++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Helper/BootstrapTest.php @@ -0,0 +1,198 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Magento + * @subpackage integration_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Test class for Magento_Test_Helper_Bootstrap. + */ +class Magento_Test_Helper_BootstrapTest extends PHPUnit_Framework_TestCase +{ + /** + * @var Magento_Test_Helper_Bootstrap + */ + protected $_object; + + /** + * @var Magento_Test_Bootstrap|PHPUnit_Framework_MockObject_MockObject + */ + protected $_bootstrap; + + /** + * @var Magento_Test_Application|PHPUnit_Framework_MockObject_MockObject + */ + protected $_application; + + /** + * Predefined application initialization parameters + * + * @var array + */ + protected $_fixtureInitParams = array( + Mage_Core_Model_App::INIT_OPTION_DIRS => array( + Mage_Core_Model_Dir::CONFIG => __DIR__, + Mage_Core_Model_Dir::VAR_DIR => __DIR__, + ), + ); + + protected function setUp() + { + $this->_application = $this->getMock( + 'Magento_Test_Application', array('getInstallDir', 'getInitParams', 'reinitialize', 'run'), + array(), '', false + ); + $this->_bootstrap = $this->getMock( + 'Magento_Test_Bootstrap', array('getApplication', 'getDbVendorName'), array(), '', false + ); + $this->_bootstrap + ->expects($this->any()) + ->method('getApplication') + ->will($this->returnValue($this->_application)) + ; + $this->_object = new Magento_Test_Helper_Bootstrap($this->_bootstrap); + } + + protected function tearDown() + { + $this->_application = null; + $this->_bootstrap = null; + $this->_object = null; + } + + /** + * @expectedException Magento_Exception + * @expectedExceptionMessage Helper instance is not defined yet. + */ + public function testGetInstanceEmptyProhibited() + { + Magento_Test_Helper_Bootstrap::getInstance(); + } + + public function testSetInstanceFirstAllowed() + { + Magento_Test_Helper_Bootstrap::setInstance($this->_object); + return $this->_object; + } + + /** + * @depends testSetInstanceFirstAllowed + */ + public function testGetInstanceAllowed(Magento_Test_Helper_Bootstrap $expectedInstance) + { + $this->assertSame($expectedInstance, Magento_Test_Helper_Bootstrap::getInstance()); + } + + /** + * @depends testSetInstanceFirstAllowed + * @expectedException Magento_Exception + * @expectedExceptionMessage Helper instance cannot be redefined. + */ + public function testSetInstanceChangeProhibited() + { + Magento_Test_Helper_Bootstrap::setInstance($this->_object); + } + + public function testCanTestHeaders() + { + if (!function_exists('xdebug_get_headers')) { + $this->assertFalse(Magento_Test_Helper_Bootstrap::canTestHeaders(), 'Expected inability to test headers.'); + return; + } + $expectedHeader = 'SomeHeader: header-value'; + $expectedCookie = 'Set-Cookie: SomeCookie=cookie-value'; + + /* Make sure that chosen reference samples are unique enough to rely on them */ + $actualHeaders = xdebug_get_headers(); + $this->assertNotContains($expectedHeader, $actualHeaders); + $this->assertNotContains($expectedCookie, $actualHeaders); + + /* Determine whether header-related functions can be in fact called with no error */ + $expectedCanTest = true; + set_error_handler(function () use (&$expectedCanTest) { + $expectedCanTest = false; + }); + header($expectedHeader); + setcookie('SomeCookie', 'cookie-value'); + restore_error_handler(); + + $this->assertEquals($expectedCanTest, Magento_Test_Helper_Bootstrap::canTestHeaders()); + + if ($expectedCanTest) { + $actualHeaders = xdebug_get_headers(); + $this->assertContains($expectedHeader, $actualHeaders); + $this->assertContains($expectedCookie, $actualHeaders); + } + } + + public function testGetAppInstallDir() + { + $this->_application + ->expects($this->once()) + ->method('getInstallDir') + ->will($this->returnValue(__DIR__)) + ; + $this->assertEquals(__DIR__, $this->_object->getAppInstallDir()); + } + + public function testGetAppInitParams() + { + $this->_application + ->expects($this->once()) + ->method('getInitParams') + ->will($this->returnValue($this->_fixtureInitParams)) + ; + $this->assertEquals($this->_fixtureInitParams, $this->_object->getAppInitParams()); + } + + public function testGetDbVendorName() + { + $this->_bootstrap + ->expects($this->once()) + ->method('getDbVendorName') + ->will($this->returnValue('mysql')) + ; + $this->assertEquals('mysql', $this->_object->getDbVendorName()); + } + + public function testReinitialize() + { + $this->_application + ->expects($this->once()) + ->method('reinitialize') + ->with($this->_fixtureInitParams) + ; + $this->_object->reinitialize($this->_fixtureInitParams); + } + + public function testRunApp() + { + $this->_application + ->expects($this->once()) + ->method('run') + ->with($this->_fixtureInitParams) + ; + $this->_object->runApp($this->_fixtureInitParams); + } +} diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Helper/MemoryTest.php b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Helper/MemoryTest.php new file mode 100644 index 0000000000000000000000000000000000000000..32f9aaa1414c62494522a8d6cd97c646b2f53294 --- /dev/null +++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Helper/MemoryTest.php @@ -0,0 +1,138 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +class Magento_Test_Helper_MemoryTest extends PHPUnit_Framework_TestCase +{ + /** + * @var PHPUnit_Framework_MockObject_MockObject + */ + private $_shell; + + protected function setUp() + { + $this->_shell = $this->getMock('Magento_Shell', array('execute'), array(), '', false); + } + + public function testGetRealMemoryUsage() + { + /** @var $mock PHPUnit_Framework_MockObject_MockObject|Magento_Test_Helper_Memory */ + $mock = $this->getMock( + 'Magento_Test_Helper_Memory', + array('getUnixProcessMemoryUsage', 'getWinProcessMemoryUsage'), + array($this->_shell) + ); + $mock->expects($this->any())->method('getUnixProcessMemoryUsage')->will($this->returnValue('gizmo')); + $mock->expects($this->any())->method('getWinProcessMemoryUsage')->will($this->returnValue('gizmo')); + $this->assertEquals('gizmo', $mock->getRealMemoryUsage()); + } + + public function testGetUnixProcessMemoryUsage() + { + $unixFixture = ' PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND' + . "\n" . '12345 root 20 0 215m 36m 10m S 98 0.5 0:32.96 php'; + $this->_shell->expects($this->once())->method('execute')->will($this->returnValue($unixFixture)); + $object = new Magento_Test_Helper_Memory($this->_shell); + $this->assertEquals('37748736', $object->getUnixProcessMemoryUsage(0)); + } + + public function testGetWinProcessMemoryUsage() + { + $winFixture = '"Image Name","PID","Session Name","Session#","Mem Usage"' + . "\r\n" . '"php.exe","12345","N/A","0","26,321 K"'; + $this->_shell->expects($this->once())->method('execute')->will($this->returnValue($winFixture)); + $object = new Magento_Test_Helper_Memory($this->_shell); + $this->assertEquals('26952704', $object->getWinProcessMemoryUsage(0)); + } + + public function testIsWindowsOs() + { + $this->assertInternalType('boolean', Magento_Test_Helper_Memory::isWindowsOs()); + } + + /** + * @param string $number + * @param string $expected + * @dataProvider convertToBytes32DataProvider + */ + public function testConvertToBytes32($number, $expected) + { + $this->assertEquals($expected, Magento_Test_Helper_Memory::convertToBytes($number)); + } + + /** + * @return array + */ + public function convertToBytes32DataProvider() + { + return array( + array('1B', '1'), + array('3K', '3072'), + array('2M', '2097152'), + array('1G', '1073741824'), + ); + } + + /** + * @param string $number + * @param string $expected + * @dataProvider convertToBytes64DataProvider + */ + public function testConvertToBytes64($number, $expected) + { + if (PHP_INT_SIZE <= 4) { + $this->markTestSkipped("A 64-bit system is required to perform this test."); + } + $this->assertEquals($expected, Magento_Test_Helper_Memory::convertToBytes($number)); + } + + /** + * @return array + */ + public function convertToBytes64DataProvider() + { + return array( + array('2T', '2199023255552'), + array('1P', '1125899906842624'), + array('2E', '2305843009213693952'), + ); + } + + /** + * @expectedException InvalidArgumentException + */ + public function testConvertToBytesInvalidArgument() + { + Magento_Test_Helper_Memory::convertToBytes('3Z'); + } + + /** + * @expectedException OutOfBoundsException + */ + public function testConvertToBytesOutOfBounds() + { + if (PHP_INT_SIZE > 4) { + $this->markTestSkipped("A 32-bit system is required to perform this test."); + } + Magento_Test_Helper_Memory::convertToBytes('2P'); + } +} diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Isolation/WorkingDirectoryTest.php b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Isolation/WorkingDirectoryTest.php new file mode 100644 index 0000000000000000000000000000000000000000..f0e71762222f4cdea01b47e63792a75ecc232acd --- /dev/null +++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Isolation/WorkingDirectoryTest.php @@ -0,0 +1,61 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Magento + * @subpackage integration_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Test class for Magento_Test_Isolation_WorkingDirectory. + */ +class Magento_Test_Isolation_WorkingDirectoryTest extends PHPUnit_Framework_TestCase +{ + /** + * @var Magento_Test_Isolation_WorkingDirectory + */ + protected $_object; + + protected function setUp() + { + $this->_object = new Magento_Test_Isolation_WorkingDirectory(); + } + + protected function tearDown() + { + $this->_object = null; + } + + public function testStartTestEndTest() + { + $oldWorkingDir = getcwd(); + $newWorkingDir = __DIR__; + if ($oldWorkingDir == $newWorkingDir) { + $this->markTestSkipped("Test requires the current working directory to differ from '$oldWorkingDir'."); + } + $this->_object->startTest($this); + chdir($newWorkingDir); + $this->assertEquals($newWorkingDir, getcwd(), 'Unable to change the current working directory.'); + $this->_object->endTest($this); + $this->assertEquals($oldWorkingDir, getcwd(), 'Current working directory was not restored.'); + } +} diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/MemoryLimitTest.php b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/MemoryLimitTest.php new file mode 100644 index 0000000000000000000000000000000000000000..dffbed25b2d80a730d7923d64438f8ba933e2020 --- /dev/null +++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/MemoryLimitTest.php @@ -0,0 +1,77 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +class Magento_Test_MemoryLimitTest extends PHPUnit_Framework_TestCase +{ + public function testPrintHeader() + { + $result = Magento_Test_MemoryLimit::printHeader(); + $this->assertNotEmpty($result); + $this->assertStringEndsWith(PHP_EOL, $result); + } + + public function testPrintStats() + { + $object = $this->_createObject(0, 0); + $result = $object->printStats(); + $this->assertContains('Memory usage (OS):', $result); + $this->assertContains('1.00M', $result); + $this->assertContains('Estimated memory leak:', $result); + $this->assertContains('reported by PHP', $result); + $this->assertStringEndsWith(PHP_EOL, $result); + + $object = $this->_createObject('2M', 0); + $this->assertContains('50.00% of configured 2.00M limit', $object->printStats()); + + $object = $this->_createObject(0, '500K'); + $this->assertContains('% of configured 0.49M limit', $object->printStats()); + } + + public function testValidateUsage() + { + $object = $this->_createObject(0, 0); + $this->assertNull($object->validateUsage()); + } + + /** + * @expectedException LogicException + */ + public function testValidateUsageException() + { + $object = $this->_createObject('500K', '2M'); + $object->validateUsage(); + } + + /** + * @param string $memCap + * @param string $leakCap + * @return Magento_Test_MemoryLimit + */ + protected function _createObject($memCap, $leakCap) + { + $helper = $this->getMock('Magento_Test_Helper_Memory', array('getRealMemoryUsage'), array(), '', false); + $helper->expects($this->any())->method('getRealMemoryUsage')->will($this->returnValue(1024 * 1024)); + return new Magento_Test_MemoryLimit($memCap, $leakCap, $helper); + } +} diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/TestCase/ControllerAbstractTest.php b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/TestCase/ControllerAbstractTest.php index 110ef985995e8ad2ac4fdc0eeca36c6f3ea015cb..45346375fe71ca1771d3bc6ae4d3624432cb5206 100644 --- a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/TestCase/ControllerAbstractTest.php +++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/TestCase/ControllerAbstractTest.php @@ -29,6 +29,22 @@ class Magento_Test_TestCase_ControllerAbstractTest extends Magento_Test_TestCase { protected $_bootstrap; + protected function setUp() + { + parent::setUp(); + + // emulate session messages + $messagesCollection = new Mage_Core_Model_Message_Collection(); + $messagesCollection + ->add(new Mage_Core_Model_Message_Warning('some_warning')) + ->add(new Mage_Core_Model_Message_Error('error_one')) + ->add(new Mage_Core_Model_Message_Error('error_two')) + ->add(new Mage_Core_Model_Message_Notice('some_notice')) + ; + $sessionModelFixture = new Varien_Object(array('messages' => $messagesCollection)); + $this->_objectManager->addSharedInstance($sessionModelFixture, 'Mage_Core_Model_Session'); + } + /** * Bootstrap instance getter. * Mocking real bootstrap @@ -108,4 +124,38 @@ class Magento_Test_TestCase_ControllerAbstractTest extends Magento_Test_TestCase $this->assertRedirect(); $this->assertRedirect($this->equalTo('http://magentocommerce.com')); } + + /** + * @param array $expectedMessages + * @param string|null $messageTypeFilter + * @dataProvider assertSessionMessagesDataProvider + */ + public function testAssertSessionMessagesSuccess(array $expectedMessages, $messageTypeFilter) + { + $constraint = $this->getMock('PHPUnit_Framework_Constraint', array('toString', 'matches')); + $constraint + ->expects($this->once()) + ->method('matches') + ->with($expectedMessages) + ->will($this->returnValue(true)) + ; + $this->assertSessionMessages($constraint, $messageTypeFilter); + } + + public function assertSessionMessagesDataProvider() + { + return array( + 'no message type filtering' => array(array('some_warning', 'error_one', 'error_two', 'some_notice'), null), + 'message type filtering' => array(array('error_one', 'error_two'), Mage_Core_Model_Message::ERROR), + ); + } + + /** + * @expectedException PHPUnit_Framework_ExpectationFailedException + * @expectedExceptionMessage Session messages do not meet expectations + */ + public function testAssertSessionMessagesFailure() + { + $this->assertSessionMessages($this->isEmpty()); + } } diff --git a/dev/tests/integration/phpunit.xml.dist b/dev/tests/integration/phpunit.xml.dist index 861219b3d48667367e001d0fb6ba790b1fc5f883..e45b28709cf2b61432ad9944967126c17ea50307 100644 --- a/dev/tests/integration/phpunit.xml.dist +++ b/dev/tests/integration/phpunit.xml.dist @@ -59,6 +59,9 @@ <const name="TESTS_MODULE_CONFIG_FILES" value="../../../app/etc/modules/*.xml;etc/modules/*.xml"/> <!-- Whether to cleanup the application before running tests or not --> <const name="TESTS_CLEANUP" value="enabled"/> + <!-- Memory usage and estimated leaks thresholds --> + <const name="TESTS_MEM_USAGE_LIMIT" value=""/> + <const name="TESTS_MEM_LEAK_LIMIT" value=""/> <!-- CSV Profiler Output file --> <!--<const name="TESTS_PROFILER_FILE" value="profiler.csv"/>--> <!-- Bamboo compatible CSV Profiler Output file name --> diff --git a/dev/tests/integration/testsuite/Mage/Adminhtml/Block/System/Account/Edit/FormTest.php b/dev/tests/integration/testsuite/Mage/Adminhtml/Block/System/Account/Edit/FormTest.php new file mode 100644 index 0000000000000000000000000000000000000000..76f7c39e378efb3c0c607aac81298f8120b78769 --- /dev/null +++ b/dev/tests/integration/testsuite/Mage/Adminhtml/Block/System/Account/Edit/FormTest.php @@ -0,0 +1,105 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Magento_Adminhtml + * @subpackage integration_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +class Mage_Adminhtml_Block_System_Account_Edit_FormTest extends PHPUnit_Framework_TestCase +{ + public function testPrepareForm() + { + $user = Mage::getModel('Mage_User_Model_User')->loadByUsername(Magento_Test_Bootstrap::ADMIN_NAME); + + /** @var $session Mage_Backend_Model_Auth_Session */ + $session = Mage::getSingleton('Mage_Backend_Model_Auth_Session'); + $session->setUser($user); + + /** @var $layout Mage_Core_Model_Layout */ + $layout = Mage::getModel('Mage_Core_Model_Layout'); + + /** @var Mage_Adminhtml_Block_System_Account_Edit_Form */ + $block = $layout->createBlock('Mage_Adminhtml_Block_System_Account_Edit_Form'); + $block->toHtml(); + + $form = $block->getForm(); + + $this->assertInstanceOf('Varien_Data_Form', $form); + $this->assertEquals('post', $form->getData('method')); + $this->assertEquals($block->getUrl('*/system_account/save'), $form->getData('action')); + $this->assertEquals('edit_form', $form->getId()); + $this->assertTrue($form->getUseContainer()); + + $expectedFieldset = array( + 'username' => array( + 'name' => 'username', + 'type' => 'text', + 'required' => true, + 'value' => $user->getData('username') + ), + 'firstname' => array( + 'name' => 'firstname', + 'type' => 'text', + 'required' => true, + 'value' => $user->getData('firstname') + ), + 'lastname' => array( + 'name' => 'lastname', + 'type' => 'text', + 'required' => true, + 'value' => $user->getData('lastname') + ), + 'email' => array( + 'name' => 'email', + 'type' => 'text', + 'required' => true, + 'value' => $user->getData('email') + ), + 'password' => array( + 'name' => 'password', + 'type' => 'password', + 'required' => false + ), + 'confirmation' => array( + 'name' => 'password_confirmation', + 'type' => 'password', + 'required' => false + ), + ); + + foreach ($expectedFieldset as $fieldId => $field) { + $element = $form->getElement($fieldId); + $this->assertInstanceOf('Varien_Data_Form_Element_Abstract', $element); + $this->assertEquals($field['name'], $element->getName(), 'Wrong \'' . $fieldId . '\' field name'); + $this->assertEquals($field['type'], $element->getType(), 'Wrong \'' . $fieldId . ' field type'); + $this->assertEquals( + $field['required'], + $element->getData('required'), + 'Wrong \'' . $fieldId . '\' requirement state' + ); + if (array_key_exists('value', $field)) { + $this->assertEquals($field['value'], $element->getData('value'), 'Wrong \'' . $fieldId . '\' value'); + } + } + } +} diff --git a/dev/tests/integration/testsuite/Mage/Adminhtml/System/AccountControllerTest.php b/dev/tests/integration/testsuite/Mage/Adminhtml/System/AccountControllerTest.php new file mode 100644 index 0000000000000000000000000000000000000000..2547f29ca9a545f052fbe61f1675e4f5f5367a00 --- /dev/null +++ b/dev/tests/integration/testsuite/Mage/Adminhtml/System/AccountControllerTest.php @@ -0,0 +1,48 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +class Mage_Adminhtml_System_AccountControllerTest extends Mage_Backend_Utility_Controller +{ + /** + * @magentoDbIsolation enabled + */ + public function testSaveAction() + { + $userId = $this->_session->getUser()->getId(); + /** @var $user Mage_User_Model_User */ + $user = Mage::getModel('Mage_User_Model_User')->load($userId); + $oldPassword = $user->getPassword(); + + $password = uniqid('123q'); + $request = $this->getRequest(); + $request->setParam('username', $user->getUsername())->setParam('email', $user->getEmail()) + ->setParam('firstname', $user->getFirstname())->setParam('lastname', $user->getLastname()) + ->setParam('password', $password)->setParam('password_confirmation', $password); + $this->dispatch('backend/admin/system_account/save'); + + /** @var $user Mage_User_Model_User */ + $user = Mage::getModel('Mage_User_Model_User')->load($userId); + $this->assertNotEquals($oldPassword, $user->getPassword()); + $this->assertTrue(Mage::helper('Mage_Core_Helper_Data')->validateHash($password, $user->getPassword())); + } +} diff --git a/dev/tests/integration/testsuite/Mage/Adminhtml/controllers/Catalog/CategoryControllerTest.php b/dev/tests/integration/testsuite/Mage/Adminhtml/controllers/Catalog/CategoryControllerTest.php index 08d24895585a6b4ef57ab6227252d81f2b6a41bc..8b22b63f0d9e6aa2a0abe5c9a2453a07af948b8d 100644 --- a/dev/tests/integration/testsuite/Mage/Adminhtml/controllers/Catalog/CategoryControllerTest.php +++ b/dev/tests/integration/testsuite/Mage/Adminhtml/controllers/Catalog/CategoryControllerTest.php @@ -47,10 +47,9 @@ class Mage_Adminhtml_Catalog_CategoryControllerTest extends Mage_Backend_Utility $this->getRequest()->setParam('id', 2); $this->dispatch('backend/admin/catalog_category/save'); - $messages = Mage::getSingleton('Mage_Backend_Model_Session') - ->getMessages(false)->getItemsByType(Mage_Core_Model_Message::SUCCESS); - $this->assertNotEmpty($messages, "Could not save category"); - $this->assertEquals('The category has been saved.', current($messages)->getCode()); + $this->assertSessionMessages( + $this->equalTo(array('The category has been saved.')), Mage_Core_Model_Message::SUCCESS + ); /** @var $category Mage_Catalog_Model_Category */ $category = Mage::getModel('Mage_Catalog_Model_Category'); @@ -297,10 +296,8 @@ class Mage_Adminhtml_Catalog_CategoryControllerTest extends Mage_Backend_Utility ), )); $this->dispatch('backend/admin/catalog_category/save'); - /** @var Mage_Backend_Model_Session $session */ - $session = Mage::getSingleton('Mage_Backend_Model_Session'); - $errorMessages = $session->getMessages()->getErrors(); - $this->assertCount(1, $errorMessages); - $this->assertEquals('Unable to save the category', $errorMessages[0]->getCode()); + $this->assertSessionMessages( + $this->equalTo(array('Unable to save the category')), Mage_Core_Model_Message::ERROR + ); } } diff --git a/dev/tests/integration/testsuite/Mage/Adminhtml/controllers/Catalog/ProductControllerTest.php b/dev/tests/integration/testsuite/Mage/Adminhtml/controllers/Catalog/ProductControllerTest.php index 9455a37c63235fad2f1a93f989947e3bee5db453..cf1ba0b48b015201fe7cf46831f77e4a49f85135 100644 --- a/dev/tests/integration/testsuite/Mage/Adminhtml/controllers/Catalog/ProductControllerTest.php +++ b/dev/tests/integration/testsuite/Mage/Adminhtml/controllers/Catalog/ProductControllerTest.php @@ -43,6 +43,9 @@ class Mage_Adminhtml_Catalog_ProductControllerTest extends Mage_Backend_Utility_ /** @var $product Mage_Catalog_Model_Product */ $product = Mage::registry('current_product'); $this->assertEquals($associatedProductIds, $product->getAssociatedProductIds()); + + /** @see Mage_Backend_Utility_Controller::assertPostConditions() */ + $this->markTestIncomplete('Suppressing admin error messages validation until the bug MAGETWO-7044 is fixed.'); } /** @@ -66,11 +69,9 @@ class Mage_Adminhtml_Catalog_ProductControllerTest extends Mage_Backend_Utility_ ), )); $this->dispatch('backend/admin/catalog_product/save'); - /** @var Mage_Backend_Model_Session $session */ - $session = Mage::getSingleton('Mage_Backend_Model_Session'); - $errorMessages = $session->getMessages()->getErrors(); - $this->assertCount(1, $errorMessages); - $this->assertEquals('Unable to save product', $errorMessages[0]->getCode()); + $this->assertSessionMessages( + $this->equalTo(array('Unable to save product')), Mage_Core_Model_Message::ERROR + ); $this->assertRedirect($this->stringContains('/backend/admin/catalog_product/edit')); } } diff --git a/dev/tests/integration/testsuite/Mage/Adminhtml/controllers/Customer/GroupControllerTest.php b/dev/tests/integration/testsuite/Mage/Adminhtml/controllers/Customer/GroupControllerTest.php index 22e0a4fda82c8967c66294cb2184f652bd08c942..04c6318419702cffff08125a01f2c1947703587c 100644 --- a/dev/tests/integration/testsuite/Mage/Adminhtml/controllers/Customer/GroupControllerTest.php +++ b/dev/tests/integration/testsuite/Mage/Adminhtml/controllers/Customer/GroupControllerTest.php @@ -31,9 +31,6 @@ class Mage_Adminhtml_Customer_GroupControllerTest extends Mage_Backend_Utility_C { $this->dispatch('backend/admin/customer_group/new'); $responseBody = $this->getResponse()->getBody(); - $this->assertStringMatchesFormat( - '%a<div class="content-header" data-ui-id="group-content-header" >%ANew Customer Group%a', - $responseBody - ); + $this->assertContains('<h1 class="title">New Group</h1>', $responseBody); } } diff --git a/dev/tests/integration/testsuite/Mage/Adminhtml/controllers/CustomerControllerTest.php b/dev/tests/integration/testsuite/Mage/Adminhtml/controllers/CustomerControllerTest.php index 2eda4f95b5a864fec7eda708e292d1d3c90dcd06..349567fc87d1159d6fdc86117f96038830a01b3c 100644 --- a/dev/tests/integration/testsuite/Mage/Adminhtml/controllers/CustomerControllerTest.php +++ b/dev/tests/integration/testsuite/Mage/Adminhtml/controllers/CustomerControllerTest.php @@ -74,7 +74,7 @@ class Mage_Adminhtml_CustomerControllerTest extends Mage_Backend_Utility_Control /** * Check that errors was generated and set to session */ - $this->assertNotEmpty(Mage::getSingleton('Mage_Backend_Model_Session')->getMessages(false)->getErrors()); + $this->assertSessionMessages($this->logicalNot($this->isEmpty()), Mage_Core_Model_Message::ERROR); /** * Check that customer data were set to session */ @@ -101,7 +101,7 @@ class Mage_Adminhtml_CustomerControllerTest extends Mage_Backend_Utility_Control /** * Check that errors was generated and set to session */ - $this->assertNotEmpty(Mage::getSingleton('Mage_Backend_Model_Session')->getMessages(false)->getErrors()); + $this->assertSessionMessages($this->logicalNot($this->isEmpty()), Mage_Core_Model_Message::ERROR); /** * Check that customer data were set to session */ @@ -143,7 +143,7 @@ class Mage_Adminhtml_CustomerControllerTest extends Mage_Backend_Utility_Control /** * Check that errors was generated and set to session */ - $this->assertEmpty(Mage::getSingleton('Mage_Backend_Model_Session')->getMessages(false)->getErrors()); + $this->assertSessionMessages($this->isEmpty(), Mage_Core_Model_Message::ERROR); /** * Check that customer data were set to session */ @@ -152,11 +152,7 @@ class Mage_Adminhtml_CustomerControllerTest extends Mage_Backend_Utility_Control /** * Check that success message is set */ - $this->assertCount(1, - Mage::getSingleton('Mage_Backend_Model_Session') - ->getMessages(false)->getItemsByType(Mage_Core_Model_Message::SUCCESS), - 'Success message was not set' - ); + $this->assertSessionMessages($this->logicalNot($this->isEmpty()), Mage_Core_Model_Message::SUCCESS); /** * Check that customer id set and addresses saved @@ -223,9 +219,9 @@ class Mage_Adminhtml_CustomerControllerTest extends Mage_Backend_Utility_Control /** * Check that success message is set */ - $successMessages = Mage::getSingleton('Mage_Backend_Model_Session') - ->getMessages(false)->getItemsByType(Mage_Core_Model_Message::SUCCESS); - $this->assertEquals('The customer has been saved.', current($successMessages)->getCode()); + $this->assertSessionMessages( + $this->equalTo(array('The customer has been saved.')), Mage_Core_Model_Message::SUCCESS + ); /** * Check that customer id set and addresses saved @@ -272,9 +268,10 @@ class Mage_Adminhtml_CustomerControllerTest extends Mage_Backend_Utility_Control /* * Check that error message is set */ - $errorMessages = Mage::getSingleton('Mage_Backend_Model_Session') - ->getMessages(false)->getErrors(); - $this->assertEquals('This customer email already exists', current($errorMessages)->getCode()); + $this->assertSessionMessages( + $this->equalTo(array('This customer email already exists')), + Mage_Core_Model_Message::ERROR + ); $this->assertEquals($post, Mage::getSingleton('Mage_Backend_Model_Session')->getCustomerData()); $this->assertRedirect($this->stringStartsWith($this->_baseControllerUrl . 'edit/key/')); } diff --git a/dev/tests/integration/testsuite/Mage/Adminhtml/controllers/NewsletterQueueControllerTest.php b/dev/tests/integration/testsuite/Mage/Adminhtml/controllers/NewsletterQueueControllerTest.php index a03bdddf4d4e8a4d3effc42f411292517304a52a..19b060c5b20c66d42c61bd91dece145e0dbeb2cd 100644 --- a/dev/tests/integration/testsuite/Mage/Adminhtml/controllers/NewsletterQueueControllerTest.php +++ b/dev/tests/integration/testsuite/Mage/Adminhtml/controllers/NewsletterQueueControllerTest.php @@ -64,14 +64,13 @@ class Mage_Adminhtml_Newsletter_QueueControllerTest extends Mage_Backend_Utility /** * Check that errors was generated and set to session */ - $this->assertEmpty(Mage::getSingleton('Mage_Backend_Model_Session')->getMessages(false)->getErrors()); + $this->assertSessionMessages($this->isEmpty(), Mage_Core_Model_Message::ERROR); /** * Check that success message is set */ - $successMessages = Mage::getSingleton('Mage_Backend_Model_Session') - ->getMessages(false)->getItemsByType(Mage_Core_Model_Message::SUCCESS); - $this->assertCount(1, $successMessages, 'Success message was not set'); - $this->assertEquals('The newsletter queue has been saved.', current($successMessages)->getCode()); + $this->assertSessionMessages( + $this->equalTo(array('The newsletter queue has been saved.')), Mage_Core_Model_Message::SUCCESS + ); } } diff --git a/dev/tests/integration/testsuite/Mage/Adminhtml/controllers/NewsletterTemplateControllerTest.php b/dev/tests/integration/testsuite/Mage/Adminhtml/controllers/NewsletterTemplateControllerTest.php index 52ceb1d09be9dba8671f04b775bf15a34d251564..f93c66da4bf0308b8dd84995adcc6b7215fca6e7 100644 --- a/dev/tests/integration/testsuite/Mage/Adminhtml/controllers/NewsletterTemplateControllerTest.php +++ b/dev/tests/integration/testsuite/Mage/Adminhtml/controllers/NewsletterTemplateControllerTest.php @@ -65,14 +65,13 @@ class Mage_Adminhtml_Newsletter_TemplateControllerTest extends Mage_Backend_Util /** * Check that errors was generated and set to session */ - $this->assertEmpty(Mage::getSingleton('Mage_Backend_Model_Session')->getMessages(false)->getErrors()); + $this->assertSessionMessages($this->isEmpty(), Mage_Core_Model_Message::ERROR); /** * Check that success message is set */ - $successMessages = Mage::getSingleton('Mage_Backend_Model_Session') - ->getMessages(false)->getItemsByType(Mage_Core_Model_Message::SUCCESS); - $this->assertCount(1, $successMessages, 'Success message was not set'); - $this->assertEquals('The newsletter template has been saved.', current($successMessages)->getCode()); + $this->assertSessionMessages( + $this->equalTo(array('The newsletter template has been saved.')), Mage_Core_Model_Message::SUCCESS + ); } /** @@ -88,15 +87,14 @@ class Mage_Adminhtml_Newsletter_TemplateControllerTest extends Mage_Backend_Util /** * Check that errors was generated and set to session */ - $this->assertEmpty(Mage::getSingleton('Mage_Backend_Model_Session')->getMessages(false)->getErrors()); + $this->assertSessionMessages($this->isEmpty(), Mage_Core_Model_Message::ERROR); /** * Check that success message is set */ - $successMessages = Mage::getSingleton('Mage_Backend_Model_Session') - ->getMessages(false)->getItemsByType(Mage_Core_Model_Message::SUCCESS); - $this->assertCount(1, $successMessages, 'Success message was not set'); - $this->assertEquals('The newsletter template has been saved.', current($successMessages)->getCode()); + $this->assertSessionMessages( + $this->equalTo(array('The newsletter template has been saved.')), Mage_Core_Model_Message::SUCCESS + ); } /** @@ -116,14 +114,12 @@ class Mage_Adminhtml_Newsletter_TemplateControllerTest extends Mage_Backend_Util /** * Check that errors was generated and set to session */ - Mage::getSingleton('Mage_Backend_Model_Session')->getMessages(false)->getErrors(); + $this->assertSessionMessages($this->logicalNot($this->isEmpty()), Mage_Core_Model_Message::ERROR); /** * Check that success message is not set */ - $successMessages = Mage::getSingleton('Mage_Backend_Model_Session') - ->getMessages(false)->getItemsByType(Mage_Core_Model_Message::SUCCESS); - $this->assertEmpty($successMessages); + $this->assertSessionMessages($this->isEmpty(), Mage_Core_Model_Message::SUCCESS); } /** @@ -139,14 +135,13 @@ class Mage_Adminhtml_Newsletter_TemplateControllerTest extends Mage_Backend_Util /** * Check that errors was generated and set to session */ - $this->assertEmpty(Mage::getSingleton('Mage_Backend_Model_Session')->getMessages(false)->getErrors()); + $this->assertSessionMessages($this->isEmpty(), Mage_Core_Model_Message::ERROR); /** * Check that success message is set */ - $successMessages = Mage::getSingleton('Mage_Backend_Model_Session') - ->getMessages(false)->getItemsByType(Mage_Core_Model_Message::SUCCESS); - $this->assertCount(1, $successMessages, 'Success message was not set'); - $this->assertEquals('The newsletter template has been deleted.', current($successMessages)->getCode()); + $this->assertSessionMessages( + $this->equalTo(array('The newsletter template has been deleted.')), Mage_Core_Model_Message::SUCCESS + ); } } diff --git a/dev/tests/integration/testsuite/Mage/Adminhtml/controllers/System/StoreControllerTest.php b/dev/tests/integration/testsuite/Mage/Adminhtml/controllers/System/StoreControllerTest.php new file mode 100644 index 0000000000000000000000000000000000000000..9c8e500fb87e80d48bd613e1ee6b0a7b68de541f --- /dev/null +++ b/dev/tests/integration/testsuite/Mage/Adminhtml/controllers/System/StoreControllerTest.php @@ -0,0 +1,42 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +class Mage_Adminhtml_System_StoreControllerTest extends Mage_Backend_Utility_Controller +{ + public function testIndexAction() + { + $this->dispatch('backend/admin/system_store/index'); + $this->assertContains('Create Store View', $this->getResponse()->getBody()); + } + + /** + * @magentoConfigFixture global/functional_limitation/max_store_count 1 + */ + public function testIndexActionRestricted() + { + $this->dispatch('backend/admin/system_store/index'); + $response = $this->getResponse()->getBody(); + $this->assertNotContains('Create Store View', $response); + $this->assertContains('You are using the maximum number of store views allowed.', $response); + } +} diff --git a/dev/tests/integration/testsuite/Mage/Backend/Block/System/Config/FormTest.php b/dev/tests/integration/testsuite/Mage/Backend/Block/System/Config/FormTest.php index 597a28347ba537280683a90cb542a5a6aa32c87c..eddedbb710a81353c1ec2eaba574a019a410c30d 100644 --- a/dev/tests/integration/testsuite/Mage/Backend/Block/System/Config/FormTest.php +++ b/dev/tests/integration/testsuite/Mage/Backend/Block/System/Config/FormTest.php @@ -129,7 +129,7 @@ class Mage_Backend_Block_System_Config_FormTest extends PHPUnit_Framework_TestCa */ public function initFieldsInheritCheckboxDataProvider() { - Magento_Test_Bootstrap::getInstance()->reinitialize(array( + Magento_Test_Helper_Bootstrap::getInstance()->reinitialize(array( 'global_ban_use_cache' => true, )); Mage::getConfig()->setCurrentAreaCode('adminhtml'); diff --git a/dev/tests/integration/testsuite/Mage/Backend/Block/Widget/ContainerTest.php b/dev/tests/integration/testsuite/Mage/Backend/Block/Widget/ContainerTest.php new file mode 100644 index 0000000000000000000000000000000000000000..beef5aa82b3fae8e3c988b602b1989daa29875d4 --- /dev/null +++ b/dev/tests/integration/testsuite/Mage/Backend/Block/Widget/ContainerTest.php @@ -0,0 +1,36 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +class Mage_Backend_Block_Widget_ContainerTest extends PHPUnit_Framework_TestCase +{ + public function testPseudoConstruct() + { + /** @var $block Mage_Backend_Block_Widget_Container */ + $block = Mage::app()->getLayout()->createBlock('Mage_Backend_Block_Widget_Container', '', array( + Mage_Backend_Block_Widget_Container::PARAM_CONTROLLER => 'one', + Mage_Backend_Block_Widget_Container::PARAM_HEADER_TEXT => 'two', + )); + $this->assertStringEndsWith('one', $block->getHeaderCssClass()); + $this->assertContains('two', $block->getHeaderText()); + } +} diff --git a/dev/tests/integration/testsuite/Mage/Backend/Block/Widget/Grid/ContainerTest.php b/dev/tests/integration/testsuite/Mage/Backend/Block/Widget/Grid/ContainerTest.php new file mode 100644 index 0000000000000000000000000000000000000000..f4b681b657f7f453593ee89b16456b21eac1d69e --- /dev/null +++ b/dev/tests/integration/testsuite/Mage/Backend/Block/Widget/Grid/ContainerTest.php @@ -0,0 +1,42 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +class Mage_Backend_Block_Widget_Grid_ContainerTest extends PHPUnit_Framework_TestCase +{ + public function testPseudoConstruct() + { + /** @var $block Mage_Backend_Block_Widget_Grid_Container */ + $block = Mage::app()->getLayout()->createBlock('Mage_Backend_Block_Widget_Grid_Container', '', array( + Mage_Backend_Block_Widget_Container::PARAM_CONTROLLER => 'widget', + Mage_Backend_Block_Widget_Container::PARAM_HEADER_TEXT => 'two', + Mage_Backend_Block_Widget_Grid_Container::PARAM_BLOCK_GROUP => 'Mage_Backend', + Mage_Backend_Block_Widget_Grid_Container::PARAM_BUTTON_NEW => 'four', + Mage_Backend_Block_Widget_Grid_Container::PARAM_BUTTON_BACK => 'five', + )); + $this->assertStringEndsWith('widget', $block->getHeaderCssClass()); + $this->assertContains('two', $block->getHeaderText()); + $this->assertInstanceOf('Mage_Backend_Block_Widget_Grid', $block->getChildBlock('grid')); + $this->assertEquals('four', $block->getAddButtonLabel()); + $this->assertEquals('five', $block->getBackButtonLabel()); + } +} diff --git a/dev/tests/integration/testsuite/Mage/Backend/Block/Widget/Grid/MassactionTest.php b/dev/tests/integration/testsuite/Mage/Backend/Block/Widget/Grid/MassactionTest.php index 11553a173b0645b282810cc9ced1593d86f633f2..e6beca91d0cd55a893424178d8428640f0184685 100644 --- a/dev/tests/integration/testsuite/Mage/Backend/Block/Widget/Grid/MassactionTest.php +++ b/dev/tests/integration/testsuite/Mage/Backend/Block/Widget/Grid/MassactionTest.php @@ -57,7 +57,7 @@ class Mage_Backend_Block_Widget_Grid_MassactionTest extends PHPUnit_Framework_Te */ protected function _setFixtureTheme() { - Magento_Test_Bootstrap::getInstance()->reinitialize(array( + Magento_Test_Helper_Bootstrap::getInstance()->reinitialize(array( Mage_Core_Model_App::INIT_OPTION_SCOPE_TYPE => 'store', Mage_Core_Model_App::INIT_OPTION_SCOPE_CODE => 'admin', Mage_Core_Model_App::INIT_OPTION_DIRS => array( diff --git a/dev/tests/integration/testsuite/Mage/Backend/Utility/Controller.php b/dev/tests/integration/testsuite/Mage/Backend/Utility/Controller.php index e9faf4626c781be84c531819fccc15a3b03ed45e..ccd2e1b8b04abb1b27b7f4959ca1704c53073fc2 100644 --- a/dev/tests/integration/testsuite/Mage/Backend/Utility/Controller.php +++ b/dev/tests/integration/testsuite/Mage/Backend/Utility/Controller.php @@ -46,7 +46,6 @@ class Mage_Backend_Utility_Controller extends Magento_Test_TestCase_ControllerAb { parent::setUp(); - Mage::app()->getConfig()->loadDiConfiguration(Mage_Core_Model_App_Area::AREA_ADMINHTML); Mage::getSingleton('Mage_Backend_Model_Url')->turnOffSecretKey(); $this->_auth = Mage::getModel('Mage_Backend_Model_Auth'); @@ -64,4 +63,17 @@ class Mage_Backend_Utility_Controller extends Magento_Test_TestCase_ControllerAb parent::tearDown(); } + + /** + * Utilize backend session model by default + * + * @param PHPUnit_Framework_Constraint $constraint + * @param string|null $messageType + * @param string $sessionModel + */ + public function assertSessionMessages( + PHPUnit_Framework_Constraint $constraint, $messageType = null, $sessionModel = 'Mage_Backend_Model_Session' + ) { + parent::assertSessionMessages($constraint, $messageType, $sessionModel); + } } diff --git a/dev/tests/integration/testsuite/Mage/Captcha/Model/ObserverTest.php b/dev/tests/integration/testsuite/Mage/Captcha/Model/ObserverTest.php index 5ab09150d0c042b2919a22c6f4acac1abd0ed47b..514fbb97db64adbc5126bbd2568c23b4b6598c50 100644 --- a/dev/tests/integration/testsuite/Mage/Captcha/Model/ObserverTest.php +++ b/dev/tests/integration/testsuite/Mage/Captcha/Model/ObserverTest.php @@ -37,7 +37,7 @@ class Mage_Captcha_Model_ObserverTest extends Magento_Test_TestCase_ControllerAb */ public function testBackendLoginActionWithInvalidCaptchaReturnsError() { - if (Magento_Test_Bootstrap::getInstance()->getDbVendorName() != 'mysql') { + if (Magento_Test_Helper_Bootstrap::getInstance()->getDbVendorName() != 'mysql') { $this->markTestIncomplete('MAGETWO-1662'); } Mage::getSingleton('Mage_Backend_Model_Url')->turnOffSecretKey(); @@ -66,7 +66,7 @@ class Mage_Captcha_Model_ObserverTest extends Magento_Test_TestCase_ControllerAb */ public function testCaptchaIsRequiredAfterFailedLoginAttempts() { - if (Magento_Test_Bootstrap::getInstance()->getDbVendorName() != 'mysql') { + if (Magento_Test_Helper_Bootstrap::getInstance()->getDbVendorName() != 'mysql') { $this->markTestIncomplete('MAGETWO-1662'); } Mage::app()->setCurrentStore(0); @@ -115,8 +115,8 @@ class Mage_Captcha_Model_ObserverTest extends Magento_Test_TestCase_ControllerAb Mage::getSingleton('Mage_Backend_Model_Url')->turnOffSecretKey(); $this->getRequest()->setPost(array('email' => 'dummy@dummy.com', 'captcha' => '1234')); $this->dispatch('backend/admin/auth/forgotpassword'); - $errorMessage = Mage::getSingleton('Mage_Backend_Model_Session')->getMessages(false)->getErrors(); - $this->assertCount(1, $errorMessage); - $this->assertEquals('Incorrect CAPTCHA.', current($errorMessage)->getCode()); + $this->assertSessionMessages( + $this->equalTo(array('Incorrect CAPTCHA.')), Mage_Core_Model_Message::ERROR, 'Mage_Backend_Model_Session' + ); } } diff --git a/dev/tests/integration/testsuite/Mage/Catalog/Block/Product/AbstractTest.php b/dev/tests/integration/testsuite/Mage/Catalog/Block/Product/AbstractTest.php index 0c7e873669527490f11d110a9baad054fd2410e4..190b77293f845da604c65ffe955f0e7f62dd78db 100644 --- a/dev/tests/integration/testsuite/Mage/Catalog/Block/Product/AbstractTest.php +++ b/dev/tests/integration/testsuite/Mage/Catalog/Block/Product/AbstractTest.php @@ -62,6 +62,7 @@ class Mage_Catalog_Block_Product_AbstractTest extends PHPUnit_Framework_TestCase self::$_isStubClass = true; } + Mage::getDesign()->setDefaultDesignTheme(); $this->_block = Mage::app()->getLayout()->createBlock(self::STUB_CLASS); $this->_product = Mage::getModel('Mage_Catalog_Model_Product'); $this->_product->load(1); diff --git a/dev/tests/integration/testsuite/Mage/Catalog/Block/Product/List/CrosssellTest.php b/dev/tests/integration/testsuite/Mage/Catalog/Block/Product/List/CrosssellTest.php index c8f9330579743fd3f187fc6e115dd34cd51329dc..f2c8e7eb072b2598bb6dccd86c23530545f1ef0f 100644 --- a/dev/tests/integration/testsuite/Mage/Catalog/Block/Product/List/CrosssellTest.php +++ b/dev/tests/integration/testsuite/Mage/Catalog/Block/Product/List/CrosssellTest.php @@ -29,6 +29,7 @@ * Test class for Mage_Catalog_Block_Product_List_Crosssell. * * @magentoDataFixture Mage/Catalog/_files/products_crosssell.php + * @magentoDataFixture Mage/Core/_files/frontend_default_theme.php */ class Mage_Catalog_Block_Product_List_CrosssellTest extends PHPUnit_Framework_TestCase { diff --git a/dev/tests/integration/testsuite/Mage/Catalog/Block/Product/List/RelatedTest.php b/dev/tests/integration/testsuite/Mage/Catalog/Block/Product/List/RelatedTest.php index a320d523cc3e0519d4f54b6bb7009a8e9f6c4f35..88e9950ab32e46a965b4b30032171e1f8b4ac16c 100644 --- a/dev/tests/integration/testsuite/Mage/Catalog/Block/Product/List/RelatedTest.php +++ b/dev/tests/integration/testsuite/Mage/Catalog/Block/Product/List/RelatedTest.php @@ -29,6 +29,7 @@ * Test class for Mage_Catalog_Block_Product_List_Related. * * @magentoDataFixture Mage/Catalog/_files/products_related.php + * @magentoDataFixture Mage/Core/_files/frontend_default_theme.php */ class Mage_Catalog_Block_Product_List_RelatedTest extends PHPUnit_Framework_TestCase { diff --git a/dev/tests/integration/testsuite/Mage/Catalog/Block/Product/NewTest.php b/dev/tests/integration/testsuite/Mage/Catalog/Block/Product/NewTest.php index 94fc866ebe62636860f023ec3c44cb93063d5c63..aedde4b851a4660ac01a211cf9cd4d4fe5d4c389 100644 --- a/dev/tests/integration/testsuite/Mage/Catalog/Block/Product/NewTest.php +++ b/dev/tests/integration/testsuite/Mage/Catalog/Block/Product/NewTest.php @@ -29,6 +29,7 @@ * Test class for Mage_Catalog_Block_Product_New. * * @magentoDataFixture Mage/Catalog/_files/products_new.php + * @magentoDataFixture Mage/Core/_files/frontend_default_theme.php */ class Mage_Catalog_Block_Product_NewTest extends PHPUnit_Framework_TestCase { @@ -61,7 +62,15 @@ class Mage_Catalog_Block_Product_NewTest extends PHPUnit_Framework_TestCase $this->assertEquals(Mage::app()->getStore()->getId(), $info[1]); $this->assertSame(2, array_shift($keys)); - $this->assertEquals(Mage_Core_Model_Theme::CACHE_TAG_NO_THEME, $info[2]); + + $themeModel = Mage::getDesign()->getDesignTheme(); + if (!$themeModel->getId()) { + $themeCacheKey = Mage_Core_Model_Theme::CACHE_TAG_NO_THEME . $themeModel->getThemePath(); + } else { + $themeCacheKey = $themeModel->getId() . $themeModel->getThemePath(); + } + + $this->assertEquals($themeCacheKey, $info[2]); $this->assertSame(3, array_shift($keys)); $this->assertEquals(Mage::getSingleton('Mage_Customer_Model_Session')->getCustomerGroupId(), $info[3]); diff --git a/dev/tests/integration/testsuite/Mage/Catalog/Helper/Product/ViewTest.php b/dev/tests/integration/testsuite/Mage/Catalog/Helper/Product/ViewTest.php index f2fcb87183252565bf6e5913ea29076175a15eef..d4ccf225f6a13e535381fe7dd7a41b9111cea446 100644 --- a/dev/tests/integration/testsuite/Mage/Catalog/Helper/Product/ViewTest.php +++ b/dev/tests/integration/testsuite/Mage/Catalog/Helper/Product/ViewTest.php @@ -41,6 +41,7 @@ class Mage_Catalog_Helper_Product_ViewTest extends PHPUnit_Framework_TestCase protected function setUp() { + Mage::getDesign()->setDefaultDesignTheme(); $this->_helper = Mage::helper('Mage_Catalog_Helper_Product_View'); $request = new Magento_Test_Request(); $request->setRouteName('catalog') @@ -100,7 +101,6 @@ class Mage_Catalog_Helper_Product_ViewTest extends PHPUnit_Framework_TestCase } /** - * @magentoDataFixture Mage/Catalog/_files/multiple_products.php * @expectedException Mage_Core_Exception * @magentoAppIsolation enabled */ @@ -118,6 +118,7 @@ class Mage_Catalog_Helper_Product_ViewTest extends PHPUnit_Framework_TestCase } /** + * @magentoAppIsolation enabled * @expectedException Mage_Core_Exception */ public function testPrepareAndRenderWrongProduct() diff --git a/dev/tests/integration/testsuite/Mage/Catalog/Model/Product/ImageTest.php b/dev/tests/integration/testsuite/Mage/Catalog/Model/Product/ImageTest.php index b58816c861e899c72d88b5c6602eb433bed31434..2daac2eb86fe9483cdefaa5dd613fe576a55d584 100644 --- a/dev/tests/integration/testsuite/Mage/Catalog/Model/Product/ImageTest.php +++ b/dev/tests/integration/testsuite/Mage/Catalog/Model/Product/ImageTest.php @@ -57,7 +57,7 @@ class Mage_Catalog_Model_Product_ImageTest extends PHPUnit_Framework_TestCase public function testGetUrlPlaceholder($model) { $this->assertStringMatchesFormat( - 'http://localhost/pub/media/theme/frontend/%s/Mage_Catalog/images/product/placeholder/image.jpg', + 'http://localhost/pub/media/theme/static/frontend/%s/Mage_Catalog/images/product/placeholder/image.jpg', $model->getUrl() ); } diff --git a/dev/tests/integration/testsuite/Mage/Checkout/Block/Cart/Item/RendererTest.php b/dev/tests/integration/testsuite/Mage/Checkout/Block/Cart/Item/RendererTest.php index 910a21cba7a7a4e8c4b3985c0cf11505f099dad7..8490eb9f5c8c82a58bfb03800b0c8d3bb97e78c5 100644 --- a/dev/tests/integration/testsuite/Mage/Checkout/Block/Cart/Item/RendererTest.php +++ b/dev/tests/integration/testsuite/Mage/Checkout/Block/Cart/Item/RendererTest.php @@ -27,6 +27,7 @@ /** * @magentoDataFixture Mage/Catalog/_files/product_with_image.php + * @magentoDataFixture Mage/Core/_files/frontend_default_theme.php */ class Mage_Checkout_Block_Cart_Item_RendererTest extends PHPUnit_Framework_TestCase { diff --git a/dev/tests/integration/testsuite/Mage/Checkout/Model/Cart/ApiTest.php b/dev/tests/integration/testsuite/Mage/Checkout/Model/Cart/ApiTest.php index 52871420909974c753e372477ac4c01555e4f16a..4db0ab8eae4aefe8d5318d61bbb77ab365c98dbb 100644 --- a/dev/tests/integration/testsuite/Mage/Checkout/Model/Cart/ApiTest.php +++ b/dev/tests/integration/testsuite/Mage/Checkout/Model/Cart/ApiTest.php @@ -367,8 +367,8 @@ class Mage_Checkout_Model_Cart_ApiTest extends PHPUnit_Framework_TestCase */ public function testTotals() { - if (Magento_Test_Bootstrap::getInstance()->getDbVendorName() != 'mysql') { - $this->markTestIncomplete('Legacy API is expected to support MySQL only.'); + if (Magento_Test_Helper_Bootstrap::getInstance()->getDbVendorName() != 'mysql') { + $this->markTestSkipped('Legacy API is expected to support MySQL only.'); } /** @var Mage_Checkout_Model_Cart $quote */ $quote = $this->_getQuoteFixture(); diff --git a/dev/tests/integration/testsuite/Mage/Checkout/controllers/CartControllerTest.php b/dev/tests/integration/testsuite/Mage/Checkout/controllers/CartControllerTest.php index ce0d3ed2937cac852f2134af1d952efed1900721..3b3cf2457ddb2a15efcb807f5e0202d2717fe376 100644 --- a/dev/tests/integration/testsuite/Mage/Checkout/controllers/CartControllerTest.php +++ b/dev/tests/integration/testsuite/Mage/Checkout/controllers/CartControllerTest.php @@ -46,7 +46,7 @@ class Mage_Checkout_CartControllerTest extends Magento_Test_TestCase_ControllerA $this->dispatch('checkout/cart/configure/id/' . $quoteItem->getId()); $response = $this->getResponse(); - $this->assertCount(0, $session->getMessages()->getErrors(), 'Response for simple product contains errors'); + $this->assertSessionMessages($this->isEmpty(), Mage_Core_Model_Message::ERROR, 'Mage_Checkout_Model_Session'); $this->assertSelectCount('button.button.btn-cart[type="button"][title="Update Cart"]', 1, $response->getBody(), 'Response for simple product doesn\'t contain "Update Cart" button'); @@ -68,10 +68,7 @@ class Mage_Checkout_CartControllerTest extends Magento_Test_TestCase_ControllerA $this->dispatch('checkout/cart/configure/id/' . $quoteItem->getId()); $response = $this->getResponse(); - /** @var $session Mage_Checkout_Model_Session */ - $session = Mage::getModel('Mage_Checkout_Model_Session'); - $this->assertCount(0, $session->getMessages()->getErrors(), - 'Response for simple product with custom option contains errors'); + $this->assertSessionMessages($this->isEmpty(), Mage_Core_Model_Message::ERROR, 'Mage_Checkout_Model_Session'); $this->assertSelectCount('button.button.btn-cart[type="button"][title="Update Cart"]', 1, $response->getBody(), 'Response for simple product with custom option doesn\'t contain "Update Cart" button'); @@ -96,8 +93,7 @@ class Mage_Checkout_CartControllerTest extends Magento_Test_TestCase_ControllerA $this->dispatch('checkout/cart/configure/id/' . $quoteItem->getId()); $response = $this->getResponse(); - $this->assertCount(0, $session->getMessages()->getErrors(), - 'Response for bundle product contains errors'); + $this->assertSessionMessages($this->isEmpty(), Mage_Core_Model_Message::ERROR, 'Mage_Checkout_Model_Session'); $this->assertSelectCount('button.button.btn-cart[type="button"][title="Update Cart"]', 1, $response->getBody(), 'Response for bundle product doesn\'t contain "Update Cart" button'); @@ -119,8 +115,7 @@ class Mage_Checkout_CartControllerTest extends Magento_Test_TestCase_ControllerA $this->dispatch('checkout/cart/configure/id/' . $quoteItem->getId()); $response = $this->getResponse(); - $this->assertCount(0, $session->getMessages()->getErrors(), - 'Response for downloadable product contains errors'); + $this->assertSessionMessages($this->isEmpty(), Mage_Core_Model_Message::ERROR, 'Mage_Checkout_Model_Session'); $this->assertSelectCount('button.button.btn-cart[type="button"][title="Update Cart"]', 1, $response->getBody(), 'Response for downloadable product doesn\'t contain "Update Cart" button'); @@ -145,8 +140,7 @@ class Mage_Checkout_CartControllerTest extends Magento_Test_TestCase_ControllerA $this->dispatch('checkout/cart/configure/id/' . $quoteItem->getId()); $response = $this->getResponse(); - $this->assertCount(0, $session->getMessages()->getErrors(), - 'Response for configurable product contains errors'); + $this->assertSessionMessages($this->isEmpty(), Mage_Core_Model_Message::ERROR, 'Mage_Checkout_Model_Session'); $this->assertSelectCount('button.button.btn-cart[type="button"][title="Update Cart"]', 1, $response->getBody(), 'Response for configurable product doesn\'t contain "Update Cart" button'); diff --git a/dev/tests/integration/testsuite/Mage/Cms/Model/Wysiwyg/Images/StorageTest.php b/dev/tests/integration/testsuite/Mage/Cms/Model/Wysiwyg/Images/StorageTest.php index 0b48561e6aef7a3effad27501857e5e12d0dc0cd..eaab448938390b4a4cdebf92b7d8437c1a7b7709 100644 --- a/dev/tests/integration/testsuite/Mage/Cms/Model/Wysiwyg/Images/StorageTest.php +++ b/dev/tests/integration/testsuite/Mage/Cms/Model/Wysiwyg/Images/StorageTest.php @@ -59,7 +59,7 @@ class Mage_Cms_Model_Wysiwyg_Images_StorageTest extends PHPUnit_Framework_TestCa $this->assertInstanceOf('Varien_Object', $item); $this->assertStringEndsWith('/1.swf', $item->getUrl()); $this->assertStringMatchesFormat( - 'http://%s/media/theme/adminhtml/%s/%s/%s/Mage_Cms/images/placeholder_thumbnail.jpg', + 'http://%s/media/theme/static/adminhtml/%s/%s/%s/Mage_Cms/images/placeholder_thumbnail.jpg', $item->getThumbUrl() ); return; @@ -71,7 +71,7 @@ class Mage_Cms_Model_Wysiwyg_Images_StorageTest extends PHPUnit_Framework_TestCa $filesystem = new Magento_Filesystem(new Magento_Filesystem_Adapter_Local); $model = new Mage_Cms_Model_Wysiwyg_Images_Storage($filesystem); $this->assertStringStartsWith( - realpath(Magento_Test_Bootstrap::getInstance()->getInstallDir()), + realpath(Magento_Test_Helper_Bootstrap::getInstance()->getAppInstallDir()), $model->getThumbsPath() ); } diff --git a/dev/tests/integration/testsuite/Mage/Core/Block/AbstractTest.php b/dev/tests/integration/testsuite/Mage/Core/Block/AbstractTest.php index 43508972b1fd9ac25fc037319707ed040e8a68c5..e0afd191df77f3eb8f5b124ca2a4e0a1872041d5 100644 --- a/dev/tests/integration/testsuite/Mage/Core/Block/AbstractTest.php +++ b/dev/tests/integration/testsuite/Mage/Core/Block/AbstractTest.php @@ -78,6 +78,30 @@ class Mage_Core_Block_AbstractTest extends PHPUnit_Framework_TestCase $this->_layout = null; } + /** + * Checks, that not existing image in CSS not affected own publication + * + * @magentoAppIsolation enabled + */ + public function testCssWithWrongImage() + { + $dirPath = __DIR__ . DIRECTORY_SEPARATOR . '_files'; + /** @var $dirs Mage_Core_Model_Dir */ + $dirs = Mage::getObjectManager()->get('Mage_Core_Model_Dir'); + + $prepareFileName = new ReflectionMethod($dirs, '_setDir'); + $prepareFileName->setAccessible(true); + $prepareFileName->invoke($dirs, Mage_Core_Model_Dir::THEMES, $dirPath); + + $cssUrl = $this->_block->getViewFileUrl('css/wrong.css', array( + 'area' => 'frontend', + 'package' => 'default', + 'theme' => 'demo', + 'locale' => 'en_US' + )); + $this->assertStringMatchesFormat('%s/css/wrong.css', $cssUrl); + } + public function testGetRequest() { $this->assertInstanceOf('Mage_Core_Controller_Request_Http', $this->_block->getRequest()); @@ -487,7 +511,8 @@ class Mage_Core_Block_AbstractTest extends PHPUnit_Framework_TestCase */ public function testGetViewUrl() { - $this->assertStringStartsWith('http://localhost/pub/media/theme/frontend/', $this->_block->getViewFileUrl()); + $this->assertStringStartsWith('http://localhost/pub/media/theme/static/frontend/', + $this->_block->getViewFileUrl()); $this->assertStringEndsWith('css/styles.css', $this->_block->getViewFileUrl('css/styles.css')); /** diff --git a/dev/tests/integration/testsuite/Mage/Core/Block/_files/frontend/default/demo/css/wrong.css b/dev/tests/integration/testsuite/Mage/Core/Block/_files/frontend/default/demo/css/wrong.css new file mode 100644 index 0000000000000000000000000000000000000000..9bfacf874527791a8c6f217fed23694d2448a518 --- /dev/null +++ b/dev/tests/integration/testsuite/Mage/Core/Block/_files/frontend/default/demo/css/wrong.css @@ -0,0 +1,26 @@ +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category design + * @package default_demo + * @subpackage integration_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ +.test {background: url(../images/nonexistent_file.png);} diff --git a/dev/tests/integration/testsuite/Mage/Core/Controller/Varien/ActionTest.php b/dev/tests/integration/testsuite/Mage/Core/Controller/Varien/ActionTest.php index 0418d124ad5b6fab5fdd4eb2155d88e0067efc87..1080fb681f7693552cfdef4062078f8e633e2b9e 100644 --- a/dev/tests/integration/testsuite/Mage/Core/Controller/Varien/ActionTest.php +++ b/dev/tests/integration/testsuite/Mage/Core/Controller/Varien/ActionTest.php @@ -34,6 +34,8 @@ class Mage_Core_Controller_Varien_ActionTest extends PHPUnit_Framework_TestCase protected function setUp() { + Mage::getDesign()->setArea(Mage_Core_Model_App_Area::AREA_FRONTEND)->setDefaultDesignTheme(); + $this->_model = $this->getMockForAbstractClass( 'Mage_Core_Controller_Varien_Action', array( @@ -156,6 +158,9 @@ class Mage_Core_Controller_Varien_ActionTest extends PHPUnit_Framework_TestCase } } + /** + * @return array + */ public function addActionLayoutHandlesDataProvider() { return array( @@ -191,6 +196,9 @@ class Mage_Core_Controller_Varien_ActionTest extends PHPUnit_Framework_TestCase } } + /** + * @return array + */ public function addActionLayoutHandlesInheritedDataProvider() { return array( @@ -307,6 +315,9 @@ class Mage_Core_Controller_Varien_ActionTest extends PHPUnit_Framework_TestCase } } + /** + * @return array + */ public function controllerAreaDesignDataProvider() { return array( @@ -331,6 +342,9 @@ class Mage_Core_Controller_Varien_ActionTest extends PHPUnit_Framework_TestCase $this->assertFalse($caughtException, $message); } + /** + * @return array + */ public function controllerAreaSetDataProvider() { return array( diff --git a/dev/tests/integration/testsuite/Mage/Core/Controller/Varien/FrontTest.php b/dev/tests/integration/testsuite/Mage/Core/Controller/Varien/FrontTest.php index 088dd339aab662292083efb84cad5c6754fb8b5b..72099eea1818d6274c6fdb4d4530eefbbe291de2 100644 --- a/dev/tests/integration/testsuite/Mage/Core/Controller/Varien/FrontTest.php +++ b/dev/tests/integration/testsuite/Mage/Core/Controller/Varien/FrontTest.php @@ -60,7 +60,7 @@ class Mage_Core_Controller_Varien_FrontTest extends PHPUnit_Framework_TestCase public function testGetResponse() { - if (!Magento_Test_Bootstrap::canTestHeaders()) { + if (!Magento_Test_Helper_Bootstrap::canTestHeaders()) { $this->markTestSkipped('Can\'t test get response without sending headers'); } $this->assertInstanceOf('Mage_Core_Controller_Response_Http', $this->_model->getResponse()); @@ -92,7 +92,7 @@ class Mage_Core_Controller_Varien_FrontTest extends PHPUnit_Framework_TestCase public function testDispatch() { - if (!Magento_Test_Bootstrap::canTestHeaders()) { + if (!Magento_Test_Helper_Bootstrap::canTestHeaders()) { $this->markTestSkipped('Cant\'t test dispatch process without sending headers'); } $_SERVER['HTTP_HOST'] = 'localhost'; diff --git a/dev/tests/integration/testsuite/Mage/Core/Controller/Varien/Router/BaseTest.php b/dev/tests/integration/testsuite/Mage/Core/Controller/Varien/Router/BaseTest.php index e3606efa0b84f74c17f02f1b54534def0b7fcce0..96e9df81db8c8a1c05acc507505ddc621ed9464d 100644 --- a/dev/tests/integration/testsuite/Mage/Core/Controller/Varien/Router/BaseTest.php +++ b/dev/tests/integration/testsuite/Mage/Core/Controller/Varien/Router/BaseTest.php @@ -67,7 +67,7 @@ class Mage_Core_Controller_Varien_Router_BaseTest extends PHPUnit_Framework_Test public function testMatch() { - if (!Magento_Test_Bootstrap::canTestHeaders()) { + if (!Magento_Test_Helper_Bootstrap::canTestHeaders()) { $this->markTestSkipped('Can\'t test get match without sending headers'); } diff --git a/dev/tests/integration/testsuite/Mage/Core/Model/AppTest.php b/dev/tests/integration/testsuite/Mage/Core/Model/AppTest.php index ffa98abf3074625c50b1aaf896d4fdd0db9ce5e1..a0b5c2a11c1d853088c3dde44cac4a8313195c9a 100644 --- a/dev/tests/integration/testsuite/Mage/Core/Model/AppTest.php +++ b/dev/tests/integration/testsuite/Mage/Core/Model/AppTest.php @@ -67,7 +67,7 @@ class Mage_Core_Model_AppTest extends PHPUnit_Framework_TestCase public function testInit() { $this->assertNull($this->_model->getConfig()); - $this->_model->init(Magento_Test_Bootstrap::getInstance()->getInitParams()); + $this->_model->init(Magento_Test_Helper_Bootstrap::getInstance()->getAppInitParams()); $this->assertInstanceOf('Mage_Core_Model_Config', $this->_model->getConfig()); $this->assertNotEmpty($this->_model->getConfig()->getNode()); $this->assertContains(Mage_Core_Model_App::ADMIN_STORE_ID, array_keys($this->_model->getStores(true))); @@ -86,7 +86,7 @@ class Mage_Core_Model_AppTest extends PHPUnit_Framework_TestCase public function testBaseInit() { $this->assertNull($this->_model->getConfig()); - $this->_model->baseInit(Magento_Test_Bootstrap::getInstance()->getInitParams()); + $this->_model->baseInit(Magento_Test_Helper_Bootstrap::getInstance()->getAppInitParams()); $this->assertInstanceOf('Mage_Core_Model_Config', $this->_model->getConfig()); $this->assertNotEmpty($this->_model->getConfig()->getNode()); } @@ -96,13 +96,13 @@ class Mage_Core_Model_AppTest extends PHPUnit_Framework_TestCase */ public function testRun() { - if (!Magento_Test_Bootstrap::canTestHeaders()) { + if (!Magento_Test_Helper_Bootstrap::canTestHeaders()) { $this->markTestSkipped('Can\'t test application run without sending headers'); } $request = new Magento_Test_Request(); $request->setRequestUri('core/index/index'); $this->_mageModel->setRequest($request); - $this->_mageModel->run(Magento_Test_Bootstrap::getInstance()->getInitParams()); + $this->_mageModel->run(Magento_Test_Helper_Bootstrap::getInstance()->getAppInitParams()); $this->assertTrue($request->isDispatched()); } @@ -336,7 +336,7 @@ class Mage_Core_Model_AppTest extends PHPUnit_Framework_TestCase public function testSetGetResponse() { - if (!Magento_Test_Bootstrap::canTestHeaders()) { + if (!Magento_Test_Helper_Bootstrap::canTestHeaders()) { $this->markTestSkipped('Can\'t test get response without sending headers'); } $this->assertInstanceOf('Mage_Core_Controller_Response_Http', $this->_model->getResponse()); @@ -384,17 +384,4 @@ class Mage_Core_Model_AppTest extends PHPUnit_Framework_TestCase $this->assertInternalType('array', $groups); $this->assertGreaterThanOrEqual(1, count($groups)); } - - /** - * @magentoConfigFixture global/di/preferences/Mage_Core_Model_Url Mage_Backend_Model_Url - * @magentoConfigFixture frontend/di/preferences/Mage_Core_Model_Url Mage_DesignEditor_Model_Url_NavigationMode - */ - public function testLoadDiConfiguration() - { - $objectManager = Mage::getObjectManager(); - $this->_model = $objectManager->get('Mage_Core_Model_App'); - $this->_model->getConfig()->loadDiConfiguration('frontend'); - $testInstance = $objectManager->create('Mage_Backend_Block_Widget_Grid_ColumnSet'); - $this->assertAttributeInstanceOf('Mage_DesignEditor_Model_Url_NavigationMode', '_urlBuilder', $testInstance); - } } diff --git a/dev/tests/integration/testsuite/Mage/Core/Model/Config/DataTest.php b/dev/tests/integration/testsuite/Mage/Core/Model/Config/DataTest.php index e6c19c24ca0458f4431ec667e8c5f88f2108f979..9cc61eab1cee8726921b5eb937844a395181d225 100644 --- a/dev/tests/integration/testsuite/Mage/Core/Model/Config/DataTest.php +++ b/dev/tests/integration/testsuite/Mage/Core/Model/Config/DataTest.php @@ -58,7 +58,7 @@ class Mage_Core_Model_Config_DataTest extends PHPUnit_Framework_TestCase protected static function _refreshConfiguration() { Mage::app()->cleanCache(array(Mage_Core_Model_Config::CACHE_TAG)); - Magento_Test_Bootstrap::getInstance()->reinitialize(); + Magento_Test_Helper_Bootstrap::getInstance()->reinitialize(); } protected function setUp() diff --git a/dev/tests/integration/testsuite/Mage/Core/Model/ConfigTest.php b/dev/tests/integration/testsuite/Mage/Core/Model/ConfigTest.php index 27a6830eba6d25e173c2787a252338fc537e4e88..fe85a66c8ee963e90d31e45511a345115d5f0a64 100644 --- a/dev/tests/integration/testsuite/Mage/Core/Model/ConfigTest.php +++ b/dev/tests/integration/testsuite/Mage/Core/Model/ConfigTest.php @@ -265,7 +265,7 @@ class Mage_Core_Model_ConfigTest extends PHPUnit_Framework_TestCase public function testReinitBaseConfig() { - $options = Magento_Test_Bootstrap::getInstance()->getInitParams(); + $options = Magento_Test_Helper_Bootstrap::getInstance()->getAppInitParams(); $options[Mage_Core_Model_Config::INIT_OPTION_EXTRA_DATA] = '<config><test>old_value</test></config>'; $objectManager = new Magento_Test_ObjectManager(); @@ -522,7 +522,7 @@ class Mage_Core_Model_ConfigTest extends PHPUnit_Framework_TestCase */ protected function _createModelWithApp(array $appOptions, Magento_Test_ObjectManager $objectManager = null) { - $baseOptions = Magento_Test_Bootstrap::getInstance()->getInitParams(); + $baseOptions = Magento_Test_Helper_Bootstrap::getInstance()->getAppInitParams(); $appOptions = array_replace_recursive($baseOptions, $appOptions); $objectManager = $objectManager ?: new Magento_Test_ObjectManager(); /** @var $app Mage_Core_Model_App */ diff --git a/dev/tests/integration/testsuite/Mage/Core/Model/Design/FallbackTest.php b/dev/tests/integration/testsuite/Mage/Core/Model/Design/FallbackTest.php index 0970a81696f24fa885c5807d21c485b207aa56f8..96f3153e80bacdd14b55172d8217f011c0b56198 100644 --- a/dev/tests/integration/testsuite/Mage/Core/Model/Design/FallbackTest.php +++ b/dev/tests/integration/testsuite/Mage/Core/Model/Design/FallbackTest.php @@ -50,9 +50,13 @@ class Mage_Core_Model_Design_FallbackTest extends PHPUnit_Framework_TestCase public function testGetters() { $theme = 't'; - $themeModel = $this->getMock('Mage_Core_Model_Theme', array('getThemeCode'), array(), '', false); + $themeModel = $this->getMock('Mage_Core_Model_Theme', array('getId', 'getThemePath'), array(), '', false); $themeModel->expects($this->any()) - ->method('getThemeCode') + ->method('getId') + ->will($this->returnValue(false)); + + $themeModel->expects($this->any()) + ->method('getThemePath') ->will($this->returnValue($theme)); $dirs = new Mage_Core_Model_Dir(__DIR__); @@ -321,12 +325,12 @@ class Mage_Core_Model_Design_FallbackTest extends PHPUnit_Framework_TestCase 'general modular skin file' => array( 'fixture_script.js', 'frontend', 'package/custom_theme2', 'en_US', 'Fixture_Module', - "%s/frontend/package/custom_theme2/Fixture_Module/fixture_script.js", + "%s/frontend/package/custom_theme2/fixture_script.js", ), 'localized modular skin file' => array( 'fixture_script.js', 'frontend', 'package/custom_theme2', 'ru_RU', 'Fixture_Module', - "%s/frontend/package/custom_theme2/locale/ru_RU/Fixture_Module/fixture_script.js", + "%s/frontend/package/custom_theme2/locale/ru_RU/fixture_script.js", ), ); } diff --git a/dev/tests/integration/testsuite/Mage/Core/Model/Design/PackageFallbackTest.php b/dev/tests/integration/testsuite/Mage/Core/Model/Design/PackageFallbackTest.php index 09099bcc2ee2cd7b975d82cf82165924728d9954..4658bd81a9104aebd7a558bde38d7d7025ac341d 100644 --- a/dev/tests/integration/testsuite/Mage/Core/Model/Design/PackageFallbackTest.php +++ b/dev/tests/integration/testsuite/Mage/Core/Model/Design/PackageFallbackTest.php @@ -38,7 +38,7 @@ class Mage_Core_Model_Design_PackageFallbackTest extends PHPUnit_Framework_TestC protected function setUp() { - Magento_Test_Bootstrap::getInstance()->reinitialize(array( + Magento_Test_Helper_Bootstrap::getInstance()->reinitialize(array( Mage_Core_Model_App::INIT_OPTION_DIRS => array( Mage_Core_Model_Dir::THEMES => dirname(__DIR__) . '/_files/design' ) diff --git a/dev/tests/integration/testsuite/Mage/Core/Model/Design/PackageMergingTest.php b/dev/tests/integration/testsuite/Mage/Core/Model/Design/PackageMergingTest.php index f3d9e53f36070bc822cc5e3c12abc64c59937c21..7f6ff1ed093203cd1ef65eaaa1f0c0e9f384b761 100644 --- a/dev/tests/integration/testsuite/Mage/Core/Model/Design/PackageMergingTest.php +++ b/dev/tests/integration/testsuite/Mage/Core/Model/Design/PackageMergingTest.php @@ -51,13 +51,13 @@ class Mage_Core_Model_Design_PackageMergingTest extends PHPUnit_Framework_TestCa public static function setUpBeforeClass() { - self::$_themePublicDir = Mage::getBaseDir(Mage_Core_Model_Dir::MEDIA) . '/theme'; + self::$_themePublicDir = Mage::getDesign()->getPublicDir(); self::$_viewPublicMergedDir = self::$_themePublicDir . '/_merged'; } protected function setUp() { - Magento_Test_Bootstrap::getInstance()->reinitialize(array( + Magento_Test_Helper_Bootstrap::getInstance()->reinitialize(array( Mage_Core_Model_App::INIT_OPTION_DIRS => array( Mage_Core_Model_Dir::THEMES => dirname(__DIR__) . '/_files/design' ) @@ -84,6 +84,7 @@ class Mage_Core_Model_Design_PackageMergingTest extends PHPUnit_Framework_TestCa 'css/exception.css', 'css/file.css', )); + $this->assertFileNotExists(self::$_themePublicDir . '/frontend/package/default/en_US/access_violation.php'); } /** diff --git a/dev/tests/integration/testsuite/Mage/Core/Model/Design/PackagePublicationTest.php b/dev/tests/integration/testsuite/Mage/Core/Model/Design/PackagePublicationTest.php index d3ac6c4df5ba7d644565b5e8f6594bd5e027f598..ec3ea3431bbe08e2ece30da388e219299ed22fac 100644 --- a/dev/tests/integration/testsuite/Mage/Core/Model/Design/PackagePublicationTest.php +++ b/dev/tests/integration/testsuite/Mage/Core/Model/Design/PackagePublicationTest.php @@ -52,7 +52,8 @@ class Mage_Core_Model_Design_PackagePublicationTest extends PHPUnit_Framework_Te { /** @var $dirs Mage_Core_Model_Dir */ $dirs = Mage::getObjectManager()->get('Mage_Core_Model_Dir'); - $expectedPublicDir = $dirs->getDir(Mage_Core_Model_Dir::MEDIA) . DIRECTORY_SEPARATOR . 'theme'; + $expectedPublicDir = $dirs->getDir(Mage_Core_Model_Dir::THEME) . DIRECTORY_SEPARATOR + . Mage_Core_Model_Design_Package::PUBLIC_BASE_THEME_DIR; $this->assertEquals($expectedPublicDir, $this->_model->getPublicDir()); } @@ -93,16 +94,16 @@ class Mage_Core_Model_Design_PackagePublicationTest extends PHPUnit_Framework_Te return array( 'theme file' => array( 'css/styles.css', - 'theme/frontend/test/default/en_US/css/styles.css', + 'theme/static/frontend/test/default/en_US/css/styles.css', ), 'theme localized file' => array( 'logo.gif', - 'theme/frontend/test/default/fr_FR/logo.gif', + 'theme/static/frontend/test/default/fr_FR/logo.gif', 'fr_FR', ), 'modular file' => array( 'Module::favicon.ico', - 'theme/frontend/test/default/en_US/Module/favicon.ico', + 'theme/static/frontend/test/default/en_US/Module/favicon.ico', ), 'lib file' => array( 'varien/product.js', @@ -134,15 +135,15 @@ class Mage_Core_Model_Design_PackagePublicationTest extends PHPUnit_Framework_Te return array( 'theme css file' => array( 'css/styles.css', - 'theme/frontend/test/default/en_US/css/styles.css', + 'theme/static/frontend/test/default/en_US/css/styles.css', ), 'theme file' => array( 'images/logo.gif', - 'theme/frontend/test/default/images/logo.gif', + 'theme/static/frontend/test/default/images/logo.gif', ), 'theme localized file' => array( 'logo.gif', - 'theme/frontend/test/default/locale/fr_FR/logo.gif', + 'theme/static/frontend/test/default/locale/fr_FR/logo.gif', 'fr_FR', ) ); @@ -336,6 +337,7 @@ class Mage_Core_Model_Design_PackagePublicationTest extends PHPUnit_Framework_Te * Publication of CSS files located in the module * * @magentoDataFixture Mage/Core/Model/_files/design/themes.php + * @magentoDataFixture Mage/Core/_files/frontend_default_theme.php * @dataProvider publishCssFileFromModuleDataProvider */ public function testPublishCssFileFromModule( @@ -441,15 +443,15 @@ class Mage_Core_Model_Design_PackagePublicationTest extends PHPUnit_Framework_Te */ protected function _testPublishResourcesAndCssWhenChangedCss($expectedPublished) { - Magento_Test_Bootstrap::getInstance()->reinitialize(array( + $appInstallDir = Magento_Test_Helper_Bootstrap::getInstance()->getAppInstallDir(); + Magento_Test_Helper_Bootstrap::getInstance()->reinitialize(array( Mage_Core_Model_App::INIT_OPTION_DIRS => array( - Mage_Core_Model_Dir::THEMES => - Magento_Test_Bootstrap::getInstance()->getInstallDir() . '/media_for_change' + Mage_Core_Model_Dir::THEMES => "$appInstallDir/media_for_change", ) )); $this->_model->setDesignTheme('test/default'); $themePath = $this->_model->getDesignTheme()->getFullPath(); - $fixtureViewPath = Magento_Test_Bootstrap::getInstance()->getInstallDir() . "/media_for_change/$themePath/"; + $fixtureViewPath = "$appInstallDir/media_for_change/$themePath/"; $publishedPath = $this->_model->getPublicDir() . "/$themePath/en_US/"; $this->_model->getViewFileUrl('style.css', array('locale' => 'en_US')); @@ -516,15 +518,15 @@ class Mage_Core_Model_Design_PackagePublicationTest extends PHPUnit_Framework_Te */ protected function _testPublishChangedResourcesWhenUnchangedCss($expectedPublished) { - Magento_Test_Bootstrap::getInstance()->reinitialize(array( + $appInstallDir = Magento_Test_Helper_Bootstrap::getInstance()->getAppInstallDir(); + Magento_Test_Helper_Bootstrap::getInstance()->reinitialize(array( Mage_Core_Model_App::INIT_OPTION_DIRS => array( - Mage_Core_Model_Dir::THEMES => - Magento_Test_Bootstrap::getInstance()->getInstallDir() . '/media_for_change' + Mage_Core_Model_Dir::THEMES => "$appInstallDir/media_for_change", ) )); $this->_model->setDesignTheme('test/default'); $themePath = $this->_model->getDesignTheme()->getFullPath(); - $fixtureViewPath = Magento_Test_Bootstrap::getInstance()->getInstallDir() . "/media_for_change/$themePath/"; + $fixtureViewPath = "$appInstallDir/media_for_change/$themePath/"; $publishedPath = $this->_model->getPublicDir() . "/$themePath/en_US/"; $this->_model->getViewFileUrl('style.css', array('locale' => 'en_US')); @@ -551,11 +553,52 @@ class Mage_Core_Model_Design_PackagePublicationTest extends PHPUnit_Framework_Te */ protected function _initTestTheme() { - Magento_Test_Bootstrap::getInstance()->reinitialize(array( + Magento_Test_Helper_Bootstrap::getInstance()->reinitialize(array( Mage_Core_Model_App::INIT_OPTION_DIRS => array( Mage_Core_Model_Dir::THEMES => dirname(__DIR__) . '/_files/design/' ) )); $this->_model->setDesignTheme('test/default'); } + + /** + * Check that the mechanism of publication not affected data content on css files + * + * @magentoAppIsolation enabled + * @magentoDbIsolation enabled + */ + public function testCssWithBase64Data() + { + Magento_Test_Helper_Bootstrap::getInstance()->reinitialize(array( + Mage_Core_Model_App::INIT_OPTION_DIRS => array( + Mage_Core_Model_Dir::THEMES => dirname(__DIR__) . '/_files/design/' + ) + )); + + /** @var $themeModel Mage_Core_Model_Theme */ + $themeModel = Mage::getObjectManager()->create('Mage_Core_Model_Theme'); + $themePath = implode(DS, array('frontend', 'package', 'default', 'theme.xml')); + + $theme = $themeModel->getCollectionFromFilesystem() + ->setBaseDir(dirname(__DIR__) . '/_files/design/') + ->addTargetPattern($themePath) + ->getFirstItem() + ->save(); + + $publishedPath = $this->_model->getPublicDir() . '/frontend/package/default/en_US'; + $params = array( + 'area' => 'frontend', + 'package' => 'package', + 'theme' => 'default', + 'locale' => 'en_US', + 'themeModel' => $theme + ); + $filePath = $this->_model->getViewFile('css/base64.css', $params); + + // publicate static content + $this->_model->getViewFileUrl('css/base64.css', $params); + $this->assertFileEquals($filePath, str_replace('/', DIRECTORY_SEPARATOR, "{$publishedPath}/css/base64.css")); + + $this->_model->setDesignTheme(Mage::getModel('Mage_Core_Model_Theme')); + } } diff --git a/dev/tests/integration/testsuite/Mage/Core/Model/Design/PackageTest.php b/dev/tests/integration/testsuite/Mage/Core/Model/Design/PackageTest.php index a910db073ebc46a3f2c713ce66776e7870c6a4da..1799fd401c2346804d650e828a7cecb46fc3db67 100644 --- a/dev/tests/integration/testsuite/Mage/Core/Model/Design/PackageTest.php +++ b/dev/tests/integration/testsuite/Mage/Core/Model/Design/PackageTest.php @@ -72,7 +72,7 @@ class Mage_Core_Model_Design_PackageTest extends PHPUnit_Framework_TestCase */ protected function _emulateFixtureTheme($themePath = 'test/default') { - Magento_Test_Bootstrap::getInstance()->reinitialize(array( + Magento_Test_Helper_Bootstrap::getInstance()->reinitialize(array( Mage_Core_Model_App::INIT_OPTION_DIRS => array( Mage_Core_Model_Dir::THEMES => realpath(__DIR__ . '/../_files/design'), ), @@ -185,7 +185,7 @@ class Mage_Core_Model_Design_PackageTest extends PHPUnit_Framework_TestCase { $this->_emulateFixtureTheme(); $expected = array( - 'http://localhost/pub/media/theme/frontend/test/default/en_US/css/styles.css', + 'http://localhost/pub/media/theme/static/frontend/test/default/en_US/css/styles.css', 'http://localhost/pub/lib/mage/translate-inline.css', ); $params = array( @@ -213,11 +213,11 @@ class Mage_Core_Model_Design_PackageTest extends PHPUnit_Framework_TestCase return array( array( array('css/styles.css', 'mage/calendar.css'), - array('http://localhost/pub/media/theme/_merged/dce6f2a22049cd09bbfbe344fc73b037.css') + array('http://localhost/pub/media/theme/static/_merged/dce6f2a22049cd09bbfbe344fc73b037.css') ), array( array('css/styles.css'), - array('http://localhost/pub/media/theme/frontend/test/default/en_US/css/styles.css',) + array('http://localhost/pub/media/theme/static/frontend/test/default/en_US/css/styles.css',) ), ); } @@ -229,7 +229,7 @@ class Mage_Core_Model_Design_PackageTest extends PHPUnit_Framework_TestCase { $this->_emulateFixtureTheme(); $expected = array( - 'http://localhost/pub/media/theme/frontend/test/default/en_US/js/tabs.js', + 'http://localhost/pub/media/theme/static/frontend/test/default/en_US/js/tabs.js', 'http://localhost/pub/lib/jquery/jquery-ui-timepicker-addon.js', 'http://localhost/pub/lib/mage/calendar.js', ); @@ -259,7 +259,7 @@ class Mage_Core_Model_Design_PackageTest extends PHPUnit_Framework_TestCase return array( array( array('js/tabs.js', 'mage/calendar.js', 'jquery/jquery-ui-timepicker-addon.js'), - array('http://localhost/pub/media/theme/_merged/51cf03344697f37c2511aa0ad3391d56.js',) + array('http://localhost/pub/media/theme/static/_merged/51cf03344697f37c2511aa0ad3391d56.js',) ), array( array('mage/calendar.js'), @@ -328,7 +328,7 @@ class Mage_Core_Model_Design_PackageTest extends PHPUnit_Framework_TestCase array( false, 'Mage_Page::favicon.ico', - 'http://localhost/pub/media/theme/frontend/test/default/en_US/Mage_Page/favicon.ico', + 'http://localhost/pub/media/theme/static/frontend/test/default/en_US/Mage_Page/favicon.ico', ), array( true, @@ -343,22 +343,22 @@ class Mage_Core_Model_Design_PackageTest extends PHPUnit_Framework_TestCase array( true, 'Mage_Page::menu.js', - 'http://localhost/pub/media/theme/frontend/test/default/en_US/Mage_Page/menu.js' + 'http://localhost/pub/media/theme/static/frontend/test/default/en_US/Mage_Page/menu.js' ), array( false, 'Mage_Page::menu.js', - 'http://localhost/pub/media/theme/frontend/test/default/en_US/Mage_Page/menu.js' + 'http://localhost/pub/media/theme/static/frontend/test/default/en_US/Mage_Page/menu.js' ), array( false, 'Mage_Catalog::widgets.css', - 'http://localhost/pub/media/theme/frontend/test/default/en_US/Mage_Catalog/widgets.css' + 'http://localhost/pub/media/theme/static/frontend/test/default/en_US/Mage_Catalog/widgets.css' ), array( true, 'Mage_Catalog::widgets.css', - 'http://localhost/pub/media/theme/frontend/test/default/en_US/Mage_Catalog/widgets.css' + 'http://localhost/pub/media/theme/static/frontend/test/default/en_US/Mage_Catalog/widgets.css' ), ); } diff --git a/dev/tests/integration/testsuite/Mage/Core/Model/Email/Template/FilterTest.php b/dev/tests/integration/testsuite/Mage/Core/Model/Email/Template/FilterTest.php index 950d5ff288ecda7fd231f58c78bc4181e74fb7ec..0888cd2bdb72882f4104f77483d23ad5ae8ff05a 100644 --- a/dev/tests/integration/testsuite/Mage/Core/Model/Email/Template/FilterTest.php +++ b/dev/tests/integration/testsuite/Mage/Core/Model/Email/Template/FilterTest.php @@ -111,7 +111,7 @@ class Mage_Core_Model_Email_Template_FilterTest extends PHPUnit_Framework_TestCa */ public function testLayoutDirective($area, $directiveParams, $expectedOutput) { - Magento_Test_Bootstrap::getInstance()->reinitialize(array( + Magento_Test_Helper_Bootstrap::getInstance()->reinitialize(array( Mage_Core_Model_App::INIT_OPTION_DIRS => array( Mage_Core_Model_Dir::THEMES => dirname(__DIR__) . '/_files/design' ) @@ -123,7 +123,7 @@ class Mage_Core_Model_Email_Template_FilterTest extends PHPUnit_Framework_TestCa /** @var $layout Mage_Core_Model_Layout */ $objectManager = Mage::getObjectManager(); - $layout = Mage::getObjectManager()->create('Mage_Core_Model_Layout', array('area' => $area)); + $layout = $objectManager->create('Mage_Core_Model_Layout', array('area' => $area)); $objectManager->addSharedInstance($layout, 'Mage_Core_Model_Layout'); $this->assertEquals($area, $layout->getArea()); $this->assertEquals($area, Mage::app()->getLayout()->getArea()); diff --git a/dev/tests/integration/testsuite/Mage/Core/Model/Email/TemplateTest.php b/dev/tests/integration/testsuite/Mage/Core/Model/Email/TemplateTest.php index 1cbede5ed7b8b4fe97d7060688515fd378b06c94..8553d4985cc3131eef1cd114f03b106714f4800e 100644 --- a/dev/tests/integration/testsuite/Mage/Core/Model/Email/TemplateTest.php +++ b/dev/tests/integration/testsuite/Mage/Core/Model/Email/TemplateTest.php @@ -106,11 +106,12 @@ class Mage_Core_Model_Email_TemplateTest extends PHPUnit_Framework_TestCase /** * @magentoAppIsolation enabled * @magentoDataFixture Mage/Core/_files/store.php + * @magentoDataFixture Mage/Core/_files/frontend_default_theme.php */ public function testGetProcessedTemplate() { $this->_setBlueThemeForFixtureStore(); - $expectedViewUrl = 'theme/frontend/default/demo_blue/en_US/Mage_Page/favicon.ico'; + $expectedViewUrl = 'theme/static/frontend/default/demo_blue/en_US/Mage_Page/favicon.ico'; $this->_model->setTemplateText('{{view url="Mage_Page::favicon.ico"}}'); $this->assertStringEndsNotWith($expectedViewUrl, $this->_model->getProcessedTemplate()); $this->_model->setDesignConfig(array( @@ -134,12 +135,13 @@ class Mage_Core_Model_Email_TemplateTest extends PHPUnit_Framework_TestCase /** * @magentoAppIsolation enabled * @magentoDataFixture Mage/Core/_files/design_change.php + * @magentoDataFixture Mage/Core/_files/frontend_default_theme.php */ public function testGetProcessedTemplateDesignChange() { $this->_model->setTemplateText('{{view url="Mage_Page::favicon.ico"}}'); $this->assertStringEndsWith( - 'theme/frontend/default/modern/en_US/Mage_Page/favicon.ico', + 'theme/static/frontend/default/modern/en_US/Mage_Page/favicon.ico', $this->_model->getProcessedTemplate() ); } @@ -147,11 +149,12 @@ class Mage_Core_Model_Email_TemplateTest extends PHPUnit_Framework_TestCase /** * @magentoAppIsolation enabled * @magentoDataFixture Mage/Core/_files/store.php + * @magentoDataFixture Mage/Core/_files/frontend_default_theme.php */ public function testGetProcessedTemplateSubject() { $this->_setBlueThemeForFixtureStore(); - $expectedViewUrl = 'theme/frontend/default/demo_blue/en_US/Mage_Page/favicon.ico'; + $expectedViewUrl = 'theme/static/frontend/default/demo_blue/en_US/Mage_Page/favicon.ico'; $this->_model->setTemplateSubject('{{view url="Mage_Page::favicon.ico"}}'); $this->assertStringEndsNotWith($expectedViewUrl, $this->_model->getProcessedTemplateSubject(array())); $this->_model->setDesignConfig(array( @@ -165,6 +168,7 @@ class Mage_Core_Model_Email_TemplateTest extends PHPUnit_Framework_TestCase * @covers Mage_Core_Model_Email_Template::addBcc * @covers Mage_Core_Model_Email_Template::setReturnPath * @covers Mage_Core_Model_Email_Template::setReplyTo + * @magentoDataFixture Mage/Core/_files/frontend_default_theme.php */ public function testSend() { @@ -185,6 +189,9 @@ class Mage_Core_Model_Email_TemplateTest extends PHPUnit_Framework_TestCase $this->assertTrue($this->_model->send('test@example.com')); } + /** + * @magentoDataFixture Mage/Core/_files/frontend_default_theme.php + */ public function testSendMultipleRecipients() { $this->_mail->expects($this->at(0))->method('addTo')->with('one@example.com', '=?utf-8?B?TmFtZSBPbmU=?='); @@ -202,6 +209,9 @@ class Mage_Core_Model_Email_TemplateTest extends PHPUnit_Framework_TestCase $this->assertSame($exception, $this->_model->getSendingException()); } + /** + * @magentoDataFixture Mage/Core/_files/frontend_default_theme.php + */ public function testSendTransactional() { $this->_model->sendTransactional('customer_create_account_email_template', diff --git a/dev/tests/integration/testsuite/Mage/Core/Model/Layout/MergeTest.php b/dev/tests/integration/testsuite/Mage/Core/Model/Layout/MergeTest.php index 004485100efcce685f776e8e67e59b37dd3d9daa..9cd4e31e847755134c9b8a2cf829eefb798cf3ca 100644 --- a/dev/tests/integration/testsuite/Mage/Core/Model/Layout/MergeTest.php +++ b/dev/tests/integration/testsuite/Mage/Core/Model/Layout/MergeTest.php @@ -37,7 +37,7 @@ class Mage_Core_Model_Layout_MergeTest extends PHPUnit_Framework_TestCase /* Disable loading and saving layout cache */ Mage::app()->getCacheInstance()->banUse('layout'); - Magento_Test_Bootstrap::getInstance()->reinitialize(array( + Magento_Test_Helper_Bootstrap::getInstance()->reinitialize(array( Mage_Core_Model_App::INIT_OPTION_DIRS => array( Mage_Core_Model_Dir::THEMES => dirname(__DIR__) . '/_files/design' ) @@ -83,6 +83,8 @@ class Mage_Core_Model_Layout_MergeTest extends PHPUnit_Framework_TestCase $nonPageHandles = array('non_page_handle'); $this->_model->addHandle($nonPageHandles); + Mage::getDesign()->setArea(Mage_Core_Model_App_Area::AREA_FRONTEND)->setDefaultDesignTheme(); + $this->assertFalse($this->_model->addPageHandles(array('non_existing_handle'))); $this->assertEmpty($this->_model->getPageHandles()); $this->assertEquals($nonPageHandles, $this->_model->getHandles()); @@ -301,6 +303,7 @@ class Mage_Core_Model_Layout_MergeTest extends PHPUnit_Framework_TestCase public function testGetFileLayoutUpdatesXmlFromModule() { + Mage::getDesign()->setArea(Mage_Core_Model_App_Area::AREA_FRONTEND)->setDefaultDesignTheme(); $this->_replaceConfigLayoutUpdates(' <page module="Mage_Page"> <file>layout.xml</file> diff --git a/dev/tests/integration/testsuite/Mage/Core/Model/Resource/Helper/Mysql4Test.php b/dev/tests/integration/testsuite/Mage/Core/Model/Resource/Helper/Mysql4Test.php index 2af66b2bbd21311143b39b1b658cacd88ab4d54d..87893b3382238beb3f38c5a246c511a0e20e9ecb 100644 --- a/dev/tests/integration/testsuite/Mage/Core/Model/Resource/Helper/Mysql4Test.php +++ b/dev/tests/integration/testsuite/Mage/Core/Model/Resource/Helper/Mysql4Test.php @@ -39,7 +39,7 @@ class Mage_Core_Model_Resource_Helper_Mysql4Test extends PHPUnit_Framework_TestC protected function setUp() { - if (Magento_Test_Bootstrap::getInstance()->getDbVendorName() != 'mysql') { + if (Magento_Test_Helper_Bootstrap::getInstance()->getDbVendorName() != 'mysql') { $this->markTestSkipped('Test is designed to run on MySQL only.'); } $this->_model = Mage::getResourceModel( diff --git a/dev/tests/integration/testsuite/Mage/Core/Model/Resource/StoreTest.php b/dev/tests/integration/testsuite/Mage/Core/Model/Resource/StoreTest.php new file mode 100644 index 0000000000000000000000000000000000000000..d5444395b6d349ee06271ab0be3b31ec0c68f82c --- /dev/null +++ b/dev/tests/integration/testsuite/Mage/Core/Model/Resource/StoreTest.php @@ -0,0 +1,34 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +class Mage_Core_Model_Resource_StoreTest extends PHPUnit_Framework_TestCase +{ + public function testCountAll() + { + /** @var $model Mage_Core_Model_Resource_Store */ + $model = Mage::getModel('Mage_Core_Model_Resource_Store'); + $this->assertEquals(1, $model->countAll()); + $this->assertEquals(1, $model->countAll(false)); + $this->assertEquals(2, $model->countAll(true)); + } +} diff --git a/dev/tests/integration/testsuite/Mage/Core/Model/ResourceMysqlTest.php b/dev/tests/integration/testsuite/Mage/Core/Model/ResourceMysqlTest.php index ff03a1b2a75ec91a3034e90ad1dc158a806028d9..3182199811741f5521c866084824137b7cd0a23d 100644 --- a/dev/tests/integration/testsuite/Mage/Core/Model/ResourceMysqlTest.php +++ b/dev/tests/integration/testsuite/Mage/Core/Model/ResourceMysqlTest.php @@ -34,7 +34,7 @@ class Mage_Core_Model_ResourceMysqlTest extends PHPUnit_Framework_TestCase public function setUp() { - if (Magento_Test_Bootstrap::getInstance()->getDbVendorName() != 'mysql') { + if (Magento_Test_Helper_Bootstrap::getInstance()->getDbVendorName() != 'mysql') { $this->markTestSkipped('Test is designed to run on MySQL only.'); } $this->_model = Mage::getModel('Mage_Core_Model_Resource'); diff --git a/dev/tests/integration/testsuite/Mage/Core/Model/StoreTest.php b/dev/tests/integration/testsuite/Mage/Core/Model/StoreTest.php index 7504294c377a60db623089ca4840eb6d86511c50..2f7b8a740718fcaf4faa430a05d2cc8fba218a42 100644 --- a/dev/tests/integration/testsuite/Mage/Core/Model/StoreTest.php +++ b/dev/tests/integration/testsuite/Mage/Core/Model/StoreTest.php @@ -157,7 +157,7 @@ class Mage_Core_Model_StoreTest extends PHPUnit_Framework_TestCase */ public function testGetBaseUrlInPub() { - Magento_Test_Bootstrap::getInstance()->reinitialize(array( + Magento_Test_Helper_Bootstrap::getInstance()->reinitialize(array( Mage_Core_Model_App::INIT_OPTION_URIS => array(Mage_Core_Model_Dir::PUB => '') )); $this->_model->load('default'); @@ -270,6 +270,76 @@ class Mage_Core_Model_StoreTest extends PHPUnit_Framework_TestCase $crud->testCrud(); } + /** + * @param array $badStoreData + * + * @dataProvider saveValidationDataProvider + * @magentoAppIsolation enabled + * @magentoDbIsolation enabled + * @expectedException Mage_Core_Exception + */ + public function testSaveValidation($badStoreData) + { + $normalStoreData = array( + 'code' => 'test', + 'website_id' => 1, + 'group_id' => 1, + 'name' => 'test name', + 'sort_order' => 0, + 'is_active' => 1 + ); + $data = array_merge($normalStoreData, $badStoreData); + + $this->_model->setData($data); + + /* emulate admin store */ + Mage::app()->getStore()->setId(Mage_Core_Model_App::ADMIN_STORE_ID); + $this->_model->save(); + } + + /** + * @return array + */ + public static function saveValidationDataProvider() + { + return array( + 'empty store name' => array( + array('name' => '') + ), + 'empty store code' => array( + array('code' => '') + ), + 'invalid store code' => array( + array('code' => '^_^') + ), + ); + } + + /** + * @magentoConfigFixture global/functional_limitation/max_store_count 1 + * @magentoAppIsolation enabled + * @magentoDbIsolation enabled + * @expectedException Mage_Core_Exception + * @expectedExceptionMessage You are using the maximum number of store views allowed. + */ + public function testSaveValidationLimitation() + { + $this->_model->setData( + array( + 'code' => 'test', + 'website_id' => 1, + 'group_id' => 1, + 'name' => 'test name', + 'sort_order' => 0, + 'is_active' => 1 + ) + ); + + /* emulate admin store */ + Mage::app()->getStore()->setId(Mage_Core_Model_App::ADMIN_STORE_ID); + $this->_model->save(); + } + /** * * @dataProvider getUrlClassNameDataProvider diff --git a/dev/tests/integration/testsuite/Mage/Core/Model/Theme/Files/JsTest.php b/dev/tests/integration/testsuite/Mage/Core/Model/Theme/Files/JsTest.php new file mode 100644 index 0000000000000000000000000000000000000000..e7baf470330706ffb1491a135c251fe7ab03a989 --- /dev/null +++ b/dev/tests/integration/testsuite/Mage/Core/Model/Theme/Files/JsTest.php @@ -0,0 +1,136 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Mage_Core + * @subpackage integration_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Test for js files + */ +class Mage_Core_Model_Theme_Customization_Files_JsTest extends PHPUnit_Framework_TestCase +{ + /** + * @magentoDbIsolation enabled + * @dataProvider fileSampleData + */ + public function testSaveJsFile($data) + { + /** @var $themeModel Mage_Core_Model_Theme */ + $themeModel = Mage::getObjectManager()->create('Mage_Core_Model_Theme'); + $theme = $themeModel->getCollection()->getFirstItem(); + + /** @var $jsFileModel Mage_Core_Model_Theme_Customization_Files_Js */ + $jsFileModel = Mage::getObjectManager()->create('Mage_Core_Model_Theme_Customization_Files_Js'); + $file = $jsFileModel->saveJsFile($theme, $data); + + $this->assertNotEmpty($file->getId()); + } + + /** + * @magentoDbIsolation enabled + * @dataProvider fileSampleData + */ + public function testGetCollectionByTheme($data) + { + /** @var $themeModel Mage_Core_Model_Theme */ + $themeModel = Mage::getObjectManager()->create('Mage_Core_Model_Theme'); + $theme = $themeModel->getCollection()->getFirstItem(); + + /** @var $jsFileModel Mage_Core_Model_Theme_Customization_Files_Js */ + $jsFileModel = Mage::getObjectManager()->create('Mage_Core_Model_Theme_Customization_Files_Js'); + $oldJsFilesCount = $jsFileModel->getCollectionByTheme($theme)->count(); + $oldJsFilesCount++; + $jsFileModel->saveJsFile($theme, $data); + + $this->assertEquals($oldJsFilesCount, $jsFileModel->getCollectionByTheme($theme)->count()); + } + + /** + * @magentoDbIsolation enabled + * @dataProvider fileSampleData + */ + public function testSaveData($data) + { + /** @var $themeModel Mage_Core_Model_Theme */ + $themeModel = Mage::getObjectManager()->create('Mage_Core_Model_Theme'); + $theme = $themeModel->getCollection()->getFirstItem(); + + /** @var $jsFileModel Mage_Core_Model_Theme_Customization_Files_Js */ + $jsFileModel = Mage::getObjectManager()->create('Mage_Core_Model_Theme_Customization_Files_Js'); + /** @var $file */ + $file = $jsFileModel->saveJsFile($theme, $data); + + $jsFileModel->setDataForSave($file->getId()); + $jsFileModel->saveData($theme); + + /** @var $updatedFile Mage_Core_Model_Theme_Files */ + $updatedFile = Mage::getObjectManager()->create('Mage_Core_Model_Theme_Files'); + $updatedFile->load($file->getId()); + + $this->assertFalse((bool)$updatedFile->getIsTemporary()); + } + + /** + * @magentoDbIsolation enabled + * @dataProvider fileSampleData + */ + public function testRemoveTemporaryFiles($data) + { + /** @var $themeModel Mage_Core_Model_Theme */ + $themeModel = Mage::getObjectManager()->create('Mage_Core_Model_Theme'); + $theme = $themeModel->getCollection()->getFirstItem(); + + /** @var $jsFileModel Mage_Core_Model_Theme_Customization_Files_Js */ + $jsFileModel = Mage::getObjectManager()->create('Mage_Core_Model_Theme_Customization_Files_Js'); + $jsFileModel->saveJsFile($theme, $data); + + $oldJsFilesCount = $jsFileModel->getCollectionByTheme($theme)->count(); + $jsFiles = $jsFileModel->getCollectionByTheme($theme); + + $temporaryFilesCount = 0; + foreach ($jsFiles as $file) { + if ($file->getIsTemporary()) { + $temporaryFilesCount++; + } + } + + $jsFileModel->removeTemporaryFiles($theme); + + $expectedFilesCount = $oldJsFilesCount - $temporaryFilesCount; + $this->assertEquals($expectedFilesCount, $jsFileModel->getCollectionByTheme($theme)->count()); + } + + /** + * File sample data + * + * @return array + */ + public function fileSampleData() + { + return array(array(array( + 'name' => 'js_test_file.js', + 'content' => 'js file content', + ))); + } +} diff --git a/dev/tests/integration/testsuite/Mage/Core/Model/Theme/FilesTest.php b/dev/tests/integration/testsuite/Mage/Core/Model/Theme/FilesTest.php index dede908f68f5de77837e2844814082d0c8d62377..ee249815115e81674bfad6c7f71f26edcc6f65fc 100644 --- a/dev/tests/integration/testsuite/Mage/Core/Model/Theme/FilesTest.php +++ b/dev/tests/integration/testsuite/Mage/Core/Model/Theme/FilesTest.php @@ -32,7 +32,7 @@ class Mage_Core_Model_Theme_FilesTest extends PHPUnit_Framework_TestCase */ public function testCrud() { - /** @var $themeModel Mage_Core_Model_Theme_Files */ + /** @var $filesModel Mage_Core_Model_Theme_Files */ $filesModel = Mage::getObjectManager()->create('Mage_Core_Model_Theme_Files'); $filesData = $this->_getThemeFilesValidData(); @@ -43,7 +43,7 @@ class Mage_Core_Model_Theme_FilesTest extends PHPUnit_Framework_TestCase $filesData['theme_id'] = $theme->getId(); $filesModel->setData($filesData); - $crud = new Magento_Test_Entity($filesModel, array('file_name' => 'rename.css')); + $crud = new Magento_Test_Entity($filesModel, array('file_path' => 'rename.css')); $crud->testCrud(); } diff --git a/dev/tests/integration/testsuite/Mage/Core/Model/Theme/ImageTest.php b/dev/tests/integration/testsuite/Mage/Core/Model/Theme/ImageTest.php new file mode 100644 index 0000000000000000000000000000000000000000..14d499cc8fcc5f5011cbb9de64151c45deafc1ba --- /dev/null +++ b/dev/tests/integration/testsuite/Mage/Core/Model/Theme/ImageTest.php @@ -0,0 +1,64 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Mage_Core + * @subpackage integration_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +class Mage_Core_Model_Theme_ImageTest extends PHPUnit_Framework_TestCase +{ + /** + * Test get preview image + */ + public function testGetPreviewImageUrl() + { + $themeModel = Mage::getObjectManager()->create('Mage_Core_Model_Theme'); + $themeModel->getThemeImage()->setPreviewImage('preview_image.jpg'); + $this->assertEquals('http://localhost/pub/media/theme/preview/preview_image.jpg', + $themeModel->getThemeImage()->getPreviewImageUrl()); + + $themeModel = Mage::getObjectManager()->create('Mage_Core_Model_Theme'); + $themeImageModel = Mage::getObjectManager()->create('Mage_Core_Model_Theme_Image'); + $themeImageModel->setTheme($themeModel); + $themeImageModel->setPreviewImage('preview_image.jpg'); + $this->assertEquals('http://localhost/pub/media/theme/preview/preview_image.jpg', + $themeImageModel->getPreviewImageUrl()); + } + + /** + * Test get preview image default + */ + public function testGetPreviewImageDefaultUrl() + { + $defPreviewImageUrl = 'default_image_preview_url'; + $themeModel = Mage::getObjectManager()->create('Mage_Core_Model_Theme'); + $themeImageModel = $this->getMock('Mage_Core_Model_Theme_Image', array('_getPreviewImageDefaultUrl'), + array(), '', false); + $themeImageModel->setTheme($themeModel); + $themeImageModel->expects($this->once()) + ->method('_getPreviewImageDefaultUrl') + ->will($this->returnValue($defPreviewImageUrl)); + + $this->assertEquals($defPreviewImageUrl, $themeImageModel->getPreviewImageUrl()); + } +} diff --git a/dev/tests/integration/testsuite/Mage/Core/Model/ThemeTest.php b/dev/tests/integration/testsuite/Mage/Core/Model/ThemeTest.php index 40cf31279d7658e0b2b30d566a72c20cd0ea2fa6..2a6933750f0670be61cee45912009b6f1fb487a1 100644 --- a/dev/tests/integration/testsuite/Mage/Core/Model/ThemeTest.php +++ b/dev/tests/integration/testsuite/Mage/Core/Model/ThemeTest.php @@ -106,31 +106,6 @@ class Mage_Core_Model_ThemeTest extends PHPUnit_Framework_TestCase ); } - /** - * Test get preview image - */ - public function testGetPreviewImageUrl() - { - $themeModel = Mage::getObjectManager()->create('Mage_Core_Model_Theme'); - $themeModel->setPreviewImage('preview_image.jpg'); - $this->assertEquals('http://localhost/pub/media/theme/preview/preview_image.jpg', - $themeModel->getPreviewImageUrl()); - } - - /** - * Test get preview image default - */ - public function testGetPreviewImageDefaultUrl() - { - $defPreviewImageUrl = 'default_image_preview_url'; - $themeModel = $this->getMock('Mage_Core_Model_Theme', array('_getPreviewImageDefaultUrl'), array(), '', false); - $themeModel->expects($this->once()) - ->method('_getPreviewImageDefaultUrl') - ->will($this->returnValue($defPreviewImageUrl)); - - $this->assertEquals($defPreviewImageUrl, $themeModel->getPreviewImageUrl()); - } - /** * Test is virtual * @@ -145,11 +120,11 @@ class Mage_Core_Model_ThemeTest extends PHPUnit_Framework_TestCase $this->assertTrue($themeModel->isVirtual()); } - /** * Test id deletable * * @dataProvider isDeletableDataProvider + * @param bool $isVirtual */ public function testIsDeletable($isVirtual) { @@ -211,4 +186,112 @@ class Mage_Core_Model_ThemeTest extends PHPUnit_Framework_TestCase $labelsCollection = $themeModel->getLabelsCollection('-- Please Select --'); $this->assertEquals(++$expectedItemsCount, count($labelsCollection)); } + + /** + * Test theme on child relations + */ + public function testChildRelation() + { + /** @var $theme Mage_Core_Model_Theme */ + /** @var $currentTheme Mage_Core_Model_Theme */ + $theme = Mage::getObjectManager()->get('Mage_Core_Model_Theme'); + foreach ($theme->getCollection() as $currentTheme) { + $parentTheme = $currentTheme->getParentTheme(); + if (!empty($parentTheme)) { + $this->assertTrue($parentTheme->hasChildThemes()); + } + } + } + + /** + * @magentoDbIsolation enabled + * @dataProvider getJsCustomizationProvider + * @param array $filesData + * @param array $expectedData + */ + public function testJsCustomization($filesData, $expectedData) + { + /** @var $theme Mage_Core_Model_Theme */ + /** @var $themeModel Mage_Core_Model_Theme */ + $theme = Mage::getObjectManager()->create('Mage_Core_Model_Theme'); + $themeModel = $theme->getCollection()->getFirstItem(); + + foreach ($filesData as $fileData) { + /** @var $filesModel Mage_Core_Model_Theme_Files */ + $filesModel = Mage::getObjectManager()->create('Mage_Core_Model_Theme_Files'); + $fileData['theme_id'] = $themeModel->getId(); + $filesModel->setData($fileData) + ->save(); + } + + /** @var $filesJs Mage_Core_Model_Theme_Customization_Files_Js */ + $filesJs = Mage::getObjectManager()->create('Mage_Core_Model_Theme_Customization_Files_Js'); + $themeFilesCollection = $themeModel->setCustomization($filesJs) + ->getCustomizationData(Mage_Core_Model_Theme_Customization_Files_Js::TYPE); + $this->assertInstanceOf('Mage_Core_Model_Resource_Theme_Files_Collection', $themeFilesCollection); + $themeFiles = $themeFilesCollection->toArray(); + foreach ($themeFiles['items'] as &$themeFile) { + $this->assertEquals($themeModel->getId(), $themeFile['theme_id']); + unset($themeFile['theme_id']); + unset($themeFile['theme_files_id']); + } + $this->assertEquals($expectedData, $themeFiles['items']); + } + + /** + * @return array + */ + public function getJsCustomizationProvider() + { + return array( + array( + 'filesData' => array( + array( + 'file_path' => 'test_1.js', + 'file_type' => Mage_Core_Model_Theme_Files::TYPE_JS, + 'content' => 'content 1', + 'sort_order' => '1' + ), + array( + 'file_path' => 'test_2.js', + 'file_type' => Mage_Core_Model_Theme_Files::TYPE_JS, + 'content' => 'content 2', + 'sort_order' => '3' + ), + array( + 'file_path' => 'test_3.js', + 'file_type' => Mage_Core_Model_Theme_Files::TYPE_JS, + 'content' => 'content 3', + 'sort_order' => '2' + ), + array( + 'file_path' => 'test_not_js.js', + 'file_type' => Mage_Core_Model_Theme_Files::TYPE_CSS, + 'content' => 'content css', + 'sort_order' => '' + ) + ), + 'expectedData' => array( + array( + 'file_path' => 'test_1.js', + 'file_type' => Mage_Core_Model_Theme_Files::TYPE_JS, + 'content' => 'content 1', + 'sort_order' => '1', + 'is_temporary' => '0' + ), + array( + 'file_path' => 'test_3.js', + 'file_type' => Mage_Core_Model_Theme_Files::TYPE_JS, + 'content' => 'content 3', + 'sort_order' => '2', + 'is_temporary' => '0' + ), + array( + 'file_path' => 'test_2.js', + 'file_type' => Mage_Core_Model_Theme_Files::TYPE_JS, + 'content' => 'content 2', + 'sort_order' => '3', + 'is_temporary' => '0' + )))); + } } diff --git a/dev/tests/integration/testsuite/Mage/Core/Model/Translate/_files/_inline_page_expected.html b/dev/tests/integration/testsuite/Mage/Core/Model/Translate/_files/_inline_page_expected.html index 344fe7f8be96caa386c95ab27db573ad12c1cafe..11962f66d2cd68564c747cde9b3a48c0bede6283 100644 --- a/dev/tests/integration/testsuite/Mage/Core/Model/Translate/_files/_inline_page_expected.html +++ b/dev/tests/integration/testsuite/Mage/Core/Model/Translate/_files/_inline_page_expected.html @@ -37,7 +37,7 @@ </div> <script type="text/javascript" src="http://localhost/pub/lib/prototype/window.js"></script> <link rel="stylesheet" type="text/css" href="http://localhost/pub/lib/prototype/windows/themes/default.css"/> -<link rel="stylesheet" type="text/css" href="http://localhost/pub/media/theme/frontend/{{design_package}}/default/en_US/Mage_Core/prototype/magento.css"/> +<link rel="stylesheet" type="text/css" href="http://localhost/pub/media/theme/static/frontend/{{design_package}}/default/en_US/Mage_Core/prototype/magento.css"/> <script type="text/javascript" src="http://localhost/pub/lib/mage/edit-trigger.js"></script> <script type="text/javascript" src="http://localhost/pub/lib/mage/translate-inline.js"></script> <link rel="stylesheet" type="text/css" href="http://localhost/pub/lib/mage/translate-inline.css"/> @@ -48,7 +48,7 @@ $(this).translateInline({ ajaxUrl: 'http://localhost/index.php/core/ajax/translate/', area: 'frontend', - editTrigger: {img: 'http://localhost/pub/media/theme/frontend/{{design_package}}/default/en_US/Mage_Core/fam_book_open.png'} + editTrigger: {img: 'http://localhost/pub/media/theme/static/frontend/{{design_package}}/default/en_US/Mage_Core/fam_book_open.png'} }); }); })(jQuery); diff --git a/dev/tests/integration/testsuite/Mage/Core/Model/TranslateTest.php b/dev/tests/integration/testsuite/Mage/Core/Model/TranslateTest.php index 3dcc3bdf304289e7345920aabbdda7ed3b692470..9a0c255d28d1fed647e37f0248dd4d2757e70c12 100644 --- a/dev/tests/integration/testsuite/Mage/Core/Model/TranslateTest.php +++ b/dev/tests/integration/testsuite/Mage/Core/Model/TranslateTest.php @@ -35,20 +35,26 @@ class Mage_Core_Model_TranslateTest extends PHPUnit_Framework_TestCase */ protected $_model; + /** + * @var Mage_Core_Model_Design_Package + */ + protected $_designModel; + public function setUp() { $pathChunks = array(dirname(__FILE__), '_files', 'design', 'frontend', 'test', 'default', 'locale', 'en_US', 'translate.csv'); $filesystem = new Magento_Filesystem(new Magento_Filesystem_Adapter_Local); - $design = $this->getMock('Mage_Core_Model_Design_Package', array('getLocaleFileName'), array($filesystem)); - $design->expects($this->any()) + $this->_designModel = $this->getMock('Mage_Core_Model_Design_Package', + array('getLocaleFileName'), array($filesystem)); + $this->_designModel->expects($this->any()) ->method('getLocaleFileName') - ->will($this->returnValue(implode(DS, $pathChunks))); + ->will($this->returnValue(implode(DIRECTORY_SEPARATOR, $pathChunks))); Mage::getConfig()->setModuleDir('Mage_Core', 'locale', dirname(__FILE__) . '/_files/Mage/Core/locale'); Mage::getConfig()->setModuleDir('Mage_Catalog', 'locale', dirname(__FILE__) . '/_files/Mage/Catalog/locale'); - $this->_model = Mage::getModel('Mage_Core_Model_Translate', array($design)); + $this->_model = Mage::getModel('Mage_Core_Model_Translate', array($this->_designModel)); $this->_model->init('frontend'); } @@ -122,10 +128,42 @@ class Mage_Core_Model_TranslateTest extends PHPUnit_Framework_TestCase */ public function testTranslate($inputText, $expectedTranslation) { + $theme = $this->getMock('Mage_Core_Model_Theme', array(), array(), '', false); + $theme->expects($this->any()) + ->method('getId') + ->will($this->returnValue(10)); + + $this->_designModel->expects($this->any()) + ->method('getDesignTheme') + ->will($this->returnValue($theme)); + + $pathChunks = array(dirname(__FILE__), '_files', 'design', 'frontend', 'test', 'default', 'locale', 'en_US', + 'translate.csv'); + + $filesystem = new Magento_Filesystem(new Magento_Filesystem_Adapter_Local); + $this->_designModel = $this->getMock('Mage_Core_Model_Design_Package', + array('getLocaleFileName', 'getDesignTheme'), array($filesystem)); + $this->_designModel->expects($this->any()) + ->method('getLocaleFileName') + ->will($this->returnValue(implode(DIRECTORY_SEPARATOR, $pathChunks))); + + $this->_designModel->expects($this->any()) + ->method('getDesignTheme') + ->will($this->returnValue($theme)); + + Mage::getConfig()->setModuleDir('Mage_Core', 'locale', dirname(__FILE__) . '/_files/Mage/Core/locale'); + Mage::getConfig()->setModuleDir('Mage_Catalog', 'locale', dirname(__FILE__) . '/_files/Mage/Catalog/locale'); + $this->_model = Mage::getModel('Mage_Core_Model_Translate', array($this->_designModel)); + $this->_model->init('frontend'); + + $actualTranslation = $this->_model->translate(array($inputText)); $this->assertEquals($expectedTranslation, $actualTranslation); } + /** + * @return array + */ public function translateDataProvider() { return array( @@ -163,6 +201,7 @@ class Mage_Core_Model_TranslateTest extends PHPUnit_Framework_TestCase * @magentoConfigFixture global/locale/inheritance/en_AU en_UK * @magentoConfigFixture global/locale/inheritance/en_UK en_US * @dataProvider translateWithLocaleInheritanceDataProvider + * @magentoDataFixture Mage/Core/_files/frontend_default_theme.php */ public function testTranslateWithLocaleInheritance($inputText, $expectedTranslation) { @@ -172,6 +211,9 @@ class Mage_Core_Model_TranslateTest extends PHPUnit_Framework_TestCase $this->assertEquals($expectedTranslation, $model->translate(array($inputText))); } + /** + * @return array + */ public function translateWithLocaleInheritanceDataProvider() { return array( diff --git a/dev/tests/integration/testsuite/Mage/Core/Model/_files/design/frontend/package/default/css/base64.css b/dev/tests/integration/testsuite/Mage/Core/Model/_files/design/frontend/package/default/css/base64.css new file mode 100644 index 0000000000000000000000000000000000000000..589f3c838119546c97bd0c4207262ff987c9faa7 --- /dev/null +++ b/dev/tests/integration/testsuite/Mage/Core/Model/_files/design/frontend/package/default/css/base64.css @@ -0,0 +1,29 @@ +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/afl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category design + * @package default_default + * @subpackage integration_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ + +li.test { + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNlNmU2ZTYiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); +} diff --git a/dev/tests/integration/testsuite/Mage/Core/Model/_files/design/frontend/package/default/css/exception.css b/dev/tests/integration/testsuite/Mage/Core/Model/_files/design/frontend/package/default/css/exception.css index 0ddc9237ed335491fc88a926fe5860b58574d575..13ef18a72adc9ade848270e6eeb171150f8dc4bd 100644 --- a/dev/tests/integration/testsuite/Mage/Core/Model/_files/design/frontend/package/default/css/exception.css +++ b/dev/tests/integration/testsuite/Mage/Core/Model/_files/design/frontend/package/default/css/exception.css @@ -23,4 +23,5 @@ * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ -li.rogue {background: url(../../access_violation.php);} +li.rogue {background: url(../access_violation.php);} +li.test {background: url(../../access_violation.php);} diff --git a/dev/tests/integration/testsuite/Mage/Core/_files/frontend_default_theme.php b/dev/tests/integration/testsuite/Mage/Core/_files/frontend_default_theme.php new file mode 100644 index 0000000000000000000000000000000000000000..2ba6242bf7321a34aeaa6d7bcc8a6eef1fb0ff57 --- /dev/null +++ b/dev/tests/integration/testsuite/Mage/Core/_files/frontend_default_theme.php @@ -0,0 +1,27 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Mage_Core + * @subpackage integration_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +Mage::app()->getArea(Mage_Core_Model_App_Area::AREA_FRONTEND)->load(); diff --git a/dev/tests/integration/testsuite/Mage/Core/_files/media_for_change.php b/dev/tests/integration/testsuite/Mage/Core/_files/media_for_change.php index a658ac04edd84123ebaead65715d739a49694def..374e81cd36d3a81b300ed0f83ad9156fa03b07ec 100644 --- a/dev/tests/integration/testsuite/Mage/Core/_files/media_for_change.php +++ b/dev/tests/integration/testsuite/Mage/Core/_files/media_for_change.php @@ -25,7 +25,7 @@ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) */ -$designDir = Magento_Test_Bootstrap::getInstance()->getInstallDir() . '/media_for_change'; +$designDir = Magento_Test_Helper_Bootstrap::getInstance()->getAppInstallDir() . '/media_for_change'; $themeDir = $designDir . DIRECTORY_SEPARATOR . '/frontend/test/default'; $sourcePath = dirname(__DIR__) . '/Model/_files/design/frontend/test/publication/'; diff --git a/dev/tests/integration/testsuite/Mage/Core/_files/media_for_change_rollback.php b/dev/tests/integration/testsuite/Mage/Core/_files/media_for_change_rollback.php index ba8bf37418ab15bf4c8d3c419453572888d3bcf4..190985ab5fe2c50c7572e4a0f76aafa3c5f30535 100644 --- a/dev/tests/integration/testsuite/Mage/Core/_files/media_for_change_rollback.php +++ b/dev/tests/integration/testsuite/Mage/Core/_files/media_for_change_rollback.php @@ -25,5 +25,5 @@ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) */ -$designDir = Magento_Test_Bootstrap::getInstance()->getInstallDir() . '/media_for_change'; +$designDir = Magento_Test_Helper_Bootstrap::getInstance()->getAppInstallDir() . '/media_for_change'; Varien_Io_File::rmdirRecursive($designDir); diff --git a/dev/tests/integration/testsuite/Mage/Customer/Service/CustomerTest.php b/dev/tests/integration/testsuite/Mage/Customer/Service/CustomerTest.php index 6365e6b8429bdc307c736daed47819d3ed3b7541..cc830e089762493854ce152cf211a33b5d23a0c8 100644 --- a/dev/tests/integration/testsuite/Mage/Customer/Service/CustomerTest.php +++ b/dev/tests/integration/testsuite/Mage/Customer/Service/CustomerTest.php @@ -306,6 +306,7 @@ class Mage_Customer_Service_CustomerTest extends PHPUnit_Framework_TestCase /** * @param array $customerData * @magentoDataFixture Mage/Customer/_files/customer.php + * @magentoDataFixture Mage/Core/_files/frontend_default_theme.php * @dataProvider updateDataProvider */ public function testUpdate($customerData) @@ -360,6 +361,7 @@ class Mage_Customer_Service_CustomerTest extends PHPUnit_Framework_TestCase * @param string $exceptionName * @param string $exceptionMessage * @magentoDataFixture Mage/Customer/_files/customer.php + * @magentoDataFixture Mage/Core/_files/frontend_default_theme.php * @dataProvider updateExceptionsDataProvider */ public function testUpdateExceptions($customerData, $exceptionName, $exceptionMessage = '') diff --git a/dev/tests/integration/testsuite/Mage/DesignEditor/controllers/Adminhtml/System/Design/EditorControllerTest.php b/dev/tests/integration/testsuite/Mage/DesignEditor/controllers/Adminhtml/System/Design/EditorControllerTest.php index 882c5d763cc588eb075064024f5bea8b655c36aa..7058c320db8a17f56175dd2d254a892cf25bcabe 100644 --- a/dev/tests/integration/testsuite/Mage/DesignEditor/controllers/Adminhtml/System/Design/EditorControllerTest.php +++ b/dev/tests/integration/testsuite/Mage/DesignEditor/controllers/Adminhtml/System/Design/EditorControllerTest.php @@ -82,7 +82,7 @@ class Mage_DesignEditor_Adminhtml_System_Design_EditorControllerTest extends Mag $content = $this->getResponse()->getBody(); $this->assertContains('Choose a theme to start with', $content); - $this->assertContains('<div class="entry-edit">', $content); + $this->assertContains('<div class="infinite_scroll">', $content); $this->assertContains("jQuery('.infinite_scroll').infinite_scroll", $content); } @@ -90,7 +90,7 @@ class Mage_DesignEditor_Adminhtml_System_Design_EditorControllerTest extends Mag { $this->getRequest()->setParam('theme_id', 999); $this->dispatch('backend/admin/system_design_editor/launch'); - + $this->assertSessionMessages($this->equalTo(array('The theme was not found.')), Mage_Core_Model_Message::ERROR); $expected = 'http://localhost/index.php/backend/admin/system_design_editor/index/'; $this->assertRedirect($this->stringStartsWith($expected)); } diff --git a/dev/tests/integration/testsuite/Mage/GiftMessage/Block/Message/InlineTest.php b/dev/tests/integration/testsuite/Mage/GiftMessage/Block/Message/InlineTest.php index ad7293f0a78a6c5e9d2552ca05d41126388ac60a..cb3aca13e34369fff6f4f23759936627980d3eba 100644 --- a/dev/tests/integration/testsuite/Mage/GiftMessage/Block/Message/InlineTest.php +++ b/dev/tests/integration/testsuite/Mage/GiftMessage/Block/Message/InlineTest.php @@ -44,6 +44,7 @@ class Mage_GiftMessage_Block_Message_InlineTest extends PHPUnit_Framework_TestCa /** * @magentoDataFixture Mage/Catalog/_files/product_with_image.php + * @magentoDataFixture Mage/Core/_files/frontend_default_theme.php */ public function testThumbnail() { diff --git a/dev/tests/integration/testsuite/Mage/ImportExport/Model/Import/Entity/CustomerCompositeTest.php b/dev/tests/integration/testsuite/Mage/ImportExport/Model/Import/Entity/CustomerCompositeTest.php index d2abc2ddafd846cbced3ccb88af00d82fc5a72a9..4cc99f94594fae5c4efe7b750454104a49965445 100644 --- a/dev/tests/integration/testsuite/Mage/ImportExport/Model/Import/Entity/CustomerCompositeTest.php +++ b/dev/tests/integration/testsuite/Mage/ImportExport/Model/Import/Entity/CustomerCompositeTest.php @@ -156,6 +156,7 @@ class Mage_ImportExport_Model_Import_Entity_CustomerCompositeTest extends PHPUni * @param array $errors * * @magentoDataFixture Mage/ImportExport/_files/customers_for_address_import.php + * @magentoDataFixture Mage/Core/_files/frontend_default_theme.php * @magentoAppIsolation enabled * * @dataProvider importDataDataProvider diff --git a/dev/tests/integration/testsuite/Mage/ImportExport/Model/Import/Entity/Eav/CustomerImportTest.php b/dev/tests/integration/testsuite/Mage/ImportExport/Model/Import/Entity/Eav/CustomerImportTest.php index 96d564f8bd1cc5150ff79de6ccc0a901026604f4..61760cc3e6528ba4d6fdb329afb87162ff7e5dea 100644 --- a/dev/tests/integration/testsuite/Mage/ImportExport/Model/Import/Entity/Eav/CustomerImportTest.php +++ b/dev/tests/integration/testsuite/Mage/ImportExport/Model/Import/Entity/Eav/CustomerImportTest.php @@ -124,6 +124,7 @@ class Mage_ImportExport_Model_Import_Entity_Eav_CustomerImportTest extends PHPUn * @covers Mage_ImportExport_Model_Import_Entity_Eav_Customer::_deleteCustomers * * @magentoDataFixture Mage/ImportExport/_files/customers.php + * @magentoDataFixture Mage/Core/_files/frontend_default_theme.php */ public function testDeleteData() { diff --git a/dev/tests/integration/testsuite/Mage/ImportExport/Model/Import/Entity/ProductTest.php b/dev/tests/integration/testsuite/Mage/ImportExport/Model/Import/Entity/ProductTest.php index 5db4920a330f75297e6a541e3862bff78f248075..504210938ceca7bc7ad8f080638aba9098285385 100644 --- a/dev/tests/integration/testsuite/Mage/ImportExport/Model/Import/Entity/ProductTest.php +++ b/dev/tests/integration/testsuite/Mage/ImportExport/Model/Import/Entity/ProductTest.php @@ -417,7 +417,7 @@ class Mage_ImportExport_Model_Import_Entity_ProductTest extends PHPUnit_Framewor */ public function testSaveMediaImage() { - if (Magento_Test_Bootstrap::getInstance()->getDbVendorName() != 'mysql') { + if (Magento_Test_Helper_Bootstrap::getInstance()->getDbVendorName() != 'mysql') { $this->markTestIncomplete('bug: MAGETWO-4227'); } $attribute = Mage::getModel('Mage_Catalog_Model_Entity_Attribute'); diff --git a/dev/tests/integration/testsuite/Mage/ImportExport/controllers/Adminhtml/ExportControllerTest.php b/dev/tests/integration/testsuite/Mage/ImportExport/controllers/Adminhtml/ExportControllerTest.php index 3fd626b2dec9240810281052cf81e734a0c528b5..1438cfd69160d3564e2ed4bd6104b7caf6a48ca9 100644 --- a/dev/tests/integration/testsuite/Mage/ImportExport/controllers/Adminhtml/ExportControllerTest.php +++ b/dev/tests/integration/testsuite/Mage/ImportExport/controllers/Adminhtml/ExportControllerTest.php @@ -99,7 +99,7 @@ class Mage_ImportExport_Adminhtml_ExportControllerTest extends Mage_Backend_Util $this->dispatch('backend/admin/export/index'); $body = $this->getResponse()->getBody(); - $this->assertSelectCount('div#head-base_fieldset', 1, $body); - $this->assertSelectCount('div#base_fieldset', 1, $body); + $this->assertSelectCount('fieldset#base_fieldset', 1, $body); + $this->assertSelectCount('fieldset#base_fieldset div.field', 2, $body); } } diff --git a/dev/tests/integration/testsuite/Mage/Install/Block/AdminTest.php b/dev/tests/integration/testsuite/Mage/Install/Block/AdminTest.php new file mode 100644 index 0000000000000000000000000000000000000000..4c6850109331ca1f8b90f62956f9a50b9744b9dd --- /dev/null +++ b/dev/tests/integration/testsuite/Mage/Install/Block/AdminTest.php @@ -0,0 +1,60 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +class Mage_Install_Block_AdminTest extends PHPUnit_Framework_TestCase +{ + public function testToHtml() + { + $preserve = array( + 'username' => 'admin', + 'email' => 'admin@example.com', + 'firstname' => 'First', + 'lastname' => 'Last', + ); + $omit = array( + 'password' => 'password_with_1_number', + 'password_confirmation' => 'password_with_1_number', + ); + + /** @var $session Mage_Install_Model_Session */ + $session = Mage::getSingleton('Mage_Install_Model_Session'); + $session->setAdminData(array_merge($preserve, $omit)); + + /** @var $layout Mage_Core_Model_Layout */ + $layout = Mage::getModel('Mage_Core_Model_Layout', array('area' => 'install')); + /** @var $block Mage_Install_Block_Admin */ + $block = $layout->createBlock('Mage_Install_Block_Admin'); + $output = $block->toHtml(); + + $this->assertEmpty($session->getAdminData()); + // form elements must be present with values + foreach ($preserve as $key => $value) { + $this->assertSelectCount(sprintf('input[name=admin[%s]][value=%s]', $key, $value), 1, $output); + } + // form elements must be present without values + foreach ($omit as $key => $value) { + $this->assertSelectCount(sprintf('input[name=admin[%s]]', $key), 1, $output); + $this->assertSelectCount(sprintf('input[name=admin[%s]][value=%s]', $key, $value), 0, $output); + } + } +} diff --git a/dev/tests/integration/testsuite/Mage/Install/Model/InstallerTest.php b/dev/tests/integration/testsuite/Mage/Install/Model/InstallerTest.php new file mode 100644 index 0000000000000000000000000000000000000000..4411afe3658102f3da3a2e4e2ff457caa1bdec11 --- /dev/null +++ b/dev/tests/integration/testsuite/Mage/Install/Model/InstallerTest.php @@ -0,0 +1,176 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Mage_Install + * @subpackage integration_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +class Mage_Install_Model_InstallerTest extends PHPUnit_Framework_TestCase +{ + /** + * @var string + */ + protected static $_tmpDir = ''; + + /** + * @var string + */ + protected static $_tmpConfigFile = ''; + + /** + * @var Mage_Install_Model_Installer + */ + protected $_model; + + public static function setUpBeforeClass() + { + self::$_tmpDir = Mage::getBaseDir(Mage_Core_Model_Dir::VAR_DIR) . DIRECTORY_SEPARATOR . __CLASS__; + self::$_tmpConfigFile = self::$_tmpDir . DIRECTORY_SEPARATOR . 'local.xml'; + mkdir(self::$_tmpDir); + } + + public static function tearDownAfterClass() + { + Varien_Io_File::rmdirRecursive(self::$_tmpDir); + } + + protected function setUp() + { + $this->_model = new Mage_Install_Model_Installer(); + } + + protected function tearDown() + { + $this->_model = null; + } + + /** + * Emulate configuration directory for the installer config model. + * Method usage should be accompanied with '@magentoAppIsolation enabled' because of the object manager pollution. + * + * @param string $dir + */ + protected function _emulateInstallerConfigDir($dir) + { + $objectManager = Mage::getObjectManager(); + $installerConfig = new Mage_Install_Model_Installer_Config( + $objectManager->get('Mage_Core_Model_Config'), + new Mage_Core_Model_Dir(__DIR__, array(), array(Mage_Core_Model_Dir::CONFIG => $dir)), + new Magento_Filesystem(new Magento_Filesystem_Adapter_Local()) + ); + $objectManager->addSharedInstance($installerConfig, 'Mage_Install_Model_Installer_Config'); + } + + /** + * @magentoDbIsolation enabled + */ + public function testCreateAdministrator() + { + $userName = 'installer_test'; + $userPassword = '123123q'; + $userData = array( + 'username' => $userName, + 'firstname' => 'First Name', + 'lastname' => 'Last Name', + 'email' => 'installer_test@example.com', + ); + + /** @var $user Mage_User_Model_User */ + $user = Mage::getModel('Mage_User_Model_User'); + $user->loadByUsername($userName); + $this->assertEmpty($user->getId()); + + $this->_model->createAdministrator($userData + array('password' => $userPassword)); + + $user->loadByUsername($userName); + $this->assertNotEmpty($user->getId()); + $this->assertEquals($userData, array_intersect_assoc($user->getData(), $userData)); + $this->assertNotEmpty($user->getPassword(), 'Password hash is expected to be loaded.'); + $this->assertNotEquals( + $userPassword, $user->getPassword(), + 'Original password should not be stored/loaded as is for security reasons.' + ); + $this->assertInstanceOf('Mage_User_Model_Role', $user->getRole()); + $this->assertEquals(1, $user->getRole()->getId(), 'User has to have admin privileges.'); + } + + /** + * @magentoAppIsolation enabled + */ + public function testInstallEncryptionKey() + { + $this->_emulateInstallerConfigDir(self::$_tmpDir); + + $keyPlaceholder = Mage_Install_Model_Installer_Config::TMP_ENCRYPT_KEY_VALUE; + $fixtureConfigData = "<key>$keyPlaceholder</key>"; + $expectedConfigData = '<key>d41d8cd98f00b204e9800998ecf8427e</key>'; + + file_put_contents(self::$_tmpConfigFile, $fixtureConfigData); + $this->assertEquals($fixtureConfigData, file_get_contents(self::$_tmpConfigFile)); + + $this->_model->installEncryptionKey('d41d8cd98f00b204e9800998ecf8427e'); + $this->assertEquals($expectedConfigData, file_get_contents(self::$_tmpConfigFile)); + } + + /** + * @magentoAppIsolation enabled + * @expectedException Magento_Exception + * @expectedExceptionMessage Key must not exceed + */ + public function testInstallEncryptionKeySizeViolation() + { + // isolate the application from the configuration pollution, if the test fails + $this->_emulateInstallerConfigDir(self::$_tmpDir); + + $this->_model->installEncryptionKey(str_repeat('a', 57)); + } + + /** + * @magentoAppIsolation enabled + */ + public function testGetValidEncryptionKey() + { + $validKey = 'abcdef1234567890'; + $this->assertEquals($validKey, $this->_model->getValidEncryptionKey($validKey)); + } + + /** + * @magentoAppIsolation enabled + * @expectedException Magento_Exception + * @expectedExceptionMessage Key must not exceed + */ + public function testGetValidEncryptionKeySizeViolation() + { + $this->_model->getValidEncryptionKey(str_repeat('1', 57)); + } + + /** + * @magentoAppIsolation enabled + */ + public function testGetValidEncryptionKeyRandom() + { + $actualKey = $this->_model->getValidEncryptionKey(); + $this->assertRegExp('/^[a-f0-9]{32}$/', $actualKey); + $this->assertNotEquals($actualKey, $this->_model->getValidEncryptionKey()); + } +} diff --git a/dev/tests/integration/testsuite/Mage/Newsletter/Model/QueueTest.php b/dev/tests/integration/testsuite/Mage/Newsletter/Model/QueueTest.php index 6cbb315ac0ee1d9066e499639aaabd434315db78..d0dfbcf422f3548258ae8ae9cca60a3dbdd2a30d 100644 --- a/dev/tests/integration/testsuite/Mage/Newsletter/Model/QueueTest.php +++ b/dev/tests/integration/testsuite/Mage/Newsletter/Model/QueueTest.php @@ -29,6 +29,7 @@ class Mage_Newsletter_Model_QueueTest extends PHPUnit_Framework_TestCase { /** * @magentoDataFixture Mage/Newsletter/_files/queue.php + * @magentoDataFixture Mage/Core/_files/frontend_default_theme.php * @magentoConfigFixture frontend/design/theme/full_name default/demo_blue * @magentoConfigFixture fixturestore_store general/locale/code de_DE * @magentoAppIsolation enabled @@ -43,10 +44,10 @@ class Mage_Newsletter_Model_QueueTest extends PHPUnit_Framework_TestCase $subscriberOne->expects($this->any())->method('send'); $subscriberTwo = clone $subscriberOne; $subscriberOne->expects($this->once())->method('setBodyHTML')->with( - $this->stringEndsWith('/theme/frontend/default/demo_blue/en_US/images/logo.gif') + $this->stringEndsWith('/theme/static/frontend/default/demo_blue/en_US/images/logo.gif') ); $subscriberTwo->expects($this->once())->method('setBodyHTML')->with( - $this->stringEndsWith('/theme/frontend/default/demo/de_DE/images/logo.gif') + $this->stringEndsWith('/theme/static/frontend/default/demo/de_DE/images/logo.gif') ); $emailTemplate = $this->getMock('Mage_Core_Model_Email_Template', array('_getMail'), array(), '', false); @@ -62,6 +63,7 @@ class Mage_Newsletter_Model_QueueTest extends PHPUnit_Framework_TestCase } /** + * @magentoDataFixture Mage/Core/_files/frontend_default_theme.php * @magentoDataFixture Mage/Newsletter/_files/queue.php * @magentoAppIsolation enabled */ diff --git a/dev/tests/integration/testsuite/Mage/Page/Block/Html/HeadTest.php b/dev/tests/integration/testsuite/Mage/Page/Block/Html/HeadTest.php index 517b01c97508c9acbb2816f1e1b0897c4ea90b6d..bf0c1f79cc1db221d5aed098270a29801215f562 100644 --- a/dev/tests/integration/testsuite/Mage/Page/Block/Html/HeadTest.php +++ b/dev/tests/integration/testsuite/Mage/Page/Block/Html/HeadTest.php @@ -83,7 +83,7 @@ class Mage_Page_Block_Html_HeadTest extends PHPUnit_Framework_TestCase . '<![endif]-->' . "\n" . '<link rel="stylesheet" type="text/css" media="all"' . ' href="http://localhost/index.php/core/index/notfound" />' . "\n" . '<link rel="stylesheet" type="text/css" media="print"' - . ' href="http://localhost/pub/media/theme/frontend/default/demo/en_US/css/styles.css" />' + . ' href="http://localhost/pub/media/theme/static/frontend/default/demo/en_US/css/styles.css" />' . "\n", $this->_block->getCssJsHtml()); } @@ -101,12 +101,12 @@ class Mage_Page_Block_Html_HeadTest extends PHPUnit_Framework_TestCase $this->assertEquals( '<script type="text/javascript" src="http://localhost/pub/lib/varien/js.js"></script>' . "\n" . '<script type="text/javascript" ' - . 'src="http://localhost/pub/media/theme/frontend/default/demo/en_US/Mage_Bundle/bundle.js">' + . 'src="http://localhost/pub/media/theme/static/frontend/default/demo/en_US/Mage_Bundle/bundle.js">' . '</script>' . "\n" . '<link rel="stylesheet" type="text/css" media="all"' . ' href="http://localhost/pub/lib/tiny_mce/themes/advanced/skins/default/ui.css" />' . "\n" . '<link rel="stylesheet" type="text/css" media="print" ' - . 'href="http://localhost/pub/media/theme/frontend/default/demo/en_US/css/styles.css" />' + . 'href="http://localhost/pub/media/theme/static/frontend/default/demo/en_US/css/styles.css" />' . "\n" . '<link rel="alternate" type="application/rss+xml" title="RSS Feed" href="http://example.com/feed.xml" />' . "\n" diff --git a/dev/tests/integration/testsuite/Mage/Paypal/Adminhtml/Paypal/ReportsControllerTest.php b/dev/tests/integration/testsuite/Mage/Paypal/Adminhtml/Paypal/ReportsControllerTest.php index d2729f76afda2944702121c783337edc160c3d8e..0e1c4a88669f5a57aa11f670335f51a053d5b97d 100644 --- a/dev/tests/integration/testsuite/Mage/Paypal/Adminhtml/Paypal/ReportsControllerTest.php +++ b/dev/tests/integration/testsuite/Mage/Paypal/Adminhtml/Paypal/ReportsControllerTest.php @@ -35,13 +35,8 @@ class Mage_Paypal_Adminhtml_Paypal_ReportsControllerTest extends Mage_Backend_Ut public function testFetchAction() { $this->dispatch('backend/admin/paypal_reports/fetch'); - /** @var $session Mage_Backend_Model_Session */ - $session = Mage::getSingleton('Mage_Backend_Model_Session'); - $this->assertEquals(1, $session->getMessages()->count()); - /** @var $message Mage_Core_Model_Message_Error */ - foreach ($session->getMessages() as $message) { - $this->assertInstanceOf('Mage_Core_Model_Message_Error', $message); - $this->assertContains('login@127.0.0.1', $message->getText()); - } + $this->assertSessionMessages( + $this->equalTo(array("Failed to fetch reports from 'login@127.0.0.1'.")), Mage_Core_Model_Message::ERROR + ); } } diff --git a/dev/tests/integration/testsuite/Mage/ProductAlert/Block/Email/StockTest.php b/dev/tests/integration/testsuite/Mage/ProductAlert/Block/Email/StockTest.php index 4f2918c0fe53665c11efec0cc47bc38cc01dc7fc..58538d5e39dd4bd41c004830a39832de8dc1490d 100644 --- a/dev/tests/integration/testsuite/Mage/ProductAlert/Block/Email/StockTest.php +++ b/dev/tests/integration/testsuite/Mage/ProductAlert/Block/Email/StockTest.php @@ -43,6 +43,7 @@ class Mage_ProductAlert_Block_Email_StockTest extends PHPUnit_Framework_TestCase } /** + * @magentoDataFixture Mage/Core/_files/frontend_default_theme.php * @magentoDataFixture Mage/Catalog/_files/product_with_image.php */ public function testThumbnail() diff --git a/dev/tests/integration/testsuite/Mage/Review/controllers/ProductControllerTest.php b/dev/tests/integration/testsuite/Mage/Review/controllers/ProductControllerTest.php index 60c33d800c01f144db8f1cfab17070368a8c8f51..005d658711db2bd7a1621727737644abec1d1d7b 100644 --- a/dev/tests/integration/testsuite/Mage/Review/controllers/ProductControllerTest.php +++ b/dev/tests/integration/testsuite/Mage/Review/controllers/ProductControllerTest.php @@ -36,7 +36,7 @@ class Mage_Review_ProductControllerTest extends Magento_Test_TestCase_Controller $this->getRequest()->setParam('id', $productId); $this->dispatch('review/product/list'); $result = $this->getResponse()->getBody(); - $this->assertContains("media/theme/frontend/{$expectedDesign}/en_US/Mage_Page/favicon.ico", $result); + $this->assertContains("media/theme/static/frontend/{$expectedDesign}/en_US/Mage_Page/favicon.ico", $result); } /** diff --git a/dev/tests/integration/testsuite/Mage/Rss/Block/Order/StatusTest.php b/dev/tests/integration/testsuite/Mage/Rss/Block/Order/StatusTest.php index f9ba964fb1cd50aecb7eef25ab5a573753bbc811..89bbd9eeb444bca9a5172826e411aaf1f9a9d695 100644 --- a/dev/tests/integration/testsuite/Mage/Rss/Block/Order/StatusTest.php +++ b/dev/tests/integration/testsuite/Mage/Rss/Block/Order/StatusTest.php @@ -29,7 +29,7 @@ class Mage_Rss_Block_Order_StatusTest extends PHPUnit_Framework_TestCase { public function testToHtml() { - if (Magento_Test_Bootstrap::getInstance()->getDbVendorName() != 'mysql') { + if (Magento_Test_Helper_Bootstrap::getInstance()->getDbVendorName() != 'mysql') { $this->markTestIncomplete('bug: MAGETWO-4227'); } $block = Mage::app()->getLayout()->createBlock('Mage_Rss_Block_Order_Status'); diff --git a/dev/tests/integration/testsuite/Mage/Rss/controllers/CatalogControllerTest.php b/dev/tests/integration/testsuite/Mage/Rss/controllers/CatalogControllerTest.php index 7b23e1f33a99423146217e00b2f83bb3bed6896f..9ad5099c4dcb6f854de86df3c41eb5ae3078f8f8 100644 --- a/dev/tests/integration/testsuite/Mage/Rss/controllers/CatalogControllerTest.php +++ b/dev/tests/integration/testsuite/Mage/Rss/controllers/CatalogControllerTest.php @@ -163,7 +163,7 @@ class Mage_Rss_CatalogControllerTest extends Magento_Test_TestCase_ControllerAbs */ protected function _loginAdmin() { - Mage::getDesign()->setArea('adminhtml'); + Mage::getDesign()->setArea('adminhtml')->setDefaultDesignTheme(); $this->getRequest()->setServer(array( 'PHP_AUTH_USER' => Magento_Test_Bootstrap::ADMIN_NAME, 'PHP_AUTH_PW' => Magento_Test_Bootstrap::ADMIN_PASSWORD diff --git a/dev/tests/integration/testsuite/Mage/Sales/Model/Order/ApiTest.php b/dev/tests/integration/testsuite/Mage/Sales/Model/Order/ApiTest.php index 87d6411318aa2ac6f244d5c1d28ca7a44bcda77f..0a9fa45d602cceb57b7d63b01d7df040daf443c3 100644 --- a/dev/tests/integration/testsuite/Mage/Sales/Model/Order/ApiTest.php +++ b/dev/tests/integration/testsuite/Mage/Sales/Model/Order/ApiTest.php @@ -106,8 +106,8 @@ class Mage_Sales_Model_Order_ApiTest extends PHPUnit_Framework_TestCase */ public function testList() { - if (Magento_Test_Bootstrap::getInstance()->getDbVendorName() != 'mysql') { - $this->markTestIncomplete('Legacy API is expected to support MySQL only.'); + if (Magento_Test_Helper_Bootstrap::getInstance()->getDbVendorName() != 'mysql') { + $this->markTestSkipped('Legacy API is expected to support MySQL only.'); } /** @var $order Mage_Sales_Model_Order */ $order = Mage::registry('order'); diff --git a/dev/tests/integration/testsuite/Mage/Sales/Model/Order/CreditmemoTest.php b/dev/tests/integration/testsuite/Mage/Sales/Model/Order/CreditmemoTest.php index 98c69769eb8c6769f793cd9cd3a253978c9278e0..e3bb44dbcd8221aec03f586de9ae96d3632bc14a 100644 --- a/dev/tests/integration/testsuite/Mage/Sales/Model/Order/CreditmemoTest.php +++ b/dev/tests/integration/testsuite/Mage/Sales/Model/Order/CreditmemoTest.php @@ -29,6 +29,7 @@ class Mage_Sales_Model_Order_CreditmemoTest extends PHPUnit_Framework_TestCase { /** * @magentoConfigFixture frontend/design/theme/full_name default/demo + * @magentoDataFixture Mage/Core/_files/frontend_default_theme.php * @magentoDataFixture Mage/Sales/_files/order.php */ public function testSendEmail() diff --git a/dev/tests/integration/testsuite/Mage/Sales/Model/Order/Invoice/ApiTest.php b/dev/tests/integration/testsuite/Mage/Sales/Model/Order/Invoice/ApiTest.php index c6da08418baf925da4a6dbe58531aa0e39be8425..03d295e9720a79500f64e9db934f3f0c7cfa7b69 100644 --- a/dev/tests/integration/testsuite/Mage/Sales/Model/Order/Invoice/ApiTest.php +++ b/dev/tests/integration/testsuite/Mage/Sales/Model/Order/Invoice/ApiTest.php @@ -30,9 +30,11 @@ class Mage_Sales_Model_Order_Invoice_ApiTest extends PHPUnit_Framework_TestCase * * @magentoDataFixture Mage/Sales/_files/order.php * @magentoDbIsolation enabled + * @magentoAppIsolation enabled */ public function testCreate() { + Mage::getDesign()->setArea(Mage_Core_Model_App_Area::AREA_FRONTEND)->setDefaultDesignTheme(); /** Prepare data. */ $order = $this->_getFixtureOrder(); $this->assertCount( @@ -108,6 +110,7 @@ class Mage_Sales_Model_Order_Invoice_ApiTest extends PHPUnit_Framework_TestCase * Test adding comment to invoice via API. * * @magentoDataFixture Mage/Sales/_files/invoice.php + * @magentoDataFixture Mage/Core/_files/frontend_default_theme.php * @magentoDbIsolation enabled */ public function testAddComment() diff --git a/dev/tests/integration/testsuite/Mage/Sales/Model/Order/InvoiceTest.php b/dev/tests/integration/testsuite/Mage/Sales/Model/Order/InvoiceTest.php index f0e82db4d90595f6a5b196adb521d9a42b3ddcb0..9bd044c50577357cac9291349372d9c9f1516415 100644 --- a/dev/tests/integration/testsuite/Mage/Sales/Model/Order/InvoiceTest.php +++ b/dev/tests/integration/testsuite/Mage/Sales/Model/Order/InvoiceTest.php @@ -29,6 +29,7 @@ class Mage_Sales_Model_Order_InvoiceTest extends PHPUnit_Framework_TestCase { /** * @magentoConfigFixture frontend/design/theme/full_name default/demo + * @magentoDataFixture Mage/Core/_files/frontend_default_theme.php * @magentoDataFixture Mage/Sales/_files/order.php */ public function testSendEmail() diff --git a/dev/tests/integration/testsuite/Mage/Sales/Model/Order/OrderTest.php b/dev/tests/integration/testsuite/Mage/Sales/Model/Order/OrderTest.php index 22171182e7ac69ac3a928739600b3fd512cea5b4..9bb40c745cb09841c921f930e03c40e2a0bdda9d 100644 --- a/dev/tests/integration/testsuite/Mage/Sales/Model/Order/OrderTest.php +++ b/dev/tests/integration/testsuite/Mage/Sales/Model/Order/OrderTest.php @@ -29,6 +29,7 @@ class Mage_Sales_Model_OrderTest extends PHPUnit_Framework_TestCase { /** * @magentoConfigFixture frontend/design/theme/full_name default/demo + * @magentoDataFixture Mage/Core/_files/frontend_default_theme.php * @magentoDataFixture Mage/Sales/_files/order.php */ public function testSendNewOrderEmail() diff --git a/dev/tests/integration/testsuite/Mage/Sales/Model/Order/Shipment/ApiTest.php b/dev/tests/integration/testsuite/Mage/Sales/Model/Order/Shipment/ApiTest.php index f6e72eef0568087b1659d6a0bbbe412cc3fb8c9f..7e3ecb109ed5c83adb642142b77db034fa414726 100644 --- a/dev/tests/integration/testsuite/Mage/Sales/Model/Order/Shipment/ApiTest.php +++ b/dev/tests/integration/testsuite/Mage/Sales/Model/Order/Shipment/ApiTest.php @@ -89,8 +89,8 @@ class Mage_Sales_Model_Order_Shipment_ApiTest extends PHPUnit_Framework_TestCase */ public function testAddComment() { - if (Magento_Test_Bootstrap::getInstance()->getDbVendorName() != 'mysql') { - $this->markTestIncomplete('Legacy API is expected to support MySQL only.'); + if (Magento_Test_Helper_Bootstrap::getInstance()->getDbVendorName() != 'mysql') { + $this->markTestSkipped('Legacy API is expected to support MySQL only.'); } /** Add comment to shipment via API. */ $commentText = 'Shipment test comment.'; @@ -122,8 +122,8 @@ class Mage_Sales_Model_Order_Shipment_ApiTest extends PHPUnit_Framework_TestCase */ public function testTrackOperations() { - if (Magento_Test_Bootstrap::getInstance()->getDbVendorName() != 'mysql') { - $this->markTestIncomplete('Legacy API is expected to support MySQL only.'); + if (Magento_Test_Helper_Bootstrap::getInstance()->getDbVendorName() != 'mysql') { + $this->markTestSkipped('Legacy API is expected to support MySQL only.'); } /** Prepare data. */ $carrierCode = 'ups'; @@ -238,8 +238,8 @@ class Mage_Sales_Model_Order_Shipment_ApiTest extends PHPUnit_Framework_TestCase */ public function testSendInfo() { - if (Magento_Test_Bootstrap::getInstance()->getDbVendorName() != 'mysql') { - $this->markTestIncomplete('Legacy API is expected to support MySQL only.'); + if (Magento_Test_Helper_Bootstrap::getInstance()->getDbVendorName() != 'mysql') { + $this->markTestSkipped('Legacy API is expected to support MySQL only.'); } $isSent = Magento_Test_Helper_Api::call( $this, diff --git a/dev/tests/integration/testsuite/Mage/Tag/Block/Customer/ViewTest.php b/dev/tests/integration/testsuite/Mage/Tag/Block/Customer/ViewTest.php index 878f3a5f03bd0fd4e33f9bee2d7eb604a074b79c..c6340cdf04be2776f57943de4dc8566724ec77e4 100644 --- a/dev/tests/integration/testsuite/Mage/Tag/Block/Customer/ViewTest.php +++ b/dev/tests/integration/testsuite/Mage/Tag/Block/Customer/ViewTest.php @@ -59,16 +59,19 @@ class Mage_Tag_Block_Customer_ViewTest extends PHPUnit_Framework_TestCase } /** + * @magentoAppIsolation enabled * @magentoDataFixture Mage/Catalog/_files/product_with_image.php */ public function testImage() { + Mage::getDesign()->setArea(Mage_Core_Model_App_Area::AREA_FRONTEND)->setDefaultDesignTheme(); + $product = Mage::getModel('Mage_Catalog_Model_Product'); $product->load(1); $size = $this->_block->getImageSize(); $this->assertGreaterThan(1, $size); - $this->assertContains('/'.$size, $this->_block->getImageUrl($product)); + $this->assertContains('/' . $size, $this->_block->getImageUrl($product)); $this->assertStringEndsWith('magento_image.jpg', $this->_block->getImageUrl($product)); } } diff --git a/dev/tests/integration/testsuite/Mage/User/Block/Role/Tab/EditTest.php b/dev/tests/integration/testsuite/Mage/User/Block/Role/Tab/EditTest.php index 9f79949866bbc331156ca129da5b1c9cf503de50..d34b85286ef6b9b755154fe5595102e4b9aa9c8f 100644 --- a/dev/tests/integration/testsuite/Mage/User/Block/Role/Tab/EditTest.php +++ b/dev/tests/integration/testsuite/Mage/User/Block/Role/Tab/EditTest.php @@ -32,11 +32,6 @@ class Mage_User_Block_Role_Tab_EditTest extends PHPUnit_Framework_TestCase */ protected $_block; - /** - * Mage_User_Model_Role - * - * @magentoAppIsolation enabled - */ public function setUp() { Mage::getConfig()->setCurrentAreaCode('adminhtml'); @@ -45,13 +40,7 @@ class Mage_User_Block_Role_Tab_EditTest extends PHPUnit_Framework_TestCase $roleAdmin->load(Magento_Test_Bootstrap::ADMIN_ROLE_NAME, 'role_name'); Mage::app()->getRequest()->setParam('rid', $roleAdmin->getId()); - $aclMock = $this->getMock('Magento_Acl', array(), array(), '', false); - $aclMock->expects($this->any()) - ->method('has') - ->will($this->returnValue(true)); - - $this->_block = Mage::getObjectManager()->create( - 'Mage_User_Block_Role_Tab_Edit', array('data' => array('acl' => $aclMock))); + $this->_block = Mage::getObjectManager()->create('Mage_User_Block_Role_Tab_Edit'); } protected function tearDown() @@ -59,9 +48,6 @@ class Mage_User_Block_Role_Tab_EditTest extends PHPUnit_Framework_TestCase $this->_block = null; } - /** - * @magentoAppIsolation enabled - */ public function testConstructor() { $this->assertNotEmpty($this->_block->getSelectedResources()); diff --git a/dev/tests/integration/testsuite/Mage/User/Block/User/Edit/Tab/MainTest.php b/dev/tests/integration/testsuite/Mage/User/Block/User/Edit/Tab/MainTest.php new file mode 100644 index 0000000000000000000000000000000000000000..60e45e7c0b24052f7a5a754fb3cee165a944da1c --- /dev/null +++ b/dev/tests/integration/testsuite/Mage/User/Block/User/Edit/Tab/MainTest.php @@ -0,0 +1,83 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Mage_User + * @subpackage integration_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +class Mage_User_Block_User_Edit_Tab_MainTest extends Mage_Backend_Utility_Controller +{ + /** + * @var Mage_User_Block_User_Edit_Tab_Main + */ + protected $_block; + + /** + * @var Mage_User_Model_User + */ + protected $_user; + + public function setUp() + { + parent::setUp(); + $this->_block = Mage::getObjectManager()->create('Mage_User_Block_User_Edit_Tab_Main'); + $this->_block->setArea('adminhtml'); + $this->_user = Mage::getObjectManager()->create('Mage_User_Model_User'); + Mage::register('permissions_user', $this->_user); + } + + protected function tearDown() + { + $this->_block = null; + $this->_user = null; + Mage::unregister('permissions_user'); + parent::tearDown(); + } + + public function testToHtmlPasswordFieldsExistingEntry() + { + $this->_user->loadByUsername(Magento_Test_Bootstrap::ADMIN_NAME); + $actualHtml = $this->_block->toHtml(); + $this->assertSelectCount( + 'input.required-entry[type="password"]', 0, $actualHtml, + 'All password fields have to be optional.' + ); + $this->assertSelectCount( + 'input.validate-admin-password[type="password"][name="password"]', 1, $actualHtml + ); + $this->assertSelectCount( + 'input.validate-cpassword[type="password"][name="password_confirmation"]', 1, $actualHtml + ); + } + + public function testToHtmlPasswordFieldsNewEntry() + { + $actualHtml = $this->_block->toHtml(); + $this->assertSelectCount( + 'input.validate-admin-password.required-entry[type="password"][name="password"]', 1, $actualHtml + ); + $this->assertSelectCount( + 'input.validate-cpassword.required-entry[type="password"][name="password_confirmation"]', 1, $actualHtml + ); + } +} diff --git a/dev/tests/integration/testsuite/Mage/User/Model/Resource/UserTest.php b/dev/tests/integration/testsuite/Mage/User/Model/Resource/UserTest.php new file mode 100644 index 0000000000000000000000000000000000000000..7223c5461559e972a750f9b0dbe611e5d41c1edb --- /dev/null +++ b/dev/tests/integration/testsuite/Mage/User/Model/Resource/UserTest.php @@ -0,0 +1,72 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +class Mage_User_Model_Resource_UserTest extends PHPUnit_Framework_TestCase +{ + /** @var Mage_User_Model_Resource_User */ + protected $_model; + + protected function setUp() + { + $this->_model = Mage::getResourceSingleton('Mage_User_Model_Resource_User'); + } + + protected function tearDown() + { + $this->_model = null; + } + + /** + * No node - no limitation + */ + public function testCanCreateUserTrue() + { + $this->assertTrue($this->_model->canCreateUser()); + } + + /** + * Explicit zero - don't allow creating + * + * @magentoConfigFixture global/functional_limitation/max_admin_user_count 0 + */ + public function testCanCreateUserZero() + { + $this->assertFalse($this->_model->canCreateUser()); + } + + /** + * Any other values - compare with users count + * + * @magentoConfigFixture global/functional_limitation/max_admin_user_count 1 + */ + public function testCanCreateUserFalse() + { + $this->assertFalse($this->_model->canCreateUser()); + } + + public function testGetValidationRulesBeforeSave() + { + $rules = $this->_model->getValidationRulesBeforeSave(); + $this->assertInstanceOf('Zend_Validate_Interface', $rules); + } +} diff --git a/dev/tests/integration/testsuite/Mage/User/Model/UserTest.php b/dev/tests/integration/testsuite/Mage/User/Model/UserTest.php index 20baf07b2bd423755c1122ef769129c09068c0fa..da5972c76100e8ef55cf932e16c6f6483c006a91 100644 --- a/dev/tests/integration/testsuite/Mage/User/Model/UserTest.php +++ b/dev/tests/integration/testsuite/Mage/User/Model/UserTest.php @@ -156,26 +156,6 @@ class Mage_User_Model_UserTest extends PHPUnit_Framework_TestCase $this->assertFalse($this->_model->roleUserExists()); } - /** - * @dataProvider existingUserProvider - */ - public function testUserExists($username, $email) - { - $this->_model->setUsername($username) - ->setEmail($email); - $this->assertTrue($this->_model->userExists()); - $this->_model->loadByUsername(Magento_Test_Bootstrap::ADMIN_NAME); - $this->assertFalse($this->_model->userExists()); - } - - public function existingUserProvider() - { - return array( - array('user', 'user@magento.com'), - array('user1', 'admin@example.com'), - ); - } - public function testGetCollection() { $this->assertInstanceOf('Mage_Core_Model_Resource_Db_Collection_Abstract', @@ -304,92 +284,88 @@ class Mage_User_Model_UserTest extends PHPUnit_Framework_TestCase $this->assertEmpty($this->_model->hasAssigned2Role($this->_model)); } - public function testValidateEmptyUserName() - { - $errors = $this->_model->validate(); - $this->assertContains(Mage::helper('Mage_User_Helper_Data')->__('User Name is required field.'), $errors); - } - - public function testValidateEmptyFirstName() - { - $errors = $this->_model->validate(); - $this->assertContains(Mage::helper('Mage_User_Helper_Data')->__('First Name is required field.'), $errors); - } - - public function testValidateEmptyLastName() - { - $errors = $this->_model->validate(); - $this->assertContains(Mage::helper('Mage_User_Helper_Data')->__('First Name is required field.'), $errors); - } - - public function testValidateInvalidEmail() + /** + * @expectedException Mage_Core_Exception + * @expectedExceptionMessage User Name is required field. + * @expectedExceptionMessage First Name is required field. + * @expectedExceptionMessage Last Name is required field. + * @expectedExceptionMessage Please enter a valid email. + * @expectedExceptionMessage Password is required field. + * @magentoDbIsolation enabled + */ + public function testBeforeSaveRequiredFieldsValidation() { - $this->_model->setEmail('invalid@email'); - $errors = $this->_model->validate(); - $this->assertContains(Mage::helper('Mage_User_Helper_Data')->__('Please enter a valid email.'), $errors); + $this->_model->setSomething('some_value'); // force model change + $this->_model->save(); } - public function testValidatePasswordsDontMatch() + /** + * @expectedException Mage_Core_Exception + * @expectedExceptionMessage Password confirmation must be same as password. + * @magentoDbIsolation enabled + */ + public function testBeforeSavePasswordsDoNotMatch() { - $this->_model->setNewPassword('password'); + $this->_model->setPassword('password2'); $this->_model->setPasswordConfirmation('password1'); - $errors = $this->_model->validate(); - $this->assertContains( - Mage::helper('Mage_User_Helper_Data')->__('Password confirmation must be same as password.'), - $errors - ); + $this->_model->save(); } - public function testValidatePasswordTooShort() + /** + * @expectedException Mage_Core_Exception + * @expectedExceptionMessage Password must be at least + * @magentoDbIsolation enabled + */ + public function testBeforeSavePasswordTooShort() { - $this->_model->setNewPassword('123456'); - $errors = $this->_model->validate(); - $this->assertContains( - Mage::helper('Mage_User_Helper_Data')->__( - 'Password must be at least of %d characters.', Mage_User_Model_User::MIN_PASSWORD_LENGTH - ), - $errors - ); + $this->_model->setPassword('123456'); + $this->_model->save(); } /** - * @dataProvider providerInvalidUserPasswords + * @dataProvider beforeSavePasswordInsecureDataProvider + * @expectedException Mage_Core_Exception + * @expectedExceptionMessage Password must include both numeric and alphabetic characters. + * @magentoDbIsolation enabled * @param string $password */ - public function testValidateInvalidPassword($password) + public function testBeforeSavePasswordInsecure($password) { - $this->_model->setNewPassword($password); - $errors = $this->_model->validate(); - $this->assertContains( - Mage::helper('Mage_User_Helper_Data')->__('Password must include both numeric and alphabetic characters.'), - $errors - ); + $this->_model->setPassword($password); + $this->_model->save(); } - public function providerInvalidUserPasswords() + public function beforeSavePasswordInsecureDataProvider() { - return array(array('aaaaaaaa'), array('1234567')); + return array( + 'alpha chars only' => array('aaaaaaaa'), + 'digits only' => array('1234567'), + ); } - public function testValidateExistingUser() + /** + * @expectedException Mage_Core_Exception + * @expectedExceptionMessage A user with the same user name or email already exists. + * @magentoDbIsolation enabled + */ + public function testBeforeSaveUserIdentityViolation() { $this->_model->setUsername('user'); - $errors = $this->_model->validate(); - $this->assertContains( - Mage::helper('Mage_User_Helper_Data')->__('A user with the same user name or email aleady exists.'), - $errors - ); + $this->_model->save(); } - public function testValidateOk() + /** + * @magentoDbIsolation enabled + */ + public function testBeforeSaveValidationSuccess() { $this->_model->setUsername('user1') ->setFirstname('John') ->setLastname('Doe') ->setEmail('jdoe@gmail.com') - ->setNewPassword('1234abc') + ->setPassword('1234abc') ->setPasswordConfirmation('1234abc'); - $this->assertTrue($this->_model->validate()); + $this->_model->save(); } /** diff --git a/dev/tests/integration/testsuite/Mage/User/controllers/Adminhtml/AuthControllerTest.php b/dev/tests/integration/testsuite/Mage/User/controllers/Adminhtml/AuthControllerTest.php index 1a7a41f154663218ec1299a738adb5131da806d6..ba23ccc82c9d7c67c988f789d50530ef581fac59 100644 --- a/dev/tests/integration/testsuite/Mage/User/controllers/Adminhtml/AuthControllerTest.php +++ b/dev/tests/integration/testsuite/Mage/User/controllers/Adminhtml/AuthControllerTest.php @@ -28,34 +28,8 @@ /** * Test class for Mage_User_Adminhtml_AuthController. */ -class Mage_User_Adminhtml_AuthControllerTest extends Magento_Test_TestCase_ControllerAbstract +class Mage_User_Adminhtml_AuthControllerTest extends Mage_Backend_Utility_Controller { - /** - * @var Mage_Backend_Model_Auth - */ - protected $_auth; - - - protected function tearDown() - { - $this->_auth = null; - parent::tearDown(); - } - - protected function _login() - { - Mage::getSingleton('Mage_Backend_Model_Url')->turnOffSecretKey(); - - $this->_auth = Mage::getSingleton('Mage_Backend_Model_Auth'); - $this->_auth->login(Magento_Test_Bootstrap::ADMIN_NAME, Magento_Test_Bootstrap::ADMIN_PASSWORD); - } - - protected function _logout() - { - $this->_auth->logout(); - Mage::getSingleton('Mage_Backend_Model_Url')->turnOnSecretKey(); - } - /** * Test form existence * @covers Mage_User_Adminhtml_AuthController::forgotpasswordAction @@ -88,14 +62,12 @@ class Mage_User_Adminhtml_AuthControllerTest extends Magento_Test_TestCase_Contr */ public function testResetPasswordAction() { + /** @var $user Mage_User_Model_User */ $user = Mage::getModel('Mage_User_Model_User')->loadByUsername('dummy_username'); - $resetPasswordToken = null; - if ($user->getId()) { - $resetPasswordToken = Mage::helper('Mage_User_Helper_Data') - ->generateResetPasswordLinkToken(); - $user->changeResetPasswordLinkToken($resetPasswordToken); - $user->save(); - } + $this->assertNotEmpty($user->getId(), 'Broken fixture'); + $resetPasswordToken = Mage::helper('Mage_User_Helper_Data')->generateResetPasswordLinkToken(); + $user->changeResetPasswordLinkToken($resetPasswordToken); + $user->save(); $this->getRequest() ->setQuery('token', $resetPasswordToken) @@ -117,6 +89,9 @@ class Mage_User_Adminhtml_AuthControllerTest extends Magento_Test_TestCase_Contr { $this->getRequest()->setQuery('token', 'dummy')->setQuery('id', 1); $this->dispatch('backend/admin/auth/resetpassword'); + $this->assertSessionMessages( + $this->equalTo(array('Your password reset link has expired.')), Mage_Core_Model_Message::ERROR + ); $this->assertRedirect(); } @@ -127,14 +102,12 @@ class Mage_User_Adminhtml_AuthControllerTest extends Magento_Test_TestCase_Contr */ public function testResetPasswordPostAction() { + /** @var $user Mage_User_Model_User */ $user = Mage::getModel('Mage_User_Model_User')->loadByUsername('dummy_username'); - $resetPasswordToken = null; - if ($user->getId()) { - $resetPasswordToken = Mage::helper('Mage_User_Helper_Data') - ->generateResetPasswordLinkToken(); - $user->changeResetPasswordLinkToken($resetPasswordToken); - $user->save(); - } + $this->assertNotEmpty($user->getId(), 'Broken fixture'); + $resetPasswordToken = Mage::helper('Mage_User_Helper_Data')->generateResetPasswordLinkToken(); + $user->changeResetPasswordLinkToken($resetPasswordToken); + $user->save(); $newDummyPassword = 'new_dummy_password2'; @@ -148,9 +121,8 @@ class Mage_User_Adminhtml_AuthControllerTest extends Magento_Test_TestCase_Contr $this->assertRedirect($this->equalTo(Mage::helper('Mage_Backend_Helper_Data')->getHomePageUrl())); - $user = Mage::getModel('Mage_User_Model_User') - ->loadByUsername('dummy_username'); - + /** @var $user Mage_User_Model_User */ + $user = Mage::getModel('Mage_User_Model_User')->loadByUsername('dummy_username'); $this->assertTrue(Mage::helper('Mage_Core_Helper_Data')->validateHash($newDummyPassword, $user->getPassword())); } @@ -159,11 +131,13 @@ class Mage_User_Adminhtml_AuthControllerTest extends Magento_Test_TestCase_Contr * @covers Mage_User_Adminhtml_AuthController::_validateResetPasswordLinkToken * @magentoDataFixture Mage/User/_files/dummy_user.php */ - public function testResetPaswordPostActionWithDummyToken() + public function testResetPasswordPostActionWithDummyToken() { $this->getRequest()->setQuery('token', 'dummy')->setQuery('id', 1); $this->dispatch('backend/admin/auth/resetpasswordpost'); - + $this->assertSessionMessages( + $this->equalTo(array('Your password reset link has expired.')), Mage_Core_Model_Message::ERROR + ); $this->assertRedirect($this->equalTo(Mage::helper('Mage_Backend_Helper_Data')->getHomePageUrl())); } @@ -172,7 +146,7 @@ class Mage_User_Adminhtml_AuthControllerTest extends Magento_Test_TestCase_Contr * @covers Mage_User_Adminhtml_AuthController::_validateResetPasswordLinkToken * @magentoDataFixture Mage/User/_files/dummy_user.php */ - public function testResetPaswordPostActionWithInvalidPassword() + public function testResetPasswordPostActionWithInvalidPassword() { $user = Mage::getModel('Mage_User_Model_User')->loadByUsername('dummy_username'); $resetPasswordToken = null; @@ -193,16 +167,9 @@ class Mage_User_Adminhtml_AuthControllerTest extends Magento_Test_TestCase_Contr $this->dispatch('backend/admin/auth/resetpasswordpost'); + $this->assertSessionMessages( + $this->equalTo(array('Password confirmation must be same as password.')), Mage_Core_Model_Message::ERROR + ); $this->assertRedirect(); } - - /** - * Empty data fixture to provide support of transaction - * @static - * - */ - public static function emptyDataFixture() - { - - } } diff --git a/dev/tests/integration/testsuite/Mage/User/controllers/Adminhtml/User/RoleControllerTest.php b/dev/tests/integration/testsuite/Mage/User/controllers/Adminhtml/User/RoleControllerTest.php index 6279058e3a46481082e3e5b387f55b23974459cb..45877e0b9c2fe784723224dfa1527e10d31e0291 100644 --- a/dev/tests/integration/testsuite/Mage/User/controllers/Adminhtml/User/RoleControllerTest.php +++ b/dev/tests/integration/testsuite/Mage/User/controllers/Adminhtml/User/RoleControllerTest.php @@ -40,7 +40,7 @@ class Mage_User_Adminhtml_User_RoleControllerTest extends Mage_Backend_Utility_C $this->dispatch('backend/admin/user_role/editrole'); $this->assertContains('Role Information', $this->getResponse()->getBody()); - $this->assertContains("Edit Role '" . $roleAdmin->getRoleName() . "'", $this->getResponse()->getBody()); + $this->assertContains($roleAdmin->getRoleName(), $this->getResponse()->getBody()); } /** diff --git a/dev/tests/integration/testsuite/Mage/User/controllers/Adminhtml/UserControllerTest.php b/dev/tests/integration/testsuite/Mage/User/controllers/Adminhtml/UserControllerTest.php index 8464d258fcdad2f93a7d4a39782967651b4f535e..07f656e6c6c91080ddc1bb9c102309be0019b023 100644 --- a/dev/tests/integration/testsuite/Mage/User/controllers/Adminhtml/UserControllerTest.php +++ b/dev/tests/integration/testsuite/Mage/User/controllers/Adminhtml/UserControllerTest.php @@ -27,18 +27,92 @@ class Mage_User_Adminhtml_UserControllerTest extends Mage_Backend_Utility_Controller { + public function testIndexAction() + { + $this->dispatch('backend/admin/user/index'); + $response = $this->getResponse()->getBody(); + $this->assertContains('Users', $response); + $this->assertSelectCount('#permissionsUserGrid_table', 1, $response); + } + /** - * @covers Mage_User_Adminhtml_UserController::indexAction + * @magentoConfigFixture global/functional_limitation/max_admin_user_count 1 */ - public function testIndexAction() + public function testIndexActionLimitedUsers() { $this->dispatch('backend/admin/user/index'); - $this->assertStringMatchesFormat('%a<div class="content-header">%aUsers%a', $this->getResponse()->getBody()); + $response = $this->getResponse()->getBody(); + $this->assertNotContains('Add New User', $response); + $this->assertContains(Mage_User_Model_Resource_User::getMessageUserCreationProhibited(), $response); + } + + public function testSaveActionNoData() + { + $this->dispatch('backend/admin/user/save'); + $this->assertRedirect($this->stringContains('backend/admin/user/index/')); + } + + /** + * @magentoDataFixture Mage/User/_files/dummy_user.php + */ + public function testSaveActionWrongId() + { + /** @var $user Mage_User_Model_User */ + $user = Mage::getModel('Mage_User_Model_User')->loadByUsername('dummy_username'); + $userId = $user->getId(); + $this->assertNotEmpty($userId, 'Broken fixture'); + $user->delete(); + $this->getRequest()->setPost('user_id', $userId); + $this->dispatch('backend/admin/user/save'); + $this->assertSessionMessages( + $this->equalTo(array('This user no longer exists.')), Mage_Core_Model_Message::ERROR + ); + $this->assertRedirect($this->stringContains('backend/admin/user/index/')); + } + + /** + * @magentoDbIsolation enabled + */ + public function testSaveAction() + { + $this->_createNew(); + $this->assertSessionMessages( + $this->equalTo(array('The user has been saved.')), Mage_Core_Model_Message::SUCCESS + ); + $this->assertRedirect($this->stringContains('backend/admin/user/index/')); + } + + /** + * Create new user through dispatching save action + */ + private function _createNew() + { + $fixture = uniqid(); + $this->getRequest()->setPost(array( + 'username' => $fixture, + 'email' => "{$fixture}@example.com", + 'firstname' => 'First', + 'lastname' => 'Last', + 'password' => 'password_with_1_number', + 'password_confirmation' => 'password_with_1_number', + )); + $this->dispatch('backend/admin/user/save'); } /** - * @covers Mage_User_Adminhtml_UserController::rolesGridAction + * @magentoDbIsolation enabled + * @magentoConfigFixture global/functional_limitation/max_admin_user_count 1 */ + public function testSaveActionLimitedUsers() + { + $this->_createNew(); + $this->assertSessionMessages( + $this->equalTo(array('You are using the maximum number of admin accounts allowed.')), + Mage_Core_Model_Message::ERROR + ); + $this->assertRedirect($this->stringContains('backend/admin/user/edit/')); + } + public function testRoleGridAction() { $this->getRequest() @@ -49,9 +123,6 @@ class Mage_User_Adminhtml_UserControllerTest extends Mage_Backend_Utility_Contro $this->assertStringMatchesFormat($expected, $this->getResponse()->getBody()); } - /** - * @covers Mage_User_Adminhtml_UserController::rolesGridAction - */ public function testRolesGridAction() { $this->getRequest() @@ -63,14 +134,14 @@ class Mage_User_Adminhtml_UserControllerTest extends Mage_Backend_Utility_Contro $this->assertStringMatchesFormat($expected, $this->getResponse()->getBody()); } - /** - * @covers Mage_User_Adminhtml_UserController::editAction - */ public function testEditAction() { $this->getRequest()->setParam('user_id', 1); $this->dispatch('backend/admin/user/edit'); - $expected = '%a<h3 class="icon-head head-user">Edit User%a'; - $this->assertStringMatchesFormat($expected, $this->getResponse()->getBody()); + $response = $this->getResponse()->getBody(); + //check "User Information" header and fieldset + $this->assertContains('data-ui-id="adminhtml-user-edit-tabs-title"', $response); + $this->assertContains('User Information', $response); + $this->assertSelectCount('#user_base_fieldset', 1, $response); } } diff --git a/dev/tests/integration/testsuite/Mage/Widget/Block/Adminhtml/Widget/Instance/Edit/Tab/Main/LayoutTest.php b/dev/tests/integration/testsuite/Mage/Widget/Block/Adminhtml/Widget/Instance/Edit/Tab/Main/LayoutTest.php index 36717d995f7cfb18d636303413c0e32ed0d88221..ada1fae53044af8ac1b3c8a6a0515d7569cc4767 100644 --- a/dev/tests/integration/testsuite/Mage/Widget/Block/Adminhtml/Widget/Instance/Edit/Tab/Main/LayoutTest.php +++ b/dev/tests/integration/testsuite/Mage/Widget/Block/Adminhtml/Widget/Instance/Edit/Tab/Main/LayoutTest.php @@ -47,8 +47,13 @@ class Mage_Widget_Block_Adminhtml_Widget_Instance_Edit_Tab_Main_LayoutTest exten $this->_block = null; } + /** + * @magentoAppIsolation enabled + */ public function testGetLayoutsChooser() { + Mage::getDesign()->setArea(Mage_Core_Model_App_Area::AREA_FRONTEND)->setDefaultDesignTheme(); + $actualHtml = $this->_block->getLayoutsChooser(); $this->assertStringStartsWith('<select ', $actualHtml); $this->assertStringEndsWith('</select>', $actualHtml); diff --git a/dev/tests/integration/testsuite/Mage/Widget/Model/WidgetTest.php b/dev/tests/integration/testsuite/Mage/Widget/Model/WidgetTest.php index 819215a9309c3a7723079a104443afb461726c3e..e505da62dc03d85851bfc2925bb203a2f928252d 100644 --- a/dev/tests/integration/testsuite/Mage/Widget/Model/WidgetTest.php +++ b/dev/tests/integration/testsuite/Mage/Widget/Model/WidgetTest.php @@ -66,11 +66,11 @@ class Mage_Widget_Model_WidgetTest extends PHPUnit_Framework_TestCase public function testGetPlaceholderImageUrl($type, $expectedFile) { Mage::getDesign()->setDesignTheme('default/basic', 'adminhtml'); - $expectedPubFile = Mage::getBaseDir('media') . "/theme/adminhtml/default/basic/en_US/{$expectedFile}"; + $expectedPubFile = Mage::getBaseDir('media') . "/theme/static/adminhtml/default/basic/en_US/{$expectedFile}"; if (file_exists($expectedPubFile)) { unlink($expectedPubFile); } - + $expectedPubFile = str_replace('/', DIRECTORY_SEPARATOR, $expectedPubFile); $url = $this->_model->getPlaceholderImageUrl($type); $this->assertStringEndsWith($expectedFile, $url); $this->assertFileExists($expectedPubFile); @@ -102,7 +102,7 @@ class Mage_Widget_Model_WidgetTest extends PHPUnit_Framework_TestCase */ public function testGetPlaceholderImageUrlAtTheme() { - Magento_Test_Bootstrap::getInstance()->reinitialize(array( + Magento_Test_Helper_Bootstrap::getInstance()->reinitialize(array( Mage_Core_Model_App::INIT_OPTION_DIRS => array( Mage_Core_Model_Dir::THEMES => dirname(__DIR__) . '/_files/design' ) diff --git a/dev/tests/integration/testsuite/Mage/Widget/controllers/Adminhtml/WidgetControllerTest.php b/dev/tests/integration/testsuite/Mage/Widget/controllers/Adminhtml/WidgetControllerTest.php index 458d83007f3b1e3255253e289f224e788cbe80b0..6a1e063e207b69a2e1aa7f95ccb1cfc56eace2e4 100644 --- a/dev/tests/integration/testsuite/Mage/Widget/controllers/Adminhtml/WidgetControllerTest.php +++ b/dev/tests/integration/testsuite/Mage/Widget/controllers/Adminhtml/WidgetControllerTest.php @@ -35,6 +35,8 @@ class Mage_Widget_Adminhtml_WidgetControllerTest extends Mage_Backend_Utility_Co $this->getRequest()->setPost('widget', '{"widget_type":"Mage_Cms_Block_Widget_Page_Link","values":{}}'); $this->dispatch('backend/admin/widget/loadOptions'); $output = $this->getResponse()->getBody(); - $this->assertRegExp('/<label for="options_fieldset[a-z\d]+_page_id"[^>]*>CMS Page/', $output); + //searching for label with text "CMS Page" + $this->assertContains('data-ui-id="wysiwyg-widget-options-fieldset-element-label-parameters-page-id-label" >' + . '<span>CMS Page', $output); } } diff --git a/dev/tests/integration/testsuite/Mage/Wishlist/Block/AbstractTest.php b/dev/tests/integration/testsuite/Mage/Wishlist/Block/AbstractTest.php index d2ff23e03d88591789f053330bbe0c46a15ea5b2..75986b558d7ab0ba71af4613aa276b22c548f9ea 100644 --- a/dev/tests/integration/testsuite/Mage/Wishlist/Block/AbstractTest.php +++ b/dev/tests/integration/testsuite/Mage/Wishlist/Block/AbstractTest.php @@ -61,10 +61,13 @@ class Mage_Wishlist_Block_AbstractTest extends PHPUnit_Framework_TestCase } /** + * @magentoAppIsolation enabled * @magentoDataFixture Mage/Catalog/_files/product_with_image.php + * @magentoDataFixture Mage/Core/_files/frontend_default_theme.php */ public function testImage() { + Mage::getDesign()->setArea(Mage_Core_Model_App_Area::AREA_FRONTEND)->setDefaultDesignTheme(); $product = Mage::getModel('Mage_Catalog_Model_Product'); $product->load(1); diff --git a/dev/tests/integration/testsuite/MageTest.php b/dev/tests/integration/testsuite/MageTest.php index 739b99f778d4e5b4520355de90eda0792a691ba9..67bc97a728bb8e5eeab85291f94fcaad22c9d7d5 100644 --- a/dev/tests/integration/testsuite/MageTest.php +++ b/dev/tests/integration/testsuite/MageTest.php @@ -88,7 +88,7 @@ class MageTest extends PHPUnit_Framework_TestCase public function testLogWrapper() { // @magentoConfigFixture is applied after initialization, so we need to do this again - Magento_Test_Bootstrap::getInstance()->reinitialize(); + Magento_Test_Helper_Bootstrap::getInstance()->reinitialize(); $this->expectOutputRegex('/test/'); Mage::log('test'); } @@ -110,7 +110,7 @@ class MageTest extends PHPUnit_Framework_TestCase public function testLogUnsupportedWrapper() { // initialize again, because config fixture is applied after initialization - Magento_Test_Bootstrap::getInstance()->reinitialize(); + Magento_Test_Helper_Bootstrap::getInstance()->reinitialize(); $logEntry = microtime(); Mage::log($logEntry); $logFile = Mage::getBaseDir('log') . '/system.log'; @@ -126,7 +126,7 @@ class MageTest extends PHPUnit_Framework_TestCase public function testLogException() { // reinitialization is needed here, too - Magento_Test_Bootstrap::getInstance()->reinitialize(); + Magento_Test_Helper_Bootstrap::getInstance()->reinitialize(); $msg = uniqid(); $exception = new Exception((string)$msg); Mage::logException($exception); diff --git a/dev/tests/integration/testsuite/MemoryUsageTest.php b/dev/tests/integration/testsuite/MemoryUsageTest.php index 92b80dfade938f040054b61b6f8d6621320eaf4d..896d6e3ed423de583ca9db5a57d0e933a66e2e9b 100644 --- a/dev/tests/integration/testsuite/MemoryUsageTest.php +++ b/dev/tests/integration/testsuite/MemoryUsageTest.php @@ -32,18 +32,28 @@ class MemoryUsageTest extends PHPUnit_Framework_TestCase */ const APP_REINITIALIZATION_LOOPS = 20; + /** + * @var Magento_Test_Helper_Memory + */ + protected $_helper; + + protected function setUp() + { + $this->_helper = new Magento_Test_Helper_Memory(new Magento_Shell); + } + /** * Test that application reinitialization produces no memory leaks */ public function testAppReinitializationNoMemoryLeak() { $this->_deallocateUnusedMemory(); - $actualMemoryUsage = $this->_getRealMemoryUsage(); + $actualMemoryUsage = $this->_helper->getRealMemoryUsage(); for ($i = 0; $i < self::APP_REINITIALIZATION_LOOPS; $i++) { - Magento_Test_Bootstrap::getInstance()->reinitialize(); + Magento_Test_Helper_Bootstrap::getInstance()->reinitialize(); $this->_deallocateUnusedMemory(); } - $actualMemoryUsage = $this->_getRealMemoryUsage() - $actualMemoryUsage; + $actualMemoryUsage = $this->_helper->getRealMemoryUsage() - $actualMemoryUsage; $this->assertLessThanOrEqual($this->_getAllowedMemoryUsage(), $actualMemoryUsage, sprintf( "Application reinitialization causes the memory leak of %u bytes per %u iterations.", $actualMemoryUsage, @@ -67,126 +77,9 @@ class MemoryUsageTest extends PHPUnit_Framework_TestCase protected function _getAllowedMemoryUsage() { // Memory usage limits should not be further increased, corresponding memory leaks have to be fixed instead! - if ($this->_isWindowsOs()) { - return $this->_convertToBytes('1M'); + if (Magento_Test_Helper_Memory::isWindowsOs()) { + return Magento_Test_Helper_Memory::convertToBytes('1M'); } return 0; } - - /** - * Whether the operating system belongs to the Windows family - * - * @link http://php.net/manual/en/function.php-uname.php - * @return bool - */ - protected function _isWindowsOs() - { - return (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'); - } - - /** - * Retrieve the effective memory usage of the current process - * - * memory_get_usage() cannot be used because of the bug - * @link https://bugs.php.net/bug.php?id=62467 - * - * @return int Memory usage in bytes - */ - protected function _getRealMemoryUsage() - { - $pid = getmypid(); - $shell = new Magento_Shell(); - if ($this->_isWindowsOs()) { - $result = $this->_getWinProcessMemoryUsage($shell, $pid); - } else { - $result = $this->_getUnixProcessMemoryUsage($shell, $pid); - } - return $result; - } - - /** - * Retrieve the current process' memory usage using Unix command line interface - * - * @param Magento_Shell $shell - * @param int $pid - * @return int Memory usage in bytes - */ - protected function _getUnixProcessMemoryUsage(Magento_Shell $shell, $pid) - { - /** - * @link http://linux.die.net/man/1/top - * - * Output format invariant: - * PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND - * 12345 root 20 0 215m 36m 10m S 98 0.5 0:32.96 php - */ - $output = $shell->execute('top -p %s -n 1 -b | grep PID -A 1', array($pid)); - - $output = preg_split('/\n+/', $output, -1, PREG_SPLIT_NO_EMPTY); - $keys = preg_split('/\s+/', $output[0], -1, PREG_SPLIT_NO_EMPTY); - $values = preg_split('/\s+/', $output[1], -1, PREG_SPLIT_NO_EMPTY); - $stats = array_combine($keys, $values); - - $result = $stats['RES']; // resident set size, the non-swapped physical memory - - if (is_numeric($result)) { - $result .= 'k'; // kilobytes by default - } - - return $this->_convertToBytes($result); - } - - /** - * Retrieve the current process' memory usage using Windows command line interface - * - * @param Magento_Shell $shell - * @param int $pid - * @return int Memory usage in bytes - */ - protected function _getWinProcessMemoryUsage(Magento_Shell $shell, $pid) - { - /** - * @link http://technet.microsoft.com/en-us/library/bb491010.aspx - * - * Output format invariant: - * "Image Name","PID","Session Name","Session#","Mem Usage" - * "php.exe","12345","N/A","0","26,321 K" - */ - $output = $shell->execute('tasklist /fi %s /fo CSV', array("PID eq $pid")); - - /** @link http://www.php.net/manual/en/wrappers.data.php */ - $csvStream = 'data://text/plain;base64,' . base64_encode($output); - $csvHandle = fopen($csvStream, 'r'); - $keys = fgetcsv($csvHandle); - $values = fgetcsv($csvHandle); - fclose($csvHandle); - $stats = array_combine($keys, $values); - - $result = $stats['Mem Usage']; - - return $this->_convertToBytes($result); - } - - /** - * Convert a number optionally followed by the unit symbol (B, K, M, G, etc.) to bytes - * - * @param string $number String representation of a number - * @return int - * @throws InvalidArgumentException - */ - protected function _convertToBytes($number) - { - $number = str_replace(array(',', ' '), '', $number); - $number = strtoupper($number); - $units = 'BKMGTPEZY'; - if (!preg_match("/^(\d+(?:\.\d+)?)([$units]?)$/", $number, $matches)) { - throw new InvalidArgumentException("Number format '$number' is not recognized."); - } - $result = (float)$matches[1]; - $unitSymbol = $matches[2]; - if ($unitSymbol) { - $result *= pow(1024, strpos($units, $unitSymbol)); - } - return (int)$result; - } } diff --git a/dev/tests/integration/testsuite/Varien/Db/Adapter/Pdo/MysqlTest.php b/dev/tests/integration/testsuite/Varien/Db/Adapter/Pdo/MysqlTest.php index 0036e5e65ed967d0ee2a991e6b0080706dccba02..c7feb9cb9b26ba01eb4cdc93d04a1d8ecf79539d 100644 --- a/dev/tests/integration/testsuite/Varien/Db/Adapter/Pdo/MysqlTest.php +++ b/dev/tests/integration/testsuite/Varien/Db/Adapter/Pdo/MysqlTest.php @@ -49,7 +49,7 @@ class Varien_Db_Adapter_Pdo_MysqlTest extends PHPUnit_Framework_TestCase */ public function testWaitTimeout() { - if (Magento_Test_Bootstrap::getInstance()->getDbVendorName() != 'mysql') { + if (Magento_Test_Helper_Bootstrap::getInstance()->getDbVendorName() != 'mysql') { $this->markTestSkipped('Test is designed to run on MySQL only.'); } if (!($this->_getDbAdapter() instanceof Varien_Db_Adapter_Pdo_Mysql)) { diff --git a/dev/tests/integration/testsuite/Varien/Image/Adapter/InterfaceTest.php b/dev/tests/integration/testsuite/Varien/Image/Adapter/InterfaceTest.php index 68e2c2857066d24754f82fd97a50d257675d5a67..e62df919b3cba81d996be157d9d071978769485c 100644 --- a/dev/tests/integration/testsuite/Varien/Image/Adapter/InterfaceTest.php +++ b/dev/tests/integration/testsuite/Varien/Image/Adapter/InterfaceTest.php @@ -244,7 +244,7 @@ class Varien_Image_Adapter_InterfaceTest extends PHPUnit_Framework_TestCase public function saveDataProvider() { - $dir = Magento_Test_Bootstrap::getInstance()->getInstallDir() . DIRECTORY_SEPARATOR; + $dir = Magento_Test_Helper_Bootstrap::getInstance()->getAppInstallDir() . DIRECTORY_SEPARATOR; return $this->_prepareData(array( array( $this->_getFixture('image_adapters_test.png'), diff --git a/dev/tests/integration/testsuite/integrity/modular/TemplateFilesTest.php b/dev/tests/integration/testsuite/integrity/modular/TemplateFilesTest.php index 4df52e3ad6d66e2abb3ad3417fdf82837d7b3d93..8776c14317eda7d85ca0d9a4532b35d42c75d341 100644 --- a/dev/tests/integration/testsuite/integrity/modular/TemplateFilesTest.php +++ b/dev/tests/integration/testsuite/integrity/modular/TemplateFilesTest.php @@ -55,40 +55,64 @@ class Integrity_Modular_TemplateFilesTest extends Magento_Test_TestCase_Integrit */ public function allTemplatesDataProvider() { - /** @var $website Mage_Core_Model_Website */ - $website = Mage::getModel('Mage_Core_Model_Website'); - Mage::app()->getStore()->setWebsiteId(0); + $blockClass = ''; + try { + /** @var $website Mage_Core_Model_Website */ + Mage::app()->getStore()->setWebsiteId(0); - $templates = array(); - foreach (Utility_Classes::collectModuleClasses('Block') as $blockClass => $module) { - if (!in_array($module, $this->_getEnabledModules())) { - continue; - } - $class = new ReflectionClass($blockClass); - if ($class->isAbstract() || !$class->isSubclassOf('Mage_Core_Block_Template')) { - continue; - } + $templates = array(); + foreach (Utility_Classes::collectModuleClasses('Block') as $blockClass => $module) { + if ($this->_isClassBroken($blockClass)) { + continue; + } + if (!in_array($module, $this->_getEnabledModules())) { + continue; + } + $class = new ReflectionClass($blockClass); + if ($class->isAbstract() || !$class->isSubclassOf('Mage_Core_Block_Template')) { + continue; + } - $area = 'frontend'; - if ($module == 'Mage_Install') { - $area = 'install'; - } elseif ($module == 'Mage_Adminhtml' || strpos($blockClass, '_Adminhtml_') - || strpos($blockClass, '_Backend_') - || ($this->_isClassInstanceOf($blockClass, 'Mage_Backend_Block_Template')) - ) { - $area = 'adminhtml'; - } + $area = 'frontend'; + if ($module == 'Mage_Install') { + $area = 'install'; + } elseif ($module == 'Mage_Adminhtml' || strpos($blockClass, '_Adminhtml_') + || strpos($blockClass, '_Backend_') + || ($this->_isClassInstanceOf($blockClass, 'Mage_Backend_Block_Template')) + ) { + $area = 'adminhtml'; + } - Mage::getConfig()->setCurrentAreaCode($area); + Mage::getConfig()->setCurrentAreaCode($area); - $block = Mage::getModel($blockClass); - $template = $block->getTemplate(); - if ($template) { - $templates[$module . ', ' . $template . ', ' . $blockClass . ', ' . $area] = - array($module, $template, $blockClass, $area); + $block = Mage::getModel($blockClass); + $template = $block->getTemplate(); + if ($template) { + $templates[$module . ', ' . $template . ', ' . $blockClass . ', ' . $area] = + array($module, $template, $blockClass, $area); + } } + return $templates; + } catch (Exception $e) { + trigger_error("Corrupted data provider. Last known block instantiation attempt: '{$blockClass}'." + . " Exception: {$e}", E_USER_ERROR); } - return $templates; + } + + /** + * Temporary stub for classes that trigger errors on attempt to instantiate + * + * @bug MAGETWO-7377 + * @param string $class + * @return bool + */ + private function _isClassBroken($class) + { + return in_array($class, array( + 'Mage_Theme_Block_Adminhtml_Wysiwyg_Files_Content', + 'Mage_Theme_Block_Adminhtml_Wysiwyg_Files_Tree', + 'Mage_Theme_Block_Adminhtml_Wysiwyg_Files_Content_Uploader', + )); } /** diff --git a/dev/tests/js/testsuite/mage/design_editor/container-test.js b/dev/tests/js/testsuite/mage/design_editor/container-test.js index 5000a304e5222b5d0b67d3cc2769e88dfcd1215a..9cd85a1f4f90401a8f755adfcbc29918b3eb3a2c 100644 --- a/dev/tests/js/testsuite/mage/design_editor/container-test.js +++ b/dev/tests/js/testsuite/mage/design_editor/container-test.js @@ -57,10 +57,11 @@ ContainerTest.prototype.testStartCallback = function() { item: container }; var startCallback = container.vde_container('option', 'start'); + assertNotEquals(uiMock.helper.outerHeight(true) + 'px', container.css('min-height')); startCallback('start', uiMock); - assertEquals(false, 0 == uiMock.placeholder.outerHeight()); + assertEquals(uiMock.helper.outerHeight(true) + 'px', container.css('min-height')); var connectedWithOtherContainers = container.vde_container('option', 'connectWith').size() > 0; - assertEquals(true, connectedWithOtherContainers); + assertTrue(connectedWithOtherContainers); containers.vde_container('destroy'); }; ContainerTest.prototype.testOverCallback = function() { @@ -68,16 +69,22 @@ ContainerTest.prototype.testOverCallback = function() { var container = jQuery("#container").vde_container(); var hoverClass = container.vde_container('option', 'hoverClass'); var overCallback = container.vde_container('option', 'over'); - overCallback('over', {}); - assertEquals(true, container.hasClass(hoverClass)); + var helperHeight = 100; + var uiMock = { + helper: jQuery('<div />', {height: helperHeight}) + }; + overCallback('over', uiMock); + assertTrue(container.hasClass(hoverClass)); + assertEquals(container.css('min-height'), uiMock.helper.outerHeight(true) + 'px'); container.vde_container('destroy'); }; -ContainerTest.prototype.testOutCallback = function() { +// "out" callback is deprecated and was replaced by "stop" callback +ContainerTest.prototype.testStopCallback = function() { /*:DOC += <div class="vde_element_wrapper vde_container" id="container" /> */ var container = jQuery("#container").vde_container(); var hoverClass = container.vde_container('option', 'hoverClass'); - var outCallback = container.vde_container('option', 'out'); - outCallback('out', {}); - assertEquals(false, container.hasClass(hoverClass)); + var stopCallback = container.vde_container('option', 'stop'); + stopCallback('stop', {}); + assertFalse(container.hasClass(hoverClass)); container.vde_container('destroy'); }; diff --git a/dev/tests/js/testsuite/mage/validation/validate-test.js b/dev/tests/js/testsuite/mage/validation/validate-test.js index 04ada0019ab465e4b291ef2c9569348105e213e8..8757ea5e9dcbb32cd018221cae9081374c963261 100644 --- a/dev/tests/js/testsuite/mage/validation/validate-test.js +++ b/dev/tests/js/testsuite/mage/validation/validate-test.js @@ -51,10 +51,11 @@ MageValidationTest.prototype.testValidateSelect = function () { }; MageValidationTest.prototype.testValidateNotEmpty = function () { - assertEquals(true, $.validator.methods['validate-no-empty'].call(this, "")); - assertEquals(true, $.validator.methods['validate-no-empty'].call(this, null)); - assertEquals(true, $.validator.methods['validate-no-empty'].call(this, undefined)); - assertEquals(true, $.validator.methods['validate-no-empty'].call(this, " ")); + assertFalse($.validator.methods['validate-no-empty'].call(this, "")); + assertFalse($.validator.methods['validate-no-empty'].call(this, null)); + assertFalse($.validator.methods['validate-no-empty'].call(this, undefined)); + assertFalse($.validator.methods['validate-no-empty'].call(this, " ")); + assertTrue($.validator.methods['validate-no-empty'].call(this, "test")); }; MageValidationTest.prototype.testValidateAlphanumWithSpaces = function () { diff --git a/dev/tests/static/testsuite/Legacy/_files/obsolete_classes.php b/dev/tests/static/testsuite/Legacy/_files/obsolete_classes.php index b8d72cb763ad9f3132b4c66a0e241c91537b323c..bf6dca5ff6399f16c304aa241e73bf930d68b2dd 100644 --- a/dev/tests/static/testsuite/Legacy/_files/obsolete_classes.php +++ b/dev/tests/static/testsuite/Legacy/_files/obsolete_classes.php @@ -56,7 +56,7 @@ return array( array('Mage_Admin_Model_Resource_Rules_Collection', 'Mage_User_Model_Resource_Rules_Collection'), array('Mage_Admin_Model_Resource_Permissions_Collection', 'Mage_User_Model_Resource_Permissions_Collection'), - array('Mage_Adminhtml_Block_Abstract', 'Mage_Core_Block_Template'), + array('Mage_Adminhtml_Block_Abstract', 'Mage_Backend_Block_Abstract'), array('Mage_Adminhtml_Block_Api_Edituser'), array('Mage_Adminhtml_Block_Api_Tab_Userroles'), array('Mage_Adminhtml_Block_Backup_Grid'), @@ -65,9 +65,6 @@ return array( array('Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Super_Config_Grid'), array('Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Super_Group_Grid'), array('Mage_Adminhtml_Block_Catalog_Search_Grid'), - array('Mage_Adminhtml_Block_Html_Date', 'Mage_Core_Block_Html_Date'), - array('Mage_Adminhtml_Block_Html_Select', 'Mage_Core_Block_Html_Select'), - array('Mage_Adminhtml_Block_Messages', 'Mage_Core_Block_Messages'), array('Mage_Adminhtml_Block_Newsletter_Problem_Grid'), array('Mage_Adminhtml_Block_Newsletter_Queue'), array('Mage_Adminhtml_Block_Newsletter_Queue_Grid'), @@ -94,6 +91,8 @@ return array( array('Mage_Adminhtml_Block_Permissions_Edituser'), array('Mage_Adminhtml_Block_Permissions_Tab_Userroles'), array('Mage_Adminhtml_Block_Permissions_Usernroles'), + array('Mage_Adminhtml_Block_Rating_Grid'), + array('Mage_Adminhtml_Block_System_Store_Grid'), array('Mage_Adminhtml_Permissions_UserController'), array('Mage_Adminhtml_Permissions_RoleController'), array('Mage_Adminhtml_Block_Report_Grid', 'Mage_Reports_Block_Adminhtml_Grid'), @@ -104,6 +103,7 @@ return array( array('Mage_Adminhtml_Block_Report_Customer_Totals_Grid'), array('Mage_Adminhtml_Block_Report_Product_Sold', 'Mage_Reports_Block_Adminhtml_Product_Sold'), array('Mage_Adminhtml_Block_Report_Product_Sold_Grid'), + array('Mage_Adminhtml_Block_Report_Review_Customer_Grid'), array('Mage_Adminhtml_Block_Report_Customer_Orders', 'Mage_Reports_Block_Adminhtml_Customer_Orders'), array('Mage_Adminhtml_Block_Report_Customer_Orders_Grid'), array('Mage_Adminhtml_Block_Report_Product_Ordered'), @@ -111,6 +111,7 @@ return array( array('Mage_Adminhtml_Block_Report_Review_Product_Grid'), array('Mage_Adminhtml_Block_Report_Refresh_Statistics', 'Mage_Reports_Block_Adminhtml_Refresh_Statistics'), array('Mage_Adminhtml_Block_Report_Refresh_Statistics_Grid'), + array('Mage_Adminhtml_Block_Report_Search_Grid'), array('Mage_Adminhtml_Block_Sales'), array('Mage_Adminhtml_Block_Sales_Order_Create_Search_Grid_Renderer_Giftmessage'), array('Mage_Adminhtml_Block_Sitemap_Grid'), @@ -548,7 +549,6 @@ return array( 'Mage_Backend_Model_Config_Source_Yesnocustom' ), array('Mage_Adminhtml_Model_System_Store', 'Mage_Core_Model_System_Store'), - array('Mage_Adminhtml_Block_System_Store_Grid'), array('Mage_Adminhtml_Model_Url', 'Mage_Backend_Model_Url'), array('Mage_Adminhtml_Rss_CatalogController'), array('Mage_Adminhtml_Rss_OrderController'), @@ -594,6 +594,7 @@ return array( array('Mage_GiftMessage_Model_Entity_Attribute_Source_Boolean_Config'), array('Mage_GoogleOptimizer_IndexController', 'Mage_GoogleOptimizer_Adminhtml_Googleoptimizer_IndexController'), + array('Mage_GoogleShopping_Block_Adminhtml_Types_Grid'), array('Mage_ImportExport_Model_Import_Adapter_Abstract', 'Mage_ImportExport_Model_Import_SourceAbstract'), array('Mage_ImportExport_Model_Import_Adapter_Csv', @@ -684,7 +685,13 @@ return array( array('Mage_Sales_Model_Entity_Sale_Collection'), array('Mage_Sales_Model_Entity_Setup'), array('Mage_Shipping_ShippingController'), + array('Mage_Tag_Block_Adminhtml_Report_Customer_Detail_Grid'), + array('Mage_Tag_Block_Adminhtml_Report_Customer_Grid'), + array('Mage_Tag_Block_Adminhtml_Report_Popular_Detail_Grid'), + array('Mage_Tag_Block_Adminhtml_Report_Product_Detail_Grid'), + array('Mage_Tag_Block_Adminhtml_Report_Product_Grid'), array('Mage_Tag_Block_Customer_Edit'), + array('Mage_Theme_Block_Adminhtml_System_Design_Theme_Grid'), array('Mage_User_Block_Role_Grid'), array('Mage_User_Block_User_Grid'), array('Mage_User_Model_Roles'), diff --git a/dev/tests/static/testsuite/Legacy/_files/obsolete_methods.php b/dev/tests/static/testsuite/Legacy/_files/obsolete_methods.php index 7112523adc11a575fe77dded8e3f41936c579599..8fdd3b373742d37033523ea17a97d3c0b4c6824a 100644 --- a/dev/tests/static/testsuite/Legacy/_files/obsolete_methods.php +++ b/dev/tests/static/testsuite/Legacy/_files/obsolete_methods.php @@ -435,4 +435,13 @@ return array( array('getButtonsHtml', 'Mage_Bundle_Block_Adminhtml_Catalog_Product_Edit_Tab_Bundle_Option_Search'), array('getHeaderCssClass', 'Mage_Bundle_Block_Adminhtml_Catalog_Product_Edit_Tab_Bundle_Option_Search'), array('superGroupGridOnlyAction', 'Mage_Adminhtml_Catalog_ProductController'), + array('getInstance', 'Magento_Test_Bootstrap', 'Magento_Test_Helper_Bootstrap::getInstance'), + array('setInstance', 'Magento_Test_Bootstrap', 'Magento_Test_Helper_Bootstrap::setInstance'), + array('canTestHeaders', 'Magento_Test_Bootstrap', 'Magento_Test_Helper_Bootstrap::canTestHeaders'), + array('getInstallDir', 'Magento_Test_Bootstrap', 'Magento_Test_Helper_Bootstrap::getAppInstallDir'), + array('getInitParams', 'Magento_Test_Bootstrap', 'Magento_Test_Helper_Bootstrap::getAppInitParams'), + array('getDbVendorName', 'Magento_Test_Bootstrap', 'Magento_Test_Helper_Bootstrap::getDbVendorName'), + array('reinitialize', 'Magento_Test_Bootstrap', 'Magento_Test_Helper_Bootstrap::reinitialize'), + array('runApp', 'Magento_Test_Bootstrap', 'Magento_Test_Helper_Bootstrap::runApp'), + array('getTestsDir', 'Magento_Test_Bootstrap'), ); diff --git a/dev/tests/static/testsuite/Php/_files/blacklist/common.txt b/dev/tests/static/testsuite/Php/_files/blacklist/common.txt index fd9c398bc5abf298095dab95e748aa13a0f4551b..2bb6727ca99c455aabb7cc873f20d805cc681633 100644 --- a/dev/tests/static/testsuite/Php/_files/blacklist/common.txt +++ b/dev/tests/static/testsuite/Php/_files/blacklist/common.txt @@ -16,3 +16,6 @@ dev/tests/integration/testsuite/Mage/Backend/Block/System/Config/FormStub.php dev/tests/integration/tmp dev/tests/static/testsuite/Php/Exemplar/_files/phpcs/input dev/tests/static/testsuite/Php/Exemplar/_files/phpmd/input +app/code/core/Mage/Backend/view +app/code/core/Mage/Theme/view/adminhtml/tabs/fieldset/js_items.phtml +app/code/core/Mage/Theme/view/adminhtml/browser/content/files.phtml diff --git a/dev/tests/static/testsuite/Php/_files/whitelist/common.txt b/dev/tests/static/testsuite/Php/_files/whitelist/common.txt index 339d7620651cbf60b8f6d293cbade0dc991ebd65..4e57ef633d64a719cbc404c61acd7cd8e549760b 100644 --- a/dev/tests/static/testsuite/Php/_files/whitelist/common.txt +++ b/dev/tests/static/testsuite/Php/_files/whitelist/common.txt @@ -50,6 +50,9 @@ app/code/core/Mage/Core/Model/Resource/Theme.php app/code/core/Mage/Core/Model/ShellAbstract.php app/code/core/Mage/Core/Model/Theme/Validator.php app/code/core/Mage/Core/Model/Theme.php +app/code/core/Mage/Core/Model/Translate.php +app/code/core/Mage/Core/Model/Translate/Expr.php +app/code/core/Mage/Core/Helper/Abstract.php app/code/core/Mage/Core/sql/core_setup/upgrade-1.6.0.3-1.6.0.4.php app/code/core/Mage/Directory/Model/Currency/DefaultLocator.php app/code/core/Mage/DesignEditor diff --git a/dev/tests/unit/testsuite/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/BaseImageTest.php b/dev/tests/unit/testsuite/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/BaseImageTest.php index b389a541c0e778ba97a47fa0ec9a6910263244b4..d9428e4af9e6b078bc5cd5147b78d9d5dbc29fba 100644 --- a/dev/tests/unit/testsuite/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/BaseImageTest.php +++ b/dev/tests/unit/testsuite/Mage/Adminhtml/Block/Catalog/Product/Helper/Form/BaseImageTest.php @@ -95,6 +95,7 @@ class Mage_Adminhtml_Block_Catalog_Product_Helper_Form_BaseImageTest extends PHP */ public function testGetElementHtml($imageValue, $urlPath) { + $this->markTestIncomplete('Test should be rewritten as part of MAGETWO-4611'); $this->_block->setValue($imageValue); $this->_coreHelper->expects($this->any())->method('escapeHtml')->will($this->returnArgument(0)); $html = $this->_createHtmlCode($imageValue, $urlPath); @@ -128,6 +129,7 @@ class Mage_Adminhtml_Block_Catalog_Product_Helper_Form_BaseImageTest extends PHP */ public function testImagePlaceholder() { + $this->markTestIncomplete('Test should be rewritten as part of MAGETWO-4611'); $urlPath = 'http://example.com/pub/images/image-placeholder.png'; $this->_block->setValue(null); $this->_coreHelper->expects($this->any())->method('escapeHtml')->will($this->returnArgument(0)); diff --git a/dev/tests/unit/testsuite/Mage/Backend/Block/System/Config/Form/Field/ImportTest.php b/dev/tests/unit/testsuite/Mage/Backend/Block/System/Config/Form/Field/ImportTest.php index eaecfcf5c47e427d635d5f957c94259cfdfb81ad..146ba2a7d4821b7be6d93f92a6e012fd91b15739 100644 --- a/dev/tests/unit/testsuite/Mage/Backend/Block/System/Config/Form/Field/ImportTest.php +++ b/dev/tests/unit/testsuite/Mage/Backend/Block/System/Config/Form/Field/ImportTest.php @@ -89,6 +89,6 @@ class Mage_Backend_Block_System_Config_Form_Field_ImportTest extends PHPUnit_Fra $testString = $this->_object->getElementHtml(); $this->assertStringStartsWith('<input id="time_condition" type="hidden" name="test_name" value="', $testString); $this->assertStringEndsWith('<input id="test_html_id" name="test_name" data-ui-id="form-element-test_name"' . - ' value="" type="file"/>' . "\n", $testString); + ' value="" type="file"/>', $testString); } } diff --git a/dev/tests/unit/testsuite/Mage/Backend/Block/System/Config/Form/FieldsetTest.php b/dev/tests/unit/testsuite/Mage/Backend/Block/System/Config/Form/FieldsetTest.php index 3ca7e1461ef9c4313767ced1c5f7a7e6debcf72e..34b21ae8feb1a65143e2556c825b726ba054e32d 100644 --- a/dev/tests/unit/testsuite/Mage/Backend/Block/System/Config/Form/FieldsetTest.php +++ b/dev/tests/unit/testsuite/Mage/Backend/Block/System/Config/Form/FieldsetTest.php @@ -117,7 +117,7 @@ class Mage_Backend_Block_System_Config_Form_FieldsetTest extends PHPUnit_Framewo $this->_elementMock->expects($this->any())->method('getSortedElements')->will($this->returnValue(array())); - $expected = '<div><div><div class="entry-edit-head collapseable" >'; + $expected = '<div class="entry-edit-head collapseable" >'; $expected .= '<a id="' . $this->_testData['htmlId'] . '-head" href="#"' . ' onclick="Fieldset.toggleCollapse(\'' . $this->_testData['htmlId'] . '\', \'\'); ' @@ -137,7 +137,7 @@ class Mage_Backend_Block_System_Config_Form_FieldsetTest extends PHPUnit_Framewo $expected .= '<colgroup class="value" />'; $expected .= '<colgroup class="scope-label" />'; $expected .= '<colgroup class="" />'; - $expected .= '<tbody></tbody></table></fieldset></div></div>'; + $expected .= '<tbody></tbody></table></fieldset>'; $this->assertEquals($expected, $this->_object->render($this->_elementMock)); } diff --git a/dev/tests/unit/testsuite/Mage/Backend/Block/Widget/Grid/ColumnTest.php b/dev/tests/unit/testsuite/Mage/Backend/Block/Widget/Grid/ColumnTest.php index ac4eaa807b14d65be9e3f337a5de7a4e66f4ae66..136c46c24a629dd1fa9ffe0b1fb607d33c6d4675 100644 --- a/dev/tests/unit/testsuite/Mage/Backend/Block/Widget/Grid/ColumnTest.php +++ b/dev/tests/unit/testsuite/Mage/Backend/Block/Widget/Grid/ColumnTest.php @@ -128,7 +128,6 @@ class Mage_Backend_Block_Widget_Grid_ColumnTest extends PHPUnit_Framework_TestCa /** * @covers Mage_Backend_Block_Widget_Grid_Column::getFilter - * @covers Mage_Backend_Block_Widget_Grid_Column::_getFilterType */ public function testGetFilterWithInvalidFilterTypeWhenUseDefaultFilter() { @@ -144,7 +143,6 @@ class Mage_Backend_Block_Widget_Grid_ColumnTest extends PHPUnit_Framework_TestCa /** * @covers Mage_Backend_Block_Widget_Grid_Column::getFilter - * @covers Mage_Backend_Block_Widget_Grid_Column::_getFilterType */ public function testGetFilterWhenUseCustomFilter() { @@ -214,7 +212,6 @@ class Mage_Backend_Block_Widget_Grid_ColumnTest extends PHPUnit_Framework_TestCa /** * @covers Mage_Backend_Block_Widget_Grid_Column::getRenderer - * @covers Mage_Backend_Block_Widget_Grid_Column::_getRendererType */ public function testGetRendererWheRendererSetFalse() { @@ -234,7 +231,6 @@ class Mage_Backend_Block_Widget_Grid_ColumnTest extends PHPUnit_Framework_TestCa /** * @covers Mage_Backend_Block_Widget_Grid_Column::getRenderer - * @covers Mage_Backend_Block_Widget_Grid_Column::_getRendererType * @covers Mage_Backend_Block_Widget_Grid_Column::setRendererType */ public function testGetRendererWhenUseCustomRenderer() diff --git a/dev/tests/unit/testsuite/Mage/Core/Model/Design/Fallback/CachingProxyTest.php b/dev/tests/unit/testsuite/Mage/Core/Model/Design/Fallback/CachingProxyTest.php index 2ca8873f2bd65a15b36bd396c93463c19b095212..e4053a3e33149359fc64def2c1793d349ea3b69e 100644 --- a/dev/tests/unit/testsuite/Mage/Core/Model/Design/Fallback/CachingProxyTest.php +++ b/dev/tests/unit/testsuite/Mage/Core/Model/Design/Fallback/CachingProxyTest.php @@ -142,11 +142,14 @@ class Mage_Core_Model_Design_Fallback_CachingProxyTest extends PHPUnit_Framework $this->_fallback->expects($this->once())->method('getViewFile')->will($this->returnValue($fixture)); $this->assertEquals($fixture, $this->_model->getViewFile('file.txt', $moduleArg)); $this->assertSame( - $this->_model, $this->_model->notifyViewFilePublished($anotherFixture, 'file.txt', $moduleArg) + $this->_model, $this->_model->setFilePathToMap($anotherFixture, 'file.txt', $moduleArg) ); $this->assertEquals($anotherFixture, $this->_model->getViewFile('file.txt', $moduleArg)); } + /** + * @return Magento_Filesystem + */ protected function _createFilesystem() { return new Magento_Filesystem(new Magento_Filesystem_Adapter_Local()); diff --git a/dev/tests/unit/testsuite/Mage/Core/Model/Design/FallbackTest.php b/dev/tests/unit/testsuite/Mage/Core/Model/Design/FallbackTest.php new file mode 100644 index 0000000000000000000000000000000000000000..d95b46dead0446f31fc372aae4cff2645105c2ab --- /dev/null +++ b/dev/tests/unit/testsuite/Mage/Core/Model/Design/FallbackTest.php @@ -0,0 +1,651 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Mage_Core + * @subpackage unit_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Test that Design Package delegates fallback resolution to a Fallback model + */ +class Mage_Core_Model_Design_FallbackTest extends PHPUnit_Framework_TestCase +{ + /** + * @dataProvider getFileDataProvider + * @param Mage_Core_Model_Theme|PHPUnit_Framework_MockObject_MockObject $theme + * @param string $file + * @param string $targetFile + * @param string $expectedFileName + * @cover Mage_Core_Model_Design_Fallback::_fallback() + */ + public function testGetFile($theme, $file, $targetFile, $expectedFileName) + { + $designDir = 'design_dir'; + $moduleDir = 'module_view_dir'; + $module = 'Mage_Core11'; + + $filesystem = $this->_getFileSystemMock($targetFile); + $objectManager = $this->_getObjectManagerMock(); + $dirs = $this->_getDirsMock(); + + $configModel = $this->getMock('Mage_Core_Model_Config', array('getModuleDir'), array(), '', false); + + $configModel->expects($this->any()) + ->method('getModuleDir') + ->will($this->returnValue($moduleDir)); + + $objectManager->expects($this->any()) + ->method('get') + ->with('Mage_Core_Model_Config') + ->will($this->returnValue($configModel)); + + $dirs->expects($this->any()) + ->method('getDir') + ->with(Mage_Core_Model_Dir::THEMES) + ->will($this->returnValue($designDir)); + + $data = array( + 'area' => 'area51', + 'locale' => 'en_EN', + 'themeModel' => $theme, + ); + + $fallback = new Mage_Core_Model_Design_Fallback($dirs, $objectManager, $filesystem, $data); + $filename = $fallback->getFile($file, $module); + + $this->assertEquals(str_replace('/', DIRECTORY_SEPARATOR, $expectedFileName), $filename); + } + + /** + * @return array + */ + public function getFileDataProvider() + { + $file = 'test.txt'; + $customizationPath = 'custom'; + $themePath = 'theme_path'; + $parentThemePath = 'parent_theme_path'; + + /** @var $parentTheme Mage_Core_Model_Theme */ + $parentTheme = $this->getMock('Mage_Core_Model_Theme', array('getThemePath'), array(), '', false); + $parentTheme->expects($this->any()) + ->method('getThemePath') + ->will($this->returnValue($parentThemePath)); + + /** @var $themeSimple Mage_Core_Model_Theme */ + $themeSimple = $this->getMock('Mage_Core_Model_Theme', null, array(), '', false); + + /** @var $themeCustomized Mage_Core_Model_Theme */ + $themeCustomized = $this->getMock('Mage_Core_Model_Theme', array('getCustomizationPath'), array(), '', false); + $themeCustomized->expects($this->any()) + ->method('getCustomizationPath') + ->will($this->returnValue($customizationPath)); + + /** @var $customizedPhysical Mage_Core_Model_Theme */ + $customizedPhysical = $this->getMock('Mage_Core_Model_Theme', + array('getCustomizationPath', 'getThemePath'), array(), '', false); + $customizedPhysical->expects($this->any()) + ->method('getCustomizationPath') + ->will($this->returnValue($customizationPath)); + $customizedPhysical->expects($this->any()) + ->method('getThemePath') + ->will($this->returnValue($themePath)); + + /** @var $themeInherited Mage_Core_Model_Theme */ + $themeInherited = $this->getMock('Mage_Core_Model_Theme', array('getParentTheme'), array(), '', false); + $themeInherited->expects($this->any()) + ->method('getParentTheme') + ->will($this->returnValue($parentTheme)); + + /** @var $themeComplicated Mage_Core_Model_Theme */ + $themeComplicated = $this->getMock('Mage_Core_Model_Theme', + array('getCustomizationPath', 'getThemePath', 'getParentTheme'), array(), '', false); + $themeComplicated->expects($this->any()) + ->method('getCustomizationPath') + ->will($this->returnValue($customizationPath)); + $themeComplicated->expects($this->any()) + ->method('getThemePath') + ->will($this->returnValue($themePath)); + $themeComplicated->expects($this->any()) + ->method('getParentTheme') + ->will($this->returnValue($parentTheme)); + + return array( + array($themeSimple, $file, 'module_view_dir/area51/test.txt', 'module_view_dir/area51/test.txt'), + array($themeSimple, $file, null, 'module_view_dir/area51/test.txt'), + array($themeCustomized, $file, 'custom/test.txt', 'custom/test.txt'), + array($themeCustomized, $file, 'module_view_dir/area51/test.txt', 'module_view_dir/area51/test.txt'), + array($themeCustomized, $file, null, 'module_view_dir/area51/test.txt'), + array($customizedPhysical, $file, 'custom/test.txt', 'custom/test.txt'), + array($customizedPhysical, $file, 'design_dir/area51/theme_path/test.txt', + 'design_dir/area51/theme_path/test.txt' + ), + array($customizedPhysical, $file, 'design_dir/area51/theme_path/Mage_Core11/test.txt', + 'design_dir/area51/theme_path/Mage_Core11/test.txt' + ), + array($customizedPhysical, $file, 'module_view_dir/area51/test.txt', + 'module_view_dir/area51/test.txt' + ), + array($customizedPhysical, $file, null, 'module_view_dir/area51/test.txt'), + array($themeInherited, $file, 'design_dir/area51/parent_theme_path/test.txt', + 'design_dir/area51/parent_theme_path/test.txt' + ), + array($themeInherited, $file, 'design_dir/area51/parent_theme_path/Mage_Core11/test.txt', + 'design_dir/area51/parent_theme_path/Mage_Core11/test.txt' + ), + array($themeInherited, $file, 'module_view_dir/area51/test.txt', 'module_view_dir/area51/test.txt'), + array($themeInherited, $file, null, 'module_view_dir/area51/test.txt'), + array($themeComplicated, $file, 'custom/test.txt', 'custom/test.txt'), + array($themeComplicated, $file, 'design_dir/area51/theme_path/test.txt', + 'design_dir/area51/theme_path/test.txt' + ), + array($themeComplicated, $file, 'design_dir/area51/parent_theme_path/test.txt', + 'design_dir/area51/parent_theme_path/test.txt' + ), + array($themeComplicated, $file, 'design_dir/area51/theme_path/Mage_Core11/test.txt', + 'design_dir/area51/theme_path/Mage_Core11/test.txt' + ), + array($themeComplicated, $file, 'design_dir/area51/parent_theme_path/Mage_Core11/test.txt', + 'design_dir/area51/parent_theme_path/Mage_Core11/test.txt' + ), + array($themeComplicated, $file, 'module_view_dir/area51/test.txt', 'module_view_dir/area51/test.txt'), + array($themeComplicated, $file, null, 'module_view_dir/area51/test.txt'), + ); + } + + /** + * @dataProvider getLocaleFileDataProvider + * @param Mage_Core_Model_Theme|PHPUnit_Framework_MockObject_MockObject $theme + * @param string $file + * @param string $targetFile + * @param string $expectedFileName + * @cover Mage_Core_Model_Design_Fallback::_fallback() + */ + public function testGetLocaleFile($theme, $file, $targetFile, $expectedFileName) + { + $designDir = 'design_dir'; + + $filesystem = $this->_getFileSystemMock($targetFile); + $objectManager = $this->_getObjectManagerMock(); + $dirs = $this->_getDirsMock(); + + $dirs->expects($this->any()) + ->method('getDir') + ->with(Mage_Core_Model_Dir::THEMES) + ->will($this->returnValue($designDir)); + + $data = array( + 'area' => 'area51', + 'locale' => 'en_EN', + 'themeModel' => $theme, + ); + + $fallback = new Mage_Core_Model_Design_Fallback($dirs, $objectManager, $filesystem, $data); + $filename = $fallback->getLocaleFile($file); + + $this->assertEquals(str_replace('/', DIRECTORY_SEPARATOR, $expectedFileName), $filename); + } + + /** + * @return array + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + */ + public function getLocaleFileDataProvider() + { + $customizationPath = 'custom'; + $themePath = 'theme_path'; + $parentThemePath = 'parent_theme_path'; + $grandParentPath = 'grand_parent_theme_path'; + $file = 'test.txt'; + + // 0. Parent and grand parent themes + /** @var $parentTheme Mage_Core_Model_Theme */ + $parentTheme = $this->getMock('Mage_Core_Model_Theme', array('getThemePath'), array(), '', false); + $parentTheme->expects($this->any())->method('getThemePath')->will($this->returnValue($parentThemePath)); + + /** @var $grandParentTheme Mage_Core_Model_Theme */ + $grandParentTheme = $this->getMock('Mage_Core_Model_Theme', array('getThemePath'), array(), '', false); + $grandParentTheme->expects($this->any())->method('getThemePath')->will($this->returnValue($grandParentPath)); + + /** @var $parentThemeInherited Mage_Core_Model_Theme */ + $parentThemeInherited = $this->getMock('Mage_Core_Model_Theme', + array('getThemePath', 'getParentTheme'), array(), '', false); + $parentThemeInherited->expects($this->any())->method('getThemePath') + ->will($this->returnValue($parentThemePath)); + $parentThemeInherited->expects($this->any())->method('getParentTheme') + ->will($this->returnValue($grandParentTheme)); + + // 1. + /** @var $themeSimple Mage_Core_Model_Theme */ + $themeSimple = $this->getMock('Mage_Core_Model_Theme', null, array(), '', false); + + // 2. + /** @var $themeCustomized Mage_Core_Model_Theme */ + $themeCustomized = $this->getMock('Mage_Core_Model_Theme', array('getCustomizationPath'), array(), '', false); + $themeCustomized->expects($this->any())->method('getCustomizationPath') + ->will($this->returnValue($customizationPath)); + + // 3. + /** @var $customizedPhysical Mage_Core_Model_Theme */ + $customizedPhysical = $this->getMock('Mage_Core_Model_Theme', + array('getCustomizationPath', 'getThemePath'), array(), '', false); + $customizedPhysical->expects($this->any()) + ->method('getCustomizationPath') + ->will($this->returnValue($customizationPath)); + $customizedPhysical->expects($this->any()) + ->method('getThemePath') + ->will($this->returnValue($themePath)); + + // 4. + /** @var $themeInherited Mage_Core_Model_Theme */ + $themeInherited = $this->getMock('Mage_Core_Model_Theme', array('getParentTheme'), array(), '', false); + $themeInherited->expects($this->any())->method('getParentTheme')->will($this->returnValue($parentTheme)); + + // 5. + /** @var $themeComplicated Mage_Core_Model_Theme */ + $themeComplicated = $this->getMock('Mage_Core_Model_Theme', + array('getCustomizationPath', 'getThemePath', 'getParentTheme'), array(), '', false); + $themeComplicated->expects($this->any()) + ->method('getCustomizationPath') + ->will($this->returnValue($customizationPath)); + $themeComplicated->expects($this->any()) + ->method('getThemePath') + ->will($this->returnValue($themePath)); + $themeComplicated->expects($this->any()) + ->method('getParentTheme') + ->will($this->returnValue($parentTheme)); + + // 6. + /** @var $themeInheritedTwice Mage_Core_Model_Theme */ + $themeInheritedTwice = $this->getMock('Mage_Core_Model_Theme', array('getParentTheme'), array(), '', false); + $themeInheritedTwice->expects($this->any()) + ->method('getParentTheme') + ->will($this->returnValue($parentThemeInherited)); + + return array( + array($themeSimple, $file, null, ''), + array($themeCustomized, $file, 'custom/test.txt', 'custom/test.txt'), + array($themeCustomized, $file, null, 'custom/test.txt'), + array($customizedPhysical, $file, 'custom/test.txt', 'custom/test.txt'), + array($customizedPhysical, $file, 'design_dir/area51/theme_path/locale/en_EN/test.txt', + 'design_dir/area51/theme_path/locale/en_EN/test.txt' + ), + array($customizedPhysical, $file, null, 'design_dir/area51/theme_path/locale/en_EN/test.txt'), + array($themeInherited, $file, 'design_dir/area51/parent_theme_path/locale/en_EN/test.txt', + 'design_dir/area51/parent_theme_path/locale/en_EN/test.txt' + ), + array($themeInherited, $file, null, 'design_dir/area51/parent_theme_path/locale/en_EN/test.txt'), + array($themeComplicated, $file, 'custom/test.txt', 'custom/test.txt'), + array($themeComplicated, $file, 'design_dir/area51/theme_path/locale/en_EN/test.txt', + 'design_dir/area51/theme_path/locale/en_EN/test.txt' + ), + array($themeComplicated, $file, 'design_dir/area51/parent_theme_path/locale/en_EN/test.txt', + 'design_dir/area51/parent_theme_path/locale/en_EN/test.txt' + ), + array($themeComplicated, $file, null, 'design_dir/area51/parent_theme_path/locale/en_EN/test.txt'), + array($themeInheritedTwice, $file, 'design_dir/area51/parent_theme_path/locale/en_EN/test.txt', + 'design_dir/area51/parent_theme_path/locale/en_EN/test.txt' + ), + array($themeInheritedTwice, $file, 'design_dir/area51/grand_parent_theme_path/locale/en_EN/test.txt', + 'design_dir/area51/grand_parent_theme_path/locale/en_EN/test.txt' + ), + array($themeInheritedTwice, $file, null, 'design_dir/area51/grand_parent_theme_path/locale/en_EN/test.txt'), + ); + } + + /** + * @dataProvider getViewFileDataProvider + * @param Mage_Core_Model_Theme|PHPUnit_Framework_MockObject_MockObject $theme + * @param string $file + * @param string $targetFile + * @param string $expectedFileName + * @cover Mage_Core_Model_Design_Fallback::_fallback() + */ + public function testGetViewFile($theme, $file, $targetFile, $expectedFileName) + { + $designDir = 'design_dir'; + $moduleDir = 'module_view_dir'; + $jsDir = 'js_dir'; + $module = 'Mage_Core11'; + + $filesystem = $this->_getFileSystemMock($targetFile); + $objectManager = $this->_getObjectManagerMock(); + $dirs = $this->_getDirsMock(); + + $configModel = $this->getMock('Mage_Core_Model_Config', array('getModuleDir'), array(), '', false); + + $configModel->expects($this->any()) + ->method('getModuleDir') + ->with($this->equalTo('view'), $this->equalTo($module)) + ->will($this->returnValue($moduleDir)); + + $objectManager->expects($this->any()) + ->method('get') + ->with('Mage_Core_Model_Config') + ->will($this->returnValue($configModel)); + + $dirs->expects($this->at(0)) + ->method('getDir') + ->with(Mage_Core_Model_Dir::THEMES) + ->will($this->returnValue($designDir)); + + $dirs->expects($this->at(1)) + ->method('getDir') + ->with(Mage_Core_Model_Dir::PUB_LIB) + ->will($this->returnValue($jsDir)); + + $data = array( + 'area' => 'area51', + 'locale' => 'en_EN', + 'themeModel' => $theme, + ); + + $fallback = new Mage_Core_Model_Design_Fallback($dirs, $objectManager, $filesystem, $data); + $filename = $fallback->getViewFile($file, $module); + + $this->assertEquals(str_replace('/', DIRECTORY_SEPARATOR, $expectedFileName), $filename); + } + + /** + * @return array + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + */ + public function getViewFileDataProvider() + { + $customizationPath = 'custom'; + $themePath = 'theme_path'; + $parentThemePath = 'parent_theme_path'; + $grandParentThemePath = 'grand_parent_theme_path'; + $file = 'test.txt'; + + // 0. Parent and grand parent themes + /** @var $parentTheme Mage_Core_Model_Theme */ + $parentTheme = $this->getMock('Mage_Core_Model_Theme', array('getThemePath'), array(), '', false); + $parentTheme->expects($this->any()) + ->method('getThemePath') + ->will($this->returnValue($parentThemePath)); + + /** @var $grandParentTheme Mage_Core_Model_Theme */ + $grandParentTheme = $this->getMock('Mage_Core_Model_Theme', array('getThemePath'), array(), '', false); + $grandParentTheme->expects($this->any()) + ->method('getThemePath') + ->will($this->returnValue($grandParentThemePath)); + + /** @var $parentThemeInherited Mage_Core_Model_Theme */ + $parentThemeInherited = $this->getMock('Mage_Core_Model_Theme', + array('getThemePath', 'getParentTheme'), array(), '', false); + $parentThemeInherited->expects($this->any()) + ->method('getThemePath') + ->will($this->returnValue($parentThemePath)); + $parentThemeInherited->expects($this->any()) + ->method('getParentTheme') + ->will($this->returnValue($grandParentTheme)); + + // 1. + /** @var $themeSimple Mage_Core_Model_Theme */ + $themeSimple = $this->getMock('Mage_Core_Model_Theme', null, array(), '', false); + + // 2. + /** @var $themeCustomized Mage_Core_Model_Theme */ + $themeCustomized = $this->getMock('Mage_Core_Model_Theme', array('getCustomizationPath'), array(), '', false); + $themeCustomized->expects($this->any()) + ->method('getCustomizationPath') + ->will($this->returnValue($customizationPath)); + + // 3. + /** @var $customizedPhysical Mage_Core_Model_Theme */ + $customizedPhysical = $this->getMock('Mage_Core_Model_Theme', + array('getCustomizationPath', 'getThemePath'), array(), '', false); + $customizedPhysical->expects($this->any()) + ->method('getCustomizationPath') + ->will($this->returnValue($customizationPath)); + $customizedPhysical->expects($this->any()) + ->method('getThemePath') + ->will($this->returnValue($themePath)); + + // 4. + /** @var $themeInherited Mage_Core_Model_Theme */ + $themeInherited = $this->getMock('Mage_Core_Model_Theme', array('getParentTheme'), array(), '', false); + $themeInherited->expects($this->any()) + ->method('getParentTheme') + ->will($this->returnValue($parentTheme)); + + // 5. + /** @var $themeComplicated Mage_Core_Model_Theme */ + $themeComplicated = $this->getMock('Mage_Core_Model_Theme', + array('getCustomizationPath', 'getThemePath', 'getParentTheme'), array(), '', false); + $themeComplicated->expects($this->any()) + ->method('getCustomizationPath') + ->will($this->returnValue($customizationPath)); + $themeComplicated->expects($this->any()) + ->method('getThemePath') + ->will($this->returnValue($themePath)); + $themeComplicated->expects($this->any()) + ->method('getParentTheme') + ->will($this->returnValue($parentTheme)); + + // 6. + /** @var $themeInheritedTwice Mage_Core_Model_Theme */ + $themeInheritedTwice = $this->getMock('Mage_Core_Model_Theme', array('getParentTheme'), array(), '', false); + $themeInheritedTwice->expects($this->any()) + ->method('getParentTheme') + ->will($this->returnValue($parentThemeInherited)); + + return array( + array($themeSimple, $file, 'module_view_dir/area51/locale/en_EN/test.txt', + 'module_view_dir/area51/locale/en_EN/test.txt' + ), + array($themeSimple, $file, 'module_view_dir/area51/test.txt', 'module_view_dir/area51/test.txt'), + array($themeSimple, $file, 'js_dir/test.txt', 'js_dir/test.txt'), + array($themeSimple, $file, null, 'js_dir/test.txt'), + array($themeCustomized, $file, 'custom/test.txt', 'custom/test.txt'), + array($themeCustomized, $file, 'module_view_dir/area51/locale/en_EN/test.txt', + 'module_view_dir/area51/locale/en_EN/test.txt' + ), + array($themeCustomized, $file, 'module_view_dir/area51/test.txt', 'module_view_dir/area51/test.txt'), + array($themeCustomized, $file, 'js_dir/test.txt', 'js_dir/test.txt'), + array($themeCustomized, $file, null, 'js_dir/test.txt'), + array($customizedPhysical, $file, 'custom/test.txt', 'custom/test.txt'), + array($customizedPhysical, $file, 'design_dir/area51/theme_path/locale/en_EN/test.txt', + 'design_dir/area51/theme_path/locale/en_EN/test.txt' + ), + array($customizedPhysical, $file, 'design_dir/area51/theme_path/test.txt', + 'design_dir/area51/theme_path/test.txt' + ), + array($customizedPhysical, $file, 'design_dir/area51/theme_path/locale/en_EN/Mage_Core11/test.txt', + 'design_dir/area51/theme_path/locale/en_EN/Mage_Core11/test.txt' + ), + array($customizedPhysical, $file, 'design_dir/area51/theme_path/Mage_Core11/test.txt', + 'design_dir/area51/theme_path/Mage_Core11/test.txt' + ), + array($customizedPhysical, $file, 'module_view_dir/area51/locale/en_EN/test.txt', + 'module_view_dir/area51/locale/en_EN/test.txt' + ), + array($customizedPhysical, $file, 'module_view_dir/area51/test.txt', + 'module_view_dir/area51/test.txt' + ), + array($customizedPhysical, $file, 'js_dir/test.txt', 'js_dir/test.txt'), + array($customizedPhysical, $file, null, 'js_dir/test.txt'), + array($themeInherited, $file, 'design_dir/area51/parent_theme_path/locale/en_EN/test.txt', + 'design_dir/area51/parent_theme_path/locale/en_EN/test.txt' + ), + array($themeInherited, $file, 'design_dir/area51/parent_theme_path/test.txt', + 'design_dir/area51/parent_theme_path/test.txt' + ), + array($themeInherited, $file, 'design_dir/area51/parent_theme_path/locale/en_EN/Mage_Core11/test.txt', + 'design_dir/area51/parent_theme_path/locale/en_EN/Mage_Core11/test.txt' + ), + array($themeInherited, $file, 'design_dir/area51/parent_theme_path/Mage_Core11/test.txt', + 'design_dir/area51/parent_theme_path/Mage_Core11/test.txt' + ), + array($themeInherited, $file, 'module_view_dir/area51/locale/en_EN/test.txt', + 'module_view_dir/area51/locale/en_EN/test.txt' + ), + array($themeInherited, $file, 'module_view_dir/area51/test.txt', 'module_view_dir/area51/test.txt'), + array($themeInherited, $file, 'js_dir/test.txt', 'js_dir/test.txt'), + array($themeInherited, $file, null, 'js_dir/test.txt'), + array($themeComplicated, $file, 'custom/test.txt', 'custom/test.txt'), + array($themeComplicated, $file, 'design_dir/area51/theme_path/locale/en_EN/test.txt', + 'design_dir/area51/theme_path/locale/en_EN/test.txt' + ), + array($themeComplicated, $file, 'design_dir/area51/theme_path/test.txt', + 'design_dir/area51/theme_path/test.txt'), + array($themeComplicated, $file, 'design_dir/area51/parent_theme_path/locale/en_EN/test.txt', + 'design_dir/area51/parent_theme_path/locale/en_EN/test.txt' + ), + array($themeComplicated, $file, 'design_dir/area51/parent_theme_path/test.txt', + 'design_dir/area51/parent_theme_path/test.txt' + ), + array($themeComplicated, $file, 'design_dir/area51/theme_path/locale/en_EN/Mage_Core11/test.txt', + 'design_dir/area51/theme_path/locale/en_EN/Mage_Core11/test.txt' + ), + array($themeComplicated, $file, 'design_dir/area51/theme_path/Mage_Core11/test.txt', + 'design_dir/area51/theme_path/Mage_Core11/test.txt' + ), + array($themeComplicated, $file, 'design_dir/area51/parent_theme_path/locale/en_EN/Mage_Core11/test.txt', + 'design_dir/area51/parent_theme_path/locale/en_EN/Mage_Core11/test.txt' + ), + array($themeComplicated, $file, 'design_dir/area51/parent_theme_path/Mage_Core11/test.txt', + 'design_dir/area51/parent_theme_path/Mage_Core11/test.txt' + ), + array($themeComplicated, $file, 'module_view_dir/area51/locale/en_EN/test.txt', + 'module_view_dir/area51/locale/en_EN/test.txt' + ), + array($themeComplicated, $file, 'module_view_dir/area51/test.txt', 'module_view_dir/area51/test.txt'), + array($themeComplicated, $file, 'js_dir/test.txt', 'js_dir/test.txt'), + array($themeComplicated, $file, null, 'js_dir/test.txt'), + array($themeInheritedTwice, $file, 'design_dir/area51/parent_theme_path/locale/en_EN/test.txt', + 'design_dir/area51/parent_theme_path/locale/en_EN/test.txt' + ), + array($themeInheritedTwice, $file, 'design_dir/area51/parent_theme_path/test.txt', + 'design_dir/area51/parent_theme_path/test.txt' + ), + array($themeInheritedTwice, $file, 'design_dir/area51/grand_parent_theme_path/locale/en_EN/test.txt', + 'design_dir/area51/grand_parent_theme_path/locale/en_EN/test.txt' + ), + array($themeInheritedTwice, $file, 'design_dir/area51/grand_parent_theme_path/test.txt', + 'design_dir/area51/grand_parent_theme_path/test.txt' + ), + array($themeInheritedTwice, $file, 'design_dir/area51/parent_theme_path/locale/en_EN/Mage_Core11/test.txt', + 'design_dir/area51/parent_theme_path/locale/en_EN/Mage_Core11/test.txt' + ), + array($themeInheritedTwice, $file, 'design_dir/area51/parent_theme_path/Mage_Core11/test.txt', + 'design_dir/area51/parent_theme_path/Mage_Core11/test.txt' + ), + array($themeInheritedTwice, $file, + 'design_dir/area51/grand_parent_theme_path/locale/en_EN/Mage_Core11/test.txt', + 'design_dir/area51/grand_parent_theme_path/locale/en_EN/Mage_Core11/test.txt' + ), + array($themeInheritedTwice, $file, 'design_dir/area51/grand_parent_theme_path/Mage_Core11/test.txt', + 'design_dir/area51/grand_parent_theme_path/Mage_Core11/test.txt' + ), + array($themeInheritedTwice, $file, 'module_view_dir/area51/locale/en_EN/test.txt', + 'module_view_dir/area51/locale/en_EN/test.txt' + ), + array($themeInheritedTwice, $file, 'module_view_dir/area51/test.txt', 'module_view_dir/area51/test.txt'), + array($themeInheritedTwice, $file, 'js_dir/test.txt', 'js_dir/test.txt'), + array($themeInheritedTwice, $file, null, 'js_dir/test.txt'), + ); + } + + /** + * @param array $data + * @return Mage_Core_Model_Config_Options|PHPUnit_Framework_MockObject_MockObject + */ + protected function _getOptionsMock(array $data) + { + /** @var $options Mage_Core_Model_Config_Options */ + $options = $this->getMock('Mage_Core_Model_Config_Options', + array('getDesignDir', 'getJsDir'), array(), '', false); + if (isset($data['designDir'])) { + $options->expects($this->any()) + ->method('getDesignDir') + ->will($this->returnValue($data['designDir'])); + } + if (isset($data['jsDir'])) { + $options->expects($this->any()) + ->method('getJsDir') + ->will($this->returnValue($data['jsDir'])); + } + + return $options; + } + + /** + * @param array $data + * @param array $methods + * @return Mage_Core_Model_Config|PHPUnit_Framework_MockObject_MockObject + */ + protected function _getAppConfigMock(array $data, $methods = array('getOptions')) + { + $options = $this->_getOptionsMock($data); + + /** @var $appConfig Mage_Core_Model_Config */ + $appConfig = $this->getMock('Mage_Core_Model_Config', $methods, array(), '', false); + $appConfig->expects($this->any()) + ->method('getOptions') + ->will($this->returnValue($options)); + + return $appConfig; + } + + /** + * @param string $targetFile + * @return Magento_Filesystem|PHPUnit_Framework_MockObject_MockObject + */ + protected function _getFileSystemMock($targetFile) + { + $targetFile = str_replace('/', DIRECTORY_SEPARATOR, $targetFile); + /** @var $filesystem Magento_Filesystem */ + $filesystem = $this->getMock('Magento_Filesystem', array('has'), array(), '', false); + $filesystem->expects($this->any()) + ->method('has') + ->will($this->returnCallback( + function ($tryFile) use ($targetFile) { + return ($tryFile == $targetFile); + } + )); + + return $filesystem; + } + + /** + * @return Magento_ObjectManager_Zend + */ + protected function _getObjectManagerMock() + { + /** @var $objectManager Magento_ObjectManager_Zend */ + $objectManager = $this->getMock('Magento_ObjectManager_Zend', array('get'), array(), '', false); + return $objectManager; + } + + /** + * @return Mage_Core_Model_Dir + */ + protected function _getDirsMock() + { + /** @var $dirs Mage_Core_Model_Dir */ + $dirs = $this->getMock('Mage_Core_Model_Dir', array('getDir'), array(), '', false); + return $dirs; + } +} diff --git a/dev/tests/unit/testsuite/Mage/Core/Model/Store/LimitationTest.php b/dev/tests/unit/testsuite/Mage/Core/Model/Store/LimitationTest.php new file mode 100644 index 0000000000000000000000000000000000000000..af7d6c56ff5731b3f2f0172f27112ad0867e7976 --- /dev/null +++ b/dev/tests/unit/testsuite/Mage/Core/Model/Store/LimitationTest.php @@ -0,0 +1,63 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ +class Mage_Core_Model_Store_LimitationTest extends PHPUnit_Framework_TestCase +{ + /** + * @param string $totalCount + * @param string $configuredCount + * @param bool $expected + * @dataProvider canCreateDataProvider + */ + public function testCanCreate($totalCount, $configuredCount, $expected) + { + $resource = $this->getMock('Mage_Core_Model_Resource_Store', array('countAll'), array(), '', false); + if ($totalCount) { + $resource->expects($this->once())->method('countAll')->will($this->returnValue($totalCount)); + } + $config = $this->getMock('Mage_Core_Model_Config', array('getNode'), array(), '', false); + $config->expects($this->any())->method('getNode') + ->with('global/functional_limitation/max_store_count') + ->will($this->returnValue($configuredCount)); + $model = new Mage_Core_Model_Store_Limitation($resource, $config); + $this->assertEquals($expected, $model->canCreate()); + + // verify that resource model is invoked only when needed (see expectation "once" above) + new Mage_Core_Model_Store_Limitation($resource, $config); + } + + /** + * @return array + */ + public function canCreateDataProvider() + { + return array( + 'no limit' => array(0, '', true), + 'negative limit' => array(2, -1, false), + 'zero limit' => array(2, 0, false), + 'limit < count' => array(2, 1, false), + 'limit = count' => array(2, 2, false), + 'limit > count' => array(2, 3, true), + ); + } +} diff --git a/dev/tests/unit/testsuite/Mage/Core/Model/Theme/Customization/Files/CssTest.php b/dev/tests/unit/testsuite/Mage/Core/Model/Theme/Customization/Files/CssTest.php new file mode 100644 index 0000000000000000000000000000000000000000..7e0c02abf22c764d2cb2e9ce806f59a2a5bba3ca --- /dev/null +++ b/dev/tests/unit/testsuite/Mage/Core/Model/Theme/Customization/Files/CssTest.php @@ -0,0 +1,131 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Mage_Core + * @subpackage unit_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Test theme js file model + */ +class Mage_Core_Model_Theme_Customization_Files_CssTest extends PHPUnit_Framework_TestCase +{ + public function testSaveDataWithoutData() + { + $filesModel = $this->_getMockThemeFile(); + $themeModel = $this->_getMockThemeModel(); + + $modelCssFile = $this->getMock( + 'Mage_Core_Model_Theme_Customization_Files_Css', + array('_save'), + array($filesModel) + ); + + $modelCssFile->expects($this->never())->method('_save'); + $modelCssFile->saveData($themeModel); + } + + public function testSaveData() + { + $themeId = 5; + $cssContent = 'test css content'; + + $cssFile = $this->_getMockThemeFile(); + $cssFile->expects($this->once()) + ->method('addData') + ->with(array( + 'theme_id' => $themeId, + 'file_path' => Mage_Core_Model_Theme_Customization_Files_Css::FILE_PATH, + 'file_type' => Mage_Core_Model_Theme_Files::TYPE_CSS, + 'content' => $cssContent + )) + ->will($this->returnValue($cssFile)); + $cssFile->expects($this->once()) + ->method('save'); + + $filesCollection = $this->_getMockFilesCollection($themeId, $cssFile); + + $filesModel = $this->_getMockThemeFile(); + $filesModel->expects($this->once())->method('getCollection')->will($this->returnValue($filesCollection)); + + $themeModel = $this->_getMockThemeModel($themeId); + + $modelCssFile = new Mage_Core_Model_Theme_Customization_Files_Css($filesModel); + $modelCssFile->setDataForSave($cssContent); + $modelCssFile->saveData($themeModel); + } + + /** + * @param int $themeId + * @param Mage_Core_Model_Theme_Files $cssFile + * @return Mage_Core_Model_Resource_Theme_Files_Collection + */ + protected function _getMockFilesCollection($themeId, $cssFile) + { + $filesCollection = $this->getMock( + 'Mage_Core_Model_Resource_Theme_Files_Collection', array('addFilter', 'getFirstItem'), array(), '', false + ); + $filesCollection + ->expects($this->at(0)) + ->method('addFilter') + ->with('theme_id', $themeId) + ->will($this->returnValue($filesCollection)); + $filesCollection + ->expects($this->at(1)) + ->method('addFilter') + ->with('file_type', Mage_Core_Model_Theme_Files::TYPE_CSS) + ->will($this->returnValue($filesCollection)); + $filesCollection + ->expects($this->once()) + ->method('getFirstItem') + ->will($this->returnValue($cssFile)); + + return $filesCollection; + } + + /** + * @param int $return + * @return PHPUnit_Framework_MockObject_MockObject|Mage_Core_Model_Theme + */ + protected function _getMockThemeModel($return = null) + { + $themeModel = $this->getMock('Mage_Core_Model_Theme', array('getId'), array(), '', false); + $themeModel->expects($return ? $this->any() : $this->never()) + ->method('getId') + ->will($this->returnValue($return)); + return $themeModel; + } + + /** + * @return PHPUnit_Framework_MockObject_MockObject|Mage_Core_Model_Theme_Files + */ + protected function _getMockThemeFile() + { + $filesModel = $this->getMock('Mage_Core_Model_Theme_Files', array( + 'addData', + 'save', + 'getCollection' + ), array(), '', false); + return $filesModel; + } +} diff --git a/dev/tests/unit/testsuite/Mage/Core/Model/Theme/Customization/Files/JsTest.php b/dev/tests/unit/testsuite/Mage/Core/Model/Theme/Customization/Files/JsTest.php new file mode 100644 index 0000000000000000000000000000000000000000..7bec23913d0b257fb507a1b56bacdf4c03341857 --- /dev/null +++ b/dev/tests/unit/testsuite/Mage/Core/Model/Theme/Customization/Files/JsTest.php @@ -0,0 +1,263 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Mage_Core + * @subpackage unit_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Test theme js file model + */ +class Mage_Core_Model_Theme_Customization_Files_JsTest extends PHPUnit_Framework_TestCase +{ + public function testPrepareFileName() + { + $fileName = 'js_file.js'; + + /** @var $jsFile Mage_Core_Model_Theme_Customization_Files_Js */ + $jsFile = $this->getMock( + 'Mage_Core_Model_Theme_Customization_Files_Js', array('_getThemeFileByName', 'getId'), array(), '', false + ); + + /** @var $themeModel Mage_Core_Model_Theme */ + $themeModel = $this->getMock('Mage_Core_Model_Theme', array(), array(), '', false, false); + + $jsFile->expects($this->atLeastOnce()) + ->method('_getThemeFileByName') + ->will($this->returnValue($jsFile)); + + $jsFile->expects($this->at(1)) + ->method('getId') + ->will($this->returnValue(1)); + + $prepareFileName = new ReflectionMethod($jsFile, '_prepareFileName'); + $prepareFileName->setAccessible(true); + $result = $prepareFileName->invoke($jsFile, $themeModel, $fileName); + $this->assertEquals('js_file_1.js', $result); + } + + public function testSaveDataWithoutData() + { + $filesModel = $this->_getMockThemeFile(); + $themeModel = $this->_getMockThemeModel(); + + $modelJsFile = $this->getMock( + 'Mage_Core_Model_Theme_Customization_Files_Js', + array('_delete', '_save'), + array($filesModel) + ); + + $modelJsFile->expects($this->never())->method('_save'); + $modelJsFile->expects($this->never())->method('_delete'); + $modelJsFile->saveData($themeModel); + } + + public function testSaveDataWithDelete() + { + $jsFilesIdForDelete = array(1, 2, 4, 5); + $themeJsFilesId = array(1, 2, 3, 4, 5, 6); + + $filesModel = $this->_getMockThemeFile(); + $themeModel = $this->_getMockThemeModel(); + + $filesCollection = array(); + foreach ($themeJsFilesId as $fileId) { + $files = $this->_getMockThemeFile(); + $files->expects(in_array($fileId, $jsFilesIdForDelete) ? $this->once() : $this->never())->method('delete'); + $files->expects($this->once())->method('getId')->will($this->returnValue($fileId)); + $filesCollection[] = $files; + } + + /** @var $modelJsFile Mage_Core_Model_Theme_Customization_Files_Js */ + $modelJsFile = $this->getMock( + 'Mage_Core_Model_Theme_Customization_Files_Js', + array('getCollectionByTheme', '_save'), + array($filesModel) + ); + + $modelJsFile->expects($this->never())->method('_save'); + $modelJsFile->expects($this->once()) + ->method('getCollectionByTheme') + ->will($this->returnValue($filesCollection)); + + $modelJsFile->setDataForDelete($jsFilesIdForDelete); + $modelJsFile->saveData($themeModel); + } + + /** + * @param int $return + * @return PHPUnit_Framework_MockObject_MockObject|Mage_Core_Model_Theme + */ + protected function _getMockThemeModel($return = null) + { + $themeModel = $this->getMock('Mage_Core_Model_Theme', array('getId'), array(), '', false, false); + $themeModel->expects($return ? $this->once() : $this->never()) + ->method('getId') + ->will($this->returnValue($return)); + return $themeModel; + } + + /** + * @return PHPUnit_Framework_MockObject_MockObject|Mage_Core_Model_Theme_Files + */ + protected function _getMockThemeFile() + { + $filesModel = $this->getMock('Mage_Core_Model_Theme_Files', array( + 'load', + 'getId', + 'getThemeId', + 'setIsTemporary', + 'save', + 'delete' + ), array(), '', false); + return $filesModel; + } + + /** + * @param array $items + * @param array $jsOrderData + * @param array $expectedResult + * @dataProvider saveDataWithReorderingDataProvider + */ + public function testSaveDataWithReordering(array $items, array $jsOrderData, array $expectedResult) + { + // 1. Define test data + $themeId = 1; + + // 2. Get theme mock + $themeModel = $this->_getMockThemeModel($themeId); + + // 3. Get files collection mock + /** @var $collection Mage_Core_Model_Resource_Theme_Files_Collection */ + $collection = $this->getMock('Mage_Core_Model_Resource_Theme_Files_Collection', + array('addFilter', 'setDefaultOrder', 'load', 'save', 'getSize'), array(), '', false + ); + $this->_addItems($collection, $items); + + $collection->expects($this->any()) + ->method('addFilter') + ->will($this->returnSelf()); + $collection->expects($this->any()) + ->method('setDefaultOrder') + ->will($this->returnSelf()); + + // 4. Get files model (storage) mock + /** @var $themeFiles Mage_Core_Model_Theme_Files */ + $themeFiles = $this->getMock('Mage_Core_Model_Theme_Files', array('getCollection'), array(), '', false); + $themeFiles->expects($this->any()) + ->method('getCollection') + ->will($this->returnValue($collection)); + + // 5. Create tested class and set test data + $jsFilesManager = new Mage_Core_Model_Theme_Customization_Files_Js($themeFiles); + $jsFilesManager->setJsOrderData($jsOrderData); + + // 6. Run tested functionality + $jsFilesManager->saveData($themeModel); + + // 7. Check results + $result = $collection->toArray(); + $this->assertCount(count($result['items']), $expectedResult['items']); + foreach ($result['items'] as $item) { + $this->assertContains($item, $expectedResult['items']); + } + + + } + + /** + * @return array + */ + public function saveDataWithReorderingDataProvider() + { + return array( + // case 1 + array( + array( + array('file_name' => '1.js', 'sort_order' => '123'), + array('file_name' => '2.js', 'sort_order' => '0'), + array('file_name' => '3.js', 'sort_order' => '456') + ), + array('1.js', '2.js', '3.js'), + array( + 'totalRecords' => null, + 'items' => array( + array( + 'file_name' => '1.js', + 'sort_order' => 1 + ), + array( + 'file_name' => '2.js', + 'sort_order' => 2 + ), + array( + 'file_name' => '3.js', + 'sort_order' => 3 + ), + ) + ) + ), + // case 2 + array( + array( + array('file_name' => '3.js', 'sort_order' => '0'), + array('file_name' => '2.js', 'sort_order' => '0'), + array('file_name' => '1.js', 'sort_order' => '0') + ), + array('1.js', '2.js', '3.js'), + array( + 'totalRecords' => null, + 'items' => array( + array( + 'file_name' => '1.js', + 'sort_order' => 1 + ), + array( + 'file_name' => '2.js', + 'sort_order' => 2 + ), + array( + 'file_name' => '3.js', + 'sort_order' => 3 + ), + ) + ) + ), + ); + } + + /** + * Set items to files collection + * + * @param Mage_Core_Model_Resource_Theme_Files_Collection $collection + * @param array $items + */ + protected function _addItems($collection, array $items) + { + foreach ($items as $item) { + $collection->addItem(new Varien_Object($item)); + } + } +} + + diff --git a/dev/tests/unit/testsuite/Mage/Core/Model/Theme/ImageTest.php b/dev/tests/unit/testsuite/Mage/Core/Model/Theme/ImageTest.php new file mode 100644 index 0000000000000000000000000000000000000000..568d068f669e28b7e2c272787ad84e8394a1c987 --- /dev/null +++ b/dev/tests/unit/testsuite/Mage/Core/Model/Theme/ImageTest.php @@ -0,0 +1,176 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Mage_Core + * @subpackage unit_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Test theme model + */ +class Mage_Core_Model_Theme_ImageTest extends PHPUnit_Framework_TestCase +{ + /** + * @var Mage_Core_Model_Theme_Image + */ + protected $_model; + + /** + * @var Magento_ObjectManager + */ + protected $_objectManager; + + /** + * @var Magento_Filesystem + */ + protected $_filesystem; + + /** + * @var Mage_Core_Helper_Data + */ + protected $_helper; + + protected function setUp() + { + $this->_objectManager = $this->getMock('Magento_ObjectManager', get_class_methods('Magento_ObjectManager'), + array(), '', false); + $this->_helper = $this->getMock('Mage_Core_Helper_Data', array(), array(), '', false); + $this->_filesystem = $this->getMock('Magento_Filesystem', array(), array(), '', false); + $this->_model = new Mage_Core_Model_Theme_Image($this->_objectManager, $this->_helper, $this->_filesystem); + $this->_model->setTheme($this->getMock('Mage_Core_Model_Theme', array(), array(), '', false)); + } + + /** + * @return PHPUnit_Framework_MockObject_MockObject|Mage_Core_Model_Design_Package + */ + protected function _getDesignMock() + { + $designMock = $this->getMock('Mage_Core_Model_Design_Package', array('getViewFileUrl', 'getPublicDir'), + array(), '', false); + $designMock->expects($this->any()) + ->method('getPublicDir') + ->will($this->returnValue('pub/media/theme')); + $this->_objectManager->expects($this->any()) + ->method('get') + ->with($this->equalTo('Mage_Core_Model_Design_Package')) + ->will($this->returnValue($designMock)); + return $designMock; + } + + public function testSavePreviewImage() + { + $this->_model->setTheme($this->getMock('Mage_Core_Model_Theme', array(), array(), '', false)); + $this->assertInstanceOf('Mage_Core_Model_Theme_Image', $this->_model->savePreviewImage()); + } + + public function testGetImagePathOrigin() + { + $designMock = $this->_getDesignMock(); + + $expectedResult = $designMock->getPublicDir() . DIRECTORY_SEPARATOR + . Mage_Core_Model_Theme_Image::IMAGE_DIR_ORIGIN; + + $this->assertEquals($expectedResult, $this->_model->getImagePathOrigin()); + } + + public function testCreatePreviewImageCopy() + { + $designMock = $this->_getDesignMock(); + $filePath = $designMock->getPublicDir() . DIRECTORY_SEPARATOR . Mage_Core_Model_Theme_Image::IMAGE_DIR_PREVIEW; + $fileName = $filePath . DIRECTORY_SEPARATOR . 'image.jpg'; + + $this->_filesystem->expects($this->any()) + ->method('copy') + ->with($this->equalTo($fileName), $this->equalTo($fileName)) + ->will($this->returnValue(true)); + + $themeMock = $this->getMock('Mage_Core_Model_Theme', array('getPreviewImage'), array(), '', false); + $themeMock->expects($this->any()) + ->method('getPreviewImage') + ->will($this->returnValue('image.jpg')); + + $this->_model->setTheme($themeMock); + + $this->assertInstanceOf('Mage_Core_Model_Theme_Image', $this->_model->createPreviewImageCopy()); + $this->assertEquals('image.jpg', $this->_model->getPreviewImage()); + } + + /** + * @param string $previewImage + * @param string $defaultImage + * @param string $expectedResult + * @dataProvider getPreviewImageUrlProvider + */ + public function testGetPreviewImageUrl($previewImage, $defaultImage, $expectedResult) + { + if (null === $previewImage) { + $designMock = $this->_getDesignMock(); + $designMock->expects($this->any()) + ->method('getViewFileUrl') + ->with($this->equalTo($defaultImage)) + ->will($this->returnArgument(0)); + } else { + $storeMock = $this->getMock('Mage_Core_Model_Store', array('getBaseUrl'), array(), '', false); + $storeMock->expects($this->atLeastOnce()) + ->method('getBaseUrl') + ->with($this->equalTo(Mage_Core_Model_Store::URL_TYPE_MEDIA)) + ->will($this->returnArgument(0)); + + $appMock = $this->getMock('Mage_Core_Model_App', array('getStore'), array(), '', false); + $appMock->expects($this->atLeastOnce()) + ->method('getStore') + ->will($this->returnValue($storeMock)); + + $this->_objectManager->expects($this->any()) + ->method('get') + ->with($this->equalTo('Mage_Core_Model_App')) + ->will($this->returnValue($appMock)); + + $themeMock = $this->getMock('Mage_Core_Model_Theme', array('getPreviewImage'), array(), '', false); + $themeMock->expects($this->any()) + ->method('getPreviewImage') + ->will($this->returnValue($previewImage)); + $this->_model->setTheme($themeMock); + } + $this->assertEquals($expectedResult, $this->_model->getPreviewImageUrl()); + } + + /** + * @return array + */ + public function getPreviewImageUrlProvider() + { + return array( + array( + null, + 'Mage_Core::theme/default_preview.jpg', + 'Mage_Core::theme/default_preview.jpg', + ), + array( + 'Mage_Core::theme/default_preview.jpg', + null, + 'mediatheme/preview/Mage_Core::theme/default_preview.jpg', + ), + ); + } +} diff --git a/dev/tests/unit/testsuite/Mage/Core/Model/Theme/ServiceTest.php b/dev/tests/unit/testsuite/Mage/Core/Model/Theme/ServiceTest.php index 3b2dfe03f56f5b8616af6aebd30b94b9e83c7d2d..312b1c7d3f098d0af45dd036e8061350bd626328 100644 --- a/dev/tests/unit/testsuite/Mage/Core/Model/Theme/ServiceTest.php +++ b/dev/tests/unit/testsuite/Mage/Core/Model/Theme/ServiceTest.php @@ -158,7 +158,7 @@ class Mage_Core_Model_Theme_ServiceTest extends PHPUnit_Framework_TestCase ->method('getConfigurationDesignTheme') ->with($this->anything(), $this->arrayHasKey('store')) ->will($this->returnCallback( - function($area, $params) { + function ($area, $params) { return $params['store']->getId(); } )); diff --git a/dev/tests/unit/testsuite/Mage/Core/Model/ThemeTest.php b/dev/tests/unit/testsuite/Mage/Core/Model/ThemeTest.php index a7369feda35a8329e6776b6cfa3e5b5b622bb2ae..ab9170bd0d5d6f6a79d7ff82ed00284bb3ca5193 100644 --- a/dev/tests/unit/testsuite/Mage/Core/Model/ThemeTest.php +++ b/dev/tests/unit/testsuite/Mage/Core/Model/ThemeTest.php @@ -33,34 +33,61 @@ class Mage_Core_Model_ThemeTest extends PHPUnit_Framework_TestCase /** * Return Mock of Theme Model loaded from configuration * + * @param bool $fromCollection * @param string $designDir * @param string $targetPath - * @return mixed + * @return Mage_Core_Model_Theme */ - protected function _getThemeModel($designDir, $targetPath) + protected function _getThemeModel($fromCollection = false, $designDir = '', $targetPath = '') { - $objectManager = Mage::getObjectManager(); - /** @var $themeCollection Mage_Core_Model_Resource_Theme_Collection */ $themeCollection = $this->getMock('Mage_Core_Model_Resource_Theme_Collection', array(), array(), '', false); + $objectManagerHelper = new Magento_Test_Helper_ObjectManager($this); $arguments = $objectManagerHelper->getConstructArguments( Magento_Test_Helper_ObjectManager::MODEL_ENTITY, 'Mage_Core_Model_Theme', array( - 'objectManager' => $objectManager, - 'helper' => $objectManager->get('Mage_Core_Helper_Data'), - 'resource' => $objectManager->get('Mage_Core_Model_Resource_Theme'), - 'resourceCollection' => $themeCollection, - 'themeFactory' => $objectManager->get('Mage_Core_Model_Theme_Factory'), + 'objectManager' => $this->getMock('Magento_ObjectManager', array(), array(), '', false), + 'themeFactory' => $this->getMock('Mage_Core_Model_Theme_Factory', array(), array(), '', false), + 'helper' => $this->getMock('Mage_Core_Helper_Data', array(), array(), '', false), + 'themeImage' => $this->getMock('Mage_Core_Model_Theme_Image', array(), array(), '', false), + 'resource' => $this->getMock('Mage_Core_Model_Resource_Theme', array(), array(), '', false), + 'resourceCollection' => $themeCollection ) ); /** @var $themeMock Mage_Core_Model_Theme */ - $themeMock = $this->getMock('Mage_Core_Model_Theme', array('_init'), $arguments, '', true); - $filesystem = new Magento_Filesystem(new Magento_Filesystem_Adapter_Local); + $reflection = new \ReflectionClass('Mage_Core_Model_Theme'); + $themeMock = $reflection->newInstanceArgs($arguments); + + if (!$fromCollection) { + return $themeMock; + } + + $filesystemMock = $this->getMockBuilder('Magento_Filesystem')->disableOriginalConstructor(true)->getMock(); + $filesystemMock->expects($this->any())->method('searchKeys') + ->will($this->returnValueMap(array( + array( + $designDir, str_replace('/', DIRECTORY_SEPARATOR, 'frontend/default/iphone/theme.xml'), + array( + str_replace('/', DIRECTORY_SEPARATOR, $designDir . '/frontend/default/iphone/theme.xml') + ) + ), + array( + $designDir, str_replace('/', DIRECTORY_SEPARATOR, 'frontend/default/iphone/theme_invalid.xml'), + array( + str_replace( + '/', + DIRECTORY_SEPARATOR, + $designDir . '/frontend/default/iphone/theme_invalid.xml' + ) + ) + ), + ) + )); /** @var $collectionMock Mage_Core_Model_Theme_Collection|PHPUnit_Framework_MockObject_MockObject */ $collectionMock = $this->getMock('Mage_Core_Model_Theme_Collection', array('getNewEmptyItem'), - array($filesystem)); + array($filesystemMock)); $collectionMock->expects($this->any()) ->method('getNewEmptyItem') ->will($this->returnValue($themeMock)); @@ -80,7 +107,7 @@ class Mage_Core_Model_ThemeTest extends PHPUnit_Framework_TestCase $this->assertEquals( $this->_expectedThemeDataFromConfiguration(), - $this->_getThemeModel($designDir, $targetPath)->getData() + $this->_getThemeModel(true, $designDir, $targetPath)->getData() ); } @@ -97,7 +124,7 @@ class Mage_Core_Model_ThemeTest extends PHPUnit_Framework_TestCase $this->assertEquals( $this->_expectedThemeDataFromConfiguration(), - $this->_getThemeModel($designDir, $targetPath)->getData() + $this->_getThemeModel(true, $designDir, $targetPath)->getData() ); } @@ -123,4 +150,14 @@ class Mage_Core_Model_ThemeTest extends PHPUnit_Framework_TestCase 'area' => 'frontend', ); } + + public function testSaveThemeCustomization() + { + $themeMock = $this->_getThemeModel(); + $jsFile = $this->getMock('Mage_Core_Model_Theme_Customization_Files_Js', array('saveData'), array(), '', false); + $jsFile->expects($this->atLeastOnce())->method('saveData'); + + $themeMock->setCustomization($jsFile); + $this->assertInstanceOf('Mage_Core_Model_Theme', $themeMock->saveThemeCustomization()); + } } diff --git a/dev/tests/unit/testsuite/Mage/Core/Service/ServiceAbstractTest.php b/dev/tests/unit/testsuite/Mage/Core/Service/ServiceAbstractTest.php deleted file mode 100644 index c353320e711af65d7017cfc9d6ba763e425693d5..0000000000000000000000000000000000000000 --- a/dev/tests/unit/testsuite/Mage/Core/Service/ServiceAbstractTest.php +++ /dev/null @@ -1,84 +0,0 @@ -<?php -/** - * Unit test for abstract service layer Mage_Core_Service_ServiceAbstract - * - * Magento - * - * NOTICE OF LICENSE - * - * This source file is subject to the Open Software License (OSL 3.0) - * that is bundled with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://opensource.org/licenses/osl-3.0.php - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@magentocommerce.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade Magento to newer - * versions in the future. If you wish to customize Magento for your - * needs please refer to http://www.magentocommerce.com for more information. - * - * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) - * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) - */ -class Mage_Core_Service_ServiceAbstractTest extends PHPUnit_Framework_TestCase -{ - /** - * @var Mage_Core_Service_ServiceAbstract|PHPUnit_Framework_MockObject_MockObject - */ - protected $_service; - - /** - * Initialize service abstract for testing - */ - protected function setUp() - { - $this->_service = $this->getMockBuilder('Mage_Core_Service_ServiceAbstract') - ->getMock(); - } - - protected function tearDown() - { - unset($this->_service); - } - - /** - * Test for _setDataUsingMethods method - */ - public function testSetDataUsingMethods() - { - /** @var $entity Varien_Object|PHPUnit_Framework_MockObject_MockObject */ - $entity = $this->getMockBuilder('Varien_Object') - ->setMethods(array('setPropertyA', 'setPropertyB')) - ->getMock(); - - $entity->expects($this->once()) - ->method('setPropertyA') - ->with('a'); - - $entity->expects($this->once()) - ->method('setPropertyB') - ->with('b'); - - $this->_callServiceProtectedMethod('_setDataUsingMethods', - array($entity, array('property_a' => 'a', 'property_b' => 'b'))); - - $this->assertEmpty($entity->getData()); - } - - /** - * Call protected method of service - * - * @param string $method - * @param array $arguments - * @return - */ - protected function _callServiceProtectedMethod($method, array $arguments = array()) - { - $method = new ReflectionMethod($this->_service, $method); - $method->setAccessible(true); - return $method->invokeArgs($this->_service, $arguments); - } -} diff --git a/dev/tests/unit/testsuite/Mage/DesignEditor/Controller/Varien/Router/StandardTest.php b/dev/tests/unit/testsuite/Mage/DesignEditor/Controller/Varien/Router/StandardTest.php index 1c73911e1f09d360a64a5bcf003d22d43c0af451..9a1e08100d0b01f732b209b4f6c54f6d865f5313 100644 --- a/dev/tests/unit/testsuite/Mage/DesignEditor/Controller/Varien/Router/StandardTest.php +++ b/dev/tests/unit/testsuite/Mage/DesignEditor/Controller/Varien/Router/StandardTest.php @@ -185,7 +185,6 @@ class Mage_DesignEditor_Controller_Varien_Router_StandardTest extends PHPUnit_Fr $controllerFactory = $this->getMock('Mage_Core_Controller_Varien_Action_Factory', array(), array(), '', false); $objectManager = $this->getMock('Magento_ObjectManager_Zend', array('get'), array(), '', false); $filesystem = $this->getMockBuilder('Magento_Filesystem')->disableOriginalConstructor()->getMock(); - $app = $this->getMock('Mage_Core_Model_App', array(), array(), '', false); $helper = $this->_getHelperMock(); $backendSession = $this->_getBackendSessionMock($isVde, $isLoggedIn); @@ -220,7 +219,6 @@ class Mage_DesignEditor_Controller_Varien_Router_StandardTest extends PHPUnit_Fr $controllerFactory, $objectManager, $filesystem, - $app, 'frontend', 'Mage_Core_Controller_Varien_Action' ); diff --git a/dev/tests/unit/testsuite/Mage/DesignEditor/controllers/Adminhtml/EditorControllerTest.php b/dev/tests/unit/testsuite/Mage/DesignEditor/controllers/Adminhtml/System/Design/EditorControllerTest.php similarity index 97% rename from dev/tests/unit/testsuite/Mage/DesignEditor/controllers/Adminhtml/EditorControllerTest.php rename to dev/tests/unit/testsuite/Mage/DesignEditor/controllers/Adminhtml/System/Design/EditorControllerTest.php index fe08d8105e52aed552f8782fa7ab671149ed72ec..a3b35f3bb80e82d008bec9f969df7f3b11a67827 100644 --- a/dev/tests/unit/testsuite/Mage/DesignEditor/controllers/Adminhtml/EditorControllerTest.php +++ b/dev/tests/unit/testsuite/Mage/DesignEditor/controllers/Adminhtml/System/Design/EditorControllerTest.php @@ -29,7 +29,7 @@ require 'Mage/DesignEditor/controllers/Adminhtml/System/Design/EditorController. /** * Test backend controller for the design editor */ -class Mage_Core_Model_Theme_EditorControllerTest extends PHPUnit_Framework_TestCase +class Mage_DesignEditor_Controller_Adminhtml_System_Design_EditorControllerTest extends PHPUnit_Framework_TestCase { /** * @var Mage_DesignEditor_Adminhtml_System_Design_EditorController diff --git a/dev/tests/unit/testsuite/Mage/Install/Model/Installer/ConfigTest.php b/dev/tests/unit/testsuite/Mage/Install/Model/Installer/ConfigTest.php new file mode 100644 index 0000000000000000000000000000000000000000..edd88ae24db3ff26cdfc83ac15f953472a0dbf6d --- /dev/null +++ b/dev/tests/unit/testsuite/Mage/Install/Model/Installer/ConfigTest.php @@ -0,0 +1,91 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Mage_Install + * @subpackage unit_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +class Mage_Install_Model_Installer_ConfigTest extends PHPUnit_Framework_TestCase +{ + /** + * @var string + */ + protected static $_tmpConfigFile = ''; + + /** + * @var Mage_Install_Model_Installer_Config + */ + protected $_model; + + public static function setUpBeforeClass() + { + self::$_tmpConfigFile = TESTS_TEMP_DIR . DIRECTORY_SEPARATOR . 'local.xml'; + } + + public static function tearDownAfterClass() + { + if (file_exists(self::$_tmpConfigFile)) { + unlink(self::$_tmpConfigFile); + } + } + + protected function setUp() + { + $this->_model = new Mage_Install_Model_Installer_Config( + $this->getMock('Mage_Core_Model_Config', array(), array(), '', false), + new Mage_Core_Model_Dir(__DIR__, array(), array(Mage_Core_Model_Dir::CONFIG => TESTS_TEMP_DIR)), + new Magento_Filesystem(new Magento_Filesystem_Adapter_Local()) + ); + } + + protected function tearDown() + { + $this->_model = null; + } + + public function testReplaceTmpInstallDate() + { + $datePlaceholder = Mage_Install_Model_Installer_Config::TMP_INSTALL_DATE_VALUE; + $fixtureConfigData = "<date>$datePlaceholder</date>"; + $expectedConfigData = '<date>Sat, 19 Jan 2013 18:50:39 -0800</date>'; + + file_put_contents(self::$_tmpConfigFile, $fixtureConfigData); + $this->assertEquals($fixtureConfigData, file_get_contents(self::$_tmpConfigFile)); + + $this->_model->replaceTmpInstallDate('Sat, 19 Jan 2013 18:50:39 -0800'); + $this->assertEquals($expectedConfigData, file_get_contents(self::$_tmpConfigFile)); + } + + public function testReplaceTmpEncryptKey() + { + $keyPlaceholder = Mage_Install_Model_Installer_Config::TMP_ENCRYPT_KEY_VALUE; + $fixtureConfigData = "<key>$keyPlaceholder</key>"; + $expectedConfigData = '<key>3c7cf2e909fd5e2268a6e1539ae3c835</key>'; + + file_put_contents(self::$_tmpConfigFile, $fixtureConfigData); + $this->assertEquals($fixtureConfigData, file_get_contents(self::$_tmpConfigFile)); + + $this->_model->replaceTmpEncryptKey('3c7cf2e909fd5e2268a6e1539ae3c835'); + $this->assertEquals($expectedConfigData, file_get_contents(self::$_tmpConfigFile)); + } +} diff --git a/dev/tests/unit/testsuite/Mage/Install/Model/Installer/ConsoleTest.php b/dev/tests/unit/testsuite/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit/Form/Element/FileTest.php similarity index 55% rename from dev/tests/unit/testsuite/Mage/Install/Model/Installer/ConsoleTest.php rename to dev/tests/unit/testsuite/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit/Form/Element/FileTest.php index 444fb4d0ee553cbde5f9b3fe5300d5b42172fb04..ed3d303e9e10166914c9ea7b0864d5fae45f907b 100644 --- a/dev/tests/unit/testsuite/Mage/Install/Model/Installer/ConsoleTest.php +++ b/dev/tests/unit/testsuite/Mage/Theme/Block/Adminhtml/System/Design/Theme/Edit/Form/Element/FileTest.php @@ -18,23 +18,22 @@ * versions in the future. If you wish to customize Magento for your * needs please refer to http://www.magentocommerce.com for more information. * - * @category Magento - * @package Mage_Install + * @category Mage + * @package Mage_Theme * @subpackage unit_tests * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) */ -class Mage_Install_Model_Installer_ConsoleTest extends PHPUnit_Framework_TestCase +class Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_From_Element_FileTest extends PHPUnit_Framework_TestCase { - public function testGenerateEncryptionKey() + public function testGetHtmlAttributes() { - /** @var $model Mage_Install_Model_Installer_Console */ - $model = $this->getMock('Mage_Install_Model_Installer_Console', null, array(), '', false); - /** @var $helper Mage_Core_Helper_Data */ - $helper = $this->getMock('Mage_Core_Helper_Data', array('getRandomString'), array(), '', false); - $helper->expects($this->exactly(2))->method('getRandomString')->with(10) - ->will($this->onConsecutiveCalls('1234567890', '0123456789')); - $this->assertNotEquals($model->generateEncryptionKey($helper), $model->generateEncryptionKey($helper)); + /** @var $fileBlock Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Form_Element_File */ + $fileBlock = Mage::getObjectManager()->create( + 'Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Form_Element_File' + ); + $this->assertContains('accept', $fileBlock->getHtmlAttributes()); + $this->assertContains('multiple', $fileBlock->getHtmlAttributes()); } } diff --git a/dev/tests/unit/testsuite/Mage/Theme/Block/Adminhtml/System/Design/Theme/Tab/CssTest.php b/dev/tests/unit/testsuite/Mage/Theme/Block/Adminhtml/System/Design/Theme/Tab/CssTest.php new file mode 100644 index 0000000000000000000000000000000000000000..ac42c61ed9b8a7f21fbfe776524f92890075ff03 --- /dev/null +++ b/dev/tests/unit/testsuite/Mage/Theme/Block/Adminhtml/System/Design/Theme/Tab/CssTest.php @@ -0,0 +1,601 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Theme + * @subpackage unit_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +class Mage_Theme_Block_Adminhtml_System_Design_Theme_Tab_CssTest extends PHPUnit_Framework_TestCase +{ + /** + * @var Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Css + */ + protected $_model; + + /** + * @var Magento_ObjectManager_Zend + */ + protected $_objectManager; + + protected function setUp() + { + $this->_model = $this->getMock( + 'Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Css', + array('_getCurrentTheme'), + $this->_prepareModelArguments(), + '', + true + ); + } + + /** + * @return array + */ + protected function _prepareModelArguments() + { + $objectManagerHelper = new Magento_Test_Helper_ObjectManager($this); + + $this->_objectManager = $this->getMock('Magento_ObjectManager_Zend', array('get'), array(), '', false); + /** @var $dirs Mage_Core_Model_Dir */ + $dirs = new Mage_Core_Model_Dir(__DIR__); + + $constructArguments = $objectManagerHelper->getConstructArguments( + Magento_Test_Helper_ObjectManager::BLOCK_ENTITY, + 'Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Css', + array( + 'objectManager' => $this->_objectManager, + 'dirs' => $dirs, + 'uploaderService' => $this->getMock('Mage_Theme_Model_Uploader_Service', array(), array(), '', false), + 'urlBuilder' => $this->getMock('Mage_Backend_Model_Url', array(), array(), '', false) + ) + ); + return $constructArguments; + } + + protected function tearDown() + { + unset($this->_model); + } + + public function testGetUploadCssFileNote() + { + $method = self::getMethod('_getUploadCssFileNote'); + /** @var $sizeModel Magento_File_Size */ + $sizeModel = $this->getMock('Magento_File_Size', null, array(), '', false); + + $this->_objectManager->expects($this->any()) + ->method('get') + ->with('Magento_File_Size') + ->will($this->returnValue($sizeModel)); + + $result = $method->invokeArgs($this->_model, array()); + $expectedResult = 'Allowed file types *.css.<br />'; + $expectedResult .= 'The file you upload will replace the existing custom.css file (shown below).<br />'; + $expectedResult .= sprintf( + 'Max file size to upload %sM', + $sizeModel->getMaxFileSizeInMb() + ); + $this->assertEquals($expectedResult, $result); + } + + public function testGetAdditionalElementTypes() + { + $method = self::getMethod('_getAdditionalElementTypes'); + + /** @var $configModel Mage_Core_Model_Config */ + $configModel = $this->getMock('Mage_Core_Model_Config', null, array(), '', false); + + $this->_objectManager->expects($this->any()) + ->method('get') + ->with('Mage_Core_Model_Config') + ->will($this->returnValue($configModel)); + + $result = $method->invokeArgs($this->_model, array()); + $expectedResult = array( + 'links' => 'Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Form_Element_Links', + 'css_file' => 'Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Form_Element_File' + ); + $this->assertEquals($expectedResult, $result); + } + + /** + * @param array $files + * @param array $expectedResult + * @dataProvider getGroupedFilesProvider + */ + public function testGetGroupedFiles($files, $expectedResult) + { + $themeMock = $this->getMock('Mage_Core_Model_Theme', array('getThemeTitle', 'getId'), array(), '', false); + $themeMock->expects($this->any())->method('getId')->will($this->returnValue(1)); + $themeMock->expects($this->any())->method('getThemeTitle')->will($this->returnValue('test title')); + + $helperFactoryMock = $this->getMock( + 'Mage_Core_Model_Factory_Helper', array('get', 'urlEncode'), array(), '', false + ); + $helperFactoryMock->expects($this->any())->method('get')->with($this->equalTo('Mage_Theme_Helper_Data')) + ->will($this->returnSelf()); + + $helperFactoryMock->expects($this->any())->method('urlEncode')->will($this->returnArgument(0)); + + $constructArguments = $this->_prepareModelArguments(); + $constructArguments['helperFactory'] = $helperFactoryMock; + $constructArguments['objectManager'] = $objectManagerMock = $this->getMockBuilder('Magento_ObjectManager') + ->setMethods(array('create', 'get')) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + + $collectionMock = $this->getMock( + 'Mage_Core_Model_Resource_Theme_Collection', + get_class_methods('Mage_Core_Model_Resource_Theme_Collection'), + array(), + '', + false + ); + + $collectionMock->expects($this->any())->method('getThemeByFullPath')->will($this->returnValue($themeMock)); + + $configMock = $this->getMock('Mage_Core_Model_Config', get_class_methods('Mage_Core_Model_Config'), + array(), '', false); + + $objectManagerMock->expects($this->any())->method('create') + ->with($this->equalTo('Mage_Core_Model_Resource_Theme_Collection')) + ->will($this->returnValue($collectionMock)); + + $objectManagerMock->expects($this->any())->method('get')->with($this->equalTo('Mage_Core_Model_Config')) + ->will($this->returnValue($configMock)); + + $this->_model = $this->getMock('Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Css', + array('getUrl', '_getCurrentTheme'), $constructArguments, '', true); + + $this->_model->setFiles($files); + $this->_model->expects($this->any())->method('_getCurrentTheme')->will($this->returnValue($themeMock)); + $this->_model->expects($this->any())->method('getUrl')->will($this->returnArgument(1)); + + $method = self::getMethod('_getGroupedFiles'); + $result = $method->invokeArgs($this->_model, array()); + $this->assertEquals($expectedResult, $result); + } + + /** + * @return array + */ + public function getGroupedFilesProvider() + { + /** @var $dirs Mage_Core_Model_Dir */ + $dirs = new Mage_Core_Model_Dir(__DIR__); + + $designDir = str_replace( + $dirs->getDir(Mage_Core_Model_Dir::APP), '', $dirs->getDir(Mage_Core_Model_Dir::THEMES) + ); + $jsDir = str_replace($dirs->getDir(Mage_Core_Model_Dir::APP), '', $dirs->getDir(Mage_Core_Model_Dir::PUB_LIB)); + $codeDir = str_replace( + $dirs->getDir(Mage_Core_Model_Dir::APP), '', $dirs->getDir(Mage_Core_Model_Dir::MODULES) + ); + return array( + array(array(), array()), + array( + array('mage/calendar.css' => str_replace('/', DIRECTORY_SEPARATOR, + $dirs->getDir(Mage_Core_Model_Dir::MODULES) . '/pub/lib/mage/calendar.css')), + array('Framework files' => array( + array( + 'href' => array('theme_id' => 1, 'file' => 'mage/calendar.css'), + 'label' => 'mage/calendar.css', + 'title' => str_replace('/', DIRECTORY_SEPARATOR, $codeDir . '/pub/lib/mage/calendar.css'), + 'delimiter' => '<br />' + )))), + array( + array('Mage_Page::css/tabs.css' => str_replace('/', DIRECTORY_SEPARATOR, + $dirs->getDir(Mage_Core_Model_Dir::MODULES) . '/core/Mage/Page/view/frontend/css/tabs.css')), + array('Framework files' => array( + array( + 'href' => array('theme_id' => 1, 'file' => 'Mage_Page::css/tabs.css'), + 'label' => 'Mage_Page::css/tabs.css', + 'title' => str_replace('/', DIRECTORY_SEPARATOR, + $codeDir . '/core/Mage/Page/view/frontend/css/tabs.css'), + 'delimiter' => '<br />' + )))), + array( + array('mage/calendar.css' => str_replace('/', DIRECTORY_SEPARATOR, + $dirs->getDir(Mage_Core_Model_Dir::PUB_LIB) . '/mage/calendar.css')), + array('Library files' => array( + array( + 'href' => array('theme_id' => 1, 'file' => 'mage/calendar.css'), + 'label' => 'mage/calendar.css', + 'title' => str_replace('/', DIRECTORY_SEPARATOR, $jsDir . '/mage/calendar.css'), + 'delimiter' => '<br />' + )))), + array( + array('mage/calendar.css' => str_replace('/', DIRECTORY_SEPARATOR, + $dirs->getDir(Mage_Core_Model_Dir::THEMES) . '/frontend/default/demo/css/styles.css'), + ), + array('"test title" Theme files' => array( + array( + 'href' => array('theme_id' => 1, 'file' => 'mage/calendar.css'), + 'label' => 'mage/calendar.css', + 'title' => str_replace('/', DIRECTORY_SEPARATOR, + $designDir . '/frontend/default/demo/css/styles.css'), + 'delimiter' => '<br />' + )))), + ); + } + + /** + * @dataProvider sortGroupFilesCallbackProvider + */ + public function testSortGroupFilesCallback($firstGroup, $secondGroup, $expectedResult) + { + $method = self::getMethod('_sortGroupFilesCallback'); + $result = $method->invokeArgs($this->_model, array($firstGroup, $secondGroup)); + $this->assertEquals($expectedResult, $result); + } + + /** + * @return array + */ + public function sortGroupFilesCallbackProvider() + { + return array( + array( + array('label' => 'abcd'), + array('label' => 'abc'), + 1 + ), + array( + array('label' => 'abc'), + array('label' => 'abcd'), + -1 + ), + array( + array('label' => 'abc'), + array('label' => 'abc'), + 0 + ), + array( + array('label' => 'Mage_Core::abc'), + array('label' => 'abc'), + 1 + ), + array( + array('label' => 'abc'), + array('label' => 'Mage_Core::abc'), + -1 + ), + array( + array('label' => 'Mage_Core::abc'), + array('label' => 'Mage_Core::abcd'), + -1 + ), + array( + array('label' => 'Mage_Core::abcd'), + array('label' => 'Mage_Core::abc'), + 1 + ), + array( + array('label' => 'Mage_Core::abc'), + array('label' => 'Mage_Core::abc'), + 0 + ), + ); + } + + /** + * @expectedException Mage_Core_Exception + * @expectedExceptionMessage Invalid view file directory "xyz" + */ + public function testGetGroupException() + { + $method = self::getMethod('_getGroup'); + $method->invokeArgs($this->_model, array('xyz')); + } + + /** + * @param string $filename + * @param string $filePathForSearch + * @param int|string $themeId + * @dataProvider getGroupProvider + */ + public function testGetGroup($filename, $filePathForSearch, $themeId) + { + $constructArguments = $this->_prepareModelArguments(); + $constructArguments['objectManager'] = $objectManagerMock = $this->getMockBuilder('Magento_ObjectManager') + ->setMethods(array('get')) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + + $configMock = $this->getMock('Mage_Core_Model_Config', get_class_methods('Mage_Core_Model_Config'), + array(), '', false); + + $objectManagerMock->expects($this->any())->method('get')->with($this->equalTo('Mage_Core_Model_Config')) + ->will($this->returnValue($configMock)); + + $this->_model = $this->getMock( + 'Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Css', + array('_getThemeByFilename'), + $constructArguments, + '', + true + ); + + $themeMock = $this->getMock('Mage_Core_Model_Theme', array('getThemeId'), array(), '', false); + $themeMock->expects($this->any()) + ->method('getThemeId') + ->will($this->returnValue($themeId)); + + $this->_model->expects($this->any()) + ->method('_getThemeByFilename') + ->with($filePathForSearch) + ->will($this->returnValue($themeMock)); + + $method = self::getMethod('_getGroup'); + $result = $method->invokeArgs($this->_model, array($filename)); + + $this->assertCount(2, $result); + + if ($filePathForSearch) { + $this->assertSame($themeMock, $result[1]); + $this->assertEquals(array($themeId, $themeMock), $result); + } else { + $this->assertEquals(array($themeId, null), $result); + } + } + + /** + * @return array + */ + public function getGroupProvider() + { + /** @var $dirs Mage_Core_Model_Dir */ + $dirs = new Mage_Core_Model_Dir(__DIR__); + + $designDir = $dirs->getDir(Mage_Core_Model_Dir::THEMES); + $jsDir = $dirs->getDir(Mage_Core_Model_Dir::PUB_LIB); + $codeDir = $dirs->getDir(Mage_Core_Model_Dir::MODULES); + + return array( + array( + $designDir . str_replace('/', DIRECTORY_SEPARATOR, '/a/b/c/f/file.xml'), + str_replace('/', DIRECTORY_SEPARATOR, '/a/b/c/f/file.xml'), + 1 + ), + array( + $jsDir . str_replace('/', DIRECTORY_SEPARATOR, '/a/b/c/f/file.xml'), + null, + $jsDir + ), + array( + $codeDir . str_replace('/', DIRECTORY_SEPARATOR, '/a/b/c/f/file.xml'), + null, + $codeDir + ), + ); + } + + /** + * @dataProvider sortThemesByHierarchyCallbackProvider + */ + public function testSortThemesByHierarchyCallback($firstThemeParentId, $parentOfParentTheme, + $secondThemeId, $expectedResult + ) { + list($firstTheme, $secondTheme) = $this->_prepareThemesForHierarchyCallback( + $firstThemeParentId, $parentOfParentTheme, $secondThemeId + ); + + $method = self::getMethod('_sortThemesByHierarchyCallback'); + $result = $method->invokeArgs($this->_model, array($firstTheme, $secondTheme)); + $this->assertEquals($expectedResult, $result); + } + + /** + * @return array + */ + public function sortThemesByHierarchyCallbackProvider() + { + return array( + array(1, null, 1, -1), + array(1, $this->_getThemeMockFroHierarchyCallback(), 2, -1), + array(1, null, 2, 1), + ); + } + + /** + * @param int $firstThemeParentId + * @param Mage_Core_Model_Theme|null $parentOfParentTheme + * @param int $secondThemeId + * @return array + */ + protected function _prepareThemesForHierarchyCallback($firstThemeParentId, $parentOfParentTheme, $secondThemeId) + { + $parentTheme = $this->getMock('Mage_Core_Model_Theme', array('getParentTheme', 'getId'), array(), '', false); + + $firstTheme = $this->getMock('Mage_Core_Model_Theme', array('getParentTheme', 'getId'), array(), '', false); + $firstTheme->expects($this->any()) + ->method('getParentTheme') + ->will($this->returnValue($parentTheme)); + + $firstTheme->expects($this->any()) + ->method('getId') + ->will($this->returnValue(999)); + + $parentTheme->expects($this->any()) + ->method('getId') + ->will($this->returnValue($firstThemeParentId)); + + $parentTheme->expects($this->any()) + ->method('getParentTheme') + ->will($this->returnValue($parentOfParentTheme)); + + $secondTheme = $this->getMock('Mage_Core_Model_Theme', array('getId'), array(), '', false); + $secondTheme->expects($this->any()) + ->method('getId') + ->will($this->returnValue($secondThemeId)); + return array($firstTheme, $secondTheme); + } + + /** + * @return PHPUnit_Framework_MockObject_MockObject + */ + protected function _getThemeMockFroHierarchyCallback() + { + $parentOfParentTheme = $this->getMock('Mage_Core_Model_Theme', array('getId', 'getParentTheme'), + array(), '', false); + $parentOfParentTheme->expects($this->any()) + ->method('getId') + ->will($this->returnValue(2)); + $parentOfParentTheme->expects($this->any()) + ->method('getParentTheme') + ->will($this->returnValue(false)); + + $parentTheme = $this->getMock('Mage_Core_Model_Theme', array('getParentTheme'), array(), '', false); + $parentTheme->expects($this->any()) + ->method('getParentTheme') + ->will($this->returnValue($parentOfParentTheme)); + return $parentTheme; + } + + /** + * @param string $fileName + * @param string $expectedResult + * @dataProvider getThemeByFilenameProvider + */ + public function testGetThemeByFilename($fileName, $expectedResult) + { + $constructArguments = $this->_prepareModelArguments(); + + $constructArguments['objectManager'] = $objectManagerMock = $this->getMockBuilder('Magento_ObjectManager') + ->setMethods(array('create')) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + + $collectionMock = $this->getMock('Mage_Core_Model_Resource_Theme_Collection', + get_class_methods('Mage_Core_Model_Resource_Theme_Collection'), array(), '', false); + + $collectionMock->expects($this->atLeastOnce()) + ->method('getThemeByFullPath') + ->will($this->returnArgument(0)); + + $objectManagerMock->expects($this->atLeastOnce()) + ->method('create') + ->with($this->equalTo('Mage_Core_Model_Resource_Theme_Collection')) + ->will($this->returnValue($collectionMock)); + + $this->_model = $this->getMock( + 'Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Css', array(), $constructArguments, '', true + ); + + $method = self::getMethod('_getThemeByFilename'); + $result = $method->invokeArgs($this->_model, array(str_replace('/', DIRECTORY_SEPARATOR, $fileName))); + $this->assertEquals($expectedResult, $result); + } + + /** + * @return array + */ + public function getThemeByFilenameProvider() + { + return array(array('a/b/c/d/e.xml', 'a/b/c')); + } + + /** + * @expectedException InvalidArgumentException + * @expectedExceptionMessage Theme path does not recognized + */ + public function testGetThemeByFilenameException() + { + $method = self::getMethod('_getThemeByFilename'); + $method->invokeArgs($this->_model, array('a')); + } + + public function testGetGroupLabels() + { + $themeModel = $this->getMock('Mage_Core_Model_Theme', array('getThemeId', 'getThemeTitle'), array(), '', false); + $themeModel->expects($this->any()) + ->method('getThemeId') + ->will($this->returnValue(1)); + + $themeModel->expects($this->any()) + ->method('getThemeTitle') + ->will($this->returnValue('title')); + + $method = self::getMethod('_getGroupLabels'); + $result = $method->invokeArgs($this->_model, array(array($themeModel))); + + $this->assertContains('Library files', $result); + $this->assertContains('Framework files', $result); + $this->assertContains('"title" Theme files', $result); + $this->assertArrayHasKey(1, $result); + } + + /** + * @param array $groups + * @param array $order + * @param array $expectedResult + * @dataProvider sortArrayByArrayProvider + */ + public function testSortArrayByArray($groups, $order, $expectedResult) + { + $method = self::getMethod('_sortArrayByArray'); + $result = $method->invokeArgs($this->_model, array($groups, $order)); + $this->assertEquals($expectedResult, $result); + } + + /** + * @return array + */ + public function sortArrayByArrayProvider() + { + return array( + array( + array('b' => 'item2', 'a' => 'item1', 'c' => 'item3'), + array('a', 'b', 'c'), + array('a' => 'item1', 'b' => 'item2', 'c' => 'item3') + ), + array( + array('x' => 'itemX'), + array('a', 'b', 'c'), + array('x' => 'itemX') + ), + array( + array('b' => 'item2', 'a' => 'item1', 'c' => 'item3', 'd' => 'item4', 'e' => 'item5'), + array('d', 'e'), + array('d' => 'item4', 'e' => 'item5', 'b' => 'item2', 'a' => 'item1', 'c' => 'item3'), + ), + ); + } + + public function testGetTabLabel() + { + $this->assertEquals('CSS Editor', $this->_model->getTabLabel()); + } + + /** + * @param string $name + * @return ReflectionMethod + */ + protected static function getMethod($name) + { + $class = new ReflectionClass('Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Css'); + $method = $class->getMethod($name); + $method->setAccessible(true); + return $method; + } +} diff --git a/dev/tests/unit/testsuite/Mage/Theme/Block/Adminhtml/System/Design/Theme/Tab/JsTest.php b/dev/tests/unit/testsuite/Mage/Theme/Block/Adminhtml/System/Design/Theme/Tab/JsTest.php new file mode 100644 index 0000000000000000000000000000000000000000..9c9ea327544e979cfa225e04346da5156861b404 --- /dev/null +++ b/dev/tests/unit/testsuite/Mage/Theme/Block/Adminhtml/System/Design/Theme/Tab/JsTest.php @@ -0,0 +1,123 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Theme + * @subpackage unit_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +class Mage_Theme_Block_Adminhtml_System_Design_Theme_Tab_JsTest extends PHPUnit_Framework_TestCase +{ + /** + * @var Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Js + */ + protected $_model; + + /** + * @var Mage_Backend_Model_Url + */ + protected $_urlBuilder; + + protected function setUp() + { + $this->_urlBuilder = $this->getMock('Mage_Backend_Model_Url', array(), array(), '', false); + + $objectManagerHelper = new Magento_Test_Helper_ObjectManager($this); + $constructArguments = $objectManagerHelper->getConstructArguments( + Magento_Test_Helper_ObjectManager::BLOCK_ENTITY, + 'Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Js', + array( + 'objectManager' => Mage::getObjectManager(), + 'urlBuilder' => $this->_urlBuilder + ) + ); + + $this->_model = $this->getMock( + 'Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Js', + array('_getCurrentTheme'), + $constructArguments, + '', + true + ); + } + + protected function tearDown() + { + unset($this->_model); + } + + /** + * @param string $name + * @return ReflectionMethod + */ + protected function _getMethod($name) + { + $class = new ReflectionClass('Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Js'); + $method = $class->getMethod($name); + $method->setAccessible(true); + return $method; + } + + public function testGetAdditionalElementTypes() + { + $method = $this->_getMethod('_getAdditionalElementTypes'); + $result = $method->invokeArgs($this->_model, array()); + $expectedResult = array( + 'js_files' => 'Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Form_Element_File' + ); + $this->assertEquals($expectedResult, $result); + } + + public function testGetTabLabel() + { + $this->assertEquals('JS Editor', $this->_model->getTabLabel()); + } + + public function testGetJsUploadUrl() + { + $themeId = 2; + $uploadUrl = 'upload_url'; + $themeMock = $this->getMock('Mage_Core_Model_Theme', array('isVirtual', 'getId'), array(), '', false); + $themeMock->expects($this->any()) + ->method('getId') + ->will($this->returnValue($themeId)); + + $this->_model->expects($this->any()) + ->method('_getCurrentTheme') + ->will($this->returnValue($themeMock)); + + $this->_urlBuilder + ->expects($this->once()) + ->method('getUrl') + ->with('*/system_design_theme/uploadjs', array('id' => $themeId)) + ->will($this->returnValue($uploadUrl)); + + $this->assertEquals($uploadUrl, $this->_model->getJsUploadUrl()); + } + + public function testGetUploadJsFileNote() + { + $method = $this->_getMethod('_getUploadJsFileNote'); + $result = $method->invokeArgs($this->_model, array()); + $this->assertEquals('Allowed file types *.js.', $result); + } +} diff --git a/dev/tests/unit/testsuite/Mage/Theme/Block/Adminhtml/System/Design/Theme/TabAbstractTest.php b/dev/tests/unit/testsuite/Mage/Theme/Block/Adminhtml/System/Design/Theme/TabAbstractTest.php new file mode 100644 index 0000000000000000000000000000000000000000..df130f506526e8eebf3dfea732b1d2b1d9941045 --- /dev/null +++ b/dev/tests/unit/testsuite/Mage/Theme/Block/Adminhtml/System/Design/Theme/TabAbstractTest.php @@ -0,0 +1,115 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Theme + * @subpackage unit_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +class Mage_Theme_Block_Adminhtml_System_Design_Theme_TabAbstractTest extends PHPUnit_Framework_TestCase +{ + /** + * @var Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_TabAbstract + */ + protected $_model; + + protected function setUp() + { + $objectManagerHelper = new Magento_Test_Helper_ObjectManager($this); + $objectManagerModel = $this->getMock('Magento_ObjectManager_Zend', array(), array(), '', false); + + $constructArguments = $objectManagerHelper->getConstructArguments( + Magento_Test_Helper_ObjectManager::BLOCK_ENTITY, + 'Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_Tab_Js', + array( + 'objectManager' => $objectManagerModel, + 'urlBuilder' => $this->getMock('Mage_Backend_Model_Url', array(), array(), '', false) + ) + ); + + $this->_model = $this->getMockForAbstractClass( + 'Mage_Theme_Block_Adminhtml_System_Design_Theme_Edit_TabAbstract', + $constructArguments, '', true, false, true, + array('_getCurrentTheme', 'getTabLabel') + ); + } + + protected function tearDown() + { + unset($this->_model); + } + + public function testGetTabTitle() + { + $label = 'test label'; + $this->_model + ->expects($this->once()) + ->method('getTabLabel') + ->will($this->returnValue($label)); + $this->assertEquals($label, $this->_model->getTabTitle()); + } + + /** + * @dataProvider canShowTabDataProvider + * @param bool $isVirtual + * @param int $themeId + * @param bool $result + */ + public function testCanShowTab($isVirtual, $themeId, $result) + { + $themeMock = $this->getMock('Mage_Core_Model_Theme', array('isVirtual', 'getId'), array(), '', false); + $themeMock->expects($this->any()) + ->method('isVirtual') + ->will($this->returnValue($isVirtual)); + + $themeMock->expects($this->any()) + ->method('getId') + ->will($this->returnValue($themeId)); + + $this->_model->expects($this->any()) + ->method('_getCurrentTheme') + ->will($this->returnValue($themeMock)); + + if ($result === true) { + $this->assertTrue($this->_model->canShowTab()); + } else { + $this->assertFalse($this->_model->canShowTab()); + } + } + + /** + * @return array + */ + public function canShowTabDataProvider() + { + return array( + array(true, 1, true), + array(true, 0, false), + array(false, 1, false), + ); + } + + public function testIsHidden() + { + $this->assertFalse($this->_model->isHidden()); + } +} diff --git a/dev/tests/unit/testsuite/Mage/Theme/Helper/StorageTest.php b/dev/tests/unit/testsuite/Mage/Theme/Helper/StorageTest.php new file mode 100644 index 0000000000000000000000000000000000000000..32cd9c2957c4a252838e5c970f1648eae145ba28 --- /dev/null +++ b/dev/tests/unit/testsuite/Mage/Theme/Helper/StorageTest.php @@ -0,0 +1,344 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Theme + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Storage helper test + */ +class Mage_Theme_Helper_StorageTest extends PHPUnit_Framework_TestCase +{ + /** + * @var null|Magento_Filesystem|PHPUnit_Framework_MockObject_MockObject + */ + protected $_filesystem; + + /** + * @var Mage_Backend_Model_Session|PHPUnit_Framework_MockObject_MockObject + */ + protected $_session; + + /** + * @var Mage_Core_Model_Theme_Factory|PHPUnit_Framework_MockObject_MockObject + */ + protected $_themeFactory; + + /** + * @var Zend_Controller_Request_Http|PHPUnit_Framework_MockObject_MockObject + */ + protected $_request; + + /** + * @var Mage_Theme_Helper_Storage + */ + protected $_storageHelper; + + /** + * @var string + */ + protected $_customizationPath; + + public function setUp() + { + $this->_customizationPath = Magento_Filesystem::DIRECTORY_SEPARATOR + . implode(Magento_Filesystem::DIRECTORY_SEPARATOR, array('var', 'theme')); + + $this->_request = $this->getMock('Zend_Controller_Request_Http', array('getParam'), array(), '', false); + $this->_filesystem = $this->getMock('Magento_Filesystem', array(), array(), '', false); + $this->_session = $this->getMock('Mage_Backend_Model_Session', array(), array(), '', false); + $this->_themeFactory = $this->getMock('Mage_Core_Model_Theme_Factory', array('create'), array(), '', false); + + $this->_storageHelper = $this->getMock('Mage_Theme_Helper_Storage', array('_getRequest'), array(), '', false); + $this->_storageHelper->expects($this->any()) + ->method('_getRequest') + ->will($this->returnValue($this->_request)); + + $filesystemProperty = new ReflectionProperty($this->_storageHelper, '_filesystem'); + $filesystemProperty->setAccessible(true); + $filesystemProperty->setValue($this->_storageHelper, $this->_filesystem); + + $sessionProperty = new ReflectionProperty($this->_storageHelper, '_session'); + $sessionProperty->setAccessible(true); + $sessionProperty->setValue($this->_storageHelper, $this->_session); + + $themeFactoryProperty = new ReflectionProperty($this->_storageHelper, '_themeFactory'); + $themeFactoryProperty->setAccessible(true); + $themeFactoryProperty->setValue($this->_storageHelper, $this->_themeFactory); + } + + public function tearDown() + { + $this->_filesystem = null; + $this->_session = null; + $this->_themeFactory = null; + $this->_request = null; + $this->_storageHelper = null; + $this->_customizationPath = null; + } + + /** + * @param $path + */ + protected function _mockStorageRoot($path) + { + $storageRootProperty = new ReflectionProperty($this->_storageHelper, '_storageRoot'); + $storageRootProperty->setAccessible(true); + $storageRootProperty->setValue($this->_storageHelper, $path); + } + + /** + * @param $path + */ + protected function _mockCurrentPath($path) + { + $currentPathProperty = new ReflectionProperty($this->_storageHelper, '_currentPath'); + $currentPathProperty->setAccessible(true); + $currentPathProperty->setValue($this->_storageHelper, $path); + } + + /** + * @covers Mage_Theme_Helper_Storage::convertPathToId + * @covers Mage_Theme_Helper_Storage::convertIdToPath + */ + public function testConvertPathToId() + { + $storageRoot = $this->_customizationPath . Magento_Filesystem::DIRECTORY_SEPARATOR + . Mage_Theme_Model_Wysiwyg_Storage::TYPE_IMAGE; + $this->_mockStorageRoot($storageRoot); + $path = $storageRoot . Magento_Filesystem::DIRECTORY_SEPARATOR . 'some_dir'; + + $pathId = $this->_storageHelper->convertPathToId($path); + $this->assertEquals('L3NvbWVfZGly', $pathId); + $this->assertEquals($path, $this->_storageHelper->convertIdToPath($pathId)); + } + + /** + * @covers Mage_Theme_Helper_Storage::getShortFilename + */ + public function testGetShortFilename() + { + $longFileName = 'veryLongFileNameMoreThanTwenty'; + $expectedFileName = 'veryLongFileNameMore...'; + $this->assertEquals($expectedFileName, $this->_storageHelper->getShortFilename($longFileName, 20)); + } + + /** + * @covers Mage_Theme_Helper_Storage::getStorageRoot + * @covers Mage_Theme_Helper_Storage::_getTheme + * @covers Mage_Theme_Helper_Storage::getStorageType + */ + public function testGetStorageRoot() + { + $themeId = 6; + $requestMap = array( + array(Mage_Theme_Helper_Storage::PARAM_THEME_ID, null, $themeId), + array(Mage_Theme_Helper_Storage::PARAM_CONTENT_TYPE, null, Mage_Theme_Model_Wysiwyg_Storage::TYPE_IMAGE) + ); + $this->_request->expects($this->any()) + ->method('getParam') + ->will($this->returnValueMap($requestMap)); + + $themeModel = $this->getMock('Mage_Core_Model_Theme', array(), array(), '', false); + $themeModel->expects($this->atLeastOnce()) + ->method('load') + ->with($themeId) + ->will($this->returnSelf()); + $themeModel->expects($this->atLeastOnce()) + ->method('getId') + ->will($this->returnValue($themeId)); + $themeModel->expects($this->atLeastOnce()) + ->method('getCustomizationPath') + ->will($this->returnValue($this->_customizationPath)); + $this->_themeFactory->expects($this->any()) + ->method('create') + ->will($this->returnValue($themeModel)); + + $expectedStorageRoot = implode(Magento_Filesystem::DIRECTORY_SEPARATOR, array( + $this->_customizationPath, + Mage_Core_Model_Theme_Files::PATH_PREFIX_CUSTOMIZED, + Mage_Theme_Model_Wysiwyg_Storage::TYPE_IMAGE + )); + $this->assertEquals($expectedStorageRoot, $this->_storageHelper->getStorageRoot()); + } + + /** + * @covers Mage_Theme_Helper_Storage::getRelativeUrl + */ + public function testGetRelativeUrl() + { + $imageName = 'imageName.jpg'; + $dirOne = 'some_dir'; + $dirTwo = 'test_der'; + $nodePath = Magento_Filesystem::DIRECTORY_SEPARATOR + . implode(Magento_Filesystem::DIRECTORY_SEPARATOR, array($dirOne, $dirTwo)); + + $requestMap = array( + array(Mage_Theme_Helper_Storage::PARAM_NODE, null, $this->_storageHelper->urlEncode($nodePath)), + array(Mage_Theme_Helper_Storage::PARAM_FILENAME, null, $this->_storageHelper->urlEncode($imageName)), + array(Mage_Theme_Helper_Storage::PARAM_CONTENT_TYPE, null, Mage_Theme_Model_Wysiwyg_Storage::TYPE_IMAGE) + ); + $this->_request->expects($this->any()) + ->method('getParam') + ->will($this->returnValueMap($requestMap)); + + //'../image/some_dir/test_der/imageName.jpg' + $expectedPath = implode('/', array( + '..', + Mage_Theme_Model_Wysiwyg_Storage::TYPE_IMAGE, + $dirOne, + $dirTwo, + $imageName + )); + $this->assertEquals($expectedPath, $this->_storageHelper->getRelativeUrl()); + } + + /** + * @covers Mage_Theme_Helper_Storage::getCurrentPath + */ + public function testGetCurrentPath() + { + $subPath = Magento_Filesystem::DIRECTORY_SEPARATOR . 'some_dir'; + $encodedSubPath = $this->_storageHelper->urlEncode($subPath); + $storageRoot = $this->_customizationPath . Magento_Filesystem::DIRECTORY_SEPARATOR + . Mage_Theme_Model_Wysiwyg_Storage::TYPE_IMAGE; + + $expectedPath = $storageRoot . $subPath; + $this->_request->expects($this->once()) + ->method('getParam') + ->will($this->returnValue($encodedSubPath)); + + $this->_filesystem->expects($this->atLeastOnce()) + ->method('isDirectory') + ->with($expectedPath) + ->will($this->returnValue(true)); + + $filesystem = $this->_filesystem; + $filesystem::staticExpects($this->atLeastOnce()) + ->method('isPathInDirectory')->with($expectedPath, $storageRoot) + ->will($this->returnValue(true)); + + $filesystem::staticExpects($this->atLeastOnce()) + ->method('getAbsolutePath') + ->will($this->returnArgument(0)); + + $this->_mockStorageRoot($storageRoot); + $this->assertEquals($expectedPath, $this->_storageHelper->getCurrentPath()); + } + + /** + * @covers Mage_Theme_Helper_Storage::getThumbnailDirectory + */ + public function testGetThumbnailDirectory() + { + $imagePath = implode(Magento_Filesystem::DIRECTORY_SEPARATOR, array('root', 'image', 'image_name.jpg')); + $thumbnailDir = implode( + Magento_Filesystem::DIRECTORY_SEPARATOR, + array('root', 'image', Mage_Theme_Model_Wysiwyg_Storage::THUMBNAIL_DIRECTORY) + ); + + $this->assertEquals($thumbnailDir, $this->_storageHelper->getThumbnailDirectory($imagePath)); + } + + /** + * @covers Mage_Theme_Helper_Storage::getThumbnailPath + */ + public function testGetThumbnailPath() + { + $image = 'image_name.jpg'; + $storageRoot = $this->_customizationPath . Magento_Filesystem::DIRECTORY_SEPARATOR + . Mage_Theme_Model_Wysiwyg_Storage::TYPE_IMAGE; + $currentPath = $storageRoot . Magento_Filesystem::DIRECTORY_SEPARATOR . 'some_dir'; + + $imagePath = $currentPath . Magento_Filesystem::DIRECTORY_SEPARATOR . $image; + $thumbnailPath = implode( + Magento_Filesystem::DIRECTORY_SEPARATOR, + array($currentPath, Mage_Theme_Model_Wysiwyg_Storage::THUMBNAIL_DIRECTORY, $image) + ); + + $this->_filesystem->expects($this->atLeastOnce()) + ->method('has') + ->with($imagePath) + ->will($this->returnValue(true)); + + $filesystem = $this->_filesystem; + $filesystem::staticExpects($this->atLeastOnce()) + ->method('isPathInDirectory') + ->with($imagePath, $storageRoot) + ->will($this->returnValue(true)); + + $this->_mockStorageRoot($storageRoot); + $this->_mockCurrentPath($currentPath); + + $this->assertEquals($thumbnailPath, $this->_storageHelper->getThumbnailPath($image)); + } + + /** + * @covers Mage_Theme_Helper_Storage::getRequestParams + */ + public function testGetRequestParams() + { + $node = 'node'; + $themeId = 16; + $contentType = Mage_Theme_Model_Wysiwyg_Storage::TYPE_IMAGE; + + $requestMap = array( + array(Mage_Theme_Helper_Storage::PARAM_NODE, null, $node), + array(Mage_Theme_Helper_Storage::PARAM_THEME_ID, null, $themeId), + array(Mage_Theme_Helper_Storage::PARAM_CONTENT_TYPE, null, $contentType) + ); + $this->_request->expects($this->any()) + ->method('getParam') + ->will($this->returnValueMap($requestMap)); + + $expectedResult = array( + Mage_Theme_Helper_Storage::PARAM_THEME_ID => $themeId, + Mage_Theme_Helper_Storage::PARAM_CONTENT_TYPE => $contentType, + Mage_Theme_Helper_Storage::PARAM_NODE => $node + ); + $this->assertEquals($expectedResult, $this->_storageHelper->getRequestParams()); + } + + /** + * @covers Mage_Theme_Helper_Storage::getAllowedExtensionsByType + */ + public function testGetAllowedExtensionsByType() + { + $this->_request->expects($this->at(0)) + ->method('getParam') + ->with(Mage_Theme_Helper_Storage::PARAM_CONTENT_TYPE) + ->will($this->returnValue(Mage_Theme_Model_Wysiwyg_Storage::TYPE_FONT)); + + $this->_request->expects($this->at(1)) + ->method('getParam') + ->with(Mage_Theme_Helper_Storage::PARAM_CONTENT_TYPE) + ->will($this->returnValue(Mage_Theme_Model_Wysiwyg_Storage::TYPE_IMAGE)); + + + $fontTypes = $this->_storageHelper->getAllowedExtensionsByType(); + $this->assertEquals(array('ttf', 'otf', 'eot', 'svg', 'woff'), $fontTypes); + + $imagesTypes = $this->_storageHelper->getAllowedExtensionsByType(); + $this->assertEquals(array('jpg', 'jpeg', 'gif', 'png', 'xbm', 'wbmp'), $imagesTypes); + } +} diff --git a/dev/tests/unit/testsuite/Mage/Theme/Model/Wysiwyg/StorageTest.php b/dev/tests/unit/testsuite/Mage/Theme/Model/Wysiwyg/StorageTest.php new file mode 100644 index 0000000000000000000000000000000000000000..6dbfebf348d8ab8df3b47342b4165aa073ff0d15 --- /dev/null +++ b/dev/tests/unit/testsuite/Mage/Theme/Model/Wysiwyg/StorageTest.php @@ -0,0 +1,331 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Theme + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Storage model test + */ +class Mage_Theme_Model_Wysiwyg_StorageTest extends PHPUnit_Framework_TestCase +{ + /** + * @var string + */ + protected $_storageRoot; + + /** + * @var Magento_Filesystem|PHPUnit_Framework_MockObject_MockObject + */ + protected $_filesystem; + + /** + * @var Mage_Theme_Helper_Storage + */ + protected $_helperStorage; + + /** + * @var Magento_ObjectManager + */ + protected $_objectManager; + + /** + * @var null|Mage_Theme_Model_Wysiwyg_Storage + */ + protected $_storageModel; + + public function setUp() + { + $this->_filesystem = $this->getMock('Magento_Filesystem', array(), array(), '', false); + $this->_helperStorage = $this->getMock('Mage_Theme_Helper_Storage', array(), array(), '', false); + $this->_objectManager = $this->getMock('Magento_ObjectManager', array(), array(), '', false); + + $this->_storageModel = new Mage_Theme_Model_Wysiwyg_Storage( + $this->_filesystem, + $this->_helperStorage, + $this->_objectManager + ); + + $this->_storageRoot = Magento_Filesystem::DIRECTORY_SEPARATOR . 'root'; + } + + public function tearDown() + { + $this->_filesystem = null; + $this->_helperStorage = null; + $this->_objectManager = null; + $this->_storageModel = null; + $this->_storageRoot = null; + } + + /** + * @covers Mage_Theme_Model_Wysiwyg_Storage::createFolder + */ + public function testCreateFolder() + { + $newDirectoryName = 'dir1'; + $fullNewPath = $this->_storageRoot . Magento_Filesystem::DIRECTORY_SEPARATOR . $newDirectoryName; + + $this->_filesystem->expects($this->once()) + ->method('isWritable') + ->with($this->_storageRoot) + ->will($this->returnValue(true)); + + $this->_filesystem->expects($this->once()) + ->method('has') + ->with($fullNewPath) + ->will($this->returnValue(false)); + + $this->_filesystem->expects($this->once()) + ->method('ensureDirectoryExists') + ->with($fullNewPath); + + + $this->_helperStorage->expects($this->once()) + ->method('getShortFilename') + ->with($newDirectoryName) + ->will($this->returnValue($newDirectoryName)); + + $this->_helperStorage->expects($this->once()) + ->method('convertPathToId') + ->with($fullNewPath) + ->will($this->returnValue($newDirectoryName)); + + $this->_helperStorage->expects($this->once()) + ->method('getStorageRoot') + ->will($this->returnValue($this->_storageRoot)); + + $expectedResult = array( + 'name' => $newDirectoryName, + 'short_name' => $newDirectoryName, + 'path' => Magento_Filesystem::DIRECTORY_SEPARATOR . $newDirectoryName, + 'id' => $newDirectoryName + ); + + $this->assertEquals( + $expectedResult, + $this->_storageModel->createFolder($newDirectoryName, $this->_storageRoot) + ); + } + + /** + * @covers Mage_Theme_Model_Wysiwyg_Storage::getDirsCollection + */ + public function testGetDirsCollection() + { + $dirs = array( + $this->_storageRoot . Magento_Filesystem::DIRECTORY_SEPARATOR . 'dir1', + $this->_storageRoot . Magento_Filesystem::DIRECTORY_SEPARATOR . 'dir2' + ); + + $this->_filesystem->expects($this->once()) + ->method('has') + ->with($this->_storageRoot) + ->will($this->returnValue(true)); + + $this->_filesystem->expects($this->once()) + ->method('searchKeys') + ->with($this->_storageRoot, '*') + ->will($this->returnValue($dirs)); + + $this->_filesystem->expects($this->any()) + ->method('isDirectory') + ->will($this->returnValue(true)); + + $this->assertEquals($dirs, $this->_storageModel->getDirsCollection($this->_storageRoot)); + } + + /** + * @covers Mage_Theme_Model_Wysiwyg_Storage::getFilesCollection + */ + public function testGetFilesCollection() + { + $this->_helperStorage->expects($this->once()) + ->method('getCurrentPath') + ->will($this->returnValue($this->_storageRoot)); + + $this->_helperStorage->expects($this->once()) + ->method('getStorageType') + ->will($this->returnValue(Mage_Theme_Model_Wysiwyg_Storage::TYPE_FONT)); + + $this->_helperStorage->expects($this->any()) + ->method('urlEncode') + ->will($this->returnArgument(0)); + + + $paths = array( + $this->_storageRoot . Magento_Filesystem::DIRECTORY_SEPARATOR . 'font1.ttf', + $this->_storageRoot . Magento_Filesystem::DIRECTORY_SEPARATOR . 'font2.ttf' + ); + + $this->_filesystem->expects($this->once()) + ->method('searchKeys') + ->with($this->_storageRoot, '*') + ->will($this->returnValue($paths)); + + $this->_filesystem->expects($this->any()) + ->method('isFile') + ->will($this->returnValue(true)); + + $result = $this->_storageModel->getFilesCollection(); + + $this->assertCount(2, $result); + $this->assertEquals('font1.ttf', $result[0]['text']); + $this->assertEquals('font2.ttf', $result[1]['text']); + } + + /** + * @covers Mage_Theme_Model_Wysiwyg_Storage::getTreeArray + */ + public function testTreeArray() + { + $currentPath = $this->_storageRoot . Magento_Filesystem::DIRECTORY_SEPARATOR . 'dir'; + $dirs = array( + $currentPath . Magento_Filesystem::DIRECTORY_SEPARATOR . 'dir_one', + $currentPath . Magento_Filesystem::DIRECTORY_SEPARATOR . 'dir_two' + ); + + $expectedResult = array( + array( + 'text' => pathinfo($dirs[0], PATHINFO_BASENAME), + 'id' => $dirs[0], + 'cls' => 'folder' + ), + array( + 'text' => pathinfo($dirs[1], PATHINFO_BASENAME), + 'id' => $dirs[1], + 'cls' => 'folder' + )); + + $this->_filesystem->expects($this->once()) + ->method('has') + ->with($currentPath) + ->will($this->returnValue(true)); + + $this->_filesystem->expects($this->once()) + ->method('searchKeys') + ->with($currentPath, '*') + ->will($this->returnValue($dirs)); + + $this->_filesystem->expects($this->any()) + ->method('isDirectory') + ->will($this->returnValue(true)); + + + $this->_helperStorage->expects($this->once()) + ->method('getCurrentPath') + ->will($this->returnValue($currentPath)); + + $this->_helperStorage->expects($this->any()) + ->method('getShortFilename') + ->will($this->returnArgument(0)); + + $this->_helperStorage->expects($this->any()) + ->method('convertPathToId') + ->will($this->returnArgument(0)); + + $result = $this->_storageModel->getTreeArray(); + $this->assertEquals($expectedResult, $result); + } + + /** + * @covers Mage_Theme_Model_Wysiwyg_Storage::deleteFile + */ + public function testDeleteFile() + { + $image = 'image.jpg'; + $storagePath = $this->_storageRoot; + $imagePath = $storagePath . Magento_Filesystem::DIRECTORY_SEPARATOR . $image; + $thumbnailDir = $this->_storageRoot . Magento_Filesystem::DIRECTORY_SEPARATOR + . Mage_Theme_Model_Wysiwyg_Storage::THUMBNAIL_DIRECTORY; + + $session = $this->getMock('Mage_Backend_Model_Session', array('getStoragePath'), array(), '', false); + $session->expects($this->atLeastOnce()) + ->method('getStoragePath') + ->will($this->returnValue($storagePath)); + + $this->_helperStorage->expects($this->atLeastOnce()) + ->method('getSession') + ->will($this->returnValue($session)); + + $this->_helperStorage->expects($this->atLeastOnce()) + ->method('urlDecode') + ->with($image) + ->will($this->returnArgument(0)); + + $this->_helperStorage->expects($this->atLeastOnce()) + ->method('getThumbnailDirectory') + ->with($imagePath) + ->will($this->returnValue($thumbnailDir)); + + $this->_helperStorage->expects($this->atLeastOnce()) + ->method('getStorageRoot') + ->will($this->returnValue($this->_storageRoot)); + + + $filesystem = $this->_filesystem; + $filesystem::staticExpects($this->once()) + ->method('getAbsolutePath') + ->with($imagePath) + ->will($this->returnValue($imagePath)); + + $filesystem::staticExpects($this->any()) + ->method('isPathInDirectory') + ->with($imagePath, $storagePath) + ->will($this->returnValue(true)); + + $filesystem::staticExpects($this->any()) + ->method('isPathInDirectory') + ->with($imagePath, $this->_storageRoot) + ->will($this->returnValue(true)); + + $this->_filesystem->expects($this->at(0)) + ->method('delete') + ->with($imagePath); + + $this->_filesystem->expects($this->at(1)) + ->method('delete') + ->with($thumbnailDir . Magento_Filesystem::DIRECTORY_SEPARATOR . $image); + + $this->assertInstanceOf('Mage_Theme_Model_Wysiwyg_Storage', $this->_storageModel->deleteFile($image)); + } + + /** + * @covers Mage_Theme_Model_Wysiwyg_Storage::deleteDirectory + */ + public function testDeleteDirectory() + { + $directoryPath = $this->_storageRoot . Magento_Filesystem::DIRECTORY_SEPARATOR . '..' + . Magento_Filesystem::DIRECTORY_SEPARATOR . 'root'; + + $this->_helperStorage->expects($this->atLeastOnce()) + ->method('getStorageRoot') + ->will($this->returnValue($this->_storageRoot)); + + $this->_filesystem->expects($this->once()) + ->method('delete') + ->with($directoryPath); + + $this->_storageModel->deleteDirectory($directoryPath); + } +} diff --git a/dev/tests/unit/testsuite/Mage/Theme/controller/Adminhtml/System/Design/ThemeControllerTest.php b/dev/tests/unit/testsuite/Mage/Theme/controller/Adminhtml/System/Design/ThemeControllerTest.php new file mode 100644 index 0000000000000000000000000000000000000000..1a5b01d9c8c3be9319e0b63161962982f86092cb --- /dev/null +++ b/dev/tests/unit/testsuite/Mage/Theme/controller/Adminhtml/System/Design/ThemeControllerTest.php @@ -0,0 +1,151 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Magento + * @package Mage_Theme + * @subpackage unit_tests + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +require 'Mage/Theme/controllers/Adminhtml/System/Design/ThemeController.php'; +/** + * Test backend controller for the theme + */ +class Mage_Theme_Controller_Adminhtml_System_Design_ThemeControllerTest extends PHPUnit_Framework_TestCase +{ + /** + * @var Mage_Theme_Adminhtml_System_Design_ThemeController + */ + protected $_model; + + /** + * @var PHPUnit_Framework_MockObject_MockObject + */ + protected $_objectManagerMock; + + /** + * @var PHPUnit_Framework_MockObject_MockObject + */ + protected $_request; + + protected function setUp() + { + $this->_objectManagerMock = $this->getMock('Magento_ObjectManager_Zend', + array('create', 'get'), array(), '', false); + + $this->_request = $this->getMock( + 'Mage_Core_Controller_Request_Http', array('getParam', 'getPost'), array(), '', false + ); + + $this->_model = $this->getMock('Mage_Theme_Adminhtml_System_Design_ThemeController', + array('_forward', '_title', '__', 'loadLayout', 'renderLayout', '_redirect', '_getSession'), + array( + $this->_request, + $this->getMock('Mage_Core_Controller_Response_Http', array(), array(), '', false), + null, + $this->_objectManagerMock, + $this->getMock('Mage_Core_Controller_Varien_Front', array(), array(), '', false), + $this->getMock('Mage_Core_Model_Layout_Factory', array(), array(), '', false), + array( + 'translator' => 'translator', + 'helper' => 'helper', + 'session' => 'session' + ) + )); + $this->_model->expects($this->any())->method('_title')->will($this->returnValue($this->_model)); + $this->_model->expects($this->any())->method('loadLayout'); + $this->_model->expects($this->any())->method('renderLayout'); + $this->_model->expects($this->any())->method('__'); + + $sessionMock = $this->getMock('Mage_Backend_Model_Session', array('addSuccess'), array(), '', false); + $this->_model->expects($this->any())->method('_getSession')->will($this->returnValue($sessionMock)); + } + + /** + * @covers Mage_Theme_Adminhtml_System_Design_ThemeController::saveAction + */ + public function testSaveAction() + { + $themeData = 'theme data'; + $customCssContent = 'custom css content'; + $jsUploadedFiles = array(1, 2); + $jsRemovedFiles = array(3, 4); + $jsOrder = array(1 => '1', 2 => 'test'); + + $this->_request->expects($this->at(0))->method('getParam')->with('back', false) + ->will($this->returnValue(true)); + $this->_request->expects($this->once(1))->method('getPost')->will($this->returnValue(true)); + $this->_request->expects($this->at(2))->method('getParam')->with('theme') + ->will($this->returnValue($themeData)); + $this->_request->expects($this->at(3))->method('getParam')->with('custom_css_content') + ->will($this->returnValue($customCssContent)); + $this->_request->expects($this->at(4))->method('getParam')->with('js_uploaded_files') + ->will($this->returnValue($jsUploadedFiles)); + $this->_request->expects($this->at(5))->method('getParam')->with('js_removed_files') + ->will($this->returnValue($jsRemovedFiles)); + $this->_request->expects($this->at(6))->method('getParam')->with('js_order') + ->will($this->returnValue($jsOrder)); + + $filesCssMock = $this->getMock( + 'Mage_Core_Model_Theme_Customization_Files_Css', array('setDataForSave'), array(), '', false + ); + $filesCssMock->expects($this->at(0))->method('setDataForSave')->with($customCssContent); + + $filesJsMock = $this->getMock( + 'Mage_Core_Model_Theme_Customization_Files_Js', + array('setDataForSave', 'setDataForDelete', 'setJsOrderData'), + array(), + '', + false + ); + $filesJsMock->expects($this->at(0))->method('setDataForSave')->with($jsUploadedFiles); + $filesJsMock->expects($this->at(1))->method('setDataForDelete')->with($jsRemovedFiles); + $filesJsMock->expects($this->at(2))->method('setJsOrderData')->with(array_keys($jsOrder)); + + $themeMock = $this->getMock( + 'Mage_Core_Model_Theme', array('setCustomization', 'saveFormData'), array(), '', false + ); + $themeMock->expects($this->at(0))->method('setCustomization')->with($filesCssMock); + $themeMock->expects($this->at(1))->method('setCustomization')->with($filesJsMock); + $themeMock->expects($this->at(2))->method('saveFormData')->with($themeData); + + $this->_objectManagerMock + ->expects($this->at(0)) + ->method('create') + ->with('Mage_Core_Model_Theme') + ->will($this->returnValue($themeMock)); + + $this->_objectManagerMock + ->expects($this->at(1)) + ->method('create') + ->with('Mage_Core_Model_Theme_Customization_Files_Css') + ->will($this->returnValue($filesCssMock)); + + $this->_objectManagerMock + ->expects($this->at(2)) + ->method('create') + ->with('Mage_Core_Model_Theme_Customization_Files_Js') + ->will($this->returnValue($filesJsMock)); + + $this->_model->saveAction(); + } + +} diff --git a/dev/tests/unit/testsuite/Magento/FilesystemPathsTest.php b/dev/tests/unit/testsuite/Magento/FilesystemPathsTest.php deleted file mode 100644 index fc38f88a973f6d976f794592a057222668786cc0..0000000000000000000000000000000000000000 --- a/dev/tests/unit/testsuite/Magento/FilesystemPathsTest.php +++ /dev/null @@ -1,153 +0,0 @@ -<?php -/** - * Unit Test for Magento_Filesystem - * - * Magento - * - * NOTICE OF LICENSE - * - * This source file is subject to the Open Software License (OSL 3.0) - * that is bundled with this package in the file LICENSE.txt. - * It is also available through the world-wide-web at this URL: - * http://opensource.org/licenses/osl-3.0.php - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@magentocommerce.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade Magento to newer - * versions in the future. If you wish to customize Magento for your - * needs please refer to http://www.magentocommerce.com for more information. - * - * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) - * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) - */ -class Magento_FilesystemPathsTest extends PHPUnit_Framework_TestCase -{ - /** - * @dataProvider absolutePathDataProvider - * @param string $path - * @param string $expected - */ - public function testGetAbsolutePath($path, $expected) - { - $this->assertEquals($expected, Magento_Filesystem::getAbsolutePath($path)); - } - - /** - * @return array - */ - public function absolutePathDataProvider() - { - return array( - array('/tmp/../file.txt', '/file.txt'), - array('/tmp/../etc/mysql/file.txt', '/etc/mysql/file.txt'), - array('/tmp/../file.txt', '/file.txt'), - array('/tmp/./file.txt', '/tmp/file.txt'), - array('/tmp/./../file.txt', '/file.txt'), - array('/tmp/../../../file.txt', '/file.txt'), - array('../file.txt', '/file.txt'), - array('/../file.txt', '/file.txt'), - array('/tmp/path/file.txt', '/tmp/path/file.txt'), - array('/tmp/path', '/tmp/path'), - array('C:\\Windows', 'C:/Windows'), - array('C:\\Windows\\system32\\..', 'C:/Windows'), - ); - } - - /** - * @dataProvider pathDataProvider - * @param array $parts - * @param string $expected - * @param bool $isAbsolute - */ - public function testGetPathFromArray(array $parts, $expected, $isAbsolute) - { - $expected = Magento_Filesystem::fixSeparator($expected); - $this->assertEquals($expected, Magento_Filesystem::getPathFromArray($parts, $isAbsolute)); - } - - /** - * @return array - */ - public function pathDataProvider() - { - return array( - array(array('etc', 'mysql', 'my.cnf'), '/etc/mysql/my.cnf',true), - array(array('etc', 'mysql', 'my.cnf'), 'etc/mysql/my.cnf', false), - array(array('C:', 'Windows', 'my.cnf'), 'C:/Windows/my.cnf', false), - array(array('C:', 'Windows', 'my.cnf'), 'C:/Windows/my.cnf', true), - array(array('C:', 'Windows', 'my.cnf'), 'C:\\Windows/my.cnf', true), - ); - } - - /** - * @dataProvider pathDataProvider - * @param array $expected - * @param string $path - */ - public function testGetPathAsArray(array $expected, $path) - { - $this->assertEquals($expected, Magento_Filesystem::getPathAsArray($path)); - } - - /** - * @dataProvider isAbsolutePathDataProvider - * @param bool $isReal - * @param string $path - */ - public function testIsAbsolutePath($isReal, $path) - { - $this->assertEquals($isReal, Magento_Filesystem::isAbsolutePath($path)); - } - - /** - * @return array - */ - public function isAbsolutePathDataProvider() - { - return array( - array(true, '/tmp/file.txt'), - array(false, '/tmp/../etc/mysql/my.cnf'), - array(false, '/tmp/../tmp/file.txt'), - array(false, 'C:\Temp\..\tmpfile.txt'), - array(true, 'C:\Temp\tmpfile.txt'), - array(true, '/tmp/'), - array(true, '/tmp'), - ); - } - - /** - * @expectedException InvalidArgumentException - * @expectedExceptionMessage Path must contain at least one node - */ - public function testGetPathFromArrayException() - { - Magento_Filesystem::getPathFromArray(array()); - } - - /** - * @dataProvider isPathInDirectoryDataProvider - * @param string $path - * @param string $directory - * @param boolean $expectedValue - */ - public function testIsPathInDirectory($path, $directory, $expectedValue) - { - $this->assertEquals($expectedValue, Magento_Filesystem::isPathInDirectory($path, $directory)); - } - - /** - * @return array - */ - public function isPathInDirectoryDataProvider() - { - return array( - array('/tmp/file', '/tmp', true), - array('/tmp/file', '/tmp/dir', false), - array('/tmp', '/tmp/', true), - array('/tmp/', '/tmp', true), - ); - } -} diff --git a/dev/tests/unit/testsuite/Magento/FilesystemTest.php b/dev/tests/unit/testsuite/Magento/FilesystemTest.php index 884a18c153fe8987465161b8230e98ed5f78c93b..7bb2ae7723adc07c81921833d08ba3bdffdf4c08 100644 --- a/dev/tests/unit/testsuite/Magento/FilesystemTest.php +++ b/dev/tests/unit/testsuite/Magento/FilesystemTest.php @@ -22,6 +22,9 @@ * * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * + * @SuppressWarnings(PHPMD.TooManyMethods) + * @SuppressWarnings(PHPMD.ExcessivePublicCount) */ class Magento_FilesystemTest extends PHPUnit_Framework_TestCase { @@ -799,6 +802,108 @@ class Magento_FilesystemTest extends PHPUnit_Framework_TestCase $this->assertTrue($filesystem->isDirectory($validPath, $workingDirectory)); } + /** + * @dataProvider absolutePathDataProvider + * @param string $path + * @param string $expected + */ + public function testGetAbsolutePath($path, $expected) + { + $this->assertEquals($expected, Magento_Filesystem::getAbsolutePath($path)); + } + + /** + * @return array + */ + public function absolutePathDataProvider() + { + return array( + array('/tmp/../file.txt', '/file.txt'), + array('/tmp/../etc/mysql/file.txt', '/etc/mysql/file.txt'), + array('/tmp/../file.txt', '/file.txt'), + array('/tmp/./file.txt', '/tmp/file.txt'), + array('/tmp/./../file.txt', '/file.txt'), + array('/tmp/../../../file.txt', '/file.txt'), + array('../file.txt', '/file.txt'), + array('/../file.txt', '/file.txt'), + array('/tmp/path/file.txt', '/tmp/path/file.txt'), + array('/tmp/path', '/tmp/path'), + array('C:\\Windows', 'C:/Windows'), + array('C:\\Windows\\system32\\..', 'C:/Windows'), + ); + } + + /** + * @dataProvider pathDataProvider + * @param array $parts + * @param string $expected + * @param bool $isAbsolute + */ + public function testGetPathFromArray(array $parts, $expected, $isAbsolute) + { + $expected = Magento_Filesystem::fixSeparator($expected); + $this->assertEquals($expected, Magento_Filesystem::getPathFromArray($parts, $isAbsolute)); + } + + /** + * @return array + */ + public function pathDataProvider() + { + return array( + array(array('etc', 'mysql', 'my.cnf'), '/etc/mysql/my.cnf',true), + array(array('etc', 'mysql', 'my.cnf'), 'etc/mysql/my.cnf', false), + array(array('C:', 'Windows', 'my.cnf'), 'C:/Windows/my.cnf', false), + array(array('C:', 'Windows', 'my.cnf'), 'C:/Windows/my.cnf', true), + array(array('C:', 'Windows', 'my.cnf'), 'C:\\Windows/my.cnf', true), + ); + } + + /** + * @dataProvider pathDataProvider + * @param array $expected + * @param string $path + */ + public function testGetPathAsArray(array $expected, $path) + { + $this->assertEquals($expected, Magento_Filesystem::getPathAsArray($path)); + } + + /** + * @dataProvider isAbsolutePathDataProvider + * @param bool $isReal + * @param string $path + */ + public function testIsAbsolutePath($isReal, $path) + { + $this->assertEquals($isReal, Magento_Filesystem::isAbsolutePath($path)); + } + + /** + * @return array + */ + public function isAbsolutePathDataProvider() + { + return array( + array(true, '/tmp/file.txt'), + array(false, '/tmp/../etc/mysql/my.cnf'), + array(false, '/tmp/../tmp/file.txt'), + array(false, 'C:\Temp\..\tmpfile.txt'), + array(true, 'C:\Temp\tmpfile.txt'), + array(true, '/tmp/'), + array(true, '/tmp'), + ); + } + + /** + * @expectedException InvalidArgumentException + * @expectedExceptionMessage Path must contain at least one node + */ + public function testGetPathFromArrayException() + { + Magento_Filesystem::getPathFromArray(array()); + } + /** * @return PHPUnit_Framework_MockObject_MockObject */ @@ -816,6 +921,31 @@ class Magento_FilesystemTest extends PHPUnit_Framework_TestCase return $adapterMock; } + /** + * @dataProvider isPathInDirectoryDataProvider + * @param string $path + * @param string $directory + * @param boolean $expectedValue + */ + public function testIsPathInDirectory($path, $directory, $expectedValue) + { + $this->assertEquals($expectedValue, Magento_Filesystem::isPathInDirectory($path, $directory)); + } + + /** + * @return array + */ + public function isPathInDirectoryDataProvider() + { + return array( + array('/tmp/file', '/tmp', true), + array('/tmp/file', '/tmp/dir', false), + array('/tmp', '/tmp/', true), + array('/tmp/', '/tmp', true), + ); + } + + /** * @dataProvider testSearchFilesDataProvider * @param string $workingDirectory diff --git a/dev/tests/unit/testsuite/Magento/Profiler/Driver/Standard/Output/CsvfileTest.php b/dev/tests/unit/testsuite/Magento/Profiler/Driver/Standard/Output/CsvfileTest.php index c0618c08d5d2de655923bd05078a9f70e57e00fa..c2e4e3c2758c8e208b6b55cc567439a766b55d75 100644 --- a/dev/tests/unit/testsuite/Magento/Profiler/Driver/Standard/Output/CsvfileTest.php +++ b/dev/tests/unit/testsuite/Magento/Profiler/Driver/Standard/Output/CsvfileTest.php @@ -48,18 +48,18 @@ class Magento_Profiler_Driver_Standard_Output_CsvfileTest extends PHPUnit_Framew return array( 'Default config' => array( 'config' => array(), - 'filePath' => str_replace('/', DIRECTORY_SEPARATOR, '/var/log/profiler.csv'), + 'filePath' => '/var/log/profiler.csv', 'delimiter' => ',', 'enclosure' => '"' ), 'Custom config' => array( 'config' => array( - 'baseDir' => str_replace('/', DIRECTORY_SEPARATOR, '/var/www/project/'), - 'filePath' => str_replace('/', DIRECTORY_SEPARATOR, '/log/example.csv'), + 'baseDir' => '/var/www/project/', + 'filePath' => '/log/example.csv', 'delimiter' => "\t", 'enclosure' => '"' ), - 'filePath' => str_replace('/', DIRECTORY_SEPARATOR, '/var/www/project/log/example.csv'), + 'filePath' => '/var/www/project/log/example.csv', 'delimiter' => "\t", 'enclosure' => '"' ), diff --git a/dev/tests/unit/testsuite/Magento/Validator/Composite/VarienObjectTest.php b/dev/tests/unit/testsuite/Magento/Validator/Composite/VarienObjectTest.php new file mode 100644 index 0000000000000000000000000000000000000000..cbb727717059016d3cb46f5e92b2f51aebdbd83f --- /dev/null +++ b/dev/tests/unit/testsuite/Magento/Validator/Composite/VarienObjectTest.php @@ -0,0 +1,136 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +class Magento_Validator_Composite_VarienObjectTest extends PHPUnit_Framework_TestCase +{ + /** + * @var Magento_Validator_Composite_VarienObject + */ + protected $_model; + + protected function setUp() + { + $this->_model = new Magento_Validator_Composite_VarienObject(); + + $fieldOneExactValue = new Zend_Validate_Identical('field_one_value'); + $fieldOneExactValue->setMessage("'field_one' does not match expected value"); + $fieldOneLength = new Zend_Validate_StringLength(array('min' => 10)); + + $fieldTwoExactValue = new Zend_Validate_Identical('field_two_value'); + $fieldTwoExactValue->setMessage("'field_two' does not match expected value"); + $fieldTwoLength = new Zend_Validate_StringLength(array('min' => 5)); + + $entityValidity = new Zend_Validate_Callback(array($this, 'isEntityValid')); + $entityValidity->setMessage('Entity is not valid.'); + + $this->_model + ->addRule($fieldOneLength, 'field_one') + ->addRule($fieldOneExactValue, 'field_one') + ->addRule($fieldTwoLength, 'field_two') + ->addRule($fieldTwoExactValue, 'field_two') + ->addRule($entityValidity) + ; + } + + protected function tearDown() + { + $this->_model = null; + } + + /** + * Entity validation routine to be used as a callback + * + * @param Varien_Object $entity + * @return bool + */ + public function isEntityValid(Varien_Object $entity) + { + return (bool)$entity->getData('is_valid'); + } + + public function testAddRule() + { + $actualResult = $this->_model->addRule(new Zend_Validate_Identical('field_one_value'), 'field_one'); + $this->assertSame($this->_model, $actualResult, 'Methods chaining is broken.'); + } + + public function testGetMessages() + { + $messages = $this->_model->getMessages(); + $this->assertInternalType('array', $messages); + } + + /** + * @param array $inputEntityData + * @param array $expectedErrors + * @dataProvider validateDataProvider + */ + public function testIsValid(array $inputEntityData, array $expectedErrors) + { + $entity = new Varien_Object($inputEntityData); + $isValid = $this->_model->isValid($entity); + $this->assertFalse($isValid, 'Validation is expected to fail.'); + + $actualMessages = $this->_model->getMessages(); + $this->assertCount( + count($expectedErrors), $actualMessages, 'Number of messages does not meet expectations.' + ); + foreach ($expectedErrors as $errorIndex => $expectedErrorMessage) { + /** @var $actualMessage Mage_Core_Model_Message_Abstract */ + $actualMessage = $actualMessages[$errorIndex]; + $this->assertEquals($expectedErrorMessage, $actualMessage); + } + } + + public function validateDataProvider() + { + return array( + 'only "field_one" is invalid' => array( + array('field_one' => 'one_value', 'field_two' => 'field_two_value', 'is_valid' => true), + array( + "'one_value' is less than 10 characters long", + "'field_one' does not match expected value", + ) + ), + 'only "field_two" is invalid' => array( + array('field_one' => 'field_one_value', 'field_two' => 'two_value', 'is_valid' => true), + array("'field_two' does not match expected value") + ), + 'entity as a whole is invalid' => array( + array('field_one' => 'field_one_value', 'field_two' => 'field_two_value'), + array('Entity is not valid.') + ), + 'errors aggregation' => array( + array('field_one' => 'one_value', 'field_two' => 'two'), + array( + "'one_value' is less than 10 characters long", + "'field_one' does not match expected value", + "'two' is less than 5 characters long", + "'field_two' does not match expected value", + 'Entity is not valid.', + ) + ), + ); + } +} diff --git a/dev/tools/tests.php b/dev/tools/tests.php index bec96966603d9286b2a2a865be598b0a52b1337e..fbddfb79d1a7bde8457f61a3f7d28552728ff097 100644 --- a/dev/tools/tests.php +++ b/dev/tools/tests.php @@ -25,15 +25,16 @@ */ $commands = array( - 'unit' => array('../tests/unit', ''), - 'unit-performance' => array('../tests/performance/framework/tests/unit', ''), - 'unit-static' => array('../tests/static/framework/tests/unit', ''), - 'unit-integration' => array('../tests/integration/framework/tests/unit', ''), - 'integration' => array('../tests/integration', ''), - 'integration-integrity' => array('../tests/integration', ' testsuite/integrity'), - 'static-default' => array('../tests/static', ''), - 'static-legacy' => array('../tests/static', ' testsuite/Legacy'), - 'static-integration' => array('../tests/static', ' testsuite/Exemplar'), + 'unit' => array('../tests/unit', ''), + 'unit-performance' => array('../tests/performance/framework/tests/unit', ''), + 'unit-static' => array('../tests/static/framework/tests/unit', ''), + 'unit-integration' => array('../tests/integration/framework/tests/unit', ''), + 'integration' => array('../tests/integration', ''), + 'integration-integrity' => array('../tests/integration', ' testsuite/integrity'), + 'static-default' => array('../tests/static', ''), + 'static-legacy' => array('../tests/static', ' testsuite/Legacy'), + 'static-integration-php' => array('../tests/static', ' testsuite/Php/Exemplar'), + 'static-integration-js' => array('../tests/static', ' testsuite/Js/Exemplar'), ); $types = array( 'all' => array_keys($commands), @@ -41,7 +42,7 @@ $types = array( 'integration' => array('integration'), 'integration-all' => array('integration', 'integration-integrity'), 'static' => array('static-default'), - 'static-all' => array('static-default', 'static-legacy', 'static-integration'), + 'static-all' => array('static-default', 'static-legacy', 'static-integration-php', 'static-integration-js'), 'integrity' => array('static-default', 'static-legacy', 'integration-integrity'), 'legacy' => array('static-legacy'), 'default' => array( diff --git a/lib/Magento/Profiler/Driver/Standard/Output/Csvfile.php b/lib/Magento/Profiler/Driver/Standard/Output/Csvfile.php index ab0ef63a4e7e16c8dc570d3237b0a153803b85be..23331be604cf3c2040f67462adee1ca757161262 100644 --- a/lib/Magento/Profiler/Driver/Standard/Output/Csvfile.php +++ b/lib/Magento/Profiler/Driver/Standard/Output/Csvfile.php @@ -65,12 +65,8 @@ class Magento_Profiler_Driver_Standard_Output_Csvfile extends Magento_Profiler_D protected function _parseFilePath(array $config = null) { $result = isset($config['filePath']) ? $config['filePath'] : self::DEFAULT_FILEPATH; - $result = str_replace(array('\\', '/'), DIRECTORY_SEPARATOR, $result); - if (isset($config['baseDir'])) { - $result = rtrim($config['baseDir'], DIRECTORY_SEPARATOR) - . DIRECTORY_SEPARATOR - . ltrim($result, DIRECTORY_SEPARATOR); + $result = rtrim($config['baseDir'], '/') . '/' . ltrim($result, '/'); } return $result; } diff --git a/lib/Magento/Validator/Composite/VarienObject.php b/lib/Magento/Validator/Composite/VarienObject.php new file mode 100644 index 0000000000000000000000000000000000000000..9f7b76bb41b6b21bcbcd90e2b74be321f200e644 --- /dev/null +++ b/lib/Magento/Validator/Composite/VarienObject.php @@ -0,0 +1,100 @@ +<?php +/** + * Magento + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@magentocommerce.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade Magento to newer + * versions in the future. If you wish to customize Magento for your + * needs please refer to http://www.magentocommerce.com for more information. + * + * @category Mage + * @package Mage_Core + * @copyright Copyright (c) 2013 X.commerce, Inc. (http://www.magentocommerce.com) + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + */ + +/** + * Validator encapsulates multiple validation rules for Varien_Object. + * Able to validate both individual fields and a whole object. + */ +class Magento_Validator_Composite_VarienObject implements Zend_Validate_Interface +{ + /** + * Validation rules per scope (particular fields or entire entity) + * + * @var Zend_Validate_Interface[] + */ + private $_rules = array(); + + /** + * Validation error messages + * + * @var array + */ + private $_messages = array(); + + /** + * Add rule to be applied to a validation scope + * + * @param Zend_Validate_Interface $validator + * @param string $fieldName Field name to apply validation to, or empty value to validate entity as a whole + * @return Magento_Validator_Composite_VarienObject + */ + public function addRule(Zend_Validate_Interface $validator, $fieldName = '') + { + if (!array_key_exists($fieldName, $this->_rules)) { + $this->_rules[$fieldName] = $validator; + } else { + $existingValidator = $this->_rules[$fieldName]; + if (!($existingValidator instanceof Zend_Validate)) { + $compositeValidator = new Zend_Validate(); + $compositeValidator->addValidator($existingValidator); + $this->_rules[$fieldName] = $compositeValidator; + } + $this->_rules[$fieldName]->addValidator($validator); + } + return $this; + } + + /** + * Check whether the entity is valid according to defined validation rules + * + * @param Varien_Object $entity + * @return bool + * + * @throws Mage_Core_Exception + */ + public function isValid($entity) + { + $this->_messages = array(); + /** @var $validator Zend_Validate_Interface */ + foreach ($this->_rules as $fieldName => $validator) { + $value = $fieldName ? $entity->getDataUsingMethod($fieldName) : $entity; + if (!$validator->isValid($value)) { + $this->_messages = array_merge($this->_messages, array_values($validator->getMessages())); + } + } + return empty($this->_messages); + } + + /** + * Return error messages (if any) after the last validation + * + * @return array + */ + public function getMessages() + { + return $this->_messages; + } +} diff --git a/lib/Varien/Data/Form/Abstract.php b/lib/Varien/Data/Form/Abstract.php index a6e5b9ac93e6049aa1bf73ea5796a8adb32eae4c..474400445ea41cd58dd7dffb0c08ebbf2af8d12c 100644 --- a/lib/Varien/Data/Form/Abstract.php +++ b/lib/Varien/Data/Form/Abstract.php @@ -181,10 +181,11 @@ class Varien_Data_Form_Abstract extends Varien_Object * * @return Varien_Data_Form_Element_Fieldset */ - public function addFieldset($elementId, $config, $after = false) + public function addFieldset($elementId, $config, $after = false, $isAdvanced = false) { $element = new Varien_Data_Form_Element_Fieldset($config); $element->setId($elementId); + $element->setAdvanced($isAdvanced); $this->addElement($element, $after); return $element; } diff --git a/lib/Varien/Data/Form/Element/Abstract.php b/lib/Varien/Data/Form/Element/Abstract.php index e8a74030ca1b0e268cd6252b8b2e3e201742caa8..9d7b4b945d241620b7e6a791828385e8d03b4031 100644 --- a/lib/Varien/Data/Form/Element/Abstract.php +++ b/lib/Varien/Data/Form/Element/Abstract.php @@ -153,7 +153,7 @@ abstract class Varien_Data_Form_Element_Abstract extends Varien_Data_Form_Abstra public function getHtmlAttributes() { - return array('type', 'title', 'class', 'style', 'onclick', 'onchange', 'disabled', 'readonly', 'tabindex'); + return array('type', 'title', 'class', 'style', 'onclick', 'onchange', 'disabled', 'readonly', 'tabindex', 'placeholder'); } public function addClass($class) @@ -216,14 +216,24 @@ abstract class Varien_Data_Form_Element_Abstract extends Varien_Data_Form_Abstra public function getElementHtml() { - - $html = '<input id="' . $this->getHtmlId() . '" name="' . $this->getName() . '" ' + $html = ''; + if ($this->getBeforeElementHtml()) { + $html .= '<label class="addbefore" for="' . $this->getHtmlId() . '">' . $this->getBeforeElementHtml() . '</label>'; + } + $html .= '<input id="' . $this->getHtmlId() . '" name="' . $this->getName() . '" ' . $this->_getUiId() - . ' value="' . $this->getEscapedValue() . '" ' . $this->serialize($this->getHtmlAttributes()) . '/>' . "\n"; - $html.= $this->getAfterElementHtml(); + . ' value="' . $this->getEscapedValue() . '" ' . $this->serialize($this->getHtmlAttributes()) . '/>'; + if ($this->getAfterElementHtml()) { + $html.= '<label class="addafter" for="' . $this->getHtmlId() . '">' . $this->getAfterElementHtml() . '</label>'; + } return $html; } + public function getBeforeElementHtml() + { + return $this->getData('before_element_html'); + } + public function getAfterElementHtml() { return $this->getData('after_element_html'); @@ -238,9 +248,10 @@ abstract class Varien_Data_Form_Element_Abstract extends Varien_Data_Form_Abstra public function getLabelHtml($idSuffix = '') { if (!is_null($this->getLabel())) { - $html = '<label for="' . $this->getHtmlId() . $idSuffix . '"' . $this->_getUiId('label') . '>' + $html = '<label class="label" for="' . $this->getHtmlId() . $idSuffix . '"' . $this->_getUiId('label') + . '><span>' . $this->_escape($this->getLabel()) - . ($this->getRequired() ? ' <span class="required">*</span>' : '') . '</label>' . "\n"; + . ($this->getRequired() ? ' <span class="required">*</span>' : '') . '</span></label>' . "\n"; } else { $html = ''; } diff --git a/lib/Varien/Data/Form/Element/Checkboxes.php b/lib/Varien/Data/Form/Element/Checkboxes.php index 1bf8ba182c37b81c2b0938c46f2ecae7b29ef90d..4d28346900103c5cd8aa578d61bda975bfdc474c 100644 --- a/lib/Varien/Data/Form/Element/Checkboxes.php +++ b/lib/Varien/Data/Form/Element/Checkboxes.php @@ -42,7 +42,7 @@ class Varien_Data_Form_Element_Checkboxes extends Varien_Data_Form_Element_Abstr { parent::__construct($attributes); $this->setType('checkbox'); - $this->setExtType('checkbox'); + $this->setExtType('checkboxes'); } /** @@ -109,11 +109,11 @@ class Varien_Data_Form_Element_Checkboxes extends Varien_Data_Form_Element_Abstr return ''; } - $html = '<ul class="checkboxes">'; + $html = '<div class=nested>'; foreach ($values as $value) { $html.= $this->_optionToHtml($value); } - $html .= '</ul>' + $html .= '</div>' . $this->getAfterElementHtml(); return $html; @@ -188,14 +188,14 @@ class Varien_Data_Form_Element_Checkboxes extends Varien_Data_Form_Element_Abstr { $id = $this->getHtmlId().'_'.$this->_escape($option['value']); - $html = '<li><input id="'.$id.'"'; + $html = '<div class="field choice"><input id="'.$id.'"'; foreach ($this->getHtmlAttributes() as $attribute) { if ($value = $this->getDataUsingMethod($attribute, $option['value'])) { $html .= ' '.$attribute.'="'.$value.'"'; } } $html .= ' value="'.$option['value'].'" />' - . ' <label for="'.$id.'">' . $option['label'] . '</label></li>' + . ' <label for="'.$id.'">' . $option['label'] . '</label></div>' . "\n"; return $html; } diff --git a/lib/Varien/Data/Form/Element/Fieldset.php b/lib/Varien/Data/Form/Element/Fieldset.php index 61c6459d2d03426810f4075618280105b2c9d090..ba088f5b9ef5da49ece28614a264e9d648882098 100644 --- a/lib/Varien/Data/Form/Element/Fieldset.php +++ b/lib/Varien/Data/Form/Element/Fieldset.php @@ -114,13 +114,29 @@ class Varien_Data_Form_Element_Fieldset extends Varien_Data_Form_Element_Abstrac { $html = ''; foreach ($this->getSortedElements() as $element) { - if ($element->getType() != 'fieldset' && !$element->isAdvanced()) { + if (!$element->isAdvanced()) { $html.= $element->toHtml(); } } return $html; } + /** + * Get Number of Bacic Children + * + * @return int + */ + public function getCountBasicChildren() + { + $count = 0; + foreach ($this->getElements() as $element) { + if (!$element->isAdvanced()) { + $count += 1; + } + } + return $count; + } + /** * Get Advanced elements' html in sorted order * @@ -130,7 +146,7 @@ class Varien_Data_Form_Element_Fieldset extends Varien_Data_Form_Element_Abstrac { $html = ''; foreach ($this->getSortedElements() as $element) { - if ($element->getType() != 'fieldset' && $element->isAdvanced()) { + if ($element->isAdvanced()) { $html.= $element->toHtml(); } } @@ -183,7 +199,7 @@ class Varien_Data_Form_Element_Fieldset extends Varien_Data_Form_Element_Abstrac { $html = ''; foreach ($this->getSortedElements() as $element) { - if ($element->getType() == 'fieldset') { + if ($element->getType() == 'fieldset' && !$element->isAdvanced()) { $html.= $element->toHtml(); } } diff --git a/lib/Varien/Data/Form/Element/Label.php b/lib/Varien/Data/Form/Element/Label.php index 554c329eb01ff9156d6a06a123b69dd085340451..a3805be73e9a7e07ae7aeeece06ea28869528b4f 100644 --- a/lib/Varien/Data/Form/Element/Label.php +++ b/lib/Varien/Data/Form/Element/Label.php @@ -51,9 +51,9 @@ class Varien_Data_Form_Element_Label extends Varien_Data_Form_Element_Abstract */ public function getElementHtml() { - $html = $this->getBold() ? '<strong>' : ''; + $html = $this->getBold() ? '<strong class="control-value">' : '<span class="control-value">'; $html.= $this->getEscapedValue(); - $html.= $this->getBold() ? '</strong>' : ''; + $html.= $this->getBold() ? '</strong>' : '</span>'; $html.= $this->getAfterElementHtml(); return $html; } diff --git a/lib/Varien/Data/Form/Element/Note.php b/lib/Varien/Data/Form/Element/Note.php index ab72f22ea79899e7e31e84ac86c543bf9c100498..095398c2b6d836b36492a2746188b80e81df110c 100644 --- a/lib/Varien/Data/Form/Element/Note.php +++ b/lib/Varien/Data/Form/Element/Note.php @@ -42,7 +42,7 @@ class Varien_Data_Form_Element_Note extends Varien_Data_Form_Element_Abstract public function getElementHtml() { - $html = '<span id="' . $this->getHtmlId() . '">' . $this->getText() . '</span>'; + $html = '<span id="' . $this->getHtmlId() . '" class="control-value">' . $this->getText() . '</span>'; $html.= $this->getAfterElementHtml(); return $html; } diff --git a/lib/Varien/Data/Form/Element/Select.php b/lib/Varien/Data/Form/Element/Select.php index f45b3161c112ab20213e13f79d5019be8e964368..0780e2d197e91b175d6fe8186ed4b5f5cec12cbb 100644 --- a/lib/Varien/Data/Form/Element/Select.php +++ b/lib/Varien/Data/Form/Element/Select.php @@ -44,7 +44,13 @@ class Varien_Data_Form_Element_Select extends Varien_Data_Form_Element_Abstract public function getElementHtml() { $this->addClass('select'); - $html = '<select id="'.$this->getHtmlId().'" name="'.$this->getName().'" '.$this->serialize($this->getHtmlAttributes()). $this->_getUiId() .'>'."\n"; + + $html = ''; + if ($this->getBeforeElementHtml()) { + $html .= '<label class="addbefore" for="' . $this->getHtmlId() . '">' . $this->getBeforeElementHtml() . '</label>'; + } + + $html .= '<select id="'.$this->getHtmlId().'" name="'.$this->getName().'" '.$this->serialize($this->getHtmlAttributes()). $this->_getUiId() .'>'."\n"; $value = $this->getValue(); if (!is_array($value)) { @@ -74,7 +80,11 @@ class Varien_Data_Form_Element_Select extends Varien_Data_Form_Element_Abstract } $html.= '</select>'."\n"; - $html.= $this->getAfterElementHtml(); + if ($this->getAfterElementHtml()) { + $html.= '<label class="addafter" for="' . $this->getHtmlId() . '">' + . "\n{$this->getAfterElementHtml()}\n" + . '</label>' . "\n"; + } return $html; } diff --git a/lib/Varien/Data/Form/Element/Text.php b/lib/Varien/Data/Form/Element/Text.php index 3763ab891e3695b4fa7a9e1a1e61109c2ab0ee31..16b44ba76d323ef36f8cffecb8c4eb22c932ec59 100644 --- a/lib/Varien/Data/Form/Element/Text.php +++ b/lib/Varien/Data/Form/Element/Text.php @@ -48,6 +48,6 @@ class Varien_Data_Form_Element_Text extends Varien_Data_Form_Element_Abstract public function getHtmlAttributes() { - return array('type', 'title', 'class', 'style', 'onclick', 'onchange', 'onkeyup', 'disabled', 'readonly', 'maxlength', 'tabindex'); + return array('type', 'title', 'class', 'style', 'onclick', 'onchange', 'onkeyup', 'disabled', 'readonly', 'maxlength', 'tabindex', 'placeholder'); } } diff --git a/lib/Varien/Io/File.php b/lib/Varien/Io/File.php index d0c1ee1d79c6e90611ca0762e53296fcfc4d0e0e..d0840e4d85b0f78b688ed4b40a82ac45549846f3 100644 --- a/lib/Varien/Io/File.php +++ b/lib/Varien/Io/File.php @@ -883,4 +883,27 @@ class Varien_Io_File extends Varien_Io_Abstract { return $this->getCleanPath(dirname($file)); } + + /** + * Get directories list by path\ + * + * @param string $path + * @param int $flag + * @return array + */ + public function getDirectoriesList($path, $flag = GLOB_ONLYDIR) + { + return glob($this->getCleanPath($path) . '*', $flag); + } + + /** + * Get path info + * + * @param string $path + * @return mixed + */ + public function getPathInfo($path) + { + return pathinfo($path); + } } diff --git a/pub/lib/jquery/editableMultiselect/css/jquery.multiselect.css b/pub/lib/jquery/editableMultiselect/css/jquery.multiselect.css index b4742085d225cc1bd4581574f35581dfc42cd57e..5d5d472b42b83d3abf51afe5fba6ba1438fe1234 100644 --- a/pub/lib/jquery/editableMultiselect/css/jquery.multiselect.css +++ b/pub/lib/jquery/editableMultiselect/css/jquery.multiselect.css @@ -1,64 +1,65 @@ .mselect-list { - position:relative; + position: relative; } .mselect-items-wrapper { padding: 3px; min-height: 80px; - border: 1px solid #bbb; - border-radius: 4px; - margin: 10px 0; + background: #fff; + border: 1px solid #ccc; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .mselect-fixed { - overflow-x:hidden; - overflow-y:auto; + overflow-x: hidden; + overflow-y: auto; } - .mselect-list-item { position: relative; margin: 1px 0; } .mselect-list-item:hover { - background: #f9f9f9; + background: #fbfaf6; } .mselect-list-item label { - width:100%; - display:block; + width: 100%; + display: block; } .mselect-input-container { - position:relative; - margin:5px 10px; - display:none; + position: relative; + display: none; } .mselect-input { - width: 99%; - margin:0; + width: 100%; } -.mselect-list-item input:checked + span { - background: #e6e6e6; -} - -.mselect-list-item .mselect-checked + span { +.mselect-list-item input:checked + span, +.mselect-list-item .mselect-checked + span{ background: #e6e6e6; } .mselect-list-item input[type='checkbox'] { position: absolute; - left:-9999px; + left: -9999px; opacity: 0; } .mselect-list-item.mselect-disabled label span { - color:#999; + color: #999; cursor: default; } + .mselect-list-item.mselect-disabled:hover { background: #fff; } @@ -84,51 +85,74 @@ .mselect-edit, .mselect-delete, .mselect-save { - width: 16px; + width: 0; height: 16px; + padding-left: 16px; position: absolute; + overflow: hidden; cursor: pointer; - background: url(../images/icons-sprite.png) no-repeat; - text-indent: -9999px; +} + +.mselect-cancel:before, +.mselect-edit:before, +.mselect-delete:before, +.mselect-save:before { + border: 0 none; + color: #6E685E; + content: '\e05b;'; /* edit icon */ + font-family: 'MUI-Icons'; + font-size: 16px; + font-style: normal; + font-weight: normal; + height: auto; + left: 1px; + margin-top: -3px; + position: absolute; + top: 0; + width: auto; } .mselect-cancel { right: 5px; top: 7px; - background-position:-312px 0; - padding: 0; +} + +.mselect-cancel:before { + content: '\e069;'; } .mselect-edit { - background-position: 0 -72px; top: 5px; right: 30px; display: none; } .mselect-delete { - background-position: -456px -0; display: none; top: 5px; right: 5px; } +.mselect-delete:before { + content: '\e07f;'; +} + .mselect-save, .mselect-save:hover { - background:url(../images/icons-sprite.png) no-repeat -72px -72px; display: block; top: 6px; right: 25px; - border: none; - padding: 0; - margin: 0; - filter:none; +} + +.mselect-save:before { + content: '\e067;'; } .mselect-list-item:hover .mselect-delete, .mselect-list-item:hover .mselect-edit { display: block; } + .mselect-list-item-not-editable:hover .mselect-edit { display: none; } @@ -137,108 +161,50 @@ display: none; } -/* Temporary styles */ -.mselect-list { - width: 278px; - background: #fff; - border:1px solid #C4C1BC; -} -.mselect-list .block-content { - padding:0 10px; -} - -.mselect-list .block-footer { - padding: 5px 10px; - background:#F0F2F4; - border-top:1px solid #ddd; - box-shadow:0 1px 5px 0 #ddd inset; -} - .mselect-list-item label { font-size: 12px; color: #333; - font: 12px normal Arial, Helvetica,sans-serif; + font: 12px normal Arial, Helvetica, sans-serif; } .mselect-list-item form { display: block; } -.mselect-list input[type=text] { - font:13px/18px Arial, Helvetica, sans-serif; - display: inline-block; - width:100%; - height:28px; - padding: 4px 50px 4px 4px; - margin: 0 0 8px; - color: #333; - background-color: #fff; - border: 1px solid #ccc; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box; - box-sizing:border-box; - border-radius: 3px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; - -moz-transition: border linear 0.2s, box-shadow linear 0.2s; - -ms-transition: border linear 0.2s, box-shadow linear 0.2s; - -o-transition: border linear 0.2s, box-shadow linear 0.2s; - transition: border linear 0.2s, box-shadow linear 0.2s; -} - -.mselect-list input[type=text]:focus { - border-color: rgba(82, 168, 236, 0.8); - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); -} - .mselect-button-add, .mselect-button-add-disabled { - height: 16px; - line-height: 16px; - border-width:1px; - border-style:solid; - border-color:#ed6502 #a04300 #a04300 #ed6502; - padding:0 7px 1px 7px; - color:#fff; - font:bold 12px arial, helvetica, sans-serif; - cursor:pointer; - background:#FFAC47; - background: -moz-linear-gradient(top, #ffac47 0%, #f56c06 100%); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ffac47), color-stop(100%,#f56c06)); - background: -webkit-linear-gradient(top, #ffac47 0%,#f56c06 100%); - background: -o-linear-gradient(top, #ffac47 0%,#f56c06 100%); - background: -ms-linear-gradient(top, #ffac47 0%,#f56c06 100%); - background: linear-gradient(to bottom, #ffac47 0%,#f56c06 100%); - + font: 14px/18px 'CallunaSans', Arial, Helvetica, sans-serif; + font-weight: 500; + color: #322e2a; + background: #dbd6ce; + display: inline-block; + padding: 5px 14px; + text-align: center; + text-decoration: none; + vertical-align: top; + cursor: pointer; + border: transparent; + border-radius: 5px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } - .mselect-button-add:hover { - background:#f77c16; - background: -moz-linear-gradient(top, #f9dcba 0%, #fc7e21 100%); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f9dcba), color-stop(100%,#fc7e21)); - background: -webkit-linear-gradient(top, #f9dcba 0%,#fc7e21 100%); - background: -o-linear-gradient(top, #f9dcba 0%,#fc7e21 100%); - background: -ms-linear-gradient(top, #f9dcba 0%,#fc7e21 100%); - background: linear-gradient(to bottom, #f9dcba 0%,#fc7e21 100%); + background: #cac2b5; + color: #322e2a; } .mselect-button-add:active { - background:#f77c16; - background: -moz-linear-gradient(top, #cf5a01 1%, #f77c16 100%); - background: -webkit-gradient(linear, left top, left bottom, color-stop(1%,#cf5a01), color-stop(100%,#f77c16)); - background: -webkit-linear-gradient(top, #cf5a01 1%,#f77c16 100%); - background: -o-linear-gradient(top, #cf5a01 1%,#f77c16 100%); - background: -ms-linear-gradient(top, #cf5a01 1%,#f77c16 100%); - background: linear-gradient(to bottom, #cf5a01 1%,#f77c16 100%); + box-shadow: 0 1px 5px #aaa59b inset; } -.mselect-button-add-disabled { - background: #ccc; - color: #fafafa; - border:1px solid #999; -} +.mselect-button-add-disabled, +.mselect-button-add-disabled:hover { + cursor: not-allowed; + opacity: 0.65; + background: #d9d6cf; + box-shadow: none; + text-shadow: none; +} \ No newline at end of file diff --git a/pub/lib/jquery/jquery.dropdowns.js b/pub/lib/jquery/jquery.dropdowns.js new file mode 100644 index 0000000000000000000000000000000000000000..e348c63e4dd429988f72323d6f038eb746e68c41 --- /dev/null +++ b/pub/lib/jquery/jquery.dropdowns.js @@ -0,0 +1,74 @@ +;(function($, document) { + 'use strict'; + + $.fn.dropdown = function(options) { + var defaults = { + parent: null, + btnArrow: '.arrow', + activeClass: 'active' + }; + + var options = $.extend({}, defaults, options); + var actionElem = $(this), + self = this; + + this.openDropdown = function(elem) { + elem + .addClass(options.activeClass) + .parent() + .addClass(options.activeClass); + + $(options.btnArrow, elem).text('â–²'); + }; + + this.closeDropdown = function(elem) { + elem + .removeClass(options.activeClass) + .parent() + .removeClass(options.activeClass); + + $(options.btnArrow, elem).text('â–¼'); + }; + + /* Reset all dropdowns */ + this.reset = function(params) { + var params = params || {}, + dropdowns = params.elems || actionElem; + + dropdowns.each(function(index, elem) { + self.closeDropdown($(elem)); + }); + }; + + /* document Event bindings */ + $(document).on('click.hideDropdown', this.reset); + $(document).on('keyup.hideDropdown', function(e) { + var ESC_CODE = '27'; + + if (e.keyCode == ESC_CODE) { + self.reset(); + } + }); + + return this.each(function() { + var elem = $(this), + parent = elem.parent(), + menu = $('.dropdown-menu', parent); + + elem.on('click.toggleDropdown', function() { + self.reset({elems: actionElem.not(elem)}); + self[elem.hasClass('active') ? 'closeDropdown' : 'openDropdown'](elem); + + return false; + }); + + menu.on('click.preventMenuClosing', function(e) { + e.stopPropagation(); + }); + }); + }; + + $(document).ready(function() { + $('[data-toggle="dropdown"]').dropdown(); + }); +})(window.jQuery, document); \ No newline at end of file diff --git a/pub/lib/jquery/jquery.hoverIntent.js b/pub/lib/jquery/jquery.hoverIntent.js new file mode 100644 index 0000000000000000000000000000000000000000..2b8f55a698ea52e4ebdd5be368754cdd7e16c713 --- /dev/null +++ b/pub/lib/jquery/jquery.hoverIntent.js @@ -0,0 +1,120 @@ +/** + * hoverIntent is similar to jQuery's built-in "hover" function except that + * instead of firing the onMouseOver event immediately, hoverIntent checks + * to see if the user's mouse has slowed down (beneath the sensitivity + * threshold) before firing the onMouseOver event. + * + * hoverIntent r6 // 2011.02.26 // jQuery 1.5.1+ + * <http://cherne.net/brian/resources/jquery.hoverIntent.html> + * + * hoverIntent is currently available for use in all personal or commercial + * projects under both MIT and GPL licenses. This means that you can choose + * the license that best suits your project, and use it accordingly. + * + * // basic usage (just like .hover) receives onMouseOver and onMouseOut functions + * $("ul li").hoverIntent( showNav , hideNav ); + * + * // advanced usage receives configuration object only + * $("ul li").hoverIntent({ +* sensitivity: 7, // number = sensitivity threshold (must be 1 or higher) +* interval: 100, // number = milliseconds of polling interval +* over: showNav, // function = onMouseOver callback (required) +* timeout: 0, // number = milliseconds delay before onMouseOut function call +* out: hideNav // function = onMouseOut callback (required) +* }); + * + * @param f onMouseOver function || An object with configuration options + * @param g onMouseOut function || Nothing (use configuration options object) + * @author Brian Cherne brian(at)cherne(dot)net + */ +(function ($) { + $.fn.hoverIntent = function (f, g) { + // default configuration options + var cfg = { + sensitivity:7, + interval:100, + timeout:0 + }; + // override configuration options with user supplied object + cfg = $.extend(cfg, g ? { over:f, out:g } : f); + + // instantiate variables + // cX, cY = current X and Y position of mouse, updated by mousemove event + // pX, pY = previous X and Y position of mouse, set by mouseover and polling interval + var cX, cY, pX, pY; + + // A private function for getting mouse position + var track = function (ev) { + cX = ev.pageX; + cY = ev.pageY; + }; + + // A private function for comparing current and previous mouse position + var compare = function (ev, ob) { + ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); + // compare mouse positions to see if they've crossed the threshold + if (( Math.abs(pX - cX) + Math.abs(pY - cY) ) < cfg.sensitivity) { + $(ob).unbind("mousemove", track); + // set hoverIntent state to true (so mouseOut can be called) + ob.hoverIntent_s = 1; + return cfg.over.apply(ob, [ev]); + } else { + // set previous coordinates for next time + pX = cX; + pY = cY; + // use self-calling timeout, guarantees intervals are spaced out properly (avoids JavaScript timer bugs) + ob.hoverIntent_t = setTimeout(function () { + compare(ev, ob); + }, cfg.interval); + } + }; + + // A private function for delaying the mouseOut function + var delay = function (ev, ob) { + ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); + ob.hoverIntent_s = 0; + return cfg.out.apply(ob, [ev]); + }; + + // A private function for handling mouse 'hovering' + var handleHover = function (e) { + // copy objects to be passed into t (required for event object to be passed in IE) + var ev = jQuery.extend({}, e); + var ob = this; + + // cancel hoverIntent timer if it exists + if (ob.hoverIntent_t) { + ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); + } + + // if e.type == "mouseenter" + if (e.type == "mouseenter") { + // set "previous" X and Y position based on initial entry point + pX = ev.pageX; + pY = ev.pageY; + // update "current" X and Y position based on mousemove + $(ob).bind("mousemove", track); + // start polling interval (self-calling timeout) to compare mouse coordinates over time + if (ob.hoverIntent_s != 1) { + ob.hoverIntent_t = setTimeout(function () { + compare(ev, ob); + }, cfg.interval); + } + + // else e.type == "mouseleave" + } else { + // unbind expensive mousemove event + $(ob).unbind("mousemove", track); + // if hoverIntent state is true, then call the mouseOut function after the specified delay + if (ob.hoverIntent_s == 1) { + ob.hoverIntent_t = setTimeout(function () { + delay(ev, ob); + }, cfg.timeout); + } + } + }; + + // bind the function to the two event listeners + return this.bind('mouseenter', handleHover).bind('mouseleave', handleHover); + }; +})(jQuery); \ No newline at end of file diff --git a/pub/lib/jquery/jquery.tabs.js b/pub/lib/jquery/jquery.tabs.js new file mode 100644 index 0000000000000000000000000000000000000000..92a3793838478b8a5bd7900caed3c3a5736a7d54 --- /dev/null +++ b/pub/lib/jquery/jquery.tabs.js @@ -0,0 +1,294 @@ +/* ======================================================== + * bootstrap-tab.js v2.0.4 + * http://twitter.github.com/bootstrap/javascript.html#tabs + * ======================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* TAB CLASS DEFINITION + * ==================== */ + + var Tab = function ( element ) { + this.element = $(element) + }; + + Tab.prototype = { + + constructor: Tab + + , show: function () { + var $this = this.element + , $ul = $this.closest('ul:not(.dropdown-menu)') + , selector = $this.attr('data-target') + , previous + , $target + , e; + + if (!selector) { + selector = $this.attr('href'); + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, ''); //strip for ie7 + } + + if ( $this.parent('li').hasClass('active') ) return; + + previous = $ul.find('.active a').last()[0]; + + e = $.Event('show', { + relatedTarget: previous + }); + + $this.trigger(e); + + if (e.isDefaultPrevented()) return; + + $target = $(selector); + + this.activate($this.parent('li'), $ul); + this.activate($target, $target.parent(), function () { + $this.trigger({ + type: 'shown' + , relatedTarget: previous + }) + }) + } + + , activate: function ( element, container, callback) { + var $active = container.find('> .active') + , transition = callback + && $.support.transition + && $active.hasClass('fade'); + + function next() { + $active + .removeClass('active') + .find('> .dropdown-menu > .active') + .removeClass('active'); + + element.addClass('active'); + + if (transition) { + element[0].offsetWidth; // reflow for transition + element.addClass('in'); + } else { + element.removeClass('fade') + } + + if ( element.parent('.dropdown-menu') ) { + element.closest('li.dropdown').addClass('active') + } + + callback && callback() + } + + transition ? + $active.one($.support.transition.end, next) : + next(); + + $active.removeClass('in') + } + }; + + + /* TAB PLUGIN DEFINITION + * ===================== */ + + $.fn.tab = function ( option ) { + return this.each(function () { + var $this = $(this) + , data = $this.data('tab'); + if (!data) $this.data('tab', (data = new Tab(this))); + if (typeof option == 'string') data[option]() + }) + }; + + $.fn.tab.Constructor = Tab; + + + /* TAB DATA-API + * ============ */ + + $(function () { + $('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) { + e.preventDefault(); + $(this).tab('show') + }) + }) + +}(window.jQuery); + +/* ============================================================= + * bootstrap-collapse.js v2.0.4 + * http://twitter.github.com/bootstrap/javascript.html#collapse + * ============================================================= + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* COLLAPSE PUBLIC CLASS DEFINITION + * ================================ */ + + var Collapse = function (element, options) { + this.$element = $(element); + this.options = $.extend({}, $.fn.collapse.defaults, options); + + if (this.options.parent) { + this.$parent = $(this.options.parent) + } + + this.options.toggle && this.toggle() + }; + + Collapse.prototype = { + + constructor: Collapse + + , dimension: function () { + var hasWidth = this.$element.hasClass('width'); + return hasWidth ? 'width' : 'height' + } + + , show: function () { + var dimension + , scroll + , actives + , hasData; + + if (this.transitioning) return; + + dimension = this.dimension(); + scroll = $.camelCase(['scroll', dimension].join('-')); + actives = this.$parent && this.$parent.find('> .accordion-group > .in'); + + if (actives && actives.length) { + hasData = actives.data('collapse'); + if (hasData && hasData.transitioning) return; + actives.collapse('hide'); + hasData || actives.data('collapse', null) + } + + this.$element[dimension](0); + this.transition('addClass', $.Event('show'), 'shown'); + this.$element[dimension](this.$element[0][scroll]); + } + + , hide: function () { + var dimension; + if (this.transitioning) return; + dimension = this.dimension(); + this.reset(this.$element[dimension]()); + this.transition('removeClass', $.Event('hide'), 'hidden'); + this.$element[dimension](0) + } + + , reset: function (size) { + var dimension = this.dimension(); + + this.$element + .removeClass('collapse') + [dimension](size || 'auto') + [0].offsetWidth; + + this.$element[size !== null ? 'addClass' : 'removeClass']('collapse'); + + return this + } + + , transition: function (method, startEvent, completeEvent) { + var that = this + , complete = function () { + if (startEvent.type == 'show') that.reset(); + that.transitioning = 0; + that.$element.trigger(completeEvent) + }; + + this.$element.trigger(startEvent); + + if (startEvent.isDefaultPrevented()) return; + + this.transitioning = 1; + + this.$element[method]('in'); + + $.support.transition && this.$element.hasClass('collapse') ? + this.$element.one($.support.transition.end, complete) : + complete() + } + + , toggle: function () { + this[this.$element.hasClass('in') ? 'hide' : 'show'](); + } + + }; + + + /* COLLAPSIBLE PLUGIN DEFINITION + * ============================== */ + + $.fn.collapse = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('collapse') + , options = typeof option == 'object' && option; + if (!data) $this.data('collapse', (data = new Collapse(this, options))); + if (typeof option == 'string') data[option]() + }) + }; + + $.fn.collapse.defaults = { + toggle: true + }; + + $.fn.collapse.Constructor = Collapse; + + + /* COLLAPSIBLE DATA-API + * ==================== */ + + $(function () { + $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function ( e ) { + var $this = $(this), href + , target = $this.attr('data-target') + || e.preventDefault() + || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 + , option = $(target).data('collapse') ? 'toggle' : $this.data(); + $(target).collapse(option); + $(this).toggleClass('active'); + }) + }) + +}(window.jQuery); \ No newline at end of file diff --git a/pub/lib/lib/modernizr.js b/pub/lib/lib/modernizr.js new file mode 100644 index 0000000000000000000000000000000000000000..9b4f68aaaaaa9bd5e680c1e6b58505fcab5406f3 --- /dev/null +++ b/pub/lib/lib/modernizr.js @@ -0,0 +1,1384 @@ +/*! + * Modernizr v2.6.1 + * www.modernizr.com + * + * Copyright (c) Faruk Ates, Paul Irish, Alex Sexton + * Available under the BSD and MIT licenses: www.modernizr.com/license/ + */ + +/* + * Modernizr tests which native CSS3 and HTML5 features are available in + * the current UA and makes the results available to you in two ways: + * as properties on a global Modernizr object, and as classes on the + * <html> element. This information allows you to progressively enhance + * your pages with a granular level of control over the experience. + * + * Modernizr has an optional (not included) conditional resource loader + * called Modernizr.load(), based on Yepnope.js (yepnopejs.com). + * To get a build that includes Modernizr.load(), as well as choosing + * which tests to include, go to www.modernizr.com/download/ + * + * Authors Faruk Ates, Paul Irish, Alex Sexton + * Contributors Ryan Seddon, Ben Alman + */ + +window.Modernizr = (function( window, document, undefined ) { + + var version = '2.6.1', + + Modernizr = {}, + + /*>>cssclasses*/ + // option for enabling the HTML classes to be added + enableClasses = true, + /*>>cssclasses*/ + + docElement = document.documentElement, + + /** + * Create our "modernizr" element that we do most feature tests on. + */ + mod = 'modernizr', + modElem = document.createElement(mod), + mStyle = modElem.style, + + /** + * Create the input element for various Web Forms feature tests. + */ + inputElem /*>>inputelem*/ = document.createElement('input') /*>>inputelem*/ , + + /*>>smile*/ + smile = ':)', + /*>>smile*/ + + toString = {}.toString, + + // TODO :: make the prefixes more granular + /*>>prefixes*/ + // List of property values to set for css tests. See ticket #21 + prefixes = ' -webkit- -moz- -o- -ms- '.split(' '), + /*>>prefixes*/ + + /*>>domprefixes*/ + // Following spec is to expose vendor-specific style properties as: + // elem.style.WebkitBorderRadius + // and the following would be incorrect: + // elem.style.webkitBorderRadius + + // Webkit ghosts their properties in lowercase but Opera & Moz do not. + // Microsoft uses a lowercase `ms` instead of the correct `Ms` in IE8+ + // erik.eae.net/archives/2008/03/10/21.48.10/ + + // More here: github.com/Modernizr/Modernizr/issues/issue/21 + omPrefixes = 'Webkit Moz O ms', + + cssomPrefixes = omPrefixes.split(' '), + + domPrefixes = omPrefixes.toLowerCase().split(' '), + /*>>domprefixes*/ + + /*>>ns*/ + ns = {'svg': 'http://www.w3.org/2000/svg'}, + /*>>ns*/ + + tests = {}, + inputs = {}, + attrs = {}, + + classes = [], + + slice = classes.slice, + + featureName, // used in testing loop + + + /*>>teststyles*/ + // Inject element with style element and some CSS rules + injectElementWithStyles = function( rule, callback, nodes, testnames ) { + + var style, ret, node, + div = document.createElement('div'), + // After page load injecting a fake body doesn't work so check if body exists + body = document.body, + // IE6 and 7 won't return offsetWidth or offsetHeight unless it's in the body element, so we fake it. + fakeBody = body ? body : document.createElement('body'); + + if ( parseInt(nodes, 10) ) { + // In order not to give false positives we create a node for each test + // This also allows the method to scale for unspecified uses + while ( nodes-- ) { + node = document.createElement('div'); + node.id = testnames ? testnames[nodes] : mod + (nodes + 1); + div.appendChild(node); + } + } + + // <style> elements in IE6-9 are considered 'NoScope' elements and therefore will be removed + // when injected with innerHTML. To get around this you need to prepend the 'NoScope' element + // with a 'scoped' element, in our case the soft-hyphen entity as it won't mess with our measurements. + // msdn.microsoft.com/en-us/library/ms533897%28VS.85%29.aspx + // Documents served as xml will throw if using ­ so use xml friendly encoded version. See issue #277 + style = ['­','<style id="s', mod, '">', rule, '</style>'].join(''); + div.id = mod; + // IE6 will false positive on some tests due to the style element inside the test div somehow interfering offsetHeight, so insert it into body or fakebody. + // Opera will act all quirky when injecting elements in documentElement when page is served as xml, needs fakebody too. #270 + (body ? div : fakeBody).innerHTML += style; + fakeBody.appendChild(div); + if ( !body ) { + //avoid crashing IE8, if background image is used + fakeBody.style.background = ""; + docElement.appendChild(fakeBody); + } + + ret = callback(div, rule); + // If this is done after page load we don't want to remove the body so check if body exists + !body ? fakeBody.parentNode.removeChild(fakeBody) : div.parentNode.removeChild(div); + + return !!ret; + + }, + /*>>teststyles*/ + + /*>>mq*/ + // adapted from matchMedia polyfill + // by Scott Jehl and Paul Irish + // gist.github.com/786768 + testMediaQuery = function( mq ) { + + var matchMedia = window.matchMedia || window.msMatchMedia; + if ( matchMedia ) { + return matchMedia(mq).matches; + } + + var bool; + + injectElementWithStyles('@media ' + mq + ' { #' + mod + ' { position: absolute; } }', function( node ) { + bool = (window.getComputedStyle ? + getComputedStyle(node, null) : + node.currentStyle)['position'] == 'absolute'; + }); + + return bool; + + }, + /*>>mq*/ + + + /*>>hasevent*/ + // + // isEventSupported determines if a given element supports the given event + // kangax.github.com/iseventsupported/ + // + // The following results are known incorrects: + // Modernizr.hasEvent("webkitTransitionEnd", elem) // false negative + // Modernizr.hasEvent("textInput") // in Webkit. github.com/Modernizr/Modernizr/issues/333 + // ... + isEventSupported = (function() { + + var TAGNAMES = { + 'select': 'input', 'change': 'input', + 'submit': 'form', 'reset': 'form', + 'error': 'img', 'load': 'img', 'abort': 'img' + }; + + function isEventSupported( eventName, element ) { + + element = element || document.createElement(TAGNAMES[eventName] || 'div'); + eventName = 'on' + eventName; + + // When using `setAttribute`, IE skips "unload", WebKit skips "unload" and "resize", whereas `in` "catches" those + var isSupported = eventName in element; + + if ( !isSupported ) { + // If it has no `setAttribute` (i.e. doesn't implement Node interface), try generic element + if ( !element.setAttribute ) { + element = document.createElement('div'); + } + if ( element.setAttribute && element.removeAttribute ) { + element.setAttribute(eventName, ''); + isSupported = is(element[eventName], 'function'); + + // If property was created, "remove it" (by setting value to `undefined`) + if ( !is(element[eventName], 'undefined') ) { + element[eventName] = undefined; + } + element.removeAttribute(eventName); + } + } + + element = null; + return isSupported; + } + return isEventSupported; + })(), + /*>>hasevent*/ + + // TODO :: Add flag for hasownprop ? didn't last time + + // hasOwnProperty shim by kangax needed for Safari 2.0 support + _hasOwnProperty = ({}).hasOwnProperty, hasOwnProp; + + if ( !is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined') ) { + hasOwnProp = function (object, property) { + return _hasOwnProperty.call(object, property); + }; + } + else { + hasOwnProp = function (object, property) { /* yes, this can give false positives/negatives, but most of the time we don't care about those */ + return ((property in object) && is(object.constructor.prototype[property], 'undefined')); + }; + } + + // Adapted from ES5-shim https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js + // es5.github.com/#x15.3.4.5 + + if (!Function.prototype.bind) { + Function.prototype.bind = function bind(that) { + + var target = this; + + if (typeof target != "function") { + throw new TypeError(); + } + + var args = slice.call(arguments, 1), + bound = function () { + + if (this instanceof bound) { + + var F = function(){}; + F.prototype = target.prototype; + var self = new F(); + + var result = target.apply( + self, + args.concat(slice.call(arguments)) + ); + if (Object(result) === result) { + return result; + } + return self; + + } else { + + return target.apply( + that, + args.concat(slice.call(arguments)) + ); + + } + + }; + + return bound; + }; + } + + /** + * setCss applies given styles to the Modernizr DOM node. + */ + function setCss( str ) { + mStyle.cssText = str; + } + + /** + * setCssAll extrapolates all vendor-specific css strings. + */ + function setCssAll( str1, str2 ) { + return setCss(prefixes.join(str1 + ';') + ( str2 || '' )); + } + + /** + * is returns a boolean for if typeof obj is exactly type. + */ + function is( obj, type ) { + return typeof obj === type; + } + + /** + * contains returns a boolean for if substr is found within str. + */ + function contains( str, substr ) { + return !!~('' + str).indexOf(substr); + } + + /*>>testprop*/ + + // testProps is a generic CSS / DOM property test. + + // In testing support for a given CSS property, it's legit to test: + // `elem.style[styleName] !== undefined` + // If the property is supported it will return an empty string, + // if unsupported it will return undefined. + + // We'll take advantage of this quick test and skip setting a style + // on our modernizr element, but instead just testing undefined vs + // empty string. + + // Because the testing of the CSS property names (with "-", as + // opposed to the camelCase DOM properties) is non-portable and + // non-standard but works in WebKit and IE (but not Gecko or Opera), + // we explicitly reject properties with dashes so that authors + // developing in WebKit or IE first don't end up with + // browser-specific content by accident. + + function testProps( props, prefixed ) { + for ( var i in props ) { + var prop = props[i]; + if ( !contains(prop, "-") && mStyle[prop] !== undefined ) { + return prefixed == 'pfx' ? prop : true; + } + } + return false; + } + /*>>testprop*/ + + // TODO :: add testDOMProps + /** + * testDOMProps is a generic DOM property test; if a browser supports + * a certain property, it won't return undefined for it. + */ + function testDOMProps( props, obj, elem ) { + for ( var i in props ) { + var item = obj[props[i]]; + if ( item !== undefined) { + + // return the property name as a string + if (elem === false) return props[i]; + + // let's bind a function + if (is(item, 'function')){ + // default to autobind unless override + return item.bind(elem || obj); + } + + // return the unbound function or obj or value + return item; + } + } + return false; + } + + /*>>testallprops*/ + /** + * testPropsAll tests a list of DOM properties we want to check against. + * We specify literally ALL possible (known and/or likely) properties on + * the element including the non-vendor prefixed one, for forward- + * compatibility. + */ + function testPropsAll( prop, prefixed, elem ) { + + var ucProp = prop.charAt(0).toUpperCase() + prop.slice(1), + props = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' '); + + // did they call .prefixed('boxSizing') or are we just testing a prop? + if(is(prefixed, "string") || is(prefixed, "undefined")) { + return testProps(props, prefixed); + + // otherwise, they called .prefixed('requestAnimationFrame', window[, elem]) + } else { + props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' '); + return testDOMProps(props, prefixed, elem); + } + } + /*>>testallprops*/ + + + /** + * Tests + * ----- + */ + + // The *new* flexbox + // dev.w3.org/csswg/css3-flexbox + + tests['flexbox'] = function() { + return testPropsAll('flexWrap'); + }; + + // The *old* flexbox + // www.w3.org/TR/2009/WD-css3-flexbox-20090723/ + + tests['flexboxlegacy'] = function() { + return testPropsAll('boxDirection'); + }; + + // On the S60 and BB Storm, getContext exists, but always returns undefined + // so we actually have to call getContext() to verify + // github.com/Modernizr/Modernizr/issues/issue/97/ + + tests['canvas'] = function() { + var elem = document.createElement('canvas'); + return !!(elem.getContext && elem.getContext('2d')); + }; + + tests['canvastext'] = function() { + return !!(Modernizr['canvas'] && is(document.createElement('canvas').getContext('2d').fillText, 'function')); + }; + + // webk.it/70117 is tracking a legit WebGL feature detect proposal + + // We do a soft detect which may false positive in order to avoid + // an expensive context creation: bugzil.la/732441 + + tests['webgl'] = function() { + return !!window.WebGLRenderingContext; + }; + + /* + * The Modernizr.touch test only indicates if the browser supports + * touch events, which does not necessarily reflect a touchscreen + * device, as evidenced by tablets running Windows 7 or, alas, + * the Palm Pre / WebOS (touch) phones. + * + * Additionally, Chrome (desktop) used to lie about its support on this, + * but that has since been rectified: crbug.com/36415 + * + * We also test for Firefox 4 Multitouch Support. + * + * For more info, see: modernizr.github.com/Modernizr/touch.html + */ + + tests['touch'] = function() { + var bool; + + if(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) { + bool = true; + } else { + injectElementWithStyles(['@media (',prefixes.join('touch-enabled),('),mod,')','{#modernizr{top:9px;position:absolute}}'].join(''), function( node ) { + bool = node.offsetTop === 9; + }); + } + + return bool; + }; + + + // geolocation is often considered a trivial feature detect... + // Turns out, it's quite tricky to get right: + // + // Using !!navigator.geolocation does two things we don't want. It: + // 1. Leaks memory in IE9: github.com/Modernizr/Modernizr/issues/513 + // 2. Disables page caching in WebKit: webk.it/43956 + // + // Meanwhile, in Firefox < 8, an about:config setting could expose + // a false positive that would throw an exception: bugzil.la/688158 + + tests['geolocation'] = function() { + return 'geolocation' in navigator; + }; + + + tests['postmessage'] = function() { + return !!window.postMessage; + }; + + + // Chrome incognito mode used to throw an exception when using openDatabase + // It doesn't anymore. + tests['websqldatabase'] = function() { + return !!window.openDatabase; + }; + + // Vendors had inconsistent prefixing with the experimental Indexed DB: + // - Webkit's implementation is accessible through webkitIndexedDB + // - Firefox shipped moz_indexedDB before FF4b9, but since then has been mozIndexedDB + // For speed, we don't test the legacy (and beta-only) indexedDB + tests['indexedDB'] = function() { + return !!testPropsAll("indexedDB", window); + }; + + // documentMode logic from YUI to filter out IE8 Compat Mode + // which false positives. + tests['hashchange'] = function() { + return isEventSupported('hashchange', window) && (document.documentMode === undefined || document.documentMode > 7); + }; + + // Per 1.6: + // This used to be Modernizr.historymanagement but the longer + // name has been deprecated in favor of a shorter and property-matching one. + // The old API is still available in 1.6, but as of 2.0 will throw a warning, + // and in the first release thereafter disappear entirely. + tests['history'] = function() { + return !!(window.history && history.pushState); + }; + + tests['draganddrop'] = function() { + var div = document.createElement('div'); + return ('draggable' in div) || ('ondragstart' in div && 'ondrop' in div); + }; + + // FF3.6 was EOL'ed on 4/24/12, but the ESR version of FF10 + // will be supported until FF19 (2/12/13), at which time, ESR becomes FF17. + // FF10 still uses prefixes, so check for it until then. + // for more ESR info, see: mozilla.org/en-US/firefox/organizations/faq/ + tests['websockets'] = function() { + return 'WebSocket' in window || 'MozWebSocket' in window; + }; + + + // css-tricks.com/rgba-browser-support/ + tests['rgba'] = function() { + // Set an rgba() color and check the returned value + + setCss('background-color:rgba(150,255,150,.5)'); + + return contains(mStyle.backgroundColor, 'rgba'); + }; + + tests['hsla'] = function() { + // Same as rgba(), in fact, browsers re-map hsla() to rgba() internally, + // except IE9 who retains it as hsla + + setCss('background-color:hsla(120,40%,100%,.5)'); + + return contains(mStyle.backgroundColor, 'rgba') || contains(mStyle.backgroundColor, 'hsla'); + }; + + tests['multiplebgs'] = function() { + // Setting multiple images AND a color on the background shorthand property + // and then querying the style.background property value for the number of + // occurrences of "url(" is a reliable method for detecting ACTUAL support for this! + + setCss('background:url(https://),url(https://),red url(https://)'); + + // If the UA supports multiple backgrounds, there should be three occurrences + // of the string "url(" in the return value for elemStyle.background + + return (/(url\s*\(.*?){3}/).test(mStyle.background); + }; + + + + // this will false positive in Opera Mini + // github.com/Modernizr/Modernizr/issues/396 + + tests['backgroundsize'] = function() { + return testPropsAll('backgroundSize'); + }; + + tests['borderimage'] = function() { + return testPropsAll('borderImage'); + }; + + + // Super comprehensive table about all the unique implementations of + // border-radius: muddledramblings.com/table-of-css3-border-radius-compliance + + tests['borderradius'] = function() { + return testPropsAll('borderRadius'); + }; + + // WebOS unfortunately false positives on this test. + tests['boxshadow'] = function() { + return testPropsAll('boxShadow'); + }; + + // FF3.0 will false positive on this test + tests['textshadow'] = function() { + return document.createElement('div').style.textShadow === ''; + }; + + + tests['opacity'] = function() { + // Browsers that actually have CSS Opacity implemented have done so + // according to spec, which means their return values are within the + // range of [0.0,1.0] - including the leading zero. + + setCssAll('opacity:.55'); + + // The non-literal . in this regex is intentional: + // German Chrome returns this value as 0,55 + // github.com/Modernizr/Modernizr/issues/#issue/59/comment/516632 + return (/^0.55$/).test(mStyle.opacity); + }; + + + // Note, Android < 4 will pass this test, but can only animate + // a single property at a time + // daneden.me/2011/12/putting-up-with-androids-bullshit/ + tests['cssanimations'] = function() { + return testPropsAll('animationName'); + }; + + + tests['csscolumns'] = function() { + return testPropsAll('columnCount'); + }; + + + tests['cssgradients'] = function() { + /** + * For CSS Gradients syntax, please see: + * webkit.org/blog/175/introducing-css-gradients/ + * developer.mozilla.org/en/CSS/-moz-linear-gradient + * developer.mozilla.org/en/CSS/-moz-radial-gradient + * dev.w3.org/csswg/css3-images/#gradients- + */ + + var str1 = 'background-image:', + str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));', + str3 = 'linear-gradient(left top,#9f9, white);'; + + setCss( + // legacy webkit syntax (FIXME: remove when syntax not in use anymore) + (str1 + '-webkit- '.split(' ').join(str2 + str1) + + // standard syntax // trailing 'background-image:' + prefixes.join(str3 + str1)).slice(0, -str1.length) + ); + + return contains(mStyle.backgroundImage, 'gradient'); + }; + + + tests['cssreflections'] = function() { + return testPropsAll('boxReflect'); + }; + + + tests['csstransforms'] = function() { + return !!testPropsAll('transform'); + }; + + + tests['csstransforms3d'] = function() { + + var ret = !!testPropsAll('perspective'); + + // Webkit's 3D transforms are passed off to the browser's own graphics renderer. + // It works fine in Safari on Leopard and Snow Leopard, but not in Chrome in + // some conditions. As a result, Webkit typically recognizes the syntax but + // will sometimes throw a false positive, thus we must do a more thorough check: + if ( ret && 'webkitPerspective' in docElement.style ) { + + // Webkit allows this media query to succeed only if the feature is enabled. + // `@media (transform-3d),(-webkit-transform-3d){ ... }` + injectElementWithStyles('@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}', function( node, rule ) { + ret = node.offsetLeft === 9 && node.offsetHeight === 3; + }); + } + return ret; + }; + + + tests['csstransitions'] = function() { + return testPropsAll('transition'); + }; + + + /*>>fontface*/ + // @font-face detection routine by Diego Perini + // javascript.nwbox.com/CSSSupport/ + + // false positives: + // WebOS github.com/Modernizr/Modernizr/issues/342 + // WP7 github.com/Modernizr/Modernizr/issues/538 + tests['fontface'] = function() { + var bool; + + injectElementWithStyles('@font-face {font-family:"font";src:url("https://")}', function( node, rule ) { + var style = document.getElementById('smodernizr'), + sheet = style.sheet || style.styleSheet, + cssText = sheet ? (sheet.cssRules && sheet.cssRules[0] ? sheet.cssRules[0].cssText : sheet.cssText || '') : ''; + + bool = /src/i.test(cssText) && cssText.indexOf(rule.split(' ')[0]) === 0; + }); + + return bool; + }; + /*>>fontface*/ + + // CSS generated content detection + tests['generatedcontent'] = function() { + var bool; + + injectElementWithStyles(['#modernizr:after{content:"',smile,'";visibility:hidden}'].join(''), function( node ) { + bool = node.offsetHeight >= 1; + }); + + return bool; + }; + + + + // These tests evaluate support of the video/audio elements, as well as + // testing what types of content they support. + // + // We're using the Boolean constructor here, so that we can extend the value + // e.g. Modernizr.video // true + // Modernizr.video.ogg // 'probably' + // + // Codec values from : github.com/NielsLeenheer/html5test/blob/9106a8/index.html#L845 + // thx to NielsLeenheer and zcorpan + + // Note: in some older browsers, "no" was a return value instead of empty string. + // It was live in FF3.5.0 and 3.5.1, but fixed in 3.5.2 + // It was also live in Safari 4.0.0 - 4.0.4, but fixed in 4.0.5 + + tests['video'] = function() { + var elem = document.createElement('video'), + bool = false; + + // IE9 Running on Windows Server SKU can cause an exception to be thrown, bug #224 + try { + if ( bool = !!elem.canPlayType ) { + bool = new Boolean(bool); + bool.ogg = elem.canPlayType('video/ogg; codecs="theora"') .replace(/^no$/,''); + + // Without QuickTime, this value will be `undefined`. github.com/Modernizr/Modernizr/issues/546 + bool.h264 = elem.canPlayType('video/mp4; codecs="avc1.42E01E"') .replace(/^no$/,''); + + bool.webm = elem.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,''); + } + + } catch(e) { } + + return bool; + }; + + tests['audio'] = function() { + var elem = document.createElement('audio'), + bool = false; + + try { + if ( bool = !!elem.canPlayType ) { + bool = new Boolean(bool); + bool.ogg = elem.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,''); + bool.mp3 = elem.canPlayType('audio/mpeg;') .replace(/^no$/,''); + + // Mimetypes accepted: + // developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements + // bit.ly/iphoneoscodecs + bool.wav = elem.canPlayType('audio/wav; codecs="1"') .replace(/^no$/,''); + bool.m4a = ( elem.canPlayType('audio/x-m4a;') || + elem.canPlayType('audio/aac;')) .replace(/^no$/,''); + } + } catch(e) { } + + return bool; + }; + + + // In FF4, if disabled, window.localStorage should === null. + + // Normally, we could not test that directly and need to do a + // `('localStorage' in window) && ` test first because otherwise Firefox will + // throw bugzil.la/365772 if cookies are disabled + + // Also in iOS5 Private Browsing mode, attempting to use localStorage.setItem + // will throw the exception: + // QUOTA_EXCEEDED_ERRROR DOM Exception 22. + // Peculiarly, getItem and removeItem calls do not throw. + + // Because we are forced to try/catch this, we'll go aggressive. + + // Just FWIW: IE8 Compat mode supports these features completely: + // www.quirksmode.org/dom/html5.html + // But IE8 doesn't support either with local files + + tests['localstorage'] = function() { + try { + localStorage.setItem(mod, mod); + localStorage.removeItem(mod); + return true; + } catch(e) { + return false; + } + }; + + tests['sessionstorage'] = function() { + try { + sessionStorage.setItem(mod, mod); + sessionStorage.removeItem(mod); + return true; + } catch(e) { + return false; + } + }; + + + tests['webworkers'] = function() { + return !!window.Worker; + }; + + + tests['applicationcache'] = function() { + return !!window.applicationCache; + }; + + + // Thanks to Erik Dahlstrom + tests['svg'] = function() { + return !!document.createElementNS && !!document.createElementNS(ns.svg, 'svg').createSVGRect; + }; + + // specifically for SVG inline in HTML, not within XHTML + // test page: paulirish.com/demo/inline-svg + tests['inlinesvg'] = function() { + var div = document.createElement('div'); + div.innerHTML = '<svg/>'; + return (div.firstChild && div.firstChild.namespaceURI) == ns.svg; + }; + + // SVG SMIL animation + tests['smil'] = function() { + return !!document.createElementNS && /SVGAnimate/.test(toString.call(document.createElementNS(ns.svg, 'animate'))); + }; + + // This test is only for clip paths in SVG proper, not clip paths on HTML content + // demo: srufaculty.sru.edu/david.dailey/svg/newstuff/clipPath4.svg + + // However read the comments to dig into applying SVG clippaths to HTML content here: + // github.com/Modernizr/Modernizr/issues/213#issuecomment-1149491 + tests['svgclippaths'] = function() { + return !!document.createElementNS && /SVGClipPath/.test(toString.call(document.createElementNS(ns.svg, 'clipPath'))); + }; + + /*>>webforms*/ + // input features and input types go directly onto the ret object, bypassing the tests loop. + // Hold this guy to execute in a moment. + function webforms() { + /*>>input*/ + // Run through HTML5's new input attributes to see if the UA understands any. + // We're using f which is the <input> element created early on + // Mike Taylr has created a comprehensive resource for testing these attributes + // when applied to all input types: + // miketaylr.com/code/input-type-attr.html + // spec: www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary + + // Only input placeholder is tested while textarea's placeholder is not. + // Currently Safari 4 and Opera 11 have support only for the input placeholder + // Both tests are available in feature-detects/forms-placeholder.js + Modernizr['input'] = (function( props ) { + for ( var i = 0, len = props.length; i < len; i++ ) { + attrs[ props[i] ] = !!(props[i] in inputElem); + } + if (attrs.list){ + // safari false positive's on datalist: webk.it/74252 + // see also github.com/Modernizr/Modernizr/issues/146 + attrs.list = !!(document.createElement('datalist') && window.HTMLDataListElement); + } + return attrs; + })('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' ')); + /*>>input*/ + + /*>>inputtypes*/ + // Run through HTML5's new input types to see if the UA understands any. + // This is put behind the tests runloop because it doesn't return a + // true/false like all the other tests; instead, it returns an object + // containing each input type with its corresponding true/false value + + // Big thanks to @miketaylr for the html5 forms expertise. miketaylr.com/ + Modernizr['inputtypes'] = (function(props) { + + for ( var i = 0, bool, inputElemType, defaultView, len = props.length; i < len; i++ ) { + + inputElem.setAttribute('type', inputElemType = props[i]); + bool = inputElem.type !== 'text'; + + // We first check to see if the type we give it sticks.. + // If the type does, we feed it a textual value, which shouldn't be valid. + // If the value doesn't stick, we know there's input sanitization which infers a custom UI + if ( bool ) { + + inputElem.value = smile; + inputElem.style.cssText = 'position:absolute;visibility:hidden;'; + + if ( /^range$/.test(inputElemType) && inputElem.style.WebkitAppearance !== undefined ) { + + docElement.appendChild(inputElem); + defaultView = document.defaultView; + + // Safari 2-4 allows the smiley as a value, despite making a slider + bool = defaultView.getComputedStyle && + defaultView.getComputedStyle(inputElem, null).WebkitAppearance !== 'textfield' && + // Mobile android web browser has false positive, so must + // check the height to see if the widget is actually there. + (inputElem.offsetHeight !== 0); + + docElement.removeChild(inputElem); + + } else if ( /^(search|tel)$/.test(inputElemType) ){ + // Spec doesn't define any special parsing or detectable UI + // behaviors so we pass these through as true + + // Interestingly, opera fails the earlier test, so it doesn't + // even make it here. + + } else if ( /^(url|email)$/.test(inputElemType) ) { + // Real url and email support comes with prebaked validation. + bool = inputElem.checkValidity && inputElem.checkValidity() === false; + + } else { + // If the upgraded input compontent rejects the :) text, we got a winner + bool = inputElem.value != smile; + } + } + + inputs[ props[i] ] = !!bool; + } + return inputs; + })('search tel url email datetime date month week time datetime-local number range color'.split(' ')); + /*>>inputtypes*/ + } + /*>>webforms*/ + + + // End of test definitions + // ----------------------- + + + + // Run through all tests and detect their support in the current UA. + // todo: hypothetically we could be doing an array of tests and use a basic loop here. + for ( var feature in tests ) { + if ( hasOwnProp(tests, feature) ) { + // run the test, throw the return value into the Modernizr, + // then based on that boolean, define an appropriate className + // and push it into an array of classes we'll join later. + featureName = feature.toLowerCase(); + Modernizr[featureName] = tests[feature](); + + classes.push((Modernizr[featureName] ? '' : 'no-') + featureName); + } + } + + /*>>webforms*/ + // input tests need to run. + Modernizr.input || webforms(); + /*>>webforms*/ + + + /** + * addTest allows the user to define their own feature tests + * the result will be added onto the Modernizr object, + * as well as an appropriate className set on the html element + * + * @param feature - String naming the feature + * @param test - Function returning true if feature is supported, false if not + */ + Modernizr.addTest = function ( feature, test ) { + if ( typeof feature == 'object' ) { + for ( var key in feature ) { + if ( hasOwnProp( feature, key ) ) { + Modernizr.addTest( key, feature[ key ] ); + } + } + } else { + + feature = feature.toLowerCase(); + + if ( Modernizr[feature] !== undefined ) { + // we're going to quit if you're trying to overwrite an existing test + // if we were to allow it, we'd do this: + // var re = new RegExp("\\b(no-)?" + feature + "\\b"); + // docElement.className = docElement.className.replace( re, '' ); + // but, no rly, stuff 'em. + return Modernizr; + } + + test = typeof test == 'function' ? test() : test; + + if (enableClasses) { + docElement.className += ' ' + (test ? '' : 'no-') + feature; + } + Modernizr[feature] = test; + + } + + return Modernizr; // allow chaining. + }; + + + // Reset modElem.cssText to nothing to reduce memory footprint. + setCss(''); + modElem = inputElem = null; + + /*>>shiv*/ + /*! HTML5 Shiv v3.6 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed */ + ;(function(window, document) { + /*jshint evil:true */ + /** Preset options */ + var options = window.html5 || {}; + + /** Used to skip problem elements */ + var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i; + + /** Not all elements can be cloned in IE (this list can be shortend) **/ + var saveClones = /^<|^(?:a|b|button|code|div|fieldset|form|h1|h2|h3|h4|h5|h6|i|iframe|img|input|label|li|link|ol|option|p|param|q|script|select|span|strong|style|table|tbody|td|textarea|tfoot|th|thead|tr|ul)$/i; + + /** Detect whether the browser supports default html5 styles */ + var supportsHtml5Styles; + + /** Name of the expando, to work with multiple documents or to re-shiv one document */ + var expando = '_html5shiv'; + + /** The id for the the documents expando */ + var expanID = 0; + + /** Cached data for each document */ + var expandoData = {}; + + /** Detect whether the browser supports unknown elements */ + var supportsUnknownElements; + + (function() { + try { + var a = document.createElement('a'); + a.innerHTML = '<xyz></xyz>'; + //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles + supportsHtml5Styles = ('hidden' in a); + + supportsUnknownElements = a.childNodes.length == 1 || (function() { + // assign a false positive if unable to shiv + (document.createElement)('a'); + var frag = document.createDocumentFragment(); + return ( + typeof frag.cloneNode == 'undefined' || + typeof frag.createDocumentFragment == 'undefined' || + typeof frag.createElement == 'undefined' + ); + }()); + } catch(e) { + supportsHtml5Styles = true; + supportsUnknownElements = true; + } + + }()); + + /*--------------------------------------------------------------------------*/ + + /** + * Creates a style sheet with the given CSS text and adds it to the document. + * @private + * @param {Document} ownerDocument The document. + * @param {String} cssText The CSS text. + * @returns {StyleSheet} The style element. + */ + function addStyleSheet(ownerDocument, cssText) { + var p = ownerDocument.createElement('p'), + parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement; + + p.innerHTML = 'x<style>' + cssText + '</style>'; + return parent.insertBefore(p.lastChild, parent.firstChild); + } + + /** + * Returns the value of `html5.elements` as an array. + * @private + * @returns {Array} An array of shived element node names. + */ + function getElements() { + var elements = html5.elements; + return typeof elements == 'string' ? elements.split(' ') : elements; + } + + /** + * Returns the data associated to the given document + * @private + * @param {Document} ownerDocument The document. + * @returns {Object} An object of data. + */ + function getExpandoData(ownerDocument) { + var data = expandoData[ownerDocument[expando]]; + if (!data) { + data = {}; + expanID++; + ownerDocument[expando] = expanID; + expandoData[expanID] = data; + } + return data; + } + + /** + * returns a shived element for the given nodeName and document + * @memberOf html5 + * @param {String} nodeName name of the element + * @param {Document} ownerDocument The context document. + * @returns {Object} The shived element. + */ + function createElement(nodeName, ownerDocument, data){ + if (!ownerDocument) { + ownerDocument = document; + } + if(supportsUnknownElements){ + return ownerDocument.createElement(nodeName); + } + if (!data) { + data = getExpandoData(ownerDocument); + } + var node; + + if (data.cache[nodeName]) { + node = data.cache[nodeName].cloneNode(); + } else if (saveClones.test(nodeName)) { + node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode(); + } else { + node = data.createElem(nodeName); + } + + // Avoid adding some elements to fragments in IE < 9 because + // * Attributes like `name` or `type` cannot be set/changed once an element + // is inserted into a document/fragment + // * Link elements with `src` attributes that are inaccessible, as with + // a 403 response, will cause the tab/window to crash + // * Script elements appended to fragments will execute when their `src` + // or `text` property is set + return node.canHaveChildren && !reSkip.test(nodeName) ? data.frag.appendChild(node) : node; + } + + /** + * returns a shived DocumentFragment for the given document + * @memberOf html5 + * @param {Document} ownerDocument The context document. + * @returns {Object} The shived DocumentFragment. + */ + function createDocumentFragment(ownerDocument, data){ + if (!ownerDocument) { + ownerDocument = document; + } + if(supportsUnknownElements){ + return ownerDocument.createDocumentFragment(); + } + data = data || getExpandoData(ownerDocument); + var clone = data.frag.cloneNode(), + i = 0, + elems = getElements(), + l = elems.length; + for(;i<l;i++){ + clone.createElement(elems[i]); + } + return clone; + } + + /** + * Shivs the `createElement` and `createDocumentFragment` methods of the document. + * @private + * @param {Document|DocumentFragment} ownerDocument The document. + * @param {Object} data of the document. + */ + function shivMethods(ownerDocument, data) { + if (!data.cache) { + data.cache = {}; + data.createElem = ownerDocument.createElement; + data.createFrag = ownerDocument.createDocumentFragment; + data.frag = data.createFrag(); + } + + + ownerDocument.createElement = function(nodeName) { + //abort shiv + if (!html5.shivMethods) { + return data.createElem(nodeName); + } + return createElement(nodeName, ownerDocument, data); + }; + + ownerDocument.createDocumentFragment = Function('h,f', 'return function(){' + + 'var n=f.cloneNode(),c=n.createElement;' + + 'h.shivMethods&&(' + + // unroll the `createElement` calls + getElements().join().replace(/\w+/g, function(nodeName) { + data.createElem(nodeName); + data.frag.createElement(nodeName); + return 'c("' + nodeName + '")'; + }) + + ');return n}' + )(html5, data.frag); + } + + /*--------------------------------------------------------------------------*/ + + /** + * Shivs the given document. + * @memberOf html5 + * @param {Document} ownerDocument The document to shiv. + * @returns {Document} The shived document. + */ + function shivDocument(ownerDocument) { + if (!ownerDocument) { + ownerDocument = document; + } + var data = getExpandoData(ownerDocument); + + if (html5.shivCSS && !supportsHtml5Styles && !data.hasCSS) { + data.hasCSS = !!addStyleSheet(ownerDocument, + // corrects block display not defined in IE6/7/8/9 + 'article,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}' + + // adds styling not present in IE6/7/8/9 + 'mark{background:#FF0;color:#000}' + ); + } + if (!supportsUnknownElements) { + shivMethods(ownerDocument, data); + } + return ownerDocument; + } + + /*--------------------------------------------------------------------------*/ + + /** + * The `html5` object is exposed so that more elements can be shived and + * existing shiving can be detected on iframes. + * @type Object + * @example + * + * // options can be changed before the script is included + * html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false }; + */ + var html5 = { + + /** + * An array or space separated string of node names of the elements to shiv. + * @memberOf html5 + * @type Array|String + */ + 'elements': options.elements || 'abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video', + + /** + * A flag to indicate that the HTML5 style sheet should be inserted. + * @memberOf html5 + * @type Boolean + */ + 'shivCSS': (options.shivCSS !== false), + + /** + * Is equal to true if a browser supports creating unknown/HTML5 elements + * @memberOf html5 + * @type boolean + */ + 'supportsUnknownElements': supportsUnknownElements, + + /** + * A flag to indicate that the document's `createElement` and `createDocumentFragment` + * methods should be overwritten. + * @memberOf html5 + * @type Boolean + */ + 'shivMethods': (options.shivMethods !== false), + + /** + * A string to describe the type of `html5` object ("default" or "default print"). + * @memberOf html5 + * @type String + */ + 'type': 'default', + + // shivs the document according to the specified `html5` object options + 'shivDocument': shivDocument, + + //creates a shived element + createElement: createElement, + + //creates a shived documentFragment + createDocumentFragment: createDocumentFragment + }; + + /*--------------------------------------------------------------------------*/ + + // expose html5 + window.html5 = html5; + + // shiv the document + shivDocument(document); + + }(this, document)); + /*>>shiv*/ + + // Assign private properties to the return object with prefix + Modernizr._version = version; + + // expose these for the plugin API. Look in the source for how to join() them against your input + /*>>prefixes*/ + Modernizr._prefixes = prefixes; + /*>>prefixes*/ + /*>>domprefixes*/ + Modernizr._domPrefixes = domPrefixes; + Modernizr._cssomPrefixes = cssomPrefixes; + /*>>domprefixes*/ + + /*>>mq*/ + // Modernizr.mq tests a given media query, live against the current state of the window + // A few important notes: + // * If a browser does not support media queries at all (eg. oldIE) the mq() will always return false + // * A max-width or orientation query will be evaluated against the current state, which may change later. + // * You must specify values. Eg. If you are testing support for the min-width media query use: + // Modernizr.mq('(min-width:0)') + // usage: + // Modernizr.mq('only screen and (max-width:768)') + Modernizr.mq = testMediaQuery; + /*>>mq*/ + + /*>>hasevent*/ + // Modernizr.hasEvent() detects support for a given event, with an optional element to test on + // Modernizr.hasEvent('gesturestart', elem) + Modernizr.hasEvent = isEventSupported; + /*>>hasevent*/ + + /*>>testprop*/ + // Modernizr.testProp() investigates whether a given style property is recognized + // Note that the property names must be provided in the camelCase variant. + // Modernizr.testProp('pointerEvents') + Modernizr.testProp = function(prop){ + return testProps([prop]); + }; + /*>>testprop*/ + + /*>>testallprops*/ + // Modernizr.testAllProps() investigates whether a given style property, + // or any of its vendor-prefixed variants, is recognized + // Note that the property names must be provided in the camelCase variant. + // Modernizr.testAllProps('boxSizing') + Modernizr.testAllProps = testPropsAll; + /*>>testallprops*/ + + + /*>>teststyles*/ + // Modernizr.testStyles() allows you to add custom styles to the document and test an element afterwards + // Modernizr.testStyles('#modernizr { position:absolute }', function(elem, rule){ ... }) + Modernizr.testStyles = injectElementWithStyles; + /*>>teststyles*/ + + + /*>>prefixed*/ + // Modernizr.prefixed() returns the prefixed or nonprefixed property name variant of your input + // Modernizr.prefixed('boxSizing') // 'MozBoxSizing' + + // Properties must be passed as dom-style camelcase, rather than `box-sizing` hypentated style. + // Return values will also be the camelCase variant, if you need to translate that to hypenated style use: + // + // str.replace(/([A-Z])/g, function(str,m1){ return '-' + m1.toLowerCase(); }).replace(/^ms-/,'-ms-'); + + // If you're trying to ascertain which transition end event to bind to, you might do something like... + // + // var transEndEventNames = { + // 'WebkitTransition' : 'webkitTransitionEnd', + // 'MozTransition' : 'transitionend', + // 'OTransition' : 'oTransitionEnd', + // 'msTransition' : 'MSTransitionEnd', + // 'transition' : 'transitionend' + // }, + // transEndEventName = transEndEventNames[ Modernizr.prefixed('transition') ]; + + Modernizr.prefixed = function(prop, obj, elem){ + if(!obj) { + return testPropsAll(prop, 'pfx'); + } else { + // Testing DOM property e.g. Modernizr.prefixed('requestAnimationFrame', window) // 'mozRequestAnimationFrame' + return testPropsAll(prop, obj, elem); + } + }; + /*>>prefixed*/ + + + /*>>cssclasses*/ + // Remove "no-js" class from <html> element, if it exists: + docElement.className = docElement.className.replace(/(^|\s)no-js(\s|$)/, '$1$2') + + + // Add the new classes to the <html> element. + (enableClasses ? ' js ' + classes.join(' ') : ''); + /*>>cssclasses*/ + + return Modernizr; + +})(this, this.document); \ No newline at end of file diff --git a/pub/lib/mage/backend/floating-header.js b/pub/lib/mage/backend/floating-header.js index 8ee64e1ceb5d33d31c750f0bcc6ea8319d7680ae..67ae37cea507397c429d9edb1bef94b8edb95372 100644 --- a/pub/lib/mage/backend/floating-header.js +++ b/pub/lib/mage/backend/floating-header.js @@ -28,9 +28,10 @@ $.widget('mage.floatingHeader', { options: { placeholderAttrs: { - 'class': 'content-header-placeholder' + 'class': 'page-actions-placeholder' }, - fixedClass: 'fixed' + fixedClass: 'fixed', + title: '.page-title .title' }, /** @@ -38,8 +39,10 @@ * @private */ _create: function() { + var title = $(this.options.title).text(); this._setVars(); this._bind(); + this.element.wrapInner($('<div/>', {'class': 'page-actions-inner', 'data-title': title})); }, /** diff --git a/pub/lib/mage/backend/multisuggest.js b/pub/lib/mage/backend/multisuggest.js index 9044d15df6170eb3f8dd69cf23d9ed02d4a3f5f5..cb6bcfcb29e6f92234c9aecabb2e75ed9fc07a6a 100644 --- a/pub/lib/mage/backend/multisuggest.js +++ b/pub/lib/mage/backend/multisuggest.js @@ -25,13 +25,15 @@ /*jshint jquery:true browser:true*/ (function($) { 'use strict'; - $.widget('mage.multisuggest', $.mage.suggest, { + $.widget('mage.suggest', $.mage.suggest, { /** * @override */ _create: function() { this._super(); - this.valueField.hide(); + if (this.options.multiselect) { + this.valueField.hide(); + } }, /** @@ -39,7 +41,7 @@ */ _prepareValueField: function() { this._super(); - if (!this.options.valueField && this.options.selectedItems) { + if (this.options.multiselect && !this.options.valueField && this.options.selectedItems) { $.each(this.options.selectedItems, $.proxy(function(i, item) { this._addOption(item); }, this)); @@ -50,25 +52,33 @@ * @override */ _createValueField: function() { - return $('<select/>', { - type: 'hidden', - multiple: 'multiple' - }); + if (this.options.multiselect) { + return $('<select/>', { + type: 'hidden', + multiple: 'multiple' + }); + } else { + return this._super(); + } }, /** * @override */ _selectItem: function() { - if (this.isDropdownShown() && this._focused) { - this._selectedItem = this._readItemData(this._focused); - if (this.valueField.find('option[value=' + this._selectedItem.id + ']').length) { - this._selectedItem = this._nonSelectedItem; - } - if (this._selectedItem !== this._nonSelectedItem) { - this._term = ''; - this._addOption(this._selectedItem); + if (this.options.multiselect) { + if (this.isDropdownShown() && this._focused) { + this._selectedItem = this._readItemData(this._focused); + if (this.valueField.find('option[value=' + this._selectedItem.id + ']').length) { + this._selectedItem = this._nonSelectedItem; + } + if (this._selectedItem !== this._nonSelectedItem) { + this._term = ''; + this._addOption(this._selectedItem); + } } + } else { + this._super(); } }, @@ -97,11 +107,13 @@ */ _hideDropdown: function() { this._super(); - this.element.val(''); + if (this.options.multiselect) { + this.element.val(''); + } } }); - $.widget('mage.multisuggest', $.mage.multisuggest, { + $.widget('mage.suggest', $.mage.suggest, { options: { multiSuggestWrapper: '<ul class="category-selector-choices">' + '<li class="category-selector-search-field"></li></ul>', @@ -115,12 +127,14 @@ */ _render: function() { this._super(); - this.element.wrap(this.options.multiSuggestWrapper); - this.elementWrapper = this.element.parent(); - this.valueField.find('option').each($.proxy(function(i, option) { - option = $(option); - this._renderOption({id: option.val(), label: option.text()}); - }, this)); + if (this.options.multiselect) { + this.element.wrap(this.options.multiSuggestWrapper); + this.elementWrapper = this.element.parent(); + this.valueField.find('option').each($.proxy(function(i, option) { + option = $(option); + this._renderOption({id: option.val(), label: option.text()}); + }, this)); + } }, /** @@ -128,7 +142,7 @@ */ _selectItem: function() { this._superApply(arguments); - if (this._selectedItem !== this._nonSelectedItem) { + if (this.options.multiselect && this._selectedItem !== this._nonSelectedItem) { this._renderOption(this._selectedItem); } }, diff --git a/pub/lib/mage/backend/suggest.js b/pub/lib/mage/backend/suggest.js index bd099ce43388cd43232b6368f72525600c4eebac..79ddbe558b5436ea3da49112057be2bf7ee453e7 100644 --- a/pub/lib/mage/backend/suggest.js +++ b/pub/lib/mage/backend/suggest.js @@ -30,6 +30,7 @@ * Implement base functionality */ $.widget('mage.suggest', { + widgetEventPrefix: "suggest", options: { template: '', minLength: 1, @@ -170,7 +171,7 @@ break; case keyCode.TAB: if (this.isDropdownShown()) { - this._selectItem(); + this._onSelectItem(); event.preventDefault(); } break; @@ -236,7 +237,7 @@ $.each(controlEvents, $.proxy(function(i, handlerName) { switch(suggestEvent) { case 'select' : - events[handlerName] = this._selectItem; + events[handlerName] = this._onSelectItem; break; case 'focus' : events[handlerName] = this._focusItem; @@ -270,6 +271,15 @@ this.element.val(this._term); }, + /** + * + * @private + */ + _onSelectItem: function() { + this._selectItem(); + this._trigger('select', null, [this._selectedItem]); + }, + /** * Save selected item and hide dropdown * @private @@ -329,7 +339,7 @@ */ _setTemplate: function() { this.templateName = 'suggest' + Math.random().toString(36).substr(2); - if ($(this.options.template).length) { + if ($(this.options.template).length && $(this.options.template).prop('type')=== 'text/x-jquery-tmpl') { $(this.options.template).template(this.templateName); } else { $.template(this.templateName, this.options.template); diff --git a/pub/lib/mage/backend/tree-suggest.js b/pub/lib/mage/backend/tree-suggest.js index 2153a69606177bb85f5560e9727572bb7f563da7..19f8c4e7e4f3d88d07a997c1cf8505efb8439a5e 100644 --- a/pub/lib/mage/backend/tree-suggest.js +++ b/pub/lib/mage/backend/tree-suggest.js @@ -95,7 +95,8 @@ } }); - $.widget('mage.treeSuggest', $.mage.multisuggest, { + $.widget('mage.treeSuggest', $.mage.suggest, { + widgetEventPrefix: "suggest", /** * @override */ diff --git a/pub/lib/scriptaculous/controls.js b/pub/lib/scriptaculous/controls.js index c48af2a0b32d54a09a964ab2cf0facc5753a51a3..863245266a9b32c932975a70f0e3bdf4d977d313 100644 --- a/pub/lib/scriptaculous/controls.js +++ b/pub/lib/scriptaculous/controls.js @@ -48,6 +48,7 @@ Autocompleter.Base = Class.create({ this.hasFocus = false; this.changed = false; this.active = false; + this.parent = false; this.index = 0; this.entryCount = 0; this.oldElementValue = this.element.value; @@ -95,6 +96,7 @@ Autocompleter.Base = Class.create({ if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update); if(!this.iefix && (Prototype.Browser.IE) && + (parseInt(navigator.userAgent.substring(navigator.userAgent.indexOf("MSIE")+5)) == 6) && (Element.getStyle(this.update, 'position')=='absolute')) { new Insertion.After(this.update, '<iframe id="' + this.update.id + '_iefix" '+ @@ -119,11 +121,17 @@ Autocompleter.Base = Class.create({ }, startIndicator: function() { - if(this.options.indicator) Element.show(this.options.indicator); + if(this.options.indicator) { + Element.show(this.options.indicator); + } + this.options.parent && $(this.options.parent).addClassName('ajax-loading'); }, stopIndicator: function() { - if(this.options.indicator) Element.hide(this.options.indicator); + if(this.options.indicator) { + Element.hide(this.options.indicator); + } + this.options.parent && $(this.options.parent).removeClassName('ajax-loading'); }, onKeyPress: function(event) { diff --git a/pub/media/theme/customization/.htaccess b/pub/media/theme/customization/.htaccess new file mode 100644 index 0000000000000000000000000000000000000000..93169e4eb44ffa5e6251f3532bb1902854703f07 --- /dev/null +++ b/pub/media/theme/customization/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all