Version Notes
With the help of store locator your customer can easily find out your stores, dealers and products.
Download this release
Release Info
Developer | Sparx |
Extension | Sparx_Storelocator |
Version | 0.1.0 |
Comparing to | |
See all releases |
Version 0.1.0
- app/code/community/Sparx/Storelocator/Block/Adminhtml/Region.php +19 -0
- app/code/community/Sparx/Storelocator/Block/Adminhtml/Storelocator.php +12 -0
- app/code/community/Sparx/Storelocator/Block/Adminhtml/Storelocator/Edit.php +45 -0
- app/code/community/Sparx/Storelocator/Block/Adminhtml/Storelocator/Edit/Form.php +19 -0
- app/code/community/Sparx/Storelocator/Block/Adminhtml/Storelocator/Edit/Tab/Form.php +182 -0
- app/code/community/Sparx/Storelocator/Block/Adminhtml/Storelocator/Edit/Tabs.php +24 -0
- app/code/community/Sparx/Storelocator/Block/Adminhtml/Storelocator/Grid.php +167 -0
- app/code/community/Sparx/Storelocator/Block/Storelocator.php +17 -0
- app/code/community/Sparx/Storelocator/Helper/Data.php +90 -0
- app/code/community/Sparx/Storelocator/Model/Mysql4/Storelocator.php +21 -0
- app/code/community/Sparx/Storelocator/Model/Mysql4/Storelocator/Collection.php +10 -0
- app/code/community/Sparx/Storelocator/Model/Status.php +15 -0
- app/code/community/Sparx/Storelocator/Model/Storelocator.php +10 -0
- app/code/community/Sparx/Storelocator/controllers/Adminhtml/StorelocatorController.php +236 -0
- app/code/community/Sparx/Storelocator/controllers/IndexController.php +184 -0
- app/code/community/Sparx/Storelocator/controllers/IndexController.php~ +192 -0
- app/code/community/Sparx/Storelocator/etc/adminhtml.xml +51 -0
- app/code/community/Sparx/Storelocator/etc/config.xml +103 -0
- app/code/community/Sparx/Storelocator/etc/system.xml +91 -0
- app/code/community/Sparx/Storelocator/sql/storelocator_setup/mysql4-install-0.1.0.php +41 -0
- app/code/community/Sparx/Storelocator/sql/storelocator_setup/mysql4-upgrade-0.1.0-0.1.1.php +10 -0
- app/design/adminhtml/default/default/layout/storelocator.xml +47 -0
- app/design/adminhtml/default/default/template/storelocator/region.phtml +28 -0
- app/design/frontend/base/default/layout/storelocator.xml +63 -0
- app/design/frontend/base/default/template/storelocator/storedetail.phtml +47 -0
- app/design/frontend/base/default/template/storelocator/storelocator.phtml +51 -0
- app/etc/modules/Sparx_Storelocator.xml +10 -0
- media/storelocator/images/100X100/1398758372_logo.jpg +0 -0
- media/storelocator/images/110X120/1398758372_logo.jpg +0 -0
- media/storelocator/images/1398758372_logo.jpg +0 -0
- media/storelocator/images/175X120/1398758372_logo.jpg +0 -0
- media/storelocator/images/175X175/1398758372_logo.jpg +0 -0
- media/storelocator/images/250X120/1398758372_logo.jpg +0 -0
- media/storelocator/images/logo.jpg +0 -0
- package.xml +18 -0
- skin/frontend/base/default/storelocator/a.js~ +0 -0
- skin/frontend/base/default/storelocator/css/map-style.css +1 -0
- skin/frontend/base/default/storelocator/css/map-style.less +220 -0
- skin/frontend/base/default/storelocator/css/map.css +250 -0
- skin/frontend/base/default/storelocator/css/mapbackup.css +244 -0
- skin/frontend/base/default/storelocator/jquery.storelocator.js~ +815 -0
- skin/frontend/base/default/storelocator/js/handlebars-1.0.0.min.js +214 -0
- skin/frontend/base/default/storelocator/js/jquery-1.10.1.min.js +6 -0
- skin/frontend/base/default/storelocator/js/jquery.storelocator.js +819 -0
- skin/frontend/base/default/storelocator/js/jquery.storelocator_1.js +818 -0
- skin/frontend/base/default/storelocator/js/noConflict.js +1 -0
app/code/community/Sparx/Storelocator/Block/Adminhtml/Region.php
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Sparx_Storelocator_Block_Adminhtml_Region extends Mage_Core_Block_Template
|
3 |
+
{
|
4 |
+
|
5 |
+
/**
|
6 |
+
* @return Store Data Object by store id
|
7 |
+
*/
|
8 |
+
public function getStoreCollection()
|
9 |
+
{
|
10 |
+
$collection = null;
|
11 |
+
$id = $this->getRequest()->getParam('id');
|
12 |
+
if($id)
|
13 |
+
{
|
14 |
+
$collection = Mage::getModel('storelocator/storelocator')->load($id);
|
15 |
+
}
|
16 |
+
return $collection;
|
17 |
+
}
|
18 |
+
}
|
19 |
+
?>
|
app/code/community/Sparx/Storelocator/Block/Adminhtml/Storelocator.php
ADDED
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Sparx_Storelocator_Block_Adminhtml_Storelocator extends Mage_Adminhtml_Block_Widget_Grid_Container
|
3 |
+
{
|
4 |
+
public function __construct()
|
5 |
+
{
|
6 |
+
$this->_controller = 'adminhtml_storelocator';
|
7 |
+
$this->_blockGroup = 'storelocator';
|
8 |
+
$this->_headerText = Mage::helper('storelocator')->__('Store Manager');
|
9 |
+
$this->_addButtonLabel = Mage::helper('storelocator')->__('Add New Store');
|
10 |
+
parent::__construct();
|
11 |
+
}
|
12 |
+
}
|
app/code/community/Sparx/Storelocator/Block/Adminhtml/Storelocator/Edit.php
ADDED
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class Sparx_Storelocator_Block_Adminhtml_Storelocator_Edit extends Mage_Adminhtml_Block_Widget_Form_Container
|
4 |
+
{
|
5 |
+
public function __construct()
|
6 |
+
{
|
7 |
+
parent::__construct();
|
8 |
+
|
9 |
+
$this->_objectId = 'id';
|
10 |
+
$this->_blockGroup = 'storelocator';
|
11 |
+
$this->_controller = 'adminhtml_storelocator';
|
12 |
+
|
13 |
+
$this->_updateButton('save', 'label', Mage::helper('storelocator')->__('Save Store'));
|
14 |
+
$this->_updateButton('delete', 'label', Mage::helper('storelocator')->__('Delete Store'));
|
15 |
+
|
16 |
+
$this->_addButton('saveandcontinue', array(
|
17 |
+
'label' => Mage::helper('adminhtml')->__('Save And Continue Edit'),
|
18 |
+
'onclick' => 'saveAndContinueEdit()',
|
19 |
+
'class' => 'save',
|
20 |
+
), -100);
|
21 |
+
|
22 |
+
$this->_formScripts[] = "
|
23 |
+
function toggleEditor() {
|
24 |
+
if (tinyMCE.getInstanceById('storelocator_content') == null) {
|
25 |
+
tinyMCE.execCommand('mceAddControl', false, 'storelocator_content');
|
26 |
+
} else {
|
27 |
+
tinyMCE.execCommand('mceRemoveControl', false, 'storelocator_content');
|
28 |
+
}
|
29 |
+
}
|
30 |
+
|
31 |
+
function saveAndContinueEdit(){
|
32 |
+
editForm.submit($('edit_form').action+'back/edit/');
|
33 |
+
}
|
34 |
+
";
|
35 |
+
}
|
36 |
+
|
37 |
+
public function getHeaderText()
|
38 |
+
{
|
39 |
+
if( Mage::registry('storelocator_data') && Mage::registry('storelocator_data')->getId() ) {
|
40 |
+
return Mage::helper('storelocator')->__("Edit Store '%s'", $this->htmlEscape(Mage::registry('storelocator_data')->getName()));
|
41 |
+
} else {
|
42 |
+
return Mage::helper('storelocator')->__('Add Store');
|
43 |
+
}
|
44 |
+
}
|
45 |
+
}
|
app/code/community/Sparx/Storelocator/Block/Adminhtml/Storelocator/Edit/Form.php
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class Sparx_Storelocator_Block_Adminhtml_Storelocator_Edit_Form extends Mage_Adminhtml_Block_Widget_Form
|
4 |
+
{
|
5 |
+
protected function _prepareForm()
|
6 |
+
{
|
7 |
+
$form = new Varien_Data_Form(array(
|
8 |
+
'id' => 'edit_form',
|
9 |
+
'action' => $this->getUrl('*/*/save', array('id' => $this->getRequest()->getParam('id'))),
|
10 |
+
'method' => 'post',
|
11 |
+
'enctype' => 'multipart/form-data'
|
12 |
+
)
|
13 |
+
);
|
14 |
+
|
15 |
+
$form->setUseContainer(true);
|
16 |
+
$this->setForm($form);
|
17 |
+
return parent::_prepareForm();
|
18 |
+
}
|
19 |
+
}
|
app/code/community/Sparx/Storelocator/Block/Adminhtml/Storelocator/Edit/Tab/Form.php
ADDED
@@ -0,0 +1,182 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class Sparx_Storelocator_Block_Adminhtml_Storelocator_Edit_Tab_Form extends Mage_Adminhtml_Block_Widget_Form
|
4 |
+
{
|
5 |
+
protected function _prepareForm()
|
6 |
+
{
|
7 |
+
$form = new Varien_Data_Form();
|
8 |
+
$this->setForm($form);
|
9 |
+
if ( Mage::getSingleton('adminhtml/session')->getStorelocatorData() )
|
10 |
+
{
|
11 |
+
$data = Mage::getSingleton('adminhtml/session')->getStorelocatorData();
|
12 |
+
} elseif ( Mage::registry('storelocator_data') ) {
|
13 |
+
$data = Mage::registry('storelocator_data')->getData();
|
14 |
+
}
|
15 |
+
$storelocatorobj = Mage::getModel('storelocator/storelocator')->load($this->getRequest()->getParam('id'));
|
16 |
+
|
17 |
+
$fieldset = $form->addFieldset('storelocator_form', array('legend'=>Mage::helper('storelocator')->__('Store Information')));
|
18 |
+
|
19 |
+
$fieldset->addField('name', 'text', array(
|
20 |
+
'label' => Mage::helper('storelocator')->__('Store Name'),
|
21 |
+
'class' => 'required-entry',
|
22 |
+
'required' => true,
|
23 |
+
'name' => 'name',
|
24 |
+
));
|
25 |
+
|
26 |
+
if($storelocatorobj && $storelocatorobj->getId() && $storelocatorobj['storeimage']){
|
27 |
+
$imgPath = $this->helper('storelocator')->getImagepath().$storelocatorobj['storeimage'];
|
28 |
+
$fieldset->addField('image', 'label', array(
|
29 |
+
'label' => Mage::helper('storelocator')->__('Store Image'),
|
30 |
+
'name' =>'image',
|
31 |
+
'value' => $imgPath,
|
32 |
+
'after_element_html' => '<img src="'.$imgPath .'" alt=" '. $imgPath .'" height="120" width="120" />',
|
33 |
+
));
|
34 |
+
}
|
35 |
+
if(isset($data['storeimage']) && $data['storeimage']){
|
36 |
+
$data['storeimage'] = 'storelocator/images/' . $data['storeimage'];
|
37 |
+
}
|
38 |
+
if($storelocatorobj && $storelocatorobj->getId() && $storelocatorobj['storeimage']){
|
39 |
+
$fieldset->addField('storeimage', 'image', array(
|
40 |
+
'label' => Mage::helper('storelocator')->__('Change Store Image'),
|
41 |
+
'note' => 'Store Image shown on map',
|
42 |
+
'name' => 'storeimage',
|
43 |
+
));
|
44 |
+
}else{
|
45 |
+
$fieldset->addField('storeimage', 'image', array(
|
46 |
+
'label' => Mage::helper('storelocator')->__('Choose Store Image'),
|
47 |
+
'note' => 'Store Image shown on map',
|
48 |
+
'name' => 'storeimage',
|
49 |
+
));
|
50 |
+
}
|
51 |
+
|
52 |
+
$fieldset->addField('longitude', 'text', array(
|
53 |
+
'label' => Mage::helper('storelocator')->__('Store Longitude'),
|
54 |
+
'name' => 'longitude',
|
55 |
+
'required' => true,
|
56 |
+
'class' => 'required-entry',
|
57 |
+
));
|
58 |
+
|
59 |
+
$fieldset->addField('latitude', 'text', array(
|
60 |
+
'label' => Mage::helper('storelocator')->__('Store Latitude'),
|
61 |
+
'name' => 'latitude',
|
62 |
+
'required' => true,
|
63 |
+
'class' => 'required-entry',
|
64 |
+
));
|
65 |
+
|
66 |
+
$fieldset->addField('zoom_level', 'text', array(
|
67 |
+
'label' => Mage::helper('storelocator')->__('Zoom Level'),
|
68 |
+
'name' => 'zoom_level',
|
69 |
+
));
|
70 |
+
|
71 |
+
$fieldset->addField('address', 'text', array(
|
72 |
+
'label' => Mage::helper('storelocator')->__('Address'),
|
73 |
+
'name' => 'address',
|
74 |
+
'required' => true,
|
75 |
+
'class' => 'required-entry',
|
76 |
+
));
|
77 |
+
$fieldset->addField('city', 'text', array(
|
78 |
+
'label' => Mage::helper('storelocator')->__('City'),
|
79 |
+
'name' => 'city',
|
80 |
+
'required' => true,
|
81 |
+
'class' => 'required-entry',
|
82 |
+
));
|
83 |
+
|
84 |
+
|
85 |
+
$fieldset->addField('country', 'select', array(
|
86 |
+
'label' => Mage::helper('storelocator')->__('Country'),
|
87 |
+
'class' => 'required-entry',
|
88 |
+
'required' => true,
|
89 |
+
'name' => 'country',
|
90 |
+
'values' => Mage::helper('storelocator')->getCountryOptions(),
|
91 |
+
));
|
92 |
+
|
93 |
+
$fieldset->addField('stateEL', 'note', array(
|
94 |
+
'label' => Mage::helper('storelocator')->__('State / Province'),
|
95 |
+
'name' => 'stateEL',
|
96 |
+
'text' => $this->getLayout()->createBlock('storelocator/adminhtml_region')->setTemplate('storelocator/region.phtml')->toHtml(),
|
97 |
+
));
|
98 |
+
|
99 |
+
$fieldset->addField('zipcode', 'text', array(
|
100 |
+
'label' => Mage::helper('storelocator')->__('Zip Code'),
|
101 |
+
'name' => 'zipcode',
|
102 |
+
'required' => true,
|
103 |
+
'class' => 'required-entry',
|
104 |
+
));
|
105 |
+
|
106 |
+
$fieldset->addField('phone', 'text', array(
|
107 |
+
'label' => Mage::helper('storelocator')->__('Telephone'),
|
108 |
+
'name' => 'phone',
|
109 |
+
));
|
110 |
+
|
111 |
+
// $fieldset->addField('fax', 'text', array(
|
112 |
+
// 'label' => Mage::helper('storelocator')->__('Fax'),
|
113 |
+
// 'name' => 'fax',
|
114 |
+
// ));
|
115 |
+
|
116 |
+
$fieldset->addField('email', 'text', array(
|
117 |
+
'label' => Mage::helper('storelocator')->__('Email'),
|
118 |
+
'name' => 'email',
|
119 |
+
));
|
120 |
+
|
121 |
+
$fieldset->addField('web_url', 'text', array(
|
122 |
+
'label' => Mage::helper('storelocator')->__('Website Url'),
|
123 |
+
'name' => 'web_url',
|
124 |
+
'required' => false,
|
125 |
+
));
|
126 |
+
|
127 |
+
$fieldset->addField('hours1', 'text', array(
|
128 |
+
'label' => Mage::helper('storelocator')->__('Time Duration 1'),
|
129 |
+
'name' => 'hours1',
|
130 |
+
));
|
131 |
+
|
132 |
+
$fieldset->addField('hours2', 'text', array(
|
133 |
+
'label' => Mage::helper('storelocator')->__('Time Duration 2'),
|
134 |
+
'name' => 'hours2',
|
135 |
+
));
|
136 |
+
|
137 |
+
$fieldset->addField('hours3', 'text', array(
|
138 |
+
'label' => Mage::helper('storelocator')->__('Time Duration 3'),
|
139 |
+
'name' => 'hours3',
|
140 |
+
));
|
141 |
+
|
142 |
+
$fieldset->addField('description', 'editor', array(
|
143 |
+
'name' => 'description',
|
144 |
+
'label' => Mage::helper('storelocator')->__('Description'),
|
145 |
+
'title' => Mage::helper('storelocator')->__('Description'),
|
146 |
+
'style' => 'width:500px; height:250px;',
|
147 |
+
'wysiwyg' => true,
|
148 |
+
'required' => false,
|
149 |
+
));
|
150 |
+
|
151 |
+
// $fieldset->addField('sortorder', 'text', array(
|
152 |
+
// 'label' => Mage::helper('storelocator')->__('Sort Order'),
|
153 |
+
// 'name' => 'sortorder',
|
154 |
+
// ));
|
155 |
+
|
156 |
+
$fieldset->addField('status', 'select', array(
|
157 |
+
'label' => Mage::helper('storelocator')->__('Status'),
|
158 |
+
'name' => 'status',
|
159 |
+
'values' => array(
|
160 |
+
array(
|
161 |
+
'value' => 1,
|
162 |
+
'label' => Mage::helper('storelocator')->__('Enabled'),
|
163 |
+
),
|
164 |
+
|
165 |
+
array(
|
166 |
+
'value' => 2,
|
167 |
+
'label' => Mage::helper('storelocator')->__('Disabled'),
|
168 |
+
),
|
169 |
+
),
|
170 |
+
));
|
171 |
+
|
172 |
+
|
173 |
+
if ( Mage::getSingleton('adminhtml/session')->getStorelocatorData() )
|
174 |
+
{
|
175 |
+
$form->setValues(Mage::getSingleton('adminhtml/session')->getStorelocatorData());
|
176 |
+
Mage::getSingleton('adminhtml/session')->setStorelocatorData(null);
|
177 |
+
} elseif ( Mage::registry('storelocator_data') ) {
|
178 |
+
$form->setValues(Mage::registry('storelocator_data')->getData());
|
179 |
+
}
|
180 |
+
return parent::_prepareForm();
|
181 |
+
}
|
182 |
+
}
|
app/code/community/Sparx/Storelocator/Block/Adminhtml/Storelocator/Edit/Tabs.php
ADDED
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class Sparx_Storelocator_Block_Adminhtml_Storelocator_Edit_Tabs extends Mage_Adminhtml_Block_Widget_Tabs
|
4 |
+
{
|
5 |
+
|
6 |
+
public function __construct()
|
7 |
+
{
|
8 |
+
parent::__construct();
|
9 |
+
$this->setId('storelocator_tabs');
|
10 |
+
$this->setDestElementId('edit_form');
|
11 |
+
$this->setTitle(Mage::helper('storelocator')->__('Store Information'));
|
12 |
+
}
|
13 |
+
|
14 |
+
protected function _beforeToHtml()
|
15 |
+
{
|
16 |
+
$this->addTab('form_section', array(
|
17 |
+
'label' => Mage::helper('storelocator')->__('Store Information'),
|
18 |
+
'title' => Mage::helper('storelocator')->__('Store Information'),
|
19 |
+
'content' => $this->getLayout()->createBlock('storelocator/adminhtml_storelocator_edit_tab_form')->toHtml(),
|
20 |
+
));
|
21 |
+
|
22 |
+
return parent::_beforeToHtml();
|
23 |
+
}
|
24 |
+
}
|
app/code/community/Sparx/Storelocator/Block/Adminhtml/Storelocator/Grid.php
ADDED
@@ -0,0 +1,167 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class Sparx_Storelocator_Block_Adminhtml_Storelocator_Grid extends Mage_Adminhtml_Block_Widget_Grid
|
4 |
+
{
|
5 |
+
public function __construct()
|
6 |
+
{
|
7 |
+
parent::__construct();
|
8 |
+
$this->setId('storelocatorGrid');
|
9 |
+
$this->setDefaultSort('storelocator_id');
|
10 |
+
$this->setDefaultDir('ASC');
|
11 |
+
$this->setSaveParametersInSession(true);
|
12 |
+
}
|
13 |
+
|
14 |
+
protected function _prepareCollection()
|
15 |
+
{
|
16 |
+
$collection = Mage::getModel('storelocator/storelocator')->getCollection();
|
17 |
+
$this->setCollection($collection);
|
18 |
+
return parent::_prepareCollection();
|
19 |
+
}
|
20 |
+
|
21 |
+
protected function _prepareColumns()
|
22 |
+
{
|
23 |
+
$this->addColumn('storelocator_id', array(
|
24 |
+
'header' => Mage::helper('storelocator')->__('ID'),
|
25 |
+
'align' =>'right',
|
26 |
+
'width' => '50px',
|
27 |
+
'index' => 'storelocator_id',
|
28 |
+
));
|
29 |
+
|
30 |
+
$this->addColumn('name', array(
|
31 |
+
'header' => Mage::helper('storelocator')->__('Store Name'),
|
32 |
+
'align' =>'left',
|
33 |
+
'index' => 'name',
|
34 |
+
'width' => '150px'
|
35 |
+
));
|
36 |
+
|
37 |
+
$this->addColumn('longitude', array(
|
38 |
+
'header' => Mage::helper('storelocator')->__('Longitude'),
|
39 |
+
'width' => '250px',
|
40 |
+
'index' => 'longitude',
|
41 |
+
));
|
42 |
+
|
43 |
+
$this->addColumn('latitude', array(
|
44 |
+
'header' => Mage::helper('storelocator')->__('latitude'),
|
45 |
+
'width' => '250px',
|
46 |
+
'index' => 'latitude',
|
47 |
+
));
|
48 |
+
|
49 |
+
$this->addColumn('address', array(
|
50 |
+
'header' => Mage::helper('storelocator')->__('Address'),
|
51 |
+
'width' => '250px',
|
52 |
+
'index' => 'address',
|
53 |
+
));
|
54 |
+
|
55 |
+
$this->addColumn('city', array(
|
56 |
+
'header' => Mage::helper('storelocator')->__('City'),
|
57 |
+
'width' => '130px',
|
58 |
+
'index' => 'city',
|
59 |
+
));
|
60 |
+
|
61 |
+
$this->addColumn('state', array(
|
62 |
+
'header' => Mage::helper('storelocator')->__('State/Province'),
|
63 |
+
'width' => '130px',
|
64 |
+
'index' => 'state',
|
65 |
+
));
|
66 |
+
|
67 |
+
$this->addColumn('country', array(
|
68 |
+
'header' => Mage::helper('storelocator')->__('Country'),
|
69 |
+
'width' => '130px',
|
70 |
+
'index' => 'country',
|
71 |
+
'type' => 'options',
|
72 |
+
'options' => Mage::helper('storelocator')->getCountrieslist(),
|
73 |
+
));
|
74 |
+
|
75 |
+
$this->addColumn('zipcode', array(
|
76 |
+
'header' => Mage::helper('storelocator')->__('Zip Code'),
|
77 |
+
'width' => '130px',
|
78 |
+
'index' => 'zipcode',
|
79 |
+
));
|
80 |
+
|
81 |
+
$this->addColumn('web_url', array(
|
82 |
+
'header' => Mage::helper('storelocator')->__('Website Url'),
|
83 |
+
'width' => '130px',
|
84 |
+
'index' => 'web_url',
|
85 |
+
));
|
86 |
+
|
87 |
+
/*
|
88 |
+
$this->addColumn('content', array(
|
89 |
+
'header' => Mage::helper('storelocator')->__('Item Content'),
|
90 |
+
'width' => '150px',
|
91 |
+
'index' => 'content',
|
92 |
+
));
|
93 |
+
*/
|
94 |
+
|
95 |
+
$this->addColumn('status', array(
|
96 |
+
'header' => Mage::helper('storelocator')->__('Status'),
|
97 |
+
'align' => 'left',
|
98 |
+
'width' => '80px',
|
99 |
+
'index' => 'status',
|
100 |
+
'type' => 'options',
|
101 |
+
'options' => array(
|
102 |
+
1 => 'Enabled',
|
103 |
+
2 => 'Disabled',
|
104 |
+
),
|
105 |
+
));
|
106 |
+
|
107 |
+
$this->addColumn('action',
|
108 |
+
array(
|
109 |
+
'header' => Mage::helper('storelocator')->__('Action'),
|
110 |
+
'width' => '100',
|
111 |
+
'type' => 'action',
|
112 |
+
'getter' => 'getId',
|
113 |
+
'actions' => array(
|
114 |
+
array(
|
115 |
+
'caption' => Mage::helper('storelocator')->__('Edit'),
|
116 |
+
'url' => array('base'=> '*/*/edit'),
|
117 |
+
'field' => 'id'
|
118 |
+
)
|
119 |
+
),
|
120 |
+
'filter' => false,
|
121 |
+
'sortable' => false,
|
122 |
+
'index' => 'stores',
|
123 |
+
'is_system' => true,
|
124 |
+
));
|
125 |
+
|
126 |
+
$this->addExportType('*/*/exportCsv', Mage::helper('storelocator')->__('CSV'));
|
127 |
+
$this->addExportType('*/*/exportXml', Mage::helper('storelocator')->__('XML'));
|
128 |
+
|
129 |
+
return parent::_prepareColumns();
|
130 |
+
}
|
131 |
+
|
132 |
+
protected function _prepareMassaction()
|
133 |
+
{
|
134 |
+
$this->setMassactionIdField('storelocator_id');
|
135 |
+
$this->getMassactionBlock()->setFormFieldName('storelocator');
|
136 |
+
|
137 |
+
$this->getMassactionBlock()->addItem('delete', array(
|
138 |
+
'label' => Mage::helper('storelocator')->__('Delete'),
|
139 |
+
'url' => $this->getUrl('*/*/massDelete'),
|
140 |
+
'confirm' => Mage::helper('storelocator')->__('Are you sure?')
|
141 |
+
));
|
142 |
+
|
143 |
+
$statuses = Mage::getSingleton('storelocator/status')->getOptionArray();
|
144 |
+
|
145 |
+
array_unshift($statuses, array('label'=>'', 'value'=>''));
|
146 |
+
$this->getMassactionBlock()->addItem('status', array(
|
147 |
+
'label'=> Mage::helper('storelocator')->__('Change status'),
|
148 |
+
'url' => $this->getUrl('*/*/massStatus', array('_current'=>true)),
|
149 |
+
'additional' => array(
|
150 |
+
'visibility' => array(
|
151 |
+
'name' => 'status',
|
152 |
+
'type' => 'select',
|
153 |
+
'class' => 'required-entry',
|
154 |
+
'label' => Mage::helper('storelocator')->__('Status'),
|
155 |
+
'values' => $statuses
|
156 |
+
)
|
157 |
+
)
|
158 |
+
));
|
159 |
+
return $this;
|
160 |
+
}
|
161 |
+
|
162 |
+
public function getRowUrl($row)
|
163 |
+
{
|
164 |
+
return $this->getUrl('*/*/edit', array('id' => $row->getId()));
|
165 |
+
}
|
166 |
+
|
167 |
+
}
|
app/code/community/Sparx/Storelocator/Block/Storelocator.php
ADDED
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Sparx_Storelocator_Block_Storelocator extends Mage_Core_Block_Template
|
3 |
+
{
|
4 |
+
public function _prepareLayout()
|
5 |
+
{
|
6 |
+
return parent::_prepareLayout();
|
7 |
+
}
|
8 |
+
|
9 |
+
public function getStorelocator()
|
10 |
+
{
|
11 |
+
if (!$this->hasData('storelocator')) {
|
12 |
+
$this->setData('storelocator', Mage::registry('storelocator'));
|
13 |
+
}
|
14 |
+
return $this->getData('storelocator');
|
15 |
+
|
16 |
+
}
|
17 |
+
}
|
app/code/community/Sparx/Storelocator/Helper/Data.php
ADDED
@@ -0,0 +1,90 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class Sparx_Storelocator_Helper_Data extends Mage_Core_Helper_Abstract {
|
4 |
+
|
5 |
+
const storezoomLevel = 6;
|
6 |
+
/*
|
7 |
+
* Check config value for Enable
|
8 |
+
*/
|
9 |
+
public function checkEnableSetting() {
|
10 |
+
return Mage::getStoreConfig('storelocator/settings/active');
|
11 |
+
}
|
12 |
+
|
13 |
+
/*
|
14 |
+
*@param $country_id
|
15 |
+
* @return Country name by Id
|
16 |
+
*/
|
17 |
+
public function getCountryNameById($country_id) {
|
18 |
+
$countryName = Mage::getModel('directory/country')->load($country_id)->getName();
|
19 |
+
return $countryName;
|
20 |
+
}
|
21 |
+
|
22 |
+
/**
|
23 |
+
*@return Array of all countries name with id
|
24 |
+
*/
|
25 |
+
public function getCountrieslist() {
|
26 |
+
$countries = array();
|
27 |
+
|
28 |
+
$countrycoll = Mage::getResourceModel('directory/country_collection')->loadByStore();
|
29 |
+
|
30 |
+
if (count($countrycoll)) {
|
31 |
+
foreach ($countrycoll as $country) {
|
32 |
+
$countries[$country->getId()] = $country->getName();
|
33 |
+
}
|
34 |
+
}
|
35 |
+
|
36 |
+
return $countries;
|
37 |
+
}
|
38 |
+
|
39 |
+
/**
|
40 |
+
* @ return Country List as Options
|
41 |
+
*/
|
42 |
+
public function getCountryOptions() {
|
43 |
+
$countryarr = array();
|
44 |
+
$cntrycoll = Mage::getResourceModel('directory/country_collection')->loadByStore();
|
45 |
+
if (count($cntrycoll)) {
|
46 |
+
foreach ($cntrycoll as $cntry) {
|
47 |
+
$countryarr[] = array('value' => $cntry->getId(), 'label' => $cntry->getName());
|
48 |
+
}
|
49 |
+
}
|
50 |
+
|
51 |
+
return $countryarr;
|
52 |
+
}
|
53 |
+
|
54 |
+
/**
|
55 |
+
*@return Store Image File Path
|
56 |
+
*/
|
57 |
+
public function getImagepath() {
|
58 |
+
$path = Mage::getBaseUrl('media') . "storelocator/images/";
|
59 |
+
return $path;
|
60 |
+
}
|
61 |
+
|
62 |
+
/**
|
63 |
+
* @return storelocator page Url
|
64 |
+
*/
|
65 |
+
public function getStorelocatorUrl() {
|
66 |
+
return $this->_getUrl('storelocator/index');
|
67 |
+
}
|
68 |
+
|
69 |
+
/**
|
70 |
+
* @return storelocator page Url
|
71 |
+
*/
|
72 |
+
public function getDetailpageUrl($id=null) {
|
73 |
+
|
74 |
+
return $this->_getUrl('storelocator/index/detail', array('id'=>$id));
|
75 |
+
}
|
76 |
+
|
77 |
+
/**
|
78 |
+
* @param $id
|
79 |
+
* @return store Description by loading store
|
80 |
+
*/
|
81 |
+
public function getStoreDescription($id) {
|
82 |
+
$description = '';
|
83 |
+
$storeData = Mage::getModel('storelocator/storelocator')->load($id);
|
84 |
+
if($storeData && $storeData->getId()){
|
85 |
+
$description = $storeData->getDescription();
|
86 |
+
}
|
87 |
+
return $description;
|
88 |
+
}
|
89 |
+
|
90 |
+
}
|
app/code/community/Sparx/Storelocator/Model/Mysql4/Storelocator.php
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class Sparx_Storelocator_Model_Mysql4_Storelocator extends Mage_Core_Model_Mysql4_Abstract
|
4 |
+
{
|
5 |
+
public function _construct()
|
6 |
+
{
|
7 |
+
// Note that the storelocator_id refers to the key field in your database table.
|
8 |
+
$this->_init('storelocator/storelocator', 'storelocator_id');
|
9 |
+
}
|
10 |
+
|
11 |
+
/**
|
12 |
+
*
|
13 |
+
* @param type $zipcode
|
14 |
+
* @return type store collection
|
15 |
+
*/
|
16 |
+
public function getSearchResult($zipcode){
|
17 |
+
$where = "status=1 AND ((zipcode like '%".$zipcode."%') OR (city like '%".$zipcode."%') OR (name like '%".$zipcode."%') OR (state like '%".$zipcode."%') OR (phone like '%".$zipcode."%') OR (country like '%".$zipcode."%'))";
|
18 |
+
$sql = $this->_getReadAdapter()->select()->from($this->getMainTable())->where($where);
|
19 |
+
return $this->_getReadAdapter()->fetchAll($sql);
|
20 |
+
}
|
21 |
+
}
|
app/code/community/Sparx/Storelocator/Model/Mysql4/Storelocator/Collection.php
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class Sparx_Storelocator_Model_Mysql4_Storelocator_Collection extends Mage_Core_Model_Mysql4_Collection_Abstract
|
4 |
+
{
|
5 |
+
public function _construct()
|
6 |
+
{
|
7 |
+
parent::_construct();
|
8 |
+
$this->_init('storelocator/storelocator');
|
9 |
+
}
|
10 |
+
}
|
app/code/community/Sparx/Storelocator/Model/Status.php
ADDED
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class Sparx_Storelocator_Model_Status extends Varien_Object
|
4 |
+
{
|
5 |
+
const STATUS_ENABLED = 1;
|
6 |
+
const STATUS_DISABLED = 2;
|
7 |
+
|
8 |
+
static public function getOptionArray()
|
9 |
+
{
|
10 |
+
return array(
|
11 |
+
self::STATUS_ENABLED => Mage::helper('storelocator')->__('Enabled'),
|
12 |
+
self::STATUS_DISABLED => Mage::helper('storelocator')->__('Disabled')
|
13 |
+
);
|
14 |
+
}
|
15 |
+
}
|
app/code/community/Sparx/Storelocator/Model/Storelocator.php
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class Sparx_Storelocator_Model_Storelocator extends Mage_Core_Model_Abstract
|
4 |
+
{
|
5 |
+
public function _construct()
|
6 |
+
{
|
7 |
+
parent::_construct();
|
8 |
+
$this->_init('storelocator/storelocator');
|
9 |
+
}
|
10 |
+
}
|
app/code/community/Sparx/Storelocator/controllers/Adminhtml/StorelocatorController.php
ADDED
@@ -0,0 +1,236 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class Sparx_Storelocator_Adminhtml_StorelocatorController extends Mage_Adminhtml_Controller_action
|
4 |
+
{
|
5 |
+
protected function _initAction() {
|
6 |
+
$this->loadLayout()
|
7 |
+
->_setActiveMenu('storelocator/items')
|
8 |
+
->_addBreadcrumb(Mage::helper('adminhtml')->__('Store Manager'), Mage::helper('adminhtml')->__('Store Manager'));
|
9 |
+
|
10 |
+
return $this;
|
11 |
+
}
|
12 |
+
|
13 |
+
public function indexAction() {
|
14 |
+
$this->_initAction()
|
15 |
+
->renderLayout();
|
16 |
+
}
|
17 |
+
|
18 |
+
public function editAction() {
|
19 |
+
$id = $this->getRequest()->getParam('id');
|
20 |
+
$model = Mage::getModel('storelocator/storelocator')->load($id);
|
21 |
+
|
22 |
+
if ($model->getId() || $id == 0) {
|
23 |
+
$data = Mage::getSingleton('adminhtml/session')->getFormData(true);
|
24 |
+
if (!empty($data)) {
|
25 |
+
$model->setData($data);
|
26 |
+
}
|
27 |
+
|
28 |
+
Mage::register('storelocator_data', $model);
|
29 |
+
|
30 |
+
$this->loadLayout();
|
31 |
+
$this->_setActiveMenu('storelocator/items');
|
32 |
+
|
33 |
+
$this->_addBreadcrumb(Mage::helper('adminhtml')->__('Store Manager'), Mage::helper('adminhtml')->__('Store Manager'));
|
34 |
+
$this->_addBreadcrumb(Mage::helper('adminhtml')->__('Store News'), Mage::helper('adminhtml')->__('Store News'));
|
35 |
+
|
36 |
+
$this->getLayout()->getBlock('head')
|
37 |
+
->setCanLoadExtJs(true)
|
38 |
+
->setCanLoadTinyMce(true);
|
39 |
+
|
40 |
+
$this->_addContent($this->getLayout()->createBlock('storelocator/adminhtml_storelocator_edit'))
|
41 |
+
->_addLeft($this->getLayout()->createBlock('storelocator/adminhtml_storelocator_edit_tabs'));
|
42 |
+
|
43 |
+
$this->renderLayout();
|
44 |
+
} else {
|
45 |
+
Mage::getSingleton('adminhtml/session')->addError(Mage::helper('storelocator')->__('Store does not exist'));
|
46 |
+
$this->_redirect('*/*/');
|
47 |
+
}
|
48 |
+
}
|
49 |
+
|
50 |
+
public function newAction() {
|
51 |
+
$this->_forward('edit');
|
52 |
+
}
|
53 |
+
|
54 |
+
public function saveAction() {
|
55 |
+
if ($data = $this->getRequest()->getPost()) {
|
56 |
+
$id = $this->getRequest()->getParam('id');
|
57 |
+
$storemodel = Mage::getModel('storelocator/storelocator');
|
58 |
+
if(isset($data['state_id'])){
|
59 |
+
$state = Mage::getModel('directory/region')->load($data['state_id']);
|
60 |
+
$data['state'] = $state->getName();
|
61 |
+
}
|
62 |
+
|
63 |
+
if(!$data['zoom_level']){
|
64 |
+
$data['zoom_level'] = Sparx_Storelocator_Helper_Data::storezoomLevel;
|
65 |
+
}
|
66 |
+
|
67 |
+
if(isset($data['storeimage'])){
|
68 |
+
if(isset($data['storeimage']['delete'])){
|
69 |
+
$deleteimg = 1;
|
70 |
+
$data['storeimage'] = '';
|
71 |
+
}else{
|
72 |
+
// $imageData = explode('/',$data['storeimage']['value']);
|
73 |
+
$data['storeimage'] = $data['storeimage']['value'];
|
74 |
+
}
|
75 |
+
}
|
76 |
+
if(isset($_FILES['storeimage']['name']) && $_FILES['storeimage']['name'] != '') {
|
77 |
+
try {
|
78 |
+
/* Starting upload */
|
79 |
+
$uploader = new Varien_File_Uploader('storeimage');
|
80 |
+
|
81 |
+
// Any extention would work
|
82 |
+
$uploader->setAllowedExtensions(array('jpg','jpeg','gif','png'));
|
83 |
+
$uploader->setAllowRenameFiles(false);
|
84 |
+
|
85 |
+
// Set the file upload mode
|
86 |
+
// false -> get the file directly in the specified folder
|
87 |
+
// true -> get the file in the product like folders
|
88 |
+
// (file.jpg will go in something like /media/f/i/file.jpg)
|
89 |
+
$uploader->setFilesDispersion(false);
|
90 |
+
|
91 |
+
// We set media as the upload dir
|
92 |
+
$path = Mage::getBaseDir('media') . DS . 'storelocator' . DS . 'images' . DS;
|
93 |
+
$imgFilename = strtotime(date('Y-m-d H:i:s')) . '_' . strtolower($_FILES['storeimage']['name']);
|
94 |
+
$uploader->save($path, $imgFilename);
|
95 |
+
|
96 |
+
} catch (Exception $e) {
|
97 |
+
|
98 |
+
}
|
99 |
+
|
100 |
+
//this way the name is saved in DB
|
101 |
+
$imgFilename = strtotime(date('Y-m-d H:i:s')) . '_' . strtolower($_FILES['storeimage']['name']);
|
102 |
+
$data['storeimage'] = $imgFilename;
|
103 |
+
}
|
104 |
+
|
105 |
+
|
106 |
+
$model = Mage::getModel('storelocator/storelocator');
|
107 |
+
$model->setData($data)
|
108 |
+
->setId($this->getRequest()->getParam('id'));
|
109 |
+
|
110 |
+
try {
|
111 |
+
if ($model->getCreatedTime == NULL || $model->getUpdateTime() == NULL) {
|
112 |
+
$model->setCreatedTime(now())
|
113 |
+
->setUpdateTime(now());
|
114 |
+
} else {
|
115 |
+
$model->setUpdateTime(now());
|
116 |
+
}
|
117 |
+
|
118 |
+
$model->save();
|
119 |
+
Mage::getSingleton('adminhtml/session')->addSuccess(Mage::helper('storelocator')->__('Store was successfully saved'));
|
120 |
+
Mage::getSingleton('adminhtml/session')->setFormData(false);
|
121 |
+
|
122 |
+
if ($this->getRequest()->getParam('back')) {
|
123 |
+
$this->_redirect('*/*/edit', array('id' => $model->getId()));
|
124 |
+
return;
|
125 |
+
}
|
126 |
+
$this->_redirect('*/*/');
|
127 |
+
return;
|
128 |
+
} catch (Exception $e) {
|
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 |
+
}
|
135 |
+
Mage::getSingleton('adminhtml/session')->addError(Mage::helper('storelocator')->__('Unable to find Store to save'));
|
136 |
+
$this->_redirect('*/*/');
|
137 |
+
}
|
138 |
+
|
139 |
+
public function deleteAction() {
|
140 |
+
if( $this->getRequest()->getParam('id') > 0 ) {
|
141 |
+
try {
|
142 |
+
$model = Mage::getModel('storelocator/storelocator');
|
143 |
+
|
144 |
+
$model->setId($this->getRequest()->getParam('id'))
|
145 |
+
->delete();
|
146 |
+
|
147 |
+
Mage::getSingleton('adminhtml/session')->addSuccess(Mage::helper('adminhtml')->__('Store was successfully deleted'));
|
148 |
+
$this->_redirect('*/*/');
|
149 |
+
} catch (Exception $e) {
|
150 |
+
Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
|
151 |
+
$this->_redirect('*/*/edit', array('id' => $this->getRequest()->getParam('id')));
|
152 |
+
}
|
153 |
+
}
|
154 |
+
$this->_redirect('*/*/');
|
155 |
+
}
|
156 |
+
|
157 |
+
public function massDeleteAction() {
|
158 |
+
$storelocatorIds = $this->getRequest()->getParam('storelocator');
|
159 |
+
if(!is_array($storelocatorIds)) {
|
160 |
+
Mage::getSingleton('adminhtml/session')->addError(Mage::helper('adminhtml')->__('Please select item(s)'));
|
161 |
+
} else {
|
162 |
+
try {
|
163 |
+
foreach ($storelocatorIds as $storelocatorId) {
|
164 |
+
$storelocator = Mage::getModel('storelocator/storelocator')->load($storelocatorId);
|
165 |
+
$storelocator->delete();
|
166 |
+
}
|
167 |
+
Mage::getSingleton('adminhtml/session')->addSuccess(
|
168 |
+
Mage::helper('adminhtml')->__(
|
169 |
+
'Total of %d record(s) were successfully deleted', count($storelocatorIds)
|
170 |
+
)
|
171 |
+
);
|
172 |
+
} catch (Exception $e) {
|
173 |
+
Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
|
174 |
+
}
|
175 |
+
}
|
176 |
+
$this->_redirect('*/*/index');
|
177 |
+
}
|
178 |
+
|
179 |
+
public function massStatusAction()
|
180 |
+
{
|
181 |
+
$storelocatorIds = $this->getRequest()->getParam('storelocator');
|
182 |
+
if(!is_array($storelocatorIds)) {
|
183 |
+
Mage::getSingleton('adminhtml/session')->addError($this->__('Please select item(s)'));
|
184 |
+
} else {
|
185 |
+
try {
|
186 |
+
foreach ($storelocatorIds as $storelocatorId) {
|
187 |
+
$storelocator = Mage::getSingleton('storelocator/storelocator')
|
188 |
+
->load($storelocatorId)
|
189 |
+
->setStatus($this->getRequest()->getParam('status'))
|
190 |
+
->setIsMassupdate(true)
|
191 |
+
->save();
|
192 |
+
}
|
193 |
+
$this->_getSession()->addSuccess(
|
194 |
+
$this->__('Total of %d record(s) were successfully updated', count($storelocatorIds))
|
195 |
+
);
|
196 |
+
} catch (Exception $e) {
|
197 |
+
$this->_getSession()->addError($e->getMessage());
|
198 |
+
}
|
199 |
+
}
|
200 |
+
$this->_redirect('*/*/index');
|
201 |
+
}
|
202 |
+
|
203 |
+
public function exportCsvAction()
|
204 |
+
{
|
205 |
+
$fileName = 'storelocator.csv';
|
206 |
+
$content = $this->getLayout()->createBlock('storelocator/adminhtml_storelocator_grid')
|
207 |
+
->getCsv();
|
208 |
+
|
209 |
+
$this->_sendUploadResponse($fileName, $content);
|
210 |
+
}
|
211 |
+
|
212 |
+
public function exportXmlAction()
|
213 |
+
{
|
214 |
+
$fileName = 'storelocator.xml';
|
215 |
+
$content = $this->getLayout()->createBlock('storelocator/adminhtml_storelocator_grid')
|
216 |
+
->getXml();
|
217 |
+
|
218 |
+
$this->_sendUploadResponse($fileName, $content);
|
219 |
+
}
|
220 |
+
|
221 |
+
protected function _sendUploadResponse($fileName, $content, $contentType='application/octet-stream')
|
222 |
+
{
|
223 |
+
$response = $this->getResponse();
|
224 |
+
$response->setHeader('HTTP/1.1 200 OK','');
|
225 |
+
$response->setHeader('Pragma', 'public', true);
|
226 |
+
$response->setHeader('Cache-Control', 'must-revalidate, post-check=0, pre-check=0', true);
|
227 |
+
$response->setHeader('Content-Disposition', 'attachment; filename='.$fileName);
|
228 |
+
$response->setHeader('Last-Modified', date('r'));
|
229 |
+
$response->setHeader('Accept-Ranges', 'bytes');
|
230 |
+
$response->setHeader('Content-Length', strlen($content));
|
231 |
+
$response->setHeader('Content-type', $contentType);
|
232 |
+
$response->setBody($content);
|
233 |
+
$response->sendResponse();
|
234 |
+
die;
|
235 |
+
}
|
236 |
+
}
|
app/code/community/Sparx/Storelocator/controllers/IndexController.php
ADDED
@@ -0,0 +1,184 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Sparx_Storelocator_IndexController extends Mage_Core_Controller_Front_Action{
|
3 |
+
|
4 |
+
|
5 |
+
|
6 |
+
protected function _initAction() {
|
7 |
+
$this->loadLayout();
|
8 |
+
$this->getLayout()->getBlock("head")->setTitle($this->__("Store Locator"));
|
9 |
+
$breadcrumbs = $this->getLayout()->getBlock("breadcrumbs");
|
10 |
+
$breadcrumbs->addCrumb("home", array(
|
11 |
+
"label" => $this->__("Home Page"),
|
12 |
+
"title" => $this->__("Home Page"),
|
13 |
+
"link" => Mage::getBaseUrl()
|
14 |
+
));
|
15 |
+
|
16 |
+
$breadcrumbs->addCrumb("retailers", array(
|
17 |
+
"label" => $this->__("Retailers"),
|
18 |
+
"title" => $this->__("Retailers")
|
19 |
+
));
|
20 |
+
return $this;
|
21 |
+
}
|
22 |
+
|
23 |
+
public function preDispatch()
|
24 |
+
{
|
25 |
+
if(Mage::helper('storelocator')->checkEnableSetting()){
|
26 |
+
return $this;
|
27 |
+
|
28 |
+
}else{
|
29 |
+
header('Location: '.Mage::getUrl());
|
30 |
+
exit;
|
31 |
+
}
|
32 |
+
}
|
33 |
+
|
34 |
+
public function IndexAction() {
|
35 |
+
|
36 |
+
$this->_initAction();
|
37 |
+
$this->renderLayout();
|
38 |
+
|
39 |
+
}
|
40 |
+
public function DetailAction() {
|
41 |
+
|
42 |
+
$this->_initAction();
|
43 |
+
$this->renderLayout();
|
44 |
+
|
45 |
+
}
|
46 |
+
|
47 |
+
/**
|
48 |
+
* Show store information on map window location using parameters
|
49 |
+
*/
|
50 |
+
public function infowindowdescriptionAction(){
|
51 |
+
echo '{{#location}}
|
52 |
+
<div class="loc-name">{{name}}</div>
|
53 |
+
<div>{{address}}</div>
|
54 |
+
<div>{{city}}, {{state}} {{country}} {{postal}}</div>
|
55 |
+
<div>{{phone}}</div>
|
56 |
+
<div>{{hours1}}</div>
|
57 |
+
<div>{{hours2}}</div>
|
58 |
+
<div>{{hours3}}</div>
|
59 |
+
<div><a href="http://{{web}}" target="_blank">{{web}}</a></div>
|
60 |
+
{{/location}}';
|
61 |
+
}
|
62 |
+
|
63 |
+
/**
|
64 |
+
* Show store information on stores list page using parameters
|
65 |
+
*/
|
66 |
+
public function locationlistdescriptionAction(){
|
67 |
+
echo '
|
68 |
+
{{#location}}
|
69 |
+
<li data-markerid="{{markerid}}">
|
70 |
+
<div class="list-label">{{marker}}</div>
|
71 |
+
<div class="list-details">
|
72 |
+
<div class="list-content">
|
73 |
+
<div class="loc-name">{{name}}</div>
|
74 |
+
<div class="loc-addr">{{address}}</div>
|
75 |
+
<div class="loc-addr3">{{city}}, {{state}} {{country}} {{postal}}</div>
|
76 |
+
<div class="loc-phone">{{phone}}</div>
|
77 |
+
<div class="loc-web"><a href="http://{{web}}" target="_blank">{{web}}</a></div>
|
78 |
+
{{#if distance}}<div class="loc-dist">{{distance}} {{length}}</div>
|
79 |
+
<div class="loc-directions"><a href="http://maps.google.com/maps?saddr={{origin}}&daddr={{address}} {{city}}, {{state}} {{country}} {{postal}}" target="_blank">Directions</a></div>{{/if}}
|
80 |
+
{{#if storeid}}<div class="loc-desc"><a href="'. Mage::helper('storelocator')->getDetailpageUrl('{{storeid}}').'">Store Details</a></div>{{/if}}
|
81 |
+
|
82 |
+
</div>
|
83 |
+
<div class="store-locator-image">
|
84 |
+
{{#if storeimage}}<img height="110px" width="120px" src="'. Mage::helper("storelocator")->getImagepath().'{{storeimage}}'.'">{{/if}}
|
85 |
+
</div>
|
86 |
+
</div>
|
87 |
+
</li>
|
88 |
+
{{/location}}';
|
89 |
+
}
|
90 |
+
|
91 |
+
|
92 |
+
|
93 |
+
/**
|
94 |
+
* get Collection of all active Stores
|
95 |
+
* Set store parameters values for map using Marker tag of xml
|
96 |
+
*/
|
97 |
+
public function locationAction(){
|
98 |
+
$storeCol = Mage::getModel('storelocator/storelocator')->getCollection()
|
99 |
+
->addFieldToFilter('status',1);
|
100 |
+
$xml = '<?xml version="1.0"?>
|
101 |
+
<markers>';
|
102 |
+
if($storeCol->count()){
|
103 |
+
foreach($storeCol as $storeData){
|
104 |
+
$countryname = Mage::helper('storelocator')->getCountryNameById($storeData['country']);
|
105 |
+
$xml.='<marker storeid="'.$storeData->getId().'" name="'.$storeData->getName().'" lat="'.$storeData->getLatitude().'" lng="'.$storeData->getLongitude().'" category="'.$storeData->getCategory().'" address="'.$storeData->getAddress().'" city="'.$storeData->getCity().'" state="'.$storeData->getState().'" postal="'.$storeData->getZipcode().'" country="'.$countryname.'" phone="'.$storeData->getPhone().'" email="'.$storeData->getEmail().'" web="'.$storeData->getWebUrl().'" hours1="'.$storeData->getHours1().'" hours2="'.$storeData->getHours2().'" hours3="'.$storeData->getHours3().'" storeimage="'.$storeData->getStoreimage().'" fax="'.$storeData->getFax().'" featured="" />';
|
106 |
+
}
|
107 |
+
}else{
|
108 |
+
$xml.= '<marker name="No Record Found."/>';
|
109 |
+
}
|
110 |
+
|
111 |
+
echo $xml.='</markers>';
|
112 |
+
}
|
113 |
+
|
114 |
+
/**
|
115 |
+
* get Search Collection of stores
|
116 |
+
* Set store parameters values for map using Marker tag of xml
|
117 |
+
*/
|
118 |
+
public function searchlocationAction(){
|
119 |
+
$params = $this->getRequest()->getParams();
|
120 |
+
$storeCol = Mage::getResourceModel('storelocator/storelocator')->getSearchResult($params['zipcode']);
|
121 |
+
|
122 |
+
if($params['zipcode'] && count($storeCol) > 0){
|
123 |
+
$xml = '<?xml version="1.0"?>
|
124 |
+
<markers>';
|
125 |
+
foreach($storeCol as $storeData){
|
126 |
+
$countryname = Mage::helper('storelocator')->getCountryNameById($storeData['country']);
|
127 |
+
$xml.='<marker storeid="'.$storeData['storelocator_id'].'" name="'.$storeData['name'].'" lat="'.$storeData['latitude'].'" lng="'.$storeData['longitude'].'" category="'.$storeData['category'].'" address="'.$storeData['address'].'" city="'.$storeData['city'].'" state="'.$storeData['state'].'" postal="'.$storeData['zipcode'].'" country="'.$countryname.'" phone="'.$storeData['phone'].'" email="'.$storeData['email'].'" web="'.$storeData['web_url'].'" hours1="'.$storeData['hours1'].'" hours2="'.$storeData['hours2'].'" hours3="'.$storeData['hours3'].'" storeimage="'.$storeData['storeimage'].'" fax="'.$storeData['fax'].'" featured="" />';
|
128 |
+
}
|
129 |
+
echo $xml.='</markers>';
|
130 |
+
}else{
|
131 |
+
echo $xml = '<?xml version="1.0"?>
|
132 |
+
<markers><marker name="No Record Found."/></markers>';
|
133 |
+
}
|
134 |
+
}
|
135 |
+
|
136 |
+
|
137 |
+
/**
|
138 |
+
* Show store information on store detail page using parameters
|
139 |
+
*/
|
140 |
+
public function infoonstoredetailAction(){
|
141 |
+
echo '
|
142 |
+
{{#location}}
|
143 |
+
<li data-markerid="{{markerid}}">
|
144 |
+
<div class="list-details">
|
145 |
+
<div class="list-content">
|
146 |
+
<div class="loc-name">{{name}}</div>
|
147 |
+
<div class="detail-label">Address:</div>
|
148 |
+
<div class="loc-addr">{{address}}</div>
|
149 |
+
<div class="loc-addr3">{{city}}, {{state}} {{country}} {{postal}}</div>
|
150 |
+
<div class="detail-label">Phone:</div>
|
151 |
+
<div class="loc-phone">{{phone}}</div>
|
152 |
+
<div class="detail-label">Url:</div>
|
153 |
+
<div class="loc-web"><a href="http://{{web}}" target="_blank">{{web}}</a></div>
|
154 |
+
<div class="detail-label">Description:</div>
|
155 |
+
<div class="loc-description {{storeid}}">'. Mage::helper('storelocator')->getStoreDescription($this->getRequest()->getParam('id')). '</div>
|
156 |
+
|
157 |
+
</div>
|
158 |
+
<div class="store-locator-image">
|
159 |
+
{{#if storeimage}}<img height="110px" width="120px" src="'. Mage::helper("storelocator")->getImagepath().'{{storeimage}}'.'">{{/if}}
|
160 |
+
</div>
|
161 |
+
</div>
|
162 |
+
</li>
|
163 |
+
{{/location}}';
|
164 |
+
}
|
165 |
+
|
166 |
+
/**
|
167 |
+
* get Store object
|
168 |
+
* Set store parameters values for map using Marker tag of xml
|
169 |
+
*/
|
170 |
+
public function storedetaillocationAction(){
|
171 |
+
$id = $this->getRequest()->getParam('id');
|
172 |
+
$storeData = Mage::getModel('storelocator/storelocator')->load($id);
|
173 |
+
if($storeData && $storeData->getId()){
|
174 |
+
$countryname = Mage::helper('storelocator')->getCountryNameById($storeData->getCountry());
|
175 |
+
$xml = '<?xml version="1.0"?>
|
176 |
+
<markers>';
|
177 |
+
$xml .='<marker storeid="'.$storeData->getId().'" name="'.$storeData->getName().'" lat="'.$storeData->getLatitude().'" lng="'.$storeData->getLongitude().'" category="'.$storeData->getCategory().'" address="'.$storeData->getAddress().'" city="'.$storeData->getCity().'" state="'.$storeData->getState().'" postal="'.$storeData->getZipcode().'" country="'.$countryname.'" phone="'.$storeData->getPhone().'" email="'.$storeData->getEmail().'" web="'.$storeData->getWebUrl().'" hours1="'.$storeData->getHours1().'" hours2="'.$storeData->getHours2().'" hours3="'.$storeData->getHours3().'" storeimage="'.$storeData->getStoreimage().'" fax="'.$storeData->getFax().'" featured="" />';
|
178 |
+
echo $xml.='</markers>';
|
179 |
+
}else{
|
180 |
+
echo $xml = '<?xml version="1.0"?>
|
181 |
+
<markers><marker name="No Record Found."/></markers>';
|
182 |
+
}
|
183 |
+
}
|
184 |
+
}
|
app/code/community/Sparx/Storelocator/controllers/IndexController.php~
ADDED
@@ -0,0 +1,192 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
class Sparx_Storelocator_IndexController extends Mage_Core_Controller_Front_Action{
|
3 |
+
|
4 |
+
|
5 |
+
|
6 |
+
protected function _initAction() {
|
7 |
+
$this->loadLayout();
|
8 |
+
$this->getLayout()->getBlock("head")->setTitle($this->__("Store Locator"));
|
9 |
+
$breadcrumbs = $this->getLayout()->getBlock("breadcrumbs");
|
10 |
+
$breadcrumbs->addCrumb("home", array(
|
11 |
+
"label" => $this->__("Home Page"),
|
12 |
+
"title" => $this->__("Home Page"),
|
13 |
+
"link" => Mage::getBaseUrl()
|
14 |
+
));
|
15 |
+
|
16 |
+
$breadcrumbs->addCrumb("retailers", array(
|
17 |
+
"label" => $this->__("Retailers"),
|
18 |
+
"title" => $this->__("Retailers")
|
19 |
+
));
|
20 |
+
return $this;
|
21 |
+
}
|
22 |
+
|
23 |
+
public function preDispatch()
|
24 |
+
{
|
25 |
+
if(Mage::helper('storelocator')->checkEnableSetting()){
|
26 |
+
return $this;
|
27 |
+
|
28 |
+
}else{
|
29 |
+
header('Location: '.Mage::getUrl());
|
30 |
+
exit;
|
31 |
+
}
|
32 |
+
}
|
33 |
+
|
34 |
+
public function IndexAction() {
|
35 |
+
|
36 |
+
$this->_initAction();
|
37 |
+
$this->renderLayout();
|
38 |
+
|
39 |
+
}
|
40 |
+
public function DetailAction() {
|
41 |
+
|
42 |
+
$this->_initAction();
|
43 |
+
$this->renderLayout();
|
44 |
+
|
45 |
+
}
|
46 |
+
|
47 |
+
/**
|
48 |
+
* Show store information on map window location using parameters
|
49 |
+
*/
|
50 |
+
public function infowindowdescriptionAction(){
|
51 |
+
echo '{{#location}}
|
52 |
+
<div class="loc-name">{{name}}</div>
|
53 |
+
<div>{{address}}</div>
|
54 |
+
<div>{{city}}, {{state}} {{country}} {{postal}}</div>
|
55 |
+
<div>{{phone}}</div>
|
56 |
+
<div>{{hours1}}</div>
|
57 |
+
<div>{{hours2}}</div>
|
58 |
+
<div>{{hours3}}</div>
|
59 |
+
<div><a href="http://{{web}}" target="_blank">{{web}}</a></div>
|
60 |
+
{{/location}}';
|
61 |
+
}
|
62 |
+
|
63 |
+
/**
|
64 |
+
* Show store information on stores list page using parameters
|
65 |
+
*/
|
66 |
+
public function locationlistdescriptionAction(){
|
67 |
+
echo '
|
68 |
+
{{#location}}
|
69 |
+
<li data-markerid="{{markerid}}">
|
70 |
+
{{#ifCond name neq "No Record Found."}}
|
71 |
+
<div class="list-label">{{marker}}</div>
|
72 |
+
<div class="list-details">
|
73 |
+
<div class="list-content">
|
74 |
+
<div class="loc-name">{{name}}</div>
|
75 |
+
<div class="loc-addr">{{address}}</div>
|
76 |
+
<div class="loc-addr3">{{city}}, {{state}} {{country}} {{postal}}</div>
|
77 |
+
<div class="loc-phone">{{phone}}</div>
|
78 |
+
<div class="loc-web"><a href="http://{{web}}" target="_blank">{{web}}</a></div>
|
79 |
+
{{#if distance}}<div class="loc-dist">{{distance}} {{length}}</div>
|
80 |
+
<div class="loc-directions"><a href="http://maps.google.com/maps?saddr={{origin}}&daddr={{address}} {{city}}, {{state}} {{country}} {{postal}}" target="_blank">Directions</a></div>{{/if}}
|
81 |
+
{{#if storeid}}<div class="loc-desc"><a href="'. Mage::helper('storelocator')->getDetailpageUrl('{{storeid}}').'">Store Details</a></div>{{/if}}
|
82 |
+
|
83 |
+
</div>
|
84 |
+
<div class="store-locator-image">
|
85 |
+
{{#if storeimage}}<img height="110px" width="120px" src="'. Mage::helper("storelocator")->getImagepath().'{{storeimage}}'.'">{{/if}}
|
86 |
+
</div>
|
87 |
+
</div>
|
88 |
+
{{else}}
|
89 |
+
<div class="list-details">
|
90 |
+
<div class="list-content">
|
91 |
+
<div class="loc-name">{{name}}</div>
|
92 |
+
</div>
|
93 |
+
</div>
|
94 |
+
{{/ifCond}}
|
95 |
+
</li>
|
96 |
+
{{/location}}';
|
97 |
+
}
|
98 |
+
|
99 |
+
|
100 |
+
|
101 |
+
/**
|
102 |
+
* get Collection of all active Stores
|
103 |
+
* Set store parameters values for map using Marker tag of xml
|
104 |
+
*/
|
105 |
+
public function locationAction(){
|
106 |
+
$storeCol = Mage::getModel('storelocator/storelocator')->getCollection()
|
107 |
+
->addFieldToFilter('status',1);
|
108 |
+
$xml = '<?xml version="1.0"?>
|
109 |
+
<markers>';
|
110 |
+
if($storeCol->count()){
|
111 |
+
foreach($storeCol as $storeData){
|
112 |
+
$countryname = Mage::helper('storelocator')->getCountryNameById($storeData['country']);
|
113 |
+
$xml.='<marker storeid="'.$storeData->getId().'" name="'.$storeData->getName().'" lat="'.$storeData->getLatitude().'" lng="'.$storeData->getLongitude().'" category="'.$storeData->getCategory().'" address="'.$storeData->getAddress().'" city="'.$storeData->getCity().'" state="'.$storeData->getState().'" postal="'.$storeData->getZipcode().'" country="'.$countryname.'" phone="'.$storeData->getPhone().'" email="'.$storeData->getEmail().'" web="'.$storeData->getWebUrl().'" hours1="'.$storeData->getHours1().'" hours2="'.$storeData->getHours2().'" hours3="'.$storeData->getHours3().'" storeimage="'.$storeData->getStoreimage().'" fax="'.$storeData->getFax().'" featured="" />';
|
114 |
+
}
|
115 |
+
}else{
|
116 |
+
$xml.= '<marker name="No Record Found."/>';
|
117 |
+
}
|
118 |
+
|
119 |
+
echo $xml.='</markers>';
|
120 |
+
}
|
121 |
+
|
122 |
+
/**
|
123 |
+
* get Search Collection of stores
|
124 |
+
* Set store parameters values for map using Marker tag of xml
|
125 |
+
*/
|
126 |
+
public function searchlocationAction(){
|
127 |
+
$params = $this->getRequest()->getParams();
|
128 |
+
$storeCol = Mage::getResourceModel('storelocator/storelocator')->getSearchResult($params['zipcode']);
|
129 |
+
|
130 |
+
if($params['zipcode'] && count($storeCol) > 0){
|
131 |
+
$xml = '<?xml version="1.0"?>
|
132 |
+
<markers>';
|
133 |
+
foreach($storeCol as $storeData){
|
134 |
+
$countryname = Mage::helper('storelocator')->getCountryNameById($storeData['country']);
|
135 |
+
$xml.='<marker storeid="'.$storeData['storelocator_id'].'" name="'.$storeData['name'].'" lat="'.$storeData['latitude'].'" lng="'.$storeData['longitude'].'" category="'.$storeData['category'].'" address="'.$storeData['address'].'" city="'.$storeData['city'].'" state="'.$storeData['state'].'" postal="'.$storeData['zipcode'].'" country="'.$countryname.'" phone="'.$storeData['phone'].'" email="'.$storeData['email'].'" web="'.$storeData['web_url'].'" hours1="'.$storeData['hours1'].'" hours2="'.$storeData['hours2'].'" hours3="'.$storeData['hours3'].'" storeimage="'.$storeData['storeimage'].'" fax="'.$storeData['fax'].'" featured="" />';
|
136 |
+
}
|
137 |
+
echo $xml.='</markers>';
|
138 |
+
}else{
|
139 |
+
echo $xml = '<?xml version="1.0"?>
|
140 |
+
<markers><marker name="No Record Found."/></markers>';
|
141 |
+
}
|
142 |
+
}
|
143 |
+
|
144 |
+
|
145 |
+
/**
|
146 |
+
* Show store information on store detail page using parameters
|
147 |
+
*/
|
148 |
+
public function infoonstoredetailAction(){
|
149 |
+
echo '
|
150 |
+
{{#location}}
|
151 |
+
<li data-markerid="{{markerid}}">
|
152 |
+
<div class="list-details">
|
153 |
+
<div class="list-content">
|
154 |
+
<div class="loc-name">{{name}}</div>
|
155 |
+
<div class="detail-label">Address:</div>
|
156 |
+
<div class="loc-addr">{{address}}</div>
|
157 |
+
<div class="loc-addr3">{{city}}, {{state}} {{country}} {{postal}}</div>
|
158 |
+
<div class="detail-label">Phone:</div>
|
159 |
+
<div class="loc-phone">{{phone}}</div>
|
160 |
+
<div class="detail-label">Url:</div>
|
161 |
+
<div class="loc-web"><a href="http://{{web}}" target="_blank">{{web}}</a></div>
|
162 |
+
<div class="detail-label">Description:</div>
|
163 |
+
<div class="loc-description {{storeid}}">'. Mage::helper('storelocator')->getStoreDescription($this->getRequest()->getParam('id')). '</div>
|
164 |
+
|
165 |
+
</div>
|
166 |
+
<div class="store-locator-image">
|
167 |
+
{{#if storeimage}}<img height="110px" width="120px" src="'. Mage::helper("storelocator")->getImagepath().'{{storeimage}}'.'">{{/if}}
|
168 |
+
</div>
|
169 |
+
</div>
|
170 |
+
</li>
|
171 |
+
{{/location}}';
|
172 |
+
}
|
173 |
+
|
174 |
+
/**
|
175 |
+
* get Store object
|
176 |
+
* Set store parameters values for map using Marker tag of xml
|
177 |
+
*/
|
178 |
+
public function storedetaillocationAction(){
|
179 |
+
$id = $this->getRequest()->getParam('id');
|
180 |
+
$storeData = Mage::getModel('storelocator/storelocator')->load($id);
|
181 |
+
if($storeData && $storeData->getId()){
|
182 |
+
$countryname = Mage::helper('storelocator')->getCountryNameById($storeData->getCountry());
|
183 |
+
$xml = '<?xml version="1.0"?>
|
184 |
+
<markers>';
|
185 |
+
$xml .='<marker storeid="'.$storeData->getId().'" name="'.$storeData->getName().'" lat="'.$storeData->getLatitude().'" lng="'.$storeData->getLongitude().'" category="'.$storeData->getCategory().'" address="'.$storeData->getAddress().'" city="'.$storeData->getCity().'" state="'.$storeData->getState().'" postal="'.$storeData->getZipcode().'" country="'.$countryname.'" phone="'.$storeData->getPhone().'" email="'.$storeData->getEmail().'" web="'.$storeData->getWebUrl().'" hours1="'.$storeData->getHours1().'" hours2="'.$storeData->getHours2().'" hours3="'.$storeData->getHours3().'" storeimage="'.$storeData->getStoreimage().'" fax="'.$storeData->getFax().'" featured="" />';
|
186 |
+
echo $xml.='</markers>';
|
187 |
+
}else{
|
188 |
+
echo $xml = '<?xml version="1.0"?>
|
189 |
+
<markers><marker name="No Record Found."/></markers>';
|
190 |
+
}
|
191 |
+
}
|
192 |
+
}
|
app/code/community/Sparx/Storelocator/etc/adminhtml.xml
ADDED
@@ -0,0 +1,51 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
|
3 |
+
<config>
|
4 |
+
<menu>
|
5 |
+
<storelocator module="storelocator" translate="title">
|
6 |
+
<title>Storelocator</title>
|
7 |
+
<sort_order>71</sort_order>
|
8 |
+
<children>
|
9 |
+
<items module="storelocator">
|
10 |
+
<title>Manage Stores</title>
|
11 |
+
<sort_order>0</sort_order>
|
12 |
+
<action>storelocator/adminhtml_storelocator</action>
|
13 |
+
</items>
|
14 |
+
<settings module="storelocator" translate="title">
|
15 |
+
<title>Settings</title>
|
16 |
+
<sort_order>20</sort_order>
|
17 |
+
<action>adminhtml/system_config/edit/section/storelocator</action>
|
18 |
+
</settings>
|
19 |
+
</children>
|
20 |
+
</storelocator>
|
21 |
+
</menu>
|
22 |
+
|
23 |
+
<acl>
|
24 |
+
<resources>
|
25 |
+
<all>
|
26 |
+
<title>Allow Everything</title>
|
27 |
+
</all>
|
28 |
+
<admin>
|
29 |
+
<children>
|
30 |
+
<Sparx_Storelocator>
|
31 |
+
<title>Storelocator Module</title>
|
32 |
+
<sort_order>10</sort_order>
|
33 |
+
</Sparx_Storelocator>
|
34 |
+
<system>
|
35 |
+
<children>
|
36 |
+
<config>
|
37 |
+
<children>
|
38 |
+
<storelocator module="storelocator" translate="title">
|
39 |
+
<title>Store Locator</title>
|
40 |
+
<sort_order>71</sort_order>
|
41 |
+
</storelocator>
|
42 |
+
</children>
|
43 |
+
</config>
|
44 |
+
</children>
|
45 |
+
</system>
|
46 |
+
</children>
|
47 |
+
</admin>
|
48 |
+
</resources>
|
49 |
+
</acl>
|
50 |
+
|
51 |
+
</config>
|
app/code/community/Sparx/Storelocator/etc/config.xml
ADDED
@@ -0,0 +1,103 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
<config>
|
3 |
+
<modules>
|
4 |
+
<Sparx_Storelocator>
|
5 |
+
<version>0.1.1</version>
|
6 |
+
</Sparx_Storelocator>
|
7 |
+
</modules>
|
8 |
+
<frontend>
|
9 |
+
<routers>
|
10 |
+
<storelocator>
|
11 |
+
<use>standard</use>
|
12 |
+
<args>
|
13 |
+
<module>Sparx_Storelocator</module>
|
14 |
+
<frontName>storelocator</frontName>
|
15 |
+
</args>
|
16 |
+
</storelocator>
|
17 |
+
</routers>
|
18 |
+
<layout>
|
19 |
+
<updates>
|
20 |
+
<storelocator>
|
21 |
+
<file>storelocator.xml</file>
|
22 |
+
</storelocator>
|
23 |
+
</updates>
|
24 |
+
</layout>
|
25 |
+
</frontend>
|
26 |
+
<admin>
|
27 |
+
<routers>
|
28 |
+
<storelocator>
|
29 |
+
<use>admin</use>
|
30 |
+
<args>
|
31 |
+
<module>Sparx_Storelocator</module>
|
32 |
+
<frontName>storelocator</frontName>
|
33 |
+
</args>
|
34 |
+
</storelocator>
|
35 |
+
</routers>
|
36 |
+
</admin>
|
37 |
+
<adminhtml>
|
38 |
+
<layout>
|
39 |
+
<updates>
|
40 |
+
<storelocator>
|
41 |
+
<file>storelocator.xml</file>
|
42 |
+
</storelocator>
|
43 |
+
</updates>
|
44 |
+
</layout>
|
45 |
+
</adminhtml>
|
46 |
+
<global>
|
47 |
+
<models>
|
48 |
+
<storelocator>
|
49 |
+
<class>Sparx_Storelocator_Model</class>
|
50 |
+
<resourceModel>storelocator_mysql4</resourceModel>
|
51 |
+
</storelocator>
|
52 |
+
<storelocator_mysql4>
|
53 |
+
<class>Sparx_Storelocator_Model_Mysql4</class>
|
54 |
+
<entities>
|
55 |
+
<storelocator>
|
56 |
+
<table>storelocator</table>
|
57 |
+
</storelocator>
|
58 |
+
</entities>
|
59 |
+
</storelocator_mysql4>
|
60 |
+
</models>
|
61 |
+
<resources>
|
62 |
+
<storelocator_setup>
|
63 |
+
<setup>
|
64 |
+
<module>Sparx_Storelocator</module>
|
65 |
+
</setup>
|
66 |
+
<connection>
|
67 |
+
<use>core_setup</use>
|
68 |
+
</connection>
|
69 |
+
</storelocator_setup>
|
70 |
+
<storelocator_write>
|
71 |
+
<connection>
|
72 |
+
<use>core_write</use>
|
73 |
+
</connection>
|
74 |
+
</storelocator_write>
|
75 |
+
<storelocator_read>
|
76 |
+
<connection>
|
77 |
+
<use>core_read</use>
|
78 |
+
</connection>
|
79 |
+
</storelocator_read>
|
80 |
+
</resources>
|
81 |
+
<blocks>
|
82 |
+
<storelocator>
|
83 |
+
<class>Sparx_Storelocator_Block</class>
|
84 |
+
</storelocator>
|
85 |
+
</blocks>
|
86 |
+
<helpers>
|
87 |
+
<storelocator>
|
88 |
+
<class>Sparx_Storelocator_Helper</class>
|
89 |
+
</storelocator>
|
90 |
+
</helpers>
|
91 |
+
</global>
|
92 |
+
|
93 |
+
<default>
|
94 |
+
<storelocator>
|
95 |
+
<settings>
|
96 |
+
<defaultlon>78.0000</defaultlon>
|
97 |
+
<defaultlat>21.0000</defaultlat>
|
98 |
+
<active>1</active>
|
99 |
+
<jquery>1</jquery>
|
100 |
+
</settings>
|
101 |
+
</storelocator>
|
102 |
+
</default>
|
103 |
+
</config>
|
app/code/community/Sparx/Storelocator/etc/system.xml
ADDED
@@ -0,0 +1,91 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
<config>
|
3 |
+
<tabs>
|
4 |
+
<sparxstore translate="label">
|
5 |
+
<label>Sparx Store Extension</label>
|
6 |
+
<sort_order>300</sort_order>
|
7 |
+
</sparxstore>
|
8 |
+
</tabs>
|
9 |
+
<sections>
|
10 |
+
<storelocator translate="label" module="storelocator">
|
11 |
+
<class>separator-top</class>
|
12 |
+
<label>General</label>
|
13 |
+
<tab>sparxstore</tab>
|
14 |
+
<frontend_type>text</frontend_type>
|
15 |
+
<sort_order>10</sort_order>
|
16 |
+
<show_in_default>1</show_in_default>
|
17 |
+
<show_in_website>1</show_in_website>
|
18 |
+
<show_in_store>1</show_in_store>
|
19 |
+
<groups>
|
20 |
+
<settings translate="label">
|
21 |
+
<label>General Settings</label>
|
22 |
+
<frontend_type>text</frontend_type>
|
23 |
+
<sort_order>0</sort_order>
|
24 |
+
<show_in_default>1</show_in_default>
|
25 |
+
<show_in_website>1</show_in_website>
|
26 |
+
<show_in_store>1</show_in_store>
|
27 |
+
<fields>
|
28 |
+
<active translate="label">
|
29 |
+
<label>Enable Store Locator</label>
|
30 |
+
<frontend_type>select</frontend_type>
|
31 |
+
<source_model>adminhtml/system_config_source_yesno</source_model>
|
32 |
+
<sort_order>0</sort_order>
|
33 |
+
<show_in_default>1</show_in_default>
|
34 |
+
<show_in_website>1</show_in_website>
|
35 |
+
<show_in_store>0</show_in_store>
|
36 |
+
<comment>Enable Store Locator</comment>
|
37 |
+
</active>
|
38 |
+
<jquery translate="label">
|
39 |
+
<label>Enable jQuery</label>
|
40 |
+
<frontend_type>select</frontend_type>
|
41 |
+
<source_model>adminhtml/system_config_source_yesno</source_model>
|
42 |
+
<sort_order>1</sort_order>
|
43 |
+
<show_in_default>1</show_in_default>
|
44 |
+
<show_in_website>1</show_in_website>
|
45 |
+
<show_in_store>0</show_in_store>
|
46 |
+
<comment>Enable jQuery</comment>
|
47 |
+
</jquery>
|
48 |
+
<!-- <enablejs translate="label">
|
49 |
+
<label>Enable JQuery</label>
|
50 |
+
<frontend_type>select</frontend_type>
|
51 |
+
<source_model>adminhtml/system_config_source_yesno</source_model>
|
52 |
+
<sort_order>0</sort_order>
|
53 |
+
<show_in_default>1</show_in_default>
|
54 |
+
<show_in_website>1</show_in_website>
|
55 |
+
<show_in_store>0</show_in_store>
|
56 |
+
<comment>Enable JQuery lib</comment>
|
57 |
+
</enablejs>-->
|
58 |
+
<!-- <toplinks translate="label">
|
59 |
+
<label>Add Storelocator link to top menu</label>
|
60 |
+
<frontend_type>select</frontend_type>
|
61 |
+
<source_model>adminhtml/system_config_source_yesno</source_model>
|
62 |
+
<sort_order>20</sort_order>
|
63 |
+
<show_in_default>1</show_in_default>
|
64 |
+
<show_in_website>1</show_in_website>
|
65 |
+
<show_in_store>0</show_in_store>
|
66 |
+
</toplinks>-->
|
67 |
+
<defaultlon translate="label">
|
68 |
+
<label>Default Longitude</label>
|
69 |
+
<frontend_type>text</frontend_type>
|
70 |
+
<sort_order>40</sort_order>
|
71 |
+
<show_in_default>1</show_in_default>
|
72 |
+
<show_in_website>1</show_in_website>
|
73 |
+
<show_in_store>1</show_in_store>
|
74 |
+
<comment>Default Longitude</comment>
|
75 |
+
</defaultlon>
|
76 |
+
<defaultlat translate="label">
|
77 |
+
<label>Default Latitude</label>
|
78 |
+
<frontend_type>text</frontend_type>
|
79 |
+
<sort_order>50</sort_order>
|
80 |
+
<show_in_default>1</show_in_default>
|
81 |
+
<show_in_website>1</show_in_website>
|
82 |
+
<show_in_store>1</show_in_store>
|
83 |
+
<comment>Default Latitude</comment>
|
84 |
+
</defaultlat>
|
85 |
+
</fields>
|
86 |
+
</settings>
|
87 |
+
</groups>
|
88 |
+
</storelocator>
|
89 |
+
</sections>
|
90 |
+
</config>
|
91 |
+
|
app/code/community/Sparx/Storelocator/sql/storelocator_setup/mysql4-install-0.1.0.php
ADDED
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
$installer = $this;
|
4 |
+
|
5 |
+
$installer->startSetup();
|
6 |
+
|
7 |
+
$installer->run("
|
8 |
+
|
9 |
+
-- DROP TABLE IF EXISTS {$this->getTable('storelocator')};
|
10 |
+
CREATE TABLE {$this->getTable('storelocator')} (
|
11 |
+
`storelocator_id` int(11) unsigned NOT NULL auto_increment,
|
12 |
+
`name` varchar(255) NOT NULL default '',
|
13 |
+
`address` varchar(255) NOT NULL default '',
|
14 |
+
`city` varchar(255) NOT NULL default '',
|
15 |
+
`state` varchar(255) NOT NULL default '',
|
16 |
+
`state_id` int(11) NULL ,
|
17 |
+
`country` varchar(255) NOT NULL default '',
|
18 |
+
`zipcode` varchar(255) NOT NULL default '',
|
19 |
+
`fax` varchar(25) NULL default '',
|
20 |
+
`email` varchar(255) NOT NULL default '',
|
21 |
+
`phone` varchar(255) NOT NULL default '',
|
22 |
+
`web_url` varchar(255) NOT NULL default '',
|
23 |
+
`description` text NOT NULL default '',
|
24 |
+
`storeimage` varchar(255) NOT NULL default '',
|
25 |
+
`latitude` varchar(255) NOT NULL default '',
|
26 |
+
`longitude` varchar(255) NOT NULL default '',
|
27 |
+
`zoom_level` int(11) NULL,
|
28 |
+
`hours1` varchar(255) NOT NULL default '',
|
29 |
+
`hours2` varchar(255) NOT NULL default '',
|
30 |
+
`hours3` varchar(255) NOT NULL default '',
|
31 |
+
category varchar(255) NOT NULL default '',
|
32 |
+
`status` smallint(6) NOT NULL default '0',
|
33 |
+
`sortorder` int(10) NULL default 0,
|
34 |
+
`created_time` datetime NULL,
|
35 |
+
`update_time` datetime NULL,
|
36 |
+
PRIMARY KEY (`storelocator_id`)
|
37 |
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
38 |
+
|
39 |
+
");
|
40 |
+
|
41 |
+
$installer->endSetup();
|
app/code/community/Sparx/Storelocator/sql/storelocator_setup/mysql4-upgrade-0.1.0-0.1.1.php
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$installer = $this;
|
3 |
+
|
4 |
+
$installer->startSetup();
|
5 |
+
$installer->run("
|
6 |
+
INSERT INTO {$this->getTable('storelocator')} (`name`, `latitude`, `longitude`, `address`, `city`, `state`, `country`, `zipcode`, `phone`, `web_url`, `email`, `hours1`, `status`, `storeimage`, `description`) VALUES
|
7 |
+
('Sparx It Solutions', '28.56285', '77.40563299999997', 'A-02 sparx it solution ', 'Noida', 'Uttar Pradesh', 'IN', '201307', '06666 555 444', 'sparxitsolutions.com', 'dharmveer@gmail.com', '9:30 am To 6:30 pm', '1', 'logo.jpg', 'Sparx It Solutions');
|
8 |
+
");
|
9 |
+
|
10 |
+
$installer->endSetup();
|
app/design/adminhtml/default/default/layout/storelocator.xml
ADDED
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
<layout version="0.1.0">
|
3 |
+
<storelocator_adminhtml_storelocator_index>
|
4 |
+
<reference name="head">
|
5 |
+
<action method="setCanLoadExtJs">
|
6 |
+
<flag>1</flag>
|
7 |
+
</action>
|
8 |
+
<action method="setCanLoadTinyMce">
|
9 |
+
<flag>1</flag>
|
10 |
+
</action>
|
11 |
+
<action method="addJs">
|
12 |
+
<script>lib/flex.js</script>
|
13 |
+
</action>
|
14 |
+
<action method="addJs">
|
15 |
+
<script>mage/adminhtml/flexuploader.js</script>
|
16 |
+
</action>
|
17 |
+
<action method="addJs">
|
18 |
+
<script>mage/adminhtml/browser.js</script>
|
19 |
+
</action>
|
20 |
+
<action method="addJs">
|
21 |
+
<script>prototype/window.js</script>
|
22 |
+
</action>
|
23 |
+
<action method="addItem">
|
24 |
+
<type>js_css</type>
|
25 |
+
<name>prototype/windows/themes/default.css</name>
|
26 |
+
</action>
|
27 |
+
<action method="addItem">
|
28 |
+
<type>js_css</type>
|
29 |
+
<name>prototype/windows/themes/magento.css</name>
|
30 |
+
</action>
|
31 |
+
<action method="addItem">
|
32 |
+
<type>js</type>
|
33 |
+
<name>mage/adminhtml/wysiwyg/tiny_mce/setup.js</name>
|
34 |
+
<params/>
|
35 |
+
</action>
|
36 |
+
<action method="addItem">
|
37 |
+
<type>js</type>
|
38 |
+
<name>tiny_mce/tiny_mce.js</name>
|
39 |
+
<params/>
|
40 |
+
</action>
|
41 |
+
</reference>
|
42 |
+
|
43 |
+
<reference name="content">
|
44 |
+
<block type="storelocator/adminhtml_storelocator" name="storelocator" />
|
45 |
+
</reference>
|
46 |
+
</storelocator_adminhtml_storelocator_index>
|
47 |
+
</layout>
|
app/design/adminhtml/default/default/template/storelocator/region.phtml
ADDED
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$storecollection = $this->getStoreCollection();
|
3 |
+
$state ='';
|
4 |
+
$stateId = 0;
|
5 |
+
if ($storecollection) {
|
6 |
+
$state = $storecollection->getState();
|
7 |
+
$stateId = $storecollection->getStateId();
|
8 |
+
}
|
9 |
+
?>
|
10 |
+
<div class="input-box">
|
11 |
+
<select id="state_id" name="state_id" title="<?php echo $this->__('State/Province') ?>" class="validate-select" style="display:none;">
|
12 |
+
<option value=""><?php echo $this->__('Please select region, state or province') ?></option>
|
13 |
+
</select>
|
14 |
+
<script type="text/javascript">
|
15 |
+
//<![CDATA[
|
16 |
+
$('state_id').setAttribute('defaultValue', "<?php echo $stateId; ?>");
|
17 |
+
//]]>
|
18 |
+
</script>
|
19 |
+
<input type="text" id="state" name="state" value="<?php echo $state ?>" title="<?php echo $this->__('State/Province') ?>" class="input-text" style="display:none;" />
|
20 |
+
</div>
|
21 |
+
<script type="text/javascript">
|
22 |
+
//<![CDATA[
|
23 |
+
var countryRegions = <?php echo Mage::helper('directory')->getRegionJson()?>;
|
24 |
+
var newRegionUpdater = new RegionUpdater('country', 'state', 'state_id',countryRegions);
|
25 |
+
//]]>
|
26 |
+
</script>
|
27 |
+
|
28 |
+
|
app/design/frontend/base/default/layout/storelocator.xml
ADDED
@@ -0,0 +1,63 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
<layout version="0.1.0">
|
3 |
+
|
4 |
+
<default>
|
5 |
+
<reference name="top.links">
|
6 |
+
<action method="addLink" ifconfig="storelocator/settings/active" translate="label title" module="storelocator"><label>Store Locator</label><url helper="storelocator/getStorelocatorUrl"/><title>Store Locator</title><prepare/><urlParams/><position>50</position></action>
|
7 |
+
</reference>
|
8 |
+
</default>
|
9 |
+
|
10 |
+
<storelocator_index_index>
|
11 |
+
<reference name="head">
|
12 |
+
<action method="addCss">
|
13 |
+
<stylesheet>storelocator/css/map.css</stylesheet>
|
14 |
+
</action>
|
15 |
+
<action ifconfig="storelocator/settings/jquery" method="addItem"><type>skin_js</type><name>storelocator/js/jquery-1.10.1.min.js</name></action>
|
16 |
+
<action method="addItem"><type>skin_js</type><name>storelocator/js/noConflict.js</name></action>
|
17 |
+
<action method="addItem"><type>skin_js</type><name>storelocator/js/handlebars-1.0.0.min.js</name></action>
|
18 |
+
|
19 |
+
<block type="core/text" name="google.cdn.jquery">
|
20 |
+
<action method="setText">
|
21 |
+
<text><![CDATA[<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script><script type="text/javascript">jQuery.noConflict();</script>]]>
|
22 |
+
</text>
|
23 |
+
</action>
|
24 |
+
</block>
|
25 |
+
<action method="addItem"><type>skin_js</type><name>storelocator/js/jquery.storelocator.js</name></action>
|
26 |
+
|
27 |
+
</reference>
|
28 |
+
<reference name="root">
|
29 |
+
<action method="setTemplate">
|
30 |
+
<template>page/1column.phtml</template>
|
31 |
+
</action>
|
32 |
+
</reference>
|
33 |
+
<reference name="content">
|
34 |
+
<block type="storelocator/storelocator" name="storelocator" template="storelocator/storelocator.phtml"/>
|
35 |
+
</reference>
|
36 |
+
</storelocator_index_index>
|
37 |
+
<storelocator_index_detail>
|
38 |
+
<reference name="head">
|
39 |
+
<action method="addCss">
|
40 |
+
<stylesheet>storelocator/css/map.css</stylesheet>
|
41 |
+
</action>
|
42 |
+
<action ifconfig="storelocator/settings/jquery" method="addItem"><type>skin_js</type><name>storelocator/js/jquery-1.10.1.min.js</name></action>
|
43 |
+
<action method="addItem"><type>skin_js</type><name>storelocator/js/noConflict.js</name></action>
|
44 |
+
<action method="addItem"><type>skin_js</type><name>storelocator/js/handlebars-1.0.0.min.js</name></action>
|
45 |
+
<block type="core/text" name="google.cdn.jquery">
|
46 |
+
<action method="setText">
|
47 |
+
<text><![CDATA[<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script><script type="text/javascript">jQuery.noConflict();</script>]]>
|
48 |
+
</text>
|
49 |
+
</action>
|
50 |
+
</block>
|
51 |
+
<action method="addItem"><type>skin_js</type><name>storelocator/js/jquery.storelocator.js</name></action>
|
52 |
+
</reference>
|
53 |
+
<reference name="root">
|
54 |
+
<action method="setTemplate">
|
55 |
+
<template>page/1column.phtml</template>
|
56 |
+
</action>
|
57 |
+
</reference>
|
58 |
+
<reference name="content">
|
59 |
+
<block type="storelocator/storelocator" name="storelocator_detail" template="storelocator/storedetail.phtml"/>
|
60 |
+
</reference>
|
61 |
+
</storelocator_index_detail>
|
62 |
+
</layout>
|
63 |
+
|
app/design/frontend/base/default/template/storelocator/storedetail.phtml
ADDED
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$storeid = Mage::app()->getStore()->getId();
|
3 |
+
$lng = Mage::getStoreConfig('storelocator/settings/defaultlon', $storeid);
|
4 |
+
$lat = Mage::getStoreConfig('storelocator/settings/defaultlat', $storeid);
|
5 |
+
$id = $this->getRequest()->getParam('id');
|
6 |
+
$storeData = Mage::getModel('storelocator/storelocator')->load($id);
|
7 |
+
$zoomlevel = Sparx_Storelocator_Helper_Data::storezoomLevel;
|
8 |
+
if($storeData && $storeData->getId()){
|
9 |
+
$lng = $storeData->getLongitude();
|
10 |
+
$lat = $storeData->getLatitude();
|
11 |
+
if($storeData->getZoomLevel()){
|
12 |
+
$zoomlevel = $storeData->getZoomLevel();
|
13 |
+
}
|
14 |
+
}
|
15 |
+
?>
|
16 |
+
<div id="store-locator-container store-locator-detail">
|
17 |
+
|
18 |
+
<h1><?php echo $this->__("Store Locator"); ?></h1>
|
19 |
+
<div class="bottom-line"></div>
|
20 |
+
<div id="form-container">
|
21 |
+
<form id="user-location" method="post" action="#">
|
22 |
+
<input type="hidden" name="url" value="<?php echo $this->getBaseUrl() . 'storelocator/index/storedetaillocation?id='.$id; ?>" id="url">
|
23 |
+
<input type="hidden" name="searchurl" value="<?php echo $this->getBaseUrl() . 'storelocator/index/searchlocation'; ?>" id="searchurl">
|
24 |
+
<input type="hidden" name="url1" value="<?php echo $this->getBaseUrl() . 'storelocator/index/infowindowdescription'; ?>" id="url1">
|
25 |
+
<input type="hidden" name="url2" value="<?php echo $this->getBaseUrl() . 'storelocator/index/infoonstoredetail?id='.$id; ?>" id="url2">
|
26 |
+
<!-- <div id="form-input">
|
27 |
+
<label for="address">Enter City or State or Country or Phone or Zip Code:</label>
|
28 |
+
<input type="text" id="address" name="address" />
|
29 |
+
</div> -->
|
30 |
+
<!--<button id="submit" type="submit">Submit</button>-->
|
31 |
+
</form>
|
32 |
+
</div>
|
33 |
+
<div id="map-container">
|
34 |
+
<div id="loc-list" class="loc-list-detail">
|
35 |
+
<ul id="list"></ul>
|
36 |
+
</div>
|
37 |
+
<div id="map" class="map-on-detail"></div>
|
38 |
+
</div>
|
39 |
+
</div>
|
40 |
+
|
41 |
+
<script type="text/javascript">
|
42 |
+
jQuery(function() {
|
43 |
+
jQuery('#map-container').storeLocator({'slideMap' : true, 'originMarker' : true, 'zoomLevel' : <?php echo $zoomlevel; ?>, 'fullMapStart' : true, 'defaultLoc': true, 'defaultLat': '<?php echo $lat; ?>', 'defaultLng' : '<?php echo $lng; ?>' });
|
44 |
+
});
|
45 |
+
</script>
|
46 |
+
|
47 |
+
|
app/design/frontend/base/default/template/storelocator/storelocator.phtml
ADDED
@@ -0,0 +1,51 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$storeid = Mage::app()->getStore()->getId();
|
3 |
+
$lng = Mage::getStoreConfig('storelocator/settings/defaultlon', $storeid);
|
4 |
+
$lat = Mage::getStoreConfig('storelocator/settings/defaultlat',$storeid);
|
5 |
+
?>
|
6 |
+
<div id="store-locator-container">
|
7 |
+
|
8 |
+
<h1><?php echo $this->__("Store Locator"); ?></h1>
|
9 |
+
<div class="bottom-line"></div>
|
10 |
+
<div id="form-container">
|
11 |
+
<form id="user-location" method="post" action="#">
|
12 |
+
<input type="hidden" name="url" value="<?php echo $this->getBaseUrl() . 'storelocator/index/location'; ?>" id="url">
|
13 |
+
<input type="hidden" name="searchurl" value="<?php echo $this->getBaseUrl() . 'storelocator/index/searchlocation'; ?>" id="searchurl">
|
14 |
+
<input type="hidden" name="url1" value="<?php echo $this->getBaseUrl() . 'storelocator/index/infowindowdescription'; ?>" id="url1">
|
15 |
+
<input type="hidden" name="url2" value="<?php echo $this->getBaseUrl() . 'storelocator/index/locationlistdescription'; ?>" id="url2">
|
16 |
+
<div id="form-input">
|
17 |
+
<label for="address">Enter Name or City or State or Phone or Zip Code:</label>
|
18 |
+
<input type="text" id="address" name="address" class="input-text" />
|
19 |
+
</div>
|
20 |
+
<button id="submit" type="submit">Submit</button>
|
21 |
+
</form>
|
22 |
+
<script type="text/javascript">
|
23 |
+
//<![CDATA[
|
24 |
+
var searchForm = new VarienForm('user-location', true);
|
25 |
+
//]]>
|
26 |
+
</script>
|
27 |
+
</div>
|
28 |
+
<div id="map-container">
|
29 |
+
<div id="loc-list">
|
30 |
+
<ul id="list"></ul>
|
31 |
+
</div>
|
32 |
+
<div id="map"></div>
|
33 |
+
</div>
|
34 |
+
</div>
|
35 |
+
<?php $storeCol = Mage::getModel('storelocator/storelocator')->getCollection()
|
36 |
+
->addFieldToFilter('status',1); ?>
|
37 |
+
<?php if($storeCol->count()): ?>
|
38 |
+
<script type="text/javascript">
|
39 |
+
jQuery(function() {
|
40 |
+
jQuery('#map-container').storeLocator({'slideMap' : false, 'fullMapStart' : true, 'defaultLoc': true, 'defaultLat': '<?php echo $lat; ?>', 'defaultLng' : '<?php echo $lng; ?>' });
|
41 |
+
});
|
42 |
+
</script>
|
43 |
+
<?php else: ?>
|
44 |
+
<script type="text/javascript">
|
45 |
+
jQuery(function() {
|
46 |
+
jQuery('#map-container').storeLocator({'slideMap' : false, 'defaultLoc': true, 'defaultLat': '<?php echo $lat; ?>', 'defaultLng' : '<?php echo $lng; ?>' });
|
47 |
+
});
|
48 |
+
</script>
|
49 |
+
<?php endif ?>
|
50 |
+
|
51 |
+
|
app/etc/modules/Sparx_Storelocator.xml
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
<config>
|
3 |
+
<modules>
|
4 |
+
<Sparx_Storelocator>
|
5 |
+
<active>true</active>
|
6 |
+
<codePool>community</codePool>
|
7 |
+
<version>0.1.0</version>
|
8 |
+
</Sparx_Storelocator>
|
9 |
+
</modules>
|
10 |
+
</config>
|
media/storelocator/images/100X100/1398758372_logo.jpg
ADDED
Binary file
|
media/storelocator/images/110X120/1398758372_logo.jpg
ADDED
Binary file
|
media/storelocator/images/1398758372_logo.jpg
ADDED
Binary file
|
media/storelocator/images/175X120/1398758372_logo.jpg
ADDED
Binary file
|
media/storelocator/images/175X175/1398758372_logo.jpg
ADDED
Binary file
|
media/storelocator/images/250X120/1398758372_logo.jpg
ADDED
Binary file
|
media/storelocator/images/logo.jpg
ADDED
Binary file
|
package.xml
ADDED
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0"?>
|
2 |
+
<package>
|
3 |
+
<name>Sparx_Storelocator</name>
|
4 |
+
<version>0.1.0</version>
|
5 |
+
<stability>stable</stability>
|
6 |
+
<license>Open Software License (OSL)</license>
|
7 |
+
<channel>community</channel>
|
8 |
+
<extends/>
|
9 |
+
<summary>With the help of store locator your customer can easily find out your stores, dealers and products.</summary>
|
10 |
+
<description>With the help of store locator your customer can easily find out your stores, dealers and products.</description>
|
11 |
+
<notes>With the help of store locator your customer can easily find out your stores, dealers and products.</notes>
|
12 |
+
<authors><author><name>Alok</name><user>Alok</user><email>alok.kumar@sparxtechnologies.com</email></author><author><name>Ramesh</name><user>Ramesh</user><email>ramesh@sparxtechnologies.com</email></author></authors>
|
13 |
+
<date>2014-05-26</date>
|
14 |
+
<time>10:54:00</time>
|
15 |
+
<contents><target name="magecommunity"><dir name="Sparx"><dir><dir name="Storelocator"><dir name="Block"><dir name="Adminhtml"><file name="Region.php" hash="550d9365a637103d39320d5d4b1b63ca"/><dir name="Storelocator"><dir name="Edit"><file name="Form.php" hash="3c2e5708202cfae1992c0d61f40da235"/><dir name="Tab"><file name="Form.php" hash="d525c8fa9bd4e6137c44a9836ba4a618"/></dir><file name="Tabs.php" hash="6e207bb287097811b88e204b07adcc20"/></dir><file name="Edit.php" hash="1460b5f28c1e9629ae5f5a087829077a"/><file name="Grid.php" hash="5cdc26bd44bfcb742805a21ff34bd5bb"/></dir><file name="Storelocator.php" hash="f4a0bccfe6ccd8d22f90a82f2835f2fa"/></dir><file name="Storelocator.php" hash="bc921f351a6c0dd78ac1c32a8d4b88b8"/></dir><dir name="Helper"><file name="Data.php" hash="86fe7afa9a9a38e79a783e9063b129b4"/></dir><dir name="Model"><dir name="Mysql4"><dir name="Storelocator"><file name="Collection.php" hash="2d6b9966a360ac0b7eeaf7cf05ffdc63"/></dir><file name="Storelocator.php" hash="dafe05d0aa6101a6d03c4c37d7929678"/></dir><file name="Status.php" hash="7d61b3131d0d0fb360710a9e3d6a8f38"/><file name="Storelocator.php" hash="bd9db3c2d5b23c388fa8d5d54591b428"/></dir><dir name="controllers"><dir name="Adminhtml"><file name="StorelocatorController.php" hash="6575bf85d296b055a710fe6c3da397dd"/></dir><file name="IndexController.php" hash="895e294e0ca275e8e16e8c8291327e1f"/><file name="IndexController.php~" hash="0b3228fa8b2c2c37e1df927d67f299a9"/></dir><dir name="etc"><file name="adminhtml.xml" hash="09890d52d2cea540a576f91da0fcbded"/><file name="config.xml" hash="7a3ff6bf9357ce52c927008864c94e35"/><file name="system.xml" hash="2ea7e533b406a6c5a6556b3dd43af8fe"/></dir><dir name="sql"><dir name="storelocator_setup"><file name="mysql4-install-0.1.0.php" hash="67b368a2037a4fa5249844aed7e4a0a0"/><file name="mysql4-upgrade-0.1.0-0.1.1.php" hash="5e3923f18bd6db5c4a49e0cee4cbc350"/></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Sparx_Storelocator.xml" hash="22bd627c46a723c3d15de483cc670cfd"/></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="storelocator"><file name="a.js~" hash="d41d8cd98f00b204e9800998ecf8427e"/><dir name="css"><file name="map-style.css" hash="4b4ab7443d3f836737ffc05d3f494e27"/><file name="map-style.less" hash="f5db8b390b0b2dde9eddf8d5f76a827d"/><file name="map.css" hash="1dd18292a08e7ca6c750de6d2388c754"/><file name="mapbackup.css" hash="419f881e975781dce04792865094a9c7"/></dir><file name="jquery.storelocator.js~" hash="f04d3c879c93e95e3697781d1633c90a"/><dir name="js"><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="62e492542af80446b4713df5fd229c81"/><file name="jquery.storelocator_1.js" hash="e05d716636b2479a475b353a0453e0d2"/><file name="noConflict.js" hash="3179f2255b046d5f2e9a71e365287bef"/></dir></dir></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="template"><dir name="storelocator"><file name="region.phtml" hash="915c3f3770c031b51d895428c5c68d78"/></dir></dir><dir name="layout"><file name="storelocator.xml" hash="3adedbd44805fa04c71f6482ef83e636"/></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="storelocator.xml" hash="1fe960524a2d01493658fc51b57a4fff"/></dir><dir name="template"><dir name="storelocator"><file name="storedetail.phtml" hash="574932d48c81f4740181b67a1d632530"/><file name="storelocator.phtml" hash="424c9a21ee6e0c54ab33edc4a5fc1c13"/></dir></dir></dir></dir></dir></target><target name="magemedia"><dir name="storelocator"><dir><dir name="images"><dir name="100X100"><file name="1398758372_logo.jpg" hash="fa31e2c7c2a71ee75e75bf033e028e4b"/></dir><dir name="110X120"><file name="1398758372_logo.jpg" hash="be9679b60e6d67ea6227eb844cb5166c"/></dir><file name="1398758372_logo.jpg" hash="c4af7cabd68286e2a38cd87ec9c2cbbf"/><dir name="175X120"><file name="1398758372_logo.jpg" hash="cc911a117a5efb34ac19e269059ec999"/></dir><dir name="175X175"><file name="1398758372_logo.jpg" hash="d015014d7f420b5a07344b61228f1f2e"/></dir><dir name="250X120"><file name="1398758372_logo.jpg" hash="167e65861e9bfd349db773efebe1c778"/></dir><file name="logo.jpg" hash="c4af7cabd68286e2a38cd87ec9c2cbbf"/></dir></dir></dir></target></contents>
|
16 |
+
<compatible/>
|
17 |
+
<dependencies><required><php><min>5.0.1</min><max>6.0.0</max></php></required></dependencies>
|
18 |
+
</package>
|
skin/frontend/base/default/storelocator/a.js~
ADDED
File without changes
|
skin/frontend/base/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/base/default/storelocator/css/map-style.less
ADDED
@@ -0,0 +1,220 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#page-header{
|
2 |
+
float: left;
|
3 |
+
}
|
4 |
+
|
5 |
+
#store-locator-container{
|
6 |
+
float: left;
|
7 |
+
margin-left: 20px;
|
8 |
+
width: 875px;
|
9 |
+
font: normal 12px Arial, Helvetica, sans-serif;
|
10 |
+
color: #333;
|
11 |
+
|
12 |
+
#form-container{
|
13 |
+
clear: left;
|
14 |
+
float: left;
|
15 |
+
margin-top: 15px;
|
16 |
+
width: 100%;
|
17 |
+
}
|
18 |
+
|
19 |
+
#map-container{
|
20 |
+
clear: left;
|
21 |
+
float: left;
|
22 |
+
margin-top: 27px;
|
23 |
+
height: 530px;
|
24 |
+
width: 875px;
|
25 |
+
|
26 |
+
a{
|
27 |
+
color: #e76737;
|
28 |
+
text-decoration: none;
|
29 |
+
&:hover, &:active{
|
30 |
+
text-decoration: underline;
|
31 |
+
}
|
32 |
+
}
|
33 |
+
|
34 |
+
.custom-marker{
|
35 |
+
width: 32px;
|
36 |
+
height: 37px;
|
37 |
+
color: #fff;
|
38 |
+
background: url(../images/custom-marker.png) no-repeat;
|
39 |
+
padding: 3px;
|
40 |
+
cursor: pointer;
|
41 |
+
}
|
42 |
+
}
|
43 |
+
|
44 |
+
#loc-list{
|
45 |
+
float: left;
|
46 |
+
width: 240px;
|
47 |
+
height: 530px;
|
48 |
+
overflow: auto;
|
49 |
+
|
50 |
+
ul{
|
51 |
+
display: block;
|
52 |
+
clear: left;
|
53 |
+
float: left;
|
54 |
+
list-style: none;
|
55 |
+
margin: 0;
|
56 |
+
padding: 0;
|
57 |
+
|
58 |
+
li{
|
59 |
+
display: block;
|
60 |
+
clear: left;
|
61 |
+
float: left;
|
62 |
+
margin: 6px 10px;
|
63 |
+
cursor: pointer;
|
64 |
+
width: 200px;
|
65 |
+
border: 1px solid #fff; /* Adding this to prevent moving li elements when adding the list-focus class*/
|
66 |
+
}
|
67 |
+
}
|
68 |
+
|
69 |
+
.list-label{
|
70 |
+
float: left;
|
71 |
+
margin: 10px 0 0 6px;
|
72 |
+
padding: 2px 3px;
|
73 |
+
width: 17px;
|
74 |
+
text-align: center;
|
75 |
+
background: #451400;
|
76 |
+
color: #fff;
|
77 |
+
font-weight: bold;
|
78 |
+
}
|
79 |
+
|
80 |
+
.list-details{
|
81 |
+
float: left;
|
82 |
+
margin-left: 6px;
|
83 |
+
width: 165px;
|
84 |
+
|
85 |
+
.list-content{
|
86 |
+
padding: 10px;
|
87 |
+
}
|
88 |
+
|
89 |
+
.loc-dist{
|
90 |
+
font-weight: bold;
|
91 |
+
font-style: italic;
|
92 |
+
color: #8e8e8e;
|
93 |
+
}
|
94 |
+
}
|
95 |
+
|
96 |
+
.list-focus{
|
97 |
+
border: 1px solid rgba(82,168,236,0.9);
|
98 |
+
-moz-box-shadow: 0 0 8px rgba(82,168,236,0.7);
|
99 |
+
-webkit-box-shadow: 0 0 8px rgba(82,168,236,0.7);
|
100 |
+
box-shadow: 0 0 8px rgba(82,168,236,0.7);
|
101 |
+
transition: border 0.2s linear 0s, box-shadow 0.2s linear 0s;
|
102 |
+
}
|
103 |
+
}
|
104 |
+
|
105 |
+
.loc-name{
|
106 |
+
/* Picked up by both list and infowindows */
|
107 |
+
color: #AD2118;
|
108 |
+
font-weight: bold;
|
109 |
+
}
|
110 |
+
|
111 |
+
#search-form{
|
112 |
+
clear: left;
|
113 |
+
float: left;
|
114 |
+
height: 60px;
|
115 |
+
}
|
116 |
+
|
117 |
+
#form-input{
|
118 |
+
float: left;
|
119 |
+
margin-top: 3px;
|
120 |
+
|
121 |
+
label{
|
122 |
+
font-weight: bold;
|
123 |
+
}
|
124 |
+
|
125 |
+
input{
|
126 |
+
padding: 4px;
|
127 |
+
line-height: 16px;
|
128 |
+
border: 1px solid #ccc;
|
129 |
+
}
|
130 |
+
}
|
131 |
+
|
132 |
+
#address{
|
133 |
+
margin: 0 0 0 10px;
|
134 |
+
}
|
135 |
+
|
136 |
+
#submit{
|
137 |
+
float: left;
|
138 |
+
cursor: pointer;
|
139 |
+
margin: 3px 0 0 10px;
|
140 |
+
padding: 3px 6px;
|
141 |
+
background: #ae2118;
|
142 |
+
border: 1px solid #961f17;
|
143 |
+
color: #fff;
|
144 |
+
-webkit-border-radius: 4px;
|
145 |
+
border-radius: 4px;
|
146 |
+
}
|
147 |
+
|
148 |
+
#loading-map
|
149 |
+
{
|
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 |
+
|
164 |
+
/* Infowindow Roboto font override */
|
165 |
+
.gm-style div, .gm-style span, .gm-style label, .gm-style a{
|
166 |
+
font-family: Arial, Helvetica, sans-serif;
|
167 |
+
}
|
168 |
+
|
169 |
+
/* Modal window */
|
170 |
+
|
171 |
+
#overlay{
|
172 |
+
position: fixed;
|
173 |
+
left: 0px;
|
174 |
+
top: 0px;
|
175 |
+
width:100%;
|
176 |
+
height:100%;
|
177 |
+
z-index: 10000;
|
178 |
+
background: url(../images/overlay-bg.png) repeat;
|
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 |
+
#modal-content{
|
193 |
+
float: left;
|
194 |
+
padding: 0 22px; /* there's already a margin on the top of the map-container div */
|
195 |
+
}
|
196 |
+
|
197 |
+
#close-icon{
|
198 |
+
position: absolute;
|
199 |
+
top: -6px;
|
200 |
+
right: -6px;
|
201 |
+
width: 18px;
|
202 |
+
height: 18px;
|
203 |
+
cursor: pointer;
|
204 |
+
background: #2c2c2c url(../images/close-icon.png) 3px 3px no-repeat;
|
205 |
+
border: 1px solid #000;
|
206 |
+
border-radius: 3px;
|
207 |
+
box-shadow: 0 0 3px #656565;
|
208 |
+
}
|
209 |
+
}
|
210 |
+
}
|
211 |
+
|
212 |
+
|
213 |
+
/* The following is for the geocode page and not the store locator */
|
214 |
+
|
215 |
+
#geocode-result{
|
216 |
+
clear: left;
|
217 |
+
float: left;
|
218 |
+
margin-top: 30px;
|
219 |
+
width: 100%;
|
220 |
+
}
|
skin/frontend/base/default/storelocator/css/map.css
ADDED
@@ -0,0 +1,250 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#store-locator-container{
|
2 |
+
float: left;
|
3 |
+
max-height: 875px;
|
4 |
+
width:100%;
|
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 |
+
/*max-width: 875px;*/
|
26 |
+
width:100%
|
27 |
+
}
|
28 |
+
|
29 |
+
#map-container a{
|
30 |
+
color: #e76737;
|
31 |
+
text-decoration: none;
|
32 |
+
}
|
33 |
+
|
34 |
+
#map-container a:hover, #map-container a:active{
|
35 |
+
text-decoration: underline;
|
36 |
+
}
|
37 |
+
|
38 |
+
#map-container .custom-marker{
|
39 |
+
width: 32px;
|
40 |
+
height: 37px;
|
41 |
+
color: #fff;
|
42 |
+
background: url(../images/custom-marker.png) no-repeat;
|
43 |
+
padding: 3px;
|
44 |
+
cursor: pointer;
|
45 |
+
}
|
46 |
+
|
47 |
+
#loc-list{
|
48 |
+
float: left;
|
49 |
+
width:27%;
|
50 |
+
height: 530px;
|
51 |
+
overflow: auto;
|
52 |
+
}
|
53 |
+
|
54 |
+
#loc-list ul{
|
55 |
+
display: block;
|
56 |
+
clear: left;
|
57 |
+
float: left;
|
58 |
+
list-style: none;
|
59 |
+
margin: 0;
|
60 |
+
padding: 0;
|
61 |
+
}
|
62 |
+
|
63 |
+
#loc-list .list-label{
|
64 |
+
float: left;
|
65 |
+
margin: 10px 0 0 6px;
|
66 |
+
padding: 2px 3px;
|
67 |
+
width: 17px;
|
68 |
+
text-align: center;
|
69 |
+
background: #451400;
|
70 |
+
color: #fff;
|
71 |
+
font-weight: bold;
|
72 |
+
}
|
73 |
+
|
74 |
+
#loc-list .list-details{
|
75 |
+
float: left;
|
76 |
+
margin-left: 6px;
|
77 |
+
max-width: 165px;
|
78 |
+
width:100%;
|
79 |
+
}
|
80 |
+
|
81 |
+
#loc-list .list-content{
|
82 |
+
padding: 10px;
|
83 |
+
}
|
84 |
+
#loc-list .store-locator-image{
|
85 |
+
padding: 0 10px 10px 10px;
|
86 |
+
}
|
87 |
+
|
88 |
+
#loc-list .loc-dist{
|
89 |
+
font-weight: bold;
|
90 |
+
font-style: italic;
|
91 |
+
color: #8e8e8e;
|
92 |
+
}
|
93 |
+
|
94 |
+
#loc-list li{
|
95 |
+
display: block;
|
96 |
+
clear: left;
|
97 |
+
float: left;
|
98 |
+
margin: 6px 10px;
|
99 |
+
cursor: pointer;
|
100 |
+
max-width: 200px;
|
101 |
+
width:100%;
|
102 |
+
border: 1px solid #fff; /* Adding this to prevent moving li elements when adding the list-focus class*/
|
103 |
+
}
|
104 |
+
|
105 |
+
#loc-list .list-focus{
|
106 |
+
border: 1px solid rgba(82,168,236,0.9);
|
107 |
+
-moz-box-shadow: 0 0 8px rgba(82,168,236,0.7);
|
108 |
+
-webkit-box-shadow: 0 0 8px rgba(82,168,236,0.7);
|
109 |
+
box-shadow: 0 0 8px rgba(82,168,236,0.7);
|
110 |
+
transition: border 0.2s linear 0s, box-shadow 0.2s linear 0s;
|
111 |
+
}
|
112 |
+
|
113 |
+
#map-container .loc-name{
|
114 |
+
color: #AD2118;
|
115 |
+
font-weight: bold;
|
116 |
+
}
|
117 |
+
|
118 |
+
#search-form{
|
119 |
+
clear: left;
|
120 |
+
float: left;
|
121 |
+
height: 60px;
|
122 |
+
}
|
123 |
+
|
124 |
+
#form-input{
|
125 |
+
float: left;
|
126 |
+
margin-top: 3px;
|
127 |
+
margin-left: 36%;
|
128 |
+
}
|
129 |
+
|
130 |
+
#form-input label{
|
131 |
+
font-weight: bold;
|
132 |
+
}
|
133 |
+
|
134 |
+
#form-input input{
|
135 |
+
padding: 4px;
|
136 |
+
line-height: 16px;
|
137 |
+
border: 1px solid #ccc;
|
138 |
+
}
|
139 |
+
|
140 |
+
#address{
|
141 |
+
margin: 0 0 0 10px;
|
142 |
+
}
|
143 |
+
|
144 |
+
#submit{
|
145 |
+
float: left;
|
146 |
+
cursor: pointer;
|
147 |
+
margin: 3px 0 0 10px;
|
148 |
+
padding: 3px 6px;
|
149 |
+
background: #ae2118;
|
150 |
+
border: 1px solid #961f17;
|
151 |
+
color: #fff;
|
152 |
+
-webkit-border-radius: 4px;
|
153 |
+
border-radius: 4px;
|
154 |
+
}
|
155 |
+
|
156 |
+
#loading-map{
|
157 |
+
float: left;
|
158 |
+
margin: 4px 0 0 10px;
|
159 |
+
width: 16px;
|
160 |
+
height: 16px;
|
161 |
+
background: url(../images/ajax-loader.gif) no-repeat;
|
162 |
+
}
|
163 |
+
|
164 |
+
#map{
|
165 |
+
float: left;
|
166 |
+
width: 73%;
|
167 |
+
height: 530px;
|
168 |
+
}
|
169 |
+
|
170 |
+
/* Infowindow Roboto font override */
|
171 |
+
.gm-style div, .gm-style span, .gm-style label, .gm-style a{
|
172 |
+
font-family: Arial, Helvetica, sans-serif;
|
173 |
+
}
|
174 |
+
|
175 |
+
/* Modal window */
|
176 |
+
|
177 |
+
#overlay{
|
178 |
+
position: fixed;
|
179 |
+
left: 0px;
|
180 |
+
top: 0px;
|
181 |
+
width:100%;
|
182 |
+
height:100%;
|
183 |
+
z-index: 10000;
|
184 |
+
background: url(../images/overlay-bg.png) repeat;
|
185 |
+
}
|
186 |
+
|
187 |
+
#modal-window{
|
188 |
+
position: absolute;
|
189 |
+
left: 50%;
|
190 |
+
margin-left: -460px; /* width divided by 2 */
|
191 |
+
margin-top: 60px;
|
192 |
+
width: 920px;
|
193 |
+
height: 590px;
|
194 |
+
z-index: 10010;
|
195 |
+
background: #fff;
|
196 |
+
border-radius: 10px;
|
197 |
+
box-shadow: 0 0 10px #656565;
|
198 |
+
}
|
199 |
+
|
200 |
+
#modal-content{
|
201 |
+
float: left;
|
202 |
+
padding: 0 22px; /* there's already a margin on the top of the map-container div */
|
203 |
+
}
|
204 |
+
|
205 |
+
#close-icon{
|
206 |
+
position: absolute;
|
207 |
+
top: -6px;
|
208 |
+
right: -6px;
|
209 |
+
width: 18px;
|
210 |
+
height: 18px;
|
211 |
+
cursor: pointer;
|
212 |
+
background: #2c2c2c url(../images/close-icon.png) 3px 3px no-repeat;
|
213 |
+
border: 1px solid #000;
|
214 |
+
border-radius: 3px;
|
215 |
+
box-shadow: 0 0 3px #656565;
|
216 |
+
}
|
217 |
+
|
218 |
+
|
219 |
+
/* The following is for the geocode page and not the store locator */
|
220 |
+
|
221 |
+
#geocode-result{
|
222 |
+
clear: left;
|
223 |
+
float: left;
|
224 |
+
margin-top: 30px;
|
225 |
+
width: 100%;
|
226 |
+
}
|
227 |
+
.bottom-line{
|
228 |
+
clear: left;
|
229 |
+
float: left;
|
230 |
+
border-bottom: 1px solid #CCCCCC;
|
231 |
+
margin-top: 5px;
|
232 |
+
width: 100%;
|
233 |
+
}
|
234 |
+
.detail-label{
|
235 |
+
font-weight: bold;
|
236 |
+
}
|
237 |
+
/************************************For responsive view*************************/
|
238 |
+
@media only screen and (max-width:1260px) {
|
239 |
+
.main-container, .footer-container{ padding:10px;}
|
240 |
+
#loc-list,#map,#store-locator-container{ float:none; width:100%;}
|
241 |
+
#user-location #form-input{ margin-left:0px;}
|
242 |
+
#map-container{ height:inherit;}
|
243 |
+
#store-locator-container #form-input #address{ max-width:365px; width:100%!important; margin:15px 0px;}
|
244 |
+
}
|
245 |
+
@media only screen and (min-width: 768px) and (max-width: 1260px) {
|
246 |
+
|
247 |
+
|
248 |
+
}
|
249 |
+
@media only screen and (max-width: 767px) {}
|
250 |
+
@media only screen and (min-width: 480px) and (max-width: 767px) {}
|
skin/frontend/base/default/storelocator/css/mapbackup.css
ADDED
@@ -0,0 +1,244 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
max-width: 875px;
|
26 |
+
width:100%
|
27 |
+
}
|
28 |
+
|
29 |
+
#map-container a{
|
30 |
+
color: #e76737;
|
31 |
+
text-decoration: none;
|
32 |
+
}
|
33 |
+
|
34 |
+
#map-container a:hover, #map-container a:active{
|
35 |
+
text-decoration: underline;
|
36 |
+
}
|
37 |
+
|
38 |
+
#map-container .custom-marker{
|
39 |
+
width: 32px;
|
40 |
+
height: 37px;
|
41 |
+
color: #fff;
|
42 |
+
background: url(../images/custom-marker.png) no-repeat;
|
43 |
+
padding: 3px;
|
44 |
+
cursor: pointer;
|
45 |
+
}
|
46 |
+
|
47 |
+
#loc-list{
|
48 |
+
float: left;
|
49 |
+
width: 240px;
|
50 |
+
height: 530px;
|
51 |
+
overflow: auto;
|
52 |
+
}
|
53 |
+
|
54 |
+
#loc-list ul{
|
55 |
+
display: block;
|
56 |
+
clear: left;
|
57 |
+
float: left;
|
58 |
+
list-style: none;
|
59 |
+
margin: 0;
|
60 |
+
padding: 0;
|
61 |
+
}
|
62 |
+
|
63 |
+
#loc-list .list-label{
|
64 |
+
float: left;
|
65 |
+
margin: 10px 0 0 6px;
|
66 |
+
padding: 2px 3px;
|
67 |
+
width: 17px;
|
68 |
+
text-align: center;
|
69 |
+
background: #451400;
|
70 |
+
color: #fff;
|
71 |
+
font-weight: bold;
|
72 |
+
}
|
73 |
+
|
74 |
+
#loc-list .list-details{
|
75 |
+
float: left;
|
76 |
+
margin-left: 6px;
|
77 |
+
width: 165px;
|
78 |
+
}
|
79 |
+
|
80 |
+
#loc-list .list-content{
|
81 |
+
padding: 10px;
|
82 |
+
}
|
83 |
+
#loc-list .store-locator-image{
|
84 |
+
padding: 0 10px 10px 10px;
|
85 |
+
}
|
86 |
+
|
87 |
+
#loc-list .loc-dist{
|
88 |
+
font-weight: bold;
|
89 |
+
font-style: italic;
|
90 |
+
color: #8e8e8e;
|
91 |
+
}
|
92 |
+
|
93 |
+
#loc-list li{
|
94 |
+
display: block;
|
95 |
+
clear: left;
|
96 |
+
float: left;
|
97 |
+
margin: 6px 10px;
|
98 |
+
cursor: pointer;
|
99 |
+
width: 200px;
|
100 |
+
border: 1px solid #fff; /* Adding this to prevent moving li elements when adding the list-focus class*/
|
101 |
+
}
|
102 |
+
|
103 |
+
#loc-list .list-focus{
|
104 |
+
border: 1px solid rgba(82,168,236,0.9);
|
105 |
+
-moz-box-shadow: 0 0 8px rgba(82,168,236,0.7);
|
106 |
+
-webkit-box-shadow: 0 0 8px rgba(82,168,236,0.7);
|
107 |
+
box-shadow: 0 0 8px rgba(82,168,236,0.7);
|
108 |
+
transition: border 0.2s linear 0s, box-shadow 0.2s linear 0s;
|
109 |
+
}
|
110 |
+
|
111 |
+
#map-container .loc-name{
|
112 |
+
color: #AD2118;
|
113 |
+
font-weight: bold;
|
114 |
+
}
|
115 |
+
|
116 |
+
#search-form{
|
117 |
+
clear: left;
|
118 |
+
float: left;
|
119 |
+
height: 60px;
|
120 |
+
}
|
121 |
+
|
122 |
+
#form-input{
|
123 |
+
float: left;
|
124 |
+
margin-top: 3px;
|
125 |
+
margin-left: 335px;
|
126 |
+
}
|
127 |
+
|
128 |
+
#form-input label{
|
129 |
+
font-weight: bold;
|
130 |
+
}
|
131 |
+
|
132 |
+
#form-input input{
|
133 |
+
padding: 4px;
|
134 |
+
line-height: 16px;
|
135 |
+
border: 1px solid #ccc;
|
136 |
+
}
|
137 |
+
|
138 |
+
#address{
|
139 |
+
margin: 0 0 0 10px;
|
140 |
+
}
|
141 |
+
|
142 |
+
#submit{
|
143 |
+
float: left;
|
144 |
+
cursor: pointer;
|
145 |
+
margin: 3px 0 0 10px;
|
146 |
+
padding: 3px 6px;
|
147 |
+
background: #ae2118;
|
148 |
+
border: 1px solid #961f17;
|
149 |
+
color: #fff;
|
150 |
+
-webkit-border-radius: 4px;
|
151 |
+
border-radius: 4px;
|
152 |
+
}
|
153 |
+
|
154 |
+
#loading-map{
|
155 |
+
float: left;
|
156 |
+
margin: 4px 0 0 10px;
|
157 |
+
width: 16px;
|
158 |
+
height: 16px;
|
159 |
+
background: url(../images/ajax-loader.gif) no-repeat;
|
160 |
+
}
|
161 |
+
|
162 |
+
#map{
|
163 |
+
float: left;
|
164 |
+
width: 635px;
|
165 |
+
height: 530px;
|
166 |
+
}
|
167 |
+
|
168 |
+
/* Infowindow Roboto font override */
|
169 |
+
.gm-style div, .gm-style span, .gm-style label, .gm-style a{
|
170 |
+
font-family: Arial, Helvetica, sans-serif;
|
171 |
+
}
|
172 |
+
|
173 |
+
/* Modal window */
|
174 |
+
|
175 |
+
#overlay{
|
176 |
+
position: fixed;
|
177 |
+
left: 0px;
|
178 |
+
top: 0px;
|
179 |
+
width:100%;
|
180 |
+
height:100%;
|
181 |
+
z-index: 10000;
|
182 |
+
background: url(../images/overlay-bg.png) repeat;
|
183 |
+
}
|
184 |
+
|
185 |
+
#modal-window{
|
186 |
+
position: absolute;
|
187 |
+
left: 50%;
|
188 |
+
margin-left: -460px; /* width divided by 2 */
|
189 |
+
margin-top: 60px;
|
190 |
+
width: 920px;
|
191 |
+
height: 590px;
|
192 |
+
z-index: 10010;
|
193 |
+
background: #fff;
|
194 |
+
border-radius: 10px;
|
195 |
+
box-shadow: 0 0 10px #656565;
|
196 |
+
}
|
197 |
+
|
198 |
+
#modal-content{
|
199 |
+
float: left;
|
200 |
+
padding: 0 22px; /* there's already a margin on the top of the map-container div */
|
201 |
+
}
|
202 |
+
|
203 |
+
#close-icon{
|
204 |
+
position: absolute;
|
205 |
+
top: -6px;
|
206 |
+
right: -6px;
|
207 |
+
width: 18px;
|
208 |
+
height: 18px;
|
209 |
+
cursor: pointer;
|
210 |
+
background: #2c2c2c url(../images/close-icon.png) 3px 3px no-repeat;
|
211 |
+
border: 1px solid #000;
|
212 |
+
border-radius: 3px;
|
213 |
+
box-shadow: 0 0 3px #656565;
|
214 |
+
}
|
215 |
+
|
216 |
+
|
217 |
+
/* The following is for the geocode page and not the store locator */
|
218 |
+
|
219 |
+
#geocode-result{
|
220 |
+
clear: left;
|
221 |
+
float: left;
|
222 |
+
margin-top: 30px;
|
223 |
+
width: 100%;
|
224 |
+
}
|
225 |
+
.bottom-line{
|
226 |
+
clear: left;
|
227 |
+
float: left;
|
228 |
+
border-bottom: 1px solid #CCCCCC;
|
229 |
+
margin-top: 5px;
|
230 |
+
width: 100%;
|
231 |
+
}
|
232 |
+
.detail-label{
|
233 |
+
font-weight: bold;
|
234 |
+
}
|
235 |
+
/************************************For responsive view*************************/
|
236 |
+
@media only screen and (max-width:875px) {
|
237 |
+
.map-container{ float:none; width:100%;}
|
238 |
+
}
|
239 |
+
@media only screen and (min-width: 768px) and (max-width: 875px) {
|
240 |
+
|
241 |
+
|
242 |
+
}
|
243 |
+
@media only screen and (max-width: 767px) {}
|
244 |
+
@media only screen and (min-width: 480px) and (max-width: 767px) {}
|
skin/frontend/base/default/storelocator/jquery.storelocator.js~
ADDED
@@ -0,0 +1,815 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
var url = jQuery("#url").val();
|
11 |
+
var url1 = jQuery("#url1").val();
|
12 |
+
var url2 = jQuery("#url2").val();
|
13 |
+
var settings = $.extend( {
|
14 |
+
'mapDiv': 'map',
|
15 |
+
'listDiv': 'loc-list',
|
16 |
+
'formContainerDiv': 'form-container',
|
17 |
+
'formID': 'user-location',
|
18 |
+
'inputID': 'address',
|
19 |
+
'zoomLevel': 12,
|
20 |
+
'pinColor': 'fe7569',
|
21 |
+
'pinTextColor': '000000',
|
22 |
+
'lengthUnit': 'm',
|
23 |
+
'storeLimit': 100,
|
24 |
+
'distanceAlert': 60,
|
25 |
+
'dataType': 'xml',
|
26 |
+
'dataLocation': url,
|
27 |
+
'searchdataLocation': jQuery("#searchurl").val(),
|
28 |
+
'listColor1': 'ffffff',
|
29 |
+
'listColor2': 'eeeeee',
|
30 |
+
'originMarker': false,
|
31 |
+
'originpinColor': 'blue',
|
32 |
+
'bounceMarker': true,
|
33 |
+
'slideMap': true,
|
34 |
+
'modalWindow': false,
|
35 |
+
'overlayDiv': 'overlay',
|
36 |
+
'modalWindowDiv': 'modal-window',
|
37 |
+
'modalContentDiv': 'modal-content',
|
38 |
+
'modalCloseIconDiv': 'close-icon',
|
39 |
+
'defaultLoc': false,
|
40 |
+
'defaultLat': '',
|
41 |
+
'defaultLng': '',
|
42 |
+
'autoGeocode': false,
|
43 |
+
'maxDistance': false,
|
44 |
+
'maxDistanceID': 'maxdistance',
|
45 |
+
'fullMapStart': false,
|
46 |
+
'noForm': false,
|
47 |
+
'loading': false,
|
48 |
+
'loadingDiv': 'loading-map',
|
49 |
+
'featuredLocations': false,
|
50 |
+
'infowindowTemplatePath': url1,
|
51 |
+
'listTemplatePath': url2,
|
52 |
+
//'KMLinfowindowTemplatePath': url+'app/design/frontend/default/ramesh/template/storelocator/templates/kml-infowindow-description.html',
|
53 |
+
//'KMLlistTemplatePath': url+'app/design/frontend/default/ramesh/template/storelocator/templates/kml-location-list-description.html',
|
54 |
+
'callbackBeforeSend': null,
|
55 |
+
'callbackComplete': null,
|
56 |
+
'callbackSuccess': null,
|
57 |
+
'callbackModalOpen': null,
|
58 |
+
'callbackModalClose': null,
|
59 |
+
'jsonpCallback': null,
|
60 |
+
//Language options
|
61 |
+
'geocodeErrorAlert': 'Geocode was not successful for the following reason: ',
|
62 |
+
'addressErrorAlert' : 'Unable to find address',
|
63 |
+
'autoGeocodeErrorAlert': 'Automatic location detection failed. Please fill in your address or zip code.',
|
64 |
+
'distanceErrorAlert': 'Unfortunately, our closest location is more than ',
|
65 |
+
'mileLang': 'mile',
|
66 |
+
'milesLang': 'miles',
|
67 |
+
'kilometerLang': 'kilometer',
|
68 |
+
'kilometersLang': 'kilometers'
|
69 |
+
}, options);
|
70 |
+
|
71 |
+
return this.each(function() {
|
72 |
+
|
73 |
+
var $this = $(this);
|
74 |
+
var listTemplate, infowindowTemplate;
|
75 |
+
|
76 |
+
load_templates();
|
77 |
+
|
78 |
+
//First load external templates and compile with Handlebars - make sure the templates are compiled before moving on
|
79 |
+
function load_templates(){
|
80 |
+
|
81 |
+
if(settings.dataType === 'kml'){
|
82 |
+
//KML infowindows
|
83 |
+
$.get(settings.KMLinfowindowTemplatePath, function(template) {
|
84 |
+
var source = template;
|
85 |
+
infowindowTemplate = Handlebars.compile(source);
|
86 |
+
});
|
87 |
+
//KML locations list
|
88 |
+
$.get(settings.KMLlistTemplatePath, function(template) {
|
89 |
+
var source = template;
|
90 |
+
listTemplate = Handlebars.compile(source);
|
91 |
+
|
92 |
+
//After loading move on to the main script
|
93 |
+
locator();
|
94 |
+
});
|
95 |
+
}
|
96 |
+
else{
|
97 |
+
//Infowindows
|
98 |
+
$.get(settings.infowindowTemplatePath, function(template) {
|
99 |
+
var source = template;
|
100 |
+
infowindowTemplate = Handlebars.compile(source);
|
101 |
+
});
|
102 |
+
//Locations list
|
103 |
+
$.get(settings.listTemplatePath, function(template) {
|
104 |
+
var source = template;
|
105 |
+
listTemplate = Handlebars.compile(source);
|
106 |
+
|
107 |
+
//After loading move on to the main script
|
108 |
+
locator();
|
109 |
+
});
|
110 |
+
}
|
111 |
+
}
|
112 |
+
|
113 |
+
//The main script
|
114 |
+
function locator(){
|
115 |
+
|
116 |
+
var userinput, olat, olng, marker, letter, storenum;
|
117 |
+
var locationset = [];
|
118 |
+
var featuredset = [];
|
119 |
+
var normalset = [];
|
120 |
+
var markers = [];
|
121 |
+
var prefix = 'storeLocator';
|
122 |
+
|
123 |
+
//Resets for multiple re-submissions
|
124 |
+
function reset(){
|
125 |
+
locationset = [];
|
126 |
+
featuredset = [];
|
127 |
+
normalset = [];
|
128 |
+
markers = [];
|
129 |
+
$(document).off('click.'+prefix, '#' + settings.listDiv + ' li');
|
130 |
+
}
|
131 |
+
|
132 |
+
//Add modal window divs if set
|
133 |
+
if(settings.modalWindow === true){
|
134 |
+
$this.wrap('<div id="' + settings.overlayDiv + '"><div id="' + settings.modalWindowDiv + '"><div id="' + settings.modalContentDiv + '">');
|
135 |
+
$('#' + settings.modalWindowDiv).prepend('<div id="' + settings.modalCloseIconDiv + '"><\/div>');
|
136 |
+
$('#' + settings.overlayDiv).hide();
|
137 |
+
}
|
138 |
+
|
139 |
+
if(settings.slideMap === true){
|
140 |
+
//Let's hide the map container to begin
|
141 |
+
$this.hide();
|
142 |
+
}
|
143 |
+
|
144 |
+
//Calculate geocode distance functions - you could use Google's distance service instead
|
145 |
+
var GeoCodeCalc = {};
|
146 |
+
if(settings.lengthUnit === "km"){
|
147 |
+
//Kilometers
|
148 |
+
GeoCodeCalc.EarthRadius = 6367.0;
|
149 |
+
}
|
150 |
+
else{
|
151 |
+
//Default is miles
|
152 |
+
GeoCodeCalc.EarthRadius = 3956.0;
|
153 |
+
}
|
154 |
+
GeoCodeCalc.ToRadian = function(v) { return v * (Math.PI / 180);};
|
155 |
+
GeoCodeCalc.DiffRadian = function(v1, v2) {
|
156 |
+
return GeoCodeCalc.ToRadian(v2) - GeoCodeCalc.ToRadian(v1);
|
157 |
+
};
|
158 |
+
GeoCodeCalc.CalcDistance = function(lat1, lng1, lat2, lng2, radius) {
|
159 |
+
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) ) ) ) );
|
160 |
+
};
|
161 |
+
|
162 |
+
start();
|
163 |
+
|
164 |
+
function start(){
|
165 |
+
//If a default location is set
|
166 |
+
if(settings.defaultLoc === true){
|
167 |
+
//The address needs to be determined for the directions link
|
168 |
+
var r = new ReverseGoogleGeocode();
|
169 |
+
var latlng = new google.maps.LatLng(settings.defaultLat, settings.defaultLng);
|
170 |
+
r.geocode(latlng, function(data) {
|
171 |
+
if(data !== null) {
|
172 |
+
var originAddress = data.address;
|
173 |
+
mapping(settings.defaultLat, settings.defaultLng, originAddress);
|
174 |
+
} else {
|
175 |
+
//Unable to geocode
|
176 |
+
alert(settings.addressErrorAlert);
|
177 |
+
}
|
178 |
+
});
|
179 |
+
}
|
180 |
+
|
181 |
+
//If show full map option is true
|
182 |
+
if(settings.fullMapStart === true){
|
183 |
+
//Just do the mapping without an origin
|
184 |
+
mapping();
|
185 |
+
}
|
186 |
+
|
187 |
+
//HTML5 geolocation API option
|
188 |
+
if(settings.autoGeocode === true){
|
189 |
+
if (navigator.geolocation) {
|
190 |
+
navigator.geolocation.getCurrentPosition(autoGeocode_query, autoGeocode_error);
|
191 |
+
}
|
192 |
+
}
|
193 |
+
}
|
194 |
+
|
195 |
+
//Geocode function for the origin location
|
196 |
+
function GoogleGeocode(){
|
197 |
+
geocoder = new google.maps.Geocoder();
|
198 |
+
this.geocode = function(address, callbackFunction) {
|
199 |
+
geocoder.geocode( { 'address': address}, function(results, status) {
|
200 |
+
if (status === google.maps.GeocoderStatus.OK) {
|
201 |
+
var result = {};
|
202 |
+
result.latitude = results[0].geometry.location.lat();
|
203 |
+
result.longitude = results[0].geometry.location.lng();
|
204 |
+
callbackFunction(result);
|
205 |
+
} else {
|
206 |
+
alert(settings.geocodeErrorAlert + status);
|
207 |
+
callbackFunction(null);
|
208 |
+
}
|
209 |
+
});
|
210 |
+
};
|
211 |
+
}
|
212 |
+
|
213 |
+
//Reverse geocode to get address for automatic options needed for directions link
|
214 |
+
function ReverseGoogleGeocode(){
|
215 |
+
geocoder = new google.maps.Geocoder();
|
216 |
+
this.geocode = function(latlng, callbackFunction) {
|
217 |
+
geocoder.geocode( {'latLng': latlng}, function(results, status) {
|
218 |
+
if (status === google.maps.GeocoderStatus.OK) {
|
219 |
+
if (results[0]) {
|
220 |
+
var result = {};
|
221 |
+
result.address = results[0].formatted_address;
|
222 |
+
callbackFunction(result);
|
223 |
+
}
|
224 |
+
} else {
|
225 |
+
alert(settings.geocodeErrorAlert + status);
|
226 |
+
callbackFunction(null);
|
227 |
+
}
|
228 |
+
});
|
229 |
+
};
|
230 |
+
}
|
231 |
+
|
232 |
+
//Used to round miles to display
|
233 |
+
function roundNumber(num, dec){
|
234 |
+
return Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
|
235 |
+
}
|
236 |
+
|
237 |
+
//If location is detected automatically
|
238 |
+
function autoGeocode_query(position){
|
239 |
+
//The address needs to be determined for the directions link
|
240 |
+
var r = new ReverseGoogleGeocode();
|
241 |
+
var latlng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
|
242 |
+
r.geocode(latlng, function(data) {
|
243 |
+
if(data !== null) {
|
244 |
+
var originAddress = data.address;
|
245 |
+
mapping(position.coords.latitude, position.coords.longitude, originAddress);
|
246 |
+
} else {
|
247 |
+
//Unable to geocode
|
248 |
+
alert(settings.addressErrorAlert);
|
249 |
+
}
|
250 |
+
});
|
251 |
+
}
|
252 |
+
|
253 |
+
function autoGeocode_error(error){
|
254 |
+
//If automatic detection doesn't work show an error
|
255 |
+
alert(settings.autoGeocodeErrorAlert);
|
256 |
+
}
|
257 |
+
|
258 |
+
//Set up the normal mapping
|
259 |
+
function begin_mapping(distance){
|
260 |
+
var searchzipcode='a';
|
261 |
+
//Get the user input and use it
|
262 |
+
var userinput = $('#' + settings.inputID).val();
|
263 |
+
|
264 |
+
if (userinput === ""){
|
265 |
+
start();
|
266 |
+
}
|
267 |
+
else{
|
268 |
+
var g = new GoogleGeocode();
|
269 |
+
var address = userinput;
|
270 |
+
g.geocode(address, function(data) {
|
271 |
+
if(data !== null) {
|
272 |
+
olat = data.latitude;
|
273 |
+
olng = data.longitude;
|
274 |
+
mapping(olat, olng, userinput, distance,searchzipcode);
|
275 |
+
} else {
|
276 |
+
//Unable to geocode
|
277 |
+
alert(settings.addressErrorAlert);
|
278 |
+
}
|
279 |
+
});
|
280 |
+
}
|
281 |
+
}
|
282 |
+
|
283 |
+
//Process form input
|
284 |
+
$(function(){
|
285 |
+
//Handle form submission
|
286 |
+
function get_form_values(e){
|
287 |
+
//Stop the form submission
|
288 |
+
e.preventDefault();
|
289 |
+
|
290 |
+
if(settings.maxDistance === true){
|
291 |
+
var maxDistance = $('#' + settings.maxDistanceID).val();
|
292 |
+
//Start the mapping
|
293 |
+
begin_mapping(maxDistance);
|
294 |
+
}
|
295 |
+
else{
|
296 |
+
//Start the mapping
|
297 |
+
begin_mapping();
|
298 |
+
}
|
299 |
+
}
|
300 |
+
|
301 |
+
//ASP.net or regular submission?
|
302 |
+
if(settings.noForm === true){
|
303 |
+
$(document).on('click.'+prefix, '#' + settings.formContainerDiv + ' #submit', function(e){
|
304 |
+
get_form_values(e);
|
305 |
+
});
|
306 |
+
$(document).on('keyup.'+prefix, function(e){
|
307 |
+
if (e.keyCode === 13 && $('#' + settings.inputID).is(':focus')) {
|
308 |
+
get_form_values(e);
|
309 |
+
}
|
310 |
+
});
|
311 |
+
}
|
312 |
+
else{
|
313 |
+
$(document).on('submit.'+prefix, '#' + settings.formID, function(e){
|
314 |
+
get_form_values(e);
|
315 |
+
});
|
316 |
+
}
|
317 |
+
});
|
318 |
+
|
319 |
+
//Now all the mapping stuff
|
320 |
+
function mapping(orig_lat, orig_lng, origin, maxDistance,s){
|
321 |
+
$(function(){
|
322 |
+
|
323 |
+
// Enable the visual refresh https://developers.google.com/maps/documentation/javascript/basics#VisualRefresh
|
324 |
+
google.maps.visualRefresh = true;
|
325 |
+
|
326 |
+
var dataTypeRead;
|
327 |
+
|
328 |
+
//KML is read as XML
|
329 |
+
if(settings.dataType === 'kml'){
|
330 |
+
dataTypeRead = "xml";
|
331 |
+
}
|
332 |
+
else{
|
333 |
+
dataTypeRead = settings.dataType;
|
334 |
+
}
|
335 |
+
|
336 |
+
var dataurl;
|
337 |
+
var zipcode = $('#' + settings.inputID).val();
|
338 |
+
dataurl = (s)?settings.searchdataLocation+"?zipcode="+zipcode:(settings.dataLocation + (settings.dataType === 'jsonp' ? (settings.dataLocation.match(/\?/) ? '&' : '?') + 'callback=?' : ''));
|
339 |
+
//Process the data
|
340 |
+
$.ajax({
|
341 |
+
type: "GET",
|
342 |
+
url: settings.dataLocation + (settings.dataType === 'jsonp' ? (settings.dataLocation.match(/\?/) ? '&' : '?') + 'callback=?' : ''),
|
343 |
+
dataType: dataTypeRead,
|
344 |
+
jsonpCallback: (settings.dataType === 'jsonp' ? settings.jsonpCallback : null),
|
345 |
+
beforeSend: function (){
|
346 |
+
// Callback
|
347 |
+
if(settings.callbackBeforeSend){
|
348 |
+
settings.callbackBeforeSend.call(this);
|
349 |
+
}
|
350 |
+
|
351 |
+
//Loading
|
352 |
+
if(settings.loading === true){
|
353 |
+
$('#' + settings.formContainerDiv).append('<div id="' + settings.loadingDiv +'"><\/div>');
|
354 |
+
}
|
355 |
+
|
356 |
+
},
|
357 |
+
complete: function (event, request, options){
|
358 |
+
// Callback
|
359 |
+
if(settings.callbackComplete){
|
360 |
+
settings.callbackComplete.call(this, event, request, options);
|
361 |
+
}
|
362 |
+
|
363 |
+
//Loading remove
|
364 |
+
if(settings.loading === true){
|
365 |
+
$('#' + settings.loadingDiv).remove();
|
366 |
+
}
|
367 |
+
},
|
368 |
+
success: function (data, xhr, options){
|
369 |
+
// Callback
|
370 |
+
if(settings.callbackSuccess){
|
371 |
+
settings.callbackSuccess.call(this, data, xhr, options);
|
372 |
+
}
|
373 |
+
|
374 |
+
//After the store locations file has been read successfully
|
375 |
+
var i = 0;
|
376 |
+
var firstRun;
|
377 |
+
|
378 |
+
//Set a variable for fullMapStart so we can detect the first run
|
379 |
+
if(settings.fullMapStart === true && $('#' + settings.mapDiv).hasClass('mapOpen') === false){
|
380 |
+
firstRun = true;
|
381 |
+
}
|
382 |
+
else{
|
383 |
+
reset();
|
384 |
+
}
|
385 |
+
|
386 |
+
$('#' + settings.mapDiv).addClass('mapOpen');
|
387 |
+
|
388 |
+
//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
|
389 |
+
if(settings.dataType === 'json' || settings.dataType === 'jsonp'){
|
390 |
+
//Process JSON
|
391 |
+
$.each(data, function(){
|
392 |
+
var key, value, locationData = {};
|
393 |
+
|
394 |
+
// Parse each data variables
|
395 |
+
for( key in this ){
|
396 |
+
value = this[key];
|
397 |
+
|
398 |
+
if(key === 'web'){
|
399 |
+
if ( value ) value = value.replace("http://",""); // Remove scheme (todo: should NOT be done)
|
400 |
+
}
|
401 |
+
|
402 |
+
locationData[key] = value;
|
403 |
+
}
|
404 |
+
|
405 |
+
if(!locationData['distance']){
|
406 |
+
locationData['distance'] = GeoCodeCalc.CalcDistance(orig_lat,orig_lng,locationData['lat'],locationData['lng'], GeoCodeCalc.EarthRadius);
|
407 |
+
}
|
408 |
+
|
409 |
+
//Create the array
|
410 |
+
if(settings.maxDistance === true && firstRun !== true && maxDistance){
|
411 |
+
if(locationData['distance'] < maxDistance){
|
412 |
+
locationset[i] = locationData;
|
413 |
+
}
|
414 |
+
else{
|
415 |
+
return;
|
416 |
+
}
|
417 |
+
}
|
418 |
+
else{
|
419 |
+
locationset[i] = locationData;
|
420 |
+
}
|
421 |
+
|
422 |
+
i++;
|
423 |
+
});
|
424 |
+
}
|
425 |
+
else if(settings.dataType === 'kml'){
|
426 |
+
//Process KML
|
427 |
+
$(data).find('Placemark').each(function(){
|
428 |
+
var locationData = {
|
429 |
+
'name': $(this).find('name').text(),
|
430 |
+
'lat': $(this).find('coordinates').text().split(",")[1],
|
431 |
+
'lng': $(this).find('coordinates').text().split(",")[0],
|
432 |
+
'description': $(this).find('description').text()
|
433 |
+
};
|
434 |
+
|
435 |
+
locationData['distance'] = GeoCodeCalc.CalcDistance(orig_lat,orig_lng,locationData['lat'],locationData['lng'], GeoCodeCalc.EarthRadius);
|
436 |
+
|
437 |
+
//Create the array
|
438 |
+
if(settings.maxDistance === true && firstRun !== true && maxDistance){
|
439 |
+
if(locationData['distance'] < maxDistance){
|
440 |
+
locationset[i] = locationData;
|
441 |
+
}
|
442 |
+
else{
|
443 |
+
return;
|
444 |
+
}
|
445 |
+
}
|
446 |
+
else{
|
447 |
+
locationset[i] = locationData;
|
448 |
+
}
|
449 |
+
|
450 |
+
i++;
|
451 |
+
});
|
452 |
+
}
|
453 |
+
else{
|
454 |
+
//Process XML
|
455 |
+
$(data).find('marker').each(function(){
|
456 |
+
var locationData = {
|
457 |
+
'name': $(this).attr('name'),
|
458 |
+
'lat': $(this).attr('lat'),
|
459 |
+
'lng': $(this).attr('lng'),
|
460 |
+
'address': $(this).attr('address'),
|
461 |
+
'address2': $(this).attr('address2'),
|
462 |
+
'city': $(this).attr('city'),
|
463 |
+
'state': $(this).attr('state'),
|
464 |
+
'postal': $(this).attr('postal'),
|
465 |
+
'country': $(this).attr('country'),
|
466 |
+
'phone': $(this).attr('phone'),
|
467 |
+
'email': $(this).attr('email'),
|
468 |
+
'web': $(this).attr('web'),
|
469 |
+
'hours1': $(this).attr('hours1'),
|
470 |
+
'hours2': $(this).attr('hours2'),
|
471 |
+
'hours3': $(this).attr('hours3'),
|
472 |
+
'category': $(this).attr('category'),
|
473 |
+
'featured': $(this).attr('featured')
|
474 |
+
};
|
475 |
+
|
476 |
+
if(locationData['web']) locationData['web'] = locationData['web'].replace("http://",""); // Remove scheme (todo: should NOT be done)
|
477 |
+
|
478 |
+
locationData['distance'] = GeoCodeCalc.CalcDistance(orig_lat,orig_lng,locationData['lat'],locationData['lng'], GeoCodeCalc.EarthRadius);
|
479 |
+
|
480 |
+
//Create the array
|
481 |
+
if(settings.maxDistance === true && firstRun !== true && maxDistance){
|
482 |
+
if(locationData['distance'] < maxDistance){
|
483 |
+
locationset[i] = locationData;
|
484 |
+
}
|
485 |
+
else{
|
486 |
+
return;
|
487 |
+
}
|
488 |
+
}
|
489 |
+
else{
|
490 |
+
locationset[i] = locationData;
|
491 |
+
}
|
492 |
+
|
493 |
+
i++;
|
494 |
+
});
|
495 |
+
}
|
496 |
+
|
497 |
+
//Distance sorting function
|
498 |
+
function sort_numerically(locationsarray){
|
499 |
+
locationsarray.sort(function(a, b){
|
500 |
+
return ((a['distance'] < b['distance']) ? -1 : ((a['distance'] > b['distance']) ? 1 : 0));
|
501 |
+
});
|
502 |
+
}
|
503 |
+
|
504 |
+
//Sort the multi-dimensional array by distance
|
505 |
+
sort_numerically(locationset);
|
506 |
+
|
507 |
+
//Featured locations filtering
|
508 |
+
if(settings.featuredLocations === true){
|
509 |
+
//Create array for featured locations
|
510 |
+
featuredset = $.grep(locationset, function(val, i){
|
511 |
+
return val['featured'] === "true";
|
512 |
+
});
|
513 |
+
|
514 |
+
//Create array for normal locations
|
515 |
+
normalset = $.grep(locationset, function(val, i){
|
516 |
+
return val['featured'] !== "true";
|
517 |
+
});
|
518 |
+
|
519 |
+
//Combine the arrays
|
520 |
+
locationset = [];
|
521 |
+
locationset = featuredset.concat(normalset);
|
522 |
+
}
|
523 |
+
|
524 |
+
//Get the length unit
|
525 |
+
var distUnit = (settings.lengthUnit === "km") ? settings.kilometersLang : settings.milesLang ;
|
526 |
+
|
527 |
+
//Check the closest marker
|
528 |
+
if(settings.maxDistance === true && firstRun !== true && maxDistance){
|
529 |
+
if(locationset[0] === undefined || locationset[0]['distance'] > maxDistance){
|
530 |
+
alert(settings.distanceErrorAlert + maxDistance + " " + distUnit);
|
531 |
+
return;
|
532 |
+
}
|
533 |
+
}
|
534 |
+
else{
|
535 |
+
if(settings.distanceAlert !== -1 && locationset[0]['distance'] > settings.distanceAlert){
|
536 |
+
alert(settings.distanceErrorAlert + settings.distanceAlert + " " + distUnit);
|
537 |
+
}
|
538 |
+
}
|
539 |
+
|
540 |
+
//Create the map with jQuery
|
541 |
+
$(function(){
|
542 |
+
|
543 |
+
var key, value, locationData = {};
|
544 |
+
|
545 |
+
//Instead of repeating the same thing twice below
|
546 |
+
function create_location_variables(loopcount){
|
547 |
+
for ( key in locationset[loopcount] ) {
|
548 |
+
value = locationset[loopcount][key];
|
549 |
+
|
550 |
+
if(key === 'distance'){
|
551 |
+
value = roundNumber(value,2);
|
552 |
+
}
|
553 |
+
|
554 |
+
locationData[key] = value;
|
555 |
+
}
|
556 |
+
}
|
557 |
+
|
558 |
+
//Define the location data for the templates
|
559 |
+
function define_location_data(currentMarker){
|
560 |
+
create_location_variables(currentMarker.get("id"));
|
561 |
+
|
562 |
+
var distLength;
|
563 |
+
if(locationData['distance'] <= 1){
|
564 |
+
if(settings.lengthUnit === "km"){
|
565 |
+
distLength = settings.kilometerLang;
|
566 |
+
}
|
567 |
+
else{
|
568 |
+
distLength = settings.mileLang;
|
569 |
+
}
|
570 |
+
}
|
571 |
+
else{
|
572 |
+
if(settings.lengthUnit === "km"){
|
573 |
+
distLength = settings.kilometersLang;
|
574 |
+
}
|
575 |
+
else{
|
576 |
+
distLength = settings.milesLang;
|
577 |
+
}
|
578 |
+
}
|
579 |
+
|
580 |
+
//Set up alpha character
|
581 |
+
var markerId = currentMarker.get("id");
|
582 |
+
//Use dot markers instead of alpha if there are more than 26 locations
|
583 |
+
if(settings.storeLimit === -1 || settings.storeLimit > 26){
|
584 |
+
var indicator = markerId + 1;
|
585 |
+
}
|
586 |
+
else{
|
587 |
+
var indicator = String.fromCharCode("A".charCodeAt(0) + markerId);
|
588 |
+
}
|
589 |
+
|
590 |
+
//Define location data
|
591 |
+
var locations = {
|
592 |
+
location: [$.extend(locationData, {
|
593 |
+
'markerid': markerId,
|
594 |
+
'marker': indicator,
|
595 |
+
'length': distLength,
|
596 |
+
'origin': origin
|
597 |
+
})]
|
598 |
+
};
|
599 |
+
|
600 |
+
return locations;
|
601 |
+
}
|
602 |
+
|
603 |
+
//Slide in the map container
|
604 |
+
if(settings.slideMap === true){
|
605 |
+
$this.slideDown();
|
606 |
+
}
|
607 |
+
//Set up the modal window
|
608 |
+
if(settings.modalWindow === true){
|
609 |
+
// Callback
|
610 |
+
if (settings.callbackModalOpen){
|
611 |
+
settings.callbackModalOpen.call(this);
|
612 |
+
}
|
613 |
+
|
614 |
+
function modalClose(){
|
615 |
+
// Callback
|
616 |
+
if (settings.callbackModalOpen){
|
617 |
+
settings.callbackModalOpen.call(this);
|
618 |
+
}
|
619 |
+
|
620 |
+
$('#' + settings.overlayDiv).hide();
|
621 |
+
}
|
622 |
+
|
623 |
+
//Pop up the modal window
|
624 |
+
$('#' + settings.overlayDiv).fadeIn();
|
625 |
+
//Close modal when close icon is clicked and when background overlay is clicked
|
626 |
+
$(document).on('click.'+prefix, '#' + settings.modalCloseIconDiv + ', #' + settings.overlayDiv, function(){
|
627 |
+
modalClose();
|
628 |
+
});
|
629 |
+
//Prevent clicks within the modal window from closing the entire thing
|
630 |
+
$(document).on('click.'+prefix, '#' + settings.modalWindowDiv, function(e){
|
631 |
+
e.stopPropagation();
|
632 |
+
});
|
633 |
+
//Close modal when escape key is pressed
|
634 |
+
$(document).on('keyup.'+prefix, function(e){
|
635 |
+
if (e.keyCode === 27) {
|
636 |
+
modalClose();
|
637 |
+
}
|
638 |
+
});
|
639 |
+
}
|
640 |
+
|
641 |
+
//Google maps settings
|
642 |
+
if((settings.fullMapStart === true && firstRun === true) || settings.zoomLevel === 0){
|
643 |
+
var myOptions = {
|
644 |
+
mapTypeId: google.maps.MapTypeId.ROADMAP
|
645 |
+
};
|
646 |
+
var bounds = new google.maps.LatLngBounds ();
|
647 |
+
}
|
648 |
+
else{
|
649 |
+
var myOptions = {
|
650 |
+
zoom: settings.zoomLevel,
|
651 |
+
center: new google.maps.LatLng(orig_lat, orig_lng),
|
652 |
+
mapTypeId: google.maps.MapTypeId.ROADMAP
|
653 |
+
};
|
654 |
+
}
|
655 |
+
|
656 |
+
var map = new google.maps.Map(document.getElementById(settings.mapDiv),myOptions);
|
657 |
+
$this.data('map', map);
|
658 |
+
|
659 |
+
//Create one infowindow to fill later
|
660 |
+
var infowindow = new google.maps.InfoWindow();
|
661 |
+
|
662 |
+
//Avoid error if number of locations is less than the default of 26
|
663 |
+
if(settings.storeLimit === -1 || (locationset.length-1) < settings.storeLimit-1){
|
664 |
+
storenum = locationset.length-1;
|
665 |
+
}
|
666 |
+
else{
|
667 |
+
storenum = settings.storeLimit-1;
|
668 |
+
}
|
669 |
+
|
670 |
+
//Add origin marker if the setting is set
|
671 |
+
if(settings.originMarker === true && settings.fullMapStart === false){
|
672 |
+
var originPoint = new google.maps.LatLng(orig_lat, orig_lng);
|
673 |
+
var marker = new google.maps.Marker({
|
674 |
+
position: originPoint,
|
675 |
+
map: map,
|
676 |
+
icon: 'http://maps.google.com/mapfiles/ms/icons/'+ settings.originpinColor +'-dot.png',
|
677 |
+
draggable: false
|
678 |
+
});
|
679 |
+
}
|
680 |
+
|
681 |
+
//Add markers and infowindows loop
|
682 |
+
for(var y = 0; y <= storenum; y++) {
|
683 |
+
var letter = String.fromCharCode("A".charCodeAt(0) + y);
|
684 |
+
var point = new google.maps.LatLng(locationset[y]['lat'], locationset[y]['lng']);
|
685 |
+
marker = createMarker(point, locationset[y]['name'], locationset[y]['address'], letter );
|
686 |
+
marker.set("id", y);
|
687 |
+
markers[y] = marker;
|
688 |
+
if((settings.fullMapStart === true && firstRun === true) || settings.zoomLevel === 0){
|
689 |
+
bounds.extend(point);
|
690 |
+
}
|
691 |
+
//Pass variables to the pop-up infowindows
|
692 |
+
create_infowindow(marker);
|
693 |
+
}
|
694 |
+
|
695 |
+
//Center and zoom if no origin or zoom was provided
|
696 |
+
if((settings.fullMapStart === true && firstRun === true) || settings.zoomLevel === 0){
|
697 |
+
map.fitBounds(bounds);
|
698 |
+
}
|
699 |
+
|
700 |
+
//Create the links that focus on the related marker
|
701 |
+
$("#" + settings.listDiv + ' ul').empty();
|
702 |
+
$(markers).each(function(x, marker){
|
703 |
+
var letter = String.fromCharCode("A".charCodeAt(0) + x);
|
704 |
+
//This needs to happen outside the loop or there will be a closure problem with creating the infowindows attached to the list click
|
705 |
+
var currentMarker = markers[x];
|
706 |
+
listClick(currentMarker);
|
707 |
+
});
|
708 |
+
|
709 |
+
function listClick(marker){
|
710 |
+
//Define the location data
|
711 |
+
var locations = define_location_data(marker);
|
712 |
+
|
713 |
+
//Set up the list template with the location data
|
714 |
+
var listHtml = listTemplate(locations);
|
715 |
+
$('#' + settings.listDiv + ' ul').append(listHtml);
|
716 |
+
}
|
717 |
+
|
718 |
+
//Handle clicks from the list
|
719 |
+
$(document).on('click.'+prefix, '#' + settings.listDiv + ' li', function(){
|
720 |
+
var markerId = $(this).data('markerid');
|
721 |
+
|
722 |
+
var selectedMarker = markers[markerId];
|
723 |
+
|
724 |
+
//Focus on the list
|
725 |
+
$('#' + settings.listDiv + ' li').removeClass('list-focus');
|
726 |
+
$('#' + settings.listDiv + ' li[data-markerid=' + markerId +']').addClass('list-focus');
|
727 |
+
|
728 |
+
map.panTo(selectedMarker.getPosition());
|
729 |
+
var listLoc = "left";
|
730 |
+
if(settings.bounceMarker === true){
|
731 |
+
selectedMarker.setAnimation(google.maps.Animation.BOUNCE);
|
732 |
+
setTimeout(function() { selectedMarker.setAnimation(null); create_infowindow(selectedMarker, listLoc); }, 700);
|
733 |
+
}
|
734 |
+
else{
|
735 |
+
create_infowindow(selectedMarker, listLoc);
|
736 |
+
}
|
737 |
+
});
|
738 |
+
|
739 |
+
//Add the list li background colors
|
740 |
+
$("#" + settings.listDiv + " ul li:even").css('background', "#" + settings.listColor1);
|
741 |
+
$("#" + settings.listDiv + " ul li:odd").css('background', "#" + settings.listColor2);
|
742 |
+
|
743 |
+
//Custom marker function - alphabetical
|
744 |
+
function createMarker(point, name, address, letter){
|
745 |
+
//Set up pin icon with the Google Charts API for all of our markers
|
746 |
+
var pinImage = new google.maps.MarkerImage("http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=" + letter + "|" + settings.pinColor + "|" + settings.pinTextColor,
|
747 |
+
new google.maps.Size(21, 34),
|
748 |
+
new google.maps.Point(0,0),
|
749 |
+
new google.maps.Point(10, 34));
|
750 |
+
|
751 |
+
//Create the markers
|
752 |
+
if(settings.storeLimit === -1 || settings.storeLimit > 26){
|
753 |
+
var marker = new google.maps.Marker({
|
754 |
+
position: point,
|
755 |
+
map: map,
|
756 |
+
draggable: false
|
757 |
+
});
|
758 |
+
}
|
759 |
+
else{
|
760 |
+
var marker = new google.maps.Marker({
|
761 |
+
position: point,
|
762 |
+
map: map,
|
763 |
+
icon: pinImage,
|
764 |
+
draggable: false
|
765 |
+
});
|
766 |
+
}
|
767 |
+
|
768 |
+
return marker;
|
769 |
+
}
|
770 |
+
|
771 |
+
//Infowindows
|
772 |
+
function create_infowindow(marker, location){
|
773 |
+
|
774 |
+
//Define the location data
|
775 |
+
var locations = define_location_data(marker);
|
776 |
+
|
777 |
+
//Set up the infowindow template with the location data
|
778 |
+
var formattedAddress = infowindowTemplate(locations);
|
779 |
+
|
780 |
+
//Opens the infowindow when list item is clicked
|
781 |
+
if(location === "left"){
|
782 |
+
infowindow.setContent(formattedAddress);
|
783 |
+
infowindow.open(marker.get('map'), marker);
|
784 |
+
}
|
785 |
+
//Opens the infowindow when the marker is clicked
|
786 |
+
else{
|
787 |
+
google.maps.event.addListener(marker, 'click', function() {
|
788 |
+
infowindow.setContent(formattedAddress);
|
789 |
+
infowindow.open(marker.get('map'), marker);
|
790 |
+
//Focus on the list
|
791 |
+
$('#' + settings.listDiv + ' li').removeClass('list-focus');
|
792 |
+
markerId = marker.get("id");
|
793 |
+
$('#' + settings.listDiv + ' li[data-markerid=' + markerId +']').addClass('list-focus');
|
794 |
+
|
795 |
+
//Scroll list to selected marker
|
796 |
+
var container = $('#' + settings.listDiv),scrollTo = $('#' + settings.listDiv + ' li[data-markerid=' + markerId +']');
|
797 |
+
$('#' + settings.listDiv).animate({
|
798 |
+
scrollTop: scrollTo.offset().top - container.offset().top + container.scrollTop()
|
799 |
+
});
|
800 |
+
});
|
801 |
+
}
|
802 |
+
|
803 |
+
}
|
804 |
+
|
805 |
+
});
|
806 |
+
}
|
807 |
+
});
|
808 |
+
});
|
809 |
+
}
|
810 |
+
|
811 |
+
}
|
812 |
+
|
813 |
+
});
|
814 |
+
};
|
815 |
+
})(jQuery);
|
skin/frontend/base/default/storelocator/js/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);
|
skin/frontend/base/default/storelocator/js/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);
|
skin/frontend/base/default/storelocator/js/jquery.storelocator.js
ADDED
@@ -0,0 +1,819 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
var url = jQuery("#url").val();
|
11 |
+
var url1 = jQuery("#url1").val();
|
12 |
+
var url2 = jQuery("#url2").val();
|
13 |
+
var settings = $.extend( {
|
14 |
+
'mapDiv': 'map',
|
15 |
+
'listDiv': 'loc-list',
|
16 |
+
'formContainerDiv': 'form-container',
|
17 |
+
'formID': 'user-location',
|
18 |
+
'inputID': 'address',
|
19 |
+
'zoomLevel': 2, //12 = The zoom level of the Google Map. Set to 0 to have the map automatically center and zoom to show all display markers on the map.
|
20 |
+
'pinColor': 'fe7569',
|
21 |
+
'pinTextColor': '000000',
|
22 |
+
'lengthUnit': 'm',
|
23 |
+
'storeLimit': -1, //26 = The number of closest locations displayed at one time. Set to -1 for unlimited.
|
24 |
+
'distanceAlert': -1, //60 = Displays an alert if there are no locations with 60 miles of the user’s location. Set to -1 to disable.
|
25 |
+
'dataType': 'xml',
|
26 |
+
'dataLocation': url,
|
27 |
+
'searchdataLocation': jQuery("#searchurl").val(),
|
28 |
+
'listColor1': 'ffffff',
|
29 |
+
'listColor2': 'eeeeee',
|
30 |
+
'originMarker': false,
|
31 |
+
'originpinColor': 'blue',
|
32 |
+
'bounceMarker': true,
|
33 |
+
'slideMap': true,
|
34 |
+
'modalWindow': false,
|
35 |
+
'overlayDiv': 'overlay',
|
36 |
+
'modalWindowDiv': 'modal-window',
|
37 |
+
'modalContentDiv': 'modal-content',
|
38 |
+
'modalCloseIconDiv': 'close-icon',
|
39 |
+
'defaultLoc': false,
|
40 |
+
'defaultLat': '',
|
41 |
+
'defaultLng': '',
|
42 |
+
'autoGeocode': false,
|
43 |
+
'maxDistance': false,
|
44 |
+
'maxDistanceID': 'maxdistance',
|
45 |
+
'fullMapStart': false,
|
46 |
+
'noForm': false,
|
47 |
+
'loading': false,
|
48 |
+
'loadingDiv': 'loading-map',
|
49 |
+
'featuredLocations': false,
|
50 |
+
'infowindowTemplatePath': url1,
|
51 |
+
'listTemplatePath': url2,
|
52 |
+
//'KMLinfowindowTemplatePath': url+'app/design/frontend/default/ramesh/template/storelocator/templates/kml-infowindow-description.html',
|
53 |
+
//'KMLlistTemplatePath': url+'app/design/frontend/default/ramesh/template/storelocator/templates/kml-location-list-description.html',
|
54 |
+
'callbackBeforeSend': null,
|
55 |
+
'callbackComplete': null,
|
56 |
+
'callbackSuccess': null,
|
57 |
+
'callbackModalOpen': null,
|
58 |
+
'callbackModalClose': null,
|
59 |
+
'jsonpCallback': null,
|
60 |
+
//Language options
|
61 |
+
'geocodeErrorAlert': 'Geocode was not successful for the following reason: ',
|
62 |
+
'addressErrorAlert' : 'Unable to find address',
|
63 |
+
'autoGeocodeErrorAlert': 'Automatic location detection failed. Please fill in your address or zip code.',
|
64 |
+
'distanceErrorAlert': '',
|
65 |
+
'mileLang': 'mile',
|
66 |
+
'milesLang': 'miles',
|
67 |
+
'kilometerLang': 'kilometer',
|
68 |
+
'kilometersLang': 'kilometers'
|
69 |
+
}, options);
|
70 |
+
|
71 |
+
return this.each(function() {
|
72 |
+
|
73 |
+
var $this = $(this);
|
74 |
+
var listTemplate, infowindowTemplate;
|
75 |
+
|
76 |
+
load_templates();
|
77 |
+
|
78 |
+
//First load external templates and compile with Handlebars - make sure the templates are compiled before moving on
|
79 |
+
function load_templates(){
|
80 |
+
|
81 |
+
if(settings.dataType === 'kml'){
|
82 |
+
//KML infowindows
|
83 |
+
$.get(settings.KMLinfowindowTemplatePath, function(template) {
|
84 |
+
var source = template;
|
85 |
+
infowindowTemplate = Handlebars.compile(source);
|
86 |
+
});
|
87 |
+
//KML locations list
|
88 |
+
$.get(settings.KMLlistTemplatePath, function(template) {
|
89 |
+
var source = template;
|
90 |
+
listTemplate = Handlebars.compile(source);
|
91 |
+
|
92 |
+
//After loading move on to the main script
|
93 |
+
locator();
|
94 |
+
});
|
95 |
+
}
|
96 |
+
else{
|
97 |
+
//Infowindows
|
98 |
+
$.get(settings.infowindowTemplatePath, function(template) {
|
99 |
+
var source = template;
|
100 |
+
infowindowTemplate = Handlebars.compile(source);
|
101 |
+
});
|
102 |
+
//Locations list
|
103 |
+
$.get(settings.listTemplatePath, function(template) {
|
104 |
+
var source = template;
|
105 |
+
listTemplate = Handlebars.compile(source);
|
106 |
+
|
107 |
+
//After loading move on to the main script
|
108 |
+
locator();
|
109 |
+
});
|
110 |
+
}
|
111 |
+
}
|
112 |
+
|
113 |
+
//The main script
|
114 |
+
function locator(){
|
115 |
+
|
116 |
+
var userinput, olat, olng, marker, letter, storenum;
|
117 |
+
var locationset = [];
|
118 |
+
var featuredset = [];
|
119 |
+
var normalset = [];
|
120 |
+
var markers = [];
|
121 |
+
var prefix = 'storeLocator';
|
122 |
+
|
123 |
+
//Resets for multiple re-submissions
|
124 |
+
function reset(){
|
125 |
+
locationset = [];
|
126 |
+
featuredset = [];
|
127 |
+
normalset = [];
|
128 |
+
markers = [];
|
129 |
+
$(document).off('click.'+prefix, '#' + settings.listDiv + ' li');
|
130 |
+
}
|
131 |
+
|
132 |
+
//Add modal window divs if set
|
133 |
+
if(settings.modalWindow === true){
|
134 |
+
$this.wrap('<div id="' + settings.overlayDiv + '"><div id="' + settings.modalWindowDiv + '"><div id="' + settings.modalContentDiv + '">');
|
135 |
+
$('#' + settings.modalWindowDiv).prepend('<div id="' + settings.modalCloseIconDiv + '"><\/div>');
|
136 |
+
$('#' + settings.overlayDiv).hide();
|
137 |
+
}
|
138 |
+
|
139 |
+
if(settings.slideMap === true){
|
140 |
+
//Let's hide the map container to begin
|
141 |
+
$this.hide();
|
142 |
+
}
|
143 |
+
|
144 |
+
//Calculate geocode distance functions - you could use Google's distance service instead
|
145 |
+
var GeoCodeCalc = {};
|
146 |
+
if(settings.lengthUnit === "km"){
|
147 |
+
//Kilometers
|
148 |
+
GeoCodeCalc.EarthRadius = 6367.0;
|
149 |
+
}
|
150 |
+
else{
|
151 |
+
//Default is miles
|
152 |
+
GeoCodeCalc.EarthRadius = 3956.0;
|
153 |
+
}
|
154 |
+
GeoCodeCalc.ToRadian = function(v) { return v * (Math.PI / 180);};
|
155 |
+
GeoCodeCalc.DiffRadian = function(v1, v2) {
|
156 |
+
return GeoCodeCalc.ToRadian(v2) - GeoCodeCalc.ToRadian(v1);
|
157 |
+
};
|
158 |
+
GeoCodeCalc.CalcDistance = function(lat1, lng1, lat2, lng2, radius) {
|
159 |
+
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) ) ) ) );
|
160 |
+
};
|
161 |
+
|
162 |
+
start();
|
163 |
+
|
164 |
+
function start(){
|
165 |
+
//If a default location is set
|
166 |
+
if(settings.defaultLoc === true){
|
167 |
+
//The address needs to be determined for the directions link
|
168 |
+
var r = new ReverseGoogleGeocode();
|
169 |
+
var latlng = new google.maps.LatLng(settings.defaultLat, settings.defaultLng);
|
170 |
+
r.geocode(latlng, function(data) {
|
171 |
+
if(data !== null) {
|
172 |
+
var originAddress = data.address;
|
173 |
+
mapping(settings.defaultLat, settings.defaultLng, originAddress);
|
174 |
+
} else {
|
175 |
+
//Unable to geocode
|
176 |
+
alert(settings.addressErrorAlert);
|
177 |
+
}
|
178 |
+
});
|
179 |
+
}
|
180 |
+
|
181 |
+
//If show full map option is true
|
182 |
+
if(settings.fullMapStart === true){
|
183 |
+
//Just do the mapping without an origin
|
184 |
+
mapping();
|
185 |
+
}
|
186 |
+
|
187 |
+
//HTML5 geolocation API option
|
188 |
+
if(settings.autoGeocode === true){
|
189 |
+
if (navigator.geolocation) {
|
190 |
+
navigator.geolocation.getCurrentPosition(autoGeocode_query, autoGeocode_error);
|
191 |
+
}
|
192 |
+
}
|
193 |
+
}
|
194 |
+
|
195 |
+
//Geocode function for the origin location
|
196 |
+
function GoogleGeocode(){
|
197 |
+
geocoder = new google.maps.Geocoder();
|
198 |
+
this.geocode = function(address, callbackFunction) {
|
199 |
+
geocoder.geocode( { 'address': address}, function(results, status) {
|
200 |
+
if (status === google.maps.GeocoderStatus.OK) {
|
201 |
+
var result = {};
|
202 |
+
result.latitude = results[0].geometry.location.lat();
|
203 |
+
result.longitude = results[0].geometry.location.lng();
|
204 |
+
callbackFunction(result);
|
205 |
+
} else {
|
206 |
+
|
207 |
+
alert(settings.geocodeErrorAlert + status);
|
208 |
+
callbackFunction(null);
|
209 |
+
}
|
210 |
+
});
|
211 |
+
};
|
212 |
+
}
|
213 |
+
|
214 |
+
//Reverse geocode to get address for automatic options needed for directions link
|
215 |
+
function ReverseGoogleGeocode(){
|
216 |
+
geocoder = new google.maps.Geocoder();
|
217 |
+
this.geocode = function(latlng, callbackFunction) {
|
218 |
+
geocoder.geocode( {'latLng': latlng}, function(results, status) {
|
219 |
+
if (status === google.maps.GeocoderStatus.OK) {
|
220 |
+
if (results[0]) {
|
221 |
+
var result = {};
|
222 |
+
result.address = results[0].formatted_address;
|
223 |
+
callbackFunction(result);
|
224 |
+
}
|
225 |
+
} else {
|
226 |
+
alert(settings.geocodeErrorAlert + status);
|
227 |
+
callbackFunction(null);
|
228 |
+
}
|
229 |
+
});
|
230 |
+
};
|
231 |
+
}
|
232 |
+
|
233 |
+
//Used to round miles to display
|
234 |
+
function roundNumber(num, dec){
|
235 |
+
return Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
|
236 |
+
}
|
237 |
+
|
238 |
+
//If location is detected automatically
|
239 |
+
function autoGeocode_query(position){
|
240 |
+
//The address needs to be determined for the directions link
|
241 |
+
var r = new ReverseGoogleGeocode();
|
242 |
+
var latlng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
|
243 |
+
r.geocode(latlng, function(data) {
|
244 |
+
if(data !== null) {
|
245 |
+
var originAddress = data.address;
|
246 |
+
mapping(position.coords.latitude, position.coords.longitude, originAddress);
|
247 |
+
} else {
|
248 |
+
//Unable to geocode
|
249 |
+
alert(settings.addressErrorAlert);
|
250 |
+
}
|
251 |
+
});
|
252 |
+
}
|
253 |
+
|
254 |
+
function autoGeocode_error(error){
|
255 |
+
//If automatic detection doesn't work show an error
|
256 |
+
alert(settings.autoGeocodeErrorAlert);
|
257 |
+
}
|
258 |
+
|
259 |
+
//Set up the normal mapping
|
260 |
+
function begin_mapping(distance){
|
261 |
+
var searchzipcode='a';
|
262 |
+
//Get the user input and use it
|
263 |
+
var userinput = $('#' + settings.inputID).val();
|
264 |
+
|
265 |
+
if (userinput === ""){
|
266 |
+
start();
|
267 |
+
}
|
268 |
+
else{
|
269 |
+
var g = new GoogleGeocode();
|
270 |
+
var address = userinput;
|
271 |
+
g.geocode(address, function(data) {
|
272 |
+
if(data !== null) {
|
273 |
+
olat = data.latitude;
|
274 |
+
olng = data.longitude;
|
275 |
+
mapping(olat, olng, userinput, distance,searchzipcode);
|
276 |
+
} else {
|
277 |
+
//Unable to geocode
|
278 |
+
alert(settings.addressErrorAlert);
|
279 |
+
}
|
280 |
+
});
|
281 |
+
}
|
282 |
+
}
|
283 |
+
|
284 |
+
//Process form input
|
285 |
+
$(function(){
|
286 |
+
//Handle form submission
|
287 |
+
function get_form_values(e){
|
288 |
+
//Stop the form submission
|
289 |
+
e.preventDefault();
|
290 |
+
|
291 |
+
if(settings.maxDistance === true){
|
292 |
+
var maxDistance = $('#' + settings.maxDistanceID).val();
|
293 |
+
//Start the mapping
|
294 |
+
begin_mapping(maxDistance);
|
295 |
+
}
|
296 |
+
else{
|
297 |
+
//Start the mapping
|
298 |
+
begin_mapping();
|
299 |
+
}
|
300 |
+
}
|
301 |
+
|
302 |
+
//ASP.net or regular submission?
|
303 |
+
if(settings.noForm === true){
|
304 |
+
$(document).on('click.'+prefix, '#' + settings.formContainerDiv + ' #submit', function(e){
|
305 |
+
get_form_values(e);
|
306 |
+
});
|
307 |
+
$(document).on('keyup.'+prefix, function(e){
|
308 |
+
if (e.keyCode === 13 && $('#' + settings.inputID).is(':focus')) {
|
309 |
+
get_form_values(e);
|
310 |
+
}
|
311 |
+
});
|
312 |
+
}
|
313 |
+
else{
|
314 |
+
$(document).on('submit.'+prefix, '#' + settings.formID, function(e){
|
315 |
+
get_form_values(e);
|
316 |
+
});
|
317 |
+
}
|
318 |
+
});
|
319 |
+
|
320 |
+
//Now all the mapping stuff
|
321 |
+
function mapping(orig_lat, orig_lng, origin, maxDistance,s){
|
322 |
+
$(function(){
|
323 |
+
|
324 |
+
// Enable the visual refresh https://developers.google.com/maps/documentation/javascript/basics#VisualRefresh
|
325 |
+
google.maps.visualRefresh = true;
|
326 |
+
|
327 |
+
var dataTypeRead;
|
328 |
+
|
329 |
+
//KML is read as XML
|
330 |
+
if(settings.dataType === 'kml'){
|
331 |
+
dataTypeRead = "xml";
|
332 |
+
}
|
333 |
+
else{
|
334 |
+
dataTypeRead = settings.dataType;
|
335 |
+
}
|
336 |
+
|
337 |
+
var dataurl;
|
338 |
+
var zipcode = $('#' + settings.inputID).val();
|
339 |
+
dataurl = (s)?settings.searchdataLocation+"?zipcode="+zipcode:(settings.dataLocation + (settings.dataType === 'jsonp' ? (settings.dataLocation.match(/\?/) ? '&' : '?') + 'callback=?' : ''));
|
340 |
+
//Process the data
|
341 |
+
$.ajax({
|
342 |
+
type: "GET",
|
343 |
+
url: dataurl,
|
344 |
+
dataType: dataTypeRead,
|
345 |
+
jsonpCallback: (settings.dataType === 'jsonp' ? settings.jsonpCallback : null),
|
346 |
+
beforeSend: function (){
|
347 |
+
// Callback
|
348 |
+
if(settings.callbackBeforeSend){
|
349 |
+
settings.callbackBeforeSend.call(this);
|
350 |
+
}
|
351 |
+
|
352 |
+
//Loading
|
353 |
+
if(settings.loading === true){
|
354 |
+
$('#' + settings.formContainerDiv).append('<div id="' + settings.loadingDiv +'"><\/div>');
|
355 |
+
}
|
356 |
+
|
357 |
+
},
|
358 |
+
complete: function (event, request, options){
|
359 |
+
// Callback
|
360 |
+
if(settings.callbackComplete){
|
361 |
+
settings.callbackComplete.call(this, event, request, options);
|
362 |
+
}
|
363 |
+
|
364 |
+
//Loading remove
|
365 |
+
if(settings.loading === true){
|
366 |
+
$('#' + settings.loadingDiv).remove();
|
367 |
+
}
|
368 |
+
},
|
369 |
+
success: function (data, xhr, options){
|
370 |
+
// Callback
|
371 |
+
if(settings.callbackSuccess){
|
372 |
+
settings.callbackSuccess.call(this, data, xhr, options);
|
373 |
+
}
|
374 |
+
|
375 |
+
//After the store locations file has been read successfully
|
376 |
+
var i = 0;
|
377 |
+
var firstRun;
|
378 |
+
|
379 |
+
//Set a variable for fullMapStart so we can detect the first run
|
380 |
+
if(settings.fullMapStart === true && $('#' + settings.mapDiv).hasClass('mapOpen') === false){
|
381 |
+
firstRun = true;
|
382 |
+
}
|
383 |
+
else{
|
384 |
+
reset();
|
385 |
+
}
|
386 |
+
|
387 |
+
$('#' + settings.mapDiv).addClass('mapOpen');
|
388 |
+
|
389 |
+
//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
|
390 |
+
if(settings.dataType === 'json' || settings.dataType === 'jsonp'){
|
391 |
+
//Process JSON
|
392 |
+
$.each(data, function(){
|
393 |
+
var key, value, locationData = {};
|
394 |
+
|
395 |
+
// Parse each data variables
|
396 |
+
for( key in this ){
|
397 |
+
value = this[key];
|
398 |
+
|
399 |
+
if(key === 'web'){
|
400 |
+
if ( value ) value = value.replace("http://",""); // Remove scheme (todo: should NOT be done)
|
401 |
+
}
|
402 |
+
|
403 |
+
locationData[key] = value;
|
404 |
+
}
|
405 |
+
|
406 |
+
if(!locationData['distance']){
|
407 |
+
locationData['distance'] = GeoCodeCalc.CalcDistance(orig_lat,orig_lng,locationData['lat'],locationData['lng'], GeoCodeCalc.EarthRadius);
|
408 |
+
}
|
409 |
+
|
410 |
+
//Create the array
|
411 |
+
if(settings.maxDistance === true && firstRun !== true && maxDistance){
|
412 |
+
if(locationData['distance'] < maxDistance){
|
413 |
+
locationset[i] = locationData;
|
414 |
+
}
|
415 |
+
else{
|
416 |
+
return;
|
417 |
+
}
|
418 |
+
}
|
419 |
+
else{
|
420 |
+
locationset[i] = locationData;
|
421 |
+
}
|
422 |
+
|
423 |
+
i++;
|
424 |
+
});
|
425 |
+
}
|
426 |
+
else if(settings.dataType === 'kml'){
|
427 |
+
//Process KML
|
428 |
+
$(data).find('Placemark').each(function(){
|
429 |
+
var locationData = {
|
430 |
+
'name': $(this).find('name').text(),
|
431 |
+
'lat': $(this).find('coordinates').text().split(",")[1],
|
432 |
+
'lng': $(this).find('coordinates').text().split(",")[0],
|
433 |
+
'description': $(this).find('description').text()
|
434 |
+
};
|
435 |
+
|
436 |
+
locationData['distance'] = GeoCodeCalc.CalcDistance(orig_lat,orig_lng,locationData['lat'],locationData['lng'], GeoCodeCalc.EarthRadius);
|
437 |
+
|
438 |
+
//Create the array
|
439 |
+
if(settings.maxDistance === true && firstRun !== true && maxDistance){
|
440 |
+
if(locationData['distance'] < maxDistance){
|
441 |
+
locationset[i] = locationData;
|
442 |
+
}
|
443 |
+
else{
|
444 |
+
return;
|
445 |
+
}
|
446 |
+
}
|
447 |
+
else{
|
448 |
+
locationset[i] = locationData;
|
449 |
+
}
|
450 |
+
|
451 |
+
i++;
|
452 |
+
});
|
453 |
+
}
|
454 |
+
else{
|
455 |
+
//Process XML
|
456 |
+
$(data).find('marker').each(function(){
|
457 |
+
var locationData = {
|
458 |
+
'storeid': $(this).attr('storeid'),
|
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 |
+
'web': $(this).attr('web'),
|
471 |
+
'hours1': $(this).attr('hours1'),
|
472 |
+
'hours2': $(this).attr('hours2'),
|
473 |
+
'hours3': $(this).attr('hours3'),
|
474 |
+
'category': $(this).attr('category'),
|
475 |
+
'storeimage': $(this).attr('storeimage'),
|
476 |
+
'fax': $(this).attr('fax'),
|
477 |
+
'featured': $(this).attr('featured')
|
478 |
+
};
|
479 |
+
|
480 |
+
if(locationData['web']) locationData['web'] = locationData['web'].replace("http://",""); // Remove scheme (todo: should NOT be done)
|
481 |
+
|
482 |
+
locationData['distance'] = GeoCodeCalc.CalcDistance(orig_lat,orig_lng,locationData['lat'],locationData['lng'], GeoCodeCalc.EarthRadius);
|
483 |
+
|
484 |
+
//Create the array
|
485 |
+
if(settings.maxDistance === true && firstRun !== true && maxDistance){
|
486 |
+
if(locationData['distance'] < maxDistance){
|
487 |
+
locationset[i] = locationData;
|
488 |
+
}
|
489 |
+
else{
|
490 |
+
return;
|
491 |
+
}
|
492 |
+
}
|
493 |
+
else{
|
494 |
+
locationset[i] = locationData;
|
495 |
+
}
|
496 |
+
|
497 |
+
i++;
|
498 |
+
});
|
499 |
+
}
|
500 |
+
|
501 |
+
//Distance sorting function
|
502 |
+
function sort_numerically(locationsarray){
|
503 |
+
locationsarray.sort(function(a, b){
|
504 |
+
return ((a['distance'] < b['distance']) ? -1 : ((a['distance'] > b['distance']) ? 1 : 0));
|
505 |
+
});
|
506 |
+
}
|
507 |
+
|
508 |
+
//Sort the multi-dimensional array by distance
|
509 |
+
sort_numerically(locationset);
|
510 |
+
|
511 |
+
//Featured locations filtering
|
512 |
+
if(settings.featuredLocations === true){
|
513 |
+
//Create array for featured locations
|
514 |
+
featuredset = $.grep(locationset, function(val, i){
|
515 |
+
return val['featured'] === "true";
|
516 |
+
});
|
517 |
+
|
518 |
+
//Create array for normal locations
|
519 |
+
normalset = $.grep(locationset, function(val, i){
|
520 |
+
return val['featured'] !== "true";
|
521 |
+
});
|
522 |
+
|
523 |
+
//Combine the arrays
|
524 |
+
locationset = [];
|
525 |
+
locationset = featuredset.concat(normalset);
|
526 |
+
}
|
527 |
+
|
528 |
+
//Get the length unit
|
529 |
+
var distUnit = (settings.lengthUnit === "km") ? settings.kilometersLang : settings.milesLang ;
|
530 |
+
|
531 |
+
//Check the closest marker
|
532 |
+
if(settings.maxDistance === true && firstRun !== true && maxDistance){
|
533 |
+
if(locationset[0] === undefined || locationset[0]['distance'] > maxDistance){
|
534 |
+
alert(settings.distanceErrorAlert + maxDistance + " " + distUnit);
|
535 |
+
return;
|
536 |
+
}
|
537 |
+
}
|
538 |
+
else{
|
539 |
+
if(settings.distanceAlert !== -1 && locationset[0]['distance'] > settings.distanceAlert){
|
540 |
+
alert(settings.distanceErrorAlert + settings.distanceAlert + " " + distUnit);
|
541 |
+
}
|
542 |
+
}
|
543 |
+
|
544 |
+
//Create the map with jQuery
|
545 |
+
$(function(){
|
546 |
+
|
547 |
+
var key, value, locationData = {};
|
548 |
+
|
549 |
+
//Instead of repeating the same thing twice below
|
550 |
+
function create_location_variables(loopcount){
|
551 |
+
for ( key in locationset[loopcount] ) {
|
552 |
+
value = locationset[loopcount][key];
|
553 |
+
|
554 |
+
if(key === 'distance'){
|
555 |
+
value = roundNumber(value,2);
|
556 |
+
}
|
557 |
+
|
558 |
+
locationData[key] = value;
|
559 |
+
}
|
560 |
+
}
|
561 |
+
|
562 |
+
//Define the location data for the templates
|
563 |
+
function define_location_data(currentMarker){
|
564 |
+
create_location_variables(currentMarker.get("id"));
|
565 |
+
|
566 |
+
var distLength;
|
567 |
+
if(locationData['distance'] <= 1){
|
568 |
+
if(settings.lengthUnit === "km"){
|
569 |
+
distLength = settings.kilometerLang;
|
570 |
+
}
|
571 |
+
else{
|
572 |
+
distLength = settings.mileLang;
|
573 |
+
}
|
574 |
+
}
|
575 |
+
else{
|
576 |
+
if(settings.lengthUnit === "km"){
|
577 |
+
distLength = settings.kilometersLang;
|
578 |
+
}
|
579 |
+
else{
|
580 |
+
distLength = settings.milesLang;
|
581 |
+
}
|
582 |
+
}
|
583 |
+
|
584 |
+
//Set up alpha character
|
585 |
+
var markerId = currentMarker.get("id");
|
586 |
+
//Use dot markers instead of alpha if there are more than 26 locations
|
587 |
+
if(settings.storeLimit === -1 || settings.storeLimit > 26){
|
588 |
+
var indicator = markerId + 1;
|
589 |
+
}
|
590 |
+
else{
|
591 |
+
var indicator = String.fromCharCode("A".charCodeAt(0) + markerId);
|
592 |
+
}
|
593 |
+
|
594 |
+
//Define location data
|
595 |
+
var locations = {
|
596 |
+
location: [$.extend(locationData, {
|
597 |
+
'markerid': markerId,
|
598 |
+
'marker': indicator,
|
599 |
+
'length': distLength,
|
600 |
+
'origin': origin
|
601 |
+
})]
|
602 |
+
};
|
603 |
+
|
604 |
+
return locations;
|
605 |
+
}
|
606 |
+
|
607 |
+
//Slide in the map container
|
608 |
+
if(settings.slideMap === true){
|
609 |
+
$this.slideDown();
|
610 |
+
}
|
611 |
+
//Set up the modal window
|
612 |
+
if(settings.modalWindow === true){
|
613 |
+
// Callback
|
614 |
+
if (settings.callbackModalOpen){
|
615 |
+
settings.callbackModalOpen.call(this);
|
616 |
+
}
|
617 |
+
|
618 |
+
function modalClose(){
|
619 |
+
// Callback
|
620 |
+
if (settings.callbackModalOpen){
|
621 |
+
settings.callbackModalOpen.call(this);
|
622 |
+
}
|
623 |
+
|
624 |
+
$('#' + settings.overlayDiv).hide();
|
625 |
+
}
|
626 |
+
|
627 |
+
//Pop up the modal window
|
628 |
+
$('#' + settings.overlayDiv).fadeIn();
|
629 |
+
//Close modal when close icon is clicked and when background overlay is clicked
|
630 |
+
$(document).on('click.'+prefix, '#' + settings.modalCloseIconDiv + ', #' + settings.overlayDiv, function(){
|
631 |
+
modalClose();
|
632 |
+
});
|
633 |
+
//Prevent clicks within the modal window from closing the entire thing
|
634 |
+
$(document).on('click.'+prefix, '#' + settings.modalWindowDiv, function(e){
|
635 |
+
e.stopPropagation();
|
636 |
+
});
|
637 |
+
//Close modal when escape key is pressed
|
638 |
+
$(document).on('keyup.'+prefix, function(e){
|
639 |
+
if (e.keyCode === 27) {
|
640 |
+
modalClose();
|
641 |
+
}
|
642 |
+
});
|
643 |
+
}
|
644 |
+
|
645 |
+
//Google maps settings
|
646 |
+
if((settings.fullMapStart === true && firstRun === true) || settings.zoomLevel === 0){
|
647 |
+
var myOptions = {
|
648 |
+
mapTypeId: google.maps.MapTypeId.ROADMAP
|
649 |
+
};
|
650 |
+
var bounds = new google.maps.LatLngBounds ();
|
651 |
+
}
|
652 |
+
else{
|
653 |
+
var myOptions = {
|
654 |
+
zoom: settings.zoomLevel,
|
655 |
+
center: new google.maps.LatLng(orig_lat, orig_lng),
|
656 |
+
mapTypeId: google.maps.MapTypeId.ROADMAP
|
657 |
+
};
|
658 |
+
}
|
659 |
+
|
660 |
+
var map = new google.maps.Map(document.getElementById(settings.mapDiv),myOptions);
|
661 |
+
$this.data('map', map);
|
662 |
+
|
663 |
+
//Create one infowindow to fill later
|
664 |
+
var infowindow = new google.maps.InfoWindow();
|
665 |
+
|
666 |
+
//Avoid error if number of locations is less than the default of 26
|
667 |
+
if(settings.storeLimit === -1 || (locationset.length-1) < settings.storeLimit-1){
|
668 |
+
storenum = locationset.length-1;
|
669 |
+
}
|
670 |
+
else{
|
671 |
+
storenum = settings.storeLimit-1;
|
672 |
+
}
|
673 |
+
|
674 |
+
//Add origin marker if the setting is set
|
675 |
+
if(settings.originMarker === true && settings.fullMapStart === false){
|
676 |
+
var originPoint = new google.maps.LatLng(orig_lat, orig_lng);
|
677 |
+
var marker = new google.maps.Marker({
|
678 |
+
position: originPoint,
|
679 |
+
map: map,
|
680 |
+
icon: 'http://maps.google.com/mapfiles/ms/icons/'+ settings.originpinColor +'-dot.png',
|
681 |
+
draggable: false
|
682 |
+
});
|
683 |
+
}
|
684 |
+
|
685 |
+
//Add markers and infowindows loop
|
686 |
+
for(var y = 0; y <= storenum; y++) {
|
687 |
+
var letter = String.fromCharCode("A".charCodeAt(0) + y);
|
688 |
+
var point = new google.maps.LatLng(locationset[y]['lat'], locationset[y]['lng']);
|
689 |
+
marker = createMarker(point, locationset[y]['name'], locationset[y]['address'], letter );
|
690 |
+
marker.set("id", y);
|
691 |
+
markers[y] = marker;
|
692 |
+
if((settings.fullMapStart === true && firstRun === true) || settings.zoomLevel === 0){
|
693 |
+
bounds.extend(point);
|
694 |
+
}
|
695 |
+
//Pass variables to the pop-up infowindows
|
696 |
+
create_infowindow(marker);
|
697 |
+
}
|
698 |
+
|
699 |
+
//Center and zoom if no origin or zoom was provided
|
700 |
+
if((settings.fullMapStart === true && firstRun === true) || settings.zoomLevel === 0){
|
701 |
+
map.fitBounds(bounds);
|
702 |
+
}
|
703 |
+
|
704 |
+
//Create the links that focus on the related marker
|
705 |
+
$("#" + settings.listDiv + ' ul').empty();
|
706 |
+
$(markers).each(function(x, marker){
|
707 |
+
var letter = String.fromCharCode("A".charCodeAt(0) + x);
|
708 |
+
//This needs to happen outside the loop or there will be a closure problem with creating the infowindows attached to the list click
|
709 |
+
var currentMarker = markers[x];
|
710 |
+
listClick(currentMarker);
|
711 |
+
});
|
712 |
+
|
713 |
+
function listClick(marker){
|
714 |
+
//Define the location data
|
715 |
+
var locations = define_location_data(marker);
|
716 |
+
|
717 |
+
//Set up the list template with the location data
|
718 |
+
var listHtml = listTemplate(locations);
|
719 |
+
$('#' + settings.listDiv + ' ul').append(listHtml);
|
720 |
+
}
|
721 |
+
|
722 |
+
//Handle clicks from the list
|
723 |
+
$(document).on('click.'+prefix, '#' + settings.listDiv + ' li', function(){
|
724 |
+
var markerId = $(this).data('markerid');
|
725 |
+
|
726 |
+
var selectedMarker = markers[markerId];
|
727 |
+
|
728 |
+
//Focus on the list
|
729 |
+
$('#' + settings.listDiv + ' li').removeClass('list-focus');
|
730 |
+
$('#' + settings.listDiv + ' li[data-markerid=' + markerId +']').addClass('list-focus');
|
731 |
+
|
732 |
+
map.panTo(selectedMarker.getPosition());
|
733 |
+
var listLoc = "left";
|
734 |
+
if(settings.bounceMarker === true){
|
735 |
+
selectedMarker.setAnimation(google.maps.Animation.BOUNCE);
|
736 |
+
setTimeout(function() { selectedMarker.setAnimation(null); create_infowindow(selectedMarker, listLoc); }, 700);
|
737 |
+
}
|
738 |
+
else{
|
739 |
+
create_infowindow(selectedMarker, listLoc);
|
740 |
+
}
|
741 |
+
});
|
742 |
+
|
743 |
+
//Add the list li background colors
|
744 |
+
$("#" + settings.listDiv + " ul li:even").css('background', "#" + settings.listColor1);
|
745 |
+
$("#" + settings.listDiv + " ul li:odd").css('background', "#" + settings.listColor2);
|
746 |
+
|
747 |
+
//Custom marker function - alphabetical
|
748 |
+
function createMarker(point, name, address, letter){
|
749 |
+
//Set up pin icon with the Google Charts API for all of our markers
|
750 |
+
var pinImage = new google.maps.MarkerImage("http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=" + letter + "|" + settings.pinColor + "|" + settings.pinTextColor,
|
751 |
+
new google.maps.Size(21, 34),
|
752 |
+
new google.maps.Point(0,0),
|
753 |
+
new google.maps.Point(10, 34));
|
754 |
+
|
755 |
+
//Create the markers
|
756 |
+
if(settings.storeLimit === -1 || settings.storeLimit > 26){
|
757 |
+
var marker = new google.maps.Marker({
|
758 |
+
position: point,
|
759 |
+
map: map,
|
760 |
+
draggable: false
|
761 |
+
});
|
762 |
+
}
|
763 |
+
else{
|
764 |
+
var marker = new google.maps.Marker({
|
765 |
+
position: point,
|
766 |
+
map: map,
|
767 |
+
icon: pinImage,
|
768 |
+
draggable: false
|
769 |
+
});
|
770 |
+
}
|
771 |
+
|
772 |
+
return marker;
|
773 |
+
}
|
774 |
+
|
775 |
+
//Infowindows
|
776 |
+
function create_infowindow(marker, location){
|
777 |
+
|
778 |
+
//Define the location data
|
779 |
+
var locations = define_location_data(marker);
|
780 |
+
|
781 |
+
//Set up the infowindow template with the location data
|
782 |
+
var formattedAddress = infowindowTemplate(locations);
|
783 |
+
|
784 |
+
//Opens the infowindow when list item is clicked
|
785 |
+
if(location === "left"){
|
786 |
+
infowindow.setContent(formattedAddress);
|
787 |
+
infowindow.open(marker.get('map'), marker);
|
788 |
+
}
|
789 |
+
//Opens the infowindow when the marker is clicked
|
790 |
+
else{
|
791 |
+
google.maps.event.addListener(marker, 'click', function() {
|
792 |
+
infowindow.setContent(formattedAddress);
|
793 |
+
infowindow.open(marker.get('map'), marker);
|
794 |
+
//Focus on the list
|
795 |
+
$('#' + settings.listDiv + ' li').removeClass('list-focus');
|
796 |
+
markerId = marker.get("id");
|
797 |
+
$('#' + settings.listDiv + ' li[data-markerid=' + markerId +']').addClass('list-focus');
|
798 |
+
|
799 |
+
//Scroll list to selected marker
|
800 |
+
var container = $('#' + settings.listDiv),scrollTo = $('#' + settings.listDiv + ' li[data-markerid=' + markerId +']');
|
801 |
+
$('#' + settings.listDiv).animate({
|
802 |
+
scrollTop: scrollTo.offset().top - container.offset().top + container.scrollTop()
|
803 |
+
});
|
804 |
+
});
|
805 |
+
}
|
806 |
+
|
807 |
+
}
|
808 |
+
|
809 |
+
});
|
810 |
+
}
|
811 |
+
});
|
812 |
+
});
|
813 |
+
}
|
814 |
+
|
815 |
+
}
|
816 |
+
|
817 |
+
});
|
818 |
+
};
|
819 |
+
})(jQuery);
|
skin/frontend/base/default/storelocator/js/jquery.storelocator_1.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 |
+
var url = jQuery("#url").val();
|
11 |
+
var url1 = jQuery("#url1").val();
|
12 |
+
var url2 = jQuery("#url2").val();
|
13 |
+
var settings = $.extend( {
|
14 |
+
'mapDiv': 'map',
|
15 |
+
'listDiv': 'loc-list',
|
16 |
+
'formContainerDiv': 'form-container',
|
17 |
+
'formID': 'user-location',
|
18 |
+
'inputID': 'address',
|
19 |
+
'zoomLevel': 2, //12 = The zoom level of the Google Map. Set to 0 to have the map automatically center and zoom to show all display markers on the map.
|
20 |
+
'pinColor': 'fe7569',
|
21 |
+
'pinTextColor': '000000',
|
22 |
+
'lengthUnit': 'm',
|
23 |
+
'storeLimit': -1, //26 = The number of closest locations displayed at one time. Set to -1 for unlimited.
|
24 |
+
'distanceAlert': -1, //60 = Displays an alert if there are no locations with 60 miles of the user’s location. Set to -1 to disable.
|
25 |
+
'dataType': 'xml',
|
26 |
+
'dataLocation': url,
|
27 |
+
'searchdataLocation': jQuery("#searchurl").val(),
|
28 |
+
'listColor1': 'ffffff',
|
29 |
+
'listColor2': 'eeeeee',
|
30 |
+
'originMarker': false,
|
31 |
+
'originpinColor': 'blue',
|
32 |
+
'bounceMarker': true,
|
33 |
+
'slideMap': true,
|
34 |
+
'modalWindow': false,
|
35 |
+
'overlayDiv': 'overlay',
|
36 |
+
'modalWindowDiv': 'modal-window',
|
37 |
+
'modalContentDiv': 'modal-content',
|
38 |
+
'modalCloseIconDiv': 'close-icon',
|
39 |
+
'defaultLoc': false,
|
40 |
+
'defaultLat': '',
|
41 |
+
'defaultLng': '',
|
42 |
+
'autoGeocode': false,
|
43 |
+
'maxDistance': false,
|
44 |
+
'maxDistanceID': 'maxdistance',
|
45 |
+
'fullMapStart': false,
|
46 |
+
'noForm': false,
|
47 |
+
'loading': false,
|
48 |
+
'loadingDiv': 'loading-map',
|
49 |
+
'featuredLocations': false,
|
50 |
+
'infowindowTemplatePath': url1,
|
51 |
+
'listTemplatePath': url2,
|
52 |
+
//'KMLinfowindowTemplatePath': url+'app/design/frontend/default/ramesh/template/storelocator/templates/kml-infowindow-description.html',
|
53 |
+
//'KMLlistTemplatePath': url+'app/design/frontend/default/ramesh/template/storelocator/templates/kml-location-list-description.html',
|
54 |
+
'callbackBeforeSend': null,
|
55 |
+
'callbackComplete': null,
|
56 |
+
'callbackSuccess': null,
|
57 |
+
'callbackModalOpen': null,
|
58 |
+
'callbackModalClose': null,
|
59 |
+
'jsonpCallback': null,
|
60 |
+
//Language options
|
61 |
+
'geocodeErrorAlert': 'Geocode was not successful for the following reason: ',
|
62 |
+
'addressErrorAlert' : 'Unable to find address',
|
63 |
+
'autoGeocodeErrorAlert': 'Automatic location detection failed. Please fill in your address or zip code.',
|
64 |
+
'distanceErrorAlert': '',
|
65 |
+
'mileLang': 'mile',
|
66 |
+
'milesLang': 'miles',
|
67 |
+
'kilometerLang': 'kilometer',
|
68 |
+
'kilometersLang': 'kilometers'
|
69 |
+
}, options);
|
70 |
+
|
71 |
+
return this.each(function() {
|
72 |
+
|
73 |
+
var $this = $(this);
|
74 |
+
var listTemplate, infowindowTemplate;
|
75 |
+
|
76 |
+
load_templates();
|
77 |
+
|
78 |
+
//First load external templates and compile with Handlebars - make sure the templates are compiled before moving on
|
79 |
+
function load_templates(){
|
80 |
+
|
81 |
+
if(settings.dataType === 'kml'){
|
82 |
+
//KML infowindows
|
83 |
+
$.get(settings.KMLinfowindowTemplatePath, function(template) {
|
84 |
+
var source = template;
|
85 |
+
infowindowTemplate = Handlebars.compile(source);
|
86 |
+
});
|
87 |
+
//KML locations list
|
88 |
+
$.get(settings.KMLlistTemplatePath, function(template) {
|
89 |
+
var source = template;
|
90 |
+
listTemplate = Handlebars.compile(source);
|
91 |
+
|
92 |
+
//After loading move on to the main script
|
93 |
+
locator();
|
94 |
+
});
|
95 |
+
}
|
96 |
+
else{
|
97 |
+
//Infowindows
|
98 |
+
$.get(settings.infowindowTemplatePath, function(template) {
|
99 |
+
var source = template;
|
100 |
+
infowindowTemplate = Handlebars.compile(source);
|
101 |
+
});
|
102 |
+
//Locations list
|
103 |
+
$.get(settings.listTemplatePath, function(template) {
|
104 |
+
var source = template;
|
105 |
+
listTemplate = Handlebars.compile(source);
|
106 |
+
|
107 |
+
//After loading move on to the main script
|
108 |
+
locator();
|
109 |
+
});
|
110 |
+
}
|
111 |
+
}
|
112 |
+
|
113 |
+
//The main script
|
114 |
+
function locator(){
|
115 |
+
|
116 |
+
var userinput, olat, olng, marker, letter, storenum;
|
117 |
+
var locationset = [];
|
118 |
+
var featuredset = [];
|
119 |
+
var normalset = [];
|
120 |
+
var markers = [];
|
121 |
+
var prefix = 'storeLocator';
|
122 |
+
|
123 |
+
//Resets for multiple re-submissions
|
124 |
+
function reset(){
|
125 |
+
locationset = [];
|
126 |
+
featuredset = [];
|
127 |
+
normalset = [];
|
128 |
+
markers = [];
|
129 |
+
$(document).off('click.'+prefix, '#' + settings.listDiv + ' li');
|
130 |
+
}
|
131 |
+
|
132 |
+
//Add modal window divs if set
|
133 |
+
if(settings.modalWindow === true){
|
134 |
+
$this.wrap('<div id="' + settings.overlayDiv + '"><div id="' + settings.modalWindowDiv + '"><div id="' + settings.modalContentDiv + '">');
|
135 |
+
$('#' + settings.modalWindowDiv).prepend('<div id="' + settings.modalCloseIconDiv + '"><\/div>');
|
136 |
+
$('#' + settings.overlayDiv).hide();
|
137 |
+
}
|
138 |
+
|
139 |
+
if(settings.slideMap === true){
|
140 |
+
//Let's hide the map container to begin
|
141 |
+
$this.hide();
|
142 |
+
}
|
143 |
+
|
144 |
+
//Calculate geocode distance functions - you could use Google's distance service instead
|
145 |
+
var GeoCodeCalc = {};
|
146 |
+
if(settings.lengthUnit === "km"){
|
147 |
+
//Kilometers
|
148 |
+
GeoCodeCalc.EarthRadius = 6367.0;
|
149 |
+
}
|
150 |
+
else{
|
151 |
+
//Default is miles
|
152 |
+
GeoCodeCalc.EarthRadius = 3956.0;
|
153 |
+
}
|
154 |
+
GeoCodeCalc.ToRadian = function(v) { return v * (Math.PI / 180);};
|
155 |
+
GeoCodeCalc.DiffRadian = function(v1, v2) {
|
156 |
+
return GeoCodeCalc.ToRadian(v2) - GeoCodeCalc.ToRadian(v1);
|
157 |
+
};
|
158 |
+
GeoCodeCalc.CalcDistance = function(lat1, lng1, lat2, lng2, radius) {
|
159 |
+
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) ) ) ) );
|
160 |
+
};
|
161 |
+
|
162 |
+
start();
|
163 |
+
|
164 |
+
function start(){
|
165 |
+
//If a default location is set
|
166 |
+
if(settings.defaultLoc === true){
|
167 |
+
//The address needs to be determined for the directions link
|
168 |
+
var r = new ReverseGoogleGeocode();
|
169 |
+
var latlng = new google.maps.LatLng(settings.defaultLat, settings.defaultLng);
|
170 |
+
r.geocode(latlng, function(data) {
|
171 |
+
if(data !== null) {
|
172 |
+
var originAddress = data.address;
|
173 |
+
mapping(settings.defaultLat, settings.defaultLng, originAddress);
|
174 |
+
} else {
|
175 |
+
//Unable to geocode
|
176 |
+
alert(settings.addressErrorAlert);
|
177 |
+
}
|
178 |
+
});
|
179 |
+
}
|
180 |
+
|
181 |
+
//If show full map option is true
|
182 |
+
if(settings.fullMapStart === true){
|
183 |
+
//Just do the mapping without an origin
|
184 |
+
mapping();
|
185 |
+
}
|
186 |
+
|
187 |
+
//HTML5 geolocation API option
|
188 |
+
if(settings.autoGeocode === true){
|
189 |
+
if (navigator.geolocation) {
|
190 |
+
navigator.geolocation.getCurrentPosition(autoGeocode_query, autoGeocode_error);
|
191 |
+
}
|
192 |
+
}
|
193 |
+
}
|
194 |
+
|
195 |
+
//Geocode function for the origin location
|
196 |
+
function GoogleGeocode(){
|
197 |
+
geocoder = new google.maps.Geocoder();
|
198 |
+
this.geocode = function(address, callbackFunction) {
|
199 |
+
geocoder.geocode( { 'address': address}, function(results, status) {
|
200 |
+
if (status === google.maps.GeocoderStatus.OK) {
|
201 |
+
var result = {};
|
202 |
+
result.latitude = results[0].geometry.location.lat();
|
203 |
+
result.longitude = results[0].geometry.location.lng();
|
204 |
+
callbackFunction(result);
|
205 |
+
} else {
|
206 |
+
alert(settings.geocodeErrorAlert + status);
|
207 |
+
callbackFunction(null);
|
208 |
+
}
|
209 |
+
});
|
210 |
+
};
|
211 |
+
}
|
212 |
+
|
213 |
+
//Reverse geocode to get address for automatic options needed for directions link
|
214 |
+
function ReverseGoogleGeocode(){
|
215 |
+
geocoder = new google.maps.Geocoder();
|
216 |
+
this.geocode = function(latlng, callbackFunction) {
|
217 |
+
geocoder.geocode( {'latLng': latlng}, function(results, status) {
|
218 |
+
if (status === google.maps.GeocoderStatus.OK) {
|
219 |
+
if (results[0]) {
|
220 |
+
var result = {};
|
221 |
+
result.address = results[0].formatted_address;
|
222 |
+
callbackFunction(result);
|
223 |
+
}
|
224 |
+
} else {
|
225 |
+
alert(settings.geocodeErrorAlert + status);
|
226 |
+
callbackFunction(null);
|
227 |
+
}
|
228 |
+
});
|
229 |
+
};
|
230 |
+
}
|
231 |
+
|
232 |
+
//Used to round miles to display
|
233 |
+
function roundNumber(num, dec){
|
234 |
+
return Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
|
235 |
+
}
|
236 |
+
|
237 |
+
//If location is detected automatically
|
238 |
+
function autoGeocode_query(position){
|
239 |
+
//The address needs to be determined for the directions link
|
240 |
+
var r = new ReverseGoogleGeocode();
|
241 |
+
var latlng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
|
242 |
+
r.geocode(latlng, function(data) {
|
243 |
+
if(data !== null) {
|
244 |
+
var originAddress = data.address;
|
245 |
+
mapping(position.coords.latitude, position.coords.longitude, originAddress);
|
246 |
+
} else {
|
247 |
+
//Unable to geocode
|
248 |
+
alert(settings.addressErrorAlert);
|
249 |
+
}
|
250 |
+
});
|
251 |
+
}
|
252 |
+
|
253 |
+
function autoGeocode_error(error){
|
254 |
+
//If automatic detection doesn't work show an error
|
255 |
+
alert(settings.autoGeocodeErrorAlert);
|
256 |
+
}
|
257 |
+
|
258 |
+
//Set up the normal mapping
|
259 |
+
function begin_mapping(distance){
|
260 |
+
var searchzipcode='a';
|
261 |
+
//Get the user input and use it
|
262 |
+
var userinput = $('#' + settings.inputID).val();
|
263 |
+
|
264 |
+
if (userinput === ""){
|
265 |
+
start();
|
266 |
+
}
|
267 |
+
else{
|
268 |
+
var g = new GoogleGeocode();
|
269 |
+
var address = userinput;
|
270 |
+
g.geocode(address, function(data) {
|
271 |
+
if(data !== null) {
|
272 |
+
olat = data.latitude;
|
273 |
+
olng = data.longitude;
|
274 |
+
mapping(olat, olng, userinput, distance,searchzipcode);
|
275 |
+
} else {
|
276 |
+
//Unable to geocode
|
277 |
+
alert(settings.addressErrorAlert);
|
278 |
+
}
|
279 |
+
});
|
280 |
+
}
|
281 |
+
}
|
282 |
+
|
283 |
+
//Process form input
|
284 |
+
$(function(){
|
285 |
+
//Handle form submission
|
286 |
+
function get_form_values(e){
|
287 |
+
//Stop the form submission
|
288 |
+
e.preventDefault();
|
289 |
+
|
290 |
+
if(settings.maxDistance === true){
|
291 |
+
var maxDistance = $('#' + settings.maxDistanceID).val();
|
292 |
+
//Start the mapping
|
293 |
+
begin_mapping(maxDistance);
|
294 |
+
}
|
295 |
+
else{
|
296 |
+
//Start the mapping
|
297 |
+
begin_mapping();
|
298 |
+
}
|
299 |
+
}
|
300 |
+
|
301 |
+
//ASP.net or regular submission?
|
302 |
+
if(settings.noForm === true){
|
303 |
+
$(document).on('click.'+prefix, '#' + settings.formContainerDiv + ' #submit', function(e){
|
304 |
+
get_form_values(e);
|
305 |
+
});
|
306 |
+
$(document).on('keyup.'+prefix, function(e){
|
307 |
+
if (e.keyCode === 13 && $('#' + settings.inputID).is(':focus')) {
|
308 |
+
get_form_values(e);
|
309 |
+
}
|
310 |
+
});
|
311 |
+
}
|
312 |
+
else{
|
313 |
+
$(document).on('submit.'+prefix, '#' + settings.formID, function(e){
|
314 |
+
get_form_values(e);
|
315 |
+
});
|
316 |
+
}
|
317 |
+
});
|
318 |
+
|
319 |
+
//Now all the mapping stuff
|
320 |
+
function mapping(orig_lat, orig_lng, origin, maxDistance,s){
|
321 |
+
$(function(){
|
322 |
+
|
323 |
+
// Enable the visual refresh https://developers.google.com/maps/documentation/javascript/basics#VisualRefresh
|
324 |
+
google.maps.visualRefresh = true;
|
325 |
+
|
326 |
+
var dataTypeRead;
|
327 |
+
|
328 |
+
//KML is read as XML
|
329 |
+
if(settings.dataType === 'kml'){
|
330 |
+
dataTypeRead = "xml";
|
331 |
+
}
|
332 |
+
else{
|
333 |
+
dataTypeRead = settings.dataType;
|
334 |
+
}
|
335 |
+
|
336 |
+
var dataurl;
|
337 |
+
var zipcode = $('#' + settings.inputID).val();
|
338 |
+
dataurl = (s)?settings.searchdataLocation+"?zipcode="+zipcode:(settings.dataLocation + (settings.dataType === 'jsonp' ? (settings.dataLocation.match(/\?/) ? '&' : '?') + 'callback=?' : ''));
|
339 |
+
//Process the data
|
340 |
+
$.ajax({
|
341 |
+
type: "GET",
|
342 |
+
url: dataurl,
|
343 |
+
dataType: dataTypeRead,
|
344 |
+
jsonpCallback: (settings.dataType === 'jsonp' ? settings.jsonpCallback : null),
|
345 |
+
beforeSend: function (){
|
346 |
+
// Callback
|
347 |
+
if(settings.callbackBeforeSend){
|
348 |
+
settings.callbackBeforeSend.call(this);
|
349 |
+
}
|
350 |
+
|
351 |
+
//Loading
|
352 |
+
if(settings.loading === true){
|
353 |
+
$('#' + settings.formContainerDiv).append('<div id="' + settings.loadingDiv +'"><\/div>');
|
354 |
+
}
|
355 |
+
|
356 |
+
},
|
357 |
+
complete: function (event, request, options){
|
358 |
+
// Callback
|
359 |
+
if(settings.callbackComplete){
|
360 |
+
settings.callbackComplete.call(this, event, request, options);
|
361 |
+
}
|
362 |
+
|
363 |
+
//Loading remove
|
364 |
+
if(settings.loading === true){
|
365 |
+
$('#' + settings.loadingDiv).remove();
|
366 |
+
}
|
367 |
+
},
|
368 |
+
success: function (data, xhr, options){
|
369 |
+
// Callback
|
370 |
+
if(settings.callbackSuccess){
|
371 |
+
settings.callbackSuccess.call(this, data, xhr, options);
|
372 |
+
}
|
373 |
+
|
374 |
+
//After the store locations file has been read successfully
|
375 |
+
var i = 0;
|
376 |
+
var firstRun;
|
377 |
+
|
378 |
+
//Set a variable for fullMapStart so we can detect the first run
|
379 |
+
if(settings.fullMapStart === true && $('#' + settings.mapDiv).hasClass('mapOpen') === false){
|
380 |
+
firstRun = true;
|
381 |
+
}
|
382 |
+
else{
|
383 |
+
reset();
|
384 |
+
}
|
385 |
+
|
386 |
+
$('#' + settings.mapDiv).addClass('mapOpen');
|
387 |
+
|
388 |
+
//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
|
389 |
+
if(settings.dataType === 'json' || settings.dataType === 'jsonp'){
|
390 |
+
//Process JSON
|
391 |
+
$.each(data, function(){
|
392 |
+
var key, value, locationData = {};
|
393 |
+
|
394 |
+
// Parse each data variables
|
395 |
+
for( key in this ){
|
396 |
+
value = this[key];
|
397 |
+
|
398 |
+
if(key === 'web'){
|
399 |
+
if ( value ) value = value.replace("http://",""); // Remove scheme (todo: should NOT be done)
|
400 |
+
}
|
401 |
+
|
402 |
+
locationData[key] = value;
|
403 |
+
}
|
404 |
+
|
405 |
+
if(!locationData['distance']){
|
406 |
+
locationData['distance'] = GeoCodeCalc.CalcDistance(orig_lat,orig_lng,locationData['lat'],locationData['lng'], GeoCodeCalc.EarthRadius);
|
407 |
+
}
|
408 |
+
|
409 |
+
//Create the array
|
410 |
+
if(settings.maxDistance === true && firstRun !== true && maxDistance){
|
411 |
+
if(locationData['distance'] < maxDistance){
|
412 |
+
locationset[i] = locationData;
|
413 |
+
}
|
414 |
+
else{
|
415 |
+
return;
|
416 |
+
}
|
417 |
+
}
|
418 |
+
else{
|
419 |
+
locationset[i] = locationData;
|
420 |
+
}
|
421 |
+
|
422 |
+
i++;
|
423 |
+
});
|
424 |
+
}
|
425 |
+
else if(settings.dataType === 'kml'){
|
426 |
+
//Process KML
|
427 |
+
$(data).find('Placemark').each(function(){
|
428 |
+
var locationData = {
|
429 |
+
'name': $(this).find('name').text(),
|
430 |
+
'lat': $(this).find('coordinates').text().split(",")[1],
|
431 |
+
'lng': $(this).find('coordinates').text().split(",")[0],
|
432 |
+
'description': $(this).find('description').text()
|
433 |
+
};
|
434 |
+
|
435 |
+
locationData['distance'] = GeoCodeCalc.CalcDistance(orig_lat,orig_lng,locationData['lat'],locationData['lng'], GeoCodeCalc.EarthRadius);
|
436 |
+
|
437 |
+
//Create the array
|
438 |
+
if(settings.maxDistance === true && firstRun !== true && maxDistance){
|
439 |
+
if(locationData['distance'] < maxDistance){
|
440 |
+
locationset[i] = locationData;
|
441 |
+
}
|
442 |
+
else{
|
443 |
+
return;
|
444 |
+
}
|
445 |
+
}
|
446 |
+
else{
|
447 |
+
locationset[i] = locationData;
|
448 |
+
}
|
449 |
+
|
450 |
+
i++;
|
451 |
+
});
|
452 |
+
}
|
453 |
+
else{
|
454 |
+
//Process XML
|
455 |
+
$(data).find('marker').each(function(){
|
456 |
+
var locationData = {
|
457 |
+
'storeid': $(this).attr('storeid'),
|
458 |
+
'name': $(this).attr('name'),
|
459 |
+
'lat': $(this).attr('lat'),
|
460 |
+
'lng': $(this).attr('lng'),
|
461 |
+
'address': $(this).attr('address'),
|
462 |
+
'address2': $(this).attr('address2'),
|
463 |
+
'city': $(this).attr('city'),
|
464 |
+
'state': $(this).attr('state'),
|
465 |
+
'postal': $(this).attr('postal'),
|
466 |
+
'country': $(this).attr('country'),
|
467 |
+
'phone': $(this).attr('phone'),
|
468 |
+
'email': $(this).attr('email'),
|
469 |
+
'web': $(this).attr('web'),
|
470 |
+
'hours1': $(this).attr('hours1'),
|
471 |
+
'hours2': $(this).attr('hours2'),
|
472 |
+
'hours3': $(this).attr('hours3'),
|
473 |
+
'category': $(this).attr('category'),
|
474 |
+
'storeimage': $(this).attr('storeimage'),
|
475 |
+
'fax': $(this).attr('fax'),
|
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);
|
skin/frontend/base/default/storelocator/js/noConflict.js
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
jQuery.noConflict();
|