Version Notes
Magento Easy Tabs Community Module
Download this release
Release Info
Developer | TemplatesMaster |
Extension | magento_easy_tabs |
Version | 2.3.6 |
Comparing to | |
See all releases |
Code changes from version 2.3.5 to 2.3.6
- app/code/community/TM/Core/Block/Adminhtml/Module.php +0 -13
- app/code/community/TM/Core/Block/Adminhtml/Module/Grid.php +0 -77
- app/code/community/TM/Core/Block/Adminhtml/Module/Grid/Renderer/Actions.php +0 -45
- app/code/community/TM/Core/Block/Adminhtml/Module/Grid/Renderer/VersionStatus.php +0 -42
- app/code/community/TM/Core/Block/Adminhtml/Module/Manage.php +0 -46
- app/code/community/TM/Core/Block/Adminhtml/Module/Manage/Form.php +0 -12
- app/code/community/TM/Core/Block/Adminhtml/Module/Manage/Tab/Main.php +0 -152
- app/code/community/TM/Core/Block/Adminhtml/Module/Manage/Tabs.php +0 -12
- app/code/community/TM/Core/Block/Adminhtml/Support/Edit.php +0 -35
- app/code/community/TM/Core/Block/Adminhtml/Support/Edit/Form.php +0 -16
- app/code/community/TM/Core/Block/Adminhtml/Support/Edit/Form/Element/Theard.php +0 -39
- app/code/community/TM/Core/Block/Adminhtml/Support/Edit/Form/Element/Theard/Content.php +0 -182
- app/code/community/TM/Core/Block/Adminhtml/Support/Edit/Tab/Main.php +0 -207
- app/code/community/TM/Core/Block/Adminhtml/Support/Edit/Tabs.php +0 -12
- app/code/community/TM/Core/Block/Adminhtml/Support/List.php +0 -12
- app/code/community/TM/Core/Block/Adminhtml/Support/List/Grid.php +0 -203
- app/code/community/TM/Core/Block/Adminhtml/System/Config/Form/Field/Notification.php +0 -11
- app/code/community/TM/Core/Block/Adminhtml/System/Config/Form/Field/Size.php +0 -23
- app/code/community/TM/Core/Block/Adminhtml/System/Config/Form/Fieldset/Modules/List.php +0 -46
- app/code/community/TM/Core/Block/Adminhtml/System/Config/Form/Fieldset/Troubleshooting.php +0 -13
- app/code/community/TM/Core/Block/Adminhtml/Widget/Form/Element/Wysiwyg.php +0 -47
- app/code/community/TM/Core/Block/Adminhtml/Widget/Form/Element/Wysiwyg/Content.php +0 -35
- app/code/community/TM/Core/Block/Adminhtml/Widget/Form/Renderer/Wysiwyg.php +0 -13
- app/code/community/TM/Core/Block/Cms/Block.php +0 -19
- app/code/community/TM/Core/Helper/Data.php +0 -10
- app/code/community/TM/Core/Helper/Debug.php +0 -29
- app/code/community/TM/Core/Model/Adminhtml/System/Config/Source/Notification/Channel.php +0 -33
- app/code/community/TM/Core/Model/Module.php +0 -461
- app/code/community/TM/Core/Model/Module/MessageLogger.php +0 -56
- app/code/community/TM/Core/Model/Module/Upgrade.php +0 -942
- app/code/community/TM/Core/Model/Notification/Feed.php +0 -155
- app/code/community/TM/Core/Model/Oauth/Client.php +0 -257
- app/code/community/TM/Core/Model/Observer.php +0 -66
- app/code/community/TM/Core/Model/Resource/Module.php +0 -16
- app/code/community/TM/Core/Model/Resource/Module/AdminGridCollection.php +0 -17
- app/code/community/TM/Core/Model/Resource/Module/Collection.php +0 -9
- app/code/community/TM/Core/Model/Resource/Module/MergedCollection.php +0 -502
- app/code/community/TM/Core/Model/Resource/Module/RemoteCollection.php +0 -165
- app/code/community/TM/Core/Model/Resource/Support/Collection.php +0 -416
- app/code/community/TM/Core/Model/Timer.php +0 -65
- app/code/community/TM/Core/controllers/Adminhtml/Tmcore/ModuleController.php +0 -123
- app/code/community/TM/Core/controllers/Adminhtml/Tmcore/SupportController.php +0 -282
- app/code/community/TM/Core/etc/adminhtml.xml +0 -55
- app/code/community/TM/Core/etc/config.xml +0 -153
- app/code/community/TM/Core/etc/system.xml +0 -113
- app/code/community/TM/Core/sql/tm_core_setup/mysql4-install-1.0.0.php +0 -26
- app/code/community/TM/Core/sql/tm_core_setup/mysql4-upgrade-1.0.0-1.0.1.php +0 -12
- app/design/adminhtml/default/default/layout/tmcore.xml +0 -62
- app/design/adminhtml/default/default/template/tmcore/popup.phtml +0 -13
- app/design/adminhtml/default/default/template/tmcore/ticket/edit/form/element/theard/content.phtml +0 -98
- app/design/frontend/base/default/layout/tm/core.xml +0 -13
- app/etc/modules/TM_Core.xml +0 -9
- app/locale/en_US/TM_Core.csv +0 -48
- app/locale/es_ES/TM_Core.csv +0 -48
- app/locale/fr_FR/TM_Core.csv +0 -48
- app/locale/it_IT/TM_Core.csv +0 -48
- app/locale/nl_NL/TM_Core.csv +0 -48
- app/locale/pt_PT/TM_Core.csv +0 -48
- js/lib/jquery/jquery-1.10.2.min.js +0 -6
- js/lib/jquery/noconflict.js +0 -27
- js/tm/adminhtml/core/window.js +0 -52
- package.xml +4 -4
app/code/community/TM/Core/Block/Adminhtml/Module.php
DELETED
@@ -1,13 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Block_Adminhtml_Module extends Mage_Adminhtml_Block_Widget_Grid_Container
|
4 |
-
{
|
5 |
-
public function __construct()
|
6 |
-
{
|
7 |
-
$this->_controller = 'adminhtml_module';
|
8 |
-
$this->_blockGroup = 'tmcore';
|
9 |
-
$this->_headerText = Mage::helper('tmcore')->__('Modules');
|
10 |
-
parent::__construct();
|
11 |
-
$this->_removeButton('add');
|
12 |
-
}
|
13 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Block/Adminhtml/Module/Grid.php
DELETED
@@ -1,77 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Block_Adminhtml_Module_Grid extends Mage_Adminhtml_Block_Widget_Grid
|
4 |
-
{
|
5 |
-
public function __construct()
|
6 |
-
{
|
7 |
-
parent::__construct();
|
8 |
-
$this->setId('moduleGrid');
|
9 |
-
$this->setDefaultSort('code');
|
10 |
-
$this->setDefaultDir('ASC');
|
11 |
-
$this->setSaveParametersInSession(true);
|
12 |
-
$this->setUseAjax(true);
|
13 |
-
$this->setVarNameFilter('module_filter');
|
14 |
-
}
|
15 |
-
|
16 |
-
protected function _prepareCollection()
|
17 |
-
{
|
18 |
-
$collection = Mage::getResourceModel('tmcore/module_AdminGridCollection');
|
19 |
-
$this->setCollection($collection);
|
20 |
-
return parent::_prepareCollection();
|
21 |
-
}
|
22 |
-
|
23 |
-
protected function _prepareColumns()
|
24 |
-
{
|
25 |
-
$this->addColumn('code', array(
|
26 |
-
'header' => Mage::helper('tmcore')->__('Code'),
|
27 |
-
'align' => 'left',
|
28 |
-
'index' => 'code'
|
29 |
-
));
|
30 |
-
|
31 |
-
$this->addColumn('version', array(
|
32 |
-
'header' => Mage::helper('tmcore')->__('Local Version'),
|
33 |
-
'align' => 'right',
|
34 |
-
'index' => 'version',
|
35 |
-
'width' => '80px'
|
36 |
-
));
|
37 |
-
|
38 |
-
$this->addColumn('latest_version', array(
|
39 |
-
'header' => Mage::helper('tmcore')->__('Latest Version'),
|
40 |
-
'align' => 'right',
|
41 |
-
'index' => 'latest_version',
|
42 |
-
'width' => '80px'
|
43 |
-
));
|
44 |
-
|
45 |
-
$this->addColumn('version_status', array(
|
46 |
-
'header' => Mage::helper('tmcore')->__('Version Status'),
|
47 |
-
'width' => '60px',
|
48 |
-
'index' => 'version_status',
|
49 |
-
'renderer' => 'tmcore/adminhtml_module_grid_renderer_versionStatus',
|
50 |
-
'type' => 'options',
|
51 |
-
'options' => Mage::getModel('tmcore/module')->getVersionStatuses()
|
52 |
-
));
|
53 |
-
|
54 |
-
$this->addColumn('actions', array(
|
55 |
-
'header' => Mage::helper('tmcore')->__('Actions'),
|
56 |
-
'width' => '200px',
|
57 |
-
'filter' => false,
|
58 |
-
'sortable' => false,
|
59 |
-
'renderer' => 'tmcore/adminhtml_module_grid_renderer_actions'
|
60 |
-
));
|
61 |
-
|
62 |
-
return parent::_prepareColumns();
|
63 |
-
}
|
64 |
-
|
65 |
-
public function getGridUrl()
|
66 |
-
{
|
67 |
-
return $this->getUrl('*/*/grid', array('_current'=>true));
|
68 |
-
}
|
69 |
-
|
70 |
-
public function getRowUrl($row)
|
71 |
-
{
|
72 |
-
if ($row->hasUpgradesDir() || $row->getIdentityKeyLink()) {
|
73 |
-
return $this->getUrl('*/*/manage', array('id' => $row->getId()));
|
74 |
-
}
|
75 |
-
return false;
|
76 |
-
}
|
77 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Block/Adminhtml/Module/Grid/Renderer/Actions.php
DELETED
@@ -1,45 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Block_Adminhtml_Module_Grid_Renderer_Actions
|
4 |
-
extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract
|
5 |
-
{
|
6 |
-
/**
|
7 |
-
* Renders grid column
|
8 |
-
*
|
9 |
-
* @param Varien_Object $row
|
10 |
-
* @return string
|
11 |
-
*/
|
12 |
-
public function render(Varien_Object $row)
|
13 |
-
{
|
14 |
-
$links = array();
|
15 |
-
|
16 |
-
if ($row->getChangelog()) {
|
17 |
-
$links[] = sprintf(
|
18 |
-
'<a href="javascript:void(0)" onclick="%s">%s</a><div style="display:none" class="changelog"><div class="title">%s</div><div class="content">%s</div></div>',
|
19 |
-
"tmcoreWindow.update(this.next('.changelog').down('.content').innerHTML, this.next('.changelog').down('.title').innerHTML).show()",
|
20 |
-
Mage::helper('tmcore')->__('Changelog'),
|
21 |
-
strip_tags($row->getCode()),
|
22 |
-
nl2br(htmlspecialchars($row->getChangelog()))
|
23 |
-
);
|
24 |
-
}
|
25 |
-
|
26 |
-
if ($row->getDownloadLink()) {
|
27 |
-
$links[] = sprintf(
|
28 |
-
'<a href="%s" title="%s" onclick="window.open(this.href); return false;">%s</a>',
|
29 |
-
$row->getDownloadLink(),
|
30 |
-
Mage::helper('tmcore')->__('Download Latest Version'),
|
31 |
-
Mage::helper('tmcore')->__('Download')
|
32 |
-
);
|
33 |
-
}
|
34 |
-
|
35 |
-
if ($row->hasUpgradesDir() || $row->getIdentityKeyLink()) {
|
36 |
-
$links[] = sprintf(
|
37 |
-
'<a href="%s">%s</a>',
|
38 |
-
$this->getUrl('*/*/manage/', array('_current' => true, 'id' => $row->getId())),
|
39 |
-
Mage::helper('tmcore')->__('Manage')
|
40 |
-
);
|
41 |
-
}
|
42 |
-
|
43 |
-
return implode(' | ', $links);
|
44 |
-
}
|
45 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Block/Adminhtml/Module/Grid/Renderer/VersionStatus.php
DELETED
@@ -1,42 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Block_Adminhtml_Module_Grid_Renderer_VersionStatus
|
4 |
-
extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract
|
5 |
-
{
|
6 |
-
/**
|
7 |
-
* Renders grid column
|
8 |
-
*
|
9 |
-
* @param Varien_Object $row
|
10 |
-
* @return string
|
11 |
-
*/
|
12 |
-
public function render(Varien_Object $row)
|
13 |
-
{
|
14 |
-
/**
|
15 |
-
* @var TM_Core_Model_Module
|
16 |
-
*/
|
17 |
-
$module = Mage::getSingleton('tmcore/module');
|
18 |
-
$status = $row->getData($this->getColumn()->getIndex());
|
19 |
-
|
20 |
-
if (null === $status) {
|
21 |
-
return '';
|
22 |
-
}
|
23 |
-
|
24 |
-
$title = '';
|
25 |
-
switch ($status) {
|
26 |
-
case TM_Core_Model_Module::VERSION_UPDATED:
|
27 |
-
$class = 'notice';
|
28 |
-
break;
|
29 |
-
case TM_Core_Model_Module::VERSION_OUTDATED:
|
30 |
-
$class = 'minor';
|
31 |
-
$title = Mage::helper('tmcore')->__('Upgrades are not installed');
|
32 |
-
break;
|
33 |
-
case TM_Core_Model_Module::VERSION_DEPRECATED:
|
34 |
-
$class = 'major';
|
35 |
-
$title = Mage::helper('tmcore')->__('New version is available');
|
36 |
-
break;
|
37 |
-
}
|
38 |
-
$value = $module->getVersionStatuses($status);
|
39 |
-
|
40 |
-
return '<span class="grid-severity-' . $class . '" title="' . $title . '"><span>' . $value . '</span></span>';
|
41 |
-
}
|
42 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Block/Adminhtml/Module/Manage.php
DELETED
@@ -1,46 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Block_Adminhtml_Module_Manage extends Mage_Adminhtml_Block_Widget_Form_Container
|
4 |
-
{
|
5 |
-
public function __construct()
|
6 |
-
{
|
7 |
-
$this->_objectId = 'id';
|
8 |
-
$this->_blockGroup = 'tmcore';
|
9 |
-
$this->_controller = 'adminhtml_module';
|
10 |
-
$this->_mode = 'manage';
|
11 |
-
|
12 |
-
parent::__construct();
|
13 |
-
|
14 |
-
$this->setData('form_action_url', $this->getUrl('*/*/run'));
|
15 |
-
$this->_updateButton('save', 'label', Mage::helper('tmcore')->__('Run'));
|
16 |
-
$this->_removeButton('delete');
|
17 |
-
}
|
18 |
-
|
19 |
-
/**
|
20 |
-
* Get edit form container header text
|
21 |
-
*
|
22 |
-
* @return string
|
23 |
-
*/
|
24 |
-
public function getHeaderText()
|
25 |
-
{
|
26 |
-
$model = Mage::registry('tmcore_module');
|
27 |
-
if ($model->getDataVersion()) { // module is installed already
|
28 |
-
if ($model->getUpgradesToRun()) {
|
29 |
-
$label = 'Upgrade and Install/Reinstall %s %s (Data version %s)';
|
30 |
-
} else {
|
31 |
-
$label = 'Install or Reinstall %s %s (Data version %s)';
|
32 |
-
}
|
33 |
-
return Mage::helper('tmcore')->__(
|
34 |
-
$label,
|
35 |
-
$model->getCode(),
|
36 |
-
$model->getVersion(),
|
37 |
-
$model->getDataVersion()
|
38 |
-
);
|
39 |
-
}
|
40 |
-
return Mage::helper('tmcore')->__(
|
41 |
-
'Install %s %s',
|
42 |
-
$model->getCode(),
|
43 |
-
$model->getVersion()
|
44 |
-
);
|
45 |
-
}
|
46 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Block/Adminhtml/Module/Manage/Form.php
DELETED
@@ -1,12 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Block_Adminhtml_Module_Manage_Form extends Mage_Adminhtml_Block_Widget_Form
|
4 |
-
{
|
5 |
-
protected function _prepareForm()
|
6 |
-
{
|
7 |
-
$form = new Varien_Data_Form(array('id' => 'edit_form', 'action' => $this->getData('action'), 'method' => 'post'));
|
8 |
-
$form->setUseContainer(true);
|
9 |
-
$this->setForm($form);
|
10 |
-
return parent::_prepareForm();
|
11 |
-
}
|
12 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Block/Adminhtml/Module/Manage/Tab/Main.php
DELETED
@@ -1,152 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Block_Adminhtml_Module_Manage_Tab_Main
|
4 |
-
extends Mage_Adminhtml_Block_Widget_Form
|
5 |
-
implements Mage_Adminhtml_Block_Widget_Tab_Interface
|
6 |
-
{
|
7 |
-
protected function _prepareForm()
|
8 |
-
{
|
9 |
-
$model = Mage::registry('tmcore_module');
|
10 |
-
|
11 |
-
$form = new Varien_Data_Form(
|
12 |
-
array('id' => 'edit_form', 'action' => $this->getData('action'), 'method' => 'post')
|
13 |
-
);
|
14 |
-
|
15 |
-
$form->setHtmlIdPrefix('module_');
|
16 |
-
|
17 |
-
$stores = Mage::getSingleton('adminhtml/system_store')->getStoreOptionHash(true);
|
18 |
-
if (isset($stores[0])) {
|
19 |
-
$stores[0] = Mage::helper('adminhtml')->__('All Store Views');
|
20 |
-
}
|
21 |
-
|
22 |
-
if ($model->getDataVersion() && ($upgrades = $model->getUpgradesToRun())) {
|
23 |
-
$fieldset = $form->addFieldset('upgrade_fieldset', array(
|
24 |
-
'legend' => Mage::helper('tmcore')->__('Upgrade Information'),
|
25 |
-
'class' => 'fieldset-wide'
|
26 |
-
));
|
27 |
-
$fieldset->addField('skip_upgrade', 'checkbox', array(
|
28 |
-
'name' => 'skip_upgrade',
|
29 |
-
'label' => Mage::helper('tmcore')->__('Activate this checkbox, if you want to skip the upgrade operations'),
|
30 |
-
'title' => Mage::helper('tmcore')->__('Activate this checkbox, if you want to skip the upgrade operations'),
|
31 |
-
'value' => 1
|
32 |
-
));
|
33 |
-
|
34 |
-
$label = Mage::helper('tmcore')->__(
|
35 |
-
'Module data will be upgraded from %s to %s at the following stores',
|
36 |
-
$model->getDataVersion(),
|
37 |
-
$upgrades[count($upgrades) - 1]
|
38 |
-
);
|
39 |
-
$fieldset->addField('installed_stores', 'textarea', array(
|
40 |
-
'label' => $label,
|
41 |
-
'title' => $label,
|
42 |
-
'value' => implode("\n", array_intersect_key($stores, array_flip($model->getStores()))),
|
43 |
-
'readonly' => 1
|
44 |
-
));
|
45 |
-
}
|
46 |
-
|
47 |
-
$fieldset = $form->addFieldset('base_fieldset', array(
|
48 |
-
'legend' => Mage::helper('tmcore')->__('Install and Reinstall Information'),
|
49 |
-
'class' => 'fieldset-wide'
|
50 |
-
));
|
51 |
-
|
52 |
-
$fieldset->addField('code', 'hidden', array(
|
53 |
-
'name' => 'id'
|
54 |
-
));
|
55 |
-
|
56 |
-
if ($model->isValidationRequired()) {
|
57 |
-
$note = '';
|
58 |
-
if ($model->getRemote()) {
|
59 |
-
$link = $model->getRemote()->getIdentityKeyLink();
|
60 |
-
$note = Mage::helper('tmcore')->__(
|
61 |
-
'Get your identity key at <a href="%s" title="%s" target="_blank">%s</a>',
|
62 |
-
$link,
|
63 |
-
$link,
|
64 |
-
$link
|
65 |
-
);
|
66 |
-
}
|
67 |
-
$fieldset->addField('identity_key', 'textarea', array(
|
68 |
-
'name' => 'identity_key',
|
69 |
-
'required' => true,
|
70 |
-
'label' => Mage::helper('tmcore')->__('Identity Key'),
|
71 |
-
'title' => Mage::helper('tmcore')->__('Identity Key'),
|
72 |
-
'note' => $note
|
73 |
-
));
|
74 |
-
}
|
75 |
-
|
76 |
-
$field = $fieldset->addField('new_stores', 'multiselect', array(
|
77 |
-
'name' => 'new_stores[]',
|
78 |
-
'label' => Mage::helper('tmcore')->__('Select stores to install or reinstall module'),
|
79 |
-
'title' => Mage::helper('tmcore')->__('Select stores to install or reinstall module'),
|
80 |
-
'values' => Mage::getSingleton('adminhtml/system_store')->getStoreValuesForForm(false, true)
|
81 |
-
));
|
82 |
-
$renderer = $this->getLayout()->createBlock('adminhtml/store_switcher_form_renderer_fieldset_element');
|
83 |
-
if ($renderer) {
|
84 |
-
$field->setRenderer($renderer);
|
85 |
-
}
|
86 |
-
|
87 |
-
if ($installedStores = $model->getStores()) {
|
88 |
-
$fieldset->addField('installed_stores_info', 'label', array(
|
89 |
-
'label' => Mage::helper('tmcore')->__('Module is already installed at following stores'),
|
90 |
-
'title' => Mage::helper('tmcore')->__('Module is already installed at following stores'),
|
91 |
-
'value' => implode(", ", array_intersect_key($stores, array_flip($installedStores))),
|
92 |
-
'readonly' => 1
|
93 |
-
));
|
94 |
-
}
|
95 |
-
|
96 |
-
$form->addValues($model->getData());
|
97 |
-
$this->setForm($form);
|
98 |
-
|
99 |
-
return parent::_prepareForm();
|
100 |
-
}
|
101 |
-
|
102 |
-
/**
|
103 |
-
* Prepare label for tab
|
104 |
-
*
|
105 |
-
* @return string
|
106 |
-
*/
|
107 |
-
public function getTabLabel()
|
108 |
-
{
|
109 |
-
return Mage::helper('cms')->__('Main');
|
110 |
-
}
|
111 |
-
|
112 |
-
/**
|
113 |
-
* Prepare title for tab
|
114 |
-
*
|
115 |
-
* @return string
|
116 |
-
*/
|
117 |
-
public function getTabTitle()
|
118 |
-
{
|
119 |
-
return Mage::helper('cms')->__('Main');
|
120 |
-
}
|
121 |
-
|
122 |
-
/**
|
123 |
-
* Returns status flag about this tab can be shown or not
|
124 |
-
*
|
125 |
-
* @return true
|
126 |
-
*/
|
127 |
-
public function canShowTab()
|
128 |
-
{
|
129 |
-
return true;
|
130 |
-
}
|
131 |
-
|
132 |
-
/**
|
133 |
-
* Returns status flag about this tab hidden or not
|
134 |
-
*
|
135 |
-
* @return true
|
136 |
-
*/
|
137 |
-
public function isHidden()
|
138 |
-
{
|
139 |
-
return false;
|
140 |
-
}
|
141 |
-
|
142 |
-
/**
|
143 |
-
* Check permission for passed action
|
144 |
-
*
|
145 |
-
* @param string $action
|
146 |
-
* @return bool
|
147 |
-
*/
|
148 |
-
protected function _isAllowedAction($action)
|
149 |
-
{
|
150 |
-
return Mage::getSingleton('admin/session')->isAllowed('tmcore/module/' . $action);
|
151 |
-
}
|
152 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Block/Adminhtml/Module/Manage/Tabs.php
DELETED
@@ -1,12 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Block_Adminhtml_Module_Manage_Tabs extends Mage_Adminhtml_Block_Widget_Tabs
|
4 |
-
{
|
5 |
-
public function __construct()
|
6 |
-
{
|
7 |
-
parent::__construct();
|
8 |
-
$this->setId('module_tabs');
|
9 |
-
$this->setDestElementId('edit_form');
|
10 |
-
$this->setTitle(Mage::helper('tmcore')->__('Manage Module'));
|
11 |
-
}
|
12 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Block/Adminhtml/Support/Edit.php
DELETED
@@ -1,35 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Block_Adminhtml_Support_Edit extends Mage_Adminhtml_Block_Widget_Form_Container
|
4 |
-
{
|
5 |
-
public function __construct()
|
6 |
-
{
|
7 |
-
$this->_objectId = 'id';
|
8 |
-
$this->_blockGroup = 'tmcore';
|
9 |
-
$this->_controller = 'adminhtml_support';
|
10 |
-
|
11 |
-
parent::__construct();
|
12 |
-
|
13 |
-
$this->setData('form_action_url', $this->getUrl('*/*/save'));
|
14 |
-
// $this->_updateButton('save', 'label', Mage::helper('tmcore')->__('Save'));
|
15 |
-
$this->_removeButton('delete');
|
16 |
-
}
|
17 |
-
|
18 |
-
/**
|
19 |
-
* Get edit form container header text
|
20 |
-
*
|
21 |
-
* @return string
|
22 |
-
*/
|
23 |
-
public function getHeaderText()
|
24 |
-
{
|
25 |
-
$model = Mage::registry('tmcore_support');
|
26 |
-
if (!$model->getId()) {
|
27 |
-
return Mage::helper('tmcore')->__(
|
28 |
-
'Add New Ticket'
|
29 |
-
);
|
30 |
-
}
|
31 |
-
return Mage::helper('tmcore')->__(
|
32 |
-
'Ticket "%s" (#%s)', $model->getTitle(), $model->getNumber()
|
33 |
-
);
|
34 |
-
}
|
35 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Block/Adminhtml/Support/Edit/Form.php
DELETED
@@ -1,16 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Block_Adminhtml_Support_Edit_Form extends Mage_Adminhtml_Block_Widget_Form
|
4 |
-
{
|
5 |
-
protected function _prepareForm()
|
6 |
-
{
|
7 |
-
$form = new Varien_Data_Form(array(
|
8 |
-
'id' => 'edit_form',
|
9 |
-
'action' => $this->getData('action'),
|
10 |
-
'method' => 'post'
|
11 |
-
));
|
12 |
-
$form->setUseContainer(true);
|
13 |
-
$this->setForm($form);
|
14 |
-
return parent::_prepareForm();
|
15 |
-
}
|
16 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Block/Adminhtml/Support/Edit/Form/Element/Theard.php
DELETED
@@ -1,39 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
class TM_Core_Block_Adminhtml_Support_Edit_Form_Element_Theard extends Varien_Data_Form_Element_Abstract
|
3 |
-
{
|
4 |
-
public function getElementHtml()
|
5 |
-
{
|
6 |
-
return $this->getContentHtml();
|
7 |
-
}
|
8 |
-
|
9 |
-
/**
|
10 |
-
* Prepares content block
|
11 |
-
*
|
12 |
-
* @return string
|
13 |
-
*/
|
14 |
-
public function getContentHtml()
|
15 |
-
{
|
16 |
-
// return '--- THEARD --';
|
17 |
-
// /* @var $content TM_Helpmate_Block_Adminhtml_Ticket_Edit_Form_Element_Theard_Content */
|
18 |
-
// Mage_Adminhtml_Block_Catalog_Product_Helper_Form_Gallery_Content
|
19 |
-
$content = Mage::getSingleton('core/layout')
|
20 |
-
->createBlock('tmcore/adminhtml_support_edit_form_element_theard_content');
|
21 |
-
//
|
22 |
-
$content->setId($this->getHtmlId() . '_content')
|
23 |
-
->setElement($this);
|
24 |
-
|
25 |
-
return $content->toHtml();
|
26 |
-
}
|
27 |
-
|
28 |
-
public function getLabel()
|
29 |
-
{
|
30 |
-
return '';
|
31 |
-
}
|
32 |
-
|
33 |
-
public function toHtml()
|
34 |
-
{
|
35 |
-
return '<tr><td class="value" style="width:200%" colspan="3">' .
|
36 |
-
$this->getElementHtml() .
|
37 |
-
'</td></tr>';
|
38 |
-
}
|
39 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Block/Adminhtml/Support/Edit/Form/Element/Theard/Content.php
DELETED
@@ -1,182 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
class TM_Core_Block_Adminhtml_Support_Edit_Form_Element_Theard_Content extends Mage_Adminhtml_Block_Widget
|
3 |
-
{
|
4 |
-
/**
|
5 |
-
*
|
6 |
-
* @var TM_Helpmate_Model_Ticket
|
7 |
-
*/
|
8 |
-
protected $_ticket;
|
9 |
-
|
10 |
-
public function __construct()
|
11 |
-
{
|
12 |
-
parent::__construct();
|
13 |
-
$this->setTemplate('tmcore/ticket/edit/form/element/theard/content.phtml');
|
14 |
-
|
15 |
-
$this->_ticket = Mage::registry('tmcore_support');
|
16 |
-
}
|
17 |
-
|
18 |
-
/**
|
19 |
-
*
|
20 |
-
* @return TM_Helpmate_Model_Ticket
|
21 |
-
*/
|
22 |
-
public function getTicket()
|
23 |
-
{
|
24 |
-
return $this->_ticket;
|
25 |
-
}
|
26 |
-
|
27 |
-
/**
|
28 |
-
*
|
29 |
-
* @return array()
|
30 |
-
*/
|
31 |
-
public function getTheards()
|
32 |
-
{
|
33 |
-
return $this->getTicket()->getTheards();
|
34 |
-
}
|
35 |
-
|
36 |
-
/**
|
37 |
-
*
|
38 |
-
* @param array $theard
|
39 |
-
* @return string
|
40 |
-
*/
|
41 |
-
public function getTheardOwnerTitle(array $theard)
|
42 |
-
{
|
43 |
-
// Zend_Debug::dump($theard);
|
44 |
-
if (empty($theard['user_name'])) {
|
45 |
-
return 'Your said';
|
46 |
-
}
|
47 |
-
|
48 |
-
return $this->helper('helpmate')->__('%s said (admin)', $theard['user_name']);
|
49 |
-
}
|
50 |
-
|
51 |
-
/**
|
52 |
-
*
|
53 |
-
* @param array $theard
|
54 |
-
* @return string
|
55 |
-
*/
|
56 |
-
public function getTheardCreatedAt(array $theard, $dateType = 'date', $format = 'medium')
|
57 |
-
{
|
58 |
-
if (!isset($theard['created_at'])) {
|
59 |
-
return '';
|
60 |
-
}
|
61 |
-
if ('date' === $dateType) {
|
62 |
-
return $this->helper('core')->formatDate($theard['created_at'], $format);
|
63 |
-
}
|
64 |
-
return $this->helper('core')->formatTime($theard['created_at'], $format);
|
65 |
-
}
|
66 |
-
|
67 |
-
/**
|
68 |
-
*
|
69 |
-
* @param array $theard
|
70 |
-
* @return string
|
71 |
-
*/
|
72 |
-
public function getTheardModifiedAt(array $theard, $dateType = 'date', $format = 'medium')
|
73 |
-
{
|
74 |
-
if (!isset($theard['created_at'])) {
|
75 |
-
return '';
|
76 |
-
}
|
77 |
-
if ('date' === $dateType) {
|
78 |
-
return $this->helper('core')->formatDate($theard['modified_at'], $format);
|
79 |
-
}
|
80 |
-
return $this->helper('core')->formatTime($theard['modified_at'], $format);
|
81 |
-
}
|
82 |
-
|
83 |
-
/**
|
84 |
-
*
|
85 |
-
* @param array $theard
|
86 |
-
* @return string
|
87 |
-
*/
|
88 |
-
public function getTheardStatus(array $theard)
|
89 |
-
{
|
90 |
-
$collection = $this->getTicket()->getStatuses();
|
91 |
-
$item = $collection->getItemById($theard['status']);
|
92 |
-
return $item ? $item->getName() : '';
|
93 |
-
}
|
94 |
-
|
95 |
-
/**
|
96 |
-
*
|
97 |
-
* @param array $theard
|
98 |
-
* @return string
|
99 |
-
*/
|
100 |
-
public function getTheardDepartment(array $theard)
|
101 |
-
{
|
102 |
-
$collection = $this->getTicket()->getDepartmets();
|
103 |
-
$item = $collection->getItemById($theard['department_id']);
|
104 |
-
return $item ? $item->getName() : '';
|
105 |
-
}
|
106 |
-
|
107 |
-
public function getTheardPriority(array $theard)
|
108 |
-
{
|
109 |
-
$collection = $this->getTicket()->getPriorities();
|
110 |
-
$item = $collection->getItemById($theard['priority']);
|
111 |
-
return $item ? $item->getName() : '';
|
112 |
-
}
|
113 |
-
|
114 |
-
public function getTheardText(array $theard)
|
115 |
-
{
|
116 |
-
if (empty($theard['text'])) {
|
117 |
-
return '';
|
118 |
-
}
|
119 |
-
|
120 |
-
// if ($isSecure) {
|
121 |
-
// return Mage::helper('purify')->purify(nl2br($theard['text']));
|
122 |
-
// }
|
123 |
-
|
124 |
-
$content = $theard['text'];
|
125 |
-
|
126 |
-
// text/html convert pseudo text/palin
|
127 |
-
$tags = array (
|
128 |
-
0 => '~<h[123][^>]+>~si',
|
129 |
-
1 => '~<h[456][^>]+>~si',
|
130 |
-
2 => '~<table[^>]+>~si',
|
131 |
-
3 => '~<tr[^>]+>~si',
|
132 |
-
4 => '~<li[^>]+>~si',
|
133 |
-
5 => '~<br[^>]+>~si',
|
134 |
-
6 => '~<p[^>]+>~si',
|
135 |
-
7 => '~<div[^>]+>~si',
|
136 |
-
);
|
137 |
-
$content = preg_replace($tags, "\n", $content);
|
138 |
-
$content = preg_replace('~</t(d|h)>\s*<t(d|h)[^>]+>~si', ' - ', $content);
|
139 |
-
$content = preg_replace('~<[^>]+>~s', '', $content);
|
140 |
-
// reducing spaces
|
141 |
-
$content = preg_replace('~ +~s', ' ', $content);
|
142 |
-
$content = preg_replace('~^\s+~m', '', $content);
|
143 |
-
$content = preg_replace('~\s+$~m', '', $content);
|
144 |
-
// reducing newlines
|
145 |
-
$content = preg_replace('~\n+~s', "\n", $content);
|
146 |
-
|
147 |
-
$_content = '';
|
148 |
-
$isOld = false;
|
149 |
-
$content = wordwrap($content, 170, "\n");
|
150 |
-
foreach (explode("\n", $content) as $_line) {
|
151 |
-
$_isOld = ('>' === $_line[0]) ? true : false;
|
152 |
-
if ($_isOld && !$isOld) {
|
153 |
-
$isOld = true;
|
154 |
-
$_content .= '<span>' . $this->escapeHtml($_line) . "</span><div>";
|
155 |
-
continue;
|
156 |
-
}
|
157 |
-
if (!$_isOld && $isOld) {
|
158 |
-
$isOld = false;
|
159 |
-
$_content .= "</div>\n";
|
160 |
-
}
|
161 |
-
$_content .= $this->escapeHtml($_line) . "\n";
|
162 |
-
}
|
163 |
-
// $content = $this->escapeHtml($content, array('div', 'span', 'hr'));
|
164 |
-
return "<pre class=\"theard_content\" style=\"white-space:pre-wrap\">" .
|
165 |
-
"<code>" .
|
166 |
-
$_content .
|
167 |
-
'</code>' .
|
168 |
-
'</pre>';
|
169 |
-
}
|
170 |
-
|
171 |
-
public function getTheardFileUrl(array $theard)
|
172 |
-
{
|
173 |
-
$path = Mage::getBaseUrl('media') . 'helpmate' . DS;
|
174 |
-
$files = array_filter(explode(';', $theard['file']));
|
175 |
-
|
176 |
-
foreach ($files as &$file) {
|
177 |
-
$file = $path . $file;
|
178 |
-
}
|
179 |
-
|
180 |
-
return $files;
|
181 |
-
}
|
182 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Block/Adminhtml/Support/Edit/Tab/Main.php
DELETED
@@ -1,207 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Block_Adminhtml_Support_Edit_Tab_Main
|
4 |
-
extends Mage_Adminhtml_Block_Widget_Form
|
5 |
-
implements Mage_Adminhtml_Block_Widget_Tab_Interface
|
6 |
-
{
|
7 |
-
protected function _prepareForm()
|
8 |
-
{
|
9 |
-
$model = Mage::registry('tmcore_support');
|
10 |
-
// Zend_Debug::dump($model->getData());
|
11 |
-
|
12 |
-
$isNew = !$model->getId();
|
13 |
-
// Zend_Debug::dump(__METHOD__);
|
14 |
-
$form = new Varien_Data_Form(
|
15 |
-
array('id' => 'edit_form', 'action' => $this->getData('action'), 'method' => 'post')
|
16 |
-
);
|
17 |
-
|
18 |
-
$form->setHtmlIdPrefix('module_');
|
19 |
-
|
20 |
-
$fieldset = $form->addFieldset(
|
21 |
-
'ticket_form',
|
22 |
-
array('legend' => Mage::helper('tmcore')->__('Current state'))
|
23 |
-
);
|
24 |
-
|
25 |
-
$fieldset->addField('title', $isNew ? 'text' : 'label', array(
|
26 |
-
'label' => Mage::helper('tmcore')->__('Title'),
|
27 |
-
'required' => $isNew,
|
28 |
-
'name' => 'title'
|
29 |
-
));
|
30 |
-
|
31 |
-
if (!$isNew) {
|
32 |
-
$fieldset->addField('email', 'label', array(
|
33 |
-
'label' => Mage::helper('tmcore')->__('From'),
|
34 |
-
'name' => 'email'
|
35 |
-
));
|
36 |
-
|
37 |
-
|
38 |
-
$fieldset->addField('id', 'hidden', array(
|
39 |
-
// 'label' => Mage::helper('tmcore')->__('Id'),
|
40 |
-
'name' => 'id'
|
41 |
-
));
|
42 |
-
//
|
43 |
-
// $fieldset->addField('number', 'label', array(
|
44 |
-
// 'label' => Mage::helper('tmcore')->__('Number'),
|
45 |
-
// 'name' => 'number'
|
46 |
-
// ));
|
47 |
-
}
|
48 |
-
$dapertments = array();
|
49 |
-
if ($model->getDepartmets() instanceof Varien_Data_Collection) {
|
50 |
-
$dapertments = $model->getDepartmets()->toOptionArray();
|
51 |
-
}
|
52 |
-
$fieldset->addField('department_id', 'select', array(
|
53 |
-
'label' => Mage::helper('tmcore')->__('Department'),
|
54 |
-
'name' => 'department_id',
|
55 |
-
'disabled' => !$isNew,
|
56 |
-
'required' => $isNew,
|
57 |
-
'values' => $dapertments
|
58 |
-
));
|
59 |
-
if (!$isNew) {
|
60 |
-
$statuses = array();
|
61 |
-
if ($model->getStatuses() instanceof Varien_Data_Collection) {
|
62 |
-
$statuses = $model->getStatuses()->toOptionArray();
|
63 |
-
}
|
64 |
-
$fieldset->addField('status', 'select', array(
|
65 |
-
'label' => Mage::helper('tmcore')->__('Status'),
|
66 |
-
'name' => 'status',
|
67 |
-
'disabled' => true,
|
68 |
-
// 'disabled' => !$isNew,
|
69 |
-
// 'required' => $isNew,
|
70 |
-
'values' => $statuses
|
71 |
-
));
|
72 |
-
}
|
73 |
-
$priorities = array();
|
74 |
-
if ($model->getPriorities() instanceof Varien_Data_Collection) {
|
75 |
-
$priorities = $model->getPriorities()->toOptionArray();
|
76 |
-
}
|
77 |
-
$fieldset->addField('priority', 'select', array(
|
78 |
-
'label' => Mage::helper('tmcore')->__('Priority'),
|
79 |
-
'name' => 'priority',
|
80 |
-
'disabled' => !$isNew,
|
81 |
-
'required' => $isNew,
|
82 |
-
'values' => $priorities
|
83 |
-
));
|
84 |
-
|
85 |
-
if (!$isNew) {
|
86 |
-
$fieldset->addField('created_at', 'date', array(
|
87 |
-
'label' => Mage::helper('tmcore')->__('Create date'),
|
88 |
-
// 'required' => true,
|
89 |
-
'disabled' => true,
|
90 |
-
'image' => $this->getSkinUrl('images/grid-cal.gif'),
|
91 |
-
'format' => Varien_Date::DATETIME_INTERNAL_FORMAT,
|
92 |
-
//Mage::app()->getLocale()->getDateFormat(Mage_Core_Model_Locale::FORMAT_TYPE_SHORT)
|
93 |
-
'name' => 'created_at',
|
94 |
-
));
|
95 |
-
|
96 |
-
$fieldset->addField('modified_at', 'date', array(
|
97 |
-
'label' => Mage::helper('tmcore')->__('Modified date'),
|
98 |
-
// 'required' => true,
|
99 |
-
'disabled' => true,
|
100 |
-
'image' => $this->getSkinUrl('images/grid-cal.gif'),
|
101 |
-
'format' => Varien_Date::DATETIME_INTERNAL_FORMAT,
|
102 |
-
//Mage::app()->getLocale()->getDateFormat(Mage_Core_Model_Locale::FORMAT_TYPE_SHORT)
|
103 |
-
'name' => 'modified_at',
|
104 |
-
));
|
105 |
-
}
|
106 |
-
if ($model->getTheards()) {
|
107 |
-
$fieldsetTheards = $form->addFieldset(
|
108 |
-
'ticket_theards_form',
|
109 |
-
array('legend' => Mage::helper('tmcore')->__('Theards'))
|
110 |
-
);
|
111 |
-
$fieldsetTheards->addType('support_theard', 'TM_Core_Block_Adminhtml_Support_Edit_Form_Element_Theard');
|
112 |
-
$fieldsetTheards->addField('theard', 'support_theard', array(
|
113 |
-
'name' => 'theard'
|
114 |
-
));
|
115 |
-
}
|
116 |
-
|
117 |
-
|
118 |
-
if (!$isNew) {
|
119 |
-
$fieldsetAddComment = $form->addFieldset(
|
120 |
-
'ticket_add_comment_form',
|
121 |
-
array(
|
122 |
-
'legend' => Mage::helper('tmcore')->__('Add Comment')
|
123 |
-
)
|
124 |
-
);
|
125 |
-
} else {
|
126 |
-
$fieldsetAddComment = $fieldset;
|
127 |
-
}
|
128 |
-
|
129 |
-
$wysiwygConfig = Mage::getSingleton('cms/wysiwyg_config')->getConfig(array(
|
130 |
-
'tab_id' => $this->getTabId(),
|
131 |
-
'add_variables' => false,
|
132 |
-
'add_widgets' => false,
|
133 |
-
'width' => '100%',
|
134 |
-
));
|
135 |
-
|
136 |
-
$fieldsetAddComment->addField('text', 'editor', array(
|
137 |
-
'label' => Mage::helper('tmcore')->__('Comment'),
|
138 |
-
'name' => 'text',
|
139 |
-
'config' => $wysiwygConfig,
|
140 |
-
'wysiwyg' => true,
|
141 |
-
'required' => true,
|
142 |
-
'style' => "width: 640px"
|
143 |
-
));
|
144 |
-
$fieldsetAddComment->addField('add', 'button', array(
|
145 |
-
'value' => Mage::helper('helpmate')->__($isNew ? 'Save' : 'Add Comment'),
|
146 |
-
'class' => 'form-button',
|
147 |
-
'name' => 'add_comment_button',
|
148 |
-
'onclick' => 'editForm.submit();return false;'
|
149 |
-
));
|
150 |
-
|
151 |
-
$form->addValues($model->getData());
|
152 |
-
$this->setForm($form);
|
153 |
-
|
154 |
-
return parent::_prepareForm();
|
155 |
-
}
|
156 |
-
|
157 |
-
/**
|
158 |
-
* Prepare label for tab
|
159 |
-
*
|
160 |
-
* @return string
|
161 |
-
*/
|
162 |
-
public function getTabLabel()
|
163 |
-
{
|
164 |
-
return Mage::helper('cms')->__('Main');
|
165 |
-
}
|
166 |
-
|
167 |
-
/**
|
168 |
-
* Prepare title for tab
|
169 |
-
*
|
170 |
-
* @return string
|
171 |
-
*/
|
172 |
-
public function getTabTitle()
|
173 |
-
{
|
174 |
-
return Mage::helper('cms')->__('Main');
|
175 |
-
}
|
176 |
-
|
177 |
-
/**
|
178 |
-
* Returns status flag about this tab can be shown or not
|
179 |
-
*
|
180 |
-
* @return true
|
181 |
-
*/
|
182 |
-
public function canShowTab()
|
183 |
-
{
|
184 |
-
return true;
|
185 |
-
}
|
186 |
-
|
187 |
-
/**
|
188 |
-
* Returns status flag about this tab hidden or not
|
189 |
-
*
|
190 |
-
* @return true
|
191 |
-
*/
|
192 |
-
public function isHidden()
|
193 |
-
{
|
194 |
-
return false;
|
195 |
-
}
|
196 |
-
|
197 |
-
/**
|
198 |
-
* Check permission for passed action
|
199 |
-
*
|
200 |
-
* @param string $action
|
201 |
-
* @return bool
|
202 |
-
*/
|
203 |
-
/*protected function _isAllowedAction($action)
|
204 |
-
{
|
205 |
-
return Mage::getSingleton('admin/session')->isAllowed('tmcore/module/' . $action);
|
206 |
-
}*/
|
207 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Block/Adminhtml/Support/Edit/Tabs.php
DELETED
@@ -1,12 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Block_Adminhtml_Support_Edit_Tabs extends Mage_Adminhtml_Block_Widget_Tabs
|
4 |
-
{
|
5 |
-
public function __construct()
|
6 |
-
{
|
7 |
-
parent::__construct();
|
8 |
-
$this->setId('support_tabs');
|
9 |
-
$this->setDestElementId('edit_form');
|
10 |
-
$this->setTitle(Mage::helper('tmcore')->__('Support Ticket'));
|
11 |
-
}
|
12 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Block/Adminhtml/Support/List.php
DELETED
@@ -1,12 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Block_Adminhtml_Support_List extends Mage_Adminhtml_Block_Widget_Grid_Container
|
4 |
-
{
|
5 |
-
public function __construct()
|
6 |
-
{
|
7 |
-
$this->_controller = 'adminhtml_support_list';
|
8 |
-
$this->_blockGroup = 'tmcore';
|
9 |
-
$this->_headerText = Mage::helper('tmcore')->__('Reports');
|
10 |
-
parent::__construct();
|
11 |
-
}
|
12 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Block/Adminhtml/Support/List/Grid.php
DELETED
@@ -1,203 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Block_Adminhtml_Support_List_Grid extends Mage_Adminhtml_Block_Widget_Grid
|
4 |
-
{
|
5 |
-
public function __construct()
|
6 |
-
{
|
7 |
-
parent::__construct();
|
8 |
-
$this->setId('supportGrid');
|
9 |
-
$this->setDefaultSort('modified_at');
|
10 |
-
$this->setDefaultDir('ASC');
|
11 |
-
$this->setSaveParametersInSession(true);
|
12 |
-
}
|
13 |
-
|
14 |
-
protected function _prepareCollection()
|
15 |
-
{
|
16 |
-
$collection = Mage::registry('tmcore_support_collection');
|
17 |
-
// Zend_Debug::dump($collection->getFirstItem());
|
18 |
-
if ($collection instanceof Varien_Data_Collection) {
|
19 |
-
$this->setCollection($collection);
|
20 |
-
}
|
21 |
-
|
22 |
-
return parent::_prepareCollection();
|
23 |
-
}
|
24 |
-
|
25 |
-
protected function _prepareColumns()
|
26 |
-
{
|
27 |
-
|
28 |
-
$model = Mage::registry('tmcore_support');
|
29 |
-
|
30 |
-
$this->addColumn('id', array(
|
31 |
-
'header' => Mage::helper('helpmate')->__('ID'),
|
32 |
-
'align' => 'right',
|
33 |
-
'width' => '50px',
|
34 |
-
'index' => 'id',
|
35 |
-
'type' => 'number',
|
36 |
-
// 'filter_condition_callback' => array($this, '_filterId'),
|
37 |
-
));
|
38 |
-
|
39 |
-
$this->addColumn('text', array(
|
40 |
-
'header' => Mage::helper('helpmate')->__('Title'),
|
41 |
-
'align' => 'left',
|
42 |
-
'index' => 'title',
|
43 |
-
// 'filter_condition_callback' => array($this, '_filterTitle'),
|
44 |
-
));
|
45 |
-
|
46 |
-
$this->addColumn('user_name', array(
|
47 |
-
'header' => Mage::helper('helpmate')->__('Assigned'),
|
48 |
-
'align' => 'left',
|
49 |
-
'index' => 'user_name',
|
50 |
-
// 'filter_condition_callback' => array($this, '_filterUserName'),
|
51 |
-
));
|
52 |
-
|
53 |
-
$dapertments = array();
|
54 |
-
if ($model->getDepartmets() instanceof Varien_Data_Collection) {
|
55 |
-
$dapertments = $model->getDepartmets()->toOptionHash();
|
56 |
-
}
|
57 |
-
$this->addColumn('department', array(
|
58 |
-
'header' => Mage::helper('helpmate')->__('Department'),
|
59 |
-
'align' => 'left',
|
60 |
-
'index' => 'department_id',
|
61 |
-
'type' => 'options',
|
62 |
-
'options' => $dapertments,
|
63 |
-
// 'filter_condition_callback' => array($this, '_filterDepartamentId'),
|
64 |
-
));
|
65 |
-
|
66 |
-
$priorities = array();
|
67 |
-
if ($model->getPriorities() instanceof Varien_Data_Collection) {
|
68 |
-
$priorities = $model->getPriorities()->toOptionHash();
|
69 |
-
}
|
70 |
-
$this->addColumn('priority', array(
|
71 |
-
'header' => Mage::helper('helpmate')->__('Priority'),
|
72 |
-
'align' => 'left',
|
73 |
-
'width' => '80px',
|
74 |
-
'index' => 'priority',
|
75 |
-
'type' => 'options',
|
76 |
-
'options' => $priorities,
|
77 |
-
'frame_callback' => array($this, 'decorateStatus'),
|
78 |
-
// 'filter_condition_callback' => array($this, '_filterPriority'),
|
79 |
-
));
|
80 |
-
|
81 |
-
$statuses = array();
|
82 |
-
if ($model->getStatuses() instanceof Varien_Data_Collection) {
|
83 |
-
$statuses = $model->getStatuses()->toOptionHash();
|
84 |
-
}
|
85 |
-
$this->addColumn('status', array(
|
86 |
-
'header' => Mage::helper('helpmate')->__('Status'),
|
87 |
-
'align' => 'left',
|
88 |
-
'width' => '80px',
|
89 |
-
'index' => 'status',
|
90 |
-
'type' => 'options',
|
91 |
-
'options' => $statuses,
|
92 |
-
// 'filter_condition_callback' => array($this, '_filterStatus'),
|
93 |
-
));
|
94 |
-
|
95 |
-
$this->addColumn('created_at', array(
|
96 |
-
'header' => Mage::helper('helpmate')->__('Created date'),
|
97 |
-
'align' => 'left',
|
98 |
-
'type' => 'datetime',
|
99 |
-
'width' => '100px',
|
100 |
-
// 'filter_index' => 'rt.created_at',
|
101 |
-
'index' => 'created_at',
|
102 |
-
// 'filter' => false
|
103 |
-
));
|
104 |
-
|
105 |
-
$this->addColumn('modified_at', array(
|
106 |
-
'header' => Mage::helper('helpmate')->__('Modified date'),
|
107 |
-
'align' => 'left',
|
108 |
-
'type' => 'datetime',
|
109 |
-
'width' => '100px',
|
110 |
-
'index' => 'modified_at',
|
111 |
-
// 'filter' => false
|
112 |
-
));
|
113 |
-
|
114 |
-
$this->addExportType('*/*/exportCsv', Mage::helper('helpmate')->__('CSV'));
|
115 |
-
$this->addExportType('*/*/exportXml', Mage::helper('helpmate')->__('XML'));
|
116 |
-
|
117 |
-
return parent::_prepareColumns();
|
118 |
-
}
|
119 |
-
|
120 |
-
public function getRowUrl($row)
|
121 |
-
{
|
122 |
-
return $this->getUrl('*/*/edit', array('ticket_id' => $row->getId()));
|
123 |
-
}
|
124 |
-
|
125 |
-
/**
|
126 |
-
* Decorate status column values
|
127 |
-
*
|
128 |
-
* @return string
|
129 |
-
*/
|
130 |
-
public function decorateStatus($value, $row, $column, $isExport)
|
131 |
-
{
|
132 |
-
$_classes = array('unknown', 'notice', 'minor', 'major', 'critical' , 'critical');
|
133 |
-
$_class = isset($_classes[$row->priority]) ? $_classes[$row->priority] : 'unknown';
|
134 |
-
|
135 |
-
return "<span class=\"grid-severity-{$_class}\"><span>{$value}</span></span>";
|
136 |
-
}
|
137 |
-
|
138 |
-
protected function _filterId($collection, $column)
|
139 |
-
{
|
140 |
-
$value = $column->getFilter()->getValue();
|
141 |
-
// $collection->addFilter('department_id', $value);
|
142 |
-
foreach ($collection as $item) {
|
143 |
-
if ($item->id < $value['from'] || $item->id > $value['to']) {
|
144 |
-
$collection->removeItemByKey($item->id);
|
145 |
-
}
|
146 |
-
}
|
147 |
-
}
|
148 |
-
|
149 |
-
protected function _filterTitle($collection, $column)
|
150 |
-
{
|
151 |
-
$value = $column->getFilter()->getValue();
|
152 |
-
// $collection->addFilter('department_id', $value);
|
153 |
-
foreach ($collection as $item) {
|
154 |
-
if (false === strpos($item->title, $value)) {
|
155 |
-
$collection->removeItemByKey($item->id);
|
156 |
-
}
|
157 |
-
}
|
158 |
-
}
|
159 |
-
|
160 |
-
protected function _filterUserName($collection, $column)
|
161 |
-
{
|
162 |
-
$value = $column->getFilter()->getValue();
|
163 |
-
// $collection->addFilter('department_id', $value);
|
164 |
-
foreach ($collection as $item) {
|
165 |
-
if (false === strpos($item->user_name, $value)) {
|
166 |
-
$collection->removeItemByKey($item->id);
|
167 |
-
}
|
168 |
-
}
|
169 |
-
}
|
170 |
-
|
171 |
-
protected function _filterDepartamentId($collection, $column)
|
172 |
-
{
|
173 |
-
$value = $column->getFilter()->getValue();
|
174 |
-
// $collection->addFilter('department_id', $value);
|
175 |
-
foreach ($collection as $item) {
|
176 |
-
if ($item->department_id != $value) {
|
177 |
-
$collection->removeItemByKey($item->id);
|
178 |
-
}
|
179 |
-
}
|
180 |
-
}
|
181 |
-
|
182 |
-
protected function _filterPriority($collection, $column)
|
183 |
-
{
|
184 |
-
$value = $column->getFilter()->getValue();
|
185 |
-
// $collection->addFilter('department_id', $value);
|
186 |
-
foreach ($collection as $item) {
|
187 |
-
if ($item->priority != $value) {
|
188 |
-
$collection->removeItemByKey($item->id);
|
189 |
-
}
|
190 |
-
}
|
191 |
-
}
|
192 |
-
|
193 |
-
protected function _filterStatus($collection, $column)
|
194 |
-
{
|
195 |
-
$value = $column->getFilter()->getValue();
|
196 |
-
// $collection->addFilter('department_id', $value);
|
197 |
-
foreach ($collection as $item) {
|
198 |
-
if ($item->status != $value) {
|
199 |
-
$collection->removeItemByKey($item->id);
|
200 |
-
}
|
201 |
-
}
|
202 |
-
}
|
203 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Block/Adminhtml/System/Config/Form/Field/Notification.php
DELETED
@@ -1,11 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Block_Adminhtml_System_Config_Form_Field_Notification extends Mage_Adminhtml_Block_System_Config_Form_Field
|
4 |
-
{
|
5 |
-
protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element)
|
6 |
-
{
|
7 |
-
$element->setValue(Mage::app()->loadCache('tmcore_notifications_lastcheck'));
|
8 |
-
$format = Mage::app()->getLocale()->getDateTimeFormat(Mage_Core_Model_Locale::FORMAT_TYPE_MEDIUM);
|
9 |
-
return Mage::app()->getLocale()->date(intval($element->getValue()))->toString($format);
|
10 |
-
}
|
11 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Block/Adminhtml/System/Config/Form/Field/Size.php
DELETED
@@ -1,23 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Block_Adminhtml_System_Config_Form_Field_Size
|
4 |
-
extends Mage_Adminhtml_Block_System_Config_Form_Field
|
5 |
-
{
|
6 |
-
protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element)
|
7 |
-
{
|
8 |
-
$element->setStyle('width:70px;')
|
9 |
-
->setName($element->getName() . '[]');
|
10 |
-
|
11 |
-
if ($element->getValue()) {
|
12 |
-
$values = explode(',', $element->getValue());
|
13 |
-
} else {
|
14 |
-
$values = array();
|
15 |
-
}
|
16 |
-
|
17 |
-
$width = $element->setValue(isset($values[0]) ? $values[0] : null)->getElementHtml();
|
18 |
-
$height = $element->setValue(isset($values[1]) ? $values[1] : null)->getElementHtml();
|
19 |
-
return Mage::helper('sales')->__('Width') . ' ' . $width
|
20 |
-
. ' '
|
21 |
-
. Mage::helper('sales')->__('Height') . ' ' . $height;
|
22 |
-
}
|
23 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Block/Adminhtml/System/Config/Form/Fieldset/Modules/List.php
DELETED
@@ -1,46 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Block_Adminhtml_System_Config_Form_Fieldset_Modules_List
|
4 |
-
extends Mage_Adminhtml_Block_System_Config_Form_Fieldset
|
5 |
-
{
|
6 |
-
public function render(Varien_Data_Form_Element_Abstract $element)
|
7 |
-
{
|
8 |
-
$html = $this->_getHeaderHtml($element);
|
9 |
-
$modules = Mage::getConfig()->getNode('modules')->children();
|
10 |
-
$linkTitle = Mage::helper('tmcore')->__('Open Extension Page');
|
11 |
-
foreach ($modules as $moduleName => $values) {
|
12 |
-
if (0 !== strpos($moduleName, 'TM_')) {
|
13 |
-
continue;
|
14 |
-
}
|
15 |
-
|
16 |
-
if ($values->tm_link) {
|
17 |
-
if (@is_readable(MAGENTO_ROOT . '/lib/Varien/Data/Form/Element/Link.php')) {
|
18 |
-
$field = $element->addField($moduleName, 'link', array(
|
19 |
-
'label' => $moduleName,
|
20 |
-
'value' => (string) $values->version,
|
21 |
-
'href' => (string) $values->tm_link,
|
22 |
-
'onclick' => 'window.open(this.href); return false;',
|
23 |
-
'title' => $linkTitle
|
24 |
-
));
|
25 |
-
} else {
|
26 |
-
$link = (string) $values->tm_link;
|
27 |
-
$moduleName = "<a href='{$link}' onclick='window.open(this.href); return false;' title='{$linkTitle}'>{$moduleName}</a>";
|
28 |
-
|
29 |
-
$field = $element->addField($moduleName, 'label', array(
|
30 |
-
'label' => $moduleName,
|
31 |
-
'value' => (string) $values->version
|
32 |
-
));
|
33 |
-
}
|
34 |
-
} else {
|
35 |
-
$field = $element->addField($moduleName, 'label', array(
|
36 |
-
'label' => $moduleName,
|
37 |
-
'value' => (string) $values->version
|
38 |
-
));
|
39 |
-
}
|
40 |
-
$html .= $field->toHtml();
|
41 |
-
}
|
42 |
-
$html .= $this->_getFooterHtml($element);
|
43 |
-
|
44 |
-
return $html;
|
45 |
-
}
|
46 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Block/Adminhtml/System/Config/Form/Fieldset/Troubleshooting.php
DELETED
@@ -1,13 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Block_Adminhtml_System_Config_Form_Fieldset_Troubleshooting
|
4 |
-
extends Mage_Adminhtml_Block_System_Config_Form_Fieldset
|
5 |
-
{
|
6 |
-
public function render(Varien_Data_Form_Element_Abstract $element)
|
7 |
-
{
|
8 |
-
$html = $this->_getHeaderHtml($element);
|
9 |
-
$html .= Mage::helper('tmcore')->__(Mage::getStoreConfig('tmcore/troubleshooting/text'));
|
10 |
-
$html .= $this->_getFooterHtml($element);
|
11 |
-
return $html;
|
12 |
-
}
|
13 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Block/Adminhtml/Widget/Form/Element/Wysiwyg.php
DELETED
@@ -1,47 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Block_Adminhtml_Widget_Form_Element_Wysiwyg extends Varien_Data_Form_Element_Textarea
|
4 |
-
{
|
5 |
-
/**
|
6 |
-
* Retrieve additional html and put it at the end of element html
|
7 |
-
*
|
8 |
-
* @return string
|
9 |
-
*/
|
10 |
-
public function getAfterElementHtml()
|
11 |
-
{
|
12 |
-
$html = parent::getAfterElementHtml();
|
13 |
-
if ($this->getIsWysiwygEnabled()) {
|
14 |
-
$disabled = ($this->getDisabled() || $this->getReadonly());
|
15 |
-
$html .= Mage::getSingleton('core/layout')
|
16 |
-
->createBlock('adminhtml/widget_button', '', array(
|
17 |
-
'label' => Mage::helper('catalog')->__('WYSIWYG Editor'),
|
18 |
-
'type' => 'button',
|
19 |
-
'disabled' => $disabled,
|
20 |
-
'class' => /*($disabled) ? 'disabled btn-wysiwyg' : */'btn-wysiwyg',
|
21 |
-
'onclick' => 'catalogWysiwygEditor.open(\''.Mage::helper('adminhtml')->getUrl('*/*/wysiwyg').'\', \''.$this->getHtmlId().'\')'
|
22 |
-
))->toHtml();
|
23 |
-
}
|
24 |
-
return $html;
|
25 |
-
}
|
26 |
-
|
27 |
-
/**
|
28 |
-
* Check whether wysiwyg enabled or not
|
29 |
-
*
|
30 |
-
* @return boolean
|
31 |
-
*/
|
32 |
-
public function getIsWysiwygEnabled()
|
33 |
-
{
|
34 |
-
$helper = Mage::helper('catalog');
|
35 |
-
|
36 |
-
if (method_exists($helper, 'isModuleEnabled')) {
|
37 |
-
if (Mage::helper('catalog')->isModuleEnabled('Mage_Cms')) {
|
38 |
-
return (bool)(Mage::getSingleton('cms/wysiwyg_config')->isEnabled());
|
39 |
-
}
|
40 |
-
} else {
|
41 |
-
return (bool)(Mage::getSingleton('cms/wysiwyg_config')->isEnabled()); // Magento 1401-1420
|
42 |
-
}
|
43 |
-
|
44 |
-
return false;
|
45 |
-
}
|
46 |
-
}
|
47 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Block/Adminhtml/Widget/Form/Element/Wysiwyg/Content.php
DELETED
@@ -1,35 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Block_Adminhtml_Widget_Form_Element_Wysiwyg_Content
|
4 |
-
extends Mage_Adminhtml_Block_Widget_Form
|
5 |
-
{
|
6 |
-
/**
|
7 |
-
* Modified Mage_Adminhtml_Block_Catalog_Helper_Form_Wysiwyg_Content to allow to use widgets
|
8 |
-
*
|
9 |
-
* @return Mage_Adminhtml_Block_Catalog_Helper_Form_Wysiwyg_Content
|
10 |
-
*/
|
11 |
-
protected function _prepareForm()
|
12 |
-
{
|
13 |
-
$form = new Varien_Data_Form(array('id' => 'wysiwyg_edit_form', 'action' => $this->getData('action'), 'method' => 'post'));
|
14 |
-
|
15 |
-
$config['document_base_url'] = $this->getData('store_media_url');
|
16 |
-
$config['store_id'] = $this->getData('store_id');
|
17 |
-
$config['add_variables'] = true;
|
18 |
-
$config['add_widgets'] = true;
|
19 |
-
$config['add_directives'] = true;
|
20 |
-
$config['use_container'] = true;
|
21 |
-
$config['container_class'] = 'hor-scroll';
|
22 |
-
// $config['enabled'] = true;
|
23 |
-
// $config['hidden'] = true; // widget popup doesn't works if wysiwyg is visible by default
|
24 |
-
|
25 |
-
$form->addField($this->getData('editor_element_id'), 'editor', array(
|
26 |
-
'name' => 'content',
|
27 |
-
'style' => 'width:725px;height:460px',
|
28 |
-
'required' => true,
|
29 |
-
'force_load' => true,
|
30 |
-
'config' => Mage::getSingleton('cms/wysiwyg_config')->getConfig($config)
|
31 |
-
));
|
32 |
-
$this->setForm($form);
|
33 |
-
return parent::_prepareForm();
|
34 |
-
}
|
35 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Block/Adminhtml/Widget/Form/Renderer/Wysiwyg.php
DELETED
@@ -1,13 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Block_Adminhtml_Widget_Form_Renderer_Wysiwyg
|
4 |
-
extends Mage_Adminhtml_Block_Widget_Form_Renderer_Fieldset_Element
|
5 |
-
{
|
6 |
-
public function render(Varien_Data_Form_Element_Abstract $element)
|
7 |
-
{
|
8 |
-
$editor = new TM_Core_Block_Adminhtml_Widget_Form_Element_Wysiwyg($element->getData());
|
9 |
-
$editor->setId($element->getId());
|
10 |
-
$editor->setForm($element->getForm());
|
11 |
-
return parent::render($editor);
|
12 |
-
}
|
13 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Block/Cms/Block.php
DELETED
@@ -1,19 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Rewrite Mage_Cms_Block_Block class to prevent CMS Static blocks from caching.
|
4 |
-
* TM Themes and Extensions use static blocks to output dynamic data.
|
5 |
-
*/
|
6 |
-
class TM_Core_Block_Cms_Block extends Mage_Cms_Block_Block
|
7 |
-
{
|
8 |
-
/**
|
9 |
-
* No cache for CMS blocks
|
10 |
-
*
|
11 |
-
* @return null
|
12 |
-
*/
|
13 |
-
protected function _construct()
|
14 |
-
{
|
15 |
-
parent::_construct();
|
16 |
-
$this->unsCacheTags();
|
17 |
-
$this->unsCacheLifetime();
|
18 |
-
}
|
19 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Helper/Data.php
DELETED
@@ -1,10 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Helper_Data extends Mage_Core_Helper_Abstract
|
4 |
-
{
|
5 |
-
public function isDesignPackageEquals($packageName)
|
6 |
-
{
|
7 |
-
$package = Mage::getSingleton('core/design_package');
|
8 |
-
return $package->getPackageName() === $packageName;
|
9 |
-
}
|
10 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Helper/Debug.php
DELETED
@@ -1,29 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Helper_Debug extends Mage_Core_Helper_Abstract
|
4 |
-
{
|
5 |
-
const POPUP_NAME = 'tmcore_debug_popup';
|
6 |
-
|
7 |
-
public function preparePopup($text, $title = 'Debug Information')
|
8 |
-
{
|
9 |
-
$helper = Mage::helper('core');
|
10 |
-
|
11 |
-
Mage::app()->getLayout()
|
12 |
-
->createBlock('core/text')
|
13 |
-
->setNameInLayout(self::POPUP_NAME)
|
14 |
-
->setText(
|
15 |
-
'<div id="'.self::POPUP_NAME.'" style="display:none">'
|
16 |
-
. '<pre>'
|
17 |
-
. $helper->escapeHtml($text)
|
18 |
-
. '</pre>'
|
19 |
-
. '</div>'
|
20 |
-
);
|
21 |
-
|
22 |
-
$title = $helper->escapeHtml($title);
|
23 |
-
return sprintf(
|
24 |
-
"<a href='#' onclick=\"%s\">%s</a>",
|
25 |
-
"tmcoreWindow.update($('".self::POPUP_NAME."').innerHTML, '{$title}').show()",
|
26 |
-
Mage::helper('tmcore')->__('Show response')
|
27 |
-
);
|
28 |
-
}
|
29 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Model/Adminhtml/System/Config/Source/Notification/Channel.php
DELETED
@@ -1,33 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Model_Adminhtml_System_Config_Source_Notification_Channel
|
4 |
-
{
|
5 |
-
const CHANNEL_INSTALLED = 'installed';
|
6 |
-
const CHANNEL_PROMO = 'promo';
|
7 |
-
const CHANNEL_RELEASE = 'release';
|
8 |
-
const CHANNEL_UPDATE = 'update';
|
9 |
-
const CHANNEL_OTHER = 'other';
|
10 |
-
|
11 |
-
protected $_labels = array(
|
12 |
-
self::CHANNEL_INSTALLED => 'Installed products', // must be first item
|
13 |
-
// @see TM_Notifier_Block_Adminhtml_Message_Edit_Form~45
|
14 |
-
// unset($channels[0]);
|
15 |
-
self::CHANNEL_PROMO => 'Product promotions and discounts',
|
16 |
-
self::CHANNEL_RELEASE => 'New Products',
|
17 |
-
self::CHANNEL_UPDATE => 'Product updates',
|
18 |
-
self::CHANNEL_OTHER => 'Other'
|
19 |
-
);
|
20 |
-
|
21 |
-
public function toOptionArray()
|
22 |
-
{
|
23 |
-
$filters = array();
|
24 |
-
$helper = Mage::helper('core');
|
25 |
-
foreach ($this->_labels as $value => $label) {
|
26 |
-
$filters[] = array(
|
27 |
-
'value' => $value,
|
28 |
-
'label' => $helper->__($label)
|
29 |
-
);
|
30 |
-
}
|
31 |
-
return $filters;
|
32 |
-
}
|
33 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Model/Module.php
DELETED
@@ -1,461 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Model_Module extends Mage_Core_Model_Abstract
|
4 |
-
{
|
5 |
-
const VERSION_UPDATED = 1;
|
6 |
-
const VERSION_OUTDATED = 2; // new upgrades are avaialble
|
7 |
-
const VERSION_DEPRECATED = 3; // new version is avaialble but now uploaded
|
8 |
-
|
9 |
-
const XML_USE_HTTPS_PATH = 'tmcore/license/use_https';
|
10 |
-
const XML_VALIDATE_URL_PATH = 'tmcore/license/url';
|
11 |
-
|
12 |
-
/**
|
13 |
-
* @var TM_Core_Model_Module_ErrorLogger
|
14 |
-
*/
|
15 |
-
protected static $_messageLogger = null;
|
16 |
-
|
17 |
-
/**
|
18 |
-
* Retrieve Severity collection array
|
19 |
-
*
|
20 |
-
* @return array|string
|
21 |
-
*/
|
22 |
-
public function getVersionStatuses($status = null)
|
23 |
-
{
|
24 |
-
$versionStatuses = array(
|
25 |
-
self::VERSION_UPDATED => Mage::helper('tmcore')->__('updated'),
|
26 |
-
self::VERSION_OUTDATED => Mage::helper('tmcore')->__('outdated'),
|
27 |
-
self::VERSION_DEPRECATED => Mage::helper('tmcore')->__('deprecated')
|
28 |
-
);
|
29 |
-
|
30 |
-
if (!is_null($status)) {
|
31 |
-
if (isset($versionStatuses[$status])) {
|
32 |
-
return $versionStatuses[$status];
|
33 |
-
}
|
34 |
-
return null;
|
35 |
-
}
|
36 |
-
|
37 |
-
return $versionStatuses;
|
38 |
-
}
|
39 |
-
|
40 |
-
protected function _construct()
|
41 |
-
{
|
42 |
-
$this->_init('tmcore/module');
|
43 |
-
}
|
44 |
-
|
45 |
-
public function load($id, $field=null)
|
46 |
-
{
|
47 |
-
parent::load($id, $field);
|
48 |
-
|
49 |
-
$xml = Mage::getConfig()->getNode('modules/' . $id);
|
50 |
-
$this->setId($id);
|
51 |
-
$this->setDepends(array());
|
52 |
-
if ($xml) {
|
53 |
-
$data = $xml->asCanonicalArray();
|
54 |
-
if (isset($data['depends']) && is_array($data['depends'])) {
|
55 |
-
$data['depends'] = array_keys($data['depends']);
|
56 |
-
} else {
|
57 |
-
$data['depends'] = array();
|
58 |
-
}
|
59 |
-
$this->addData($data);
|
60 |
-
}
|
61 |
-
|
62 |
-
return $this;
|
63 |
-
}
|
64 |
-
|
65 |
-
/**
|
66 |
-
* Merge new_store_ids and store_ids arrays
|
67 |
-
*
|
68 |
-
* @return Mage_Core_Model_Abstract
|
69 |
-
*/
|
70 |
-
protected function _beforeSave()
|
71 |
-
{
|
72 |
-
$oldStores = $this->getOldStores();
|
73 |
-
$newStores = $this->getNewStoreIds();
|
74 |
-
if (is_array($newStores)) {
|
75 |
-
$stores = array_merge($oldStores, $newStores);
|
76 |
-
$this->setStoreIds(implode(',', array_unique($stores)));
|
77 |
-
}
|
78 |
-
return parent::_beforeSave();
|
79 |
-
}
|
80 |
-
|
81 |
-
/**
|
82 |
-
* Retrieve module remote information
|
83 |
-
*
|
84 |
-
* @return Varien_Object
|
85 |
-
*/
|
86 |
-
public function getRemote()
|
87 |
-
{
|
88 |
-
if (null === $this->getData('remote')) {
|
89 |
-
$remote = Mage::getResourceModel('tmcore/module_remoteCollection')
|
90 |
-
->getItemById($this->getId());
|
91 |
-
|
92 |
-
$this->setData('remote', $remote);
|
93 |
-
}
|
94 |
-
return $this->getData('remote');
|
95 |
-
}
|
96 |
-
|
97 |
-
/**
|
98 |
-
* Retreive is validation required flag.
|
99 |
-
* True, if remote has identity_key_link
|
100 |
-
*
|
101 |
-
* @return boolean
|
102 |
-
*/
|
103 |
-
public function isValidationRequired()
|
104 |
-
{
|
105 |
-
return $this->getRemote() && $this->getRemote()->getIdentityKeyLink();
|
106 |
-
}
|
107 |
-
|
108 |
-
/**
|
109 |
-
* Validates module license
|
110 |
-
*
|
111 |
-
* @return true|array Response
|
112 |
-
* <pre>
|
113 |
-
* error : error_message[optional]
|
114 |
-
* success: true|false
|
115 |
-
* </pre>
|
116 |
-
*/
|
117 |
-
public function validateLicense()
|
118 |
-
{
|
119 |
-
if (!$this->isValidationRequired()) {
|
120 |
-
return true;
|
121 |
-
}
|
122 |
-
|
123 |
-
$key = trim($this->getIdentityKey());
|
124 |
-
if (empty($key)) {
|
125 |
-
return array('error' => array('Identity key is required'));
|
126 |
-
}
|
127 |
-
|
128 |
-
// key format is: encoded_site:secret_key:optional_suffix
|
129 |
-
$parts = explode(':', $key);
|
130 |
-
if (count($parts) < 3) {
|
131 |
-
return array('error' => array('Identity key is not valid'));
|
132 |
-
}
|
133 |
-
list($site, $secret, $suffix) = explode(':', $key);
|
134 |
-
|
135 |
-
// @todo implement cached response storage
|
136 |
-
try {
|
137 |
-
$client = new Zend_Http_Client();
|
138 |
-
$adapter = new Zend_Http_Client_Adapter_Curl();
|
139 |
-
$client->setAdapter($adapter);
|
140 |
-
$client->setUri($this->_getValidateUri($site));
|
141 |
-
$client->setConfig(array('maxredirects'=>5, 'timeout'=>30));
|
142 |
-
$client->setParameterGet('key', $secret);
|
143 |
-
$client->setParameterGet('suffix', $suffix);
|
144 |
-
$module = $this->getTmPurchaseCode() ? $this->getTmPurchaseCode() : $this->getCode();
|
145 |
-
$client->setParameterGet('module', $module);
|
146 |
-
$client->setParameterGet('module_code', $this->getCode());
|
147 |
-
if ($this->getConfigSection()) {
|
148 |
-
$client->setParameterGet('config_section', $this->getConfigSection());
|
149 |
-
}
|
150 |
-
$client->setParameterGet('domain', Mage::app()->getRequest()->getHttpHost());
|
151 |
-
$response = $client->request();
|
152 |
-
$responseBody = $response->getBody();
|
153 |
-
} catch (Exception $e) {
|
154 |
-
return array('error' => array(
|
155 |
-
'Response error: %s',
|
156 |
-
$e->getMessage()
|
157 |
-
));
|
158 |
-
}
|
159 |
-
|
160 |
-
return $this->_parseResponse($responseBody);
|
161 |
-
}
|
162 |
-
|
163 |
-
/**
|
164 |
-
* Parse server response
|
165 |
-
*
|
166 |
-
* @param string $response
|
167 |
-
* <pre>
|
168 |
-
* "{success: true}" or "{error: error_message}"
|
169 |
-
* </pre>
|
170 |
-
*/
|
171 |
-
protected function _parseResponse($response)
|
172 |
-
{
|
173 |
-
try {
|
174 |
-
$result = Mage::helper('core')->jsonDecode($response);
|
175 |
-
if (!is_array($result)) {
|
176 |
-
throw new Exception('Decoding failed');
|
177 |
-
}
|
178 |
-
} catch (Exception $e) {
|
179 |
-
$result = array(
|
180 |
-
'error' => array(
|
181 |
-
'Sorry, try again in five minutes. Validation response parsing error: %s',
|
182 |
-
$e->getMessage()
|
183 |
-
),
|
184 |
-
'response' => $response
|
185 |
-
);
|
186 |
-
}
|
187 |
-
return $result;
|
188 |
-
}
|
189 |
-
|
190 |
-
/**
|
191 |
-
* Retrieve validation url according to the encoded $site
|
192 |
-
*
|
193 |
-
* @param string $site Base64 encoded site url [example.com]
|
194 |
-
*/
|
195 |
-
protected function _getValidateUri($site)
|
196 |
-
{
|
197 |
-
$site = base64_decode($site);
|
198 |
-
return (Mage::getStoreConfigFlag(self::XML_USE_HTTPS_PATH) ? 'https://' : 'http://')
|
199 |
-
. rtrim($site, '/ ')
|
200 |
-
. Mage::getStoreConfig(self::XML_VALIDATE_URL_PATH);
|
201 |
-
}
|
202 |
-
|
203 |
-
|
204 |
-
/**
|
205 |
-
* Set the stores, where the module should be installed or reinstalled
|
206 |
-
*
|
207 |
-
* @param array $ids
|
208 |
-
* @return TM_Core_Model_Module
|
209 |
-
*/
|
210 |
-
public function setNewStores(array $ids)
|
211 |
-
{
|
212 |
-
$this->setData('new_store_ids', array_unique($ids));
|
213 |
-
return $this;
|
214 |
-
}
|
215 |
-
|
216 |
-
/**
|
217 |
-
* Retieve store ids, where the module is already installed
|
218 |
-
*
|
219 |
-
* @return array
|
220 |
-
*/
|
221 |
-
public function getOldStores()
|
222 |
-
{
|
223 |
-
$ids = $this->getStoreIds();
|
224 |
-
if (null === $ids || '' === $ids) {
|
225 |
-
return array();
|
226 |
-
}
|
227 |
-
if (!is_array($ids)) {
|
228 |
-
$ids = explode(',', $ids);
|
229 |
-
}
|
230 |
-
return $ids;
|
231 |
-
}
|
232 |
-
|
233 |
-
/**
|
234 |
-
* Retieve store ids, where the module is already installed
|
235 |
-
*
|
236 |
-
* @return array
|
237 |
-
*/
|
238 |
-
public function getStores()
|
239 |
-
{
|
240 |
-
return $this->getOldStores();
|
241 |
-
}
|
242 |
-
|
243 |
-
/**
|
244 |
-
* Retrieve store ids to install module on
|
245 |
-
*
|
246 |
-
* @return array
|
247 |
-
*/
|
248 |
-
public function getNewStores()
|
249 |
-
{
|
250 |
-
return $this->getNewStoreIds();
|
251 |
-
}
|
252 |
-
|
253 |
-
public function isInstalled()
|
254 |
-
{
|
255 |
-
return false;// we always can install the extension to the new stores
|
256 |
-
}
|
257 |
-
|
258 |
-
/**
|
259 |
-
* Checks is the upgrades directory is exists in the module
|
260 |
-
*
|
261 |
-
* @return boolean
|
262 |
-
*/
|
263 |
-
public function hasUpgradesDir()
|
264 |
-
{
|
265 |
-
return is_readable($this->getUpgradesPath());
|
266 |
-
}
|
267 |
-
|
268 |
-
/**
|
269 |
-
* Retrieve the list of not installed upgrade filenames
|
270 |
-
* sorted by version_compare.
|
271 |
-
* The list could be filtered with optional from and to parameters.
|
272 |
-
* These parameters are usefull, when the module is installed and new upgrades
|
273 |
-
* are available
|
274 |
-
*
|
275 |
-
* @param string $from
|
276 |
-
* @return array
|
277 |
-
*/
|
278 |
-
public function getUpgradesToRun($from = null)
|
279 |
-
{
|
280 |
-
if (null === $from) {
|
281 |
-
$from = $this->getDataVersion();
|
282 |
-
}
|
283 |
-
|
284 |
-
$upgrades = array();
|
285 |
-
foreach ($this->getUpgrades() as $upgradeVersion) {
|
286 |
-
if (version_compare($from, $upgradeVersion) >= 0) {
|
287 |
-
continue;
|
288 |
-
}
|
289 |
-
$upgrades[] = $upgradeVersion;
|
290 |
-
}
|
291 |
-
|
292 |
-
return $upgrades;
|
293 |
-
}
|
294 |
-
|
295 |
-
/**
|
296 |
-
* Retrive the list of all module upgrade filenames
|
297 |
-
* sorted by version_compare
|
298 |
-
*
|
299 |
-
* @return array
|
300 |
-
*/
|
301 |
-
public function getUpgrades()
|
302 |
-
{
|
303 |
-
$upgrades = $this->getData('upgrades');
|
304 |
-
if (is_array($upgrades)) {
|
305 |
-
return $upgrades;
|
306 |
-
}
|
307 |
-
|
308 |
-
try {
|
309 |
-
$dir = $this->getUpgradesPath();
|
310 |
-
if (!is_readable($dir)) {
|
311 |
-
return array();
|
312 |
-
}
|
313 |
-
$dir = new DirectoryIterator($dir);
|
314 |
-
} catch (Exception $e) {
|
315 |
-
// module doesn't has upgrades
|
316 |
-
return array();
|
317 |
-
}
|
318 |
-
|
319 |
-
$upgrades = array();
|
320 |
-
foreach ($dir as $file) {
|
321 |
-
$file = $file->getFilename();
|
322 |
-
if (false === strstr($file, '.php')) {
|
323 |
-
continue;
|
324 |
-
}
|
325 |
-
$upgrades[] = substr($file, 0, -4);
|
326 |
-
}
|
327 |
-
usort($upgrades, 'version_compare');
|
328 |
-
$this->setData('upgrades', $upgrades);
|
329 |
-
return $upgrades;
|
330 |
-
}
|
331 |
-
|
332 |
-
/**
|
333 |
-
* Run the module upgrades. Depends run first.
|
334 |
-
*
|
335 |
-
* @return void
|
336 |
-
*/
|
337 |
-
public function up()
|
338 |
-
{
|
339 |
-
$oldStores = $this->getOldStores(); // update to newest data_version
|
340 |
-
$newStores = $this->getNewStores(); // run all upgrade files
|
341 |
-
if (!count($oldStores) && !count($newStores)) {
|
342 |
-
return;
|
343 |
-
}
|
344 |
-
|
345 |
-
foreach ($this->getDepends() as $moduleCode) {
|
346 |
-
if (0 !== strpos($moduleCode, 'TM_')) {
|
347 |
-
continue;
|
348 |
-
}
|
349 |
-
$this->_getModuleObject($moduleCode)->up();
|
350 |
-
}
|
351 |
-
$saved = false;
|
352 |
-
|
353 |
-
// upgrade currently installed version to the latest data_version
|
354 |
-
if (count($oldStores)) {
|
355 |
-
foreach ($this->getUpgradesToRun() as $version) {
|
356 |
-
// customer able to skip upgrading data of installed modules
|
357 |
-
if (!$this->getSkipUpgrade()) {
|
358 |
-
$this->getUpgradeObject($version)
|
359 |
-
->setStoreIds($oldStores)
|
360 |
-
->upgrade();
|
361 |
-
}
|
362 |
-
$this->setDataVersion($version)->save();
|
363 |
-
$saved = true;
|
364 |
-
}
|
365 |
-
}
|
366 |
-
|
367 |
-
// install module to the new stores
|
368 |
-
if (count($newStores)) {
|
369 |
-
foreach ($this->getUpgradesToRun(0) as $version) {
|
370 |
-
$this->getUpgradeObject($version)
|
371 |
-
->setStoreIds($newStores)
|
372 |
-
->upgrade();
|
373 |
-
$this->setDataVersion($version)->save();
|
374 |
-
$saved = true;
|
375 |
-
}
|
376 |
-
}
|
377 |
-
|
378 |
-
if (!$saved) {
|
379 |
-
$this->save(); // identity key could be updated without running the upgrades
|
380 |
-
}
|
381 |
-
}
|
382 |
-
|
383 |
-
/**
|
384 |
-
* Retrieve singleton instance of error logger, used in upgrade file
|
385 |
-
* to write errors and module controller to read them.
|
386 |
-
*
|
387 |
-
* @return TM_Core_Model_Module_MessageLogger
|
388 |
-
*/
|
389 |
-
public function getMessageLogger()
|
390 |
-
{
|
391 |
-
if (null === self::$_messageLogger) {
|
392 |
-
self::$_messageLogger = Mage::getSingleton('tmcore/module_messageLogger');
|
393 |
-
}
|
394 |
-
return self::$_messageLogger;
|
395 |
-
}
|
396 |
-
|
397 |
-
/**
|
398 |
-
* Retrieve upgrade class name from version string:
|
399 |
-
* 1.0.0 => ModuleCode_Upgrade_1_0_0
|
400 |
-
*
|
401 |
-
* @param string $version
|
402 |
-
* @return string Class name
|
403 |
-
*/
|
404 |
-
protected function _getUpgradeClassName($version)
|
405 |
-
{
|
406 |
-
$version = ucwords(preg_replace("/\W+/", " ", $version));
|
407 |
-
$version = str_replace(' ', '_', $version);
|
408 |
-
return $this->getId() . '_Upgrade_' . $version;
|
409 |
-
}
|
410 |
-
|
411 |
-
/**
|
412 |
-
* Returns upgrade class instance by given version
|
413 |
-
*
|
414 |
-
* @param string $version
|
415 |
-
* @return TM_Core_Model_Module_Upgrade
|
416 |
-
*/
|
417 |
-
public function getUpgradeObject($version)
|
418 |
-
{
|
419 |
-
require_once $this->getUpgradesPath() . "/{$version}.php";
|
420 |
-
$className = $this->_getUpgradeClassName($version);
|
421 |
-
$upgrade = new $className();
|
422 |
-
$upgrade->setModule($this);
|
423 |
-
return $upgrade;
|
424 |
-
}
|
425 |
-
|
426 |
-
/**
|
427 |
-
* Retrieve module upgrade directory
|
428 |
-
*
|
429 |
-
* @return string
|
430 |
-
*/
|
431 |
-
public function getUpgradesPath()
|
432 |
-
{
|
433 |
-
return Mage::getBaseDir('code')
|
434 |
-
. DS
|
435 |
-
. $this->_getData('codePool')
|
436 |
-
. DS
|
437 |
-
. uc_words($this->getId(), DS)
|
438 |
-
. DS
|
439 |
-
. 'upgrades';
|
440 |
-
}
|
441 |
-
|
442 |
-
/**
|
443 |
-
* Returns loded module object with copied new_store_ids and skip_upgrade
|
444 |
-
* instructions into it
|
445 |
-
*
|
446 |
-
* @return TM_Core_Model_Module
|
447 |
-
*/
|
448 |
-
protected function _getModuleObject($code)
|
449 |
-
{
|
450 |
-
$module = Mage::getModel('tmcore/module')->load($code)
|
451 |
-
->setNewStores($this->getNewStores())
|
452 |
-
->setSkipUpgrade($this->getSkipUpgrade());
|
453 |
-
|
454 |
-
if (!$module->getIdentityKey()) {
|
455 |
-
// dependent modules will have the same license if not exists
|
456 |
-
$module->setIdentityKey($this->getIdentityKey());
|
457 |
-
}
|
458 |
-
|
459 |
-
return $module;
|
460 |
-
}
|
461 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Model/Module/MessageLogger.php
DELETED
@@ -1,56 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Model_Module_MessageLogger
|
4 |
-
{
|
5 |
-
protected $_messages = array(
|
6 |
-
'errors' => array(),
|
7 |
-
'notices' => array(),
|
8 |
-
'success' => array()
|
9 |
-
);
|
10 |
-
|
11 |
-
/**
|
12 |
-
* @param string $type
|
13 |
-
* @param mixed $error array or string with error message
|
14 |
-
* <pre>
|
15 |
-
* message required
|
16 |
-
* trace optional
|
17 |
-
* </pre>
|
18 |
-
*/
|
19 |
-
public function addError($type, $error)
|
20 |
-
{
|
21 |
-
$this->_messages['errors'][$type][] = $error;
|
22 |
-
}
|
23 |
-
|
24 |
-
public function getErrors()
|
25 |
-
{
|
26 |
-
return $this->_messages['errors'];
|
27 |
-
}
|
28 |
-
|
29 |
-
/**
|
30 |
-
* @param string $type
|
31 |
-
* @param string $notice
|
32 |
-
*/
|
33 |
-
public function addNotice($type, $notice)
|
34 |
-
{
|
35 |
-
$this->_messages['notices'][$type][] = $notice;
|
36 |
-
}
|
37 |
-
|
38 |
-
public function getNotices()
|
39 |
-
{
|
40 |
-
return $this->_messages['notices'];
|
41 |
-
}
|
42 |
-
|
43 |
-
/**
|
44 |
-
* @param string $type
|
45 |
-
* @param string $notice
|
46 |
-
*/
|
47 |
-
public function addSuccess($type, $success)
|
48 |
-
{
|
49 |
-
$this->_messages['success'][$type][] = $notice;
|
50 |
-
}
|
51 |
-
|
52 |
-
public function getSuccess()
|
53 |
-
{
|
54 |
-
return $this->_messages['success'];
|
55 |
-
}
|
56 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Model/Module/Upgrade.php
DELETED
@@ -1,942 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
abstract class TM_Core_Model_Module_Upgrade extends Varien_Object
|
4 |
-
{
|
5 |
-
/**
|
6 |
-
* @var array Store ids, where the module will be installed
|
7 |
-
*/
|
8 |
-
protected $_storeIds = array();
|
9 |
-
|
10 |
-
/**
|
11 |
-
* @var array Store instances
|
12 |
-
*/
|
13 |
-
protected static $_stores = array();
|
14 |
-
|
15 |
-
/**
|
16 |
-
* Used to guarantee unique backup names in case of duplicate name and date
|
17 |
-
*
|
18 |
-
* @var int
|
19 |
-
*/
|
20 |
-
protected static $_backupIterator = 0;
|
21 |
-
|
22 |
-
/**
|
23 |
-
* Additional operations could be done from this method
|
24 |
-
*/
|
25 |
-
public function up(){}
|
26 |
-
|
27 |
-
/**
|
28 |
-
* Retrieve the list of operation to be done,
|
29 |
-
* including module depends.
|
30 |
-
*
|
31 |
-
* Supported operations:
|
32 |
-
* configuration @see runConfiguration
|
33 |
-
* cmsblock @see runCmsblock
|
34 |
-
* cmspage @see runCmspage
|
35 |
-
* easyslide @see runEasyslide
|
36 |
-
* easybanner @see runEasybanner
|
37 |
-
* prolabels @see runProlabels
|
38 |
-
* productAttribute @see runProductAttribute
|
39 |
-
*
|
40 |
-
* @return array
|
41 |
-
*/
|
42 |
-
public function getOperations()
|
43 |
-
{
|
44 |
-
return array();
|
45 |
-
}
|
46 |
-
|
47 |
-
/**
|
48 |
-
* Set store ids to run the upgrade on
|
49 |
-
*
|
50 |
-
* @return TM_Core_Model_Module_Upgrade
|
51 |
-
*/
|
52 |
-
public function setStoreIds(array $ids)
|
53 |
-
{
|
54 |
-
if (Mage::app()->isSingleStoreMode()) {
|
55 |
-
$this->_storeIds = array(Mage::app()->getStore(true)->getId());
|
56 |
-
} else {
|
57 |
-
$this->_storeIds = $ids;
|
58 |
-
}
|
59 |
-
return $this;
|
60 |
-
}
|
61 |
-
|
62 |
-
/**
|
63 |
-
* Retrieve store ids
|
64 |
-
*
|
65 |
-
* @return array
|
66 |
-
*/
|
67 |
-
public function getStoreIds()
|
68 |
-
{
|
69 |
-
return $this->_storeIds;
|
70 |
-
}
|
71 |
-
|
72 |
-
public function upgrade()
|
73 |
-
{
|
74 |
-
foreach ($this->getOperations() as $operation => $instructions) {
|
75 |
-
$method = 'run' . ucfirst($operation);
|
76 |
-
if (method_exists($this, $method)) {
|
77 |
-
$this->$method($instructions);
|
78 |
-
}
|
79 |
-
}
|
80 |
-
$this->up();
|
81 |
-
}
|
82 |
-
|
83 |
-
/**
|
84 |
-
* @param array $mapping key=>value pairs of old and new path
|
85 |
-
* @return void
|
86 |
-
*/
|
87 |
-
public function renameConfigPath($mapping)
|
88 |
-
{
|
89 |
-
$table = Mage::getResourceModel('core/config_data')->getMainTable();
|
90 |
-
$adapter = Mage::getModel('core/resource')
|
91 |
-
->getConnection(Mage_Core_Model_Resource::DEFAULT_WRITE_RESOURCE);
|
92 |
-
|
93 |
-
$newPaths = array_values($mapping);
|
94 |
-
$collection = Mage::getResourceModel('core/config_data_collection');
|
95 |
-
$collection->addFieldToFilter('path', array('in' => $newPaths))
|
96 |
-
->load();
|
97 |
-
|
98 |
-
$adapter->beginTransaction();
|
99 |
-
try {
|
100 |
-
foreach ($mapping as $oldPath => $newPath) {
|
101 |
-
if ($collection->getItemByColumnValue('path', $newPath)) {
|
102 |
-
continue;
|
103 |
-
}
|
104 |
-
$adapter->exec(
|
105 |
-
"UPDATE `$table` SET path='{$newPath}' WHERE path='{$oldPath}'"
|
106 |
-
);
|
107 |
-
}
|
108 |
-
$adapter->commit();
|
109 |
-
} catch (Exception $e) {
|
110 |
-
$adapter->rollBack();
|
111 |
-
throw $e;
|
112 |
-
}
|
113 |
-
}
|
114 |
-
|
115 |
-
/**
|
116 |
-
* @param array $data
|
117 |
-
* <pre>
|
118 |
-
* section/group/field => value,
|
119 |
-
* section/group => array(
|
120 |
-
* field => value,
|
121 |
-
* field => value
|
122 |
-
* )
|
123 |
-
* section => array(
|
124 |
-
* group/field => value,
|
125 |
-
* group => array(
|
126 |
-
* field => value
|
127 |
-
* )
|
128 |
-
* )
|
129 |
-
* </pre>
|
130 |
-
*/
|
131 |
-
public function runConfiguration($data)
|
132 |
-
{
|
133 |
-
$fieldsToAppendValue = array(
|
134 |
-
'design/head/includes'
|
135 |
-
);
|
136 |
-
|
137 |
-
// transform data format to splitted into sections, groups and fields:
|
138 |
-
// section => array(
|
139 |
-
// group => array(
|
140 |
-
// field => value
|
141 |
-
// field => value
|
142 |
-
// )
|
143 |
-
// group => ...
|
144 |
-
// )
|
145 |
-
$sections = array();
|
146 |
-
foreach ($data as $path => $values) {
|
147 |
-
$pathParts = explode('/', $path);
|
148 |
-
$pathCount = count($pathParts);
|
149 |
-
switch ($pathCount) {
|
150 |
-
case 3:
|
151 |
-
$sections[$pathParts[0]][$pathParts[1]][$pathParts[2]] = $values;
|
152 |
-
break;
|
153 |
-
case 2:
|
154 |
-
foreach ($values as $field => $value) {
|
155 |
-
$sections[$pathParts[0]][$pathParts[1]][$field] = $value;
|
156 |
-
}
|
157 |
-
break;
|
158 |
-
case 1:
|
159 |
-
foreach ($values as $group => $fields) {
|
160 |
-
$groupParts = explode('/', $group);
|
161 |
-
$groupCount = count($groupParts);
|
162 |
-
if (2 === $groupCount) {
|
163 |
-
$sections[$pathParts[0]][$groupParts[0]][$groupParts[1]] = $fields;
|
164 |
-
} else {
|
165 |
-
foreach ($fields as $field => $value) {
|
166 |
-
$sections[$pathParts[0]][$groupParts[0]][$field] = $value;
|
167 |
-
}
|
168 |
-
}
|
169 |
-
}
|
170 |
-
break;
|
171 |
-
}
|
172 |
-
}
|
173 |
-
|
174 |
-
foreach ($sections as $section => $values) {
|
175 |
-
// transform fields array to magento config format:
|
176 |
-
// general => array
|
177 |
-
// fields => array
|
178 |
-
// enabled => array
|
179 |
-
// value => 1
|
180 |
-
// load => array
|
181 |
-
// value => 1
|
182 |
-
$groups = array();
|
183 |
-
foreach ($values as $key => $fields) {
|
184 |
-
foreach ($fields as $field => $value) {
|
185 |
-
$groups[$key]['fields'][$field]['value'] = $value;
|
186 |
-
}
|
187 |
-
}
|
188 |
-
|
189 |
-
foreach ($this->getStoreIds() as $storeId) {
|
190 |
-
if (!$storeId) { // all stores selected
|
191 |
-
$website = null;
|
192 |
-
$store = null;
|
193 |
-
} else {
|
194 |
-
if (!$this->_getStore($storeId)->getId()) {
|
195 |
-
continue;
|
196 |
-
}
|
197 |
-
$website = $this->_getStore($storeId)->getWebsite()->getCode();
|
198 |
-
$store = $this->_getStore($storeId)->getCode();
|
199 |
-
}
|
200 |
-
|
201 |
-
// get old values of required fields and combine old and new value
|
202 |
-
// foreach ($values as $key => $fields) {
|
203 |
-
// foreach ($fields as $field => $value) {
|
204 |
-
// $path = implode('/', array($section, $key, $field));
|
205 |
-
// if (in_array($path, $fieldsToAppendValue)) {
|
206 |
-
// $oldValue = Mage::getStoreConfig($path, $store);
|
207 |
-
// $groups[$key]['fields'][$field]['value'] .= "\n" . $oldValue;
|
208 |
-
// }
|
209 |
-
// }
|
210 |
-
// }
|
211 |
-
|
212 |
-
try {
|
213 |
-
Mage::getModel('adminhtml/config_data')
|
214 |
-
->setSection($section)
|
215 |
-
->setWebsite($website)
|
216 |
-
->setStore($store)
|
217 |
-
->setGroups($groups)
|
218 |
-
->save();
|
219 |
-
} catch (Exception $e) {
|
220 |
-
$this->_fault('configuration_save', $e);
|
221 |
-
}
|
222 |
-
}
|
223 |
-
}
|
224 |
-
}
|
225 |
-
|
226 |
-
/**
|
227 |
-
* Backup existing blocks if needed and create the required blocks.
|
228 |
-
*
|
229 |
-
* @param array $data
|
230 |
-
* <pre>
|
231 |
-
* header_links => array
|
232 |
-
* title => title,
|
233 |
-
* identifier => identifier,
|
234 |
-
* status => 1,
|
235 |
-
* content => content
|
236 |
-
* </pre>
|
237 |
-
*/
|
238 |
-
public function runCmsblock($data)
|
239 |
-
{
|
240 |
-
$isSingleStore = Mage::app()->isSingleStoreMode();
|
241 |
-
foreach ($data as $blockData) {
|
242 |
-
// backup existing similar blocks
|
243 |
-
$collection = Mage::getModel('cms/block')->getCollection()
|
244 |
-
->addFilter('identifier', $blockData['identifier']);
|
245 |
-
|
246 |
-
if (!$isSingleStore) {
|
247 |
-
$collection->addStoreFilter($this->getStoreIds());
|
248 |
-
}
|
249 |
-
|
250 |
-
foreach ($collection as $block) {
|
251 |
-
$block->load($block->getId()); // load stores
|
252 |
-
$storesToLeave = array_diff($block->getStores(), $this->getStoreIds());
|
253 |
-
if (count($storesToLeave) && !$isSingleStore) {
|
254 |
-
$block->setStores($storesToLeave);
|
255 |
-
} else {
|
256 |
-
$block->setIsActive(0)
|
257 |
-
->setIdentifier($this->_getUniqueString($block->getIdentifier()));
|
258 |
-
}
|
259 |
-
|
260 |
-
try {
|
261 |
-
$block->save();
|
262 |
-
} catch (Exception $e) {
|
263 |
-
$this->_fault('cmsblock_backup', $e);
|
264 |
-
}
|
265 |
-
|
266 |
-
}
|
267 |
-
|
268 |
-
try {
|
269 |
-
// create required block
|
270 |
-
Mage::getModel('cms/block')
|
271 |
-
->setData($blockData)
|
272 |
-
->setStores($this->getStoreIds())
|
273 |
-
->save();
|
274 |
-
} catch (Exception $e) {
|
275 |
-
$this->_fault('cmsblock_save', $e);
|
276 |
-
}
|
277 |
-
}
|
278 |
-
}
|
279 |
-
|
280 |
-
/**
|
281 |
-
* Backup existing pages if needed and create the required pages.
|
282 |
-
*
|
283 |
-
* @param array $data
|
284 |
-
* <pre>
|
285 |
-
* homepage => array
|
286 |
-
* title
|
287 |
-
* root_template
|
288 |
-
* meta_keywords
|
289 |
-
* meta_description
|
290 |
-
* identifier
|
291 |
-
* content_heading
|
292 |
-
* content
|
293 |
-
* is_active
|
294 |
-
* sort_order
|
295 |
-
* layout_update_xml
|
296 |
-
* </pre>
|
297 |
-
*/
|
298 |
-
public function runCmspage($data)
|
299 |
-
{
|
300 |
-
$isSingleStore = Mage::app()->isSingleStoreMode();
|
301 |
-
foreach ($data as $pageData) {
|
302 |
-
// backup existing similar blocks
|
303 |
-
$collection = Mage::getModel('cms/page')->getCollection()
|
304 |
-
->addFilter('identifier', $pageData['identifier']);
|
305 |
-
|
306 |
-
if (!$isSingleStore) {
|
307 |
-
$collection->addStoreFilter($this->getStoreIds());
|
308 |
-
}
|
309 |
-
|
310 |
-
foreach ($collection as $page) {
|
311 |
-
$page->load($page->getId()); // load stores
|
312 |
-
$storesToLeave = array_diff($page->getStoreId(), $this->getStoreIds());
|
313 |
-
if (count($storesToLeave) && !$isSingleStore) {
|
314 |
-
$page->setStores($storesToLeave);
|
315 |
-
} else {
|
316 |
-
$page->setIsActive(0)
|
317 |
-
->setIdentifier($this->_getUniqueString($page->getIdentifier()));
|
318 |
-
}
|
319 |
-
|
320 |
-
try {
|
321 |
-
$page->save();
|
322 |
-
} catch (Exception $e) {
|
323 |
-
$this->_fault('cmspage_backup', $e);
|
324 |
-
}
|
325 |
-
}
|
326 |
-
|
327 |
-
try {
|
328 |
-
// create required page
|
329 |
-
Mage::getModel('cms/page')
|
330 |
-
->setData($pageData)
|
331 |
-
->setStores($this->getStoreIds())
|
332 |
-
->save();
|
333 |
-
} catch (Exception $e) {
|
334 |
-
$this->_fault('cmspage_save', $e);
|
335 |
-
}
|
336 |
-
}
|
337 |
-
}
|
338 |
-
|
339 |
-
/**
|
340 |
-
* If placeholder with the same name already exists - skip and
|
341 |
-
* add banners to existing placeholder
|
342 |
-
* If banner already exists - backup before inserting new one.
|
343 |
-
*
|
344 |
-
* @param array $data
|
345 |
-
* <pre>
|
346 |
-
* name
|
347 |
-
* parent_block
|
348 |
-
* position
|
349 |
-
* status
|
350 |
-
* limit
|
351 |
-
* mode
|
352 |
-
* banner_offset
|
353 |
-
* sort_mode
|
354 |
-
* banners => array(
|
355 |
-
* array(
|
356 |
-
* identifier
|
357 |
-
* sort_order
|
358 |
-
* title
|
359 |
-
* url
|
360 |
-
* image
|
361 |
-
* html
|
362 |
-
* status
|
363 |
-
* mode
|
364 |
-
* target
|
365 |
-
* hide_url
|
366 |
-
* conditions_serialized
|
367 |
-
* )
|
368 |
-
* )
|
369 |
-
* </pre>
|
370 |
-
*/
|
371 |
-
public function runEasybanner($data)
|
372 |
-
{
|
373 |
-
$placeholderDefaults = array(
|
374 |
-
'position' => '',
|
375 |
-
'status' => 1,
|
376 |
-
'limit' => 1,
|
377 |
-
'mode' => 'rotator',
|
378 |
-
'banner_offset' => 1,
|
379 |
-
'sort_mode' => 'sort_order'
|
380 |
-
);
|
381 |
-
$bannerDefaults = array(
|
382 |
-
'sort_order' => 10,
|
383 |
-
'html' => '',
|
384 |
-
'status' => 1,
|
385 |
-
'mode' => 'image',
|
386 |
-
'target' => 'popup',
|
387 |
-
'hide_url' => 0
|
388 |
-
);
|
389 |
-
$isSingleStore = Mage::app()->isSingleStoreMode();
|
390 |
-
foreach ($data as $placeholderData) {
|
391 |
-
$placeholder = Mage::getModel('easybanner/placeholder');
|
392 |
-
if (!empty($placeholderData['name'])) {
|
393 |
-
$placeholder->load($placeholderData['name'], 'name');
|
394 |
-
if (!$placeholder->getId()) {
|
395 |
-
try {
|
396 |
-
$placeholder
|
397 |
-
->setData(array_merge($placeholderDefaults, $placeholderData))
|
398 |
-
->save();
|
399 |
-
} catch (Exception $e) {
|
400 |
-
$this->_fault('easybanner_placeholder_save', $e);
|
401 |
-
}
|
402 |
-
}
|
403 |
-
}
|
404 |
-
|
405 |
-
$bannerDefaults['sort_order'] = 10;
|
406 |
-
foreach ($placeholderData['banners'] as $bannerData) {
|
407 |
-
if (!empty($bannerData['sort_order'])) {
|
408 |
-
$bannerDefaults['sort_order'] = $bannerData['sort_order'];
|
409 |
-
}
|
410 |
-
|
411 |
-
// backup existing similar banners
|
412 |
-
$collection = Mage::getModel('easybanner/banner')->getCollection()
|
413 |
-
->addFilter('identifier', $bannerData['identifier']);
|
414 |
-
|
415 |
-
foreach ($collection as $banner) {
|
416 |
-
$storesToLeave = array_diff($banner->getStoreIds(), $this->getStoreIds());
|
417 |
-
$banner->getPlaceholderIds(); // we should load placeholders, because they will cleared in _AfterSave method
|
418 |
-
if (count($storesToLeave) && !$isSingleStore) {
|
419 |
-
$banner->setStoreIds($storesToLeave);
|
420 |
-
} else {
|
421 |
-
$banner->setStatus(0)
|
422 |
-
->setIdentifier($this->_getUniqueString($banner->getIdentifier()));
|
423 |
-
}
|
424 |
-
|
425 |
-
try {
|
426 |
-
$banner->save();
|
427 |
-
} catch (Exception $e) {
|
428 |
-
$this->_fault('easybanner_banner_backup', $e);
|
429 |
-
}
|
430 |
-
}
|
431 |
-
|
432 |
-
// create required banner
|
433 |
-
$banner = Mage::getModel('easybanner/banner')
|
434 |
-
->setData(array_merge($bannerDefaults, $bannerData))
|
435 |
-
->setStoreIds($this->getStoreIds());
|
436 |
-
|
437 |
-
if ($placeholder->getId()) {
|
438 |
-
$banner->setPlaceholderIds(array($placeholder->getId()));
|
439 |
-
}
|
440 |
-
|
441 |
-
try {
|
442 |
-
$banner->save();
|
443 |
-
} catch (Exception $e) {
|
444 |
-
$this->_fault('easybanner_banner_save', $e);
|
445 |
-
}
|
446 |
-
|
447 |
-
$bannerDefaults['sort_order'] += 5;
|
448 |
-
}
|
449 |
-
}
|
450 |
-
}
|
451 |
-
|
452 |
-
/**
|
453 |
-
* If slider already exists - skip adding.
|
454 |
-
*
|
455 |
-
* @param $data
|
456 |
-
* <pre>
|
457 |
-
* array(
|
458 |
-
* array(
|
459 |
-
* identifier
|
460 |
-
* title
|
461 |
-
* width
|
462 |
-
* height
|
463 |
-
* duration
|
464 |
-
* frequency
|
465 |
-
* autoglide
|
466 |
-
* controls_type
|
467 |
-
* status
|
468 |
-
* slides => array(
|
469 |
-
* array(
|
470 |
-
* url
|
471 |
-
* image
|
472 |
-
* description
|
473 |
-
* ),
|
474 |
-
* ...
|
475 |
-
* )
|
476 |
-
* ),
|
477 |
-
* ...
|
478 |
-
* )
|
479 |
-
* </pre>
|
480 |
-
*/
|
481 |
-
public function runEasyslide($data)
|
482 |
-
{
|
483 |
-
$now = Mage::getSingleton('core/date')->gmtDate();
|
484 |
-
foreach ($data as $sliderData) {
|
485 |
-
$slider = Mage::getModel('easyslide/easyslide')
|
486 |
-
->load($sliderData['identifier']);
|
487 |
-
if ($slider->getId()) {
|
488 |
-
continue;
|
489 |
-
}
|
490 |
-
|
491 |
-
$slider = Mage::getModel('easyslide/easyslide');
|
492 |
-
$sliderData['created_time'] = $now;
|
493 |
-
$sliderData['modified_time'] = $now;
|
494 |
-
|
495 |
-
$slideDefaults = array(
|
496 |
-
'is_enabled' => 1,
|
497 |
-
'target' => '/',
|
498 |
-
'description' => '',
|
499 |
-
'sort_order' => 10
|
500 |
-
);
|
501 |
-
foreach ($sliderData['slides'] as &$slide) {
|
502 |
-
if (!empty($slide['sort_order'])) {
|
503 |
-
$slideDefaults['sort_order'] = $slide['sort_order'];
|
504 |
-
}
|
505 |
-
|
506 |
-
$slide = array_merge($slideDefaults, $slide);
|
507 |
-
$slideDefaults['sort_order'] += 10;
|
508 |
-
}
|
509 |
-
|
510 |
-
try {
|
511 |
-
$slider->setData($sliderData)->save();
|
512 |
-
} catch (Exception $e) {
|
513 |
-
$this->_fault('easyslide_save', $e);
|
514 |
-
}
|
515 |
-
}
|
516 |
-
}
|
517 |
-
|
518 |
-
/**
|
519 |
-
* Unset easytabs from storeIds
|
520 |
-
*
|
521 |
-
* @param string $type
|
522 |
-
* @param array $storeIdsToRemove
|
523 |
-
* @return void
|
524 |
-
*/
|
525 |
-
public function unsetEasytab($type, $storeIdsToRemove)
|
526 |
-
{
|
527 |
-
$isSingleStore = Mage::app()->isSingleStoreMode();
|
528 |
-
|
529 |
-
$storeIdsToRemove[] = 0;
|
530 |
-
$storesToKeep = Mage::getResourceModel('core/store_collection')->getAllIds();
|
531 |
-
$storesToKeep = array_diff($storesToKeep, $storeIdsToRemove);
|
532 |
-
|
533 |
-
$relatedTabs = Mage::getModel('easytabs/config_collection');
|
534 |
-
$relatedTabs->addFieldToFilter('block', $type);
|
535 |
-
foreach ($relatedTabs as $relatedTab) {
|
536 |
-
if ($isSingleStore) {
|
537 |
-
$relatedTab->setStatus(0);
|
538 |
-
} else {
|
539 |
-
$stores = $relatedTab->getStoreId();
|
540 |
-
$stores = array_diff($stores, array(0));
|
541 |
-
if (!$stores) { // tab was assigned to all stores
|
542 |
-
$relatedTab->setStoreId($storesToKeep);
|
543 |
-
} else {
|
544 |
-
if (!array_diff($stores, $storesToKeep)) {
|
545 |
-
// tab is not assigned to storesToRemove
|
546 |
-
continue;
|
547 |
-
}
|
548 |
-
$keep = array_intersect($stores, $storesToKeep);
|
549 |
-
if ($keep) {
|
550 |
-
$relatedTab->setStoreId($keep);
|
551 |
-
} else {
|
552 |
-
$relatedTab->setStatus(0);
|
553 |
-
}
|
554 |
-
}
|
555 |
-
}
|
556 |
-
$relatedTab->save();
|
557 |
-
}
|
558 |
-
}
|
559 |
-
|
560 |
-
/**
|
561 |
-
* Backup and create new tabs
|
562 |
-
* Alias is used as idendifier
|
563 |
-
*
|
564 |
-
* @param array $data
|
565 |
-
* <pre>
|
566 |
-
* title
|
567 |
-
* alias
|
568 |
-
* block
|
569 |
-
* template
|
570 |
-
* custom_option
|
571 |
-
* unset
|
572 |
-
* sort_order
|
573 |
-
* status
|
574 |
-
* store_id
|
575 |
-
* </pre>
|
576 |
-
* @return void
|
577 |
-
*/
|
578 |
-
public function runEasytabs($data)
|
579 |
-
{
|
580 |
-
$existing = Mage::getModel('easytabs/config')->getCollection();
|
581 |
-
$isSingleStore = Mage::app()->isSingleStoreMode();
|
582 |
-
|
583 |
-
foreach ($data as $tabData) {
|
584 |
-
$tab = Mage::getModel('easytabs/config');
|
585 |
-
$tab->setStoreId($this->getStoreIds());
|
586 |
-
|
587 |
-
// backup existing tab with the same alias
|
588 |
-
if (!empty($tabData['alias'])) {
|
589 |
-
$tmp = $existing->getItemsByColumnValue('alias', $tabData['alias']);
|
590 |
-
foreach ($tmp as $tmbTab) {
|
591 |
-
if (!$tmbTab->getStatus()) {
|
592 |
-
continue;
|
593 |
-
}
|
594 |
-
$storesToLeave = array_diff($tmbTab->getStoreId(), $this->getStoreIds());
|
595 |
-
if (count($storesToLeave) && !$isSingleStore) {
|
596 |
-
$tmbTab->setStoreId($storesToLeave);
|
597 |
-
} else {
|
598 |
-
$tmbTab->setStatus(0)
|
599 |
-
->setAlias($this->_getUniqueString($tmbTab->getAlias()));
|
600 |
-
}
|
601 |
-
|
602 |
-
try {
|
603 |
-
$tmbTab->save();
|
604 |
-
} catch (Exception $e) {
|
605 |
-
$this->_fault('easytabs_backup', $e);
|
606 |
-
continue;
|
607 |
-
}
|
608 |
-
}
|
609 |
-
}
|
610 |
-
|
611 |
-
if ('easytabs/tab_cms' === $tabData['block']
|
612 |
-
&& !is_numeric($tabData['custom_option'])) {
|
613 |
-
|
614 |
-
// get cms block identifier
|
615 |
-
$collection = Mage::getModel('cms/block')
|
616 |
-
->getCollection()
|
617 |
-
->addStoreFilter($this->getStoreIds())
|
618 |
-
->addFieldToFilter('identifier', $tabData['custom_option']);
|
619 |
-
|
620 |
-
if (!$isSingleStore) {
|
621 |
-
$collection->addStoreFilter($this->getStoreIds());
|
622 |
-
}
|
623 |
-
$cmsBlock = $collection->getFirstItem();
|
624 |
-
|
625 |
-
if (!$cmsBlock->getId()) {
|
626 |
-
continue;
|
627 |
-
}
|
628 |
-
$tabData['custom_option'] = $cmsBlock->getId();
|
629 |
-
}
|
630 |
-
|
631 |
-
$tab->addData($tabData)->save();
|
632 |
-
}
|
633 |
-
}
|
634 |
-
|
635 |
-
/**
|
636 |
-
* Backup and create new labels
|
637 |
-
*
|
638 |
-
* @param array $data
|
639 |
-
* <pre>
|
640 |
-
* type [optional][manual|new|sale|stock]
|
641 |
-
* label_status
|
642 |
-
* system_label_name
|
643 |
-
* l_status
|
644 |
-
* product_position
|
645 |
-
* product_image
|
646 |
-
* product_round_method
|
647 |
-
* category_position
|
648 |
-
* category_image
|
649 |
-
* category_round_method
|
650 |
-
* </pre>
|
651 |
-
*/
|
652 |
-
public function runProlabels($data)
|
653 |
-
{
|
654 |
-
$typeMapping = array(
|
655 |
-
'sale' => 1,
|
656 |
-
'stock' => 2,
|
657 |
-
'new' => 3
|
658 |
-
);
|
659 |
-
$isSingleStore = Mage::app()->isSingleStoreMode();
|
660 |
-
foreach ($data as $labelData) {
|
661 |
-
if (!empty($labelData['type']) && isset($typeMapping[$labelData['type']])) {
|
662 |
-
Mage::getModel('prolabels/label')->load($typeMapping[$labelData['type']])
|
663 |
-
->addData(array(
|
664 |
-
'label_status' => isset($labelData['label_status']) ?
|
665 |
-
$labelData['label_status'] : 1
|
666 |
-
))
|
667 |
-
->save();
|
668 |
-
|
669 |
-
$system = true;
|
670 |
-
$modelType = 'prolabels/system';
|
671 |
-
$collection = Mage::getModel($modelType)->getCollection()
|
672 |
-
->addFilter('main_table.rules_id', $typeMapping[$labelData['type']])
|
673 |
-
->addStoreFilter($this->getStoreIds());
|
674 |
-
} else {
|
675 |
-
$system = false;
|
676 |
-
$modelType = 'prolabels/label';
|
677 |
-
$collection = Mage::getModel($modelType)->getCollection()
|
678 |
-
->addFilter('main_table.label_name', $labelData['label_name'])
|
679 |
-
->addFilter('main_table.system_label <> 1')
|
680 |
-
->addStoreFilter($this->getStoreIds());
|
681 |
-
}
|
682 |
-
|
683 |
-
foreach ($collection as $label) {
|
684 |
-
$label->load($label->getId()); // load stores
|
685 |
-
$storesToLeave = array_diff($label->getStoreId(), $this->getStoreIds());
|
686 |
-
if (count($storesToLeave) && !$isSingleStore) {
|
687 |
-
$label->setStores($storesToLeave) // @todo _afterSave for system label
|
688 |
-
->setStoreIds($storesToLeave);
|
689 |
-
} else {
|
690 |
-
$label->setLabelStatus(0)
|
691 |
-
->setLabelName($this->_getUniqueString($label->getLabelName()))
|
692 |
-
->setLStatus(0)
|
693 |
-
->setSystemLabelName($this->_getUniqueString($label->getSystemLabelName()));
|
694 |
-
}
|
695 |
-
|
696 |
-
try {
|
697 |
-
$label->save();
|
698 |
-
} catch (Exception $e) {
|
699 |
-
$this->_fault('prolabels_label_backup', $e);
|
700 |
-
continue;
|
701 |
-
}
|
702 |
-
|
703 |
-
if ($system) {
|
704 |
-
Mage::getModel('prolabels/sysstore')->deleteSystemStore($label->getId());
|
705 |
-
foreach ($storesToLeave as $store) {
|
706 |
-
$storeM = Mage::getModel('prolabels/sysstore');
|
707 |
-
$storeM->addData(array('store_id' => $store));
|
708 |
-
$storeM->addData(array('system_id' => $label->getId()));
|
709 |
-
$storeM->addData(array('rules_id' => $label->getRulesId()));
|
710 |
-
try {
|
711 |
-
$storeM->save();
|
712 |
-
} catch (Exception $e) {
|
713 |
-
$this->_fault('prolabels_sysstore_backup', $e);
|
714 |
-
}
|
715 |
-
}
|
716 |
-
}
|
717 |
-
}
|
718 |
-
|
719 |
-
// create required label
|
720 |
-
$label = Mage::getModel($modelType)
|
721 |
-
->setData($labelData);
|
722 |
-
|
723 |
-
if (!empty($labelData['type']) && isset($typeMapping[$labelData['type']])) {
|
724 |
-
$label->setRulesId($typeMapping[$labelData['type']]);
|
725 |
-
}
|
726 |
-
$label->setStores($this->getStoreIds()) // @todo _afterSave for system label
|
727 |
-
->setStoreIds($this->getStoreIds());
|
728 |
-
|
729 |
-
try {
|
730 |
-
$label->save();
|
731 |
-
} catch (Exception $e) {
|
732 |
-
$this->_fault('prolabels_label_save', $e);
|
733 |
-
continue;
|
734 |
-
}
|
735 |
-
|
736 |
-
if ($system) {
|
737 |
-
foreach ($this->getStoreIds() as $store) {
|
738 |
-
$storeM = Mage::getModel('prolabels/sysstore');
|
739 |
-
$storeM->addData(array('store_id' => $store));
|
740 |
-
$storeM->addData(array('system_id' => $label->getId()));
|
741 |
-
$storeM->addData(array('rules_id' => $label->getRulesId()));
|
742 |
-
try {
|
743 |
-
$storeM->save();
|
744 |
-
} catch (Exception $e) {
|
745 |
-
$this->_fault('prolabels_sysstore_save', $e);
|
746 |
-
}
|
747 |
-
}
|
748 |
-
}
|
749 |
-
}
|
750 |
-
}
|
751 |
-
|
752 |
-
/**
|
753 |
-
* Add new product attrubute to all of attribute sets.
|
754 |
-
* If attribute is already exists - skip.
|
755 |
-
*
|
756 |
-
* @param array $data
|
757 |
-
* <pre>
|
758 |
-
* attribute_code
|
759 |
-
* is_global 0
|
760 |
-
* frontend_input[text|boolean|textarea|select|price|media_image|etc]
|
761 |
-
* default_value_text
|
762 |
-
* is_searchable
|
763 |
-
* is_visible_in_advanced_search
|
764 |
-
* is_comparable
|
765 |
-
* frontend_label array
|
766 |
-
* sort_order Set 0 to use MaxSortOrder
|
767 |
-
* </pre>
|
768 |
-
*/
|
769 |
-
public function runProductAttribute($data)
|
770 |
-
{
|
771 |
-
$defaults = array(
|
772 |
-
'is_global' => 0,
|
773 |
-
'frontend_input' => 'boolean',
|
774 |
-
'is_configurable' => 0,
|
775 |
-
'is_filterable' => 0,
|
776 |
-
'is_filterable_in_search' => 0,
|
777 |
-
'sort_order' => 1
|
778 |
-
);
|
779 |
-
$entityTypeId = Mage::getModel('eav/entity')
|
780 |
-
->setType(Mage_Catalog_Model_Product::ENTITY)
|
781 |
-
->getTypeId();
|
782 |
-
$setCollection = Mage::getResourceModel('eav/entity_attribute_set_collection')
|
783 |
-
->setEntityTypeFilter($entityTypeId);
|
784 |
-
|
785 |
-
foreach ($data as $attributeData) {
|
786 |
-
/**
|
787 |
-
* @var $model Mage_Catalog_Model_Entity_Attribute
|
788 |
-
*/
|
789 |
-
$attribute = Mage::getModel('catalog/resource_eav_attribute')
|
790 |
-
->load($attributeData['attribute_code'], 'attribute_code');
|
791 |
-
if ($attribute->getId()) {
|
792 |
-
continue;
|
793 |
-
}
|
794 |
-
|
795 |
-
/* @var $helper Mage_Catalog_Helper_Product */
|
796 |
-
$helper = Mage::helper('catalog/product');
|
797 |
-
|
798 |
-
/**
|
799 |
-
* @todo add to helper and specify all relations for properties
|
800 |
-
*/
|
801 |
-
$attributeData = array_merge($defaults, $attributeData);
|
802 |
-
if (!isset($attributeData['source_model'])) {
|
803 |
-
$attributeData['source_model'] = $helper
|
804 |
-
->getAttributeSourceModelByInputType($attributeData['frontend_input']);
|
805 |
-
}
|
806 |
-
if (!isset($attributeData['backend_model'])) {
|
807 |
-
$attributeData['backend_model'] = $helper
|
808 |
-
->getAttributeBackendModelByInputType($attributeData['frontend_input']);
|
809 |
-
}
|
810 |
-
if (!isset($attributeData['backend_type'])) {
|
811 |
-
$attributeData['backend_type'] = $attribute
|
812 |
-
->getBackendTypeByInput($attributeData['frontend_input']);
|
813 |
-
}
|
814 |
-
$attribute->addData($attributeData);
|
815 |
-
$attribute->setEntityTypeId($entityTypeId);
|
816 |
-
$attribute->setIsUserDefined(1);
|
817 |
-
|
818 |
-
foreach ($setCollection as $set) {
|
819 |
-
$attribute->setAttributeSetId($set->getId());
|
820 |
-
$attribute->setAttributeGroupId($set->getDefaultGroupId());
|
821 |
-
try {
|
822 |
-
$attribute->save();
|
823 |
-
} catch (Exception $e) {
|
824 |
-
$this->_fault('product_attribute_save', $e);
|
825 |
-
}
|
826 |
-
}
|
827 |
-
|
828 |
-
if (!$setCollection->count()) {
|
829 |
-
try {
|
830 |
-
$attribute->save();
|
831 |
-
} catch (Exception $e) {
|
832 |
-
$this->_fault('product_attribute_save', $e);
|
833 |
-
}
|
834 |
-
}
|
835 |
-
}
|
836 |
-
}
|
837 |
-
|
838 |
-
/**
|
839 |
-
* @param array $data
|
840 |
-
* <pre>
|
841 |
-
* array(
|
842 |
-
* 'left' => array(
|
843 |
-
* 'name' => 'left',
|
844 |
-
* 'levels_per_dropdown' => 2,
|
845 |
-
* 'columns' => array(
|
846 |
-
* array(
|
847 |
-
* 'width' => 185
|
848 |
-
* )
|
849 |
-
* )
|
850 |
-
* )
|
851 |
-
* )
|
852 |
-
* </pre>
|
853 |
-
*/
|
854 |
-
public function runNavigationpro($data)
|
855 |
-
{
|
856 |
-
$menuDefaults = array(
|
857 |
-
'is_active' => 1,
|
858 |
-
'columns_mode' => 'menu',
|
859 |
-
'display_in_navigation' => 0,
|
860 |
-
'levels_per_dropdown' => 1,
|
861 |
-
'style' => 'dropdown'
|
862 |
-
);
|
863 |
-
$columnDefaults = array(
|
864 |
-
'is_active' => 1,
|
865 |
-
'sort_order' => '50',
|
866 |
-
'type' => TM_NavigationPro_Model_Column::TYPE_SUBCATEGORY,
|
867 |
-
'style' => 'dropdown',
|
868 |
-
'levels_per_dropdown' => 1,
|
869 |
-
'direction' => 'horizontal',
|
870 |
-
'columns_count' => 1,
|
871 |
-
'width' => 160
|
872 |
-
);
|
873 |
-
|
874 |
-
foreach ($data as $menuData) {
|
875 |
-
$menu = Mage::getModel('navigationpro/menu')
|
876 |
-
->load($menuData['name'], 'name');
|
877 |
-
if ($menu->getId()) {
|
878 |
-
continue;
|
879 |
-
}
|
880 |
-
|
881 |
-
foreach ($menuData['columns'] as $i => $columnData) {
|
882 |
-
$menuData['columns'][$i] = array_merge($columnDefaults, $columnData);
|
883 |
-
}
|
884 |
-
|
885 |
-
$menu = Mage::getModel('navigationpro/menu')
|
886 |
-
->setData(array_merge($menuDefaults, $menuData))
|
887 |
-
->setStoreId(Mage_Catalog_Model_Abstract::DEFAULT_STORE_ID)
|
888 |
-
->setSiblings(array())
|
889 |
-
->setContent(array())
|
890 |
-
->save();
|
891 |
-
}
|
892 |
-
}
|
893 |
-
|
894 |
-
/**
|
895 |
-
* Log installation errors
|
896 |
-
*
|
897 |
-
* @param string $type
|
898 |
-
* @param Exception $e
|
899 |
-
*/
|
900 |
-
protected function _fault($type, Exception $e)
|
901 |
-
{
|
902 |
-
$this->_getMessageLogger()->addError($type, array(
|
903 |
-
'message' => $e->getMessage(),
|
904 |
-
'trace' => $e->getTraceAsString()
|
905 |
-
));
|
906 |
-
}
|
907 |
-
|
908 |
-
/**
|
909 |
-
* @return TM_Core_Model_Module_ErrorLogger
|
910 |
-
*/
|
911 |
-
protected function _getMessageLogger()
|
912 |
-
{
|
913 |
-
return $this->getModule()->getMessageLogger();
|
914 |
-
}
|
915 |
-
|
916 |
-
/**
|
917 |
-
* Returns unique string. Used to backup existing pages, blocks, etc
|
918 |
-
* Theoretically it's possible to get existing identifier intentionally.
|
919 |
-
* But there is very low chance to do that accidently.
|
920 |
-
*
|
921 |
-
* @param string $prefix
|
922 |
-
* @return string
|
923 |
-
*/
|
924 |
-
protected function _getUniqueString($prefix)
|
925 |
-
{
|
926 |
-
$today = Mage::app()->getLocale()->date()
|
927 |
-
->toString(Varien_Date::DATETIME_INTERNAL_FORMAT);
|
928 |
-
$filteredToday = str_replace(array(' ', ':'), '-', $today);
|
929 |
-
return $prefix . '_backup_' . self::$_backupIterator++ . '_' . $filteredToday;
|
930 |
-
}
|
931 |
-
|
932 |
-
/**
|
933 |
-
* @return Mage_Core_Model_Store
|
934 |
-
*/
|
935 |
-
protected function _getStore($id)
|
936 |
-
{
|
937 |
-
if (!isset(self::$_stores[$id])) {
|
938 |
-
self::$_stores[$id] = Mage::getModel('core/store')->load($id);
|
939 |
-
}
|
940 |
-
return self::$_stores[$id];
|
941 |
-
}
|
942 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Model/Notification/Feed.php
DELETED
@@ -1,155 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Model_Notification_Feed extends Mage_AdminNotification_Model_Feed
|
4 |
-
{
|
5 |
-
const XML_USE_HTTPS_PATH = 'tmcore/notification/use_https';
|
6 |
-
const XML_FEED_URL_PATH = 'tmcore/notification/feed_url';
|
7 |
-
const XML_FREQUENCY_PATH = 'tmcore/notification/frequency';
|
8 |
-
const XML_LAST_UPDATE_PATH = 'tmcore/notification/last_update';
|
9 |
-
|
10 |
-
/**
|
11 |
-
* Retrieve feed url
|
12 |
-
*
|
13 |
-
* @return string
|
14 |
-
*/
|
15 |
-
public function getFeedUrl()
|
16 |
-
{
|
17 |
-
if (is_null($this->_feedUrl)) {
|
18 |
-
$this->_feedUrl = (Mage::getStoreConfigFlag(self::XML_USE_HTTPS_PATH) ? 'https://' : 'http://')
|
19 |
-
. Mage::getStoreConfig(self::XML_FEED_URL_PATH);
|
20 |
-
}
|
21 |
-
return $this->_feedUrl;
|
22 |
-
}
|
23 |
-
|
24 |
-
/**
|
25 |
-
* Check feed for modification.
|
26 |
-
* Copy of parent method, but isRead logic added to hide filteted news.
|
27 |
-
*
|
28 |
-
* @return TM_Core_Model_Notification_Feed
|
29 |
-
*/
|
30 |
-
public function checkUpdate()
|
31 |
-
{
|
32 |
-
if (!Mage::helper('core')->isModuleEnabled('Mage_AdminNotification')) {
|
33 |
-
return $this;
|
34 |
-
}
|
35 |
-
|
36 |
-
if (($this->getFrequency() + $this->getLastUpdate()) > time()) {
|
37 |
-
return $this;
|
38 |
-
}
|
39 |
-
|
40 |
-
$feedData = array();
|
41 |
-
|
42 |
-
$feedXml = $this->getFeedData();
|
43 |
-
|
44 |
-
if ($feedXml && $feedXml->channel && $feedXml->channel->item) {
|
45 |
-
foreach ($feedXml->channel->item as $item) {
|
46 |
-
$feedData[] = array(
|
47 |
-
'severity' => (int)$item->severity,
|
48 |
-
'date_added' => $this->getDate((string)$item->pubDate),
|
49 |
-
'title' => (string)$item->title,
|
50 |
-
'description' => (string)$item->description,
|
51 |
-
'url' => (string)$item->link,
|
52 |
-
'is_read' => $this->_getIsReadStatus($item)
|
53 |
-
);
|
54 |
-
}
|
55 |
-
|
56 |
-
if ($feedData) {
|
57 |
-
Mage::getModel('adminnotification/inbox')->parse(array_reverse($feedData));
|
58 |
-
}
|
59 |
-
|
60 |
-
}
|
61 |
-
$this->setLastUpdate();
|
62 |
-
|
63 |
-
return $this;
|
64 |
-
}
|
65 |
-
|
66 |
-
/**
|
67 |
-
* If the item channel matches notification filter,
|
68 |
-
* or item channel is not exists in TM_Core_Model_Adminhtml_System_Config_Source_Notification_Filter, then
|
69 |
-
* the item will be marken as not readed
|
70 |
-
*
|
71 |
-
* @param object $item
|
72 |
-
* @return boolean
|
73 |
-
*/
|
74 |
-
protected function _getIsReadStatus($item)
|
75 |
-
{
|
76 |
-
if (!$item->channel) {
|
77 |
-
return false;
|
78 |
-
}
|
79 |
-
|
80 |
-
$channels = (string)$item->channel;
|
81 |
-
if (!$channels) {
|
82 |
-
return false;
|
83 |
-
}
|
84 |
-
|
85 |
-
$filters = Mage::getStoreConfig('tmcore/notification/filter');
|
86 |
-
if (empty($filters)) {
|
87 |
-
return true; // disable notifications
|
88 |
-
}
|
89 |
-
|
90 |
-
$filters = explode(',', $filters);
|
91 |
-
$channels = explode(',', $channels);
|
92 |
-
$matches = array_intersect($filters, $channels);
|
93 |
-
if (count($matches)) {
|
94 |
-
return false;
|
95 |
-
}
|
96 |
-
|
97 |
-
$installedFilter = TM_Core_Model_Adminhtml_System_Config_Source_Notification_Channel::CHANNEL_INSTALLED;
|
98 |
-
if ($item->product && false !== array_search($installedFilter, $filters)) {
|
99 |
-
$products = explode(',', (string)$item->product);
|
100 |
-
$installedProducts = $this->_getInstalledModules('TM_', false);
|
101 |
-
$matches = array_intersect($installedProducts, $products);
|
102 |
-
return !(bool)count($matches);
|
103 |
-
}
|
104 |
-
|
105 |
-
return true; // installed mode only and item does not have product entry
|
106 |
-
}
|
107 |
-
|
108 |
-
protected function _getInstalledModules($namespace = 'TM_', $returnWithNamespace = true)
|
109 |
-
{
|
110 |
-
$modules = Mage::getConfig()->getNode('modules')->children();
|
111 |
-
$result = array();
|
112 |
-
foreach ($modules as $code => $values) {
|
113 |
-
if (0 !== strpos($code, $namespace)) {
|
114 |
-
continue;
|
115 |
-
}
|
116 |
-
if ($returnWithNamespace) {
|
117 |
-
$result[] = $code;
|
118 |
-
} else {
|
119 |
-
$result[] = str_replace($namespace, '', $code);
|
120 |
-
}
|
121 |
-
}
|
122 |
-
return $result;
|
123 |
-
}
|
124 |
-
|
125 |
-
/**
|
126 |
-
* Retrieve Update Frequency
|
127 |
-
*
|
128 |
-
* @return int
|
129 |
-
*/
|
130 |
-
public function getFrequency()
|
131 |
-
{
|
132 |
-
return Mage::getStoreConfig(self::XML_FREQUENCY_PATH) * 3600;
|
133 |
-
}
|
134 |
-
|
135 |
-
/**
|
136 |
-
* Retrieve Last update time
|
137 |
-
*
|
138 |
-
* @return int
|
139 |
-
*/
|
140 |
-
public function getLastUpdate()
|
141 |
-
{
|
142 |
-
return Mage::app()->loadCache('tmcore_notifications_lastcheck');
|
143 |
-
}
|
144 |
-
|
145 |
-
/**
|
146 |
-
* Set last update time (now)
|
147 |
-
*
|
148 |
-
* @return TM_Core_Model_Notification_Feed
|
149 |
-
*/
|
150 |
-
public function setLastUpdate()
|
151 |
-
{
|
152 |
-
Mage::app()->saveCache(time(), 'tmcore_notifications_lastcheck');
|
153 |
-
return $this;
|
154 |
-
}
|
155 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Model/Oauth/Client.php
DELETED
@@ -1,257 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* http://inchoo.net/ecommerce/magento/consuming-magento-rest-zend_oauth_consumer/
|
4 |
-
* http://www.magentocommerce.com/knowledge-base/entry/how-to-use-extend-the-magento-rest-api-to-use-coupon-auto-generation
|
5 |
-
*
|
6 |
-
* @author Darko Goleš <darko.goles@inchoo.net>
|
7 |
-
* @author Alexander Krasko <0m3r.mail@gmail.com>
|
8 |
-
* @package Inchoo
|
9 |
-
* @subpackage RestConnect
|
10 |
-
*/
|
11 |
-
class TM_Core_Model_Oauth_Client extends Mage_Core_Model_Abstract
|
12 |
-
{
|
13 |
-
private $_callbackUrl;
|
14 |
-
private $_siteUrl;
|
15 |
-
private $_consumerKey;
|
16 |
-
private $_consumerSecret;
|
17 |
-
private $_requestTokenUrl;
|
18 |
-
private $_accessTokenUrl;
|
19 |
-
private $_consumer;
|
20 |
-
private $_authorizeUrl;
|
21 |
-
private $_userAuthorizationUrl;
|
22 |
-
private $_authorized_token;
|
23 |
-
|
24 |
-
const OAUTH_STATE_NO_TOKEN = 0;
|
25 |
-
const OAUTH_STATE_REQUEST_TOKEN = 1;
|
26 |
-
const OAUTH_STATE_ACCESS_TOKEN = 2;
|
27 |
-
const OAUTH_STATE_ERROR = 3;
|
28 |
-
|
29 |
-
public function init($config)
|
30 |
-
{
|
31 |
-
$this->setOAuthConfig($config);
|
32 |
-
return $this;
|
33 |
-
}
|
34 |
-
|
35 |
-
public function setAuthorizedToken($token)
|
36 |
-
{
|
37 |
-
$this->_authorized_token = $token;
|
38 |
-
}
|
39 |
-
|
40 |
-
public function getAuthorizedToken()
|
41 |
-
{
|
42 |
-
if ($this->_authorized_token) {
|
43 |
-
return $this->_authorized_token;
|
44 |
-
}
|
45 |
-
return false;
|
46 |
-
}
|
47 |
-
|
48 |
-
public function reset()
|
49 |
-
{
|
50 |
-
return $this->resetSessionParams();
|
51 |
-
}
|
52 |
-
|
53 |
-
public function authenticate()
|
54 |
-
{
|
55 |
-
$state = $this->getOAuthState();
|
56 |
-
$consumer = $this->_getOAuthConsumer();
|
57 |
-
try {
|
58 |
-
switch ($state) {
|
59 |
-
case self::OAUTH_STATE_NO_TOKEN:
|
60 |
-
$requestToken = $this->getRequestToken();
|
61 |
-
$this->setOAuthState(self::OAUTH_STATE_REQUEST_TOKEN);
|
62 |
-
$consumer->redirect();
|
63 |
-
return self::OAUTH_STATE_REQUEST_TOKEN;
|
64 |
-
break;
|
65 |
-
case self::OAUTH_STATE_REQUEST_TOKEN:
|
66 |
-
$accessToken = $this->getAccessToken($this->getRequestToken());
|
67 |
-
$this->setAuthorizedToken($accessToken);
|
68 |
-
$this->setOAuthState(self::OAUTH_STATE_ACCESS_TOKEN);
|
69 |
-
return self::OAUTH_STATE_ACCESS_TOKEN;
|
70 |
-
break;
|
71 |
-
case self::OAUTH_STATE_ACCESS_TOKEN:
|
72 |
-
$accessToken = $this->_getAccessTokenFromSession();
|
73 |
-
if ($accessToken && $accessToken instanceof Zend_Oauth_Token_Access) {
|
74 |
-
$this->setAuthorizedToken($accessToken);
|
75 |
-
}
|
76 |
-
return self::OAUTH_STATE_ACCESS_TOKEN;
|
77 |
-
default:
|
78 |
-
$this->resetSessionParams();
|
79 |
-
return self::OAUTH_STATE_NO_TOKEN;
|
80 |
-
return;
|
81 |
-
break;
|
82 |
-
}
|
83 |
-
} catch (Zend_Oauth_Exception $e) {
|
84 |
-
$this->resetSessionParams();
|
85 |
-
Mage::logException($e);
|
86 |
-
} catch (Exception $e) {
|
87 |
-
Mage::logException($e);
|
88 |
-
}
|
89 |
-
return self::OAUTH_STATE_NO_TOKEN;
|
90 |
-
}
|
91 |
-
|
92 |
-
private function resetSessionParams()
|
93 |
-
{
|
94 |
-
$this->getSession()->unsetData('o_auth_state');
|
95 |
-
$this->getSession()->unsetData('request_token');
|
96 |
-
$this->getSession()->unsetData('o_auth_config');
|
97 |
-
$this->getSession()->unsetData('access_token');
|
98 |
-
return $this;
|
99 |
-
}
|
100 |
-
|
101 |
-
public function getRequestToken()
|
102 |
-
{
|
103 |
-
$token = $this->_getRequestTokenFromSession();
|
104 |
-
if ($token && $token instanceof Zend_Oauth_Token_Request) {
|
105 |
-
return $token;
|
106 |
-
}
|
107 |
-
$token = $this->_getRequestTokenFromServer();
|
108 |
-
if ($token && $token instanceof Zend_Oauth_Token_Request) {
|
109 |
-
$this->_saveRequestTokenInSession($token);
|
110 |
-
return $token;
|
111 |
-
}
|
112 |
-
return false;
|
113 |
-
}
|
114 |
-
|
115 |
-
public function getAccessToken($requestToken)
|
116 |
-
{
|
117 |
-
$token = $this->_getAccessTokenFromSession();
|
118 |
-
if ($token && $token instanceof Zend_Oauth_Token_Access) {
|
119 |
-
return $token;
|
120 |
-
}
|
121 |
-
$token = $this->_getAcessTokenFromServer($requestToken);
|
122 |
-
if ($token && $token instanceof Zend_Oauth_Token_Access) {
|
123 |
-
$this->_saveAccessTokenInSesion($token);
|
124 |
-
return $token;
|
125 |
-
}
|
126 |
-
}
|
127 |
-
|
128 |
-
private function _getAcessTokenFromServer($requestToken)
|
129 |
-
{
|
130 |
-
if ($requestToken && $requestToken instanceof Zend_Oauth_Token_Request) {
|
131 |
-
$accToken = $this->_getOAuthConsumer()->getAccessToken(
|
132 |
-
$_GET,
|
133 |
-
$requestToken
|
134 |
-
);
|
135 |
-
}
|
136 |
-
if ($accToken && $accToken instanceof Zend_Oauth_Token_Access) {
|
137 |
-
return $accToken;
|
138 |
-
}
|
139 |
-
return false;
|
140 |
-
}
|
141 |
-
|
142 |
-
private function _saveAccessTokenInSesion($accessToken)
|
143 |
-
{
|
144 |
-
$this->getSession()->setAccessToken(serialize($accessToken));
|
145 |
-
}
|
146 |
-
|
147 |
-
private function _getAccessTokenFromSession()
|
148 |
-
{
|
149 |
-
$accessToken = unserialize($this->getSession()->getData('access_token'));
|
150 |
-
if ($accessToken && $accessToken instanceof Zend_Oauth_Token_Access) {
|
151 |
-
return $accessToken;
|
152 |
-
}
|
153 |
-
return false;
|
154 |
-
}
|
155 |
-
|
156 |
-
private function _getRequestTokenFromServer()
|
157 |
-
{
|
158 |
-
$token = $this->_getOAuthConsumer()->getRequestToken();
|
159 |
-
return $token;
|
160 |
-
}
|
161 |
-
|
162 |
-
private function _saveRequestTokenInSession(Zend_Oauth_Token_Request $requestToken)
|
163 |
-
{
|
164 |
-
$this->getSession()->setRequestToken(serialize($requestToken));
|
165 |
-
}
|
166 |
-
|
167 |
-
private function _getRequestTokenFromSession()
|
168 |
-
{
|
169 |
-
$requestToken = unserialize($this->getSession()->getRequestToken());
|
170 |
-
if ($requestToken && $requestToken instanceof Zend_Oauth_Token_Request) {
|
171 |
-
return $requestToken;
|
172 |
-
}
|
173 |
-
return false;
|
174 |
-
}
|
175 |
-
|
176 |
-
public function getSession()
|
177 |
-
{
|
178 |
-
return Mage::getSingleton('core/session');
|
179 |
-
}
|
180 |
-
|
181 |
-
public function getOAuthToken()
|
182 |
-
{
|
183 |
-
return $this->getRequest()->getParam('oauth_token', false);
|
184 |
-
}
|
185 |
-
|
186 |
-
public function getRequest()
|
187 |
-
{
|
188 |
-
return Mage::app()->getRequest();
|
189 |
-
}
|
190 |
-
|
191 |
-
private function _getOAuthConsumer()
|
192 |
-
{
|
193 |
-
if ($consumer = $this->_consumer) {
|
194 |
-
if ($consumer instanceof Zend_Oauth_Consumer) {
|
195 |
-
return $this->_consumer;
|
196 |
-
}
|
197 |
-
}
|
198 |
-
$this->_consumer = new Zend_Oauth_Consumer($this->getOAuthConfig());
|
199 |
-
return $this->_consumer;
|
200 |
-
}
|
201 |
-
|
202 |
-
private function getOAuthConfig()
|
203 |
-
{
|
204 |
-
$config = array(
|
205 |
-
'callbackUrl' => $this->_callbackUrl,
|
206 |
-
'siteUrl' => $this->_siteUrl,
|
207 |
-
'consumerKey' => $this->_consumerKey,
|
208 |
-
'consumerSecret' => $this->_consumerSecret,
|
209 |
-
'requestTokenUrl' => $this->_requestTokenUrl,
|
210 |
-
'accessTokenUrl' => $this->_accessTokenUrl,
|
211 |
-
);
|
212 |
-
if ($this->_authorizeUrl && $this->_authorizeUrl != '') {
|
213 |
-
$config['authorizeUrl'] = $this->_authorizeUrl;
|
214 |
-
}
|
215 |
-
if ($this->_userAuthorizationUrl && $this->_userAuthorizationUrl != '') {
|
216 |
-
$config['userAuthorizationUrl'] = $this->_userAuthorizationUrl;
|
217 |
-
}
|
218 |
-
return $config;
|
219 |
-
}
|
220 |
-
|
221 |
-
private function setOAuthConfig($config)
|
222 |
-
{
|
223 |
-
$this->getSession()->setOAuthConfig(serialize($config));
|
224 |
-
foreach ($config as $key => $val) {
|
225 |
-
$_key = '_' . $key;
|
226 |
-
$this->$_key = $val;
|
227 |
-
}
|
228 |
-
}
|
229 |
-
|
230 |
-
public function getConfigFromSession()
|
231 |
-
{
|
232 |
-
$config = unserialize($this->getSession()->getOAuthConfig());
|
233 |
-
if ($config && is_array($config)) {
|
234 |
-
return $config;
|
235 |
-
}
|
236 |
-
return false;
|
237 |
-
}
|
238 |
-
|
239 |
-
private function setOAuthState($state)
|
240 |
-
{
|
241 |
-
$this->getSession()->setOAuthState($state);
|
242 |
-
}
|
243 |
-
|
244 |
-
public function getOAuthState()
|
245 |
-
{
|
246 |
-
$state = $this->getSession()->getOAuthState();
|
247 |
-
if ($state == null) {
|
248 |
-
return self::OAUTH_STATE_NO_TOKEN;
|
249 |
-
}
|
250 |
-
$paramOAuthToken = $this->getOAuthToken();
|
251 |
-
if ($paramOAuthToken == false && $state == self::OAUTH_STATE_REQUEST_TOKEN) {
|
252 |
-
$this->resetSessionParams();
|
253 |
-
return self::OAUTH_STATE_NO_TOKEN;
|
254 |
-
}
|
255 |
-
return $state;
|
256 |
-
}
|
257 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Model/Observer.php
DELETED
@@ -1,66 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Model_Observer
|
4 |
-
{
|
5 |
-
/**
|
6 |
-
* Predispath admin action controller
|
7 |
-
*
|
8 |
-
* @param Varien_Event_Observer $observer
|
9 |
-
*/
|
10 |
-
public function preDispatch(Varien_Event_Observer $observer)
|
11 |
-
{
|
12 |
-
if (Mage::getSingleton('admin/session')->isLoggedIn()) {
|
13 |
-
if (!Mage::getStoreConfig('tmcore/notification/enabled')) {
|
14 |
-
return;
|
15 |
-
}
|
16 |
-
|
17 |
-
$feedModel = Mage::getModel('tmcore/notification_feed');
|
18 |
-
$feedModel->checkUpdate();
|
19 |
-
}
|
20 |
-
}
|
21 |
-
|
22 |
-
/**
|
23 |
-
* Add layout update files just before local.xml
|
24 |
-
* Conditions are supported too
|
25 |
-
*/
|
26 |
-
public function addLayoutUpdate($observer)
|
27 |
-
{
|
28 |
-
// $area = Mage::getSingleton('core/design_package')->getArea();
|
29 |
-
$area = Mage_Core_Model_App_Area::AREA_FRONTEND;
|
30 |
-
$updates = $observer->getUpdates();
|
31 |
-
$extraNodes = Mage::app()->getConfig()->getNode($area.'/tm_layout/updates');
|
32 |
-
if (!$extraNodes) {
|
33 |
-
return;
|
34 |
-
}
|
35 |
-
foreach ($extraNodes->children() as $node) {
|
36 |
-
if ($node->getAttribute('condition')) {
|
37 |
-
$parts = explode('/', $node->getAttribute('condition'));
|
38 |
-
$helper = array_shift($parts);
|
39 |
-
$method = array_shift($parts);
|
40 |
-
if (count($parts)) {
|
41 |
-
$helper .= '/' . $method;
|
42 |
-
$method = array_shift($parts);
|
43 |
-
}
|
44 |
-
$helper = Mage::helper($helper);
|
45 |
-
if ($args = $node->getAttribute('args')) {
|
46 |
-
$args = explode(',', $args);
|
47 |
-
$enabled = call_user_func_array(array($helper, $method), $args);
|
48 |
-
} else {
|
49 |
-
$enabled = $helper->{$method}();
|
50 |
-
}
|
51 |
-
if (!$enabled) {
|
52 |
-
continue;
|
53 |
-
}
|
54 |
-
}
|
55 |
-
$updates->appendChild($node);
|
56 |
-
}
|
57 |
-
}
|
58 |
-
|
59 |
-
public function onBeforeRenderLayout()
|
60 |
-
{
|
61 |
-
$layout = Mage::app()->getLayout();
|
62 |
-
if ($debug = $layout->getBlock(TM_Core_Helper_Debug::POPUP_NAME)) {
|
63 |
-
$layout->getBlock('content')->append($debug);
|
64 |
-
}
|
65 |
-
}
|
66 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Model/Resource/Module.php
DELETED
@@ -1,16 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Model_Resource_Module extends Mage_Core_Model_Mysql4_Abstract
|
4 |
-
{
|
5 |
-
/**
|
6 |
-
* Primery key auto increment flag
|
7 |
-
*
|
8 |
-
* @var bool
|
9 |
-
*/
|
10 |
-
protected $_isPkAutoIncrement = false;
|
11 |
-
|
12 |
-
protected function _construct()
|
13 |
-
{
|
14 |
-
$this->_init('tmcore/module', 'code');
|
15 |
-
}
|
16 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Model/Resource/Module/AdminGridCollection.php
DELETED
@@ -1,17 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Model_Resource_Module_AdminGridCollection extends TM_Core_Model_Resource_Module_MergedCollection
|
4 |
-
{
|
5 |
-
public function getModulesFromConfigNodes()
|
6 |
-
{
|
7 |
-
$modules = Mage::getConfig()->getNode('modules')->children();
|
8 |
-
$result = array();
|
9 |
-
foreach ($modules as $code => $values) {
|
10 |
-
if ($values->tm_hidden) {
|
11 |
-
continue;
|
12 |
-
}
|
13 |
-
$result[$code] = $values;
|
14 |
-
}
|
15 |
-
return $result;
|
16 |
-
}
|
17 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Model/Resource/Module/Collection.php
DELETED
@@ -1,9 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Model_Resource_Module_Collection extends Mage_Core_Model_Mysql4_Collection_Abstract
|
4 |
-
{
|
5 |
-
protected function _construct()
|
6 |
-
{
|
7 |
-
$this->_init('tmcore/module');
|
8 |
-
}
|
9 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Model/Resource/Module/MergedCollection.php
DELETED
@@ -1,502 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Model_Resource_Module_MergedCollection extends Varien_Data_Collection
|
4 |
-
{
|
5 |
-
/**
|
6 |
-
* Item object class name
|
7 |
-
*
|
8 |
-
* @var string
|
9 |
-
*/
|
10 |
-
protected $_itemObjectClass = 'TM_Core_Model_Module';
|
11 |
-
|
12 |
-
protected $_collectedModules = array();
|
13 |
-
|
14 |
-
/**
|
15 |
-
* Filter rendering helper variables
|
16 |
-
*
|
17 |
-
* @see Varien_Data_Collection::$_filter
|
18 |
-
* @see Varien_Data_Collection::$_isFiltersRendered
|
19 |
-
*/
|
20 |
-
private $_filterIncrement = 0;
|
21 |
-
private $_filterBrackets = array();
|
22 |
-
private $_filterEvalRendered = '';
|
23 |
-
|
24 |
-
/**
|
25 |
-
* Lauch data collecting
|
26 |
-
*
|
27 |
-
* @param bool $printQuery
|
28 |
-
* @param bool $logQuery
|
29 |
-
* @return Varien_Data_Collection_Filesystem
|
30 |
-
*/
|
31 |
-
public function loadData($printQuery = false, $logQuery = false)
|
32 |
-
{
|
33 |
-
if ($this->isLoaded()) {
|
34 |
-
return $this;
|
35 |
-
}
|
36 |
-
|
37 |
-
$modules = $this->getModulesFromConfigNodes();
|
38 |
-
$remoteCollection = Mage::getResourceModel('tmcore/module_remoteCollection');
|
39 |
-
$localCollection = Mage::getResourceModel('tmcore/module_collection');
|
40 |
-
foreach ($modules as $code => $values) {
|
41 |
-
if (0 !== strpos($code, 'TM_')) {
|
42 |
-
continue;
|
43 |
-
}
|
44 |
-
|
45 |
-
$module = $localCollection->getItemById($code);
|
46 |
-
if (!$module) {
|
47 |
-
$module = new $this->_itemObjectClass();
|
48 |
-
} else {
|
49 |
-
$module->load($module->getId());
|
50 |
-
}
|
51 |
-
|
52 |
-
$localData = array_merge(
|
53 |
-
array(
|
54 |
-
'id' => $code,
|
55 |
-
'data_version' => $module->getDataVersion(),
|
56 |
-
'code' => $code,
|
57 |
-
'available_upgrades' => $module->getUpgradesToRun()
|
58 |
-
),
|
59 |
-
$values->asCanonicalArray()
|
60 |
-
);
|
61 |
-
|
62 |
-
$this->_collectedModules[$code] =
|
63 |
-
$this->_syncLocalAndRemoteData(
|
64 |
-
$localData,
|
65 |
-
$remoteCollection->getItemById($code)
|
66 |
-
);
|
67 |
-
}
|
68 |
-
|
69 |
-
$this->_filterAndSort();
|
70 |
-
|
71 |
-
// calculate totals
|
72 |
-
$this->_totalRecords = count($this->_collectedModules);
|
73 |
-
$this->_setIsLoaded();
|
74 |
-
|
75 |
-
// paginate and add items
|
76 |
-
$from = ($this->getCurPage() - 1) * $this->getPageSize();
|
77 |
-
$to = $from + $this->getPageSize() - 1;
|
78 |
-
$isPaginated = $this->getPageSize() > 0;
|
79 |
-
|
80 |
-
$cnt = 0;
|
81 |
-
foreach ($this->_collectedModules as $row) {
|
82 |
-
$cnt++;
|
83 |
-
if ($isPaginated && ($cnt < $from || $cnt > $to)) {
|
84 |
-
continue;
|
85 |
-
}
|
86 |
-
$item = new $this->_itemObjectClass();
|
87 |
-
$this->addItem($item->addData($row));
|
88 |
-
if (!$item->hasId()) {
|
89 |
-
$item->setId($cnt);
|
90 |
-
}
|
91 |
-
}
|
92 |
-
|
93 |
-
return $this;
|
94 |
-
}
|
95 |
-
|
96 |
-
public function getModulesFromConfigNodes()
|
97 |
-
{
|
98 |
-
return Mage::getConfig()->getNode('modules')->children();
|
99 |
-
}
|
100 |
-
|
101 |
-
private function _syncLocalAndRemoteData(array $local, $remote)
|
102 |
-
{
|
103 |
-
$result = array();
|
104 |
-
if ($remote) {
|
105 |
-
$remote = $remote->toArray();
|
106 |
-
$result = $remote;
|
107 |
-
$version = $remote['version'];
|
108 |
-
$dataVersion = '';
|
109 |
-
if (isset($remote['data_version'])) {
|
110 |
-
$dataVersion = $remote['data_version'];
|
111 |
-
}
|
112 |
-
|
113 |
-
unset($result['version']);
|
114 |
-
unset($result['data_version']);
|
115 |
-
|
116 |
-
$result['latest_version'] = $version;
|
117 |
-
$result['latest_data_version'] = $dataVersion;
|
118 |
-
$result['version_status'] = $this->_getVersionStatusLabel($local, $remote);
|
119 |
-
}
|
120 |
-
return array_merge($local, $result);
|
121 |
-
}
|
122 |
-
|
123 |
-
/**
|
124 |
-
* Retrieve version status label
|
125 |
-
*
|
126 |
-
* @param array $localData Local module data
|
127 |
-
* @param array $remoteData Latest module data
|
128 |
-
* @return string
|
129 |
-
*/
|
130 |
-
private function _getVersionStatusLabel(array $local, array $remote = array())
|
131 |
-
{
|
132 |
-
$versionCompare = version_compare($local['version'], $remote['version']);
|
133 |
-
$dataCompare = 0;
|
134 |
-
if (isset($remote['data_version'])) {
|
135 |
-
$dataCompare = version_compare($local['data_version'], $remote['data_version']);
|
136 |
-
}
|
137 |
-
if ($local['available_upgrades']) {
|
138 |
-
$dataCompare = -1;
|
139 |
-
}
|
140 |
-
|
141 |
-
if ($versionCompare > -1 && $dataCompare > -1) {
|
142 |
-
$status = TM_Core_Model_Module::VERSION_UPDATED;
|
143 |
-
} else if ($versionCompare === -1) {
|
144 |
-
$status = TM_Core_Model_Module::VERSION_DEPRECATED;
|
145 |
-
} else {
|
146 |
-
$status = TM_Core_Model_Module::VERSION_OUTDATED;
|
147 |
-
}
|
148 |
-
return $status;
|
149 |
-
}
|
150 |
-
|
151 |
-
/**
|
152 |
-
* With specified collected items:
|
153 |
-
* - generate data
|
154 |
-
* - apply filters
|
155 |
-
* - sort
|
156 |
-
*
|
157 |
-
* @param string $attributeName '_collectedFiles' | '_collectedDirs'
|
158 |
-
*/
|
159 |
-
private function _filterAndSort()
|
160 |
-
{
|
161 |
-
// apply filters on generated data
|
162 |
-
if (!empty($this->_filters)) {
|
163 |
-
foreach ($this->_collectedModules as $key => $row) {
|
164 |
-
if (!$this->_filterRow($row)) {
|
165 |
-
unset($this->_collectedModules[$key]);
|
166 |
-
}
|
167 |
-
}
|
168 |
-
}
|
169 |
-
|
170 |
-
// sort (keys are lost!)
|
171 |
-
if (!empty($this->_orders)) {
|
172 |
-
usort($this->_collectedModules, array($this, '_usort'));
|
173 |
-
}
|
174 |
-
}
|
175 |
-
|
176 |
-
protected function _usort($a, $b)
|
177 |
-
{
|
178 |
-
foreach ($this->_orders as $key => $direction) {
|
179 |
-
$result = $a[$key] > $b[$key] ? 1 : ($a[$key] < $b[$key] ? -1 : 0);
|
180 |
-
return (self::SORT_ORDER_ASC === strtoupper($direction) ? $result : -$result);
|
181 |
-
break;
|
182 |
-
}
|
183 |
-
}
|
184 |
-
|
185 |
-
/**
|
186 |
-
* Set select order
|
187 |
-
* Currently supports only sorting by one column
|
188 |
-
*
|
189 |
-
* @param string $field
|
190 |
-
* @param string $direction
|
191 |
-
* @return Varien_Data_Collection
|
192 |
-
*/
|
193 |
-
public function setOrder($field, $direction = self::SORT_ORDER_DESC)
|
194 |
-
{
|
195 |
-
$this->_orders = array($field => $direction);
|
196 |
-
return $this;
|
197 |
-
}
|
198 |
-
|
199 |
-
/**
|
200 |
-
* Set a custom filter with callback
|
201 |
-
* The callback must take 3 params:
|
202 |
-
* string $field - field key,
|
203 |
-
* mixed $filterValue - value to filter by,
|
204 |
-
* array $row - a generated row (before generaring varien objects)
|
205 |
-
*
|
206 |
-
* @param string $field
|
207 |
-
* @param mixed $value
|
208 |
-
* @param string $type 'and'|'or'
|
209 |
-
* @param callback $callback
|
210 |
-
* @param bool $isInverted
|
211 |
-
* @return Varien_Data_Collection_Filesystem
|
212 |
-
*/
|
213 |
-
public function addCallbackFilter($field, $value, $type, $callback, $isInverted = false)
|
214 |
-
{
|
215 |
-
$this->_filters[$this->_filterIncrement] = array(
|
216 |
-
'field' => $field,
|
217 |
-
'value' => $value,
|
218 |
-
'is_and' => 'and' === $type,
|
219 |
-
'callback' => $callback,
|
220 |
-
'is_inverted' => $isInverted
|
221 |
-
);
|
222 |
-
$this->_filterIncrement++;
|
223 |
-
return $this;
|
224 |
-
}
|
225 |
-
|
226 |
-
/**
|
227 |
-
* The filters renderer and caller
|
228 |
-
* Aplies to each row, renders once.
|
229 |
-
*
|
230 |
-
* @param array $row
|
231 |
-
* @return bool
|
232 |
-
*/
|
233 |
-
protected function _filterRow($row)
|
234 |
-
{
|
235 |
-
// render filters once
|
236 |
-
if (!$this->_isFiltersRendered) {
|
237 |
-
$eval = '';
|
238 |
-
for ($i = 0; $i < $this->_filterIncrement; $i++) {
|
239 |
-
if (isset($this->_filterBrackets[$i])) {
|
240 |
-
$eval .= $this->_renderConditionBeforeFilterElement($i, $this->_filterBrackets[$i]['is_and'])
|
241 |
-
. $this->_filterBrackets[$i]['value'];
|
242 |
-
}
|
243 |
-
else {
|
244 |
-
$f = '$this->_filters[' . $i . ']';
|
245 |
-
$eval .= $this->_renderConditionBeforeFilterElement($i, $this->_filters[$i]['is_and'])
|
246 |
-
. ($this->_filters[$i]['is_inverted'] ? '!' : '')
|
247 |
-
. '$this->_invokeFilter(' . "{$f}['callback'], array({$f}['field'], {$f}['value'], " . '$row))';
|
248 |
-
}
|
249 |
-
}
|
250 |
-
$this->_filterEvalRendered = $eval;
|
251 |
-
$this->_isFiltersRendered = true;
|
252 |
-
}
|
253 |
-
$result = false;
|
254 |
-
if ($this->_filterEvalRendered) {
|
255 |
-
eval('$result = ' . $this->_filterEvalRendered . ';');
|
256 |
-
}
|
257 |
-
return $result;
|
258 |
-
}
|
259 |
-
|
260 |
-
/**
|
261 |
-
* Invokes specified callback
|
262 |
-
* Skips, if there is no filtered key in the row
|
263 |
-
*
|
264 |
-
* @param callback $callback
|
265 |
-
* @param array $callbackParams
|
266 |
-
* @return bool
|
267 |
-
*/
|
268 |
-
protected function _invokeFilter($callback, $callbackParams)
|
269 |
-
{
|
270 |
-
list($field, $value, $row) = $callbackParams;
|
271 |
-
if (!array_key_exists($field, $row)) {
|
272 |
-
return false;
|
273 |
-
}
|
274 |
-
return call_user_func_array($callback, $callbackParams);
|
275 |
-
}
|
276 |
-
|
277 |
-
/**
|
278 |
-
* Fancy field filter
|
279 |
-
*
|
280 |
-
* @param string $field
|
281 |
-
* @param mixed $cond
|
282 |
-
* @param string $type 'and' | 'or'
|
283 |
-
* @see Varien_Data_Collection_Db::addFieldToFilter()
|
284 |
-
* @return Varien_Data_Collection_Filesystem
|
285 |
-
*/
|
286 |
-
public function addFieldToFilter($field, $cond, $type = 'and')
|
287 |
-
{
|
288 |
-
$inverted = true;
|
289 |
-
|
290 |
-
// simply check whether equals
|
291 |
-
if (!is_array($cond)) {
|
292 |
-
return $this->addCallbackFilter($field, $cond, $type, array($this, 'filterCallbackEq'));
|
293 |
-
}
|
294 |
-
|
295 |
-
// versatile filters
|
296 |
-
if (isset($cond['from']) || isset($cond['to'])) {
|
297 |
-
$this->_addFilterBracket('(', 'and' === $type);
|
298 |
-
if (isset($cond['from'])) {
|
299 |
-
$this->addCallbackFilter($field, $cond['from'], 'and', array($this, 'filterCallbackIsLessThan'), $inverted);
|
300 |
-
}
|
301 |
-
if (isset($cond['to'])) {
|
302 |
-
$this->addCallbackFilter($field, $cond['to'], 'and', array($this, 'filterCallbackIsMoreThan'), $inverted);
|
303 |
-
}
|
304 |
-
return $this->_addFilterBracket(')');
|
305 |
-
}
|
306 |
-
if (isset($cond['eq'])) {
|
307 |
-
return $this->addCallbackFilter($field, $cond['eq'], $type, array($this, 'filterCallbackEq'));
|
308 |
-
}
|
309 |
-
if (isset($cond['neq'])) {
|
310 |
-
return $this->addCallbackFilter($field, $cond['neq'], $type, array($this, 'filterCallbackEq'), $inverted);
|
311 |
-
}
|
312 |
-
if (isset($cond['like'])) {
|
313 |
-
return $this->addCallbackFilter($field, $cond['like'], $type, array($this, 'filterCallbackLike'));
|
314 |
-
}
|
315 |
-
if (isset($cond['nlike'])) {
|
316 |
-
return $this->addCallbackFilter($field, $cond['nlike'], $type, array($this, 'filterCallbackLike'), $inverted);
|
317 |
-
}
|
318 |
-
if (isset($cond['in'])) {
|
319 |
-
return $this->addCallbackFilter($field, $cond['in'], $type, array($this, 'filterCallbackInArray'));
|
320 |
-
}
|
321 |
-
if (isset($cond['nin'])) {
|
322 |
-
return $this->addCallbackFilter($field, $cond['nin'], $type, array($this, 'filterCallbackInArray'), $inverted);
|
323 |
-
}
|
324 |
-
if (isset($cond['notnull'])) {
|
325 |
-
return $this->addCallbackFilter($field, $cond['notnull'], $type, array($this, 'filterCallbackIsNull'), $inverted);
|
326 |
-
}
|
327 |
-
if (isset($cond['null'])) {
|
328 |
-
return $this->addCallbackFilter($field, $cond['null'], $type, array($this, 'filterCallbackIsNull'));
|
329 |
-
}
|
330 |
-
if (isset($cond['moreq'])) {
|
331 |
-
return $this->addCallbackFilter($field, $cond['moreq'], $type, array($this, 'filterCallbackIsLessThan'), $inverted);
|
332 |
-
}
|
333 |
-
if (isset($cond['gt'])) {
|
334 |
-
return $this->addCallbackFilter($field, $cond['gt'], $type, array($this, 'filterCallbackIsMoreThan'));
|
335 |
-
}
|
336 |
-
if (isset($cond['lt'])) {
|
337 |
-
return $this->addCallbackFilter($field, $cond['lt'], $type, array($this, 'filterCallbackIsLessThan'));
|
338 |
-
}
|
339 |
-
if (isset($cond['gteq'])) {
|
340 |
-
return $this->addCallbackFilter($field, $cond['gteq'], $type, array($this, 'filterCallbackIsLessThan'), $inverted);
|
341 |
-
}
|
342 |
-
if (isset($cond['lteq'])) {
|
343 |
-
return $this->addCallbackFilter($field, $cond['lteq'], $type, array($this, 'filterCallbackIsMoreThan'), $inverted);
|
344 |
-
}
|
345 |
-
if (isset($cond['finset'])) {
|
346 |
-
$filterValue = ($cond['finset'] ? explode(',', $cond['finset']) : array());
|
347 |
-
return $this->addCallbackFilter($field, $filterValue, $type, array($this, 'filterCallbackInArray'));
|
348 |
-
}
|
349 |
-
|
350 |
-
// add OR recursively
|
351 |
-
foreach ($cond as $orCond) {
|
352 |
-
$this->_addFilterBracket('(', 'and' === $type);
|
353 |
-
$this->addFieldToFilter($field, $orCond, 'or');
|
354 |
-
$this->_addFilterBracket(')');
|
355 |
-
}
|
356 |
-
return $this;
|
357 |
-
}
|
358 |
-
|
359 |
-
/**
|
360 |
-
* Prepare a bracket into filters
|
361 |
-
*
|
362 |
-
* @param string $bracket
|
363 |
-
* @param bool $isAnd
|
364 |
-
* @return Varien_Data_Collection_Filesystem
|
365 |
-
*/
|
366 |
-
protected function _addFilterBracket($bracket = '(', $isAnd = true)
|
367 |
-
{
|
368 |
-
$this->_filterBrackets[$this->_filterIncrement] = array(
|
369 |
-
'value' => $bracket === ')' ? ')' : '(',
|
370 |
-
'is_and' => $isAnd,
|
371 |
-
);
|
372 |
-
$this->_filterIncrement++;
|
373 |
-
return $this;
|
374 |
-
}
|
375 |
-
|
376 |
-
/**
|
377 |
-
* Render condition sign before element, if required
|
378 |
-
*
|
379 |
-
* @param int $increment
|
380 |
-
* @param bool $isAnd
|
381 |
-
* @return string
|
382 |
-
*/
|
383 |
-
protected function _renderConditionBeforeFilterElement($increment, $isAnd)
|
384 |
-
{
|
385 |
-
if (isset($this->_filterBrackets[$increment]) && ')' === $this->_filterBrackets[$increment]['value']) {
|
386 |
-
return '';
|
387 |
-
}
|
388 |
-
$prevIncrement = $increment - 1;
|
389 |
-
$prevBracket = false;
|
390 |
-
if (isset($this->_filterBrackets[$prevIncrement])) {
|
391 |
-
$prevBracket = $this->_filterBrackets[$prevIncrement]['value'];
|
392 |
-
}
|
393 |
-
if ($prevIncrement < 0 || $prevBracket === '(') {
|
394 |
-
return '';
|
395 |
-
}
|
396 |
-
return ($isAnd ? ' && ' : ' || ');
|
397 |
-
}
|
398 |
-
|
399 |
-
/**
|
400 |
-
* Does nothing. Intentionally disabled parent method
|
401 |
-
*
|
402 |
-
* @return Varien_Data_Collection_Filesystem
|
403 |
-
*/
|
404 |
-
public function addFilter($field, $value, $type = 'and')
|
405 |
-
{
|
406 |
-
return $this;
|
407 |
-
}
|
408 |
-
|
409 |
-
/**
|
410 |
-
* Callback method for 'like' fancy filter
|
411 |
-
*
|
412 |
-
* @param string $field
|
413 |
-
* @param mixed $filterValue
|
414 |
-
* @param array $row
|
415 |
-
* @return bool
|
416 |
-
* @see addFieldToFilter()
|
417 |
-
* @see addCallbackFilter()
|
418 |
-
*/
|
419 |
-
public function filterCallbackLike($field, $filterValue, $row)
|
420 |
-
{
|
421 |
-
// removing single quotes, added by filter for mysql query: "'%FILTER_TEXT%'"
|
422 |
-
$filterValue = preg_replace("/(^')(.*)('$)/", "$2", $filterValue);
|
423 |
-
|
424 |
-
$filterValueRegex = str_replace('%', '(.*?)', preg_quote($filterValue, '/'));
|
425 |
-
return (bool)preg_match("/^{$filterValueRegex}$/i", $row[$field]);
|
426 |
-
}
|
427 |
-
|
428 |
-
/**
|
429 |
-
* Callback method for 'eq' fancy filter
|
430 |
-
*
|
431 |
-
* @param string $field
|
432 |
-
* @param mixed $filterValue
|
433 |
-
* @param array $row
|
434 |
-
* @return bool
|
435 |
-
* @see addFieldToFilter()
|
436 |
-
* @see addCallbackFilter()
|
437 |
-
*/
|
438 |
-
public function filterCallbackEq($field, $filterValue, $row)
|
439 |
-
{
|
440 |
-
return $filterValue == $row[$field];
|
441 |
-
}
|
442 |
-
|
443 |
-
/**
|
444 |
-
* Callback method for 'in' fancy filter
|
445 |
-
*
|
446 |
-
* @param string $field
|
447 |
-
* @param mixed $filterValue
|
448 |
-
* @param array $row
|
449 |
-
* @return bool
|
450 |
-
* @see addFieldToFilter()
|
451 |
-
* @see addCallbackFilter()
|
452 |
-
*/
|
453 |
-
public function filterCallbackInArray($field, $filterValue, $row)
|
454 |
-
{
|
455 |
-
return in_array($row[$field], $filterValue);
|
456 |
-
}
|
457 |
-
|
458 |
-
/**
|
459 |
-
* Callback method for 'isnull' fancy filter
|
460 |
-
*
|
461 |
-
* @param string $field
|
462 |
-
* @param mixed $filterValue
|
463 |
-
* @param array $row
|
464 |
-
* @return bool
|
465 |
-
* @see addFieldToFilter()
|
466 |
-
* @see addCallbackFilter()
|
467 |
-
*/
|
468 |
-
public function filterCallbackIsNull($field, $filterValue, $row)
|
469 |
-
{
|
470 |
-
return null === $row[$field];
|
471 |
-
}
|
472 |
-
|
473 |
-
/**
|
474 |
-
* Callback method for 'moreq' fancy filter
|
475 |
-
*
|
476 |
-
* @param string $field
|
477 |
-
* @param mixed $filterValue
|
478 |
-
* @param array $row
|
479 |
-
* @return bool
|
480 |
-
* @see addFieldToFilter()
|
481 |
-
* @see addCallbackFilter()
|
482 |
-
*/
|
483 |
-
public function filterCallbackIsMoreThan($field, $filterValue, $row)
|
484 |
-
{
|
485 |
-
return $row[$field] > $filterValue;
|
486 |
-
}
|
487 |
-
|
488 |
-
/**
|
489 |
-
* Callback method for 'lteq' fancy filter
|
490 |
-
*
|
491 |
-
* @param string $field
|
492 |
-
* @param mixed $filterValue
|
493 |
-
* @param array $row
|
494 |
-
* @return bool
|
495 |
-
* @see addFieldToFilter()
|
496 |
-
* @see addCallbackFilter()
|
497 |
-
*/
|
498 |
-
public function filterCallbackIsLessThan($field, $filterValue, $row)
|
499 |
-
{
|
500 |
-
return $row[$field] < $filterValue;
|
501 |
-
}
|
502 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Model/Resource/Module/RemoteCollection.php
DELETED
@@ -1,165 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Model_Resource_Module_RemoteCollection extends Varien_Data_Collection
|
4 |
-
{
|
5 |
-
const XML_FEED_URL_PATH = 'tmcore/modules/feed_url';
|
6 |
-
|
7 |
-
protected $_collectedModules = array();
|
8 |
-
|
9 |
-
/**
|
10 |
-
* Lauch data collecting
|
11 |
-
*
|
12 |
-
* @param bool $printQuery
|
13 |
-
* @param bool $logQuery
|
14 |
-
* @return Varien_Data_Collection_Filesystem
|
15 |
-
*/
|
16 |
-
public function loadData($printQuery = false, $logQuery = false)
|
17 |
-
{
|
18 |
-
if ($this->isLoaded()) {
|
19 |
-
return $this;
|
20 |
-
}
|
21 |
-
|
22 |
-
try {
|
23 |
-
$client = new Zend_Http_Client();
|
24 |
-
$adapter = new Zend_Http_Client_Adapter_Curl();
|
25 |
-
$client->setAdapter($adapter);
|
26 |
-
$client->setUri($this->_getFeedUri());
|
27 |
-
$client->setConfig(array('maxredirects'=>0, 'timeout'=>30));
|
28 |
-
$client->setParameterGet('domain', Mage::app()->getRequest()->getHttpHost());
|
29 |
-
$responseBody = $client->request()->getBody();
|
30 |
-
$modules = Mage::helper('core')->jsonDecode($responseBody);
|
31 |
-
if (!is_array($modules)) {
|
32 |
-
throw new Exception('Decoding failed');
|
33 |
-
}
|
34 |
-
} catch (Exception $e) {
|
35 |
-
// @todo remove this fix and add error message
|
36 |
-
$modules = array(
|
37 |
-
'TM_Core' => array(
|
38 |
-
'code' => 'TM_Core',
|
39 |
-
'version' => '',
|
40 |
-
'changelog' => '',
|
41 |
-
'link' => '',
|
42 |
-
'download_link' => '',
|
43 |
-
'identity_key_link' => ''
|
44 |
-
),
|
45 |
-
'TM_License' => array(
|
46 |
-
'code' => 'TM_License',
|
47 |
-
'version' => '',
|
48 |
-
'changelog' => '',
|
49 |
-
'link' => '',
|
50 |
-
'download_link' => '',
|
51 |
-
'identity_key_link' => ''
|
52 |
-
),
|
53 |
-
'TM_Argento' => array(
|
54 |
-
'code' => 'TM_Argento',
|
55 |
-
'version' => '',
|
56 |
-
'changelog' => '',
|
57 |
-
'link' => '',
|
58 |
-
'download_link' => '',
|
59 |
-
'identity_key_link' => '',
|
60 |
-
'changelog' => ""
|
61 |
-
),
|
62 |
-
'TM_ArgentoArgento' => array(
|
63 |
-
'code' => 'TM_ArgentoArgento',
|
64 |
-
'version' => '',
|
65 |
-
'changelog' => "",
|
66 |
-
'link' => 'http://argentotheme.com',
|
67 |
-
'download_link' => 'https://argentotheme.com/downloadable/customer/products/',
|
68 |
-
'identity_key_link' => 'https://argentotheme.com/license/customer/identity/'
|
69 |
-
),
|
70 |
-
'TM_ArgentoFlat' => array(
|
71 |
-
'code' => 'TM_ArgentoFlat',
|
72 |
-
'version' => '',
|
73 |
-
'changelog' => "",
|
74 |
-
'link' => 'http://argentotheme.com',
|
75 |
-
'download_link' => 'https://argentotheme.com/downloadable/customer/products/',
|
76 |
-
'identity_key_link' => 'https://argentotheme.com/license/customer/identity/'
|
77 |
-
),
|
78 |
-
'TM_ArgentoMage2Cloud' => array(
|
79 |
-
'code' => 'TM_ArgentoMage2Cloud',
|
80 |
-
'version' => '',
|
81 |
-
'changelog' => "",
|
82 |
-
'link' => 'http://argentotheme.com',
|
83 |
-
'download_link' => '',
|
84 |
-
'identity_key_link' => ''
|
85 |
-
),
|
86 |
-
'TM_ArgentoMall' => array(
|
87 |
-
'code' => 'TM_ArgentoMall',
|
88 |
-
'version' => '',
|
89 |
-
'changelog' => "",
|
90 |
-
'link' => 'http://argentotheme.com',
|
91 |
-
'download_link' => 'https://argentotheme.com/downloadable/customer/products/',
|
92 |
-
'identity_key_link' => 'https://argentotheme.com/license/customer/identity/'
|
93 |
-
),
|
94 |
-
'TM_ArgentoPure' => array(
|
95 |
-
'code' => 'TM_ArgentoPure',
|
96 |
-
'version' => '',
|
97 |
-
'changelog' => "",
|
98 |
-
'link' => 'http://argentotheme.com',
|
99 |
-
'download_link' => 'https://argentotheme.com/downloadable/customer/products/',
|
100 |
-
'identity_key_link' => 'https://argentotheme.com/license/customer/identity/'
|
101 |
-
),
|
102 |
-
'TM_ArgentoPure2' => array(
|
103 |
-
'code' => 'TM_ArgentoPure2',
|
104 |
-
'version' => '',
|
105 |
-
'changelog' => "",
|
106 |
-
'link' => 'http://argentotheme.com',
|
107 |
-
'download_link' => 'https://argentotheme.com/downloadable/customer/products/',
|
108 |
-
'identity_key_link' => 'https://argentotheme.com/license/customer/identity/'
|
109 |
-
),
|
110 |
-
'TM_ArgentoTM' => array(
|
111 |
-
'code' => 'TM_ArgentoTM',
|
112 |
-
'version' => '',
|
113 |
-
'changelog' => "",
|
114 |
-
'link' => 'http://argentotheme.com',
|
115 |
-
'download_link' => '',
|
116 |
-
'identity_key_link' => ''
|
117 |
-
),
|
118 |
-
'Swissup_Subscription' => array(
|
119 |
-
'code' => 'Swissup_Subscription',
|
120 |
-
'version' => '',
|
121 |
-
'changelog' => "",
|
122 |
-
'link' => 'http://swissuplabs.com',
|
123 |
-
'download_link' => 'https://swissuplabs.com/subscription/customer/products/',
|
124 |
-
'identity_key_link' => 'https://swissuplabs.com/license/customer/identity/'
|
125 |
-
)
|
126 |
-
);
|
127 |
-
}
|
128 |
-
|
129 |
-
foreach ($modules as $moduleName => $values) {
|
130 |
-
$values['id'] = $values['code'];
|
131 |
-
$this->_collectedModules[$values['code']] = $values;
|
132 |
-
}
|
133 |
-
|
134 |
-
// calculate totals
|
135 |
-
$this->_totalRecords = count($this->_collectedModules);
|
136 |
-
$this->_setIsLoaded();
|
137 |
-
|
138 |
-
// paginate and add items
|
139 |
-
$from = ($this->getCurPage() - 1) * $this->getPageSize();
|
140 |
-
$to = $from + $this->getPageSize() - 1;
|
141 |
-
$isPaginated = $this->getPageSize() > 0;
|
142 |
-
|
143 |
-
$cnt = 0;
|
144 |
-
foreach ($this->_collectedModules as $row) {
|
145 |
-
$cnt++;
|
146 |
-
if ($isPaginated && ($cnt < $from || $cnt > $to)) {
|
147 |
-
continue;
|
148 |
-
}
|
149 |
-
$item = new $this->_itemObjectClass();
|
150 |
-
$this->addItem($item->addData($row));
|
151 |
-
if (!$item->hasId()) {
|
152 |
-
$item->setId($cnt);
|
153 |
-
}
|
154 |
-
}
|
155 |
-
|
156 |
-
return $this;
|
157 |
-
}
|
158 |
-
|
159 |
-
protected function _getFeedUri()
|
160 |
-
{
|
161 |
-
$useHttps = Mage::getStoreConfigFlag(TM_Core_Model_Module::XML_USE_HTTPS_PATH);
|
162 |
-
return ($useHttps ? 'https://' : 'http://')
|
163 |
-
. Mage::getStoreConfig(self::XML_FEED_URL_PATH);
|
164 |
-
}
|
165 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Model/Resource/Support/Collection.php
DELETED
@@ -1,416 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Model_Resource_Support_Collection extends Varien_Data_Collection
|
4 |
-
{
|
5 |
-
|
6 |
-
protected $_rawItems = array();
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Filter rendering helper variables
|
10 |
-
*
|
11 |
-
* @see Varien_Data_Collection::$_filter
|
12 |
-
* @see Varien_Data_Collection::$_isFiltersRendered
|
13 |
-
*/
|
14 |
-
private $_filterIncrement = 0;
|
15 |
-
private $_filterBrackets = array();
|
16 |
-
private $_filterEvalRendered = '';
|
17 |
-
|
18 |
-
|
19 |
-
public function setFromArray(array $_items)
|
20 |
-
{
|
21 |
-
$this->_rawItems = $_items;
|
22 |
-
return $this;
|
23 |
-
}
|
24 |
-
|
25 |
-
/**
|
26 |
-
* Lauch data collecting
|
27 |
-
*
|
28 |
-
* @param bool $printQuery
|
29 |
-
* @param bool $logQuery
|
30 |
-
* @return Varien_Data_Collection_Filesystem
|
31 |
-
*/
|
32 |
-
public function loadData($printQuery = false, $logQuery = false)
|
33 |
-
{
|
34 |
-
if ($this->isLoaded()) {
|
35 |
-
return $this;
|
36 |
-
}
|
37 |
-
|
38 |
-
$this->_filterAndSort();
|
39 |
-
|
40 |
-
// calculate totals
|
41 |
-
$this->_totalRecords = count($this->_rawItems);
|
42 |
-
$this->_setIsLoaded();
|
43 |
-
|
44 |
-
// paginate and add items
|
45 |
-
$from = ($this->getCurPage() - 1) * $this->getPageSize();
|
46 |
-
$to = $from + $this->getPageSize() - 1;
|
47 |
-
$isPaginated = $this->getPageSize() > 0;
|
48 |
-
|
49 |
-
$cnt = 0;
|
50 |
-
foreach ($this->_rawItems as $row) {
|
51 |
-
$cnt++;
|
52 |
-
if ($isPaginated && ($cnt < $from || $cnt > $to)) {
|
53 |
-
continue;
|
54 |
-
}
|
55 |
-
$item = new $this->_itemObjectClass();
|
56 |
-
$this->addItem($item->addData($row));
|
57 |
-
if (!$item->hasId()) {
|
58 |
-
$item->setId($cnt);
|
59 |
-
}
|
60 |
-
}
|
61 |
-
|
62 |
-
return $this;
|
63 |
-
}
|
64 |
-
|
65 |
-
/**
|
66 |
-
* With specified collected items:
|
67 |
-
* - generate data
|
68 |
-
* - apply filters
|
69 |
-
* - sort
|
70 |
-
*
|
71 |
-
* @param string $attributeName '_collectedFiles' | '_collectedDirs'
|
72 |
-
*/
|
73 |
-
private function _filterAndSort()
|
74 |
-
{
|
75 |
-
// apply filters on generated data
|
76 |
-
if (!empty($this->_filters)) {
|
77 |
-
foreach ($this->_rawItems as $key => $row) {
|
78 |
-
if (!$this->_filterRow($row)) {
|
79 |
-
unset($this->_rawItems[$key]);
|
80 |
-
}
|
81 |
-
}
|
82 |
-
}
|
83 |
-
|
84 |
-
// sort (keys are lost!)
|
85 |
-
if (!empty($this->_orders)) {
|
86 |
-
usort($this->_rawItems, array($this, '_usort'));
|
87 |
-
}
|
88 |
-
}
|
89 |
-
|
90 |
-
protected function _usort($a, $b)
|
91 |
-
{
|
92 |
-
foreach ($this->_orders as $key => $direction) {
|
93 |
-
$result = $a[$key] > $b[$key] ? 1 : ($a[$key] < $b[$key] ? -1 : 0);
|
94 |
-
return (self::SORT_ORDER_ASC === strtoupper($direction) ? $result : -$result);
|
95 |
-
break;
|
96 |
-
}
|
97 |
-
}
|
98 |
-
|
99 |
-
/**
|
100 |
-
* Set select order
|
101 |
-
* Currently supports only sorting by one column
|
102 |
-
*
|
103 |
-
* @param string $field
|
104 |
-
* @param string $direction
|
105 |
-
* @return Varien_Data_Collection
|
106 |
-
*/
|
107 |
-
public function setOrder($field, $direction = self::SORT_ORDER_DESC)
|
108 |
-
{
|
109 |
-
$this->_orders = array($field => $direction);
|
110 |
-
return $this;
|
111 |
-
}
|
112 |
-
|
113 |
-
/**
|
114 |
-
* Set a custom filter with callback
|
115 |
-
* The callback must take 3 params:
|
116 |
-
* string $field - field key,
|
117 |
-
* mixed $filterValue - value to filter by,
|
118 |
-
* array $row - a generated row (before generaring varien objects)
|
119 |
-
*
|
120 |
-
* @param string $field
|
121 |
-
* @param mixed $value
|
122 |
-
* @param string $type 'and'|'or'
|
123 |
-
* @param callback $callback
|
124 |
-
* @param bool $isInverted
|
125 |
-
* @return Varien_Data_Collection_Filesystem
|
126 |
-
*/
|
127 |
-
public function addCallbackFilter($field, $value, $type, $callback, $isInverted = false)
|
128 |
-
{
|
129 |
-
$this->_filters[$this->_filterIncrement] = array(
|
130 |
-
'field' => $field,
|
131 |
-
'value' => $value,
|
132 |
-
'is_and' => 'and' === $type,
|
133 |
-
'callback' => $callback,
|
134 |
-
'is_inverted' => $isInverted
|
135 |
-
);
|
136 |
-
$this->_filterIncrement++;
|
137 |
-
return $this;
|
138 |
-
}
|
139 |
-
|
140 |
-
/**
|
141 |
-
* The filters renderer and caller
|
142 |
-
* Aplies to each row, renders once.
|
143 |
-
*
|
144 |
-
* @param array $row
|
145 |
-
* @return bool
|
146 |
-
*/
|
147 |
-
protected function _filterRow($row)
|
148 |
-
{
|
149 |
-
// render filters once
|
150 |
-
if (!$this->_isFiltersRendered) {
|
151 |
-
$eval = '';
|
152 |
-
for ($i = 0; $i < $this->_filterIncrement; $i++) {
|
153 |
-
if (isset($this->_filterBrackets[$i])) {
|
154 |
-
$eval .= $this->_renderConditionBeforeFilterElement($i, $this->_filterBrackets[$i]['is_and'])
|
155 |
-
. $this->_filterBrackets[$i]['value'];
|
156 |
-
}
|
157 |
-
else {
|
158 |
-
$f = '$this->_filters[' . $i . ']';
|
159 |
-
$eval .= $this->_renderConditionBeforeFilterElement($i, $this->_filters[$i]['is_and'])
|
160 |
-
. ($this->_filters[$i]['is_inverted'] ? '!' : '')
|
161 |
-
. '$this->_invokeFilter(' . "{$f}['callback'], array({$f}['field'], {$f}['value'], " . '$row))';
|
162 |
-
}
|
163 |
-
}
|
164 |
-
$this->_filterEvalRendered = $eval;
|
165 |
-
$this->_isFiltersRendered = true;
|
166 |
-
}
|
167 |
-
$result = false;
|
168 |
-
if ($this->_filterEvalRendered) {
|
169 |
-
eval('$result = ' . $this->_filterEvalRendered . ';');
|
170 |
-
}
|
171 |
-
return $result;
|
172 |
-
}
|
173 |
-
|
174 |
-
/**
|
175 |
-
* Invokes specified callback
|
176 |
-
* Skips, if there is no filtered key in the row
|
177 |
-
*
|
178 |
-
* @param callback $callback
|
179 |
-
* @param array $callbackParams
|
180 |
-
* @return bool
|
181 |
-
*/
|
182 |
-
protected function _invokeFilter($callback, $callbackParams)
|
183 |
-
{
|
184 |
-
list($field, $value, $row) = $callbackParams;
|
185 |
-
if (!array_key_exists($field, $row)) {
|
186 |
-
return false;
|
187 |
-
}
|
188 |
-
return call_user_func_array($callback, $callbackParams);
|
189 |
-
}
|
190 |
-
|
191 |
-
/**
|
192 |
-
* Fancy field filter
|
193 |
-
*
|
194 |
-
* @param string $field
|
195 |
-
* @param mixed $cond
|
196 |
-
* @param string $type 'and' | 'or'
|
197 |
-
* @see Varien_Data_Collection_Db::addFieldToFilter()
|
198 |
-
* @return Varien_Data_Collection_Filesystem
|
199 |
-
*/
|
200 |
-
public function addFieldToFilter($field, $cond, $type = 'and')
|
201 |
-
{
|
202 |
-
$inverted = true;
|
203 |
-
|
204 |
-
// simply check whether equals
|
205 |
-
if (!is_array($cond)) {
|
206 |
-
return $this->addCallbackFilter($field, $cond, $type, array($this, 'filterCallbackEq'));
|
207 |
-
}
|
208 |
-
|
209 |
-
// versatile filters
|
210 |
-
if (isset($cond['from']) || isset($cond['to'])) {
|
211 |
-
$this->_addFilterBracket('(', 'and' === $type);
|
212 |
-
if (isset($cond['from'])) {
|
213 |
-
$this->addCallbackFilter($field, $cond['from'], 'and', array($this, 'filterCallbackIsLessThan'), $inverted);
|
214 |
-
}
|
215 |
-
if (isset($cond['to'])) {
|
216 |
-
$this->addCallbackFilter($field, $cond['to'], 'and', array($this, 'filterCallbackIsMoreThan'), $inverted);
|
217 |
-
}
|
218 |
-
return $this->_addFilterBracket(')');
|
219 |
-
}
|
220 |
-
if (isset($cond['eq'])) {
|
221 |
-
return $this->addCallbackFilter($field, $cond['eq'], $type, array($this, 'filterCallbackEq'));
|
222 |
-
}
|
223 |
-
if (isset($cond['neq'])) {
|
224 |
-
return $this->addCallbackFilter($field, $cond['neq'], $type, array($this, 'filterCallbackEq'), $inverted);
|
225 |
-
}
|
226 |
-
if (isset($cond['like'])) {
|
227 |
-
return $this->addCallbackFilter($field, $cond['like'], $type, array($this, 'filterCallbackLike'));
|
228 |
-
}
|
229 |
-
if (isset($cond['nlike'])) {
|
230 |
-
return $this->addCallbackFilter($field, $cond['nlike'], $type, array($this, 'filterCallbackLike'), $inverted);
|
231 |
-
}
|
232 |
-
if (isset($cond['in'])) {
|
233 |
-
return $this->addCallbackFilter($field, $cond['in'], $type, array($this, 'filterCallbackInArray'));
|
234 |
-
}
|
235 |
-
if (isset($cond['nin'])) {
|
236 |
-
return $this->addCallbackFilter($field, $cond['nin'], $type, array($this, 'filterCallbackInArray'), $inverted);
|
237 |
-
}
|
238 |
-
if (isset($cond['notnull'])) {
|
239 |
-
return $this->addCallbackFilter($field, $cond['notnull'], $type, array($this, 'filterCallbackIsNull'), $inverted);
|
240 |
-
}
|
241 |
-
if (isset($cond['null'])) {
|
242 |
-
return $this->addCallbackFilter($field, $cond['null'], $type, array($this, 'filterCallbackIsNull'));
|
243 |
-
}
|
244 |
-
if (isset($cond['moreq'])) {
|
245 |
-
return $this->addCallbackFilter($field, $cond['moreq'], $type, array($this, 'filterCallbackIsLessThan'), $inverted);
|
246 |
-
}
|
247 |
-
if (isset($cond['gt'])) {
|
248 |
-
return $this->addCallbackFilter($field, $cond['gt'], $type, array($this, 'filterCallbackIsMoreThan'));
|
249 |
-
}
|
250 |
-
if (isset($cond['lt'])) {
|
251 |
-
return $this->addCallbackFilter($field, $cond['lt'], $type, array($this, 'filterCallbackIsLessThan'));
|
252 |
-
}
|
253 |
-
if (isset($cond['gteq'])) {
|
254 |
-
return $this->addCallbackFilter($field, $cond['gteq'], $type, array($this, 'filterCallbackIsLessThan'), $inverted);
|
255 |
-
}
|
256 |
-
if (isset($cond['lteq'])) {
|
257 |
-
return $this->addCallbackFilter($field, $cond['lteq'], $type, array($this, 'filterCallbackIsMoreThan'), $inverted);
|
258 |
-
}
|
259 |
-
if (isset($cond['finset'])) {
|
260 |
-
$filterValue = ($cond['finset'] ? explode(',', $cond['finset']) : array());
|
261 |
-
return $this->addCallbackFilter($field, $filterValue, $type, array($this, 'filterCallbackInArray'));
|
262 |
-
}
|
263 |
-
|
264 |
-
// add OR recursively
|
265 |
-
foreach ($cond as $orCond) {
|
266 |
-
$this->_addFilterBracket('(', 'and' === $type);
|
267 |
-
$this->addFieldToFilter($field, $orCond, 'or');
|
268 |
-
$this->_addFilterBracket(')');
|
269 |
-
}
|
270 |
-
return $this;
|
271 |
-
}
|
272 |
-
|
273 |
-
/**
|
274 |
-
* Prepare a bracket into filters
|
275 |
-
*
|
276 |
-
* @param string $bracket
|
277 |
-
* @param bool $isAnd
|
278 |
-
* @return Varien_Data_Collection_Filesystem
|
279 |
-
*/
|
280 |
-
protected function _addFilterBracket($bracket = '(', $isAnd = true)
|
281 |
-
{
|
282 |
-
$this->_filterBrackets[$this->_filterIncrement] = array(
|
283 |
-
'value' => $bracket === ')' ? ')' : '(',
|
284 |
-
'is_and' => $isAnd,
|
285 |
-
);
|
286 |
-
$this->_filterIncrement++;
|
287 |
-
return $this;
|
288 |
-
}
|
289 |
-
|
290 |
-
/**
|
291 |
-
* Render condition sign before element, if required
|
292 |
-
*
|
293 |
-
* @param int $increment
|
294 |
-
* @param bool $isAnd
|
295 |
-
* @return string
|
296 |
-
*/
|
297 |
-
protected function _renderConditionBeforeFilterElement($increment, $isAnd)
|
298 |
-
{
|
299 |
-
if (isset($this->_filterBrackets[$increment]) && ')' === $this->_filterBrackets[$increment]['value']) {
|
300 |
-
return '';
|
301 |
-
}
|
302 |
-
$prevIncrement = $increment - 1;
|
303 |
-
$prevBracket = false;
|
304 |
-
if (isset($this->_filterBrackets[$prevIncrement])) {
|
305 |
-
$prevBracket = $this->_filterBrackets[$prevIncrement]['value'];
|
306 |
-
}
|
307 |
-
if ($prevIncrement < 0 || $prevBracket === '(') {
|
308 |
-
return '';
|
309 |
-
}
|
310 |
-
return ($isAnd ? ' && ' : ' || ');
|
311 |
-
}
|
312 |
-
|
313 |
-
/**
|
314 |
-
* Does nothing. Intentionally disabled parent method
|
315 |
-
*
|
316 |
-
* @return Varien_Data_Collection_Filesystem
|
317 |
-
*/
|
318 |
-
public function addFilter($field, $value, $type = 'and')
|
319 |
-
{
|
320 |
-
return $this;
|
321 |
-
}
|
322 |
-
|
323 |
-
/**
|
324 |
-
* Callback method for 'like' fancy filter
|
325 |
-
*
|
326 |
-
* @param string $field
|
327 |
-
* @param mixed $filterValue
|
328 |
-
* @param array $row
|
329 |
-
* @return bool
|
330 |
-
* @see addFieldToFilter()
|
331 |
-
* @see addCallbackFilter()
|
332 |
-
*/
|
333 |
-
public function filterCallbackLike($field, $filterValue, $row)
|
334 |
-
{
|
335 |
-
// removing single quotes, added by filter for mysql query: "'%FILTER_TEXT%'"
|
336 |
-
$filterValue = preg_replace("/(^')(.*)('$)/", "$2", $filterValue);
|
337 |
-
|
338 |
-
$filterValueRegex = str_replace('%', '(.*?)', preg_quote($filterValue, '/'));
|
339 |
-
return (bool)preg_match("/^{$filterValueRegex}$/i", $row[$field]);
|
340 |
-
}
|
341 |
-
|
342 |
-
/**
|
343 |
-
* Callback method for 'eq' fancy filter
|
344 |
-
*
|
345 |
-
* @param string $field
|
346 |
-
* @param mixed $filterValue
|
347 |
-
* @param array $row
|
348 |
-
* @return bool
|
349 |
-
* @see addFieldToFilter()
|
350 |
-
* @see addCallbackFilter()
|
351 |
-
*/
|
352 |
-
public function filterCallbackEq($field, $filterValue, $row)
|
353 |
-
{
|
354 |
-
return $filterValue == $row[$field];
|
355 |
-
}
|
356 |
-
|
357 |
-
/**
|
358 |
-
* Callback method for 'in' fancy filter
|
359 |
-
*
|
360 |
-
* @param string $field
|
361 |
-
* @param mixed $filterValue
|
362 |
-
* @param array $row
|
363 |
-
* @return bool
|
364 |
-
* @see addFieldToFilter()
|
365 |
-
* @see addCallbackFilter()
|
366 |
-
*/
|
367 |
-
public function filterCallbackInArray($field, $filterValue, $row)
|
368 |
-
{
|
369 |
-
return in_array($row[$field], $filterValue);
|
370 |
-
}
|
371 |
-
|
372 |
-
/**
|
373 |
-
* Callback method for 'isnull' fancy filter
|
374 |
-
*
|
375 |
-
* @param string $field
|
376 |
-
* @param mixed $filterValue
|
377 |
-
* @param array $row
|
378 |
-
* @return bool
|
379 |
-
* @see addFieldToFilter()
|
380 |
-
* @see addCallbackFilter()
|
381 |
-
*/
|
382 |
-
public function filterCallbackIsNull($field, $filterValue, $row)
|
383 |
-
{
|
384 |
-
return null === $row[$field];
|
385 |
-
}
|
386 |
-
|
387 |
-
/**
|
388 |
-
* Callback method for 'moreq' fancy filter
|
389 |
-
*
|
390 |
-
* @param string $field
|
391 |
-
* @param mixed $filterValue
|
392 |
-
* @param array $row
|
393 |
-
* @return bool
|
394 |
-
* @see addFieldToFilter()
|
395 |
-
* @see addCallbackFilter()
|
396 |
-
*/
|
397 |
-
public function filterCallbackIsMoreThan($field, $filterValue, $row)
|
398 |
-
{
|
399 |
-
return $row[$field] > $filterValue;
|
400 |
-
}
|
401 |
-
|
402 |
-
/**
|
403 |
-
* Callback method for 'lteq' fancy filter
|
404 |
-
*
|
405 |
-
* @param string $field
|
406 |
-
* @param mixed $filterValue
|
407 |
-
* @param array $row
|
408 |
-
* @return bool
|
409 |
-
* @see addFieldToFilter()
|
410 |
-
* @see addCallbackFilter()
|
411 |
-
*/
|
412 |
-
public function filterCallbackIsLessThan($field, $filterValue, $row)
|
413 |
-
{
|
414 |
-
return $row[$field] < $filterValue;
|
415 |
-
}
|
416 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/Model/Timer.php
DELETED
@@ -1,65 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/**
|
4 |
-
* Usage example:
|
5 |
-
*
|
6 |
-
* 1. $this->_timer = Mage::getModel('tmcore/timer', array('name' => 'tm_crawler'));
|
7 |
-
*
|
8 |
-
* 2. $this->_timer->startOrResume();
|
9 |
-
*
|
10 |
-
* 3. $limit = $this->_timer->getTimeLimit() / 3;
|
11 |
-
* if ($this->_timer->getElapsedSecs() >= $limit) {
|
12 |
-
* return;
|
13 |
-
* }
|
14 |
-
*/
|
15 |
-
class TM_Core_Model_Timer extends Varien_Object
|
16 |
-
{
|
17 |
-
protected $_timers = array();
|
18 |
-
|
19 |
-
public function start($reset = false)
|
20 |
-
{
|
21 |
-
if ($reset) {
|
22 |
-
$this->_timers[$name]['start'] = microtime(true);
|
23 |
-
} else {
|
24 |
-
$this->startOrResume();
|
25 |
-
}
|
26 |
-
}
|
27 |
-
|
28 |
-
public function stop()
|
29 |
-
{
|
30 |
-
$this->_timers[$this->getName()]['stop'] = microtime(true);
|
31 |
-
}
|
32 |
-
|
33 |
-
public function startOrResume()
|
34 |
-
{
|
35 |
-
$name = $this->getName();
|
36 |
-
if (isset($this->_timers[$name])) {
|
37 |
-
return;
|
38 |
-
}
|
39 |
-
$this->_timers[$name]['start'] = microtime(true);
|
40 |
-
}
|
41 |
-
|
42 |
-
public function getElapsedSecs()
|
43 |
-
{
|
44 |
-
$now = microtime(true);
|
45 |
-
if (isset($this->_timers[$this->getName()]['stop'])) {
|
46 |
-
return $this->_timers[$this->getName()]['stop']
|
47 |
-
- $this->_timers[$this->getName()]['start'];
|
48 |
-
}
|
49 |
-
return $now - $this->_timers[$this->getName()]['start'];
|
50 |
-
}
|
51 |
-
|
52 |
-
/**
|
53 |
-
* Get max execution time
|
54 |
-
*
|
55 |
-
* @return int
|
56 |
-
*/
|
57 |
-
public function getTimeLimit()
|
58 |
-
{
|
59 |
-
$time = @ini_get('max_execution_time');
|
60 |
-
if (empty($time)) {
|
61 |
-
$time = 30;
|
62 |
-
}
|
63 |
-
return $time;
|
64 |
-
}
|
65 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/controllers/Adminhtml/Tmcore/ModuleController.php
DELETED
@@ -1,123 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Adminhtml_Tmcore_ModuleController extends Mage_Adminhtml_Controller_Action
|
4 |
-
{
|
5 |
-
protected function _initAction()
|
6 |
-
{
|
7 |
-
$this->loadLayout()
|
8 |
-
->_setActiveMenu('templates_master/tmcore_module')
|
9 |
-
->_addBreadcrumb('Templates Master', 'Templates Master')
|
10 |
-
->_addBreadcrumb(Mage::helper('tmcore')->__('Modules'), Mage::helper('tmcore')->__('Modules'));
|
11 |
-
return $this;
|
12 |
-
}
|
13 |
-
|
14 |
-
public function indexAction()
|
15 |
-
{
|
16 |
-
$this->_initAction();
|
17 |
-
$this->renderLayout();
|
18 |
-
}
|
19 |
-
|
20 |
-
/**
|
21 |
-
* Placeholder grid for AJAX request
|
22 |
-
*/
|
23 |
-
public function gridAction()
|
24 |
-
{
|
25 |
-
$this->loadLayout();
|
26 |
-
$this->renderLayout();
|
27 |
-
}
|
28 |
-
|
29 |
-
public function manageAction()
|
30 |
-
{
|
31 |
-
if (!$this->getRequest()->getParam('id')) {
|
32 |
-
return $this->_redirect('*/*/index');
|
33 |
-
}
|
34 |
-
|
35 |
-
$module = Mage::getModel('tmcore/module');
|
36 |
-
$module->load($this->getRequest()->getParam('id'));
|
37 |
-
|
38 |
-
$data = Mage::getSingleton('adminhtml/session')->getFormData(true);
|
39 |
-
if (!empty($data)) {
|
40 |
-
$module->addData($data);
|
41 |
-
}
|
42 |
-
|
43 |
-
if ($info = Mage::getSingleton('adminhtml/session')->getTmValidationInfo(true)) {
|
44 |
-
$link = Mage::helper('tmcore/debug')->preparePopup(
|
45 |
-
$info['response'],
|
46 |
-
'SwissUpLabs subscription validation response'
|
47 |
-
);
|
48 |
-
Mage::getSingleton('adminhtml/session')->addError(
|
49 |
-
$info['error'] . ' | ' . $link
|
50 |
-
);
|
51 |
-
}
|
52 |
-
|
53 |
-
Mage::register('tmcore_module', $module);
|
54 |
-
|
55 |
-
$this->_initAction()
|
56 |
-
->_addBreadcrumb(Mage::helper('tmcore')->__('Manage'), Mage::helper('tmcore')->__('Manage'));
|
57 |
-
$this->renderLayout();
|
58 |
-
}
|
59 |
-
|
60 |
-
public function runAction()
|
61 |
-
{
|
62 |
-
if (!$this->getRequest()->isPost()) {
|
63 |
-
return $this->_redirect('*/*/index');
|
64 |
-
}
|
65 |
-
|
66 |
-
/**
|
67 |
-
* @var TM_Core_Model_Module
|
68 |
-
*/
|
69 |
-
$module = Mage::getModel('tmcore/module');
|
70 |
-
$module->load($this->getRequest()->getParam('id'))
|
71 |
-
->setSkipUpgrade($this->getRequest()->getPost('skip_upgrade', false))
|
72 |
-
->setNewStores($this->getRequest()->getPost('new_stores', array()))
|
73 |
-
->setIdentityKey($this->getRequest()->getParam('identity_key'));
|
74 |
-
|
75 |
-
$result = $module->validateLicense();
|
76 |
-
if (is_array($result) && isset($result['error'])) {
|
77 |
-
Mage::getSingleton('adminhtml/session')->setFormData($this->getRequest()->getPost());
|
78 |
-
|
79 |
-
$error = call_user_func_array(array(Mage::helper('tmcore'), '__'), $result['error']);
|
80 |
-
if (isset($result['response'])) {
|
81 |
-
Mage::getSingleton('adminhtml/session')->setTmValidationInfo(
|
82 |
-
array(
|
83 |
-
'error' => $error,
|
84 |
-
'response' => $result['response']
|
85 |
-
)
|
86 |
-
);
|
87 |
-
} else {
|
88 |
-
Mage::getSingleton('adminhtml/session')->addError($error);
|
89 |
-
}
|
90 |
-
return $this->_redirect('*/*/manage', array('id' => $module->getId()));
|
91 |
-
}
|
92 |
-
|
93 |
-
$module->up();
|
94 |
-
|
95 |
-
Mage::app()->cleanCache();
|
96 |
-
Mage::dispatchEvent('adminhtml_cache_flush_system');
|
97 |
-
|
98 |
-
$groupedErrors = $module->getMessageLogger()->getErrors();
|
99 |
-
if (count($groupedErrors)) {
|
100 |
-
foreach ($groupedErrors as $type => $errors) {
|
101 |
-
foreach ($errors as $error) {
|
102 |
-
if (is_array($error)) {
|
103 |
-
$message = $error['message'];
|
104 |
-
} else {
|
105 |
-
$message = $error;
|
106 |
-
}
|
107 |
-
Mage::getSingleton('adminhtml/session')->addError($message);
|
108 |
-
}
|
109 |
-
}
|
110 |
-
Mage::getSingleton('adminhtml/session')->setFormData($this->getRequest()->getPost());
|
111 |
-
return $this->_redirect('*/*/manage', array('id' => $module->getId()));
|
112 |
-
}
|
113 |
-
|
114 |
-
Mage::getSingleton('adminhtml/session')->setFormData(false);
|
115 |
-
Mage::getSingleton('adminhtml/session')->addSuccess(Mage::helper('tmcore')->__("The module has been saved"));
|
116 |
-
$this->_redirect('*/*/');
|
117 |
-
}
|
118 |
-
|
119 |
-
protected function _isAllowed()
|
120 |
-
{
|
121 |
-
return Mage::getSingleton('admin/session')->isAllowed('templates_master/tmcore_module');
|
122 |
-
}
|
123 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/controllers/Adminhtml/Tmcore/SupportController.php
DELETED
@@ -1,282 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
class TM_Core_Adminhtml_Tmcore_SupportController extends Mage_Adminhtml_Controller_Action
|
4 |
-
{
|
5 |
-
protected function _initAction()
|
6 |
-
{
|
7 |
-
$this->loadLayout()
|
8 |
-
->_setActiveMenu('templates_master/tmcore_module')
|
9 |
-
->_addBreadcrumb('Templates Master', 'Templates Master')
|
10 |
-
->_addBreadcrumb(Mage::helper('tmcore')->__('Support'), Mage::helper('tmcore')->__('Support'));
|
11 |
-
return $this;
|
12 |
-
}
|
13 |
-
|
14 |
-
/**
|
15 |
-
*
|
16 |
-
* @return string (uri)
|
17 |
-
*/
|
18 |
-
protected function _getApiHost()
|
19 |
-
{
|
20 |
-
// return 'http://mage.local';
|
21 |
-
return Mage::getStoreConfig('tmcore/troubleshooting/url');
|
22 |
-
}
|
23 |
-
|
24 |
-
/**
|
25 |
-
*
|
26 |
-
* @return Zend_Oauth_Client
|
27 |
-
*/
|
28 |
-
protected function _getRestApiClient()
|
29 |
-
{
|
30 |
-
$oAuthClient = Mage::getModel('tmcore/oauth_client');
|
31 |
-
$params = $oAuthClient->getConfigFromSession();
|
32 |
-
if (!$params) {
|
33 |
-
return false;
|
34 |
-
}
|
35 |
-
$oAuthClient->init($params);
|
36 |
-
$state = $oAuthClient->authenticate();
|
37 |
-
if ($state == TM_Core_Model_Oauth_Client::OAUTH_STATE_ACCESS_TOKEN) {
|
38 |
-
$accessToken = $oAuthClient->getAuthorizedToken();
|
39 |
-
}
|
40 |
-
$restClient = $accessToken->getHttpClient($params);
|
41 |
-
|
42 |
-
return $restClient;
|
43 |
-
}
|
44 |
-
|
45 |
-
/**
|
46 |
-
*
|
47 |
-
* @param type $response
|
48 |
-
* @return boolean
|
49 |
-
*/
|
50 |
-
protected function _prepareApiRestResponseErrorMessages($response)
|
51 |
-
{
|
52 |
-
if (!is_object($response) || !property_exists($response, 'messages')) {
|
53 |
-
return false;
|
54 |
-
}
|
55 |
-
$messages = $response->messages;
|
56 |
-
if ($messages) {
|
57 |
-
$errors = $messages->error;
|
58 |
-
if ($errors) {
|
59 |
-
foreach ($errors as $error) {
|
60 |
-
Mage::getSingleton('adminhtml/session')->addError(
|
61 |
-
$error->message
|
62 |
-
);
|
63 |
-
}
|
64 |
-
// $this->_redirectReferer();
|
65 |
-
// die;
|
66 |
-
return true;
|
67 |
-
}
|
68 |
-
}
|
69 |
-
return false;
|
70 |
-
}
|
71 |
-
|
72 |
-
/**
|
73 |
-
*
|
74 |
-
* @param string $uri
|
75 |
-
* @return \Varien_Object|\TM_Core_Model_Resource_Support_Collection
|
76 |
-
*/
|
77 |
-
protected function _getRestApiData($uri)
|
78 |
-
{
|
79 |
-
$restClient = $this->_getRestApiClient();
|
80 |
-
|
81 |
-
if (!$restClient) {
|
82 |
-
return false;
|
83 |
-
}
|
84 |
-
|
85 |
-
$restClient->setHeaders('Accept', 'application/json');
|
86 |
-
$restClient->setMethod(Zend_Http_Client::GET);
|
87 |
-
|
88 |
-
$host = $this->_getApiHost();
|
89 |
-
$restClient->setUri($host . '/api/rest' . $uri);
|
90 |
-
|
91 |
-
$response = $restClient->request();
|
92 |
-
$_items = json_decode($response->getBody());
|
93 |
-
|
94 |
-
$this->_prepareApiRestResponseErrorMessages($_items);
|
95 |
-
|
96 |
-
if (is_array($_items)) {
|
97 |
-
$collection = new TM_Core_Model_Resource_Support_Collection();
|
98 |
-
foreach ($_items as &$_item) {
|
99 |
-
$_item = (array)$_item;
|
100 |
-
}
|
101 |
-
$collection->setFromArray($_items);
|
102 |
-
return $collection;
|
103 |
-
}
|
104 |
-
$object = new Varien_Object();
|
105 |
-
$object->setData((array)$_items);
|
106 |
-
return $object;
|
107 |
-
}
|
108 |
-
|
109 |
-
/**
|
110 |
-
*
|
111 |
-
* @param type $uri
|
112 |
-
* @param type $params
|
113 |
-
* @return type
|
114 |
-
*/
|
115 |
-
protected function _setRestApiData($uri, $params)
|
116 |
-
{
|
117 |
-
$restClient = $this->_getRestApiClient();
|
118 |
-
|
119 |
-
if (!$restClient) {
|
120 |
-
return false;
|
121 |
-
}
|
122 |
-
|
123 |
-
$restClient->setHeaders('Accept', 'application/json');
|
124 |
-
$restClient->setHeaders('Content-Type','application/json');
|
125 |
-
$restClient->setEncType('application/json');
|
126 |
-
$restClient->setMethod(Zend_Http_Client::POST);
|
127 |
-
|
128 |
-
$host = $this->_getApiHost();
|
129 |
-
$restClient->setUri($host . '/api/rest' . $uri);
|
130 |
-
|
131 |
-
$restClient->setRawData(json_encode($params));
|
132 |
-
|
133 |
-
$response = $restClient->request();
|
134 |
-
$object = json_decode($response->getBody());
|
135 |
-
|
136 |
-
$this->_prepareApiRestResponseErrorMessages($object);
|
137 |
-
|
138 |
-
return $object;
|
139 |
-
}
|
140 |
-
|
141 |
-
public function oauthAction()
|
142 |
-
{
|
143 |
-
$host = $this->_getApiHost();
|
144 |
-
$consumerKey = Mage::getStoreConfig('tmcore/troubleshooting/consumer_key');
|
145 |
-
$consumerSecret = Mage::getStoreConfig('tmcore/troubleshooting/consumer_secret');
|
146 |
-
//Basic parameters that need to be provided for oAuth authentication
|
147 |
-
//on Magento
|
148 |
-
$params = array(
|
149 |
-
'siteUrl' => "{$host}/oauth",
|
150 |
-
'requestTokenUrl' => "{$host}/oauth/initiate",
|
151 |
-
'accessTokenUrl' => "{$host}/oauth/token",
|
152 |
-
'authorizeUrl' => "{$host}/oauth/authorize",
|
153 |
-
// 'authorizeUrl' => "{$magentohost}/admin/oauth_authorize", //This URL is used only if we authenticate as Admin user type
|
154 |
-
'consumerKey' => $consumerKey, //Consumer key registered in server administration
|
155 |
-
'consumerSecret' => $consumerSecret, //Consumer secret registered in server administration
|
156 |
-
'callbackUrl' => $this->getUrl('*/*/index')//Url of callback action below
|
157 |
-
);
|
158 |
-
$oAuthClient = Mage::getModel('tmcore/oauth_client');
|
159 |
-
$oAuthClient->reset();
|
160 |
-
$oAuthClient->init($params);
|
161 |
-
$oAuthClient->authenticate();
|
162 |
-
}
|
163 |
-
|
164 |
-
public function indexAction()
|
165 |
-
{
|
166 |
-
$collection = $this->_getRestApiData('/helpdesk/tickets');
|
167 |
-
|
168 |
-
if (empty($collection)) {
|
169 |
-
return $this->_redirect('*/*/oauth');
|
170 |
-
}
|
171 |
-
Mage::register('tmcore_support_collection', $collection);
|
172 |
-
|
173 |
-
$model = new Varien_Object();
|
174 |
-
|
175 |
-
$model->setDepartmets(
|
176 |
-
$this->_getRestApiData("/helpdesk/departments")
|
177 |
-
);
|
178 |
-
|
179 |
-
$model->setStatuses(
|
180 |
-
$this->_getRestApiData("/helpdesk/statuses")
|
181 |
-
);
|
182 |
-
|
183 |
-
$model->setPriorities(
|
184 |
-
$this->_getRestApiData("/helpdesk/priorities")
|
185 |
-
);
|
186 |
-
|
187 |
-
Mage::register('tmcore_support', $model);
|
188 |
-
|
189 |
-
$this->_initAction();
|
190 |
-
$this->renderLayout();
|
191 |
-
}
|
192 |
-
|
193 |
-
public function editAction()
|
194 |
-
{
|
195 |
-
$ticketId = $this->getRequest()->getParam('ticket_id');
|
196 |
-
|
197 |
-
$model = $this->_getRestApiData("/helpdesk/tickets/{$ticketId}");
|
198 |
-
|
199 |
-
if (empty($model)) {
|
200 |
-
return $this->_redirect('*/*/oauth');
|
201 |
-
}
|
202 |
-
|
203 |
-
$model->setTheards(
|
204 |
-
$this->_getRestApiData("/helpdesk/tickets/{$ticketId}/theards")
|
205 |
-
);
|
206 |
-
|
207 |
-
$model->setDepartmets(
|
208 |
-
$this->_getRestApiData("/helpdesk/departments")
|
209 |
-
);
|
210 |
-
|
211 |
-
$model->setStatuses(
|
212 |
-
$this->_getRestApiData("/helpdesk/statuses")
|
213 |
-
);
|
214 |
-
|
215 |
-
$model->setPriorities(
|
216 |
-
$this->_getRestApiData("/helpdesk/priorities")
|
217 |
-
);
|
218 |
-
|
219 |
-
Mage::register('tmcore_support', $model);
|
220 |
-
|
221 |
-
$this->_initAction();
|
222 |
-
$this->renderLayout();
|
223 |
-
}
|
224 |
-
|
225 |
-
public function newAction()
|
226 |
-
{
|
227 |
-
$model = new Varien_Object();
|
228 |
-
$model->setDepartmets(
|
229 |
-
$this->_getRestApiData("/helpdesk/departments")
|
230 |
-
);
|
231 |
-
|
232 |
-
$model->setStatuses(
|
233 |
-
$this->_getRestApiData("/helpdesk/statuses")
|
234 |
-
);
|
235 |
-
|
236 |
-
$model->setPriorities(
|
237 |
-
$this->_getRestApiData("/helpdesk/priorities")
|
238 |
-
);
|
239 |
-
|
240 |
-
Mage::register('tmcore_support', $model);
|
241 |
-
|
242 |
-
$this->_initAction();
|
243 |
-
$this->renderLayout();
|
244 |
-
}
|
245 |
-
|
246 |
-
public function saveAction()
|
247 |
-
{
|
248 |
-
$params = $this->getRequest()->getParams();
|
249 |
-
$ticketId = $this->getRequest()->getParam('id');
|
250 |
-
// $text = $this->getRequest()->getParam('text');
|
251 |
-
if (empty($params['text'])) {
|
252 |
-
throw new Exception('text is null');
|
253 |
-
}
|
254 |
-
//save ticket
|
255 |
-
if (empty($ticketId)) {
|
256 |
-
$response = $this->_setRestApiData("/helpdesk/tickets", array(
|
257 |
-
'title' => $params['title'],
|
258 |
-
'department_id' => $params['department_id'],
|
259 |
-
'priority' => $params['priority'],
|
260 |
-
'text' => $params['text'],
|
261 |
-
));
|
262 |
-
} else { //save theard
|
263 |
-
$response = $this->_setRestApiData(
|
264 |
-
"/helpdesk/tickets/{$ticketId}/theards",
|
265 |
-
array('text' => $params['text'])
|
266 |
-
);
|
267 |
-
}
|
268 |
-
// $messages = $response->messages;
|
269 |
-
// if ($messages) {
|
270 |
-
// $errors = $messages->error;
|
271 |
-
// if ($errors) {
|
272 |
-
// foreach ($errors as $error) {
|
273 |
-
// Mage::getSingleton('adminhtml/session')->addError($error->message);
|
274 |
-
// }
|
275 |
-
// }
|
276 |
-
// }
|
277 |
-
Mage::getSingleton('adminhtml/session')->addSuccess(
|
278 |
-
Mage::helper('tmcore')->__('Item was successfully saved')
|
279 |
-
);
|
280 |
-
$this->_redirectReferer();
|
281 |
-
}
|
282 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/etc/adminhtml.xml
DELETED
@@ -1,55 +0,0 @@
|
|
1 |
-
<?xml version="1.0"?>
|
2 |
-
<config>
|
3 |
-
<menu>
|
4 |
-
<templates_master>
|
5 |
-
<title>Templates Master</title>
|
6 |
-
<sort_order>71</sort_order>
|
7 |
-
<children>
|
8 |
-
<!-- <tmcore_support translate="title" module="tmcore">
|
9 |
-
<title>Support</title>
|
10 |
-
<sort_order>1339</sort_order>
|
11 |
-
<action>adminhtml/tmcore_support/index</action>
|
12 |
-
</tmcore_support>-->
|
13 |
-
|
14 |
-
<tmcore_module translate="title" module="tmcore">
|
15 |
-
<title>Modules</title>
|
16 |
-
<sort_order>1340</sort_order>
|
17 |
-
<action>adminhtml/tmcore_module/index</action>
|
18 |
-
</tmcore_module>
|
19 |
-
</children>
|
20 |
-
</templates_master>
|
21 |
-
</menu>
|
22 |
-
<acl>
|
23 |
-
<resources>
|
24 |
-
<admin>
|
25 |
-
<children>
|
26 |
-
<system>
|
27 |
-
<children>
|
28 |
-
<config>
|
29 |
-
<children>
|
30 |
-
<tmcore>
|
31 |
-
<title>Core</title>
|
32 |
-
</tmcore>
|
33 |
-
</children>
|
34 |
-
</config>
|
35 |
-
</children>
|
36 |
-
</system>
|
37 |
-
<templates_master>
|
38 |
-
<title>Templates Master</title>
|
39 |
-
<sort_order>71</sort_order>
|
40 |
-
<children>
|
41 |
-
<!-- <tmcore_support translate="title" module="tmcore">
|
42 |
-
<title>Support</title>
|
43 |
-
<sort_order>11</sort_order>
|
44 |
-
</tmcore_support> -->
|
45 |
-
<tmcore_module translate="title" module="tmcore">
|
46 |
-
<title>Modules</title>
|
47 |
-
<sort_order>1340</sort_order>
|
48 |
-
</tmcore_module>
|
49 |
-
</children>
|
50 |
-
</templates_master>
|
51 |
-
</children>
|
52 |
-
</admin>
|
53 |
-
</resources>
|
54 |
-
</acl>
|
55 |
-
</config>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/etc/config.xml
DELETED
@@ -1,153 +0,0 @@
|
|
1 |
-
<?xml version="1.0"?>
|
2 |
-
<config>
|
3 |
-
<modules>
|
4 |
-
<TM_Core>
|
5 |
-
<version>1.3.5</version>
|
6 |
-
</TM_Core>
|
7 |
-
</modules>
|
8 |
-
|
9 |
-
<global>
|
10 |
-
<models>
|
11 |
-
<tmcore>
|
12 |
-
<class>TM_Core_Model</class>
|
13 |
-
<resourceModel>tmcore_resource</resourceModel>
|
14 |
-
</tmcore>
|
15 |
-
<tmcore_resource>
|
16 |
-
<class>TM_Core_Model_Resource</class>
|
17 |
-
<entities>
|
18 |
-
<module>
|
19 |
-
<table>tm_core_module</table>
|
20 |
-
</module>
|
21 |
-
</entities>
|
22 |
-
</tmcore_resource>
|
23 |
-
</models>
|
24 |
-
<blocks>
|
25 |
-
<tmcore>
|
26 |
-
<class>TM_Core_Block</class>
|
27 |
-
</tmcore>
|
28 |
-
<cms>
|
29 |
-
<rewrite>
|
30 |
-
<block>TM_Core_Block_Cms_Block</block>
|
31 |
-
</rewrite>
|
32 |
-
</cms>
|
33 |
-
</blocks>
|
34 |
-
<helpers>
|
35 |
-
<tmcore>
|
36 |
-
<class>TM_Core_Helper</class>
|
37 |
-
</tmcore>
|
38 |
-
</helpers>
|
39 |
-
<resources>
|
40 |
-
<tm_core_setup>
|
41 |
-
<setup>
|
42 |
-
<module>TM_Core</module>
|
43 |
-
</setup>
|
44 |
-
<connection>
|
45 |
-
<use>core_setup</use>
|
46 |
-
</connection>
|
47 |
-
</tm_core_setup>
|
48 |
-
</resources>
|
49 |
-
<events>
|
50 |
-
<core_layout_update_updates_get_after>
|
51 |
-
<observers>
|
52 |
-
<tm_layout>
|
53 |
-
<type>model</type>
|
54 |
-
<class>tmcore/observer</class>
|
55 |
-
<method>addLayoutUpdate</method>
|
56 |
-
</tm_layout>
|
57 |
-
</observers>
|
58 |
-
</core_layout_update_updates_get_after>
|
59 |
-
</events>
|
60 |
-
</global>
|
61 |
-
|
62 |
-
<adminhtml>
|
63 |
-
<layout>
|
64 |
-
<updates>
|
65 |
-
<tmcore>
|
66 |
-
<file>tmcore.xml</file>
|
67 |
-
</tmcore>
|
68 |
-
</updates>
|
69 |
-
</layout>
|
70 |
-
<events>
|
71 |
-
<controller_action_predispatch>
|
72 |
-
<observers>
|
73 |
-
<tmcore>
|
74 |
-
<class>tmcore/observer</class>
|
75 |
-
<method>preDispatch</method>
|
76 |
-
</tmcore>
|
77 |
-
</observers>
|
78 |
-
</controller_action_predispatch>
|
79 |
-
</events>
|
80 |
-
<translate>
|
81 |
-
<modules>
|
82 |
-
<TM_Core>
|
83 |
-
<files>
|
84 |
-
<default>TM_Core.csv</default>
|
85 |
-
</files>
|
86 |
-
</TM_Core>
|
87 |
-
</modules>
|
88 |
-
</translate>
|
89 |
-
<events>
|
90 |
-
<controller_action_layout_render_before>
|
91 |
-
<observers>
|
92 |
-
<tmcore>
|
93 |
-
<class>tmcore/observer</class>
|
94 |
-
<method>onBeforeRenderLayout</method>
|
95 |
-
</tmcore>
|
96 |
-
</observers>
|
97 |
-
</controller_action_layout_render_before>
|
98 |
-
</events>
|
99 |
-
</adminhtml>
|
100 |
-
|
101 |
-
<frontend>
|
102 |
-
<layout>
|
103 |
-
<updates>
|
104 |
-
<tm_core>
|
105 |
-
<file>tm/core.xml</file>
|
106 |
-
</tm_core>
|
107 |
-
</updates>
|
108 |
-
</layout>
|
109 |
-
</frontend>
|
110 |
-
|
111 |
-
<admin>
|
112 |
-
<routers>
|
113 |
-
<adminhtml>
|
114 |
-
<args>
|
115 |
-
<modules>
|
116 |
-
<tmcore before="Mage_Adminhtml">TM_Core_Adminhtml</tmcore>
|
117 |
-
</modules>
|
118 |
-
</args>
|
119 |
-
</adminhtml>
|
120 |
-
</routers>
|
121 |
-
</admin>
|
122 |
-
|
123 |
-
<default>
|
124 |
-
<subscriptionchecker>
|
125 |
-
<ignored_sections>
|
126 |
-
<tmcore/>
|
127 |
-
</ignored_sections>
|
128 |
-
</subscriptionchecker>
|
129 |
-
<tmcore>
|
130 |
-
<modules>
|
131 |
-
<feed_url>templates-master.com/modules.json</feed_url>
|
132 |
-
</modules>
|
133 |
-
<license>
|
134 |
-
<use_https>0</use_https>
|
135 |
-
<url>/license/validate</url>
|
136 |
-
</license>
|
137 |
-
<notification>
|
138 |
-
<enabled>1</enabled>
|
139 |
-
<feed_url>templates-master.com/notifier</feed_url>
|
140 |
-
<use_https>0</use_https>
|
141 |
-
<frequency>24</frequency>
|
142 |
-
<filter>installed,promo,release,update,other</filter>
|
143 |
-
<last_update>0</last_update>
|
144 |
-
</notification>
|
145 |
-
<troubleshooting>
|
146 |
-
<text><![CDATA[Please <a href='http://templates-master.com/contacts' onclick='window.open(this.href); return false;'>contact us</a>, if you have some issues with one of our modules.]]></text>
|
147 |
-
<url>http://templates-master.com/</url>
|
148 |
-
<consumer_key>b96f1fdbcc5df5608bab036f23caead2</consumer_key>
|
149 |
-
<consumer_secret>b17bb7641ffcdb267264b39460eee8ae</consumer_secret>
|
150 |
-
</troubleshooting>
|
151 |
-
</tmcore>
|
152 |
-
</default>
|
153 |
-
</config>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/etc/system.xml
DELETED
@@ -1,113 +0,0 @@
|
|
1 |
-
<?xml version="1.0"?>
|
2 |
-
<config>
|
3 |
-
<tabs>
|
4 |
-
<templates_master>
|
5 |
-
<label>Templates-master</label>
|
6 |
-
<sort_order>195</sort_order>
|
7 |
-
</templates_master>
|
8 |
-
</tabs>
|
9 |
-
<sections>
|
10 |
-
<tmcore>
|
11 |
-
<label>Core</label>
|
12 |
-
<tab>templates_master</tab>
|
13 |
-
<frontend_type>text</frontend_type>
|
14 |
-
<sort_order>340</sort_order>
|
15 |
-
<show_in_default>1</show_in_default>
|
16 |
-
<show_in_website>1</show_in_website>
|
17 |
-
<show_in_store>1</show_in_store>
|
18 |
-
<groups>
|
19 |
-
<jslibs translate="label comment" module="tmcore">
|
20 |
-
<label>JavaScript libraries</label>
|
21 |
-
<show_in_default>1</show_in_default>
|
22 |
-
<show_in_website>1</show_in_website>
|
23 |
-
<show_in_store>1</show_in_store>
|
24 |
-
<fields>
|
25 |
-
<jquery translate="label">
|
26 |
-
<label>Enable jQuery</label>
|
27 |
-
<comment>version 1.10.2</comment>
|
28 |
-
<frontend_type>select</frontend_type>
|
29 |
-
<source_model>adminhtml/system_config_source_yesno</source_model>
|
30 |
-
<sort_order>10</sort_order>
|
31 |
-
<show_in_default>1</show_in_default>
|
32 |
-
<show_in_website>1</show_in_website>
|
33 |
-
<show_in_store>1</show_in_store>
|
34 |
-
</jquery>
|
35 |
-
</fields>
|
36 |
-
</jslibs>
|
37 |
-
<troubleshooting translate="label comment" module="tmcore">
|
38 |
-
<label>Troubleshooting</label>
|
39 |
-
<frontend_type>text</frontend_type>
|
40 |
-
<frontend_model>tmcore/adminhtml_system_config_form_fieldset_troubleshooting</frontend_model>
|
41 |
-
<sort_order>10</sort_order>
|
42 |
-
<show_in_default>1</show_in_default>
|
43 |
-
<show_in_website>0</show_in_website>
|
44 |
-
<show_in_store>0</show_in_store>
|
45 |
-
</troubleshooting>
|
46 |
-
<modules translate="label" module="tmcore">
|
47 |
-
<label>Modules Information</label>
|
48 |
-
<frontend_type>text</frontend_type>
|
49 |
-
<frontend_model>tmcore/adminhtml_system_config_form_fieldset_modules_list</frontend_model>
|
50 |
-
<sort_order>20</sort_order>
|
51 |
-
<show_in_default>1</show_in_default>
|
52 |
-
<show_in_website>0</show_in_website>
|
53 |
-
<show_in_store>0</show_in_store>
|
54 |
-
</modules>
|
55 |
-
<notification translate="label" module="tmcore">
|
56 |
-
<label>Notifications</label>
|
57 |
-
<frontend_type>text</frontend_type>
|
58 |
-
<sort_order>30</sort_order>
|
59 |
-
<show_in_default>1</show_in_default>
|
60 |
-
<show_in_website>0</show_in_website>
|
61 |
-
<show_in_store>0</show_in_store>
|
62 |
-
<fields>
|
63 |
-
<!-- <use_https translate="label">
|
64 |
-
<label>Use HTTPS to Get Feed</label>
|
65 |
-
<frontend_type>select</frontend_type>
|
66 |
-
<source_model>adminhtml/system_config_source_yesno</source_model>
|
67 |
-
<sort_order>10</sort_order>
|
68 |
-
<show_in_default>1</show_in_default>
|
69 |
-
<show_in_website>0</show_in_website>
|
70 |
-
<show_in_store>0</show_in_store>
|
71 |
-
</use_https> -->
|
72 |
-
<enabled translate="label">
|
73 |
-
<label>Enabled</label>
|
74 |
-
<frontend_type>select</frontend_type>
|
75 |
-
<source_model>adminhtml/system_config_source_yesno</source_model>
|
76 |
-
<sort_order>10</sort_order>
|
77 |
-
<show_in_default>1</show_in_default>
|
78 |
-
<show_in_website>0</show_in_website>
|
79 |
-
<show_in_store>0</show_in_store>
|
80 |
-
</enabled>
|
81 |
-
<frequency translate="label">
|
82 |
-
<label>Update Frequency</label>
|
83 |
-
<frontend_type>select</frontend_type>
|
84 |
-
<source_model>adminhtml/system_config_source_notification_frequency</source_model>
|
85 |
-
<sort_order>20</sort_order>
|
86 |
-
<show_in_default>1</show_in_default>
|
87 |
-
<show_in_website>0</show_in_website>
|
88 |
-
<show_in_store>0</show_in_store>
|
89 |
-
</frequency>
|
90 |
-
<filter translate="label" module="tmcore">
|
91 |
-
<label>News to show in notification bar</label>
|
92 |
-
<frontend_type>multiselect</frontend_type>
|
93 |
-
<source_model>tmcore/adminhtml_system_config_source_notification_channel</source_model>
|
94 |
-
<sort_order>25</sort_order>
|
95 |
-
<show_in_default>1</show_in_default>
|
96 |
-
<show_in_website>0</show_in_website>
|
97 |
-
<show_in_store>0</show_in_store>
|
98 |
-
</filter>
|
99 |
-
<last_update translate="label">
|
100 |
-
<label>Last Update</label>
|
101 |
-
<frontend_type>label</frontend_type>
|
102 |
-
<frontend_model>tmcore/adminhtml_system_config_form_field_notification</frontend_model>
|
103 |
-
<sort_order>30</sort_order>
|
104 |
-
<show_in_default>1</show_in_default>
|
105 |
-
<show_in_website>0</show_in_website>
|
106 |
-
<show_in_store>0</show_in_store>
|
107 |
-
</last_update>
|
108 |
-
</fields>
|
109 |
-
</notification>
|
110 |
-
</groups>
|
111 |
-
</tmcore>
|
112 |
-
</sections>
|
113 |
-
</config>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/sql/tm_core_setup/mysql4-install-1.0.0.php
DELETED
@@ -1,26 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/* @var $installer Mage_Core_Model_Resource_Setup */
|
4 |
-
$installer = $this;
|
5 |
-
|
6 |
-
$installer->startSetup();
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Create table 'tmcore/module'
|
10 |
-
*/
|
11 |
-
$typeText = defined('Varien_Db_Ddl_Table::TYPE_TEXT')
|
12 |
-
? Varien_Db_Ddl_Table::TYPE_TEXT : Varien_Db_Ddl_Table::TYPE_VARCHAR;
|
13 |
-
|
14 |
-
$table = $installer->getConnection()
|
15 |
-
->newTable($installer->getTable('tmcore/module'))
|
16 |
-
->addColumn('code', $typeText, 50, array(
|
17 |
-
'nullable' => false,
|
18 |
-
'primary' => true,
|
19 |
-
)
|
20 |
-
)
|
21 |
-
// ->addColumn('version', Varien_Db_Ddl_Table::TYPE_TEXT, 50)
|
22 |
-
->addColumn('data_version', $typeText, 50)
|
23 |
-
->addColumn('license_key', $typeText, 32);
|
24 |
-
$installer->getConnection()->createTable($table);
|
25 |
-
|
26 |
-
$installer->endSetup();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/community/TM/Core/sql/tm_core_setup/mysql4-upgrade-1.0.0-1.0.1.php
DELETED
@@ -1,12 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/* @var $installer Mage_Core_Model_Resource_Setup */
|
4 |
-
$installer = $this;
|
5 |
-
|
6 |
-
$installer->startSetup();
|
7 |
-
|
8 |
-
$tableName = $installer->getTable('tmcore/module');
|
9 |
-
$installer->getConnection()->changeColumn($tableName, 'license_key', 'identity_key', 'TEXT', true);
|
10 |
-
$installer->getConnection()->addColumn($tableName, 'store_ids', 'VARCHAR(64) NOT NULL');
|
11 |
-
|
12 |
-
$installer->endSetup();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/design/adminhtml/default/default/layout/tmcore.xml
DELETED
@@ -1,62 +0,0 @@
|
|
1 |
-
<?xml version="1.0"?>
|
2 |
-
<layout>
|
3 |
-
<adminhtml_tmcore_module_index>
|
4 |
-
<update handle="tmcore_popup"/>
|
5 |
-
<reference name="content">
|
6 |
-
<block type="tmcore/adminhtml_module" name="module.list"/>
|
7 |
-
</reference>
|
8 |
-
</adminhtml_tmcore_module_index>
|
9 |
-
|
10 |
-
<adminhtml_tmcore_module_grid>
|
11 |
-
<block type="tmcore/adminhtml_module_grid" name="root" output="toHtml"/>
|
12 |
-
</adminhtml_tmcore_module_grid>
|
13 |
-
|
14 |
-
<adminhtml_tmcore_module_manage>
|
15 |
-
<update handle="tmcore_popup"/>
|
16 |
-
<reference name="content">
|
17 |
-
<block type="tmcore/adminhtml_module_manage" name="module.manage"/>
|
18 |
-
</reference>
|
19 |
-
<reference name="left">
|
20 |
-
<block type="tmcore/adminhtml_module_manage_tabs" name="tmcore_module_manage_tabs">
|
21 |
-
<block type="tmcore/adminhtml_module_manage_tab_main" name="tmcore_module_manage_tab_main" />
|
22 |
-
<action method="addTab"><name>main_section</name><block>tmcore_module_manage_tab_main</block></action>
|
23 |
-
</block>
|
24 |
-
</reference>
|
25 |
-
</adminhtml_tmcore_module_manage>
|
26 |
-
|
27 |
-
<tmcore_popup>
|
28 |
-
<reference name="head">
|
29 |
-
<action method="addJs"><script>tm/adminhtml/core/window.js</script></action>
|
30 |
-
</reference>
|
31 |
-
<reference name="content">
|
32 |
-
<block type="core/template" name="tmcore.popup" template="tmcore/popup.phtml"/>
|
33 |
-
</reference>
|
34 |
-
</tmcore_popup>
|
35 |
-
|
36 |
-
<adminhtml_tmcore_support_index>
|
37 |
-
<reference name="content">
|
38 |
-
<block type="tmcore/adminhtml_support_list" name="support.list"/>
|
39 |
-
</reference>
|
40 |
-
</adminhtml_tmcore_support_index>
|
41 |
-
|
42 |
-
<adminhtml_tmcore_support_edit>
|
43 |
-
<reference name="content">
|
44 |
-
<block type="tmcore/adminhtml_support_edit" name="support.edit"/>
|
45 |
-
</reference>
|
46 |
-
<reference name="left">
|
47 |
-
<block type="tmcore/adminhtml_support_edit_tabs" name="tmcore_support_edit_tabs">
|
48 |
-
<block type="tmcore/adminhtml_support_edit_tab_main" name="adminhtml_support_edit_tab_main" />
|
49 |
-
<!-- -->
|
50 |
-
<action method="addTab">
|
51 |
-
<name>main_section</name>
|
52 |
-
<block>adminhtml_support_edit_tab_main</block>
|
53 |
-
</action>
|
54 |
-
<!-- -->
|
55 |
-
</block>
|
56 |
-
</reference>
|
57 |
-
</adminhtml_tmcore_support_edit>
|
58 |
-
|
59 |
-
<adminhtml_tmcore_support_new>
|
60 |
-
<update handle="adminhtml_tmcore_support_edit"/>
|
61 |
-
</adminhtml_tmcore_support_new>
|
62 |
-
</layout>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/design/adminhtml/default/default/template/tmcore/popup.phtml
DELETED
@@ -1,13 +0,0 @@
|
|
1 |
-
<div id="popup-window-mask" style="display:none;"></div>
|
2 |
-
<div id="tmcore_popup" class="product-configure-popup" style="display:none;">
|
3 |
-
<div class="entry-edit">
|
4 |
-
<div class="entry-edit-head">
|
5 |
-
<h4 class="icon-head fieldset-legend" id="tmcore_popup_title"><?php echo Mage::helper('catalog')->__('Window') ?></h4>
|
6 |
-
<a href="javascript:void(0)" class="close f-right" onclick="tmcoreWindow.onCloseBtn()"><?php echo Mage::helper('catalog')->__('Close') ?></a>
|
7 |
-
</div>
|
8 |
-
<div id="tmcore_popup_content" class="content"></div>
|
9 |
-
<div class="buttons-set a-right">
|
10 |
-
<button type="button" class="scalable close" onclick="tmcoreWindow.onCloseBtn()"><span><span><span><?php echo Mage::helper('catalog')->__('Close') ?></span></span></span></button>
|
11 |
-
</div>
|
12 |
-
</div>
|
13 |
-
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/design/adminhtml/default/default/template/tmcore/ticket/edit/form/element/theard/content.phtml
DELETED
@@ -1,98 +0,0 @@
|
|
1 |
-
<!--
|
2 |
-
<link rel="stylesheet" href="http://yandex.st/highlightjs/7.2/styles/github.min.css">
|
3 |
-
<script src="http://yandex.st/highlightjs/7.2/highlight.min.js"></script>
|
4 |
-
|
5 |
-
<script type="text/javascript">
|
6 |
-
//<![CDATA[
|
7 |
-
document.observe("dom:loaded", function() {
|
8 |
-
hljs.initHighlightingOnLoad();
|
9 |
-
});
|
10 |
-
//]]>
|
11 |
-
</script>
|
12 |
-
-->
|
13 |
-
|
14 |
-
<div class="entry-edit">
|
15 |
-
<ul class="-note-list" style="width: 100%">
|
16 |
-
<?php
|
17 |
-
$theards = $this->getTheards();
|
18 |
-
$previosTheard = current($theards);
|
19 |
-
$diff = array();
|
20 |
-
foreach ($theards as $_theard):
|
21 |
-
$_theard = $_theard->getData();
|
22 |
-
?>
|
23 |
-
<li>
|
24 |
-
<strong>
|
25 |
-
<?php echo $this->getTheardOwnerTitle($_theard) ?>
|
26 |
-
</strong>
|
27 |
-
<span class="separator">|</span>
|
28 |
-
<strong><?php echo $this->getTheardCreatedAt($_theard) ?></strong>
|
29 |
-
<?php echo $this->getTheardCreatedAt($_theard, 'time') ?>
|
30 |
-
<span class="separator">|</span>
|
31 |
-
<strong title="<?php echo $this->helper('helpmate')->__('Status')?>">
|
32 |
-
<?php echo $this->getTheardStatus($_theard)?>
|
33 |
-
</strong>
|
34 |
-
<span class="separator">|</span>
|
35 |
-
<strong title="<?php echo $this->helper('helpmate')->__('Priority')?>">
|
36 |
-
<?php echo $this->getTheardPriority($_theard) ?>
|
37 |
-
</strong>
|
38 |
-
<span class="separator">|</span>
|
39 |
-
<strong title="<?php echo $this->helper('helpmate')->__('Departament')?>">
|
40 |
-
<?php echo $this->getTheardDepartment($_theard) ?>
|
41 |
-
</strong>
|
42 |
-
|
43 |
-
<?php if ($_text = $this->getTheardText($_theard)): ?>
|
44 |
-
<div class="box">
|
45 |
-
<?php echo $_text ?>
|
46 |
-
</div>
|
47 |
-
<?php endif; ?>
|
48 |
-
<script type='text/javascript'>
|
49 |
-
|
50 |
-
document.observe('dom:loaded', function() {
|
51 |
-
$$('.theard_content span').each(function(element){
|
52 |
-
element.observe('click', function(event) {
|
53 |
-
Effect.toggle(this.next('div'), 'blind', {duration: 0.8} );
|
54 |
-
});
|
55 |
-
element.setStyle('border: 1px solid #D6D6D6; border-bottom:none;background-color: #FFF9E9;display:block;')
|
56 |
-
});
|
57 |
-
$$('.theard_content div').each(function(element){
|
58 |
-
element.hide();
|
59 |
-
element.setStyle('border: 1px solid #D6D6D6; border-top:none;background-color: #FFF9E9;')
|
60 |
-
});
|
61 |
-
});
|
62 |
-
|
63 |
-
</script>
|
64 |
-
<?php if (isset($_theard['status']) && isset($previosTheard['status']) &&
|
65 |
-
$_theard['status'] !== $previosTheard['status']) :?>
|
66 |
-
<br/><small> <?php echo $this->helper('helpmate')->__(
|
67 |
-
'Status has been changed from %s to %s',
|
68 |
-
$this->getTheardStatus($previosTheard),
|
69 |
-
$this->getTheardStatus($_theard)
|
70 |
-
|
71 |
-
) ?>
|
72 |
-
</small>
|
73 |
-
<?php endif;
|
74 |
-
if (isset($_theard['priority']) && isset($previosTheard['priority']) &&
|
75 |
-
$_theard['priority'] !== $previosTheard['priority']) : ?>
|
76 |
-
<br/><small><?php echo $this->helper('helpmate')->__(
|
77 |
-
'Priority has been changed from %s to %s',
|
78 |
-
$this->getTheardPriority($previosTheard),
|
79 |
-
$this->getTheardPriority($_theard)
|
80 |
-
);?>
|
81 |
-
</small>
|
82 |
-
<?php endif;
|
83 |
-
if (isset($_theard['department_id']) && isset($previosTheard['department_id']) &&
|
84 |
-
$_theard['department_id'] !== $previosTheard['department_id']) : ?>
|
85 |
-
<br/><small><?php echo $this->helper('helpmate')->__(
|
86 |
-
'Department has been changed from %s to %s',
|
87 |
-
$this->getTheardDepartment($previosTheard),
|
88 |
-
$this->getTheardDepartment($_theard)
|
89 |
-
) ?></small>;
|
90 |
-
|
91 |
-
<?php endif;?>
|
92 |
-
|
93 |
-
</li>
|
94 |
-
<?php
|
95 |
-
$previosTheard = $_theard;
|
96 |
-
endforeach; ?>
|
97 |
-
</ul>
|
98 |
-
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/design/frontend/base/default/layout/tm/core.xml
DELETED
@@ -1,13 +0,0 @@
|
|
1 |
-
<?xml version="1.0" ?>
|
2 |
-
<layout>
|
3 |
-
<default>
|
4 |
-
<reference name="head">
|
5 |
-
<action method="addJs" ifconfig="tmcore/jslibs/jquery">
|
6 |
-
<script>lib/jquery/jquery-1.10.2.min.js</script>
|
7 |
-
</action>
|
8 |
-
<action method="addJs" ifconfig="tmcore/jslibs/jquery">
|
9 |
-
<script>lib/jquery/noconflict.js</script>
|
10 |
-
</action>
|
11 |
-
</reference>
|
12 |
-
</default>
|
13 |
-
</layout>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/etc/modules/TM_Core.xml
DELETED
@@ -1,9 +0,0 @@
|
|
1 |
-
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
-
<config>
|
3 |
-
<modules>
|
4 |
-
<TM_Core>
|
5 |
-
<active>true</active>
|
6 |
-
<codePool>community</codePool>
|
7 |
-
</TM_Core>
|
8 |
-
</modules>
|
9 |
-
</config>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/locale/en_US/TM_Core.csv
DELETED
@@ -1,48 +0,0 @@
|
|
1 |
-
"Modules Information","Modules Information"
|
2 |
-
"Open Extension Page","Open Extension Page"
|
3 |
-
"Please <a href='http://templates-master.com/contacts' onclick='window.open(this.href); return false;'>contact us</a>, if you have some issues with one of our modules.","Please <a href='http://templates-master.com/contacts' onclick='window.open(this.href); return false;'>contact us</a>, if you have some issues with one of our modules."
|
4 |
-
"Troubleshooting","Troubleshooting"
|
5 |
-
"Changelog","Changelog"
|
6 |
-
"Download Latest Version","Download Latest Version"
|
7 |
-
"Download","Download"
|
8 |
-
"Manage","Manage"
|
9 |
-
"Upgrades are not installed","Upgrades are not installed"
|
10 |
-
"New version is available","New version is available"
|
11 |
-
"Upgrade Information","Upgrade Information"
|
12 |
-
"Activate this checkbox, if you want to skip the upgrade operations","Activate this checkbox, if you want to skip the upgrade operations"
|
13 |
-
"Module data will be upgraded from %s to %s at the following stores","Module data will be upgraded from %s to %s at the following stores"
|
14 |
-
"Install and Reinstall Information","Install and Reinstall Information"
|
15 |
-
"Identity Key","Identity Key"
|
16 |
-
"Get your identity key at <a href=""%s"" title=""%s"" target=""_blank"">%s</a>","Get your identity key at <a href=""%s"" title=""%s"" target=""_blank"">%s</a>"
|
17 |
-
"Select stores to install or reinstall module","Select stores to install or reinstall module"
|
18 |
-
"Module is already installed at following stores","Module is already installed at following stores"
|
19 |
-
"Manage Module","Manage Module"
|
20 |
-
"Code","Code"
|
21 |
-
"Local Version","Local Version"
|
22 |
-
"Latest Version","Latest Version"
|
23 |
-
"Version Status","Version Status"
|
24 |
-
"Run","Run"
|
25 |
-
"Upgrade and Install/Reinstall %s %s (Data version %s)","Upgrade and Install/Reinstall %s %s (Data version %s)"
|
26 |
-
"Install or Reinstall %s %s (Data version %s)","Install or Reinstall %s %s (Data version %s)"
|
27 |
-
"Install %s %s","Install %s %s"
|
28 |
-
"Modules","Modules"
|
29 |
-
"The module has been saved","The module has been saved"
|
30 |
-
"updated","updated"
|
31 |
-
"outdated","outdated"
|
32 |
-
"deprecated","deprecated"
|
33 |
-
"Identity key is required","Identity key is required"
|
34 |
-
"Response error: %s","Response error: %s"
|
35 |
-
"Sorry, try again in five minutes. Validation response parsing error: %s","Sorry, try again in five minutes. Validation response parsing error: %s"
|
36 |
-
"Module code is required","Module code is required"
|
37 |
-
"Domain name is required","Domain name is required"
|
38 |
-
"Identity key is not valid","Identity key is not valid"
|
39 |
-
"%s module is not found in purchase history","%s module is not found in purchase history"
|
40 |
-
"%s activations limit reached. Please <a href=""%s"" title=""%s"" target=""_blank"">buy the product</a> to activate more domains","%s activations limit reached. Please <a href=""%s"" title=""%s"" target=""_blank"">buy the product</a> to activate more domains"
|
41 |
-
"Module ""%s"" is not activated for ""%s"" domain. Please, <a href=""%s"" title=""%s"" target=""_blank"">activate</a> it from our site. %s activations left","Module ""%s"" is not activated for ""%s"" domain. Please, <a href=""%s"" title=""%s"" target=""_blank"">activate</a> it from our site. %s activations left"
|
42 |
-
"You are trying to use %s activation(s) for %s module. Only %s activations left. Please <a href=""%s"" title=""%s"">buy the product</a> to activate more domains","You are trying to use %s activation(s) for %s module. Only %s activations left. Please <a href=""%s"" title=""%s"">buy the product</a> to activate more domains"
|
43 |
-
"Installed products","Installed products"
|
44 |
-
"Product promotions and discounts","Product promotions and discounts"
|
45 |
-
"New Products","New Products"
|
46 |
-
"Product updates","Product updates"
|
47 |
-
"Other","Other"
|
48 |
-
"News to show in notification bar","News to show in notification bar"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/locale/es_ES/TM_Core.csv
DELETED
@@ -1,48 +0,0 @@
|
|
1 |
-
"Modules Information","Módulos de Información"
|
2 |
-
"Open Extension Page","Abrir página de extensión"
|
3 |
-
"Please <a href='http://templates-master.com/contacts' onclick='window.open(this.href); return false;'>contact us</a>, if you have some issues with one of our modules.","Por favor <a href='http://templates-master.com/contacts' onclick='window.open(this.href); regresa false;'>contact us</a>, si tienes algun problema con uno de nuestros módulos."
|
4 |
-
"Troubleshooting","Solución de problemas"
|
5 |
-
"Changelog","Cambios"
|
6 |
-
"Download Latest Version","Descargar la última versión"
|
7 |
-
"Download","Descargar"
|
8 |
-
"Manage","Gestionar"
|
9 |
-
"Upgrades are not installed","Las actualizaciones no se instalan"
|
10 |
-
"New version is available","La nueva versión está disponible"
|
11 |
-
"Upgrade Information","Actualizar información"
|
12 |
-
"Activate this checkbox, if you want to skip the upgrade operations","Activar esta casilla si deseas omitir las operaciones de actualización"
|
13 |
-
"Module data will be upgraded from %s to %s at the following stores","Los datos de los módulos se actualizarán de % s para % s en las siguientes tiendas"
|
14 |
-
"Install and Reinstall Information","Instalar y reinstalar Información"
|
15 |
-
"Identity Key","Clave de Identidad"
|
16 |
-
"Get your identity key at <a href=""%s"" title=""%s"" target=""_blank"">%s</a>","Obtén tu clave de identidad en <a href=""%s"" title=""%s"" target=""_blank""> % s < / a>"
|
17 |
-
"Select stores to install or reinstall module","Seleccione las tiendas para instalar o reinstalar módulo"
|
18 |
-
"Module is already installed at following stores","El módulo ya está instalado en las siguientes tiendas"
|
19 |
-
"Manage Module","Gestionar Módulo"
|
20 |
-
"Code","Código"
|
21 |
-
"Local Version","Versión local"
|
22 |
-
"Latest Version","La última versión"
|
23 |
-
"Version Status","Estado de la versión "
|
24 |
-
"Run","Ejecutar"
|
25 |
-
"Upgrade and Install/Reinstall %s %s (Data version %s)","Actualizar e instalar / reinstalar % s % s (versión de datos % s) "
|
26 |
-
"Install or Reinstall %s %s (Data version %s)","Instalar o reinstalar % s % s (% s Versión de datos)"
|
27 |
-
"Install %s %s","Instalar % s % s"
|
28 |
-
"Modules","Módulos"
|
29 |
-
"The module has been saved","El módulo se ha guardado"
|
30 |
-
"updated","Actualizado"
|
31 |
-
"outdated","Desactualizado"
|
32 |
-
"deprecated","Desaprobado"
|
33 |
-
"Identity key is required","Se necesita una clave de identidad"
|
34 |
-
"Response error: %s","Respuesta de error: % s"
|
35 |
-
"Sorry, try again in five minutes. Validation response parsing error: %s","Lo sentimos, inténtelo de nuevo en cinco minutos. Error de validación de análisis de respuesta: % s"
|
36 |
-
"Module code is required","Se requiere código de módulo"
|
37 |
-
"Domain name is required","Se requiere un nombre de dominio"
|
38 |
-
"Identity key is not valid","Clave de identidad no es válida"
|
39 |
-
"%s module is not found in purchase history","% s módulo no se encuentra en el historial de compras"
|
40 |
-
"%s activations limit reached. Please <a href=""%s"" title=""%s"" target=""_blank"">buy the product</a> to activate more domains","%s límite de activaciones alcanzadas. Por favor, <a href=""%s"" title=""%s"" target=""_blank"">compre el producto </a> para activar más dominios"
|
41 |
-
"Module ""%s"" is not activated for ""%s"" domain. Please, <a href=""%s"" title=""%s"" target=""_blank"">activate</a> it from our site. %s activations left","Módulo ""%s"" no está activo para el ""%s"" dominio. Por favor, <a href=""%s"" title=""%s"" target=""_blank"">activalo</a> desde nuestro sitio. %s activaciones que quedan"
|
42 |
-
"You are trying to use %s activation(s) for %s module. Only %s activations left. Please <a href=""%s"" title=""%s"">buy the product</a> to activate more domains","Estas tratando de usar %s activaciones para %s módulo. Sólo quedan %s activaciones. Por favor, <a href=""%s"" title=""%s"">compre el producto</a> para activar más dominios"
|
43 |
-
"Installed products","Productos instalados"
|
44 |
-
"Product promotions and discounts","Promociones de productos y descuentos"
|
45 |
-
"New Products","Nuevos Productos"
|
46 |
-
"Product updates","Actualizaciones de productos"
|
47 |
-
"Other","Otros"
|
48 |
-
"News to show in notification bar","Noticias para mostrar en la barra de notificación"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/locale/fr_FR/TM_Core.csv
DELETED
@@ -1,48 +0,0 @@
|
|
1 |
-
"Modules Information","Information sur les modules"
|
2 |
-
"Open Extension Page","Page d'extension"
|
3 |
-
"Please <a href='http://templates-master.com/contacts' onclick='window.open(this.href); return false;'>contact us</a>, if you have some issues with one of our modules.","Veuillez <a href='http://templates-master.com/contacts' onclick='window.open(this.href); return false;'>nous contacter</a>, si vous rencontrez des problèmes avec nos modules"
|
4 |
-
"Troubleshooting","Dépannage"
|
5 |
-
"Changelog","Changer le login"
|
6 |
-
"Download Latest Version","Télécharger la dernière version"
|
7 |
-
"Download","Télécharger"
|
8 |
-
"Manage","Gérer"
|
9 |
-
"Upgrades are not installed","Les mises à jour ne sont pas installées"
|
10 |
-
"New version is available","Une nouvelle version est disponible"
|
11 |
-
"Upgrade Information","Information de mise à jour"
|
12 |
-
"Activate this checkbox, if you want to skip the upgrade operations","Activer cette boîte si vous ne souhaitez pas effectuer les opérations de mise à jour"
|
13 |
-
"Module data will be upgraded from %s to %s at the following stores","Les données de module vont être mises à jour de %s à %s dans les magasins suivants"
|
14 |
-
"Install and Reinstall Information","Information d'Installation et de Réinstallation"
|
15 |
-
"Identity Key","Clé d'identification"
|
16 |
-
"Get your identity key at <a href=""%s"" title=""%s"" target=""_blank"">%s</a>","Recevez votre clé d'idendification <a href=""%s"" title=""%s"" target=""_blank"">%s</a>"
|
17 |
-
"Select stores to install or reinstall module","Sélectionnez des magasins pour installer ou réinstaller le module"
|
18 |
-
"Module is already installed at following stores","Le module est déjà installé dans les magasins suivants"
|
19 |
-
"Manage Module","Gérer le module"
|
20 |
-
"Code","Code"
|
21 |
-
"Local Version","Version locale"
|
22 |
-
"Latest Version","Dernière version"
|
23 |
-
"Version Status","Statut de la version"
|
24 |
-
"Run","En marche"
|
25 |
-
"Upgrade and Install/Reinstall %s %s (Data version %s)","Mise à jour et Installer/Réinstallr %s %s (Version de données %s)"
|
26 |
-
"Install or Reinstall %s %s (Data version %s)","Installer ou Reinstaller %s %s (Verion de données %s)"
|
27 |
-
"Install %s %s","Installer %s %s"
|
28 |
-
"Modules","Modules"
|
29 |
-
"The module has been saved","Le module a été enregistré"
|
30 |
-
"updated","Mis à jour"
|
31 |
-
"outdated","Pas à jour"
|
32 |
-
"deprecated","Obsolète"
|
33 |
-
"Identity key is required","La clé d'identification est requise"
|
34 |
-
"Response error: %s","Réponse d'erreur: %s"
|
35 |
-
"Sorry, try again in five minutes. Validation response parsing error: %s","Veuillez réessayer dans 5 minutes. Validation du message d'analyse d'erreur: %s"
|
36 |
-
"Module code is required","Le code du module est requis"
|
37 |
-
"Domain name is required","Le nom de domaine est requis"
|
38 |
-
"Identity key is not valid","La clé d'identification n'est pas valide"
|
39 |
-
"%s module is not found in purchase history","%s le module n'a pas été trouvé dans l'historique d'achat"
|
40 |
-
"%s activations limit reached. Please <a href=""%s"" title=""%s"" target=""_blank"">buy the product</a> to activate more domains","%s Limite d'activations atteinte. Aller sur <a href=""%s"" title=""%s"" target=""_blank"">acheter le produit</a> pour activer plus de domaines"
|
41 |
-
"Module ""%s"" is not activated for ""%s"" domain. Please, <a href=""%s"" title=""%s"" target=""_blank"">activate</a> it from our site. %s activations left","Le module ""%s"" n'est pas activé pour le domaine ""%s"". Veuillez l' <a href=""%s"" title=""%s"" target=""_blank"">activer</a> depuis notre site. %s activations restantes."
|
42 |
-
"You are trying to use %s activation(s) for %s module. Only %s activations left. Please <a href=""%s"" title=""%s"">buy the product</a> to activate more domains","Vou essayer d'utiliser la/les activation/s %s pour le module %s . Seulement %s activations restantes. Veuillez <a href=""%s"" title=""%s"">acheter le produit</a> pour activer plus de domaines."
|
43 |
-
"Installed products","Produits installés"
|
44 |
-
"Product promotions and discounts","Promotions et remises sur les produits"
|
45 |
-
"New Products","Nouveaux produits"
|
46 |
-
"Product updates","Mises à jour du produit"
|
47 |
-
"Other","Autre"
|
48 |
-
"News to show in notification bar","Actualités à montrer dans la barre de notification"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/locale/it_IT/TM_Core.csv
DELETED
@@ -1,48 +0,0 @@
|
|
1 |
-
"Modules Information","Informazioni Modulo"
|
2 |
-
"Open Extension Page","Apri Pagina Estensione"
|
3 |
-
"Please <a href='http://templates-master.com/contacts' onclick='window.open(this.href); return false;'>contact us</a>, if you have some issues with one of our modules.","Per favore <a href='http://templates-master.com/contacts' onclick='window.open(this.href); return false;'>contattaci</a>, se hai dei problemi con uno dei nostri moduli."
|
4 |
-
"Troubleshooting","Risoluzione Problemi"
|
5 |
-
"Changelog","Changelog"
|
6 |
-
"Download Latest Version","Scarica Ultima Versione"
|
7 |
-
"Download","Download"
|
8 |
-
"Manage","Gestisci"
|
9 |
-
"Upgrades are not installed","Upgrade non installati"
|
10 |
-
"New version is available","Nuova versione disponibile"
|
11 |
-
"Upgrade Information","Informazioni Upgrade"
|
12 |
-
"Activate this checkbox, if you want to skip the upgrade operations","Attiva questa casella, se vuoi saltare le operazioni di upgrade"
|
13 |
-
"Module data will be upgraded from %s to %s at the following stores","Verrà effettuato l'upgrade dei moduli da %s a %s ai seguenti negozi"
|
14 |
-
"Install and Reinstall Information","Installa e Reinstalla Informazioni"
|
15 |
-
"Identity Key","Chiave Identità"
|
16 |
-
"Get your identity key at <a href=""%s"" title=""%s"" target=""_blank"">%s</a>","Ottieni la tua chiave identità a <a href=""%s"" title=""%s"" target=""_blank"">%s</a>"
|
17 |
-
"Select stores to install or reinstall module","Seleziona negozi per installare o reinstallare il modulo"
|
18 |
-
"Module is already installed at following stores","Modulo già installato nei seguenti negozi"
|
19 |
-
"Manage Module","Gestisci Modulo"
|
20 |
-
"Code","Codice"
|
21 |
-
"Local Version","Versione Locale"
|
22 |
-
"Latest Version","Ultima Versione"
|
23 |
-
"Version Status","Stato Versione"
|
24 |
-
"Run","Esegui"
|
25 |
-
"Upgrade and Install/Reinstall %s %s (Data version %s)","Fai l'Upgrade e Installa/Reinstalla %s %s (Versione Dati %s)"
|
26 |
-
"Install or Reinstall %s %s (Data version %s)","Installa o Reinstalla %s %s (Versione Dati %s)"
|
27 |
-
"Install %s %s","Installa %s %s"
|
28 |
-
"Modules","Moduli"
|
29 |
-
"The module has been saved","Il modulo è stato salvato"
|
30 |
-
"updated","aggiornato"
|
31 |
-
"outdated","obsoleto"
|
32 |
-
"deprecated","deprecato"
|
33 |
-
"Identity key is required","Chiave identità necessaria"
|
34 |
-
"Response error: %s","Errore Risposta: %s"
|
35 |
-
"Sorry, try again in five minutes. Validation response parsing error: %s","Spiacente, riprova tra cinque minuti. Errore parsing risposta validazione: %s"
|
36 |
-
"Module code is required","Codice modulo necessario"
|
37 |
-
"Domain name is required","Nome dominio richiesto"
|
38 |
-
"Identity key is not valid","Chiave identità non valida"
|
39 |
-
"%s module is not found in purchase history","Modulo %s non trovato nello storico acquisti"
|
40 |
-
"%s activations limit reached. Please <a href=""%s"" title=""%s"" target=""_blank"">buy the product</a> to activate more domains","limite attivazioni %s raggiunto. Per favore <a href=""%s"" title=""%s"" target=""_blank"">acquista il prodotto</a> per attivare più domini"
|
41 |
-
"Module ""%s"" is not activated for ""%s"" domain. Please, <a href=""%s"" title=""%s"" target=""_blank"">activate</a> it from our site. %s activations left","Modulo ""%s"" non attivato per il dominio ""%s"". Per favore, <a href=""%s"" title=""%s"" target=""_blank"">attivalo</a> dal nostro sito. %s attivazioni rimaste"
|
42 |
-
"You are trying to use %s activation(s) for %s module. Only %s activations left. Please <a href=""%s"" title=""%s"">buy the product</a> to activate more domains","Stai cercando di utilizzare %s attivazione/i per il modulo %s. Solo %s attivazioni rimaste. Per favore <a href=""%s"" title=""%s"">acquista il prodotto</a> per attivare più domini"
|
43 |
-
"Installed products","Prodotti installati"
|
44 |
-
"Product promotions and discounts","Promozioni prodotto e sconti"
|
45 |
-
"New Products","Nuovi Prodotti"
|
46 |
-
"Product updates","Aggiornamenti prodotto"
|
47 |
-
"Other","Altro"
|
48 |
-
"News to show in notification bar","News da mostrare nella barra notifiche"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/locale/nl_NL/TM_Core.csv
DELETED
@@ -1,48 +0,0 @@
|
|
1 |
-
"Modules Information","Modules Informatie"
|
2 |
-
"Open Extension Page","Open Extensie Pagina"
|
3 |
-
"Please <a href='http://templates-master.com/contacts' onclick='window.open(this.href); return false;'>contact us</a>, if you have some issues with one of our modules.","Gelieve <a href='http://templates-master.com/contacts' onclick='window.open(this.href); return false;'>contacteer ons</a>, indien je problemen hebt met een van onze modules."
|
4 |
-
"Troubleshooting","Probleemoplossing"
|
5 |
-
"Changelog","Changelog"
|
6 |
-
"Download Latest Version","Download de laatste versie"
|
7 |
-
"Download","Download"
|
8 |
-
"Manage","Beheer"
|
9 |
-
"Upgrades are not installed","Upgrades zijn niet geinstalleerd"
|
10 |
-
"New version is available","Nieuwe versie werd geinstalleerd"
|
11 |
-
"Upgrade Information","Upgrade Informatie"
|
12 |
-
"Activate this checkbox, if you want to skip the upgrade operations","Activeer dit vakje indien je deze upgrade handelingen wil overslaan"
|
13 |
-
"Module data will be upgraded from %s to %s at the following stores","data Module zal geupdatet worden %s to %s in de volgende winkels"
|
14 |
-
"Install and Reinstall Information","Installeer en herinstalleer Informatie"
|
15 |
-
"Identity Key","Identificatie Sleutel"
|
16 |
-
"Get your identity key at <a href=""%s"" title=""%s"" target=""_blank"">%s</a>","Krijg je identificatiesleutel bij <a href=""%s"" title=""%s"" target=""_blank"">%s</a>"
|
17 |
-
"Select stores to install or reinstall module","Selecteer winkels om de module te installeren of te herinstalleren"
|
18 |
-
"Module is already installed at following stores","Module is reeds geinstalleerd in de volgende winkels"
|
19 |
-
"Manage Module","Beheer Module"
|
20 |
-
"Code","Code"
|
21 |
-
"Local Version","Locale Versie"
|
22 |
-
"Latest Version","Laatste Versie"
|
23 |
-
"Version Status","Versie Status"
|
24 |
-
"Run","Run"
|
25 |
-
"Upgrade and Install/Reinstall %s %s (Data version %s)","Upgrade en Installeer/Herinstalleer %s %s (Data versie %s)"
|
26 |
-
"Install or Reinstall %s %s (Data version %s)","Installeer or Herinstalleer %s %s (Data versie %s)"
|
27 |
-
"Install %s %s","Installeer %s %s"
|
28 |
-
"Modules","Modules"
|
29 |
-
"The module has been saved","De module werd opgeslagen"
|
30 |
-
"updated","geupdated"
|
31 |
-
"outdated","verouderd"
|
32 |
-
"deprecated","deprecated"
|
33 |
-
"Identity key is required","Identiteits sleutel is vereist"
|
34 |
-
"Response error: %s","Respons fout: %s"
|
35 |
-
"Sorry, try again in five minutes. Validation response parsing error: %s","Sorry, probeer opnieuw binnen vijf minuten. Validatie respons parsing fout: %s"
|
36 |
-
"Module code is required","Module code is vereist"
|
37 |
-
"Domain name is required","Domein naam is vereist"
|
38 |
-
"Identity key is not valid","Identiteits sleutel is niet geldig"
|
39 |
-
"%s module is not found in purchase history","%s module word niet gevonden in de aankoop geschiedenis"
|
40 |
-
"%s activations limit reached. Please <a href=""%s"" title=""%s"" target=""_blank"">buy the product</a> to activate more domains","%s activatie limiet bereikt. Gelieve <a href=""%s"" title=""%s"" target=""_blank"">het product te kopen</a>om meer domeinen te activeren."
|
41 |
-
"Module ""%s"" is not activated for ""%s"" domain. Please, <a href=""%s"" title=""%s"" target=""_blank"">activate</a> it from our site. %s activations left","Module ""%s"" is niet geactiveerd voor domein ""%s"". Gelieve, <a href=""%s"" title=""%s"" target=""_blank"">te activeren</a> van onze site. %s activaties over"
|
42 |
-
"You are trying to use %s activation(s) for %s module. Only %s activations left. Please <a href=""%s"" title=""%s"">buy the product</a> to activate more domains","Je probeert %s activatie(s)te gebruiken voor %s module. Nog %s activaties over. Gelieve <a href=""%s"" title=""%s"">het product te kopen </a> om meer domeinen te activeren"
|
43 |
-
"Installed products","Geinstalleerde producten"
|
44 |
-
"Product promotions and discounts","Product promoties en kortingen"
|
45 |
-
"New Products","Nieuwe Producten"
|
46 |
-
"Product updates","Product updates"
|
47 |
-
"Other","Andere"
|
48 |
-
"News to show in notification bar","Nieuws te laten zien in de notificatiebalk"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/locale/pt_PT/TM_Core.csv
DELETED
@@ -1,48 +0,0 @@
|
|
1 |
-
"Modules Information","Informações de módulos"
|
2 |
-
"Open Extension Page","Página de extensão aberta"
|
3 |
-
"Please <a href='http://templates-master.com/contacts' onclick='window.open(this.href); return false;'>contact us</a>, if you have some issues with one of our modules.","Por favor <a href='http://templates-master.com/contacts' onclick='window.open(this.href); return false;'>contate-nos</a>, se você tiver algum problema com algum dos nossos môdulos."
|
4 |
-
"Troubleshooting","Solução de problemas"
|
5 |
-
"Changelog","Changelog"
|
6 |
-
"Download Latest Version","Baixe a versão mais recente"
|
7 |
-
"Download","Download"
|
8 |
-
"Manage","Gerenciar"
|
9 |
-
"Upgrades are not installed","Upgrades não estão instalados."
|
10 |
-
"New version is available","Nova versão está disponível"
|
11 |
-
"Upgrade Information","Atualizar informações"
|
12 |
-
"Activate this checkbox, if you want to skip the upgrade operations","Ativar esta opção, se você deseja ignorar as operações de atualização"
|
13 |
-
"Module data will be upgraded from %s to %s at the following stores","Dados de módulo serão atualizados de %s para %s nas seguintes lojas"
|
14 |
-
"Install and Reinstall Information","Instalar e reinstalar as informações"
|
15 |
-
"Identity Key","Chave de identidade"
|
16 |
-
"Get your identity key at <a href=""%s"" title=""%s"" target=""_blank"">%s</a>","Obter a sua chave de identidade em <a href=""%s"" title=""%s"" target=""_blank""> %s</a>"
|
17 |
-
"Select stores to install or reinstall module","Selecione lojas para instalar ou reinstalar o módulo"
|
18 |
-
"Module is already installed at following stores","Módulo já está instalado nas seguintes lojas"
|
19 |
-
"Manage Module","Gerenciar módulo"
|
20 |
-
"Code","Código"
|
21 |
-
"Local Version","Versão local"
|
22 |
-
"Latest Version","Versão mais recente"
|
23 |
-
"Version Status","Status da versão"
|
24 |
-
"Run","Executar"
|
25 |
-
"Upgrade and Install/Reinstall %s %s (Data version %s)","Atualização e instalação/reinstalação %s %s (dados versão %s)"
|
26 |
-
"Install or Reinstall %s %s (Data version %s)","Instalar ou reinstalar o %s %s (dados versão %s)"
|
27 |
-
"Install %s %s","Instalar o %s %s"
|
28 |
-
"Modules","Módulos"
|
29 |
-
"The module has been saved","O módulo foi salvo"
|
30 |
-
"updated","atualizado"
|
31 |
-
"outdated","desatualizado"
|
32 |
-
"deprecated","preterido"
|
33 |
-
"Identity key is required","Chave de identidade é necessária"
|
34 |
-
"Response error: %s","Erro de resposta: %s"
|
35 |
-
"Sorry, try again in five minutes. Validation response parsing error: %s","Desculpe, tente novamente em cinco minutos. Resposta de validação, análise de erro: %s"
|
36 |
-
"Module code is required","Código do módulo é necessário"
|
37 |
-
"Domain name is required","Nome de domínio é necessária"
|
38 |
-
"Identity key is not valid","Chave de identidade não está válida"
|
39 |
-
"%s module is not found in purchase history","módulo de %s não foi encontrado no histórico de compras"
|
40 |
-
"%s activations limit reached. Please <a href=""%s"" title=""%s"" target=""_blank"">buy the product</a> to activate more domains","atingido o limite de ativações de %s. Por favor, <a href=""%s"" title=""%s"" target=""_blank""> comprar o produto</a> para ativar mais domínios"
|
41 |
-
"Module ""%s"" is not activated for ""%s"" domain. Please, <a href=""%s"" title=""%s"" target=""_blank"">activate</a> it from our site. %s activations left","Módulo ""%s"" não está ativado para o domínio ""%s"". Por favor, <a href=""%s"" title=""%s"" target=""_blank""> ative</a> em nosso site. Ativações de %s restantes"
|
42 |
-
"You are trying to use %s activation(s) for %s module. Only %s activations left. Please <a href=""%s"" title=""%s"">buy the product</a> to activate more domains","Você está tentando usar ativação(ões) de %s para %s módulo. Única ativações de %s restantes. Por favor, <a href=""%s"" title=""%s""> comprar o produto</a> para ativar mais domínios"
|
43 |
-
"Installed products","Produtos instalados"
|
44 |
-
"Product promotions and discounts","Promoções de produto e descontos"
|
45 |
-
"New Products","Novos produtos"
|
46 |
-
"Product updates","Atualizações de produto"
|
47 |
-
"Other","Outros"
|
48 |
-
"News to show in notification bar","Notícias para mostrar na barra de notificação"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
js/lib/jquery/jquery-1.10.2.min.js
DELETED
@@ -1,6 +0,0 @@
|
|
1 |
-
/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
|
2 |
-
//@ sourceMappingURL=jquery-1.10.2.min.map
|
3 |
-
*/
|
4 |
-
(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav></:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t
|
5 |
-
}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Ct=/^(?:checkbox|radio)$/i,Nt=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle);
|
6 |
-
u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=un(e,t),Pt.detach()),Gt[e]=n),n}function un(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,n){x.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(x.css(e,"display"))?x.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x.support.opacity||(x.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=x.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===x.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,n){return n?x.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,n){x.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?x(e).position()[n]+"px":r):t}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!x.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||x.css(e,"display"))},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(x.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Ct.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),x.param=function(e,n){var r,i=[],o=function(e,t){t=x.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}x.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var mn,yn,vn=x.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Cn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Nn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=x.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=o.href}catch(Ln){yn=a.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(T)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(l){var u;return o[l]=!0,x.each(e[l]||[],function(e,l){var c=l(n,r,i);return"string"!=typeof c||a||o[c]?a?!(u=c):t:(n.dataTypes.unshift(c),s(c),!1)}),u}return s(n.dataTypes[0])||!o["*"]&&s("*")}function _n(e,n){var r,i,o=x.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,l=e.indexOf(" ");return l>=0&&(i=e.slice(l,e.length),e=e.slice(0,l)),x.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&x.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?x("<div>").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks("once memory"),m=p.statusCode||{},y={},v={},b=0,w="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||"*").toLowerCase().match(T)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(mn[3]||("http:"===mn[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&C.setRequestHeader("If-None-Match",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w="abort";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger("ajaxSend",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort("timeout")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||"",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader("Last-Modified"),T&&(x.lastModified[o]=T),T=C.getResponseHeader("etag"),T&&(x.etag[o]=T)),204===e||"HEAD"===p.type?N="nocontent":304===e?N="notmodified":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+"",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger("ajaxComplete",[C,p]),--x.active||x.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,n){return x.get(e,t,n,"script")}}),x.each(["get","post"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+" "+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(p){return{state:"parsererror",error:a?p:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),x.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=a.head||x("head")[0]||a.documentElement;return{send:function(t,i){n=a.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Fn.pop()||x.expando+"_"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return l||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||x.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&"withCredentials"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),"string"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+w+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),a=(x.cssNumber[e]||"px"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,"fxshow");n.queue||(s=x._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(x.support.inlineBlockNeedsLayout&&"inline"!==ln(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?"hidden"in d&&(f=d.hidden):d=x._data(e,"fxshow",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);(i||x._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=x._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,"position");"static"===r&&(e.style.position="relative");var i=x(e),o=i.offset(),a=x.css(e,"top"),s=x.css(e,"left"),l=("absolute"===r||"fixed"===r)&&x.inArray("auto",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),"using"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===x.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(n=e.offset()),n.top+=x.css(e[0],"borderTopWidth",!0),n.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-x.css(r,"marginTop",!0),left:t.left-n.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:"height",Width:"width"},function(e,n){x.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}))})(window);
|
|
|
|
|
|
|
|
|
|
|
|
js/lib/jquery/noconflict.js
DELETED
@@ -1,27 +0,0 @@
|
|
1 |
-
/**
|
2 |
-
* Magento
|
3 |
-
*
|
4 |
-
* NOTICE OF LICENSE
|
5 |
-
*
|
6 |
-
* This source file is subject to the Academic Free License (AFL 3.0)
|
7 |
-
* that is bundled with this package in the file LICENSE_AFL.txt.
|
8 |
-
* It is also available through the world-wide-web at this URL:
|
9 |
-
* http://opensource.org/licenses/afl-3.0.php
|
10 |
-
* If you did not receive a copy of the license and are unable to
|
11 |
-
* obtain it through the world-wide-web, please send an email
|
12 |
-
* to license@magento.com so we can send you a copy immediately.
|
13 |
-
*
|
14 |
-
* DISCLAIMER
|
15 |
-
*
|
16 |
-
* Do not edit or add to this file if you wish to upgrade Magento to newer
|
17 |
-
* versions in the future. If you wish to customize Magento for your
|
18 |
-
* needs please refer to http://www.magento.com for more information.
|
19 |
-
*
|
20 |
-
* @category Mage
|
21 |
-
* @package js
|
22 |
-
* @copyright Copyright (c) 2006-2016 X.commerce, Inc. and affiliates (http://www.magento.com)
|
23 |
-
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
|
24 |
-
*/
|
25 |
-
|
26 |
-
// Avoid PrototypeJS conflicts, assign jQuery to $j instead of $
|
27 |
-
var $j = jQuery.noConflict();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
js/tm/adminhtml/core/window.js
DELETED
@@ -1,52 +0,0 @@
|
|
1 |
-
TmcoreWindow = Class.create();
|
2 |
-
TmcoreWindow.prototype = {
|
3 |
-
|
4 |
-
current : $H({}),
|
5 |
-
blockWindow : null,
|
6 |
-
blockTitle : null,
|
7 |
-
blockContent : null,
|
8 |
-
blockMask : null,
|
9 |
-
windowHeight : null,
|
10 |
-
confirmedCurrentId: null,
|
11 |
-
|
12 |
-
initialize: function() {
|
13 |
-
this._initWindowElements();
|
14 |
-
},
|
15 |
-
|
16 |
-
_initWindowElements: function() {
|
17 |
-
this.blockWindow = $('tmcore_popup');
|
18 |
-
this.blockTitle = $('tmcore_popup_title');
|
19 |
-
this.blockContent = $('tmcore_popup_content');
|
20 |
-
this.blockMask = $('popup-window-mask');
|
21 |
-
this.windowHeight = $('html-body').getHeight();
|
22 |
-
},
|
23 |
-
|
24 |
-
onCloseBtn: function() {
|
25 |
-
this.hide();
|
26 |
-
return this;
|
27 |
-
},
|
28 |
-
|
29 |
-
update: function(content, title) {
|
30 |
-
this.blockContent.update(content);
|
31 |
-
if (title) {
|
32 |
-
this.blockTitle.update(title);
|
33 |
-
}
|
34 |
-
return this;
|
35 |
-
},
|
36 |
-
|
37 |
-
show: function() {
|
38 |
-
toggleSelectsUnderBlock(this.blockMask, false);
|
39 |
-
this.blockMask.setStyle({'height':this.windowHeight+'px'}).show();
|
40 |
-
this.blockWindow.setStyle({'marginTop':-this.blockWindow.getHeight()/2 + "px", 'display':'block'});
|
41 |
-
},
|
42 |
-
|
43 |
-
hide: function() {
|
44 |
-
toggleSelectsUnderBlock(this.blockMask, true);
|
45 |
-
this.blockMask.style.display = 'none';
|
46 |
-
this.blockWindow.style.display = 'none';
|
47 |
-
},
|
48 |
-
};
|
49 |
-
|
50 |
-
Event.observe(window, 'load', function() {
|
51 |
-
tmcoreWindow = new TmcoreWindow();
|
52 |
-
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
package.xml
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
<?xml version="1.0"?>
|
2 |
<package>
|
3 |
<name>magento_easy_tabs</name>
|
4 |
-
<version>2.3.
|
5 |
<stability>stable</stability>
|
6 |
<license uri="http://creativecommons.org/licenses/by/3.0/">Creative Commons License </license>
|
7 |
<channel>community</channel>
|
@@ -10,9 +10,9 @@
|
|
10 |
<description>Free Easy Tabs extension is efficient solution for usability of your store. It was developed in order to add informational tabs on product page. The number of tabs is unlimited. You can replace default system tabs, add new blocks into the tabs and apply ready to use tabs to create new one according to your requirements.</description>
|
11 |
<notes>Magento Easy Tabs Community Module</notes>
|
12 |
<authors><author><name>TemplatesMaster</name><user>TemplatesMaster</user><email>support@templates-master.com</email></author></authors>
|
13 |
-
<date>2016-08-
|
14 |
-
<time>
|
15 |
-
<contents><target name="magecommunity"><dir name="TM"><dir name="EasyTabs"><dir name="Block"><dir name="Adminhtml"><dir name="Edit"><file name="Form.php" hash="ac9ae8dd2ca02d2aea88b02ae4a6094e"/><dir name="Tab"><file name="Main.php" hash="485ff004422a52cad678fd08b5665328"/></dir><file name="Tabs.php" hash="e051b10be665ca34fb1bffa2e379fa3e"/></dir><file name="Edit.php" hash="fd61e3e748a4f7fbe6ee3b99c2ba61bf"/><dir name="List"><file name="Grid.php" hash="605356fee2a11f307c9a7ab946ec0d04"/></dir><file name="List.php" hash="c88c7f76f0d5a72ff320f7359f24ea1f"/><dir name="Tab"><file name="Options.php" hash="3e1d0b56f4a2951ac7a1ce5859775eeb"/></dir></dir><dir name="Tab"><file name="Attribute.php" hash="2b9795e99d8ad1e3c6c87b4c89dd76e3"/><file name="Cms.php" hash="512d13f19a9155b7e926dd77efec9f10"/><file name="Html.php" hash="fffb4847f6bc2c6f70877b34a57eaed2"/><dir name="Product"><file name="Additional.php" hash="9da7bf2ad135cb8f94816ca15c279863"/><file name="Description.php" hash="bac6f4872f41bf5d251f4ba93db4794d"/><file name="Related.php" hash="18f4f3476ce85d2a1c518c081a1eafce"/><file name="Review.php" hash="3887ef16b754c6546297c72b7bafc605"/><file name="Tags.php" hash="0d924a1877b253eca47e575786a1910c"/><file name="Upsell.php" hash="78d62b391b5c8abdf2a78b8fedb69c94"/></dir><file name="SameAttrValue.php" hash="cd904ee1ac6e1cc0b55735e23b1a8a7e"/><file name="Template.php" hash="eb52fd526169bf6ffc8ff9ce68f56601"/></dir><file name="Tabs.php" hash="f69b52da532fb21649b2f6fb6c047381"/></dir><dir name="Helper"><file name="Data.php" hash="164bf2329ec0c7fe31fb3598daa2ec8c"/></dir><dir name="Model"><dir name="Config"><file name="Collection.php" hash="9b8337609597d8b566d3e0f1310a9afa"/><file name="Status.php" hash="2dff584852a6a5758c196a3a100d6b56"/><file name="Tabs.php" hash="fde3c0e370feb3e878f03905dd83a9f7"/></dir><file name="Config.php" hash="8620e6d3baaecd7077948550ea12de50"/><dir name="Product"><dir name="Attribute"><file name="Collection.php" hash="c6a21bb64a4a8f3fcc1cce76025e20f2"/></dir></dir><file name="Tabs.php" hash="ca445bb6138c4273e280a66397d94c15"/><dir name="Template"><file name="Filter.php" hash="a3971400bd335f4330cc5f981f396cfc"/></dir></dir><dir name="controllers"><dir name="Adminhtml"><dir name="Easytabs"><file name="IndexController.php" hash="4e5efb897db7de51c303899c443c39e8"/></dir></dir></dir><dir name="etc"><file name="adminhtml.xml" hash="38df7e6f89659b212673696de51c4ba8"/><file name="config.xml" hash="8af162f9d36c085205cbde0e0ed98082"/><file name="easytabs.xml" hash="5ad887bfefedc987a23667a06eb548ee"/><file name="system.xml" hash="6d9bad94977a5ad85513743135237376"/><file name="widget.xml" hash="b582e0900460cfa23353328af452700e"/></dir></dir><dir name="Core"><dir name="Block"><dir name="Adminhtml"><dir name="Module"><dir name="Grid"><dir name="Renderer"><file name="Actions.php" hash="94e4642076a653933f831d21587f0e0b"/><file name="VersionStatus.php" hash="f437375fa42bd6d5811e9ac357b25b92"/></dir></dir><file name="Grid.php" hash="6ed8add73540c00a9f00cb9519576e3e"/><dir name="Manage"><file name="Form.php" hash="445f9d528e6649634ef998676edca76d"/><dir name="Tab"><file name="Main.php" hash="d04eaf5d68e0a1fcc5c9f81f532f6ea4"/></dir><file name="Tabs.php" hash="b8b94209331a74de8f74b43096957b46"/></dir><file name="Manage.php" hash="de66455cf3b3c137d63600fcfb752c2e"/></dir><file name="Module.php" hash="5fc47720bda5db44a99ee33dc6682088"/><dir name="Support"><dir name="Edit"><dir name="Form"><dir name="Element"><dir name="Theard"><file name="Content.php" hash="a0df79a98bff0cf48b84683b13dcfc9e"/></dir><file name="Theard.php" hash="49aa528200fdfecbd73fa5678f579331"/></dir></dir><file name="Form.php" hash="7711ae3830edf2ac1f38c100f576b038"/><dir name="Tab"><file name="Main.php" hash="f95d31910171ac100ba51749dc9ffa1f"/></dir><file name="Tabs.php" hash="009b12547acf1771dceebc7db473be27"/></dir><file name="Edit.php" hash="0dabfacbf1b7a79e47686be6645ecb7d"/><dir name="List"><file name="Grid.php" hash="a01bb91dfa62d5b1415e7a413ab11339"/></dir><file name="List.php" hash="8d059add18b516d9e3bc634f570437ea"/></dir><dir name="System"><dir name="Config"><dir name="Form"><dir name="Field"><file name="Notification.php" hash="6c06aec0e04520f2dffe9a8ec580d545"/><file name="Size.php" hash="3516ca14bea4f21ee3805219ff128b8a"/></dir><dir name="Fieldset"><dir name="Modules"><file name="List.php" hash="e4fcb7c10f265a111e754d2776afd9a8"/></dir><file name="Troubleshooting.php" hash="9516baca7da47dffc4c70123260c0ae8"/></dir></dir></dir></dir><dir name="Widget"><dir name="Form"><dir name="Element"><dir name="Wysiwyg"><file name="Content.php" hash="cc2b4fa2903d8eff9fa3833462af2f31"/></dir><file name="Wysiwyg.php" hash="a1dbb1fa4d338f9e5f7d6b3d73064179"/></dir><dir name="Renderer"><file name="Wysiwyg.php" hash="853eaaf1f404379b7f288538e1165db5"/></dir></dir></dir></dir><dir name="Cms"><file name="Block.php" hash="c10f566da9bc88653ce54176819d754d"/></dir></dir><dir name="Helper"><file name="Data.php" hash="77bfd46c4405cbc4907feafce196280c"/><file name="Debug.php" hash="54d8b318e43d182ecb43bb850f2cdbd8"/></dir><dir name="Model"><dir name="Adminhtml"><dir name="System"><dir name="Config"><dir name="Source"><dir name="Notification"><file name="Channel.php" hash="a617b0f2a905bc28d2946a23e68ede5f"/></dir></dir></dir></dir></dir><dir name="Module"><file name="MessageLogger.php" hash="23ae476aa7a9ef6379ffe6953e869e0e"/><file name="Upgrade.php" hash="c9872fe30623ab511577ea4d98724ca5"/></dir><file name="Module.php" hash="c507995abec692b3f38f66a65b4d5c44"/><dir name="Notification"><file name="Feed.php" hash="f148f51380e489e0aee2fc82d780fffa"/></dir><dir name="Oauth"><file name="Client.php" hash="b6ccf069f5b59d74ce09e50c3a83b61d"/></dir><file name="Observer.php" hash="02539a75bbf4762a2d09944f8bbd58d9"/><dir name="Resource"><dir name="Module"><file name="AdminGridCollection.php" hash="fb9642aff21c3c833195aebf4cf65644"/><file name="Collection.php" hash="a6fe79d80f1e7039abd51010e5e1ec4c"/><file name="MergedCollection.php" hash="be79fb45e9d1f463d29118faaa320434"/><file name="RemoteCollection.php" hash="bd380a11d95cc75cdbfb2f5a6d46108f"/></dir><file name="Module.php" hash="3338136f015ec2ef531214c3430fa087"/><dir name="Support"><file name="Collection.php" hash="ed4112064055536e5eea998c5a2aecd9"/></dir></dir><file name="Timer.php" hash="bab5a57d3b5a1d2f67aa1c76d1463392"/></dir><dir name="controllers"><dir name="Adminhtml"><dir name="Tmcore"><file name="ModuleController.php" hash="0bd870e61b0babbcb1470731856d6952"/><file name="SupportController.php" hash="bf983c1bf8155d455b07b55a9af71046"/></dir></dir></dir><dir name="etc"><file name="adminhtml.xml" hash="aa149f26dedd303c22173cf80a87bbc9"/><file name="config.xml" hash="75007c1739f03f4ad6b50abae073dd3b"/><file name="system.xml" hash="f7f906b1630acefa1aeb9600277584d6"/></dir><dir name="sql"><dir name="tm_core_setup"><file name="mysql4-install-1.0.0.php" hash="aa545a4cb0dd65a6af6e58f3a3a73e69"/><file name="mysql4-upgrade-1.0.0-1.0.1.php" hash="26da85d76c4ad2469e3723f16154234f"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><dir name="tm"><file name="easytabs.xml" hash="3f4625f515b36268576e45835161fc02"/><file name="core.xml" hash="b79ead82dc2369bea0130abfb1de8d67"/></dir></dir><dir name="template"><dir name="tm"><dir name="easytabs"><dir><dir name="tab"><dir name="catalog"><dir name="product"><file name="attribute.phtml" hash="ed39373d85ba401d5c6d47637e88547a"/><file name="related.phtml" hash="c272b6c776d4fe9fd5515679b6e91a7a"/><file name="sameattrvalue.phtml" hash="ec4bd0b9fae4b4e66e1df638934db77c"/><dir name="view"><file name="attributes.phtml" hash="e8f0d67efb940c29797c264ab5835732"/><file name="description.phtml" hash="e05ed55676f71fd0af2f5d400b5a6c50"/></dir></dir></dir><file name="cms.phtml" hash="24fa6e1afbd40b8461449c3b7e16efb4"/><dir name="review"><dir name="product"><dir name="view"><file name="list.phtml" hash="8365b7696b46757186acda79f988d915"/></dir></dir></dir><dir name="tag"><dir name="product"><file name="list.phtml" hash="1ecae7b01d97b786876d379a699a6b30"/></dir></dir></dir></dir><file name="tabs.phtml" hash="9702c40b8d4316c0a5931e469e18f978"/></dir></dir></dir></dir></dir></dir><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="tmcore.xml" hash="249d8fe0c9ec19ff413eb93ac428739e"/><dir name="tm"><file name="easytabs.xml" hash="857813b55c612a0c0c2101b5240dbc17"/></dir></dir><dir name="template"><dir name="tmcore"><dir name="ticket"><dir name="edit"><dir name="form"><dir name="element"><dir name="theard"><file name="content.phtml" hash="8130a426137cfce127e47278656d9152"/></dir></dir></dir></dir></dir><file name="popup.phtml" hash="2f9c258f2010fabe08f8737781562c78"/></dir></dir></dir></dir></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="css"><dir name="tm"><file name="easytabs.css" hash="07d5e250a00ab19a2938587f4d7dcd27"/></dir></dir><dir name="js"><dir name="tm"><file name="easytabs.js" hash="f2b4e56b1e16b255b416a502cc296a5b"/></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="TM_EasyTabs.xml" hash="ea8a3b9273ac77ad1d4c22777755bb00"/><file name="TM_Core.xml" hash="432801c3e16eb2ffa4d48309024617bb"/></dir></target><target name="magelocale"><dir name="en_US"><file name="TM_Core.csv" hash="afd8a7597ed0531c6a84ad05cb5205a5"/><file name="TM_EasyTabs.csv" hash="05e29e3991942f13281de0044c7baca2"/></dir><dir name="es_ES"><file name="TM_EasyTabs.csv" hash="3283ac3d336f882837fe5a4570d963c4"/><file name="TM_Core.csv" hash="817aa9cd9985b5ed81c3aadb62a26d7a"/></dir><dir name="fr_FR"><file name="TM_EasyTabs.csv" hash="baf9f2e12bf5f896db691f96242ce9a9"/><file name="TM_Core.csv" hash="4d85a7e25a16948ea77d459f93894e8d"/></dir><dir name="it_IT"><file name="TM_EasyTabs.csv" hash="ee017c63ac747b5ea1503a839c392a73"/><file name="TM_Core.csv" hash="d033d060e066d41af444e830fdc27504"/></dir><dir name="nl_NL"><file name="TM_EasyTabs.csv" hash="719a9829db65dcef62c971370bbf577b"/><file name="TM_Core.csv" hash="9ef1bce86d8a0d95952ba77c5fb1f3ef"/></dir><dir name="pt_PT"><file name="TM_EasyTabs.csv" hash="5d9dfb42cd746fc1afad26f3de818a5e"/><file name="TM_Core.csv" hash="ec345fcb6370864537f721499d63ab56"/></dir></target><target name="mageweb"><dir name="js"><dir name="tm"><dir name="adminhtml"><dir name="core"><file name="window.js" hash="5cd7bc7e3432c98e95c0ddbe459cd045"/></dir></dir></dir><dir name="lib"><dir name="jquery"><file name="jquery-1.10.2.min.js" hash="841dc30647f93349b7d8ef61deebe411"/><file name="noconflict.js" hash="12f820da0f5ba19abfb4f5fc270bb62c"/></dir></dir></dir></target></contents>
|
16 |
<compatible/>
|
17 |
<dependencies><required><php><min>5.2.0</min><max>7.1.0</max></php></required></dependencies>
|
18 |
</package>
|
1 |
<?xml version="1.0"?>
|
2 |
<package>
|
3 |
<name>magento_easy_tabs</name>
|
4 |
+
<version>2.3.6</version>
|
5 |
<stability>stable</stability>
|
6 |
<license uri="http://creativecommons.org/licenses/by/3.0/">Creative Commons License </license>
|
7 |
<channel>community</channel>
|
10 |
<description>Free Easy Tabs extension is efficient solution for usability of your store. It was developed in order to add informational tabs on product page. The number of tabs is unlimited. You can replace default system tabs, add new blocks into the tabs and apply ready to use tabs to create new one according to your requirements.</description>
|
11 |
<notes>Magento Easy Tabs Community Module</notes>
|
12 |
<authors><author><name>TemplatesMaster</name><user>TemplatesMaster</user><email>support@templates-master.com</email></author></authors>
|
13 |
+
<date>2016-08-25</date>
|
14 |
+
<time>12:19:42</time>
|
15 |
+
<contents><target name="magecommunity"><dir name="TM"><dir name="EasyTabs"><dir name="Block"><dir name="Adminhtml"><dir name="Edit"><file name="Form.php" hash="ac9ae8dd2ca02d2aea88b02ae4a6094e"/><dir name="Tab"><file name="Main.php" hash="485ff004422a52cad678fd08b5665328"/></dir><file name="Tabs.php" hash="e051b10be665ca34fb1bffa2e379fa3e"/></dir><file name="Edit.php" hash="fd61e3e748a4f7fbe6ee3b99c2ba61bf"/><dir name="List"><file name="Grid.php" hash="605356fee2a11f307c9a7ab946ec0d04"/></dir><file name="List.php" hash="c88c7f76f0d5a72ff320f7359f24ea1f"/><dir name="Tab"><file name="Options.php" hash="3e1d0b56f4a2951ac7a1ce5859775eeb"/></dir></dir><dir name="Tab"><file name="Attribute.php" hash="2b9795e99d8ad1e3c6c87b4c89dd76e3"/><file name="Cms.php" hash="512d13f19a9155b7e926dd77efec9f10"/><file name="Html.php" hash="fffb4847f6bc2c6f70877b34a57eaed2"/><dir name="Product"><file name="Additional.php" hash="9da7bf2ad135cb8f94816ca15c279863"/><file name="Description.php" hash="bac6f4872f41bf5d251f4ba93db4794d"/><file name="Related.php" hash="18f4f3476ce85d2a1c518c081a1eafce"/><file name="Review.php" hash="3887ef16b754c6546297c72b7bafc605"/><file name="Tags.php" hash="0d924a1877b253eca47e575786a1910c"/><file name="Upsell.php" hash="78d62b391b5c8abdf2a78b8fedb69c94"/></dir><file name="SameAttrValue.php" hash="cd904ee1ac6e1cc0b55735e23b1a8a7e"/><file name="Template.php" hash="eb52fd526169bf6ffc8ff9ce68f56601"/></dir><file name="Tabs.php" hash="f69b52da532fb21649b2f6fb6c047381"/></dir><dir name="Helper"><file name="Data.php" hash="164bf2329ec0c7fe31fb3598daa2ec8c"/></dir><dir name="Model"><dir name="Config"><file name="Collection.php" hash="9b8337609597d8b566d3e0f1310a9afa"/><file name="Status.php" hash="2dff584852a6a5758c196a3a100d6b56"/><file name="Tabs.php" hash="fde3c0e370feb3e878f03905dd83a9f7"/></dir><file name="Config.php" hash="8620e6d3baaecd7077948550ea12de50"/><dir name="Product"><dir name="Attribute"><file name="Collection.php" hash="c6a21bb64a4a8f3fcc1cce76025e20f2"/></dir></dir><file name="Tabs.php" hash="ca445bb6138c4273e280a66397d94c15"/><dir name="Template"><file name="Filter.php" hash="a3971400bd335f4330cc5f981f396cfc"/></dir></dir><dir name="controllers"><dir name="Adminhtml"><dir name="Easytabs"><file name="IndexController.php" hash="4e5efb897db7de51c303899c443c39e8"/></dir></dir></dir><dir name="etc"><file name="adminhtml.xml" hash="38df7e6f89659b212673696de51c4ba8"/><file name="config.xml" hash="8af162f9d36c085205cbde0e0ed98082"/><file name="easytabs.xml" hash="5ad887bfefedc987a23667a06eb548ee"/><file name="system.xml" hash="6d9bad94977a5ad85513743135237376"/><file name="widget.xml" hash="b582e0900460cfa23353328af452700e"/></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><dir name="tm"><file name="easytabs.xml" hash="857813b55c612a0c0c2101b5240dbc17"/></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><dir name="tm"><file name="easytabs.xml" hash="3f4625f515b36268576e45835161fc02"/></dir></dir><dir name="template"><dir name="tm"><dir name="easytabs"><dir name="tab"><dir name="catalog"><dir name="product"><file name="attribute.phtml" hash="ed39373d85ba401d5c6d47637e88547a"/><file name="related.phtml" hash="c272b6c776d4fe9fd5515679b6e91a7a"/><file name="sameattrvalue.phtml" hash="ec4bd0b9fae4b4e66e1df638934db77c"/><dir name="view"><file name="attributes.phtml" hash="e8f0d67efb940c29797c264ab5835732"/><file name="description.phtml" hash="e05ed55676f71fd0af2f5d400b5a6c50"/></dir></dir></dir><file name="cms.phtml" hash="24fa6e1afbd40b8461449c3b7e16efb4"/><dir name="review"><dir name="product"><dir name="view"><file name="list.phtml" hash="8365b7696b46757186acda79f988d915"/></dir></dir></dir><dir name="tag"><dir name="product"><file name="list.phtml" hash="1ecae7b01d97b786876d379a699a6b30"/></dir></dir></dir><file name="tabs.phtml" hash="9702c40b8d4316c0a5931e469e18f978"/></dir></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="TM_EasyTabs.xml" hash="ea8a3b9273ac77ad1d4c22777755bb00"/></dir></target><target name="magelocale"><dir name="en_US"><file name="TM_EasyTabs.csv" hash="05e29e3991942f13281de0044c7baca2"/></dir><dir name="es_ES"><file name="TM_EasyTabs.csv" hash="3283ac3d336f882837fe5a4570d963c4"/></dir><dir name="fr_FR"><file name="TM_EasyTabs.csv" hash="baf9f2e12bf5f896db691f96242ce9a9"/></dir><dir name="it_IT"><file name="TM_EasyTabs.csv" hash="ee017c63ac747b5ea1503a839c392a73"/></dir><dir name="nl_NL"><file name="TM_EasyTabs.csv" hash="719a9829db65dcef62c971370bbf577b"/></dir><dir name="pt_PT"><file name="TM_EasyTabs.csv" hash="5d9dfb42cd746fc1afad26f3de818a5e"/></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="css"><dir name="tm"><file name="easytabs.css" hash="07d5e250a00ab19a2938587f4d7dcd27"/></dir></dir><dir name="js"><dir name="tm"><file name="easytabs.js" hash="f2b4e56b1e16b255b416a502cc296a5b"/></dir></dir></dir></dir></dir></target></contents>
|
16 |
<compatible/>
|
17 |
<dependencies><required><php><min>5.2.0</min><max>7.1.0</max></php></required></dependencies>
|
18 |
</package>
|