Mkmage_layered_navigation - Version 0.1.0

Version Notes

MkMage AJAX Layered Navigation extension provides options for multi-select, price filters and sliders, defining basic style.

Download this release

Release Info

Developer MKMage
Extension Mkmage_layered_navigation
Version 0.1.0
Comparing to
See all releases


Version 0.1.0

Files changed (47) hide show
  1. app/code/local/MKMage/.DS_Store +0 -0
  2. app/code/local/MKMage/LayeredNavigation/.DS_Store +0 -0
  3. app/code/local/MKMage/LayeredNavigation/Block/Layer/.DS_Store +0 -0
  4. app/code/local/MKMage/LayeredNavigation/Block/Layer/Filter/Price.php +31 -0
  5. app/code/local/MKMage/LayeredNavigation/Helper/Data.php +37 -0
  6. app/code/local/MKMage/LayeredNavigation/Model/Catalog/Filter/Attribute.php +91 -0
  7. app/code/local/MKMage/LayeredNavigation/Model/Catalog/Filter/Category.php +136 -0
  8. app/code/local/MKMage/LayeredNavigation/Model/Catalog/Filter/Item.php +120 -0
  9. app/code/local/MKMage/LayeredNavigation/Model/Catalog/Filter/Price.php +92 -0
  10. app/code/local/MKMage/LayeredNavigation/Model/Catalog/Layer.php +21 -0
  11. app/code/local/MKMage/LayeredNavigation/Model/Filter.php +10 -0
  12. app/code/local/MKMage/LayeredNavigation/Model/Observer.php +164 -0
  13. app/code/local/MKMage/LayeredNavigation/Model/Option.php +7 -0
  14. app/code/local/MKMage/LayeredNavigation/Model/Resource/Catalog/Filter/Attribute.php +59 -0
  15. app/code/local/MKMage/LayeredNavigation/Model/Resource/Catalog/Filter/Price.php +54 -0
  16. app/code/local/MKMage/LayeredNavigation/Model/Resource/Filter.php +6 -0
  17. app/code/local/MKMage/LayeredNavigation/Model/Resource/Filter/Collection.php +13 -0
  18. app/code/local/MKMage/LayeredNavigation/Model/Resource/Option.php +6 -0
  19. app/code/local/MKMage/LayeredNavigation/Model/Resource/Option/Collection.php +6 -0
  20. app/code/local/MKMage/LayeredNavigation/Model/Search/Filter/Attribute.php +68 -0
  21. app/code/local/MKMage/LayeredNavigation/Model/Search/Layer.php +21 -0
  22. app/code/local/MKMage/LayeredNavigation/etc/config.xml +113 -0
  23. app/code/local/MKMage/LayeredNavigation/etc/system.xml +118 -0
  24. app/code/local/MKMage/Mkcore/.DS_Store +0 -0
  25. app/code/local/MKMage/Mkcore/Block/.DS_Store +0 -0
  26. app/code/local/MKMage/Mkcore/Block/Mkcore.php +5 -0
  27. app/code/local/MKMage/Mkcore/Helper/.DS_Store +0 -0
  28. app/code/local/MKMage/Mkcore/Helper/Data.php +5 -0
  29. app/code/local/MKMage/Mkcore/etc/.DS_Store +0 -0
  30. app/code/local/MKMage/Mkcore/etc/config.xml +44 -0
  31. app/code/local/MKMage/Mkcore/etc/system.xml +12 -0
  32. app/design/adminhtml/default/default/layout/mkmage/layerednavigation.xml +8 -0
  33. app/design/frontend/base/default/layout/mkmage/layerednavigation.xml +73 -0
  34. app/design/frontend/base/default/template/mkmage/layerednavigation/filter.phtml +100 -0
  35. app/design/frontend/base/default/template/mkmage/layerednavigation/loader.phtml +8 -0
  36. app/design/frontend/base/default/template/mkmage/layerednavigation/state.phtml +34 -0
  37. app/design/frontend/base/default/template/mkmage/layerednavigation/view.phtml +36 -0
  38. app/etc/modules/MKMage_LayeredNavigation.xml +12 -0
  39. app/etc/modules/MKMage_Mkcore.xml +9 -0
  40. package.xml +19 -0
  41. skin/adminhtml/default/default/mkcore.png +0 -0
  42. skin/frontend/base/default/css/mkmage/layerednavigation/jquery-ui.css +1217 -0
  43. skin/frontend/base/default/css/mkmage/layerednavigation/layerednavigation.css +76 -0
  44. skin/frontend/base/default/images/mkmage/layerednavigation/rolling.svg +1 -0
  45. skin/frontend/base/default/js/mkmage/layerednavigation/jquery-ui.min.js +13 -0
  46. skin/frontend/base/default/js/mkmage/layerednavigation/layered.js +157 -0
  47. skin/frontend/base/default/js/mkmage/layerednavigation/price-slider.js +16617 -0
app/code/local/MKMage/.DS_Store ADDED
Binary file
app/code/local/MKMage/LayeredNavigation/.DS_Store ADDED
Binary file
app/code/local/MKMage/LayeredNavigation/Block/Layer/.DS_Store ADDED
Binary file
app/code/local/MKMage/LayeredNavigation/Block/Layer/Filter/Price.php ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class MKMage_LayeredNavigation_Block_Layer_Filter_Price extends Mage_Catalog_Block_Layer_Filter_Price {
4
+
5
+ protected $_priceFilterMin = null;
6
+ protected $_priceFilterMax = null;
7
+
8
+ public function __construct() {
9
+
10
+ parent::__construct();
11
+
12
+ if (Mage::app()->getRequest()->isXmlHttpRequest()) {
13
+
14
+ $range = explode('-',Mage::app()->getRequest()->getParam('price'));
15
+
16
+ $this->_priceFilterMin = $range[0];
17
+ $this->_priceFilterMax = $range[1];
18
+
19
+ }
20
+
21
+ }
22
+
23
+ public function getPriceFilterMin() {
24
+ return $this->_priceFilterMin;
25
+ }
26
+
27
+ public function getPriceFilterMax() {
28
+ return $this->_priceFilterMax;
29
+ }
30
+
31
+ }
app/code/local/MKMage/LayeredNavigation/Helper/Data.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class MKMage_LayeredNavigation_Helper_Data extends Mage_Core_Helper_Abstract {
4
+
5
+ public function getIsActive() {
6
+
7
+ $layeredNavigationXmlEnabled = Mage::helper('core')->isModuleEnabled('MKMage_LayeredNavigation') ? true : false;
8
+ $layeredNavigationOutputEnabled = Mage::helper('core')->isModuleOutputEnabled("MKMage_LayeredNavigation") ? true : false;
9
+ $layeredNavigationModuleEnabled = Mage::getStoreConfig('mkmage_layerednavigation/mkmage_layerednavigation_general/layerednavigation_enabled',Mage::app()->getStore()) ? true : false;
10
+
11
+ return ( $layeredNavigationXmlEnabled && $layeredNavigationOutputEnabled && $layeredNavigationModuleEnabled ) ? true : false;
12
+
13
+ }
14
+
15
+ public function getIsPriceSliderEnabled() {
16
+
17
+ return Mage::getStoreConfig('mkmage_layerednavigation/mkmage_layerednavigation_display/price_slider_enable',Mage::app()->getStore()) ? true : false;
18
+
19
+ }
20
+
21
+ public function getLoaderUrl() {
22
+
23
+ if(!empty(Mage::getStoreConfig('mkmage_layerednavigation/mkmage_layerednavigation_display/loader_image',Mage::app()->getStore()))) {
24
+ return Mage::getBaseUrl() . 'media' . DS . 'theme' . DS . Mage::getStoreConfig('mkmage_layerednavigation/mkmage_layerednavigation_display/loader_image',Mage::app()->getStore());
25
+ } else {
26
+ return false;
27
+ }
28
+
29
+ }
30
+
31
+ public function getIsEnabledOnSearch() {
32
+
33
+ return Mage::getStoreConfig('mkmage_layerednavigation/mkmage_layerednavigation_display/catalogsearch_enable',Mage::app()->getStore()) ? true : false;
34
+
35
+ }
36
+
37
+ }
app/code/local/MKMage/LayeredNavigation/Model/Catalog/Filter/Attribute.php ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class MKMage_LayeredNavigation_Model_Catalog_Filter_Attribute extends Mage_Catalog_Model_Layer_Filter_Attribute
3
+ {
4
+ protected $_appliedValues = array();
5
+ protected $_optionValues = array();
6
+
7
+ public function apply(Zend_Controller_Request_Abstract $request, $filterBlock) {
8
+ $filter = $request->getParam($this->_requestVar);
9
+
10
+ if (is_array($filter)) {
11
+ return $this;
12
+ }
13
+
14
+ $optionValues = array();
15
+
16
+ $text = $this->_getOptionText($filter);
17
+
18
+ $options = explode('_', $filter);
19
+
20
+ foreach ($options as $opt) {
21
+ $optionValues[$opt] = $this->_getOptionText($opt);
22
+ }
23
+
24
+ $this->_optionValues = $optionValues;
25
+
26
+ //if ($filter && strlen($text)) { // comment this to allow apply multi value for filter
27
+ if ($filter) {
28
+ $this->_appliedValues = explode('_', $filter);
29
+ //var_dump($this->_appliedValues); die;
30
+ $this->_getResource()->applyFilterToCollection($this, $filter);
31
+ $this->getLayer()->getState()->addFilter($this->_createItem($text, $filter));
32
+ //$this->_items = array(); // prevent filter from hiding when apply to collection
33
+ }
34
+ return $this;
35
+ }
36
+
37
+ public function getFilterOptionValues() {
38
+ return $this->_optionValues;
39
+ }
40
+
41
+ public function getFIlterAppliedValues() {
42
+ return $this->_appliedValues;
43
+ }
44
+
45
+ protected function _getItemsData() {
46
+ $attribute = $this->getAttributeModel();
47
+ $this->_requestVar = $attribute->getAttributeCode();
48
+
49
+ $key = $this->getLayer()->getStateKey() . '_' . $this->_requestVar;
50
+ $data = $this->getLayer()->getAggregator()->getCacheData($key);
51
+
52
+ if ($data === null) {
53
+ $options = $attribute->getFrontend()->getSelectOptions();
54
+ $optionsCount = $this->_getResource()->getCount($this);
55
+ $data = array();
56
+ foreach ($options as $option) {
57
+ if (is_array($option['value'])) {
58
+ continue;
59
+ }
60
+ if (Mage::helper('core/string')->strlen($option['value'])) {
61
+ // Check filter type
62
+ if ($this->_getIsFilterableAttribute($attribute) == self::OPTIONS_ONLY_WITH_RESULTS) {
63
+ // keep applied options in filter
64
+ if (!empty($optionsCount[$option['value']]) || in_array($option['value'], $this->_appliedValues)) {
65
+ $data[] = array(
66
+ 'label' => $option['label'],
67
+ 'value' => $option['value'],
68
+ 'count' => isset($optionsCount[$option['value']]) ? $optionsCount[$option['value']] : 0 // product count fix
69
+ );
70
+ }
71
+ } else {
72
+ $data[] = array(
73
+ 'label' => $option['label'],
74
+ 'value' => $option['value'],
75
+ 'count' => isset($optionsCount[$option['value']]) ? $optionsCount[$option['value']] : 0
76
+ );
77
+ }
78
+ }
79
+ }
80
+
81
+ $tags = array(
82
+ Mage_Eav_Model_Entity_Attribute::CACHE_TAG . ':' . $attribute->getId()
83
+ );
84
+
85
+ $tags = $this->getLayer()->getStateTags($tags);
86
+ $this->getLayer()->getAggregator()->saveCacheData($data, $key, $tags);
87
+ }
88
+ return $data;
89
+ }
90
+
91
+ }
app/code/local/MKMage/LayeredNavigation/Model/Catalog/Filter/Category.php ADDED
@@ -0,0 +1,136 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class MKMage_LayeredNavigation_Model_Catalog_Filter_Category extends Mage_Catalog_Model_Layer_Filter_Category
3
+ {
4
+ public function getResetValue() {
5
+ return null;
6
+ }
7
+
8
+ protected function _initItems() {
9
+ // get root category id
10
+ $rootId = Mage::app()->getStore()->getRootCategoryId();
11
+
12
+ // get filtered category
13
+ $curCat = $this->getCategory();
14
+ if ($this->_appliedCategory && $this->_isValidCategory($this->_appliedCategory))
15
+ $curCat = $this->_appliedCategory;
16
+
17
+ $cat = $curCat; // iterator object
18
+ $items = array();
19
+ do {
20
+ if ($cat->getId()==$curCat->getId()) {
21
+ // create item current category (recursively)
22
+ $itemData = $this->_getCategoryItemData($cat);
23
+ $item = $this->_createItem($itemData['label'], $itemData['value'], $itemData['count'], $itemData['items']);
24
+ $item->setSelected(true);
25
+ } else {
26
+ // create item for ancestors
27
+ $cat->setProductCount($this->_getCategoryProductCount($cat));
28
+ $itemData = array(
29
+ 'label' => Mage::helper('core')->htmlEscape($cat->getName()),
30
+ 'value' => $cat->getId(),
31
+ 'count' => $cat->getProductCount(),
32
+ );
33
+ $item = $this->_createItem($itemData['label'], $itemData['value'], $itemData['count']);
34
+ $item->setItems($items);
35
+ }
36
+ if ($cat->getId()==$rootId)
37
+ $item->setLabel(Mage::helper('layerednavigation')->__('All Categories'));
38
+
39
+ $items = array($item);
40
+ if ($cat->getId()==$rootId) break;
41
+
42
+ $parentId = $cat->getParentId();
43
+ $cat = Mage::getModel('catalog/category');
44
+ $cat->load($parentId);
45
+ } while (true);
46
+
47
+ $this->_items = $items;
48
+ return $this;
49
+ }
50
+
51
+ /**
52
+ * Create filter item object with extra childs item for use in category tree
53
+ *
54
+ * @param array(itemData) $items
55
+ * @return Mage_Catalog_Model_Layer_Filter_Item
56
+ */
57
+ protected function _createItem($label, $value, $count = 0, $items = array()) {
58
+ $childItems = array();
59
+ foreach ($items as $itemData)
60
+ $childItems[] = $this->_createItem($itemData['label'], $itemData['value'], $itemData['count'], $itemData['items']);
61
+
62
+ return Mage::getModel('catalog/layer_filter_item')
63
+ ->setFilter($this)
64
+ ->setLabel($label)
65
+ ->setValue($value)
66
+ ->setCount($count)
67
+ ->setData('items', $childItems);
68
+ }
69
+
70
+ /**
71
+ * Get tree item for building category filter
72
+ *
73
+ * @return array
74
+ */
75
+ protected function _getCategoryItemData($cat) {
76
+ $key = $this->getLayer()->getStateKey() . '_CATEGORYITMKMage_' . $cat->getId();
77
+ $data = $this->getLayer()->getAggregator()->getCacheData($key);
78
+
79
+ if ($data === null) {
80
+ $cat->setProductCount($this->_getCategoryProductCount($cat));
81
+ $categories = $cat->getChildrenCategories();
82
+ $childs = array();
83
+ foreach ($categories as $category) {
84
+ if ($category->getIsActive()) {
85
+ $childs[] = $this->_getCategoryItemData($category);
86
+ }
87
+ }
88
+
89
+ $data = array(
90
+ 'label' => Mage::helper('core')->htmlEscape($cat->getName()),
91
+ 'value' => $cat->getId(),
92
+ 'count' => $cat->getProductCount(),
93
+ 'items' => $childs
94
+ );
95
+
96
+ $tags = $this->getLayer()->getStateTags();
97
+ $this->getLayer()->getAggregator()->saveCacheData($data, $key, $tags);
98
+ }
99
+ return $data;
100
+ }
101
+
102
+ protected function _getCategoryProductCount($cat) {
103
+ $result = 0;
104
+ $select = clone $this->getLayer()->getProductCollection()->getSelect();
105
+ $from = $select->getPart(Zend_Db_Select::FROM);
106
+
107
+ // change category filter value
108
+ if (isset($from['cat_index'])) {
109
+ $condition = $from['cat_index']['joinCondition'];
110
+ if(preg_match("/cat_index.category_id = '.*?'/",$condition))
111
+ $condition = preg_replace("/cat_index.category_id = '.*?'/", "cat_index.category_id = '{$cat->getId()}'", $condition);
112
+ else
113
+ $condition = preg_replace("/cat_index.category_id='.*?'/", "cat_index.category_id='{$cat->getId()}'", $condition);
114
+
115
+ $notAnchor = 'AND cat_index.is_parent=1';
116
+ if ($cat->getIsAnchor())
117
+ $condition = str_replace($notAnchor, '', $condition); // remove not anchor condition
118
+ else
119
+ $condition .= ' ' . $notAnchor;
120
+
121
+ $from['cat_index']['joinCondition'] = $condition;
122
+ $select->reset(Zend_Db_Select::ORDER);
123
+ $select->reset(Zend_Db_Select::LIMIT_COUNT);
124
+ $select->reset(Zend_Db_Select::LIMIT_OFFSET);
125
+ $select->reset(Zend_Db_Select::COLUMNS);
126
+ $select->setPart(Zend_Db_Select::FROM, $from);
127
+ $select->columns(new Zend_Db_Expr("COUNT(*)"));
128
+
129
+ $connection = Mage::getSingleton('core/resource')->getConnection('core_read');
130
+ $row = $connection->fetchRow($select);
131
+ $result = reset($row);
132
+ }
133
+
134
+ return $result;
135
+ }
136
+ }
app/code/local/MKMage/LayeredNavigation/Model/Catalog/Filter/Item.php ADDED
@@ -0,0 +1,120 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class MKMage_LayeredNavigation_Model_Catalog_Filter_Item extends Mage_Catalog_Model_Layer_Filter_Item
3
+ {
4
+ /**
5
+ * variable marked to true when item is selected
6
+ *
7
+ * @var string
8
+ */
9
+ protected $_isSelected = null;
10
+
11
+ /**
12
+ * Set item select state manualy
13
+ *
14
+ * @return MKMage_LayeredNavigation_Model_Layer_Filter_Item
15
+ */
16
+ public function setSelected($val) {
17
+ $this->_isSelected = $val;
18
+ return $this;
19
+ }
20
+
21
+ /**
22
+ * Check if item has been apply
23
+ *
24
+ * @return boolean
25
+ */
26
+ public function isSelected() {
27
+ if ($this->_isSelected === null) {
28
+ $input = Mage::app()->getFrontController()->getRequest()->getParam($this->getFilter()->getRequestVar());
29
+ $values = explode('_', $input);
30
+ $this->_isSelected = in_array($this->getValue(), $values);
31
+ }
32
+ return $this->_isSelected;
33
+ }
34
+
35
+ /**
36
+ * Get the toggled value for use in checkbox
37
+ *
38
+ * @return string
39
+ */
40
+ public function getInvertValue($val) {
41
+ $result = $val;
42
+ $req = Mage::app()->getFrontController()->getRequest()->getParam($this->getFilter()->getRequestVar());
43
+ if (empty($req)) return $result;
44
+ if ($req==$val) return '';
45
+
46
+ $values = explode('_', $req);
47
+ if (in_array($val, $values)) {
48
+ $values = array_diff($values, array($val)); // exclude current value from request
49
+ } else {
50
+ $values[] = $val; // include ...
51
+ }
52
+ $result = implode('_', $values);
53
+ return $result;
54
+ }
55
+
56
+ public function getClearLinkUrl() {
57
+ // *comment this to retrieve the clear link url in layer block
58
+ // $clearLinkText = $this->getFilter()->getClearLinkText();
59
+ // if (!$clearLinkText) {
60
+ // return false;
61
+ // }
62
+
63
+ $urlParams = array(
64
+ '_current' => true,
65
+ '_use_rewrite' => true,
66
+ '_query' => array($this->getFilter()->getRequestVar() => null),
67
+ '_escape' => true,
68
+ );
69
+ return Mage::getUrl('*/*/*', $urlParams);
70
+ }
71
+
72
+ public function getUrl($invert=false) {
73
+ // modify the url for use in checkbox type
74
+ $val = $this->getInvertValue($this->getValue());
75
+ if (empty($val)) return $this->getRemoveUrl();
76
+
77
+ $query = array(
78
+ $this->getFilter()->getRequestVar() => $val,
79
+ Mage::getBlockSingleton('page/html_pager')->getPageVarName() => null // exclude current page from urls
80
+ );
81
+ return Mage::getUrl('*/*/*', array('_current'=>true, '_use_rewrite'=>true, '_query'=>$query));
82
+ }
83
+
84
+ public function getRemoveUrl()
85
+ {
86
+ $query = array($this->getFilter()->getRequestVar()=>$this->getFilter()->getResetValue());
87
+ $params['_current'] = true;
88
+ $params['_use_rewrite'] = true;
89
+ $params['_query'] = $query;
90
+ $params['_escape'] = true;
91
+ $url=str_replace('&amp;','&',Mage::getUrl('*/*/*', $params));
92
+ // $url=$query;
93
+ return $url;
94
+ }
95
+
96
+ public function getLabel() {
97
+
98
+ if(!$this->getData('label')) {
99
+ $obj['attr_code'] = $this->getFilter()->getAttributeModel()->getAttributeCode();
100
+ $obj['option_ids'] = explode('_',$this->getValue());
101
+
102
+ $attributeDetails = Mage::getSingleton("eav/config")->getAttribute("catalog_product", $obj['attr_code']);
103
+ $optionLabels = array();
104
+
105
+ $out = '';
106
+
107
+ foreach ($obj['option_ids'] as $opt) {
108
+ $optionLabels[] = $attributeDetails->getSource()->getOptionText($opt);
109
+ $out .= $attributeDetails->getSource()->getOptionText($opt) . ',';
110
+ }
111
+
112
+ $obj['option_labels'] = $optionLabels;
113
+
114
+ return substr($out,0,-1);
115
+ }
116
+ return $this->getData('label');
117
+
118
+ }
119
+
120
+ }
app/code/local/MKMage/LayeredNavigation/Model/Catalog/Filter/Price.php ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class MKMage_LayeredNavigation_Model_Catalog_Filter_Price extends Mage_Catalog_Model_Layer_Filter_Price
3
+ {
4
+ protected function _getItemsData()
5
+ {
6
+ // remove price condition in collection
7
+ $select = $this->getLayer()->getProductCollection()->getSelect();
8
+ $where = $select->getPart(Zend_Db_Select::WHERE);
9
+ $select->reset(Zend_Db_Select::WHERE);
10
+
11
+ $data = array();
12
+ if (Mage::app()->getStore()->getConfig(self::XML_PATH_RANGE_CALCULATION) == self::RANGE_CALCULATION_IMPROVED) {
13
+ $data = $this->_getCalculatedItemsData();
14
+ } else {
15
+ $range = $this->getPriceRange();
16
+ $dbRanges = $this->getRangeItemCounts($range);
17
+ if (!empty($dbRanges)) {
18
+ $lastIndex = array_keys($dbRanges);
19
+ $lastIndex = $lastIndex[count($lastIndex) - 1];
20
+
21
+ foreach ($dbRanges as $index => $count) {
22
+ $fromPrice = ($index == 1) ? '' : (($index - 1) * $range);
23
+ $toPrice = ($index == $lastIndex) ? '' : ($index * $range);
24
+
25
+ $data[] = array(
26
+ 'label' => $this->_renderRangeLabel($fromPrice, $toPrice),
27
+ 'value' => $fromPrice . '-' . $toPrice,
28
+ 'count' => $count,
29
+ );
30
+ }
31
+ }
32
+ }
33
+
34
+ // restore price condition
35
+ $select->setPart(Zend_Db_Select::WHERE, $where);
36
+ return $data;
37
+ }
38
+
39
+ public function apply(Zend_Controller_Request_Abstract $request, $filterBlock)
40
+ {
41
+ /**
42
+ * Filter must be string: $fromPrice-$toPrice
43
+ */
44
+
45
+
46
+ $filter = $request->getParam($this->getRequestVar());
47
+ if (!$filter) {
48
+ return $this;
49
+ }
50
+
51
+ //validate filter
52
+ $filterParams = explode(',', $filter);
53
+ $filter = $this->_validateFilter($filterParams[0]);
54
+ if (!$filter) {
55
+ return $this;
56
+ }
57
+
58
+ list($from, $to) = $filter;
59
+
60
+ $this->setInterval(array($from, $to));
61
+
62
+ $priorFilters = array();
63
+ for ($i = 1; $i < count($filterParams); ++$i) {
64
+ $priorFilter = $this->_validateFilter($filterParams[$i]);
65
+ if ($priorFilter) {
66
+ $priorFilters[] = $priorFilter;
67
+ } else {
68
+ //not valid data
69
+ $priorFilters = array();
70
+ break;
71
+ }
72
+ }
73
+ if ($priorFilters) {
74
+ $this->setPriorIntervals($priorFilters);
75
+ }
76
+
77
+ $this->_applyPriceRange();
78
+ $this->getLayer()->getState()->addFilter($this->_createItem(
79
+ $this->_renderRangeLabel(empty($from) ? 0 : $from, $to),
80
+ $filter
81
+ ));
82
+
83
+ return $this;
84
+ }
85
+
86
+ /*protected function _getResource() {
87
+ if (is_null($this->_resource)) {
88
+ $this->_resource = Mage::getResourceModel('layerednavigation/catalog_filter_price');
89
+ }
90
+ return $this->_resource;
91
+ }*/
92
+ }
app/code/local/MKMage/LayeredNavigation/Model/Catalog/Layer.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class MKMage_LayeredNavigation_Model_Catalog_Layer extends Mage_Catalog_Model_Layer
3
+ {
4
+ public function getFilterableAttributes() {
5
+ /*
6
+ $setIds = $this->_getSetIds();
7
+ if (!$setIds) {
8
+ return array();
9
+ }
10
+ */
11
+
12
+ $collection = Mage::getResourceModel('catalog/product_attribute_collection');
13
+ $collection->setItemObjectClass('catalog/resource_eav_attribute')
14
+ //->setAttributeSetFilter($setIds)
15
+ ->addStoreLabel(Mage::app()->getStore()->getId())->setOrder('position', 'ASC');
16
+ $collection = $this->_prepareAttributeCollection($collection);
17
+ $collection->load();
18
+
19
+ return $collection;
20
+ }
21
+ }
app/code/local/MKMage/LayeredNavigation/Model/Filter.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class MKMage_LayeredNavigation_Model_Filter extends Mage_Core_Model_Abstract {
4
+
5
+ protected function _construct() {
6
+ parent::_construct();
7
+ $this->_init('layerednavigation/filter');
8
+ }
9
+
10
+ }
app/code/local/MKMage/LayeredNavigation/Model/Observer.php ADDED
@@ -0,0 +1,164 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class MKMage_LayeredNavigation_Model_Observer {
4
+
5
+ public function checkIfActive() {
6
+
7
+ $isRewriteEnabled = Mage::helper('layerednavigation')->getIsActive();
8
+
9
+ if ($isRewriteEnabled) {
10
+
11
+ Mage::getConfig()->setNode('global/models/catalog/rewrite/layer',
12
+ 'MKMage_LayeredNavigation_Model_Catalog_Layer');
13
+
14
+ Mage::getConfig()->setNode('global/models/catalog/rewrite/layer_filter_item',
15
+ 'MKMage_LayeredNavigation_Model_Catalog_Filter_Item');
16
+
17
+ Mage::getConfig()->setNode('global/models/catalog/rewrite/layer_filter_attribute',
18
+ 'MKMage_LayeredNavigation_Model_Catalog_Filter_Attribute');
19
+
20
+ Mage::getConfig()->setNode('global/models/catalog/rewrite/layer_filter_price',
21
+ 'MKMage_LayeredNavigation_Model_Catalog_Filter_Price');
22
+
23
+ Mage::getConfig()->setNode('global/models/catalog_resource/rewrite/layer_filter_attribute',
24
+ 'MKMage_LayeredNavigation_Model_Resource_Catalog_Filter_Attribute');
25
+
26
+ Mage::getConfig()->setNode('frontend/layout/updates/layerednavigation/file',
27
+ 'mkmage/layerednavigation.xml');
28
+
29
+ if(Mage::helper('layerednavigation')->getIsEnabledOnSearch()) {
30
+
31
+ Mage::getConfig()->setNode('global/models/updates/catalogsearch/rewrite/layer',
32
+ 'MKMage_LayeredNavigation_Model_Search_Layer');
33
+
34
+ Mage::getConfig()->setNode('global/models/updates/catalogsearch/rewrite/layer_filter_attribute',
35
+ 'MKMage_LayeredNavigation_Model_Search_Filter_Attribute');
36
+
37
+ }
38
+
39
+ }
40
+
41
+ }
42
+
43
+ public function validateSystemSettings(Varien_Event_Observer $observer) {
44
+
45
+ if (Mage::getStoreConfig('mkmage_layerednavigation/mkmage_layerednavigation_general/email') != '') {
46
+
47
+ if (Mage::getStoreConfig('mkmage_layerednavigation/mkmage_layerednavigation_general/email_sent') != 1) {
48
+
49
+ $body = '<p>Layered Navigation registration for ' . Mage::getBaseUrl() . '</p>';
50
+
51
+ $email = Mage::getModel('core/email');
52
+ $email->setToName('MkMage');
53
+ $email->setToEmail('igor@mkmage.com');
54
+ $email->setBody($body);
55
+ $email->setSubject('Layered Navigation Customer Registration');
56
+ $email->setFromEmail(Mage::getStoreConfig('mkmage_layerednavigation/mkmage_layerednavigation_general/email'));
57
+ $email->setFromName(Mage::getBaseUrl());
58
+ $email->setType('html');
59
+
60
+ try {
61
+ $email->send();
62
+ Mage::getSingleton('core/session')->addSuccess('Thank you for registering with us.');
63
+ }
64
+ catch (Exception $e) {
65
+ Zend_Debug::dump($e->getMessage());
66
+ Mage::getSingleton('core/session')->addError('Could not proccess your request.');
67
+ }
68
+
69
+ Mage::getConfig()->saveConfig('mkmage_layerednavigation/mkmage_layerednavigation_general/email_sent', 1);
70
+ Mage::getConfig()->saveConfig('mkmage_layerednavigation/mkmage_layerednavigation_general/layerednavigation_enabled', 1);
71
+
72
+ }
73
+
74
+ } else {
75
+
76
+ Mage::getConfig()->saveConfig('mkmage_layerednavigation/mkmage_layerednavigation_general/layerednavigation_enabled', 0);
77
+ Mage::getConfig()->saveConfig('mkmage_layerednavigation/mkmage_layerednavigation_general/email_sent', 0);
78
+ Mage::getSingleton('core/session')->addWarning('Please enter email address to register the extension.');
79
+
80
+ }
81
+
82
+ }
83
+
84
+ public function initCategoryAjax($event) {
85
+
86
+ $layout = Mage::getSingleton('core/layout');
87
+
88
+ if (!$layout)
89
+ return;
90
+
91
+ if (!Mage::app()->getRequest()->isXmlHttpRequest())
92
+ return;
93
+
94
+ $layout->removeOutputBlock('root');
95
+
96
+ Mage::app()->getFrontController()->getResponse()->setHeader('content-type', 'application/json');
97
+
98
+ $page = $layout->getBlock('product_list');
99
+
100
+ if (!$page)
101
+ return;
102
+
103
+ $block='';
104
+
105
+ foreach ($layout->getAllBlocks() as $child){
106
+ if (!in_array($child->getNameInLayout(), array('catalog.leftnav'))){
107
+ continue;
108
+ }
109
+ $block = $child;
110
+ }
111
+
112
+ if (!$block)
113
+ return;
114
+
115
+ $container = $layout->createBlock('core/template', 'sparx_container');
116
+ //$container->setData('js', $layout->createBlock('core/template', 'ajaxfilter_js')->setTemplate('ajaxfilter/js.phtml')->toHtml());
117
+ $container->setData('block', $block->toHtml());
118
+ $container->setData('page', $page->toHtml());
119
+
120
+ $layout->addOutputBlock('sparx_container', 'toJson');
121
+
122
+ }
123
+
124
+ public function initSearchAjax($event) {
125
+
126
+ $layout = Mage::getSingleton('core/layout');
127
+
128
+ if (!$layout)
129
+ return;
130
+
131
+ if (!Mage::app()->getRequest()->isXmlHttpRequest())
132
+ return;
133
+
134
+ $layout->removeOutputBlock('root');
135
+
136
+ Mage::app()->getFrontController()->getResponse()->setHeader('content-type', 'application/json');
137
+
138
+ $page = $layout->getBlock('search_result_list');
139
+
140
+ if (!$page)
141
+ return;
142
+
143
+ $block='';
144
+
145
+ foreach ($layout->getAllBlocks() as $child){
146
+ if (!in_array($child->getNameInLayout(), array('catalogsearch.leftnav'))){
147
+ continue;
148
+ }
149
+ $block = $child;
150
+ }
151
+
152
+ if (!$block)
153
+ return;
154
+
155
+ $container = $layout->createBlock('core/template', 'sparx_container');
156
+ //$container->setData('js', $layout->createBlock('core/template', 'ajaxfilter_js')->setTemplate('ajaxfilter/js.phtml')->toHtml());
157
+ $container->setData('block', $block->toHtml());
158
+ $container->setData('page', $page->toHtml());
159
+
160
+ $layout->addOutputBlock('sparx_container', 'toJson');
161
+
162
+ }
163
+
164
+ }
app/code/local/MKMage/LayeredNavigation/Model/Option.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+ class MKMage_LayeredNavigation_Model_Option extends Mage_Core_Model_Abstract {
3
+ protected function _construct() {
4
+ parent::_construct();
5
+ $this->_init('layerednavigation/option');
6
+ }
7
+ }
app/code/local/MKMage/LayeredNavigation/Model/Resource/Catalog/Filter/Attribute.php ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class MKMage_LayeredNavigation_Model_Resource_Catalog_Filter_Attribute extends Mage_Catalog_Model_Resource_Layer_Filter_Attribute
3
+ {
4
+ public function applyFilterToCollection($filter, $value) {
5
+ //modify input value for use in multiselect
6
+ $value = str_replace('_', ',', $value);
7
+
8
+ $collection = $filter->getLayer()->getProductCollection();
9
+ $attribute = $filter->getAttributeModel();
10
+ $connection = $this->_getReadAdapter();
11
+ $tableAlias = $attribute->getAttributeCode() . '_idx';
12
+ $conditions = array(
13
+ "{$tableAlias}.entity_id = e.entity_id",
14
+ $connection->quoteInto("{$tableAlias}.attribute_id = ?", $attribute->getAttributeId()),
15
+ $connection->quoteInto("{$tableAlias}.store_id = ?", $collection->getStoreId()),
16
+ "{$tableAlias}.value IN ({$value})" // use IN collection for multiselect
17
+ );
18
+
19
+ $collection->getSelect()->distinct(true);
20
+
21
+ $collection->getSelect()->join(array(
22
+ $tableAlias => $this->getMainTable()
23
+ ), implode(' AND ', $conditions), array());
24
+ return $this;
25
+ }
26
+
27
+ public function getCount($filter) {
28
+ // clone select from collection with filters
29
+ $select = clone $filter->getLayer()->getProductCollection()->getSelect();
30
+ // reset columns, order and limitation conditions
31
+ $select->reset(Zend_Db_Select::COLUMNS);
32
+ $select->reset(Zend_Db_Select::ORDER);
33
+ $select->reset(Zend_Db_Select::LIMIT_COUNT);
34
+ $select->reset(Zend_Db_Select::LIMIT_OFFSET);
35
+
36
+ $connection = $this->_getReadAdapter();
37
+ $attribute = $filter->getAttributeModel();
38
+ $tableAlias = sprintf('%s_idx', $attribute->getAttributeCode());
39
+ $conditions = array(
40
+ "{$tableAlias}.entity_id = e.entity_id",
41
+ $connection->quoteInto("{$tableAlias}.attribute_id = ?", $attribute->getAttributeId()),
42
+ $connection->quoteInto("{$tableAlias}.store_id = ?", $filter->getStoreId())
43
+ );
44
+
45
+ // exclude attribute join part from select
46
+ $from = $select->getPart(Zend_Db_Select::FROM);
47
+ unset($from[$tableAlias]);
48
+ $select->setPart(Zend_Db_Select::FROM, $from);
49
+
50
+ $select->join(array(
51
+ $tableAlias => $this->getMainTable()
52
+ ), join(' AND ', $conditions), array(
53
+ 'value',
54
+ 'count' => new Zend_Db_Expr("COUNT({$tableAlias}.entity_id)")
55
+ ))->group("{$tableAlias}.value");
56
+
57
+ return $connection->fetchPairs($select);
58
+ }
59
+ }
app/code/local/MKMage/LayeredNavigation/Model/Resource/Catalog/Filter/Price.php ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class MKMage_LayeredNavigation_Model_Resource_Catalog_Filter_Price extends Mage_Catalog_Model_Resource_Layer_Filter_Price
3
+ {
4
+ protected function _getSelect($filter) {
5
+ $collection = $filter->getLayer()->getProductCollection();
6
+ $collection->addPriceData($filter->getCustomerGroupId(), $filter->getWebsiteId());
7
+
8
+ $select = clone $collection->getSelect();
9
+
10
+ // reset columns, order and limitation conditions
11
+ $select->reset(Zend_Db_Select::COLUMNS);
12
+ $select->reset(Zend_Db_Select::ORDER);
13
+ $select->reset(Zend_Db_Select::LIMIT_COUNT);
14
+ $select->reset(Zend_Db_Select::LIMIT_OFFSET);
15
+
16
+ // remove join with main table
17
+ $fromPart = $select->getPart(Zend_Db_Select::FROM);
18
+ if (!isset($fromPart[Mage_Catalog_Model_Resource_Product_Collection::INDEX_TABLE_ALIAS])
19
+ || !isset($fromPart[Mage_Catalog_Model_Resource_Product_Collection::MAIN_TABLE_ALIAS])
20
+ ) {
21
+ return $select;
22
+ }
23
+
24
+ // processing FROM part
25
+ $priceIndexJoinPart = $fromPart[Mage_Catalog_Model_Resource_Product_Collection::INDEX_TABLE_ALIAS];
26
+ $priceIndexJoinConditions = explode('AND', $priceIndexJoinPart['joinCondition']);
27
+ $priceIndexJoinPart['joinType'] = Zend_Db_Select::FROM;
28
+ $priceIndexJoinPart['joinCondition'] = null;
29
+ $fromPart[Mage_Catalog_Model_Resource_Product_Collection::MAIN_TABLE_ALIAS] = $priceIndexJoinPart;
30
+ unset($fromPart[Mage_Catalog_Model_Resource_Product_Collection::INDEX_TABLE_ALIAS]);
31
+ $select->setPart(Zend_Db_Select::FROM, $fromPart);
32
+ foreach ($fromPart as $key => $fromJoinItem) {
33
+ $fromPart[$key]['joinCondition'] = $this->_replaceTableAlias($fromJoinItem['joinCondition']);
34
+ }
35
+ $select->setPart(Zend_Db_Select::FROM, $fromPart);
36
+
37
+ // processing WHERE part
38
+ $wherePart = $select->getPart(Zend_Db_Select::WHERE);
39
+ foreach ($wherePart as $key => $wherePartItem) {
40
+ $wherePart[$key] = $this->_replaceTableAlias($wherePartItem);
41
+ }
42
+ $select->setPart(Zend_Db_Select::WHERE, $wherePart);
43
+ $excludeJoinPart = Mage_Catalog_Model_Resource_Product_Collection::MAIN_TABLE_ALIAS . '.entity_id';
44
+ foreach ($priceIndexJoinConditions as $condition) {
45
+ if (strpos($condition, $excludeJoinPart) !== false) {
46
+ continue;
47
+ }
48
+ $select->where($this->_replaceTableAlias($condition));
49
+ }
50
+ $select->where($this->_getPriceExpression($filter, $select) . ' IS NOT NULL');
51
+
52
+ return $select;
53
+ }
54
+ }
app/code/local/MKMage/LayeredNavigation/Model/Resource/Filter.php ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ <?php
2
+ class MKMage_LayeredNavigation_Model_Resource_Filter extends Mage_Core_Model_Resource_Db_Abstract {
3
+ protected function _construct() {
4
+ $this->_init('layerednavigation/filter', 'id');
5
+ }
6
+ }
app/code/local/MKMage/LayeredNavigation/Model/Resource/Filter/Collection.php ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class MKMage_LayeredNavigation_Model_Resource_Filter_Collection extends Mage_Core_Model_Resource_Db_Collection_Abstract {
3
+ protected function _construct() {
4
+ $this->_init('layerednavigation/filter');
5
+ }
6
+
7
+ public function getDisplayConfigs() {
8
+ $this->addFieldToSelect('attribute_code');
9
+ $this->addFieldToSelect('display_as');
10
+ $connection = Mage::getSingleton('core/resource')->getConnection('core_read');
11
+ return $connection->fetchPairs($this->getSelect());
12
+ }
13
+ }
app/code/local/MKMage/LayeredNavigation/Model/Resource/Option.php ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ <?php
2
+ class MKMage_LayeredNavigation_Model_Resource_Option extends Mage_Core_Model_Resource_Db_Abstract {
3
+ protected function _construct() {
4
+ $this->_init('layerednavigation/option', 'id');
5
+ }
6
+ }
app/code/local/MKMage/LayeredNavigation/Model/Resource/Option/Collection.php ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ <?php
2
+ class MKMage_LayeredNavigation_Model_Resource_Option_Collection extends Mage_Core_Model_Resource_Db_Collection_Abstract {
3
+ protected function _construct() {
4
+ $this->_init('layerednavigation/option');
5
+ }
6
+ }
app/code/local/MKMage/LayeredNavigation/Model/Search/Filter/Attribute.php ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class MKMage_LayeredNavigation_Model_Search_Filter_Attribute extends Mage_CatalogSearch_Model_Layer_Filter_Attribute {
3
+ protected $_appliedValues = array();
4
+
5
+ public function apply(Zend_Controller_Request_Abstract $request, $filterBlock) {
6
+ $filter = $request->getParam($this->_requestVar);
7
+ if (is_array($filter)) {
8
+ return $this;
9
+ }
10
+
11
+ $text = $this->_getOptionText($filter);
12
+ //if ($filter && strlen($text)) { // comment this to allow apply multi value for filter
13
+ if ($filter) {
14
+ $this->_appliedValues = explode('_', $filter);
15
+ //var_dump($this->_appliedValues); die;
16
+ $this->_getResource()->applyFilterToCollection($this, $filter);
17
+ $this->getLayer()->getState()->addFilter($this->_createItem($text, $filter));
18
+ //$this->_items = array(); // prevent filter from hiding when apply to collection
19
+ }
20
+ return $this;
21
+ }
22
+
23
+ protected function _getItemsData() {
24
+ $attribute = $this->getAttributeModel();
25
+ $this->_requestVar = $attribute->getAttributeCode();
26
+
27
+ $key = $this->getLayer()->getStateKey() . '_' . $this->_requestVar;
28
+ $data = $this->getLayer()->getAggregator()->getCacheData($key);
29
+
30
+ if ($data === null) {
31
+ $options = $attribute->getFrontend()->getSelectOptions();
32
+ $optionsCount = $this->_getResource()->getCount($this);
33
+ $data = array();
34
+ foreach ($options as $option) {
35
+ if (is_array($option['value'])) {
36
+ continue;
37
+ }
38
+ if (Mage::helper('core/string')->strlen($option['value'])) {
39
+ // Check filter type
40
+ if ($this->_getIsFilterableAttribute($attribute) == self::OPTIONS_ONLY_WITH_RESULTS) {
41
+ // keep applied options in filter
42
+ if (!empty($optionsCount[$option['value']]) || in_array($option['value'], $this->_appliedValues)) {
43
+ $data[] = array(
44
+ 'label' => $option['label'],
45
+ 'value' => $option['value'],
46
+ 'count' => isset($optionsCount[$option['value']]) ? $optionsCount[$option['value']] : 0 // product count fix
47
+ );
48
+ }
49
+ } else {
50
+ $data[] = array(
51
+ 'label' => $option['label'],
52
+ 'value' => $option['value'],
53
+ 'count' => isset($optionsCount[$option['value']]) ? $optionsCount[$option['value']] : 0
54
+ );
55
+ }
56
+ }
57
+ }
58
+
59
+ $tags = array(
60
+ Mage_Eav_Model_Entity_Attribute::CACHE_TAG . ':' . $attribute->getId()
61
+ );
62
+
63
+ $tags = $this->getLayer()->getStateTags($tags);
64
+ $this->getLayer()->getAggregator()->saveCacheData($data, $key, $tags);
65
+ }
66
+ return $data;
67
+ }
68
+ }
app/code/local/MKMage/LayeredNavigation/Model/Search/Layer.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class MKMage_LayeredNavigation_Model_Search_Layer extends Mage_CatalogSearch_Model_Layer
3
+ {
4
+ public function getFilterableAttributes() {
5
+ /*
6
+ $setIds = $this->_getSetIds();
7
+ if (!$setIds) {
8
+ return array();
9
+ }
10
+ */
11
+
12
+ $collection = Mage::getResourceModel('catalog/product_attribute_collection');
13
+ $collection->setItemObjectClass('catalog/resource_eav_attribute')
14
+ //->setAttributeSetFilter($setIds)
15
+ ->addStoreLabel(Mage::app()->getStore()->getId())->setOrder('position', 'ASC');
16
+ $collection = $this->_prepareAttributeCollection($collection);
17
+ $collection->load();
18
+
19
+ return $collection;
20
+ }
21
+ }
app/code/local/MKMage/LayeredNavigation/etc/config.xml ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <modules>
4
+ <MKMage_LayeredNavigation>
5
+ <version>0.1.0</version>
6
+ </MKMage_LayeredNavigation>
7
+ </modules>
8
+ <renderer>false</renderer>
9
+ <global>
10
+ <blocks>
11
+ <layerednavigation>
12
+ <class>MKMage_LayeredNavigation_Block</class>
13
+ </layerednavigation>
14
+ <catalog>
15
+ <rewrite>
16
+ <layer_filter_price>MKMage_LayeredNavigation_Block_Layer_Filter_Price</layer_filter_price>
17
+ </rewrite>
18
+ </catalog>
19
+ </blocks>
20
+ <models>
21
+ <layerednavigation>
22
+ <class>MKMage_LayeredNavigation_Model</class>
23
+ </layerednavigation>
24
+ </models>
25
+ <helpers>
26
+ <layerednavigation>
27
+ <class>MKMage_LayeredNavigation_Helper</class>
28
+ </layerednavigation>
29
+ </helpers>
30
+ <events>
31
+ <controller_front_init_before>
32
+ <observers>
33
+ <layerednavigation>
34
+ <type>singleton</type>
35
+ <class>MKMage_LayeredNavigation_Model_Observer</class>
36
+ <method>checkIfActive</method>
37
+ </layerednavigation>
38
+ </observers>
39
+ </controller_front_init_before>
40
+ <admin_system_config_changed_section_mkmage_layerednavigation>
41
+ <observers>
42
+ <layerednavigation>
43
+ <type>singleton</type>
44
+ <class>MKMage_LayeredNavigation_Model_Observer</class>
45
+ <method>validateSystemSettings</method>
46
+ </layerednavigation>
47
+ </observers>
48
+ </admin_system_config_changed_section_mkmage_layerednavigation>
49
+ <controller_action_layout_render_before_catalog_category_view>
50
+ <observers>
51
+ <mkmage_layerednavigation_ajax_filters>
52
+ <type>singleton</type>
53
+ <class>MKMage_LayeredNavigation_Model_Observer</class>
54
+ <method>initCategoryAjax</method>
55
+ </mkmage_layerednavigation_ajax_filters>
56
+ </observers>
57
+ </controller_action_layout_render_before_catalog_category_view>
58
+ <controller_action_layout_render_before_catalogsearch_result_index>
59
+ <observers>
60
+ <mkmage_layerednavigation_ajax_filters_search>
61
+ <type>singleton</type>
62
+ <class>MKMage_LayeredNavigation_Model_Observer</class>
63
+ <method>initSearchAjax</method>
64
+ </mkmage_layerednavigation_ajax_filters_search>
65
+ </observers>
66
+ </controller_action_layout_render_before_catalogsearch_result_index>
67
+ </events>
68
+ </global>
69
+ <adminhtml>
70
+ <layout>
71
+ <updates>
72
+ <layerednavigation>
73
+ <file>mkmage/layerednavigation.xml</file>
74
+ </layerednavigation>
75
+ </updates>
76
+ </layout>
77
+ <acl>
78
+ <resources>
79
+ <all>
80
+ <title>Allow Everything</title>
81
+ </all>
82
+ <admin>
83
+ <children>
84
+ <system>
85
+ <children>
86
+ <config>
87
+ <children>
88
+ <mkmage_layerednavigation>
89
+ <title>Layered Navigation</title>
90
+ </mkmage_layerednavigation>
91
+ </children>
92
+ </config>
93
+ </children>
94
+ </system>
95
+ </children>
96
+ </admin>
97
+ </resources>
98
+ </acl>
99
+ </adminhtml>
100
+ <default>
101
+ <mkmage_layerednavigation>
102
+ <mkmage_layerednavigation_general>
103
+ <email_sent>0</email_sent>
104
+ </mkmage_layerednavigation_general>
105
+ <mkmage_layerednavigation_display>
106
+ <filter_color>7f7f7f</filter_color>
107
+ </mkmage_layerednavigation_display>
108
+ <mkmage_layerednavigation_display>
109
+ <filter_color_active>363636</filter_color_active>
110
+ </mkmage_layerednavigation_display>
111
+ </mkmage_layerednavigation>
112
+ </default>
113
+ </config>
app/code/local/MKMage/LayeredNavigation/etc/system.xml ADDED
@@ -0,0 +1,118 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <config>
3
+ <sections>
4
+ <mkmage_layerednavigation translate="label" module="layerednavigation">
5
+ <label>Layered Navigation</label>
6
+ <tab>mkmage</tab>
7
+ <sort_order>2000</sort_order>
8
+ <show_in_default>1</show_in_default>
9
+ <show_in_website>1</show_in_website>
10
+ <show_in_store>1</show_in_store>
11
+ <groups>
12
+ <mkmage_layerednavigation_general translate="label" module="layerednavigation">
13
+ <label>General</label>
14
+ <frontend_type>text</frontend_type>
15
+ <comment>
16
+ <![CDATA[
17
+ <style>#row_mkmage_layerednavigation_mkmage_layerednavigation_general_email_sent{display:none;}</style>
18
+ ]]>
19
+ </comment>
20
+ <sort_order>1000</sort_order>
21
+ <show_in_default>1</show_in_default>
22
+ <show_in_website>1</show_in_website>
23
+ <show_in_store>1</show_in_store>
24
+ <fields>
25
+ <email translate="label">
26
+ <label>Register extension</label>
27
+ <frontend_type>text</frontend_type>
28
+ <validate>validate-email</validate>
29
+ <comment>Enter email to register your extension</comment>
30
+ <!--<backend_model>adminhtml/system_config_backend_email_address</backend_model>-->
31
+ <sort_order>1</sort_order>
32
+ <show_in_default>1</show_in_default>
33
+ <show_in_website>1</show_in_website>
34
+ <show_in_store>1</show_in_store>
35
+ </email>
36
+ <email_sent translate="label">
37
+ <frontend_type>hidden</frontend_type>
38
+ <sort_order>1</sort_order>
39
+ <show_in_default>1</show_in_default>
40
+ <show_in_website>1</show_in_website>
41
+ <show_in_store>1</show_in_store>
42
+ </email_sent>
43
+ <layerednavigation_enabled translate="label">
44
+ <label>Enable extension</label>
45
+ <frontend_type>select</frontend_type>
46
+ <source_model>adminhtml/system_config_source_yesno</source_model>
47
+ <sort_order>2</sort_order>
48
+ <show_in_default>1</show_in_default>
49
+ <show_in_website>1</show_in_website>
50
+ <show_in_store>1</show_in_store>
51
+ </layerednavigation_enabled>
52
+ </fields>
53
+ </mkmage_layerednavigation_general>
54
+ <mkmage_layerednavigation_display translate="label" module="layerednavigation">
55
+ <label>Display options</label>
56
+ <frontend_type>text</frontend_type>
57
+ <sort_order>2000</sort_order>
58
+ <show_in_default>1</show_in_default>
59
+ <show_in_website>1</show_in_website>
60
+ <show_in_store>1</show_in_store>
61
+ <fields>
62
+ <catalogsearch_enable translate="label">
63
+ <label>Enable extension on search results</label>
64
+ <frontend_type>select</frontend_type>
65
+ <source_model>adminhtml/system_config_source_yesno</source_model>
66
+ <sort_order>1</sort_order>
67
+ <show_in_default>1</show_in_default>
68
+ <show_in_website>1</show_in_website>
69
+ <show_in_store>1</show_in_store>
70
+ </catalogsearch_enable>
71
+ <price_slider_enable translate="label">
72
+ <label>Enable price slider</label>
73
+ <frontend_type>select</frontend_type>
74
+ <source_model>adminhtml/system_config_source_yesno</source_model>
75
+ <comment>Enable price slider on layered navigation.</comment>
76
+ <sort_order>2</sort_order>
77
+ <show_in_default>1</show_in_default>
78
+ <show_in_website>1</show_in_website>
79
+ <show_in_store>1</show_in_store>
80
+ </price_slider_enable>
81
+ <loader_image translate="label" module="layerednavigation">
82
+ <label>Loader image</label>
83
+ <frontend_type>image</frontend_type>
84
+ <backend_model>adminhtml/system_config_backend_image</backend_model>
85
+ <upload_dir config="system/filesystem/media" scope_info="1">theme</upload_dir>
86
+ <base_url type="media" scope_info="1">theme</base_url>
87
+ <sort_order>3</sort_order>
88
+ <show_in_default>1</show_in_default>
89
+ <show_in_website>1</show_in_website>
90
+ <show_in_store>1</show_in_store>
91
+ <comment>Press "Save Config" (upper right button) to upload the image file</comment>
92
+ </loader_image>
93
+ <filter_color>
94
+ <label>Filter color</label>
95
+ <frontend_type>text</frontend_type>
96
+ <validate>color</validate> <!-- This is important -->
97
+ <sort_order>4</sort_order>
98
+ <show_in_default>1</show_in_default>
99
+ <show_in_website>1</show_in_website>
100
+ <show_in_store>1</show_in_store>
101
+ <comment>Specify the filter color.</comment>
102
+ </filter_color>
103
+ <filter_color_active>
104
+ <label>Filter color (active)</label>
105
+ <frontend_type>text</frontend_type>
106
+ <validate>color</validate> <!-- This is important -->
107
+ <sort_order>5</sort_order>
108
+ <show_in_default>1</show_in_default>
109
+ <show_in_website>1</show_in_website>
110
+ <show_in_store>1</show_in_store>
111
+ <comment>Specify the color of the active filters.</comment>
112
+ </filter_color_active>
113
+ </fields>
114
+ </mkmage_layerednavigation_display>
115
+ </groups>
116
+ </mkmage_layerednavigation>
117
+ </sections>
118
+ </config>
app/code/local/MKMage/Mkcore/.DS_Store ADDED
Binary file
app/code/local/MKMage/Mkcore/Block/.DS_Store ADDED
Binary file
app/code/local/MKMage/Mkcore/Block/Mkcore.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+ class MKMage_Mkcore_Block_Mkcore extends Mage_Core_Block_Template
3
+ {
4
+
5
+ }
app/code/local/MKMage/Mkcore/Helper/.DS_Store ADDED
Binary file
app/code/local/MKMage/Mkcore/Helper/Data.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+ class MKMage_Mkcore_Helper_Data extends Mage_Core_Helper_Data
3
+ {
4
+
5
+ }
app/code/local/MKMage/Mkcore/etc/.DS_Store ADDED
Binary file
app/code/local/MKMage/Mkcore/etc/config.xml ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <modules>
4
+ <MKMage_Mkcore>
5
+ <version>0.1.0</version>
6
+ </MKMage_Mkcore>
7
+ </modules>
8
+ <global>
9
+ <blocks>
10
+ <mkcore>
11
+ <class>MKMage_Mkcore_Block</class>
12
+ </mkcore>
13
+ </blocks>
14
+ <helpers>
15
+ <mkcore>
16
+ <class>MKMage_Mkcore_Helper</class>
17
+ </mkcore>
18
+ </helpers>
19
+ </global>
20
+ <adminhtml>
21
+ <acl>
22
+ <resources>
23
+ <all>
24
+ <title>Allow Everything</title>
25
+ </all>
26
+ <admin>
27
+ <children>
28
+ <system>
29
+ <children>
30
+ <config>
31
+ <children>
32
+ <mkmage>
33
+ <title>MKMage - All</title>
34
+ </mkmage>
35
+ </children>
36
+ </config>
37
+ </children>
38
+ </system>
39
+ </children>
40
+ </admin>
41
+ </resources>
42
+ </acl>
43
+ </adminhtml>
44
+ </config>
app/code/local/MKMage/Mkcore/etc/system.xml ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <config>
3
+ <tabs>
4
+ <mkmage translate="label" module="mkcore">
5
+ <label><![CDATA[<div style="position: absolute;"><img id="mkmage_block" src="" alt="" border="0" /></div>&nbsp;<script>
6
+ var n = SKIN_URL.indexOf("adminhtml");
7
+ $('mkmage_block').src = SKIN_URL.substring(0, n) + "/adminhtml/default/default/mkcore.png";
8
+ </script>]]></label>
9
+ <sort_order>100</sort_order>
10
+ </mkmage>
11
+ </tabs>
12
+ </config>
app/design/adminhtml/default/default/layout/mkmage/layerednavigation.xml ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <layout version="0.1.1">
3
+ <adminhtml_system_config_edit>
4
+ <reference name="head">
5
+ <action method="addJs"><file>jscolor/jscolor.js</file></action>
6
+ </reference>
7
+ </adminhtml_system_config_edit>
8
+ </layout>
app/design/frontend/base/default/layout/mkmage/layerednavigation.xml ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+
3
+ <layout version="0.1.0">
4
+
5
+ <catalog_category_layered>
6
+
7
+ <reference name="head">
8
+ <action method="addItem">
9
+ <type>skin_js</type>
10
+ <name>js/mkmage/layerednavigation/jquery-ui.min.js</name>
11
+ <params><![CDATA[data-group="js001"]]></params>
12
+ </action>
13
+ <action method="addItem">
14
+ <type>skin_js</type>
15
+ <name>js/mkmage/layerednavigation/layered.js</name>
16
+ <params><![CDATA[data-group="js002" defer]]></params>
17
+ </action>
18
+ <action method="addItem">
19
+ <type>skin_css</type>
20
+ <name>css/mkmage/layerednavigation/jquery-ui.css</name>
21
+ </action>
22
+ <action method="addItem">
23
+ <type>skin_css</type>
24
+ <name>css/mkmage/layerednavigation/layerednavigation.css</name>
25
+ </action>
26
+ </reference>
27
+
28
+ <reference name="catalog.leftnav">
29
+ <action method="setTemplate"><template>mkmage/layerednavigation/view.phtml</template></action>
30
+ </reference>
31
+
32
+ <reference name="before_body_end">
33
+ <block type="core/template" name="mkmage_loader" template="mkmage/layerednavigation/loader.phtml" />
34
+ </reference>
35
+
36
+ </catalog_category_layered>
37
+
38
+ <catalogsearch_result_index>
39
+
40
+ <reference name="head">
41
+ <action method="addItem" ifconfig="mkmage_layerednavigation/mkmage_layerednavigation_display/catalogsearch_enable">
42
+ <type>skin_js</type>
43
+ <name>js/mkmage/layerednavigation/jquery-ui.min.js</name>
44
+ <params><![CDATA[data-group="js001"]]></params>
45
+ </action>
46
+ <action method="addItem" ifconfig="mkmage_layerednavigation/mkmage_layerednavigation_display/catalogsearch_enable">
47
+ <type>skin_js</type>
48
+ <name>js/mkmage/layerednavigation/layered.js</name>
49
+ <params><![CDATA[data-group="js002" defer]]></params>
50
+ </action>
51
+ <action method="addItem" ifconfig="mkmage_layerednavigation/mkmage_layerednavigation_display/catalogsearch_enable">
52
+ <type>skin_css</type>
53
+ <name>css/mkmage/layerednavigation/jquery-ui.css</name>
54
+ </action>
55
+ <action method="addItem" ifconfig="mkmage_layerednavigation/mkmage_layerednavigation_display/catalogsearch_enable">
56
+ <type>skin_css</type>
57
+ <name>css/mkmage/layerednavigation/layerednavigation.css</name>
58
+ </action>
59
+ </reference>
60
+
61
+ <reference name="catalogsearch.leftnav">
62
+ <action method="setTemplate" ifconfig="mkmage_layerednavigation/mkmage_layerednavigation_display/catalogsearch_enable"><template>mkmage/layerednavigation/view.phtml</template></action>
63
+ </reference>
64
+
65
+ <reference name="before_body_end">
66
+ <block type="core/template" name="mkmage_loader">
67
+ <action method="setTemplate" ifconfig="mkmage_layerednavigation/mkmage_layerednavigation_display/catalogsearch_enable"><template>mkmage/layerednavigation/loader.phtml</template></action>
68
+ </block>
69
+ </reference>
70
+
71
+ </catalogsearch_result_index>
72
+
73
+ </layout>
app/design/frontend/base/default/template/mkmage/layerednavigation/filter.phtml ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php $showPriceSlider = Mage::helper('layerednavigation')->getIsPriceSliderEnabled() ?>
2
+
3
+ <?php $filterType = $this->getType() ?>
4
+ <?php if ($filterType != 'catalog/layer_filter_price'): ?>
5
+ <ol>
6
+ <?php foreach ($this->getItems() as $_item): ?>
7
+ <li class="<?php echo $_item->isSelected() ? 'filter-active' : 'filter-inactive' ?>">
8
+ <?php if ($_item->getCount() > 0): ?>
9
+ <a href="<?php echo $this->urlEscape($_item->getUrl()) ?>">
10
+ <span class="filter-checkbox">
11
+ <?php if($_item->isSelected()): ?><i class="fa fa-check"></i><?php endif; ?>
12
+ </span>
13
+ <span class="filter-label"><?php echo $_item->getLabel() ?></span>
14
+ </a>
15
+ <?php else: echo $_item->getLabel() ?>
16
+ <?php endif; ?>
17
+ <?php if ($this->shouldDisplayProductCount()): ?>
18
+ <span class="filter-count">(<?php echo $_item->getCount() ?>)</span>
19
+ <?php endif; ?>
20
+ </li>
21
+ <?php endforeach ?>
22
+ </ol>
23
+ <?php else: ?>
24
+
25
+ <?php if(!$showPriceSlider): ?>
26
+
27
+ <ol>
28
+ <?php foreach ($this->getItems() as $_item): ?>
29
+ <li class="<?php echo $_item->isSelected() ? 'filter-active' : 'filter-inactive' ?>">
30
+ <?php if ($_item->getCount() > 0): ?>
31
+ <a href="<?php echo $this->urlEscape($_item->getUrl()) ?>">
32
+ <span class="filter-checkbox">
33
+ <?php if($_item->isSelected()): ?><i class="fa fa-check"></i><?php endif; ?>
34
+ </span>
35
+ <span class="filter-label"><?php echo $_item->getLabel() ?></span>
36
+ </a>
37
+ <?php else: echo $_item->getLabel() ?>
38
+ <?php endif; ?>
39
+ <?php if ($this->shouldDisplayProductCount()): ?>
40
+ <span class="filter-count">(<?php echo $_item->getCount() ?>)</span>
41
+ <?php endif; ?>
42
+ </li>
43
+ <?php endforeach ?>
44
+ </ol>
45
+
46
+ <?php else: ?>
47
+
48
+ <?php
49
+ $priceMin = $this->getPriceFilterMin(); $priceMax = $this->getPriceFilterMax();
50
+
51
+ if (!is_null($priceMin) && !empty($priceMin)) {
52
+ $minPrice = $this->getPriceFilterMin();
53
+ } else {
54
+ if (Mage::registry('current_category')) {
55
+ $minPrice=Mage::getSingleton('catalog/layer')->setCurrentCategory(Mage::registry('current_category'))->getProductCollection()->getMinPrice();
56
+ } else {
57
+ $minPrice=$this->getLayer()->getProductCollection()->getMinPrice();
58
+ }
59
+ }
60
+ if (!is_null($priceMax) && !empty($priceMax)) {
61
+ $maxPrice = $this->getPriceFilterMax();
62
+ } else {
63
+ if (Mage::registry('current_category')) {
64
+ $maxPrice=Mage::getSingleton('catalog/layer')->setCurrentCategory(Mage::registry('current_category'))->getProductCollection()->getMaxPrice();
65
+ } else {
66
+ $maxPrice=$this->getLayer()->getProductCollection()->getMaxPrice();
67
+ }
68
+ }
69
+ ?>
70
+
71
+ <?php $i = 0; foreach ($this->getItems() as $_item): ?>
72
+ <?php if($i > 0) {continue;} $url = $_item->getUrl(); $pattern = "/([\\?&])price=(.*)([\\?&]*)/";; $filterUrl = preg_replace($pattern, '${1}', $url); $i++;?>
73
+ <?php endforeach ?>
74
+
75
+ <div class="pfilter">
76
+ <input type="hidden" id="price-filter-url" value="<?php echo $filterUrl ?>">
77
+ <input type="hidden" id="price-filter-min" value="<?php echo $minPrice; ?>">
78
+ <input type="hidden" id="price-filter-max" value="<?php echo $maxPrice; ?>">
79
+ <?php if (Mage::registry('current_category')): ?>
80
+ <input type="hidden" id="original-price-filter-min" value="<?php echo $minPrice=Mage::getSingleton('catalog/layer')->setCurrentCategory(Mage::registry('current_category'))->getProductCollection()->getMinPrice(); ?> ">
81
+ <input type="hidden" id="original-price-filter-max" value="<?php echo $maxPrice=Mage::getSingleton('catalog/layer')->setCurrentCategory(Mage::registry('current_category'))->getProductCollection()->getMaxPrice(); ?> ">
82
+ <?php else: ?>
83
+ <input type="hidden" id="original-price-filter-min" value="<?php echo $minPrice=$this->getLayer()->getProductCollection()->getMinPrice(); ?> ">
84
+ <input type="hidden" id="original-price-filter-max" value="<?php echo $maxPrice=$this->getLayer()->getProductCollection()->getMaxPrice(); ?> ">
85
+ <?php endif; ?>
86
+
87
+ <div id="slider-range" >
88
+ <div class="ui-slider-range ui-widget-header ui-corner-all" ></div>
89
+ <span class="ui-slider-handle ui-state-default ui-corner-all" tabindex="0"></span>
90
+ <span class="ui-slider-handle ui-state-default ui-corner-all" tabindex="0"></span>
91
+ </div>
92
+ <div id="slider-range-vals">
93
+ <p>Price: <span id="price_from"></span> - <span id="price_to"></span></p>
94
+ </div>
95
+ </div>
96
+
97
+ <?php endif; ?>
98
+
99
+ <?php endif; ?>
100
+
app/design/frontend/base/default/template/mkmage/layerednavigation/loader.phtml ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $imgSrc = !empty(Mage::helper('layerednavigation')->getLoaderUrl()) ? Mage::helper('layerednavigation')->getLoaderUrl() : $this->getSkinUrl('images/mkmage/layerednavigation/rolling.svg');
3
+ ?>
4
+
5
+ <div class="mkmage-overlay"></div>
6
+ <div class="mkmage-loader">
7
+ <img width="60" height="60" src="<?php echo $imgSrc ?>" />
8
+ </div>
app/design/frontend/base/default/template/mkmage/layerednavigation/state.phtml ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php $_filters = $this->getActiveFilters() ?>
2
+ <?php if(!empty($_filters)): ?>
3
+ <div class="currently">
4
+ <p class="block-subtitle"><?php echo $this->__('Filtered By') ?></p>
5
+ <ol>
6
+ <?php foreach ($_filters as $_filter): ?>
7
+ <li>
8
+ <div class="active-filter-wrapper">
9
+ <?php $vals = explode("_",$_filter->getValue()); ?>
10
+
11
+ <?php if(count($vals) > 1): ?>
12
+ <?php $filterVal = ''; foreach($vals as $val): ?>
13
+ <?php $filterVals = $_filter->getFilter()->getFIlterAppliedValues(); $filterOptions = $_filter->getFilter()->getFilterOptionValues() ?>
14
+ <?php $filterVal .= $filterOptions[$val] . ", "; ?>
15
+ <?php endforeach; ?>
16
+ <span class="label"><?php echo $this->__($_filter->getName()) ?>:</span> <span class="value"><?php echo substr(trim($filterVal), 0, -1) ?></span>
17
+ <?php else: ?>
18
+ <span class="label"><?php echo $this->__($_filter->getName()) ?>:</span> <span class="value"><?php echo $this->stripTags($_filter->getLabel()) ?></span>
19
+ <?php endif; ?>
20
+ <?php
21
+ $clearLinkUrl = $_filter->getClearLinkUrl();
22
+ if ($clearLinkUrl):
23
+ ?>
24
+ <a class="btn-previous" href="<?php echo $_filter->getRemoveUrl() ?>" title="<?php echo $this->__('Previous') ?>"><?php echo $this->__('Previous') ?></a>
25
+ <a class="btn-remove" title="<?php echo $this->escapeHtml($_filter->getFilter()->getClearLinkText()) ?>" href="<?php echo $clearLinkUrl ?>"><?php echo $this->escapeHtml($_filter->getFilter()->getClearLinkText()) ?></a>
26
+ <?php else: ?>
27
+ <a class="btn-remove" href="<?php echo $_filter->getRemoveUrl() ?>" title="<?php echo Mage::helper('core')->quoteEscape($this->__('Remove This Item')) ?>"><?php echo $this->__('Remove This Item') ?></a>
28
+ <?php endif; ?>
29
+ </div>
30
+ </li>
31
+ <?php endforeach; ?>
32
+ </ol>
33
+ </div>
34
+ <?php endif; ?>
app/design/frontend/base/default/template/mkmage/layerednavigation/view.phtml ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php if($this->canShowBlock()): ?>
2
+ <style>
3
+ .catalog-category-view #narrow-by-list li span.filter-label,
4
+ .catalog-category-view #narrow-by-list li span.filter-count,
5
+ .catalog-category-view #narrow-by-list .pfilter #slider-range-vals{
6
+ color: #<?php echo Mage::getStoreConfig('mkmage_layerednavigation/mkmage_layerednavigation_display/filter_color',Mage::app()->getStore()) ?>;
7
+ }
8
+ .catalog-category-view #narrow-by-list li.filter-active span.filter-label,
9
+ .catalog-category-view #narrow-by-list li.filter-active span.filter-count{
10
+ color: #<?php echo Mage::getStoreConfig('mkmage_layerednavigation/mkmage_layerednavigation_display/filter_color_active',Mage::app()->getStore()) ?>;
11
+ }
12
+ </style>
13
+ <div class="block block-layered-nav">
14
+ <div class="block-title">
15
+ <strong><span><?php echo $this->__('Shop By') ?></span></strong>
16
+ </div>
17
+ <div class="block-content">
18
+ <?php echo $this->getStateHtml() ?>
19
+ <?php if ($this->getLayer()->getState()->getFilters()): ?>
20
+ <div class="actions"><a href="<?php echo $this->getClearUrl() ?>"><?php echo $this->__('Clear All') ?></a></div>
21
+ <?php endif; ?>
22
+ <?php if($this->canShowOptions()): ?>
23
+ <dl id="narrow-by-list">
24
+ <?php $_filters = $this->getFilters() ?>
25
+ <?php foreach ($_filters as $_filter): ?>
26
+ <?php if($_filter->getItemsCount() > 0): ?>
27
+ <dt><?php echo $this->__($_filter->getName()) ?><span class="glyphicon glyphicon-chevron-up" id="glyph"></span></dt>
28
+ <dd><?php $_filter->setTemplate('mkmage/layerednavigation/filter.phtml'); echo $_filter->getHtml() ?></dd>
29
+ <?php endif; ?>
30
+ <?php endforeach; ?>
31
+ </dl>
32
+ <script type="text/javascript">decorateDataList('narrow-by-list')</script>
33
+ <?php endif; ?>
34
+ </div>
35
+ </div>
36
+ <?php endif; ?>
app/etc/modules/MKMage_LayeredNavigation.xml ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <modules>
4
+ <MKMage_LayeredNavigation>
5
+ <active>true</active>
6
+ <codePool>local</codePool>
7
+ <depends>
8
+ <Mage_Catalog />
9
+ </depends>
10
+ </MKMage_LayeredNavigation>
11
+ </modules>
12
+ </config>
app/etc/modules/MKMage_Mkcore.xml ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <modules>
4
+ <MKMage_Mkcore>
5
+ <active>true</active>
6
+ <codePool>local</codePool>
7
+ </MKMage_Mkcore>
8
+ </modules>
9
+ </config>
package.xml ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <package>
3
+ <name>MKMage_LayeredNavigation</name>
4
+ <version>0.1.0</version>
5
+ <stability>stable</stability>
6
+ <license>Open Software License (OSL)</license>
7
+ <channel>community</channel>
8
+ <extends/>
9
+ <summary>Improve the Layered Navigation for your store with an Ajax-powered one.</summary>
10
+ <description>Replace the classical Layered Navigation with an AJAX-powered one for faster loading. Your customers can effortlessly filter down and switch layouts without page reloads. Designed to optimize and improve the navigation of your online Magento store, AJAX navigation allows better searching experience for your store visitors. This Layered Navigation extension is the perfect way to boost your website's performance.&#xD;
11
+ </description>
12
+ <notes>MkMage AJAX Layered Navigation extension provides options for multi-select, price filters and sliders, defining basic style.</notes>
13
+ <authors><author><name>MKMage</name><user>mkmage</user><email>support@mkmage.com</email></author></authors>
14
+ <date>2016-04-01</date>
15
+ <time>18:43:33</time>
16
+ <contents><target name="magelocal"><dir name="MKMage"><dir name="LayeredNavigation"><dir name="Block"><dir name="Layer"><dir name="Filter"><file name="Price.php" hash="4fbd979a9c2aa360b0c3d5b17dc1ad8d"/></dir><file name=".DS_Store" hash="194577a7e20bdcc7afbb718f502c134c"/></dir></dir><dir name="Helper"><file name="Data.php" hash="aa31258bdb3d601d710700886616953c"/></dir><dir name="Model"><dir name="Catalog"><dir name="Filter"><file name="Attribute.php" hash="95b2f8a56d380aed61a6459035c35dcf"/><file name="Category.php" hash="258eeb090921f45a70a2a8ea0f02e8fd"/><file name="Item.php" hash="08d5cd0b1580b5c67910274be1eff76d"/><file name="Price.php" hash="2134b313b3059fa3b9e2a3bfa9c55c0f"/></dir><file name="Layer.php" hash="7494a373fef233d603afeaa63c2b4706"/></dir><file name="Filter.php" hash="17540939a9495127a05f5dd423f2b409"/><file name="Observer.php" hash="a79eac53727a933d7f1b04cb85554ea2"/><file name="Option.php" hash="fa8db003eb84a13ec1f1377465799698"/><dir name="Resource"><dir name="Catalog"><dir name="Filter"><file name="Attribute.php" hash="c4f31cf0434e8b5207611e40dcabbd13"/><file name="Price.php" hash="1861c84bb1e4a9669138d601bbcbd2d2"/></dir></dir><dir name="Filter"><file name="Collection.php" hash="6cc131b01874fc7a508cb1c1bf2a7ef4"/></dir><file name="Filter.php" hash="4dc40b759c6dd8e674c842605dd798bd"/><dir name="Option"><file name="Collection.php" hash="87a8650612e306798b1b71022e366c91"/></dir><file name="Option.php" hash="3c221c3fd26e38f68fd35f853411858d"/></dir><dir name="Search"><dir name="Filter"><file name="Attribute.php" hash="82a9462edbe54335afee48d51f56a4aa"/></dir><file name="Layer.php" hash="de9413221b083f28b98fb3b3a270b25a"/></dir></dir><dir name="etc"><file name="config.xml" hash="b07f024e8e1166f56005a3f8b48403eb"/><file name="system.xml" hash="8909cfc9c17e99502a7357fe724b680a"/></dir><file name=".DS_Store" hash="303a125d64e9f5fa047d43db1e836856"/></dir><dir name="Mkcore"><dir name="Block"><file name="Mkcore.php" hash="b185e6c5d805b706bf9aec042cc99de3"/><file name=".DS_Store" hash="194577a7e20bdcc7afbb718f502c134c"/></dir><dir name="Helper"><file name="Data.php" hash="c5bffa704efaa08a27ef3616b74d707e"/><file name=".DS_Store" hash="194577a7e20bdcc7afbb718f502c134c"/></dir><dir name="etc"><file name="config.xml" hash="83af6b9387931b0314c5df272422cae2"/><file name="system.xml" hash="164cd51bff905833ab0d3b39033cdc89"/><file name=".DS_Store" hash="194577a7e20bdcc7afbb718f502c134c"/></dir><file name=".DS_Store" hash="390f4f2167be77fc07146bfa6acf338b"/></dir><file name=".DS_Store" hash="194577a7e20bdcc7afbb718f502c134c"/></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><dir name="mkmage"><file name="layerednavigation.xml" hash="07aa7ba43d28a9ed015e43edd2a9e3cd"/></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><dir name="mkmage"><file name="layerednavigation.xml" hash="46b418a19a6aa4cf9c9d9f1994caa943"/></dir></dir><dir name="template"><dir name="mkmage"><dir name="layerednavigation"><file name="filter.phtml" hash="ff293906f40205fd2e8c4fde08729deb"/><file name="loader.phtml" hash="345a88cd4361f75d8e4ea7d1baf868a8"/><file name="state.phtml" hash="129d6d79d1e607ba30d9a4b4414b80e5"/><file name="view.phtml" hash="cecb2ad66a6832b3eadc00cd691bf272"/></dir></dir></dir></dir></dir></dir></target><target name="mageskin"><dir name="adminhtml"><dir name="default"><dir name="default"><file name="mkcore.png" hash="de2e975210a34a30c717e549d212b739"/></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="css"><dir name="mkmage"><dir name="layerednavigation"><file name="jquery-ui.css" hash="da512109d985611cb6ad45c8ab0b1ac5"/><file name="layerednavigation.css" hash="6b3a7fe6c28e17fd88d5d0576a4e8de2"/></dir></dir></dir><dir name="js"><dir name="mkmage"><dir name="layerednavigation"><file name="jquery-ui.min.js" hash="d935d506ae9c8dd9e0f96706fbb91f65"/><file name="layered.js" hash="c816c66225704b9a3b591dc2c96d171d"/><file name="price-slider.js" hash="04a4db2983450a2970c459ba87b4210a"/></dir></dir></dir><dir name="images"><dir name="mkmage"><dir name="layerednavigation"><file name="rolling.svg" hash="fae9f99e39cbec84010d228da536ce1a"/></dir></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="MKMage_Mkcore.xml" hash="9d4a95fc4e27a2d67eb91ed6312141e4"/><file name="MKMage_LayeredNavigation.xml" hash="52a74bd08beb49cfa01739d64eb83002"/></dir></target></contents>
17
+ <compatible/>
18
+ <dependencies><required><php><min>5.1.0</min><max>6.0.0</max></php></required></dependencies>
19
+ </package>
skin/adminhtml/default/default/mkcore.png ADDED
Binary file
skin/frontend/base/default/css/mkmage/layerednavigation/jquery-ui.css ADDED
@@ -0,0 +1,1217 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*! jQuery UI - v1.11.4 - 2015-03-11
2
+ * http://jqueryui.com
3
+ * Includes: core.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, draggable.css, menu.css, progressbar.css, resizable.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
4
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
5
+ * Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */
6
+
7
+ /* Layout helpers
8
+ ----------------------------------*/
9
+ .ui-helper-hidden {
10
+ display: none;
11
+ }
12
+ .ui-helper-hidden-accessible {
13
+ border: 0;
14
+ clip: rect(0 0 0 0);
15
+ height: 1px;
16
+ margin: -1px;
17
+ overflow: hidden;
18
+ padding: 0;
19
+ position: absolute;
20
+ width: 1px;
21
+ }
22
+ .ui-helper-reset {
23
+ margin: 0;
24
+ padding: 0;
25
+ border: 0;
26
+ outline: 0;
27
+ line-height: 1.3;
28
+ text-decoration: none;
29
+ font-size: 100%;
30
+ list-style: none;
31
+ }
32
+ .ui-helper-clearfix:before,
33
+ .ui-helper-clearfix:after {
34
+ content: "";
35
+ display: table;
36
+ border-collapse: collapse;
37
+ }
38
+ .ui-helper-clearfix:after {
39
+ clear: both;
40
+ }
41
+ .ui-helper-clearfix {
42
+ min-height: 0; /* support: IE7 */
43
+ }
44
+ .ui-helper-zfix {
45
+ width: 100%;
46
+ height: 100%;
47
+ top: 0;
48
+ left: 0;
49
+ position: absolute;
50
+ opacity: 0;
51
+ filter:Alpha(Opacity=0); /* support: IE8 */
52
+ }
53
+
54
+ .ui-front {
55
+ z-index: 100;
56
+ }
57
+
58
+
59
+ /* Interaction Cues
60
+ ----------------------------------*/
61
+ .ui-state-disabled {
62
+ cursor: default !important;
63
+ }
64
+
65
+
66
+ /* Icons
67
+ ----------------------------------*/
68
+
69
+ /* states and images */
70
+ .ui-icon {
71
+ display: block;
72
+ text-indent: -99999px;
73
+ overflow: hidden;
74
+ background-repeat: no-repeat;
75
+ }
76
+
77
+
78
+ /* Misc visuals
79
+ ----------------------------------*/
80
+
81
+ /* Overlays */
82
+ .ui-widget-overlay {
83
+ position: fixed;
84
+ top: 0;
85
+ left: 0;
86
+ width: 100%;
87
+ height: 100%;
88
+ }
89
+ .ui-accordion .ui-accordion-header {
90
+ display: block;
91
+ cursor: pointer;
92
+ position: relative;
93
+ margin: 2px 0 0 0;
94
+ padding: .5em .5em .5em .7em;
95
+ min-height: 0; /* support: IE7 */
96
+ font-size: 100%;
97
+ }
98
+ .ui-accordion .ui-accordion-icons {
99
+ padding-left: 2.2em;
100
+ }
101
+ .ui-accordion .ui-accordion-icons .ui-accordion-icons {
102
+ padding-left: 2.2em;
103
+ }
104
+ .ui-accordion .ui-accordion-header .ui-accordion-header-icon {
105
+ position: absolute;
106
+ left: .5em;
107
+ top: 50%;
108
+ margin-top: -8px;
109
+ }
110
+ .ui-accordion .ui-accordion-content {
111
+ padding: 1em 2.2em;
112
+ border-top: 0;
113
+ overflow: auto;
114
+ }
115
+ .ui-autocomplete {
116
+ position: absolute;
117
+ top: 0;
118
+ left: 0;
119
+ cursor: default;
120
+ }
121
+ .ui-button {
122
+ display: inline-block;
123
+ position: relative;
124
+ padding: 0;
125
+ line-height: normal;
126
+ margin-right: .1em;
127
+ cursor: pointer;
128
+ vertical-align: middle;
129
+ text-align: center;
130
+ overflow: visible; /* removes extra width in IE */
131
+ }
132
+ .ui-button,
133
+ .ui-button:link,
134
+ .ui-button:visited,
135
+ .ui-button:hover,
136
+ .ui-button:active {
137
+ text-decoration: none;
138
+ }
139
+ /* to make room for the icon, a width needs to be set here */
140
+ .ui-button-icon-only {
141
+ width: 2.2em;
142
+ }
143
+ /* button elements seem to need a little more width */
144
+ button.ui-button-icon-only {
145
+ width: 2.4em;
146
+ }
147
+ .ui-button-icons-only {
148
+ width: 3.4em;
149
+ }
150
+ button.ui-button-icons-only {
151
+ width: 3.7em;
152
+ }
153
+
154
+ /* button text element */
155
+ .ui-button .ui-button-text {
156
+ display: block;
157
+ line-height: normal;
158
+ }
159
+ .ui-button-text-only .ui-button-text {
160
+ padding: .4em 1em;
161
+ }
162
+ .ui-button-icon-only .ui-button-text,
163
+ .ui-button-icons-only .ui-button-text {
164
+ padding: .4em;
165
+ text-indent: -9999999px;
166
+ }
167
+ .ui-button-text-icon-primary .ui-button-text,
168
+ .ui-button-text-icons .ui-button-text {
169
+ padding: .4em 1em .4em 2.1em;
170
+ }
171
+ .ui-button-text-icon-secondary .ui-button-text,
172
+ .ui-button-text-icons .ui-button-text {
173
+ padding: .4em 2.1em .4em 1em;
174
+ }
175
+ .ui-button-text-icons .ui-button-text {
176
+ padding-left: 2.1em;
177
+ padding-right: 2.1em;
178
+ }
179
+ /* no icon support for input elements, provide padding by default */
180
+ input.ui-button {
181
+ padding: .4em 1em;
182
+ }
183
+
184
+ /* button icon element(s) */
185
+ .ui-button-icon-only .ui-icon,
186
+ .ui-button-text-icon-primary .ui-icon,
187
+ .ui-button-text-icon-secondary .ui-icon,
188
+ .ui-button-text-icons .ui-icon,
189
+ .ui-button-icons-only .ui-icon {
190
+ position: absolute;
191
+ top: 50%;
192
+ margin-top: -8px;
193
+ }
194
+ .ui-button-icon-only .ui-icon {
195
+ left: 50%;
196
+ margin-left: -8px;
197
+ }
198
+ .ui-button-text-icon-primary .ui-button-icon-primary,
199
+ .ui-button-text-icons .ui-button-icon-primary,
200
+ .ui-button-icons-only .ui-button-icon-primary {
201
+ left: .5em;
202
+ }
203
+ .ui-button-text-icon-secondary .ui-button-icon-secondary,
204
+ .ui-button-text-icons .ui-button-icon-secondary,
205
+ .ui-button-icons-only .ui-button-icon-secondary {
206
+ right: .5em;
207
+ }
208
+
209
+ /* button sets */
210
+ .ui-buttonset {
211
+ margin-right: 7px;
212
+ }
213
+ .ui-buttonset .ui-button {
214
+ margin-left: 0;
215
+ margin-right: -.3em;
216
+ }
217
+
218
+ /* workarounds */
219
+ /* reset extra padding in Firefox, see h5bp.com/l */
220
+ input.ui-button::-moz-focus-inner,
221
+ button.ui-button::-moz-focus-inner {
222
+ border: 0;
223
+ padding: 0;
224
+ }
225
+ .ui-datepicker {
226
+ width: 17em;
227
+ padding: .2em .2em 0;
228
+ display: none;
229
+ }
230
+ .ui-datepicker .ui-datepicker-header {
231
+ position: relative;
232
+ padding: .2em 0;
233
+ }
234
+ .ui-datepicker .ui-datepicker-prev,
235
+ .ui-datepicker .ui-datepicker-next {
236
+ position: absolute;
237
+ top: 2px;
238
+ width: 1.8em;
239
+ height: 1.8em;
240
+ }
241
+ .ui-datepicker .ui-datepicker-prev-hover,
242
+ .ui-datepicker .ui-datepicker-next-hover {
243
+ top: 1px;
244
+ }
245
+ .ui-datepicker .ui-datepicker-prev {
246
+ left: 2px;
247
+ }
248
+ .ui-datepicker .ui-datepicker-next {
249
+ right: 2px;
250
+ }
251
+ .ui-datepicker .ui-datepicker-prev-hover {
252
+ left: 1px;
253
+ }
254
+ .ui-datepicker .ui-datepicker-next-hover {
255
+ right: 1px;
256
+ }
257
+ .ui-datepicker .ui-datepicker-prev span,
258
+ .ui-datepicker .ui-datepicker-next span {
259
+ display: block;
260
+ position: absolute;
261
+ left: 50%;
262
+ margin-left: -8px;
263
+ top: 50%;
264
+ margin-top: -8px;
265
+ }
266
+ .ui-datepicker .ui-datepicker-title {
267
+ margin: 0 2.3em;
268
+ line-height: 1.8em;
269
+ text-align: center;
270
+ }
271
+ .ui-datepicker .ui-datepicker-title select {
272
+ font-size: 1em;
273
+ margin: 1px 0;
274
+ }
275
+ .ui-datepicker select.ui-datepicker-month,
276
+ .ui-datepicker select.ui-datepicker-year {
277
+ width: 45%;
278
+ }
279
+ .ui-datepicker table {
280
+ width: 100%;
281
+ font-size: .9em;
282
+ border-collapse: collapse;
283
+ margin: 0 0 .4em;
284
+ }
285
+ .ui-datepicker th {
286
+ padding: .7em .3em;
287
+ text-align: center;
288
+ font-weight: bold;
289
+ border: 0;
290
+ }
291
+ .ui-datepicker td {
292
+ border: 0;
293
+ padding: 1px;
294
+ }
295
+ .ui-datepicker td span,
296
+ .ui-datepicker td a {
297
+ display: block;
298
+ padding: .2em;
299
+ text-align: right;
300
+ text-decoration: none;
301
+ }
302
+ .ui-datepicker .ui-datepicker-buttonpane {
303
+ background-image: none;
304
+ margin: .7em 0 0 0;
305
+ padding: 0 .2em;
306
+ border-left: 0;
307
+ border-right: 0;
308
+ border-bottom: 0;
309
+ }
310
+ .ui-datepicker .ui-datepicker-buttonpane button {
311
+ float: right;
312
+ margin: .5em .2em .4em;
313
+ cursor: pointer;
314
+ padding: .2em .6em .3em .6em;
315
+ width: auto;
316
+ overflow: visible;
317
+ }
318
+ .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
319
+ float: left;
320
+ }
321
+
322
+ /* with multiple calendars */
323
+ .ui-datepicker.ui-datepicker-multi {
324
+ width: auto;
325
+ }
326
+ .ui-datepicker-multi .ui-datepicker-group {
327
+ float: left;
328
+ }
329
+ .ui-datepicker-multi .ui-datepicker-group table {
330
+ width: 95%;
331
+ margin: 0 auto .4em;
332
+ }
333
+ .ui-datepicker-multi-2 .ui-datepicker-group {
334
+ width: 50%;
335
+ }
336
+ .ui-datepicker-multi-3 .ui-datepicker-group {
337
+ width: 33.3%;
338
+ }
339
+ .ui-datepicker-multi-4 .ui-datepicker-group {
340
+ width: 25%;
341
+ }
342
+ .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
343
+ .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
344
+ border-left-width: 0;
345
+ }
346
+ .ui-datepicker-multi .ui-datepicker-buttonpane {
347
+ clear: left;
348
+ }
349
+ .ui-datepicker-row-break {
350
+ clear: both;
351
+ width: 100%;
352
+ font-size: 0;
353
+ }
354
+
355
+ /* RTL support */
356
+ .ui-datepicker-rtl {
357
+ direction: rtl;
358
+ }
359
+ .ui-datepicker-rtl .ui-datepicker-prev {
360
+ right: 2px;
361
+ left: auto;
362
+ }
363
+ .ui-datepicker-rtl .ui-datepicker-next {
364
+ left: 2px;
365
+ right: auto;
366
+ }
367
+ .ui-datepicker-rtl .ui-datepicker-prev:hover {
368
+ right: 1px;
369
+ left: auto;
370
+ }
371
+ .ui-datepicker-rtl .ui-datepicker-next:hover {
372
+ left: 1px;
373
+ right: auto;
374
+ }
375
+ .ui-datepicker-rtl .ui-datepicker-buttonpane {
376
+ clear: right;
377
+ }
378
+ .ui-datepicker-rtl .ui-datepicker-buttonpane button {
379
+ float: left;
380
+ }
381
+ .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
382
+ .ui-datepicker-rtl .ui-datepicker-group {
383
+ float: right;
384
+ }
385
+ .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
386
+ .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
387
+ border-right-width: 0;
388
+ border-left-width: 1px;
389
+ }
390
+ .ui-dialog {
391
+ overflow: hidden;
392
+ position: absolute;
393
+ top: 0;
394
+ left: 0;
395
+ padding: .2em;
396
+ outline: 0;
397
+ }
398
+ .ui-dialog .ui-dialog-titlebar {
399
+ padding: .4em 1em;
400
+ position: relative;
401
+ }
402
+ .ui-dialog .ui-dialog-title {
403
+ float: left;
404
+ margin: .1em 0;
405
+ white-space: nowrap;
406
+ width: 90%;
407
+ overflow: hidden;
408
+ text-overflow: ellipsis;
409
+ }
410
+ .ui-dialog .ui-dialog-titlebar-close {
411
+ position: absolute;
412
+ right: .3em;
413
+ top: 50%;
414
+ width: 20px;
415
+ margin: -10px 0 0 0;
416
+ padding: 1px;
417
+ height: 20px;
418
+ }
419
+ .ui-dialog .ui-dialog-content {
420
+ position: relative;
421
+ border: 0;
422
+ padding: .5em 1em;
423
+ background: none;
424
+ overflow: auto;
425
+ }
426
+ .ui-dialog .ui-dialog-buttonpane {
427
+ text-align: left;
428
+ border-width: 1px 0 0 0;
429
+ background-image: none;
430
+ margin-top: .5em;
431
+ padding: .3em 1em .5em .4em;
432
+ }
433
+ .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
434
+ float: right;
435
+ }
436
+ .ui-dialog .ui-dialog-buttonpane button {
437
+ margin: .5em .4em .5em 0;
438
+ cursor: pointer;
439
+ }
440
+ .ui-dialog .ui-resizable-se {
441
+ width: 12px;
442
+ height: 12px;
443
+ right: -5px;
444
+ bottom: -5px;
445
+ background-position: 16px 16px;
446
+ }
447
+ .ui-draggable .ui-dialog-titlebar {
448
+ cursor: move;
449
+ }
450
+ .ui-draggable-handle {
451
+ -ms-touch-action: none;
452
+ touch-action: none;
453
+ }
454
+ .ui-menu {
455
+ list-style: none;
456
+ padding: 0;
457
+ margin: 0;
458
+ display: block;
459
+ outline: none;
460
+ }
461
+ .ui-menu .ui-menu {
462
+ position: absolute;
463
+ }
464
+ .ui-menu .ui-menu-item {
465
+ position: relative;
466
+ margin: 0;
467
+ padding: 3px 1em 3px .4em;
468
+ cursor: pointer;
469
+ min-height: 0; /* support: IE7 */
470
+ /* support: IE10, see #8844 */
471
+ list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
472
+ }
473
+ .ui-menu .ui-menu-divider {
474
+ margin: 5px 0;
475
+ height: 0;
476
+ font-size: 0;
477
+ line-height: 0;
478
+ border-width: 1px 0 0 0;
479
+ }
480
+ .ui-menu .ui-state-focus,
481
+ .ui-menu .ui-state-active {
482
+ margin: -1px;
483
+ }
484
+
485
+ /* icon support */
486
+ .ui-menu-icons {
487
+ position: relative;
488
+ }
489
+ .ui-menu-icons .ui-menu-item {
490
+ padding-left: 2em;
491
+ }
492
+
493
+ /* left-aligned */
494
+ .ui-menu .ui-icon {
495
+ position: absolute;
496
+ top: 0;
497
+ bottom: 0;
498
+ left: .2em;
499
+ margin: auto 0;
500
+ }
501
+
502
+ /* right-aligned */
503
+ .ui-menu .ui-menu-icon {
504
+ left: auto;
505
+ right: 0;
506
+ }
507
+ .ui-progressbar {
508
+ height: 2em;
509
+ text-align: left;
510
+ overflow: hidden;
511
+ }
512
+ .ui-progressbar .ui-progressbar-value {
513
+ margin: -1px;
514
+ height: 100%;
515
+ }
516
+ .ui-progressbar .ui-progressbar-overlay {
517
+ background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
518
+ height: 100%;
519
+ filter: alpha(opacity=25); /* support: IE8 */
520
+ opacity: 0.25;
521
+ }
522
+ .ui-progressbar-indeterminate .ui-progressbar-value {
523
+ background-image: none;
524
+ }
525
+ .ui-resizable {
526
+ position: relative;
527
+ }
528
+ .ui-resizable-handle {
529
+ position: absolute;
530
+ font-size: 0.1px;
531
+ display: block;
532
+ -ms-touch-action: none;
533
+ touch-action: none;
534
+ }
535
+ .ui-resizable-disabled .ui-resizable-handle,
536
+ .ui-resizable-autohide .ui-resizable-handle {
537
+ display: none;
538
+ }
539
+ .ui-resizable-n {
540
+ cursor: n-resize;
541
+ height: 7px;
542
+ width: 100%;
543
+ top: -5px;
544
+ left: 0;
545
+ }
546
+ .ui-resizable-s {
547
+ cursor: s-resize;
548
+ height: 7px;
549
+ width: 100%;
550
+ bottom: -5px;
551
+ left: 0;
552
+ }
553
+ .ui-resizable-e {
554
+ cursor: e-resize;
555
+ width: 7px;
556
+ right: -5px;
557
+ top: 0;
558
+ height: 100%;
559
+ }
560
+ .ui-resizable-w {
561
+ cursor: w-resize;
562
+ width: 7px;
563
+ left: -5px;
564
+ top: 0;
565
+ height: 100%;
566
+ }
567
+ .ui-resizable-se {
568
+ cursor: se-resize;
569
+ width: 12px;
570
+ height: 12px;
571
+ right: 1px;
572
+ bottom: 1px;
573
+ }
574
+ .ui-resizable-sw {
575
+ cursor: sw-resize;
576
+ width: 9px;
577
+ height: 9px;
578
+ left: -5px;
579
+ bottom: -5px;
580
+ }
581
+ .ui-resizable-nw {
582
+ cursor: nw-resize;
583
+ width: 9px;
584
+ height: 9px;
585
+ left: -5px;
586
+ top: -5px;
587
+ }
588
+ .ui-resizable-ne {
589
+ cursor: ne-resize;
590
+ width: 9px;
591
+ height: 9px;
592
+ right: -5px;
593
+ top: -5px;
594
+ }
595
+ .ui-selectable {
596
+ -ms-touch-action: none;
597
+ touch-action: none;
598
+ }
599
+ .ui-selectable-helper {
600
+ position: absolute;
601
+ z-index: 100;
602
+ border: 1px dotted black;
603
+ }
604
+ .ui-selectmenu-menu {
605
+ padding: 0;
606
+ margin: 0;
607
+ position: absolute;
608
+ top: 0;
609
+ left: 0;
610
+ display: none;
611
+ }
612
+ .ui-selectmenu-menu .ui-menu {
613
+ overflow: auto;
614
+ /* Support: IE7 */
615
+ overflow-x: hidden;
616
+ padding-bottom: 1px;
617
+ }
618
+ .ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
619
+ font-size: 1em;
620
+ font-weight: bold;
621
+ line-height: 1.5;
622
+ padding: 2px 0.4em;
623
+ margin: 0.5em 0 0 0;
624
+ height: auto;
625
+ border: 0;
626
+ }
627
+ .ui-selectmenu-open {
628
+ display: block;
629
+ }
630
+ .ui-selectmenu-button {
631
+ display: inline-block;
632
+ overflow: hidden;
633
+ position: relative;
634
+ text-decoration: none;
635
+ cursor: pointer;
636
+ }
637
+ .ui-selectmenu-button span.ui-icon {
638
+ right: 0.5em;
639
+ left: auto;
640
+ margin-top: -8px;
641
+ position: absolute;
642
+ top: 50%;
643
+ }
644
+ .ui-selectmenu-button span.ui-selectmenu-text {
645
+ text-align: left;
646
+ padding: 0.4em 2.1em 0.4em 1em;
647
+ display: block;
648
+ line-height: 1.4;
649
+ overflow: hidden;
650
+ text-overflow: ellipsis;
651
+ white-space: nowrap;
652
+ }
653
+ .ui-slider {
654
+ position: relative;
655
+ text-align: left;
656
+ }
657
+ .ui-slider .ui-slider-handle {
658
+ position: absolute;
659
+ z-index: 2;
660
+ width: 0.8em;
661
+ height: 1.2em;
662
+ cursor: default;
663
+ -ms-touch-action: none;
664
+ touch-action: none;
665
+ background-color: #eee;
666
+ }
667
+ .ui-slider .ui-slider-range {
668
+ position: absolute;
669
+ z-index: 1;
670
+ font-size: .7em;
671
+ display: block;
672
+ border: 0;
673
+ background-position: 0 0;
674
+ }
675
+
676
+ /* support: IE8 - See #6727 */
677
+ .ui-slider.ui-state-disabled .ui-slider-handle,
678
+ .ui-slider.ui-state-disabled .ui-slider-range {
679
+ filter: inherit;
680
+ }
681
+
682
+ .ui-slider-horizontal {
683
+ height: .8em;
684
+ }
685
+ .ui-slider-horizontal .ui-slider-handle {
686
+ top: -.3em;
687
+ margin-left: -.6em;
688
+ }
689
+ .ui-slider-horizontal .ui-slider-range {
690
+ top: 0;
691
+ height: 100%;
692
+ }
693
+ .ui-slider-horizontal .ui-slider-range-min {
694
+ left: 0;
695
+ }
696
+ .ui-slider-horizontal .ui-slider-range-max {
697
+ right: 0;
698
+ }
699
+
700
+ .ui-slider-vertical {
701
+ width: .8em;
702
+ height: 100px;
703
+ }
704
+ .ui-slider-vertical .ui-slider-handle {
705
+ left: -.3em;
706
+ margin-left: 0;
707
+ margin-bottom: -.6em;
708
+ }
709
+ .ui-slider-vertical .ui-slider-range {
710
+ left: 0;
711
+ width: 100%;
712
+ }
713
+ .ui-slider-vertical .ui-slider-range-min {
714
+ bottom: 0;
715
+ }
716
+ .ui-slider-vertical .ui-slider-range-max {
717
+ top: 0;
718
+ }
719
+ .ui-sortable-handle {
720
+ -ms-touch-action: none;
721
+ touch-action: none;
722
+ }
723
+ .ui-spinner {
724
+ position: relative;
725
+ display: inline-block;
726
+ overflow: hidden;
727
+ padding: 0;
728
+ vertical-align: middle;
729
+ }
730
+ .ui-spinner-input {
731
+ border: none;
732
+ background: none;
733
+ color: inherit;
734
+ padding: 0;
735
+ margin: .2em 0;
736
+ vertical-align: middle;
737
+ margin-left: .4em;
738
+ margin-right: 22px;
739
+ }
740
+ .ui-spinner-button {
741
+ width: 16px;
742
+ height: 50%;
743
+ font-size: .5em;
744
+ padding: 0;
745
+ margin: 0;
746
+ text-align: center;
747
+ position: absolute;
748
+ cursor: default;
749
+ display: block;
750
+ overflow: hidden;
751
+ right: 0;
752
+ }
753
+ /* more specificity required here to override default borders */
754
+ .ui-spinner a.ui-spinner-button {
755
+ border-top: none;
756
+ border-bottom: none;
757
+ border-right: none;
758
+ }
759
+ /* vertically center icon */
760
+ .ui-spinner .ui-icon {
761
+ position: absolute;
762
+ margin-top: -8px;
763
+ top: 50%;
764
+ left: 0;
765
+ }
766
+ .ui-spinner-up {
767
+ top: 0;
768
+ }
769
+ .ui-spinner-down {
770
+ bottom: 0;
771
+ }
772
+
773
+ /* TR overrides */
774
+ .ui-spinner .ui-icon-triangle-1-s {
775
+ /* need to fix icons sprite */
776
+ background-position: -65px -16px;
777
+ }
778
+ .ui-tabs {
779
+ position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
780
+ padding: .2em;
781
+ }
782
+ .ui-tabs .ui-tabs-nav {
783
+ margin: 0;
784
+ padding: .2em .2em 0;
785
+ }
786
+ .ui-tabs .ui-tabs-nav li {
787
+ list-style: none;
788
+ float: left;
789
+ position: relative;
790
+ top: 0;
791
+ margin: 1px .2em 0 0;
792
+ border-bottom-width: 0;
793
+ padding: 0;
794
+ white-space: nowrap;
795
+ }
796
+ .ui-tabs .ui-tabs-nav .ui-tabs-anchor {
797
+ float: left;
798
+ padding: .5em 1em;
799
+ text-decoration: none;
800
+ }
801
+ .ui-tabs .ui-tabs-nav li.ui-tabs-active {
802
+ margin-bottom: -1px;
803
+ padding-bottom: 1px;
804
+ }
805
+ .ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
806
+ .ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
807
+ .ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
808
+ cursor: text;
809
+ }
810
+ .ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
811
+ cursor: pointer;
812
+ }
813
+ .ui-tabs .ui-tabs-panel {
814
+ display: block;
815
+ border-width: 0;
816
+ padding: 1em 1.4em;
817
+ background: none;
818
+ }
819
+ .ui-tooltip {
820
+ padding: 8px;
821
+ position: absolute;
822
+ z-index: 9999;
823
+ max-width: 300px;
824
+ -webkit-box-shadow: 0 0 5px #aaa;
825
+ box-shadow: 0 0 5px #aaa;
826
+ }
827
+ body .ui-tooltip {
828
+ border-width: 2px;
829
+ }
830
+
831
+ /* Component containers
832
+ ----------------------------------*/
833
+ .ui-widget {
834
+ font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
835
+ font-size: 1.1em;
836
+ }
837
+ .ui-widget .ui-widget {
838
+ font-size: 1em;
839
+ }
840
+ .ui-widget input,
841
+ .ui-widget select,
842
+ .ui-widget textarea,
843
+ .ui-widget button {
844
+ font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
845
+ font-size: 1em;
846
+ }
847
+ .ui-widget-content {
848
+ border: 1px solid #dddddd;
849
+ color: #333333;
850
+ }
851
+ .ui-widget-content a {
852
+ color: #333333;
853
+ }
854
+ .ui-widget-header {
855
+ border: 1px solid #e78f08;
856
+ color: #ffffff;
857
+ font-weight: bold;
858
+ }
859
+ .ui-widget-header a {
860
+ color: #ffffff;
861
+ }
862
+
863
+ /* Interaction states
864
+ ----------------------------------*/
865
+ .ui-state-default,
866
+ .ui-widget-content .ui-state-default,
867
+ .ui-widget-header .ui-state-default {
868
+ border: 1px solid #cccccc;
869
+ font-weight: bold;
870
+ color: #1c94c4;
871
+ }
872
+ .ui-state-default a,
873
+ .ui-state-default a:link,
874
+ .ui-state-default a:visited {
875
+ color: #1c94c4;
876
+ text-decoration: none;
877
+ }
878
+ .ui-state-hover,
879
+ .ui-widget-content .ui-state-hover,
880
+ .ui-widget-header .ui-state-hover,
881
+ .ui-state-focus,
882
+ .ui-widget-content .ui-state-focus,
883
+ .ui-widget-header .ui-state-focus {
884
+ border: 1px solid #fbcb09;
885
+ font-weight: bold;
886
+ color: #c77405;
887
+ }
888
+ .ui-state-hover a,
889
+ .ui-state-hover a:hover,
890
+ .ui-state-hover a:link,
891
+ .ui-state-hover a:visited,
892
+ .ui-state-focus a,
893
+ .ui-state-focus a:hover,
894
+ .ui-state-focus a:link,
895
+ .ui-state-focus a:visited {
896
+ color: #c77405;
897
+ text-decoration: none;
898
+ }
899
+ .ui-state-active,
900
+ .ui-widget-content .ui-state-active,
901
+ .ui-widget-header .ui-state-active {
902
+ border: 1px solid #fbd850;
903
+ font-weight: bold;
904
+ color: #eb8f00;
905
+ }
906
+ .ui-state-active a,
907
+ .ui-state-active a:link,
908
+ .ui-state-active a:visited {
909
+ color: #eb8f00;
910
+ text-decoration: none;
911
+ }
912
+
913
+ /* Interaction Cues
914
+ ----------------------------------*/
915
+ .ui-state-highlight,
916
+ .ui-widget-content .ui-state-highlight,
917
+ .ui-widget-header .ui-state-highlight {
918
+ border: 1px solid #fed22f;
919
+ color: #363636;
920
+ }
921
+ .ui-state-highlight a,
922
+ .ui-widget-content .ui-state-highlight a,
923
+ .ui-widget-header .ui-state-highlight a {
924
+ color: #363636;
925
+ }
926
+ .ui-state-error,
927
+ .ui-widget-content .ui-state-error,
928
+ .ui-widget-header .ui-state-error {
929
+ border: 1px solid #cd0a0a;
930
+ color: #ffffff;
931
+ }
932
+ .ui-state-error a,
933
+ .ui-widget-content .ui-state-error a,
934
+ .ui-widget-header .ui-state-error a {
935
+ color: #ffffff;
936
+ }
937
+ .ui-state-error-text,
938
+ .ui-widget-content .ui-state-error-text,
939
+ .ui-widget-header .ui-state-error-text {
940
+ color: #ffffff;
941
+ }
942
+ .ui-priority-primary,
943
+ .ui-widget-content .ui-priority-primary,
944
+ .ui-widget-header .ui-priority-primary {
945
+ font-weight: bold;
946
+ }
947
+ .ui-priority-secondary,
948
+ .ui-widget-content .ui-priority-secondary,
949
+ .ui-widget-header .ui-priority-secondary {
950
+ opacity: .7;
951
+ filter:Alpha(Opacity=70); /* support: IE8 */
952
+ font-weight: normal;
953
+ }
954
+ .ui-state-disabled,
955
+ .ui-widget-content .ui-state-disabled,
956
+ .ui-widget-header .ui-state-disabled {
957
+ opacity: .35;
958
+ filter:Alpha(Opacity=35); /* support: IE8 */
959
+ background-image: none;
960
+ }
961
+ .ui-state-disabled .ui-icon {
962
+ filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
963
+ }
964
+
965
+ /* Icons
966
+ ----------------------------------*/
967
+
968
+ /* states and images */
969
+ .ui-icon {
970
+ width: 16px;
971
+ height: 16px;
972
+ }
973
+ .ui-icon,
974
+ .ui-widget-content .ui-icon {
975
+ background-image: url("images/ui-icons_222222_256x240.png");
976
+ }
977
+ .ui-widget-header .ui-icon {
978
+ background-image: url("images/ui-icons_ffffff_256x240.png");
979
+ }
980
+ .ui-state-default .ui-icon {
981
+ background-image: url("images/ui-icons_ef8c08_256x240.png");
982
+ }
983
+ .ui-state-hover .ui-icon,
984
+ .ui-state-focus .ui-icon {
985
+ background-image: url("images/ui-icons_ef8c08_256x240.png");
986
+ }
987
+ .ui-state-active .ui-icon {
988
+ background-image: url("images/ui-icons_ef8c08_256x240.png");
989
+ }
990
+ .ui-state-highlight .ui-icon {
991
+ background-image: url("images/ui-icons_228ef1_256x240.png");
992
+ }
993
+ .ui-state-error .ui-icon,
994
+ .ui-state-error-text .ui-icon {
995
+ background-image: url("images/ui-icons_ffd27a_256x240.png");
996
+ }
997
+
998
+ /* positioning */
999
+ .ui-icon-blank { background-position: 16px 16px; }
1000
+ .ui-icon-carat-1-n { background-position: 0 0; }
1001
+ .ui-icon-carat-1-ne { background-position: -16px 0; }
1002
+ .ui-icon-carat-1-e { background-position: -32px 0; }
1003
+ .ui-icon-carat-1-se { background-position: -48px 0; }
1004
+ .ui-icon-carat-1-s { background-position: -64px 0; }
1005
+ .ui-icon-carat-1-sw { background-position: -80px 0; }
1006
+ .ui-icon-carat-1-w { background-position: -96px 0; }
1007
+ .ui-icon-carat-1-nw { background-position: -112px 0; }
1008
+ .ui-icon-carat-2-n-s { background-position: -128px 0; }
1009
+ .ui-icon-carat-2-e-w { background-position: -144px 0; }
1010
+ .ui-icon-triangle-1-n { background-position: 0 -16px; }
1011
+ .ui-icon-triangle-1-ne { background-position: -16px -16px; }
1012
+ .ui-icon-triangle-1-e { background-position: -32px -16px; }
1013
+ .ui-icon-triangle-1-se { background-position: -48px -16px; }
1014
+ .ui-icon-triangle-1-s { background-position: -64px -16px; }
1015
+ .ui-icon-triangle-1-sw { background-position: -80px -16px; }
1016
+ .ui-icon-triangle-1-w { background-position: -96px -16px; }
1017
+ .ui-icon-triangle-1-nw { background-position: -112px -16px; }
1018
+ .ui-icon-triangle-2-n-s { background-position: -128px -16px; }
1019
+ .ui-icon-triangle-2-e-w { background-position: -144px -16px; }
1020
+ .ui-icon-arrow-1-n { background-position: 0 -32px; }
1021
+ .ui-icon-arrow-1-ne { background-position: -16px -32px; }
1022
+ .ui-icon-arrow-1-e { background-position: -32px -32px; }
1023
+ .ui-icon-arrow-1-se { background-position: -48px -32px; }
1024
+ .ui-icon-arrow-1-s { background-position: -64px -32px; }
1025
+ .ui-icon-arrow-1-sw { background-position: -80px -32px; }
1026
+ .ui-icon-arrow-1-w { background-position: -96px -32px; }
1027
+ .ui-icon-arrow-1-nw { background-position: -112px -32px; }
1028
+ .ui-icon-arrow-2-n-s { background-position: -128px -32px; }
1029
+ .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
1030
+ .ui-icon-arrow-2-e-w { background-position: -160px -32px; }
1031
+ .ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
1032
+ .ui-icon-arrowstop-1-n { background-position: -192px -32px; }
1033
+ .ui-icon-arrowstop-1-e { background-position: -208px -32px; }
1034
+ .ui-icon-arrowstop-1-s { background-position: -224px -32px; }
1035
+ .ui-icon-arrowstop-1-w { background-position: -240px -32px; }
1036
+ .ui-icon-arrowthick-1-n { background-position: 0 -48px; }
1037
+ .ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
1038
+ .ui-icon-arrowthick-1-e { background-position: -32px -48px; }
1039
+ .ui-icon-arrowthick-1-se { background-position: -48px -48px; }
1040
+ .ui-icon-arrowthick-1-s { background-position: -64px -48px; }
1041
+ .ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
1042
+ .ui-icon-arrowthick-1-w { background-position: -96px -48px; }
1043
+ .ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
1044
+ .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
1045
+ .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
1046
+ .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
1047
+ .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
1048
+ .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
1049
+ .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
1050
+ .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
1051
+ .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
1052
+ .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
1053
+ .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
1054
+ .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
1055
+ .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
1056
+ .ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
1057
+ .ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
1058
+ .ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
1059
+ .ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
1060
+ .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
1061
+ .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
1062
+ .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
1063
+ .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
1064
+ .ui-icon-arrow-4 { background-position: 0 -80px; }
1065
+ .ui-icon-arrow-4-diag { background-position: -16px -80px; }
1066
+ .ui-icon-extlink { background-position: -32px -80px; }
1067
+ .ui-icon-newwin { background-position: -48px -80px; }
1068
+ .ui-icon-refresh { background-position: -64px -80px; }
1069
+ .ui-icon-shuffle { background-position: -80px -80px; }
1070
+ .ui-icon-transfer-e-w { background-position: -96px -80px; }
1071
+ .ui-icon-transferthick-e-w { background-position: -112px -80px; }
1072
+ .ui-icon-folder-collapsed { background-position: 0 -96px; }
1073
+ .ui-icon-folder-open { background-position: -16px -96px; }
1074
+ .ui-icon-document { background-position: -32px -96px; }
1075
+ .ui-icon-document-b { background-position: -48px -96px; }
1076
+ .ui-icon-note { background-position: -64px -96px; }
1077
+ .ui-icon-mail-closed { background-position: -80px -96px; }
1078
+ .ui-icon-mail-open { background-position: -96px -96px; }
1079
+ .ui-icon-suitcase { background-position: -112px -96px; }
1080
+ .ui-icon-comment { background-position: -128px -96px; }
1081
+ .ui-icon-person { background-position: -144px -96px; }
1082
+ .ui-icon-print { background-position: -160px -96px; }
1083
+ .ui-icon-trash { background-position: -176px -96px; }
1084
+ .ui-icon-locked { background-position: -192px -96px; }
1085
+ .ui-icon-unlocked { background-position: -208px -96px; }
1086
+ .ui-icon-bookmark { background-position: -224px -96px; }
1087
+ .ui-icon-tag { background-position: -240px -96px; }
1088
+ .ui-icon-home { background-position: 0 -112px; }
1089
+ .ui-icon-flag { background-position: -16px -112px; }
1090
+ .ui-icon-calendar { background-position: -32px -112px; }
1091
+ .ui-icon-cart { background-position: -48px -112px; }
1092
+ .ui-icon-pencil { background-position: -64px -112px; }
1093
+ .ui-icon-clock { background-position: -80px -112px; }
1094
+ .ui-icon-disk { background-position: -96px -112px; }
1095
+ .ui-icon-calculator { background-position: -112px -112px; }
1096
+ .ui-icon-zoomin { background-position: -128px -112px; }
1097
+ .ui-icon-zoomout { background-position: -144px -112px; }
1098
+ .ui-icon-search { background-position: -160px -112px; }
1099
+ .ui-icon-wrench { background-position: -176px -112px; }
1100
+ .ui-icon-gear { background-position: -192px -112px; }
1101
+ .ui-icon-heart { background-position: -208px -112px; }
1102
+ .ui-icon-star { background-position: -224px -112px; }
1103
+ .ui-icon-link { background-position: -240px -112px; }
1104
+ .ui-icon-cancel { background-position: 0 -128px; }
1105
+ .ui-icon-plus { background-position: -16px -128px; }
1106
+ .ui-icon-plusthick { background-position: -32px -128px; }
1107
+ .ui-icon-minus { background-position: -48px -128px; }
1108
+ .ui-icon-minusthick { background-position: -64px -128px; }
1109
+ .ui-icon-close { background-position: -80px -128px; }
1110
+ .ui-icon-closethick { background-position: -96px -128px; }
1111
+ .ui-icon-key { background-position: -112px -128px; }
1112
+ .ui-icon-lightbulb { background-position: -128px -128px; }
1113
+ .ui-icon-scissors { background-position: -144px -128px; }
1114
+ .ui-icon-clipboard { background-position: -160px -128px; }
1115
+ .ui-icon-copy { background-position: -176px -128px; }
1116
+ .ui-icon-contact { background-position: -192px -128px; }
1117
+ .ui-icon-image { background-position: -208px -128px; }
1118
+ .ui-icon-video { background-position: -224px -128px; }
1119
+ .ui-icon-script { background-position: -240px -128px; }
1120
+ .ui-icon-alert { background-position: 0 -144px; }
1121
+ .ui-icon-info { background-position: -16px -144px; }
1122
+ .ui-icon-notice { background-position: -32px -144px; }
1123
+ .ui-icon-help { background-position: -48px -144px; }
1124
+ .ui-icon-check { background-position: -64px -144px; }
1125
+ .ui-icon-bullet { background-position: -80px -144px; }
1126
+ .ui-icon-radio-on { background-position: -96px -144px; }
1127
+ .ui-icon-radio-off { background-position: -112px -144px; }
1128
+ .ui-icon-pin-w { background-position: -128px -144px; }
1129
+ .ui-icon-pin-s { background-position: -144px -144px; }
1130
+ .ui-icon-play { background-position: 0 -160px; }
1131
+ .ui-icon-pause { background-position: -16px -160px; }
1132
+ .ui-icon-seek-next { background-position: -32px -160px; }
1133
+ .ui-icon-seek-prev { background-position: -48px -160px; }
1134
+ .ui-icon-seek-end { background-position: -64px -160px; }
1135
+ .ui-icon-seek-start { background-position: -80px -160px; }
1136
+ /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
1137
+ .ui-icon-seek-first { background-position: -80px -160px; }
1138
+ .ui-icon-stop { background-position: -96px -160px; }
1139
+ .ui-icon-eject { background-position: -112px -160px; }
1140
+ .ui-icon-volume-off { background-position: -128px -160px; }
1141
+ .ui-icon-volume-on { background-position: -144px -160px; }
1142
+ .ui-icon-power { background-position: 0 -176px; }
1143
+ .ui-icon-signal-diag { background-position: -16px -176px; }
1144
+ .ui-icon-signal { background-position: -32px -176px; }
1145
+ .ui-icon-battery-0 { background-position: -48px -176px; }
1146
+ .ui-icon-battery-1 { background-position: -64px -176px; }
1147
+ .ui-icon-battery-2 { background-position: -80px -176px; }
1148
+ .ui-icon-battery-3 { background-position: -96px -176px; }
1149
+ .ui-icon-circle-plus { background-position: 0 -192px; }
1150
+ .ui-icon-circle-minus { background-position: -16px -192px; }
1151
+ .ui-icon-circle-close { background-position: -32px -192px; }
1152
+ .ui-icon-circle-triangle-e { background-position: -48px -192px; }
1153
+ .ui-icon-circle-triangle-s { background-position: -64px -192px; }
1154
+ .ui-icon-circle-triangle-w { background-position: -80px -192px; }
1155
+ .ui-icon-circle-triangle-n { background-position: -96px -192px; }
1156
+ .ui-icon-circle-arrow-e { background-position: -112px -192px; }
1157
+ .ui-icon-circle-arrow-s { background-position: -128px -192px; }
1158
+ .ui-icon-circle-arrow-w { background-position: -144px -192px; }
1159
+ .ui-icon-circle-arrow-n { background-position: -160px -192px; }
1160
+ .ui-icon-circle-zoomin { background-position: -176px -192px; }
1161
+ .ui-icon-circle-zoomout { background-position: -192px -192px; }
1162
+ .ui-icon-circle-check { background-position: -208px -192px; }
1163
+ .ui-icon-circlesmall-plus { background-position: 0 -208px; }
1164
+ .ui-icon-circlesmall-minus { background-position: -16px -208px; }
1165
+ .ui-icon-circlesmall-close { background-position: -32px -208px; }
1166
+ .ui-icon-squaresmall-plus { background-position: -48px -208px; }
1167
+ .ui-icon-squaresmall-minus { background-position: -64px -208px; }
1168
+ .ui-icon-squaresmall-close { background-position: -80px -208px; }
1169
+ .ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
1170
+ .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
1171
+ .ui-icon-grip-solid-vertical { background-position: -32px -224px; }
1172
+ .ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
1173
+ .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
1174
+ .ui-icon-grip-diagonal-se { background-position: -80px -224px; }
1175
+
1176
+
1177
+ /* Misc visuals
1178
+ ----------------------------------*/
1179
+
1180
+ /* Corner radius */
1181
+ .ui-corner-all,
1182
+ .ui-corner-top,
1183
+ .ui-corner-left,
1184
+ .ui-corner-tl {
1185
+ border-top-left-radius: 4px;
1186
+ }
1187
+ .ui-corner-all,
1188
+ .ui-corner-top,
1189
+ .ui-corner-right,
1190
+ .ui-corner-tr {
1191
+ border-top-right-radius: 4px;
1192
+ }
1193
+ .ui-corner-all,
1194
+ .ui-corner-bottom,
1195
+ .ui-corner-left,
1196
+ .ui-corner-bl {
1197
+ border-bottom-left-radius: 4px;
1198
+ }
1199
+ .ui-corner-all,
1200
+ .ui-corner-bottom,
1201
+ .ui-corner-right,
1202
+ .ui-corner-br {
1203
+ border-bottom-right-radius: 4px;
1204
+ }
1205
+
1206
+ /* Overlays */
1207
+ .ui-widget-overlay {
1208
+ opacity: .5;
1209
+ filter: Alpha(Opacity=50); /* support: IE8 */
1210
+ }
1211
+ .ui-widget-shadow {
1212
+ margin: -5px 0 0 -5px;
1213
+ padding: 5px;
1214
+ opacity: .2;
1215
+ filter: Alpha(Opacity=20); /* support: IE8 */
1216
+ border-radius: 5px;
1217
+ }
skin/frontend/base/default/css/mkmage/layerednavigation/layerednavigation.css ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .mkmage-overlay{
2
+ display: none;
3
+ position: fixed;
4
+ width: 100%;
5
+ height: 100%;
6
+ opacity: 0.5;
7
+ background-color: #363636;
8
+ z-index: 10000;
9
+ top: 0;
10
+ left: 0;
11
+ }
12
+ .mkmage-loader{
13
+ display: none;
14
+ width: 60px;
15
+ height: 60px;
16
+ position: fixed;
17
+ left: 50%;
18
+ top: 50%;
19
+ z-index: 1000000;
20
+ transform: translate3d(-50%,-50%,0)
21
+ }
22
+
23
+ .catalog-category-view #narrow-by-list .pfilter,
24
+ .catalogsearch-result-index #narrow-by-list .pfilter {
25
+ padding: 5px 15px;
26
+ }
27
+
28
+ .catalog-category-view #narrow-by-list .pfilter #slider-range-vals,
29
+ .catalogsearch-result-index #narrow-by-list .pfilter #slider-range-vals {
30
+ margin-top: 10px;
31
+ }
32
+
33
+ .catalog-category-view #narrow-by-list dd ol > li > a,
34
+ .catalogsearch-result-index #narrow-by-list dd ol > li > a {
35
+ display: inline-block;
36
+ text-decoration: none;
37
+ }
38
+
39
+ .catalog-category-view #narrow-by-list li span.filter-label,
40
+ .catalogsearch-result-index #narrow-by-list li span.filter-label {
41
+ display: inline-block;
42
+ vertical-align: middle;
43
+ font-size: 15px;
44
+ line-height: 1;
45
+ }
46
+
47
+ .catalog-category-view #narrow-by-list li span.filter-count,
48
+ .catalogsearch-result-index #narrow-by-list li span.filter-count {
49
+ display: inline-block;
50
+ vertical-align: middle;
51
+ padding: 0;
52
+ }
53
+
54
+ .catalog-category-view #narrow-by-list li span.filter-checkbox,
55
+ .catalogsearch-result-index #narrow-by-list li span.filter-checkbox {
56
+ display: inline-block;
57
+ vertical-align: middle;
58
+ width: 13px;
59
+ height: 13px;
60
+ line-height: 7px;
61
+ border: 1px solid silver;
62
+ border-radius: 3px;
63
+ text-align: center;
64
+ margin-right: 10px;
65
+ }
66
+
67
+ .catalog-category-view #narrow-by-list li span.filter-label,
68
+ .catalogsearch-result-index #narrow-by-list li span.filter-label {
69
+ display: inline-block;
70
+ vertical-align: middle;
71
+ }
72
+
73
+ .catalog-category-view #narrow-by-list li.filter-active .filter-checkbox,
74
+ .catalogsearch-result-index #narrow-by-list li.filter-active .filter-checkbox {
75
+ background-color: #CCCCCC;
76
+ }
skin/frontend/base/default/images/mkmage/layerednavigation/rolling.svg ADDED
@@ -0,0 +1 @@
 
1
+ <?xml version="1.0" encoding="utf-8"?><svg width='50px' height='50px' xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid" class="uil-ring"><rect x="0" y="0" width="100" height="100" fill="none" class="bk"></rect><circle cx="50" cy="50" r="42.5" stroke-dasharray="173.57299411083608 93.46238144429634" stroke="#cec9c9" fill="none" stroke-width="15"><animateTransform attributeName="transform" type="rotate" values="0 50 50;180 50 50;360 50 50;" keyTimes="0;0.5;1" dur="1s" repeatCount="indefinite" begin="0s"></animateTransform></circle></svg>
skin/frontend/base/default/js/mkmage/layerednavigation/jquery-ui.min.js ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*! jQuery UI - v1.11.4 - 2015-03-11
2
+ * http://jqueryui.com
3
+ * Includes: core.js, widget.js, mouse.js, position.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, draggable.js, droppable.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js, menu.js, progressbar.js, resizable.js, selectable.js, selectmenu.js, slider.js, sortable.js, spinner.js, tabs.js, tooltip.js
4
+ * Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */
5
+
6
+ (function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(jQuery)})(function(e){function t(t,s){var n,a,o,r=t.nodeName.toLowerCase();return"area"===r?(n=t.parentNode,a=n.name,t.href&&a&&"map"===n.nodeName.toLowerCase()?(o=e("img[usemap='#"+a+"']")[0],!!o&&i(o)):!1):(/^(input|select|textarea|button|object)$/.test(r)?!t.disabled:"a"===r?t.href||s:s)&&i(t)}function i(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}function s(e){for(var t,i;e.length&&e[0]!==document;){if(t=e.css("position"),("absolute"===t||"relative"===t||"fixed"===t)&&(i=parseInt(e.css("zIndex"),10),!isNaN(i)&&0!==i))return i;e=e.parent()}return 0}function n(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},e.extend(this._defaults,this.regional[""]),this.regional.en=e.extend(!0,{},this.regional[""]),this.regional["en-US"]=e.extend(!0,{},this.regional.en),this.dpDiv=a(e("<div id='"+this._mainDivId+"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))}function a(t){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return t.delegate(i,"mouseout",function(){e(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).removeClass("ui-datepicker-next-hover")}).delegate(i,"mouseover",o)}function o(){e.datepicker._isDisabledDatepicker(v.inline?v.dpDiv.parent()[0]:v.input[0])||(e(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),e(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).addClass("ui-datepicker-next-hover"))}function r(t,i){e.extend(t,i);for(var s in i)null==i[s]&&(t[s]=i[s]);return t}function h(e){return function(){var t=this.element.val();e.apply(this,arguments),this._refresh(),t!==this.element.val()&&this._trigger("change")}}e.ui=e.ui||{},e.extend(e.ui,{version:"1.11.4",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({scrollParent:function(t){var i=this.css("position"),s="absolute"===i,n=t?/(auto|scroll|hidden)/:/(auto|scroll)/,a=this.parents().filter(function(){var t=e(this);return s&&"static"===t.css("position")?!1:n.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==i&&a.length?a:e(this[0].ownerDocument||document)},uniqueId:function(){var e=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++e)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,s){return!!e.data(t,s[3])},focusable:function(i){return t(i,!isNaN(e.attr(i,"tabindex")))},tabbable:function(i){var s=e.attr(i,"tabindex"),n=isNaN(s);return(n||s>=0)&&t(i,!n)}}),e("<a>").outerWidth(1).jquery||e.each(["Width","Height"],function(t,i){function s(t,i,s,a){return e.each(n,function(){i-=parseFloat(e.css(t,"padding"+this))||0,s&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),a&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],a=i.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+i]=function(t){return void 0===t?o["inner"+i].call(this):this.each(function(){e(this).css(a,s(this,t)+"px")})},e.fn["outer"+i]=function(t,n){return"number"!=typeof t?o["outer"+i].call(this,t):this.each(function(){e(this).css(a,s(this,t,!0,n)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.fn.extend({focus:function(t){return function(i,s){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),s&&s.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),disableSelection:function(){var e="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.bind(e+".ui-disableSelection",function(e){e.preventDefault()})}}(),enableSelection:function(){return this.unbind(".ui-disableSelection")},zIndex:function(t){if(void 0!==t)return this.css("zIndex",t);if(this.length)for(var i,s,n=e(this[0]);n.length&&n[0]!==document;){if(i=n.css("position"),("absolute"===i||"relative"===i||"fixed"===i)&&(s=parseInt(n.css("zIndex"),10),!isNaN(s)&&0!==s))return s;n=n.parent()}return 0}}),e.ui.plugin={add:function(t,i,s){var n,a=e.ui[t].prototype;for(n in s)a.plugins[n]=a.plugins[n]||[],a.plugins[n].push([i,s[n]])},call:function(e,t,i,s){var n,a=e.plugins[t];if(a&&(s||e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType))for(n=0;a.length>n;n++)e.options[a[n][0]]&&a[n][1].apply(e.element,i)}};var l=0,u=Array.prototype.slice;e.cleanData=function(t){return function(i){var s,n,a;for(a=0;null!=(n=i[a]);a++)try{s=e._data(n,"events"),s&&s.remove&&e(n).triggerHandler("remove")}catch(o){}t(i)}}(e.cleanData),e.widget=function(t,i,s){var n,a,o,r,h={},l=t.split(".")[0];return t=t.split(".")[1],n=l+"-"+t,s||(s=i,i=e.Widget),e.expr[":"][n.toLowerCase()]=function(t){return!!e.data(t,n)},e[l]=e[l]||{},a=e[l][t],o=e[l][t]=function(e,t){return this._createWidget?(arguments.length&&this._createWidget(e,t),void 0):new o(e,t)},e.extend(o,a,{version:s.version,_proto:e.extend({},s),_childConstructors:[]}),r=new i,r.options=e.widget.extend({},r.options),e.each(s,function(t,s){return e.isFunction(s)?(h[t]=function(){var e=function(){return i.prototype[t].apply(this,arguments)},n=function(e){return i.prototype[t].apply(this,e)};return function(){var t,i=this._super,a=this._superApply;return this._super=e,this._superApply=n,t=s.apply(this,arguments),this._super=i,this._superApply=a,t}}(),void 0):(h[t]=s,void 0)}),o.prototype=e.widget.extend(r,{widgetEventPrefix:a?r.widgetEventPrefix||t:t},h,{constructor:o,namespace:l,widgetName:t,widgetFullName:n}),a?(e.each(a._childConstructors,function(t,i){var s=i.prototype;e.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete a._childConstructors):i._childConstructors.push(o),e.widget.bridge(t,o),o},e.widget.extend=function(t){for(var i,s,n=u.call(arguments,1),a=0,o=n.length;o>a;a++)for(i in n[a])s=n[a][i],n[a].hasOwnProperty(i)&&void 0!==s&&(t[i]=e.isPlainObject(s)?e.isPlainObject(t[i])?e.widget.extend({},t[i],s):e.widget.extend({},s):s);return t},e.widget.bridge=function(t,i){var s=i.prototype.widgetFullName||t;e.fn[t]=function(n){var a="string"==typeof n,o=u.call(arguments,1),r=this;return a?this.each(function(){var i,a=e.data(this,s);return"instance"===n?(r=a,!1):a?e.isFunction(a[n])&&"_"!==n.charAt(0)?(i=a[n].apply(a,o),i!==a&&void 0!==i?(r=i&&i.jquery?r.pushStack(i.get()):i,!1):void 0):e.error("no such method '"+n+"' for "+t+" widget instance"):e.error("cannot call methods on "+t+" prior to initialization; "+"attempted to call method '"+n+"'")}):(o.length&&(n=e.widget.extend.apply(null,[n].concat(o))),this.each(function(){var t=e.data(this,s);t?(t.option(n||{}),t._init&&t._init()):e.data(this,s,new i(n,this))})),r}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(t,i){i=e(i||this.defaultElement||this)[0],this.element=e(i),this.uuid=l++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=e(),this.hoverable=e(),this.focusable=e(),i!==this&&(e.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===i&&this.destroy()}}),this.document=e(i.style?i.ownerDocument:i.document||i),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(t,i){var s,n,a,o=t;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof t)if(o={},s=t.split("."),t=s.shift(),s.length){for(n=o[t]=e.widget.extend({},this.options[t]),a=0;s.length-1>a;a++)n[s[a]]=n[s[a]]||{},n=n[s[a]];if(t=s.pop(),1===arguments.length)return void 0===n[t]?null:n[t];n[t]=i}else{if(1===arguments.length)return void 0===this.options[t]?null:this.options[t];o[t]=i}return this._setOptions(o),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,"disabled"===e&&(this.widget().toggleClass(this.widgetFullName+"-disabled",!!t),t&&(this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus"))),this},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_on:function(t,i,s){var n,a=this;"boolean"!=typeof t&&(s=i,i=t,t=!1),s?(i=n=e(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),e.each(s,function(s,o){function r(){return t||a.options.disabled!==!0&&!e(this).hasClass("ui-state-disabled")?("string"==typeof o?a[o]:o).apply(a,arguments):void 0}"string"!=typeof o&&(r.guid=o.guid=o.guid||r.guid||e.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+a.eventNamespace,u=h[2];u?n.delegate(u,l,r):i.bind(l,r)})},_off:function(t,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.unbind(i).undelegate(i),this.bindings=e(this.bindings.not(t).get()),this.focusable=e(this.focusable.not(t).get()),this.hoverable=e(this.hoverable.not(t).get())},_delay:function(e,t){function i(){return("string"==typeof e?s[e]:e).apply(s,arguments)}var s=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,i,s){var n,a,o=this.options[t];if(s=s||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],a=i.originalEvent)for(n in a)n in i||(i[n]=a[n]);return this.element.trigger(i,s),!(e.isFunction(o)&&o.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,i){e.Widget.prototype["_"+t]=function(s,n,a){"string"==typeof n&&(n={effect:n});var o,r=n?n===!0||"number"==typeof n?i:n.effect||i:t;n=n||{},"number"==typeof n&&(n={duration:n}),o=!e.isEmptyObject(n),n.complete=a,n.delay&&s.delay(n.delay),o&&e.effects&&e.effects.effect[r]?s[t](n):r!==t&&s[r]?s[r](n.duration,n.easing,a):s.queue(function(i){e(this)[t](),a&&a.call(s[0]),i()})}}),e.widget;var d=!1;e(document).mouseup(function(){d=!1}),e.widget("ui.mouse",{version:"1.11.4",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var t=this;this.element.bind("mousedown."+this.widgetName,function(e){return t._mouseDown(e)}).bind("click."+this.widgetName,function(i){return!0===e.data(i.target,t.widgetName+".preventClickEvent")?(e.removeData(i.target,t.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(!d){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var i=this,s=1===t.which,n="string"==typeof this.options.cancel&&t.target.nodeName?e(t.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(t)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(t)!==!1,!this._mouseStarted)?(t.preventDefault(),!0):(!0===e.data(t.target,this.widgetName+".preventClickEvent")&&e.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(e){return i._mouseMove(e)},this._mouseUpDelegate=function(e){return i._mouseUp(e)},this.document.bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),d=!0,!0)):!0}},_mouseMove:function(t){if(this._mouseMoved){if(e.ui.ie&&(!document.documentMode||9>document.documentMode)&&!t.button)return this._mouseUp(t);if(!t.which)return this._mouseUp(t)}return(t.which||t.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted)},_mouseUp:function(t){return this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),d=!1,!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),function(){function t(e,t,i){return[parseFloat(e[0])*(p.test(e[0])?t/100:1),parseFloat(e[1])*(p.test(e[1])?i/100:1)]}function i(t,i){return parseInt(e.css(t,i),10)||0}function s(t){var i=t[0];return 9===i.nodeType?{width:t.width(),height:t.height(),offset:{top:0,left:0}}:e.isWindow(i)?{width:t.width(),height:t.height(),offset:{top:t.scrollTop(),left:t.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:t.outerWidth(),height:t.outerHeight(),offset:t.offset()}}e.ui=e.ui||{};var n,a,o=Math.max,r=Math.abs,h=Math.round,l=/left|center|right/,u=/top|center|bottom/,d=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,p=/%$/,f=e.fn.position;e.position={scrollbarWidth:function(){if(void 0!==n)return n;var t,i,s=e("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),a=s.children()[0];return e("body").append(s),t=a.offsetWidth,s.css("overflow","scroll"),i=a.offsetWidth,t===i&&(i=s[0].clientWidth),s.remove(),n=t-i},getScrollInfo:function(t){var i=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),s=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),n="scroll"===i||"auto"===i&&t.width<t.element[0].scrollWidth,a="scroll"===s||"auto"===s&&t.height<t.element[0].scrollHeight;return{width:a?e.position.scrollbarWidth():0,height:n?e.position.scrollbarWidth():0}},getWithinInfo:function(t){var i=e(t||window),s=e.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType;return{element:i,isWindow:s,isDocument:n,offset:i.offset()||{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:s||n?i.width():i.outerWidth(),height:s||n?i.height():i.outerHeight()}}},e.fn.position=function(n){if(!n||!n.of)return f.apply(this,arguments);n=e.extend({},n);var p,m,g,v,y,b,_=e(n.of),x=e.position.getWithinInfo(n.within),w=e.position.getScrollInfo(x),k=(n.collision||"flip").split(" "),T={};return b=s(_),_[0].preventDefault&&(n.at="left top"),m=b.width,g=b.height,v=b.offset,y=e.extend({},v),e.each(["my","at"],function(){var e,t,i=(n[this]||"").split(" ");1===i.length&&(i=l.test(i[0])?i.concat(["center"]):u.test(i[0])?["center"].concat(i):["center","center"]),i[0]=l.test(i[0])?i[0]:"center",i[1]=u.test(i[1])?i[1]:"center",e=d.exec(i[0]),t=d.exec(i[1]),T[this]=[e?e[0]:0,t?t[0]:0],n[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===k.length&&(k[1]=k[0]),"right"===n.at[0]?y.left+=m:"center"===n.at[0]&&(y.left+=m/2),"bottom"===n.at[1]?y.top+=g:"center"===n.at[1]&&(y.top+=g/2),p=t(T.at,m,g),y.left+=p[0],y.top+=p[1],this.each(function(){var s,l,u=e(this),d=u.outerWidth(),c=u.outerHeight(),f=i(this,"marginLeft"),b=i(this,"marginTop"),D=d+f+i(this,"marginRight")+w.width,S=c+b+i(this,"marginBottom")+w.height,M=e.extend({},y),C=t(T.my,u.outerWidth(),u.outerHeight());"right"===n.my[0]?M.left-=d:"center"===n.my[0]&&(M.left-=d/2),"bottom"===n.my[1]?M.top-=c:"center"===n.my[1]&&(M.top-=c/2),M.left+=C[0],M.top+=C[1],a||(M.left=h(M.left),M.top=h(M.top)),s={marginLeft:f,marginTop:b},e.each(["left","top"],function(t,i){e.ui.position[k[t]]&&e.ui.position[k[t]][i](M,{targetWidth:m,targetHeight:g,elemWidth:d,elemHeight:c,collisionPosition:s,collisionWidth:D,collisionHeight:S,offset:[p[0]+C[0],p[1]+C[1]],my:n.my,at:n.at,within:x,elem:u})}),n.using&&(l=function(e){var t=v.left-M.left,i=t+m-d,s=v.top-M.top,a=s+g-c,h={target:{element:_,left:v.left,top:v.top,width:m,height:g},element:{element:u,left:M.left,top:M.top,width:d,height:c},horizontal:0>i?"left":t>0?"right":"center",vertical:0>a?"top":s>0?"bottom":"middle"};d>m&&m>r(t+i)&&(h.horizontal="center"),c>g&&g>r(s+a)&&(h.vertical="middle"),h.important=o(r(t),r(i))>o(r(s),r(a))?"horizontal":"vertical",n.using.call(this,e,h)}),u.offset(e.extend(M,{using:l}))})},e.ui.position={fit:{left:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=e.left-t.collisionPosition.marginLeft,h=n-r,l=r+t.collisionWidth-a-n;t.collisionWidth>a?h>0&&0>=l?(i=e.left+h+t.collisionWidth-a-n,e.left+=h-i):e.left=l>0&&0>=h?n:h>l?n+a-t.collisionWidth:n:h>0?e.left+=h:l>0?e.left-=l:e.left=o(e.left-r,e.left)},top:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollTop:s.offset.top,a=t.within.height,r=e.top-t.collisionPosition.marginTop,h=n-r,l=r+t.collisionHeight-a-n;t.collisionHeight>a?h>0&&0>=l?(i=e.top+h+t.collisionHeight-a-n,e.top+=h-i):e.top=l>0&&0>=h?n:h>l?n+a-t.collisionHeight:n:h>0?e.top+=h:l>0?e.top-=l:e.top=o(e.top-r,e.top)}},flip:{left:function(e,t){var i,s,n=t.within,a=n.offset.left+n.scrollLeft,o=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=e.left-t.collisionPosition.marginLeft,u=l-h,d=l+t.collisionWidth-o-h,c="left"===t.my[0]?-t.elemWidth:"right"===t.my[0]?t.elemWidth:0,p="left"===t.at[0]?t.targetWidth:"right"===t.at[0]?-t.targetWidth:0,f=-2*t.offset[0];0>u?(i=e.left+c+p+f+t.collisionWidth-o-a,(0>i||r(u)>i)&&(e.left+=c+p+f)):d>0&&(s=e.left-t.collisionPosition.marginLeft+c+p+f-h,(s>0||d>r(s))&&(e.left+=c+p+f))},top:function(e,t){var i,s,n=t.within,a=n.offset.top+n.scrollTop,o=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=e.top-t.collisionPosition.marginTop,u=l-h,d=l+t.collisionHeight-o-h,c="top"===t.my[1],p=c?-t.elemHeight:"bottom"===t.my[1]?t.elemHeight:0,f="top"===t.at[1]?t.targetHeight:"bottom"===t.at[1]?-t.targetHeight:0,m=-2*t.offset[1];0>u?(s=e.top+p+f+m+t.collisionHeight-o-a,(0>s||r(u)>s)&&(e.top+=p+f+m)):d>0&&(i=e.top-t.collisionPosition.marginTop+p+f+m-h,(i>0||d>r(i))&&(e.top+=p+f+m))}},flipfit:{left:function(){e.ui.position.flip.left.apply(this,arguments),e.ui.position.fit.left.apply(this,arguments)},top:function(){e.ui.position.flip.top.apply(this,arguments),e.ui.position.fit.top.apply(this,arguments)}}},function(){var t,i,s,n,o,r=document.getElementsByTagName("body")[0],h=document.createElement("div");t=document.createElement(r?"div":"body"),s={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},r&&e.extend(s,{position:"absolute",left:"-1000px",top:"-1000px"});for(o in s)t.style[o]=s[o];t.appendChild(h),i=r||document.documentElement,i.insertBefore(t,i.firstChild),h.style.cssText="position: absolute; left: 10.7432222px;",n=e(h).offset().left,a=n>10&&11>n,t.innerHTML="",i.removeChild(t)}()}(),e.ui.position,e.widget("ui.accordion",{version:"1.11.4",options:{active:0,animate:{},collapsible:!1,event:"click",header:"> li > :first-child,> :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var t=this.options;this.prevShow=this.prevHide=e(),this.element.addClass("ui-accordion ui-widget ui-helper-reset").attr("role","tablist"),t.collapsible||t.active!==!1&&null!=t.active||(t.active=0),this._processPanels(),0>t.active&&(t.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():e()}},_createIcons:function(){var t=this.options.icons;t&&(e("<span>").addClass("ui-accordion-header-icon ui-icon "+t.header).prependTo(this.headers),this.active.children(".ui-accordion-header-icon").removeClass(t.header).addClass(t.activeHeader),this.headers.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.removeClass("ui-accordion-icons").children(".ui-accordion-header-icon").remove()},_destroy:function(){var e;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.removeClass("ui-accordion-header ui-accordion-header-active ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("aria-controls").removeAttr("tabIndex").removeUniqueId(),this._destroyIcons(),e=this.headers.next().removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled").css("display","").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&e.css("height","")},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):("event"===e&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(t)),this._super(e,t),"collapsible"!==e||t||this.options.active!==!1||this._activate(0),"icons"===e&&(this._destroyIcons(),t&&this._createIcons()),"disabled"===e&&(this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this.headers.add(this.headers.next()).toggleClass("ui-state-disabled",!!t)),void 0)},_keydown:function(t){if(!t.altKey&&!t.ctrlKey){var i=e.ui.keyCode,s=this.headers.length,n=this.headers.index(t.target),a=!1;switch(t.keyCode){case i.RIGHT:case i.DOWN:a=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:a=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(t);break;case i.HOME:a=this.headers[0];break;case i.END:a=this.headers[s-1]}a&&(e(t.target).attr("tabIndex",-1),e(a).attr("tabIndex",0),a.focus(),t.preventDefault())}},_panelKeyDown:function(t){t.keyCode===e.ui.keyCode.UP&&t.ctrlKey&&e(t.currentTarget).prev().focus()},refresh:function(){var t=this.options;this._processPanels(),t.active===!1&&t.collapsible===!0||!this.headers.length?(t.active=!1,this.active=e()):t.active===!1?this._activate(0):this.active.length&&!e.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(t.active=!1,this.active=e()):this._activate(Math.max(0,t.active-1)):t.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var e=this.headers,t=this.panels;this.headers=this.element.find(this.options.header).addClass("ui-accordion-header ui-state-default ui-corner-all"),this.panels=this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom").filter(":not(.ui-accordion-content-active)").hide(),t&&(this._off(e.not(this.headers)),this._off(t.not(this.panels)))},_refresh:function(){var t,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active).addClass("ui-accordion-header-active ui-state-active ui-corner-top").removeClass("ui-corner-all"),this.active.next().addClass("ui-accordion-content-active").show(),this.headers.attr("role","tab").each(function(){var t=e(this),i=t.uniqueId().attr("id"),s=t.next(),n=s.uniqueId().attr("id");t.attr("aria-controls",n),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===s?(t=n.height(),this.element.siblings(":visible").each(function(){var i=e(this),s=i.css("position");"absolute"!==s&&"fixed"!==s&&(t-=i.outerHeight(!0))}),this.headers.each(function(){t-=e(this).outerHeight(!0)}),this.headers.next().each(function(){e(this).height(Math.max(0,t-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===s&&(t=0,this.headers.next().each(function(){t=Math.max(t,e(this).css("height","").height())}).height(t))},_activate:function(t){var i=this._findActive(t)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return"number"==typeof t?this.headers.eq(t):e()},_setupEvents:function(t){var i={keydown:"_keydown"};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n[0]===s[0],o=a&&i.collapsible,r=o?e():n.next(),h=s.next(),l={oldHeader:s,oldPanel:h,newHeader:o?e():n,newPanel:r};t.preventDefault(),a&&!i.collapsible||this._trigger("beforeActivate",t,l)===!1||(i.active=o?!1:this.headers.index(n),this.active=a?e():n,this._toggle(l),s.removeClass("ui-accordion-header-active ui-state-active"),i.icons&&s.children(".ui-accordion-header-icon").removeClass(i.icons.activeHeader).addClass(i.icons.header),a||(n.removeClass("ui-corner-all").addClass("ui-accordion-header-active ui-state-active ui-corner-top"),i.icons&&n.children(".ui-accordion-header-icon").removeClass(i.icons.header).addClass(i.icons.activeHeader),n.next().addClass("ui-accordion-content-active")))},_toggle:function(t){var i=t.newPanel,s=this.prevShow.length?this.prevShow:t.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,t):(s.hide(),i.show(),this._toggleComplete(t)),s.attr({"aria-hidden":"true"}),s.prev().attr({"aria-selected":"false","aria-expanded":"false"}),i.length&&s.length?s.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===parseInt(e(this).attr("tabIndex"),10)}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(e,t,i){var s,n,a,o=this,r=0,h=e.css("box-sizing"),l=e.length&&(!t.length||e.index()<t.index()),u=this.options.animate||{},d=l&&u.down||u,c=function(){o._toggleComplete(i)};return"number"==typeof d&&(a=d),"string"==typeof d&&(n=d),n=n||d.easing||u.easing,a=a||d.duration||u.duration,t.length?e.length?(s=e.show().outerHeight(),t.animate(this.hideProps,{duration:a,easing:n,step:function(e,t){t.now=Math.round(e)}}),e.hide().animate(this.showProps,{duration:a,easing:n,complete:c,step:function(e,i){i.now=Math.round(e),"height"!==i.prop?"content-box"===h&&(r+=i.now):"content"!==o.options.heightStyle&&(i.now=Math.round(s-t.outerHeight()-r),r=0)}}),void 0):t.animate(this.hideProps,a,n,c):e.animate(this.showProps,a,n,c)},_toggleComplete:function(e){var t=e.oldPanel;t.removeClass("ui-accordion-content-active").prev().removeClass("ui-corner-top").addClass("ui-corner-all"),t.length&&(t.parent()[0].className=t.parent()[0].className),this._trigger("activate",null,e)}}),e.widget("ui.menu",{version:"1.11.4",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-carat-1-e"},items:"> *",menus:"ul",position:{my:"left-1 top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().addClass("ui-menu ui-widget ui-widget-content").toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length).attr({role:this.options.role,tabIndex:0}),this.options.disabled&&this.element.addClass("ui-state-disabled").attr("aria-disabled","true"),this._on({"mousedown .ui-menu-item":function(e){e.preventDefault()},"click .ui-menu-item":function(t){var i=e(t.target);!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(t),t.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(t):!this.element.is(":focus")&&e(this.document[0].activeElement).closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(t){if(!this.previousFilter){var i=e(t.currentTarget);
7
+ i.siblings(".ui-state-active").removeClass("ui-state-active"),this.focus(t,i)}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(e,t){var i=this.active||this.element.find(this.options.items).eq(0);t||this.focus(e,i)},blur:function(t){this._delay(function(){e.contains(this.element[0],this.document[0].activeElement)||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(e){this._closeOnDocumentClick(e)&&this.collapseAll(e),this.mouseHandled=!1}})},_destroy:function(){this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeClass("ui-menu ui-widget ui-widget-content ui-menu-icons ui-front").removeAttr("role").removeAttr("tabIndex").removeAttr("aria-labelledby").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-disabled").removeUniqueId().show(),this.element.find(".ui-menu-item").removeClass("ui-menu-item").removeAttr("role").removeAttr("aria-disabled").removeUniqueId().removeClass("ui-state-hover").removeAttr("tabIndex").removeAttr("role").removeAttr("aria-haspopup").children().each(function(){var t=e(this);t.data("ui-menu-submenu-carat")&&t.remove()}),this.element.find(".ui-menu-divider").removeClass("ui-menu-divider ui-widget-content")},_keydown:function(t){var i,s,n,a,o=!0;switch(t.keyCode){case e.ui.keyCode.PAGE_UP:this.previousPage(t);break;case e.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case e.ui.keyCode.HOME:this._move("first","first",t);break;case e.ui.keyCode.END:this._move("last","last",t);break;case e.ui.keyCode.UP:this.previous(t);break;case e.ui.keyCode.DOWN:this.next(t);break;case e.ui.keyCode.LEFT:this.collapse(t);break;case e.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case e.ui.keyCode.ENTER:case e.ui.keyCode.SPACE:this._activate(t);break;case e.ui.keyCode.ESCAPE:this.collapse(t);break;default:o=!1,s=this.previousFilter||"",n=String.fromCharCode(t.keyCode),a=!1,clearTimeout(this.filterTimer),n===s?a=!0:n=s+n,i=this._filterMenuItems(n),i=a&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i,i.length||(n=String.fromCharCode(t.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(t,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}o&&t.preventDefault()},_activate:function(e){this.active.is(".ui-state-disabled")||(this.active.is("[aria-haspopup='true']")?this.expand(e):this.select(e))},refresh:function(){var t,i,s=this,n=this.options.icons.submenu,a=this.element.find(this.options.menus);this.element.toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length),a.filter(":not(.ui-menu)").addClass("ui-menu ui-widget ui-widget-content ui-front").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var t=e(this),i=t.parent(),s=e("<span>").addClass("ui-menu-icon ui-icon "+n).data("ui-menu-submenu-carat",!0);i.attr("aria-haspopup","true").prepend(s),t.attr("aria-labelledby",i.attr("id"))}),t=a.add(this.element),i=t.find(this.options.items),i.not(".ui-menu-item").each(function(){var t=e(this);s._isDivider(t)&&t.addClass("ui-widget-content ui-menu-divider")}),i.not(".ui-menu-item, .ui-menu-divider").addClass("ui-menu-item").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!e.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(e,t){"icons"===e&&this.element.find(".ui-menu-icon").removeClass(this.options.icons.submenu).addClass(t.submenu),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},focus:function(e,t){var i,s;this.blur(e,e&&"focus"===e.type),this._scrollIntoView(t),this.active=t.first(),s=this.active.addClass("ui-state-focus").removeClass("ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),this.active.parent().closest(".ui-menu-item").addClass("ui-state-active"),e&&"keydown"===e.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=t.children(".ui-menu"),i.length&&e&&/^mouse/.test(e.type)&&this._startOpening(i),this.activeMenu=t.parent(),this._trigger("focus",e,{item:t})},_scrollIntoView:function(t){var i,s,n,a,o,r;this._hasScroll()&&(i=parseFloat(e.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(e.css(this.activeMenu[0],"paddingTop"))||0,n=t.offset().top-this.activeMenu.offset().top-i-s,a=this.activeMenu.scrollTop(),o=this.activeMenu.height(),r=t.outerHeight(),0>n?this.activeMenu.scrollTop(a+n):n+r>o&&this.activeMenu.scrollTop(a+n-o+r))},blur:function(e,t){t||clearTimeout(this.timer),this.active&&(this.active.removeClass("ui-state-focus"),this.active=null,this._trigger("blur",e,{item:this.active}))},_startOpening:function(e){clearTimeout(this.timer),"true"===e.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(e)},this.delay))},_open:function(t){var i=e.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(t.parents(".ui-menu")).hide().attr("aria-hidden","true"),t.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(t,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:e(t&&t.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(t),this.activeMenu=s},this.delay)},_close:function(e){e||(e=this.active?this.active.parent():this.element),e.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false").end().find(".ui-state-active").not(".ui-state-focus").removeClass("ui-state-active")},_closeOnDocumentClick:function(t){return!e(t.target).closest(".ui-menu").length},_isDivider:function(e){return!/[^\-\u2014\u2013\s]/.test(e.text())},collapse:function(e){var t=this.active&&this.active.parent().closest(".ui-menu-item",this.element);t&&t.length&&(this._close(),this.focus(e,t))},expand:function(e){var t=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();t&&t.length&&(this._open(t.parent()),this._delay(function(){this.focus(e,t)}))},next:function(e){this._move("next","first",e)},previous:function(e){this._move("prev","last",e)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(e,t,i){var s;this.active&&(s="first"===e||"last"===e?this.active["first"===e?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[e+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[t]()),this.focus(i,s)},nextPage:function(t){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=e(this),0>i.offset().top-s-n}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(t),void 0)},previousPage:function(t){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=e(this),i.offset().top-s+n>0}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items).first())),void 0):(this.next(t),void 0)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(t){this.active=this.active||e(t.target).closest(".ui-menu-item");var i={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(t,!0),this._trigger("select",t,i)},_filterMenuItems:function(t){var i=t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&"),s=RegExp("^"+i,"i");return this.activeMenu.find(this.options.items).filter(".ui-menu-item").filter(function(){return s.test(e.trim(e(this).text()))})}}),e.widget("ui.autocomplete",{version:"1.11.4",defaultElement:"<input>",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var t,i,s,n=this.element[0].nodeName.toLowerCase(),a="textarea"===n,o="input"===n;this.isMultiLine=a?!0:o?!1:this.element.prop("isContentEditable"),this.valueMethod=this.element[a||o?"val":"text"],this.isNewMenu=!0,this.element.addClass("ui-autocomplete-input").attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return t=!0,s=!0,i=!0,void 0;t=!1,s=!1,i=!1;var a=e.ui.keyCode;switch(n.keyCode){case a.PAGE_UP:t=!0,this._move("previousPage",n);break;case a.PAGE_DOWN:t=!0,this._move("nextPage",n);break;case a.UP:t=!0,this._keyEvent("previous",n);break;case a.DOWN:t=!0,this._keyEvent("next",n);break;case a.ENTER:this.menu.active&&(t=!0,n.preventDefault(),this.menu.select(n));break;case a.TAB:this.menu.active&&this.menu.select(n);break;case a.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(t)return t=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=e.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(e){return s?(s=!1,e.preventDefault(),void 0):(this._searchTimeout(e),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(e),this._change(e),void 0)}}),this._initSource(),this.menu=e("<ul>").addClass("ui-autocomplete ui-front").appendTo(this._appendTo()).menu({role:null}).hide().menu("instance"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur});var i=this.menu.element[0];e(t.target).closest(".ui-menu-item").length||this._delay(function(){var t=this;this.document.one("mousedown",function(s){s.target===t.element[0]||s.target===i||e.contains(i,s.target)||t.close()})})},menufocus:function(t,i){var s,n;return this.isNewMenu&&(this.isNewMenu=!1,t.originalEvent&&/^mouse/.test(t.originalEvent.type))?(this.menu.blur(),this.document.one("mousemove",function(){e(t.target).trigger(t.originalEvent)}),void 0):(n=i.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",t,{item:n})&&t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(n.value),s=i.item.attr("aria-label")||n.value,s&&e.trim(s).length&&(this.liveRegion.children().hide(),e("<div>").text(s).appendTo(this.liveRegion)),void 0)},menuselect:function(e,t){var i=t.item.data("ui-autocomplete-item"),s=this.previous;this.element[0]!==this.document[0].activeElement&&(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s,this.selectedItem=i})),!1!==this._trigger("select",e,{item:i})&&this._value(i.value),this.term=this._value(),this.close(e),this.selectedItem=i}}),this.liveRegion=e("<span>",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).addClass("ui-helper-hidden-accessible").appendTo(this.document[0].body),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(e,t){this._super(e,t),"source"===e&&this._initSource(),"appendTo"===e&&this.menu.element.appendTo(this._appendTo()),"disabled"===e&&t&&this.xhr&&this.xhr.abort()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_initSource:function(){var t,i,s=this;e.isArray(this.options.source)?(t=this.options.source,this.source=function(i,s){s(e.ui.autocomplete.filter(t,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(t,n){s.xhr&&s.xhr.abort(),s.xhr=e.ajax({url:i,data:t,dataType:"json",success:function(e){n(e)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(e){clearTimeout(this.searching),this.searching=this._delay(function(){var t=this.term===this._value(),i=this.menu.element.is(":visible"),s=e.altKey||e.ctrlKey||e.metaKey||e.shiftKey;(!t||t&&!i&&!s)&&(this.selectedItem=null,this.search(null,e))},this.options.delay)},search:function(e,t){return e=null!=e?e:this._value(),this.term=this._value(),e.length<this.options.minLength?this.close(t):this._trigger("search",t)!==!1?this._search(e):void 0},_search:function(e){this.pending++,this.element.addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:e},this._response())},_response:function(){var t=++this.requestIndex;return e.proxy(function(e){t===this.requestIndex&&this.__response(e),this.pending--,this.pending||this.element.removeClass("ui-autocomplete-loading")},this)},__response:function(e){e&&(e=this._normalize(e)),this._trigger("response",null,{content:e}),!this.options.disabled&&e&&e.length&&!this.cancelSearch?(this._suggest(e),this._trigger("open")):this._close()},close:function(e){this.cancelSearch=!0,this._close(e)},_close:function(e){this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",e))},_change:function(e){this.previous!==this._value()&&this._trigger("change",e,{item:this.selectedItem})},_normalize:function(t){return t.length&&t[0].label&&t[0].value?t:e.map(t,function(t){return"string"==typeof t?{label:t,value:t}:e.extend({},t,{label:t.label||t.value,value:t.value||t.label})})},_suggest:function(t){var i=this.menu.element.empty();this._renderMenu(i,t),this.isNewMenu=!0,this.menu.refresh(),i.show(),this._resizeMenu(),i.position(e.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next()},_resizeMenu:function(){var e=this.menu.element;e.outerWidth(Math.max(e.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(t,i){var s=this;e.each(i,function(e,i){s._renderItemData(t,i)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-autocomplete-item",t)},_renderItem:function(t,i){return e("<li>").text(i.label).appendTo(t)},_move:function(e,t){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(e)||this.menu.isLastItem()&&/^next/.test(e)?(this.isMultiLine||this._value(this.term),this.menu.blur(),void 0):(this.menu[e](t),void 0):(this.search(null,t),void 0)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(e,t){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(e,t),t.preventDefault())}}),e.extend(e.ui.autocomplete,{escapeRegex:function(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(t,i){var s=RegExp(e.ui.autocomplete.escapeRegex(i),"i");return e.grep(t,function(e){return s.test(e.label||e.value||e)})}}),e.widget("ui.autocomplete",e.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(e){return e+(e>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(t){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=t&&t.length?this.options.messages.results(t.length):this.options.messages.noResults,this.liveRegion.children().hide(),e("<div>").text(i).appendTo(this.liveRegion))}}),e.ui.autocomplete;var c,p="ui-button ui-widget ui-state-default ui-corner-all",f="ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",m=function(){var t=e(this);setTimeout(function(){t.find(":ui-button").button("refresh")},1)},g=function(t){var i=t.name,s=t.form,n=e([]);return i&&(i=i.replace(/'/g,"\\'"),n=s?e(s).find("[name='"+i+"'][type=radio]"):e("[name='"+i+"'][type=radio]",t.ownerDocument).filter(function(){return!this.form})),n};e.widget("ui.button",{version:"1.11.4",defaultElement:"<button>",options:{disabled:null,text:!0,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset"+this.eventNamespace).bind("reset"+this.eventNamespace,m),"boolean"!=typeof this.options.disabled?this.options.disabled=!!this.element.prop("disabled"):this.element.prop("disabled",this.options.disabled),this._determineButtonType(),this.hasTitle=!!this.buttonElement.attr("title");var t=this,i=this.options,s="checkbox"===this.type||"radio"===this.type,n=s?"":"ui-state-active";null===i.label&&(i.label="input"===this.type?this.buttonElement.val():this.buttonElement.html()),this._hoverable(this.buttonElement),this.buttonElement.addClass(p).attr("role","button").bind("mouseenter"+this.eventNamespace,function(){i.disabled||this===c&&e(this).addClass("ui-state-active")}).bind("mouseleave"+this.eventNamespace,function(){i.disabled||e(this).removeClass(n)}).bind("click"+this.eventNamespace,function(e){i.disabled&&(e.preventDefault(),e.stopImmediatePropagation())}),this._on({focus:function(){this.buttonElement.addClass("ui-state-focus")},blur:function(){this.buttonElement.removeClass("ui-state-focus")}}),s&&this.element.bind("change"+this.eventNamespace,function(){t.refresh()}),"checkbox"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){return i.disabled?!1:void 0}):"radio"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){if(i.disabled)return!1;e(this).addClass("ui-state-active"),t.buttonElement.attr("aria-pressed","true");var s=t.element[0];g(s).not(s).map(function(){return e(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed","false")}):(this.buttonElement.bind("mousedown"+this.eventNamespace,function(){return i.disabled?!1:(e(this).addClass("ui-state-active"),c=this,t.document.one("mouseup",function(){c=null}),void 0)}).bind("mouseup"+this.eventNamespace,function(){return i.disabled?!1:(e(this).removeClass("ui-state-active"),void 0)}).bind("keydown"+this.eventNamespace,function(t){return i.disabled?!1:((t.keyCode===e.ui.keyCode.SPACE||t.keyCode===e.ui.keyCode.ENTER)&&e(this).addClass("ui-state-active"),void 0)}).bind("keyup"+this.eventNamespace+" blur"+this.eventNamespace,function(){e(this).removeClass("ui-state-active")}),this.buttonElement.is("a")&&this.buttonElement.keyup(function(t){t.keyCode===e.ui.keyCode.SPACE&&e(this).click()})),this._setOption("disabled",i.disabled),this._resetButton()},_determineButtonType:function(){var e,t,i;this.type=this.element.is("[type=checkbox]")?"checkbox":this.element.is("[type=radio]")?"radio":this.element.is("input")?"input":"button","checkbox"===this.type||"radio"===this.type?(e=this.element.parents().last(),t="label[for='"+this.element.attr("id")+"']",this.buttonElement=e.find(t),this.buttonElement.length||(e=e.length?e.siblings():this.element.siblings(),this.buttonElement=e.filter(t),this.buttonElement.length||(this.buttonElement=e.find(t))),this.element.addClass("ui-helper-hidden-accessible"),i=this.element.is(":checked"),i&&this.buttonElement.addClass("ui-state-active"),this.buttonElement.prop("aria-pressed",i)):this.buttonElement=this.element},widget:function(){return this.buttonElement},_destroy:function(){this.element.removeClass("ui-helper-hidden-accessible"),this.buttonElement.removeClass(p+" ui-state-active "+f).removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html()),this.hasTitle||this.buttonElement.removeAttr("title")},_setOption:function(e,t){return this._super(e,t),"disabled"===e?(this.widget().toggleClass("ui-state-disabled",!!t),this.element.prop("disabled",!!t),t&&("checkbox"===this.type||"radio"===this.type?this.buttonElement.removeClass("ui-state-focus"):this.buttonElement.removeClass("ui-state-focus ui-state-active")),void 0):(this._resetButton(),void 0)},refresh:function(){var t=this.element.is("input, button")?this.element.is(":disabled"):this.element.hasClass("ui-button-disabled");t!==this.options.disabled&&this._setOption("disabled",t),"radio"===this.type?g(this.element[0]).each(function(){e(this).is(":checked")?e(this).button("widget").addClass("ui-state-active").attr("aria-pressed","true"):e(this).button("widget").removeClass("ui-state-active").attr("aria-pressed","false")}):"checkbox"===this.type&&(this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed","true"):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed","false"))},_resetButton:function(){if("input"===this.type)return this.options.label&&this.element.val(this.options.label),void 0;var t=this.buttonElement.removeClass(f),i=e("<span></span>",this.document[0]).addClass("ui-button-text").html(this.options.label).appendTo(t.empty()).text(),s=this.options.icons,n=s.primary&&s.secondary,a=[];s.primary||s.secondary?(this.options.text&&a.push("ui-button-text-icon"+(n?"s":s.primary?"-primary":"-secondary")),s.primary&&t.prepend("<span class='ui-button-icon-primary ui-icon "+s.primary+"'></span>"),s.secondary&&t.append("<span class='ui-button-icon-secondary ui-icon "+s.secondary+"'></span>"),this.options.text||(a.push(n?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||t.attr("title",e.trim(i)))):a.push("ui-button-text-only"),t.addClass(a.join(" "))}}),e.widget("ui.buttonset",{version:"1.11.4",options:{items:"button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(e,t){"disabled"===e&&this.buttons.button("option",e,t),this._super(e,t)},refresh:function(){var t="rtl"===this.element.css("direction"),i=this.element.find(this.options.items),s=i.filter(":ui-button");i.not(":ui-button").button(),s.button("refresh"),this.buttons=i.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(t?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(t?"ui-corner-left":"ui-corner-right").end().end()},_destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy")}}),e.ui.button,e.extend(e.ui,{datepicker:{version:"1.11.4"}});var v;e.extend(n.prototype,{markerClassName:"hasDatepicker",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(e){return r(this._defaults,e||{}),this},_attachDatepicker:function(t,i){var s,n,a;s=t.nodeName.toLowerCase(),n="div"===s||"span"===s,t.id||(this.uuid+=1,t.id="dp"+this.uuid),a=this._newInst(e(t),n),a.settings=e.extend({},i||{}),"input"===s?this._connectDatepicker(t,a):n&&this._inlineDatepicker(t,a)},_newInst:function(t,i){var s=t[0].id.replace(/([^A-Za-z0-9_\-])/g,"\\\\$1");return{id:s,input:t,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:i,dpDiv:i?a(e("<div class='"+this._inlineClass+" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")):this.dpDiv}},_connectDatepicker:function(t,i){var s=e(t);i.append=e([]),i.trigger=e([]),s.hasClass(this.markerClassName)||(this._attachments(s,i),s.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp),this._autoSize(i),e.data(t,"datepicker",i),i.settings.disabled&&this._disableDatepicker(t))},_attachments:function(t,i){var s,n,a,o=this._get(i,"appendText"),r=this._get(i,"isRTL");i.append&&i.append.remove(),o&&(i.append=e("<span class='"+this._appendClass+"'>"+o+"</span>"),t[r?"before":"after"](i.append)),t.unbind("focus",this._showDatepicker),i.trigger&&i.trigger.remove(),s=this._get(i,"showOn"),("focus"===s||"both"===s)&&t.focus(this._showDatepicker),("button"===s||"both"===s)&&(n=this._get(i,"buttonText"),a=this._get(i,"buttonImage"),i.trigger=e(this._get(i,"buttonImageOnly")?e("<img/>").addClass(this._triggerClass).attr({src:a,alt:n,title:n}):e("<button type='button'></button>").addClass(this._triggerClass).html(a?e("<img/>").attr({src:a,alt:n,title:n}):n)),t[r?"before":"after"](i.trigger),i.trigger.click(function(){return e.datepicker._datepickerShowing&&e.datepicker._lastInput===t[0]?e.datepicker._hideDatepicker():e.datepicker._datepickerShowing&&e.datepicker._lastInput!==t[0]?(e.datepicker._hideDatepicker(),e.datepicker._showDatepicker(t[0])):e.datepicker._showDatepicker(t[0]),!1}))},_autoSize:function(e){if(this._get(e,"autoSize")&&!e.inline){var t,i,s,n,a=new Date(2009,11,20),o=this._get(e,"dateFormat");o.match(/[DM]/)&&(t=function(e){for(i=0,s=0,n=0;e.length>n;n++)e[n].length>i&&(i=e[n].length,s=n);return s},a.setMonth(t(this._get(e,o.match(/MM/)?"monthNames":"monthNamesShort"))),a.setDate(t(this._get(e,o.match(/DD/)?"dayNames":"dayNamesShort"))+20-a.getDay())),e.input.attr("size",this._formatDate(e,a).length)}},_inlineDatepicker:function(t,i){var s=e(t);s.hasClass(this.markerClassName)||(s.addClass(this.markerClassName).append(i.dpDiv),e.data(t,"datepicker",i),this._setDate(i,this._getDefaultDate(i),!0),this._updateDatepicker(i),this._updateAlternate(i),i.settings.disabled&&this._disableDatepicker(t),i.dpDiv.css("display","block"))},_dialogDatepicker:function(t,i,s,n,a){var o,h,l,u,d,c=this._dialogInst;return c||(this.uuid+=1,o="dp"+this.uuid,this._dialogInput=e("<input type='text' id='"+o+"' style='position: absolute; top: -100px; width: 0px;'/>"),this._dialogInput.keydown(this._doKeyDown),e("body").append(this._dialogInput),c=this._dialogInst=this._newInst(this._dialogInput,!1),c.settings={},e.data(this._dialogInput[0],"datepicker",c)),r(c.settings,n||{}),i=i&&i.constructor===Date?this._formatDate(c,i):i,this._dialogInput.val(i),this._pos=a?a.length?a:[a.pageX,a.pageY]:null,this._pos||(h=document.documentElement.clientWidth,l=document.documentElement.clientHeight,u=document.documentElement.scrollLeft||document.body.scrollLeft,d=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[h/2-100+u,l/2-150+d]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),c.settings.onSelect=s,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),e.blockUI&&e.blockUI(this.dpDiv),e.data(this._dialogInput[0],"datepicker",c),this},_destroyDatepicker:function(t){var i,s=e(t),n=e.data(t,"datepicker");s.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),e.removeData(t,"datepicker"),"input"===i?(n.append.remove(),n.trigger.remove(),s.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):("div"===i||"span"===i)&&s.removeClass(this.markerClassName).empty(),v===n&&(v=null))},_enableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,"datepicker");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!1,a.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().removeClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}))},_disableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,"datepicker");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!0,a.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().addClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}),this._disabledInputs[this._disabledInputs.length]=t)},_isDisabledDatepicker:function(e){if(!e)return!1;for(var t=0;this._disabledInputs.length>t;t++)if(this._disabledInputs[t]===e)return!0;return!1},_getInst:function(t){try{return e.data(t,"datepicker")}catch(i){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(t,i,s){var n,a,o,h,l=this._getInst(t);return 2===arguments.length&&"string"==typeof i?"defaults"===i?e.extend({},e.datepicker._defaults):l?"all"===i?e.extend({},l.settings):this._get(l,i):null:(n=i||{},"string"==typeof i&&(n={},n[i]=s),l&&(this._curInst===l&&this._hideDatepicker(),a=this._getDateDatepicker(t,!0),o=this._getMinMaxDate(l,"min"),h=this._getMinMaxDate(l,"max"),r(l.settings,n),null!==o&&void 0!==n.dateFormat&&void 0===n.minDate&&(l.settings.minDate=this._formatDate(l,o)),null!==h&&void 0!==n.dateFormat&&void 0===n.maxDate&&(l.settings.maxDate=this._formatDate(l,h)),"disabled"in n&&(n.disabled?this._disableDatepicker(t):this._enableDatepicker(t)),this._attachments(e(t),l),this._autoSize(l),this._setDate(l,a),this._updateAlternate(l),this._updateDatepicker(l)),void 0)},_changeDatepicker:function(e,t,i){this._optionDatepicker(e,t,i)},_refreshDatepicker:function(e){var t=this._getInst(e);t&&this._updateDatepicker(t)},_setDateDatepicker:function(e,t){var i=this._getInst(e);i&&(this._setDate(i,t),this._updateDatepicker(i),this._updateAlternate(i))},_getDateDatepicker:function(e,t){var i=this._getInst(e);return i&&!i.inline&&this._setDateFromField(i,t),i?this._getDate(i):null},_doKeyDown:function(t){var i,s,n,a=e.datepicker._getInst(t.target),o=!0,r=a.dpDiv.is(".ui-datepicker-rtl");if(a._keyEvent=!0,e.datepicker._datepickerShowing)switch(t.keyCode){case 9:e.datepicker._hideDatepicker(),o=!1;break;case 13:return n=e("td."+e.datepicker._dayOverClass+":not(."+e.datepicker._currentClass+")",a.dpDiv),n[0]&&e.datepicker._selectDay(t.target,a.selectedMonth,a.selectedYear,n[0]),i=e.datepicker._get(a,"onSelect"),i?(s=e.datepicker._formatDate(a),i.apply(a.input?a.input[0]:null,[s,a])):e.datepicker._hideDatepicker(),!1;case 27:e.datepicker._hideDatepicker();break;case 33:e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,"stepBigMonths"):-e.datepicker._get(a,"stepMonths"),"M");break;case 34:e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,"stepBigMonths"):+e.datepicker._get(a,"stepMonths"),"M");break;case 35:(t.ctrlKey||t.metaKey)&&e.datepicker._clearDate(t.target),o=t.ctrlKey||t.metaKey;break;case 36:(t.ctrlKey||t.metaKey)&&e.datepicker._gotoToday(t.target),o=t.ctrlKey||t.metaKey;break;case 37:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?1:-1,"D"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,"stepBigMonths"):-e.datepicker._get(a,"stepMonths"),"M");break;case 38:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,-7,"D"),o=t.ctrlKey||t.metaKey;break;case 39:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?-1:1,"D"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,"stepBigMonths"):+e.datepicker._get(a,"stepMonths"),"M");break;case 40:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,7,"D"),o=t.ctrlKey||t.metaKey;break;default:o=!1}else 36===t.keyCode&&t.ctrlKey?e.datepicker._showDatepicker(this):o=!1;o&&(t.preventDefault(),t.stopPropagation())},_doKeyPress:function(t){var i,s,n=e.datepicker._getInst(t.target);
8
+ return e.datepicker._get(n,"constrainInput")?(i=e.datepicker._possibleChars(e.datepicker._get(n,"dateFormat")),s=String.fromCharCode(null==t.charCode?t.keyCode:t.charCode),t.ctrlKey||t.metaKey||" ">s||!i||i.indexOf(s)>-1):void 0},_doKeyUp:function(t){var i,s=e.datepicker._getInst(t.target);if(s.input.val()!==s.lastVal)try{i=e.datepicker.parseDate(e.datepicker._get(s,"dateFormat"),s.input?s.input.val():null,e.datepicker._getFormatConfig(s)),i&&(e.datepicker._setDateFromField(s),e.datepicker._updateAlternate(s),e.datepicker._updateDatepicker(s))}catch(n){}return!0},_showDatepicker:function(t){if(t=t.target||t,"input"!==t.nodeName.toLowerCase()&&(t=e("input",t.parentNode)[0]),!e.datepicker._isDisabledDatepicker(t)&&e.datepicker._lastInput!==t){var i,n,a,o,h,l,u;i=e.datepicker._getInst(t),e.datepicker._curInst&&e.datepicker._curInst!==i&&(e.datepicker._curInst.dpDiv.stop(!0,!0),i&&e.datepicker._datepickerShowing&&e.datepicker._hideDatepicker(e.datepicker._curInst.input[0])),n=e.datepicker._get(i,"beforeShow"),a=n?n.apply(t,[t,i]):{},a!==!1&&(r(i.settings,a),i.lastVal=null,e.datepicker._lastInput=t,e.datepicker._setDateFromField(i),e.datepicker._inDialog&&(t.value=""),e.datepicker._pos||(e.datepicker._pos=e.datepicker._findPos(t),e.datepicker._pos[1]+=t.offsetHeight),o=!1,e(t).parents().each(function(){return o|="fixed"===e(this).css("position"),!o}),h={left:e.datepicker._pos[0],top:e.datepicker._pos[1]},e.datepicker._pos=null,i.dpDiv.empty(),i.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),e.datepicker._updateDatepicker(i),h=e.datepicker._checkOffset(i,h,o),i.dpDiv.css({position:e.datepicker._inDialog&&e.blockUI?"static":o?"fixed":"absolute",display:"none",left:h.left+"px",top:h.top+"px"}),i.inline||(l=e.datepicker._get(i,"showAnim"),u=e.datepicker._get(i,"duration"),i.dpDiv.css("z-index",s(e(t))+1),e.datepicker._datepickerShowing=!0,e.effects&&e.effects.effect[l]?i.dpDiv.show(l,e.datepicker._get(i,"showOptions"),u):i.dpDiv[l||"show"](l?u:null),e.datepicker._shouldFocusInput(i)&&i.input.focus(),e.datepicker._curInst=i))}},_updateDatepicker:function(t){this.maxRows=4,v=t,t.dpDiv.empty().append(this._generateHTML(t)),this._attachHandlers(t);var i,s=this._getNumberOfMonths(t),n=s[1],a=17,r=t.dpDiv.find("."+this._dayOverClass+" a");r.length>0&&o.apply(r.get(0)),t.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),n>1&&t.dpDiv.addClass("ui-datepicker-multi-"+n).css("width",a*n+"em"),t.dpDiv[(1!==s[0]||1!==s[1]?"add":"remove")+"Class"]("ui-datepicker-multi"),t.dpDiv[(this._get(t,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),t===e.datepicker._curInst&&e.datepicker._datepickerShowing&&e.datepicker._shouldFocusInput(t)&&t.input.focus(),t.yearshtml&&(i=t.yearshtml,setTimeout(function(){i===t.yearshtml&&t.yearshtml&&t.dpDiv.find("select.ui-datepicker-year:first").replaceWith(t.yearshtml),i=t.yearshtml=null},0))},_shouldFocusInput:function(e){return e.input&&e.input.is(":visible")&&!e.input.is(":disabled")&&!e.input.is(":focus")},_checkOffset:function(t,i,s){var n=t.dpDiv.outerWidth(),a=t.dpDiv.outerHeight(),o=t.input?t.input.outerWidth():0,r=t.input?t.input.outerHeight():0,h=document.documentElement.clientWidth+(s?0:e(document).scrollLeft()),l=document.documentElement.clientHeight+(s?0:e(document).scrollTop());return i.left-=this._get(t,"isRTL")?n-o:0,i.left-=s&&i.left===t.input.offset().left?e(document).scrollLeft():0,i.top-=s&&i.top===t.input.offset().top+r?e(document).scrollTop():0,i.left-=Math.min(i.left,i.left+n>h&&h>n?Math.abs(i.left+n-h):0),i.top-=Math.min(i.top,i.top+a>l&&l>a?Math.abs(a+r):0),i},_findPos:function(t){for(var i,s=this._getInst(t),n=this._get(s,"isRTL");t&&("hidden"===t.type||1!==t.nodeType||e.expr.filters.hidden(t));)t=t[n?"previousSibling":"nextSibling"];return i=e(t).offset(),[i.left,i.top]},_hideDatepicker:function(t){var i,s,n,a,o=this._curInst;!o||t&&o!==e.data(t,"datepicker")||this._datepickerShowing&&(i=this._get(o,"showAnim"),s=this._get(o,"duration"),n=function(){e.datepicker._tidyDialog(o)},e.effects&&(e.effects.effect[i]||e.effects[i])?o.dpDiv.hide(i,e.datepicker._get(o,"showOptions"),s,n):o.dpDiv["slideDown"===i?"slideUp":"fadeIn"===i?"fadeOut":"hide"](i?s:null,n),i||n(),this._datepickerShowing=!1,a=this._get(o,"onClose"),a&&a.apply(o.input?o.input[0]:null,[o.input?o.input.val():"",o]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),e.blockUI&&(e.unblockUI(),e("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(e){e.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(t){if(e.datepicker._curInst){var i=e(t.target),s=e.datepicker._getInst(i[0]);(i[0].id!==e.datepicker._mainDivId&&0===i.parents("#"+e.datepicker._mainDivId).length&&!i.hasClass(e.datepicker.markerClassName)&&!i.closest("."+e.datepicker._triggerClass).length&&e.datepicker._datepickerShowing&&(!e.datepicker._inDialog||!e.blockUI)||i.hasClass(e.datepicker.markerClassName)&&e.datepicker._curInst!==s)&&e.datepicker._hideDatepicker()}},_adjustDate:function(t,i,s){var n=e(t),a=this._getInst(n[0]);this._isDisabledDatepicker(n[0])||(this._adjustInstDate(a,i+("M"===s?this._get(a,"showCurrentAtPos"):0),s),this._updateDatepicker(a))},_gotoToday:function(t){var i,s=e(t),n=this._getInst(s[0]);this._get(n,"gotoCurrent")&&n.currentDay?(n.selectedDay=n.currentDay,n.drawMonth=n.selectedMonth=n.currentMonth,n.drawYear=n.selectedYear=n.currentYear):(i=new Date,n.selectedDay=i.getDate(),n.drawMonth=n.selectedMonth=i.getMonth(),n.drawYear=n.selectedYear=i.getFullYear()),this._notifyChange(n),this._adjustDate(s)},_selectMonthYear:function(t,i,s){var n=e(t),a=this._getInst(n[0]);a["selected"+("M"===s?"Month":"Year")]=a["draw"+("M"===s?"Month":"Year")]=parseInt(i.options[i.selectedIndex].value,10),this._notifyChange(a),this._adjustDate(n)},_selectDay:function(t,i,s,n){var a,o=e(t);e(n).hasClass(this._unselectableClass)||this._isDisabledDatepicker(o[0])||(a=this._getInst(o[0]),a.selectedDay=a.currentDay=e("a",n).html(),a.selectedMonth=a.currentMonth=i,a.selectedYear=a.currentYear=s,this._selectDate(t,this._formatDate(a,a.currentDay,a.currentMonth,a.currentYear)))},_clearDate:function(t){var i=e(t);this._selectDate(i,"")},_selectDate:function(t,i){var s,n=e(t),a=this._getInst(n[0]);i=null!=i?i:this._formatDate(a),a.input&&a.input.val(i),this._updateAlternate(a),s=this._get(a,"onSelect"),s?s.apply(a.input?a.input[0]:null,[i,a]):a.input&&a.input.trigger("change"),a.inline?this._updateDatepicker(a):(this._hideDatepicker(),this._lastInput=a.input[0],"object"!=typeof a.input[0]&&a.input.focus(),this._lastInput=null)},_updateAlternate:function(t){var i,s,n,a=this._get(t,"altField");a&&(i=this._get(t,"altFormat")||this._get(t,"dateFormat"),s=this._getDate(t),n=this.formatDate(i,s,this._getFormatConfig(t)),e(a).each(function(){e(this).val(n)}))},noWeekends:function(e){var t=e.getDay();return[t>0&&6>t,""]},iso8601Week:function(e){var t,i=new Date(e.getTime());return i.setDate(i.getDate()+4-(i.getDay()||7)),t=i.getTime(),i.setMonth(0),i.setDate(1),Math.floor(Math.round((t-i)/864e5)/7)+1},parseDate:function(t,i,s){if(null==t||null==i)throw"Invalid arguments";if(i="object"==typeof i?""+i:i+"",""===i)return null;var n,a,o,r,h=0,l=(s?s.shortYearCutoff:null)||this._defaults.shortYearCutoff,u="string"!=typeof l?l:(new Date).getFullYear()%100+parseInt(l,10),d=(s?s.dayNamesShort:null)||this._defaults.dayNamesShort,c=(s?s.dayNames:null)||this._defaults.dayNames,p=(s?s.monthNamesShort:null)||this._defaults.monthNamesShort,f=(s?s.monthNames:null)||this._defaults.monthNames,m=-1,g=-1,v=-1,y=-1,b=!1,_=function(e){var i=t.length>n+1&&t.charAt(n+1)===e;return i&&n++,i},x=function(e){var t=_(e),s="@"===e?14:"!"===e?20:"y"===e&&t?4:"o"===e?3:2,n="y"===e?s:1,a=RegExp("^\\d{"+n+","+s+"}"),o=i.substring(h).match(a);if(!o)throw"Missing number at position "+h;return h+=o[0].length,parseInt(o[0],10)},w=function(t,s,n){var a=-1,o=e.map(_(t)?n:s,function(e,t){return[[t,e]]}).sort(function(e,t){return-(e[1].length-t[1].length)});if(e.each(o,function(e,t){var s=t[1];return i.substr(h,s.length).toLowerCase()===s.toLowerCase()?(a=t[0],h+=s.length,!1):void 0}),-1!==a)return a+1;throw"Unknown name at position "+h},k=function(){if(i.charAt(h)!==t.charAt(n))throw"Unexpected literal at position "+h;h++};for(n=0;t.length>n;n++)if(b)"'"!==t.charAt(n)||_("'")?k():b=!1;else switch(t.charAt(n)){case"d":v=x("d");break;case"D":w("D",d,c);break;case"o":y=x("o");break;case"m":g=x("m");break;case"M":g=w("M",p,f);break;case"y":m=x("y");break;case"@":r=new Date(x("@")),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case"!":r=new Date((x("!")-this._ticksTo1970)/1e4),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case"'":_("'")?k():b=!0;break;default:k()}if(i.length>h&&(o=i.substr(h),!/^\s+/.test(o)))throw"Extra/unparsed characters found in date: "+o;if(-1===m?m=(new Date).getFullYear():100>m&&(m+=(new Date).getFullYear()-(new Date).getFullYear()%100+(u>=m?0:-100)),y>-1)for(g=1,v=y;;){if(a=this._getDaysInMonth(m,g-1),a>=v)break;g++,v-=a}if(r=this._daylightSavingAdjust(new Date(m,g-1,v)),r.getFullYear()!==m||r.getMonth()+1!==g||r.getDate()!==v)throw"Invalid date";return r},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:1e7*60*60*24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925)),formatDate:function(e,t,i){if(!t)return"";var s,n=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,a=(i?i.dayNames:null)||this._defaults.dayNames,o=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,r=(i?i.monthNames:null)||this._defaults.monthNames,h=function(t){var i=e.length>s+1&&e.charAt(s+1)===t;return i&&s++,i},l=function(e,t,i){var s=""+t;if(h(e))for(;i>s.length;)s="0"+s;return s},u=function(e,t,i,s){return h(e)?s[t]:i[t]},d="",c=!1;if(t)for(s=0;e.length>s;s++)if(c)"'"!==e.charAt(s)||h("'")?d+=e.charAt(s):c=!1;else switch(e.charAt(s)){case"d":d+=l("d",t.getDate(),2);break;case"D":d+=u("D",t.getDay(),n,a);break;case"o":d+=l("o",Math.round((new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime()-new Date(t.getFullYear(),0,0).getTime())/864e5),3);break;case"m":d+=l("m",t.getMonth()+1,2);break;case"M":d+=u("M",t.getMonth(),o,r);break;case"y":d+=h("y")?t.getFullYear():(10>t.getYear()%100?"0":"")+t.getYear()%100;break;case"@":d+=t.getTime();break;case"!":d+=1e4*t.getTime()+this._ticksTo1970;break;case"'":h("'")?d+="'":c=!0;break;default:d+=e.charAt(s)}return d},_possibleChars:function(e){var t,i="",s=!1,n=function(i){var s=e.length>t+1&&e.charAt(t+1)===i;return s&&t++,s};for(t=0;e.length>t;t++)if(s)"'"!==e.charAt(t)||n("'")?i+=e.charAt(t):s=!1;else switch(e.charAt(t)){case"d":case"m":case"y":case"@":i+="0123456789";break;case"D":case"M":return null;case"'":n("'")?i+="'":s=!0;break;default:i+=e.charAt(t)}return i},_get:function(e,t){return void 0!==e.settings[t]?e.settings[t]:this._defaults[t]},_setDateFromField:function(e,t){if(e.input.val()!==e.lastVal){var i=this._get(e,"dateFormat"),s=e.lastVal=e.input?e.input.val():null,n=this._getDefaultDate(e),a=n,o=this._getFormatConfig(e);try{a=this.parseDate(i,s,o)||n}catch(r){s=t?"":s}e.selectedDay=a.getDate(),e.drawMonth=e.selectedMonth=a.getMonth(),e.drawYear=e.selectedYear=a.getFullYear(),e.currentDay=s?a.getDate():0,e.currentMonth=s?a.getMonth():0,e.currentYear=s?a.getFullYear():0,this._adjustInstDate(e)}},_getDefaultDate:function(e){return this._restrictMinMax(e,this._determineDate(e,this._get(e,"defaultDate"),new Date))},_determineDate:function(t,i,s){var n=function(e){var t=new Date;return t.setDate(t.getDate()+e),t},a=function(i){try{return e.datepicker.parseDate(e.datepicker._get(t,"dateFormat"),i,e.datepicker._getFormatConfig(t))}catch(s){}for(var n=(i.toLowerCase().match(/^c/)?e.datepicker._getDate(t):null)||new Date,a=n.getFullYear(),o=n.getMonth(),r=n.getDate(),h=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,l=h.exec(i);l;){switch(l[2]||"d"){case"d":case"D":r+=parseInt(l[1],10);break;case"w":case"W":r+=7*parseInt(l[1],10);break;case"m":case"M":o+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o));break;case"y":case"Y":a+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o))}l=h.exec(i)}return new Date(a,o,r)},o=null==i||""===i?s:"string"==typeof i?a(i):"number"==typeof i?isNaN(i)?s:n(i):new Date(i.getTime());return o=o&&"Invalid Date"==""+o?s:o,o&&(o.setHours(0),o.setMinutes(0),o.setSeconds(0),o.setMilliseconds(0)),this._daylightSavingAdjust(o)},_daylightSavingAdjust:function(e){return e?(e.setHours(e.getHours()>12?e.getHours()+2:0),e):null},_setDate:function(e,t,i){var s=!t,n=e.selectedMonth,a=e.selectedYear,o=this._restrictMinMax(e,this._determineDate(e,t,new Date));e.selectedDay=e.currentDay=o.getDate(),e.drawMonth=e.selectedMonth=e.currentMonth=o.getMonth(),e.drawYear=e.selectedYear=e.currentYear=o.getFullYear(),n===e.selectedMonth&&a===e.selectedYear||i||this._notifyChange(e),this._adjustInstDate(e),e.input&&e.input.val(s?"":this._formatDate(e))},_getDate:function(e){var t=!e.currentYear||e.input&&""===e.input.val()?null:this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return t},_attachHandlers:function(t){var i=this._get(t,"stepMonths"),s="#"+t.id.replace(/\\\\/g,"\\");t.dpDiv.find("[data-handler]").map(function(){var t={prev:function(){e.datepicker._adjustDate(s,-i,"M")},next:function(){e.datepicker._adjustDate(s,+i,"M")},hide:function(){e.datepicker._hideDatepicker()},today:function(){e.datepicker._gotoToday(s)},selectDay:function(){return e.datepicker._selectDay(s,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return e.datepicker._selectMonthYear(s,this,"M"),!1},selectYear:function(){return e.datepicker._selectMonthYear(s,this,"Y"),!1}};e(this).bind(this.getAttribute("data-event"),t[this.getAttribute("data-handler")])})},_generateHTML:function(e){var t,i,s,n,a,o,r,h,l,u,d,c,p,f,m,g,v,y,b,_,x,w,k,T,D,S,M,C,N,A,P,I,H,z,F,E,O,j,W,L=new Date,R=this._daylightSavingAdjust(new Date(L.getFullYear(),L.getMonth(),L.getDate())),Y=this._get(e,"isRTL"),B=this._get(e,"showButtonPanel"),J=this._get(e,"hideIfNoPrevNext"),q=this._get(e,"navigationAsDateFormat"),K=this._getNumberOfMonths(e),V=this._get(e,"showCurrentAtPos"),U=this._get(e,"stepMonths"),Q=1!==K[0]||1!==K[1],G=this._daylightSavingAdjust(e.currentDay?new Date(e.currentYear,e.currentMonth,e.currentDay):new Date(9999,9,9)),X=this._getMinMaxDate(e,"min"),$=this._getMinMaxDate(e,"max"),Z=e.drawMonth-V,et=e.drawYear;if(0>Z&&(Z+=12,et--),$)for(t=this._daylightSavingAdjust(new Date($.getFullYear(),$.getMonth()-K[0]*K[1]+1,$.getDate())),t=X&&X>t?X:t;this._daylightSavingAdjust(new Date(et,Z,1))>t;)Z--,0>Z&&(Z=11,et--);for(e.drawMonth=Z,e.drawYear=et,i=this._get(e,"prevText"),i=q?this.formatDate(i,this._daylightSavingAdjust(new Date(et,Z-U,1)),this._getFormatConfig(e)):i,s=this._canAdjustMonth(e,-1,et,Z)?"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>":J?"":"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>",n=this._get(e,"nextText"),n=q?this.formatDate(n,this._daylightSavingAdjust(new Date(et,Z+U,1)),this._getFormatConfig(e)):n,a=this._canAdjustMonth(e,1,et,Z)?"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>":J?"":"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>",o=this._get(e,"currentText"),r=this._get(e,"gotoCurrent")&&e.currentDay?G:R,o=q?this.formatDate(o,r,this._getFormatConfig(e)):o,h=e.inline?"":"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>"+this._get(e,"closeText")+"</button>",l=B?"<div class='ui-datepicker-buttonpane ui-widget-content'>"+(Y?h:"")+(this._isInRange(e,r)?"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'>"+o+"</button>":"")+(Y?"":h)+"</div>":"",u=parseInt(this._get(e,"firstDay"),10),u=isNaN(u)?0:u,d=this._get(e,"showWeek"),c=this._get(e,"dayNames"),p=this._get(e,"dayNamesMin"),f=this._get(e,"monthNames"),m=this._get(e,"monthNamesShort"),g=this._get(e,"beforeShowDay"),v=this._get(e,"showOtherMonths"),y=this._get(e,"selectOtherMonths"),b=this._getDefaultDate(e),_="",w=0;K[0]>w;w++){for(k="",this.maxRows=4,T=0;K[1]>T;T++){if(D=this._daylightSavingAdjust(new Date(et,Z,e.selectedDay)),S=" ui-corner-all",M="",Q){if(M+="<div class='ui-datepicker-group",K[1]>1)switch(T){case 0:M+=" ui-datepicker-group-first",S=" ui-corner-"+(Y?"right":"left");break;case K[1]-1:M+=" ui-datepicker-group-last",S=" ui-corner-"+(Y?"left":"right");break;default:M+=" ui-datepicker-group-middle",S=""}M+="'>"}for(M+="<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix"+S+"'>"+(/all|left/.test(S)&&0===w?Y?a:s:"")+(/all|right/.test(S)&&0===w?Y?s:a:"")+this._generateMonthYearHeader(e,Z,et,X,$,w>0||T>0,f,m)+"</div><table class='ui-datepicker-calendar'><thead>"+"<tr>",C=d?"<th class='ui-datepicker-week-col'>"+this._get(e,"weekHeader")+"</th>":"",x=0;7>x;x++)N=(x+u)%7,C+="<th scope='col'"+((x+u+6)%7>=5?" class='ui-datepicker-week-end'":"")+">"+"<span title='"+c[N]+"'>"+p[N]+"</span></th>";for(M+=C+"</tr></thead><tbody>",A=this._getDaysInMonth(et,Z),et===e.selectedYear&&Z===e.selectedMonth&&(e.selectedDay=Math.min(e.selectedDay,A)),P=(this._getFirstDayOfMonth(et,Z)-u+7)%7,I=Math.ceil((P+A)/7),H=Q?this.maxRows>I?this.maxRows:I:I,this.maxRows=H,z=this._daylightSavingAdjust(new Date(et,Z,1-P)),F=0;H>F;F++){for(M+="<tr>",E=d?"<td class='ui-datepicker-week-col'>"+this._get(e,"calculateWeek")(z)+"</td>":"",x=0;7>x;x++)O=g?g.apply(e.input?e.input[0]:null,[z]):[!0,""],j=z.getMonth()!==Z,W=j&&!y||!O[0]||X&&X>z||$&&z>$,E+="<td class='"+((x+u+6)%7>=5?" ui-datepicker-week-end":"")+(j?" ui-datepicker-other-month":"")+(z.getTime()===D.getTime()&&Z===e.selectedMonth&&e._keyEvent||b.getTime()===z.getTime()&&b.getTime()===D.getTime()?" "+this._dayOverClass:"")+(W?" "+this._unselectableClass+" ui-state-disabled":"")+(j&&!v?"":" "+O[1]+(z.getTime()===G.getTime()?" "+this._currentClass:"")+(z.getTime()===R.getTime()?" ui-datepicker-today":""))+"'"+(j&&!v||!O[2]?"":" title='"+O[2].replace(/'/g,"&#39;")+"'")+(W?"":" data-handler='selectDay' data-event='click' data-month='"+z.getMonth()+"' data-year='"+z.getFullYear()+"'")+">"+(j&&!v?"&#xa0;":W?"<span class='ui-state-default'>"+z.getDate()+"</span>":"<a class='ui-state-default"+(z.getTime()===R.getTime()?" ui-state-highlight":"")+(z.getTime()===G.getTime()?" ui-state-active":"")+(j?" ui-priority-secondary":"")+"' href='#'>"+z.getDate()+"</a>")+"</td>",z.setDate(z.getDate()+1),z=this._daylightSavingAdjust(z);M+=E+"</tr>"}Z++,Z>11&&(Z=0,et++),M+="</tbody></table>"+(Q?"</div>"+(K[0]>0&&T===K[1]-1?"<div class='ui-datepicker-row-break'></div>":""):""),k+=M}_+=k}return _+=l,e._keyEvent=!1,_},_generateMonthYearHeader:function(e,t,i,s,n,a,o,r){var h,l,u,d,c,p,f,m,g=this._get(e,"changeMonth"),v=this._get(e,"changeYear"),y=this._get(e,"showMonthAfterYear"),b="<div class='ui-datepicker-title'>",_="";if(a||!g)_+="<span class='ui-datepicker-month'>"+o[t]+"</span>";else{for(h=s&&s.getFullYear()===i,l=n&&n.getFullYear()===i,_+="<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>",u=0;12>u;u++)(!h||u>=s.getMonth())&&(!l||n.getMonth()>=u)&&(_+="<option value='"+u+"'"+(u===t?" selected='selected'":"")+">"+r[u]+"</option>");_+="</select>"}if(y||(b+=_+(!a&&g&&v?"":"&#xa0;")),!e.yearshtml)if(e.yearshtml="",a||!v)b+="<span class='ui-datepicker-year'>"+i+"</span>";else{for(d=this._get(e,"yearRange").split(":"),c=(new Date).getFullYear(),p=function(e){var t=e.match(/c[+\-].*/)?i+parseInt(e.substring(1),10):e.match(/[+\-].*/)?c+parseInt(e,10):parseInt(e,10);return isNaN(t)?c:t},f=p(d[0]),m=Math.max(f,p(d[1]||"")),f=s?Math.max(f,s.getFullYear()):f,m=n?Math.min(m,n.getFullYear()):m,e.yearshtml+="<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";m>=f;f++)e.yearshtml+="<option value='"+f+"'"+(f===i?" selected='selected'":"")+">"+f+"</option>";e.yearshtml+="</select>",b+=e.yearshtml,e.yearshtml=null}return b+=this._get(e,"yearSuffix"),y&&(b+=(!a&&g&&v?"":"&#xa0;")+_),b+="</div>"},_adjustInstDate:function(e,t,i){var s=e.drawYear+("Y"===i?t:0),n=e.drawMonth+("M"===i?t:0),a=Math.min(e.selectedDay,this._getDaysInMonth(s,n))+("D"===i?t:0),o=this._restrictMinMax(e,this._daylightSavingAdjust(new Date(s,n,a)));e.selectedDay=o.getDate(),e.drawMonth=e.selectedMonth=o.getMonth(),e.drawYear=e.selectedYear=o.getFullYear(),("M"===i||"Y"===i)&&this._notifyChange(e)},_restrictMinMax:function(e,t){var i=this._getMinMaxDate(e,"min"),s=this._getMinMaxDate(e,"max"),n=i&&i>t?i:t;return s&&n>s?s:n},_notifyChange:function(e){var t=this._get(e,"onChangeMonthYear");t&&t.apply(e.input?e.input[0]:null,[e.selectedYear,e.selectedMonth+1,e])},_getNumberOfMonths:function(e){var t=this._get(e,"numberOfMonths");return null==t?[1,1]:"number"==typeof t?[1,t]:t},_getMinMaxDate:function(e,t){return this._determineDate(e,this._get(e,t+"Date"),null)},_getDaysInMonth:function(e,t){return 32-this._daylightSavingAdjust(new Date(e,t,32)).getDate()},_getFirstDayOfMonth:function(e,t){return new Date(e,t,1).getDay()},_canAdjustMonth:function(e,t,i,s){var n=this._getNumberOfMonths(e),a=this._daylightSavingAdjust(new Date(i,s+(0>t?t:n[0]*n[1]),1));return 0>t&&a.setDate(this._getDaysInMonth(a.getFullYear(),a.getMonth())),this._isInRange(e,a)},_isInRange:function(e,t){var i,s,n=this._getMinMaxDate(e,"min"),a=this._getMinMaxDate(e,"max"),o=null,r=null,h=this._get(e,"yearRange");return h&&(i=h.split(":"),s=(new Date).getFullYear(),o=parseInt(i[0],10),r=parseInt(i[1],10),i[0].match(/[+\-].*/)&&(o+=s),i[1].match(/[+\-].*/)&&(r+=s)),(!n||t.getTime()>=n.getTime())&&(!a||t.getTime()<=a.getTime())&&(!o||t.getFullYear()>=o)&&(!r||r>=t.getFullYear())},_getFormatConfig:function(e){var t=this._get(e,"shortYearCutoff");return t="string"!=typeof t?t:(new Date).getFullYear()%100+parseInt(t,10),{shortYearCutoff:t,dayNamesShort:this._get(e,"dayNamesShort"),dayNames:this._get(e,"dayNames"),monthNamesShort:this._get(e,"monthNamesShort"),monthNames:this._get(e,"monthNames")}},_formatDate:function(e,t,i,s){t||(e.currentDay=e.selectedDay,e.currentMonth=e.selectedMonth,e.currentYear=e.selectedYear);var n=t?"object"==typeof t?t:this._daylightSavingAdjust(new Date(s,i,t)):this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return this.formatDate(this._get(e,"dateFormat"),n,this._getFormatConfig(e))}}),e.fn.datepicker=function(t){if(!this.length)return this;e.datepicker.initialized||(e(document).mousedown(e.datepicker._checkExternalClick),e.datepicker.initialized=!0),0===e("#"+e.datepicker._mainDivId).length&&e("body").append(e.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return"string"!=typeof t||"isDisabled"!==t&&"getDate"!==t&&"widget"!==t?"option"===t&&2===arguments.length&&"string"==typeof arguments[1]?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i)):this.each(function(){"string"==typeof t?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this].concat(i)):e.datepicker._attachDatepicker(this,t)}):e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i))},e.datepicker=new n,e.datepicker.initialized=!1,e.datepicker.uuid=(new Date).getTime(),e.datepicker.version="1.11.4",e.datepicker,e.widget("ui.draggable",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"===this.options.helper&&this._setPositionRelative(),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._setHandleClassName(),this._mouseInit()},_setOption:function(e,t){this._super(e,t),"handle"===e&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){return(this.helper||this.element).is(".ui-draggable-dragging")?(this.destroyOnClear=!0,void 0):(this.element.removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._removeHandleClassName(),this._mouseDestroy(),void 0)},_mouseCapture:function(t){var i=this.options;return this._blurActiveElement(t),this.helper||i.disabled||e(t.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(t),this.handle?(this._blockFrames(i.iframeFix===!0?"iframe":i.iframeFix),!0):!1)},_blockFrames:function(t){this.iframeBlocks=this.document.find(t).map(function(){var t=e(this);return e("<div>").css("position","absolute").appendTo(t.parent()).outerWidth(t.outerWidth()).outerHeight(t.outerHeight()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_blurActiveElement:function(t){var i=this.document[0];if(this.handleElement.is(t.target))try{i.activeElement&&"body"!==i.activeElement.nodeName.toLowerCase()&&e(i.activeElement).blur()}catch(s){}},_mouseStart:function(t){var i=this.options;return this.helper=this._createHelper(t),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),e.ui.ddmanager&&(e.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.hasFixedAncestor=this.helper.parents().filter(function(){return"fixed"===e(this).css("position")}).length>0,this.positionAbs=this.element.offset(),this._refreshOffsets(t),this.originalPosition=this.position=this._generatePosition(t,!1),this.originalPageX=t.pageX,this.originalPageY=t.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",t)===!1?(this._clear(),!1):(this._cacheHelperProportions(),e.ui.ddmanager&&!i.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this._normalizeRightBottom(),this._mouseDrag(t,!0),e.ui.ddmanager&&e.ui.ddmanager.dragStart(this,t),!0)},_refreshOffsets:function(e){this.offset={top:this.positionAbs.top-this.margins.top,left:this.positionAbs.left-this.margins.left,scroll:!1,parent:this._getParentOffset(),relative:this._getRelativeOffset()},this.offset.click={left:e.pageX-this.offset.left,top:e.pageY-this.offset.top}},_mouseDrag:function(t,i){if(this.hasFixedAncestor&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(t,!0),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",t,s)===!1)return this._mouseUp({}),!1;this.position=s.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),!1},_mouseStop:function(t){var i=this,s=!1;return e.ui.ddmanager&&!this.options.dropBehaviour&&(s=e.ui.ddmanager.drop(this,t)),this.dropped&&(s=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||e.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?e(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",t)!==!1&&i._clear()}):this._trigger("stop",t)!==!1&&this._clear(),!1},_mouseUp:function(t){return this._unblockFrames(),e.ui.ddmanager&&e.ui.ddmanager.dragStop(this,t),this.handleElement.is(t.target)&&this.element.focus(),e.ui.mouse.prototype._mouseUp.call(this,t)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(t){return this.options.handle?!!e(t.target).closest(this.element.find(this.options.handle)).length:!0},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this.handleElement.addClass("ui-draggable-handle")},_removeHandleClassName:function(){this.handleElement.removeClass("ui-draggable-handle")},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper),n=s?e(i.helper.apply(this.element[0],[t])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return n.parents("body").length||n.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s&&n[0]===this.element[0]&&this._setPositionRelative(),n[0]===this.element[0]||/(fixed|absolute)/.test(n.css("position"))||n.css("position","absolute"),n},_setPositionRelative:function(){/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative")},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_isRootNode:function(e){return/(html|body)/i.test(e.tagName)||e===this.document[0]},_getParentOffset:function(){var t=this.offsetParent.offset(),i=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==i&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var e=this.element.position(),t=this._isRootNode(this.scrollParent[0]);return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+(t?0:this.scrollParent.scrollTop()),left:e.left-(parseInt(this.helper.css("left"),10)||0)+(t?0:this.scrollParent.scrollLeft())}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options,a=this.document[0];return this.relativeContainer=null,n.containment?"window"===n.containment?(this.containment=[e(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,e(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,e(window).scrollLeft()+e(window).width()-this.helperProportions.width-this.margins.left,e(window).scrollTop()+(e(window).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):"document"===n.containment?(this.containment=[0,0,e(a).width()-this.helperProportions.width-this.margins.left,(e(a).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):n.containment.constructor===Array?(this.containment=n.containment,void 0):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=e(n.containment),s=i[0],s&&(t=/(scroll|auto)/.test(i.css("overflow")),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(t?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(t?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=i),void 0):(this.containment=null,void 0)
9
+ },_convertPositionTo:function(e,t){t||(t=this.position);var i="absolute"===e?1:-1,s=this._isRootNode(this.scrollParent[0]);return{top:t.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.offset.scroll.top:s?0:this.offset.scroll.top)*i,left:t.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.offset.scroll.left:s?0:this.offset.scroll.left)*i}},_generatePosition:function(e,t){var i,s,n,a,o=this.options,r=this._isRootNode(this.scrollParent[0]),h=e.pageX,l=e.pageY;return r&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),t&&(this.containment&&(this.relativeContainer?(s=this.relativeContainer.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,e.pageX-this.offset.click.left<i[0]&&(h=i[0]+this.offset.click.left),e.pageY-this.offset.click.top<i[1]&&(l=i[1]+this.offset.click.top),e.pageX-this.offset.click.left>i[2]&&(h=i[2]+this.offset.click.left),e.pageY-this.offset.click.top>i[3]&&(l=i[3]+this.offset.click.top)),o.grid&&(n=o.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/o.grid[1])*o.grid[1]:this.originalPageY,l=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-o.grid[1]:n+o.grid[1]:n,a=o.grid[0]?this.originalPageX+Math.round((h-this.originalPageX)/o.grid[0])*o.grid[0]:this.originalPageX,h=i?a-this.offset.click.left>=i[0]||a-this.offset.click.left>i[2]?a:a-this.offset.click.left>=i[0]?a-o.grid[0]:a+o.grid[0]:a),"y"===o.axis&&(h=this.originalPageX),"x"===o.axis&&(l=this.originalPageY)),{top:l-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:r?0:this.offset.scroll.top),left:h-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:r?0:this.offset.scroll.left)}},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_normalizeRightBottom:function(){"y"!==this.options.axis&&"auto"!==this.helper.css("right")&&(this.helper.width(this.helper.width()),this.helper.css("right","auto")),"x"!==this.options.axis&&"auto"!==this.helper.css("bottom")&&(this.helper.height(this.helper.height()),this.helper.css("bottom","auto"))},_trigger:function(t,i,s){return s=s||this._uiHash(),e.ui.plugin.call(this,t,[i,s,this],!0),/^(drag|start|stop)/.test(t)&&(this.positionAbs=this._convertPositionTo("absolute"),s.offset=this.positionAbs),e.Widget.prototype._trigger.call(this,t,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),e.ui.plugin.add("draggable","connectToSortable",{start:function(t,i,s){var n=e.extend({},i,{item:s.element});s.sortables=[],e(s.options.connectToSortable).each(function(){var i=e(this).sortable("instance");i&&!i.options.disabled&&(s.sortables.push(i),i.refreshPositions(),i._trigger("activate",t,n))})},stop:function(t,i,s){var n=e.extend({},i,{item:s.element});s.cancelHelperRemoval=!1,e.each(s.sortables,function(){var e=this;e.isOver?(e.isOver=0,s.cancelHelperRemoval=!0,e.cancelHelperRemoval=!1,e._storedCSS={position:e.placeholder.css("position"),top:e.placeholder.css("top"),left:e.placeholder.css("left")},e._mouseStop(t),e.options.helper=e.options._helper):(e.cancelHelperRemoval=!0,e._trigger("deactivate",t,n))})},drag:function(t,i,s){e.each(s.sortables,function(){var n=!1,a=this;a.positionAbs=s.positionAbs,a.helperProportions=s.helperProportions,a.offset.click=s.offset.click,a._intersectsWith(a.containerCache)&&(n=!0,e.each(s.sortables,function(){return this.positionAbs=s.positionAbs,this.helperProportions=s.helperProportions,this.offset.click=s.offset.click,this!==a&&this._intersectsWith(this.containerCache)&&e.contains(a.element[0],this.element[0])&&(n=!1),n})),n?(a.isOver||(a.isOver=1,s._parent=i.helper.parent(),a.currentItem=i.helper.appendTo(a.element).data("ui-sortable-item",!0),a.options._helper=a.options.helper,a.options.helper=function(){return i.helper[0]},t.target=a.currentItem[0],a._mouseCapture(t,!0),a._mouseStart(t,!0,!0),a.offset.click.top=s.offset.click.top,a.offset.click.left=s.offset.click.left,a.offset.parent.left-=s.offset.parent.left-a.offset.parent.left,a.offset.parent.top-=s.offset.parent.top-a.offset.parent.top,s._trigger("toSortable",t),s.dropped=a.element,e.each(s.sortables,function(){this.refreshPositions()}),s.currentItem=s.element,a.fromOutside=s),a.currentItem&&(a._mouseDrag(t),i.position=a.position)):a.isOver&&(a.isOver=0,a.cancelHelperRemoval=!0,a.options._revert=a.options.revert,a.options.revert=!1,a._trigger("out",t,a._uiHash(a)),a._mouseStop(t,!0),a.options.revert=a.options._revert,a.options.helper=a.options._helper,a.placeholder&&a.placeholder.remove(),i.helper.appendTo(s._parent),s._refreshOffsets(t),i.position=s._generatePosition(t,!0),s._trigger("fromSortable",t),s.dropped=!1,e.each(s.sortables,function(){this.refreshPositions()}))})}}),e.ui.plugin.add("draggable","cursor",{start:function(t,i,s){var n=e("body"),a=s.options;n.css("cursor")&&(a._cursor=n.css("cursor")),n.css("cursor",a.cursor)},stop:function(t,i,s){var n=s.options;n._cursor&&e("body").css("cursor",n._cursor)}}),e.ui.plugin.add("draggable","opacity",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("opacity")&&(a._opacity=n.css("opacity")),n.css("opacity",a.opacity)},stop:function(t,i,s){var n=s.options;n._opacity&&e(i.helper).css("opacity",n._opacity)}}),e.ui.plugin.add("draggable","scroll",{start:function(e,t,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(t,i,s){var n=s.options,a=!1,o=s.scrollParentNotHidden[0],r=s.document[0];o!==r&&"HTML"!==o.tagName?(n.axis&&"x"===n.axis||(s.overflowOffset.top+o.offsetHeight-t.pageY<n.scrollSensitivity?o.scrollTop=a=o.scrollTop+n.scrollSpeed:t.pageY-s.overflowOffset.top<n.scrollSensitivity&&(o.scrollTop=a=o.scrollTop-n.scrollSpeed)),n.axis&&"y"===n.axis||(s.overflowOffset.left+o.offsetWidth-t.pageX<n.scrollSensitivity?o.scrollLeft=a=o.scrollLeft+n.scrollSpeed:t.pageX-s.overflowOffset.left<n.scrollSensitivity&&(o.scrollLeft=a=o.scrollLeft-n.scrollSpeed))):(n.axis&&"x"===n.axis||(t.pageY-e(r).scrollTop()<n.scrollSensitivity?a=e(r).scrollTop(e(r).scrollTop()-n.scrollSpeed):e(window).height()-(t.pageY-e(r).scrollTop())<n.scrollSensitivity&&(a=e(r).scrollTop(e(r).scrollTop()+n.scrollSpeed))),n.axis&&"y"===n.axis||(t.pageX-e(r).scrollLeft()<n.scrollSensitivity?a=e(r).scrollLeft(e(r).scrollLeft()-n.scrollSpeed):e(window).width()-(t.pageX-e(r).scrollLeft())<n.scrollSensitivity&&(a=e(r).scrollLeft(e(r).scrollLeft()+n.scrollSpeed)))),a!==!1&&e.ui.ddmanager&&!n.dropBehaviour&&e.ui.ddmanager.prepareOffsets(s,t)}}),e.ui.plugin.add("draggable","snap",{start:function(t,i,s){var n=s.options;s.snapElements=[],e(n.snap.constructor!==String?n.snap.items||":data(ui-draggable)":n.snap).each(function(){var t=e(this),i=t.offset();this!==s.element[0]&&s.snapElements.push({item:this,width:t.outerWidth(),height:t.outerHeight(),top:i.top,left:i.left})})},drag:function(t,i,s){var n,a,o,r,h,l,u,d,c,p,f=s.options,m=f.snapTolerance,g=i.offset.left,v=g+s.helperProportions.width,y=i.offset.top,b=y+s.helperProportions.height;for(c=s.snapElements.length-1;c>=0;c--)h=s.snapElements[c].left-s.margins.left,l=h+s.snapElements[c].width,u=s.snapElements[c].top-s.margins.top,d=u+s.snapElements[c].height,h-m>v||g>l+m||u-m>b||y>d+m||!e.contains(s.snapElements[c].item.ownerDocument,s.snapElements[c].item)?(s.snapElements[c].snapping&&s.options.snap.release&&s.options.snap.release.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=!1):("inner"!==f.snapMode&&(n=m>=Math.abs(u-b),a=m>=Math.abs(d-y),o=m>=Math.abs(h-v),r=m>=Math.abs(l-g),n&&(i.position.top=s._convertPositionTo("relative",{top:u-s.helperProportions.height,left:0}).top),a&&(i.position.top=s._convertPositionTo("relative",{top:d,left:0}).top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h-s.helperProportions.width}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l}).left)),p=n||a||o||r,"outer"!==f.snapMode&&(n=m>=Math.abs(u-y),a=m>=Math.abs(d-b),o=m>=Math.abs(h-g),r=m>=Math.abs(l-v),n&&(i.position.top=s._convertPositionTo("relative",{top:u,left:0}).top),a&&(i.position.top=s._convertPositionTo("relative",{top:d-s.helperProportions.height,left:0}).top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l-s.helperProportions.width}).left)),!s.snapElements[c].snapping&&(n||a||o||r||p)&&s.options.snap.snap&&s.options.snap.snap.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=n||a||o||r||p)}}),e.ui.plugin.add("draggable","stack",{start:function(t,i,s){var n,a=s.options,o=e.makeArray(e(a.stack)).sort(function(t,i){return(parseInt(e(t).css("zIndex"),10)||0)-(parseInt(e(i).css("zIndex"),10)||0)});o.length&&(n=parseInt(e(o[0]).css("zIndex"),10)||0,e(o).each(function(t){e(this).css("zIndex",n+t)}),this.css("zIndex",n+o.length))}}),e.ui.plugin.add("draggable","zIndex",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("zIndex")&&(a._zIndex=n.css("zIndex")),n.css("zIndex",a.zIndex)},stop:function(t,i,s){var n=s.options;n._zIndex&&e(i.helper).css("zIndex",n._zIndex)}}),e.ui.draggable,e.widget("ui.resizable",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(e){return parseInt(e,10)||0},_isNumber:function(e){return!isNaN(parseInt(e,10))},_hasScroll:function(t,i){if("hidden"===e(t).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return t[s]>0?!0:(t[s]=1,n=t[s]>0,t[s]=0,n)},_create:function(){var t,i,s,n,a,o=this,r=this.options;if(this.element.addClass("ui-resizable"),e.extend(this,{_aspectRatio:!!r.aspectRatio,aspectRatio:r.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:r.helper||r.ghost||r.animate?r.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(e("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=r.handles||(e(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=e(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),t=this.handles.split(","),this.handles={},i=0;t.length>i;i++)s=e.trim(t[i]),a="ui-resizable-"+s,n=e("<div class='ui-resizable-handle "+a+"'></div>"),n.css({zIndex:r.zIndex}),"se"===s&&n.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[s]=".ui-resizable-"+s,this.element.append(n);this._renderAxis=function(t){var i,s,n,a;t=t||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=e(this.handles[i]),this._on(this.handles[i],{mousedown:o._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=e(this.handles[i],this.element),a=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),t.css(n,a),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.mouseover(function(){o.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),o.axis=n&&n[1]?n[1]:"se")}),r.autoHide&&(this._handles.hide(),e(this.element).addClass("ui-resizable-autohide").mouseenter(function(){r.disabled||(e(this).removeClass("ui-resizable-autohide"),o._handles.show())}).mouseleave(function(){r.disabled||o.resizing||(e(this).addClass("ui-resizable-autohide"),o._handles.hide())})),this._mouseInit()},_destroy:function(){this._mouseDestroy();var t,i=function(t){e(t).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),t=this.element,this.originalElement.css({position:t.css("position"),width:t.outerWidth(),height:t.outerHeight(),top:t.css("top"),left:t.css("left")}).insertAfter(t),t.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_mouseCapture:function(t){var i,s,n=!1;for(i in this.handles)s=e(this.handles[i])[0],(s===t.target||e.contains(s,t.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(t){var i,s,n,a=this.options,o=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),a.containment&&(i+=e(a.containment).scrollLeft()||0,s+=e(a.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:o.width(),height:o.height()},this.originalSize=this._helper?{width:o.outerWidth(),height:o.outerHeight()}:{width:o.width(),height:o.height()},this.sizeDiff={width:o.outerWidth()-o.width(),height:o.outerHeight()-o.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof a.aspectRatio?a.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=e(".ui-resizable-"+this.axis).css("cursor"),e("body").css("cursor","auto"===n?this.axis+"-resize":n),o.addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var i,s,n=this.originalMousePosition,a=this.axis,o=t.pageX-n.left||0,r=t.pageY-n.top||0,h=this._change[a];return this._updatePrevProperties(),h?(i=h.apply(this,[t,o,r]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(i=this._updateRatio(i,t)),i=this._respectSize(i,t),this._updateCache(i),this._propagate("resize",t),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),e.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(t){this.resizing=!1;var i,s,n,a,o,r,h,l=this.options,u=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:u.sizeDiff.height,a=s?0:u.sizeDiff.width,o={width:u.helper.width()-a,height:u.helper.height()-n},r=parseInt(u.element.css("left"),10)+(u.position.left-u.originalPosition.left)||null,h=parseInt(u.element.css("top"),10)+(u.position.top-u.originalPosition.top)||null,l.animate||this.element.css(e.extend(o,{top:h,left:r})),u.helper.height(u.size.height),u.helper.width(u.size.width),this._helper&&!l.animate&&this._proportionallyResize()),e("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var e={};return this.position.top!==this.prevPosition.top&&(e.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(e.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(e.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(e.height=this.size.height+"px"),this.helper.css(e),e},_updateVirtualBoundaries:function(e){var t,i,s,n,a,o=this.options;a={minWidth:this._isNumber(o.minWidth)?o.minWidth:0,maxWidth:this._isNumber(o.maxWidth)?o.maxWidth:1/0,minHeight:this._isNumber(o.minHeight)?o.minHeight:0,maxHeight:this._isNumber(o.maxHeight)?o.maxHeight:1/0},(this._aspectRatio||e)&&(t=a.minHeight*this.aspectRatio,s=a.minWidth/this.aspectRatio,i=a.maxHeight*this.aspectRatio,n=a.maxWidth/this.aspectRatio,t>a.minWidth&&(a.minWidth=t),s>a.minHeight&&(a.minHeight=s),a.maxWidth>i&&(a.maxWidth=i),a.maxHeight>n&&(a.maxHeight=n)),this._vBoundaries=a},_updateCache:function(e){this.offset=this.helper.offset(),this._isNumber(e.left)&&(this.position.left=e.left),this._isNumber(e.top)&&(this.position.top=e.top),this._isNumber(e.height)&&(this.size.height=e.height),this._isNumber(e.width)&&(this.size.width=e.width)},_updateRatio:function(e){var t=this.position,i=this.size,s=this.axis;return this._isNumber(e.height)?e.width=e.height*this.aspectRatio:this._isNumber(e.width)&&(e.height=e.width/this.aspectRatio),"sw"===s&&(e.left=t.left+(i.width-e.width),e.top=null),"nw"===s&&(e.top=t.top+(i.height-e.height),e.left=t.left+(i.width-e.width)),e},_respectSize:function(e){var t=this._vBoundaries,i=this.axis,s=this._isNumber(e.width)&&t.maxWidth&&t.maxWidth<e.width,n=this._isNumber(e.height)&&t.maxHeight&&t.maxHeight<e.height,a=this._isNumber(e.width)&&t.minWidth&&t.minWidth>e.width,o=this._isNumber(e.height)&&t.minHeight&&t.minHeight>e.height,r=this.originalPosition.left+this.originalSize.width,h=this.position.top+this.size.height,l=/sw|nw|w/.test(i),u=/nw|ne|n/.test(i);return a&&(e.width=t.minWidth),o&&(e.height=t.minHeight),s&&(e.width=t.maxWidth),n&&(e.height=t.maxHeight),a&&l&&(e.left=r-t.minWidth),s&&l&&(e.left=r-t.maxWidth),o&&u&&(e.top=h-t.minHeight),n&&u&&(e.top=h-t.maxHeight),e.width||e.height||e.left||!e.top?e.width||e.height||e.top||!e.left||(e.left=null):e.top=null,e},_getPaddingPlusBorderDimensions:function(e){for(var t=0,i=[],s=[e.css("borderTopWidth"),e.css("borderRightWidth"),e.css("borderBottomWidth"),e.css("borderLeftWidth")],n=[e.css("paddingTop"),e.css("paddingRight"),e.css("paddingBottom"),e.css("paddingLeft")];4>t;t++)i[t]=parseInt(s[t],10)||0,i[t]+=parseInt(n[t],10)||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var e,t=0,i=this.helper||this.element;this._proportionallyResizeElements.length>t;t++)e=this._proportionallyResizeElements[t],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(e)),e.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var t=this.element,i=this.options;this.elementOffset=t.offset(),this._helper?(this.helper=this.helper||e("<div style='overflow:hidden;'></div>"),this.helper.addClass(this._helper).css({width:this.element.outerWidth()-1,height:this.element.outerHeight()-1,position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(e,t){return{width:this.originalSize.width+t}},w:function(e,t){var i=this.originalSize,s=this.originalPosition;return{left:s.left+t,width:i.width-t}},n:function(e,t,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(e,t,i){return{height:this.originalSize.height+i}},se:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},sw:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,i,s]))},ne:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},nw:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,i,s]))}},_propagate:function(t,i){e.ui.plugin.call(this,t,[i,this.ui()]),"resize"!==t&&this._trigger(t,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),e.ui.plugin.add("resizable","animate",{stop:function(t){var i=e(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,a=n.length&&/textarea/i.test(n[0].nodeName),o=a&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=a?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-o},l=parseInt(i.element.css("left"),10)+(i.position.left-i.originalPosition.left)||null,u=parseInt(i.element.css("top"),10)+(i.position.top-i.originalPosition.top)||null;i.element.animate(e.extend(h,u&&l?{top:u,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseInt(i.element.css("width"),10),height:parseInt(i.element.css("height"),10),top:parseInt(i.element.css("top"),10),left:parseInt(i.element.css("left"),10)};n&&n.length&&e(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",t)}})}}),e.ui.plugin.add("resizable","containment",{start:function(){var t,i,s,n,a,o,r,h=e(this).resizable("instance"),l=h.options,u=h.element,d=l.containment,c=d instanceof e?d.get(0):/parent/.test(d)?u.parent().get(0):d;c&&(h.containerElement=e(c),/document/.test(d)||d===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}):(t=e(c),i=[],e(["Top","Right","Left","Bottom"]).each(function(e,s){i[e]=h._num(t.css("padding"+s))}),h.containerOffset=t.offset(),h.containerPosition=t.position(),h.containerSize={height:t.innerHeight()-i[3],width:t.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,a=h.containerSize.width,o=h._hasScroll(c,"left")?c.scrollWidth:a,r=h._hasScroll(c)?c.scrollHeight:n,h.parentData={element:c,left:s.left,top:s.top,width:o,height:r}))},resize:function(t){var i,s,n,a,o=e(this).resizable("instance"),r=o.options,h=o.containerOffset,l=o.position,u=o._aspectRatio||t.shiftKey,d={top:0,left:0},c=o.containerElement,p=!0;c[0]!==document&&/static/.test(c.css("position"))&&(d=h),l.left<(o._helper?h.left:0)&&(o.size.width=o.size.width+(o._helper?o.position.left-h.left:o.position.left-d.left),u&&(o.size.height=o.size.width/o.aspectRatio,p=!1),o.position.left=r.helper?h.left:0),l.top<(o._helper?h.top:0)&&(o.size.height=o.size.height+(o._helper?o.position.top-h.top:o.position.top),u&&(o.size.width=o.size.height*o.aspectRatio,p=!1),o.position.top=o._helper?h.top:0),n=o.containerElement.get(0)===o.element.parent().get(0),a=/relative|absolute/.test(o.containerElement.css("position")),n&&a?(o.offset.left=o.parentData.left+o.position.left,o.offset.top=o.parentData.top+o.position.top):(o.offset.left=o.element.offset().left,o.offset.top=o.element.offset().top),i=Math.abs(o.sizeDiff.width+(o._helper?o.offset.left-d.left:o.offset.left-h.left)),s=Math.abs(o.sizeDiff.height+(o._helper?o.offset.top-d.top:o.offset.top-h.top)),i+o.size.width>=o.parentData.width&&(o.size.width=o.parentData.width-i,u&&(o.size.height=o.size.width/o.aspectRatio,p=!1)),s+o.size.height>=o.parentData.height&&(o.size.height=o.parentData.height-s,u&&(o.size.width=o.size.height*o.aspectRatio,p=!1)),p||(o.position.left=o.prevPosition.left,o.position.top=o.prevPosition.top,o.size.width=o.prevSize.width,o.size.height=o.prevSize.height)},stop:function(){var t=e(this).resizable("instance"),i=t.options,s=t.containerOffset,n=t.containerPosition,a=t.containerElement,o=e(t.helper),r=o.offset(),h=o.outerWidth()-t.sizeDiff.width,l=o.outerHeight()-t.sizeDiff.height;t._helper&&!i.animate&&/relative/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l}),t._helper&&!i.animate&&/static/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),e.ui.plugin.add("resizable","alsoResize",{start:function(){var t=e(this).resizable("instance"),i=t.options;e(i.alsoResize).each(function(){var t=e(this);t.data("ui-resizable-alsoresize",{width:parseInt(t.width(),10),height:parseInt(t.height(),10),left:parseInt(t.css("left"),10),top:parseInt(t.css("top"),10)})})},resize:function(t,i){var s=e(this).resizable("instance"),n=s.options,a=s.originalSize,o=s.originalPosition,r={height:s.size.height-a.height||0,width:s.size.width-a.width||0,top:s.position.top-o.top||0,left:s.position.left-o.left||0};e(n.alsoResize).each(function(){var t=e(this),s=e(this).data("ui-resizable-alsoresize"),n={},a=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(a,function(e,t){var i=(s[t]||0)+(r[t]||0);i&&i>=0&&(n[t]=i||null)}),t.css(n)})},stop:function(){e(this).removeData("resizable-alsoresize")}}),e.ui.plugin.add("resizable","ghost",{start:function(){var t=e(this).resizable("instance"),i=t.options,s=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:s.height,width:s.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass("string"==typeof i.ghost?i.ghost:""),t.ghost.appendTo(t.helper)},resize:function(){var t=e(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=e(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),e.ui.plugin.add("resizable","grid",{resize:function(){var t,i=e(this).resizable("instance"),s=i.options,n=i.size,a=i.originalSize,o=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,u=h[1]||1,d=Math.round((n.width-a.width)/l)*l,c=Math.round((n.height-a.height)/u)*u,p=a.width+d,f=a.height+c,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,v=s.minWidth&&s.minWidth>p,y=s.minHeight&&s.minHeight>f;s.grid=h,v&&(p+=l),y&&(f+=u),m&&(p-=l),g&&(f-=u),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=o.top-c):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=o.left-d):((0>=f-u||0>=p-l)&&(t=i._getPaddingPlusBorderDimensions(this)),f-u>0?(i.size.height=f,i.position.top=o.top-c):(f=u-t.height,i.size.height=f,i.position.top=o.top+a.height-f),p-l>0?(i.size.width=p,i.position.left=o.left-d):(p=l-t.width,i.size.width=p,i.position.left=o.left+a.width-p))}}),e.ui.resizable,e.widget("ui.dialog",{version:"1.11.4",options:{appendTo:"body",autoOpen:!0,buttons:[],closeOnEscape:!0,closeText:"Close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(t){var i=e(this).css(t).offset().top;0>i&&e(this).css("top",t.top-i)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},sizeRelatedOptions:{buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},resizableRelatedOptions:{maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr("title"),this.options.title=this.options.title||this.originalTitle,this._createWrapper(),this.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(this.uiDialog),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&e.fn.draggable&&this._makeDraggable(),this.options.resizable&&e.fn.resizable&&this._makeResizable(),this._isOpen=!1,this._trackFocus()},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var t=this.options.appendTo;return t&&(t.jquery||t.nodeType)?e(t):this.document.find(t||"body").eq(0)},_destroy:function(){var e,t=this.originalPosition;this._untrackInstance(),this._destroyOverlay(),this.element.removeUniqueId().removeClass("ui-dialog-content ui-widget-content").css(this.originalCss).detach(),this.uiDialog.stop(!0,!0).remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),e=t.parent.children().eq(t.index),e.length&&e[0]!==this.element[0]?e.before(this.element):t.parent.append(this.element)},widget:function(){return this.uiDialog},disable:e.noop,enable:e.noop,close:function(t){var i,s=this;if(this._isOpen&&this._trigger("beforeClose",t)!==!1){if(this._isOpen=!1,this._focusedElement=null,this._destroyOverlay(),this._untrackInstance(),!this.opener.filter(":focusable").focus().length)try{i=this.document[0].activeElement,i&&"body"!==i.nodeName.toLowerCase()&&e(i).blur()}catch(n){}this._hide(this.uiDialog,this.options.hide,function(){s._trigger("close",t)})}},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(t,i){var s=!1,n=this.uiDialog.siblings(".ui-front:visible").map(function(){return+e(this).css("z-index")}).get(),a=Math.max.apply(null,n);return a>=+this.uiDialog.css("z-index")&&(this.uiDialog.css("z-index",a+1),s=!0),s&&!i&&this._trigger("focus",t),s},open:function(){var t=this;return this._isOpen?(this._moveToTop()&&this._focusTabbable(),void 0):(this._isOpen=!0,this.opener=e(this.document[0].activeElement),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this.overlay&&this.overlay.css("z-index",this.uiDialog.css("z-index")-1),this._show(this.uiDialog,this.options.show,function(){t._focusTabbable(),t._trigger("focus")}),this._makeFocusTarget(),this._trigger("open"),void 0)},_focusTabbable:function(){var e=this._focusedElement;e||(e=this.element.find("[autofocus]")),e.length||(e=this.element.find(":tabbable")),e.length||(e=this.uiDialogButtonPane.find(":tabbable")),e.length||(e=this.uiDialogTitlebarClose.filter(":tabbable")),e.length||(e=this.uiDialog),e.eq(0).focus()},_keepFocus:function(t){function i(){var t=this.document[0].activeElement,i=this.uiDialog[0]===t||e.contains(this.uiDialog[0],t);i||this._focusTabbable()}t.preventDefault(),i.call(this),this._delay(i)},_createWrapper:function(){this.uiDialog=e("<div>").addClass("ui-dialog ui-widget ui-widget-content ui-corner-all ui-front "+this.options.dialogClass).hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._on(this.uiDialog,{keydown:function(t){if(this.options.closeOnEscape&&!t.isDefaultPrevented()&&t.keyCode&&t.keyCode===e.ui.keyCode.ESCAPE)return t.preventDefault(),this.close(t),void 0;
10
+ if(t.keyCode===e.ui.keyCode.TAB&&!t.isDefaultPrevented()){var i=this.uiDialog.find(":tabbable"),s=i.filter(":first"),n=i.filter(":last");t.target!==n[0]&&t.target!==this.uiDialog[0]||t.shiftKey?t.target!==s[0]&&t.target!==this.uiDialog[0]||!t.shiftKey||(this._delay(function(){n.focus()}),t.preventDefault()):(this._delay(function(){s.focus()}),t.preventDefault())}},mousedown:function(e){this._moveToTop(e)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var t;this.uiDialogTitlebar=e("<div>").addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(this.uiDialog),this._on(this.uiDialogTitlebar,{mousedown:function(t){e(t.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.focus()}}),this.uiDialogTitlebarClose=e("<button type='button'></button>").button({label:this.options.closeText,icons:{primary:"ui-icon-closethick"},text:!1}).addClass("ui-dialog-titlebar-close").appendTo(this.uiDialogTitlebar),this._on(this.uiDialogTitlebarClose,{click:function(e){e.preventDefault(),this.close(e)}}),t=e("<span>").uniqueId().addClass("ui-dialog-title").prependTo(this.uiDialogTitlebar),this._title(t),this.uiDialog.attr({"aria-labelledby":t.attr("id")})},_title:function(e){this.options.title||e.html("&#160;"),e.text(this.options.title)},_createButtonPane:function(){this.uiDialogButtonPane=e("<div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),this.uiButtonSet=e("<div>").addClass("ui-dialog-buttonset").appendTo(this.uiDialogButtonPane),this._createButtons()},_createButtons:function(){var t=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),e.isEmptyObject(i)||e.isArray(i)&&!i.length?(this.uiDialog.removeClass("ui-dialog-buttons"),void 0):(e.each(i,function(i,s){var n,a;s=e.isFunction(s)?{click:s,text:i}:s,s=e.extend({type:"button"},s),n=s.click,s.click=function(){n.apply(t.element[0],arguments)},a={icons:s.icons,text:s.showText},delete s.icons,delete s.showText,e("<button></button>",s).button(a).appendTo(t.uiButtonSet)}),this.uiDialog.addClass("ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog),void 0)},_makeDraggable:function(){function t(e){return{position:e.position,offset:e.offset}}var i=this,s=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(s,n){e(this).addClass("ui-dialog-dragging"),i._blockFrames(),i._trigger("dragStart",s,t(n))},drag:function(e,s){i._trigger("drag",e,t(s))},stop:function(n,a){var o=a.offset.left-i.document.scrollLeft(),r=a.offset.top-i.document.scrollTop();s.position={my:"left top",at:"left"+(o>=0?"+":"")+o+" "+"top"+(r>=0?"+":"")+r,of:i.window},e(this).removeClass("ui-dialog-dragging"),i._unblockFrames(),i._trigger("dragStop",n,t(a))}})},_makeResizable:function(){function t(e){return{originalPosition:e.originalPosition,originalSize:e.originalSize,position:e.position,size:e.size}}var i=this,s=this.options,n=s.resizable,a=this.uiDialog.css("position"),o="string"==typeof n?n:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:s.maxWidth,maxHeight:s.maxHeight,minWidth:s.minWidth,minHeight:this._minHeight(),handles:o,start:function(s,n){e(this).addClass("ui-dialog-resizing"),i._blockFrames(),i._trigger("resizeStart",s,t(n))},resize:function(e,s){i._trigger("resize",e,t(s))},stop:function(n,a){var o=i.uiDialog.offset(),r=o.left-i.document.scrollLeft(),h=o.top-i.document.scrollTop();s.height=i.uiDialog.height(),s.width=i.uiDialog.width(),s.position={my:"left top",at:"left"+(r>=0?"+":"")+r+" "+"top"+(h>=0?"+":"")+h,of:i.window},e(this).removeClass("ui-dialog-resizing"),i._unblockFrames(),i._trigger("resizeStop",n,t(a))}}).css("position",a)},_trackFocus:function(){this._on(this.widget(),{focusin:function(t){this._makeFocusTarget(),this._focusedElement=e(t.target)}})},_makeFocusTarget:function(){this._untrackInstance(),this._trackingInstances().unshift(this)},_untrackInstance:function(){var t=this._trackingInstances(),i=e.inArray(this,t);-1!==i&&t.splice(i,1)},_trackingInstances:function(){var e=this.document.data("ui-dialog-instances");return e||(e=[],this.document.data("ui-dialog-instances",e)),e},_minHeight:function(){var e=this.options;return"auto"===e.height?e.minHeight:Math.min(e.minHeight,e.height)},_position:function(){var e=this.uiDialog.is(":visible");e||this.uiDialog.show(),this.uiDialog.position(this.options.position),e||this.uiDialog.hide()},_setOptions:function(t){var i=this,s=!1,n={};e.each(t,function(e,t){i._setOption(e,t),e in i.sizeRelatedOptions&&(s=!0),e in i.resizableRelatedOptions&&(n[e]=t)}),s&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",n)},_setOption:function(e,t){var i,s,n=this.uiDialog;"dialogClass"===e&&n.removeClass(this.options.dialogClass).addClass(t),"disabled"!==e&&(this._super(e,t),"appendTo"===e&&this.uiDialog.appendTo(this._appendTo()),"buttons"===e&&this._createButtons(),"closeText"===e&&this.uiDialogTitlebarClose.button({label:""+t}),"draggable"===e&&(i=n.is(":data(ui-draggable)"),i&&!t&&n.draggable("destroy"),!i&&t&&this._makeDraggable()),"position"===e&&this._position(),"resizable"===e&&(s=n.is(":data(ui-resizable)"),s&&!t&&n.resizable("destroy"),s&&"string"==typeof t&&n.resizable("option","handles",t),s||t===!1||this._makeResizable()),"title"===e&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var e,t,i,s=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),e=this.uiDialog.css({height:"auto",width:s.width}).outerHeight(),t=Math.max(0,s.minHeight-e),i="number"==typeof s.maxHeight?Math.max(0,s.maxHeight-e):"none","auto"===s.height?this.element.css({minHeight:t,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,s.height-e)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var t=e(this);return e("<div>").css({position:"absolute",width:t.outerWidth(),height:t.outerHeight()}).appendTo(t.parent()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(t){return e(t.target).closest(".ui-dialog").length?!0:!!e(t.target).closest(".ui-datepicker").length},_createOverlay:function(){if(this.options.modal){var t=!0;this._delay(function(){t=!1}),this.document.data("ui-dialog-overlays")||this._on(this.document,{focusin:function(e){t||this._allowInteraction(e)||(e.preventDefault(),this._trackingInstances()[0]._focusTabbable())}}),this.overlay=e("<div>").addClass("ui-widget-overlay ui-front").appendTo(this._appendTo()),this._on(this.overlay,{mousedown:"_keepFocus"}),this.document.data("ui-dialog-overlays",(this.document.data("ui-dialog-overlays")||0)+1)}},_destroyOverlay:function(){if(this.options.modal&&this.overlay){var e=this.document.data("ui-dialog-overlays")-1;e?this.document.data("ui-dialog-overlays",e):this.document.unbind("focusin").removeData("ui-dialog-overlays"),this.overlay.remove(),this.overlay=null}}}),e.widget("ui.droppable",{version:"1.11.4",widgetEventPrefix:"drop",options:{accept:"*",activeClass:!1,addClasses:!0,greedy:!1,hoverClass:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var t,i=this.options,s=i.accept;this.isover=!1,this.isout=!0,this.accept=e.isFunction(s)?s:function(e){return e.is(s)},this.proportions=function(){return arguments.length?(t=arguments[0],void 0):t?t:t={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}},this._addToManager(i.scope),i.addClasses&&this.element.addClass("ui-droppable")},_addToManager:function(t){e.ui.ddmanager.droppables[t]=e.ui.ddmanager.droppables[t]||[],e.ui.ddmanager.droppables[t].push(this)},_splice:function(e){for(var t=0;e.length>t;t++)e[t]===this&&e.splice(t,1)},_destroy:function(){var t=e.ui.ddmanager.droppables[this.options.scope];this._splice(t),this.element.removeClass("ui-droppable ui-droppable-disabled")},_setOption:function(t,i){if("accept"===t)this.accept=e.isFunction(i)?i:function(e){return e.is(i)};else if("scope"===t){var s=e.ui.ddmanager.droppables[this.options.scope];this._splice(s),this._addToManager(i)}this._super(t,i)},_activate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.addClass(this.options.activeClass),i&&this._trigger("activate",t,this.ui(i))},_deactivate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass),i&&this._trigger("deactivate",t,this.ui(i))},_over:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.addClass(this.options.hoverClass),this._trigger("over",t,this.ui(i)))},_out:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("out",t,this.ui(i)))},_drop:function(t,i){var s=i||e.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var i=e(this).droppable("instance");return i.options.greedy&&!i.options.disabled&&i.options.scope===s.options.scope&&i.accept.call(i.element[0],s.currentItem||s.element)&&e.ui.intersect(s,e.extend(i,{offset:i.element.offset()}),i.options.tolerance,t)?(n=!0,!1):void 0}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this.options.activeClass&&this.element.removeClass(this.options.activeClass),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("drop",t,this.ui(s)),this.element):!1):!1},ui:function(e){return{draggable:e.currentItem||e.element,helper:e.helper,position:e.position,offset:e.positionAbs}}}),e.ui.intersect=function(){function e(e,t,i){return e>=t&&t+i>e}return function(t,i,s,n){if(!i.offset)return!1;var a=(t.positionAbs||t.position.absolute).left+t.margins.left,o=(t.positionAbs||t.position.absolute).top+t.margins.top,r=a+t.helperProportions.width,h=o+t.helperProportions.height,l=i.offset.left,u=i.offset.top,d=l+i.proportions().width,c=u+i.proportions().height;switch(s){case"fit":return a>=l&&d>=r&&o>=u&&c>=h;case"intersect":return a+t.helperProportions.width/2>l&&d>r-t.helperProportions.width/2&&o+t.helperProportions.height/2>u&&c>h-t.helperProportions.height/2;case"pointer":return e(n.pageY,u,i.proportions().height)&&e(n.pageX,l,i.proportions().width);case"touch":return(o>=u&&c>=o||h>=u&&c>=h||u>o&&h>c)&&(a>=l&&d>=a||r>=l&&d>=r||l>a&&r>d);default:return!1}}}(),e.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(t,i){var s,n,a=e.ui.ddmanager.droppables[t.options.scope]||[],o=i?i.type:null,r=(t.currentItem||t.element).find(":data(ui-droppable)").addBack();e:for(s=0;a.length>s;s++)if(!(a[s].options.disabled||t&&!a[s].accept.call(a[s].element[0],t.currentItem||t.element))){for(n=0;r.length>n;n++)if(r[n]===a[s].element[0]){a[s].proportions().height=0;continue e}a[s].visible="none"!==a[s].element.css("display"),a[s].visible&&("mousedown"===o&&a[s]._activate.call(a[s],i),a[s].offset=a[s].element.offset(),a[s].proportions({width:a[s].element[0].offsetWidth,height:a[s].element[0].offsetHeight}))}},drop:function(t,i){var s=!1;return e.each((e.ui.ddmanager.droppables[t.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&e.ui.intersect(t,this,this.options.tolerance,i)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],t.currentItem||t.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(t,i){t.element.parentsUntil("body").bind("scroll.droppable",function(){t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)})},drag:function(t,i){t.options.refreshPositions&&e.ui.ddmanager.prepareOffsets(t,i),e.each(e.ui.ddmanager.droppables[t.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,a,o=e.ui.intersect(t,this,this.options.tolerance,i),r=!o&&this.isover?"isout":o&&!this.isover?"isover":null;r&&(this.options.greedy&&(n=this.options.scope,a=this.element.parents(":data(ui-droppable)").filter(function(){return e(this).droppable("instance").options.scope===n}),a.length&&(s=e(a[0]).droppable("instance"),s.greedyChild="isover"===r)),s&&"isover"===r&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[r]=!0,this["isout"===r?"isover":"isout"]=!1,this["isover"===r?"_over":"_out"].call(this,i),s&&"isout"===r&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(t,i){t.element.parentsUntil("body").unbind("scroll.droppable"),t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)}},e.ui.droppable;var y="ui-effects-",b=e;e.effects={effect:{}},function(e,t){function i(e,t,i){var s=d[t.type]||{};return null==e?i||!t.def?null:t.def:(e=s.floor?~~e:parseFloat(e),isNaN(e)?t.def:s.mod?(e+s.mod)%s.mod:0>e?0:e>s.max?s.max:e)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(e,a){var o,r=a.re.exec(i),h=r&&a.parse(r),l=a.space||"rgba";return h?(o=s[l](h),s[u[l].cache]=o[u[l].cache],n=s._rgba=o._rgba,!1):t}),n.length?("0,0,0,0"===n.join()&&e.extend(n,a.transparent),s):a[i]}function n(e,t,i){return i=(i+1)%1,1>6*i?e+6*(t-e)*i:1>2*i?t:2>3*i?e+6*(t-e)*(2/3-i):e}var a,o="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,h=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[e[1],e[2],e[3],e[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[2.55*e[1],2.55*e[2],2.55*e[3],e[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(e){return[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(e){return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(e){return[e[1],e[2]/100,e[3]/100,e[4]]}}],l=e.Color=function(t,i,s,n){return new e.Color.fn.parse(t,i,s,n)},u={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},d={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},c=l.support={},p=e("<p>")[0],f=e.each;p.style.cssText="background-color:rgba(1,1,1,.5)",c.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(u,function(e,t){t.cache="_"+e,t.props.alpha={idx:3,type:"percent",def:1}}),l.fn=e.extend(l.prototype,{parse:function(n,o,r,h){if(n===t)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=e(n).css(o),o=t);var d=this,c=e.type(n),p=this._rgba=[];return o!==t&&(n=[n,o,r,h],c="array"),"string"===c?this.parse(s(n)||a._default):"array"===c?(f(u.rgba.props,function(e,t){p[t.idx]=i(n[t.idx],t)}),this):"object"===c?(n instanceof l?f(u,function(e,t){n[t.cache]&&(d[t.cache]=n[t.cache].slice())}):f(u,function(t,s){var a=s.cache;f(s.props,function(e,t){if(!d[a]&&s.to){if("alpha"===e||null==n[e])return;d[a]=s.to(d._rgba)}d[a][t.idx]=i(n[e],t,!0)}),d[a]&&0>e.inArray(null,d[a].slice(0,3))&&(d[a][3]=1,s.from&&(d._rgba=s.from(d[a])))}),this):t},is:function(e){var i=l(e),s=!0,n=this;return f(u,function(e,a){var o,r=i[a.cache];return r&&(o=n[a.cache]||a.to&&a.to(n._rgba)||[],f(a.props,function(e,i){return null!=r[i.idx]?s=r[i.idx]===o[i.idx]:t})),s}),s},_space:function(){var e=[],t=this;return f(u,function(i,s){t[s.cache]&&e.push(i)}),e.pop()},transition:function(e,t){var s=l(e),n=s._space(),a=u[n],o=0===this.alpha()?l("transparent"):this,r=o[a.cache]||a.to(o._rgba),h=r.slice();return s=s[a.cache],f(a.props,function(e,n){var a=n.idx,o=r[a],l=s[a],u=d[n.type]||{};null!==l&&(null===o?h[a]=l:(u.mod&&(l-o>u.mod/2?o+=u.mod:o-l>u.mod/2&&(o-=u.mod)),h[a]=i((l-o)*t+o,n)))}),this[n](h)},blend:function(t){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(t)._rgba;return l(e.map(i,function(e,t){return(1-s)*n[t]+s*e}))},toRgbaString:function(){var t="rgba(",i=e.map(this._rgba,function(e,t){return null==e?t>2?1:0:e});return 1===i[3]&&(i.pop(),t="rgb("),t+i.join()+")"},toHslaString:function(){var t="hsla(",i=e.map(this.hsla(),function(e,t){return null==e&&(e=t>2?1:0),t&&3>t&&(e=Math.round(100*e)+"%"),e});return 1===i[3]&&(i.pop(),t="hsl("),t+i.join()+")"},toHexString:function(t){var i=this._rgba.slice(),s=i.pop();return t&&i.push(~~(255*s)),"#"+e.map(i,function(e){return e=(e||0).toString(16),1===e.length?"0"+e:e}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,u.hsla.to=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t,i,s=e[0]/255,n=e[1]/255,a=e[2]/255,o=e[3],r=Math.max(s,n,a),h=Math.min(s,n,a),l=r-h,u=r+h,d=.5*u;return t=h===r?0:s===r?60*(n-a)/l+360:n===r?60*(a-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=d?l/u:l/(2-u),[Math.round(t)%360,i,d,null==o?1:o]},u.hsla.from=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t=e[0]/360,i=e[1],s=e[2],a=e[3],o=.5>=s?s*(1+i):s+i-s*i,r=2*s-o;return[Math.round(255*n(r,o,t+1/3)),Math.round(255*n(r,o,t)),Math.round(255*n(r,o,t-1/3)),a]},f(u,function(s,n){var a=n.props,o=n.cache,h=n.to,u=n.from;l.fn[s]=function(s){if(h&&!this[o]&&(this[o]=h(this._rgba)),s===t)return this[o].slice();var n,r=e.type(s),d="array"===r||"object"===r?s:arguments,c=this[o].slice();return f(a,function(e,t){var s=d["object"===r?e:t.idx];null==s&&(s=c[t.idx]),c[t.idx]=i(s,t)}),u?(n=l(u(c)),n[o]=c,n):l(c)},f(a,function(t,i){l.fn[t]||(l.fn[t]=function(n){var a,o=e.type(n),h="alpha"===t?this._hsla?"hsla":"rgba":s,l=this[h](),u=l[i.idx];return"undefined"===o?u:("function"===o&&(n=n.call(this,u),o=e.type(n)),null==n&&i.empty?this:("string"===o&&(a=r.exec(n),a&&(n=u+parseFloat(a[2])*("+"===a[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(t){var i=t.split(" ");f(i,function(t,i){e.cssHooks[i]={set:function(t,n){var a,o,r="";if("transparent"!==n&&("string"!==e.type(n)||(a=s(n)))){if(n=l(a||n),!c.rgba&&1!==n._rgba[3]){for(o="backgroundColor"===i?t.parentNode:t;(""===r||"transparent"===r)&&o&&o.style;)try{r=e.css(o,"backgroundColor"),o=o.parentNode}catch(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{t.style[i]=n}catch(h){}}},e.fx.step[i]=function(t){t.colorInit||(t.start=l(t.elem,i),t.end=l(t.end),t.colorInit=!0),e.cssHooks[i].set(t.elem,t.start.transition(t.end,t.pos))}})},l.hook(o),e.cssHooks.borderColor={expand:function(e){var t={};return f(["Top","Right","Bottom","Left"],function(i,s){t["border"+s+"Color"]=e}),t}},a=e.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(b),function(){function t(t){var i,s,n=t.ownerDocument.defaultView?t.ownerDocument.defaultView.getComputedStyle(t,null):t.currentStyle,a={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(a[e.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(a[i]=n[i]);return a}function i(t,i){var s,a,o={};for(s in i)a=i[s],t[s]!==a&&(n[s]||(e.fx.step[s]||!isNaN(parseFloat(a)))&&(o[s]=a));return o}var s=["add","remove","toggle"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};e.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(t,i){e.fx.step[i]=function(e){("none"!==e.end&&!e.setAttr||1===e.pos&&!e.setAttr)&&(b.style(e.elem,i,e.end),e.setAttr=!0)}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e.effects.animateClass=function(n,a,o,r){var h=e.speed(a,o,r);return this.queue(function(){var a,o=e(this),r=o.attr("class")||"",l=h.children?o.find("*").addBack():o;l=l.map(function(){var i=e(this);return{el:i,start:t(this)}}),a=function(){e.each(s,function(e,t){n[t]&&o[t+"Class"](n[t])})},a(),l=l.map(function(){return this.end=t(this.el[0]),this.diff=i(this.start,this.end),this}),o.attr("class",r),l=l.map(function(){var t=this,i=e.Deferred(),s=e.extend({},h,{queue:!1,complete:function(){i.resolve(t)}});return this.el.animate(this.diff,s),i.promise()}),e.when.apply(e,l.get()).done(function(){a(),e.each(arguments,function(){var t=this.el;e.each(this.diff,function(e){t.css(e,"")})}),h.complete.call(o[0])})})},e.fn.extend({addClass:function(t){return function(i,s,n,a){return s?e.effects.animateClass.call(this,{add:i},s,n,a):t.apply(this,arguments)}}(e.fn.addClass),removeClass:function(t){return function(i,s,n,a){return arguments.length>1?e.effects.animateClass.call(this,{remove:i},s,n,a):t.apply(this,arguments)}}(e.fn.removeClass),toggleClass:function(t){return function(i,s,n,a,o){return"boolean"==typeof s||void 0===s?n?e.effects.animateClass.call(this,s?{add:i}:{remove:i},n,a,o):t.apply(this,arguments):e.effects.animateClass.call(this,{toggle:i},s,n,a)}}(e.fn.toggleClass),switchClass:function(t,i,s,n,a){return e.effects.animateClass.call(this,{add:i,remove:t},s,n,a)}})}(),function(){function t(t,i,s,n){return e.isPlainObject(t)&&(i=t,t=t.effect),t={effect:t},null==i&&(i={}),e.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||e.fx.speeds[i])&&(n=s,s=i,i={}),e.isFunction(s)&&(n=s,s=null),i&&e.extend(t,i),s=s||i.duration,t.duration=e.fx.off?0:"number"==typeof s?s:s in e.fx.speeds?e.fx.speeds[s]:e.fx.speeds._default,t.complete=n||i.complete,t}function i(t){return!t||"number"==typeof t||e.fx.speeds[t]?!0:"string"!=typeof t||e.effects.effect[t]?e.isFunction(t)?!0:"object"!=typeof t||t.effect?!1:!0:!0}e.extend(e.effects,{version:"1.11.4",save:function(e,t){for(var i=0;t.length>i;i++)null!==t[i]&&e.data(y+t[i],e[0].style[t[i]])},restore:function(e,t){var i,s;for(s=0;t.length>s;s++)null!==t[s]&&(i=e.data(y+t[s]),void 0===i&&(i=""),e.css(t[s],i))},setMode:function(e,t){return"toggle"===t&&(t=e.is(":hidden")?"show":"hide"),t},getBaseline:function(e,t){var i,s;switch(e[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=e[0]/t.height}switch(e[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=e[1]/t.width}return{x:s,y:i}},createWrapper:function(t){if(t.parent().is(".ui-effects-wrapper"))return t.parent();var i={width:t.outerWidth(!0),height:t.outerHeight(!0),"float":t.css("float")},s=e("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:t.width(),height:t.height()},a=document.activeElement;try{a.id}catch(o){a=document.body}return t.wrap(s),(t[0]===a||e.contains(t[0],a))&&e(a).focus(),s=t.parent(),"static"===t.css("position")?(s.css({position:"relative"}),t.css({position:"relative"})):(e.extend(i,{position:t.css("position"),zIndex:t.css("z-index")}),e.each(["top","left","bottom","right"],function(e,s){i[s]=t.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),t.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),t.css(n),s.css(i).show()},removeWrapper:function(t){var i=document.activeElement;return t.parent().is(".ui-effects-wrapper")&&(t.parent().replaceWith(t),(t[0]===i||e.contains(t[0],i))&&e(i).focus()),t},setTransition:function(t,i,s,n){return n=n||{},e.each(i,function(e,i){var a=t.cssUnit(i);a[0]>0&&(n[i]=a[0]*s+a[1])}),n}}),e.fn.extend({effect:function(){function i(t){function i(){e.isFunction(a)&&a.call(n[0]),e.isFunction(t)&&t()}var n=e(this),a=s.complete,r=s.mode;(n.is(":hidden")?"hide"===r:"show"===r)?(n[r](),i()):o.call(n[0],s,i)}var s=t.apply(this,arguments),n=s.mode,a=s.queue,o=e.effects.effect[s.effect];return e.fx.off||!o?n?this[n](s.duration,s.complete):this.each(function(){s.complete&&s.complete.call(this)}):a===!1?this.each(i):this.queue(a||"fx",i)},show:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="show",this.effect.call(this,n)}}(e.fn.show),hide:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="hide",this.effect.call(this,n)}}(e.fn.hide),toggle:function(e){return function(s){if(i(s)||"boolean"==typeof s)return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)}}(e.fn.toggle),cssUnit:function(t){var i=this.css(t),s=[];return e.each(["em","px","%","pt"],function(e,t){i.indexOf(t)>0&&(s=[parseFloat(i),t])}),s}})}(),function(){var t={};e.each(["Quad","Cubic","Quart","Quint","Expo"],function(e,i){t[i]=function(t){return Math.pow(t,e+2)}}),e.extend(t,{Sine:function(e){return 1-Math.cos(e*Math.PI/2)},Circ:function(e){return 1-Math.sqrt(1-e*e)},Elastic:function(e){return 0===e||1===e?e:-Math.pow(2,8*(e-1))*Math.sin((80*(e-1)-7.5)*Math.PI/15)},Back:function(e){return e*e*(3*e-2)},Bounce:function(e){for(var t,i=4;((t=Math.pow(2,--i))-1)/11>e;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*t-2)/22-e,2)}}),e.each(t,function(t,i){e.easing["easeIn"+t]=i,e.easing["easeOut"+t]=function(e){return 1-i(1-e)},e.easing["easeInOut"+t]=function(e){return.5>e?i(2*e)/2:1-i(-2*e+2)/2}})}(),e.effects,e.effects.effect.blind=function(t,i){var s,n,a,o=e(this),r=/up|down|vertical/,h=/up|left|vertical|horizontal/,l=["position","top","bottom","left","right","height","width"],u=e.effects.setMode(o,t.mode||"hide"),d=t.direction||"up",c=r.test(d),p=c?"height":"width",f=c?"top":"left",m=h.test(d),g={},v="show"===u;o.parent().is(".ui-effects-wrapper")?e.effects.save(o.parent(),l):e.effects.save(o,l),o.show(),s=e.effects.createWrapper(o).css({overflow:"hidden"}),n=s[p](),a=parseFloat(s.css(f))||0,g[p]=v?n:0,m||(o.css(c?"bottom":"right",0).css(c?"top":"left","auto").css({position:"absolute"}),g[f]=v?a:n+a),v&&(s.css(p,0),m||s.css(f,a+n)),s.animate(g,{duration:t.duration,easing:t.easing,queue:!1,complete:function(){"hide"===u&&o.hide(),e.effects.restore(o,l),e.effects.removeWrapper(o),i()}})},e.effects.effect.bounce=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","height","width"],h=e.effects.setMode(o,t.mode||"effect"),l="hide"===h,u="show"===h,d=t.direction||"up",c=t.distance,p=t.times||5,f=2*p+(u||l?1:0),m=t.duration/f,g=t.easing,v="up"===d||"down"===d?"top":"left",y="up"===d||"left"===d,b=o.queue(),_=b.length;for((u||l)&&r.push("opacity"),e.effects.save(o,r),o.show(),e.effects.createWrapper(o),c||(c=o["top"===v?"outerHeight":"outerWidth"]()/3),u&&(a={opacity:1},a[v]=0,o.css("opacity",0).css(v,y?2*-c:2*c).animate(a,m,g)),l&&(c/=Math.pow(2,p-1)),a={},a[v]=0,s=0;p>s;s++)n={},n[v]=(y?"-=":"+=")+c,o.animate(n,m,g).animate(a,m,g),c=l?2*c:c/2;l&&(n={opacity:0},n[v]=(y?"-=":"+=")+c,o.animate(n,m,g)),o.queue(function(){l&&o.hide(),e.effects.restore(o,r),e.effects.removeWrapper(o),i()}),_>1&&b.splice.apply(b,[1,0].concat(b.splice(_,f+1))),o.dequeue()},e.effects.effect.clip=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","height","width"],h=e.effects.setMode(o,t.mode||"hide"),l="show"===h,u=t.direction||"vertical",d="vertical"===u,c=d?"height":"width",p=d?"top":"left",f={};e.effects.save(o,r),o.show(),s=e.effects.createWrapper(o).css({overflow:"hidden"}),n="IMG"===o[0].tagName?s:o,a=n[c](),l&&(n.css(c,0),n.css(p,a/2)),f[c]=l?a:0,f[p]=l?0:a/2,n.animate(f,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){l||o.hide(),e.effects.restore(o,r),e.effects.removeWrapper(o),i()}})},e.effects.effect.drop=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","opacity","height","width"],o=e.effects.setMode(n,t.mode||"hide"),r="show"===o,h=t.direction||"left",l="up"===h||"down"===h?"top":"left",u="up"===h||"left"===h?"pos":"neg",d={opacity:r?1:0};e.effects.save(n,a),n.show(),e.effects.createWrapper(n),s=t.distance||n["top"===l?"outerHeight":"outerWidth"](!0)/2,r&&n.css("opacity",0).css(l,"pos"===u?-s:s),d[l]=(r?"pos"===u?"+=":"-=":"pos"===u?"-=":"+=")+s,n.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})},e.effects.effect.explode=function(t,i){function s(){b.push(this),b.length===d*c&&n()}function n(){p.css({visibility:"visible"}),e(b).remove(),m||p.hide(),i()}var a,o,r,h,l,u,d=t.pieces?Math.round(Math.sqrt(t.pieces)):3,c=d,p=e(this),f=e.effects.setMode(p,t.mode||"hide"),m="show"===f,g=p.show().css("visibility","hidden").offset(),v=Math.ceil(p.outerWidth()/c),y=Math.ceil(p.outerHeight()/d),b=[];for(a=0;d>a;a++)for(h=g.top+a*y,u=a-(d-1)/2,o=0;c>o;o++)r=g.left+o*v,l=o-(c-1)/2,p.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-o*v,top:-a*y}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:v,height:y,left:r+(m?l*v:0),top:h+(m?u*y:0),opacity:m?0:1}).animate({left:r+(m?0:l*v),top:h+(m?0:u*y),opacity:m?1:0},t.duration||500,t.easing,s)},e.effects.effect.fade=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||"toggle");s.animate({opacity:n},{queue:!1,duration:t.duration,easing:t.easing,complete:i})},e.effects.effect.fold=function(t,i){var s,n,a=e(this),o=["position","top","bottom","left","right","height","width"],r=e.effects.setMode(a,t.mode||"hide"),h="show"===r,l="hide"===r,u=t.size||15,d=/([0-9]+)%/.exec(u),c=!!t.horizFirst,p=h!==c,f=p?["width","height"]:["height","width"],m=t.duration/2,g={},v={};e.effects.save(a,o),a.show(),s=e.effects.createWrapper(a).css({overflow:"hidden"}),n=p?[s.width(),s.height()]:[s.height(),s.width()],d&&(u=parseInt(d[1],10)/100*n[l?0:1]),h&&s.css(c?{height:0,width:u}:{height:u,width:0}),g[f[0]]=h?n[0]:u,v[f[1]]=h?n[1]:0,s.animate(g,m,t.easing).animate(v,m,t.easing,function(){l&&a.hide(),e.effects.restore(a,o),e.effects.removeWrapper(a),i()})},e.effects.effect.highlight=function(t,i){var s=e(this),n=["backgroundImage","backgroundColor","opacity"],a=e.effects.setMode(s,t.mode||"show"),o={backgroundColor:s.css("backgroundColor")};"hide"===a&&(o.opacity=0),e.effects.save(s,n),s.show().css({backgroundImage:"none",backgroundColor:t.color||"#ffff99"}).animate(o,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===a&&s.hide(),e.effects.restore(s,n),i()}})},e.effects.effect.size=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","width","height","overflow","opacity"],h=["position","top","bottom","left","right","overflow","opacity"],l=["width","height","overflow"],u=["fontSize"],d=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],c=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],p=e.effects.setMode(o,t.mode||"effect"),f=t.restore||"effect"!==p,m=t.scale||"both",g=t.origin||["middle","center"],v=o.css("position"),y=f?r:h,b={height:0,width:0,outerHeight:0,outerWidth:0};"show"===p&&o.show(),s={height:o.height(),width:o.width(),outerHeight:o.outerHeight(),outerWidth:o.outerWidth()},"toggle"===t.mode&&"show"===p?(o.from=t.to||b,o.to=t.from||s):(o.from=t.from||("show"===p?b:s),o.to=t.to||("hide"===p?b:s)),a={from:{y:o.from.height/s.height,x:o.from.width/s.width},to:{y:o.to.height/s.height,x:o.to.width/s.width}},("box"===m||"both"===m)&&(a.from.y!==a.to.y&&(y=y.concat(d),o.from=e.effects.setTransition(o,d,a.from.y,o.from),o.to=e.effects.setTransition(o,d,a.to.y,o.to)),a.from.x!==a.to.x&&(y=y.concat(c),o.from=e.effects.setTransition(o,c,a.from.x,o.from),o.to=e.effects.setTransition(o,c,a.to.x,o.to))),("content"===m||"both"===m)&&a.from.y!==a.to.y&&(y=y.concat(u).concat(l),o.from=e.effects.setTransition(o,u,a.from.y,o.from),o.to=e.effects.setTransition(o,u,a.to.y,o.to)),e.effects.save(o,y),o.show(),e.effects.createWrapper(o),o.css("overflow","hidden").css(o.from),g&&(n=e.effects.getBaseline(g,s),o.from.top=(s.outerHeight-o.outerHeight())*n.y,o.from.left=(s.outerWidth-o.outerWidth())*n.x,o.to.top=(s.outerHeight-o.to.outerHeight)*n.y,o.to.left=(s.outerWidth-o.to.outerWidth)*n.x),o.css(o.from),("content"===m||"both"===m)&&(d=d.concat(["marginTop","marginBottom"]).concat(u),c=c.concat(["marginLeft","marginRight"]),l=r.concat(d).concat(c),o.find("*[width]").each(function(){var i=e(this),s={height:i.height(),width:i.width(),outerHeight:i.outerHeight(),outerWidth:i.outerWidth()};
11
+ f&&e.effects.save(i,l),i.from={height:s.height*a.from.y,width:s.width*a.from.x,outerHeight:s.outerHeight*a.from.y,outerWidth:s.outerWidth*a.from.x},i.to={height:s.height*a.to.y,width:s.width*a.to.x,outerHeight:s.height*a.to.y,outerWidth:s.width*a.to.x},a.from.y!==a.to.y&&(i.from=e.effects.setTransition(i,d,a.from.y,i.from),i.to=e.effects.setTransition(i,d,a.to.y,i.to)),a.from.x!==a.to.x&&(i.from=e.effects.setTransition(i,c,a.from.x,i.from),i.to=e.effects.setTransition(i,c,a.to.x,i.to)),i.css(i.from),i.animate(i.to,t.duration,t.easing,function(){f&&e.effects.restore(i,l)})})),o.animate(o.to,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){0===o.to.opacity&&o.css("opacity",o.from.opacity),"hide"===p&&o.hide(),e.effects.restore(o,y),f||("static"===v?o.css({position:"relative",top:o.to.top,left:o.to.left}):e.each(["top","left"],function(e,t){o.css(t,function(t,i){var s=parseInt(i,10),n=e?o.to.left:o.to.top;return"auto"===i?n+"px":s+n+"px"})})),e.effects.removeWrapper(o),i()}})},e.effects.effect.scale=function(t,i){var s=e(this),n=e.extend(!0,{},t),a=e.effects.setMode(s,t.mode||"effect"),o=parseInt(t.percent,10)||(0===parseInt(t.percent,10)?0:"hide"===a?0:100),r=t.direction||"both",h=t.origin,l={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()},u={y:"horizontal"!==r?o/100:1,x:"vertical"!==r?o/100:1};n.effect="size",n.queue=!1,n.complete=i,"effect"!==a&&(n.origin=h||["middle","center"],n.restore=!0),n.from=t.from||("show"===a?{height:0,width:0,outerHeight:0,outerWidth:0}:l),n.to={height:l.height*u.y,width:l.width*u.x,outerHeight:l.outerHeight*u.y,outerWidth:l.outerWidth*u.x},n.fade&&("show"===a&&(n.from.opacity=0,n.to.opacity=1),"hide"===a&&(n.from.opacity=1,n.to.opacity=0)),s.effect(n)},e.effects.effect.puff=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||"hide"),a="hide"===n,o=parseInt(t.percent,10)||150,r=o/100,h={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()};e.extend(t,{effect:"scale",queue:!1,fade:!0,mode:n,complete:i,percent:a?o:100,from:a?h:{height:h.height*r,width:h.width*r,outerHeight:h.outerHeight*r,outerWidth:h.outerWidth*r}}),s.effect(t)},e.effects.effect.pulsate=function(t,i){var s,n=e(this),a=e.effects.setMode(n,t.mode||"show"),o="show"===a,r="hide"===a,h=o||"hide"===a,l=2*(t.times||5)+(h?1:0),u=t.duration/l,d=0,c=n.queue(),p=c.length;for((o||!n.is(":visible"))&&(n.css("opacity",0).show(),d=1),s=1;l>s;s++)n.animate({opacity:d},u,t.easing),d=1-d;n.animate({opacity:d},u,t.easing),n.queue(function(){r&&n.hide(),i()}),p>1&&c.splice.apply(c,[1,0].concat(c.splice(p,l+1))),n.dequeue()},e.effects.effect.shake=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","height","width"],o=e.effects.setMode(n,t.mode||"effect"),r=t.direction||"left",h=t.distance||20,l=t.times||3,u=2*l+1,d=Math.round(t.duration/u),c="up"===r||"down"===r?"top":"left",p="up"===r||"left"===r,f={},m={},g={},v=n.queue(),y=v.length;for(e.effects.save(n,a),n.show(),e.effects.createWrapper(n),f[c]=(p?"-=":"+=")+h,m[c]=(p?"+=":"-=")+2*h,g[c]=(p?"-=":"+=")+2*h,n.animate(f,d,t.easing),s=1;l>s;s++)n.animate(m,d,t.easing).animate(g,d,t.easing);n.animate(m,d,t.easing).animate(f,d/2,t.easing).queue(function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}),y>1&&v.splice.apply(v,[1,0].concat(v.splice(y,u+1))),n.dequeue()},e.effects.effect.slide=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","width","height"],o=e.effects.setMode(n,t.mode||"show"),r="show"===o,h=t.direction||"left",l="up"===h||"down"===h?"top":"left",u="up"===h||"left"===h,d={};e.effects.save(n,a),n.show(),s=t.distance||n["top"===l?"outerHeight":"outerWidth"](!0),e.effects.createWrapper(n).css({overflow:"hidden"}),r&&n.css(l,u?isNaN(s)?"-"+s:-s:s),d[l]=(r?u?"+=":"-=":u?"-=":"+=")+s,n.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})},e.effects.effect.transfer=function(t,i){var s=e(this),n=e(t.to),a="fixed"===n.css("position"),o=e("body"),r=a?o.scrollTop():0,h=a?o.scrollLeft():0,l=n.offset(),u={top:l.top-r,left:l.left-h,height:n.innerHeight(),width:n.innerWidth()},d=s.offset(),c=e("<div class='ui-effects-transfer'></div>").appendTo(document.body).addClass(t.className).css({top:d.top-r,left:d.left-h,height:s.innerHeight(),width:s.innerWidth(),position:a?"fixed":"absolute"}).animate(u,t.duration,t.easing,function(){c.remove(),i()})},e.widget("ui.progressbar",{version:"1.11.4",options:{max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min}),this.valueDiv=e("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element),this._refreshValue()},_destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove()},value:function(e){return void 0===e?this.options.value:(this.options.value=this._constrainedValue(e),this._refreshValue(),void 0)},_constrainedValue:function(e){return void 0===e&&(e=this.options.value),this.indeterminate=e===!1,"number"!=typeof e&&(e=0),this.indeterminate?!1:Math.min(this.options.max,Math.max(this.min,e))},_setOptions:function(e){var t=e.value;delete e.value,this._super(e),this.options.value=this._constrainedValue(t),this._refreshValue()},_setOption:function(e,t){"max"===e&&(t=Math.max(this.min,t)),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var t=this.options.value,i=this._percentage();this.valueDiv.toggle(this.indeterminate||t>this.min).toggleClass("ui-corner-right",t===this.options.max).width(i.toFixed(0)+"%"),this.element.toggleClass("ui-progressbar-indeterminate",this.indeterminate),this.indeterminate?(this.element.removeAttr("aria-valuenow"),this.overlayDiv||(this.overlayDiv=e("<div class='ui-progressbar-overlay'></div>").appendTo(this.valueDiv))):(this.element.attr({"aria-valuemax":this.options.max,"aria-valuenow":t}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==t&&(this.oldValue=t,this._trigger("change")),t===this.options.max&&this._trigger("complete")}}),e.widget("ui.selectable",e.ui.mouse,{version:"1.11.4",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var t,i=this;this.element.addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){t=e(i.options.filter,i.element[0]),t.addClass("ui-selectee"),t.each(function(){var t=e(this),i=t.offset();e.data(this,"selectable-item",{element:this,$element:t,left:i.left,top:i.top,right:i.left+t.outerWidth(),bottom:i.top+t.outerHeight(),startselected:!1,selected:t.hasClass("ui-selected"),selecting:t.hasClass("ui-selecting"),unselecting:t.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=t.addClass("ui-selectee"),this._mouseInit(),this.helper=e("<div class='ui-selectable-helper'></div>")},_destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled"),this._mouseDestroy()},_mouseStart:function(t){var i=this,s=this.options;this.opos=[t.pageX,t.pageY],this.options.disabled||(this.selectees=e(s.filter,this.element[0]),this._trigger("start",t),e(s.appendTo).append(this.helper),this.helper.css({left:t.pageX,top:t.pageY,width:0,height:0}),s.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var s=e.data(this,"selectable-item");s.startselected=!0,t.metaKey||t.ctrlKey||(s.$element.removeClass("ui-selected"),s.selected=!1,s.$element.addClass("ui-unselecting"),s.unselecting=!0,i._trigger("unselecting",t,{unselecting:s.element}))}),e(t.target).parents().addBack().each(function(){var s,n=e.data(this,"selectable-item");return n?(s=!t.metaKey&&!t.ctrlKey||!n.$element.hasClass("ui-selected"),n.$element.removeClass(s?"ui-unselecting":"ui-selected").addClass(s?"ui-selecting":"ui-unselecting"),n.unselecting=!s,n.selecting=s,n.selected=s,s?i._trigger("selecting",t,{selecting:n.element}):i._trigger("unselecting",t,{unselecting:n.element}),!1):void 0}))},_mouseDrag:function(t){if(this.dragged=!0,!this.options.disabled){var i,s=this,n=this.options,a=this.opos[0],o=this.opos[1],r=t.pageX,h=t.pageY;return a>r&&(i=r,r=a,a=i),o>h&&(i=h,h=o,o=i),this.helper.css({left:a,top:o,width:r-a,height:h-o}),this.selectees.each(function(){var i=e.data(this,"selectable-item"),l=!1;i&&i.element!==s.element[0]&&("touch"===n.tolerance?l=!(i.left>r||a>i.right||i.top>h||o>i.bottom):"fit"===n.tolerance&&(l=i.left>a&&r>i.right&&i.top>o&&h>i.bottom),l?(i.selected&&(i.$element.removeClass("ui-selected"),i.selected=!1),i.unselecting&&(i.$element.removeClass("ui-unselecting"),i.unselecting=!1),i.selecting||(i.$element.addClass("ui-selecting"),i.selecting=!0,s._trigger("selecting",t,{selecting:i.element}))):(i.selecting&&((t.metaKey||t.ctrlKey)&&i.startselected?(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.$element.addClass("ui-selected"),i.selected=!0):(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.startselected&&(i.$element.addClass("ui-unselecting"),i.unselecting=!0),s._trigger("unselecting",t,{unselecting:i.element}))),i.selected&&(t.metaKey||t.ctrlKey||i.startselected||(i.$element.removeClass("ui-selected"),i.selected=!1,i.$element.addClass("ui-unselecting"),i.unselecting=!0,s._trigger("unselecting",t,{unselecting:i.element})))))}),!1}},_mouseStop:function(t){var i=this;return this.dragged=!1,e(".ui-unselecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-unselecting"),s.unselecting=!1,s.startselected=!1,i._trigger("unselected",t,{unselected:s.element})}),e(".ui-selecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-selecting").addClass("ui-selected"),s.selecting=!1,s.selected=!0,s.startselected=!0,i._trigger("selected",t,{selected:s.element})}),this._trigger("stop",t),this.helper.remove(),!1}}),e.widget("ui.selectmenu",{version:"1.11.4",defaultElement:"<select>",options:{appendTo:null,disabled:null,icons:{button:"ui-icon-triangle-1-s"},position:{my:"left top",at:"left bottom",collision:"none"},width:null,change:null,close:null,focus:null,open:null,select:null},_create:function(){var e=this.element.uniqueId().attr("id");this.ids={element:e,button:e+"-button",menu:e+"-menu"},this._drawButton(),this._drawMenu(),this.options.disabled&&this.disable()},_drawButton:function(){var t=this;this.label=e("label[for='"+this.ids.element+"']").attr("for",this.ids.button),this._on(this.label,{click:function(e){this.button.focus(),e.preventDefault()}}),this.element.hide(),this.button=e("<span>",{"class":"ui-selectmenu-button ui-widget ui-state-default ui-corner-all",tabindex:this.options.disabled?-1:0,id:this.ids.button,role:"combobox","aria-expanded":"false","aria-autocomplete":"list","aria-owns":this.ids.menu,"aria-haspopup":"true"}).insertAfter(this.element),e("<span>",{"class":"ui-icon "+this.options.icons.button}).prependTo(this.button),this.buttonText=e("<span>",{"class":"ui-selectmenu-text"}).appendTo(this.button),this._setText(this.buttonText,this.element.find("option:selected").text()),this._resizeButton(),this._on(this.button,this._buttonEvents),this.button.one("focusin",function(){t.menuItems||t._refreshMenu()}),this._hoverable(this.button),this._focusable(this.button)},_drawMenu:function(){var t=this;this.menu=e("<ul>",{"aria-hidden":"true","aria-labelledby":this.ids.button,id:this.ids.menu}),this.menuWrap=e("<div>",{"class":"ui-selectmenu-menu ui-front"}).append(this.menu).appendTo(this._appendTo()),this.menuInstance=this.menu.menu({role:"listbox",select:function(e,i){e.preventDefault(),t._setSelection(),t._select(i.item.data("ui-selectmenu-item"),e)},focus:function(e,i){var s=i.item.data("ui-selectmenu-item");null!=t.focusIndex&&s.index!==t.focusIndex&&(t._trigger("focus",e,{item:s}),t.isOpen||t._select(s,e)),t.focusIndex=s.index,t.button.attr("aria-activedescendant",t.menuItems.eq(s.index).attr("id"))}}).menu("instance"),this.menu.addClass("ui-corner-bottom").removeClass("ui-corner-all"),this.menuInstance._off(this.menu,"mouseleave"),this.menuInstance._closeOnDocumentClick=function(){return!1},this.menuInstance._isDivider=function(){return!1}},refresh:function(){this._refreshMenu(),this._setText(this.buttonText,this._getSelectedItem().text()),this.options.width||this._resizeButton()},_refreshMenu:function(){this.menu.empty();var e,t=this.element.find("option");t.length&&(this._parseOptions(t),this._renderMenu(this.menu,this.items),this.menuInstance.refresh(),this.menuItems=this.menu.find("li").not(".ui-selectmenu-optgroup"),e=this._getSelectedItem(),this.menuInstance.focus(null,e),this._setAria(e.data("ui-selectmenu-item")),this._setOption("disabled",this.element.prop("disabled")))},open:function(e){this.options.disabled||(this.menuItems?(this.menu.find(".ui-state-focus").removeClass("ui-state-focus"),this.menuInstance.focus(null,this._getSelectedItem())):this._refreshMenu(),this.isOpen=!0,this._toggleAttr(),this._resizeMenu(),this._position(),this._on(this.document,this._documentClick),this._trigger("open",e))},_position:function(){this.menuWrap.position(e.extend({of:this.button},this.options.position))},close:function(e){this.isOpen&&(this.isOpen=!1,this._toggleAttr(),this.range=null,this._off(this.document),this._trigger("close",e))},widget:function(){return this.button},menuWidget:function(){return this.menu},_renderMenu:function(t,i){var s=this,n="";e.each(i,function(i,a){a.optgroup!==n&&(e("<li>",{"class":"ui-selectmenu-optgroup ui-menu-divider"+(a.element.parent("optgroup").prop("disabled")?" ui-state-disabled":""),text:a.optgroup}).appendTo(t),n=a.optgroup),s._renderItemData(t,a)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-selectmenu-item",t)},_renderItem:function(t,i){var s=e("<li>");return i.disabled&&s.addClass("ui-state-disabled"),this._setText(s,i.label),s.appendTo(t)},_setText:function(e,t){t?e.text(t):e.html("&#160;")},_move:function(e,t){var i,s,n=".ui-menu-item";this.isOpen?i=this.menuItems.eq(this.focusIndex):(i=this.menuItems.eq(this.element[0].selectedIndex),n+=":not(.ui-state-disabled)"),s="first"===e||"last"===e?i["first"===e?"prevAll":"nextAll"](n).eq(-1):i[e+"All"](n).eq(0),s.length&&this.menuInstance.focus(t,s)},_getSelectedItem:function(){return this.menuItems.eq(this.element[0].selectedIndex)},_toggle:function(e){this[this.isOpen?"close":"open"](e)},_setSelection:function(){var e;this.range&&(window.getSelection?(e=window.getSelection(),e.removeAllRanges(),e.addRange(this.range)):this.range.select(),this.button.focus())},_documentClick:{mousedown:function(t){this.isOpen&&(e(t.target).closest(".ui-selectmenu-menu, #"+this.ids.button).length||this.close(t))}},_buttonEvents:{mousedown:function(){var e;window.getSelection?(e=window.getSelection(),e.rangeCount&&(this.range=e.getRangeAt(0))):this.range=document.selection.createRange()},click:function(e){this._setSelection(),this._toggle(e)},keydown:function(t){var i=!0;switch(t.keyCode){case e.ui.keyCode.TAB:case e.ui.keyCode.ESCAPE:this.close(t),i=!1;break;case e.ui.keyCode.ENTER:this.isOpen&&this._selectFocusedItem(t);break;case e.ui.keyCode.UP:t.altKey?this._toggle(t):this._move("prev",t);break;case e.ui.keyCode.DOWN:t.altKey?this._toggle(t):this._move("next",t);break;case e.ui.keyCode.SPACE:this.isOpen?this._selectFocusedItem(t):this._toggle(t);break;case e.ui.keyCode.LEFT:this._move("prev",t);break;case e.ui.keyCode.RIGHT:this._move("next",t);break;case e.ui.keyCode.HOME:case e.ui.keyCode.PAGE_UP:this._move("first",t);break;case e.ui.keyCode.END:case e.ui.keyCode.PAGE_DOWN:this._move("last",t);break;default:this.menu.trigger(t),i=!1}i&&t.preventDefault()}},_selectFocusedItem:function(e){var t=this.menuItems.eq(this.focusIndex);t.hasClass("ui-state-disabled")||this._select(t.data("ui-selectmenu-item"),e)},_select:function(e,t){var i=this.element[0].selectedIndex;this.element[0].selectedIndex=e.index,this._setText(this.buttonText,e.label),this._setAria(e),this._trigger("select",t,{item:e}),e.index!==i&&this._trigger("change",t,{item:e}),this.close(t)},_setAria:function(e){var t=this.menuItems.eq(e.index).attr("id");this.button.attr({"aria-labelledby":t,"aria-activedescendant":t}),this.menu.attr("aria-activedescendant",t)},_setOption:function(e,t){"icons"===e&&this.button.find("span.ui-icon").removeClass(this.options.icons.button).addClass(t.button),this._super(e,t),"appendTo"===e&&this.menuWrap.appendTo(this._appendTo()),"disabled"===e&&(this.menuInstance.option("disabled",t),this.button.toggleClass("ui-state-disabled",t).attr("aria-disabled",t),this.element.prop("disabled",t),t?(this.button.attr("tabindex",-1),this.close()):this.button.attr("tabindex",0)),"width"===e&&this._resizeButton()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_toggleAttr:function(){this.button.toggleClass("ui-corner-top",this.isOpen).toggleClass("ui-corner-all",!this.isOpen).attr("aria-expanded",this.isOpen),this.menuWrap.toggleClass("ui-selectmenu-open",this.isOpen),this.menu.attr("aria-hidden",!this.isOpen)},_resizeButton:function(){var e=this.options.width;e||(e=this.element.show().outerWidth(),this.element.hide()),this.button.outerWidth(e)},_resizeMenu:function(){this.menu.outerWidth(Math.max(this.button.outerWidth(),this.menu.width("").outerWidth()+1))},_getCreateOptions:function(){return{disabled:this.element.prop("disabled")}},_parseOptions:function(t){var i=[];t.each(function(t,s){var n=e(s),a=n.parent("optgroup");i.push({element:n,index:t,value:n.val(),label:n.text(),optgroup:a.attr("label")||"",disabled:a.prop("disabled")||n.prop("disabled")})}),this.items=i},_destroy:function(){this.menuWrap.remove(),this.button.remove(),this.element.show(),this.element.removeUniqueId(),this.label.attr("for",this.ids.element)}}),e.widget("ui.slider",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},numPages:5,_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this._calculateNewMax(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"),this._refresh(),this._setOption("disabled",this.options.disabled),this._animateOff=!1},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var t,i,s=this.options,n=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),a="<span class='ui-slider-handle ui-state-default ui-corner-all' tabindex='0'></span>",o=[];for(i=s.values&&s.values.length||1,n.length>i&&(n.slice(i).remove(),n=n.slice(0,i)),t=n.length;i>t;t++)o.push(a);this.handles=n.add(e(o.join("")).appendTo(this.element)),this.handle=this.handles.eq(0),this.handles.each(function(t){e(this).data("ui-slider-handle-index",t)})},_createRange:function(){var t=this.options,i="";t.range?(t.range===!0&&(t.values?t.values.length&&2!==t.values.length?t.values=[t.values[0],t.values[0]]:e.isArray(t.values)&&(t.values=t.values.slice(0)):t.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?this.range.removeClass("ui-slider-range-min ui-slider-range-max").css({left:"",bottom:""}):(this.range=e("<div></div>").appendTo(this.element),i="ui-slider-range ui-widget-header ui-corner-all"),this.range.addClass(i+("min"===t.range||"max"===t.range?" ui-slider-range-"+t.range:""))):(this.range&&this.range.remove(),this.range=null)},_setupEvents:function(){this._off(this.handles),this._on(this.handles,this._handleEvents),this._hoverable(this.handles),this._focusable(this.handles)},_destroy:function(){this.handles.remove(),this.range&&this.range.remove(),this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-widget ui-widget-content ui-corner-all"),this._mouseDestroy()},_mouseCapture:function(t){var i,s,n,a,o,r,h,l,u=this,d=this.options;return d.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),i={x:t.pageX,y:t.pageY},s=this._normValueFromMouse(i),n=this._valueMax()-this._valueMin()+1,this.handles.each(function(t){var i=Math.abs(s-u.values(t));(n>i||n===i&&(t===u._lastChangedValue||u.values(t)===d.min))&&(n=i,a=e(this),o=t)}),r=this._start(t,o),r===!1?!1:(this._mouseSliding=!0,this._handleIndex=o,a.addClass("ui-state-active").focus(),h=a.offset(),l=!e(t.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:t.pageX-h.left-a.width()/2,top:t.pageY-h.top-a.height()/2-(parseInt(a.css("borderTopWidth"),10)||0)-(parseInt(a.css("borderBottomWidth"),10)||0)+(parseInt(a.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(t,o,s),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(e){var t={x:e.pageX,y:e.pageY},i=this._normValueFromMouse(t);return this._slide(e,this._handleIndex,i),!1},_mouseStop:function(e){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(e,this._handleIndex),this._change(e,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(e){var t,i,s,n,a;return"horizontal"===this.orientation?(t=this.elementSize.width,i=e.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(t=this.elementSize.height,i=e.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),s=i/t,s>1&&(s=1),0>s&&(s=0),"vertical"===this.orientation&&(s=1-s),n=this._valueMax()-this._valueMin(),a=this._valueMin()+s*n,this._trimAlignValue(a)},_start:function(e,t){var i={handle:this.handles[t],value:this.value()};return this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("start",e,i)},_slide:function(e,t,i){var s,n,a;this.options.values&&this.options.values.length?(s=this.values(t?0:1),2===this.options.values.length&&this.options.range===!0&&(0===t&&i>s||1===t&&s>i)&&(i=s),i!==this.values(t)&&(n=this.values(),n[t]=i,a=this._trigger("slide",e,{handle:this.handles[t],value:i,values:n}),s=this.values(t?0:1),a!==!1&&this.values(t,i))):i!==this.value()&&(a=this._trigger("slide",e,{handle:this.handles[t],value:i}),a!==!1&&this.value(i))},_stop:function(e,t){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("stop",e,i)},_change:function(e,t){if(!this._keySliding&&!this._mouseSliding){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._lastChangedValue=t,this._trigger("change",e,i)}},value:function(e){return arguments.length?(this.options.value=this._trimAlignValue(e),this._refreshValue(),this._change(null,0),void 0):this._value()},values:function(t,i){var s,n,a;if(arguments.length>1)return this.options.values[t]=this._trimAlignValue(i),this._refreshValue(),this._change(null,t),void 0;if(!arguments.length)return this._values();if(!e.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(t):this.value();for(s=this.options.values,n=arguments[0],a=0;s.length>a;a+=1)s[a]=this._trimAlignValue(n[a]),this._change(null,a);this._refreshValue()},_setOption:function(t,i){var s,n=0;switch("range"===t&&this.options.range===!0&&("min"===i?(this.options.value=this._values(0),this.options.values=null):"max"===i&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),e.isArray(this.options.values)&&(n=this.options.values.length),"disabled"===t&&this.element.toggleClass("ui-state-disabled",!!i),this._super(t,i),t){case"orientation":this._detectOrientation(),this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation),this._refreshValue(),this.handles.css("horizontal"===i?"bottom":"left","");break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":for(this._animateOff=!0,this._refreshValue(),s=0;n>s;s+=1)this._change(null,s);this._animateOff=!1;break;case"step":case"min":case"max":this._animateOff=!0,this._calculateNewMax(),this._refreshValue(),this._animateOff=!1;break;case"range":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_value:function(){var e=this.options.value;return e=this._trimAlignValue(e)},_values:function(e){var t,i,s;if(arguments.length)return t=this.options.values[e],t=this._trimAlignValue(t);if(this.options.values&&this.options.values.length){for(i=this.options.values.slice(),s=0;i.length>s;s+=1)i[s]=this._trimAlignValue(i[s]);return i}return[]},_trimAlignValue:function(e){if(this._valueMin()>=e)return this._valueMin();if(e>=this._valueMax())return this._valueMax();var t=this.options.step>0?this.options.step:1,i=(e-this._valueMin())%t,s=e-i;return 2*Math.abs(i)>=t&&(s+=i>0?t:-t),parseFloat(s.toFixed(5))},_calculateNewMax:function(){var e=this.options.max,t=this._valueMin(),i=this.options.step,s=Math.floor(+(e-t).toFixed(this._precision())/i)*i;e=s+t,this.max=parseFloat(e.toFixed(this._precision()))},_precision:function(){var e=this._precisionOf(this.options.step);return null!==this.options.min&&(e=Math.max(e,this._precisionOf(this.options.min))),e},_precisionOf:function(e){var t=""+e,i=t.indexOf(".");return-1===i?0:t.length-i-1},_valueMin:function(){return this.options.min},_valueMax:function(){return this.max},_refreshValue:function(){var t,i,s,n,a,o=this.options.range,r=this.options,h=this,l=this._animateOff?!1:r.animate,u={};this.options.values&&this.options.values.length?this.handles.each(function(s){i=100*((h.values(s)-h._valueMin())/(h._valueMax()-h._valueMin())),u["horizontal"===h.orientation?"left":"bottom"]=i+"%",e(this).stop(1,1)[l?"animate":"css"](u,r.animate),h.options.range===!0&&("horizontal"===h.orientation?(0===s&&h.range.stop(1,1)[l?"animate":"css"]({left:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({width:i-t+"%"},{queue:!1,duration:r.animate})):(0===s&&h.range.stop(1,1)[l?"animate":"css"]({bottom:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({height:i-t+"%"},{queue:!1,duration:r.animate}))),t=i}):(s=this.value(),n=this._valueMin(),a=this._valueMax(),i=a!==n?100*((s-n)/(a-n)):0,u["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[l?"animate":"css"](u,r.animate),"min"===o&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:i+"%"},r.animate),"max"===o&&"horizontal"===this.orientation&&this.range[l?"animate":"css"]({width:100-i+"%"},{queue:!1,duration:r.animate}),"min"===o&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:i+"%"},r.animate),"max"===o&&"vertical"===this.orientation&&this.range[l?"animate":"css"]({height:100-i+"%"},{queue:!1,duration:r.animate}))},_handleEvents:{keydown:function(t){var i,s,n,a,o=e(t.target).data("ui-slider-handle-index");switch(t.keyCode){case e.ui.keyCode.HOME:case e.ui.keyCode.END:case e.ui.keyCode.PAGE_UP:case e.ui.keyCode.PAGE_DOWN:case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(t.preventDefault(),!this._keySliding&&(this._keySliding=!0,e(t.target).addClass("ui-state-active"),i=this._start(t,o),i===!1))return}switch(a=this.options.step,s=n=this.options.values&&this.options.values.length?this.values(o):this.value(),t.keyCode){case e.ui.keyCode.HOME:n=this._valueMin();break;case e.ui.keyCode.END:n=this._valueMax();break;case e.ui.keyCode.PAGE_UP:n=this._trimAlignValue(s+(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.PAGE_DOWN:n=this._trimAlignValue(s-(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:if(s===this._valueMax())return;n=this._trimAlignValue(s+a);break;case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(s===this._valueMin())return;n=this._trimAlignValue(s-a)}this._slide(t,o,n)},keyup:function(t){var i=e(t.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(t,i),this._change(t,i),e(t.target).removeClass("ui-state-active"))}}}),e.widget("ui.sortable",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(e,t,i){return e>=t&&t+i>e},_isFloating:function(e){return/left|right/.test(e.css("float"))||/inline|table-cell/.test(e.css("display"))},_create:function(){this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(e,t){this._super(e,t),"handle"===e&&this._setHandleClassName()},_setHandleClassName:function(){this.element.find(".ui-sortable-handle").removeClass("ui-sortable-handle"),e.each(this.items,function(){(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item).addClass("ui-sortable-handle")})},_destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").find(".ui-sortable-handle").removeClass("ui-sortable-handle"),this._mouseDestroy();for(var e=this.items.length-1;e>=0;e--)this.items[e].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(t,i){var s=null,n=!1,a=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(t),e(t.target).parents().each(function(){return e.data(this,a.widgetName+"-item")===a?(s=e(this),!1):void 0}),e.data(t.target,a.widgetName+"-item")===a&&(s=e(t.target)),s?!this.options.handle||i||(e(this.options.handle,s).find("*").addBack().each(function(){this===t.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(t,i,s){var n,a,o=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(t),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(t),this.originalPageX=t.pageX,this.originalPageY=t.pageY,o.cursorAt&&this._adjustOffsetFromHelper(o.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),o.containment&&this._setContainment(),o.cursor&&"auto"!==o.cursor&&(a=this.document.find("body"),this.storedCursor=a.css("cursor"),a.css("cursor",o.cursor),this.storedStylesheet=e("<style>*{ cursor: "+o.cursor+" !important; }</style>").appendTo(a)),o.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",o.opacity)),o.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",o.zIndex)),this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",t,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",t,this._uiHash(this));
12
+ return e.ui.ddmanager&&(e.ui.ddmanager.current=this),e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(t),!0},_mouseDrag:function(t){var i,s,n,a,o=this.options,r=!1;for(this.position=this._generatePosition(t),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-t.pageY<o.scrollSensitivity?this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop+o.scrollSpeed:t.pageY-this.overflowOffset.top<o.scrollSensitivity&&(this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop-o.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-t.pageX<o.scrollSensitivity?this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft+o.scrollSpeed:t.pageX-this.overflowOffset.left<o.scrollSensitivity&&(this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft-o.scrollSpeed)):(t.pageY-this.document.scrollTop()<o.scrollSensitivity?r=this.document.scrollTop(this.document.scrollTop()-o.scrollSpeed):this.window.height()-(t.pageY-this.document.scrollTop())<o.scrollSensitivity&&(r=this.document.scrollTop(this.document.scrollTop()+o.scrollSpeed)),t.pageX-this.document.scrollLeft()<o.scrollSensitivity?r=this.document.scrollLeft(this.document.scrollLeft()-o.scrollSpeed):this.window.width()-(t.pageX-this.document.scrollLeft())<o.scrollSensitivity&&(r=this.document.scrollLeft(this.document.scrollLeft()+o.scrollSpeed))),r!==!1&&e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t)),this.positionAbs=this._convertPositionTo("absolute"),this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),i=this.items.length-1;i>=0;i--)if(s=this.items[i],n=s.item[0],a=this._intersectsWithPointer(s),a&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===a?"next":"prev"]()[0]!==n&&!e.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!e.contains(this.element[0],n):!0)){if(this.direction=1===a?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(t,s),this._trigger("change",t,this._uiHash());break}return this._contactContainers(t),e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),this._trigger("sort",t,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(t,i){if(t){if(e.ui.ddmanager&&!this.options.dropBehaviour&&e.ui.ddmanager.drop(this,t),this.options.revert){var s=this,n=this.placeholder.offset(),a=this.options.axis,o={};a&&"x"!==a||(o.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollLeft)),a&&"y"!==a||(o.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,e(this.helper).animate(o,parseInt(this.options.revert,10)||500,function(){s._clear(t)})}else this._clear(t,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp({target:null}),"original"===this.options.helper?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var t=this.containers.length-1;t>=0;t--)this.containers[t]._trigger("deactivate",null,this._uiHash(this)),this.containers[t].containerCache.over&&(this.containers[t]._trigger("out",null,this._uiHash(this)),this.containers[t].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),e.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?e(this.domPosition.prev).after(this.currentItem):e(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},e(i).each(function(){var i=(e(t.item||this).attr(t.attribute||"id")||"").match(t.expression||/(.+)[\-=_](.+)/);i&&s.push((t.key||i[1]+"[]")+"="+(t.key&&t.expression?i[1]:i[2]))}),!s.length&&t.key&&s.push(t.key+"="),s.join("&")},toArray:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},i.each(function(){s.push(e(t.item||this).attr(t.attribute||"id")||"")}),s},_intersectsWith:function(e){var t=this.positionAbs.left,i=t+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,a=e.left,o=a+e.width,r=e.top,h=r+e.height,l=this.offset.click.top,u=this.offset.click.left,d="x"===this.options.axis||s+l>r&&h>s+l,c="y"===this.options.axis||t+u>a&&o>t+u,p=d&&c;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>e[this.floating?"width":"height"]?p:t+this.helperProportions.width/2>a&&o>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(e){var t="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top,e.height),i="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left,e.width),s=t&&i,n=this._getDragVerticalDirection(),a=this._getDragHorizontalDirection();return s?this.floating?a&&"right"===a||"down"===n?2:1:n&&("down"===n?2:1):!1},_intersectsWithSides:function(e){var t=this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top+e.height/2,e.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left+e.width/2,e.width),s=this._getDragVerticalDirection(),n=this._getDragHorizontalDirection();return this.floating&&n?"right"===n&&i||"left"===n&&!i:s&&("down"===s&&t||"up"===s&&!t)},_getDragVerticalDirection:function(){var e=this.positionAbs.top-this.lastPositionAbs.top;return 0!==e&&(e>0?"down":"up")},_getDragHorizontalDirection:function(){var e=this.positionAbs.left-this.lastPositionAbs.left;return 0!==e&&(e>0?"right":"left")},refresh:function(e){return this._refreshItems(e),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var e=this.options;return e.connectWith.constructor===String?[e.connectWith]:e.connectWith},_getItemsAsjQuery:function(t){function i(){r.push(this)}var s,n,a,o,r=[],h=[],l=this._connectWith();if(l&&t)for(s=l.length-1;s>=0;s--)for(a=e(l[s],this.document[0]),n=a.length-1;n>=0;n--)o=e.data(a[n],this.widgetFullName),o&&o!==this&&!o.options.disabled&&h.push([e.isFunction(o.options.items)?o.options.items.call(o.element):e(o.options.items,o.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),o]);for(h.push([e.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):e(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),s=h.length-1;s>=0;s--)h[s][0].each(i);return e(r)},_removeCurrentsFromItems:function(){var t=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=e.grep(this.items,function(e){for(var i=0;t.length>i;i++)if(t[i]===e.item[0])return!1;return!0})},_refreshItems:function(t){this.items=[],this.containers=[this];var i,s,n,a,o,r,h,l,u=this.items,d=[[e.isFunction(this.options.items)?this.options.items.call(this.element[0],t,{item:this.currentItem}):e(this.options.items,this.element),this]],c=this._connectWith();if(c&&this.ready)for(i=c.length-1;i>=0;i--)for(n=e(c[i],this.document[0]),s=n.length-1;s>=0;s--)a=e.data(n[s],this.widgetFullName),a&&a!==this&&!a.options.disabled&&(d.push([e.isFunction(a.options.items)?a.options.items.call(a.element[0],t,{item:this.currentItem}):e(a.options.items,a.element),a]),this.containers.push(a));for(i=d.length-1;i>=0;i--)for(o=d[i][1],r=d[i][0],s=0,l=r.length;l>s;s++)h=e(r[s]),h.data(this.widgetName+"-item",o),u.push({item:h,instance:o,width:0,height:0,left:0,top:0})},refreshPositions:function(t){this.floating=this.items.length?"x"===this.options.axis||this._isFloating(this.items[0].item):!1,this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,a;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?e(this.options.toleranceElement,s.item):s.item,t||(s.width=n.outerWidth(),s.height=n.outerHeight()),a=n.offset(),s.left=a.left,s.top=a.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)a=this.containers[i].element.offset(),this.containers[i].containerCache.left=a.left,this.containers[i].containerCache.top=a.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(t){t=t||this;var i,s=t.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=t.currentItem[0].nodeName.toLowerCase(),n=e("<"+s+">",t.document[0]).addClass(i||t.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper");return"tbody"===s?t._createTrPlaceholder(t.currentItem.find("tr").eq(0),e("<tr>",t.document[0]).appendTo(n)):"tr"===s?t._createTrPlaceholder(t.currentItem,n):"img"===s&&n.attr("src",t.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(e,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(t.currentItem.innerHeight()-parseInt(t.currentItem.css("paddingTop")||0,10)-parseInt(t.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(t.currentItem.innerWidth()-parseInt(t.currentItem.css("paddingLeft")||0,10)-parseInt(t.currentItem.css("paddingRight")||0,10)))}}),t.placeholder=e(s.placeholder.element.call(t.element,t.currentItem)),t.currentItem.after(t.placeholder),s.placeholder.update(t,t.placeholder)},_createTrPlaceholder:function(t,i){var s=this;t.children().each(function(){e("<td>&#160;</td>",s.document[0]).attr("colspan",e(this).attr("colspan")||1).appendTo(i)})},_contactContainers:function(t){var i,s,n,a,o,r,h,l,u,d,c=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!e.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(c&&e.contains(this.containers[i].element[0],c.element[0]))continue;c=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",t,this._uiHash(this)),this.containers[i].containerCache.over=0);if(c)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(n=1e4,a=null,u=c.floating||this._isFloating(this.currentItem),o=u?"left":"top",r=u?"width":"height",d=u?"clientX":"clientY",s=this.items.length-1;s>=0;s--)e.contains(this.containers[p].element[0],this.items[s].item[0])&&this.items[s].item[0]!==this.currentItem[0]&&(h=this.items[s].item.offset()[o],l=!1,t[d]-h>this.items[s][r]/2&&(l=!0),n>Math.abs(t[d]-h)&&(n=Math.abs(t[d]-h),a=this.items[s],this.direction=l?"up":"down"));if(!a&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return this.currentContainer.containerCache.over||(this.containers[p]._trigger("over",t,this._uiHash()),this.currentContainer.containerCache.over=1),void 0;a?this._rearrange(t,a,null,!0):this._rearrange(t,null,this.containers[p].element,!0),this._trigger("change",t,this._uiHash()),this.containers[p]._trigger("change",t,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper)?e(i.helper.apply(this.element[0],[t,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||e("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var t=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===this.document[0].body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&e.ui.ie)&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var e=this.currentItem.position();return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:e.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,"document"===n.containment?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,("document"===n.containment?this.document.width():this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(t=e(n.containment)[0],i=e(n.containment).offset(),s="hidden"!==e(t).css("overflow"),this.containment=[i.left+(parseInt(e(t).css("borderLeftWidth"),10)||0)+(parseInt(e(t).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(e(t).css("borderTopWidth"),10)||0)+(parseInt(e(t).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(t.scrollWidth,t.offsetWidth):t.offsetWidth)-(parseInt(e(t).css("borderLeftWidth"),10)||0)-(parseInt(e(t).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(t.scrollHeight,t.offsetHeight):t.offsetHeight)-(parseInt(e(t).css("borderTopWidth"),10)||0)-(parseInt(e(t).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(t,i){i||(i=this.position);var s="absolute"===t?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,a=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():a?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():a?0:n.scrollLeft())*s}},_generatePosition:function(t){var i,s,n=this.options,a=t.pageX,o=t.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(t.pageX-this.offset.click.left<this.containment[0]&&(a=this.containment[0]+this.offset.click.left),t.pageY-this.offset.click.top<this.containment[1]&&(o=this.containment[1]+this.offset.click.top),t.pageX-this.offset.click.left>this.containment[2]&&(a=this.containment[2]+this.offset.click.left),t.pageY-this.offset.click.top>this.containment[3]&&(o=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((o-this.originalPageY)/n.grid[1])*n.grid[1],o=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((a-this.originalPageX)/n.grid[0])*n.grid[0],a=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:o-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():h?0:r.scrollTop()),left:a-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?0:r.scrollLeft())}},_rearrange:function(e,t,i,s){i?i[0].appendChild(this.placeholder[0]):t.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?t.item[0]:t.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(e,t){function i(e,t,i){return function(s){i._trigger(e,s,t._uiHash(t))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)("auto"===this._storedCSS[s]||"static"===this._storedCSS[s])&&(this._storedCSS[s]="");this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!t&&n.push(function(e){this._trigger("receive",e,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||t||n.push(function(e){this._trigger("update",e,this._uiHash())}),this!==this.currentContainer&&(t||(n.push(function(e){this._trigger("remove",e,this._uiHash())}),n.push(function(e){return function(t){e._trigger("receive",t,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(e){return function(t){e._trigger("update",t,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)t||n.push(i("deactivate",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i("out",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,t||this._trigger("beforeStop",e,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!t){for(s=0;n.length>s;s++)n[s].call(this,e);this._trigger("stop",e,this._uiHash())}return this.fromOutside=!1,!this.cancelHelperRemoval},_trigger:function(){e.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(t){var i=t||this;return{helper:i.helper,placeholder:i.placeholder||e([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:t?t.element:null}}}),e.widget("ui.spinner",{version:"1.11.4",defaultElement:"<input>",widgetEventPrefix:"spin",options:{culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),""!==this.value()&&this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var t={},i=this.element;return e.each(["min","max","step"],function(e,s){var n=i.attr(s);void 0!==n&&n.length&&(t[s]=n)}),t},_events:{keydown:function(e){this._start(e)&&this._keydown(e)&&e.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(this._stop(),this._refresh(),this.previous!==this.element.val()&&this._trigger("change",e),void 0)},mousewheel:function(e,t){if(t){if(!this.spinning&&!this._start(e))return!1;this._spin((t>0?1:-1)*this.options.step,e),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(e)},100),e.preventDefault()}},"mousedown .ui-spinner-button":function(t){function i(){var e=this.element[0]===this.document[0].activeElement;e||(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s}))}var s;s=this.element[0]===this.document[0].activeElement?this.previous:this.element.val(),t.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),this._start(t)!==!1&&this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(t){return e(t.currentTarget).hasClass("ui-state-active")?this._start(t)===!1?!1:(this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t),void 0):void 0},"mouseleave .ui-spinner-button":"_stop"},_draw:function(){var e=this.uiSpinner=this.element.addClass("ui-spinner-input").attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml());this.element.attr("role","spinbutton"),this.buttons=e.find(".ui-spinner-button").attr("tabIndex",-1).button().removeClass("ui-corner-all"),this.buttons.height()>Math.ceil(.5*e.height())&&e.height()>0&&e.height(e.height()),this.options.disabled&&this.disable()},_keydown:function(t){var i=this.options,s=e.ui.keyCode;switch(t.keyCode){case s.UP:return this._repeat(null,1,t),!0;case s.DOWN:return this._repeat(null,-1,t),!0;case s.PAGE_UP:return this._repeat(null,i.page,t),!0;case s.PAGE_DOWN:return this._repeat(null,-i.page,t),!0}return!1},_uiSpinnerHtml:function(){return"<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>"},_buttonHtml:function(){return"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'><span class='ui-icon "+this.options.icons.up+"'>&#9650;</span>"+"</a>"+"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>"+"<span class='ui-icon "+this.options.icons.down+"'>&#9660;</span>"+"</a>"},_start:function(e){return this.spinning||this._trigger("start",e)!==!1?(this.counter||(this.counter=1),this.spinning=!0,!0):!1},_repeat:function(e,t,i){e=e||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,t,i)},e),this._spin(t*this.options.step,i)},_spin:function(e,t){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+e*this._increment(this.counter)),this.spinning&&this._trigger("spin",t,{value:i})===!1||(this._value(i),this.counter++)},_increment:function(t){var i=this.options.incremental;return i?e.isFunction(i)?i(t):Math.floor(t*t*t/5e4-t*t/500+17*t/200+1):1},_precision:function(){var e=this._precisionOf(this.options.step);return null!==this.options.min&&(e=Math.max(e,this._precisionOf(this.options.min))),e},_precisionOf:function(e){var t=""+e,i=t.indexOf(".");return-1===i?0:t.length-i-1},_adjustValue:function(e){var t,i,s=this.options;return t=null!==s.min?s.min:0,i=e-t,i=Math.round(i/s.step)*s.step,e=t+i,e=parseFloat(e.toFixed(this._precision())),null!==s.max&&e>s.max?s.max:null!==s.min&&s.min>e?s.min:e},_stop:function(e){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",e))},_setOption:function(e,t){if("culture"===e||"numberFormat"===e){var i=this._parse(this.element.val());return this.options[e]=t,this.element.val(this._format(i)),void 0}("max"===e||"min"===e||"step"===e)&&"string"==typeof t&&(t=this._parse(t)),"icons"===e&&(this.buttons.first().find(".ui-icon").removeClass(this.options.icons.up).addClass(t.up),this.buttons.last().find(".ui-icon").removeClass(this.options.icons.down).addClass(t.down)),this._super(e,t),"disabled"===e&&(this.widget().toggleClass("ui-state-disabled",!!t),this.element.prop("disabled",!!t),this.buttons.button(t?"disable":"enable"))},_setOptions:h(function(e){this._super(e)}),_parse:function(e){return"string"==typeof e&&""!==e&&(e=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(e,10,this.options.culture):+e),""===e||isNaN(e)?null:e},_format:function(e){return""===e?"":window.Globalize&&this.options.numberFormat?Globalize.format(e,this.options.numberFormat,this.options.culture):e},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},isValid:function(){var e=this.value();return null===e?!1:e===this._adjustValue(e)},_value:function(e,t){var i;""!==e&&(i=this._parse(e),null!==i&&(t||(i=this._adjustValue(i)),e=this._format(i))),this.element.val(e),this._refresh()},_destroy:function(){this.element.removeClass("ui-spinner-input").prop("disabled",!1).removeAttr("autocomplete").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:h(function(e){this._stepUp(e)}),_stepUp:function(e){this._start()&&(this._spin((e||1)*this.options.step),this._stop())},stepDown:h(function(e){this._stepDown(e)}),_stepDown:function(e){this._start()&&(this._spin((e||1)*-this.options.step),this._stop())},pageUp:h(function(e){this._stepUp((e||1)*this.options.page)}),pageDown:h(function(e){this._stepDown((e||1)*this.options.page)}),value:function(e){return arguments.length?(h(this._value).call(this,e),void 0):this._parse(this.element.val())},widget:function(){return this.uiSpinner}}),e.widget("ui.tabs",{version:"1.11.4",delay:300,options:{active:null,collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_isLocal:function(){var e=/#.*$/;return function(t){var i,s;t=t.cloneNode(!1),i=t.href.replace(e,""),s=location.href.replace(e,"");try{i=decodeURIComponent(i)}catch(n){}try{s=decodeURIComponent(s)}catch(n){}return t.hash.length>1&&i===s}}(),_create:function(){var t=this,i=this.options;this.running=!1,this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all").toggleClass("ui-tabs-collapsible",i.collapsible),this._processTabs(),i.active=this._initialActive(),e.isArray(i.disabled)&&(i.disabled=e.unique(i.disabled.concat(e.map(this.tabs.filter(".ui-state-disabled"),function(e){return t.tabs.index(e)}))).sort()),this.active=this.options.active!==!1&&this.anchors.length?this._findActive(i.active):e(),this._refresh(),this.active.length&&this.load(i.active)},_initialActive:function(){var t=this.options.active,i=this.options.collapsible,s=location.hash.substring(1);return null===t&&(s&&this.tabs.each(function(i,n){return e(n).attr("aria-controls")===s?(t=i,!1):void 0}),null===t&&(t=this.tabs.index(this.tabs.filter(".ui-tabs-active"))),(null===t||-1===t)&&(t=this.tabs.length?0:!1)),t!==!1&&(t=this.tabs.index(this.tabs.eq(t)),-1===t&&(t=i?!1:0)),!i&&t===!1&&this.anchors.length&&(t=0),t},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):e()}},_tabKeydown:function(t){var i=e(this.document[0].activeElement).closest("li"),s=this.tabs.index(i),n=!0;if(!this._handlePageNav(t)){switch(t.keyCode){case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:s++;break;case e.ui.keyCode.UP:case e.ui.keyCode.LEFT:n=!1,s--;break;case e.ui.keyCode.END:s=this.anchors.length-1;break;case e.ui.keyCode.HOME:s=0;break;case e.ui.keyCode.SPACE:return t.preventDefault(),clearTimeout(this.activating),this._activate(s),void 0;case e.ui.keyCode.ENTER:return t.preventDefault(),clearTimeout(this.activating),this._activate(s===this.options.active?!1:s),void 0;default:return}t.preventDefault(),clearTimeout(this.activating),s=this._focusNextTab(s,n),t.ctrlKey||t.metaKey||(i.attr("aria-selected","false"),this.tabs.eq(s).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",s)},this.delay))}},_panelKeydown:function(t){this._handlePageNav(t)||t.ctrlKey&&t.keyCode===e.ui.keyCode.UP&&(t.preventDefault(),this.active.focus())},_handlePageNav:function(t){return t.altKey&&t.keyCode===e.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):t.altKey&&t.keyCode===e.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):void 0},_findNextTab:function(t,i){function s(){return t>n&&(t=0),0>t&&(t=n),t}for(var n=this.tabs.length-1;-1!==e.inArray(s(),this.options.disabled);)t=i?t+1:t-1;return t},_focusNextTab:function(e,t){return e=this._findNextTab(e,t),this.tabs.eq(e).focus(),e},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):"disabled"===e?(this._setupDisabled(t),void 0):(this._super(e,t),"collapsible"===e&&(this.element.toggleClass("ui-tabs-collapsible",t),t||this.options.active!==!1||this._activate(0)),"event"===e&&this._setupEvents(t),"heightStyle"===e&&this._setupHeightStyle(t),void 0)},_sanitizeSelector:function(e){return e?e.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var t=this.options,i=this.tablist.children(":has(a[href])");t.disabled=e.map(i.filter(".ui-state-disabled"),function(e){return i.index(e)}),this._processTabs(),t.active!==!1&&this.anchors.length?this.active.length&&!e.contains(this.tablist[0],this.active[0])?this.tabs.length===t.disabled.length?(t.active=!1,this.active=e()):this._activate(this._findNextTab(Math.max(0,t.active-1),!1)):t.active=this.tabs.index(this.active):(t.active=!1,this.active=e()),this._refresh()},_refresh:function(){this._setupDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-hidden":"true"}),this.active.length?(this.active.addClass("ui-tabs-active ui-state-active").attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}),this._getPanelForTab(this.active).show().attr({"aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var t=this,i=this.tabs,s=this.anchors,n=this.panels;
13
+ this.tablist=this._getList().addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").attr("role","tablist").delegate("> li","mousedown"+this.eventNamespace,function(t){e(this).is(".ui-state-disabled")&&t.preventDefault()}).delegate(".ui-tabs-anchor","focus"+this.eventNamespace,function(){e(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this.tabs=this.tablist.find("> li:has(a[href])").addClass("ui-state-default ui-corner-top").attr({role:"tab",tabIndex:-1}),this.anchors=this.tabs.map(function(){return e("a",this)[0]}).addClass("ui-tabs-anchor").attr({role:"presentation",tabIndex:-1}),this.panels=e(),this.anchors.each(function(i,s){var n,a,o,r=e(s).uniqueId().attr("id"),h=e(s).closest("li"),l=h.attr("aria-controls");t._isLocal(s)?(n=s.hash,o=n.substring(1),a=t.element.find(t._sanitizeSelector(n))):(o=h.attr("aria-controls")||e({}).uniqueId()[0].id,n="#"+o,a=t.element.find(n),a.length||(a=t._createPanel(o),a.insertAfter(t.panels[i-1]||t.tablist)),a.attr("aria-live","polite")),a.length&&(t.panels=t.panels.add(a)),l&&h.data("ui-tabs-aria-controls",l),h.attr({"aria-controls":o,"aria-labelledby":r}),a.attr("aria-labelledby",r)}),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").attr("role","tabpanel"),i&&(this._off(i.not(this.tabs)),this._off(s.not(this.anchors)),this._off(n.not(this.panels)))},_getList:function(){return this.tablist||this.element.find("ol,ul").eq(0)},_createPanel:function(t){return e("<div>").attr("id",t).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").data("ui-tabs-destroy",!0)},_setupDisabled:function(t){e.isArray(t)&&(t.length?t.length===this.anchors.length&&(t=!0):t=!1);for(var i,s=0;i=this.tabs[s];s++)t===!0||-1!==e.inArray(s,t)?e(i).addClass("ui-state-disabled").attr("aria-disabled","true"):e(i).removeClass("ui-state-disabled").removeAttr("aria-disabled");this.options.disabled=t},_setupEvents:function(t){var i={};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(!0,this.anchors,{click:function(e){e.preventDefault()}}),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(t){var i,s=this.element.parent();"fill"===t?(i=s.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var t=e(this),s=t.css("position");"absolute"!==s&&"fixed"!==s&&(i-=t.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=e(this).outerHeight(!0)}),this.panels.each(function(){e(this).height(Math.max(0,i-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===t&&(i=0,this.panels.each(function(){i=Math.max(i,e(this).height("").height())}).height(i))},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n.closest("li"),o=a[0]===s[0],r=o&&i.collapsible,h=r?e():this._getPanelForTab(a),l=s.length?this._getPanelForTab(s):e(),u={oldTab:s,oldPanel:l,newTab:r?e():a,newPanel:h};t.preventDefault(),a.hasClass("ui-state-disabled")||a.hasClass("ui-tabs-loading")||this.running||o&&!i.collapsible||this._trigger("beforeActivate",t,u)===!1||(i.active=r?!1:this.tabs.index(a),this.active=o?e():a,this.xhr&&this.xhr.abort(),l.length||h.length||e.error("jQuery UI Tabs: Mismatching fragment identifier."),h.length&&this.load(this.tabs.index(a),t),this._toggle(t,u))},_toggle:function(t,i){function s(){a.running=!1,a._trigger("activate",t,i)}function n(){i.newTab.closest("li").addClass("ui-tabs-active ui-state-active"),o.length&&a.options.show?a._show(o,a.options.show,s):(o.show(),s())}var a=this,o=i.newPanel,r=i.oldPanel;this.running=!0,r.length&&this.options.hide?this._hide(r,this.options.hide,function(){i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),n()}):(i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),r.hide(),n()),r.attr("aria-hidden","true"),i.oldTab.attr({"aria-selected":"false","aria-expanded":"false"}),o.length&&r.length?i.oldTab.attr("tabIndex",-1):o.length&&this.tabs.filter(function(){return 0===e(this).attr("tabIndex")}).attr("tabIndex",-1),o.attr("aria-hidden","false"),i.newTab.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_activate:function(t){var i,s=this._findActive(t);s[0]!==this.active[0]&&(s.length||(s=this.active),i=s.find(".ui-tabs-anchor")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return t===!1?e():this.tabs.eq(t)},_getIndex:function(e){return"string"==typeof e&&(e=this.anchors.index(this.anchors.filter("[href$='"+e+"']"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.element.removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible"),this.tablist.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").removeAttr("role"),this.anchors.removeClass("ui-tabs-anchor").removeAttr("role").removeAttr("tabIndex").removeUniqueId(),this.tablist.unbind(this.eventNamespace),this.tabs.add(this.panels).each(function(){e.data(this,"ui-tabs-destroy")?e(this).remove():e(this).removeClass("ui-state-default ui-state-active ui-state-disabled ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel").removeAttr("tabIndex").removeAttr("aria-live").removeAttr("aria-busy").removeAttr("aria-selected").removeAttr("aria-labelledby").removeAttr("aria-hidden").removeAttr("aria-expanded").removeAttr("role")}),this.tabs.each(function(){var t=e(this),i=t.data("ui-tabs-aria-controls");i?t.attr("aria-controls",i).removeData("ui-tabs-aria-controls"):t.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(t){var i=this.options.disabled;i!==!1&&(void 0===t?i=!1:(t=this._getIndex(t),i=e.isArray(i)?e.map(i,function(e){return e!==t?e:null}):e.map(this.tabs,function(e,i){return i!==t?i:null})),this._setupDisabled(i))},disable:function(t){var i=this.options.disabled;if(i!==!0){if(void 0===t)i=!0;else{if(t=this._getIndex(t),-1!==e.inArray(t,i))return;i=e.isArray(i)?e.merge([t],i).sort():[t]}this._setupDisabled(i)}},load:function(t,i){t=this._getIndex(t);var s=this,n=this.tabs.eq(t),a=n.find(".ui-tabs-anchor"),o=this._getPanelForTab(n),r={tab:n,panel:o},h=function(e,t){"abort"===t&&s.panels.stop(!1,!0),n.removeClass("ui-tabs-loading"),o.removeAttr("aria-busy"),e===s.xhr&&delete s.xhr};this._isLocal(a[0])||(this.xhr=e.ajax(this._ajaxSettings(a,i,r)),this.xhr&&"canceled"!==this.xhr.statusText&&(n.addClass("ui-tabs-loading"),o.attr("aria-busy","true"),this.xhr.done(function(e,t,n){setTimeout(function(){o.html(e),s._trigger("load",i,r),h(n,t)},1)}).fail(function(e,t){setTimeout(function(){h(e,t)},1)})))},_ajaxSettings:function(t,i,s){var n=this;return{url:t.attr("href"),beforeSend:function(t,a){return n._trigger("beforeLoad",i,e.extend({jqXHR:t,ajaxSettings:a},s))}}},_getPanelForTab:function(t){var i=e(t).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+i))}}),e.widget("ui.tooltip",{version:"1.11.4",options:{content:function(){var t=e(this).attr("title")||"";return e("<a>").text(t).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,tooltipClass:null,track:!1,close:null,open:null},_addDescribedBy:function(t,i){var s=(t.attr("aria-describedby")||"").split(/\s+/);s.push(i),t.data("ui-tooltip-id",i).attr("aria-describedby",e.trim(s.join(" ")))},_removeDescribedBy:function(t){var i=t.data("ui-tooltip-id"),s=(t.attr("aria-describedby")||"").split(/\s+/),n=e.inArray(i,s);-1!==n&&s.splice(n,1),t.removeData("ui-tooltip-id"),s=e.trim(s.join(" ")),s?t.attr("aria-describedby",s):t.removeAttr("aria-describedby")},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.options.disabled&&this._disable(),this.liveRegion=e("<div>").attr({role:"log","aria-live":"assertive","aria-relevant":"additions"}).addClass("ui-helper-hidden-accessible").appendTo(this.document[0].body)},_setOption:function(t,i){var s=this;return"disabled"===t?(this[i?"_disable":"_enable"](),this.options[t]=i,void 0):(this._super(t,i),"content"===t&&e.each(this.tooltips,function(e,t){s._updateContent(t.element)}),void 0)},_disable:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur");n.target=n.currentTarget=s.element[0],t.close(n,!0)}),this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.is("[title]")&&t.data("ui-tooltip-title",t.attr("title")).removeAttr("title")})},_enable:function(){this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.data("ui-tooltip-title")&&t.attr("title",t.data("ui-tooltip-title"))})},open:function(t){var i=this,s=e(t?t.target:this.element).closest(this.options.items);s.length&&!s.data("ui-tooltip-id")&&(s.attr("title")&&s.data("ui-tooltip-title",s.attr("title")),s.data("ui-tooltip-open",!0),t&&"mouseover"===t.type&&s.parents().each(function(){var t,s=e(this);s.data("ui-tooltip-open")&&(t=e.Event("blur"),t.target=t.currentTarget=this,i.close(t,!0)),s.attr("title")&&(s.uniqueId(),i.parents[this.id]={element:this,title:s.attr("title")},s.attr("title",""))}),this._registerCloseHandlers(t,s),this._updateContent(s,t))},_updateContent:function(e,t){var i,s=this.options.content,n=this,a=t?t.type:null;return"string"==typeof s?this._open(t,e,s):(i=s.call(e[0],function(i){n._delay(function(){e.data("ui-tooltip-open")&&(t&&(t.type=a),this._open(t,e,i))})}),i&&this._open(t,e,i),void 0)},_open:function(t,i,s){function n(e){l.of=e,o.is(":hidden")||o.position(l)}var a,o,r,h,l=e.extend({},this.options.position);if(s){if(a=this._find(i))return a.tooltip.find(".ui-tooltip-content").html(s),void 0;i.is("[title]")&&(t&&"mouseover"===t.type?i.attr("title",""):i.removeAttr("title")),a=this._tooltip(i),o=a.tooltip,this._addDescribedBy(i,o.attr("id")),o.find(".ui-tooltip-content").html(s),this.liveRegion.children().hide(),s.clone?(h=s.clone(),h.removeAttr("id").find("[id]").removeAttr("id")):h=s,e("<div>").html(h).appendTo(this.liveRegion),this.options.track&&t&&/^mouse/.test(t.type)?(this._on(this.document,{mousemove:n}),n(t)):o.position(e.extend({of:i},this.options.position)),o.hide(),this._show(o,this.options.show),this.options.show&&this.options.show.delay&&(r=this.delayedShow=setInterval(function(){o.is(":visible")&&(n(l.of),clearInterval(r))},e.fx.interval)),this._trigger("open",t,{tooltip:o})}},_registerCloseHandlers:function(t,i){var s={keyup:function(t){if(t.keyCode===e.ui.keyCode.ESCAPE){var s=e.Event(t);s.currentTarget=i[0],this.close(s,!0)}}};i[0]!==this.element[0]&&(s.remove=function(){this._removeTooltip(this._find(i).tooltip)}),t&&"mouseover"!==t.type||(s.mouseleave="close"),t&&"focusin"!==t.type||(s.focusout="close"),this._on(!0,i,s)},close:function(t){var i,s=this,n=e(t?t.currentTarget:this.element),a=this._find(n);return a?(i=a.tooltip,a.closing||(clearInterval(this.delayedShow),n.data("ui-tooltip-title")&&!n.attr("title")&&n.attr("title",n.data("ui-tooltip-title")),this._removeDescribedBy(n),a.hiding=!0,i.stop(!0),this._hide(i,this.options.hide,function(){s._removeTooltip(e(this))}),n.removeData("ui-tooltip-open"),this._off(n,"mouseleave focusout keyup"),n[0]!==this.element[0]&&this._off(n,"remove"),this._off(this.document,"mousemove"),t&&"mouseleave"===t.type&&e.each(this.parents,function(t,i){e(i.element).attr("title",i.title),delete s.parents[t]}),a.closing=!0,this._trigger("close",t,{tooltip:i}),a.hiding||(a.closing=!1)),void 0):(n.removeData("ui-tooltip-open"),void 0)},_tooltip:function(t){var i=e("<div>").attr("role","tooltip").addClass("ui-tooltip ui-widget ui-corner-all ui-widget-content "+(this.options.tooltipClass||"")),s=i.uniqueId().attr("id");return e("<div>").addClass("ui-tooltip-content").appendTo(i),i.appendTo(this.document[0].body),this.tooltips[s]={element:t,tooltip:i}},_find:function(e){var t=e.data("ui-tooltip-id");return t?this.tooltips[t]:null},_removeTooltip:function(e){e.remove(),delete this.tooltips[e.attr("id")]},_destroy:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur"),a=s.element;n.target=n.currentTarget=a[0],t.close(n,!0),e("#"+i).remove(),a.data("ui-tooltip-title")&&(a.attr("title")||a.attr("title",a.data("ui-tooltip-title")),a.removeData("ui-tooltip-title"))}),this.liveRegion.remove()}})});
skin/frontend/base/default/js/mkmage/layerednavigation/layered.js ADDED
@@ -0,0 +1,157 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (function($){
2
+
3
+ var toggleFilters = false;
4
+
5
+ function initLoader() {
6
+ $('.mkmage-overlay').fadeIn(200, function(){
7
+ $('.mkmage-loader').show();
8
+ });
9
+ }
10
+
11
+ function killLoader() {
12
+ $('.mkmage-loader').hide();
13
+ $('.mkmage-overlay').fadeOut(200);
14
+ }
15
+
16
+ function filter(){
17
+ var origMinPriceFilter = parseFloat($('#original-price-filter-min').val()),
18
+ origMaxPriceFilter = parseFloat($('#original-price-filter-max').val()),
19
+ newMinPriceFilter = parseFloat($('#price-filter-min').val()),
20
+ newMaxPriceFilter = parseFloat($('#price-filter-max').val());
21
+
22
+ $("#slider-range").slider({
23
+ range: true,
24
+ min: ((origMinPriceFilter) < newMinPriceFilter) ? (origMinPriceFilter) : newMinPriceFilter,
25
+ max: ((origMaxPriceFilter) > newMaxPriceFilter) ? (origMaxPriceFilter) : newMaxPriceFilter,
26
+ values: [ parseFloat($('#price-filter-min').val()), parseFloat($('#price-filter-max').val()) ],
27
+ step:0.01,
28
+ stop: function( event, ui ) {
29
+ var minvalue = ui.values[ 0 ];
30
+ var maxvalue = ui.values[ 1 ];
31
+
32
+ $( "#price_from" ).html( "$" + minvalue);
33
+ $( "#price_to" ).html( "$" + maxvalue);
34
+
35
+ var currentUrl = $('#price-filter-url').val();
36
+ var newUrl = ( currentUrl.indexOf("?") != -1 ) ?
37
+ ( currentUrl + 'price=' + minvalue + '-' + maxvalue ) : ( currentUrl + 'price=' + minvalue + '-' + maxvalue );
38
+ //console.log(newUrl);
39
+ filterAjax(newUrl);
40
+ }
41
+ });
42
+
43
+ $( "#price_from" ).html( "$" + $( "#slider-range" ).slider( "values", 0 ));
44
+ $( "#price_to" ).html( "$" + $( "#slider-range" ).slider( "values", 1 ));
45
+
46
+ $('.toolbar a').each(function(index){
47
+ $(this).click(function(){
48
+ filterAjax($( this ).attr('href'));
49
+ //console.log( index + ": " + $( this ).text() );
50
+ return false;
51
+ });
52
+
53
+ });
54
+ $('.toolbar select').each(function(index){
55
+ $(this).removeAttr('onchange');
56
+ $(this).change(function(){
57
+ filterAjax($( this ).val());
58
+ //console.log( index + ": " + $( this ).text() );
59
+ return false;
60
+ });
61
+
62
+ });
63
+ $('.block-layered-nav a').each(function(index){
64
+ $(this).click(function(){
65
+ filterAjax($( this ).attr('href'));
66
+ //console.log( index + ": " + $( this ).text() );
67
+ return false;
68
+ });
69
+
70
+ });
71
+
72
+ }
73
+
74
+ function updatePage(data) {
75
+ //console.log(data);
76
+ var layeredBlock = $('.block-layered-nav').parent();
77
+ var listBlock = $('.category-products').parent();
78
+ $('.category-products').remove();
79
+ listBlock.append(data.page);
80
+ $('.block-layered-nav').remove();
81
+ layeredBlock.prepend(data.block);
82
+ $('body').append(data.js);
83
+ $('#loader').hide();
84
+ }
85
+
86
+ function filterAjax(s_url){
87
+ $.ajax({
88
+ type: "GET",
89
+ data : {is_ajax:1},
90
+ url: s_url,
91
+ beforeSend: function() {
92
+ initLoader();
93
+ },
94
+ success: function(data) {
95
+ killLoader();
96
+ updatePage(data);
97
+ filter();
98
+ },
99
+ error: function(jqXHR, textStatus, errorThrown) {
100
+ //console.log(errorThrown);
101
+ }
102
+ });
103
+ }
104
+
105
+ function categoryPageItemsHover() {
106
+ var productItem = $('.products-grid .item .item-image-wrapper');
107
+ productItem.hover(
108
+ function() {
109
+ $(this).find('.image-overlay').stop().fadeIn(250);
110
+ },
111
+ function() {
112
+ $(this).find('.image-overlay').stop().fadeOut(250);
113
+ }
114
+ );
115
+ }
116
+
117
+ function categoryPageFiltersToggle() {
118
+ var filters = $('.catalog-category-view #narrow-by-list .glyphicon-chevron-up');
119
+ filters.click(function(){
120
+ if($(this).hasClass('inactive-filter')) {
121
+ $(this).removeClass('inactive-filter');
122
+ $(this).css('transform','rotateX(0deg)');
123
+ var target = $(this).parent('dt').next().slideDown();
124
+ } else {
125
+ $(this).addClass('inactive-filter');
126
+ $(this).css('transform','rotateX(180deg)');
127
+ var target = $(this).parent('dt').next().slideUp();
128
+ }
129
+ });
130
+ }
131
+
132
+ function handleFilters() {
133
+ if ($(window).width() < 980) {
134
+ if(!toggleFilters) {
135
+ var filters = $('.catalog-category-view #narrow-by-list .glyphicon-chevron-up');
136
+ filters.each(function(){
137
+ if(!$(this).hasClass('inactive-filter')) {
138
+ $(this).click();
139
+ }
140
+ });
141
+ toggleFilters = true;
142
+ }
143
+ }
144
+ }
145
+
146
+ $(document).ready(function(){
147
+ $(".pfilter").parent().addClass('priceFilterItem');
148
+ filter();
149
+ categoryPageFiltersToggle();
150
+ //handleFilters();
151
+ });
152
+
153
+ $(window).resize(function(){
154
+ //handleFilters();
155
+ });
156
+
157
+ })(jQuery);
skin/frontend/base/default/js/mkmage/layerednavigation/price-slider.js ADDED
@@ -0,0 +1,16617 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*! jQuery UI - v1.11.4 - 2015-03-11
2
+ * http://jqueryui.com
3
+ * Includes: core.js, widget.js, mouse.js, position.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, draggable.js, droppable.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js, menu.js, progressbar.js, resizable.js, selectable.js, selectmenu.js, slider.js, sortable.js, spinner.js, tabs.js, tooltip.js
4
+ * Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */
5
+
6
+ (function( factory ) {
7
+ if ( typeof define === "function" && define.amd ) {
8
+
9
+ // AMD. Register as an anonymous module.
10
+ define([ "jquery" ], factory );
11
+ } else {
12
+
13
+ // Browser globals
14
+ factory( jQuery );
15
+ }
16
+ }(function( $ ) {
17
+ /*!
18
+ * jQuery UI Core 1.11.4
19
+ * http://jqueryui.com
20
+ *
21
+ * Copyright jQuery Foundation and other contributors
22
+ * Released under the MIT license.
23
+ * http://jquery.org/license
24
+ *
25
+ * http://api.jqueryui.com/category/ui-core/
26
+ */
27
+
28
+
29
+ // $.ui might exist from components with no dependencies, e.g., $.ui.position
30
+ $.ui = $.ui || {};
31
+
32
+ $.extend( $.ui, {
33
+ version: "1.11.4",
34
+
35
+ keyCode: {
36
+ BACKSPACE: 8,
37
+ COMMA: 188,
38
+ DELETE: 46,
39
+ DOWN: 40,
40
+ END: 35,
41
+ ENTER: 13,
42
+ ESCAPE: 27,
43
+ HOME: 36,
44
+ LEFT: 37,
45
+ PAGE_DOWN: 34,
46
+ PAGE_UP: 33,
47
+ PERIOD: 190,
48
+ RIGHT: 39,
49
+ SPACE: 32,
50
+ TAB: 9,
51
+ UP: 38
52
+ }
53
+ });
54
+
55
+ // plugins
56
+ $.fn.extend({
57
+ scrollParent: function( includeHidden ) {
58
+ var position = this.css( "position" ),
59
+ excludeStaticParent = position === "absolute",
60
+ overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,
61
+ scrollParent = this.parents().filter( function() {
62
+ var parent = $( this );
63
+ if ( excludeStaticParent && parent.css( "position" ) === "static" ) {
64
+ return false;
65
+ }
66
+ return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) + parent.css( "overflow-x" ) );
67
+ }).eq( 0 );
68
+
69
+ return position === "fixed" || !scrollParent.length ? $( this[ 0 ].ownerDocument || document ) : scrollParent;
70
+ },
71
+
72
+ uniqueId: (function() {
73
+ var uuid = 0;
74
+
75
+ return function() {
76
+ return this.each(function() {
77
+ if ( !this.id ) {
78
+ this.id = "ui-id-" + ( ++uuid );
79
+ }
80
+ });
81
+ };
82
+ })(),
83
+
84
+ removeUniqueId: function() {
85
+ return this.each(function() {
86
+ if ( /^ui-id-\d+$/.test( this.id ) ) {
87
+ $( this ).removeAttr( "id" );
88
+ }
89
+ });
90
+ }
91
+ });
92
+
93
+ // selectors
94
+ function focusable( element, isTabIndexNotNaN ) {
95
+ var map, mapName, img,
96
+ nodeName = element.nodeName.toLowerCase();
97
+ if ( "area" === nodeName ) {
98
+ map = element.parentNode;
99
+ mapName = map.name;
100
+ if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
101
+ return false;
102
+ }
103
+ img = $( "img[usemap='#" + mapName + "']" )[ 0 ];
104
+ return !!img && visible( img );
105
+ }
106
+ return ( /^(input|select|textarea|button|object)$/.test( nodeName ) ?
107
+ !element.disabled :
108
+ "a" === nodeName ?
109
+ element.href || isTabIndexNotNaN :
110
+ isTabIndexNotNaN) &&
111
+ // the element and all of its ancestors must be visible
112
+ visible( element );
113
+ }
114
+
115
+ function visible( element ) {
116
+ return $.expr.filters.visible( element ) &&
117
+ !$( element ).parents().addBack().filter(function() {
118
+ return $.css( this, "visibility" ) === "hidden";
119
+ }).length;
120
+ }
121
+
122
+ $.extend( $.expr[ ":" ], {
123
+ data: $.expr.createPseudo ?
124
+ $.expr.createPseudo(function( dataName ) {
125
+ return function( elem ) {
126
+ return !!$.data( elem, dataName );
127
+ };
128
+ }) :
129
+ // support: jQuery <1.8
130
+ function( elem, i, match ) {
131
+ return !!$.data( elem, match[ 3 ] );
132
+ },
133
+
134
+ focusable: function( element ) {
135
+ return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
136
+ },
137
+
138
+ tabbable: function( element ) {
139
+ var tabIndex = $.attr( element, "tabindex" ),
140
+ isTabIndexNaN = isNaN( tabIndex );
141
+ return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
142
+ }
143
+ });
144
+
145
+ // support: jQuery <1.8
146
+ if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
147
+ $.each( [ "Width", "Height" ], function( i, name ) {
148
+ var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
149
+ type = name.toLowerCase(),
150
+ orig = {
151
+ innerWidth: $.fn.innerWidth,
152
+ innerHeight: $.fn.innerHeight,
153
+ outerWidth: $.fn.outerWidth,
154
+ outerHeight: $.fn.outerHeight
155
+ };
156
+
157
+ function reduce( elem, size, border, margin ) {
158
+ $.each( side, function() {
159
+ size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
160
+ if ( border ) {
161
+ size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;
162
+ }
163
+ if ( margin ) {
164
+ size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
165
+ }
166
+ });
167
+ return size;
168
+ }
169
+
170
+ $.fn[ "inner" + name ] = function( size ) {
171
+ if ( size === undefined ) {
172
+ return orig[ "inner" + name ].call( this );
173
+ }
174
+
175
+ return this.each(function() {
176
+ $( this ).css( type, reduce( this, size ) + "px" );
177
+ });
178
+ };
179
+
180
+ $.fn[ "outer" + name] = function( size, margin ) {
181
+ if ( typeof size !== "number" ) {
182
+ return orig[ "outer" + name ].call( this, size );
183
+ }
184
+
185
+ return this.each(function() {
186
+ $( this).css( type, reduce( this, size, true, margin ) + "px" );
187
+ });
188
+ };
189
+ });
190
+ }
191
+
192
+ // support: jQuery <1.8
193
+ if ( !$.fn.addBack ) {
194
+ $.fn.addBack = function( selector ) {
195
+ return this.add( selector == null ?
196
+ this.prevObject : this.prevObject.filter( selector )
197
+ );
198
+ };
199
+ }
200
+
201
+ // support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
202
+ if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {
203
+ $.fn.removeData = (function( removeData ) {
204
+ return function( key ) {
205
+ if ( arguments.length ) {
206
+ return removeData.call( this, $.camelCase( key ) );
207
+ } else {
208
+ return removeData.call( this );
209
+ }
210
+ };
211
+ })( $.fn.removeData );
212
+ }
213
+
214
+ // deprecated
215
+ $.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
216
+
217
+ $.fn.extend({
218
+ focus: (function( orig ) {
219
+ return function( delay, fn ) {
220
+ return typeof delay === "number" ?
221
+ this.each(function() {
222
+ var elem = this;
223
+ setTimeout(function() {
224
+ $( elem ).focus();
225
+ if ( fn ) {
226
+ fn.call( elem );
227
+ }
228
+ }, delay );
229
+ }) :
230
+ orig.apply( this, arguments );
231
+ };
232
+ })( $.fn.focus ),
233
+
234
+ disableSelection: (function() {
235
+ var eventType = "onselectstart" in document.createElement( "div" ) ?
236
+ "selectstart" :
237
+ "mousedown";
238
+
239
+ return function() {
240
+ return this.bind( eventType + ".ui-disableSelection", function( event ) {
241
+ event.preventDefault();
242
+ });
243
+ };
244
+ })(),
245
+
246
+ enableSelection: function() {
247
+ return this.unbind( ".ui-disableSelection" );
248
+ },
249
+
250
+ zIndex: function( zIndex ) {
251
+ if ( zIndex !== undefined ) {
252
+ return this.css( "zIndex", zIndex );
253
+ }
254
+
255
+ if ( this.length ) {
256
+ var elem = $( this[ 0 ] ), position, value;
257
+ while ( elem.length && elem[ 0 ] !== document ) {
258
+ // Ignore z-index if position is set to a value where z-index is ignored by the browser
259
+ // This makes behavior of this function consistent across browsers
260
+ // WebKit always returns auto if the element is positioned
261
+ position = elem.css( "position" );
262
+ if ( position === "absolute" || position === "relative" || position === "fixed" ) {
263
+ // IE returns 0 when zIndex is not specified
264
+ // other browsers return a string
265
+ // we ignore the case of nested elements with an explicit value of 0
266
+ // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
267
+ value = parseInt( elem.css( "zIndex" ), 10 );
268
+ if ( !isNaN( value ) && value !== 0 ) {
269
+ return value;
270
+ }
271
+ }
272
+ elem = elem.parent();
273
+ }
274
+ }
275
+
276
+ return 0;
277
+ }
278
+ });
279
+
280
+ // $.ui.plugin is deprecated. Use $.widget() extensions instead.
281
+ $.ui.plugin = {
282
+ add: function( module, option, set ) {
283
+ var i,
284
+ proto = $.ui[ module ].prototype;
285
+ for ( i in set ) {
286
+ proto.plugins[ i ] = proto.plugins[ i ] || [];
287
+ proto.plugins[ i ].push( [ option, set[ i ] ] );
288
+ }
289
+ },
290
+ call: function( instance, name, args, allowDisconnected ) {
291
+ var i,
292
+ set = instance.plugins[ name ];
293
+
294
+ if ( !set ) {
295
+ return;
296
+ }
297
+
298
+ if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) ) {
299
+ return;
300
+ }
301
+
302
+ for ( i = 0; i < set.length; i++ ) {
303
+ if ( instance.options[ set[ i ][ 0 ] ] ) {
304
+ set[ i ][ 1 ].apply( instance.element, args );
305
+ }
306
+ }
307
+ }
308
+ };
309
+
310
+
311
+ /*!
312
+ * jQuery UI Widget 1.11.4
313
+ * http://jqueryui.com
314
+ *
315
+ * Copyright jQuery Foundation and other contributors
316
+ * Released under the MIT license.
317
+ * http://jquery.org/license
318
+ *
319
+ * http://api.jqueryui.com/jQuery.widget/
320
+ */
321
+
322
+
323
+ var widget_uuid = 0,
324
+ widget_slice = Array.prototype.slice;
325
+
326
+ $.cleanData = (function( orig ) {
327
+ return function( elems ) {
328
+ var events, elem, i;
329
+ for ( i = 0; (elem = elems[i]) != null; i++ ) {
330
+ try {
331
+
332
+ // Only trigger remove when necessary to save time
333
+ events = $._data( elem, "events" );
334
+ if ( events && events.remove ) {
335
+ $( elem ).triggerHandler( "remove" );
336
+ }
337
+
338
+ // http://bugs.jquery.com/ticket/8235
339
+ } catch ( e ) {}
340
+ }
341
+ orig( elems );
342
+ };
343
+ })( $.cleanData );
344
+
345
+ $.widget = function( name, base, prototype ) {
346
+ var fullName, existingConstructor, constructor, basePrototype,
347
+ // proxiedPrototype allows the provided prototype to remain unmodified
348
+ // so that it can be used as a mixin for multiple widgets (#8876)
349
+ proxiedPrototype = {},
350
+ namespace = name.split( "." )[ 0 ];
351
+
352
+ name = name.split( "." )[ 1 ];
353
+ fullName = namespace + "-" + name;
354
+
355
+ if ( !prototype ) {
356
+ prototype = base;
357
+ base = $.Widget;
358
+ }
359
+
360
+ // create selector for plugin
361
+ $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
362
+ return !!$.data( elem, fullName );
363
+ };
364
+
365
+ $[ namespace ] = $[ namespace ] || {};
366
+ existingConstructor = $[ namespace ][ name ];
367
+ constructor = $[ namespace ][ name ] = function( options, element ) {
368
+ // allow instantiation without "new" keyword
369
+ if ( !this._createWidget ) {
370
+ return new constructor( options, element );
371
+ }
372
+
373
+ // allow instantiation without initializing for simple inheritance
374
+ // must use "new" keyword (the code above always passes args)
375
+ if ( arguments.length ) {
376
+ this._createWidget( options, element );
377
+ }
378
+ };
379
+ // extend with the existing constructor to carry over any static properties
380
+ $.extend( constructor, existingConstructor, {
381
+ version: prototype.version,
382
+ // copy the object used to create the prototype in case we need to
383
+ // redefine the widget later
384
+ _proto: $.extend( {}, prototype ),
385
+ // track widgets that inherit from this widget in case this widget is
386
+ // redefined after a widget inherits from it
387
+ _childConstructors: []
388
+ });
389
+
390
+ basePrototype = new base();
391
+ // we need to make the options hash a property directly on the new instance
392
+ // otherwise we'll modify the options hash on the prototype that we're
393
+ // inheriting from
394
+ basePrototype.options = $.widget.extend( {}, basePrototype.options );
395
+ $.each( prototype, function( prop, value ) {
396
+ if ( !$.isFunction( value ) ) {
397
+ proxiedPrototype[ prop ] = value;
398
+ return;
399
+ }
400
+ proxiedPrototype[ prop ] = (function() {
401
+ var _super = function() {
402
+ return base.prototype[ prop ].apply( this, arguments );
403
+ },
404
+ _superApply = function( args ) {
405
+ return base.prototype[ prop ].apply( this, args );
406
+ };
407
+ return function() {
408
+ var __super = this._super,
409
+ __superApply = this._superApply,
410
+ returnValue;
411
+
412
+ this._super = _super;
413
+ this._superApply = _superApply;
414
+
415
+ returnValue = value.apply( this, arguments );
416
+
417
+ this._super = __super;
418
+ this._superApply = __superApply;
419
+
420
+ return returnValue;
421
+ };
422
+ })();
423
+ });
424
+ constructor.prototype = $.widget.extend( basePrototype, {
425
+ // TODO: remove support for widgetEventPrefix
426
+ // always use the name + a colon as the prefix, e.g., draggable:start
427
+ // don't prefix for widgets that aren't DOM-based
428
+ widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name
429
+ }, proxiedPrototype, {
430
+ constructor: constructor,
431
+ namespace: namespace,
432
+ widgetName: name,
433
+ widgetFullName: fullName
434
+ });
435
+
436
+ // If this widget is being redefined then we need to find all widgets that
437
+ // are inheriting from it and redefine all of them so that they inherit from
438
+ // the new version of this widget. We're essentially trying to replace one
439
+ // level in the prototype chain.
440
+ if ( existingConstructor ) {
441
+ $.each( existingConstructor._childConstructors, function( i, child ) {
442
+ var childPrototype = child.prototype;
443
+
444
+ // redefine the child widget using the same prototype that was
445
+ // originally used, but inherit from the new version of the base
446
+ $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
447
+ });
448
+ // remove the list of existing child constructors from the old constructor
449
+ // so the old child constructors can be garbage collected
450
+ delete existingConstructor._childConstructors;
451
+ } else {
452
+ base._childConstructors.push( constructor );
453
+ }
454
+
455
+ $.widget.bridge( name, constructor );
456
+
457
+ return constructor;
458
+ };
459
+
460
+ $.widget.extend = function( target ) {
461
+ var input = widget_slice.call( arguments, 1 ),
462
+ inputIndex = 0,
463
+ inputLength = input.length,
464
+ key,
465
+ value;
466
+ for ( ; inputIndex < inputLength; inputIndex++ ) {
467
+ for ( key in input[ inputIndex ] ) {
468
+ value = input[ inputIndex ][ key ];
469
+ if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
470
+ // Clone objects
471
+ if ( $.isPlainObject( value ) ) {
472
+ target[ key ] = $.isPlainObject( target[ key ] ) ?
473
+ $.widget.extend( {}, target[ key ], value ) :
474
+ // Don't extend strings, arrays, etc. with objects
475
+ $.widget.extend( {}, value );
476
+ // Copy everything else by reference
477
+ } else {
478
+ target[ key ] = value;
479
+ }
480
+ }
481
+ }
482
+ }
483
+ return target;
484
+ };
485
+
486
+ $.widget.bridge = function( name, object ) {
487
+ var fullName = object.prototype.widgetFullName || name;
488
+ $.fn[ name ] = function( options ) {
489
+ var isMethodCall = typeof options === "string",
490
+ args = widget_slice.call( arguments, 1 ),
491
+ returnValue = this;
492
+
493
+ if ( isMethodCall ) {
494
+ this.each(function() {
495
+ var methodValue,
496
+ instance = $.data( this, fullName );
497
+ if ( options === "instance" ) {
498
+ returnValue = instance;
499
+ return false;
500
+ }
501
+ if ( !instance ) {
502
+ return $.error( "cannot call methods on " + name + " prior to initialization; " +
503
+ "attempted to call method '" + options + "'" );
504
+ }
505
+ if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
506
+ return $.error( "no such method '" + options + "' for " + name + " widget instance" );
507
+ }
508
+ methodValue = instance[ options ].apply( instance, args );
509
+ if ( methodValue !== instance && methodValue !== undefined ) {
510
+ returnValue = methodValue && methodValue.jquery ?
511
+ returnValue.pushStack( methodValue.get() ) :
512
+ methodValue;
513
+ return false;
514
+ }
515
+ });
516
+ } else {
517
+
518
+ // Allow multiple hashes to be passed on init
519
+ if ( args.length ) {
520
+ options = $.widget.extend.apply( null, [ options ].concat(args) );
521
+ }
522
+
523
+ this.each(function() {
524
+ var instance = $.data( this, fullName );
525
+ if ( instance ) {
526
+ instance.option( options || {} );
527
+ if ( instance._init ) {
528
+ instance._init();
529
+ }
530
+ } else {
531
+ $.data( this, fullName, new object( options, this ) );
532
+ }
533
+ });
534
+ }
535
+
536
+ return returnValue;
537
+ };
538
+ };
539
+
540
+ $.Widget = function( /* options, element */ ) {};
541
+ $.Widget._childConstructors = [];
542
+
543
+ $.Widget.prototype = {
544
+ widgetName: "widget",
545
+ widgetEventPrefix: "",
546
+ defaultElement: "<div>",
547
+ options: {
548
+ disabled: false,
549
+
550
+ // callbacks
551
+ create: null
552
+ },
553
+ _createWidget: function( options, element ) {
554
+ element = $( element || this.defaultElement || this )[ 0 ];
555
+ this.element = $( element );
556
+ this.uuid = widget_uuid++;
557
+ this.eventNamespace = "." + this.widgetName + this.uuid;
558
+
559
+ this.bindings = $();
560
+ this.hoverable = $();
561
+ this.focusable = $();
562
+
563
+ if ( element !== this ) {
564
+ $.data( element, this.widgetFullName, this );
565
+ this._on( true, this.element, {
566
+ remove: function( event ) {
567
+ if ( event.target === element ) {
568
+ this.destroy();
569
+ }
570
+ }
571
+ });
572
+ this.document = $( element.style ?
573
+ // element within the document
574
+ element.ownerDocument :
575
+ // element is window or document
576
+ element.document || element );
577
+ this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
578
+ }
579
+
580
+ this.options = $.widget.extend( {},
581
+ this.options,
582
+ this._getCreateOptions(),
583
+ options );
584
+
585
+ this._create();
586
+ this._trigger( "create", null, this._getCreateEventData() );
587
+ this._init();
588
+ },
589
+ _getCreateOptions: $.noop,
590
+ _getCreateEventData: $.noop,
591
+ _create: $.noop,
592
+ _init: $.noop,
593
+
594
+ destroy: function() {
595
+ this._destroy();
596
+ // we can probably remove the unbind calls in 2.0
597
+ // all event bindings should go through this._on()
598
+ this.element
599
+ .unbind( this.eventNamespace )
600
+ .removeData( this.widgetFullName )
601
+ // support: jquery <1.6.3
602
+ // http://bugs.jquery.com/ticket/9413
603
+ .removeData( $.camelCase( this.widgetFullName ) );
604
+ this.widget()
605
+ .unbind( this.eventNamespace )
606
+ .removeAttr( "aria-disabled" )
607
+ .removeClass(
608
+ this.widgetFullName + "-disabled " +
609
+ "ui-state-disabled" );
610
+
611
+ // clean up events and states
612
+ this.bindings.unbind( this.eventNamespace );
613
+ this.hoverable.removeClass( "ui-state-hover" );
614
+ this.focusable.removeClass( "ui-state-focus" );
615
+ },
616
+ _destroy: $.noop,
617
+
618
+ widget: function() {
619
+ return this.element;
620
+ },
621
+
622
+ option: function( key, value ) {
623
+ var options = key,
624
+ parts,
625
+ curOption,
626
+ i;
627
+
628
+ if ( arguments.length === 0 ) {
629
+ // don't return a reference to the internal hash
630
+ return $.widget.extend( {}, this.options );
631
+ }
632
+
633
+ if ( typeof key === "string" ) {
634
+ // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
635
+ options = {};
636
+ parts = key.split( "." );
637
+ key = parts.shift();
638
+ if ( parts.length ) {
639
+ curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
640
+ for ( i = 0; i < parts.length - 1; i++ ) {
641
+ curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
642
+ curOption = curOption[ parts[ i ] ];
643
+ }
644
+ key = parts.pop();
645
+ if ( arguments.length === 1 ) {
646
+ return curOption[ key ] === undefined ? null : curOption[ key ];
647
+ }
648
+ curOption[ key ] = value;
649
+ } else {
650
+ if ( arguments.length === 1 ) {
651
+ return this.options[ key ] === undefined ? null : this.options[ key ];
652
+ }
653
+ options[ key ] = value;
654
+ }
655
+ }
656
+
657
+ this._setOptions( options );
658
+
659
+ return this;
660
+ },
661
+ _setOptions: function( options ) {
662
+ var key;
663
+
664
+ for ( key in options ) {
665
+ this._setOption( key, options[ key ] );
666
+ }
667
+
668
+ return this;
669
+ },
670
+ _setOption: function( key, value ) {
671
+ this.options[ key ] = value;
672
+
673
+ if ( key === "disabled" ) {
674
+ this.widget()
675
+ .toggleClass( this.widgetFullName + "-disabled", !!value );
676
+
677
+ // If the widget is becoming disabled, then nothing is interactive
678
+ if ( value ) {
679
+ this.hoverable.removeClass( "ui-state-hover" );
680
+ this.focusable.removeClass( "ui-state-focus" );
681
+ }
682
+ }
683
+
684
+ return this;
685
+ },
686
+
687
+ enable: function() {
688
+ return this._setOptions({ disabled: false });
689
+ },
690
+ disable: function() {
691
+ return this._setOptions({ disabled: true });
692
+ },
693
+
694
+ _on: function( suppressDisabledCheck, element, handlers ) {
695
+ var delegateElement,
696
+ instance = this;
697
+
698
+ // no suppressDisabledCheck flag, shuffle arguments
699
+ if ( typeof suppressDisabledCheck !== "boolean" ) {
700
+ handlers = element;
701
+ element = suppressDisabledCheck;
702
+ suppressDisabledCheck = false;
703
+ }
704
+
705
+ // no element argument, shuffle and use this.element
706
+ if ( !handlers ) {
707
+ handlers = element;
708
+ element = this.element;
709
+ delegateElement = this.widget();
710
+ } else {
711
+ element = delegateElement = $( element );
712
+ this.bindings = this.bindings.add( element );
713
+ }
714
+
715
+ $.each( handlers, function( event, handler ) {
716
+ function handlerProxy() {
717
+ // allow widgets to customize the disabled handling
718
+ // - disabled as an array instead of boolean
719
+ // - disabled class as method for disabling individual parts
720
+ if ( !suppressDisabledCheck &&
721
+ ( instance.options.disabled === true ||
722
+ $( this ).hasClass( "ui-state-disabled" ) ) ) {
723
+ return;
724
+ }
725
+ return ( typeof handler === "string" ? instance[ handler ] : handler )
726
+ .apply( instance, arguments );
727
+ }
728
+
729
+ // copy the guid so direct unbinding works
730
+ if ( typeof handler !== "string" ) {
731
+ handlerProxy.guid = handler.guid =
732
+ handler.guid || handlerProxy.guid || $.guid++;
733
+ }
734
+
735
+ var match = event.match( /^([\w:-]*)\s*(.*)$/ ),
736
+ eventName = match[1] + instance.eventNamespace,
737
+ selector = match[2];
738
+ if ( selector ) {
739
+ delegateElement.delegate( selector, eventName, handlerProxy );
740
+ } else {
741
+ element.bind( eventName, handlerProxy );
742
+ }
743
+ });
744
+ },
745
+
746
+ _off: function( element, eventName ) {
747
+ eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) +
748
+ this.eventNamespace;
749
+ element.unbind( eventName ).undelegate( eventName );
750
+
751
+ // Clear the stack to avoid memory leaks (#10056)
752
+ this.bindings = $( this.bindings.not( element ).get() );
753
+ this.focusable = $( this.focusable.not( element ).get() );
754
+ this.hoverable = $( this.hoverable.not( element ).get() );
755
+ },
756
+
757
+ _delay: function( handler, delay ) {
758
+ function handlerProxy() {
759
+ return ( typeof handler === "string" ? instance[ handler ] : handler )
760
+ .apply( instance, arguments );
761
+ }
762
+ var instance = this;
763
+ return setTimeout( handlerProxy, delay || 0 );
764
+ },
765
+
766
+ _hoverable: function( element ) {
767
+ this.hoverable = this.hoverable.add( element );
768
+ this._on( element, {
769
+ mouseenter: function( event ) {
770
+ $( event.currentTarget ).addClass( "ui-state-hover" );
771
+ },
772
+ mouseleave: function( event ) {
773
+ $( event.currentTarget ).removeClass( "ui-state-hover" );
774
+ }
775
+ });
776
+ },
777
+
778
+ _focusable: function( element ) {
779
+ this.focusable = this.focusable.add( element );
780
+ this._on( element, {
781
+ focusin: function( event ) {
782
+ $( event.currentTarget ).addClass( "ui-state-focus" );
783
+ },
784
+ focusout: function( event ) {
785
+ $( event.currentTarget ).removeClass( "ui-state-focus" );
786
+ }
787
+ });
788
+ },
789
+
790
+ _trigger: function( type, event, data ) {
791
+ var prop, orig,
792
+ callback = this.options[ type ];
793
+
794
+ data = data || {};
795
+ event = $.Event( event );
796
+ event.type = ( type === this.widgetEventPrefix ?
797
+ type :
798
+ this.widgetEventPrefix + type ).toLowerCase();
799
+ // the original event may come from any element
800
+ // so we need to reset the target on the new event
801
+ event.target = this.element[ 0 ];
802
+
803
+ // copy original event properties over to the new event
804
+ orig = event.originalEvent;
805
+ if ( orig ) {
806
+ for ( prop in orig ) {
807
+ if ( !( prop in event ) ) {
808
+ event[ prop ] = orig[ prop ];
809
+ }
810
+ }
811
+ }
812
+
813
+ this.element.trigger( event, data );
814
+ return !( $.isFunction( callback ) &&
815
+ callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
816
+ event.isDefaultPrevented() );
817
+ }
818
+ };
819
+
820
+ $.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
821
+ $.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
822
+ if ( typeof options === "string" ) {
823
+ options = { effect: options };
824
+ }
825
+ var hasOptions,
826
+ effectName = !options ?
827
+ method :
828
+ options === true || typeof options === "number" ?
829
+ defaultEffect :
830
+ options.effect || defaultEffect;
831
+ options = options || {};
832
+ if ( typeof options === "number" ) {
833
+ options = { duration: options };
834
+ }
835
+ hasOptions = !$.isEmptyObject( options );
836
+ options.complete = callback;
837
+ if ( options.delay ) {
838
+ element.delay( options.delay );
839
+ }
840
+ if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
841
+ element[ method ]( options );
842
+ } else if ( effectName !== method && element[ effectName ] ) {
843
+ element[ effectName ]( options.duration, options.easing, callback );
844
+ } else {
845
+ element.queue(function( next ) {
846
+ $( this )[ method ]();
847
+ if ( callback ) {
848
+ callback.call( element[ 0 ] );
849
+ }
850
+ next();
851
+ });
852
+ }
853
+ };
854
+ });
855
+
856
+ var widget = $.widget;
857
+
858
+
859
+ /*!
860
+ * jQuery UI Mouse 1.11.4
861
+ * http://jqueryui.com
862
+ *
863
+ * Copyright jQuery Foundation and other contributors
864
+ * Released under the MIT license.
865
+ * http://jquery.org/license
866
+ *
867
+ * http://api.jqueryui.com/mouse/
868
+ */
869
+
870
+
871
+ var mouseHandled = false;
872
+ $( document ).mouseup( function() {
873
+ mouseHandled = false;
874
+ });
875
+
876
+ var mouse = $.widget("ui.mouse", {
877
+ version: "1.11.4",
878
+ options: {
879
+ cancel: "input,textarea,button,select,option",
880
+ distance: 1,
881
+ delay: 0
882
+ },
883
+ _mouseInit: function() {
884
+ var that = this;
885
+
886
+ this.element
887
+ .bind("mousedown." + this.widgetName, function(event) {
888
+ return that._mouseDown(event);
889
+ })
890
+ .bind("click." + this.widgetName, function(event) {
891
+ if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) {
892
+ $.removeData(event.target, that.widgetName + ".preventClickEvent");
893
+ event.stopImmediatePropagation();
894
+ return false;
895
+ }
896
+ });
897
+
898
+ this.started = false;
899
+ },
900
+
901
+ // TODO: make sure destroying one instance of mouse doesn't mess with
902
+ // other instances of mouse
903
+ _mouseDestroy: function() {
904
+ this.element.unbind("." + this.widgetName);
905
+ if ( this._mouseMoveDelegate ) {
906
+ this.document
907
+ .unbind("mousemove." + this.widgetName, this._mouseMoveDelegate)
908
+ .unbind("mouseup." + this.widgetName, this._mouseUpDelegate);
909
+ }
910
+ },
911
+
912
+ _mouseDown: function(event) {
913
+ // don't let more than one widget handle mouseStart
914
+ if ( mouseHandled ) {
915
+ return;
916
+ }
917
+
918
+ this._mouseMoved = false;
919
+
920
+ // we may have missed mouseup (out of window)
921
+ (this._mouseStarted && this._mouseUp(event));
922
+
923
+ this._mouseDownEvent = event;
924
+
925
+ var that = this,
926
+ btnIsLeft = (event.which === 1),
927
+ // event.target.nodeName works around a bug in IE 8 with
928
+ // disabled inputs (#7620)
929
+ elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
930
+ if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
931
+ return true;
932
+ }
933
+
934
+ this.mouseDelayMet = !this.options.delay;
935
+ if (!this.mouseDelayMet) {
936
+ this._mouseDelayTimer = setTimeout(function() {
937
+ that.mouseDelayMet = true;
938
+ }, this.options.delay);
939
+ }
940
+
941
+ if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
942
+ this._mouseStarted = (this._mouseStart(event) !== false);
943
+ if (!this._mouseStarted) {
944
+ event.preventDefault();
945
+ return true;
946
+ }
947
+ }
948
+
949
+ // Click event may never have fired (Gecko & Opera)
950
+ if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) {
951
+ $.removeData(event.target, this.widgetName + ".preventClickEvent");
952
+ }
953
+
954
+ // these delegates are required to keep context
955
+ this._mouseMoveDelegate = function(event) {
956
+ return that._mouseMove(event);
957
+ };
958
+ this._mouseUpDelegate = function(event) {
959
+ return that._mouseUp(event);
960
+ };
961
+
962
+ this.document
963
+ .bind( "mousemove." + this.widgetName, this._mouseMoveDelegate )
964
+ .bind( "mouseup." + this.widgetName, this._mouseUpDelegate );
965
+
966
+ event.preventDefault();
967
+
968
+ mouseHandled = true;
969
+ return true;
970
+ },
971
+
972
+ _mouseMove: function(event) {
973
+ // Only check for mouseups outside the document if you've moved inside the document
974
+ // at least once. This prevents the firing of mouseup in the case of IE<9, which will
975
+ // fire a mousemove event if content is placed under the cursor. See #7778
976
+ // Support: IE <9
977
+ if ( this._mouseMoved ) {
978
+ // IE mouseup check - mouseup happened when mouse was out of window
979
+ if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) {
980
+ return this._mouseUp(event);
981
+
982
+ // Iframe mouseup check - mouseup occurred in another document
983
+ } else if ( !event.which ) {
984
+ return this._mouseUp( event );
985
+ }
986
+ }
987
+
988
+ if ( event.which || event.button ) {
989
+ this._mouseMoved = true;
990
+ }
991
+
992
+ if (this._mouseStarted) {
993
+ this._mouseDrag(event);
994
+ return event.preventDefault();
995
+ }
996
+
997
+ if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
998
+ this._mouseStarted =
999
+ (this._mouseStart(this._mouseDownEvent, event) !== false);
1000
+ (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
1001
+ }
1002
+
1003
+ return !this._mouseStarted;
1004
+ },
1005
+
1006
+ _mouseUp: function(event) {
1007
+ this.document
1008
+ .unbind( "mousemove." + this.widgetName, this._mouseMoveDelegate )
1009
+ .unbind( "mouseup." + this.widgetName, this._mouseUpDelegate );
1010
+
1011
+ if (this._mouseStarted) {
1012
+ this._mouseStarted = false;
1013
+
1014
+ if (event.target === this._mouseDownEvent.target) {
1015
+ $.data(event.target, this.widgetName + ".preventClickEvent", true);
1016
+ }
1017
+
1018
+ this._mouseStop(event);
1019
+ }
1020
+
1021
+ mouseHandled = false;
1022
+ return false;
1023
+ },
1024
+
1025
+ _mouseDistanceMet: function(event) {
1026
+ return (Math.max(
1027
+ Math.abs(this._mouseDownEvent.pageX - event.pageX),
1028
+ Math.abs(this._mouseDownEvent.pageY - event.pageY)
1029
+ ) >= this.options.distance
1030
+ );
1031
+ },
1032
+
1033
+ _mouseDelayMet: function(/* event */) {
1034
+ return this.mouseDelayMet;
1035
+ },
1036
+
1037
+ // These are placeholder methods, to be overriden by extending plugin
1038
+ _mouseStart: function(/* event */) {},
1039
+ _mouseDrag: function(/* event */) {},
1040
+ _mouseStop: function(/* event */) {},
1041
+ _mouseCapture: function(/* event */) { return true; }
1042
+ });
1043
+
1044
+
1045
+ /*!
1046
+ * jQuery UI Position 1.11.4
1047
+ * http://jqueryui.com
1048
+ *
1049
+ * Copyright jQuery Foundation and other contributors
1050
+ * Released under the MIT license.
1051
+ * http://jquery.org/license
1052
+ *
1053
+ * http://api.jqueryui.com/position/
1054
+ */
1055
+
1056
+ (function() {
1057
+
1058
+ $.ui = $.ui || {};
1059
+
1060
+ var cachedScrollbarWidth, supportsOffsetFractions,
1061
+ max = Math.max,
1062
+ abs = Math.abs,
1063
+ round = Math.round,
1064
+ rhorizontal = /left|center|right/,
1065
+ rvertical = /top|center|bottom/,
1066
+ roffset = /[\+\-]\d+(\.[\d]+)?%?/,
1067
+ rposition = /^\w+/,
1068
+ rpercent = /%$/,
1069
+ _position = $.fn.position;
1070
+
1071
+ function getOffsets( offsets, width, height ) {
1072
+ return [
1073
+ parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
1074
+ parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
1075
+ ];
1076
+ }
1077
+
1078
+ function parseCss( element, property ) {
1079
+ return parseInt( $.css( element, property ), 10 ) || 0;
1080
+ }
1081
+
1082
+ function getDimensions( elem ) {
1083
+ var raw = elem[0];
1084
+ if ( raw.nodeType === 9 ) {
1085
+ return {
1086
+ width: elem.width(),
1087
+ height: elem.height(),
1088
+ offset: { top: 0, left: 0 }
1089
+ };
1090
+ }
1091
+ if ( $.isWindow( raw ) ) {
1092
+ return {
1093
+ width: elem.width(),
1094
+ height: elem.height(),
1095
+ offset: { top: elem.scrollTop(), left: elem.scrollLeft() }
1096
+ };
1097
+ }
1098
+ if ( raw.preventDefault ) {
1099
+ return {
1100
+ width: 0,
1101
+ height: 0,
1102
+ offset: { top: raw.pageY, left: raw.pageX }
1103
+ };
1104
+ }
1105
+ return {
1106
+ width: elem.outerWidth(),
1107
+ height: elem.outerHeight(),
1108
+ offset: elem.offset()
1109
+ };
1110
+ }
1111
+
1112
+ $.position = {
1113
+ scrollbarWidth: function() {
1114
+ if ( cachedScrollbarWidth !== undefined ) {
1115
+ return cachedScrollbarWidth;
1116
+ }
1117
+ var w1, w2,
1118
+ div = $( "<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>" ),
1119
+ innerDiv = div.children()[0];
1120
+
1121
+ $( "body" ).append( div );
1122
+ w1 = innerDiv.offsetWidth;
1123
+ div.css( "overflow", "scroll" );
1124
+
1125
+ w2 = innerDiv.offsetWidth;
1126
+
1127
+ if ( w1 === w2 ) {
1128
+ w2 = div[0].clientWidth;
1129
+ }
1130
+
1131
+ div.remove();
1132
+
1133
+ return (cachedScrollbarWidth = w1 - w2);
1134
+ },
1135
+ getScrollInfo: function( within ) {
1136
+ var overflowX = within.isWindow || within.isDocument ? "" :
1137
+ within.element.css( "overflow-x" ),
1138
+ overflowY = within.isWindow || within.isDocument ? "" :
1139
+ within.element.css( "overflow-y" ),
1140
+ hasOverflowX = overflowX === "scroll" ||
1141
+ ( overflowX === "auto" && within.width < within.element[0].scrollWidth ),
1142
+ hasOverflowY = overflowY === "scroll" ||
1143
+ ( overflowY === "auto" && within.height < within.element[0].scrollHeight );
1144
+ return {
1145
+ width: hasOverflowY ? $.position.scrollbarWidth() : 0,
1146
+ height: hasOverflowX ? $.position.scrollbarWidth() : 0
1147
+ };
1148
+ },
1149
+ getWithinInfo: function( element ) {
1150
+ var withinElement = $( element || window ),
1151
+ isWindow = $.isWindow( withinElement[0] ),
1152
+ isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9;
1153
+ return {
1154
+ element: withinElement,
1155
+ isWindow: isWindow,
1156
+ isDocument: isDocument,
1157
+ offset: withinElement.offset() || { left: 0, top: 0 },
1158
+ scrollLeft: withinElement.scrollLeft(),
1159
+ scrollTop: withinElement.scrollTop(),
1160
+
1161
+ // support: jQuery 1.6.x
1162
+ // jQuery 1.6 doesn't support .outerWidth/Height() on documents or windows
1163
+ width: isWindow || isDocument ? withinElement.width() : withinElement.outerWidth(),
1164
+ height: isWindow || isDocument ? withinElement.height() : withinElement.outerHeight()
1165
+ };
1166
+ }
1167
+ };
1168
+
1169
+ $.fn.position = function( options ) {
1170
+ if ( !options || !options.of ) {
1171
+ return _position.apply( this, arguments );
1172
+ }
1173
+
1174
+ // make a copy, we don't want to modify arguments
1175
+ options = $.extend( {}, options );
1176
+
1177
+ var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,
1178
+ target = $( options.of ),
1179
+ within = $.position.getWithinInfo( options.within ),
1180
+ scrollInfo = $.position.getScrollInfo( within ),
1181
+ collision = ( options.collision || "flip" ).split( " " ),
1182
+ offsets = {};
1183
+
1184
+ dimensions = getDimensions( target );
1185
+ if ( target[0].preventDefault ) {
1186
+ // force left top to allow flipping
1187
+ options.at = "left top";
1188
+ }
1189
+ targetWidth = dimensions.width;
1190
+ targetHeight = dimensions.height;
1191
+ targetOffset = dimensions.offset;
1192
+ // clone to reuse original targetOffset later
1193
+ basePosition = $.extend( {}, targetOffset );
1194
+
1195
+ // force my and at to have valid horizontal and vertical positions
1196
+ // if a value is missing or invalid, it will be converted to center
1197
+ $.each( [ "my", "at" ], function() {
1198
+ var pos = ( options[ this ] || "" ).split( " " ),
1199
+ horizontalOffset,
1200
+ verticalOffset;
1201
+
1202
+ if ( pos.length === 1) {
1203
+ pos = rhorizontal.test( pos[ 0 ] ) ?
1204
+ pos.concat( [ "center" ] ) :
1205
+ rvertical.test( pos[ 0 ] ) ?
1206
+ [ "center" ].concat( pos ) :
1207
+ [ "center", "center" ];
1208
+ }
1209
+ pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
1210
+ pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
1211
+
1212
+ // calculate offsets
1213
+ horizontalOffset = roffset.exec( pos[ 0 ] );
1214
+ verticalOffset = roffset.exec( pos[ 1 ] );
1215
+ offsets[ this ] = [
1216
+ horizontalOffset ? horizontalOffset[ 0 ] : 0,
1217
+ verticalOffset ? verticalOffset[ 0 ] : 0
1218
+ ];
1219
+
1220
+ // reduce to just the positions without the offsets
1221
+ options[ this ] = [
1222
+ rposition.exec( pos[ 0 ] )[ 0 ],
1223
+ rposition.exec( pos[ 1 ] )[ 0 ]
1224
+ ];
1225
+ });
1226
+
1227
+ // normalize collision option
1228
+ if ( collision.length === 1 ) {
1229
+ collision[ 1 ] = collision[ 0 ];
1230
+ }
1231
+
1232
+ if ( options.at[ 0 ] === "right" ) {
1233
+ basePosition.left += targetWidth;
1234
+ } else if ( options.at[ 0 ] === "center" ) {
1235
+ basePosition.left += targetWidth / 2;
1236
+ }
1237
+
1238
+ if ( options.at[ 1 ] === "bottom" ) {
1239
+ basePosition.top += targetHeight;
1240
+ } else if ( options.at[ 1 ] === "center" ) {
1241
+ basePosition.top += targetHeight / 2;
1242
+ }
1243
+
1244
+ atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
1245
+ basePosition.left += atOffset[ 0 ];
1246
+ basePosition.top += atOffset[ 1 ];
1247
+
1248
+ return this.each(function() {
1249
+ var collisionPosition, using,
1250
+ elem = $( this ),
1251
+ elemWidth = elem.outerWidth(),
1252
+ elemHeight = elem.outerHeight(),
1253
+ marginLeft = parseCss( this, "marginLeft" ),
1254
+ marginTop = parseCss( this, "marginTop" ),
1255
+ collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width,
1256
+ collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height,
1257
+ position = $.extend( {}, basePosition ),
1258
+ myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
1259
+
1260
+ if ( options.my[ 0 ] === "right" ) {
1261
+ position.left -= elemWidth;
1262
+ } else if ( options.my[ 0 ] === "center" ) {
1263
+ position.left -= elemWidth / 2;
1264
+ }
1265
+
1266
+ if ( options.my[ 1 ] === "bottom" ) {
1267
+ position.top -= elemHeight;
1268
+ } else if ( options.my[ 1 ] === "center" ) {
1269
+ position.top -= elemHeight / 2;
1270
+ }
1271
+
1272
+ position.left += myOffset[ 0 ];
1273
+ position.top += myOffset[ 1 ];
1274
+
1275
+ // if the browser doesn't support fractions, then round for consistent results
1276
+ if ( !supportsOffsetFractions ) {
1277
+ position.left = round( position.left );
1278
+ position.top = round( position.top );
1279
+ }
1280
+
1281
+ collisionPosition = {
1282
+ marginLeft: marginLeft,
1283
+ marginTop: marginTop
1284
+ };
1285
+
1286
+ $.each( [ "left", "top" ], function( i, dir ) {
1287
+ if ( $.ui.position[ collision[ i ] ] ) {
1288
+ $.ui.position[ collision[ i ] ][ dir ]( position, {
1289
+ targetWidth: targetWidth,
1290
+ targetHeight: targetHeight,
1291
+ elemWidth: elemWidth,
1292
+ elemHeight: elemHeight,
1293
+ collisionPosition: collisionPosition,
1294
+ collisionWidth: collisionWidth,
1295
+ collisionHeight: collisionHeight,
1296
+ offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
1297
+ my: options.my,
1298
+ at: options.at,
1299
+ within: within,
1300
+ elem: elem
1301
+ });
1302
+ }
1303
+ });
1304
+
1305
+ if ( options.using ) {
1306
+ // adds feedback as second argument to using callback, if present
1307
+ using = function( props ) {
1308
+ var left = targetOffset.left - position.left,
1309
+ right = left + targetWidth - elemWidth,
1310
+ top = targetOffset.top - position.top,
1311
+ bottom = top + targetHeight - elemHeight,
1312
+ feedback = {
1313
+ target: {
1314
+ element: target,
1315
+ left: targetOffset.left,
1316
+ top: targetOffset.top,
1317
+ width: targetWidth,
1318
+ height: targetHeight
1319
+ },
1320
+ element: {
1321
+ element: elem,
1322
+ left: position.left,
1323
+ top: position.top,
1324
+ width: elemWidth,
1325
+ height: elemHeight
1326
+ },
1327
+ horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
1328
+ vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
1329
+ };
1330
+ if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
1331
+ feedback.horizontal = "center";
1332
+ }
1333
+ if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
1334
+ feedback.vertical = "middle";
1335
+ }
1336
+ if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
1337
+ feedback.important = "horizontal";
1338
+ } else {
1339
+ feedback.important = "vertical";
1340
+ }
1341
+ options.using.call( this, props, feedback );
1342
+ };
1343
+ }
1344
+
1345
+ elem.offset( $.extend( position, { using: using } ) );
1346
+ });
1347
+ };
1348
+
1349
+ $.ui.position = {
1350
+ fit: {
1351
+ left: function( position, data ) {
1352
+ var within = data.within,
1353
+ withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
1354
+ outerWidth = within.width,
1355
+ collisionPosLeft = position.left - data.collisionPosition.marginLeft,
1356
+ overLeft = withinOffset - collisionPosLeft,
1357
+ overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
1358
+ newOverRight;
1359
+
1360
+ // element is wider than within
1361
+ if ( data.collisionWidth > outerWidth ) {
1362
+ // element is initially over the left side of within
1363
+ if ( overLeft > 0 && overRight <= 0 ) {
1364
+ newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset;
1365
+ position.left += overLeft - newOverRight;
1366
+ // element is initially over right side of within
1367
+ } else if ( overRight > 0 && overLeft <= 0 ) {
1368
+ position.left = withinOffset;
1369
+ // element is initially over both left and right sides of within
1370
+ } else {
1371
+ if ( overLeft > overRight ) {
1372
+ position.left = withinOffset + outerWidth - data.collisionWidth;
1373
+ } else {
1374
+ position.left = withinOffset;
1375
+ }
1376
+ }
1377
+ // too far left -> align with left edge
1378
+ } else if ( overLeft > 0 ) {
1379
+ position.left += overLeft;
1380
+ // too far right -> align with right edge
1381
+ } else if ( overRight > 0 ) {
1382
+ position.left -= overRight;
1383
+ // adjust based on position and margin
1384
+ } else {
1385
+ position.left = max( position.left - collisionPosLeft, position.left );
1386
+ }
1387
+ },
1388
+ top: function( position, data ) {
1389
+ var within = data.within,
1390
+ withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
1391
+ outerHeight = data.within.height,
1392
+ collisionPosTop = position.top - data.collisionPosition.marginTop,
1393
+ overTop = withinOffset - collisionPosTop,
1394
+ overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
1395
+ newOverBottom;
1396
+
1397
+ // element is taller than within
1398
+ if ( data.collisionHeight > outerHeight ) {
1399
+ // element is initially over the top of within
1400
+ if ( overTop > 0 && overBottom <= 0 ) {
1401
+ newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset;
1402
+ position.top += overTop - newOverBottom;
1403
+ // element is initially over bottom of within
1404
+ } else if ( overBottom > 0 && overTop <= 0 ) {
1405
+ position.top = withinOffset;
1406
+ // element is initially over both top and bottom of within
1407
+ } else {
1408
+ if ( overTop > overBottom ) {
1409
+ position.top = withinOffset + outerHeight - data.collisionHeight;
1410
+ } else {
1411
+ position.top = withinOffset;
1412
+ }
1413
+ }
1414
+ // too far up -> align with top
1415
+ } else if ( overTop > 0 ) {
1416
+ position.top += overTop;
1417
+ // too far down -> align with bottom edge
1418
+ } else if ( overBottom > 0 ) {
1419
+ position.top -= overBottom;
1420
+ // adjust based on position and margin
1421
+ } else {
1422
+ position.top = max( position.top - collisionPosTop, position.top );
1423
+ }
1424
+ }
1425
+ },
1426
+ flip: {
1427
+ left: function( position, data ) {
1428
+ var within = data.within,
1429
+ withinOffset = within.offset.left + within.scrollLeft,
1430
+ outerWidth = within.width,
1431
+ offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
1432
+ collisionPosLeft = position.left - data.collisionPosition.marginLeft,
1433
+ overLeft = collisionPosLeft - offsetLeft,
1434
+ overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
1435
+ myOffset = data.my[ 0 ] === "left" ?
1436
+ -data.elemWidth :
1437
+ data.my[ 0 ] === "right" ?
1438
+ data.elemWidth :
1439
+ 0,
1440
+ atOffset = data.at[ 0 ] === "left" ?
1441
+ data.targetWidth :
1442
+ data.at[ 0 ] === "right" ?
1443
+ -data.targetWidth :
1444
+ 0,
1445
+ offset = -2 * data.offset[ 0 ],
1446
+ newOverRight,
1447
+ newOverLeft;
1448
+
1449
+ if ( overLeft < 0 ) {
1450
+ newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset;
1451
+ if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
1452
+ position.left += myOffset + atOffset + offset;
1453
+ }
1454
+ } else if ( overRight > 0 ) {
1455
+ newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft;
1456
+ if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
1457
+ position.left += myOffset + atOffset + offset;
1458
+ }
1459
+ }
1460
+ },
1461
+ top: function( position, data ) {
1462
+ var within = data.within,
1463
+ withinOffset = within.offset.top + within.scrollTop,
1464
+ outerHeight = within.height,
1465
+ offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
1466
+ collisionPosTop = position.top - data.collisionPosition.marginTop,
1467
+ overTop = collisionPosTop - offsetTop,
1468
+ overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
1469
+ top = data.my[ 1 ] === "top",
1470
+ myOffset = top ?
1471
+ -data.elemHeight :
1472
+ data.my[ 1 ] === "bottom" ?
1473
+ data.elemHeight :
1474
+ 0,
1475
+ atOffset = data.at[ 1 ] === "top" ?
1476
+ data.targetHeight :
1477
+ data.at[ 1 ] === "bottom" ?
1478
+ -data.targetHeight :
1479
+ 0,
1480
+ offset = -2 * data.offset[ 1 ],
1481
+ newOverTop,
1482
+ newOverBottom;
1483
+ if ( overTop < 0 ) {
1484
+ newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset;
1485
+ if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) {
1486
+ position.top += myOffset + atOffset + offset;
1487
+ }
1488
+ } else if ( overBottom > 0 ) {
1489
+ newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop;
1490
+ if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) {
1491
+ position.top += myOffset + atOffset + offset;
1492
+ }
1493
+ }
1494
+ }
1495
+ },
1496
+ flipfit: {
1497
+ left: function() {
1498
+ $.ui.position.flip.left.apply( this, arguments );
1499
+ $.ui.position.fit.left.apply( this, arguments );
1500
+ },
1501
+ top: function() {
1502
+ $.ui.position.flip.top.apply( this, arguments );
1503
+ $.ui.position.fit.top.apply( this, arguments );
1504
+ }
1505
+ }
1506
+ };
1507
+
1508
+ // fraction support test
1509
+ (function() {
1510
+ var testElement, testElementParent, testElementStyle, offsetLeft, i,
1511
+ body = document.getElementsByTagName( "body" )[ 0 ],
1512
+ div = document.createElement( "div" );
1513
+
1514
+ //Create a "fake body" for testing based on method used in jQuery.support
1515
+ testElement = document.createElement( body ? "div" : "body" );
1516
+ testElementStyle = {
1517
+ visibility: "hidden",
1518
+ width: 0,
1519
+ height: 0,
1520
+ border: 0,
1521
+ margin: 0,
1522
+ background: "none"
1523
+ };
1524
+ if ( body ) {
1525
+ $.extend( testElementStyle, {
1526
+ position: "absolute",
1527
+ left: "-1000px",
1528
+ top: "-1000px"
1529
+ });
1530
+ }
1531
+ for ( i in testElementStyle ) {
1532
+ testElement.style[ i ] = testElementStyle[ i ];
1533
+ }
1534
+ testElement.appendChild( div );
1535
+ testElementParent = body || document.documentElement;
1536
+ testElementParent.insertBefore( testElement, testElementParent.firstChild );
1537
+
1538
+ div.style.cssText = "position: absolute; left: 10.7432222px;";
1539
+
1540
+ offsetLeft = $( div ).offset().left;
1541
+ supportsOffsetFractions = offsetLeft > 10 && offsetLeft < 11;
1542
+
1543
+ testElement.innerHTML = "";
1544
+ testElementParent.removeChild( testElement );
1545
+ })();
1546
+
1547
+ })();
1548
+
1549
+ var position = $.ui.position;
1550
+
1551
+
1552
+ /*!
1553
+ * jQuery UI Accordion 1.11.4
1554
+ * http://jqueryui.com
1555
+ *
1556
+ * Copyright jQuery Foundation and other contributors
1557
+ * Released under the MIT license.
1558
+ * http://jquery.org/license
1559
+ *
1560
+ * http://api.jqueryui.com/accordion/
1561
+ */
1562
+
1563
+
1564
+ var accordion = $.widget( "ui.accordion", {
1565
+ version: "1.11.4",
1566
+ options: {
1567
+ active: 0,
1568
+ animate: {},
1569
+ collapsible: false,
1570
+ event: "click",
1571
+ header: "> li > :first-child,> :not(li):even",
1572
+ heightStyle: "auto",
1573
+ icons: {
1574
+ activeHeader: "ui-icon-triangle-1-s",
1575
+ header: "ui-icon-triangle-1-e"
1576
+ },
1577
+
1578
+ // callbacks
1579
+ activate: null,
1580
+ beforeActivate: null
1581
+ },
1582
+
1583
+ hideProps: {
1584
+ borderTopWidth: "hide",
1585
+ borderBottomWidth: "hide",
1586
+ paddingTop: "hide",
1587
+ paddingBottom: "hide",
1588
+ height: "hide"
1589
+ },
1590
+
1591
+ showProps: {
1592
+ borderTopWidth: "show",
1593
+ borderBottomWidth: "show",
1594
+ paddingTop: "show",
1595
+ paddingBottom: "show",
1596
+ height: "show"
1597
+ },
1598
+
1599
+ _create: function() {
1600
+ var options = this.options;
1601
+ this.prevShow = this.prevHide = $();
1602
+ this.element.addClass( "ui-accordion ui-widget ui-helper-reset" )
1603
+ // ARIA
1604
+ .attr( "role", "tablist" );
1605
+
1606
+ // don't allow collapsible: false and active: false / null
1607
+ if ( !options.collapsible && (options.active === false || options.active == null) ) {
1608
+ options.active = 0;
1609
+ }
1610
+
1611
+ this._processPanels();
1612
+ // handle negative values
1613
+ if ( options.active < 0 ) {
1614
+ options.active += this.headers.length;
1615
+ }
1616
+ this._refresh();
1617
+ },
1618
+
1619
+ _getCreateEventData: function() {
1620
+ return {
1621
+ header: this.active,
1622
+ panel: !this.active.length ? $() : this.active.next()
1623
+ };
1624
+ },
1625
+
1626
+ _createIcons: function() {
1627
+ var icons = this.options.icons;
1628
+ if ( icons ) {
1629
+ $( "<span>" )
1630
+ .addClass( "ui-accordion-header-icon ui-icon " + icons.header )
1631
+ .prependTo( this.headers );
1632
+ this.active.children( ".ui-accordion-header-icon" )
1633
+ .removeClass( icons.header )
1634
+ .addClass( icons.activeHeader );
1635
+ this.headers.addClass( "ui-accordion-icons" );
1636
+ }
1637
+ },
1638
+
1639
+ _destroyIcons: function() {
1640
+ this.headers
1641
+ .removeClass( "ui-accordion-icons" )
1642
+ .children( ".ui-accordion-header-icon" )
1643
+ .remove();
1644
+ },
1645
+
1646
+ _destroy: function() {
1647
+ var contents;
1648
+
1649
+ // clean up main element
1650
+ this.element
1651
+ .removeClass( "ui-accordion ui-widget ui-helper-reset" )
1652
+ .removeAttr( "role" );
1653
+
1654
+ // clean up headers
1655
+ this.headers
1656
+ .removeClass( "ui-accordion-header ui-accordion-header-active ui-state-default " +
1657
+ "ui-corner-all ui-state-active ui-state-disabled ui-corner-top" )
1658
+ .removeAttr( "role" )
1659
+ .removeAttr( "aria-expanded" )
1660
+ .removeAttr( "aria-selected" )
1661
+ .removeAttr( "aria-controls" )
1662
+ .removeAttr( "tabIndex" )
1663
+ .removeUniqueId();
1664
+
1665
+ this._destroyIcons();
1666
+
1667
+ // clean up content panels
1668
+ contents = this.headers.next()
1669
+ .removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom " +
1670
+ "ui-accordion-content ui-accordion-content-active ui-state-disabled" )
1671
+ .css( "display", "" )
1672
+ .removeAttr( "role" )
1673
+ .removeAttr( "aria-hidden" )
1674
+ .removeAttr( "aria-labelledby" )
1675
+ .removeUniqueId();
1676
+
1677
+ if ( this.options.heightStyle !== "content" ) {
1678
+ contents.css( "height", "" );
1679
+ }
1680
+ },
1681
+
1682
+ _setOption: function( key, value ) {
1683
+ if ( key === "active" ) {
1684
+ // _activate() will handle invalid values and update this.options
1685
+ this._activate( value );
1686
+ return;
1687
+ }
1688
+
1689
+ if ( key === "event" ) {
1690
+ if ( this.options.event ) {
1691
+ this._off( this.headers, this.options.event );
1692
+ }
1693
+ this._setupEvents( value );
1694
+ }
1695
+
1696
+ this._super( key, value );
1697
+
1698
+ // setting collapsible: false while collapsed; open first panel
1699
+ if ( key === "collapsible" && !value && this.options.active === false ) {
1700
+ this._activate( 0 );
1701
+ }
1702
+
1703
+ if ( key === "icons" ) {
1704
+ this._destroyIcons();
1705
+ if ( value ) {
1706
+ this._createIcons();
1707
+ }
1708
+ }
1709
+
1710
+ // #5332 - opacity doesn't cascade to positioned elements in IE
1711
+ // so we need to add the disabled class to the headers and panels
1712
+ if ( key === "disabled" ) {
1713
+ this.element
1714
+ .toggleClass( "ui-state-disabled", !!value )
1715
+ .attr( "aria-disabled", value );
1716
+ this.headers.add( this.headers.next() )
1717
+ .toggleClass( "ui-state-disabled", !!value );
1718
+ }
1719
+ },
1720
+
1721
+ _keydown: function( event ) {
1722
+ if ( event.altKey || event.ctrlKey ) {
1723
+ return;
1724
+ }
1725
+
1726
+ var keyCode = $.ui.keyCode,
1727
+ length = this.headers.length,
1728
+ currentIndex = this.headers.index( event.target ),
1729
+ toFocus = false;
1730
+
1731
+ switch ( event.keyCode ) {
1732
+ case keyCode.RIGHT:
1733
+ case keyCode.DOWN:
1734
+ toFocus = this.headers[ ( currentIndex + 1 ) % length ];
1735
+ break;
1736
+ case keyCode.LEFT:
1737
+ case keyCode.UP:
1738
+ toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
1739
+ break;
1740
+ case keyCode.SPACE:
1741
+ case keyCode.ENTER:
1742
+ this._eventHandler( event );
1743
+ break;
1744
+ case keyCode.HOME:
1745
+ toFocus = this.headers[ 0 ];
1746
+ break;
1747
+ case keyCode.END:
1748
+ toFocus = this.headers[ length - 1 ];
1749
+ break;
1750
+ }
1751
+
1752
+ if ( toFocus ) {
1753
+ $( event.target ).attr( "tabIndex", -1 );
1754
+ $( toFocus ).attr( "tabIndex", 0 );
1755
+ toFocus.focus();
1756
+ event.preventDefault();
1757
+ }
1758
+ },
1759
+
1760
+ _panelKeyDown: function( event ) {
1761
+ if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {
1762
+ $( event.currentTarget ).prev().focus();
1763
+ }
1764
+ },
1765
+
1766
+ refresh: function() {
1767
+ var options = this.options;
1768
+ this._processPanels();
1769
+
1770
+ // was collapsed or no panel
1771
+ if ( ( options.active === false && options.collapsible === true ) || !this.headers.length ) {
1772
+ options.active = false;
1773
+ this.active = $();
1774
+ // active false only when collapsible is true
1775
+ } else if ( options.active === false ) {
1776
+ this._activate( 0 );
1777
+ // was active, but active panel is gone
1778
+ } else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
1779
+ // all remaining panel are disabled
1780
+ if ( this.headers.length === this.headers.find(".ui-state-disabled").length ) {
1781
+ options.active = false;
1782
+ this.active = $();
1783
+ // activate previous panel
1784
+ } else {
1785
+ this._activate( Math.max( 0, options.active - 1 ) );
1786
+ }
1787
+ // was active, active panel still exists
1788
+ } else {
1789
+ // make sure active index is correct
1790
+ options.active = this.headers.index( this.active );
1791
+ }
1792
+
1793
+ this._destroyIcons();
1794
+
1795
+ this._refresh();
1796
+ },
1797
+
1798
+ _processPanels: function() {
1799
+ var prevHeaders = this.headers,
1800
+ prevPanels = this.panels;
1801
+
1802
+ this.headers = this.element.find( this.options.header )
1803
+ .addClass( "ui-accordion-header ui-state-default ui-corner-all" );
1804
+
1805
+ this.panels = this.headers.next()
1806
+ .addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" )
1807
+ .filter( ":not(.ui-accordion-content-active)" )
1808
+ .hide();
1809
+
1810
+ // Avoid memory leaks (#10056)
1811
+ if ( prevPanels ) {
1812
+ this._off( prevHeaders.not( this.headers ) );
1813
+ this._off( prevPanels.not( this.panels ) );
1814
+ }
1815
+ },
1816
+
1817
+ _refresh: function() {
1818
+ var maxHeight,
1819
+ options = this.options,
1820
+ heightStyle = options.heightStyle,
1821
+ parent = this.element.parent();
1822
+
1823
+ this.active = this._findActive( options.active )
1824
+ .addClass( "ui-accordion-header-active ui-state-active ui-corner-top" )
1825
+ .removeClass( "ui-corner-all" );
1826
+ this.active.next()
1827
+ .addClass( "ui-accordion-content-active" )
1828
+ .show();
1829
+
1830
+ this.headers
1831
+ .attr( "role", "tab" )
1832
+ .each(function() {
1833
+ var header = $( this ),
1834
+ headerId = header.uniqueId().attr( "id" ),
1835
+ panel = header.next(),
1836
+ panelId = panel.uniqueId().attr( "id" );
1837
+ header.attr( "aria-controls", panelId );
1838
+ panel.attr( "aria-labelledby", headerId );
1839
+ })
1840
+ .next()
1841
+ .attr( "role", "tabpanel" );
1842
+
1843
+ this.headers
1844
+ .not( this.active )
1845
+ .attr({
1846
+ "aria-selected": "false",
1847
+ "aria-expanded": "false",
1848
+ tabIndex: -1
1849
+ })
1850
+ .next()
1851
+ .attr({
1852
+ "aria-hidden": "true"
1853
+ })
1854
+ .hide();
1855
+
1856
+ // make sure at least one header is in the tab order
1857
+ if ( !this.active.length ) {
1858
+ this.headers.eq( 0 ).attr( "tabIndex", 0 );
1859
+ } else {
1860
+ this.active.attr({
1861
+ "aria-selected": "true",
1862
+ "aria-expanded": "true",
1863
+ tabIndex: 0
1864
+ })
1865
+ .next()
1866
+ .attr({
1867
+ "aria-hidden": "false"
1868
+ });
1869
+ }
1870
+
1871
+ this._createIcons();
1872
+
1873
+ this._setupEvents( options.event );
1874
+
1875
+ if ( heightStyle === "fill" ) {
1876
+ maxHeight = parent.height();
1877
+ this.element.siblings( ":visible" ).each(function() {
1878
+ var elem = $( this ),
1879
+ position = elem.css( "position" );
1880
+
1881
+ if ( position === "absolute" || position === "fixed" ) {
1882
+ return;
1883
+ }
1884
+ maxHeight -= elem.outerHeight( true );
1885
+ });
1886
+
1887
+ this.headers.each(function() {
1888
+ maxHeight -= $( this ).outerHeight( true );
1889
+ });
1890
+
1891
+ this.headers.next()
1892
+ .each(function() {
1893
+ $( this ).height( Math.max( 0, maxHeight -
1894
+ $( this ).innerHeight() + $( this ).height() ) );
1895
+ })
1896
+ .css( "overflow", "auto" );
1897
+ } else if ( heightStyle === "auto" ) {
1898
+ maxHeight = 0;
1899
+ this.headers.next()
1900
+ .each(function() {
1901
+ maxHeight = Math.max( maxHeight, $( this ).css( "height", "" ).height() );
1902
+ })
1903
+ .height( maxHeight );
1904
+ }
1905
+ },
1906
+
1907
+ _activate: function( index ) {
1908
+ var active = this._findActive( index )[ 0 ];
1909
+
1910
+ // trying to activate the already active panel
1911
+ if ( active === this.active[ 0 ] ) {
1912
+ return;
1913
+ }
1914
+
1915
+ // trying to collapse, simulate a click on the currently active header
1916
+ active = active || this.active[ 0 ];
1917
+
1918
+ this._eventHandler({
1919
+ target: active,
1920
+ currentTarget: active,
1921
+ preventDefault: $.noop
1922
+ });
1923
+ },
1924
+
1925
+ _findActive: function( selector ) {
1926
+ return typeof selector === "number" ? this.headers.eq( selector ) : $();
1927
+ },
1928
+
1929
+ _setupEvents: function( event ) {
1930
+ var events = {
1931
+ keydown: "_keydown"
1932
+ };
1933
+ if ( event ) {
1934
+ $.each( event.split( " " ), function( index, eventName ) {
1935
+ events[ eventName ] = "_eventHandler";
1936
+ });
1937
+ }
1938
+
1939
+ this._off( this.headers.add( this.headers.next() ) );
1940
+ this._on( this.headers, events );
1941
+ this._on( this.headers.next(), { keydown: "_panelKeyDown" });
1942
+ this._hoverable( this.headers );
1943
+ this._focusable( this.headers );
1944
+ },
1945
+
1946
+ _eventHandler: function( event ) {
1947
+ var options = this.options,
1948
+ active = this.active,
1949
+ clicked = $( event.currentTarget ),
1950
+ clickedIsActive = clicked[ 0 ] === active[ 0 ],
1951
+ collapsing = clickedIsActive && options.collapsible,
1952
+ toShow = collapsing ? $() : clicked.next(),
1953
+ toHide = active.next(),
1954
+ eventData = {
1955
+ oldHeader: active,
1956
+ oldPanel: toHide,
1957
+ newHeader: collapsing ? $() : clicked,
1958
+ newPanel: toShow
1959
+ };
1960
+
1961
+ event.preventDefault();
1962
+
1963
+ if (
1964
+ // click on active header, but not collapsible
1965
+ ( clickedIsActive && !options.collapsible ) ||
1966
+ // allow canceling activation
1967
+ ( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
1968
+ return;
1969
+ }
1970
+
1971
+ options.active = collapsing ? false : this.headers.index( clicked );
1972
+
1973
+ // when the call to ._toggle() comes after the class changes
1974
+ // it causes a very odd bug in IE 8 (see #6720)
1975
+ this.active = clickedIsActive ? $() : clicked;
1976
+ this._toggle( eventData );
1977
+
1978
+ // switch classes
1979
+ // corner classes on the previously active header stay after the animation
1980
+ active.removeClass( "ui-accordion-header-active ui-state-active" );
1981
+ if ( options.icons ) {
1982
+ active.children( ".ui-accordion-header-icon" )
1983
+ .removeClass( options.icons.activeHeader )
1984
+ .addClass( options.icons.header );
1985
+ }
1986
+
1987
+ if ( !clickedIsActive ) {
1988
+ clicked
1989
+ .removeClass( "ui-corner-all" )
1990
+ .addClass( "ui-accordion-header-active ui-state-active ui-corner-top" );
1991
+ if ( options.icons ) {
1992
+ clicked.children( ".ui-accordion-header-icon" )
1993
+ .removeClass( options.icons.header )
1994
+ .addClass( options.icons.activeHeader );
1995
+ }
1996
+
1997
+ clicked
1998
+ .next()
1999
+ .addClass( "ui-accordion-content-active" );
2000
+ }
2001
+ },
2002
+
2003
+ _toggle: function( data ) {
2004
+ var toShow = data.newPanel,
2005
+ toHide = this.prevShow.length ? this.prevShow : data.oldPanel;
2006
+
2007
+ // handle activating a panel during the animation for another activation
2008
+ this.prevShow.add( this.prevHide ).stop( true, true );
2009
+ this.prevShow = toShow;
2010
+ this.prevHide = toHide;
2011
+
2012
+ if ( this.options.animate ) {
2013
+ this._animate( toShow, toHide, data );
2014
+ } else {
2015
+ toHide.hide();
2016
+ toShow.show();
2017
+ this._toggleComplete( data );
2018
+ }
2019
+
2020
+ toHide.attr({
2021
+ "aria-hidden": "true"
2022
+ });
2023
+ toHide.prev().attr({
2024
+ "aria-selected": "false",
2025
+ "aria-expanded": "false"
2026
+ });
2027
+ // if we're switching panels, remove the old header from the tab order
2028
+ // if we're opening from collapsed state, remove the previous header from the tab order
2029
+ // if we're collapsing, then keep the collapsing header in the tab order
2030
+ if ( toShow.length && toHide.length ) {
2031
+ toHide.prev().attr({
2032
+ "tabIndex": -1,
2033
+ "aria-expanded": "false"
2034
+ });
2035
+ } else if ( toShow.length ) {
2036
+ this.headers.filter(function() {
2037
+ return parseInt( $( this ).attr( "tabIndex" ), 10 ) === 0;
2038
+ })
2039
+ .attr( "tabIndex", -1 );
2040
+ }
2041
+
2042
+ toShow
2043
+ .attr( "aria-hidden", "false" )
2044
+ .prev()
2045
+ .attr({
2046
+ "aria-selected": "true",
2047
+ "aria-expanded": "true",
2048
+ tabIndex: 0
2049
+ });
2050
+ },
2051
+
2052
+ _animate: function( toShow, toHide, data ) {
2053
+ var total, easing, duration,
2054
+ that = this,
2055
+ adjust = 0,
2056
+ boxSizing = toShow.css( "box-sizing" ),
2057
+ down = toShow.length &&
2058
+ ( !toHide.length || ( toShow.index() < toHide.index() ) ),
2059
+ animate = this.options.animate || {},
2060
+ options = down && animate.down || animate,
2061
+ complete = function() {
2062
+ that._toggleComplete( data );
2063
+ };
2064
+
2065
+ if ( typeof options === "number" ) {
2066
+ duration = options;
2067
+ }
2068
+ if ( typeof options === "string" ) {
2069
+ easing = options;
2070
+ }
2071
+ // fall back from options to animation in case of partial down settings
2072
+ easing = easing || options.easing || animate.easing;
2073
+ duration = duration || options.duration || animate.duration;
2074
+
2075
+ if ( !toHide.length ) {
2076
+ return toShow.animate( this.showProps, duration, easing, complete );
2077
+ }
2078
+ if ( !toShow.length ) {
2079
+ return toHide.animate( this.hideProps, duration, easing, complete );
2080
+ }
2081
+
2082
+ total = toShow.show().outerHeight();
2083
+ toHide.animate( this.hideProps, {
2084
+ duration: duration,
2085
+ easing: easing,
2086
+ step: function( now, fx ) {
2087
+ fx.now = Math.round( now );
2088
+ }
2089
+ });
2090
+ toShow
2091
+ .hide()
2092
+ .animate( this.showProps, {
2093
+ duration: duration,
2094
+ easing: easing,
2095
+ complete: complete,
2096
+ step: function( now, fx ) {
2097
+ fx.now = Math.round( now );
2098
+ if ( fx.prop !== "height" ) {
2099
+ if ( boxSizing === "content-box" ) {
2100
+ adjust += fx.now;
2101
+ }
2102
+ } else if ( that.options.heightStyle !== "content" ) {
2103
+ fx.now = Math.round( total - toHide.outerHeight() - adjust );
2104
+ adjust = 0;
2105
+ }
2106
+ }
2107
+ });
2108
+ },
2109
+
2110
+ _toggleComplete: function( data ) {
2111
+ var toHide = data.oldPanel;
2112
+
2113
+ toHide
2114
+ .removeClass( "ui-accordion-content-active" )
2115
+ .prev()
2116
+ .removeClass( "ui-corner-top" )
2117
+ .addClass( "ui-corner-all" );
2118
+
2119
+ // Work around for rendering bug in IE (#5421)
2120
+ if ( toHide.length ) {
2121
+ toHide.parent()[ 0 ].className = toHide.parent()[ 0 ].className;
2122
+ }
2123
+ this._trigger( "activate", null, data );
2124
+ }
2125
+ });
2126
+
2127
+
2128
+ /*!
2129
+ * jQuery UI Menu 1.11.4
2130
+ * http://jqueryui.com
2131
+ *
2132
+ * Copyright jQuery Foundation and other contributors
2133
+ * Released under the MIT license.
2134
+ * http://jquery.org/license
2135
+ *
2136
+ * http://api.jqueryui.com/menu/
2137
+ */
2138
+
2139
+
2140
+ var menu = $.widget( "ui.menu", {
2141
+ version: "1.11.4",
2142
+ defaultElement: "<ul>",
2143
+ delay: 300,
2144
+ options: {
2145
+ icons: {
2146
+ submenu: "ui-icon-carat-1-e"
2147
+ },
2148
+ items: "> *",
2149
+ menus: "ul",
2150
+ position: {
2151
+ my: "left-1 top",
2152
+ at: "right top"
2153
+ },
2154
+ role: "menu",
2155
+
2156
+ // callbacks
2157
+ blur: null,
2158
+ focus: null,
2159
+ select: null
2160
+ },
2161
+
2162
+ _create: function() {
2163
+ this.activeMenu = this.element;
2164
+
2165
+ // Flag used to prevent firing of the click handler
2166
+ // as the event bubbles up through nested menus
2167
+ this.mouseHandled = false;
2168
+ this.element
2169
+ .uniqueId()
2170
+ .addClass( "ui-menu ui-widget ui-widget-content" )
2171
+ .toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length )
2172
+ .attr({
2173
+ role: this.options.role,
2174
+ tabIndex: 0
2175
+ });
2176
+
2177
+ if ( this.options.disabled ) {
2178
+ this.element
2179
+ .addClass( "ui-state-disabled" )
2180
+ .attr( "aria-disabled", "true" );
2181
+ }
2182
+
2183
+ this._on({
2184
+ // Prevent focus from sticking to links inside menu after clicking
2185
+ // them (focus should always stay on UL during navigation).
2186
+ "mousedown .ui-menu-item": function( event ) {
2187
+ event.preventDefault();
2188
+ },
2189
+ "click .ui-menu-item": function( event ) {
2190
+ var target = $( event.target );
2191
+ if ( !this.mouseHandled && target.not( ".ui-state-disabled" ).length ) {
2192
+ this.select( event );
2193
+
2194
+ // Only set the mouseHandled flag if the event will bubble, see #9469.
2195
+ if ( !event.isPropagationStopped() ) {
2196
+ this.mouseHandled = true;
2197
+ }
2198
+
2199
+ // Open submenu on click
2200
+ if ( target.has( ".ui-menu" ).length ) {
2201
+ this.expand( event );
2202
+ } else if ( !this.element.is( ":focus" ) && $( this.document[ 0 ].activeElement ).closest( ".ui-menu" ).length ) {
2203
+
2204
+ // Redirect focus to the menu
2205
+ this.element.trigger( "focus", [ true ] );
2206
+
2207
+ // If the active item is on the top level, let it stay active.
2208
+ // Otherwise, blur the active item since it is no longer visible.
2209
+ if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) {
2210
+ clearTimeout( this.timer );
2211
+ }
2212
+ }
2213
+ }
2214
+ },
2215
+ "mouseenter .ui-menu-item": function( event ) {
2216
+ // Ignore mouse events while typeahead is active, see #10458.
2217
+ // Prevents focusing the wrong item when typeahead causes a scroll while the mouse
2218
+ // is over an item in the menu
2219
+ if ( this.previousFilter ) {
2220
+ return;
2221
+ }
2222
+ var target = $( event.currentTarget );
2223
+ // Remove ui-state-active class from siblings of the newly focused menu item
2224
+ // to avoid a jump caused by adjacent elements both having a class with a border
2225
+ target.siblings( ".ui-state-active" ).removeClass( "ui-state-active" );
2226
+ this.focus( event, target );
2227
+ },
2228
+ mouseleave: "collapseAll",
2229
+ "mouseleave .ui-menu": "collapseAll",
2230
+ focus: function( event, keepActiveItem ) {
2231
+ // If there's already an active item, keep it active
2232
+ // If not, activate the first item
2233
+ var item = this.active || this.element.find( this.options.items ).eq( 0 );
2234
+
2235
+ if ( !keepActiveItem ) {
2236
+ this.focus( event, item );
2237
+ }
2238
+ },
2239
+ blur: function( event ) {
2240
+ this._delay(function() {
2241
+ if ( !$.contains( this.element[0], this.document[0].activeElement ) ) {
2242
+ this.collapseAll( event );
2243
+ }
2244
+ });
2245
+ },
2246
+ keydown: "_keydown"
2247
+ });
2248
+
2249
+ this.refresh();
2250
+
2251
+ // Clicks outside of a menu collapse any open menus
2252
+ this._on( this.document, {
2253
+ click: function( event ) {
2254
+ if ( this._closeOnDocumentClick( event ) ) {
2255
+ this.collapseAll( event );
2256
+ }
2257
+
2258
+ // Reset the mouseHandled flag
2259
+ this.mouseHandled = false;
2260
+ }
2261
+ });
2262
+ },
2263
+
2264
+ _destroy: function() {
2265
+ // Destroy (sub)menus
2266
+ this.element
2267
+ .removeAttr( "aria-activedescendant" )
2268
+ .find( ".ui-menu" ).addBack()
2269
+ .removeClass( "ui-menu ui-widget ui-widget-content ui-menu-icons ui-front" )
2270
+ .removeAttr( "role" )
2271
+ .removeAttr( "tabIndex" )
2272
+ .removeAttr( "aria-labelledby" )
2273
+ .removeAttr( "aria-expanded" )
2274
+ .removeAttr( "aria-hidden" )
2275
+ .removeAttr( "aria-disabled" )
2276
+ .removeUniqueId()
2277
+ .show();
2278
+
2279
+ // Destroy menu items
2280
+ this.element.find( ".ui-menu-item" )
2281
+ .removeClass( "ui-menu-item" )
2282
+ .removeAttr( "role" )
2283
+ .removeAttr( "aria-disabled" )
2284
+ .removeUniqueId()
2285
+ .removeClass( "ui-state-hover" )
2286
+ .removeAttr( "tabIndex" )
2287
+ .removeAttr( "role" )
2288
+ .removeAttr( "aria-haspopup" )
2289
+ .children().each( function() {
2290
+ var elem = $( this );
2291
+ if ( elem.data( "ui-menu-submenu-carat" ) ) {
2292
+ elem.remove();
2293
+ }
2294
+ });
2295
+
2296
+ // Destroy menu dividers
2297
+ this.element.find( ".ui-menu-divider" ).removeClass( "ui-menu-divider ui-widget-content" );
2298
+ },
2299
+
2300
+ _keydown: function( event ) {
2301
+ var match, prev, character, skip,
2302
+ preventDefault = true;
2303
+
2304
+ switch ( event.keyCode ) {
2305
+ case $.ui.keyCode.PAGE_UP:
2306
+ this.previousPage( event );
2307
+ break;
2308
+ case $.ui.keyCode.PAGE_DOWN:
2309
+ this.nextPage( event );
2310
+ break;
2311
+ case $.ui.keyCode.HOME:
2312
+ this._move( "first", "first", event );
2313
+ break;
2314
+ case $.ui.keyCode.END:
2315
+ this._move( "last", "last", event );
2316
+ break;
2317
+ case $.ui.keyCode.UP:
2318
+ this.previous( event );
2319
+ break;
2320
+ case $.ui.keyCode.DOWN:
2321
+ this.next( event );
2322
+ break;
2323
+ case $.ui.keyCode.LEFT:
2324
+ this.collapse( event );
2325
+ break;
2326
+ case $.ui.keyCode.RIGHT:
2327
+ if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
2328
+ this.expand( event );
2329
+ }
2330
+ break;
2331
+ case $.ui.keyCode.ENTER:
2332
+ case $.ui.keyCode.SPACE:
2333
+ this._activate( event );
2334
+ break;
2335
+ case $.ui.keyCode.ESCAPE:
2336
+ this.collapse( event );
2337
+ break;
2338
+ default:
2339
+ preventDefault = false;
2340
+ prev = this.previousFilter || "";
2341
+ character = String.fromCharCode( event.keyCode );
2342
+ skip = false;
2343
+
2344
+ clearTimeout( this.filterTimer );
2345
+
2346
+ if ( character === prev ) {
2347
+ skip = true;
2348
+ } else {
2349
+ character = prev + character;
2350
+ }
2351
+
2352
+ match = this._filterMenuItems( character );
2353
+ match = skip && match.index( this.active.next() ) !== -1 ?
2354
+ this.active.nextAll( ".ui-menu-item" ) :
2355
+ match;
2356
+
2357
+ // If no matches on the current filter, reset to the last character pressed
2358
+ // to move down the menu to the first item that starts with that character
2359
+ if ( !match.length ) {
2360
+ character = String.fromCharCode( event.keyCode );
2361
+ match = this._filterMenuItems( character );
2362
+ }
2363
+
2364
+ if ( match.length ) {
2365
+ this.focus( event, match );
2366
+ this.previousFilter = character;
2367
+ this.filterTimer = this._delay(function() {
2368
+ delete this.previousFilter;
2369
+ }, 1000 );
2370
+ } else {
2371
+ delete this.previousFilter;
2372
+ }
2373
+ }
2374
+
2375
+ if ( preventDefault ) {
2376
+ event.preventDefault();
2377
+ }
2378
+ },
2379
+
2380
+ _activate: function( event ) {
2381
+ if ( !this.active.is( ".ui-state-disabled" ) ) {
2382
+ if ( this.active.is( "[aria-haspopup='true']" ) ) {
2383
+ this.expand( event );
2384
+ } else {
2385
+ this.select( event );
2386
+ }
2387
+ }
2388
+ },
2389
+
2390
+ refresh: function() {
2391
+ var menus, items,
2392
+ that = this,
2393
+ icon = this.options.icons.submenu,
2394
+ submenus = this.element.find( this.options.menus );
2395
+
2396
+ this.element.toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length );
2397
+
2398
+ // Initialize nested menus
2399
+ submenus.filter( ":not(.ui-menu)" )
2400
+ .addClass( "ui-menu ui-widget ui-widget-content ui-front" )
2401
+ .hide()
2402
+ .attr({
2403
+ role: this.options.role,
2404
+ "aria-hidden": "true",
2405
+ "aria-expanded": "false"
2406
+ })
2407
+ .each(function() {
2408
+ var menu = $( this ),
2409
+ item = menu.parent(),
2410
+ submenuCarat = $( "<span>" )
2411
+ .addClass( "ui-menu-icon ui-icon " + icon )
2412
+ .data( "ui-menu-submenu-carat", true );
2413
+
2414
+ item
2415
+ .attr( "aria-haspopup", "true" )
2416
+ .prepend( submenuCarat );
2417
+ menu.attr( "aria-labelledby", item.attr( "id" ) );
2418
+ });
2419
+
2420
+ menus = submenus.add( this.element );
2421
+ items = menus.find( this.options.items );
2422
+
2423
+ // Initialize menu-items containing spaces and/or dashes only as dividers
2424
+ items.not( ".ui-menu-item" ).each(function() {
2425
+ var item = $( this );
2426
+ if ( that._isDivider( item ) ) {
2427
+ item.addClass( "ui-widget-content ui-menu-divider" );
2428
+ }
2429
+ });
2430
+
2431
+ // Don't refresh list items that are already adapted
2432
+ items.not( ".ui-menu-item, .ui-menu-divider" )
2433
+ .addClass( "ui-menu-item" )
2434
+ .uniqueId()
2435
+ .attr({
2436
+ tabIndex: -1,
2437
+ role: this._itemRole()
2438
+ });
2439
+
2440
+ // Add aria-disabled attribute to any disabled menu item
2441
+ items.filter( ".ui-state-disabled" ).attr( "aria-disabled", "true" );
2442
+
2443
+ // If the active item has been removed, blur the menu
2444
+ if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
2445
+ this.blur();
2446
+ }
2447
+ },
2448
+
2449
+ _itemRole: function() {
2450
+ return {
2451
+ menu: "menuitem",
2452
+ listbox: "option"
2453
+ }[ this.options.role ];
2454
+ },
2455
+
2456
+ _setOption: function( key, value ) {
2457
+ if ( key === "icons" ) {
2458
+ this.element.find( ".ui-menu-icon" )
2459
+ .removeClass( this.options.icons.submenu )
2460
+ .addClass( value.submenu );
2461
+ }
2462
+ if ( key === "disabled" ) {
2463
+ this.element
2464
+ .toggleClass( "ui-state-disabled", !!value )
2465
+ .attr( "aria-disabled", value );
2466
+ }
2467
+ this._super( key, value );
2468
+ },
2469
+
2470
+ focus: function( event, item ) {
2471
+ var nested, focused;
2472
+ this.blur( event, event && event.type === "focus" );
2473
+
2474
+ this._scrollIntoView( item );
2475
+
2476
+ this.active = item.first();
2477
+ focused = this.active.addClass( "ui-state-focus" ).removeClass( "ui-state-active" );
2478
+ // Only update aria-activedescendant if there's a role
2479
+ // otherwise we assume focus is managed elsewhere
2480
+ if ( this.options.role ) {
2481
+ this.element.attr( "aria-activedescendant", focused.attr( "id" ) );
2482
+ }
2483
+
2484
+ // Highlight active parent menu item, if any
2485
+ this.active
2486
+ .parent()
2487
+ .closest( ".ui-menu-item" )
2488
+ .addClass( "ui-state-active" );
2489
+
2490
+ if ( event && event.type === "keydown" ) {
2491
+ this._close();
2492
+ } else {
2493
+ this.timer = this._delay(function() {
2494
+ this._close();
2495
+ }, this.delay );
2496
+ }
2497
+
2498
+ nested = item.children( ".ui-menu" );
2499
+ if ( nested.length && event && ( /^mouse/.test( event.type ) ) ) {
2500
+ this._startOpening(nested);
2501
+ }
2502
+ this.activeMenu = item.parent();
2503
+
2504
+ this._trigger( "focus", event, { item: item } );
2505
+ },
2506
+
2507
+ _scrollIntoView: function( item ) {
2508
+ var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
2509
+ if ( this._hasScroll() ) {
2510
+ borderTop = parseFloat( $.css( this.activeMenu[0], "borderTopWidth" ) ) || 0;
2511
+ paddingTop = parseFloat( $.css( this.activeMenu[0], "paddingTop" ) ) || 0;
2512
+ offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
2513
+ scroll = this.activeMenu.scrollTop();
2514
+ elementHeight = this.activeMenu.height();
2515
+ itemHeight = item.outerHeight();
2516
+
2517
+ if ( offset < 0 ) {
2518
+ this.activeMenu.scrollTop( scroll + offset );
2519
+ } else if ( offset + itemHeight > elementHeight ) {
2520
+ this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
2521
+ }
2522
+ }
2523
+ },
2524
+
2525
+ blur: function( event, fromFocus ) {
2526
+ if ( !fromFocus ) {
2527
+ clearTimeout( this.timer );
2528
+ }
2529
+
2530
+ if ( !this.active ) {
2531
+ return;
2532
+ }
2533
+
2534
+ this.active.removeClass( "ui-state-focus" );
2535
+ this.active = null;
2536
+
2537
+ this._trigger( "blur", event, { item: this.active } );
2538
+ },
2539
+
2540
+ _startOpening: function( submenu ) {
2541
+ clearTimeout( this.timer );
2542
+
2543
+ // Don't open if already open fixes a Firefox bug that caused a .5 pixel
2544
+ // shift in the submenu position when mousing over the carat icon
2545
+ if ( submenu.attr( "aria-hidden" ) !== "true" ) {
2546
+ return;
2547
+ }
2548
+
2549
+ this.timer = this._delay(function() {
2550
+ this._close();
2551
+ this._open( submenu );
2552
+ }, this.delay );
2553
+ },
2554
+
2555
+ _open: function( submenu ) {
2556
+ var position = $.extend({
2557
+ of: this.active
2558
+ }, this.options.position );
2559
+
2560
+ clearTimeout( this.timer );
2561
+ this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) )
2562
+ .hide()
2563
+ .attr( "aria-hidden", "true" );
2564
+
2565
+ submenu
2566
+ .show()
2567
+ .removeAttr( "aria-hidden" )
2568
+ .attr( "aria-expanded", "true" )
2569
+ .position( position );
2570
+ },
2571
+
2572
+ collapseAll: function( event, all ) {
2573
+ clearTimeout( this.timer );
2574
+ this.timer = this._delay(function() {
2575
+ // If we were passed an event, look for the submenu that contains the event
2576
+ var currentMenu = all ? this.element :
2577
+ $( event && event.target ).closest( this.element.find( ".ui-menu" ) );
2578
+
2579
+ // If we found no valid submenu ancestor, use the main menu to close all sub menus anyway
2580
+ if ( !currentMenu.length ) {
2581
+ currentMenu = this.element;
2582
+ }
2583
+
2584
+ this._close( currentMenu );
2585
+
2586
+ this.blur( event );
2587
+ this.activeMenu = currentMenu;
2588
+ }, this.delay );
2589
+ },
2590
+
2591
+ // With no arguments, closes the currently active menu - if nothing is active
2592
+ // it closes all menus. If passed an argument, it will search for menus BELOW
2593
+ _close: function( startMenu ) {
2594
+ if ( !startMenu ) {
2595
+ startMenu = this.active ? this.active.parent() : this.element;
2596
+ }
2597
+
2598
+ startMenu
2599
+ .find( ".ui-menu" )
2600
+ .hide()
2601
+ .attr( "aria-hidden", "true" )
2602
+ .attr( "aria-expanded", "false" )
2603
+ .end()
2604
+ .find( ".ui-state-active" ).not( ".ui-state-focus" )
2605
+ .removeClass( "ui-state-active" );
2606
+ },
2607
+
2608
+ _closeOnDocumentClick: function( event ) {
2609
+ return !$( event.target ).closest( ".ui-menu" ).length;
2610
+ },
2611
+
2612
+ _isDivider: function( item ) {
2613
+
2614
+ // Match hyphen, em dash, en dash
2615
+ return !/[^\-\u2014\u2013\s]/.test( item.text() );
2616
+ },
2617
+
2618
+ collapse: function( event ) {
2619
+ var newItem = this.active &&
2620
+ this.active.parent().closest( ".ui-menu-item", this.element );
2621
+ if ( newItem && newItem.length ) {
2622
+ this._close();
2623
+ this.focus( event, newItem );
2624
+ }
2625
+ },
2626
+
2627
+ expand: function( event ) {
2628
+ var newItem = this.active &&
2629
+ this.active
2630
+ .children( ".ui-menu " )
2631
+ .find( this.options.items )
2632
+ .first();
2633
+
2634
+ if ( newItem && newItem.length ) {
2635
+ this._open( newItem.parent() );
2636
+
2637
+ // Delay so Firefox will not hide activedescendant change in expanding submenu from AT
2638
+ this._delay(function() {
2639
+ this.focus( event, newItem );
2640
+ });
2641
+ }
2642
+ },
2643
+
2644
+ next: function( event ) {
2645
+ this._move( "next", "first", event );
2646
+ },
2647
+
2648
+ previous: function( event ) {
2649
+ this._move( "prev", "last", event );
2650
+ },
2651
+
2652
+ isFirstItem: function() {
2653
+ return this.active && !this.active.prevAll( ".ui-menu-item" ).length;
2654
+ },
2655
+
2656
+ isLastItem: function() {
2657
+ return this.active && !this.active.nextAll( ".ui-menu-item" ).length;
2658
+ },
2659
+
2660
+ _move: function( direction, filter, event ) {
2661
+ var next;
2662
+ if ( this.active ) {
2663
+ if ( direction === "first" || direction === "last" ) {
2664
+ next = this.active
2665
+ [ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" )
2666
+ .eq( -1 );
2667
+ } else {
2668
+ next = this.active
2669
+ [ direction + "All" ]( ".ui-menu-item" )
2670
+ .eq( 0 );
2671
+ }
2672
+ }
2673
+ if ( !next || !next.length || !this.active ) {
2674
+ next = this.activeMenu.find( this.options.items )[ filter ]();
2675
+ }
2676
+
2677
+ this.focus( event, next );
2678
+ },
2679
+
2680
+ nextPage: function( event ) {
2681
+ var item, base, height;
2682
+
2683
+ if ( !this.active ) {
2684
+ this.next( event );
2685
+ return;
2686
+ }
2687
+ if ( this.isLastItem() ) {
2688
+ return;
2689
+ }
2690
+ if ( this._hasScroll() ) {
2691
+ base = this.active.offset().top;
2692
+ height = this.element.height();
2693
+ this.active.nextAll( ".ui-menu-item" ).each(function() {
2694
+ item = $( this );
2695
+ return item.offset().top - base - height < 0;
2696
+ });
2697
+
2698
+ this.focus( event, item );
2699
+ } else {
2700
+ this.focus( event, this.activeMenu.find( this.options.items )
2701
+ [ !this.active ? "first" : "last" ]() );
2702
+ }
2703
+ },
2704
+
2705
+ previousPage: function( event ) {
2706
+ var item, base, height;
2707
+ if ( !this.active ) {
2708
+ this.next( event );
2709
+ return;
2710
+ }
2711
+ if ( this.isFirstItem() ) {
2712
+ return;
2713
+ }
2714
+ if ( this._hasScroll() ) {
2715
+ base = this.active.offset().top;
2716
+ height = this.element.height();
2717
+ this.active.prevAll( ".ui-menu-item" ).each(function() {
2718
+ item = $( this );
2719
+ return item.offset().top - base + height > 0;
2720
+ });
2721
+
2722
+ this.focus( event, item );
2723
+ } else {
2724
+ this.focus( event, this.activeMenu.find( this.options.items ).first() );
2725
+ }
2726
+ },
2727
+
2728
+ _hasScroll: function() {
2729
+ return this.element.outerHeight() < this.element.prop( "scrollHeight" );
2730
+ },
2731
+
2732
+ select: function( event ) {
2733
+ // TODO: It should never be possible to not have an active item at this
2734
+ // point, but the tests don't trigger mouseenter before click.
2735
+ this.active = this.active || $( event.target ).closest( ".ui-menu-item" );
2736
+ var ui = { item: this.active };
2737
+ if ( !this.active.has( ".ui-menu" ).length ) {
2738
+ this.collapseAll( event, true );
2739
+ }
2740
+ this._trigger( "select", event, ui );
2741
+ },
2742
+
2743
+ _filterMenuItems: function(character) {
2744
+ var escapedCharacter = character.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ),
2745
+ regex = new RegExp( "^" + escapedCharacter, "i" );
2746
+
2747
+ return this.activeMenu
2748
+ .find( this.options.items )
2749
+
2750
+ // Only match on items, not dividers or other content (#10571)
2751
+ .filter( ".ui-menu-item" )
2752
+ .filter(function() {
2753
+ return regex.test( $.trim( $( this ).text() ) );
2754
+ });
2755
+ }
2756
+ });
2757
+
2758
+
2759
+ /*!
2760
+ * jQuery UI Autocomplete 1.11.4
2761
+ * http://jqueryui.com
2762
+ *
2763
+ * Copyright jQuery Foundation and other contributors
2764
+ * Released under the MIT license.
2765
+ * http://jquery.org/license
2766
+ *
2767
+ * http://api.jqueryui.com/autocomplete/
2768
+ */
2769
+
2770
+
2771
+ $.widget( "ui.autocomplete", {
2772
+ version: "1.11.4",
2773
+ defaultElement: "<input>",
2774
+ options: {
2775
+ appendTo: null,
2776
+ autoFocus: false,
2777
+ delay: 300,
2778
+ minLength: 1,
2779
+ position: {
2780
+ my: "left top",
2781
+ at: "left bottom",
2782
+ collision: "none"
2783
+ },
2784
+ source: null,
2785
+
2786
+ // callbacks
2787
+ change: null,
2788
+ close: null,
2789
+ focus: null,
2790
+ open: null,
2791
+ response: null,
2792
+ search: null,
2793
+ select: null
2794
+ },
2795
+
2796
+ requestIndex: 0,
2797
+ pending: 0,
2798
+
2799
+ _create: function() {
2800
+ // Some browsers only repeat keydown events, not keypress events,
2801
+ // so we use the suppressKeyPress flag to determine if we've already
2802
+ // handled the keydown event. #7269
2803
+ // Unfortunately the code for & in keypress is the same as the up arrow,
2804
+ // so we use the suppressKeyPressRepeat flag to avoid handling keypress
2805
+ // events when we know the keydown event was used to modify the
2806
+ // search term. #7799
2807
+ var suppressKeyPress, suppressKeyPressRepeat, suppressInput,
2808
+ nodeName = this.element[ 0 ].nodeName.toLowerCase(),
2809
+ isTextarea = nodeName === "textarea",
2810
+ isInput = nodeName === "input";
2811
+
2812
+ this.isMultiLine =
2813
+ // Textareas are always multi-line
2814
+ isTextarea ? true :
2815
+ // Inputs are always single-line, even if inside a contentEditable element
2816
+ // IE also treats inputs as contentEditable
2817
+ isInput ? false :
2818
+ // All other element types are determined by whether or not they're contentEditable
2819
+ this.element.prop( "isContentEditable" );
2820
+
2821
+ this.valueMethod = this.element[ isTextarea || isInput ? "val" : "text" ];
2822
+ this.isNewMenu = true;
2823
+
2824
+ this.element
2825
+ .addClass( "ui-autocomplete-input" )
2826
+ .attr( "autocomplete", "off" );
2827
+
2828
+ this._on( this.element, {
2829
+ keydown: function( event ) {
2830
+ if ( this.element.prop( "readOnly" ) ) {
2831
+ suppressKeyPress = true;
2832
+ suppressInput = true;
2833
+ suppressKeyPressRepeat = true;
2834
+ return;
2835
+ }
2836
+
2837
+ suppressKeyPress = false;
2838
+ suppressInput = false;
2839
+ suppressKeyPressRepeat = false;
2840
+ var keyCode = $.ui.keyCode;
2841
+ switch ( event.keyCode ) {
2842
+ case keyCode.PAGE_UP:
2843
+ suppressKeyPress = true;
2844
+ this._move( "previousPage", event );
2845
+ break;
2846
+ case keyCode.PAGE_DOWN:
2847
+ suppressKeyPress = true;
2848
+ this._move( "nextPage", event );
2849
+ break;
2850
+ case keyCode.UP:
2851
+ suppressKeyPress = true;
2852
+ this._keyEvent( "previous", event );
2853
+ break;
2854
+ case keyCode.DOWN:
2855
+ suppressKeyPress = true;
2856
+ this._keyEvent( "next", event );
2857
+ break;
2858
+ case keyCode.ENTER:
2859
+ // when menu is open and has focus
2860
+ if ( this.menu.active ) {
2861
+ // #6055 - Opera still allows the keypress to occur
2862
+ // which causes forms to submit
2863
+ suppressKeyPress = true;
2864
+ event.preventDefault();
2865
+ this.menu.select( event );
2866
+ }
2867
+ break;
2868
+ case keyCode.TAB:
2869
+ if ( this.menu.active ) {
2870
+ this.menu.select( event );
2871
+ }
2872
+ break;
2873
+ case keyCode.ESCAPE:
2874
+ if ( this.menu.element.is( ":visible" ) ) {
2875
+ if ( !this.isMultiLine ) {
2876
+ this._value( this.term );
2877
+ }
2878
+ this.close( event );
2879
+ // Different browsers have different default behavior for escape
2880
+ // Single press can mean undo or clear
2881
+ // Double press in IE means clear the whole form
2882
+ event.preventDefault();
2883
+ }
2884
+ break;
2885
+ default:
2886
+ suppressKeyPressRepeat = true;
2887
+ // search timeout should be triggered before the input value is changed
2888
+ this._searchTimeout( event );
2889
+ break;
2890
+ }
2891
+ },
2892
+ keypress: function( event ) {
2893
+ if ( suppressKeyPress ) {
2894
+ suppressKeyPress = false;
2895
+ if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
2896
+ event.preventDefault();
2897
+ }
2898
+ return;
2899
+ }
2900
+ if ( suppressKeyPressRepeat ) {
2901
+ return;
2902
+ }
2903
+
2904
+ // replicate some key handlers to allow them to repeat in Firefox and Opera
2905
+ var keyCode = $.ui.keyCode;
2906
+ switch ( event.keyCode ) {
2907
+ case keyCode.PAGE_UP:
2908
+ this._move( "previousPage", event );
2909
+ break;
2910
+ case keyCode.PAGE_DOWN:
2911
+ this._move( "nextPage", event );
2912
+ break;
2913
+ case keyCode.UP:
2914
+ this._keyEvent( "previous", event );
2915
+ break;
2916
+ case keyCode.DOWN:
2917
+ this._keyEvent( "next", event );
2918
+ break;
2919
+ }
2920
+ },
2921
+ input: function( event ) {
2922
+ if ( suppressInput ) {
2923
+ suppressInput = false;
2924
+ event.preventDefault();
2925
+ return;
2926
+ }
2927
+ this._searchTimeout( event );
2928
+ },
2929
+ focus: function() {
2930
+ this.selectedItem = null;
2931
+ this.previous = this._value();
2932
+ },
2933
+ blur: function( event ) {
2934
+ if ( this.cancelBlur ) {
2935
+ delete this.cancelBlur;
2936
+ return;
2937
+ }
2938
+
2939
+ clearTimeout( this.searching );
2940
+ this.close( event );
2941
+ this._change( event );
2942
+ }
2943
+ });
2944
+
2945
+ this._initSource();
2946
+ this.menu = $( "<ul>" )
2947
+ .addClass( "ui-autocomplete ui-front" )
2948
+ .appendTo( this._appendTo() )
2949
+ .menu({
2950
+ // disable ARIA support, the live region takes care of that
2951
+ role: null
2952
+ })
2953
+ .hide()
2954
+ .menu( "instance" );
2955
+
2956
+ this._on( this.menu.element, {
2957
+ mousedown: function( event ) {
2958
+ // prevent moving focus out of the text field
2959
+ event.preventDefault();
2960
+
2961
+ // IE doesn't prevent moving focus even with event.preventDefault()
2962
+ // so we set a flag to know when we should ignore the blur event
2963
+ this.cancelBlur = true;
2964
+ this._delay(function() {
2965
+ delete this.cancelBlur;
2966
+ });
2967
+
2968
+ // clicking on the scrollbar causes focus to shift to the body
2969
+ // but we can't detect a mouseup or a click immediately afterward
2970
+ // so we have to track the next mousedown and close the menu if
2971
+ // the user clicks somewhere outside of the autocomplete
2972
+ var menuElement = this.menu.element[ 0 ];
2973
+ if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
2974
+ this._delay(function() {
2975
+ var that = this;
2976
+ this.document.one( "mousedown", function( event ) {
2977
+ if ( event.target !== that.element[ 0 ] &&
2978
+ event.target !== menuElement &&
2979
+ !$.contains( menuElement, event.target ) ) {
2980
+ that.close();
2981
+ }
2982
+ });
2983
+ });
2984
+ }
2985
+ },
2986
+ menufocus: function( event, ui ) {
2987
+ var label, item;
2988
+ // support: Firefox
2989
+ // Prevent accidental activation of menu items in Firefox (#7024 #9118)
2990
+ if ( this.isNewMenu ) {
2991
+ this.isNewMenu = false;
2992
+ if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {
2993
+ this.menu.blur();
2994
+
2995
+ this.document.one( "mousemove", function() {
2996
+ $( event.target ).trigger( event.originalEvent );
2997
+ });
2998
+
2999
+ return;
3000
+ }
3001
+ }
3002
+
3003
+ item = ui.item.data( "ui-autocomplete-item" );
3004
+ if ( false !== this._trigger( "focus", event, { item: item } ) ) {
3005
+ // use value to match what will end up in the input, if it was a key event
3006
+ if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {
3007
+ this._value( item.value );
3008
+ }
3009
+ }
3010
+
3011
+ // Announce the value in the liveRegion
3012
+ label = ui.item.attr( "aria-label" ) || item.value;
3013
+ if ( label && $.trim( label ).length ) {
3014
+ this.liveRegion.children().hide();
3015
+ $( "<div>" ).text( label ).appendTo( this.liveRegion );
3016
+ }
3017
+ },
3018
+ menuselect: function( event, ui ) {
3019
+ var item = ui.item.data( "ui-autocomplete-item" ),
3020
+ previous = this.previous;
3021
+
3022
+ // only trigger when focus was lost (click on menu)
3023
+ if ( this.element[ 0 ] !== this.document[ 0 ].activeElement ) {
3024
+ this.element.focus();
3025
+ this.previous = previous;
3026
+ // #6109 - IE triggers two focus events and the second
3027
+ // is asynchronous, so we need to reset the previous
3028
+ // term synchronously and asynchronously :-(
3029
+ this._delay(function() {
3030
+ this.previous = previous;
3031
+ this.selectedItem = item;
3032
+ });
3033
+ }
3034
+
3035
+ if ( false !== this._trigger( "select", event, { item: item } ) ) {
3036
+ this._value( item.value );
3037
+ }
3038
+ // reset the term after the select event
3039
+ // this allows custom select handling to work properly
3040
+ this.term = this._value();
3041
+
3042
+ this.close( event );
3043
+ this.selectedItem = item;
3044
+ }
3045
+ });
3046
+
3047
+ this.liveRegion = $( "<span>", {
3048
+ role: "status",
3049
+ "aria-live": "assertive",
3050
+ "aria-relevant": "additions"
3051
+ })
3052
+ .addClass( "ui-helper-hidden-accessible" )
3053
+ .appendTo( this.document[ 0 ].body );
3054
+
3055
+ // turning off autocomplete prevents the browser from remembering the
3056
+ // value when navigating through history, so we re-enable autocomplete
3057
+ // if the page is unloaded before the widget is destroyed. #7790
3058
+ this._on( this.window, {
3059
+ beforeunload: function() {
3060
+ this.element.removeAttr( "autocomplete" );
3061
+ }
3062
+ });
3063
+ },
3064
+
3065
+ _destroy: function() {
3066
+ clearTimeout( this.searching );
3067
+ this.element
3068
+ .removeClass( "ui-autocomplete-input" )
3069
+ .removeAttr( "autocomplete" );
3070
+ this.menu.element.remove();
3071
+ this.liveRegion.remove();
3072
+ },
3073
+
3074
+ _setOption: function( key, value ) {
3075
+ this._super( key, value );
3076
+ if ( key === "source" ) {
3077
+ this._initSource();
3078
+ }
3079
+ if ( key === "appendTo" ) {
3080
+ this.menu.element.appendTo( this._appendTo() );
3081
+ }
3082
+ if ( key === "disabled" && value && this.xhr ) {
3083
+ this.xhr.abort();
3084
+ }
3085
+ },
3086
+
3087
+ _appendTo: function() {
3088
+ var element = this.options.appendTo;
3089
+
3090
+ if ( element ) {
3091
+ element = element.jquery || element.nodeType ?
3092
+ $( element ) :
3093
+ this.document.find( element ).eq( 0 );
3094
+ }
3095
+
3096
+ if ( !element || !element[ 0 ] ) {
3097
+ element = this.element.closest( ".ui-front" );
3098
+ }
3099
+
3100
+ if ( !element.length ) {
3101
+ element = this.document[ 0 ].body;
3102
+ }
3103
+
3104
+ return element;
3105
+ },
3106
+
3107
+ _initSource: function() {
3108
+ var array, url,
3109
+ that = this;
3110
+ if ( $.isArray( this.options.source ) ) {
3111
+ array = this.options.source;
3112
+ this.source = function( request, response ) {
3113
+ response( $.ui.autocomplete.filter( array, request.term ) );
3114
+ };
3115
+ } else if ( typeof this.options.source === "string" ) {
3116
+ url = this.options.source;
3117
+ this.source = function( request, response ) {
3118
+ if ( that.xhr ) {
3119
+ that.xhr.abort();
3120
+ }
3121
+ that.xhr = $.ajax({
3122
+ url: url,
3123
+ data: request,
3124
+ dataType: "json",
3125
+ success: function( data ) {
3126
+ response( data );
3127
+ },
3128
+ error: function() {
3129
+ response([]);
3130
+ }
3131
+ });
3132
+ };
3133
+ } else {
3134
+ this.source = this.options.source;
3135
+ }
3136
+ },
3137
+
3138
+ _searchTimeout: function( event ) {
3139
+ clearTimeout( this.searching );
3140
+ this.searching = this._delay(function() {
3141
+
3142
+ // Search if the value has changed, or if the user retypes the same value (see #7434)
3143
+ var equalValues = this.term === this._value(),
3144
+ menuVisible = this.menu.element.is( ":visible" ),
3145
+ modifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
3146
+
3147
+ if ( !equalValues || ( equalValues && !menuVisible && !modifierKey ) ) {
3148
+ this.selectedItem = null;
3149
+ this.search( null, event );
3150
+ }
3151
+ }, this.options.delay );
3152
+ },
3153
+
3154
+ search: function( value, event ) {
3155
+ value = value != null ? value : this._value();
3156
+
3157
+ // always save the actual value, not the one passed as an argument
3158
+ this.term = this._value();
3159
+
3160
+ if ( value.length < this.options.minLength ) {
3161
+ return this.close( event );
3162
+ }
3163
+
3164
+ if ( this._trigger( "search", event ) === false ) {
3165
+ return;
3166
+ }
3167
+
3168
+ return this._search( value );
3169
+ },
3170
+
3171
+ _search: function( value ) {
3172
+ this.pending++;
3173
+ this.element.addClass( "ui-autocomplete-loading" );
3174
+ this.cancelSearch = false;
3175
+
3176
+ this.source( { term: value }, this._response() );
3177
+ },
3178
+
3179
+ _response: function() {
3180
+ var index = ++this.requestIndex;
3181
+
3182
+ return $.proxy(function( content ) {
3183
+ if ( index === this.requestIndex ) {
3184
+ this.__response( content );
3185
+ }
3186
+
3187
+ this.pending--;
3188
+ if ( !this.pending ) {
3189
+ this.element.removeClass( "ui-autocomplete-loading" );
3190
+ }
3191
+ }, this );
3192
+ },
3193
+
3194
+ __response: function( content ) {
3195
+ if ( content ) {
3196
+ content = this._normalize( content );
3197
+ }
3198
+ this._trigger( "response", null, { content: content } );
3199
+ if ( !this.options.disabled && content && content.length && !this.cancelSearch ) {
3200
+ this._suggest( content );
3201
+ this._trigger( "open" );
3202
+ } else {
3203
+ // use ._close() instead of .close() so we don't cancel future searches
3204
+ this._close();
3205
+ }
3206
+ },
3207
+
3208
+ close: function( event ) {
3209
+ this.cancelSearch = true;
3210
+ this._close( event );
3211
+ },
3212
+
3213
+ _close: function( event ) {
3214
+ if ( this.menu.element.is( ":visible" ) ) {
3215
+ this.menu.element.hide();
3216
+ this.menu.blur();
3217
+ this.isNewMenu = true;
3218
+ this._trigger( "close", event );
3219
+ }
3220
+ },
3221
+
3222
+ _change: function( event ) {
3223
+ if ( this.previous !== this._value() ) {
3224
+ this._trigger( "change", event, { item: this.selectedItem } );
3225
+ }
3226
+ },
3227
+
3228
+ _normalize: function( items ) {
3229
+ // assume all items have the right format when the first item is complete
3230
+ if ( items.length && items[ 0 ].label && items[ 0 ].value ) {
3231
+ return items;
3232
+ }
3233
+ return $.map( items, function( item ) {
3234
+ if ( typeof item === "string" ) {
3235
+ return {
3236
+ label: item,
3237
+ value: item
3238
+ };
3239
+ }
3240
+ return $.extend( {}, item, {
3241
+ label: item.label || item.value,
3242
+ value: item.value || item.label
3243
+ });
3244
+ });
3245
+ },
3246
+
3247
+ _suggest: function( items ) {
3248
+ var ul = this.menu.element.empty();
3249
+ this._renderMenu( ul, items );
3250
+ this.isNewMenu = true;
3251
+ this.menu.refresh();
3252
+
3253
+ // size and position menu
3254
+ ul.show();
3255
+ this._resizeMenu();
3256
+ ul.position( $.extend({
3257
+ of: this.element
3258
+ }, this.options.position ) );
3259
+
3260
+ if ( this.options.autoFocus ) {
3261
+ this.menu.next();
3262
+ }
3263
+ },
3264
+
3265
+ _resizeMenu: function() {
3266
+ var ul = this.menu.element;
3267
+ ul.outerWidth( Math.max(
3268
+ // Firefox wraps long text (possibly a rounding bug)
3269
+ // so we add 1px to avoid the wrapping (#7513)
3270
+ ul.width( "" ).outerWidth() + 1,
3271
+ this.element.outerWidth()
3272
+ ) );
3273
+ },
3274
+
3275
+ _renderMenu: function( ul, items ) {
3276
+ var that = this;
3277
+ $.each( items, function( index, item ) {
3278
+ that._renderItemData( ul, item );
3279
+ });
3280
+ },
3281
+
3282
+ _renderItemData: function( ul, item ) {
3283
+ return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );
3284
+ },
3285
+
3286
+ _renderItem: function( ul, item ) {
3287
+ return $( "<li>" ).text( item.label ).appendTo( ul );
3288
+ },
3289
+
3290
+ _move: function( direction, event ) {
3291
+ if ( !this.menu.element.is( ":visible" ) ) {
3292
+ this.search( null, event );
3293
+ return;
3294
+ }
3295
+ if ( this.menu.isFirstItem() && /^previous/.test( direction ) ||
3296
+ this.menu.isLastItem() && /^next/.test( direction ) ) {
3297
+
3298
+ if ( !this.isMultiLine ) {
3299
+ this._value( this.term );
3300
+ }
3301
+
3302
+ this.menu.blur();
3303
+ return;
3304
+ }
3305
+ this.menu[ direction ]( event );
3306
+ },
3307
+
3308
+ widget: function() {
3309
+ return this.menu.element;
3310
+ },
3311
+
3312
+ _value: function() {
3313
+ return this.valueMethod.apply( this.element, arguments );
3314
+ },
3315
+
3316
+ _keyEvent: function( keyEvent, event ) {
3317
+ if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
3318
+ this._move( keyEvent, event );
3319
+
3320
+ // prevents moving cursor to beginning/end of the text field in some browsers
3321
+ event.preventDefault();
3322
+ }
3323
+ }
3324
+ });
3325
+
3326
+ $.extend( $.ui.autocomplete, {
3327
+ escapeRegex: function( value ) {
3328
+ return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
3329
+ },
3330
+ filter: function( array, term ) {
3331
+ var matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), "i" );
3332
+ return $.grep( array, function( value ) {
3333
+ return matcher.test( value.label || value.value || value );
3334
+ });
3335
+ }
3336
+ });
3337
+
3338
+ // live region extension, adding a `messages` option
3339
+ // NOTE: This is an experimental API. We are still investigating
3340
+ // a full solution for string manipulation and internationalization.
3341
+ $.widget( "ui.autocomplete", $.ui.autocomplete, {
3342
+ options: {
3343
+ messages: {
3344
+ noResults: "No search results.",
3345
+ results: function( amount ) {
3346
+ return amount + ( amount > 1 ? " results are" : " result is" ) +
3347
+ " available, use up and down arrow keys to navigate.";
3348
+ }
3349
+ }
3350
+ },
3351
+
3352
+ __response: function( content ) {
3353
+ var message;
3354
+ this._superApply( arguments );
3355
+ if ( this.options.disabled || this.cancelSearch ) {
3356
+ return;
3357
+ }
3358
+ if ( content && content.length ) {
3359
+ message = this.options.messages.results( content.length );
3360
+ } else {
3361
+ message = this.options.messages.noResults;
3362
+ }
3363
+ this.liveRegion.children().hide();
3364
+ $( "<div>" ).text( message ).appendTo( this.liveRegion );
3365
+ }
3366
+ });
3367
+
3368
+ var autocomplete = $.ui.autocomplete;
3369
+
3370
+
3371
+ /*!
3372
+ * jQuery UI Button 1.11.4
3373
+ * http://jqueryui.com
3374
+ *
3375
+ * Copyright jQuery Foundation and other contributors
3376
+ * Released under the MIT license.
3377
+ * http://jquery.org/license
3378
+ *
3379
+ * http://api.jqueryui.com/button/
3380
+ */
3381
+
3382
+
3383
+ var lastActive,
3384
+ baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
3385
+ typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",
3386
+ formResetHandler = function() {
3387
+ var form = $( this );
3388
+ setTimeout(function() {
3389
+ form.find( ":ui-button" ).button( "refresh" );
3390
+ }, 1 );
3391
+ },
3392
+ radioGroup = function( radio ) {
3393
+ var name = radio.name,
3394
+ form = radio.form,
3395
+ radios = $( [] );
3396
+ if ( name ) {
3397
+ name = name.replace( /'/g, "\\'" );
3398
+ if ( form ) {
3399
+ radios = $( form ).find( "[name='" + name + "'][type=radio]" );
3400
+ } else {
3401
+ radios = $( "[name='" + name + "'][type=radio]", radio.ownerDocument )
3402
+ .filter(function() {
3403
+ return !this.form;
3404
+ });
3405
+ }
3406
+ }
3407
+ return radios;
3408
+ };
3409
+
3410
+ $.widget( "ui.button", {
3411
+ version: "1.11.4",
3412
+ defaultElement: "<button>",
3413
+ options: {
3414
+ disabled: null,
3415
+ text: true,
3416
+ label: null,
3417
+ icons: {
3418
+ primary: null,
3419
+ secondary: null
3420
+ }
3421
+ },
3422
+ _create: function() {
3423
+ this.element.closest( "form" )
3424
+ .unbind( "reset" + this.eventNamespace )
3425
+ .bind( "reset" + this.eventNamespace, formResetHandler );
3426
+
3427
+ if ( typeof this.options.disabled !== "boolean" ) {
3428
+ this.options.disabled = !!this.element.prop( "disabled" );
3429
+ } else {
3430
+ this.element.prop( "disabled", this.options.disabled );
3431
+ }
3432
+
3433
+ this._determineButtonType();
3434
+ this.hasTitle = !!this.buttonElement.attr( "title" );
3435
+
3436
+ var that = this,
3437
+ options = this.options,
3438
+ toggleButton = this.type === "checkbox" || this.type === "radio",
3439
+ activeClass = !toggleButton ? "ui-state-active" : "";
3440
+
3441
+ if ( options.label === null ) {
3442
+ options.label = (this.type === "input" ? this.buttonElement.val() : this.buttonElement.html());
3443
+ }
3444
+
3445
+ this._hoverable( this.buttonElement );
3446
+
3447
+ this.buttonElement
3448
+ .addClass( baseClasses )
3449
+ .attr( "role", "button" )
3450
+ .bind( "mouseenter" + this.eventNamespace, function() {
3451
+ if ( options.disabled ) {
3452
+ return;
3453
+ }
3454
+ if ( this === lastActive ) {
3455
+ $( this ).addClass( "ui-state-active" );
3456
+ }
3457
+ })
3458
+ .bind( "mouseleave" + this.eventNamespace, function() {
3459
+ if ( options.disabled ) {
3460
+ return;
3461
+ }
3462
+ $( this ).removeClass( activeClass );
3463
+ })
3464
+ .bind( "click" + this.eventNamespace, function( event ) {
3465
+ if ( options.disabled ) {
3466
+ event.preventDefault();
3467
+ event.stopImmediatePropagation();
3468
+ }
3469
+ });
3470
+
3471
+ // Can't use _focusable() because the element that receives focus
3472
+ // and the element that gets the ui-state-focus class are different
3473
+ this._on({
3474
+ focus: function() {
3475
+ this.buttonElement.addClass( "ui-state-focus" );
3476
+ },
3477
+ blur: function() {
3478
+ this.buttonElement.removeClass( "ui-state-focus" );
3479
+ }
3480
+ });
3481
+
3482
+ if ( toggleButton ) {
3483
+ this.element.bind( "change" + this.eventNamespace, function() {
3484
+ that.refresh();
3485
+ });
3486
+ }
3487
+
3488
+ if ( this.type === "checkbox" ) {
3489
+ this.buttonElement.bind( "click" + this.eventNamespace, function() {
3490
+ if ( options.disabled ) {
3491
+ return false;
3492
+ }
3493
+ });
3494
+ } else if ( this.type === "radio" ) {
3495
+ this.buttonElement.bind( "click" + this.eventNamespace, function() {
3496
+ if ( options.disabled ) {
3497
+ return false;
3498
+ }
3499
+ $( this ).addClass( "ui-state-active" );
3500
+ that.buttonElement.attr( "aria-pressed", "true" );
3501
+
3502
+ var radio = that.element[ 0 ];
3503
+ radioGroup( radio )
3504
+ .not( radio )
3505
+ .map(function() {
3506
+ return $( this ).button( "widget" )[ 0 ];
3507
+ })
3508
+ .removeClass( "ui-state-active" )
3509
+ .attr( "aria-pressed", "false" );
3510
+ });
3511
+ } else {
3512
+ this.buttonElement
3513
+ .bind( "mousedown" + this.eventNamespace, function() {
3514
+ if ( options.disabled ) {
3515
+ return false;
3516
+ }
3517
+ $( this ).addClass( "ui-state-active" );
3518
+ lastActive = this;
3519
+ that.document.one( "mouseup", function() {
3520
+ lastActive = null;
3521
+ });
3522
+ })
3523
+ .bind( "mouseup" + this.eventNamespace, function() {
3524
+ if ( options.disabled ) {
3525
+ return false;
3526
+ }
3527
+ $( this ).removeClass( "ui-state-active" );
3528
+ })
3529
+ .bind( "keydown" + this.eventNamespace, function(event) {
3530
+ if ( options.disabled ) {
3531
+ return false;
3532
+ }
3533
+ if ( event.keyCode === $.ui.keyCode.SPACE || event.keyCode === $.ui.keyCode.ENTER ) {
3534
+ $( this ).addClass( "ui-state-active" );
3535
+ }
3536
+ })
3537
+ // see #8559, we bind to blur here in case the button element loses
3538
+ // focus between keydown and keyup, it would be left in an "active" state
3539
+ .bind( "keyup" + this.eventNamespace + " blur" + this.eventNamespace, function() {
3540
+ $( this ).removeClass( "ui-state-active" );
3541
+ });
3542
+
3543
+ if ( this.buttonElement.is("a") ) {
3544
+ this.buttonElement.keyup(function(event) {
3545
+ if ( event.keyCode === $.ui.keyCode.SPACE ) {
3546
+ // TODO pass through original event correctly (just as 2nd argument doesn't work)
3547
+ $( this ).click();
3548
+ }
3549
+ });
3550
+ }
3551
+ }
3552
+
3553
+ this._setOption( "disabled", options.disabled );
3554
+ this._resetButton();
3555
+ },
3556
+
3557
+ _determineButtonType: function() {
3558
+ var ancestor, labelSelector, checked;
3559
+
3560
+ if ( this.element.is("[type=checkbox]") ) {
3561
+ this.type = "checkbox";
3562
+ } else if ( this.element.is("[type=radio]") ) {
3563
+ this.type = "radio";
3564
+ } else if ( this.element.is("input") ) {
3565
+ this.type = "input";
3566
+ } else {
3567
+ this.type = "button";
3568
+ }
3569
+
3570
+ if ( this.type === "checkbox" || this.type === "radio" ) {
3571
+ // we don't search against the document in case the element
3572
+ // is disconnected from the DOM
3573
+ ancestor = this.element.parents().last();
3574
+ labelSelector = "label[for='" + this.element.attr("id") + "']";
3575
+ this.buttonElement = ancestor.find( labelSelector );
3576
+ if ( !this.buttonElement.length ) {
3577
+ ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();
3578
+ this.buttonElement = ancestor.filter( labelSelector );
3579
+ if ( !this.buttonElement.length ) {
3580
+ this.buttonElement = ancestor.find( labelSelector );
3581
+ }
3582
+ }
3583
+ this.element.addClass( "ui-helper-hidden-accessible" );
3584
+
3585
+ checked = this.element.is( ":checked" );
3586
+ if ( checked ) {
3587
+ this.buttonElement.addClass( "ui-state-active" );
3588
+ }
3589
+ this.buttonElement.prop( "aria-pressed", checked );
3590
+ } else {
3591
+ this.buttonElement = this.element;
3592
+ }
3593
+ },
3594
+
3595
+ widget: function() {
3596
+ return this.buttonElement;
3597
+ },
3598
+
3599
+ _destroy: function() {
3600
+ this.element
3601
+ .removeClass( "ui-helper-hidden-accessible" );
3602
+ this.buttonElement
3603
+ .removeClass( baseClasses + " ui-state-active " + typeClasses )
3604
+ .removeAttr( "role" )
3605
+ .removeAttr( "aria-pressed" )
3606
+ .html( this.buttonElement.find(".ui-button-text").html() );
3607
+
3608
+ if ( !this.hasTitle ) {
3609
+ this.buttonElement.removeAttr( "title" );
3610
+ }
3611
+ },
3612
+
3613
+ _setOption: function( key, value ) {
3614
+ this._super( key, value );
3615
+ if ( key === "disabled" ) {
3616
+ this.widget().toggleClass( "ui-state-disabled", !!value );
3617
+ this.element.prop( "disabled", !!value );
3618
+ if ( value ) {
3619
+ if ( this.type === "checkbox" || this.type === "radio" ) {
3620
+ this.buttonElement.removeClass( "ui-state-focus" );
3621
+ } else {
3622
+ this.buttonElement.removeClass( "ui-state-focus ui-state-active" );
3623
+ }
3624
+ }
3625
+ return;
3626
+ }
3627
+ this._resetButton();
3628
+ },
3629
+
3630
+ refresh: function() {
3631
+ //See #8237 & #8828
3632
+ var isDisabled = this.element.is( "input, button" ) ? this.element.is( ":disabled" ) : this.element.hasClass( "ui-button-disabled" );
3633
+
3634
+ if ( isDisabled !== this.options.disabled ) {
3635
+ this._setOption( "disabled", isDisabled );
3636
+ }
3637
+ if ( this.type === "radio" ) {
3638
+ radioGroup( this.element[0] ).each(function() {
3639
+ if ( $( this ).is( ":checked" ) ) {
3640
+ $( this ).button( "widget" )
3641
+ .addClass( "ui-state-active" )
3642
+ .attr( "aria-pressed", "true" );
3643
+ } else {
3644
+ $( this ).button( "widget" )
3645
+ .removeClass( "ui-state-active" )
3646
+ .attr( "aria-pressed", "false" );
3647
+ }
3648
+ });
3649
+ } else if ( this.type === "checkbox" ) {
3650
+ if ( this.element.is( ":checked" ) ) {
3651
+ this.buttonElement
3652
+ .addClass( "ui-state-active" )
3653
+ .attr( "aria-pressed", "true" );
3654
+ } else {
3655
+ this.buttonElement
3656
+ .removeClass( "ui-state-active" )
3657
+ .attr( "aria-pressed", "false" );
3658
+ }
3659
+ }
3660
+ },
3661
+
3662
+ _resetButton: function() {
3663
+ if ( this.type === "input" ) {
3664
+ if ( this.options.label ) {
3665
+ this.element.val( this.options.label );
3666
+ }
3667
+ return;
3668
+ }
3669
+ var buttonElement = this.buttonElement.removeClass( typeClasses ),
3670
+ buttonText = $( "<span></span>", this.document[0] )
3671
+ .addClass( "ui-button-text" )
3672
+ .html( this.options.label )
3673
+ .appendTo( buttonElement.empty() )
3674
+ .text(),
3675
+ icons = this.options.icons,
3676
+ multipleIcons = icons.primary && icons.secondary,
3677
+ buttonClasses = [];
3678
+
3679
+ if ( icons.primary || icons.secondary ) {
3680
+ if ( this.options.text ) {
3681
+ buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ? "s" : ( icons.primary ? "-primary" : "-secondary" ) ) );
3682
+ }
3683
+
3684
+ if ( icons.primary ) {
3685
+ buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" );
3686
+ }
3687
+
3688
+ if ( icons.secondary ) {
3689
+ buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" );
3690
+ }
3691
+
3692
+ if ( !this.options.text ) {
3693
+ buttonClasses.push( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" );
3694
+
3695
+ if ( !this.hasTitle ) {
3696
+ buttonElement.attr( "title", $.trim( buttonText ) );
3697
+ }
3698
+ }
3699
+ } else {
3700
+ buttonClasses.push( "ui-button-text-only" );
3701
+ }
3702
+ buttonElement.addClass( buttonClasses.join( " " ) );
3703
+ }
3704
+ });
3705
+
3706
+ $.widget( "ui.buttonset", {
3707
+ version: "1.11.4",
3708
+ options: {
3709
+ items: "button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"
3710
+ },
3711
+
3712
+ _create: function() {
3713
+ this.element.addClass( "ui-buttonset" );
3714
+ },
3715
+
3716
+ _init: function() {
3717
+ this.refresh();
3718
+ },
3719
+
3720
+ _setOption: function( key, value ) {
3721
+ if ( key === "disabled" ) {
3722
+ this.buttons.button( "option", key, value );
3723
+ }
3724
+
3725
+ this._super( key, value );
3726
+ },
3727
+
3728
+ refresh: function() {
3729
+ var rtl = this.element.css( "direction" ) === "rtl",
3730
+ allButtons = this.element.find( this.options.items ),
3731
+ existingButtons = allButtons.filter( ":ui-button" );
3732
+
3733
+ // Initialize new buttons
3734
+ allButtons.not( ":ui-button" ).button();
3735
+
3736
+ // Refresh existing buttons
3737
+ existingButtons.button( "refresh" );
3738
+
3739
+ this.buttons = allButtons
3740
+ .map(function() {
3741
+ return $( this ).button( "widget" )[ 0 ];
3742
+ })
3743
+ .removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
3744
+ .filter( ":first" )
3745
+ .addClass( rtl ? "ui-corner-right" : "ui-corner-left" )
3746
+ .end()
3747
+ .filter( ":last" )
3748
+ .addClass( rtl ? "ui-corner-left" : "ui-corner-right" )
3749
+ .end()
3750
+ .end();
3751
+ },
3752
+
3753
+ _destroy: function() {
3754
+ this.element.removeClass( "ui-buttonset" );
3755
+ this.buttons
3756
+ .map(function() {
3757
+ return $( this ).button( "widget" )[ 0 ];
3758
+ })
3759
+ .removeClass( "ui-corner-left ui-corner-right" )
3760
+ .end()
3761
+ .button( "destroy" );
3762
+ }
3763
+ });
3764
+
3765
+ var button = $.ui.button;
3766
+
3767
+
3768
+ /*!
3769
+ * jQuery UI Datepicker 1.11.4
3770
+ * http://jqueryui.com
3771
+ *
3772
+ * Copyright jQuery Foundation and other contributors
3773
+ * Released under the MIT license.
3774
+ * http://jquery.org/license
3775
+ *
3776
+ * http://api.jqueryui.com/datepicker/
3777
+ */
3778
+
3779
+
3780
+ $.extend($.ui, { datepicker: { version: "1.11.4" } });
3781
+
3782
+ var datepicker_instActive;
3783
+
3784
+ function datepicker_getZindex( elem ) {
3785
+ var position, value;
3786
+ while ( elem.length && elem[ 0 ] !== document ) {
3787
+ // Ignore z-index if position is set to a value where z-index is ignored by the browser
3788
+ // This makes behavior of this function consistent across browsers
3789
+ // WebKit always returns auto if the element is positioned
3790
+ position = elem.css( "position" );
3791
+ if ( position === "absolute" || position === "relative" || position === "fixed" ) {
3792
+ // IE returns 0 when zIndex is not specified
3793
+ // other browsers return a string
3794
+ // we ignore the case of nested elements with an explicit value of 0
3795
+ // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
3796
+ value = parseInt( elem.css( "zIndex" ), 10 );
3797
+ if ( !isNaN( value ) && value !== 0 ) {
3798
+ return value;
3799
+ }
3800
+ }
3801
+ elem = elem.parent();
3802
+ }
3803
+
3804
+ return 0;
3805
+ }
3806
+ /* Date picker manager.
3807
+ Use the singleton instance of this class, $.datepicker, to interact with the date picker.
3808
+ Settings for (groups of) date pickers are maintained in an instance object,
3809
+ allowing multiple different settings on the same page. */
3810
+
3811
+ function Datepicker() {
3812
+ this._curInst = null; // The current instance in use
3813
+ this._keyEvent = false; // If the last event was a key event
3814
+ this._disabledInputs = []; // List of date picker inputs that have been disabled
3815
+ this._datepickerShowing = false; // True if the popup picker is showing , false if not
3816
+ this._inDialog = false; // True if showing within a "dialog", false if not
3817
+ this._mainDivId = "ui-datepicker-div"; // The ID of the main datepicker division
3818
+ this._inlineClass = "ui-datepicker-inline"; // The name of the inline marker class
3819
+ this._appendClass = "ui-datepicker-append"; // The name of the append marker class
3820
+ this._triggerClass = "ui-datepicker-trigger"; // The name of the trigger marker class
3821
+ this._dialogClass = "ui-datepicker-dialog"; // The name of the dialog marker class
3822
+ this._disableClass = "ui-datepicker-disabled"; // The name of the disabled covering marker class
3823
+ this._unselectableClass = "ui-datepicker-unselectable"; // The name of the unselectable cell marker class
3824
+ this._currentClass = "ui-datepicker-current-day"; // The name of the current day marker class
3825
+ this._dayOverClass = "ui-datepicker-days-cell-over"; // The name of the day hover marker class
3826
+ this.regional = []; // Available regional settings, indexed by language code
3827
+ this.regional[""] = { // Default regional settings
3828
+ closeText: "Done", // Display text for close link
3829
+ prevText: "Prev", // Display text for previous month link
3830
+ nextText: "Next", // Display text for next month link
3831
+ currentText: "Today", // Display text for current month link
3832
+ monthNames: ["January","February","March","April","May","June",
3833
+ "July","August","September","October","November","December"], // Names of months for drop-down and formatting
3834
+ monthNamesShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], // For formatting
3835
+ dayNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], // For formatting
3836
+ dayNamesShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], // For formatting
3837
+ dayNamesMin: ["Su","Mo","Tu","We","Th","Fr","Sa"], // Column headings for days starting at Sunday
3838
+ weekHeader: "Wk", // Column header for week of the year
3839
+ dateFormat: "mm/dd/yy", // See format options on parseDate
3840
+ firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
3841
+ isRTL: false, // True if right-to-left language, false if left-to-right
3842
+ showMonthAfterYear: false, // True if the year select precedes month, false for month then year
3843
+ yearSuffix: "" // Additional text to append to the year in the month headers
3844
+ };
3845
+ this._defaults = { // Global defaults for all the date picker instances
3846
+ showOn: "focus", // "focus" for popup on focus,
3847
+ // "button" for trigger button, or "both" for either
3848
+ showAnim: "fadeIn", // Name of jQuery animation for popup
3849
+ showOptions: {}, // Options for enhanced animations
3850
+ defaultDate: null, // Used when field is blank: actual date,
3851
+ // +/-number for offset from today, null for today
3852
+ appendText: "", // Display text following the input box, e.g. showing the format
3853
+ buttonText: "...", // Text for trigger button
3854
+ buttonImage: "", // URL for trigger button image
3855
+ buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
3856
+ hideIfNoPrevNext: false, // True to hide next/previous month links
3857
+ // if not applicable, false to just disable them
3858
+ navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
3859
+ gotoCurrent: false, // True if today link goes back to current selection instead
3860
+ changeMonth: false, // True if month can be selected directly, false if only prev/next
3861
+ changeYear: false, // True if year can be selected directly, false if only prev/next
3862
+ yearRange: "c-10:c+10", // Range of years to display in drop-down,
3863
+ // either relative to today's year (-nn:+nn), relative to currently displayed year
3864
+ // (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
3865
+ showOtherMonths: false, // True to show dates in other months, false to leave blank
3866
+ selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
3867
+ showWeek: false, // True to show week of the year, false to not show it
3868
+ calculateWeek: this.iso8601Week, // How to calculate the week of the year,
3869
+ // takes a Date and returns the number of the week for it
3870
+ shortYearCutoff: "+10", // Short year values < this are in the current century,
3871
+ // > this are in the previous century,
3872
+ // string value starting with "+" for current year + value
3873
+ minDate: null, // The earliest selectable date, or null for no limit
3874
+ maxDate: null, // The latest selectable date, or null for no limit
3875
+ duration: "fast", // Duration of display/closure
3876
+ beforeShowDay: null, // Function that takes a date and returns an array with
3877
+ // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or "",
3878
+ // [2] = cell title (optional), e.g. $.datepicker.noWeekends
3879
+ beforeShow: null, // Function that takes an input field and
3880
+ // returns a set of custom settings for the date picker
3881
+ onSelect: null, // Define a callback function when a date is selected
3882
+ onChangeMonthYear: null, // Define a callback function when the month or year is changed
3883
+ onClose: null, // Define a callback function when the datepicker is closed
3884
+ numberOfMonths: 1, // Number of months to show at a time
3885
+ showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
3886
+ stepMonths: 1, // Number of months to step back/forward
3887
+ stepBigMonths: 12, // Number of months to step back/forward for the big links
3888
+ altField: "", // Selector for an alternate field to store selected dates into
3889
+ altFormat: "", // The date format to use for the alternate field
3890
+ constrainInput: true, // The input is constrained by the current date format
3891
+ showButtonPanel: false, // True to show button panel, false to not show it
3892
+ autoSize: false, // True to size the input for the date format, false to leave as is
3893
+ disabled: false // The initial disabled state
3894
+ };
3895
+ $.extend(this._defaults, this.regional[""]);
3896
+ this.regional.en = $.extend( true, {}, this.regional[ "" ]);
3897
+ this.regional[ "en-US" ] = $.extend( true, {}, this.regional.en );
3898
+ this.dpDiv = datepicker_bindHover($("<div id='" + this._mainDivId + "' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"));
3899
+ }
3900
+
3901
+ $.extend(Datepicker.prototype, {
3902
+ /* Class name added to elements to indicate already configured with a date picker. */
3903
+ markerClassName: "hasDatepicker",
3904
+
3905
+ //Keep track of the maximum number of rows displayed (see #7043)
3906
+ maxRows: 4,
3907
+
3908
+ // TODO rename to "widget" when switching to widget factory
3909
+ _widgetDatepicker: function() {
3910
+ return this.dpDiv;
3911
+ },
3912
+
3913
+ /* Override the default settings for all instances of the date picker.
3914
+ * @param settings object - the new settings to use as defaults (anonymous object)
3915
+ * @return the manager object
3916
+ */
3917
+ setDefaults: function(settings) {
3918
+ datepicker_extendRemove(this._defaults, settings || {});
3919
+ return this;
3920
+ },
3921
+
3922
+ /* Attach the date picker to a jQuery selection.
3923
+ * @param target element - the target input field or division or span
3924
+ * @param settings object - the new settings to use for this date picker instance (anonymous)
3925
+ */
3926
+ _attachDatepicker: function(target, settings) {
3927
+ var nodeName, inline, inst;
3928
+ nodeName = target.nodeName.toLowerCase();
3929
+ inline = (nodeName === "div" || nodeName === "span");
3930
+ if (!target.id) {
3931
+ this.uuid += 1;
3932
+ target.id = "dp" + this.uuid;
3933
+ }
3934
+ inst = this._newInst($(target), inline);
3935
+ inst.settings = $.extend({}, settings || {});
3936
+ if (nodeName === "input") {
3937
+ this._connectDatepicker(target, inst);
3938
+ } else if (inline) {
3939
+ this._inlineDatepicker(target, inst);
3940
+ }
3941
+ },
3942
+
3943
+ /* Create a new instance object. */
3944
+ _newInst: function(target, inline) {
3945
+ var id = target[0].id.replace(/([^A-Za-z0-9_\-])/g, "\\\\$1"); // escape jQuery meta chars
3946
+ return {id: id, input: target, // associated target
3947
+ selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
3948
+ drawMonth: 0, drawYear: 0, // month being drawn
3949
+ inline: inline, // is datepicker inline or not
3950
+ dpDiv: (!inline ? this.dpDiv : // presentation div
3951
+ datepicker_bindHover($("<div class='" + this._inlineClass + " ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")))};
3952
+ },
3953
+
3954
+ /* Attach the date picker to an input field. */
3955
+ _connectDatepicker: function(target, inst) {
3956
+ var input = $(target);
3957
+ inst.append = $([]);
3958
+ inst.trigger = $([]);
3959
+ if (input.hasClass(this.markerClassName)) {
3960
+ return;
3961
+ }
3962
+ this._attachments(input, inst);
3963
+ input.addClass(this.markerClassName).keydown(this._doKeyDown).
3964
+ keypress(this._doKeyPress).keyup(this._doKeyUp);
3965
+ this._autoSize(inst);
3966
+ $.data(target, "datepicker", inst);
3967
+ //If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
3968
+ if( inst.settings.disabled ) {
3969
+ this._disableDatepicker( target );
3970
+ }
3971
+ },
3972
+
3973
+ /* Make attachments based on settings. */
3974
+ _attachments: function(input, inst) {
3975
+ var showOn, buttonText, buttonImage,
3976
+ appendText = this._get(inst, "appendText"),
3977
+ isRTL = this._get(inst, "isRTL");
3978
+
3979
+ if (inst.append) {
3980
+ inst.append.remove();
3981
+ }
3982
+ if (appendText) {
3983
+ inst.append = $("<span class='" + this._appendClass + "'>" + appendText + "</span>");
3984
+ input[isRTL ? "before" : "after"](inst.append);
3985
+ }
3986
+
3987
+ input.unbind("focus", this._showDatepicker);
3988
+
3989
+ if (inst.trigger) {
3990
+ inst.trigger.remove();
3991
+ }
3992
+
3993
+ showOn = this._get(inst, "showOn");
3994
+ if (showOn === "focus" || showOn === "both") { // pop-up date picker when in the marked field
3995
+ input.focus(this._showDatepicker);
3996
+ }
3997
+ if (showOn === "button" || showOn === "both") { // pop-up date picker when button clicked
3998
+ buttonText = this._get(inst, "buttonText");
3999
+ buttonImage = this._get(inst, "buttonImage");
4000
+ inst.trigger = $(this._get(inst, "buttonImageOnly") ?
4001
+ $("<img/>").addClass(this._triggerClass).
4002
+ attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
4003
+ $("<button type='button'></button>").addClass(this._triggerClass).
4004
+ html(!buttonImage ? buttonText : $("<img/>").attr(
4005
+ { src:buttonImage, alt:buttonText, title:buttonText })));
4006
+ input[isRTL ? "before" : "after"](inst.trigger);
4007
+ inst.trigger.click(function() {
4008
+ if ($.datepicker._datepickerShowing && $.datepicker._lastInput === input[0]) {
4009
+ $.datepicker._hideDatepicker();
4010
+ } else if ($.datepicker._datepickerShowing && $.datepicker._lastInput !== input[0]) {
4011
+ $.datepicker._hideDatepicker();
4012
+ $.datepicker._showDatepicker(input[0]);
4013
+ } else {
4014
+ $.datepicker._showDatepicker(input[0]);
4015
+ }
4016
+ return false;
4017
+ });
4018
+ }
4019
+ },
4020
+
4021
+ /* Apply the maximum length for the date format. */
4022
+ _autoSize: function(inst) {
4023
+ if (this._get(inst, "autoSize") && !inst.inline) {
4024
+ var findMax, max, maxI, i,
4025
+ date = new Date(2009, 12 - 1, 20), // Ensure double digits
4026
+ dateFormat = this._get(inst, "dateFormat");
4027
+
4028
+ if (dateFormat.match(/[DM]/)) {
4029
+ findMax = function(names) {
4030
+ max = 0;
4031
+ maxI = 0;
4032
+ for (i = 0; i < names.length; i++) {
4033
+ if (names[i].length > max) {
4034
+ max = names[i].length;
4035
+ maxI = i;
4036
+ }
4037
+ }
4038
+ return maxI;
4039
+ };
4040
+ date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ?
4041
+ "monthNames" : "monthNamesShort"))));
4042
+ date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ?
4043
+ "dayNames" : "dayNamesShort"))) + 20 - date.getDay());
4044
+ }
4045
+ inst.input.attr("size", this._formatDate(inst, date).length);
4046
+ }
4047
+ },
4048
+
4049
+ /* Attach an inline date picker to a div. */
4050
+ _inlineDatepicker: function(target, inst) {
4051
+ var divSpan = $(target);
4052
+ if (divSpan.hasClass(this.markerClassName)) {
4053
+ return;
4054
+ }
4055
+ divSpan.addClass(this.markerClassName).append(inst.dpDiv);
4056
+ $.data(target, "datepicker", inst);
4057
+ this._setDate(inst, this._getDefaultDate(inst), true);
4058
+ this._updateDatepicker(inst);
4059
+ this._updateAlternate(inst);
4060
+ //If disabled option is true, disable the datepicker before showing it (see ticket #5665)
4061
+ if( inst.settings.disabled ) {
4062
+ this._disableDatepicker( target );
4063
+ }
4064
+ // Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
4065
+ // http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
4066
+ inst.dpDiv.css( "display", "block" );
4067
+ },
4068
+
4069
+ /* Pop-up the date picker in a "dialog" box.
4070
+ * @param input element - ignored
4071
+ * @param date string or Date - the initial date to display
4072
+ * @param onSelect function - the function to call when a date is selected
4073
+ * @param settings object - update the dialog date picker instance's settings (anonymous object)
4074
+ * @param pos int[2] - coordinates for the dialog's position within the screen or
4075
+ * event - with x/y coordinates or
4076
+ * leave empty for default (screen centre)
4077
+ * @return the manager object
4078
+ */
4079
+ _dialogDatepicker: function(input, date, onSelect, settings, pos) {
4080
+ var id, browserWidth, browserHeight, scrollX, scrollY,
4081
+ inst = this._dialogInst; // internal instance
4082
+
4083
+ if (!inst) {
4084
+ this.uuid += 1;
4085
+ id = "dp" + this.uuid;
4086
+ this._dialogInput = $("<input type='text' id='" + id +
4087
+ "' style='position: absolute; top: -100px; width: 0px;'/>");
4088
+ this._dialogInput.keydown(this._doKeyDown);
4089
+ $("body").append(this._dialogInput);
4090
+ inst = this._dialogInst = this._newInst(this._dialogInput, false);
4091
+ inst.settings = {};
4092
+ $.data(this._dialogInput[0], "datepicker", inst);
4093
+ }
4094
+ datepicker_extendRemove(inst.settings, settings || {});
4095
+ date = (date && date.constructor === Date ? this._formatDate(inst, date) : date);
4096
+ this._dialogInput.val(date);
4097
+
4098
+ this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
4099
+ if (!this._pos) {
4100
+ browserWidth = document.documentElement.clientWidth;
4101
+ browserHeight = document.documentElement.clientHeight;
4102
+ scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
4103
+ scrollY = document.documentElement.scrollTop || document.body.scrollTop;
4104
+ this._pos = // should use actual width/height below
4105
+ [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];
4106
+ }
4107
+
4108
+ // move input on screen for focus, but hidden behind dialog
4109
+ this._dialogInput.css("left", (this._pos[0] + 20) + "px").css("top", this._pos[1] + "px");
4110
+ inst.settings.onSelect = onSelect;
4111
+ this._inDialog = true;
4112
+ this.dpDiv.addClass(this._dialogClass);
4113
+ this._showDatepicker(this._dialogInput[0]);
4114
+ if ($.blockUI) {
4115
+ $.blockUI(this.dpDiv);
4116
+ }
4117
+ $.data(this._dialogInput[0], "datepicker", inst);
4118
+ return this;
4119
+ },
4120
+
4121
+ /* Detach a datepicker from its control.
4122
+ * @param target element - the target input field or division or span
4123
+ */
4124
+ _destroyDatepicker: function(target) {
4125
+ var nodeName,
4126
+ $target = $(target),
4127
+ inst = $.data(target, "datepicker");
4128
+
4129
+ if (!$target.hasClass(this.markerClassName)) {
4130
+ return;
4131
+ }
4132
+
4133
+ nodeName = target.nodeName.toLowerCase();
4134
+ $.removeData(target, "datepicker");
4135
+ if (nodeName === "input") {
4136
+ inst.append.remove();
4137
+ inst.trigger.remove();
4138
+ $target.removeClass(this.markerClassName).
4139
+ unbind("focus", this._showDatepicker).
4140
+ unbind("keydown", this._doKeyDown).
4141
+ unbind("keypress", this._doKeyPress).
4142
+ unbind("keyup", this._doKeyUp);
4143
+ } else if (nodeName === "div" || nodeName === "span") {
4144
+ $target.removeClass(this.markerClassName).empty();
4145
+ }
4146
+
4147
+ if ( datepicker_instActive === inst ) {
4148
+ datepicker_instActive = null;
4149
+ }
4150
+ },
4151
+
4152
+ /* Enable the date picker to a jQuery selection.
4153
+ * @param target element - the target input field or division or span
4154
+ */
4155
+ _enableDatepicker: function(target) {
4156
+ var nodeName, inline,
4157
+ $target = $(target),
4158
+ inst = $.data(target, "datepicker");
4159
+
4160
+ if (!$target.hasClass(this.markerClassName)) {
4161
+ return;
4162
+ }
4163
+
4164
+ nodeName = target.nodeName.toLowerCase();
4165
+ if (nodeName === "input") {
4166
+ target.disabled = false;
4167
+ inst.trigger.filter("button").
4168
+ each(function() { this.disabled = false; }).end().
4169
+ filter("img").css({opacity: "1.0", cursor: ""});
4170
+ } else if (nodeName === "div" || nodeName === "span") {
4171
+ inline = $target.children("." + this._inlineClass);
4172
+ inline.children().removeClass("ui-state-disabled");
4173
+ inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
4174
+ prop("disabled", false);
4175
+ }
4176
+ this._disabledInputs = $.map(this._disabledInputs,
4177
+ function(value) { return (value === target ? null : value); }); // delete entry
4178
+ },
4179
+
4180
+ /* Disable the date picker to a jQuery selection.
4181
+ * @param target element - the target input field or division or span
4182
+ */
4183
+ _disableDatepicker: function(target) {
4184
+ var nodeName, inline,
4185
+ $target = $(target),
4186
+ inst = $.data(target, "datepicker");
4187
+
4188
+ if (!$target.hasClass(this.markerClassName)) {
4189
+ return;
4190
+ }
4191
+
4192
+ nodeName = target.nodeName.toLowerCase();
4193
+ if (nodeName === "input") {
4194
+ target.disabled = true;
4195
+ inst.trigger.filter("button").
4196
+ each(function() { this.disabled = true; }).end().
4197
+ filter("img").css({opacity: "0.5", cursor: "default"});
4198
+ } else if (nodeName === "div" || nodeName === "span") {
4199
+ inline = $target.children("." + this._inlineClass);
4200
+ inline.children().addClass("ui-state-disabled");
4201
+ inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
4202
+ prop("disabled", true);
4203
+ }
4204
+ this._disabledInputs = $.map(this._disabledInputs,
4205
+ function(value) { return (value === target ? null : value); }); // delete entry
4206
+ this._disabledInputs[this._disabledInputs.length] = target;
4207
+ },
4208
+
4209
+ /* Is the first field in a jQuery collection disabled as a datepicker?
4210
+ * @param target element - the target input field or division or span
4211
+ * @return boolean - true if disabled, false if enabled
4212
+ */
4213
+ _isDisabledDatepicker: function(target) {
4214
+ if (!target) {
4215
+ return false;
4216
+ }
4217
+ for (var i = 0; i < this._disabledInputs.length; i++) {
4218
+ if (this._disabledInputs[i] === target) {
4219
+ return true;
4220
+ }
4221
+ }
4222
+ return false;
4223
+ },
4224
+
4225
+ /* Retrieve the instance data for the target control.
4226
+ * @param target element - the target input field or division or span
4227
+ * @return object - the associated instance data
4228
+ * @throws error if a jQuery problem getting data
4229
+ */
4230
+ _getInst: function(target) {
4231
+ try {
4232
+ return $.data(target, "datepicker");
4233
+ }
4234
+ catch (err) {
4235
+ throw "Missing instance data for this datepicker";
4236
+ }
4237
+ },
4238
+
4239
+ /* Update or retrieve the settings for a date picker attached to an input field or division.
4240
+ * @param target element - the target input field or division or span
4241
+ * @param name object - the new settings to update or
4242
+ * string - the name of the setting to change or retrieve,
4243
+ * when retrieving also "all" for all instance settings or
4244
+ * "defaults" for all global defaults
4245
+ * @param value any - the new value for the setting
4246
+ * (omit if above is an object or to retrieve a value)
4247
+ */
4248
+ _optionDatepicker: function(target, name, value) {
4249
+ var settings, date, minDate, maxDate,
4250
+ inst = this._getInst(target);
4251
+
4252
+ if (arguments.length === 2 && typeof name === "string") {
4253
+ return (name === "defaults" ? $.extend({}, $.datepicker._defaults) :
4254
+ (inst ? (name === "all" ? $.extend({}, inst.settings) :
4255
+ this._get(inst, name)) : null));
4256
+ }
4257
+
4258
+ settings = name || {};
4259
+ if (typeof name === "string") {
4260
+ settings = {};
4261
+ settings[name] = value;
4262
+ }
4263
+
4264
+ if (inst) {
4265
+ if (this._curInst === inst) {
4266
+ this._hideDatepicker();
4267
+ }
4268
+
4269
+ date = this._getDateDatepicker(target, true);
4270
+ minDate = this._getMinMaxDate(inst, "min");
4271
+ maxDate = this._getMinMaxDate(inst, "max");
4272
+ datepicker_extendRemove(inst.settings, settings);
4273
+ // reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
4274
+ if (minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined) {
4275
+ inst.settings.minDate = this._formatDate(inst, minDate);
4276
+ }
4277
+ if (maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined) {
4278
+ inst.settings.maxDate = this._formatDate(inst, maxDate);
4279
+ }
4280
+ if ( "disabled" in settings ) {
4281
+ if ( settings.disabled ) {
4282
+ this._disableDatepicker(target);
4283
+ } else {
4284
+ this._enableDatepicker(target);
4285
+ }
4286
+ }
4287
+ this._attachments($(target), inst);
4288
+ this._autoSize(inst);
4289
+ this._setDate(inst, date);
4290
+ this._updateAlternate(inst);
4291
+ this._updateDatepicker(inst);
4292
+ }
4293
+ },
4294
+
4295
+ // change method deprecated
4296
+ _changeDatepicker: function(target, name, value) {
4297
+ this._optionDatepicker(target, name, value);
4298
+ },
4299
+
4300
+ /* Redraw the date picker attached to an input field or division.
4301
+ * @param target element - the target input field or division or span
4302
+ */
4303
+ _refreshDatepicker: function(target) {
4304
+ var inst = this._getInst(target);
4305
+ if (inst) {
4306
+ this._updateDatepicker(inst);
4307
+ }
4308
+ },
4309
+
4310
+ /* Set the dates for a jQuery selection.
4311
+ * @param target element - the target input field or division or span
4312
+ * @param date Date - the new date
4313
+ */
4314
+ _setDateDatepicker: function(target, date) {
4315
+ var inst = this._getInst(target);
4316
+ if (inst) {
4317
+ this._setDate(inst, date);
4318
+ this._updateDatepicker(inst);
4319
+ this._updateAlternate(inst);
4320
+ }
4321
+ },
4322
+
4323
+ /* Get the date(s) for the first entry in a jQuery selection.
4324
+ * @param target element - the target input field or division or span
4325
+ * @param noDefault boolean - true if no default date is to be used
4326
+ * @return Date - the current date
4327
+ */
4328
+ _getDateDatepicker: function(target, noDefault) {
4329
+ var inst = this._getInst(target);
4330
+ if (inst && !inst.inline) {
4331
+ this._setDateFromField(inst, noDefault);
4332
+ }
4333
+ return (inst ? this._getDate(inst) : null);
4334
+ },
4335
+
4336
+ /* Handle keystrokes. */
4337
+ _doKeyDown: function(event) {
4338
+ var onSelect, dateStr, sel,
4339
+ inst = $.datepicker._getInst(event.target),
4340
+ handled = true,
4341
+ isRTL = inst.dpDiv.is(".ui-datepicker-rtl");
4342
+
4343
+ inst._keyEvent = true;
4344
+ if ($.datepicker._datepickerShowing) {
4345
+ switch (event.keyCode) {
4346
+ case 9: $.datepicker._hideDatepicker();
4347
+ handled = false;
4348
+ break; // hide on tab out
4349
+ case 13: sel = $("td." + $.datepicker._dayOverClass + ":not(." +
4350
+ $.datepicker._currentClass + ")", inst.dpDiv);
4351
+ if (sel[0]) {
4352
+ $.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);
4353
+ }
4354
+
4355
+ onSelect = $.datepicker._get(inst, "onSelect");
4356
+ if (onSelect) {
4357
+ dateStr = $.datepicker._formatDate(inst);
4358
+
4359
+ // trigger custom callback
4360
+ onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);
4361
+ } else {
4362
+ $.datepicker._hideDatepicker();
4363
+ }
4364
+
4365
+ return false; // don't submit the form
4366
+ case 27: $.datepicker._hideDatepicker();
4367
+ break; // hide on escape
4368
+ case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
4369
+ -$.datepicker._get(inst, "stepBigMonths") :
4370
+ -$.datepicker._get(inst, "stepMonths")), "M");
4371
+ break; // previous month/year on page up/+ ctrl
4372
+ case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
4373
+ +$.datepicker._get(inst, "stepBigMonths") :
4374
+ +$.datepicker._get(inst, "stepMonths")), "M");
4375
+ break; // next month/year on page down/+ ctrl
4376
+ case 35: if (event.ctrlKey || event.metaKey) {
4377
+ $.datepicker._clearDate(event.target);
4378
+ }
4379
+ handled = event.ctrlKey || event.metaKey;
4380
+ break; // clear on ctrl or command +end
4381
+ case 36: if (event.ctrlKey || event.metaKey) {
4382
+ $.datepicker._gotoToday(event.target);
4383
+ }
4384
+ handled = event.ctrlKey || event.metaKey;
4385
+ break; // current on ctrl or command +home
4386
+ case 37: if (event.ctrlKey || event.metaKey) {
4387
+ $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), "D");
4388
+ }
4389
+ handled = event.ctrlKey || event.metaKey;
4390
+ // -1 day on ctrl or command +left
4391
+ if (event.originalEvent.altKey) {
4392
+ $.datepicker._adjustDate(event.target, (event.ctrlKey ?
4393
+ -$.datepicker._get(inst, "stepBigMonths") :
4394
+ -$.datepicker._get(inst, "stepMonths")), "M");
4395
+ }
4396
+ // next month/year on alt +left on Mac
4397
+ break;
4398
+ case 38: if (event.ctrlKey || event.metaKey) {
4399
+ $.datepicker._adjustDate(event.target, -7, "D");
4400
+ }
4401
+ handled = event.ctrlKey || event.metaKey;
4402
+ break; // -1 week on ctrl or command +up
4403
+ case 39: if (event.ctrlKey || event.metaKey) {
4404
+ $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), "D");
4405
+ }
4406
+ handled = event.ctrlKey || event.metaKey;
4407
+ // +1 day on ctrl or command +right
4408
+ if (event.originalEvent.altKey) {
4409
+ $.datepicker._adjustDate(event.target, (event.ctrlKey ?
4410
+ +$.datepicker._get(inst, "stepBigMonths") :
4411
+ +$.datepicker._get(inst, "stepMonths")), "M");
4412
+ }
4413
+ // next month/year on alt +right
4414
+ break;
4415
+ case 40: if (event.ctrlKey || event.metaKey) {
4416
+ $.datepicker._adjustDate(event.target, +7, "D");
4417
+ }
4418
+ handled = event.ctrlKey || event.metaKey;
4419
+ break; // +1 week on ctrl or command +down
4420
+ default: handled = false;
4421
+ }
4422
+ } else if (event.keyCode === 36 && event.ctrlKey) { // display the date picker on ctrl+home
4423
+ $.datepicker._showDatepicker(this);
4424
+ } else {
4425
+ handled = false;
4426
+ }
4427
+
4428
+ if (handled) {
4429
+ event.preventDefault();
4430
+ event.stopPropagation();
4431
+ }
4432
+ },
4433
+
4434
+ /* Filter entered characters - based on date format. */
4435
+ _doKeyPress: function(event) {
4436
+ var chars, chr,
4437
+ inst = $.datepicker._getInst(event.target);
4438
+
4439
+ if ($.datepicker._get(inst, "constrainInput")) {
4440
+ chars = $.datepicker._possibleChars($.datepicker._get(inst, "dateFormat"));
4441
+ chr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode);
4442
+ return event.ctrlKey || event.metaKey || (chr < " " || !chars || chars.indexOf(chr) > -1);
4443
+ }
4444
+ },
4445
+
4446
+ /* Synchronise manual entry and field/alternate field. */
4447
+ _doKeyUp: function(event) {
4448
+ var date,
4449
+ inst = $.datepicker._getInst(event.target);
4450
+
4451
+ if (inst.input.val() !== inst.lastVal) {
4452
+ try {
4453
+ date = $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"),
4454
+ (inst.input ? inst.input.val() : null),
4455
+ $.datepicker._getFormatConfig(inst));
4456
+
4457
+ if (date) { // only if valid
4458
+ $.datepicker._setDateFromField(inst);
4459
+ $.datepicker._updateAlternate(inst);
4460
+ $.datepicker._updateDatepicker(inst);
4461
+ }
4462
+ }
4463
+ catch (err) {
4464
+ }
4465
+ }
4466
+ return true;
4467
+ },
4468
+
4469
+ /* Pop-up the date picker for a given input field.
4470
+ * If false returned from beforeShow event handler do not show.
4471
+ * @param input element - the input field attached to the date picker or
4472
+ * event - if triggered by focus
4473
+ */
4474
+ _showDatepicker: function(input) {
4475
+ input = input.target || input;
4476
+ if (input.nodeName.toLowerCase() !== "input") { // find from button/image trigger
4477
+ input = $("input", input.parentNode)[0];
4478
+ }
4479
+
4480
+ if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput === input) { // already here
4481
+ return;
4482
+ }
4483
+
4484
+ var inst, beforeShow, beforeShowSettings, isFixed,
4485
+ offset, showAnim, duration;
4486
+
4487
+ inst = $.datepicker._getInst(input);
4488
+ if ($.datepicker._curInst && $.datepicker._curInst !== inst) {
4489
+ $.datepicker._curInst.dpDiv.stop(true, true);
4490
+ if ( inst && $.datepicker._datepickerShowing ) {
4491
+ $.datepicker._hideDatepicker( $.datepicker._curInst.input[0] );
4492
+ }
4493
+ }
4494
+
4495
+ beforeShow = $.datepicker._get(inst, "beforeShow");
4496
+ beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {};
4497
+ if(beforeShowSettings === false){
4498
+ return;
4499
+ }
4500
+ datepicker_extendRemove(inst.settings, beforeShowSettings);
4501
+
4502
+ inst.lastVal = null;
4503
+ $.datepicker._lastInput = input;
4504
+ $.datepicker._setDateFromField(inst);
4505
+
4506
+ if ($.datepicker._inDialog) { // hide cursor
4507
+ input.value = "";
4508
+ }
4509
+ if (!$.datepicker._pos) { // position below input
4510
+ $.datepicker._pos = $.datepicker._findPos(input);
4511
+ $.datepicker._pos[1] += input.offsetHeight; // add the height
4512
+ }
4513
+
4514
+ isFixed = false;
4515
+ $(input).parents().each(function() {
4516
+ isFixed |= $(this).css("position") === "fixed";
4517
+ return !isFixed;
4518
+ });
4519
+
4520
+ offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
4521
+ $.datepicker._pos = null;
4522
+ //to avoid flashes on Firefox
4523
+ inst.dpDiv.empty();
4524
+ // determine sizing offscreen
4525
+ inst.dpDiv.css({position: "absolute", display: "block", top: "-1000px"});
4526
+ $.datepicker._updateDatepicker(inst);
4527
+ // fix width for dynamic number of date pickers
4528
+ // and adjust position before showing
4529
+ offset = $.datepicker._checkOffset(inst, offset, isFixed);
4530
+ inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?
4531
+ "static" : (isFixed ? "fixed" : "absolute")), display: "none",
4532
+ left: offset.left + "px", top: offset.top + "px"});
4533
+
4534
+ if (!inst.inline) {
4535
+ showAnim = $.datepicker._get(inst, "showAnim");
4536
+ duration = $.datepicker._get(inst, "duration");
4537
+ inst.dpDiv.css( "z-index", datepicker_getZindex( $( input ) ) + 1 );
4538
+ $.datepicker._datepickerShowing = true;
4539
+
4540
+ if ( $.effects && $.effects.effect[ showAnim ] ) {
4541
+ inst.dpDiv.show(showAnim, $.datepicker._get(inst, "showOptions"), duration);
4542
+ } else {
4543
+ inst.dpDiv[showAnim || "show"](showAnim ? duration : null);
4544
+ }
4545
+
4546
+ if ( $.datepicker._shouldFocusInput( inst ) ) {
4547
+ inst.input.focus();
4548
+ }
4549
+
4550
+ $.datepicker._curInst = inst;
4551
+ }
4552
+ },
4553
+
4554
+ /* Generate the date picker content. */
4555
+ _updateDatepicker: function(inst) {
4556
+ this.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
4557
+ datepicker_instActive = inst; // for delegate hover events
4558
+ inst.dpDiv.empty().append(this._generateHTML(inst));
4559
+ this._attachHandlers(inst);
4560
+
4561
+ var origyearshtml,
4562
+ numMonths = this._getNumberOfMonths(inst),
4563
+ cols = numMonths[1],
4564
+ width = 17,
4565
+ activeCell = inst.dpDiv.find( "." + this._dayOverClass + " a" );
4566
+
4567
+ if ( activeCell.length > 0 ) {
4568
+ datepicker_handleMouseover.apply( activeCell.get( 0 ) );
4569
+ }
4570
+
4571
+ inst.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");
4572
+ if (cols > 1) {
4573
+ inst.dpDiv.addClass("ui-datepicker-multi-" + cols).css("width", (width * cols) + "em");
4574
+ }
4575
+ inst.dpDiv[(numMonths[0] !== 1 || numMonths[1] !== 1 ? "add" : "remove") +
4576
+ "Class"]("ui-datepicker-multi");
4577
+ inst.dpDiv[(this._get(inst, "isRTL") ? "add" : "remove") +
4578
+ "Class"]("ui-datepicker-rtl");
4579
+
4580
+ if (inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) {
4581
+ inst.input.focus();
4582
+ }
4583
+
4584
+ // deffered render of the years select (to avoid flashes on Firefox)
4585
+ if( inst.yearshtml ){
4586
+ origyearshtml = inst.yearshtml;
4587
+ setTimeout(function(){
4588
+ //assure that inst.yearshtml didn't change.
4589
+ if( origyearshtml === inst.yearshtml && inst.yearshtml ){
4590
+ inst.dpDiv.find("select.ui-datepicker-year:first").replaceWith(inst.yearshtml);
4591
+ }
4592
+ origyearshtml = inst.yearshtml = null;
4593
+ }, 0);
4594
+ }
4595
+ },
4596
+
4597
+ // #6694 - don't focus the input if it's already focused
4598
+ // this breaks the change event in IE
4599
+ // Support: IE and jQuery <1.9
4600
+ _shouldFocusInput: function( inst ) {
4601
+ return inst.input && inst.input.is( ":visible" ) && !inst.input.is( ":disabled" ) && !inst.input.is( ":focus" );
4602
+ },
4603
+
4604
+ /* Check positioning to remain on screen. */
4605
+ _checkOffset: function(inst, offset, isFixed) {
4606
+ var dpWidth = inst.dpDiv.outerWidth(),
4607
+ dpHeight = inst.dpDiv.outerHeight(),
4608
+ inputWidth = inst.input ? inst.input.outerWidth() : 0,
4609
+ inputHeight = inst.input ? inst.input.outerHeight() : 0,
4610
+ viewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft()),
4611
+ viewHeight = document.documentElement.clientHeight + (isFixed ? 0 : $(document).scrollTop());
4612
+
4613
+ offset.left -= (this._get(inst, "isRTL") ? (dpWidth - inputWidth) : 0);
4614
+ offset.left -= (isFixed && offset.left === inst.input.offset().left) ? $(document).scrollLeft() : 0;
4615
+ offset.top -= (isFixed && offset.top === (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;
4616
+
4617
+ // now check if datepicker is showing outside window viewport - move to a better place if so.
4618
+ offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?
4619
+ Math.abs(offset.left + dpWidth - viewWidth) : 0);
4620
+ offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?
4621
+ Math.abs(dpHeight + inputHeight) : 0);
4622
+
4623
+ return offset;
4624
+ },
4625
+
4626
+ /* Find an object's position on the screen. */
4627
+ _findPos: function(obj) {
4628
+ var position,
4629
+ inst = this._getInst(obj),
4630
+ isRTL = this._get(inst, "isRTL");
4631
+
4632
+ while (obj && (obj.type === "hidden" || obj.nodeType !== 1 || $.expr.filters.hidden(obj))) {
4633
+ obj = obj[isRTL ? "previousSibling" : "nextSibling"];
4634
+ }
4635
+
4636
+ position = $(obj).offset();
4637
+ return [position.left, position.top];
4638
+ },
4639
+
4640
+ /* Hide the date picker from view.
4641
+ * @param input element - the input field attached to the date picker
4642
+ */
4643
+ _hideDatepicker: function(input) {
4644
+ var showAnim, duration, postProcess, onClose,
4645
+ inst = this._curInst;
4646
+
4647
+ if (!inst || (input && inst !== $.data(input, "datepicker"))) {
4648
+ return;
4649
+ }
4650
+
4651
+ if (this._datepickerShowing) {
4652
+ showAnim = this._get(inst, "showAnim");
4653
+ duration = this._get(inst, "duration");
4654
+ postProcess = function() {
4655
+ $.datepicker._tidyDialog(inst);
4656
+ };
4657
+
4658
+ // DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
4659
+ if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) {
4660
+ inst.dpDiv.hide(showAnim, $.datepicker._get(inst, "showOptions"), duration, postProcess);
4661
+ } else {
4662
+ inst.dpDiv[(showAnim === "slideDown" ? "slideUp" :
4663
+ (showAnim === "fadeIn" ? "fadeOut" : "hide"))]((showAnim ? duration : null), postProcess);
4664
+ }
4665
+
4666
+ if (!showAnim) {
4667
+ postProcess();
4668
+ }
4669
+ this._datepickerShowing = false;
4670
+
4671
+ onClose = this._get(inst, "onClose");
4672
+ if (onClose) {
4673
+ onClose.apply((inst.input ? inst.input[0] : null), [(inst.input ? inst.input.val() : ""), inst]);
4674
+ }
4675
+
4676
+ this._lastInput = null;
4677
+ if (this._inDialog) {
4678
+ this._dialogInput.css({ position: "absolute", left: "0", top: "-100px" });
4679
+ if ($.blockUI) {
4680
+ $.unblockUI();
4681
+ $("body").append(this.dpDiv);
4682
+ }
4683
+ }
4684
+ this._inDialog = false;
4685
+ }
4686
+ },
4687
+
4688
+ /* Tidy up after a dialog display. */
4689
+ _tidyDialog: function(inst) {
4690
+ inst.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar");
4691
+ },
4692
+
4693
+ /* Close date picker if clicked elsewhere. */
4694
+ _checkExternalClick: function(event) {
4695
+ if (!$.datepicker._curInst) {
4696
+ return;
4697
+ }
4698
+
4699
+ var $target = $(event.target),
4700
+ inst = $.datepicker._getInst($target[0]);
4701
+
4702
+ if ( ( ( $target[0].id !== $.datepicker._mainDivId &&
4703
+ $target.parents("#" + $.datepicker._mainDivId).length === 0 &&
4704
+ !$target.hasClass($.datepicker.markerClassName) &&
4705
+ !$target.closest("." + $.datepicker._triggerClass).length &&
4706
+ $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI) ) ) ||
4707
+ ( $target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst !== inst ) ) {
4708
+ $.datepicker._hideDatepicker();
4709
+ }
4710
+ },
4711
+
4712
+ /* Adjust one of the date sub-fields. */
4713
+ _adjustDate: function(id, offset, period) {
4714
+ var target = $(id),
4715
+ inst = this._getInst(target[0]);
4716
+
4717
+ if (this._isDisabledDatepicker(target[0])) {
4718
+ return;
4719
+ }
4720
+ this._adjustInstDate(inst, offset +
4721
+ (period === "M" ? this._get(inst, "showCurrentAtPos") : 0), // undo positioning
4722
+ period);
4723
+ this._updateDatepicker(inst);
4724
+ },
4725
+
4726
+ /* Action for current link. */
4727
+ _gotoToday: function(id) {
4728
+ var date,
4729
+ target = $(id),
4730
+ inst = this._getInst(target[0]);
4731
+
4732
+ if (this._get(inst, "gotoCurrent") && inst.currentDay) {
4733
+ inst.selectedDay = inst.currentDay;
4734
+ inst.drawMonth = inst.selectedMonth = inst.currentMonth;
4735
+ inst.drawYear = inst.selectedYear = inst.currentYear;
4736
+ } else {
4737
+ date = new Date();
4738
+ inst.selectedDay = date.getDate();
4739
+ inst.drawMonth = inst.selectedMonth = date.getMonth();
4740
+ inst.drawYear = inst.selectedYear = date.getFullYear();
4741
+ }
4742
+ this._notifyChange(inst);
4743
+ this._adjustDate(target);
4744
+ },
4745
+
4746
+ /* Action for selecting a new month/year. */
4747
+ _selectMonthYear: function(id, select, period) {
4748
+ var target = $(id),
4749
+ inst = this._getInst(target[0]);
4750
+
4751
+ inst["selected" + (period === "M" ? "Month" : "Year")] =
4752
+ inst["draw" + (period === "M" ? "Month" : "Year")] =
4753
+ parseInt(select.options[select.selectedIndex].value,10);
4754
+
4755
+ this._notifyChange(inst);
4756
+ this._adjustDate(target);
4757
+ },
4758
+
4759
+ /* Action for selecting a day. */
4760
+ _selectDay: function(id, month, year, td) {
4761
+ var inst,
4762
+ target = $(id);
4763
+
4764
+ if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {
4765
+ return;
4766
+ }
4767
+
4768
+ inst = this._getInst(target[0]);
4769
+ inst.selectedDay = inst.currentDay = $("a", td).html();
4770
+ inst.selectedMonth = inst.currentMonth = month;
4771
+ inst.selectedYear = inst.currentYear = year;
4772
+ this._selectDate(id, this._formatDate(inst,
4773
+ inst.currentDay, inst.currentMonth, inst.currentYear));
4774
+ },
4775
+
4776
+ /* Erase the input field and hide the date picker. */
4777
+ _clearDate: function(id) {
4778
+ var target = $(id);
4779
+ this._selectDate(target, "");
4780
+ },
4781
+
4782
+ /* Update the input field with the selected date. */
4783
+ _selectDate: function(id, dateStr) {
4784
+ var onSelect,
4785
+ target = $(id),
4786
+ inst = this._getInst(target[0]);
4787
+
4788
+ dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
4789
+ if (inst.input) {
4790
+ inst.input.val(dateStr);
4791
+ }
4792
+ this._updateAlternate(inst);
4793
+
4794
+ onSelect = this._get(inst, "onSelect");
4795
+ if (onSelect) {
4796
+ onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); // trigger custom callback
4797
+ } else if (inst.input) {
4798
+ inst.input.trigger("change"); // fire the change event
4799
+ }
4800
+
4801
+ if (inst.inline){
4802
+ this._updateDatepicker(inst);
4803
+ } else {
4804
+ this._hideDatepicker();
4805
+ this._lastInput = inst.input[0];
4806
+ if (typeof(inst.input[0]) !== "object") {
4807
+ inst.input.focus(); // restore focus
4808
+ }
4809
+ this._lastInput = null;
4810
+ }
4811
+ },
4812
+
4813
+ /* Update any alternate field to synchronise with the main field. */
4814
+ _updateAlternate: function(inst) {
4815
+ var altFormat, date, dateStr,
4816
+ altField = this._get(inst, "altField");
4817
+
4818
+ if (altField) { // update alternate field too
4819
+ altFormat = this._get(inst, "altFormat") || this._get(inst, "dateFormat");
4820
+ date = this._getDate(inst);
4821
+ dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));
4822
+ $(altField).each(function() { $(this).val(dateStr); });
4823
+ }
4824
+ },
4825
+
4826
+ /* Set as beforeShowDay function to prevent selection of weekends.
4827
+ * @param date Date - the date to customise
4828
+ * @return [boolean, string] - is this date selectable?, what is its CSS class?
4829
+ */
4830
+ noWeekends: function(date) {
4831
+ var day = date.getDay();
4832
+ return [(day > 0 && day < 6), ""];
4833
+ },
4834
+
4835
+ /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
4836
+ * @param date Date - the date to get the week for
4837
+ * @return number - the number of the week within the year that contains this date
4838
+ */
4839
+ iso8601Week: function(date) {
4840
+ var time,
4841
+ checkDate = new Date(date.getTime());
4842
+
4843
+ // Find Thursday of this week starting on Monday
4844
+ checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
4845
+
4846
+ time = checkDate.getTime();
4847
+ checkDate.setMonth(0); // Compare with Jan 1
4848
+ checkDate.setDate(1);
4849
+ return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
4850
+ },
4851
+
4852
+ /* Parse a string value into a date object.
4853
+ * See formatDate below for the possible formats.
4854
+ *
4855
+ * @param format string - the expected format of the date
4856
+ * @param value string - the date in the above format
4857
+ * @param settings Object - attributes include:
4858
+ * shortYearCutoff number - the cutoff year for determining the century (optional)
4859
+ * dayNamesShort string[7] - abbreviated names of the days from Sunday (optional)
4860
+ * dayNames string[7] - names of the days from Sunday (optional)
4861
+ * monthNamesShort string[12] - abbreviated names of the months (optional)
4862
+ * monthNames string[12] - names of the months (optional)
4863
+ * @return Date - the extracted date value or null if value is blank
4864
+ */
4865
+ parseDate: function (format, value, settings) {
4866
+ if (format == null || value == null) {
4867
+ throw "Invalid arguments";
4868
+ }
4869
+
4870
+ value = (typeof value === "object" ? value.toString() : value + "");
4871
+ if (value === "") {
4872
+ return null;
4873
+ }
4874
+
4875
+ var iFormat, dim, extra,
4876
+ iValue = 0,
4877
+ shortYearCutoffTemp = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff,
4878
+ shortYearCutoff = (typeof shortYearCutoffTemp !== "string" ? shortYearCutoffTemp :
4879
+ new Date().getFullYear() % 100 + parseInt(shortYearCutoffTemp, 10)),
4880
+ dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort,
4881
+ dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,
4882
+ monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort,
4883
+ monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,
4884
+ year = -1,
4885
+ month = -1,
4886
+ day = -1,
4887
+ doy = -1,
4888
+ literal = false,
4889
+ date,
4890
+ // Check whether a format character is doubled
4891
+ lookAhead = function(match) {
4892
+ var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);
4893
+ if (matches) {
4894
+ iFormat++;
4895
+ }
4896
+ return matches;
4897
+ },
4898
+ // Extract a number from the string value
4899
+ getNumber = function(match) {
4900
+ var isDoubled = lookAhead(match),
4901
+ size = (match === "@" ? 14 : (match === "!" ? 20 :
4902
+ (match === "y" && isDoubled ? 4 : (match === "o" ? 3 : 2)))),
4903
+ minSize = (match === "y" ? size : 1),
4904
+ digits = new RegExp("^\\d{" + minSize + "," + size + "}"),
4905
+ num = value.substring(iValue).match(digits);
4906
+ if (!num) {
4907
+ throw "Missing number at position " + iValue;
4908
+ }
4909
+ iValue += num[0].length;
4910
+ return parseInt(num[0], 10);
4911
+ },
4912
+ // Extract a name from the string value and convert to an index
4913
+ getName = function(match, shortNames, longNames) {
4914
+ var index = -1,
4915
+ names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) {
4916
+ return [ [k, v] ];
4917
+ }).sort(function (a, b) {
4918
+ return -(a[1].length - b[1].length);
4919
+ });
4920
+
4921
+ $.each(names, function (i, pair) {
4922
+ var name = pair[1];
4923
+ if (value.substr(iValue, name.length).toLowerCase() === name.toLowerCase()) {
4924
+ index = pair[0];
4925
+ iValue += name.length;
4926
+ return false;
4927
+ }
4928
+ });
4929
+ if (index !== -1) {
4930
+ return index + 1;
4931
+ } else {
4932
+ throw "Unknown name at position " + iValue;
4933
+ }
4934
+ },
4935
+ // Confirm that a literal character matches the string value
4936
+ checkLiteral = function() {
4937
+ if (value.charAt(iValue) !== format.charAt(iFormat)) {
4938
+ throw "Unexpected literal at position " + iValue;
4939
+ }
4940
+ iValue++;
4941
+ };
4942
+
4943
+ for (iFormat = 0; iFormat < format.length; iFormat++) {
4944
+ if (literal) {
4945
+ if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
4946
+ literal = false;
4947
+ } else {
4948
+ checkLiteral();
4949
+ }
4950
+ } else {
4951
+ switch (format.charAt(iFormat)) {
4952
+ case "d":
4953
+ day = getNumber("d");
4954
+ break;
4955
+ case "D":
4956
+ getName("D", dayNamesShort, dayNames);
4957
+ break;
4958
+ case "o":
4959
+ doy = getNumber("o");
4960
+ break;
4961
+ case "m":
4962
+ month = getNumber("m");
4963
+ break;
4964
+ case "M":
4965
+ month = getName("M", monthNamesShort, monthNames);
4966
+ break;
4967
+ case "y":
4968
+ year = getNumber("y");
4969
+ break;
4970
+ case "@":
4971
+ date = new Date(getNumber("@"));
4972
+ year = date.getFullYear();
4973
+ month = date.getMonth() + 1;
4974
+ day = date.getDate();
4975
+ break;
4976
+ case "!":
4977
+ date = new Date((getNumber("!") - this._ticksTo1970) / 10000);
4978
+ year = date.getFullYear();
4979
+ month = date.getMonth() + 1;
4980
+ day = date.getDate();
4981
+ break;
4982
+ case "'":
4983
+ if (lookAhead("'")){
4984
+ checkLiteral();
4985
+ } else {
4986
+ literal = true;
4987
+ }
4988
+ break;
4989
+ default:
4990
+ checkLiteral();
4991
+ }
4992
+ }
4993
+ }
4994
+
4995
+ if (iValue < value.length){
4996
+ extra = value.substr(iValue);
4997
+ if (!/^\s+/.test(extra)) {
4998
+ throw "Extra/unparsed characters found in date: " + extra;
4999
+ }
5000
+ }
5001
+
5002
+ if (year === -1) {
5003
+ year = new Date().getFullYear();
5004
+ } else if (year < 100) {
5005
+ year += new Date().getFullYear() - new Date().getFullYear() % 100 +
5006
+ (year <= shortYearCutoff ? 0 : -100);
5007
+ }
5008
+
5009
+ if (doy > -1) {
5010
+ month = 1;
5011
+ day = doy;
5012
+ do {
5013
+ dim = this._getDaysInMonth(year, month - 1);
5014
+ if (day <= dim) {
5015
+ break;
5016
+ }
5017
+ month++;
5018
+ day -= dim;
5019
+ } while (true);
5020
+ }
5021
+
5022
+ date = this._daylightSavingAdjust(new Date(year, month - 1, day));
5023
+ if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) {
5024
+ throw "Invalid date"; // E.g. 31/02/00
5025
+ }
5026
+ return date;
5027
+ },
5028
+
5029
+ /* Standard date formats. */
5030
+ ATOM: "yy-mm-dd", // RFC 3339 (ISO 8601)
5031
+ COOKIE: "D, dd M yy",
5032
+ ISO_8601: "yy-mm-dd",
5033
+ RFC_822: "D, d M y",
5034
+ RFC_850: "DD, dd-M-y",
5035
+ RFC_1036: "D, d M y",
5036
+ RFC_1123: "D, d M yy",
5037
+ RFC_2822: "D, d M yy",
5038
+ RSS: "D, d M y", // RFC 822
5039
+ TICKS: "!",
5040
+ TIMESTAMP: "@",
5041
+ W3C: "yy-mm-dd", // ISO 8601
5042
+
5043
+ _ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +
5044
+ Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),
5045
+
5046
+ /* Format a date object into a string value.
5047
+ * The format can be combinations of the following:
5048
+ * d - day of month (no leading zero)
5049
+ * dd - day of month (two digit)
5050
+ * o - day of year (no leading zeros)
5051
+ * oo - day of year (three digit)
5052
+ * D - day name short
5053
+ * DD - day name long
5054
+ * m - month of year (no leading zero)
5055
+ * mm - month of year (two digit)
5056
+ * M - month name short
5057
+ * MM - month name long
5058
+ * y - year (two digit)
5059
+ * yy - year (four digit)
5060
+ * @ - Unix timestamp (ms since 01/01/1970)
5061
+ * ! - Windows ticks (100ns since 01/01/0001)
5062
+ * "..." - literal text
5063
+ * '' - single quote
5064
+ *
5065
+ * @param format string - the desired format of the date
5066
+ * @param date Date - the date value to format
5067
+ * @param settings Object - attributes include:
5068
+ * dayNamesShort string[7] - abbreviated names of the days from Sunday (optional)
5069
+ * dayNames string[7] - names of the days from Sunday (optional)
5070
+ * monthNamesShort string[12] - abbreviated names of the months (optional)
5071
+ * monthNames string[12] - names of the months (optional)
5072
+ * @return string - the date in the above format
5073
+ */
5074
+ formatDate: function (format, date, settings) {
5075
+ if (!date) {
5076
+ return "";
5077
+ }
5078
+
5079
+ var iFormat,
5080
+ dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort,
5081
+ dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,
5082
+ monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort,
5083
+ monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,
5084
+ // Check whether a format character is doubled
5085
+ lookAhead = function(match) {
5086
+ var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);
5087
+ if (matches) {
5088
+ iFormat++;
5089
+ }
5090
+ return matches;
5091
+ },
5092
+ // Format a number, with leading zero if necessary
5093
+ formatNumber = function(match, value, len) {
5094
+ var num = "" + value;
5095
+ if (lookAhead(match)) {
5096
+ while (num.length < len) {
5097
+ num = "0" + num;
5098
+ }
5099
+ }
5100
+ return num;
5101
+ },
5102
+ // Format a name, short or long as requested
5103
+ formatName = function(match, value, shortNames, longNames) {
5104
+ return (lookAhead(match) ? longNames[value] : shortNames[value]);
5105
+ },
5106
+ output = "",
5107
+ literal = false;
5108
+
5109
+ if (date) {
5110
+ for (iFormat = 0; iFormat < format.length; iFormat++) {
5111
+ if (literal) {
5112
+ if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
5113
+ literal = false;
5114
+ } else {
5115
+ output += format.charAt(iFormat);
5116
+ }
5117
+ } else {
5118
+ switch (format.charAt(iFormat)) {
5119
+ case "d":
5120
+ output += formatNumber("d", date.getDate(), 2);
5121
+ break;
5122
+ case "D":
5123
+ output += formatName("D", date.getDay(), dayNamesShort, dayNames);
5124
+ break;
5125
+ case "o":
5126
+ output += formatNumber("o",
5127
+ Math.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3);
5128
+ break;
5129
+ case "m":
5130
+ output += formatNumber("m", date.getMonth() + 1, 2);
5131
+ break;
5132
+ case "M":
5133
+ output += formatName("M", date.getMonth(), monthNamesShort, monthNames);
5134
+ break;
5135
+ case "y":
5136
+ output += (lookAhead("y") ? date.getFullYear() :
5137
+ (date.getYear() % 100 < 10 ? "0" : "") + date.getYear() % 100);
5138
+ break;
5139
+ case "@":
5140
+ output += date.getTime();
5141
+ break;
5142
+ case "!":
5143
+ output += date.getTime() * 10000 + this._ticksTo1970;
5144
+ break;
5145
+ case "'":
5146
+ if (lookAhead("'")) {
5147
+ output += "'";
5148
+ } else {
5149
+ literal = true;
5150
+ }
5151
+ break;
5152
+ default:
5153
+ output += format.charAt(iFormat);
5154
+ }
5155
+ }
5156
+ }
5157
+ }
5158
+ return output;
5159
+ },
5160
+
5161
+ /* Extract all possible characters from the date format. */
5162
+ _possibleChars: function (format) {
5163
+ var iFormat,
5164
+ chars = "",
5165
+ literal = false,
5166
+ // Check whether a format character is doubled
5167
+ lookAhead = function(match) {
5168
+ var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);
5169
+ if (matches) {
5170
+ iFormat++;
5171
+ }
5172
+ return matches;
5173
+ };
5174
+
5175
+ for (iFormat = 0; iFormat < format.length; iFormat++) {
5176
+ if (literal) {
5177
+ if (format.charAt(iFormat) === "'" && !lookAhead("'")) {
5178
+ literal = false;
5179
+ } else {
5180
+ chars += format.charAt(iFormat);
5181
+ }
5182
+ } else {
5183
+ switch (format.charAt(iFormat)) {
5184
+ case "d": case "m": case "y": case "@":
5185
+ chars += "0123456789";
5186
+ break;
5187
+ case "D": case "M":
5188
+ return null; // Accept anything
5189
+ case "'":
5190
+ if (lookAhead("'")) {
5191
+ chars += "'";
5192
+ } else {
5193
+ literal = true;
5194
+ }
5195
+ break;
5196
+ default:
5197
+ chars += format.charAt(iFormat);
5198
+ }
5199
+ }
5200
+ }
5201
+ return chars;
5202
+ },
5203
+
5204
+ /* Get a setting value, defaulting if necessary. */
5205
+ _get: function(inst, name) {
5206
+ return inst.settings[name] !== undefined ?
5207
+ inst.settings[name] : this._defaults[name];
5208
+ },
5209
+
5210
+ /* Parse existing date and initialise date picker. */
5211
+ _setDateFromField: function(inst, noDefault) {
5212
+ if (inst.input.val() === inst.lastVal) {
5213
+ return;
5214
+ }
5215
+
5216
+ var dateFormat = this._get(inst, "dateFormat"),
5217
+ dates = inst.lastVal = inst.input ? inst.input.val() : null,
5218
+ defaultDate = this._getDefaultDate(inst),
5219
+ date = defaultDate,
5220
+ settings = this._getFormatConfig(inst);
5221
+
5222
+ try {
5223
+ date = this.parseDate(dateFormat, dates, settings) || defaultDate;
5224
+ } catch (event) {
5225
+ dates = (noDefault ? "" : dates);
5226
+ }
5227
+ inst.selectedDay = date.getDate();
5228
+ inst.drawMonth = inst.selectedMonth = date.getMonth();
5229
+ inst.drawYear = inst.selectedYear = date.getFullYear();
5230
+ inst.currentDay = (dates ? date.getDate() : 0);
5231
+ inst.currentMonth = (dates ? date.getMonth() : 0);
5232
+ inst.currentYear = (dates ? date.getFullYear() : 0);
5233
+ this._adjustInstDate(inst);
5234
+ },
5235
+
5236
+ /* Retrieve the default date shown on opening. */
5237
+ _getDefaultDate: function(inst) {
5238
+ return this._restrictMinMax(inst,
5239
+ this._determineDate(inst, this._get(inst, "defaultDate"), new Date()));
5240
+ },
5241
+
5242
+ /* A date may be specified as an exact value or a relative one. */
5243
+ _determineDate: function(inst, date, defaultDate) {
5244
+ var offsetNumeric = function(offset) {
5245
+ var date = new Date();
5246
+ date.setDate(date.getDate() + offset);
5247
+ return date;
5248
+ },
5249
+ offsetString = function(offset) {
5250
+ try {
5251
+ return $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"),
5252
+ offset, $.datepicker._getFormatConfig(inst));
5253
+ }
5254
+ catch (e) {
5255
+ // Ignore
5256
+ }
5257
+
5258
+ var date = (offset.toLowerCase().match(/^c/) ?
5259
+ $.datepicker._getDate(inst) : null) || new Date(),
5260
+ year = date.getFullYear(),
5261
+ month = date.getMonth(),
5262
+ day = date.getDate(),
5263
+ pattern = /([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,
5264
+ matches = pattern.exec(offset);
5265
+
5266
+ while (matches) {
5267
+ switch (matches[2] || "d") {
5268
+ case "d" : case "D" :
5269
+ day += parseInt(matches[1],10); break;
5270
+ case "w" : case "W" :
5271
+ day += parseInt(matches[1],10) * 7; break;
5272
+ case "m" : case "M" :
5273
+ month += parseInt(matches[1],10);
5274
+ day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
5275
+ break;
5276
+ case "y": case "Y" :
5277
+ year += parseInt(matches[1],10);
5278
+ day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
5279
+ break;
5280
+ }
5281
+ matches = pattern.exec(offset);
5282
+ }
5283
+ return new Date(year, month, day);
5284
+ },
5285
+ newDate = (date == null || date === "" ? defaultDate : (typeof date === "string" ? offsetString(date) :
5286
+ (typeof date === "number" ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime()))));
5287
+
5288
+ newDate = (newDate && newDate.toString() === "Invalid Date" ? defaultDate : newDate);
5289
+ if (newDate) {
5290
+ newDate.setHours(0);
5291
+ newDate.setMinutes(0);
5292
+ newDate.setSeconds(0);
5293
+ newDate.setMilliseconds(0);
5294
+ }
5295
+ return this._daylightSavingAdjust(newDate);
5296
+ },
5297
+
5298
+ /* Handle switch to/from daylight saving.
5299
+ * Hours may be non-zero on daylight saving cut-over:
5300
+ * > 12 when midnight changeover, but then cannot generate
5301
+ * midnight datetime, so jump to 1AM, otherwise reset.
5302
+ * @param date (Date) the date to check
5303
+ * @return (Date) the corrected date
5304
+ */
5305
+ _daylightSavingAdjust: function(date) {
5306
+ if (!date) {
5307
+ return null;
5308
+ }
5309
+ date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
5310
+ return date;
5311
+ },
5312
+
5313
+ /* Set the date(s) directly. */
5314
+ _setDate: function(inst, date, noChange) {
5315
+ var clear = !date,
5316
+ origMonth = inst.selectedMonth,
5317
+ origYear = inst.selectedYear,
5318
+ newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));
5319
+
5320
+ inst.selectedDay = inst.currentDay = newDate.getDate();
5321
+ inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
5322
+ inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
5323
+ if ((origMonth !== inst.selectedMonth || origYear !== inst.selectedYear) && !noChange) {
5324
+ this._notifyChange(inst);
5325
+ }
5326
+ this._adjustInstDate(inst);
5327
+ if (inst.input) {
5328
+ inst.input.val(clear ? "" : this._formatDate(inst));
5329
+ }
5330
+ },
5331
+
5332
+ /* Retrieve the date(s) directly. */
5333
+ _getDate: function(inst) {
5334
+ var startDate = (!inst.currentYear || (inst.input && inst.input.val() === "") ? null :
5335
+ this._daylightSavingAdjust(new Date(
5336
+ inst.currentYear, inst.currentMonth, inst.currentDay)));
5337
+ return startDate;
5338
+ },
5339
+
5340
+ /* Attach the onxxx handlers. These are declared statically so
5341
+ * they work with static code transformers like Caja.
5342
+ */
5343
+ _attachHandlers: function(inst) {
5344
+ var stepMonths = this._get(inst, "stepMonths"),
5345
+ id = "#" + inst.id.replace( /\\\\/g, "\\" );
5346
+ inst.dpDiv.find("[data-handler]").map(function () {
5347
+ var handler = {
5348
+ prev: function () {
5349
+ $.datepicker._adjustDate(id, -stepMonths, "M");
5350
+ },
5351
+ next: function () {
5352
+ $.datepicker._adjustDate(id, +stepMonths, "M");
5353
+ },
5354
+ hide: function () {
5355
+ $.datepicker._hideDatepicker();
5356
+ },
5357
+ today: function () {
5358
+ $.datepicker._gotoToday(id);
5359
+ },
5360
+ selectDay: function () {
5361
+ $.datepicker._selectDay(id, +this.getAttribute("data-month"), +this.getAttribute("data-year"), this);
5362
+ return false;
5363
+ },
5364
+ selectMonth: function () {
5365
+ $.datepicker._selectMonthYear(id, this, "M");
5366
+ return false;
5367
+ },
5368
+ selectYear: function () {
5369
+ $.datepicker._selectMonthYear(id, this, "Y");
5370
+ return false;
5371
+ }
5372
+ };
5373
+ $(this).bind(this.getAttribute("data-event"), handler[this.getAttribute("data-handler")]);
5374
+ });
5375
+ },
5376
+
5377
+ /* Generate the HTML for the current state of the date picker. */
5378
+ _generateHTML: function(inst) {
5379
+ var maxDraw, prevText, prev, nextText, next, currentText, gotoDate,
5380
+ controls, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin,
5381
+ monthNames, monthNamesShort, beforeShowDay, showOtherMonths,
5382
+ selectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate,
5383
+ cornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows,
5384
+ printDate, dRow, tbody, daySettings, otherMonth, unselectable,
5385
+ tempDate = new Date(),
5386
+ today = this._daylightSavingAdjust(
5387
+ new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate())), // clear time
5388
+ isRTL = this._get(inst, "isRTL"),
5389
+ showButtonPanel = this._get(inst, "showButtonPanel"),
5390
+ hideIfNoPrevNext = this._get(inst, "hideIfNoPrevNext"),
5391
+ navigationAsDateFormat = this._get(inst, "navigationAsDateFormat"),
5392
+ numMonths = this._getNumberOfMonths(inst),
5393
+ showCurrentAtPos = this._get(inst, "showCurrentAtPos"),
5394
+ stepMonths = this._get(inst, "stepMonths"),
5395
+ isMultiMonth = (numMonths[0] !== 1 || numMonths[1] !== 1),
5396
+ currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :
5397
+ new Date(inst.currentYear, inst.currentMonth, inst.currentDay))),
5398
+ minDate = this._getMinMaxDate(inst, "min"),
5399
+ maxDate = this._getMinMaxDate(inst, "max"),
5400
+ drawMonth = inst.drawMonth - showCurrentAtPos,
5401
+ drawYear = inst.drawYear;
5402
+
5403
+ if (drawMonth < 0) {
5404
+ drawMonth += 12;
5405
+ drawYear--;
5406
+ }
5407
+ if (maxDate) {
5408
+ maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),
5409
+ maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate()));
5410
+ maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
5411
+ while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {
5412
+ drawMonth--;
5413
+ if (drawMonth < 0) {
5414
+ drawMonth = 11;
5415
+ drawYear--;
5416
+ }
5417
+ }
5418
+ }
5419
+ inst.drawMonth = drawMonth;
5420
+ inst.drawYear = drawYear;
5421
+
5422
+ prevText = this._get(inst, "prevText");
5423
+ prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,
5424
+ this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),
5425
+ this._getFormatConfig(inst)));
5426
+
5427
+ prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?
5428
+ "<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click'" +
5429
+ " title='" + prevText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w") + "'>" + prevText + "</span></a>" :
5430
+ (hideIfNoPrevNext ? "" : "<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+ prevText +"'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w") + "'>" + prevText + "</span></a>"));
5431
+
5432
+ nextText = this._get(inst, "nextText");
5433
+ nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,
5434
+ this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),
5435
+ this._getFormatConfig(inst)));
5436
+
5437
+ next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?
5438
+ "<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click'" +
5439
+ " title='" + nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e") + "'>" + nextText + "</span></a>" :
5440
+ (hideIfNoPrevNext ? "" : "<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+ nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e") + "'>" + nextText + "</span></a>"));
5441
+
5442
+ currentText = this._get(inst, "currentText");
5443
+ gotoDate = (this._get(inst, "gotoCurrent") && inst.currentDay ? currentDate : today);
5444
+ currentText = (!navigationAsDateFormat ? currentText :
5445
+ this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));
5446
+
5447
+ controls = (!inst.inline ? "<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>" +
5448
+ this._get(inst, "closeText") + "</button>" : "");
5449
+
5450
+ buttonPanel = (showButtonPanel) ? "<div class='ui-datepicker-buttonpane ui-widget-content'>" + (isRTL ? controls : "") +
5451
+ (this._isInRange(inst, gotoDate) ? "<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'" +
5452
+ ">" + currentText + "</button>" : "") + (isRTL ? "" : controls) + "</div>" : "";
5453
+
5454
+ firstDay = parseInt(this._get(inst, "firstDay"),10);
5455
+ firstDay = (isNaN(firstDay) ? 0 : firstDay);
5456
+
5457
+ showWeek = this._get(inst, "showWeek");
5458
+ dayNames = this._get(inst, "dayNames");
5459
+ dayNamesMin = this._get(inst, "dayNamesMin");
5460
+ monthNames = this._get(inst, "monthNames");
5461
+ monthNamesShort = this._get(inst, "monthNamesShort");
5462
+ beforeShowDay = this._get(inst, "beforeShowDay");
5463
+ showOtherMonths = this._get(inst, "showOtherMonths");
5464
+ selectOtherMonths = this._get(inst, "selectOtherMonths");
5465
+ defaultDate = this._getDefaultDate(inst);
5466
+ html = "";
5467
+ dow;
5468
+ for (row = 0; row < numMonths[0]; row++) {
5469
+ group = "";
5470
+ this.maxRows = 4;
5471
+ for (col = 0; col < numMonths[1]; col++) {
5472
+ selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));
5473
+ cornerClass = " ui-corner-all";
5474
+ calender = "";
5475
+ if (isMultiMonth) {
5476
+ calender += "<div class='ui-datepicker-group";
5477
+ if (numMonths[1] > 1) {
5478
+ switch (col) {
5479
+ case 0: calender += " ui-datepicker-group-first";
5480
+ cornerClass = " ui-corner-" + (isRTL ? "right" : "left"); break;
5481
+ case numMonths[1]-1: calender += " ui-datepicker-group-last";
5482
+ cornerClass = " ui-corner-" + (isRTL ? "left" : "right"); break;
5483
+ default: calender += " ui-datepicker-group-middle"; cornerClass = ""; break;
5484
+ }
5485
+ }
5486
+ calender += "'>";
5487
+ }
5488
+ calender += "<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix" + cornerClass + "'>" +
5489
+ (/all|left/.test(cornerClass) && row === 0 ? (isRTL ? next : prev) : "") +
5490
+ (/all|right/.test(cornerClass) && row === 0 ? (isRTL ? prev : next) : "") +
5491
+ this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,
5492
+ row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers
5493
+ "</div><table class='ui-datepicker-calendar'><thead>" +
5494
+ "<tr>";
5495
+ thead = (showWeek ? "<th class='ui-datepicker-week-col'>" + this._get(inst, "weekHeader") + "</th>" : "");
5496
+ for (dow = 0; dow < 7; dow++) { // days of the week
5497
+ day = (dow + firstDay) % 7;
5498
+ thead += "<th scope='col'" + ((dow + firstDay + 6) % 7 >= 5 ? " class='ui-datepicker-week-end'" : "") + ">" +
5499
+ "<span title='" + dayNames[day] + "'>" + dayNamesMin[day] + "</span></th>";
5500
+ }
5501
+ calender += thead + "</tr></thead><tbody>";
5502
+ daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
5503
+ if (drawYear === inst.selectedYear && drawMonth === inst.selectedMonth) {
5504
+ inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
5505
+ }
5506
+ leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
5507
+ curRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate
5508
+ numRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows); //If multiple months, use the higher number of rows (see #7043)
5509
+ this.maxRows = numRows;
5510
+ printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
5511
+ for (dRow = 0; dRow < numRows; dRow++) { // create date picker rows
5512
+ calender += "<tr>";
5513
+ tbody = (!showWeek ? "" : "<td class='ui-datepicker-week-col'>" +
5514
+ this._get(inst, "calculateWeek")(printDate) + "</td>");
5515
+ for (dow = 0; dow < 7; dow++) { // create date picker days
5516
+ daySettings = (beforeShowDay ?
5517
+ beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, ""]);
5518
+ otherMonth = (printDate.getMonth() !== drawMonth);
5519
+ unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] ||
5520
+ (minDate && printDate < minDate) || (maxDate && printDate > maxDate);
5521
+ tbody += "<td class='" +
5522
+ ((dow + firstDay + 6) % 7 >= 5 ? " ui-datepicker-week-end" : "") + // highlight weekends
5523
+ (otherMonth ? " ui-datepicker-other-month" : "") + // highlight days from other months
5524
+ ((printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent) || // user pressed key
5525
+ (defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime()) ?
5526
+ // or defaultDate is current printedDate and defaultDate is selectedDate
5527
+ " " + this._dayOverClass : "") + // highlight selected day
5528
+ (unselectable ? " " + this._unselectableClass + " ui-state-disabled": "") + // highlight unselectable days
5529
+ (otherMonth && !showOtherMonths ? "" : " " + daySettings[1] + // highlight custom dates
5530
+ (printDate.getTime() === currentDate.getTime() ? " " + this._currentClass : "") + // highlight selected day
5531
+ (printDate.getTime() === today.getTime() ? " ui-datepicker-today" : "")) + "'" + // highlight today (if different)
5532
+ ((!otherMonth || showOtherMonths) && daySettings[2] ? " title='" + daySettings[2].replace(/'/g, "&#39;") + "'" : "") + // cell title
5533
+ (unselectable ? "" : " data-handler='selectDay' data-event='click' data-month='" + printDate.getMonth() + "' data-year='" + printDate.getFullYear() + "'") + ">" + // actions
5534
+ (otherMonth && !showOtherMonths ? "&#xa0;" : // display for other months
5535
+ (unselectable ? "<span class='ui-state-default'>" + printDate.getDate() + "</span>" : "<a class='ui-state-default" +
5536
+ (printDate.getTime() === today.getTime() ? " ui-state-highlight" : "") +
5537
+ (printDate.getTime() === currentDate.getTime() ? " ui-state-active" : "") + // highlight selected day
5538
+ (otherMonth ? " ui-priority-secondary" : "") + // distinguish dates from other months
5539
+ "' href='#'>" + printDate.getDate() + "</a>")) + "</td>"; // display selectable date
5540
+ printDate.setDate(printDate.getDate() + 1);
5541
+ printDate = this._daylightSavingAdjust(printDate);
5542
+ }
5543
+ calender += tbody + "</tr>";
5544
+ }
5545
+ drawMonth++;
5546
+ if (drawMonth > 11) {
5547
+ drawMonth = 0;
5548
+ drawYear++;
5549
+ }
5550
+ calender += "</tbody></table>" + (isMultiMonth ? "</div>" +
5551
+ ((numMonths[0] > 0 && col === numMonths[1]-1) ? "<div class='ui-datepicker-row-break'></div>" : "") : "");
5552
+ group += calender;
5553
+ }
5554
+ html += group;
5555
+ }
5556
+ html += buttonPanel;
5557
+ inst._keyEvent = false;
5558
+ return html;
5559
+ },
5560
+
5561
+ /* Generate the month and year header. */
5562
+ _generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,
5563
+ secondary, monthNames, monthNamesShort) {
5564
+
5565
+ var inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,
5566
+ changeMonth = this._get(inst, "changeMonth"),
5567
+ changeYear = this._get(inst, "changeYear"),
5568
+ showMonthAfterYear = this._get(inst, "showMonthAfterYear"),
5569
+ html = "<div class='ui-datepicker-title'>",
5570
+ monthHtml = "";
5571
+
5572
+ // month selection
5573
+ if (secondary || !changeMonth) {
5574
+ monthHtml += "<span class='ui-datepicker-month'>" + monthNames[drawMonth] + "</span>";
5575
+ } else {
5576
+ inMinYear = (minDate && minDate.getFullYear() === drawYear);
5577
+ inMaxYear = (maxDate && maxDate.getFullYear() === drawYear);
5578
+ monthHtml += "<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>";
5579
+ for ( month = 0; month < 12; month++) {
5580
+ if ((!inMinYear || month >= minDate.getMonth()) && (!inMaxYear || month <= maxDate.getMonth())) {
5581
+ monthHtml += "<option value='" + month + "'" +
5582
+ (month === drawMonth ? " selected='selected'" : "") +
5583
+ ">" + monthNamesShort[month] + "</option>";
5584
+ }
5585
+ }
5586
+ monthHtml += "</select>";
5587
+ }
5588
+
5589
+ if (!showMonthAfterYear) {
5590
+ html += monthHtml + (secondary || !(changeMonth && changeYear) ? "&#xa0;" : "");
5591
+ }
5592
+
5593
+ // year selection
5594
+ if ( !inst.yearshtml ) {
5595
+ inst.yearshtml = "";
5596
+ if (secondary || !changeYear) {
5597
+ html += "<span class='ui-datepicker-year'>" + drawYear + "</span>";
5598
+ } else {
5599
+ // determine range of years to display
5600
+ years = this._get(inst, "yearRange").split(":");
5601
+ thisYear = new Date().getFullYear();
5602
+ determineYear = function(value) {
5603
+ var year = (value.match(/c[+\-].*/) ? drawYear + parseInt(value.substring(1), 10) :
5604
+ (value.match(/[+\-].*/) ? thisYear + parseInt(value, 10) :
5605
+ parseInt(value, 10)));
5606
+ return (isNaN(year) ? thisYear : year);
5607
+ };
5608
+ year = determineYear(years[0]);
5609
+ endYear = Math.max(year, determineYear(years[1] || ""));
5610
+ year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
5611
+ endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
5612
+ inst.yearshtml += "<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";
5613
+ for (; year <= endYear; year++) {
5614
+ inst.yearshtml += "<option value='" + year + "'" +
5615
+ (year === drawYear ? " selected='selected'" : "") +
5616
+ ">" + year + "</option>";
5617
+ }
5618
+ inst.yearshtml += "</select>";
5619
+
5620
+ html += inst.yearshtml;
5621
+ inst.yearshtml = null;
5622
+ }
5623
+ }
5624
+
5625
+ html += this._get(inst, "yearSuffix");
5626
+ if (showMonthAfterYear) {
5627
+ html += (secondary || !(changeMonth && changeYear) ? "&#xa0;" : "") + monthHtml;
5628
+ }
5629
+ html += "</div>"; // Close datepicker_header
5630
+ return html;
5631
+ },
5632
+
5633
+ /* Adjust one of the date sub-fields. */
5634
+ _adjustInstDate: function(inst, offset, period) {
5635
+ var year = inst.drawYear + (period === "Y" ? offset : 0),
5636
+ month = inst.drawMonth + (period === "M" ? offset : 0),
5637
+ day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + (period === "D" ? offset : 0),
5638
+ date = this._restrictMinMax(inst, this._daylightSavingAdjust(new Date(year, month, day)));
5639
+
5640
+ inst.selectedDay = date.getDate();
5641
+ inst.drawMonth = inst.selectedMonth = date.getMonth();
5642
+ inst.drawYear = inst.selectedYear = date.getFullYear();
5643
+ if (period === "M" || period === "Y") {
5644
+ this._notifyChange(inst);
5645
+ }
5646
+ },
5647
+
5648
+ /* Ensure a date is within any min/max bounds. */
5649
+ _restrictMinMax: function(inst, date) {
5650
+ var minDate = this._getMinMaxDate(inst, "min"),
5651
+ maxDate = this._getMinMaxDate(inst, "max"),
5652
+ newDate = (minDate && date < minDate ? minDate : date);
5653
+ return (maxDate && newDate > maxDate ? maxDate : newDate);
5654
+ },
5655
+
5656
+ /* Notify change of month/year. */
5657
+ _notifyChange: function(inst) {
5658
+ var onChange = this._get(inst, "onChangeMonthYear");
5659
+ if (onChange) {
5660
+ onChange.apply((inst.input ? inst.input[0] : null),
5661
+ [inst.selectedYear, inst.selectedMonth + 1, inst]);
5662
+ }
5663
+ },
5664
+
5665
+ /* Determine the number of months to show. */
5666
+ _getNumberOfMonths: function(inst) {
5667
+ var numMonths = this._get(inst, "numberOfMonths");
5668
+ return (numMonths == null ? [1, 1] : (typeof numMonths === "number" ? [1, numMonths] : numMonths));
5669
+ },
5670
+
5671
+ /* Determine the current maximum date - ensure no time components are set. */
5672
+ _getMinMaxDate: function(inst, minMax) {
5673
+ return this._determineDate(inst, this._get(inst, minMax + "Date"), null);
5674
+ },
5675
+
5676
+ /* Find the number of days in a given month. */
5677
+ _getDaysInMonth: function(year, month) {
5678
+ return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();
5679
+ },
5680
+
5681
+ /* Find the day of the week of the first of a month. */
5682
+ _getFirstDayOfMonth: function(year, month) {
5683
+ return new Date(year, month, 1).getDay();
5684
+ },
5685
+
5686
+ /* Determines if we should allow a "next/prev" month display change. */
5687
+ _canAdjustMonth: function(inst, offset, curYear, curMonth) {
5688
+ var numMonths = this._getNumberOfMonths(inst),
5689
+ date = this._daylightSavingAdjust(new Date(curYear,
5690
+ curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));
5691
+
5692
+ if (offset < 0) {
5693
+ date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
5694
+ }
5695
+ return this._isInRange(inst, date);
5696
+ },
5697
+
5698
+ /* Is the given date in the accepted range? */
5699
+ _isInRange: function(inst, date) {
5700
+ var yearSplit, currentYear,
5701
+ minDate = this._getMinMaxDate(inst, "min"),
5702
+ maxDate = this._getMinMaxDate(inst, "max"),
5703
+ minYear = null,
5704
+ maxYear = null,
5705
+ years = this._get(inst, "yearRange");
5706
+ if (years){
5707
+ yearSplit = years.split(":");
5708
+ currentYear = new Date().getFullYear();
5709
+ minYear = parseInt(yearSplit[0], 10);
5710
+ maxYear = parseInt(yearSplit[1], 10);
5711
+ if ( yearSplit[0].match(/[+\-].*/) ) {
5712
+ minYear += currentYear;
5713
+ }
5714
+ if ( yearSplit[1].match(/[+\-].*/) ) {
5715
+ maxYear += currentYear;
5716
+ }
5717
+ }
5718
+
5719
+ return ((!minDate || date.getTime() >= minDate.getTime()) &&
5720
+ (!maxDate || date.getTime() <= maxDate.getTime()) &&
5721
+ (!minYear || date.getFullYear() >= minYear) &&
5722
+ (!maxYear || date.getFullYear() <= maxYear));
5723
+ },
5724
+
5725
+ /* Provide the configuration settings for formatting/parsing. */
5726
+ _getFormatConfig: function(inst) {
5727
+ var shortYearCutoff = this._get(inst, "shortYearCutoff");
5728
+ shortYearCutoff = (typeof shortYearCutoff !== "string" ? shortYearCutoff :
5729
+ new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
5730
+ return {shortYearCutoff: shortYearCutoff,
5731
+ dayNamesShort: this._get(inst, "dayNamesShort"), dayNames: this._get(inst, "dayNames"),
5732
+ monthNamesShort: this._get(inst, "monthNamesShort"), monthNames: this._get(inst, "monthNames")};
5733
+ },
5734
+
5735
+ /* Format the given date for display. */
5736
+ _formatDate: function(inst, day, month, year) {
5737
+ if (!day) {
5738
+ inst.currentDay = inst.selectedDay;
5739
+ inst.currentMonth = inst.selectedMonth;
5740
+ inst.currentYear = inst.selectedYear;
5741
+ }
5742
+ var date = (day ? (typeof day === "object" ? day :
5743
+ this._daylightSavingAdjust(new Date(year, month, day))) :
5744
+ this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
5745
+ return this.formatDate(this._get(inst, "dateFormat"), date, this._getFormatConfig(inst));
5746
+ }
5747
+ });
5748
+
5749
+ /*
5750
+ * Bind hover events for datepicker elements.
5751
+ * Done via delegate so the binding only occurs once in the lifetime of the parent div.
5752
+ * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
5753
+ */
5754
+ function datepicker_bindHover(dpDiv) {
5755
+ var selector = "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";
5756
+ return dpDiv.delegate(selector, "mouseout", function() {
5757
+ $(this).removeClass("ui-state-hover");
5758
+ if (this.className.indexOf("ui-datepicker-prev") !== -1) {
5759
+ $(this).removeClass("ui-datepicker-prev-hover");
5760
+ }
5761
+ if (this.className.indexOf("ui-datepicker-next") !== -1) {
5762
+ $(this).removeClass("ui-datepicker-next-hover");
5763
+ }
5764
+ })
5765
+ .delegate( selector, "mouseover", datepicker_handleMouseover );
5766
+ }
5767
+
5768
+ function datepicker_handleMouseover() {
5769
+ if (!$.datepicker._isDisabledDatepicker( datepicker_instActive.inline? datepicker_instActive.dpDiv.parent()[0] : datepicker_instActive.input[0])) {
5770
+ $(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");
5771
+ $(this).addClass("ui-state-hover");
5772
+ if (this.className.indexOf("ui-datepicker-prev") !== -1) {
5773
+ $(this).addClass("ui-datepicker-prev-hover");
5774
+ }
5775
+ if (this.className.indexOf("ui-datepicker-next") !== -1) {
5776
+ $(this).addClass("ui-datepicker-next-hover");
5777
+ }
5778
+ }
5779
+ }
5780
+
5781
+ /* jQuery extend now ignores nulls! */
5782
+ function datepicker_extendRemove(target, props) {
5783
+ $.extend(target, props);
5784
+ for (var name in props) {
5785
+ if (props[name] == null) {
5786
+ target[name] = props[name];
5787
+ }
5788
+ }
5789
+ return target;
5790
+ }
5791
+
5792
+ /* Invoke the datepicker functionality.
5793
+ @param options string - a command, optionally followed by additional parameters or
5794
+ Object - settings for attaching new datepicker functionality
5795
+ @return jQuery object */
5796
+ $.fn.datepicker = function(options){
5797
+
5798
+ /* Verify an empty collection wasn't passed - Fixes #6976 */
5799
+ if ( !this.length ) {
5800
+ return this;
5801
+ }
5802
+
5803
+ /* Initialise the date picker. */
5804
+ if (!$.datepicker.initialized) {
5805
+ $(document).mousedown($.datepicker._checkExternalClick);
5806
+ $.datepicker.initialized = true;
5807
+ }
5808
+
5809
+ /* Append datepicker main container to body if not exist. */
5810
+ if ($("#"+$.datepicker._mainDivId).length === 0) {
5811
+ $("body").append($.datepicker.dpDiv);
5812
+ }
5813
+
5814
+ var otherArgs = Array.prototype.slice.call(arguments, 1);
5815
+ if (typeof options === "string" && (options === "isDisabled" || options === "getDate" || options === "widget")) {
5816
+ return $.datepicker["_" + options + "Datepicker"].
5817
+ apply($.datepicker, [this[0]].concat(otherArgs));
5818
+ }
5819
+ if (options === "option" && arguments.length === 2 && typeof arguments[1] === "string") {
5820
+ return $.datepicker["_" + options + "Datepicker"].
5821
+ apply($.datepicker, [this[0]].concat(otherArgs));
5822
+ }
5823
+ return this.each(function() {
5824
+ typeof options === "string" ?
5825
+ $.datepicker["_" + options + "Datepicker"].
5826
+ apply($.datepicker, [this].concat(otherArgs)) :
5827
+ $.datepicker._attachDatepicker(this, options);
5828
+ });
5829
+ };
5830
+
5831
+ $.datepicker = new Datepicker(); // singleton instance
5832
+ $.datepicker.initialized = false;
5833
+ $.datepicker.uuid = new Date().getTime();
5834
+ $.datepicker.version = "1.11.4";
5835
+
5836
+ var datepicker = $.datepicker;
5837
+
5838
+
5839
+ /*!
5840
+ * jQuery UI Draggable 1.11.4
5841
+ * http://jqueryui.com
5842
+ *
5843
+ * Copyright jQuery Foundation and other contributors
5844
+ * Released under the MIT license.
5845
+ * http://jquery.org/license
5846
+ *
5847
+ * http://api.jqueryui.com/draggable/
5848
+ */
5849
+
5850
+
5851
+ $.widget("ui.draggable", $.ui.mouse, {
5852
+ version: "1.11.4",
5853
+ widgetEventPrefix: "drag",
5854
+ options: {
5855
+ addClasses: true,
5856
+ appendTo: "parent",
5857
+ axis: false,
5858
+ connectToSortable: false,
5859
+ containment: false,
5860
+ cursor: "auto",
5861
+ cursorAt: false,
5862
+ grid: false,
5863
+ handle: false,
5864
+ helper: "original",
5865
+ iframeFix: false,
5866
+ opacity: false,
5867
+ refreshPositions: false,
5868
+ revert: false,
5869
+ revertDuration: 500,
5870
+ scope: "default",
5871
+ scroll: true,
5872
+ scrollSensitivity: 20,
5873
+ scrollSpeed: 20,
5874
+ snap: false,
5875
+ snapMode: "both",
5876
+ snapTolerance: 20,
5877
+ stack: false,
5878
+ zIndex: false,
5879
+
5880
+ // callbacks
5881
+ drag: null,
5882
+ start: null,
5883
+ stop: null
5884
+ },
5885
+ _create: function() {
5886
+
5887
+ if ( this.options.helper === "original" ) {
5888
+ this._setPositionRelative();
5889
+ }
5890
+ if (this.options.addClasses){
5891
+ this.element.addClass("ui-draggable");
5892
+ }
5893
+ if (this.options.disabled){
5894
+ this.element.addClass("ui-draggable-disabled");
5895
+ }
5896
+ this._setHandleClassName();
5897
+
5898
+ this._mouseInit();
5899
+ },
5900
+
5901
+ _setOption: function( key, value ) {
5902
+ this._super( key, value );
5903
+ if ( key === "handle" ) {
5904
+ this._removeHandleClassName();
5905
+ this._setHandleClassName();
5906
+ }
5907
+ },
5908
+
5909
+ _destroy: function() {
5910
+ if ( ( this.helper || this.element ).is( ".ui-draggable-dragging" ) ) {
5911
+ this.destroyOnClear = true;
5912
+ return;
5913
+ }
5914
+ this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" );
5915
+ this._removeHandleClassName();
5916
+ this._mouseDestroy();
5917
+ },
5918
+
5919
+ _mouseCapture: function(event) {
5920
+ var o = this.options;
5921
+
5922
+ this._blurActiveElement( event );
5923
+
5924
+ // among others, prevent a drag on a resizable-handle
5925
+ if (this.helper || o.disabled || $(event.target).closest(".ui-resizable-handle").length > 0) {
5926
+ return false;
5927
+ }
5928
+
5929
+ //Quit if we're not on a valid handle
5930
+ this.handle = this._getHandle(event);
5931
+ if (!this.handle) {
5932
+ return false;
5933
+ }
5934
+
5935
+ this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix );
5936
+
5937
+ return true;
5938
+
5939
+ },
5940
+
5941
+ _blockFrames: function( selector ) {
5942
+ this.iframeBlocks = this.document.find( selector ).map(function() {
5943
+ var iframe = $( this );
5944
+
5945
+ return $( "<div>" )
5946
+ .css( "position", "absolute" )
5947
+ .appendTo( iframe.parent() )
5948
+ .outerWidth( iframe.outerWidth() )
5949
+ .outerHeight( iframe.outerHeight() )
5950
+ .offset( iframe.offset() )[ 0 ];
5951
+ });
5952
+ },
5953
+
5954
+ _unblockFrames: function() {
5955
+ if ( this.iframeBlocks ) {
5956
+ this.iframeBlocks.remove();
5957
+ delete this.iframeBlocks;
5958
+ }
5959
+ },
5960
+
5961
+ _blurActiveElement: function( event ) {
5962
+ var document = this.document[ 0 ];
5963
+
5964
+ // Only need to blur if the event occurred on the draggable itself, see #10527
5965
+ if ( !this.handleElement.is( event.target ) ) {
5966
+ return;
5967
+ }
5968
+
5969
+ // support: IE9
5970
+ // IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
5971
+ try {
5972
+
5973
+ // Support: IE9, IE10
5974
+ // If the <body> is blurred, IE will switch windows, see #9520
5975
+ if ( document.activeElement && document.activeElement.nodeName.toLowerCase() !== "body" ) {
5976
+
5977
+ // Blur any element that currently has focus, see #4261
5978
+ $( document.activeElement ).blur();
5979
+ }
5980
+ } catch ( error ) {}
5981
+ },
5982
+
5983
+ _mouseStart: function(event) {
5984
+
5985
+ var o = this.options;
5986
+
5987
+ //Create and append the visible helper
5988
+ this.helper = this._createHelper(event);
5989
+
5990
+ this.helper.addClass("ui-draggable-dragging");
5991
+
5992
+ //Cache the helper size
5993
+ this._cacheHelperProportions();
5994
+
5995
+ //If ddmanager is used for droppables, set the global draggable
5996
+ if ($.ui.ddmanager) {
5997
+ $.ui.ddmanager.current = this;
5998
+ }
5999
+
6000
+ /*
6001
+ * - Position generation -
6002
+ * This block generates everything position related - it's the core of draggables.
6003
+ */
6004
+
6005
+ //Cache the margins of the original element
6006
+ this._cacheMargins();
6007
+
6008
+ //Store the helper's css position
6009
+ this.cssPosition = this.helper.css( "position" );
6010
+ this.scrollParent = this.helper.scrollParent( true );
6011
+ this.offsetParent = this.helper.offsetParent();
6012
+ this.hasFixedAncestor = this.helper.parents().filter(function() {
6013
+ return $( this ).css( "position" ) === "fixed";
6014
+ }).length > 0;
6015
+
6016
+ //The element's absolute position on the page minus margins
6017
+ this.positionAbs = this.element.offset();
6018
+ this._refreshOffsets( event );
6019
+
6020
+ //Generate the original position
6021
+ this.originalPosition = this.position = this._generatePosition( event, false );
6022
+ this.originalPageX = event.pageX;
6023
+ this.originalPageY = event.pageY;
6024
+
6025
+ //Adjust the mouse offset relative to the helper if "cursorAt" is supplied
6026
+ (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
6027
+
6028
+ //Set a containment if given in the options
6029
+ this._setContainment();
6030
+
6031
+ //Trigger event + callbacks
6032
+ if (this._trigger("start", event) === false) {
6033
+ this._clear();
6034
+ return false;
6035
+ }
6036
+
6037
+ //Recache the helper size
6038
+ this._cacheHelperProportions();
6039
+
6040
+ //Prepare the droppable offsets
6041
+ if ($.ui.ddmanager && !o.dropBehaviour) {
6042
+ $.ui.ddmanager.prepareOffsets(this, event);
6043
+ }
6044
+
6045
+ // Reset helper's right/bottom css if they're set and set explicit width/height instead
6046
+ // as this prevents resizing of elements with right/bottom set (see #7772)
6047
+ this._normalizeRightBottom();
6048
+
6049
+ this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
6050
+
6051
+ //If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)
6052
+ if ( $.ui.ddmanager ) {
6053
+ $.ui.ddmanager.dragStart(this, event);
6054
+ }
6055
+
6056
+ return true;
6057
+ },
6058
+
6059
+ _refreshOffsets: function( event ) {
6060
+ this.offset = {
6061
+ top: this.positionAbs.top - this.margins.top,
6062
+ left: this.positionAbs.left - this.margins.left,
6063
+ scroll: false,
6064
+ parent: this._getParentOffset(),
6065
+ relative: this._getRelativeOffset()
6066
+ };
6067
+
6068
+ this.offset.click = {
6069
+ left: event.pageX - this.offset.left,
6070
+ top: event.pageY - this.offset.top
6071
+ };
6072
+ },
6073
+
6074
+ _mouseDrag: function(event, noPropagation) {
6075
+ // reset any necessary cached properties (see #5009)
6076
+ if ( this.hasFixedAncestor ) {
6077
+ this.offset.parent = this._getParentOffset();
6078
+ }
6079
+
6080
+ //Compute the helpers position
6081
+ this.position = this._generatePosition( event, true );
6082
+ this.positionAbs = this._convertPositionTo("absolute");
6083
+
6084
+ //Call plugins and callbacks and use the resulting position if something is returned
6085
+ if (!noPropagation) {
6086
+ var ui = this._uiHash();
6087
+ if (this._trigger("drag", event, ui) === false) {
6088
+ this._mouseUp({});
6089
+ return false;
6090
+ }
6091
+ this.position = ui.position;
6092
+ }
6093
+
6094
+ this.helper[ 0 ].style.left = this.position.left + "px";
6095
+ this.helper[ 0 ].style.top = this.position.top + "px";
6096
+
6097
+ if ($.ui.ddmanager) {
6098
+ $.ui.ddmanager.drag(this, event);
6099
+ }
6100
+
6101
+ return false;
6102
+ },
6103
+
6104
+ _mouseStop: function(event) {
6105
+
6106
+ //If we are using droppables, inform the manager about the drop
6107
+ var that = this,
6108
+ dropped = false;
6109
+ if ($.ui.ddmanager && !this.options.dropBehaviour) {
6110
+ dropped = $.ui.ddmanager.drop(this, event);
6111
+ }
6112
+
6113
+ //if a drop comes from outside (a sortable)
6114
+ if (this.dropped) {
6115
+ dropped = this.dropped;
6116
+ this.dropped = false;
6117
+ }
6118
+
6119
+ if ((this.options.revert === "invalid" && !dropped) || (this.options.revert === "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
6120
+ $(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
6121
+ if (that._trigger("stop", event) !== false) {
6122
+ that._clear();
6123
+ }
6124
+ });
6125
+ } else {
6126
+ if (this._trigger("stop", event) !== false) {
6127
+ this._clear();
6128
+ }
6129
+ }
6130
+
6131
+ return false;
6132
+ },
6133
+
6134
+ _mouseUp: function( event ) {
6135
+ this._unblockFrames();
6136
+
6137
+ //If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)
6138
+ if ( $.ui.ddmanager ) {
6139
+ $.ui.ddmanager.dragStop(this, event);
6140
+ }
6141
+
6142
+ // Only need to focus if the event occurred on the draggable itself, see #10527
6143
+ if ( this.handleElement.is( event.target ) ) {
6144
+ // The interaction is over; whether or not the click resulted in a drag, focus the element
6145
+ this.element.focus();
6146
+ }
6147
+
6148
+ return $.ui.mouse.prototype._mouseUp.call(this, event);
6149
+ },
6150
+
6151
+ cancel: function() {
6152
+
6153
+ if (this.helper.is(".ui-draggable-dragging")) {
6154
+ this._mouseUp({});
6155
+ } else {
6156
+ this._clear();
6157
+ }
6158
+
6159
+ return this;
6160
+
6161
+ },
6162
+
6163
+ _getHandle: function(event) {
6164
+ return this.options.handle ?
6165
+ !!$( event.target ).closest( this.element.find( this.options.handle ) ).length :
6166
+ true;
6167
+ },
6168
+
6169
+ _setHandleClassName: function() {
6170
+ this.handleElement = this.options.handle ?
6171
+ this.element.find( this.options.handle ) : this.element;
6172
+ this.handleElement.addClass( "ui-draggable-handle" );
6173
+ },
6174
+
6175
+ _removeHandleClassName: function() {
6176
+ this.handleElement.removeClass( "ui-draggable-handle" );
6177
+ },
6178
+
6179
+ _createHelper: function(event) {
6180
+
6181
+ var o = this.options,
6182
+ helperIsFunction = $.isFunction( o.helper ),
6183
+ helper = helperIsFunction ?
6184
+ $( o.helper.apply( this.element[ 0 ], [ event ] ) ) :
6185
+ ( o.helper === "clone" ?
6186
+ this.element.clone().removeAttr( "id" ) :
6187
+ this.element );
6188
+
6189
+ if (!helper.parents("body").length) {
6190
+ helper.appendTo((o.appendTo === "parent" ? this.element[0].parentNode : o.appendTo));
6191
+ }
6192
+
6193
+ // http://bugs.jqueryui.com/ticket/9446
6194
+ // a helper function can return the original element
6195
+ // which wouldn't have been set to relative in _create
6196
+ if ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) {
6197
+ this._setPositionRelative();
6198
+ }
6199
+
6200
+ if (helper[0] !== this.element[0] && !(/(fixed|absolute)/).test(helper.css("position"))) {
6201
+ helper.css("position", "absolute");
6202
+ }
6203
+
6204
+ return helper;
6205
+
6206
+ },
6207
+
6208
+ _setPositionRelative: function() {
6209
+ if ( !( /^(?:r|a|f)/ ).test( this.element.css( "position" ) ) ) {
6210
+ this.element[ 0 ].style.position = "relative";
6211
+ }
6212
+ },
6213
+
6214
+ _adjustOffsetFromHelper: function(obj) {
6215
+ if (typeof obj === "string") {
6216
+ obj = obj.split(" ");
6217
+ }
6218
+ if ($.isArray(obj)) {
6219
+ obj = { left: +obj[0], top: +obj[1] || 0 };
6220
+ }
6221
+ if ("left" in obj) {
6222
+ this.offset.click.left = obj.left + this.margins.left;
6223
+ }
6224
+ if ("right" in obj) {
6225
+ this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
6226
+ }
6227
+ if ("top" in obj) {
6228
+ this.offset.click.top = obj.top + this.margins.top;
6229
+ }
6230
+ if ("bottom" in obj) {
6231
+ this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
6232
+ }
6233
+ },
6234
+
6235
+ _isRootNode: function( element ) {
6236
+ return ( /(html|body)/i ).test( element.tagName ) || element === this.document[ 0 ];
6237
+ },
6238
+
6239
+ _getParentOffset: function() {
6240
+
6241
+ //Get the offsetParent and cache its position
6242
+ var po = this.offsetParent.offset(),
6243
+ document = this.document[ 0 ];
6244
+
6245
+ // This is a special case where we need to modify a offset calculated on start, since the following happened:
6246
+ // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
6247
+ // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
6248
+ // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
6249
+ if (this.cssPosition === "absolute" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
6250
+ po.left += this.scrollParent.scrollLeft();
6251
+ po.top += this.scrollParent.scrollTop();
6252
+ }
6253
+
6254
+ if ( this._isRootNode( this.offsetParent[ 0 ] ) ) {
6255
+ po = { top: 0, left: 0 };
6256
+ }
6257
+
6258
+ return {
6259
+ top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"), 10) || 0),
6260
+ left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"), 10) || 0)
6261
+ };
6262
+
6263
+ },
6264
+
6265
+ _getRelativeOffset: function() {
6266
+ if ( this.cssPosition !== "relative" ) {
6267
+ return { top: 0, left: 0 };
6268
+ }
6269
+
6270
+ var p = this.element.position(),
6271
+ scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
6272
+
6273
+ return {
6274
+ top: p.top - ( parseInt(this.helper.css( "top" ), 10) || 0 ) + ( !scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ),
6275
+ left: p.left - ( parseInt(this.helper.css( "left" ), 10) || 0 ) + ( !scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 )
6276
+ };
6277
+
6278
+ },
6279
+
6280
+ _cacheMargins: function() {
6281
+ this.margins = {
6282
+ left: (parseInt(this.element.css("marginLeft"), 10) || 0),
6283
+ top: (parseInt(this.element.css("marginTop"), 10) || 0),
6284
+ right: (parseInt(this.element.css("marginRight"), 10) || 0),
6285
+ bottom: (parseInt(this.element.css("marginBottom"), 10) || 0)
6286
+ };
6287
+ },
6288
+
6289
+ _cacheHelperProportions: function() {
6290
+ this.helperProportions = {
6291
+ width: this.helper.outerWidth(),
6292
+ height: this.helper.outerHeight()
6293
+ };
6294
+ },
6295
+
6296
+ _setContainment: function() {
6297
+
6298
+ var isUserScrollable, c, ce,
6299
+ o = this.options,
6300
+ document = this.document[ 0 ];
6301
+
6302
+ this.relativeContainer = null;
6303
+
6304
+ if ( !o.containment ) {
6305
+ this.containment = null;
6306
+ return;
6307
+ }
6308
+
6309
+ if ( o.containment === "window" ) {
6310
+ this.containment = [
6311
+ $( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
6312
+ $( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,
6313
+ $( window ).scrollLeft() + $( window ).width() - this.helperProportions.width - this.margins.left,
6314
+ $( window ).scrollTop() + ( $( window ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top
6315
+ ];
6316
+ return;
6317
+ }
6318
+
6319
+ if ( o.containment === "document") {
6320
+ this.containment = [
6321
+ 0,
6322
+ 0,
6323
+ $( document ).width() - this.helperProportions.width - this.margins.left,
6324
+ ( $( document ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top
6325
+ ];
6326
+ return;
6327
+ }
6328
+
6329
+ if ( o.containment.constructor === Array ) {
6330
+ this.containment = o.containment;
6331
+ return;
6332
+ }
6333
+
6334
+ if ( o.containment === "parent" ) {
6335
+ o.containment = this.helper[ 0 ].parentNode;
6336
+ }
6337
+
6338
+ c = $( o.containment );
6339
+ ce = c[ 0 ];
6340
+
6341
+ if ( !ce ) {
6342
+ return;
6343
+ }
6344
+
6345
+ isUserScrollable = /(scroll|auto)/.test( c.css( "overflow" ) );
6346
+
6347
+ this.containment = [
6348
+ ( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ),
6349
+ ( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingTop" ), 10 ) || 0 ),
6350
+ ( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -
6351
+ ( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) -
6352
+ ( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) -
6353
+ this.helperProportions.width -
6354
+ this.margins.left -
6355
+ this.margins.right,
6356
+ ( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -
6357
+ ( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) -
6358
+ ( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) -
6359
+ this.helperProportions.height -
6360
+ this.margins.top -
6361
+ this.margins.bottom
6362
+ ];
6363
+ this.relativeContainer = c;
6364
+ },
6365
+
6366
+ _convertPositionTo: function(d, pos) {
6367
+
6368
+ if (!pos) {
6369
+ pos = this.position;
6370
+ }
6371
+
6372
+ var mod = d === "absolute" ? 1 : -1,
6373
+ scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
6374
+
6375
+ return {
6376
+ top: (
6377
+ pos.top + // The absolute mouse position
6378
+ this.offset.relative.top * mod + // Only for relative positioned nodes: Relative offset from element to offset parent
6379
+ this.offset.parent.top * mod - // The offsetParent's offset without borders (offset + border)
6380
+ ( ( this.cssPosition === "fixed" ? -this.offset.scroll.top : ( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod)
6381
+ ),
6382
+ left: (
6383
+ pos.left + // The absolute mouse position
6384
+ this.offset.relative.left * mod + // Only for relative positioned nodes: Relative offset from element to offset parent
6385
+ this.offset.parent.left * mod - // The offsetParent's offset without borders (offset + border)
6386
+ ( ( this.cssPosition === "fixed" ? -this.offset.scroll.left : ( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod)
6387
+ )
6388
+ };
6389
+
6390
+ },
6391
+
6392
+ _generatePosition: function( event, constrainPosition ) {
6393
+
6394
+ var containment, co, top, left,
6395
+ o = this.options,
6396
+ scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ),
6397
+ pageX = event.pageX,
6398
+ pageY = event.pageY;
6399
+
6400
+ // Cache the scroll
6401
+ if ( !scrollIsRootNode || !this.offset.scroll ) {
6402
+ this.offset.scroll = {
6403
+ top: this.scrollParent.scrollTop(),
6404
+ left: this.scrollParent.scrollLeft()
6405
+ };
6406
+ }
6407
+
6408
+ /*
6409
+ * - Position constraining -
6410
+ * Constrain the position to a mix of grid, containment.
6411
+ */
6412
+
6413
+ // If we are not dragging yet, we won't check for options
6414
+ if ( constrainPosition ) {
6415
+ if ( this.containment ) {
6416
+ if ( this.relativeContainer ){
6417
+ co = this.relativeContainer.offset();
6418
+ containment = [
6419
+ this.containment[ 0 ] + co.left,
6420
+ this.containment[ 1 ] + co.top,
6421
+ this.containment[ 2 ] + co.left,
6422
+ this.containment[ 3 ] + co.top
6423
+ ];
6424
+ } else {
6425
+ containment = this.containment;
6426
+ }
6427
+
6428
+ if (event.pageX - this.offset.click.left < containment[0]) {
6429
+ pageX = containment[0] + this.offset.click.left;
6430
+ }
6431
+ if (event.pageY - this.offset.click.top < containment[1]) {
6432
+ pageY = containment[1] + this.offset.click.top;
6433
+ }
6434
+ if (event.pageX - this.offset.click.left > containment[2]) {
6435
+ pageX = containment[2] + this.offset.click.left;
6436
+ }
6437
+ if (event.pageY - this.offset.click.top > containment[3]) {
6438
+ pageY = containment[3] + this.offset.click.top;
6439
+ }
6440
+ }
6441
+
6442
+ if (o.grid) {
6443
+ //Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)
6444
+ top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;
6445
+ pageY = containment ? ((top - this.offset.click.top >= containment[1] || top - this.offset.click.top > containment[3]) ? top : ((top - this.offset.click.top >= containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
6446
+
6447
+ left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;
6448
+ pageX = containment ? ((left - this.offset.click.left >= containment[0] || left - this.offset.click.left > containment[2]) ? left : ((left - this.offset.click.left >= containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
6449
+ }
6450
+
6451
+ if ( o.axis === "y" ) {
6452
+ pageX = this.originalPageX;
6453
+ }
6454
+
6455
+ if ( o.axis === "x" ) {
6456
+ pageY = this.originalPageY;
6457
+ }
6458
+ }
6459
+
6460
+ return {
6461
+ top: (
6462
+ pageY - // The absolute mouse position
6463
+ this.offset.click.top - // Click offset (relative to the element)
6464
+ this.offset.relative.top - // Only for relative positioned nodes: Relative offset from element to offset parent
6465
+ this.offset.parent.top + // The offsetParent's offset without borders (offset + border)
6466
+ ( this.cssPosition === "fixed" ? -this.offset.scroll.top : ( scrollIsRootNode ? 0 : this.offset.scroll.top ) )
6467
+ ),
6468
+ left: (
6469
+ pageX - // The absolute mouse position
6470
+ this.offset.click.left - // Click offset (relative to the element)
6471
+ this.offset.relative.left - // Only for relative positioned nodes: Relative offset from element to offset parent
6472
+ this.offset.parent.left + // The offsetParent's offset without borders (offset + border)
6473
+ ( this.cssPosition === "fixed" ? -this.offset.scroll.left : ( scrollIsRootNode ? 0 : this.offset.scroll.left ) )
6474
+ )
6475
+ };
6476
+
6477
+ },
6478
+
6479
+ _clear: function() {
6480
+ this.helper.removeClass("ui-draggable-dragging");
6481
+ if (this.helper[0] !== this.element[0] && !this.cancelHelperRemoval) {
6482
+ this.helper.remove();
6483
+ }
6484
+ this.helper = null;
6485
+ this.cancelHelperRemoval = false;
6486
+ if ( this.destroyOnClear ) {
6487
+ this.destroy();
6488
+ }
6489
+ },
6490
+
6491
+ _normalizeRightBottom: function() {
6492
+ if ( this.options.axis !== "y" && this.helper.css( "right" ) !== "auto" ) {
6493
+ this.helper.width( this.helper.width() );
6494
+ this.helper.css( "right", "auto" );
6495
+ }
6496
+ if ( this.options.axis !== "x" && this.helper.css( "bottom" ) !== "auto" ) {
6497
+ this.helper.height( this.helper.height() );
6498
+ this.helper.css( "bottom", "auto" );
6499
+ }
6500
+ },
6501
+
6502
+ // From now on bulk stuff - mainly helpers
6503
+
6504
+ _trigger: function( type, event, ui ) {
6505
+ ui = ui || this._uiHash();
6506
+ $.ui.plugin.call( this, type, [ event, ui, this ], true );
6507
+
6508
+ // Absolute position and offset (see #6884 ) have to be recalculated after plugins
6509
+ if ( /^(drag|start|stop)/.test( type ) ) {
6510
+ this.positionAbs = this._convertPositionTo( "absolute" );
6511
+ ui.offset = this.positionAbs;
6512
+ }
6513
+ return $.Widget.prototype._trigger.call( this, type, event, ui );
6514
+ },
6515
+
6516
+ plugins: {},
6517
+
6518
+ _uiHash: function() {
6519
+ return {
6520
+ helper: this.helper,
6521
+ position: this.position,
6522
+ originalPosition: this.originalPosition,
6523
+ offset: this.positionAbs
6524
+ };
6525
+ }
6526
+
6527
+ });
6528
+
6529
+ $.ui.plugin.add( "draggable", "connectToSortable", {
6530
+ start: function( event, ui, draggable ) {
6531
+ var uiSortable = $.extend( {}, ui, {
6532
+ item: draggable.element
6533
+ });
6534
+
6535
+ draggable.sortables = [];
6536
+ $( draggable.options.connectToSortable ).each(function() {
6537
+ var sortable = $( this ).sortable( "instance" );
6538
+
6539
+ if ( sortable && !sortable.options.disabled ) {
6540
+ draggable.sortables.push( sortable );
6541
+
6542
+ // refreshPositions is called at drag start to refresh the containerCache
6543
+ // which is used in drag. This ensures it's initialized and synchronized
6544
+ // with any changes that might have happened on the page since initialization.
6545
+ sortable.refreshPositions();
6546
+ sortable._trigger("activate", event, uiSortable);
6547
+ }
6548
+ });
6549
+ },
6550
+ stop: function( event, ui, draggable ) {
6551
+ var uiSortable = $.extend( {}, ui, {
6552
+ item: draggable.element
6553
+ });
6554
+
6555
+ draggable.cancelHelperRemoval = false;
6556
+
6557
+ $.each( draggable.sortables, function() {
6558
+ var sortable = this;
6559
+
6560
+ if ( sortable.isOver ) {
6561
+ sortable.isOver = 0;
6562
+
6563
+ // Allow this sortable to handle removing the helper
6564
+ draggable.cancelHelperRemoval = true;
6565
+ sortable.cancelHelperRemoval = false;
6566
+
6567
+ // Use _storedCSS To restore properties in the sortable,
6568
+ // as this also handles revert (#9675) since the draggable
6569
+ // may have modified them in unexpected ways (#8809)
6570
+ sortable._storedCSS = {
6571
+ position: sortable.placeholder.css( "position" ),
6572
+ top: sortable.placeholder.css( "top" ),
6573
+ left: sortable.placeholder.css( "left" )
6574
+ };
6575
+
6576
+ sortable._mouseStop(event);
6577
+
6578
+ // Once drag has ended, the sortable should return to using
6579
+ // its original helper, not the shared helper from draggable
6580
+ sortable.options.helper = sortable.options._helper;
6581
+ } else {
6582
+ // Prevent this Sortable from removing the helper.
6583
+ // However, don't set the draggable to remove the helper
6584
+ // either as another connected Sortable may yet handle the removal.
6585
+ sortable.cancelHelperRemoval = true;
6586
+
6587
+ sortable._trigger( "deactivate", event, uiSortable );
6588
+ }
6589
+ });
6590
+ },
6591
+ drag: function( event, ui, draggable ) {
6592
+ $.each( draggable.sortables, function() {
6593
+ var innermostIntersecting = false,
6594
+ sortable = this;
6595
+
6596
+ // Copy over variables that sortable's _intersectsWith uses
6597
+ sortable.positionAbs = draggable.positionAbs;
6598
+ sortable.helperProportions = draggable.helperProportions;
6599
+ sortable.offset.click = draggable.offset.click;
6600
+
6601
+ if ( sortable._intersectsWith( sortable.containerCache ) ) {
6602
+ innermostIntersecting = true;
6603
+
6604
+ $.each( draggable.sortables, function() {
6605
+ // Copy over variables that sortable's _intersectsWith uses
6606
+ this.positionAbs = draggable.positionAbs;
6607
+ this.helperProportions = draggable.helperProportions;
6608
+ this.offset.click = draggable.offset.click;
6609
+
6610
+ if ( this !== sortable &&
6611
+ this._intersectsWith( this.containerCache ) &&
6612
+ $.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) {
6613
+ innermostIntersecting = false;
6614
+ }
6615
+
6616
+ return innermostIntersecting;
6617
+ });
6618
+ }
6619
+
6620
+ if ( innermostIntersecting ) {
6621
+ // If it intersects, we use a little isOver variable and set it once,
6622
+ // so that the move-in stuff gets fired only once.
6623
+ if ( !sortable.isOver ) {
6624
+ sortable.isOver = 1;
6625
+
6626
+ // Store draggable's parent in case we need to reappend to it later.
6627
+ draggable._parent = ui.helper.parent();
6628
+
6629
+ sortable.currentItem = ui.helper
6630
+ .appendTo( sortable.element )
6631
+ .data( "ui-sortable-item", true );
6632
+
6633
+ // Store helper option to later restore it
6634
+ sortable.options._helper = sortable.options.helper;
6635
+
6636
+ sortable.options.helper = function() {
6637
+ return ui.helper[ 0 ];
6638
+ };
6639
+
6640
+ // Fire the start events of the sortable with our passed browser event,
6641
+ // and our own helper (so it doesn't create a new one)
6642
+ event.target = sortable.currentItem[ 0 ];
6643
+ sortable._mouseCapture( event, true );
6644
+ sortable._mouseStart( event, true, true );
6645
+
6646
+ // Because the browser event is way off the new appended portlet,
6647
+ // modify necessary variables to reflect the changes
6648
+ sortable.offset.click.top = draggable.offset.click.top;
6649
+ sortable.offset.click.left = draggable.offset.click.left;
6650
+ sortable.offset.parent.left -= draggable.offset.parent.left -
6651
+ sortable.offset.parent.left;
6652
+ sortable.offset.parent.top -= draggable.offset.parent.top -
6653
+ sortable.offset.parent.top;
6654
+
6655
+ draggable._trigger( "toSortable", event );
6656
+
6657
+ // Inform draggable that the helper is in a valid drop zone,
6658
+ // used solely in the revert option to handle "valid/invalid".
6659
+ draggable.dropped = sortable.element;
6660
+
6661
+ // Need to refreshPositions of all sortables in the case that
6662
+ // adding to one sortable changes the location of the other sortables (#9675)
6663
+ $.each( draggable.sortables, function() {
6664
+ this.refreshPositions();
6665
+ });
6666
+
6667
+ // hack so receive/update callbacks work (mostly)
6668
+ draggable.currentItem = draggable.element;
6669
+ sortable.fromOutside = draggable;
6670
+ }
6671
+
6672
+ if ( sortable.currentItem ) {
6673
+ sortable._mouseDrag( event );
6674
+ // Copy the sortable's position because the draggable's can potentially reflect
6675
+ // a relative position, while sortable is always absolute, which the dragged
6676
+ // element has now become. (#8809)
6677
+ ui.position = sortable.position;
6678
+ }
6679
+ } else {
6680
+ // If it doesn't intersect with the sortable, and it intersected before,
6681
+ // we fake the drag stop of the sortable, but make sure it doesn't remove
6682
+ // the helper by using cancelHelperRemoval.
6683
+ if ( sortable.isOver ) {
6684
+
6685
+ sortable.isOver = 0;
6686
+ sortable.cancelHelperRemoval = true;
6687
+
6688
+ // Calling sortable's mouseStop would trigger a revert,
6689
+ // so revert must be temporarily false until after mouseStop is called.
6690
+ sortable.options._revert = sortable.options.revert;
6691
+ sortable.options.revert = false;
6692
+
6693
+ sortable._trigger( "out", event, sortable._uiHash( sortable ) );
6694
+ sortable._mouseStop( event, true );
6695
+
6696
+ // restore sortable behaviors that were modfied
6697
+ // when the draggable entered the sortable area (#9481)
6698
+ sortable.options.revert = sortable.options._revert;
6699
+ sortable.options.helper = sortable.options._helper;
6700
+
6701
+ if ( sortable.placeholder ) {
6702
+ sortable.placeholder.remove();
6703
+ }
6704
+
6705
+ // Restore and recalculate the draggable's offset considering the sortable
6706
+ // may have modified them in unexpected ways. (#8809, #10669)
6707
+ ui.helper.appendTo( draggable._parent );
6708
+ draggable._refreshOffsets( event );
6709
+ ui.position = draggable._generatePosition( event, true );
6710
+
6711
+ draggable._trigger( "fromSortable", event );
6712
+
6713
+ // Inform draggable that the helper is no longer in a valid drop zone
6714
+ draggable.dropped = false;
6715
+
6716
+ // Need to refreshPositions of all sortables just in case removing
6717
+ // from one sortable changes the location of other sortables (#9675)
6718
+ $.each( draggable.sortables, function() {
6719
+ this.refreshPositions();
6720
+ });
6721
+ }
6722
+ }
6723
+ });
6724
+ }
6725
+ });
6726
+
6727
+ $.ui.plugin.add("draggable", "cursor", {
6728
+ start: function( event, ui, instance ) {
6729
+ var t = $( "body" ),
6730
+ o = instance.options;
6731
+
6732
+ if (t.css("cursor")) {
6733
+ o._cursor = t.css("cursor");
6734
+ }
6735
+ t.css("cursor", o.cursor);
6736
+ },
6737
+ stop: function( event, ui, instance ) {
6738
+ var o = instance.options;
6739
+ if (o._cursor) {
6740
+ $("body").css("cursor", o._cursor);
6741
+ }
6742
+ }
6743
+ });
6744
+
6745
+ $.ui.plugin.add("draggable", "opacity", {
6746
+ start: function( event, ui, instance ) {
6747
+ var t = $( ui.helper ),
6748
+ o = instance.options;
6749
+ if (t.css("opacity")) {
6750
+ o._opacity = t.css("opacity");
6751
+ }
6752
+ t.css("opacity", o.opacity);
6753
+ },
6754
+ stop: function( event, ui, instance ) {
6755
+ var o = instance.options;
6756
+ if (o._opacity) {
6757
+ $(ui.helper).css("opacity", o._opacity);
6758
+ }
6759
+ }
6760
+ });
6761
+
6762
+ $.ui.plugin.add("draggable", "scroll", {
6763
+ start: function( event, ui, i ) {
6764
+ if ( !i.scrollParentNotHidden ) {
6765
+ i.scrollParentNotHidden = i.helper.scrollParent( false );
6766
+ }
6767
+
6768
+ if ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] && i.scrollParentNotHidden[ 0 ].tagName !== "HTML" ) {
6769
+ i.overflowOffset = i.scrollParentNotHidden.offset();
6770
+ }
6771
+ },
6772
+ drag: function( event, ui, i ) {
6773
+
6774
+ var o = i.options,
6775
+ scrolled = false,
6776
+ scrollParent = i.scrollParentNotHidden[ 0 ],
6777
+ document = i.document[ 0 ];
6778
+
6779
+ if ( scrollParent !== document && scrollParent.tagName !== "HTML" ) {
6780
+ if ( !o.axis || o.axis !== "x" ) {
6781
+ if ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY < o.scrollSensitivity ) {
6782
+ scrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;
6783
+ } else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) {
6784
+ scrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;
6785
+ }
6786
+ }
6787
+
6788
+ if ( !o.axis || o.axis !== "y" ) {
6789
+ if ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX < o.scrollSensitivity ) {
6790
+ scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;
6791
+ } else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) {
6792
+ scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;
6793
+ }
6794
+ }
6795
+
6796
+ } else {
6797
+
6798
+ if (!o.axis || o.axis !== "x") {
6799
+ if (event.pageY - $(document).scrollTop() < o.scrollSensitivity) {
6800
+ scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
6801
+ } else if ($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) {
6802
+ scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
6803
+ }
6804
+ }
6805
+
6806
+ if (!o.axis || o.axis !== "y") {
6807
+ if (event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {
6808
+ scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
6809
+ } else if ($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) {
6810
+ scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
6811
+ }
6812
+ }
6813
+
6814
+ }
6815
+
6816
+ if (scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
6817
+ $.ui.ddmanager.prepareOffsets(i, event);
6818
+ }
6819
+
6820
+ }
6821
+ });
6822
+
6823
+ $.ui.plugin.add("draggable", "snap", {
6824
+ start: function( event, ui, i ) {
6825
+
6826
+ var o = i.options;
6827
+
6828
+ i.snapElements = [];
6829
+
6830
+ $(o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap).each(function() {
6831
+ var $t = $(this),
6832
+ $o = $t.offset();
6833
+ if (this !== i.element[0]) {
6834
+ i.snapElements.push({
6835
+ item: this,
6836
+ width: $t.outerWidth(), height: $t.outerHeight(),
6837
+ top: $o.top, left: $o.left
6838
+ });
6839
+ }
6840
+ });
6841
+
6842
+ },
6843
+ drag: function( event, ui, inst ) {
6844
+
6845
+ var ts, bs, ls, rs, l, r, t, b, i, first,
6846
+ o = inst.options,
6847
+ d = o.snapTolerance,
6848
+ x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
6849
+ y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
6850
+
6851
+ for (i = inst.snapElements.length - 1; i >= 0; i--){
6852
+
6853
+ l = inst.snapElements[i].left - inst.margins.left;
6854
+ r = l + inst.snapElements[i].width;
6855
+ t = inst.snapElements[i].top - inst.margins.top;
6856
+ b = t + inst.snapElements[i].height;
6857
+
6858
+ if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d || !$.contains( inst.snapElements[ i ].item.ownerDocument, inst.snapElements[ i ].item ) ) {
6859
+ if (inst.snapElements[i].snapping) {
6860
+ (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
6861
+ }
6862
+ inst.snapElements[i].snapping = false;
6863
+ continue;
6864
+ }
6865
+
6866
+ if (o.snapMode !== "inner") {
6867
+ ts = Math.abs(t - y2) <= d;
6868
+ bs = Math.abs(b - y1) <= d;
6869
+ ls = Math.abs(l - x2) <= d;
6870
+ rs = Math.abs(r - x1) <= d;
6871
+ if (ts) {
6872
+ ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top;
6873
+ }
6874
+ if (bs) {
6875
+ ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top;
6876
+ }
6877
+ if (ls) {
6878
+ ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left;
6879
+ }
6880
+ if (rs) {
6881
+ ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left;
6882
+ }
6883
+ }
6884
+
6885
+ first = (ts || bs || ls || rs);
6886
+
6887
+ if (o.snapMode !== "outer") {
6888
+ ts = Math.abs(t - y1) <= d;
6889
+ bs = Math.abs(b - y2) <= d;
6890
+ ls = Math.abs(l - x1) <= d;
6891
+ rs = Math.abs(r - x2) <= d;
6892
+ if (ts) {
6893
+ ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top;
6894
+ }
6895
+ if (bs) {
6896
+ ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top;
6897
+ }
6898
+ if (ls) {
6899
+ ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left;
6900
+ }
6901
+ if (rs) {
6902
+ ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left;
6903
+ }
6904
+ }
6905
+
6906
+ if (!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) {
6907
+ (inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
6908
+ }
6909
+ inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
6910
+
6911
+ }
6912
+
6913
+ }
6914
+ });
6915
+
6916
+ $.ui.plugin.add("draggable", "stack", {
6917
+ start: function( event, ui, instance ) {
6918
+ var min,
6919
+ o = instance.options,
6920
+ group = $.makeArray($(o.stack)).sort(function(a, b) {
6921
+ return (parseInt($(a).css("zIndex"), 10) || 0) - (parseInt($(b).css("zIndex"), 10) || 0);
6922
+ });
6923
+
6924
+ if (!group.length) { return; }
6925
+
6926
+ min = parseInt($(group[0]).css("zIndex"), 10) || 0;
6927
+ $(group).each(function(i) {
6928
+ $(this).css("zIndex", min + i);
6929
+ });
6930
+ this.css("zIndex", (min + group.length));
6931
+ }
6932
+ });
6933
+
6934
+ $.ui.plugin.add("draggable", "zIndex", {
6935
+ start: function( event, ui, instance ) {
6936
+ var t = $( ui.helper ),
6937
+ o = instance.options;
6938
+
6939
+ if (t.css("zIndex")) {
6940
+ o._zIndex = t.css("zIndex");
6941
+ }
6942
+ t.css("zIndex", o.zIndex);
6943
+ },
6944
+ stop: function( event, ui, instance ) {
6945
+ var o = instance.options;
6946
+
6947
+ if (o._zIndex) {
6948
+ $(ui.helper).css("zIndex", o._zIndex);
6949
+ }
6950
+ }
6951
+ });
6952
+
6953
+ var draggable = $.ui.draggable;
6954
+
6955
+
6956
+ /*!
6957
+ * jQuery UI Resizable 1.11.4
6958
+ * http://jqueryui.com
6959
+ *
6960
+ * Copyright jQuery Foundation and other contributors
6961
+ * Released under the MIT license.
6962
+ * http://jquery.org/license
6963
+ *
6964
+ * http://api.jqueryui.com/resizable/
6965
+ */
6966
+
6967
+
6968
+ $.widget("ui.resizable", $.ui.mouse, {
6969
+ version: "1.11.4",
6970
+ widgetEventPrefix: "resize",
6971
+ options: {
6972
+ alsoResize: false,
6973
+ animate: false,
6974
+ animateDuration: "slow",
6975
+ animateEasing: "swing",
6976
+ aspectRatio: false,
6977
+ autoHide: false,
6978
+ containment: false,
6979
+ ghost: false,
6980
+ grid: false,
6981
+ handles: "e,s,se",
6982
+ helper: false,
6983
+ maxHeight: null,
6984
+ maxWidth: null,
6985
+ minHeight: 10,
6986
+ minWidth: 10,
6987
+ // See #7960
6988
+ zIndex: 90,
6989
+
6990
+ // callbacks
6991
+ resize: null,
6992
+ start: null,
6993
+ stop: null
6994
+ },
6995
+
6996
+ _num: function( value ) {
6997
+ return parseInt( value, 10 ) || 0;
6998
+ },
6999
+
7000
+ _isNumber: function( value ) {
7001
+ return !isNaN( parseInt( value, 10 ) );
7002
+ },
7003
+
7004
+ _hasScroll: function( el, a ) {
7005
+
7006
+ if ( $( el ).css( "overflow" ) === "hidden") {
7007
+ return false;
7008
+ }
7009
+
7010
+ var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
7011
+ has = false;
7012
+
7013
+ if ( el[ scroll ] > 0 ) {
7014
+ return true;
7015
+ }
7016
+
7017
+ // TODO: determine which cases actually cause this to happen
7018
+ // if the element doesn't have the scroll set, see if it's possible to
7019
+ // set the scroll
7020
+ el[ scroll ] = 1;
7021
+ has = ( el[ scroll ] > 0 );
7022
+ el[ scroll ] = 0;
7023
+ return has;
7024
+ },
7025
+
7026
+ _create: function() {
7027
+
7028
+ var n, i, handle, axis, hname,
7029
+ that = this,
7030
+ o = this.options;
7031
+ this.element.addClass("ui-resizable");
7032
+
7033
+ $.extend(this, {
7034
+ _aspectRatio: !!(o.aspectRatio),
7035
+ aspectRatio: o.aspectRatio,
7036
+ originalElement: this.element,
7037
+ _proportionallyResizeElements: [],
7038
+ _helper: o.helper || o.ghost || o.animate ? o.helper || "ui-resizable-helper" : null
7039
+ });
7040
+
7041
+ // Wrap the element if it cannot hold child nodes
7042
+ if (this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)) {
7043
+
7044
+ this.element.wrap(
7045
+ $("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({
7046
+ position: this.element.css("position"),
7047
+ width: this.element.outerWidth(),
7048
+ height: this.element.outerHeight(),
7049
+ top: this.element.css("top"),
7050
+ left: this.element.css("left")
7051
+ })
7052
+ );
7053
+
7054
+ this.element = this.element.parent().data(
7055
+ "ui-resizable", this.element.resizable( "instance" )
7056
+ );
7057
+
7058
+ this.elementIsWrapper = true;
7059
+
7060
+ this.element.css({
7061
+ marginLeft: this.originalElement.css("marginLeft"),
7062
+ marginTop: this.originalElement.css("marginTop"),
7063
+ marginRight: this.originalElement.css("marginRight"),
7064
+ marginBottom: this.originalElement.css("marginBottom")
7065
+ });
7066
+ this.originalElement.css({
7067
+ marginLeft: 0,
7068
+ marginTop: 0,
7069
+ marginRight: 0,
7070
+ marginBottom: 0
7071
+ });
7072
+ // support: Safari
7073
+ // Prevent Safari textarea resize
7074
+ this.originalResizeStyle = this.originalElement.css("resize");
7075
+ this.originalElement.css("resize", "none");
7076
+
7077
+ this._proportionallyResizeElements.push( this.originalElement.css({
7078
+ position: "static",
7079
+ zoom: 1,
7080
+ display: "block"
7081
+ }) );
7082
+
7083
+ // support: IE9
7084
+ // avoid IE jump (hard set the margin)
7085
+ this.originalElement.css({ margin: this.originalElement.css("margin") });
7086
+
7087
+ this._proportionallyResize();
7088
+ }
7089
+
7090
+ this.handles = o.handles ||
7091
+ ( !$(".ui-resizable-handle", this.element).length ?
7092
+ "e,s,se" : {
7093
+ n: ".ui-resizable-n",
7094
+ e: ".ui-resizable-e",
7095
+ s: ".ui-resizable-s",
7096
+ w: ".ui-resizable-w",
7097
+ se: ".ui-resizable-se",
7098
+ sw: ".ui-resizable-sw",
7099
+ ne: ".ui-resizable-ne",
7100
+ nw: ".ui-resizable-nw"
7101
+ } );
7102
+
7103
+ this._handles = $();
7104
+ if ( this.handles.constructor === String ) {
7105
+
7106
+ if ( this.handles === "all") {
7107
+ this.handles = "n,e,s,w,se,sw,ne,nw";
7108
+ }
7109
+
7110
+ n = this.handles.split(",");
7111
+ this.handles = {};
7112
+
7113
+ for (i = 0; i < n.length; i++) {
7114
+
7115
+ handle = $.trim(n[i]);
7116
+ hname = "ui-resizable-" + handle;
7117
+ axis = $("<div class='ui-resizable-handle " + hname + "'></div>");
7118
+
7119
+ axis.css({ zIndex: o.zIndex });
7120
+
7121
+ // TODO : What's going on here?
7122
+ if ("se" === handle) {
7123
+ axis.addClass("ui-icon ui-icon-gripsmall-diagonal-se");
7124
+ }
7125
+
7126
+ this.handles[handle] = ".ui-resizable-" + handle;
7127
+ this.element.append(axis);
7128
+ }
7129
+
7130
+ }
7131
+
7132
+ this._renderAxis = function(target) {
7133
+
7134
+ var i, axis, padPos, padWrapper;
7135
+
7136
+ target = target || this.element;
7137
+
7138
+ for (i in this.handles) {
7139
+
7140
+ if (this.handles[i].constructor === String) {
7141
+ this.handles[i] = this.element.children( this.handles[ i ] ).first().show();
7142
+ } else if ( this.handles[ i ].jquery || this.handles[ i ].nodeType ) {
7143
+ this.handles[ i ] = $( this.handles[ i ] );
7144
+ this._on( this.handles[ i ], { "mousedown": that._mouseDown });
7145
+ }
7146
+
7147
+ if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)) {
7148
+
7149
+ axis = $(this.handles[i], this.element);
7150
+
7151
+ padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
7152
+
7153
+ padPos = [ "padding",
7154
+ /ne|nw|n/.test(i) ? "Top" :
7155
+ /se|sw|s/.test(i) ? "Bottom" :
7156
+ /^e$/.test(i) ? "Right" : "Left" ].join("");
7157
+
7158
+ target.css(padPos, padWrapper);
7159
+
7160
+ this._proportionallyResize();
7161
+ }
7162
+
7163
+ this._handles = this._handles.add( this.handles[ i ] );
7164
+ }
7165
+ };
7166
+
7167
+ // TODO: make renderAxis a prototype function
7168
+ this._renderAxis(this.element);
7169
+
7170
+ this._handles = this._handles.add( this.element.find( ".ui-resizable-handle" ) );
7171
+ this._handles.disableSelection();
7172
+
7173
+ this._handles.mouseover(function() {
7174
+ if (!that.resizing) {
7175
+ if (this.className) {
7176
+ axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
7177
+ }
7178
+ that.axis = axis && axis[1] ? axis[1] : "se";
7179
+ }
7180
+ });
7181
+
7182
+ if (o.autoHide) {
7183
+ this._handles.hide();
7184
+ $(this.element)
7185
+ .addClass("ui-resizable-autohide")
7186
+ .mouseenter(function() {
7187
+ if (o.disabled) {
7188
+ return;
7189
+ }
7190
+ $(this).removeClass("ui-resizable-autohide");
7191
+ that._handles.show();
7192
+ })
7193
+ .mouseleave(function() {
7194
+ if (o.disabled) {
7195
+ return;
7196
+ }
7197
+ if (!that.resizing) {
7198
+ $(this).addClass("ui-resizable-autohide");
7199
+ that._handles.hide();
7200
+ }
7201
+ });
7202
+ }
7203
+
7204
+ this._mouseInit();
7205
+ },
7206
+
7207
+ _destroy: function() {
7208
+
7209
+ this._mouseDestroy();
7210
+
7211
+ var wrapper,
7212
+ _destroy = function(exp) {
7213
+ $(exp)
7214
+ .removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
7215
+ .removeData("resizable")
7216
+ .removeData("ui-resizable")
7217
+ .unbind(".resizable")
7218
+ .find(".ui-resizable-handle")
7219
+ .remove();
7220
+ };
7221
+
7222
+ // TODO: Unwrap at same DOM position
7223
+ if (this.elementIsWrapper) {
7224
+ _destroy(this.element);
7225
+ wrapper = this.element;
7226
+ this.originalElement.css({
7227
+ position: wrapper.css("position"),
7228
+ width: wrapper.outerWidth(),
7229
+ height: wrapper.outerHeight(),
7230
+ top: wrapper.css("top"),
7231
+ left: wrapper.css("left")
7232
+ }).insertAfter( wrapper );
7233
+ wrapper.remove();
7234
+ }
7235
+
7236
+ this.originalElement.css("resize", this.originalResizeStyle);
7237
+ _destroy(this.originalElement);
7238
+
7239
+ return this;
7240
+ },
7241
+
7242
+ _mouseCapture: function(event) {
7243
+ var i, handle,
7244
+ capture = false;
7245
+
7246
+ for (i in this.handles) {
7247
+ handle = $(this.handles[i])[0];
7248
+ if (handle === event.target || $.contains(handle, event.target)) {
7249
+ capture = true;
7250
+ }
7251
+ }
7252
+
7253
+ return !this.options.disabled && capture;
7254
+ },
7255
+
7256
+ _mouseStart: function(event) {
7257
+
7258
+ var curleft, curtop, cursor,
7259
+ o = this.options,
7260
+ el = this.element;
7261
+
7262
+ this.resizing = true;
7263
+
7264
+ this._renderProxy();
7265
+
7266
+ curleft = this._num(this.helper.css("left"));
7267
+ curtop = this._num(this.helper.css("top"));
7268
+
7269
+ if (o.containment) {
7270
+ curleft += $(o.containment).scrollLeft() || 0;
7271
+ curtop += $(o.containment).scrollTop() || 0;
7272
+ }
7273
+
7274
+ this.offset = this.helper.offset();
7275
+ this.position = { left: curleft, top: curtop };
7276
+
7277
+ this.size = this._helper ? {
7278
+ width: this.helper.width(),
7279
+ height: this.helper.height()
7280
+ } : {
7281
+ width: el.width(),
7282
+ height: el.height()
7283
+ };
7284
+
7285
+ this.originalSize = this._helper ? {
7286
+ width: el.outerWidth(),
7287
+ height: el.outerHeight()
7288
+ } : {
7289
+ width: el.width(),
7290
+ height: el.height()
7291
+ };
7292
+
7293
+ this.sizeDiff = {
7294
+ width: el.outerWidth() - el.width(),
7295
+ height: el.outerHeight() - el.height()
7296
+ };
7297
+
7298
+ this.originalPosition = { left: curleft, top: curtop };
7299
+ this.originalMousePosition = { left: event.pageX, top: event.pageY };
7300
+
7301
+ this.aspectRatio = (typeof o.aspectRatio === "number") ?
7302
+ o.aspectRatio :
7303
+ ((this.originalSize.width / this.originalSize.height) || 1);
7304
+
7305
+ cursor = $(".ui-resizable-" + this.axis).css("cursor");
7306
+ $("body").css("cursor", cursor === "auto" ? this.axis + "-resize" : cursor);
7307
+
7308
+ el.addClass("ui-resizable-resizing");
7309
+ this._propagate("start", event);
7310
+ return true;
7311
+ },
7312
+
7313
+ _mouseDrag: function(event) {
7314
+
7315
+ var data, props,
7316
+ smp = this.originalMousePosition,
7317
+ a = this.axis,
7318
+ dx = (event.pageX - smp.left) || 0,
7319
+ dy = (event.pageY - smp.top) || 0,
7320
+ trigger = this._change[a];
7321
+
7322
+ this._updatePrevProperties();
7323
+
7324
+ if (!trigger) {
7325
+ return false;
7326
+ }
7327
+
7328
+ data = trigger.apply(this, [ event, dx, dy ]);
7329
+
7330
+ this._updateVirtualBoundaries(event.shiftKey);
7331
+ if (this._aspectRatio || event.shiftKey) {
7332
+ data = this._updateRatio(data, event);
7333
+ }
7334
+
7335
+ data = this._respectSize(data, event);
7336
+
7337
+ this._updateCache(data);
7338
+
7339
+ this._propagate("resize", event);
7340
+
7341
+ props = this._applyChanges();
7342
+
7343
+ if ( !this._helper && this._proportionallyResizeElements.length ) {
7344
+ this._proportionallyResize();
7345
+ }
7346
+
7347
+ if ( !$.isEmptyObject( props ) ) {
7348
+ this._updatePrevProperties();
7349
+ this._trigger( "resize", event, this.ui() );
7350
+ this._applyChanges();
7351
+ }
7352
+
7353
+ return false;
7354
+ },
7355
+
7356
+ _mouseStop: function(event) {
7357
+
7358
+ this.resizing = false;
7359
+ var pr, ista, soffseth, soffsetw, s, left, top,
7360
+ o = this.options, that = this;
7361
+
7362
+ if (this._helper) {
7363
+
7364
+ pr = this._proportionallyResizeElements;
7365
+ ista = pr.length && (/textarea/i).test(pr[0].nodeName);
7366
+ soffseth = ista && this._hasScroll(pr[0], "left") ? 0 : that.sizeDiff.height;
7367
+ soffsetw = ista ? 0 : that.sizeDiff.width;
7368
+
7369
+ s = {
7370
+ width: (that.helper.width() - soffsetw),
7371
+ height: (that.helper.height() - soffseth)
7372
+ };
7373
+ left = (parseInt(that.element.css("left"), 10) +
7374
+ (that.position.left - that.originalPosition.left)) || null;
7375
+ top = (parseInt(that.element.css("top"), 10) +
7376
+ (that.position.top - that.originalPosition.top)) || null;
7377
+
7378
+ if (!o.animate) {
7379
+ this.element.css($.extend(s, { top: top, left: left }));
7380
+ }
7381
+
7382
+ that.helper.height(that.size.height);
7383
+ that.helper.width(that.size.width);
7384
+
7385
+ if (this._helper && !o.animate) {
7386
+ this._proportionallyResize();
7387
+ }
7388
+ }
7389
+
7390
+ $("body").css("cursor", "auto");
7391
+
7392
+ this.element.removeClass("ui-resizable-resizing");
7393
+
7394
+ this._propagate("stop", event);
7395
+
7396
+ if (this._helper) {
7397
+ this.helper.remove();
7398
+ }
7399
+
7400
+ return false;
7401
+
7402
+ },
7403
+
7404
+ _updatePrevProperties: function() {
7405
+ this.prevPosition = {
7406
+ top: this.position.top,
7407
+ left: this.position.left
7408
+ };
7409
+ this.prevSize = {
7410
+ width: this.size.width,
7411
+ height: this.size.height
7412
+ };
7413
+ },
7414
+
7415
+ _applyChanges: function() {
7416
+ var props = {};
7417
+
7418
+ if ( this.position.top !== this.prevPosition.top ) {
7419
+ props.top = this.position.top + "px";
7420
+ }
7421
+ if ( this.position.left !== this.prevPosition.left ) {
7422
+ props.left = this.position.left + "px";
7423
+ }
7424
+ if ( this.size.width !== this.prevSize.width ) {
7425
+ props.width = this.size.width + "px";
7426
+ }
7427
+ if ( this.size.height !== this.prevSize.height ) {
7428
+ props.height = this.size.height + "px";
7429
+ }
7430
+
7431
+ this.helper.css( props );
7432
+
7433
+ return props;
7434
+ },
7435
+
7436
+ _updateVirtualBoundaries: function(forceAspectRatio) {
7437
+ var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,
7438
+ o = this.options;
7439
+
7440
+ b = {
7441
+ minWidth: this._isNumber(o.minWidth) ? o.minWidth : 0,
7442
+ maxWidth: this._isNumber(o.maxWidth) ? o.maxWidth : Infinity,
7443
+ minHeight: this._isNumber(o.minHeight) ? o.minHeight : 0,
7444
+ maxHeight: this._isNumber(o.maxHeight) ? o.maxHeight : Infinity
7445
+ };
7446
+
7447
+ if (this._aspectRatio || forceAspectRatio) {
7448
+ pMinWidth = b.minHeight * this.aspectRatio;
7449
+ pMinHeight = b.minWidth / this.aspectRatio;
7450
+ pMaxWidth = b.maxHeight * this.aspectRatio;
7451
+ pMaxHeight = b.maxWidth / this.aspectRatio;
7452
+
7453
+ if (pMinWidth > b.minWidth) {
7454
+ b.minWidth = pMinWidth;
7455
+ }
7456
+ if (pMinHeight > b.minHeight) {
7457
+ b.minHeight = pMinHeight;
7458
+ }
7459
+ if (pMaxWidth < b.maxWidth) {
7460
+ b.maxWidth = pMaxWidth;
7461
+ }
7462
+ if (pMaxHeight < b.maxHeight) {
7463
+ b.maxHeight = pMaxHeight;
7464
+ }
7465
+ }
7466
+ this._vBoundaries = b;
7467
+ },
7468
+
7469
+ _updateCache: function(data) {
7470
+ this.offset = this.helper.offset();
7471
+ if (this._isNumber(data.left)) {
7472
+ this.position.left = data.left;
7473
+ }
7474
+ if (this._isNumber(data.top)) {
7475
+ this.position.top = data.top;
7476
+ }
7477
+ if (this._isNumber(data.height)) {
7478
+ this.size.height = data.height;
7479
+ }
7480
+ if (this._isNumber(data.width)) {
7481
+ this.size.width = data.width;
7482
+ }
7483
+ },
7484
+
7485
+ _updateRatio: function( data ) {
7486
+
7487
+ var cpos = this.position,
7488
+ csize = this.size,
7489
+ a = this.axis;
7490
+
7491
+ if (this._isNumber(data.height)) {
7492
+ data.width = (data.height * this.aspectRatio);
7493
+ } else if (this._isNumber(data.width)) {
7494
+ data.height = (data.width / this.aspectRatio);
7495
+ }
7496
+
7497
+ if (a === "sw") {
7498
+ data.left = cpos.left + (csize.width - data.width);
7499
+ data.top = null;
7500
+ }
7501
+ if (a === "nw") {
7502
+ data.top = cpos.top + (csize.height - data.height);
7503
+ data.left = cpos.left + (csize.width - data.width);
7504
+ }
7505
+
7506
+ return data;
7507
+ },
7508
+
7509
+ _respectSize: function( data ) {
7510
+
7511
+ var o = this._vBoundaries,
7512
+ a = this.axis,
7513
+ ismaxw = this._isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width),
7514
+ ismaxh = this._isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
7515
+ isminw = this._isNumber(data.width) && o.minWidth && (o.minWidth > data.width),
7516
+ isminh = this._isNumber(data.height) && o.minHeight && (o.minHeight > data.height),
7517
+ dw = this.originalPosition.left + this.originalSize.width,
7518
+ dh = this.position.top + this.size.height,
7519
+ cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
7520
+ if (isminw) {
7521
+ data.width = o.minWidth;
7522
+ }
7523
+ if (isminh) {
7524
+ data.height = o.minHeight;
7525
+ }
7526
+ if (ismaxw) {
7527
+ data.width = o.maxWidth;
7528
+ }
7529
+ if (ismaxh) {
7530
+ data.height = o.maxHeight;
7531
+ }
7532
+
7533
+ if (isminw && cw) {
7534
+ data.left = dw - o.minWidth;
7535
+ }
7536
+ if (ismaxw && cw) {
7537
+ data.left = dw - o.maxWidth;
7538
+ }
7539
+ if (isminh && ch) {
7540
+ data.top = dh - o.minHeight;
7541
+ }
7542
+ if (ismaxh && ch) {
7543
+ data.top = dh - o.maxHeight;
7544
+ }
7545
+
7546
+ // Fixing jump error on top/left - bug #2330
7547
+ if (!data.width && !data.height && !data.left && data.top) {
7548
+ data.top = null;
7549
+ } else if (!data.width && !data.height && !data.top && data.left) {
7550
+ data.left = null;
7551
+ }
7552
+
7553
+ return data;
7554
+ },
7555
+
7556
+ _getPaddingPlusBorderDimensions: function( element ) {
7557
+ var i = 0,
7558
+ widths = [],
7559
+ borders = [
7560
+ element.css( "borderTopWidth" ),
7561
+ element.css( "borderRightWidth" ),
7562
+ element.css( "borderBottomWidth" ),
7563
+ element.css( "borderLeftWidth" )
7564
+ ],
7565
+ paddings = [
7566
+ element.css( "paddingTop" ),
7567
+ element.css( "paddingRight" ),
7568
+ element.css( "paddingBottom" ),
7569
+ element.css( "paddingLeft" )
7570
+ ];
7571
+
7572
+ for ( ; i < 4; i++ ) {
7573
+ widths[ i ] = ( parseInt( borders[ i ], 10 ) || 0 );
7574
+ widths[ i ] += ( parseInt( paddings[ i ], 10 ) || 0 );
7575
+ }
7576
+
7577
+ return {
7578
+ height: widths[ 0 ] + widths[ 2 ],
7579
+ width: widths[ 1 ] + widths[ 3 ]
7580
+ };
7581
+ },
7582
+
7583
+ _proportionallyResize: function() {
7584
+
7585
+ if (!this._proportionallyResizeElements.length) {
7586
+ return;
7587
+ }
7588
+
7589
+ var prel,
7590
+ i = 0,
7591
+ element = this.helper || this.element;
7592
+
7593
+ for ( ; i < this._proportionallyResizeElements.length; i++) {
7594
+
7595
+ prel = this._proportionallyResizeElements[i];
7596
+
7597
+ // TODO: Seems like a bug to cache this.outerDimensions
7598
+ // considering that we are in a loop.
7599
+ if (!this.outerDimensions) {
7600
+ this.outerDimensions = this._getPaddingPlusBorderDimensions( prel );
7601
+ }
7602
+
7603
+ prel.css({
7604
+ height: (element.height() - this.outerDimensions.height) || 0,
7605
+ width: (element.width() - this.outerDimensions.width) || 0
7606
+ });
7607
+
7608
+ }
7609
+
7610
+ },
7611
+
7612
+ _renderProxy: function() {
7613
+
7614
+ var el = this.element, o = this.options;
7615
+ this.elementOffset = el.offset();
7616
+
7617
+ if (this._helper) {
7618
+
7619
+ this.helper = this.helper || $("<div style='overflow:hidden;'></div>");
7620
+
7621
+ this.helper.addClass(this._helper).css({
7622
+ width: this.element.outerWidth() - 1,
7623
+ height: this.element.outerHeight() - 1,
7624
+ position: "absolute",
7625
+ left: this.elementOffset.left + "px",
7626
+ top: this.elementOffset.top + "px",
7627
+ zIndex: ++o.zIndex //TODO: Don't modify option
7628
+ });
7629
+
7630
+ this.helper
7631
+ .appendTo("body")
7632
+ .disableSelection();
7633
+
7634
+ } else {
7635
+ this.helper = this.element;
7636
+ }
7637
+
7638
+ },
7639
+
7640
+ _change: {
7641
+ e: function(event, dx) {
7642
+ return { width: this.originalSize.width + dx };
7643
+ },
7644
+ w: function(event, dx) {
7645
+ var cs = this.originalSize, sp = this.originalPosition;
7646
+ return { left: sp.left + dx, width: cs.width - dx };
7647
+ },
7648
+ n: function(event, dx, dy) {
7649
+ var cs = this.originalSize, sp = this.originalPosition;
7650
+ return { top: sp.top + dy, height: cs.height - dy };
7651
+ },
7652
+ s: function(event, dx, dy) {
7653
+ return { height: this.originalSize.height + dy };
7654
+ },
7655
+ se: function(event, dx, dy) {
7656
+ return $.extend(this._change.s.apply(this, arguments),
7657
+ this._change.e.apply(this, [ event, dx, dy ]));
7658
+ },
7659
+ sw: function(event, dx, dy) {
7660
+ return $.extend(this._change.s.apply(this, arguments),
7661
+ this._change.w.apply(this, [ event, dx, dy ]));
7662
+ },
7663
+ ne: function(event, dx, dy) {
7664
+ return $.extend(this._change.n.apply(this, arguments),
7665
+ this._change.e.apply(this, [ event, dx, dy ]));
7666
+ },
7667
+ nw: function(event, dx, dy) {
7668
+ return $.extend(this._change.n.apply(this, arguments),
7669
+ this._change.w.apply(this, [ event, dx, dy ]));
7670
+ }
7671
+ },
7672
+
7673
+ _propagate: function(n, event) {
7674
+ $.ui.plugin.call(this, n, [ event, this.ui() ]);
7675
+ (n !== "resize" && this._trigger(n, event, this.ui()));
7676
+ },
7677
+
7678
+ plugins: {},
7679
+
7680
+ ui: function() {
7681
+ return {
7682
+ originalElement: this.originalElement,
7683
+ element: this.element,
7684
+ helper: this.helper,
7685
+ position: this.position,
7686
+ size: this.size,
7687
+ originalSize: this.originalSize,
7688
+ originalPosition: this.originalPosition
7689
+ };
7690
+ }
7691
+
7692
+ });
7693
+
7694
+ /*
7695
+ * Resizable Extensions
7696
+ */
7697
+
7698
+ $.ui.plugin.add("resizable", "animate", {
7699
+
7700
+ stop: function( event ) {
7701
+ var that = $(this).resizable( "instance" ),
7702
+ o = that.options,
7703
+ pr = that._proportionallyResizeElements,
7704
+ ista = pr.length && (/textarea/i).test(pr[0].nodeName),
7705
+ soffseth = ista && that._hasScroll(pr[0], "left") ? 0 : that.sizeDiff.height,
7706
+ soffsetw = ista ? 0 : that.sizeDiff.width,
7707
+ style = { width: (that.size.width - soffsetw), height: (that.size.height - soffseth) },
7708
+ left = (parseInt(that.element.css("left"), 10) +
7709
+ (that.position.left - that.originalPosition.left)) || null,
7710
+ top = (parseInt(that.element.css("top"), 10) +
7711
+ (that.position.top - that.originalPosition.top)) || null;
7712
+
7713
+ that.element.animate(
7714
+ $.extend(style, top && left ? { top: top, left: left } : {}), {
7715
+ duration: o.animateDuration,
7716
+ easing: o.animateEasing,
7717
+ step: function() {
7718
+
7719
+ var data = {
7720
+ width: parseInt(that.element.css("width"), 10),
7721
+ height: parseInt(that.element.css("height"), 10),
7722
+ top: parseInt(that.element.css("top"), 10),
7723
+ left: parseInt(that.element.css("left"), 10)
7724
+ };
7725
+
7726
+ if (pr && pr.length) {
7727
+ $(pr[0]).css({ width: data.width, height: data.height });
7728
+ }
7729
+
7730
+ // propagating resize, and updating values for each animation step
7731
+ that._updateCache(data);
7732
+ that._propagate("resize", event);
7733
+
7734
+ }
7735
+ }
7736
+ );
7737
+ }
7738
+
7739
+ });
7740
+
7741
+ $.ui.plugin.add( "resizable", "containment", {
7742
+
7743
+ start: function() {
7744
+ var element, p, co, ch, cw, width, height,
7745
+ that = $( this ).resizable( "instance" ),
7746
+ o = that.options,
7747
+ el = that.element,
7748
+ oc = o.containment,
7749
+ ce = ( oc instanceof $ ) ? oc.get( 0 ) : ( /parent/.test( oc ) ) ? el.parent().get( 0 ) : oc;
7750
+
7751
+ if ( !ce ) {
7752
+ return;
7753
+ }
7754
+
7755
+ that.containerElement = $( ce );
7756
+
7757
+ if ( /document/.test( oc ) || oc === document ) {
7758
+ that.containerOffset = {
7759
+ left: 0,
7760
+ top: 0
7761
+ };
7762
+ that.containerPosition = {
7763
+ left: 0,
7764
+ top: 0
7765
+ };
7766
+
7767
+ that.parentData = {
7768
+ element: $( document ),
7769
+ left: 0,
7770
+ top: 0,
7771
+ width: $( document ).width(),
7772
+ height: $( document ).height() || document.body.parentNode.scrollHeight
7773
+ };
7774
+ } else {
7775
+ element = $( ce );
7776
+ p = [];
7777
+ $([ "Top", "Right", "Left", "Bottom" ]).each(function( i, name ) {
7778
+ p[ i ] = that._num( element.css( "padding" + name ) );
7779
+ });
7780
+
7781
+ that.containerOffset = element.offset();
7782
+ that.containerPosition = element.position();
7783
+ that.containerSize = {
7784
+ height: ( element.innerHeight() - p[ 3 ] ),
7785
+ width: ( element.innerWidth() - p[ 1 ] )
7786
+ };
7787
+
7788
+ co = that.containerOffset;
7789
+ ch = that.containerSize.height;
7790
+ cw = that.containerSize.width;
7791
+ width = ( that._hasScroll ( ce, "left" ) ? ce.scrollWidth : cw );
7792
+ height = ( that._hasScroll ( ce ) ? ce.scrollHeight : ch ) ;
7793
+
7794
+ that.parentData = {
7795
+ element: ce,
7796
+ left: co.left,
7797
+ top: co.top,
7798
+ width: width,
7799
+ height: height
7800
+ };
7801
+ }
7802
+ },
7803
+
7804
+ resize: function( event ) {
7805
+ var woset, hoset, isParent, isOffsetRelative,
7806
+ that = $( this ).resizable( "instance" ),
7807
+ o = that.options,
7808
+ co = that.containerOffset,
7809
+ cp = that.position,
7810
+ pRatio = that._aspectRatio || event.shiftKey,
7811
+ cop = {
7812
+ top: 0,
7813
+ left: 0
7814
+ },
7815
+ ce = that.containerElement,
7816
+ continueResize = true;
7817
+
7818
+ if ( ce[ 0 ] !== document && ( /static/ ).test( ce.css( "position" ) ) ) {
7819
+ cop = co;
7820
+ }
7821
+
7822
+ if ( cp.left < ( that._helper ? co.left : 0 ) ) {
7823
+ that.size.width = that.size.width +
7824
+ ( that._helper ?
7825
+ ( that.position.left - co.left ) :
7826
+ ( that.position.left - cop.left ) );
7827
+
7828
+ if ( pRatio ) {
7829
+ that.size.height = that.size.width / that.aspectRatio;
7830
+ continueResize = false;
7831
+ }
7832
+ that.position.left = o.helper ? co.left : 0;
7833
+ }
7834
+
7835
+ if ( cp.top < ( that._helper ? co.top : 0 ) ) {
7836
+ that.size.height = that.size.height +
7837
+ ( that._helper ?
7838
+ ( that.position.top - co.top ) :
7839
+ that.position.top );
7840
+
7841
+ if ( pRatio ) {
7842
+ that.size.width = that.size.height * that.aspectRatio;
7843
+ continueResize = false;
7844
+ }
7845
+ that.position.top = that._helper ? co.top : 0;
7846
+ }
7847
+
7848
+ isParent = that.containerElement.get( 0 ) === that.element.parent().get( 0 );
7849
+ isOffsetRelative = /relative|absolute/.test( that.containerElement.css( "position" ) );
7850
+
7851
+ if ( isParent && isOffsetRelative ) {
7852
+ that.offset.left = that.parentData.left + that.position.left;
7853
+ that.offset.top = that.parentData.top + that.position.top;
7854
+ } else {
7855
+ that.offset.left = that.element.offset().left;
7856
+ that.offset.top = that.element.offset().top;
7857
+ }
7858
+
7859
+ woset = Math.abs( that.sizeDiff.width +
7860
+ (that._helper ?
7861
+ that.offset.left - cop.left :
7862
+ (that.offset.left - co.left)) );
7863
+
7864
+ hoset = Math.abs( that.sizeDiff.height +
7865
+ (that._helper ?
7866
+ that.offset.top - cop.top :
7867
+ (that.offset.top - co.top)) );
7868
+
7869
+ if ( woset + that.size.width >= that.parentData.width ) {
7870
+ that.size.width = that.parentData.width - woset;
7871
+ if ( pRatio ) {
7872
+ that.size.height = that.size.width / that.aspectRatio;
7873
+ continueResize = false;
7874
+ }
7875
+ }
7876
+
7877
+ if ( hoset + that.size.height >= that.parentData.height ) {
7878
+ that.size.height = that.parentData.height - hoset;
7879
+ if ( pRatio ) {
7880
+ that.size.width = that.size.height * that.aspectRatio;
7881
+ continueResize = false;
7882
+ }
7883
+ }
7884
+
7885
+ if ( !continueResize ) {
7886
+ that.position.left = that.prevPosition.left;
7887
+ that.position.top = that.prevPosition.top;
7888
+ that.size.width = that.prevSize.width;
7889
+ that.size.height = that.prevSize.height;
7890
+ }
7891
+ },
7892
+
7893
+ stop: function() {
7894
+ var that = $( this ).resizable( "instance" ),
7895
+ o = that.options,
7896
+ co = that.containerOffset,
7897
+ cop = that.containerPosition,
7898
+ ce = that.containerElement,
7899
+ helper = $( that.helper ),
7900
+ ho = helper.offset(),
7901
+ w = helper.outerWidth() - that.sizeDiff.width,
7902
+ h = helper.outerHeight() - that.sizeDiff.height;
7903
+
7904
+ if ( that._helper && !o.animate && ( /relative/ ).test( ce.css( "position" ) ) ) {
7905
+ $( this ).css({
7906
+ left: ho.left - cop.left - co.left,
7907
+ width: w,
7908
+ height: h
7909
+ });
7910
+ }
7911
+
7912
+ if ( that._helper && !o.animate && ( /static/ ).test( ce.css( "position" ) ) ) {
7913
+ $( this ).css({
7914
+ left: ho.left - cop.left - co.left,
7915
+ width: w,
7916
+ height: h
7917
+ });
7918
+ }
7919
+ }
7920
+ });
7921
+
7922
+ $.ui.plugin.add("resizable", "alsoResize", {
7923
+
7924
+ start: function() {
7925
+ var that = $(this).resizable( "instance" ),
7926
+ o = that.options;
7927
+
7928
+ $(o.alsoResize).each(function() {
7929
+ var el = $(this);
7930
+ el.data("ui-resizable-alsoresize", {
7931
+ width: parseInt(el.width(), 10), height: parseInt(el.height(), 10),
7932
+ left: parseInt(el.css("left"), 10), top: parseInt(el.css("top"), 10)
7933
+ });
7934
+ });
7935
+ },
7936
+
7937
+ resize: function(event, ui) {
7938
+ var that = $(this).resizable( "instance" ),
7939
+ o = that.options,
7940
+ os = that.originalSize,
7941
+ op = that.originalPosition,
7942
+ delta = {
7943
+ height: (that.size.height - os.height) || 0,
7944
+ width: (that.size.width - os.width) || 0,
7945
+ top: (that.position.top - op.top) || 0,
7946
+ left: (that.position.left - op.left) || 0
7947
+ };
7948
+
7949
+ $(o.alsoResize).each(function() {
7950
+ var el = $(this), start = $(this).data("ui-resizable-alsoresize"), style = {},
7951
+ css = el.parents(ui.originalElement[0]).length ?
7952
+ [ "width", "height" ] :
7953
+ [ "width", "height", "top", "left" ];
7954
+
7955
+ $.each(css, function(i, prop) {
7956
+ var sum = (start[prop] || 0) + (delta[prop] || 0);
7957
+ if (sum && sum >= 0) {
7958
+ style[prop] = sum || null;
7959
+ }
7960
+ });
7961
+
7962
+ el.css(style);
7963
+ });
7964
+ },
7965
+
7966
+ stop: function() {
7967
+ $(this).removeData("resizable-alsoresize");
7968
+ }
7969
+ });
7970
+
7971
+ $.ui.plugin.add("resizable", "ghost", {
7972
+
7973
+ start: function() {
7974
+
7975
+ var that = $(this).resizable( "instance" ), o = that.options, cs = that.size;
7976
+
7977
+ that.ghost = that.originalElement.clone();
7978
+ that.ghost
7979
+ .css({
7980
+ opacity: 0.25,
7981
+ display: "block",
7982
+ position: "relative",
7983
+ height: cs.height,
7984
+ width: cs.width,
7985
+ margin: 0,
7986
+ left: 0,
7987
+ top: 0
7988
+ })
7989
+ .addClass("ui-resizable-ghost")
7990
+ .addClass(typeof o.ghost === "string" ? o.ghost : "");
7991
+
7992
+ that.ghost.appendTo(that.helper);
7993
+
7994
+ },
7995
+
7996
+ resize: function() {
7997
+ var that = $(this).resizable( "instance" );
7998
+ if (that.ghost) {
7999
+ that.ghost.css({
8000
+ position: "relative",
8001
+ height: that.size.height,
8002
+ width: that.size.width
8003
+ });
8004
+ }
8005
+ },
8006
+
8007
+ stop: function() {
8008
+ var that = $(this).resizable( "instance" );
8009
+ if (that.ghost && that.helper) {
8010
+ that.helper.get(0).removeChild(that.ghost.get(0));
8011
+ }
8012
+ }
8013
+
8014
+ });
8015
+
8016
+ $.ui.plugin.add("resizable", "grid", {
8017
+
8018
+ resize: function() {
8019
+ var outerDimensions,
8020
+ that = $(this).resizable( "instance" ),
8021
+ o = that.options,
8022
+ cs = that.size,
8023
+ os = that.originalSize,
8024
+ op = that.originalPosition,
8025
+ a = that.axis,
8026
+ grid = typeof o.grid === "number" ? [ o.grid, o.grid ] : o.grid,
8027
+ gridX = (grid[0] || 1),
8028
+ gridY = (grid[1] || 1),
8029
+ ox = Math.round((cs.width - os.width) / gridX) * gridX,
8030
+ oy = Math.round((cs.height - os.height) / gridY) * gridY,
8031
+ newWidth = os.width + ox,
8032
+ newHeight = os.height + oy,
8033
+ isMaxWidth = o.maxWidth && (o.maxWidth < newWidth),
8034
+ isMaxHeight = o.maxHeight && (o.maxHeight < newHeight),
8035
+ isMinWidth = o.minWidth && (o.minWidth > newWidth),
8036
+ isMinHeight = o.minHeight && (o.minHeight > newHeight);
8037
+
8038
+ o.grid = grid;
8039
+
8040
+ if (isMinWidth) {
8041
+ newWidth += gridX;
8042
+ }
8043
+ if (isMinHeight) {
8044
+ newHeight += gridY;
8045
+ }
8046
+ if (isMaxWidth) {
8047
+ newWidth -= gridX;
8048
+ }
8049
+ if (isMaxHeight) {
8050
+ newHeight -= gridY;
8051
+ }
8052
+
8053
+ if (/^(se|s|e)$/.test(a)) {
8054
+ that.size.width = newWidth;
8055
+ that.size.height = newHeight;
8056
+ } else if (/^(ne)$/.test(a)) {
8057
+ that.size.width = newWidth;
8058
+ that.size.height = newHeight;
8059
+ that.position.top = op.top - oy;
8060
+ } else if (/^(sw)$/.test(a)) {
8061
+ that.size.width = newWidth;
8062
+ that.size.height = newHeight;
8063
+ that.position.left = op.left - ox;
8064
+ } else {
8065
+ if ( newHeight - gridY <= 0 || newWidth - gridX <= 0) {
8066
+ outerDimensions = that._getPaddingPlusBorderDimensions( this );
8067
+ }
8068
+
8069
+ if ( newHeight - gridY > 0 ) {
8070
+ that.size.height = newHeight;
8071
+ that.position.top = op.top - oy;
8072
+ } else {
8073
+ newHeight = gridY - outerDimensions.height;
8074
+ that.size.height = newHeight;
8075
+ that.position.top = op.top + os.height - newHeight;
8076
+ }
8077
+ if ( newWidth - gridX > 0 ) {
8078
+ that.size.width = newWidth;
8079
+ that.position.left = op.left - ox;
8080
+ } else {
8081
+ newWidth = gridX - outerDimensions.width;
8082
+ that.size.width = newWidth;
8083
+ that.position.left = op.left + os.width - newWidth;
8084
+ }
8085
+ }
8086
+ }
8087
+
8088
+ });
8089
+
8090
+ var resizable = $.ui.resizable;
8091
+
8092
+
8093
+ /*!
8094
+ * jQuery UI Dialog 1.11.4
8095
+ * http://jqueryui.com
8096
+ *
8097
+ * Copyright jQuery Foundation and other contributors
8098
+ * Released under the MIT license.
8099
+ * http://jquery.org/license
8100
+ *
8101
+ * http://api.jqueryui.com/dialog/
8102
+ */
8103
+
8104
+
8105
+ var dialog = $.widget( "ui.dialog", {
8106
+ version: "1.11.4",
8107
+ options: {
8108
+ appendTo: "body",
8109
+ autoOpen: true,
8110
+ buttons: [],
8111
+ closeOnEscape: true,
8112
+ closeText: "Close",
8113
+ dialogClass: "",
8114
+ draggable: true,
8115
+ hide: null,
8116
+ height: "auto",
8117
+ maxHeight: null,
8118
+ maxWidth: null,
8119
+ minHeight: 150,
8120
+ minWidth: 150,
8121
+ modal: false,
8122
+ position: {
8123
+ my: "center",
8124
+ at: "center",
8125
+ of: window,
8126
+ collision: "fit",
8127
+ // Ensure the titlebar is always visible
8128
+ using: function( pos ) {
8129
+ var topOffset = $( this ).css( pos ).offset().top;
8130
+ if ( topOffset < 0 ) {
8131
+ $( this ).css( "top", pos.top - topOffset );
8132
+ }
8133
+ }
8134
+ },
8135
+ resizable: true,
8136
+ show: null,
8137
+ title: null,
8138
+ width: 300,
8139
+
8140
+ // callbacks
8141
+ beforeClose: null,
8142
+ close: null,
8143
+ drag: null,
8144
+ dragStart: null,
8145
+ dragStop: null,
8146
+ focus: null,
8147
+ open: null,
8148
+ resize: null,
8149
+ resizeStart: null,
8150
+ resizeStop: null
8151
+ },
8152
+
8153
+ sizeRelatedOptions: {
8154
+ buttons: true,
8155
+ height: true,
8156
+ maxHeight: true,
8157
+ maxWidth: true,
8158
+ minHeight: true,
8159
+ minWidth: true,
8160
+ width: true
8161
+ },
8162
+
8163
+ resizableRelatedOptions: {
8164
+ maxHeight: true,
8165
+ maxWidth: true,
8166
+ minHeight: true,
8167
+ minWidth: true
8168
+ },
8169
+
8170
+ _create: function() {
8171
+ this.originalCss = {
8172
+ display: this.element[ 0 ].style.display,
8173
+ width: this.element[ 0 ].style.width,
8174
+ minHeight: this.element[ 0 ].style.minHeight,
8175
+ maxHeight: this.element[ 0 ].style.maxHeight,
8176
+ height: this.element[ 0 ].style.height
8177
+ };
8178
+ this.originalPosition = {
8179
+ parent: this.element.parent(),
8180
+ index: this.element.parent().children().index( this.element )
8181
+ };
8182
+ this.originalTitle = this.element.attr( "title" );
8183
+ this.options.title = this.options.title || this.originalTitle;
8184
+
8185
+ this._createWrapper();
8186
+
8187
+ this.element
8188
+ .show()
8189
+ .removeAttr( "title" )
8190
+ .addClass( "ui-dialog-content ui-widget-content" )
8191
+ .appendTo( this.uiDialog );
8192
+
8193
+ this._createTitlebar();
8194
+ this._createButtonPane();
8195
+
8196
+ if ( this.options.draggable && $.fn.draggable ) {
8197
+ this._makeDraggable();
8198
+ }
8199
+ if ( this.options.resizable && $.fn.resizable ) {
8200
+ this._makeResizable();
8201
+ }
8202
+
8203
+ this._isOpen = false;
8204
+
8205
+ this._trackFocus();
8206
+ },
8207
+
8208
+ _init: function() {
8209
+ if ( this.options.autoOpen ) {
8210
+ this.open();
8211
+ }
8212
+ },
8213
+
8214
+ _appendTo: function() {
8215
+ var element = this.options.appendTo;
8216
+ if ( element && (element.jquery || element.nodeType) ) {
8217
+ return $( element );
8218
+ }
8219
+ return this.document.find( element || "body" ).eq( 0 );
8220
+ },
8221
+
8222
+ _destroy: function() {
8223
+ var next,
8224
+ originalPosition = this.originalPosition;
8225
+
8226
+ this._untrackInstance();
8227
+ this._destroyOverlay();
8228
+
8229
+ this.element
8230
+ .removeUniqueId()
8231
+ .removeClass( "ui-dialog-content ui-widget-content" )
8232
+ .css( this.originalCss )
8233
+ // Without detaching first, the following becomes really slow
8234
+ .detach();
8235
+
8236
+ this.uiDialog.stop( true, true ).remove();
8237
+
8238
+ if ( this.originalTitle ) {
8239
+ this.element.attr( "title", this.originalTitle );
8240
+ }
8241
+
8242
+ next = originalPosition.parent.children().eq( originalPosition.index );
8243
+ // Don't try to place the dialog next to itself (#8613)
8244
+ if ( next.length && next[ 0 ] !== this.element[ 0 ] ) {
8245
+ next.before( this.element );
8246
+ } else {
8247
+ originalPosition.parent.append( this.element );
8248
+ }
8249
+ },
8250
+
8251
+ widget: function() {
8252
+ return this.uiDialog;
8253
+ },
8254
+
8255
+ disable: $.noop,
8256
+ enable: $.noop,
8257
+
8258
+ close: function( event ) {
8259
+ var activeElement,
8260
+ that = this;
8261
+
8262
+ if ( !this._isOpen || this._trigger( "beforeClose", event ) === false ) {
8263
+ return;
8264
+ }
8265
+
8266
+ this._isOpen = false;
8267
+ this._focusedElement = null;
8268
+ this._destroyOverlay();
8269
+ this._untrackInstance();
8270
+
8271
+ if ( !this.opener.filter( ":focusable" ).focus().length ) {
8272
+
8273
+ // support: IE9
8274
+ // IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
8275
+ try {
8276
+ activeElement = this.document[ 0 ].activeElement;
8277
+
8278
+ // Support: IE9, IE10
8279
+ // If the <body> is blurred, IE will switch windows, see #4520
8280
+ if ( activeElement && activeElement.nodeName.toLowerCase() !== "body" ) {
8281
+
8282
+ // Hiding a focused element doesn't trigger blur in WebKit
8283
+ // so in case we have nothing to focus on, explicitly blur the active element
8284
+ // https://bugs.webkit.org/show_bug.cgi?id=47182
8285
+ $( activeElement ).blur();
8286
+ }
8287
+ } catch ( error ) {}
8288
+ }
8289
+
8290
+ this._hide( this.uiDialog, this.options.hide, function() {
8291
+ that._trigger( "close", event );
8292
+ });
8293
+ },
8294
+
8295
+ isOpen: function() {
8296
+ return this._isOpen;
8297
+ },
8298
+
8299
+ moveToTop: function() {
8300
+ this._moveToTop();
8301
+ },
8302
+
8303
+ _moveToTop: function( event, silent ) {
8304
+ var moved = false,
8305
+ zIndices = this.uiDialog.siblings( ".ui-front:visible" ).map(function() {
8306
+ return +$( this ).css( "z-index" );
8307
+ }).get(),
8308
+ zIndexMax = Math.max.apply( null, zIndices );
8309
+
8310
+ if ( zIndexMax >= +this.uiDialog.css( "z-index" ) ) {
8311
+ this.uiDialog.css( "z-index", zIndexMax + 1 );
8312
+ moved = true;
8313
+ }
8314
+
8315
+ if ( moved && !silent ) {
8316
+ this._trigger( "focus", event );
8317
+ }
8318
+ return moved;
8319
+ },
8320
+
8321
+ open: function() {
8322
+ var that = this;
8323
+ if ( this._isOpen ) {
8324
+ if ( this._moveToTop() ) {
8325
+ this._focusTabbable();
8326
+ }
8327
+ return;
8328
+ }
8329
+
8330
+ this._isOpen = true;
8331
+ this.opener = $( this.document[ 0 ].activeElement );
8332
+
8333
+ this._size();
8334
+ this._position();
8335
+ this._createOverlay();
8336
+ this._moveToTop( null, true );
8337
+
8338
+ // Ensure the overlay is moved to the top with the dialog, but only when
8339
+ // opening. The overlay shouldn't move after the dialog is open so that
8340
+ // modeless dialogs opened after the modal dialog stack properly.
8341
+ if ( this.overlay ) {
8342
+ this.overlay.css( "z-index", this.uiDialog.css( "z-index" ) - 1 );
8343
+ }
8344
+
8345
+ this._show( this.uiDialog, this.options.show, function() {
8346
+ that._focusTabbable();
8347
+ that._trigger( "focus" );
8348
+ });
8349
+
8350
+ // Track the dialog immediately upon openening in case a focus event
8351
+ // somehow occurs outside of the dialog before an element inside the
8352
+ // dialog is focused (#10152)
8353
+ this._makeFocusTarget();
8354
+
8355
+ this._trigger( "open" );
8356
+ },
8357
+
8358
+ _focusTabbable: function() {
8359
+ // Set focus to the first match:
8360
+ // 1. An element that was focused previously
8361
+ // 2. First element inside the dialog matching [autofocus]
8362
+ // 3. Tabbable element inside the content element
8363
+ // 4. Tabbable element inside the buttonpane
8364
+ // 5. The close button
8365
+ // 6. The dialog itself
8366
+ var hasFocus = this._focusedElement;
8367
+ if ( !hasFocus ) {
8368
+ hasFocus = this.element.find( "[autofocus]" );
8369
+ }
8370
+ if ( !hasFocus.length ) {
8371
+ hasFocus = this.element.find( ":tabbable" );
8372
+ }
8373
+ if ( !hasFocus.length ) {
8374
+ hasFocus = this.uiDialogButtonPane.find( ":tabbable" );
8375
+ }
8376
+ if ( !hasFocus.length ) {
8377
+ hasFocus = this.uiDialogTitlebarClose.filter( ":tabbable" );
8378
+ }
8379
+ if ( !hasFocus.length ) {
8380
+ hasFocus = this.uiDialog;
8381
+ }
8382
+ hasFocus.eq( 0 ).focus();
8383
+ },
8384
+
8385
+ _keepFocus: function( event ) {
8386
+ function checkFocus() {
8387
+ var activeElement = this.document[0].activeElement,
8388
+ isActive = this.uiDialog[0] === activeElement ||
8389
+ $.contains( this.uiDialog[0], activeElement );
8390
+ if ( !isActive ) {
8391
+ this._focusTabbable();
8392
+ }
8393
+ }
8394
+ event.preventDefault();
8395
+ checkFocus.call( this );
8396
+ // support: IE
8397
+ // IE <= 8 doesn't prevent moving focus even with event.preventDefault()
8398
+ // so we check again later
8399
+ this._delay( checkFocus );
8400
+ },
8401
+
8402
+ _createWrapper: function() {
8403
+ this.uiDialog = $("<div>")
8404
+ .addClass( "ui-dialog ui-widget ui-widget-content ui-corner-all ui-front " +
8405
+ this.options.dialogClass )
8406
+ .hide()
8407
+ .attr({
8408
+ // Setting tabIndex makes the div focusable
8409
+ tabIndex: -1,
8410
+ role: "dialog"
8411
+ })
8412
+ .appendTo( this._appendTo() );
8413
+
8414
+ this._on( this.uiDialog, {
8415
+ keydown: function( event ) {
8416
+ if ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
8417
+ event.keyCode === $.ui.keyCode.ESCAPE ) {
8418
+ event.preventDefault();
8419
+ this.close( event );
8420
+ return;
8421
+ }
8422
+
8423
+ // prevent tabbing out of dialogs
8424
+ if ( event.keyCode !== $.ui.keyCode.TAB || event.isDefaultPrevented() ) {
8425
+ return;
8426
+ }
8427
+ var tabbables = this.uiDialog.find( ":tabbable" ),
8428
+ first = tabbables.filter( ":first" ),
8429
+ last = tabbables.filter( ":last" );
8430
+
8431
+ if ( ( event.target === last[0] || event.target === this.uiDialog[0] ) && !event.shiftKey ) {
8432
+ this._delay(function() {
8433
+ first.focus();
8434
+ });
8435
+ event.preventDefault();
8436
+ } else if ( ( event.target === first[0] || event.target === this.uiDialog[0] ) && event.shiftKey ) {
8437
+ this._delay(function() {
8438
+ last.focus();
8439
+ });
8440
+ event.preventDefault();
8441
+ }
8442
+ },
8443
+ mousedown: function( event ) {
8444
+ if ( this._moveToTop( event ) ) {
8445
+ this._focusTabbable();
8446
+ }
8447
+ }
8448
+ });
8449
+
8450
+ // We assume that any existing aria-describedby attribute means
8451
+ // that the dialog content is marked up properly
8452
+ // otherwise we brute force the content as the description
8453
+ if ( !this.element.find( "[aria-describedby]" ).length ) {
8454
+ this.uiDialog.attr({
8455
+ "aria-describedby": this.element.uniqueId().attr( "id" )
8456
+ });
8457
+ }
8458
+ },
8459
+
8460
+ _createTitlebar: function() {
8461
+ var uiDialogTitle;
8462
+
8463
+ this.uiDialogTitlebar = $( "<div>" )
8464
+ .addClass( "ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix" )
8465
+ .prependTo( this.uiDialog );
8466
+ this._on( this.uiDialogTitlebar, {
8467
+ mousedown: function( event ) {
8468
+ // Don't prevent click on close button (#8838)
8469
+ // Focusing a dialog that is partially scrolled out of view
8470
+ // causes the browser to scroll it into view, preventing the click event
8471
+ if ( !$( event.target ).closest( ".ui-dialog-titlebar-close" ) ) {
8472
+ // Dialog isn't getting focus when dragging (#8063)
8473
+ this.uiDialog.focus();
8474
+ }
8475
+ }
8476
+ });
8477
+
8478
+ // support: IE
8479
+ // Use type="button" to prevent enter keypresses in textboxes from closing the
8480
+ // dialog in IE (#9312)
8481
+ this.uiDialogTitlebarClose = $( "<button type='button'></button>" )
8482
+ .button({
8483
+ label: this.options.closeText,
8484
+ icons: {
8485
+ primary: "ui-icon-closethick"
8486
+ },
8487
+ text: false
8488
+ })
8489
+ .addClass( "ui-dialog-titlebar-close" )
8490
+ .appendTo( this.uiDialogTitlebar );
8491
+ this._on( this.uiDialogTitlebarClose, {
8492
+ click: function( event ) {
8493
+ event.preventDefault();
8494
+ this.close( event );
8495
+ }
8496
+ });
8497
+
8498
+ uiDialogTitle = $( "<span>" )
8499
+ .uniqueId()
8500
+ .addClass( "ui-dialog-title" )
8501
+ .prependTo( this.uiDialogTitlebar );
8502
+ this._title( uiDialogTitle );
8503
+
8504
+ this.uiDialog.attr({
8505
+ "aria-labelledby": uiDialogTitle.attr( "id" )
8506
+ });
8507
+ },
8508
+
8509
+ _title: function( title ) {
8510
+ if ( !this.options.title ) {
8511
+ title.html( "&#160;" );
8512
+ }
8513
+ title.text( this.options.title );
8514
+ },
8515
+
8516
+ _createButtonPane: function() {
8517
+ this.uiDialogButtonPane = $( "<div>" )
8518
+ .addClass( "ui-dialog-buttonpane ui-widget-content ui-helper-clearfix" );
8519
+
8520
+ this.uiButtonSet = $( "<div>" )
8521
+ .addClass( "ui-dialog-buttonset" )
8522
+ .appendTo( this.uiDialogButtonPane );
8523
+
8524
+ this._createButtons();
8525
+ },
8526
+
8527
+ _createButtons: function() {
8528
+ var that = this,
8529
+ buttons = this.options.buttons;
8530
+
8531
+ // if we already have a button pane, remove it
8532
+ this.uiDialogButtonPane.remove();
8533
+ this.uiButtonSet.empty();
8534
+
8535
+ if ( $.isEmptyObject( buttons ) || ($.isArray( buttons ) && !buttons.length) ) {
8536
+ this.uiDialog.removeClass( "ui-dialog-buttons" );
8537
+ return;
8538
+ }
8539
+
8540
+ $.each( buttons, function( name, props ) {
8541
+ var click, buttonOptions;
8542
+ props = $.isFunction( props ) ?
8543
+ { click: props, text: name } :
8544
+ props;
8545
+ // Default to a non-submitting button
8546
+ props = $.extend( { type: "button" }, props );
8547
+ // Change the context for the click callback to be the main element
8548
+ click = props.click;
8549
+ props.click = function() {
8550
+ click.apply( that.element[ 0 ], arguments );
8551
+ };
8552
+ buttonOptions = {
8553
+ icons: props.icons,
8554
+ text: props.showText
8555
+ };
8556
+ delete props.icons;
8557
+ delete props.showText;
8558
+ $( "<button></button>", props )
8559
+ .button( buttonOptions )
8560
+ .appendTo( that.uiButtonSet );
8561
+ });
8562
+ this.uiDialog.addClass( "ui-dialog-buttons" );
8563
+ this.uiDialogButtonPane.appendTo( this.uiDialog );
8564
+ },
8565
+
8566
+ _makeDraggable: function() {
8567
+ var that = this,
8568
+ options = this.options;
8569
+
8570
+ function filteredUi( ui ) {
8571
+ return {
8572
+ position: ui.position,
8573
+ offset: ui.offset
8574
+ };
8575
+ }
8576
+
8577
+ this.uiDialog.draggable({
8578
+ cancel: ".ui-dialog-content, .ui-dialog-titlebar-close",
8579
+ handle: ".ui-dialog-titlebar",
8580
+ containment: "document",
8581
+ start: function( event, ui ) {
8582
+ $( this ).addClass( "ui-dialog-dragging" );
8583
+ that._blockFrames();
8584
+ that._trigger( "dragStart", event, filteredUi( ui ) );
8585
+ },
8586
+ drag: function( event, ui ) {
8587
+ that._trigger( "drag", event, filteredUi( ui ) );
8588
+ },
8589
+ stop: function( event, ui ) {
8590
+ var left = ui.offset.left - that.document.scrollLeft(),
8591
+ top = ui.offset.top - that.document.scrollTop();
8592
+
8593
+ options.position = {
8594
+ my: "left top",
8595
+ at: "left" + (left >= 0 ? "+" : "") + left + " " +
8596
+ "top" + (top >= 0 ? "+" : "") + top,
8597
+ of: that.window
8598
+ };
8599
+ $( this ).removeClass( "ui-dialog-dragging" );
8600
+ that._unblockFrames();
8601
+ that._trigger( "dragStop", event, filteredUi( ui ) );
8602
+ }
8603
+ });
8604
+ },
8605
+
8606
+ _makeResizable: function() {
8607
+ var that = this,
8608
+ options = this.options,
8609
+ handles = options.resizable,
8610
+ // .ui-resizable has position: relative defined in the stylesheet
8611
+ // but dialogs have to use absolute or fixed positioning
8612
+ position = this.uiDialog.css("position"),
8613
+ resizeHandles = typeof handles === "string" ?
8614
+ handles :
8615
+ "n,e,s,w,se,sw,ne,nw";
8616
+
8617
+ function filteredUi( ui ) {
8618
+ return {
8619
+ originalPosition: ui.originalPosition,
8620
+ originalSize: ui.originalSize,
8621
+ position: ui.position,
8622
+ size: ui.size
8623
+ };
8624
+ }
8625
+
8626
+ this.uiDialog.resizable({
8627
+ cancel: ".ui-dialog-content",
8628
+ containment: "document",
8629
+ alsoResize: this.element,
8630
+ maxWidth: options.maxWidth,
8631
+ maxHeight: options.maxHeight,
8632
+ minWidth: options.minWidth,
8633
+ minHeight: this._minHeight(),
8634
+ handles: resizeHandles,
8635
+ start: function( event, ui ) {
8636
+ $( this ).addClass( "ui-dialog-resizing" );
8637
+ that._blockFrames();
8638
+ that._trigger( "resizeStart", event, filteredUi( ui ) );
8639
+ },
8640
+ resize: function( event, ui ) {
8641
+ that._trigger( "resize", event, filteredUi( ui ) );
8642
+ },
8643
+ stop: function( event, ui ) {
8644
+ var offset = that.uiDialog.offset(),
8645
+ left = offset.left - that.document.scrollLeft(),
8646
+ top = offset.top - that.document.scrollTop();
8647
+
8648
+ options.height = that.uiDialog.height();
8649
+ options.width = that.uiDialog.width();
8650
+ options.position = {
8651
+ my: "left top",
8652
+ at: "left" + (left >= 0 ? "+" : "") + left + " " +
8653
+ "top" + (top >= 0 ? "+" : "") + top,
8654
+ of: that.window
8655
+ };
8656
+ $( this ).removeClass( "ui-dialog-resizing" );
8657
+ that._unblockFrames();
8658
+ that._trigger( "resizeStop", event, filteredUi( ui ) );
8659
+ }
8660
+ })
8661
+ .css( "position", position );
8662
+ },
8663
+
8664
+ _trackFocus: function() {
8665
+ this._on( this.widget(), {
8666
+ focusin: function( event ) {
8667
+ this._makeFocusTarget();
8668
+ this._focusedElement = $( event.target );
8669
+ }
8670
+ });
8671
+ },
8672
+
8673
+ _makeFocusTarget: function() {
8674
+ this._untrackInstance();
8675
+ this._trackingInstances().unshift( this );
8676
+ },
8677
+
8678
+ _untrackInstance: function() {
8679
+ var instances = this._trackingInstances(),
8680
+ exists = $.inArray( this, instances );
8681
+ if ( exists !== -1 ) {
8682
+ instances.splice( exists, 1 );
8683
+ }
8684
+ },
8685
+
8686
+ _trackingInstances: function() {
8687
+ var instances = this.document.data( "ui-dialog-instances" );
8688
+ if ( !instances ) {
8689
+ instances = [];
8690
+ this.document.data( "ui-dialog-instances", instances );
8691
+ }
8692
+ return instances;
8693
+ },
8694
+
8695
+ _minHeight: function() {
8696
+ var options = this.options;
8697
+
8698
+ return options.height === "auto" ?
8699
+ options.minHeight :
8700
+ Math.min( options.minHeight, options.height );
8701
+ },
8702
+
8703
+ _position: function() {
8704
+ // Need to show the dialog to get the actual offset in the position plugin
8705
+ var isVisible = this.uiDialog.is( ":visible" );
8706
+ if ( !isVisible ) {
8707
+ this.uiDialog.show();
8708
+ }
8709
+ this.uiDialog.position( this.options.position );
8710
+ if ( !isVisible ) {
8711
+ this.uiDialog.hide();
8712
+ }
8713
+ },
8714
+
8715
+ _setOptions: function( options ) {
8716
+ var that = this,
8717
+ resize = false,
8718
+ resizableOptions = {};
8719
+
8720
+ $.each( options, function( key, value ) {
8721
+ that._setOption( key, value );
8722
+
8723
+ if ( key in that.sizeRelatedOptions ) {
8724
+ resize = true;
8725
+ }
8726
+ if ( key in that.resizableRelatedOptions ) {
8727
+ resizableOptions[ key ] = value;
8728
+ }
8729
+ });
8730
+
8731
+ if ( resize ) {
8732
+ this._size();
8733
+ this._position();
8734
+ }
8735
+ if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
8736
+ this.uiDialog.resizable( "option", resizableOptions );
8737
+ }
8738
+ },
8739
+
8740
+ _setOption: function( key, value ) {
8741
+ var isDraggable, isResizable,
8742
+ uiDialog = this.uiDialog;
8743
+
8744
+ if ( key === "dialogClass" ) {
8745
+ uiDialog
8746
+ .removeClass( this.options.dialogClass )
8747
+ .addClass( value );
8748
+ }
8749
+
8750
+ if ( key === "disabled" ) {
8751
+ return;
8752
+ }
8753
+
8754
+ this._super( key, value );
8755
+
8756
+ if ( key === "appendTo" ) {
8757
+ this.uiDialog.appendTo( this._appendTo() );
8758
+ }
8759
+
8760
+ if ( key === "buttons" ) {
8761
+ this._createButtons();
8762
+ }
8763
+
8764
+ if ( key === "closeText" ) {
8765
+ this.uiDialogTitlebarClose.button({
8766
+ // Ensure that we always pass a string
8767
+ label: "" + value
8768
+ });
8769
+ }
8770
+
8771
+ if ( key === "draggable" ) {
8772
+ isDraggable = uiDialog.is( ":data(ui-draggable)" );
8773
+ if ( isDraggable && !value ) {
8774
+ uiDialog.draggable( "destroy" );
8775
+ }
8776
+
8777
+ if ( !isDraggable && value ) {
8778
+ this._makeDraggable();
8779
+ }
8780
+ }
8781
+
8782
+ if ( key === "position" ) {
8783
+ this._position();
8784
+ }
8785
+
8786
+ if ( key === "resizable" ) {
8787
+ // currently resizable, becoming non-resizable
8788
+ isResizable = uiDialog.is( ":data(ui-resizable)" );
8789
+ if ( isResizable && !value ) {
8790
+ uiDialog.resizable( "destroy" );
8791
+ }
8792
+
8793
+ // currently resizable, changing handles
8794
+ if ( isResizable && typeof value === "string" ) {
8795
+ uiDialog.resizable( "option", "handles", value );
8796
+ }
8797
+
8798
+ // currently non-resizable, becoming resizable
8799
+ if ( !isResizable && value !== false ) {
8800
+ this._makeResizable();
8801
+ }
8802
+ }
8803
+
8804
+ if ( key === "title" ) {
8805
+ this._title( this.uiDialogTitlebar.find( ".ui-dialog-title" ) );
8806
+ }
8807
+ },
8808
+
8809
+ _size: function() {
8810
+ // If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
8811
+ // divs will both have width and height set, so we need to reset them
8812
+ var nonContentHeight, minContentHeight, maxContentHeight,
8813
+ options = this.options;
8814
+
8815
+ // Reset content sizing
8816
+ this.element.show().css({
8817
+ width: "auto",
8818
+ minHeight: 0,
8819
+ maxHeight: "none",
8820
+ height: 0
8821
+ });
8822
+
8823
+ if ( options.minWidth > options.width ) {
8824
+ options.width = options.minWidth;
8825
+ }
8826
+
8827
+ // reset wrapper sizing
8828
+ // determine the height of all the non-content elements
8829
+ nonContentHeight = this.uiDialog.css({
8830
+ height: "auto",
8831
+ width: options.width
8832
+ })
8833
+ .outerHeight();
8834
+ minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
8835
+ maxContentHeight = typeof options.maxHeight === "number" ?
8836
+ Math.max( 0, options.maxHeight - nonContentHeight ) :
8837
+ "none";
8838
+
8839
+ if ( options.height === "auto" ) {
8840
+ this.element.css({
8841
+ minHeight: minContentHeight,
8842
+ maxHeight: maxContentHeight,
8843
+ height: "auto"
8844
+ });
8845
+ } else {
8846
+ this.element.height( Math.max( 0, options.height - nonContentHeight ) );
8847
+ }
8848
+
8849
+ if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
8850
+ this.uiDialog.resizable( "option", "minHeight", this._minHeight() );
8851
+ }
8852
+ },
8853
+
8854
+ _blockFrames: function() {
8855
+ this.iframeBlocks = this.document.find( "iframe" ).map(function() {
8856
+ var iframe = $( this );
8857
+
8858
+ return $( "<div>" )
8859
+ .css({
8860
+ position: "absolute",
8861
+ width: iframe.outerWidth(),
8862
+ height: iframe.outerHeight()
8863
+ })
8864
+ .appendTo( iframe.parent() )
8865
+ .offset( iframe.offset() )[0];
8866
+ });
8867
+ },
8868
+
8869
+ _unblockFrames: function() {
8870
+ if ( this.iframeBlocks ) {
8871
+ this.iframeBlocks.remove();
8872
+ delete this.iframeBlocks;
8873
+ }
8874
+ },
8875
+
8876
+ _allowInteraction: function( event ) {
8877
+ if ( $( event.target ).closest( ".ui-dialog" ).length ) {
8878
+ return true;
8879
+ }
8880
+
8881
+ // TODO: Remove hack when datepicker implements
8882
+ // the .ui-front logic (#8989)
8883
+ return !!$( event.target ).closest( ".ui-datepicker" ).length;
8884
+ },
8885
+
8886
+ _createOverlay: function() {
8887
+ if ( !this.options.modal ) {
8888
+ return;
8889
+ }
8890
+
8891
+ // We use a delay in case the overlay is created from an
8892
+ // event that we're going to be cancelling (#2804)
8893
+ var isOpening = true;
8894
+ this._delay(function() {
8895
+ isOpening = false;
8896
+ });
8897
+
8898
+ if ( !this.document.data( "ui-dialog-overlays" ) ) {
8899
+
8900
+ // Prevent use of anchors and inputs
8901
+ // Using _on() for an event handler shared across many instances is
8902
+ // safe because the dialogs stack and must be closed in reverse order
8903
+ this._on( this.document, {
8904
+ focusin: function( event ) {
8905
+ if ( isOpening ) {
8906
+ return;
8907
+ }
8908
+
8909
+ if ( !this._allowInteraction( event ) ) {
8910
+ event.preventDefault();
8911
+ this._trackingInstances()[ 0 ]._focusTabbable();
8912
+ }
8913
+ }
8914
+ });
8915
+ }
8916
+
8917
+ this.overlay = $( "<div>" )
8918
+ .addClass( "ui-widget-overlay ui-front" )
8919
+ .appendTo( this._appendTo() );
8920
+ this._on( this.overlay, {
8921
+ mousedown: "_keepFocus"
8922
+ });
8923
+ this.document.data( "ui-dialog-overlays",
8924
+ (this.document.data( "ui-dialog-overlays" ) || 0) + 1 );
8925
+ },
8926
+
8927
+ _destroyOverlay: function() {
8928
+ if ( !this.options.modal ) {
8929
+ return;
8930
+ }
8931
+
8932
+ if ( this.overlay ) {
8933
+ var overlays = this.document.data( "ui-dialog-overlays" ) - 1;
8934
+
8935
+ if ( !overlays ) {
8936
+ this.document
8937
+ .unbind( "focusin" )
8938
+ .removeData( "ui-dialog-overlays" );
8939
+ } else {
8940
+ this.document.data( "ui-dialog-overlays", overlays );
8941
+ }
8942
+
8943
+ this.overlay.remove();
8944
+ this.overlay = null;
8945
+ }
8946
+ }
8947
+ });
8948
+
8949
+
8950
+ /*!
8951
+ * jQuery UI Droppable 1.11.4
8952
+ * http://jqueryui.com
8953
+ *
8954
+ * Copyright jQuery Foundation and other contributors
8955
+ * Released under the MIT license.
8956
+ * http://jquery.org/license
8957
+ *
8958
+ * http://api.jqueryui.com/droppable/
8959
+ */
8960
+
8961
+
8962
+ $.widget( "ui.droppable", {
8963
+ version: "1.11.4",
8964
+ widgetEventPrefix: "drop",
8965
+ options: {
8966
+ accept: "*",
8967
+ activeClass: false,
8968
+ addClasses: true,
8969
+ greedy: false,
8970
+ hoverClass: false,
8971
+ scope: "default",
8972
+ tolerance: "intersect",
8973
+
8974
+ // callbacks
8975
+ activate: null,
8976
+ deactivate: null,
8977
+ drop: null,
8978
+ out: null,
8979
+ over: null
8980
+ },
8981
+ _create: function() {
8982
+
8983
+ var proportions,
8984
+ o = this.options,
8985
+ accept = o.accept;
8986
+
8987
+ this.isover = false;
8988
+ this.isout = true;
8989
+
8990
+ this.accept = $.isFunction( accept ) ? accept : function( d ) {
8991
+ return d.is( accept );
8992
+ };
8993
+
8994
+ this.proportions = function( /* valueToWrite */ ) {
8995
+ if ( arguments.length ) {
8996
+ // Store the droppable's proportions
8997
+ proportions = arguments[ 0 ];
8998
+ } else {
8999
+ // Retrieve or derive the droppable's proportions
9000
+ return proportions ?
9001
+ proportions :
9002
+ proportions = {
9003
+ width: this.element[ 0 ].offsetWidth,
9004
+ height: this.element[ 0 ].offsetHeight
9005
+ };
9006
+ }
9007
+ };
9008
+
9009
+ this._addToManager( o.scope );
9010
+
9011
+ o.addClasses && this.element.addClass( "ui-droppable" );
9012
+
9013
+ },
9014
+
9015
+ _addToManager: function( scope ) {
9016
+ // Add the reference and positions to the manager
9017
+ $.ui.ddmanager.droppables[ scope ] = $.ui.ddmanager.droppables[ scope ] || [];
9018
+ $.ui.ddmanager.droppables[ scope ].push( this );
9019
+ },
9020
+
9021
+ _splice: function( drop ) {
9022
+ var i = 0;
9023
+ for ( ; i < drop.length; i++ ) {
9024
+ if ( drop[ i ] === this ) {
9025
+ drop.splice( i, 1 );
9026
+ }
9027
+ }
9028
+ },
9029
+
9030
+ _destroy: function() {
9031
+ var drop = $.ui.ddmanager.droppables[ this.options.scope ];
9032
+
9033
+ this._splice( drop );
9034
+
9035
+ this.element.removeClass( "ui-droppable ui-droppable-disabled" );
9036
+ },
9037
+
9038
+ _setOption: function( key, value ) {
9039
+
9040
+ if ( key === "accept" ) {
9041
+ this.accept = $.isFunction( value ) ? value : function( d ) {
9042
+ return d.is( value );
9043
+ };
9044
+ } else if ( key === "scope" ) {
9045
+ var drop = $.ui.ddmanager.droppables[ this.options.scope ];
9046
+
9047
+ this._splice( drop );
9048
+ this._addToManager( value );
9049
+ }
9050
+
9051
+ this._super( key, value );
9052
+ },
9053
+
9054
+ _activate: function( event ) {
9055
+ var draggable = $.ui.ddmanager.current;
9056
+ if ( this.options.activeClass ) {
9057
+ this.element.addClass( this.options.activeClass );
9058
+ }
9059
+ if ( draggable ){
9060
+ this._trigger( "activate", event, this.ui( draggable ) );
9061
+ }
9062
+ },
9063
+
9064
+ _deactivate: function( event ) {
9065
+ var draggable = $.ui.ddmanager.current;
9066
+ if ( this.options.activeClass ) {
9067
+ this.element.removeClass( this.options.activeClass );
9068
+ }
9069
+ if ( draggable ){
9070
+ this._trigger( "deactivate", event, this.ui( draggable ) );
9071
+ }
9072
+ },
9073
+
9074
+ _over: function( event ) {
9075
+
9076
+ var draggable = $.ui.ddmanager.current;
9077
+
9078
+ // Bail if draggable and droppable are same element
9079
+ if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {
9080
+ return;
9081
+ }
9082
+
9083
+ if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
9084
+ if ( this.options.hoverClass ) {
9085
+ this.element.addClass( this.options.hoverClass );
9086
+ }
9087
+ this._trigger( "over", event, this.ui( draggable ) );
9088
+ }
9089
+
9090
+ },
9091
+
9092
+ _out: function( event ) {
9093
+
9094
+ var draggable = $.ui.ddmanager.current;
9095
+
9096
+ // Bail if draggable and droppable are same element
9097
+ if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {
9098
+ return;
9099
+ }
9100
+
9101
+ if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
9102
+ if ( this.options.hoverClass ) {
9103
+ this.element.removeClass( this.options.hoverClass );
9104
+ }
9105
+ this._trigger( "out", event, this.ui( draggable ) );
9106
+ }
9107
+
9108
+ },
9109
+
9110
+ _drop: function( event, custom ) {
9111
+
9112
+ var draggable = custom || $.ui.ddmanager.current,
9113
+ childrenIntersection = false;
9114
+
9115
+ // Bail if draggable and droppable are same element
9116
+ if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {
9117
+ return false;
9118
+ }
9119
+
9120
+ this.element.find( ":data(ui-droppable)" ).not( ".ui-draggable-dragging" ).each(function() {
9121
+ var inst = $( this ).droppable( "instance" );
9122
+ if (
9123
+ inst.options.greedy &&
9124
+ !inst.options.disabled &&
9125
+ inst.options.scope === draggable.options.scope &&
9126
+ inst.accept.call( inst.element[ 0 ], ( draggable.currentItem || draggable.element ) ) &&
9127
+ $.ui.intersect( draggable, $.extend( inst, { offset: inst.element.offset() } ), inst.options.tolerance, event )
9128
+ ) { childrenIntersection = true; return false; }
9129
+ });
9130
+ if ( childrenIntersection ) {
9131
+ return false;
9132
+ }
9133
+
9134
+ if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
9135
+ if ( this.options.activeClass ) {
9136
+ this.element.removeClass( this.options.activeClass );
9137
+ }
9138
+ if ( this.options.hoverClass ) {
9139
+ this.element.removeClass( this.options.hoverClass );
9140
+ }
9141
+ this._trigger( "drop", event, this.ui( draggable ) );
9142
+ return this.element;
9143
+ }
9144
+
9145
+ return false;
9146
+
9147
+ },
9148
+
9149
+ ui: function( c ) {
9150
+ return {
9151
+ draggable: ( c.currentItem || c.element ),
9152
+ helper: c.helper,
9153
+ position: c.position,
9154
+ offset: c.positionAbs
9155
+ };
9156
+ }
9157
+
9158
+ });
9159
+
9160
+ $.ui.intersect = (function() {
9161
+ function isOverAxis( x, reference, size ) {
9162
+ return ( x >= reference ) && ( x < ( reference + size ) );
9163
+ }
9164
+
9165
+ return function( draggable, droppable, toleranceMode, event ) {
9166
+
9167
+ if ( !droppable.offset ) {
9168
+ return false;
9169
+ }
9170
+
9171
+ var x1 = ( draggable.positionAbs || draggable.position.absolute ).left + draggable.margins.left,
9172
+ y1 = ( draggable.positionAbs || draggable.position.absolute ).top + draggable.margins.top,
9173
+ x2 = x1 + draggable.helperProportions.width,
9174
+ y2 = y1 + draggable.helperProportions.height,
9175
+ l = droppable.offset.left,
9176
+ t = droppable.offset.top,
9177
+ r = l + droppable.proportions().width,
9178
+ b = t + droppable.proportions().height;
9179
+
9180
+ switch ( toleranceMode ) {
9181
+ case "fit":
9182
+ return ( l <= x1 && x2 <= r && t <= y1 && y2 <= b );
9183
+ case "intersect":
9184
+ return ( l < x1 + ( draggable.helperProportions.width / 2 ) && // Right Half
9185
+ x2 - ( draggable.helperProportions.width / 2 ) < r && // Left Half
9186
+ t < y1 + ( draggable.helperProportions.height / 2 ) && // Bottom Half
9187
+ y2 - ( draggable.helperProportions.height / 2 ) < b ); // Top Half
9188
+ case "pointer":
9189
+ return isOverAxis( event.pageY, t, droppable.proportions().height ) && isOverAxis( event.pageX, l, droppable.proportions().width );
9190
+ case "touch":
9191
+ return (
9192
+ ( y1 >= t && y1 <= b ) || // Top edge touching
9193
+ ( y2 >= t && y2 <= b ) || // Bottom edge touching
9194
+ ( y1 < t && y2 > b ) // Surrounded vertically
9195
+ ) && (
9196
+ ( x1 >= l && x1 <= r ) || // Left edge touching
9197
+ ( x2 >= l && x2 <= r ) || // Right edge touching
9198
+ ( x1 < l && x2 > r ) // Surrounded horizontally
9199
+ );
9200
+ default:
9201
+ return false;
9202
+ }
9203
+ };
9204
+ })();
9205
+
9206
+ /*
9207
+ This manager tracks offsets of draggables and droppables
9208
+ */
9209
+ $.ui.ddmanager = {
9210
+ current: null,
9211
+ droppables: { "default": [] },
9212
+ prepareOffsets: function( t, event ) {
9213
+
9214
+ var i, j,
9215
+ m = $.ui.ddmanager.droppables[ t.options.scope ] || [],
9216
+ type = event ? event.type : null, // workaround for #2317
9217
+ list = ( t.currentItem || t.element ).find( ":data(ui-droppable)" ).addBack();
9218
+
9219
+ droppablesLoop: for ( i = 0; i < m.length; i++ ) {
9220
+
9221
+ // No disabled and non-accepted
9222
+ if ( m[ i ].options.disabled || ( t && !m[ i ].accept.call( m[ i ].element[ 0 ], ( t.currentItem || t.element ) ) ) ) {
9223
+ continue;
9224
+ }
9225
+
9226
+ // Filter out elements in the current dragged item
9227
+ for ( j = 0; j < list.length; j++ ) {
9228
+ if ( list[ j ] === m[ i ].element[ 0 ] ) {
9229
+ m[ i ].proportions().height = 0;
9230
+ continue droppablesLoop;
9231
+ }
9232
+ }
9233
+
9234
+ m[ i ].visible = m[ i ].element.css( "display" ) !== "none";
9235
+ if ( !m[ i ].visible ) {
9236
+ continue;
9237
+ }
9238
+
9239
+ // Activate the droppable if used directly from draggables
9240
+ if ( type === "mousedown" ) {
9241
+ m[ i ]._activate.call( m[ i ], event );
9242
+ }
9243
+
9244
+ m[ i ].offset = m[ i ].element.offset();
9245
+ m[ i ].proportions({ width: m[ i ].element[ 0 ].offsetWidth, height: m[ i ].element[ 0 ].offsetHeight });
9246
+
9247
+ }
9248
+
9249
+ },
9250
+ drop: function( draggable, event ) {
9251
+
9252
+ var dropped = false;
9253
+ // Create a copy of the droppables in case the list changes during the drop (#9116)
9254
+ $.each( ( $.ui.ddmanager.droppables[ draggable.options.scope ] || [] ).slice(), function() {
9255
+
9256
+ if ( !this.options ) {
9257
+ return;
9258
+ }
9259
+ if ( !this.options.disabled && this.visible && $.ui.intersect( draggable, this, this.options.tolerance, event ) ) {
9260
+ dropped = this._drop.call( this, event ) || dropped;
9261
+ }
9262
+
9263
+ if ( !this.options.disabled && this.visible && this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {
9264
+ this.isout = true;
9265
+ this.isover = false;
9266
+ this._deactivate.call( this, event );
9267
+ }
9268
+
9269
+ });
9270
+ return dropped;
9271
+
9272
+ },
9273
+ dragStart: function( draggable, event ) {
9274
+ // Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003)
9275
+ draggable.element.parentsUntil( "body" ).bind( "scroll.droppable", function() {
9276
+ if ( !draggable.options.refreshPositions ) {
9277
+ $.ui.ddmanager.prepareOffsets( draggable, event );
9278
+ }
9279
+ });
9280
+ },
9281
+ drag: function( draggable, event ) {
9282
+
9283
+ // If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
9284
+ if ( draggable.options.refreshPositions ) {
9285
+ $.ui.ddmanager.prepareOffsets( draggable, event );
9286
+ }
9287
+
9288
+ // Run through all droppables and check their positions based on specific tolerance options
9289
+ $.each( $.ui.ddmanager.droppables[ draggable.options.scope ] || [], function() {
9290
+
9291
+ if ( this.options.disabled || this.greedyChild || !this.visible ) {
9292
+ return;
9293
+ }
9294
+
9295
+ var parentInstance, scope, parent,
9296
+ intersects = $.ui.intersect( draggable, this, this.options.tolerance, event ),
9297
+ c = !intersects && this.isover ? "isout" : ( intersects && !this.isover ? "isover" : null );
9298
+ if ( !c ) {
9299
+ return;
9300
+ }
9301
+
9302
+ if ( this.options.greedy ) {
9303
+ // find droppable parents with same scope
9304
+ scope = this.options.scope;
9305
+ parent = this.element.parents( ":data(ui-droppable)" ).filter(function() {
9306
+ return $( this ).droppable( "instance" ).options.scope === scope;
9307
+ });
9308
+
9309
+ if ( parent.length ) {
9310
+ parentInstance = $( parent[ 0 ] ).droppable( "instance" );
9311
+ parentInstance.greedyChild = ( c === "isover" );
9312
+ }
9313
+ }
9314
+
9315
+ // we just moved into a greedy child
9316
+ if ( parentInstance && c === "isover" ) {
9317
+ parentInstance.isover = false;
9318
+ parentInstance.isout = true;
9319
+ parentInstance._out.call( parentInstance, event );
9320
+ }
9321
+
9322
+ this[ c ] = true;
9323
+ this[c === "isout" ? "isover" : "isout"] = false;
9324
+ this[c === "isover" ? "_over" : "_out"].call( this, event );
9325
+
9326
+ // we just moved out of a greedy child
9327
+ if ( parentInstance && c === "isout" ) {
9328
+ parentInstance.isout = false;
9329
+ parentInstance.isover = true;
9330
+ parentInstance._over.call( parentInstance, event );
9331
+ }
9332
+ });
9333
+
9334
+ },
9335
+ dragStop: function( draggable, event ) {
9336
+ draggable.element.parentsUntil( "body" ).unbind( "scroll.droppable" );
9337
+ // Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003)
9338
+ if ( !draggable.options.refreshPositions ) {
9339
+ $.ui.ddmanager.prepareOffsets( draggable, event );
9340
+ }
9341
+ }
9342
+ };
9343
+
9344
+ var droppable = $.ui.droppable;
9345
+
9346
+
9347
+ /*!
9348
+ * jQuery UI Effects 1.11.4
9349
+ * http://jqueryui.com
9350
+ *
9351
+ * Copyright jQuery Foundation and other contributors
9352
+ * Released under the MIT license.
9353
+ * http://jquery.org/license
9354
+ *
9355
+ * http://api.jqueryui.com/category/effects-core/
9356
+ */
9357
+
9358
+
9359
+ var dataSpace = "ui-effects-",
9360
+
9361
+ // Create a local jQuery because jQuery Color relies on it and the
9362
+ // global may not exist with AMD and a custom build (#10199)
9363
+ jQuery = $;
9364
+
9365
+ $.effects = {
9366
+ effect: {}
9367
+ };
9368
+
9369
+ /*!
9370
+ * jQuery Color Animations v2.1.2
9371
+ * https://github.com/jquery/jquery-color
9372
+ *
9373
+ * Copyright 2014 jQuery Foundation and other contributors
9374
+ * Released under the MIT license.
9375
+ * http://jquery.org/license
9376
+ *
9377
+ * Date: Wed Jan 16 08:47:09 2013 -0600
9378
+ */
9379
+ (function( jQuery, undefined ) {
9380
+
9381
+ var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",
9382
+
9383
+ // plusequals test for += 100 -= 100
9384
+ rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,
9385
+ // a set of RE's that can match strings and generate color tuples.
9386
+ stringParsers = [ {
9387
+ re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
9388
+ parse: function( execResult ) {
9389
+ return [
9390
+ execResult[ 1 ],
9391
+ execResult[ 2 ],
9392
+ execResult[ 3 ],
9393
+ execResult[ 4 ]
9394
+ ];
9395
+ }
9396
+ }, {
9397
+ re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
9398
+ parse: function( execResult ) {
9399
+ return [
9400
+ execResult[ 1 ] * 2.55,
9401
+ execResult[ 2 ] * 2.55,
9402
+ execResult[ 3 ] * 2.55,
9403
+ execResult[ 4 ]
9404
+ ];
9405
+ }
9406
+ }, {
9407
+ // this regex ignores A-F because it's compared against an already lowercased string
9408
+ re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,
9409
+ parse: function( execResult ) {
9410
+ return [
9411
+ parseInt( execResult[ 1 ], 16 ),
9412
+ parseInt( execResult[ 2 ], 16 ),
9413
+ parseInt( execResult[ 3 ], 16 )
9414
+ ];
9415
+ }
9416
+ }, {
9417
+ // this regex ignores A-F because it's compared against an already lowercased string
9418
+ re: /#([a-f0-9])([a-f0-9])([a-f0-9])/,
9419
+ parse: function( execResult ) {
9420
+ return [
9421
+ parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),
9422
+ parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),
9423
+ parseInt( execResult[ 3 ] + execResult[ 3 ], 16 )
9424
+ ];
9425
+ }
9426
+ }, {
9427
+ re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
9428
+ space: "hsla",
9429
+ parse: function( execResult ) {
9430
+ return [
9431
+ execResult[ 1 ],
9432
+ execResult[ 2 ] / 100,
9433
+ execResult[ 3 ] / 100,
9434
+ execResult[ 4 ]
9435
+ ];
9436
+ }
9437
+ } ],
9438
+
9439
+ // jQuery.Color( )
9440
+ color = jQuery.Color = function( color, green, blue, alpha ) {
9441
+ return new jQuery.Color.fn.parse( color, green, blue, alpha );
9442
+ },
9443
+ spaces = {
9444
+ rgba: {
9445
+ props: {
9446
+ red: {
9447
+ idx: 0,
9448
+ type: "byte"
9449
+ },
9450
+ green: {
9451
+ idx: 1,
9452
+ type: "byte"
9453
+ },
9454
+ blue: {
9455
+ idx: 2,
9456
+ type: "byte"
9457
+ }
9458
+ }
9459
+ },
9460
+
9461
+ hsla: {
9462
+ props: {
9463
+ hue: {
9464
+ idx: 0,
9465
+ type: "degrees"
9466
+ },
9467
+ saturation: {
9468
+ idx: 1,
9469
+ type: "percent"
9470
+ },
9471
+ lightness: {
9472
+ idx: 2,
9473
+ type: "percent"
9474
+ }
9475
+ }
9476
+ }
9477
+ },
9478
+ propTypes = {
9479
+ "byte": {
9480
+ floor: true,
9481
+ max: 255
9482
+ },
9483
+ "percent": {
9484
+ max: 1
9485
+ },
9486
+ "degrees": {
9487
+ mod: 360,
9488
+ floor: true
9489
+ }
9490
+ },
9491
+ support = color.support = {},
9492
+
9493
+ // element for support tests
9494
+ supportElem = jQuery( "<p>" )[ 0 ],
9495
+
9496
+ // colors = jQuery.Color.names
9497
+ colors,
9498
+
9499
+ // local aliases of functions called often
9500
+ each = jQuery.each;
9501
+
9502
+ // determine rgba support immediately
9503
+ supportElem.style.cssText = "background-color:rgba(1,1,1,.5)";
9504
+ support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1;
9505
+
9506
+ // define cache name and alpha properties
9507
+ // for rgba and hsla spaces
9508
+ each( spaces, function( spaceName, space ) {
9509
+ space.cache = "_" + spaceName;
9510
+ space.props.alpha = {
9511
+ idx: 3,
9512
+ type: "percent",
9513
+ def: 1
9514
+ };
9515
+ });
9516
+
9517
+ function clamp( value, prop, allowEmpty ) {
9518
+ var type = propTypes[ prop.type ] || {};
9519
+
9520
+ if ( value == null ) {
9521
+ return (allowEmpty || !prop.def) ? null : prop.def;
9522
+ }
9523
+
9524
+ // ~~ is an short way of doing floor for positive numbers
9525
+ value = type.floor ? ~~value : parseFloat( value );
9526
+
9527
+ // IE will pass in empty strings as value for alpha,
9528
+ // which will hit this case
9529
+ if ( isNaN( value ) ) {
9530
+ return prop.def;
9531
+ }
9532
+
9533
+ if ( type.mod ) {
9534
+ // we add mod before modding to make sure that negatives values
9535
+ // get converted properly: -10 -> 350
9536
+ return (value + type.mod) % type.mod;
9537
+ }
9538
+
9539
+ // for now all property types without mod have min and max
9540
+ return 0 > value ? 0 : type.max < value ? type.max : value;
9541
+ }
9542
+
9543
+ function stringParse( string ) {
9544
+ var inst = color(),
9545
+ rgba = inst._rgba = [];
9546
+
9547
+ string = string.toLowerCase();
9548
+
9549
+ each( stringParsers, function( i, parser ) {
9550
+ var parsed,
9551
+ match = parser.re.exec( string ),
9552
+ values = match && parser.parse( match ),
9553
+ spaceName = parser.space || "rgba";
9554
+
9555
+ if ( values ) {
9556
+ parsed = inst[ spaceName ]( values );
9557
+
9558
+ // if this was an rgba parse the assignment might happen twice
9559
+ // oh well....
9560
+ inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];
9561
+ rgba = inst._rgba = parsed._rgba;
9562
+
9563
+ // exit each( stringParsers ) here because we matched
9564
+ return false;
9565
+ }
9566
+ });
9567
+
9568
+ // Found a stringParser that handled it
9569
+ if ( rgba.length ) {
9570
+
9571
+ // if this came from a parsed string, force "transparent" when alpha is 0
9572
+ // chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)
9573
+ if ( rgba.join() === "0,0,0,0" ) {
9574
+ jQuery.extend( rgba, colors.transparent );
9575
+ }
9576
+ return inst;
9577
+ }
9578
+
9579
+ // named colors
9580
+ return colors[ string ];
9581
+ }
9582
+
9583
+ color.fn = jQuery.extend( color.prototype, {
9584
+ parse: function( red, green, blue, alpha ) {
9585
+ if ( red === undefined ) {
9586
+ this._rgba = [ null, null, null, null ];
9587
+ return this;
9588
+ }
9589
+ if ( red.jquery || red.nodeType ) {
9590
+ red = jQuery( red ).css( green );
9591
+ green = undefined;
9592
+ }
9593
+
9594
+ var inst = this,
9595
+ type = jQuery.type( red ),
9596
+ rgba = this._rgba = [];
9597
+
9598
+ // more than 1 argument specified - assume ( red, green, blue, alpha )
9599
+ if ( green !== undefined ) {
9600
+ red = [ red, green, blue, alpha ];
9601
+ type = "array";
9602
+ }
9603
+
9604
+ if ( type === "string" ) {
9605
+ return this.parse( stringParse( red ) || colors._default );
9606
+ }
9607
+
9608
+ if ( type === "array" ) {
9609
+ each( spaces.rgba.props, function( key, prop ) {
9610
+ rgba[ prop.idx ] = clamp( red[ prop.idx ], prop );
9611
+ });
9612
+ return this;
9613
+ }
9614
+
9615
+ if ( type === "object" ) {
9616
+ if ( red instanceof color ) {
9617
+ each( spaces, function( spaceName, space ) {
9618
+ if ( red[ space.cache ] ) {
9619
+ inst[ space.cache ] = red[ space.cache ].slice();
9620
+ }
9621
+ });
9622
+ } else {
9623
+ each( spaces, function( spaceName, space ) {
9624
+ var cache = space.cache;
9625
+ each( space.props, function( key, prop ) {
9626
+
9627
+ // if the cache doesn't exist, and we know how to convert
9628
+ if ( !inst[ cache ] && space.to ) {
9629
+
9630
+ // if the value was null, we don't need to copy it
9631
+ // if the key was alpha, we don't need to copy it either
9632
+ if ( key === "alpha" || red[ key ] == null ) {
9633
+ return;
9634
+ }
9635
+ inst[ cache ] = space.to( inst._rgba );
9636
+ }
9637
+
9638
+ // this is the only case where we allow nulls for ALL properties.
9639
+ // call clamp with alwaysAllowEmpty
9640
+ inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );
9641
+ });
9642
+
9643
+ // everything defined but alpha?
9644
+ if ( inst[ cache ] && jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {
9645
+ // use the default of 1
9646
+ inst[ cache ][ 3 ] = 1;
9647
+ if ( space.from ) {
9648
+ inst._rgba = space.from( inst[ cache ] );
9649
+ }
9650
+ }
9651
+ });
9652
+ }
9653
+ return this;
9654
+ }
9655
+ },
9656
+ is: function( compare ) {
9657
+ var is = color( compare ),
9658
+ same = true,
9659
+ inst = this;
9660
+
9661
+ each( spaces, function( _, space ) {
9662
+ var localCache,
9663
+ isCache = is[ space.cache ];
9664
+ if (isCache) {
9665
+ localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];
9666
+ each( space.props, function( _, prop ) {
9667
+ if ( isCache[ prop.idx ] != null ) {
9668
+ same = ( isCache[ prop.idx ] === localCache[ prop.idx ] );
9669
+ return same;
9670
+ }
9671
+ });
9672
+ }
9673
+ return same;
9674
+ });
9675
+ return same;
9676
+ },
9677
+ _space: function() {
9678
+ var used = [],
9679
+ inst = this;
9680
+ each( spaces, function( spaceName, space ) {
9681
+ if ( inst[ space.cache ] ) {
9682
+ used.push( spaceName );
9683
+ }
9684
+ });
9685
+ return used.pop();
9686
+ },
9687
+ transition: function( other, distance ) {
9688
+ var end = color( other ),
9689
+ spaceName = end._space(),
9690
+ space = spaces[ spaceName ],
9691
+ startColor = this.alpha() === 0 ? color( "transparent" ) : this,
9692
+ start = startColor[ space.cache ] || space.to( startColor._rgba ),
9693
+ result = start.slice();
9694
+
9695
+ end = end[ space.cache ];
9696
+ each( space.props, function( key, prop ) {
9697
+ var index = prop.idx,
9698
+ startValue = start[ index ],
9699
+ endValue = end[ index ],
9700
+ type = propTypes[ prop.type ] || {};
9701
+
9702
+ // if null, don't override start value
9703
+ if ( endValue === null ) {
9704
+ return;
9705
+ }
9706
+ // if null - use end
9707
+ if ( startValue === null ) {
9708
+ result[ index ] = endValue;
9709
+ } else {
9710
+ if ( type.mod ) {
9711
+ if ( endValue - startValue > type.mod / 2 ) {
9712
+ startValue += type.mod;
9713
+ } else if ( startValue - endValue > type.mod / 2 ) {
9714
+ startValue -= type.mod;
9715
+ }
9716
+ }
9717
+ result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );
9718
+ }
9719
+ });
9720
+ return this[ spaceName ]( result );
9721
+ },
9722
+ blend: function( opaque ) {
9723
+ // if we are already opaque - return ourself
9724
+ if ( this._rgba[ 3 ] === 1 ) {
9725
+ return this;
9726
+ }
9727
+
9728
+ var rgb = this._rgba.slice(),
9729
+ a = rgb.pop(),
9730
+ blend = color( opaque )._rgba;
9731
+
9732
+ return color( jQuery.map( rgb, function( v, i ) {
9733
+ return ( 1 - a ) * blend[ i ] + a * v;
9734
+ }));
9735
+ },
9736
+ toRgbaString: function() {
9737
+ var prefix = "rgba(",
9738
+ rgba = jQuery.map( this._rgba, function( v, i ) {
9739
+ return v == null ? ( i > 2 ? 1 : 0 ) : v;
9740
+ });
9741
+
9742
+ if ( rgba[ 3 ] === 1 ) {
9743
+ rgba.pop();
9744
+ prefix = "rgb(";
9745
+ }
9746
+
9747
+ return prefix + rgba.join() + ")";
9748
+ },
9749
+ toHslaString: function() {
9750
+ var prefix = "hsla(",
9751
+ hsla = jQuery.map( this.hsla(), function( v, i ) {
9752
+ if ( v == null ) {
9753
+ v = i > 2 ? 1 : 0;
9754
+ }
9755
+
9756
+ // catch 1 and 2
9757
+ if ( i && i < 3 ) {
9758
+ v = Math.round( v * 100 ) + "%";
9759
+ }
9760
+ return v;
9761
+ });
9762
+
9763
+ if ( hsla[ 3 ] === 1 ) {
9764
+ hsla.pop();
9765
+ prefix = "hsl(";
9766
+ }
9767
+ return prefix + hsla.join() + ")";
9768
+ },
9769
+ toHexString: function( includeAlpha ) {
9770
+ var rgba = this._rgba.slice(),
9771
+ alpha = rgba.pop();
9772
+
9773
+ if ( includeAlpha ) {
9774
+ rgba.push( ~~( alpha * 255 ) );
9775
+ }
9776
+
9777
+ return "#" + jQuery.map( rgba, function( v ) {
9778
+
9779
+ // default to 0 when nulls exist
9780
+ v = ( v || 0 ).toString( 16 );
9781
+ return v.length === 1 ? "0" + v : v;
9782
+ }).join("");
9783
+ },
9784
+ toString: function() {
9785
+ return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString();
9786
+ }
9787
+ });
9788
+ color.fn.parse.prototype = color.fn;
9789
+
9790
+ // hsla conversions adapted from:
9791
+ // https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021
9792
+
9793
+ function hue2rgb( p, q, h ) {
9794
+ h = ( h + 1 ) % 1;
9795
+ if ( h * 6 < 1 ) {
9796
+ return p + ( q - p ) * h * 6;
9797
+ }
9798
+ if ( h * 2 < 1) {
9799
+ return q;
9800
+ }
9801
+ if ( h * 3 < 2 ) {
9802
+ return p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6;
9803
+ }
9804
+ return p;
9805
+ }
9806
+
9807
+ spaces.hsla.to = function( rgba ) {
9808
+ if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {
9809
+ return [ null, null, null, rgba[ 3 ] ];
9810
+ }
9811
+ var r = rgba[ 0 ] / 255,
9812
+ g = rgba[ 1 ] / 255,
9813
+ b = rgba[ 2 ] / 255,
9814
+ a = rgba[ 3 ],
9815
+ max = Math.max( r, g, b ),
9816
+ min = Math.min( r, g, b ),
9817
+ diff = max - min,
9818
+ add = max + min,
9819
+ l = add * 0.5,
9820
+ h, s;
9821
+
9822
+ if ( min === max ) {
9823
+ h = 0;
9824
+ } else if ( r === max ) {
9825
+ h = ( 60 * ( g - b ) / diff ) + 360;
9826
+ } else if ( g === max ) {
9827
+ h = ( 60 * ( b - r ) / diff ) + 120;
9828
+ } else {
9829
+ h = ( 60 * ( r - g ) / diff ) + 240;
9830
+ }
9831
+
9832
+ // chroma (diff) == 0 means greyscale which, by definition, saturation = 0%
9833
+ // otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)
9834
+ if ( diff === 0 ) {
9835
+ s = 0;
9836
+ } else if ( l <= 0.5 ) {
9837
+ s = diff / add;
9838
+ } else {
9839
+ s = diff / ( 2 - add );
9840
+ }
9841
+ return [ Math.round(h) % 360, s, l, a == null ? 1 : a ];
9842
+ };
9843
+
9844
+ spaces.hsla.from = function( hsla ) {
9845
+ if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {
9846
+ return [ null, null, null, hsla[ 3 ] ];
9847
+ }
9848
+ var h = hsla[ 0 ] / 360,
9849
+ s = hsla[ 1 ],
9850
+ l = hsla[ 2 ],
9851
+ a = hsla[ 3 ],
9852
+ q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,
9853
+ p = 2 * l - q;
9854
+
9855
+ return [
9856
+ Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),
9857
+ Math.round( hue2rgb( p, q, h ) * 255 ),
9858
+ Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),
9859
+ a
9860
+ ];
9861
+ };
9862
+
9863
+ each( spaces, function( spaceName, space ) {
9864
+ var props = space.props,
9865
+ cache = space.cache,
9866
+ to = space.to,
9867
+ from = space.from;
9868
+
9869
+ // makes rgba() and hsla()
9870
+ color.fn[ spaceName ] = function( value ) {
9871
+
9872
+ // generate a cache for this space if it doesn't exist
9873
+ if ( to && !this[ cache ] ) {
9874
+ this[ cache ] = to( this._rgba );
9875
+ }
9876
+ if ( value === undefined ) {
9877
+ return this[ cache ].slice();
9878
+ }
9879
+
9880
+ var ret,
9881
+ type = jQuery.type( value ),
9882
+ arr = ( type === "array" || type === "object" ) ? value : arguments,
9883
+ local = this[ cache ].slice();
9884
+
9885
+ each( props, function( key, prop ) {
9886
+ var val = arr[ type === "object" ? key : prop.idx ];
9887
+ if ( val == null ) {
9888
+ val = local[ prop.idx ];
9889
+ }
9890
+ local[ prop.idx ] = clamp( val, prop );
9891
+ });
9892
+
9893
+ if ( from ) {
9894
+ ret = color( from( local ) );
9895
+ ret[ cache ] = local;
9896
+ return ret;
9897
+ } else {
9898
+ return color( local );
9899
+ }
9900
+ };
9901
+
9902
+ // makes red() green() blue() alpha() hue() saturation() lightness()
9903
+ each( props, function( key, prop ) {
9904
+ // alpha is included in more than one space
9905
+ if ( color.fn[ key ] ) {
9906
+ return;
9907
+ }
9908
+ color.fn[ key ] = function( value ) {
9909
+ var vtype = jQuery.type( value ),
9910
+ fn = ( key === "alpha" ? ( this._hsla ? "hsla" : "rgba" ) : spaceName ),
9911
+ local = this[ fn ](),
9912
+ cur = local[ prop.idx ],
9913
+ match;
9914
+
9915
+ if ( vtype === "undefined" ) {
9916
+ return cur;
9917
+ }
9918
+
9919
+ if ( vtype === "function" ) {
9920
+ value = value.call( this, cur );
9921
+ vtype = jQuery.type( value );
9922
+ }
9923
+ if ( value == null && prop.empty ) {
9924
+ return this;
9925
+ }
9926
+ if ( vtype === "string" ) {
9927
+ match = rplusequals.exec( value );
9928
+ if ( match ) {
9929
+ value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 );
9930
+ }
9931
+ }
9932
+ local[ prop.idx ] = value;
9933
+ return this[ fn ]( local );
9934
+ };
9935
+ });
9936
+ });
9937
+
9938
+ // add cssHook and .fx.step function for each named hook.
9939
+ // accept a space separated string of properties
9940
+ color.hook = function( hook ) {
9941
+ var hooks = hook.split( " " );
9942
+ each( hooks, function( i, hook ) {
9943
+ jQuery.cssHooks[ hook ] = {
9944
+ set: function( elem, value ) {
9945
+ var parsed, curElem,
9946
+ backgroundColor = "";
9947
+
9948
+ if ( value !== "transparent" && ( jQuery.type( value ) !== "string" || ( parsed = stringParse( value ) ) ) ) {
9949
+ value = color( parsed || value );
9950
+ if ( !support.rgba && value._rgba[ 3 ] !== 1 ) {
9951
+ curElem = hook === "backgroundColor" ? elem.parentNode : elem;
9952
+ while (
9953
+ (backgroundColor === "" || backgroundColor === "transparent") &&
9954
+ curElem && curElem.style
9955
+ ) {
9956
+ try {
9957
+ backgroundColor = jQuery.css( curElem, "backgroundColor" );
9958
+ curElem = curElem.parentNode;
9959
+ } catch ( e ) {
9960
+ }
9961
+ }
9962
+
9963
+ value = value.blend( backgroundColor && backgroundColor !== "transparent" ?
9964
+ backgroundColor :
9965
+ "_default" );
9966
+ }
9967
+
9968
+ value = value.toRgbaString();
9969
+ }
9970
+ try {
9971
+ elem.style[ hook ] = value;
9972
+ } catch ( e ) {
9973
+ // wrapped to prevent IE from throwing errors on "invalid" values like 'auto' or 'inherit'
9974
+ }
9975
+ }
9976
+ };
9977
+ jQuery.fx.step[ hook ] = function( fx ) {
9978
+ if ( !fx.colorInit ) {
9979
+ fx.start = color( fx.elem, hook );
9980
+ fx.end = color( fx.end );
9981
+ fx.colorInit = true;
9982
+ }
9983
+ jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );
9984
+ };
9985
+ });
9986
+
9987
+ };
9988
+
9989
+ color.hook( stepHooks );
9990
+
9991
+ jQuery.cssHooks.borderColor = {
9992
+ expand: function( value ) {
9993
+ var expanded = {};
9994
+
9995
+ each( [ "Top", "Right", "Bottom", "Left" ], function( i, part ) {
9996
+ expanded[ "border" + part + "Color" ] = value;
9997
+ });
9998
+ return expanded;
9999
+ }
10000
+ };
10001
+
10002
+ // Basic color names only.
10003
+ // Usage of any of the other color names requires adding yourself or including
10004
+ // jquery.color.svg-names.js.
10005
+ colors = jQuery.Color.names = {
10006
+ // 4.1. Basic color keywords
10007
+ aqua: "#00ffff",
10008
+ black: "#000000",
10009
+ blue: "#0000ff",
10010
+ fuchsia: "#ff00ff",
10011
+ gray: "#808080",
10012
+ green: "#008000",
10013
+ lime: "#00ff00",
10014
+ maroon: "#800000",
10015
+ navy: "#000080",
10016
+ olive: "#808000",
10017
+ purple: "#800080",
10018
+ red: "#ff0000",
10019
+ silver: "#c0c0c0",
10020
+ teal: "#008080",
10021
+ white: "#ffffff",
10022
+ yellow: "#ffff00",
10023
+
10024
+ // 4.2.3. "transparent" color keyword
10025
+ transparent: [ null, null, null, 0 ],
10026
+
10027
+ _default: "#ffffff"
10028
+ };
10029
+
10030
+ })( jQuery );
10031
+
10032
+ /******************************************************************************/
10033
+ /****************************** CLASS ANIMATIONS ******************************/
10034
+ /******************************************************************************/
10035
+ (function() {
10036
+
10037
+ var classAnimationActions = [ "add", "remove", "toggle" ],
10038
+ shorthandStyles = {
10039
+ border: 1,
10040
+ borderBottom: 1,
10041
+ borderColor: 1,
10042
+ borderLeft: 1,
10043
+ borderRight: 1,
10044
+ borderTop: 1,
10045
+ borderWidth: 1,
10046
+ margin: 1,
10047
+ padding: 1
10048
+ };
10049
+
10050
+ $.each([ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ], function( _, prop ) {
10051
+ $.fx.step[ prop ] = function( fx ) {
10052
+ if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {
10053
+ jQuery.style( fx.elem, prop, fx.end );
10054
+ fx.setAttr = true;
10055
+ }
10056
+ };
10057
+ });
10058
+
10059
+ function getElementStyles( elem ) {
10060
+ var key, len,
10061
+ style = elem.ownerDocument.defaultView ?
10062
+ elem.ownerDocument.defaultView.getComputedStyle( elem, null ) :
10063
+ elem.currentStyle,
10064
+ styles = {};
10065
+
10066
+ if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {
10067
+ len = style.length;
10068
+ while ( len-- ) {
10069
+ key = style[ len ];
10070
+ if ( typeof style[ key ] === "string" ) {
10071
+ styles[ $.camelCase( key ) ] = style[ key ];
10072
+ }
10073
+ }
10074
+ // support: Opera, IE <9
10075
+ } else {
10076
+ for ( key in style ) {
10077
+ if ( typeof style[ key ] === "string" ) {
10078
+ styles[ key ] = style[ key ];
10079
+ }
10080
+ }
10081
+ }
10082
+
10083
+ return styles;
10084
+ }
10085
+
10086
+ function styleDifference( oldStyle, newStyle ) {
10087
+ var diff = {},
10088
+ name, value;
10089
+
10090
+ for ( name in newStyle ) {
10091
+ value = newStyle[ name ];
10092
+ if ( oldStyle[ name ] !== value ) {
10093
+ if ( !shorthandStyles[ name ] ) {
10094
+ if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {
10095
+ diff[ name ] = value;
10096
+ }
10097
+ }
10098
+ }
10099
+ }
10100
+
10101
+ return diff;
10102
+ }
10103
+
10104
+ // support: jQuery <1.8
10105
+ if ( !$.fn.addBack ) {
10106
+ $.fn.addBack = function( selector ) {
10107
+ return this.add( selector == null ?
10108
+ this.prevObject : this.prevObject.filter( selector )
10109
+ );
10110
+ };
10111
+ }
10112
+
10113
+ $.effects.animateClass = function( value, duration, easing, callback ) {
10114
+ var o = $.speed( duration, easing, callback );
10115
+
10116
+ return this.queue( function() {
10117
+ var animated = $( this ),
10118
+ baseClass = animated.attr( "class" ) || "",
10119
+ applyClassChange,
10120
+ allAnimations = o.children ? animated.find( "*" ).addBack() : animated;
10121
+
10122
+ // map the animated objects to store the original styles.
10123
+ allAnimations = allAnimations.map(function() {
10124
+ var el = $( this );
10125
+ return {
10126
+ el: el,
10127
+ start: getElementStyles( this )
10128
+ };
10129
+ });
10130
+
10131
+ // apply class change
10132
+ applyClassChange = function() {
10133
+ $.each( classAnimationActions, function(i, action) {
10134
+ if ( value[ action ] ) {
10135
+ animated[ action + "Class" ]( value[ action ] );
10136
+ }
10137
+ });
10138
+ };
10139
+ applyClassChange();
10140
+
10141
+ // map all animated objects again - calculate new styles and diff
10142
+ allAnimations = allAnimations.map(function() {
10143
+ this.end = getElementStyles( this.el[ 0 ] );
10144
+ this.diff = styleDifference( this.start, this.end );
10145
+ return this;
10146
+ });
10147
+
10148
+ // apply original class
10149
+ animated.attr( "class", baseClass );
10150
+
10151
+ // map all animated objects again - this time collecting a promise
10152
+ allAnimations = allAnimations.map(function() {
10153
+ var styleInfo = this,
10154
+ dfd = $.Deferred(),
10155
+ opts = $.extend({}, o, {
10156
+ queue: false,
10157
+ complete: function() {
10158
+ dfd.resolve( styleInfo );
10159
+ }
10160
+ });
10161
+
10162
+ this.el.animate( this.diff, opts );
10163
+ return dfd.promise();
10164
+ });
10165
+
10166
+ // once all animations have completed:
10167
+ $.when.apply( $, allAnimations.get() ).done(function() {
10168
+
10169
+ // set the final class
10170
+ applyClassChange();
10171
+
10172
+ // for each animated element,
10173
+ // clear all css properties that were animated
10174
+ $.each( arguments, function() {
10175
+ var el = this.el;
10176
+ $.each( this.diff, function(key) {
10177
+ el.css( key, "" );
10178
+ });
10179
+ });
10180
+
10181
+ // this is guarnteed to be there if you use jQuery.speed()
10182
+ // it also handles dequeuing the next anim...
10183
+ o.complete.call( animated[ 0 ] );
10184
+ });
10185
+ });
10186
+ };
10187
+
10188
+ $.fn.extend({
10189
+ addClass: (function( orig ) {
10190
+ return function( classNames, speed, easing, callback ) {
10191
+ return speed ?
10192
+ $.effects.animateClass.call( this,
10193
+ { add: classNames }, speed, easing, callback ) :
10194
+ orig.apply( this, arguments );
10195
+ };
10196
+ })( $.fn.addClass ),
10197
+
10198
+ removeClass: (function( orig ) {
10199
+ return function( classNames, speed, easing, callback ) {
10200
+ return arguments.length > 1 ?
10201
+ $.effects.animateClass.call( this,
10202
+ { remove: classNames }, speed, easing, callback ) :
10203
+ orig.apply( this, arguments );
10204
+ };
10205
+ })( $.fn.removeClass ),
10206
+
10207
+ toggleClass: (function( orig ) {
10208
+ return function( classNames, force, speed, easing, callback ) {
10209
+ if ( typeof force === "boolean" || force === undefined ) {
10210
+ if ( !speed ) {
10211
+ // without speed parameter
10212
+ return orig.apply( this, arguments );
10213
+ } else {
10214
+ return $.effects.animateClass.call( this,
10215
+ (force ? { add: classNames } : { remove: classNames }),
10216
+ speed, easing, callback );
10217
+ }
10218
+ } else {
10219
+ // without force parameter
10220
+ return $.effects.animateClass.call( this,
10221
+ { toggle: classNames }, force, speed, easing );
10222
+ }
10223
+ };
10224
+ })( $.fn.toggleClass ),
10225
+
10226
+ switchClass: function( remove, add, speed, easing, callback) {
10227
+ return $.effects.animateClass.call( this, {
10228
+ add: add,
10229
+ remove: remove
10230
+ }, speed, easing, callback );
10231
+ }
10232
+ });
10233
+
10234
+ })();
10235
+
10236
+ /******************************************************************************/
10237
+ /*********************************** EFFECTS **********************************/
10238
+ /******************************************************************************/
10239
+
10240
+ (function() {
10241
+
10242
+ $.extend( $.effects, {
10243
+ version: "1.11.4",
10244
+
10245
+ // Saves a set of properties in a data storage
10246
+ save: function( element, set ) {
10247
+ for ( var i = 0; i < set.length; i++ ) {
10248
+ if ( set[ i ] !== null ) {
10249
+ element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );
10250
+ }
10251
+ }
10252
+ },
10253
+
10254
+ // Restores a set of previously saved properties from a data storage
10255
+ restore: function( element, set ) {
10256
+ var val, i;
10257
+ for ( i = 0; i < set.length; i++ ) {
10258
+ if ( set[ i ] !== null ) {
10259
+ val = element.data( dataSpace + set[ i ] );
10260
+ // support: jQuery 1.6.2
10261
+ // http://bugs.jquery.com/ticket/9917
10262
+ // jQuery 1.6.2 incorrectly returns undefined for any falsy value.
10263
+ // We can't differentiate between "" and 0 here, so we just assume
10264
+ // empty string since it's likely to be a more common value...
10265
+ if ( val === undefined ) {
10266
+ val = "";
10267
+ }
10268
+ element.css( set[ i ], val );
10269
+ }
10270
+ }
10271
+ },
10272
+
10273
+ setMode: function( el, mode ) {
10274
+ if (mode === "toggle") {
10275
+ mode = el.is( ":hidden" ) ? "show" : "hide";
10276
+ }
10277
+ return mode;
10278
+ },
10279
+
10280
+ // Translates a [top,left] array into a baseline value
10281
+ // this should be a little more flexible in the future to handle a string & hash
10282
+ getBaseline: function( origin, original ) {
10283
+ var y, x;
10284
+ switch ( origin[ 0 ] ) {
10285
+ case "top": y = 0; break;
10286
+ case "middle": y = 0.5; break;
10287
+ case "bottom": y = 1; break;
10288
+ default: y = origin[ 0 ] / original.height;
10289
+ }
10290
+ switch ( origin[ 1 ] ) {
10291
+ case "left": x = 0; break;
10292
+ case "center": x = 0.5; break;
10293
+ case "right": x = 1; break;
10294
+ default: x = origin[ 1 ] / original.width;
10295
+ }
10296
+ return {
10297
+ x: x,
10298
+ y: y
10299
+ };
10300
+ },
10301
+
10302
+ // Wraps the element around a wrapper that copies position properties
10303
+ createWrapper: function( element ) {
10304
+
10305
+ // if the element is already wrapped, return it
10306
+ if ( element.parent().is( ".ui-effects-wrapper" )) {
10307
+ return element.parent();
10308
+ }
10309
+
10310
+ // wrap the element
10311
+ var props = {
10312
+ width: element.outerWidth(true),
10313
+ height: element.outerHeight(true),
10314
+ "float": element.css( "float" )
10315
+ },
10316
+ wrapper = $( "<div></div>" )
10317
+ .addClass( "ui-effects-wrapper" )
10318
+ .css({
10319
+ fontSize: "100%",
10320
+ background: "transparent",
10321
+ border: "none",
10322
+ margin: 0,
10323
+ padding: 0
10324
+ }),
10325
+ // Store the size in case width/height are defined in % - Fixes #5245
10326
+ size = {
10327
+ width: element.width(),
10328
+ height: element.height()
10329
+ },
10330
+ active = document.activeElement;
10331
+
10332
+ // support: Firefox
10333
+ // Firefox incorrectly exposes anonymous content
10334
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=561664
10335
+ try {
10336
+ active.id;
10337
+ } catch ( e ) {
10338
+ active = document.body;
10339
+ }
10340
+
10341
+ element.wrap( wrapper );
10342
+
10343
+ // Fixes #7595 - Elements lose focus when wrapped.
10344
+ if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
10345
+ $( active ).focus();
10346
+ }
10347
+
10348
+ wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually lose the reference to the wrapped element
10349
+
10350
+ // transfer positioning properties to the wrapper
10351
+ if ( element.css( "position" ) === "static" ) {
10352
+ wrapper.css({ position: "relative" });
10353
+ element.css({ position: "relative" });
10354
+ } else {
10355
+ $.extend( props, {
10356
+ position: element.css( "position" ),
10357
+ zIndex: element.css( "z-index" )
10358
+ });
10359
+ $.each([ "top", "left", "bottom", "right" ], function(i, pos) {
10360
+ props[ pos ] = element.css( pos );
10361
+ if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {
10362
+ props[ pos ] = "auto";
10363
+ }
10364
+ });
10365
+ element.css({
10366
+ position: "relative",
10367
+ top: 0,
10368
+ left: 0,
10369
+ right: "auto",
10370
+ bottom: "auto"
10371
+ });
10372
+ }
10373
+ element.css(size);
10374
+
10375
+ return wrapper.css( props ).show();
10376
+ },
10377
+
10378
+ removeWrapper: function( element ) {
10379
+ var active = document.activeElement;
10380
+
10381
+ if ( element.parent().is( ".ui-effects-wrapper" ) ) {
10382
+ element.parent().replaceWith( element );
10383
+
10384
+ // Fixes #7595 - Elements lose focus when wrapped.
10385
+ if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
10386
+ $( active ).focus();
10387
+ }
10388
+ }
10389
+
10390
+ return element;
10391
+ },
10392
+
10393
+ setTransition: function( element, list, factor, value ) {
10394
+ value = value || {};
10395
+ $.each( list, function( i, x ) {
10396
+ var unit = element.cssUnit( x );
10397
+ if ( unit[ 0 ] > 0 ) {
10398
+ value[ x ] = unit[ 0 ] * factor + unit[ 1 ];
10399
+ }
10400
+ });
10401
+ return value;
10402
+ }
10403
+ });
10404
+
10405
+ // return an effect options object for the given parameters:
10406
+ function _normalizeArguments( effect, options, speed, callback ) {
10407
+
10408
+ // allow passing all options as the first parameter
10409
+ if ( $.isPlainObject( effect ) ) {
10410
+ options = effect;
10411
+ effect = effect.effect;
10412
+ }
10413
+
10414
+ // convert to an object
10415
+ effect = { effect: effect };
10416
+
10417
+ // catch (effect, null, ...)
10418
+ if ( options == null ) {
10419
+ options = {};
10420
+ }
10421
+
10422
+ // catch (effect, callback)
10423
+ if ( $.isFunction( options ) ) {
10424
+ callback = options;
10425
+ speed = null;
10426
+ options = {};
10427
+ }
10428
+
10429
+ // catch (effect, speed, ?)
10430
+ if ( typeof options === "number" || $.fx.speeds[ options ] ) {
10431
+ callback = speed;
10432
+ speed = options;
10433
+ options = {};
10434
+ }
10435
+
10436
+ // catch (effect, options, callback)
10437
+ if ( $.isFunction( speed ) ) {
10438
+ callback = speed;
10439
+ speed = null;
10440
+ }
10441
+
10442
+ // add options to effect
10443
+ if ( options ) {
10444
+ $.extend( effect, options );
10445
+ }
10446
+
10447
+ speed = speed || options.duration;
10448
+ effect.duration = $.fx.off ? 0 :
10449
+ typeof speed === "number" ? speed :
10450
+ speed in $.fx.speeds ? $.fx.speeds[ speed ] :
10451
+ $.fx.speeds._default;
10452
+
10453
+ effect.complete = callback || options.complete;
10454
+
10455
+ return effect;
10456
+ }
10457
+
10458
+ function standardAnimationOption( option ) {
10459
+ // Valid standard speeds (nothing, number, named speed)
10460
+ if ( !option || typeof option === "number" || $.fx.speeds[ option ] ) {
10461
+ return true;
10462
+ }
10463
+
10464
+ // Invalid strings - treat as "normal" speed
10465
+ if ( typeof option === "string" && !$.effects.effect[ option ] ) {
10466
+ return true;
10467
+ }
10468
+
10469
+ // Complete callback
10470
+ if ( $.isFunction( option ) ) {
10471
+ return true;
10472
+ }
10473
+
10474
+ // Options hash (but not naming an effect)
10475
+ if ( typeof option === "object" && !option.effect ) {
10476
+ return true;
10477
+ }
10478
+
10479
+ // Didn't match any standard API
10480
+ return false;
10481
+ }
10482
+
10483
+ $.fn.extend({
10484
+ effect: function( /* effect, options, speed, callback */ ) {
10485
+ var args = _normalizeArguments.apply( this, arguments ),
10486
+ mode = args.mode,
10487
+ queue = args.queue,
10488
+ effectMethod = $.effects.effect[ args.effect ];
10489
+
10490
+ if ( $.fx.off || !effectMethod ) {
10491
+ // delegate to the original method (e.g., .show()) if possible
10492
+ if ( mode ) {
10493
+ return this[ mode ]( args.duration, args.complete );
10494
+ } else {
10495
+ return this.each( function() {
10496
+ if ( args.complete ) {
10497
+ args.complete.call( this );
10498
+ }
10499
+ });
10500
+ }
10501
+ }
10502
+
10503
+ function run( next ) {
10504
+ var elem = $( this ),
10505
+ complete = args.complete,
10506
+ mode = args.mode;
10507
+
10508
+ function done() {
10509
+ if ( $.isFunction( complete ) ) {
10510
+ complete.call( elem[0] );
10511
+ }
10512
+ if ( $.isFunction( next ) ) {
10513
+ next();
10514
+ }
10515
+ }
10516
+
10517
+ // If the element already has the correct final state, delegate to
10518
+ // the core methods so the internal tracking of "olddisplay" works.
10519
+ if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) {
10520
+ elem[ mode ]();
10521
+ done();
10522
+ } else {
10523
+ effectMethod.call( elem[0], args, done );
10524
+ }
10525
+ }
10526
+
10527
+ return queue === false ? this.each( run ) : this.queue( queue || "fx", run );
10528
+ },
10529
+
10530
+ show: (function( orig ) {
10531
+ return function( option ) {
10532
+ if ( standardAnimationOption( option ) ) {
10533
+ return orig.apply( this, arguments );
10534
+ } else {
10535
+ var args = _normalizeArguments.apply( this, arguments );
10536
+ args.mode = "show";
10537
+ return this.effect.call( this, args );
10538
+ }
10539
+ };
10540
+ })( $.fn.show ),
10541
+
10542
+ hide: (function( orig ) {
10543
+ return function( option ) {
10544
+ if ( standardAnimationOption( option ) ) {
10545
+ return orig.apply( this, arguments );
10546
+ } else {
10547
+ var args = _normalizeArguments.apply( this, arguments );
10548
+ args.mode = "hide";
10549
+ return this.effect.call( this, args );
10550
+ }
10551
+ };
10552
+ })( $.fn.hide ),
10553
+
10554
+ toggle: (function( orig ) {
10555
+ return function( option ) {
10556
+ if ( standardAnimationOption( option ) || typeof option === "boolean" ) {
10557
+ return orig.apply( this, arguments );
10558
+ } else {
10559
+ var args = _normalizeArguments.apply( this, arguments );
10560
+ args.mode = "toggle";
10561
+ return this.effect.call( this, args );
10562
+ }
10563
+ };
10564
+ })( $.fn.toggle ),
10565
+
10566
+ // helper functions
10567
+ cssUnit: function(key) {
10568
+ var style = this.css( key ),
10569
+ val = [];
10570
+
10571
+ $.each( [ "em", "px", "%", "pt" ], function( i, unit ) {
10572
+ if ( style.indexOf( unit ) > 0 ) {
10573
+ val = [ parseFloat( style ), unit ];
10574
+ }
10575
+ });
10576
+ return val;
10577
+ }
10578
+ });
10579
+
10580
+ })();
10581
+
10582
+ /******************************************************************************/
10583
+ /*********************************** EASING ***********************************/
10584
+ /******************************************************************************/
10585
+
10586
+ (function() {
10587
+
10588
+ // based on easing equations from Robert Penner (http://www.robertpenner.com/easing)
10589
+
10590
+ var baseEasings = {};
10591
+
10592
+ $.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
10593
+ baseEasings[ name ] = function( p ) {
10594
+ return Math.pow( p, i + 2 );
10595
+ };
10596
+ });
10597
+
10598
+ $.extend( baseEasings, {
10599
+ Sine: function( p ) {
10600
+ return 1 - Math.cos( p * Math.PI / 2 );
10601
+ },
10602
+ Circ: function( p ) {
10603
+ return 1 - Math.sqrt( 1 - p * p );
10604
+ },
10605
+ Elastic: function( p ) {
10606
+ return p === 0 || p === 1 ? p :
10607
+ -Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );
10608
+ },
10609
+ Back: function( p ) {
10610
+ return p * p * ( 3 * p - 2 );
10611
+ },
10612
+ Bounce: function( p ) {
10613
+ var pow2,
10614
+ bounce = 4;
10615
+
10616
+ while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
10617
+ return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
10618
+ }
10619
+ });
10620
+
10621
+ $.each( baseEasings, function( name, easeIn ) {
10622
+ $.easing[ "easeIn" + name ] = easeIn;
10623
+ $.easing[ "easeOut" + name ] = function( p ) {
10624
+ return 1 - easeIn( 1 - p );
10625
+ };
10626
+ $.easing[ "easeInOut" + name ] = function( p ) {
10627
+ return p < 0.5 ?
10628
+ easeIn( p * 2 ) / 2 :
10629
+ 1 - easeIn( p * -2 + 2 ) / 2;
10630
+ };
10631
+ });
10632
+
10633
+ })();
10634
+
10635
+ var effect = $.effects;
10636
+
10637
+
10638
+ /*!
10639
+ * jQuery UI Effects Blind 1.11.4
10640
+ * http://jqueryui.com
10641
+ *
10642
+ * Copyright jQuery Foundation and other contributors
10643
+ * Released under the MIT license.
10644
+ * http://jquery.org/license
10645
+ *
10646
+ * http://api.jqueryui.com/blind-effect/
10647
+ */
10648
+
10649
+
10650
+ var effectBlind = $.effects.effect.blind = function( o, done ) {
10651
+ // Create element
10652
+ var el = $( this ),
10653
+ rvertical = /up|down|vertical/,
10654
+ rpositivemotion = /up|left|vertical|horizontal/,
10655
+ props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
10656
+ mode = $.effects.setMode( el, o.mode || "hide" ),
10657
+ direction = o.direction || "up",
10658
+ vertical = rvertical.test( direction ),
10659
+ ref = vertical ? "height" : "width",
10660
+ ref2 = vertical ? "top" : "left",
10661
+ motion = rpositivemotion.test( direction ),
10662
+ animation = {},
10663
+ show = mode === "show",
10664
+ wrapper, distance, margin;
10665
+
10666
+ // if already wrapped, the wrapper's properties are my property. #6245
10667
+ if ( el.parent().is( ".ui-effects-wrapper" ) ) {
10668
+ $.effects.save( el.parent(), props );
10669
+ } else {
10670
+ $.effects.save( el, props );
10671
+ }
10672
+ el.show();
10673
+ wrapper = $.effects.createWrapper( el ).css({
10674
+ overflow: "hidden"
10675
+ });
10676
+
10677
+ distance = wrapper[ ref ]();
10678
+ margin = parseFloat( wrapper.css( ref2 ) ) || 0;
10679
+
10680
+ animation[ ref ] = show ? distance : 0;
10681
+ if ( !motion ) {
10682
+ el
10683
+ .css( vertical ? "bottom" : "right", 0 )
10684
+ .css( vertical ? "top" : "left", "auto" )
10685
+ .css({ position: "absolute" });
10686
+
10687
+ animation[ ref2 ] = show ? margin : distance + margin;
10688
+ }
10689
+
10690
+ // start at 0 if we are showing
10691
+ if ( show ) {
10692
+ wrapper.css( ref, 0 );
10693
+ if ( !motion ) {
10694
+ wrapper.css( ref2, margin + distance );
10695
+ }
10696
+ }
10697
+
10698
+ // Animate
10699
+ wrapper.animate( animation, {
10700
+ duration: o.duration,
10701
+ easing: o.easing,
10702
+ queue: false,
10703
+ complete: function() {
10704
+ if ( mode === "hide" ) {
10705
+ el.hide();
10706
+ }
10707
+ $.effects.restore( el, props );
10708
+ $.effects.removeWrapper( el );
10709
+ done();
10710
+ }
10711
+ });
10712
+ };
10713
+
10714
+
10715
+ /*!
10716
+ * jQuery UI Effects Bounce 1.11.4
10717
+ * http://jqueryui.com
10718
+ *
10719
+ * Copyright jQuery Foundation and other contributors
10720
+ * Released under the MIT license.
10721
+ * http://jquery.org/license
10722
+ *
10723
+ * http://api.jqueryui.com/bounce-effect/
10724
+ */
10725
+
10726
+
10727
+ var effectBounce = $.effects.effect.bounce = function( o, done ) {
10728
+ var el = $( this ),
10729
+ props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
10730
+
10731
+ // defaults:
10732
+ mode = $.effects.setMode( el, o.mode || "effect" ),
10733
+ hide = mode === "hide",
10734
+ show = mode === "show",
10735
+ direction = o.direction || "up",
10736
+ distance = o.distance,
10737
+ times = o.times || 5,
10738
+
10739
+ // number of internal animations
10740
+ anims = times * 2 + ( show || hide ? 1 : 0 ),
10741
+ speed = o.duration / anims,
10742
+ easing = o.easing,
10743
+
10744
+ // utility:
10745
+ ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
10746
+ motion = ( direction === "up" || direction === "left" ),
10747
+ i,
10748
+ upAnim,
10749
+ downAnim,
10750
+
10751
+ // we will need to re-assemble the queue to stack our animations in place
10752
+ queue = el.queue(),
10753
+ queuelen = queue.length;
10754
+
10755
+ // Avoid touching opacity to prevent clearType and PNG issues in IE
10756
+ if ( show || hide ) {
10757
+ props.push( "opacity" );
10758
+ }
10759
+
10760
+ $.effects.save( el, props );
10761
+ el.show();
10762
+ $.effects.createWrapper( el ); // Create Wrapper
10763
+
10764
+ // default distance for the BIGGEST bounce is the outer Distance / 3
10765
+ if ( !distance ) {
10766
+ distance = el[ ref === "top" ? "outerHeight" : "outerWidth" ]() / 3;
10767
+ }
10768
+
10769
+ if ( show ) {
10770
+ downAnim = { opacity: 1 };
10771
+ downAnim[ ref ] = 0;
10772
+
10773
+ // if we are showing, force opacity 0 and set the initial position
10774
+ // then do the "first" animation
10775
+ el.css( "opacity", 0 )
10776
+ .css( ref, motion ? -distance * 2 : distance * 2 )
10777
+ .animate( downAnim, speed, easing );
10778
+ }
10779
+
10780
+ // start at the smallest distance if we are hiding
10781
+ if ( hide ) {
10782
+ distance = distance / Math.pow( 2, times - 1 );
10783
+ }
10784
+
10785
+ downAnim = {};
10786
+ downAnim[ ref ] = 0;
10787
+ // Bounces up/down/left/right then back to 0 -- times * 2 animations happen here
10788
+ for ( i = 0; i < times; i++ ) {
10789
+ upAnim = {};
10790
+ upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
10791
+
10792
+ el.animate( upAnim, speed, easing )
10793
+ .animate( downAnim, speed, easing );
10794
+
10795
+ distance = hide ? distance * 2 : distance / 2;
10796
+ }
10797
+
10798
+ // Last Bounce when Hiding
10799
+ if ( hide ) {
10800
+ upAnim = { opacity: 0 };
10801
+ upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
10802
+
10803
+ el.animate( upAnim, speed, easing );
10804
+ }
10805
+
10806
+ el.queue(function() {
10807
+ if ( hide ) {
10808
+ el.hide();
10809
+ }
10810
+ $.effects.restore( el, props );
10811
+ $.effects.removeWrapper( el );
10812
+ done();
10813
+ });
10814
+
10815
+ // inject all the animations we just queued to be first in line (after "inprogress")
10816
+ if ( queuelen > 1) {
10817
+ queue.splice.apply( queue,
10818
+ [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
10819
+ }
10820
+ el.dequeue();
10821
+
10822
+ };
10823
+
10824
+
10825
+ /*!
10826
+ * jQuery UI Effects Clip 1.11.4
10827
+ * http://jqueryui.com
10828
+ *
10829
+ * Copyright jQuery Foundation and other contributors
10830
+ * Released under the MIT license.
10831
+ * http://jquery.org/license
10832
+ *
10833
+ * http://api.jqueryui.com/clip-effect/
10834
+ */
10835
+
10836
+
10837
+ var effectClip = $.effects.effect.clip = function( o, done ) {
10838
+ // Create element
10839
+ var el = $( this ),
10840
+ props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
10841
+ mode = $.effects.setMode( el, o.mode || "hide" ),
10842
+ show = mode === "show",
10843
+ direction = o.direction || "vertical",
10844
+ vert = direction === "vertical",
10845
+ size = vert ? "height" : "width",
10846
+ position = vert ? "top" : "left",
10847
+ animation = {},
10848
+ wrapper, animate, distance;
10849
+
10850
+ // Save & Show
10851
+ $.effects.save( el, props );
10852
+ el.show();
10853
+
10854
+ // Create Wrapper
10855
+ wrapper = $.effects.createWrapper( el ).css({
10856
+ overflow: "hidden"
10857
+ });
10858
+ animate = ( el[0].tagName === "IMG" ) ? wrapper : el;
10859
+ distance = animate[ size ]();
10860
+
10861
+ // Shift
10862
+ if ( show ) {
10863
+ animate.css( size, 0 );
10864
+ animate.css( position, distance / 2 );
10865
+ }
10866
+
10867
+ // Create Animation Object:
10868
+ animation[ size ] = show ? distance : 0;
10869
+ animation[ position ] = show ? 0 : distance / 2;
10870
+
10871
+ // Animate
10872
+ animate.animate( animation, {
10873
+ queue: false,
10874
+ duration: o.duration,
10875
+ easing: o.easing,
10876
+ complete: function() {
10877
+ if ( !show ) {
10878
+ el.hide();
10879
+ }
10880
+ $.effects.restore( el, props );
10881
+ $.effects.removeWrapper( el );
10882
+ done();
10883
+ }
10884
+ });
10885
+
10886
+ };
10887
+
10888
+
10889
+ /*!
10890
+ * jQuery UI Effects Drop 1.11.4
10891
+ * http://jqueryui.com
10892
+ *
10893
+ * Copyright jQuery Foundation and other contributors
10894
+ * Released under the MIT license.
10895
+ * http://jquery.org/license
10896
+ *
10897
+ * http://api.jqueryui.com/drop-effect/
10898
+ */
10899
+
10900
+
10901
+ var effectDrop = $.effects.effect.drop = function( o, done ) {
10902
+
10903
+ var el = $( this ),
10904
+ props = [ "position", "top", "bottom", "left", "right", "opacity", "height", "width" ],
10905
+ mode = $.effects.setMode( el, o.mode || "hide" ),
10906
+ show = mode === "show",
10907
+ direction = o.direction || "left",
10908
+ ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
10909
+ motion = ( direction === "up" || direction === "left" ) ? "pos" : "neg",
10910
+ animation = {
10911
+ opacity: show ? 1 : 0
10912
+ },
10913
+ distance;
10914
+
10915
+ // Adjust
10916
+ $.effects.save( el, props );
10917
+ el.show();
10918
+ $.effects.createWrapper( el );
10919
+
10920
+ distance = o.distance || el[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ) / 2;
10921
+
10922
+ if ( show ) {
10923
+ el
10924
+ .css( "opacity", 0 )
10925
+ .css( ref, motion === "pos" ? -distance : distance );
10926
+ }
10927
+
10928
+ // Animation
10929
+ animation[ ref ] = ( show ?
10930
+ ( motion === "pos" ? "+=" : "-=" ) :
10931
+ ( motion === "pos" ? "-=" : "+=" ) ) +
10932
+ distance;
10933
+
10934
+ // Animate
10935
+ el.animate( animation, {
10936
+ queue: false,
10937
+ duration: o.duration,
10938
+ easing: o.easing,
10939
+ complete: function() {
10940
+ if ( mode === "hide" ) {
10941
+ el.hide();
10942
+ }
10943
+ $.effects.restore( el, props );
10944
+ $.effects.removeWrapper( el );
10945
+ done();
10946
+ }
10947
+ });
10948
+ };
10949
+
10950
+
10951
+ /*!
10952
+ * jQuery UI Effects Explode 1.11.4
10953
+ * http://jqueryui.com
10954
+ *
10955
+ * Copyright jQuery Foundation and other contributors
10956
+ * Released under the MIT license.
10957
+ * http://jquery.org/license
10958
+ *
10959
+ * http://api.jqueryui.com/explode-effect/
10960
+ */
10961
+
10962
+
10963
+ var effectExplode = $.effects.effect.explode = function( o, done ) {
10964
+
10965
+ var rows = o.pieces ? Math.round( Math.sqrt( o.pieces ) ) : 3,
10966
+ cells = rows,
10967
+ el = $( this ),
10968
+ mode = $.effects.setMode( el, o.mode || "hide" ),
10969
+ show = mode === "show",
10970
+
10971
+ // show and then visibility:hidden the element before calculating offset
10972
+ offset = el.show().css( "visibility", "hidden" ).offset(),
10973
+
10974
+ // width and height of a piece
10975
+ width = Math.ceil( el.outerWidth() / cells ),
10976
+ height = Math.ceil( el.outerHeight() / rows ),
10977
+ pieces = [],
10978
+
10979
+ // loop
10980
+ i, j, left, top, mx, my;
10981
+
10982
+ // children animate complete:
10983
+ function childComplete() {
10984
+ pieces.push( this );
10985
+ if ( pieces.length === rows * cells ) {
10986
+ animComplete();
10987
+ }
10988
+ }
10989
+
10990
+ // clone the element for each row and cell.
10991
+ for ( i = 0; i < rows ; i++ ) { // ===>
10992
+ top = offset.top + i * height;
10993
+ my = i - ( rows - 1 ) / 2 ;
10994
+
10995
+ for ( j = 0; j < cells ; j++ ) { // |||
10996
+ left = offset.left + j * width;
10997
+ mx = j - ( cells - 1 ) / 2 ;
10998
+
10999
+ // Create a clone of the now hidden main element that will be absolute positioned
11000
+ // within a wrapper div off the -left and -top equal to size of our pieces
11001
+ el
11002
+ .clone()
11003
+ .appendTo( "body" )
11004
+ .wrap( "<div></div>" )
11005
+ .css({
11006
+ position: "absolute",
11007
+ visibility: "visible",
11008
+ left: -j * width,
11009
+ top: -i * height
11010
+ })
11011
+
11012
+ // select the wrapper - make it overflow: hidden and absolute positioned based on
11013
+ // where the original was located +left and +top equal to the size of pieces
11014
+ .parent()
11015
+ .addClass( "ui-effects-explode" )
11016
+ .css({
11017
+ position: "absolute",
11018
+ overflow: "hidden",
11019
+ width: width,
11020
+ height: height,
11021
+ left: left + ( show ? mx * width : 0 ),
11022
+ top: top + ( show ? my * height : 0 ),
11023
+ opacity: show ? 0 : 1
11024
+ }).animate({
11025
+ left: left + ( show ? 0 : mx * width ),
11026
+ top: top + ( show ? 0 : my * height ),
11027
+ opacity: show ? 1 : 0
11028
+ }, o.duration || 500, o.easing, childComplete );
11029
+ }
11030
+ }
11031
+
11032
+ function animComplete() {
11033
+ el.css({
11034
+ visibility: "visible"
11035
+ });
11036
+ $( pieces ).remove();
11037
+ if ( !show ) {
11038
+ el.hide();
11039
+ }
11040
+ done();
11041
+ }
11042
+ };
11043
+
11044
+
11045
+ /*!
11046
+ * jQuery UI Effects Fade 1.11.4
11047
+ * http://jqueryui.com
11048
+ *
11049
+ * Copyright jQuery Foundation and other contributors
11050
+ * Released under the MIT license.
11051
+ * http://jquery.org/license
11052
+ *
11053
+ * http://api.jqueryui.com/fade-effect/
11054
+ */
11055
+
11056
+
11057
+ var effectFade = $.effects.effect.fade = function( o, done ) {
11058
+ var el = $( this ),
11059
+ mode = $.effects.setMode( el, o.mode || "toggle" );
11060
+
11061
+ el.animate({
11062
+ opacity: mode
11063
+ }, {
11064
+ queue: false,
11065
+ duration: o.duration,
11066
+ easing: o.easing,
11067
+ complete: done
11068
+ });
11069
+ };
11070
+
11071
+
11072
+ /*!
11073
+ * jQuery UI Effects Fold 1.11.4
11074
+ * http://jqueryui.com
11075
+ *
11076
+ * Copyright jQuery Foundation and other contributors
11077
+ * Released under the MIT license.
11078
+ * http://jquery.org/license
11079
+ *
11080
+ * http://api.jqueryui.com/fold-effect/
11081
+ */
11082
+
11083
+
11084
+ var effectFold = $.effects.effect.fold = function( o, done ) {
11085
+
11086
+ // Create element
11087
+ var el = $( this ),
11088
+ props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
11089
+ mode = $.effects.setMode( el, o.mode || "hide" ),
11090
+ show = mode === "show",
11091
+ hide = mode === "hide",
11092
+ size = o.size || 15,
11093
+ percent = /([0-9]+)%/.exec( size ),
11094
+ horizFirst = !!o.horizFirst,
11095
+ widthFirst = show !== horizFirst,
11096
+ ref = widthFirst ? [ "width", "height" ] : [ "height", "width" ],
11097
+ duration = o.duration / 2,
11098
+ wrapper, distance,
11099
+ animation1 = {},
11100
+ animation2 = {};
11101
+
11102
+ $.effects.save( el, props );
11103
+ el.show();
11104
+
11105
+ // Create Wrapper
11106
+ wrapper = $.effects.createWrapper( el ).css({
11107
+ overflow: "hidden"
11108
+ });
11109
+ distance = widthFirst ?
11110
+ [ wrapper.width(), wrapper.height() ] :
11111
+ [ wrapper.height(), wrapper.width() ];
11112
+
11113
+ if ( percent ) {
11114
+ size = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ];
11115
+ }
11116
+ if ( show ) {
11117
+ wrapper.css( horizFirst ? {
11118
+ height: 0,
11119
+ width: size
11120
+ } : {
11121
+ height: size,
11122
+ width: 0
11123
+ });
11124
+ }
11125
+
11126
+ // Animation
11127
+ animation1[ ref[ 0 ] ] = show ? distance[ 0 ] : size;
11128
+ animation2[ ref[ 1 ] ] = show ? distance[ 1 ] : 0;
11129
+
11130
+ // Animate
11131
+ wrapper
11132
+ .animate( animation1, duration, o.easing )
11133
+ .animate( animation2, duration, o.easing, function() {
11134
+ if ( hide ) {
11135
+ el.hide();
11136
+ }
11137
+ $.effects.restore( el, props );
11138
+ $.effects.removeWrapper( el );
11139
+ done();
11140
+ });
11141
+
11142
+ };
11143
+
11144
+
11145
+ /*!
11146
+ * jQuery UI Effects Highlight 1.11.4
11147
+ * http://jqueryui.com
11148
+ *
11149
+ * Copyright jQuery Foundation and other contributors
11150
+ * Released under the MIT license.
11151
+ * http://jquery.org/license
11152
+ *
11153
+ * http://api.jqueryui.com/highlight-effect/
11154
+ */
11155
+
11156
+
11157
+ var effectHighlight = $.effects.effect.highlight = function( o, done ) {
11158
+ var elem = $( this ),
11159
+ props = [ "backgroundImage", "backgroundColor", "opacity" ],
11160
+ mode = $.effects.setMode( elem, o.mode || "show" ),
11161
+ animation = {
11162
+ backgroundColor: elem.css( "backgroundColor" )
11163
+ };
11164
+
11165
+ if (mode === "hide") {
11166
+ animation.opacity = 0;
11167
+ }
11168
+
11169
+ $.effects.save( elem, props );
11170
+
11171
+ elem
11172
+ .show()
11173
+ .css({
11174
+ backgroundImage: "none",
11175
+ backgroundColor: o.color || "#ffff99"
11176
+ })
11177
+ .animate( animation, {
11178
+ queue: false,
11179
+ duration: o.duration,
11180
+ easing: o.easing,
11181
+ complete: function() {
11182
+ if ( mode === "hide" ) {
11183
+ elem.hide();
11184
+ }
11185
+ $.effects.restore( elem, props );
11186
+ done();
11187
+ }
11188
+ });
11189
+ };
11190
+
11191
+
11192
+ /*!
11193
+ * jQuery UI Effects Size 1.11.4
11194
+ * http://jqueryui.com
11195
+ *
11196
+ * Copyright jQuery Foundation and other contributors
11197
+ * Released under the MIT license.
11198
+ * http://jquery.org/license
11199
+ *
11200
+ * http://api.jqueryui.com/size-effect/
11201
+ */
11202
+
11203
+
11204
+ var effectSize = $.effects.effect.size = function( o, done ) {
11205
+
11206
+ // Create element
11207
+ var original, baseline, factor,
11208
+ el = $( this ),
11209
+ props0 = [ "position", "top", "bottom", "left", "right", "width", "height", "overflow", "opacity" ],
11210
+
11211
+ // Always restore
11212
+ props1 = [ "position", "top", "bottom", "left", "right", "overflow", "opacity" ],
11213
+
11214
+ // Copy for children
11215
+ props2 = [ "width", "height", "overflow" ],
11216
+ cProps = [ "fontSize" ],
11217
+ vProps = [ "borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom" ],
11218
+ hProps = [ "borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight" ],
11219
+
11220
+ // Set options
11221
+ mode = $.effects.setMode( el, o.mode || "effect" ),
11222
+ restore = o.restore || mode !== "effect",
11223
+ scale = o.scale || "both",
11224
+ origin = o.origin || [ "middle", "center" ],
11225
+ position = el.css( "position" ),
11226
+ props = restore ? props0 : props1,
11227
+ zero = {
11228
+ height: 0,
11229
+ width: 0,
11230
+ outerHeight: 0,
11231
+ outerWidth: 0
11232
+ };
11233
+
11234
+ if ( mode === "show" ) {
11235
+ el.show();
11236
+ }
11237
+ original = {
11238
+ height: el.height(),
11239
+ width: el.width(),
11240
+ outerHeight: el.outerHeight(),
11241
+ outerWidth: el.outerWidth()
11242
+ };
11243
+
11244
+ if ( o.mode === "toggle" && mode === "show" ) {
11245
+ el.from = o.to || zero;
11246
+ el.to = o.from || original;
11247
+ } else {
11248
+ el.from = o.from || ( mode === "show" ? zero : original );
11249
+ el.to = o.to || ( mode === "hide" ? zero : original );
11250
+ }
11251
+
11252
+ // Set scaling factor
11253
+ factor = {
11254
+ from: {
11255
+ y: el.from.height / original.height,
11256
+ x: el.from.width / original.width
11257
+ },
11258
+ to: {
11259
+ y: el.to.height / original.height,
11260
+ x: el.to.width / original.width
11261
+ }
11262
+ };
11263
+
11264
+ // Scale the css box
11265
+ if ( scale === "box" || scale === "both" ) {
11266
+
11267
+ // Vertical props scaling
11268
+ if ( factor.from.y !== factor.to.y ) {
11269
+ props = props.concat( vProps );
11270
+ el.from = $.effects.setTransition( el, vProps, factor.from.y, el.from );
11271
+ el.to = $.effects.setTransition( el, vProps, factor.to.y, el.to );
11272
+ }
11273
+
11274
+ // Horizontal props scaling
11275
+ if ( factor.from.x !== factor.to.x ) {
11276
+ props = props.concat( hProps );
11277
+ el.from = $.effects.setTransition( el, hProps, factor.from.x, el.from );
11278
+ el.to = $.effects.setTransition( el, hProps, factor.to.x, el.to );
11279
+ }
11280
+ }
11281
+
11282
+ // Scale the content
11283
+ if ( scale === "content" || scale === "both" ) {
11284
+
11285
+ // Vertical props scaling
11286
+ if ( factor.from.y !== factor.to.y ) {
11287
+ props = props.concat( cProps ).concat( props2 );
11288
+ el.from = $.effects.setTransition( el, cProps, factor.from.y, el.from );
11289
+ el.to = $.effects.setTransition( el, cProps, factor.to.y, el.to );
11290
+ }
11291
+ }
11292
+
11293
+ $.effects.save( el, props );
11294
+ el.show();
11295
+ $.effects.createWrapper( el );
11296
+ el.css( "overflow", "hidden" ).css( el.from );
11297
+
11298
+ // Adjust
11299
+ if (origin) { // Calculate baseline shifts
11300
+ baseline = $.effects.getBaseline( origin, original );
11301
+ el.from.top = ( original.outerHeight - el.outerHeight() ) * baseline.y;
11302
+ el.from.left = ( original.outerWidth - el.outerWidth() ) * baseline.x;
11303
+ el.to.top = ( original.outerHeight - el.to.outerHeight ) * baseline.y;
11304
+ el.to.left = ( original.outerWidth - el.to.outerWidth ) * baseline.x;
11305
+ }
11306
+ el.css( el.from ); // set top & left
11307
+
11308
+ // Animate
11309
+ if ( scale === "content" || scale === "both" ) { // Scale the children
11310
+
11311
+ // Add margins/font-size
11312
+ vProps = vProps.concat([ "marginTop", "marginBottom" ]).concat(cProps);
11313
+ hProps = hProps.concat([ "marginLeft", "marginRight" ]);
11314
+ props2 = props0.concat(vProps).concat(hProps);
11315
+
11316
+ el.find( "*[width]" ).each( function() {
11317
+ var child = $( this ),
11318
+ c_original = {
11319
+ height: child.height(),
11320
+ width: child.width(),
11321
+ outerHeight: child.outerHeight(),
11322
+ outerWidth: child.outerWidth()
11323
+ };
11324
+ if (restore) {
11325
+ $.effects.save(child, props2);
11326
+ }
11327
+
11328
+ child.from = {
11329
+ height: c_original.height * factor.from.y,
11330
+ width: c_original.width * factor.from.x,
11331
+ outerHeight: c_original.outerHeight * factor.from.y,
11332
+ outerWidth: c_original.outerWidth * factor.from.x
11333
+ };
11334
+ child.to = {
11335
+ height: c_original.height * factor.to.y,
11336
+ width: c_original.width * factor.to.x,
11337
+ outerHeight: c_original.height * factor.to.y,
11338
+ outerWidth: c_original.width * factor.to.x
11339
+ };
11340
+
11341
+ // Vertical props scaling
11342
+ if ( factor.from.y !== factor.to.y ) {
11343
+ child.from = $.effects.setTransition( child, vProps, factor.from.y, child.from );
11344
+ child.to = $.effects.setTransition( child, vProps, factor.to.y, child.to );
11345
+ }
11346
+
11347
+ // Horizontal props scaling
11348
+ if ( factor.from.x !== factor.to.x ) {
11349
+ child.from = $.effects.setTransition( child, hProps, factor.from.x, child.from );
11350
+ child.to = $.effects.setTransition( child, hProps, factor.to.x, child.to );
11351
+ }
11352
+
11353
+ // Animate children
11354
+ child.css( child.from );
11355
+ child.animate( child.to, o.duration, o.easing, function() {
11356
+
11357
+ // Restore children
11358
+ if ( restore ) {
11359
+ $.effects.restore( child, props2 );
11360
+ }
11361
+ });
11362
+ });
11363
+ }
11364
+
11365
+ // Animate
11366
+ el.animate( el.to, {
11367
+ queue: false,
11368
+ duration: o.duration,
11369
+ easing: o.easing,
11370
+ complete: function() {
11371
+ if ( el.to.opacity === 0 ) {
11372
+ el.css( "opacity", el.from.opacity );
11373
+ }
11374
+ if ( mode === "hide" ) {
11375
+ el.hide();
11376
+ }
11377
+ $.effects.restore( el, props );
11378
+ if ( !restore ) {
11379
+
11380
+ // we need to calculate our new positioning based on the scaling
11381
+ if ( position === "static" ) {
11382
+ el.css({
11383
+ position: "relative",
11384
+ top: el.to.top,
11385
+ left: el.to.left
11386
+ });
11387
+ } else {
11388
+ $.each([ "top", "left" ], function( idx, pos ) {
11389
+ el.css( pos, function( _, str ) {
11390
+ var val = parseInt( str, 10 ),
11391
+ toRef = idx ? el.to.left : el.to.top;
11392
+
11393
+ // if original was "auto", recalculate the new value from wrapper
11394
+ if ( str === "auto" ) {
11395
+ return toRef + "px";
11396
+ }
11397
+
11398
+ return val + toRef + "px";
11399
+ });
11400
+ });
11401
+ }
11402
+ }
11403
+
11404
+ $.effects.removeWrapper( el );
11405
+ done();
11406
+ }
11407
+ });
11408
+
11409
+ };
11410
+
11411
+
11412
+ /*!
11413
+ * jQuery UI Effects Scale 1.11.4
11414
+ * http://jqueryui.com
11415
+ *
11416
+ * Copyright jQuery Foundation and other contributors
11417
+ * Released under the MIT license.
11418
+ * http://jquery.org/license
11419
+ *
11420
+ * http://api.jqueryui.com/scale-effect/
11421
+ */
11422
+
11423
+
11424
+ var effectScale = $.effects.effect.scale = function( o, done ) {
11425
+
11426
+ // Create element
11427
+ var el = $( this ),
11428
+ options = $.extend( true, {}, o ),
11429
+ mode = $.effects.setMode( el, o.mode || "effect" ),
11430
+ percent = parseInt( o.percent, 10 ) ||
11431
+ ( parseInt( o.percent, 10 ) === 0 ? 0 : ( mode === "hide" ? 0 : 100 ) ),
11432
+ direction = o.direction || "both",
11433
+ origin = o.origin,
11434
+ original = {
11435
+ height: el.height(),
11436
+ width: el.width(),
11437
+ outerHeight: el.outerHeight(),
11438
+ outerWidth: el.outerWidth()
11439
+ },
11440
+ factor = {
11441
+ y: direction !== "horizontal" ? (percent / 100) : 1,
11442
+ x: direction !== "vertical" ? (percent / 100) : 1
11443
+ };
11444
+
11445
+ // We are going to pass this effect to the size effect:
11446
+ options.effect = "size";
11447
+ options.queue = false;
11448
+ options.complete = done;
11449
+
11450
+ // Set default origin and restore for show/hide
11451
+ if ( mode !== "effect" ) {
11452
+ options.origin = origin || [ "middle", "center" ];
11453
+ options.restore = true;
11454
+ }
11455
+
11456
+ options.from = o.from || ( mode === "show" ? {
11457
+ height: 0,
11458
+ width: 0,
11459
+ outerHeight: 0,
11460
+ outerWidth: 0
11461
+ } : original );
11462
+ options.to = {
11463
+ height: original.height * factor.y,
11464
+ width: original.width * factor.x,
11465
+ outerHeight: original.outerHeight * factor.y,
11466
+ outerWidth: original.outerWidth * factor.x
11467
+ };
11468
+
11469
+ // Fade option to support puff
11470
+ if ( options.fade ) {
11471
+ if ( mode === "show" ) {
11472
+ options.from.opacity = 0;
11473
+ options.to.opacity = 1;
11474
+ }
11475
+ if ( mode === "hide" ) {
11476
+ options.from.opacity = 1;
11477
+ options.to.opacity = 0;
11478
+ }
11479
+ }
11480
+
11481
+ // Animate
11482
+ el.effect( options );
11483
+
11484
+ };
11485
+
11486
+
11487
+ /*!
11488
+ * jQuery UI Effects Puff 1.11.4
11489
+ * http://jqueryui.com
11490
+ *
11491
+ * Copyright jQuery Foundation and other contributors
11492
+ * Released under the MIT license.
11493
+ * http://jquery.org/license
11494
+ *
11495
+ * http://api.jqueryui.com/puff-effect/
11496
+ */
11497
+
11498
+
11499
+ var effectPuff = $.effects.effect.puff = function( o, done ) {
11500
+ var elem = $( this ),
11501
+ mode = $.effects.setMode( elem, o.mode || "hide" ),
11502
+ hide = mode === "hide",
11503
+ percent = parseInt( o.percent, 10 ) || 150,
11504
+ factor = percent / 100,
11505
+ original = {
11506
+ height: elem.height(),
11507
+ width: elem.width(),
11508
+ outerHeight: elem.outerHeight(),
11509
+ outerWidth: elem.outerWidth()
11510
+ };
11511
+
11512
+ $.extend( o, {
11513
+ effect: "scale",
11514
+ queue: false,
11515
+ fade: true,
11516
+ mode: mode,
11517
+ complete: done,
11518
+ percent: hide ? percent : 100,
11519
+ from: hide ?
11520
+ original :
11521
+ {
11522
+ height: original.height * factor,
11523
+ width: original.width * factor,
11524
+ outerHeight: original.outerHeight * factor,
11525
+ outerWidth: original.outerWidth * factor
11526
+ }
11527
+ });
11528
+
11529
+ elem.effect( o );
11530
+ };
11531
+
11532
+
11533
+ /*!
11534
+ * jQuery UI Effects Pulsate 1.11.4
11535
+ * http://jqueryui.com
11536
+ *
11537
+ * Copyright jQuery Foundation and other contributors
11538
+ * Released under the MIT license.
11539
+ * http://jquery.org/license
11540
+ *
11541
+ * http://api.jqueryui.com/pulsate-effect/
11542
+ */
11543
+
11544
+
11545
+ var effectPulsate = $.effects.effect.pulsate = function( o, done ) {
11546
+ var elem = $( this ),
11547
+ mode = $.effects.setMode( elem, o.mode || "show" ),
11548
+ show = mode === "show",
11549
+ hide = mode === "hide",
11550
+ showhide = ( show || mode === "hide" ),
11551
+
11552
+ // showing or hiding leaves of the "last" animation
11553
+ anims = ( ( o.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),
11554
+ duration = o.duration / anims,
11555
+ animateTo = 0,
11556
+ queue = elem.queue(),
11557
+ queuelen = queue.length,
11558
+ i;
11559
+
11560
+ if ( show || !elem.is(":visible")) {
11561
+ elem.css( "opacity", 0 ).show();
11562
+ animateTo = 1;
11563
+ }
11564
+
11565
+ // anims - 1 opacity "toggles"
11566
+ for ( i = 1; i < anims; i++ ) {
11567
+ elem.animate({
11568
+ opacity: animateTo
11569
+ }, duration, o.easing );
11570
+ animateTo = 1 - animateTo;
11571
+ }
11572
+
11573
+ elem.animate({
11574
+ opacity: animateTo
11575
+ }, duration, o.easing);
11576
+
11577
+ elem.queue(function() {
11578
+ if ( hide ) {
11579
+ elem.hide();
11580
+ }
11581
+ done();
11582
+ });
11583
+
11584
+ // We just queued up "anims" animations, we need to put them next in the queue
11585
+ if ( queuelen > 1 ) {
11586
+ queue.splice.apply( queue,
11587
+ [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
11588
+ }
11589
+ elem.dequeue();
11590
+ };
11591
+
11592
+
11593
+ /*!
11594
+ * jQuery UI Effects Shake 1.11.4
11595
+ * http://jqueryui.com
11596
+ *
11597
+ * Copyright jQuery Foundation and other contributors
11598
+ * Released under the MIT license.
11599
+ * http://jquery.org/license
11600
+ *
11601
+ * http://api.jqueryui.com/shake-effect/
11602
+ */
11603
+
11604
+
11605
+ var effectShake = $.effects.effect.shake = function( o, done ) {
11606
+
11607
+ var el = $( this ),
11608
+ props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
11609
+ mode = $.effects.setMode( el, o.mode || "effect" ),
11610
+ direction = o.direction || "left",
11611
+ distance = o.distance || 20,
11612
+ times = o.times || 3,
11613
+ anims = times * 2 + 1,
11614
+ speed = Math.round( o.duration / anims ),
11615
+ ref = (direction === "up" || direction === "down") ? "top" : "left",
11616
+ positiveMotion = (direction === "up" || direction === "left"),
11617
+ animation = {},
11618
+ animation1 = {},
11619
+ animation2 = {},
11620
+ i,
11621
+
11622
+ // we will need to re-assemble the queue to stack our animations in place
11623
+ queue = el.queue(),
11624
+ queuelen = queue.length;
11625
+
11626
+ $.effects.save( el, props );
11627
+ el.show();
11628
+ $.effects.createWrapper( el );
11629
+
11630
+ // Animation
11631
+ animation[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance;
11632
+ animation1[ ref ] = ( positiveMotion ? "+=" : "-=" ) + distance * 2;
11633
+ animation2[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance * 2;
11634
+
11635
+ // Animate
11636
+ el.animate( animation, speed, o.easing );
11637
+
11638
+ // Shakes
11639
+ for ( i = 1; i < times; i++ ) {
11640
+ el.animate( animation1, speed, o.easing ).animate( animation2, speed, o.easing );
11641
+ }
11642
+ el
11643
+ .animate( animation1, speed, o.easing )
11644
+ .animate( animation, speed / 2, o.easing )
11645
+ .queue(function() {
11646
+ if ( mode === "hide" ) {
11647
+ el.hide();
11648
+ }
11649
+ $.effects.restore( el, props );
11650
+ $.effects.removeWrapper( el );
11651
+ done();
11652
+ });
11653
+
11654
+ // inject all the animations we just queued to be first in line (after "inprogress")
11655
+ if ( queuelen > 1) {
11656
+ queue.splice.apply( queue,
11657
+ [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
11658
+ }
11659
+ el.dequeue();
11660
+
11661
+ };
11662
+
11663
+
11664
+ /*!
11665
+ * jQuery UI Effects Slide 1.11.4
11666
+ * http://jqueryui.com
11667
+ *
11668
+ * Copyright jQuery Foundation and other contributors
11669
+ * Released under the MIT license.
11670
+ * http://jquery.org/license
11671
+ *
11672
+ * http://api.jqueryui.com/slide-effect/
11673
+ */
11674
+
11675
+
11676
+ var effectSlide = $.effects.effect.slide = function( o, done ) {
11677
+
11678
+ // Create element
11679
+ var el = $( this ),
11680
+ props = [ "position", "top", "bottom", "left", "right", "width", "height" ],
11681
+ mode = $.effects.setMode( el, o.mode || "show" ),
11682
+ show = mode === "show",
11683
+ direction = o.direction || "left",
11684
+ ref = (direction === "up" || direction === "down") ? "top" : "left",
11685
+ positiveMotion = (direction === "up" || direction === "left"),
11686
+ distance,
11687
+ animation = {};
11688
+
11689
+ // Adjust
11690
+ $.effects.save( el, props );
11691
+ el.show();
11692
+ distance = o.distance || el[ ref === "top" ? "outerHeight" : "outerWidth" ]( true );
11693
+
11694
+ $.effects.createWrapper( el ).css({
11695
+ overflow: "hidden"
11696
+ });
11697
+
11698
+ if ( show ) {
11699
+ el.css( ref, positiveMotion ? (isNaN(distance) ? "-" + distance : -distance) : distance );
11700
+ }
11701
+
11702
+ // Animation
11703
+ animation[ ref ] = ( show ?
11704
+ ( positiveMotion ? "+=" : "-=") :
11705
+ ( positiveMotion ? "-=" : "+=")) +
11706
+ distance;
11707
+
11708
+ // Animate
11709
+ el.animate( animation, {
11710
+ queue: false,
11711
+ duration: o.duration,
11712
+ easing: o.easing,
11713
+ complete: function() {
11714
+ if ( mode === "hide" ) {
11715
+ el.hide();
11716
+ }
11717
+ $.effects.restore( el, props );
11718
+ $.effects.removeWrapper( el );
11719
+ done();
11720
+ }
11721
+ });
11722
+ };
11723
+
11724
+
11725
+ /*!
11726
+ * jQuery UI Effects Transfer 1.11.4
11727
+ * http://jqueryui.com
11728
+ *
11729
+ * Copyright jQuery Foundation and other contributors
11730
+ * Released under the MIT license.
11731
+ * http://jquery.org/license
11732
+ *
11733
+ * http://api.jqueryui.com/transfer-effect/
11734
+ */
11735
+
11736
+
11737
+ var effectTransfer = $.effects.effect.transfer = function( o, done ) {
11738
+ var elem = $( this ),
11739
+ target = $( o.to ),
11740
+ targetFixed = target.css( "position" ) === "fixed",
11741
+ body = $("body"),
11742
+ fixTop = targetFixed ? body.scrollTop() : 0,
11743
+ fixLeft = targetFixed ? body.scrollLeft() : 0,
11744
+ endPosition = target.offset(),
11745
+ animation = {
11746
+ top: endPosition.top - fixTop,
11747
+ left: endPosition.left - fixLeft,
11748
+ height: target.innerHeight(),
11749
+ width: target.innerWidth()
11750
+ },
11751
+ startPosition = elem.offset(),
11752
+ transfer = $( "<div class='ui-effects-transfer'></div>" )
11753
+ .appendTo( document.body )
11754
+ .addClass( o.className )
11755
+ .css({
11756
+ top: startPosition.top - fixTop,
11757
+ left: startPosition.left - fixLeft,
11758
+ height: elem.innerHeight(),
11759
+ width: elem.innerWidth(),
11760
+ position: targetFixed ? "fixed" : "absolute"
11761
+ })
11762
+ .animate( animation, o.duration, o.easing, function() {
11763
+ transfer.remove();
11764
+ done();
11765
+ });
11766
+ };
11767
+
11768
+
11769
+ /*!
11770
+ * jQuery UI Progressbar 1.11.4
11771
+ * http://jqueryui.com
11772
+ *
11773
+ * Copyright jQuery Foundation and other contributors
11774
+ * Released under the MIT license.
11775
+ * http://jquery.org/license
11776
+ *
11777
+ * http://api.jqueryui.com/progressbar/
11778
+ */
11779
+
11780
+
11781
+ var progressbar = $.widget( "ui.progressbar", {
11782
+ version: "1.11.4",
11783
+ options: {
11784
+ max: 100,
11785
+ value: 0,
11786
+
11787
+ change: null,
11788
+ complete: null
11789
+ },
11790
+
11791
+ min: 0,
11792
+
11793
+ _create: function() {
11794
+ // Constrain initial value
11795
+ this.oldValue = this.options.value = this._constrainedValue();
11796
+
11797
+ this.element
11798
+ .addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
11799
+ .attr({
11800
+ // Only set static values, aria-valuenow and aria-valuemax are
11801
+ // set inside _refreshValue()
11802
+ role: "progressbar",
11803
+ "aria-valuemin": this.min
11804
+ });
11805
+
11806
+ this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>" )
11807
+ .appendTo( this.element );
11808
+
11809
+ this._refreshValue();
11810
+ },
11811
+
11812
+ _destroy: function() {
11813
+ this.element
11814
+ .removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
11815
+ .removeAttr( "role" )
11816
+ .removeAttr( "aria-valuemin" )
11817
+ .removeAttr( "aria-valuemax" )
11818
+ .removeAttr( "aria-valuenow" );
11819
+
11820
+ this.valueDiv.remove();
11821
+ },
11822
+
11823
+ value: function( newValue ) {
11824
+ if ( newValue === undefined ) {
11825
+ return this.options.value;
11826
+ }
11827
+
11828
+ this.options.value = this._constrainedValue( newValue );
11829
+ this._refreshValue();
11830
+ },
11831
+
11832
+ _constrainedValue: function( newValue ) {
11833
+ if ( newValue === undefined ) {
11834
+ newValue = this.options.value;
11835
+ }
11836
+
11837
+ this.indeterminate = newValue === false;
11838
+
11839
+ // sanitize value
11840
+ if ( typeof newValue !== "number" ) {
11841
+ newValue = 0;
11842
+ }
11843
+
11844
+ return this.indeterminate ? false :
11845
+ Math.min( this.options.max, Math.max( this.min, newValue ) );
11846
+ },
11847
+
11848
+ _setOptions: function( options ) {
11849
+ // Ensure "value" option is set after other values (like max)
11850
+ var value = options.value;
11851
+ delete options.value;
11852
+
11853
+ this._super( options );
11854
+
11855
+ this.options.value = this._constrainedValue( value );
11856
+ this._refreshValue();
11857
+ },
11858
+
11859
+ _setOption: function( key, value ) {
11860
+ if ( key === "max" ) {
11861
+ // Don't allow a max less than min
11862
+ value = Math.max( this.min, value );
11863
+ }
11864
+ if ( key === "disabled" ) {
11865
+ this.element
11866
+ .toggleClass( "ui-state-disabled", !!value )
11867
+ .attr( "aria-disabled", value );
11868
+ }
11869
+ this._super( key, value );
11870
+ },
11871
+
11872
+ _percentage: function() {
11873
+ return this.indeterminate ? 100 : 100 * ( this.options.value - this.min ) / ( this.options.max - this.min );
11874
+ },
11875
+
11876
+ _refreshValue: function() {
11877
+ var value = this.options.value,
11878
+ percentage = this._percentage();
11879
+
11880
+ this.valueDiv
11881
+ .toggle( this.indeterminate || value > this.min )
11882
+ .toggleClass( "ui-corner-right", value === this.options.max )
11883
+ .width( percentage.toFixed(0) + "%" );
11884
+
11885
+ this.element.toggleClass( "ui-progressbar-indeterminate", this.indeterminate );
11886
+
11887
+ if ( this.indeterminate ) {
11888
+ this.element.removeAttr( "aria-valuenow" );
11889
+ if ( !this.overlayDiv ) {
11890
+ this.overlayDiv = $( "<div class='ui-progressbar-overlay'></div>" ).appendTo( this.valueDiv );
11891
+ }
11892
+ } else {
11893
+ this.element.attr({
11894
+ "aria-valuemax": this.options.max,
11895
+ "aria-valuenow": value
11896
+ });
11897
+ if ( this.overlayDiv ) {
11898
+ this.overlayDiv.remove();
11899
+ this.overlayDiv = null;
11900
+ }
11901
+ }
11902
+
11903
+ if ( this.oldValue !== value ) {
11904
+ this.oldValue = value;
11905
+ this._trigger( "change" );
11906
+ }
11907
+ if ( value === this.options.max ) {
11908
+ this._trigger( "complete" );
11909
+ }
11910
+ }
11911
+ });
11912
+
11913
+
11914
+ /*!
11915
+ * jQuery UI Selectable 1.11.4
11916
+ * http://jqueryui.com
11917
+ *
11918
+ * Copyright jQuery Foundation and other contributors
11919
+ * Released under the MIT license.
11920
+ * http://jquery.org/license
11921
+ *
11922
+ * http://api.jqueryui.com/selectable/
11923
+ */
11924
+
11925
+
11926
+ var selectable = $.widget("ui.selectable", $.ui.mouse, {
11927
+ version: "1.11.4",
11928
+ options: {
11929
+ appendTo: "body",
11930
+ autoRefresh: true,
11931
+ distance: 0,
11932
+ filter: "*",
11933
+ tolerance: "touch",
11934
+
11935
+ // callbacks
11936
+ selected: null,
11937
+ selecting: null,
11938
+ start: null,
11939
+ stop: null,
11940
+ unselected: null,
11941
+ unselecting: null
11942
+ },
11943
+ _create: function() {
11944
+ var selectees,
11945
+ that = this;
11946
+
11947
+ this.element.addClass("ui-selectable");
11948
+
11949
+ this.dragged = false;
11950
+
11951
+ // cache selectee children based on filter
11952
+ this.refresh = function() {
11953
+ selectees = $(that.options.filter, that.element[0]);
11954
+ selectees.addClass("ui-selectee");
11955
+ selectees.each(function() {
11956
+ var $this = $(this),
11957
+ pos = $this.offset();
11958
+ $.data(this, "selectable-item", {
11959
+ element: this,
11960
+ $element: $this,
11961
+ left: pos.left,
11962
+ top: pos.top,
11963
+ right: pos.left + $this.outerWidth(),
11964
+ bottom: pos.top + $this.outerHeight(),
11965
+ startselected: false,
11966
+ selected: $this.hasClass("ui-selected"),
11967
+ selecting: $this.hasClass("ui-selecting"),
11968
+ unselecting: $this.hasClass("ui-unselecting")
11969
+ });
11970
+ });
11971
+ };
11972
+ this.refresh();
11973
+
11974
+ this.selectees = selectees.addClass("ui-selectee");
11975
+
11976
+ this._mouseInit();
11977
+
11978
+ this.helper = $("<div class='ui-selectable-helper'></div>");
11979
+ },
11980
+
11981
+ _destroy: function() {
11982
+ this.selectees
11983
+ .removeClass("ui-selectee")
11984
+ .removeData("selectable-item");
11985
+ this.element
11986
+ .removeClass("ui-selectable ui-selectable-disabled");
11987
+ this._mouseDestroy();
11988
+ },
11989
+
11990
+ _mouseStart: function(event) {
11991
+ var that = this,
11992
+ options = this.options;
11993
+
11994
+ this.opos = [ event.pageX, event.pageY ];
11995
+
11996
+ if (this.options.disabled) {
11997
+ return;
11998
+ }
11999
+
12000
+ this.selectees = $(options.filter, this.element[0]);
12001
+
12002
+ this._trigger("start", event);
12003
+
12004
+ $(options.appendTo).append(this.helper);
12005
+ // position helper (lasso)
12006
+ this.helper.css({
12007
+ "left": event.pageX,
12008
+ "top": event.pageY,
12009
+ "width": 0,
12010
+ "height": 0
12011
+ });
12012
+
12013
+ if (options.autoRefresh) {
12014
+ this.refresh();
12015
+ }
12016
+
12017
+ this.selectees.filter(".ui-selected").each(function() {
12018
+ var selectee = $.data(this, "selectable-item");
12019
+ selectee.startselected = true;
12020
+ if (!event.metaKey && !event.ctrlKey) {
12021
+ selectee.$element.removeClass("ui-selected");
12022
+ selectee.selected = false;
12023
+ selectee.$element.addClass("ui-unselecting");
12024
+ selectee.unselecting = true;
12025
+ // selectable UNSELECTING callback
12026
+ that._trigger("unselecting", event, {
12027
+ unselecting: selectee.element
12028
+ });
12029
+ }
12030
+ });
12031
+
12032
+ $(event.target).parents().addBack().each(function() {
12033
+ var doSelect,
12034
+ selectee = $.data(this, "selectable-item");
12035
+ if (selectee) {
12036
+ doSelect = (!event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass("ui-selected");
12037
+ selectee.$element
12038
+ .removeClass(doSelect ? "ui-unselecting" : "ui-selected")
12039
+ .addClass(doSelect ? "ui-selecting" : "ui-unselecting");
12040
+ selectee.unselecting = !doSelect;
12041
+ selectee.selecting = doSelect;
12042
+ selectee.selected = doSelect;
12043
+ // selectable (UN)SELECTING callback
12044
+ if (doSelect) {
12045
+ that._trigger("selecting", event, {
12046
+ selecting: selectee.element
12047
+ });
12048
+ } else {
12049
+ that._trigger("unselecting", event, {
12050
+ unselecting: selectee.element
12051
+ });
12052
+ }
12053
+ return false;
12054
+ }
12055
+ });
12056
+
12057
+ },
12058
+
12059
+ _mouseDrag: function(event) {
12060
+
12061
+ this.dragged = true;
12062
+
12063
+ if (this.options.disabled) {
12064
+ return;
12065
+ }
12066
+
12067
+ var tmp,
12068
+ that = this,
12069
+ options = this.options,
12070
+ x1 = this.opos[0],
12071
+ y1 = this.opos[1],
12072
+ x2 = event.pageX,
12073
+ y2 = event.pageY;
12074
+
12075
+ if (x1 > x2) { tmp = x2; x2 = x1; x1 = tmp; }
12076
+ if (y1 > y2) { tmp = y2; y2 = y1; y1 = tmp; }
12077
+ this.helper.css({ left: x1, top: y1, width: x2 - x1, height: y2 - y1 });
12078
+
12079
+ this.selectees.each(function() {
12080
+ var selectee = $.data(this, "selectable-item"),
12081
+ hit = false;
12082
+
12083
+ //prevent helper from being selected if appendTo: selectable
12084
+ if (!selectee || selectee.element === that.element[0]) {
12085
+ return;
12086
+ }
12087
+
12088
+ if (options.tolerance === "touch") {
12089
+ hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
12090
+ } else if (options.tolerance === "fit") {
12091
+ hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
12092
+ }
12093
+
12094
+ if (hit) {
12095
+ // SELECT
12096
+ if (selectee.selected) {
12097
+ selectee.$element.removeClass("ui-selected");
12098
+ selectee.selected = false;
12099
+ }
12100
+ if (selectee.unselecting) {
12101
+ selectee.$element.removeClass("ui-unselecting");
12102
+ selectee.unselecting = false;
12103
+ }
12104
+ if (!selectee.selecting) {
12105
+ selectee.$element.addClass("ui-selecting");
12106
+ selectee.selecting = true;
12107
+ // selectable SELECTING callback
12108
+ that._trigger("selecting", event, {
12109
+ selecting: selectee.element
12110
+ });
12111
+ }
12112
+ } else {
12113
+ // UNSELECT
12114
+ if (selectee.selecting) {
12115
+ if ((event.metaKey || event.ctrlKey) && selectee.startselected) {
12116
+ selectee.$element.removeClass("ui-selecting");
12117
+ selectee.selecting = false;
12118
+ selectee.$element.addClass("ui-selected");
12119
+ selectee.selected = true;
12120
+ } else {
12121
+ selectee.$element.removeClass("ui-selecting");
12122
+ selectee.selecting = false;
12123
+ if (selectee.startselected) {
12124
+ selectee.$element.addClass("ui-unselecting");
12125
+ selectee.unselecting = true;
12126
+ }
12127
+ // selectable UNSELECTING callback
12128
+ that._trigger("unselecting", event, {
12129
+ unselecting: selectee.element
12130
+ });
12131
+ }
12132
+ }
12133
+ if (selectee.selected) {
12134
+ if (!event.metaKey && !event.ctrlKey && !selectee.startselected) {
12135
+ selectee.$element.removeClass("ui-selected");
12136
+ selectee.selected = false;
12137
+
12138
+ selectee.$element.addClass("ui-unselecting");
12139
+ selectee.unselecting = true;
12140
+ // selectable UNSELECTING callback
12141
+ that._trigger("unselecting", event, {
12142
+ unselecting: selectee.element
12143
+ });
12144
+ }
12145
+ }
12146
+ }
12147
+ });
12148
+
12149
+ return false;
12150
+ },
12151
+
12152
+ _mouseStop: function(event) {
12153
+ var that = this;
12154
+
12155
+ this.dragged = false;
12156
+
12157
+ $(".ui-unselecting", this.element[0]).each(function() {
12158
+ var selectee = $.data(this, "selectable-item");
12159
+ selectee.$element.removeClass("ui-unselecting");
12160
+ selectee.unselecting = false;
12161
+ selectee.startselected = false;
12162
+ that._trigger("unselected", event, {
12163
+ unselected: selectee.element
12164
+ });
12165
+ });
12166
+ $(".ui-selecting", this.element[0]).each(function() {
12167
+ var selectee = $.data(this, "selectable-item");
12168
+ selectee.$element.removeClass("ui-selecting").addClass("ui-selected");
12169
+ selectee.selecting = false;
12170
+ selectee.selected = true;
12171
+ selectee.startselected = true;
12172
+ that._trigger("selected", event, {
12173
+ selected: selectee.element
12174
+ });
12175
+ });
12176
+ this._trigger("stop", event);
12177
+
12178
+ this.helper.remove();
12179
+
12180
+ return false;
12181
+ }
12182
+
12183
+ });
12184
+
12185
+
12186
+ /*!
12187
+ * jQuery UI Selectmenu 1.11.4
12188
+ * http://jqueryui.com
12189
+ *
12190
+ * Copyright jQuery Foundation and other contributors
12191
+ * Released under the MIT license.
12192
+ * http://jquery.org/license
12193
+ *
12194
+ * http://api.jqueryui.com/selectmenu
12195
+ */
12196
+
12197
+
12198
+ var selectmenu = $.widget( "ui.selectmenu", {
12199
+ version: "1.11.4",
12200
+ defaultElement: "<select>",
12201
+ options: {
12202
+ appendTo: null,
12203
+ disabled: null,
12204
+ icons: {
12205
+ button: "ui-icon-triangle-1-s"
12206
+ },
12207
+ position: {
12208
+ my: "left top",
12209
+ at: "left bottom",
12210
+ collision: "none"
12211
+ },
12212
+ width: null,
12213
+
12214
+ // callbacks
12215
+ change: null,
12216
+ close: null,
12217
+ focus: null,
12218
+ open: null,
12219
+ select: null
12220
+ },
12221
+
12222
+ _create: function() {
12223
+ var selectmenuId = this.element.uniqueId().attr( "id" );
12224
+ this.ids = {
12225
+ element: selectmenuId,
12226
+ button: selectmenuId + "-button",
12227
+ menu: selectmenuId + "-menu"
12228
+ };
12229
+
12230
+ this._drawButton();
12231
+ this._drawMenu();
12232
+
12233
+ if ( this.options.disabled ) {
12234
+ this.disable();
12235
+ }
12236
+ },
12237
+
12238
+ _drawButton: function() {
12239
+ var that = this;
12240
+
12241
+ // Associate existing label with the new button
12242
+ this.label = $( "label[for='" + this.ids.element + "']" ).attr( "for", this.ids.button );
12243
+ this._on( this.label, {
12244
+ click: function( event ) {
12245
+ this.button.focus();
12246
+ event.preventDefault();
12247
+ }
12248
+ });
12249
+
12250
+ // Hide original select element
12251
+ this.element.hide();
12252
+
12253
+ // Create button
12254
+ this.button = $( "<span>", {
12255
+ "class": "ui-selectmenu-button ui-widget ui-state-default ui-corner-all",
12256
+ tabindex: this.options.disabled ? -1 : 0,
12257
+ id: this.ids.button,
12258
+ role: "combobox",
12259
+ "aria-expanded": "false",
12260
+ "aria-autocomplete": "list",
12261
+ "aria-owns": this.ids.menu,
12262
+ "aria-haspopup": "true"
12263
+ })
12264
+ .insertAfter( this.element );
12265
+
12266
+ $( "<span>", {
12267
+ "class": "ui-icon " + this.options.icons.button
12268
+ })
12269
+ .prependTo( this.button );
12270
+
12271
+ this.buttonText = $( "<span>", {
12272
+ "class": "ui-selectmenu-text"
12273
+ })
12274
+ .appendTo( this.button );
12275
+
12276
+ this._setText( this.buttonText, this.element.find( "option:selected" ).text() );
12277
+ this._resizeButton();
12278
+
12279
+ this._on( this.button, this._buttonEvents );
12280
+ this.button.one( "focusin", function() {
12281
+
12282
+ // Delay rendering the menu items until the button receives focus.
12283
+ // The menu may have already been rendered via a programmatic open.
12284
+ if ( !that.menuItems ) {
12285
+ that._refreshMenu();
12286
+ }
12287
+ });
12288
+ this._hoverable( this.button );
12289
+ this._focusable( this.button );
12290
+ },
12291
+
12292
+ _drawMenu: function() {
12293
+ var that = this;
12294
+
12295
+ // Create menu
12296
+ this.menu = $( "<ul>", {
12297
+ "aria-hidden": "true",
12298
+ "aria-labelledby": this.ids.button,
12299
+ id: this.ids.menu
12300
+ });
12301
+
12302
+ // Wrap menu
12303
+ this.menuWrap = $( "<div>", {
12304
+ "class": "ui-selectmenu-menu ui-front"
12305
+ })
12306
+ .append( this.menu )
12307
+ .appendTo( this._appendTo() );
12308
+
12309
+ // Initialize menu widget
12310
+ this.menuInstance = this.menu
12311
+ .menu({
12312
+ role: "listbox",
12313
+ select: function( event, ui ) {
12314
+ event.preventDefault();
12315
+
12316
+ // support: IE8
12317
+ // If the item was selected via a click, the text selection
12318
+ // will be destroyed in IE
12319
+ that._setSelection();
12320
+
12321
+ that._select( ui.item.data( "ui-selectmenu-item" ), event );
12322
+ },
12323
+ focus: function( event, ui ) {
12324
+ var item = ui.item.data( "ui-selectmenu-item" );
12325
+
12326
+ // Prevent inital focus from firing and check if its a newly focused item
12327
+ if ( that.focusIndex != null && item.index !== that.focusIndex ) {
12328
+ that._trigger( "focus", event, { item: item } );
12329
+ if ( !that.isOpen ) {
12330
+ that._select( item, event );
12331
+ }
12332
+ }
12333
+ that.focusIndex = item.index;
12334
+
12335
+ that.button.attr( "aria-activedescendant",
12336
+ that.menuItems.eq( item.index ).attr( "id" ) );
12337
+ }
12338
+ })
12339
+ .menu( "instance" );
12340
+
12341
+ // Adjust menu styles to dropdown
12342
+ this.menu
12343
+ .addClass( "ui-corner-bottom" )
12344
+ .removeClass( "ui-corner-all" );
12345
+
12346
+ // Don't close the menu on mouseleave
12347
+ this.menuInstance._off( this.menu, "mouseleave" );
12348
+
12349
+ // Cancel the menu's collapseAll on document click
12350
+ this.menuInstance._closeOnDocumentClick = function() {
12351
+ return false;
12352
+ };
12353
+
12354
+ // Selects often contain empty items, but never contain dividers
12355
+ this.menuInstance._isDivider = function() {
12356
+ return false;
12357
+ };
12358
+ },
12359
+
12360
+ refresh: function() {
12361
+ this._refreshMenu();
12362
+ this._setText( this.buttonText, this._getSelectedItem().text() );
12363
+ if ( !this.options.width ) {
12364
+ this._resizeButton();
12365
+ }
12366
+ },
12367
+
12368
+ _refreshMenu: function() {
12369
+ this.menu.empty();
12370
+
12371
+ var item,
12372
+ options = this.element.find( "option" );
12373
+
12374
+ if ( !options.length ) {
12375
+ return;
12376
+ }
12377
+
12378
+ this._parseOptions( options );
12379
+ this._renderMenu( this.menu, this.items );
12380
+
12381
+ this.menuInstance.refresh();
12382
+ this.menuItems = this.menu.find( "li" ).not( ".ui-selectmenu-optgroup" );
12383
+
12384
+ item = this._getSelectedItem();
12385
+
12386
+ // Update the menu to have the correct item focused
12387
+ this.menuInstance.focus( null, item );
12388
+ this._setAria( item.data( "ui-selectmenu-item" ) );
12389
+
12390
+ // Set disabled state
12391
+ this._setOption( "disabled", this.element.prop( "disabled" ) );
12392
+ },
12393
+
12394
+ open: function( event ) {
12395
+ if ( this.options.disabled ) {
12396
+ return;
12397
+ }
12398
+
12399
+ // If this is the first time the menu is being opened, render the items
12400
+ if ( !this.menuItems ) {
12401
+ this._refreshMenu();
12402
+ } else {
12403
+
12404
+ // Menu clears focus on close, reset focus to selected item
12405
+ this.menu.find( ".ui-state-focus" ).removeClass( "ui-state-focus" );
12406
+ this.menuInstance.focus( null, this._getSelectedItem() );
12407
+ }
12408
+
12409
+ this.isOpen = true;
12410
+ this._toggleAttr();
12411
+ this._resizeMenu();
12412
+ this._position();
12413
+
12414
+ this._on( this.document, this._documentClick );
12415
+
12416
+ this._trigger( "open", event );
12417
+ },
12418
+
12419
+ _position: function() {
12420
+ this.menuWrap.position( $.extend( { of: this.button }, this.options.position ) );
12421
+ },
12422
+
12423
+ close: function( event ) {
12424
+ if ( !this.isOpen ) {
12425
+ return;
12426
+ }
12427
+
12428
+ this.isOpen = false;
12429
+ this._toggleAttr();
12430
+
12431
+ this.range = null;
12432
+ this._off( this.document );
12433
+
12434
+ this._trigger( "close", event );
12435
+ },
12436
+
12437
+ widget: function() {
12438
+ return this.button;
12439
+ },
12440
+
12441
+ menuWidget: function() {
12442
+ return this.menu;
12443
+ },
12444
+
12445
+ _renderMenu: function( ul, items ) {
12446
+ var that = this,
12447
+ currentOptgroup = "";
12448
+
12449
+ $.each( items, function( index, item ) {
12450
+ if ( item.optgroup !== currentOptgroup ) {
12451
+ $( "<li>", {
12452
+ "class": "ui-selectmenu-optgroup ui-menu-divider" +
12453
+ ( item.element.parent( "optgroup" ).prop( "disabled" ) ?
12454
+ " ui-state-disabled" :
12455
+ "" ),
12456
+ text: item.optgroup
12457
+ })
12458
+ .appendTo( ul );
12459
+
12460
+ currentOptgroup = item.optgroup;
12461
+ }
12462
+
12463
+ that._renderItemData( ul, item );
12464
+ });
12465
+ },
12466
+
12467
+ _renderItemData: function( ul, item ) {
12468
+ return this._renderItem( ul, item ).data( "ui-selectmenu-item", item );
12469
+ },
12470
+
12471
+ _renderItem: function( ul, item ) {
12472
+ var li = $( "<li>" );
12473
+
12474
+ if ( item.disabled ) {
12475
+ li.addClass( "ui-state-disabled" );
12476
+ }
12477
+ this._setText( li, item.label );
12478
+
12479
+ return li.appendTo( ul );
12480
+ },
12481
+
12482
+ _setText: function( element, value ) {
12483
+ if ( value ) {
12484
+ element.text( value );
12485
+ } else {
12486
+ element.html( "&#160;" );
12487
+ }
12488
+ },
12489
+
12490
+ _move: function( direction, event ) {
12491
+ var item, next,
12492
+ filter = ".ui-menu-item";
12493
+
12494
+ if ( this.isOpen ) {
12495
+ item = this.menuItems.eq( this.focusIndex );
12496
+ } else {
12497
+ item = this.menuItems.eq( this.element[ 0 ].selectedIndex );
12498
+ filter += ":not(.ui-state-disabled)";
12499
+ }
12500
+
12501
+ if ( direction === "first" || direction === "last" ) {
12502
+ next = item[ direction === "first" ? "prevAll" : "nextAll" ]( filter ).eq( -1 );
12503
+ } else {
12504
+ next = item[ direction + "All" ]( filter ).eq( 0 );
12505
+ }
12506
+
12507
+ if ( next.length ) {
12508
+ this.menuInstance.focus( event, next );
12509
+ }
12510
+ },
12511
+
12512
+ _getSelectedItem: function() {
12513
+ return this.menuItems.eq( this.element[ 0 ].selectedIndex );
12514
+ },
12515
+
12516
+ _toggle: function( event ) {
12517
+ this[ this.isOpen ? "close" : "open" ]( event );
12518
+ },
12519
+
12520
+ _setSelection: function() {
12521
+ var selection;
12522
+
12523
+ if ( !this.range ) {
12524
+ return;
12525
+ }
12526
+
12527
+ if ( window.getSelection ) {
12528
+ selection = window.getSelection();
12529
+ selection.removeAllRanges();
12530
+ selection.addRange( this.range );
12531
+
12532
+ // support: IE8
12533
+ } else {
12534
+ this.range.select();
12535
+ }
12536
+
12537
+ // support: IE
12538
+ // Setting the text selection kills the button focus in IE, but
12539
+ // restoring the focus doesn't kill the selection.
12540
+ this.button.focus();
12541
+ },
12542
+
12543
+ _documentClick: {
12544
+ mousedown: function( event ) {
12545
+ if ( !this.isOpen ) {
12546
+ return;
12547
+ }
12548
+
12549
+ if ( !$( event.target ).closest( ".ui-selectmenu-menu, #" + this.ids.button ).length ) {
12550
+ this.close( event );
12551
+ }
12552
+ }
12553
+ },
12554
+
12555
+ _buttonEvents: {
12556
+
12557
+ // Prevent text selection from being reset when interacting with the selectmenu (#10144)
12558
+ mousedown: function() {
12559
+ var selection;
12560
+
12561
+ if ( window.getSelection ) {
12562
+ selection = window.getSelection();
12563
+ if ( selection.rangeCount ) {
12564
+ this.range = selection.getRangeAt( 0 );
12565
+ }
12566
+
12567
+ // support: IE8
12568
+ } else {
12569
+ this.range = document.selection.createRange();
12570
+ }
12571
+ },
12572
+
12573
+ click: function( event ) {
12574
+ this._setSelection();
12575
+ this._toggle( event );
12576
+ },
12577
+
12578
+ keydown: function( event ) {
12579
+ var preventDefault = true;
12580
+ switch ( event.keyCode ) {
12581
+ case $.ui.keyCode.TAB:
12582
+ case $.ui.keyCode.ESCAPE:
12583
+ this.close( event );
12584
+ preventDefault = false;
12585
+ break;
12586
+ case $.ui.keyCode.ENTER:
12587
+ if ( this.isOpen ) {
12588
+ this._selectFocusedItem( event );
12589
+ }
12590
+ break;
12591
+ case $.ui.keyCode.UP:
12592
+ if ( event.altKey ) {
12593
+ this._toggle( event );
12594
+ } else {
12595
+ this._move( "prev", event );
12596
+ }
12597
+ break;
12598
+ case $.ui.keyCode.DOWN:
12599
+ if ( event.altKey ) {
12600
+ this._toggle( event );
12601
+ } else {
12602
+ this._move( "next", event );
12603
+ }
12604
+ break;
12605
+ case $.ui.keyCode.SPACE:
12606
+ if ( this.isOpen ) {
12607
+ this._selectFocusedItem( event );
12608
+ } else {
12609
+ this._toggle( event );
12610
+ }
12611
+ break;
12612
+ case $.ui.keyCode.LEFT:
12613
+ this._move( "prev", event );
12614
+ break;
12615
+ case $.ui.keyCode.RIGHT:
12616
+ this._move( "next", event );
12617
+ break;
12618
+ case $.ui.keyCode.HOME:
12619
+ case $.ui.keyCode.PAGE_UP:
12620
+ this._move( "first", event );
12621
+ break;
12622
+ case $.ui.keyCode.END:
12623
+ case $.ui.keyCode.PAGE_DOWN:
12624
+ this._move( "last", event );
12625
+ break;
12626
+ default:
12627
+ this.menu.trigger( event );
12628
+ preventDefault = false;
12629
+ }
12630
+
12631
+ if ( preventDefault ) {
12632
+ event.preventDefault();
12633
+ }
12634
+ }
12635
+ },
12636
+
12637
+ _selectFocusedItem: function( event ) {
12638
+ var item = this.menuItems.eq( this.focusIndex );
12639
+ if ( !item.hasClass( "ui-state-disabled" ) ) {
12640
+ this._select( item.data( "ui-selectmenu-item" ), event );
12641
+ }
12642
+ },
12643
+
12644
+ _select: function( item, event ) {
12645
+ var oldIndex = this.element[ 0 ].selectedIndex;
12646
+
12647
+ // Change native select element
12648
+ this.element[ 0 ].selectedIndex = item.index;
12649
+ this._setText( this.buttonText, item.label );
12650
+ this._setAria( item );
12651
+ this._trigger( "select", event, { item: item } );
12652
+
12653
+ if ( item.index !== oldIndex ) {
12654
+ this._trigger( "change", event, { item: item } );
12655
+ }
12656
+
12657
+ this.close( event );
12658
+ },
12659
+
12660
+ _setAria: function( item ) {
12661
+ var id = this.menuItems.eq( item.index ).attr( "id" );
12662
+
12663
+ this.button.attr({
12664
+ "aria-labelledby": id,
12665
+ "aria-activedescendant": id
12666
+ });
12667
+ this.menu.attr( "aria-activedescendant", id );
12668
+ },
12669
+
12670
+ _setOption: function( key, value ) {
12671
+ if ( key === "icons" ) {
12672
+ this.button.find( "span.ui-icon" )
12673
+ .removeClass( this.options.icons.button )
12674
+ .addClass( value.button );
12675
+ }
12676
+
12677
+ this._super( key, value );
12678
+
12679
+ if ( key === "appendTo" ) {
12680
+ this.menuWrap.appendTo( this._appendTo() );
12681
+ }
12682
+
12683
+ if ( key === "disabled" ) {
12684
+ this.menuInstance.option( "disabled", value );
12685
+ this.button
12686
+ .toggleClass( "ui-state-disabled", value )
12687
+ .attr( "aria-disabled", value );
12688
+
12689
+ this.element.prop( "disabled", value );
12690
+ if ( value ) {
12691
+ this.button.attr( "tabindex", -1 );
12692
+ this.close();
12693
+ } else {
12694
+ this.button.attr( "tabindex", 0 );
12695
+ }
12696
+ }
12697
+
12698
+ if ( key === "width" ) {
12699
+ this._resizeButton();
12700
+ }
12701
+ },
12702
+
12703
+ _appendTo: function() {
12704
+ var element = this.options.appendTo;
12705
+
12706
+ if ( element ) {
12707
+ element = element.jquery || element.nodeType ?
12708
+ $( element ) :
12709
+ this.document.find( element ).eq( 0 );
12710
+ }
12711
+
12712
+ if ( !element || !element[ 0 ] ) {
12713
+ element = this.element.closest( ".ui-front" );
12714
+ }
12715
+
12716
+ if ( !element.length ) {
12717
+ element = this.document[ 0 ].body;
12718
+ }
12719
+
12720
+ return element;
12721
+ },
12722
+
12723
+ _toggleAttr: function() {
12724
+ this.button
12725
+ .toggleClass( "ui-corner-top", this.isOpen )
12726
+ .toggleClass( "ui-corner-all", !this.isOpen )
12727
+ .attr( "aria-expanded", this.isOpen );
12728
+ this.menuWrap.toggleClass( "ui-selectmenu-open", this.isOpen );
12729
+ this.menu.attr( "aria-hidden", !this.isOpen );
12730
+ },
12731
+
12732
+ _resizeButton: function() {
12733
+ var width = this.options.width;
12734
+
12735
+ if ( !width ) {
12736
+ width = this.element.show().outerWidth();
12737
+ this.element.hide();
12738
+ }
12739
+
12740
+ this.button.outerWidth( width );
12741
+ },
12742
+
12743
+ _resizeMenu: function() {
12744
+ this.menu.outerWidth( Math.max(
12745
+ this.button.outerWidth(),
12746
+
12747
+ // support: IE10
12748
+ // IE10 wraps long text (possibly a rounding bug)
12749
+ // so we add 1px to avoid the wrapping
12750
+ this.menu.width( "" ).outerWidth() + 1
12751
+ ) );
12752
+ },
12753
+
12754
+ _getCreateOptions: function() {
12755
+ return { disabled: this.element.prop( "disabled" ) };
12756
+ },
12757
+
12758
+ _parseOptions: function( options ) {
12759
+ var data = [];
12760
+ options.each(function( index, item ) {
12761
+ var option = $( item ),
12762
+ optgroup = option.parent( "optgroup" );
12763
+ data.push({
12764
+ element: option,
12765
+ index: index,
12766
+ value: option.val(),
12767
+ label: option.text(),
12768
+ optgroup: optgroup.attr( "label" ) || "",
12769
+ disabled: optgroup.prop( "disabled" ) || option.prop( "disabled" )
12770
+ });
12771
+ });
12772
+ this.items = data;
12773
+ },
12774
+
12775
+ _destroy: function() {
12776
+ this.menuWrap.remove();
12777
+ this.button.remove();
12778
+ this.element.show();
12779
+ this.element.removeUniqueId();
12780
+ this.label.attr( "for", this.ids.element );
12781
+ }
12782
+ });
12783
+
12784
+
12785
+ /*!
12786
+ * jQuery UI Slider 1.11.4
12787
+ * http://jqueryui.com
12788
+ *
12789
+ * Copyright jQuery Foundation and other contributors
12790
+ * Released under the MIT license.
12791
+ * http://jquery.org/license
12792
+ *
12793
+ * http://api.jqueryui.com/slider/
12794
+ */
12795
+
12796
+
12797
+ var slider = $.widget( "ui.slider", $.ui.mouse, {
12798
+ version: "1.11.4",
12799
+ widgetEventPrefix: "slide",
12800
+
12801
+ options: {
12802
+ animate: false,
12803
+ distance: 0,
12804
+ max: 100,
12805
+ min: 0,
12806
+ orientation: "horizontal",
12807
+ range: false,
12808
+ step: 1,
12809
+ value: 0,
12810
+ values: null,
12811
+
12812
+ // callbacks
12813
+ change: null,
12814
+ slide: null,
12815
+ start: null,
12816
+ stop: null
12817
+ },
12818
+
12819
+ // number of pages in a slider
12820
+ // (how many times can you page up/down to go through the whole range)
12821
+ numPages: 5,
12822
+
12823
+ _create: function() {
12824
+ this._keySliding = false;
12825
+ this._mouseSliding = false;
12826
+ this._animateOff = true;
12827
+ this._handleIndex = null;
12828
+ this._detectOrientation();
12829
+ this._mouseInit();
12830
+ this._calculateNewMax();
12831
+
12832
+ this.element
12833
+ .addClass( "ui-slider" +
12834
+ " ui-slider-" + this.orientation +
12835
+ " ui-widget" +
12836
+ " ui-widget-content" +
12837
+ " ui-corner-all");
12838
+
12839
+ this._refresh();
12840
+ this._setOption( "disabled", this.options.disabled );
12841
+
12842
+ this._animateOff = false;
12843
+ },
12844
+
12845
+ _refresh: function() {
12846
+ this._createRange();
12847
+ this._createHandles();
12848
+ this._setupEvents();
12849
+ this._refreshValue();
12850
+ },
12851
+
12852
+ _createHandles: function() {
12853
+ var i, handleCount,
12854
+ options = this.options,
12855
+ existingHandles = this.element.find( ".ui-slider-handle" ).addClass( "ui-state-default ui-corner-all" ),
12856
+ handle = "<span class='ui-slider-handle ui-state-default ui-corner-all' tabindex='0'></span>",
12857
+ handles = [];
12858
+
12859
+ handleCount = ( options.values && options.values.length ) || 1;
12860
+
12861
+ if ( existingHandles.length > handleCount ) {
12862
+ existingHandles.slice( handleCount ).remove();
12863
+ existingHandles = existingHandles.slice( 0, handleCount );
12864
+ }
12865
+
12866
+ for ( i = existingHandles.length; i < handleCount; i++ ) {
12867
+ handles.push( handle );
12868
+ }
12869
+
12870
+ this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( this.element ) );
12871
+
12872
+ this.handle = this.handles.eq( 0 );
12873
+
12874
+ this.handles.each(function( i ) {
12875
+ $( this ).data( "ui-slider-handle-index", i );
12876
+ });
12877
+ },
12878
+
12879
+ _createRange: function() {
12880
+ var options = this.options,
12881
+ classes = "";
12882
+
12883
+ if ( options.range ) {
12884
+ if ( options.range === true ) {
12885
+ if ( !options.values ) {
12886
+ options.values = [ this._valueMin(), this._valueMin() ];
12887
+ } else if ( options.values.length && options.values.length !== 2 ) {
12888
+ options.values = [ options.values[0], options.values[0] ];
12889
+ } else if ( $.isArray( options.values ) ) {
12890
+ options.values = options.values.slice(0);
12891
+ }
12892
+ }
12893
+
12894
+ if ( !this.range || !this.range.length ) {
12895
+ this.range = $( "<div></div>" )
12896
+ .appendTo( this.element );
12897
+
12898
+ classes = "ui-slider-range" +
12899
+ // note: this isn't the most fittingly semantic framework class for this element,
12900
+ // but worked best visually with a variety of themes
12901
+ " ui-widget-header ui-corner-all";
12902
+ } else {
12903
+ this.range.removeClass( "ui-slider-range-min ui-slider-range-max" )
12904
+ // Handle range switching from true to min/max
12905
+ .css({
12906
+ "left": "",
12907
+ "bottom": ""
12908
+ });
12909
+ }
12910
+
12911
+ this.range.addClass( classes +
12912
+ ( ( options.range === "min" || options.range === "max" ) ? " ui-slider-range-" + options.range : "" ) );
12913
+ } else {
12914
+ if ( this.range ) {
12915
+ this.range.remove();
12916
+ }
12917
+ this.range = null;
12918
+ }
12919
+ },
12920
+
12921
+ _setupEvents: function() {
12922
+ this._off( this.handles );
12923
+ this._on( this.handles, this._handleEvents );
12924
+ this._hoverable( this.handles );
12925
+ this._focusable( this.handles );
12926
+ },
12927
+
12928
+ _destroy: function() {
12929
+ this.handles.remove();
12930
+ if ( this.range ) {
12931
+ this.range.remove();
12932
+ }
12933
+
12934
+ this.element
12935
+ .removeClass( "ui-slider" +
12936
+ " ui-slider-horizontal" +
12937
+ " ui-slider-vertical" +
12938
+ " ui-widget" +
12939
+ " ui-widget-content" +
12940
+ " ui-corner-all" );
12941
+
12942
+ this._mouseDestroy();
12943
+ },
12944
+
12945
+ _mouseCapture: function( event ) {
12946
+ var position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle,
12947
+ that = this,
12948
+ o = this.options;
12949
+
12950
+ if ( o.disabled ) {
12951
+ return false;
12952
+ }
12953
+
12954
+ this.elementSize = {
12955
+ width: this.element.outerWidth(),
12956
+ height: this.element.outerHeight()
12957
+ };
12958
+ this.elementOffset = this.element.offset();
12959
+
12960
+ position = { x: event.pageX, y: event.pageY };
12961
+ normValue = this._normValueFromMouse( position );
12962
+ distance = this._valueMax() - this._valueMin() + 1;
12963
+ this.handles.each(function( i ) {
12964
+ var thisDistance = Math.abs( normValue - that.values(i) );
12965
+ if (( distance > thisDistance ) ||
12966
+ ( distance === thisDistance &&
12967
+ (i === that._lastChangedValue || that.values(i) === o.min ))) {
12968
+ distance = thisDistance;
12969
+ closestHandle = $( this );
12970
+ index = i;
12971
+ }
12972
+ });
12973
+
12974
+ allowed = this._start( event, index );
12975
+ if ( allowed === false ) {
12976
+ return false;
12977
+ }
12978
+ this._mouseSliding = true;
12979
+
12980
+ this._handleIndex = index;
12981
+
12982
+ closestHandle
12983
+ .addClass( "ui-state-active" )
12984
+ .focus();
12985
+
12986
+ offset = closestHandle.offset();
12987
+ mouseOverHandle = !$( event.target ).parents().addBack().is( ".ui-slider-handle" );
12988
+ this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
12989
+ left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
12990
+ top: event.pageY - offset.top -
12991
+ ( closestHandle.height() / 2 ) -
12992
+ ( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) -
12993
+ ( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) +
12994
+ ( parseInt( closestHandle.css("marginTop"), 10 ) || 0)
12995
+ };
12996
+
12997
+ if ( !this.handles.hasClass( "ui-state-hover" ) ) {
12998
+ this._slide( event, index, normValue );
12999
+ }
13000
+ this._animateOff = true;
13001
+ return true;
13002
+ },
13003
+
13004
+ _mouseStart: function() {
13005
+ return true;
13006
+ },
13007
+
13008
+ _mouseDrag: function( event ) {
13009
+ var position = { x: event.pageX, y: event.pageY },
13010
+ normValue = this._normValueFromMouse( position );
13011
+
13012
+ this._slide( event, this._handleIndex, normValue );
13013
+
13014
+ return false;
13015
+ },
13016
+
13017
+ _mouseStop: function( event ) {
13018
+ this.handles.removeClass( "ui-state-active" );
13019
+ this._mouseSliding = false;
13020
+
13021
+ this._stop( event, this._handleIndex );
13022
+ this._change( event, this._handleIndex );
13023
+
13024
+ this._handleIndex = null;
13025
+ this._clickOffset = null;
13026
+ this._animateOff = false;
13027
+
13028
+ return false;
13029
+ },
13030
+
13031
+ _detectOrientation: function() {
13032
+ this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
13033
+ },
13034
+
13035
+ _normValueFromMouse: function( position ) {
13036
+ var pixelTotal,
13037
+ pixelMouse,
13038
+ percentMouse,
13039
+ valueTotal,
13040
+ valueMouse;
13041
+
13042
+ if ( this.orientation === "horizontal" ) {
13043
+ pixelTotal = this.elementSize.width;
13044
+ pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 );
13045
+ } else {
13046
+ pixelTotal = this.elementSize.height;
13047
+ pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 );
13048
+ }
13049
+
13050
+ percentMouse = ( pixelMouse / pixelTotal );
13051
+ if ( percentMouse > 1 ) {
13052
+ percentMouse = 1;
13053
+ }
13054
+ if ( percentMouse < 0 ) {
13055
+ percentMouse = 0;
13056
+ }
13057
+ if ( this.orientation === "vertical" ) {
13058
+ percentMouse = 1 - percentMouse;
13059
+ }
13060
+
13061
+ valueTotal = this._valueMax() - this._valueMin();
13062
+ valueMouse = this._valueMin() + percentMouse * valueTotal;
13063
+
13064
+ return this._trimAlignValue( valueMouse );
13065
+ },
13066
+
13067
+ _start: function( event, index ) {
13068
+ var uiHash = {
13069
+ handle: this.handles[ index ],
13070
+ value: this.value()
13071
+ };
13072
+ if ( this.options.values && this.options.values.length ) {
13073
+ uiHash.value = this.values( index );
13074
+ uiHash.values = this.values();
13075
+ }
13076
+ return this._trigger( "start", event, uiHash );
13077
+ },
13078
+
13079
+ _slide: function( event, index, newVal ) {
13080
+ var otherVal,
13081
+ newValues,
13082
+ allowed;
13083
+
13084
+ if ( this.options.values && this.options.values.length ) {
13085
+ otherVal = this.values( index ? 0 : 1 );
13086
+
13087
+ if ( ( this.options.values.length === 2 && this.options.range === true ) &&
13088
+ ( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )
13089
+ ) {
13090
+ newVal = otherVal;
13091
+ }
13092
+
13093
+ if ( newVal !== this.values( index ) ) {
13094
+ newValues = this.values();
13095
+ newValues[ index ] = newVal;
13096
+ // A slide can be canceled by returning false from the slide callback
13097
+ allowed = this._trigger( "slide", event, {
13098
+ handle: this.handles[ index ],
13099
+ value: newVal,
13100
+ values: newValues
13101
+ } );
13102
+ otherVal = this.values( index ? 0 : 1 );
13103
+ if ( allowed !== false ) {
13104
+ this.values( index, newVal );
13105
+ }
13106
+ }
13107
+ } else {
13108
+ if ( newVal !== this.value() ) {
13109
+ // A slide can be canceled by returning false from the slide callback
13110
+ allowed = this._trigger( "slide", event, {
13111
+ handle: this.handles[ index ],
13112
+ value: newVal
13113
+ } );
13114
+ if ( allowed !== false ) {
13115
+ this.value( newVal );
13116
+ }
13117
+ }
13118
+ }
13119
+ },
13120
+
13121
+ _stop: function( event, index ) {
13122
+ var uiHash = {
13123
+ handle: this.handles[ index ],
13124
+ value: this.value()
13125
+ };
13126
+ if ( this.options.values && this.options.values.length ) {
13127
+ uiHash.value = this.values( index );
13128
+ uiHash.values = this.values();
13129
+ }
13130
+
13131
+ this._trigger( "stop", event, uiHash );
13132
+ },
13133
+
13134
+ _change: function( event, index ) {
13135
+ if ( !this._keySliding && !this._mouseSliding ) {
13136
+ var uiHash = {
13137
+ handle: this.handles[ index ],
13138
+ value: this.value()
13139
+ };
13140
+ if ( this.options.values && this.options.values.length ) {
13141
+ uiHash.value = this.values( index );
13142
+ uiHash.values = this.values();
13143
+ }
13144
+
13145
+ //store the last changed value index for reference when handles overlap
13146
+ this._lastChangedValue = index;
13147
+
13148
+ this._trigger( "change", event, uiHash );
13149
+ }
13150
+ },
13151
+
13152
+ value: function( newValue ) {
13153
+ if ( arguments.length ) {
13154
+ this.options.value = this._trimAlignValue( newValue );
13155
+ this._refreshValue();
13156
+ this._change( null, 0 );
13157
+ return;
13158
+ }
13159
+
13160
+ return this._value();
13161
+ },
13162
+
13163
+ values: function( index, newValue ) {
13164
+ var vals,
13165
+ newValues,
13166
+ i;
13167
+
13168
+ if ( arguments.length > 1 ) {
13169
+ this.options.values[ index ] = this._trimAlignValue( newValue );
13170
+ this._refreshValue();
13171
+ this._change( null, index );
13172
+ return;
13173
+ }
13174
+
13175
+ if ( arguments.length ) {
13176
+ if ( $.isArray( arguments[ 0 ] ) ) {
13177
+ vals = this.options.values;
13178
+ newValues = arguments[ 0 ];
13179
+ for ( i = 0; i < vals.length; i += 1 ) {
13180
+ vals[ i ] = this._trimAlignValue( newValues[ i ] );
13181
+ this._change( null, i );
13182
+ }
13183
+ this._refreshValue();
13184
+ } else {
13185
+ if ( this.options.values && this.options.values.length ) {
13186
+ return this._values( index );
13187
+ } else {
13188
+ return this.value();
13189
+ }
13190
+ }
13191
+ } else {
13192
+ return this._values();
13193
+ }
13194
+ },
13195
+
13196
+ _setOption: function( key, value ) {
13197
+ var i,
13198
+ valsLength = 0;
13199
+
13200
+ if ( key === "range" && this.options.range === true ) {
13201
+ if ( value === "min" ) {
13202
+ this.options.value = this._values( 0 );
13203
+ this.options.values = null;
13204
+ } else if ( value === "max" ) {
13205
+ this.options.value = this._values( this.options.values.length - 1 );
13206
+ this.options.values = null;
13207
+ }
13208
+ }
13209
+
13210
+ if ( $.isArray( this.options.values ) ) {
13211
+ valsLength = this.options.values.length;
13212
+ }
13213
+
13214
+ if ( key === "disabled" ) {
13215
+ this.element.toggleClass( "ui-state-disabled", !!value );
13216
+ }
13217
+
13218
+ this._super( key, value );
13219
+
13220
+ switch ( key ) {
13221
+ case "orientation":
13222
+ this._detectOrientation();
13223
+ this.element
13224
+ .removeClass( "ui-slider-horizontal ui-slider-vertical" )
13225
+ .addClass( "ui-slider-" + this.orientation );
13226
+ this._refreshValue();
13227
+
13228
+ // Reset positioning from previous orientation
13229
+ this.handles.css( value === "horizontal" ? "bottom" : "left", "" );
13230
+ break;
13231
+ case "value":
13232
+ this._animateOff = true;
13233
+ this._refreshValue();
13234
+ this._change( null, 0 );
13235
+ this._animateOff = false;
13236
+ break;
13237
+ case "values":
13238
+ this._animateOff = true;
13239
+ this._refreshValue();
13240
+ for ( i = 0; i < valsLength; i += 1 ) {
13241
+ this._change( null, i );
13242
+ }
13243
+ this._animateOff = false;
13244
+ break;
13245
+ case "step":
13246
+ case "min":
13247
+ case "max":
13248
+ this._animateOff = true;
13249
+ this._calculateNewMax();
13250
+ this._refreshValue();
13251
+ this._animateOff = false;
13252
+ break;
13253
+ case "range":
13254
+ this._animateOff = true;
13255
+ this._refresh();
13256
+ this._animateOff = false;
13257
+ break;
13258
+ }
13259
+ },
13260
+
13261
+ //internal value getter
13262
+ // _value() returns value trimmed by min and max, aligned by step
13263
+ _value: function() {
13264
+ var val = this.options.value;
13265
+ val = this._trimAlignValue( val );
13266
+
13267
+ return val;
13268
+ },
13269
+
13270
+ //internal values getter
13271
+ // _values() returns array of values trimmed by min and max, aligned by step
13272
+ // _values( index ) returns single value trimmed by min and max, aligned by step
13273
+ _values: function( index ) {
13274
+ var val,
13275
+ vals,
13276
+ i;
13277
+
13278
+ if ( arguments.length ) {
13279
+ val = this.options.values[ index ];
13280
+ val = this._trimAlignValue( val );
13281
+
13282
+ return val;
13283
+ } else if ( this.options.values && this.options.values.length ) {
13284
+ // .slice() creates a copy of the array
13285
+ // this copy gets trimmed by min and max and then returned
13286
+ vals = this.options.values.slice();
13287
+ for ( i = 0; i < vals.length; i += 1) {
13288
+ vals[ i ] = this._trimAlignValue( vals[ i ] );
13289
+ }
13290
+
13291
+ return vals;
13292
+ } else {
13293
+ return [];
13294
+ }
13295
+ },
13296
+
13297
+ // returns the step-aligned value that val is closest to, between (inclusive) min and max
13298
+ _trimAlignValue: function( val ) {
13299
+ if ( val <= this._valueMin() ) {
13300
+ return this._valueMin();
13301
+ }
13302
+ if ( val >= this._valueMax() ) {
13303
+ return this._valueMax();
13304
+ }
13305
+ var step = ( this.options.step > 0 ) ? this.options.step : 1,
13306
+ valModStep = (val - this._valueMin()) % step,
13307
+ alignValue = val - valModStep;
13308
+
13309
+ if ( Math.abs(valModStep) * 2 >= step ) {
13310
+ alignValue += ( valModStep > 0 ) ? step : ( -step );
13311
+ }
13312
+
13313
+ // Since JavaScript has problems with large floats, round
13314
+ // the final value to 5 digits after the decimal point (see #4124)
13315
+ return parseFloat( alignValue.toFixed(5) );
13316
+ },
13317
+
13318
+ _calculateNewMax: function() {
13319
+ var max = this.options.max,
13320
+ min = this._valueMin(),
13321
+ step = this.options.step,
13322
+ aboveMin = Math.floor( ( +( max - min ).toFixed( this._precision() ) ) / step ) * step;
13323
+ max = aboveMin + min;
13324
+ this.max = parseFloat( max.toFixed( this._precision() ) );
13325
+ },
13326
+
13327
+ _precision: function() {
13328
+ var precision = this._precisionOf( this.options.step );
13329
+ if ( this.options.min !== null ) {
13330
+ precision = Math.max( precision, this._precisionOf( this.options.min ) );
13331
+ }
13332
+ return precision;
13333
+ },
13334
+
13335
+ _precisionOf: function( num ) {
13336
+ var str = num.toString(),
13337
+ decimal = str.indexOf( "." );
13338
+ return decimal === -1 ? 0 : str.length - decimal - 1;
13339
+ },
13340
+
13341
+ _valueMin: function() {
13342
+ return this.options.min;
13343
+ },
13344
+
13345
+ _valueMax: function() {
13346
+ return this.max;
13347
+ },
13348
+
13349
+ _refreshValue: function() {
13350
+ var lastValPercent, valPercent, value, valueMin, valueMax,
13351
+ oRange = this.options.range,
13352
+ o = this.options,
13353
+ that = this,
13354
+ animate = ( !this._animateOff ) ? o.animate : false,
13355
+ _set = {};
13356
+
13357
+ if ( this.options.values && this.options.values.length ) {
13358
+ this.handles.each(function( i ) {
13359
+ valPercent = ( that.values(i) - that._valueMin() ) / ( that._valueMax() - that._valueMin() ) * 100;
13360
+ _set[ that.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
13361
+ $( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
13362
+ if ( that.options.range === true ) {
13363
+ if ( that.orientation === "horizontal" ) {
13364
+ if ( i === 0 ) {
13365
+ that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate );
13366
+ }
13367
+ if ( i === 1 ) {
13368
+ that.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
13369
+ }
13370
+ } else {
13371
+ if ( i === 0 ) {
13372
+ that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate );
13373
+ }
13374
+ if ( i === 1 ) {
13375
+ that.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
13376
+ }
13377
+ }
13378
+ }
13379
+ lastValPercent = valPercent;
13380
+ });
13381
+ } else {
13382
+ value = this.value();
13383
+ valueMin = this._valueMin();
13384
+ valueMax = this._valueMax();
13385
+ valPercent = ( valueMax !== valueMin ) ?
13386
+ ( value - valueMin ) / ( valueMax - valueMin ) * 100 :
13387
+ 0;
13388
+ _set[ this.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
13389
+ this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
13390
+
13391
+ if ( oRange === "min" && this.orientation === "horizontal" ) {
13392
+ this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate );
13393
+ }
13394
+ if ( oRange === "max" && this.orientation === "horizontal" ) {
13395
+ this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
13396
+ }
13397
+ if ( oRange === "min" && this.orientation === "vertical" ) {
13398
+ this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate );
13399
+ }
13400
+ if ( oRange === "max" && this.orientation === "vertical" ) {
13401
+ this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
13402
+ }
13403
+ }
13404
+ },
13405
+
13406
+ _handleEvents: {
13407
+ keydown: function( event ) {
13408
+ var allowed, curVal, newVal, step,
13409
+ index = $( event.target ).data( "ui-slider-handle-index" );
13410
+
13411
+ switch ( event.keyCode ) {
13412
+ case $.ui.keyCode.HOME:
13413
+ case $.ui.keyCode.END:
13414
+ case $.ui.keyCode.PAGE_UP:
13415
+ case $.ui.keyCode.PAGE_DOWN:
13416
+ case $.ui.keyCode.UP:
13417
+ case $.ui.keyCode.RIGHT:
13418
+ case $.ui.keyCode.DOWN:
13419
+ case $.ui.keyCode.LEFT:
13420
+ event.preventDefault();
13421
+ if ( !this._keySliding ) {
13422
+ this._keySliding = true;
13423
+ $( event.target ).addClass( "ui-state-active" );
13424
+ allowed = this._start( event, index );
13425
+ if ( allowed === false ) {
13426
+ return;
13427
+ }
13428
+ }
13429
+ break;
13430
+ }
13431
+
13432
+ step = this.options.step;
13433
+ if ( this.options.values && this.options.values.length ) {
13434
+ curVal = newVal = this.values( index );
13435
+ } else {
13436
+ curVal = newVal = this.value();
13437
+ }
13438
+
13439
+ switch ( event.keyCode ) {
13440
+ case $.ui.keyCode.HOME:
13441
+ newVal = this._valueMin();
13442
+ break;
13443
+ case $.ui.keyCode.END:
13444
+ newVal = this._valueMax();
13445
+ break;
13446
+ case $.ui.keyCode.PAGE_UP:
13447
+ newVal = this._trimAlignValue(
13448
+ curVal + ( ( this._valueMax() - this._valueMin() ) / this.numPages )
13449
+ );
13450
+ break;
13451
+ case $.ui.keyCode.PAGE_DOWN:
13452
+ newVal = this._trimAlignValue(
13453
+ curVal - ( (this._valueMax() - this._valueMin()) / this.numPages ) );
13454
+ break;
13455
+ case $.ui.keyCode.UP:
13456
+ case $.ui.keyCode.RIGHT:
13457
+ if ( curVal === this._valueMax() ) {
13458
+ return;
13459
+ }
13460
+ newVal = this._trimAlignValue( curVal + step );
13461
+ break;
13462
+ case $.ui.keyCode.DOWN:
13463
+ case $.ui.keyCode.LEFT:
13464
+ if ( curVal === this._valueMin() ) {
13465
+ return;
13466
+ }
13467
+ newVal = this._trimAlignValue( curVal - step );
13468
+ break;
13469
+ }
13470
+
13471
+ this._slide( event, index, newVal );
13472
+ },
13473
+ keyup: function( event ) {
13474
+ var index = $( event.target ).data( "ui-slider-handle-index" );
13475
+
13476
+ if ( this._keySliding ) {
13477
+ this._keySliding = false;
13478
+ this._stop( event, index );
13479
+ this._change( event, index );
13480
+ $( event.target ).removeClass( "ui-state-active" );
13481
+ }
13482
+ }
13483
+ }
13484
+ });
13485
+
13486
+
13487
+ /*!
13488
+ * jQuery UI Sortable 1.11.4
13489
+ * http://jqueryui.com
13490
+ *
13491
+ * Copyright jQuery Foundation and other contributors
13492
+ * Released under the MIT license.
13493
+ * http://jquery.org/license
13494
+ *
13495
+ * http://api.jqueryui.com/sortable/
13496
+ */
13497
+
13498
+
13499
+ var sortable = $.widget("ui.sortable", $.ui.mouse, {
13500
+ version: "1.11.4",
13501
+ widgetEventPrefix: "sort",
13502
+ ready: false,
13503
+ options: {
13504
+ appendTo: "parent",
13505
+ axis: false,
13506
+ connectWith: false,
13507
+ containment: false,
13508
+ cursor: "auto",
13509
+ cursorAt: false,
13510
+ dropOnEmpty: true,
13511
+ forcePlaceholderSize: false,
13512
+ forceHelperSize: false,
13513
+ grid: false,
13514
+ handle: false,
13515
+ helper: "original",
13516
+ items: "> *",
13517
+ opacity: false,
13518
+ placeholder: false,
13519
+ revert: false,
13520
+ scroll: true,
13521
+ scrollSensitivity: 20,
13522
+ scrollSpeed: 20,
13523
+ scope: "default",
13524
+ tolerance: "intersect",
13525
+ zIndex: 1000,
13526
+
13527
+ // callbacks
13528
+ activate: null,
13529
+ beforeStop: null,
13530
+ change: null,
13531
+ deactivate: null,
13532
+ out: null,
13533
+ over: null,
13534
+ receive: null,
13535
+ remove: null,
13536
+ sort: null,
13537
+ start: null,
13538
+ stop: null,
13539
+ update: null
13540
+ },
13541
+
13542
+ _isOverAxis: function( x, reference, size ) {
13543
+ return ( x >= reference ) && ( x < ( reference + size ) );
13544
+ },
13545
+
13546
+ _isFloating: function( item ) {
13547
+ return (/left|right/).test(item.css("float")) || (/inline|table-cell/).test(item.css("display"));
13548
+ },
13549
+
13550
+ _create: function() {
13551
+ this.containerCache = {};
13552
+ this.element.addClass("ui-sortable");
13553
+
13554
+ //Get the items
13555
+ this.refresh();
13556
+
13557
+ //Let's determine the parent's offset
13558
+ this.offset = this.element.offset();
13559
+
13560
+ //Initialize mouse events for interaction
13561
+ this._mouseInit();
13562
+
13563
+ this._setHandleClassName();
13564
+
13565
+ //We're ready to go
13566
+ this.ready = true;
13567
+
13568
+ },
13569
+
13570
+ _setOption: function( key, value ) {
13571
+ this._super( key, value );
13572
+
13573
+ if ( key === "handle" ) {
13574
+ this._setHandleClassName();
13575
+ }
13576
+ },
13577
+
13578
+ _setHandleClassName: function() {
13579
+ this.element.find( ".ui-sortable-handle" ).removeClass( "ui-sortable-handle" );
13580
+ $.each( this.items, function() {
13581
+ ( this.instance.options.handle ?
13582
+ this.item.find( this.instance.options.handle ) : this.item )
13583
+ .addClass( "ui-sortable-handle" );
13584
+ });
13585
+ },
13586
+
13587
+ _destroy: function() {
13588
+ this.element
13589
+ .removeClass( "ui-sortable ui-sortable-disabled" )
13590
+ .find( ".ui-sortable-handle" )
13591
+ .removeClass( "ui-sortable-handle" );
13592
+ this._mouseDestroy();
13593
+
13594
+ for ( var i = this.items.length - 1; i >= 0; i-- ) {
13595
+ this.items[i].item.removeData(this.widgetName + "-item");
13596
+ }
13597
+
13598
+ return this;
13599
+ },
13600
+
13601
+ _mouseCapture: function(event, overrideHandle) {
13602
+ var currentItem = null,
13603
+ validHandle = false,
13604
+ that = this;
13605
+
13606
+ if (this.reverting) {
13607
+ return false;
13608
+ }
13609
+
13610
+ if(this.options.disabled || this.options.type === "static") {
13611
+ return false;
13612
+ }
13613
+
13614
+ //We have to refresh the items data once first
13615
+ this._refreshItems(event);
13616
+
13617
+ //Find out if the clicked node (or one of its parents) is a actual item in this.items
13618
+ $(event.target).parents().each(function() {
13619
+ if($.data(this, that.widgetName + "-item") === that) {
13620
+ currentItem = $(this);
13621
+ return false;
13622
+ }
13623
+ });
13624
+ if($.data(event.target, that.widgetName + "-item") === that) {
13625
+ currentItem = $(event.target);
13626
+ }
13627
+
13628
+ if(!currentItem) {
13629
+ return false;
13630
+ }
13631
+ if(this.options.handle && !overrideHandle) {
13632
+ $(this.options.handle, currentItem).find("*").addBack().each(function() {
13633
+ if(this === event.target) {
13634
+ validHandle = true;
13635
+ }
13636
+ });
13637
+ if(!validHandle) {
13638
+ return false;
13639
+ }
13640
+ }
13641
+
13642
+ this.currentItem = currentItem;
13643
+ this._removeCurrentsFromItems();
13644
+ return true;
13645
+
13646
+ },
13647
+
13648
+ _mouseStart: function(event, overrideHandle, noActivation) {
13649
+
13650
+ var i, body,
13651
+ o = this.options;
13652
+
13653
+ this.currentContainer = this;
13654
+
13655
+ //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
13656
+ this.refreshPositions();
13657
+
13658
+ //Create and append the visible helper
13659
+ this.helper = this._createHelper(event);
13660
+
13661
+ //Cache the helper size
13662
+ this._cacheHelperProportions();
13663
+
13664
+ /*
13665
+ * - Position generation -
13666
+ * This block generates everything position related - it's the core of draggables.
13667
+ */
13668
+
13669
+ //Cache the margins of the original element
13670
+ this._cacheMargins();
13671
+
13672
+ //Get the next scrolling parent
13673
+ this.scrollParent = this.helper.scrollParent();
13674
+
13675
+ //The element's absolute position on the page minus margins
13676
+ this.offset = this.currentItem.offset();
13677
+ this.offset = {
13678
+ top: this.offset.top - this.margins.top,
13679
+ left: this.offset.left - this.margins.left
13680
+ };
13681
+
13682
+ $.extend(this.offset, {
13683
+ click: { //Where the click happened, relative to the element
13684
+ left: event.pageX - this.offset.left,
13685
+ top: event.pageY - this.offset.top
13686
+ },
13687
+ parent: this._getParentOffset(),
13688
+ relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
13689
+ });
13690
+
13691
+ // Only after we got the offset, we can change the helper's position to absolute
13692
+ // TODO: Still need to figure out a way to make relative sorting possible
13693
+ this.helper.css("position", "absolute");
13694
+ this.cssPosition = this.helper.css("position");
13695
+
13696
+ //Generate the original position
13697
+ this.originalPosition = this._generatePosition(event);
13698
+ this.originalPageX = event.pageX;
13699
+ this.originalPageY = event.pageY;
13700
+
13701
+ //Adjust the mouse offset relative to the helper if "cursorAt" is supplied
13702
+ (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
13703
+
13704
+ //Cache the former DOM position
13705
+ this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
13706
+
13707
+ //If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
13708
+ if(this.helper[0] !== this.currentItem[0]) {
13709
+ this.currentItem.hide();
13710
+ }
13711
+
13712
+ //Create the placeholder
13713
+ this._createPlaceholder();
13714
+
13715
+ //Set a containment if given in the options
13716
+ if(o.containment) {
13717
+ this._setContainment();
13718
+ }
13719
+
13720
+ if( o.cursor && o.cursor !== "auto" ) { // cursor option
13721
+ body = this.document.find( "body" );
13722
+
13723
+ // support: IE
13724
+ this.storedCursor = body.css( "cursor" );
13725
+ body.css( "cursor", o.cursor );
13726
+
13727
+ this.storedStylesheet = $( "<style>*{ cursor: "+o.cursor+" !important; }</style>" ).appendTo( body );
13728
+ }
13729
+
13730
+ if(o.opacity) { // opacity option
13731
+ if (this.helper.css("opacity")) {
13732
+ this._storedOpacity = this.helper.css("opacity");
13733
+ }
13734
+ this.helper.css("opacity", o.opacity);
13735
+ }
13736
+
13737
+ if(o.zIndex) { // zIndex option
13738
+ if (this.helper.css("zIndex")) {
13739
+ this._storedZIndex = this.helper.css("zIndex");
13740
+ }
13741
+ this.helper.css("zIndex", o.zIndex);
13742
+ }
13743
+
13744
+ //Prepare scrolling
13745
+ if(this.scrollParent[0] !== this.document[0] && this.scrollParent[0].tagName !== "HTML") {
13746
+ this.overflowOffset = this.scrollParent.offset();
13747
+ }
13748
+
13749
+ //Call callbacks
13750
+ this._trigger("start", event, this._uiHash());
13751
+
13752
+ //Recache the helper size
13753
+ if(!this._preserveHelperProportions) {
13754
+ this._cacheHelperProportions();
13755
+ }
13756
+
13757
+
13758
+ //Post "activate" events to possible containers
13759
+ if( !noActivation ) {
13760
+ for ( i = this.containers.length - 1; i >= 0; i-- ) {
13761
+ this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) );
13762
+ }
13763
+ }
13764
+
13765
+ //Prepare possible droppables
13766
+ if($.ui.ddmanager) {
13767
+ $.ui.ddmanager.current = this;
13768
+ }
13769
+
13770
+ if ($.ui.ddmanager && !o.dropBehaviour) {
13771
+ $.ui.ddmanager.prepareOffsets(this, event);
13772
+ }
13773
+
13774
+ this.dragging = true;
13775
+
13776
+ this.helper.addClass("ui-sortable-helper");
13777
+ this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
13778
+ return true;
13779
+
13780
+ },
13781
+
13782
+ _mouseDrag: function(event) {
13783
+ var i, item, itemElement, intersection,
13784
+ o = this.options,
13785
+ scrolled = false;
13786
+
13787
+ //Compute the helpers position
13788
+ this.position = this._generatePosition(event);
13789
+ this.positionAbs = this._convertPositionTo("absolute");
13790
+
13791
+ if (!this.lastPositionAbs) {
13792
+ this.lastPositionAbs = this.positionAbs;
13793
+ }
13794
+
13795
+ //Do scrolling
13796
+ if(this.options.scroll) {
13797
+ if(this.scrollParent[0] !== this.document[0] && this.scrollParent[0].tagName !== "HTML") {
13798
+
13799
+ if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {
13800
+ this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
13801
+ } else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) {
13802
+ this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
13803
+ }
13804
+
13805
+ if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {
13806
+ this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
13807
+ } else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) {
13808
+ this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
13809
+ }
13810
+
13811
+ } else {
13812
+
13813
+ if(event.pageY - this.document.scrollTop() < o.scrollSensitivity) {
13814
+ scrolled = this.document.scrollTop(this.document.scrollTop() - o.scrollSpeed);
13815
+ } else if(this.window.height() - (event.pageY - this.document.scrollTop()) < o.scrollSensitivity) {
13816
+ scrolled = this.document.scrollTop(this.document.scrollTop() + o.scrollSpeed);
13817
+ }
13818
+
13819
+ if(event.pageX - this.document.scrollLeft() < o.scrollSensitivity) {
13820
+ scrolled = this.document.scrollLeft(this.document.scrollLeft() - o.scrollSpeed);
13821
+ } else if(this.window.width() - (event.pageX - this.document.scrollLeft()) < o.scrollSensitivity) {
13822
+ scrolled = this.document.scrollLeft(this.document.scrollLeft() + o.scrollSpeed);
13823
+ }
13824
+
13825
+ }
13826
+
13827
+ if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
13828
+ $.ui.ddmanager.prepareOffsets(this, event);
13829
+ }
13830
+ }
13831
+
13832
+ //Regenerate the absolute position used for position checks
13833
+ this.positionAbs = this._convertPositionTo("absolute");
13834
+
13835
+ //Set the helper position
13836
+ if(!this.options.axis || this.options.axis !== "y") {
13837
+ this.helper[0].style.left = this.position.left+"px";
13838
+ }
13839
+ if(!this.options.axis || this.options.axis !== "x") {
13840
+ this.helper[0].style.top = this.position.top+"px";
13841
+ }
13842
+
13843
+ //Rearrange
13844
+ for (i = this.items.length - 1; i >= 0; i--) {
13845
+
13846
+ //Cache variables and intersection, continue if no intersection
13847
+ item = this.items[i];
13848
+ itemElement = item.item[0];
13849
+ intersection = this._intersectsWithPointer(item);
13850
+ if (!intersection) {
13851
+ continue;
13852
+ }
13853
+
13854
+ // Only put the placeholder inside the current Container, skip all
13855
+ // items from other containers. This works because when moving
13856
+ // an item from one container to another the
13857
+ // currentContainer is switched before the placeholder is moved.
13858
+ //
13859
+ // Without this, moving items in "sub-sortables" can cause
13860
+ // the placeholder to jitter between the outer and inner container.
13861
+ if (item.instance !== this.currentContainer) {
13862
+ continue;
13863
+ }
13864
+
13865
+ // cannot intersect with itself
13866
+ // no useless actions that have been done before
13867
+ // no action if the item moved is the parent of the item checked
13868
+ if (itemElement !== this.currentItem[0] &&
13869
+ this.placeholder[intersection === 1 ? "next" : "prev"]()[0] !== itemElement &&
13870
+ !$.contains(this.placeholder[0], itemElement) &&
13871
+ (this.options.type === "semi-dynamic" ? !$.contains(this.element[0], itemElement) : true)
13872
+ ) {
13873
+
13874
+ this.direction = intersection === 1 ? "down" : "up";
13875
+
13876
+ if (this.options.tolerance === "pointer" || this._intersectsWithSides(item)) {
13877
+ this._rearrange(event, item);
13878
+ } else {
13879
+ break;
13880
+ }
13881
+
13882
+ this._trigger("change", event, this._uiHash());
13883
+ break;
13884
+ }
13885
+ }
13886
+
13887
+ //Post events to containers
13888
+ this._contactContainers(event);
13889
+
13890
+ //Interconnect with droppables
13891
+ if($.ui.ddmanager) {
13892
+ $.ui.ddmanager.drag(this, event);
13893
+ }
13894
+
13895
+ //Call callbacks
13896
+ this._trigger("sort", event, this._uiHash());
13897
+
13898
+ this.lastPositionAbs = this.positionAbs;
13899
+ return false;
13900
+
13901
+ },
13902
+
13903
+ _mouseStop: function(event, noPropagation) {
13904
+
13905
+ if(!event) {
13906
+ return;
13907
+ }
13908
+
13909
+ //If we are using droppables, inform the manager about the drop
13910
+ if ($.ui.ddmanager && !this.options.dropBehaviour) {
13911
+ $.ui.ddmanager.drop(this, event);
13912
+ }
13913
+
13914
+ if(this.options.revert) {
13915
+ var that = this,
13916
+ cur = this.placeholder.offset(),
13917
+ axis = this.options.axis,
13918
+ animation = {};
13919
+
13920
+ if ( !axis || axis === "x" ) {
13921
+ animation.left = cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] === this.document[0].body ? 0 : this.offsetParent[0].scrollLeft);
13922
+ }
13923
+ if ( !axis || axis === "y" ) {
13924
+ animation.top = cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] === this.document[0].body ? 0 : this.offsetParent[0].scrollTop);
13925
+ }
13926
+ this.reverting = true;
13927
+ $(this.helper).animate( animation, parseInt(this.options.revert, 10) || 500, function() {
13928
+ that._clear(event);
13929
+ });
13930
+ } else {
13931
+ this._clear(event, noPropagation);
13932
+ }
13933
+
13934
+ return false;
13935
+
13936
+ },
13937
+
13938
+ cancel: function() {
13939
+
13940
+ if(this.dragging) {
13941
+
13942
+ this._mouseUp({ target: null });
13943
+
13944
+ if(this.options.helper === "original") {
13945
+ this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
13946
+ } else {
13947
+ this.currentItem.show();
13948
+ }
13949
+
13950
+ //Post deactivating events to containers
13951
+ for (var i = this.containers.length - 1; i >= 0; i--){
13952
+ this.containers[i]._trigger("deactivate", null, this._uiHash(this));
13953
+ if(this.containers[i].containerCache.over) {
13954
+ this.containers[i]._trigger("out", null, this._uiHash(this));
13955
+ this.containers[i].containerCache.over = 0;
13956
+ }
13957
+ }
13958
+
13959
+ }
13960
+
13961
+ if (this.placeholder) {
13962
+ //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
13963
+ if(this.placeholder[0].parentNode) {
13964
+ this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
13965
+ }
13966
+ if(this.options.helper !== "original" && this.helper && this.helper[0].parentNode) {
13967
+ this.helper.remove();
13968
+ }
13969
+
13970
+ $.extend(this, {
13971
+ helper: null,
13972
+ dragging: false,
13973
+ reverting: false,
13974
+ _noFinalSort: null
13975
+ });
13976
+
13977
+ if(this.domPosition.prev) {
13978
+ $(this.domPosition.prev).after(this.currentItem);
13979
+ } else {
13980
+ $(this.domPosition.parent).prepend(this.currentItem);
13981
+ }
13982
+ }
13983
+
13984
+ return this;
13985
+
13986
+ },
13987
+
13988
+ serialize: function(o) {
13989
+
13990
+ var items = this._getItemsAsjQuery(o && o.connected),
13991
+ str = [];
13992
+ o = o || {};
13993
+
13994
+ $(items).each(function() {
13995
+ var res = ($(o.item || this).attr(o.attribute || "id") || "").match(o.expression || (/(.+)[\-=_](.+)/));
13996
+ if (res) {
13997
+ str.push((o.key || res[1]+"[]")+"="+(o.key && o.expression ? res[1] : res[2]));
13998
+ }
13999
+ });
14000
+
14001
+ if(!str.length && o.key) {
14002
+ str.push(o.key + "=");
14003
+ }
14004
+
14005
+ return str.join("&");
14006
+
14007
+ },
14008
+
14009
+ toArray: function(o) {
14010
+
14011
+ var items = this._getItemsAsjQuery(o && o.connected),
14012
+ ret = [];
14013
+
14014
+ o = o || {};
14015
+
14016
+ items.each(function() { ret.push($(o.item || this).attr(o.attribute || "id") || ""); });
14017
+ return ret;
14018
+
14019
+ },
14020
+
14021
+ /* Be careful with the following core functions */
14022
+ _intersectsWith: function(item) {
14023
+
14024
+ var x1 = this.positionAbs.left,
14025
+ x2 = x1 + this.helperProportions.width,
14026
+ y1 = this.positionAbs.top,
14027
+ y2 = y1 + this.helperProportions.height,
14028
+ l = item.left,
14029
+ r = l + item.width,
14030
+ t = item.top,
14031
+ b = t + item.height,
14032
+ dyClick = this.offset.click.top,
14033
+ dxClick = this.offset.click.left,
14034
+ isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick ) > t && ( y1 + dyClick ) < b ),
14035
+ isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick ) > l && ( x1 + dxClick ) < r ),
14036
+ isOverElement = isOverElementHeight && isOverElementWidth;
14037
+
14038
+ if ( this.options.tolerance === "pointer" ||
14039
+ this.options.forcePointerForContainers ||
14040
+ (this.options.tolerance !== "pointer" && this.helperProportions[this.floating ? "width" : "height"] > item[this.floating ? "width" : "height"])
14041
+ ) {
14042
+ return isOverElement;
14043
+ } else {
14044
+
14045
+ return (l < x1 + (this.helperProportions.width / 2) && // Right Half
14046
+ x2 - (this.helperProportions.width / 2) < r && // Left Half
14047
+ t < y1 + (this.helperProportions.height / 2) && // Bottom Half
14048
+ y2 - (this.helperProportions.height / 2) < b ); // Top Half
14049
+
14050
+ }
14051
+ },
14052
+
14053
+ _intersectsWithPointer: function(item) {
14054
+
14055
+ var isOverElementHeight = (this.options.axis === "x") || this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
14056
+ isOverElementWidth = (this.options.axis === "y") || this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
14057
+ isOverElement = isOverElementHeight && isOverElementWidth,
14058
+ verticalDirection = this._getDragVerticalDirection(),
14059
+ horizontalDirection = this._getDragHorizontalDirection();
14060
+
14061
+ if (!isOverElement) {
14062
+ return false;
14063
+ }
14064
+
14065
+ return this.floating ?
14066
+ ( ((horizontalDirection && horizontalDirection === "right") || verticalDirection === "down") ? 2 : 1 )
14067
+ : ( verticalDirection && (verticalDirection === "down" ? 2 : 1) );
14068
+
14069
+ },
14070
+
14071
+ _intersectsWithSides: function(item) {
14072
+
14073
+ var isOverBottomHalf = this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
14074
+ isOverRightHalf = this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
14075
+ verticalDirection = this._getDragVerticalDirection(),
14076
+ horizontalDirection = this._getDragHorizontalDirection();
14077
+
14078
+ if (this.floating && horizontalDirection) {
14079
+ return ((horizontalDirection === "right" && isOverRightHalf) || (horizontalDirection === "left" && !isOverRightHalf));
14080
+ } else {
14081
+ return verticalDirection && ((verticalDirection === "down" && isOverBottomHalf) || (verticalDirection === "up" && !isOverBottomHalf));
14082
+ }
14083
+
14084
+ },
14085
+
14086
+ _getDragVerticalDirection: function() {
14087
+ var delta = this.positionAbs.top - this.lastPositionAbs.top;
14088
+ return delta !== 0 && (delta > 0 ? "down" : "up");
14089
+ },
14090
+
14091
+ _getDragHorizontalDirection: function() {
14092
+ var delta = this.positionAbs.left - this.lastPositionAbs.left;
14093
+ return delta !== 0 && (delta > 0 ? "right" : "left");
14094
+ },
14095
+
14096
+ refresh: function(event) {
14097
+ this._refreshItems(event);
14098
+ this._setHandleClassName();
14099
+ this.refreshPositions();
14100
+ return this;
14101
+ },
14102
+
14103
+ _connectWith: function() {
14104
+ var options = this.options;
14105
+ return options.connectWith.constructor === String ? [options.connectWith] : options.connectWith;
14106
+ },
14107
+
14108
+ _getItemsAsjQuery: function(connected) {
14109
+
14110
+ var i, j, cur, inst,
14111
+ items = [],
14112
+ queries = [],
14113
+ connectWith = this._connectWith();
14114
+
14115
+ if(connectWith && connected) {
14116
+ for (i = connectWith.length - 1; i >= 0; i--){
14117
+ cur = $(connectWith[i], this.document[0]);
14118
+ for ( j = cur.length - 1; j >= 0; j--){
14119
+ inst = $.data(cur[j], this.widgetFullName);
14120
+ if(inst && inst !== this && !inst.options.disabled) {
14121
+ queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), inst]);
14122
+ }
14123
+ }
14124
+ }
14125
+ }
14126
+
14127
+ queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), this]);
14128
+
14129
+ function addItems() {
14130
+ items.push( this );
14131
+ }
14132
+ for (i = queries.length - 1; i >= 0; i--){
14133
+ queries[i][0].each( addItems );
14134
+ }
14135
+
14136
+ return $(items);
14137
+
14138
+ },
14139
+
14140
+ _removeCurrentsFromItems: function() {
14141
+
14142
+ var list = this.currentItem.find(":data(" + this.widgetName + "-item)");
14143
+
14144
+ this.items = $.grep(this.items, function (item) {
14145
+ for (var j=0; j < list.length; j++) {
14146
+ if(list[j] === item.item[0]) {
14147
+ return false;
14148
+ }
14149
+ }
14150
+ return true;
14151
+ });
14152
+
14153
+ },
14154
+
14155
+ _refreshItems: function(event) {
14156
+
14157
+ this.items = [];
14158
+ this.containers = [this];
14159
+
14160
+ var i, j, cur, inst, targetData, _queries, item, queriesLength,
14161
+ items = this.items,
14162
+ queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]],
14163
+ connectWith = this._connectWith();
14164
+
14165
+ if(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down
14166
+ for (i = connectWith.length - 1; i >= 0; i--){
14167
+ cur = $(connectWith[i], this.document[0]);
14168
+ for (j = cur.length - 1; j >= 0; j--){
14169
+ inst = $.data(cur[j], this.widgetFullName);
14170
+ if(inst && inst !== this && !inst.options.disabled) {
14171
+ queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
14172
+ this.containers.push(inst);
14173
+ }
14174
+ }
14175
+ }
14176
+ }
14177
+
14178
+ for (i = queries.length - 1; i >= 0; i--) {
14179
+ targetData = queries[i][1];
14180
+ _queries = queries[i][0];
14181
+
14182
+ for (j=0, queriesLength = _queries.length; j < queriesLength; j++) {
14183
+ item = $(_queries[j]);
14184
+
14185
+ item.data(this.widgetName + "-item", targetData); // Data for target checking (mouse manager)
14186
+
14187
+ items.push({
14188
+ item: item,
14189
+ instance: targetData,
14190
+ width: 0, height: 0,
14191
+ left: 0, top: 0
14192
+ });
14193
+ }
14194
+ }
14195
+
14196
+ },
14197
+
14198
+ refreshPositions: function(fast) {
14199
+
14200
+ // Determine whether items are being displayed horizontally
14201
+ this.floating = this.items.length ?
14202
+ this.options.axis === "x" || this._isFloating( this.items[ 0 ].item ) :
14203
+ false;
14204
+
14205
+ //This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
14206
+ if(this.offsetParent && this.helper) {
14207
+ this.offset.parent = this._getParentOffset();
14208
+ }
14209
+
14210
+ var i, item, t, p;
14211
+
14212
+ for (i = this.items.length - 1; i >= 0; i--){
14213
+ item = this.items[i];
14214
+
14215
+ //We ignore calculating positions of all connected containers when we're not over them
14216
+ if(item.instance !== this.currentContainer && this.currentContainer && item.item[0] !== this.currentItem[0]) {
14217
+ continue;
14218
+ }
14219
+
14220
+ t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
14221
+
14222
+ if (!fast) {
14223
+ item.width = t.outerWidth();
14224
+ item.height = t.outerHeight();
14225
+ }
14226
+
14227
+ p = t.offset();
14228
+ item.left = p.left;
14229
+ item.top = p.top;
14230
+ }
14231
+
14232
+ if(this.options.custom && this.options.custom.refreshContainers) {
14233
+ this.options.custom.refreshContainers.call(this);
14234
+ } else {
14235
+ for (i = this.containers.length - 1; i >= 0; i--){
14236
+ p = this.containers[i].element.offset();
14237
+ this.containers[i].containerCache.left = p.left;
14238
+ this.containers[i].containerCache.top = p.top;
14239
+ this.containers[i].containerCache.width = this.containers[i].element.outerWidth();
14240
+ this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
14241
+ }
14242
+ }
14243
+
14244
+ return this;
14245
+ },
14246
+
14247
+ _createPlaceholder: function(that) {
14248
+ that = that || this;
14249
+ var className,
14250
+ o = that.options;
14251
+
14252
+ if(!o.placeholder || o.placeholder.constructor === String) {
14253
+ className = o.placeholder;
14254
+ o.placeholder = {
14255
+ element: function() {
14256
+
14257
+ var nodeName = that.currentItem[0].nodeName.toLowerCase(),
14258
+ element = $( "<" + nodeName + ">", that.document[0] )
14259
+ .addClass(className || that.currentItem[0].className+" ui-sortable-placeholder")
14260
+ .removeClass("ui-sortable-helper");
14261
+
14262
+ if ( nodeName === "tbody" ) {
14263
+ that._createTrPlaceholder(
14264
+ that.currentItem.find( "tr" ).eq( 0 ),
14265
+ $( "<tr>", that.document[ 0 ] ).appendTo( element )
14266
+ );
14267
+ } else if ( nodeName === "tr" ) {
14268
+ that._createTrPlaceholder( that.currentItem, element );
14269
+ } else if ( nodeName === "img" ) {
14270
+ element.attr( "src", that.currentItem.attr( "src" ) );
14271
+ }
14272
+
14273
+ if ( !className ) {
14274
+ element.css( "visibility", "hidden" );
14275
+ }
14276
+
14277
+ return element;
14278
+ },
14279
+ update: function(container, p) {
14280
+
14281
+ // 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
14282
+ // 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
14283
+ if(className && !o.forcePlaceholderSize) {
14284
+ return;
14285
+ }
14286
+
14287
+ //If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
14288
+ if(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css("paddingTop")||0, 10) - parseInt(that.currentItem.css("paddingBottom")||0, 10)); }
14289
+ if(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css("paddingLeft")||0, 10) - parseInt(that.currentItem.css("paddingRight")||0, 10)); }
14290
+ }
14291
+ };
14292
+ }
14293
+
14294
+ //Create the placeholder
14295
+ that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));
14296
+
14297
+ //Append it after the actual current item
14298
+ that.currentItem.after(that.placeholder);
14299
+
14300
+ //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
14301
+ o.placeholder.update(that, that.placeholder);
14302
+
14303
+ },
14304
+
14305
+ _createTrPlaceholder: function( sourceTr, targetTr ) {
14306
+ var that = this;
14307
+
14308
+ sourceTr.children().each(function() {
14309
+ $( "<td>&#160;</td>", that.document[ 0 ] )
14310
+ .attr( "colspan", $( this ).attr( "colspan" ) || 1 )
14311
+ .appendTo( targetTr );
14312
+ });
14313
+ },
14314
+
14315
+ _contactContainers: function(event) {
14316
+ var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom, floating, axis,
14317
+ innermostContainer = null,
14318
+ innermostIndex = null;
14319
+
14320
+ // get innermost container that intersects with item
14321
+ for (i = this.containers.length - 1; i >= 0; i--) {
14322
+
14323
+ // never consider a container that's located within the item itself
14324
+ if($.contains(this.currentItem[0], this.containers[i].element[0])) {
14325
+ continue;
14326
+ }
14327
+
14328
+ if(this._intersectsWith(this.containers[i].containerCache)) {
14329
+
14330
+ // if we've already found a container and it's more "inner" than this, then continue
14331
+ if(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0])) {
14332
+ continue;
14333
+ }
14334
+
14335
+ innermostContainer = this.containers[i];
14336
+ innermostIndex = i;
14337
+
14338
+ } else {
14339
+ // container doesn't intersect. trigger "out" event if necessary
14340
+ if(this.containers[i].containerCache.over) {
14341
+ this.containers[i]._trigger("out", event, this._uiHash(this));
14342
+ this.containers[i].containerCache.over = 0;
14343
+ }
14344
+ }
14345
+
14346
+ }
14347
+
14348
+ // if no intersecting containers found, return
14349
+ if(!innermostContainer) {
14350
+ return;
14351
+ }
14352
+
14353
+ // move the item into the container if it's not there already
14354
+ if(this.containers.length === 1) {
14355
+ if (!this.containers[innermostIndex].containerCache.over) {
14356
+ this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
14357
+ this.containers[innermostIndex].containerCache.over = 1;
14358
+ }
14359
+ } else {
14360
+
14361
+ //When entering a new container, we will find the item with the least distance and append our item near it
14362
+ dist = 10000;
14363
+ itemWithLeastDistance = null;
14364
+ floating = innermostContainer.floating || this._isFloating(this.currentItem);
14365
+ posProperty = floating ? "left" : "top";
14366
+ sizeProperty = floating ? "width" : "height";
14367
+ axis = floating ? "clientX" : "clientY";
14368
+
14369
+ for (j = this.items.length - 1; j >= 0; j--) {
14370
+ if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) {
14371
+ continue;
14372
+ }
14373
+ if(this.items[j].item[0] === this.currentItem[0]) {
14374
+ continue;
14375
+ }
14376
+
14377
+ cur = this.items[j].item.offset()[posProperty];
14378
+ nearBottom = false;
14379
+ if ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {
14380
+ nearBottom = true;
14381
+ }
14382
+
14383
+ if ( Math.abs( event[ axis ] - cur ) < dist ) {
14384
+ dist = Math.abs( event[ axis ] - cur );
14385
+ itemWithLeastDistance = this.items[ j ];
14386
+ this.direction = nearBottom ? "up": "down";
14387
+ }
14388
+ }
14389
+
14390
+ //Check if dropOnEmpty is enabled
14391
+ if(!itemWithLeastDistance && !this.options.dropOnEmpty) {
14392
+ return;
14393
+ }
14394
+
14395
+ if(this.currentContainer === this.containers[innermostIndex]) {
14396
+ if ( !this.currentContainer.containerCache.over ) {
14397
+ this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash() );
14398
+ this.currentContainer.containerCache.over = 1;
14399
+ }
14400
+ return;
14401
+ }
14402
+
14403
+ itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);
14404
+ this._trigger("change", event, this._uiHash());
14405
+ this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));
14406
+ this.currentContainer = this.containers[innermostIndex];
14407
+
14408
+ //Update the placeholder
14409
+ this.options.placeholder.update(this.currentContainer, this.placeholder);
14410
+
14411
+ this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
14412
+ this.containers[innermostIndex].containerCache.over = 1;
14413
+ }
14414
+
14415
+
14416
+ },
14417
+
14418
+ _createHelper: function(event) {
14419
+
14420
+ var o = this.options,
14421
+ helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper === "clone" ? this.currentItem.clone() : this.currentItem);
14422
+
14423
+ //Add the helper to the DOM if that didn't happen already
14424
+ if(!helper.parents("body").length) {
14425
+ $(o.appendTo !== "parent" ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
14426
+ }
14427
+
14428
+ if(helper[0] === this.currentItem[0]) {
14429
+ this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };
14430
+ }
14431
+
14432
+ if(!helper[0].style.width || o.forceHelperSize) {
14433
+ helper.width(this.currentItem.width());
14434
+ }
14435
+ if(!helper[0].style.height || o.forceHelperSize) {
14436
+ helper.height(this.currentItem.height());
14437
+ }
14438
+
14439
+ return helper;
14440
+
14441
+ },
14442
+
14443
+ _adjustOffsetFromHelper: function(obj) {
14444
+ if (typeof obj === "string") {
14445
+ obj = obj.split(" ");
14446
+ }
14447
+ if ($.isArray(obj)) {
14448
+ obj = {left: +obj[0], top: +obj[1] || 0};
14449
+ }
14450
+ if ("left" in obj) {
14451
+ this.offset.click.left = obj.left + this.margins.left;
14452
+ }
14453
+ if ("right" in obj) {
14454
+ this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
14455
+ }
14456
+ if ("top" in obj) {
14457
+ this.offset.click.top = obj.top + this.margins.top;
14458
+ }
14459
+ if ("bottom" in obj) {
14460
+ this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
14461
+ }
14462
+ },
14463
+
14464
+ _getParentOffset: function() {
14465
+
14466
+
14467
+ //Get the offsetParent and cache its position
14468
+ this.offsetParent = this.helper.offsetParent();
14469
+ var po = this.offsetParent.offset();
14470
+
14471
+ // This is a special case where we need to modify a offset calculated on start, since the following happened:
14472
+ // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
14473
+ // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
14474
+ // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
14475
+ if(this.cssPosition === "absolute" && this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) {
14476
+ po.left += this.scrollParent.scrollLeft();
14477
+ po.top += this.scrollParent.scrollTop();
14478
+ }
14479
+
14480
+ // This needs to be actually done for all browsers, since pageX/pageY includes this information
14481
+ // with an ugly IE fix
14482
+ if( this.offsetParent[0] === this.document[0].body || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === "html" && $.ui.ie)) {
14483
+ po = { top: 0, left: 0 };
14484
+ }
14485
+
14486
+ return {
14487
+ top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
14488
+ left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
14489
+ };
14490
+
14491
+ },
14492
+
14493
+ _getRelativeOffset: function() {
14494
+
14495
+ if(this.cssPosition === "relative") {
14496
+ var p = this.currentItem.position();
14497
+ return {
14498
+ top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
14499
+ left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
14500
+ };
14501
+ } else {
14502
+ return { top: 0, left: 0 };
14503
+ }
14504
+
14505
+ },
14506
+
14507
+ _cacheMargins: function() {
14508
+ this.margins = {
14509
+ left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
14510
+ top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
14511
+ };
14512
+ },
14513
+
14514
+ _cacheHelperProportions: function() {
14515
+ this.helperProportions = {
14516
+ width: this.helper.outerWidth(),
14517
+ height: this.helper.outerHeight()
14518
+ };
14519
+ },
14520
+
14521
+ _setContainment: function() {
14522
+
14523
+ var ce, co, over,
14524
+ o = this.options;
14525
+ if(o.containment === "parent") {
14526
+ o.containment = this.helper[0].parentNode;
14527
+ }
14528
+ if(o.containment === "document" || o.containment === "window") {
14529
+ this.containment = [
14530
+ 0 - this.offset.relative.left - this.offset.parent.left,
14531
+ 0 - this.offset.relative.top - this.offset.parent.top,
14532
+ o.containment === "document" ? this.document.width() : this.window.width() - this.helperProportions.width - this.margins.left,
14533
+ (o.containment === "document" ? this.document.width() : this.window.height() || this.document[0].body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
14534
+ ];
14535
+ }
14536
+
14537
+ if(!(/^(document|window|parent)$/).test(o.containment)) {
14538
+ ce = $(o.containment)[0];
14539
+ co = $(o.containment).offset();
14540
+ over = ($(ce).css("overflow") !== "hidden");
14541
+
14542
+ this.containment = [
14543
+ co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
14544
+ co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
14545
+ co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
14546
+ co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
14547
+ ];
14548
+ }
14549
+
14550
+ },
14551
+
14552
+ _convertPositionTo: function(d, pos) {
14553
+
14554
+ if(!pos) {
14555
+ pos = this.position;
14556
+ }
14557
+ var mod = d === "absolute" ? 1 : -1,
14558
+ scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent,
14559
+ scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
14560
+
14561
+ return {
14562
+ top: (
14563
+ pos.top + // The absolute mouse position
14564
+ this.offset.relative.top * mod + // Only for relative positioned nodes: Relative offset from element to offset parent
14565
+ this.offset.parent.top * mod - // The offsetParent's offset without borders (offset + border)
14566
+ ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
14567
+ ),
14568
+ left: (
14569
+ pos.left + // The absolute mouse position
14570
+ this.offset.relative.left * mod + // Only for relative positioned nodes: Relative offset from element to offset parent
14571
+ this.offset.parent.left * mod - // The offsetParent's offset without borders (offset + border)
14572
+ ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
14573
+ )
14574
+ };
14575
+
14576
+ },
14577
+
14578
+ _generatePosition: function(event) {
14579
+
14580
+ var top, left,
14581
+ o = this.options,
14582
+ pageX = event.pageX,
14583
+ pageY = event.pageY,
14584
+ scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
14585
+
14586
+ // This is another very weird special case that only happens for relative elements:
14587
+ // 1. If the css position is relative
14588
+ // 2. and the scroll parent is the document or similar to the offset parent
14589
+ // we have to refresh the relative offset during the scroll so there are no jumps
14590
+ if(this.cssPosition === "relative" && !(this.scrollParent[0] !== this.document[0] && this.scrollParent[0] !== this.offsetParent[0])) {
14591
+ this.offset.relative = this._getRelativeOffset();
14592
+ }
14593
+
14594
+ /*
14595
+ * - Position constraining -
14596
+ * Constrain the position to a mix of grid, containment.
14597
+ */
14598
+
14599
+ if(this.originalPosition) { //If we are not dragging yet, we won't check for options
14600
+
14601
+ if(this.containment) {
14602
+ if(event.pageX - this.offset.click.left < this.containment[0]) {
14603
+ pageX = this.containment[0] + this.offset.click.left;
14604
+ }
14605
+ if(event.pageY - this.offset.click.top < this.containment[1]) {
14606
+ pageY = this.containment[1] + this.offset.click.top;
14607
+ }
14608
+ if(event.pageX - this.offset.click.left > this.containment[2]) {
14609
+ pageX = this.containment[2] + this.offset.click.left;
14610
+ }
14611
+ if(event.pageY - this.offset.click.top > this.containment[3]) {
14612
+ pageY = this.containment[3] + this.offset.click.top;
14613
+ }
14614
+ }
14615
+
14616
+ if(o.grid) {
14617
+ top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
14618
+ pageY = this.containment ? ( (top - this.offset.click.top >= this.containment[1] && top - this.offset.click.top <= this.containment[3]) ? top : ((top - this.offset.click.top >= this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
14619
+
14620
+ left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
14621
+ pageX = this.containment ? ( (left - this.offset.click.left >= this.containment[0] && left - this.offset.click.left <= this.containment[2]) ? left : ((left - this.offset.click.left >= this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
14622
+ }
14623
+
14624
+ }
14625
+
14626
+ return {
14627
+ top: (
14628
+ pageY - // The absolute mouse position
14629
+ this.offset.click.top - // Click offset (relative to the element)
14630
+ this.offset.relative.top - // Only for relative positioned nodes: Relative offset from element to offset parent
14631
+ this.offset.parent.top + // The offsetParent's offset without borders (offset + border)
14632
+ ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
14633
+ ),
14634
+ left: (
14635
+ pageX - // The absolute mouse position
14636
+ this.offset.click.left - // Click offset (relative to the element)
14637
+ this.offset.relative.left - // Only for relative positioned nodes: Relative offset from element to offset parent
14638
+ this.offset.parent.left + // The offsetParent's offset without borders (offset + border)
14639
+ ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
14640
+ )
14641
+ };
14642
+
14643
+ },
14644
+
14645
+ _rearrange: function(event, i, a, hardRefresh) {
14646
+
14647
+ a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction === "down" ? i.item[0] : i.item[0].nextSibling));
14648
+
14649
+ //Various things done here to improve the performance:
14650
+ // 1. we create a setTimeout, that calls refreshPositions
14651
+ // 2. on the instance, we have a counter variable, that get's higher after every append
14652
+ // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
14653
+ // 4. this lets only the last addition to the timeout stack through
14654
+ this.counter = this.counter ? ++this.counter : 1;
14655
+ var counter = this.counter;
14656
+
14657
+ this._delay(function() {
14658
+ if(counter === this.counter) {
14659
+ this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
14660
+ }
14661
+ });
14662
+
14663
+ },
14664
+
14665
+ _clear: function(event, noPropagation) {
14666
+
14667
+ this.reverting = false;
14668
+ // We delay all events that have to be triggered to after the point where the placeholder has been removed and
14669
+ // everything else normalized again
14670
+ var i,
14671
+ delayedTriggers = [];
14672
+
14673
+ // We first have to update the dom position of the actual currentItem
14674
+ // Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
14675
+ if(!this._noFinalSort && this.currentItem.parent().length) {
14676
+ this.placeholder.before(this.currentItem);
14677
+ }
14678
+ this._noFinalSort = null;
14679
+
14680
+ if(this.helper[0] === this.currentItem[0]) {
14681
+ for(i in this._storedCSS) {
14682
+ if(this._storedCSS[i] === "auto" || this._storedCSS[i] === "static") {
14683
+ this._storedCSS[i] = "";
14684
+ }
14685
+ }
14686
+ this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
14687
+ } else {
14688
+ this.currentItem.show();
14689
+ }
14690
+
14691
+ if(this.fromOutside && !noPropagation) {
14692
+ delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
14693
+ }
14694
+ if((this.fromOutside || this.domPosition.prev !== this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent !== this.currentItem.parent()[0]) && !noPropagation) {
14695
+ delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
14696
+ }
14697
+
14698
+ // Check if the items Container has Changed and trigger appropriate
14699
+ // events.
14700
+ if (this !== this.currentContainer) {
14701
+ if(!noPropagation) {
14702
+ delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
14703
+ delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); }; }).call(this, this.currentContainer));
14704
+ delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this)); }; }).call(this, this.currentContainer));
14705
+ }
14706
+ }
14707
+
14708
+
14709
+ //Post events to containers
14710
+ function delayEvent( type, instance, container ) {
14711
+ return function( event ) {
14712
+ container._trigger( type, event, instance._uiHash( instance ) );
14713
+ };
14714
+ }
14715
+ for (i = this.containers.length - 1; i >= 0; i--){
14716
+ if (!noPropagation) {
14717
+ delayedTriggers.push( delayEvent( "deactivate", this, this.containers[ i ] ) );
14718
+ }
14719
+ if(this.containers[i].containerCache.over) {
14720
+ delayedTriggers.push( delayEvent( "out", this, this.containers[ i ] ) );
14721
+ this.containers[i].containerCache.over = 0;
14722
+ }
14723
+ }
14724
+
14725
+ //Do what was originally in plugins
14726
+ if ( this.storedCursor ) {
14727
+ this.document.find( "body" ).css( "cursor", this.storedCursor );
14728
+ this.storedStylesheet.remove();
14729
+ }
14730
+ if(this._storedOpacity) {
14731
+ this.helper.css("opacity", this._storedOpacity);
14732
+ }
14733
+ if(this._storedZIndex) {
14734
+ this.helper.css("zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex);
14735
+ }
14736
+
14737
+ this.dragging = false;
14738
+
14739
+ if(!noPropagation) {
14740
+ this._trigger("beforeStop", event, this._uiHash());
14741
+ }
14742
+
14743
+ //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
14744
+ this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
14745
+
14746
+ if ( !this.cancelHelperRemoval ) {
14747
+ if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
14748
+ this.helper.remove();
14749
+ }
14750
+ this.helper = null;
14751
+ }
14752
+
14753
+ if(!noPropagation) {
14754
+ for (i=0; i < delayedTriggers.length; i++) {
14755
+ delayedTriggers[i].call(this, event);
14756
+ } //Trigger all delayed events
14757
+ this._trigger("stop", event, this._uiHash());
14758
+ }
14759
+
14760
+ this.fromOutside = false;
14761
+ return !this.cancelHelperRemoval;
14762
+
14763
+ },
14764
+
14765
+ _trigger: function() {
14766
+ if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
14767
+ this.cancel();
14768
+ }
14769
+ },
14770
+
14771
+ _uiHash: function(_inst) {
14772
+ var inst = _inst || this;
14773
+ return {
14774
+ helper: inst.helper,
14775
+ placeholder: inst.placeholder || $([]),
14776
+ position: inst.position,
14777
+ originalPosition: inst.originalPosition,
14778
+ offset: inst.positionAbs,
14779
+ item: inst.currentItem,
14780
+ sender: _inst ? _inst.element : null
14781
+ };
14782
+ }
14783
+
14784
+ });
14785
+
14786
+
14787
+ /*!
14788
+ * jQuery UI Spinner 1.11.4
14789
+ * http://jqueryui.com
14790
+ *
14791
+ * Copyright jQuery Foundation and other contributors
14792
+ * Released under the MIT license.
14793
+ * http://jquery.org/license
14794
+ *
14795
+ * http://api.jqueryui.com/spinner/
14796
+ */
14797
+
14798
+
14799
+ function spinner_modifier( fn ) {
14800
+ return function() {
14801
+ var previous = this.element.val();
14802
+ fn.apply( this, arguments );
14803
+ this._refresh();
14804
+ if ( previous !== this.element.val() ) {
14805
+ this._trigger( "change" );
14806
+ }
14807
+ };
14808
+ }
14809
+
14810
+ var spinner = $.widget( "ui.spinner", {
14811
+ version: "1.11.4",
14812
+ defaultElement: "<input>",
14813
+ widgetEventPrefix: "spin",
14814
+ options: {
14815
+ culture: null,
14816
+ icons: {
14817
+ down: "ui-icon-triangle-1-s",
14818
+ up: "ui-icon-triangle-1-n"
14819
+ },
14820
+ incremental: true,
14821
+ max: null,
14822
+ min: null,
14823
+ numberFormat: null,
14824
+ page: 10,
14825
+ step: 1,
14826
+
14827
+ change: null,
14828
+ spin: null,
14829
+ start: null,
14830
+ stop: null
14831
+ },
14832
+
14833
+ _create: function() {
14834
+ // handle string values that need to be parsed
14835
+ this._setOption( "max", this.options.max );
14836
+ this._setOption( "min", this.options.min );
14837
+ this._setOption( "step", this.options.step );
14838
+
14839
+ // Only format if there is a value, prevents the field from being marked
14840
+ // as invalid in Firefox, see #9573.
14841
+ if ( this.value() !== "" ) {
14842
+ // Format the value, but don't constrain.
14843
+ this._value( this.element.val(), true );
14844
+ }
14845
+
14846
+ this._draw();
14847
+ this._on( this._events );
14848
+ this._refresh();
14849
+
14850
+ // turning off autocomplete prevents the browser from remembering the
14851
+ // value when navigating through history, so we re-enable autocomplete
14852
+ // if the page is unloaded before the widget is destroyed. #7790
14853
+ this._on( this.window, {
14854
+ beforeunload: function() {
14855
+ this.element.removeAttr( "autocomplete" );
14856
+ }
14857
+ });
14858
+ },
14859
+
14860
+ _getCreateOptions: function() {
14861
+ var options = {},
14862
+ element = this.element;
14863
+
14864
+ $.each( [ "min", "max", "step" ], function( i, option ) {
14865
+ var value = element.attr( option );
14866
+ if ( value !== undefined && value.length ) {
14867
+ options[ option ] = value;
14868
+ }
14869
+ });
14870
+
14871
+ return options;
14872
+ },
14873
+
14874
+ _events: {
14875
+ keydown: function( event ) {
14876
+ if ( this._start( event ) && this._keydown( event ) ) {
14877
+ event.preventDefault();
14878
+ }
14879
+ },
14880
+ keyup: "_stop",
14881
+ focus: function() {
14882
+ this.previous = this.element.val();
14883
+ },
14884
+ blur: function( event ) {
14885
+ if ( this.cancelBlur ) {
14886
+ delete this.cancelBlur;
14887
+ return;
14888
+ }
14889
+
14890
+ this._stop();
14891
+ this._refresh();
14892
+ if ( this.previous !== this.element.val() ) {
14893
+ this._trigger( "change", event );
14894
+ }
14895
+ },
14896
+ mousewheel: function( event, delta ) {
14897
+ if ( !delta ) {
14898
+ return;
14899
+ }
14900
+ if ( !this.spinning && !this._start( event ) ) {
14901
+ return false;
14902
+ }
14903
+
14904
+ this._spin( (delta > 0 ? 1 : -1) * this.options.step, event );
14905
+ clearTimeout( this.mousewheelTimer );
14906
+ this.mousewheelTimer = this._delay(function() {
14907
+ if ( this.spinning ) {
14908
+ this._stop( event );
14909
+ }
14910
+ }, 100 );
14911
+ event.preventDefault();
14912
+ },
14913
+ "mousedown .ui-spinner-button": function( event ) {
14914
+ var previous;
14915
+
14916
+ // We never want the buttons to have focus; whenever the user is
14917
+ // interacting with the spinner, the focus should be on the input.
14918
+ // If the input is focused then this.previous is properly set from
14919
+ // when the input first received focus. If the input is not focused
14920
+ // then we need to set this.previous based on the value before spinning.
14921
+ previous = this.element[0] === this.document[0].activeElement ?
14922
+ this.previous : this.element.val();
14923
+ function checkFocus() {
14924
+ var isActive = this.element[0] === this.document[0].activeElement;
14925
+ if ( !isActive ) {
14926
+ this.element.focus();
14927
+ this.previous = previous;
14928
+ // support: IE
14929
+ // IE sets focus asynchronously, so we need to check if focus
14930
+ // moved off of the input because the user clicked on the button.
14931
+ this._delay(function() {
14932
+ this.previous = previous;
14933
+ });
14934
+ }
14935
+ }
14936
+
14937
+ // ensure focus is on (or stays on) the text field
14938
+ event.preventDefault();
14939
+ checkFocus.call( this );
14940
+
14941
+ // support: IE
14942
+ // IE doesn't prevent moving focus even with event.preventDefault()
14943
+ // so we set a flag to know when we should ignore the blur event
14944
+ // and check (again) if focus moved off of the input.
14945
+ this.cancelBlur = true;
14946
+ this._delay(function() {
14947
+ delete this.cancelBlur;
14948
+ checkFocus.call( this );
14949
+ });
14950
+
14951
+ if ( this._start( event ) === false ) {
14952
+ return;
14953
+ }
14954
+
14955
+ this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event );
14956
+ },
14957
+ "mouseup .ui-spinner-button": "_stop",
14958
+ "mouseenter .ui-spinner-button": function( event ) {
14959
+ // button will add ui-state-active if mouse was down while mouseleave and kept down
14960
+ if ( !$( event.currentTarget ).hasClass( "ui-state-active" ) ) {
14961
+ return;
14962
+ }
14963
+
14964
+ if ( this._start( event ) === false ) {
14965
+ return false;
14966
+ }
14967
+ this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event );
14968
+ },
14969
+ // TODO: do we really want to consider this a stop?
14970
+ // shouldn't we just stop the repeater and wait until mouseup before
14971
+ // we trigger the stop event?
14972
+ "mouseleave .ui-spinner-button": "_stop"
14973
+ },
14974
+
14975
+ _draw: function() {
14976
+ var uiSpinner = this.uiSpinner = this.element
14977
+ .addClass( "ui-spinner-input" )
14978
+ .attr( "autocomplete", "off" )
14979
+ .wrap( this._uiSpinnerHtml() )
14980
+ .parent()
14981
+ // add buttons
14982
+ .append( this._buttonHtml() );
14983
+
14984
+ this.element.attr( "role", "spinbutton" );
14985
+
14986
+ // button bindings
14987
+ this.buttons = uiSpinner.find( ".ui-spinner-button" )
14988
+ .attr( "tabIndex", -1 )
14989
+ .button()
14990
+ .removeClass( "ui-corner-all" );
14991
+
14992
+ // IE 6 doesn't understand height: 50% for the buttons
14993
+ // unless the wrapper has an explicit height
14994
+ if ( this.buttons.height() > Math.ceil( uiSpinner.height() * 0.5 ) &&
14995
+ uiSpinner.height() > 0 ) {
14996
+ uiSpinner.height( uiSpinner.height() );
14997
+ }
14998
+
14999
+ // disable spinner if element was already disabled
15000
+ if ( this.options.disabled ) {
15001
+ this.disable();
15002
+ }
15003
+ },
15004
+
15005
+ _keydown: function( event ) {
15006
+ var options = this.options,
15007
+ keyCode = $.ui.keyCode;
15008
+
15009
+ switch ( event.keyCode ) {
15010
+ case keyCode.UP:
15011
+ this._repeat( null, 1, event );
15012
+ return true;
15013
+ case keyCode.DOWN:
15014
+ this._repeat( null, -1, event );
15015
+ return true;
15016
+ case keyCode.PAGE_UP:
15017
+ this._repeat( null, options.page, event );
15018
+ return true;
15019
+ case keyCode.PAGE_DOWN:
15020
+ this._repeat( null, -options.page, event );
15021
+ return true;
15022
+ }
15023
+
15024
+ return false;
15025
+ },
15026
+
15027
+ _uiSpinnerHtml: function() {
15028
+ return "<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>";
15029
+ },
15030
+
15031
+ _buttonHtml: function() {
15032
+ return "" +
15033
+ "<a class='ui-spinner-button ui-spinner-up ui-corner-tr'>" +
15034
+ "<span class='ui-icon " + this.options.icons.up + "'>&#9650;</span>" +
15035
+ "</a>" +
15036
+ "<a class='ui-spinner-button ui-spinner-down ui-corner-br'>" +
15037
+ "<span class='ui-icon " + this.options.icons.down + "'>&#9660;</span>" +
15038
+ "</a>";
15039
+ },
15040
+
15041
+ _start: function( event ) {
15042
+ if ( !this.spinning && this._trigger( "start", event ) === false ) {
15043
+ return false;
15044
+ }
15045
+
15046
+ if ( !this.counter ) {
15047
+ this.counter = 1;
15048
+ }
15049
+ this.spinning = true;
15050
+ return true;
15051
+ },
15052
+
15053
+ _repeat: function( i, steps, event ) {
15054
+ i = i || 500;
15055
+
15056
+ clearTimeout( this.timer );
15057
+ this.timer = this._delay(function() {
15058
+ this._repeat( 40, steps, event );
15059
+ }, i );
15060
+
15061
+ this._spin( steps * this.options.step, event );
15062
+ },
15063
+
15064
+ _spin: function( step, event ) {
15065
+ var value = this.value() || 0;
15066
+
15067
+ if ( !this.counter ) {
15068
+ this.counter = 1;
15069
+ }
15070
+
15071
+ value = this._adjustValue( value + step * this._increment( this.counter ) );
15072
+
15073
+ if ( !this.spinning || this._trigger( "spin", event, { value: value } ) !== false) {
15074
+ this._value( value );
15075
+ this.counter++;
15076
+ }
15077
+ },
15078
+
15079
+ _increment: function( i ) {
15080
+ var incremental = this.options.incremental;
15081
+
15082
+ if ( incremental ) {
15083
+ return $.isFunction( incremental ) ?
15084
+ incremental( i ) :
15085
+ Math.floor( i * i * i / 50000 - i * i / 500 + 17 * i / 200 + 1 );
15086
+ }
15087
+
15088
+ return 1;
15089
+ },
15090
+
15091
+ _precision: function() {
15092
+ var precision = this._precisionOf( this.options.step );
15093
+ if ( this.options.min !== null ) {
15094
+ precision = Math.max( precision, this._precisionOf( this.options.min ) );
15095
+ }
15096
+ return precision;
15097
+ },
15098
+
15099
+ _precisionOf: function( num ) {
15100
+ var str = num.toString(),
15101
+ decimal = str.indexOf( "." );
15102
+ return decimal === -1 ? 0 : str.length - decimal - 1;
15103
+ },
15104
+
15105
+ _adjustValue: function( value ) {
15106
+ var base, aboveMin,
15107
+ options = this.options;
15108
+
15109
+ // make sure we're at a valid step
15110
+ // - find out where we are relative to the base (min or 0)
15111
+ base = options.min !== null ? options.min : 0;
15112
+ aboveMin = value - base;
15113
+ // - round to the nearest step
15114
+ aboveMin = Math.round(aboveMin / options.step) * options.step;
15115
+ // - rounding is based on 0, so adjust back to our base
15116
+ value = base + aboveMin;
15117
+
15118
+ // fix precision from bad JS floating point math
15119
+ value = parseFloat( value.toFixed( this._precision() ) );
15120
+
15121
+ // clamp the value
15122
+ if ( options.max !== null && value > options.max) {
15123
+ return options.max;
15124
+ }
15125
+ if ( options.min !== null && value < options.min ) {
15126
+ return options.min;
15127
+ }
15128
+
15129
+ return value;
15130
+ },
15131
+
15132
+ _stop: function( event ) {
15133
+ if ( !this.spinning ) {
15134
+ return;
15135
+ }
15136
+
15137
+ clearTimeout( this.timer );
15138
+ clearTimeout( this.mousewheelTimer );
15139
+ this.counter = 0;
15140
+ this.spinning = false;
15141
+ this._trigger( "stop", event );
15142
+ },
15143
+
15144
+ _setOption: function( key, value ) {
15145
+ if ( key === "culture" || key === "numberFormat" ) {
15146
+ var prevValue = this._parse( this.element.val() );
15147
+ this.options[ key ] = value;
15148
+ this.element.val( this._format( prevValue ) );
15149
+ return;
15150
+ }
15151
+
15152
+ if ( key === "max" || key === "min" || key === "step" ) {
15153
+ if ( typeof value === "string" ) {
15154
+ value = this._parse( value );
15155
+ }
15156
+ }
15157
+ if ( key === "icons" ) {
15158
+ this.buttons.first().find( ".ui-icon" )
15159
+ .removeClass( this.options.icons.up )
15160
+ .addClass( value.up );
15161
+ this.buttons.last().find( ".ui-icon" )
15162
+ .removeClass( this.options.icons.down )
15163
+ .addClass( value.down );
15164
+ }
15165
+
15166
+ this._super( key, value );
15167
+
15168
+ if ( key === "disabled" ) {
15169
+ this.widget().toggleClass( "ui-state-disabled", !!value );
15170
+ this.element.prop( "disabled", !!value );
15171
+ this.buttons.button( value ? "disable" : "enable" );
15172
+ }
15173
+ },
15174
+
15175
+ _setOptions: spinner_modifier(function( options ) {
15176
+ this._super( options );
15177
+ }),
15178
+
15179
+ _parse: function( val ) {
15180
+ if ( typeof val === "string" && val !== "" ) {
15181
+ val = window.Globalize && this.options.numberFormat ?
15182
+ Globalize.parseFloat( val, 10, this.options.culture ) : +val;
15183
+ }
15184
+ return val === "" || isNaN( val ) ? null : val;
15185
+ },
15186
+
15187
+ _format: function( value ) {
15188
+ if ( value === "" ) {
15189
+ return "";
15190
+ }
15191
+ return window.Globalize && this.options.numberFormat ?
15192
+ Globalize.format( value, this.options.numberFormat, this.options.culture ) :
15193
+ value;
15194
+ },
15195
+
15196
+ _refresh: function() {
15197
+ this.element.attr({
15198
+ "aria-valuemin": this.options.min,
15199
+ "aria-valuemax": this.options.max,
15200
+ // TODO: what should we do with values that can't be parsed?
15201
+ "aria-valuenow": this._parse( this.element.val() )
15202
+ });
15203
+ },
15204
+
15205
+ isValid: function() {
15206
+ var value = this.value();
15207
+
15208
+ // null is invalid
15209
+ if ( value === null ) {
15210
+ return false;
15211
+ }
15212
+
15213
+ // if value gets adjusted, it's invalid
15214
+ return value === this._adjustValue( value );
15215
+ },
15216
+
15217
+ // update the value without triggering change
15218
+ _value: function( value, allowAny ) {
15219
+ var parsed;
15220
+ if ( value !== "" ) {
15221
+ parsed = this._parse( value );
15222
+ if ( parsed !== null ) {
15223
+ if ( !allowAny ) {
15224
+ parsed = this._adjustValue( parsed );
15225
+ }
15226
+ value = this._format( parsed );
15227
+ }
15228
+ }
15229
+ this.element.val( value );
15230
+ this._refresh();
15231
+ },
15232
+
15233
+ _destroy: function() {
15234
+ this.element
15235
+ .removeClass( "ui-spinner-input" )
15236
+ .prop( "disabled", false )
15237
+ .removeAttr( "autocomplete" )
15238
+ .removeAttr( "role" )
15239
+ .removeAttr( "aria-valuemin" )
15240
+ .removeAttr( "aria-valuemax" )
15241
+ .removeAttr( "aria-valuenow" );
15242
+ this.uiSpinner.replaceWith( this.element );
15243
+ },
15244
+
15245
+ stepUp: spinner_modifier(function( steps ) {
15246
+ this._stepUp( steps );
15247
+ }),
15248
+ _stepUp: function( steps ) {
15249
+ if ( this._start() ) {
15250
+ this._spin( (steps || 1) * this.options.step );
15251
+ this._stop();
15252
+ }
15253
+ },
15254
+
15255
+ stepDown: spinner_modifier(function( steps ) {
15256
+ this._stepDown( steps );
15257
+ }),
15258
+ _stepDown: function( steps ) {
15259
+ if ( this._start() ) {
15260
+ this._spin( (steps || 1) * -this.options.step );
15261
+ this._stop();
15262
+ }
15263
+ },
15264
+
15265
+ pageUp: spinner_modifier(function( pages ) {
15266
+ this._stepUp( (pages || 1) * this.options.page );
15267
+ }),
15268
+
15269
+ pageDown: spinner_modifier(function( pages ) {
15270
+ this._stepDown( (pages || 1) * this.options.page );
15271
+ }),
15272
+
15273
+ value: function( newVal ) {
15274
+ if ( !arguments.length ) {
15275
+ return this._parse( this.element.val() );
15276
+ }
15277
+ spinner_modifier( this._value ).call( this, newVal );
15278
+ },
15279
+
15280
+ widget: function() {
15281
+ return this.uiSpinner;
15282
+ }
15283
+ });
15284
+
15285
+
15286
+ /*!
15287
+ * jQuery UI Tabs 1.11.4
15288
+ * http://jqueryui.com
15289
+ *
15290
+ * Copyright jQuery Foundation and other contributors
15291
+ * Released under the MIT license.
15292
+ * http://jquery.org/license
15293
+ *
15294
+ * http://api.jqueryui.com/tabs/
15295
+ */
15296
+
15297
+
15298
+ var tabs = $.widget( "ui.tabs", {
15299
+ version: "1.11.4",
15300
+ delay: 300,
15301
+ options: {
15302
+ active: null,
15303
+ collapsible: false,
15304
+ event: "click",
15305
+ heightStyle: "content",
15306
+ hide: null,
15307
+ show: null,
15308
+
15309
+ // callbacks
15310
+ activate: null,
15311
+ beforeActivate: null,
15312
+ beforeLoad: null,
15313
+ load: null
15314
+ },
15315
+
15316
+ _isLocal: (function() {
15317
+ var rhash = /#.*$/;
15318
+
15319
+ return function( anchor ) {
15320
+ var anchorUrl, locationUrl;
15321
+
15322
+ // support: IE7
15323
+ // IE7 doesn't normalize the href property when set via script (#9317)
15324
+ anchor = anchor.cloneNode( false );
15325
+
15326
+ anchorUrl = anchor.href.replace( rhash, "" );
15327
+ locationUrl = location.href.replace( rhash, "" );
15328
+
15329
+ // decoding may throw an error if the URL isn't UTF-8 (#9518)
15330
+ try {
15331
+ anchorUrl = decodeURIComponent( anchorUrl );
15332
+ } catch ( error ) {}
15333
+ try {
15334
+ locationUrl = decodeURIComponent( locationUrl );
15335
+ } catch ( error ) {}
15336
+
15337
+ return anchor.hash.length > 1 && anchorUrl === locationUrl;
15338
+ };
15339
+ })(),
15340
+
15341
+ _create: function() {
15342
+ var that = this,
15343
+ options = this.options;
15344
+
15345
+ this.running = false;
15346
+
15347
+ this.element
15348
+ .addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" )
15349
+ .toggleClass( "ui-tabs-collapsible", options.collapsible );
15350
+
15351
+ this._processTabs();
15352
+ options.active = this._initialActive();
15353
+
15354
+ // Take disabling tabs via class attribute from HTML
15355
+ // into account and update option properly.
15356
+ if ( $.isArray( options.disabled ) ) {
15357
+ options.disabled = $.unique( options.disabled.concat(
15358
+ $.map( this.tabs.filter( ".ui-state-disabled" ), function( li ) {
15359
+ return that.tabs.index( li );
15360
+ })
15361
+ ) ).sort();
15362
+ }
15363
+
15364
+ // check for length avoids error when initializing empty list
15365
+ if ( this.options.active !== false && this.anchors.length ) {
15366
+ this.active = this._findActive( options.active );
15367
+ } else {
15368
+ this.active = $();
15369
+ }
15370
+
15371
+ this._refresh();
15372
+
15373
+ if ( this.active.length ) {
15374
+ this.load( options.active );
15375
+ }
15376
+ },
15377
+
15378
+ _initialActive: function() {
15379
+ var active = this.options.active,
15380
+ collapsible = this.options.collapsible,
15381
+ locationHash = location.hash.substring( 1 );
15382
+
15383
+ if ( active === null ) {
15384
+ // check the fragment identifier in the URL
15385
+ if ( locationHash ) {
15386
+ this.tabs.each(function( i, tab ) {
15387
+ if ( $( tab ).attr( "aria-controls" ) === locationHash ) {
15388
+ active = i;
15389
+ return false;
15390
+ }
15391
+ });
15392
+ }
15393
+
15394
+ // check for a tab marked active via a class
15395
+ if ( active === null ) {
15396
+ active = this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) );
15397
+ }
15398
+
15399
+ // no active tab, set to false
15400
+ if ( active === null || active === -1 ) {
15401
+ active = this.tabs.length ? 0 : false;
15402
+ }
15403
+ }
15404
+
15405
+ // handle numbers: negative, out of range
15406
+ if ( active !== false ) {
15407
+ active = this.tabs.index( this.tabs.eq( active ) );
15408
+ if ( active === -1 ) {
15409
+ active = collapsible ? false : 0;
15410
+ }
15411
+ }
15412
+
15413
+ // don't allow collapsible: false and active: false
15414
+ if ( !collapsible && active === false && this.anchors.length ) {
15415
+ active = 0;
15416
+ }
15417
+
15418
+ return active;
15419
+ },
15420
+
15421
+ _getCreateEventData: function() {
15422
+ return {
15423
+ tab: this.active,
15424
+ panel: !this.active.length ? $() : this._getPanelForTab( this.active )
15425
+ };
15426
+ },
15427
+
15428
+ _tabKeydown: function( event ) {
15429
+ var focusedTab = $( this.document[0].activeElement ).closest( "li" ),
15430
+ selectedIndex = this.tabs.index( focusedTab ),
15431
+ goingForward = true;
15432
+
15433
+ if ( this._handlePageNav( event ) ) {
15434
+ return;
15435
+ }
15436
+
15437
+ switch ( event.keyCode ) {
15438
+ case $.ui.keyCode.RIGHT:
15439
+ case $.ui.keyCode.DOWN:
15440
+ selectedIndex++;
15441
+ break;
15442
+ case $.ui.keyCode.UP:
15443
+ case $.ui.keyCode.LEFT:
15444
+ goingForward = false;
15445
+ selectedIndex--;
15446
+ break;
15447
+ case $.ui.keyCode.END:
15448
+ selectedIndex = this.anchors.length - 1;
15449
+ break;
15450
+ case $.ui.keyCode.HOME:
15451
+ selectedIndex = 0;
15452
+ break;
15453
+ case $.ui.keyCode.SPACE:
15454
+ // Activate only, no collapsing
15455
+ event.preventDefault();
15456
+ clearTimeout( this.activating );
15457
+ this._activate( selectedIndex );
15458
+ return;
15459
+ case $.ui.keyCode.ENTER:
15460
+ // Toggle (cancel delayed activation, allow collapsing)
15461
+ event.preventDefault();
15462
+ clearTimeout( this.activating );
15463
+ // Determine if we should collapse or activate
15464
+ this._activate( selectedIndex === this.options.active ? false : selectedIndex );
15465
+ return;
15466
+ default:
15467
+ return;
15468
+ }
15469
+
15470
+ // Focus the appropriate tab, based on which key was pressed
15471
+ event.preventDefault();
15472
+ clearTimeout( this.activating );
15473
+ selectedIndex = this._focusNextTab( selectedIndex, goingForward );
15474
+
15475
+ // Navigating with control/command key will prevent automatic activation
15476
+ if ( !event.ctrlKey && !event.metaKey ) {
15477
+
15478
+ // Update aria-selected immediately so that AT think the tab is already selected.
15479
+ // Otherwise AT may confuse the user by stating that they need to activate the tab,
15480
+ // but the tab will already be activated by the time the announcement finishes.
15481
+ focusedTab.attr( "aria-selected", "false" );
15482
+ this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" );
15483
+
15484
+ this.activating = this._delay(function() {
15485
+ this.option( "active", selectedIndex );
15486
+ }, this.delay );
15487
+ }
15488
+ },
15489
+
15490
+ _panelKeydown: function( event ) {
15491
+ if ( this._handlePageNav( event ) ) {
15492
+ return;
15493
+ }
15494
+
15495
+ // Ctrl+up moves focus to the current tab
15496
+ if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {
15497
+ event.preventDefault();
15498
+ this.active.focus();
15499
+ }
15500
+ },
15501
+
15502
+ // Alt+page up/down moves focus to the previous/next tab (and activates)
15503
+ _handlePageNav: function( event ) {
15504
+ if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {
15505
+ this._activate( this._focusNextTab( this.options.active - 1, false ) );
15506
+ return true;
15507
+ }
15508
+ if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {
15509
+ this._activate( this._focusNextTab( this.options.active + 1, true ) );
15510
+ return true;
15511
+ }
15512
+ },
15513
+
15514
+ _findNextTab: function( index, goingForward ) {
15515
+ var lastTabIndex = this.tabs.length - 1;
15516
+
15517
+ function constrain() {
15518
+ if ( index > lastTabIndex ) {
15519
+ index = 0;
15520
+ }
15521
+ if ( index < 0 ) {
15522
+ index = lastTabIndex;
15523
+ }
15524
+ return index;
15525
+ }
15526
+
15527
+ while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {
15528
+ index = goingForward ? index + 1 : index - 1;
15529
+ }
15530
+
15531
+ return index;
15532
+ },
15533
+
15534
+ _focusNextTab: function( index, goingForward ) {
15535
+ index = this._findNextTab( index, goingForward );
15536
+ this.tabs.eq( index ).focus();
15537
+ return index;
15538
+ },
15539
+
15540
+ _setOption: function( key, value ) {
15541
+ if ( key === "active" ) {
15542
+ // _activate() will handle invalid values and update this.options
15543
+ this._activate( value );
15544
+ return;
15545
+ }
15546
+
15547
+ if ( key === "disabled" ) {
15548
+ // don't use the widget factory's disabled handling
15549
+ this._setupDisabled( value );
15550
+ return;
15551
+ }
15552
+
15553
+ this._super( key, value);
15554
+
15555
+ if ( key === "collapsible" ) {
15556
+ this.element.toggleClass( "ui-tabs-collapsible", value );
15557
+ // Setting collapsible: false while collapsed; open first panel
15558
+ if ( !value && this.options.active === false ) {
15559
+ this._activate( 0 );
15560
+ }
15561
+ }
15562
+
15563
+ if ( key === "event" ) {
15564
+ this._setupEvents( value );
15565
+ }
15566
+
15567
+ if ( key === "heightStyle" ) {
15568
+ this._setupHeightStyle( value );
15569
+ }
15570
+ },
15571
+
15572
+ _sanitizeSelector: function( hash ) {
15573
+ return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : "";
15574
+ },
15575
+
15576
+ refresh: function() {
15577
+ var options = this.options,
15578
+ lis = this.tablist.children( ":has(a[href])" );
15579
+
15580
+ // get disabled tabs from class attribute from HTML
15581
+ // this will get converted to a boolean if needed in _refresh()
15582
+ options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( tab ) {
15583
+ return lis.index( tab );
15584
+ });
15585
+
15586
+ this._processTabs();
15587
+
15588
+ // was collapsed or no tabs
15589
+ if ( options.active === false || !this.anchors.length ) {
15590
+ options.active = false;
15591
+ this.active = $();
15592
+ // was active, but active tab is gone
15593
+ } else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {
15594
+ // all remaining tabs are disabled
15595
+ if ( this.tabs.length === options.disabled.length ) {
15596
+ options.active = false;
15597
+ this.active = $();
15598
+ // activate previous tab
15599
+ } else {
15600
+ this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );
15601
+ }
15602
+ // was active, active tab still exists
15603
+ } else {
15604
+ // make sure active index is correct
15605
+ options.active = this.tabs.index( this.active );
15606
+ }
15607
+
15608
+ this._refresh();
15609
+ },
15610
+
15611
+ _refresh: function() {
15612
+ this._setupDisabled( this.options.disabled );
15613
+ this._setupEvents( this.options.event );
15614
+ this._setupHeightStyle( this.options.heightStyle );
15615
+
15616
+ this.tabs.not( this.active ).attr({
15617
+ "aria-selected": "false",
15618
+ "aria-expanded": "false",
15619
+ tabIndex: -1
15620
+ });
15621
+ this.panels.not( this._getPanelForTab( this.active ) )
15622
+ .hide()
15623
+ .attr({
15624
+ "aria-hidden": "true"
15625
+ });
15626
+
15627
+ // Make sure one tab is in the tab order
15628
+ if ( !this.active.length ) {
15629
+ this.tabs.eq( 0 ).attr( "tabIndex", 0 );
15630
+ } else {
15631
+ this.active
15632
+ .addClass( "ui-tabs-active ui-state-active" )
15633
+ .attr({
15634
+ "aria-selected": "true",
15635
+ "aria-expanded": "true",
15636
+ tabIndex: 0
15637
+ });
15638
+ this._getPanelForTab( this.active )
15639
+ .show()
15640
+ .attr({
15641
+ "aria-hidden": "false"
15642
+ });
15643
+ }
15644
+ },
15645
+
15646
+ _processTabs: function() {
15647
+ var that = this,
15648
+ prevTabs = this.tabs,
15649
+ prevAnchors = this.anchors,
15650
+ prevPanels = this.panels;
15651
+
15652
+ this.tablist = this._getList()
15653
+ .addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
15654
+ .attr( "role", "tablist" )
15655
+
15656
+ // Prevent users from focusing disabled tabs via click
15657
+ .delegate( "> li", "mousedown" + this.eventNamespace, function( event ) {
15658
+ if ( $( this ).is( ".ui-state-disabled" ) ) {
15659
+ event.preventDefault();
15660
+ }
15661
+ })
15662
+
15663
+ // support: IE <9
15664
+ // Preventing the default action in mousedown doesn't prevent IE
15665
+ // from focusing the element, so if the anchor gets focused, blur.
15666
+ // We don't have to worry about focusing the previously focused
15667
+ // element since clicking on a non-focusable element should focus
15668
+ // the body anyway.
15669
+ .delegate( ".ui-tabs-anchor", "focus" + this.eventNamespace, function() {
15670
+ if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) {
15671
+ this.blur();
15672
+ }
15673
+ });
15674
+
15675
+ this.tabs = this.tablist.find( "> li:has(a[href])" )
15676
+ .addClass( "ui-state-default ui-corner-top" )
15677
+ .attr({
15678
+ role: "tab",
15679
+ tabIndex: -1
15680
+ });
15681
+
15682
+ this.anchors = this.tabs.map(function() {
15683
+ return $( "a", this )[ 0 ];
15684
+ })
15685
+ .addClass( "ui-tabs-anchor" )
15686
+ .attr({
15687
+ role: "presentation",
15688
+ tabIndex: -1
15689
+ });
15690
+
15691
+ this.panels = $();
15692
+
15693
+ this.anchors.each(function( i, anchor ) {
15694
+ var selector, panel, panelId,
15695
+ anchorId = $( anchor ).uniqueId().attr( "id" ),
15696
+ tab = $( anchor ).closest( "li" ),
15697
+ originalAriaControls = tab.attr( "aria-controls" );
15698
+
15699
+ // inline tab
15700
+ if ( that._isLocal( anchor ) ) {
15701
+ selector = anchor.hash;
15702
+ panelId = selector.substring( 1 );
15703
+ panel = that.element.find( that._sanitizeSelector( selector ) );
15704
+ // remote tab
15705
+ } else {
15706
+ // If the tab doesn't already have aria-controls,
15707
+ // generate an id by using a throw-away element
15708
+ panelId = tab.attr( "aria-controls" ) || $( {} ).uniqueId()[ 0 ].id;
15709
+ selector = "#" + panelId;
15710
+ panel = that.element.find( selector );
15711
+ if ( !panel.length ) {
15712
+ panel = that._createPanel( panelId );
15713
+ panel.insertAfter( that.panels[ i - 1 ] || that.tablist );
15714
+ }
15715
+ panel.attr( "aria-live", "polite" );
15716
+ }
15717
+
15718
+ if ( panel.length) {
15719
+ that.panels = that.panels.add( panel );
15720
+ }
15721
+ if ( originalAriaControls ) {
15722
+ tab.data( "ui-tabs-aria-controls", originalAriaControls );
15723
+ }
15724
+ tab.attr({
15725
+ "aria-controls": panelId,
15726
+ "aria-labelledby": anchorId
15727
+ });
15728
+ panel.attr( "aria-labelledby", anchorId );
15729
+ });
15730
+
15731
+ this.panels
15732
+ .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
15733
+ .attr( "role", "tabpanel" );
15734
+
15735
+ // Avoid memory leaks (#10056)
15736
+ if ( prevTabs ) {
15737
+ this._off( prevTabs.not( this.tabs ) );
15738
+ this._off( prevAnchors.not( this.anchors ) );
15739
+ this._off( prevPanels.not( this.panels ) );
15740
+ }
15741
+ },
15742
+
15743
+ // allow overriding how to find the list for rare usage scenarios (#7715)
15744
+ _getList: function() {
15745
+ return this.tablist || this.element.find( "ol,ul" ).eq( 0 );
15746
+ },
15747
+
15748
+ _createPanel: function( id ) {
15749
+ return $( "<div>" )
15750
+ .attr( "id", id )
15751
+ .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
15752
+ .data( "ui-tabs-destroy", true );
15753
+ },
15754
+
15755
+ _setupDisabled: function( disabled ) {
15756
+ if ( $.isArray( disabled ) ) {
15757
+ if ( !disabled.length ) {
15758
+ disabled = false;
15759
+ } else if ( disabled.length === this.anchors.length ) {
15760
+ disabled = true;
15761
+ }
15762
+ }
15763
+
15764
+ // disable tabs
15765
+ for ( var i = 0, li; ( li = this.tabs[ i ] ); i++ ) {
15766
+ if ( disabled === true || $.inArray( i, disabled ) !== -1 ) {
15767
+ $( li )
15768
+ .addClass( "ui-state-disabled" )
15769
+ .attr( "aria-disabled", "true" );
15770
+ } else {
15771
+ $( li )
15772
+ .removeClass( "ui-state-disabled" )
15773
+ .removeAttr( "aria-disabled" );
15774
+ }
15775
+ }
15776
+
15777
+ this.options.disabled = disabled;
15778
+ },
15779
+
15780
+ _setupEvents: function( event ) {
15781
+ var events = {};
15782
+ if ( event ) {
15783
+ $.each( event.split(" "), function( index, eventName ) {
15784
+ events[ eventName ] = "_eventHandler";
15785
+ });
15786
+ }
15787
+
15788
+ this._off( this.anchors.add( this.tabs ).add( this.panels ) );
15789
+ // Always prevent the default action, even when disabled
15790
+ this._on( true, this.anchors, {
15791
+ click: function( event ) {
15792
+ event.preventDefault();
15793
+ }
15794
+ });
15795
+ this._on( this.anchors, events );
15796
+ this._on( this.tabs, { keydown: "_tabKeydown" } );
15797
+ this._on( this.panels, { keydown: "_panelKeydown" } );
15798
+
15799
+ this._focusable( this.tabs );
15800
+ this._hoverable( this.tabs );
15801
+ },
15802
+
15803
+ _setupHeightStyle: function( heightStyle ) {
15804
+ var maxHeight,
15805
+ parent = this.element.parent();
15806
+
15807
+ if ( heightStyle === "fill" ) {
15808
+ maxHeight = parent.height();
15809
+ maxHeight -= this.element.outerHeight() - this.element.height();
15810
+
15811
+ this.element.siblings( ":visible" ).each(function() {
15812
+ var elem = $( this ),
15813
+ position = elem.css( "position" );
15814
+
15815
+ if ( position === "absolute" || position === "fixed" ) {
15816
+ return;
15817
+ }
15818
+ maxHeight -= elem.outerHeight( true );
15819
+ });
15820
+
15821
+ this.element.children().not( this.panels ).each(function() {
15822
+ maxHeight -= $( this ).outerHeight( true );
15823
+ });
15824
+
15825
+ this.panels.each(function() {
15826
+ $( this ).height( Math.max( 0, maxHeight -
15827
+ $( this ).innerHeight() + $( this ).height() ) );
15828
+ })
15829
+ .css( "overflow", "auto" );
15830
+ } else if ( heightStyle === "auto" ) {
15831
+ maxHeight = 0;
15832
+ this.panels.each(function() {
15833
+ maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
15834
+ }).height( maxHeight );
15835
+ }
15836
+ },
15837
+
15838
+ _eventHandler: function( event ) {
15839
+ var options = this.options,
15840
+ active = this.active,
15841
+ anchor = $( event.currentTarget ),
15842
+ tab = anchor.closest( "li" ),
15843
+ clickedIsActive = tab[ 0 ] === active[ 0 ],
15844
+ collapsing = clickedIsActive && options.collapsible,
15845
+ toShow = collapsing ? $() : this._getPanelForTab( tab ),
15846
+ toHide = !active.length ? $() : this._getPanelForTab( active ),
15847
+ eventData = {
15848
+ oldTab: active,
15849
+ oldPanel: toHide,
15850
+ newTab: collapsing ? $() : tab,
15851
+ newPanel: toShow
15852
+ };
15853
+
15854
+ event.preventDefault();
15855
+
15856
+ if ( tab.hasClass( "ui-state-disabled" ) ||
15857
+ // tab is already loading
15858
+ tab.hasClass( "ui-tabs-loading" ) ||
15859
+ // can't switch durning an animation
15860
+ this.running ||
15861
+ // click on active header, but not collapsible
15862
+ ( clickedIsActive && !options.collapsible ) ||
15863
+ // allow canceling activation
15864
+ ( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
15865
+ return;
15866
+ }
15867
+
15868
+ options.active = collapsing ? false : this.tabs.index( tab );
15869
+
15870
+ this.active = clickedIsActive ? $() : tab;
15871
+ if ( this.xhr ) {
15872
+ this.xhr.abort();
15873
+ }
15874
+
15875
+ if ( !toHide.length && !toShow.length ) {
15876
+ $.error( "jQuery UI Tabs: Mismatching fragment identifier." );
15877
+ }
15878
+
15879
+ if ( toShow.length ) {
15880
+ this.load( this.tabs.index( tab ), event );
15881
+ }
15882
+ this._toggle( event, eventData );
15883
+ },
15884
+
15885
+ // handles show/hide for selecting tabs
15886
+ _toggle: function( event, eventData ) {
15887
+ var that = this,
15888
+ toShow = eventData.newPanel,
15889
+ toHide = eventData.oldPanel;
15890
+
15891
+ this.running = true;
15892
+
15893
+ function complete() {
15894
+ that.running = false;
15895
+ that._trigger( "activate", event, eventData );
15896
+ }
15897
+
15898
+ function show() {
15899
+ eventData.newTab.closest( "li" ).addClass( "ui-tabs-active ui-state-active" );
15900
+
15901
+ if ( toShow.length && that.options.show ) {
15902
+ that._show( toShow, that.options.show, complete );
15903
+ } else {
15904
+ toShow.show();
15905
+ complete();
15906
+ }
15907
+ }
15908
+
15909
+ // start out by hiding, then showing, then completing
15910
+ if ( toHide.length && this.options.hide ) {
15911
+ this._hide( toHide, this.options.hide, function() {
15912
+ eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
15913
+ show();
15914
+ });
15915
+ } else {
15916
+ eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
15917
+ toHide.hide();
15918
+ show();
15919
+ }
15920
+
15921
+ toHide.attr( "aria-hidden", "true" );
15922
+ eventData.oldTab.attr({
15923
+ "aria-selected": "false",
15924
+ "aria-expanded": "false"
15925
+ });
15926
+ // If we're switching tabs, remove the old tab from the tab order.
15927
+ // If we're opening from collapsed state, remove the previous tab from the tab order.
15928
+ // If we're collapsing, then keep the collapsing tab in the tab order.
15929
+ if ( toShow.length && toHide.length ) {
15930
+ eventData.oldTab.attr( "tabIndex", -1 );
15931
+ } else if ( toShow.length ) {
15932
+ this.tabs.filter(function() {
15933
+ return $( this ).attr( "tabIndex" ) === 0;
15934
+ })
15935
+ .attr( "tabIndex", -1 );
15936
+ }
15937
+
15938
+ toShow.attr( "aria-hidden", "false" );
15939
+ eventData.newTab.attr({
15940
+ "aria-selected": "true",
15941
+ "aria-expanded": "true",
15942
+ tabIndex: 0
15943
+ });
15944
+ },
15945
+
15946
+ _activate: function( index ) {
15947
+ var anchor,
15948
+ active = this._findActive( index );
15949
+
15950
+ // trying to activate the already active panel
15951
+ if ( active[ 0 ] === this.active[ 0 ] ) {
15952
+ return;
15953
+ }
15954
+
15955
+ // trying to collapse, simulate a click on the current active header
15956
+ if ( !active.length ) {
15957
+ active = this.active;
15958
+ }
15959
+
15960
+ anchor = active.find( ".ui-tabs-anchor" )[ 0 ];
15961
+ this._eventHandler({
15962
+ target: anchor,
15963
+ currentTarget: anchor,
15964
+ preventDefault: $.noop
15965
+ });
15966
+ },
15967
+
15968
+ _findActive: function( index ) {
15969
+ return index === false ? $() : this.tabs.eq( index );
15970
+ },
15971
+
15972
+ _getIndex: function( index ) {
15973
+ // meta-function to give users option to provide a href string instead of a numerical index.
15974
+ if ( typeof index === "string" ) {
15975
+ index = this.anchors.index( this.anchors.filter( "[href$='" + index + "']" ) );
15976
+ }
15977
+
15978
+ return index;
15979
+ },
15980
+
15981
+ _destroy: function() {
15982
+ if ( this.xhr ) {
15983
+ this.xhr.abort();
15984
+ }
15985
+
15986
+ this.element.removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" );
15987
+
15988
+ this.tablist
15989
+ .removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
15990
+ .removeAttr( "role" );
15991
+
15992
+ this.anchors
15993
+ .removeClass( "ui-tabs-anchor" )
15994
+ .removeAttr( "role" )
15995
+ .removeAttr( "tabIndex" )
15996
+ .removeUniqueId();
15997
+
15998
+ this.tablist.unbind( this.eventNamespace );
15999
+
16000
+ this.tabs.add( this.panels ).each(function() {
16001
+ if ( $.data( this, "ui-tabs-destroy" ) ) {
16002
+ $( this ).remove();
16003
+ } else {
16004
+ $( this )
16005
+ .removeClass( "ui-state-default ui-state-active ui-state-disabled " +
16006
+ "ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel" )
16007
+ .removeAttr( "tabIndex" )
16008
+ .removeAttr( "aria-live" )
16009
+ .removeAttr( "aria-busy" )
16010
+ .removeAttr( "aria-selected" )
16011
+ .removeAttr( "aria-labelledby" )
16012
+ .removeAttr( "aria-hidden" )
16013
+ .removeAttr( "aria-expanded" )
16014
+ .removeAttr( "role" );
16015
+ }
16016
+ });
16017
+
16018
+ this.tabs.each(function() {
16019
+ var li = $( this ),
16020
+ prev = li.data( "ui-tabs-aria-controls" );
16021
+ if ( prev ) {
16022
+ li
16023
+ .attr( "aria-controls", prev )
16024
+ .removeData( "ui-tabs-aria-controls" );
16025
+ } else {
16026
+ li.removeAttr( "aria-controls" );
16027
+ }
16028
+ });
16029
+
16030
+ this.panels.show();
16031
+
16032
+ if ( this.options.heightStyle !== "content" ) {
16033
+ this.panels.css( "height", "" );
16034
+ }
16035
+ },
16036
+
16037
+ enable: function( index ) {
16038
+ var disabled = this.options.disabled;
16039
+ if ( disabled === false ) {
16040
+ return;
16041
+ }
16042
+
16043
+ if ( index === undefined ) {
16044
+ disabled = false;
16045
+ } else {
16046
+ index = this._getIndex( index );
16047
+ if ( $.isArray( disabled ) ) {
16048
+ disabled = $.map( disabled, function( num ) {
16049
+ return num !== index ? num : null;
16050
+ });
16051
+ } else {
16052
+ disabled = $.map( this.tabs, function( li, num ) {
16053
+ return num !== index ? num : null;
16054
+ });
16055
+ }
16056
+ }
16057
+ this._setupDisabled( disabled );
16058
+ },
16059
+
16060
+ disable: function( index ) {
16061
+ var disabled = this.options.disabled;
16062
+ if ( disabled === true ) {
16063
+ return;
16064
+ }
16065
+
16066
+ if ( index === undefined ) {
16067
+ disabled = true;
16068
+ } else {
16069
+ index = this._getIndex( index );
16070
+ if ( $.inArray( index, disabled ) !== -1 ) {
16071
+ return;
16072
+ }
16073
+ if ( $.isArray( disabled ) ) {
16074
+ disabled = $.merge( [ index ], disabled ).sort();
16075
+ } else {
16076
+ disabled = [ index ];
16077
+ }
16078
+ }
16079
+ this._setupDisabled( disabled );
16080
+ },
16081
+
16082
+ load: function( index, event ) {
16083
+ index = this._getIndex( index );
16084
+ var that = this,
16085
+ tab = this.tabs.eq( index ),
16086
+ anchor = tab.find( ".ui-tabs-anchor" ),
16087
+ panel = this._getPanelForTab( tab ),
16088
+ eventData = {
16089
+ tab: tab,
16090
+ panel: panel
16091
+ },
16092
+ complete = function( jqXHR, status ) {
16093
+ if ( status === "abort" ) {
16094
+ that.panels.stop( false, true );
16095
+ }
16096
+
16097
+ tab.removeClass( "ui-tabs-loading" );
16098
+ panel.removeAttr( "aria-busy" );
16099
+
16100
+ if ( jqXHR === that.xhr ) {
16101
+ delete that.xhr;
16102
+ }
16103
+ };
16104
+
16105
+ // not remote
16106
+ if ( this._isLocal( anchor[ 0 ] ) ) {
16107
+ return;
16108
+ }
16109
+
16110
+ this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );
16111
+
16112
+ // support: jQuery <1.8
16113
+ // jQuery <1.8 returns false if the request is canceled in beforeSend,
16114
+ // but as of 1.8, $.ajax() always returns a jqXHR object.
16115
+ if ( this.xhr && this.xhr.statusText !== "canceled" ) {
16116
+ tab.addClass( "ui-tabs-loading" );
16117
+ panel.attr( "aria-busy", "true" );
16118
+
16119
+ this.xhr
16120
+ .done(function( response, status, jqXHR ) {
16121
+ // support: jQuery <1.8
16122
+ // http://bugs.jquery.com/ticket/11778
16123
+ setTimeout(function() {
16124
+ panel.html( response );
16125
+ that._trigger( "load", event, eventData );
16126
+
16127
+ complete( jqXHR, status );
16128
+ }, 1 );
16129
+ })
16130
+ .fail(function( jqXHR, status ) {
16131
+ // support: jQuery <1.8
16132
+ // http://bugs.jquery.com/ticket/11778
16133
+ setTimeout(function() {
16134
+ complete( jqXHR, status );
16135
+ }, 1 );
16136
+ });
16137
+ }
16138
+ },
16139
+
16140
+ _ajaxSettings: function( anchor, event, eventData ) {
16141
+ var that = this;
16142
+ return {
16143
+ url: anchor.attr( "href" ),
16144
+ beforeSend: function( jqXHR, settings ) {
16145
+ return that._trigger( "beforeLoad", event,
16146
+ $.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) );
16147
+ }
16148
+ };
16149
+ },
16150
+
16151
+ _getPanelForTab: function( tab ) {
16152
+ var id = $( tab ).attr( "aria-controls" );
16153
+ return this.element.find( this._sanitizeSelector( "#" + id ) );
16154
+ }
16155
+ });
16156
+
16157
+
16158
+ /*!
16159
+ * jQuery UI Tooltip 1.11.4
16160
+ * http://jqueryui.com
16161
+ *
16162
+ * Copyright jQuery Foundation and other contributors
16163
+ * Released under the MIT license.
16164
+ * http://jquery.org/license
16165
+ *
16166
+ * http://api.jqueryui.com/tooltip/
16167
+ */
16168
+
16169
+
16170
+ var tooltip = $.widget( "ui.tooltip", {
16171
+ version: "1.11.4",
16172
+ options: {
16173
+ content: function() {
16174
+ // support: IE<9, Opera in jQuery <1.7
16175
+ // .text() can't accept undefined, so coerce to a string
16176
+ var title = $( this ).attr( "title" ) || "";
16177
+ // Escape title, since we're going from an attribute to raw HTML
16178
+ return $( "<a>" ).text( title ).html();
16179
+ },
16180
+ hide: true,
16181
+ // Disabled elements have inconsistent behavior across browsers (#8661)
16182
+ items: "[title]:not([disabled])",
16183
+ position: {
16184
+ my: "left top+15",
16185
+ at: "left bottom",
16186
+ collision: "flipfit flip"
16187
+ },
16188
+ show: true,
16189
+ tooltipClass: null,
16190
+ track: false,
16191
+
16192
+ // callbacks
16193
+ close: null,
16194
+ open: null
16195
+ },
16196
+
16197
+ _addDescribedBy: function( elem, id ) {
16198
+ var describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ );
16199
+ describedby.push( id );
16200
+ elem
16201
+ .data( "ui-tooltip-id", id )
16202
+ .attr( "aria-describedby", $.trim( describedby.join( " " ) ) );
16203
+ },
16204
+
16205
+ _removeDescribedBy: function( elem ) {
16206
+ var id = elem.data( "ui-tooltip-id" ),
16207
+ describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ ),
16208
+ index = $.inArray( id, describedby );
16209
+
16210
+ if ( index !== -1 ) {
16211
+ describedby.splice( index, 1 );
16212
+ }
16213
+
16214
+ elem.removeData( "ui-tooltip-id" );
16215
+ describedby = $.trim( describedby.join( " " ) );
16216
+ if ( describedby ) {
16217
+ elem.attr( "aria-describedby", describedby );
16218
+ } else {
16219
+ elem.removeAttr( "aria-describedby" );
16220
+ }
16221
+ },
16222
+
16223
+ _create: function() {
16224
+ this._on({
16225
+ mouseover: "open",
16226
+ focusin: "open"
16227
+ });
16228
+
16229
+ // IDs of generated tooltips, needed for destroy
16230
+ this.tooltips = {};
16231
+
16232
+ // IDs of parent tooltips where we removed the title attribute
16233
+ this.parents = {};
16234
+
16235
+ if ( this.options.disabled ) {
16236
+ this._disable();
16237
+ }
16238
+
16239
+ // Append the aria-live region so tooltips announce correctly
16240
+ this.liveRegion = $( "<div>" )
16241
+ .attr({
16242
+ role: "log",
16243
+ "aria-live": "assertive",
16244
+ "aria-relevant": "additions"
16245
+ })
16246
+ .addClass( "ui-helper-hidden-accessible" )
16247
+ .appendTo( this.document[ 0 ].body );
16248
+ },
16249
+
16250
+ _setOption: function( key, value ) {
16251
+ var that = this;
16252
+
16253
+ if ( key === "disabled" ) {
16254
+ this[ value ? "_disable" : "_enable" ]();
16255
+ this.options[ key ] = value;
16256
+ // disable element style changes
16257
+ return;
16258
+ }
16259
+
16260
+ this._super( key, value );
16261
+
16262
+ if ( key === "content" ) {
16263
+ $.each( this.tooltips, function( id, tooltipData ) {
16264
+ that._updateContent( tooltipData.element );
16265
+ });
16266
+ }
16267
+ },
16268
+
16269
+ _disable: function() {
16270
+ var that = this;
16271
+
16272
+ // close open tooltips
16273
+ $.each( this.tooltips, function( id, tooltipData ) {
16274
+ var event = $.Event( "blur" );
16275
+ event.target = event.currentTarget = tooltipData.element[ 0 ];
16276
+ that.close( event, true );
16277
+ });
16278
+
16279
+ // remove title attributes to prevent native tooltips
16280
+ this.element.find( this.options.items ).addBack().each(function() {
16281
+ var element = $( this );
16282
+ if ( element.is( "[title]" ) ) {
16283
+ element
16284
+ .data( "ui-tooltip-title", element.attr( "title" ) )
16285
+ .removeAttr( "title" );
16286
+ }
16287
+ });
16288
+ },
16289
+
16290
+ _enable: function() {
16291
+ // restore title attributes
16292
+ this.element.find( this.options.items ).addBack().each(function() {
16293
+ var element = $( this );
16294
+ if ( element.data( "ui-tooltip-title" ) ) {
16295
+ element.attr( "title", element.data( "ui-tooltip-title" ) );
16296
+ }
16297
+ });
16298
+ },
16299
+
16300
+ open: function( event ) {
16301
+ var that = this,
16302
+ target = $( event ? event.target : this.element )
16303
+ // we need closest here due to mouseover bubbling,
16304
+ // but always pointing at the same event target
16305
+ .closest( this.options.items );
16306
+
16307
+ // No element to show a tooltip for or the tooltip is already open
16308
+ if ( !target.length || target.data( "ui-tooltip-id" ) ) {
16309
+ return;
16310
+ }
16311
+
16312
+ if ( target.attr( "title" ) ) {
16313
+ target.data( "ui-tooltip-title", target.attr( "title" ) );
16314
+ }
16315
+
16316
+ target.data( "ui-tooltip-open", true );
16317
+
16318
+ // kill parent tooltips, custom or native, for hover
16319
+ if ( event && event.type === "mouseover" ) {
16320
+ target.parents().each(function() {
16321
+ var parent = $( this ),
16322
+ blurEvent;
16323
+ if ( parent.data( "ui-tooltip-open" ) ) {
16324
+ blurEvent = $.Event( "blur" );
16325
+ blurEvent.target = blurEvent.currentTarget = this;
16326
+ that.close( blurEvent, true );
16327
+ }
16328
+ if ( parent.attr( "title" ) ) {
16329
+ parent.uniqueId();
16330
+ that.parents[ this.id ] = {
16331
+ element: this,
16332
+ title: parent.attr( "title" )
16333
+ };
16334
+ parent.attr( "title", "" );
16335
+ }
16336
+ });
16337
+ }
16338
+
16339
+ this._registerCloseHandlers( event, target );
16340
+ this._updateContent( target, event );
16341
+ },
16342
+
16343
+ _updateContent: function( target, event ) {
16344
+ var content,
16345
+ contentOption = this.options.content,
16346
+ that = this,
16347
+ eventType = event ? event.type : null;
16348
+
16349
+ if ( typeof contentOption === "string" ) {
16350
+ return this._open( event, target, contentOption );
16351
+ }
16352
+
16353
+ content = contentOption.call( target[0], function( response ) {
16354
+
16355
+ // IE may instantly serve a cached response for ajax requests
16356
+ // delay this call to _open so the other call to _open runs first
16357
+ that._delay(function() {
16358
+
16359
+ // Ignore async response if tooltip was closed already
16360
+ if ( !target.data( "ui-tooltip-open" ) ) {
16361
+ return;
16362
+ }
16363
+
16364
+ // jQuery creates a special event for focusin when it doesn't
16365
+ // exist natively. To improve performance, the native event
16366
+ // object is reused and the type is changed. Therefore, we can't
16367
+ // rely on the type being correct after the event finished
16368
+ // bubbling, so we set it back to the previous value. (#8740)
16369
+ if ( event ) {
16370
+ event.type = eventType;
16371
+ }
16372
+ this._open( event, target, response );
16373
+ });
16374
+ });
16375
+ if ( content ) {
16376
+ this._open( event, target, content );
16377
+ }
16378
+ },
16379
+
16380
+ _open: function( event, target, content ) {
16381
+ var tooltipData, tooltip, delayedShow, a11yContent,
16382
+ positionOption = $.extend( {}, this.options.position );
16383
+
16384
+ if ( !content ) {
16385
+ return;
16386
+ }
16387
+
16388
+ // Content can be updated multiple times. If the tooltip already
16389
+ // exists, then just update the content and bail.
16390
+ tooltipData = this._find( target );
16391
+ if ( tooltipData ) {
16392
+ tooltipData.tooltip.find( ".ui-tooltip-content" ).html( content );
16393
+ return;
16394
+ }
16395
+
16396
+ // if we have a title, clear it to prevent the native tooltip
16397
+ // we have to check first to avoid defining a title if none exists
16398
+ // (we don't want to cause an element to start matching [title])
16399
+ //
16400
+ // We use removeAttr only for key events, to allow IE to export the correct
16401
+ // accessible attributes. For mouse events, set to empty string to avoid
16402
+ // native tooltip showing up (happens only when removing inside mouseover).
16403
+ if ( target.is( "[title]" ) ) {
16404
+ if ( event && event.type === "mouseover" ) {
16405
+ target.attr( "title", "" );
16406
+ } else {
16407
+ target.removeAttr( "title" );
16408
+ }
16409
+ }
16410
+
16411
+ tooltipData = this._tooltip( target );
16412
+ tooltip = tooltipData.tooltip;
16413
+ this._addDescribedBy( target, tooltip.attr( "id" ) );
16414
+ tooltip.find( ".ui-tooltip-content" ).html( content );
16415
+
16416
+ // Support: Voiceover on OS X, JAWS on IE <= 9
16417
+ // JAWS announces deletions even when aria-relevant="additions"
16418
+ // Voiceover will sometimes re-read the entire log region's contents from the beginning
16419
+ this.liveRegion.children().hide();
16420
+ if ( content.clone ) {
16421
+ a11yContent = content.clone();
16422
+ a11yContent.removeAttr( "id" ).find( "[id]" ).removeAttr( "id" );
16423
+ } else {
16424
+ a11yContent = content;
16425
+ }
16426
+ $( "<div>" ).html( a11yContent ).appendTo( this.liveRegion );
16427
+
16428
+ function position( event ) {
16429
+ positionOption.of = event;
16430
+ if ( tooltip.is( ":hidden" ) ) {
16431
+ return;
16432
+ }
16433
+ tooltip.position( positionOption );
16434
+ }
16435
+ if ( this.options.track && event && /^mouse/.test( event.type ) ) {
16436
+ this._on( this.document, {
16437
+ mousemove: position
16438
+ });
16439
+ // trigger once to override element-relative positioning
16440
+ position( event );
16441
+ } else {
16442
+ tooltip.position( $.extend({
16443
+ of: target
16444
+ }, this.options.position ) );
16445
+ }
16446
+
16447
+ tooltip.hide();
16448
+
16449
+ this._show( tooltip, this.options.show );
16450
+ // Handle tracking tooltips that are shown with a delay (#8644). As soon
16451
+ // as the tooltip is visible, position the tooltip using the most recent
16452
+ // event.
16453
+ if ( this.options.show && this.options.show.delay ) {
16454
+ delayedShow = this.delayedShow = setInterval(function() {
16455
+ if ( tooltip.is( ":visible" ) ) {
16456
+ position( positionOption.of );
16457
+ clearInterval( delayedShow );
16458
+ }
16459
+ }, $.fx.interval );
16460
+ }
16461
+
16462
+ this._trigger( "open", event, { tooltip: tooltip } );
16463
+ },
16464
+
16465
+ _registerCloseHandlers: function( event, target ) {
16466
+ var events = {
16467
+ keyup: function( event ) {
16468
+ if ( event.keyCode === $.ui.keyCode.ESCAPE ) {
16469
+ var fakeEvent = $.Event(event);
16470
+ fakeEvent.currentTarget = target[0];
16471
+ this.close( fakeEvent, true );
16472
+ }
16473
+ }
16474
+ };
16475
+
16476
+ // Only bind remove handler for delegated targets. Non-delegated
16477
+ // tooltips will handle this in destroy.
16478
+ if ( target[ 0 ] !== this.element[ 0 ] ) {
16479
+ events.remove = function() {
16480
+ this._removeTooltip( this._find( target ).tooltip );
16481
+ };
16482
+ }
16483
+
16484
+ if ( !event || event.type === "mouseover" ) {
16485
+ events.mouseleave = "close";
16486
+ }
16487
+ if ( !event || event.type === "focusin" ) {
16488
+ events.focusout = "close";
16489
+ }
16490
+ this._on( true, target, events );
16491
+ },
16492
+
16493
+ close: function( event ) {
16494
+ var tooltip,
16495
+ that = this,
16496
+ target = $( event ? event.currentTarget : this.element ),
16497
+ tooltipData = this._find( target );
16498
+
16499
+ // The tooltip may already be closed
16500
+ if ( !tooltipData ) {
16501
+
16502
+ // We set ui-tooltip-open immediately upon open (in open()), but only set the
16503
+ // additional data once there's actually content to show (in _open()). So even if the
16504
+ // tooltip doesn't have full data, we always remove ui-tooltip-open in case we're in
16505
+ // the period between open() and _open().
16506
+ target.removeData( "ui-tooltip-open" );
16507
+ return;
16508
+ }
16509
+
16510
+ tooltip = tooltipData.tooltip;
16511
+
16512
+ // disabling closes the tooltip, so we need to track when we're closing
16513
+ // to avoid an infinite loop in case the tooltip becomes disabled on close
16514
+ if ( tooltipData.closing ) {
16515
+ return;
16516
+ }
16517
+
16518
+ // Clear the interval for delayed tracking tooltips
16519
+ clearInterval( this.delayedShow );
16520
+
16521
+ // only set title if we had one before (see comment in _open())
16522
+ // If the title attribute has changed since open(), don't restore
16523
+ if ( target.data( "ui-tooltip-title" ) && !target.attr( "title" ) ) {
16524
+ target.attr( "title", target.data( "ui-tooltip-title" ) );
16525
+ }
16526
+
16527
+ this._removeDescribedBy( target );
16528
+
16529
+ tooltipData.hiding = true;
16530
+ tooltip.stop( true );
16531
+ this._hide( tooltip, this.options.hide, function() {
16532
+ that._removeTooltip( $( this ) );
16533
+ });
16534
+
16535
+ target.removeData( "ui-tooltip-open" );
16536
+ this._off( target, "mouseleave focusout keyup" );
16537
+
16538
+ // Remove 'remove' binding only on delegated targets
16539
+ if ( target[ 0 ] !== this.element[ 0 ] ) {
16540
+ this._off( target, "remove" );
16541
+ }
16542
+ this._off( this.document, "mousemove" );
16543
+
16544
+ if ( event && event.type === "mouseleave" ) {
16545
+ $.each( this.parents, function( id, parent ) {
16546
+ $( parent.element ).attr( "title", parent.title );
16547
+ delete that.parents[ id ];
16548
+ });
16549
+ }
16550
+
16551
+ tooltipData.closing = true;
16552
+ this._trigger( "close", event, { tooltip: tooltip } );
16553
+ if ( !tooltipData.hiding ) {
16554
+ tooltipData.closing = false;
16555
+ }
16556
+ },
16557
+
16558
+ _tooltip: function( element ) {
16559
+ var tooltip = $( "<div>" )
16560
+ .attr( "role", "tooltip" )
16561
+ .addClass( "ui-tooltip ui-widget ui-corner-all ui-widget-content " +
16562
+ ( this.options.tooltipClass || "" ) ),
16563
+ id = tooltip.uniqueId().attr( "id" );
16564
+
16565
+ $( "<div>" )
16566
+ .addClass( "ui-tooltip-content" )
16567
+ .appendTo( tooltip );
16568
+
16569
+ tooltip.appendTo( this.document[0].body );
16570
+
16571
+ return this.tooltips[ id ] = {
16572
+ element: element,
16573
+ tooltip: tooltip
16574
+ };
16575
+ },
16576
+
16577
+ _find: function( target ) {
16578
+ var id = target.data( "ui-tooltip-id" );
16579
+ return id ? this.tooltips[ id ] : null;
16580
+ },
16581
+
16582
+ _removeTooltip: function( tooltip ) {
16583
+ tooltip.remove();
16584
+ delete this.tooltips[ tooltip.attr( "id" ) ];
16585
+ },
16586
+
16587
+ _destroy: function() {
16588
+ var that = this;
16589
+
16590
+ // close open tooltips
16591
+ $.each( this.tooltips, function( id, tooltipData ) {
16592
+ // Delegate to close method to handle common cleanup
16593
+ var event = $.Event( "blur" ),
16594
+ element = tooltipData.element;
16595
+ event.target = event.currentTarget = element[ 0 ];
16596
+ that.close( event, true );
16597
+
16598
+ // Remove immediately; destroying an open tooltip doesn't use the
16599
+ // hide animation
16600
+ $( "#" + id ).remove();
16601
+
16602
+ // Restore the title
16603
+ if ( element.data( "ui-tooltip-title" ) ) {
16604
+ // If the title attribute has changed since open(), don't restore
16605
+ if ( !element.attr( "title" ) ) {
16606
+ element.attr( "title", element.data( "ui-tooltip-title" ) );
16607
+ }
16608
+ element.removeData( "ui-tooltip-title" );
16609
+ }
16610
+ });
16611
+ this.liveRegion.remove();
16612
+ }
16613
+ });
16614
+
16615
+
16616
+
16617
+ }));