Sparx_Storelocator - Version 0.1.0

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

Files changed (46) hide show
  1. app/code/community/Sparx/Storelocator/Block/Adminhtml/Region.php +19 -0
  2. app/code/community/Sparx/Storelocator/Block/Adminhtml/Storelocator.php +12 -0
  3. app/code/community/Sparx/Storelocator/Block/Adminhtml/Storelocator/Edit.php +45 -0
  4. app/code/community/Sparx/Storelocator/Block/Adminhtml/Storelocator/Edit/Form.php +19 -0
  5. app/code/community/Sparx/Storelocator/Block/Adminhtml/Storelocator/Edit/Tab/Form.php +182 -0
  6. app/code/community/Sparx/Storelocator/Block/Adminhtml/Storelocator/Edit/Tabs.php +24 -0
  7. app/code/community/Sparx/Storelocator/Block/Adminhtml/Storelocator/Grid.php +167 -0
  8. app/code/community/Sparx/Storelocator/Block/Storelocator.php +17 -0
  9. app/code/community/Sparx/Storelocator/Helper/Data.php +90 -0
  10. app/code/community/Sparx/Storelocator/Model/Mysql4/Storelocator.php +21 -0
  11. app/code/community/Sparx/Storelocator/Model/Mysql4/Storelocator/Collection.php +10 -0
  12. app/code/community/Sparx/Storelocator/Model/Status.php +15 -0
  13. app/code/community/Sparx/Storelocator/Model/Storelocator.php +10 -0
  14. app/code/community/Sparx/Storelocator/controllers/Adminhtml/StorelocatorController.php +236 -0
  15. app/code/community/Sparx/Storelocator/controllers/IndexController.php +184 -0
  16. app/code/community/Sparx/Storelocator/controllers/IndexController.php~ +192 -0
  17. app/code/community/Sparx/Storelocator/etc/adminhtml.xml +51 -0
  18. app/code/community/Sparx/Storelocator/etc/config.xml +103 -0
  19. app/code/community/Sparx/Storelocator/etc/system.xml +91 -0
  20. app/code/community/Sparx/Storelocator/sql/storelocator_setup/mysql4-install-0.1.0.php +41 -0
  21. app/code/community/Sparx/Storelocator/sql/storelocator_setup/mysql4-upgrade-0.1.0-0.1.1.php +10 -0
  22. app/design/adminhtml/default/default/layout/storelocator.xml +47 -0
  23. app/design/adminhtml/default/default/template/storelocator/region.phtml +28 -0
  24. app/design/frontend/base/default/layout/storelocator.xml +63 -0
  25. app/design/frontend/base/default/template/storelocator/storedetail.phtml +47 -0
  26. app/design/frontend/base/default/template/storelocator/storelocator.phtml +51 -0
  27. app/etc/modules/Sparx_Storelocator.xml +10 -0
  28. media/storelocator/images/100X100/1398758372_logo.jpg +0 -0
  29. media/storelocator/images/110X120/1398758372_logo.jpg +0 -0
  30. media/storelocator/images/1398758372_logo.jpg +0 -0
  31. media/storelocator/images/175X120/1398758372_logo.jpg +0 -0
  32. media/storelocator/images/175X175/1398758372_logo.jpg +0 -0
  33. media/storelocator/images/250X120/1398758372_logo.jpg +0 -0
  34. media/storelocator/images/logo.jpg +0 -0
  35. package.xml +18 -0
  36. skin/frontend/base/default/storelocator/a.js~ +0 -0
  37. skin/frontend/base/default/storelocator/css/map-style.css +1 -0
  38. skin/frontend/base/default/storelocator/css/map-style.less +220 -0
  39. skin/frontend/base/default/storelocator/css/map.css +250 -0
  40. skin/frontend/base/default/storelocator/css/mapbackup.css +244 -0
  41. skin/frontend/base/default/storelocator/jquery.storelocator.js~ +815 -0
  42. skin/frontend/base/default/storelocator/js/handlebars-1.0.0.min.js +214 -0
  43. skin/frontend/base/default/storelocator/js/jquery-1.10.1.min.js +6 -0
  44. skin/frontend/base/default/storelocator/js/jquery.storelocator.js +819 -0
  45. skin/frontend/base/default/storelocator/js/jquery.storelocator_1.js +818 -0
  46. 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}}&amp;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}}&amp;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={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"};var e=/[&<>"'`]/g;var p=/[&<>"'`]/;var t=function(i){return k[i]||"&amp;";
108
+ };d.Utils={extend:function(u,l){for(var i in l){if(l.hasOwnProperty(i)){u[i]=l[i];}}},escapeExpression:function(i){if(i instanceof d.SafeString){return i.toString();
109
+ }else{if(i==null||i===false){return"";}}i=i.toString();if(!p.test(i)){return i;}return i.replace(e,t);},isEmpty:function(i){if(!i&&i!==0){return true;}else{if(n.call(i)==="[object Array]"&&i.length===0){return true;
110
+ }else{return false;}}}};var j=d.Compiler=function(){};var g=d.JavaScriptCompiler=function(){};j.prototype={compiler:j,disassemble:function(){var z=this.opcodes,y,w=[],B,A;
111
+ for(var x=0,u=z.length;x<u;x++){y=z[x];if(y.opcode==="DECLARE"){w.push("DECLARE "+y.name+"="+y.value);}else{B=[];for(var v=0;v<y.args.length;v++){A=y.args[v];
112
+ if(typeof A==="string"){A='"'+A.replace("\n","\\n")+'"';}B.push(A);}w.push(y.opcode+" "+B.join(" "));}}return w.join("\n");},equals:function(u){var l=this.opcodes.length;
113
+ if(u.opcodes.length!==l){return false;}for(var x=0;x<l;x++){var y=this.opcodes[x],v=u.opcodes[x];if(y.opcode!==v.opcode||y.args.length!==v.args.length){return false;
114
+ }for(var w=0;w<y.args.length;w++){if(y.args[w]!==v.args[w]){return false;}}}l=this.children.length;if(u.children.length!==l){return false;}for(x=0;x<l;
115
+ x++){if(!this.children[x].equals(u.children[x])){return false;}}return true;},guid:0,compile:function(i,u){this.children=[];this.depths={list:[]};this.options=u;
116
+ var v=this.options.knownHelpers;this.options.knownHelpers={helperMissing:true,blockHelperMissing:true,each:true,"if":true,unless:true,"with":true,log:true};
117
+ if(v){for(var l in v){this.options.knownHelpers[l]=v[l];}}return this.program(i);},accept:function(i){return this[i.type](i);},program:function(w){var v=w.statements,y;
118
+ this.opcodes=[];for(var x=0,u=v.length;x<u;x++){y=v[x];this[y.type](y);}this.isSimple=u===1;this.depths.list=this.depths.list.sort(function(l,i){return l-i;
119
+ });return this;},compileProgram:function(w){var u=new this.compiler().compile(w,this.options);var x=this.guid++,z;this.usePartial=this.usePartial||u.usePartial;
120
+ this.children[x]=u;for(var y=0,v=u.depths.list.length;y<v;y++){z=u.depths.list[y];if(z<2){continue;}else{this.addDepth(z-1);}}return x;},block:function(w){var v=w.mustache,l=w.program,i=w.inverse;
121
+ if(l){l=this.compileProgram(l);}if(i){i=this.compileProgram(i);}var u=this.classifyMustache(v);if(u==="helper"){this.helperMustache(v,l,i);}else{if(u==="simple"){this.simpleMustache(v);
122
+ this.opcode("pushProgram",l);this.opcode("pushProgram",i);this.opcode("emptyHash");this.opcode("blockValue");}else{this.ambiguousMustache(v,l,i);this.opcode("pushProgram",l);
123
+ this.opcode("pushProgram",i);this.opcode("emptyHash");this.opcode("ambiguousBlockValue");}}this.opcode("append");},hash:function(x){var w=x.pairs,z,y;this.opcode("pushHash");
124
+ for(var v=0,u=w.length;v<u;v++){z=w[v];y=z[1];if(this.options.stringParams){if(y.depth){this.addDepth(y.depth);}this.opcode("getContext",y.depth||0);this.opcode("pushStringParam",y.stringModeValue,y.type);
125
+ }else{this.accept(y);}this.opcode("assignToHash",z[0]);}this.opcode("popHash");},partial:function(i){var l=i.partialName;this.usePartial=true;if(i.context){this.ID(i.context);
126
+ }else{this.opcode("push","depth0");}this.opcode("invokePartial",l.name);this.opcode("append");},content:function(i){this.opcode("appendContent",i.string);
127
+ },mustache:function(u){var i=this.options;var l=this.classifyMustache(u);if(l==="simple"){this.simpleMustache(u);}else{if(l==="helper"){this.helperMustache(u);
128
+ }else{this.ambiguousMustache(u);}}if(u.escaped&&!i.noEscape){this.opcode("appendEscaped");}else{this.opcode("append");}},ambiguousMustache:function(w,u,l){var x=w.id,v=x.parts[0],i=u!=null||l!=null;
129
+ this.opcode("getContext",x.depth);this.opcode("pushProgram",u);this.opcode("pushProgram",l);this.opcode("invokeAmbiguous",v,i);},simpleMustache:function(i){var l=i.id;
130
+ if(l.type==="DATA"){this.DATA(l);}else{if(l.parts.length){this.ID(l);}else{this.addDepth(l.depth);this.opcode("getContext",l.depth);this.opcode("pushContext");
131
+ }}this.opcode("resolvePossibleLambda");},helperMustache:function(v,l,i){var w=this.setupFullMustacheParams(v,l,i),u=v.id.parts[0];if(this.options.knownHelpers[u]){this.opcode("invokeKnownHelper",w.length,u);
132
+ }else{if(this.options.knownHelpersOnly){throw new Error("You specified knownHelpersOnly, but used the unknown helper "+u);}else{this.opcode("invokeHelper",w.length,u);
133
+ }}},ID:function(x){this.addDepth(x.depth);this.opcode("getContext",x.depth);var v=x.parts[0];if(!v){this.opcode("pushContext");}else{this.opcode("lookupOnContext",x.parts[0]);
134
+ }for(var w=1,u=x.parts.length;w<u;w++){this.opcode("lookup",x.parts[w]);}},DATA:function(w){this.options.data=true;if(w.id.isScoped||w.id.depth){throw new d.Exception("Scoped data references are not supported: "+w.original);
135
+ }this.opcode("lookupData");var x=w.id.parts;for(var v=0,u=x.length;v<u;v++){this.opcode("lookup",x[v]);}},STRING:function(i){this.opcode("pushString",i.string);
136
+ },INTEGER:function(i){this.opcode("pushLiteral",i.integer);},BOOLEAN:function(i){this.opcode("pushLiteral",i.bool);},comment:function(){},opcode:function(i){this.opcodes.push({opcode:i,args:[].slice.call(arguments,1)});
137
+ },declare:function(i,l){this.opcodes.push({opcode:"DECLARE",name:i,value:l});},addDepth:function(i){if(isNaN(i)){throw new Error("EWOT");}if(i===0){return;
138
+ }if(!this.depths[i]){this.depths[i]=true;this.depths.list.push(i);}},classifyMustache:function(v){var u=v.isHelper;var w=v.eligibleHelper;var l=this.options;
139
+ if(w&&!u){var i=v.id.parts[0];if(l.knownHelpers[i]){u=true;}else{if(l.knownHelpersOnly){w=false;}}}if(u){return"helper";}else{if(w){return"ambiguous";}else{return"simple";
140
+ }}},pushParams:function(v){var l=v.length,u;while(l--){u=v[l];if(this.options.stringParams){if(u.depth){this.addDepth(u.depth);}this.opcode("getContext",u.depth||0);
141
+ this.opcode("pushStringParam",u.stringModeValue,u.type);}else{this[u.type](u);}}},setupMustacheParams:function(i){var l=i.params;this.pushParams(l);if(i.hash){this.hash(i.hash);
142
+ }else{this.opcode("emptyHash");}return l;},setupFullMustacheParams:function(u,l,i){var v=u.params;this.pushParams(v);this.opcode("pushProgram",l);this.opcode("pushProgram",i);
143
+ if(u.hash){this.hash(u.hash);}else{this.opcode("emptyHash");}return v;}};var s=function(i){this.value=i;};g.prototype={nameLookup:function(l,i){if(/^[0-9]+$/.test(i)){return l+"["+i+"]";
144
+ }else{if(g.isValidJavaScriptVariableName(i)){return l+"."+i;}else{return l+"['"+i+"']";}}},appendToBuffer:function(i){if(this.environment.isSimple){return"return "+i+";";
145
+ }else{return{appendToBuffer:true,content:i,toString:function(){return"buffer += "+i+";";}};}},initializeBuffer:function(){return this.quotedString("");
146
+ },namespace:"Handlebars",compile:function(i,l,v,u){this.environment=i;this.options=l||{};d.log(d.logger.DEBUG,this.environment.disassemble()+"\n\n");this.name=this.environment.name;
147
+ this.isChild=!!v;this.context=v||{programs:[],environments:[],aliases:{}};this.preamble();this.stackSlot=0;this.stackVars=[];this.registers={list:[]};this.compileStack=[];
148
+ this.inlineStack=[];this.compileChildren(i,l);var x=i.opcodes,w;this.i=0;for(m=x.length;this.i<m;this.i++){w=x[this.i];if(w.opcode==="DECLARE"){this[w.name]=w.value;
149
+ }else{this[w.opcode].apply(this,w.args);}}return this.createFunctionContext(u);},nextOpcode:function(){var i=this.environment.opcodes;return i[this.i+1];
150
+ },eat:function(){this.i=this.i+1;},preamble:function(){var i=[];if(!this.isChild){var l=this.namespace;var u="helpers = this.merge(helpers, "+l+".helpers);";
151
+ if(this.environment.usePartial){u=u+" partials = this.merge(partials, "+l+".partials);";}if(this.options.data){u=u+" data = data || {};";}i.push(u);}else{i.push("");
152
+ }if(!this.environment.isSimple){i.push(", buffer = "+this.initializeBuffer());}else{i.push("");}this.lastContext=0;this.source=i;},createFunctionContext:function(B){var w=this.stackVars.concat(this.registers.list);
153
+ if(w.length>0){this.source[1]=this.source[1]+", "+w.join(", ");}if(!this.isChild){for(var A in this.context.aliases){if(this.context.aliases.hasOwnProperty(A)){this.source[1]=this.source[1]+", "+A+"="+this.context.aliases[A];
154
+ }}}if(this.source[1]){this.source[1]="var "+this.source[1].substring(2)+";";}if(!this.isChild){this.source[1]+="\n"+this.context.programs.join("\n")+"\n";
155
+ }if(!this.environment.isSimple){this.source.push("return buffer;");}var y=this.isChild?["depth0","data"]:["Handlebars","depth0","helpers","partials","data"];
156
+ for(var z=0,x=this.environment.depths.list.length;z<x;z++){y.push("depth"+this.environment.depths.list[z]);}var u=this.mergeSource();if(!this.isChild){var C=d.COMPILER_REVISION,v=d.REVISION_CHANGES[C];
157
+ u="this.compilerInfo = ["+C+",'"+v+"'];\n"+u;}if(B){y.push(u);return Function.apply(this,y);}else{var D="function "+(this.name||"")+"("+y.join(",")+") {\n "+u+"}";
158
+ d.log(d.logger.DEBUG,D+"\n\n");return D;}},mergeSource:function(){var x="",v;for(var w=0,l=this.source.length;w<l;w++){var u=this.source[w];if(u.appendToBuffer){if(v){v=v+"\n + "+u.content;
159
+ }else{v=u.content;}}else{if(v){x+="buffer += "+v+";\n ";v=c;}x+=u+"\n ";}}return x;},blockValue:function(){this.context.aliases.blockHelperMissing="helpers.blockHelperMissing";
160
+ var i=["depth0"];this.setupParams(0,i);this.replaceStack(function(l){i.splice(1,0,l);return"blockHelperMissing.call("+i.join(", ")+")";});},ambiguousBlockValue:function(){this.context.aliases.blockHelperMissing="helpers.blockHelperMissing";
161
+ var l=["depth0"];this.setupParams(0,l);var i=this.topStack();l.splice(1,0,i);l[l.length-1]="options";this.source.push("if (!"+this.lastHelper+") { "+i+" = blockHelperMissing.call("+l.join(", ")+"); }");
162
+ },appendContent:function(i){this.source.push(this.appendToBuffer(this.quotedString(i)));},append:function(){this.flushInline();var i=this.popStack();this.source.push("if("+i+" || "+i+" === 0) { "+this.appendToBuffer(i)+" }");
163
+ if(this.environment.isSimple){this.source.push("else { "+this.appendToBuffer("''")+" }");}},appendEscaped:function(){this.context.aliases.escapeExpression="this.escapeExpression";
164
+ this.source.push(this.appendToBuffer("escapeExpression("+this.popStack()+")"));},getContext:function(i){if(this.lastContext!==i){this.lastContext=i;}},lookupOnContext:function(i){this.push(this.nameLookup("depth"+this.lastContext,i,"context"));
165
+ },pushContext:function(){this.pushStackLiteral("depth"+this.lastContext);},resolvePossibleLambda:function(){this.context.aliases.functionType='"function"';
166
+ this.replaceStack(function(i){return"typeof "+i+" === functionType ? "+i+".apply(depth0) : "+i;});},lookup:function(i){this.replaceStack(function(l){return l+" == null || "+l+" === false ? "+l+" : "+this.nameLookup(l,i,"context");
167
+ });},lookupData:function(i){this.push("data");},pushStringParam:function(i,l){this.pushStackLiteral("depth"+this.lastContext);this.pushString(l);if(typeof i==="string"){this.pushString(i);
168
+ }else{this.pushStackLiteral(i);}},emptyHash:function(){this.pushStackLiteral("{}");if(this.options.stringParams){this.register("hashTypes","{}");this.register("hashContexts","{}");
169
+ }},pushHash:function(){this.hash={values:[],types:[],contexts:[]};},popHash:function(){var i=this.hash;this.hash=c;if(this.options.stringParams){this.register("hashContexts","{"+i.contexts.join(",")+"}");
170
+ this.register("hashTypes","{"+i.types.join(",")+"}");}this.push("{\n "+i.values.join(",\n ")+"\n }");},pushString:function(i){this.pushStackLiteral(this.quotedString(i));
171
+ },push:function(i){this.inlineStack.push(i);return i;},pushLiteral:function(i){this.pushStackLiteral(i);},pushProgram:function(i){if(i!=null){this.pushStackLiteral(this.programExpression(i));
172
+ }else{this.pushStackLiteral(null);}},invokeHelper:function(u,i){this.context.aliases.helperMissing="helpers.helperMissing";var l=this.lastHelper=this.setupHelper(u,i,true);
173
+ var v=this.nameLookup("depth"+this.lastContext,i,"context");this.push(l.name+" || "+v);this.replaceStack(function(w){return w+" ? "+w+".call("+l.callParams+") : helperMissing.call("+l.helperMissingParams+")";
174
+ });},invokeKnownHelper:function(u,i){var l=this.setupHelper(u,i);this.push(l.name+".call("+l.callParams+")");},invokeAmbiguous:function(i,w){this.context.aliases.functionType='"function"';
175
+ this.pushStackLiteral("{}");var l=this.setupHelper(0,i,w);var u=this.lastHelper=this.nameLookup("helpers",i,"helper");var x=this.nameLookup("depth"+this.lastContext,i,"context");
176
+ var v=this.nextStack();this.source.push("if ("+v+" = "+u+") { "+v+" = "+v+".call("+l.callParams+"); }");this.source.push("else { "+v+" = "+x+"; "+v+" = typeof "+v+" === functionType ? "+v+".apply(depth0) : "+v+"; }");
177
+ },invokePartial:function(i){var l=[this.nameLookup("partials",i,"partial"),"'"+i+"'",this.popStack(),"helpers","partials"];if(this.options.data){l.push("data");
178
+ }this.context.aliases.self="this";this.push("self.invokePartial("+l.join(", ")+")");},assignToHash:function(l){var v=this.popStack(),i,u;if(this.options.stringParams){u=this.popStack();
179
+ i=this.popStack();}var w=this.hash;if(i){w.contexts.push("'"+l+"': "+i);}if(u){w.types.push("'"+l+"': "+u);}w.values.push("'"+l+"': ("+v+")");},compiler:g,compileChildren:function(u,x){var z=u.children,B,A;
180
+ for(var y=0,v=z.length;y<v;y++){B=z[y];A=new this.compiler();var w=this.matchExistingProgram(B);if(w==null){this.context.programs.push("");w=this.context.programs.length;
181
+ B.index=w;B.name="program"+w;this.context.programs[w]=A.compile(B,x,this.context);this.context.environments[w]=B;}else{B.index=w;B.name="program"+w;}}},matchExistingProgram:function(w){for(var v=0,u=this.context.environments.length;
182
+ v<u;v++){var l=this.context.environments[v];if(l&&l.equals(w)){return v;}}},programExpression:function(v){this.context.aliases.self="this";if(v==null){return"self.noop";
183
+ }var A=this.environment.children[v],z=A.depths.list,y;var x=[A.index,A.name,"data"];for(var w=0,u=z.length;w<u;w++){y=z[w];if(y===1){x.push("depth0");}else{x.push("depth"+(y-1));
184
+ }}return(z.length===0?"self.program(":"self.programWithDepth(")+x.join(", ")+")";},register:function(i,l){this.useRegister(i);this.source.push(i+" = "+l+";");
185
+ },useRegister:function(i){if(!this.registers[i]){this.registers[i]=true;this.registers.list.push(i);}},pushStackLiteral:function(i){return this.push(new s(i));
186
+ },pushStack:function(l){this.flushInline();var i=this.incrStack();if(l){this.source.push(i+" = "+l+";");}this.compileStack.push(i);return i;},replaceStack:function(y){var v="",x=this.isInline(),i;
187
+ if(x){var w=this.popStack(true);if(w instanceof s){i=w.value;}else{var l=this.stackSlot?this.topStackName():this.incrStack();v="("+this.push(l)+" = "+w+"),";
188
+ i=this.topStack();}}else{i=this.topStack();}var u=y.call(this,i);if(x){if(this.inlineStack.length||this.compileStack.length){this.popStack();}this.push("("+v+u+")");
189
+ }else{if(!/^stack/.test(i)){i=this.nextStack();}this.source.push(i+" = ("+v+u+");");}return i;},nextStack:function(){return this.pushStack();},incrStack:function(){this.stackSlot++;
190
+ if(this.stackSlot>this.stackVars.length){this.stackVars.push("stack"+this.stackSlot);}return this.topStackName();},topStackName:function(){return"stack"+this.stackSlot;
191
+ },flushInline:function(){var v=this.inlineStack;if(v.length){this.inlineStack=[];for(var u=0,l=v.length;u<l;u++){var w=v[u];if(w instanceof s){this.compileStack.push(w);
192
+ }else{this.pushStack(w);}}}},isInline:function(){return this.inlineStack.length;},popStack:function(i){var u=this.isInline(),l=(u?this.inlineStack:this.compileStack).pop();
193
+ if(!i&&(l instanceof s)){return l.value;}else{if(!u){this.stackSlot--;}return l;}},topStack:function(l){var i=(this.isInline()?this.inlineStack:this.compileStack),u=i[i.length-1];
194
+ if(!l&&(u instanceof s)){return u.value;}else{return u;}},quotedString:function(i){return'"'+i.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")+'"';
195
+ },setupHelper:function(w,u,l){var v=[];this.setupParams(w,v,l);var i=this.nameLookup("helpers",u,"helper");return{params:v,name:i,callParams:["depth0"].concat(v).join(", "),helperMissingParams:l&&["depth0",this.quotedString(u)].concat(v).join(", ")};
196
+ },setupParams:function(w,v,l){var C=[],A=[],B=[],u,x,z;C.push("hash:"+this.popStack());x=this.popStack();z=this.popStack();if(z||x){if(!z){this.context.aliases.self="this";
197
+ z="self.noop";}if(!x){this.context.aliases.self="this";x="self.noop";}C.push("inverse:"+x);C.push("fn:"+z);}for(var y=0;y<w;y++){u=this.popStack();v.push(u);
198
+ if(this.options.stringParams){B.push(this.popStack());A.push(this.popStack());}}if(this.options.stringParams){C.push("contexts:["+A.join(",")+"]");C.push("types:["+B.join(",")+"]");
199
+ C.push("hashContexts:hashContexts");C.push("hashTypes:hashTypes");}if(this.options.data){C.push("data:data");}C="{"+C.join(",")+"}";if(l){this.register("options",C);
200
+ v.push("options");}else{v.push(C);}return v.join(", ");}};var f=("break else new var case finally return void catch for switch while continue function this with default if throw delete in try do instanceof typeof abstract enum int short boolean export interface static byte extends long super char final native synchronized class float package throws const goto private transient debugger implements protected volatile double import public let yield").split(" ");
201
+ var a=g.RESERVED_WORDS={};for(var o=0,m=f.length;o<m;o++){a[f[o]]=true;}g.isValidJavaScriptVariableName=function(i){if(!g.RESERVED_WORDS[i]&&/^[a-zA-Z_$][0-9a-zA-Z_$]+$/.test(i)){return true;
202
+ }return false;};d.precompile=function(u,v){if(u==null||(typeof u!=="string"&&u.constructor!==d.AST.ProgramNode)){throw new d.Exception("You must pass a string or Handlebars AST to Handlebars.precompile. You passed "+u);
203
+ }v=v||{};if(!("data" in v)){v.data=true;}var l=d.parse(u);var i=new j().compile(l,v);return new g().compile(i,v);};d.compile=function(i,l){if(i==null||(typeof i!=="string"&&i.constructor!==d.AST.ProgramNode)){throw new d.Exception("You must pass a string or Handlebars AST to Handlebars.compile. You passed "+i);
204
+ }l=l||{};if(!("data" in l)){l.data=true;}var v;function u(){var y=d.parse(i);var x=new j().compile(y,l);var w=new g().compile(x,l,c,true);return d.template(w);
205
+ }return function(x,w){if(!v){v=u();}return v.call(this,x,w);};};d.VM={template:function(i){var l={escapeExpression:d.Utils.escapeExpression,invokePartial:d.VM.invokePartial,programs:[],program:function(v,w,x){var u=this.programs[v];
206
+ if(x){u=d.VM.program(v,w,x);}else{if(!u){u=this.programs[v]=d.VM.program(v,w);}}return u;},merge:function(w,v){var u=w||v;if(w&&v){u={};d.Utils.extend(u,v);
207
+ d.Utils.extend(u,w);}return u;},programWithDepth:d.VM.programWithDepth,noop:d.VM.noop,compilerInfo:null};return function(y,x){x=x||{};var v=i.call(l,d,y,x.helpers,x.partials,x.data);
208
+ var z=l.compilerInfo||[],w=z[0]||1,B=d.COMPILER_REVISION;if(w!==B){if(w<B){var u=d.REVISION_CHANGES[B],A=d.REVISION_CHANGES[w];throw"Template was precompiled with an older version of Handlebars than the current runtime. Please update your precompiler to a newer version ("+u+") or downgrade your runtime to an older version ("+A+").";
209
+ }else{throw"Template was precompiled with a newer version of Handlebars than the current runtime. Please update your runtime to a newer version ("+z[1]+").";
210
+ }}return v;};},programWithDepth:function(v,w,x){var u=Array.prototype.slice.call(arguments,3);var l=function(y,i){i=i||{};return w.apply(this,[y,i.data||x].concat(u));
211
+ };l.program=v;l.depth=u.length;return l;},program:function(u,v,w){var l=function(x,i){i=i||{};return v(x,i.data||w);};l.program=u;l.depth=0;return l;},noop:function(){return"";
212
+ },invokePartial:function(i,u,w,x,v,y){var l={helpers:x,partials:v,data:y};if(i===c){throw new d.Exception("The partial "+u+" could not be found");}else{if(i instanceof Function){return i(w,l);
213
+ }else{if(!d.compile){throw new d.Exception("The partial "+u+" could not be compiled when running in runtime-only mode");}else{v[u]=d.compile(i,{data:y!==c});
214
+ return v[u](w,l);}}}}};d.template=d.VM.template;})(Handlebars);
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();