Atol_Productfeedgenerator - Version 1.0.0

Version Notes

first release

Download this release

Release Info

Developer Atol C
Extension Atol_Productfeedgenerator
Version 1.0.0
Comparing to
See all releases


Version 1.0.0

Files changed (26) hide show
  1. app/code/local/Atol/Productfeedgenerator/Block/Adminhtml/Productflow.php +18 -0
  2. app/code/local/Atol/Productfeedgenerator/Block/Adminhtml/Productflow/Edit.php +58 -0
  3. app/code/local/Atol/Productfeedgenerator/Block/Adminhtml/Productflow/Edit/Categories.php +98 -0
  4. app/code/local/Atol/Productfeedgenerator/Block/Adminhtml/Productflow/Grid.php +63 -0
  5. app/code/local/Atol/Productfeedgenerator/Block/Adminhtml/Productflow/Renderer/Linkscolumn.php +16 -0
  6. app/code/local/Atol/Productfeedgenerator/Block/Frontdisplay.php +35 -0
  7. app/code/local/Atol/Productfeedgenerator/Block/Productflow/Rss.php +107 -0
  8. app/code/local/Atol/Productfeedgenerator/Helper/Data.php +194 -0
  9. app/code/local/Atol/Productfeedgenerator/Model/Mysql4/Productflow.php +14 -0
  10. app/code/local/Atol/Productfeedgenerator/Model/Mysql4/Productflow/Collection.php +15 -0
  11. app/code/local/Atol/Productfeedgenerator/Model/Productflow.php +41 -0
  12. app/code/local/Atol/Productfeedgenerator/Model/System/Config/Source/Orderbytype.php +41 -0
  13. app/code/local/Atol/Productfeedgenerator/Model/System/Config/Source/Productflowtype.php +34 -0
  14. app/code/local/Atol/Productfeedgenerator/controllers/Adminhtml/ProductflowController.php +183 -0
  15. app/code/local/Atol/Productfeedgenerator/controllers/IndexController.php +41 -0
  16. app/code/local/Atol/Productfeedgenerator/controllers/ProductflowController.php +43 -0
  17. app/code/local/Atol/Productfeedgenerator/etc/adminhtml.xml +36 -0
  18. app/code/local/Atol/Productfeedgenerator/etc/config.xml +119 -0
  19. app/code/local/Atol/Productfeedgenerator/etc/system.xml +54 -0
  20. app/code/local/Atol/Productfeedgenerator/etc/widget.xml +36 -0
  21. app/code/local/Atol/Productfeedgenerator/sql/productfeedgenerator_setup/mysql4-install-0.1.0.php +24 -0
  22. app/etc/modules/Atol_Productfeedgenerator.xml +12 -0
  23. app/locale/fr_FR/Atol_Productfeedgenerator.csv +33 -0
  24. js/jquery/jquery-1.4.4.min.js +168 -0
  25. package.xml +53 -0
  26. skin/adminhtml/default/default/css/productfeedgenerator/styles.css +50 -0
app/code/local/Atol/Productfeedgenerator/Block/Adminhtml/Productflow.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * @category Atol
5
+ * @package Atol_Productfeedgenerator
6
+ * @copyright Copyright (c) 2013 Atol C&D (http://www.atolcd.com)
7
+ */
8
+ class Atol_Productfeedgenerator_Block_Adminhtml_Productflow extends Mage_Adminhtml_Block_Widget_Grid_Container
9
+ {
10
+ public function __construct()
11
+ {
12
+ parent::__construct();
13
+ $this->_controller = 'adminhtml_productflow';
14
+ $this->_blockGroup = 'productfeedgenerator';
15
+ $this->_headerText = Mage::helper('productfeedgenerator')->__('Product flow management');
16
+ $this->_addButtonLabel = Mage::helper('productfeedgenerator')->__('Add a Product flow');
17
+ }
18
+ }
app/code/local/Atol/Productfeedgenerator/Block/Adminhtml/Productflow/Edit.php ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * @category Atol
5
+ * @package Atol_Quotationplus
6
+ * @copyright Copyright (c) 2012 Atol C&D (http://www.atolcd.com)
7
+ */
8
+ class Atol_Productfeedgenerator_Block_Adminhtml_Productflow_Edit extends Mage_Adminhtml_Block_Widget_Form_Container {
9
+
10
+ private $operators;
11
+
12
+ function __construct() {
13
+ parent::__construct();
14
+ $this->operators = array(
15
+ "multiselect" => array('one' => $this->__('at least one of them operator'), 'all' => $this->__('all of them operator')),
16
+ "select" => array('eq' => $this->__('equal operator'), 'neq' => $this->__('not equal operator'), 'or' => $this->__('or operator')),
17
+ "boolean" => array('eq' => $this->__('equal operator'), 'neq' => $this->__('not equal operator')),
18
+ "text" => array('eq' => $this->__('equal operator'), 'neq' => $this->__('not equal operator'), 'in' => $this->__('in operator'))
19
+
20
+ );
21
+ }
22
+
23
+ public function getHeaderText() {
24
+ if( Mage::registry('productflow_data') && Mage::registry('productflow_data')->getId()) {
25
+ return Mage::helper('productfeedgenerator')->__('Edit the product flow');
26
+ }
27
+ else {
28
+ return Mage::helper('productfeedgenerator')->__('Add a product flow');
29
+ }
30
+ }
31
+
32
+ public function getProductAttributes() {
33
+ $attributes = Mage::getResourceModel('catalog/product_attribute_collection')
34
+ ->setItemObjectClass('catalog/resource_eav_attribute');
35
+ $attributes->getSelect()
36
+ ->distinct(true)
37
+ ->where("frontend_input in ('select','multiselect','boolean')");
38
+ $attributes->addStoreLabel(Mage::app()->getStore()->getId())
39
+ ->setOrder('position', 'ASC')
40
+ ->load();
41
+
42
+ foreach ($attributes as $a)
43
+ {
44
+ $a->setIsRequired(false);
45
+ }
46
+
47
+ return $attributes;
48
+ }
49
+
50
+ public function getOperators($inputType) {
51
+ return (isset($this->operators[$inputType])) ? $this->operators[$inputType] : Array();
52
+ }
53
+
54
+ public function getCurrentProductflow() {
55
+ return Mage::registry('productflow_data');
56
+ }
57
+
58
+ }
app/code/local/Atol/Productfeedgenerator/Block/Adminhtml/Productflow/Edit/Categories.php ADDED
@@ -0,0 +1,98 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @category Atol
4
+ * @package Atol_Productfeedgenerator
5
+ * @copyright Copyright (c) 2013 Atol C&D (http://www.atolcd.com)
6
+ */
7
+ class Atol_Productfeedgenerator_Block_Adminhtml_Productflow_Edit_Categories extends Mage_Adminhtml_Block_Catalog_Category_Tree
8
+ {
9
+ private $json_data;
10
+
11
+ public function __construct()
12
+ {
13
+ parent::__construct();
14
+ $this->setTemplate('productflow/edit/categories.phtml');
15
+ }
16
+
17
+ public function getCategoryCollection()
18
+ {
19
+ $storeId = $this->getRequest()->getParam('store', $this->_getDefaultStoreId());
20
+ $collection = $this->getData('category_collection');
21
+ if (is_null($collection)) {
22
+ $collection = Mage::getModel('catalog/category')->getCollection();
23
+
24
+ /* @var $collection Mage_Catalog_Model_Resource_Eav_Mysql4_Category_Collection */
25
+ $collection->addAttributeToSelect('name')
26
+ ->addAttributeToSelect('is_active')
27
+ ->setProductStoreId($storeId)
28
+ ->setLoadProductCount($this->_withProductCount)
29
+ ->setStoreId($storeId);
30
+
31
+ $this->setData('category_collection', $collection);
32
+ }
33
+ $collection->addFieldToFilter('include_in_menu', array('eq' => true));
34
+ return $collection;
35
+ }
36
+
37
+ protected function _getNodeJson($node, $level=1)
38
+ {
39
+ $item = parent::_getNodeJson($node, $level);
40
+
41
+ $isParent = $this->_isParentSelectedCategory($node);
42
+
43
+ if ($isParent) {
44
+ $item['expanded'] = true;
45
+ }
46
+
47
+ if (in_array($node->getId(), $this->getCategoryIds())) {
48
+ $item['checked'] = true;
49
+ }
50
+
51
+ return $item;
52
+ }
53
+
54
+ public function getCategoryChildrenJson($categoryId)
55
+ {
56
+ $category = Mage::getModel('catalog/category')->load($categoryId);
57
+ $node = $this->getRoot($category, 1)->getTree()->getNodeById($categoryId);
58
+
59
+ if (!$node || !$node->hasChildren()) {
60
+ return '[]';
61
+ }
62
+
63
+ $children = array();
64
+ foreach ($node->getChildren() as $child) {
65
+ $children[] = $this->_getNodeJson($child);
66
+ }
67
+
68
+ return Mage::helper('core')->jsonEncode($children);
69
+ }
70
+
71
+ protected function getCategoryIds()
72
+ {
73
+ $data = $this->getJsonData();
74
+ return (isset($data) && isset($data['categories'])) ? $data['categories'] : Array();
75
+ }
76
+
77
+ public function getIdsString()
78
+ {
79
+ return implode(',', $this->getCategoryIds());
80
+ }
81
+
82
+ public function getProductflowId() {
83
+ $model = Mage::registry('productflow_data');
84
+ $id = null;
85
+ if($model) {
86
+ $id = $model->getData('flow_id');
87
+ }
88
+ return $id;
89
+ }
90
+
91
+ protected function getJsonData() {
92
+ if(!$this->json_data) {
93
+ $model = Mage::registry('productflow_data');
94
+ $this->json_data = (($model) ? Mage::helper('core')->jsonDecode($model->getData('json_data')) : null);
95
+ }
96
+ return $this->json_data;
97
+ }
98
+ }
app/code/local/Atol/Productfeedgenerator/Block/Adminhtml/Productflow/Grid.php ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * @category Atol
5
+ * @package Atol_Productfeedgenerator
6
+ * @copyright Copyright (c) 2013 Atol C&D (http://www.atolcd.com)
7
+ */
8
+ class Atol_Productfeedgenerator_Block_Adminhtml_Productflow_Grid extends Mage_Adminhtml_Block_Widget_Grid
9
+ {
10
+ public function __construct()
11
+ {
12
+ parent::__construct();
13
+ $this->setId('productfeedgeneratorGrid');
14
+ $this->setDefaultSort('type_id');
15
+ $this->setDefaultDir('DESC');
16
+ $this->setSaveParametersInSession(true);
17
+ }
18
+
19
+ protected function _prepareCollection()
20
+ {
21
+ $collection = Mage::getModel('productfeedgenerator/productflow')->getCollection()
22
+ ->addFieldToFilter('deleted_at', array('null' => true))
23
+ ->addOrder('flow_id',Varien_Data_Collection::SORT_ORDER_ASC);
24
+ $this->setCollection($collection);
25
+ return parent::_prepareCollection();
26
+ }
27
+
28
+ protected function _prepareColumns()
29
+ {
30
+ $this->addColumn('flow_id',
31
+ array(
32
+ 'header' => Mage::helper('productfeedgenerator')->__('ID'),
33
+ 'align' => 'right',
34
+ 'width' => '50px',
35
+ 'index' => 'flow_id',
36
+ ));
37
+ $this->addColumn('title',
38
+ array(
39
+ 'header' => Mage::helper('productfeedgenerator')->__('Title'),
40
+ 'align' => 'left',
41
+ 'index' => 'title',
42
+ ));
43
+ $this->addColumn('note',
44
+ array(
45
+ 'header' => Mage::helper('productfeedgenerator')->__('Comment'),
46
+ 'align' => 'left',
47
+ 'index' => 'note',
48
+ ));
49
+ $this->addColumn('links',
50
+ array(
51
+ 'header' => Mage::helper('productfeedgenerator')->__('Links'),
52
+ 'align' => 'left',
53
+ 'index' => 'flow_id',
54
+ 'renderer' => 'Atol_Productfeedgenerator_Block_Adminhtml_Productflow_Renderer_Linkscolumn'
55
+ ));
56
+ return parent::_prepareColumns();
57
+ }
58
+
59
+ public function getRowUrl($row)
60
+ {
61
+ return $this->getUrl('*/*/edit', array('id' => $row->getId()));
62
+ }
63
+ }
app/code/local/Atol/Productfeedgenerator/Block/Adminhtml/Productflow/Renderer/Linkscolumn.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * @category Atol
5
+ * @package Atol_Productfeedgenerator
6
+ * @copyright Copyright (c) 2013 Atol C&D (http://www.atolcd.com)
7
+ */
8
+ class Atol_Productfeedgenerator_Block_Adminhtml_Productflow_Renderer_Linkscolumn extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract {
9
+
10
+ public function render(Varien_Object $row)
11
+ {
12
+ $id = $row->getData($this->getColumn()->getIndex());
13
+ return '<a href="' . Mage::getUrl('productfeedgenerator_front/productflow/rss', array('id' => $id, '_store' => 1)) . '" target="_blank" class="rss_link" title="'.Mage::helper('productfeedgenerator')->__('RSS Feed').'"></a>';
14
+ }
15
+
16
+ }
app/code/local/Atol/Productfeedgenerator/Block/Frontdisplay.php ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Atol_Productfeedgenerator_Block_Frontdisplay
3
+ extends Mage_Catalog_Block_Product_List
4
+ implements Mage_Widget_Block_Interface
5
+ {
6
+
7
+ protected function _toHtml()
8
+ {
9
+ $columns = self::getData('columns');
10
+
11
+ $template = 'catalog/product/list.phtml';
12
+ /* Pour ne pas avoir le bug des puces apparantes dans la liste de produits, ajouter le code suivant dans Page/Design/Page Layout/Layout Update XML
13
+ * <reference name="content"><remove name="cms.wrapper" /><block type="core/template" name="home-content"
14
+ * template="test.phtml" /><block type="cms/page" name="cms_page"/></reference>
15
+ */
16
+
17
+ $this->setColumnCount($columns);
18
+ $this->setTemplate($template);
19
+
20
+ return parent::_toHtml();
21
+ }
22
+
23
+ protected function _getProductCollection()
24
+ {
25
+ $productFlowId = self::getData('flux_id');
26
+ $productFlow = Mage::getModel('productfeedgenerator/productflow')->load($productFlowId);
27
+ $json = $productFlow->getData('json_data');
28
+
29
+
30
+ $this->_productCollection = Mage::helper('productfeedgenerator')->getProductCollectionFromJson($json);
31
+
32
+ return $this->_productCollection;
33
+ }
34
+
35
+ }
app/code/local/Atol/Productfeedgenerator/Block/Productflow/Rss.php ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @category Atol
4
+ * @package Atol_Productfeedgenerator
5
+ * @copyright Copyright (c) 2013 Atol C&D (http://www.atolcd.com)
6
+ */
7
+
8
+ class Atol_Productfeedgenerator_Block_Productflow_Rss extends Mage_Rss_Block_Catalog_New
9
+ {
10
+ protected function _construct()
11
+ {
12
+ /*
13
+ * setting cache to save the rss for 10 minutes
14
+ */
15
+ $this->setCacheKey('rss_catalog_new_'.$this->_getStoreId());
16
+ $this->setCacheLifetime(600);
17
+ }
18
+
19
+ protected function _toHtml()
20
+ {
21
+ $productFlow = Mage::registry('product_flow');
22
+ if($productFlow) {
23
+ $rssObj = Mage::getModel('rss/rss');
24
+ $data = array('title' => Mage::helper('productfeedgenerator')->__('Products list from %s',$productFlow->getTitle()),
25
+ 'description' => $productFlow->getNote(),
26
+ 'link' => Mage::getUrl('productfeedgenerator/catalog/products'),
27
+ 'charset' => 'UTF-8',
28
+ 'language' => Mage::getStoreConfig('general/locale/code')
29
+ );
30
+ $rssObj->_addHeader($data);
31
+
32
+ $products = ($productFlow) ? Mage::helper('productfeedgenerator')->getProductCollectionFromJson($productFlow->getData('json_data')) : null;
33
+
34
+ $product = Mage::getModel('catalog/product');
35
+
36
+ Mage::getSingleton('core/resource_iterator')->walk(
37
+ $products->getSelect(),
38
+ array(array($this, 'addNewItemXmlCallback')),
39
+ array('rssObj'=> $rssObj, 'product'=> $product)
40
+ );
41
+
42
+ return $rssObj->createRssXml();
43
+ } else {
44
+ return '';
45
+ }
46
+ }
47
+
48
+ /**
49
+ * Preparing data and adding to rss object
50
+ *
51
+ * @param array $args
52
+ */
53
+ public function addNewItemXmlCallback($args)
54
+ {
55
+ $_coreHelper = Mage::helper('core');
56
+ $_taxHelper = Mage::helper('tax');
57
+
58
+ $product = $args['product'];
59
+ $product->setData($args['row']);
60
+
61
+ $_price = $_taxHelper->getPrice($product, $product->getPrice());
62
+ $_finalPrice = $_taxHelper->getPrice($product, $product->getData('product_final_price'));
63
+
64
+ $product->setAllowedInRss(true);
65
+ $product->setAllowedPriceInRss(false);
66
+ Mage::dispatchEvent('rss_catalog_new_xml_callback', $args);
67
+
68
+ if (!$product->getAllowedInRss()) {
69
+ //Skip adding product to RSS
70
+ return;
71
+ }
72
+ $url = Mage::getUrl('catalog/product/view',array("id" => $product->getId()));
73
+ $allowedPriceInRss = $product->getAllowedPriceInRss();
74
+
75
+
76
+ $description =
77
+ '<table>'.
78
+ '<tr>'.
79
+ '<td>'.
80
+ '<a href="'.$url.'">'.
81
+ '<img src="'. $this->helper('catalog/image')->init($product, 'thumbnail')->resize(75, 75).'" border="0" align="left" height="75" width="75">' .
82
+ '</a>'.
83
+ '</td>'.
84
+ '<td style="text-decoration:none;">'
85
+ . $product->getDescription() . '<br /><br />'
86
+ . $this->__('Price : ') . $_coreHelper->currency($_price,true,false) . '<br />'
87
+ . $this->__('Final price : ') . $_coreHelper->currency($_finalPrice,true,false) ;
88
+
89
+
90
+ if ($allowedPriceInRss) {
91
+ $description .= $this->getPriceHtml($product,true);
92
+ }
93
+
94
+ $description .=
95
+ '</td>'.
96
+ '</tr>'.
97
+ '</table>';
98
+
99
+ $rssObj = $args['rssObj'];
100
+ $data = array(
101
+ 'title' => $product->getName(),
102
+ 'link' => $url,
103
+ 'description' => $description,
104
+ );
105
+ $rssObj->_addEntry($data);
106
+ }
107
+ }
app/code/local/Atol/Productfeedgenerator/Helper/Data.php ADDED
@@ -0,0 +1,194 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * @category Atol
5
+ * @package Atol_Productfeedgenerator
6
+ * @copyright Copyright (c) 2013 Atol C&D (http://www.atolcd.com)
7
+ */
8
+ class Atol_Productfeedgenerator_Helper_Data extends Mage_Core_Helper_Abstract
9
+ {
10
+ /**
11
+ * Return all products concerned by all parameters
12
+ *
13
+ * @var $attributes array
14
+ * $attributes is an array containing the list of attributes to filter
15
+ * Each attribute is linked to an array containing the operator with the value
16
+ * If an attribute is not referenced in the $AUTHORIZED_ATTRIBUTES list, it will be ignored
17
+ * For example : $attributes = array("price" => array("eq" => 2.0))
18
+ * @var $filters array
19
+ * $filters indicates if discounted or new products should be considered by the query
20
+ * For example : $filters = array('new','discounted')
21
+ * @var $categoriesId array
22
+ * $categoriesId contains all categories id whose products belongs to
23
+ * For example : $categoriesId = [1, 5, 10, 70]
24
+ * @var $orders array
25
+ * $orders is an array indicating the orders of the data flow
26
+ * For example, $orders = array(array('attribute' => 'price', 'direction' => 'desc'), array('attribute' => 'name', 'direction' => 'asc'))
27
+ * @var $limit
28
+ * $limit indicates the number of products returned by the query
29
+ */
30
+ public function getProductCollection(Array $attributes, Array $filters = null, $categoriesId = null, Array $orders = null, $limit = null) {
31
+ $product = Mage::getModel('catalog/product');
32
+
33
+ $products = $product->getCollection()
34
+ ->setStoreId(Mage::app()->getStore()->getId())
35
+ ->addStoreFilter()
36
+ ->addAttributeToFilter('visibility', 4)
37
+ ->addAttributeToSelect(array('name', 'short_description', 'description', 'thumbnail'), 'inner')
38
+ ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
39
+ ->addAttributeToSelect(
40
+ array(
41
+ 'price', 'special_price', 'special_from_date', 'special_to_date', 'news_from_date', 'news_to_date',
42
+ 'msrp_enabled', 'msrp_display_actual_price_type', 'msrp'
43
+ ),
44
+ 'left'
45
+ )
46
+ ;
47
+ $products->getSelect()
48
+ ->join('catalog_product_index_price','e.entity_id = catalog_product_index_price.entity_id', array('product_price' => 'price', 'product_final_price' => 'final_price'))
49
+ ->where('catalog_product_index_price.customer_group_id = 0')
50
+ ->group('e.entity_id');
51
+
52
+
53
+ if($filters) {
54
+ $todayDate = $product->getResource()->formatDate(time());
55
+ foreach($filters as $filter){
56
+ switch($filter) {
57
+ case 'discounted' :
58
+ $products->addPriceDataFieldFilter('%s < %s', array('special_price','price'));
59
+ $products->addAttributeToFilter('special_from_date', array('date'=>true, 'to'=> $todayDate))
60
+ ->addAttributeToFilter(
61
+ array(
62
+ array('attribute'=>'special_to_date', 'date'=>true, 'from'=>$todayDate),
63
+ array('attribute'=>'special_to_date', 'is' => new Zend_Db_Expr('null'))
64
+ ),
65
+ '',
66
+ 'left'
67
+ );
68
+ break;
69
+ case 'new' :
70
+ $products->addAttributeToFilter('news_from_date', array('date'=>true, 'to'=> $todayDate))
71
+ ->addAttributeToFilter(
72
+ array(
73
+ array('attribute'=>'news_to_date', 'date'=>true, 'from'=>$todayDate),
74
+ array('attribute'=>'news_to_date', 'is' => new Zend_Db_Expr('null'))
75
+ ),
76
+ '',
77
+ 'left'
78
+ )
79
+ ->addAttributeToSort('news_from_date','desc');
80
+ break;
81
+ default :
82
+ break;
83
+ }
84
+ }
85
+ }
86
+
87
+ if($categoriesId) {
88
+ $cats = implode(',', $categoriesId);
89
+ $products->joinTable('catalog/category_product', 'product_id=entity_id', array('product_id' => 'product_id') , '{{table}}.category_id IN ( '. $cats .' )' );
90
+ }
91
+
92
+ foreach($attributes as $attribute) {
93
+ $attributeCode = $attribute['attribute_code'];
94
+ $expr = $attribute['expr'];
95
+ $products->addAttributeToFilter($attributeCode, $expr);
96
+ }
97
+
98
+ if($limit) {
99
+ $products->getSelect()->limit($limit, 0);
100
+ }
101
+
102
+ if($orders) {
103
+ foreach($orders as $orderby) {
104
+ if(isset($orderby['attribute']) && $orderby['attribute'] && isset($orderby['direction'])) {
105
+ $products->getSelect()->order($orderby['attribute'], $orderby['direction']);
106
+ }
107
+ }
108
+ }
109
+
110
+ return $products;
111
+ }
112
+
113
+ public function getProductCollectionFromJson($json) {
114
+ try {
115
+ $data = Mage::helper('core')->jsonDecode($json);
116
+ } catch(Exception $e) {
117
+ Mage::logException($e);
118
+ return null;
119
+ }
120
+
121
+ if($data && isset($data['attributes']) && isset($data['categories']) && isset($data['filters']) && isset($data['others'])) {
122
+ $attributes = $data['attributes'];
123
+ $attributesQuery = Array();
124
+ foreach($attributes as $attribute) {
125
+ $attributeModel = Mage::getModel('eav/entity_attribute')->load($attribute['id']);
126
+ $attributeCode = $attributeModel->getData('attribute_code');
127
+ if($attributeCode && isset($attribute['operator']) && isset($attribute['values']) && count($attribute['values']) > 0) {
128
+ $expr = null;
129
+ switch($attribute['operator']) {
130
+ case 'or' :
131
+ $attributesQuery[] = array("attribute_code" => $attributeCode, "expr" => array('in' => $attribute['values']));
132
+ break;
133
+ case 'one' :
134
+ foreach($attribute['values'] as $value) {
135
+ $expr[] = array('finset' => $value);
136
+ }
137
+ $attributesQuery[] = array("attribute_code" => $attributeCode, "expr" => $expr);
138
+ break;
139
+ case 'all' :
140
+ foreach($attribute['values'] as $value) {
141
+ $attributesQuery[] = array("attribute_code" => $attributeCode, "expr" => array('finset' => $value));
142
+ }
143
+ break;
144
+ case 'eq' :
145
+ case 'neq' :
146
+ default :
147
+ $attributesQuery[] = array("attribute_code" => $attributeCode, "expr" => array($attribute['operator'] => $attribute['values'][0]));
148
+ }
149
+ }
150
+ }
151
+
152
+ $filters = $data['filters'];
153
+ $filtersQuery = Array();
154
+ foreach($filters as $key => $value) {
155
+ if($value) {
156
+ $filtersQuery[] = $key;
157
+ }
158
+ }
159
+
160
+ $categoriesId = $data['categories'];
161
+ $categoriesQuery = Array();
162
+ foreach($categoriesId as $categoryId) {
163
+ if($categoryId && !in_array($categoryId, $categoriesQuery)) {
164
+ $categoriesQuery[] = $categoryId;
165
+ }
166
+ }
167
+
168
+ $orderQueryTmp = $data['orderBy'];
169
+ $orderQuery = Array();
170
+ foreach($orderQueryTmp as $orderBy) {
171
+ if(isset($orderBy['attribute']) && isset($orderBy['direction']) && ($orderBy['direction'] == 'asc' || $orderBy['direction'] == 'desc')) {
172
+ $orderQuery[] = $orderBy;
173
+ }
174
+ }
175
+
176
+ $limitQuery = null;
177
+ if(isset($data['others']['limit'])) {
178
+ $limitQuery = $data['others']['limit'];
179
+ }
180
+
181
+ return $this->getProductCollection($attributesQuery, $filtersQuery, $categoriesQuery, $orderQuery, $limitQuery);
182
+ } else {
183
+ return null;
184
+ }
185
+ }
186
+
187
+ public function getProductCollectionFromId()
188
+ {
189
+ $id = Mage::app()->getRequest()->getParam('id');
190
+ $productFlow = Mage::getModel('productfeedgenerator/productflow')->load($id);
191
+ $json = $productFlow->getData('json_data');
192
+ return $this->getProductCollectionFromJson($json);
193
+ }
194
+ }
app/code/local/Atol/Productfeedgenerator/Model/Mysql4/Productflow.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * @category Atol
5
+ * @package Atol_Productfeedgenerator
6
+ * @copyright Copyright (c) 2013 Atol C&D (http://www.atolcd.com)
7
+ */
8
+ class Atol_Productfeedgenerator_Model_Mysql4_Productflow extends Mage_Core_Model_Mysql4_Abstract
9
+ {
10
+ public function _construct()
11
+ {
12
+ $this->_init('productfeedgenerator/productflow', 'flow_id');
13
+ }
14
+ }
app/code/local/Atol/Productfeedgenerator/Model/Mysql4/Productflow/Collection.php ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * @category Atol
5
+ * @package Atol_Productfeedgenerator
6
+ * @copyright Copyright (c) 2013 Atol C&D (http://www.atolcd.com)
7
+ */
8
+ class Atol_Productfeedgenerator_Model_Mysql4_Productflow_Collection extends Mage_Core_Model_Mysql4_Collection_Abstract
9
+ {
10
+ public function _construct()
11
+ {
12
+ parent::_construct();
13
+ $this->_init('productfeedgenerator/productflow');
14
+ }
15
+ }
app/code/local/Atol/Productfeedgenerator/Model/Productflow.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * @category Atol
5
+ * @package Atol_Productfeedgenerator
6
+ * @copyright Copyright (c) 2013 Atol C&D (http://www.atolcd.com)
7
+ */
8
+ class Atol_Productfeedgenerator_Model_Productflow extends Mage_Core_Model_Abstract
9
+ {
10
+ protected $_attributes;
11
+ protected $_filters;
12
+ protected $_categories;
13
+ protected $_limit;
14
+ protected $_order;
15
+
16
+ public function _construct()
17
+ {
18
+ parent::_construct();
19
+ $this->_init('productfeedgenerator/productflow');
20
+ }
21
+
22
+ public function getAttributes() {
23
+ return $_attributes;
24
+ }
25
+
26
+ public function getSpecial() {
27
+ return $_filters;
28
+ }
29
+
30
+ public function getCategories() {
31
+ return $_categories;
32
+ }
33
+
34
+ public function getOrder() {
35
+ return $_order;
36
+ }
37
+
38
+ public function getLimit() {
39
+ return $_limit;
40
+ }
41
+ }
app/code/local/Atol/Productfeedgenerator/Model/System/Config/Source/Orderbytype.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * @category Atol
5
+ * @package Atol_Quotationplus
6
+ * @copyright Copyright (c) 2012 Atol C&D (http://www.atolcd.com)
7
+ */
8
+ class Atol_Productfeedgenerator_Model_System_Config_Source_Orderbytype
9
+ {
10
+ /**
11
+ * Options getter
12
+ *
13
+ * @return array
14
+ */
15
+ public function toOptionArray()
16
+ {
17
+ return array(
18
+ array(
19
+ "value" => 0,
20
+ "label" => Mage::helper('productfeedgenerator')->__('No order')
21
+ ),
22
+ array(
23
+ "value" => "product_final_price", //final_price attribute is renamed in the query
24
+ "label" => Mage::helper('productfeedgenerator')->__('Price')
25
+ ),
26
+ array(
27
+ "value" => "name",
28
+ "label" => Mage::helper('productfeedgenerator')->__('Name')
29
+ ),
30
+ array(
31
+ "value" => "news_from_date",
32
+ "label" => Mage::helper('productfeedgenerator')->__('News from date')
33
+ ),
34
+ array(
35
+ "value" => "news_to_date",
36
+ "label" => Mage::helper('productfeedgenerator')->__('News to date')
37
+ )
38
+ );
39
+ }
40
+
41
+ }
app/code/local/Atol/Productfeedgenerator/Model/System/Config/Source/Productflowtype.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * @category Atol
5
+ * @package Atol_Quotationplus
6
+ * @copyright Copyright (c) 2012 Atol C&D (http://www.atolcd.com)
7
+ */
8
+ class Atol_Productfeedgenerator_Model_System_Config_Source_Productflowtype
9
+ {
10
+ /**
11
+ * Options getter
12
+ *
13
+ * @return array
14
+ */
15
+ public function toOptionArray()
16
+ {
17
+ $collection = Mage::getModel('productfeedgenerator/productflow')->getCollection()
18
+ ->addFieldToFilter('deleted_at', array('null' => true))
19
+ ->addOrder('flow_id',Varien_Data_Collection::SORT_ORDER_ASC);
20
+
21
+ $options = array_map(
22
+ function($pf) {
23
+ return array(
24
+ "value" => $pf->getData('flow_id'),
25
+ "label" => $pf->getTitle()
26
+ );
27
+ },
28
+ iterator_to_array($collection->getIterator())
29
+ );
30
+
31
+ return $options;
32
+ }
33
+
34
+ }
app/code/local/Atol/Productfeedgenerator/controllers/Adminhtml/ProductflowController.php ADDED
@@ -0,0 +1,183 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * @category Atol
5
+ * @package Atol_Quotationplus
6
+ * @copyright Copyright (c) 2012 Atol C&D (http://www.atolcd.com)
7
+ */
8
+ class Atol_Productfeedgenerator_Adminhtml_ProductflowController extends Mage_Adminhtml_Controller_Action
9
+ {
10
+ protected function _initAction() {
11
+ $this->loadLayout()
12
+ ->_setActiveMenu('catalog/productflow')
13
+ ->_addBreadcrumb(Mage::helper('productfeedgenerator')->__('Product flow Manager'), Mage::helper('productfeedgenerator')->__('Product flow Manager'));
14
+
15
+ return $this;
16
+ }
17
+
18
+ public function indexAction() {
19
+ $this->_initAction()
20
+ ->renderLayout();
21
+ }
22
+
23
+ public function editAction() {
24
+ $id = $this->getRequest()->getParam('id', null);
25
+ $model = Mage::getModel('productfeedgenerator/productflow');
26
+ if ($id) {
27
+ $model->load((int) $id);
28
+ if (!$model->getId()) {
29
+ Mage::getSingleton('adminhtml/session')->addError(Mage::helper('productfeedgenerator')->__('The product flow does not exist'));
30
+ $this->_redirect('*/*/');
31
+ }
32
+ }
33
+ Mage::register('productflow_data', $model);
34
+
35
+ $this->loadLayout();
36
+ $this->getLayout()->getBlock('head')->setCanLoadExtJs(true);
37
+ $this->renderLayout();
38
+ }
39
+
40
+ public function newAction() {
41
+ $this->_forward('edit');
42
+ }
43
+
44
+ public function saveAction() {
45
+ if ($this->getRequest()->isPost() && $this->getRequest()->isXmlHttpRequest()) {
46
+ $request = $this->getRequest();
47
+ $id = $request->getPost('id');
48
+ $name = Mage::helper('core')->escapeHtml($request->getPost('name'));
49
+ $comment = Mage::helper('core')->escapeHtml($request->getPost('comment'));
50
+ $data = Mage::helper('core')->jsonDecode($request->getPost('data'));
51
+
52
+
53
+ if($name && $data && isset($data['attributes']) && isset($data['categories']) && isset($data['filters']) && isset($data['others'])) {
54
+ try {
55
+ $now = date('Y-M-d H:i:s');
56
+ $productFlow = Mage::getModel('productfeedgenerator/productflow');
57
+ if($id) {
58
+ $productFlow = $productFlow->load($id);
59
+ } else {
60
+ $productFlow->setData('created_at', $now);
61
+ }
62
+ $productFlow->setData('title', $name);
63
+ $productFlow->setData('note', $comment);
64
+ $productFlow->setData('json_data', $request->getPost('data'));
65
+ $productFlow->setData('updated_at', $now);
66
+
67
+ $productFlow->save();
68
+
69
+ Mage::getSingleton('adminhtml/session')->addSuccess(Mage::helper('productfeedgenerator')->__('The product flow was successfully updated'));
70
+ return $this->getResponse()->setBody(Mage::helper('core')->jsonEncode(array("success" => Mage::helper('productfeedgenerator')->__('The product flow was successfully updated'))));
71
+ } catch(Exception $e) {
72
+ return $this->getResponse()->setBody(Mage::helper('core')->jsonEncode(array("error" => $e->getMessage())));
73
+ }
74
+ } else {
75
+ return $this->getResponse()->setBody(Mage::helper('core')->jsonEncode(array("error" => Mage::helper('productfeedgenerator')->__('Invalid data'))));
76
+ }
77
+ } else {
78
+ return $this->getResponse()->setHeader('HTTP/1.1','404 Not Found');
79
+ }
80
+ }
81
+
82
+ public function deleteAction() {
83
+ if ($this->getRequest()->isPost() && $this->getRequest()->isXmlHttpRequest()) {
84
+ $id = $this->getRequest()->getPost('id');
85
+ if( $id > 0 ) {
86
+ try {
87
+ $productFlow = Mage::getModel('productfeedgenerator/productflow')->load($id);
88
+
89
+ $now = date('Y-M-d H:i:s');
90
+ $productFlow->setData('deleted_at', $now);
91
+ $productFlow->setData('updated_at', $now);
92
+
93
+ $productFlow->save();
94
+
95
+ Mage::getSingleton('adminhtml/session')->addSuccess(Mage::helper('productfeedgenerator')->__('The product flow was successfully deleted'));
96
+ return $this->getResponse()->setBody(Mage::helper('core')->jsonEncode(array("success" => Mage::helper('productfeedgenerator')->__('The product flow was successfully deleted'))));
97
+ } catch(Exception $e) {
98
+ return $this->getResponse()->setBody(Mage::helper('core')->jsonEncode(array("error" => $e->getMessage())));
99
+ }
100
+ } else {
101
+ return $this->getResponse()->setBody(Mage::helper('core')->jsonEncode(array("error" => Mage::helper('productfeedgenerator')->__('Invalid data'))));
102
+ }
103
+ } else {
104
+ return $this->getResponse()->setHeader('HTTP/1.1','404 Not Found');
105
+ }
106
+ }
107
+
108
+ public function testAction() {
109
+ if ($this->getRequest()->isPost() && $this->getRequest()->isXmlHttpRequest()) {
110
+ $request = $this->getRequest();
111
+ $collection = Mage::helper('productfeedgenerator')->getProductCollectionFromJson($request->getPost('data'));
112
+
113
+ if($collection) {
114
+ return $this->getResponse()->setBody(Mage::helper('core')->jsonEncode(array('count' => $collection->count())));
115
+ } else {
116
+ return $this->getResponse()->setBody(Mage::helper('core')->jsonEncode(array('error' => Mage::helper('productfeedgenerator')->__('Invalid data'))));
117
+ }
118
+ } else {
119
+ return $this->getResponse()->setHeader('HTTP/1.1','404 Not Found');
120
+ }
121
+ }
122
+
123
+ /**
124
+ * Initialize requested category and put it into registry.
125
+ * Root category can be returned, if inappropriate store/category is specified
126
+ *
127
+ * @param bool $getRootInstead
128
+ * @return Mage_Catalog_Model_Category
129
+ */
130
+ protected function _initCategory($getRootInstead = false)
131
+ {
132
+ $this->_title($this->__('Catalog'))
133
+ ->_title($this->__('Categories'))
134
+ ->_title($this->__('Manage Categories'));
135
+
136
+ $categoryId = (int) $this->getRequest()->getParam('id',false);
137
+ $storeId = (int) $this->getRequest()->getParam('store');
138
+ $category = Mage::getModel('catalog/category');
139
+ $category->setStoreId($storeId);
140
+
141
+ if ($categoryId) {
142
+ $category->load($categoryId);
143
+ if ($storeId) {
144
+ $rootId = Mage::app()->getStore($storeId)->getRootCategoryId();
145
+ if (!in_array($rootId, $category->getPathIds())) {
146
+ // load root category instead wrong one
147
+ if ($getRootInstead) {
148
+ $category->load($rootId);
149
+ }
150
+ else {
151
+ $this->_redirect('*/*/', array('_current'=>true, 'id'=>null));
152
+ return false;
153
+ }
154
+ }
155
+ }
156
+ }
157
+
158
+ if ($activeTabId = (string) $this->getRequest()->getParam('active_tab_id')) {
159
+ Mage::getSingleton('admin/session')->setActiveTabId($activeTabId);
160
+ }
161
+
162
+ Mage::register('category', $category);
163
+ Mage::register('current_category', $category);
164
+ Mage::getSingleton('cms/wysiwyg_config')->setStoreId($this->getRequest()->getParam('store'));
165
+ return $category;
166
+ }
167
+
168
+ /**
169
+ * Get tree node (Ajax version)
170
+ */
171
+ public function categoriesJsonAction()
172
+ {
173
+ $productFlowId = (int) $this->getRequest()->getPost('productflow',false);
174
+ if($productFlowId) {
175
+ $productFlow = Mage::getModel('productfeedgenerator/productflow')->load($productFlowId);
176
+ Mage::register('productflow_data',$productFlow);
177
+ }
178
+ $this->getResponse()->setBody(
179
+ $this->getLayout()->createBlock('productfeedgenerator/adminhtml_productflow_edit_categories')
180
+ ->getCategoryChildrenJson($this->getRequest()->getParam('category'))
181
+ );
182
+ }
183
+ }
app/code/local/Atol/Productfeedgenerator/controllers/IndexController.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Marko Martinović
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Open Software License (OSL 3.0)
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to license@magentocommerce.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Please do not edit or add to this file if you wish to upgrade
18
+ * Magento or this extension to newer versions in the future.
19
+ * I give my best to conform to "non-obtrusive, best Magento practices"
20
+ * style of coding. However, I do not guarantee functional accuracy of specific
21
+ * extension behavior.Additionally Itake no responsibility for any possible
22
+ * issue(s) resulting from extension usage. I reserve the full right not to
23
+ * provide any kind of support for my free code. Thank you for your understanding.
24
+ *
25
+ * @category Mmartinovic
26
+ * @package Productlist
27
+ * @author Marko Martinović <marko.martinovic@inchoo.net>
28
+ * @copyright Copyright (c) Marko Martinović (http://www.techytalk.info/)
29
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
30
+ */
31
+
32
+ class Atol_Productfeedgenerator_IndexController extends Mage_Core_Controller_Front_Action
33
+ {
34
+
35
+ public function indexAction()
36
+ {
37
+ $this->loadLayout();
38
+ $this->renderLayout();
39
+ }
40
+
41
+ }
app/code/local/Atol/Productfeedgenerator/controllers/ProductflowController.php ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @category Atol
4
+ * @package Atol_Productfeedgenerator
5
+ * @copyright Copyright (c) 2013 Atol C&D (http://www.atolcd.com)
6
+ */
7
+
8
+ class Atol_Productfeedgenerator_ProductflowController extends Mage_Core_Controller_Front_Action {
9
+
10
+ protected function isFeedEnable()
11
+ {
12
+ return Mage::getStoreConfig('rss/productfeedgenerator/active');
13
+ }
14
+
15
+ protected function checkFeedEnable()
16
+ {
17
+ if ($this->isFeedEnable()) {
18
+ $this->getResponse()->setHeader('Content-type', 'text/xml; charset=UTF-8');
19
+ return true;
20
+ } else {
21
+ return $this->getResponse()->setHeader('HTTP/1.1','403 Forbidden');
22
+ }
23
+ }
24
+
25
+ public function rssAction() {
26
+ $productFlowId = (int) $this->getRequest()->getParam('id',false);
27
+ if($productFlowId) {
28
+ $productFlow = Mage::getModel('productfeedgenerator/productflow')->load($productFlowId);
29
+
30
+ if($productFlow && $productFlow->getData('flow_id') && !$productFlow->getData('deleted_at')) {
31
+ Mage::register('product_flow', $productFlow);
32
+ $this->checkFeedEnable();
33
+ //$this->checkSecurity();
34
+ $this->loadLayout(false);
35
+ $this->renderLayout();
36
+ } else {
37
+ return $this->getResponse()->setHeader('HTTP/1.1','404 Not Found');
38
+ }
39
+ } else {
40
+ return $this->getResponse()->setHeader('HTTP/1.1','404 Not Found');
41
+ }
42
+ }
43
+ }
app/code/local/Atol/Productfeedgenerator/etc/adminhtml.xml ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <menu>
4
+ <catalog>
5
+ <children>
6
+ <productflow module="productfeedgenerator">
7
+ <title>Product flow</title>
8
+ <sort_order>10</sort_order>
9
+ <action>adminhtml/productflow</action>
10
+ </productflow>
11
+ </children>
12
+ </catalog>
13
+ </menu>
14
+ <layout>
15
+ <updates>
16
+ <productfeedgenerator>
17
+ <file>productfeedgenerator.xml</file>
18
+ </productfeedgenerator>
19
+ </updates>
20
+ </layout>
21
+ <acl>
22
+ <resources>
23
+ <admin translate="title" module="productfeedgenerator">
24
+ <children>
25
+ <catalog>
26
+ <children>
27
+ <productflow module="productfeedgenerator">
28
+ <title>Product flow</title>
29
+ </productflow>
30
+ </children>
31
+ </catalog>
32
+ </children>
33
+ </admin>
34
+ </resources>
35
+ </acl>
36
+ </config>
app/code/local/Atol/Productfeedgenerator/etc/config.xml ADDED
@@ -0,0 +1,119 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <modules>
4
+ <Atol_Productfeedgenerator>
5
+ <version>0.1.0</version>
6
+ </Atol_Productfeedgenerator>
7
+ </modules>
8
+ <frontend>
9
+ <routers>
10
+ <productfeedgenerator>
11
+ <use>standard</use>
12
+ <args>
13
+ <module>Atol_Productfeedgenerator</module>
14
+ <frontName>productfeedgenerator_front</frontName>
15
+ </args>
16
+ </productfeedgenerator>
17
+ </routers>
18
+ <layout>
19
+ <updates>
20
+ <productfeedgenerator module="Atol_Productfeedgenerator">
21
+ <file>productfeedgenerator.xml</file>
22
+ </productfeedgenerator>
23
+ </updates>
24
+ </layout>
25
+ <translate>
26
+ <modules>
27
+ <Atol_Productfeedgenerator>
28
+ <files>
29
+ <default>Atol_Productfeedgenerator.csv</default>
30
+ </files>
31
+ </Atol_Productfeedgenerator>
32
+ </modules>
33
+ </translate>
34
+ </frontend>
35
+ <admin>
36
+ <routers>
37
+ <adminhtml>
38
+ <args>
39
+ <modules>
40
+ <atol_productfeedgenerator before="Mage_Adminhtml">Atol_Productfeedgenerator_Adminhtml</atol_productfeedgenerator>
41
+ </modules>
42
+ </args>
43
+ </adminhtml>
44
+ </routers>
45
+ </admin>
46
+ <adminhtml>
47
+ <layout>
48
+ <updates>
49
+ <productfeedgenerator>
50
+ <file>productfeedgenerator.xml</file>
51
+ </productfeedgenerator>
52
+ </updates>
53
+ </layout>
54
+
55
+ <translate>
56
+ <modules>
57
+ <Atol_Productfeedgenerator>
58
+ <files>
59
+ <default>Atol_Productfeedgenerator.csv</default>
60
+ </files>
61
+ </Atol_Productfeedgenerator>
62
+ </modules>
63
+ </translate>
64
+ </adminhtml>
65
+ <global>
66
+ <blocks>
67
+ <productfeedgenerator>
68
+ <class>Atol_Productfeedgenerator_Block</class>
69
+ </productfeedgenerator>
70
+ </blocks>
71
+ <models>
72
+ <productfeedgenerator>
73
+ <class>Atol_Productfeedgenerator_Model</class>
74
+ <resourceModel>productfeedgenerator_mysql4</resourceModel>
75
+ </productfeedgenerator>
76
+ <productfeedgenerator_mysql4>
77
+ <class>Atol_Productfeedgenerator_Model_Mysql4</class>
78
+ <entities>
79
+ <productflow>
80
+ <table>productflow</table>
81
+ </productflow>
82
+ </entities>
83
+ </productfeedgenerator_mysql4>
84
+ </models>
85
+ <resources>
86
+ <productfeedgenerator_setup>
87
+ <setup>
88
+ <module>Atol_Productfeedgenerator</module>
89
+ <class>Mage_Customer_Model_Entity_Setup</class>
90
+ </setup>
91
+ <connection>
92
+ <use>core_setup</use>
93
+ </connection>
94
+ </productfeedgenerator_setup>
95
+ <productfeedgenerator_write>
96
+ <connection>
97
+ <use>core_write</use>
98
+ </connection>
99
+ </productfeedgenerator_write>
100
+ <productfeedgenerator_read>
101
+ <connection>
102
+ <use>core_read</use>
103
+ </connection>
104
+ </productfeedgenerator_read>
105
+ </resources>
106
+ <helpers>
107
+ <productfeedgenerator>
108
+ <class>Atol_Productfeedgenerator_Helper</class>
109
+ </productfeedgenerator>
110
+ </helpers>
111
+ </global>
112
+ <default>
113
+ <rss>
114
+ <productfeedgenerator>
115
+ <active>0</active>
116
+ </productfeedgenerator>
117
+ </rss>
118
+ </default>
119
+ </config>
app/code/local/Atol/Productfeedgenerator/etc/system.xml ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * Magento
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the Academic Free License (AFL 3.0)
9
+ * that is bundled with this package in the file LICENSE_AFL.txt.
10
+ * It is also available through the world-wide-web at this URL:
11
+ * http://opensource.org/licenses/afl-3.0.php
12
+ * If you did not receive a copy of the license and are unable to
13
+ * obtain it through the world-wide-web, please send an email
14
+ * to license@magentocommerce.com so we can send you a copy immediately.
15
+ *
16
+ * DISCLAIMER
17
+ *
18
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
19
+ * versions in the future. If you wish to customize Magento for your
20
+ * needs please refer to http://www.magentocommerce.com for more information.
21
+ *
22
+ * @category Mage
23
+ * @package Mage_Rss
24
+ * @copyright Copyright (c) 2011 Magento Inc. (http://www.magentocommerce.com)
25
+ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
26
+ */
27
+ -->
28
+ <config>
29
+ <sections>
30
+ <rss translate="label" module="rss">
31
+ <groups>
32
+ <productfeedgenerator translate="label">
33
+ <label>Generic RSS for products</label>
34
+ <frontend_type>text</frontend_type>
35
+ <sort_order>5</sort_order>
36
+ <show_in_default>1</show_in_default>
37
+ <show_in_website>1</show_in_website>
38
+ <show_in_store>1</show_in_store>
39
+ <fields>
40
+ <active translate="label">
41
+ <label>Enable RSS</label>
42
+ <frontend_type>select</frontend_type>
43
+ <source_model>adminhtml/system_config_source_enabledisable</source_model>
44
+ <sort_order>1</sort_order>
45
+ <show_in_default>1</show_in_default>
46
+ <show_in_website>1</show_in_website>
47
+ <show_in_store>1</show_in_store>
48
+ </active>
49
+ </fields>
50
+ </productfeedgenerator>
51
+ </groups>
52
+ </rss>
53
+ </sections>
54
+ </config>
app/code/local/Atol/Productfeedgenerator/etc/widget.xml ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <widgets>
3
+ <frontdisplay type="productfeedgenerator/frontdisplay">
4
+ <name>Flux de Produits</name>
5
+ <description type="desc">Flux de produits configurable</description>
6
+ <parameters>
7
+ <flux_id>
8
+ <label>Link Options</label>
9
+ <visible>1</visible>
10
+ <required>1</required>
11
+ <type>select</type>
12
+ <source_model>productfeedgenerator/system_config_source_productflowtype</source_model>
13
+ </flux_id>
14
+ <columns>
15
+ <required>0</required>
16
+ <visible>1</visible>
17
+ <label>Nombre de colonnes</label>
18
+ <type>select</type>
19
+ <values>
20
+ <list translate="label">
21
+ <value>3</value>
22
+ <label>3</label>
23
+ </list>
24
+ <list translate="label">
25
+ <value>4</value>
26
+ <label>4</label>
27
+ </list>
28
+ <default translate="label">
29
+ <value>5</value>
30
+ <label>5</label>
31
+ </default>
32
+ </values>
33
+ </columns>
34
+ </parameters>
35
+ </frontdisplay>
36
+ </widgets>
app/code/local/Atol/Productfeedgenerator/sql/productfeedgenerator_setup/mysql4-install-0.1.0.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @category Atol
4
+ * @package Atol_Productfeedgenerator
5
+ * @copyright Copyright (c) 2013 Atol C&D (http://www.atolcd.com)
6
+ */
7
+
8
+ $this->startSetup();
9
+
10
+ $this->run("
11
+ DROP TABLE IF EXISTS {$this->getTable('productflow')};
12
+ CREATE TABLE {$this->getTable('productflow')} (
13
+ `flow_id` int(11) unsigned NOT NULL auto_increment,
14
+ `title` varchar(255) NOT NULL default '',
15
+ `note` text,
16
+ `json_data` text,
17
+ `created_at` datetime NOT NULL,
18
+ `updated_at` datetime NOT NULL,
19
+ `deleted_at` datetime,
20
+ PRIMARY KEY (`flow_id`)
21
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
22
+ ");
23
+
24
+ $this->endSetup();
app/etc/modules/Atol_Productfeedgenerator.xml ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <modules>
4
+ <Atol_Productfeedgenerator>
5
+ <active>true</active>
6
+ <codePool>local</codePool>
7
+ <depends>
8
+ <Mage_Cms />
9
+ </depends>
10
+ </Atol_Productfeedgenerator>
11
+ </modules>
12
+ </config>
app/locale/fr_FR/Atol_Productfeedgenerator.csv ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "Add an attribute to filter","Ajouter un attribut à filtrer"
2
+ "all of them operator","égal à toutes les valeurs sélectionnées"
3
+ "asc","Tri ascendant"
4
+ "at least one of them operator","au minimum égal à une des valeurs sélectionnées"
5
+ "Attribute filters","Filtre sur les attributs"
6
+ "Attribute list","Liste des attributs filtrés"
7
+ "Category filters","Filtre sur les catégories"
8
+ "Collection management","Gestion de la liste"
9
+ "Comment :","Commentaires :"
10
+ "desc","Tri descendant"
11
+ "equal operator","égal à"
12
+ "Filter only discounted products ?","Filtre sur les produits en promotion"
13
+ "Filter only new products ?","Filtre sur les nouveaux produits"
14
+ "General informations","Informations générales"
15
+ "Generic RSS for products","RSS des flux de produits"
16
+ "Invalid data","Données invalides"
17
+ "Limit :","Limite :"
18
+ "Name :","Nom :"
19
+ "News from date","Date de début de nouvauté"
20
+ "News to date","Date de fin de nouvauté"
21
+ "No order","Pas d'ordre"
22
+ "not equal operator","différent de"
23
+ "or operator","égal à une des valeurs sélectionnées"
24
+ "Order %s :","Tri n°%s :"
25
+ "Other filters","Filtres spéciaux"
26
+ "Product flow","Flux de produits"
27
+ "Product flow edition","Edition d'un flux de produits"
28
+ "Product flow management","Gestion des flux de produits"
29
+ "Products list from %s","Liste de produits depuis %s"
30
+ "Server error","Erreur interne du serveur"
31
+ "The product flow does not exist","Le flux de produits recherché n'existe pas"
32
+ "The product flow was successfully deleted","Le flux de produits a été supprimé avec succès."
33
+ "The product flow was successfully updated","Le flux de produits a été mis à jour avec succès."
js/jquery/jquery-1.4.4.min.js ADDED
@@ -0,0 +1,168 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * jQuery JavaScript Library v1.4.4
3
+ * http://jquery.com/
4
+ *
5
+ * Copyright 2010, John Resig
6
+ * Dual licensed under the MIT or GPL Version 2 licenses.
7
+ * http://jquery.org/license
8
+ *
9
+ * Includes Sizzle.js
10
+ * http://sizzlejs.com/
11
+ * Copyright 2010, The Dojo Foundation
12
+ * Released under the MIT, BSD, and GPL Licenses.
13
+ *
14
+ * Date: Thu Nov 11 19:04:53 2010 -0500
15
+ */
16
+ (function(E,B){function ka(a,b,d){if(d===B&&a.nodeType===1){d=a.getAttribute("data-"+b);if(typeof d==="string"){try{d=d==="true"?true:d==="false"?false:d==="null"?null:!c.isNaN(d)?parseFloat(d):Ja.test(d)?c.parseJSON(d):d}catch(e){}c.data(a,b,d)}else d=B}return d}function U(){return false}function ca(){return true}function la(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ka(a){var b,d,e,f,h,l,k,o,x,r,A,C=[];f=[];h=c.data(this,this.nodeType?"events":"__events__");if(typeof h==="function")h=
17
+ h.events;if(!(a.liveFired===this||!h||!h.live||a.button&&a.type==="click")){if(a.namespace)A=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var J=h.live.slice(0);for(k=0;k<J.length;k++){h=J[k];h.origType.replace(X,"")===a.type?f.push(h.selector):J.splice(k--,1)}f=c(a.target).closest(f,a.currentTarget);o=0;for(x=f.length;o<x;o++){r=f[o];for(k=0;k<J.length;k++){h=J[k];if(r.selector===h.selector&&(!A||A.test(h.namespace))){l=r.elem;e=null;if(h.preType==="mouseenter"||
18
+ h.preType==="mouseleave"){a.type=h.preType;e=c(a.relatedTarget).closest(h.selector)[0]}if(!e||e!==l)C.push({elem:l,handleObj:h,level:r.level})}}}o=0;for(x=C.length;o<x;o++){f=C[o];if(d&&f.level>d)break;a.currentTarget=f.elem;a.data=f.handleObj.data;a.handleObj=f.handleObj;A=f.handleObj.origHandler.apply(f.elem,arguments);if(A===false||a.isPropagationStopped()){d=f.level;if(A===false)b=false;if(a.isImmediatePropagationStopped())break}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(La,
19
+ "`").replace(Ma,"&")}function ma(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Na.test(b))return c.filter(b,e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function na(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this,
20
+ e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var l in e[h])c.event.add(this,h,e[h][l],e[h][l].data)}}})}function Oa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function oa(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?Pa:Qa,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a,
21
+ "margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function da(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Ra.test(a)?e(a,h):da(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?e(a,""):c.each(b,function(f,h){da(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(pa.concat.apply([],pa.slice(0,b)),function(){d[this]=a});return d}function qa(a){if(!ea[a]){var b=c("<"+
22
+ a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";ea[a]=d}return ea[a]}function fa(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var t=E.document,c=function(){function a(){if(!b.isReady){try{t.documentElement.doScroll("left")}catch(j){setTimeout(a,1);return}b.ready()}}var b=function(j,s){return new b.fn.init(j,s)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,l=/\S/,k=/^\s+/,o=/\s+$/,x=/\W/,r=/\d/,A=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,
23
+ C=/^[\],:{}\s]*$/,J=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,I=/(?:^|:|,)(?:\s*\[)+/g,L=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,i=/(msie) ([\w.]+)/,n=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,q=[],u,y=Object.prototype.toString,F=Object.prototype.hasOwnProperty,M=Array.prototype.push,N=Array.prototype.slice,O=String.prototype.trim,D=Array.prototype.indexOf,R={};b.fn=b.prototype={init:function(j,
24
+ s){var v,z,H;if(!j)return this;if(j.nodeType){this.context=this[0]=j;this.length=1;return this}if(j==="body"&&!s&&t.body){this.context=t;this[0]=t.body;this.selector="body";this.length=1;return this}if(typeof j==="string")if((v=h.exec(j))&&(v[1]||!s))if(v[1]){H=s?s.ownerDocument||s:t;if(z=A.exec(j))if(b.isPlainObject(s)){j=[t.createElement(z[1])];b.fn.attr.call(j,s,true)}else j=[H.createElement(z[1])];else{z=b.buildFragment([v[1]],[H]);j=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this,
25
+ j)}else{if((z=t.getElementById(v[2]))&&z.parentNode){if(z.id!==v[2])return f.find(j);this.length=1;this[0]=z}this.context=t;this.selector=j;return this}else if(!s&&!x.test(j)){this.selector=j;this.context=t;j=t.getElementsByTagName(j);return b.merge(this,j)}else return!s||s.jquery?(s||f).find(j):b(s).find(j);else if(b.isFunction(j))return f.ready(j);if(j.selector!==B){this.selector=j.selector;this.context=j.context}return b.makeArray(j,this)},selector:"",jquery:"1.4.4",length:0,size:function(){return this.length},
26
+ toArray:function(){return N.call(this,0)},get:function(j){return j==null?this.toArray():j<0?this.slice(j)[0]:this[j]},pushStack:function(j,s,v){var z=b();b.isArray(j)?M.apply(z,j):b.merge(z,j);z.prevObject=this;z.context=this.context;if(s==="find")z.selector=this.selector+(this.selector?" ":"")+v;else if(s)z.selector=this.selector+"."+s+"("+v+")";return z},each:function(j,s){return b.each(this,j,s)},ready:function(j){b.bindReady();if(b.isReady)j.call(t,b);else q&&q.push(j);return this},eq:function(j){return j===
27
+ -1?this.slice(j):this.slice(j,+j+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(j){return this.pushStack(b.map(this,function(s,v){return j.call(s,v,s)}))},end:function(){return this.prevObject||b(null)},push:M,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var j,s,v,z,H,G=arguments[0]||{},K=1,Q=arguments.length,ga=false;
28
+ if(typeof G==="boolean"){ga=G;G=arguments[1]||{};K=2}if(typeof G!=="object"&&!b.isFunction(G))G={};if(Q===K){G=this;--K}for(;K<Q;K++)if((j=arguments[K])!=null)for(s in j){v=G[s];z=j[s];if(G!==z)if(ga&&z&&(b.isPlainObject(z)||(H=b.isArray(z)))){if(H){H=false;v=v&&b.isArray(v)?v:[]}else v=v&&b.isPlainObject(v)?v:{};G[s]=b.extend(ga,v,z)}else if(z!==B)G[s]=z}return G};b.extend({noConflict:function(j){E.$=e;if(j)E.jQuery=d;return b},isReady:false,readyWait:1,ready:function(j){j===true&&b.readyWait--;
29
+ if(!b.readyWait||j!==true&&!b.isReady){if(!t.body)return setTimeout(b.ready,1);b.isReady=true;if(!(j!==true&&--b.readyWait>0))if(q){var s=0,v=q;for(q=null;j=v[s++];)j.call(t,b);b.fn.trigger&&b(t).trigger("ready").unbind("ready")}}},bindReady:function(){if(!p){p=true;if(t.readyState==="complete")return setTimeout(b.ready,1);if(t.addEventListener){t.addEventListener("DOMContentLoaded",u,false);E.addEventListener("load",b.ready,false)}else if(t.attachEvent){t.attachEvent("onreadystatechange",u);E.attachEvent("onload",
30
+ b.ready);var j=false;try{j=E.frameElement==null}catch(s){}t.documentElement.doScroll&&j&&a()}}},isFunction:function(j){return b.type(j)==="function"},isArray:Array.isArray||function(j){return b.type(j)==="array"},isWindow:function(j){return j&&typeof j==="object"&&"setInterval"in j},isNaN:function(j){return j==null||!r.test(j)||isNaN(j)},type:function(j){return j==null?String(j):R[y.call(j)]||"object"},isPlainObject:function(j){if(!j||b.type(j)!=="object"||j.nodeType||b.isWindow(j))return false;if(j.constructor&&
31
+ !F.call(j,"constructor")&&!F.call(j.constructor.prototype,"isPrototypeOf"))return false;for(var s in j);return s===B||F.call(j,s)},isEmptyObject:function(j){for(var s in j)return false;return true},error:function(j){throw j;},parseJSON:function(j){if(typeof j!=="string"||!j)return null;j=b.trim(j);if(C.test(j.replace(J,"@").replace(w,"]").replace(I,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(j):(new Function("return "+j))();else b.error("Invalid JSON: "+j)},noop:function(){},globalEval:function(j){if(j&&
32
+ l.test(j)){var s=t.getElementsByTagName("head")[0]||t.documentElement,v=t.createElement("script");v.type="text/javascript";if(b.support.scriptEval)v.appendChild(t.createTextNode(j));else v.text=j;s.insertBefore(v,s.firstChild);s.removeChild(v)}},nodeName:function(j,s){return j.nodeName&&j.nodeName.toUpperCase()===s.toUpperCase()},each:function(j,s,v){var z,H=0,G=j.length,K=G===B||b.isFunction(j);if(v)if(K)for(z in j){if(s.apply(j[z],v)===false)break}else for(;H<G;){if(s.apply(j[H++],v)===false)break}else if(K)for(z in j){if(s.call(j[z],
33
+ z,j[z])===false)break}else for(v=j[0];H<G&&s.call(v,H,v)!==false;v=j[++H]);return j},trim:O?function(j){return j==null?"":O.call(j)}:function(j){return j==null?"":j.toString().replace(k,"").replace(o,"")},makeArray:function(j,s){var v=s||[];if(j!=null){var z=b.type(j);j.length==null||z==="string"||z==="function"||z==="regexp"||b.isWindow(j)?M.call(v,j):b.merge(v,j)}return v},inArray:function(j,s){if(s.indexOf)return s.indexOf(j);for(var v=0,z=s.length;v<z;v++)if(s[v]===j)return v;return-1},merge:function(j,
34
+ s){var v=j.length,z=0;if(typeof s.length==="number")for(var H=s.length;z<H;z++)j[v++]=s[z];else for(;s[z]!==B;)j[v++]=s[z++];j.length=v;return j},grep:function(j,s,v){var z=[],H;v=!!v;for(var G=0,K=j.length;G<K;G++){H=!!s(j[G],G);v!==H&&z.push(j[G])}return z},map:function(j,s,v){for(var z=[],H,G=0,K=j.length;G<K;G++){H=s(j[G],G,v);if(H!=null)z[z.length]=H}return z.concat.apply([],z)},guid:1,proxy:function(j,s,v){if(arguments.length===2)if(typeof s==="string"){v=j;j=v[s];s=B}else if(s&&!b.isFunction(s)){v=
35
+ s;s=B}if(!s&&j)s=function(){return j.apply(v||this,arguments)};if(j)s.guid=j.guid=j.guid||s.guid||b.guid++;return s},access:function(j,s,v,z,H,G){var K=j.length;if(typeof s==="object"){for(var Q in s)b.access(j,Q,s[Q],z,H,v);return j}if(v!==B){z=!G&&z&&b.isFunction(v);for(Q=0;Q<K;Q++)H(j[Q],s,z?v.call(j[Q],Q,H(j[Q],s)):v,G);return j}return K?H(j[0],s):B},now:function(){return(new Date).getTime()},uaMatch:function(j){j=j.toLowerCase();j=L.exec(j)||g.exec(j)||i.exec(j)||j.indexOf("compatible")<0&&n.exec(j)||
36
+ [];return{browser:j[1]||"",version:j[2]||"0"}},browser:{}});b.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(j,s){R["[object "+s+"]"]=s.toLowerCase()});m=b.uaMatch(m);if(m.browser){b.browser[m.browser]=true;b.browser.version=m.version}if(b.browser.webkit)b.browser.safari=true;if(D)b.inArray=function(j,s){return D.call(s,j)};if(!/\s/.test("\u00a0")){k=/^[\s\xA0]+/;o=/[\s\xA0]+$/}f=b(t);if(t.addEventListener)u=function(){t.removeEventListener("DOMContentLoaded",u,
37
+ false);b.ready()};else if(t.attachEvent)u=function(){if(t.readyState==="complete"){t.detachEvent("onreadystatechange",u);b.ready()}};return E.jQuery=E.$=b}();(function(){c.support={};var a=t.documentElement,b=t.createElement("script"),d=t.createElement("div"),e="script"+c.now();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],l=t.createElement("select"),
38
+ k=l.appendChild(t.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:k.selected,deleteExpando:true,optDisabled:false,checkClone:false,
39
+ scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};l.disabled=true;c.support.optDisabled=!k.disabled;b.type="text/javascript";try{b.appendChild(t.createTextNode("window."+e+"=1;"))}catch(o){}a.insertBefore(b,a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}try{delete b.test}catch(x){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function r(){c.support.noCloneEvent=
40
+ false;d.detachEvent("onclick",r)});d.cloneNode(true).fireEvent("onclick")}d=t.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=t.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var r=t.createElement("div");r.style.width=r.style.paddingLeft="1px";t.body.appendChild(r);c.boxModel=c.support.boxModel=r.offsetWidth===2;if("zoom"in r.style){r.style.display="inline";r.style.zoom=
41
+ 1;c.support.inlineBlockNeedsLayout=r.offsetWidth===2;r.style.display="";r.innerHTML="<div style='width:4px;'></div>";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";var A=r.getElementsByTagName("td");c.support.reliableHiddenOffsets=A[0].offsetHeight===0;A[0].style.display="";A[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&A[0].offsetHeight===0;r.innerHTML="";t.body.removeChild(r).style.display=
42
+ "none"});a=function(r){var A=t.createElement("div");r="on"+r;var C=r in A;if(!C){A.setAttribute(r,"return;");C=typeof A[r]==="function"}return C};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();var ra={},Ja=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?ra:a;var e=a.nodeType,f=e?a[c.expando]:null,h=
43
+ c.cache;if(!(e&&!f&&typeof b==="string"&&d===B)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==B)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?ra:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando);
44
+ else if(d)delete f[e];else for(var l in a)delete a[l]}},acceptData:function(a){if(a.nodeName){var b=c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){var d=null;if(typeof a==="undefined"){if(this.length){var e=this[0].attributes,f;d=c.data(this[0]);for(var h=0,l=e.length;h<l;h++){f=e[h].name;if(f.indexOf("data-")===0){f=f.substr(5);ka(this[0],f,d[f])}}}return d}else if(typeof a==="object")return this.each(function(){c.data(this,
45
+ a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(b===B){d=this.triggerHandler("getData"+k[1]+"!",[k[0]]);if(d===B&&this.length){d=c.data(this[0],a);d=ka(this[0],a,d)}return d===B&&k[1]?this.data(k[0]):d}else return this.each(function(){var o=c(this),x=[k[0],b];o.triggerHandler("setData"+k[1]+"!",x);c.data(this,a,b);o.triggerHandler("changeData"+k[1]+"!",x)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var e=
46
+ c.data(a,b);if(!d)return e||[];if(!e||c.isArray(d))e=c.data(a,b,c.makeArray(d));else e.push(d);return e}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),e=d.shift();if(e==="inprogress")e=d.shift();if(e){b==="fx"&&d.unshift("inprogress");e.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===B)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,
47
+ a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var sa=/[\n\t]/g,ha=/\s+/,Sa=/\r/g,Ta=/^(?:href|src|style)$/,Ua=/^(?:button|input)$/i,Va=/^(?:button|input|object|select|textarea)$/i,Wa=/^a(?:rea)?$/i,ta=/^(?:radio|checkbox)$/i;c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",
48
+ colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};c.fn.extend({attr:function(a,b){return c.access(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(x){var r=c(this);r.addClass(a.call(this,x,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===
49
+ 1)if(f.className){for(var h=" "+f.className+" ",l=f.className,k=0,o=b.length;k<o;k++)if(h.indexOf(" "+b[k]+" ")<0)l+=" "+b[k];f.className=c.trim(l)}else f.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(o){var x=c(this);x.removeClass(a.call(this,o,x.attr("class")))});if(a&&typeof a==="string"||a===B)for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1&&f.className)if(a){for(var h=(" "+f.className+" ").replace(sa," "),
50
+ l=0,k=b.length;l<k;l++)h=h.replace(" "+b[l]+" "," ");f.className=c.trim(h)}else f.className=""}return this},toggleClass:function(a,b){var d=typeof a,e=typeof b==="boolean";if(c.isFunction(a))return this.each(function(f){var h=c(this);h.toggleClass(a.call(this,f,h.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var f,h=0,l=c(this),k=b,o=a.split(ha);f=o[h++];){k=e?k:!l.hasClass(f);l[k?"addClass":"removeClass"](f)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,
51
+ "__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(sa," ").indexOf(a)>-1)return true;return false},val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one";
52
+ if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h<e;h++){var l=f[h];if(l.selected&&(c.support.optDisabled?!l.disabled:l.getAttribute("disabled")===null)&&(!l.parentNode.disabled||!c.nodeName(l.parentNode,"optgroup"))){a=c(l).val();if(b)return a;d.push(a)}}return d}if(ta.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Sa,"")}return B}var k=c.isFunction(a);return this.each(function(o){var x=c(this),r=a;if(this.nodeType===1){if(k)r=
53
+ a.call(this,o,x.val());if(r==null)r="";else if(typeof r==="number")r+="";else if(c.isArray(r))r=c.map(r,function(C){return C==null?"":C+""});if(c.isArray(r)&&ta.test(this.type))this.checked=c.inArray(x.val(),r)>=0;else if(c.nodeName(this,"select")){var A=c.makeArray(r);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),A)>=0});if(!A.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},
54
+ attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return B;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==B;b=e&&c.props[b]||b;var h=Ta.test(b);if((b in a||a[b]!==B)&&e&&!h){if(f){b==="type"&&Ua.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&
55
+ b.specified?b.value:Va.test(a.nodeName)||Wa.test(a.nodeName)&&a.href?0:B;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return B;a=!c.support.hrefNormalized&&e&&h?a.getAttribute(b,2):a.getAttribute(b);return a===null?B:a}});var X=/\.(.*)$/,ia=/^(?:textarea|input|select)$/i,La=/\./g,Ma=/ /g,Xa=/[^\w\s.|`]/g,Ya=function(a){return a.replace(Xa,"\\$&")},ua={focusin:0,focusout:0};
56
+ c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;else if(!d)return;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var l=a.nodeType?"events":"__events__",k=h[l],o=h.handle;if(typeof k==="function"){o=k.handle;k=k.events}else if(!k){a.nodeType||(h[l]=h=function(){});h.events=k={}}if(!o)h.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,
57
+ arguments):B};o.elem=a;b=b.split(" ");for(var x=0,r;l=b[x++];){h=f?c.extend({},f):{handler:d,data:e};if(l.indexOf(".")>-1){r=l.split(".");l=r.shift();h.namespace=r.slice(0).sort().join(".")}else{r=[];h.namespace=""}h.type=l;if(!h.guid)h.guid=d.guid;var A=k[l],C=c.event.special[l]||{};if(!A){A=k[l]=[];if(!C.setup||C.setup.call(a,e,r,o)===false)if(a.addEventListener)a.addEventListener(l,o,false);else a.attachEvent&&a.attachEvent("on"+l,o)}if(C.add){C.add.call(a,h);if(!h.handler.guid)h.handler.guid=
58
+ d.guid}A.push(h);c.event.global[l]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,l=0,k,o,x,r,A,C,J=a.nodeType?"events":"__events__",w=c.data(a),I=w&&w[J];if(w&&I){if(typeof I==="function"){w=I;I=I.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in I)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[l++];){r=f;k=f.indexOf(".")<0;o=[];if(!k){o=f.split(".");f=o.shift();x=RegExp("(^|\\.)"+
59
+ c.map(o.slice(0).sort(),Ya).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(A=I[f])if(d){r=c.event.special[f]||{};for(h=e||0;h<A.length;h++){C=A[h];if(d.guid===C.guid){if(k||x.test(C.namespace)){e==null&&A.splice(h--,1);r.remove&&r.remove.call(a,C)}if(e!=null)break}}if(A.length===0||e!=null&&A.length===1){if(!r.teardown||r.teardown.call(a,o)===false)c.removeEvent(a,f,w.handle);delete I[f]}}else for(h=0;h<A.length;h++){C=A[h];if(k||x.test(C.namespace)){c.event.remove(a,r,C.handler,h);A.splice(h--,1)}}}if(c.isEmptyObject(I)){if(b=
60
+ w.handle)b.elem=null;delete w.events;delete w.handle;if(typeof w==="function")c.removeData(a,J);else c.isEmptyObject(w)&&c.removeData(a)}}}}},trigger:function(a,b,d,e){var f=a.type||a;if(!e){a=typeof a==="object"?a[c.expando]?a:c.extend(c.Event(f),a):c.Event(f);if(f.indexOf("!")>=0){a.type=f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===
61
+ 8)return B;a.result=B;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){var l;e=a.target;var k=f.replace(X,""),o=c.nodeName(e,"a")&&k===
62
+ "click",x=c.event.special[k]||{};if((!x._default||x._default.call(d,a)===false)&&!o&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[k]){if(l=e["on"+k])e["on"+k]=null;c.event.triggered=true;e[k]()}}catch(r){}if(l)e["on"+k]=l;c.event.triggered=false}}},handle:function(a){var b,d,e,f;d=[];var h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+
63
+ d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var l=d.length;f<l;f++){var k=d[f];if(b||e.test(k.namespace)){a.handler=k.handler;a.data=k.data;a.handleObj=k;k=k.handler.apply(this,h);if(k!==B){a.result=k;if(k===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
64
+ fix:function(a){if(a[c.expando])return a;var b=a;a=c.Event(b);for(var d=this.props.length,e;d;){e=this.props[--d];a[e]=b[e]}if(!a.target)a.target=a.srcElement||t;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=t.documentElement;d=t.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
65
+ d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(a.which==null&&(a.charCode!=null||a.keyCode!=null))a.which=a.charCode!=null?a.charCode:a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==B)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,Y(a.origType,a.selector),c.extend({},a,{handler:Ka,guid:a.handler.guid}))},remove:function(a){c.event.remove(this,
66
+ Y(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,d){if(c.isWindow(this))this.onbeforeunload=d},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.removeEvent=t.removeEventListener?function(a,b,d){a.removeEventListener&&a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent&&a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp=
67
+ c.now();this[c.expando]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=ca;var a=this.originalEvent;if(a)if(a.preventDefault)a.preventDefault();else a.returnValue=false},stopPropagation:function(){this.isPropagationStopped=ca;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=ca;this.stopPropagation()},isDefaultPrevented:U,isPropagationStopped:U,isImmediatePropagationStopped:U};
68
+ var va=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},wa=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?wa:va,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?wa:va)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(){if(this.nodeName.toLowerCase()!==
69
+ "form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length){a.liveFired=B;return la("submit",this,arguments)}});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13){a.liveFired=B;return la("submit",this,arguments)}})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};if(!c.support.changeBubbles){var V,
70
+ xa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ia.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=xa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===B||f===e))if(e!=null||f){a.type="change";a.liveFired=
71
+ B;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",xa(a))}},setup:function(){if(this.type===
72
+ "file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ia.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ia.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}t.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){ua[b]++===0&&t.addEventListener(a,d,true)},teardown:function(){--ua[b]===
73
+ 0&&t.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=B}var l=b==="one"?c.proxy(f,function(o){c(this).unbind(o,l);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var k=this.length;h<k;h++)c.event.add(this[h],d,l,e)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&!a.preventDefault)for(var d in a)this.unbind(d,
74
+ a[d]);else{d=0;for(var e=this.length;d<e;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,e){return this.live(b,d,e,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var d=c.Event(a);d.preventDefault();d.stopPropagation();c.event.trigger(d,b,this[0]);return d.result}},toggle:function(a){for(var b=arguments,d=
75
+ 1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(e){var f=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,f+1);e.preventDefault();return b[f].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var ya={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,e,f,h){var l,k=0,o,x,r=h||this.selector;h=h?this:c(this.context);if(typeof d===
76
+ "object"&&!d.preventDefault){for(l in d)h[b](l,e,d[l],r);return this}if(c.isFunction(e)){f=e;e=B}for(d=(d||"").split(" ");(l=d[k++])!=null;){o=X.exec(l);x="";if(o){x=o[0];l=l.replace(X,"")}if(l==="hover")d.push("mouseenter"+x,"mouseleave"+x);else{o=l;if(l==="focus"||l==="blur"){d.push(ya[l]+x);l+=x}else l=(ya[l]||l)+x;if(b==="live"){x=0;for(var A=h.length;x<A;x++)c.event.add(h[x],"live."+Y(l,r),{data:e,selector:r,handler:f,origType:l,origHandler:f,preType:o})}else h.unbind("live."+Y(l,r),f)}}return this}});
77
+ c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d,e){if(e==null){e=d;d=null}return arguments.length>0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});
78
+ (function(){function a(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1&&!q){y.sizcache=n;y.sizset=p}if(y.nodeName.toLowerCase()===i){F=y;break}y=y[g]}m[p]=F}}}function b(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1){if(!q){y.sizcache=n;y.sizset=p}if(typeof i!=="string"){if(y===i){F=true;break}}else if(k.filter(i,
79
+ [y]).length>0){F=y;break}}y=y[g]}m[p]=F}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,l=true;[0,0].sort(function(){l=false;return 0});var k=function(g,i,n,m){n=n||[];var p=i=i||t;if(i.nodeType!==1&&i.nodeType!==9)return[];if(!g||typeof g!=="string")return n;var q,u,y,F,M,N=true,O=k.isXML(i),D=[],R=g;do{d.exec("");if(q=d.exec(R)){R=q[3];D.push(q[1]);if(q[2]){F=q[3];
80
+ break}}}while(q);if(D.length>1&&x.exec(g))if(D.length===2&&o.relative[D[0]])u=L(D[0]+D[1],i);else for(u=o.relative[D[0]]?[i]:k(D.shift(),i);D.length;){g=D.shift();if(o.relative[g])g+=D.shift();u=L(g,u)}else{if(!m&&D.length>1&&i.nodeType===9&&!O&&o.match.ID.test(D[0])&&!o.match.ID.test(D[D.length-1])){q=k.find(D.shift(),i,O);i=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]}if(i){q=m?{expr:D.pop(),set:C(m)}:k.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&i.parentNode?i.parentNode:i,O);u=q.expr?k.filter(q.expr,
81
+ q.set):q.set;if(D.length>0)y=C(u);else N=false;for(;D.length;){q=M=D.pop();if(o.relative[M])q=D.pop();else M="";if(q==null)q=i;o.relative[M](y,q,O)}}else y=[]}y||(y=u);y||k.error(M||g);if(f.call(y)==="[object Array]")if(N)if(i&&i.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&k.contains(i,y[g])))n.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&n.push(u[g]);else n.push.apply(n,y);else C(y,n);if(F){k(F,p,n,m);k.uniqueSort(n)}return n};k.uniqueSort=function(g){if(w){h=
82
+ l;g.sort(w);if(h)for(var i=1;i<g.length;i++)g[i]===g[i-1]&&g.splice(i--,1)}return g};k.matches=function(g,i){return k(g,null,null,i)};k.matchesSelector=function(g,i){return k(i,null,null,[g]).length>0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p<q;p++){var u,y=o.order[p];if(u=o.leftMatch[y].exec(g)){var F=u[1];u.splice(1,1);if(F.substr(F.length-1)!=="\\"){u[1]=(u[1]||"").replace(/\\/g,"");m=o.find[y](u,i,n);if(m!=null){g=g.replace(o.match[y],"");break}}}}m||(m=i.getElementsByTagName("*"));
83
+ return{set:m,expr:g}};k.filter=function(g,i,n,m){for(var p,q,u=g,y=[],F=i,M=i&&i[0]&&k.isXML(i[0]);g&&i.length;){for(var N in o.filter)if((p=o.leftMatch[N].exec(g))!=null&&p[2]){var O,D,R=o.filter[N];D=p[1];q=false;p.splice(1,1);if(D.substr(D.length-1)!=="\\"){if(F===y)y=[];if(o.preFilter[N])if(p=o.preFilter[N](p,F,n,y,m,M)){if(p===true)continue}else q=O=true;if(p)for(var j=0;(D=F[j])!=null;j++)if(D){O=R(D,p,j,F);var s=m^!!O;if(n&&O!=null)if(s)q=true;else F[j]=false;else if(s){y.push(D);q=true}}if(O!==
84
+ B){n||(F=y);g=g.replace(o.match[N],"");if(!q)return[];break}}}if(g===u)if(q==null)k.error(g);else break;u=g}return F};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var o=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,
85
+ POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},relative:{"+":function(g,i){var n=typeof i==="string",m=n&&!/\W/.test(i);n=n&&!m;if(m)i=i.toLowerCase();m=0;for(var p=g.length,q;m<p;m++)if(q=g[m]){for(;(q=q.previousSibling)&&q.nodeType!==1;);g[m]=n||q&&q.nodeName.toLowerCase()===
86
+ i?q||false:q===i}n&&k.filter(i,g,true)},">":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p<q;p++){if(n=g[p]){n=n.parentNode;g[p]=n.nodeName.toLowerCase()===i?n:false}}else{for(;p<q;p++)if(n=g[p])g[p]=m?n.parentNode:n.parentNode===i;m&&k.filter(i,g,true)}},"":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=i=i.toLowerCase();q=a}q("parentNode",i,p,g,m,n)},"~":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=
87
+ i=i.toLowerCase();q=a}q("previousSibling",i,p,g,m,n)}},find:{ID:function(g,i,n){if(typeof i.getElementById!=="undefined"&&!n)return(g=i.getElementById(g[1]))&&g.parentNode?[g]:[]},NAME:function(g,i){if(typeof i.getElementsByName!=="undefined"){for(var n=[],m=i.getElementsByName(g[1]),p=0,q=m.length;p<q;p++)m[p].getAttribute("name")===g[1]&&n.push(m[p]);return n.length===0?null:n}},TAG:function(g,i){return i.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,i,n,m,p,q){g=" "+g[1].replace(/\\/g,
88
+ "")+" ";if(q)return g;q=0;for(var u;(u=i[q])!=null;q++)if(u)if(p^(u.className&&(" "+u.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))n||m.push(u);else if(n)i[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var i=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=i[1]+(i[2]||1)-0;g[3]=i[3]-0}g[0]=e++;return g},ATTR:function(g,i,n,
89
+ m,p,q){i=g[1].replace(/\\/g,"");if(!q&&o.attrMap[i])g[1]=o.attrMap[i];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,i,n,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,i);else{g=k.filter(g[3],i,n,true^p);n||m.push.apply(m,g);return false}else if(o.match.POS.test(g[0])||o.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===
90
+ true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,i,n){return!!k(n[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===
91
+ g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,i){return i===0},last:function(g,i,n,m){return i===m.length-1},even:function(g,i){return i%2===0},odd:function(g,i){return i%2===1},lt:function(g,i,n){return i<n[3]-0},gt:function(g,i,n){return i>n[3]-0},nth:function(g,i,n){return n[3]-
92
+ 0===i},eq:function(g,i,n){return n[3]-0===i}},filter:{PSEUDO:function(g,i,n,m){var p=i[1],q=o.filters[p];if(q)return q(g,n,i,m);else if(p==="contains")return(g.textContent||g.innerText||k.getText([g])||"").indexOf(i[3])>=0;else if(p==="not"){i=i[3];n=0;for(m=i.length;n<m;n++)if(i[n]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+p)},CHILD:function(g,i){var n=i[1],m=g;switch(n){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(n===
93
+ "first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":n=i[2];var p=i[3];if(n===1&&p===0)return true;var q=i[0],u=g.parentNode;if(u&&(u.sizcache!==q||!g.nodeIndex)){var y=0;for(m=u.firstChild;m;m=m.nextSibling)if(m.nodeType===1)m.nodeIndex=++y;u.sizcache=q}m=g.nodeIndex-p;return n===0?m===0:m%n===0&&m/n>=0}},ID:function(g,i){return g.nodeType===1&&g.getAttribute("id")===i},TAG:function(g,i){return i==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===
94
+ i},CLASS:function(g,i){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(i)>-1},ATTR:function(g,i){var n=i[1];n=o.attrHandle[n]?o.attrHandle[n](g):g[n]!=null?g[n]:g.getAttribute(n);var m=n+"",p=i[2],q=i[4];return n==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&n!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,i,n,m){var p=o.setFilters[i[2]];
95
+ if(p)return p(g,n,i,m)}}},x=o.match.POS,r=function(g,i){return"\\"+(i-0+1)},A;for(A in o.match){o.match[A]=RegExp(o.match[A].source+/(?![^\[]*\])(?![^\(]*\))/.source);o.leftMatch[A]=RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[A].source.replace(/\\(\d+)/g,r))}var C=function(g,i){g=Array.prototype.slice.call(g,0);if(i){i.push.apply(i,g);return i}return g};try{Array.prototype.slice.call(t.documentElement.childNodes,0)}catch(J){C=function(g,i){var n=0,m=i||[];if(f.call(g)==="[object Array]")Array.prototype.push.apply(m,
96
+ g);else if(typeof g.length==="number")for(var p=g.length;n<p;n++)m.push(g[n]);else for(;g[n];n++)m.push(g[n]);return m}}var w,I;if(t.documentElement.compareDocumentPosition)w=function(g,i){if(g===i){h=true;return 0}if(!g.compareDocumentPosition||!i.compareDocumentPosition)return g.compareDocumentPosition?-1:1;return g.compareDocumentPosition(i)&4?-1:1};else{w=function(g,i){var n,m,p=[],q=[];n=g.parentNode;m=i.parentNode;var u=n;if(g===i){h=true;return 0}else if(n===m)return I(g,i);else if(n){if(!m)return 1}else return-1;
97
+ for(;u;){p.unshift(u);u=u.parentNode}for(u=m;u;){q.unshift(u);u=u.parentNode}n=p.length;m=q.length;for(u=0;u<n&&u<m;u++)if(p[u]!==q[u])return I(p[u],q[u]);return u===n?I(g,q[u],-1):I(p[u],i,1)};I=function(g,i,n){if(g===i)return n;for(g=g.nextSibling;g;){if(g===i)return-1;g=g.nextSibling}return 1}}k.getText=function(g){for(var i="",n,m=0;g[m];m++){n=g[m];if(n.nodeType===3||n.nodeType===4)i+=n.nodeValue;else if(n.nodeType!==8)i+=k.getText(n.childNodes)}return i};(function(){var g=t.createElement("div"),
98
+ i="script"+(new Date).getTime(),n=t.documentElement;g.innerHTML="<a name='"+i+"'/>";n.insertBefore(g,n.firstChild);if(t.getElementById(i)){o.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:B:[]};o.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}n.removeChild(g);
99
+ n=g=null})();(function(){var g=t.createElement("div");g.appendChild(t.createComment(""));if(g.getElementsByTagName("*").length>0)o.find.TAG=function(i,n){var m=n.getElementsByTagName(i[1]);if(i[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")o.attrHandle.href=function(i){return i.getAttribute("href",2)};g=null})();t.querySelectorAll&&
100
+ function(){var g=k,i=t.createElement("div");i.innerHTML="<p class='TEST'></p>";if(!(i.querySelectorAll&&i.querySelectorAll(".TEST").length===0)){k=function(m,p,q,u){p=p||t;m=m.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!u&&!k.isXML(p))if(p.nodeType===9)try{return C(p.querySelectorAll(m),q)}catch(y){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var F=p.getAttribute("id"),M=F||"__sizzle__";F||p.setAttribute("id",M);try{return C(p.querySelectorAll("#"+M+" "+m),q)}catch(N){}finally{F||
101
+ p.removeAttribute("id")}}return g(m,p,q,u)};for(var n in g)k[n]=g[n];i=null}}();(function(){var g=t.documentElement,i=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,n=false;try{i.call(t.documentElement,"[test!='']:sizzle")}catch(m){n=true}if(i)k.matchesSelector=function(p,q){q=q.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(p))try{if(n||!o.match.PSEUDO.test(q)&&!/!=/.test(q))return i.call(p,q)}catch(u){}return k(q,null,null,[p]).length>0}})();(function(){var g=
102
+ t.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){o.order.splice(1,0,"CLASS");o.find.CLASS=function(i,n,m){if(typeof n.getElementsByClassName!=="undefined"&&!m)return n.getElementsByClassName(i[1])};g=null}}})();k.contains=t.documentElement.contains?function(g,i){return g!==i&&(g.contains?g.contains(i):true)}:t.documentElement.compareDocumentPosition?
103
+ function(g,i){return!!(g.compareDocumentPosition(i)&16)}:function(){return false};k.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var L=function(g,i){for(var n,m=[],p="",q=i.nodeType?[i]:i;n=o.match.PSEUDO.exec(g);){p+=n[0];g=g.replace(o.match.PSEUDO,"")}g=o.relative[g]?g+"*":g;n=0;for(var u=q.length;n<u;n++)k(g,q[n],m);return k.filter(p,m)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=k.getText;c.isXMLDoc=k.isXML;
104
+ c.contains=k.contains})();var Za=/Until$/,$a=/^(?:parents|prevUntil|prevAll)/,ab=/,/,Na=/^.[^:#\[\.,]*$/,bb=Array.prototype.slice,cb=c.expr.match.POS;c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,e=0,f=this.length;e<f;e++){d=b.length;c.find(a,this[e],b);if(e>0)for(var h=d;h<b.length;h++)for(var l=0;l<d;l++)if(b[l]===b[h]){b.splice(h--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,e=b.length;d<e;d++)if(c.contains(this,b[d]))return true})},
105
+ not:function(a){return this.pushStack(ma(this,a,false),"not",a)},filter:function(a){return this.pushStack(ma(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){var d=[],e,f,h=this[0];if(c.isArray(a)){var l,k={},o=1;if(h&&a.length){e=0;for(f=a.length;e<f;e++){l=a[e];k[l]||(k[l]=c.expr.match.POS.test(l)?c(l,b||this.context):l)}for(;h&&h.ownerDocument&&h!==b;){for(l in k){e=k[l];if(e.jquery?e.index(h)>-1:c(h).is(e))d.push({selector:l,elem:h,level:o})}h=
106
+ h.parentNode;o++}}return d}l=cb.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e<f;e++)for(h=this[e];h;)if(l?l.index(h)>-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context):
107
+ c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,
108
+ 2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,
109
+ b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Za.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||ab.test(e))&&$a.test(a))f=f.reverse();return this.pushStack(f,a,bb.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===B||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&
110
+ e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var za=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,Aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Ba=/<([\w:]+)/,db=/<tbody/i,eb=/<|&#?\w+;/,Ca=/<(?:script|object|embed|option|style)/i,Da=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/\=([^="'>\s]+\/)>/g,P={option:[1,
111
+ "<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};P.optgroup=P.option;P.tbody=P.tfoot=P.colgroup=P.caption=P.thead;P.th=P.td;if(!c.support.htmlSerialize)P._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
112
+ c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==B)return this.empty().append((this[0]&&this[0].ownerDocument||t).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
113
+ wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
114
+ prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
115
+ this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
116
+ return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(za,"").replace(fb,'="$1">').replace($,"")],e)[0]}else return this.cloneNode(true)});if(a===true){na(this,b);na(this.find("*"),b.find("*"))}return b},html:function(a){if(a===B)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(za,""):null;
117
+ else if(typeof a==="string"&&!Ca.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!P[(Ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Aa,"<$1></$2>");try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(e){this.empty().append(a)}}else c.isFunction(a)?this.each(function(f){var h=c(this);h.html(a.call(this,f,h.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=
118
+ c(this),e=d.html();d.replaceWith(a.call(this,b,e))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){var e,f,h,l=a[0],k=[];if(!c.support.checkClone&&arguments.length===3&&typeof l==="string"&&Da.test(l))return this.each(function(){c(this).domManip(a,
119
+ b,d,true)});if(c.isFunction(l))return this.each(function(x){var r=c(this);a[0]=l.call(this,x,b?r.html():B);r.domManip(a,b,d)});if(this[0]){e=l&&l.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:c.buildFragment(a,this,k);h=e.fragment;if(f=h.childNodes.length===1?h=h.firstChild:h.firstChild){b=b&&c.nodeName(f,"tr");f=0;for(var o=this.length;f<o;f++)d.call(b?c.nodeName(this[f],"table")?this[f].getElementsByTagName("tbody")[0]||this[f].appendChild(this[f].ownerDocument.createElement("tbody")):
120
+ this[f]:this[f],f>0||e.cacheable||this.length>1?h.cloneNode(true):h)}k.length&&c.each(k,Oa)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:t;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===t&&!Ca.test(a[0])&&(c.support.checkClone||!Da.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append",
121
+ prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=d.length;f<h;f++){var l=(f>0?this.clone(true):this).get();c(d[f])[b](l);e=e.concat(l)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||t;if(typeof b.createElement==="undefined")b=b.ownerDocument||
122
+ b[0]&&b[0].ownerDocument||t;for(var f=[],h=0,l;(l=a[h])!=null;h++){if(typeof l==="number")l+="";if(l){if(typeof l==="string"&&!eb.test(l))l=b.createTextNode(l);else if(typeof l==="string"){l=l.replace(Aa,"<$1></$2>");var k=(Ba.exec(l)||["",""])[1].toLowerCase(),o=P[k]||P._default,x=o[0],r=b.createElement("div");for(r.innerHTML=o[1]+l+o[2];x--;)r=r.lastChild;if(!c.support.tbody){x=db.test(l);k=k==="table"&&!x?r.firstChild&&r.firstChild.childNodes:o[1]==="<table>"&&!x?r.childNodes:[];for(o=k.length-
123
+ 1;o>=0;--o)c.nodeName(k[o],"tbody")&&!k[o].childNodes.length&&k[o].parentNode.removeChild(k[o])}!c.support.leadingWhitespace&&$.test(l)&&r.insertBefore(b.createTextNode($.exec(l)[0]),r.firstChild);l=r.childNodes}if(l.nodeType)f.push(l);else f=c.merge(f,l)}}if(d)for(h=0;f[h];h++)if(e&&c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script"))));
124
+ d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,l=0,k;(k=a[l])!=null;l++)if(!(k.nodeName&&c.noData[k.nodeName.toLowerCase()]))if(d=k[c.expando]){if((b=e[d])&&b.events)for(var o in b.events)f[o]?c.event.remove(k,o):c.removeEvent(k,o,b.handle);if(h)delete k[c.expando];else k.removeAttribute&&k.removeAttribute(c.expando);delete e[d]}}});var Ea=/alpha\([^)]*\)/i,gb=/opacity=([^)]*)/,hb=/-([a-z])/ig,ib=/([A-Z])/g,Fa=/^-?\d+(?:px)?$/i,
125
+ jb=/^-?\d/,kb={position:"absolute",visibility:"hidden",display:"block"},Pa=["Left","Right"],Qa=["Top","Bottom"],W,Ga,aa,lb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===B)return this;return c.access(this,a,b,true,function(d,e,f){return f!==B?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true,
126
+ zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),l=a.style,k=c.cssHooks[h];b=c.cssProps[h]||h;if(d!==B){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!k||!("set"in k)||(d=k.set(a,d))!==B)try{l[b]=d}catch(o){}}}else{if(k&&"get"in k&&(f=k.get(a,false,e))!==B)return f;return l[b]}}},css:function(a,b,d){var e,f=c.camelCase(b),
127
+ h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==B)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=e[f]},camelCase:function(a){return a.replace(hb,lb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=oa(d,b,f);else c.swap(d,kb,function(){h=oa(d,b,f)});if(h<=0){h=W(d,b,b);if(h==="0px"&&aa)h=aa(d,b,b);
128
+ if(h!=null)return h===""||h==="auto"?"0px":h}if(h<0||h==null){h=d.style[b];return h===""||h==="auto"?"0px":h}return typeof h==="string"?h:h+"px"}},set:function(d,e){if(Fa.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return gb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f=
129
+ d.filter||"";d.filter=Ea.test(f)?f.replace(Ea,e):d.filter+" "+e}};if(t.defaultView&&t.defaultView.getComputedStyle)Ga=function(a,b,d){var e;d=d.replace(ib,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return B;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};if(t.documentElement.currentStyle)aa=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],h=a.style;if(!Fa.test(f)&&jb.test(f)){d=h.left;
130
+ e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f===""?"auto":f};W=Ga||aa;if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var mb=c.now(),nb=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
131
+ ob=/^(?:select|textarea)/i,pb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,qb=/^(?:GET|HEAD)$/,Ra=/\[\]$/,T=/\=\?(&|$)/,ja=/\?/,rb=/([?&])_=[^&]*/,sb=/^(\w+:)?\/\/([^\/?#]+)/,tb=/%20/g,ub=/#.*$/,Ha=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ha)return Ha.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b===
132
+ "object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(l,k){if(k==="success"||k==="notmodified")h.html(f?c("<div>").append(l.responseText.replace(nb,"")).find(f):l.responseText);d&&h.each(d,[l.responseText,k,l])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&
133
+ !this.disabled&&(this.checked||ob.test(this.nodeName)||pb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})},
134
+ getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html",
135
+ script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),l=qb.test(h);b.url=b.url.replace(ub,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ja.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data||
136
+ !T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+mb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var k=E[d];E[d]=function(m){if(c.isFunction(k))k(m);else{E[d]=B;try{delete E[d]}catch(p){}}f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);r&&r.removeChild(A)}}if(b.dataType==="script"&&b.cache===null)b.cache=
137
+ false;if(b.cache===false&&l){var o=c.now(),x=b.url.replace(rb,"$1_="+o);b.url=x+(x===b.url?(ja.test(b.url)?"&":"?")+"_="+o:"")}if(b.data&&l)b.url+=(ja.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");o=(o=sb.exec(b.url))&&(o[1]&&o[1].toLowerCase()!==location.protocol||o[2].toLowerCase()!==location.host);if(b.dataType==="script"&&h==="GET"&&o){var r=t.getElementsByTagName("head")[0]||t.documentElement,A=t.createElement("script");if(b.scriptCharset)A.charset=b.scriptCharset;
138
+ A.src=b.url;if(!d){var C=false;A.onload=A.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);A.onload=A.onreadystatechange=null;r&&A.parentNode&&r.removeChild(A)}}}r.insertBefore(A,r.firstChild);return B}var J=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!l||a&&a.contentType)w.setRequestHeader("Content-Type",
139
+ b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}o||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(I){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&&
140
+ c.triggerGlobal(b,"ajaxSend",[w,b]);var L=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){J||c.handleComplete(b,w,e,f);J=true;if(w)w.onreadystatechange=c.noop}else if(!J&&w&&(w.readyState===4||m==="timeout")){J=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d||
141
+ c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&Function.prototype.call.call(g,w);L("abort")}}catch(i){}b.async&&b.timeout>0&&setTimeout(function(){w&&!J&&L("timeout")},b.timeout);try{w.send(l||b.data==null?null:b.data)}catch(n){c.handleError(b,w,null,n);c.handleComplete(b,w,e,f)}b.async||L();return w}},param:function(a,b){var d=[],e=function(h,l){l=c.isFunction(l)?l():l;d[d.length]=
142
+ encodeURIComponent(h)+"="+encodeURIComponent(l)};if(b===B)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)da(f,a[f],b,e);return d.join("&").replace(tb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess",
143
+ [b,a])},handleComplete:function(a,b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),
144
+ e=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}});
145
+ if(E.ActiveXObject)c.ajaxSettings.xhr=function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var ea={},vb=/^(?:toggle|show|hide)$/,wb=/^([+\-]=)?([\d+.\-]+)(.*)$/,ba,pa=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show",
146
+ 3),a,b,d);else{d=0;for(var e=this.length;d<e;d++){a=this[d];b=a.style.display;if(!c.data(a,"olddisplay")&&b==="none")b=a.style.display="";b===""&&c.css(a,"display")==="none"&&c.data(a,"olddisplay",qa(a.nodeName))}for(d=0;d<e;d++){a=this[d];b=a.style.display;if(b===""||b==="none")a.style.display=c.data(a,"olddisplay")||""}return this}},hide:function(a,b,d){if(a||a===0)return this.animate(S("hide",3),a,b,d);else{a=0;for(b=this.length;a<b;a++){d=c.css(this[a],"display");d!=="none"&&c.data(this[a],"olddisplay",
147
+ d)}for(a=0;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b,d){var e=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||e?this.each(function(){var f=e?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(S("toggle",3),a,b,d);return this},fadeTo:function(a,b,d,e){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d,e)},animate:function(a,b,d,e){var f=c.speed(b,
148
+ d,e);if(c.isEmptyObject(a))return this.each(f.complete);return this[f.queue===false?"each":"queue"](function(){var h=c.extend({},f),l,k=this.nodeType===1,o=k&&c(this).is(":hidden"),x=this;for(l in a){var r=c.camelCase(l);if(l!==r){a[r]=a[l];delete a[l];l=r}if(a[l]==="hide"&&o||a[l]==="show"&&!o)return h.complete.call(this);if(k&&(l==="height"||l==="width")){h.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(c.css(this,"display")==="inline"&&c.css(this,"float")==="none")if(c.support.inlineBlockNeedsLayout)if(qa(this.nodeName)===
149
+ "inline")this.style.display="inline-block";else{this.style.display="inline";this.style.zoom=1}else this.style.display="inline-block"}if(c.isArray(a[l])){(h.specialEasing=h.specialEasing||{})[l]=a[l][1];a[l]=a[l][0]}}if(h.overflow!=null)this.style.overflow="hidden";h.curAnim=c.extend({},a);c.each(a,function(A,C){var J=new c.fx(x,h,A);if(vb.test(C))J[C==="toggle"?o?"show":"hide":C](a);else{var w=wb.exec(C),I=J.cur()||0;if(w){var L=parseFloat(w[2]),g=w[3]||"px";if(g!=="px"){c.style(x,A,(L||1)+g);I=(L||
150
+ 1)/J.cur()*I;c.style(x,A,I+g)}if(w[1])L=(w[1]==="-="?-1:1)*L+I;J.custom(I,L,g)}else J.custom(I,C,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var e=d.length-1;e>=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b,
151
+ d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a*
152
+ Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(l){return f.step(l)}
153
+ var f=this,h=c.fx;this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;e.elem=this.elem;if(e()&&c.timers.push(e)&&!ba)ba=setInterval(h.tick,h.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;
154
+ this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(k,o){f.style["overflow"+o]=h.overflow[k]})}this.options.hide&&c(this.elem).hide();if(this.options.hide||
155
+ this.options.show)for(var l in this.options.curAnim)c.style(this.elem,l,this.options.orig[l]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=
156
+ c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},interval:13,stop:function(){clearInterval(ba);ba=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===
157
+ b.elem}).length};var xb=/^t(?:able|d|h)$/i,Ia=/^(?:body|html)$/i;c.fn.offset="getBoundingClientRect"in t.documentElement?function(a){var b=this[0],d;if(a)return this.each(function(l){c.offset.setOffset(this,a,l)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);try{d=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,h=f.documentElement;if(!d||!c.contains(h,b))return d||{top:0,left:0};b=f.body;f=fa(f);return{top:d.top+(f.pageYOffset||c.support.boxModel&&
158
+ h.scrollTop||b.scrollTop)-(h.clientTop||b.clientTop||0),left:d.left+(f.pageXOffset||c.support.boxModel&&h.scrollLeft||b.scrollLeft)-(h.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(a)return this.each(function(x){c.offset.setOffset(this,a,x)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d,e=b.offsetParent,f=b.ownerDocument,h=f.documentElement,l=f.body;d=(f=f.defaultView)?f.getComputedStyle(b,null):b.currentStyle;
159
+ for(var k=b.offsetTop,o=b.offsetLeft;(b=b.parentNode)&&b!==l&&b!==h;){if(c.offset.supportsFixedPosition&&d.position==="fixed")break;d=f?f.getComputedStyle(b,null):b.currentStyle;k-=b.scrollTop;o-=b.scrollLeft;if(b===e){k+=b.offsetTop;o+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&xb.test(b.nodeName))){k+=parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}e=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&d.overflow!=="visible"){k+=
160
+ parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}d=d}if(d.position==="relative"||d.position==="static"){k+=l.offsetTop;o+=l.offsetLeft}if(c.offset.supportsFixedPosition&&d.position==="fixed"){k+=Math.max(h.scrollTop,l.scrollTop);o+=Math.max(h.scrollLeft,l.scrollLeft)}return{top:k,left:o}};c.offset={initialize:function(){var a=t.body,b=t.createElement("div"),d,e,f,h=parseFloat(c.css(a,"marginTop"))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",
161
+ height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.insertBefore(b,a.firstChild);d=b.firstChild;e=d.firstChild;f=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=e.offsetTop!==5;this.doesAddBorderForTableAndCells=
162
+ f.offsetTop===5;e.style.position="fixed";e.style.top="20px";this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15;e.style.position=e.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==h;a.removeChild(b);c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.css(a,
163
+ "marginTop"))||0;d+=parseFloat(c.css(a,"marginLeft"))||0}return{top:b,left:d}},setOffset:function(a,b,d){var e=c.css(a,"position");if(e==="static")a.style.position="relative";var f=c(a),h=f.offset(),l=c.css(a,"top"),k=c.css(a,"left"),o=e==="absolute"&&c.inArray("auto",[l,k])>-1;e={};var x={};if(o)x=f.position();l=o?x.top:parseInt(l,10)||0;k=o?x.left:parseInt(k,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+l;if(b.left!=null)e.left=b.left-h.left+k;"using"in b?b.using.call(a,
164
+ e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Ia.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||t.body;a&&!Ia.test(a.nodeName)&&
165
+ c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==B)return this.each(function(){if(h=fa(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=fa(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();
166
+ c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(l){var k=c(this);k[d](e.call(this,l,k[d]()))});if(c.isWindow(f))return f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b];else if(f.nodeType===9)return Math.max(f.documentElement["client"+
167
+ b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]);else if(e===B){f=c.css(f,d);var h=parseFloat(f);return c.isNaN(h)?f:h}else return this.css(d,typeof e==="string"?e:e+"px")}})})(window);
168
+ jQuery.noConflict();
package.xml ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <package>
3
+ <name>Atol_Productfeedgenerator</name>
4
+ <version>1.0.0</version>
5
+ <stability>stable</stability>
6
+ <license>GNU General Public License (GPL)</license>
7
+ <channel>community</channel>
8
+ <extends/>
9
+ <summary>Create custom product collections and display them through a widget or create a rss feed.</summary>
10
+ <description>You want to create product collections based on their categories , some of their attributes , perform sorting display, all three at once ? This extension is made for you! &#xD;
11
+ The setup is easy and user friendly. &#xD;
12
+ First you enter a title and a description for your feed. &#xD;
13
+ The rest of the job is simply to select the desired filters : categories , attributes, special filters.&#xD;
14
+ You can even sort the results.&#xD;
15
+ Couldn't be easier!&#xD;
16
+ &lt;br /&gt;&lt;br /&gt;&#xD;
17
+ Managing your web store becomes a lot easier with this extension. Using the product feed generator with its integrated widget you can display a custom collection of products filtered attributes as :&#xD;
18
+ &lt;br /&gt;&lt;br /&gt;&#xD;
19
+ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- categories&lt;br /&gt;&#xD;
20
+ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- attributes&lt;br /&gt;&#xD;
21
+ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- promotions&lt;br /&gt;&#xD;
22
+ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- recently added&lt;br /&gt;&#xD;
23
+ &lt;br /&gt;&#xD;
24
+ You can use several filter at once.&#xD;
25
+ &lt;br /&gt;&lt;br /&gt;&#xD;
26
+ The included widget enables you to add this product collection to any cms page.&#xD;
27
+ &lt;br /&gt;&lt;br /&gt;&#xD;
28
+ Want to know more about our company check out &lt;a href="http://atolcd.com"&gt;www.atolcd.com&lt;/a&gt;&#xD;
29
+ &lt;hr /&gt;&#xD;
30
+ De fa&#xE7;on native Magento vous limite quant aux listes de produits &#xE0; afficher en Frontend ? C'est effectivement un fait. Avec cette extension vous pouvez d&#xE9;sormais choisir des crit&#xE8;res bien plus complets et proposer des flux RSS de produits cibl&#xE9;s. G&#xE9;n&#xE9;rer des pages listant des produits devient un jeu d'enfant.&#xD;
31
+ &lt;br /&gt;&lt;br /&gt;&#xD;
32
+ L'animation d'une boutique en ligne se trouve simplifi&#xE9;e gr&#xE2;ce &#xE0; cette extension. En utilisant le &#xAB; Product Feed Generator &#xBB; (production de flux de produits) + un widget int&#xE9;gr&#xE9; dans une page CMS (pour rappel le widget est une fonction native dans Magento) vous pouvez afficher, sous forme de grille ou de liste, des produits en fonction de crit&#xE8;res pr&#xE9;cis qui peuvent &#xEA;tre :&#xD;
33
+ &lt;br /&gt;&lt;br /&gt;&#xD;
34
+ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- des cat&#xE9;gories d'appartenance,&lt;br /&gt;&#xD;
35
+ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- des attributs,&lt;br /&gt;&#xD;
36
+ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- des produits en promotion (oui/non),&lt;br /&gt;&#xD;
37
+ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- des produits nouveaux (oui/non).&lt;br /&gt;&#xD;
38
+ &lt;br /&gt;&#xD;
39
+ L'imbrication de r&#xE8;gles et de crit&#xE8;res permet d'aboutir &#xE0; la liste souhait&#xE9;e.&#xD;
40
+ &lt;br /&gt;&lt;br /&gt;&#xD;
41
+ L'utilisation du syst&#xE8;me de widget vous permet d'ajouter facilement votre flux dans une page CMS.&#xD;
42
+ &lt;br /&gt;&lt;br /&gt;&#xD;
43
+ Pour en savoir plus sur notre soci&#xE9;t&#xE9;, n'h&#xE9;sitez pas &#xE0; consulter &lt;a href="http://www.atolcd.com"&gt;www.atolcd.com&lt;/a&gt;&#xD;
44
+ &#xD;
45
+ </description>
46
+ <notes>first release</notes>
47
+ <authors><author><name>AtolCD</name><user>AtolCD</user><email>magento@atolcd.com</email></author><author><name>Antoine Trapet</name><user>atr</user><email>atr@atolcd.com</email></author><author><name>Aur&#xE9;lien Pon&#xE7;on</name><user>apo</user><email>apo@atolcd.com</email></author><author><name>Antoine Chevaldonn&#xE9;</name><user>ach</user><email>ach@atolcd.com</email></author></authors>
48
+ <date>2016-03-10</date>
49
+ <time>10:51:45</time>
50
+ <contents><target name="magelocal"><dir name="Atol"><dir name="Productfeedgenerator"><dir name="Block"><dir name="Adminhtml"><dir name="Productflow"><dir name="Edit"><file name="Categories.php" hash="1dab18a40a30827f9b1ab3001f04d13a"/></dir><file name="Edit.php" hash="000b7dc9137a5e92e7b503ff13713006"/><file name="Grid.php" hash="cc7def146fe698de4249b252eeb3c63e"/><dir name="Renderer"><file name="Linkscolumn.php" hash="d831799203369be2586698559aabf161"/></dir></dir><file name="Productflow.php" hash="827fd19128b6f6b03febbbb5387be50f"/></dir><file name="Frontdisplay.php" hash="ab7997b46c7391e0a0e5b24c6070beb8"/><dir name="Productflow"><file name="Rss.php" hash="a4caa2e3ac07511634be1bc5ee0267da"/></dir></dir><dir name="Helper"><file name="Data.php" hash="7795364cf1483083b9594d95c34bc660"/></dir><dir name="Model"><dir name="Mysql4"><dir name="Productflow"><file name="Collection.php" hash="0d8056368d6c4599a00e3b3dd4f69722"/></dir><file name="Productflow.php" hash="e68259670802fa7f84571b19b0a030cb"/></dir><file name="Productflow.php" hash="aa0fb13c57acb92c3b3855dd6b115e1c"/><dir name="System"><dir name="Config"><dir name="Source"><file name="Orderbytype.php" hash="1a390fda30c5c9d1ca9f5a8c2bf1bb6f"/><file name="Productflowtype.php" hash="967ca8318947473e696612ceb8b9f2c6"/></dir></dir></dir></dir><dir name="controllers"><dir name="Adminhtml"><file name="ProductflowController.php" hash="787a5ec0239348658787be719de4574b"/></dir><file name="IndexController.php" hash="39e2e2cf9354c35b32e5a738840b6d87"/><file name="ProductflowController.php" hash="5125ac0325a8f2fc62deb8c89d097111"/></dir><dir name="etc"><file name="adminhtml.xml" hash="c8d2bb91591aae5a80941ef44e19dcc9"/><file name="config.xml" hash="8c2136b71a9c5e306fbf815455a5b443"/><file name="system.xml" hash="511c6ea6cbd55527dfc278b83a44eccb"/><file name="widget.xml" hash="b29e594a7912a2244c1d6fd01912d1c0"/></dir><dir name="sql"><dir name="productfeedgenerator_setup"><file name="mysql4-install-0.1.0.php" hash="178841fb1c45d4fd7e70abc5054ad0ce"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><file name="layout.productfeedgenerator.xml" hash=""/></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Atol_Productfeedgenerator.xml" hash="21350607b70c31828328ba4e41f8bd04"/></dir></target><target name="magelocale"><dir name="fr_FR"><file name="Atol_Productfeedgenerator.csv" hash="9e1bfbad6d620a09811cdbd9c1a5abfb"/></dir></target><target name="mageweb"><dir name="js"><dir name="jquery"><file name="jquery-1.4.4.min.js" hash="eef9a6a171184899b08ebd61f1a03425"/></dir></dir></target><target name="mageskin"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="css"><dir name="productfeedgenerator"><file name="styles.css" hash="8a550d9db1fcf37915a96e67919de9da"/></dir></dir></dir></dir></dir></target></contents>
51
+ <compatible/>
52
+ <dependencies><required><php><min>5.3.0</min><max>6.0.0</max></php></required></dependencies>
53
+ </package>
skin/adminhtml/default/default/css/productfeedgenerator/styles.css ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .entry-edit fieldset .input_section {
2
+ display: block;
3
+ margin-bottom: 10px;
4
+ margin-top: 10px;
5
+ }
6
+
7
+ .entry-edit fieldset .input_section label {
8
+ display: inline-block;
9
+ position:relative\9;
10
+ zoom:1\9;
11
+ width: 200px;
12
+ }
13
+
14
+ .entry-edit fieldset .input_section select, .entry-edit fieldset .input_section input[type="text"], .entry-edit fieldset .input_section textarea {
15
+ width: 250px;
16
+ -moz-box-sizing: border-box;
17
+ -ms-box-sizing: border-box;
18
+ -webkit-box-sizing: border-box;
19
+ box-sizing: border-box;
20
+ }
21
+
22
+ .entry-edit fieldset .input_section input[type="radio"], .entry-edit fieldset .input_section input[type="checkbox"] {
23
+ margin: 5px;
24
+ }
25
+
26
+ .entry-edit fieldset .input_section #productflow_order_direction, .entry-edit fieldset .input_section .attribute_item.filtered .value {
27
+ width: 100px;
28
+ margin-left: 20px;
29
+ }
30
+
31
+ .entry-edit fieldset .input_section button {
32
+ margin-left: 20px;
33
+ }
34
+
35
+ .entry-edit fieldset .input_section .attribute_item.filtered {
36
+ margin-bottom: 10px;
37
+ margin-top: 10px;
38
+ }
39
+
40
+ .entry-edit fieldset .input_section select.direction {
41
+ margin-left: 10px;
42
+ width: 150px;
43
+ }
44
+
45
+ #productfeedgeneratorGrid_table a.rss_link {
46
+ background-image: url("../../../../../frontend/default/default/images/i_rss-big.png");
47
+ display: block;
48
+ height: 20px;
49
+ width: 20px;
50
+ }