Iksanika_Productrelater - Version 1.0.0

Version Notes

Initial-basic version of Mass Product Relater by Iksanika for Magento store.

Download this release

Release Info

Developer Iksanika
Extension Iksanika_Productrelater
Version 1.0.0
Comparing to
See all releases


Version 1.0.0

Files changed (21) hide show
  1. app/code/community/Iksanika/Productrelater/Block/Catalog/Product.php +19 -0
  2. app/code/community/Iksanika/Productrelater/Block/Catalog/Product/Grid.php +20 -0
  3. app/code/community/Iksanika/Productrelater/Block/Widget/Grid.php +19 -0
  4. app/code/community/Iksanika/Productrelater/Block/Widget/Grid/Column.php +21 -0
  5. app/code/community/Iksanika/Productrelater/Block/Widget/Grid/Column/Renderer/Number.php +19 -0
  6. app/code/community/Iksanika/Productrelater/Block/Widget/Grid/Massaction.php +19 -0
  7. app/code/community/Iksanika/Productrelater/Helper/Data.php +21 -0
  8. app/code/community/Iksanika/Productrelater/Model/Resource/Eav/Mysql4/Product/Collection.php +19 -0
  9. app/code/community/Iksanika/Productrelater/controllers/Catalog/ProductController.php +20 -0
  10. app/code/community/Iksanika/Productrelater/etc/config.xml +100 -0
  11. app/design/adminhtml/default/default/layout/iksanika_productrelater.xml +23 -0
  12. app/design/adminhtml/default/default/template/iksanika/productrelater/catalog/product.phtml +36 -0
  13. app/design/adminhtml/default/default/template/iksanika/productrelater/catalog/product/grid.phtml +255 -0
  14. app/etc/modules/Iksanika_Productrelater.xml +9 -0
  15. js/Iksanika/productrelater/egsupplemental.js +65 -0
  16. js/Iksanika/productrelater/jquery-1.9.1.min.js +5 -0
  17. js/Iksanika/productrelater/relatergrid.js +450 -0
  18. js/Iksanika/productrelater/relaterproducts.js +137 -0
  19. js/Iksanika/productrelater/resources/css/productrelater.css +2 -0
  20. media/iksanika/productrelater/iksanika-logo.png +0 -0
  21. package.xml +21 -0
app/code/community/Iksanika/Productrelater/Block/Catalog/Product.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Iksanika llc.
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the EULA
9
+ * that is bundled with this package in the file LICENSE.txt.
10
+ * It is also available through the world-wide-web at this URL:
11
+ * http://www.iksanika.com/products/IKS-LICENSE.txt
12
+ *
13
+ * @category Iksanika
14
+ * @package Iksanika_Productrelater
15
+ * @copyright Copyright (c) 2013 Iksanika llc. (http://www.iksanika.com)
16
+ * @license http://www.iksanika.com/products/IKS-LICENSE.txt
17
+ */
18
+
19
+ class Iksanika_Productrelater_Block_Catalog_Product extends Mage_Adminhtml_Block_Catalog_Product {public function __construct() {parent::__construct();$this->_headerText = Mage::helper('productrelater')->__('Mass Product Relater');} protected function _prepareLayout(){parent::_prepareLayout();$this->setTemplate('iksanika/productrelater/catalog/product.phtml');$this->setChild('grid', $this->getLayout()->createBlock('productrelater/catalog_product_grid', 'product.productrelater'));}}
app/code/community/Iksanika/Productrelater/Block/Catalog/Product/Grid.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Iksanika llc.
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the EULA
9
+ * that is bundled with this package in the file LICENSE.txt.
10
+ * It is also available through the world-wide-web at this URL:
11
+ * http://www.iksanika.com/products/IKS-LICENSE.txt
12
+ *
13
+ * @category Iksanika
14
+ * @package Iksanika_Productrelater
15
+ * @copyright Copyright (c) 2013 Iksanika llc. (http://www.iksanika.com)
16
+ * @license http://www.iksanika.com/products/IKS-LICENSE.txt
17
+ */
18
+
19
+ class Iksanika_Productrelater_Block_Catalog_Product_Grid extends Iksanika_Productrelater_Block_Widget_Grid {protected static $columnType = array( 'id' => array('type'=>'number'), 'product' => array('type'=>'checkbox'), 'name' => array('type'=>'text'), 'type_id' => array('type'=>'text'), 'attribute_set_id' => array('type'=>'text'), 'sku' => array('type'=>'text'), 'price' => array('type'=>'text'), 'qty' => array('type'=>'text'), 'is_in_stock' => array('type'=>'text'), 'visibility' => array('type'=>'text'), 'status' => array('type'=>'text'), 'websites' => array('type'=>'text'), 'related_ids' => array('type'=>'input'), 'cross_sell_ids' => array('type'=>'input'), 'up_sell_ids' => array('type'=>'input'),);public function __construct(){parent::__construct();$this->setId('productGrid');$this->prepareDefaults();$this->setSaveParametersInSession(true);$this->setUseAjax(true);$this->setTemplate('iksanika/productrelater/catalog/product/grid.phtml');$this->setMassactionBlockName('productrelater/widget_grid_massaction');}private function prepareDefaults(){$this->setDefaultLimit(20);$this->setDefaultPage(1);$this->setDefaultSort('id');$this->setDefaultDir('desc');}protected function _prepareCollection(){$collection = $this->getCollection();$collection = !$collection ? Mage::getModel('catalog/product')->getCollection() : $collection;$store = $this->_getStore();$collection->joinField('qty','cataloginventory/stock_item','qty','product_id=entity_id','{{table}}.stock_id=1','left')->joinField('related_ids','catalog/product_link','linked_product_id','product_id=entity_id','{{table}}.link_type_id=1','left')->joinField('cross_sell_ids','catalog/product_link','linked_product_id','product_id=entity_id','{{table}}.link_type_id=5','left')->joinField('up_sell_ids','catalog/product_link','linked_product_id','product_id=entity_id','{{table}}.link_type_id=4','left');$collection->groupByAttribute('entity_id');if ($store->getId()){$collection->addStoreFilter($store);$collection->joinAttribute('custom_name', 'catalog_product/name', 'entity_id', null, 'inner', $store->getId());$collection->joinAttribute('status', 'catalog_product/status', 'entity_id', null, 'inner', $store->getId());$collection->joinAttribute('visibility', 'catalog_product/visibility', 'entity_id', null, 'inner', $store->getId());$collection->joinAttribute('price', 'catalog_product/price', 'entity_id', null, 'left', $store->getId());} else {$collection->addAttributeToSelect('price');$collection->addAttributeToSelect('status');$collection->addAttributeToSelect('visibility');}foreach(self::$columnType as $col => $true){if($col == 'related_ids' || $col == 'cross_sell_ids' || $col == 'up_sell_ids'){$filter = $this->getParam($this->getVarNameFilter());if($filter){$filter_data = Mage::helper('adminhtml')->prepareFilterString($filter);if(isset($filter_data[$col])){if(trim($filter_data[$col])=='')continue;$relatedIds = explode(',', $filter_data[$col]);$relatedIdsArray = array();foreach($relatedIds as $relatedId){$relatedIdsArray[] = intval($relatedId);}$collection->addAttributeToFilter($col, array( 'in' => $relatedIdsArray));}}} if($col == 'qty' || $col == 'websites' || $col=='id'|| $col=='related_ids'|| $col=='cross_sell_ids'|| $col=='up_sell_ids') continue; else $collection->addAttributeToSelect($col);}$this->setCollection($collection);parent::_prepareCollection();$collection->addWebsiteNamesToResult();return $this;}protected function _getStore(){$storeId = (int) $this->getRequest()->getParam('store', 0);return Mage::app()->getStore($storeId);}protected function _addColumnFilterToCollection($column){if ($this->getCollection()) {if ($column->getId() == 'websites') {$this->getCollection()->joinField('websites','catalog/product_website','website_id','product_id=entity_id',null,'left');}}return parent::_addColumnFilterToCollection($column);}public function _applyMyFilter($column){}protected function _prepareColumns(){$store = $this->_getStore();$this->addColumn('id',array('header'=> Mage::helper('catalog')->__('ID'),'width' => '50px','type' => 'number','index' => 'entity_id',));$this->addColumn('name',array('header'=> Mage::helper('catalog')->__('Name'),'name' => 'pu_name[]','index' => 'name'));$store = $this->_getStore();if ($store->getId()) {$this->addColumn('custom_name',array('header'=> Mage::helper('catalog')->__('Name In %s', $store->getName()),'index' => 'custom_name','width' => '150px'));}$this->addColumn('sku',array('header'=> Mage::helper('catalog')->__('SKU'),'width' => '80px','index' => 'sku','name' => 'pu_sku[]',));$this->addColumn('price',array('header'=> Mage::helper('catalog')->__('Price'),'type' => 'price','currency_code' => $store->getBaseCurrency()->getCode(),'index' => 'price','name' => 'pu_price[]',));$this->addColumn('qty',array('header'=> Mage::helper('catalog')->__('Qty'),'width' => '100px','type' => 'number','index' => 'qty','name' => 'pu_qty[]',));$this->addColumn('visibility',array('header'=> Mage::helper('catalog')->__('Visibility'),'width' => '70px','index' => 'visibility','type' => 'options','options' => Mage::getModel('catalog/product_visibility')->getOptionArray(),));$this->addColumn('status',array('header'=> Mage::helper('catalog')->__('Status'),'width' => '70px','index' => 'status','type' => 'options','options' => Mage::getSingleton('catalog/product_status')->getOptionArray(),));if (!Mage::app()->isSingleStoreMode()) {$this->addColumn('websites',array('header'=> Mage::helper('catalog')->__('Websites'),'width' => '100px','sortable' => false,'index' => 'websites','type' => 'options','options' => Mage::getModel('core/website')->getCollection()->toOptionHash(),));}$this->addColumn('related_ids',array('type'=>'input','index' => 'related_ids','width'=>'80px','filter_condition_callback' => array($this, '_applyMyFilter'),'header'=> Mage::helper('catalog')->__('Related IDs'),));$this->addColumn('cross_sell_ids',array('type'=>'input','index' => 'cross_sell_ids','width'=>'80px','filter_condition_callback' => array($this, '_applyMyFilter'),'header'=> Mage::helper('catalog')->__('Cross-Sell IDs'),));$this->addColumn('up_sell_ids',array('type'=>'input','index' => 'up_sell_ids','width'=>'80px','filter_condition_callback' => array($this, '_applyMyFilter'),'header'=> Mage::helper('catalog')->__('Up-Sell IDs'),));$this->addColumn('action',array('header' => Mage::helper('catalog')->__('Action'),'width' => '50px','type' => 'action','getter' => 'getId','filter' => false,'sortable' => false,'index' => 'stores','actions' => array(array('caption' => Mage::helper('catalog')->__('Edit'),'id' => "editlink",'url' => array('base'=>'adminhtml/*/edit','params'=>array('store'=>$this->getRequest()->getParam('store'))),'field' => 'id')),));$this->addRssList('rss/catalog/notifystock', Mage::helper('catalog')->__('Notify Low Stock RSS'));$this->setDestElementId('edit_form');return parent::_prepareColumns();}protected function _prepareMassaction(){$this->setMassactionIdField('entity_id');$this->getMassactionBlock()->setFormFieldName('product');$this->getMassactionBlock()->addItem('delete', array('label'=> Mage::helper('catalog')->__('Delete'),'url' => $this->getUrl('*/*/massDelete'),'confirm' => Mage::helper('catalog')->__('Are you sure?')));$statuses = Mage::getSingleton('catalog/product_status')->getOptionArray();array_unshift($statuses, array('label'=>'', 'value'=>''));$this->getMassactionBlock()->addItem('status', array('label'=> Mage::helper('catalog')->__('Change status'),'url' => $this->getUrl('*/*/massStatus', array('_current' => true)),'additional' => array('visibility' => array('name' => 'status','type' => 'select','class' => 'required-entry','label' => Mage::helper('catalog')->__('Status'),'values' => $statuses))));$this->getMassactionBlock()->addItem('attributes',array('label' => Mage::helper('catalog')->__('Update attributes'),'url' => $this->getUrl('*/catalog_product_action_attribute/edit', array('_current'=>true))));$this->getMassactionBlock()->addItem('otherDivider', $this->getDivider("Other"));$this->getMassactionBlock()->addItem('save',array('label' => Mage::helper('catalog')->__('Update'),'url' => $this->getUrl('*/*/massUpdateProducts', array('_current'=>true)),'fields' => array(0=>'product', 1=>'related_ids', 2=> 'cross_sell_ids', 3=> 'up_sell_ids')));$this->getMassactionBlock()->addItem('relatedDivider', $this->getCleanDivider());$this->getMassactionBlock()->addItem('otherDividerSalesMotivation', $this->getDivider("Product Relator"));$this->getMassactionBlock()->addItem('relatedEachOther', array('label' => $this->__('Related: To Each Other'),'url' => $this->getUrl('*/*/massRelatedEachOther', array('_current'=>true)),'callback' => 'specifyRelatedEachOther()',));$this->getMassactionBlock()->addItem('relatedTo', array('label' => $this->__('Related: Add ..'),'url' => $this->getUrl('*/*/massRelatedTo', array('_current'=>true)),'callback' => 'specifyRelatedProducts()'));$this->getMassactionBlock()->addItem('relatedClean', array('label' => $this->__('Related: Clear'),'url' => $this->getUrl('*/*/massRelatedClean', array('_current'=>true)),'callback' => 'specifyRelatedClean()'));$this->getMassactionBlock()->addItem('crossSellDivider', $this->getCleanDivider());$this->getMassactionBlock()->addItem('crossSellEachOther', array('label' => $this->__('Cross-Sell: To Each Other'),'url' => $this->getUrl('*/*/massCrossSellEachOther', array('_current'=>true)),'callback' => 'specifyCrossSellEachOther()',));$this->getMassactionBlock()->addItem('crossSellTo', array('label' => $this->__('Cross-Sell: Add ..'),'url' => $this->getUrl('*/*/massCrossSellTo', array('_current'=>true)),'callback' => 'chooseWhatToCrossSellTo()'));$this->getMassactionBlock()->addItem('crossSellClear', array('label' => $this->__('Cross-Sell: Clear'),'url' => $this->getUrl('*/*/massCrossSellClear', array('_current'=>true)),'callback' => 'specifyCrossSellClean()',));$this->getMassactionBlock()->addItem('upSellDivider', $this->getCleanDivider());$this->getMassactionBlock()->addItem('upSellTo', array('label' => $this->__('Up-Sells: Add ..'),'url' => $this->getUrl('*/*/massUpSellTo', array('_current'=>true)),'callback' => 'chooseWhatToUpSellTo()'));$this->getMassactionBlock()->addItem('upSellClear', array('label' => $this->__('Up-Sells: Clear'),'url' => $this->getUrl('*/*/massUpSellClear', array('_current'=>true)),'callback' => 'specifyUpSellClean()',));return $this;}public function getRowUrl($row){return $this->getUrl('adminhtml/catalog_product/edit', array('store'=>$this->getRequest()->getParam('store'),'id'=>$row->getId()));}public function getGridUrl(){return $this->getUrl('*/*/grid', array('_current'=>true));}protected function getDivider($divider="*******") {$dividerTemplate = array('label' => '********'.$this->__($divider).'********','url' => $this->getUrl('*/*/index', array('_current'=>true)),'callback' => "null");return $dividerTemplate;}protected function getSubDivider($divider="-------") {$dividerTemplate = array('label' => '--------'.$this->__($divider).'--------','url' => $this->getUrl('*/*/index', array('_current'=>true)),'callback' => "null");return $dividerTemplate;}protected function getCleanDivider() {$dividerTemplate = array('label' => ' ','url' => $this->getUrl('*/*/index', array('_current'=>true)),'callback' => "null");return $dividerTemplate;}}
20
+
app/code/community/Iksanika/Productrelater/Block/Widget/Grid.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Iksanika llc.
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the EULA
9
+ * that is bundled with this package in the file LICENSE.txt.
10
+ * It is also available through the world-wide-web at this URL:
11
+ * http://www.iksanika.com/products/IKS-LICENSE.txt
12
+ *
13
+ * @category Iksanika
14
+ * @package Iksanika_Productrelater
15
+ * @copyright Copyright (c) 2013 Iksanika llc. (http://www.iksanika.com)
16
+ * @license http://www.iksanika.com/products/IKS-LICENSE.txt
17
+ */
18
+
19
+ class Iksanika_Productrelater_Block_Widget_Grid extends Mage_Adminhtml_Block_Widget_Grid {public function getJsObjectName(){return $this->getId().'JsObjectIKSProductrelater';}}
app/code/community/Iksanika/Productrelater/Block/Widget/Grid/Column.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Iksanika llc.
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the EULA
9
+ * that is bundled with this package in the file LICENSE.txt.
10
+ * It is also available through the world-wide-web at this URL:
11
+ * http://www.iksanika.com/products/IKS-LICENSE.txt
12
+ *
13
+ * @category Iksanika
14
+ * @package Iksanika_Productrelater
15
+ * @copyright Copyright (c) 2013 Iksanika llc. (http://www.iksanika.com)
16
+ * @license http://www.iksanika.com/products/IKS-LICENSE.txt
17
+ */
18
+
19
+ class Iksanika_Productrelater_Block_Widget_Grid_Column extends Mage_Adminhtml_Block_Widget_Grid_Column
20
+ {
21
+ }
app/code/community/Iksanika/Productrelater/Block/Widget/Grid/Column/Renderer/Number.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Iksanika llc.
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the EULA
9
+ * that is bundled with this package in the file LICENSE.txt.
10
+ * It is also available through the world-wide-web at this URL:
11
+ * http://www.iksanika.com/products/IKS-LICENSE.txt
12
+ *
13
+ * @category Iksanika
14
+ * @package Iksanika_Productrelater
15
+ * @copyright Copyright (c) 2013 Iksanika llc. (http://www.iksanika.com)
16
+ * @license http://www.iksanika.com/products/IKS-LICENSE.txt
17
+ */
18
+
19
+ class Iksanika_Productrelater_Block_Widget_Grid_Column_Renderer_Number extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Number {public function render(Varien_Object $row){$html = '<input type="text" ';$html .= 'name="' . $this->getColumn()->getId() . '" ';$html .= 'value="' . parent::_getValue($row) . '"';$html .= 'class="input-text ' . $this->getColumn()->getInlineCss() . '"/>';return $html;}}
app/code/community/Iksanika/Productrelater/Block/Widget/Grid/Massaction.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Iksanika llc.
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the EULA
9
+ * that is bundled with this package in the file LICENSE.txt.
10
+ * It is also available through the world-wide-web at this URL:
11
+ * http://www.iksanika.com/products/IKS-LICENSE.txt
12
+ *
13
+ * @category Iksanika
14
+ * @package Iksanika_Productrelater
15
+ * @copyright Copyright (c) 2013 Iksanika llc. (http://www.iksanika.com)
16
+ * @license http://www.iksanika.com/products/IKS-LICENSE.txt
17
+ */
18
+
19
+ class Iksanika_Productrelater_Block_Widget_Grid_Massaction extends Mage_Adminhtml_Block_Widget_Grid_Massaction {public function getJsObjectName(){return $this->getHtmlId() . 'JsObjectIKSProductrelater';}public function getJavaScript() {return " var {$this->getJsObjectName()} = new varienGridMassactionIksanikaProductrelater('{$this->getHtmlId()}', ". "{$this->getGridJsObjectName()}, '{$this->getSelectedJson()}'". ", '{$this->getFormFieldNameInternal()}', '{$this->getFormFieldName()}');". "{$this->getJsObjectName()}.setItems({$this->getItemsJson()}); ". "{$this->getJsObjectName()}.setGridIds('{$this->getGridIdsJson()}');". ($this->getUseAjax() ? "{$this->getJsObjectName()}.setUseAjax(true);" : ''). ($this->getUseSelectAll() ? "{$this->getJsObjectName()}.setUseSelectAll(true);" : ''). "{$this->getJsObjectName()}.errorText = '{$this->getErrorText()}';";}}
app/code/community/Iksanika/Productrelater/Helper/Data.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Iksanika llc.
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the EULA
9
+ * that is bundled with this package in the file LICENSE.txt.
10
+ * It is also available through the world-wide-web at this URL:
11
+ * http://www.iksanika.com/products/IKS-LICENSE.txt
12
+ *
13
+ * @category Iksanika
14
+ * @package Iksanika_Productrelater
15
+ * @copyright Copyright (c) 2013 Iksanika llc. (http://www.iksanika.com)
16
+ * @license http://www.iksanika.com/products/IKS-LICENSE.txt
17
+ */
18
+
19
+ class Iksanika_Productrelater_Helper_Data extends Mage_Core_Helper_Abstract
20
+ {
21
+ }
app/code/community/Iksanika/Productrelater/Model/Resource/Eav/Mysql4/Product/Collection.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Iksanika llc.
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the EULA
9
+ * that is bundled with this package in the file LICENSE.txt.
10
+ * It is also available through the world-wide-web at this URL:
11
+ * http://www.iksanika.com/products/IKS-LICENSE.txt
12
+ *
13
+ * @category Iksanika
14
+ * @package Iksanika_Productrelater
15
+ * @copyright Copyright (c) 2013 Iksanika llc. (http://www.iksanika.com)
16
+ * @license http://www.iksanika.com/products/IKS-LICENSE.txt
17
+ */
18
+
19
+ class Iksanika_Productrelater_Model_Resource_Eav_Mysql4_Product_Collection extends Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection {public function getSelectCountSql(){$this->_renderFilters();$countSelect = clone $this->getSelect();$countSelect->reset(Zend_Db_Select::ORDER);$countSelect->reset(Zend_Db_Select::LIMIT_COUNT);$countSelect->reset(Zend_Db_Select::LIMIT_OFFSET);$countSelect->reset(Zend_Db_Select::COLUMNS);if(count($this->getSelect()->getPart(Zend_Db_Select::GROUP)) > 0){$countSelect->reset(Zend_Db_Select::GROUP);$countSelect->distinct(true);$group = $this->getSelect()->getPart(Zend_Db_Select::GROUP);$countSelect->columns("COUNT(DISTINCT ".implode(", ", $group).")");} else {$countSelect->columns('COUNT(*)');}return $countSelect;}}
app/code/community/Iksanika/Productrelater/controllers/Catalog/ProductController.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Iksanika llc.
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the EULA
9
+ * that is bundled with this package in the file LICENSE.txt.
10
+ * It is also available through the world-wide-web at this URL:
11
+ * http://www.iksanika.com/products/IKS-LICENSE.txt
12
+ *
13
+ * @category Iksanika
14
+ * @package Iksanika_Productrelater
15
+ * @copyright Copyright (c) 2013 Iksanika llc. (http://www.iksanika.com)
16
+ * @license http://www.iksanika.com/products/IKS-LICENSE.txt
17
+ */
18
+
19
+ include_once "Mage/Adminhtml/controllers/Catalog/ProductController.php";class Iksanika_Productrelater_Catalog_ProductController extends Mage_Adminhtml_Catalog_ProductController {protected function _construct(){$this->setUsedModuleName('Iksanika_Productrelater');}public function indexAction(){$this->loadLayout();$this->_setActiveMenu('catalog/productrelater');$this->_addContent($this->getLayout()->createBlock('productrelater/catalog_product'));$this->renderLayout();} public function gridAction() {$this->loadLayout();$this->getResponse()->setBody($this->getLayout()->createBlock('productrelater/catalog_product_grid')->toHtml());}protected function _isAllowed(){return Mage::getSingleton('admin/session')->isAllowed('catalog/products');}public function massUpdateProductsAction(){$productIds = $this->getRequest()->getParam('product');if (is_array($productIds)){try {foreach ($productIds as $itemId => $productId){$product = Mage::getModel('catalog/product')->load($productId);$productBefore = $product;$columnForUpdate = array('related_ids', 'cross_sell_ids', 'up_sell_ids');foreach($columnForUpdate as $columnName){$columnValuesForUpdate = $this->getRequest()->getParam($columnName);if($columnName == 'related_ids'){$relatedIds = trim($columnValuesForUpdate[$itemId]) != "" ? explode(',', trim($columnValuesForUpdate[$itemId])) : array();$link = $this->getRelatedLinks($relatedIds, array(), $productId);$product->setRelatedLinkData($link);}else if($columnName == 'cross_sell_ids'){$crossSellIds = trim($columnValuesForUpdate[$itemId]) != "" ? explode(',', trim($columnValuesForUpdate[$itemId])) : array();$link = $this->getRelatedLinks($crossSellIds, array(), $productId);$product->setCrossSellLinkData($link);}else if($columnName == 'up_sell_ids'){$upSellIds = trim($columnValuesForUpdate[$itemId]) != "" ? explode(',', trim($columnValuesForUpdate[$itemId])) : array();$link = $this->getRelatedLinks($upSellIds, array(), $productId);$product->setUpSellLinkData($link);}}$product->save();}$this->_getSession()->addSuccess($this->__('Total of %d record(s) were successfully refreshed.', count($productIds)));} catch (Exception $e){$this->_getSession()->addError($e->getMessage());}}else{$this->_getSession()->addError($this->__('Please select product(s)').'. '.$this->__('You should select checkboxes for each product row which should be updated. You can click on checkboxes or use CTRL+Click on product row which should be selected.'));}$this->_redirect('*/*/index');}public function getRelatedLinks($productIds, $existProducts, $productId){$link = array();foreach ($productIds as $relatedToId){if ($productId != $relatedToId){$link[$relatedToId] = array('position' => null);}}foreach($existProducts as $existProduct){$link[$existProduct->getId()] = array('position' => null);}return $link;} public function massRelatedEachOtherAction(){$productIds = $this->getRequest()->getParam('product');if (is_array($productIds)){try {foreach ($productIds as $productId){$product = Mage::getModel('catalog/product')->load($productId);$link = $this->getRelatedLinks($productIds, $product->getRelatedProducts(), $productId);$product->setRelatedLinkData($link);if ($this->massactionEventDispatchEnabled){Mage::dispatchEvent('catalog_product_prepare_save', array('product' => $product, 'request' => $this->getRequest()));}$product->save();}$this->_getSession()->addSuccess($this->__('Total of %d record(s) were successfully related to each other.', count($productIds)));} catch (Exception $e){$this->_getSession()->addError($e->getMessage());}}else{$this->_getSession()->addError($this->__('Please select product(s)').'. '.$this->__('You should select checkboxes for each product row which should be updated. You can click on checkboxes or use CTRL+Click on product row which should be selected.'));}$this->_redirect('*/*/index');}public function massRelatedToAction(){$productIds = $this->getRequest()->getParam('product');$productIds2List = $this->getRequest()->getParam('callbackval');$productIds2 = explode(',', $productIds2List);if (is_array($productIds)){try {foreach ($productIds as $productId){$product = Mage::getModel('catalog/product')->load($productId);$link = $this->getRelatedLinks($productIds2, $product->getRelatedProducts(), $productId);$product->setRelatedLinkData($link);if ($this->massactionEventDispatchEnabled){Mage::dispatchEvent('catalog_product_prepare_save', array('product' => $product, 'request' => $this->getRequest()));}$product->save();}$this->_getSession()->addSuccess($this->__('Total of %d record(s) were successfully related to products('.$productIds2List.').', count($productIds)));} catch (Exception $e){$this->_getSession()->addError($e->getMessage());}}else{$this->_getSession()->addError($this->__('Please select product(s)').'. '.$this->__('You should select checkboxes for each product row which should be updated. You can click on checkboxes or use CTRL+Click on product row which should be selected.'));}$this->_redirect('*/*/index');}public function massRelatedCleanAction(){$productIds = $this->getRequest()->getParam('product');if (is_array($productIds)){try {foreach ($productIds as $productId){$product = Mage::getModel('catalog/product')->load($productId);$product->setRelatedLinkData(array());if ($this->massactionEventDispatchEnabled){Mage::dispatchEvent('catalog_product_prepare_save', array('product' => $product, 'request' => $this->getRequest()));}$product->save();}$this->_getSession()->addSuccess($this->__('Total of %d record(s) are no longer related to any other products.', count($productIds)));} catch (Exception $e){$this->_getSession()->addError($e->getMessage());}}else{$this->_getSession()->addError($this->__('Please select product(s)').'. '.$this->__('You should select checkboxes for each product row which should be updated. You can click on checkboxes or use CTRL+Click on product row which should be selected.'));}$this->_redirect('*/*/index');}public function massCrossSellEachOtherAction(){$productIds = $this->getRequest()->getParam('product');if (is_array($productIds)){try {foreach ($productIds as $productId){$product = Mage::getModel('catalog/product')->load($productId);$link = $this->getRelatedLinks($productIds, $product->getCrossSellProducts(), $productId);$product->setCrossSellLinkData($link);if ($this->massactionEventDispatchEnabled){Mage::dispatchEvent('catalog_product_prepare_save', array('product' => $product, 'request' => $this->getRequest()));}$product->save();}$this->_getSession()->addSuccess($this->__('Total of %d record(s) were successfully cross-related to each other.', count($productIds)));} catch (Exception $e){$this->_getSession()->addError($e->getMessage());}}else{$this->_getSession()->addError($this->__('Please select product(s)').'. '.$this->__('You should select checkboxes for each product row which should be updated. You can click on checkboxes or use CTRL+Click on product row which should be selected.'));}$this->_redirect('*/*/index');}public function massCrossSellToAction(){$productIds = $this->getRequest()->getParam('product');$productIds2List = $this->getRequest()->getParam('callbackval');$productIds2 = explode(',', $productIds2List);if (is_array($productIds)){try {foreach ($productIds as $productId){$product = Mage::getModel('catalog/product')->load($productId);$link = $this->getRelatedLinks($productIds2, $product->getCrossSellProducts(), $productId);$product->setCrossSellLinkData($link);if ($this->massactionEventDispatchEnabled){Mage::dispatchEvent('catalog_product_prepare_save', array('product' => $product, 'request' => $this->getRequest()));}$product->save();}$this->_getSession()->addSuccess($this->__('Total of %d record(s) were successfully set as cross-sells by products('.$productIds2List.').', count($productIds)));} catch (Exception $e){$this->_getSession()->addError($e->getMessage());}}else{$this->_getSession()->addError($this->__('Please select product(s)').'. '.$this->__('You should select checkboxes for each product row which should be updated. You can click on checkboxes or use CTRL+Click on product row which should be selected.'));}$this->_redirect('*/*/index');}public function massCrossSellClearAction(){$productIds = $this->getRequest()->getParam('product');if (is_array($productIds)){try {foreach ($productIds as $productId){$product = Mage::getModel('catalog/product')->load($productId);$product->setCrossSellLinkData(array());if ($this->massactionEventDispatchEnabled){Mage::dispatchEvent('catalog_product_prepare_save', array('product' => $product, 'request' => $this->getRequest()));}$product->save();}$this->_getSession()->addSuccess($this->__('Total of %d record(s) now have no products as cross sell links.', count($productIds)));} catch (Exception $e){$this->_getSession()->addError($e->getMessage());}}else{$this->_getSession()->addError($this->__('Please select product(s)'));}$this->_redirect('*/*/index');} public function massUpSellToAction(){$productIds = $this->getRequest()->getParam('product');$productIds2List = $this->getRequest()->getParam('callbackval');$productIds2 = explode(',', $productIds2List);if (is_array($productIds)){try {foreach ($productIds as $productId){$product = Mage::getModel('catalog/product')->load($productId);$link = $this->getRelatedLinks($productIds2, $product->getUpSellProducts(), $productId);$product->setUpSellLinkData($link);if ($this->massactionEventDispatchEnabled){Mage::dispatchEvent('catalog_product_prepare_save', array('product' => $product, 'request' => $this->getRequest()));}$product->save();}$this->_getSession()->addSuccess($this->__('Total of %d record(s) are now up-sold by products('.$productIds2List.').', count($productIds)));} catch (Exception $e){$this->_getSession()->addError($e->getMessage());}}else{$this->_getSession()->addError($this->__('Please select product(s)').'. '.$this->__('You should select checkboxes for each product row which should be updated. You can click on checkboxes or use CTRL+Click on product row which should be selected.'));}$this->_redirect('*/*/index');} public function massUpSellClearAction(){$productIds = $this->getRequest()->getParam('product');if (is_array($productIds)){try {foreach ($productIds as $productId){$product = Mage::getModel('catalog/product')->load($productId);$product->setUpSellLinkData(array());if ($this->massactionEventDispatchEnabled){Mage::dispatchEvent('catalog_product_prepare_save', array('product' => $product, 'request' => $this->getRequest()));}$product->save();}$this->_getSession()->addSuccess($this->__('Total of %d record(s) now have 0 up-sells', count($productIds)));} catch (Exception $e){$this->_getSession()->addError($e->getMessage());}}else{$this->_getSession()->addError($this->__('Please select product(s)').'. '.$this->__('You should select checkboxes for each product row which should be updated. You can click on checkboxes or use CTRL+Click on product row which should be selected.'));}$this->_redirect('*/*/index');}}
20
+
app/code/community/Iksanika/Productrelater/etc/config.xml ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <modules>
4
+ <Iksanika_Productrelater>
5
+ <version>1.0.0</version>
6
+ </Iksanika_Productrelater>
7
+ </modules>
8
+ <admin>
9
+ <routers>
10
+ <productrelater>
11
+ <!-- should be set to "admin" when overloading admin stuff (?) -->
12
+ <use>admin</use>
13
+ <args>
14
+ <module>Iksanika_Productrelater</module>
15
+ <!-- This is used when "catching" the rewrite above -->
16
+ <frontName>productrelater</frontName>
17
+ </args>
18
+ </productrelater>
19
+ </routers>
20
+ </admin>
21
+ <global>
22
+ <blocks>
23
+ <productrelater>
24
+ <class>Iksanika_Productrelater_Block</class>
25
+ </productrelater>
26
+ </blocks>
27
+ <helpers>
28
+ <productrelater>
29
+ <class>Iksanika_Productrelater_Helper</class>
30
+ </productrelater>
31
+ </helpers>
32
+ <models>
33
+ <catalog_resource_eav_mysql4>
34
+ <rewrite>
35
+ <product_collection>Iksanika_Productrelater_Model_Resource_Eav_Mysql4_Product_Collection</product_collection>
36
+ </rewrite>
37
+ </catalog_resource_eav_mysql4>
38
+ </models>
39
+ <blocks>
40
+ <adminhtml>
41
+ <rewrite>
42
+ <widget_grid_column>Iksanika_Productrelater_Block_Widget_Grid_Column</widget_grid_column>
43
+ </rewrite>
44
+ </adminhtml>
45
+ </blocks>
46
+
47
+ <!-- Relate Stuff -->
48
+ </global>
49
+ <adminhtml>
50
+ <layout>
51
+ <updates>
52
+ <productrelater>
53
+ <file>iksanika_productrelater.xml</file>
54
+ </productrelater>
55
+ </updates>
56
+ </layout>
57
+ <menu>
58
+ <catalog module="productrelater">
59
+ <children>
60
+ <productrelater module="productrelater">
61
+ <title>Mass Product Relater</title>
62
+ <sort_order>0</sort_order>
63
+ <action>productrelater/catalog_product</action>
64
+ </productrelater>
65
+ </children>
66
+ </catalog>
67
+ </menu>
68
+ </adminhtml>
69
+ <adminhtml>
70
+ <acl>
71
+ <resources>
72
+ <all>
73
+ <title>Allow Everything</title>
74
+ </all>
75
+ <admin>
76
+ <children>
77
+ <catalog>
78
+ <children>
79
+ <productrelater>
80
+ <title>Mass Product Relater</title>
81
+ </productrelater>
82
+ </children>
83
+ </catalog>
84
+ <system>
85
+ <children>
86
+ <config>
87
+ <children>
88
+ <productrelater>
89
+ <title>Mass Product Relater Config</title>
90
+ </productrelater>
91
+ </children>
92
+ </config>
93
+ </children>
94
+ </system>
95
+ </children>
96
+ </admin>
97
+ </resources>
98
+ </acl>
99
+ </adminhtml>
100
+ </config>
app/design/adminhtml/default/default/layout/iksanika_productrelater.xml ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <layout>
3
+ <default>
4
+ <reference name="head">
5
+ <action method="addJs">
6
+ <script>Iksanika/productrelater/jquery-1.9.1.min.js</script>
7
+ </action>
8
+ <action method="addJs">
9
+ <script>Iksanika/productrelater/relaterproducts.js</script>
10
+ </action>
11
+ <action method="addJs">
12
+ <script>Iksanika/productrelater/relatergrid.js</script>
13
+ </action>
14
+ <action method="addJs">
15
+ <script>Iksanika/productrelater/egsupplemental.js</script>
16
+ </action>
17
+ <action method="addItem">
18
+ <type>js_css</type>
19
+ <name>Iksanika/productrelater/resources/css/productrelater.css</name>
20
+ </action>
21
+ </reference>
22
+ </default>
23
+ </layout>
app/design/adminhtml/default/default/template/iksanika/productrelater/catalog/product.phtml ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Iksanika llc.
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the EULA
9
+ * that is bundled with this package in the file LICENSE.txt.
10
+ * It is also available through the world-wide-web at this URL:
11
+ * http://www.iksanika.com/products/IKS-LICENSE.txt
12
+ *
13
+ * @category Iksanika
14
+ * @package Iksanika_Productupdater
15
+ * @copyright Copyright (c) 2013 Iksanika llc. (http://www.iksanika.com)
16
+ * @license http://www.iksanika.com/products/IKS-LICENSE.txt
17
+ */
18
+
19
+ ?>
20
+
21
+ <div class="content-header">
22
+ <table cellspacing="0">
23
+ <tr>
24
+ <td style="width:50%;"><h3 class="icon-head head-products"><?php echo $this->_headerText ?></h3></td>
25
+ <td class="a-right">
26
+ <?php echo $this->getButtonsHtml() ?>
27
+ </td>
28
+ </tr>
29
+ </table>
30
+ </div>
31
+
32
+ <?php echo $this->getStoreSwitcherHtml() ?>
33
+
34
+ <div>
35
+ <?php echo $this->getGridHtml() ?>
36
+ </div>
app/design/adminhtml/default/default/template/iksanika/productrelater/catalog/product/grid.phtml ADDED
@@ -0,0 +1,255 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Iksanika llc.
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the EULA
9
+ * that is bundled with this package in the file LICENSE.txt.
10
+ * It is also available through the world-wide-web at this URL:
11
+ * http://www.iksanika.com/products/IKS-LICENSE.txt
12
+ *
13
+ * @category Iksanika
14
+ * @package Iksanika_Productupdater
15
+ * @copyright Copyright (c) 2013 Iksanika llc. (http://www.iksanika.com)
16
+ * @license http://www.iksanika.com/products/IKS-LICENSE.txt
17
+ */
18
+
19
+ ?>
20
+
21
+ <?php
22
+ $colDataWithRelated = false;
23
+ $colDataWithCrossSell = false;
24
+ $colDataWithUpSell = false;
25
+ $numColumns = sizeof($this->getColumns());
26
+ ?>
27
+
28
+ <?php if($this->getCollection()): ?>
29
+
30
+ <?php if($this->canDisplayContainer()): ?>
31
+ <?php if($this->getGridHeader()): ?>
32
+ <div class="content-header">
33
+ <table cellspacing="0">
34
+ <tr>
35
+ <td style="width:50%;"><h2><?php echo $this->getGridHeader(); ?></h2></td>
36
+ </tr>
37
+ </table>
38
+ </div>
39
+ <?php endif ?>
40
+
41
+ <div id="<?php echo $this->getId() ?>">
42
+ <?php else: ?>
43
+ <?php echo $this->getMessagesBlock()->getGroupedHtml() ?>
44
+ <?php endif; ?>
45
+
46
+ <?php if($this->getPagerVisibility() || $this->getFilterVisibility()): ?>
47
+ <table cellspacing="0" class="actions">
48
+ <tr>
49
+ <?php if($this->getPagerVisibility()): ?>
50
+ <td class="pager">
51
+ <?php echo $this->__('Page') ?>
52
+
53
+ <?php $_curPage = $this->getCollection()->getCurPage() ?>
54
+ <?php $_lastPage = $this->getCollection()->getLastPageNumber() ?>
55
+
56
+ <?php if($_curPage>1): ?>
57
+ <a href="#" title="<?php echo $this->__('Previous page') ?>" onclick="<?php echo $this->getId() ?>JsObjectIKSProductRelater.setPage('<?php echo ($_curPage-1) ?>');return false;"><img src="<?php echo $this->getSkinUrl('images/pager_arrow_left.gif') ?>" alt="Go to Previous page" class="arrow"/></a>
58
+ <?php else: ?>
59
+ <img src="<?php echo $this->getSkinUrl('images/pager_arrow_left_off.gif') ?>" alt="Go to Previous page" class="arrow"/>
60
+ <?php endif; ?>
61
+
62
+ <input type="text" name="<?php echo $this->getVarNamePage() ?>" value="<?php echo $_curPage ?>" class="input-text page" onkeypress="<?php echo $this->getId() ?>JsObjectIKSProductRelater.inputPage(event, '<?php echo $_lastPage ?>')"/>
63
+
64
+ <?php if($_curPage < $_lastPage): ?>
65
+ <a href="#" title="<?php echo $this->__('Next page') ?>" onclick="<?php echo $this->getId() ?>JsObjectIKSProductRelater.setPage('<?php echo ($_curPage+1) ?>');return false;"><img src="<?php echo $this->getSkinUrl('images/pager_arrow_right.gif') ?>" alt="Go to Next page" class="arrow"/></a>
66
+ <?php else: ?>
67
+ <img src="<?php echo $this->getSkinUrl('images/pager_arrow_right_off.gif') ?>" alt="Go to Previous page" class="arrow"/>
68
+ <?php endif; ?>
69
+
70
+
71
+ <?php echo $this->__('of %s pages', $this->getCollection()->getLastPageNumber()) ?>
72
+ <span class="separator">|</span>
73
+ <?php echo $this->__('View') ?>
74
+ <select name="<?php echo $this->getVarNameLimit() ?>" onchange="<?php echo $this->getId() ?>JsObjectIKSProductRelater.loadByElement(this)">
75
+ <option value="20"<?php if($this->getCollection()->getPageSize()==20): ?> selected="selected"<?php endif; ?>>20</option>
76
+ <option value="30"<?php if($this->getCollection()->getPageSize()==30): ?> selected="selected"<?php endif; ?>>30</option>
77
+ <option value="50"<?php if($this->getCollection()->getPageSize()==50): ?> selected="selected"<?php endif; ?>>50</option>
78
+ <option value="100"<?php if($this->getCollection()->getPageSize()==100): ?> selected="selected"<?php endif; ?>>100</option>
79
+ <option value="200"<?php if($this->getCollection()->getPageSize()==200): ?> selected="selected"<?php endif; ?>>200</option>
80
+ </select>
81
+ <?php echo $this->__('per page') ?><span class="separator">|</span>
82
+ <?php echo $this->__('Total %d records found', $this->getCollection()->getSize()) ?>
83
+ <span id="<?php echo $this->getHtmlId() ?>-total-count" class="no-display"><?php echo $this->getCollection()->getSize() ?></span>
84
+
85
+ <?php if($this->getRssLists()): ?>
86
+ <?php foreach ($this->getRssLists() as $_rss): ?>
87
+ <span class="separator">|</span><a href="<?php echo $_rss->getUrl() ?>" class="link-feed"><?php echo $_rss->getLabel() ?></a>
88
+ <?php endforeach ?>
89
+ <?php endif; ?>
90
+ </td>
91
+ <?php endif ?>
92
+
93
+
94
+ <td class="filter-actions a-right">
95
+ <?php echo $this->getMainButtonsHtml() ?>
96
+ </td>
97
+
98
+ </tr>
99
+ </table>
100
+ <?php endif; ?>
101
+
102
+
103
+
104
+ <?php if($this->getMassactionBlock()->isAvailable()): ?>
105
+ <?php echo $this->getMassactionBlockHtml() ?>
106
+ <?php endif ?>
107
+
108
+ <?php /* >
109
+
110
+ <div>
111
+ <?php $x = $this->getCollection();
112
+
113
+ foreach($x as $i)
114
+ {
115
+ var_dump($i);
116
+ }
117
+
118
+ ?>
119
+
120
+ </div>
121
+
122
+ */ ?>
123
+
124
+ <script type="text/javascript">
125
+ this.massUpdateProducts = '<?php echo $this->getUrl('*/*/massUpdateProducts')?>';
126
+ </script>
127
+
128
+ <form method="post" action="" id="editData">
129
+ <div class="grid">
130
+ <div class="hor-scroll">
131
+ <table cellspacing="0" class="data" id="<?php echo $this->getId() ?>_table">
132
+
133
+
134
+
135
+ <?php foreach ($this->getColumns() as $_column): ?>
136
+ <?php
137
+ $colData = $_column->getData();
138
+ if(isset($colData['index']))
139
+ {
140
+ if($colData['index'] == 'related_ids')
141
+ $colDataWithRelated = true;
142
+ if($colData['index'] == 'cross_sell_ids')
143
+ $colDataWithCrossSell = true;
144
+ if($colData['index'] == 'up_sell_ids')
145
+ $colDataWithUpSell = true;
146
+ }
147
+
148
+ ?>
149
+
150
+ <col <?php echo $_column->getHtmlProperty() ?> />
151
+
152
+
153
+ <?php endforeach; ?>
154
+
155
+
156
+ <?php if ($this->getHeadersVisibility() || $this->getFilterVisibility()): ?>
157
+ <thead>
158
+ <?php if ($this->getHeadersVisibility()): ?>
159
+ <tr class="headings">
160
+ <?php foreach ($this->getColumns() as $_column): ?>
161
+ <th<?php echo $_column->getHeaderHtmlProperty() ?>><span class="nobr"><?php echo $_column->getHeaderHtml() ?></span></th>
162
+ <?php endforeach; ?>
163
+ </tr>
164
+ <?php endif; ?>
165
+ <?php if ($this->getFilterVisibility()): ?>
166
+ <tr class="filter">
167
+ <?php $i=0;foreach ($this->getColumns() as $_column): ?>
168
+ <th<?php echo $_column->getHeaderHtmlProperty() ?>><?php echo $_column->getFilterHtml() ?></th>
169
+ <?php endforeach; ?>
170
+ </tr>
171
+ <?php endif ?>
172
+ </thead>
173
+ <?php endif; ?>
174
+ <?php if ($this->getCountTotals()): ?>
175
+ <tfoot>
176
+ <tr>
177
+ <?php foreach ($this->getColumns() as $_column): ?>
178
+ <th class="<?php echo $_column->getCssProperty() ?>"><?php echo $_column->getRowField($_column->getGrid()->getTotals()) ?>&nbsp;</th>
179
+ <?php endforeach; ?>
180
+ </tr>
181
+ </tfoot>
182
+ <?php endif; ?>
183
+ <tbody>
184
+ <?php if (($this->getCollection()->getSize()>0) && (!$this->getIsCollapsed())): ?>
185
+
186
+ <?php foreach ($this->getCollection() as $_index=>$_item): ?>
187
+ <?php
188
+ if($colDataWithRelated)
189
+ {
190
+ $ids = implode(',', $_item->getRelatedProductIds());
191
+ $_item->setData('related_ids', $ids);
192
+ }
193
+ if($colDataWithCrossSell)
194
+ {
195
+ $ids = implode(',', $_item->getCrossSellProductIds());
196
+ $_item->setData('cross_sell_ids', $ids);
197
+ }
198
+ if($colDataWithUpSell)
199
+ {
200
+ $ids = implode(',', $_item->getUpSellProductIds());
201
+ $_item->setData('up_sell_ids', $ids);
202
+ }
203
+ ?>
204
+
205
+ <tr title="<?php echo $this->getRowUrl($_item) ?>"<?php if ($_class = $this->getRowClass($_item)):?> class="<?php echo $_class; ?>"<?php endif;?> id="product<?php echo $_item->getData('entity_id');?>">
206
+ <?php $i=0;foreach ($this->getColumns() as $_column): ?>
207
+ <td class="<?php echo $_column->getCssProperty() ?> <?php echo ++$i==$numColumns?'last':'' ?>"><?php echo (($_html = $_column->getRowField($_item)) != '' ? $_html : '&nbsp;') ?></td>
208
+ <?php endforeach; ?>
209
+ </tr>
210
+ <?php endforeach; ?>
211
+ <?php elseif ($this->getEmptyText()): ?>
212
+ <tr>
213
+ <td class="empty-text <?php echo $this->getEmptyTextClass() ?>" colspan="100"><?php echo $this->getEmptyText() ?></td>
214
+ </tr>
215
+ <?php endif; ?>
216
+ </tbody>
217
+ </table>
218
+ </div>
219
+ </div>
220
+
221
+ </form>
222
+ <?php if($this->canDisplayContainer()): ?>
223
+ </div>
224
+
225
+
226
+ <div>
227
+ <div style="float: right;">
228
+ <a href="http://www.iksanika.com/go/magento-ext" border="0" target="_blank"><img src="/media/iksanika/productrelater/iksanika-logo.png" border="0"/></a>
229
+ </div>
230
+ <div style="float: right;width: 160px;padding-right: 25px;padding-top: 3px;">
231
+ <a href="http://www.iksanika.com/go/magento-aapm" border="0" target="_blank">Upgrade to <strong>Advanced Admin Products Manager</strong> today!</a>
232
+ </div>
233
+ </div>
234
+
235
+ <script type="text/javascript">
236
+ //<![CDATA[
237
+ <?php echo $this->getJsObjectName() ?> = new varienGridIKSProductRelater('<?php echo $this->getId() ?>', '<?php echo $this->getGridUrl() ?>', '<?php echo $this->getVarNamePage() ?>', '<?php echo $this->getVarNameSort() ?>', '<?php echo $this->getVarNameDir() ?>', '<?php echo $this->getVarNameFilter() ?>');
238
+ <?php echo $this->getJsObjectName() ?>.useAjax = '<?php echo $this->getUseAjax() ?>';
239
+ <?php if($this->getRowClickCallback()): ?>
240
+ <?php echo $this->getJsObjectName() ?>.rowClickCallback = <?php echo $this->getRowClickCallback() ?>;
241
+ <?php endif; ?>
242
+ <?php if($this->getCheckboxCheckCallback()): ?>
243
+ <?php echo $this->getJsObjectName() ?>.checkboxCheckCallback = <?php echo $this->getCheckboxCheckCallback() ?>;
244
+ <?php endif; ?>
245
+ <?php if($this->getRowInitCallback()): ?>
246
+ <?php echo $this->getJsObjectName() ?>.initRowCallback = <?php echo $this->getRowInitCallback() ?>;
247
+ <?php echo $this->getJsObjectName() ?>.rows.each(function(row){<?php echo $this->getRowInitCallback() ?>(<?php echo $this->getJsObjectName() ?>, row)});
248
+ <?php endif; ?>
249
+ <?php if($this->getMassactionBlock()->isAvailable()): ?>
250
+ <?php echo $this->getMassactionBlock()->getJavaScript() ?>
251
+ <?php endif ?>
252
+ //]]>
253
+ </script>
254
+ <?php endif; ?>
255
+ <?php endif ?>
app/etc/modules/Iksanika_Productrelater.xml ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <modules>
4
+ <Iksanika_Productrelater>
5
+ <active>true</active>
6
+ <codePool>community</codePool>
7
+ </Iksanika_Productrelater>
8
+ </modules>
9
+ </config>
js/Iksanika/productrelater/egsupplemental.js ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ //form tags to omit in NS6+:
3
+
4
+ var omitformtags=["input", "select"]
5
+
6
+ omitformtags=omitformtags.join("|")
7
+
8
+ function disableselect(e)
9
+ {
10
+ if (omitformtags.indexOf(e.target.tagName.toLowerCase())==-1)
11
+ return false
12
+ }
13
+
14
+ function reEnable()
15
+ {
16
+ return true
17
+ }
18
+
19
+ var originalHighlighting = false;
20
+
21
+ function disableHighlighting()
22
+ {
23
+ if (typeof document.onselectstart!="undefined")
24
+ {
25
+ originalHighlighting = document.onselectstart;
26
+ document.onselectstart=new Function ("return false")
27
+ } else{
28
+ originalHighlighting = {
29
+ down: document.onmousedown,
30
+ up: document.onmouseup
31
+ }
32
+ document.onmousedown=disableselect
33
+ document.onmouseup=reEnable
34
+ }
35
+ }
36
+
37
+ function enableHighlighting()
38
+ {
39
+ if (typeof document.onselectstart!="undefined")
40
+ {
41
+ document.onselectstart = originalHighlighting;
42
+ } else{
43
+ document.onmousedown=originalHighlighting.down;
44
+ document.onmouseup=originalHighlighting.up;
45
+ }
46
+ }
47
+
48
+ function keyWasPressed(e, targetKeyNum) {
49
+ var keychar;
50
+ var numcheck;
51
+
52
+ if(window.event) // IE
53
+ {
54
+ keynum = e.keyCode;
55
+ }
56
+ else if(e.which) // Netscape/Firefox/Opera
57
+ {
58
+ keynum = e.which;
59
+ }
60
+ if(keynum == targetKeyNum)
61
+ {
62
+ return true;
63
+ }
64
+ return false;
65
+ }
js/Iksanika/productrelater/jquery-1.9.1.min.js ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ /*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license
2
+ //@ sourceMappingURL=jquery.min.map
3
+ */(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav></:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},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(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;
4
+ return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="<a name='"+x+"'></a><div name='"+x+"'></div>",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="<input type='hidden' i=''/>",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&&gt(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Nt=/^(?:checkbox|radio)$/i,Ct=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:b.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l)
5
+ }b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=ln(e,t),Pt.detach()),Gt[e]=n),n}function ln(e,t){var n=b(t.createElement(e)).appendTo(t.body),r=b.css(n[0],"display");return n.remove(),r}b.each(["height","width"],function(e,n){b.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(b.css(e,"display"))?b.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,i),i):0)}}}),b.support.opacity||(b.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=b.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===b.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),b(function(){b.support.reliableMarginRight||(b.cssHooks.marginRight={get:function(e,n){return n?b.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!b.support.pixelPosition&&b.fn.position&&b.each(["top","left"],function(e,n){b.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?b(e).position()[n]+"px":r):t}}})}),b.expr&&b.expr.filters&&(b.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!b.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||b.css(e,"display"))},b.expr.filters.visible=function(e){return!b.expr.filters.hidden(e)}),b.each({margin:"",padding:"",border:"Width"},function(e,t){b.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(b.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;b.fn.extend({serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=b.prop(this,"elements");return e?b.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!b(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Nt.test(e))}).map(function(e,t){var n=b(this).val();return null==n?null:b.isArray(n)?b.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),b.param=function(e,n){var r,i=[],o=function(e,t){t=b.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=b.ajaxSettings&&b.ajaxSettings.traditional),b.isArray(e)||e.jquery&&!b.isPlainObject(e))b.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(b.isArray(t))b.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==b.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}b.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){b.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),b.fn.hover=function(e,t){return this.mouseenter(e).mouseleave(t||e)};var mn,yn,vn=b.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Nn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Cn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=b.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=a.href}catch(Ln){yn=o.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(b.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(u){var l;return o[u]=!0,b.each(e[u]||[],function(e,u){var c=u(n,r,i);return"string"!=typeof c||a||o[c]?a?!(l=c):t:(n.dataTypes.unshift(c),s(c),!1)}),l}return s(n.dataTypes[0])||!o["*"]&&s("*")}function Mn(e,n){var r,i,o=b.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&b.extend(!0,e,r),e}b.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,u=e.indexOf(" ");return u>=0&&(i=e.slice(u,e.length),e=e.slice(0,u)),b.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&b.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?b("<div>").append(b.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},b.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){b.fn[t]=function(e){return this.on(t,e)}}),b.each(["get","post"],function(e,n){b[n]=function(e,r,i,o){return b.isFunction(r)&&(o=o||i,i=r,r=t),b.ajax({url:e,type:n,dataType:o,data:r,success:i})}}),b.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Nn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Mn(Mn(e,b.ajaxSettings),t):Mn(b.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,u,l,c,p=b.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?b(f):b.event,h=b.Deferred(),g=b.Callbacks("once memory"),m=p.statusCode||{},y={},v={},x=0,T="canceled",N={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return x||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>x)for(t in e)m[t]=[m[t],e[t]];else N.always(e[N.status]);return this},abort:function(e){var t=e||T;return l&&l.abort(t),k(0,t),this}};if(h.promise(N).complete=g.add,N.success=N.done,N.error=N.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=b.trim(p.dataType||"*").toLowerCase().match(w)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?80:443))==(mn[3]||("http:"===mn[1]?80:443)))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=b.param(p.data,p.traditional)),qn(An,p,n,N),2===x)return N;u=p.global,u&&0===b.active++&&b.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Cn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(b.lastModified[o]&&N.setRequestHeader("If-Modified-Since",b.lastModified[o]),b.etag[o]&&N.setRequestHeader("If-None-Match",b.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&N.setRequestHeader("Content-Type",p.contentType),N.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)N.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,N,p)===!1||2===x))return N.abort();T="abort";for(i in{success:1,error:1,complete:1})N[i](p[i]);if(l=qn(jn,p,n,N)){N.readyState=1,u&&d.trigger("ajaxSend",[N,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){N.abort("timeout")},p.timeout));try{x=1,l.send(y,k)}catch(C){if(!(2>x))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,C=n;2!==x&&(x=2,s&&clearTimeout(s),l=t,a=i||"",N.readyState=e>0?4:0,r&&(w=_n(p,N,r)),e>=200&&300>e||304===e?(p.ifModified&&(T=N.getResponseHeader("Last-Modified"),T&&(b.lastModified[o]=T),T=N.getResponseHeader("etag"),T&&(b.etag[o]=T)),204===e?(c=!0,C="nocontent"):304===e?(c=!0,C="notmodified"):(c=Fn(p,w),C=c.state,y=c.data,v=c.error,c=!v)):(v=C,(e||!C)&&(C="error",0>e&&(e=0))),N.status=e,N.statusText=(n||C)+"",c?h.resolveWith(f,[y,C,N]):h.rejectWith(f,[N,C,v]),N.statusCode(m),m=t,u&&d.trigger(c?"ajaxSuccess":"ajaxError",[N,p,c?y:v]),g.fireWith(f,[N,C]),u&&(d.trigger("ajaxComplete",[N,p]),--b.active||b.event.trigger("ajaxStop")))}return N},getScript:function(e,n){return b.get(e,t,n,"script")},getJSON:function(e,t,n){return b.get(e,t,n,"json")}});function _n(e,n,r){var i,o,a,s,u=e.contents,l=e.dataTypes,c=e.responseFields;for(s in c)s in r&&(n[c[s]]=r[s]);while("*"===l[0])l.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in u)if(u[s]&&u[s].test(o)){l.unshift(s);break}if(l[0]in r)a=l[0];else{for(s in r){if(!l[0]||e.converters[s+" "+l[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==l[0]&&l.unshift(a),r[a]):t}function Fn(e,t){var n,r,i,o,a={},s=0,u=e.dataTypes.slice(),l=u[0];if(e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u[1])for(i in e.converters)a[i.toLowerCase()]=e.converters[i];for(;r=u[++s];)if("*"!==r){if("*"!==l&&l!==r){if(i=a[l+" "+r]||a["* "+r],!i)for(n in a)if(o=n.split(" "),o[1]===r&&(i=a[l+" "+o[0]]||a["* "+o[0]])){i===!0?i=a[n]:a[n]!==!0&&(r=o[0],u.splice(s--,0,r));break}if(i!==!0)if(i&&e["throws"])t=i(t);else try{t=i(t)}catch(c){return{state:"parsererror",error:i?c:"No conversion from "+l+" to "+r}}}l=r}return{state:"success",data:t}}b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return b.globalEval(e),e}}}),b.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),b.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=o.head||b("head")[0]||o.documentElement;return{send:function(t,i){n=o.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var On=[],Bn=/(=)\?(?=&|$)|\?\?/;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=On.pop()||b.expando+"_"+vn++;return this[e]=!0,e}}),b.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,u=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return u||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=b.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,u?n[u]=n[u].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||b.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,On.push(o)),s&&b.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}b.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=b.ajaxSettings.xhr(),b.support.cors=!!Rn&&"withCredentials"in Rn,Rn=b.support.ajax=!!Rn,Rn&&b.ajaxTransport(function(n){if(!n.crossDomain||b.support.cors){var r;return{send:function(i,o){var a,s,u=n.xhr();if(n.username?u.open(n.type,n.url,n.async,n.username,n.password):u.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)u[s]=n.xhrFields[s];n.mimeType&&u.overrideMimeType&&u.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)u.setRequestHeader(s,i[s])}catch(l){}u.send(n.hasContent&&n.data||null),r=function(e,i){var s,l,c,p;try{if(r&&(i||4===u.readyState))if(r=t,a&&(u.onreadystatechange=b.noop,$n&&delete Pn[a]),i)4!==u.readyState&&u.abort();else{p={},s=u.status,l=u.getAllResponseHeaders(),"string"==typeof u.responseText&&(p.text=u.responseText);try{c=u.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,l)},n.async?4===u.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},b(e).unload($n)),Pn[a]=r),u.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+x+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n,r,i=this.createTween(e,t),o=Yn.exec(t),a=i.cur(),s=+a||0,u=1,l=20;if(o){if(n=+o[2],r=o[3]||(b.cssNumber[e]?"":"px"),"px"!==r&&s){s=b.css(i.elem,e,!0)||n||1;do u=u||".5",s/=u,b.style(i.elem,e,s+r);while(u!==(u=i.cur()/a)&&1!==u&&--l)}i.unit=r,i.start=s,i.end=o[1]?s+(o[1]+1)*n:n}return i}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=b.now()}function Zn(e,t){b.each(t,function(t,n){var r=(Qn[t]||[]).concat(Qn["*"]),i=0,o=r.length;for(;o>i;i++)if(r[i].call(e,t,n))return})}function er(e,t,n){var r,i,o=0,a=Gn.length,s=b.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;for(;u>a;a++)l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),1>o&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:b.extend({},t),opts:b.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=b.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?s.resolveWith(e,[l,t]):s.rejectWith(e,[l,t]),this}}),c=l.props;for(tr(c,l.opts.specialEasing);a>o;o++)if(r=Gn[o].call(l,e,c,l.opts))return r;return Zn(l,c),b.isFunction(l.opts.start)&&l.opts.start.call(e,l),b.fx.timer(b.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function tr(e,t){var n,r,i,o,a;for(i in e)if(r=b.camelCase(i),o=t[r],n=e[i],b.isArray(n)&&(o=n[1],n=e[i]=n[0]),i!==r&&(e[r]=n,delete e[i]),a=b.cssHooks[r],a&&"expand"in a){n=a.expand(n),delete e[r];for(i in n)i in e||(e[i]=n[i],t[i]=o)}else t[r]=o}b.Animation=b.extend(er,{tweener:function(e,t){b.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,u,l,c,p,f=this,d=e.style,h={},g=[],m=e.nodeType&&nn(e);n.queue||(c=b._queueHooks(e,"fx"),null==c.unqueued&&(c.unqueued=0,p=c.empty.fire,c.empty.fire=function(){c.unqueued||p()}),c.unqueued++,f.always(function(){f.always(function(){c.unqueued--,b.queue(e,"fx").length||c.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],"inline"===b.css(e,"display")&&"none"===b.css(e,"float")&&(b.support.inlineBlockNeedsLayout&&"inline"!==un(e.nodeName)?d.zoom=1:d.display="inline-block")),n.overflow&&(d.overflow="hidden",b.support.shrinkWrapBlocks||f.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]}));for(i in t)if(a=t[i],Vn.exec(a)){if(delete t[i],u=u||"toggle"===a,a===(m?"hide":"show"))continue;g.push(i)}if(o=g.length){s=b._data(e,"fxshow")||b._data(e,"fxshow",{}),"hidden"in s&&(m=s.hidden),u&&(s.hidden=!m),m?b(e).show():f.done(function(){b(e).hide()}),f.done(function(){var t;b._removeData(e,"fxshow");for(t in h)b.style(e,t,h[t])});for(i=0;o>i;i++)r=g[i],l=f.createTween(r,m?s[r]:0),h[r]=s[r]||b.style(e,r),r in s||(s[r]=l.start,m&&(l.end=l.start,l.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}b.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(b.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?b.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=b.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){b.fx.step[e.prop]?b.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[b.cssProps[e.prop]]||b.cssHooks[e.prop])?b.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},b.each(["toggle","show","hide"],function(e,t){var n=b.fn[t];b.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),b.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=b.isEmptyObject(e),o=b.speed(t,n,r),a=function(){var t=er(this,b.extend({},e),o);a.finish=function(){t.stop(!0)},(i||b._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=b.timers,a=b._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&b.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=b._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=b.timers,a=r?r.length:0;for(n.finish=!0,b.queue(this,e,[]),i&&i.cur&&i.cur.finish&&i.cur.finish.call(this),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}b.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){b.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),b.speed=function(e,t,n){var r=e&&"object"==typeof e?b.extend({},e):{complete:n||!n&&t||b.isFunction(e)&&e,duration:e,easing:n&&t||t&&!b.isFunction(t)&&t};return r.duration=b.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in b.fx.speeds?b.fx.speeds[r.duration]:b.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){b.isFunction(r.old)&&r.old.call(this),r.queue&&b.dequeue(this,r.queue)},r},b.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},b.timers=[],b.fx=rr.prototype.init,b.fx.tick=function(){var e,n=b.timers,r=0;for(Xn=b.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||b.fx.stop(),Xn=t},b.fx.timer=function(e){e()&&b.timers.push(e)&&b.fx.start()},b.fx.interval=13,b.fx.start=function(){Un||(Un=setInterval(b.fx.tick,b.fx.interval))},b.fx.stop=function(){clearInterval(Un),Un=null},b.fx.speeds={slow:600,fast:200,_default:400},b.fx.step={},b.expr&&b.expr.filters&&(b.expr.filters.animated=function(e){return b.grep(b.timers,function(t){return e===t.elem}).length}),b.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){b.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,b.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},b.offset={setOffset:function(e,t,n){var r=b.css(e,"position");"static"===r&&(e.style.position="relative");var i=b(e),o=i.offset(),a=b.css(e,"top"),s=b.css(e,"left"),u=("absolute"===r||"fixed"===r)&&b.inArray("auto",[a,s])>-1,l={},c={},p,f;u?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),b.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(l.top=t.top-o.top+p),null!=t.left&&(l.left=t.left-o.left+f),"using"in t?t.using.call(e,l):i.css(l)}},b.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===b.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),b.nodeName(e[0],"html")||(n=e.offset()),n.top+=b.css(e[0],"borderTopWidth",!0),n.left+=b.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-b.css(r,"marginTop",!0),left:t.left-n.left-b.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||o.documentElement;while(e&&!b.nodeName(e,"html")&&"static"===b.css(e,"position"))e=e.offsetParent;return e||o.documentElement})}}),b.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);b.fn[e]=function(i){return b.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?b(a).scrollLeft():o,r?o:b(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return b.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}b.each({Height:"height",Width:"width"},function(e,n){b.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){b.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return b.access(this,function(n,r,i){var o;return b.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?b.css(n,r,s):b.style(n,r,i,s)},n,a?i:t,a,null)}})}),e.jQuery=e.$=b,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return b})})(window);var $j=jQuery.noConflict();
js/Iksanika/productrelater/relatergrid.js ADDED
@@ -0,0 +1,450 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Magento
3
+ *
4
+ * NOTICE OF LICENSE
5
+ *
6
+ * This source file is subject to the Open Software License (OSL 3.0)
7
+ * that is bundled with this package in the file LICENSE.txt.
8
+ * It is also available through the world-wide-web at this URL:
9
+ * http://opensource.org/licenses/osl-3.0.php
10
+ * If you did not receive a copy of the license and are unable to
11
+ * obtain it through the world-wide-web, please send an email
12
+ * to license@magentocommerce.com so we can send you a copy immediately.
13
+ *
14
+ * @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
15
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
16
+ */
17
+
18
+ var varienGridIKSProductRelater = Class.create(varienGrid);
19
+
20
+ varienGridIKSProductRelater.prototype.initialize = function(containerId, url, pageVar, sortVar, dirVar, filterVar){
21
+ this.containerId = containerId;
22
+ this.url = url;
23
+ this.pageVar = pageVar || false;
24
+ this.sortVar = sortVar || false;
25
+ this.dirVar = dirVar || false;
26
+ this.filterVar = filterVar || false;
27
+ this.tableSufix = '_table';
28
+ this.useAjax = false;
29
+ this.rowClickCallback = false;
30
+ this.checkboxCheckCallback = false;
31
+ this.preInitCallback = false;
32
+ this.initCallback = false;
33
+ this.initRowCallback = false;
34
+ this.doFilterCallback = false;
35
+
36
+ // muliselect row
37
+ this.selectedRowEvents = {};
38
+ this.doMultiSelect = false;
39
+ this.multiSelectFunction = function(events) {this.onMultiSelect(events);};
40
+
41
+
42
+ this.reloadParams = false;
43
+
44
+ this.trOnMouseOver = this.rowMouseOver.bindAsEventListener(this);
45
+ this.trOnMouseOut = this.rowMouseOut.bindAsEventListener(this);
46
+ this.trOnMouseUp = this.rowMouseUp.bindAsEventListener(this);
47
+ this.trOnMouseDown = this.rowMouseDown.bindAsEventListener(this);
48
+ this.trOnMouseMove = this.rowMouseMove.bindAsEventListener(this);
49
+ this.trOnClick = this.rowMouseClick.bindAsEventListener(this);
50
+ this.trOnDblClick = this.rowMouseDblClick.bindAsEventListener(this);
51
+ this.trOnKeyPress = this.keyPress.bindAsEventListener(this);
52
+
53
+ this.thLinkOnClick = this.doSort.bindAsEventListener(this);
54
+ this.initGrid();
55
+ };
56
+
57
+
58
+ varienGridIKSProductRelater.prototype.initGrid = function(){
59
+ if(this.preInitCallback)
60
+ {
61
+ this.preInitCallback(this);
62
+ }
63
+ if($(this.containerId+this.tableSufix))
64
+ {
65
+ this.rows = $$('#'+this.containerId+this.tableSufix+' tbody tr');
66
+ for (var row=0; row<this.rows.length; row++)
67
+ {
68
+ if(row%2==0)
69
+ {
70
+ Element.addClassName(this.rows[row], 'even');
71
+ }
72
+ Event.observe(this.rows[row],'mouseover',this.trOnMouseOver);
73
+ Event.observe(this.rows[row],'mouseout',this.trOnMouseOut);
74
+ Event.observe(this.rows[row],'click',this.trOnClick);
75
+ Event.observe(this.rows[row],'dblclick',this.trOnDblClick);
76
+ Event.observe(this.rows[row],'mouseup',this.trOnMouseUp);
77
+ Event.observe(this.rows[row],'mousedown',this.trOnMouseDown);
78
+ Event.observe(this.rows[row],'mousemove',this.trOnMouseMove);
79
+
80
+ if(this.initRowCallback)
81
+ {
82
+ try {
83
+ this.initRowCallback(this, this.rows[row]);
84
+ } catch (e)
85
+ {
86
+ if(console) {
87
+ console.log(e);
88
+ }
89
+ }
90
+ }
91
+ }
92
+ }
93
+ if(this.sortVar && this.dirVar)
94
+ {
95
+ var columns = $$('#'+this.containerId+this.tableSufix+' thead a');
96
+
97
+ for(var col=0; col<columns.length; col++){
98
+ Event.observe(columns[col],'click',this.thLinkOnClick);
99
+ }
100
+ }
101
+ this.bindFilterFields();
102
+ this.bindFieldsChange();
103
+ if(this.initCallback)
104
+ {
105
+ try {
106
+ this.initCallback(this);
107
+ }
108
+ catch (e) {
109
+ if(console) {
110
+ console.log(e);
111
+ }
112
+ }
113
+ }
114
+ };
115
+
116
+ varienGridIKSProductRelater.prototype.rowMouseOver = function(event)
117
+ {
118
+ var element = Event.findElement(event, 'tr');
119
+ Element.addClassName(element, 'on-mouse');
120
+
121
+ if (!Element.hasClassName('pointer')
122
+ && (this.rowClickCallback !== openGridRow || element.id))
123
+ {
124
+ Element.addClassName(element, 'pointer');
125
+ }
126
+ if(this.doMultiSelect) {
127
+ if (this.addMultiSelectedRow(event, element)) {
128
+ // row is already selected...
129
+ } else {
130
+ Element.addClassName(element, 'multiselect')
131
+ }
132
+ }
133
+ };
134
+
135
+ varienGridIKSProductRelater.prototype.rowMouseMove = function(event)
136
+ {
137
+ };
138
+
139
+ varienGridIKSProductRelater.prototype.addMultiSelectedRow = function(event, rowElement)
140
+ {
141
+ var checkbox = this.findCheckbox(event);
142
+ var newId = checkbox.value;
143
+ if(this.selectedRowEvents[newId] != null)
144
+ {
145
+ return false;
146
+ }
147
+ this.selectedRowEvents[newId] = {
148
+ event: event,
149
+ rowElement: rowElement,
150
+ checkbox: checkbox
151
+ };
152
+ };
153
+
154
+ varienGridIKSProductRelater.prototype.findCheckbox = function(evt)
155
+ {
156
+ if(['a', 'input', 'select','textarea'].indexOf(Event.element(evt).tagName.toLowerCase())!==-1)
157
+ {
158
+ return false;
159
+ }
160
+ checkbox = false;
161
+ Event.findElement(evt, 'tr').getElementsBySelector('input[type=checkbox]').each(function(element){
162
+ checkbox = element;
163
+ }.bind(this));
164
+ return checkbox;
165
+ };
166
+
167
+ varienGridIKSProductRelater.prototype.removeMultiSelectedRow = function(event, rowElement) {
168
+ if(this.selectedRowEvents[rowElement.id] != null)
169
+ {
170
+ this.selectedRowEvents[rowElement.id] = null;
171
+ }
172
+ return false;
173
+ }
174
+
175
+ varienGridIKSProductRelater.prototype.rowMouseUp = function(event){
176
+ if(this.doMultiSelect)
177
+ {
178
+ enableHighlighting();
179
+ this.doMultiSelect = false;
180
+ this.multiSelectFunction(this.selectedRowEvents);
181
+ }
182
+ };
183
+
184
+ varienGridIKSProductRelater.prototype.rowMouseDown = function(event)
185
+ {
186
+ if(event.ctrlKey) {
187
+ if(['a', 'input', 'select','textarea'].indexOf(Event.element(event).tagName.toLowerCase())!==-1)
188
+ {
189
+ return false;
190
+ }
191
+ disableHighlighting();
192
+ this.doMultiSelect = true;
193
+ this.selectedRowEvents = {};
194
+ // Add the row we just clicked on
195
+ var element = Event.findElement(event, 'tr');
196
+ this.addMultiSelectedRow(event, element);
197
+ Element.addClassName(element, 'multiselect')
198
+ }
199
+ }
200
+
201
+ varienGridIKSProductRelater.prototype.rowMouseClick = function(event)
202
+ {
203
+ if(this.doMultiSelect)
204
+ {
205
+ this.doMultiSelect = false;
206
+ return;
207
+ }
208
+ if(event.ctrlKey) return;
209
+
210
+ if(this.rowClickCallback)
211
+ {
212
+ try {
213
+ this.rowClickCallback(this, event);
214
+ }
215
+ catch(e){}
216
+ }
217
+ varienGlobalEvents.fireEvent('gridRowClick', event);
218
+ };
219
+
220
+ // Multiselect
221
+ varienGridIKSProductRelater.prototype.onMultiSelect = function(events)
222
+ {
223
+ for(rowid in events)
224
+ {
225
+ var multiRowEvent = events[rowid];
226
+ var checkbox = multiRowEvent.checkbox;
227
+ this.setCheckboxChecked(checkbox, checkbox.checked ? false : true);
228
+ multiRowEvent.rowElement.blur();
229
+ Element.removeClassName(multiRowEvent.rowElement, 'multiselect');
230
+ }
231
+ }
232
+
233
+ var varienGridMassactionIksanikaProductrelater = Class.create(varienGridMassaction);
234
+
235
+ varienGridMassactionIksanikaProductrelater.prototype.initialize = function (containerId, grid, checkedValues, formFieldNameInternal, formFieldName)
236
+ {
237
+ // MAGE -- begin
238
+ this.setOldCallback('row_click', grid.rowClickCallback);
239
+ this.setOldCallback('init', grid.initCallback);
240
+ this.setOldCallback('init_row', grid.initRowCallback);
241
+ this.setOldCallback('pre_init', grid.preInitCallback);
242
+
243
+ this.useAjax = false;
244
+ this.grid = grid;
245
+ this.containerId = containerId;
246
+ this.initMassactionElements();
247
+
248
+ this.checkedString = checkedValues;
249
+ this.formFieldName = formFieldName;
250
+ this.formFieldNameInternal = formFieldNameInternal;
251
+
252
+ this.grid.initCallback = this.onGridInit.bind(this);
253
+ this.grid.preInitCallback = this.onGridPreInit.bind(this);
254
+ this.grid.initRowCallback = this.onGridRowInit.bind(this);
255
+ this.grid.rowClickCallback = this.onGridRowClick.bind(this);
256
+ this.initCheckboxes();
257
+ this.checkCheckboxes();
258
+ // MAGE -- end
259
+
260
+ // grid -- begin
261
+ this.grid.multiSelectFunction = this.onMultiSelect.bind(this);
262
+ //this.selectedRows = false;
263
+
264
+ if(checkedValues != "") {
265
+ checkedValues.each(function(item){
266
+ this.checkedValues[item] = item;
267
+ }.bind(this));
268
+ }
269
+ };
270
+
271
+ // Multiselect
272
+ varienGridMassactionIksanikaProductrelater.prototype.onMultiSelect = function(events)
273
+ {
274
+ this.grid.onMultiSelect(events);
275
+ var checkValues = new Array();
276
+ var uncheckValues = new Array();
277
+ for(rowid in events)
278
+ {
279
+ var checkVal = events[rowid].checkbox.value;
280
+ if(events[rowid].checkbox.checked)
281
+ {
282
+ checkValues.push(checkVal);
283
+ this.checkedString = varienStringArray.add(checkVal, this.checkedString);
284
+ } else
285
+ {
286
+ uncheckValues.push(checkVal);
287
+ this.checkedString = varienStringArray.remove(checkVal, this.checkedString);
288
+ }
289
+ }
290
+
291
+ this.updateCount();
292
+ };
293
+
294
+ varienGridMassactionIksanikaProductrelater.prototype.apply = function()
295
+ {
296
+ var item = this.getSelectedItem();
297
+ if(!item)
298
+ {
299
+ this.validator.validate();
300
+ return;
301
+ }
302
+ this.currentItem = item;
303
+
304
+ var fieldName = "";
305
+ if (item.field == undefined)
306
+ {
307
+ fieldName = this.formFieldName
308
+ }
309
+ fieldName += '[]';
310
+
311
+ var fieldsHtml = '';
312
+ var callbackVal = null;
313
+ var multiFields = item.fields;
314
+
315
+ if(this.currentItem.callback)
316
+ {
317
+ if(this.getCheckedValues().length != 0)
318
+ {
319
+ callbackVal = eval(this.currentItem.callback.replace("{checkedValues}", "'"+ this.getCheckedValues()+"'"));
320
+ if (callbackVal == null)
321
+ {
322
+ return;
323
+ }
324
+
325
+ var formCallbackVal = document.createElement('input');
326
+ formCallbackVal.type = "hidden";
327
+ formCallbackVal.value = callbackVal;
328
+ formCallbackVal.name = "callbackval";
329
+ this.form.appendChild(formCallbackVal);
330
+ }else
331
+ {
332
+ var strconfirm = confirm("You have no checked products for update. In case of submit you will lost changed data in grid. Are you sure you want to update? Click Cancel to select products (select checkboxes or CTRL+Click on product row) for update.", "Warning!");
333
+ if (strconfirm == false)
334
+ {
335
+ return false;
336
+ }
337
+ }
338
+ }
339
+
340
+ if(this.currentItem.confirm && !window.confirm(this.currentItem.confirm))
341
+ {
342
+ return;
343
+ }
344
+
345
+ /* this.getOnlyExistsCheckedValues().each(function(item){
346
+ fieldsHtml += this.fieldTemplate.evaluate({name: fieldName, value: item});
347
+ }.bind(this)); */
348
+
349
+ if(this.getCheckedValues().length != 0)
350
+ {
351
+
352
+ this.getCheckedValues().split(",").each(function(item){
353
+ // console.log('ITEM: '+item);
354
+ if(multiFields != null)
355
+ {
356
+ for (var i=0; i<multiFields.length; i++)
357
+ {
358
+ // console.log('COMPONENT: '+$j('#editData #product'+item+' [name='+multiFields[i]+']'));
359
+ itemValue = $j('#editData #product'+item+' [name='+multiFields[i]+']').val();
360
+
361
+ fieldsHtml += "<textarea name=\""+multiFields[i]+"[]\" style=\"display:none;\">"+itemValue+"</textarea>";
362
+ fieldsHtml += this.fieldTemplate.evaluate({name: multiFields[i]+'[]', value: itemValue});
363
+
364
+ // console.log(itemValue);
365
+ // itemValue = $j('#editData #product'+item+' [name='+multiFields[i]+']').text();
366
+ //console.log('fild name: '+multiFields[i]);
367
+ }
368
+ } else {
369
+ fieldsHtml += this.fieldTemplate.evaluate({
370
+ name: fieldName,
371
+ value: item
372
+ });
373
+ }
374
+ }.bind(this));
375
+ }
376
+ // console.log(fieldsHtml);return false;
377
+ this.formHiddens.update(fieldsHtml);
378
+
379
+ if(!this.validator.validate()) {
380
+ return;
381
+ }
382
+ //return null;
383
+ if(this.useAjax && item.url) {
384
+ new Ajax.Request(item.url, {
385
+ 'method': 'post',
386
+ 'parameters': this.form.serialize(true),
387
+ 'onComplete': this.onMassactionComplete.bind(this)
388
+ });
389
+ } else if(item.url) {
390
+ this.form.action = item.url;
391
+ this.form.submit();
392
+ }
393
+
394
+ };
395
+
396
+ varienGridMassactionIksanikaProductrelater.prototype.walkSelectedRows = function(walkFunction, warningLimit)
397
+ {
398
+ if(warningLimit == undefined) warningLimit = 100;
399
+ var selectedRowCount = 0;
400
+ var abort = false;
401
+ this.grid.rows.each(function(ie) {
402
+ var rcheckboxs = ie.getElementsBySelector('input[type=checkbox]').each(function(chk)
403
+ {
404
+ if(chk.checked)
405
+ {
406
+ if(abort) return;
407
+ walkFunction(ie); //user function
408
+
409
+ // checks for abort.
410
+ selectedRowCount++;
411
+ if(selectedRowCount == warningLimit)
412
+ {
413
+ if(!window.confirm("There are over 100 rows processing, should the script continue?"))
414
+ {
415
+ abort = true;
416
+ }
417
+ }
418
+ }
419
+ });
420
+ });
421
+ }
422
+
423
+ varienGridIKSProductRelater.prototype.doFilter = function()
424
+ {
425
+ var filters = $$('#'+this.containerId+' .filter input', '#'+this.containerId+' .filter select');
426
+ var searchQry = $$('#'+this.containerId+' .filter input', '#'+this.containerId+' .filter select');
427
+ var elements = [];
428
+ for(var i in filters)
429
+ {
430
+ if(filters[i].value && filters[i].value.length) elements.push(filters[i]);
431
+ }
432
+ if (!this.doFilterCallback || (this.doFilterCallback && this.doFilterCallback()))
433
+ {
434
+ if($$('input#enhancedGridSearchQry')[0] != undefined)
435
+ {
436
+ this.addVarToUrl('q', $$('input#enhancedGridSearchQry')[0].value);
437
+ }
438
+ this.reload(this.addVarToUrl(this.filterVar, encode_base64(Form.serializeElements(elements))));
439
+ }
440
+ }
441
+
442
+ varienGridIKSProductRelater.prototype.resetFilter = function()
443
+ {
444
+ if($$('input#enhancedGridSearchQry')[0] != undefined)
445
+ {
446
+ this.addVarToUrl('q', '')
447
+ }
448
+ this.addVarToUrl(this.filterVar, '')
449
+ this.reload();
450
+ }
js/Iksanika/productrelater/relaterproducts.js ADDED
@@ -0,0 +1,137 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+
3
+ function productsUpdate()
4
+ {
5
+ // $('#myForm').submit(function() {
6
+ // get all the inputs into an array.
7
+ var $inputs = $j('#editData :input');
8
+
9
+ // not sure if you wanted this, but I thought I'd add it.
10
+ // get an associative array of just the values.
11
+ var values = {};
12
+ $inputs.each(function() {
13
+ values[this.name] = $j(this).val();
14
+ });
15
+ console.log(values);
16
+ //alert('test');
17
+ //return null;
18
+ // });
19
+ /*
20
+ editData.action = this.massUpdateProducts;
21
+ console.log(editData.action);
22
+ editData.submit();*/
23
+ }
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+ function specifyRelatedProducts()
32
+ {
33
+ var productids = window.prompt("Enter the products ID's you would like to relate the currently selected products to.\n"
34
+ +"For example: Suppose you selected Y and Z. If you enter 'A,B' here,\n"
35
+ +" Y will be related to A and B, Z will be related to A and B.\n"
36
+ +"Separate multiple product IDs (NOT SKUs!) by a comma as shown in the example above.", "<Enter product IDs>");
37
+ if (productids == "" || productids == null)
38
+ {
39
+ return null;
40
+ }
41
+ if (!window.confirm("Are you sure you would like to one-way relate selected grid products to products ("+ productids +")"))
42
+ {
43
+ return null;
44
+ }
45
+ return productids;
46
+ }
47
+
48
+ function specifyRelatedEachOther()
49
+ {
50
+ if (!window.confirm("Are you sure you would like to make the selected products related to each other?"))
51
+ {
52
+ return null;
53
+ }
54
+ return true;
55
+ }
56
+
57
+ function specifyRelatedClean()
58
+ {
59
+ if (!window.confirm("Are you sure you would like to remove all related products of products selected list?"))
60
+ {
61
+ return null;
62
+ }
63
+ return true;
64
+ }
65
+
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+ function chooseWhatToCrossSellTo()
74
+ {
75
+ var productids = window.prompt("Enter the id's for products you would like to add as cross-sell to the currently selected products.\n"
76
+ +"For example: Suppose you selected Y and Z. If you enter 'A,B' here,\n"
77
+ +"X will be cross-sold to A and B, Z will be cross-sold with A and with B.\n"
78
+ +"Separate multiple product IDs (NOT SKUs!) by a comma as shown in the example above.", "<Enter product IDs>");
79
+ if (productids == "" || productids == null)
80
+ {
81
+ return null
82
+ }
83
+ if (!window.confirm("Are you sure you'd like to one-way cross-sell products ("+ productids +") to selected grid products?"))
84
+ {
85
+ return null
86
+ }
87
+ return productids;
88
+ }
89
+
90
+ function specifyCrossSellEachOther()
91
+ {
92
+ if (!window.confirm("Are you sure you would like ot make the selected products cross-sell each other?"))
93
+ {
94
+ return null;
95
+ }
96
+ return true;
97
+ }
98
+
99
+ function specifyCrossSellClean()
100
+ {
101
+ if (!window.confirm("Are you sure you would like to remove these product's cross sell links?"))
102
+ {
103
+ return null;
104
+ }
105
+ return true;
106
+ }
107
+
108
+
109
+
110
+
111
+
112
+
113
+ function chooseWhatToUpSellTo()
114
+ {
115
+ var productids = window.prompt("Enter the id's for products you would like to add as up-sells to the currently selected products.\n"
116
+ +"For example: Suppose you selected Y and Z. If you enter 'A,B' here,\n"
117
+ +"A and B will be up-sells of Y, A and B will be up-sells of Z.\n"
118
+ +"Separate multiple product ids (NOT SKUs!) by a comma as shown in the example above.", "<Enter product IDs>");
119
+ if (productids == "" || productids == null)
120
+ {
121
+ return null
122
+ }
123
+ if (!window.confirm("Are you sure you would like add products ("+ productids +") to selected grid products up-sell?"))
124
+ {
125
+ return null
126
+ }
127
+ return productids;
128
+ }
129
+
130
+ function specifyUpSellClean()
131
+ {
132
+ if (!window.confirm("Are you sure you would like to remove any up-sells for selected product(s)?"))
133
+ {
134
+ return null;
135
+ }
136
+ return true;
137
+ }
js/Iksanika/productrelater/resources/css/productrelater.css ADDED
@@ -0,0 +1,2 @@
 
 
1
+
2
+ .grid tr.multiselect, .grid tr.multiselect tr { background:#CCF0F0 !important; }
media/iksanika/productrelater/iksanika-logo.png ADDED
Binary file
package.xml ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <package>
3
+ <name>Iksanika_Productrelater</name>
4
+ <version>1.0.0</version>
5
+ <stability>stable</stability>
6
+ <license uri="http://www.iksanika.com/products/IKS-LICENSE.txt">IKS-LICENSE</license>
7
+ <channel>community</channel>
8
+ <extends/>
9
+ <summary>Mass assign up-sell, cross-sell and related products easily - hands, 2-way, multi-way algorithms available.</summary>
10
+ <description>Save up to 98% of your time and grow up revenue up to additional 40% on cross-, up- and related - sell products in your Magento store. &#xD;
11
+ &#xD;
12
+ * One Page Bulk Products Update With In-grid Editable Fields for Up-Sell, Cross-Sell and Related products ids fields which allow you easy filter by cross-sell,up-sell, related products and add, change, delete cross-sell,up-sell, related products on one page for list of products and with one click update feature.&#xD;
13
+ * Mass Product Relater actions: Mass Relating Products: One-way relate, multi-relate, or un-relate Mass Cross-selling Products: Mass cross-selling products: One-way cross-sell, multi-cross-sell, or un-cross-sell Mass Up-selling Products: One-way up-sell, un-up-sell</description>
14
+ <notes>Initial-basic version of Mass Product Relater by Iksanika for Magento store.</notes>
15
+ <authors><author><name>Iksanika</name><user>iksanika</user><email>info@iksanika.com</email></author></authors>
16
+ <date>2013-05-11</date>
17
+ <time>04:34:17</time>
18
+ <contents><target name="magecommunity"><dir name="Iksanika"><dir name="Productrelater"><dir name="Block"><dir name="Catalog"><dir name="Product"><file name="Grid.php" hash="a0e67eacaa45eb0acf00ed95117d5403"/></dir><file name="Product.php" hash="3f4c56185d797622cdac7b2a9e0dfe30"/></dir><dir name="Widget"><dir name="Grid"><dir name="Column"><dir name="Renderer"><file name="Number.php" hash="ff71da7c2f74726dd0efccd752e393f6"/></dir></dir><file name="Column.php" hash="20d990d79cdd6e975428f6e99d2f2641"/><file name="Massaction.php" hash="a2dcb48c8b1bf5039e72bbff0f81b82e"/></dir><file name="Grid.php" hash="3700b8298380428295d717571565fe8c"/></dir></dir><dir name="Helper"><file name="Data.php" hash="06e4facd290ef54099d3776851a3672a"/></dir><dir name="Model"><dir name="Resource"><dir name="Eav"><dir name="Mysql4"><dir name="Product"><file name="Collection.php" hash="28767c33cd5e5914e9aad1a84e79d7df"/></dir></dir></dir></dir></dir><dir name="controllers"><dir name="Catalog"><file name="ProductController.php" hash="51082ba930014cc627de308261196733"/></dir></dir><dir name="etc"><file name="config.xml" hash="86d21f138cadff8f481dd4e4f827b451"/></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="iksanika_productrelater.xml" hash="35d21da2b8a52584954952725f64ded6"/></dir><dir name="template"><dir name="iksanika"><dir name="productrelater"><dir name="catalog"><dir name="product"><file name="grid.phtml" hash="a8c5fd65a65dd9ecf678b20b961ccd1e"/></dir><file name="product.phtml" hash="28aa8996480973a016117af744f7c3aa"/></dir></dir></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Iksanika_Productrelater.xml" hash="e904533beb0e0dc4f819fb271726bd58"/></dir></target><target name="mage"><dir name="js"><dir name="Iksanika"><dir name="productrelater"><file name="egsupplemental.js" hash="22e901dc1b8b22ae69c4c6241781c783"/><file name="jquery-1.9.1.min.js" hash="bcaf50298ada678da29e7cfa62470db5"/><file name="relatergrid.js" hash="0b8f50918dee4ee6fc76198473e6ddb7"/><file name="relaterproducts.js" hash="0045b5bcda3c95981d042aa135864192"/><dir name="resources"><dir name="css"><file name="productrelater.css" hash="a219b0e656329f2407835dbe346f81d3"/></dir></dir></dir></dir></dir><dir name="media"><dir name="iksanika"><dir name="productrelater"><file name="iksanika-logo.png" hash="445fc3621ed89dc3faa37202185e81b0"/></dir></dir></dir></target></contents>
19
+ <compatible/>
20
+ <dependencies><required><php><min>5.1.0</min><max>6.0.0</max></php></required></dependencies>
21
+ </package>