Magpedia_Storelocator - Version 0.0.1

Version Notes

Magpedia store locator guides users to find out physical locations of retailers such as branches, stores and offices. The store locator also provides important information about each location including its address, phone numbers, hours of operation, store description, country, state city and sometimes directions of the location. Users smoothly search their nearest store by entering their postal code/state/city/store title and the store locator returns all the information of the stores according to the given data.

Download this release

Release Info

Developer Ramesh Kumar
Extension Magpedia_Storelocator
Version 0.0.1
Comparing to
See all releases


Version 0.0.1

Files changed (45) hide show
  1. app/code/community/Magpedia/Storelocator/Block/Adminhtml/Storelocator.php +38 -0
  2. app/code/community/Magpedia/Storelocator/Block/Adminhtml/Storelocator/Edit.php +62 -0
  3. app/code/community/Magpedia/Storelocator/Block/Adminhtml/Storelocator/Edit/Form.php +43 -0
  4. app/code/community/Magpedia/Storelocator/Block/Adminhtml/Storelocator/Edit/Tab/Form.php +181 -0
  5. app/code/community/Magpedia/Storelocator/Block/Adminhtml/Storelocator/Edit/Tab/Stores.php +48 -0
  6. app/code/community/Magpedia/Storelocator/Block/Adminhtml/Storelocator/Edit/Tabs.php +58 -0
  7. app/code/community/Magpedia/Storelocator/Block/Adminhtml/Storelocator/Grid.php +211 -0
  8. app/code/community/Magpedia/Storelocator/Block/Adminhtml/Storelocator/Helper/Image.php +39 -0
  9. app/code/community/Magpedia/Storelocator/Block/Adminhtml/Storelocator/Image.php +12 -0
  10. app/code/community/Magpedia/Storelocator/Block/Storelocator/List.php +63 -0
  11. app/code/community/Magpedia/Storelocator/Block/Storelocator/View.php +34 -0
  12. app/code/community/Magpedia/Storelocator/Controller/Adminhtml/Storelocator.php +60 -0
  13. app/code/community/Magpedia/Storelocator/Helper/Data.php +34 -0
  14. app/code/community/Magpedia/Storelocator/Helper/Image/Abstract.php +461 -0
  15. app/code/community/Magpedia/Storelocator/Helper/Storelocator.php +34 -0
  16. app/code/community/Magpedia/Storelocator/Helper/Storelocator/Image.php +35 -0
  17. app/code/community/Magpedia/Storelocator/Model/Resource/Setup.php +26 -0
  18. app/code/community/Magpedia/Storelocator/Model/Resource/Storelocator.php +126 -0
  19. app/code/community/Magpedia/Storelocator/Model/Resource/Storelocator/Collection.php +116 -0
  20. app/code/community/Magpedia/Storelocator/Model/Storelocator.php +98 -0
  21. app/code/community/Magpedia/Storelocator/controllers/Adminhtml/Storelocator/StorelocatorController.php +270 -0
  22. app/code/community/Magpedia/Storelocator/controllers/StorelocatorController.php +183 -0
  23. app/code/community/Magpedia/Storelocator/etc/adminhtml.xml +63 -0
  24. app/code/community/Magpedia/Storelocator/etc/config.xml +138 -0
  25. app/code/community/Magpedia/Storelocator/etc/system.xml +101 -0
  26. app/code/community/Magpedia/Storelocator/etc/widget.xml +64 -0
  27. app/code/community/Magpedia/Storelocator/sql/magpedia_storelocator_setup/install-0.0.1.php +113 -0
  28. app/design/adminhtml/default/default/layout/magpedia_storelocator.xml +51 -0
  29. app/design/frontend/default/default/layout/magpedia_storelocator.xml +87 -0
  30. app/design/frontend/default/default/template/magpedia_storelocator/storelocator/list.phtml +61 -0
  31. app/design/frontend/default/default/template/magpedia_storelocator/storelocator/view.phtml +76 -0
  32. app/design/frontend/default/default/template/magpedia_storelocator/storelocator/widget/link.phtml +30 -0
  33. app/design/frontend/default/default/template/magpedia_storelocator/storelocator/widget/view.phtml +41 -0
  34. app/etc/modules/Magpedia_Storelocator.xml +29 -0
  35. js/storelocator/handlebars-1.0.0.min.js +214 -0
  36. js/storelocator/jquery-1.10.1.min.js +6 -0
  37. js/storelocator/jquery.storelocator.js +818 -0
  38. js/storelocator/noConflict.js +1 -0
  39. package.xml +56 -0
  40. skin/frontend/default/default/storelocator/css/map-style.css +1 -0
  41. skin/frontend/default/default/storelocator/css/map.css +219 -0
  42. skin/frontend/default/default/storelocator/images/ajax-loader.gif +0 -0
  43. skin/frontend/default/default/storelocator/images/close-icon.png +0 -0
  44. skin/frontend/default/default/storelocator/images/marker/faddu.jpg +0 -0
  45. skin/frontend/default/default/storelocator/images/overlay-bg.png +0 -0
app/code/community/Magpedia/Storelocator/Block/Adminhtml/Storelocator.php ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magpedia_Storelocator extension
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the MIT License
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/mit-license.php
11
+ *
12
+ * @category Magpedia
13
+ * @package Magpedia_Storelocator
14
+ * @copyright Copyright (c) 2014
15
+ * @license http://opensource.org/licenses/mit-license.php MIT License
16
+ */
17
+ /**
18
+ * Store admin block
19
+ *
20
+ * @category Magpedia
21
+ * @package Magpedia_Storelocator
22
+ *
23
+ */
24
+ class Magpedia_Storelocator_Block_Adminhtml_Storelocator extends Mage_Adminhtml_Block_Widget_Grid_Container{
25
+ /**
26
+ * constructor
27
+ * @access public
28
+ * @return void
29
+ *
30
+ */
31
+ public function __construct(){
32
+ $this->_controller = 'adminhtml_storelocator';
33
+ $this->_blockGroup = 'storelocator';
34
+ $this->_headerText = Mage::helper('storelocator')->__('Store');
35
+ $this->_addButtonLabel = Mage::helper('storelocator')->__('Add Store');
36
+ parent::__construct();
37
+ }
38
+ }
app/code/community/Magpedia/Storelocator/Block/Adminhtml/Storelocator/Edit.php ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magpedia_Storelocator extension
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the MIT License
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/mit-license.php
11
+ *
12
+ * @category Magpedia
13
+ * @package Magpedia_Storelocator
14
+ * @copyright Copyright (c) 2014
15
+ * @license http://opensource.org/licenses/mit-license.php MIT License
16
+ */
17
+ /**
18
+ * Store admin edit block
19
+ *
20
+ * @category Magpedia
21
+ * @package Magpedia_Storelocator
22
+ *
23
+ */
24
+ class Magpedia_Storelocator_Block_Adminhtml_Storelocator_Edit extends Mage_Adminhtml_Block_Widget_Form_Container{
25
+ /**
26
+ * constuctor
27
+ * @access public
28
+ * @return void
29
+ *
30
+ */
31
+ public function __construct(){
32
+ parent::__construct();
33
+ $this->_blockGroup = 'storelocator';
34
+ $this->_controller = 'adminhtml_storelocator';
35
+ $this->_updateButton('save', 'label', Mage::helper('storelocator')->__('Save Store'));
36
+ $this->_updateButton('delete', 'label', Mage::helper('storelocator')->__('Delete Store'));
37
+ $this->_addButton('saveandcontinue', array(
38
+ 'label' => Mage::helper('storelocator')->__('Save And Continue Edit'),
39
+ 'onclick' => 'saveAndContinueEdit()',
40
+ 'class' => 'save',
41
+ ), -100);
42
+ $this->_formScripts[] = "
43
+ function saveAndContinueEdit(){
44
+ editForm.submit($('edit_form').action+'back/edit/');
45
+ }
46
+ ";
47
+ }
48
+ /**
49
+ * get the edit form header
50
+ * @access public
51
+ * @return string
52
+ *
53
+ */
54
+ public function getHeaderText(){
55
+ if( Mage::registry('storelocator_data') && Mage::registry('storelocator_data')->getId() ) {
56
+ return Mage::helper('storelocator')->__("Edit Store '%s'", $this->htmlEscape(Mage::registry('storelocator_data')->getStoretitle()));
57
+ }
58
+ else {
59
+ return Mage::helper('storelocator')->__('Add Store');
60
+ }
61
+ }
62
+ }
app/code/community/Magpedia/Storelocator/Block/Adminhtml/Storelocator/Edit/Form.php ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magpedia_Storelocator extension
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the MIT License
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/mit-license.php
11
+ *
12
+ * @category Magpedia
13
+ * @package Magpedia_Storelocator
14
+ * @copyright Copyright (c) 2014
15
+ * @license http://opensource.org/licenses/mit-license.php MIT License
16
+ */
17
+ /**
18
+ * Store edit form
19
+ *
20
+ * @category Magpedia
21
+ * @package Magpedia_Storelocator
22
+ *
23
+ */
24
+ class Magpedia_Storelocator_Block_Adminhtml_Storelocator_Edit_Form extends Mage_Adminhtml_Block_Widget_Form{
25
+ /**
26
+ * prepare form
27
+ * @access protected
28
+ * @return Magpedia_Storelocator_Block_Adminhtml_Storelocator_Edit_Form
29
+ *
30
+ */
31
+ protected function _prepareForm(){
32
+ $form = new Varien_Data_Form(array(
33
+ 'id' => 'edit_form',
34
+ 'action' => $this->getUrl('*/*/save', array('id' => $this->getRequest()->getParam('id'))),
35
+ 'method' => 'post',
36
+ 'enctype' => 'multipart/form-data'
37
+ )
38
+ );
39
+ $form->setUseContainer(true);
40
+ $this->setForm($form);
41
+ return parent::_prepareForm();
42
+ }
43
+ }
app/code/community/Magpedia/Storelocator/Block/Adminhtml/Storelocator/Edit/Tab/Form.php ADDED
@@ -0,0 +1,181 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magpedia_Storelocator extension
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the MIT License
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/mit-license.php
11
+ *
12
+ * @category Magpedia
13
+ * @package Magpedia_Storelocator
14
+ * @copyright Copyright (c) 2014
15
+ * @license http://opensource.org/licenses/mit-license.php MIT License
16
+ */
17
+ /**
18
+ * Store edit form tab
19
+ *
20
+ * @category Magpedia
21
+ * @package Magpedia_Storelocator
22
+ *
23
+ */
24
+ class Magpedia_Storelocator_Block_Adminhtml_Storelocator_Edit_Tab_Form extends Mage_Adminhtml_Block_Widget_Form{
25
+ /**
26
+ * prepare the form
27
+ * @access protected
28
+ * @return Storelocator_Storelocator_Block_Adminhtml_Storelocator_Edit_Tab_Form
29
+ *
30
+ */
31
+ protected function _prepareForm(){
32
+ $form = new Varien_Data_Form();
33
+ $form->setHtmlIdPrefix('storelocator_');
34
+ $form->setFieldNameSuffix('storelocator');
35
+ $this->setForm($form);
36
+ $fieldset = $form->addFieldset('storelocator_form', array('legend'=>Mage::helper('storelocator')->__('Store')));
37
+ $fieldset->addType('image', Mage::getConfig()->getBlockClassName('storelocator/adminhtml_storelocator_helper_image'));
38
+ $wysiwygConfig = Mage::getSingleton('cms/wysiwyg_config')->getConfig();
39
+
40
+ $fieldset->addField('storetitle', 'text', array(
41
+ 'label' => Mage::helper('storelocator')->__('Store Title'),
42
+ 'name' => 'storetitle',
43
+ 'required' => true,
44
+ 'class' => 'required-entry',
45
+
46
+ ));
47
+
48
+ $fieldset->addField('storelink', 'text', array(
49
+ 'label' => Mage::helper('storelocator')->__('Store Link'),
50
+ 'name' => 'storelink',
51
+
52
+ ));
53
+
54
+ $fieldset->addField('country', 'select', array(
55
+ 'label' => Mage::helper('storelocator')->__('Country'),
56
+ 'name' => 'country',
57
+ 'required' => true,
58
+ 'class' => 'required-entry',
59
+
60
+ 'values'=> Mage::getResourceModel('directory/country_collection')->toOptionArray(),
61
+ ));
62
+
63
+ $fieldset->addField('state', 'text', array(
64
+ 'label' => Mage::helper('storelocator')->__('State'),
65
+ 'name' => 'state',
66
+
67
+ ));
68
+
69
+ $fieldset->addField('city', 'text', array(
70
+ 'label' => Mage::helper('storelocator')->__('City'),
71
+ 'name' => 'city',
72
+ 'required' => true,
73
+ 'class' => 'required-entry',
74
+
75
+ ));
76
+
77
+ $fieldset->addField('postalcode', 'text', array(
78
+ 'label' => Mage::helper('storelocator')->__('Postal Code'),
79
+ 'name' => 'postalcode',
80
+ 'required' => true,
81
+ 'class' => 'required-entry',
82
+
83
+ ));
84
+
85
+ $fieldset->addField('address', 'text', array(
86
+ 'label' => Mage::helper('storelocator')->__('Address'),
87
+ 'name' => 'address',
88
+ 'required' => true,
89
+ 'class' => 'required-entry',
90
+
91
+ ));
92
+
93
+ $fieldset->addField('latitude', 'text', array(
94
+ 'label' => Mage::helper('storelocator')->__('Latitude'),
95
+ 'name' => 'latitude',
96
+ 'required' => true,
97
+ 'class' => 'required-entry',
98
+
99
+ ));
100
+
101
+ $fieldset->addField('longitude', 'text', array(
102
+ 'label' => Mage::helper('storelocator')->__('Longitude'),
103
+ 'name' => 'longitude',
104
+ 'required' => true,
105
+ 'class' => 'required-entry',
106
+
107
+ ));
108
+
109
+ $fieldset->addField('email', 'text', array(
110
+ 'label' => Mage::helper('storelocator')->__('Store Email'),
111
+ 'name' => 'email',
112
+
113
+ ));
114
+
115
+ $fieldset->addField('phone', 'text', array(
116
+ 'label' => Mage::helper('storelocator')->__('Phone'),
117
+ 'name' => 'phone',
118
+
119
+ ));
120
+
121
+ $fieldset->addField('fax', 'text', array(
122
+ 'label' => Mage::helper('storelocator')->__('Fax'),
123
+ 'name' => 'fax',
124
+
125
+ ));
126
+
127
+ $fieldset->addField('description', 'editor', array(
128
+ 'label' => Mage::helper('storelocator')->__('Description'),
129
+ 'name' => 'description',
130
+ 'config' => $wysiwygConfig,
131
+
132
+ ));
133
+
134
+ $fieldset->addField('storeimage', 'image', array(
135
+ 'label' => Mage::helper('storelocator')->__('Store Image'),
136
+ 'name' => 'storeimage',
137
+
138
+ ));
139
+
140
+ $fieldset->addField('sortorder', 'text', array(
141
+ 'label' => Mage::helper('storelocator')->__('Sort Order'),
142
+ 'name' => 'sortorder',
143
+
144
+ ));
145
+
146
+ $fieldset->addField('storetime', 'text', array(
147
+ 'label' => Mage::helper('storelocator')->__('Store Time'),
148
+ 'name' => 'storetime',
149
+
150
+ ));
151
+ $fieldset->addField('status', 'select', array(
152
+ 'label' => Mage::helper('storelocator')->__('Status'),
153
+ 'name' => 'status',
154
+ 'values'=> array(
155
+ array(
156
+ 'value' => 1,
157
+ 'label' => Mage::helper('storelocator')->__('Enabled'),
158
+ ),
159
+ array(
160
+ 'value' => 0,
161
+ 'label' => Mage::helper('storelocator')->__('Disabled'),
162
+ ),
163
+ ),
164
+ ));
165
+ if (Mage::app()->isSingleStoreMode()){
166
+ $fieldset->addField('store_id', 'hidden', array(
167
+ 'name' => 'stores[]',
168
+ 'value' => Mage::app()->getStore(true)->getId()
169
+ ));
170
+ Mage::registry('current_storelocator')->setStoreId(Mage::app()->getStore(true)->getId());
171
+ }
172
+ if (Mage::getSingleton('adminhtml/session')->getStorelocatorData()){
173
+ $form->setValues(Mage::getSingleton('adminhtml/session')->getStorelocatorData());
174
+ Mage::getSingleton('adminhtml/session')->setStorelocatorData(null);
175
+ }
176
+ elseif (Mage::registry('current_storelocator')){
177
+ $form->setValues(Mage::registry('current_storelocator')->getData());
178
+ }
179
+ return parent::_prepareForm();
180
+ }
181
+ }
app/code/community/Magpedia/Storelocator/Block/Adminhtml/Storelocator/Edit/Tab/Stores.php ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magpedia_Storelocator extension
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the MIT License
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/mit-license.php
11
+ *
12
+ * @category Magpedia
13
+ * @package Magpedia_Storelocator
14
+ * @copyright Copyright (c) 2014
15
+ * @license http://opensource.org/licenses/mit-license.php MIT License
16
+ */
17
+ /**
18
+ * store selection tab
19
+ *
20
+ * @category Magpedia
21
+ * @package Magpedia_Storelocator
22
+ *
23
+ */
24
+ class Magpedia_Storelocator_Block_Adminhtml_Storelocator_Edit_Tab_Stores extends Mage_Adminhtml_Block_Widget_Form{
25
+ /**
26
+ * prepare the form
27
+ * @access protected
28
+ * @return Magpedia_Storelocator_Block_Adminhtml_Storelocator_Edit_Tab_Stores
29
+ *
30
+ */
31
+ protected function _prepareForm(){
32
+ $form = new Varien_Data_Form();
33
+ $form->setFieldNameSuffix('storelocator');
34
+ $this->setForm($form);
35
+ $fieldset = $form->addFieldset('storelocator_stores_form', array('legend'=>Mage::helper('storelocator')->__('Store views')));
36
+ $field = $fieldset->addField('store_id', 'multiselect', array(
37
+ 'name' => 'stores[]',
38
+ 'label' => Mage::helper('storelocator')->__('Store Views'),
39
+ 'title' => Mage::helper('storelocator')->__('Store Views'),
40
+ 'required' => true,
41
+ 'values'=> Mage::getSingleton('adminhtml/system_store')->getStoreValuesForForm(false, true),
42
+ ));
43
+ $renderer = $this->getLayout()->createBlock('adminhtml/store_switcher_form_renderer_fieldset_element');
44
+ $field->setRenderer($renderer);
45
+ $form->addValues(Mage::registry('current_storelocator')->getData());
46
+ return parent::_prepareForm();
47
+ }
48
+ }
app/code/community/Magpedia/Storelocator/Block/Adminhtml/Storelocator/Edit/Tabs.php ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magpedia_Storelocator extension
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the MIT License
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/mit-license.php
11
+ *
12
+ * @category Magpedia
13
+ * @package Magpedia_Storelocator
14
+ * @copyright Copyright (c) 2014
15
+ * @license http://opensource.org/licenses/mit-license.php MIT License
16
+ */
17
+ /**
18
+ * Store admin edit tabs
19
+ *
20
+ * @category Magpedia
21
+ * @package Magpedia_Storelocator
22
+ *
23
+ */
24
+ class Magpedia_Storelocator_Block_Adminhtml_Storelocator_Edit_Tabs extends Mage_Adminhtml_Block_Widget_Tabs{
25
+ /**
26
+ * constructor
27
+ * @access public
28
+ * @return void
29
+ *
30
+ */
31
+ public function __construct(){
32
+ parent::__construct();
33
+ $this->setId('storelocator_tabs');
34
+ $this->setDestElementId('edit_form');
35
+ $this->setTitle(Mage::helper('storelocator')->__('Store'));
36
+ }
37
+ /**
38
+ * before render html
39
+ * @access protected
40
+ * @return Magpedia_Storelocator_Block_Adminhtml_Storelocator_Edit_Tabs
41
+ *
42
+ */
43
+ protected function _beforeToHtml(){
44
+ $this->addTab('form_storelocator', array(
45
+ 'label' => Mage::helper('storelocator')->__('Store'),
46
+ 'title' => Mage::helper('storelocator')->__('Store'),
47
+ 'content' => $this->getLayout()->createBlock('storelocator/adminhtml_storelocator_edit_tab_form')->toHtml(),
48
+ ));
49
+ if (!Mage::app()->isSingleStoreMode()){
50
+ $this->addTab('form_store_storelocator', array(
51
+ 'label' => Mage::helper('storelocator')->__('Store views'),
52
+ 'title' => Mage::helper('storelocator')->__('Store views'),
53
+ 'content' => $this->getLayout()->createBlock('storelocator/adminhtml_storelocator_edit_tab_stores')->toHtml(),
54
+ ));
55
+ }
56
+ return parent::_beforeToHtml();
57
+ }
58
+ }
app/code/community/Magpedia/Storelocator/Block/Adminhtml/Storelocator/Grid.php ADDED
@@ -0,0 +1,211 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magpedia_Storelocator extension
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the MIT License
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/mit-license.php
11
+ *
12
+ * @category Magpedia
13
+ * @package Magpedia_Storelocator
14
+ * @copyright Copyright (c) 2014
15
+ * @license http://opensource.org/licenses/mit-license.php MIT License
16
+ */
17
+ /**
18
+ * Store admin grid block
19
+ *
20
+ * @category Magpedia
21
+ * @package Magpedia_Storelocator
22
+ *
23
+ */
24
+ class Magpedia_Storelocator_Block_Adminhtml_Storelocator_Grid extends Mage_Adminhtml_Block_Widget_Grid{
25
+ /**
26
+ * constructor
27
+ * @access public
28
+ * @return void
29
+ *
30
+ */
31
+ public function __construct(){
32
+ parent::__construct();
33
+ $this->setId('storelocatorGrid');
34
+ $this->setDefaultSort('entity_id');
35
+ $this->setDefaultDir('ASC');
36
+ $this->setSaveParametersInSession(true);
37
+ $this->setUseAjax(true);
38
+ }
39
+ /**
40
+ * prepare collection
41
+ * @access protected
42
+ * @return Magpedia_Storelocator_Block_Adminhtml_Storelocator_Grid
43
+ *
44
+ */
45
+ protected function _prepareCollection(){
46
+ $collection = Mage::getModel('storelocator/storelocator')->getCollection();
47
+ $this->setCollection($collection);
48
+ return parent::_prepareCollection();
49
+ }
50
+ /**
51
+ * prepare grid collection
52
+ * @access protected
53
+ * @return Magpedia_Storelocator_Block_Adminhtml_Storelocator_Grid
54
+ *
55
+ */
56
+ protected function _prepareColumns(){
57
+ $this->addColumn('entity_id', array(
58
+ 'header' => Mage::helper('storelocator')->__('Id'),
59
+ 'index' => 'entity_id',
60
+ 'type' => 'number'
61
+ ));
62
+ $this->addColumn('storetitle', array(
63
+ 'header'=> Mage::helper('storelocator')->__('Store Title'),
64
+ 'index' => 'storetitle',
65
+ 'type' => 'text',
66
+
67
+ ));
68
+ $this->addColumn('country', array(
69
+ 'header'=> Mage::helper('storelocator')->__('Country'),
70
+ 'index' => 'country',
71
+ 'type' => 'country',
72
+
73
+ ));
74
+ $this->addColumn('city', array(
75
+ 'header'=> Mage::helper('storelocator')->__('City'),
76
+ 'index' => 'city',
77
+ 'type' => 'text',
78
+
79
+ ));
80
+
81
+ $this->addColumn('postalcode', array(
82
+ 'header'=> Mage::helper('storelocator')->__('Postal Code'),
83
+ 'index' => 'postalcode',
84
+ 'type' => 'text',
85
+ ));
86
+
87
+ $this->addColumn('storeimage', array(
88
+ 'header'=> Mage::helper('storelocator')->__('Store Image'),
89
+ 'index' => 'storeimage',
90
+ 'renderer' => 'Magpedia_Storelocator_Block_Adminhtml_Storelocator_Image',
91
+ ));
92
+
93
+ $this->addColumn('status', array(
94
+ 'header' => Mage::helper('storelocator')->__('Status'),
95
+ 'index' => 'status',
96
+ 'type' => 'options',
97
+ 'options' => array(
98
+ '1' => Mage::helper('storelocator')->__('Enabled'),
99
+ '0' => Mage::helper('storelocator')->__('Disabled'),
100
+ )
101
+ ));
102
+ if (!Mage::app()->isSingleStoreMode()) {
103
+ $this->addColumn('store_id', array(
104
+ 'header'=> Mage::helper('storelocator')->__('Store Views'),
105
+ 'index' => 'store_id',
106
+ 'type' => 'store',
107
+ 'store_all' => true,
108
+ 'store_view'=> true,
109
+ 'sortable' => false,
110
+ 'filter_condition_callback'=> array($this, '_filterStoreCondition'),
111
+ ));
112
+ }
113
+ $this->addColumn('action',
114
+ array(
115
+ 'header'=> Mage::helper('storelocator')->__('Action'),
116
+ 'width' => '100',
117
+ 'type' => 'action',
118
+ 'getter'=> 'getId',
119
+ 'actions' => array(
120
+ array(
121
+ 'caption' => Mage::helper('storelocator')->__('Edit'),
122
+ 'url' => array('base'=> '*/*/edit'),
123
+ 'field' => 'id'
124
+ )
125
+ ),
126
+ 'filter'=> false,
127
+ 'is_system' => true,
128
+ 'sortable' => false,
129
+ ));
130
+ $this->addExportType('*/*/exportCsv', Mage::helper('storelocator')->__('CSV'));
131
+ $this->addExportType('*/*/exportExcel', Mage::helper('storelocator')->__('Excel'));
132
+ $this->addExportType('*/*/exportXml', Mage::helper('storelocator')->__('XML'));
133
+ return parent::_prepareColumns();
134
+ }
135
+ /**
136
+ * prepare mass action
137
+ * @access protected
138
+ * @return Magpedia_Storelocator_Block_Adminhtml_Storelocator_Grid
139
+ *
140
+ */
141
+ protected function _prepareMassaction(){
142
+ $this->setMassactionIdField('entity_id');
143
+ $this->getMassactionBlock()->setFormFieldName('storelocator');
144
+ $this->getMassactionBlock()->addItem('delete', array(
145
+ 'label'=> Mage::helper('storelocator')->__('Delete'),
146
+ 'url' => $this->getUrl('*/*/massDelete'),
147
+ 'confirm' => Mage::helper('storelocator')->__('Are you sure?')
148
+ ));
149
+ $this->getMassactionBlock()->addItem('status', array(
150
+ 'label'=> Mage::helper('storelocator')->__('Change status'),
151
+ 'url' => $this->getUrl('*/*/massStatus', array('_current'=>true)),
152
+ 'additional' => array(
153
+ 'status' => array(
154
+ 'name' => 'status',
155
+ 'type' => 'select',
156
+ 'class' => 'required-entry',
157
+ 'label' => Mage::helper('storelocator')->__('Status'),
158
+ 'values' => array(
159
+ '1' => Mage::helper('storelocator')->__('Enabled'),
160
+ '0' => Mage::helper('storelocator')->__('Disabled'),
161
+ )
162
+ )
163
+ )
164
+ ));
165
+ return $this;
166
+ }
167
+ /**
168
+ * get the row url
169
+ * @access public
170
+ * @param Magpedia_Storelocator_Model_Storelocator
171
+ * @return string
172
+ *
173
+ */
174
+ public function getRowUrl($row){
175
+ return $this->getUrl('*/*/edit', array('id' => $row->getId()));
176
+ }
177
+ /**
178
+ * get the grid url
179
+ * @access public
180
+ * @return string
181
+ *
182
+ */
183
+ public function getGridUrl(){
184
+ return $this->getUrl('*/*/grid', array('_current'=>true));
185
+ }
186
+ /**
187
+ * after collection load
188
+ * @access protected
189
+ * @return Magpedia_Storelocator_Block_Adminhtml_Storelocator_Grid
190
+ *
191
+ */
192
+ protected function _afterLoadCollection(){
193
+ $this->getCollection()->walk('afterLoad');
194
+ parent::_afterLoadCollection();
195
+ }
196
+ /**
197
+ * filter store column
198
+ * @access protected
199
+ * @param Magpedia_Storelocator_Model_Resource_Storelocator_Collection $collection
200
+ * @param Mage_Adminhtml_Block_Widget_Grid_Column $column
201
+ * @return Magpedia_Storelocator_Block_Adminhtml_Storelocator_Grid
202
+ *
203
+ */
204
+ protected function _filterStoreCondition($collection, $column){
205
+ if (!$value = $column->getFilter()->getValue()) {
206
+ return;
207
+ }
208
+ $collection->addStoreFilter($value);
209
+ return $this;
210
+ }
211
+ }
app/code/community/Magpedia/Storelocator/Block/Adminhtml/Storelocator/Helper/Image.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magpedia_Storelocator extension
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the MIT License
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/mit-license.php
11
+ *
12
+ * @category Magpedia
13
+ * @package Magpedia_Storelocator
14
+ * @copyright Copyright (c) 2014
15
+ * @license http://opensource.org/licenses/mit-license.php MIT License
16
+ */
17
+ /**
18
+ * Store image field renderer helper
19
+ *
20
+ * @category Magpedia
21
+ * @package Magpedia_Storelocator
22
+ *
23
+ */
24
+ class Magpedia_Storelocator_Block_Adminhtml_Storelocator_Helper_Image extends Varien_Data_Form_Element_Image{
25
+ /**
26
+ * get the url of the image
27
+ * @access protected
28
+ * @return string
29
+ *
30
+ */
31
+ protected function _getUrl(){
32
+ $url = false;
33
+ if ($this->getValue()) {
34
+ $url = Mage::helper('storelocator/storelocator_image')->getImageBaseUrl().$this->getValue();
35
+ }
36
+ return $url;
37
+ }
38
+ }
39
+
app/code/community/Magpedia/Storelocator/Block/Adminhtml/Storelocator/Image.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Magpedia_Storelocator_Block_Adminhtml_Storelocator_Image extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract
3
+ {
4
+ public function render(Varien_Object $row)
5
+ {
6
+ $getData = $row->getData();
7
+ if($getData['storeimage']){ ?>
8
+ <img src="<?php echo Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_MEDIA).'storelocator/image'.$getData['storeimage'];?>" width="100" height="100" >
9
+ <?php }
10
+ }
11
+ }
12
+ ?>
app/code/community/Magpedia/Storelocator/Block/Storelocator/List.php ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magpedia_Storelocator extension
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the MIT License
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/mit-license.php
11
+ *
12
+ * @category Magpedia
13
+ * @package Magpedia_Storelocator
14
+ * @copyright Copyright (c) 2014
15
+ * @license http://opensource.org/licenses/mit-license.php MIT License
16
+ */
17
+ /**
18
+ * Store list block
19
+ *
20
+ * @category Magpedia
21
+ * @package Magpedia_Storelocator
22
+ *
23
+ */
24
+ class Magpedia_Storelocator_Block_Storelocator_List extends Mage_Core_Block_Template{
25
+ /**
26
+ * initialize
27
+ * @access public
28
+ * @return void
29
+ *
30
+ */
31
+ public function __construct(){
32
+ parent::__construct();
33
+ $managestorelocator = Mage::getResourceModel('storelocator/storelocator_collection')
34
+ ->addStoreFilter(Mage::app()->getStore())
35
+ ->addFilter('status', 1)
36
+ ;
37
+ $managestorelocator->setOrder('storetitle', 'asc');
38
+ $this->setManagestorelocator($managestorelocator);
39
+ }
40
+ /**
41
+ * prepare the layout
42
+ * @access protected
43
+ * @return Magpedia_Storelocator_Block_Storelocator_List
44
+ *
45
+ */
46
+ protected function _prepareLayout(){
47
+ parent::_prepareLayout();
48
+ $pager = $this->getLayout()->createBlock('page/html_pager', 'storelocator.storelocator.html.pager')
49
+ ->setCollection($this->getManagestorelocator());
50
+ $this->setChild('pager', $pager);
51
+ $this->getManagestorelocator()->load();
52
+ return $this;
53
+ }
54
+ /**
55
+ * get the pager html
56
+ * @access public
57
+ * @return string
58
+ *
59
+ */
60
+ public function getPagerHtml(){
61
+ return $this->getChildHtml('pager');
62
+ }
63
+ }
app/code/community/Magpedia/Storelocator/Block/Storelocator/View.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magpedia_Storelocator extension
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the MIT License
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/mit-license.php
11
+ *
12
+ * @category Magpedia
13
+ * @package Magpedia_Storelocator
14
+ * @copyright Copyright (c) 2014
15
+ * @license http://opensource.org/licenses/mit-license.php MIT License
16
+ */
17
+ /**
18
+ * Store view block
19
+ *
20
+ * @category Magpedia
21
+ * @package Magpedia_Storelocator
22
+ *
23
+ */
24
+ class Magpedia_Storelocator_Block_Storelocator_View extends Mage_Core_Block_Template{
25
+ /**
26
+ * get the current store
27
+ * @access public
28
+ * @return mixed (Magpedia_Storelocator_Model_Storelocator|null)
29
+ *
30
+ */
31
+ public function getCurrentStorelocator(){
32
+ return Mage::registry('current_storelocator_storelocator');
33
+ }
34
+ }
app/code/community/Magpedia/Storelocator/Controller/Adminhtml/Storelocator.php ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magpedia_Storelocator extension
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the MIT License
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/mit-license.php
11
+ *
12
+ * @category Magpedia
13
+ * @package Magpedia_Storelocator
14
+ * @copyright Copyright (c) 2014
15
+ * @license http://opensource.org/licenses/mit-license.php MIT License
16
+ */
17
+ /**
18
+ * module base admin controller
19
+ *
20
+ * @category Magpedia
21
+ * @package Magpedia_Storelocator
22
+ *
23
+ */
24
+ class Magpedia_Storelocator_Controller_Adminhtml_Storelocator extends Mage_Adminhtml_Controller_Action{
25
+ /**
26
+ * upload file and get the uploaded name
27
+ * @access public
28
+ * @param string $input
29
+ * @param string $destinationFolder
30
+ * @param array $data
31
+ * @return string
32
+ *
33
+ */
34
+ protected function _uploadAndGetName($input, $destinationFolder, $data){
35
+ try{
36
+ if (isset($data[$input]['delete'])){
37
+ return '';
38
+ }
39
+ else{
40
+ $uploader = new Varien_File_Uploader($input);
41
+ $uploader->setAllowRenameFiles(true);
42
+ $uploader->setFilesDispersion(true);
43
+ $uploader->setAllowCreateFolders(true);
44
+ $result = $uploader->save($destinationFolder);
45
+ return $result['file'];
46
+ }
47
+ }
48
+ catch (Exception $e){
49
+ if ($e->getCode() != Varien_File_Uploader::TMP_NAME_EMPTY){
50
+ throw $e;
51
+ }
52
+ else{
53
+ if (isset($data[$input]['value'])){
54
+ return $data[$input]['value'];
55
+ }
56
+ }
57
+ }
58
+ return '';
59
+ }
60
+ }
app/code/community/Magpedia/Storelocator/Helper/Data.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magpedia_Storelocator extension
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the MIT License
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/mit-license.php
11
+ *
12
+ * @category Magpedia
13
+ * @package Magpedia_Storelocator
14
+ * @copyright Copyright (c) 2014
15
+ * @license http://opensource.org/licenses/mit-license.php MIT License
16
+ */
17
+ /**
18
+ * Storelocator default helper
19
+ *
20
+ * @category Magpedia
21
+ * @package Magpedia_Storelocator
22
+ *
23
+ */
24
+ class Magpedia_Storelocator_Helper_Data extends Mage_Core_Helper_Abstract{
25
+ /**
26
+ * get the url to the manage storelocator list page
27
+ * @access public
28
+ * @return string
29
+ *
30
+ */
31
+ public function getManagestorelocatorUrl(){
32
+ return Mage::getUrl('storelocator/storelocator/index');
33
+ }
34
+ }
app/code/community/Magpedia/Storelocator/Helper/Image/Abstract.php ADDED
@@ -0,0 +1,461 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magpedia_Storelocator extension
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the MIT License
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/mit-license.php
11
+ *
12
+ * @category Magpedia
13
+ * @package Magpedia_Storelocator
14
+ * @copyright Copyright (c) 2014
15
+ * @license http://opensource.org/licenses/mit-license.php MIT License
16
+ */
17
+ /**
18
+ * abstract image helper
19
+ *
20
+ * @category Magpedia
21
+ * @package Magpedia_Storelocator
22
+ *
23
+ */
24
+ abstract class Magpedia_Storelocator_Helper_Image_Abstract extends Mage_Core_Helper_Data{
25
+ /**
26
+ * path to image placeholder
27
+ * override in child
28
+ * @var string
29
+ */
30
+ protected $_placeholder = '';
31
+ /**
32
+ * subdirectory to save imaves
33
+ * override in child
34
+ * @var string
35
+ */
36
+ protected $_subdir = '';
37
+ /**
38
+ * image processor
39
+ * @var null|Varien_Image_Adapter_Gd2
40
+ */
41
+ protected $_imageProcessor = null;
42
+ /**
43
+ * image to process
44
+ * @var unknown_type
45
+ */
46
+ protected $_image = null;
47
+ /**
48
+ * error message
49
+ * @var string
50
+ */
51
+ protected $_openError = "";
52
+ /**
53
+ * keep image frame
54
+ * @var bool
55
+ */
56
+ protected $_keepFrame = false;
57
+ /**
58
+ * keep image aspect ratio
59
+ * @var bool
60
+ */
61
+ protected $_keepAspectRatio = true;
62
+ /**
63
+ * constrain image
64
+ * @var bool
65
+ */
66
+ protected $_constrainOnly = true;
67
+ /**
68
+ * addaptive resize - crop
69
+ * https://github.com/wearefarm/magento-adaptive-resize/blob/master/README.md
70
+ * @var bool
71
+ */
72
+ protected $_adaptiveResize = 'center'; // false|center|top|bottom
73
+ /**
74
+ * image width
75
+ * @var mixed(null|int)
76
+ */
77
+ protected $_width = null;
78
+ /**
79
+ * image height
80
+ * @var mixed(null|int)
81
+ */
82
+ protected $_height = null;
83
+ /**
84
+ * image resize needed
85
+ * @var mixed (null|array)
86
+ */
87
+ protected $_scheduledResize = null;
88
+ /**
89
+ * image is resized
90
+ * @var bool
91
+ */
92
+ protected $_resized = false;
93
+ /**
94
+ * addaptive resize positions
95
+ * https://github.com/wearefarm/magento-adaptive-resize/blob/master/README.md
96
+ * @var array
97
+ */
98
+ protected $_adaptiveResizePositions = array(
99
+ 'center'=>array(0.5,0.5),
100
+ 'top' =>array(1,0),
101
+ 'bottom'=>array(0,1)
102
+ );
103
+ /**
104
+ * resized image folder name
105
+ * @var string
106
+ */
107
+ protected $_resizeFolderName = 'cache';
108
+ /**
109
+ * get the image base dir
110
+ * @access public
111
+ * @return string
112
+ *
113
+ */
114
+ public function getImageBaseDir(){
115
+ return Mage::getBaseDir('media').DS.$this->_subdir.DS.'image';
116
+ }
117
+ /**
118
+ * get the image url for object
119
+ * @access public
120
+ * @return string
121
+ *
122
+ */
123
+ public function getImageBaseUrl(){
124
+ return Mage::getBaseUrl('media').$this->_subdir.'/'.'image';
125
+ }
126
+
127
+ /**
128
+ * init image
129
+ * @access public
130
+ * @param Varien_Object $object
131
+ * @param string $imageField
132
+ * @return Magpedia_Storelocator_Helper_Image_Abstract
133
+ *
134
+ */
135
+ public function init(Varien_Object $object, $imageField = 'image'){
136
+ $this->_imageProcessor = null;
137
+ $this->_image = $object->getDataUsingMethod($imageField);
138
+ if(!$this->_image) {
139
+ $this->_image = '/'.$this->_placeholder;
140
+ }
141
+ $this->_widht = null;
142
+ $this->_height = null;
143
+ $this->_scheduledResize = false;
144
+ $this->_resized = false;
145
+ $this->_adaptiveResize = 'center';
146
+
147
+ try{
148
+ $this->_getImageProcessor()->open($this->getImageBaseDir().$this->_image);
149
+ }
150
+ catch (Exception $e){
151
+ $this->_openError = $e->getMessage();
152
+ try{
153
+ $this->_getImageProcessor()->open(Mage::getDesign()->getSkinUrl($this->_placeholder));
154
+ $this->_image = '/'.$this->_placeholder;
155
+ }
156
+ catch(Exception $e) {
157
+ $this->_openError .= "\n".$e->getMessage();
158
+ $this->_image = null;
159
+ }
160
+ }
161
+ return $this;
162
+ }
163
+ /**
164
+ * get the image processor
165
+ * @access protected
166
+ * @return Varien_Image_Adapter_Gd2
167
+ *
168
+ */
169
+ protected function _getImageProcessor() {
170
+ if (is_null($this->_imageProcessor)) {
171
+ $this->_imageProcessor = Varien_Image_Adapter::factory('GD2');
172
+ $this->_imageProcessor->keepFrame($this->_keepFrame);
173
+ $this->_imageProcessor->keepAspectRatio($this->_keepAspectRatio);
174
+ $this->_imageProcessor->constrainOnly($this->_constrainOnly);
175
+ }
176
+ return $this->_imageProcessor;
177
+ }
178
+ /**
179
+ * Get/set keepAspectRatio
180
+ * @access public
181
+ * @param bool $value
182
+ * @return mixed(bool|Magpedia_Storelocator_Helper_Image_Abstract)
183
+ *
184
+ */
185
+ public function keepAspectRatio($value = null){
186
+ if (null !== $value) {
187
+ $this->_getImageProcessor()->keepAspectRatio($value);
188
+ return $this;
189
+ }
190
+ else {
191
+ return $this->_getImageProcessor()->keepAspectRatio();
192
+ }
193
+ }
194
+
195
+ /**
196
+ * Get/set keepFrame
197
+ * @access public
198
+ * @param bool $value
199
+ * @return mixed(bool|Magpedia_Storelocator_Helper_Image_Abstract)
200
+ *
201
+ */
202
+ public function keepFrame($value = null){
203
+ if (null !== $value) {
204
+ $this->_getImageProcessor()->keepFrame($value);
205
+ return $this;
206
+ }
207
+ else {
208
+ return $this->_getImageProcessor()->keepFrame();
209
+ }
210
+ }
211
+ /**
212
+ * Get/set keepTransparency
213
+ * @access public
214
+ * @param bool $value
215
+ * @return mixed(bool|Magpedia_Storelocator_Helper_Image_Abstract)
216
+ *
217
+ */
218
+ public function keepTransparency($value = null){
219
+ if (null !== $value) {
220
+ $this->_getImageProcessor()->keepTransparency($value);
221
+ return $this;
222
+ }
223
+ else {
224
+ return $this->_getImageProcessor()->keepTransparency();
225
+ }
226
+ }
227
+ /**
228
+ * Get/set adaptiveResize
229
+ * @access public
230
+ * @param bool|string $value
231
+ * @return mixed(bool|Magpedia_Storelocator_Helper_Image_Abstract)
232
+ * https://github.com/wearefarm/magento-adaptive-resize/blob/master/README.md
233
+ *
234
+ */
235
+ public function adaptiveResize($value = null){
236
+ if (null !== $value) {
237
+ $this->_adaptiveResize = $value;
238
+ if($value) {
239
+ $this->keepFrame(false);
240
+ }
241
+ return $this;
242
+ }
243
+ else {
244
+ return $this->_adaptiveResize;
245
+ }
246
+ }
247
+ /**
248
+ * Get/set constrainOnly
249
+ * @access public
250
+ * @param bool $value
251
+ * @return mixed(bool|Magpedia_Storelocator_Helper_Image_Abstract)
252
+ *
253
+ */
254
+ public function constrainOnly($value = null){
255
+ if (null !== $value) {
256
+ $this->_getImageProcessor()->constrainOnly($value);
257
+ return $this;
258
+ }
259
+ else {
260
+ return $this->_getImageProcessor()->constrainOnly();
261
+ }
262
+ }
263
+ /**
264
+ * Get/set quality, values in percentage from 0 to 100
265
+ * @access public
266
+ * @param int $value
267
+ * @return mixed(bool|Magpedia_Storelocator_Helper_Image_Abstract)
268
+ *
269
+ */
270
+ public function quality($value = null){
271
+ if (null !== $value) {
272
+ $this->_getImageProcessor()->quality($value);
273
+ return $this;
274
+ }
275
+ else {
276
+ return $this->_getImageProcessor()->quality();
277
+ }
278
+ }
279
+ /**
280
+ * Get/set keepBackgroundColor
281
+ * @access public
282
+ * @param array $value
283
+ * @return mixed(bool|Magpedia_Storelocator_Helper_Image_Abstract)
284
+ *
285
+ */
286
+ public function backgroundColor($value = null){
287
+ if (null !== $value) {
288
+ $this->_getImageProcessor()-> backgroundColor($value);
289
+ return $this;
290
+ }
291
+ else {
292
+ return $this->_getImageProcessor()-> backgroundColor();
293
+ }
294
+ }
295
+ /**
296
+ * resize image
297
+ * @access public
298
+ * @param int $width - defaults to null
299
+ * @param int $height - defaults to null
300
+ * @return Magpedia_Storelocator_Helper_Image_Abstract
301
+ *
302
+ */
303
+ public function resize($width = null, $height = null) {
304
+ $this->_scheduledResize = true;
305
+ $this->_width = $width;
306
+ $this->_height = $height;
307
+ return $this;
308
+ }
309
+ /**
310
+ * get destination image prefix
311
+ * @access protected
312
+ * @return Magpedia_Storelocator_Helper_Image_Abstract
313
+ *
314
+ */
315
+ protected function _getDestinationImagePrefix() {
316
+ if(!$this->_image) {
317
+ return $this;
318
+ }
319
+ $imageRealPath = "";
320
+ if($this->_scheduledResize) {
321
+ $width = $this->_width;
322
+ $height = $this->_height;
323
+ $adaptive = $this->adaptiveResize();
324
+ $keepFrame = $this->keepFrame();
325
+ $keepAspectRatio= $this->keepAspectRatio();
326
+ $constrainOnly = $this->constrainOnly();
327
+ $imageRealPath = $width.'x'.$height;
328
+ $options = "";
329
+
330
+ if(!$keepAspectRatio) {
331
+ $imageRealPath .= '-exact';
332
+ }
333
+ else {
334
+ if(!$keepFrame && $width && $height && ($adaptive !== false)) {
335
+ $adaptive = strtolower(trim($adaptive));
336
+ if(isset($this->_adaptiveResizePositions[$adaptive])) {
337
+ $imageRealPath .= '-'.$adaptive;
338
+ }
339
+ }
340
+ }
341
+ if($keepFrame) {
342
+ $imageRealPath .= '-frame';
343
+ $_backgroundColor = $this->backgroundColor();
344
+ if($_backgroundColor) {
345
+ $imageRealPath .= '-'.implode('-',$_backgroundColor);
346
+ }
347
+ }
348
+ if(!$constrainOnly) {
349
+ $imageRealPath .= '-zoom';
350
+ }
351
+ }
352
+ return $imageRealPath;
353
+ }
354
+ /**
355
+ * get image destination path
356
+ * @access protected
357
+ * @return string
358
+ *
359
+ */
360
+ protected function _getDestinationPath() {
361
+ if(!$this->_image) {
362
+ return $this;
363
+ }
364
+ if($this->_scheduledResize) {
365
+ return $this->getImageBaseDir().DS.$this->_resizeFolderName.DS.$this->_getDestinationImagePrefix().DS.$this->_image;
366
+ } else {
367
+ return $this->getImageBaseDir().DS.$this->_image;
368
+ }
369
+ }
370
+ /**
371
+ * get image url
372
+ * @access protected
373
+ * @return mixed (string|bool)
374
+ *
375
+ */
376
+ protected function _getImageUrl() {
377
+ if(!$this->_image) {
378
+ return false;
379
+ }
380
+ if($this->_scheduledResize) {
381
+ return $this->getImageBaseUrl().'/'.$this->_resizeFolderName.'/'.$this->_getDestinationImagePrefix().$this->_image;
382
+ }
383
+ else {
384
+ return $this->getImageBaseUrl().$this->_image;
385
+ }
386
+ }
387
+ /**
388
+ * resize image
389
+ * @access protected
390
+ * @return Magpedia_Storelocator_Helper_Image_Abstract
391
+ *
392
+ */
393
+ protected function _doResize() {
394
+ if(!$this->_image || !$this->_scheduledResize || $this->_resized) {
395
+ return $this;
396
+ }
397
+ $this->_resized = true; //mark as resized
398
+ $width = $this->_width;
399
+ $height = $this->_height;
400
+ $adaptive = $width && $height &&
401
+ $this->keepAspectRatio() && !$this->keepFrame() &&
402
+ ($this->adaptiveResize() !== false);
403
+ $adaptivePosition = false;
404
+ if($adaptive) {
405
+ $adaptive = strtolower(trim($this->adaptiveResize()));
406
+ if(isset($this->_adaptiveResizePositions[$adaptive])) {
407
+ $adaptivePosition = $this->_adaptiveResizePositions[$adaptive];
408
+ }
409
+ }
410
+ $processor = $this->_getImageProcessor();
411
+
412
+ if(!$adaptivePosition) {
413
+ $processor->resize($width, $height);
414
+ return $this;
415
+ }
416
+ //make adaptive resize
417
+ //https://github.com/wearefarm/magento-adaptive-resize/blob/master/README.md
418
+ $currentRatio = $processor->getOriginalWidth() / $processor->getOriginalHeight();
419
+ $targetRatio = $width / $height;
420
+ if ($targetRatio > $currentRatio) {
421
+ $processor->resize($width, null);
422
+ }
423
+ else {
424
+ $processor->resize(null, $height);
425
+ }
426
+ $diffWidth = $processor->getOriginalWidth() - $width;
427
+ $diffHeight = $processor->getOriginalHeight() - $height;
428
+ if($diffWidth || $diffHeight) {
429
+ $processor->crop(
430
+ floor($diffHeight * $adaptivePosition[0]), //top rate
431
+ floor($diffWidth / 2),
432
+ ceil($diffWidth / 2),
433
+ ceil($diffHeight * $adaptivePosition[1]) //bottom rate
434
+ );
435
+ }
436
+ return $this;
437
+ }
438
+ /**
439
+ * to string - no need for cache expire because the image names will be different
440
+ * @access public
441
+ * @return string
442
+ *
443
+ */
444
+ public function __toString(){
445
+ try{
446
+ if(!$this->_image) {
447
+ throw new Exception($this->_openError);
448
+ }
449
+ $imageRealPath = $this->_getDestinationPath();
450
+ if (!file_exists($imageRealPath)) {
451
+ $this->_doResize();
452
+ $this->_getImageProcessor()->save($imageRealPath);
453
+ }
454
+ return $this->_getImageUrl();
455
+ }
456
+ catch (Exception $e){
457
+ Mage::logException($e);
458
+ return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAFr0lEQVR42rWXaUxUZxSGZVOKpWBRCGrSijBgDG1dagaxVgNSUqhAqq1CqzVVksb+sdZU0hgbfhQ1riEoiHFns4qVEYWglEWgVaBQLXRYJKzCzCA7KCpvz7njHbgz4AXSkryZYea73/Oe5Tv3zhQABtGfGcmCZPk/yYIZEuYIuDnJgeRKcn8pj/9Q7rw3M5g1moFpJGVnVxe0Wi20Oh107e1of/wYj1kdHejo7AR/z+oS1d0tqLunx6AeVm+vifoHBsAMZo1lYKVWq0NzyyO0PGrFo9Y2tLZp0KYRDA2bMjamN6c3OGzSxGwvmWDGWAasSR9qde0EbiVwG4E10AxnQw/XQ1nDUAYZZ2QU9fX1gRnMGtMAASTwMUvBGoYyQFoClmkJ5A0QhOHSlEtTbQoeAewVRdGy+kZoYDwGCGSacmOwKVQK6+9H/yh68uSJvAGGCGBTuACur6pCXUICssPDcXfHDvy5dy8KIyLQdOkSmh8+FNI8YCwCs54+fSpvgCNkOJeiwwieHROD3KBP8CDyJ9QePYLq/fuhjoqCml7L9/yI236+yI+L40hZDJRocHBwXAZGjTztq00o+mYbKiIj8cf2cGT6rIJKqUTakiW44a1EwdYtKNm1C/lfboBq0xcMM9GzZ8/kDRDMBJ5FkWeHrkPJD7uQvsYb177egr/LyzndQhPmpqYi2c0Fv23aiPxt25AZHIi8kycnZ4CaS1rz2lpcXbEUhd9ux7VVSmSfO8d1NaSY36cGBSJzrT9uhYYia+PnyFy/Dul+K6FpbmaoQc+fP5c3wF0twtnM5d27cfPTAEFJYRskcH69vjkMBaEh1BtBuEX9kbJIgav+q5EW6Iu0PXsYatCLFy/kDfCR4j7g1PIxSwwm+PogJCo98c/9+1L41s24FxaCIh8f5K3xwdVlC3CeTkTCewqkBvjhSthnkzMgwvn9WS9PpH7kh3Pve4yE0+brURLsixJqxOIPvKHyWoicM2eEWscrZuPI3Dk4tciNoRLJGuCB0q0fMMJQOb5YgQMz7BHj5mQYJvE+3shdqkDpvHkonz8PqmUKZJ8+zQAh0ti3HbDPbAriFusNDA0NscZngKFC9C8n2sm1foh6wwqHZ9vgdnIyYlZ5QeVojd/p0r+szHHZxR5Z8fGGCCtKSxHnZI1ouuZsyMcMlkjWAEN79dELEV/4ficOzZmOE7TpPlcnpDrb4A5d9oDgv7ja42ZcrAHOgLggfyTMskbsXBukROyeeAkYKkbPHd9UX48DHjMRa0lAgmfQJXenmiPFfQauH4+RwH89fBgXXGyRTOaOLpiFlsbGic8BHi5i9GyAm+7yoYOIUdghiZbfmmqBC++8iWiaCyJcXVaG6ABfpNCaLDJ32s0OV+ga2oP3Eu+QvJ/8A8mA3oDkvLP7Q8H+OOVB9ba2QKHja8icb4vEBTNx0cMB11xex10q071pFjhPa47QWuojPs58P+H7Cov/HyLGcjkD7Fw0IElf0oH9OOjpiBvudihztEG1uRnqSGoylE3RH/N0wsWon4WHFY1Gg5aWFjQ1NaGhoRH19Q1QqVR3iPEWyVzOgJh+iQFWQ10dTuz8DvsCVuOY0gXRXvNxNMQfsfRZjVotwGtpfBcWFqKoqAjldM+oqKhguJr2X0iayjw5Axy9sYGRE01yvvk7vo4HGEeel5fHnwt1r6qqYngj7b1IbD45Ayb1Z4DUgHS48BqGcb055Tk5uUIfVVdXIyMjQ2tra7uC9p7OHHkDBB7bgGn0/Bmv5ej5QaaOSlRcXIyamhoB7uzs7Ef72jJjogaM6//K9HPH63Q6qKkPKisrkZ6e3kiRL2c4yUzWgPjDZCIGAEgM0C8qNsBwbrh3STZSoLyB5QR8Ve1HKwGv5x7gsz5E8AL+HSie9YkYsHx5Rr25FJOUF2kuyUoCkjUgNcGZsJ6kpolDZrz6F2ZUsalEFcbPAAAAAElFTkSuQmCC';
459
+ }
460
+ }
461
+ }
app/code/community/Magpedia/Storelocator/Helper/Storelocator.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magpedia_Storelocator extension
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the MIT License
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/mit-license.php
11
+ *
12
+ * @category Magpedia
13
+ * @package Magpedia_Storelocator
14
+ * @copyright Copyright (c) 2014
15
+ * @license http://opensource.org/licenses/mit-license.php MIT License
16
+ */
17
+ /**
18
+ * Store helper
19
+ *
20
+ * @category Magpedia
21
+ * @package Magpedia_Storelocator
22
+ *
23
+ */
24
+ class Magpedia_Storelocator_Helper_Storelocator extends Mage_Core_Helper_Abstract{
25
+ /**
26
+ * check if breadcrumbs can be used
27
+ * @access public
28
+ * @return bool
29
+ *
30
+ */
31
+ public function getUseBreadcrumbs(){
32
+ return Mage::getStoreConfigFlag('storelocator/storelocator/breadcrumbs');
33
+ }
34
+ }
app/code/community/Magpedia/Storelocator/Helper/Storelocator/Image.php ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magpedia_Storelocator extension
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the MIT License
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/mit-license.php
11
+ *
12
+ * @category Magpedia
13
+ * @package Magpedia_Storelocator
14
+ * @copyright Copyright (c) 2014
15
+ * @license http://opensource.org/licenses/mit-license.php MIT License
16
+ */
17
+ /**
18
+ * Store image helper
19
+ *
20
+ * @category Magpedia
21
+ * @package Magpedia_Storelocator
22
+ *
23
+ */
24
+ class Magpedia_Storelocator_Helper_Storelocator_Image extends Magpedia_Storelocator_Helper_Image_Abstract{
25
+ /**
26
+ * image placeholder
27
+ * @var string
28
+ */
29
+ protected $_placeholder = 'images/placeholder/storelocator.jpg';
30
+ /**
31
+ * image subdir
32
+ * @var string
33
+ */
34
+ protected $_subdir = 'storelocator';
35
+ }
app/code/community/Magpedia/Storelocator/Model/Resource/Setup.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magpedia_Storelocator extension
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the MIT License
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/mit-license.php
11
+ *
12
+ * @category Magpedia
13
+ * @package Magpedia_Storelocator
14
+ * @copyright Copyright (c) 2014
15
+ * @license http://opensource.org/licenses/mit-license.php MIT License
16
+ */
17
+ /**
18
+ * Storelocator setup
19
+ *
20
+ * @category Magpedia
21
+ * @package Magpedia_Storelocator
22
+ *
23
+ */
24
+ class Magpedia_Storelocator_Model_Resource_Setup extends Mage_Core_Model_Resource_Setup{
25
+
26
+ }
app/code/community/Magpedia/Storelocator/Model/Resource/Storelocator.php ADDED
@@ -0,0 +1,126 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Magpedia_Storelocator extension
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the MIT License
9
+ * that is bundled with this package in the file LICENSE.txt.
10
+ * It is also available through the world-wide-web at this URL:
11
+ * http://opensource.org/licenses/mit-license.php
12
+ *
13
+ * @category Magpedia
14
+ * @package Magpedia_Storelocator
15
+ * @copyright Copyright (c) 2014
16
+ * @license http://opensource.org/licenses/mit-license.php MIT License
17
+ */
18
+
19
+ /**
20
+ * Store resource model
21
+ *
22
+ * @category Magpedia
23
+ * @package Magpedia_Storelocator
24
+ *
25
+ */
26
+ class Magpedia_Storelocator_Model_Resource_Storelocator extends Mage_Core_Model_Resource_Db_Abstract {
27
+
28
+ /**
29
+ * constructor
30
+ * @access public
31
+ * @return void
32
+ *
33
+ */
34
+ public function _construct() {
35
+ $this->_init('storelocator/storelocator', 'entity_id');
36
+ }
37
+
38
+ /**
39
+ * Get store ids to which specified item is assigned
40
+ * @access public
41
+ * @param int $storelocatorId
42
+ * @return array
43
+ *
44
+ */
45
+ public function lookupStoreIds($storelocatorId) {
46
+ $adapter = $this->_getReadAdapter();
47
+ $select = $adapter->select()
48
+ ->from($this->getTable('storelocator/storelocator_store'), 'store_id')
49
+ ->where('storelocator_id = ?', (int) $storelocatorId);
50
+ return $adapter->fetchCol($select);
51
+ }
52
+
53
+ /**
54
+ * Perform operations after object load
55
+ * @access public
56
+ * @param Mage_Core_Model_Abstract $object
57
+ * @return Magpedia_Storelocator_Model_Resource_Storelocator
58
+ *
59
+ */
60
+ protected function _afterLoad(Mage_Core_Model_Abstract $object) {
61
+ if ($object->getId()) {
62
+ $stores = $this->lookupStoreIds($object->getId());
63
+ $object->setData('store_id', $stores);
64
+ }
65
+ return parent::_afterLoad($object);
66
+ }
67
+
68
+ /**
69
+ * Retrieve select object for load object data
70
+ *
71
+ * @param string $field
72
+ * @param mixed $value
73
+ * @param Magpedia_Storelocator_Model_Storelocator $object
74
+ * @return Zend_Db_Select
75
+ */
76
+ protected function _getLoadSelect($field, $value, $object) {
77
+ $select = parent::_getLoadSelect($field, $value, $object);
78
+ if ($object->getStoreId()) {
79
+ $storeIds = array(Mage_Core_Model_App::ADMIN_STORE_ID, (int) $object->getStoreId());
80
+ $select->join(
81
+ array('storelocator_storelocator_store' => $this->getTable('storelocator/storelocator_store')), $this->getMainTable() . '.entity_id = storelocator_storelocator_store.storelocator_id', array()
82
+ )
83
+ ->where('storelocator_storelocator_store.store_id IN (?)', $storeIds)
84
+ ->order('storelocator_storelocator_store.store_id DESC')
85
+ ->limit(1);
86
+ }
87
+ return $select;
88
+ }
89
+
90
+ /**
91
+ * Assign store to store views
92
+ * @access protected
93
+ * @param Mage_Core_Model_Abstract $object
94
+ * @return Magpedia_Storelocator_Model_Resource_Storelocator
95
+ *
96
+ */
97
+ protected function _afterSave(Mage_Core_Model_Abstract $object) {
98
+ $oldStores = $this->lookupStoreIds($object->getId());
99
+ $newStores = (array) $object->getStores();
100
+ if (empty($newStores)) {
101
+ $newStores = (array) $object->getStoreId();
102
+ }
103
+ $table = $this->getTable('storelocator/storelocator_store');
104
+ $insert = array_diff($newStores, $oldStores);
105
+ $delete = array_diff($oldStores, $newStores);
106
+ if ($delete) {
107
+ $where = array(
108
+ 'storelocator_id = ?' => (int) $object->getId(),
109
+ 'store_id IN (?)' => $delete
110
+ );
111
+ $this->_getWriteAdapter()->delete($table, $where);
112
+ }
113
+ if ($insert) {
114
+ $data = array();
115
+ foreach ($insert as $storeId) {
116
+ $data[] = array(
117
+ 'storelocator_id' => (int) $object->getId(),
118
+ 'store_id' => (int) $storeId
119
+ );
120
+ }
121
+ $this->_getWriteAdapter()->insertMultiple($table, $data);
122
+ }
123
+ return parent::_afterSave($object);
124
+ }
125
+
126
+ }
app/code/community/Magpedia/Storelocator/Model/Resource/Storelocator/Collection.php ADDED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magpedia_Storelocator extension
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the MIT License
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/mit-license.php
11
+ *
12
+ * @category Magpedia
13
+ * @package Magpedia_Storelocator
14
+ * @copyright Copyright (c) 2014
15
+ * @license http://opensource.org/licenses/mit-license.php MIT License
16
+ */
17
+ /**
18
+ * Store collection resource model
19
+ *
20
+ * @category Magpedia
21
+ * @package Magpedia_Storelocator
22
+ *
23
+ */
24
+ class Magpedia_Storelocator_Model_Resource_Storelocator_Collection extends Mage_Core_Model_Resource_Db_Collection_Abstract{
25
+ protected $_joinedFields = array();
26
+ /**
27
+ * constructor
28
+ * @access public
29
+ * @return void
30
+ *
31
+ */
32
+ public function _construct(){
33
+ parent::_construct();
34
+ $this->_init('storelocator/storelocator');
35
+ $this->_map['fields']['store'] = 'store_table.store_id';
36
+ }
37
+ /**
38
+ * get managestorelocator as array
39
+ * @access protected
40
+ * @param string $valueField
41
+ * @param string $labelField
42
+ * @param array $additional
43
+ * @return array
44
+ *
45
+ */
46
+ protected function _toOptionArray($valueField='entity_id', $labelField='storetitle', $additional=array()){
47
+ return parent::_toOptionArray($valueField, $labelField, $additional);
48
+ }
49
+ /**
50
+ * get options hash
51
+ * @access protected
52
+ * @param string $valueField
53
+ * @param string $labelField
54
+ * @return array
55
+ *
56
+ */
57
+ protected function _toOptionHash($valueField='entity_id', $labelField='storetitle'){
58
+ return parent::_toOptionHash($valueField, $labelField);
59
+ }
60
+ /**
61
+ * Add filter by store
62
+ * @access public
63
+ * @param int|Mage_Core_Model_Store $store
64
+ * @param bool $withAdmin
65
+ * @return Magpedia_Storelocator_Model_Resource_Storelocator_Collection
66
+ *
67
+ */
68
+ public function addStoreFilter($store, $withAdmin = true){
69
+ if (!isset($this->_joinedFields['store'])){
70
+ if ($store instanceof Mage_Core_Model_Store) {
71
+ $store = array($store->getId());
72
+ }
73
+ if (!is_array($store)) {
74
+ $store = array($store);
75
+ }
76
+ if ($withAdmin) {
77
+ $store[] = Mage_Core_Model_App::ADMIN_STORE_ID;
78
+ }
79
+ $this->addFilter('store', array('in' => $store), 'public');
80
+ $this->_joinedFields['store'] = true;
81
+ }
82
+ return $this;
83
+ }
84
+ /**
85
+ * Join store relation table if there is store filter
86
+ * @access protected
87
+ * @return Magpedia_Storelocator_Model_Resource_Storelocator_Collection
88
+ *
89
+ */
90
+ protected function _renderFiltersBefore(){
91
+ if ($this->getFilter('store')) {
92
+ $this->getSelect()->join(
93
+ array('store_table' => $this->getTable('storelocator/storelocator_store')),
94
+ 'main_table.entity_id = store_table.storelocator_id',
95
+ array()
96
+ )->group('main_table.entity_id');
97
+ /*
98
+ * Allow analytic functions usage because of one field grouping
99
+ */
100
+ $this->_useAnalyticFunction = true;
101
+ }
102
+ return parent::_renderFiltersBefore();
103
+ }
104
+ /**
105
+ * Get SQL for get record count.
106
+ * Extra GROUP BY strip added.
107
+ * @access public
108
+ * @return Varien_Db_Select
109
+ *
110
+ */
111
+ public function getSelectCountSql(){
112
+ $countSelect = parent::getSelectCountSql();
113
+ $countSelect->reset(Zend_Db_Select::GROUP);
114
+ return $countSelect;
115
+ }
116
+ }
app/code/community/Magpedia/Storelocator/Model/Storelocator.php ADDED
@@ -0,0 +1,98 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magpedia_Storelocator extension
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the MIT License
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/mit-license.php
11
+ *
12
+ * @category Magpedia
13
+ * @package Magpedia_Storelocator
14
+ * @copyright Copyright (c) 2014
15
+ * @license http://opensource.org/licenses/mit-license.php MIT License
16
+ */
17
+ /**
18
+ * Store model
19
+ *
20
+ * @category Magpedia
21
+ * @package Magpedia_Storelocator
22
+ *
23
+ */
24
+ class Magpedia_Storelocator_Model_Storelocator extends Mage_Core_Model_Abstract{
25
+ /**
26
+ * Entity code.
27
+ * Can be used as part of method name for entity processing
28
+ */
29
+ const ENTITY= 'storelocator_storelocator';
30
+ const CACHE_TAG = 'storelocator_storelocator';
31
+ /**
32
+ * Prefix of model events names
33
+ * @var string
34
+ */
35
+ protected $_eventPrefix = 'storelocator_storelocator';
36
+
37
+ /**
38
+ * Parameter name in event
39
+ * @var string
40
+ */
41
+ protected $_eventObject = 'storelocator';
42
+ /**
43
+ * constructor
44
+ * @access public
45
+ * @return void
46
+ *
47
+ */
48
+ public function _construct(){
49
+ parent::_construct();
50
+ $this->_init('storelocator/storelocator');
51
+ }
52
+ /**
53
+ * before save store
54
+ * @access protected
55
+ * @return Magpedia_Storelocator_Model_Storelocator
56
+ *
57
+ */
58
+ protected function _beforeSave(){
59
+ parent::_beforeSave();
60
+ $now = Mage::getSingleton('core/date')->gmtDate();
61
+ if ($this->isObjectNew()){
62
+ $this->setCreatedAt($now);
63
+ }
64
+ $this->setUpdatedAt($now);
65
+ return $this;
66
+ }
67
+ /**
68
+ * get the url to the store details page
69
+ * @access public
70
+ * @return string
71
+ *
72
+ */
73
+ public function getStorelocatorUrl(){
74
+ return Mage::getUrl('storelocator/storelocator/view', array('id'=>$this->getId()));
75
+ }
76
+ /**
77
+ * get the storelocator Description
78
+ * @access public
79
+ * @return string
80
+ *
81
+ */
82
+ public function getDescription(){
83
+ $description = $this->getData('description');
84
+ $helper = Mage::helper('cms');
85
+ $processor = $helper->getBlockTemplateProcessor();
86
+ $html = $processor->filter($description);
87
+ return $html;
88
+ }
89
+ /**
90
+ * save storelocator relation
91
+ * @access public
92
+ * @return Magpedia_Storelocator_Model_Storelocator
93
+ *
94
+ */
95
+ protected function _afterSave() {
96
+ return parent::_afterSave();
97
+ }
98
+ }
app/code/community/Magpedia/Storelocator/controllers/Adminhtml/Storelocator/StorelocatorController.php ADDED
@@ -0,0 +1,270 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magpedia_Storelocator extension
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the MIT License
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/mit-license.php
11
+ *
12
+ * @category Magpedia
13
+ * @package Magpedia_Storelocator
14
+ * @copyright Copyright (c) 2014
15
+ * @license http://opensource.org/licenses/mit-license.php MIT License
16
+ */
17
+ /**
18
+ * Store admin controller
19
+ *
20
+ * @category Magpedia
21
+ * @package Magpedia_Storelocator
22
+ *
23
+ */
24
+ class Magpedia_Storelocator_Adminhtml_Storelocator_StorelocatorController extends Magpedia_Storelocator_Controller_Adminhtml_Storelocator{
25
+ /**
26
+ * init the storelocator
27
+ * @access protected
28
+ * @return Magpedia_Storelocator_Model_Storelocator
29
+ */
30
+ protected function _initStorelocator(){
31
+ $storelocatorId = (int) $this->getRequest()->getParam('id');
32
+ $storelocator = Mage::getModel('storelocator/storelocator');
33
+ if ($storelocatorId) {
34
+ $storelocator->load($storelocatorId);
35
+ }
36
+ Mage::register('current_storelocator', $storelocator);
37
+ return $storelocator;
38
+ }
39
+ /**
40
+ * default action
41
+ * @access public
42
+ * @return void
43
+ *
44
+ */
45
+ public function indexAction() {
46
+ $this->loadLayout();
47
+ $this->_title(Mage::helper('storelocator')->__('Storelocator'))
48
+ ->_title(Mage::helper('storelocator')->__('Manage Storelocator'));
49
+ $this->renderLayout();
50
+ }
51
+ /**
52
+ * grid action
53
+ * @access public
54
+ * @return void
55
+ *
56
+ */
57
+ public function gridAction() {
58
+ $this->loadLayout()->renderLayout();
59
+ }
60
+ /**
61
+ * edit store - action
62
+ * @access public
63
+ * @return void
64
+ *
65
+ */
66
+ public function editAction() {
67
+ $storelocatorId = $this->getRequest()->getParam('id');
68
+ $storelocator = $this->_initStorelocator();
69
+ if ($storelocatorId && !$storelocator->getId()) {
70
+ $this->_getSession()->addError(Mage::helper('storelocator')->__('This store no longer exists.'));
71
+ $this->_redirect('*/*/');
72
+ return;
73
+ }
74
+ $data = Mage::getSingleton('adminhtml/session')->getFormData(true);
75
+ if (!empty($data)) {
76
+ $storelocator->setData($data);
77
+ }
78
+ Mage::register('storelocator_data', $storelocator);
79
+ $this->loadLayout();
80
+ $this->_title(Mage::helper('storelocator')->__('Storelocator'))
81
+ ->_title(Mage::helper('storelocator')->__('Manage Storelocator'));
82
+ if ($storelocator->getId()){
83
+ $this->_title($storelocator->getStoretitle());
84
+ }
85
+ else{
86
+ $this->_title(Mage::helper('storelocator')->__('Add store'));
87
+ }
88
+ if (Mage::getSingleton('cms/wysiwyg_config')->isEnabled()) {
89
+ $this->getLayout()->getBlock('head')->setCanLoadTinyMce(true);
90
+ }
91
+ $this->renderLayout();
92
+ }
93
+ /**
94
+ * new store action
95
+ * @access public
96
+ * @return void
97
+ *
98
+ */
99
+ public function newAction() {
100
+ $this->_forward('edit');
101
+ }
102
+ /**
103
+ * save store - action
104
+ * @access public
105
+ * @return void
106
+ *
107
+ */
108
+ public function saveAction() {
109
+ if ($data = $this->getRequest()->getPost('storelocator')) {
110
+ try {
111
+ $storelocator = $this->_initStorelocator();
112
+ $storelocator->addData($data);
113
+ $storeimageName = $this->_uploadAndGetName('storeimage', Mage::helper('storelocator/storelocator_image')->getImageBaseDir(), $data);
114
+ $storelocator->setData('storeimage', $storeimageName);
115
+ $storelocator->save();
116
+ Mage::getSingleton('adminhtml/session')->addSuccess(Mage::helper('storelocator')->__('Store was successfully saved'));
117
+ Mage::getSingleton('adminhtml/session')->setFormData(false);
118
+ if ($this->getRequest()->getParam('back')) {
119
+ $this->_redirect('*/*/edit', array('id' => $storelocator->getId()));
120
+ return;
121
+ }
122
+ $this->_redirect('*/*/');
123
+ return;
124
+ }
125
+ catch (Mage_Core_Exception $e){
126
+ if (isset($data['storeimage']['value'])){
127
+ $data['storeimage'] = $data['storeimage']['value'];
128
+ }
129
+ Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
130
+ Mage::getSingleton('adminhtml/session')->setFormData($data);
131
+ $this->_redirect('*/*/edit', array('id' => $this->getRequest()->getParam('id')));
132
+ return;
133
+ }
134
+ catch (Exception $e) {
135
+ Mage::logException($e);
136
+ if (isset($data['storeimage']['value'])){
137
+ $data['storeimage'] = $data['storeimage']['value'];
138
+ }
139
+ Mage::getSingleton('adminhtml/session')->addError(Mage::helper('storelocator')->__('There was a problem saving the store.'));
140
+ Mage::getSingleton('adminhtml/session')->setFormData($data);
141
+ $this->_redirect('*/*/edit', array('id' => $this->getRequest()->getParam('id')));
142
+ return;
143
+ }
144
+ }
145
+ Mage::getSingleton('adminhtml/session')->addError(Mage::helper('storelocator')->__('Unable to find store to save.'));
146
+ $this->_redirect('*/*/');
147
+ }
148
+ /**
149
+ * delete store - action
150
+ * @access public
151
+ * @return void
152
+ *
153
+ */
154
+ public function deleteAction() {
155
+ if( $this->getRequest()->getParam('id') > 0) {
156
+ try {
157
+ $storelocator = Mage::getModel('storelocator/storelocator');
158
+ $storelocator->setId($this->getRequest()->getParam('id'))->delete();
159
+ Mage::getSingleton('adminhtml/session')->addSuccess(Mage::helper('storelocator')->__('Store was successfully deleted.'));
160
+ $this->_redirect('*/*/');
161
+ return;
162
+ }
163
+ catch (Mage_Core_Exception $e){
164
+ Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
165
+ $this->_redirect('*/*/edit', array('id' => $this->getRequest()->getParam('id')));
166
+ }
167
+ catch (Exception $e) {
168
+ Mage::getSingleton('adminhtml/session')->addError(Mage::helper('storelocator')->__('There was an error deleteing store.'));
169
+ $this->_redirect('*/*/edit', array('id' => $this->getRequest()->getParam('id')));
170
+ Mage::logException($e);
171
+ return;
172
+ }
173
+ }
174
+ Mage::getSingleton('adminhtml/session')->addError(Mage::helper('storelocator')->__('Could not find store to delete.'));
175
+ $this->_redirect('*/*/');
176
+ }
177
+ /**
178
+ * mass delete store - action
179
+ * @access public
180
+ * @return void
181
+ *
182
+ */
183
+ public function massDeleteAction() {
184
+ $storelocatorIds = $this->getRequest()->getParam('storelocator');
185
+ if(!is_array($storelocatorIds)) {
186
+ Mage::getSingleton('adminhtml/session')->addError(Mage::helper('storelocator')->__('Please select manage storelocator to delete.'));
187
+ }
188
+ else {
189
+ try {
190
+ foreach ($storelocatorIds as $storelocatorId) {
191
+ $storelocator = Mage::getModel('storelocator/storelocator');
192
+ $storelocator->setId($storelocatorId)->delete();
193
+ }
194
+ Mage::getSingleton('adminhtml/session')->addSuccess(Mage::helper('storelocator')->__('Total of %d manage storelocator were successfully deleted.', count($storelocatorIds)));
195
+ }
196
+ catch (Mage_Core_Exception $e){
197
+ Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
198
+ }
199
+ catch (Exception $e) {
200
+ Mage::getSingleton('adminhtml/session')->addError(Mage::helper('storelocator')->__('There was an error deleteing manage storelocator.'));
201
+ Mage::logException($e);
202
+ }
203
+ }
204
+ $this->_redirect('*/*/index');
205
+ }
206
+ /**
207
+ * mass status change - action
208
+ * @access public
209
+ * @return void
210
+ *
211
+ */
212
+ public function massStatusAction(){
213
+ $storelocatorIds = $this->getRequest()->getParam('storelocator');
214
+ if(!is_array($storelocatorIds)) {
215
+ Mage::getSingleton('adminhtml/session')->addError(Mage::helper('storelocator')->__('Please select manage storelocator.'));
216
+ }
217
+ else {
218
+ try {
219
+ foreach ($storelocatorIds as $storelocatorId) {
220
+ $storelocator = Mage::getSingleton('storelocator/storelocator')->load($storelocatorId)
221
+ ->setStatus($this->getRequest()->getParam('status'))
222
+ ->setIsMassupdate(true)
223
+ ->save();
224
+ }
225
+ $this->_getSession()->addSuccess($this->__('Total of %d manage storelocator were successfully updated.', count($storelocatorIds)));
226
+ }
227
+ catch (Mage_Core_Exception $e){
228
+ Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
229
+ }
230
+ catch (Exception $e) {
231
+ Mage::getSingleton('adminhtml/session')->addError(Mage::helper('storelocator')->__('There was an error updating manage storelocator.'));
232
+ Mage::logException($e);
233
+ }
234
+ }
235
+ $this->_redirect('*/*/index');
236
+ }
237
+ /**
238
+ * export as csv - action
239
+ * @access public
240
+ * @return void
241
+ *
242
+ */
243
+ public function exportCsvAction(){
244
+ $fileName = 'storelocator.csv';
245
+ $content = $this->getLayout()->createBlock('storelocator/adminhtml_storelocator_grid')->getCsv();
246
+ $this->_prepareDownloadResponse($fileName, $content);
247
+ }
248
+ /**
249
+ * export as MsExcel - action
250
+ * @access public
251
+ * @return void
252
+ *
253
+ */
254
+ public function exportExcelAction(){
255
+ $fileName = 'storelocator.xls';
256
+ $content = $this->getLayout()->createBlock('storelocator/adminhtml_storelocator_grid')->getExcelFile();
257
+ $this->_prepareDownloadResponse($fileName, $content);
258
+ }
259
+ /**
260
+ * export as xml - action
261
+ * @access public
262
+ * @return void
263
+ *
264
+ */
265
+ public function exportXmlAction(){
266
+ $fileName = 'storelocator.xml';
267
+ $content = $this->getLayout()->createBlock('storelocator/adminhtml_storelocator_grid')->getXml();
268
+ $this->_prepareDownloadResponse($fileName, $content);
269
+ }
270
+ }
app/code/community/Magpedia/Storelocator/controllers/StorelocatorController.php ADDED
@@ -0,0 +1,183 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Magpedia_Storelocator extension
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the MIT License
9
+ * that is bundled with this package in the file LICENSE.txt.
10
+ * It is also available through the world-wide-web at this URL:
11
+ * http://opensource.org/licenses/mit-license.php
12
+ *
13
+ * @category Magpedia
14
+ * @package Magpedia_Storelocator
15
+ * @copyright Copyright (c) 2014
16
+ * @license http://opensource.org/licenses/mit-license.php MIT License
17
+ */
18
+
19
+ /**
20
+ * Store front contrller
21
+ *
22
+ * @category Magpedia
23
+ * @package Magpedia_Storelocator
24
+ * @author Magpedia
25
+ */
26
+ class Magpedia_Storelocator_StorelocatorController extends Mage_Core_Controller_Front_Action {
27
+
28
+ /**
29
+ * default action
30
+ * @access public
31
+ * @return void
32
+ * @author Magpedia
33
+ */
34
+ public function indexAction() {
35
+ $this->loadLayout();
36
+ if (Mage::helper('storelocator/storelocator')->getUseBreadcrumbs()) {
37
+ if ($breadcrumbBlock = $this->getLayout()->getBlock('breadcrumbs')) {
38
+ $breadcrumbBlock->addCrumb('home', array(
39
+ 'label' => Mage::helper('storelocator')->__('Home'),
40
+ 'link' => Mage::getUrl(),
41
+ )
42
+ );
43
+ $breadcrumbBlock->addCrumb('managestorelocator', array(
44
+ 'label' => Mage::helper('storelocator')->__('Storelocator'),
45
+ 'link' => '',
46
+ )
47
+ );
48
+ }
49
+ }
50
+ $this->renderLayout();
51
+ }
52
+
53
+ public function infowindowdescriptionAction() {
54
+ echo '{{#location}}
55
+ <div class="loc-name">{{name}}</div>
56
+ <div>{{address}}</div>
57
+ <div>{{country}}</div>
58
+ <div>{{city}}, {{state}} {{postal}}</div>
59
+ <div>{{hours1}}</div>
60
+ <div>{{hours2}}</div>
61
+ <div>{{hours3}}</div>
62
+ <div>{{phone}}</div>
63
+ {{#if storeimage}}<div class="loc-storeimage"><img src="'.Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_MEDIA).'storelocator/image{{storeimage}}" width="120" height="100" >{{/if}}</div>
64
+ <div><a href="http://{{web}}" target="_blank">{{web}}</a></div>
65
+ {{/location}}';
66
+ }
67
+
68
+ public function locationlistdescriptionAction() {
69
+ echo '
70
+ {{#location}}
71
+ <li data-markerid="{{markerid}}">
72
+ <div class="list-label">{{marker}}</div>
73
+ <div class="list-details">
74
+ <div class="list-content">
75
+ <div class="loc-name">{{name}}</div>
76
+ <div class="loc-addr">{{address}}</div>
77
+ <div class="loc-addr2">{{country}}</div>
78
+ <div class="loc-addr3">{{city}}, {{state}} {{postal}}</div>
79
+ <div class="loc-email">{{email}}</div>
80
+ <div class="loc-phone">{{phone}}</div>
81
+ <div class="loc-fax">{{fax}}</div>
82
+ {{#if storeimage}}<div class="loc-storeimage"><img src="'.Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_MEDIA).'storelocator/image{{storeimage}}" width="120" height="100" >{{/if}}</div>
83
+ <div class="loc-web"><a href="http://{{web}}" target="_blank">{{web}}</a></div>
84
+ {{#if distance}}<div class="loc-dist">{{distance}} {{length}}</div>
85
+ <div class="loc-directions"><a href="http://maps.google.com/maps?saddr={{origin}}&amp;daddr={{address}} {{address2}} {{city}}, {{state}} {{postal}}" target="_blank">Directions</a></div>{{/if}}
86
+ </div>
87
+ </div>
88
+ </li>
89
+ {{/location}}';
90
+ }
91
+
92
+ public function locationAction() {
93
+ $xml = '<?xml version="1.0"?>
94
+ <markers>';
95
+ $storeCol = Mage::getModel('storelocator/storelocator')->getCollection()
96
+ ->addStoreFilter(Mage::app()->getStore()->getId())
97
+ ->addFieldToFilter('status', 1);
98
+ foreach ($storeCol as $storeData) {
99
+ //echo "<pre>";print_r($storeData->getData());die;
100
+ $xml.='<marker name="' . $storeData['storetitle'] . '" lat="' . $storeData['latitude'] . '" lng="' . $storeData['longitude'] . '" address="' . $storeData['address']. '" country="' . Mage::app()->getLocale()->getCountryTranslation($storeData['country']). '" city="' . $storeData['city'] . '" state="' . $storeData['state']. '" postal="' . $storeData['postalcode'] . '" phone="' . $storeData['phone'] . '" fax="' . $storeData['fax'].'" web="' . $storeData['web'] . '" email="'.$storeData['email'].'" storeimage="'.$storeData['storeimage'].'" />';
101
+ }
102
+ echo $xml.='</markers>';
103
+ }
104
+
105
+ public function searchlocationAction() {
106
+ $params = $this->getRequest()->getParams();
107
+ $searchtxt = $params['zipcode'];
108
+ $searchCol = Mage::getModel("storelocator/storelocator")->getCollection()
109
+ ->addFieldToFilter(
110
+ array('storetitle','postalcode','state','city'),
111
+ array(
112
+ array('like'=>'%'.$searchtxt.'%'),
113
+ array('like'=>'%'.$searchtxt.'%'),
114
+ array('like'=>'%'.$searchtxt.'%'),
115
+ array('like'=>'%'.$searchtxt.'%')
116
+ )
117
+ )
118
+ ->addStoreFilter(Mage::app()->getStore()->getId())
119
+ ->load();
120
+ if ($searchtxt && count($searchCol) > 0) {
121
+ $xml = '<?xml version="1.0"?>
122
+ <markers>';
123
+ foreach ($searchCol as $storeData) {
124
+ $xml.='<marker name="' . $storeData['storetitle'] . '" lat="' . $storeData['latitude'] . '" lng="' . $storeData['longitude'] . '" address="' . $storeData['address']. '" country="' . Mage::app()->getLocale()->getCountryTranslation($storeData['country']). '" city="' . $storeData['city'] . '" state="' . $storeData['state']. '" postal="' . $storeData['postalcode'] . '" phone="' . $storeData['phone'] . '" fax="' . $storeData['fax'].'" web="' . $storeData['web'] . '" email="'.$storeData['email'].'" storeimage="'.$storeData['storeimage'].'" />';
125
+ }
126
+ echo $xml.='</markers>';
127
+ } else {
128
+ echo $xml = '<?xml version="1.0"?>
129
+ <markers><marker name="No Record Found."/></markers>';
130
+ }
131
+ }
132
+
133
+ /**
134
+ * view store action
135
+ * @access public
136
+ * @return void
137
+ * @author Magpedia
138
+ */
139
+ public function viewAction() {
140
+ $storelocatorId = $this->getRequest()->getParam('id', 0);
141
+ $storelocator = Mage::getModel('storelocator/storelocator')
142
+ ->setStoreId(Mage::app()->getStore()->getId())
143
+ ->load($storelocatorId);
144
+ if (!$storelocator->getId()) {
145
+ $this->_forward('no-route');
146
+ } elseif (!$storelocator->getStatus()) {
147
+ $this->_forward('no-route');
148
+ } else {
149
+ Mage::register('current_storelocator_storelocator', $storelocator);
150
+ $this->loadLayout();
151
+ if ($root = $this->getLayout()->getBlock('root')) {
152
+ $root->addBodyClass('storelocator-storelocator storelocator-storelocator' . $storelocator->getId());
153
+ }
154
+ if (Mage::helper('storelocator/storelocator')->getUseBreadcrumbs()) {
155
+ if ($breadcrumbBlock = $this->getLayout()->getBlock('breadcrumbs')) {
156
+ $breadcrumbBlock->addCrumb('home', array(
157
+ 'label' => Mage::helper('storelocator')->__('Home'),
158
+ 'link' => Mage::getUrl(),
159
+ )
160
+ );
161
+ $breadcrumbBlock->addCrumb('managestorelocator', array(
162
+ 'label' => Mage::helper('storelocator')->__('Manage Storelocator'),
163
+ 'link' => Mage::helper('storelocator')->getManagestorelocatorUrl(),
164
+ )
165
+ );
166
+ $breadcrumbBlock->addCrumb('storelocator', array(
167
+ 'label' => $storelocator->getStoretitle(),
168
+ 'link' => '',
169
+ )
170
+ );
171
+ }
172
+ }
173
+ $this->renderLayout();
174
+ }
175
+ }
176
+
177
+ public function preDispatch(){
178
+ if(!Mage::getStoreConfig('storelocator/storelocator/active')){
179
+ $this->_redirect("");
180
+ }
181
+ }
182
+
183
+ }
app/code/community/Magpedia/Storelocator/etc/adminhtml.xml ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * Magpedia_Storelocator extension
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the MIT License
9
+ * that is bundled with this package in the file LICENSE.txt.
10
+ * It is also available through the world-wide-web at this URL:
11
+ * http://opensource.org/licenses/mit-license.php
12
+ *
13
+ * @category Magpedia
14
+ * @package Magpedia_Storelocator
15
+ * @copyright Copyright (c) 2014
16
+ * @license http://opensource.org/licenses/mit-license.php MIT License
17
+ */
18
+ -->
19
+ <config>
20
+ <acl>
21
+ <resources>
22
+ <admin>
23
+ <children>
24
+ <system>
25
+ <children>
26
+ <config>
27
+ <children>
28
+ <storelocator translate="title" module="storelocator">
29
+ <title>Storelocator</title>
30
+ </storelocator>
31
+ </children>
32
+ </config>
33
+ </children>
34
+ </system>
35
+ <storelocator translate="title" module="storelocator">
36
+ <title>Storelocator</title>
37
+ <children>
38
+ <storelocator translate="title" module="storelocator">
39
+ <title>Manage Storelocator</title>
40
+ </storelocator>
41
+ </children>
42
+ </storelocator>
43
+ </children>
44
+ </admin>
45
+ </resources>
46
+ </acl>
47
+ <menu>
48
+ <storelocator translate="title" module="storelocator">
49
+ <title>Storelocator</title>
50
+ <sort_order>100</sort_order>
51
+ <depends>
52
+ <module>Magpedia_Storelocator</module>
53
+ </depends>
54
+ <children>
55
+ <storelocator translate="title" module="storelocator">
56
+ <title>Manage Storelocator</title>
57
+ <action>adminhtml/storelocator_storelocator</action>
58
+ <sort_order>0</sort_order>
59
+ </storelocator>
60
+ </children>
61
+ </storelocator>
62
+ </menu>
63
+ </config>
app/code/community/Magpedia/Storelocator/etc/config.xml ADDED
@@ -0,0 +1,138 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * Magpedia_Storelocator extension
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the MIT License
9
+ * that is bundled with this package in the file LICENSE.txt.
10
+ * It is also available through the world-wide-web at this URL:
11
+ * http://opensource.org/licenses/mit-license.php
12
+ *
13
+ * @category Magpedia
14
+ * @package Magpedia_Storelocator
15
+ * @copyright Copyright (c) 2014
16
+ * @license http://opensource.org/licenses/mit-license.php MIT License
17
+ */
18
+ -->
19
+ <config>
20
+ <modules>
21
+ <Magpedia_Storelocator>
22
+ <version>0.0.1</version>
23
+ </Magpedia_Storelocator>
24
+ </modules>
25
+ <global>
26
+ <resources>
27
+ <magpedia_storelocator_setup>
28
+ <setup>
29
+ <module>Magpedia_Storelocator</module>
30
+ <class>Magpedia_Storelocator_Model_Resource_Setup</class>
31
+ </setup>
32
+ </magpedia_storelocator_setup>
33
+ </resources>
34
+ <blocks>
35
+ <storelocator>
36
+ <class>Magpedia_Storelocator_Block</class>
37
+ </storelocator>
38
+ </blocks>
39
+ <helpers>
40
+ <storelocator>
41
+ <class>Magpedia_Storelocator_Helper</class>
42
+ </storelocator>
43
+ </helpers>
44
+ <models>
45
+ <storelocator>
46
+ <class>Magpedia_Storelocator_Model</class>
47
+ <resourceModel>storelocator_resource</resourceModel>
48
+ </storelocator>
49
+ <storelocator_resource>
50
+ <class>Magpedia_Storelocator_Model_Resource</class>
51
+ <entities>
52
+ <storelocator>
53
+ <table>storelocator_storelocator</table>
54
+ </storelocator>
55
+ <storelocator_store>
56
+ <table>storelocator_storelocator_store</table>
57
+ </storelocator_store>
58
+ </entities>
59
+ </storelocator_resource>
60
+ </models>
61
+ <events>
62
+ <controller_front_init_routers>
63
+ <observers>
64
+ <magpedia_storelocator>
65
+ <class>Magpedia_Storelocator_Controller_Router</class>
66
+ <method>initControllerRouters</method>
67
+ </magpedia_storelocator>
68
+ </observers>
69
+ </controller_front_init_routers>
70
+ </events>
71
+ </global>
72
+ <adminhtml>
73
+ <layout>
74
+ <updates>
75
+ <magpedia_storelocator>
76
+ <file>magpedia_storelocator.xml</file>
77
+ </magpedia_storelocator>
78
+ </updates>
79
+ </layout>
80
+ <translate>
81
+ <modules>
82
+ <Magpedia_Storelocator>
83
+ <files>
84
+ <default>Magpedia_Storelocator.csv</default>
85
+ </files>
86
+ </Magpedia_Storelocator>
87
+ </modules>
88
+ </translate>
89
+ </adminhtml>
90
+ <admin>
91
+ <routers>
92
+ <adminhtml>
93
+ <args>
94
+ <modules>
95
+ <Magpedia_Storelocator before="Mage_Adminhtml">Magpedia_Storelocator_Adminhtml</Magpedia_Storelocator>
96
+ </modules>
97
+ </args>
98
+ </adminhtml>
99
+ </routers>
100
+ </admin>
101
+ <frontend>
102
+ <routers>
103
+ <storelocator>
104
+ <use>standard</use>
105
+ <args>
106
+ <module>Magpedia_Storelocator</module>
107
+ <frontName>storelocator</frontName>
108
+ </args>
109
+ </storelocator>
110
+ </routers>
111
+ <layout>
112
+ <updates>
113
+ <magpedia_storelocator>
114
+ <file>magpedia_storelocator.xml</file>
115
+ </magpedia_storelocator>
116
+ </updates>
117
+ </layout>
118
+ <translate>
119
+ <modules>
120
+ <Magpedia_Storelocator>
121
+ <files>
122
+ <default>Magpedia_Storelocator.csv</default>
123
+ </files>
124
+ </Magpedia_Storelocator>
125
+ </modules>
126
+ </translate>
127
+ </frontend>
128
+ <default>
129
+ <storelocator>
130
+ <storelocator>
131
+ <active>1</active>
132
+ <breadcrumbs>1</breadcrumbs>
133
+ <defaultlon>77.35756620000006</defaultlon>
134
+ <defaultlat>28.5785766</defaultlat>
135
+ </storelocator>
136
+ </storelocator>
137
+ </default>
138
+ </config>
app/code/community/Magpedia/Storelocator/etc/system.xml ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * Magpedia_Storelocator extension
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the MIT License
9
+ * that is bundled with this package in the file LICENSE.txt.
10
+ * It is also available through the world-wide-web at this URL:
11
+ * http://opensource.org/licenses/mit-license.php
12
+ *
13
+ * @category Magpedia
14
+ * @package Magpedia_Storelocator
15
+ * @copyright Copyright (c) 2014
16
+ * @license http://opensource.org/licenses/mit-license.php MIT License
17
+ */
18
+ -->
19
+ <config>
20
+ <tabs>
21
+ <magpedia translate="label" module="storelocator">
22
+ <label>Magpedia</label>
23
+ <sort_order>2000</sort_order>
24
+ </magpedia>
25
+ </tabs>
26
+ <sections>
27
+ <storelocator translate="label" module="storelocator">
28
+ <class>separator-top</class>
29
+ <label>Store Locator</label>
30
+ <tab>magpedia</tab>
31
+ <frontend_type>text</frontend_type>
32
+ <sort_order>100</sort_order>
33
+ <show_in_default>1</show_in_default>
34
+ <show_in_website>1</show_in_website>
35
+ <show_in_store>1</show_in_store>
36
+ <groups>
37
+ <storelocator translate="label" module="storelocator">
38
+ <label>General Settings</label>
39
+ <frontend_type>text</frontend_type>
40
+ <sort_order>10</sort_order>
41
+ <show_in_default>1</show_in_default>
42
+ <show_in_website>1</show_in_website>
43
+ <show_in_store>1</show_in_store>
44
+ <fields>
45
+ <active translate="label">
46
+ <label>Enable Store Locator</label>
47
+ <frontend_type>select</frontend_type>
48
+ <source_model>adminhtml/system_config_source_yesno</source_model>
49
+ <sort_order>10</sort_order>
50
+ <show_in_default>1</show_in_default>
51
+ <show_in_website>1</show_in_website>
52
+ <show_in_store>1</show_in_store>
53
+ <comment>Enable Store Locator</comment>
54
+ </active>
55
+ <breadcrumbs translate="label" module="storelocator">
56
+ <label>Enable Breadcrumbs For Storelocator</label>
57
+ <frontend_type>select</frontend_type>
58
+ <source_model>adminhtml/system_config_source_yesno</source_model>
59
+ <sort_order>11</sort_order>
60
+ <show_in_default>1</show_in_default>
61
+ <show_in_website>1</show_in_website>
62
+ <show_in_store>1</show_in_store>
63
+ </breadcrumbs>
64
+ <defaultlon translate="label">
65
+ <label>Default Longitude</label>
66
+ <frontend_type>text</frontend_type>
67
+ <sort_order>12</sort_order>
68
+ <show_in_default>1</show_in_default>
69
+ <show_in_website>1</show_in_website>
70
+ <show_in_store>1</show_in_store>
71
+ <comment>Default Longitude</comment>
72
+ </defaultlon>
73
+ <defaultlat translate="label">
74
+ <label>Default Latitude</label>
75
+ <frontend_type>text</frontend_type>
76
+ <sort_order>13</sort_order>
77
+ <show_in_default>1</show_in_default>
78
+ <show_in_website>1</show_in_website>
79
+ <show_in_store>1</show_in_store>
80
+ <comment>Default Latitude</comment>
81
+ </defaultlat>
82
+
83
+ <!--<marker translate="label comment">
84
+ <label>Marker Image</label>
85
+ <comment>Allowed file types: jpeg, gif, png.</comment>
86
+ <frontend_type>image</frontend_type>
87
+ <backend_model>adminhtml/system_config_backend_image</backend_model>
88
+ <upload_dir>skin/frontend/default/default/storelocator/images/marker</upload_dir>
89
+ <base_url type="skin" scope_info="1">frontend/default/default/storelocator/images/marker</base_url>
90
+ <sort_order>14</sort_order>
91
+ <show_in_default>1</show_in_default>
92
+ <show_in_website>1</show_in_website>
93
+ <show_in_store>1</show_in_store>
94
+ </marker>-->
95
+
96
+ </fields>
97
+ </storelocator>
98
+ </groups>
99
+ </storelocator>
100
+ </sections>
101
+ </config>
app/code/community/Magpedia/Storelocator/etc/widget.xml ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * Magpedia_Storelocator extension
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the MIT License
9
+ * that is bundled with this package in the file LICENSE.txt.
10
+ * It is also available through the world-wide-web at this URL:
11
+ * http://opensource.org/licenses/mit-license.php
12
+ *
13
+ * @category Magpedia
14
+ * @package Magpedia_Storelocator
15
+ * @copyright Copyright (c) 2014
16
+ * @license http://opensource.org/licenses/mit-license.php MIT License
17
+ */
18
+ -->
19
+ <widgets>
20
+ <storelocator_storelocator_view type="storelocator/storelocator_widget_view" translate="name description" module="storelocator">
21
+ <name>Store view</name>
22
+ <description>Store view widget</description>
23
+ <is_email_compatible>0</is_email_compatible>
24
+ <parameters>
25
+ <storelocator_id type="complex" translate="label">
26
+ <visible>1</visible>
27
+ <required>1</required>
28
+ <label>Store</label>
29
+ <type>label</type>
30
+ <helper_block>
31
+ <type>storelocator/adminhtml_storelocator_widget_chooser</type>
32
+ <data>
33
+ <button translate="open">
34
+ <open>Select Store</open>
35
+ </button>
36
+ </data>
37
+ </helper_block>
38
+ <sort_order>120</sort_order>
39
+ </storelocator_id>
40
+ </parameters>
41
+ </storelocator_storelocator_view>
42
+ <storelocator_storelocator_link type="storelocator/storelocator_widget_link" translate="name description" module="storelocator">
43
+ <name>Store link</name>
44
+ <description>Store link widget</description>
45
+ <is_email_compatible>0</is_email_compatible>
46
+ <parameters>
47
+ <storelocator_id type="complex" translate="label">
48
+ <visible>1</visible>
49
+ <required>1</required>
50
+ <label>Store</label>
51
+ <type>label</type>
52
+ <helper_block>
53
+ <type>storelocator/adminhtml_storelocator_widget_chooser</type>
54
+ <data>
55
+ <button translate="open">
56
+ <open>Select Store</open>
57
+ </button>
58
+ </data>
59
+ </helper_block>
60
+ <sort_order>130</sort_order>
61
+ </storelocator_id>
62
+ </parameters>
63
+ </storelocator_storelocator_link>
64
+ </widgets>
app/code/community/Magpedia/Storelocator/sql/magpedia_storelocator_setup/install-0.0.1.php ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magpedia_Storelocator extension
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the MIT License
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/mit-license.php
11
+ *
12
+ * @category Magpedia
13
+ * @package Magpedia_Storelocator
14
+ * @copyright Copyright (c) 2014
15
+ * @license http://opensource.org/licenses/mit-license.php MIT License
16
+ */
17
+ /**
18
+ * Storelocator module install script
19
+ *
20
+ * @category Magpedia
21
+ * @package Magpedia_Storelocator
22
+ *
23
+ */
24
+ $this->startSetup();
25
+ $table = $this->getConnection()
26
+ ->newTable($this->getTable('storelocator/storelocator'))
27
+ ->addColumn('entity_id', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array(
28
+ 'identity' => true,
29
+ 'nullable' => false,
30
+ 'primary' => true,
31
+ ), 'Store ID')
32
+ ->addColumn('storetitle', Varien_Db_Ddl_Table::TYPE_TEXT, 255, array(
33
+ 'nullable' => false,
34
+ ), 'Store Title')
35
+
36
+ ->addColumn('storelink', Varien_Db_Ddl_Table::TYPE_TEXT, 255, array(
37
+ ), 'Store Link')
38
+
39
+ ->addColumn('country', Varien_Db_Ddl_Table::TYPE_TEXT, 2, array(
40
+ 'nullable' => false,
41
+ ), 'Country')
42
+
43
+ ->addColumn('state', Varien_Db_Ddl_Table::TYPE_TEXT, 255, array(
44
+ ), 'State')
45
+
46
+ ->addColumn('city', Varien_Db_Ddl_Table::TYPE_TEXT, 255, array(
47
+ 'nullable' => false,
48
+ ), 'City')
49
+
50
+ ->addColumn('postalcode', Varien_Db_Ddl_Table::TYPE_TEXT, 255, array(
51
+ 'nullable' => false,
52
+ ), 'Postal Code')
53
+
54
+ ->addColumn('address', Varien_Db_Ddl_Table::TYPE_TEXT, 255, array(
55
+ 'nullable' => false,
56
+ ), 'Address')
57
+
58
+ ->addColumn('latitude', Varien_Db_Ddl_Table::TYPE_TEXT, 255, array(
59
+ 'nullable' => false,
60
+ ), 'Latitude')
61
+
62
+ ->addColumn('longitude', Varien_Db_Ddl_Table::TYPE_TEXT, 255, array(
63
+ 'nullable' => false,
64
+ ), 'Longitude')
65
+
66
+ ->addColumn('email', Varien_Db_Ddl_Table::TYPE_TEXT, 255, array(
67
+ ), 'Store Email')
68
+
69
+ ->addColumn('phone', Varien_Db_Ddl_Table::TYPE_TEXT, 255, array(
70
+ ), 'Phone')
71
+
72
+ ->addColumn('fax', Varien_Db_Ddl_Table::TYPE_TEXT, 255, array(
73
+ ), 'Fax')
74
+
75
+ ->addColumn('description', Varien_Db_Ddl_Table::TYPE_TEXT, '64k', array(
76
+ ), 'Description')
77
+
78
+ ->addColumn('storeimage', Varien_Db_Ddl_Table::TYPE_TEXT, 255, array(
79
+ ), 'Store Image')
80
+
81
+ ->addColumn('sortorder', Varien_Db_Ddl_Table::TYPE_TEXT, 255, array(
82
+ ), 'Sort Order')
83
+
84
+ ->addColumn('storetime', Varien_Db_Ddl_Table::TYPE_TEXT, 255, array(
85
+ ), 'Store Time')
86
+
87
+ ->addColumn('status', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array(
88
+ ), 'Status')
89
+
90
+ ->addColumn('created_at', Varien_Db_Ddl_Table::TYPE_TIMESTAMP, null, array(
91
+ ), 'Store Creation Time')
92
+ ->addColumn('updated_at', Varien_Db_Ddl_Table::TYPE_TIMESTAMP, null, array(
93
+ ), 'Store Modification Time')
94
+ ->setComment('Store Table');
95
+ $this->getConnection()->createTable($table);
96
+
97
+ $table = $this->getConnection()
98
+ ->newTable($this->getTable('storelocator/storelocator_store'))
99
+ ->addColumn('storelocator_id', Varien_Db_Ddl_Table::TYPE_SMALLINT, null, array(
100
+ 'nullable' => false,
101
+ 'primary' => true,
102
+ ), 'Store ID')
103
+ ->addColumn('store_id', Varien_Db_Ddl_Table::TYPE_SMALLINT, null, array(
104
+ 'unsigned' => true,
105
+ 'nullable' => false,
106
+ 'primary' => true,
107
+ ), 'Store ID')
108
+ ->addIndex($this->getIdxName('storelocator/storelocator_store', array('store_id')), array('store_id'))
109
+ ->addForeignKey($this->getFkName('storelocator/storelocator_store', 'storelocator_id', 'storelocator/storelocator', 'entity_id'), 'storelocator_id', $this->getTable('storelocator/storelocator'), 'entity_id', Varien_Db_Ddl_Table::ACTION_CASCADE, Varien_Db_Ddl_Table::ACTION_CASCADE)
110
+ ->addForeignKey($this->getFkName('storelocator/storelocator_store', 'store_id', 'core/store', 'store_id'), 'store_id', $this->getTable('core/store'), 'store_id', Varien_Db_Ddl_Table::ACTION_CASCADE, Varien_Db_Ddl_Table::ACTION_CASCADE)
111
+ ->setComment('Manage Storelocator To Store Linkage Table');
112
+ $this->getConnection()->createTable($table);
113
+ $this->endSetup();
app/design/adminhtml/default/default/layout/magpedia_storelocator.xml ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * Magpedia_Storelocator extension
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the MIT License
9
+ * that is bundled with this package in the file LICENSE.txt.
10
+ * It is also available through the world-wide-web at this URL:
11
+ * http://opensource.org/licenses/mit-license.php
12
+ *
13
+ * @category Magpedia
14
+ * @package Magpedia_Storelocator
15
+ * @copyright Copyright (c) 2014
16
+ * @license http://opensource.org/licenses/mit-license.php MIT License
17
+ */
18
+ -->
19
+ <layout>
20
+ <!-- Manage Storelocator grid action -->
21
+ <adminhtml_storelocator_storelocator_index>
22
+ <reference name="menu">
23
+ <action method="setActive">
24
+ <menupath>storelocator/storelocator</menupath>
25
+ </action>
26
+ </reference>
27
+ <reference name="content">
28
+ <block type="storelocator/adminhtml_storelocator" name="storelocator" />
29
+ </reference>
30
+ </adminhtml_storelocator_storelocator_index>
31
+ <adminhtml_storelocator_storelocator_grid>
32
+ <block type="core/text_list" name="root" output="toHtml">
33
+ <block type="storelocator/adminhtml_storelocator_grid" name="storelocator_grid"/>
34
+ </block>
35
+ </adminhtml_storelocator_storelocator_grid>
36
+ <!-- Storelocator add/edit action -->
37
+ <adminhtml_storelocator_storelocator_edit>
38
+ <update handle="editor"/>
39
+ <reference name="menu">
40
+ <action method="setActive">
41
+ <menupath>storelocator/storelocator</menupath>
42
+ </action>
43
+ </reference>
44
+ <reference name="content">
45
+ <block type="storelocator/adminhtml_storelocator_edit" name="storelocator_edit"></block>
46
+ </reference>
47
+ <reference name="left">
48
+ <block type="storelocator/adminhtml_storelocator_edit_tabs" name="storelocator_tabs"></block>
49
+ </reference>
50
+ </adminhtml_storelocator_storelocator_edit>
51
+ </layout>
app/design/frontend/default/default/layout/magpedia_storelocator.xml ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * Magpedia_Storelocator extension
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the MIT License
9
+ * that is bundled with this package in the file LICENSE.txt.
10
+ * It is also available through the world-wide-web at this URL:
11
+ * http://opensource.org/licenses/mit-license.php
12
+ *
13
+ * @category Magpedia
14
+ * @package Magpedia_Storelocator
15
+ * @copyright Copyright (c) 2014
16
+ * @license http://opensource.org/licenses/mit-license.php MIT License
17
+ */
18
+ -->
19
+ <layout>
20
+ <default>
21
+ <reference name="head">
22
+ <action method="addCss">
23
+ <stylesheet>storelocator/css/map.css</stylesheet>
24
+ </action>
25
+ <action method="addJs">
26
+ <script>storelocator/jquery-1.10.1.min.js</script>
27
+ </action>
28
+ <action method="addJs">
29
+ <script>storelocator/noConflict.js</script>
30
+ </action>
31
+ <action method="addJs">
32
+ <script>storelocator/handlebars-1.0.0.min.js</script>
33
+ </action>
34
+ <block type="core/text" name="google.cdn.jquery">
35
+ <action method="setText">
36
+ <text><![CDATA[<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script><script type="text/javascript">jQuery.noConflict();</script>]]>
37
+ </text>
38
+ </action>
39
+ </block>
40
+ <action method="addJs">
41
+ <script>storelocator/jquery.storelocator.js</script>
42
+ </action>
43
+ </reference>
44
+ <reference name="top.links">
45
+ <action method="addLink" translate="label title" module="storelocator" ifconfig="storelocator/storelocator/active">
46
+ <label>Store Locator</label>
47
+ <url helper="storelocator/getManagestorelocatorUrl" />
48
+ <title>Store Locator</title>
49
+ <prepare />
50
+ <urlParams/>
51
+ <position>120</position>
52
+ </action>
53
+ </reference>
54
+ <reference name="footer_links">
55
+ <action method="addLink" translate="label title" module="storelocator" ifconfig="storelocator/storelocator/active">
56
+ <label>Store Locator</label>
57
+ <url helper="storelocator/getManagestorelocatorUrl" />
58
+ <title>Store Locator</title>
59
+ <prepare />
60
+ <urlParams/>
61
+ <position>120</position>
62
+ </action>
63
+ </reference>
64
+ </default>
65
+ <storelocator_storelocator_index translate="label" module="storelocator">
66
+ <label>Manage Storelocator list</label>
67
+ <reference name="root">
68
+ <action method="setTemplate">
69
+ <template>page/1column.phtml</template>
70
+ </action>
71
+ </reference>
72
+ <reference name="content">
73
+ <block type="storelocator/storelocator_list" name="storelocator_list" template="magpedia_storelocator/storelocator/list.phtml" />
74
+ </reference>
75
+ </storelocator_storelocator_index>
76
+ <storelocator_storelocator_view translate="label" module="storelocator">
77
+ <label>Store view page</label>
78
+ <reference name="root">
79
+ <action method="setTemplate">
80
+ <template>page/1column.phtml</template>
81
+ </action>
82
+ </reference>
83
+ <reference name="content">
84
+ <block type="storelocator/storelocator_view" name="storelocator_view" template="magpedia_storelocator/storelocator/view.phtml" />
85
+ </reference>
86
+ </storelocator_storelocator_view>
87
+ </layout>
app/design/frontend/default/default/template/magpedia_storelocator/storelocator/list.phtml ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magpedia_Storelocator extension
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the MIT License
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/mit-license.php
11
+ *
12
+ * @category Magpedia
13
+ * @package Magpedia_Storelocator
14
+ * @copyright Copyright (c) 2014
15
+ * @license http://opensource.org/licenses/mit-license.php MIT License
16
+ */
17
+ /**
18
+ * Store list template
19
+ *
20
+ * @category Magpedia
21
+ * @package Magpedia_Storelocator
22
+ * @author Magpedia
23
+ */
24
+ ?>
25
+ <?php echo $this->getMessagesBlock()->getGroupedHtml() ?>
26
+ <div class="page-title storelocator-title">
27
+ <h1><?php echo Mage::helper('storelocator')->__('Store Locator') ?></h1>
28
+ </div>
29
+
30
+ <?php
31
+ $lng = Mage::getStoreConfig('storelocator/storelocator/defaultlon');
32
+ $lat = Mage::getStoreConfig('storelocator/storelocator/defaultlat');
33
+ ?>
34
+ <div id="store-locator-container">
35
+ <div id="form-container">
36
+ <form id="user-location" method="post" action="#">
37
+ <input type="hidden" name="location" value="<?php echo $this->getBaseUrl() . 'storelocator/storelocator/location/'; ?>" id="location">
38
+ <input type="hidden" name="searchurl" value="<?php echo $this->getBaseUrl() . 'storelocator/storelocator/searchlocation/'; ?>" id="searchurl">
39
+ <input type="hidden" name="infowindowdesc" value="<?php echo $this->getBaseUrl() . 'storelocator/storelocator/infowindowdescription/'; ?>" id="infowindowdesc">
40
+ <input type="hidden" name="locationlist" value="<?php echo $this->getBaseUrl() . 'storelocator/storelocator/locationlistdescription/'; ?>" id="locationlist">
41
+ <div id="form-input">
42
+ <label for="address">Enter City OR State OR Phone OR Zip Code:</label>
43
+ <input type="text" id="address" name="address" />
44
+ </div>
45
+ <button id="submit" type="submit">Submit</button>
46
+ </form>
47
+ </div>
48
+
49
+ <div id="map-container">
50
+ <div id="loc-list">
51
+ <ul id="list"></ul>
52
+ </div>
53
+ <div id="map"></div>
54
+ </div>
55
+ </div>
56
+
57
+ <script type="text/javascript">
58
+ jQuery(function() {
59
+ jQuery('#map-container').storeLocator({'slideMap' : false, 'defaultLoc': true, 'defaultLat': '<?php echo $lat; ?>', 'defaultLng' : '<?php echo $lng; ?>' });
60
+ });
61
+ </script>
app/design/frontend/default/default/template/magpedia_storelocator/storelocator/view.phtml ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magpedia_Storelocator extension
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the MIT License
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/mit-license.php
11
+ *
12
+ * @category Magpedia
13
+ * @package Magpedia_Storelocator
14
+ * @copyright Copyright (c) 2014
15
+ * @license http://opensource.org/licenses/mit-license.php MIT License
16
+ */
17
+ /**
18
+ * Store view template
19
+ *
20
+ * @category Magpedia
21
+ * @package Magpedia_Storelocator
22
+ * @author Ultimate Module Creator
23
+ */
24
+ ?>
25
+ <?php $_storelocator = $this->getCurrentStorelocator();?>
26
+ <?php echo $this->getMessagesBlock()->getGroupedHtml() ?>
27
+ <div class="page-title storelocator-title">
28
+ <h1><?php echo $_storelocator->getStoretitle(); ?></h1>
29
+ </div>
30
+ <div class="storelocator-view">
31
+ <div class="storelocator-storetitle">
32
+ <?php echo Mage::helper('storelocator')->__('Store Title');?>:<?php echo $_storelocator->getStoretitle();?>
33
+ </div>
34
+ <div class="storelocator-storelink">
35
+ <?php echo Mage::helper('storelocator')->__('Store Link');?>:<?php echo $_storelocator->getStorelink();?>
36
+ </div>
37
+ <div class="storelocator-country">
38
+ <?php echo Mage::helper('storelocator')->__("Country");?>:<?php echo ($_storelocator->getCountry()) ? Mage::getModel('directory/country')->load($_storelocator->getCountry())->getName():Mage::helper('storelocator')->__('None') ?>
39
+ </div>
40
+ <div class="storelocator-state">
41
+ <?php echo Mage::helper('storelocator')->__('State');?>:<?php echo $_storelocator->getState();?>
42
+ </div>
43
+ <div class="storelocator-city">
44
+ <?php echo Mage::helper('storelocator')->__('City');?>:<?php echo $_storelocator->getCity();?>
45
+ </div>
46
+ <div class="storelocator-postalcode">
47
+ <?php echo Mage::helper('storelocator')->__('Postal Code');?>:<?php echo $_storelocator->getPostalcode();?>
48
+ </div>
49
+ <div class="storelocator-address">
50
+ <?php echo Mage::helper('storelocator')->__('Address');?>:<?php echo $_storelocator->getAddress();?>
51
+ </div>
52
+ <div class="storelocator-latitude">
53
+ <?php echo Mage::helper('storelocator')->__('Latitude');?>:<?php echo $_storelocator->getLatitude();?>
54
+ </div>
55
+ <div class="storelocator-longitude">
56
+ <?php echo Mage::helper('storelocator')->__('Longitude');?>:<?php echo $_storelocator->getLongitude();?>
57
+ </div>
58
+ <div class="storelocator-phone">
59
+ <?php echo Mage::helper('storelocator')->__('Phone');?>:<?php echo $_storelocator->getPhone();?>
60
+ </div>
61
+ <div class="storelocator-fax">
62
+ <?php echo Mage::helper('storelocator')->__('Fax');?>:<?php echo $_storelocator->getFax();?>
63
+ </div>
64
+ <div class="storelocator-description">
65
+ <?php echo Mage::helper('storelocator')->__('Description');?>:<?php echo $_storelocator->getDescription();?>
66
+ </div>
67
+ <div class="storelocator-storeimage">
68
+ <?php if ($_storelocator->getStoreimage()) :?>
69
+ <img src="<?php echo Mage::helper('storelocator/storelocator_image')->init($_storelocator, 'storeimage')->resize(75);?>" alt="<?php echo $this->htmlEscape($_storelocator->getStoretitle());?>" />
70
+ <?php endif;?>
71
+ </div>
72
+ <div class="storelocator-sortorder">
73
+ <?php echo Mage::helper('storelocator')->__('Sort Order');?>:<?php echo $_storelocator->getSortorder();?>
74
+ </div>
75
+
76
+ </div>
app/design/frontend/default/default/template/magpedia_storelocator/storelocator/widget/link.phtml ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magpedia_Storelocator extension
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the MIT License
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/mit-license.php
11
+ *
12
+ * @category Magpedia
13
+ * @package Magpedia_Storelocator
14
+ * @copyright Copyright (c) 2014
15
+ * @license http://opensource.org/licenses/mit-license.php MIT License
16
+ */
17
+ /**
18
+ * Store link widget template
19
+ *
20
+ * @category Magpedia
21
+ * @package Magpedia_Storelocator
22
+ * @author Ultimate Module Creator
23
+ */
24
+ ?>
25
+ <?php $_storelocator = $this->getCurrentStorelocator();?>
26
+ <?php if ($_storelocator) :?>
27
+ <div class="storelocator-widget-link">
28
+ <a href="<?php echo $_storelocator->getStorelocatorUrl()?>"><?php echo $_storelocator->getStoretitle()?></a>
29
+ </div>
30
+ <?php endif;?>
app/design/frontend/default/default/template/magpedia_storelocator/storelocator/widget/view.phtml ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magpedia_Storelocator extension
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the MIT License
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/mit-license.php
11
+ *
12
+ * @category Magpedia
13
+ * @package Magpedia_Storelocator
14
+ * @copyright Copyright (c) 2014
15
+ * @license http://opensource.org/licenses/mit-license.php MIT License
16
+ */
17
+ /**
18
+ * Store view widget template
19
+ *
20
+ * @category Magpedia
21
+ * @package Magpedia_Storelocator
22
+ * @author Ultimate Module Creator
23
+ */
24
+ ?>
25
+ <?php $_storelocator = $this->getCurrentStorelocator();?>
26
+ <?php if ($_storelocator) :?>
27
+ <div class="storelocator-widget-view">
28
+ <h3><?php echo $_storelocator->getStoretitle()?></h3>
29
+ <div>
30
+ <?php echo Mage::helper('storelocator')->__('Store Title');?>:<?php echo $_storelocator->getStoretitle();?>
31
+ <?php echo Mage::helper('storelocator')->__('Store Link');?>:<?php echo $_storelocator->getStorelink();?>
32
+ <?php echo Mage::helper('storelocator')->__('City');?>:<?php echo $_storelocator->getCity();?>
33
+ <?php echo Mage::helper('storelocator')->__('Postal Code');?>:<?php echo $_storelocator->getPostalcode();?>
34
+ <?php echo Mage::helper('storelocator')->__('Description');?>:<?php echo $_storelocator->getDescription();?>
35
+ <?php if ($_storelocator->getStoreimage()) :?>
36
+ <img src="<?php echo Mage::helper('storelocator/storelocator_image')->init($_storelocator, 'storeimage')->resize(75);?>" alt="<?php echo $this->htmlEscape($_storelocator->getStoretitle());?>" />
37
+ <?php endif;?>
38
+
39
+ </div>
40
+ </div>
41
+ <?php endif;?>
app/etc/modules/Magpedia_Storelocator.xml ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * Magpedia_Storelocator extension
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the MIT License
9
+ * that is bundled with this package in the file LICENSE.txt.
10
+ * It is also available through the world-wide-web at this URL:
11
+ * http://opensource.org/licenses/mit-license.php
12
+ *
13
+ * @category Magpedia
14
+ * @package Magpedia_Storelocator
15
+ * @copyright Copyright (c) 2014
16
+ * @license http://opensource.org/licenses/mit-license.php MIT License
17
+ */
18
+ -->
19
+ <config>
20
+ <modules>
21
+ <Magpedia_Storelocator>
22
+ <active>true</active>
23
+ <codePool>community</codePool>
24
+ <depends>
25
+ <Mage_Core />
26
+ </depends>
27
+ </Magpedia_Storelocator>
28
+ </modules>
29
+ </config>
js/storelocator/handlebars-1.0.0.min.js ADDED
@@ -0,0 +1,214 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+
3
+ Copyright (C) 2011 by Yehuda Katz
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
22
+
23
+ */
24
+
25
+ var Handlebars={};(function(d,c){d.VERSION="1.0.0";d.COMPILER_REVISION=4;d.REVISION_CHANGES={1:"<= 1.0.rc.2",2:"== 1.0.0-rc.3",3:"== 1.0.0-rc.4",4:">= 1.0.0"};
26
+ d.helpers={};d.partials={};var n=Object.prototype.toString,b="[object Function]",h="[object Object]";d.registerHelper=function(l,u,i){if(n.call(l)===h){if(i||u){throw new d.Exception("Arg not supported with multiple helpers");
27
+ }d.Utils.extend(this.helpers,l);}else{if(i){u.not=i;}this.helpers[l]=u;}};d.registerPartial=function(i,l){if(n.call(i)===h){d.Utils.extend(this.partials,i);
28
+ }else{this.partials[i]=l;}};d.registerHelper("helperMissing",function(i){if(arguments.length===2){return c;}else{throw new Error("Missing helper: '"+i+"'");
29
+ }});d.registerHelper("blockHelperMissing",function(u,l){var i=l.inverse||function(){},w=l.fn;var v=n.call(u);if(v===b){u=u.call(this);}if(u===true){return w(this);
30
+ }else{if(u===false||u==null){return i(this);}else{if(v==="[object Array]"){if(u.length>0){return d.helpers.each(u,l);}else{return i(this);}}else{return w(u);
31
+ }}}});d.K=function(){};d.createFrame=Object.create||function(i){d.K.prototype=i;var l=new d.K();d.K.prototype=null;return l;};d.logger={DEBUG:0,INFO:1,WARN:2,ERROR:3,level:3,methodMap:{0:"debug",1:"info",2:"warn",3:"error"},log:function(u,i){if(d.logger.level<=u){var l=d.logger.methodMap[u];
32
+ if(typeof console!=="undefined"&&console[l]){console[l].call(console,i);}}}};d.log=function(l,i){d.logger.log(l,i);};d.registerHelper("each",function(l,C){var A=C.fn,v=C.inverse;
33
+ var x=0,y="",w;var z=n.call(l);if(z===b){l=l.call(this);}if(C.data){w=d.createFrame(C.data);}if(l&&typeof l==="object"){if(l instanceof Array){for(var u=l.length;
34
+ x<u;x++){if(w){w.index=x;}y=y+A(l[x],{data:w});}}else{for(var B in l){if(l.hasOwnProperty(B)){if(w){w.key=B;}y=y+A(l[B],{data:w});x++;}}}}if(x===0){y=v(this);
35
+ }return y;});d.registerHelper("if",function(l,i){var u=n.call(l);if(u===b){l=l.call(this);}if(!l||d.Utils.isEmpty(l)){return i.inverse(this);}else{return i.fn(this);
36
+ }});d.registerHelper("unless",function(l,i){return d.helpers["if"].call(this,l,{fn:i.inverse,inverse:i.fn});});d.registerHelper("with",function(l,i){var u=n.call(l);
37
+ if(u===b){l=l.call(this);}if(!d.Utils.isEmpty(l)){return i.fn(l);}});d.registerHelper("log",function(l,i){var u=i.data&&i.data.level!=null?parseInt(i.data.level,10):1;
38
+ d.log(u,l);});var r=(function(){var y={trace:function u(){},yy:{},symbols_:{error:2,root:3,program:4,EOF:5,simpleInverse:6,statements:7,statement:8,openInverse:9,closeBlock:10,openBlock:11,mustache:12,partial:13,CONTENT:14,COMMENT:15,OPEN_BLOCK:16,inMustache:17,CLOSE:18,OPEN_INVERSE:19,OPEN_ENDBLOCK:20,path:21,OPEN:22,OPEN_UNESCAPED:23,CLOSE_UNESCAPED:24,OPEN_PARTIAL:25,partialName:26,params:27,hash:28,dataName:29,param:30,STRING:31,INTEGER:32,BOOLEAN:33,hashSegments:34,hashSegment:35,ID:36,EQUALS:37,DATA:38,pathSegments:39,SEP:40,"$accept":0,"$end":1},terminals_:{2:"error",5:"EOF",14:"CONTENT",15:"COMMENT",16:"OPEN_BLOCK",18:"CLOSE",19:"OPEN_INVERSE",20:"OPEN_ENDBLOCK",22:"OPEN",23:"OPEN_UNESCAPED",24:"CLOSE_UNESCAPED",25:"OPEN_PARTIAL",31:"STRING",32:"INTEGER",33:"BOOLEAN",36:"ID",37:"EQUALS",38:"DATA",40:"SEP"},productions_:[0,[3,2],[4,2],[4,3],[4,2],[4,1],[4,1],[4,0],[7,1],[7,2],[8,3],[8,3],[8,1],[8,1],[8,1],[8,1],[11,3],[9,3],[10,3],[12,3],[12,3],[13,3],[13,4],[6,2],[17,3],[17,2],[17,2],[17,1],[17,1],[27,2],[27,1],[30,1],[30,1],[30,1],[30,1],[30,1],[28,1],[34,2],[34,1],[35,3],[35,3],[35,3],[35,3],[35,3],[26,1],[26,1],[26,1],[29,2],[21,1],[39,3],[39,1]],performAction:function l(z,C,D,G,F,B,E){var A=B.length-1;
39
+ switch(F){case 1:return B[A-1];break;case 2:this.$=new G.ProgramNode([],B[A]);break;case 3:this.$=new G.ProgramNode(B[A-2],B[A]);break;case 4:this.$=new G.ProgramNode(B[A-1],[]);
40
+ break;case 5:this.$=new G.ProgramNode(B[A]);break;case 6:this.$=new G.ProgramNode([],[]);break;case 7:this.$=new G.ProgramNode([]);break;case 8:this.$=[B[A]];
41
+ break;case 9:B[A-1].push(B[A]);this.$=B[A-1];break;case 10:this.$=new G.BlockNode(B[A-2],B[A-1].inverse,B[A-1],B[A]);break;case 11:this.$=new G.BlockNode(B[A-2],B[A-1],B[A-1].inverse,B[A]);
42
+ break;case 12:this.$=B[A];break;case 13:this.$=B[A];break;case 14:this.$=new G.ContentNode(B[A]);break;case 15:this.$=new G.CommentNode(B[A]);break;case 16:this.$=new G.MustacheNode(B[A-1][0],B[A-1][1]);
43
+ break;case 17:this.$=new G.MustacheNode(B[A-1][0],B[A-1][1]);break;case 18:this.$=B[A-1];break;case 19:this.$=new G.MustacheNode(B[A-1][0],B[A-1][1],B[A-2][2]==="&");
44
+ break;case 20:this.$=new G.MustacheNode(B[A-1][0],B[A-1][1],true);break;case 21:this.$=new G.PartialNode(B[A-1]);break;case 22:this.$=new G.PartialNode(B[A-2],B[A-1]);
45
+ break;case 23:break;case 24:this.$=[[B[A-2]].concat(B[A-1]),B[A]];break;case 25:this.$=[[B[A-1]].concat(B[A]),null];break;case 26:this.$=[[B[A-1]],B[A]];
46
+ break;case 27:this.$=[[B[A]],null];break;case 28:this.$=[[B[A]],null];break;case 29:B[A-1].push(B[A]);this.$=B[A-1];break;case 30:this.$=[B[A]];break;case 31:this.$=B[A];
47
+ break;case 32:this.$=new G.StringNode(B[A]);break;case 33:this.$=new G.IntegerNode(B[A]);break;case 34:this.$=new G.BooleanNode(B[A]);break;case 35:this.$=B[A];
48
+ break;case 36:this.$=new G.HashNode(B[A]);break;case 37:B[A-1].push(B[A]);this.$=B[A-1];break;case 38:this.$=[B[A]];break;case 39:this.$=[B[A-2],B[A]];
49
+ break;case 40:this.$=[B[A-2],new G.StringNode(B[A])];break;case 41:this.$=[B[A-2],new G.IntegerNode(B[A])];break;case 42:this.$=[B[A-2],new G.BooleanNode(B[A])];
50
+ break;case 43:this.$=[B[A-2],B[A]];break;case 44:this.$=new G.PartialNameNode(B[A]);break;case 45:this.$=new G.PartialNameNode(new G.StringNode(B[A]));
51
+ break;case 46:this.$=new G.PartialNameNode(new G.IntegerNode(B[A]));break;case 47:this.$=new G.DataNode(B[A]);break;case 48:this.$=new G.IdNode(B[A]);break;
52
+ case 49:B[A-2].push({part:B[A],separator:B[A-1]});this.$=B[A-2];break;case 50:this.$=[{part:B[A]}];break;}},table:[{3:1,4:2,5:[2,7],6:3,7:4,8:6,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,5],22:[1,14],23:[1,15],25:[1,16]},{1:[3]},{5:[1,17]},{5:[2,6],7:18,8:6,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,19],20:[2,6],22:[1,14],23:[1,15],25:[1,16]},{5:[2,5],6:20,8:21,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,5],20:[2,5],22:[1,14],23:[1,15],25:[1,16]},{17:23,18:[1,22],21:24,29:25,36:[1,28],38:[1,27],39:26},{5:[2,8],14:[2,8],15:[2,8],16:[2,8],19:[2,8],20:[2,8],22:[2,8],23:[2,8],25:[2,8]},{4:29,6:3,7:4,8:6,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,5],20:[2,7],22:[1,14],23:[1,15],25:[1,16]},{4:30,6:3,7:4,8:6,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,5],20:[2,7],22:[1,14],23:[1,15],25:[1,16]},{5:[2,12],14:[2,12],15:[2,12],16:[2,12],19:[2,12],20:[2,12],22:[2,12],23:[2,12],25:[2,12]},{5:[2,13],14:[2,13],15:[2,13],16:[2,13],19:[2,13],20:[2,13],22:[2,13],23:[2,13],25:[2,13]},{5:[2,14],14:[2,14],15:[2,14],16:[2,14],19:[2,14],20:[2,14],22:[2,14],23:[2,14],25:[2,14]},{5:[2,15],14:[2,15],15:[2,15],16:[2,15],19:[2,15],20:[2,15],22:[2,15],23:[2,15],25:[2,15]},{17:31,21:24,29:25,36:[1,28],38:[1,27],39:26},{17:32,21:24,29:25,36:[1,28],38:[1,27],39:26},{17:33,21:24,29:25,36:[1,28],38:[1,27],39:26},{21:35,26:34,31:[1,36],32:[1,37],36:[1,28],39:26},{1:[2,1]},{5:[2,2],8:21,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,19],20:[2,2],22:[1,14],23:[1,15],25:[1,16]},{17:23,21:24,29:25,36:[1,28],38:[1,27],39:26},{5:[2,4],7:38,8:6,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,19],20:[2,4],22:[1,14],23:[1,15],25:[1,16]},{5:[2,9],14:[2,9],15:[2,9],16:[2,9],19:[2,9],20:[2,9],22:[2,9],23:[2,9],25:[2,9]},{5:[2,23],14:[2,23],15:[2,23],16:[2,23],19:[2,23],20:[2,23],22:[2,23],23:[2,23],25:[2,23]},{18:[1,39]},{18:[2,27],21:44,24:[2,27],27:40,28:41,29:48,30:42,31:[1,45],32:[1,46],33:[1,47],34:43,35:49,36:[1,50],38:[1,27],39:26},{18:[2,28],24:[2,28]},{18:[2,48],24:[2,48],31:[2,48],32:[2,48],33:[2,48],36:[2,48],38:[2,48],40:[1,51]},{21:52,36:[1,28],39:26},{18:[2,50],24:[2,50],31:[2,50],32:[2,50],33:[2,50],36:[2,50],38:[2,50],40:[2,50]},{10:53,20:[1,54]},{10:55,20:[1,54]},{18:[1,56]},{18:[1,57]},{24:[1,58]},{18:[1,59],21:60,36:[1,28],39:26},{18:[2,44],36:[2,44]},{18:[2,45],36:[2,45]},{18:[2,46],36:[2,46]},{5:[2,3],8:21,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,19],20:[2,3],22:[1,14],23:[1,15],25:[1,16]},{14:[2,17],15:[2,17],16:[2,17],19:[2,17],20:[2,17],22:[2,17],23:[2,17],25:[2,17]},{18:[2,25],21:44,24:[2,25],28:61,29:48,30:62,31:[1,45],32:[1,46],33:[1,47],34:43,35:49,36:[1,50],38:[1,27],39:26},{18:[2,26],24:[2,26]},{18:[2,30],24:[2,30],31:[2,30],32:[2,30],33:[2,30],36:[2,30],38:[2,30]},{18:[2,36],24:[2,36],35:63,36:[1,64]},{18:[2,31],24:[2,31],31:[2,31],32:[2,31],33:[2,31],36:[2,31],38:[2,31]},{18:[2,32],24:[2,32],31:[2,32],32:[2,32],33:[2,32],36:[2,32],38:[2,32]},{18:[2,33],24:[2,33],31:[2,33],32:[2,33],33:[2,33],36:[2,33],38:[2,33]},{18:[2,34],24:[2,34],31:[2,34],32:[2,34],33:[2,34],36:[2,34],38:[2,34]},{18:[2,35],24:[2,35],31:[2,35],32:[2,35],33:[2,35],36:[2,35],38:[2,35]},{18:[2,38],24:[2,38],36:[2,38]},{18:[2,50],24:[2,50],31:[2,50],32:[2,50],33:[2,50],36:[2,50],37:[1,65],38:[2,50],40:[2,50]},{36:[1,66]},{18:[2,47],24:[2,47],31:[2,47],32:[2,47],33:[2,47],36:[2,47],38:[2,47]},{5:[2,10],14:[2,10],15:[2,10],16:[2,10],19:[2,10],20:[2,10],22:[2,10],23:[2,10],25:[2,10]},{21:67,36:[1,28],39:26},{5:[2,11],14:[2,11],15:[2,11],16:[2,11],19:[2,11],20:[2,11],22:[2,11],23:[2,11],25:[2,11]},{14:[2,16],15:[2,16],16:[2,16],19:[2,16],20:[2,16],22:[2,16],23:[2,16],25:[2,16]},{5:[2,19],14:[2,19],15:[2,19],16:[2,19],19:[2,19],20:[2,19],22:[2,19],23:[2,19],25:[2,19]},{5:[2,20],14:[2,20],15:[2,20],16:[2,20],19:[2,20],20:[2,20],22:[2,20],23:[2,20],25:[2,20]},{5:[2,21],14:[2,21],15:[2,21],16:[2,21],19:[2,21],20:[2,21],22:[2,21],23:[2,21],25:[2,21]},{18:[1,68]},{18:[2,24],24:[2,24]},{18:[2,29],24:[2,29],31:[2,29],32:[2,29],33:[2,29],36:[2,29],38:[2,29]},{18:[2,37],24:[2,37],36:[2,37]},{37:[1,65]},{21:69,29:73,31:[1,70],32:[1,71],33:[1,72],36:[1,28],38:[1,27],39:26},{18:[2,49],24:[2,49],31:[2,49],32:[2,49],33:[2,49],36:[2,49],38:[2,49],40:[2,49]},{18:[1,74]},{5:[2,22],14:[2,22],15:[2,22],16:[2,22],19:[2,22],20:[2,22],22:[2,22],23:[2,22],25:[2,22]},{18:[2,39],24:[2,39],36:[2,39]},{18:[2,40],24:[2,40],36:[2,40]},{18:[2,41],24:[2,41],36:[2,41]},{18:[2,42],24:[2,42],36:[2,42]},{18:[2,43],24:[2,43],36:[2,43]},{5:[2,18],14:[2,18],15:[2,18],16:[2,18],19:[2,18],20:[2,18],22:[2,18],23:[2,18],25:[2,18]}],defaultActions:{17:[2,1]},parseError:function v(A,z){throw new Error(A);
53
+ },parse:function x(I){var P=this,F=[0],Y=[null],K=[],Z=this.table,A="",J=0,W=0,C=0,H=2,M=1;this.lexer.setInput(I);this.lexer.yy=this.yy;this.yy.lexer=this.lexer;
54
+ this.yy.parser=this;if(typeof this.lexer.yylloc=="undefined"){this.lexer.yylloc={};}var B=this.lexer.yylloc;K.push(B);var D=this.lexer.options&&this.lexer.options.ranges;
55
+ if(typeof this.yy.parseError==="function"){this.parseError=this.yy.parseError;}function O(ab){F.length=F.length-2*ab;Y.length=Y.length-ab;K.length=K.length-ab;
56
+ }function N(){var ab;ab=P.lexer.lex()||1;if(typeof ab!=="number"){ab=P.symbols_[ab]||ab;}return ab;}var V,R,E,U,aa,L,T={},Q,X,z,G;while(true){E=F[F.length-1];
57
+ if(this.defaultActions[E]){U=this.defaultActions[E];}else{if(V===null||typeof V=="undefined"){V=N();}U=Z[E]&&Z[E][V];}if(typeof U==="undefined"||!U.length||!U[0]){var S="";
58
+ if(!C){G=[];for(Q in Z[E]){if(this.terminals_[Q]&&Q>2){G.push("'"+this.terminals_[Q]+"'");}}if(this.lexer.showPosition){S="Parse error on line "+(J+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+G.join(", ")+", got '"+(this.terminals_[V]||V)+"'";
59
+ }else{S="Parse error on line "+(J+1)+": Unexpected "+(V==1?"end of input":"'"+(this.terminals_[V]||V)+"'");}this.parseError(S,{text:this.lexer.match,token:this.terminals_[V]||V,line:this.lexer.yylineno,loc:B,expected:G});
60
+ }}if(U[0] instanceof Array&&U.length>1){throw new Error("Parse Error: multiple actions possible at state: "+E+", token: "+V);}switch(U[0]){case 1:F.push(V);
61
+ Y.push(this.lexer.yytext);K.push(this.lexer.yylloc);F.push(U[1]);V=null;if(!R){W=this.lexer.yyleng;A=this.lexer.yytext;J=this.lexer.yylineno;B=this.lexer.yylloc;
62
+ if(C>0){C--;}}else{V=R;R=null;}break;case 2:X=this.productions_[U[1]][1];T.$=Y[Y.length-X];T._$={first_line:K[K.length-(X||1)].first_line,last_line:K[K.length-1].last_line,first_column:K[K.length-(X||1)].first_column,last_column:K[K.length-1].last_column};
63
+ if(D){T._$.range=[K[K.length-(X||1)].range[0],K[K.length-1].range[1]];}L=this.performAction.call(T,A,W,J,this.yy,U[1],Y,K);if(typeof L!=="undefined"){return L;
64
+ }if(X){F=F.slice(0,-1*X*2);Y=Y.slice(0,-1*X);K=K.slice(0,-1*X);}F.push(this.productions_[U[1]][0]);Y.push(T.$);K.push(T._$);z=Z[F[F.length-2]][F[F.length-1]];
65
+ F.push(z);break;case 3:return true;}}return true;}};var i=(function(){var C=({EOF:1,parseError:function E(H,G){if(this.yy.parser){this.yy.parser.parseError(H,G);
66
+ }else{throw new Error(H);}},setInput:function(G){this._input=G;this._more=this._less=this.done=false;this.yylineno=this.yyleng=0;this.yytext=this.matched=this.match="";
67
+ this.conditionStack=["INITIAL"];this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0};if(this.options.ranges){this.yylloc.range=[0,0];}this.offset=0;
68
+ return this;},input:function(){var H=this._input[0];this.yytext+=H;this.yyleng++;this.offset++;this.match+=H;this.matched+=H;var G=H.match(/(?:\r\n?|\n).*/g);
69
+ if(G){this.yylineno++;this.yylloc.last_line++;}else{this.yylloc.last_column++;}if(this.options.ranges){this.yylloc.range[1]++;}this._input=this._input.slice(1);
70
+ return H;},unput:function(I){var G=I.length;var H=I.split(/(?:\r\n?|\n)/g);this._input=I+this._input;this.yytext=this.yytext.substr(0,this.yytext.length-G-1);
71
+ this.offset-=G;var K=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1);this.matched=this.matched.substr(0,this.matched.length-1);
72
+ if(H.length-1){this.yylineno-=H.length-1;}var J=this.yylloc.range;this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:H?(H.length===K.length?this.yylloc.first_column:0)+K[K.length-H.length].length-H[0].length:this.yylloc.first_column-G};
73
+ if(this.options.ranges){this.yylloc.range=[J[0],J[0]+this.yyleng-G];}return this;},more:function(){this._more=true;return this;},less:function(G){this.unput(this.match.slice(G));
74
+ },pastInput:function(){var G=this.matched.substr(0,this.matched.length-this.match.length);return(G.length>20?"...":"")+G.substr(-20).replace(/\n/g,"");
75
+ },upcomingInput:function(){var G=this.match;if(G.length<20){G+=this._input.substr(0,20-G.length);}return(G.substr(0,20)+(G.length>20?"...":"")).replace(/\n/g,"");
76
+ },showPosition:function(){var G=this.pastInput();var H=new Array(G.length+1).join("-");return G+this.upcomingInput()+"\n"+H+"^";},next:function(){if(this.done){return this.EOF;
77
+ }if(!this._input){this.done=true;}var M,K,H,J,I,G;if(!this._more){this.yytext="";this.match="";}var N=this._currentRules();for(var L=0;L<N.length;L++){H=this._input.match(this.rules[N[L]]);
78
+ if(H&&(!K||H[0].length>K[0].length)){K=H;J=L;if(!this.options.flex){break;}}}if(K){G=K[0].match(/(?:\r\n?|\n).*/g);if(G){this.yylineno+=G.length;}this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:G?G[G.length-1].length-G[G.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+K[0].length};
79
+ this.yytext+=K[0];this.match+=K[0];this.matches=K;this.yyleng=this.yytext.length;if(this.options.ranges){this.yylloc.range=[this.offset,this.offset+=this.yyleng];
80
+ }this._more=false;this._input=this._input.slice(K[0].length);this.matched+=K[0];M=this.performAction.call(this,this.yy,this,N[J],this.conditionStack[this.conditionStack.length-1]);
81
+ if(this.done&&this._input){this.done=false;}if(M){return M;}else{return;}}if(this._input===""){return this.EOF;}else{return this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno});
82
+ }},lex:function z(){var G=this.next();if(typeof G!=="undefined"){return G;}else{return this.lex();}},begin:function A(G){this.conditionStack.push(G);},popState:function F(){return this.conditionStack.pop();
83
+ },_currentRules:function D(){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules;},topState:function(){return this.conditionStack[this.conditionStack.length-2];
84
+ },pushState:function A(G){this.begin(G);}});C.options={};C.performAction=function B(K,H,J,G){var I=G;switch(J){case 0:H.yytext="\\";return 14;break;case 1:if(H.yytext.slice(-1)!=="\\"){this.begin("mu");
85
+ }if(H.yytext.slice(-1)==="\\"){H.yytext=H.yytext.substr(0,H.yyleng-1),this.begin("emu");}if(H.yytext){return 14;}break;case 2:return 14;break;case 3:if(H.yytext.slice(-1)!=="\\"){this.popState();
86
+ }if(H.yytext.slice(-1)==="\\"){H.yytext=H.yytext.substr(0,H.yyleng-1);}return 14;break;case 4:H.yytext=H.yytext.substr(0,H.yyleng-4);this.popState();return 15;
87
+ break;case 5:return 25;break;case 6:return 16;break;case 7:return 20;break;case 8:return 19;break;case 9:return 19;break;case 10:return 23;break;case 11:return 22;
88
+ break;case 12:this.popState();this.begin("com");break;case 13:H.yytext=H.yytext.substr(3,H.yyleng-5);this.popState();return 15;break;case 14:return 22;
89
+ break;case 15:return 37;break;case 16:return 36;break;case 17:return 36;break;case 18:return 40;break;case 19:break;case 20:this.popState();return 24;break;
90
+ case 21:this.popState();return 18;break;case 22:H.yytext=H.yytext.substr(1,H.yyleng-2).replace(/\\"/g,'"');return 31;break;case 23:H.yytext=H.yytext.substr(1,H.yyleng-2).replace(/\\'/g,"'");
91
+ return 31;break;case 24:return 38;break;case 25:return 33;break;case 26:return 33;break;case 27:return 32;break;case 28:return 36;break;case 29:H.yytext=H.yytext.substr(1,H.yyleng-2);
92
+ return 36;break;case 30:return"INVALID";break;case 31:return 5;break;}};C.rules=[/^(?:\\\\(?=(\{\{)))/,/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|$)))/,/^(?:[\s\S]*?--\}\})/,/^(?:\{\{>)/,/^(?:\{\{#)/,/^(?:\{\{\/)/,/^(?:\{\{\^)/,/^(?:\{\{\s*else\b)/,/^(?:\{\{\{)/,/^(?:\{\{&)/,/^(?:\{\{!--)/,/^(?:\{\{![\s\S]*?\}\})/,/^(?:\{\{)/,/^(?:=)/,/^(?:\.(?=[}\/ ]))/,/^(?:\.\.)/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}\}\})/,/^(?:\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@)/,/^(?:true(?=[}\s]))/,/^(?:false(?=[}\s]))/,/^(?:-?[0-9]+(?=[}\s]))/,/^(?:[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.]))/,/^(?:\[[^\]]*\])/,/^(?:.)/,/^(?:$)/];
93
+ C.conditions={mu:{rules:[5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31],inclusive:false},emu:{rules:[3],inclusive:false},com:{rules:[4],inclusive:false},INITIAL:{rules:[0,1,2,31],inclusive:true}};
94
+ return C;})();y.lexer=i;function w(){this.yy={};}w.prototype=y;y.Parser=w;return new w;})();d.Parser=r;d.parse=function(i){if(i.constructor===d.AST.ProgramNode){return i;
95
+ }d.Parser.yy=d.AST;return d.Parser.parse(i);};d.AST={};d.AST.ProgramNode=function(l,i){this.type="program";this.statements=l;if(i){this.inverse=new d.AST.ProgramNode(i);
96
+ }};d.AST.MustacheNode=function(x,u,l){this.type="mustache";this.escaped=!l;this.hash=u;var w=this.id=x[0];var v=this.params=x.slice(1);var i=this.eligibleHelper=w.isSimple;
97
+ this.isHelper=i&&(v.length||u);};d.AST.PartialNode=function(i,l){this.type="partial";this.partialName=i;this.context=l;};d.AST.BlockNode=function(u,l,i,w){var v=function(x,y){if(x.original!==y.original){throw new d.Exception(x.original+" doesn't match "+y.original);
98
+ }};v(u.id,w);this.type="block";this.mustache=u;this.program=l;this.inverse=i;if(this.inverse&&!this.program){this.isInverse=true;}};d.AST.ContentNode=function(i){this.type="content";
99
+ this.string=i;};d.AST.HashNode=function(i){this.type="hash";this.pairs=i;};d.AST.IdNode=function(z){this.type="ID";var y="",w=[],A=0;for(var x=0,u=z.length;
100
+ x<u;x++){var v=z[x].part;y+=(z[x].separator||"")+v;if(v===".."||v==="."||v==="this"){if(w.length>0){throw new d.Exception("Invalid path: "+y);}else{if(v===".."){A++;
101
+ }else{this.isScoped=true;}}}else{w.push(v);}}this.original=y;this.parts=w;this.string=w.join(".");this.depth=A;this.isSimple=z.length===1&&!this.isScoped&&A===0;
102
+ this.stringModeValue=this.string;};d.AST.PartialNameNode=function(i){this.type="PARTIAL_NAME";this.name=i.original;};d.AST.DataNode=function(i){this.type="DATA";
103
+ this.id=i;};d.AST.StringNode=function(i){this.type="STRING";this.original=this.string=this.stringModeValue=i;};d.AST.IntegerNode=function(i){this.type="INTEGER";
104
+ this.original=this.integer=i;this.stringModeValue=Number(i);};d.AST.BooleanNode=function(i){this.type="BOOLEAN";this.bool=i;this.stringModeValue=i==="true";
105
+ };d.AST.CommentNode=function(i){this.type="comment";this.comment=i;};var q=["description","fileName","lineNumber","message","name","number","stack"];d.Exception=function(u){var l=Error.prototype.constructor.apply(this,arguments);
106
+ for(var i=0;i<q.length;i++){this[q[i]]=l[q[i]];}};d.Exception.prototype=new Error();d.SafeString=function(i){this.string=i;};d.SafeString.prototype.toString=function(){return this.string.toString();
107
+ };var k={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"};var e=/[&<>"'`]/g;var p=/[&<>"'`]/;var t=function(i){return k[i]||"&amp;";
108
+ };d.Utils={extend:function(u,l){for(var i in l){if(l.hasOwnProperty(i)){u[i]=l[i];}}},escapeExpression:function(i){if(i instanceof d.SafeString){return i.toString();
109
+ }else{if(i==null||i===false){return"";}}i=i.toString();if(!p.test(i)){return i;}return i.replace(e,t);},isEmpty:function(i){if(!i&&i!==0){return true;}else{if(n.call(i)==="[object Array]"&&i.length===0){return true;
110
+ }else{return false;}}}};var j=d.Compiler=function(){};var g=d.JavaScriptCompiler=function(){};j.prototype={compiler:j,disassemble:function(){var z=this.opcodes,y,w=[],B,A;
111
+ for(var x=0,u=z.length;x<u;x++){y=z[x];if(y.opcode==="DECLARE"){w.push("DECLARE "+y.name+"="+y.value);}else{B=[];for(var v=0;v<y.args.length;v++){A=y.args[v];
112
+ if(typeof A==="string"){A='"'+A.replace("\n","\\n")+'"';}B.push(A);}w.push(y.opcode+" "+B.join(" "));}}return w.join("\n");},equals:function(u){var l=this.opcodes.length;
113
+ if(u.opcodes.length!==l){return false;}for(var x=0;x<l;x++){var y=this.opcodes[x],v=u.opcodes[x];if(y.opcode!==v.opcode||y.args.length!==v.args.length){return false;
114
+ }for(var w=0;w<y.args.length;w++){if(y.args[w]!==v.args[w]){return false;}}}l=this.children.length;if(u.children.length!==l){return false;}for(x=0;x<l;
115
+ x++){if(!this.children[x].equals(u.children[x])){return false;}}return true;},guid:0,compile:function(i,u){this.children=[];this.depths={list:[]};this.options=u;
116
+ var v=this.options.knownHelpers;this.options.knownHelpers={helperMissing:true,blockHelperMissing:true,each:true,"if":true,unless:true,"with":true,log:true};
117
+ if(v){for(var l in v){this.options.knownHelpers[l]=v[l];}}return this.program(i);},accept:function(i){return this[i.type](i);},program:function(w){var v=w.statements,y;
118
+ this.opcodes=[];for(var x=0,u=v.length;x<u;x++){y=v[x];this[y.type](y);}this.isSimple=u===1;this.depths.list=this.depths.list.sort(function(l,i){return l-i;
119
+ });return this;},compileProgram:function(w){var u=new this.compiler().compile(w,this.options);var x=this.guid++,z;this.usePartial=this.usePartial||u.usePartial;
120
+ this.children[x]=u;for(var y=0,v=u.depths.list.length;y<v;y++){z=u.depths.list[y];if(z<2){continue;}else{this.addDepth(z-1);}}return x;},block:function(w){var v=w.mustache,l=w.program,i=w.inverse;
121
+ if(l){l=this.compileProgram(l);}if(i){i=this.compileProgram(i);}var u=this.classifyMustache(v);if(u==="helper"){this.helperMustache(v,l,i);}else{if(u==="simple"){this.simpleMustache(v);
122
+ this.opcode("pushProgram",l);this.opcode("pushProgram",i);this.opcode("emptyHash");this.opcode("blockValue");}else{this.ambiguousMustache(v,l,i);this.opcode("pushProgram",l);
123
+ this.opcode("pushProgram",i);this.opcode("emptyHash");this.opcode("ambiguousBlockValue");}}this.opcode("append");},hash:function(x){var w=x.pairs,z,y;this.opcode("pushHash");
124
+ for(var v=0,u=w.length;v<u;v++){z=w[v];y=z[1];if(this.options.stringParams){if(y.depth){this.addDepth(y.depth);}this.opcode("getContext",y.depth||0);this.opcode("pushStringParam",y.stringModeValue,y.type);
125
+ }else{this.accept(y);}this.opcode("assignToHash",z[0]);}this.opcode("popHash");},partial:function(i){var l=i.partialName;this.usePartial=true;if(i.context){this.ID(i.context);
126
+ }else{this.opcode("push","depth0");}this.opcode("invokePartial",l.name);this.opcode("append");},content:function(i){this.opcode("appendContent",i.string);
127
+ },mustache:function(u){var i=this.options;var l=this.classifyMustache(u);if(l==="simple"){this.simpleMustache(u);}else{if(l==="helper"){this.helperMustache(u);
128
+ }else{this.ambiguousMustache(u);}}if(u.escaped&&!i.noEscape){this.opcode("appendEscaped");}else{this.opcode("append");}},ambiguousMustache:function(w,u,l){var x=w.id,v=x.parts[0],i=u!=null||l!=null;
129
+ this.opcode("getContext",x.depth);this.opcode("pushProgram",u);this.opcode("pushProgram",l);this.opcode("invokeAmbiguous",v,i);},simpleMustache:function(i){var l=i.id;
130
+ if(l.type==="DATA"){this.DATA(l);}else{if(l.parts.length){this.ID(l);}else{this.addDepth(l.depth);this.opcode("getContext",l.depth);this.opcode("pushContext");
131
+ }}this.opcode("resolvePossibleLambda");},helperMustache:function(v,l,i){var w=this.setupFullMustacheParams(v,l,i),u=v.id.parts[0];if(this.options.knownHelpers[u]){this.opcode("invokeKnownHelper",w.length,u);
132
+ }else{if(this.options.knownHelpersOnly){throw new Error("You specified knownHelpersOnly, but used the unknown helper "+u);}else{this.opcode("invokeHelper",w.length,u);
133
+ }}},ID:function(x){this.addDepth(x.depth);this.opcode("getContext",x.depth);var v=x.parts[0];if(!v){this.opcode("pushContext");}else{this.opcode("lookupOnContext",x.parts[0]);
134
+ }for(var w=1,u=x.parts.length;w<u;w++){this.opcode("lookup",x.parts[w]);}},DATA:function(w){this.options.data=true;if(w.id.isScoped||w.id.depth){throw new d.Exception("Scoped data references are not supported: "+w.original);
135
+ }this.opcode("lookupData");var x=w.id.parts;for(var v=0,u=x.length;v<u;v++){this.opcode("lookup",x[v]);}},STRING:function(i){this.opcode("pushString",i.string);
136
+ },INTEGER:function(i){this.opcode("pushLiteral",i.integer);},BOOLEAN:function(i){this.opcode("pushLiteral",i.bool);},comment:function(){},opcode:function(i){this.opcodes.push({opcode:i,args:[].slice.call(arguments,1)});
137
+ },declare:function(i,l){this.opcodes.push({opcode:"DECLARE",name:i,value:l});},addDepth:function(i){if(isNaN(i)){throw new Error("EWOT");}if(i===0){return;
138
+ }if(!this.depths[i]){this.depths[i]=true;this.depths.list.push(i);}},classifyMustache:function(v){var u=v.isHelper;var w=v.eligibleHelper;var l=this.options;
139
+ if(w&&!u){var i=v.id.parts[0];if(l.knownHelpers[i]){u=true;}else{if(l.knownHelpersOnly){w=false;}}}if(u){return"helper";}else{if(w){return"ambiguous";}else{return"simple";
140
+ }}},pushParams:function(v){var l=v.length,u;while(l--){u=v[l];if(this.options.stringParams){if(u.depth){this.addDepth(u.depth);}this.opcode("getContext",u.depth||0);
141
+ this.opcode("pushStringParam",u.stringModeValue,u.type);}else{this[u.type](u);}}},setupMustacheParams:function(i){var l=i.params;this.pushParams(l);if(i.hash){this.hash(i.hash);
142
+ }else{this.opcode("emptyHash");}return l;},setupFullMustacheParams:function(u,l,i){var v=u.params;this.pushParams(v);this.opcode("pushProgram",l);this.opcode("pushProgram",i);
143
+ if(u.hash){this.hash(u.hash);}else{this.opcode("emptyHash");}return v;}};var s=function(i){this.value=i;};g.prototype={nameLookup:function(l,i){if(/^[0-9]+$/.test(i)){return l+"["+i+"]";
144
+ }else{if(g.isValidJavaScriptVariableName(i)){return l+"."+i;}else{return l+"['"+i+"']";}}},appendToBuffer:function(i){if(this.environment.isSimple){return"return "+i+";";
145
+ }else{return{appendToBuffer:true,content:i,toString:function(){return"buffer += "+i+";";}};}},initializeBuffer:function(){return this.quotedString("");
146
+ },namespace:"Handlebars",compile:function(i,l,v,u){this.environment=i;this.options=l||{};d.log(d.logger.DEBUG,this.environment.disassemble()+"\n\n");this.name=this.environment.name;
147
+ this.isChild=!!v;this.context=v||{programs:[],environments:[],aliases:{}};this.preamble();this.stackSlot=0;this.stackVars=[];this.registers={list:[]};this.compileStack=[];
148
+ this.inlineStack=[];this.compileChildren(i,l);var x=i.opcodes,w;this.i=0;for(m=x.length;this.i<m;this.i++){w=x[this.i];if(w.opcode==="DECLARE"){this[w.name]=w.value;
149
+ }else{this[w.opcode].apply(this,w.args);}}return this.createFunctionContext(u);},nextOpcode:function(){var i=this.environment.opcodes;return i[this.i+1];
150
+ },eat:function(){this.i=this.i+1;},preamble:function(){var i=[];if(!this.isChild){var l=this.namespace;var u="helpers = this.merge(helpers, "+l+".helpers);";
151
+ if(this.environment.usePartial){u=u+" partials = this.merge(partials, "+l+".partials);";}if(this.options.data){u=u+" data = data || {};";}i.push(u);}else{i.push("");
152
+ }if(!this.environment.isSimple){i.push(", buffer = "+this.initializeBuffer());}else{i.push("");}this.lastContext=0;this.source=i;},createFunctionContext:function(B){var w=this.stackVars.concat(this.registers.list);
153
+ if(w.length>0){this.source[1]=this.source[1]+", "+w.join(", ");}if(!this.isChild){for(var A in this.context.aliases){if(this.context.aliases.hasOwnProperty(A)){this.source[1]=this.source[1]+", "+A+"="+this.context.aliases[A];
154
+ }}}if(this.source[1]){this.source[1]="var "+this.source[1].substring(2)+";";}if(!this.isChild){this.source[1]+="\n"+this.context.programs.join("\n")+"\n";
155
+ }if(!this.environment.isSimple){this.source.push("return buffer;");}var y=this.isChild?["depth0","data"]:["Handlebars","depth0","helpers","partials","data"];
156
+ for(var z=0,x=this.environment.depths.list.length;z<x;z++){y.push("depth"+this.environment.depths.list[z]);}var u=this.mergeSource();if(!this.isChild){var C=d.COMPILER_REVISION,v=d.REVISION_CHANGES[C];
157
+ u="this.compilerInfo = ["+C+",'"+v+"'];\n"+u;}if(B){y.push(u);return Function.apply(this,y);}else{var D="function "+(this.name||"")+"("+y.join(",")+") {\n "+u+"}";
158
+ d.log(d.logger.DEBUG,D+"\n\n");return D;}},mergeSource:function(){var x="",v;for(var w=0,l=this.source.length;w<l;w++){var u=this.source[w];if(u.appendToBuffer){if(v){v=v+"\n + "+u.content;
159
+ }else{v=u.content;}}else{if(v){x+="buffer += "+v+";\n ";v=c;}x+=u+"\n ";}}return x;},blockValue:function(){this.context.aliases.blockHelperMissing="helpers.blockHelperMissing";
160
+ var i=["depth0"];this.setupParams(0,i);this.replaceStack(function(l){i.splice(1,0,l);return"blockHelperMissing.call("+i.join(", ")+")";});},ambiguousBlockValue:function(){this.context.aliases.blockHelperMissing="helpers.blockHelperMissing";
161
+ var l=["depth0"];this.setupParams(0,l);var i=this.topStack();l.splice(1,0,i);l[l.length-1]="options";this.source.push("if (!"+this.lastHelper+") { "+i+" = blockHelperMissing.call("+l.join(", ")+"); }");
162
+ },appendContent:function(i){this.source.push(this.appendToBuffer(this.quotedString(i)));},append:function(){this.flushInline();var i=this.popStack();this.source.push("if("+i+" || "+i+" === 0) { "+this.appendToBuffer(i)+" }");
163
+ if(this.environment.isSimple){this.source.push("else { "+this.appendToBuffer("''")+" }");}},appendEscaped:function(){this.context.aliases.escapeExpression="this.escapeExpression";
164
+ this.source.push(this.appendToBuffer("escapeExpression("+this.popStack()+")"));},getContext:function(i){if(this.lastContext!==i){this.lastContext=i;}},lookupOnContext:function(i){this.push(this.nameLookup("depth"+this.lastContext,i,"context"));
165
+ },pushContext:function(){this.pushStackLiteral("depth"+this.lastContext);},resolvePossibleLambda:function(){this.context.aliases.functionType='"function"';
166
+ this.replaceStack(function(i){return"typeof "+i+" === functionType ? "+i+".apply(depth0) : "+i;});},lookup:function(i){this.replaceStack(function(l){return l+" == null || "+l+" === false ? "+l+" : "+this.nameLookup(l,i,"context");
167
+ });},lookupData:function(i){this.push("data");},pushStringParam:function(i,l){this.pushStackLiteral("depth"+this.lastContext);this.pushString(l);if(typeof i==="string"){this.pushString(i);
168
+ }else{this.pushStackLiteral(i);}},emptyHash:function(){this.pushStackLiteral("{}");if(this.options.stringParams){this.register("hashTypes","{}");this.register("hashContexts","{}");
169
+ }},pushHash:function(){this.hash={values:[],types:[],contexts:[]};},popHash:function(){var i=this.hash;this.hash=c;if(this.options.stringParams){this.register("hashContexts","{"+i.contexts.join(",")+"}");
170
+ this.register("hashTypes","{"+i.types.join(",")+"}");}this.push("{\n "+i.values.join(",\n ")+"\n }");},pushString:function(i){this.pushStackLiteral(this.quotedString(i));
171
+ },push:function(i){this.inlineStack.push(i);return i;},pushLiteral:function(i){this.pushStackLiteral(i);},pushProgram:function(i){if(i!=null){this.pushStackLiteral(this.programExpression(i));
172
+ }else{this.pushStackLiteral(null);}},invokeHelper:function(u,i){this.context.aliases.helperMissing="helpers.helperMissing";var l=this.lastHelper=this.setupHelper(u,i,true);
173
+ var v=this.nameLookup("depth"+this.lastContext,i,"context");this.push(l.name+" || "+v);this.replaceStack(function(w){return w+" ? "+w+".call("+l.callParams+") : helperMissing.call("+l.helperMissingParams+")";
174
+ });},invokeKnownHelper:function(u,i){var l=this.setupHelper(u,i);this.push(l.name+".call("+l.callParams+")");},invokeAmbiguous:function(i,w){this.context.aliases.functionType='"function"';
175
+ this.pushStackLiteral("{}");var l=this.setupHelper(0,i,w);var u=this.lastHelper=this.nameLookup("helpers",i,"helper");var x=this.nameLookup("depth"+this.lastContext,i,"context");
176
+ var v=this.nextStack();this.source.push("if ("+v+" = "+u+") { "+v+" = "+v+".call("+l.callParams+"); }");this.source.push("else { "+v+" = "+x+"; "+v+" = typeof "+v+" === functionType ? "+v+".apply(depth0) : "+v+"; }");
177
+ },invokePartial:function(i){var l=[this.nameLookup("partials",i,"partial"),"'"+i+"'",this.popStack(),"helpers","partials"];if(this.options.data){l.push("data");
178
+ }this.context.aliases.self="this";this.push("self.invokePartial("+l.join(", ")+")");},assignToHash:function(l){var v=this.popStack(),i,u;if(this.options.stringParams){u=this.popStack();
179
+ i=this.popStack();}var w=this.hash;if(i){w.contexts.push("'"+l+"': "+i);}if(u){w.types.push("'"+l+"': "+u);}w.values.push("'"+l+"': ("+v+")");},compiler:g,compileChildren:function(u,x){var z=u.children,B,A;
180
+ for(var y=0,v=z.length;y<v;y++){B=z[y];A=new this.compiler();var w=this.matchExistingProgram(B);if(w==null){this.context.programs.push("");w=this.context.programs.length;
181
+ B.index=w;B.name="program"+w;this.context.programs[w]=A.compile(B,x,this.context);this.context.environments[w]=B;}else{B.index=w;B.name="program"+w;}}},matchExistingProgram:function(w){for(var v=0,u=this.context.environments.length;
182
+ v<u;v++){var l=this.context.environments[v];if(l&&l.equals(w)){return v;}}},programExpression:function(v){this.context.aliases.self="this";if(v==null){return"self.noop";
183
+ }var A=this.environment.children[v],z=A.depths.list,y;var x=[A.index,A.name,"data"];for(var w=0,u=z.length;w<u;w++){y=z[w];if(y===1){x.push("depth0");}else{x.push("depth"+(y-1));
184
+ }}return(z.length===0?"self.program(":"self.programWithDepth(")+x.join(", ")+")";},register:function(i,l){this.useRegister(i);this.source.push(i+" = "+l+";");
185
+ },useRegister:function(i){if(!this.registers[i]){this.registers[i]=true;this.registers.list.push(i);}},pushStackLiteral:function(i){return this.push(new s(i));
186
+ },pushStack:function(l){this.flushInline();var i=this.incrStack();if(l){this.source.push(i+" = "+l+";");}this.compileStack.push(i);return i;},replaceStack:function(y){var v="",x=this.isInline(),i;
187
+ if(x){var w=this.popStack(true);if(w instanceof s){i=w.value;}else{var l=this.stackSlot?this.topStackName():this.incrStack();v="("+this.push(l)+" = "+w+"),";
188
+ i=this.topStack();}}else{i=this.topStack();}var u=y.call(this,i);if(x){if(this.inlineStack.length||this.compileStack.length){this.popStack();}this.push("("+v+u+")");
189
+ }else{if(!/^stack/.test(i)){i=this.nextStack();}this.source.push(i+" = ("+v+u+");");}return i;},nextStack:function(){return this.pushStack();},incrStack:function(){this.stackSlot++;
190
+ if(this.stackSlot>this.stackVars.length){this.stackVars.push("stack"+this.stackSlot);}return this.topStackName();},topStackName:function(){return"stack"+this.stackSlot;
191
+ },flushInline:function(){var v=this.inlineStack;if(v.length){this.inlineStack=[];for(var u=0,l=v.length;u<l;u++){var w=v[u];if(w instanceof s){this.compileStack.push(w);
192
+ }else{this.pushStack(w);}}}},isInline:function(){return this.inlineStack.length;},popStack:function(i){var u=this.isInline(),l=(u?this.inlineStack:this.compileStack).pop();
193
+ if(!i&&(l instanceof s)){return l.value;}else{if(!u){this.stackSlot--;}return l;}},topStack:function(l){var i=(this.isInline()?this.inlineStack:this.compileStack),u=i[i.length-1];
194
+ if(!l&&(u instanceof s)){return u.value;}else{return u;}},quotedString:function(i){return'"'+i.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")+'"';
195
+ },setupHelper:function(w,u,l){var v=[];this.setupParams(w,v,l);var i=this.nameLookup("helpers",u,"helper");return{params:v,name:i,callParams:["depth0"].concat(v).join(", "),helperMissingParams:l&&["depth0",this.quotedString(u)].concat(v).join(", ")};
196
+ },setupParams:function(w,v,l){var C=[],A=[],B=[],u,x,z;C.push("hash:"+this.popStack());x=this.popStack();z=this.popStack();if(z||x){if(!z){this.context.aliases.self="this";
197
+ z="self.noop";}if(!x){this.context.aliases.self="this";x="self.noop";}C.push("inverse:"+x);C.push("fn:"+z);}for(var y=0;y<w;y++){u=this.popStack();v.push(u);
198
+ if(this.options.stringParams){B.push(this.popStack());A.push(this.popStack());}}if(this.options.stringParams){C.push("contexts:["+A.join(",")+"]");C.push("types:["+B.join(",")+"]");
199
+ C.push("hashContexts:hashContexts");C.push("hashTypes:hashTypes");}if(this.options.data){C.push("data:data");}C="{"+C.join(",")+"}";if(l){this.register("options",C);
200
+ v.push("options");}else{v.push(C);}return v.join(", ");}};var f=("break else new var case finally return void catch for switch while continue function this with default if throw delete in try do instanceof typeof abstract enum int short boolean export interface static byte extends long super char final native synchronized class float package throws const goto private transient debugger implements protected volatile double import public let yield").split(" ");
201
+ var a=g.RESERVED_WORDS={};for(var o=0,m=f.length;o<m;o++){a[f[o]]=true;}g.isValidJavaScriptVariableName=function(i){if(!g.RESERVED_WORDS[i]&&/^[a-zA-Z_$][0-9a-zA-Z_$]+$/.test(i)){return true;
202
+ }return false;};d.precompile=function(u,v){if(u==null||(typeof u!=="string"&&u.constructor!==d.AST.ProgramNode)){throw new d.Exception("You must pass a string or Handlebars AST to Handlebars.precompile. You passed "+u);
203
+ }v=v||{};if(!("data" in v)){v.data=true;}var l=d.parse(u);var i=new j().compile(l,v);return new g().compile(i,v);};d.compile=function(i,l){if(i==null||(typeof i!=="string"&&i.constructor!==d.AST.ProgramNode)){throw new d.Exception("You must pass a string or Handlebars AST to Handlebars.compile. You passed "+i);
204
+ }l=l||{};if(!("data" in l)){l.data=true;}var v;function u(){var y=d.parse(i);var x=new j().compile(y,l);var w=new g().compile(x,l,c,true);return d.template(w);
205
+ }return function(x,w){if(!v){v=u();}return v.call(this,x,w);};};d.VM={template:function(i){var l={escapeExpression:d.Utils.escapeExpression,invokePartial:d.VM.invokePartial,programs:[],program:function(v,w,x){var u=this.programs[v];
206
+ if(x){u=d.VM.program(v,w,x);}else{if(!u){u=this.programs[v]=d.VM.program(v,w);}}return u;},merge:function(w,v){var u=w||v;if(w&&v){u={};d.Utils.extend(u,v);
207
+ d.Utils.extend(u,w);}return u;},programWithDepth:d.VM.programWithDepth,noop:d.VM.noop,compilerInfo:null};return function(y,x){x=x||{};var v=i.call(l,d,y,x.helpers,x.partials,x.data);
208
+ var z=l.compilerInfo||[],w=z[0]||1,B=d.COMPILER_REVISION;if(w!==B){if(w<B){var u=d.REVISION_CHANGES[B],A=d.REVISION_CHANGES[w];throw"Template was precompiled with an older version of Handlebars than the current runtime. Please update your precompiler to a newer version ("+u+") or downgrade your runtime to an older version ("+A+").";
209
+ }else{throw"Template was precompiled with a newer version of Handlebars than the current runtime. Please update your runtime to a newer version ("+z[1]+").";
210
+ }}return v;};},programWithDepth:function(v,w,x){var u=Array.prototype.slice.call(arguments,3);var l=function(y,i){i=i||{};return w.apply(this,[y,i.data||x].concat(u));
211
+ };l.program=v;l.depth=u.length;return l;},program:function(u,v,w){var l=function(x,i){i=i||{};return v(x,i.data||w);};l.program=u;l.depth=0;return l;},noop:function(){return"";
212
+ },invokePartial:function(i,u,w,x,v,y){var l={helpers:x,partials:v,data:y};if(i===c){throw new d.Exception("The partial "+u+" could not be found");}else{if(i instanceof Function){return i(w,l);
213
+ }else{if(!d.compile){throw new d.Exception("The partial "+u+" could not be compiled when running in runtime-only mode");}else{v[u]=d.compile(i,{data:y!==c});
214
+ return v[u](w,l);}}}}};d.template=d.VM.template;})(Handlebars);
js/storelocator/jquery-1.10.1.min.js ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ /*! jQuery v1.10.1 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
2
+ //@ sourceMappingURL=jquery-1.10.1.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.1",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=lt(),k=lt(),E=lt(),S=!1,A=function(){return 0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=bt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+xt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return At(e.replace(z,"$1"),t,n,i)}function st(e){return K.test(e+"")}function lt(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function ut(e){return e[b]=!0,e}function ct(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function pt(e,t,n){e=e.split("|");var r,i=e.length,a=n?null:t;while(i--)(r=o.attrHandle[e[i]])&&r!==t||(o.attrHandle[e[i]]=a)}function ft(e,t){var n=e.getAttributeNode(t);return n&&n.specified?n.value:e[t]===!0?t.toLowerCase():null}function dt(e,t){return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}function ht(e){return"input"===e.nodeName.toLowerCase()?e.defaultValue:t}function gt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function mt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function yt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function vt(e){return ut(function(t){return t=+t,ut(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.parentWindow;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.frameElement&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ct(function(e){return e.innerHTML="<a href='#'></a>",pt("type|href|height|width",dt,"#"===e.firstChild.getAttribute("href")),pt(B,ft,null==e.getAttribute("disabled")),e.className="i",!e.getAttribute("className")}),r.input=ct(function(e){return e.innerHTML="<input>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")}),pt("value",ht,r.attributes&&r.input),r.getElementsByTagName=ct(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ct(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ct(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=st(n.querySelectorAll))&&(ct(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ct(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=st(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ct(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=st(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},r.sortDetached=ct(function(e){return 1&e.compareDocumentPosition(n.createElement("div"))}),A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return gt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?gt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:ut,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=bt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?ut(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ut(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?ut(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ut(function(e){return function(t){return at(e,t).length>0}}),contains:ut(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:ut(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:vt(function(){return[0]}),last:vt(function(e,t){return[t-1]}),eq:vt(function(e,t,n){return[0>n?n+t:n]}),even:vt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:vt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:vt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:vt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=mt(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=yt(n);function bt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function xt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function wt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function Tt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function Ct(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function Nt(e,t,n,r,i,o){return r&&!r[b]&&(r=Nt(r)),i&&!i[b]&&(i=Nt(i,o)),ut(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||St(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:Ct(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=Ct(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=Ct(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function kt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=wt(function(e){return e===t},s,!0),p=wt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[wt(Tt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return Nt(l>1&&Tt(f),l>1&&xt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&kt(e.slice(l,r)),i>r&&kt(e=e.slice(r)),i>r&&xt(e))}f.push(n)}return Tt(f)}function Et(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=Ct(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?ut(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=bt(e)),n=t.length;while(n--)o=kt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Et(i,r))}return o};function St(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function At(e,t,n,i){var a,s,u,c,p,f=bt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&xt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}o.pseudos.nth=o.pseudos.eq;function jt(){}jt.prototype=o.filters=o.pseudos,o.setFilters=new jt,r.sortStable=b.split("").sort(A).join("")===b,p(),[0,0].sort(A),r.detectDuplicates=S,x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!l||i&&!u||(n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav></:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)
5
+ }),n=s=l=u=r=o=null,t}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=x(this),l=t,u=e.match(T)||[];while(o=u[a++])l=r?l:!s.hasClass(o),s[l?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Ct=/^(?:checkbox|radio)$/i,Nt=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle);
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){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=un(e,t),Pt.detach()),Gt[e]=n),n}function un(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,n){x.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(x.css(e,"display"))?x.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x.support.opacity||(x.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=x.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===x.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,n){return n?x.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,n){x.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?x(e).position()[n]+"px":r):t}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!x.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||x.css(e,"display"))},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(x.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Ct.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),x.param=function(e,n){var r,i=[],o=function(e,t){t=x.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}x.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var mn,yn,vn=x.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Cn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Nn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=x.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=o.href}catch(Ln){yn=a.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(T)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(l){var u;return o[l]=!0,x.each(e[l]||[],function(e,l){var c=l(n,r,i);return"string"!=typeof c||a||o[c]?a?!(u=c):t:(n.dataTypes.unshift(c),s(c),!1)}),u}return s(n.dataTypes[0])||!o["*"]&&s("*")}function _n(e,n){var r,i,o=x.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,l=e.indexOf(" ");return l>=0&&(i=e.slice(l,e.length),e=e.slice(0,l)),x.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&x.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?x("<div>").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks("once memory"),m=p.statusCode||{},y={},v={},b=0,w="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||"*").toLowerCase().match(T)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(mn[3]||("http:"===mn[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&C.setRequestHeader("If-None-Match",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w="abort";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger("ajaxSend",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort("timeout")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||"",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader("Last-Modified"),T&&(x.lastModified[o]=T),T=C.getResponseHeader("etag"),T&&(x.etag[o]=T)),204===e||"HEAD"===p.type?N="nocontent":304===e?N="notmodified":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+"",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger("ajaxComplete",[C,p]),--x.active||x.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,n){return x.get(e,t,n,"script")}}),x.each(["get","post"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+" "+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(p){return{state:"parsererror",error:a?p:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),x.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=a.head||x("head")[0]||a.documentElement;return{send:function(t,i){n=a.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Fn.pop()||x.expando+"_"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return l||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||x.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&"withCredentials"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),"string"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+w+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),a=(x.cssNumber[e]||"px"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,"fxshow");n.queue||(s=x._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(x.support.inlineBlockNeedsLayout&&"inline"!==ln(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?"hidden"in d&&(f=d.hidden):d=x._data(e,"fxshow",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);(i||x._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=x._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,"position");"static"===r&&(e.style.position="relative");var i=x(e),o=i.offset(),a=x.css(e,"top"),s=x.css(e,"left"),l=("absolute"===r||"fixed"===r)&&x.inArray("auto",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),"using"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===x.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(n=e.offset()),n.top+=x.css(e[0],"borderTopWidth",!0),n.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-x.css(r,"marginTop",!0),left:t.left-n.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:"height",Width:"width"},function(e,n){x.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}))})(window);
js/storelocator/jquery.storelocator.js ADDED
@@ -0,0 +1,818 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ * storeLocator v1.4.9 - jQuery Google Maps Store Locator Plugin
3
+ * (c) Copyright 2013, Bjorn Holine (http://www.bjornblog.com)
4
+ * Released under the MIT license
5
+ * Distance calculation function by Chris Pietschmann: http://pietschsoft.com/post/2008/02/01/Calculate-Distance-Between-Geocodes-in-C-and-JavaScript.aspx
6
+ */
7
+
8
+ (function($){
9
+ $.fn.storeLocator = function(options) {
10
+
11
+ var location = jQuery("#location").val();
12
+ var infowindowdesc = jQuery("#infowindowdesc").val();
13
+ var searchurl = jQuery("#searchurl").val();
14
+ var locationlist = jQuery("#locationlist").val();
15
+
16
+ var settings = $.extend( {
17
+ 'mapDiv': 'map',
18
+ 'listDiv': 'loc-list',
19
+ 'formContainerDiv': 'form-container',
20
+ 'formID': 'user-location',
21
+ 'inputID': 'address',
22
+ 'zoomLevel': 12,
23
+ 'pinColor': 'fe7569',
24
+ 'pinTextColor': '000000',
25
+ 'lengthUnit': 'm',
26
+ 'storeLimit': -1,
27
+ 'distanceAlert': -1,
28
+ 'dataType': 'xml',
29
+ 'dataLocation': location,
30
+ 'listColor1': 'ffffff',
31
+ 'listColor2': 'eeeeee',
32
+ 'originMarker': false,
33
+ 'originpinColor': 'blue',
34
+ 'bounceMarker': true,
35
+ 'slideMap': true,
36
+ 'modalWindow': false,
37
+ 'overlayDiv': 'overlay',
38
+ 'modalWindowDiv': 'modal-window',
39
+ 'modalContentDiv': 'modal-content',
40
+ 'modalCloseIconDiv': 'close-icon',
41
+ 'defaultLoc': false,
42
+ 'defaultLat': '',
43
+ 'defaultLng': '',
44
+ 'autoGeocode': false,
45
+ 'maxDistance': false,
46
+ 'maxDistanceID': 'maxdistance',
47
+ 'fullMapStart': false,
48
+ 'noForm': false,
49
+ 'loading': false,
50
+ 'loadingDiv': 'loading-map',
51
+ 'featuredLocations': false,
52
+ 'infowindowTemplatePath': infowindowdesc,
53
+ 'searchdataLocation': searchurl,
54
+ 'listTemplatePath': locationlist,
55
+ //'KMLinfowindowTemplatePath': 'templates/kml-infowindow-description.html',
56
+ //'KMLlistTemplatePath': 'templates/kml-location-list-description.html',
57
+ 'callbackBeforeSend': null,
58
+ 'callbackComplete': null,
59
+ 'callbackSuccess': null,
60
+ 'callbackModalOpen': null,
61
+ 'callbackModalClose': null,
62
+ 'jsonpCallback': null,
63
+ //Language options
64
+ 'geocodeErrorAlert': 'Geocode was not successful for the following reason: ',
65
+ 'addressErrorAlert' : 'Unable to find address',
66
+ 'autoGeocodeErrorAlert': 'Automatic location detection failed. Please fill in your address or zip code.',
67
+ 'distanceErrorAlert': 'Unfortunately, our closest location is more than ',
68
+ 'mileLang': 'mile',
69
+ 'milesLang': 'miles',
70
+ 'kilometerLang': 'kilometer',
71
+ 'kilometersLang': 'kilometers'
72
+ }, options);
73
+
74
+ return this.each(function() {
75
+
76
+ var $this = $(this);
77
+ var listTemplate, infowindowTemplate;
78
+
79
+ load_templates();
80
+
81
+ //First load external templates and compile with Handlebars - make sure the templates are compiled before moving on
82
+ function load_templates(){
83
+
84
+ if(settings.dataType === 'kml'){
85
+ //KML infowindows
86
+ $.get(settings.KMLinfowindowTemplatePath, function(template) {
87
+ var source = template;
88
+ infowindowTemplate = Handlebars.compile(source);
89
+ });
90
+ //KML locations list
91
+ $.get(settings.KMLlistTemplatePath, function(template) {
92
+ var source = template;
93
+ listTemplate = Handlebars.compile(source);
94
+
95
+ //After loading move on to the main script
96
+ locator();
97
+ });
98
+ }
99
+ else{
100
+ //Infowindows
101
+ $.get(settings.infowindowTemplatePath, function(template) {
102
+ var source = template;
103
+ infowindowTemplate = Handlebars.compile(source);
104
+ });
105
+ //Locations list
106
+ $.get(settings.listTemplatePath, function(template) {
107
+ var source = template;
108
+ listTemplate = Handlebars.compile(source);
109
+
110
+ //After loading move on to the main script
111
+ locator();
112
+ });
113
+ }
114
+ }
115
+
116
+ //The main script
117
+ function locator(){
118
+
119
+ var userinput, olat, olng, marker, letter, storenum;
120
+ var locationset = [];
121
+ var featuredset = [];
122
+ var normalset = [];
123
+ var markers = [];
124
+ var prefix = 'storeLocator';
125
+
126
+ //Resets for multiple re-submissions
127
+ function reset(){
128
+ locationset = [];
129
+ featuredset = [];
130
+ normalset = [];
131
+ markers = [];
132
+ $(document).off('click.'+prefix, '#' + settings.listDiv + ' li');
133
+ }
134
+
135
+ //Add modal window divs if set
136
+ if(settings.modalWindow === true){
137
+ $this.wrap('<div id="' + settings.overlayDiv + '"><div id="' + settings.modalWindowDiv + '"><div id="' + settings.modalContentDiv + '">');
138
+ $('#' + settings.modalWindowDiv).prepend('<div id="' + settings.modalCloseIconDiv + '"><\/div>');
139
+ $('#' + settings.overlayDiv).hide();
140
+ }
141
+
142
+ if(settings.slideMap === true){
143
+ //Let's hide the map container to begin
144
+ $this.hide();
145
+ }
146
+
147
+ //Calculate geocode distance functions - you could use Google's distance service instead
148
+ var GeoCodeCalc = {};
149
+ if(settings.lengthUnit === "km"){
150
+ //Kilometers
151
+ GeoCodeCalc.EarthRadius = 6367.0;
152
+ }
153
+ else{
154
+ //Default is miles
155
+ GeoCodeCalc.EarthRadius = 3956.0;
156
+ }
157
+ GeoCodeCalc.ToRadian = function(v) { return v * (Math.PI / 180);};
158
+ GeoCodeCalc.DiffRadian = function(v1, v2) {
159
+ return GeoCodeCalc.ToRadian(v2) - GeoCodeCalc.ToRadian(v1);
160
+ };
161
+ GeoCodeCalc.CalcDistance = function(lat1, lng1, lat2, lng2, radius) {
162
+ return radius * 2 * Math.asin( Math.min(1, Math.sqrt( ( Math.pow(Math.sin((GeoCodeCalc.DiffRadian(lat1, lat2)) / 2.0), 2.0) + Math.cos(GeoCodeCalc.ToRadian(lat1)) * Math.cos(GeoCodeCalc.ToRadian(lat2)) * Math.pow(Math.sin((GeoCodeCalc.DiffRadian(lng1, lng2)) / 2.0), 2.0) ) ) ) );
163
+ };
164
+
165
+ start();
166
+
167
+ function start(){
168
+ //If a default location is set
169
+ if(settings.defaultLoc === true){
170
+ //The address needs to be determined for the directions link
171
+ var r = new ReverseGoogleGeocode();
172
+ var latlng = new google.maps.LatLng(settings.defaultLat, settings.defaultLng);
173
+ r.geocode(latlng, function(data) {
174
+ if(data !== null) {
175
+ var originAddress = data.address;
176
+ mapping(settings.defaultLat, settings.defaultLng, originAddress);
177
+ } else {
178
+ //Unable to geocode
179
+ alert(settings.addressErrorAlert);
180
+ }
181
+ });
182
+ }
183
+
184
+ //If show full map option is true
185
+ if(settings.fullMapStart === true){
186
+ //Just do the mapping without an origin
187
+ mapping();
188
+ }
189
+
190
+ //HTML5 geolocation API option
191
+ if(settings.autoGeocode === true){
192
+ if (navigator.geolocation) {
193
+ navigator.geolocation.getCurrentPosition(autoGeocode_query, autoGeocode_error);
194
+ }
195
+ }
196
+ }
197
+
198
+ //Geocode function for the origin location
199
+ function GoogleGeocode(){
200
+ geocoder = new google.maps.Geocoder();
201
+ this.geocode = function(address, callbackFunction) {
202
+ geocoder.geocode( { 'address': address}, function(results, status) {
203
+ if (status === google.maps.GeocoderStatus.OK) {
204
+ var result = {};
205
+ result.latitude = results[0].geometry.location.lat();
206
+ result.longitude = results[0].geometry.location.lng();
207
+ callbackFunction(result);
208
+ } else {
209
+ alert(settings.geocodeErrorAlert + status);
210
+ callbackFunction(null);
211
+ }
212
+ });
213
+ };
214
+ }
215
+
216
+ //Reverse geocode to get address for automatic options needed for directions link
217
+ function ReverseGoogleGeocode(){
218
+ geocoder = new google.maps.Geocoder();
219
+ this.geocode = function(latlng, callbackFunction) {
220
+ geocoder.geocode( {'latLng': latlng}, function(results, status) {
221
+ if (status === google.maps.GeocoderStatus.OK) {
222
+ if (results[0]) {
223
+ var result = {};
224
+ result.address = results[0].formatted_address;
225
+ callbackFunction(result);
226
+ }
227
+ } else {
228
+ alert(settings.geocodeErrorAlert + status);
229
+ callbackFunction(null);
230
+ }
231
+ });
232
+ };
233
+ }
234
+
235
+ //Used to round miles to display
236
+ function roundNumber(num, dec){
237
+ return Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
238
+ }
239
+
240
+ //If location is detected automatically
241
+ function autoGeocode_query(position){
242
+ //The address needs to be determined for the directions link
243
+ var r = new ReverseGoogleGeocode();
244
+ var latlng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
245
+ r.geocode(latlng, function(data) {
246
+ if(data !== null) {
247
+ var originAddress = data.address;
248
+ mapping(position.coords.latitude, position.coords.longitude, originAddress);
249
+ } else {
250
+ //Unable to geocode
251
+ alert(settings.addressErrorAlert);
252
+ }
253
+ });
254
+ }
255
+
256
+ function autoGeocode_error(error){
257
+ //If automatic detection doesn't work show an error
258
+ alert(settings.autoGeocodeErrorAlert);
259
+ }
260
+
261
+ //Set up the normal mapping
262
+ function begin_mapping(distance){
263
+ //Get the user input and use it
264
+ var userinput = $('#' + settings.inputID).val();
265
+ var searchzipcode = 'magpedia';
266
+ if (userinput === ""){
267
+ start();
268
+ }
269
+ else{
270
+ var g = new GoogleGeocode();
271
+ var address = userinput;
272
+ g.geocode(address, function(data) {
273
+ if(data !== null) {
274
+ olat = data.latitude;
275
+ olng = data.longitude;
276
+ mapping(olat, olng, userinput, distance,searchzipcode);
277
+ } else {
278
+ //Unable to geocode
279
+ alert(settings.addressErrorAlert);
280
+ }
281
+ });
282
+ }
283
+ }
284
+
285
+ //Process form input
286
+ $(function(){
287
+ //Handle form submission
288
+ function get_form_values(e){
289
+ //Stop the form submission
290
+ e.preventDefault();
291
+
292
+ if(settings.maxDistance === true){
293
+ var maxDistance = $('#' + settings.maxDistanceID).val();
294
+ //Start the mapping
295
+ begin_mapping(maxDistance);
296
+ }
297
+ else{
298
+ //Start the mapping
299
+ begin_mapping();
300
+ }
301
+ }
302
+
303
+ //ASP.net or regular submission?
304
+ if(settings.noForm === true){
305
+ $(document).on('click.'+prefix, '#' + settings.formContainerDiv + ' #submit', function(e){
306
+ get_form_values(e);
307
+ });
308
+ $(document).on('keyup.'+prefix, function(e){
309
+ if (e.keyCode === 13 && $('#' + settings.inputID).is(':focus')) {
310
+ get_form_values(e);
311
+ }
312
+ });
313
+ }
314
+ else{
315
+ $(document).on('submit.'+prefix, '#' + settings.formID, function(e){
316
+ get_form_values(e);
317
+ });
318
+ }
319
+ });
320
+
321
+ //Now all the mapping stuff
322
+ function mapping(orig_lat, orig_lng, origin, maxDistance,s){
323
+ $(function(){
324
+
325
+ // Enable the visual refresh https://developers.google.com/maps/documentation/javascript/basics#VisualRefresh
326
+ google.maps.visualRefresh = true;
327
+
328
+ var dataTypeRead;
329
+
330
+ //KML is read as XML
331
+ if(settings.dataType === 'kml'){
332
+ dataTypeRead = "xml";
333
+ }
334
+ else{
335
+ dataTypeRead = settings.dataType;
336
+ }
337
+
338
+ var dataurl;
339
+ var zipcode = $('#' + settings.inputID).val();
340
+ dataurl = (s)?settings.searchdataLocation+"?zipcode="+zipcode:(settings.dataLocation + (settings.dataType === 'jsonp' ? (settings.dataLocation.match(/\?/) ? '&' : '?') + 'callback=?' : ''));
341
+ //Process the data
342
+ $.ajax({
343
+ type: "GET",
344
+ url: dataurl,
345
+ dataType: dataTypeRead,
346
+ jsonpCallback: (settings.dataType === 'jsonp' ? settings.jsonpCallback : null),
347
+ beforeSend: function (){
348
+ // Callback
349
+ if(settings.callbackBeforeSend){
350
+ settings.callbackBeforeSend.call(this);
351
+ }
352
+
353
+ //Loading
354
+ if(settings.loading === true){
355
+ $('#' + settings.formContainerDiv).append('<div id="' + settings.loadingDiv +'"><\/div>');
356
+ }
357
+
358
+ },
359
+ complete: function (event, request, options){
360
+ // Callback
361
+ if(settings.callbackComplete){
362
+ settings.callbackComplete.call(this, event, request, options);
363
+ }
364
+
365
+ //Loading remove
366
+ if(settings.loading === true){
367
+ $('#' + settings.loadingDiv).remove();
368
+ }
369
+ },
370
+ success: function (data, xhr, options){
371
+ // Callback
372
+ if(settings.callbackSuccess){
373
+ settings.callbackSuccess.call(this, data, xhr, options);
374
+ }
375
+
376
+ //After the store locations file has been read successfully
377
+ var i = 0;
378
+ var firstRun;
379
+
380
+ //Set a variable for fullMapStart so we can detect the first run
381
+ if(settings.fullMapStart === true && $('#' + settings.mapDiv).hasClass('mapOpen') === false){
382
+ firstRun = true;
383
+ }
384
+ else{
385
+ reset();
386
+ }
387
+
388
+ $('#' + settings.mapDiv).addClass('mapOpen');
389
+
390
+ //Depending on your data structure and what you want to include in the maps, you may need to change the following variables or comment them out
391
+ if(settings.dataType === 'json' || settings.dataType === 'jsonp'){
392
+ //Process JSON
393
+ $.each(data, function(){
394
+ var key, value, locationData = {};
395
+
396
+ // Parse each data variables
397
+ for( key in this ){
398
+ value = this[key];
399
+
400
+ if(key === 'web'){
401
+ if ( value ) value = value.replace("http://",""); // Remove scheme (todo: should NOT be done)
402
+ }
403
+
404
+ locationData[key] = value;
405
+ }
406
+
407
+ if(!locationData['distance']){
408
+ locationData['distance'] = GeoCodeCalc.CalcDistance(orig_lat,orig_lng,locationData['lat'],locationData['lng'], GeoCodeCalc.EarthRadius);
409
+ }
410
+
411
+ //Create the array
412
+ if(settings.maxDistance === true && firstRun !== true && maxDistance){
413
+ if(locationData['distance'] < maxDistance){
414
+ locationset[i] = locationData;
415
+ }
416
+ else{
417
+ return;
418
+ }
419
+ }
420
+ else{
421
+ locationset[i] = locationData;
422
+ }
423
+
424
+ i++;
425
+ });
426
+ }
427
+ else if(settings.dataType === 'kml'){
428
+ //Process KML
429
+ $(data).find('Placemark').each(function(){
430
+ var locationData = {
431
+ 'name': $(this).find('name').text(),
432
+ 'lat': $(this).find('coordinates').text().split(",")[1],
433
+ 'lng': $(this).find('coordinates').text().split(",")[0],
434
+ 'description': $(this).find('description').text()
435
+ };
436
+
437
+ locationData['distance'] = GeoCodeCalc.CalcDistance(orig_lat,orig_lng,locationData['lat'],locationData['lng'], GeoCodeCalc.EarthRadius);
438
+
439
+ //Create the array
440
+ if(settings.maxDistance === true && firstRun !== true && maxDistance){
441
+ if(locationData['distance'] < maxDistance){
442
+ locationset[i] = locationData;
443
+ }
444
+ else{
445
+ return;
446
+ }
447
+ }
448
+ else{
449
+ locationset[i] = locationData;
450
+ }
451
+
452
+ i++;
453
+ });
454
+ }
455
+ else{
456
+ //Process XML
457
+ $(data).find('marker').each(function(){
458
+ var locationData = {
459
+ 'name': $(this).attr('name'),
460
+ 'lat': $(this).attr('lat'),
461
+ 'lng': $(this).attr('lng'),
462
+ 'address': $(this).attr('address'),
463
+ 'address2': $(this).attr('address2'),
464
+ 'city': $(this).attr('city'),
465
+ 'state': $(this).attr('state'),
466
+ 'postal': $(this).attr('postal'),
467
+ 'country': $(this).attr('country'),
468
+ 'phone': $(this).attr('phone'),
469
+ 'email': $(this).attr('email'),
470
+ 'storeimage': $(this).attr('storeimage'),
471
+ 'web': $(this).attr('web'),
472
+ 'hours1': $(this).attr('hours1'),
473
+ 'hours2': $(this).attr('hours2'),
474
+ 'hours3': $(this).attr('hours3'),
475
+ 'category': $(this).attr('category'),
476
+ 'featured': $(this).attr('featured')
477
+ };
478
+
479
+ if(locationData['web']) locationData['web'] = locationData['web'].replace("http://",""); // Remove scheme (todo: should NOT be done)
480
+
481
+ locationData['distance'] = GeoCodeCalc.CalcDistance(orig_lat,orig_lng,locationData['lat'],locationData['lng'], GeoCodeCalc.EarthRadius);
482
+
483
+ //Create the array
484
+ if(settings.maxDistance === true && firstRun !== true && maxDistance){
485
+ if(locationData['distance'] < maxDistance){
486
+ locationset[i] = locationData;
487
+ }
488
+ else{
489
+ return;
490
+ }
491
+ }
492
+ else{
493
+ locationset[i] = locationData;
494
+ }
495
+
496
+ i++;
497
+ });
498
+ }
499
+
500
+ //Distance sorting function
501
+ function sort_numerically(locationsarray){
502
+ locationsarray.sort(function(a, b){
503
+ return ((a['distance'] < b['distance']) ? -1 : ((a['distance'] > b['distance']) ? 1 : 0));
504
+ });
505
+ }
506
+
507
+ //Sort the multi-dimensional array by distance
508
+ sort_numerically(locationset);
509
+
510
+ //Featured locations filtering
511
+ if(settings.featuredLocations === true){
512
+ //Create array for featured locations
513
+ featuredset = $.grep(locationset, function(val, i){
514
+ return val['featured'] === "true";
515
+ });
516
+
517
+ //Create array for normal locations
518
+ normalset = $.grep(locationset, function(val, i){
519
+ return val['featured'] !== "true";
520
+ });
521
+
522
+ //Combine the arrays
523
+ locationset = [];
524
+ locationset = featuredset.concat(normalset);
525
+ }
526
+
527
+ //Get the length unit
528
+ var distUnit = (settings.lengthUnit === "km") ? settings.kilometersLang : settings.milesLang ;
529
+
530
+ //Check the closest marker
531
+ if(settings.maxDistance === true && firstRun !== true && maxDistance){
532
+ if(locationset[0] === undefined || locationset[0]['distance'] > maxDistance){
533
+ alert(settings.distanceErrorAlert + maxDistance + " " + distUnit);
534
+ return;
535
+ }
536
+ }
537
+ else{
538
+ if(settings.distanceAlert !== -1 && locationset[0]['distance'] > settings.distanceAlert){
539
+ alert(settings.distanceErrorAlert + settings.distanceAlert + " " + distUnit);
540
+ }
541
+ }
542
+
543
+ //Create the map with jQuery
544
+ $(function(){
545
+
546
+ var key, value, locationData = {};
547
+
548
+ //Instead of repeating the same thing twice below
549
+ function create_location_variables(loopcount){
550
+ for ( key in locationset[loopcount] ) {
551
+ value = locationset[loopcount][key];
552
+
553
+ if(key === 'distance'){
554
+ value = roundNumber(value,2);
555
+ }
556
+
557
+ locationData[key] = value;
558
+ }
559
+ }
560
+
561
+ //Define the location data for the templates
562
+ function define_location_data(currentMarker){
563
+ create_location_variables(currentMarker.get("id"));
564
+
565
+ var distLength;
566
+ if(locationData['distance'] <= 1){
567
+ if(settings.lengthUnit === "km"){
568
+ distLength = settings.kilometerLang;
569
+ }
570
+ else{
571
+ distLength = settings.mileLang;
572
+ }
573
+ }
574
+ else{
575
+ if(settings.lengthUnit === "km"){
576
+ distLength = settings.kilometersLang;
577
+ }
578
+ else{
579
+ distLength = settings.milesLang;
580
+ }
581
+ }
582
+
583
+ //Set up alpha character
584
+ var markerId = currentMarker.get("id");
585
+ //Use dot markers instead of alpha if there are more than 26 locations
586
+ if(settings.storeLimit === -1 || settings.storeLimit > 26){
587
+ var indicator = markerId + 1;
588
+ }
589
+ else{
590
+ var indicator = String.fromCharCode("A".charCodeAt(0) + markerId);
591
+ }
592
+
593
+ //Define location data
594
+ var locations = {
595
+ location: [$.extend(locationData, {
596
+ 'markerid': markerId,
597
+ 'marker': indicator,
598
+ 'length': distLength,
599
+ 'origin': origin
600
+ })]
601
+ };
602
+
603
+ return locations;
604
+ }
605
+
606
+ //Slide in the map container
607
+ if(settings.slideMap === true){
608
+ $this.slideDown();
609
+ }
610
+ //Set up the modal window
611
+ if(settings.modalWindow === true){
612
+ // Callback
613
+ if (settings.callbackModalOpen){
614
+ settings.callbackModalOpen.call(this);
615
+ }
616
+
617
+ function modalClose(){
618
+ // Callback
619
+ if (settings.callbackModalOpen){
620
+ settings.callbackModalOpen.call(this);
621
+ }
622
+
623
+ $('#' + settings.overlayDiv).hide();
624
+ }
625
+
626
+ //Pop up the modal window
627
+ $('#' + settings.overlayDiv).fadeIn();
628
+ //Close modal when close icon is clicked and when background overlay is clicked
629
+ $(document).on('click.'+prefix, '#' + settings.modalCloseIconDiv + ', #' + settings.overlayDiv, function(){
630
+ modalClose();
631
+ });
632
+ //Prevent clicks within the modal window from closing the entire thing
633
+ $(document).on('click.'+prefix, '#' + settings.modalWindowDiv, function(e){
634
+ e.stopPropagation();
635
+ });
636
+ //Close modal when escape key is pressed
637
+ $(document).on('keyup.'+prefix, function(e){
638
+ if (e.keyCode === 27) {
639
+ modalClose();
640
+ }
641
+ });
642
+ }
643
+
644
+ //Google maps settings
645
+ if((settings.fullMapStart === true && firstRun === true) || settings.zoomLevel === 0){
646
+ var myOptions = {
647
+ mapTypeId: google.maps.MapTypeId.ROADMAP
648
+ };
649
+ var bounds = new google.maps.LatLngBounds ();
650
+ }
651
+ else{
652
+ var myOptions = {
653
+ zoom: settings.zoomLevel,
654
+ center: new google.maps.LatLng(orig_lat, orig_lng),
655
+ mapTypeId: google.maps.MapTypeId.ROADMAP
656
+ };
657
+ }
658
+
659
+ var map = new google.maps.Map(document.getElementById(settings.mapDiv),myOptions);
660
+ $this.data('map', map);
661
+
662
+ //Create one infowindow to fill later
663
+ var infowindow = new google.maps.InfoWindow();
664
+
665
+ //Avoid error if number of locations is less than the default of 26
666
+ if(settings.storeLimit === -1 || (locationset.length-1) < settings.storeLimit-1){
667
+ storenum = locationset.length-1;
668
+ }
669
+ else{
670
+ storenum = settings.storeLimit-1;
671
+ }
672
+
673
+ //Add origin marker if the setting is set
674
+ if(settings.originMarker === true && settings.fullMapStart === false){
675
+ var originPoint = new google.maps.LatLng(orig_lat, orig_lng);
676
+ var marker = new google.maps.Marker({
677
+ position: originPoint,
678
+ map: map,
679
+ icon: 'http://maps.google.com/mapfiles/ms/icons/'+ settings.originpinColor +'-dot.png',
680
+ draggable: false
681
+ });
682
+ }
683
+
684
+ //Add markers and infowindows loop
685
+ for(var y = 0; y <= storenum; y++) {
686
+ var letter = String.fromCharCode("A".charCodeAt(0) + y);
687
+ var point = new google.maps.LatLng(locationset[y]['lat'], locationset[y]['lng']);
688
+ marker = createMarker(point, locationset[y]['name'], locationset[y]['address'], letter );
689
+ marker.set("id", y);
690
+ markers[y] = marker;
691
+ if((settings.fullMapStart === true && firstRun === true) || settings.zoomLevel === 0){
692
+ bounds.extend(point);
693
+ }
694
+ //Pass variables to the pop-up infowindows
695
+ create_infowindow(marker);
696
+ }
697
+
698
+ //Center and zoom if no origin or zoom was provided
699
+ if((settings.fullMapStart === true && firstRun === true) || settings.zoomLevel === 0){
700
+ map.fitBounds(bounds);
701
+ }
702
+
703
+ //Create the links that focus on the related marker
704
+ $("#" + settings.listDiv + ' ul').empty();
705
+ $(markers).each(function(x, marker){
706
+ var letter = String.fromCharCode("A".charCodeAt(0) + x);
707
+ //This needs to happen outside the loop or there will be a closure problem with creating the infowindows attached to the list click
708
+ var currentMarker = markers[x];
709
+ listClick(currentMarker);
710
+ });
711
+
712
+ function listClick(marker){
713
+ //Define the location data
714
+ var locations = define_location_data(marker);
715
+
716
+ //Set up the list template with the location data
717
+ var listHtml = listTemplate(locations);
718
+ $('#' + settings.listDiv + ' ul').append(listHtml);
719
+ }
720
+
721
+ //Handle clicks from the list
722
+ $(document).on('click.'+prefix, '#' + settings.listDiv + ' li', function(){
723
+ var markerId = $(this).data('markerid');
724
+
725
+ var selectedMarker = markers[markerId];
726
+
727
+ //Focus on the list
728
+ $('#' + settings.listDiv + ' li').removeClass('list-focus');
729
+ $('#' + settings.listDiv + ' li[data-markerid=' + markerId +']').addClass('list-focus');
730
+
731
+ map.panTo(selectedMarker.getPosition());
732
+ var listLoc = "left";
733
+ if(settings.bounceMarker === true){
734
+ selectedMarker.setAnimation(google.maps.Animation.BOUNCE);
735
+ setTimeout(function() { selectedMarker.setAnimation(null); create_infowindow(selectedMarker, listLoc); }, 700);
736
+ }
737
+ else{
738
+ create_infowindow(selectedMarker, listLoc);
739
+ }
740
+ });
741
+
742
+ //Add the list li background colors
743
+ $("#" + settings.listDiv + " ul li:even").css('background', "#" + settings.listColor1);
744
+ $("#" + settings.listDiv + " ul li:odd").css('background', "#" + settings.listColor2);
745
+
746
+ //Custom marker function - alphabetical
747
+ function createMarker(point, name, address, letter){
748
+ //Set up pin icon with the Google Charts API for all of our markers
749
+ var pinImage = new google.maps.MarkerImage("http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=" + letter + "|" + settings.pinColor + "|" + settings.pinTextColor,
750
+ new google.maps.Size(21, 34),
751
+ new google.maps.Point(0,0),
752
+ new google.maps.Point(10, 34));
753
+
754
+ //Create the markers
755
+ if(settings.storeLimit === -1 || settings.storeLimit > 26){
756
+ var marker = new google.maps.Marker({
757
+ position: point,
758
+ map: map,
759
+ draggable: false
760
+ });
761
+ }
762
+ else{
763
+ var marker = new google.maps.Marker({
764
+ position: point,
765
+ map: map,
766
+ icon: pinImage,
767
+ draggable: false
768
+ });
769
+ }
770
+
771
+ return marker;
772
+ }
773
+
774
+ //Infowindows
775
+ function create_infowindow(marker, location){
776
+
777
+ //Define the location data
778
+ var locations = define_location_data(marker);
779
+
780
+ //Set up the infowindow template with the location data
781
+ var formattedAddress = infowindowTemplate(locations);
782
+
783
+ //Opens the infowindow when list item is clicked
784
+ if(location === "left"){
785
+ infowindow.setContent(formattedAddress);
786
+ infowindow.open(marker.get('map'), marker);
787
+ }
788
+ //Opens the infowindow when the marker is clicked
789
+ else{
790
+ google.maps.event.addListener(marker, 'click', function() {
791
+ infowindow.setContent(formattedAddress);
792
+ infowindow.open(marker.get('map'), marker);
793
+ //Focus on the list
794
+ $('#' + settings.listDiv + ' li').removeClass('list-focus');
795
+ markerId = marker.get("id");
796
+ $('#' + settings.listDiv + ' li[data-markerid=' + markerId +']').addClass('list-focus');
797
+
798
+ //Scroll list to selected marker
799
+ var container = $('#' + settings.listDiv),scrollTo = $('#' + settings.listDiv + ' li[data-markerid=' + markerId +']');
800
+ $('#' + settings.listDiv).animate({
801
+ scrollTop: scrollTo.offset().top - container.offset().top + container.scrollTop()
802
+ });
803
+ });
804
+ }
805
+
806
+ }
807
+
808
+ });
809
+ }
810
+ });
811
+ });
812
+ }
813
+
814
+ }
815
+
816
+ });
817
+ };
818
+ })(jQuery);
js/storelocator/noConflict.js ADDED
@@ -0,0 +1 @@
 
1
+ jQuery.noConflict();
package.xml ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <package>
3
+ <name>Magpedia_Storelocator</name>
4
+ <version>0.0.1</version>
5
+ <stability>stable</stability>
6
+ <license>Open Software License (OSL)</license>
7
+ <channel>community</channel>
8
+ <extends/>
9
+ <summary>Magpedia store locator guides users to find out physical locations of retailers such as branches, stores and offices. The store locator also provides important information about each location including its address, phone numbers, hours of operation, store description, country, state city and sometimes directions of the location. Users smoothly search their nearest store by entering their postal code/state/city/store title and the store locator returns all the information of the stores according to the given data.</summary>
10
+ <description>Magpedia store locator guides users to find out physical locations of retailers such as branches, stores and offices. The store locator also provides important information about each location including its address, phone numbers, hours of operation, store description, country, state city and sometimes directions of the location. Users smoothly search their nearest store by entering their postal code/state/city/store title and the store locator returns all the information of the stores according to the given data.&#xD;
11
+ &#xD;
12
+ Features&#xD;
13
+ &#x2022; Ability to set default latitude/longitude&#xD;
14
+ &#xD;
15
+ &#x2022; Custom links in the header and footer&#xD;
16
+ &#xD;
17
+ &#x2022; Supports multiple page layouts(Listing of all stores and detail of a store)&#xD;
18
+ &#xD;
19
+ &#x2022; Multi Store enabled&#xD;
20
+ &#xD;
21
+ &#x2022; Map and Satellite views are supported&#xD;
22
+ &#xD;
23
+ &#x2022; To show images of the store in the locations list and on the map for easier navigation.&#xD;
24
+ &#x2022; Set the order of each store to be displayed in the frontend. Location according to sort order appears in frontend.&#xD;
25
+ &#xD;
26
+ &#x2022; Compatible with a variety of Community Editions, including 1.5.x.x, 1.6.x.x, 1.7.x.x, 1.8.x.x&#xD;
27
+ &#xD;
28
+ &#xD;
29
+ Required Fields&#xD;
30
+ Store Title&#xD;
31
+ Country&#xD;
32
+ City&#xD;
33
+ Postal Code&#xD;
34
+ Address&#xD;
35
+ Latitude&#xD;
36
+ Longitude&#xD;
37
+ Store Views&#xD;
38
+ &#xD;
39
+ Optional fields&#xD;
40
+ Store Link&#xD;
41
+ State&#xD;
42
+ Email&#xD;
43
+ Phone&#xD;
44
+ Fax&#xD;
45
+ Description&#xD;
46
+ Store Image&#xD;
47
+ Store Time&#xD;
48
+ </description>
49
+ <notes>Magpedia store locator guides users to find out physical locations of retailers such as branches, stores and offices. The store locator also provides important information about each location including its address, phone numbers, hours of operation, store description, country, state city and sometimes directions of the location. Users smoothly search their nearest store by entering their postal code/state/city/store title and the store locator returns all the information of the stores according to the given data.</notes>
50
+ <authors><author><name>Ramesh Kumar</name><user>ramesh</user><email>rkrameshraja@gmail.com</email></author></authors>
51
+ <date>2014-05-20</date>
52
+ <time>20:04:12</time>
53
+ <contents><target name="magecommunity"><dir name="Magpedia"><dir><dir name="Storelocator"><dir name="Block"><dir name="Adminhtml"><dir name="Storelocator"><dir name="Edit"><file name="Form.php" hash="c8adb5e74e6dd1616f22ce2936c312c6"/><dir name="Tab"><file name="Form.php" hash="0779d5dab33c501535950b83c619cf48"/><file name="Stores.php" hash="6229af8a3ec3ab2546a4de8c9e28a5dc"/></dir><file name="Tabs.php" hash="1e02c47c57a0bd42b8b8326e31e427bf"/></dir><file name="Edit.php" hash="73f5e52f5e8f649071d7b8c498df2c67"/><file name="Grid.php" hash="93130482bc8dd52e03be39b9ccb2b4ba"/><dir name="Helper"><file name="Image.php" hash="45a72a02120f4bf19bf9133fb8baf39e"/></dir><file name="Image.php" hash="677859104a712e5d2015d268ac5947e1"/></dir><file name="Storelocator.php" hash="43d89c5c7a21433a499122b071cea96d"/></dir><dir name="Storelocator"><file name="List.php" hash="51a63778efc886415db3115a4f323daa"/><file name="View.php" hash="bf9ec7f0ce8e230d8d59e9e05505d00d"/></dir></dir><dir name="Controller"><dir name="Adminhtml"><file name="Storelocator.php" hash="f9be75600740025b6cf8b92e4bab6262"/></dir></dir><dir name="Helper"><file name="Data.php" hash="e84b7d4adc8ac9ddc439712c5133ff2b"/><dir name="Image"><file name="Abstract.php" hash="0a8b912831a826d15c6bdbc02e842d1d"/></dir><dir name="Storelocator"><file name="Image.php" hash="d9c746d3b3825e1e57d9fd95802daebc"/></dir><file name="Storelocator.php" hash="9c6e36504abe38499a6166b85e42881f"/></dir><dir name="Model"><dir name="Resource"><file name="Setup.php" hash="f653390e2b282dcbb34140e8798e8172"/><dir name="Storelocator"><file name="Collection.php" hash="cfb80af24756d44fe8307ae6aade5b6c"/></dir><file name="Storelocator.php" hash="d5434ab1e16285de598be8eb29e6e60e"/></dir><file name="Storelocator.php" hash="de71b7f8331b268be397fa2ee58738c8"/></dir><dir name="controllers"><dir name="Adminhtml"><dir name="Storelocator"><file name="StorelocatorController.php" hash="3ae575fb65797d36130d7aa9365e452c"/></dir></dir><file name="StorelocatorController.php" hash="19f13a03227d81f656f33d96d9f534cb"/></dir><dir name="etc"><file name="adminhtml.xml" hash="10ee419bbe3d1bd51334229800b569c5"/><file name="config.xml" hash="b59d63b29b50480f75e195eecad9d2f3"/><file name="system.xml" hash="9d7b126f4baa378d6189447b29a6314b"/><file name="widget.xml" hash="de7e4ec71fbc39b1858d09f87854ced8"/></dir><dir name="sql"><dir name="magpedia_storelocator_setup"><file name="install-0.0.1.php" hash="fb6a875e7e647770ed387924adad85a3"/></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Magpedia_Storelocator.xml" hash="51583bea657c10670d3ff58d6f73a36e"/></dir></target><target name="mageskin"><dir name="frontend"><dir name="default"><dir name="default"><dir name="storelocator"><dir><dir name="css"><file name="map-style.css" hash="4b4ab7443d3f836737ffc05d3f494e27"/><file name="map.css" hash="80ea19713ea2a55eba19a020bcc28c57"/></dir><dir name="images"><file name="ajax-loader.gif" hash="2a6692973429d7a74513bfa8bcb5be20"/><file name="close-icon.png" hash="3b13303a36ac8bff0ee6e371ff07d6df"/><dir name="marker"><file name="faddu.jpg" hash="e4046cb53b344e9f80161e891178a6a7"/></dir><file name="overlay-bg.png" hash="b437e98486d68b23f279c92ccd1b68f3"/></dir></dir></dir></dir></dir></dir></target><target name="mageweb"><dir name="js"><dir name="storelocator"><file name="handlebars-1.0.0.min.js" hash="b468988a5773757374f3e1188913e38a"/><file name="jquery-1.10.1.min.js" hash="33d85132f0154466fc017dd05111873d"/><file name="jquery.storelocator.js" hash="a9d3c629700fe0d4d1da798b8a04ba63"/><file name="noConflict.js" hash="3179f2255b046d5f2e9a71e365287bef"/></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="default"><dir name="default"><dir name="layout"><file name="magpedia_storelocator.xml" hash="57e501e7397ce6058d2b4672560f9eb8"/></dir><dir name="template"><dir name="magpedia_storelocator"><dir><dir name="storelocator"><file name="list.phtml" hash="54f07ee1ed970b89ba6cccd0f21a8e69"/><file name="view.phtml" hash="dda937e8889b087603d5c85bb70b6bba"/><dir name="widget"><file name="link.phtml" hash="c6f74a87a30deb63bb01af2e241b986e"/><file name="view.phtml" hash="f14acca79f44d9c56c6b838d000fd973"/></dir></dir></dir></dir></dir></dir></dir></dir><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="magpedia_storelocator.xml" hash="4dc55ad54c46096753fdbdec1e2405c2"/></dir></dir></dir></dir></target></contents>
54
+ <compatible/>
55
+ <dependencies><required><php><min>5.0.1</min><max>6.0.0</max></php></required></dependencies>
56
+ </package>
skin/frontend/default/default/storelocator/css/map-style.css ADDED
@@ -0,0 +1 @@
 
1
+ #page-header{float:left;}#store-locator-container{float:left;margin-left:20px;width:875px;font:normal 12px Arial,Helvetica,sans-serif;color:#333;}#store-locator-container #form-container{clear:left;float:left;margin-top:15px;width:100%;}#store-locator-container #map-container{clear:left;float:left;margin-top:27px;height:530px;width:875px;}#store-locator-container #map-container a{color:#e76737;text-decoration:none;}#store-locator-container #map-container a:hover,#store-locator-container #map-container a:active{text-decoration:underline;}#store-locator-container #map-container .custom-marker{width:32px;height:37px;color:#fff;background:url(../images/custom-marker.png) no-repeat;padding:3px;cursor:pointer;}#store-locator-container #loc-list{float:left;width:240px;height:530px;overflow:auto;}#store-locator-container #loc-list ul{display:block;clear:left;float:left;list-style:none;margin:0;padding:0;}#store-locator-container #loc-list ul li{display:block;clear:left;float:left;margin:6px 10px;cursor:pointer;width:200px;border:1px solid #fff;}#store-locator-container #loc-list .list-label{float:left;margin:10px 0 0 6px;padding:2px 3px;width:17px;text-align:center;background:#451400;color:#fff;font-weight:bold;}#store-locator-container #loc-list .list-details{float:left;margin-left:6px;width:165px;}#store-locator-container #loc-list .list-details .list-content{padding:10px;}#store-locator-container #loc-list .list-details .loc-dist{font-weight:bold;font-style:italic;color:#8e8e8e;}#store-locator-container #loc-list .list-focus{border:1px solid rgba(82, 168, 236, 0.9);-moz-box-shadow:0 0 8px rgba(82, 168, 236, 0.7);-webkit-box-shadow:0 0 8px rgba(82, 168, 236, 0.7);box-shadow:0 0 8px rgba(82, 168, 236, 0.7);transition:border 0.2s linear 0s,box-shadow 0.2s linear 0s;}#store-locator-container .loc-name{color:#AD2118;font-weight:bold;}#store-locator-container #search-form{clear:left;float:left;height:60px;}#store-locator-container #form-input{float:left;margin-top:3px;}#store-locator-container #form-input label{font-weight:bold;}#store-locator-container #form-input input{padding:4px;line-height:16px;border:1px solid #ccc;}#store-locator-container #address{margin:0 0 0 10px;}#store-locator-container #submit{float:left;cursor:pointer;margin:3px 0 0 10px;padding:3px 6px;background:#ae2118;border:1px solid #961f17;color:#fff;-webkit-border-radius:4px;border-radius:4px;}#store-locator-container #loading-map{float:left;margin:4px 0 0 10px;width:16px;height:16px;background:url(../images/ajax-loader.gif) no-repeat;}#store-locator-container #map{float:left;width:635px;height:530px;}.gm-style div,.gm-style span,.gm-style label,.gm-style a{font-family:Arial,Helvetica,sans-serif;}#overlay{position:fixed;left:0px;top:0px;width:100%;height:100%;z-index:10000;background:url(../images/overlay-bg.png) repeat;}#overlay #modal-window{position:absolute;left:50%;margin-left:-460px;margin-top:60px;width:920px;height:590px;z-index:10010;background:#fff;border-radius:10px;box-shadow:0 0 10px #656565;}#overlay #modal-window #modal-content{float:left;padding:0 22px;}#overlay #modal-window #close-icon{position:absolute;top:-6px;right:-6px;width:18px;height:18px;cursor:pointer;background:#2c2c2c url(../images/close-icon.png) 3px 3px no-repeat;border:1px solid #000;border-radius:3px;box-shadow:0 0 3px #656565;}#geocode-result{clear:left;float:left;margin-top:30px;width:100%;}
skin/frontend/default/default/storelocator/css/map.css ADDED
@@ -0,0 +1,219 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #store-locator-container{
2
+ float: left;
3
+ margin-left: 20px;
4
+ width: 875px;
5
+ font: normal 12px Arial, Helvetica, sans-serif;
6
+ color: #333;
7
+ }
8
+
9
+ #page-header{
10
+ float: left;
11
+ }
12
+
13
+ #form-container{
14
+ clear: left;
15
+ float: left;
16
+ margin-top: 15px;
17
+ width: 100%;
18
+ }
19
+
20
+ #map-container{
21
+ clear: left;
22
+ float: left;
23
+ margin-top: 27px;
24
+ height: 530px;
25
+ width: 875px;
26
+ }
27
+
28
+ #map-container a{
29
+ color: #e76737;
30
+ text-decoration: none;
31
+ }
32
+
33
+ #map-container a:hover, #map-container a:active{
34
+ text-decoration: underline;
35
+ }
36
+
37
+ #map-container .custom-marker{
38
+ width: 32px;
39
+ height: 37px;
40
+ color: #fff;
41
+ background: url(../images/custom-marker.png) no-repeat;
42
+ padding: 3px;
43
+ cursor: pointer;
44
+ }
45
+
46
+ #loc-list{
47
+ float: left;
48
+ width: 240px;
49
+ height: 530px;
50
+ overflow: auto;
51
+ }
52
+
53
+ #loc-list ul{
54
+ display: block;
55
+ clear: left;
56
+ float: left;
57
+ list-style: none;
58
+ margin: 0;
59
+ padding: 0;
60
+ }
61
+
62
+ #loc-list .list-label{
63
+ float: left;
64
+ margin: 10px 0 0 6px;
65
+ padding: 2px 3px;
66
+ width: 17px;
67
+ text-align: center;
68
+ background: #451400;
69
+ color: #fff;
70
+ font-weight: bold;
71
+ }
72
+
73
+ #loc-list .list-details{
74
+ float: left;
75
+ margin-left: 6px;
76
+ width: 165px;
77
+ }
78
+
79
+ #loc-list .list-content{
80
+ padding: 10px;
81
+ }
82
+
83
+ #loc-list .loc-dist{
84
+ font-weight: bold;
85
+ font-style: italic;
86
+ color: #8e8e8e;
87
+ }
88
+
89
+ #loc-list li{
90
+ display: block;
91
+ clear: left;
92
+ float: left;
93
+ margin: 6px 10px;
94
+ cursor: pointer;
95
+ width: 200px;
96
+ border: 1px solid #fff; /* Adding this to prevent moving li elements when adding the list-focus class*/
97
+ }
98
+
99
+ #loc-list .list-focus{
100
+ border: 1px solid rgba(82,168,236,0.9);
101
+ -moz-box-shadow: 0 0 8px rgba(82,168,236,0.7);
102
+ -webkit-box-shadow: 0 0 8px rgba(82,168,236,0.7);
103
+ box-shadow: 0 0 8px rgba(82,168,236,0.7);
104
+ transition: border 0.2s linear 0s, box-shadow 0.2s linear 0s;
105
+ }
106
+
107
+ #map-container .loc-name{
108
+ color: #AD2118;
109
+ font-weight: bold;
110
+ }
111
+
112
+ #search-form{
113
+ clear: left;
114
+ float: left;
115
+ height: 60px;
116
+ }
117
+
118
+ #form-input{
119
+ float: left;
120
+ margin-top: 3px;
121
+ }
122
+
123
+ #form-input label{
124
+ font-weight: bold;
125
+ }
126
+
127
+ #form-input input{
128
+ padding: 4px;
129
+ line-height: 16px;
130
+ border: 1px solid #ccc;
131
+ }
132
+
133
+ #address{
134
+ margin: 0 0 0 10px;
135
+ }
136
+
137
+ #submit{
138
+ float: left;
139
+ cursor: pointer;
140
+ margin: 3px 0 0 10px;
141
+ padding: 3px 6px;
142
+ background: #ae2118;
143
+ border: 1px solid #961f17;
144
+ color: #fff;
145
+ -webkit-border-radius: 4px;
146
+ border-radius: 4px;
147
+ }
148
+
149
+ #loading-map{
150
+ float: left;
151
+ margin: 4px 0 0 10px;
152
+ width: 16px;
153
+ height: 16px;
154
+ background: url(../images/ajax-loader.gif) no-repeat;
155
+ }
156
+
157
+ #map{
158
+ float: left;
159
+ width: 635px;
160
+ height: 530px;
161
+ }
162
+
163
+ /* Infowindow Roboto font override */
164
+ .gm-style div, .gm-style span, .gm-style label, .gm-style a{
165
+ font-family: Arial, Helvetica, sans-serif;
166
+ }
167
+
168
+ /* Modal window */
169
+
170
+ #overlay{
171
+ position: fixed;
172
+ left: 0px;
173
+ top: 0px;
174
+ width:100%;
175
+ height:100%;
176
+ z-index: 10000;
177
+ background: url(../images/overlay-bg.png) repeat;
178
+ }
179
+
180
+ #modal-window{
181
+ position: absolute;
182
+ left: 50%;
183
+ margin-left: -460px; /* width divided by 2 */
184
+ margin-top: 60px;
185
+ width: 920px;
186
+ height: 590px;
187
+ z-index: 10010;
188
+ background: #fff;
189
+ border-radius: 10px;
190
+ box-shadow: 0 0 10px #656565;
191
+ }
192
+
193
+ #modal-content{
194
+ float: left;
195
+ padding: 0 22px; /* there's already a margin on the top of the map-container div */
196
+ }
197
+
198
+ #close-icon{
199
+ position: absolute;
200
+ top: -6px;
201
+ right: -6px;
202
+ width: 18px;
203
+ height: 18px;
204
+ cursor: pointer;
205
+ background: #2c2c2c url(../images/close-icon.png) 3px 3px no-repeat;
206
+ border: 1px solid #000;
207
+ border-radius: 3px;
208
+ box-shadow: 0 0 3px #656565;
209
+ }
210
+
211
+
212
+ /* The following is for the geocode page and not the store locator */
213
+
214
+ #geocode-result{
215
+ clear: left;
216
+ float: left;
217
+ margin-top: 30px;
218
+ width: 100%;
219
+ }
skin/frontend/default/default/storelocator/images/ajax-loader.gif ADDED
Binary file
skin/frontend/default/default/storelocator/images/close-icon.png ADDED
Binary file
skin/frontend/default/default/storelocator/images/marker/faddu.jpg ADDED
Binary file
skin/frontend/default/default/storelocator/images/overlay-bg.png ADDED
Binary file