CorlleteLab_Imagezoom - Version 0.1.5

Version Notes

N/A

Download this release

Release Info

Developer Desislav Yosifov
Extension CorlleteLab_Imagezoom
Version 0.1.5
Comparing to
See all releases


Version 0.1.5

Files changed (26) hide show
  1. app/code/community/CorlleteLab/Imagezoom/Block/Catalog/Product/View.php +69 -0
  2. app/code/community/CorlleteLab/Imagezoom/Block/Html/Head.php +83 -0
  3. app/code/community/CorlleteLab/Imagezoom/Helper/Data.php +69 -0
  4. app/code/community/CorlleteLab/Imagezoom/Model/Adminhtml/System/Color.php +27 -0
  5. app/code/community/CorlleteLab/Imagezoom/Model/Adminhtml/System/Config/Source/Position.php +26 -0
  6. app/code/community/CorlleteLab/Imagezoom/Model/Adminhtml/System/Config/Source/Zoomeffect.php +24 -0
  7. app/code/community/CorlleteLab/Imagezoom/Model/Adminhtml/System/Size.php +27 -0
  8. app/code/community/CorlleteLab/Imagezoom/controllers/IndexController.php +19 -0
  9. app/code/community/CorlleteLab/Imagezoom/controllers/ProductController.php +51 -0
  10. app/code/community/CorlleteLab/Imagezoom/etc/adminhtml.xml +38 -0
  11. app/code/community/CorlleteLab/Imagezoom/etc/config.xml +151 -0
  12. app/code/community/CorlleteLab/Imagezoom/etc/system.xml +297 -0
  13. app/design/frontend/base/default/layout/imagezoom.xml +48 -0
  14. app/design/frontend/base/default/template/corlletelab/imagezoom/grouped.phtml +81 -0
  15. app/design/frontend/base/default/template/corlletelab/imagezoom/media.phtml +145 -0
  16. app/design/frontend/default/default/layout/imagezoom.xml +48 -0
  17. app/design/frontend/default/default/template/corlletelab/imagezoom/grouped.phtml +81 -0
  18. app/design/frontend/default/default/template/corlletelab/imagezoom/media.phtml +145 -0
  19. app/etc/modules/CorlleteLab_Imagezoom.xml +21 -0
  20. app/locale/en_US/CorlleteLab_ImageZoom.csv +33 -0
  21. js/corlletelab/imagezoom/cloud-zoom.1.0.2.js +391 -0
  22. js/corlletelab/imagezoom/jquery-1.6.2.min.js +18 -0
  23. js/corlletelab/imagezoom/product_override.js +106 -0
  24. package.xml +18 -0
  25. skin/frontend/base/default/css/corlletelab/imagezoom.css +32 -0
  26. skin/frontend/default/default/css/corlletelab/imagezoom.css +43 -0
app/code/community/CorlleteLab/Imagezoom/Block/Catalog/Product/View.php ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * CorlleteLab
4
+ *
5
+ * Imagezoom extension
6
+ *
7
+ * @category CorlleteLab
8
+ * @package CorlleteLab_Imagezoom
9
+ * @copyright Copyright (c) 2011 Corllete Ltd. (http://www.clabteam.com/)
10
+ * @author CorlleteLab Dev Team <office@clabteam.com>
11
+ */
12
+
13
+ class CorlleteLab_Imagezoom_Block_Catalog_Product_View extends Mage_Catalog_Block_Product_View
14
+ {
15
+ /**
16
+ * Add meta information from product to head block
17
+ *
18
+ * @return Mage_Catalog_Block_Product_View
19
+ */
20
+ protected function _prepareLayout()
21
+ {
22
+ $this->getLayout()->createBlock('catalog/breadcrumbs');
23
+ $headBlock = $this->getLayout()->getBlock('head');
24
+
25
+ if ($headBlock) {
26
+ /* ImageZoom Options */
27
+ if (Mage::getStoreConfig('imagezoomconfig/moduleoptions/moduleenable')) {
28
+ $jq_noConflict = '
29
+ <script type="text/javascript">
30
+ //<![CDATA[
31
+ var jq = jQuery.noConflict();
32
+ //]]>
33
+ </script>
34
+ ';
35
+
36
+ if (Mage::getStoreConfig('imagezoomconfig/moduleoptions/jquery')) {
37
+ if (Mage::getStoreConfig('imagezoomconfig/moduleoptions/jqueryexternal')) {
38
+ $headBlock -> addExternalItem('external_js','https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js');
39
+ } else {
40
+ $headBlock -> addExternalItem('external_js',Mage::getBaseUrl().'js/corlletelab/imagezoom/jquery-1.6.2.min.js');
41
+ }
42
+
43
+ $headBlock -> addExternalItem('source',$jq_noConflict);
44
+ }
45
+
46
+ $headBlock -> addExternalItem('external_js', Mage::getBaseUrl().'js/corlletelab/imagezoom/cloud-zoom.1.0.2.js');
47
+ $headBlock -> addItem('skin_css','css/corlletelab/imagezoom.css');
48
+
49
+ $css = '
50
+ <style type="text/css">
51
+ .cloud-zoom-lens {
52
+ border: '.Mage::getStoreConfig('imagezoomconfig/imagezoom_style_css/lens_border').'px solid #'.Mage::getStoreConfig('imagezoomconfig/imagezoom_style_css/lens_border_color').';
53
+ margin:-'.Mage::getStoreConfig('imagezoomconfig/imagezoom_style_css/lens_border').'px; /* Set this to minus the border thickness. */
54
+ background-color: #'.Mage::getStoreConfig('imagezoomconfig/imagezoom_style_css/lens_background_color').';
55
+ }
56
+ .cloud-zoom-big {
57
+ border: '.Mage::getStoreConfig('imagezoomconfig/imagezoom_style_css/zoom_window_border').'px solid #'.Mage::getStoreConfig('imagezoomconfig/imagezoom_style_css/zoom_window_border_color').';
58
+ }
59
+ </style>
60
+ ';
61
+
62
+ $headBlock -> addExternalItem('source',$css);
63
+ }
64
+
65
+ }
66
+
67
+ return parent::_prepareLayout();
68
+ }
69
+ }
app/code/community/CorlleteLab/Imagezoom/Block/Html/Head.php ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Inchoo Xternal Html page block
4
+ *
5
+ * @category Inchoo
6
+ * @package Inchoo_Xternal
7
+ * @author Vedran Subotic, Inchoo <web@inchoo.net>
8
+ */
9
+ class CorlleteLab_Imagezoom_Block_Html_Head extends Mage_Page_Block_Html_Head
10
+ {
11
+ /**
12
+ * Add HEAD External Item
13
+ *
14
+ * Allowed types:
15
+ * - js
16
+ * - js_css
17
+ * - skin_js
18
+ * - skin_css
19
+ * - rss
20
+ *
21
+ * @param string $type
22
+ * @param string $name
23
+ * @param string $params
24
+ * @param string $if
25
+ * @param string $cond
26
+ * @return Mage_Page_Block_Html_Head
27
+ */
28
+ public function addExternalItem($type, $name, $params=null, $if=null, $cond=null)
29
+ {
30
+ parent::addItem($type, $name, $params=null, $if=null, $cond=null);
31
+ }
32
+
33
+ /**
34
+ * Remove External Item from HEAD entity
35
+ *
36
+ * @param string $type
37
+ * @param string $name
38
+ * @return Mage_Page_Block_Html_Head
39
+ */
40
+ public function removeExternalItem($type, $name)
41
+ {
42
+ parent::removeItem($type, $name);
43
+ }
44
+
45
+ /**
46
+ * Classify HTML head item and queue it into "lines" array
47
+ *
48
+ * @see self::getCssJsHtml()
49
+ * @param array &$lines
50
+ * @param string $itemIf
51
+ * @param string $itemType
52
+ * @param string $itemParams
53
+ * @param string $itemName
54
+ * @param array $itemThe
55
+ */
56
+ protected function _separateOtherHtmlHeadElements(&$lines, $itemIf, $itemType, $itemParams, $itemName, $itemThe)
57
+ {
58
+ $params = $itemParams ? ' ' . $itemParams : '';
59
+ $href = $itemName;
60
+ switch ($itemType) {
61
+ case 'rss':
62
+ $lines[$itemIf]['other'][] = sprintf('<link href="%s"%s rel="alternate" type="application/rss+xml" />',
63
+ $href, $params
64
+ );
65
+ break;
66
+ case 'link_rel':
67
+ $lines[$itemIf]['other'][] = sprintf('<link%s href="%s" />', $params, $href);
68
+ break;
69
+
70
+ case 'external_js':
71
+ $lines[$itemIf]['other'][] = sprintf('<script type="text/javascript" src="%s" %s></script>', $href, $params);
72
+ break;
73
+
74
+ case 'external_css':
75
+ $lines[$itemIf]['other'][] = sprintf('<link rel="stylesheet" type="text/css" href="%s" %s/>', $href, $params);
76
+ break;
77
+ case 'source':
78
+ $lines[$itemIf]['other'][] = sprintf('%s', $href);
79
+ break;
80
+ }
81
+ }
82
+
83
+ }
app/code/community/CorlleteLab/Imagezoom/Helper/Data.php ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * CorlleteLab
4
+ *
5
+ * Imagezoom extension
6
+ *
7
+ * @category CorlleteLab
8
+ * @package CorlleteLab_Imagezoom
9
+ * @copyright Copyright (c) 2011 Corllete Ltd. (http://www.clabteam.com/)
10
+ * @author CorlleteLab Dev Team <office@clabteam.com>
11
+ */
12
+
13
+ class CorlleteLab_Imagezoom_Helper_Data extends Mage_Core_Helper_Abstract
14
+ {
15
+ public function getZoomConfig()
16
+ {
17
+
18
+ $zoom_options = Mage::getStoreConfig('imagezoomconfig/imagezoom_options');
19
+ $zoom_cfg = '';
20
+ $cnt = 0;
21
+
22
+ switch($zoom_options['zoomeffect'])
23
+ {
24
+ case '1':
25
+ $zoom_options['tint'] = "'#".$zoom_options['tintColor']."'";
26
+ break;
27
+ case '2':
28
+ $zoom_options['softFocus'] = true;
29
+ break;
30
+ }
31
+
32
+ foreach ($zoom_options as $key => $value )
33
+ {
34
+ if ($value != '' && $key != 'img_size')
35
+ {
36
+ $cnt++;
37
+
38
+ $zoom_cfg .= ($cnt != 1 ) ? ',' : '';
39
+ $zoom_cfg .= $key.':'.$value;
40
+ }
41
+ }
42
+
43
+ return $zoom_cfg;
44
+ }
45
+
46
+ public function getAllImages($product)
47
+ {
48
+ $productID = Mage::getModel('catalog/product')->load($product->getId());
49
+
50
+ if ($productID['media_gallery'])
51
+ {
52
+ $images = new Varien_Data_Collection();
53
+
54
+ foreach ($productID->getMediaGallery('images') as $image)
55
+ {
56
+ $image['url'] = $productID->getMediaConfig()->getMediaUrl($image['file']);
57
+ $image['id'] = isset($image['value_id']) ? $image['value_id'] : null;
58
+ $image['path'] = $productID->getMediaConfig()->getMediaPath($image['file']);
59
+ $image['main_image'] = ($productID['image'] == $image['file']) ? true : false;
60
+ $images->addItem(new Varien_Object($image));
61
+ }
62
+
63
+ $productID->setData('media_gallery_images', $images);
64
+ }
65
+
66
+ return $productID->getData('media_gallery_images');
67
+ }
68
+ }
69
+ ?>
app/code/community/CorlleteLab/Imagezoom/Model/Adminhtml/System/Color.php ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * CorlleteLab
4
+ *
5
+ * Imagezoom extension
6
+ *
7
+ * @category CorlleteLab
8
+ * @package CorlleteLab_Imagezoom
9
+ * @copyright Copyright (c) 2011 Corllete Ltd. (http://www.clabteam.com/)
10
+ * @author CorlleteLab Dev Team <office@clabteam.com>
11
+ */
12
+
13
+ class CorlleteLab_Imagezoom_Model_Adminhtml_System_Color extends Mage_Core_Model_Config_Data
14
+ {
15
+ public function save()
16
+ {
17
+ $value = $this->getValue(); //get the value from our config
18
+
19
+ if((strlen($value) >0 && strlen($value) < 3) || (strlen($value) > 3 && strlen($value) < 6) || strlen($value) > 6)
20
+ {
21
+ Mage::throwException("Please enter valid color value (3 or 6 characters). Colours should be specified in hex format");
22
+ }
23
+
24
+ return parent::save();
25
+ }
26
+ }
27
+ ?>
app/code/community/CorlleteLab/Imagezoom/Model/Adminhtml/System/Config/Source/Position.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * CorlleteLab
4
+ *
5
+ * Imagezoom extension
6
+ *
7
+ * @category CorlleteLab
8
+ * @package CorlleteLab_Imagezoom
9
+ * @copyright Copyright (c) 2011 Corllete Ltd. (http://www.clabteam.com/)
10
+ * @author CorlleteLab Dev Team <office@clabteam.com>
11
+ */
12
+
13
+ class CorlleteLab_Imagezoom_Model_Adminhtml_System_Config_Source_Position
14
+ {
15
+ public function toOptionArray()
16
+ {
17
+ return array(
18
+ array('value' => "'left'", 'label' => Mage::helper('imagezoom')->__('Left')),
19
+ array('value' => "'right'", 'label' => Mage::helper('imagezoom')->__('Right')),
20
+ array('value' => "'top'", 'label' => Mage::helper('imagezoom')->__('Top')),
21
+ array('value' => "'bottom'", 'label' => Mage::helper('imagezoom')->__('Bottom')),
22
+ array('value' => "'inside'", 'label' => Mage::helper('imagezoom')->__('Inside (Inner Zoom)'))
23
+ );
24
+ }
25
+ }
26
+ ?>
app/code/community/CorlleteLab/Imagezoom/Model/Adminhtml/System/Config/Source/Zoomeffect.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * CorlleteLab
4
+ *
5
+ * Imagezoom extension
6
+ *
7
+ * @category CorlleteLab
8
+ * @package CorlleteLab_Imagezoom
9
+ * @copyright Copyright (c) 2011 Corllete Ltd. (http://www.clabteam.com/)
10
+ * @author CorlleteLab Dev Team <office@clabteam.com>
11
+ */
12
+
13
+ class CorlleteLab_Imagezoom_Model_Adminhtml_System_Config_Source_Zoomeffect
14
+ {
15
+ public function toOptionArray()
16
+ {
17
+ return array(
18
+ array('value' => "0", 'label' => Mage::helper('imagezoom')->__('None')),
19
+ array('value' => "1", 'label' => Mage::helper('imagezoom')->__('Tint')),
20
+ array('value' => "2", 'label' => Mage::helper('imagezoom')->__('Soft Focus')),
21
+ );
22
+ }
23
+ }
24
+ ?>
app/code/community/CorlleteLab/Imagezoom/Model/Adminhtml/System/Size.php ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * CorlleteLab
4
+ *
5
+ * Imagezoom extension
6
+ *
7
+ * @category CorlleteLab
8
+ * @package CorlleteLab_Imagezoom
9
+ * @copyright Copyright (c) 2011 Corllete Ltd. (http://www.clabteam.com/)
10
+ * @author CorlleteLab Dev Team <office@clabteam.com>
11
+ */
12
+
13
+ class CorlleteLab_Imagezoom_Model_Adminhtml_System_Size extends Mage_Core_Model_Config_Data
14
+ {
15
+ public function save()
16
+ {
17
+ $value = $this->getValue(); //get the value from our config
18
+
19
+ if($value == '')
20
+ {
21
+ $this->setValue(265); //set default value
22
+ }
23
+
24
+ return parent::save();
25
+ }
26
+ }
27
+ ?>
app/code/community/CorlleteLab/Imagezoom/controllers/IndexController.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * CorlleteLab
4
+ *
5
+ * Imagezoom extension
6
+ *
7
+ * @category CorlleteLab
8
+ * @package CorlleteLab_Imagezoom
9
+ * @copyright Copyright (c) 2011 Corllete Ltd. (http://www.clabteam.com/)
10
+ * @author CorlleteLab Dev Team <office@clabteam.com>
11
+ */
12
+
13
+ class CorlleteLab_Imagezoom_IndexController extends Mage_Core_Controller_Front_Action
14
+ {
15
+ public function indexAction()
16
+ {
17
+ }
18
+ }
19
+ ?>
app/code/community/CorlleteLab/Imagezoom/controllers/ProductController.php ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * CorlleteLab
4
+ *
5
+ * Imagezoom extension
6
+ *
7
+ * @category CorlleteLab
8
+ * @package CorlleteLab_Imagezoom
9
+ * @copyright Copyright (c) 2011 Corllete Ltd. (http://www.clabteam.com/)
10
+ * @author CorlleteLab Dev Team <office@clabteam.com>
11
+ */
12
+
13
+ /**
14
+ * Override Mage_Catalog_ProductController controller
15
+ */
16
+
17
+ require_once("Mage/Catalog/controllers/ProductController.php");
18
+
19
+ class CorlleteLab_Imagezoom_ProductController extends Mage_Core_Controller_Front_Action
20
+ {
21
+ public function viewAction()
22
+ {
23
+ // Get initial data from request
24
+ $categoryId = (int) $this->getRequest()->getParam('category', false);
25
+ $productId = (int) $this->getRequest()->getParam('id');
26
+ $specifyOptions = $this->getRequest()->getParam('options');
27
+
28
+ // Prepare helper and params
29
+ $viewHelper = Mage::helper('catalog/product_view');
30
+
31
+ $params = new Varien_Object();
32
+ $params->setCategoryId($categoryId);
33
+ $params->setSpecifyOptions($specifyOptions);
34
+
35
+ // Render page
36
+ try {
37
+ $viewHelper->prepareAndRender($productId, $this, $params);
38
+ } catch (Exception $e) {
39
+ if ($e->getCode() == $viewHelper->ERR_NO_PRODUCT_LOADED) {
40
+ if (isset($_GET['store']) && !$this->getResponse()->isRedirect()) {
41
+ $this->_redirect('');
42
+ } elseif (!$this->getResponse()->isRedirect()) {
43
+ $this->_forward('noRoute');
44
+ }
45
+ } else {
46
+ Mage::logException($e);
47
+ $this->_forward('noRoute');
48
+ }
49
+ }
50
+ }
51
+ }
app/code/community/CorlleteLab/Imagezoom/etc/adminhtml.xml ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * CorlleteLab
5
+ *
6
+ * Imagezoom extension
7
+ *
8
+ * @category CorlleteLab
9
+ * @package CorlleteLab_Imagezoom
10
+ * @copyright Copyright (c) 2011 Corllete Ltd. (http://www.clabteam.com/)
11
+ * @author CorlleteLab Dev Team <office@clabteam.com>
12
+ */
13
+ -->
14
+ <config>
15
+ <acl>
16
+ <resources>
17
+ <all>
18
+ <title>Allow Everything</title>
19
+ </all>
20
+ <admin>
21
+ <children>
22
+ <system>
23
+ <children>
24
+ <config>
25
+ <children>
26
+ <imagezoomconfig translate="title">
27
+ <title>ImageZoom Config Section</title>
28
+ <sort_order>0</sort_order>
29
+ </imagezoomconfig>
30
+ </children>
31
+ </config>
32
+ </children>
33
+ </system>
34
+ </children>
35
+ </admin>
36
+ </resources>
37
+ </acl>
38
+ </config>
app/code/community/CorlleteLab/Imagezoom/etc/config.xml ADDED
@@ -0,0 +1,151 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * CorlleteLab
5
+ *
6
+ * Imagezoom extension
7
+ *
8
+ * @category CorlleteLab
9
+ * @package CorlleteLab_Imagezoom
10
+ * @copyright Copyright (c) 2011 Corllete Ltd. (http://www.clabteam.com/)
11
+ * @author CorlleteLab Dev Team <office@clabteam.com>
12
+ */
13
+ -->
14
+
15
+ <config>
16
+ <modules>
17
+ <CorlleteLab_Imagezoom>
18
+ <version>0.1.0</version>
19
+ </CorlleteLab_Imagezoom>
20
+ </modules>
21
+ <global>
22
+ <models>
23
+ <imagezoom>
24
+ <class>CorlleteLab_Imagezoom_Model</class>
25
+ </imagezoom>
26
+ </models>
27
+ <helpers>
28
+ <imagezoom>
29
+ <class>CorlleteLab_Imagezoom_Helper</class>
30
+ </imagezoom>
31
+ </helpers>
32
+ <blocks>
33
+ <imagezoom>
34
+ <class>CorlleteLab_Imagezoom_Block</class>
35
+ </imagezoom>
36
+ <page>
37
+ <rewrite>
38
+ <html_head>CorlleteLab_Imagezoom_Block_Html_Head</html_head>
39
+ </rewrite>
40
+ </page>
41
+ <catalog>
42
+ <rewrite>
43
+ <product_view>CorlleteLab_Imagezoom_Block_Catalog_Product_View</product_view>
44
+ </rewrite>
45
+ </catalog>
46
+ </blocks>
47
+ </global>
48
+ <frontend>
49
+ <routers>
50
+ <!--
51
+ <imagezoom>
52
+ <use>standard</use>
53
+ <args>
54
+ <module>CorlleteLab_Imagezoom</module>
55
+ <frontName>imagezoom</frontName>
56
+ </args>
57
+ </imagezoom>
58
+ -->
59
+ <catalog>
60
+ <args>
61
+ <modules>
62
+ <CorlleteLab_Imagezoom before="Mage_Catalog">CorlleteLab_Imagezoom</CorlleteLab_Imagezoom><!-- Tell Magento to call our custom module before the Mage/Catalog module -->
63
+ </modules>
64
+ </args>
65
+ </catalog>
66
+ </routers>
67
+ <layout>
68
+ <updates>
69
+ <imagezoom>
70
+ <file>imagezoom.xml</file>
71
+ </imagezoom>
72
+ </updates>
73
+ </layout>
74
+ <translate>
75
+ <modules>
76
+ <imagezoom>
77
+ <files>
78
+ <default>CorlleteLab_ImageZoom.csv</default>
79
+ </files>
80
+ </imagezoom>
81
+ </modules>
82
+ </translate>
83
+ </frontend>
84
+ <backend_model>imagezoom/adminhtml_system_config</backend_model>
85
+ <adminhtml>
86
+ <translate>
87
+ <modules>
88
+ <imagezoom>
89
+ <files>
90
+ <default>CorlleteLab_ImageZoom.csv</default>
91
+ </files>
92
+ </imagezoom>
93
+ </modules>
94
+ </translate>
95
+ <acl>
96
+ <resources>
97
+ <all>
98
+ <title>Allow Everything</title>
99
+ </all>
100
+ <admin>
101
+ <children>
102
+ <system>
103
+ <children>
104
+ <config>
105
+ <children>
106
+ <imagezoomconfig translate="title">
107
+ <title>ImageZoom Config Section</title>
108
+ <sort_order>0</sort_order>
109
+ </imagezoomconfig>
110
+ </children>
111
+ </config>
112
+ </children>
113
+ </system>
114
+ </children>
115
+ </admin>
116
+ </resources>
117
+ </acl>
118
+ </adminhtml>
119
+ <default>
120
+ <imagezoomconfig>
121
+ <moduleoptions>
122
+ <moduleenable>1</moduleenable>
123
+ <jquery>1</jquery>
124
+ <jqueryexternal>1</jqueryexternal>
125
+ </moduleoptions>
126
+ <imagezoom_style_css>
127
+ <img_size>265</img_size>
128
+ <lens_border>3</lens_border>
129
+ <lens_border_color>CCCCCC</lens_border_color>
130
+ <lens_background_color>FFFFFF</lens_background_color>
131
+ <zoom_window_border>3</zoom_window_border>
132
+ <zoom_window_border_color>CCCCCC</zoom_window_border_color>
133
+ </imagezoom_style_css>
134
+ <imagezoom_options>
135
+ <zoomWidth></zoomWidth>
136
+ <zoomHeight></zoomHeight>
137
+ <position>'right'</position>
138
+ <adjustX></adjustX>
139
+ <adjustY>-3</adjustY>
140
+ <tintenable>0</tintenable>
141
+ <zoomeffect>0</zoomeffect>
142
+ <tintColor></tintColor>
143
+ <tintOpacity></tintOpacity>
144
+ <lensOpacity></lensOpacity>
145
+ <smoothMove></smoothMove>
146
+ <showTitle>1</showTitle>
147
+ <titleOpacity></titleOpacity>
148
+ </imagezoom_options>
149
+ </imagezoomconfig>
150
+ </default>
151
+ </config>
app/code/community/CorlleteLab/Imagezoom/etc/system.xml ADDED
@@ -0,0 +1,297 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * CorlleteLab
5
+ *
6
+ * Imagezoom extension
7
+ *
8
+ * @category CorlleteLab
9
+ * @package CorlleteLab_Imagezoom
10
+ * @copyright Copyright (c) 2011 Corllete Ltd. (http://www.clabteam.com/)
11
+ * @author CorlleteLab Dev Team <office@clabteam.com>
12
+ */
13
+ -->
14
+ <config>
15
+ <tabs>
16
+ <corlletetab translate="label" module="imagezoom">
17
+ <label>CorlleteLab Plugins</label>
18
+ <sort_order>0</sort_order>
19
+ </corlletetab>
20
+ </tabs>
21
+ <sections>
22
+ <imagezoomconfig translate="label" module="imagezoom">
23
+ <label>Image Zoom Configuration</label>
24
+ <tab>corlletetab</tab>
25
+ <frontend_type>text</frontend_type>
26
+ <sort_order>1000</sort_order>
27
+ <show_in_default>1</show_in_default>
28
+ <show_in_website>1</show_in_website>
29
+ <show_in_store>1</show_in_store>
30
+ <groups>
31
+ <moduleoptions translate="label">
32
+ <label>Module Options</label>
33
+ <frontend_type>text</frontend_type>
34
+ <sort_order>100</sort_order>
35
+ <show_in_default>1</show_in_default>
36
+ <show_in_website>1</show_in_website>
37
+ <show_in_store>1</show_in_store>
38
+ <fields>
39
+ <moduleenable translate="label comment">
40
+ <label>Enable Module</label>
41
+ <comment></comment>
42
+ <frontend_type>select</frontend_type>
43
+ <source_model>adminhtml/system_config_source_yesno</source_model>
44
+ <sort_order>10</sort_order>
45
+ <show_in_default>1</show_in_default>
46
+ <show_in_website>1</show_in_website>
47
+ <show_in_store>1</show_in_store>
48
+ </moduleenable>
49
+ <jquery translate="label comment">
50
+ <label>Load jQuery</label>
51
+ <comment>This will load the jQuery library.</comment>
52
+ <frontend_type>select</frontend_type>
53
+ <source_model>adminhtml/system_config_source_yesno</source_model>
54
+ <sort_order>20</sort_order>
55
+ <show_in_default>1</show_in_default>
56
+ <show_in_website>1</show_in_website>
57
+ <show_in_store>1</show_in_store>
58
+ </jquery>
59
+ <jqueryexternal translate="label comment">
60
+ <label>Load External jQuery</label>
61
+ <comment>
62
+ <![CDATA[This will load the jQuery library from the Google Content Network.
63
+ <span class="notice">Probably better than from your own server. </span>
64
+ ]]>
65
+ </comment>
66
+ <depends>
67
+ <jquery>1</jquery>
68
+ </depends>
69
+ <frontend_type>select</frontend_type>
70
+ <source_model>adminhtml/system_config_source_yesno</source_model>
71
+ <sort_order>30</sort_order>
72
+ <show_in_default>1</show_in_default>
73
+ <show_in_website>1</show_in_website>
74
+ <show_in_store>1</show_in_store>
75
+ </jqueryexternal>
76
+ </fields>
77
+ </moduleoptions>
78
+ <imagezoom_style_css translate="label">
79
+ <label>Image Zoom Style</label>
80
+ <frontend_type>text</frontend_type>
81
+ <sort_order>200</sort_order>
82
+ <show_in_default>1</show_in_default>
83
+ <show_in_website>1</show_in_website>
84
+ <show_in_store>1</show_in_store>
85
+ <fields>
86
+ <img_size translate="label comment">
87
+ <label>Image Size (pixel)</label>
88
+ <comment>Leave empty for default (265px)</comment>
89
+ <backend_model>imagezoom/adminhtml_system_size</backend_model>
90
+ <validate>validate-number</validate>
91
+ <frontend_type>text</frontend_type>
92
+ <sort_order>9</sort_order>
93
+ <show_in_default>1</show_in_default>
94
+ <show_in_website>1</show_in_website>
95
+ <show_in_store>1</show_in_store>
96
+ </img_size>
97
+ <lens_border translate="label comment">
98
+ <label>Moving Lens Border Thickness</label>
99
+ <comment></comment>
100
+ <validate>validate-number</validate>
101
+ <frontend_type>text</frontend_type>
102
+ <sort_order>10</sort_order>
103
+ <show_in_default>1</show_in_default>
104
+ <show_in_website>1</show_in_website>
105
+ <show_in_store>1</show_in_store>
106
+ </lens_border>
107
+ <lens_border_color translate="label comment">
108
+ <label>Moving Lens Border Color</label>
109
+ <comment>e.g. 77CC99</comment>
110
+ <backend_model>imagezoom/adminhtml_system_color</backend_model>
111
+ <frontend_type>text</frontend_type>
112
+ <sort_order>20</sort_order>
113
+ <show_in_default>1</show_in_default>
114
+ <show_in_website>1</show_in_website>
115
+ <show_in_store>1</show_in_store>
116
+ </lens_border_color>
117
+ <lens_background_color translate="label comment">
118
+ <label>Moving Lens Background Color</label>
119
+ <comment>e.g. 77CC99</comment>
120
+ <backend_model>imagezoom/adminhtml_system_color</backend_model>
121
+ <frontend_type>text</frontend_type>
122
+ <sort_order>30</sort_order>
123
+ <show_in_default>1</show_in_default>
124
+ <show_in_website>1</show_in_website>
125
+ <show_in_store>1</show_in_store>
126
+ </lens_background_color>
127
+ <zoom_window_border translate="label comment">
128
+ <label>Zoom Window Border Thickness</label>
129
+ <comment></comment>
130
+ <validate>validate-number</validate>
131
+ <frontend_type>text</frontend_type>
132
+ <sort_order>40</sort_order>
133
+ <show_in_default>1</show_in_default>
134
+ <show_in_website>1</show_in_website>
135
+ <show_in_store>1</show_in_store>
136
+ </zoom_window_border>
137
+ <zoom_window_border_color translate="label comment">
138
+ <label>Zoom Window Border Color</label>
139
+ <comment>e.g. 77CC99</comment>
140
+ <backend_model>imagezoom/adminhtml_system_color</backend_model>
141
+ <frontend_type>text</frontend_type>
142
+ <sort_order>50</sort_order>
143
+ <show_in_default>1</show_in_default>
144
+ <show_in_website>1</show_in_website>
145
+ <show_in_store>1</show_in_store>
146
+ </zoom_window_border_color>
147
+ </fields>
148
+ </imagezoom_style_css>
149
+ <imagezoom_options translate="label">
150
+ <label>Image Zoom Options</label>
151
+ <frontend_type>text</frontend_type>
152
+ <sort_order>300</sort_order>
153
+ <show_in_default>1</show_in_default>
154
+ <show_in_website>1</show_in_website>
155
+ <show_in_store>1</show_in_store>
156
+ <fields>
157
+ <zoomWidth translate="label comment">
158
+ <label>Zoom Width</label>
159
+ <comment>Leave empty for default (same as imge size)</comment>
160
+ <validate>validate-number</validate>
161
+ <frontend_type>text</frontend_type>
162
+ <sort_order>50</sort_order>
163
+ <show_in_default>1</show_in_default>
164
+ <show_in_website>1</show_in_website>
165
+ <show_in_store>1</show_in_store>
166
+ </zoomWidth>
167
+
168
+ <zoomHeight translate="label comment">
169
+ <label>Zoom Height</label>
170
+ <comment>Leave empty for default (same as imge size)</comment>
171
+ <validate>validate-number</validate>
172
+ <frontend_type>text</frontend_type>
173
+ <sort_order>51</sort_order>
174
+ <show_in_default>1</show_in_default>
175
+ <show_in_website>1</show_in_website>
176
+ <show_in_store>1</show_in_store>
177
+ </zoomHeight>
178
+ <position translate="label comment">
179
+ <label>Position</label>
180
+ <comment>Specifies the position of the zoom window relative to the small image.</comment>
181
+ <frontend_type>select</frontend_type>
182
+ <source_model>imagezoom/adminhtml_system_config_source_position</source_model>
183
+ <sort_order>52</sort_order>
184
+ <show_in_default>1</show_in_default>
185
+ <show_in_website>1</show_in_website>
186
+ <show_in_store>1</show_in_store>
187
+ </position>
188
+ <adjustX translate="label comment">
189
+ <label>Adjust X (pixel)</label>
190
+ <validate>validate-number</validate>
191
+ <comment>Leave empty for default (default: 0). Negative values are allowed</comment>
192
+ <frontend_type>text</frontend_type>
193
+ <sort_order>53</sort_order>
194
+ <show_in_default>1</show_in_default>
195
+ <show_in_website>1</show_in_website>
196
+ <show_in_store>1</show_in_store>
197
+ </adjustX>
198
+ <adjustY translate="label comment">
199
+ <label>Adjust Y (pixel)</label>
200
+ <validate>validate-number</validate>
201
+ <comment>Leave empty for default (default: -3). Negative values are allowed</comment>
202
+ <frontend_type>text</frontend_type>
203
+ <sort_order>54</sort_order>
204
+ <show_in_default>1</show_in_default>
205
+ <show_in_website>1</show_in_website>
206
+ <show_in_store>1</show_in_store>
207
+ </adjustY>
208
+
209
+ <zoomeffect translate="label comment">
210
+ <label>Zoom Effect</label>
211
+ <comment></comment>
212
+
213
+ <frontend_type>select</frontend_type>
214
+ <source_model>imagezoom/adminhtml_system_config_source_zoomeffect</source_model>
215
+ <sort_order>55</sort_order>
216
+ <show_in_default>1</show_in_default>
217
+ <show_in_website>1</show_in_website>
218
+ <show_in_store>1</show_in_store>
219
+ </zoomeffect>
220
+
221
+ <tintColor translate="label comment">
222
+ <label>Tint Color</label>
223
+ <comment>e.g. 77CC99</comment>
224
+ <backend_model>imagezoom/adminhtml_system_color</backend_model>
225
+ <frontend_type>text</frontend_type>
226
+ <validate>required-entry validate-number</validate>
227
+ <sort_order>56</sort_order>
228
+ <show_in_default>1</show_in_default>
229
+ <show_in_website>1</show_in_website>
230
+ <show_in_store>1</show_in_store>
231
+ <depends>
232
+ <zoomeffect>1</zoomeffect>
233
+ </depends>
234
+ </tintColor>
235
+ <tintOpacity translate="label comment">
236
+ <label>Tint Opacity</label>
237
+ <comment>Number between 0 and 1, where 0 is fully transparent and 1 is fully opaque.</comment>
238
+ <frontend_type>text</frontend_type>
239
+ <validate>validate-number</validate>
240
+ <sort_order>57</sort_order>
241
+ <show_in_default>1</show_in_default>
242
+ <show_in_website>1</show_in_website>
243
+ <show_in_store>1</show_in_store>
244
+ <depends>
245
+ <zoomeffect>1</zoomeffect>
246
+ </depends>
247
+ </tintOpacity>
248
+
249
+ <lensOpacity translate="label comment">
250
+ <label>Lens Opacity</label>
251
+ <comment>Opacity of the lens mouse pointer, where 0 is fully transparent, and 1 is fully opaque. In tint and soft-focus modes, it will always be transparent.</comment>
252
+ <validate>validate-number</validate>
253
+ <frontend_type>text</frontend_type>
254
+ <sort_order>58</sort_order>
255
+ <show_in_default>1</show_in_default>
256
+ <show_in_website>1</show_in_website>
257
+ <show_in_store>1</show_in_store>
258
+ </lensOpacity>
259
+ <smoothMove translate="label comment">
260
+ <label>Smooth Move</label>
261
+ <validate>validate-number</validate>
262
+ <comment>Amount of smoothness/drift of the zoom image as it moves. The higher the number, the smoother/more drifty the movement will be. 1 = no smoothing.</comment>
263
+ <frontend_type>text</frontend_type>
264
+ <sort_order>60</sort_order>
265
+ <show_in_default>1</show_in_default>
266
+ <show_in_website>1</show_in_website>
267
+ <show_in_store>1</show_in_store>
268
+ </smoothMove>
269
+ <showTitle translate="label comment">
270
+ <label>Show Title</label>
271
+ <comment>Shows the title tag of the image</comment>
272
+ <frontend_type>select</frontend_type>
273
+ <source_model>adminhtml/system_config_source_yesno</source_model>
274
+ <sort_order>61</sort_order>
275
+ <show_in_default>1</show_in_default>
276
+ <show_in_website>1</show_in_website>
277
+ <show_in_store>1</show_in_store>
278
+ </showTitle>
279
+ <titleOpacity translate="label comment">
280
+ <label>Title Opacity</label>
281
+ <comment>Specifies the opacity of the title if displayed, where 0 is fully transparent, and 1 is fully opaque.</comment>
282
+ <validate>validate-number</validate>
283
+ <frontend_type>text</frontend_type>
284
+ <sort_order>62</sort_order>
285
+ <show_in_default>1</show_in_default>
286
+ <show_in_website>1</show_in_website>
287
+ <show_in_store>1</show_in_store>
288
+ <depends>
289
+ <showTitle>1</showTitle>
290
+ </depends>
291
+ </titleOpacity>
292
+ </fields>
293
+ </imagezoom_options>
294
+ </groups>
295
+ </imagezoomconfig>
296
+ </sections>
297
+ </config>
app/design/frontend/base/default/layout/imagezoom.xml ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * CorlleteLab
5
+ *
6
+ * Imagezoom extension
7
+ *
8
+ * @category CorlleteLab
9
+ * @package CorlleteLab_Imagezoom
10
+ * @copyright Copyright (c) 2011 Corllete Ltd. (http://www.clabteam.com/)
11
+ * @author CorlleteLab Dev Team <office@clabteam.com>
12
+ */
13
+ -->
14
+
15
+ <layout>
16
+ <catalog_product_view>
17
+ <reference name="product.info.media">
18
+ <action method="setTemplate" ifconfig="imagezoomconfig/moduleoptions/moduleenable">
19
+ <template>corlletelab/imagezoom/media.phtml</template>
20
+ </action>
21
+ </reference>
22
+ </catalog_product_view>
23
+ <review_product_list>
24
+ <reference name="product.info.media">
25
+ <action method="setTemplate" ifconfig="imagezoomconfig/moduleoptions/moduleenable">
26
+ <template>corlletelab/imagezoom/media.phtml</template>
27
+ </action>
28
+ </reference>
29
+ </review_product_list>
30
+ <catalog_product_view translate="label">
31
+ <reference name="head">
32
+ <action method="addJs" ifconfig="imagezoomconfig/moduleoptions/moduleenable"><script>corlletelab/imagezoom/product_override.js</script></action>
33
+ </reference>
34
+ </catalog_product_view>
35
+ <PRODUCT_TYPE_grouped translate="label" module="catalog">
36
+ <label>Catalog Product View (Grouped)</label>
37
+ <reference name="product.info">
38
+ <block type="catalog/product_view_type_grouped" name="product.info.grouped" as="product_type_data" template="catalog/product/view/type/grouped.phtml">
39
+ <action method="setTemplate" ifconfig="imagezoomconfig/moduleoptions/moduleenable">
40
+ <template>corlletelab/imagezoom/grouped.phtml</template>
41
+ </action>
42
+ <block type="core/text_list" name="product.info.grouped.extra" as="product_type_data_extra" translate="label">
43
+ <label>Product Extra Info</label>
44
+ </block>
45
+ </block>
46
+ </reference>
47
+ </PRODUCT_TYPE_grouped>
48
+ </layout>
app/design/frontend/base/default/template/corlletelab/imagezoom/grouped.phtml ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * CorlleteLab
4
+ *
5
+ * Imagezoom extension
6
+ *
7
+ * @category CorlleteLab
8
+ * @package CorlleteLab_Imagezoom
9
+ * @copyright Copyright (c) 2011 Corllete Ltd. (http://www.clabteam.com/)
10
+ * @author CorlleteLab Dev Team <office@clabteam.com>
11
+ */
12
+ ?>
13
+
14
+ <?php $this->setPreconfiguredValue(); ?>
15
+ <?php $_product = $this->getProduct(); ?>
16
+ <?php $_associatedProducts = $this->getAssociatedProducts(); ?>
17
+ <?php $_hasAssociatedProducts = count($_associatedProducts) > 0; ?>
18
+ <?php
19
+ $zoom_image_size = Mage::getStoreConfig('imagezoomconfig/imagezoom_style_css/img_size');
20
+ ?>
21
+
22
+ <?php if ($_product->isAvailable() && $_hasAssociatedProducts): ?>
23
+ <p class="availability in-stock"><?php echo $this->__('Availability:') ?> <span><?php echo $this->__('In stock') ?></span></p>
24
+ <?php else: ?>
25
+ <p class="availability out-of-stock"><?php echo $this->__('Availability:') ?> <span><?php echo $this->__('Out of stock') ?></span></p>
26
+ <?php endif; ?>
27
+ <?php echo $this->getChildHtml('product_type_data_extra') ?>
28
+ <table class="data-table grouped-items-table" id="super-product-table">
29
+ <col style="width: 50px; text-align:center"/>
30
+ <col />
31
+ <col width="1" />
32
+ <thead>
33
+ <tr>
34
+ <th ></th>
35
+ <th><?php echo $this->__('Product Name') ?></th>
36
+ <?php if ($this->getCanShowProductPrice($_product)): ?>
37
+ <th class="a-right"><?php echo $this->__('Price') ?></th>
38
+ <?php endif; ?>
39
+ <?php if ($_product->isSaleable()): ?>
40
+ <th class="a-center"><?php echo $this->__('Qty') ?></th>
41
+ <?php endif; ?>
42
+ </tr>
43
+ </thead>
44
+ <tbody>
45
+ <?php if ($_hasAssociatedProducts): ?>
46
+ <?php foreach ($_associatedProducts as $_item): ?>
47
+ <?php $_finalPriceInclTax = $this->helper('tax')->getPrice($_item, $_item->getFinalPrice(), true) ?>
48
+ <tr>
49
+ <td>
50
+ <a href="<?php echo $this->helper('catalog/image')->init($_item, 'image'); ?>" class="cloud-zoom-gallery" title="<?php echo $this->htmlEscape($_item->getName()) ?>"
51
+ rel="useZoom: 'image-zoom', smallImage: '<?php echo $this->helper('catalog/image')->init($_item, 'thumbnail')->resize($zoom_image_size) ?>'" >
52
+ <img src="<?php echo $this->helper('catalog/image')->init($_item, 'thumbnail')->resize(40) ?>" alt="<?php echo $this->htmlEscape($_item->getName()) ?>" />
53
+ </a>
54
+ <td><?php echo $this->htmlEscape($_item->getName()) ?></td>
55
+ <?php if ($this->getCanShowProductPrice($_product)): ?>
56
+ <td class="a-right">
57
+ <?php if ($this->getCanShowProductPrice($_item)): ?>
58
+ <?php echo $this->getPriceHtml($_item, true) ?>
59
+ <?php echo $this->getTierPriceHtml($_item) ?>
60
+ <?php endif; ?>
61
+ </td>
62
+ <?php endif; ?>
63
+ <?php if ($_product->isSaleable()): ?>
64
+ <td class="a-center">
65
+ <?php if ($_item->isSaleable()) : ?>
66
+ <input type="text" name="super_group[<?php echo $_item->getId() ?>]" maxlength="12" value="<?php echo $_item->getQty()*1 ?>" title="<?php echo $this->__('Qty') ?>" class="input-text qty" />
67
+ <?php else: ?>
68
+ <p class="availability out-of-stock"><span><?php echo $this->__('Out of stock') ?></span></p>
69
+ <?php endif; ?>
70
+ </td>
71
+ <?php endif; ?>
72
+ </tr>
73
+ <?php endforeach; ?>
74
+ <?php else: ?>
75
+ <tr>
76
+ <td colspan="<?php if ($_product->isSaleable()): ?>4<?php else : ?>3<?php endif; ?>"><?php echo $this->__('No options of this product are available.') ?></td>
77
+ </tr>
78
+ <?php endif; ?>
79
+ </tbody>
80
+ </table>
81
+ <script type="text/javascript">decorateTable('super-product-table')</script>
app/design/frontend/base/default/template/corlletelab/imagezoom/media.phtml ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * CorlleteLab
4
+ *
5
+ * Imagezoom extension
6
+ *
7
+ * @category CorlleteLab
8
+ * @package CorlleteLab_Imagezoom
9
+ * @copyright Copyright (c) 2011 Corllete Ltd. (http://www.clabteam.com/)
10
+ * @author CorlleteLab Dev Team <office@clabteam.com>
11
+ */
12
+ ?>
13
+
14
+ <?php
15
+ $_product = $this->getProduct();
16
+ $_helper = $this->helper('catalog/output');
17
+ $zoom_image_size = Mage::getStoreConfig('imagezoomconfig/imagezoom_style_css/img_size');
18
+
19
+ $img_arr = array();
20
+
21
+
22
+ if ($_product->getTypeId() == 'configurable') {
23
+
24
+ $_childProducts = Mage::getModel('catalog/product_type_configurable')->getUsedProductCollection($_product);
25
+
26
+ if (count($_childProducts) > 0) {
27
+ $cnt = 0;
28
+ $js = '';
29
+ foreach ($_childProducts as $_child) {
30
+ $_child_images = $this->helper('imagezoom')->getAllImages($_child);
31
+ foreach($_child_images as $_child_image) {
32
+ $img_arr[$cnt] = array(
33
+ 'id' => $_child->getId(),
34
+ 'small_image' => (string)$this->helper('catalog/image')->init($this->getProduct(), 'thumbnail', $_child_image->getFile())->resize($zoom_image_size),
35
+ 'big_image' => (string)$this->helper('catalog/image')->init($this->getProduct(), 'image', $_child_image->getFile()),
36
+ 'thumb' => (string)$this->helper('catalog/image')->init($this->getProduct(), 'thumbnail', $_child_image->getFile())->resize(56),
37
+ 'label' => (string)$this->htmlEscape($_child_image->getLabel()),
38
+ 'main_image' => (string)$_child_image['main_image']
39
+ );
40
+ $cnt++;
41
+ }
42
+ }
43
+ }
44
+
45
+
46
+
47
+ } else if($_product->getTypeId() == 'grouped') { //TODO
48
+ //$_childProducts = $_product->getTypeInstance()->getAssociatedProducts();
49
+ }
50
+
51
+ ?>
52
+ <script type="text/javascript">
53
+ var assocIMG = { // Added
54
+ <?php
55
+ if(isset($img_arr) && count($img_arr) > 0) {
56
+ foreach ($img_arr as $img) {
57
+ if ($img['main_image']) {
58
+ $dados[] = "small_image_".$img['id'].":'".$img['small_image']."'";
59
+ $dados[] = "big_image_".$img['id'].":'".$img['big_image']."'";
60
+ }
61
+ }
62
+ echo implode(',', $dados );
63
+ }
64
+ ?>
65
+ }
66
+ </script>
67
+
68
+ <script type="text/javascript">
69
+ function jSelectImage(id) {
70
+ var add = $$('.more-views li.add');
71
+ if (add && add.length > 0) {
72
+ $('show-all').show();
73
+ add.each(function(item,i){
74
+ item.hide();
75
+ var className = 'item-'+id;
76
+
77
+ if (item.hasClassName(className)){
78
+ item.show();
79
+ }
80
+ })
81
+ }
82
+
83
+ if (assocIMG['big_image_'+id] && assocIMG['small_image_'+id]) {
84
+ // Destroy the previous zoom
85
+ jQuery('#image-zoom').data('zoom').destroy();
86
+ // Change the biglink to point to the new big image.
87
+ jQuery('#image-zoom').attr('href', assocIMG['big_image_'+id]);
88
+ // Change the small image to point to the new small image.
89
+ jQuery('#image-zoom img').attr('src', assocIMG['small_image_'+id]);
90
+ // Init a new zoom with the new images.
91
+ jQuery('#image-zoom').CloudZoom();
92
+ //console.log('yes')
93
+ }
94
+ }
95
+
96
+ function showAll() {
97
+ var add = $$('.more-views li.add');
98
+ if (add && add.length > 0) {
99
+ $('show-all').hide();
100
+ add.each(function(item,i){
101
+ item.show();
102
+ })
103
+ }
104
+ }
105
+
106
+ </script>
107
+
108
+ <p class="product-image">
109
+ <a href="<?php echo $this->helper('catalog/image')->init($_product, 'image'); ?>" class="cloud-zoom" id="image-zoom" rel="<?php echo $this->helper('imagezoom')->getZoomConfig(); ?>">
110
+ <?php
111
+ $_img = '<img src="'.$this->helper('catalog/image')->init($_product, 'image')->resize($zoom_image_size).'" alt="'.$this->htmlEscape($this->getImageLabel()).'" title="'.$this->htmlEscape($this->getImageLabel()).'" />';
112
+ echo $_helper->productAttribute($_product, $_img, 'image');
113
+ ?>
114
+ </a>
115
+ </p>
116
+
117
+
118
+ <?php if (count($this->getGalleryImages()) > 0 || (isset($_childProducts) && count($_childProducts) > 0) ): ?>
119
+ <div class="more-views">
120
+ <a id="show-all" class="f-right" style="display: none; font-size: 11px" href="#" onclick="javascript:showAll(); return false;" title="Show All">Show All</a>
121
+ <h2><?php echo $this->__('More Views') ?></h2>
122
+ <ul>
123
+ <?php foreach ($this->getGalleryImages() as $_image): ?>
124
+ <li>
125
+ <a href="<?php echo $this->helper('catalog/image')->init($this->getProduct(), 'image', $_image->getFile()); ?>" class="cloud-zoom-gallery" title="<?php echo $this->htmlEscape($_image->getLabel()) ?>"
126
+ rel="useZoom: 'image-zoom', smallImage: '<?php echo $this->helper('catalog/image')->init($this->getProduct(), 'thumbnail', $_image->getFile())->resize($zoom_image_size) ?>'" >
127
+ <img src="<?php echo $this->helper('catalog/image')->init($this->getProduct(), 'thumbnail', $_image->getFile())->resize(56) ?>" alt="<?php echo $this->htmlEscape($_image->getLabel()) ?>" />
128
+ </a>
129
+ </li>
130
+ <?php endforeach; ?>
131
+ <?php if (isset($_childProducts) && count($_childProducts) > 0):?>
132
+ <?php foreach ($img_arr as $img): ?>
133
+ <li class="add item-<?php echo $img['id']; ?>">
134
+ <a href="<?php echo $img['big_image']; ?>" class="cloud-zoom-gallery" title="<?php echo $img['label'] ?>"
135
+ rel="useZoom: 'image-zoom', smallImage: '<?php echo $img['small_image']; ?>'" >
136
+ <img src="<?php echo $img['thumb']; ?>" alt="<?php echo $img['label'] ?>" />
137
+ </a>
138
+ </li>
139
+ <?php endforeach; ?>
140
+ <li style=" padding: 0; background-color: transparent; display: none"></li>
141
+ <?php endif; ?>
142
+ </ul>
143
+
144
+ </div>
145
+ <?php endif; ?>
app/design/frontend/default/default/layout/imagezoom.xml ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * CorlleteLab
5
+ *
6
+ * Imagezoom extension
7
+ *
8
+ * @category CorlleteLab
9
+ * @package CorlleteLab_Imagezoom
10
+ * @copyright Copyright (c) 2011 Corllete Ltd. (http://www.clabteam.com/)
11
+ * @author CorlleteLab Dev Team <office@clabteam.com>
12
+ */
13
+ -->
14
+
15
+ <layout>
16
+ <catalog_product_view>
17
+ <reference name="product.info.media">
18
+ <action method="setTemplate" ifconfig="imagezoomconfig/moduleoptions/moduleenable">
19
+ <template>corlletelab/imagezoom/media.phtml</template>
20
+ </action>
21
+ </reference>
22
+ </catalog_product_view>
23
+ <review_product_list>
24
+ <reference name="product.info.media">
25
+ <action method="setTemplate" ifconfig="imagezoomconfig/moduleoptions/moduleenable">
26
+ <template>corlletelab/imagezoom/media.phtml</template>
27
+ </action>
28
+ </reference>
29
+ </review_product_list>
30
+ <catalog_product_view translate="label">
31
+ <reference name="head">
32
+ <action method="addJs" ifconfig="imagezoomconfig/moduleoptions/moduleenable"><script>corlletelab/imagezoom/product_override.js</script></action>
33
+ </reference>
34
+ </catalog_product_view>
35
+ <PRODUCT_TYPE_grouped translate="label" module="catalog">
36
+ <label>Catalog Product View (Grouped)</label>
37
+ <reference name="product.info">
38
+ <block type="catalog/product_view_type_grouped" name="product.info.grouped" as="product_type_data" template="catalog/product/view/type/grouped.phtml">
39
+ <action method="setTemplate" ifconfig="imagezoomconfig/moduleoptions/moduleenable">
40
+ <template>corlletelab/imagezoom/grouped.phtml</template>
41
+ </action>
42
+ <block type="core/text_list" name="product.info.grouped.extra" as="product_type_data_extra" translate="label">
43
+ <label>Product Extra Info</label>
44
+ </block>
45
+ </block>
46
+ </reference>
47
+ </PRODUCT_TYPE_grouped>
48
+ </layout>
app/design/frontend/default/default/template/corlletelab/imagezoom/grouped.phtml ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * CorlleteLab
4
+ *
5
+ * Imagezoom extension
6
+ *
7
+ * @category CorlleteLab
8
+ * @package CorlleteLab_Imagezoom
9
+ * @copyright Copyright (c) 2011 Corllete Ltd. (http://www.clabteam.com/)
10
+ * @author CorlleteLab Dev Team <office@clabteam.com>
11
+ */
12
+ ?>
13
+
14
+ <?php $this->setPreconfiguredValue(); ?>
15
+ <?php $_product = $this->getProduct(); ?>
16
+ <?php $_associatedProducts = $this->getAssociatedProducts(); ?>
17
+ <?php $_hasAssociatedProducts = count($_associatedProducts) > 0; ?>
18
+ <?php
19
+ $zoom_image_size = Mage::getStoreConfig('imagezoomconfig/imagezoom_style_css/img_size');
20
+ ?>
21
+
22
+ <?php if ($_product->isAvailable() && $_hasAssociatedProducts): ?>
23
+ <p class="availability in-stock"><?php echo $this->__('Availability:') ?> <span><?php echo $this->__('In stock') ?></span></p>
24
+ <?php else: ?>
25
+ <p class="availability out-of-stock"><?php echo $this->__('Availability:') ?> <span><?php echo $this->__('Out of stock') ?></span></p>
26
+ <?php endif; ?>
27
+ <?php echo $this->getChildHtml('product_type_data_extra') ?>
28
+ <table class="data-table grouped-items-table" id="super-product-table">
29
+ <col style="width: 50px; text-align:center"/>
30
+ <col />
31
+ <col width="1" />
32
+ <thead>
33
+ <tr>
34
+ <th ></th>
35
+ <th><?php echo $this->__('Product Name') ?></th>
36
+ <?php if ($this->getCanShowProductPrice($_product)): ?>
37
+ <th class="a-right"><?php echo $this->__('Price') ?></th>
38
+ <?php endif; ?>
39
+ <?php if ($_product->isSaleable()): ?>
40
+ <th class="a-center"><?php echo $this->__('Qty') ?></th>
41
+ <?php endif; ?>
42
+ </tr>
43
+ </thead>
44
+ <tbody>
45
+ <?php if ($_hasAssociatedProducts): ?>
46
+ <?php foreach ($_associatedProducts as $_item): ?>
47
+ <?php $_finalPriceInclTax = $this->helper('tax')->getPrice($_item, $_item->getFinalPrice(), true) ?>
48
+ <tr>
49
+ <td>
50
+ <a href="<?php echo $this->helper('catalog/image')->init($_item, 'image'); ?>" class="cloud-zoom-gallery" title="<?php echo $this->htmlEscape($_item->getName()) ?>"
51
+ rel="useZoom: 'image-zoom', smallImage: '<?php echo $this->helper('catalog/image')->init($_item, 'thumbnail')->resize($zoom_image_size) ?>'" >
52
+ <img src="<?php echo $this->helper('catalog/image')->init($_item, 'thumbnail')->resize(40) ?>" alt="<?php echo $this->htmlEscape($_item->getName()) ?>" />
53
+ </a>
54
+ <td><?php echo $this->htmlEscape($_item->getName()) ?></td>
55
+ <?php if ($this->getCanShowProductPrice($_product)): ?>
56
+ <td class="a-right">
57
+ <?php if ($this->getCanShowProductPrice($_item)): ?>
58
+ <?php echo $this->getPriceHtml($_item, true) ?>
59
+ <?php echo $this->getTierPriceHtml($_item) ?>
60
+ <?php endif; ?>
61
+ </td>
62
+ <?php endif; ?>
63
+ <?php if ($_product->isSaleable()): ?>
64
+ <td class="a-center">
65
+ <?php if ($_item->isSaleable()) : ?>
66
+ <input type="text" name="super_group[<?php echo $_item->getId() ?>]" maxlength="12" value="<?php echo $_item->getQty()*1 ?>" title="<?php echo $this->__('Qty') ?>" class="input-text qty" />
67
+ <?php else: ?>
68
+ <p class="availability out-of-stock"><span><?php echo $this->__('Out of stock') ?></span></p>
69
+ <?php endif; ?>
70
+ </td>
71
+ <?php endif; ?>
72
+ </tr>
73
+ <?php endforeach; ?>
74
+ <?php else: ?>
75
+ <tr>
76
+ <td colspan="<?php if ($_product->isSaleable()): ?>4<?php else : ?>3<?php endif; ?>"><?php echo $this->__('No options of this product are available.') ?></td>
77
+ </tr>
78
+ <?php endif; ?>
79
+ </tbody>
80
+ </table>
81
+ <script type="text/javascript">decorateTable('super-product-table')</script>
app/design/frontend/default/default/template/corlletelab/imagezoom/media.phtml ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * CorlleteLab
4
+ *
5
+ * Imagezoom extension
6
+ *
7
+ * @category CorlleteLab
8
+ * @package CorlleteLab_Imagezoom
9
+ * @copyright Copyright (c) 2011 Corllete Ltd. (http://www.clabteam.com/)
10
+ * @author CorlleteLab Dev Team <office@clabteam.com>
11
+ */
12
+ ?>
13
+
14
+ <?php
15
+ $_product = $this->getProduct();
16
+ $_helper = $this->helper('catalog/output');
17
+ $zoom_image_size = Mage::getStoreConfig('imagezoomconfig/imagezoom_style_css/img_size');
18
+
19
+ $img_arr = array();
20
+
21
+
22
+ if ($_product->getTypeId() == 'configurable') {
23
+
24
+ $_childProducts = Mage::getModel('catalog/product_type_configurable')->getUsedProductCollection($_product);
25
+
26
+ if (count($_childProducts) > 0) {
27
+ $cnt = 0;
28
+ $js = '';
29
+ foreach ($_childProducts as $_child) {
30
+ $_child_images = $this->helper('imagezoom')->getAllImages($_child);
31
+ foreach($_child_images as $_child_image) {
32
+ $img_arr[$cnt] = array(
33
+ 'id' => $_child->getId(),
34
+ 'small_image' => (string)$this->helper('catalog/image')->init($this->getProduct(), 'thumbnail', $_child_image->getFile())->resize($zoom_image_size),
35
+ 'big_image' => (string)$this->helper('catalog/image')->init($this->getProduct(), 'image', $_child_image->getFile()),
36
+ 'thumb' => (string)$this->helper('catalog/image')->init($this->getProduct(), 'thumbnail', $_child_image->getFile())->resize(56),
37
+ 'label' => (string)$this->htmlEscape($_child_image->getLabel()),
38
+ 'main_image' => (string)$_child_image['main_image']
39
+ );
40
+ $cnt++;
41
+ }
42
+ }
43
+ }
44
+
45
+
46
+
47
+ } else if($_product->getTypeId() == 'grouped') { //TODO
48
+ //$_childProducts = $_product->getTypeInstance()->getAssociatedProducts();
49
+ }
50
+
51
+ ?>
52
+ <script type="text/javascript">
53
+ var assocIMG = { // Added
54
+ <?php
55
+ if(isset($img_arr) && count($img_arr) > 0) {
56
+ foreach ($img_arr as $img) {
57
+ if ($img['main_image']) {
58
+ $dados[] = "small_image_".$img['id'].":'".$img['small_image']."'";
59
+ $dados[] = "big_image_".$img['id'].":'".$img['big_image']."'";
60
+ }
61
+ }
62
+ echo implode(',', $dados );
63
+ }
64
+ ?>
65
+ }
66
+ </script>
67
+
68
+ <script type="text/javascript">
69
+ function jSelectImage(id) {
70
+ var add = $$('.more-views li.add');
71
+ if (add && add.length > 0) {
72
+ $('show-all').show();
73
+ add.each(function(item,i){
74
+ item.hide();
75
+ var className = 'item-'+id;
76
+
77
+ if (item.hasClassName(className)){
78
+ item.show();
79
+ }
80
+ })
81
+ }
82
+
83
+ if (assocIMG['big_image_'+id] && assocIMG['small_image_'+id]) {
84
+ // Destroy the previous zoom
85
+ jQuery('#image-zoom').data('zoom').destroy();
86
+ // Change the biglink to point to the new big image.
87
+ jQuery('#image-zoom').attr('href', assocIMG['big_image_'+id]);
88
+ // Change the small image to point to the new small image.
89
+ jQuery('#image-zoom img').attr('src', assocIMG['small_image_'+id]);
90
+ // Init a new zoom with the new images.
91
+ jQuery('#image-zoom').CloudZoom();
92
+ //console.log('yes')
93
+ }
94
+ }
95
+
96
+ function showAll() {
97
+ var add = $$('.more-views li.add');
98
+ if (add && add.length > 0) {
99
+ $('show-all').hide();
100
+ add.each(function(item,i){
101
+ item.show();
102
+ })
103
+ }
104
+ }
105
+
106
+ </script>
107
+
108
+ <p class="product-image">
109
+ <a href="<?php echo $this->helper('catalog/image')->init($_product, 'image'); ?>" class="cloud-zoom" id="image-zoom" rel="<?php echo $this->helper('imagezoom')->getZoomConfig(); ?>">
110
+ <?php
111
+ $_img = '<img src="'.$this->helper('catalog/image')->init($_product, 'image')->resize($zoom_image_size).'" alt="'.$this->htmlEscape($this->getImageLabel()).'" title="'.$this->htmlEscape($this->getImageLabel()).'" />';
112
+ echo $_helper->productAttribute($_product, $_img, 'image');
113
+ ?>
114
+ </a>
115
+ </p>
116
+
117
+
118
+ <?php if (count($this->getGalleryImages()) > 0 || (isset($_childProducts) && count($_childProducts) > 0) ): ?>
119
+ <div class="more-views">
120
+ <a id="show-all" class="f-right" style="display: none; font-size: 11px" href="#" onclick="javascript:showAll(); return false;" title="Show All">Show All</a>
121
+ <h2><?php echo $this->__('More Views') ?></h2>
122
+ <ul>
123
+ <?php foreach ($this->getGalleryImages() as $_image): ?>
124
+ <li>
125
+ <a href="<?php echo $this->helper('catalog/image')->init($this->getProduct(), 'image', $_image->getFile()); ?>" class="cloud-zoom-gallery" title="<?php echo $this->htmlEscape($_image->getLabel()) ?>"
126
+ rel="useZoom: 'image-zoom', smallImage: '<?php echo $this->helper('catalog/image')->init($this->getProduct(), 'thumbnail', $_image->getFile())->resize($zoom_image_size) ?>'" >
127
+ <img src="<?php echo $this->helper('catalog/image')->init($this->getProduct(), 'thumbnail', $_image->getFile())->resize(56) ?>" alt="<?php echo $this->htmlEscape($_image->getLabel()) ?>" />
128
+ </a>
129
+ </li>
130
+ <?php endforeach; ?>
131
+ <?php if (isset($_childProducts) && count($_childProducts) > 0):?>
132
+ <?php foreach ($img_arr as $img): ?>
133
+ <li class="add item-<?php echo $img['id']; ?>">
134
+ <a href="<?php echo $img['big_image']; ?>" class="cloud-zoom-gallery" title="<?php echo $img['label'] ?>"
135
+ rel="useZoom: 'image-zoom', smallImage: '<?php echo $img['small_image']; ?>'" >
136
+ <img src="<?php echo $img['thumb']; ?>" alt="<?php echo $img['label'] ?>" />
137
+ </a>
138
+ </li>
139
+ <?php endforeach; ?>
140
+ <li style=" padding: 0; background-color: transparent; display: none"></li>
141
+ <?php endif; ?>
142
+ </ul>
143
+
144
+ </div>
145
+ <?php endif; ?>
app/etc/modules/CorlleteLab_Imagezoom.xml ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * CorlleteLab
5
+ *
6
+ * Imagezoom extension
7
+ *
8
+ * @category CorlleteLab
9
+ * @package CorlleteLab_Imagezoom
10
+ * @copyright Copyright (c) 2011 Corllete Ltd. (http://www.clabteam.com/)
11
+ * @author CorlleteLab Dev Team <office@clabteam.com>
12
+ */
13
+ -->
14
+ <config>
15
+ <modules>
16
+ <CorlleteLab_Imagezoom>
17
+ <active>true</active>
18
+ <codePool>community</codePool>
19
+ </CorlleteLab_Imagezoom>
20
+ </modules>
21
+ </config>
app/locale/en_US/CorlleteLab_ImageZoom.csv ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "Adjust X (pixel)","Adjust X (pixel)"
2
+ "Adjust Y (pixel)","Adjust Y (pixel)"
3
+ "Amount of smoothness/drift of the zoom image as it moves. The higher the number, the smoother/more drifty the movement will be. 1 = no smoothing.","Amount of smoothness/drift of the zoom image as it moves. The higher the number, the smoother/more drifty the movement will be. 1 = no smoothing."
4
+ "CorlleteLab Plugins","CorlleteLab Plugins"
5
+ "e.g. 77CC99","e.g. 77CC100"
6
+ "Enable Module","Enable Module"
7
+ "Image Size (pixel)","Image Size (pixel)"
8
+ "Image Zoom Configuration","Image Zoom Configuration"
9
+ "Image Zoom Options","Image Zoom Options"
10
+ "Image Zoom Style","Image Zoom Style"
11
+ "Leave empty for default (default: 0). Negative values are allowed","Leave empty for default (default: 0). Negative values are allowed"
12
+ "Leave empty for default (same as imge size)","Leave empty for default (same as imge size)"
13
+ "Lens Opacity","Lens Opacity"
14
+ "Load External jQuery","Load External jQuery"
15
+ "Module Options","Module Options"
16
+ "Moving Lens Background Color","Moving Lens Background Color"
17
+ "Moving Lens Border Color","Moving Lens Border Color"
18
+ "Moving Lens Border Thickness","Moving Lens Border Thickness"
19
+ "Number between 0 and 1, where 0 is fully transparent and 1 is fully opaque.","Number between 0 and 1, where 0 is fully transparent and 1 is fully opaque."
20
+ "Opacity of the lens mouse pointer, where 0 is fully transparent, and 1 is fully opaque. In tint and soft-focus modes, it will always be transparent.","Opacity of the lens mouse pointer, where 0 is fully transparent, and 1 is fully opaque. In tint and soft-focus modes, it will always be transparent."
21
+ "Position","Position"
22
+ "Show Title","Show Title"
23
+ "Smooth Move","Smooth Move"
24
+ "Specifies the position of the zoom window relative to the small image.","Specifies the position of the zoom window relative to the small image."
25
+ "This will load the jQuery library from the This will load the jQuery library from the Google Content Network.<span class=""notice"">Probably better than from your own server. </span>","This will load the jQuery library from the This will load the jQuery library from the Google Content Network.<span class=""notice"">Probably better than from your own server. </span>"
26
+ "Tint Color","Tint Color"
27
+ "Tint Opacity","Tint Opacity"
28
+ "Title Opacity","Title Opacity"
29
+ "Zoom Effect","Zoom Effect"
30
+ "Zoom Height","Zoom Height"
31
+ "Zoom Width","Zoom Width"
32
+ "Zoom Window Border Color","Zoom Window Border Color"
33
+ "Zoom Window Border Thickness","Zoom Window Border Thickness"
js/corlletelab/imagezoom/cloud-zoom.1.0.2.js ADDED
@@ -0,0 +1,391 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ //////////////////////////////////////////////////////////////////////////////////
2
+ // Cloud Zoom V1.0.2
3
+ // (c) 2010 by R Cecco. <http://www.professorcloud.com>
4
+ // MIT License
5
+ //
6
+ // Please retain this copyright header in all versions of the software
7
+ //////////////////////////////////////////////////////////////////////////////////
8
+ (function ($) {
9
+
10
+ $(document).ready(function () {
11
+ $('.cloud-zoom, .cloud-zoom-gallery').CloudZoom();
12
+ });
13
+
14
+ function format(str) {
15
+ for (var i = 1; i < arguments.length; i++) {
16
+ str = str.replace('%' + (i - 1), arguments[i]);
17
+ }
18
+ return str;
19
+ }
20
+
21
+ function CloudZoom(jWin, opts) {
22
+ var sImg = $('img', jWin);
23
+ var img1;
24
+ var img2;
25
+ var zoomDiv = null;
26
+ var $mouseTrap = null;
27
+ var lens = null;
28
+ var $tint = null;
29
+ var softFocus = null;
30
+ var $ie6Fix = null;
31
+ var zoomImage;
32
+ var controlTimer = 0;
33
+ var cw, ch;
34
+ var destU = 0;
35
+ var destV = 0;
36
+ var currV = 0;
37
+ var currU = 0;
38
+ var filesLoaded = 0;
39
+ var mx,
40
+ my;
41
+ var ctx = this, zw;
42
+ // Display an image loading message. This message gets deleted when the images have loaded and the zoom init function is called.
43
+ // We add a small delay before the message is displayed to avoid the message flicking on then off again virtually immediately if the
44
+ // images load really fast, e.g. from the cache.
45
+ //var ctx = this;
46
+ setTimeout(function () {
47
+ // <img src="/images/loading.gif"/>
48
+ if ($mouseTrap === null) {
49
+ var w = jWin.width();
50
+ jWin.parent().append(format('<div style="width:%0px;position:absolute;top:75%;left:%1px;text-align:center" class="cloud-zoom-loading" >Loading...</div>', w / 3, (w / 2) - (w / 6))).find(':last').css('opacity', 0.5);
51
+ }
52
+ }, 200);
53
+
54
+
55
+ var ie6FixRemove = function () {
56
+
57
+ if ($ie6Fix !== null) {
58
+ $ie6Fix.remove();
59
+ $ie6Fix = null;
60
+ }
61
+ };
62
+
63
+ // Removes cursor, tint layer, blur layer etc.
64
+ this.removeBits = function () {
65
+ //$mouseTrap.unbind();
66
+ if (lens) {
67
+ lens.remove();
68
+ lens = null;
69
+ }
70
+ if ($tint) {
71
+ $tint.remove();
72
+ $tint = null;
73
+ }
74
+ if (softFocus) {
75
+ softFocus.remove();
76
+ softFocus = null;
77
+ }
78
+ ie6FixRemove();
79
+
80
+ $('.cloud-zoom-loading', jWin.parent()).remove();
81
+ };
82
+
83
+
84
+ this.destroy = function () {
85
+ jWin.data('zoom', null);
86
+
87
+ if ($mouseTrap) {
88
+ $mouseTrap.unbind();
89
+ $mouseTrap.remove();
90
+ $mouseTrap = null;
91
+ }
92
+ if (zoomDiv) {
93
+ zoomDiv.remove();
94
+ zoomDiv = null;
95
+ }
96
+ //ie6FixRemove();
97
+ this.removeBits();
98
+ // DON'T FORGET TO REMOVE JQUERY 'DATA' VALUES
99
+ };
100
+
101
+
102
+ // This is called when the zoom window has faded out so it can be removed.
103
+ this.fadedOut = function () {
104
+
105
+ if (zoomDiv) {
106
+ zoomDiv.remove();
107
+ zoomDiv = null;
108
+ }
109
+ this.removeBits();
110
+ //ie6FixRemove();
111
+ };
112
+
113
+ this.controlLoop = function () {
114
+ if (lens) {
115
+ var x = (mx - sImg.offset().left - (cw * 0.5)) >> 0;
116
+ var y = (my - sImg.offset().top - (ch * 0.5)) >> 0;
117
+
118
+ if (x < 0) {
119
+ x = 0;
120
+ }
121
+ else if (x > (sImg.outerWidth() - cw)) {
122
+ x = (sImg.outerWidth() - cw);
123
+ }
124
+ if (y < 0) {
125
+ y = 0;
126
+ }
127
+ else if (y > (sImg.outerHeight() - ch)) {
128
+ y = (sImg.outerHeight() - ch);
129
+ }
130
+
131
+ lens.css({
132
+ left: x,
133
+ top: y
134
+ });
135
+ lens.css('background-position', (-x) + 'px ' + (-y) + 'px');
136
+
137
+ destU = (((x) / sImg.outerWidth()) * zoomImage.width) >> 0;
138
+ destV = (((y) / sImg.outerHeight()) * zoomImage.height) >> 0;
139
+ currU += (destU - currU) / opts.smoothMove;
140
+ currV += (destV - currV) / opts.smoothMove;
141
+
142
+ zoomDiv.css('background-position', (-(currU >> 0) + 'px ') + (-(currV >> 0) + 'px'));
143
+ }
144
+ controlTimer = setTimeout(function () {
145
+ ctx.controlLoop();
146
+ }, 30);
147
+ };
148
+
149
+ this.init2 = function (img, id) {
150
+
151
+ filesLoaded++;
152
+ //console.log(img.src + ' ' + id + ' ' + img.width);
153
+ if (id === 1) {
154
+ zoomImage = img;
155
+ }
156
+ //this.images[id] = img;
157
+ if (filesLoaded === 2) {
158
+ this.init();
159
+ }
160
+ };
161
+
162
+ /* Init function start. */
163
+ this.init = function () {
164
+ // Remove loading message (if present);
165
+ $('.cloud-zoom-loading', jWin.parent()).remove();
166
+
167
+
168
+ /* Add a box (mouseTrap) over the small image to trap mouse events.
169
+ It has priority over zoom window to avoid issues with inner zoom.
170
+ We need the dummy background image as IE does not trap mouse events on
171
+ transparent parts of a div.
172
+ */
173
+ $mouseTrap = jWin.parent().append(format("<div class='mousetrap' style='background-image:url(\".\");z-index:998;position:absolute;width:%0px;height:%1px;left:%2px;top:%3px;\'></div>", sImg.outerWidth(), sImg.outerHeight(), 0, 0)).find(':last');
174
+
175
+ //////////////////////////////////////////////////////////////////////
176
+ /* Do as little as possible in mousemove event to prevent slowdown. */
177
+ $mouseTrap.bind('mousemove', this, function (event) {
178
+ // Just update the mouse position
179
+ mx = event.pageX;
180
+ my = event.pageY;
181
+ });
182
+ //////////////////////////////////////////////////////////////////////
183
+ $mouseTrap.bind('mouseleave', this, function (event) {
184
+ clearTimeout(controlTimer);
185
+ //event.data.removeBits();
186
+ if(lens) { lens.fadeOut(299); }
187
+ if($tint) { $tint.fadeOut(299); }
188
+ if(softFocus) { softFocus.fadeOut(299); }
189
+ zoomDiv.fadeOut(300, function () {
190
+ ctx.fadedOut();
191
+ });
192
+ return false;
193
+ });
194
+ //////////////////////////////////////////////////////////////////////
195
+ $mouseTrap.bind('mouseenter', this, function (event) {
196
+ mx = event.pageX;
197
+ my = event.pageY;
198
+ zw = event.data;
199
+ if (zoomDiv) {
200
+ zoomDiv.stop(true, false);
201
+ zoomDiv.remove();
202
+ }
203
+
204
+ var xPos = opts.adjustX,
205
+ yPos = opts.adjustY;
206
+
207
+ var siw = sImg.outerWidth();
208
+ var sih = sImg.outerHeight();
209
+
210
+ var w = opts.zoomWidth;
211
+ var h = opts.zoomHeight;
212
+ if (opts.zoomWidth == 'auto') {
213
+ w = siw;
214
+ }
215
+ if (opts.zoomHeight == 'auto') {
216
+ h = sih;
217
+ }
218
+ //$('#info').text( xPos + ' ' + yPos + ' ' + siw + ' ' + sih );
219
+ var appendTo = jWin.parent(); // attach to the wrapper
220
+ switch (opts.position) {
221
+ case 'top':
222
+ yPos -= h; // + opts.adjustY;
223
+ break;
224
+ case 'right':
225
+ xPos += siw; // + opts.adjustX;
226
+ break;
227
+ case 'bottom':
228
+ yPos += sih; // + opts.adjustY;
229
+ break;
230
+ case 'left':
231
+ xPos -= w; // + opts.adjustX;
232
+ break;
233
+ case 'inside':
234
+ w = siw;
235
+ h = sih;
236
+ break;
237
+ // All other values, try and find an id in the dom to attach to.
238
+ default:
239
+ appendTo = $('#' + opts.position);
240
+ // If dom element doesn't exit, just use 'right' position as default.
241
+ if (!appendTo.length) {
242
+ appendTo = jWin;
243
+ xPos += siw; //+ opts.adjustX;
244
+ yPos += sih; // + opts.adjustY;
245
+ } else {
246
+ w = appendTo.innerWidth();
247
+ h = appendTo.innerHeight();
248
+ }
249
+ }
250
+
251
+ zoomDiv = appendTo.append(format('<div id="cloud-zoom-big" class="cloud-zoom-big" style="display:none;position:absolute;left:%0px;top:%1px;width:%2px;height:%3px;background-image:url(\'%4\');z-index:99;"></div>', xPos, yPos, w, h, zoomImage.src)).find(':last');
252
+
253
+ // Add the title from title tag.
254
+ if (sImg.attr('title') && opts.showTitle) {
255
+ zoomDiv.append(format('<div class="cloud-zoom-title">%0</div>', sImg.attr('title'))).find(':last').css('opacity', opts.titleOpacity);
256
+ }
257
+
258
+ // Fix ie6 select elements wrong z-index bug. Placing an iFrame over the select element solves the issue...
259
+ if ($.browser.msie && $.browser.version < 7) {
260
+ $ie6Fix = $('<iframe frameborder="0" src="#"></iframe>').css({
261
+ position: "absolute",
262
+ left: xPos,
263
+ top: yPos,
264
+ zIndex: 99,
265
+ width: w,
266
+ height: h
267
+ }).insertBefore(zoomDiv);
268
+ }
269
+
270
+ zoomDiv.fadeIn(500);
271
+
272
+ if (lens) {
273
+ lens.remove();
274
+ lens = null;
275
+ } /* Work out size of cursor */
276
+ cw = (sImg.outerWidth() / zoomImage.width) * zoomDiv.width();
277
+ ch = (sImg.outerHeight() / zoomImage.height) * zoomDiv.height();
278
+
279
+ // Attach mouse, initially invisible to prevent first frame glitch
280
+ lens = jWin.append(format("<div class = 'cloud-zoom-lens' style='display:none;z-index:98;position:absolute;width:%0px;height:%1px;'></div>", cw, ch)).find(':last');
281
+
282
+ $mouseTrap.css('cursor', lens.css('cursor'));
283
+
284
+ var noTrans = false;
285
+
286
+ // Init tint layer if needed. (Not relevant if using inside mode)
287
+ if (opts.tint) {
288
+ lens.css('background', 'url("' + sImg.attr('src') + '")');
289
+ $tint = jWin.append(format('<div style="display:none;position:absolute; left:0px; top:0px; width:%0px; height:%1px; background-color:%2;" />', sImg.outerWidth(), sImg.outerHeight(), opts.tint)).find(':last');
290
+ $tint.css('opacity', opts.tintOpacity);
291
+ noTrans = true;
292
+ $tint.fadeIn(500);
293
+
294
+ }
295
+ if (opts.softFocus) {
296
+ lens.css('background', 'url("' + sImg.attr('src') + '")');
297
+ softFocus = jWin.append(format('<div style="position:absolute;display:none;top:2px; left:2px; width:%0px; height:%1px;" />', sImg.outerWidth() - 2, sImg.outerHeight() - 2, opts.tint)).find(':last');
298
+ softFocus.css('background', 'url("' + sImg.attr('src') + '")');
299
+ softFocus.css('opacity', 0.5);
300
+ noTrans = true;
301
+ softFocus.fadeIn(500);
302
+ }
303
+
304
+ if (!noTrans) {
305
+ lens.css('opacity', opts.lensOpacity);
306
+ }
307
+ if ( opts.position !== 'inside' ) { lens.fadeIn(500); }
308
+
309
+ // Start processing.
310
+ zw.controlLoop();
311
+
312
+ return; // Don't return false here otherwise opera will not detect change of the mouse pointer type.
313
+ });
314
+ };
315
+
316
+ img1 = new Image();
317
+ $(img1).load(function () {
318
+ ctx.init2(this, 0);
319
+ });
320
+ img1.src = sImg.attr('src');
321
+
322
+ img2 = new Image();
323
+ $(img2).load(function () {
324
+ ctx.init2(this, 1);
325
+ });
326
+ img2.src = jWin.attr('href');
327
+ }
328
+
329
+ $.fn.CloudZoom = function (options) {
330
+ // IE6 background image flicker fix
331
+ try {
332
+ document.execCommand("BackgroundImageCache", false, true);
333
+ } catch (e) {}
334
+ this.each(function () {
335
+ var relOpts, opts;
336
+ // Hmm...eval...slap on wrist.
337
+ eval('var a = {' + $(this).attr('rel') + '}');
338
+ relOpts = a;
339
+ if ($(this).is('.cloud-zoom')) {
340
+ $(this).css({
341
+ 'position': 'relative',
342
+ 'display': 'block'
343
+ });
344
+ $('img', $(this)).css({
345
+ 'display': 'block'
346
+ });
347
+ // Wrap an outer div around the link so we can attach things without them becoming part of the link.
348
+ // But not if wrap already exists.
349
+ if ($(this).parent().attr('id') != 'wrap') {
350
+ $(this).wrap('<div id="wrap" style="top:0px;z-index:995;position:relative;"></div>');
351
+ }
352
+ opts = $.extend({}, $.fn.CloudZoom.defaults, options);
353
+ opts = $.extend({}, opts, relOpts);
354
+ $(this).data('zoom', new CloudZoom($(this), opts));
355
+
356
+ } else if ($(this).is('.cloud-zoom-gallery')) {
357
+ opts = $.extend({}, relOpts, options);
358
+ $(this).data('relOpts', opts);
359
+ $(this).bind('click', $(this), function (event) {
360
+ var data = event.data.data('relOpts');
361
+ // Destroy the previous zoom
362
+ $('#' + data.useZoom).data('zoom').destroy();
363
+ // Change the biglink to point to the new big image.
364
+ $('#' + data.useZoom).attr('href', event.data.attr('href'));
365
+ // Change the small image to point to the new small image.
366
+ $('#' + data.useZoom + ' img').attr('src', event.data.data('relOpts').smallImage);
367
+ // Init a new zoom with the new images.
368
+ $('#' + event.data.data('relOpts').useZoom).CloudZoom();
369
+ return false;
370
+ });
371
+ }
372
+ });
373
+ return this;
374
+ };
375
+
376
+ $.fn.CloudZoom.defaults = {
377
+ zoomWidth: 'auto',
378
+ zoomHeight: 'auto',
379
+ position: 'right',
380
+ tint: false,
381
+ tintOpacity: 0.5,
382
+ lensOpacity: 0.5,
383
+ softFocus: false,
384
+ smoothMove: 3,
385
+ showTitle: true,
386
+ titleOpacity: 0.5,
387
+ adjustX: 0,
388
+ adjustY: 0
389
+ };
390
+
391
+ })(jQuery);
js/corlletelab/imagezoom/jquery-1.6.2.min.js ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * jQuery JavaScript Library v1.6.2
3
+ * http://jquery.com/
4
+ *
5
+ * Copyright 2011, John Resig
6
+ * Dual licensed under the MIT or GPL Version 2 licenses.
7
+ * http://jquery.org/license
8
+ *
9
+ * Includes Sizzle.js
10
+ * http://sizzlejs.com/
11
+ * Copyright 2011, The Dojo Foundation
12
+ * Released under the MIT, BSD, and GPL Licenses.
13
+ *
14
+ * Date: Thu Jun 30 14:16:56 2011 -0400
15
+ */
16
+ (function(a,b){function cv(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cs(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cr(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cq(){cn=b}function cp(){setTimeout(cq,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bZ(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bY(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bC.test(a)?d(a,e):bY(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)bY(a+"["+e+"]",b[e],c,d);else d(a,b)}function bX(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bR,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bX(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bX(a,c,d,e,"*",g));return l}function bW(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bN),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bA(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bv:bw;if(d>0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bx(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bm(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(be,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bl(a){f.nodeName(a,"input")?bk(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bk)}function bk(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bj(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bi(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bh(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)f.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function bg(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function W(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(R.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;i<s.length;i++)g=s[i],g.origType.replace(x,"")===a.type?q.push(g.selector):s.splice(i--,1);e=f(a.target).closest(q,a.currentTarget);for(j=0,k=e.length;j<k;j++){m=e[j];for(i=0;i<s.length;i++){g=s[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,d=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,d=f(a.relatedTarget).closest(g.selector)[0],d&&f.contains(h,d)&&(d=h);(!d||d!==h)&&p.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=p.length;j<k;j++){e=p[j];if(c&&e.level>c)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z])/ig,x=function(a,b){return b.toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!A){A=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||D.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b){if(H)return H.call(b,a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=s.exec(a)||t.exec(a)||u.exec(a)||a.indexOf("compatible")<0&&v.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g="done fail isResolved isRejected promise then always pipe".split(" "),h=[].slice;f.extend({_Deferred:function(){var a=[],b,c,d,e={done:function(){if(!d){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=f.type(i),j==="array"?e.done.apply(e,i):j==="function"&&a.push(i);k&&e.resolveWith(k[0],k[1])}return this},resolveWith:function(e,f){if(!d&&!b&&!c){f=f||[],c=1;try{while(a[0])a.shift().apply(e,f)}finally{b=[e,f],c=0}}return this},resolve:function(){e.resolveWith(this,arguments);return this},isResolved:function(){return!!c||!!b},cancel:function(){d=1,a=[];return this}};return e},Deferred:function(a){var b=f._Deferred(),c=f._Deferred(),d;f.extend(b,{then:function(a,c){b.done(a).fail(c);return this},always:function(){return b.done.apply(b,arguments).fail.apply(this,arguments)},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,pipe:function(a,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[c,"reject"]},function(a,c){var e=c[0],g=c[1],h;f.isFunction(e)?b[a](function(){h=e.apply(this,arguments),h&&f.isFunction(h.promise)?h.promise().then(d.resolve,d.reject):d[g](h)}):b[a](d[g])})}).promise()},promise:function(a){if(a==null){if(d)return d;d=a={}}var c=g.length;while(c--)a[g[c]]=b[g[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){function i(a){return function(c){b[a]=arguments.length>1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c<d;c++)b[c]&&f.isFunction(b[c].promise)?b[c].promise().then(i(c),g.reject):--e;e||g.resolveWith(g,b)}else g!==a&&g.resolveWith(g,d?[a]:[]);return g.promise()}}),f.support=function(){var a=c.createElement("div"),b=c.documentElement,d,e,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;a.setAttribute("className","t"),a.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0},m&&f.extend(p,{position:"absolute",left:-1e3,top:-1e3});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]||i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h<i;h++)g=e[h].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),k(this[0],g,d[g]))}}return d}if(typeof a=="object")return this.each(function(){f.data(this,a)});var j=a.split(".");j[1]=j[1]?"."+j[1]:"";if(c===b){d=this.triggerHandler("getData"+j[1]+"!",[j[0]]),d===b&&this.length&&(d=f.data(this[0],a),d=k(this[0],a,d));return d===b&&j[1]?this.data(j[0]):d}return this.each(function(){var b=f(this),d=[j[0],c];b.triggerHandler("setData"+j[1]+"!",d),f.data(this,a,c),b.triggerHandler("changeData"+j[1]+"!",d)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,c){a&&(c=(c||"fx")+"mark",f.data(a,c,(f.data(a,c,b,!0)||0)+1,!0))},_unmark:function(a,c,d){a!==!0&&(d=c,c=a,a=!1);if(c){d=d||"fx";var e=d+"mark",g=a?0:(f.data(c,e,b,!0)||1)-1;g?f.data(c,e,g,!0):(f.removeData(c,e,!0),m(c,d,"mark"))}},queue:function(a,c,d){if(a){c=(c||"fx")+"queue";var e=f.data(a,c,b,!0);d&&(!e||f.isArray(d)?e=f.data(a,c,f.makeArray(d),!0):e.push(d));return e||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e;d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),d.call(a,function(){f.dequeue(a,b)})),c.length||(f.removeData(a,b+"queue",!0),m(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){f.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f._Deferred(),!0))h++,l.done(m);m();return d.promise()}});var n=/[\n\t\r]/g,o=/\s+/,p=/\r/g,q=/^(?:button|input)$/i,r=/^(?:button|input|object|select|textarea)$/i,s=/^a(?:rea)?$/i,t=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,u=/\:|^on/,v,w;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(o);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(o);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(n," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(o);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(n," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h<i;h++){var j=e[h];if(j.selected&&(f.support.optDisabled?!j.disabled:j.getAttribute("disabled")===null)&&(!j.parentNode.disabled||!f.nodeName(j.parentNode,"optgroup"))){b=f(j).val();if(g)return b;d.push(b)}}if(g&&!d.length&&e.length)return f(e[c]).val();return d},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=w:v&&c!=="className"&&(f.nodeName(a,"form")||u.test(c))&&(i=v)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}},value:{get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return f.prop(a,c)?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.attrHooks.title=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))f.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=f.event.special[h]||{};for(j=e||0;j<p.length;j++){q=p[j];if(d.guid===q.guid){if(l||n.test(q.namespace))e==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(e!=null)break}}if(p.length===0||e!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&f.removeEvent(a,h,s.handle),g=null,delete t[h]}if(f.isEmptyObject(t)){var u=s.handle;u&&(u.elem=null),delete s.events,delete s.handle,f.isEmptyObject(s)&&f.removeData(a,b,!0)}}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){var h=c.type||c,i=[],j;h.indexOf("!")>=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.
17
+ shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h<i;h++){var j=d[h];if(e||c.namespace_re.test(j.namespace)){c.handler=j.handler,c.data=j.data,c.handleObj=j;var k=j.handler.apply(this,g);k!==b&&(c.result=k,k===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[f.expando])return a;var d=a;a=f.Event(d);for(var e=this.props.length,g;e;)g=this.props[--e],a[g]=d[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=a.target.ownerDocument||c,i=h.documentElement,j=h.body;a.pageX=a.clientX+(i&&i.scrollLeft||j&&j.scrollLeft||0)-(i&&i.clientLeft||j&&j.clientLeft||0),a.pageY=a.clientY+(i&&i.scrollTop||j&&j.scrollTop||0)-(i&&i.clientTop||j&&j.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:f.proxy,special:{ready:{setup:f.bindReady,teardown:f.noop},live:{add:function(a){f.event.add(this,N(a.origType,a.selector),f.extend({},a,{handler:M,guid:a.handler.guid}))},remove:function(a){f.event.remove(this,N(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!this.preventDefault)return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?E:D):this.type=a,b&&f.extend(this,b),this.timeStamp=f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=E;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=E;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=E,this.stopPropagation()},isDefaultPrevented:D,isPropagationStopped:D,isImmediatePropagationStopped:D};var F=function(a){var b=a.relatedTarget,c=!1,d=a.type;a.type=a.data,b!==this&&(b&&(c=f.contains(this,b)),c||(f.event.handle.apply(this,arguments),a.type=d))},G=function(a){a.type=a.data,f.event.handle.apply(this,arguments)};f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={setup:function(c){f.event.add(this,b,c&&c.selector?G:F,a)},teardown:function(a){f.event.remove(this,b,a&&a.selector?G:F)}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(a,b){if(!f.nodeName(this,"form"))f.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=b.type;(c==="submit"||c==="image")&&f(b).closest("form").length&&K("submit",this,arguments)}),f.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.type;(c==="text"||c==="password")&&f(b).closest("form").length&&a.keyCode===13&&K("submit",this,arguments)});else return!1},teardown:function(a){f.event.remove(this,".specialSubmit")}});if(!f.support.changeBubbles){var H,I=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function(c){var d=c.target,e,g;if(!!y.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=I(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i<j;i++)f.event.add(this[i],a,g,d);return this}}),f.fn.extend({unbind:function(a,b){if(typeof a=="object"&&!a.preventDefault)for(var c in a)this.unbind(c,a[c]);else for(var d=0,e=this.length;d<e;d++)f.event.remove(this[d],a,b);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f.data(this,"lastToggle"+a.guid)||0)%d;f.data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var L={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};f.each(["live","die"],function(a,c){f.fn[c]=function(a,d,e,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:f(this.context);if(typeof a=="object"&&!a.preventDefault){for(var o in a)n[c](o,d,a[o],m);return this}if(c==="die"&&!a&&g&&g.charAt(0)==="."){n.unbind(g);return this}if(d===!1||f.isFunction(d))e=d||D,d=b;a=(a||"").split(" ");while((h=a[i++])!=null){j=x.exec(h),k="",j&&(k=j[0],h=h.replace(x,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,L[h]?(a.push(L[h]+k),h=h+k):h=(L[h]||h)+k;if(c==="live")for(var p=0,q=n.length;p<q;p++)f.event.add(n[p],"live."+N(h,m),{data:d,selector:m,handler:e,origType:h,origHandler:e,preType:l});else n.unbind("live."+N(h,m),e)}return this}}),f.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".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(!f)g=o=!0;else if(f===!0)continue}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("parentNode",b,f,a,e,c)},"~":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("previousSibling",b,f,a,e,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c<f;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){if(a===b){g=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};f.find=k,f.expr=k.selectors,f.expr[":"]=f.expr.filters,f.unique=k.uniqueSort,f.text=k.getText,f.isXMLDoc=k.isXML,f.contains=k.contains}();var O=/Until$/,P=/^(?:parents|prevUntil|prevAll)/,Q=/,/,R=/^.[^:#\[\.,]*$/,S=Array.prototype.slice,T=f.expr.match.POS,U={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(W(this,a,!1),"not",a)},filter:function(a){return this.pushStack(W(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d<e;d++)i=a[d],j[i]||(j[i]=T.test(i)?f(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(l?l.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/<tbody/i,ba=/<|&#?\w+;/,bb=/<(?:script|object|embed|option|style)/i,bc=/checked\s*(?:[^=]|=\s*.checked.)/i,bd=/\/(java|ecma)script/i,be=/^\s*<!(?:\[CDATA\[|\-\-)/,bf={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};bf.optgroup=bf.option,bf.tbody=bf.tfoot=bf.colgroup=bf.caption=bf.thead,bf.th=bf.td,f.support.htmlSerialize||(bf._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!bf[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bc.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bg(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bm)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i;b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof a[0]=="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!bb.test(a[0])&&(f.support.checkClone||!bc.test(a[0]))&&(g=!0,h=f.fragments[a[0]],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[a[0]]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j
18
+ )}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bi(a,d),e=bj(a),g=bj(d);for(h=0;e[h];++h)bi(e[h],g[h])}if(b){bh(a,d);if(c){e=bj(a),g=bj(d);for(h=0;e[h];++h)bh(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!ba.test(k))k=b.createTextNode(k);else{k=k.replace(Z,"<$1></$2>");var l=($.exec(k)||["",""])[1].toLowerCase(),m=bf[l]||bf._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=_.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Y.test(k)&&o.insertBefore(b.createTextNode(Y.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bl(k[i]);else bl(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||bd.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.expando,g=f.event.special,h=f.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&f.noData[j.nodeName.toLowerCase()])continue;c=j[f.expando];if(c){b=d[c]&&d[c][e];if(b&&b.events){for(var k in b.events)g[k]?f.event.remove(j,k):f.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[f.expando]:j.removeAttribute&&j.removeAttribute(f.expando),delete d[c]}}}});var bn=/alpha\([^)]*\)/i,bo=/opacity=([^)]*)/,bp=/([A-Z]|^ms)/g,bq=/^-?\d+(?:px)?$/i,br=/^-?\d/,bs=/^[+\-]=/,bt=/[^+\-\.\de]+/g,bu={position:"absolute",visibility:"hidden",display:"block"},bv=["Left","Right"],bw=["Top","Bottom"],bx,by,bz;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bx(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d;if(h==="number"&&isNaN(d)||d==null)return;h==="string"&&bs.test(d)&&(d=+d.replace(bt,"")+parseFloat(f.css(a,c)),h="number"),h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bx)return bx(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bA(a,b,d);f.swap(a,bu,function(){e=bA(a,b,d)});return e}},set:function(a,b){if(!bq.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bo.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bn.test(g)?g.replace(bn,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bB=/%20/g,bC=/\[\]$/,bD=/\r?\n/g,bE=/#.*$/,bF=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bG=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bH=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bI=/^(?:GET|HEAD)$/,bJ=/^\/\//,bK=/\?/,bL=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bM=/^(?:select|textarea)/i,bN=/\s+/,bO=/([?&])_=[^&]*/,bP=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bQ=f.fn.load,bR={},bS={},bT,bU;try{bT=e.href}catch(bV){bT=c.createElement("a"),bT.href="",bT=bT.href}bU=bP.exec(bT.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bQ)return bQ.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bL,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bM.test(this.nodeName)||bG.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bD,"\r\n")}}):{name:b.name,value:c.replace(bD,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bT,isLocal:bH.test(bU[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bW(bR),ajaxTransport:bW(bS),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?bZ(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b$(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bF.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bE,"").replace(bJ,bU[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bN),d.crossDomain==null&&(r=bP.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bU[1]&&r[2]==bU[2]&&(r[3]||(r[1]==="http:"?80:443))==(bU[3]||(bU[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bX(bR,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bI.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bK.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bO,"$1_="+x);d.url=y+(y===d.url?(bK.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bX(bS,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bB,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cs(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cr("hide",3),a,b,c);for(var d=0,e=this.length;d<e;d++)if(this[d].style){var g=f.css(this[d],"display");g!=="none"&&!f._data(this[d],"olddisplay")&&f._data(this[d],"olddisplay",g)}for(d=0;d<e;d++)this[d].style&&(this[d].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cr("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return this[e.queue===!1?"each":"queue"](function(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(f.support.inlineBlockNeedsLayout?(j=cs(this.nodeName),j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)):this.style.display="inline-block"))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)k=new f.fx(this,b,i),h=a[i],cj.test(h)?k[h==="toggle"?d?"show":"hide":h]():(l=ck.exec(h),m=k.cur(),l?(n=parseFloat(l[2]),o=l[3]||(f.cssNumber[i]?"":"px"),o!=="px"&&(f.style(this,i,(n||1)+o),m=(n||1)/k.cur()*m,f.style(this,i,m+o)),l[1]&&(n=(l[1]==="-="?-1:1)*n+m),k.custom(m,n,o)):k.custom(m,h,""));return!0})},stop:function(a,b){a&&this.queue([]),this.each(function(){var a=f.timers,c=a.length;b||f._unmark(!0,this);while(c--)a[c].elem===this&&(b&&a[c](!0),a.splice(c,1))}),b||this.dequeue();return this}}),f.each({slideDown:cr("show",1),slideUp:cr("hide",1),slideToggle:cr("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default,d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue!==!1?f.dequeue(this):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function h(a){return d.step(a)}var d=this,e=f.fx,g;this.startTime=cn||cp(),this.start=a,this.end=b,this.unit=c||this.unit||(f.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,h.elem=this.elem,h()&&f.timers.push(h)&&!cl&&(co?(cl=!0,g=function(){cl&&(co(g),e.tick())},co(g)):cl=setInterval(e.tick,e.interval))},show:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=cn||cp(),c=!0,d=this.elem,e=this.options,g,h;if(a||b>=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b<a.length;++b)a[b]()||a.splice(b--,1);a.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cl),cl=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var ct=/^t(?:able|d|h)$/i,cu=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cv(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);f.offset.initialize();var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.offset.doesNotAddBorder&&(!f.offset.doesAddBorderForTableAndCells||!ct.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={initialize:function(){var a=c.body,b=c.createElement("div"),d,e,g,h,i=parseFloat(f.css(a,"marginTop"))||0,j="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cu.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cu.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cv(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cv(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window);
js/corlletelab/imagezoom/product_override.js ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * CorlleteLab
3
+ *
4
+ * Imagezoom extension
5
+ *
6
+ * @category CorlleteLab
7
+ * @package CorlleteLab_Imagezoom
8
+ * @copyright Copyright (c) 2011 Corllete Ltd. (http://www.clabteam.com/)
9
+ * @author CorlleteLab Dev Team <office@clabteam.com>
10
+ */
11
+
12
+ Product.Config.addMethods({
13
+ selectedAssocProducts: {},
14
+ configureElement : function(element) {
15
+
16
+ this.reloadOptionLabels(element);
17
+ if(element.value){
18
+ this.state[element.config.id] = element.value;
19
+ if(element.nextSetting){
20
+ element.nextSetting.disabled = false;
21
+ this.fillSelect(element.nextSetting);
22
+ this.resetChildren(element.nextSetting);
23
+ }
24
+ }
25
+ else {
26
+ this.resetChildren(element);
27
+ }
28
+ this.reloadPrice();
29
+
30
+ /***** Load Associated Image : This should come after this.resetChildren is called *****/
31
+ // If an option doesnt have a value attribute, it'll take its innerHTML as its value - hence the reason for || element.value.substr(0,6) == 'choose'
32
+ if (!element.value || element.value.substr(0,6) == 'choose') return; // Selected "choose option"
33
+ var attributeId = element.id.replace(/[a-z]*/, '');
34
+ for (var a in this.config.attributes)
35
+ {
36
+ for (i = 0; i < this.config.attributes[a].options.length; i++)
37
+ {
38
+ if (this.config.attributes[a].options[i].id != element.value) continue;
39
+ this.selectedAssocProducts[a] = this.config.attributes[attributeId].options[i].products;
40
+ }
41
+ }
42
+
43
+ var productNo = this._intersect(this.selectedAssocProducts) || this.selectedAssocProducts[attributeId][0];
44
+
45
+ jSelectImage(productNo);
46
+ //$('image').src = assocIMG[productNo];
47
+
48
+ },
49
+
50
+ resetChildren : function(element){
51
+ delete this.selectedAssocProducts[element.config.id]; // Added
52
+
53
+ if(element.childSettings) {
54
+ for(var i=0;i<element.childSettings.length;i++){
55
+ element.childSettings[i].selectedIndex = 0;
56
+ element.childSettings[i].disabled = true;
57
+ delete this.selectedAssocProducts[element.childSettings[i].config.id]; // Added
58
+ if(element.config){
59
+ this.state[element.config.id] = false;
60
+ }
61
+ }
62
+ }
63
+ },
64
+
65
+ _intersect: function(ar) // ar can be an array of arrays or an asssociative array
66
+ {
67
+ if (ar == null) return false;
68
+
69
+ var a = new Array();
70
+
71
+ if (ar.length == undefined) // Associate Array
72
+ {
73
+ for (var i in ar)
74
+ a.push(ar[i]);
75
+ }
76
+ else
77
+ a = ar;
78
+
79
+ if (a.length == 1) return false; // Single array ? Nothing to intersect with
80
+
81
+ var common = new Array();
82
+ function loop(a, index, s_index, e_index)
83
+ {
84
+ if (index == null) index = 0;
85
+ if (s_index == null) s_index = 0;
86
+ if (e_index == null) e_index = a[index].length;
87
+ if (index == a.length - 1) return;
88
+
89
+ for (var i = s_index; i < e_index; i++)
90
+ {
91
+ if (common.indexOf(a[index][i]) != -1) continue;
92
+ for (var j = 0; j < a[index + 1].length; j++)
93
+ {
94
+ if (a[index][i] != a[index+1][j]) continue;
95
+ loop(a, index + 1, j, j + 1);
96
+ if (index + 1 == a.length - 1) { common.push(a[index][i]); break; }
97
+ }
98
+ }
99
+ }
100
+
101
+ loop(a);
102
+ return common;
103
+ }
104
+
105
+ });
106
+
package.xml ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <package>
3
+ <name>CorlleteLab_Imagezoom</name>
4
+ <version>0.1.5</version>
5
+ <stability>stable</stability>
6
+ <license uri="http://www.opensource.org/licenses/osl-3.0.php">OSL v3.0</license>
7
+ <channel>community</channel>
8
+ <extends/>
9
+ <summary>Image Zoom for product images. Configurable and Grouped products are also supported.</summary>
10
+ <description>Image Zoom for product images. Configurable and Grouped products are also supported.</description>
11
+ <notes>N/A</notes>
12
+ <authors><author><name>Desislav Yosifov</name><user>SonicE</user><email>deskin@probg.com</email></author></authors>
13
+ <date>2011-09-15</date>
14
+ <time>07:54:54</time>
15
+ <contents><target name="magecommunity"><dir name="CorlleteLab"><dir name="Imagezoom"><dir name="Block"><dir name="Catalog"><dir name="Product"><file name="View.php" hash="49b559624494bf64ace997fbee9dfd52"/></dir></dir><dir name="Html"><file name="Head.php" hash="eb6a6cc918857cb6a49695946b3b0339"/></dir></dir><dir name="Helper"><file name="Data.php" hash="2f5ac92c0dbdcd6aa16019e43d20a922"/></dir><dir name="Model"><dir name="Adminhtml"><dir name="System"><file name="Color.php" hash="6d9be20970ecbbc3be9f4e29e4130d06"/><dir name="Config"><dir name="Source"><file name="Position.php" hash="3202945d312df9a18977e38473a88a33"/><file name="Zoomeffect.php" hash="506343ccb9ef940fc577029ed5a0a47c"/></dir></dir><file name="Size.php" hash="4d27ab856f017b32626a19460b0984a5"/></dir></dir></dir><dir name="controllers"><file name="IndexController.php" hash="a7ae6f32c671c0624779a1d6a188a885"/><file name="ProductController.php" hash="ab18a2d7f5d02d3b4dfc048dfb7fc619"/></dir><dir name="etc"><file name="adminhtml.xml" hash="2774ef2b98fc8995157a97f1d05e0196"/><file name="config.xml" hash="c11ef43a443947a1ed5393176dd0299e"/><file name="system.xml" hash="ec749375fdf843e6715a453ae3971d60"/></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="CorlleteLab_Imagezoom.xml" hash="be76b163aaf29b643d4a8c27ead5b5ee"/></dir></target><target name="magelocale"><dir name="en_US"><file name="CorlleteLab_ImageZoom.csv" hash="31a82c36cedcba9ebda3ab27490ab43e"/></dir></target><target name="mageweb"><dir name="js"><dir name="corlletelab"><dir name="imagezoom"><file name="cloud-zoom.1.0.2.js" hash="c1893fd33ca7e6329246342be8acc03d"/><file name="jquery-1.6.2.min.js" hash="a1a8cb16a060f6280a767187fd22e037"/><file name="product_override.js" hash="a7b9d9c1d0eec0937f6394f3b6b81dc0"/></dir></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="imagezoom.xml" hash="7447d71df1a9c3cd48cd110d6dd2972c"/></dir><dir name="template"><dir name="corlletelab"><dir name="imagezoom"><file name="grouped.phtml" hash="cbb95504d0160bf8647ab1de975289ea"/><file name="media.phtml" hash="34997eb9bb0ce6381bdb7e13366f585e"/></dir></dir></dir></dir></dir><dir name="default"><dir name="default"><dir name="layout"><file name="imagezoom.xml" hash="7447d71df1a9c3cd48cd110d6dd2972c"/></dir><dir name="template"><dir name="corlletelab"><dir name="imagezoom"><file name="grouped.phtml" hash="cbb95504d0160bf8647ab1de975289ea"/><file name="media.phtml" hash="34997eb9bb0ce6381bdb7e13366f585e"/></dir></dir></dir></dir></dir></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="css"><dir name="corlletelab"><file name="imagezoom.css" hash="988e76756be393d452cd36a570a94c7d"/></dir></dir></dir></dir><dir name="default"><dir name="default"><dir name="css"><dir name="corlletelab"><file name="imagezoom.css" hash="8bb60e53a7b337fd33db683dfae3c59c"/></dir></dir></dir></dir></dir></target></contents>
16
+ <compatible/>
17
+ <dependencies><required><php><min>5.2.0</min><max>5.3.0</max></php></required></dependencies>
18
+ </package>
skin/frontend/base/default/css/corlletelab/imagezoom.css ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* This is the moving lens square underneath the mouse pointer. */
2
+ .cloud-zoom-lens {
3
+ cursor: move;
4
+ }
5
+
6
+ /* This is for the title text. */
7
+ .cloud-zoom-title {
8
+ font-family: Arial, Helvetica, sans-serif;
9
+ position:absolute !important;
10
+ background-color:#000;
11
+ color:#fff;
12
+ padding:3px;
13
+ width:100%;
14
+ text-align:center;
15
+ font-weight:bold;
16
+ font-size:10px;
17
+ top:0px;
18
+ }
19
+
20
+ /* This is the zoom window. */
21
+ .cloud-zoom-big {
22
+ overflow: hidden;
23
+ }
24
+
25
+ /* This is the loading message. */
26
+ .cloud-zoom-loading {
27
+ color:white;
28
+ background:#222;
29
+ padding:3px;
30
+ border:1px solid #000;
31
+ }
32
+
skin/frontend/default/default/css/corlletelab/imagezoom.css ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * CorlleteLab
3
+ *
4
+ * Imagezoom extension
5
+ *
6
+ * @category CorlleteLab
7
+ * @package CorlleteLab_Imagezoom
8
+ * @copyright Copyright (c) 2011 Corllete Ltd. (http://www.clabteam.com/)
9
+ * @author CorlleteLab Dev Team <office@clabteam.com>
10
+ */
11
+
12
+ /* This is the moving lens square underneath the mouse pointer. */
13
+ .cloud-zoom-lens {
14
+ cursor: move;
15
+ }
16
+
17
+ /* This is for the title text. */
18
+ .cloud-zoom-title {
19
+ font-family: Arial, Helvetica, sans-serif;
20
+ position:absolute !important;
21
+ background-color:#000;
22
+ color:#fff;
23
+ padding:3px;
24
+ width:100%;
25
+ text-align:center;
26
+ font-weight:bold;
27
+ font-size:10px;
28
+ top:0px;
29
+ }
30
+
31
+ /* This is the zoom window. */
32
+ .cloud-zoom-big {
33
+ overflow: hidden;
34
+ }
35
+
36
+ /* This is the loading message. */
37
+ .cloud-zoom-loading {
38
+ color:white;
39
+ background:#222;
40
+ padding:3px;
41
+ border:1px solid #000;
42
+ }
43
+