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
- app/code/community/Magpedia/Storelocator/Block/Adminhtml/Storelocator.php +38 -0
- app/code/community/Magpedia/Storelocator/Block/Adminhtml/Storelocator/Edit.php +62 -0
- app/code/community/Magpedia/Storelocator/Block/Adminhtml/Storelocator/Edit/Form.php +43 -0
- app/code/community/Magpedia/Storelocator/Block/Adminhtml/Storelocator/Edit/Tab/Form.php +181 -0
- app/code/community/Magpedia/Storelocator/Block/Adminhtml/Storelocator/Edit/Tab/Stores.php +48 -0
- app/code/community/Magpedia/Storelocator/Block/Adminhtml/Storelocator/Edit/Tabs.php +58 -0
- app/code/community/Magpedia/Storelocator/Block/Adminhtml/Storelocator/Grid.php +211 -0
- app/code/community/Magpedia/Storelocator/Block/Adminhtml/Storelocator/Helper/Image.php +39 -0
- app/code/community/Magpedia/Storelocator/Block/Adminhtml/Storelocator/Image.php +12 -0
- app/code/community/Magpedia/Storelocator/Block/Storelocator/List.php +63 -0
- app/code/community/Magpedia/Storelocator/Block/Storelocator/View.php +34 -0
- app/code/community/Magpedia/Storelocator/Controller/Adminhtml/Storelocator.php +60 -0
- app/code/community/Magpedia/Storelocator/Helper/Data.php +34 -0
- app/code/community/Magpedia/Storelocator/Helper/Image/Abstract.php +461 -0
- app/code/community/Magpedia/Storelocator/Helper/Storelocator.php +34 -0
- app/code/community/Magpedia/Storelocator/Helper/Storelocator/Image.php +35 -0
- app/code/community/Magpedia/Storelocator/Model/Resource/Setup.php +26 -0
- app/code/community/Magpedia/Storelocator/Model/Resource/Storelocator.php +126 -0
- app/code/community/Magpedia/Storelocator/Model/Resource/Storelocator/Collection.php +116 -0
- app/code/community/Magpedia/Storelocator/Model/Storelocator.php +98 -0
- app/code/community/Magpedia/Storelocator/controllers/Adminhtml/Storelocator/StorelocatorController.php +270 -0
- app/code/community/Magpedia/Storelocator/controllers/StorelocatorController.php +183 -0
- app/code/community/Magpedia/Storelocator/etc/adminhtml.xml +63 -0
- app/code/community/Magpedia/Storelocator/etc/config.xml +138 -0
- app/code/community/Magpedia/Storelocator/etc/system.xml +101 -0
- app/code/community/Magpedia/Storelocator/etc/widget.xml +64 -0
- app/code/community/Magpedia/Storelocator/sql/magpedia_storelocator_setup/install-0.0.1.php +113 -0
- app/design/adminhtml/default/default/layout/magpedia_storelocator.xml +51 -0
- app/design/frontend/default/default/layout/magpedia_storelocator.xml +87 -0
- app/design/frontend/default/default/template/magpedia_storelocator/storelocator/list.phtml +61 -0
- app/design/frontend/default/default/template/magpedia_storelocator/storelocator/view.phtml +76 -0
- app/design/frontend/default/default/template/magpedia_storelocator/storelocator/widget/link.phtml +30 -0
- app/design/frontend/default/default/template/magpedia_storelocator/storelocator/widget/view.phtml +41 -0
- app/etc/modules/Magpedia_Storelocator.xml +29 -0
- js/storelocator/handlebars-1.0.0.min.js +214 -0
- js/storelocator/jquery-1.10.1.min.js +6 -0
- js/storelocator/jquery.storelocator.js +818 -0
- js/storelocator/noConflict.js +1 -0
- package.xml +56 -0
- skin/frontend/default/default/storelocator/css/map-style.css +1 -0
- skin/frontend/default/default/storelocator/css/map.css +219 -0
- skin/frontend/default/default/storelocator/images/ajax-loader.gif +0 -0
- skin/frontend/default/default/storelocator/images/close-icon.png +0 -0
- skin/frontend/default/default/storelocator/images/marker/faddu.jpg +0 -0
- 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}}&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={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"};var e=/[&<>"'`]/g;var p=/[&<>"'`]/;var t=function(i){return k[i]||"&";
|
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.
|
11 |
+

|
12 |
+
Features
|
13 |
+
• Ability to set default latitude/longitude
|
14 |
+

|
15 |
+
• Custom links in the header and footer
|
16 |
+

|
17 |
+
• Supports multiple page layouts(Listing of all stores and detail of a store)
|
18 |
+

|
19 |
+
• Multi Store enabled
|
20 |
+

|
21 |
+
• Map and Satellite views are supported
|
22 |
+

|
23 |
+
• To show images of the store in the locations list and on the map for easier navigation.
|
24 |
+
• Set the order of each store to be displayed in the frontend. Location according to sort order appears in frontend.
|
25 |
+

|
26 |
+
• Compatible with a variety of Community Editions, including 1.5.x.x, 1.6.x.x, 1.7.x.x, 1.8.x.x
|
27 |
+

|
28 |
+

|
29 |
+
Required Fields
|
30 |
+
Store Title
|
31 |
+
Country
|
32 |
+
City
|
33 |
+
Postal Code
|
34 |
+
Address
|
35 |
+
Latitude
|
36 |
+
Longitude
|
37 |
+
Store Views
|
38 |
+

|
39 |
+
Optional fields
|
40 |
+
Store Link
|
41 |
+
State
|
42 |
+
Email
|
43 |
+
Phone
|
44 |
+
Fax
|
45 |
+
Description
|
46 |
+
Store Image
|
47 |
+
Store Time
|
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
|