magento_easy_tabs - Version 2.3.6

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

Files changed (62) hide show
  1. app/code/community/TM/Core/Block/Adminhtml/Module.php +0 -13
  2. app/code/community/TM/Core/Block/Adminhtml/Module/Grid.php +0 -77
  3. app/code/community/TM/Core/Block/Adminhtml/Module/Grid/Renderer/Actions.php +0 -45
  4. app/code/community/TM/Core/Block/Adminhtml/Module/Grid/Renderer/VersionStatus.php +0 -42
  5. app/code/community/TM/Core/Block/Adminhtml/Module/Manage.php +0 -46
  6. app/code/community/TM/Core/Block/Adminhtml/Module/Manage/Form.php +0 -12
  7. app/code/community/TM/Core/Block/Adminhtml/Module/Manage/Tab/Main.php +0 -152
  8. app/code/community/TM/Core/Block/Adminhtml/Module/Manage/Tabs.php +0 -12
  9. app/code/community/TM/Core/Block/Adminhtml/Support/Edit.php +0 -35
  10. app/code/community/TM/Core/Block/Adminhtml/Support/Edit/Form.php +0 -16
  11. app/code/community/TM/Core/Block/Adminhtml/Support/Edit/Form/Element/Theard.php +0 -39
  12. app/code/community/TM/Core/Block/Adminhtml/Support/Edit/Form/Element/Theard/Content.php +0 -182
  13. app/code/community/TM/Core/Block/Adminhtml/Support/Edit/Tab/Main.php +0 -207
  14. app/code/community/TM/Core/Block/Adminhtml/Support/Edit/Tabs.php +0 -12
  15. app/code/community/TM/Core/Block/Adminhtml/Support/List.php +0 -12
  16. app/code/community/TM/Core/Block/Adminhtml/Support/List/Grid.php +0 -203
  17. app/code/community/TM/Core/Block/Adminhtml/System/Config/Form/Field/Notification.php +0 -11
  18. app/code/community/TM/Core/Block/Adminhtml/System/Config/Form/Field/Size.php +0 -23
  19. app/code/community/TM/Core/Block/Adminhtml/System/Config/Form/Fieldset/Modules/List.php +0 -46
  20. app/code/community/TM/Core/Block/Adminhtml/System/Config/Form/Fieldset/Troubleshooting.php +0 -13
  21. app/code/community/TM/Core/Block/Adminhtml/Widget/Form/Element/Wysiwyg.php +0 -47
  22. app/code/community/TM/Core/Block/Adminhtml/Widget/Form/Element/Wysiwyg/Content.php +0 -35
  23. app/code/community/TM/Core/Block/Adminhtml/Widget/Form/Renderer/Wysiwyg.php +0 -13
  24. app/code/community/TM/Core/Block/Cms/Block.php +0 -19
  25. app/code/community/TM/Core/Helper/Data.php +0 -10
  26. app/code/community/TM/Core/Helper/Debug.php +0 -29
  27. app/code/community/TM/Core/Model/Adminhtml/System/Config/Source/Notification/Channel.php +0 -33
  28. app/code/community/TM/Core/Model/Module.php +0 -461
  29. app/code/community/TM/Core/Model/Module/MessageLogger.php +0 -56
  30. app/code/community/TM/Core/Model/Module/Upgrade.php +0 -942
  31. app/code/community/TM/Core/Model/Notification/Feed.php +0 -155
  32. app/code/community/TM/Core/Model/Oauth/Client.php +0 -257
  33. app/code/community/TM/Core/Model/Observer.php +0 -66
  34. app/code/community/TM/Core/Model/Resource/Module.php +0 -16
  35. app/code/community/TM/Core/Model/Resource/Module/AdminGridCollection.php +0 -17
  36. app/code/community/TM/Core/Model/Resource/Module/Collection.php +0 -9
  37. app/code/community/TM/Core/Model/Resource/Module/MergedCollection.php +0 -502
  38. app/code/community/TM/Core/Model/Resource/Module/RemoteCollection.php +0 -165
  39. app/code/community/TM/Core/Model/Resource/Support/Collection.php +0 -416
  40. app/code/community/TM/Core/Model/Timer.php +0 -65
  41. app/code/community/TM/Core/controllers/Adminhtml/Tmcore/ModuleController.php +0 -123
  42. app/code/community/TM/Core/controllers/Adminhtml/Tmcore/SupportController.php +0 -282
  43. app/code/community/TM/Core/etc/adminhtml.xml +0 -55
  44. app/code/community/TM/Core/etc/config.xml +0 -153
  45. app/code/community/TM/Core/etc/system.xml +0 -113
  46. app/code/community/TM/Core/sql/tm_core_setup/mysql4-install-1.0.0.php +0 -26
  47. app/code/community/TM/Core/sql/tm_core_setup/mysql4-upgrade-1.0.0-1.0.1.php +0 -12
  48. app/design/adminhtml/default/default/layout/tmcore.xml +0 -62
  49. app/design/adminhtml/default/default/template/tmcore/popup.phtml +0 -13
  50. app/design/adminhtml/default/default/template/tmcore/ticket/edit/form/element/theard/content.phtml +0 -98
  51. app/design/frontend/base/default/layout/tm/core.xml +0 -13
  52. app/etc/modules/TM_Core.xml +0 -9
  53. app/locale/en_US/TM_Core.csv +0 -48
  54. app/locale/es_ES/TM_Core.csv +0 -48
  55. app/locale/fr_FR/TM_Core.csv +0 -48
  56. app/locale/it_IT/TM_Core.csv +0 -48
  57. app/locale/nl_NL/TM_Core.csv +0 -48
  58. app/locale/pt_PT/TM_Core.csv +0 -48
  59. js/lib/jquery/jquery-1.10.2.min.js +0 -6
  60. js/lib/jquery/noconflict.js +0 -27
  61. js/tm/adminhtml/core/window.js +0 -52
  62. 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</version>
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-22</date>
14
- <time>07:25:02</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>