YITH WooCommerce Zoom Magnifier - Version 1.3.8

Version Description

Download this release

Release Info

Developer yithemes
Plugin Icon 128x128 YITH WooCommerce Zoom Magnifier
Version 1.3.8
Comparing to
See all releases

Code changes from version 1.3.7 to 1.3.8

README.txt CHANGED
@@ -1,183 +1,188 @@
1
- === YITH WooCommerce Zoom Magnifier ===
2
-
3
- Contributors: yithemes
4
- Tags: zoom, magnifier, slider, carousel, woocommerce
5
- Requires at least: 4.0
6
- Tested up to: 5.0.2
7
- Stable tag: 1.3.7
8
- License: GPLv2 or later
9
- License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
- Documentation: https://docs.yithemes.com/yith-woocommerce-zoom-magnifier/
11
-
12
- YITH WooCommerce Zoom Magnifier add zoom effect to product images and a customizable image slider.
13
-
14
- == Description ==
15
-
16
- = Improve the user experience, improve your sales =
17
-
18
- Offer to your visitors a chance to inspect in detail the quality of your products. With YITH WooCommerce Zoom Magnifier you can add a zoom effect to all your product images.
19
- The Wordpress plugin also adds a slider below the featured image with your product gallery images.
20
-
21
- = Main features =
22
-
23
- * Show a bigger size product image on mouseover.
24
- * Customize zoom area width and height and the size of the image to show as zoomed image.
25
- * Enable or disable it on mobile devices.
26
- * Add a slider showing product image thumbnails.
27
- * Customize the slider behavior.
28
-
29
- For a more detailed list of options and features of the plugin, please look at the [official documentation](https://docs.yithemes.com/yith-woocommerce-zoom-magnifier/ "Yith WooCommerce Zoom Magnifier official documentation").
30
-
31
- Discover all the features of the plugin and install it in your theme: the result will be extremely satisfying.
32
-
33
- == Installation ==
34
- Important: First of all, you have to download and activate WooCommerce plugin, which is mandatory for Yith WooCommerce Zoom Magnifier to be working.
35
-
36
- 1. Unzip the downloaded zip file.
37
- 2. Upload the plugin folder into the `wp-content/plugins/` directory of your WordPress site.
38
- 3. Activate `YITH WooCommerce Zoom Magnifier` from Plugins page
39
-
40
- = Configuration =
41
-
42
- YITH WooCommerce Zoom Magnifier will add a new tab called "Zoom Magnifier" in "YIT Plugins" menu item. There, you will find all Yithemes plugins with quick access to plugin setting page.
43
-
44
- == Screenshots ==
45
-
46
- 1. The General plugin settings page. You can disable the plugin for mobile devices.
47
- 2. The Magnifier settings page. Choose the size of the zoom area, the size of the image to be shown in zoom area and the its position (on the right or over the image).
48
- 3. The slider settings page. You can choose to use the slider for product image thumbnails, set how many images to show within the slider, and the behavior of the slider, choosing if circular, infinite or standard carousel.
49
- 4. The zoom applied to a product image, showing zoomed image on the right side.
50
- 5. The zoom applied to a product image, showing zoomed image over the same image.
51
- 6. Choose how many items the slider should show, the image thumbnails will fit the available width.
52
-
53
- == Changelog ==
54
-
55
- = Version 1.3.7 - Released: Dec 24, 2018 =
56
-
57
- * Update: plugin framework
58
- * Fix: Undefined variable "block_args"
59
-
60
- = Version 1.3.6 - Released: Dec 12, 2018 =
61
-
62
- * New: Support to WordPress 5.0
63
- * Update: plugin framework version 3.1.10
64
-
65
- = Version 1.3.5 - Released: Oct 23, 2018 =
66
-
67
- * New: Support to WooCommerce 3.5.0
68
- * Update: plugin framework
69
- * Update: plugin description
70
- * Update: plugin links
71
- * Dev: extra class if featured audio plugin is enabled
72
-
73
- = Version 1.3.4 - Released: June 26, 2018 =
74
-
75
- * Fix: click thumbnails and zoom them
76
-
77
- = Version 1.3.3 - Released: June 22, 2018 =
78
-
79
- * Update: documentation link
80
- * Fix: choosing variation
81
- * Dev: include 'wp-admin/includes/plugin.php'
82
-
83
- = Version 1.3.2 - Released: Mar 06, 2018 =
84
-
85
- * New: support to WooCommerce 3.3.3
86
- * Update: plugin framework 3.0.13
87
- * Fix: Wrong documentation link.
88
- * Fix: Remove old plugin framework.
89
-
90
- = Version 1.3.1 - Released: Feb 07, 2018 =
91
-
92
- * New: support to WooCommerce 3.3.1
93
- * New: support to WordPress 4.9.4
94
- * Update: plugin framework 3.0.12
95
-
96
- = Version 1.3.0 - Released: Dec 11, 2017 =
97
-
98
- * Update: YITH Plugin Framework to version 3.0
99
- * New: support for WooCommerce 3.2.3
100
- * New: tested up to WordPress 4.9
101
-
102
- = Version 1.2.30 - Released: Aug 11, 2017 =
103
-
104
- * New: support for WooCommerce 3.1.
105
- * New: tested up to WordPress 4.8.
106
- * Update: YITH Plugin Framework.
107
-
108
- = Version 1.2.29 - Released: Apr 30, 2017 =
109
-
110
- * Update: YITH Plugin Framework.
111
- * Tweak: tested up to WordPress 4.7.4.
112
- * Tweak: changed plugin tags.
113
-
114
- = Version 1.2.28 - Released: Apr 06, 2017 =
115
-
116
- * Fix: Javascript error when a product variation do not have its own image set.
117
-
118
- = Version 1.2.27 - Released: Apr 05, 2017 =
119
-
120
- * Fix: Variation images not shown properly.
121
-
122
- = Version 1.2.26 - Released: Mar 28, 2017 =
123
-
124
- * Fix: YITH Plugin Framework initialization that prevents the plugin update.
125
-
126
- = Version 1.2.25 - Released: Mar 08, 2017 =
127
-
128
- * Fix: removed unused class.yith-wcmg.php file
129
- * Fix: removed hook 'admin_print_footer_scripts' in class.yith-wcmg-admin.php
130
-
131
- = Version 1.2.24 - Released: Mar 06, 2017 =
132
-
133
- * New: Support to WooCommerce 2.7.0-RC1
134
- * Update: YITH Plugin Framework
135
-
136
- = Version 1.2.23 - Released: Jan 16, 2017 =
137
-
138
- * New: WordPress 4.7 ready
139
-
140
- = Version 1.2.22 - Released: Nov 08, 2016 =
141
-
142
- * Updated: Compatibility to WordPress up to 4.6.x
143
- * Updated: YITH Plugin-fw
144
-
145
- = Version 1.2.21 - Released: Aug 09, 2016 =
146
-
147
- * Fixed: Javascript error on property 'msie'
148
-
149
- = Version 1.2.20 - Released: Jun 13, 2016 =
150
-
151
- * Added: spanish localization
152
- * Updated: WooCommerce 2.6 100% compatible
153
-
154
- = Version 1.2.19 - Released: May 04, 2016 =
155
-
156
- * Fixed: missing YITH Plugin FW files
157
-
158
- == Suggestions ==
159
-
160
- If you have suggestions about how to improve YITH WooCommerce Zoom Magnifier, you can [write us](mailto:plugins@yithemes.com "Your Inspiration Themes") so we can bundle them into YITH Zoom WooCommerce Magnifier.
161
-
162
- == Translators ==
163
-
164
- = Available Languages =
165
- * English (Default)
166
- * Italian
167
- * Spanish
168
-
169
- If you have created your own language pack, or have an update for an existing one, you can send [gettext PO and MO file](http://codex.wordpress.org/Translating_WordPress "Translating WordPress")
170
- [use](https://yithemes.com/contact/ "Your Inspiration Themes") so we can bundle it into YITH WooCommerce Zoom Magnfier Languages.
171
-
172
- == Documentation ==
173
-
174
- Full documentation is available [here](https://docs.yithemes.com/yith-woocommerce-zoom-magnifier/).
175
-
176
- == Upgrade notice ==
177
-
178
- = Version 1.3.2 - Released: Mar 06, 2018 =
179
-
180
- * New: support to WooCommerce 3.3.3
181
- * Update: plugin framework 3.0.13
182
- * Fix: Wrong documentation link.
 
 
 
 
 
183
  * Fix: Remove old plugin framework.
1
+ === YITH WooCommerce Zoom Magnifier ===
2
+
3
+ Contributors: yithemes
4
+ Tags: zoom, magnifier, slider, carousel, woocommerce
5
+ Requires at least: 4.0
6
+ Tested up to: 5.1.0
7
+ Stable tag: 1.3.8
8
+ License: GPLv2 or later
9
+ License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
+ Documentation: https://docs.yithemes.com/yith-woocommerce-zoom-magnifier/
11
+
12
+ YITH WooCommerce Zoom Magnifier add zoom effect to product images and a customizable image slider.
13
+
14
+ == Description ==
15
+
16
+ = Improve the user experience, improve your sales =
17
+
18
+ Offer to your visitors a chance to inspect in detail the quality of your products. With YITH WooCommerce Zoom Magnifier you can add a zoom effect to all your product images.
19
+ The Wordpress plugin also adds a slider below the featured image with your product gallery images.
20
+
21
+ = Main features =
22
+
23
+ * Show a bigger size product image on mouseover.
24
+ * Customize zoom area width and height and the size of the image to show as zoomed image.
25
+ * Enable or disable it on mobile devices.
26
+ * Add a slider showing product image thumbnails.
27
+ * Customize the slider behavior.
28
+
29
+ For a more detailed list of options and features of the plugin, please look at the [official documentation](https://docs.yithemes.com/yith-woocommerce-zoom-magnifier/ "Yith WooCommerce Zoom Magnifier official documentation").
30
+
31
+ Discover all the features of the plugin and install it in your theme: the result will be extremely satisfying.
32
+
33
+ == Installation ==
34
+ Important: First of all, you have to download and activate WooCommerce plugin, which is mandatory for Yith WooCommerce Zoom Magnifier to be working.
35
+
36
+ 1. Unzip the downloaded zip file.
37
+ 2. Upload the plugin folder into the `wp-content/plugins/` directory of your WordPress site.
38
+ 3. Activate `YITH WooCommerce Zoom Magnifier` from Plugins page
39
+
40
+ = Configuration =
41
+
42
+ YITH WooCommerce Zoom Magnifier will add a new tab called "Zoom Magnifier" in "YIT Plugins" menu item. There, you will find all Yithemes plugins with quick access to plugin setting page.
43
+
44
+ == Screenshots ==
45
+
46
+ 1. The General plugin settings page. You can disable the plugin for mobile devices.
47
+ 2. The Magnifier settings page. Choose the size of the zoom area, the size of the image to be shown in zoom area and the its position (on the right or over the image).
48
+ 3. The slider settings page. You can choose to use the slider for product image thumbnails, set how many images to show within the slider, and the behavior of the slider, choosing if circular, infinite or standard carousel.
49
+ 4. The zoom applied to a product image, showing zoomed image on the right side.
50
+ 5. The zoom applied to a product image, showing zoomed image over the same image.
51
+ 6. Choose how many items the slider should show, the image thumbnails will fit the available width.
52
+
53
+ == Changelog ==
54
+
55
+ = Version 1.3.8 - Released: Feb 28, 2018 =
56
+
57
+ * Update: plugin framework
58
+ * Fix: Undefined variable "block_args"
59
+
60
+ = Version 1.3.7 - Released: Dec 24, 2018 =
61
+
62
+ * Update: plugin framework
63
+ * Fix: Undefined variable "block_args"
64
+
65
+ = Version 1.3.6 - Released: Dec 12, 2018 =
66
+
67
+ * New: Support to WordPress 5.0
68
+ * Update: plugin framework version 3.1.10
69
+
70
+ = Version 1.3.5 - Released: Oct 23, 2018 =
71
+
72
+ * New: Support to WooCommerce 3.5.0
73
+ * Update: plugin framework
74
+ * Update: plugin description
75
+ * Update: plugin links
76
+ * Dev: extra class if featured audio plugin is enabled
77
+
78
+ = Version 1.3.4 - Released: June 26, 2018 =
79
+
80
+ * Fix: click thumbnails and zoom them
81
+
82
+ = Version 1.3.3 - Released: June 22, 2018 =
83
+
84
+ * Update: documentation link
85
+ * Fix: choosing variation
86
+ * Dev: include 'wp-admin/includes/plugin.php'
87
+
88
+ = Version 1.3.2 - Released: Mar 06, 2018 =
89
+
90
+ * New: support to WooCommerce 3.3.3
91
+ * Update: plugin framework 3.0.13
92
+ * Fix: Wrong documentation link.
93
+ * Fix: Remove old plugin framework.
94
+
95
+ = Version 1.3.1 - Released: Feb 07, 2018 =
96
+
97
+ * New: support to WooCommerce 3.3.1
98
+ * New: support to WordPress 4.9.4
99
+ * Update: plugin framework 3.0.12
100
+
101
+ = Version 1.3.0 - Released: Dec 11, 2017 =
102
+
103
+ * Update: YITH Plugin Framework to version 3.0
104
+ * New: support for WooCommerce 3.2.3
105
+ * New: tested up to WordPress 4.9
106
+
107
+ = Version 1.2.30 - Released: Aug 11, 2017 =
108
+
109
+ * New: support for WooCommerce 3.1.
110
+ * New: tested up to WordPress 4.8.
111
+ * Update: YITH Plugin Framework.
112
+
113
+ = Version 1.2.29 - Released: Apr 30, 2017 =
114
+
115
+ * Update: YITH Plugin Framework.
116
+ * Tweak: tested up to WordPress 4.7.4.
117
+ * Tweak: changed plugin tags.
118
+
119
+ = Version 1.2.28 - Released: Apr 06, 2017 =
120
+
121
+ * Fix: Javascript error when a product variation do not have its own image set.
122
+
123
+ = Version 1.2.27 - Released: Apr 05, 2017 =
124
+
125
+ * Fix: Variation images not shown properly.
126
+
127
+ = Version 1.2.26 - Released: Mar 28, 2017 =
128
+
129
+ * Fix: YITH Plugin Framework initialization that prevents the plugin update.
130
+
131
+ = Version 1.2.25 - Released: Mar 08, 2017 =
132
+
133
+ * Fix: removed unused class.yith-wcmg.php file
134
+ * Fix: removed hook 'admin_print_footer_scripts' in class.yith-wcmg-admin.php
135
+
136
+ = Version 1.2.24 - Released: Mar 06, 2017 =
137
+
138
+ * New: Support to WooCommerce 2.7.0-RC1
139
+ * Update: YITH Plugin Framework
140
+
141
+ = Version 1.2.23 - Released: Jan 16, 2017 =
142
+
143
+ * New: WordPress 4.7 ready
144
+
145
+ = Version 1.2.22 - Released: Nov 08, 2016 =
146
+
147
+ * Updated: Compatibility to WordPress up to 4.6.x
148
+ * Updated: YITH Plugin-fw
149
+
150
+ = Version 1.2.21 - Released: Aug 09, 2016 =
151
+
152
+ * Fixed: Javascript error on property 'msie'
153
+
154
+ = Version 1.2.20 - Released: Jun 13, 2016 =
155
+
156
+ * Added: spanish localization
157
+ * Updated: WooCommerce 2.6 100% compatible
158
+
159
+ = Version 1.2.19 - Released: May 04, 2016 =
160
+
161
+ * Fixed: missing YITH Plugin FW files
162
+
163
+ == Suggestions ==
164
+
165
+ If you have suggestions about how to improve YITH WooCommerce Zoom Magnifier, you can [write us](mailto:plugins@yithemes.com "Your Inspiration Themes") so we can bundle them into YITH Zoom WooCommerce Magnifier.
166
+
167
+ == Translators ==
168
+
169
+ = Available Languages =
170
+ * English (Default)
171
+ * Italian
172
+ * Spanish
173
+
174
+ If you have created your own language pack, or have an update for an existing one, you can send [gettext PO and MO file](http://codex.wordpress.org/Translating_WordPress "Translating WordPress")
175
+ [use](https://yithemes.com/contact/ "Your Inspiration Themes") so we can bundle it into YITH WooCommerce Zoom Magnfier Languages.
176
+
177
+ == Documentation ==
178
+
179
+ Full documentation is available [here](https://docs.yithemes.com/yith-woocommerce-zoom-magnifier/).
180
+
181
+ == Upgrade notice ==
182
+
183
+ = Version 1.3.2 - Released: Mar 06, 2018 =
184
+
185
+ * New: support to WooCommerce 3.3.3
186
+ * Update: plugin framework 3.0.13
187
+ * Fix: Wrong documentation link.
188
  * Fix: Remove old plugin framework.
assets/css/admin.css CHANGED
@@ -1,20 +1,20 @@
1
- .yith_woocommerce_slider {
2
- width: 300px;
3
- float: left
4
- }
5
- .yith_woocommerce_slider_value {
6
- margin-top: -5px;
7
- margin-left: 10px;
8
- width: 50px;
9
- float: left;
10
- text-align: center;
11
- font-weight: bold;
12
- }
13
-
14
- .yith_banner {
15
- margin-top: 10px;
16
- }
17
-
18
- #eg-wrap .select_fake {/* solve back-end conflict with Essential Grid */
19
- height: 24px;
20
  }
1
+ .yith_woocommerce_slider {
2
+ width: 300px;
3
+ float: left
4
+ }
5
+ .yith_woocommerce_slider_value {
6
+ margin-top: -5px;
7
+ margin-left: 10px;
8
+ width: 50px;
9
+ float: left;
10
+ text-align: center;
11
+ font-weight: bold;
12
+ }
13
+
14
+ .yith_banner {
15
+ margin-top: 10px;
16
+ }
17
+
18
+ #eg-wrap .select_fake {/* solve back-end conflict with Essential Grid */
19
+ height: 24px;
20
  }
assets/css/frontend.css CHANGED
@@ -1,65 +1,65 @@
1
- /* gallery */
2
- .yith_magnifier_gallery {
3
- margin: 0;
4
- padding: 0;
5
- }
6
-
7
- .yith_magnifier_gallery li {
8
- position: relative;
9
- float: left;
10
- display: block;
11
- }
12
-
13
- .yith_magnifier_gallery li.last {
14
- margin-right: 0;
15
- }
16
-
17
- .yith_magnifier_gallery li a {
18
- width: 100% !important;
19
- display: block;
20
- margin-top: 10px;
21
- height: auto !important;
22
- }
23
-
24
- /* next/prev */
25
- .single-product.woocommerce .thumbnails {
26
- position: relative;
27
- }
28
-
29
- .single-product.woocommerce .thumbnails #slider-prev,
30
- .single-product.woocommerce .thumbnails #slider-next {
31
- display: none !important;
32
- cursor: pointer;
33
- width: 27px;
34
- height: 26px;
35
- background: url('../images/slider-arrow.png') no-repeat left center;
36
- position: absolute;
37
- top: 48%;
38
- margin-top: -2px;
39
- }
40
-
41
- .single-product.woocommerce .thumbnails #slider-prev {
42
- background-position: left center;
43
- left: 0px;
44
- }
45
-
46
- .single-product.woocommerce .thumbnails #slider-next {
47
- background-position: right center;
48
- right: 0px;
49
- }
50
-
51
- .single-product.woocommerce .thumbnails:hover #slider-prev,
52
- .single-product.woocommerce .thumbnails:hover #slider-next {
53
- display: block !important;
54
- }
55
-
56
- span.onsale {
57
- z-index: 10000
58
- }
59
-
60
- div.pp_woocommerce a.pp_expand {
61
- display: inline;
62
- bottom: 10px;
63
- top: initial;
64
- left: 10px;
65
  }
1
+ /* gallery */
2
+ .yith_magnifier_gallery {
3
+ margin: 0;
4
+ padding: 0;
5
+ }
6
+
7
+ .yith_magnifier_gallery li {
8
+ position: relative;
9
+ float: left;
10
+ display: block;
11
+ }
12
+
13
+ .yith_magnifier_gallery li.last {
14
+ margin-right: 0;
15
+ }
16
+
17
+ .yith_magnifier_gallery li a {
18
+ width: 100% !important;
19
+ display: block;
20
+ margin-top: 10px;
21
+ height: auto !important;
22
+ }
23
+
24
+ /* next/prev */
25
+ .single-product.woocommerce .thumbnails {
26
+ position: relative;
27
+ }
28
+
29
+ .single-product.woocommerce .thumbnails #slider-prev,
30
+ .single-product.woocommerce .thumbnails #slider-next {
31
+ display: none !important;
32
+ cursor: pointer;
33
+ width: 27px;
34
+ height: 26px;
35
+ background: url('../images/slider-arrow.png') no-repeat left center;
36
+ position: absolute;
37
+ top: 48%;
38
+ margin-top: -2px;
39
+ }
40
+
41
+ .single-product.woocommerce .thumbnails #slider-prev {
42
+ background-position: left center;
43
+ left: 0px;
44
+ }
45
+
46
+ .single-product.woocommerce .thumbnails #slider-next {
47
+ background-position: right center;
48
+ right: 0px;
49
+ }
50
+
51
+ .single-product.woocommerce .thumbnails:hover #slider-prev,
52
+ .single-product.woocommerce .thumbnails:hover #slider-next {
53
+ display: block !important;
54
+ }
55
+
56
+ span.onsale {
57
+ z-index: 10000
58
+ }
59
+
60
+ div.pp_woocommerce a.pp_expand {
61
+ display: inline;
62
+ bottom: 10px;
63
+ top: initial;
64
+ left: 10px;
65
  }
assets/css/yith_magnifier.css CHANGED
@@ -1,70 +1,70 @@
1
- .yith_magnifier_zoom_wrap {
2
- top: 0;
3
- position: relative;
4
- }
5
-
6
- .yith_magnifier_loading {
7
- color:white;
8
- background:#222;
9
- padding:3px;
10
- border:1px solid #000;
11
- position: absolute;
12
- text-align: center;
13
- top: 10%;
14
- z-index: 9999;
15
- }
16
-
17
- .yith_magnifier_zoom {
18
- position: relative;
19
- display: block;
20
- }
21
-
22
- .yith_magnifier_zoom img {
23
- display: block;
24
- }
25
-
26
- .yith_magnifier_mousetrap {
27
- z-index: 999;
28
- position: absolute;
29
- width: 0px;
30
- height :0px;
31
- left: 0;
32
- top: 0;
33
- }
34
-
35
- /* ie fix */
36
- .ie .yith_magnifier_mousetrap {
37
- background-image: url(".");
38
- }
39
-
40
- .yith_magnifier_lens {
41
- display: none;
42
- z-index:98;
43
- position:absolute;
44
- overflow: hidden;
45
-
46
- border: 1px solid #ccc;
47
- }
48
-
49
- .yith_magnifier_lens img {
50
- width: auto !important;
51
- max-width: none !important;
52
-
53
- -webkit-transition: all ease-in-out 0s !important;
54
- -moz-transition: all ease-in-out 0s !important;
55
- -o-transition: all ease-in-out 0s !important;
56
- transition: all ease-in-out 0s !important;
57
- }
58
-
59
- .yith_magnifier_zoom_magnifier {
60
- display:none;
61
- position:absolute;
62
- z-index: 99;
63
-
64
- border:4px solid #ccc;
65
- overflow:hidden;
66
- }
67
-
68
- .yith_magnifier_gallery {
69
- list-style: none;
70
- }
1
+ .yith_magnifier_zoom_wrap {
2
+ top: 0;
3
+ position: relative;
4
+ }
5
+
6
+ .yith_magnifier_loading {
7
+ color:white;
8
+ background:#222;
9
+ padding:3px;
10
+ border:1px solid #000;
11
+ position: absolute;
12
+ text-align: center;
13
+ top: 10%;
14
+ z-index: 9999;
15
+ }
16
+
17
+ .yith_magnifier_zoom {
18
+ position: relative;
19
+ display: block;
20
+ }
21
+
22
+ .yith_magnifier_zoom img {
23
+ display: block;
24
+ }
25
+
26
+ .yith_magnifier_mousetrap {
27
+ z-index: 999;
28
+ position: absolute;
29
+ width: 0px;
30
+ height :0px;
31
+ left: 0;
32
+ top: 0;
33
+ }
34
+
35
+ /* ie fix */
36
+ .ie .yith_magnifier_mousetrap {
37
+ background-image: url(".");
38
+ }
39
+
40
+ .yith_magnifier_lens {
41
+ display: none;
42
+ z-index:98;
43
+ position:absolute;
44
+ overflow: hidden;
45
+
46
+ border: 1px solid #ccc;
47
+ }
48
+
49
+ .yith_magnifier_lens img {
50
+ width: auto !important;
51
+ max-width: none !important;
52
+
53
+ -webkit-transition: all ease-in-out 0s !important;
54
+ -moz-transition: all ease-in-out 0s !important;
55
+ -o-transition: all ease-in-out 0s !important;
56
+ transition: all ease-in-out 0s !important;
57
+ }
58
+
59
+ .yith_magnifier_zoom_magnifier {
60
+ display:none;
61
+ position:absolute;
62
+ z-index: 99;
63
+
64
+ border:4px solid #ccc;
65
+ overflow:hidden;
66
+ }
67
+
68
+ .yith_magnifier_gallery {
69
+ list-style: none;
70
+ }
assets/js/jquery.carouFredSel.js CHANGED
@@ -1,4254 +1,4254 @@
1
- /*
2
- * jQuery carouFredSel 6.2.1
3
- * Demo's and documentation:
4
- * caroufredsel.dev7studios.com
5
- *
6
- * Copyright (c) 2013 Fred Heusschen
7
- * www.frebsite.nl
8
- *
9
- * Dual licensed under the MIT and GPL licenses.
10
- * http://en.wikipedia.org/wiki/MIT_License
11
- * http://en.wikipedia.org/wiki/GNU_General_Public_License
12
- */
13
-
14
-
15
- (function($) {
16
-
17
-
18
- // LOCAL
19
-
20
- if ( $.fn.carouFredSel )
21
- {
22
- return;
23
- }
24
-
25
- $.fn.caroufredsel = $.fn.carouFredSel = function(options, configs)
26
- {
27
-
28
- // no element
29
- if (this.length == 0)
30
- {
31
- debug( true, 'No element found for "' + this.selector + '".' );
32
- return this;
33
- }
34
-
35
- // multiple elements
36
- if (this.length > 1)
37
- {
38
- return this.each(function() {
39
- $(this).carouFredSel(options, configs);
40
- });
41
- }
42
-
43
-
44
- var $cfs = this,
45
- $tt0 = this[0],
46
- starting_position = false;
47
-
48
- if ($cfs.data('_cfs_isCarousel'))
49
- {
50
- starting_position = $cfs.triggerHandler('_cfs_triggerEvent', 'currentPosition');
51
- $cfs.trigger('_cfs_triggerEvent', ['destroy', true]);
52
- }
53
-
54
- var FN = {};
55
-
56
- FN._init = function(o, setOrig, start)
57
- {
58
- o = go_getObject($tt0, o);
59
-
60
- o.items = go_getItemsObject($tt0, o.items);
61
- o.scroll = go_getScrollObject($tt0, o.scroll);
62
- o.auto = go_getAutoObject($tt0, o.auto);
63
- o.prev = go_getPrevNextObject($tt0, o.prev);
64
- o.next = go_getPrevNextObject($tt0, o.next);
65
- o.pagination = go_getPaginationObject($tt0, o.pagination);
66
- o.swipe = go_getSwipeObject($tt0, o.swipe);
67
- o.mousewheel = go_getMousewheelObject($tt0, o.mousewheel);
68
-
69
- if (setOrig)
70
- {
71
- opts_orig = $.extend(true, {}, $.fn.carouFredSel.defaults, o);
72
- }
73
-
74
- opts = $.extend(true, {}, $.fn.carouFredSel.defaults, o);
75
- opts.d = cf_getDimensions(opts);
76
-
77
- crsl.direction = (opts.direction == 'up' || opts.direction == 'left') ? 'next' : 'prev';
78
-
79
- var a_itm = $cfs.children(),
80
- avail_primary = ms_getParentSize($wrp, opts, 'width');
81
-
82
- if (is_true(opts.cookie))
83
- {
84
- opts.cookie = 'caroufredsel_cookie_' + conf.serialNumber;
85
- }
86
-
87
- opts.maxDimension = ms_getMaxDimension(opts, avail_primary);
88
-
89
- // complement items and sizes
90
- opts.items = in_complementItems(opts.items, opts, a_itm, start);
91
- opts[opts.d['width']] = in_complementPrimarySize(opts[opts.d['width']], opts, a_itm);
92
- opts[opts.d['height']] = in_complementSecondarySize(opts[opts.d['height']], opts, a_itm);
93
-
94
- // primary size not set for a responsive carousel
95
- if (opts.responsive)
96
- {
97
- if (!is_percentage(opts[opts.d['width']]))
98
- {
99
- opts[opts.d['width']] = '100%';
100
- }
101
- }
102
-
103
- // primary size is percentage
104
- if (is_percentage(opts[opts.d['width']]))
105
- {
106
- crsl.upDateOnWindowResize = true;
107
- crsl.primarySizePercentage = opts[opts.d['width']];
108
- opts[opts.d['width']] = ms_getPercentage(avail_primary, crsl.primarySizePercentage);
109
- if (!opts.items.visible)
110
- {
111
- opts.items.visibleConf.variable = true;
112
- }
113
- }
114
-
115
- if (opts.responsive)
116
- {
117
- opts.usePadding = false;
118
- opts.padding = [0, 0, 0, 0];
119
- opts.align = false;
120
- opts.items.visibleConf.variable = false;
121
- }
122
- else
123
- {
124
- // visible-items not set
125
- if (!opts.items.visible)
126
- {
127
- opts = in_complementVisibleItems(opts, avail_primary);
128
- }
129
-
130
- // primary size not set -> calculate it or set to "variable"
131
- if (!opts[opts.d['width']])
132
- {
133
- if (!opts.items.visibleConf.variable && is_number(opts.items[opts.d['width']]) && opts.items.filter == '*')
134
- {
135
- opts[opts.d['width']] = opts.items.visible * opts.items[opts.d['width']];
136
- opts.align = false;
137
- }
138
- else
139
- {
140
- opts[opts.d['width']] = 'variable';
141
- }
142
- }
143
- // align not set -> set to center if primary size is number
144
- if (is_undefined(opts.align))
145
- {
146
- opts.align = (is_number(opts[opts.d['width']]))
147
- ? 'center'
148
- : false;
149
- }
150
- // set variabe visible-items
151
- if (opts.items.visibleConf.variable)
152
- {
153
- opts.items.visible = gn_getVisibleItemsNext(a_itm, opts, 0);
154
- }
155
- }
156
-
157
- // set visible items by filter
158
- if (opts.items.filter != '*' && !opts.items.visibleConf.variable)
159
- {
160
- opts.items.visibleConf.org = opts.items.visible;
161
- opts.items.visible = gn_getVisibleItemsNextFilter(a_itm, opts, 0);
162
- }
163
-
164
- opts.items.visible = cf_getItemsAdjust(opts.items.visible, opts, opts.items.visibleConf.adjust, $tt0);
165
- opts.items.visibleConf.old = opts.items.visible;
166
-
167
- if (opts.responsive)
168
- {
169
- if (!opts.items.visibleConf.min)
170
- {
171
- opts.items.visibleConf.min = opts.items.visible;
172
- }
173
- if (!opts.items.visibleConf.max)
174
- {
175
- opts.items.visibleConf.max = opts.items.visible;
176
- }
177
- opts = in_getResponsiveValues(opts, a_itm, avail_primary);
178
- }
179
- else
180
- {
181
- opts.padding = cf_getPadding(opts.padding);
182
-
183
- if (opts.align == 'top')
184
- {
185
- opts.align = 'left';
186
- }
187
- else if (opts.align == 'bottom')
188
- {
189
- opts.align = 'right';
190
- }
191
-
192
- switch (opts.align)
193
- {
194
- // align: center, left or right
195
- case 'center':
196
- case 'left':
197
- case 'right':
198
- if (opts[opts.d['width']] != 'variable')
199
- {
200
- opts = in_getAlignPadding(opts, a_itm);
201
- opts.usePadding = true;
202
- }
203
- break;
204
-
205
- // padding
206
- default:
207
- opts.align = false;
208
- opts.usePadding = (
209
- opts.padding[0] == 0 &&
210
- opts.padding[1] == 0 &&
211
- opts.padding[2] == 0 &&
212
- opts.padding[3] == 0
213
- ) ? false : true;
214
- break;
215
- }
216
- }
217
-
218
- if (!is_number(opts.scroll.duration))
219
- {
220
- opts.scroll.duration = 500;
221
- }
222
- if (is_undefined(opts.scroll.items))
223
- {
224
- opts.scroll.items = (opts.responsive || opts.items.visibleConf.variable || opts.items.filter != '*')
225
- ? 'visible'
226
- : opts.items.visible;
227
- }
228
-
229
- opts.auto = $.extend(true, {}, opts.scroll, opts.auto);
230
- opts.prev = $.extend(true, {}, opts.scroll, opts.prev);
231
- opts.next = $.extend(true, {}, opts.scroll, opts.next);
232
- opts.pagination = $.extend(true, {}, opts.scroll, opts.pagination);
233
- // swipe and mousewheel extend later on, per direction
234
-
235
- opts.auto = go_complementAutoObject($tt0, opts.auto);
236
- opts.prev = go_complementPrevNextObject($tt0, opts.prev);
237
- opts.next = go_complementPrevNextObject($tt0, opts.next);
238
- opts.pagination = go_complementPaginationObject($tt0, opts.pagination);
239
- opts.swipe = go_complementSwipeObject($tt0, opts.swipe);
240
- opts.mousewheel = go_complementMousewheelObject($tt0, opts.mousewheel);
241
-
242
- if (opts.synchronise)
243
- {
244
- opts.synchronise = cf_getSynchArr(opts.synchronise);
245
- }
246
-
247
-
248
- // DEPRECATED
249
- if (opts.auto.onPauseStart)
250
- {
251
- opts.auto.onTimeoutStart = opts.auto.onPauseStart;
252
- deprecated('auto.onPauseStart', 'auto.onTimeoutStart');
253
- }
254
- if (opts.auto.onPausePause)
255
- {
256
- opts.auto.onTimeoutPause = opts.auto.onPausePause;
257
- deprecated('auto.onPausePause', 'auto.onTimeoutPause');
258
- }
259
- if (opts.auto.onPauseEnd)
260
- {
261
- opts.auto.onTimeoutEnd = opts.auto.onPauseEnd;
262
- deprecated('auto.onPauseEnd', 'auto.onTimeoutEnd');
263
- }
264
- if (opts.auto.pauseDuration)
265
- {
266
- opts.auto.timeoutDuration = opts.auto.pauseDuration;
267
- deprecated('auto.pauseDuration', 'auto.timeoutDuration');
268
- }
269
- // /DEPRECATED
270
-
271
-
272
- }; // /init
273
-
274
-
275
- FN._build = function() {
276
- $cfs.data('_cfs_isCarousel', true);
277
-
278
- var a_itm = $cfs.children(),
279
- orgCSS = in_mapCss($cfs, ['textAlign', 'float', 'position', 'top', 'right', 'bottom', 'left', 'zIndex', 'width', 'height', 'marginTop', 'marginRight', 'marginBottom', 'marginLeft']),
280
- newPosition = 'relative';
281
-
282
- switch (orgCSS.position)
283
- {
284
- case 'absolute':
285
- case 'fixed':
286
- newPosition = orgCSS.position;
287
- break;
288
- }
289
-
290
- if (conf.wrapper == 'parent')
291
- {
292
- sz_storeOrigCss($wrp);
293
- }
294
- else
295
- {
296
- $wrp.css(orgCSS);
297
- }
298
- $wrp.css({
299
- 'overflow' : 'hidden',
300
- 'position' : newPosition
301
- });
302
-
303
- sz_storeOrigCss($cfs);
304
- $cfs.data('_cfs_origCssZindex', orgCSS.zIndex);
305
- $cfs.css({
306
- 'textAlign' : 'left',
307
- 'float' : 'none',
308
- 'position' : 'absolute',
309
- 'top' : 0,
310
- 'right' : 'auto',
311
- 'bottom' : 'auto',
312
- 'left' : 0,
313
- 'marginTop' : 0,
314
- 'marginRight' : 0,
315
- 'marginBottom' : 0,
316
- 'marginLeft' : 0
317
- });
318
-
319
- sz_storeMargin(a_itm, opts);
320
- sz_storeOrigCss(a_itm);
321
- if (opts.responsive)
322
- {
323
- sz_setResponsiveSizes(opts, a_itm);
324
- }
325
-
326
- }; // /build
327
-
328
-
329
- FN._bind_events = function() {
330
- FN._unbind_events();
331
-
332
-
333
- // stop event
334
- $cfs.bind(cf_e('stop', conf), function(e, imm) {
335
- e.stopPropagation();
336
-
337
- // button
338
- if (!crsl.isStopped)
339
- {
340
- if (opts.auto.button)
341
- {
342
- opts.auto.button.addClass(cf_c('stopped', conf));
343
- }
344
- }
345
-
346
- // set stopped
347
- crsl.isStopped = true;
348
-
349
- if (opts.auto.play)
350
- {
351
- opts.auto.play = false;
352
- $cfs.trigger(cf_e('pause', conf), imm);
353
- }
354
- return true;
355
- });
356
-
357
-
358
- // finish event
359
- $cfs.bind(cf_e('finish', conf), function(e) {
360
- e.stopPropagation();
361
- if (crsl.isScrolling)
362
- {
363
- sc_stopScroll(scrl);
364
- }
365
- return true;
366
- });
367
-
368
-
369
- // pause event
370
- $cfs.bind(cf_e('pause', conf), function(e, imm, res) {
371
- e.stopPropagation();
372
- tmrs = sc_clearTimers(tmrs);
373
-
374
- // immediately pause
375
- if (imm && crsl.isScrolling)
376
- {
377
- scrl.isStopped = true;
378
- var nst = getTime() - scrl.startTime;
379
- scrl.duration -= nst;
380
- if (scrl.pre)
381
- {
382
- scrl.pre.duration -= nst;
383
- }
384
- if (scrl.post)
385
- {
386
- scrl.post.duration -= nst;
387
- }
388
- sc_stopScroll(scrl, false);
389
- }
390
-
391
- // update remaining pause-time
392
- if (!crsl.isPaused && !crsl.isScrolling)
393
- {
394
- if (res)
395
- {
396
- tmrs.timePassed += getTime() - tmrs.startTime;
397
- }
398
- }
399
-
400
- // button
401
- if (!crsl.isPaused)
402
- {
403
- if (opts.auto.button)
404
- {
405
- opts.auto.button.addClass(cf_c('paused', conf));
406
- }
407
- }
408
-
409
- // set paused
410
- crsl.isPaused = true;
411
-
412
- // pause pause callback
413
- if (opts.auto.onTimeoutPause)
414
- {
415
- var dur1 = opts.auto.timeoutDuration - tmrs.timePassed,
416
- perc = 100 - Math.ceil( dur1 * 100 / opts.auto.timeoutDuration );
417
-
418
- opts.auto.onTimeoutPause.call($tt0, perc, dur1);
419
- }
420
- return true;
421
- });
422
-
423
-
424
- // play event
425
- $cfs.bind(cf_e('play', conf), function(e, dir, del, res) {
426
- e.stopPropagation();
427
- tmrs = sc_clearTimers(tmrs);
428
-
429
- // sort params
430
- var v = [dir, del, res],
431
- t = ['string', 'number', 'boolean'],
432
- a = cf_sortParams(v, t);
433
-
434
- dir = a[0];
435
- del = a[1];
436
- res = a[2];
437
-
438
- if (dir != 'prev' && dir != 'next')
439
- {
440
- dir = crsl.direction;
441
- }
442
- if (!is_number(del))
443
- {
444
- del = 0;
445
- }
446
- if (!is_boolean(res))
447
- {
448
- res = false;
449
- }
450
-
451
- // stopped?
452
- if (res)
453
- {
454
- crsl.isStopped = false;
455
- opts.auto.play = true;
456
- }
457
- if (!opts.auto.play)
458
- {
459
- e.stopImmediatePropagation();
460
- return debug(conf, 'Carousel stopped: Not scrolling.');
461
- }
462
-
463
- // button
464
- if (crsl.isPaused)
465
- {
466
- if (opts.auto.button)
467
- {
468
- opts.auto.button.removeClass(cf_c('stopped', conf));
469
- opts.auto.button.removeClass(cf_c('paused', conf));
470
- }
471
- }
472
-
473
- // set playing
474
- crsl.isPaused = false;
475
- tmrs.startTime = getTime();
476
-
477
- // timeout the scrolling
478
- var dur1 = opts.auto.timeoutDuration + del;
479
- dur2 = dur1 - tmrs.timePassed;
480
- perc = 100 - Math.ceil(dur2 * 100 / dur1);
481
-
482
- if (opts.auto.progress)
483
- {
484
- tmrs.progress = setInterval(function() {
485
- var pasd = getTime() - tmrs.startTime + tmrs.timePassed,
486
- perc = Math.ceil(pasd * 100 / dur1);
487
- opts.auto.progress.updater.call(opts.auto.progress.bar[0], perc);
488
- }, opts.auto.progress.interval);
489
- }
490
-
491
- tmrs.auto = setTimeout(function() {
492
- if (opts.auto.progress)
493
- {
494
- opts.auto.progress.updater.call(opts.auto.progress.bar[0], 100);
495
- }
496
- if (opts.auto.onTimeoutEnd)
497
- {
498
- opts.auto.onTimeoutEnd.call($tt0, perc, dur2);
499
- }
500
- if (crsl.isScrolling)
501
- {
502
- $cfs.trigger(cf_e('play', conf), dir);
503
- }
504
- else
505
- {
506
- $cfs.trigger(cf_e(dir, conf), opts.auto);
507
- }
508
- }, dur2);
509
-
510
- // pause start callback
511
- if (opts.auto.onTimeoutStart)
512
- {
513
- opts.auto.onTimeoutStart.call($tt0, perc, dur2);
514
- }
515
-
516
- return true;
517
- });
518
-
519
-
520
- // resume event
521
- $cfs.bind(cf_e('resume', conf), function(e) {
522
- e.stopPropagation();
523
- if (scrl.isStopped)
524
- {
525
- scrl.isStopped = false;
526
- crsl.isPaused = false;
527
- crsl.isScrolling = true;
528
- scrl.startTime = getTime();
529
- sc_startScroll(scrl, conf);
530
- }
531
- else
532
- {
533
- $cfs.trigger(cf_e('play', conf));
534
- }
535
- return true;
536
- });
537
-
538
-
539
- // prev + next events
540
- $cfs.bind(cf_e('prev', conf)+' '+cf_e('next', conf), function(e, obj, num, clb, que) {
541
- e.stopPropagation();
542
-
543
- // stopped or hidden carousel, don't scroll, don't queue
544
- if (crsl.isStopped || $cfs.is(':hidden'))
545
- {
546
- e.stopImmediatePropagation();
547
- return debug(conf, 'Carousel stopped or hidden: Not scrolling.');
548
- }
549
-
550
- // not enough items
551
- var minimum = (is_number(opts.items.minimum)) ? opts.items.minimum : opts.items.visible + 1;
552
- if (minimum > itms.total)
553
- {
554
- e.stopImmediatePropagation();
555
- return debug(conf, 'Not enough items ('+itms.total+' total, '+minimum+' needed): Not scrolling.');
556
- }
557
-
558
- // get config
559
- var v = [obj, num, clb, que],
560
- t = ['object', 'number/string', 'function', 'boolean'],
561
- a = cf_sortParams(v, t);
562
-
563
- obj = a[0];
564
- num = a[1];
565
- clb = a[2];
566
- que = a[3];
567
-
568
- var eType = e.type.slice(conf.events.prefix.length);
569
-
570
- if (!is_object(obj))
571
- {
572
- obj = {};
573
- }
574
- if (is_function(clb))
575
- {
576
- obj.onAfter = clb;
577
- }
578
- if (is_boolean(que))
579
- {
580
- obj.queue = que;
581
- }
582
- obj = $.extend(true, {}, opts[eType], obj);
583
-
584
- // test conditions callback
585
- if (obj.conditions && !obj.conditions.call($tt0, eType))
586
- {
587
- e.stopImmediatePropagation();
588
- return debug(conf, 'Callback "conditions" returned false.');
589
- }
590
-
591
- if (!is_number(num))
592
- {
593
- if (opts.items.filter != '*')
594
- {
595
- num = 'visible';
596
- }
597
- else
598
- {
599
- var arr = [num, obj.items, opts[eType].items];
600
- for (var a = 0, l = arr.length; a < l; a++)
601
- {
602
- if (is_number(arr[a]) || arr[a] == 'page' || arr[a] == 'visible') {
603
- num = arr[a];
604
- break;
605
- }
606
- }
607
- }
608
- switch(num) {
609
- case 'page':
610
- e.stopImmediatePropagation();
611
- return $cfs.triggerHandler(cf_e(eType+'Page', conf), [obj, clb]);
612
- break;
613
-
614
- case 'visible':
615
- if (!opts.items.visibleConf.variable && opts.items.filter == '*')
616
- {
617
- num = opts.items.visible;
618
- }
619
- break;
620
- }
621
- }
622
-
623
- // resume animation, add current to queue
624
- if (scrl.isStopped)
625
- {
626
- $cfs.trigger(cf_e('resume', conf));
627
- $cfs.trigger(cf_e('queue', conf), [eType, [obj, num, clb]]);
628
- e.stopImmediatePropagation();
629
- return debug(conf, 'Carousel resumed scrolling.');
630
- }
631
-
632
- // queue if scrolling
633
- if (obj.duration > 0)
634
- {
635
- if (crsl.isScrolling)
636
- {
637
- if (obj.queue)
638
- {
639
- if (obj.queue == 'last')
640
- {
641
- queu = [];
642
- }
643
- if (obj.queue != 'first' || queu.length == 0)
644
- {
645
- $cfs.trigger(cf_e('queue', conf), [eType, [obj, num, clb]]);
646
- }
647
- }
648
- e.stopImmediatePropagation();
649
- return debug(conf, 'Carousel currently scrolling.');
650
- }
651
- }
652
-
653
- tmrs.timePassed = 0;
654
- $cfs.trigger(cf_e('slide_'+eType, conf), [obj, num]);
655
-
656
- // synchronise
657
- if (opts.synchronise)
658
- {
659
- var s = opts.synchronise,
660
- c = [obj, num];
661
-
662
- for (var j = 0, l = s.length; j < l; j++) {
663
- var d = eType;
664
- if (!s[j][2])
665
- {
666
- d = (d == 'prev') ? 'next' : 'prev';
667
- }
668
- if (!s[j][1])
669
- {
670
- c[0] = s[j][0].triggerHandler('_cfs_triggerEvent', ['configuration', d]);
671
- }
672
- c[1] = num + s[j][3];
673
- s[j][0].trigger('_cfs_triggerEvent', ['slide_'+d, c]);
674
- }
675
- }
676
- return true;
677
- });
678
-
679
-
680
- // prev event
681
- $cfs.bind(cf_e('slide_prev', conf), function(e, sO, nI) {
682
- e.stopPropagation();
683
- var a_itm = $cfs.children();
684
-
685
- // non-circular at start, scroll to end
686
- if (!opts.circular)
687
- {
688
- if (itms.first == 0)
689
- {
690
- if (opts.infinite)
691
- {
692
- $cfs.trigger(cf_e('next', conf), itms.total-1);
693
- }
694
- return e.stopImmediatePropagation();
695
- }
696
- }
697
-
698
- sz_resetMargin(a_itm, opts);
699
-
700
- // find number of items to scroll
701
- if (!is_number(nI))
702
- {
703
- if (opts.items.visibleConf.variable)
704
- {
705
- nI = gn_getVisibleItemsPrev(a_itm, opts, itms.total-1);
706
- }
707
- else if (opts.items.filter != '*')
708
- {
709
- var xI = (is_number(sO.items)) ? sO.items : gn_getVisibleOrg($cfs, opts);
710
- nI = gn_getScrollItemsPrevFilter(a_itm, opts, itms.total-1, xI);
711
- }
712
- else
713
- {
714
- nI = opts.items.visible;
715
- }
716
- nI = cf_getAdjust(nI, opts, sO.items, $tt0);
717
- }
718
-
719
- // prevent non-circular from scrolling to far
720
- if (!opts.circular)
721
- {
722
- if (itms.total - nI < itms.first)
723
- {
724
- nI = itms.total - itms.first;
725
- }
726
- }
727
-
728
- // set new number of visible items
729
- opts.items.visibleConf.old = opts.items.visible;
730
- if (opts.items.visibleConf.variable)
731
- {
732
- var vI = cf_getItemsAdjust(gn_getVisibleItemsNext(a_itm, opts, itms.total-nI), opts, opts.items.visibleConf.adjust, $tt0);
733
- if (opts.items.visible+nI <= vI && nI < itms.total)
734
- {
735
- nI++;
736
- vI = cf_getItemsAdjust(gn_getVisibleItemsNext(a_itm, opts, itms.total-nI), opts, opts.items.visibleConf.adjust, $tt0);
737
- }
738
- opts.items.visible = vI;
739
- }
740
- else if (opts.items.filter != '*')
741
- {
742
- var vI = gn_getVisibleItemsNextFilter(a_itm, opts, itms.total-nI);
743
- opts.items.visible = cf_getItemsAdjust(vI, opts, opts.items.visibleConf.adjust, $tt0);
744
- }
745
-
746
- sz_resetMargin(a_itm, opts, true);
747
-
748
- // scroll 0, don't scroll
749
- if (nI == 0)
750
- {
751
- e.stopImmediatePropagation();
752
- return debug(conf, '0 items to scroll: Not scrolling.');
753
- }
754
- debug(conf, 'Scrolling '+nI+' items backward.');
755
-
756
-
757
- // save new config
758
- itms.first += nI;
759
- while (itms.first >= itms.total)
760
- {
761
- itms.first -= itms.total;
762
- }
763
-
764
- // non-circular callback
765
- if (!opts.circular)
766
- {
767
- if (itms.first == 0 && sO.onEnd)
768
- {
769
- sO.onEnd.call($tt0, 'prev');
770
- }
771
- if (!opts.infinite)
772
- {
773
- nv_enableNavi(opts, itms.first, conf);
774
- }
775
- }
776
-
777
- // rearrange items
778
- $cfs.children().slice(itms.total-nI, itms.total).prependTo($cfs);
779
- if (itms.total < opts.items.visible + nI)
780
- {
781
- $cfs.children().slice(0, (opts.items.visible+nI)-itms.total).clone(true).appendTo($cfs);
782
- }
783
-
784
- // the needed items
785
- var a_itm = $cfs.children(),
786
- i_old = gi_getOldItemsPrev(a_itm, opts, nI),
787
- i_new = gi_getNewItemsPrev(a_itm, opts),
788
- i_cur_l = a_itm.eq(nI-1),
789
- i_old_l = i_old.last(),
790
- i_new_l = i_new.last();
791
-
792
- sz_resetMargin(a_itm, opts);
793
-
794
- var pL = 0,
795
- pR = 0;
796
-
797
- if (opts.align)
798
- {
799
- var p = cf_getAlignPadding(i_new, opts);
800
- pL = p[0];
801
- pR = p[1];
802
- }
803
- var oL = (pL < 0) ? opts.padding[opts.d[3]] : 0;
804
-
805
- // hide items for fx directscroll
806
- var hiddenitems = false,
807
- i_skp = $();
808
- if (opts.items.visible < nI)
809
- {
810
- i_skp = a_itm.slice(opts.items.visibleConf.old, nI);
811
- if (sO.fx == 'directscroll')
812
- {
813
- var orgW = opts.items[opts.d['width']];
814
- hiddenitems = i_skp;
815
- i_cur_l = i_new_l;
816
- sc_hideHiddenItems(hiddenitems);
817
- opts.items[opts.d['width']] = 'variable';
818
- }
819
- }
820
- // save new sizes
821
- var $cf2 = false,
822
- i_siz = ms_getTotalSize(a_itm.slice(0, nI), opts, 'width'),
823
- w_siz = cf_mapWrapperSizes(ms_getSizes(i_new, opts, true), opts, !opts.usePadding),
824
- i_siz_vis = 0,
825
- a_cfs = {},
826
- a_wsz = {},
827
- a_cur = {},
828
- a_old = {},
829
- a_new = {},
830
- a_lef = {},
831
- a_lef_vis = {},
832
- a_dur = sc_getDuration(sO, opts, nI, i_siz);
833
-
834
- switch(sO.fx)
835
- {
836
- case 'cover':
837
- case 'cover-fade':
838
- i_siz_vis = ms_getTotalSize(a_itm.slice(0, opts.items.visible), opts, 'width');
839
- break;
840
- }
841
-
842
- if (hiddenitems)
843
- {
844
- opts.items[opts.d['width']] = orgW;
845
- }
846
-
847
- sz_resetMargin(a_itm, opts, true);
848
- if (pR >= 0)
849
- {
850
- sz_resetMargin(i_old_l, opts, opts.padding[opts.d[1]]);
851
- }
852
- if (pL >= 0)
853
- {
854
- sz_resetMargin(i_cur_l, opts, opts.padding[opts.d[3]]);
855
- }
856
-
857
- if (opts.align)
858
- {
859
- opts.padding[opts.d[1]] = pR;
860
- opts.padding[opts.d[3]] = pL;
861
- }
862
-
863
- a_lef[opts.d['left']] = -(i_siz - oL);
864
- a_lef_vis[opts.d['left']] = -(i_siz_vis - oL);
865
- a_wsz[opts.d['left']] = w_siz[opts.d['width']];
866
-
867
- // scrolling functions
868
- var _s_wrapper = function() {},
869
- _a_wrapper = function() {},
870
- _s_paddingold = function() {},
871
- _a_paddingold = function() {},
872
- _s_paddingnew = function() {},
873
- _a_paddingnew = function() {},
874
- _s_paddingcur = function() {},
875
- _a_paddingcur = function() {},
876
- _onafter = function() {},
877
- _moveitems = function() {},
878
- _position = function() {};
879
-
880
- // clone carousel
881
- switch(sO.fx)
882
- {
883
- case 'crossfade':
884
- case 'cover':
885
- case 'cover-fade':
886
- case 'uncover':
887
- case 'uncover-fade':
888
- $cf2 = $cfs.clone(true).appendTo($wrp);
889
- break;
890
- }
891
- switch(sO.fx)
892
- {
893
- case 'crossfade':
894
- case 'uncover':
895
- case 'uncover-fade':
896
- $cf2.children().slice(0, nI).remove();
897
- $cf2.children().slice(opts.items.visibleConf.old).remove();
898
- break;
899
-
900
- case 'cover':
901
- case 'cover-fade':
902
- $cf2.children().slice(opts.items.visible).remove();
903
- $cf2.css(a_lef_vis);
904
- break;
905
- }
906
-
907
- $cfs.css(a_lef);
908
-
909
- // reset all scrolls
910
- scrl = sc_setScroll(a_dur, sO.easing, conf);
911
-
912
- // animate / set carousel
913
- a_cfs[opts.d['left']] = (opts.usePadding) ? opts.padding[opts.d[3]] : 0;
914
-
915
- // animate / set wrapper
916
- if (opts[opts.d['width']] == 'variable' || opts[opts.d['height']] == 'variable')
917
- {
918
- _s_wrapper = function() {
919
- $wrp.css(w_siz);
920
- };
921
- _a_wrapper = function() {
922
- scrl.anims.push([$wrp, w_siz]);
923
- };
924
- }
925
-
926
- // animate / set items
927
- if (opts.usePadding)
928
- {
929
- if (i_new_l.not(i_cur_l).length)
930
- {
931
- a_cur[opts.d['marginRight']] = i_cur_l.data('_cfs_origCssMargin');
932
-
933
- if (pL < 0)
934
- {
935
- i_cur_l.css(a_cur);
936
- }
937
- else
938
- {
939
- _s_paddingcur = function() {
940
- i_cur_l.css(a_cur);
941
- };
942
- _a_paddingcur = function() {
943
- scrl.anims.push([i_cur_l, a_cur]);
944
- };
945
- }
946
- }
947
- switch(sO.fx)
948
- {
949
- case 'cover':
950
- case 'cover-fade':
951
- $cf2.children().eq(nI-1).css(a_cur);
952
- break;
953
- }
954
-
955
- if (i_new_l.not(i_old_l).length)
956
- {
957
- a_old[opts.d['marginRight']] = i_old_l.data('_cfs_origCssMargin');
958
- _s_paddingold = function() {
959
- i_old_l.css(a_old);
960
- };
961
- _a_paddingold = function() {
962
- scrl.anims.push([i_old_l, a_old]);
963
- };
964
- }
965
-
966
- if (pR >= 0)
967
- {
968
- a_new[opts.d['marginRight']] = i_new_l.data('_cfs_origCssMargin') + opts.padding[opts.d[1]];
969
- _s_paddingnew = function() {
970
- i_new_l.css(a_new);
971
- };
972
- _a_paddingnew = function() {
973
- scrl.anims.push([i_new_l, a_new]);
974
- };
975
- }
976
- }
977
-
978
- // set position
979
- _position = function() {
980
- $cfs.css(a_cfs);
981
- };
982
-
983
-
984
- var overFill = opts.items.visible+nI-itms.total;
985
-
986
- // rearrange items
987
- _moveitems = function() {
988
- if (overFill > 0)
989
- {
990
- $cfs.children().slice(itms.total).remove();
991
- i_old = $( $cfs.children().slice(itms.total-(opts.items.visible-overFill)).get().concat( $cfs.children().slice(0, overFill).get() ) );
992
- }
993
- sc_showHiddenItems(hiddenitems);
994
-
995
- if (opts.usePadding)
996
- {
997
- var l_itm = $cfs.children().eq(opts.items.visible+nI-1);
998
- l_itm.css(opts.d['marginRight'], l_itm.data('_cfs_origCssMargin'));
999
- }
1000
- };
1001
-
1002
-
1003
- var cb_arguments = sc_mapCallbackArguments(i_old, i_skp, i_new, nI, 'prev', a_dur, w_siz);
1004
-
1005
- // fire onAfter callbacks
1006
- _onafter = function() {
1007
- sc_afterScroll($cfs, $cf2, sO);
1008
- crsl.isScrolling = false;
1009
- clbk.onAfter = sc_fireCallbacks($tt0, sO, 'onAfter', cb_arguments, clbk);
1010
- queu = sc_fireQueue($cfs, queu, conf);
1011
-
1012
- if (!crsl.isPaused)
1013
- {
1014
- $cfs.trigger(cf_e('play', conf));
1015
- }
1016
- };
1017
-
1018
- // fire onBefore callback
1019
- crsl.isScrolling = true;
1020
- tmrs = sc_clearTimers(tmrs);
1021
- clbk.onBefore = sc_fireCallbacks($tt0, sO, 'onBefore', cb_arguments, clbk);
1022
-
1023
- switch(sO.fx)
1024
- {
1025
- case 'none':
1026
- $cfs.css(a_cfs);
1027
- _s_wrapper();
1028
- _s_paddingold();
1029
- _s_paddingnew();
1030
- _s_paddingcur();
1031
- _position();
1032
- _moveitems();
1033
- _onafter();
1034
- break;
1035
-
1036
- case 'fade':
1037
- scrl.anims.push([$cfs, { 'opacity': 0 }, function() {
1038
- _s_wrapper();
1039
- _s_paddingold();
1040
- _s_paddingnew();
1041
- _s_paddingcur();
1042
- _position();
1043
- _moveitems();
1044
- scrl = sc_setScroll(a_dur, sO.easing, conf);
1045
- scrl.anims.push([$cfs, { 'opacity': 1 }, _onafter]);
1046
- sc_startScroll(scrl, conf);
1047
- }]);
1048
- break;
1049
-
1050
- case 'crossfade':
1051
- $cfs.css({ 'opacity': 0 });
1052
- scrl.anims.push([$cf2, { 'opacity': 0 }]);
1053
- scrl.anims.push([$cfs, { 'opacity': 1 }, _onafter]);
1054
- _a_wrapper();
1055
- _s_paddingold();
1056
- _s_paddingnew();
1057
- _s_paddingcur();
1058
- _position();
1059
- _moveitems();
1060
- break;
1061
-
1062
- case 'cover':
1063
- scrl.anims.push([$cf2, a_cfs, function() {
1064
- _s_paddingold();
1065
- _s_paddingnew();
1066
- _s_paddingcur();
1067
- _position();
1068
- _moveitems();
1069
- _onafter();
1070
- }]);
1071
- _a_wrapper();
1072
- break;
1073
-
1074
- case 'cover-fade':
1075
- scrl.anims.push([$cfs, { 'opacity': 0 }]);
1076
- scrl.anims.push([$cf2, a_cfs, function() {
1077
- _s_paddingold();
1078
- _s_paddingnew();
1079
- _s_paddingcur();
1080
- _position();
1081
- _moveitems();
1082
- _onafter();
1083
- }]);
1084
- _a_wrapper();
1085
- break;
1086
-
1087
- case 'uncover':
1088
- scrl.anims.push([$cf2, a_wsz, _onafter]);
1089
- _a_wrapper();
1090
- _s_paddingold();
1091
- _s_paddingnew();
1092
- _s_paddingcur();
1093
- _position();
1094
- _moveitems();
1095
- break;
1096
-
1097
- case 'uncover-fade':
1098
- $cfs.css({ 'opacity': 0 });
1099
- scrl.anims.push([$cfs, { 'opacity': 1 }]);
1100
- scrl.anims.push([$cf2, a_wsz, _onafter]);
1101
- _a_wrapper();
1102
- _s_paddingold();
1103
- _s_paddingnew();
1104
- _s_paddingcur();
1105
- _position();
1106
- _moveitems();
1107
- break;
1108
-
1109
- default:
1110
- scrl.anims.push([$cfs, a_cfs, function() {
1111
- _moveitems();
1112
- _onafter();
1113
- }]);
1114
- _a_wrapper();
1115
- _a_paddingold();
1116
- _a_paddingnew();
1117
- _a_paddingcur();
1118
- break;
1119
- }
1120
-
1121
- sc_startScroll(scrl, conf);
1122
- cf_setCookie(opts.cookie, $cfs, conf);
1123
-
1124
- $cfs.trigger(cf_e('updatePageStatus', conf), [false, w_siz]);
1125
-
1126
- return true;
1127
- });
1128
-
1129
-
1130
- // next event
1131
- $cfs.bind(cf_e('slide_next', conf), function(e, sO, nI) {
1132
- e.stopPropagation();
1133
- var a_itm = $cfs.children();
1134
-
1135
- // non-circular at end, scroll to start
1136
- if (!opts.circular)
1137
- {
1138
- if (itms.first == opts.items.visible)
1139
- {
1140
- if (opts.infinite)
1141
- {
1142
- $cfs.trigger(cf_e('prev', conf), itms.total-1);
1143
- }
1144
- return e.stopImmediatePropagation();
1145
- }
1146
- }
1147
-
1148
- sz_resetMargin(a_itm, opts);
1149
-
1150
- // find number of items to scroll
1151
- if (!is_number(nI))
1152
- {
1153
- if (opts.items.filter != '*')
1154
- {
1155
- var xI = (is_number(sO.items)) ? sO.items : gn_getVisibleOrg($cfs, opts);
1156
- nI = gn_getScrollItemsNextFilter(a_itm, opts, 0, xI);
1157
- }
1158
- else
1159
- {
1160
- nI = opts.items.visible;
1161
- }
1162
- nI = cf_getAdjust(nI, opts, sO.items, $tt0);
1163
- }
1164
-
1165
- var lastItemNr = (itms.first == 0) ? itms.total : itms.first;
1166
-
1167
- // prevent non-circular from scrolling to far
1168
- if (!opts.circular)
1169
- {
1170
- if (opts.items.visibleConf.variable)
1171
- {
1172
- var vI = gn_getVisibleItemsNext(a_itm, opts, nI),
1173
- xI = gn_getVisibleItemsPrev(a_itm, opts, lastItemNr-1);
1174
- }
1175
- else
1176
- {
1177
- var vI = opts.items.visible,
1178
- xI = opts.items.visible;
1179
- }
1180
-
1181
- if (nI + vI > lastItemNr)
1182
- {
1183
- nI = lastItemNr - xI;
1184
- }
1185
- }
1186
-
1187
- // set new number of visible items
1188
- opts.items.visibleConf.old = opts.items.visible;
1189
- if (opts.items.visibleConf.variable)
1190
- {
1191
- var vI = cf_getItemsAdjust(gn_getVisibleItemsNextTestCircular(a_itm, opts, nI, lastItemNr), opts, opts.items.visibleConf.adjust, $tt0);
1192
- while (opts.items.visible-nI >= vI && nI < itms.total)
1193
- {
1194
- nI++;
1195
- vI = cf_getItemsAdjust(gn_getVisibleItemsNextTestCircular(a_itm, opts, nI, lastItemNr), opts, opts.items.visibleConf.adjust, $tt0);
1196
- }
1197
- opts.items.visible = vI;
1198
- }
1199
- else if (opts.items.filter != '*')
1200
- {
1201
- var vI = gn_getVisibleItemsNextFilter(a_itm, opts, nI);
1202
- opts.items.visible = cf_getItemsAdjust(vI, opts, opts.items.visibleConf.adjust, $tt0);
1203
- }
1204
-
1205
- sz_resetMargin(a_itm, opts, true);
1206
-
1207
- // scroll 0, don't scroll
1208
- if (nI == 0)
1209
- {
1210
- e.stopImmediatePropagation();
1211
- return debug(conf, '0 items to scroll: Not scrolling.');
1212
- }
1213
- debug(conf, 'Scrolling '+nI+' items forward.');
1214
-
1215
-
1216
- // save new config
1217
- itms.first -= nI;
1218
- while (itms.first < 0)
1219
- {
1220
- itms.first += itms.total;
1221
- }
1222
-
1223
- // non-circular callback
1224
- if (!opts.circular)
1225
- {
1226
- if (itms.first == opts.items.visible && sO.onEnd)
1227
- {
1228
- sO.onEnd.call($tt0, 'next');
1229
- }
1230
- if (!opts.infinite)
1231
- {
1232
- nv_enableNavi(opts, itms.first, conf);
1233
- }
1234
- }
1235
-
1236
- // rearrange items
1237
- if (itms.total < opts.items.visible+nI)
1238
- {
1239
- $cfs.children().slice(0, (opts.items.visible+nI)-itms.total).clone(true).appendTo($cfs);
1240
- }
1241
-
1242
- // the needed items
1243
- var a_itm = $cfs.children(),
1244
- i_old = gi_getOldItemsNext(a_itm, opts),
1245
- i_new = gi_getNewItemsNext(a_itm, opts, nI),
1246
- i_cur_l = a_itm.eq(nI-1),
1247
- i_old_l = i_old.last(),
1248
- i_new_l = i_new.last();
1249
-
1250
- sz_resetMargin(a_itm, opts);
1251
-
1252
- var pL = 0,
1253
- pR = 0;
1254
-
1255
- if (opts.align)
1256
- {
1257
- var p = cf_getAlignPadding(i_new, opts);
1258
- pL = p[0];
1259
- pR = p[1];
1260
- }
1261
-
1262
- // hide items for fx directscroll
1263
- var hiddenitems = false,
1264
- i_skp = $();
1265
- if (opts.items.visibleConf.old < nI)
1266
- {
1267
- i_skp = a_itm.slice(opts.items.visibleConf.old, nI);
1268
- if (sO.fx == 'directscroll')
1269
- {
1270
- var orgW = opts.items[opts.d['width']];
1271
- hiddenitems = i_skp;
1272
- i_cur_l = i_old_l;
1273
- sc_hideHiddenItems(hiddenitems);
1274
- opts.items[opts.d['width']] = 'variable';
1275
- }
1276
- }
1277
- // save new sizes
1278
- var $cf2 = false,
1279
- i_siz = ms_getTotalSize(a_itm.slice(0, nI), opts, 'width'),
1280
- w_siz = cf_mapWrapperSizes(ms_getSizes(i_new, opts, true), opts, !opts.usePadding),
1281
- i_siz_vis = 0,
1282
- a_cfs = {},
1283
- a_cfs_vis = {},
1284
- a_cur = {},
1285
- a_old = {},
1286
- a_lef = {},
1287
- a_dur = sc_getDuration(sO, opts, nI, i_siz);
1288
-
1289
- switch(sO.fx)
1290
- {
1291
- case 'uncover':
1292
- case 'uncover-fade':
1293
- i_siz_vis = ms_getTotalSize(a_itm.slice(0, opts.items.visibleConf.old), opts, 'width');
1294
- break;
1295
- }
1296
-
1297
- if (hiddenitems)
1298
- {
1299
- opts.items[opts.d['width']] = orgW;
1300
- }
1301
-
1302
- if (opts.align)
1303
- {
1304
- if (opts.padding[opts.d[1]] < 0)
1305
- {
1306
- opts.padding[opts.d[1]] = 0;
1307
- }
1308
- }
1309
- sz_resetMargin(a_itm, opts, true);
1310
- sz_resetMargin(i_old_l, opts, opts.padding[opts.d[1]]);
1311
-
1312
- if (opts.align)
1313
- {
1314
- opts.padding[opts.d[1]] = pR;
1315
- opts.padding[opts.d[3]] = pL;
1316
- }
1317
-
1318
- a_lef[opts.d['left']] = (opts.usePadding) ? opts.padding[opts.d[3]] : 0;
1319
-
1320
- // scrolling functions
1321
- var _s_wrapper = function() {},
1322
- _a_wrapper = function() {},
1323
- _s_paddingold = function() {},
1324
- _a_paddingold = function() {},
1325
- _s_paddingcur = function() {},
1326
- _a_paddingcur = function() {},
1327
- _onafter = function() {},
1328
- _moveitems = function() {},
1329
- _position = function() {};
1330
-
1331
- // clone carousel
1332
- switch(sO.fx)
1333
- {
1334
- case 'crossfade':
1335
- case 'cover':
1336
- case 'cover-fade':
1337
- case 'uncover':
1338
- case 'uncover-fade':
1339
- $cf2 = $cfs.clone(true).appendTo($wrp);
1340
- $cf2.children().slice(opts.items.visibleConf.old).remove();
1341
- break;
1342
- }
1343
- switch(sO.fx)
1344
- {
1345
- case 'crossfade':
1346
- case 'cover':
1347
- case 'cover-fade':
1348
- $cfs.css('zIndex', 1);
1349
- $cf2.css('zIndex', 0);
1350
- break;
1351
- }
1352
-
1353
- // reset all scrolls
1354
- scrl = sc_setScroll(a_dur, sO.easing, conf);
1355
-
1356
- // animate / set carousel
1357
- a_cfs[opts.d['left']] = -i_siz;
1358
- a_cfs_vis[opts.d['left']] = -i_siz_vis;
1359
-
1360
- if (pL < 0)
1361
- {
1362
- a_cfs[opts.d['left']] += pL;
1363
- }
1364
-
1365
- // animate / set wrapper
1366
- if (opts[opts.d['width']] == 'variable' || opts[opts.d['height']] == 'variable')
1367
- {
1368
- _s_wrapper = function() {
1369
- $wrp.css(w_siz);
1370
- };
1371
- _a_wrapper = function() {
1372
- scrl.anims.push([$wrp, w_siz]);
1373
- };
1374
- }
1375
-
1376
- // animate / set items
1377
- if (opts.usePadding)
1378
- {
1379
- var i_new_l_m = i_new_l.data('_cfs_origCssMargin');
1380
-
1381
- if (pR >= 0)
1382
- {
1383
- i_new_l_m += opts.padding[opts.d[1]];
1384
- }
1385
- i_new_l.css(opts.d['marginRight'], i_new_l_m);
1386
-
1387
- if (i_cur_l.not(i_old_l).length)
1388
- {
1389
- a_old[opts.d['marginRight']] = i_old_l.data('_cfs_origCssMargin');
1390
- }
1391
- _s_paddingold = function() {
1392
- i_old_l.css(a_old);
1393
- };
1394
- _a_paddingold = function() {
1395
- scrl.anims.push([i_old_l, a_old]);
1396
- };
1397
-
1398
- var i_cur_l_m = i_cur_l.data('_cfs_origCssMargin');
1399
- if (pL > 0)
1400
- {
1401
- i_cur_l_m += opts.padding[opts.d[3]];
1402
- }
1403
-
1404
- a_cur[opts.d['marginRight']] = i_cur_l_m;
1405
-
1406
- _s_paddingcur = function() {
1407
- i_cur_l.css(a_cur);
1408
- };
1409
- _a_paddingcur = function() {
1410
- scrl.anims.push([i_cur_l, a_cur]);
1411
- };
1412
- }
1413
-
1414
- // set position
1415
- _position = function() {
1416
- $cfs.css(a_lef);
1417
- };
1418
-
1419
-
1420
- var overFill = opts.items.visible+nI-itms.total;
1421
-
1422
- // rearrange items
1423
- _moveitems = function() {
1424
- if (overFill > 0)
1425
- {
1426
- $cfs.children().slice(itms.total).remove();
1427
- }
1428
- var l_itm = $cfs.children().slice(0, nI).appendTo($cfs).last();
1429
- if (overFill > 0)
1430
- {
1431
- i_new = gi_getCurrentItems(a_itm, opts);
1432
- }
1433
- sc_showHiddenItems(hiddenitems);
1434
-
1435
- if (opts.usePadding)
1436
- {
1437
- if (itms.total < opts.items.visible+nI) {
1438
- var i_cur_l = $cfs.children().eq(opts.items.visible-1);
1439
- i_cur_l.css(opts.d['marginRight'], i_cur_l.data('_cfs_origCssMargin') + opts.padding[opts.d[1]]);
1440
- }
1441
- l_itm.css(opts.d['marginRight'], l_itm.data('_cfs_origCssMargin'));
1442
- }
1443
- };
1444
-
1445
-
1446
- var cb_arguments = sc_mapCallbackArguments(i_old, i_skp, i_new, nI, 'next', a_dur, w_siz);
1447
-
1448
- // fire onAfter callbacks
1449
- _onafter = function() {
1450
- $cfs.css('zIndex', $cfs.data('_cfs_origCssZindex'));
1451
- sc_afterScroll($cfs, $cf2, sO);
1452
- crsl.isScrolling = false;
1453
- clbk.onAfter = sc_fireCallbacks($tt0, sO, 'onAfter', cb_arguments, clbk);
1454
- queu = sc_fireQueue($cfs, queu, conf);
1455
-
1456
- if (!crsl.isPaused)
1457
- {
1458
- $cfs.trigger(cf_e('play', conf));
1459
- }
1460
- };
1461
-
1462
- // fire onBefore callbacks
1463
- crsl.isScrolling = true;
1464
- tmrs = sc_clearTimers(tmrs);
1465
- clbk.onBefore = sc_fireCallbacks($tt0, sO, 'onBefore', cb_arguments, clbk);
1466
-
1467
- switch(sO.fx)
1468
- {
1469
- case 'none':
1470
- $cfs.css(a_cfs);
1471
- _s_wrapper();
1472
- _s_paddingold();
1473
- _s_paddingcur();
1474
- _position();
1475
- _moveitems();
1476
- _onafter();
1477
- break;
1478
-
1479
- case 'fade':
1480
- scrl.anims.push([$cfs, { 'opacity': 0 }, function() {
1481
- _s_wrapper();
1482
- _s_paddingold();
1483
- _s_paddingcur();
1484
- _position();
1485
- _moveitems();
1486
- scrl = sc_setScroll(a_dur, sO.easing, conf);
1487
- scrl.anims.push([$cfs, { 'opacity': 1 }, _onafter]);
1488
- sc_startScroll(scrl, conf);
1489
- }]);
1490
- break;
1491
-
1492
- case 'crossfade':
1493
- $cfs.css({ 'opacity': 0 });
1494
- scrl.anims.push([$cf2, { 'opacity': 0 }]);
1495
- scrl.anims.push([$cfs, { 'opacity': 1 }, _onafter]);
1496
- _a_wrapper();
1497
- _s_paddingold();
1498
- _s_paddingcur();
1499
- _position();
1500
- _moveitems();
1501
- break;
1502
-
1503
- case 'cover':
1504
- $cfs.css(opts.d['left'], $wrp[opts.d['width']]());
1505
- scrl.anims.push([$cfs, a_lef, _onafter]);
1506
- _a_wrapper();
1507
- _s_paddingold();
1508
- _s_paddingcur();
1509
- _moveitems();
1510
- break;
1511
-
1512
- case 'cover-fade':
1513
- $cfs.css(opts.d['left'], $wrp[opts.d['width']]());
1514
- scrl.anims.push([$cf2, { 'opacity': 0 }]);
1515
- scrl.anims.push([$cfs, a_lef, _onafter]);
1516
- _a_wrapper();
1517
- _s_paddingold();
1518
- _s_paddingcur();
1519
- _moveitems();
1520
- break;
1521
-
1522
- case 'uncover':
1523
- scrl.anims.push([$cf2, a_cfs_vis, _onafter]);
1524
- _a_wrapper();
1525
- _s_paddingold();
1526
- _s_paddingcur();
1527
- _position();
1528
- _moveitems();
1529
- break;
1530
-
1531
- case 'uncover-fade':
1532
- $cfs.css({ 'opacity': 0 });
1533
- scrl.anims.push([$cfs, { 'opacity': 1 }]);
1534
- scrl.anims.push([$cf2, a_cfs_vis, _onafter]);
1535
- _a_wrapper();
1536
- _s_paddingold();
1537
- _s_paddingcur();
1538
- _position();
1539
- _moveitems();
1540
- break;
1541
-
1542
- default:
1543
- scrl.anims.push([$cfs, a_cfs, function() {
1544
- _position();
1545
- _moveitems();
1546
- _onafter();
1547
- }]);
1548
- _a_wrapper();
1549
- _a_paddingold();
1550
- _a_paddingcur();
1551
- break;
1552
- }
1553
-
1554
- sc_startScroll(scrl, conf);
1555
- cf_setCookie(opts.cookie, $cfs, conf);
1556
-
1557
- $cfs.trigger(cf_e('updatePageStatus', conf), [false, w_siz]);
1558
-
1559
- return true;
1560
- });
1561
-
1562
-
1563
- // slideTo event
1564
- $cfs.bind(cf_e('slideTo', conf), function(e, num, dev, org, obj, dir, clb) {
1565
- e.stopPropagation();
1566
-
1567
- var v = [num, dev, org, obj, dir, clb],
1568
- t = ['string/number/object', 'number', 'boolean', 'object', 'string', 'function'],
1569
- a = cf_sortParams(v, t);
1570
-
1571
- obj = a[3];
1572
- dir = a[4];
1573
- clb = a[5];
1574
-
1575
- num = gn_getItemIndex(a[0], a[1], a[2], itms, $cfs);
1576
-
1577
- if (num == 0)
1578
- {
1579
- return false;
1580
- }
1581
- if (!is_object(obj))
1582
- {
1583
- obj = false;
1584
- }
1585
-
1586
- if (dir != 'prev' && dir != 'next')
1587
- {
1588
- if (opts.circular)
1589
- {
1590
- dir = (num <= itms.total / 2) ? 'next' : 'prev';
1591
- }
1592
- else
1593
- {
1594
- dir = (itms.first == 0 || itms.first > num) ? 'next' : 'prev';
1595
- }
1596
- }
1597
-
1598
- if (dir == 'prev')
1599
- {
1600
- num = itms.total-num;
1601
- }
1602
- $cfs.trigger(cf_e(dir, conf), [obj, num, clb]);
1603
-
1604
- return true;
1605
- });
1606
-
1607
-
1608
- // prevPage event
1609
- $cfs.bind(cf_e('prevPage', conf), function(e, obj, clb) {
1610
- e.stopPropagation();
1611
- var cur = $cfs.triggerHandler(cf_e('currentPage', conf));
1612
- return $cfs.triggerHandler(cf_e('slideToPage', conf), [cur-1, obj, 'prev', clb]);
1613
- });
1614
-
1615
-
1616
- // nextPage event
1617
- $cfs.bind(cf_e('nextPage', conf), function(e, obj, clb) {
1618
- e.stopPropagation();
1619
- var cur = $cfs.triggerHandler(cf_e('currentPage', conf));
1620
- return $cfs.triggerHandler(cf_e('slideToPage', conf), [cur+1, obj, 'next', clb]);
1621
- });
1622
-
1623
-
1624
- // slideToPage event
1625
- $cfs.bind(cf_e('slideToPage', conf), function(e, pag, obj, dir, clb) {
1626
- e.stopPropagation();
1627
- if (!is_number(pag))
1628
- {
1629
- pag = $cfs.triggerHandler(cf_e('currentPage', conf));
1630
- }
1631
- var ipp = opts.pagination.items || opts.items.visible,
1632
- max = Math.ceil(itms.total / ipp)-1;
1633
-
1634
- if (pag < 0)
1635
- {
1636
- pag = max;
1637
- }
1638
- if (pag > max)
1639
- {
1640
- pag = 0;
1641
- }
1642
- return $cfs.triggerHandler(cf_e('slideTo', conf), [pag*ipp, 0, true, obj, dir, clb]);
1643
- });
1644
-
1645
- // jumpToStart event
1646
- $cfs.bind(cf_e('jumpToStart', conf), function(e, s) {
1647
- e.stopPropagation();
1648
- if (s)
1649
- {
1650
- s = gn_getItemIndex(s, 0, true, itms, $cfs);
1651
- }
1652
- else
1653
- {
1654
- s = 0;
1655
- }
1656
-
1657
- s += itms.first;
1658
- if (s != 0)
1659
- {
1660
- if (itms.total > 0)
1661
- {
1662
- while (s > itms.total)
1663
- {
1664
- s -= itms.total;
1665
- }
1666
- }
1667
- $cfs.prepend($cfs.children().slice(s, itms.total));
1668
- }
1669
- return true;
1670
- });
1671
-
1672
-
1673
- // synchronise event
1674
- $cfs.bind(cf_e('synchronise', conf), function(e, s) {
1675
- e.stopPropagation();
1676
- if (s)
1677
- {
1678
- s = cf_getSynchArr(s);
1679
- }
1680
- else if (opts.synchronise)
1681
- {
1682
- s = opts.synchronise;
1683
- }
1684
- else
1685
- {
1686
- return debug(conf, 'No carousel to synchronise.');
1687
- }
1688
-
1689
- var n = $cfs.triggerHandler(cf_e('currentPosition', conf)),
1690
- x = true;
1691
-
1692
- for (var j = 0, l = s.length; j < l; j++)
1693
- {
1694
- if (!s[j][0].triggerHandler(cf_e('slideTo', conf), [n, s[j][3], true]))
1695
- {
1696
- x = false;
1697
- }
1698
- }
1699
- return x;
1700
- });
1701
-
1702
-
1703
- // queue event
1704
- $cfs.bind(cf_e('queue', conf), function(e, dir, opt) {
1705
- e.stopPropagation();
1706
- if (is_function(dir))
1707
- {
1708
- dir.call($tt0, queu);
1709
- }
1710
- else if (is_array(dir))
1711
- {
1712
- queu = dir;
1713
- }
1714
- else if (!is_undefined(dir))
1715
- {
1716
- queu.push([dir, opt]);
1717
- }
1718
- return queu;
1719
- });
1720
-
1721
-
1722
- // insertItem event
1723
- $cfs.bind(cf_e('insertItem', conf), function(e, itm, num, org, dev) {
1724
- e.stopPropagation();
1725
-
1726
- var v = [itm, num, org, dev],
1727
- t = ['string/object', 'string/number/object', 'boolean', 'number'],
1728
- a = cf_sortParams(v, t);
1729
-
1730
- itm = a[0];
1731
- num = a[1];
1732
- org = a[2];
1733
- dev = a[3];
1734
-
1735
- if (is_object(itm) && !is_jquery(itm))
1736
- {
1737
- itm = $(itm);
1738
- }
1739
- else if (is_string(itm))
1740
- {
1741
- itm = $(itm);
1742
- }
1743
- if (!is_jquery(itm) || itm.length == 0)
1744
- {
1745
- return debug(conf, 'Not a valid object.');
1746
- }
1747
-
1748
- if (is_undefined(num))
1749
- {
1750
- num = 'end';
1751
- }
1752
-
1753
- sz_storeMargin(itm, opts);
1754
- sz_storeOrigCss(itm);
1755
-
1756
- var orgNum = num,
1757
- before = 'before';
1758
-
1759
- if (num == 'end')
1760
- {
1761
- if (org)
1762
- {
1763
- if (itms.first == 0)
1764
- {
1765
- num = itms.total-1;
1766
- before = 'after';
1767
- }
1768
- else
1769
- {
1770
- num = itms.first;
1771
- itms.first += itm.length;
1772
- }
1773
- if (num < 0)
1774
- {
1775
- num = 0;
1776
- }
1777
- }
1778
- else
1779
- {
1780
- num = itms.total-1;
1781
- before = 'after';
1782
- }
1783
- }
1784
- else
1785
- {
1786
- num = gn_getItemIndex(num, dev, org, itms, $cfs);
1787
- }
1788
-
1789
- var $cit = $cfs.children().eq(num);
1790
- if ($cit.length)
1791
- {
1792
- $cit[before](itm);
1793
- }
1794
- else
1795
- {
1796
- debug(conf, 'Correct insert-position not found! Appending item to the end.');
1797
- $cfs.append(itm);
1798
- }
1799
-
1800
- if (orgNum != 'end' && !org)
1801
- {
1802
- if (num < itms.first)
1803
- {
1804
- itms.first += itm.length;
1805
- }
1806
- }
1807
- itms.total = $cfs.children().length;
1808
- if (itms.first >= itms.total)
1809
- {
1810
- itms.first -= itms.total;
1811
- }
1812
-
1813
- $cfs.trigger(cf_e('updateSizes', conf));
1814
- $cfs.trigger(cf_e('linkAnchors', conf));
1815
-
1816
- return true;
1817
- });
1818
-
1819
-
1820
- // removeItem event
1821
- $cfs.bind(cf_e('removeItem', conf), function(e, num, org, dev) {
1822
- e.stopPropagation();
1823
-
1824
- var v = [num, org, dev],
1825
- t = ['string/number/object', 'boolean', 'number'],
1826
- a = cf_sortParams(v, t);
1827
-
1828
- num = a[0];
1829
- org = a[1];
1830
- dev = a[2];
1831
-
1832
- var removed = false;
1833
-
1834
- if (num instanceof $ && num.length > 1)
1835
- {
1836
- $removed = $();
1837
- num.each(function(i, el) {
1838
- var $rem = $cfs.trigger(cf_e('removeItem', conf), [$(this), org, dev]);
1839
- if ( $rem )
1840
- {
1841
- $removed = $removed.add($rem);
1842
- }
1843
- });
1844
- return $removed;
1845
- }
1846
-
1847
- if (is_undefined(num) || num == 'end')
1848
- {
1849
- $removed = $cfs.children().last();
1850
- }
1851
- else
1852
- {
1853
- num = gn_getItemIndex(num, dev, org, itms, $cfs);
1854
- var $removed = $cfs.children().eq(num);
1855
- if ( $removed.length )
1856
- {
1857
- if (num < itms.first)
1858
- {
1859
- itms.first -= $removed.length;
1860
- }
1861
- }
1862
- }
1863
- if ( $removed && $removed.length )
1864
- {
1865
- $removed.detach();
1866
- itms.total = $cfs.children().length;
1867
- $cfs.trigger(cf_e('updateSizes', conf));
1868
- }
1869
-
1870
- return $removed;
1871
- });
1872
-
1873
-
1874
- // onBefore and onAfter event
1875
- $cfs.bind(cf_e('onBefore', conf)+' '+cf_e('onAfter', conf), function(e, fn) {
1876
- e.stopPropagation();
1877
- var eType = e.type.slice(conf.events.prefix.length);
1878
- if (is_array(fn))
1879
- {
1880
- clbk[eType] = fn;
1881
- }
1882
- if (is_function(fn))
1883
- {
1884
- clbk[eType].push(fn);
1885
- }
1886
- return clbk[eType];
1887
- });
1888
-
1889
-
1890
- // currentPosition event
1891
- $cfs.bind(cf_e('currentPosition', conf), function(e, fn) {
1892
- e.stopPropagation();
1893
- if (itms.first == 0)
1894
- {
1895
- var val = 0;
1896
- }
1897
- else
1898
- {
1899
- var val = itms.total - itms.first;
1900
- }
1901
- if (is_function(fn))
1902
- {
1903
- fn.call($tt0, val);
1904
- }
1905
- return val;
1906
- });
1907
-
1908
-
1909
- // currentPage event
1910
- $cfs.bind(cf_e('currentPage', conf), function(e, fn) {
1911
- e.stopPropagation();
1912
- var ipp = opts.pagination.items || opts.items.visible,
1913
- max = Math.ceil(itms.total/ipp-1),
1914
- nr;
1915
- if (itms.first == 0)
1916
- {
1917
- nr = 0;
1918
- }
1919
- else if (itms.first < itms.total % ipp)
1920
- {
1921
- nr = 0;
1922
- }
1923
- else if (itms.first == ipp && !opts.circular)
1924
- {
1925
- nr = max;
1926
- }
1927
- else
1928
- {
1929
- nr = Math.round((itms.total-itms.first)/ipp);
1930
- }
1931
- if (nr < 0)
1932
- {
1933
- nr = 0;
1934
- }
1935
- if (nr > max)
1936
- {
1937
- nr = max;
1938
- }
1939
- if (is_function(fn))
1940
- {
1941
- fn.call($tt0, nr);
1942
- }
1943
- return nr;
1944
- });
1945
-
1946
-
1947
- // currentVisible event
1948
- $cfs.bind(cf_e('currentVisible', conf), function(e, fn) {
1949
- e.stopPropagation();
1950
- var $i = gi_getCurrentItems($cfs.children(), opts);
1951
- if (is_function(fn))
1952
- {
1953
- fn.call($tt0, $i);
1954
- }
1955
- return $i;
1956
- });
1957
-
1958
-
1959
- // slice event
1960
- $cfs.bind(cf_e('slice', conf), function(e, f, l, fn) {
1961
- e.stopPropagation();
1962
-
1963
- if (itms.total == 0)
1964
- {
1965
- return false;
1966
- }
1967
-
1968
- var v = [f, l, fn],
1969
- t = ['number', 'number', 'function'],
1970
- a = cf_sortParams(v, t);
1971
-
1972
- f = (is_number(a[0])) ? a[0] : 0;
1973
- l = (is_number(a[1])) ? a[1] : itms.total;
1974
- fn = a[2];
1975
-
1976
- f += itms.first;
1977
- l += itms.first;
1978
-
1979
- if (items.total > 0)
1980
- {
1981
- while (f > itms.total)
1982
- {
1983
- f -= itms.total;
1984
- }
1985
- while (l > itms.total)
1986
- {
1987
- l -= itms.total;
1988
- }
1989
- while (f < 0)
1990
- {
1991
- f += itms.total;
1992
- }
1993
- while (l < 0)
1994
- {
1995
- l += itms.total;
1996
- }
1997
- }
1998
- var $iA = $cfs.children(),
1999
- $i;
2000
-
2001
- if (l > f)
2002
- {
2003
- $i = $iA.slice(f, l);
2004
- }
2005
- else
2006
- {
2007
- $i = $( $iA.slice(f, itms.total).get().concat( $iA.slice(0, l).get() ) );
2008
- }
2009
-
2010
- if (is_function(fn))
2011
- {
2012
- fn.call($tt0, $i);
2013
- }
2014
- return $i;
2015
- });
2016
-
2017
-
2018
- // isPaused, isStopped and isScrolling events
2019
- $cfs.bind(cf_e('isPaused', conf)+' '+cf_e('isStopped', conf)+' '+cf_e('isScrolling', conf), function(e, fn) {
2020
- e.stopPropagation();
2021
- var eType = e.type.slice(conf.events.prefix.length),
2022
- value = crsl[eType];
2023
- if (is_function(fn))
2024
- {
2025
- fn.call($tt0, value);
2026
- }
2027
- return value;
2028
- });
2029
-
2030
-
2031
- // configuration event
2032
- $cfs.bind(cf_e('configuration', conf), function(e, a, b, c) {
2033
- e.stopPropagation();
2034
- var reInit = false;
2035
-
2036
- // return entire configuration-object
2037
- if (is_function(a))
2038
- {
2039
- a.call($tt0, opts);
2040
- }
2041
- // set multiple options via object
2042
- else if (is_object(a))
2043
- {
2044
- opts_orig = $.extend(true, {}, opts_orig, a);
2045
- if (b !== false) reInit = true;
2046
- else opts = $.extend(true, {}, opts, a);
2047
-
2048
- }
2049
- else if (!is_undefined(a))
2050
- {
2051
-
2052
- // callback function for specific option
2053
- if (is_function(b))
2054
- {
2055
- var val = eval('opts.'+a);
2056
- if (is_undefined(val))
2057
- {
2058
- val = '';
2059
- }
2060
- b.call($tt0, val);
2061
- }
2062
- // set individual option
2063
- else if (!is_undefined(b))
2064
- {
2065
- if (typeof c !== 'boolean') c = true;
2066
- eval('opts_orig.'+a+' = b');
2067
- if (c !== false) reInit = true;
2068
- else eval('opts.'+a+' = b');
2069
- }
2070
- // return value for specific option
2071
- else
2072
- {
2073
- return eval('opts.'+a);
2074
- }
2075
- }
2076
- if (reInit)
2077
- {
2078
- sz_resetMargin($cfs.children(), opts);
2079
- FN._init(opts_orig);
2080
- FN._bind_buttons();
2081
- var sz = sz_setSizes($cfs, opts);
2082
- $cfs.trigger(cf_e('updatePageStatus', conf), [true, sz]);
2083
- }
2084
- return opts;
2085
- });
2086
-
2087
-
2088
- // linkAnchors event
2089
- $cfs.bind(cf_e('linkAnchors', conf), function(e, $con, sel) {
2090
- e.stopPropagation();
2091
-
2092
- if (is_undefined($con))
2093
- {
2094
- $con = $('body');
2095
- }
2096
- else if (is_string($con))
2097
- {
2098
- $con = $($con);
2099
- }
2100
- if (!is_jquery($con) || $con.length == 0)
2101
- {
2102
- return debug(conf, 'Not a valid object.');
2103
- }
2104
- if (!is_string(sel))
2105
- {
2106
- sel = 'a.caroufredsel';
2107
- }
2108
-
2109
- $con.find(sel).each(function() {
2110
- var h = this.hash || '';
2111
- if (h.length > 0 && $cfs.children().index($(h)) != -1)
2112
- {
2113
- $(this).unbind('click').click(function(e) {
2114
- e.preventDefault();
2115
- $cfs.trigger(cf_e('slideTo', conf), h);
2116
- });
2117
- }
2118
- });
2119
- return true;
2120
- });
2121
-
2122
-
2123
- // updatePageStatus event
2124
- $cfs.bind(cf_e('updatePageStatus', conf), function(e, build, sizes) {
2125
- e.stopPropagation();
2126
- if (!opts.pagination.container)
2127
- {
2128
- return;
2129
- }
2130
-
2131
- var ipp = opts.pagination.items || opts.items.visible,
2132
- pgs = Math.ceil(itms.total/ipp);
2133
-
2134
- if (build)
2135
- {
2136
- if (opts.pagination.anchorBuilder)
2137
- {
2138
- opts.pagination.container.children().remove();
2139
- opts.pagination.container.each(function() {
2140
- for (var a = 0; a < pgs; a++)
2141
- {
2142
- var i = $cfs.children().eq( gn_getItemIndex(a*ipp, 0, true, itms, $cfs) );
2143
- $(this).append(opts.pagination.anchorBuilder.call(i[0], a+1));
2144
- }
2145
- });
2146
- }
2147
- opts.pagination.container.each(function() {
2148
- $(this).children().unbind(opts.pagination.event).each(function(a) {
2149
- $(this).bind(opts.pagination.event, function(e) {
2150
- e.preventDefault();
2151
- $cfs.trigger(cf_e('slideTo', conf), [a*ipp, -opts.pagination.deviation, true, opts.pagination]);
2152
- });
2153
- });
2154
- });
2155
- }
2156
-
2157
- var selected = $cfs.triggerHandler(cf_e('currentPage', conf)) + opts.pagination.deviation;
2158
- if (selected >= pgs)
2159
- {
2160
- selected = 0;
2161
- }
2162
- if (selected < 0)
2163
- {
2164
- selected = pgs-1;
2165
- }
2166
- opts.pagination.container.each(function() {
2167
- $(this).children().removeClass(cf_c('selected', conf)).eq(selected).addClass(cf_c('selected', conf));
2168
- });
2169
- return true;
2170
- });
2171
-
2172
-
2173
- // updateSizes event
2174
- $cfs.bind(cf_e('updateSizes', conf), function(e) {
2175
- var vI = opts.items.visible,
2176
- a_itm = $cfs.children(),
2177
- avail_primary = ms_getParentSize($wrp, opts, 'width');
2178
-
2179
- itms.total = a_itm.length;
2180
-
2181
- if (crsl.primarySizePercentage)
2182
- {
2183
- opts.maxDimension = avail_primary;
2184
- opts[opts.d['width']] = ms_getPercentage(avail_primary, crsl.primarySizePercentage);
2185
- }
2186
- else
2187
- {
2188
- opts.maxDimension = ms_getMaxDimension(opts, avail_primary);
2189
- }
2190
-
2191
- if (opts.responsive)
2192
- {
2193
- opts.items.width = opts.items.sizesConf.width;
2194
- opts.items.height = opts.items.sizesConf.height;
2195
- opts = in_getResponsiveValues(opts, a_itm, avail_primary);
2196
- vI = opts.items.visible;
2197
- sz_setResponsiveSizes(opts, a_itm);
2198
- }
2199
- else if (opts.items.visibleConf.variable)
2200
- {
2201
- vI = gn_getVisibleItemsNext(a_itm, opts, 0);
2202
- }
2203
- else if (opts.items.filter != '*')
2204
- {
2205
- vI = gn_getVisibleItemsNextFilter(a_itm, opts, 0);
2206
- }
2207
-
2208
- if (!opts.circular && itms.first != 0 && vI > itms.first) {
2209
- if (opts.items.visibleConf.variable)
2210
- {
2211
- var nI = gn_getVisibleItemsPrev(a_itm, opts, itms.first) - itms.first;
2212
- }
2213
- else if (opts.items.filter != '*')
2214
- {
2215
- var nI = gn_getVisibleItemsPrevFilter(a_itm, opts, itms.first) - itms.first;
2216
- }
2217
- else
2218
- {
2219
- var nI = opts.items.visible - itms.first;
2220
- }
2221
- debug(conf, 'Preventing non-circular: sliding '+nI+' items backward.');
2222
- $cfs.trigger(cf_e('prev', conf), nI);
2223
- }
2224
-
2225
- opts.items.visible = cf_getItemsAdjust(vI, opts, opts.items.visibleConf.adjust, $tt0);
2226
- opts.items.visibleConf.old = opts.items.visible;
2227
- opts = in_getAlignPadding(opts, a_itm);
2228
-
2229
- var sz = sz_setSizes($cfs, opts);
2230
- $cfs.trigger(cf_e('updatePageStatus', conf), [true, sz]);
2231
- nv_showNavi(opts, itms.total, conf);
2232
- nv_enableNavi(opts, itms.first, conf);
2233
-
2234
- return sz;
2235
- });
2236
-
2237
-
2238
- // destroy event
2239
- $cfs.bind(cf_e('destroy', conf), function(e, orgOrder) {
2240
- e.stopPropagation();
2241
- tmrs = sc_clearTimers(tmrs);
2242
-
2243
- $cfs.data('_cfs_isCarousel', false);
2244
- $cfs.trigger(cf_e('finish', conf));
2245
- if (orgOrder)
2246
- {
2247
- $cfs.trigger(cf_e('jumpToStart', conf));
2248
- }
2249
- sz_restoreOrigCss($cfs.children());
2250
- sz_restoreOrigCss($cfs);
2251
- FN._unbind_events();
2252
- FN._unbind_buttons();
2253
- if (conf.wrapper == 'parent')
2254
- {
2255
- sz_restoreOrigCss($wrp);
2256
- }
2257
- else
2258
- {
2259
- $wrp.replaceWith($cfs);
2260
- }
2261
-
2262
- return true;
2263
- });
2264
-
2265
-
2266
- // debug event
2267
- $cfs.bind(cf_e('debug', conf), function(e) {
2268
- debug(conf, 'Carousel width: ' + opts.width);
2269
- debug(conf, 'Carousel height: ' + opts.height);
2270
- debug(conf, 'Item widths: ' + opts.items.width);
2271
- debug(conf, 'Item heights: ' + opts.items.height);
2272
- debug(conf, 'Number of items visible: ' + opts.items.visible);
2273
- if (opts.auto.play)
2274
- {
2275
- debug(conf, 'Number of items scrolled automatically: ' + opts.auto.items);
2276
- }
2277
- if (opts.prev.button)
2278
- {
2279
- debug(conf, 'Number of items scrolled backward: ' + opts.prev.items);
2280
- }
2281
- if (opts.next.button)
2282
- {
2283
- debug(conf, 'Number of items scrolled forward: ' + opts.next.items);
2284
- }
2285
- return conf.debug;
2286
- });
2287
-
2288
-
2289
- // triggerEvent, making prefixed and namespaced events accessible from outside
2290
- $cfs.bind('_cfs_triggerEvent', function(e, n, o) {
2291
- e.stopPropagation();
2292
- return $cfs.triggerHandler(cf_e(n, conf), o);
2293
- });
2294
- }; // /bind_events
2295
-
2296
-
2297
- FN._unbind_events = function() {
2298
- $cfs.unbind(cf_e('', conf));
2299
- $cfs.unbind(cf_e('', conf, false));
2300
- $cfs.unbind('_cfs_triggerEvent');
2301
- }; // /unbind_events
2302
-
2303
-
2304
- FN._bind_buttons = function() {
2305
- FN._unbind_buttons();
2306
- nv_showNavi(opts, itms.total, conf);
2307
- nv_enableNavi(opts, itms.first, conf);
2308
-
2309
- if (opts.auto.pauseOnHover)
2310
- {
2311
- var pC = bt_pauseOnHoverConfig(opts.auto.pauseOnHover);
2312
- $wrp.bind(cf_e('mouseenter', conf, false), function() { $cfs.trigger(cf_e('pause', conf), pC); })
2313
- .bind(cf_e('mouseleave', conf, false), function() { $cfs.trigger(cf_e('resume', conf)); });
2314
- }
2315
-
2316
- // play button
2317
- if (opts.auto.button)
2318
- {
2319
- opts.auto.button.bind(cf_e(opts.auto.event, conf, false), function(e) {
2320
- e.preventDefault();
2321
- var ev = false,
2322
- pC = null;
2323
-
2324
- if (crsl.isPaused)
2325
- {
2326
- ev = 'play';
2327
- }
2328
- else if (opts.auto.pauseOnEvent)
2329
- {
2330
- ev = 'pause';
2331
- pC = bt_pauseOnHoverConfig(opts.auto.pauseOnEvent);
2332
- }
2333
- if (ev)
2334
- {
2335
- $cfs.trigger(cf_e(ev, conf), pC);
2336
- }
2337
- });
2338
- }
2339
-
2340
- // prev button
2341
- if (opts.prev.button)
2342
- {
2343
- opts.prev.button.bind(cf_e(opts.prev.event, conf, false), function(e) {
2344
- e.preventDefault();
2345
- $cfs.trigger(cf_e('prev', conf));
2346
- });
2347
- if (opts.prev.pauseOnHover)
2348
- {
2349
- var pC = bt_pauseOnHoverConfig(opts.prev.pauseOnHover);
2350
- opts.prev.button.bind(cf_e('mouseenter', conf, false), function() { $cfs.trigger(cf_e('pause', conf), pC); })
2351
- .bind(cf_e('mouseleave', conf, false), function() { $cfs.trigger(cf_e('resume', conf)); });
2352
- }
2353
- }
2354
-
2355
- // next butotn
2356
- if (opts.next.button)
2357
- {
2358
- opts.next.button.bind(cf_e(opts.next.event, conf, false), function(e) {
2359
- e.preventDefault();
2360
- $cfs.trigger(cf_e('next', conf));
2361
- });
2362
- if (opts.next.pauseOnHover)
2363
- {
2364
- var pC = bt_pauseOnHoverConfig(opts.next.pauseOnHover);
2365
- opts.next.button.bind(cf_e('mouseenter', conf, false), function() { $cfs.trigger(cf_e('pause', conf), pC); })
2366
- .bind(cf_e('mouseleave', conf, false), function() { $cfs.trigger(cf_e('resume', conf)); });
2367
- }
2368
- }
2369
-
2370
- // pagination
2371
- if (opts.pagination.container)
2372
- {
2373
- if (opts.pagination.pauseOnHover)
2374
- {
2375
- var pC = bt_pauseOnHoverConfig(opts.pagination.pauseOnHover);
2376
- opts.pagination.container.bind(cf_e('mouseenter', conf, false), function() { $cfs.trigger(cf_e('pause', conf), pC); })
2377
- .bind(cf_e('mouseleave', conf, false), function() { $cfs.trigger(cf_e('resume', conf)); });
2378
- }
2379
- }
2380
-
2381
- // prev/next keys
2382
- if (opts.prev.key || opts.next.key)
2383
- {
2384
- $(document).bind(cf_e('keyup', conf, false, true, true), function(e) {
2385
- var k = e.keyCode;
2386
- if (k == opts.next.key)
2387
- {
2388
- e.preventDefault();
2389
- $cfs.trigger(cf_e('next', conf));
2390
- }
2391
- if (k == opts.prev.key)
2392
- {
2393
- e.preventDefault();
2394
- $cfs.trigger(cf_e('prev', conf));
2395
- }
2396
- });
2397
- }
2398
-
2399
- // pagination keys
2400
- if (opts.pagination.keys)
2401
- {
2402
- $(document).bind(cf_e('keyup', conf, false, true, true), function(e) {
2403
- var k = e.keyCode;
2404
- if (k >= 49 && k < 58)
2405
- {
2406
- k = (k-49) * opts.items.visible;
2407
- if (k <= itms.total)
2408
- {
2409
- e.preventDefault();
2410
- $cfs.trigger(cf_e('slideTo', conf), [k, 0, true, opts.pagination]);
2411
- }
2412
- }
2413
- });
2414
- }
2415
-
2416
- // swipe
2417
- if ($.fn.swipe)
2418
- {
2419
- var isTouch = 'ontouchstart' in window;
2420
- if ((isTouch && opts.swipe.onTouch) || (!isTouch && opts.swipe.onMouse))
2421
- {
2422
- var scP = $.extend(true, {}, opts.prev, opts.swipe),
2423
- scN = $.extend(true, {}, opts.next, opts.swipe),
2424
- swP = function() { $cfs.trigger(cf_e('prev', conf), [scP]) },
2425
- swN = function() { $cfs.trigger(cf_e('next', conf), [scN]) };
2426
-
2427
- switch (opts.direction)
2428
- {
2429
- case 'up':
2430
- case 'down':
2431
- opts.swipe.options.swipeUp = swN;
2432
- opts.swipe.options.swipeDown = swP;
2433
- break;
2434
- default:
2435
- opts.swipe.options.swipeLeft = swN;
2436
- opts.swipe.options.swipeRight = swP;
2437
- }
2438
- if (crsl.swipe)
2439
- {
2440
- $cfs.swipe('destroy');
2441
- }
2442
- $wrp.swipe(opts.swipe.options);
2443
- $wrp.css('cursor', 'move');
2444
- crsl.swipe = true;
2445
- }
2446
- }
2447
-
2448
- // mousewheel
2449
- if ($.fn.mousewheel)
2450
- {
2451
-
2452
- if (opts.mousewheel)
2453
- {
2454
- var mcP = $.extend(true, {}, opts.prev, opts.mousewheel),
2455
- mcN = $.extend(true, {}, opts.next, opts.mousewheel);
2456
-
2457
- if (crsl.mousewheel)
2458
- {
2459
- $wrp.unbind(cf_e('mousewheel', conf, false));
2460
- }
2461
- $wrp.bind(cf_e('mousewheel', conf, false), function(e, delta) {
2462
- e.preventDefault();
2463
- if (delta > 0)
2464
- {
2465
- $cfs.trigger(cf_e('prev', conf), [mcP]);
2466
- }
2467
- else
2468
- {
2469
- $cfs.trigger(cf_e('next', conf), [mcN]);
2470
- }
2471
- });
2472
- crsl.mousewheel = true;
2473
- }
2474
- }
2475
-
2476
- if (opts.auto.play)
2477
- {
2478
- $cfs.trigger(cf_e('play', conf), opts.auto.delay);
2479
- }
2480
-
2481
- if (crsl.upDateOnWindowResize)
2482
- {
2483
- var resizeFn = function(e) {
2484
- $cfs.trigger(cf_e('finish', conf));
2485
- if (opts.auto.pauseOnResize && !crsl.isPaused)
2486
- {
2487
- $cfs.trigger(cf_e('play', conf));
2488
- }
2489
- sz_resetMargin($cfs.children(), opts);
2490
- $cfs.trigger(cf_e('updateSizes', conf));
2491
- };
2492
-
2493
- var $w = $(window),
2494
- onResize = null;
2495
-
2496
- if ($.debounce && conf.onWindowResize == 'debounce')
2497
- {
2498
- onResize = $.debounce(200, resizeFn);
2499
- }
2500
- else if ($.throttle && conf.onWindowResize == 'throttle')
2501
- {
2502
- onResize = $.throttle(300, resizeFn);
2503
- }
2504
- else
2505
- {
2506
- var _windowWidth = 0,
2507
- _windowHeight = 0;
2508
-
2509
- onResize = function() {
2510
- var nw = $w.width(),
2511
- nh = $w.height();
2512
-
2513
- if (nw != _windowWidth || nh != _windowHeight)
2514
- {
2515
- resizeFn();
2516
- _windowWidth = nw;
2517
- _windowHeight = nh;
2518
- }
2519
- };
2520
- }
2521
- $w.bind(cf_e('resize', conf, false, true, true), onResize);
2522
- }
2523
- }; // /bind_buttons
2524
-
2525
-
2526
- FN._unbind_buttons = function() {
2527
- var ns1 = cf_e('', conf),
2528
- ns2 = cf_e('', conf, false);
2529
- ns3 = cf_e('', conf, false, true, true);
2530
-
2531
- $(document).unbind(ns3);
2532
- $(window).unbind(ns3);
2533
- $wrp.unbind(ns2);
2534
-
2535
- if (opts.auto.button)
2536
- {
2537
- opts.auto.button.unbind(ns2);
2538
- }
2539
- if (opts.prev.button)
2540
- {
2541
- opts.prev.button.unbind(ns2);
2542
- }
2543
- if (opts.next.button)
2544
- {
2545
- opts.next.button.unbind(ns2);
2546
- }
2547
- if (opts.pagination.container)
2548
- {
2549
- opts.pagination.container.unbind(ns2);
2550
- if (opts.pagination.anchorBuilder)
2551
- {
2552
- opts.pagination.container.children().remove();
2553
- }
2554
- }
2555
- if (crsl.swipe)
2556
- {
2557
- $cfs.swipe('destroy');
2558
- $wrp.css('cursor', 'default');
2559
- crsl.swipe = false;
2560
- }
2561
- if (crsl.mousewheel)
2562
- {
2563
- crsl.mousewheel = false;
2564
- }
2565
-
2566
- nv_showNavi(opts, 'hide', conf);
2567
- nv_enableNavi(opts, 'removeClass', conf);
2568
-
2569
- }; // /unbind_buttons
2570
-
2571
-
2572
-
2573
- // START
2574
-
2575
- if (is_boolean(configs))
2576
- {
2577
- configs = {
2578
- 'debug': configs
2579
- };
2580
- }
2581
-
2582
- // set vars
2583
- var crsl = {
2584
- 'direction' : 'next',
2585
- 'isPaused' : true,
2586
- 'isScrolling' : false,
2587
- 'isStopped' : false,
2588
- 'mousewheel' : false,
2589
- 'swipe' : false
2590
- },
2591
- itms = {
2592
- 'total' : $cfs.children().length,
2593
- 'first' : 0
2594
- },
2595
- tmrs = {
2596
- 'auto' : null,
2597
- 'progress' : null,
2598
- 'startTime' : getTime(),
2599
- 'timePassed' : 0
2600
- },
2601
- scrl = {
2602
- 'isStopped' : false,
2603
- 'duration' : 0,
2604
- 'startTime' : 0,
2605
- 'easing' : '',
2606
- 'anims' : []
2607
- },
2608
- clbk = {
2609
- 'onBefore' : [],
2610
- 'onAfter' : []
2611
- },
2612
- queu = [],
2613
- conf = $.extend(true, {}, $.fn.carouFredSel.configs, configs),
2614
- opts = {},
2615
- opts_orig = $.extend(true, {}, options),
2616
- $wrp = (conf.wrapper == 'parent')
2617
- ? $cfs.parent()
2618
- : $cfs.wrap('<'+conf.wrapper.element+' class="'+conf.wrapper.classname+'" />').parent();
2619
-
2620
-
2621
- conf.selector = $cfs.selector;
2622
- conf.serialNumber = $.fn.carouFredSel.serialNumber++;
2623
-
2624
- conf.transition = (conf.transition && $.fn.transition) ? 'transition' : 'animate';
2625
-
2626
- // create carousel
2627
- FN._init(opts_orig, true, starting_position);
2628
- FN._build();
2629
- FN._bind_events();
2630
- FN._bind_buttons();
2631
-
2632
- // find item to start
2633
- if (is_array(opts.items.start))
2634
- {
2635
- var start_arr = opts.items.start;
2636
- }
2637
- else
2638
- {
2639
- var start_arr = [];
2640
- if (opts.items.start != 0)
2641
- {
2642
- start_arr.push(opts.items.start);
2643
- }
2644
- }
2645
- if (opts.cookie)
2646
- {
2647
- start_arr.unshift(parseInt(cf_getCookie(opts.cookie), 10));
2648
- }
2649
-
2650
- if (start_arr.length > 0)
2651
- {
2652
- for (var a = 0, l = start_arr.length; a < l; a++)
2653
- {
2654
- var s = start_arr[a];
2655
- if (s == 0)
2656
- {
2657
- continue;
2658
- }
2659
- if (s === true)
2660
- {
2661
- s = window.location.hash;
2662
- if (s.length < 1)
2663
- {
2664
- continue;
2665
- }
2666
- }
2667
- else if (s === 'random')
2668
- {
2669
- s = Math.floor(Math.random()*itms.total);
2670
- }
2671
- if ($cfs.triggerHandler(cf_e('slideTo', conf), [s, 0, true, { fx: 'none' }]))
2672
- {
2673
- break;
2674
- }
2675
- }
2676
- }
2677
- var siz = sz_setSizes($cfs, opts),
2678
- itm = gi_getCurrentItems($cfs.children(), opts);
2679
-
2680
- if (opts.onCreate)
2681
- {
2682
- opts.onCreate.call($tt0, {
2683
- 'width': siz.width,
2684
- 'height': siz.height,
2685
- 'items': itm
2686
- });
2687
- }
2688
-
2689
- $cfs.trigger(cf_e('updatePageStatus', conf), [true, siz]);
2690
- $cfs.trigger(cf_e('linkAnchors', conf));
2691
-
2692
- if (conf.debug)
2693
- {
2694
- $cfs.trigger(cf_e('debug', conf));
2695
- }
2696
-
2697
- return $cfs;
2698
- };
2699
-
2700
-
2701
-
2702
- // GLOBAL PUBLIC
2703
-
2704
- $.fn.carouFredSel.serialNumber = 1;
2705
- $.fn.carouFredSel.defaults = {
2706
- 'synchronise' : false,
2707
- 'infinite' : true,
2708
- 'circular' : true,
2709
- 'responsive' : false,
2710
- 'direction' : 'left',
2711
- 'items' : {
2712
- 'start' : 0
2713
- },
2714
- 'scroll' : {
2715
- 'easing' : 'swing',
2716
- 'duration' : 500,
2717
- 'pauseOnHover' : false,
2718
- 'event' : 'click',
2719
- 'queue' : false
2720
- }
2721
- };
2722
- $.fn.carouFredSel.configs = {
2723
- 'debug' : false,
2724
- 'transition' : false,
2725
- 'onWindowResize': 'throttle',
2726
- 'events' : {
2727
- 'prefix' : '',
2728
- 'namespace' : 'cfs'
2729
- },
2730
- 'wrapper' : {
2731
- 'element' : 'div',
2732
- 'classname' : 'caroufredsel_wrapper'
2733
- },
2734
- 'classnames' : {}
2735
- };
2736
- $.fn.carouFredSel.pageAnchorBuilder = function(nr) {
2737
- return '<a href="#"><span>'+nr+'</span></a>';
2738
- };
2739
- $.fn.carouFredSel.progressbarUpdater = function(perc) {
2740
- $(this).css('width', perc+'%');
2741
- };
2742
-
2743
- $.fn.carouFredSel.cookie = {
2744
- get: function(n) {
2745
- n += '=';
2746
- var ca = document.cookie.split(';');
2747
- for (var a = 0, l = ca.length; a < l; a++)
2748
- {
2749
- var c = ca[a];
2750
- while (c.charAt(0) == ' ')
2751
- {
2752
- c = c.slice(1);
2753
- }
2754
- if (c.indexOf(n) == 0)
2755
- {
2756
- return c.slice(n.length);
2757
- }
2758
- }
2759
- return 0;
2760
- },
2761
- set: function(n, v, d) {
2762
- var e = "";
2763
- if (d)
2764
- {
2765
- var date = new Date();
2766
- date.setTime(date.getTime() + (d * 24 * 60 * 60 * 1000));
2767
- e = "; expires=" + date.toGMTString();
2768
- }
2769
- document.cookie = n + '=' + v + e + '; path=/';
2770
- },
2771
- remove: function(n) {
2772
- $.fn.carouFredSel.cookie.set(n, "", -1);
2773
- }
2774
- };
2775
-
2776
-
2777
- // GLOBAL PRIVATE
2778
-
2779
- // scrolling functions
2780
- function sc_setScroll(d, e, c) {
2781
- if (c.transition == 'transition')
2782
- {
2783
- if (e == 'swing')
2784
- {
2785
- e = 'ease';
2786
- }
2787
- }
2788
- return {
2789
- anims: [],
2790
- duration: d,
2791
- orgDuration: d,
2792
- easing: e,
2793
- startTime: getTime()
2794
- };
2795
- }
2796
- function sc_startScroll(s, c) {
2797
- for (var a = 0, l = s.anims.length; a < l; a++)
2798
- {
2799
- var b = s.anims[a];
2800
- if (!b)
2801
- {
2802
- continue;
2803
- }
2804
- b[0][c.transition](b[1], s.duration, s.easing, b[2]);
2805
- }
2806
- }
2807
- function sc_stopScroll(s, finish) {
2808
- if (!is_boolean(finish))
2809
- {
2810
- finish = true;
2811
- }
2812
- if (is_object(s.pre))
2813
- {
2814
- sc_stopScroll(s.pre, finish);
2815
- }
2816
- for (var a = 0, l = s.anims.length; a < l; a++)
2817
- {
2818
- var b = s.anims[a];
2819
- b[0].stop(true);
2820
- if (finish)
2821
- {
2822
- b[0].css(b[1]);
2823
- if (is_function(b[2]))
2824
- {
2825
- b[2]();
2826
- }
2827
- }
2828
- }
2829
- if (is_object(s.post))
2830
- {
2831
- sc_stopScroll(s.post, finish);
2832
- }
2833
- }
2834
- function sc_afterScroll( $c, $c2, o ) {
2835
- if ($c2)
2836
- {
2837
- $c2.remove();
2838
- }
2839
-
2840
- switch(o.fx) {
2841
- case 'fade':
2842
- case 'crossfade':
2843
- case 'cover-fade':
2844
- case 'uncover-fade':
2845
- $c.css('opacity', 1);
2846
- $c.css('filter', '');
2847
- break;
2848
- }
2849
- }
2850
- function sc_fireCallbacks($t, o, b, a, c) {
2851
- if (o[b])
2852
- {
2853
- o[b].call($t, a);
2854
- }
2855
- if (c[b].length)
2856
- {
2857
- for (var i = 0, l = c[b].length; i < l; i++)
2858
- {
2859
- c[b][i].call($t, a);
2860
- }
2861
- }
2862
- return [];
2863
- }
2864
- function sc_fireQueue($c, q, c) {
2865
-
2866
- if (q.length)
2867
- {
2868
- $c.trigger(cf_e(q[0][0], c), q[0][1]);
2869
- q.shift();
2870
- }
2871
- return q;
2872
- }
2873
- function sc_hideHiddenItems(hiddenitems) {
2874
- hiddenitems.each(function() {
2875
- var hi = $(this);
2876
- hi.data('_cfs_isHidden', hi.is(':hidden')).hide();
2877
- });
2878
- }
2879
- function sc_showHiddenItems(hiddenitems) {
2880
- if (hiddenitems)
2881
- {
2882
- hiddenitems.each(function() {
2883
- var hi = $(this);
2884
- if (!hi.data('_cfs_isHidden'))
2885
- {
2886
- hi.show();
2887
- }
2888
- });
2889
- }
2890
- }
2891
- function sc_clearTimers(t) {
2892
- if (t.auto)
2893
- {
2894
- clearTimeout(t.auto);
2895
- }
2896
- if (t.progress)
2897
- {
2898
- clearInterval(t.progress);
2899
- }
2900
- return t;
2901
- }
2902
- function sc_mapCallbackArguments(i_old, i_skp, i_new, s_itm, s_dir, s_dur, w_siz) {
2903
- return {
2904
- 'width': w_siz.width,
2905
- 'height': w_siz.height,
2906
- 'items': {
2907
- 'old': i_old,
2908
- 'skipped': i_skp,
2909
- 'visible': i_new
2910
- },
2911
- 'scroll': {
2912
- 'items': s_itm,
2913
- 'direction': s_dir,
2914
- 'duration': s_dur
2915
- }
2916
- };
2917
- }
2918
- function sc_getDuration( sO, o, nI, siz ) {
2919
- var dur = sO.duration;
2920
- if (sO.fx == 'none')
2921
- {
2922
- return 0;
2923
- }
2924
- if (dur == 'auto')
2925
- {
2926
- dur = o.scroll.duration / o.scroll.items * nI;
2927
- }
2928
- else if (dur < 10)
2929
- {
2930
- dur = siz / dur;
2931
- }
2932
- if (dur < 1)
2933
- {
2934
- return 0;
2935
- }
2936
- if (sO.fx == 'fade')
2937
- {
2938
- dur = dur / 2;
2939
- }
2940
- return Math.round(dur);
2941
- }
2942
-
2943
- // navigation functions
2944
- function nv_showNavi(o, t, c) {
2945
- var minimum = (is_number(o.items.minimum)) ? o.items.minimum : o.items.visible + 1;
2946
- if (t == 'show' || t == 'hide')
2947
- {
2948
- var f = t;
2949
- }
2950
- else if (minimum > t)
2951
- {
2952
- debug(c, 'Not enough items ('+t+' total, '+minimum+' needed): Hiding navigation.');
2953
- var f = 'hide';
2954
- }
2955
- else
2956
- {
2957
- var f = 'show';
2958
- }
2959
- var s = (f == 'show') ? 'removeClass' : 'addClass',
2960
- h = cf_c('hidden', c);
2961
-
2962
- if (o.auto.button)
2963
- {
2964
- o.auto.button[f]()[s](h);
2965
- }
2966
- if (o.prev.button)
2967
- {
2968
- o.prev.button[f]()[s](h);
2969
- }
2970
- if (o.next.button)
2971
- {
2972
- o.next.button[f]()[s](h);
2973
- }
2974
- if (o.pagination.container)
2975
- {
2976
- o.pagination.container[f]()[s](h);
2977
- }
2978
- }
2979
- function nv_enableNavi(o, f, c) {
2980
- if (o.circular || o.infinite) return;
2981
- var fx = (f == 'removeClass' || f == 'addClass') ? f : false,
2982
- di = cf_c('disabled', c);
2983
-
2984
- if (o.auto.button && fx)
2985
- {
2986
- o.auto.button[fx](di);
2987
- }
2988
- if (o.prev.button)
2989
- {
2990
- var fn = fx || (f == 0) ? 'addClass' : 'removeClass';
2991
- o.prev.button[fn](di);
2992
- }
2993
- if (o.next.button)
2994
- {
2995
- var fn = fx || (f == o.items.visible) ? 'addClass' : 'removeClass';
2996
- o.next.button[fn](di);
2997
- }
2998
- }
2999
-
3000
- // get object functions
3001
- function go_getObject($tt, obj) {
3002
- if (is_function(obj))
3003
- {
3004
- obj = obj.call($tt);
3005
- }
3006
- else if (is_undefined(obj))
3007
- {
3008
- obj = {};
3009
- }
3010
- return obj;
3011
- }
3012
- function go_getItemsObject($tt, obj) {
3013
- obj = go_getObject($tt, obj);
3014
- if (is_number(obj))
3015
- {
3016
- obj = {
3017
- 'visible': obj
3018
- };
3019
- }
3020
- else if (obj == 'variable')
3021
- {
3022
- obj = {
3023
- 'visible': obj,
3024
- 'width': obj,
3025
- 'height': obj
3026
- };
3027
- }
3028
- else if (!is_object(obj))
3029
- {
3030
- obj = {};
3031
- }
3032
- return obj;
3033
- }
3034
- function go_getScrollObject($tt, obj) {
3035
- obj = go_getObject($tt, obj);
3036
- if (is_number(obj))
3037
- {
3038
- if (obj <= 50)
3039
- {
3040
- obj = {
3041
- 'items': obj
3042
- };
3043
- }
3044
- else
3045
- {
3046
- obj = {
3047
- 'duration': obj
3048
- };
3049
- }
3050
- }
3051
- else if (is_string(obj))
3052
- {
3053
- obj = {
3054
- 'easing': obj
3055
- };
3056
- }
3057
- else if (!is_object(obj))
3058
- {
3059
- obj = {};
3060
- }
3061
- return obj;
3062
- }
3063
- function go_getNaviObject($tt, obj) {
3064
- obj = go_getObject($tt, obj);
3065
- if (is_string(obj))
3066
- {
3067
- var temp = cf_getKeyCode(obj);
3068
- if (temp == -1)
3069
- {
3070
- obj = $(obj);
3071
- }
3072
- else
3073
- {
3074
- obj = temp;
3075
- }
3076
- }
3077
- return obj;
3078
- }
3079
-
3080
- function go_getAutoObject($tt, obj) {
3081
- obj = go_getNaviObject($tt, obj);
3082
- if (is_jquery(obj))
3083
- {
3084
- obj = {
3085
- 'button': obj
3086
- };
3087
- }
3088
- else if (is_boolean(obj))
3089
- {
3090
- obj = {
3091
- 'play': obj
3092
- };
3093
- }
3094
- else if (is_number(obj))
3095
- {
3096
- obj = {
3097
- 'timeoutDuration': obj
3098
- };
3099
- }
3100
- if (obj.progress)
3101
- {
3102
- if (is_string(obj.progress) || is_jquery(obj.progress))
3103
- {
3104
- obj.progress = {
3105
- 'bar': obj.progress
3106
- };
3107
- }
3108
- }
3109
- return obj;
3110
- }
3111
- function go_complementAutoObject($tt, obj) {
3112
- if (is_function(obj.button))
3113
- {
3114
- obj.button = obj.button.call($tt);
3115
- }
3116
- if (is_string(obj.button))
3117
- {
3118
- obj.button = $(obj.button);
3119
- }
3120
- if (!is_boolean(obj.play))
3121
- {
3122
- obj.play = true;
3123
- }
3124
- if (!is_number(obj.delay))
3125
- {
3126
- obj.delay = 0;
3127
- }
3128
- if (is_undefined(obj.pauseOnEvent))
3129
- {
3130
- obj.pauseOnEvent = true;
3131
- }
3132
- if (!is_boolean(obj.pauseOnResize))
3133
- {
3134
- obj.pauseOnResize = true;
3135
- }
3136
- if (!is_number(obj.timeoutDuration))
3137
- {
3138
- obj.timeoutDuration = (obj.duration < 10)
3139
- ? 2500
3140
- : obj.duration * 5;
3141
- }
3142
- if (obj.progress)
3143
- {
3144
- if (is_function(obj.progress.bar))
3145
- {
3146
- obj.progress.bar = obj.progress.bar.call($tt);
3147
- }
3148
- if (is_string(obj.progress.bar))
3149
- {
3150
- obj.progress.bar = $(obj.progress.bar);
3151
- }
3152
- if (obj.progress.bar)
3153
- {
3154
- if (!is_function(obj.progress.updater))
3155
- {
3156
- obj.progress.updater = $.fn.carouFredSel.progressbarUpdater;
3157
- }
3158
- if (!is_number(obj.progress.interval))
3159
- {
3160
- obj.progress.interval = 50;
3161
- }
3162
- }
3163
- else
3164
- {
3165
- obj.progress = false;
3166
- }
3167
- }
3168
- return obj;
3169
- }
3170
-
3171
- function go_getPrevNextObject($tt, obj) {
3172
- obj = go_getNaviObject($tt, obj);
3173
- if (is_jquery(obj))
3174
- {
3175
- obj = {
3176
- 'button': obj
3177
- };
3178
- }
3179
- else if (is_number(obj))
3180
- {
3181
- obj = {
3182
- 'key': obj
3183
- };
3184
- }
3185
- return obj;
3186
- }
3187
- function go_complementPrevNextObject($tt, obj) {
3188
- if (is_function(obj.button))
3189
- {
3190
- obj.button = obj.button.call($tt);
3191
- }
3192
- if (is_string(obj.button))
3193
- {
3194
- obj.button = $(obj.button);
3195
- }
3196
- if (is_string(obj.key))
3197
- {
3198
- obj.key = cf_getKeyCode(obj.key);
3199
- }
3200
- return obj;
3201
- }
3202
-
3203
- function go_getPaginationObject($tt, obj) {
3204
- obj = go_getNaviObject($tt, obj);
3205
- if (is_jquery(obj))
3206
- {
3207
- obj = {
3208
- 'container': obj
3209
- };
3210
- }
3211
- else if (is_boolean(obj))
3212
- {
3213
- obj = {
3214
- 'keys': obj
3215
- };
3216
- }
3217
- return obj;
3218
- }
3219
- function go_complementPaginationObject($tt, obj) {
3220
- if (is_function(obj.container))
3221
- {
3222
- obj.container = obj.container.call($tt);
3223
- }
3224
- if (is_string(obj.container))
3225
- {
3226
- obj.container = $(obj.container);
3227
- }
3228
- if (!is_number(obj.items))
3229
- {
3230
- obj.items = false;
3231
- }
3232
- if (!is_boolean(obj.keys))
3233
- {
3234
- obj.keys = false;
3235
- }
3236
- if (!is_function(obj.anchorBuilder) && !is_false(obj.anchorBuilder))
3237
- {
3238
- obj.anchorBuilder = $.fn.carouFredSel.pageAnchorBuilder;
3239
- }
3240
- if (!is_number(obj.deviation))
3241
- {
3242
- obj.deviation = 0;
3243
- }
3244
- return obj;
3245
- }
3246
-
3247
- function go_getSwipeObject($tt, obj) {
3248
- if (is_function(obj))
3249
- {
3250
- obj = obj.call($tt);
3251
- }
3252
- if (is_undefined(obj))
3253
- {
3254
- obj = {
3255
- 'onTouch': false
3256
- };
3257
- }
3258
- if (is_true(obj))
3259
- {
3260
- obj = {
3261
- 'onTouch': obj
3262
- };
3263
- }
3264
- else if (is_number(obj))
3265
- {
3266
- obj = {
3267
- 'items': obj
3268
- };
3269
- }
3270
- return obj;
3271
- }
3272
- function go_complementSwipeObject($tt, obj) {
3273
- if (!is_boolean(obj.onTouch))
3274
- {
3275
- obj.onTouch = true;
3276
- }
3277
- if (!is_boolean(obj.onMouse))
3278
- {
3279
- obj.onMouse = false;
3280
- }
3281
- if (!is_object(obj.options))
3282
- {
3283
- obj.options = {};
3284
- }
3285
- if (!is_boolean(obj.options.triggerOnTouchEnd))
3286
- {
3287
- obj.options.triggerOnTouchEnd = false;
3288
- }
3289
- return obj;
3290
- }
3291
- function go_getMousewheelObject($tt, obj) {
3292
- if (is_function(obj))
3293
- {
3294
- obj = obj.call($tt);
3295
- }
3296
- if (is_true(obj))
3297
- {
3298
- obj = {};
3299
- }
3300
- else if (is_number(obj))
3301
- {
3302
- obj = {
3303
- 'items': obj
3304
- };
3305
- }
3306
- else if (is_undefined(obj))
3307
- {
3308
- obj = false;
3309
- }
3310
- return obj;
3311
- }
3312
- function go_complementMousewheelObject($tt, obj) {
3313
- return obj;
3314
- }
3315
-
3316
- // get number functions
3317
- function gn_getItemIndex(num, dev, org, items, $cfs) {
3318
- if (is_string(num))
3319
- {
3320
- num = $(num, $cfs);
3321
- }
3322
-
3323
- if (is_object(num))
3324
- {
3325
- num = $(num, $cfs);
3326
- }
3327
- if (is_jquery(num))
3328
- {
3329
- num = $cfs.children().index(num);
3330
- if (!is_boolean(org))
3331
- {
3332
- org = false;
3333
- }
3334
- }
3335
- else
3336
- {
3337
- if (!is_boolean(org))
3338
- {
3339
- org = true;
3340
- }
3341
- }
3342
- if (!is_number(num))
3343
- {
3344
- num = 0;
3345
- }
3346
- if (!is_number(dev))
3347
- {
3348
- dev = 0;
3349
- }
3350
-
3351
- if (org)
3352
- {
3353
- num += items.first;
3354
- }
3355
- num += dev;
3356
- if (items.total > 0)
3357
- {
3358
- while (num >= items.total)
3359
- {
3360
- num -= items.total;
3361
- }
3362
- while (num < 0)
3363
- {
3364
- num += items.total;
3365
- }
3366
- }
3367
- return num;
3368
- }
3369
-
3370
- // items prev
3371
- function gn_getVisibleItemsPrev(i, o, s) {
3372
- var t = 0,
3373
- x = 0;
3374
-
3375
- for (var a = s; a >= 0; a--)
3376
- {
3377
- var j = i.eq(a);
3378
- t += (j.is(':visible')) ? j[o.d['outerWidth']](true) : 0;
3379
- if (t > o.maxDimension)
3380
- {
3381
- return x;
3382
- }
3383
- if (a == 0)
3384
- {
3385
- a = i.length;
3386
- }
3387
- x++;
3388
- }
3389
- }
3390
- function gn_getVisibleItemsPrevFilter(i, o, s) {
3391
- return gn_getItemsPrevFilter(i, o.items.filter, o.items.visibleConf.org, s);
3392
- }
3393
- function gn_getScrollItemsPrevFilter(i, o, s, m) {
3394
- return gn_getItemsPrevFilter(i, o.items.filter, m, s);
3395
- }
3396
- function gn_getItemsPrevFilter(i, f, m, s) {
3397
- var t = 0,
3398
- x = 0;
3399
-
3400
- for (var a = s, l = i.length; a >= 0; a--)
3401
- {
3402
- x++;
3403
- if (x == l)
3404
- {
3405
- return x;
3406
- }
3407
-
3408
- var j = i.eq(a);
3409
- if (j.is(f))
3410
- {
3411
- t++;
3412
- if (t == m)
3413
- {
3414
- return x;
3415
- }
3416
- }
3417
- if (a == 0)
3418
- {
3419
- a = l;
3420
- }
3421
- }
3422
- }
3423
-
3424
- function gn_getVisibleOrg($c, o) {
3425
- return o.items.visibleConf.org || $c.children().slice(0, o.items.visible).filter(o.items.filter).length;
3426
- }
3427
-
3428
- // items next
3429
- function gn_getVisibleItemsNext(i, o, s) {
3430
- var t = 0,
3431
- x = 0;
3432
-
3433
- for (var a = s, l = i.length-1; a <= l; a++)
3434
- {
3435
- var j = i.eq(a);
3436
-
3437
- t += (j.is(':visible')) ? j[o.d['outerWidth']](true) : 0;
3438
- if (t > o.maxDimension)
3439
- {
3440
- return x;
3441
- }
3442
-
3443
- x++;
3444
- if (x == l+1)
3445
- {
3446
- return x;
3447
- }
3448
- if (a == l)
3449
- {
3450
- a = -1;
3451
- }
3452
- }
3453
- }
3454
- function gn_getVisibleItemsNextTestCircular(i, o, s, l) {
3455
- var v = gn_getVisibleItemsNext(i, o, s);
3456
- if (!o.circular)
3457
- {
3458
- if (s + v > l)
3459
- {
3460
- v = l - s;
3461
- }
3462
- }
3463
- return v;
3464
- }
3465
- function gn_getVisibleItemsNextFilter(i, o, s) {
3466
- return gn_getItemsNextFilter(i, o.items.filter, o.items.visibleConf.org, s, o.circular);
3467
- }
3468
- function gn_getScrollItemsNextFilter(i, o, s, m) {
3469
- return gn_getItemsNextFilter(i, o.items.filter, m+1, s, o.circular) - 1;
3470
- }
3471
- function gn_getItemsNextFilter(i, f, m, s, c) {
3472
- var t = 0,
3473
- x = 0;
3474
-
3475
- for (var a = s, l = i.length-1; a <= l; a++)
3476
- {
3477
- x++;
3478
- if (x >= l)
3479
- {
3480
- return x;
3481
- }
3482
-
3483
- var j = i.eq(a);
3484
- if (j.is(f))
3485
- {
3486
- t++;
3487
- if (t == m)
3488
- {
3489
- return x;
3490
- }
3491
- }
3492
- if (a == l)
3493
- {
3494
- a = -1;
3495
- }
3496
- }
3497
- }
3498
-
3499
- // get items functions
3500
- function gi_getCurrentItems(i, o) {
3501
- return i.slice(0, o.items.visible);
3502
- }
3503
- function gi_getOldItemsPrev(i, o, n) {
3504
- return i.slice(n, o.items.visibleConf.old+n);
3505
- }
3506
- function gi_getNewItemsPrev(i, o) {
3507
- return i.slice(0, o.items.visible);
3508
- }
3509
- function gi_getOldItemsNext(i, o) {
3510
- return i.slice(0, o.items.visibleConf.old);
3511
- }
3512
- function gi_getNewItemsNext(i, o, n) {
3513
- return i.slice(n, o.items.visible+n);
3514
- }
3515
-
3516
- // sizes functions
3517
- function sz_storeMargin(i, o, d) {
3518
- if (o.usePadding)
3519
- {
3520
- if (!is_string(d))
3521
- {
3522
- d = '_cfs_origCssMargin';
3523
- }
3524
- i.each(function() {
3525
- var j = $(this),
3526
- m = parseInt(j.css(o.d['marginRight']), 10);
3527
- if (!is_number(m))
3528
- {
3529
- m = 0;
3530
- }
3531
- j.data(d, m);
3532
- });
3533
- }
3534
- }
3535
- function sz_resetMargin(i, o, m) {
3536
- if (o.usePadding)
3537
- {
3538
- var x = (is_boolean(m)) ? m : false;
3539
- if (!is_number(m))
3540
- {
3541
- m = 0;
3542
- }
3543
- sz_storeMargin(i, o, '_cfs_tempCssMargin');
3544
- i.each(function() {
3545
- var j = $(this);
3546
- j.css(o.d['marginRight'], ((x) ? j.data('_cfs_tempCssMargin') : m + j.data('_cfs_origCssMargin')));
3547
- });
3548
- }
3549
- }
3550
- function sz_storeOrigCss(i) {
3551
- i.each(function() {
3552
- var j = $(this);
3553
- j.data('_cfs_origCss', j.attr('style') || '');
3554
- });
3555
- }
3556
- function sz_restoreOrigCss(i) {
3557
- i.each(function() {
3558
- var j = $(this);
3559
- j.attr('style', j.data('_cfs_origCss') || '');
3560
- });
3561
- }
3562
- function sz_setResponsiveSizes(o, all) {
3563
- var visb = o.items.visible,
3564
- newS = o.items[o.d['width']],
3565
- seco = o[o.d['height']],
3566
- secp = is_percentage(seco);
3567
-
3568
- all.each(function() {
3569
- var $t = $(this),
3570
- nw = newS - ms_getPaddingBorderMargin($t, o, 'Width');
3571
-
3572
- $t[o.d['width']](nw);
3573
- if (secp)
3574
- {
3575
- $t[o.d['height']](ms_getPercentage(nw, seco));
3576
- }
3577
- });
3578
- }
3579
- function sz_setSizes($c, o) {
3580
- var $w = $c.parent(),
3581
- $i = $c.children(),
3582
- $v = gi_getCurrentItems($i, o),
3583
- sz = cf_mapWrapperSizes(ms_getSizes($v, o, true), o, false);
3584
-
3585
- $w.css(sz);
3586
-
3587
- if (o.usePadding)
3588
- {
3589
- var p = o.padding,
3590
- r = p[o.d[1]];
3591
-
3592
- if (o.align && r < 0)
3593
- {
3594
- r = 0;
3595
- }
3596
- var $l = $v.last();
3597
- $l.css(o.d['marginRight'], $l.data('_cfs_origCssMargin') + r);
3598
- $c.css(o.d['top'], p[o.d[0]]);
3599
- $c.css(o.d['left'], p[o.d[3]]);
3600
- }
3601
-
3602
- $c.css(o.d['width'], sz[o.d['width']]+(ms_getTotalSize($i, o, 'width')*2));
3603
- $c.css(o.d['height'], ms_getLargestSize($i, o, 'height'));
3604
- return sz;
3605
- }
3606
-
3607
- // measuring functions
3608
- function ms_getSizes(i, o, wrapper) {
3609
- return [ms_getTotalSize(i, o, 'width', wrapper), ms_getLargestSize(i, o, 'height', wrapper)];
3610
- }
3611
- function ms_getLargestSize(i, o, dim, wrapper) {
3612
- if (!is_boolean(wrapper))
3613
- {
3614
- wrapper = false;
3615
- }
3616
- if (is_number(o[o.d[dim]]) && wrapper)
3617
- {
3618
- return o[o.d[dim]];
3619
- }
3620
- if (is_number(o.items[o.d[dim]]))
3621
- {
3622
- return o.items[o.d[dim]];
3623
- }
3624
- dim = (dim.toLowerCase().indexOf('width') > -1) ? 'outerWidth' : 'outerHeight';
3625
- return ms_getTrueLargestSize(i, o, dim);
3626
- }
3627
- function ms_getTrueLargestSize(i, o, dim) {
3628
- var s = 0;
3629
-
3630
- for (var a = 0, l = i.length; a < l; a++)
3631
- {
3632
- var j = i.eq(a);
3633
-
3634
- var m = (j.is(':visible')) ? j[o.d[dim]](true) : 0;
3635
- if (s < m)
3636
- {
3637
- s = m;
3638
- }
3639
- }
3640
- return s;
3641
- }
3642
-
3643
- function ms_getTotalSize(i, o, dim, wrapper) {
3644
- if (!is_boolean(wrapper))
3645
- {
3646
- wrapper = false;
3647
- }
3648
- if (is_number(o[o.d[dim]]) && wrapper)
3649
- {
3650
- return o[o.d[dim]];
3651
- }
3652
- if (is_number(o.items[o.d[dim]]))
3653
- {
3654
- return o.items[o.d[dim]] * i.length;
3655
- }
3656
-
3657
- var d = (dim.toLowerCase().indexOf('width') > -1) ? 'outerWidth' : 'outerHeight',
3658
- s = 0;
3659
-
3660
- for (var a = 0, l = i.length; a < l; a++)
3661
- {
3662
- var j = i.eq(a);
3663
- s += (j.is(':visible')) ? j[o.d[d]](true) : 0;
3664
- }
3665
- return s;
3666
- }
3667
- function ms_getParentSize($w, o, d) {
3668
- var isVisible = $w.is(':visible');
3669
- if (isVisible)
3670
- {
3671
- $w.hide();
3672
- }
3673
- var s = $w.parent()[o.d[d]]();
3674
- if (isVisible)
3675
- {
3676
- $w.show();
3677
- }
3678
- return s;
3679
- }
3680
- function ms_getMaxDimension(o, a) {
3681
- return (is_number(o[o.d['width']])) ? o[o.d['width']] : a;
3682
- }
3683
- function ms_hasVariableSizes(i, o, dim) {
3684
- var s = false,
3685
- v = false;
3686
-
3687
- for (var a = 0, l = i.length; a < l; a++)
3688
- {
3689
- var j = i.eq(a);
3690
-
3691
- var c = (j.is(':visible')) ? j[o.d[dim]](true) : 0;
3692
- if (s === false)
3693
- {
3694
- s = c;
3695
- }
3696
- else if (s != c)
3697
- {
3698
- v = true;
3699
- }
3700
- if (s == 0)
3701
- {
3702
- v = true;
3703
- }
3704
- }
3705
- return v;
3706
- }
3707
- function ms_getPaddingBorderMargin(i, o, d) {
3708
- return i[o.d['outer'+d]](true) - i[o.d[d.toLowerCase()]]();
3709
- }
3710
- function ms_getPercentage(s, o) {
3711
- if (is_percentage(o))
3712
- {
3713
- o = parseInt( o.slice(0, -1), 10 );
3714
- if (!is_number(o))
3715
- {
3716
- return s;
3717
- }
3718
- s *= o/100;
3719
- }
3720
- return s;
3721
- }
3722
-
3723
- // config functions
3724
- function cf_e(n, c, pf, ns, rd) {
3725
- if (!is_boolean(pf))
3726
- {
3727
- pf = true;
3728
- }
3729
- if (!is_boolean(ns))
3730
- {
3731
- ns = true;
3732
- }
3733
- if (!is_boolean(rd))
3734
- {
3735
- rd = false;
3736
- }
3737
-
3738
- if (pf)
3739
- {
3740
- n = c.events.prefix + n;
3741
- }
3742
- if (ns)
3743
- {
3744
- n = n +'.'+ c.events.namespace;
3745
- }
3746
- if (ns && rd)
3747
- {
3748
- n += c.serialNumber;
3749
- }
3750
-
3751
- return n;
3752
- }
3753
- function cf_c(n, c) {
3754
- return (is_string(c.classnames[n])) ? c.classnames[n] : n;
3755
- }
3756
- function cf_mapWrapperSizes(ws, o, p) {
3757
-
3758
- if (!is_boolean(p))
3759
- {
3760
- p = true;
3761
- }
3762
- var pad = (o.usePadding && p) ? o.padding : [0, 0, 0, 0];
3763
- var wra = {};
3764
-
3765
- wra[o.d['width']] = ws[0] + pad[1] + pad[3];
3766
- wra[o.d['height']] = ws[1] + pad[0] + pad[2];
3767
-
3768
- return wra;
3769
- }
3770
- function cf_sortParams(vals, typs) {
3771
- var arr = [];
3772
- for (var a = 0, l1 = vals.length; a < l1; a++)
3773
- {
3774
- for (var b = 0, l2 = typs.length; b < l2; b++)
3775
- {
3776
- if (typs[b].indexOf(typeof vals[a]) > -1 && is_undefined(arr[b]))
3777
- {
3778
- arr[b] = vals[a];
3779
- break;
3780
- }
3781
- }
3782
- }
3783
- return arr;
3784
- }
3785
- function cf_getPadding(p) {
3786
- if (is_undefined(p))
3787
- {
3788
- return [0, 0, 0, 0];
3789
- }
3790
- if (is_number(p))
3791
- {
3792
- return [p, p, p, p];
3793
- }
3794
- if (is_string(p))
3795
- {
3796
- p = p.split('px').join('').split('em').join('').split(' ');
3797
- }
3798
-
3799
- if (!is_array(p))
3800
- {
3801
- return [0, 0, 0, 0];
3802
- }
3803
- for (var i = 0; i < 4; i++)
3804
- {
3805
- p[i] = parseInt(p[i], 10);
3806
- }
3807
- switch (p.length)
3808
- {
3809
- case 0:
3810
- return [0, 0, 0, 0];
3811
- case 1:
3812
- return [p[0], p[0], p[0], p[0]];
3813
- case 2:
3814
- return [p[0], p[1], p[0], p[1]];
3815
- case 3:
3816
- return [p[0], p[1], p[2], p[1]];
3817
- default:
3818
- return [p[0], p[1], p[2], p[3]];
3819
- }
3820
- }
3821
- function cf_getAlignPadding(itm, o) {
3822
- var x = (is_number(o[o.d['width']])) ? Math.ceil(o[o.d['width']] - ms_getTotalSize(itm, o, 'width')) : 0;
3823
- switch (o.align)
3824
- {
3825
- case 'left':
3826
- return [0, x];
3827
- case 'right':
3828
- return [x, 0];
3829
- case 'center':
3830
- default:
3831
- return [Math.ceil(x/2), Math.floor(x/2)];
3832
- }
3833
- }
3834
- function cf_getDimensions(o) {
3835
- var dm = [
3836
- ['width' , 'innerWidth' , 'outerWidth' , 'height' , 'innerHeight' , 'outerHeight' , 'left', 'top' , 'marginRight' , 0, 1, 2, 3],
3837
- ['height' , 'innerHeight' , 'outerHeight' , 'width' , 'innerWidth' , 'outerWidth' , 'top' , 'left', 'marginBottom', 3, 2, 1, 0]
3838
- ];
3839
-
3840
- var dl = dm[0].length,
3841
- dx = (o.direction == 'right' || o.direction == 'left') ? 0 : 1;
3842
-
3843
- var dimensions = {};
3844
- for (var d = 0; d < dl; d++)
3845
- {
3846
- dimensions[dm[0][d]] = dm[dx][d];
3847
- }
3848
- return dimensions;
3849
- }
3850
- function cf_getAdjust(x, o, a, $t) {
3851
- var v = x;
3852
- if (is_function(a))
3853
- {
3854
- v = a.call($t, v);
3855
-
3856
- }
3857
- else if (is_string(a))
3858
- {
3859
- var p = a.split('+'),
3860
- m = a.split('-');
3861
-
3862
- if (m.length > p.length)
3863
- {
3864
- var neg = true,
3865
- sta = m[0],
3866
- adj = m[1];
3867
- }
3868
- else
3869
- {
3870
- var neg = false,
3871
- sta = p[0],
3872
- adj = p[1];
3873
- }
3874
-
3875
- switch(sta)
3876
- {
3877
- case 'even':
3878
- v = (x % 2 == 1) ? x-1 : x;
3879
- break;
3880
- case 'odd':
3881
- v = (x % 2 == 0) ? x-1 : x;
3882
- break;
3883
- default:
3884
- v = x;
3885
- break;
3886
- }
3887
- adj = parseInt(adj, 10);
3888
- if (is_number(adj))
3889
- {
3890
- if (neg)
3891
- {
3892
- adj = -adj;
3893
- }
3894
- v += adj;
3895
- }
3896
- }
3897
- if (!is_number(v) || v < 1)
3898
- {
3899
- v = 1;
3900
- }
3901
- return v;
3902
- }
3903
- function cf_getItemsAdjust(x, o, a, $t) {
3904
- return cf_getItemAdjustMinMax(cf_getAdjust(x, o, a, $t), o.items.visibleConf);
3905
- }
3906
- function cf_getItemAdjustMinMax(v, i) {
3907
- if (is_number(i.min) && v < i.min)
3908
- {
3909
- v = i.min;
3910
- }
3911
- if (is_number(i.max) && v > i.max)
3912
- {
3913
- v = i.max;
3914
- }
3915
- if (v < 1)
3916
- {
3917
- v = 1;
3918
- }
3919
- return v;
3920
- }
3921
- function cf_getSynchArr(s) {
3922
- if (!is_array(s))
3923
- {
3924
- s = [[s]];
3925
- }
3926
- if (!is_array(s[0]))
3927
- {
3928
- s = [s];
3929
- }
3930
- for (var j = 0, l = s.length; j < l; j++)
3931
- {
3932
- if (is_string(s[j][0]))
3933
- {
3934
- s[j][0] = $(s[j][0]);
3935
- }
3936
- if (!is_boolean(s[j][1]))
3937
- {
3938
- s[j][1] = true;
3939
- }
3940
- if (!is_boolean(s[j][2]))
3941
- {
3942
- s[j][2] = true;
3943
- }
3944
- if (!is_number(s[j][3]))
3945
- {
3946
- s[j][3] = 0;
3947
- }
3948
- }
3949
- return s;
3950
- }
3951
- function cf_getKeyCode(k) {
3952
- if (k == 'right')
3953
- {
3954
- return 39;
3955
- }
3956
- if (k == 'left')
3957
- {
3958
- return 37;
3959
- }
3960
- if (k == 'up')
3961
- {
3962
- return 38;
3963
- }
3964
- if (k == 'down')
3965
- {
3966
- return 40;
3967
- }
3968
- return -1;
3969
- }
3970
- function cf_setCookie(n, $c, c) {
3971
- if (n)
3972
- {
3973
- var v = $c.triggerHandler(cf_e('currentPosition', c));
3974
- $.fn.carouFredSel.cookie.set(n, v);
3975
- }
3976
- }
3977
- function cf_getCookie(n) {
3978
- var c = $.fn.carouFredSel.cookie.get(n);
3979
- return (c == '') ? 0 : c;
3980
- }
3981
-
3982
- // init function
3983
- function in_mapCss($elem, props) {
3984
- var css = {};
3985
- for (var p = 0, l = props.length; p < l; p++)
3986
- {
3987
- css[props[p]] = $elem.css(props[p]);
3988
- }
3989
- return css;
3990
- }
3991
- function in_complementItems(obj, opt, itm, sta) {
3992
- if (!is_object(obj.visibleConf))
3993
- {
3994
- obj.visibleConf = {};
3995
- }
3996
- if (!is_object(obj.sizesConf))
3997
- {
3998
- obj.sizesConf = {};
3999
- }
4000
-
4001
- if (obj.start == 0 && is_number(sta))
4002
- {
4003
- obj.start = sta;
4004
- }
4005
-
4006
- // visible items
4007
- if (is_object(obj.visible))
4008
- {
4009
- obj.visibleConf.min = obj.visible.min;
4010
- obj.visibleConf.max = obj.visible.max;
4011
- obj.visible = false;
4012
- }
4013
- else if (is_string(obj.visible))
4014
- {
4015
- // variable visible items
4016
- if (obj.visible == 'variable')
4017
- {
4018
- obj.visibleConf.variable = true;
4019
- }
4020
- // adjust string visible items
4021
- else
4022
- {
4023
- obj.visibleConf.adjust = obj.visible;
4024
- }
4025
- obj.visible = false;
4026
- }
4027
- else if (is_function(obj.visible))
4028
- {
4029
- obj.visibleConf.adjust = obj.visible;
4030
- obj.visible = false;
4031
- }
4032
-
4033
- // set items filter
4034
- if (!is_string(obj.filter))
4035
- {
4036
- obj.filter = (itm.filter(':hidden').length > 0) ? ':visible' : '*';
4037
- }
4038
-
4039
- // primary item-size not set
4040
- if (!obj[opt.d['width']])
4041
- {
4042
- // responsive carousel -> set to largest
4043
- if (opt.responsive)
4044
- {
4045
- debug(true, 'Set a '+opt.d['width']+' for the items!');
4046
- obj[opt.d['width']] = ms_getTrueLargestSize(itm, opt, 'outerWidth');
4047
- }
4048
- // non-responsive -> measure it or set to "variable"
4049
- else
4050
- {
4051
- obj[opt.d['width']] = (ms_hasVariableSizes(itm, opt, 'outerWidth'))
4052
- ? 'variable'
4053
- : itm[opt.d['outerWidth']](true);
4054
- }
4055
- }
4056
-
4057
- // secondary item-size not set -> measure it or set to "variable"
4058
- if (!obj[opt.d['height']])
4059
- {
4060
- obj[opt.d['height']] = (ms_hasVariableSizes(itm, opt, 'outerHeight'))
4061
- ? 'variable'
4062
- : itm[opt.d['outerHeight']](true);
4063
- }
4064
-
4065
- obj.sizesConf.width = obj.width;
4066
- obj.sizesConf.height = obj.height;
4067
- return obj;
4068
- }
4069
- function in_complementVisibleItems(opt, avl) {
4070
- // primary item-size variable -> set visible items variable
4071
- if (opt.items[opt.d['width']] == 'variable')
4072
- {
4073
- opt.items.visibleConf.variable = true;
4074
- }
4075
- if (!opt.items.visibleConf.variable) {
4076
- // primary size is number -> calculate visible-items
4077
- if (is_number(opt[opt.d['width']]))
4078
- {
4079
- opt.items.visible = Math.floor(opt[opt.d['width']] / opt.items[opt.d['width']]);
4080
- }
4081
- // measure and calculate primary size and visible-items
4082
- else
4083
- {
4084
- opt.items.visible = Math.floor(avl / opt.items[opt.d['width']]);
4085
- opt[opt.d['width']] = opt.items.visible * opt.items[opt.d['width']];
4086
- if (!opt.items.visibleConf.adjust)
4087
- {
4088
- opt.align = false;
4089
- }
4090
- }
4091
- if (opt.items.visible == 'Infinity' || opt.items.visible < 1)
4092
- {
4093
- debug(true, 'Not a valid number of visible items: Set to "variable".');
4094
- opt.items.visibleConf.variable = true;
4095
- }
4096
- }
4097
- return opt;
4098
- }
4099
- function in_complementPrimarySize(obj, opt, all) {
4100
- // primary size set to auto -> measure largest item-size and set it
4101
- if (obj == 'auto')
4102
- {
4103
- obj = ms_getTrueLargestSize(all, opt, 'outerWidth');
4104
- }
4105
- return obj;
4106
- }
4107
- function in_complementSecondarySize(obj, opt, all) {
4108
- // secondary size set to auto -> measure largest item-size and set it
4109
- if (obj == 'auto')
4110
- {
4111
- obj = ms_getTrueLargestSize(all, opt, 'outerHeight');
4112
- }
4113
- // secondary size not set -> set to secondary item-size
4114
- if (!obj)
4115
- {
4116
- obj = opt.items[opt.d['height']];
4117
- }
4118
- return obj;
4119
- }
4120
- function in_getAlignPadding(o, all) {
4121
- var p = cf_getAlignPadding(gi_getCurrentItems(all, o), o);
4122
- o.padding[o.d[1]] = p[1];
4123
- o.padding[o.d[3]] = p[0];
4124
- return o;
4125
- }
4126
- function in_getResponsiveValues(o, all, avl) {
4127
-
4128
- var visb = cf_getItemAdjustMinMax(Math.ceil(o[o.d['width']] / o.items[o.d['width']]), o.items.visibleConf);
4129
- if (visb > all.length)
4130
- {
4131
- visb = all.length;
4132
- }
4133
-
4134
- var newS = Math.floor(o[o.d['width']]/visb);
4135
-
4136
- o.items.visible = visb;
4137
- o.items[o.d['width']] = newS;
4138
- o[o.d['width']] = visb * newS;
4139
- return o;
4140
- }
4141
-
4142
-
4143
- // buttons functions
4144
- function bt_pauseOnHoverConfig(p) {
4145
- if (is_string(p))
4146
- {
4147
- var i = (p.indexOf('immediate') > -1) ? true : false,
4148
- r = (p.indexOf('resume') > -1) ? true : false;
4149
- }
4150
- else
4151
- {
4152
- var i = r = false;
4153
- }
4154
- return [i, r];
4155
- }
4156
- function bt_mousesheelNumber(mw) {
4157
- return (is_number(mw)) ? mw : null
4158
- }
4159
-
4160
- // helper functions
4161
- function is_null(a) {
4162
- return (a === null);
4163
- }
4164
- function is_undefined(a) {
4165
- return (is_null(a) || typeof a == 'undefined' || a === '' || a === 'undefined');
4166
- }
4167
- function is_array(a) {
4168
- return (a instanceof Array);
4169
- }
4170
- function is_jquery(a) {
4171
- return (a instanceof jQuery);
4172
- }
4173
- function is_object(a) {
4174
- return ((a instanceof Object || typeof a == 'object') && !is_null(a) && !is_jquery(a) && !is_array(a) && !is_function(a));
4175
- }
4176
- function is_number(a) {
4177
- return ((a instanceof Number || typeof a == 'number') && !isNaN(a));
4178
- }
4179
- function is_string(a) {
4180
- return ((a instanceof String || typeof a == 'string') && !is_undefined(a) && !is_true(a) && !is_false(a));
4181
- }
4182
- function is_function(a) {
4183
- return (a instanceof Function || typeof a == 'function');
4184
- }
4185
- function is_boolean(a) {
4186
- return (a instanceof Boolean || typeof a == 'boolean' || is_true(a) || is_false(a));
4187
- }
4188
- function is_true(a) {
4189
- return (a === true || a === 'true');
4190
- }
4191
- function is_false(a) {
4192
- return (a === false || a === 'false');
4193
- }
4194
- function is_percentage(x) {
4195
- return (is_string(x) && x.slice(-1) == '%');
4196
- }
4197
-
4198
-
4199
- function getTime() {
4200
- return new Date().getTime();
4201
- }
4202
-
4203
- function deprecated( o, n ) {
4204
- debug(true, o+' is DEPRECATED, support for it will be removed. Use '+n+' instead.');
4205
- }
4206
- function debug(d, m) {
4207
- if (!is_undefined(window.console) && !is_undefined(window.console.log))
4208
- {
4209
- if (is_object(d))
4210
- {
4211
- var s = ' ('+d.selector+')';
4212
- d = d.debug;
4213
- }
4214
- else
4215
- {
4216
- var s = '';
4217
- }
4218
- if (!d)
4219
- {
4220
- return false;
4221
- }
4222
-
4223
- if (is_string(m))
4224
- {
4225
- m = 'carouFredSel'+s+': ' + m;
4226
- }
4227
- else
4228
- {
4229
- m = ['carouFredSel'+s+':', m];
4230
- }
4231
- window.console.log(m);
4232
- }
4233
- return false;
4234
- }
4235
-
4236
-
4237
-
4238
- // EASING FUNCTIONS
4239
- $.extend($.easing, {
4240
- 'quadratic': function(t) {
4241
- var t2 = t * t;
4242
- return t * (-t2 * t + 4 * t2 - 6 * t + 4);
4243
- },
4244
- 'cubic': function(t) {
4245
- return t * (4 * t * t - 9 * t + 6);
4246
- },
4247
- 'elastic': function(t) {
4248
- var t2 = t * t;
4249
- return t * (33 * t2 * t2 - 106 * t2 * t + 126 * t2 - 67 * t + 15);
4250
- }
4251
- });
4252
-
4253
-
4254
  })(jQuery);
1
+ /*
2
+ * jQuery carouFredSel 6.2.1
3
+ * Demo's and documentation:
4
+ * caroufredsel.dev7studios.com
5
+ *
6
+ * Copyright (c) 2013 Fred Heusschen
7
+ * www.frebsite.nl
8
+ *
9
+ * Dual licensed under the MIT and GPL licenses.
10
+ * http://en.wikipedia.org/wiki/MIT_License
11
+ * http://en.wikipedia.org/wiki/GNU_General_Public_License
12
+ */
13
+
14
+
15
+ (function($) {
16
+
17
+
18
+ // LOCAL
19
+
20
+ if ( $.fn.carouFredSel )
21
+ {
22
+ return;
23
+ }
24
+
25
+ $.fn.caroufredsel = $.fn.carouFredSel = function(options, configs)
26
+ {
27
+
28
+ // no element
29
+ if (this.length == 0)
30
+ {
31
+ debug( true, 'No element found for "' + this.selector + '".' );
32
+ return this;
33
+ }
34
+
35
+ // multiple elements
36
+ if (this.length > 1)
37
+ {
38
+ return this.each(function() {
39
+ $(this).carouFredSel(options, configs);
40
+ });
41
+ }
42
+
43
+
44
+ var $cfs = this,
45
+ $tt0 = this[0],
46
+ starting_position = false;
47
+
48
+ if ($cfs.data('_cfs_isCarousel'))
49
+ {
50
+ starting_position = $cfs.triggerHandler('_cfs_triggerEvent', 'currentPosition');
51
+ $cfs.trigger('_cfs_triggerEvent', ['destroy', true]);
52
+ }
53
+
54
+ var FN = {};
55
+
56
+ FN._init = function(o, setOrig, start)
57
+ {
58
+ o = go_getObject($tt0, o);
59
+
60
+ o.items = go_getItemsObject($tt0, o.items);
61
+ o.scroll = go_getScrollObject($tt0, o.scroll);
62
+ o.auto = go_getAutoObject($tt0, o.auto);
63
+ o.prev = go_getPrevNextObject($tt0, o.prev);
64
+ o.next = go_getPrevNextObject($tt0, o.next);
65
+ o.pagination = go_getPaginationObject($tt0, o.pagination);
66
+ o.swipe = go_getSwipeObject($tt0, o.swipe);
67
+ o.mousewheel = go_getMousewheelObject($tt0, o.mousewheel);
68
+
69
+ if (setOrig)
70
+ {
71
+ opts_orig = $.extend(true, {}, $.fn.carouFredSel.defaults, o);
72
+ }
73
+
74
+ opts = $.extend(true, {}, $.fn.carouFredSel.defaults, o);
75
+ opts.d = cf_getDimensions(opts);
76
+
77
+ crsl.direction = (opts.direction == 'up' || opts.direction == 'left') ? 'next' : 'prev';
78
+
79
+ var a_itm = $cfs.children(),
80
+ avail_primary = ms_getParentSize($wrp, opts, 'width');
81
+
82
+ if (is_true(opts.cookie))
83
+ {
84
+ opts.cookie = 'caroufredsel_cookie_' + conf.serialNumber;
85
+ }
86
+
87
+ opts.maxDimension = ms_getMaxDimension(opts, avail_primary);
88
+
89
+ // complement items and sizes
90
+ opts.items = in_complementItems(opts.items, opts, a_itm, start);
91
+ opts[opts.d['width']] = in_complementPrimarySize(opts[opts.d['width']], opts, a_itm);
92
+ opts[opts.d['height']] = in_complementSecondarySize(opts[opts.d['height']], opts, a_itm);
93
+
94
+ // primary size not set for a responsive carousel
95
+ if (opts.responsive)
96
+ {
97
+ if (!is_percentage(opts[opts.d['width']]))
98
+ {
99
+ opts[opts.d['width']] = '100%';
100
+ }
101
+ }
102
+
103
+ // primary size is percentage
104
+ if (is_percentage(opts[opts.d['width']]))
105
+ {
106
+ crsl.upDateOnWindowResize = true;
107
+ crsl.primarySizePercentage = opts[opts.d['width']];
108
+ opts[opts.d['width']] = ms_getPercentage(avail_primary, crsl.primarySizePercentage);
109
+ if (!opts.items.visible)
110
+ {
111
+ opts.items.visibleConf.variable = true;
112
+ }
113
+ }
114
+
115
+ if (opts.responsive)
116
+ {
117
+ opts.usePadding = false;
118
+ opts.padding = [0, 0, 0, 0];
119
+ opts.align = false;
120
+ opts.items.visibleConf.variable = false;
121
+ }
122
+ else
123
+ {
124
+ // visible-items not set
125
+ if (!opts.items.visible)
126
+ {
127
+ opts = in_complementVisibleItems(opts, avail_primary);
128
+ }
129
+
130
+ // primary size not set -> calculate it or set to "variable"
131
+ if (!opts[opts.d['width']])
132
+ {
133
+ if (!opts.items.visibleConf.variable && is_number(opts.items[opts.d['width']]) && opts.items.filter == '*')
134
+ {
135
+ opts[opts.d['width']] = opts.items.visible * opts.items[opts.d['width']];
136
+ opts.align = false;
137
+ }
138
+ else
139
+ {
140
+ opts[opts.d['width']] = 'variable';
141
+ }
142
+ }
143
+ // align not set -> set to center if primary size is number
144
+ if (is_undefined(opts.align))
145
+ {
146
+ opts.align = (is_number(opts[opts.d['width']]))
147
+ ? 'center'
148
+ : false;
149
+ }
150
+ // set variabe visible-items
151
+ if (opts.items.visibleConf.variable)
152
+ {
153
+ opts.items.visible = gn_getVisibleItemsNext(a_itm, opts, 0);
154
+ }
155
+ }
156
+
157
+ // set visible items by filter
158
+ if (opts.items.filter != '*' && !opts.items.visibleConf.variable)
159
+ {
160
+ opts.items.visibleConf.org = opts.items.visible;
161
+ opts.items.visible = gn_getVisibleItemsNextFilter(a_itm, opts, 0);
162
+ }
163
+
164
+ opts.items.visible = cf_getItemsAdjust(opts.items.visible, opts, opts.items.visibleConf.adjust, $tt0);
165
+ opts.items.visibleConf.old = opts.items.visible;
166
+
167
+ if (opts.responsive)
168
+ {
169
+ if (!opts.items.visibleConf.min)
170
+ {
171
+ opts.items.visibleConf.min = opts.items.visible;
172
+ }
173
+ if (!opts.items.visibleConf.max)
174
+ {
175
+ opts.items.visibleConf.max = opts.items.visible;
176
+ }
177
+ opts = in_getResponsiveValues(opts, a_itm, avail_primary);
178
+ }
179
+ else
180
+ {
181
+ opts.padding = cf_getPadding(opts.padding);
182
+
183
+ if (opts.align == 'top')
184
+ {
185
+ opts.align = 'left';
186
+ }
187
+ else if (opts.align == 'bottom')
188
+ {
189
+ opts.align = 'right';
190
+ }
191
+
192
+ switch (opts.align)
193
+ {
194
+ // align: center, left or right
195
+ case 'center':
196
+ case 'left':
197
+ case 'right':
198
+ if (opts[opts.d['width']] != 'variable')
199
+ {
200
+ opts = in_getAlignPadding(opts, a_itm);
201
+ opts.usePadding = true;
202
+ }
203
+ break;
204
+
205
+ // padding
206
+ default:
207
+ opts.align = false;
208
+ opts.usePadding = (
209
+ opts.padding[0] == 0 &&
210
+ opts.padding[1] == 0 &&
211
+ opts.padding[2] == 0 &&
212
+ opts.padding[3] == 0
213
+ ) ? false : true;
214
+ break;
215
+ }
216
+ }
217
+
218
+ if (!is_number(opts.scroll.duration))
219
+ {
220
+ opts.scroll.duration = 500;
221
+ }
222
+ if (is_undefined(opts.scroll.items))
223
+ {
224
+ opts.scroll.items = (opts.responsive || opts.items.visibleConf.variable || opts.items.filter != '*')
225
+ ? 'visible'
226
+ : opts.items.visible;
227
+ }
228
+
229
+ opts.auto = $.extend(true, {}, opts.scroll, opts.auto);
230
+ opts.prev = $.extend(true, {}, opts.scroll, opts.prev);
231
+ opts.next = $.extend(true, {}, opts.scroll, opts.next);
232
+ opts.pagination = $.extend(true, {}, opts.scroll, opts.pagination);
233
+ // swipe and mousewheel extend later on, per direction
234
+
235
+ opts.auto = go_complementAutoObject($tt0, opts.auto);
236
+ opts.prev = go_complementPrevNextObject($tt0, opts.prev);
237
+ opts.next = go_complementPrevNextObject($tt0, opts.next);
238
+ opts.pagination = go_complementPaginationObject($tt0, opts.pagination);
239
+ opts.swipe = go_complementSwipeObject($tt0, opts.swipe);
240
+ opts.mousewheel = go_complementMousewheelObject($tt0, opts.mousewheel);
241
+
242
+ if (opts.synchronise)
243
+ {
244
+ opts.synchronise = cf_getSynchArr(opts.synchronise);
245
+ }
246
+
247
+
248
+ // DEPRECATED
249
+ if (opts.auto.onPauseStart)
250
+ {
251
+ opts.auto.onTimeoutStart = opts.auto.onPauseStart;
252
+ deprecated('auto.onPauseStart', 'auto.onTimeoutStart');
253
+ }
254
+ if (opts.auto.onPausePause)
255
+ {
256
+ opts.auto.onTimeoutPause = opts.auto.onPausePause;
257
+ deprecated('auto.onPausePause', 'auto.onTimeoutPause');
258
+ }
259
+ if (opts.auto.onPauseEnd)
260
+ {
261
+ opts.auto.onTimeoutEnd = opts.auto.onPauseEnd;
262
+ deprecated('auto.onPauseEnd', 'auto.onTimeoutEnd');
263
+ }
264
+ if (opts.auto.pauseDuration)
265
+ {
266
+ opts.auto.timeoutDuration = opts.auto.pauseDuration;
267
+ deprecated('auto.pauseDuration', 'auto.timeoutDuration');
268
+ }
269
+ // /DEPRECATED
270
+
271
+
272
+ }; // /init
273
+
274
+
275
+ FN._build = function() {
276
+ $cfs.data('_cfs_isCarousel', true);
277
+
278
+ var a_itm = $cfs.children(),
279
+ orgCSS = in_mapCss($cfs, ['textAlign', 'float', 'position', 'top', 'right', 'bottom', 'left', 'zIndex', 'width', 'height', 'marginTop', 'marginRight', 'marginBottom', 'marginLeft']),
280
+ newPosition = 'relative';
281
+
282
+ switch (orgCSS.position)
283
+ {
284
+ case 'absolute':
285
+ case 'fixed':
286
+ newPosition = orgCSS.position;
287
+ break;
288
+ }
289
+
290
+ if (conf.wrapper == 'parent')
291
+ {
292
+ sz_storeOrigCss($wrp);
293
+ }
294
+ else
295
+ {
296
+ $wrp.css(orgCSS);
297
+ }
298
+ $wrp.css({
299
+ 'overflow' : 'hidden',
300
+ 'position' : newPosition
301
+ });
302
+
303
+ sz_storeOrigCss($cfs);
304
+ $cfs.data('_cfs_origCssZindex', orgCSS.zIndex);
305
+ $cfs.css({
306
+ 'textAlign' : 'left',
307
+ 'float' : 'none',
308
+ 'position' : 'absolute',
309
+ 'top' : 0,
310
+ 'right' : 'auto',
311
+ 'bottom' : 'auto',
312
+ 'left' : 0,
313
+ 'marginTop' : 0,
314
+ 'marginRight' : 0,
315
+ 'marginBottom' : 0,
316
+ 'marginLeft' : 0
317
+ });
318
+
319
+ sz_storeMargin(a_itm, opts);
320
+ sz_storeOrigCss(a_itm);
321
+ if (opts.responsive)
322
+ {
323
+ sz_setResponsiveSizes(opts, a_itm);
324
+ }
325
+
326
+ }; // /build
327
+
328
+
329
+ FN._bind_events = function() {
330
+ FN._unbind_events();
331
+
332
+
333
+ // stop event
334
+ $cfs.bind(cf_e('stop', conf), function(e, imm) {
335
+ e.stopPropagation();
336
+
337
+ // button
338
+ if (!crsl.isStopped)
339
+ {
340
+ if (opts.auto.button)
341
+ {
342
+ opts.auto.button.addClass(cf_c('stopped', conf));
343
+ }
344
+ }
345
+
346
+ // set stopped
347
+ crsl.isStopped = true;
348
+
349
+ if (opts.auto.play)
350
+ {
351
+ opts.auto.play = false;
352
+ $cfs.trigger(cf_e('pause', conf), imm);
353
+ }
354
+ return true;
355
+ });
356
+
357
+
358
+ // finish event
359
+ $cfs.bind(cf_e('finish', conf), function(e) {
360
+ e.stopPropagation();
361
+ if (crsl.isScrolling)
362
+ {
363
+ sc_stopScroll(scrl);
364
+ }
365
+ return true;
366
+ });
367
+
368
+
369
+ // pause event
370
+ $cfs.bind(cf_e('pause', conf), function(e, imm, res) {
371
+ e.stopPropagation();
372
+ tmrs = sc_clearTimers(tmrs);
373
+
374
+ // immediately pause
375
+ if (imm && crsl.isScrolling)
376
+ {
377
+ scrl.isStopped = true;
378
+ var nst = getTime() - scrl.startTime;
379
+ scrl.duration -= nst;
380
+ if (scrl.pre)
381
+ {
382
+ scrl.pre.duration -= nst;
383
+ }
384
+ if (scrl.post)
385
+ {
386
+ scrl.post.duration -= nst;
387
+ }
388
+ sc_stopScroll(scrl, false);
389
+ }
390
+
391
+ // update remaining pause-time
392
+ if (!crsl.isPaused && !crsl.isScrolling)
393
+ {
394
+ if (res)
395
+ {
396
+ tmrs.timePassed += getTime() - tmrs.startTime;
397
+ }
398
+ }
399
+
400
+ // button
401
+ if (!crsl.isPaused)
402
+ {
403
+ if (opts.auto.button)
404
+ {
405
+ opts.auto.button.addClass(cf_c('paused', conf));
406
+ }
407
+ }
408
+
409
+ // set paused
410
+ crsl.isPaused = true;
411
+
412
+ // pause pause callback
413
+ if (opts.auto.onTimeoutPause)
414
+ {
415
+ var dur1 = opts.auto.timeoutDuration - tmrs.timePassed,
416
+ perc = 100 - Math.ceil( dur1 * 100 / opts.auto.timeoutDuration );
417
+
418
+ opts.auto.onTimeoutPause.call($tt0, perc, dur1);
419
+ }
420
+ return true;
421
+ });
422
+
423
+
424
+ // play event
425
+ $cfs.bind(cf_e('play', conf), function(e, dir, del, res) {
426
+ e.stopPropagation();
427
+ tmrs = sc_clearTimers(tmrs);
428
+
429
+ // sort params
430
+ var v = [dir, del, res],
431
+ t = ['string', 'number', 'boolean'],
432
+ a = cf_sortParams(v, t);
433
+
434
+ dir = a[0];
435
+ del = a[1];
436
+ res = a[2];
437
+
438
+ if (dir != 'prev' && dir != 'next')
439
+ {
440
+ dir = crsl.direction;
441
+ }
442
+ if (!is_number(del))
443
+ {
444
+ del = 0;
445
+ }
446
+ if (!is_boolean(res))
447
+ {
448
+ res = false;
449
+ }
450
+
451
+ // stopped?
452
+ if (res)
453
+ {
454
+ crsl.isStopped = false;
455
+ opts.auto.play = true;
456
+ }
457
+ if (!opts.auto.play)
458
+ {
459
+ e.stopImmediatePropagation();
460
+ return debug(conf, 'Carousel stopped: Not scrolling.');
461
+ }
462
+
463
+ // button
464
+ if (crsl.isPaused)
465
+ {
466
+ if (opts.auto.button)
467
+ {
468
+ opts.auto.button.removeClass(cf_c('stopped', conf));
469
+ opts.auto.button.removeClass(cf_c('paused', conf));
470
+ }
471
+ }
472
+
473
+ // set playing
474
+ crsl.isPaused = false;
475
+ tmrs.startTime = getTime();
476
+
477
+ // timeout the scrolling
478
+ var dur1 = opts.auto.timeoutDuration + del;
479
+ dur2 = dur1 - tmrs.timePassed;
480
+ perc = 100 - Math.ceil(dur2 * 100 / dur1);
481
+
482
+ if (opts.auto.progress)
483
+ {
484
+ tmrs.progress = setInterval(function() {
485
+ var pasd = getTime() - tmrs.startTime + tmrs.timePassed,
486
+ perc = Math.ceil(pasd * 100 / dur1);
487
+ opts.auto.progress.updater.call(opts.auto.progress.bar[0], perc);
488
+ }, opts.auto.progress.interval);
489
+ }
490
+
491
+ tmrs.auto = setTimeout(function() {
492
+ if (opts.auto.progress)
493
+ {
494
+ opts.auto.progress.updater.call(opts.auto.progress.bar[0], 100);
495
+ }
496
+ if (opts.auto.onTimeoutEnd)
497
+ {
498
+ opts.auto.onTimeoutEnd.call($tt0, perc, dur2);
499
+ }
500
+ if (crsl.isScrolling)
501
+ {
502
+ $cfs.trigger(cf_e('play', conf), dir);
503
+ }
504
+ else
505
+ {
506
+ $cfs.trigger(cf_e(dir, conf), opts.auto);
507
+ }
508
+ }, dur2);
509
+
510
+ // pause start callback
511
+ if (opts.auto.onTimeoutStart)
512
+ {
513
+ opts.auto.onTimeoutStart.call($tt0, perc, dur2);
514
+ }
515
+
516
+ return true;
517
+ });
518
+
519
+
520
+ // resume event
521
+ $cfs.bind(cf_e('resume', conf), function(e) {
522
+ e.stopPropagation();
523
+ if (scrl.isStopped)
524
+ {
525
+ scrl.isStopped = false;
526
+ crsl.isPaused = false;
527
+ crsl.isScrolling = true;
528
+ scrl.startTime = getTime();
529
+ sc_startScroll(scrl, conf);
530
+ }
531
+ else
532
+ {
533
+ $cfs.trigger(cf_e('play', conf));
534
+ }
535
+ return true;
536
+ });
537
+
538
+
539
+ // prev + next events
540
+ $cfs.bind(cf_e('prev', conf)+' '+cf_e('next', conf), function(e, obj, num, clb, que) {
541
+ e.stopPropagation();
542
+
543
+ // stopped or hidden carousel, don't scroll, don't queue
544
+ if (crsl.isStopped || $cfs.is(':hidden'))
545
+ {
546
+ e.stopImmediatePropagation();
547
+ return debug(conf, 'Carousel stopped or hidden: Not scrolling.');
548
+ }
549
+
550
+ // not enough items
551
+ var minimum = (is_number(opts.items.minimum)) ? opts.items.minimum : opts.items.visible + 1;
552
+ if (minimum > itms.total)
553
+ {
554
+ e.stopImmediatePropagation();
555
+ return debug(conf, 'Not enough items ('+itms.total+' total, '+minimum+' needed): Not scrolling.');
556
+ }
557
+
558
+ // get config
559
+ var v = [obj, num, clb, que],
560
+ t = ['object', 'number/string', 'function', 'boolean'],
561
+ a = cf_sortParams(v, t);
562
+
563
+ obj = a[0];
564
+ num = a[1];
565
+ clb = a[2];
566
+ que = a[3];
567
+
568
+ var eType = e.type.slice(conf.events.prefix.length);
569
+
570
+ if (!is_object(obj))
571
+ {
572
+ obj = {};
573
+ }
574
+ if (is_function(clb))
575
+ {
576
+ obj.onAfter = clb;
577
+ }
578
+ if (is_boolean(que))
579
+ {
580
+ obj.queue = que;
581
+ }
582
+ obj = $.extend(true, {}, opts[eType], obj);
583
+
584
+ // test conditions callback
585
+ if (obj.conditions && !obj.conditions.call($tt0, eType))
586
+ {
587
+ e.stopImmediatePropagation();
588
+ return debug(conf, 'Callback "conditions" returned false.');
589
+ }
590
+
591
+ if (!is_number(num))
592
+ {
593
+ if (opts.items.filter != '*')
594
+ {
595
+ num = 'visible';
596
+ }
597
+ else
598
+ {
599
+ var arr = [num, obj.items, opts[eType].items];
600
+ for (var a = 0, l = arr.length; a < l; a++)
601
+ {
602
+ if (is_number(arr[a]) || arr[a] == 'page' || arr[a] == 'visible') {
603
+ num = arr[a];
604
+ break;
605
+ }
606
+ }
607
+ }
608
+ switch(num) {
609
+ case 'page':
610
+ e.stopImmediatePropagation();
611
+ return $cfs.triggerHandler(cf_e(eType+'Page', conf), [obj, clb]);
612
+ break;
613
+
614
+ case 'visible':
615
+ if (!opts.items.visibleConf.variable && opts.items.filter == '*')
616
+ {
617
+ num = opts.items.visible;
618
+ }
619
+ break;
620
+ }
621
+ }
622
+
623
+ // resume animation, add current to queue
624
+ if (scrl.isStopped)
625
+ {
626
+ $cfs.trigger(cf_e('resume', conf));
627
+ $cfs.trigger(cf_e('queue', conf), [eType, [obj, num, clb]]);
628
+ e.stopImmediatePropagation();
629
+ return debug(conf, 'Carousel resumed scrolling.');
630
+ }
631
+
632
+ // queue if scrolling
633
+ if (obj.duration > 0)
634
+ {
635
+ if (crsl.isScrolling)
636
+ {
637
+ if (obj.queue)
638
+ {
639
+ if (obj.queue == 'last')
640
+ {
641
+ queu = [];
642
+ }
643
+ if (obj.queue != 'first' || queu.length == 0)
644
+ {
645
+ $cfs.trigger(cf_e('queue', conf), [eType, [obj, num, clb]]);
646
+ }
647
+ }
648
+ e.stopImmediatePropagation();
649
+ return debug(conf, 'Carousel currently scrolling.');
650
+ }
651
+ }
652
+
653
+ tmrs.timePassed = 0;
654
+ $cfs.trigger(cf_e('slide_'+eType, conf), [obj, num]);
655
+
656
+ // synchronise
657
+ if (opts.synchronise)
658
+ {
659
+ var s = opts.synchronise,
660
+ c = [obj, num];
661
+
662
+ for (var j = 0, l = s.length; j < l; j++) {
663
+ var d = eType;
664
+ if (!s[j][2])
665
+ {
666
+ d = (d == 'prev') ? 'next' : 'prev';
667
+ }
668
+ if (!s[j][1])
669
+ {
670
+ c[0] = s[j][0].triggerHandler('_cfs_triggerEvent', ['configuration', d]);
671
+ }
672
+ c[1] = num + s[j][3];
673
+ s[j][0].trigger('_cfs_triggerEvent', ['slide_'+d, c]);
674
+ }
675
+ }
676
+ return true;
677
+ });
678
+
679
+
680
+ // prev event
681
+ $cfs.bind(cf_e('slide_prev', conf), function(e, sO, nI) {
682
+ e.stopPropagation();
683
+ var a_itm = $cfs.children();
684
+
685
+ // non-circular at start, scroll to end
686
+ if (!opts.circular)
687
+ {
688
+ if (itms.first == 0)
689
+ {
690
+ if (opts.infinite)
691
+ {
692
+ $cfs.trigger(cf_e('next', conf), itms.total-1);
693
+ }
694
+ return e.stopImmediatePropagation();
695
+ }
696
+ }
697
+
698
+ sz_resetMargin(a_itm, opts);
699
+
700
+ // find number of items to scroll
701
+ if (!is_number(nI))
702
+ {
703
+ if (opts.items.visibleConf.variable)
704
+ {
705
+ nI = gn_getVisibleItemsPrev(a_itm, opts, itms.total-1);
706
+ }
707
+ else if (opts.items.filter != '*')
708
+ {
709
+ var xI = (is_number(sO.items)) ? sO.items : gn_getVisibleOrg($cfs, opts);
710
+ nI = gn_getScrollItemsPrevFilter(a_itm, opts, itms.total-1, xI);
711
+ }
712
+ else
713
+ {
714
+ nI = opts.items.visible;
715
+ }
716
+ nI = cf_getAdjust(nI, opts, sO.items, $tt0);
717
+ }
718
+
719
+ // prevent non-circular from scrolling to far
720
+ if (!opts.circular)
721
+ {
722
+ if (itms.total - nI < itms.first)
723
+ {
724
+ nI = itms.total - itms.first;
725
+ }
726
+ }
727
+
728
+ // set new number of visible items
729
+ opts.items.visibleConf.old = opts.items.visible;
730
+ if (opts.items.visibleConf.variable)
731
+ {
732
+ var vI = cf_getItemsAdjust(gn_getVisibleItemsNext(a_itm, opts, itms.total-nI), opts, opts.items.visibleConf.adjust, $tt0);
733
+ if (opts.items.visible+nI <= vI && nI < itms.total)
734
+ {
735
+ nI++;
736
+ vI = cf_getItemsAdjust(gn_getVisibleItemsNext(a_itm, opts, itms.total-nI), opts, opts.items.visibleConf.adjust, $tt0);
737
+ }
738
+ opts.items.visible = vI;
739
+ }
740
+ else if (opts.items.filter != '*')
741
+ {
742
+ var vI = gn_getVisibleItemsNextFilter(a_itm, opts, itms.total-nI);
743
+ opts.items.visible = cf_getItemsAdjust(vI, opts, opts.items.visibleConf.adjust, $tt0);
744
+ }
745
+
746
+ sz_resetMargin(a_itm, opts, true);
747
+
748
+ // scroll 0, don't scroll
749
+ if (nI == 0)
750
+ {
751
+ e.stopImmediatePropagation();
752
+ return debug(conf, '0 items to scroll: Not scrolling.');
753
+ }
754
+ debug(conf, 'Scrolling '+nI+' items backward.');
755
+
756
+
757
+ // save new config
758
+ itms.first += nI;
759
+ while (itms.first >= itms.total)
760
+ {
761
+ itms.first -= itms.total;
762
+ }
763
+
764
+ // non-circular callback
765
+ if (!opts.circular)
766
+ {
767
+ if (itms.first == 0 && sO.onEnd)
768
+ {
769
+ sO.onEnd.call($tt0, 'prev');
770
+ }
771
+ if (!opts.infinite)
772
+ {
773
+ nv_enableNavi(opts, itms.first, conf);
774
+ }
775
+ }
776
+
777
+ // rearrange items
778
+ $cfs.children().slice(itms.total-nI, itms.total).prependTo($cfs);
779
+ if (itms.total < opts.items.visible + nI)
780
+ {
781
+ $cfs.children().slice(0, (opts.items.visible+nI)-itms.total).clone(true).appendTo($cfs);
782
+ }
783
+
784
+ // the needed items
785
+ var a_itm = $cfs.children(),
786
+ i_old = gi_getOldItemsPrev(a_itm, opts, nI),
787
+ i_new = gi_getNewItemsPrev(a_itm, opts),
788
+ i_cur_l = a_itm.eq(nI-1),
789
+ i_old_l = i_old.last(),
790
+ i_new_l = i_new.last();
791
+
792
+ sz_resetMargin(a_itm, opts);
793
+
794
+ var pL = 0,
795
+ pR = 0;
796
+
797
+ if (opts.align)
798
+ {
799
+ var p = cf_getAlignPadding(i_new, opts);
800
+ pL = p[0];
801
+ pR = p[1];
802
+ }
803
+ var oL = (pL < 0) ? opts.padding[opts.d[3]] : 0;
804
+
805
+ // hide items for fx directscroll
806
+ var hiddenitems = false,
807
+ i_skp = $();
808
+ if (opts.items.visible < nI)
809
+ {
810
+ i_skp = a_itm.slice(opts.items.visibleConf.old, nI);
811
+ if (sO.fx == 'directscroll')
812
+ {
813
+ var orgW = opts.items[opts.d['width']];
814
+ hiddenitems = i_skp;
815
+ i_cur_l = i_new_l;
816
+ sc_hideHiddenItems(hiddenitems);
817
+ opts.items[opts.d['width']] = 'variable';
818
+ }
819
+ }
820
+ // save new sizes
821
+ var $cf2 = false,
822
+ i_siz = ms_getTotalSize(a_itm.slice(0, nI), opts, 'width'),
823
+ w_siz = cf_mapWrapperSizes(ms_getSizes(i_new, opts, true), opts, !opts.usePadding),
824
+ i_siz_vis = 0,
825
+ a_cfs = {},
826
+ a_wsz = {},
827
+ a_cur = {},
828
+ a_old = {},
829
+ a_new = {},
830
+ a_lef = {},
831
+ a_lef_vis = {},
832
+ a_dur = sc_getDuration(sO, opts, nI, i_siz);
833
+
834
+ switch(sO.fx)
835
+ {
836
+ case 'cover':
837
+ case 'cover-fade':
838
+ i_siz_vis = ms_getTotalSize(a_itm.slice(0, opts.items.visible), opts, 'width');
839
+ break;
840
+ }
841
+
842
+ if (hiddenitems)
843
+ {
844
+ opts.items[opts.d['width']] = orgW;
845
+ }
846
+
847
+ sz_resetMargin(a_itm, opts, true);
848
+ if (pR >= 0)
849
+ {
850
+ sz_resetMargin(i_old_l, opts, opts.padding[opts.d[1]]);
851
+ }
852
+ if (pL >= 0)
853
+ {
854
+ sz_resetMargin(i_cur_l, opts, opts.padding[opts.d[3]]);
855
+ }
856
+
857
+ if (opts.align)
858
+ {
859
+ opts.padding[opts.d[1]] = pR;
860
+ opts.padding[opts.d[3]] = pL;
861
+ }
862
+
863
+ a_lef[opts.d['left']] = -(i_siz - oL);
864
+ a_lef_vis[opts.d['left']] = -(i_siz_vis - oL);
865
+ a_wsz[opts.d['left']] = w_siz[opts.d['width']];
866
+
867
+ // scrolling functions
868
+ var _s_wrapper = function() {},
869
+ _a_wrapper = function() {},
870
+ _s_paddingold = function() {},
871
+ _a_paddingold = function() {},
872
+ _s_paddingnew = function() {},
873
+ _a_paddingnew = function() {},
874
+ _s_paddingcur = function() {},
875
+ _a_paddingcur = function() {},
876
+ _onafter = function() {},
877
+ _moveitems = function() {},
878
+ _position = function() {};
879
+
880
+ // clone carousel
881
+ switch(sO.fx)
882
+ {
883
+ case 'crossfade':
884
+ case 'cover':
885
+ case 'cover-fade':
886
+ case 'uncover':
887
+ case 'uncover-fade':
888
+ $cf2 = $cfs.clone(true).appendTo($wrp);
889
+ break;
890
+ }
891
+ switch(sO.fx)
892
+ {
893
+ case 'crossfade':
894
+ case 'uncover':
895
+ case 'uncover-fade':
896
+ $cf2.children().slice(0, nI).remove();
897
+ $cf2.children().slice(opts.items.visibleConf.old).remove();
898
+ break;
899
+
900
+ case 'cover':
901
+ case 'cover-fade':
902
+ $cf2.children().slice(opts.items.visible).remove();
903
+ $cf2.css(a_lef_vis);
904
+ break;
905
+ }
906
+
907
+ $cfs.css(a_lef);
908
+
909
+ // reset all scrolls
910
+ scrl = sc_setScroll(a_dur, sO.easing, conf);
911
+
912
+ // animate / set carousel
913
+ a_cfs[opts.d['left']] = (opts.usePadding) ? opts.padding[opts.d[3]] : 0;
914
+
915
+ // animate / set wrapper
916
+ if (opts[opts.d['width']] == 'variable' || opts[opts.d['height']] == 'variable')
917
+ {
918
+ _s_wrapper = function() {
919
+ $wrp.css(w_siz);
920
+ };
921
+ _a_wrapper = function() {
922
+ scrl.anims.push([$wrp, w_siz]);
923
+ };
924
+ }
925
+
926
+ // animate / set items
927
+ if (opts.usePadding)
928
+ {
929
+ if (i_new_l.not(i_cur_l).length)
930
+ {
931
+ a_cur[opts.d['marginRight']] = i_cur_l.data('_cfs_origCssMargin');
932
+
933
+ if (pL < 0)
934
+ {
935
+ i_cur_l.css(a_cur);
936
+ }
937
+ else
938
+ {
939
+ _s_paddingcur = function() {
940
+ i_cur_l.css(a_cur);
941
+ };
942
+ _a_paddingcur = function() {
943
+ scrl.anims.push([i_cur_l, a_cur]);
944
+ };
945
+ }
946
+ }
947
+ switch(sO.fx)
948
+ {
949
+ case 'cover':
950
+ case 'cover-fade':
951
+ $cf2.children().eq(nI-1).css(a_cur);
952
+ break;
953
+ }
954
+
955
+ if (i_new_l.not(i_old_l).length)
956
+ {
957
+ a_old[opts.d['marginRight']] = i_old_l.data('_cfs_origCssMargin');
958
+ _s_paddingold = function() {
959
+ i_old_l.css(a_old);
960
+ };
961
+ _a_paddingold = function() {
962
+ scrl.anims.push([i_old_l, a_old]);
963
+ };
964
+ }
965
+
966
+ if (pR >= 0)
967
+ {
968
+ a_new[opts.d['marginRight']] = i_new_l.data('_cfs_origCssMargin') + opts.padding[opts.d[1]];
969
+ _s_paddingnew = function() {
970
+ i_new_l.css(a_new);
971
+ };
972
+ _a_paddingnew = function() {
973
+ scrl.anims.push([i_new_l, a_new]);
974
+ };
975
+ }
976
+ }
977
+
978
+ // set position
979
+ _position = function() {
980
+ $cfs.css(a_cfs);
981
+ };
982
+
983
+
984
+ var overFill = opts.items.visible+nI-itms.total;
985
+
986
+ // rearrange items
987
+ _moveitems = function() {
988
+ if (overFill > 0)
989
+ {
990
+ $cfs.children().slice(itms.total).remove();
991
+ i_old = $( $cfs.children().slice(itms.total-(opts.items.visible-overFill)).get().concat( $cfs.children().slice(0, overFill).get() ) );
992
+ }
993
+ sc_showHiddenItems(hiddenitems);
994
+
995
+ if (opts.usePadding)
996
+ {
997
+ var l_itm = $cfs.children().eq(opts.items.visible+nI-1);
998
+ l_itm.css(opts.d['marginRight'], l_itm.data('_cfs_origCssMargin'));
999
+ }
1000
+ };
1001
+
1002
+
1003
+ var cb_arguments = sc_mapCallbackArguments(i_old, i_skp, i_new, nI, 'prev', a_dur, w_siz);
1004
+
1005
+ // fire onAfter callbacks
1006
+ _onafter = function() {
1007
+ sc_afterScroll($cfs, $cf2, sO);
1008
+ crsl.isScrolling = false;
1009
+ clbk.onAfter = sc_fireCallbacks($tt0, sO, 'onAfter', cb_arguments, clbk);
1010
+ queu = sc_fireQueue($cfs, queu, conf);
1011
+
1012
+ if (!crsl.isPaused)
1013
+ {
1014
+ $cfs.trigger(cf_e('play', conf));
1015
+ }
1016
+ };
1017
+
1018
+ // fire onBefore callback
1019
+ crsl.isScrolling = true;
1020
+ tmrs = sc_clearTimers(tmrs);
1021
+ clbk.onBefore = sc_fireCallbacks($tt0, sO, 'onBefore', cb_arguments, clbk);
1022
+
1023
+ switch(sO.fx)
1024
+ {
1025
+ case 'none':
1026
+ $cfs.css(a_cfs);
1027
+ _s_wrapper();
1028
+ _s_paddingold();
1029
+ _s_paddingnew();
1030
+ _s_paddingcur();
1031
+ _position();
1032
+ _moveitems();
1033
+ _onafter();
1034
+ break;
1035
+
1036
+ case 'fade':
1037
+ scrl.anims.push([$cfs, { 'opacity': 0 }, function() {
1038
+ _s_wrapper();
1039
+ _s_paddingold();
1040
+ _s_paddingnew();
1041
+ _s_paddingcur();
1042
+ _position();
1043
+ _moveitems();
1044
+ scrl = sc_setScroll(a_dur, sO.easing, conf);
1045
+ scrl.anims.push([$cfs, { 'opacity': 1 }, _onafter]);
1046
+ sc_startScroll(scrl, conf);
1047
+ }]);
1048
+ break;
1049
+
1050
+ case 'crossfade':
1051
+ $cfs.css({ 'opacity': 0 });
1052
+ scrl.anims.push([$cf2, { 'opacity': 0 }]);
1053
+ scrl.anims.push([$cfs, { 'opacity': 1 }, _onafter]);
1054
+ _a_wrapper();
1055
+ _s_paddingold();
1056
+ _s_paddingnew();
1057
+ _s_paddingcur();
1058
+ _position();
1059
+ _moveitems();
1060
+ break;
1061
+
1062
+ case 'cover':
1063
+ scrl.anims.push([$cf2, a_cfs, function() {
1064
+ _s_paddingold();
1065
+ _s_paddingnew();
1066
+ _s_paddingcur();
1067
+ _position();
1068
+ _moveitems();
1069
+ _onafter();
1070
+ }]);
1071
+ _a_wrapper();
1072
+ break;
1073
+
1074
+ case 'cover-fade':
1075
+ scrl.anims.push([$cfs, { 'opacity': 0 }]);
1076
+ scrl.anims.push([$cf2, a_cfs, function() {
1077
+ _s_paddingold();
1078
+ _s_paddingnew();
1079
+ _s_paddingcur();
1080
+ _position();
1081
+ _moveitems();
1082
+ _onafter();
1083
+ }]);
1084
+ _a_wrapper();
1085
+ break;
1086
+
1087
+ case 'uncover':
1088
+ scrl.anims.push([$cf2, a_wsz, _onafter]);
1089
+ _a_wrapper();
1090
+ _s_paddingold();
1091
+ _s_paddingnew();
1092
+ _s_paddingcur();
1093
+ _position();
1094
+ _moveitems();
1095
+ break;
1096
+
1097
+ case 'uncover-fade':
1098
+ $cfs.css({ 'opacity': 0 });
1099
+ scrl.anims.push([$cfs, { 'opacity': 1 }]);
1100
+ scrl.anims.push([$cf2, a_wsz, _onafter]);
1101
+ _a_wrapper();
1102
+ _s_paddingold();
1103
+ _s_paddingnew();
1104
+ _s_paddingcur();
1105
+ _position();
1106
+ _moveitems();
1107
+ break;
1108
+
1109
+ default:
1110
+ scrl.anims.push([$cfs, a_cfs, function() {
1111
+ _moveitems();
1112
+ _onafter();
1113
+ }]);
1114
+ _a_wrapper();
1115
+ _a_paddingold();
1116
+ _a_paddingnew();
1117
+ _a_paddingcur();
1118
+ break;
1119
+ }
1120
+
1121
+ sc_startScroll(scrl, conf);
1122
+ cf_setCookie(opts.cookie, $cfs, conf);
1123
+
1124
+ $cfs.trigger(cf_e('updatePageStatus', conf), [false, w_siz]);
1125
+
1126
+ return true;
1127
+ });
1128
+
1129
+
1130
+ // next event
1131
+ $cfs.bind(cf_e('slide_next', conf), function(e, sO, nI) {
1132
+ e.stopPropagation();
1133
+ var a_itm = $cfs.children();
1134
+
1135
+ // non-circular at end, scroll to start
1136
+ if (!opts.circular)
1137
+ {
1138
+ if (itms.first == opts.items.visible)
1139
+ {
1140
+ if (opts.infinite)
1141
+ {
1142
+ $cfs.trigger(cf_e('prev', conf), itms.total-1);
1143
+ }
1144
+ return e.stopImmediatePropagation();
1145
+ }
1146
+ }
1147
+
1148
+ sz_resetMargin(a_itm, opts);
1149
+
1150
+ // find number of items to scroll
1151
+ if (!is_number(nI))
1152
+ {
1153
+ if (opts.items.filter != '*')
1154
+ {
1155
+ var xI = (is_number(sO.items)) ? sO.items : gn_getVisibleOrg($cfs, opts);
1156
+ nI = gn_getScrollItemsNextFilter(a_itm, opts, 0, xI);
1157
+ }
1158
+ else
1159
+ {
1160
+ nI = opts.items.visible;
1161
+ }
1162
+ nI = cf_getAdjust(nI, opts, sO.items, $tt0);
1163
+ }
1164
+
1165
+ var lastItemNr = (itms.first == 0) ? itms.total : itms.first;
1166
+
1167
+ // prevent non-circular from scrolling to far
1168
+ if (!opts.circular)
1169
+ {
1170
+ if (opts.items.visibleConf.variable)
1171
+ {
1172
+ var vI = gn_getVisibleItemsNext(a_itm, opts, nI),
1173
+ xI = gn_getVisibleItemsPrev(a_itm, opts, lastItemNr-1);
1174
+ }
1175
+ else
1176
+ {
1177
+ var vI = opts.items.visible,
1178
+ xI = opts.items.visible;
1179
+ }
1180
+
1181
+ if (nI + vI > lastItemNr)
1182
+ {
1183
+ nI = lastItemNr - xI;
1184
+ }
1185
+ }
1186
+
1187
+ // set new number of visible items
1188
+ opts.items.visibleConf.old = opts.items.visible;
1189
+ if (opts.items.visibleConf.variable)
1190
+ {
1191
+ var vI = cf_getItemsAdjust(gn_getVisibleItemsNextTestCircular(a_itm, opts, nI, lastItemNr), opts, opts.items.visibleConf.adjust, $tt0);
1192
+ while (opts.items.visible-nI >= vI && nI < itms.total)
1193
+ {
1194
+ nI++;
1195
+ vI = cf_getItemsAdjust(gn_getVisibleItemsNextTestCircular(a_itm, opts, nI, lastItemNr), opts, opts.items.visibleConf.adjust, $tt0);
1196
+ }
1197
+ opts.items.visible = vI;
1198
+ }
1199
+ else if (opts.items.filter != '*')
1200
+ {
1201
+ var vI = gn_getVisibleItemsNextFilter(a_itm, opts, nI);
1202
+ opts.items.visible = cf_getItemsAdjust(vI, opts, opts.items.visibleConf.adjust, $tt0);
1203
+ }
1204
+
1205
+ sz_resetMargin(a_itm, opts, true);
1206
+
1207
+ // scroll 0, don't scroll
1208
+ if (nI == 0)
1209
+ {
1210
+ e.stopImmediatePropagation();
1211
+ return debug(conf, '0 items to scroll: Not scrolling.');
1212
+ }
1213
+ debug(conf, 'Scrolling '+nI+' items forward.');
1214
+
1215
+
1216
+ // save new config
1217
+ itms.first -= nI;
1218
+ while (itms.first < 0)
1219
+ {
1220
+ itms.first += itms.total;
1221
+ }
1222
+
1223
+ // non-circular callback
1224
+ if (!opts.circular)
1225
+ {
1226
+ if (itms.first == opts.items.visible && sO.onEnd)
1227
+ {
1228
+ sO.onEnd.call($tt0, 'next');
1229
+ }
1230
+ if (!opts.infinite)
1231
+ {
1232
+ nv_enableNavi(opts, itms.first, conf);
1233
+ }
1234
+ }
1235
+
1236
+ // rearrange items
1237
+ if (itms.total < opts.items.visible+nI)
1238
+ {
1239
+ $cfs.children().slice(0, (opts.items.visible+nI)-itms.total).clone(true).appendTo($cfs);
1240
+ }
1241
+
1242
+ // the needed items
1243
+ var a_itm = $cfs.children(),
1244
+ i_old = gi_getOldItemsNext(a_itm, opts),
1245
+ i_new = gi_getNewItemsNext(a_itm, opts, nI),
1246
+ i_cur_l = a_itm.eq(nI-1),
1247
+ i_old_l = i_old.last(),
1248
+ i_new_l = i_new.last();
1249
+
1250
+ sz_resetMargin(a_itm, opts);
1251
+
1252
+ var pL = 0,
1253
+ pR = 0;
1254
+
1255
+ if (opts.align)
1256
+ {
1257
+ var p = cf_getAlignPadding(i_new, opts);
1258
+ pL = p[0];
1259
+ pR = p[1];
1260
+ }
1261
+
1262
+ // hide items for fx directscroll
1263
+ var hiddenitems = false,
1264
+ i_skp = $();
1265
+ if (opts.items.visibleConf.old < nI)
1266
+ {
1267
+ i_skp = a_itm.slice(opts.items.visibleConf.old, nI);
1268
+ if (sO.fx == 'directscroll')
1269
+ {
1270
+ var orgW = opts.items[opts.d['width']];
1271
+ hiddenitems = i_skp;
1272
+ i_cur_l = i_old_l;
1273
+ sc_hideHiddenItems(hiddenitems);
1274
+ opts.items[opts.d['width']] = 'variable';
1275
+ }
1276
+ }
1277
+ // save new sizes
1278
+ var $cf2 = false,
1279
+ i_siz = ms_getTotalSize(a_itm.slice(0, nI), opts, 'width'),
1280
+ w_siz = cf_mapWrapperSizes(ms_getSizes(i_new, opts, true), opts, !opts.usePadding),
1281
+ i_siz_vis = 0,
1282
+ a_cfs = {},
1283
+ a_cfs_vis = {},
1284
+ a_cur = {},
1285
+ a_old = {},
1286
+ a_lef = {},
1287
+ a_dur = sc_getDuration(sO, opts, nI, i_siz);
1288
+
1289
+ switch(sO.fx)
1290
+ {
1291
+ case 'uncover':
1292
+ case 'uncover-fade':
1293
+ i_siz_vis = ms_getTotalSize(a_itm.slice(0, opts.items.visibleConf.old), opts, 'width');
1294
+ break;
1295
+ }
1296
+
1297
+ if (hiddenitems)
1298
+ {
1299
+ opts.items[opts.d['width']] = orgW;
1300
+ }
1301
+
1302
+ if (opts.align)
1303
+ {
1304
+ if (opts.padding[opts.d[1]] < 0)
1305
+ {
1306
+ opts.padding[opts.d[1]] = 0;
1307
+ }
1308
+ }
1309
+ sz_resetMargin(a_itm, opts, true);
1310
+ sz_resetMargin(i_old_l, opts, opts.padding[opts.d[1]]);
1311
+
1312
+ if (opts.align)
1313
+ {
1314
+ opts.padding[opts.d[1]] = pR;
1315
+ opts.padding[opts.d[3]] = pL;
1316
+ }
1317
+
1318
+ a_lef[opts.d['left']] = (opts.usePadding) ? opts.padding[opts.d[3]] : 0;
1319
+
1320
+ // scrolling functions
1321
+ var _s_wrapper = function() {},
1322
+ _a_wrapper = function() {},
1323
+ _s_paddingold = function() {},
1324
+ _a_paddingold = function() {},
1325
+ _s_paddingcur = function() {},
1326
+ _a_paddingcur = function() {},
1327
+ _onafter = function() {},
1328
+ _moveitems = function() {},
1329
+ _position = function() {};
1330
+
1331
+ // clone carousel
1332
+ switch(sO.fx)
1333
+ {
1334
+ case 'crossfade':
1335
+ case 'cover':
1336
+ case 'cover-fade':
1337
+ case 'uncover':
1338
+ case 'uncover-fade':
1339
+ $cf2 = $cfs.clone(true).appendTo($wrp);
1340
+ $cf2.children().slice(opts.items.visibleConf.old).remove();
1341
+ break;
1342
+ }
1343
+ switch(sO.fx)
1344
+ {
1345
+ case 'crossfade':
1346
+ case 'cover':
1347
+ case 'cover-fade':
1348
+ $cfs.css('zIndex', 1);
1349
+ $cf2.css('zIndex', 0);
1350
+ break;
1351
+ }
1352
+
1353
+ // reset all scrolls
1354
+ scrl = sc_setScroll(a_dur, sO.easing, conf);
1355
+
1356
+ // animate / set carousel
1357
+ a_cfs[opts.d['left']] = -i_siz;
1358
+ a_cfs_vis[opts.d['left']] = -i_siz_vis;
1359
+
1360
+ if (pL < 0)
1361
+ {
1362
+ a_cfs[opts.d['left']] += pL;
1363
+ }
1364
+
1365
+ // animate / set wrapper
1366
+ if (opts[opts.d['width']] == 'variable' || opts[opts.d['height']] == 'variable')
1367
+ {
1368
+ _s_wrapper = function() {
1369
+ $wrp.css(w_siz);
1370
+ };
1371
+ _a_wrapper = function() {
1372
+ scrl.anims.push([$wrp, w_siz]);
1373
+ };
1374
+ }
1375
+
1376
+ // animate / set items
1377
+ if (opts.usePadding)
1378
+ {
1379
+ var i_new_l_m = i_new_l.data('_cfs_origCssMargin');
1380
+
1381
+ if (pR >= 0)
1382
+ {
1383
+ i_new_l_m += opts.padding[opts.d[1]];
1384
+ }
1385
+ i_new_l.css(opts.d['marginRight'], i_new_l_m);
1386
+
1387
+ if (i_cur_l.not(i_old_l).length)
1388
+ {
1389
+ a_old[opts.d['marginRight']] = i_old_l.data('_cfs_origCssMargin');
1390
+ }
1391
+ _s_paddingold = function() {
1392
+ i_old_l.css(a_old);
1393
+ };
1394
+ _a_paddingold = function() {
1395
+ scrl.anims.push([i_old_l, a_old]);
1396
+ };
1397
+
1398
+ var i_cur_l_m = i_cur_l.data('_cfs_origCssMargin');
1399
+ if (pL > 0)
1400
+ {
1401
+ i_cur_l_m += opts.padding[opts.d[3]];
1402
+ }
1403
+
1404
+ a_cur[opts.d['marginRight']] = i_cur_l_m;
1405
+
1406
+ _s_paddingcur = function() {
1407
+ i_cur_l.css(a_cur);
1408
+ };
1409
+ _a_paddingcur = function() {
1410
+ scrl.anims.push([i_cur_l, a_cur]);
1411
+ };
1412
+ }
1413
+
1414
+ // set position
1415
+ _position = function() {
1416
+ $cfs.css(a_lef);
1417
+ };
1418
+
1419
+
1420
+ var overFill = opts.items.visible+nI-itms.total;
1421
+
1422
+ // rearrange items
1423
+ _moveitems = function() {
1424
+ if (overFill > 0)
1425
+ {
1426
+ $cfs.children().slice(itms.total).remove();
1427
+ }
1428
+ var l_itm = $cfs.children().slice(0, nI).appendTo($cfs).last();
1429
+ if (overFill > 0)
1430
+ {
1431
+ i_new = gi_getCurrentItems(a_itm, opts);
1432
+ }
1433
+ sc_showHiddenItems(hiddenitems);
1434
+
1435
+ if (opts.usePadding)
1436
+ {
1437
+ if (itms.total < opts.items.visible+nI) {
1438
+ var i_cur_l = $cfs.children().eq(opts.items.visible-1);
1439
+ i_cur_l.css(opts.d['marginRight'], i_cur_l.data('_cfs_origCssMargin') + opts.padding[opts.d[1]]);
1440
+ }
1441
+ l_itm.css(opts.d['marginRight'], l_itm.data('_cfs_origCssMargin'));
1442
+ }
1443
+ };
1444
+
1445
+
1446
+ var cb_arguments = sc_mapCallbackArguments(i_old, i_skp, i_new, nI, 'next', a_dur, w_siz);
1447
+
1448
+ // fire onAfter callbacks
1449
+ _onafter = function() {
1450
+ $cfs.css('zIndex', $cfs.data('_cfs_origCssZindex'));
1451
+ sc_afterScroll($cfs, $cf2, sO);
1452
+ crsl.isScrolling = false;
1453
+ clbk.onAfter = sc_fireCallbacks($tt0, sO, 'onAfter', cb_arguments, clbk);
1454
+ queu = sc_fireQueue($cfs, queu, conf);
1455
+
1456
+ if (!crsl.isPaused)
1457
+ {
1458
+ $cfs.trigger(cf_e('play', conf));
1459
+ }
1460
+ };
1461
+
1462
+ // fire onBefore callbacks
1463
+ crsl.isScrolling = true;
1464
+ tmrs = sc_clearTimers(tmrs);
1465
+ clbk.onBefore = sc_fireCallbacks($tt0, sO, 'onBefore', cb_arguments, clbk);
1466
+
1467
+ switch(sO.fx)
1468
+ {
1469
+ case 'none':
1470
+ $cfs.css(a_cfs);
1471
+ _s_wrapper();
1472
+ _s_paddingold();
1473
+ _s_paddingcur();
1474
+ _position();
1475
+ _moveitems();
1476
+ _onafter();
1477
+ break;
1478
+
1479
+ case 'fade':
1480
+ scrl.anims.push([$cfs, { 'opacity': 0 }, function() {
1481
+ _s_wrapper();
1482
+ _s_paddingold();
1483
+ _s_paddingcur();
1484
+ _position();
1485
+ _moveitems();
1486
+ scrl = sc_setScroll(a_dur, sO.easing, conf);
1487
+ scrl.anims.push([$cfs, { 'opacity': 1 }, _onafter]);
1488
+ sc_startScroll(scrl, conf);
1489
+ }]);
1490
+ break;
1491
+
1492
+ case 'crossfade':
1493
+ $cfs.css({ 'opacity': 0 });
1494
+ scrl.anims.push([$cf2, { 'opacity': 0 }]);
1495
+ scrl.anims.push([$cfs, { 'opacity': 1 }, _onafter]);
1496
+ _a_wrapper();
1497
+ _s_paddingold();
1498
+ _s_paddingcur();
1499
+ _position();
1500
+ _moveitems();
1501
+ break;
1502
+
1503
+ case 'cover':
1504
+ $cfs.css(opts.d['left'], $wrp[opts.d['width']]());
1505
+ scrl.anims.push([$cfs, a_lef, _onafter]);
1506
+ _a_wrapper();
1507
+ _s_paddingold();
1508
+ _s_paddingcur();
1509
+ _moveitems();
1510
+ break;
1511
+
1512
+ case 'cover-fade':
1513
+ $cfs.css(opts.d['left'], $wrp[opts.d['width']]());
1514
+ scrl.anims.push([$cf2, { 'opacity': 0 }]);
1515
+ scrl.anims.push([$cfs, a_lef, _onafter]);
1516
+ _a_wrapper();
1517
+ _s_paddingold();
1518
+ _s_paddingcur();
1519
+ _moveitems();
1520
+ break;
1521
+
1522
+ case 'uncover':
1523
+ scrl.anims.push([$cf2, a_cfs_vis, _onafter]);
1524
+ _a_wrapper();
1525
+ _s_paddingold();
1526
+ _s_paddingcur();
1527
+ _position();
1528
+ _moveitems();
1529
+ break;
1530
+
1531
+ case 'uncover-fade':
1532
+ $cfs.css({ 'opacity': 0 });
1533
+ scrl.anims.push([$cfs, { 'opacity': 1 }]);
1534
+ scrl.anims.push([$cf2, a_cfs_vis, _onafter]);
1535
+ _a_wrapper();
1536
+ _s_paddingold();
1537
+ _s_paddingcur();
1538
+ _position();
1539
+ _moveitems();
1540
+ break;
1541
+
1542
+ default:
1543
+ scrl.anims.push([$cfs, a_cfs, function() {
1544
+ _position();
1545
+ _moveitems();
1546
+ _onafter();
1547
+ }]);
1548
+ _a_wrapper();
1549
+ _a_paddingold();
1550
+ _a_paddingcur();
1551
+ break;
1552
+ }
1553
+
1554
+ sc_startScroll(scrl, conf);
1555
+ cf_setCookie(opts.cookie, $cfs, conf);
1556
+
1557
+ $cfs.trigger(cf_e('updatePageStatus', conf), [false, w_siz]);
1558
+
1559
+ return true;
1560
+ });
1561
+
1562
+
1563
+ // slideTo event
1564
+ $cfs.bind(cf_e('slideTo', conf), function(e, num, dev, org, obj, dir, clb) {
1565
+ e.stopPropagation();
1566
+
1567
+ var v = [num, dev, org, obj, dir, clb],
1568
+ t = ['string/number/object', 'number', 'boolean', 'object', 'string', 'function'],
1569
+ a = cf_sortParams(v, t);
1570
+
1571
+ obj = a[3];
1572
+ dir = a[4];
1573
+ clb = a[5];
1574
+
1575
+ num = gn_getItemIndex(a[0], a[1], a[2], itms, $cfs);
1576
+
1577
+ if (num == 0)
1578
+ {
1579
+ return false;
1580
+ }
1581
+ if (!is_object(obj))
1582
+ {
1583
+ obj = false;
1584
+ }
1585
+
1586
+ if (dir != 'prev' && dir != 'next')
1587
+ {
1588
+ if (opts.circular)
1589
+ {
1590
+ dir = (num <= itms.total / 2) ? 'next' : 'prev';
1591
+ }
1592
+ else
1593
+ {
1594
+ dir = (itms.first == 0 || itms.first > num) ? 'next' : 'prev';
1595
+ }
1596
+ }
1597
+
1598
+ if (dir == 'prev')
1599
+ {
1600
+ num = itms.total-num;
1601
+ }
1602
+ $cfs.trigger(cf_e(dir, conf), [obj, num, clb]);
1603
+
1604
+ return true;
1605
+ });
1606
+
1607
+
1608
+ // prevPage event
1609
+ $cfs.bind(cf_e('prevPage', conf), function(e, obj, clb) {
1610
+ e.stopPropagation();
1611
+ var cur = $cfs.triggerHandler(cf_e('currentPage', conf));
1612
+ return $cfs.triggerHandler(cf_e('slideToPage', conf), [cur-1, obj, 'prev', clb]);
1613
+ });
1614
+
1615
+
1616
+ // nextPage event
1617
+ $cfs.bind(cf_e('nextPage', conf), function(e, obj, clb) {
1618
+ e.stopPropagation();
1619
+ var cur = $cfs.triggerHandler(cf_e('currentPage', conf));
1620
+ return $cfs.triggerHandler(cf_e('slideToPage', conf), [cur+1, obj, 'next', clb]);
1621
+ });
1622
+
1623
+
1624
+ // slideToPage event
1625
+ $cfs.bind(cf_e('slideToPage', conf), function(e, pag, obj, dir, clb) {
1626
+ e.stopPropagation();
1627
+ if (!is_number(pag))
1628
+ {
1629
+ pag = $cfs.triggerHandler(cf_e('currentPage', conf));
1630
+ }
1631
+ var ipp = opts.pagination.items || opts.items.visible,
1632
+ max = Math.ceil(itms.total / ipp)-1;
1633
+
1634
+ if (pag < 0)
1635
+ {
1636
+ pag = max;
1637
+ }
1638
+ if (pag > max)
1639
+ {
1640
+ pag = 0;
1641
+ }
1642
+ return $cfs.triggerHandler(cf_e('slideTo', conf), [pag*ipp, 0, true, obj, dir, clb]);
1643
+ });
1644
+
1645
+ // jumpToStart event
1646
+ $cfs.bind(cf_e('jumpToStart', conf), function(e, s) {
1647
+ e.stopPropagation();
1648
+ if (s)
1649
+ {
1650
+ s = gn_getItemIndex(s, 0, true, itms, $cfs);
1651
+ }
1652
+ else
1653
+ {
1654
+ s = 0;
1655
+ }
1656
+
1657
+ s += itms.first;
1658
+ if (s != 0)
1659
+ {
1660
+ if (itms.total > 0)
1661
+ {
1662
+ while (s > itms.total)
1663
+ {
1664
+ s -= itms.total;
1665
+ }
1666
+ }
1667
+ $cfs.prepend($cfs.children().slice(s, itms.total));
1668
+ }
1669
+ return true;
1670
+ });
1671
+
1672
+
1673
+ // synchronise event
1674
+ $cfs.bind(cf_e('synchronise', conf), function(e, s) {
1675
+ e.stopPropagation();
1676
+ if (s)
1677
+ {
1678
+ s = cf_getSynchArr(s);
1679
+ }
1680
+ else if (opts.synchronise)
1681
+ {
1682
+ s = opts.synchronise;
1683
+ }
1684
+ else
1685
+ {
1686
+ return debug(conf, 'No carousel to synchronise.');
1687
+ }
1688
+
1689
+ var n = $cfs.triggerHandler(cf_e('currentPosition', conf)),
1690
+ x = true;
1691
+
1692
+ for (var j = 0, l = s.length; j < l; j++)
1693
+ {
1694
+ if (!s[j][0].triggerHandler(cf_e('slideTo', conf), [n, s[j][3], true]))
1695
+ {
1696
+ x = false;
1697
+ }
1698
+ }
1699
+ return x;
1700
+ });
1701
+
1702
+
1703
+ // queue event
1704
+ $cfs.bind(cf_e('queue', conf), function(e, dir, opt) {
1705
+ e.stopPropagation();
1706
+ if (is_function(dir))
1707
+ {
1708
+ dir.call($tt0, queu);
1709
+ }
1710
+ else if (is_array(dir))
1711
+ {
1712
+ queu = dir;
1713
+ }
1714
+ else if (!is_undefined(dir))
1715
+ {
1716
+ queu.push([dir, opt]);
1717
+ }
1718
+ return queu;
1719
+ });
1720
+
1721
+
1722
+ // insertItem event
1723
+ $cfs.bind(cf_e('insertItem', conf), function(e, itm, num, org, dev) {
1724
+ e.stopPropagation();
1725
+
1726
+ var v = [itm, num, org, dev],
1727
+ t = ['string/object', 'string/number/object', 'boolean', 'number'],
1728
+ a = cf_sortParams(v, t);
1729
+
1730
+ itm = a[0];
1731
+ num = a[1];
1732
+ org = a[2];
1733
+ dev = a[3];
1734
+
1735
+ if (is_object(itm) && !is_jquery(itm))
1736
+ {
1737
+ itm = $(itm);
1738
+ }
1739
+ else if (is_string(itm))
1740
+ {
1741
+ itm = $(itm);
1742
+ }
1743
+ if (!is_jquery(itm) || itm.length == 0)
1744
+ {
1745
+ return debug(conf, 'Not a valid object.');
1746
+ }
1747
+
1748
+ if (is_undefined(num))
1749
+ {
1750
+ num = 'end';
1751
+ }
1752
+
1753
+ sz_storeMargin(itm, opts);
1754
+ sz_storeOrigCss(itm);
1755
+
1756
+ var orgNum = num,
1757
+ before = 'before';
1758
+
1759
+ if (num == 'end')
1760
+ {
1761
+ if (org)
1762
+ {
1763
+ if (itms.first == 0)
1764
+ {
1765
+ num = itms.total-1;
1766
+ before = 'after';
1767
+ }
1768
+ else
1769
+ {
1770
+ num = itms.first;
1771
+ itms.first += itm.length;
1772
+ }
1773
+ if (num < 0)
1774
+ {
1775
+ num = 0;
1776
+ }
1777
+ }
1778
+ else
1779
+ {
1780
+ num = itms.total-1;
1781
+ before = 'after';
1782
+ }
1783
+ }
1784
+ else
1785
+ {
1786
+ num = gn_getItemIndex(num, dev, org, itms, $cfs);
1787
+ }
1788
+
1789
+ var $cit = $cfs.children().eq(num);
1790
+ if ($cit.length)
1791
+ {
1792
+ $cit[before](itm);
1793
+ }
1794
+ else
1795
+ {
1796
+ debug(conf, 'Correct insert-position not found! Appending item to the end.');
1797
+ $cfs.append(itm);
1798
+ }
1799
+
1800
+ if (orgNum != 'end' && !org)
1801
+ {
1802
+ if (num < itms.first)
1803
+ {
1804
+ itms.first += itm.length;
1805
+ }
1806
+ }
1807
+ itms.total = $cfs.children().length;
1808
+ if (itms.first >= itms.total)
1809
+ {
1810
+ itms.first -= itms.total;
1811
+ }
1812
+
1813
+ $cfs.trigger(cf_e('updateSizes', conf));
1814
+ $cfs.trigger(cf_e('linkAnchors', conf));
1815
+
1816
+ return true;
1817
+ });
1818
+
1819
+
1820
+ // removeItem event
1821
+ $cfs.bind(cf_e('removeItem', conf), function(e, num, org, dev) {
1822
+ e.stopPropagation();
1823
+
1824
+ var v = [num, org, dev],
1825
+ t = ['string/number/object', 'boolean', 'number'],
1826
+ a = cf_sortParams(v, t);
1827
+
1828
+ num = a[0];
1829
+ org = a[1];
1830
+ dev = a[2];
1831
+
1832
+ var removed = false;
1833
+
1834
+ if (num instanceof $ && num.length > 1)
1835
+ {
1836
+ $removed = $();
1837
+ num.each(function(i, el) {
1838
+ var $rem = $cfs.trigger(cf_e('removeItem', conf), [$(this), org, dev]);
1839
+ if ( $rem )
1840
+ {
1841
+ $removed = $removed.add($rem);
1842
+ }
1843
+ });
1844
+ return $removed;
1845
+ }
1846
+
1847
+ if (is_undefined(num) || num == 'end')
1848
+ {
1849
+ $removed = $cfs.children().last();
1850
+ }
1851
+ else
1852
+ {
1853
+ num = gn_getItemIndex(num, dev, org, itms, $cfs);
1854
+ var $removed = $cfs.children().eq(num);
1855
+ if ( $removed.length )
1856
+ {
1857
+ if (num < itms.first)
1858
+ {
1859
+ itms.first -= $removed.length;
1860
+ }
1861
+ }
1862
+ }
1863
+ if ( $removed && $removed.length )
1864
+ {
1865
+ $removed.detach();
1866
+ itms.total = $cfs.children().length;
1867
+ $cfs.trigger(cf_e('updateSizes', conf));
1868
+ }
1869
+
1870
+ return $removed;
1871
+ });
1872
+
1873
+
1874
+ // onBefore and onAfter event
1875
+ $cfs.bind(cf_e('onBefore', conf)+' '+cf_e('onAfter', conf), function(e, fn) {
1876
+ e.stopPropagation();
1877
+ var eType = e.type.slice(conf.events.prefix.length);
1878
+ if (is_array(fn))
1879
+ {
1880
+ clbk[eType] = fn;
1881
+ }
1882
+ if (is_function(fn))
1883
+ {
1884
+ clbk[eType].push(fn);
1885
+ }
1886
+ return clbk[eType];
1887
+ });
1888
+
1889
+
1890
+ // currentPosition event
1891
+ $cfs.bind(cf_e('currentPosition', conf), function(e, fn) {
1892
+ e.stopPropagation();
1893
+ if (itms.first == 0)
1894
+ {
1895
+ var val = 0;
1896
+ }
1897
+ else
1898
+ {
1899
+ var val = itms.total - itms.first;
1900
+ }
1901
+ if (is_function(fn))
1902
+ {
1903
+ fn.call($tt0, val);
1904
+ }
1905
+ return val;
1906
+ });
1907
+
1908
+
1909
+ // currentPage event
1910
+ $cfs.bind(cf_e('currentPage', conf), function(e, fn) {
1911
+ e.stopPropagation();
1912
+ var ipp = opts.pagination.items || opts.items.visible,
1913
+ max = Math.ceil(itms.total/ipp-1),
1914
+ nr;
1915
+ if (itms.first == 0)
1916
+ {
1917
+ nr = 0;
1918
+ }
1919
+ else if (itms.first < itms.total % ipp)
1920
+ {
1921
+ nr = 0;
1922
+ }
1923
+ else if (itms.first == ipp && !opts.circular)
1924
+ {
1925
+ nr = max;
1926
+ }
1927
+ else
1928
+ {
1929
+ nr = Math.round((itms.total-itms.first)/ipp);
1930
+ }
1931
+ if (nr < 0)
1932
+ {
1933
+ nr = 0;
1934
+ }
1935
+ if (nr > max)
1936
+ {
1937
+ nr = max;
1938
+ }
1939
+ if (is_function(fn))
1940
+ {
1941
+ fn.call($tt0, nr);
1942
+ }
1943
+ return nr;
1944
+ });
1945
+
1946
+
1947
+ // currentVisible event
1948
+ $cfs.bind(cf_e('currentVisible', conf), function(e, fn) {
1949
+ e.stopPropagation();
1950
+ var $i = gi_getCurrentItems($cfs.children(), opts);
1951
+ if (is_function(fn))
1952
+ {
1953
+ fn.call($tt0, $i);
1954
+ }
1955
+ return $i;
1956
+ });
1957
+
1958
+
1959
+ // slice event
1960
+ $cfs.bind(cf_e('slice', conf), function(e, f, l, fn) {
1961
+ e.stopPropagation();
1962
+
1963
+ if (itms.total == 0)
1964
+ {
1965
+ return false;
1966
+ }
1967
+
1968
+ var v = [f, l, fn],
1969
+ t = ['number', 'number', 'function'],
1970
+ a = cf_sortParams(v, t);
1971
+
1972
+ f = (is_number(a[0])) ? a[0] : 0;
1973
+ l = (is_number(a[1])) ? a[1] : itms.total;
1974
+ fn = a[2];
1975
+
1976
+ f += itms.first;
1977
+ l += itms.first;
1978
+
1979
+ if (items.total > 0)
1980
+ {
1981
+ while (f > itms.total)
1982
+ {
1983
+ f -= itms.total;
1984
+ }
1985
+ while (l > itms.total)
1986
+ {
1987
+ l -= itms.total;
1988
+ }
1989
+ while (f < 0)
1990
+ {
1991
+ f += itms.total;
1992
+ }
1993
+ while (l < 0)
1994
+ {
1995
+ l += itms.total;
1996
+ }
1997
+ }
1998
+ var $iA = $cfs.children(),
1999
+ $i;
2000
+
2001
+ if (l > f)
2002
+ {
2003
+ $i = $iA.slice(f, l);
2004
+ }
2005
+ else
2006
+ {
2007
+ $i = $( $iA.slice(f, itms.total).get().concat( $iA.slice(0, l).get() ) );
2008
+ }
2009
+
2010
+ if (is_function(fn))
2011
+ {
2012
+ fn.call($tt0, $i);
2013
+ }
2014
+ return $i;
2015
+ });
2016
+
2017
+
2018
+ // isPaused, isStopped and isScrolling events
2019
+ $cfs.bind(cf_e('isPaused', conf)+' '+cf_e('isStopped', conf)+' '+cf_e('isScrolling', conf), function(e, fn) {
2020
+ e.stopPropagation();
2021
+ var eType = e.type.slice(conf.events.prefix.length),
2022
+ value = crsl[eType];
2023
+ if (is_function(fn))
2024
+ {
2025
+ fn.call($tt0, value);
2026
+ }
2027
+ return value;
2028
+ });
2029
+
2030
+
2031
+ // configuration event
2032
+ $cfs.bind(cf_e('configuration', conf), function(e, a, b, c) {
2033
+ e.stopPropagation();
2034
+ var reInit = false;
2035
+
2036
+ // return entire configuration-object
2037
+ if (is_function(a))
2038
+ {
2039
+ a.call($tt0, opts);
2040
+ }
2041
+ // set multiple options via object
2042
+ else if (is_object(a))
2043
+ {
2044
+ opts_orig = $.extend(true, {}, opts_orig, a);
2045
+ if (b !== false) reInit = true;
2046
+ else opts = $.extend(true, {}, opts, a);
2047
+
2048
+ }
2049
+ else if (!is_undefined(a))
2050
+ {
2051
+
2052
+ // callback function for specific option
2053
+ if (is_function(b))
2054
+ {
2055
+ var val = eval('opts.'+a);
2056
+ if (is_undefined(val))
2057
+ {
2058
+ val = '';
2059
+ }
2060
+ b.call($tt0, val);
2061
+ }
2062
+ // set individual option
2063
+ else if (!is_undefined(b))
2064
+ {
2065
+ if (typeof c !== 'boolean') c = true;
2066
+ eval('opts_orig.'+a+' = b');
2067
+ if (c !== false) reInit = true;
2068
+ else eval('opts.'+a+' = b');
2069
+ }
2070
+ // return value for specific option
2071
+ else
2072
+ {
2073
+ return eval('opts.'+a);
2074
+ }
2075
+ }
2076
+ if (reInit)
2077
+ {
2078
+ sz_resetMargin($cfs.children(), opts);
2079
+ FN._init(opts_orig);
2080
+ FN._bind_buttons();
2081
+ var sz = sz_setSizes($cfs, opts);
2082
+ $cfs.trigger(cf_e('updatePageStatus', conf), [true, sz]);
2083
+ }
2084
+ return opts;
2085
+ });
2086
+
2087
+
2088
+ // linkAnchors event
2089
+ $cfs.bind(cf_e('linkAnchors', conf), function(e, $con, sel) {
2090
+ e.stopPropagation();
2091
+
2092
+ if (is_undefined($con))
2093
+ {
2094
+ $con = $('body');
2095
+ }
2096
+ else if (is_string($con))
2097
+ {
2098
+ $con = $($con);
2099
+ }
2100
+ if (!is_jquery($con) || $con.length == 0)
2101
+ {
2102
+ return debug(conf, 'Not a valid object.');
2103
+ }
2104
+ if (!is_string(sel))
2105
+ {
2106
+ sel = 'a.caroufredsel';
2107
+ }
2108
+
2109
+ $con.find(sel).each(function() {
2110
+ var h = this.hash || '';
2111
+ if (h.length > 0 && $cfs.children().index($(h)) != -1)
2112
+ {
2113
+ $(this).unbind('click').click(function(e) {
2114
+ e.preventDefault();
2115
+ $cfs.trigger(cf_e('slideTo', conf), h);
2116
+ });
2117
+ }
2118
+ });
2119
+ return true;
2120
+ });
2121
+
2122
+
2123
+ // updatePageStatus event
2124
+ $cfs.bind(cf_e('updatePageStatus', conf), function(e, build, sizes) {
2125
+ e.stopPropagation();
2126
+ if (!opts.pagination.container)
2127
+ {
2128
+ return;
2129
+ }
2130
+
2131
+ var ipp = opts.pagination.items || opts.items.visible,
2132
+ pgs = Math.ceil(itms.total/ipp);
2133
+
2134
+ if (build)
2135
+ {
2136
+ if (opts.pagination.anchorBuilder)
2137
+ {
2138
+ opts.pagination.container.children().remove();
2139
+ opts.pagination.container.each(function() {
2140
+ for (var a = 0; a < pgs; a++)
2141
+ {
2142
+ var i = $cfs.children().eq( gn_getItemIndex(a*ipp, 0, true, itms, $cfs) );
2143
+ $(this).append(opts.pagination.anchorBuilder.call(i[0], a+1));
2144
+ }
2145
+ });
2146
+ }
2147
+ opts.pagination.container.each(function() {
2148
+ $(this).children().unbind(opts.pagination.event).each(function(a) {
2149
+ $(this).bind(opts.pagination.event, function(e) {
2150
+ e.preventDefault();
2151
+ $cfs.trigger(cf_e('slideTo', conf), [a*ipp, -opts.pagination.deviation, true, opts.pagination]);
2152
+ });
2153
+ });
2154
+ });
2155
+ }
2156
+
2157
+ var selected = $cfs.triggerHandler(cf_e('currentPage', conf)) + opts.pagination.deviation;
2158
+ if (selected >= pgs)
2159
+ {
2160
+ selected = 0;
2161
+ }
2162
+ if (selected < 0)
2163
+ {
2164
+ selected = pgs-1;
2165
+ }
2166
+ opts.pagination.container.each(function() {
2167
+ $(this).children().removeClass(cf_c('selected', conf)).eq(selected).addClass(cf_c('selected', conf));
2168
+ });
2169
+ return true;
2170
+ });
2171
+
2172
+
2173
+ // updateSizes event
2174
+ $cfs.bind(cf_e('updateSizes', conf), function(e) {
2175
+ var vI = opts.items.visible,
2176
+ a_itm = $cfs.children(),
2177
+ avail_primary = ms_getParentSize($wrp, opts, 'width');
2178
+
2179
+ itms.total = a_itm.length;
2180
+
2181
+ if (crsl.primarySizePercentage)
2182
+ {
2183
+ opts.maxDimension = avail_primary;
2184
+ opts[opts.d['width']] = ms_getPercentage(avail_primary, crsl.primarySizePercentage);
2185
+ }
2186
+ else
2187
+ {
2188
+ opts.maxDimension = ms_getMaxDimension(opts, avail_primary);
2189
+ }
2190
+
2191
+ if (opts.responsive)
2192
+ {
2193
+ opts.items.width = opts.items.sizesConf.width;
2194
+ opts.items.height = opts.items.sizesConf.height;
2195
+ opts = in_getResponsiveValues(opts, a_itm, avail_primary);
2196
+ vI = opts.items.visible;
2197
+ sz_setResponsiveSizes(opts, a_itm);
2198
+ }
2199
+ else if (opts.items.visibleConf.variable)
2200
+ {
2201
+ vI = gn_getVisibleItemsNext(a_itm, opts, 0);
2202
+ }
2203
+ else if (opts.items.filter != '*')
2204
+ {
2205
+ vI = gn_getVisibleItemsNextFilter(a_itm, opts, 0);
2206
+ }
2207
+
2208
+ if (!opts.circular && itms.first != 0 && vI > itms.first) {
2209
+ if (opts.items.visibleConf.variable)
2210
+ {
2211
+ var nI = gn_getVisibleItemsPrev(a_itm, opts, itms.first) - itms.first;
2212
+ }
2213
+ else if (opts.items.filter != '*')
2214
+ {
2215
+ var nI = gn_getVisibleItemsPrevFilter(a_itm, opts, itms.first) - itms.first;
2216
+ }
2217
+ else
2218
+ {
2219
+ var nI = opts.items.visible - itms.first;
2220
+ }
2221
+ debug(conf, 'Preventing non-circular: sliding '+nI+' items backward.');
2222
+ $cfs.trigger(cf_e('prev', conf), nI);
2223
+ }
2224
+
2225
+ opts.items.visible = cf_getItemsAdjust(vI, opts, opts.items.visibleConf.adjust, $tt0);
2226
+ opts.items.visibleConf.old = opts.items.visible;
2227
+ opts = in_getAlignPadding(opts, a_itm);
2228
+
2229
+ var sz = sz_setSizes($cfs, opts);
2230
+ $cfs.trigger(cf_e('updatePageStatus', conf), [true, sz]);
2231
+ nv_showNavi(opts, itms.total, conf);
2232
+ nv_enableNavi(opts, itms.first, conf);
2233
+
2234
+ return sz;
2235
+ });
2236
+
2237
+
2238
+ // destroy event
2239
+ $cfs.bind(cf_e('destroy', conf), function(e, orgOrder) {
2240
+ e.stopPropagation();
2241
+ tmrs = sc_clearTimers(tmrs);
2242
+
2243
+ $cfs.data('_cfs_isCarousel', false);
2244
+ $cfs.trigger(cf_e('finish', conf));
2245
+ if (orgOrder)
2246
+ {
2247
+ $cfs.trigger(cf_e('jumpToStart', conf));
2248
+ }
2249
+ sz_restoreOrigCss($cfs.children());
2250
+ sz_restoreOrigCss($cfs);
2251
+ FN._unbind_events();
2252
+ FN._unbind_buttons();
2253
+ if (conf.wrapper == 'parent')
2254
+ {
2255
+ sz_restoreOrigCss($wrp);
2256
+ }
2257
+ else
2258
+ {
2259
+ $wrp.replaceWith($cfs);
2260
+ }
2261
+
2262
+ return true;
2263
+ });
2264
+
2265
+
2266
+ // debug event
2267
+ $cfs.bind(cf_e('debug', conf), function(e) {
2268
+ debug(conf, 'Carousel width: ' + opts.width);
2269
+ debug(conf, 'Carousel height: ' + opts.height);
2270
+ debug(conf, 'Item widths: ' + opts.items.width);
2271
+ debug(conf, 'Item heights: ' + opts.items.height);
2272
+ debug(conf, 'Number of items visible: ' + opts.items.visible);
2273
+ if (opts.auto.play)
2274
+ {
2275
+ debug(conf, 'Number of items scrolled automatically: ' + opts.auto.items);
2276
+ }
2277
+ if (opts.prev.button)
2278
+ {
2279
+ debug(conf, 'Number of items scrolled backward: ' + opts.prev.items);
2280
+ }
2281
+ if (opts.next.button)
2282
+ {
2283
+ debug(conf, 'Number of items scrolled forward: ' + opts.next.items);
2284
+ }
2285
+ return conf.debug;
2286
+ });
2287
+
2288
+
2289
+ // triggerEvent, making prefixed and namespaced events accessible from outside
2290
+ $cfs.bind('_cfs_triggerEvent', function(e, n, o) {
2291
+ e.stopPropagation();
2292
+ return $cfs.triggerHandler(cf_e(n, conf), o);
2293
+ });
2294
+ }; // /bind_events
2295
+
2296
+
2297
+ FN._unbind_events = function() {
2298
+ $cfs.unbind(cf_e('', conf));
2299
+ $cfs.unbind(cf_e('', conf, false));
2300
+ $cfs.unbind('_cfs_triggerEvent');
2301
+ }; // /unbind_events
2302
+
2303
+
2304
+ FN._bind_buttons = function() {
2305
+ FN._unbind_buttons();
2306
+ nv_showNavi(opts, itms.total, conf);
2307
+ nv_enableNavi(opts, itms.first, conf);
2308
+
2309
+ if (opts.auto.pauseOnHover)
2310
+ {
2311
+ var pC = bt_pauseOnHoverConfig(opts.auto.pauseOnHover);
2312
+ $wrp.bind(cf_e('mouseenter', conf, false), function() { $cfs.trigger(cf_e('pause', conf), pC); })
2313
+ .bind(cf_e('mouseleave', conf, false), function() { $cfs.trigger(cf_e('resume', conf)); });
2314
+ }
2315
+
2316
+ // play button
2317
+ if (opts.auto.button)
2318
+ {
2319
+ opts.auto.button.bind(cf_e(opts.auto.event, conf, false), function(e) {
2320
+ e.preventDefault();
2321
+ var ev = false,
2322
+ pC = null;
2323
+
2324
+ if (crsl.isPaused)
2325
+ {
2326
+ ev = 'play';
2327
+ }
2328
+ else if (opts.auto.pauseOnEvent)
2329
+ {
2330
+ ev = 'pause';
2331
+ pC = bt_pauseOnHoverConfig(opts.auto.pauseOnEvent);
2332
+ }
2333
+ if (ev)
2334
+ {
2335
+ $cfs.trigger(cf_e(ev, conf), pC);
2336
+ }
2337
+ });
2338
+ }
2339
+
2340
+ // prev button
2341
+ if (opts.prev.button)
2342
+ {
2343
+ opts.prev.button.bind(cf_e(opts.prev.event, conf, false), function(e) {
2344
+ e.preventDefault();
2345
+ $cfs.trigger(cf_e('prev', conf));
2346
+ });
2347
+ if (opts.prev.pauseOnHover)
2348
+ {
2349
+ var pC = bt_pauseOnHoverConfig(opts.prev.pauseOnHover);
2350
+ opts.prev.button.bind(cf_e('mouseenter', conf, false), function() { $cfs.trigger(cf_e('pause', conf), pC); })
2351
+ .bind(cf_e('mouseleave', conf, false), function() { $cfs.trigger(cf_e('resume', conf)); });
2352
+ }
2353
+ }
2354
+
2355
+ // next butotn
2356
+ if (opts.next.button)
2357
+ {
2358
+ opts.next.button.bind(cf_e(opts.next.event, conf, false), function(e) {
2359
+ e.preventDefault();
2360
+ $cfs.trigger(cf_e('next', conf));
2361
+ });
2362
+ if (opts.next.pauseOnHover)
2363
+ {
2364
+ var pC = bt_pauseOnHoverConfig(opts.next.pauseOnHover);
2365
+ opts.next.button.bind(cf_e('mouseenter', conf, false), function() { $cfs.trigger(cf_e('pause', conf), pC); })
2366
+ .bind(cf_e('mouseleave', conf, false), function() { $cfs.trigger(cf_e('resume', conf)); });
2367
+ }
2368
+ }
2369
+
2370
+ // pagination
2371
+ if (opts.pagination.container)
2372
+ {
2373
+ if (opts.pagination.pauseOnHover)
2374
+ {
2375
+ var pC = bt_pauseOnHoverConfig(opts.pagination.pauseOnHover);
2376
+ opts.pagination.container.bind(cf_e('mouseenter', conf, false), function() { $cfs.trigger(cf_e('pause', conf), pC); })
2377
+ .bind(cf_e('mouseleave', conf, false), function() { $cfs.trigger(cf_e('resume', conf)); });
2378
+ }
2379
+ }
2380
+
2381
+ // prev/next keys
2382
+ if (opts.prev.key || opts.next.key)
2383
+ {
2384
+ $(document).bind(cf_e('keyup', conf, false, true, true), function(e) {
2385
+ var k = e.keyCode;
2386
+ if (k == opts.next.key)
2387
+ {
2388
+ e.preventDefault();
2389
+ $cfs.trigger(cf_e('next', conf));
2390
+ }
2391
+ if (k == opts.prev.key)
2392
+ {
2393
+ e.preventDefault();
2394
+ $cfs.trigger(cf_e('prev', conf));
2395
+ }
2396
+ });
2397
+ }
2398
+
2399
+ // pagination keys
2400
+ if (opts.pagination.keys)
2401
+ {
2402
+ $(document).bind(cf_e('keyup', conf, false, true, true), function(e) {
2403
+ var k = e.keyCode;
2404
+ if (k >= 49 && k < 58)
2405
+ {
2406
+ k = (k-49) * opts.items.visible;
2407
+ if (k <= itms.total)
2408
+ {
2409
+ e.preventDefault();
2410
+ $cfs.trigger(cf_e('slideTo', conf), [k, 0, true, opts.pagination]);
2411
+ }
2412
+ }
2413
+ });
2414
+ }
2415
+
2416
+ // swipe
2417
+ if ($.fn.swipe)
2418
+ {
2419
+ var isTouch = 'ontouchstart' in window;
2420
+ if ((isTouch && opts.swipe.onTouch) || (!isTouch && opts.swipe.onMouse))
2421
+ {
2422
+ var scP = $.extend(true, {}, opts.prev, opts.swipe),
2423
+ scN = $.extend(true, {}, opts.next, opts.swipe),
2424
+ swP = function() { $cfs.trigger(cf_e('prev', conf), [scP]) },
2425
+ swN = function() { $cfs.trigger(cf_e('next', conf), [scN]) };
2426
+
2427
+ switch (opts.direction)
2428
+ {
2429
+ case 'up':
2430
+ case 'down':
2431
+ opts.swipe.options.swipeUp = swN;
2432
+ opts.swipe.options.swipeDown = swP;
2433
+ break;
2434
+ default:
2435
+ opts.swipe.options.swipeLeft = swN;
2436
+ opts.swipe.options.swipeRight = swP;
2437
+ }
2438
+ if (crsl.swipe)
2439
+ {
2440
+ $cfs.swipe('destroy');
2441
+ }
2442
+ $wrp.swipe(opts.swipe.options);
2443
+ $wrp.css('cursor', 'move');
2444
+ crsl.swipe = true;
2445
+ }
2446
+ }
2447
+
2448
+ // mousewheel
2449
+ if ($.fn.mousewheel)
2450
+ {
2451
+
2452
+ if (opts.mousewheel)
2453
+ {
2454
+ var mcP = $.extend(true, {}, opts.prev, opts.mousewheel),
2455
+ mcN = $.extend(true, {}, opts.next, opts.mousewheel);
2456
+
2457
+ if (crsl.mousewheel)
2458
+ {
2459
+ $wrp.unbind(cf_e('mousewheel', conf, false));
2460
+ }
2461
+ $wrp.bind(cf_e('mousewheel', conf, false), function(e, delta) {
2462
+ e.preventDefault();
2463
+ if (delta > 0)
2464
+ {
2465
+ $cfs.trigger(cf_e('prev', conf), [mcP]);
2466
+ }
2467
+ else
2468
+ {
2469
+ $cfs.trigger(cf_e('next', conf), [mcN]);
2470
+ }
2471
+ });
2472
+ crsl.mousewheel = true;
2473
+ }
2474
+ }
2475
+
2476
+ if (opts.auto.play)
2477
+ {
2478
+ $cfs.trigger(cf_e('play', conf), opts.auto.delay);
2479
+ }
2480
+
2481
+ if (crsl.upDateOnWindowResize)
2482
+ {
2483
+ var resizeFn = function(e) {
2484
+ $cfs.trigger(cf_e('finish', conf));
2485
+ if (opts.auto.pauseOnResize && !crsl.isPaused)
2486
+ {
2487
+ $cfs.trigger(cf_e('play', conf));
2488
+ }
2489
+ sz_resetMargin($cfs.children(), opts);
2490
+ $cfs.trigger(cf_e('updateSizes', conf));
2491
+ };
2492
+
2493
+ var $w = $(window),
2494
+ onResize = null;
2495
+
2496
+ if ($.debounce && conf.onWindowResize == 'debounce')
2497
+ {
2498
+ onResize = $.debounce(200, resizeFn);
2499
+ }
2500
+ else if ($.throttle && conf.onWindowResize == 'throttle')
2501
+ {
2502
+ onResize = $.throttle(300, resizeFn);
2503
+ }
2504
+ else
2505
+ {
2506
+ var _windowWidth = 0,
2507
+ _windowHeight = 0;
2508
+
2509
+ onResize = function() {
2510
+ var nw = $w.width(),
2511
+ nh = $w.height();
2512
+
2513
+ if (nw != _windowWidth || nh != _windowHeight)
2514
+ {
2515
+ resizeFn();
2516
+ _windowWidth = nw;
2517
+ _windowHeight = nh;
2518
+ }
2519
+ };
2520
+ }
2521
+ $w.bind(cf_e('resize', conf, false, true, true), onResize);
2522
+ }
2523
+ }; // /bind_buttons
2524
+
2525
+
2526
+ FN._unbind_buttons = function() {
2527
+ var ns1 = cf_e('', conf),
2528
+ ns2 = cf_e('', conf, false);
2529
+ ns3 = cf_e('', conf, false, true, true);
2530
+
2531
+ $(document).unbind(ns3);
2532
+ $(window).unbind(ns3);
2533
+ $wrp.unbind(ns2);
2534
+
2535
+ if (opts.auto.button)
2536
+ {
2537
+ opts.auto.button.unbind(ns2);
2538
+ }
2539
+ if (opts.prev.button)
2540
+ {
2541
+ opts.prev.button.unbind(ns2);
2542
+ }
2543
+ if (opts.next.button)
2544
+ {
2545
+ opts.next.button.unbind(ns2);
2546
+ }
2547
+ if (opts.pagination.container)
2548
+ {
2549
+ opts.pagination.container.unbind(ns2);
2550
+ if (opts.pagination.anchorBuilder)
2551
+ {
2552
+ opts.pagination.container.children().remove();
2553
+ }
2554
+ }
2555
+ if (crsl.swipe)
2556
+ {
2557
+ $cfs.swipe('destroy');
2558
+ $wrp.css('cursor', 'default');
2559
+ crsl.swipe = false;
2560
+ }
2561
+ if (crsl.mousewheel)
2562
+ {
2563
+ crsl.mousewheel = false;
2564
+ }
2565
+
2566
+ nv_showNavi(opts, 'hide', conf);
2567
+ nv_enableNavi(opts, 'removeClass', conf);
2568
+
2569
+ }; // /unbind_buttons
2570
+
2571
+
2572
+
2573
+ // START
2574
+
2575
+ if (is_boolean(configs))
2576
+ {
2577
+ configs = {
2578
+ 'debug': configs
2579
+ };
2580
+ }
2581
+
2582
+ // set vars
2583
+ var crsl = {
2584
+ 'direction' : 'next',
2585
+ 'isPaused' : true,
2586
+ 'isScrolling' : false,
2587
+ 'isStopped' : false,
2588
+ 'mousewheel' : false,
2589
+ 'swipe' : false
2590
+ },
2591
+ itms = {
2592
+ 'total' : $cfs.children().length,
2593
+ 'first' : 0
2594
+ },
2595
+ tmrs = {
2596
+ 'auto' : null,
2597
+ 'progress' : null,
2598
+ 'startTime' : getTime(),
2599
+ 'timePassed' : 0
2600
+ },
2601
+ scrl = {
2602
+ 'isStopped' : false,
2603
+ 'duration' : 0,
2604
+ 'startTime' : 0,
2605
+ 'easing' : '',
2606
+ 'anims' : []
2607
+ },
2608
+ clbk = {
2609
+ 'onBefore' : [],
2610
+ 'onAfter' : []
2611
+ },
2612
+ queu = [],
2613
+ conf = $.extend(true, {}, $.fn.carouFredSel.configs, configs),
2614
+ opts = {},
2615
+ opts_orig = $.extend(true, {}, options),
2616
+ $wrp = (conf.wrapper == 'parent')
2617
+ ? $cfs.parent()
2618
+ : $cfs.wrap('<'+conf.wrapper.element+' class="'+conf.wrapper.classname+'" />').parent();
2619
+
2620
+
2621
+ conf.selector = $cfs.selector;
2622
+ conf.serialNumber = $.fn.carouFredSel.serialNumber++;
2623
+
2624
+ conf.transition = (conf.transition && $.fn.transition) ? 'transition' : 'animate';
2625
+
2626
+ // create carousel
2627
+ FN._init(opts_orig, true, starting_position);
2628
+ FN._build();
2629
+ FN._bind_events();
2630
+ FN._bind_buttons();
2631
+
2632
+ // find item to start
2633
+ if (is_array(opts.items.start))
2634
+ {
2635
+ var start_arr = opts.items.start;
2636
+ }
2637
+ else
2638
+ {
2639
+ var start_arr = [];
2640
+ if (opts.items.start != 0)
2641
+ {
2642
+ start_arr.push(opts.items.start);
2643
+ }
2644
+ }
2645
+ if (opts.cookie)
2646
+ {
2647
+ start_arr.unshift(parseInt(cf_getCookie(opts.cookie), 10));
2648
+ }
2649
+
2650
+ if (start_arr.length > 0)
2651
+ {
2652
+ for (var a = 0, l = start_arr.length; a < l; a++)
2653
+ {
2654
+ var s = start_arr[a];
2655
+ if (s == 0)
2656
+ {
2657
+ continue;
2658
+ }
2659
+ if (s === true)
2660
+ {
2661
+ s = window.location.hash;
2662
+ if (s.length < 1)
2663
+ {
2664
+ continue;
2665
+ }
2666
+ }
2667
+ else if (s === 'random')
2668
+ {
2669
+ s = Math.floor(Math.random()*itms.total);
2670
+ }
2671
+ if ($cfs.triggerHandler(cf_e('slideTo', conf), [s, 0, true, { fx: 'none' }]))
2672
+ {
2673
+ break;
2674
+ }
2675
+ }
2676
+ }
2677
+ var siz = sz_setSizes($cfs, opts),
2678
+ itm = gi_getCurrentItems($cfs.children(), opts);
2679
+
2680
+ if (opts.onCreate)
2681
+ {
2682
+ opts.onCreate.call($tt0, {
2683
+ 'width': siz.width,
2684
+ 'height': siz.height,
2685
+ 'items': itm
2686
+ });
2687
+ }
2688
+
2689
+ $cfs.trigger(cf_e('updatePageStatus', conf), [true, siz]);
2690
+ $cfs.trigger(cf_e('linkAnchors', conf));
2691
+
2692
+ if (conf.debug)
2693
+ {
2694
+ $cfs.trigger(cf_e('debug', conf));
2695
+ }
2696
+
2697
+ return $cfs;
2698
+ };
2699
+
2700
+
2701
+
2702
+ // GLOBAL PUBLIC
2703
+
2704
+ $.fn.carouFredSel.serialNumber = 1;
2705
+ $.fn.carouFredSel.defaults = {
2706
+ 'synchronise' : false,
2707
+ 'infinite' : true,
2708
+ 'circular' : true,
2709
+ 'responsive' : false,
2710
+ 'direction' : 'left',
2711
+ 'items' : {
2712
+ 'start' : 0
2713
+ },
2714
+ 'scroll' : {
2715
+ 'easing' : 'swing',
2716
+ 'duration' : 500,
2717
+ 'pauseOnHover' : false,
2718
+ 'event' : 'click',
2719
+ 'queue' : false
2720
+ }
2721
+ };
2722
+ $.fn.carouFredSel.configs = {
2723
+ 'debug' : false,
2724
+ 'transition' : false,
2725
+ 'onWindowResize': 'throttle',
2726
+ 'events' : {
2727
+ 'prefix' : '',
2728
+ 'namespace' : 'cfs'
2729
+ },
2730
+ 'wrapper' : {
2731
+ 'element' : 'div',
2732
+ 'classname' : 'caroufredsel_wrapper'
2733
+ },
2734
+ 'classnames' : {}
2735
+ };
2736
+ $.fn.carouFredSel.pageAnchorBuilder = function(nr) {
2737
+ return '<a href="#"><span>'+nr+'</span></a>';
2738
+ };
2739
+ $.fn.carouFredSel.progressbarUpdater = function(perc) {
2740
+ $(this).css('width', perc+'%');
2741
+ };
2742
+
2743
+ $.fn.carouFredSel.cookie = {
2744
+ get: function(n) {
2745
+ n += '=';
2746
+ var ca = document.cookie.split(';');
2747
+ for (var a = 0, l = ca.length; a < l; a++)
2748
+ {
2749
+ var c = ca[a];
2750
+ while (c.charAt(0) == ' ')
2751
+ {
2752
+ c = c.slice(1);
2753
+ }
2754
+ if (c.indexOf(n) == 0)
2755
+ {
2756
+ return c.slice(n.length);
2757
+ }
2758
+ }
2759
+ return 0;
2760
+ },
2761
+ set: function(n, v, d) {
2762
+ var e = "";
2763
+ if (d)
2764
+ {
2765
+ var date = new Date();
2766
+ date.setTime(date.getTime() + (d * 24 * 60 * 60 * 1000));
2767
+ e = "; expires=" + date.toGMTString();
2768
+ }
2769
+ document.cookie = n + '=' + v + e + '; path=/';
2770
+ },
2771
+ remove: function(n) {
2772
+ $.fn.carouFredSel.cookie.set(n, "", -1);
2773
+ }
2774
+ };
2775
+
2776
+
2777
+ // GLOBAL PRIVATE
2778
+
2779
+ // scrolling functions
2780
+ function sc_setScroll(d, e, c) {
2781
+ if (c.transition == 'transition')
2782
+ {
2783
+ if (e == 'swing')
2784
+ {
2785
+ e = 'ease';
2786
+ }
2787
+ }
2788
+ return {
2789
+ anims: [],
2790
+ duration: d,
2791
+ orgDuration: d,
2792
+ easing: e,
2793
+ startTime: getTime()
2794
+ };
2795
+ }
2796
+ function sc_startScroll(s, c) {
2797
+ for (var a = 0, l = s.anims.length; a < l; a++)
2798
+ {
2799
+ var b = s.anims[a];
2800
+ if (!b)
2801
+ {
2802
+ continue;
2803
+ }
2804
+ b[0][c.transition](b[1], s.duration, s.easing, b[2]);
2805
+ }
2806
+ }
2807
+ function sc_stopScroll(s, finish) {
2808
+ if (!is_boolean(finish))
2809
+ {
2810
+ finish = true;
2811
+ }
2812
+ if (is_object(s.pre))
2813
+ {
2814
+ sc_stopScroll(s.pre, finish);
2815
+ }
2816
+ for (var a = 0, l = s.anims.length; a < l; a++)
2817
+ {
2818
+ var b = s.anims[a];
2819
+ b[0].stop(true);
2820
+ if (finish)
2821
+ {
2822
+ b[0].css(b[1]);
2823
+ if (is_function(b[2]))
2824
+ {
2825
+ b[2]();
2826
+ }
2827
+ }
2828
+ }
2829
+ if (is_object(s.post))
2830
+ {
2831
+ sc_stopScroll(s.post, finish);
2832
+ }
2833
+ }
2834
+ function sc_afterScroll( $c, $c2, o ) {
2835
+ if ($c2)
2836
+ {
2837
+ $c2.remove();
2838
+ }
2839
+
2840
+ switch(o.fx) {
2841
+ case 'fade':
2842
+ case 'crossfade':
2843
+ case 'cover-fade':
2844
+ case 'uncover-fade':
2845
+ $c.css('opacity', 1);
2846
+ $c.css('filter', '');
2847
+ break;
2848
+ }
2849
+ }
2850
+ function sc_fireCallbacks($t, o, b, a, c) {
2851
+ if (o[b])
2852
+ {
2853
+ o[b].call($t, a);
2854
+ }
2855
+ if (c[b].length)
2856
+ {
2857
+ for (var i = 0, l = c[b].length; i < l; i++)
2858
+ {
2859
+ c[b][i].call($t, a);
2860
+ }
2861
+ }
2862
+ return [];
2863
+ }
2864
+ function sc_fireQueue($c, q, c) {
2865
+
2866
+ if (q.length)
2867
+ {
2868
+ $c.trigger(cf_e(q[0][0], c), q[0][1]);
2869
+ q.shift();
2870
+ }
2871
+ return q;
2872
+ }
2873
+ function sc_hideHiddenItems(hiddenitems) {
2874
+ hiddenitems.each(function() {
2875
+ var hi = $(this);
2876
+ hi.data('_cfs_isHidden', hi.is(':hidden')).hide();
2877
+ });
2878
+ }
2879
+ function sc_showHiddenItems(hiddenitems) {
2880
+ if (hiddenitems)
2881
+ {
2882
+ hiddenitems.each(function() {
2883
+ var hi = $(this);
2884
+ if (!hi.data('_cfs_isHidden'))
2885
+ {
2886
+ hi.show();
2887
+ }
2888
+ });
2889
+ }
2890
+ }
2891
+ function sc_clearTimers(t) {
2892
+ if (t.auto)
2893
+ {
2894
+ clearTimeout(t.auto);
2895
+ }
2896
+ if (t.progress)
2897
+ {
2898
+ clearInterval(t.progress);
2899
+ }
2900
+ return t;
2901
+ }
2902
+ function sc_mapCallbackArguments(i_old, i_skp, i_new, s_itm, s_dir, s_dur, w_siz) {
2903
+ return {
2904
+ 'width': w_siz.width,
2905
+ 'height': w_siz.height,
2906
+ 'items': {
2907
+ 'old': i_old,
2908
+ 'skipped': i_skp,
2909
+ 'visible': i_new
2910
+ },
2911
+ 'scroll': {
2912
+ 'items': s_itm,
2913
+ 'direction': s_dir,
2914
+ 'duration': s_dur
2915
+ }
2916
+ };
2917
+ }
2918
+ function sc_getDuration( sO, o, nI, siz ) {
2919
+ var dur = sO.duration;
2920
+ if (sO.fx == 'none')
2921
+ {
2922
+ return 0;
2923
+ }
2924
+ if (dur == 'auto')
2925
+ {
2926
+ dur = o.scroll.duration / o.scroll.items * nI;
2927
+ }
2928
+ else if (dur < 10)
2929
+ {
2930
+ dur = siz / dur;
2931
+ }
2932
+ if (dur < 1)
2933
+ {
2934
+ return 0;
2935
+ }
2936
+ if (sO.fx == 'fade')
2937
+ {
2938
+ dur = dur / 2;
2939
+ }
2940
+ return Math.round(dur);
2941
+ }
2942
+
2943
+ // navigation functions
2944
+ function nv_showNavi(o, t, c) {
2945
+ var minimum = (is_number(o.items.minimum)) ? o.items.minimum : o.items.visible + 1;
2946
+ if (t == 'show' || t == 'hide')
2947
+ {
2948
+ var f = t;
2949
+ }
2950
+ else if (minimum > t)
2951
+ {
2952
+ debug(c, 'Not enough items ('+t+' total, '+minimum+' needed): Hiding navigation.');
2953
+ var f = 'hide';
2954
+ }
2955
+ else
2956
+ {
2957
+ var f = 'show';
2958
+ }
2959
+ var s = (f == 'show') ? 'removeClass' : 'addClass',
2960
+ h = cf_c('hidden', c);
2961
+
2962
+ if (o.auto.button)
2963
+ {
2964
+ o.auto.button[f]()[s](h);
2965
+ }
2966
+ if (o.prev.button)
2967
+ {
2968
+ o.prev.button[f]()[s](h);
2969
+ }
2970
+ if (o.next.button)
2971
+ {
2972
+ o.next.button[f]()[s](h);
2973
+ }
2974
+ if (o.pagination.container)
2975
+ {
2976
+ o.pagination.container[f]()[s](h);
2977
+ }
2978
+ }
2979
+ function nv_enableNavi(o, f, c) {
2980
+ if (o.circular || o.infinite) return;
2981
+ var fx = (f == 'removeClass' || f == 'addClass') ? f : false,
2982
+ di = cf_c('disabled', c);
2983
+
2984
+ if (o.auto.button && fx)
2985
+ {
2986
+ o.auto.button[fx](di);
2987
+ }
2988
+ if (o.prev.button)
2989
+ {
2990
+ var fn = fx || (f == 0) ? 'addClass' : 'removeClass';
2991
+ o.prev.button[fn](di);
2992
+ }
2993
+ if (o.next.button)
2994
+ {
2995
+ var fn = fx || (f == o.items.visible) ? 'addClass' : 'removeClass';
2996
+ o.next.button[fn](di);
2997
+ }
2998
+ }
2999
+
3000
+ // get object functions
3001
+ function go_getObject($tt, obj) {
3002
+ if (is_function(obj))
3003
+ {
3004
+ obj = obj.call($tt);
3005
+ }
3006
+ else if (is_undefined(obj))
3007
+ {
3008
+ obj = {};
3009
+ }
3010
+ return obj;
3011
+ }
3012
+ function go_getItemsObject($tt, obj) {
3013
+ obj = go_getObject($tt, obj);
3014
+ if (is_number(obj))
3015
+ {
3016
+ obj = {
3017
+ 'visible': obj
3018
+ };
3019
+ }
3020
+ else if (obj == 'variable')
3021
+ {
3022
+ obj = {
3023
+ 'visible': obj,
3024
+ 'width': obj,
3025
+ 'height': obj
3026
+ };
3027
+ }
3028
+ else if (!is_object(obj))
3029
+ {
3030
+ obj = {};
3031
+ }
3032
+ return obj;
3033
+ }
3034
+ function go_getScrollObject($tt, obj) {
3035
+ obj = go_getObject($tt, obj);
3036
+ if (is_number(obj))
3037
+ {
3038
+ if (obj <= 50)
3039
+ {
3040
+ obj = {
3041
+ 'items': obj
3042
+ };
3043
+ }
3044
+ else
3045
+ {
3046
+ obj = {
3047
+ 'duration': obj
3048
+ };
3049
+ }
3050
+ }
3051
+ else if (is_string(obj))
3052
+ {
3053
+ obj = {
3054
+ 'easing': obj
3055
+ };
3056
+ }
3057
+ else if (!is_object(obj))
3058
+ {
3059
+ obj = {};
3060
+ }
3061
+ return obj;
3062
+ }
3063
+ function go_getNaviObject($tt, obj) {
3064
+ obj = go_getObject($tt, obj);
3065
+ if (is_string(obj))
3066
+ {
3067
+ var temp = cf_getKeyCode(obj);
3068
+ if (temp == -1)
3069
+ {
3070
+ obj = $(obj);
3071
+ }
3072
+ else
3073
+ {
3074
+ obj = temp;
3075
+ }
3076
+ }
3077
+ return obj;
3078
+ }
3079
+
3080
+ function go_getAutoObject($tt, obj) {
3081
+ obj = go_getNaviObject($tt, obj);
3082
+ if (is_jquery(obj))
3083
+ {
3084
+ obj = {
3085
+ 'button': obj
3086
+ };
3087
+ }
3088
+ else if (is_boolean(obj))
3089
+ {
3090
+ obj = {
3091
+ 'play': obj
3092
+ };
3093
+ }
3094
+ else if (is_number(obj))
3095
+ {
3096
+ obj = {
3097
+ 'timeoutDuration': obj
3098
+ };
3099
+ }
3100
+ if (obj.progress)
3101
+ {
3102
+ if (is_string(obj.progress) || is_jquery(obj.progress))
3103
+ {
3104
+ obj.progress = {
3105
+ 'bar': obj.progress
3106
+ };
3107
+ }
3108
+ }
3109
+ return obj;
3110
+ }
3111
+ function go_complementAutoObject($tt, obj) {
3112
+ if (is_function(obj.button))
3113
+ {
3114
+ obj.button = obj.button.call($tt);
3115
+ }
3116
+ if (is_string(obj.button))
3117
+ {
3118
+ obj.button = $(obj.button);
3119
+ }
3120
+ if (!is_boolean(obj.play))
3121
+ {
3122
+ obj.play = true;
3123
+ }
3124
+ if (!is_number(obj.delay))
3125
+ {
3126
+ obj.delay = 0;
3127
+ }
3128
+ if (is_undefined(obj.pauseOnEvent))
3129
+ {
3130
+ obj.pauseOnEvent = true;
3131
+ }
3132
+ if (!is_boolean(obj.pauseOnResize))
3133
+ {
3134
+ obj.pauseOnResize = true;
3135
+ }
3136
+ if (!is_number(obj.timeoutDuration))
3137
+ {
3138
+ obj.timeoutDuration = (obj.duration < 10)
3139
+ ? 2500
3140
+ : obj.duration * 5;
3141
+ }
3142
+ if (obj.progress)
3143
+ {
3144
+ if (is_function(obj.progress.bar))
3145
+ {
3146
+ obj.progress.bar = obj.progress.bar.call($tt);
3147
+ }
3148
+ if (is_string(obj.progress.bar))
3149
+ {
3150
+ obj.progress.bar = $(obj.progress.bar);
3151
+ }
3152
+ if (obj.progress.bar)
3153
+ {
3154
+ if (!is_function(obj.progress.updater))
3155
+ {
3156
+ obj.progress.updater = $.fn.carouFredSel.progressbarUpdater;
3157
+ }
3158
+ if (!is_number(obj.progress.interval))
3159
+ {
3160
+ obj.progress.interval = 50;
3161
+ }
3162
+ }
3163
+ else
3164
+ {
3165
+ obj.progress = false;
3166
+ }
3167
+ }
3168
+ return obj;
3169
+ }
3170
+
3171
+ function go_getPrevNextObject($tt, obj) {
3172
+ obj = go_getNaviObject($tt, obj);
3173
+ if (is_jquery(obj))
3174
+ {
3175
+ obj = {
3176
+ 'button': obj
3177
+ };
3178
+ }
3179
+ else if (is_number(obj))
3180
+ {
3181
+ obj = {
3182
+ 'key': obj
3183
+ };
3184
+ }
3185
+ return obj;
3186
+ }
3187
+ function go_complementPrevNextObject($tt, obj) {
3188
+ if (is_function(obj.button))
3189
+ {
3190
+ obj.button = obj.button.call($tt);
3191
+ }
3192
+ if (is_string(obj.button))
3193
+ {
3194
+ obj.button = $(obj.button);
3195
+ }
3196
+ if (is_string(obj.key))
3197
+ {
3198
+ obj.key = cf_getKeyCode(obj.key);
3199
+ }
3200
+ return obj;
3201
+ }
3202
+
3203
+ function go_getPaginationObject($tt, obj) {
3204
+ obj = go_getNaviObject($tt, obj);
3205
+ if (is_jquery(obj))
3206
+ {
3207
+ obj = {
3208
+ 'container': obj
3209
+ };
3210
+ }
3211
+ else if (is_boolean(obj))
3212
+ {
3213
+ obj = {
3214
+ 'keys': obj
3215
+ };
3216
+ }
3217
+ return obj;
3218
+ }
3219
+ function go_complementPaginationObject($tt, obj) {
3220
+ if (is_function(obj.container))
3221
+ {
3222
+ obj.container = obj.container.call($tt);
3223
+ }
3224
+ if (is_string(obj.container))
3225
+ {
3226
+ obj.container = $(obj.container);
3227
+ }
3228
+ if (!is_number(obj.items))
3229
+ {
3230
+ obj.items = false;
3231
+ }
3232
+ if (!is_boolean(obj.keys))
3233
+ {
3234
+ obj.keys = false;
3235
+ }
3236
+ if (!is_function(obj.anchorBuilder) && !is_false(obj.anchorBuilder))
3237
+ {
3238
+ obj.anchorBuilder = $.fn.carouFredSel.pageAnchorBuilder;
3239
+ }
3240
+ if (!is_number(obj.deviation))
3241
+ {
3242
+ obj.deviation = 0;
3243
+ }
3244
+ return obj;
3245
+ }
3246
+
3247
+ function go_getSwipeObject($tt, obj) {
3248
+ if (is_function(obj))
3249
+ {
3250
+ obj = obj.call($tt);
3251
+ }
3252
+ if (is_undefined(obj))
3253
+ {
3254
+ obj = {
3255
+ 'onTouch': false
3256
+ };
3257
+ }
3258
+ if (is_true(obj))
3259
+ {
3260
+ obj = {
3261
+ 'onTouch': obj
3262
+ };
3263
+ }
3264
+ else if (is_number(obj))
3265
+ {
3266
+ obj = {
3267
+ 'items': obj
3268
+ };
3269
+ }
3270
+ return obj;
3271
+ }
3272
+ function go_complementSwipeObject($tt, obj) {
3273
+ if (!is_boolean(obj.onTouch))
3274
+ {
3275
+ obj.onTouch = true;
3276
+ }
3277
+ if (!is_boolean(obj.onMouse))
3278
+ {
3279
+ obj.onMouse = false;
3280
+ }
3281
+ if (!is_object(obj.options))
3282
+ {
3283
+ obj.options = {};
3284
+ }
3285
+ if (!is_boolean(obj.options.triggerOnTouchEnd))
3286
+ {
3287
+ obj.options.triggerOnTouchEnd = false;
3288
+ }
3289
+ return obj;
3290
+ }
3291
+ function go_getMousewheelObject($tt, obj) {
3292
+ if (is_function(obj))
3293
+ {
3294
+ obj = obj.call($tt);
3295
+ }
3296
+ if (is_true(obj))
3297
+ {
3298
+ obj = {};
3299
+ }
3300
+ else if (is_number(obj))
3301
+ {
3302
+ obj = {
3303
+ 'items': obj
3304
+ };
3305
+ }
3306
+ else if (is_undefined(obj))
3307
+ {
3308
+ obj = false;
3309
+ }
3310
+ return obj;
3311
+ }
3312
+ function go_complementMousewheelObject($tt, obj) {
3313
+ return obj;
3314
+ }
3315
+
3316
+ // get number functions
3317
+ function gn_getItemIndex(num, dev, org, items, $cfs) {
3318
+ if (is_string(num))
3319
+ {
3320
+ num = $(num, $cfs);
3321
+ }
3322
+
3323
+ if (is_object(num))
3324
+ {
3325
+ num = $(num, $cfs);
3326
+ }
3327
+ if (is_jquery(num))
3328
+ {
3329
+ num = $cfs.children().index(num);
3330
+ if (!is_boolean(org))
3331
+ {
3332
+ org = false;
3333
+ }
3334
+ }
3335
+ else
3336
+ {
3337
+ if (!is_boolean(org))
3338
+ {
3339
+ org = true;
3340
+ }
3341
+ }
3342
+ if (!is_number(num))
3343
+ {
3344
+ num = 0;
3345
+ }
3346
+ if (!is_number(dev))
3347
+ {
3348
+ dev = 0;
3349
+ }
3350
+
3351
+ if (org)
3352
+ {
3353
+ num += items.first;
3354
+ }
3355
+ num += dev;
3356
+ if (items.total > 0)
3357
+ {
3358
+ while (num >= items.total)
3359
+ {
3360
+ num -= items.total;
3361
+ }
3362
+ while (num < 0)
3363
+ {
3364
+ num += items.total;
3365
+ }
3366
+ }
3367
+ return num;
3368
+ }
3369
+
3370
+ // items prev
3371
+ function gn_getVisibleItemsPrev(i, o, s) {
3372
+ var t = 0,
3373
+ x = 0;
3374
+
3375
+ for (var a = s; a >= 0; a--)
3376
+ {
3377
+ var j = i.eq(a);
3378
+ t += (j.is(':visible')) ? j[o.d['outerWidth']](true) : 0;
3379
+ if (t > o.maxDimension)
3380
+ {
3381
+ return x;
3382
+ }
3383
+ if (a == 0)
3384
+ {
3385
+ a = i.length;
3386
+ }
3387
+ x++;
3388
+ }
3389
+ }
3390
+ function gn_getVisibleItemsPrevFilter(i, o, s) {
3391
+ return gn_getItemsPrevFilter(i, o.items.filter, o.items.visibleConf.org, s);
3392
+ }
3393
+ function gn_getScrollItemsPrevFilter(i, o, s, m) {
3394
+ return gn_getItemsPrevFilter(i, o.items.filter, m, s);
3395
+ }
3396
+ function gn_getItemsPrevFilter(i, f, m, s) {
3397
+ var t = 0,
3398
+ x = 0;
3399
+
3400
+ for (var a = s, l = i.length; a >= 0; a--)
3401
+ {
3402
+ x++;
3403
+ if (x == l)
3404
+ {
3405
+ return x;
3406
+ }
3407
+
3408
+ var j = i.eq(a);
3409
+ if (j.is(f))
3410
+ {
3411
+ t++;
3412
+ if (t == m)
3413
+ {
3414
+ return x;
3415
+ }
3416
+ }
3417
+ if (a == 0)
3418
+ {
3419
+ a = l;
3420
+ }
3421
+ }
3422
+ }
3423
+
3424
+ function gn_getVisibleOrg($c, o) {
3425
+ return o.items.visibleConf.org || $c.children().slice(0, o.items.visible).filter(o.items.filter).length;
3426
+ }
3427
+
3428
+ // items next
3429
+ function gn_getVisibleItemsNext(i, o, s) {
3430
+ var t = 0,
3431
+ x = 0;
3432
+
3433
+ for (var a = s, l = i.length-1; a <= l; a++)
3434
+ {
3435
+ var j = i.eq(a);
3436
+
3437
+ t += (j.is(':visible')) ? j[o.d['outerWidth']](true) : 0;
3438
+ if (t > o.maxDimension)
3439
+ {
3440
+ return x;
3441
+ }
3442
+
3443
+ x++;
3444
+ if (x == l+1)
3445
+ {
3446
+ return x;
3447
+ }
3448
+ if (a == l)
3449
+ {
3450
+ a = -1;
3451
+ }
3452
+ }
3453
+ }
3454
+ function gn_getVisibleItemsNextTestCircular(i, o, s, l) {
3455
+ var v = gn_getVisibleItemsNext(i, o, s);
3456
+ if (!o.circular)
3457
+ {
3458
+ if (s + v > l)
3459
+ {
3460
+ v = l - s;
3461
+ }
3462
+ }
3463
+ return v;
3464
+ }
3465
+ function gn_getVisibleItemsNextFilter(i, o, s) {
3466
+ return gn_getItemsNextFilter(i, o.items.filter, o.items.visibleConf.org, s, o.circular);
3467
+ }
3468
+ function gn_getScrollItemsNextFilter(i, o, s, m) {
3469
+ return gn_getItemsNextFilter(i, o.items.filter, m+1, s, o.circular) - 1;
3470
+ }
3471
+ function gn_getItemsNextFilter(i, f, m, s, c) {
3472
+ var t = 0,
3473
+ x = 0;
3474
+
3475
+ for (var a = s, l = i.length-1; a <= l; a++)
3476
+ {
3477
+ x++;
3478
+ if (x >= l)
3479
+ {
3480
+ return x;
3481
+ }
3482
+
3483
+ var j = i.eq(a);
3484
+ if (j.is(f))
3485
+ {
3486
+ t++;
3487
+ if (t == m)
3488
+ {
3489
+ return x;
3490
+ }
3491
+ }
3492
+ if (a == l)
3493
+ {
3494
+ a = -1;
3495
+ }
3496
+ }
3497
+ }
3498
+
3499
+ // get items functions
3500
+ function gi_getCurrentItems(i, o) {
3501
+ return i.slice(0, o.items.visible);
3502
+ }
3503
+ function gi_getOldItemsPrev(i, o, n) {
3504
+ return i.slice(n, o.items.visibleConf.old+n);
3505
+ }
3506
+ function gi_getNewItemsPrev(i, o) {
3507
+ return i.slice(0, o.items.visible);
3508
+ }
3509
+ function gi_getOldItemsNext(i, o) {
3510
+ return i.slice(0, o.items.visibleConf.old);
3511
+ }
3512
+ function gi_getNewItemsNext(i, o, n) {
3513
+ return i.slice(n, o.items.visible+n);
3514
+ }
3515
+
3516
+ // sizes functions
3517
+ function sz_storeMargin(i, o, d) {
3518
+ if (o.usePadding)
3519
+ {
3520
+ if (!is_string(d))
3521
+ {
3522
+ d = '_cfs_origCssMargin';
3523
+ }
3524
+ i.each(function() {
3525
+ var j = $(this),
3526
+ m = parseInt(j.css(o.d['marginRight']), 10);
3527
+ if (!is_number(m))
3528
+ {
3529
+ m = 0;
3530
+ }
3531
+ j.data(d, m);
3532
+ });
3533
+ }
3534
+ }
3535
+ function sz_resetMargin(i, o, m) {
3536
+ if (o.usePadding)
3537
+ {
3538
+ var x = (is_boolean(m)) ? m : false;
3539
+ if (!is_number(m))
3540
+ {
3541
+ m = 0;
3542
+ }
3543
+ sz_storeMargin(i, o, '_cfs_tempCssMargin');
3544
+ i.each(function() {
3545
+ var j = $(this);
3546
+ j.css(o.d['marginRight'], ((x) ? j.data('_cfs_tempCssMargin') : m + j.data('_cfs_origCssMargin')));
3547
+ });
3548
+ }
3549
+ }
3550
+ function sz_storeOrigCss(i) {
3551
+ i.each(function() {
3552
+ var j = $(this);
3553
+ j.data('_cfs_origCss', j.attr('style') || '');
3554
+ });
3555
+ }
3556
+ function sz_restoreOrigCss(i) {
3557
+ i.each(function() {
3558
+ var j = $(this);
3559
+ j.attr('style', j.data('_cfs_origCss') || '');
3560
+ });
3561
+ }
3562
+ function sz_setResponsiveSizes(o, all) {
3563
+ var visb = o.items.visible,
3564
+ newS = o.items[o.d['width']],
3565
+ seco = o[o.d['height']],
3566
+ secp = is_percentage(seco);
3567
+
3568
+ all.each(function() {
3569
+ var $t = $(this),
3570
+ nw = newS - ms_getPaddingBorderMargin($t, o, 'Width');
3571
+
3572
+ $t[o.d['width']](nw);
3573
+ if (secp)
3574
+ {
3575
+ $t[o.d['height']](ms_getPercentage(nw, seco));
3576
+ }
3577
+ });
3578
+ }
3579
+ function sz_setSizes($c, o) {
3580
+ var $w = $c.parent(),
3581
+ $i = $c.children(),
3582
+ $v = gi_getCurrentItems($i, o),
3583
+ sz = cf_mapWrapperSizes(ms_getSizes($v, o, true), o, false);
3584
+
3585
+ $w.css(sz);
3586
+
3587
+ if (o.usePadding)
3588
+ {
3589
+ var p = o.padding,
3590
+ r = p[o.d[1]];
3591
+
3592
+ if (o.align && r < 0)
3593
+ {
3594
+ r = 0;
3595
+ }
3596
+ var $l = $v.last();
3597
+ $l.css(o.d['marginRight'], $l.data('_cfs_origCssMargin') + r);
3598
+ $c.css(o.d['top'], p[o.d[0]]);
3599
+ $c.css(o.d['left'], p[o.d[3]]);
3600
+ }
3601
+
3602
+ $c.css(o.d['width'], sz[o.d['width']]+(ms_getTotalSize($i, o, 'width')*2));
3603
+ $c.css(o.d['height'], ms_getLargestSize($i, o, 'height'));
3604
+ return sz;
3605
+ }
3606
+
3607
+ // measuring functions
3608
+ function ms_getSizes(i, o, wrapper) {
3609
+ return [ms_getTotalSize(i, o, 'width', wrapper), ms_getLargestSize(i, o, 'height', wrapper)];
3610
+ }
3611
+ function ms_getLargestSize(i, o, dim, wrapper) {
3612
+ if (!is_boolean(wrapper))
3613
+ {
3614
+ wrapper = false;
3615
+ }
3616
+ if (is_number(o[o.d[dim]]) && wrapper)
3617
+ {
3618
+ return o[o.d[dim]];
3619
+ }
3620
+ if (is_number(o.items[o.d[dim]]))
3621
+ {
3622
+ return o.items[o.d[dim]];
3623
+ }
3624
+ dim = (dim.toLowerCase().indexOf('width') > -1) ? 'outerWidth' : 'outerHeight';
3625
+ return ms_getTrueLargestSize(i, o, dim);
3626
+ }
3627
+ function ms_getTrueLargestSize(i, o, dim) {
3628
+ var s = 0;
3629
+
3630
+ for (var a = 0, l = i.length; a < l; a++)
3631
+ {
3632
+ var j = i.eq(a);
3633
+
3634
+ var m = (j.is(':visible')) ? j[o.d[dim]](true) : 0;
3635
+ if (s < m)
3636
+ {
3637
+ s = m;
3638
+ }
3639
+ }
3640
+ return s;
3641
+ }
3642
+
3643
+ function ms_getTotalSize(i, o, dim, wrapper) {
3644
+ if (!is_boolean(wrapper))
3645
+ {
3646
+ wrapper = false;
3647
+ }
3648
+ if (is_number(o[o.d[dim]]) && wrapper)
3649
+ {
3650
+ return o[o.d[dim]];
3651
+ }
3652
+ if (is_number(o.items[o.d[dim]]))
3653
+ {
3654
+ return o.items[o.d[dim]] * i.length;
3655
+ }
3656
+
3657
+ var d = (dim.toLowerCase().indexOf('width') > -1) ? 'outerWidth' : 'outerHeight',
3658
+ s = 0;
3659
+
3660
+ for (var a = 0, l = i.length; a < l; a++)
3661
+ {
3662
+ var j = i.eq(a);
3663
+ s += (j.is(':visible')) ? j[o.d[d]](true) : 0;
3664
+ }
3665
+ return s;
3666
+ }
3667
+ function ms_getParentSize($w, o, d) {
3668
+ var isVisible = $w.is(':visible');
3669
+ if (isVisible)
3670
+ {
3671
+ $w.hide();
3672
+ }
3673
+ var s = $w.parent()[o.d[d]]();
3674
+ if (isVisible)
3675
+ {
3676
+ $w.show();
3677
+ }
3678
+ return s;
3679
+ }
3680
+ function ms_getMaxDimension(o, a) {
3681
+ return (is_number(o[o.d['width']])) ? o[o.d['width']] : a;
3682
+ }
3683
+ function ms_hasVariableSizes(i, o, dim) {
3684
+ var s = false,
3685
+ v = false;
3686
+
3687
+ for (var a = 0, l = i.length; a < l; a++)
3688
+ {
3689
+ var j = i.eq(a);
3690
+
3691
+ var c = (j.is(':visible')) ? j[o.d[dim]](true) : 0;
3692
+ if (s === false)
3693
+ {
3694
+ s = c;
3695
+ }
3696
+ else if (s != c)
3697
+ {
3698
+ v = true;
3699
+ }
3700
+ if (s == 0)
3701
+ {
3702
+ v = true;
3703
+ }
3704
+ }
3705
+ return v;
3706
+ }
3707
+ function ms_getPaddingBorderMargin(i, o, d) {
3708
+ return i[o.d['outer'+d]](true) - i[o.d[d.toLowerCase()]]();
3709
+ }
3710
+ function ms_getPercentage(s, o) {
3711
+ if (is_percentage(o))
3712
+ {
3713
+ o = parseInt( o.slice(0, -1), 10 );
3714
+ if (!is_number(o))
3715
+ {
3716
+ return s;
3717
+ }
3718
+ s *= o/100;
3719
+ }
3720
+ return s;
3721
+ }
3722
+
3723
+ // config functions
3724
+ function cf_e(n, c, pf, ns, rd) {
3725
+ if (!is_boolean(pf))
3726
+ {
3727
+ pf = true;
3728
+ }
3729
+ if (!is_boolean(ns))
3730
+ {
3731
+ ns = true;
3732
+ }
3733
+ if (!is_boolean(rd))
3734
+ {
3735
+ rd = false;
3736
+ }
3737
+
3738
+ if (pf)
3739
+ {
3740
+ n = c.events.prefix + n;
3741
+ }
3742
+ if (ns)
3743
+ {
3744
+ n = n +'.'+ c.events.namespace;
3745
+ }
3746
+ if (ns && rd)
3747
+ {
3748
+ n += c.serialNumber;
3749
+ }
3750
+
3751
+ return n;
3752
+ }
3753
+ function cf_c(n, c) {
3754
+ return (is_string(c.classnames[n])) ? c.classnames[n] : n;
3755
+ }
3756
+ function cf_mapWrapperSizes(ws, o, p) {
3757
+
3758
+ if (!is_boolean(p))
3759
+ {
3760
+ p = true;
3761
+ }
3762
+ var pad = (o.usePadding && p) ? o.padding : [0, 0, 0, 0];
3763
+ var wra = {};
3764
+
3765
+ wra[o.d['width']] = ws[0] + pad[1] + pad[3];
3766
+ wra[o.d['height']] = ws[1] + pad[0] + pad[2];
3767
+
3768
+ return wra;
3769
+ }
3770
+ function cf_sortParams(vals, typs) {
3771
+ var arr = [];
3772
+ for (var a = 0, l1 = vals.length; a < l1; a++)
3773
+ {
3774
+ for (var b = 0, l2 = typs.length; b < l2; b++)
3775
+ {
3776
+ if (typs[b].indexOf(typeof vals[a]) > -1 && is_undefined(arr[b]))
3777
+ {
3778
+ arr[b] = vals[a];
3779
+ break;
3780
+ }
3781
+ }
3782
+ }
3783
+ return arr;
3784
+ }
3785
+ function cf_getPadding(p) {
3786
+ if (is_undefined(p))
3787
+ {
3788
+ return [0, 0, 0, 0];
3789
+ }
3790
+ if (is_number(p))
3791
+ {
3792
+ return [p, p, p, p];
3793
+ }
3794
+ if (is_string(p))
3795
+ {
3796
+ p = p.split('px').join('').split('em').join('').split(' ');
3797
+ }
3798
+
3799
+ if (!is_array(p))
3800
+ {
3801
+ return [0, 0, 0, 0];
3802
+ }
3803
+ for (var i = 0; i < 4; i++)
3804
+ {
3805
+ p[i] = parseInt(p[i], 10);
3806
+ }
3807
+ switch (p.length)
3808
+ {
3809
+ case 0:
3810
+ return [0, 0, 0, 0];
3811
+ case 1:
3812
+ return [p[0], p[0], p[0], p[0]];
3813
+ case 2:
3814
+ return [p[0], p[1], p[0], p[1]];
3815
+ case 3:
3816
+ return [p[0], p[1], p[2], p[1]];
3817
+ default:
3818
+ return [p[0], p[1], p[2], p[3]];
3819
+ }
3820
+ }
3821
+ function cf_getAlignPadding(itm, o) {
3822
+ var x = (is_number(o[o.d['width']])) ? Math.ceil(o[o.d['width']] - ms_getTotalSize(itm, o, 'width')) : 0;
3823
+ switch (o.align)
3824
+ {
3825
+ case 'left':
3826
+ return [0, x];
3827
+ case 'right':
3828
+ return [x, 0];
3829
+ case 'center':
3830
+ default:
3831
+ return [Math.ceil(x/2), Math.floor(x/2)];
3832
+ }
3833
+ }
3834
+ function cf_getDimensions(o) {
3835
+ var dm = [
3836
+ ['width' , 'innerWidth' , 'outerWidth' , 'height' , 'innerHeight' , 'outerHeight' , 'left', 'top' , 'marginRight' , 0, 1, 2, 3],
3837
+ ['height' , 'innerHeight' , 'outerHeight' , 'width' , 'innerWidth' , 'outerWidth' , 'top' , 'left', 'marginBottom', 3, 2, 1, 0]
3838
+ ];
3839
+
3840
+ var dl = dm[0].length,
3841
+ dx = (o.direction == 'right' || o.direction == 'left') ? 0 : 1;
3842
+
3843
+ var dimensions = {};
3844
+ for (var d = 0; d < dl; d++)
3845
+ {
3846
+ dimensions[dm[0][d]] = dm[dx][d];
3847
+ }
3848
+ return dimensions;
3849
+ }
3850
+ function cf_getAdjust(x, o, a, $t) {
3851
+ var v = x;
3852
+ if (is_function(a))
3853
+ {
3854
+ v = a.call($t, v);
3855
+
3856
+ }
3857
+ else if (is_string(a))
3858
+ {
3859
+ var p = a.split('+'),
3860
+ m = a.split('-');
3861
+
3862
+ if (m.length > p.length)
3863
+ {
3864
+ var neg = true,
3865
+ sta = m[0],
3866
+ adj = m[1];
3867
+ }
3868
+ else
3869
+ {
3870
+ var neg = false,
3871
+ sta = p[0],
3872
+ adj = p[1];
3873
+ }
3874
+
3875
+ switch(sta)
3876
+ {
3877
+ case 'even':
3878
+ v = (x % 2 == 1) ? x-1 : x;
3879
+ break;
3880
+ case 'odd':
3881
+ v = (x % 2 == 0) ? x-1 : x;
3882
+ break;
3883
+ default:
3884
+ v = x;
3885
+ break;
3886
+ }
3887
+ adj = parseInt(adj, 10);
3888
+ if (is_number(adj))
3889
+ {
3890
+ if (neg)
3891
+ {
3892
+ adj = -adj;
3893
+ }
3894
+ v += adj;
3895
+ }
3896
+ }
3897
+ if (!is_number(v) || v < 1)
3898
+ {
3899
+ v = 1;
3900
+ }
3901
+ return v;
3902
+ }
3903
+ function cf_getItemsAdjust(x, o, a, $t) {
3904
+ return cf_getItemAdjustMinMax(cf_getAdjust(x, o, a, $t), o.items.visibleConf);
3905
+ }
3906
+ function cf_getItemAdjustMinMax(v, i) {
3907
+ if (is_number(i.min) && v < i.min)
3908
+ {
3909
+ v = i.min;
3910
+ }
3911
+ if (is_number(i.max) && v > i.max)
3912
+ {
3913
+ v = i.max;
3914
+ }
3915
+ if (v < 1)
3916
+ {
3917
+ v = 1;
3918
+ }
3919
+ return v;
3920
+ }
3921
+ function cf_getSynchArr(s) {
3922
+ if (!is_array(s))
3923
+ {
3924
+ s = [[s]];
3925
+ }
3926
+ if (!is_array(s[0]))
3927
+ {
3928
+ s = [s];
3929
+ }
3930
+ for (var j = 0, l = s.length; j < l; j++)
3931
+ {
3932
+ if (is_string(s[j][0]))
3933
+ {
3934
+ s[j][0] = $(s[j][0]);
3935
+ }
3936
+ if (!is_boolean(s[j][1]))
3937
+ {
3938
+ s[j][1] = true;
3939
+ }
3940
+ if (!is_boolean(s[j][2]))
3941
+ {
3942
+ s[j][2] = true;
3943
+ }
3944
+ if (!is_number(s[j][3]))
3945
+ {
3946
+ s[j][3] = 0;
3947
+ }
3948
+ }
3949
+ return s;
3950
+ }
3951
+ function cf_getKeyCode(k) {
3952
+ if (k == 'right')
3953
+ {
3954
+ return 39;
3955
+ }
3956
+ if (k == 'left')
3957
+ {
3958
+ return 37;
3959
+ }
3960
+ if (k == 'up')
3961
+ {
3962
+ return 38;
3963
+ }
3964
+ if (k == 'down')
3965
+ {
3966
+ return 40;
3967
+ }
3968
+ return -1;
3969
+ }
3970
+ function cf_setCookie(n, $c, c) {
3971
+ if (n)
3972
+ {
3973
+ var v = $c.triggerHandler(cf_e('currentPosition', c));
3974
+ $.fn.carouFredSel.cookie.set(n, v);
3975
+ }
3976
+ }
3977
+ function cf_getCookie(n) {
3978
+ var c = $.fn.carouFredSel.cookie.get(n);
3979
+ return (c == '') ? 0 : c;
3980
+ }
3981
+
3982
+ // init function
3983
+ function in_mapCss($elem, props) {
3984
+ var css = {};
3985
+ for (var p = 0, l = props.length; p < l; p++)
3986
+ {
3987
+ css[props[p]] = $elem.css(props[p]);
3988
+ }
3989
+ return css;
3990
+ }
3991
+ function in_complementItems(obj, opt, itm, sta) {
3992
+ if (!is_object(obj.visibleConf))
3993
+ {
3994
+ obj.visibleConf = {};
3995
+ }
3996
+ if (!is_object(obj.sizesConf))
3997
+ {
3998
+ obj.sizesConf = {};
3999
+ }
4000
+
4001
+ if (obj.start == 0 && is_number(sta))
4002
+ {
4003
+ obj.start = sta;
4004
+ }
4005
+
4006
+ // visible items
4007
+ if (is_object(obj.visible))
4008
+ {
4009
+ obj.visibleConf.min = obj.visible.min;
4010
+ obj.visibleConf.max = obj.visible.max;
4011
+ obj.visible = false;
4012
+ }
4013
+ else if (is_string(obj.visible))
4014
+ {
4015
+ // variable visible items
4016
+ if (obj.visible == 'variable')
4017
+ {
4018
+ obj.visibleConf.variable = true;
4019
+ }
4020
+ // adjust string visible items
4021
+ else
4022
+ {
4023
+ obj.visibleConf.adjust = obj.visible;
4024
+ }
4025
+ obj.visible = false;
4026
+ }
4027
+ else if (is_function(obj.visible))
4028
+ {
4029
+ obj.visibleConf.adjust = obj.visible;
4030
+ obj.visible = false;
4031
+ }
4032
+
4033
+ // set items filter
4034
+ if (!is_string(obj.filter))
4035
+ {
4036
+ obj.filter = (itm.filter(':hidden').length > 0) ? ':visible' : '*';
4037
+ }
4038
+
4039
+ // primary item-size not set
4040
+ if (!obj[opt.d['width']])
4041
+ {
4042
+ // responsive carousel -> set to largest
4043
+ if (opt.responsive)
4044
+ {
4045
+ debug(true, 'Set a '+opt.d['width']+' for the items!');
4046
+ obj[opt.d['width']] = ms_getTrueLargestSize(itm, opt, 'outerWidth');
4047
+ }
4048
+ // non-responsive -> measure it or set to "variable"
4049
+ else
4050
+ {
4051
+ obj[opt.d['width']] = (ms_hasVariableSizes(itm, opt, 'outerWidth'))
4052
+ ? 'variable'
4053
+ : itm[opt.d['outerWidth']](true);
4054
+ }
4055
+ }
4056
+
4057
+ // secondary item-size not set -> measure it or set to "variable"
4058
+ if (!obj[opt.d['height']])
4059
+ {
4060
+ obj[opt.d['height']] = (ms_hasVariableSizes(itm, opt, 'outerHeight'))
4061
+ ? 'variable'
4062
+ : itm[opt.d['outerHeight']](true);
4063
+ }
4064
+
4065
+ obj.sizesConf.width = obj.width;
4066
+ obj.sizesConf.height = obj.height;
4067
+ return obj;
4068
+ }
4069
+ function in_complementVisibleItems(opt, avl) {
4070
+ // primary item-size variable -> set visible items variable
4071
+ if (opt.items[opt.d['width']] == 'variable')
4072
+ {
4073
+ opt.items.visibleConf.variable = true;
4074
+ }
4075
+ if (!opt.items.visibleConf.variable) {
4076
+ // primary size is number -> calculate visible-items
4077
+ if (is_number(opt[opt.d['width']]))
4078
+ {
4079
+ opt.items.visible = Math.floor(opt[opt.d['width']] / opt.items[opt.d['width']]);
4080
+ }
4081
+ // measure and calculate primary size and visible-items
4082
+ else
4083
+ {
4084
+ opt.items.visible = Math.floor(avl / opt.items[opt.d['width']]);
4085
+ opt[opt.d['width']] = opt.items.visible * opt.items[opt.d['width']];
4086
+ if (!opt.items.visibleConf.adjust)
4087
+ {
4088
+ opt.align = false;
4089
+ }
4090
+ }
4091
+ if (opt.items.visible == 'Infinity' || opt.items.visible < 1)
4092
+ {
4093
+ debug(true, 'Not a valid number of visible items: Set to "variable".');
4094
+ opt.items.visibleConf.variable = true;
4095
+ }
4096
+ }
4097
+ return opt;
4098
+ }
4099
+ function in_complementPrimarySize(obj, opt, all) {
4100
+ // primary size set to auto -> measure largest item-size and set it
4101
+ if (obj == 'auto')
4102
+ {
4103
+ obj = ms_getTrueLargestSize(all, opt, 'outerWidth');
4104
+ }
4105
+ return obj;
4106
+ }
4107
+ function in_complementSecondarySize(obj, opt, all) {
4108
+ // secondary size set to auto -> measure largest item-size and set it
4109
+ if (obj == 'auto')
4110
+ {
4111
+ obj = ms_getTrueLargestSize(all, opt, 'outerHeight');
4112
+ }
4113
+ // secondary size not set -> set to secondary item-size
4114
+ if (!obj)
4115
+ {
4116
+ obj = opt.items[opt.d['height']];
4117
+ }
4118
+ return obj;
4119
+ }
4120
+ function in_getAlignPadding(o, all) {
4121
+ var p = cf_getAlignPadding(gi_getCurrentItems(all, o), o);
4122
+ o.padding[o.d[1]] = p[1];
4123
+ o.padding[o.d[3]] = p[0];
4124
+ return o;
4125
+ }
4126
+ function in_getResponsiveValues(o, all, avl) {
4127
+
4128
+ var visb = cf_getItemAdjustMinMax(Math.ceil(o[o.d['width']] / o.items[o.d['width']]), o.items.visibleConf);
4129
+ if (visb > all.length)
4130
+ {
4131
+ visb = all.length;
4132
+ }
4133
+
4134
+ var newS = Math.floor(o[o.d['width']]/visb);
4135
+
4136
+ o.items.visible = visb;
4137
+ o.items[o.d['width']] = newS;
4138
+ o[o.d['width']] = visb * newS;
4139
+ return o;
4140
+ }
4141
+
4142
+
4143
+ // buttons functions
4144
+ function bt_pauseOnHoverConfig(p) {
4145
+ if (is_string(p))
4146
+ {
4147
+ var i = (p.indexOf('immediate') > -1) ? true : false,
4148
+ r = (p.indexOf('resume') > -1) ? true : false;
4149
+ }
4150
+ else
4151
+ {
4152
+ var i = r = false;
4153
+ }
4154
+ return [i, r];
4155
+ }
4156
+ function bt_mousesheelNumber(mw) {
4157
+ return (is_number(mw)) ? mw : null
4158
+ }
4159
+
4160
+ // helper functions
4161
+ function is_null(a) {
4162
+ return (a === null);
4163
+ }
4164
+ function is_undefined(a) {
4165
+ return (is_null(a) || typeof a == 'undefined' || a === '' || a === 'undefined');
4166
+ }
4167
+ function is_array(a) {
4168
+ return (a instanceof Array);
4169
+ }
4170
+ function is_jquery(a) {
4171
+ return (a instanceof jQuery);
4172
+ }
4173
+ function is_object(a) {
4174
+ return ((a instanceof Object || typeof a == 'object') && !is_null(a) && !is_jquery(a) && !is_array(a) && !is_function(a));
4175
+ }
4176
+ function is_number(a) {
4177
+ return ((a instanceof Number || typeof a == 'number') && !isNaN(a));
4178
+ }
4179
+ function is_string(a) {
4180
+ return ((a instanceof String || typeof a == 'string') && !is_undefined(a) && !is_true(a) && !is_false(a));
4181
+ }
4182
+ function is_function(a) {
4183
+ return (a instanceof Function || typeof a == 'function');
4184
+ }
4185
+ function is_boolean(a) {
4186
+ return (a instanceof Boolean || typeof a == 'boolean' || is_true(a) || is_false(a));
4187
+ }
4188
+ function is_true(a) {
4189
+ return (a === true || a === 'true');
4190
+ }
4191
+ function is_false(a) {
4192
+ return (a === false || a === 'false');
4193
+ }
4194
+ function is_percentage(x) {
4195
+ return (is_string(x) && x.slice(-1) == '%');
4196
+ }
4197
+
4198
+
4199
+ function getTime() {
4200
+ return new Date().getTime();
4201
+ }
4202
+
4203
+ function deprecated( o, n ) {
4204
+ debug(true, o+' is DEPRECATED, support for it will be removed. Use '+n+' instead.');
4205
+ }
4206
+ function debug(d, m) {
4207
+ if (!is_undefined(window.console) && !is_undefined(window.console.log))
4208
+ {
4209
+ if (is_object(d))
4210
+ {
4211
+ var s = ' ('+d.selector+')';
4212
+ d = d.debug;
4213
+ }
4214
+ else
4215
+ {
4216
+ var s = '';
4217
+ }
4218
+ if (!d)
4219
+ {
4220
+ return false;
4221
+ }
4222
+
4223
+ if (is_string(m))
4224
+ {
4225
+ m = 'carouFredSel'+s+': ' + m;
4226
+ }
4227
+ else
4228
+ {
4229
+ m = ['carouFredSel'+s+':', m];
4230
+ }
4231
+ window.console.log(m);
4232
+ }
4233
+ return false;
4234
+ }
4235
+
4236
+
4237
+
4238
+ // EASING FUNCTIONS
4239
+ $.extend($.easing, {
4240
+ 'quadratic': function(t) {
4241
+ var t2 = t * t;
4242
+ return t * (-t2 * t + 4 * t2 - 6 * t + 4);
4243
+ },
4244
+ 'cubic': function(t) {
4245
+ return t * (4 * t * t - 9 * t + 6);
4246
+ },
4247
+ 'elastic': function(t) {
4248
+ var t2 = t * t;
4249
+ return t * (33 * t2 * t2 - 106 * t2 * t + 126 * t2 - 67 * t + 15);
4250
+ }
4251
+ });
4252
+
4253
+
4254
  })(jQuery);
assets/js/jquery.carouFredSel.min.js CHANGED
@@ -1,2 +1,2 @@
1
- !function($){function sc_setScroll(t,e,s){return"transition"==s.transition&&"swing"==e&&(e="ease"),{anims:[],duration:t,orgDuration:t,easing:e,startTime:getTime()}}function sc_startScroll(t,e){for(var s=0,i=t.anims.length;i>s;s++){var o=t.anims[s];o&&o[0][e.transition](o[1],t.duration,t.easing,o[2])}}function sc_stopScroll(t,e){is_boolean(e)||(e=!0),is_object(t.pre)&&sc_stopScroll(t.pre,e);for(var s=0,i=t.anims.length;i>s;s++){var o=t.anims[s];o[0].stop(!0),e&&(o[0].css(o[1]),is_function(o[2])&&o[2]())}is_object(t.post)&&sc_stopScroll(t.post,e)}function sc_afterScroll(t,e,s){switch(e&&e.remove(),s.fx){case"fade":case"crossfade":case"cover-fade":case"uncover-fade":t.css("opacity",1),t.css("filter","")}}function sc_fireCallbacks(t,e,s,i,o){if(e[s]&&e[s].call(t,i),o[s].length)for(var n=0,r=o[s].length;r>n;n++)o[s][n].call(t,i);return[]}function sc_fireQueue(t,e,s){return e.length&&(t.trigger(cf_e(e[0][0],s),e[0][1]),e.shift()),e}function sc_hideHiddenItems(t){t.each(function(){var t=$(this);t.data("_cfs_isHidden",t.is(":hidden")).hide()})}function sc_showHiddenItems(t){t&&t.each(function(){var t=$(this);t.data("_cfs_isHidden")||t.show()})}function sc_clearTimers(t){return t.auto&&clearTimeout(t.auto),t.progress&&clearInterval(t.progress),t}function sc_mapCallbackArguments(t,e,s,i,o,n,r){return{width:r.width,height:r.height,items:{old:t,skipped:e,visible:s},scroll:{items:i,direction:o,duration:n}}}function sc_getDuration(t,e,s,i){var o=t.duration;return"none"==t.fx?0:("auto"==o?o=e.scroll.duration/e.scroll.items*s:10>o&&(o=i/o),1>o?0:("fade"==t.fx&&(o/=2),Math.round(o)))}function nv_showNavi(t,e,s){var i=is_number(t.items.minimum)?t.items.minimum:t.items.visible+1;if("show"==e||"hide"==e)var o=e;else if(i>e){debug(s,"Not enough items ("+e+" total, "+i+" needed): Hiding navigation.");var o="hide"}else var o="show";var n="show"==o?"removeClass":"addClass",r=cf_c("hidden",s);t.auto.button&&t.auto.button[o]()[n](r),t.prev.button&&t.prev.button[o]()[n](r),t.next.button&&t.next.button[o]()[n](r),t.pagination.container&&t.pagination.container[o]()[n](r)}function nv_enableNavi(t,e,s){if(!t.circular&&!t.infinite){var i="removeClass"==e||"addClass"==e?e:!1,o=cf_c("disabled",s);if(t.auto.button&&i&&t.auto.button[i](o),t.prev.button){var n=i||0==e?"addClass":"removeClass";t.prev.button[n](o)}if(t.next.button){var n=i||e==t.items.visible?"addClass":"removeClass";t.next.button[n](o)}}}function go_getObject(t,e){return is_function(e)?e=e.call(t):is_undefined(e)&&(e={}),e}function go_getItemsObject(t,e){return e=go_getObject(t,e),is_number(e)?e={visible:e}:"variable"==e?e={visible:e,width:e,height:e}:is_object(e)||(e={}),e}function go_getScrollObject(t,e){return e=go_getObject(t,e),is_number(e)?e=50>=e?{items:e}:{duration:e}:is_string(e)?e={easing:e}:is_object(e)||(e={}),e}function go_getNaviObject(t,e){if(e=go_getObject(t,e),is_string(e)){var s=cf_getKeyCode(e);e=-1==s?$(e):s}return e}function go_getAutoObject(t,e){return e=go_getNaviObject(t,e),is_jquery(e)?e={button:e}:is_boolean(e)?e={play:e}:is_number(e)&&(e={timeoutDuration:e}),e.progress&&(is_string(e.progress)||is_jquery(e.progress))&&(e.progress={bar:e.progress}),e}function go_complementAutoObject(t,e){return is_function(e.button)&&(e.button=e.button.call(t)),is_string(e.button)&&(e.button=$(e.button)),is_boolean(e.play)||(e.play=!0),is_number(e.delay)||(e.delay=0),is_undefined(e.pauseOnEvent)&&(e.pauseOnEvent=!0),is_boolean(e.pauseOnResize)||(e.pauseOnResize=!0),is_number(e.timeoutDuration)||(e.timeoutDuration=e.duration<10?2500:5*e.duration),e.progress&&(is_function(e.progress.bar)&&(e.progress.bar=e.progress.bar.call(t)),is_string(e.progress.bar)&&(e.progress.bar=$(e.progress.bar)),e.progress.bar?(is_function(e.progress.updater)||(e.progress.updater=$.fn.carouFredSel.progressbarUpdater),is_number(e.progress.interval)||(e.progress.interval=50)):e.progress=!1),e}function go_getPrevNextObject(t,e){return e=go_getNaviObject(t,e),is_jquery(e)?e={button:e}:is_number(e)&&(e={key:e}),e}function go_complementPrevNextObject(t,e){return is_function(e.button)&&(e.button=e.button.call(t)),is_string(e.button)&&(e.button=$(e.button)),is_string(e.key)&&(e.key=cf_getKeyCode(e.key)),e}function go_getPaginationObject(t,e){return e=go_getNaviObject(t,e),is_jquery(e)?e={container:e}:is_boolean(e)&&(e={keys:e}),e}function go_complementPaginationObject(t,e){return is_function(e.container)&&(e.container=e.container.call(t)),is_string(e.container)&&(e.container=$(e.container)),is_number(e.items)||(e.items=!1),is_boolean(e.keys)||(e.keys=!1),is_function(e.anchorBuilder)||is_false(e.anchorBuilder)||(e.anchorBuilder=$.fn.carouFredSel.pageAnchorBuilder),is_number(e.deviation)||(e.deviation=0),e}function go_getSwipeObject(t,e){return is_function(e)&&(e=e.call(t)),is_undefined(e)&&(e={onTouch:!1}),is_true(e)?e={onTouch:e}:is_number(e)&&(e={items:e}),e}function go_complementSwipeObject(t,e){return is_boolean(e.onTouch)||(e.onTouch=!0),is_boolean(e.onMouse)||(e.onMouse=!1),is_object(e.options)||(e.options={}),is_boolean(e.options.triggerOnTouchEnd)||(e.options.triggerOnTouchEnd=!1),e}function go_getMousewheelObject(t,e){return is_function(e)&&(e=e.call(t)),is_true(e)?e={}:is_number(e)?e={items:e}:is_undefined(e)&&(e=!1),e}function go_complementMousewheelObject(t,e){return e}function gn_getItemIndex(t,e,s,i,o){if(is_string(t)&&(t=$(t,o)),is_object(t)&&(t=$(t,o)),is_jquery(t)?(t=o.children().index(t),is_boolean(s)||(s=!1)):is_boolean(s)||(s=!0),is_number(t)||(t=0),is_number(e)||(e=0),s&&(t+=i.first),t+=e,i.total>0){for(;t>=i.total;)t-=i.total;for(;0>t;)t+=i.total}return t}function gn_getVisibleItemsPrev(t,e,s){for(var i=0,o=0,n=s;n>=0;n--){var r=t.eq(n);if(i+=r.is(":visible")?r[e.d.outerWidth](!0):0,i>e.maxDimension)return o;0==n&&(n=t.length),o++}}function gn_getVisibleItemsPrevFilter(t,e,s){return gn_getItemsPrevFilter(t,e.items.filter,e.items.visibleConf.org,s)}function gn_getScrollItemsPrevFilter(t,e,s,i){return gn_getItemsPrevFilter(t,e.items.filter,i,s)}function gn_getItemsPrevFilter(t,e,s,i){for(var o=0,n=0,r=i,c=t.length;r>=0;r--){if(n++,n==c)return n;var a=t.eq(r);if(a.is(e)&&(o++,o==s))return n;0==r&&(r=c)}}function gn_getVisibleOrg(t,e){return e.items.visibleConf.org||t.children().slice(0,e.items.visible).filter(e.items.filter).length}function gn_getVisibleItemsNext(t,e,s){for(var i=0,o=0,n=s,r=t.length-1;r>=n;n++){var c=t.eq(n);if(i+=c.is(":visible")?c[e.d.outerWidth](!0):0,i>e.maxDimension)return o;if(o++,o==r+1)return o;n==r&&(n=-1)}}function gn_getVisibleItemsNextTestCircular(t,e,s,i){var o=gn_getVisibleItemsNext(t,e,s);return e.circular||s+o>i&&(o=i-s),o}function gn_getVisibleItemsNextFilter(t,e,s){return gn_getItemsNextFilter(t,e.items.filter,e.items.visibleConf.org,s,e.circular)}function gn_getScrollItemsNextFilter(t,e,s,i){return gn_getItemsNextFilter(t,e.items.filter,i+1,s,e.circular)-1}function gn_getItemsNextFilter(t,e,s,i){for(var o=0,n=0,r=i,c=t.length-1;c>=r;r++){if(n++,n>=c)return n;var a=t.eq(r);if(a.is(e)&&(o++,o==s))return n;r==c&&(r=-1)}}function gi_getCurrentItems(t,e){return t.slice(0,e.items.visible)}function gi_getOldItemsPrev(t,e,s){return t.slice(s,e.items.visibleConf.old+s)}function gi_getNewItemsPrev(t,e){return t.slice(0,e.items.visible)}function gi_getOldItemsNext(t,e){return t.slice(0,e.items.visibleConf.old)}function gi_getNewItemsNext(t,e,s){return t.slice(s,e.items.visible+s)}function sz_storeMargin(t,e,s){e.usePadding&&(is_string(s)||(s="_cfs_origCssMargin"),t.each(function(){var t=$(this),i=parseInt(t.css(e.d.marginRight),10);is_number(i)||(i=0),t.data(s,i)}))}function sz_resetMargin(t,e,s){if(e.usePadding){var i=is_boolean(s)?s:!1;is_number(s)||(s=0),sz_storeMargin(t,e,"_cfs_tempCssMargin"),t.each(function(){var t=$(this);t.css(e.d.marginRight,i?t.data("_cfs_tempCssMargin"):s+t.data("_cfs_origCssMargin"))})}}function sz_storeOrigCss(t){t.each(function(){var t=$(this);t.data("_cfs_origCss",t.attr("style")||"")})}function sz_restoreOrigCss(t){t.each(function(){var t=$(this);t.attr("style",t.data("_cfs_origCss")||"")})}function sz_setResponsiveSizes(t,e){var s=(t.items.visible,t.items[t.d.width]),i=t[t.d.height],o=is_percentage(i);e.each(function(){var e=$(this),n=s-ms_getPaddingBorderMargin(e,t,"Width");e[t.d.width](n),o&&e[t.d.height](ms_getPercentage(n,i))})}function sz_setSizes(t,e){var s=t.parent(),i=t.children(),o=gi_getCurrentItems(i,e),n=cf_mapWrapperSizes(ms_getSizes(o,e,!0),e,!1);if(s.css(n),e.usePadding){var r=e.padding,c=r[e.d[1]];e.align&&0>c&&(c=0);var a=o.last();a.css(e.d.marginRight,a.data("_cfs_origCssMargin")+c),t.css(e.d.top,r[e.d[0]]),t.css(e.d.left,r[e.d[3]])}return t.css(e.d.width,n[e.d.width]+2*ms_getTotalSize(i,e,"width")),t.css(e.d.height,ms_getLargestSize(i,e,"height")),n}function ms_getSizes(t,e,s){return[ms_getTotalSize(t,e,"width",s),ms_getLargestSize(t,e,"height",s)]}function ms_getLargestSize(t,e,s,i){return is_boolean(i)||(i=!1),is_number(e[e.d[s]])&&i?e[e.d[s]]:is_number(e.items[e.d[s]])?e.items[e.d[s]]:(s=s.toLowerCase().indexOf("width")>-1?"outerWidth":"outerHeight",ms_getTrueLargestSize(t,e,s))}function ms_getTrueLargestSize(t,e,s){for(var i=0,o=0,n=t.length;n>o;o++){var r=t.eq(o),c=r.is(":visible")?r[e.d[s]](!0):0;c>i&&(i=c)}return i}function ms_getTotalSize(t,e,s,i){if(is_boolean(i)||(i=!1),is_number(e[e.d[s]])&&i)return e[e.d[s]];if(is_number(e.items[e.d[s]]))return e.items[e.d[s]]*t.length;for(var o=s.toLowerCase().indexOf("width")>-1?"outerWidth":"outerHeight",n=0,r=0,c=t.length;c>r;r++){var a=t.eq(r);n+=a.is(":visible")?a[e.d[o]](!0):0}return n}function ms_getParentSize(t,e,s){var i=t.is(":visible");i&&t.hide();var o=t.parent()[e.d[s]]();return i&&t.show(),o}function ms_getMaxDimension(t,e){return is_number(t[t.d.width])?t[t.d.width]:e}function ms_hasVariableSizes(t,e,s){for(var i=!1,o=!1,n=0,r=t.length;r>n;n++){var c=t.eq(n),a=c.is(":visible")?c[e.d[s]](!0):0;i===!1?i=a:i!=a&&(o=!0),0==i&&(o=!0)}return o}function ms_getPaddingBorderMargin(t,e,s){return t[e.d["outer"+s]](!0)-t[e.d[s.toLowerCase()]]()}function ms_getPercentage(t,e){if(is_percentage(e)){if(e=parseInt(e.slice(0,-1),10),!is_number(e))return t;t*=e/100}return t}function cf_e(t,e,s,i,o){return is_boolean(s)||(s=!0),is_boolean(i)||(i=!0),is_boolean(o)||(o=!1),s&&(t=e.events.prefix+t),i&&(t=t+"."+e.events.namespace),i&&o&&(t+=e.serialNumber),t}function cf_c(t,e){return is_string(e.classnames[t])?e.classnames[t]:t}function cf_mapWrapperSizes(t,e,s){is_boolean(s)||(s=!0);var i=e.usePadding&&s?e.padding:[0,0,0,0],o={};return o[e.d.width]=t[0]+i[1]+i[3],o[e.d.height]=t[1]+i[0]+i[2],o}function cf_sortParams(t,e){for(var s=[],i=0,o=t.length;o>i;i++)for(var n=0,r=e.length;r>n;n++)if(e[n].indexOf(typeof t[i])>-1&&is_undefined(s[n])){s[n]=t[i];break}return s}function cf_getPadding(t){if(is_undefined(t))return[0,0,0,0];if(is_number(t))return[t,t,t,t];if(is_string(t)&&(t=t.split("px").join("").split("em").join("").split(" ")),!is_array(t))return[0,0,0,0];for(var e=0;4>e;e++)t[e]=parseInt(t[e],10);switch(t.length){case 0:return[0,0,0,0];case 1:return[t[0],t[0],t[0],t[0]];case 2:return[t[0],t[1],t[0],t[1]];case 3:return[t[0],t[1],t[2],t[1]];default:return[t[0],t[1],t[2],t[3]]}}function cf_getAlignPadding(t,e){var s=is_number(e[e.d.width])?Math.ceil(e[e.d.width]-ms_getTotalSize(t,e,"width")):0;switch(e.align){case"left":return[0,s];case"right":return[s,0];case"center":default:return[Math.ceil(s/2),Math.floor(s/2)]}}function cf_getDimensions(t){for(var e=[["width","innerWidth","outerWidth","height","innerHeight","outerHeight","left","top","marginRight",0,1,2,3],["height","innerHeight","outerHeight","width","innerWidth","outerWidth","top","left","marginBottom",3,2,1,0]],s=e[0].length,i="right"==t.direction||"left"==t.direction?0:1,o={},n=0;s>n;n++)o[e[0][n]]=e[i][n];return o}function cf_getAdjust(t,e,s,i){var o=t;if(is_function(s))o=s.call(i,o);else if(is_string(s)){var n=s.split("+"),r=s.split("-");if(r.length>n.length)var c=!0,a=r[0],f=r[1];else var c=!1,a=n[0],f=n[1];switch(a){case"even":o=t%2==1?t-1:t;break;case"odd":o=t%2==0?t-1:t;break;default:o=t}f=parseInt(f,10),is_number(f)&&(c&&(f=-f),o+=f)}return(!is_number(o)||1>o)&&(o=1),o}function cf_getItemsAdjust(t,e,s,i){return cf_getItemAdjustMinMax(cf_getAdjust(t,e,s,i),e.items.visibleConf)}function cf_getItemAdjustMinMax(t,e){return is_number(e.min)&&t<e.min&&(t=e.min),is_number(e.max)&&t>e.max&&(t=e.max),1>t&&(t=1),t}function cf_getSynchArr(t){is_array(t)||(t=[[t]]),is_array(t[0])||(t=[t]);for(var e=0,s=t.length;s>e;e++)is_string(t[e][0])&&(t[e][0]=$(t[e][0])),is_boolean(t[e][1])||(t[e][1]=!0),is_boolean(t[e][2])||(t[e][2]=!0),is_number(t[e][3])||(t[e][3]=0);return t}function cf_getKeyCode(t){return"right"==t?39:"left"==t?37:"up"==t?38:"down"==t?40:-1}function cf_setCookie(t,e,s){if(t){var i=e.triggerHandler(cf_e("currentPosition",s));$.fn.carouFredSel.cookie.set(t,i)}}function cf_getCookie(t){var e=$.fn.carouFredSel.cookie.get(t);return""==e?0:e}function in_mapCss(t,e){for(var s={},i=0,o=e.length;o>i;i++)s[e[i]]=t.css(e[i]);return s}function in_complementItems(t,e,s,i){return is_object(t.visibleConf)||(t.visibleConf={}),is_object(t.sizesConf)||(t.sizesConf={}),0==t.start&&is_number(i)&&(t.start=i),is_object(t.visible)?(t.visibleConf.min=t.visible.min,t.visibleConf.max=t.visible.max,t.visible=!1):is_string(t.visible)?("variable"==t.visible?t.visibleConf.variable=!0:t.visibleConf.adjust=t.visible,t.visible=!1):is_function(t.visible)&&(t.visibleConf.adjust=t.visible,t.visible=!1),is_string(t.filter)||(t.filter=s.filter(":hidden").length>0?":visible":"*"),t[e.d.width]||(e.responsive?(debug(!0,"Set a "+e.d.width+" for the items!"),t[e.d.width]=ms_getTrueLargestSize(s,e,"outerWidth")):t[e.d.width]=ms_hasVariableSizes(s,e,"outerWidth")?"variable":s[e.d.outerWidth](!0)),t[e.d.height]||(t[e.d.height]=ms_hasVariableSizes(s,e,"outerHeight")?"variable":s[e.d.outerHeight](!0)),t.sizesConf.width=t.width,t.sizesConf.height=t.height,t}function in_complementVisibleItems(t,e){return"variable"==t.items[t.d.width]&&(t.items.visibleConf.variable=!0),t.items.visibleConf.variable||(is_number(t[t.d.width])?t.items.visible=Math.floor(t[t.d.width]/t.items[t.d.width]):(t.items.visible=Math.floor(e/t.items[t.d.width]),t[t.d.width]=t.items.visible*t.items[t.d.width],t.items.visibleConf.adjust||(t.align=!1)),("Infinity"==t.items.visible||t.items.visible<1)&&(debug(!0,'Not a valid number of visible items: Set to "variable".'),t.items.visibleConf.variable=!0)),t}function in_complementPrimarySize(t,e,s){return"auto"==t&&(t=ms_getTrueLargestSize(s,e,"outerWidth")),t}function in_complementSecondarySize(t,e,s){return"auto"==t&&(t=ms_getTrueLargestSize(s,e,"outerHeight")),t||(t=e.items[e.d.height]),t}function in_getAlignPadding(t,e){var s=cf_getAlignPadding(gi_getCurrentItems(e,t),t);return t.padding[t.d[1]]=s[1],t.padding[t.d[3]]=s[0],t}function in_getResponsiveValues(t,e){var s=cf_getItemAdjustMinMax(Math.ceil(t[t.d.width]/t.items[t.d.width]),t.items.visibleConf);s>e.length&&(s=e.length);var i=Math.floor(t[t.d.width]/s);return t.items.visible=s,t.items[t.d.width]=i,t[t.d.width]=s*i,t}function bt_pauseOnHoverConfig(t){if(is_string(t))var e=t.indexOf("immediate")>-1?!0:!1,s=t.indexOf("resume")>-1?!0:!1;else var e=s=!1;return[e,s]}function bt_mousesheelNumber(t){return is_number(t)?t:null}function is_null(t){return null===t}function is_undefined(t){return is_null(t)||"undefined"==typeof t||""===t||"undefined"===t}function is_array(t){return t instanceof Array}function is_jquery(t){return t instanceof jQuery}function is_object(t){return(t instanceof Object||"object"==typeof t)&&!is_null(t)&&!is_jquery(t)&&!is_array(t)&&!is_function(t)}function is_number(t){return(t instanceof Number||"number"==typeof t)&&!isNaN(t)}function is_string(t){return(t instanceof String||"string"==typeof t)&&!is_undefined(t)&&!is_true(t)&&!is_false(t)}function is_function(t){return t instanceof Function||"function"==typeof t}function is_boolean(t){return t instanceof Boolean||"boolean"==typeof t||is_true(t)||is_false(t)}function is_true(t){return t===!0||"true"===t}function is_false(t){return t===!1||"false"===t}function is_percentage(t){return is_string(t)&&"%"==t.slice(-1)}function getTime(){return(new Date).getTime()}function deprecated(t,e){debug(!0,t+" is DEPRECATED, support for it will be removed. Use "+e+" instead.")}function debug(t,e){if(!is_undefined(window.console)&&!is_undefined(window.console.log)){if(is_object(t)){var s=" ("+t.selector+")";t=t.debug}else var s="";if(!t)return!1;e=is_string(e)?"carouFredSel"+s+": "+e:["carouFredSel"+s+":",e],window.console.log(e)}return!1}$.fn.carouFredSel||($.fn.caroufredsel=$.fn.carouFredSel=function(options,configs){if(0==this.length)return debug(!0,'No element found for "'+this.selector+'".'),this;if(this.length>1)return this.each(function(){$(this).carouFredSel(options,configs)});var $cfs=this,$tt0=this[0],starting_position=!1;$cfs.data("_cfs_isCarousel")&&(starting_position=$cfs.triggerHandler("_cfs_triggerEvent","currentPosition"),$cfs.trigger("_cfs_triggerEvent",["destroy",!0]));var FN={};FN._init=function(t,e,s){t=go_getObject($tt0,t),t.items=go_getItemsObject($tt0,t.items),t.scroll=go_getScrollObject($tt0,t.scroll),t.auto=go_getAutoObject($tt0,t.auto),t.prev=go_getPrevNextObject($tt0,t.prev),t.next=go_getPrevNextObject($tt0,t.next),t.pagination=go_getPaginationObject($tt0,t.pagination),t.swipe=go_getSwipeObject($tt0,t.swipe),t.mousewheel=go_getMousewheelObject($tt0,t.mousewheel),e&&(opts_orig=$.extend(!0,{},$.fn.carouFredSel.defaults,t)),opts=$.extend(!0,{},$.fn.carouFredSel.defaults,t),opts.d=cf_getDimensions(opts),crsl.direction="up"==opts.direction||"left"==opts.direction?"next":"prev";var i=$cfs.children(),o=ms_getParentSize($wrp,opts,"width");if(is_true(opts.cookie)&&(opts.cookie="caroufredsel_cookie_"+conf.serialNumber),opts.maxDimension=ms_getMaxDimension(opts,o),opts.items=in_complementItems(opts.items,opts,i,s),opts[opts.d.width]=in_complementPrimarySize(opts[opts.d.width],opts,i),opts[opts.d.height]=in_complementSecondarySize(opts[opts.d.height],opts,i),opts.responsive&&(is_percentage(opts[opts.d.width])||(opts[opts.d.width]="100%")),is_percentage(opts[opts.d.width])&&(crsl.upDateOnWindowResize=!0,crsl.primarySizePercentage=opts[opts.d.width],opts[opts.d.width]=ms_getPercentage(o,crsl.primarySizePercentage),opts.items.visible||(opts.items.visibleConf.variable=!0)),opts.responsive?(opts.usePadding=!1,opts.padding=[0,0,0,0],opts.align=!1,opts.items.visibleConf.variable=!1):(opts.items.visible||(opts=in_complementVisibleItems(opts,o)),opts[opts.d.width]||(!opts.items.visibleConf.variable&&is_number(opts.items[opts.d.width])&&"*"==opts.items.filter?(opts[opts.d.width]=opts.items.visible*opts.items[opts.d.width],opts.align=!1):opts[opts.d.width]="variable"),is_undefined(opts.align)&&(opts.align=is_number(opts[opts.d.width])?"center":!1),opts.items.visibleConf.variable&&(opts.items.visible=gn_getVisibleItemsNext(i,opts,0))),"*"==opts.items.filter||opts.items.visibleConf.variable||(opts.items.visibleConf.org=opts.items.visible,opts.items.visible=gn_getVisibleItemsNextFilter(i,opts,0)),opts.items.visible=cf_getItemsAdjust(opts.items.visible,opts,opts.items.visibleConf.adjust,$tt0),opts.items.visibleConf.old=opts.items.visible,opts.responsive)opts.items.visibleConf.min||(opts.items.visibleConf.min=opts.items.visible),opts.items.visibleConf.max||(opts.items.visibleConf.max=opts.items.visible),opts=in_getResponsiveValues(opts,i,o);else switch(opts.padding=cf_getPadding(opts.padding),"top"==opts.align?opts.align="left":"bottom"==opts.align&&(opts.align="right"),opts.align){case"center":case"left":case"right":"variable"!=opts[opts.d.width]&&(opts=in_getAlignPadding(opts,i),opts.usePadding=!0);break;default:opts.align=!1,opts.usePadding=0==opts.padding[0]&&0==opts.padding[1]&&0==opts.padding[2]&&0==opts.padding[3]?!1:!0}is_number(opts.scroll.duration)||(opts.scroll.duration=500),is_undefined(opts.scroll.items)&&(opts.scroll.items=opts.responsive||opts.items.visibleConf.variable||"*"!=opts.items.filter?"visible":opts.items.visible),opts.auto=$.extend(!0,{},opts.scroll,opts.auto),opts.prev=$.extend(!0,{},opts.scroll,opts.prev),opts.next=$.extend(!0,{},opts.scroll,opts.next),opts.pagination=$.extend(!0,{},opts.scroll,opts.pagination),opts.auto=go_complementAutoObject($tt0,opts.auto),opts.prev=go_complementPrevNextObject($tt0,opts.prev),opts.next=go_complementPrevNextObject($tt0,opts.next),opts.pagination=go_complementPaginationObject($tt0,opts.pagination),opts.swipe=go_complementSwipeObject($tt0,opts.swipe),opts.mousewheel=go_complementMousewheelObject($tt0,opts.mousewheel),opts.synchronise&&(opts.synchronise=cf_getSynchArr(opts.synchronise)),opts.auto.onPauseStart&&(opts.auto.onTimeoutStart=opts.auto.onPauseStart,deprecated("auto.onPauseStart","auto.onTimeoutStart")),opts.auto.onPausePause&&(opts.auto.onTimeoutPause=opts.auto.onPausePause,deprecated("auto.onPausePause","auto.onTimeoutPause")),opts.auto.onPauseEnd&&(opts.auto.onTimeoutEnd=opts.auto.onPauseEnd,deprecated("auto.onPauseEnd","auto.onTimeoutEnd")),opts.auto.pauseDuration&&(opts.auto.timeoutDuration=opts.auto.pauseDuration,deprecated("auto.pauseDuration","auto.timeoutDuration"))},FN._build=function(){$cfs.data("_cfs_isCarousel",!0);var t=$cfs.children(),e=in_mapCss($cfs,["textAlign","float","position","top","right","bottom","left","zIndex","width","height","marginTop","marginRight","marginBottom","marginLeft"]),s="relative";switch(e.position){case"absolute":case"fixed":s=e.position}"parent"==conf.wrapper?sz_storeOrigCss($wrp):$wrp.css(e),$wrp.css({overflow:"hidden",position:s}),sz_storeOrigCss($cfs),$cfs.data("_cfs_origCssZindex",e.zIndex),$cfs.css({textAlign:"left","float":"none",position:"absolute",top:0,right:"auto",bottom:"auto",left:0,marginTop:0,marginRight:0,marginBottom:0,marginLeft:0}),sz_storeMargin(t,opts),sz_storeOrigCss(t),opts.responsive&&sz_setResponsiveSizes(opts,t)},FN._bind_events=function(){FN._unbind_events(),$cfs.bind(cf_e("stop",conf),function(t,e){return t.stopPropagation(),crsl.isStopped||opts.auto.button&&opts.auto.button.addClass(cf_c("stopped",conf)),crsl.isStopped=!0,opts.auto.play&&(opts.auto.play=!1,$cfs.trigger(cf_e("pause",conf),e)),!0}),$cfs.bind(cf_e("finish",conf),function(t){return t.stopPropagation(),crsl.isScrolling&&sc_stopScroll(scrl),!0}),$cfs.bind(cf_e("pause",conf),function(t,e,s){if(t.stopPropagation(),tmrs=sc_clearTimers(tmrs),e&&crsl.isScrolling){scrl.isStopped=!0;var i=getTime()-scrl.startTime;scrl.duration-=i,scrl.pre&&(scrl.pre.duration-=i),scrl.post&&(scrl.post.duration-=i),sc_stopScroll(scrl,!1)}if(crsl.isPaused||crsl.isScrolling||s&&(tmrs.timePassed+=getTime()-tmrs.startTime),crsl.isPaused||opts.auto.button&&opts.auto.button.addClass(cf_c("paused",conf)),crsl.isPaused=!0,opts.auto.onTimeoutPause){var o=opts.auto.timeoutDuration-tmrs.timePassed,n=100-Math.ceil(100*o/opts.auto.timeoutDuration);opts.auto.onTimeoutPause.call($tt0,n,o)}return!0}),$cfs.bind(cf_e("play",conf),function(t,e,s,i){t.stopPropagation(),tmrs=sc_clearTimers(tmrs);var o=[e,s,i],n=["string","number","boolean"],r=cf_sortParams(o,n);if(e=r[0],s=r[1],i=r[2],"prev"!=e&&"next"!=e&&(e=crsl.direction),is_number(s)||(s=0),is_boolean(i)||(i=!1),i&&(crsl.isStopped=!1,opts.auto.play=!0),!opts.auto.play)return t.stopImmediatePropagation(),debug(conf,"Carousel stopped: Not scrolling.");crsl.isPaused&&opts.auto.button&&(opts.auto.button.removeClass(cf_c("stopped",conf)),opts.auto.button.removeClass(cf_c("paused",conf))),crsl.isPaused=!1,tmrs.startTime=getTime();var c=opts.auto.timeoutDuration+s;return dur2=c-tmrs.timePassed,perc=100-Math.ceil(100*dur2/c),opts.auto.progress&&(tmrs.progress=setInterval(function(){var t=getTime()-tmrs.startTime+tmrs.timePassed,e=Math.ceil(100*t/c);opts.auto.progress.updater.call(opts.auto.progress.bar[0],e)},opts.auto.progress.interval)),tmrs.auto=setTimeout(function(){opts.auto.progress&&opts.auto.progress.updater.call(opts.auto.progress.bar[0],100),opts.auto.onTimeoutEnd&&opts.auto.onTimeoutEnd.call($tt0,perc,dur2),crsl.isScrolling?$cfs.trigger(cf_e("play",conf),e):$cfs.trigger(cf_e(e,conf),opts.auto)},dur2),opts.auto.onTimeoutStart&&opts.auto.onTimeoutStart.call($tt0,perc,dur2),!0}),$cfs.bind(cf_e("resume",conf),function(t){return t.stopPropagation(),scrl.isStopped?(scrl.isStopped=!1,crsl.isPaused=!1,crsl.isScrolling=!0,scrl.startTime=getTime(),sc_startScroll(scrl,conf)):$cfs.trigger(cf_e("play",conf)),!0}),$cfs.bind(cf_e("prev",conf)+" "+cf_e("next",conf),function(t,e,s,i,o){if(t.stopPropagation(),crsl.isStopped||$cfs.is(":hidden"))return t.stopImmediatePropagation(),debug(conf,"Carousel stopped or hidden: Not scrolling.");var n=is_number(opts.items.minimum)?opts.items.minimum:opts.items.visible+1;if(n>itms.total)return t.stopImmediatePropagation(),debug(conf,"Not enough items ("+itms.total+" total, "+n+" needed): Not scrolling.");var r=[e,s,i,o],c=["object","number/string","function","boolean"],a=cf_sortParams(r,c);e=a[0],s=a[1],i=a[2],o=a[3];var f=t.type.slice(conf.events.prefix.length);if(is_object(e)||(e={}),is_function(i)&&(e.onAfter=i),is_boolean(o)&&(e.queue=o),e=$.extend(!0,{},opts[f],e),e.conditions&&!e.conditions.call($tt0,f))return t.stopImmediatePropagation(),debug(conf,'Callback "conditions" returned false.');if(!is_number(s)){if("*"!=opts.items.filter)s="visible";else for(var l=[s,e.items,opts[f].items],a=0,u=l.length;u>a;a++)if(is_number(l[a])||"page"==l[a]||"visible"==l[a]){s=l[a];break}switch(s){case"page":return t.stopImmediatePropagation(),$cfs.triggerHandler(cf_e(f+"Page",conf),[e,i]);case"visible":opts.items.visibleConf.variable||"*"!=opts.items.filter||(s=opts.items.visible)}}if(scrl.isStopped)return $cfs.trigger(cf_e("resume",conf)),$cfs.trigger(cf_e("queue",conf),[f,[e,s,i]]),t.stopImmediatePropagation(),debug(conf,"Carousel resumed scrolling.");if(e.duration>0&&crsl.isScrolling)return e.queue&&("last"==e.queue&&(queu=[]),("first"!=e.queue||0==queu.length)&&$cfs.trigger(cf_e("queue",conf),[f,[e,s,i]])),t.stopImmediatePropagation(),debug(conf,"Carousel currently scrolling.");if(tmrs.timePassed=0,$cfs.trigger(cf_e("slide_"+f,conf),[e,s]),opts.synchronise)for(var p=opts.synchronise,d=[e,s],g=0,u=p.length;u>g;g++){var m=f;p[g][2]||(m="prev"==m?"next":"prev"),p[g][1]||(d[0]=p[g][0].triggerHandler("_cfs_triggerEvent",["configuration",m])),d[1]=s+p[g][3],p[g][0].trigger("_cfs_triggerEvent",["slide_"+m,d])}return!0}),$cfs.bind(cf_e("slide_prev",conf),function(t,e,s){t.stopPropagation();var i=$cfs.children();if(!opts.circular&&0==itms.first)return opts.infinite&&$cfs.trigger(cf_e("next",conf),itms.total-1),t.stopImmediatePropagation();if(sz_resetMargin(i,opts),!is_number(s)){if(opts.items.visibleConf.variable)s=gn_getVisibleItemsPrev(i,opts,itms.total-1);else if("*"!=opts.items.filter){var o=is_number(e.items)?e.items:gn_getVisibleOrg($cfs,opts);s=gn_getScrollItemsPrevFilter(i,opts,itms.total-1,o)}else s=opts.items.visible;s=cf_getAdjust(s,opts,e.items,$tt0)}if(opts.circular||itms.total-s<itms.first&&(s=itms.total-itms.first),opts.items.visibleConf.old=opts.items.visible,opts.items.visibleConf.variable){var n=cf_getItemsAdjust(gn_getVisibleItemsNext(i,opts,itms.total-s),opts,opts.items.visibleConf.adjust,$tt0);opts.items.visible+s<=n&&s<itms.total&&(s++,n=cf_getItemsAdjust(gn_getVisibleItemsNext(i,opts,itms.total-s),opts,opts.items.visibleConf.adjust,$tt0)),opts.items.visible=n}else if("*"!=opts.items.filter){var n=gn_getVisibleItemsNextFilter(i,opts,itms.total-s);opts.items.visible=cf_getItemsAdjust(n,opts,opts.items.visibleConf.adjust,$tt0)}if(sz_resetMargin(i,opts,!0),0==s)return t.stopImmediatePropagation(),debug(conf,"0 items to scroll: Not scrolling.");for(debug(conf,"Scrolling "+s+" items backward."),itms.first+=s;itms.first>=itms.total;)itms.first-=itms.total;opts.circular||(0==itms.first&&e.onEnd&&e.onEnd.call($tt0,"prev"),opts.infinite||nv_enableNavi(opts,itms.first,conf)),$cfs.children().slice(itms.total-s,itms.total).prependTo($cfs),itms.total<opts.items.visible+s&&$cfs.children().slice(0,opts.items.visible+s-itms.total).clone(!0).appendTo($cfs);var i=$cfs.children(),r=gi_getOldItemsPrev(i,opts,s),c=gi_getNewItemsPrev(i,opts),a=i.eq(s-1),f=r.last(),l=c.last();sz_resetMargin(i,opts);var u=0,p=0;if(opts.align){var d=cf_getAlignPadding(c,opts);u=d[0],p=d[1]}var g=0>u?opts.padding[opts.d[3]]:0,m=!1,_=$();if(opts.items.visible<s&&(_=i.slice(opts.items.visibleConf.old,s),"directscroll"==e.fx)){var b=opts.items[opts.d.width];m=_,a=l,sc_hideHiddenItems(m),opts.items[opts.d.width]="variable"}var v=!1,h=ms_getTotalSize(i.slice(0,s),opts,"width"),w=cf_mapWrapperSizes(ms_getSizes(c,opts,!0),opts,!opts.usePadding),P=0,C={},x={},S={},y={},I={},z={},j={},N=sc_getDuration(e,opts,s,h);switch(e.fx){case"cover":case"cover-fade":P=ms_getTotalSize(i.slice(0,opts.items.visible),opts,"width")}m&&(opts.items[opts.d.width]=b),sz_resetMargin(i,opts,!0),p>=0&&sz_resetMargin(f,opts,opts.padding[opts.d[1]]),u>=0&&sz_resetMargin(a,opts,opts.padding[opts.d[3]]),opts.align&&(opts.padding[opts.d[1]]=p,opts.padding[opts.d[3]]=u),z[opts.d.left]=-(h-g),j[opts.d.left]=-(P-g),x[opts.d.left]=w[opts.d.width];var k=function(){},O=function(){},T=function(){},M=function(){},F=function(){},A=function(){},H=function(){},q=function(){},D=function(){},V=function(){},R=function(){};switch(e.fx){case"crossfade":case"cover":case"cover-fade":case"uncover":case"uncover-fade":v=$cfs.clone(!0).appendTo($wrp)}switch(e.fx){case"crossfade":case"uncover":case"uncover-fade":v.children().slice(0,s).remove(),v.children().slice(opts.items.visibleConf.old).remove();break;case"cover":case"cover-fade":v.children().slice(opts.items.visible).remove(),v.css(j)}if($cfs.css(z),scrl=sc_setScroll(N,e.easing,conf),C[opts.d.left]=opts.usePadding?opts.padding[opts.d[3]]:0,("variable"==opts[opts.d.width]||"variable"==opts[opts.d.height])&&(k=function(){$wrp.css(w)},O=function(){scrl.anims.push([$wrp,w])}),opts.usePadding){switch(l.not(a).length&&(S[opts.d.marginRight]=a.data("_cfs_origCssMargin"),0>u?a.css(S):(H=function(){a.css(S)},q=function(){scrl.anims.push([a,S])})),e.fx){case"cover":case"cover-fade":v.children().eq(s-1).css(S)}l.not(f).length&&(y[opts.d.marginRight]=f.data("_cfs_origCssMargin"),T=function(){f.css(y)},M=function(){scrl.anims.push([f,y])}),p>=0&&(I[opts.d.marginRight]=l.data("_cfs_origCssMargin")+opts.padding[opts.d[1]],F=function(){l.css(I)},A=function(){scrl.anims.push([l,I])})}R=function(){$cfs.css(C)};var E=opts.items.visible+s-itms.total;V=function(){if(E>0&&($cfs.children().slice(itms.total).remove(),r=$($cfs.children().slice(itms.total-(opts.items.visible-E)).get().concat($cfs.children().slice(0,E).get()))),sc_showHiddenItems(m),opts.usePadding){var t=$cfs.children().eq(opts.items.visible+s-1);t.css(opts.d.marginRight,t.data("_cfs_origCssMargin"))}};var W=sc_mapCallbackArguments(r,_,c,s,"prev",N,w);switch(D=function(){sc_afterScroll($cfs,v,e),crsl.isScrolling=!1,clbk.onAfter=sc_fireCallbacks($tt0,e,"onAfter",W,clbk),queu=sc_fireQueue($cfs,queu,conf),crsl.isPaused||$cfs.trigger(cf_e("play",conf))},crsl.isScrolling=!0,tmrs=sc_clearTimers(tmrs),clbk.onBefore=sc_fireCallbacks($tt0,e,"onBefore",W,clbk),e.fx){case"none":$cfs.css(C),k(),T(),F(),H(),R(),V(),D();break;case"fade":scrl.anims.push([$cfs,{opacity:0},function(){k(),T(),F(),H(),R(),V(),scrl=sc_setScroll(N,e.easing,conf),scrl.anims.push([$cfs,{opacity:1},D]),sc_startScroll(scrl,conf)}]);break;case"crossfade":$cfs.css({opacity:0}),scrl.anims.push([v,{opacity:0}]),scrl.anims.push([$cfs,{opacity:1},D]),O(),T(),F(),H(),R(),V();break;case"cover":scrl.anims.push([v,C,function(){T(),F(),H(),R(),V(),D()}]),O();break;case"cover-fade":scrl.anims.push([$cfs,{opacity:0}]),scrl.anims.push([v,C,function(){T(),F(),H(),R(),V(),D()}]),O();break;case"uncover":scrl.anims.push([v,x,D]),O(),T(),F(),H(),R(),V();break;case"uncover-fade":$cfs.css({opacity:0}),scrl.anims.push([$cfs,{opacity:1}]),scrl.anims.push([v,x,D]),O(),T(),F(),H(),R(),V();break;default:scrl.anims.push([$cfs,C,function(){V(),D()}]),O(),M(),A(),q()}return sc_startScroll(scrl,conf),cf_setCookie(opts.cookie,$cfs,conf),$cfs.trigger(cf_e("updatePageStatus",conf),[!1,w]),!0
2
  }),$cfs.bind(cf_e("slide_next",conf),function(t,e,s){t.stopPropagation();var i=$cfs.children();if(!opts.circular&&itms.first==opts.items.visible)return opts.infinite&&$cfs.trigger(cf_e("prev",conf),itms.total-1),t.stopImmediatePropagation();if(sz_resetMargin(i,opts),!is_number(s)){if("*"!=opts.items.filter){var o=is_number(e.items)?e.items:gn_getVisibleOrg($cfs,opts);s=gn_getScrollItemsNextFilter(i,opts,0,o)}else s=opts.items.visible;s=cf_getAdjust(s,opts,e.items,$tt0)}var n=0==itms.first?itms.total:itms.first;if(!opts.circular){if(opts.items.visibleConf.variable)var r=gn_getVisibleItemsNext(i,opts,s),o=gn_getVisibleItemsPrev(i,opts,n-1);else var r=opts.items.visible,o=opts.items.visible;s+r>n&&(s=n-o)}if(opts.items.visibleConf.old=opts.items.visible,opts.items.visibleConf.variable){for(var r=cf_getItemsAdjust(gn_getVisibleItemsNextTestCircular(i,opts,s,n),opts,opts.items.visibleConf.adjust,$tt0);opts.items.visible-s>=r&&s<itms.total;)s++,r=cf_getItemsAdjust(gn_getVisibleItemsNextTestCircular(i,opts,s,n),opts,opts.items.visibleConf.adjust,$tt0);opts.items.visible=r}else if("*"!=opts.items.filter){var r=gn_getVisibleItemsNextFilter(i,opts,s);opts.items.visible=cf_getItemsAdjust(r,opts,opts.items.visibleConf.adjust,$tt0)}if(sz_resetMargin(i,opts,!0),0==s)return t.stopImmediatePropagation(),debug(conf,"0 items to scroll: Not scrolling.");for(debug(conf,"Scrolling "+s+" items forward."),itms.first-=s;itms.first<0;)itms.first+=itms.total;opts.circular||(itms.first==opts.items.visible&&e.onEnd&&e.onEnd.call($tt0,"next"),opts.infinite||nv_enableNavi(opts,itms.first,conf)),itms.total<opts.items.visible+s&&$cfs.children().slice(0,opts.items.visible+s-itms.total).clone(!0).appendTo($cfs);var i=$cfs.children(),c=gi_getOldItemsNext(i,opts),a=gi_getNewItemsNext(i,opts,s),f=i.eq(s-1),l=c.last(),u=a.last();sz_resetMargin(i,opts);var p=0,d=0;if(opts.align){var g=cf_getAlignPadding(a,opts);p=g[0],d=g[1]}var m=!1,_=$();if(opts.items.visibleConf.old<s&&(_=i.slice(opts.items.visibleConf.old,s),"directscroll"==e.fx)){var b=opts.items[opts.d.width];m=_,f=l,sc_hideHiddenItems(m),opts.items[opts.d.width]="variable"}var v=!1,h=ms_getTotalSize(i.slice(0,s),opts,"width"),w=cf_mapWrapperSizes(ms_getSizes(a,opts,!0),opts,!opts.usePadding),P=0,C={},x={},S={},y={},I={},z=sc_getDuration(e,opts,s,h);switch(e.fx){case"uncover":case"uncover-fade":P=ms_getTotalSize(i.slice(0,opts.items.visibleConf.old),opts,"width")}m&&(opts.items[opts.d.width]=b),opts.align&&opts.padding[opts.d[1]]<0&&(opts.padding[opts.d[1]]=0),sz_resetMargin(i,opts,!0),sz_resetMargin(l,opts,opts.padding[opts.d[1]]),opts.align&&(opts.padding[opts.d[1]]=d,opts.padding[opts.d[3]]=p),I[opts.d.left]=opts.usePadding?opts.padding[opts.d[3]]:0;var j=function(){},N=function(){},k=function(){},O=function(){},T=function(){},M=function(){},F=function(){},A=function(){},H=function(){};switch(e.fx){case"crossfade":case"cover":case"cover-fade":case"uncover":case"uncover-fade":v=$cfs.clone(!0).appendTo($wrp),v.children().slice(opts.items.visibleConf.old).remove()}switch(e.fx){case"crossfade":case"cover":case"cover-fade":$cfs.css("zIndex",1),v.css("zIndex",0)}if(scrl=sc_setScroll(z,e.easing,conf),C[opts.d.left]=-h,x[opts.d.left]=-P,0>p&&(C[opts.d.left]+=p),("variable"==opts[opts.d.width]||"variable"==opts[opts.d.height])&&(j=function(){$wrp.css(w)},N=function(){scrl.anims.push([$wrp,w])}),opts.usePadding){var q=u.data("_cfs_origCssMargin");d>=0&&(q+=opts.padding[opts.d[1]]),u.css(opts.d.marginRight,q),f.not(l).length&&(y[opts.d.marginRight]=l.data("_cfs_origCssMargin")),k=function(){l.css(y)},O=function(){scrl.anims.push([l,y])};var D=f.data("_cfs_origCssMargin");p>0&&(D+=opts.padding[opts.d[3]]),S[opts.d.marginRight]=D,T=function(){f.css(S)},M=function(){scrl.anims.push([f,S])}}H=function(){$cfs.css(I)};var V=opts.items.visible+s-itms.total;A=function(){V>0&&$cfs.children().slice(itms.total).remove();var t=$cfs.children().slice(0,s).appendTo($cfs).last();if(V>0&&(a=gi_getCurrentItems(i,opts)),sc_showHiddenItems(m),opts.usePadding){if(itms.total<opts.items.visible+s){var e=$cfs.children().eq(opts.items.visible-1);e.css(opts.d.marginRight,e.data("_cfs_origCssMargin")+opts.padding[opts.d[1]])}t.css(opts.d.marginRight,t.data("_cfs_origCssMargin"))}};var R=sc_mapCallbackArguments(c,_,a,s,"next",z,w);switch(F=function(){$cfs.css("zIndex",$cfs.data("_cfs_origCssZindex")),sc_afterScroll($cfs,v,e),crsl.isScrolling=!1,clbk.onAfter=sc_fireCallbacks($tt0,e,"onAfter",R,clbk),queu=sc_fireQueue($cfs,queu,conf),crsl.isPaused||$cfs.trigger(cf_e("play",conf))},crsl.isScrolling=!0,tmrs=sc_clearTimers(tmrs),clbk.onBefore=sc_fireCallbacks($tt0,e,"onBefore",R,clbk),e.fx){case"none":$cfs.css(C),j(),k(),T(),H(),A(),F();break;case"fade":scrl.anims.push([$cfs,{opacity:0},function(){j(),k(),T(),H(),A(),scrl=sc_setScroll(z,e.easing,conf),scrl.anims.push([$cfs,{opacity:1},F]),sc_startScroll(scrl,conf)}]);break;case"crossfade":$cfs.css({opacity:0}),scrl.anims.push([v,{opacity:0}]),scrl.anims.push([$cfs,{opacity:1},F]),N(),k(),T(),H(),A();break;case"cover":$cfs.css(opts.d.left,$wrp[opts.d.width]()),scrl.anims.push([$cfs,I,F]),N(),k(),T(),A();break;case"cover-fade":$cfs.css(opts.d.left,$wrp[opts.d.width]()),scrl.anims.push([v,{opacity:0}]),scrl.anims.push([$cfs,I,F]),N(),k(),T(),A();break;case"uncover":scrl.anims.push([v,x,F]),N(),k(),T(),H(),A();break;case"uncover-fade":$cfs.css({opacity:0}),scrl.anims.push([$cfs,{opacity:1}]),scrl.anims.push([v,x,F]),N(),k(),T(),H(),A();break;default:scrl.anims.push([$cfs,C,function(){H(),A(),F()}]),N(),O(),M()}return sc_startScroll(scrl,conf),cf_setCookie(opts.cookie,$cfs,conf),$cfs.trigger(cf_e("updatePageStatus",conf),[!1,w]),!0}),$cfs.bind(cf_e("slideTo",conf),function(t,e,s,i,o,n,r){t.stopPropagation();var c=[e,s,i,o,n,r],a=["string/number/object","number","boolean","object","string","function"],f=cf_sortParams(c,a);return o=f[3],n=f[4],r=f[5],e=gn_getItemIndex(f[0],f[1],f[2],itms,$cfs),0==e?!1:(is_object(o)||(o=!1),"prev"!=n&&"next"!=n&&(n=opts.circular?e<=itms.total/2?"next":"prev":0==itms.first||itms.first>e?"next":"prev"),"prev"==n&&(e=itms.total-e),$cfs.trigger(cf_e(n,conf),[o,e,r]),!0)}),$cfs.bind(cf_e("prevPage",conf),function(t,e,s){t.stopPropagation();var i=$cfs.triggerHandler(cf_e("currentPage",conf));return $cfs.triggerHandler(cf_e("slideToPage",conf),[i-1,e,"prev",s])}),$cfs.bind(cf_e("nextPage",conf),function(t,e,s){t.stopPropagation();var i=$cfs.triggerHandler(cf_e("currentPage",conf));return $cfs.triggerHandler(cf_e("slideToPage",conf),[i+1,e,"next",s])}),$cfs.bind(cf_e("slideToPage",conf),function(t,e,s,i,o){t.stopPropagation(),is_number(e)||(e=$cfs.triggerHandler(cf_e("currentPage",conf)));var n=opts.pagination.items||opts.items.visible,r=Math.ceil(itms.total/n)-1;return 0>e&&(e=r),e>r&&(e=0),$cfs.triggerHandler(cf_e("slideTo",conf),[e*n,0,!0,s,i,o])}),$cfs.bind(cf_e("jumpToStart",conf),function(t,e){if(t.stopPropagation(),e=e?gn_getItemIndex(e,0,!0,itms,$cfs):0,e+=itms.first,0!=e){if(itms.total>0)for(;e>itms.total;)e-=itms.total;$cfs.prepend($cfs.children().slice(e,itms.total))}return!0}),$cfs.bind(cf_e("synchronise",conf),function(t,e){if(t.stopPropagation(),e)e=cf_getSynchArr(e);else{if(!opts.synchronise)return debug(conf,"No carousel to synchronise.");e=opts.synchronise}for(var s=$cfs.triggerHandler(cf_e("currentPosition",conf)),i=!0,o=0,n=e.length;n>o;o++)e[o][0].triggerHandler(cf_e("slideTo",conf),[s,e[o][3],!0])||(i=!1);return i}),$cfs.bind(cf_e("queue",conf),function(t,e,s){return t.stopPropagation(),is_function(e)?e.call($tt0,queu):is_array(e)?queu=e:is_undefined(e)||queu.push([e,s]),queu}),$cfs.bind(cf_e("insertItem",conf),function(t,e,s,i,o){t.stopPropagation();var n=[e,s,i,o],r=["string/object","string/number/object","boolean","number"],c=cf_sortParams(n,r);if(e=c[0],s=c[1],i=c[2],o=c[3],is_object(e)&&!is_jquery(e)?e=$(e):is_string(e)&&(e=$(e)),!is_jquery(e)||0==e.length)return debug(conf,"Not a valid object.");is_undefined(s)&&(s="end"),sz_storeMargin(e,opts),sz_storeOrigCss(e);var a=s,f="before";"end"==s?i?(0==itms.first?(s=itms.total-1,f="after"):(s=itms.first,itms.first+=e.length),0>s&&(s=0)):(s=itms.total-1,f="after"):s=gn_getItemIndex(s,o,i,itms,$cfs);var l=$cfs.children().eq(s);return l.length?l[f](e):(debug(conf,"Correct insert-position not found! Appending item to the end."),$cfs.append(e)),"end"==a||i||s<itms.first&&(itms.first+=e.length),itms.total=$cfs.children().length,itms.first>=itms.total&&(itms.first-=itms.total),$cfs.trigger(cf_e("updateSizes",conf)),$cfs.trigger(cf_e("linkAnchors",conf)),!0}),$cfs.bind(cf_e("removeItem",conf),function(t,e,s,i){t.stopPropagation();var o=[e,s,i],n=["string/number/object","boolean","number"],r=cf_sortParams(o,n);e=r[0],s=r[1],i=r[2];if(e instanceof $&&e.length>1)return c=$(),e.each(function(){var t=$cfs.trigger(cf_e("removeItem",conf),[$(this),s,i]);t&&(c=c.add(t))}),c;if(is_undefined(e)||"end"==e)c=$cfs.children().last();else{e=gn_getItemIndex(e,i,s,itms,$cfs);var c=$cfs.children().eq(e);c.length&&e<itms.first&&(itms.first-=c.length)}return c&&c.length&&(c.detach(),itms.total=$cfs.children().length,$cfs.trigger(cf_e("updateSizes",conf))),c}),$cfs.bind(cf_e("onBefore",conf)+" "+cf_e("onAfter",conf),function(t,e){t.stopPropagation();var s=t.type.slice(conf.events.prefix.length);return is_array(e)&&(clbk[s]=e),is_function(e)&&clbk[s].push(e),clbk[s]}),$cfs.bind(cf_e("currentPosition",conf),function(t,e){if(t.stopPropagation(),0==itms.first)var s=0;else var s=itms.total-itms.first;return is_function(e)&&e.call($tt0,s),s}),$cfs.bind(cf_e("currentPage",conf),function(t,e){t.stopPropagation();var s,i=opts.pagination.items||opts.items.visible,o=Math.ceil(itms.total/i-1);return s=0==itms.first?0:itms.first<itms.total%i?0:itms.first!=i||opts.circular?Math.round((itms.total-itms.first)/i):o,0>s&&(s=0),s>o&&(s=o),is_function(e)&&e.call($tt0,s),s}),$cfs.bind(cf_e("currentVisible",conf),function(t,e){t.stopPropagation();var s=gi_getCurrentItems($cfs.children(),opts);return is_function(e)&&e.call($tt0,s),s}),$cfs.bind(cf_e("slice",conf),function(t,e,s,i){if(t.stopPropagation(),0==itms.total)return!1;var o=[e,s,i],n=["number","number","function"],r=cf_sortParams(o,n);if(e=is_number(r[0])?r[0]:0,s=is_number(r[1])?r[1]:itms.total,i=r[2],e+=itms.first,s+=itms.first,items.total>0){for(;e>itms.total;)e-=itms.total;for(;s>itms.total;)s-=itms.total;for(;0>e;)e+=itms.total;for(;0>s;)s+=itms.total}var c,a=$cfs.children();return c=s>e?a.slice(e,s):$(a.slice(e,itms.total).get().concat(a.slice(0,s).get())),is_function(i)&&i.call($tt0,c),c}),$cfs.bind(cf_e("isPaused",conf)+" "+cf_e("isStopped",conf)+" "+cf_e("isScrolling",conf),function(t,e){t.stopPropagation();var s=t.type.slice(conf.events.prefix.length),i=crsl[s];return is_function(e)&&e.call($tt0,i),i}),$cfs.bind(cf_e("configuration",conf),function(e,a,b,c){e.stopPropagation();var reInit=!1;if(is_function(a))a.call($tt0,opts);else if(is_object(a))opts_orig=$.extend(!0,{},opts_orig,a),b!==!1?reInit=!0:opts=$.extend(!0,{},opts,a);else if(!is_undefined(a))if(is_function(b)){var val=eval("opts."+a);is_undefined(val)&&(val=""),b.call($tt0,val)}else{if(is_undefined(b))return eval("opts."+a);"boolean"!=typeof c&&(c=!0),eval("opts_orig."+a+" = b"),c!==!1?reInit=!0:eval("opts."+a+" = b")}if(reInit){sz_resetMargin($cfs.children(),opts),FN._init(opts_orig),FN._bind_buttons();var sz=sz_setSizes($cfs,opts);$cfs.trigger(cf_e("updatePageStatus",conf),[!0,sz])}return opts}),$cfs.bind(cf_e("linkAnchors",conf),function(t,e,s){return t.stopPropagation(),is_undefined(e)?e=$("body"):is_string(e)&&(e=$(e)),is_jquery(e)&&0!=e.length?(is_string(s)||(s="a.caroufredsel"),e.find(s).each(function(){var t=this.hash||"";t.length>0&&-1!=$cfs.children().index($(t))&&$(this).unbind("click").click(function(e){e.preventDefault(),$cfs.trigger(cf_e("slideTo",conf),t)})}),!0):debug(conf,"Not a valid object.")}),$cfs.bind(cf_e("updatePageStatus",conf),function(t,e){if(t.stopPropagation(),opts.pagination.container){var s=opts.pagination.items||opts.items.visible,i=Math.ceil(itms.total/s);e&&(opts.pagination.anchorBuilder&&(opts.pagination.container.children().remove(),opts.pagination.container.each(function(){for(var t=0;i>t;t++){var e=$cfs.children().eq(gn_getItemIndex(t*s,0,!0,itms,$cfs));$(this).append(opts.pagination.anchorBuilder.call(e[0],t+1))}})),opts.pagination.container.each(function(){$(this).children().unbind(opts.pagination.event).each(function(t){$(this).bind(opts.pagination.event,function(e){e.preventDefault(),$cfs.trigger(cf_e("slideTo",conf),[t*s,-opts.pagination.deviation,!0,opts.pagination])})})}));var o=$cfs.triggerHandler(cf_e("currentPage",conf))+opts.pagination.deviation;return o>=i&&(o=0),0>o&&(o=i-1),opts.pagination.container.each(function(){$(this).children().removeClass(cf_c("selected",conf)).eq(o).addClass(cf_c("selected",conf))}),!0}}),$cfs.bind(cf_e("updateSizes",conf),function(){var t=opts.items.visible,e=$cfs.children(),s=ms_getParentSize($wrp,opts,"width");if(itms.total=e.length,crsl.primarySizePercentage?(opts.maxDimension=s,opts[opts.d.width]=ms_getPercentage(s,crsl.primarySizePercentage)):opts.maxDimension=ms_getMaxDimension(opts,s),opts.responsive?(opts.items.width=opts.items.sizesConf.width,opts.items.height=opts.items.sizesConf.height,opts=in_getResponsiveValues(opts,e,s),t=opts.items.visible,sz_setResponsiveSizes(opts,e)):opts.items.visibleConf.variable?t=gn_getVisibleItemsNext(e,opts,0):"*"!=opts.items.filter&&(t=gn_getVisibleItemsNextFilter(e,opts,0)),!opts.circular&&0!=itms.first&&t>itms.first){if(opts.items.visibleConf.variable)var i=gn_getVisibleItemsPrev(e,opts,itms.first)-itms.first;else if("*"!=opts.items.filter)var i=gn_getVisibleItemsPrevFilter(e,opts,itms.first)-itms.first;else var i=opts.items.visible-itms.first;debug(conf,"Preventing non-circular: sliding "+i+" items backward."),$cfs.trigger(cf_e("prev",conf),i)}opts.items.visible=cf_getItemsAdjust(t,opts,opts.items.visibleConf.adjust,$tt0),opts.items.visibleConf.old=opts.items.visible,opts=in_getAlignPadding(opts,e);var o=sz_setSizes($cfs,opts);return $cfs.trigger(cf_e("updatePageStatus",conf),[!0,o]),nv_showNavi(opts,itms.total,conf),nv_enableNavi(opts,itms.first,conf),o}),$cfs.bind(cf_e("destroy",conf),function(t,e){return t.stopPropagation(),tmrs=sc_clearTimers(tmrs),$cfs.data("_cfs_isCarousel",!1),$cfs.trigger(cf_e("finish",conf)),e&&$cfs.trigger(cf_e("jumpToStart",conf)),sz_restoreOrigCss($cfs.children()),sz_restoreOrigCss($cfs),FN._unbind_events(),FN._unbind_buttons(),"parent"==conf.wrapper?sz_restoreOrigCss($wrp):$wrp.replaceWith($cfs),!0}),$cfs.bind(cf_e("debug",conf),function(){return debug(conf,"Carousel width: "+opts.width),debug(conf,"Carousel height: "+opts.height),debug(conf,"Item widths: "+opts.items.width),debug(conf,"Item heights: "+opts.items.height),debug(conf,"Number of items visible: "+opts.items.visible),opts.auto.play&&debug(conf,"Number of items scrolled automatically: "+opts.auto.items),opts.prev.button&&debug(conf,"Number of items scrolled backward: "+opts.prev.items),opts.next.button&&debug(conf,"Number of items scrolled forward: "+opts.next.items),conf.debug}),$cfs.bind("_cfs_triggerEvent",function(t,e,s){return t.stopPropagation(),$cfs.triggerHandler(cf_e(e,conf),s)})},FN._unbind_events=function(){$cfs.unbind(cf_e("",conf)),$cfs.unbind(cf_e("",conf,!1)),$cfs.unbind("_cfs_triggerEvent")},FN._bind_buttons=function(){if(FN._unbind_buttons(),nv_showNavi(opts,itms.total,conf),nv_enableNavi(opts,itms.first,conf),opts.auto.pauseOnHover){var t=bt_pauseOnHoverConfig(opts.auto.pauseOnHover);$wrp.bind(cf_e("mouseenter",conf,!1),function(){$cfs.trigger(cf_e("pause",conf),t)}).bind(cf_e("mouseleave",conf,!1),function(){$cfs.trigger(cf_e("resume",conf))})}if(opts.auto.button&&opts.auto.button.bind(cf_e(opts.auto.event,conf,!1),function(t){t.preventDefault();var e=!1,s=null;crsl.isPaused?e="play":opts.auto.pauseOnEvent&&(e="pause",s=bt_pauseOnHoverConfig(opts.auto.pauseOnEvent)),e&&$cfs.trigger(cf_e(e,conf),s)}),opts.prev.button&&(opts.prev.button.bind(cf_e(opts.prev.event,conf,!1),function(t){t.preventDefault(),$cfs.trigger(cf_e("prev",conf))}),opts.prev.pauseOnHover)){var t=bt_pauseOnHoverConfig(opts.prev.pauseOnHover);opts.prev.button.bind(cf_e("mouseenter",conf,!1),function(){$cfs.trigger(cf_e("pause",conf),t)}).bind(cf_e("mouseleave",conf,!1),function(){$cfs.trigger(cf_e("resume",conf))})}if(opts.next.button&&(opts.next.button.bind(cf_e(opts.next.event,conf,!1),function(t){t.preventDefault(),$cfs.trigger(cf_e("next",conf))}),opts.next.pauseOnHover)){var t=bt_pauseOnHoverConfig(opts.next.pauseOnHover);opts.next.button.bind(cf_e("mouseenter",conf,!1),function(){$cfs.trigger(cf_e("pause",conf),t)}).bind(cf_e("mouseleave",conf,!1),function(){$cfs.trigger(cf_e("resume",conf))})}if(opts.pagination.container&&opts.pagination.pauseOnHover){var t=bt_pauseOnHoverConfig(opts.pagination.pauseOnHover);opts.pagination.container.bind(cf_e("mouseenter",conf,!1),function(){$cfs.trigger(cf_e("pause",conf),t)}).bind(cf_e("mouseleave",conf,!1),function(){$cfs.trigger(cf_e("resume",conf))})}if((opts.prev.key||opts.next.key)&&$(document).bind(cf_e("keyup",conf,!1,!0,!0),function(t){var e=t.keyCode;e==opts.next.key&&(t.preventDefault(),$cfs.trigger(cf_e("next",conf))),e==opts.prev.key&&(t.preventDefault(),$cfs.trigger(cf_e("prev",conf)))}),opts.pagination.keys&&$(document).bind(cf_e("keyup",conf,!1,!0,!0),function(t){var e=t.keyCode;e>=49&&58>e&&(e=(e-49)*opts.items.visible,e<=itms.total&&(t.preventDefault(),$cfs.trigger(cf_e("slideTo",conf),[e,0,!0,opts.pagination])))}),$.fn.swipe){var e="ontouchstart"in window;if(e&&opts.swipe.onTouch||!e&&opts.swipe.onMouse){var s=$.extend(!0,{},opts.prev,opts.swipe),i=$.extend(!0,{},opts.next,opts.swipe),o=function(){$cfs.trigger(cf_e("prev",conf),[s])},n=function(){$cfs.trigger(cf_e("next",conf),[i])};switch(opts.direction){case"up":case"down":opts.swipe.options.swipeUp=n,opts.swipe.options.swipeDown=o;break;default:opts.swipe.options.swipeLeft=n,opts.swipe.options.swipeRight=o}crsl.swipe&&$cfs.swipe("destroy"),$wrp.swipe(opts.swipe.options),$wrp.css("cursor","move"),crsl.swipe=!0}}if($.fn.mousewheel&&opts.mousewheel){var r=$.extend(!0,{},opts.prev,opts.mousewheel),c=$.extend(!0,{},opts.next,opts.mousewheel);crsl.mousewheel&&$wrp.unbind(cf_e("mousewheel",conf,!1)),$wrp.bind(cf_e("mousewheel",conf,!1),function(t,e){t.preventDefault(),e>0?$cfs.trigger(cf_e("prev",conf),[r]):$cfs.trigger(cf_e("next",conf),[c])}),crsl.mousewheel=!0}if(opts.auto.play&&$cfs.trigger(cf_e("play",conf),opts.auto.delay),crsl.upDateOnWindowResize){var a=function(){$cfs.trigger(cf_e("finish",conf)),opts.auto.pauseOnResize&&!crsl.isPaused&&$cfs.trigger(cf_e("play",conf)),sz_resetMargin($cfs.children(),opts),$cfs.trigger(cf_e("updateSizes",conf))},f=$(window),l=null;if($.debounce&&"debounce"==conf.onWindowResize)l=$.debounce(200,a);else if($.throttle&&"throttle"==conf.onWindowResize)l=$.throttle(300,a);else{var u=0,p=0;l=function(){var t=f.width(),e=f.height();(t!=u||e!=p)&&(a(),u=t,p=e)}}f.bind(cf_e("resize",conf,!1,!0,!0),l)}},FN._unbind_buttons=function(){var t=(cf_e("",conf),cf_e("",conf,!1));ns3=cf_e("",conf,!1,!0,!0),$(document).unbind(ns3),$(window).unbind(ns3),$wrp.unbind(t),opts.auto.button&&opts.auto.button.unbind(t),opts.prev.button&&opts.prev.button.unbind(t),opts.next.button&&opts.next.button.unbind(t),opts.pagination.container&&(opts.pagination.container.unbind(t),opts.pagination.anchorBuilder&&opts.pagination.container.children().remove()),crsl.swipe&&($cfs.swipe("destroy"),$wrp.css("cursor","default"),crsl.swipe=!1),crsl.mousewheel&&(crsl.mousewheel=!1),nv_showNavi(opts,"hide",conf),nv_enableNavi(opts,"removeClass",conf)},is_boolean(configs)&&(configs={debug:configs});var crsl={direction:"next",isPaused:!0,isScrolling:!1,isStopped:!1,mousewheel:!1,swipe:!1},itms={total:$cfs.children().length,first:0},tmrs={auto:null,progress:null,startTime:getTime(),timePassed:0},scrl={isStopped:!1,duration:0,startTime:0,easing:"",anims:[]},clbk={onBefore:[],onAfter:[]},queu=[],conf=$.extend(!0,{},$.fn.carouFredSel.configs,configs),opts={},opts_orig=$.extend(!0,{},options),$wrp="parent"==conf.wrapper?$cfs.parent():$cfs.wrap("<"+conf.wrapper.element+' class="'+conf.wrapper.classname+'" />').parent();if(conf.selector=$cfs.selector,conf.serialNumber=$.fn.carouFredSel.serialNumber++,conf.transition=conf.transition&&$.fn.transition?"transition":"animate",FN._init(opts_orig,!0,starting_position),FN._build(),FN._bind_events(),FN._bind_buttons(),is_array(opts.items.start))var start_arr=opts.items.start;else{var start_arr=[];0!=opts.items.start&&start_arr.push(opts.items.start)}if(opts.cookie&&start_arr.unshift(parseInt(cf_getCookie(opts.cookie),10)),start_arr.length>0)for(var a=0,l=start_arr.length;l>a;a++){var s=start_arr[a];if(0!=s){if(s===!0){if(s=window.location.hash,s.length<1)continue}else"random"===s&&(s=Math.floor(Math.random()*itms.total));if($cfs.triggerHandler(cf_e("slideTo",conf),[s,0,!0,{fx:"none"}]))break}}var siz=sz_setSizes($cfs,opts),itm=gi_getCurrentItems($cfs.children(),opts);return opts.onCreate&&opts.onCreate.call($tt0,{width:siz.width,height:siz.height,items:itm}),$cfs.trigger(cf_e("updatePageStatus",conf),[!0,siz]),$cfs.trigger(cf_e("linkAnchors",conf)),conf.debug&&$cfs.trigger(cf_e("debug",conf)),$cfs},$.fn.carouFredSel.serialNumber=1,$.fn.carouFredSel.defaults={synchronise:!1,infinite:!0,circular:!0,responsive:!1,direction:"left",items:{start:0},scroll:{easing:"swing",duration:500,pauseOnHover:!1,event:"click",queue:!1}},$.fn.carouFredSel.configs={debug:!1,transition:!1,onWindowResize:"throttle",events:{prefix:"",namespace:"cfs"},wrapper:{element:"div",classname:"caroufredsel_wrapper"},classnames:{}},$.fn.carouFredSel.pageAnchorBuilder=function(t){return'<a href="#"><span>'+t+"</span></a>"},$.fn.carouFredSel.progressbarUpdater=function(t){$(this).css("width",t+"%")},$.fn.carouFredSel.cookie={get:function(t){t+="=";for(var e=document.cookie.split(";"),s=0,i=e.length;i>s;s++){for(var o=e[s];" "==o.charAt(0);)o=o.slice(1);if(0==o.indexOf(t))return o.slice(t.length)}return 0},set:function(t,e,s){var i="";if(s){var o=new Date;o.setTime(o.getTime()+24*s*60*60*1e3),i="; expires="+o.toGMTString()}document.cookie=t+"="+e+i+"; path=/"},remove:function(t){$.fn.carouFredSel.cookie.set(t,"",-1)}},$.extend($.easing,{quadratic:function(t){var e=t*t;return t*(-e*t+4*e-6*t+4)},cubic:function(t){return t*(4*t*t-9*t+6)},elastic:function(t){var e=t*t;return t*(33*e*e-106*e*t+126*e-67*t+15)}}))}(jQuery);
1
+ !function($){function sc_setScroll(t,e,s){return"transition"==s.transition&&"swing"==e&&(e="ease"),{anims:[],duration:t,orgDuration:t,easing:e,startTime:getTime()}}function sc_startScroll(t,e){for(var s=0,i=t.anims.length;i>s;s++){var o=t.anims[s];o&&o[0][e.transition](o[1],t.duration,t.easing,o[2])}}function sc_stopScroll(t,e){is_boolean(e)||(e=!0),is_object(t.pre)&&sc_stopScroll(t.pre,e);for(var s=0,i=t.anims.length;i>s;s++){var o=t.anims[s];o[0].stop(!0),e&&(o[0].css(o[1]),is_function(o[2])&&o[2]())}is_object(t.post)&&sc_stopScroll(t.post,e)}function sc_afterScroll(t,e,s){switch(e&&e.remove(),s.fx){case"fade":case"crossfade":case"cover-fade":case"uncover-fade":t.css("opacity",1),t.css("filter","")}}function sc_fireCallbacks(t,e,s,i,o){if(e[s]&&e[s].call(t,i),o[s].length)for(var n=0,r=o[s].length;r>n;n++)o[s][n].call(t,i);return[]}function sc_fireQueue(t,e,s){return e.length&&(t.trigger(cf_e(e[0][0],s),e[0][1]),e.shift()),e}function sc_hideHiddenItems(t){t.each(function(){var t=$(this);t.data("_cfs_isHidden",t.is(":hidden")).hide()})}function sc_showHiddenItems(t){t&&t.each(function(){var t=$(this);t.data("_cfs_isHidden")||t.show()})}function sc_clearTimers(t){return t.auto&&clearTimeout(t.auto),t.progress&&clearInterval(t.progress),t}function sc_mapCallbackArguments(t,e,s,i,o,n,r){return{width:r.width,height:r.height,items:{old:t,skipped:e,visible:s},scroll:{items:i,direction:o,duration:n}}}function sc_getDuration(t,e,s,i){var o=t.duration;return"none"==t.fx?0:("auto"==o?o=e.scroll.duration/e.scroll.items*s:10>o&&(o=i/o),1>o?0:("fade"==t.fx&&(o/=2),Math.round(o)))}function nv_showNavi(t,e,s){var i=is_number(t.items.minimum)?t.items.minimum:t.items.visible+1;if("show"==e||"hide"==e)var o=e;else if(i>e){debug(s,"Not enough items ("+e+" total, "+i+" needed): Hiding navigation.");var o="hide"}else var o="show";var n="show"==o?"removeClass":"addClass",r=cf_c("hidden",s);t.auto.button&&t.auto.button[o]()[n](r),t.prev.button&&t.prev.button[o]()[n](r),t.next.button&&t.next.button[o]()[n](r),t.pagination.container&&t.pagination.container[o]()[n](r)}function nv_enableNavi(t,e,s){if(!t.circular&&!t.infinite){var i="removeClass"==e||"addClass"==e?e:!1,o=cf_c("disabled",s);if(t.auto.button&&i&&t.auto.button[i](o),t.prev.button){var n=i||0==e?"addClass":"removeClass";t.prev.button[n](o)}if(t.next.button){var n=i||e==t.items.visible?"addClass":"removeClass";t.next.button[n](o)}}}function go_getObject(t,e){return is_function(e)?e=e.call(t):is_undefined(e)&&(e={}),e}function go_getItemsObject(t,e){return e=go_getObject(t,e),is_number(e)?e={visible:e}:"variable"==e?e={visible:e,width:e,height:e}:is_object(e)||(e={}),e}function go_getScrollObject(t,e){return e=go_getObject(t,e),is_number(e)?e=50>=e?{items:e}:{duration:e}:is_string(e)?e={easing:e}:is_object(e)||(e={}),e}function go_getNaviObject(t,e){if(e=go_getObject(t,e),is_string(e)){var s=cf_getKeyCode(e);e=-1==s?$(e):s}return e}function go_getAutoObject(t,e){return e=go_getNaviObject(t,e),is_jquery(e)?e={button:e}:is_boolean(e)?e={play:e}:is_number(e)&&(e={timeoutDuration:e}),e.progress&&(is_string(e.progress)||is_jquery(e.progress))&&(e.progress={bar:e.progress}),e}function go_complementAutoObject(t,e){return is_function(e.button)&&(e.button=e.button.call(t)),is_string(e.button)&&(e.button=$(e.button)),is_boolean(e.play)||(e.play=!0),is_number(e.delay)||(e.delay=0),is_undefined(e.pauseOnEvent)&&(e.pauseOnEvent=!0),is_boolean(e.pauseOnResize)||(e.pauseOnResize=!0),is_number(e.timeoutDuration)||(e.timeoutDuration=e.duration<10?2500:5*e.duration),e.progress&&(is_function(e.progress.bar)&&(e.progress.bar=e.progress.bar.call(t)),is_string(e.progress.bar)&&(e.progress.bar=$(e.progress.bar)),e.progress.bar?(is_function(e.progress.updater)||(e.progress.updater=$.fn.carouFredSel.progressbarUpdater),is_number(e.progress.interval)||(e.progress.interval=50)):e.progress=!1),e}function go_getPrevNextObject(t,e){return e=go_getNaviObject(t,e),is_jquery(e)?e={button:e}:is_number(e)&&(e={key:e}),e}function go_complementPrevNextObject(t,e){return is_function(e.button)&&(e.button=e.button.call(t)),is_string(e.button)&&(e.button=$(e.button)),is_string(e.key)&&(e.key=cf_getKeyCode(e.key)),e}function go_getPaginationObject(t,e){return e=go_getNaviObject(t,e),is_jquery(e)?e={container:e}:is_boolean(e)&&(e={keys:e}),e}function go_complementPaginationObject(t,e){return is_function(e.container)&&(e.container=e.container.call(t)),is_string(e.container)&&(e.container=$(e.container)),is_number(e.items)||(e.items=!1),is_boolean(e.keys)||(e.keys=!1),is_function(e.anchorBuilder)||is_false(e.anchorBuilder)||(e.anchorBuilder=$.fn.carouFredSel.pageAnchorBuilder),is_number(e.deviation)||(e.deviation=0),e}function go_getSwipeObject(t,e){return is_function(e)&&(e=e.call(t)),is_undefined(e)&&(e={onTouch:!1}),is_true(e)?e={onTouch:e}:is_number(e)&&(e={items:e}),e}function go_complementSwipeObject(t,e){return is_boolean(e.onTouch)||(e.onTouch=!0),is_boolean(e.onMouse)||(e.onMouse=!1),is_object(e.options)||(e.options={}),is_boolean(e.options.triggerOnTouchEnd)||(e.options.triggerOnTouchEnd=!1),e}function go_getMousewheelObject(t,e){return is_function(e)&&(e=e.call(t)),is_true(e)?e={}:is_number(e)?e={items:e}:is_undefined(e)&&(e=!1),e}function go_complementMousewheelObject(t,e){return e}function gn_getItemIndex(t,e,s,i,o){if(is_string(t)&&(t=$(t,o)),is_object(t)&&(t=$(t,o)),is_jquery(t)?(t=o.children().index(t),is_boolean(s)||(s=!1)):is_boolean(s)||(s=!0),is_number(t)||(t=0),is_number(e)||(e=0),s&&(t+=i.first),t+=e,i.total>0){for(;t>=i.total;)t-=i.total;for(;0>t;)t+=i.total}return t}function gn_getVisibleItemsPrev(t,e,s){for(var i=0,o=0,n=s;n>=0;n--){var r=t.eq(n);if(i+=r.is(":visible")?r[e.d.outerWidth](!0):0,i>e.maxDimension)return o;0==n&&(n=t.length),o++}}function gn_getVisibleItemsPrevFilter(t,e,s){return gn_getItemsPrevFilter(t,e.items.filter,e.items.visibleConf.org,s)}function gn_getScrollItemsPrevFilter(t,e,s,i){return gn_getItemsPrevFilter(t,e.items.filter,i,s)}function gn_getItemsPrevFilter(t,e,s,i){for(var o=0,n=0,r=i,c=t.length;r>=0;r--){if(n++,n==c)return n;var a=t.eq(r);if(a.is(e)&&(o++,o==s))return n;0==r&&(r=c)}}function gn_getVisibleOrg(t,e){return e.items.visibleConf.org||t.children().slice(0,e.items.visible).filter(e.items.filter).length}function gn_getVisibleItemsNext(t,e,s){for(var i=0,o=0,n=s,r=t.length-1;r>=n;n++){var c=t.eq(n);if(i+=c.is(":visible")?c[e.d.outerWidth](!0):0,i>e.maxDimension)return o;if(o++,o==r+1)return o;n==r&&(n=-1)}}function gn_getVisibleItemsNextTestCircular(t,e,s,i){var o=gn_getVisibleItemsNext(t,e,s);return e.circular||s+o>i&&(o=i-s),o}function gn_getVisibleItemsNextFilter(t,e,s){return gn_getItemsNextFilter(t,e.items.filter,e.items.visibleConf.org,s,e.circular)}function gn_getScrollItemsNextFilter(t,e,s,i){return gn_getItemsNextFilter(t,e.items.filter,i+1,s,e.circular)-1}function gn_getItemsNextFilter(t,e,s,i){for(var o=0,n=0,r=i,c=t.length-1;c>=r;r++){if(n++,n>=c)return n;var a=t.eq(r);if(a.is(e)&&(o++,o==s))return n;r==c&&(r=-1)}}function gi_getCurrentItems(t,e){return t.slice(0,e.items.visible)}function gi_getOldItemsPrev(t,e,s){return t.slice(s,e.items.visibleConf.old+s)}function gi_getNewItemsPrev(t,e){return t.slice(0,e.items.visible)}function gi_getOldItemsNext(t,e){return t.slice(0,e.items.visibleConf.old)}function gi_getNewItemsNext(t,e,s){return t.slice(s,e.items.visible+s)}function sz_storeMargin(t,e,s){e.usePadding&&(is_string(s)||(s="_cfs_origCssMargin"),t.each(function(){var t=$(this),i=parseInt(t.css(e.d.marginRight),10);is_number(i)||(i=0),t.data(s,i)}))}function sz_resetMargin(t,e,s){if(e.usePadding){var i=is_boolean(s)?s:!1;is_number(s)||(s=0),sz_storeMargin(t,e,"_cfs_tempCssMargin"),t.each(function(){var t=$(this);t.css(e.d.marginRight,i?t.data("_cfs_tempCssMargin"):s+t.data("_cfs_origCssMargin"))})}}function sz_storeOrigCss(t){t.each(function(){var t=$(this);t.data("_cfs_origCss",t.attr("style")||"")})}function sz_restoreOrigCss(t){t.each(function(){var t=$(this);t.attr("style",t.data("_cfs_origCss")||"")})}function sz_setResponsiveSizes(t,e){var s=(t.items.visible,t.items[t.d.width]),i=t[t.d.height],o=is_percentage(i);e.each(function(){var e=$(this),n=s-ms_getPaddingBorderMargin(e,t,"Width");e[t.d.width](n),o&&e[t.d.height](ms_getPercentage(n,i))})}function sz_setSizes(t,e){var s=t.parent(),i=t.children(),o=gi_getCurrentItems(i,e),n=cf_mapWrapperSizes(ms_getSizes(o,e,!0),e,!1);if(s.css(n),e.usePadding){var r=e.padding,c=r[e.d[1]];e.align&&0>c&&(c=0);var a=o.last();a.css(e.d.marginRight,a.data("_cfs_origCssMargin")+c),t.css(e.d.top,r[e.d[0]]),t.css(e.d.left,r[e.d[3]])}return t.css(e.d.width,n[e.d.width]+2*ms_getTotalSize(i,e,"width")),t.css(e.d.height,ms_getLargestSize(i,e,"height")),n}function ms_getSizes(t,e,s){return[ms_getTotalSize(t,e,"width",s),ms_getLargestSize(t,e,"height",s)]}function ms_getLargestSize(t,e,s,i){return is_boolean(i)||(i=!1),is_number(e[e.d[s]])&&i?e[e.d[s]]:is_number(e.items[e.d[s]])?e.items[e.d[s]]:(s=s.toLowerCase().indexOf("width")>-1?"outerWidth":"outerHeight",ms_getTrueLargestSize(t,e,s))}function ms_getTrueLargestSize(t,e,s){for(var i=0,o=0,n=t.length;n>o;o++){var r=t.eq(o),c=r.is(":visible")?r[e.d[s]](!0):0;c>i&&(i=c)}return i}function ms_getTotalSize(t,e,s,i){if(is_boolean(i)||(i=!1),is_number(e[e.d[s]])&&i)return e[e.d[s]];if(is_number(e.items[e.d[s]]))return e.items[e.d[s]]*t.length;for(var o=s.toLowerCase().indexOf("width")>-1?"outerWidth":"outerHeight",n=0,r=0,c=t.length;c>r;r++){var a=t.eq(r);n+=a.is(":visible")?a[e.d[o]](!0):0}return n}function ms_getParentSize(t,e,s){var i=t.is(":visible");i&&t.hide();var o=t.parent()[e.d[s]]();return i&&t.show(),o}function ms_getMaxDimension(t,e){return is_number(t[t.d.width])?t[t.d.width]:e}function ms_hasVariableSizes(t,e,s){for(var i=!1,o=!1,n=0,r=t.length;r>n;n++){var c=t.eq(n),a=c.is(":visible")?c[e.d[s]](!0):0;i===!1?i=a:i!=a&&(o=!0),0==i&&(o=!0)}return o}function ms_getPaddingBorderMargin(t,e,s){return t[e.d["outer"+s]](!0)-t[e.d[s.toLowerCase()]]()}function ms_getPercentage(t,e){if(is_percentage(e)){if(e=parseInt(e.slice(0,-1),10),!is_number(e))return t;t*=e/100}return t}function cf_e(t,e,s,i,o){return is_boolean(s)||(s=!0),is_boolean(i)||(i=!0),is_boolean(o)||(o=!1),s&&(t=e.events.prefix+t),i&&(t=t+"."+e.events.namespace),i&&o&&(t+=e.serialNumber),t}function cf_c(t,e){return is_string(e.classnames[t])?e.classnames[t]:t}function cf_mapWrapperSizes(t,e,s){is_boolean(s)||(s=!0);var i=e.usePadding&&s?e.padding:[0,0,0,0],o={};return o[e.d.width]=t[0]+i[1]+i[3],o[e.d.height]=t[1]+i[0]+i[2],o}function cf_sortParams(t,e){for(var s=[],i=0,o=t.length;o>i;i++)for(var n=0,r=e.length;r>n;n++)if(e[n].indexOf(typeof t[i])>-1&&is_undefined(s[n])){s[n]=t[i];break}return s}function cf_getPadding(t){if(is_undefined(t))return[0,0,0,0];if(is_number(t))return[t,t,t,t];if(is_string(t)&&(t=t.split("px").join("").split("em").join("").split(" ")),!is_array(t))return[0,0,0,0];for(var e=0;4>e;e++)t[e]=parseInt(t[e],10);switch(t.length){case 0:return[0,0,0,0];case 1:return[t[0],t[0],t[0],t[0]];case 2:return[t[0],t[1],t[0],t[1]];case 3:return[t[0],t[1],t[2],t[1]];default:return[t[0],t[1],t[2],t[3]]}}function cf_getAlignPadding(t,e){var s=is_number(e[e.d.width])?Math.ceil(e[e.d.width]-ms_getTotalSize(t,e,"width")):0;switch(e.align){case"left":return[0,s];case"right":return[s,0];case"center":default:return[Math.ceil(s/2),Math.floor(s/2)]}}function cf_getDimensions(t){for(var e=[["width","innerWidth","outerWidth","height","innerHeight","outerHeight","left","top","marginRight",0,1,2,3],["height","innerHeight","outerHeight","width","innerWidth","outerWidth","top","left","marginBottom",3,2,1,0]],s=e[0].length,i="right"==t.direction||"left"==t.direction?0:1,o={},n=0;s>n;n++)o[e[0][n]]=e[i][n];return o}function cf_getAdjust(t,e,s,i){var o=t;if(is_function(s))o=s.call(i,o);else if(is_string(s)){var n=s.split("+"),r=s.split("-");if(r.length>n.length)var c=!0,a=r[0],f=r[1];else var c=!1,a=n[0],f=n[1];switch(a){case"even":o=t%2==1?t-1:t;break;case"odd":o=t%2==0?t-1:t;break;default:o=t}f=parseInt(f,10),is_number(f)&&(c&&(f=-f),o+=f)}return(!is_number(o)||1>o)&&(o=1),o}function cf_getItemsAdjust(t,e,s,i){return cf_getItemAdjustMinMax(cf_getAdjust(t,e,s,i),e.items.visibleConf)}function cf_getItemAdjustMinMax(t,e){return is_number(e.min)&&t<e.min&&(t=e.min),is_number(e.max)&&t>e.max&&(t=e.max),1>t&&(t=1),t}function cf_getSynchArr(t){is_array(t)||(t=[[t]]),is_array(t[0])||(t=[t]);for(var e=0,s=t.length;s>e;e++)is_string(t[e][0])&&(t[e][0]=$(t[e][0])),is_boolean(t[e][1])||(t[e][1]=!0),is_boolean(t[e][2])||(t[e][2]=!0),is_number(t[e][3])||(t[e][3]=0);return t}function cf_getKeyCode(t){return"right"==t?39:"left"==t?37:"up"==t?38:"down"==t?40:-1}function cf_setCookie(t,e,s){if(t){var i=e.triggerHandler(cf_e("currentPosition",s));$.fn.carouFredSel.cookie.set(t,i)}}function cf_getCookie(t){var e=$.fn.carouFredSel.cookie.get(t);return""==e?0:e}function in_mapCss(t,e){for(var s={},i=0,o=e.length;o>i;i++)s[e[i]]=t.css(e[i]);return s}function in_complementItems(t,e,s,i){return is_object(t.visibleConf)||(t.visibleConf={}),is_object(t.sizesConf)||(t.sizesConf={}),0==t.start&&is_number(i)&&(t.start=i),is_object(t.visible)?(t.visibleConf.min=t.visible.min,t.visibleConf.max=t.visible.max,t.visible=!1):is_string(t.visible)?("variable"==t.visible?t.visibleConf.variable=!0:t.visibleConf.adjust=t.visible,t.visible=!1):is_function(t.visible)&&(t.visibleConf.adjust=t.visible,t.visible=!1),is_string(t.filter)||(t.filter=s.filter(":hidden").length>0?":visible":"*"),t[e.d.width]||(e.responsive?(debug(!0,"Set a "+e.d.width+" for the items!"),t[e.d.width]=ms_getTrueLargestSize(s,e,"outerWidth")):t[e.d.width]=ms_hasVariableSizes(s,e,"outerWidth")?"variable":s[e.d.outerWidth](!0)),t[e.d.height]||(t[e.d.height]=ms_hasVariableSizes(s,e,"outerHeight")?"variable":s[e.d.outerHeight](!0)),t.sizesConf.width=t.width,t.sizesConf.height=t.height,t}function in_complementVisibleItems(t,e){return"variable"==t.items[t.d.width]&&(t.items.visibleConf.variable=!0),t.items.visibleConf.variable||(is_number(t[t.d.width])?t.items.visible=Math.floor(t[t.d.width]/t.items[t.d.width]):(t.items.visible=Math.floor(e/t.items[t.d.width]),t[t.d.width]=t.items.visible*t.items[t.d.width],t.items.visibleConf.adjust||(t.align=!1)),("Infinity"==t.items.visible||t.items.visible<1)&&(debug(!0,'Not a valid number of visible items: Set to "variable".'),t.items.visibleConf.variable=!0)),t}function in_complementPrimarySize(t,e,s){return"auto"==t&&(t=ms_getTrueLargestSize(s,e,"outerWidth")),t}function in_complementSecondarySize(t,e,s){return"auto"==t&&(t=ms_getTrueLargestSize(s,e,"outerHeight")),t||(t=e.items[e.d.height]),t}function in_getAlignPadding(t,e){var s=cf_getAlignPadding(gi_getCurrentItems(e,t),t);return t.padding[t.d[1]]=s[1],t.padding[t.d[3]]=s[0],t}function in_getResponsiveValues(t,e){var s=cf_getItemAdjustMinMax(Math.ceil(t[t.d.width]/t.items[t.d.width]),t.items.visibleConf);s>e.length&&(s=e.length);var i=Math.floor(t[t.d.width]/s);return t.items.visible=s,t.items[t.d.width]=i,t[t.d.width]=s*i,t}function bt_pauseOnHoverConfig(t){if(is_string(t))var e=t.indexOf("immediate")>-1?!0:!1,s=t.indexOf("resume")>-1?!0:!1;else var e=s=!1;return[e,s]}function bt_mousesheelNumber(t){return is_number(t)?t:null}function is_null(t){return null===t}function is_undefined(t){return is_null(t)||"undefined"==typeof t||""===t||"undefined"===t}function is_array(t){return t instanceof Array}function is_jquery(t){return t instanceof jQuery}function is_object(t){return(t instanceof Object||"object"==typeof t)&&!is_null(t)&&!is_jquery(t)&&!is_array(t)&&!is_function(t)}function is_number(t){return(t instanceof Number||"number"==typeof t)&&!isNaN(t)}function is_string(t){return(t instanceof String||"string"==typeof t)&&!is_undefined(t)&&!is_true(t)&&!is_false(t)}function is_function(t){return t instanceof Function||"function"==typeof t}function is_boolean(t){return t instanceof Boolean||"boolean"==typeof t||is_true(t)||is_false(t)}function is_true(t){return t===!0||"true"===t}function is_false(t){return t===!1||"false"===t}function is_percentage(t){return is_string(t)&&"%"==t.slice(-1)}function getTime(){return(new Date).getTime()}function deprecated(t,e){debug(!0,t+" is DEPRECATED, support for it will be removed. Use "+e+" instead.")}function debug(t,e){if(!is_undefined(window.console)&&!is_undefined(window.console.log)){if(is_object(t)){var s=" ("+t.selector+")";t=t.debug}else var s="";if(!t)return!1;e=is_string(e)?"carouFredSel"+s+": "+e:["carouFredSel"+s+":",e],window.console.log(e)}return!1}$.fn.carouFredSel||($.fn.caroufredsel=$.fn.carouFredSel=function(options,configs){if(0==this.length)return debug(!0,'No element found for "'+this.selector+'".'),this;if(this.length>1)return this.each(function(){$(this).carouFredSel(options,configs)});var $cfs=this,$tt0=this[0],starting_position=!1;$cfs.data("_cfs_isCarousel")&&(starting_position=$cfs.triggerHandler("_cfs_triggerEvent","currentPosition"),$cfs.trigger("_cfs_triggerEvent",["destroy",!0]));var FN={};FN._init=function(t,e,s){t=go_getObject($tt0,t),t.items=go_getItemsObject($tt0,t.items),t.scroll=go_getScrollObject($tt0,t.scroll),t.auto=go_getAutoObject($tt0,t.auto),t.prev=go_getPrevNextObject($tt0,t.prev),t.next=go_getPrevNextObject($tt0,t.next),t.pagination=go_getPaginationObject($tt0,t.pagination),t.swipe=go_getSwipeObject($tt0,t.swipe),t.mousewheel=go_getMousewheelObject($tt0,t.mousewheel),e&&(opts_orig=$.extend(!0,{},$.fn.carouFredSel.defaults,t)),opts=$.extend(!0,{},$.fn.carouFredSel.defaults,t),opts.d=cf_getDimensions(opts),crsl.direction="up"==opts.direction||"left"==opts.direction?"next":"prev";var i=$cfs.children(),o=ms_getParentSize($wrp,opts,"width");if(is_true(opts.cookie)&&(opts.cookie="caroufredsel_cookie_"+conf.serialNumber),opts.maxDimension=ms_getMaxDimension(opts,o),opts.items=in_complementItems(opts.items,opts,i,s),opts[opts.d.width]=in_complementPrimarySize(opts[opts.d.width],opts,i),opts[opts.d.height]=in_complementSecondarySize(opts[opts.d.height],opts,i),opts.responsive&&(is_percentage(opts[opts.d.width])||(opts[opts.d.width]="100%")),is_percentage(opts[opts.d.width])&&(crsl.upDateOnWindowResize=!0,crsl.primarySizePercentage=opts[opts.d.width],opts[opts.d.width]=ms_getPercentage(o,crsl.primarySizePercentage),opts.items.visible||(opts.items.visibleConf.variable=!0)),opts.responsive?(opts.usePadding=!1,opts.padding=[0,0,0,0],opts.align=!1,opts.items.visibleConf.variable=!1):(opts.items.visible||(opts=in_complementVisibleItems(opts,o)),opts[opts.d.width]||(!opts.items.visibleConf.variable&&is_number(opts.items[opts.d.width])&&"*"==opts.items.filter?(opts[opts.d.width]=opts.items.visible*opts.items[opts.d.width],opts.align=!1):opts[opts.d.width]="variable"),is_undefined(opts.align)&&(opts.align=is_number(opts[opts.d.width])?"center":!1),opts.items.visibleConf.variable&&(opts.items.visible=gn_getVisibleItemsNext(i,opts,0))),"*"==opts.items.filter||opts.items.visibleConf.variable||(opts.items.visibleConf.org=opts.items.visible,opts.items.visible=gn_getVisibleItemsNextFilter(i,opts,0)),opts.items.visible=cf_getItemsAdjust(opts.items.visible,opts,opts.items.visibleConf.adjust,$tt0),opts.items.visibleConf.old=opts.items.visible,opts.responsive)opts.items.visibleConf.min||(opts.items.visibleConf.min=opts.items.visible),opts.items.visibleConf.max||(opts.items.visibleConf.max=opts.items.visible),opts=in_getResponsiveValues(opts,i,o);else switch(opts.padding=cf_getPadding(opts.padding),"top"==opts.align?opts.align="left":"bottom"==opts.align&&(opts.align="right"),opts.align){case"center":case"left":case"right":"variable"!=opts[opts.d.width]&&(opts=in_getAlignPadding(opts,i),opts.usePadding=!0);break;default:opts.align=!1,opts.usePadding=0==opts.padding[0]&&0==opts.padding[1]&&0==opts.padding[2]&&0==opts.padding[3]?!1:!0}is_number(opts.scroll.duration)||(opts.scroll.duration=500),is_undefined(opts.scroll.items)&&(opts.scroll.items=opts.responsive||opts.items.visibleConf.variable||"*"!=opts.items.filter?"visible":opts.items.visible),opts.auto=$.extend(!0,{},opts.scroll,opts.auto),opts.prev=$.extend(!0,{},opts.scroll,opts.prev),opts.next=$.extend(!0,{},opts.scroll,opts.next),opts.pagination=$.extend(!0,{},opts.scroll,opts.pagination),opts.auto=go_complementAutoObject($tt0,opts.auto),opts.prev=go_complementPrevNextObject($tt0,opts.prev),opts.next=go_complementPrevNextObject($tt0,opts.next),opts.pagination=go_complementPaginationObject($tt0,opts.pagination),opts.swipe=go_complementSwipeObject($tt0,opts.swipe),opts.mousewheel=go_complementMousewheelObject($tt0,opts.mousewheel),opts.synchronise&&(opts.synchronise=cf_getSynchArr(opts.synchronise)),opts.auto.onPauseStart&&(opts.auto.onTimeoutStart=opts.auto.onPauseStart,deprecated("auto.onPauseStart","auto.onTimeoutStart")),opts.auto.onPausePause&&(opts.auto.onTimeoutPause=opts.auto.onPausePause,deprecated("auto.onPausePause","auto.onTimeoutPause")),opts.auto.onPauseEnd&&(opts.auto.onTimeoutEnd=opts.auto.onPauseEnd,deprecated("auto.onPauseEnd","auto.onTimeoutEnd")),opts.auto.pauseDuration&&(opts.auto.timeoutDuration=opts.auto.pauseDuration,deprecated("auto.pauseDuration","auto.timeoutDuration"))},FN._build=function(){$cfs.data("_cfs_isCarousel",!0);var t=$cfs.children(),e=in_mapCss($cfs,["textAlign","float","position","top","right","bottom","left","zIndex","width","height","marginTop","marginRight","marginBottom","marginLeft"]),s="relative";switch(e.position){case"absolute":case"fixed":s=e.position}"parent"==conf.wrapper?sz_storeOrigCss($wrp):$wrp.css(e),$wrp.css({overflow:"hidden",position:s}),sz_storeOrigCss($cfs),$cfs.data("_cfs_origCssZindex",e.zIndex),$cfs.css({textAlign:"left","float":"none",position:"absolute",top:0,right:"auto",bottom:"auto",left:0,marginTop:0,marginRight:0,marginBottom:0,marginLeft:0}),sz_storeMargin(t,opts),sz_storeOrigCss(t),opts.responsive&&sz_setResponsiveSizes(opts,t)},FN._bind_events=function(){FN._unbind_events(),$cfs.bind(cf_e("stop",conf),function(t,e){return t.stopPropagation(),crsl.isStopped||opts.auto.button&&opts.auto.button.addClass(cf_c("stopped",conf)),crsl.isStopped=!0,opts.auto.play&&(opts.auto.play=!1,$cfs.trigger(cf_e("pause",conf),e)),!0}),$cfs.bind(cf_e("finish",conf),function(t){return t.stopPropagation(),crsl.isScrolling&&sc_stopScroll(scrl),!0}),$cfs.bind(cf_e("pause",conf),function(t,e,s){if(t.stopPropagation(),tmrs=sc_clearTimers(tmrs),e&&crsl.isScrolling){scrl.isStopped=!0;var i=getTime()-scrl.startTime;scrl.duration-=i,scrl.pre&&(scrl.pre.duration-=i),scrl.post&&(scrl.post.duration-=i),sc_stopScroll(scrl,!1)}if(crsl.isPaused||crsl.isScrolling||s&&(tmrs.timePassed+=getTime()-tmrs.startTime),crsl.isPaused||opts.auto.button&&opts.auto.button.addClass(cf_c("paused",conf)),crsl.isPaused=!0,opts.auto.onTimeoutPause){var o=opts.auto.timeoutDuration-tmrs.timePassed,n=100-Math.ceil(100*o/opts.auto.timeoutDuration);opts.auto.onTimeoutPause.call($tt0,n,o)}return!0}),$cfs.bind(cf_e("play",conf),function(t,e,s,i){t.stopPropagation(),tmrs=sc_clearTimers(tmrs);var o=[e,s,i],n=["string","number","boolean"],r=cf_sortParams(o,n);if(e=r[0],s=r[1],i=r[2],"prev"!=e&&"next"!=e&&(e=crsl.direction),is_number(s)||(s=0),is_boolean(i)||(i=!1),i&&(crsl.isStopped=!1,opts.auto.play=!0),!opts.auto.play)return t.stopImmediatePropagation(),debug(conf,"Carousel stopped: Not scrolling.");crsl.isPaused&&opts.auto.button&&(opts.auto.button.removeClass(cf_c("stopped",conf)),opts.auto.button.removeClass(cf_c("paused",conf))),crsl.isPaused=!1,tmrs.startTime=getTime();var c=opts.auto.timeoutDuration+s;return dur2=c-tmrs.timePassed,perc=100-Math.ceil(100*dur2/c),opts.auto.progress&&(tmrs.progress=setInterval(function(){var t=getTime()-tmrs.startTime+tmrs.timePassed,e=Math.ceil(100*t/c);opts.auto.progress.updater.call(opts.auto.progress.bar[0],e)},opts.auto.progress.interval)),tmrs.auto=setTimeout(function(){opts.auto.progress&&opts.auto.progress.updater.call(opts.auto.progress.bar[0],100),opts.auto.onTimeoutEnd&&opts.auto.onTimeoutEnd.call($tt0,perc,dur2),crsl.isScrolling?$cfs.trigger(cf_e("play",conf),e):$cfs.trigger(cf_e(e,conf),opts.auto)},dur2),opts.auto.onTimeoutStart&&opts.auto.onTimeoutStart.call($tt0,perc,dur2),!0}),$cfs.bind(cf_e("resume",conf),function(t){return t.stopPropagation(),scrl.isStopped?(scrl.isStopped=!1,crsl.isPaused=!1,crsl.isScrolling=!0,scrl.startTime=getTime(),sc_startScroll(scrl,conf)):$cfs.trigger(cf_e("play",conf)),!0}),$cfs.bind(cf_e("prev",conf)+" "+cf_e("next",conf),function(t,e,s,i,o){if(t.stopPropagation(),crsl.isStopped||$cfs.is(":hidden"))return t.stopImmediatePropagation(),debug(conf,"Carousel stopped or hidden: Not scrolling.");var n=is_number(opts.items.minimum)?opts.items.minimum:opts.items.visible+1;if(n>itms.total)return t.stopImmediatePropagation(),debug(conf,"Not enough items ("+itms.total+" total, "+n+" needed): Not scrolling.");var r=[e,s,i,o],c=["object","number/string","function","boolean"],a=cf_sortParams(r,c);e=a[0],s=a[1],i=a[2],o=a[3];var f=t.type.slice(conf.events.prefix.length);if(is_object(e)||(e={}),is_function(i)&&(e.onAfter=i),is_boolean(o)&&(e.queue=o),e=$.extend(!0,{},opts[f],e),e.conditions&&!e.conditions.call($tt0,f))return t.stopImmediatePropagation(),debug(conf,'Callback "conditions" returned false.');if(!is_number(s)){if("*"!=opts.items.filter)s="visible";else for(var l=[s,e.items,opts[f].items],a=0,u=l.length;u>a;a++)if(is_number(l[a])||"page"==l[a]||"visible"==l[a]){s=l[a];break}switch(s){case"page":return t.stopImmediatePropagation(),$cfs.triggerHandler(cf_e(f+"Page",conf),[e,i]);case"visible":opts.items.visibleConf.variable||"*"!=opts.items.filter||(s=opts.items.visible)}}if(scrl.isStopped)return $cfs.trigger(cf_e("resume",conf)),$cfs.trigger(cf_e("queue",conf),[f,[e,s,i]]),t.stopImmediatePropagation(),debug(conf,"Carousel resumed scrolling.");if(e.duration>0&&crsl.isScrolling)return e.queue&&("last"==e.queue&&(queu=[]),("first"!=e.queue||0==queu.length)&&$cfs.trigger(cf_e("queue",conf),[f,[e,s,i]])),t.stopImmediatePropagation(),debug(conf,"Carousel currently scrolling.");if(tmrs.timePassed=0,$cfs.trigger(cf_e("slide_"+f,conf),[e,s]),opts.synchronise)for(var p=opts.synchronise,d=[e,s],g=0,u=p.length;u>g;g++){var m=f;p[g][2]||(m="prev"==m?"next":"prev"),p[g][1]||(d[0]=p[g][0].triggerHandler("_cfs_triggerEvent",["configuration",m])),d[1]=s+p[g][3],p[g][0].trigger("_cfs_triggerEvent",["slide_"+m,d])}return!0}),$cfs.bind(cf_e("slide_prev",conf),function(t,e,s){t.stopPropagation();var i=$cfs.children();if(!opts.circular&&0==itms.first)return opts.infinite&&$cfs.trigger(cf_e("next",conf),itms.total-1),t.stopImmediatePropagation();if(sz_resetMargin(i,opts),!is_number(s)){if(opts.items.visibleConf.variable)s=gn_getVisibleItemsPrev(i,opts,itms.total-1);else if("*"!=opts.items.filter){var o=is_number(e.items)?e.items:gn_getVisibleOrg($cfs,opts);s=gn_getScrollItemsPrevFilter(i,opts,itms.total-1,o)}else s=opts.items.visible;s=cf_getAdjust(s,opts,e.items,$tt0)}if(opts.circular||itms.total-s<itms.first&&(s=itms.total-itms.first),opts.items.visibleConf.old=opts.items.visible,opts.items.visibleConf.variable){var n=cf_getItemsAdjust(gn_getVisibleItemsNext(i,opts,itms.total-s),opts,opts.items.visibleConf.adjust,$tt0);opts.items.visible+s<=n&&s<itms.total&&(s++,n=cf_getItemsAdjust(gn_getVisibleItemsNext(i,opts,itms.total-s),opts,opts.items.visibleConf.adjust,$tt0)),opts.items.visible=n}else if("*"!=opts.items.filter){var n=gn_getVisibleItemsNextFilter(i,opts,itms.total-s);opts.items.visible=cf_getItemsAdjust(n,opts,opts.items.visibleConf.adjust,$tt0)}if(sz_resetMargin(i,opts,!0),0==s)return t.stopImmediatePropagation(),debug(conf,"0 items to scroll: Not scrolling.");for(debug(conf,"Scrolling "+s+" items backward."),itms.first+=s;itms.first>=itms.total;)itms.first-=itms.total;opts.circular||(0==itms.first&&e.onEnd&&e.onEnd.call($tt0,"prev"),opts.infinite||nv_enableNavi(opts,itms.first,conf)),$cfs.children().slice(itms.total-s,itms.total).prependTo($cfs),itms.total<opts.items.visible+s&&$cfs.children().slice(0,opts.items.visible+s-itms.total).clone(!0).appendTo($cfs);var i=$cfs.children(),r=gi_getOldItemsPrev(i,opts,s),c=gi_getNewItemsPrev(i,opts),a=i.eq(s-1),f=r.last(),l=c.last();sz_resetMargin(i,opts);var u=0,p=0;if(opts.align){var d=cf_getAlignPadding(c,opts);u=d[0],p=d[1]}var g=0>u?opts.padding[opts.d[3]]:0,m=!1,_=$();if(opts.items.visible<s&&(_=i.slice(opts.items.visibleConf.old,s),"directscroll"==e.fx)){var b=opts.items[opts.d.width];m=_,a=l,sc_hideHiddenItems(m),opts.items[opts.d.width]="variable"}var v=!1,h=ms_getTotalSize(i.slice(0,s),opts,"width"),w=cf_mapWrapperSizes(ms_getSizes(c,opts,!0),opts,!opts.usePadding),P=0,C={},x={},S={},y={},I={},z={},j={},N=sc_getDuration(e,opts,s,h);switch(e.fx){case"cover":case"cover-fade":P=ms_getTotalSize(i.slice(0,opts.items.visible),opts,"width")}m&&(opts.items[opts.d.width]=b),sz_resetMargin(i,opts,!0),p>=0&&sz_resetMargin(f,opts,opts.padding[opts.d[1]]),u>=0&&sz_resetMargin(a,opts,opts.padding[opts.d[3]]),opts.align&&(opts.padding[opts.d[1]]=p,opts.padding[opts.d[3]]=u),z[opts.d.left]=-(h-g),j[opts.d.left]=-(P-g),x[opts.d.left]=w[opts.d.width];var k=function(){},O=function(){},T=function(){},M=function(){},F=function(){},A=function(){},H=function(){},q=function(){},D=function(){},V=function(){},R=function(){};switch(e.fx){case"crossfade":case"cover":case"cover-fade":case"uncover":case"uncover-fade":v=$cfs.clone(!0).appendTo($wrp)}switch(e.fx){case"crossfade":case"uncover":case"uncover-fade":v.children().slice(0,s).remove(),v.children().slice(opts.items.visibleConf.old).remove();break;case"cover":case"cover-fade":v.children().slice(opts.items.visible).remove(),v.css(j)}if($cfs.css(z),scrl=sc_setScroll(N,e.easing,conf),C[opts.d.left]=opts.usePadding?opts.padding[opts.d[3]]:0,("variable"==opts[opts.d.width]||"variable"==opts[opts.d.height])&&(k=function(){$wrp.css(w)},O=function(){scrl.anims.push([$wrp,w])}),opts.usePadding){switch(l.not(a).length&&(S[opts.d.marginRight]=a.data("_cfs_origCssMargin"),0>u?a.css(S):(H=function(){a.css(S)},q=function(){scrl.anims.push([a,S])})),e.fx){case"cover":case"cover-fade":v.children().eq(s-1).css(S)}l.not(f).length&&(y[opts.d.marginRight]=f.data("_cfs_origCssMargin"),T=function(){f.css(y)},M=function(){scrl.anims.push([f,y])}),p>=0&&(I[opts.d.marginRight]=l.data("_cfs_origCssMargin")+opts.padding[opts.d[1]],F=function(){l.css(I)},A=function(){scrl.anims.push([l,I])})}R=function(){$cfs.css(C)};var E=opts.items.visible+s-itms.total;V=function(){if(E>0&&($cfs.children().slice(itms.total).remove(),r=$($cfs.children().slice(itms.total-(opts.items.visible-E)).get().concat($cfs.children().slice(0,E).get()))),sc_showHiddenItems(m),opts.usePadding){var t=$cfs.children().eq(opts.items.visible+s-1);t.css(opts.d.marginRight,t.data("_cfs_origCssMargin"))}};var W=sc_mapCallbackArguments(r,_,c,s,"prev",N,w);switch(D=function(){sc_afterScroll($cfs,v,e),crsl.isScrolling=!1,clbk.onAfter=sc_fireCallbacks($tt0,e,"onAfter",W,clbk),queu=sc_fireQueue($cfs,queu,conf),crsl.isPaused||$cfs.trigger(cf_e("play",conf))},crsl.isScrolling=!0,tmrs=sc_clearTimers(tmrs),clbk.onBefore=sc_fireCallbacks($tt0,e,"onBefore",W,clbk),e.fx){case"none":$cfs.css(C),k(),T(),F(),H(),R(),V(),D();break;case"fade":scrl.anims.push([$cfs,{opacity:0},function(){k(),T(),F(),H(),R(),V(),scrl=sc_setScroll(N,e.easing,conf),scrl.anims.push([$cfs,{opacity:1},D]),sc_startScroll(scrl,conf)}]);break;case"crossfade":$cfs.css({opacity:0}),scrl.anims.push([v,{opacity:0}]),scrl.anims.push([$cfs,{opacity:1},D]),O(),T(),F(),H(),R(),V();break;case"cover":scrl.anims.push([v,C,function(){T(),F(),H(),R(),V(),D()}]),O();break;case"cover-fade":scrl.anims.push([$cfs,{opacity:0}]),scrl.anims.push([v,C,function(){T(),F(),H(),R(),V(),D()}]),O();break;case"uncover":scrl.anims.push([v,x,D]),O(),T(),F(),H(),R(),V();break;case"uncover-fade":$cfs.css({opacity:0}),scrl.anims.push([$cfs,{opacity:1}]),scrl.anims.push([v,x,D]),O(),T(),F(),H(),R(),V();break;default:scrl.anims.push([$cfs,C,function(){V(),D()}]),O(),M(),A(),q()}return sc_startScroll(scrl,conf),cf_setCookie(opts.cookie,$cfs,conf),$cfs.trigger(cf_e("updatePageStatus",conf),[!1,w]),!0
2
  }),$cfs.bind(cf_e("slide_next",conf),function(t,e,s){t.stopPropagation();var i=$cfs.children();if(!opts.circular&&itms.first==opts.items.visible)return opts.infinite&&$cfs.trigger(cf_e("prev",conf),itms.total-1),t.stopImmediatePropagation();if(sz_resetMargin(i,opts),!is_number(s)){if("*"!=opts.items.filter){var o=is_number(e.items)?e.items:gn_getVisibleOrg($cfs,opts);s=gn_getScrollItemsNextFilter(i,opts,0,o)}else s=opts.items.visible;s=cf_getAdjust(s,opts,e.items,$tt0)}var n=0==itms.first?itms.total:itms.first;if(!opts.circular){if(opts.items.visibleConf.variable)var r=gn_getVisibleItemsNext(i,opts,s),o=gn_getVisibleItemsPrev(i,opts,n-1);else var r=opts.items.visible,o=opts.items.visible;s+r>n&&(s=n-o)}if(opts.items.visibleConf.old=opts.items.visible,opts.items.visibleConf.variable){for(var r=cf_getItemsAdjust(gn_getVisibleItemsNextTestCircular(i,opts,s,n),opts,opts.items.visibleConf.adjust,$tt0);opts.items.visible-s>=r&&s<itms.total;)s++,r=cf_getItemsAdjust(gn_getVisibleItemsNextTestCircular(i,opts,s,n),opts,opts.items.visibleConf.adjust,$tt0);opts.items.visible=r}else if("*"!=opts.items.filter){var r=gn_getVisibleItemsNextFilter(i,opts,s);opts.items.visible=cf_getItemsAdjust(r,opts,opts.items.visibleConf.adjust,$tt0)}if(sz_resetMargin(i,opts,!0),0==s)return t.stopImmediatePropagation(),debug(conf,"0 items to scroll: Not scrolling.");for(debug(conf,"Scrolling "+s+" items forward."),itms.first-=s;itms.first<0;)itms.first+=itms.total;opts.circular||(itms.first==opts.items.visible&&e.onEnd&&e.onEnd.call($tt0,"next"),opts.infinite||nv_enableNavi(opts,itms.first,conf)),itms.total<opts.items.visible+s&&$cfs.children().slice(0,opts.items.visible+s-itms.total).clone(!0).appendTo($cfs);var i=$cfs.children(),c=gi_getOldItemsNext(i,opts),a=gi_getNewItemsNext(i,opts,s),f=i.eq(s-1),l=c.last(),u=a.last();sz_resetMargin(i,opts);var p=0,d=0;if(opts.align){var g=cf_getAlignPadding(a,opts);p=g[0],d=g[1]}var m=!1,_=$();if(opts.items.visibleConf.old<s&&(_=i.slice(opts.items.visibleConf.old,s),"directscroll"==e.fx)){var b=opts.items[opts.d.width];m=_,f=l,sc_hideHiddenItems(m),opts.items[opts.d.width]="variable"}var v=!1,h=ms_getTotalSize(i.slice(0,s),opts,"width"),w=cf_mapWrapperSizes(ms_getSizes(a,opts,!0),opts,!opts.usePadding),P=0,C={},x={},S={},y={},I={},z=sc_getDuration(e,opts,s,h);switch(e.fx){case"uncover":case"uncover-fade":P=ms_getTotalSize(i.slice(0,opts.items.visibleConf.old),opts,"width")}m&&(opts.items[opts.d.width]=b),opts.align&&opts.padding[opts.d[1]]<0&&(opts.padding[opts.d[1]]=0),sz_resetMargin(i,opts,!0),sz_resetMargin(l,opts,opts.padding[opts.d[1]]),opts.align&&(opts.padding[opts.d[1]]=d,opts.padding[opts.d[3]]=p),I[opts.d.left]=opts.usePadding?opts.padding[opts.d[3]]:0;var j=function(){},N=function(){},k=function(){},O=function(){},T=function(){},M=function(){},F=function(){},A=function(){},H=function(){};switch(e.fx){case"crossfade":case"cover":case"cover-fade":case"uncover":case"uncover-fade":v=$cfs.clone(!0).appendTo($wrp),v.children().slice(opts.items.visibleConf.old).remove()}switch(e.fx){case"crossfade":case"cover":case"cover-fade":$cfs.css("zIndex",1),v.css("zIndex",0)}if(scrl=sc_setScroll(z,e.easing,conf),C[opts.d.left]=-h,x[opts.d.left]=-P,0>p&&(C[opts.d.left]+=p),("variable"==opts[opts.d.width]||"variable"==opts[opts.d.height])&&(j=function(){$wrp.css(w)},N=function(){scrl.anims.push([$wrp,w])}),opts.usePadding){var q=u.data("_cfs_origCssMargin");d>=0&&(q+=opts.padding[opts.d[1]]),u.css(opts.d.marginRight,q),f.not(l).length&&(y[opts.d.marginRight]=l.data("_cfs_origCssMargin")),k=function(){l.css(y)},O=function(){scrl.anims.push([l,y])};var D=f.data("_cfs_origCssMargin");p>0&&(D+=opts.padding[opts.d[3]]),S[opts.d.marginRight]=D,T=function(){f.css(S)},M=function(){scrl.anims.push([f,S])}}H=function(){$cfs.css(I)};var V=opts.items.visible+s-itms.total;A=function(){V>0&&$cfs.children().slice(itms.total).remove();var t=$cfs.children().slice(0,s).appendTo($cfs).last();if(V>0&&(a=gi_getCurrentItems(i,opts)),sc_showHiddenItems(m),opts.usePadding){if(itms.total<opts.items.visible+s){var e=$cfs.children().eq(opts.items.visible-1);e.css(opts.d.marginRight,e.data("_cfs_origCssMargin")+opts.padding[opts.d[1]])}t.css(opts.d.marginRight,t.data("_cfs_origCssMargin"))}};var R=sc_mapCallbackArguments(c,_,a,s,"next",z,w);switch(F=function(){$cfs.css("zIndex",$cfs.data("_cfs_origCssZindex")),sc_afterScroll($cfs,v,e),crsl.isScrolling=!1,clbk.onAfter=sc_fireCallbacks($tt0,e,"onAfter",R,clbk),queu=sc_fireQueue($cfs,queu,conf),crsl.isPaused||$cfs.trigger(cf_e("play",conf))},crsl.isScrolling=!0,tmrs=sc_clearTimers(tmrs),clbk.onBefore=sc_fireCallbacks($tt0,e,"onBefore",R,clbk),e.fx){case"none":$cfs.css(C),j(),k(),T(),H(),A(),F();break;case"fade":scrl.anims.push([$cfs,{opacity:0},function(){j(),k(),T(),H(),A(),scrl=sc_setScroll(z,e.easing,conf),scrl.anims.push([$cfs,{opacity:1},F]),sc_startScroll(scrl,conf)}]);break;case"crossfade":$cfs.css({opacity:0}),scrl.anims.push([v,{opacity:0}]),scrl.anims.push([$cfs,{opacity:1},F]),N(),k(),T(),H(),A();break;case"cover":$cfs.css(opts.d.left,$wrp[opts.d.width]()),scrl.anims.push([$cfs,I,F]),N(),k(),T(),A();break;case"cover-fade":$cfs.css(opts.d.left,$wrp[opts.d.width]()),scrl.anims.push([v,{opacity:0}]),scrl.anims.push([$cfs,I,F]),N(),k(),T(),A();break;case"uncover":scrl.anims.push([v,x,F]),N(),k(),T(),H(),A();break;case"uncover-fade":$cfs.css({opacity:0}),scrl.anims.push([$cfs,{opacity:1}]),scrl.anims.push([v,x,F]),N(),k(),T(),H(),A();break;default:scrl.anims.push([$cfs,C,function(){H(),A(),F()}]),N(),O(),M()}return sc_startScroll(scrl,conf),cf_setCookie(opts.cookie,$cfs,conf),$cfs.trigger(cf_e("updatePageStatus",conf),[!1,w]),!0}),$cfs.bind(cf_e("slideTo",conf),function(t,e,s,i,o,n,r){t.stopPropagation();var c=[e,s,i,o,n,r],a=["string/number/object","number","boolean","object","string","function"],f=cf_sortParams(c,a);return o=f[3],n=f[4],r=f[5],e=gn_getItemIndex(f[0],f[1],f[2],itms,$cfs),0==e?!1:(is_object(o)||(o=!1),"prev"!=n&&"next"!=n&&(n=opts.circular?e<=itms.total/2?"next":"prev":0==itms.first||itms.first>e?"next":"prev"),"prev"==n&&(e=itms.total-e),$cfs.trigger(cf_e(n,conf),[o,e,r]),!0)}),$cfs.bind(cf_e("prevPage",conf),function(t,e,s){t.stopPropagation();var i=$cfs.triggerHandler(cf_e("currentPage",conf));return $cfs.triggerHandler(cf_e("slideToPage",conf),[i-1,e,"prev",s])}),$cfs.bind(cf_e("nextPage",conf),function(t,e,s){t.stopPropagation();var i=$cfs.triggerHandler(cf_e("currentPage",conf));return $cfs.triggerHandler(cf_e("slideToPage",conf),[i+1,e,"next",s])}),$cfs.bind(cf_e("slideToPage",conf),function(t,e,s,i,o){t.stopPropagation(),is_number(e)||(e=$cfs.triggerHandler(cf_e("currentPage",conf)));var n=opts.pagination.items||opts.items.visible,r=Math.ceil(itms.total/n)-1;return 0>e&&(e=r),e>r&&(e=0),$cfs.triggerHandler(cf_e("slideTo",conf),[e*n,0,!0,s,i,o])}),$cfs.bind(cf_e("jumpToStart",conf),function(t,e){if(t.stopPropagation(),e=e?gn_getItemIndex(e,0,!0,itms,$cfs):0,e+=itms.first,0!=e){if(itms.total>0)for(;e>itms.total;)e-=itms.total;$cfs.prepend($cfs.children().slice(e,itms.total))}return!0}),$cfs.bind(cf_e("synchronise",conf),function(t,e){if(t.stopPropagation(),e)e=cf_getSynchArr(e);else{if(!opts.synchronise)return debug(conf,"No carousel to synchronise.");e=opts.synchronise}for(var s=$cfs.triggerHandler(cf_e("currentPosition",conf)),i=!0,o=0,n=e.length;n>o;o++)e[o][0].triggerHandler(cf_e("slideTo",conf),[s,e[o][3],!0])||(i=!1);return i}),$cfs.bind(cf_e("queue",conf),function(t,e,s){return t.stopPropagation(),is_function(e)?e.call($tt0,queu):is_array(e)?queu=e:is_undefined(e)||queu.push([e,s]),queu}),$cfs.bind(cf_e("insertItem",conf),function(t,e,s,i,o){t.stopPropagation();var n=[e,s,i,o],r=["string/object","string/number/object","boolean","number"],c=cf_sortParams(n,r);if(e=c[0],s=c[1],i=c[2],o=c[3],is_object(e)&&!is_jquery(e)?e=$(e):is_string(e)&&(e=$(e)),!is_jquery(e)||0==e.length)return debug(conf,"Not a valid object.");is_undefined(s)&&(s="end"),sz_storeMargin(e,opts),sz_storeOrigCss(e);var a=s,f="before";"end"==s?i?(0==itms.first?(s=itms.total-1,f="after"):(s=itms.first,itms.first+=e.length),0>s&&(s=0)):(s=itms.total-1,f="after"):s=gn_getItemIndex(s,o,i,itms,$cfs);var l=$cfs.children().eq(s);return l.length?l[f](e):(debug(conf,"Correct insert-position not found! Appending item to the end."),$cfs.append(e)),"end"==a||i||s<itms.first&&(itms.first+=e.length),itms.total=$cfs.children().length,itms.first>=itms.total&&(itms.first-=itms.total),$cfs.trigger(cf_e("updateSizes",conf)),$cfs.trigger(cf_e("linkAnchors",conf)),!0}),$cfs.bind(cf_e("removeItem",conf),function(t,e,s,i){t.stopPropagation();var o=[e,s,i],n=["string/number/object","boolean","number"],r=cf_sortParams(o,n);e=r[0],s=r[1],i=r[2];if(e instanceof $&&e.length>1)return c=$(),e.each(function(){var t=$cfs.trigger(cf_e("removeItem",conf),[$(this),s,i]);t&&(c=c.add(t))}),c;if(is_undefined(e)||"end"==e)c=$cfs.children().last();else{e=gn_getItemIndex(e,i,s,itms,$cfs);var c=$cfs.children().eq(e);c.length&&e<itms.first&&(itms.first-=c.length)}return c&&c.length&&(c.detach(),itms.total=$cfs.children().length,$cfs.trigger(cf_e("updateSizes",conf))),c}),$cfs.bind(cf_e("onBefore",conf)+" "+cf_e("onAfter",conf),function(t,e){t.stopPropagation();var s=t.type.slice(conf.events.prefix.length);return is_array(e)&&(clbk[s]=e),is_function(e)&&clbk[s].push(e),clbk[s]}),$cfs.bind(cf_e("currentPosition",conf),function(t,e){if(t.stopPropagation(),0==itms.first)var s=0;else var s=itms.total-itms.first;return is_function(e)&&e.call($tt0,s),s}),$cfs.bind(cf_e("currentPage",conf),function(t,e){t.stopPropagation();var s,i=opts.pagination.items||opts.items.visible,o=Math.ceil(itms.total/i-1);return s=0==itms.first?0:itms.first<itms.total%i?0:itms.first!=i||opts.circular?Math.round((itms.total-itms.first)/i):o,0>s&&(s=0),s>o&&(s=o),is_function(e)&&e.call($tt0,s),s}),$cfs.bind(cf_e("currentVisible",conf),function(t,e){t.stopPropagation();var s=gi_getCurrentItems($cfs.children(),opts);return is_function(e)&&e.call($tt0,s),s}),$cfs.bind(cf_e("slice",conf),function(t,e,s,i){if(t.stopPropagation(),0==itms.total)return!1;var o=[e,s,i],n=["number","number","function"],r=cf_sortParams(o,n);if(e=is_number(r[0])?r[0]:0,s=is_number(r[1])?r[1]:itms.total,i=r[2],e+=itms.first,s+=itms.first,items.total>0){for(;e>itms.total;)e-=itms.total;for(;s>itms.total;)s-=itms.total;for(;0>e;)e+=itms.total;for(;0>s;)s+=itms.total}var c,a=$cfs.children();return c=s>e?a.slice(e,s):$(a.slice(e,itms.total).get().concat(a.slice(0,s).get())),is_function(i)&&i.call($tt0,c),c}),$cfs.bind(cf_e("isPaused",conf)+" "+cf_e("isStopped",conf)+" "+cf_e("isScrolling",conf),function(t,e){t.stopPropagation();var s=t.type.slice(conf.events.prefix.length),i=crsl[s];return is_function(e)&&e.call($tt0,i),i}),$cfs.bind(cf_e("configuration",conf),function(e,a,b,c){e.stopPropagation();var reInit=!1;if(is_function(a))a.call($tt0,opts);else if(is_object(a))opts_orig=$.extend(!0,{},opts_orig,a),b!==!1?reInit=!0:opts=$.extend(!0,{},opts,a);else if(!is_undefined(a))if(is_function(b)){var val=eval("opts."+a);is_undefined(val)&&(val=""),b.call($tt0,val)}else{if(is_undefined(b))return eval("opts."+a);"boolean"!=typeof c&&(c=!0),eval("opts_orig."+a+" = b"),c!==!1?reInit=!0:eval("opts."+a+" = b")}if(reInit){sz_resetMargin($cfs.children(),opts),FN._init(opts_orig),FN._bind_buttons();var sz=sz_setSizes($cfs,opts);$cfs.trigger(cf_e("updatePageStatus",conf),[!0,sz])}return opts}),$cfs.bind(cf_e("linkAnchors",conf),function(t,e,s){return t.stopPropagation(),is_undefined(e)?e=$("body"):is_string(e)&&(e=$(e)),is_jquery(e)&&0!=e.length?(is_string(s)||(s="a.caroufredsel"),e.find(s).each(function(){var t=this.hash||"";t.length>0&&-1!=$cfs.children().index($(t))&&$(this).unbind("click").click(function(e){e.preventDefault(),$cfs.trigger(cf_e("slideTo",conf),t)})}),!0):debug(conf,"Not a valid object.")}),$cfs.bind(cf_e("updatePageStatus",conf),function(t,e){if(t.stopPropagation(),opts.pagination.container){var s=opts.pagination.items||opts.items.visible,i=Math.ceil(itms.total/s);e&&(opts.pagination.anchorBuilder&&(opts.pagination.container.children().remove(),opts.pagination.container.each(function(){for(var t=0;i>t;t++){var e=$cfs.children().eq(gn_getItemIndex(t*s,0,!0,itms,$cfs));$(this).append(opts.pagination.anchorBuilder.call(e[0],t+1))}})),opts.pagination.container.each(function(){$(this).children().unbind(opts.pagination.event).each(function(t){$(this).bind(opts.pagination.event,function(e){e.preventDefault(),$cfs.trigger(cf_e("slideTo",conf),[t*s,-opts.pagination.deviation,!0,opts.pagination])})})}));var o=$cfs.triggerHandler(cf_e("currentPage",conf))+opts.pagination.deviation;return o>=i&&(o=0),0>o&&(o=i-1),opts.pagination.container.each(function(){$(this).children().removeClass(cf_c("selected",conf)).eq(o).addClass(cf_c("selected",conf))}),!0}}),$cfs.bind(cf_e("updateSizes",conf),function(){var t=opts.items.visible,e=$cfs.children(),s=ms_getParentSize($wrp,opts,"width");if(itms.total=e.length,crsl.primarySizePercentage?(opts.maxDimension=s,opts[opts.d.width]=ms_getPercentage(s,crsl.primarySizePercentage)):opts.maxDimension=ms_getMaxDimension(opts,s),opts.responsive?(opts.items.width=opts.items.sizesConf.width,opts.items.height=opts.items.sizesConf.height,opts=in_getResponsiveValues(opts,e,s),t=opts.items.visible,sz_setResponsiveSizes(opts,e)):opts.items.visibleConf.variable?t=gn_getVisibleItemsNext(e,opts,0):"*"!=opts.items.filter&&(t=gn_getVisibleItemsNextFilter(e,opts,0)),!opts.circular&&0!=itms.first&&t>itms.first){if(opts.items.visibleConf.variable)var i=gn_getVisibleItemsPrev(e,opts,itms.first)-itms.first;else if("*"!=opts.items.filter)var i=gn_getVisibleItemsPrevFilter(e,opts,itms.first)-itms.first;else var i=opts.items.visible-itms.first;debug(conf,"Preventing non-circular: sliding "+i+" items backward."),$cfs.trigger(cf_e("prev",conf),i)}opts.items.visible=cf_getItemsAdjust(t,opts,opts.items.visibleConf.adjust,$tt0),opts.items.visibleConf.old=opts.items.visible,opts=in_getAlignPadding(opts,e);var o=sz_setSizes($cfs,opts);return $cfs.trigger(cf_e("updatePageStatus",conf),[!0,o]),nv_showNavi(opts,itms.total,conf),nv_enableNavi(opts,itms.first,conf),o}),$cfs.bind(cf_e("destroy",conf),function(t,e){return t.stopPropagation(),tmrs=sc_clearTimers(tmrs),$cfs.data("_cfs_isCarousel",!1),$cfs.trigger(cf_e("finish",conf)),e&&$cfs.trigger(cf_e("jumpToStart",conf)),sz_restoreOrigCss($cfs.children()),sz_restoreOrigCss($cfs),FN._unbind_events(),FN._unbind_buttons(),"parent"==conf.wrapper?sz_restoreOrigCss($wrp):$wrp.replaceWith($cfs),!0}),$cfs.bind(cf_e("debug",conf),function(){return debug(conf,"Carousel width: "+opts.width),debug(conf,"Carousel height: "+opts.height),debug(conf,"Item widths: "+opts.items.width),debug(conf,"Item heights: "+opts.items.height),debug(conf,"Number of items visible: "+opts.items.visible),opts.auto.play&&debug(conf,"Number of items scrolled automatically: "+opts.auto.items),opts.prev.button&&debug(conf,"Number of items scrolled backward: "+opts.prev.items),opts.next.button&&debug(conf,"Number of items scrolled forward: "+opts.next.items),conf.debug}),$cfs.bind("_cfs_triggerEvent",function(t,e,s){return t.stopPropagation(),$cfs.triggerHandler(cf_e(e,conf),s)})},FN._unbind_events=function(){$cfs.unbind(cf_e("",conf)),$cfs.unbind(cf_e("",conf,!1)),$cfs.unbind("_cfs_triggerEvent")},FN._bind_buttons=function(){if(FN._unbind_buttons(),nv_showNavi(opts,itms.total,conf),nv_enableNavi(opts,itms.first,conf),opts.auto.pauseOnHover){var t=bt_pauseOnHoverConfig(opts.auto.pauseOnHover);$wrp.bind(cf_e("mouseenter",conf,!1),function(){$cfs.trigger(cf_e("pause",conf),t)}).bind(cf_e("mouseleave",conf,!1),function(){$cfs.trigger(cf_e("resume",conf))})}if(opts.auto.button&&opts.auto.button.bind(cf_e(opts.auto.event,conf,!1),function(t){t.preventDefault();var e=!1,s=null;crsl.isPaused?e="play":opts.auto.pauseOnEvent&&(e="pause",s=bt_pauseOnHoverConfig(opts.auto.pauseOnEvent)),e&&$cfs.trigger(cf_e(e,conf),s)}),opts.prev.button&&(opts.prev.button.bind(cf_e(opts.prev.event,conf,!1),function(t){t.preventDefault(),$cfs.trigger(cf_e("prev",conf))}),opts.prev.pauseOnHover)){var t=bt_pauseOnHoverConfig(opts.prev.pauseOnHover);opts.prev.button.bind(cf_e("mouseenter",conf,!1),function(){$cfs.trigger(cf_e("pause",conf),t)}).bind(cf_e("mouseleave",conf,!1),function(){$cfs.trigger(cf_e("resume",conf))})}if(opts.next.button&&(opts.next.button.bind(cf_e(opts.next.event,conf,!1),function(t){t.preventDefault(),$cfs.trigger(cf_e("next",conf))}),opts.next.pauseOnHover)){var t=bt_pauseOnHoverConfig(opts.next.pauseOnHover);opts.next.button.bind(cf_e("mouseenter",conf,!1),function(){$cfs.trigger(cf_e("pause",conf),t)}).bind(cf_e("mouseleave",conf,!1),function(){$cfs.trigger(cf_e("resume",conf))})}if(opts.pagination.container&&opts.pagination.pauseOnHover){var t=bt_pauseOnHoverConfig(opts.pagination.pauseOnHover);opts.pagination.container.bind(cf_e("mouseenter",conf,!1),function(){$cfs.trigger(cf_e("pause",conf),t)}).bind(cf_e("mouseleave",conf,!1),function(){$cfs.trigger(cf_e("resume",conf))})}if((opts.prev.key||opts.next.key)&&$(document).bind(cf_e("keyup",conf,!1,!0,!0),function(t){var e=t.keyCode;e==opts.next.key&&(t.preventDefault(),$cfs.trigger(cf_e("next",conf))),e==opts.prev.key&&(t.preventDefault(),$cfs.trigger(cf_e("prev",conf)))}),opts.pagination.keys&&$(document).bind(cf_e("keyup",conf,!1,!0,!0),function(t){var e=t.keyCode;e>=49&&58>e&&(e=(e-49)*opts.items.visible,e<=itms.total&&(t.preventDefault(),$cfs.trigger(cf_e("slideTo",conf),[e,0,!0,opts.pagination])))}),$.fn.swipe){var e="ontouchstart"in window;if(e&&opts.swipe.onTouch||!e&&opts.swipe.onMouse){var s=$.extend(!0,{},opts.prev,opts.swipe),i=$.extend(!0,{},opts.next,opts.swipe),o=function(){$cfs.trigger(cf_e("prev",conf),[s])},n=function(){$cfs.trigger(cf_e("next",conf),[i])};switch(opts.direction){case"up":case"down":opts.swipe.options.swipeUp=n,opts.swipe.options.swipeDown=o;break;default:opts.swipe.options.swipeLeft=n,opts.swipe.options.swipeRight=o}crsl.swipe&&$cfs.swipe("destroy"),$wrp.swipe(opts.swipe.options),$wrp.css("cursor","move"),crsl.swipe=!0}}if($.fn.mousewheel&&opts.mousewheel){var r=$.extend(!0,{},opts.prev,opts.mousewheel),c=$.extend(!0,{},opts.next,opts.mousewheel);crsl.mousewheel&&$wrp.unbind(cf_e("mousewheel",conf,!1)),$wrp.bind(cf_e("mousewheel",conf,!1),function(t,e){t.preventDefault(),e>0?$cfs.trigger(cf_e("prev",conf),[r]):$cfs.trigger(cf_e("next",conf),[c])}),crsl.mousewheel=!0}if(opts.auto.play&&$cfs.trigger(cf_e("play",conf),opts.auto.delay),crsl.upDateOnWindowResize){var a=function(){$cfs.trigger(cf_e("finish",conf)),opts.auto.pauseOnResize&&!crsl.isPaused&&$cfs.trigger(cf_e("play",conf)),sz_resetMargin($cfs.children(),opts),$cfs.trigger(cf_e("updateSizes",conf))},f=$(window),l=null;if($.debounce&&"debounce"==conf.onWindowResize)l=$.debounce(200,a);else if($.throttle&&"throttle"==conf.onWindowResize)l=$.throttle(300,a);else{var u=0,p=0;l=function(){var t=f.width(),e=f.height();(t!=u||e!=p)&&(a(),u=t,p=e)}}f.bind(cf_e("resize",conf,!1,!0,!0),l)}},FN._unbind_buttons=function(){var t=(cf_e("",conf),cf_e("",conf,!1));ns3=cf_e("",conf,!1,!0,!0),$(document).unbind(ns3),$(window).unbind(ns3),$wrp.unbind(t),opts.auto.button&&opts.auto.button.unbind(t),opts.prev.button&&opts.prev.button.unbind(t),opts.next.button&&opts.next.button.unbind(t),opts.pagination.container&&(opts.pagination.container.unbind(t),opts.pagination.anchorBuilder&&opts.pagination.container.children().remove()),crsl.swipe&&($cfs.swipe("destroy"),$wrp.css("cursor","default"),crsl.swipe=!1),crsl.mousewheel&&(crsl.mousewheel=!1),nv_showNavi(opts,"hide",conf),nv_enableNavi(opts,"removeClass",conf)},is_boolean(configs)&&(configs={debug:configs});var crsl={direction:"next",isPaused:!0,isScrolling:!1,isStopped:!1,mousewheel:!1,swipe:!1},itms={total:$cfs.children().length,first:0},tmrs={auto:null,progress:null,startTime:getTime(),timePassed:0},scrl={isStopped:!1,duration:0,startTime:0,easing:"",anims:[]},clbk={onBefore:[],onAfter:[]},queu=[],conf=$.extend(!0,{},$.fn.carouFredSel.configs,configs),opts={},opts_orig=$.extend(!0,{},options),$wrp="parent"==conf.wrapper?$cfs.parent():$cfs.wrap("<"+conf.wrapper.element+' class="'+conf.wrapper.classname+'" />').parent();if(conf.selector=$cfs.selector,conf.serialNumber=$.fn.carouFredSel.serialNumber++,conf.transition=conf.transition&&$.fn.transition?"transition":"animate",FN._init(opts_orig,!0,starting_position),FN._build(),FN._bind_events(),FN._bind_buttons(),is_array(opts.items.start))var start_arr=opts.items.start;else{var start_arr=[];0!=opts.items.start&&start_arr.push(opts.items.start)}if(opts.cookie&&start_arr.unshift(parseInt(cf_getCookie(opts.cookie),10)),start_arr.length>0)for(var a=0,l=start_arr.length;l>a;a++){var s=start_arr[a];if(0!=s){if(s===!0){if(s=window.location.hash,s.length<1)continue}else"random"===s&&(s=Math.floor(Math.random()*itms.total));if($cfs.triggerHandler(cf_e("slideTo",conf),[s,0,!0,{fx:"none"}]))break}}var siz=sz_setSizes($cfs,opts),itm=gi_getCurrentItems($cfs.children(),opts);return opts.onCreate&&opts.onCreate.call($tt0,{width:siz.width,height:siz.height,items:itm}),$cfs.trigger(cf_e("updatePageStatus",conf),[!0,siz]),$cfs.trigger(cf_e("linkAnchors",conf)),conf.debug&&$cfs.trigger(cf_e("debug",conf)),$cfs},$.fn.carouFredSel.serialNumber=1,$.fn.carouFredSel.defaults={synchronise:!1,infinite:!0,circular:!0,responsive:!1,direction:"left",items:{start:0},scroll:{easing:"swing",duration:500,pauseOnHover:!1,event:"click",queue:!1}},$.fn.carouFredSel.configs={debug:!1,transition:!1,onWindowResize:"throttle",events:{prefix:"",namespace:"cfs"},wrapper:{element:"div",classname:"caroufredsel_wrapper"},classnames:{}},$.fn.carouFredSel.pageAnchorBuilder=function(t){return'<a href="#"><span>'+t+"</span></a>"},$.fn.carouFredSel.progressbarUpdater=function(t){$(this).css("width",t+"%")},$.fn.carouFredSel.cookie={get:function(t){t+="=";for(var e=document.cookie.split(";"),s=0,i=e.length;i>s;s++){for(var o=e[s];" "==o.charAt(0);)o=o.slice(1);if(0==o.indexOf(t))return o.slice(t.length)}return 0},set:function(t,e,s){var i="";if(s){var o=new Date;o.setTime(o.getTime()+24*s*60*60*1e3),i="; expires="+o.toGMTString()}document.cookie=t+"="+e+i+"; path=/"},remove:function(t){$.fn.carouFredSel.cookie.set(t,"",-1)}},$.extend($.easing,{quadratic:function(t){var e=t*t;return t*(-e*t+4*e-6*t+4)},cubic:function(t){return t*(4*t*t-9*t+6)},elastic:function(t){var e=t*t;return t*(33*e*e-106*e*t+126*e-67*t+15)}}))}(jQuery);
assets/js/ywzm_frontend.js CHANGED
@@ -1,60 +1,60 @@
1
- /**
2
- * frontend.js
3
- *
4
- * @author Your Inspiration Themes
5
- * @package YITH WooCommerce Zoom Magnifier
6
- */
7
- jQuery(document).ready(function ($) {
8
-
9
- var yith_wcmg = $('.images');
10
- var yith_wcmg_zoom = $('.yith_magnifier_zoom');
11
- var yith_wcmg_image = $('.yith_magnifier_zoom img').first();
12
-
13
- var yith_wcmg_default_zoom = yith_wcmg.find('.yith_magnifier_zoom').attr('href');
14
- var yith_wcmg_default_image = yith_wcmg.find('.yith_magnifier_zoom img').attr('src');
15
-
16
- if (typeof yith_magnifier_options == 'undefined') {
17
- return false;
18
- }
19
-
20
- yith_wcmg.yith_magnifier(yith_magnifier_options);
21
-
22
- $(document).on('found_variation', 'form.variations_form', function (event, variation) {
23
-
24
- var image_magnifier = variation.image_magnifier ? variation.image_magnifier : yith_wcmg_default_zoom;
25
-
26
- var image_src = yith_wcmg_default_image;
27
- if (ywzm_data.wc_before_3_0) {
28
- if (variation.image_src) {
29
- image_src = variation.image_src;
30
- }
31
- }
32
- else if (variation.image.src) {
33
- image_src = variation.image.src;
34
- }
35
-
36
- yith_wcmg_zoom.attr('href', image_magnifier);
37
- yith_wcmg_image.attr('src', image_src);
38
- yith_wcmg_image.attr('srcset', image_src);
39
- yith_wcmg_image.attr('src-orig', image_src);
40
-
41
- if (yith_wcmg.data('yith_magnifier')) {
42
- yith_wcmg.yith_magnifier('destroy');
43
- }
44
-
45
- yith_wcmg.yith_magnifier(yith_magnifier_options);
46
- }).on('reset_image', function (event) {
47
- yith_wcmg_zoom.attr('href', yith_wcmg_default_zoom);
48
- yith_wcmg_image.attr('src', yith_wcmg_default_image);
49
- yith_wcmg_image.attr('srcset', yith_wcmg_default_image);
50
- yith_wcmg_image.attr('src-orig', yith_wcmg_default_image);
51
-
52
- if (yith_wcmg.data('yith_magnifier')) {
53
- yith_wcmg.yith_magnifier('destroy');
54
- }
55
-
56
- yith_wcmg.yith_magnifier(yith_magnifier_options);
57
- });
58
-
59
- $('form.variations_form .variations select').trigger('change');
60
  });
1
+ /**
2
+ * frontend.js
3
+ *
4
+ * @author Your Inspiration Themes
5
+ * @package YITH WooCommerce Zoom Magnifier
6
+ */
7
+ jQuery(document).ready(function ($) {
8
+
9
+ var yith_wcmg = $('.images');
10
+ var yith_wcmg_zoom = $('.yith_magnifier_zoom');
11
+ var yith_wcmg_image = $('.yith_magnifier_zoom img').first();
12
+
13
+ var yith_wcmg_default_zoom = yith_wcmg.find('.yith_magnifier_zoom').attr('href');
14
+ var yith_wcmg_default_image = yith_wcmg.find('.yith_magnifier_zoom img').attr('src');
15
+
16
+ if (typeof yith_magnifier_options == 'undefined') {
17
+ return false;
18
+ }
19
+
20
+ yith_wcmg.yith_magnifier(yith_magnifier_options);
21
+
22
+ $(document).on('found_variation', 'form.variations_form', function (event, variation) {
23
+
24
+ var image_magnifier = variation.image_magnifier ? variation.image_magnifier : yith_wcmg_default_zoom;
25
+
26
+ var image_src = yith_wcmg_default_image;
27
+ if (ywzm_data.wc_before_3_0) {
28
+ if (variation.image_src) {
29
+ image_src = variation.image_src;
30
+ }
31
+ }
32
+ else if (variation.image.src) {
33
+ image_src = variation.image.src;
34
+ }
35
+
36
+ yith_wcmg_zoom.attr('href', image_magnifier);
37
+ yith_wcmg_image.attr('src', image_src);
38
+ yith_wcmg_image.attr('srcset', image_src);
39
+ yith_wcmg_image.attr('src-orig', image_src);
40
+
41
+ if (yith_wcmg.data('yith_magnifier')) {
42
+ yith_wcmg.yith_magnifier('destroy');
43
+ }
44
+
45
+ yith_wcmg.yith_magnifier(yith_magnifier_options);
46
+ }).on('reset_image', function (event) {
47
+ yith_wcmg_zoom.attr('href', yith_wcmg_default_zoom);
48
+ yith_wcmg_image.attr('src', yith_wcmg_default_image);
49
+ yith_wcmg_image.attr('srcset', yith_wcmg_default_image);
50
+ yith_wcmg_image.attr('src-orig', yith_wcmg_default_image);
51
+
52
+ if (yith_wcmg.data('yith_magnifier')) {
53
+ yith_wcmg.yith_magnifier('destroy');
54
+ }
55
+
56
+ yith_wcmg.yith_magnifier(yith_magnifier_options);
57
+ });
58
+
59
+ $('form.variations_form .variations select').trigger('change');
60
  });
changelog.txt CHANGED
@@ -1,191 +1,191 @@
1
- === YITH WooCommerce Zoom Magnifier ===
2
-
3
- == Changelog History ==
4
-
5
- = Version 1.2.18 - Released: May 02, 2016 =
6
-
7
- * Updated: plugin compatible with WordPress 4.5
8
- * Updated: plugin author name
9
- * Updated: YITH Plugin Framework
10
-
11
- = Version 1.2.17 - Released: Feb 24, 2016 =
12
-
13
- * Updated: YITH Plugin FW
14
- * Fixed: removed trailing comma in JS script that break the page rendering on old IE browser
15
-
16
- = Version 1.2.16 - Released: Jan 18, 2016 =
17
-
18
- * Updated: YITH Plugin FW loading remove unused YIT constant
19
- * Added: filter yith_ywzm_zoom_wrap_additional_css for customizing CSS class for the wrapping div
20
- * Updated: plugin ready for WooCommerce 2.5
21
-
22
- = Version 1.2.15 - Released: Jan 04, 2016 =
23
-
24
- * Fixed: Cannot redeclare yith_ywzm_install_woocommerce_admin_notice() when the plugin is loaded from YITH Essential Kit
25
-
26
- = Version 1.2.14 - Released: Dec 29, 2015 =
27
-
28
- * Added: Compatibility with YIT WooCommerce Featured Audio & Video Content
29
-
30
- = Version 1.2.13 - Released: Dec 21, 2015 =
31
-
32
- * Fixed: multiple wrap of zoom element with the div with class yith_magnifier_zoom_wrap
33
- * Updated: jquery-ui.css is no more linked as external resource but shipped within the plugin, as wordpress.org asked
34
-
35
- = Version 1.2.12 - Released: Oct 29, 2015 =
36
-
37
- * Updated: YITH plugin framework
38
-
39
- = Version 1.2.11 - Released: Oct 23, 2015 =
40
-
41
- * Updated: compatibility with YITH WooCommerce Quick View.
42
-
43
- = Version 1.2.10 - Released: Sep 24, 2015 =
44
-
45
- * Updated: changed text domain as translate.wordpress.org requisite.
46
-
47
- = Version 1.2.9 - Released: Sep 04, 2015 =
48
-
49
- * Updated: Languages file
50
- * Fixed: Changed plugin text domain from yit to ywmz
51
- * Fixed: featured image shown one time on slider.
52
- * Fixed: div not shown if loading text is empty.
53
-
54
- = Version 1.2.8 - Released: Sep 01, 2015 =
55
-
56
- * Fixed: removed deprecated woocommerce_update_option_X hook.
57
-
58
- = Version 1.2.7 - Released: Aug 27, 2015 =
59
-
60
- * Fixed: resolved XSS vulnerability.
61
-
62
- = Version 1.2.6 - Released: Aug 12, 2015 =
63
-
64
- * Tweak: update YITH Plugin framework.
65
-
66
- = Version 1.2.5 - Released: Jul 23, 2015 =
67
-
68
- * Added: italian language.
69
-
70
- = Version 1.2.4 - Released: Jun 26, 2015 =
71
-
72
- * Added: support to srcset and src-orig attributes.
73
-
74
- = Version 1.2.3 - Released: May 29, 2015 =
75
-
76
- * Added: included jquery-migrate as prerequisite.
77
-
78
- = Version 1.2.2 - Released: May 22, 2015 =
79
-
80
- * Fixed: CSS fix for EssentialGrid conflicts.
81
-
82
- = Version 1.2.1 - Released: May 04, 2015 =
83
-
84
- * Fixed: removed z-index that made the zoom area hiding other elements in certain themes.
85
-
86
- = Version 1.2.0 - Released: Apr 22, 2015 =
87
-
88
- * Fix : security issue (https://make.wordpress.org/plugins/2015/04/20/fixing-add_query_arg-and-remove_query_arg-usage/)
89
- * Tweak : support up to Wordpress 4.2
90
-
91
- = 1.1.8 =
92
-
93
- * Fixed: compatibility with some YITHEMES themes.
94
-
95
- = 1.1.7 =
96
-
97
- * Fixed: Unwanted expand link on product image.
98
-
99
- = 1.1.6 =
100
-
101
- * Added: the plugin can be disabled on mobile devices.
102
-
103
- = 1.1.5 =
104
-
105
- * Fixed: multiple wrap
106
-
107
- = 1.1.4 =
108
-
109
- * Tweak: WooCommerce 2.2. support
110
- * Fixed: Placeholder in product without featured image
111
- * Fixed: Slider items number options doesn't work
112
-
113
- = 1.1.3 =
114
-
115
- * Added: Support to WC 2.2.2
116
- * Updated: Plugin Core Framework
117
-
118
- = 1.1.2 =
119
-
120
- * Restored: Image size options on WC 2.1.x
121
- * Fixed: Items number option on thumb slider
122
- * Fixed: Hard crop issue on WC 2.1.x
123
-
124
- = 1.1.1 =
125
-
126
- * Fixed: Thumbnails slider direction on single product page
127
-
128
- = 1.1.0 =
129
-
130
- * Added: Support to WooCommerce 2.1.x
131
-
132
- = 1.0.8 =
133
-
134
- * Added: ability to change the slider programmatically
135
-
136
- = 1.0.7 =
137
-
138
- * Fixed: zoomed image did not change when select a variation
139
-
140
- = 1.0.6 =
141
-
142
- * Removed white space from frontend.php
143
-
144
- = 1.0.5 =
145
-
146
- * Fixed: magnifier override the plugin for featured video
147
-
148
- = 1.0.4 =
149
-
150
- * Minor bugs fixes
151
-
152
- = 1.0.3 =
153
-
154
- * Added ability to load the plugin even when WooCommerce is installed in a different folder
155
-
156
- = 1.0.2 =
157
-
158
- * Fixed fatal error to yit_debug with yit themes
159
-
160
- = 1.0.1 =
161
-
162
- * Optimized images
163
- * Updated internal framework
164
-
165
- = 1.0.0 =
166
-
167
- * Initial release
168
-
169
- == Suggestions ==
170
-
171
- If you have suggestions about how to improve YITH WooCommerce Zoom Magnifier, you can [write us](mailto:plugins@yithemes.com "Your Inspiration Themes") so we can bundle them into YITH Zoom WooCommerce Magnifier.
172
-
173
- == Translators ==
174
-
175
- = Available Languages =
176
- * English (Default)
177
- * Italian
178
- * Spanish
179
-
180
- If you have created your own language pack, or have an update for an existing one, you can send [gettext PO and MO file](http://codex.wordpress.org/Translating_WordPress "Translating WordPress")
181
- [use](http://yithemes.com/contact/ "Your Inspiration Themes") so we can bundle it into YITH WooCommerce Zoom Magnfier Languages.
182
-
183
- == Documentation ==
184
-
185
- Full documentation is available [here](http://yithemes.com/docs-plugins/yith_woocommerce_magnifier/).
186
-
187
- == Upgrade notice ==
188
-
189
- = 1.0.0 =
190
-
191
  Initial release
1
+ === YITH WooCommerce Zoom Magnifier ===
2
+
3
+ == Changelog History ==
4
+
5
+ = Version 1.2.18 - Released: May 02, 2016 =
6
+
7
+ * Updated: plugin compatible with WordPress 4.5
8
+ * Updated: plugin author name
9
+ * Updated: YITH Plugin Framework
10
+
11
+ = Version 1.2.17 - Released: Feb 24, 2016 =
12
+
13
+ * Updated: YITH Plugin FW
14
+ * Fixed: removed trailing comma in JS script that break the page rendering on old IE browser
15
+
16
+ = Version 1.2.16 - Released: Jan 18, 2016 =
17
+
18
+ * Updated: YITH Plugin FW loading remove unused YIT constant
19
+ * Added: filter yith_ywzm_zoom_wrap_additional_css for customizing CSS class for the wrapping div
20
+ * Updated: plugin ready for WooCommerce 2.5
21
+
22
+ = Version 1.2.15 - Released: Jan 04, 2016 =
23
+
24
+ * Fixed: Cannot redeclare yith_ywzm_install_woocommerce_admin_notice() when the plugin is loaded from YITH Essential Kit
25
+
26
+ = Version 1.2.14 - Released: Dec 29, 2015 =
27
+
28
+ * Added: Compatibility with YIT WooCommerce Featured Audio & Video Content
29
+
30
+ = Version 1.2.13 - Released: Dec 21, 2015 =
31
+
32
+ * Fixed: multiple wrap of zoom element with the div with class yith_magnifier_zoom_wrap
33
+ * Updated: jquery-ui.css is no more linked as external resource but shipped within the plugin, as wordpress.org asked
34
+
35
+ = Version 1.2.12 - Released: Oct 29, 2015 =
36
+
37
+ * Updated: YITH plugin framework
38
+
39
+ = Version 1.2.11 - Released: Oct 23, 2015 =
40
+
41
+ * Updated: compatibility with YITH WooCommerce Quick View.
42
+
43
+ = Version 1.2.10 - Released: Sep 24, 2015 =
44
+
45
+ * Updated: changed text domain as translate.wordpress.org requisite.
46
+
47
+ = Version 1.2.9 - Released: Sep 04, 2015 =
48
+
49
+ * Updated: Languages file
50
+ * Fixed: Changed plugin text domain from yit to ywmz
51
+ * Fixed: featured image shown one time on slider.
52
+ * Fixed: div not shown if loading text is empty.
53
+
54
+ = Version 1.2.8 - Released: Sep 01, 2015 =
55
+
56
+ * Fixed: removed deprecated woocommerce_update_option_X hook.
57
+
58
+ = Version 1.2.7 - Released: Aug 27, 2015 =
59
+
60
+ * Fixed: resolved XSS vulnerability.
61
+
62
+ = Version 1.2.6 - Released: Aug 12, 2015 =
63
+
64
+ * Tweak: update YITH Plugin framework.
65
+
66
+ = Version 1.2.5 - Released: Jul 23, 2015 =
67
+
68
+ * Added: italian language.
69
+
70
+ = Version 1.2.4 - Released: Jun 26, 2015 =
71
+
72
+ * Added: support to srcset and src-orig attributes.
73
+
74
+ = Version 1.2.3 - Released: May 29, 2015 =
75
+
76
+ * Added: included jquery-migrate as prerequisite.
77
+
78
+ = Version 1.2.2 - Released: May 22, 2015 =
79
+
80
+ * Fixed: CSS fix for EssentialGrid conflicts.
81
+
82
+ = Version 1.2.1 - Released: May 04, 2015 =
83
+
84
+ * Fixed: removed z-index that made the zoom area hiding other elements in certain themes.
85
+
86
+ = Version 1.2.0 - Released: Apr 22, 2015 =
87
+
88
+ * Fix : security issue (https://make.wordpress.org/plugins/2015/04/20/fixing-add_query_arg-and-remove_query_arg-usage/)
89
+ * Tweak : support up to Wordpress 4.2
90
+
91
+ = 1.1.8 =
92
+
93
+ * Fixed: compatibility with some YITHEMES themes.
94
+
95
+ = 1.1.7 =
96
+
97
+ * Fixed: Unwanted expand link on product image.
98
+
99
+ = 1.1.6 =
100
+
101
+ * Added: the plugin can be disabled on mobile devices.
102
+
103
+ = 1.1.5 =
104
+
105
+ * Fixed: multiple wrap
106
+
107
+ = 1.1.4 =
108
+
109
+ * Tweak: WooCommerce 2.2. support
110
+ * Fixed: Placeholder in product without featured image
111
+ * Fixed: Slider items number options doesn't work
112
+
113
+ = 1.1.3 =
114
+
115
+ * Added: Support to WC 2.2.2
116
+ * Updated: Plugin Core Framework
117
+
118
+ = 1.1.2 =
119
+
120
+ * Restored: Image size options on WC 2.1.x
121
+ * Fixed: Items number option on thumb slider
122
+ * Fixed: Hard crop issue on WC 2.1.x
123
+
124
+ = 1.1.1 =
125
+
126
+ * Fixed: Thumbnails slider direction on single product page
127
+
128
+ = 1.1.0 =
129
+
130
+ * Added: Support to WooCommerce 2.1.x
131
+
132
+ = 1.0.8 =
133
+
134
+ * Added: ability to change the slider programmatically
135
+
136
+ = 1.0.7 =
137
+
138
+ * Fixed: zoomed image did not change when select a variation
139
+
140
+ = 1.0.6 =
141
+
142
+ * Removed white space from frontend.php
143
+
144
+ = 1.0.5 =
145
+
146
+ * Fixed: magnifier override the plugin for featured video
147
+
148
+ = 1.0.4 =
149
+
150
+ * Minor bugs fixes
151
+
152
+ = 1.0.3 =
153
+
154
+ * Added ability to load the plugin even when WooCommerce is installed in a different folder
155
+
156
+ = 1.0.2 =
157
+
158
+ * Fixed fatal error to yit_debug with yit themes
159
+
160
+ = 1.0.1 =
161
+
162
+ * Optimized images
163
+ * Updated internal framework
164
+
165
+ = 1.0.0 =
166
+
167
+ * Initial release
168
+
169
+ == Suggestions ==
170
+
171
+ If you have suggestions about how to improve YITH WooCommerce Zoom Magnifier, you can [write us](mailto:plugins@yithemes.com "Your Inspiration Themes") so we can bundle them into YITH Zoom WooCommerce Magnifier.
172
+
173
+ == Translators ==
174
+
175
+ = Available Languages =
176
+ * English (Default)
177
+ * Italian
178
+ * Spanish
179
+
180
+ If you have created your own language pack, or have an update for an existing one, you can send [gettext PO and MO file](http://codex.wordpress.org/Translating_WordPress "Translating WordPress")
181
+ [use](http://yithemes.com/contact/ "Your Inspiration Themes") so we can bundle it into YITH WooCommerce Zoom Magnfier Languages.
182
+
183
+ == Documentation ==
184
+
185
+ Full documentation is available [here](http://yithemes.com/docs-plugins/yith_woocommerce_magnifier/).
186
+
187
+ == Upgrade notice ==
188
+
189
+ = 1.0.0 =
190
+
191
  Initial release
class.yith-wcmg-admin.php CHANGED
@@ -1,112 +1,112 @@
1
- <?php
2
- /**
3
- * Admin class
4
- *
5
- * @author Your Inspiration Themes
6
- * @package YITH WooCommerce Zoom Magnifier
7
- * @version 1.1.2
8
- */
9
-
10
- if ( ! defined( 'YITH_WCMG' ) ) {
11
- exit;
12
- } // Exit if accessed directly
13
-
14
- if ( ! class_exists( 'YITH_WCMG_Admin' ) ) {
15
- /**
16
- * Admin class.
17
- * The class manage all the admin behaviors.
18
- *
19
- * @since 1.0.0
20
- */
21
- class YITH_WCMG_Admin {
22
- /**
23
- * Plugin options
24
- *
25
- * @var array
26
- * @access public
27
- * @since 1.0.0
28
- */
29
- public $options = array();
30
-
31
- /**
32
- * Various links
33
- *
34
- * @var string
35
- * @access public
36
- * @since 1.0.0
37
- */
38
- public $doc_url = 'https://docs.yithemes.com/yith-woocommerce-zoom-magnifier/';
39
-
40
- /**
41
- * Constructor
42
- *
43
- * @access public
44
- * @since 1.0.0
45
- */
46
- public function __construct( ) {
47
-
48
- //Actions
49
- add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_styles_scripts' ) );
50
-
51
- add_action( 'woocommerce_update_options_yith_wcmg', array( $this, 'update_options' ) );
52
-
53
- add_action( 'woocommerce_admin_field_banner', array( $this, 'admin_fields_banner' ) );
54
-
55
- add_filter( 'woocommerce_catalog_settings', array( $this, 'add_catalog_image_size' ) );
56
-
57
- // YITH WCMG Loaded
58
- do_action( 'yith_wcmg_loaded' );
59
- }
60
-
61
- /**
62
- * Add Zoom Image size to Woocommerce -> Catalog
63
- *
64
- * @access public
65
- *
66
- * @param array $settings
67
- *
68
- * @return array
69
- */
70
- public function add_catalog_image_size( $settings ) {
71
- $tmp = $settings[count( $settings ) - 1];
72
- unset( $settings[count( $settings ) - 1] );
73
-
74
- $settings[] = array(
75
- 'name' => __( 'Image Size', 'yith-woocommerce-zoom-magnifier' ),
76
- 'desc' => __( 'The size of the images used within the magnifier box', 'yith-woocommerce-zoom-magnifier' ),
77
- 'id' => 'woocommerce_magnifier_image',
78
- 'css' => '',
79
- 'type' => 'image_width',
80
- 'default' => array(
81
- 'width' => 600,
82
- 'height' => 600,
83
- 'crop' => true
84
- ),
85
- 'std' => array(
86
- 'width' => 600,
87
- 'height' => 600,
88
- 'crop' => true
89
- ),
90
- 'desc_tip' => true
91
- );
92
- $settings[] = $tmp;
93
- return $settings;
94
- }
95
-
96
- /**
97
- * Enqueue admin styles and scripts
98
- *
99
- * @access public
100
- * @return void
101
- * @since 1.0.0
102
- */
103
- public function enqueue_styles_scripts() {
104
- wp_enqueue_script( 'jquery-ui' );
105
- wp_enqueue_script( 'jquery-ui-core' );
106
- wp_enqueue_script( 'jquery-ui-mouse' );
107
- wp_enqueue_script( 'jquery-ui-slider' );
108
-
109
- wp_enqueue_style( 'yith_wcmg_admin', YITH_WCMG_URL . 'assets/css/admin.css' );
110
- }
111
- }
112
  }
1
+ <?php
2
+ /**
3
+ * Admin class
4
+ *
5
+ * @author Your Inspiration Themes
6
+ * @package YITH WooCommerce Zoom Magnifier
7
+ * @version 1.1.2
8
+ */
9
+
10
+ if ( ! defined( 'YITH_WCMG' ) ) {
11
+ exit;
12
+ } // Exit if accessed directly
13
+
14
+ if ( ! class_exists( 'YITH_WCMG_Admin' ) ) {
15
+ /**
16
+ * Admin class.
17
+ * The class manage all the admin behaviors.
18
+ *
19
+ * @since 1.0.0
20
+ */
21
+ class YITH_WCMG_Admin {
22
+ /**
23
+ * Plugin options
24
+ *
25
+ * @var array
26
+ * @access public
27
+ * @since 1.0.0
28
+ */
29
+ public $options = array();
30
+
31
+ /**
32
+ * Various links
33
+ *
34
+ * @var string
35
+ * @access public
36
+ * @since 1.0.0
37
+ */
38
+ public $doc_url = 'https://docs.yithemes.com/yith-woocommerce-zoom-magnifier/';
39
+
40
+ /**
41
+ * Constructor
42
+ *
43
+ * @access public
44
+ * @since 1.0.0
45
+ */
46
+ public function __construct( ) {
47
+
48
+ //Actions
49
+ add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_styles_scripts' ) );
50
+
51
+ add_action( 'woocommerce_update_options_yith_wcmg', array( $this, 'update_options' ) );
52
+
53
+ add_action( 'woocommerce_admin_field_banner', array( $this, 'admin_fields_banner' ) );
54
+
55
+ add_filter( 'woocommerce_catalog_settings', array( $this, 'add_catalog_image_size' ) );
56
+
57
+ // YITH WCMG Loaded
58
+ do_action( 'yith_wcmg_loaded' );
59
+ }
60
+
61
+ /**
62
+ * Add Zoom Image size to Woocommerce -> Catalog
63
+ *
64
+ * @access public
65
+ *
66
+ * @param array $settings
67
+ *
68
+ * @return array
69
+ */
70
+ public function add_catalog_image_size( $settings ) {
71
+ $tmp = $settings[count( $settings ) - 1];
72
+ unset( $settings[count( $settings ) - 1] );
73
+
74
+ $settings[] = array(
75
+ 'name' => __( 'Image Size', 'yith-woocommerce-zoom-magnifier' ),
76
+ 'desc' => __( 'The size of the images used within the magnifier box', 'yith-woocommerce-zoom-magnifier' ),
77
+ 'id' => 'woocommerce_magnifier_image',
78
+ 'css' => '',
79
+ 'type' => 'image_width',
80
+ 'default' => array(
81
+ 'width' => 600,
82
+ 'height' => 600,
83
+ 'crop' => true
84
+ ),
85
+ 'std' => array(
86
+ 'width' => 600,
87
+ 'height' => 600,
88
+ 'crop' => true
89
+ ),
90
+ 'desc_tip' => true
91
+ );
92
+ $settings[] = $tmp;
93
+ return $settings;
94
+ }
95
+
96
+ /**
97
+ * Enqueue admin styles and scripts
98
+ *
99
+ * @access public
100
+ * @return void
101
+ * @since 1.0.0
102
+ */
103
+ public function enqueue_styles_scripts() {
104
+ wp_enqueue_script( 'jquery-ui' );
105
+ wp_enqueue_script( 'jquery-ui-core' );
106
+ wp_enqueue_script( 'jquery-ui-mouse' );
107
+ wp_enqueue_script( 'jquery-ui-slider' );
108
+
109
+ wp_enqueue_style( 'yith_wcmg_admin', YITH_WCMG_URL . 'assets/css/admin.css' );
110
+ }
111
+ }
112
  }
class.yith-wcmg-frontend.php CHANGED
@@ -1,173 +1,173 @@
1
- <?php
2
- /**
3
- * Frontend class
4
- *
5
- * @author Your Inspiration Themes
6
- * @package YITH WooCommerce Zoom Magnifier
7
- * @version 1.1.2
8
- */
9
-
10
- if ( ! defined ( 'YITH_WCMG' ) ) {
11
- exit;
12
- } // Exit if accessed directly
13
-
14
- if ( ! class_exists ( 'YITH_WCMG_Frontend' ) ) {
15
- /**
16
- * Admin class.
17
- * The class manage all the Frontend behaviors.
18
- *
19
- * @since 1.0.0
20
- */
21
- class YITH_WCMG_Frontend {
22
-
23
-
24
- /**
25
- * Constructor
26
- *
27
- * @access public
28
- * @since 1.0.0
29
- */
30
- public function __construct() {
31
-
32
- // add the action only when the loop is initializate
33
- add_action ( 'template_redirect', array( $this, 'render' ) );
34
-
35
- }
36
-
37
- public function render() {
38
- if ( yith_wcmg_is_enabled () && ! apply_filters ( 'yith_wczm_featured_video_enabled', false ) ) {
39
- //change the templates
40
- remove_action ( 'woocommerce_before_single_product_summary', 'woocommerce_show_product_images', 20 );
41
- remove_action ( 'woocommerce_product_thumbnails', 'woocommerce_show_product_thumbnails', 20 );
42
- add_action ( 'woocommerce_before_single_product_summary', array( $this, 'show_product_images' ), 20 );
43
- add_action ( 'woocommerce_product_thumbnails', array( $this, 'show_product_thumbnails' ), 20 );
44
-
45
- //custom styles and javascripts
46
- add_action ( 'wp_enqueue_scripts', array( $this, 'enqueue_styles_scripts' ) );
47
-
48
- //add attributes to product variations
49
- add_filter ( 'woocommerce_available_variation', array( $this, 'available_variation' ), 10, 3 );
50
- }
51
- }
52
-
53
-
54
- /**
55
- * Change product-single.php template
56
- *
57
- * @access public
58
- * @return void
59
- * @since 1.0.0
60
- */
61
- public function show_product_images() {
62
-
63
- /** FIX WOO 2.1 */
64
- $wc_get_template = function_exists ( 'wc_get_template' ) ? 'wc_get_template' : 'woocommerce_get_template';
65
- $wc_get_template( 'single-product/product-image-magnifier.php', array(), '', YITH_YWZM_DIR . 'templates/' );
66
- }
67
-
68
-
69
- /**
70
- * Change product-thumbnails.php template
71
- *
72
- * @access public
73
- * @return void
74
- * @since 1.0.0
75
- */
76
- public function show_product_thumbnails() {
77
-
78
- /** FIX WOO 2.1 */
79
- $wc_get_template = function_exists ( 'wc_get_template' ) ? 'wc_get_template' : 'woocommerce_get_template';
80
-
81
- $wc_get_template( 'single-product/product-thumbnails-magnifier.php', array(), '', YITH_YWZM_DIR . 'templates/' );
82
- }
83
-
84
-
85
- /**
86
- * Enqueue styles and scripts
87
- *
88
- * @access public
89
- * @return void
90
- * @since 1.0.0
91
- */
92
- public function enqueue_styles_scripts() {
93
- global $post;
94
-
95
- $suffix = defined ( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
96
-
97
- wp_register_script ( 'ywzm-magnifier-slider',
98
- YITH_WCMG_URL . 'assets/js/' . yit_load_js_file ( 'jquery.carouFredSel.js' ),
99
- array(
100
- 'jquery',
101
- 'jquery-migrate',
102
- ),
103
- '6.2.1',
104
- true );
105
-
106
- wp_register_script ( 'ywzm-magnifier',
107
- YITH_WCMG_URL . 'assets/js/' . yit_load_js_file ( 'yith_magnifier.js' ),
108
- array( 'jquery' ),
109
- YITH_YWZM_VERSION,
110
- true );
111
-
112
- wp_localize_script( 'ywzm-magnifier', 'yith_wc_zoom_magnifier_storage_object', apply_filters( 'yith_wc_zoom_magnifier_front_magnifier_localize', array(
113
- 'ajax_url' => admin_url( 'admin-ajax.php' ),
114
- ) ) );
115
-
116
- wp_register_script ( 'ywzm_frontend',
117
- YITH_WCMG_URL . 'assets/js/' . yit_load_js_file ( 'ywzm_frontend.js' ),
118
- array(
119
- 'jquery',
120
- 'ywzm-magnifier',
121
- ),
122
- YITH_YWZM_VERSION,
123
- true );
124
-
125
- wp_register_style ( 'ywzm-magnifier', YITH_WCMG_URL . 'assets/css/yith_magnifier.css' );
126
-
127
- if ( is_product () || ( ! empty( $post->post_content ) && strstr ( $post->post_content, '[product_page' ) ) ) {
128
-
129
- wp_localize_script ( 'ywzm_frontend',
130
- 'ywzm_data', array(
131
- 'wc_before_3_0' => version_compare ( WC ()->version, '3.0', '<' ),
132
- )
133
- );
134
-
135
- // Enqueue PrettyPhoto style and script
136
- $wc_assets_path = str_replace ( array( 'http:', 'https:' ), '', WC ()->plugin_url () ) . '/assets/';
137
-
138
- // Enqueue scripts
139
- wp_enqueue_script ( 'prettyPhoto', $wc_assets_path . 'js/prettyPhoto/jquery.prettyPhoto' . $suffix . '.js', array( 'jquery' ), '3.1.6', true );
140
- wp_enqueue_script ( 'ywzm-magnifier-slider' );
141
- wp_enqueue_script ( 'ywzm-magnifier' );
142
- wp_enqueue_script ( 'ywzm_frontend' );
143
-
144
- // Enqueue Style
145
- $css = file_exists ( get_stylesheet_directory () . '/woocommerce/yith_magnifier.css' ) ? get_stylesheet_directory_uri () . '/woocommerce/yith_magnifier.css' : YITH_WCMG_URL . 'assets/css/frontend.css';
146
- wp_enqueue_style ( 'ywzm-prettyPhoto', $wc_assets_path . 'css/prettyPhoto.css' );
147
- wp_enqueue_style ( 'ywzm-magnifier' );
148
- wp_enqueue_style ( 'ywzm_frontend', $css );
149
- }
150
- }
151
-
152
-
153
- /**
154
- * Add attributes to product variations
155
- *
156
- * @param array $data
157
- * @param WC_Product_Variable $wc_prod
158
- * @param WC_Product_Variation $variation
159
- *
160
- * @return mixed
161
- */
162
- public function available_variation( $data, $wc_prod, $variation ) {
163
-
164
- $attachment_id = get_post_thumbnail_id ( version_compare ( WC ()->version, '3.0', '<' ) ? $variation->get_variation_id () : $variation->get_id () );
165
- $attachment = wp_get_attachment_image_src ( $attachment_id, 'shop_magnifier' );
166
-
167
- $data['image_magnifier'] = $attachment ? current ( $attachment ) : '';
168
-
169
- return $data;
170
- }
171
-
172
- }
173
- }
1
+ <?php
2
+ /**
3
+ * Frontend class
4
+ *
5
+ * @author Your Inspiration Themes
6
+ * @package YITH WooCommerce Zoom Magnifier
7
+ * @version 1.1.2
8
+ */
9
+
10
+ if ( ! defined ( 'YITH_WCMG' ) ) {
11
+ exit;
12
+ } // Exit if accessed directly
13
+
14
+ if ( ! class_exists ( 'YITH_WCMG_Frontend' ) ) {
15
+ /**
16
+ * Admin class.
17
+ * The class manage all the Frontend behaviors.
18
+ *
19
+ * @since 1.0.0
20
+ */
21
+ class YITH_WCMG_Frontend {
22
+
23
+
24
+ /**
25
+ * Constructor
26
+ *
27
+ * @access public
28
+ * @since 1.0.0
29
+ */
30
+ public function __construct() {
31
+
32
+ // add the action only when the loop is initializate
33
+ add_action ( 'template_redirect', array( $this, 'render' ) );
34
+
35
+ }
36
+
37
+ public function render() {
38
+ if ( yith_wcmg_is_enabled () && ! apply_filters ( 'yith_wczm_featured_video_enabled', false ) ) {
39
+ //change the templates
40
+ remove_action ( 'woocommerce_before_single_product_summary', 'woocommerce_show_product_images', 20 );
41
+ remove_action ( 'woocommerce_product_thumbnails', 'woocommerce_show_product_thumbnails', 20 );
42
+ add_action ( 'woocommerce_before_single_product_summary', array( $this, 'show_product_images' ), 20 );
43
+ add_action ( 'woocommerce_product_thumbnails', array( $this, 'show_product_thumbnails' ), 20 );
44
+
45
+ //custom styles and javascripts
46
+ add_action ( 'wp_enqueue_scripts', array( $this, 'enqueue_styles_scripts' ) );
47
+
48
+ //add attributes to product variations
49
+ add_filter ( 'woocommerce_available_variation', array( $this, 'available_variation' ), 10, 3 );
50
+ }
51
+ }
52
+
53
+
54
+ /**
55
+ * Change product-single.php template
56
+ *
57
+ * @access public
58
+ * @return void
59
+ * @since 1.0.0
60
+ */
61
+ public function show_product_images() {
62
+
63
+ /** FIX WOO 2.1 */
64
+ $wc_get_template = function_exists ( 'wc_get_template' ) ? 'wc_get_template' : 'woocommerce_get_template';
65
+ $wc_get_template( 'single-product/product-image-magnifier.php', array(), '', YITH_YWZM_DIR . 'templates/' );
66
+ }
67
+
68
+
69
+ /**
70
+ * Change product-thumbnails.php template
71
+ *
72
+ * @access public
73
+ * @return void
74
+ * @since 1.0.0
75
+ */
76
+ public function show_product_thumbnails() {
77
+
78
+ /** FIX WOO 2.1 */
79
+ $wc_get_template = function_exists ( 'wc_get_template' ) ? 'wc_get_template' : 'woocommerce_get_template';
80
+
81
+ $wc_get_template( 'single-product/product-thumbnails-magnifier.php', array(), '', YITH_YWZM_DIR . 'templates/' );
82
+ }
83
+
84
+
85
+ /**
86
+ * Enqueue styles and scripts
87
+ *
88
+ * @access public
89
+ * @return void
90
+ * @since 1.0.0
91
+ */
92
+ public function enqueue_styles_scripts() {
93
+ global $post;
94
+
95
+ $suffix = defined ( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
96
+
97
+ wp_register_script ( 'ywzm-magnifier-slider',
98
+ YITH_WCMG_URL . 'assets/js/' . yit_load_js_file ( 'jquery.carouFredSel.js' ),
99
+ array(
100
+ 'jquery',
101
+ 'jquery-migrate',
102
+ ),
103
+ '6.2.1',
104
+ true );
105
+
106
+ wp_register_script ( 'ywzm-magnifier',
107
+ YITH_WCMG_URL . 'assets/js/' . yit_load_js_file ( 'yith_magnifier.js' ),
108
+ array( 'jquery' ),
109
+ YITH_YWZM_VERSION,
110
+ true );
111
+
112
+ wp_localize_script( 'ywzm-magnifier', 'yith_wc_zoom_magnifier_storage_object', apply_filters( 'yith_wc_zoom_magnifier_front_magnifier_localize', array(
113
+ 'ajax_url' => admin_url( 'admin-ajax.php' ),
114
+ ) ) );
115
+
116
+ wp_register_script ( 'ywzm_frontend',
117
+ YITH_WCMG_URL . 'assets/js/' . yit_load_js_file ( 'ywzm_frontend.js' ),
118
+ array(
119
+ 'jquery',
120
+ 'ywzm-magnifier',
121
+ ),
122
+ YITH_YWZM_VERSION,
123
+ true );
124
+
125
+ wp_register_style ( 'ywzm-magnifier', YITH_WCMG_URL . 'assets/css/yith_magnifier.css' );
126
+
127
+ if ( is_product () || ( ! empty( $post->post_content ) && strstr ( $post->post_content, '[product_page' ) ) ) {
128
+
129
+ wp_localize_script ( 'ywzm_frontend',
130
+ 'ywzm_data', array(
131
+ 'wc_before_3_0' => version_compare ( WC ()->version, '3.0', '<' ),
132
+ )
133
+ );
134
+
135
+ // Enqueue PrettyPhoto style and script
136
+ $wc_assets_path = str_replace ( array( 'http:', 'https:' ), '', WC ()->plugin_url () ) . '/assets/';
137
+
138
+ // Enqueue scripts
139
+ wp_enqueue_script ( 'prettyPhoto', $wc_assets_path . 'js/prettyPhoto/jquery.prettyPhoto' . $suffix . '.js', array( 'jquery' ), '3.1.6', true );
140
+ wp_enqueue_script ( 'ywzm-magnifier-slider' );
141
+ wp_enqueue_script ( 'ywzm-magnifier' );
142
+ wp_enqueue_script ( 'ywzm_frontend' );
143
+
144
+ // Enqueue Style
145
+ $css = file_exists ( get_stylesheet_directory () . '/woocommerce/yith_magnifier.css' ) ? get_stylesheet_directory_uri () . '/woocommerce/yith_magnifier.css' : YITH_WCMG_URL . 'assets/css/frontend.css';
146
+ wp_enqueue_style ( 'ywzm-prettyPhoto', $wc_assets_path . 'css/prettyPhoto.css' );
147
+ wp_enqueue_style ( 'ywzm-magnifier' );
148
+ wp_enqueue_style ( 'ywzm_frontend', $css );
149
+ }
150
+ }
151
+
152
+
153
+ /**
154
+ * Add attributes to product variations
155
+ *
156
+ * @param array $data
157
+ * @param WC_Product_Variable $wc_prod
158
+ * @param WC_Product_Variation $variation
159
+ *
160
+ * @return mixed
161
+ */
162
+ public function available_variation( $data, $wc_prod, $variation ) {
163
+
164
+ $attachment_id = get_post_thumbnail_id ( version_compare ( WC ()->version, '3.0', '<' ) ? $variation->get_variation_id () : $variation->get_id () );
165
+ $attachment = wp_get_attachment_image_src ( $attachment_id, 'shop_magnifier' );
166
+
167
+ $data['image_magnifier'] = $attachment ? current ( $attachment ) : '';
168
+
169
+ return $data;
170
+ }
171
+
172
+ }
173
+ }
functions.yith-wcmg.php CHANGED
@@ -1,78 +1,78 @@
1
- <?php
2
- /**
3
- * Functions
4
- *
5
- * @author Your Inspiration Themes
6
- * @package YITH WooCommerce Zoom Magnifier
7
- * @version 1.1.2
8
- */
9
-
10
- if ( ! defined ( 'YITH_WCMG' ) ) {
11
- exit;
12
- } // Exit if accessed directly
13
-
14
- if ( ! function_exists ( 'yith_wcmg_is_enabled' ) ) {
15
- /**
16
- * Check if the plugin is enabled for the current context
17
- *
18
- * @return bool
19
- * @since 1.0.0
20
- */
21
- function yith_wcmg_is_enabled () {
22
- if ( wp_is_mobile () ) {
23
- return ( 'yes' == get_option ( 'yith_wcmg_enable_mobile' ) );
24
- }
25
-
26
- return get_option ( 'yith_wcmg_enable_plugin' ) == 'yes';
27
- }
28
- }
29
-
30
- if ( ! function_exists ( 'yit_shop_single_w' ) ) {
31
- /**
32
- * Return the shop_single image width
33
- *
34
- * @return integer
35
- * @since 1.0.0
36
- */
37
- function yit_shop_single_w () {
38
- $size = yit_get_image_size ( 'shop_single' );
39
-
40
- return $size[ 'width' ];
41
- }
42
- }
43
-
44
- if ( ! function_exists ( 'yit_shop_thumbnail_w' ) ) {
45
- /**
46
- * Return the shop_thumbnail image width
47
- *
48
- * @return integer
49
- * @since 1.0.0
50
- */
51
- function yit_shop_thumbnail_w () {
52
- $size = yit_get_image_size ( 'shop_thumbnail' );
53
-
54
- return $size[ 'width' ];
55
- }
56
- }
57
-
58
- /* FIX TO WOOCOMMERCE 2.1 */
59
- if ( ! function_exists ( 'yit_get_image_size' ) ) {
60
- /**
61
- * Get default image size
62
- *
63
- * @param array $size current size
64
- *
65
- * @return array
66
- * @author Lorenzo Giuffrida
67
- * @since 1.0.0
68
- */
69
- function yit_get_image_size ( $size ) {
70
- if ( function_exists ( 'wc_get_image_size' ) ) {
71
- return wc_get_image_size ( $size );
72
- } else {
73
- global $woocommerce;
74
-
75
- return $woocommerce->get_image_size ( $size );
76
- }
77
- }
78
- }
1
+ <?php
2
+ /**
3
+ * Functions
4
+ *
5
+ * @author Your Inspiration Themes
6
+ * @package YITH WooCommerce Zoom Magnifier
7
+ * @version 1.1.2
8
+ */
9
+
10
+ if ( ! defined ( 'YITH_WCMG' ) ) {
11
+ exit;
12
+ } // Exit if accessed directly
13
+
14
+ if ( ! function_exists ( 'yith_wcmg_is_enabled' ) ) {
15
+ /**
16
+ * Check if the plugin is enabled for the current context
17
+ *
18
+ * @return bool
19
+ * @since 1.0.0
20
+ */
21
+ function yith_wcmg_is_enabled () {
22
+ if ( wp_is_mobile () ) {
23
+ return ( 'yes' == get_option ( 'yith_wcmg_enable_mobile' ) );
24
+ }
25
+
26
+ return get_option ( 'yith_wcmg_enable_plugin' ) == 'yes';
27
+ }
28
+ }
29
+
30
+ if ( ! function_exists ( 'yit_shop_single_w' ) ) {
31
+ /**
32
+ * Return the shop_single image width
33
+ *
34
+ * @return integer
35
+ * @since 1.0.0
36
+ */
37
+ function yit_shop_single_w () {
38
+ $size = yit_get_image_size ( 'shop_single' );
39
+
40
+ return $size[ 'width' ];
41
+ }
42
+ }
43
+
44
+ if ( ! function_exists ( 'yit_shop_thumbnail_w' ) ) {
45
+ /**
46
+ * Return the shop_thumbnail image width
47
+ *
48
+ * @return integer
49
+ * @since 1.0.0
50
+ */
51
+ function yit_shop_thumbnail_w () {
52
+ $size = yit_get_image_size ( 'shop_thumbnail' );
53
+
54
+ return $size[ 'width' ];
55
+ }
56
+ }
57
+
58
+ /* FIX TO WOOCOMMERCE 2.1 */
59
+ if ( ! function_exists ( 'yit_get_image_size' ) ) {
60
+ /**
61
+ * Get default image size
62
+ *
63
+ * @param array $size current size
64
+ *
65
+ * @return array
66
+ * @author Lorenzo Giuffrida
67
+ * @since 1.0.0
68
+ */
69
+ function yit_get_image_size ( $size ) {
70
+ if ( function_exists ( 'wc_get_image_size' ) ) {
71
+ return wc_get_image_size ( $size );
72
+ } else {
73
+ global $woocommerce;
74
+
75
+ return $woocommerce->get_image_size ( $size );
76
+ }
77
+ }
78
+ }
init.php CHANGED
@@ -1,164 +1,164 @@
1
- <?php
2
- /**
3
- * Plugin Name: YITH WooCommerce Zoom Magnifier
4
- * Plugin URI: https://yithemes.com/themes/plugins/yith-woocommerce-zoom-magnifier/
5
- * Description: <code><strong>YITH WooCommerce Zoom Magnifier</strong></code> allows you to add a zoom effect to product images and a thumbnail slider for the product image gallery. <a href="https://yithemes.com/" target="_blank">Get more plugins for your e-commerce shop on <strong>YITH</strong></a>.
6
- * Version: 1.3.7
7
- * Author: YITH
8
- * Author URI: https://yithemes.com/
9
- * Text Domain: yith-woocommerce-zoom-magnifier
10
- * Domain Path: /languages/
11
- * WC requires at least: 3.3.0
12
- * WC tested up to: 3.5.x
13
- **/
14
-
15
- /* Copyright 2013-2018 Your Inspiration Themes (email : plugins@yithemes.com)
16
-
17
- This program is free software; you can redistribute it and/or modify
18
- it under the terms of the GNU General Public License, version 2, as
19
- published by the Free Software Foundation.
20
-
21
- This program is distributed in the hope that it will be useful,
22
- but WITHOUT ANY WARRANTY; without even the implied warranty of
23
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24
- GNU General Public License for more details.
25
-
26
- You should have received a copy of the GNU General Public License
27
- along with this program; if not, write to the Free Software
28
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
29
- */
30
-
31
- if ( ! defined ( 'ABSPATH' ) ) {
32
- exit;
33
- } // Exit if accessed directly
34
-
35
- if ( ! function_exists( 'is_plugin_active' ) ) {
36
- if ( ! function_exists( 'get_plugin_data' ) ) {
37
- require_once(ABSPATH . 'wp-admin/includes/plugin.php');
38
- }
39
- }
40
-
41
- if ( ! function_exists ( 'yith_ywzm_install_woocommerce_admin_notice' ) ) {
42
- /**
43
- * WooCommerce is not enabled, the plugin will not be effective
44
- *
45
- * @author Lorenzo Giuffrida
46
- * @since 1.0.0
47
- */
48
- function yith_ywzm_install_woocommerce_admin_notice () {
49
- ?>
50
- <div class="error">
51
- <p><?php _e ( 'YITH WooCommerce Zoom Magnifier is enabled but not effective. It requires WooCommerce in order to work.', 'yith-woocommerce-zoom-magnifier' ); ?></p>
52
- </div>
53
- <?php
54
- }
55
- }
56
-
57
- if ( ! function_exists ( 'yith_ywzm_install_free_admin_notice' ) ) {
58
- /**
59
- * Unable to activate the free version while the premium version is active
60
- *
61
- * @author Lorenzo Giuffrida
62
- * @since 1.0.0
63
- */
64
- function yith_ywzm_install_free_admin_notice () {
65
- ?>
66
- <div class="error">
67
- <p><?php _e ( 'You can\'t activate the free version of YITH WooCommerce Zoom Magnifier while you are using the premium one.', 'yith-woocommerce-zoom-magnifier' ); ?></p>
68
- </div>
69
- <?php
70
- }
71
- }
72
-
73
- if ( ! function_exists ( 'yith_plugin_registration_hook' ) ) {
74
- require_once 'plugin-fw/yit-plugin-registration-hook.php';
75
- }
76
-
77
- register_activation_hook ( __FILE__, 'yith_plugin_registration_hook' );
78
-
79
- defined ( 'YITH_YWZM_FREE_INIT' ) || define ( 'YITH_YWZM_FREE_INIT', plugin_basename ( __FILE__ ) );
80
- defined ( 'YITH_YWZM_SLUG' ) || define ( 'YITH_YWZM_SLUG', 'yith-woocommerce-zoom-magnifier' );
81
- defined ( 'YITH_YWZM_VERSION' ) || define ( 'YITH_YWZM_VERSION', '1.3.7' );
82
- defined ( 'YITH_YWZM_FILE' ) || define ( 'YITH_YWZM_FILE', __FILE__ );
83
- defined ( 'YITH_YWZM_DIR' ) || define ( 'YITH_YWZM_DIR', plugin_dir_path ( __FILE__ ) );
84
- defined ( 'YITH_YWZM_URL' ) || define ( 'YITH_YWZM_URL', plugins_url ( '/', __FILE__ ) );
85
- defined ( 'YITH_YWZM_ASSETS_URL' ) || define ( 'YITH_YWZM_ASSETS_URL', YITH_YWZM_URL . 'assets' );
86
- defined ( 'YITH_YWZM_TEMPLATE_DIR' ) || define ( 'YITH_YWZM_TEMPLATE_DIR', YITH_YWZM_DIR . 'templates' );
87
- defined ( 'YITH_YWZM_ASSETS_IMAGES_URL' ) || define ( 'YITH_YWZM_ASSETS_IMAGES_URL', YITH_YWZM_ASSETS_URL . '/images/' );
88
- defined ( 'YITH_YWZM_LIB_DIR' ) || define ( 'YITH_YWZM_LIB_DIR', YITH_YWZM_DIR . 'lib/' );
89
-
90
- /* Plugin Framework Version Check */
91
- if ( ! function_exists ( 'yit_maybe_plugin_fw_loader' ) && file_exists ( YITH_YWZM_DIR . 'plugin-fw/init.php' ) ) {
92
- require_once ( YITH_YWZM_DIR . 'plugin-fw/init.php' );
93
- }
94
- yit_maybe_plugin_fw_loader ( YITH_YWZM_DIR );
95
-
96
- if ( ! function_exists ( 'yith_ywzm_init' ) ) {
97
- /**
98
- * Init the plugin
99
- *
100
- * @author Lorenzo Giuffrida
101
- * @since 1.0.0
102
- */
103
- function yith_ywzm_init () {
104
-
105
- /**
106
- * Load text domain and start plugin
107
- */
108
- load_plugin_textdomain ( 'yith-woocommerce-zoom-magnifier', false, dirname ( plugin_basename ( __FILE__ ) ) . '/languages/' );
109
-
110
- add_option ( 'yith_wcmg_slider_direction', apply_filters ( 'yith_wcmg_slider_direction', 'left' ) );
111
-
112
- define ( 'YITH_WCMG', true );
113
- define ( 'YITH_WCMG_URL', plugin_dir_url ( __FILE__ ) );
114
-
115
- // Load required classes and functions
116
- require_once ( 'functions.yith-wcmg.php' );
117
- require_once ( 'class.yith-wcmg-admin.php' );
118
- require_once ( 'class.yith-wcmg-frontend.php' );
119
-
120
- require_once ( YITH_YWZM_LIB_DIR . 'class.yith-woocommerce-zoom-magnifier.php' );
121
- require_once ( YITH_YWZM_LIB_DIR . 'class.yith-ywzm-plugin-fw-loader.php' );
122
- require_once ( YITH_YWZM_LIB_DIR . 'class.yith-ywzm-custom-types.php' );
123
-
124
- YITH_YWZM_Plugin_FW_Loader::get_instance ();
125
-
126
- // Let's start the game!
127
- global $yith_wcmg;
128
-
129
- $yith_wcmg = new YITH_WooCommerce_Zoom_Magnifier();
130
- }
131
- }
132
- add_action ( 'yith_ywzm_init', 'yith_ywzm_init' );
133
-
134
- if ( ! function_exists ( 'yith_ywzm_install' ) ) {
135
- /**
136
- * install the plugin
137
- *
138
- * @author Lorenzo Giuffrida
139
- * @since 1.0.0
140
- */
141
- function yith_ywzm_install () {
142
-
143
- if ( ! function_exists ( 'WC' ) ) {
144
- add_action ( 'admin_notices', 'yith_ywzm_install_woocommerce_admin_notice' );
145
- } elseif ( defined ( 'YITH_YWZM_PREMIUM' ) ) {
146
- add_action ( 'admin_notices', 'yith_ywzm_install_free_admin_notice' );
147
- deactivate_plugins ( plugin_basename ( __FILE__ ) );
148
- } else {
149
- do_action ( 'yith_ywzm_init' );
150
- }
151
-
152
- }
153
- }
154
-
155
- add_action ( 'plugins_loaded', 'yith_ywzm_install', 11 );
156
-
157
- /*add_action( 'wp_ajax_nopriv_yith_wc_zoom_magnifier_get_main_image', 'test', 10 );
158
-
159
- add_action( 'wp_ajax_yith_wc_zoom_magnifier_get_main_image', 'test', 10 );
160
-
161
- function test(){
162
-
163
- error_log( 'testing -> ' . print_r( 'test yeaaaaaaaah', true ) );
164
  }*/
1
+ <?php
2
+ /**
3
+ * Plugin Name: YITH WooCommerce Zoom Magnifier
4
+ * Plugin URI: https://yithemes.com/themes/plugins/yith-woocommerce-zoom-magnifier/
5
+ * Description: <code><strong>YITH WooCommerce Zoom Magnifier</strong></code> allows you to add a zoom effect to product images and a thumbnail slider for the product image gallery. <a href="https://yithemes.com/" target="_blank">Get more plugins for your e-commerce shop on <strong>YITH</strong></a>.
6
+ * Version: 1.3.8
7
+ * Author: YITH
8
+ * Author URI: https://yithemes.com/
9
+ * Text Domain: yith-woocommerce-zoom-magnifier
10
+ * Domain Path: /languages/
11
+ * WC requires at least: 3.3.0
12
+ * WC tested up to: 3.5.x
13
+ **/
14
+
15
+ /* Copyright 2013-2018 Your Inspiration Themes (email : plugins@yithemes.com)
16
+
17
+ This program is free software; you can redistribute it and/or modify
18
+ it under the terms of the GNU General Public License, version 2, as
19
+ published by the Free Software Foundation.
20
+
21
+ This program is distributed in the hope that it will be useful,
22
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
23
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24
+ GNU General Public License for more details.
25
+
26
+ You should have received a copy of the GNU General Public License
27
+ along with this program; if not, write to the Free Software
28
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
29
+ */
30
+
31
+ if ( ! defined ( 'ABSPATH' ) ) {
32
+ exit;
33
+ } // Exit if accessed directly
34
+
35
+ if ( ! function_exists( 'is_plugin_active' ) ) {
36
+ if ( ! function_exists( 'get_plugin_data' ) ) {
37
+ require_once(ABSPATH . 'wp-admin/includes/plugin.php');
38
+ }
39
+ }
40
+
41
+ if ( ! function_exists ( 'yith_ywzm_install_woocommerce_admin_notice' ) ) {
42
+ /**
43
+ * WooCommerce is not enabled, the plugin will not be effective
44
+ *
45
+ * @author Lorenzo Giuffrida
46
+ * @since 1.0.0
47
+ */
48
+ function yith_ywzm_install_woocommerce_admin_notice () {
49
+ ?>
50
+ <div class="error">
51
+ <p><?php _e ( 'YITH WooCommerce Zoom Magnifier is enabled but not effective. It requires WooCommerce in order to work.', 'yith-woocommerce-zoom-magnifier' ); ?></p>
52
+ </div>
53
+ <?php
54
+ }
55
+ }
56
+
57
+ if ( ! function_exists ( 'yith_ywzm_install_free_admin_notice' ) ) {
58
+ /**
59
+ * Unable to activate the free version while the premium version is active
60
+ *
61
+ * @author Lorenzo Giuffrida
62
+ * @since 1.0.0
63
+ */
64
+ function yith_ywzm_install_free_admin_notice () {
65
+ ?>
66
+ <div class="error">
67
+ <p><?php _e ( 'You can\'t activate the free version of YITH WooCommerce Zoom Magnifier while you are using the premium one.', 'yith-woocommerce-zoom-magnifier' ); ?></p>
68
+ </div>
69
+ <?php
70
+ }
71
+ }
72
+
73
+ if ( ! function_exists ( 'yith_plugin_registration_hook' ) ) {
74
+ require_once 'plugin-fw/yit-plugin-registration-hook.php';
75
+ }
76
+
77
+ register_activation_hook ( __FILE__, 'yith_plugin_registration_hook' );
78
+
79
+ defined ( 'YITH_YWZM_FREE_INIT' ) || define ( 'YITH_YWZM_FREE_INIT', plugin_basename ( __FILE__ ) );
80
+ defined ( 'YITH_YWZM_SLUG' ) || define ( 'YITH_YWZM_SLUG', 'yith-woocommerce-zoom-magnifier' );
81
+ defined ( 'YITH_YWZM_VERSION' ) || define ( 'YITH_YWZM_VERSION', '1.3.8' );
82
+ defined ( 'YITH_YWZM_FILE' ) || define ( 'YITH_YWZM_FILE', __FILE__ );
83
+ defined ( 'YITH_YWZM_DIR' ) || define ( 'YITH_YWZM_DIR', plugin_dir_path ( __FILE__ ) );
84
+ defined ( 'YITH_YWZM_URL' ) || define ( 'YITH_YWZM_URL', plugins_url ( '/', __FILE__ ) );
85
+ defined ( 'YITH_YWZM_ASSETS_URL' ) || define ( 'YITH_YWZM_ASSETS_URL', YITH_YWZM_URL . 'assets' );
86
+ defined ( 'YITH_YWZM_TEMPLATE_DIR' ) || define ( 'YITH_YWZM_TEMPLATE_DIR', YITH_YWZM_DIR . 'templates' );
87
+ defined ( 'YITH_YWZM_ASSETS_IMAGES_URL' ) || define ( 'YITH_YWZM_ASSETS_IMAGES_URL', YITH_YWZM_ASSETS_URL . '/images/' );
88
+ defined ( 'YITH_YWZM_LIB_DIR' ) || define ( 'YITH_YWZM_LIB_DIR', YITH_YWZM_DIR . 'lib/' );
89
+
90
+ /* Plugin Framework Version Check */
91
+ if ( ! function_exists ( 'yit_maybe_plugin_fw_loader' ) && file_exists ( YITH_YWZM_DIR . 'plugin-fw/init.php' ) ) {
92
+ require_once ( YITH_YWZM_DIR . 'plugin-fw/init.php' );
93
+ }
94
+ yit_maybe_plugin_fw_loader ( YITH_YWZM_DIR );
95
+
96
+ if ( ! function_exists ( 'yith_ywzm_init' ) ) {
97
+ /**
98
+ * Init the plugin
99
+ *
100
+ * @author Lorenzo Giuffrida
101
+ * @since 1.0.0
102
+ */
103
+ function yith_ywzm_init () {
104
+
105
+ /**
106
+ * Load text domain and start plugin
107
+ */
108
+ load_plugin_textdomain ( 'yith-woocommerce-zoom-magnifier', false, dirname ( plugin_basename ( __FILE__ ) ) . '/languages/' );
109
+
110
+ add_option ( 'yith_wcmg_slider_direction', apply_filters ( 'yith_wcmg_slider_direction', 'left' ) );
111
+
112
+ define ( 'YITH_WCMG', true );
113
+ define ( 'YITH_WCMG_URL', plugin_dir_url ( __FILE__ ) );
114
+
115
+ // Load required classes and functions
116
+ require_once ( 'functions.yith-wcmg.php' );
117
+ require_once ( 'class.yith-wcmg-admin.php' );
118
+ require_once ( 'class.yith-wcmg-frontend.php' );
119
+
120
+ require_once ( YITH_YWZM_LIB_DIR . 'class.yith-woocommerce-zoom-magnifier.php' );
121
+ require_once ( YITH_YWZM_LIB_DIR . 'class.yith-ywzm-plugin-fw-loader.php' );
122
+ require_once ( YITH_YWZM_LIB_DIR . 'class.yith-ywzm-custom-types.php' );
123
+
124
+ YITH_YWZM_Plugin_FW_Loader::get_instance ();
125
+
126
+ // Let's start the game!
127
+ global $yith_wcmg;
128
+
129
+ $yith_wcmg = new YITH_WooCommerce_Zoom_Magnifier();
130
+ }
131
+ }
132
+ add_action ( 'yith_ywzm_init', 'yith_ywzm_init' );
133
+
134
+ if ( ! function_exists ( 'yith_ywzm_install' ) ) {
135
+ /**
136
+ * install the plugin
137
+ *
138
+ * @author Lorenzo Giuffrida
139
+ * @since 1.0.0
140
+ */
141
+ function yith_ywzm_install () {
142
+
143
+ if ( ! function_exists ( 'WC' ) ) {
144
+ add_action ( 'admin_notices', 'yith_ywzm_install_woocommerce_admin_notice' );
145
+ } elseif ( defined ( 'YITH_YWZM_PREMIUM' ) ) {
146
+ add_action ( 'admin_notices', 'yith_ywzm_install_free_admin_notice' );
147
+ deactivate_plugins ( plugin_basename ( __FILE__ ) );
148
+ } else {
149
+ do_action ( 'yith_ywzm_init' );
150
+ }
151
+
152
+ }
153
+ }
154
+
155
+ add_action ( 'plugins_loaded', 'yith_ywzm_install', 11 );
156
+
157
+ /*add_action( 'wp_ajax_nopriv_yith_wc_zoom_magnifier_get_main_image', 'test', 10 );
158
+
159
+ add_action( 'wp_ajax_yith_wc_zoom_magnifier_get_main_image', 'test', 10 );
160
+
161
+ function test(){
162
+
163
+ error_log( 'testing -> ' . print_r( 'test yeaaaaaaaah', true ) );
164
  }*/
languages/yith-woocommerce-zoom-magnifier-es_ES.po CHANGED
@@ -1,489 +1,489 @@
1
- msgid ""
2
- msgstr ""
3
- "Project-Id-Version: YITH WooCommerce Order Tracking\n"
4
- "POT-Creation-Date: 2016-06-13 16:57+0200\n"
5
- "PO-Revision-Date: 2016-06-13 16:57+0200\n"
6
- "Last-Translator: \n"
7
- "Language-Team: Your Inspiration Themes <plugins@yithemes.com>\n"
8
- "Language: es_ES\n"
9
- "MIME-Version: 1.0\n"
10
- "Content-Type: text/plain; charset=UTF-8\n"
11
- "Content-Transfer-Encoding: 8bit\n"
12
- "X-Generator: Poedit 1.8.4\n"
13
- "X-Poedit-Basepath: ..\n"
14
- "Plural-Forms: nplurals=2; plural=n!=1;\n"
15
- "X-Poedit-KeywordsList: __ ;_e;_n:1,2;__ngettext:1,2;__ngettext_noop:1,2;"
16
- "_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2\n"
17
- "X-Poedit-SourceCharset: UTF-8\n"
18
- "X-Poedit-SearchPath-0: .\n"
19
- "X-Poedit-SearchPathExcluded-0: plugin-fw\n"
20
-
21
- #: class.yith-wcmg-admin.php:81
22
- msgid "Image Size"
23
- msgstr "Tamaño de la imagen"
24
-
25
- #: class.yith-wcmg-admin.php:82 plugin-options/general-options.php:17
26
- msgid "The size of the images used within the magnifier box"
27
- msgstr "El tamaño de las imágenes usadas dentro de la caja de zoom"
28
-
29
- #: init.php:50
30
- msgid ""
31
- "YITH WooCommerce Zoom Magnifier is enabled but not effective. It requires "
32
- "WooCommerce in order to work."
33
- msgstr ""
34
- "YITH WooCommerce Zoom Magnifier está habilitado pero no es efectivo. "
35
- "Requiere WooCommerce para funcionar."
36
-
37
- #: init.php:66
38
- msgid ""
39
- "You can't activate the free version of YITH WooCommerce Zoom Magnifier while "
40
- "you are using the premium one."
41
- msgstr ""
42
-
43
- #: lib/class.yith-ywzm-custom-types.php:159
44
- msgid "Do you want to hard crop the image?"
45
- msgstr "¿Quieres recortar la imagen?"
46
-
47
- #: lib/class.yith-ywzm-plugin-fw-loader.php:124
48
- msgid "General"
49
- msgstr "General"
50
-
51
- #: lib/class.yith-ywzm-plugin-fw-loader.php:127
52
- #: lib/class.yith-ywzm-plugin-fw-loader.php:191
53
- msgid "Premium Version"
54
- msgstr "Versión Premium"
55
-
56
- #: lib/class.yith-ywzm-plugin-fw-loader.php:129
57
- msgid "Product exclusion list"
58
- msgstr ""
59
-
60
- #: lib/class.yith-ywzm-plugin-fw-loader.php:188
61
- msgid "Settings"
62
- msgstr "Ajustes"
63
-
64
- #: lib/class.yith-ywzm-plugin-fw-loader.php:216
65
- msgid "Plugin Documentation"
66
- msgstr "Documentación del Plugin"
67
-
68
- #: lib/class.yith-ywzm-plugin-fw-loader.php:229
69
- msgid ""
70
- "YITH WooCommerce Zoom Magnifier is available in an outstanding PREMIUM "
71
- "version with many new options, discover it now."
72
- msgstr ""
73
- "YITH WooCommerce Zoom Magnifier está disponible en una espectacular versión "
74
- "PREMIUM con muchas nuevas opciones, descúbrela ahora."
75
-
76
- #: lib/class.yith-ywzm-plugin-fw-loader.php:230
77
- msgid "Premium version"
78
- msgstr "Versión Pemium"
79
-
80
- #: lib/class.yith-ywzm-plugin-fw-loader.php:237
81
- #: plugin-options/general-options.php:217
82
- msgid "YITH WooCommerce Zoom Magnifier"
83
- msgstr "YITH WooCommerce Zoom Magnifier"
84
-
85
- #: lib/class.yith-ywzm-plugin-fw-loader.php:238
86
- msgid ""
87
- "In YIT Plugins tab you can find YITH WooCommerce Zoom Magnifier options."
88
- "<br> From this menu you can access all settings of the YITH plugins "
89
- "activated."
90
- msgstr ""
91
- "En la pestaña YITH Plugins puedes encontrar opciones de YITH WooCommerce "
92
- "Zoom Magnifier. <br> Desde este menú puedes acceder a todos los ajustes de "
93
- "los plugin YITH activados."
94
-
95
- #: plugin-options/general-options.php:16
96
- msgid "Image size"
97
- msgstr "Tamaño de imagen"
98
-
99
- #: plugin-options/general-options.php:36
100
- msgid "General Settings"
101
- msgstr "Ajustes Generales"
102
-
103
- #: plugin-options/general-options.php:42
104
- msgid "Activate YITH WooCommerce Zoom Magnifier"
105
- msgstr "Activar YITH WooCommerce Zoom Magnifier"
106
-
107
- #: plugin-options/general-options.php:43
108
- msgid "Activate the plugin or use the WooCommerce default product image."
109
- msgstr ""
110
- "Activar el plugin o usar la imagen de producto por defecto de WooComerce."
111
-
112
- #: plugin-options/general-options.php:50
113
- msgid "Activate on mobile device"
114
- msgstr "Activar en dispositivos móviles"
115
-
116
- #: plugin-options/general-options.php:51
117
- msgid ""
118
- "Set if zoom and slider functionalities should be shown also on mobile "
119
- "devices."
120
- msgstr ""
121
- "Establecer si las funcionalidades del zoom y el deslizador deberían "
122
- "mostrarse también en dispositivos móviles."
123
-
124
- #: plugin-options/general-options.php:59
125
- msgid "Forced Image Size"
126
- msgstr "Tamaño de imagen obligatiorio"
127
-
128
- #: plugin-options/general-options.php:60
129
- msgid ""
130
- "If disabled, you will able to customize the sizes of the zoomed images. "
131
- "Disable it at your own risk; the magnifier could not properly work with "
132
- "images out of proportion."
133
- msgstr ""
134
- "Si está deshabilitado, podrás personalizar los tamaños de las imágenes "
135
- "aumentadas. Desactívalo bajo tu propio riesgo, la lupa no funciona "
136
- "correctamente con imágenes desproporcionadas."
137
-
138
- #: plugin-options/general-options.php:74
139
- msgid "Magnifier Settings"
140
- msgstr "Ajustes del xoom"
141
-
142
- #: plugin-options/general-options.php:80
143
- msgid "Zoom Box Width"
144
- msgstr "Ancho del cuadro de zoom"
145
-
146
- #: plugin-options/general-options.php:81
147
- msgid "The width of the magnifier box (default: auto)"
148
- msgstr "El ancho del cuadro de zoom (por defecto: auto)"
149
-
150
- #: plugin-options/general-options.php:88
151
- msgid "Zoom Box Height"
152
- msgstr "Altura del cuadro de zoom"
153
-
154
- #: plugin-options/general-options.php:89
155
- msgid "The height of the magnifier box (default: auto)"
156
- msgstr "La altura del cuadro de zoom (por defecto: auto)"
157
-
158
- #: plugin-options/general-options.php:97
159
- msgid "Zoom Box Position"
160
- msgstr "Posición del cuadro de zoom"
161
-
162
- #: plugin-options/general-options.php:98
163
- msgid "The magnifier position"
164
- msgstr "La posición del cuadro de zoom"
165
-
166
- #: plugin-options/general-options.php:104
167
- msgid "Right"
168
- msgstr "Derecha"
169
-
170
- #: plugin-options/general-options.php:105
171
- #: plugin-options/general-options.php:117
172
- msgid "Inside"
173
- msgstr "Dentro"
174
-
175
- #: plugin-options/general-options.php:109
176
- msgid "Zoom Box Position for mobile devices"
177
- msgstr "Posición del cuadro de zoom en dispositivos móviles"
178
-
179
- #: plugin-options/general-options.php:110
180
- msgid "The magnifier position for the mobile devices (iPhone, Android, etc.)"
181
- msgstr "La posición del zoom en dispositivos móviles (iPhone, Android, etc.)"
182
-
183
- #: plugin-options/general-options.php:116
184
- msgid "Default"
185
- msgstr "Por defecto"
186
-
187
- #: plugin-options/general-options.php:118
188
- msgid "Disable"
189
- msgstr "Deshabilitar"
190
-
191
- #: plugin-options/general-options.php:122
192
- msgid "Loading label"
193
- msgstr "Etiqueta de cargando"
194
-
195
- #: plugin-options/general-options.php:125
196
- #: plugin-options/general-options.php:126
197
- msgid "Loading..."
198
- msgstr "Cargando..."
199
-
200
- #: plugin-options/general-options.php:131
201
- msgid "Lens Opacity"
202
- msgstr "Opacidad de la lente"
203
-
204
- #: plugin-options/general-options.php:142
205
- msgid "Blur"
206
- msgstr "Difuminar"
207
-
208
- #: plugin-options/general-options.php:143
209
- msgid "Add a blur effect to the small image on mouse hover."
210
- msgstr ""
211
- "Añadir un efecto de disolverse a la imagen pequeña con el evento hover del "
212
- "ratón."
213
-
214
- #: plugin-options/general-options.php:154
215
- msgid "Slider Settings"
216
- msgstr "Ajustes de Deslizador"
217
-
218
- #: plugin-options/general-options.php:160
219
- msgid "Activate Slider"
220
- msgstr "Activar Deslizador"
221
-
222
- #: plugin-options/general-options.php:161
223
- msgid "Activate Thumbnail Slider."
224
- msgstr "Activar miniatura de Deslizador."
225
-
226
- #: plugin-options/general-options.php:168
227
- msgid "Activate Responsive Slider"
228
- msgstr "Activar Deslizador Responsive"
229
-
230
- #: plugin-options/general-options.php:169
231
- msgid ""
232
- "This option fits the thumbnails within the available space. Disable it if "
233
- "you want to manage freely the thumbnails (eg. add margins, paddings, etc.)"
234
- msgstr ""
235
- "Esta opción ajusta las miniaturas dentro del espacio disponible. "
236
- "Deshabilítala si quieres administrar libremente las miniaturas (p.ej.: "
237
- "añadir márgenes, rellenos, etc.)"
238
-
239
- #: plugin-options/general-options.php:176
240
- msgid "Items"
241
- msgstr "Elementos"
242
-
243
- #: plugin-options/general-options.php:177
244
- msgid "Number of items to show"
245
- msgstr "Número de elementos que se muestran"
246
-
247
- #: plugin-options/general-options.php:187
248
- msgid "Circular carousel"
249
- msgstr "Carrusel circular"
250
-
251
- #: plugin-options/general-options.php:188
252
- msgid "It defines whether the carousel should be circular."
253
- msgstr "Define si el carrusel debe ser circular"
254
-
255
- #: plugin-options/general-options.php:195
256
- msgid "Infinite carousel"
257
- msgstr "Carrusel infinito"
258
-
259
- #: plugin-options/general-options.php:196
260
- msgid ""
261
- "It defines whether the carousel should be infinite. Note: It is possible to "
262
- "create a non-circular, infinite carousel, but it is not possible to create a "
263
- "circular, non-infinite carousel."
264
- msgstr ""
265
- "Define si el carrusel debe ser infinito. Nota: es posible crear un carrusel "
266
- "infinito no circular, pero no es posible crear un carrusel circular no "
267
- "infinito."
268
-
269
- #: plugin-options/general-options.php:214
270
- msgid "Upgrade to the PREMIUM VERSION"
271
- msgstr "Actualiza a la VERSIÓN PREMIUM"
272
-
273
- #: plugin-options/general-options.php:218
274
- msgid "Discover The Advanced Features"
275
- msgstr "Descubre las características avanzadas"
276
-
277
- #: plugin-options/general-options.php:219
278
- msgid ""
279
- "Upgrade to the PREMIUM VERSION of YITH WOOCOMMERCE ZOOM MAGNIFIER to benefit "
280
- "from all features!"
281
- msgstr ""
282
- "¡Actualiza a la VERSIÓN PREMIUM de YITH WOOCOMMERCE ZOOM MAGNIFIER para "
283
- "beneficiarte de todas las características!"
284
-
285
- #: plugin-options/general-options.php:223
286
- msgid ""
287
- "See YITH WooCommerce Zoom Magnifier plugin with full premium features in "
288
- "action"
289
- msgstr ""
290
- "Ver cómo es el plugin YITH WooCommerce Zoom Magnifier con todas sus "
291
- "características premium en acción"
292
-
293
- #: plugin-options/general-options.php:225
294
- msgid "Get Support and Pro Features"
295
- msgstr "Hazte con Características Pro y Soporte"
296
-
297
- #: plugin-options/general-options.php:226
298
- msgid ""
299
- "Purchasing the premium version of the plugin, you will take advantage of the "
300
- "advanced features of the product, and you will get one year of free updates "
301
- "and support through our platform available 24h/24."
302
- msgstr ""
303
- "Comprando la versión premium del plugin, obtendrás las ventajas de las "
304
- "características avanzadas del producto, y tendrás un año de actualizaciones "
305
- "gratuitas y de soporte a través de nuestra plataforma disponible 24h/24."
306
-
307
- #: templates/admin/premium.php:193
308
- #, php-format
309
- msgid ""
310
- "Upgrade to the %1$s premium version %2$s of %1$s YITH WooCommerce Zoom "
311
- "Magnifier %2$s to benefit from all features!"
312
- msgstr ""
313
-
314
- #: templates/admin/premium.php:196
315
- #, php-format
316
- msgid "%1$sUPGRADE%2$s%3$sto the premium version%2$s"
317
- msgstr ""
318
-
319
- #: templates/admin/premium.php:202
320
- #, php-format
321
- msgid "%1$sPremium Features%2$s"
322
- msgstr ""
323
-
324
- #: templates/admin/premium.php:210
325
- msgid "ZOOM BOX POSITION"
326
- msgstr ""
327
-
328
- #: templates/admin/premium.php:213
329
- #, php-format
330
- msgid ""
331
- "Choose where you want to show the %1$szoomed version%2$s of the image of "
332
- "your products. Place it above or below the original image, on its left or "
333
- "its right, or you can even place it over it.$2$s"
334
- msgstr ""
335
-
336
- #: templates/admin/premium.php:223
337
- msgid "ENLARGE THE IMAGES"
338
- msgstr ""
339
-
340
- #: templates/admin/premium.php:225
341
- msgid ""
342
- "Just one click and the product image will appear in a bigger size in a modal "
343
- "window. A further chance to let users analyze in a better way what you sell."
344
- msgstr ""
345
-
346
- #: templates/admin/premium.php:240
347
- msgid "EXCLUDE PRODUCTS"
348
- msgstr ""
349
-
350
- #: templates/admin/premium.php:242
351
- msgid ""
352
- "Tailored options to limit the plugin features only to certain products. Some "
353
- "of these could have too small images to be zoomed, or maybe being part of "
354
- "categories that do not imply zoomed images. Select the products and the "
355
- "categories to exclude and delete all your problems"
356
- msgstr ""
357
-
358
- #: templates/admin/premium.php:251
359
- #, php-format
360
- msgid ""
361
- "Upgrade to the %1$spremium version%2$s of %1$sYITH WooCommerce Zoom Magnifier"
362
- "%2$s to benefit from all features!"
363
- msgstr ""
364
-
365
- #: templates/admin/premium.php:254
366
- #, php-format
367
- msgid "%1$sUPGRADE%2$s %3$sto the premium version%2$s"
368
- msgstr ""
369
-
370
- #: yit-common/yith-panel.php:429
371
- msgid "Select a date"
372
- msgstr "Selecciona una fecha"
373
-
374
- #: yit-common/yith-panel.php:430
375
- msgid "Hours"
376
- msgstr "Horas"
377
-
378
- #: yit-common/yith-panel.php:431 yit-common/yith-panel.php:432
379
- msgid "Minutes"
380
- msgstr "Minutos"
381
-
382
- #: yit-common/yith-panel.php:440
383
- msgid "Upload"
384
- msgstr "Actualizar"
385
-
386
- #: yit-common/yith-panel.php:477
387
- msgid "px"
388
- msgstr "px"
389
-
390
- #: yit-common/yith-panel.php:479
391
- msgid "em"
392
- msgstr "em"
393
-
394
- #: yit-common/yith-panel.php:481
395
- msgid "pt"
396
- msgstr "pt"
397
-
398
- #: yit-common/yith-panel.php:483
399
- msgid "rem"
400
- msgstr "rem"
401
-
402
- #: yit-common/yith-panel.php:495
403
- msgid "Select a font family"
404
- msgstr "Selecciona un tipo de fuente"
405
-
406
- #: yit-common/yith-panel.php:505
407
- msgid "Regular"
408
- msgstr "Normal"
409
-
410
- #: yit-common/yith-panel.php:507
411
- msgid "Bold"
412
- msgstr "Negrita"
413
-
414
- #: yit-common/yith-panel.php:509
415
- msgid "Extra bold"
416
- msgstr "Extra negrita"
417
-
418
- #: yit-common/yith-panel.php:511
419
- msgid "Italic"
420
- msgstr "Cursiva"
421
-
422
- #: yit-common/yith-panel.php:513
423
- msgid "Italic bold"
424
- msgstr "Negrita cursiva"
425
-
426
- #: yit-common/yith-panel.php:529
427
- msgid "Click to preview"
428
- msgstr "Haz click para previsualizar"
429
-
430
- #~ msgid "product"
431
- #~ msgstr "praducto"
432
-
433
- #~ msgid "products"
434
- #~ msgstr "productos"
435
-
436
- #~ msgid "Remove from exclusions"
437
- #~ msgstr "Quitar de las exclusiones"
438
-
439
- #~ msgid "Edit product"
440
- #~ msgstr "Editar producto"
441
-
442
- #~ msgid "Remove from list"
443
- #~ msgstr "Eliminar de la lista"
444
-
445
- #~ msgid "%s product removed successfully"
446
- #~ msgid_plural "%s products removed successfully"
447
- #~ msgstr[0] "El producto %s ha sido eliminado con éxito"
448
- #~ msgstr[1] "Los productos %s han sido eliminados con éxito"
449
-
450
- #~ msgid "%s product added successfully"
451
- #~ msgid_plural "%s products added successfully"
452
- #~ msgstr[0] "El producto %s ha sido añadido con éxito"
453
- #~ msgstr[1] "Los productos %s han sido añadidos con éxito"
454
-
455
- #~ msgid "Product updated successfully"
456
- #~ msgstr "Producto actualizado con éxito"
457
-
458
- #~ msgid "Single Product Exclusion List"
459
- #~ msgstr "Lista de Exclusión de Productos"
460
-
461
- #~ msgid "Add Products"
462
- #~ msgstr "Añadir productos"
463
-
464
- #~ msgid "Products to exclude"
465
- #~ msgstr "Productos para excluir"
466
-
467
- #~ msgid "Add product exclusion"
468
- #~ msgstr "Añadir exclusión de producto"
469
-
470
- #~ msgid "Return to exclusion list"
471
- #~ msgstr "Devolver a la lista de exclusión"
472
-
473
- #~ msgid "Select at least one product"
474
- #~ msgstr "Selecciona al menos un producto"
475
-
476
- #~ msgid "Exclude product categories"
477
- #~ msgstr "Excluir categorías de productos"
478
-
479
- #~ msgid "Top"
480
- #~ msgstr "Arriba"
481
-
482
- #~ msgid "Bottom"
483
- #~ msgstr "Abajo"
484
-
485
- #~ msgid "Left"
486
- #~ msgstr "Izquierda"
487
-
488
- #~ msgid "Product"
489
- #~ msgstr "Producto"
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: YITH WooCommerce Order Tracking\n"
4
+ "POT-Creation-Date: 2016-06-13 16:57+0200\n"
5
+ "PO-Revision-Date: 2016-06-13 16:57+0200\n"
6
+ "Last-Translator: \n"
7
+ "Language-Team: Your Inspiration Themes <plugins@yithemes.com>\n"
8
+ "Language: es_ES\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 1.8.4\n"
13
+ "X-Poedit-Basepath: ..\n"
14
+ "Plural-Forms: nplurals=2; plural=n!=1;\n"
15
+ "X-Poedit-KeywordsList: __ ;_e;_n:1,2;__ngettext:1,2;__ngettext_noop:1,2;"
16
+ "_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2\n"
17
+ "X-Poedit-SourceCharset: UTF-8\n"
18
+ "X-Poedit-SearchPath-0: .\n"
19
+ "X-Poedit-SearchPathExcluded-0: plugin-fw\n"
20
+
21
+ #: class.yith-wcmg-admin.php:81
22
+ msgid "Image Size"
23
+ msgstr "Tamaño de la imagen"
24
+
25
+ #: class.yith-wcmg-admin.php:82 plugin-options/general-options.php:17
26
+ msgid "The size of the images used within the magnifier box"
27
+ msgstr "El tamaño de las imágenes usadas dentro de la caja de zoom"
28
+
29
+ #: init.php:50
30
+ msgid ""
31
+ "YITH WooCommerce Zoom Magnifier is enabled but not effective. It requires "
32
+ "WooCommerce in order to work."
33
+ msgstr ""
34
+ "YITH WooCommerce Zoom Magnifier está habilitado pero no es efectivo. "
35
+ "Requiere WooCommerce para funcionar."
36
+
37
+ #: init.php:66
38
+ msgid ""
39
+ "You can't activate the free version of YITH WooCommerce Zoom Magnifier while "
40
+ "you are using the premium one."
41
+ msgstr ""
42
+
43
+ #: lib/class.yith-ywzm-custom-types.php:159
44
+ msgid "Do you want to hard crop the image?"
45
+ msgstr "¿Quieres recortar la imagen?"
46
+
47
+ #: lib/class.yith-ywzm-plugin-fw-loader.php:124
48
+ msgid "General"
49
+ msgstr "General"
50
+
51
+ #: lib/class.yith-ywzm-plugin-fw-loader.php:127
52
+ #: lib/class.yith-ywzm-plugin-fw-loader.php:191
53
+ msgid "Premium Version"
54
+ msgstr "Versión Premium"
55
+
56
+ #: lib/class.yith-ywzm-plugin-fw-loader.php:129
57
+ msgid "Product exclusion list"
58
+ msgstr ""
59
+
60
+ #: lib/class.yith-ywzm-plugin-fw-loader.php:188
61
+ msgid "Settings"
62
+ msgstr "Ajustes"
63
+
64
+ #: lib/class.yith-ywzm-plugin-fw-loader.php:216
65
+ msgid "Plugin Documentation"
66
+ msgstr "Documentación del Plugin"
67
+
68
+ #: lib/class.yith-ywzm-plugin-fw-loader.php:229
69
+ msgid ""
70
+ "YITH WooCommerce Zoom Magnifier is available in an outstanding PREMIUM "
71
+ "version with many new options, discover it now."
72
+ msgstr ""
73
+ "YITH WooCommerce Zoom Magnifier está disponible en una espectacular versión "
74
+ "PREMIUM con muchas nuevas opciones, descúbrela ahora."
75
+
76
+ #: lib/class.yith-ywzm-plugin-fw-loader.php:230
77
+ msgid "Premium version"
78
+ msgstr "Versión Pemium"
79
+
80
+ #: lib/class.yith-ywzm-plugin-fw-loader.php:237
81
+ #: plugin-options/general-options.php:217
82
+ msgid "YITH WooCommerce Zoom Magnifier"
83
+ msgstr "YITH WooCommerce Zoom Magnifier"
84
+
85
+ #: lib/class.yith-ywzm-plugin-fw-loader.php:238
86
+ msgid ""
87
+ "In YIT Plugins tab you can find YITH WooCommerce Zoom Magnifier options."
88
+ "<br> From this menu you can access all settings of the YITH plugins "
89
+ "activated."
90
+ msgstr ""
91
+ "En la pestaña YITH Plugins puedes encontrar opciones de YITH WooCommerce "
92
+ "Zoom Magnifier. <br> Desde este menú puedes acceder a todos los ajustes de "
93
+ "los plugin YITH activados."
94
+
95
+ #: plugin-options/general-options.php:16
96
+ msgid "Image size"
97
+ msgstr "Tamaño de imagen"
98
+
99
+ #: plugin-options/general-options.php:36
100
+ msgid "General Settings"
101
+ msgstr "Ajustes Generales"
102
+
103
+ #: plugin-options/general-options.php:42
104
+ msgid "Activate YITH WooCommerce Zoom Magnifier"
105
+ msgstr "Activar YITH WooCommerce Zoom Magnifier"
106
+
107
+ #: plugin-options/general-options.php:43
108
+ msgid "Activate the plugin or use the WooCommerce default product image."
109
+ msgstr ""
110
+ "Activar el plugin o usar la imagen de producto por defecto de WooComerce."
111
+
112
+ #: plugin-options/general-options.php:50
113
+ msgid "Activate on mobile device"
114
+ msgstr "Activar en dispositivos móviles"
115
+
116
+ #: plugin-options/general-options.php:51
117
+ msgid ""
118
+ "Set if zoom and slider functionalities should be shown also on mobile "
119
+ "devices."
120
+ msgstr ""
121
+ "Establecer si las funcionalidades del zoom y el deslizador deberían "
122
+ "mostrarse también en dispositivos móviles."
123
+
124
+ #: plugin-options/general-options.php:59
125
+ msgid "Forced Image Size"
126
+ msgstr "Tamaño de imagen obligatiorio"
127
+
128
+ #: plugin-options/general-options.php:60
129
+ msgid ""
130
+ "If disabled, you will able to customize the sizes of the zoomed images. "
131
+ "Disable it at your own risk; the magnifier could not properly work with "
132
+ "images out of proportion."
133
+ msgstr ""
134
+ "Si está deshabilitado, podrás personalizar los tamaños de las imágenes "
135
+ "aumentadas. Desactívalo bajo tu propio riesgo, la lupa no funciona "
136
+ "correctamente con imágenes desproporcionadas."
137
+
138
+ #: plugin-options/general-options.php:74
139
+ msgid "Magnifier Settings"
140
+ msgstr "Ajustes del xoom"
141
+
142
+ #: plugin-options/general-options.php:80
143
+ msgid "Zoom Box Width"
144
+ msgstr "Ancho del cuadro de zoom"
145
+
146
+ #: plugin-options/general-options.php:81
147
+ msgid "The width of the magnifier box (default: auto)"
148
+ msgstr "El ancho del cuadro de zoom (por defecto: auto)"
149
+
150
+ #: plugin-options/general-options.php:88
151
+ msgid "Zoom Box Height"
152
+ msgstr "Altura del cuadro de zoom"
153
+
154
+ #: plugin-options/general-options.php:89
155
+ msgid "The height of the magnifier box (default: auto)"
156
+ msgstr "La altura del cuadro de zoom (por defecto: auto)"
157
+
158
+ #: plugin-options/general-options.php:97
159
+ msgid "Zoom Box Position"
160
+ msgstr "Posición del cuadro de zoom"
161
+
162
+ #: plugin-options/general-options.php:98
163
+ msgid "The magnifier position"
164
+ msgstr "La posición del cuadro de zoom"
165
+
166
+ #: plugin-options/general-options.php:104
167
+ msgid "Right"
168
+ msgstr "Derecha"
169
+
170
+ #: plugin-options/general-options.php:105
171
+ #: plugin-options/general-options.php:117
172
+ msgid "Inside"
173
+ msgstr "Dentro"
174
+
175
+ #: plugin-options/general-options.php:109
176
+ msgid "Zoom Box Position for mobile devices"
177
+ msgstr "Posición del cuadro de zoom en dispositivos móviles"
178
+
179
+ #: plugin-options/general-options.php:110
180
+ msgid "The magnifier position for the mobile devices (iPhone, Android, etc.)"
181
+ msgstr "La posición del zoom en dispositivos móviles (iPhone, Android, etc.)"
182
+
183
+ #: plugin-options/general-options.php:116
184
+ msgid "Default"
185
+ msgstr "Por defecto"
186
+
187
+ #: plugin-options/general-options.php:118
188
+ msgid "Disable"
189
+ msgstr "Deshabilitar"
190
+
191
+ #: plugin-options/general-options.php:122
192
+ msgid "Loading label"
193
+ msgstr "Etiqueta de cargando"
194
+
195
+ #: plugin-options/general-options.php:125
196
+ #: plugin-options/general-options.php:126
197
+ msgid "Loading..."
198
+ msgstr "Cargando..."
199
+
200
+ #: plugin-options/general-options.php:131
201
+ msgid "Lens Opacity"
202
+ msgstr "Opacidad de la lente"
203
+
204
+ #: plugin-options/general-options.php:142
205
+ msgid "Blur"
206
+ msgstr "Difuminar"
207
+
208
+ #: plugin-options/general-options.php:143
209
+ msgid "Add a blur effect to the small image on mouse hover."
210
+ msgstr ""
211
+ "Añadir un efecto de disolverse a la imagen pequeña con el evento hover del "
212
+ "ratón."
213
+
214
+ #: plugin-options/general-options.php:154
215
+ msgid "Slider Settings"
216
+ msgstr "Ajustes de Deslizador"
217
+
218
+ #: plugin-options/general-options.php:160
219
+ msgid "Activate Slider"
220
+ msgstr "Activar Deslizador"
221
+
222
+ #: plugin-options/general-options.php:161
223
+ msgid "Activate Thumbnail Slider."
224
+ msgstr "Activar miniatura de Deslizador."
225
+
226
+ #: plugin-options/general-options.php:168
227
+ msgid "Activate Responsive Slider"
228
+ msgstr "Activar Deslizador Responsive"
229
+
230
+ #: plugin-options/general-options.php:169
231
+ msgid ""
232
+ "This option fits the thumbnails within the available space. Disable it if "
233
+ "you want to manage freely the thumbnails (eg. add margins, paddings, etc.)"
234
+ msgstr ""
235
+ "Esta opción ajusta las miniaturas dentro del espacio disponible. "
236
+ "Deshabilítala si quieres administrar libremente las miniaturas (p.ej.: "
237
+ "añadir márgenes, rellenos, etc.)"
238
+
239
+ #: plugin-options/general-options.php:176
240
+ msgid "Items"
241
+ msgstr "Elementos"
242
+
243
+ #: plugin-options/general-options.php:177
244
+ msgid "Number of items to show"
245
+ msgstr "Número de elementos que se muestran"
246
+
247
+ #: plugin-options/general-options.php:187
248
+ msgid "Circular carousel"
249
+ msgstr "Carrusel circular"
250
+
251
+ #: plugin-options/general-options.php:188
252
+ msgid "It defines whether the carousel should be circular."
253
+ msgstr "Define si el carrusel debe ser circular"
254
+
255
+ #: plugin-options/general-options.php:195
256
+ msgid "Infinite carousel"
257
+ msgstr "Carrusel infinito"
258
+
259
+ #: plugin-options/general-options.php:196
260
+ msgid ""
261
+ "It defines whether the carousel should be infinite. Note: It is possible to "
262
+ "create a non-circular, infinite carousel, but it is not possible to create a "
263
+ "circular, non-infinite carousel."
264
+ msgstr ""
265
+ "Define si el carrusel debe ser infinito. Nota: es posible crear un carrusel "
266
+ "infinito no circular, pero no es posible crear un carrusel circular no "
267
+ "infinito."
268
+
269
+ #: plugin-options/general-options.php:214
270
+ msgid "Upgrade to the PREMIUM VERSION"
271
+ msgstr "Actualiza a la VERSIÓN PREMIUM"
272
+
273
+ #: plugin-options/general-options.php:218
274
+ msgid "Discover The Advanced Features"
275
+ msgstr "Descubre las características avanzadas"
276
+
277
+ #: plugin-options/general-options.php:219
278
+ msgid ""
279
+ "Upgrade to the PREMIUM VERSION of YITH WOOCOMMERCE ZOOM MAGNIFIER to benefit "
280
+ "from all features!"
281
+ msgstr ""
282
+ "¡Actualiza a la VERSIÓN PREMIUM de YITH WOOCOMMERCE ZOOM MAGNIFIER para "
283
+ "beneficiarte de todas las características!"
284
+
285
+ #: plugin-options/general-options.php:223
286
+ msgid ""
287
+ "See YITH WooCommerce Zoom Magnifier plugin with full premium features in "
288
+ "action"
289
+ msgstr ""
290
+ "Ver cómo es el plugin YITH WooCommerce Zoom Magnifier con todas sus "
291
+ "características premium en acción"
292
+
293
+ #: plugin-options/general-options.php:225
294
+ msgid "Get Support and Pro Features"
295
+ msgstr "Hazte con Características Pro y Soporte"
296
+
297
+ #: plugin-options/general-options.php:226
298
+ msgid ""
299
+ "Purchasing the premium version of the plugin, you will take advantage of the "
300
+ "advanced features of the product, and you will get one year of free updates "
301
+ "and support through our platform available 24h/24."
302
+ msgstr ""
303
+ "Comprando la versión premium del plugin, obtendrás las ventajas de las "
304
+ "características avanzadas del producto, y tendrás un año de actualizaciones "
305
+ "gratuitas y de soporte a través de nuestra plataforma disponible 24h/24."
306
+
307
+ #: templates/admin/premium.php:193
308
+ #, php-format
309
+ msgid ""
310
+ "Upgrade to the %1$s premium version %2$s of %1$s YITH WooCommerce Zoom "
311
+ "Magnifier %2$s to benefit from all features!"
312
+ msgstr ""
313
+
314
+ #: templates/admin/premium.php:196
315
+ #, php-format
316
+ msgid "%1$sUPGRADE%2$s%3$sto the premium version%2$s"
317
+ msgstr ""
318
+
319
+ #: templates/admin/premium.php:202
320
+ #, php-format
321
+ msgid "%1$sPremium Features%2$s"
322
+ msgstr ""
323
+
324
+ #: templates/admin/premium.php:210
325
+ msgid "ZOOM BOX POSITION"
326
+ msgstr ""
327
+
328
+ #: templates/admin/premium.php:213
329
+ #, php-format
330
+ msgid ""
331
+ "Choose where you want to show the %1$szoomed version%2$s of the image of "
332
+ "your products. Place it above or below the original image, on its left or "
333
+ "its right, or you can even place it over it.$2$s"
334
+ msgstr ""
335
+
336
+ #: templates/admin/premium.php:223
337
+ msgid "ENLARGE THE IMAGES"
338
+ msgstr ""
339
+
340
+ #: templates/admin/premium.php:225
341
+ msgid ""
342
+ "Just one click and the product image will appear in a bigger size in a modal "
343
+ "window. A further chance to let users analyze in a better way what you sell."
344
+ msgstr ""
345
+
346
+ #: templates/admin/premium.php:240
347
+ msgid "EXCLUDE PRODUCTS"
348
+ msgstr ""
349
+
350
+ #: templates/admin/premium.php:242
351
+ msgid ""
352
+ "Tailored options to limit the plugin features only to certain products. Some "
353
+ "of these could have too small images to be zoomed, or maybe being part of "
354
+ "categories that do not imply zoomed images. Select the products and the "
355
+ "categories to exclude and delete all your problems"
356
+ msgstr ""
357
+
358
+ #: templates/admin/premium.php:251
359
+ #, php-format
360
+ msgid ""
361
+ "Upgrade to the %1$spremium version%2$s of %1$sYITH WooCommerce Zoom Magnifier"
362
+ "%2$s to benefit from all features!"
363
+ msgstr ""
364
+
365
+ #: templates/admin/premium.php:254
366
+ #, php-format
367
+ msgid "%1$sUPGRADE%2$s %3$sto the premium version%2$s"
368
+ msgstr ""
369
+
370
+ #: yit-common/yith-panel.php:429
371
+ msgid "Select a date"
372
+ msgstr "Selecciona una fecha"
373
+
374
+ #: yit-common/yith-panel.php:430
375
+ msgid "Hours"
376
+ msgstr "Horas"
377
+
378
+ #: yit-common/yith-panel.php:431 yit-common/yith-panel.php:432
379
+ msgid "Minutes"
380
+ msgstr "Minutos"
381
+
382
+ #: yit-common/yith-panel.php:440
383
+ msgid "Upload"
384
+ msgstr "Actualizar"
385
+
386
+ #: yit-common/yith-panel.php:477
387
+ msgid "px"
388
+ msgstr "px"
389
+
390
+ #: yit-common/yith-panel.php:479
391
+ msgid "em"
392
+ msgstr "em"
393
+
394
+ #: yit-common/yith-panel.php:481
395
+ msgid "pt"
396
+ msgstr "pt"
397
+
398
+ #: yit-common/yith-panel.php:483
399
+ msgid "rem"
400
+ msgstr "rem"
401
+
402
+ #: yit-common/yith-panel.php:495
403
+ msgid "Select a font family"
404
+ msgstr "Selecciona un tipo de fuente"
405
+
406
+ #: yit-common/yith-panel.php:505
407
+ msgid "Regular"
408
+ msgstr "Normal"
409
+
410
+ #: yit-common/yith-panel.php:507
411
+ msgid "Bold"
412
+ msgstr "Negrita"
413
+
414
+ #: yit-common/yith-panel.php:509
415
+ msgid "Extra bold"
416
+ msgstr "Extra negrita"
417
+
418
+ #: yit-common/yith-panel.php:511
419
+ msgid "Italic"
420
+ msgstr "Cursiva"
421
+
422
+ #: yit-common/yith-panel.php:513
423
+ msgid "Italic bold"
424
+ msgstr "Negrita cursiva"
425
+
426
+ #: yit-common/yith-panel.php:529
427
+ msgid "Click to preview"
428
+ msgstr "Haz click para previsualizar"
429
+
430
+ #~ msgid "product"
431
+ #~ msgstr "praducto"
432
+
433
+ #~ msgid "products"
434
+ #~ msgstr "productos"
435
+
436
+ #~ msgid "Remove from exclusions"
437
+ #~ msgstr "Quitar de las exclusiones"
438
+
439
+ #~ msgid "Edit product"
440
+ #~ msgstr "Editar producto"
441
+
442
+ #~ msgid "Remove from list"
443
+ #~ msgstr "Eliminar de la lista"
444
+
445
+ #~ msgid "%s product removed successfully"
446
+ #~ msgid_plural "%s products removed successfully"
447
+ #~ msgstr[0] "El producto %s ha sido eliminado con éxito"
448
+ #~ msgstr[1] "Los productos %s han sido eliminados con éxito"
449
+
450
+ #~ msgid "%s product added successfully"
451
+ #~ msgid_plural "%s products added successfully"
452
+ #~ msgstr[0] "El producto %s ha sido añadido con éxito"
453
+ #~ msgstr[1] "Los productos %s han sido añadidos con éxito"
454
+
455
+ #~ msgid "Product updated successfully"
456
+ #~ msgstr "Producto actualizado con éxito"
457
+
458
+ #~ msgid "Single Product Exclusion List"
459
+ #~ msgstr "Lista de Exclusión de Productos"
460
+
461
+ #~ msgid "Add Products"
462
+ #~ msgstr "Añadir productos"
463
+
464
+ #~ msgid "Products to exclude"
465
+ #~ msgstr "Productos para excluir"
466
+
467
+ #~ msgid "Add product exclusion"
468
+ #~ msgstr "Añadir exclusión de producto"
469
+
470
+ #~ msgid "Return to exclusion list"
471
+ #~ msgstr "Devolver a la lista de exclusión"
472
+
473
+ #~ msgid "Select at least one product"
474
+ #~ msgstr "Selecciona al menos un producto"
475
+
476
+ #~ msgid "Exclude product categories"
477
+ #~ msgstr "Excluir categorías de productos"
478
+
479
+ #~ msgid "Top"
480
+ #~ msgstr "Arriba"
481
+
482
+ #~ msgid "Bottom"
483
+ #~ msgstr "Abajo"
484
+
485
+ #~ msgid "Left"
486
+ #~ msgstr "Izquierda"
487
+
488
+ #~ msgid "Product"
489
+ #~ msgstr "Producto"
languages/yith-woocommerce-zoom-magnifier-it_IT.po CHANGED
@@ -1,522 +1,522 @@
1
- msgid ""
2
- msgstr ""
3
- "Project-Id-Version: YITH WooCommerce Zoom Magnifier\n"
4
- "POT-Creation-Date: 2015-10-07 15:48+0200\n"
5
- "PO-Revision-Date: 2015-10-07 15:48+0200\n"
6
- "Last-Translator: \n"
7
- "Language-Team: Your Inspiration Themes <plugins@yithemes.com>\n"
8
- "Language: it_IT\n"
9
- "MIME-Version: 1.0\n"
10
- "Content-Type: text/plain; charset=UTF-8\n"
11
- "Content-Transfer-Encoding: 8bit\n"
12
- "X-Generator: Poedit 1.8.4\n"
13
- "X-Poedit-Basepath: ..\n"
14
- "Plural-Forms: nplurals=2; plural=n!=1;\n"
15
- "X-Poedit-KeywordsList: __ ;_e;_n:1,2;__ngettext:1,2;__ngettext_noop:1,2;"
16
- "_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2\n"
17
- "X-Poedit-SourceCharset: UTF-8\n"
18
- "X-Poedit-SearchPath-0: .\n"
19
- "X-Poedit-SearchPathExcluded-0: plugin-fw\n"
20
-
21
- #: class.yith-wcmg-admin.php:90
22
- msgid "Image Size"
23
- msgstr "Dimensioni Immagine"
24
-
25
- #: class.yith-wcmg-admin.php:91 plugin-options/general-options.php:17
26
- msgid "The size of the images used within the magnifier box"
27
- msgstr "La dimensione delle immagini utilizzata nel riquadro di zoom"
28
-
29
- #: init.php:43
30
- msgid ""
31
- "YITH WooCommerce Zoom Magnifier is enabled but not effective. It requires "
32
- "WooCommerce in order to work."
33
- msgstr ""
34
- "YITH WooCommerce Zoom Magnifier è attivo ma non funzionante. Il plugin "
35
- "richiede WooCommerce per funzionare correttamente."
36
-
37
- #: init.php:52
38
- msgid ""
39
- "You can't activate the free version of YITH WooCommerce Zoom Magnifier while "
40
- "you are using the premium one."
41
- msgstr ""
42
- "Non è possibile attivare la versione gratuita di YITH WooCommerce Zoom "
43
- "Magnifier mentre si utilizza quella premium."
44
-
45
- #: lib/class.yith-ywzm-custom-types.php:159
46
- msgid "Do you want to hard crop the image?"
47
- msgstr "Vuoi ritagliare l'immagine?"
48
-
49
- #: lib/class.yith-ywzm-plugin-fw-loader.php:124
50
- msgid "General"
51
- msgstr "Generale"
52
-
53
- #: lib/class.yith-ywzm-plugin-fw-loader.php:127
54
- #: lib/class.yith-ywzm-plugin-fw-loader.php:191
55
- msgid "Premium Version"
56
- msgstr "Versione Premium"
57
-
58
- #: lib/class.yith-ywzm-plugin-fw-loader.php:129
59
- msgid "Product exclusion list"
60
- msgstr "Elenco esclusioni prodotti"
61
-
62
- #: lib/class.yith-ywzm-plugin-fw-loader.php:188
63
- msgid "Settings"
64
- msgstr "Impostazioni"
65
-
66
- #: lib/class.yith-ywzm-plugin-fw-loader.php:216
67
- msgid "Plugin Documentation"
68
- msgstr "Documentazione Plugin"
69
-
70
- #: lib/class.yith-ywzm-plugin-fw-loader.php:229
71
- msgid ""
72
- "YITH WooCommerce Zoom Magnifier is available in an outstanding PREMIUM "
73
- "version with many new options, discover it now."
74
- msgstr ""
75
- "YITH WooCommerce Zoom Magnifier è disponibile in una straordinaria versione "
76
- "PREMIUM con molte nuove opzioni, scoprila subito."
77
-
78
- #: lib/class.yith-ywzm-plugin-fw-loader.php:230
79
- msgid "Premium version"
80
- msgstr "Versione premium"
81
-
82
- #: lib/class.yith-ywzm-plugin-fw-loader.php:237
83
- #: plugin-options/general-options.php:216
84
- msgid "YITH WooCommerce Zoom Magnifier"
85
- msgstr "YITH WooCommerce Zoom Magnifier"
86
-
87
- #: lib/class.yith-ywzm-plugin-fw-loader.php:238
88
- msgid ""
89
- "In YIT Plugins tab you can find YITH WooCommerce Zoom Magnifier options."
90
- "<br> From this menu you can access all settings of the YITH plugins "
91
- "activated."
92
- msgstr ""
93
- "Nella tab YIT Plugins puoi trovare le optioni di YITH WooCommerce Zoom "
94
- "Magnifier.<br> Da questo menu puoi accedere a tutte le impostazioni dei "
95
- "plugin YITH attivati."
96
-
97
- #: plugin-options/general-options.php:16
98
- msgid "Image size"
99
- msgstr "Dimensione immagine"
100
-
101
- #: plugin-options/general-options.php:36
102
- msgid "General Settings"
103
- msgstr "Impostazioni generali"
104
-
105
- #: plugin-options/general-options.php:42
106
- msgid "Activate YITH WooCommerce Zoom Magnifier"
107
- msgstr "Attiva YITH WooCommerce Zoom Magnifier"
108
-
109
- #: plugin-options/general-options.php:43
110
- msgid "Activate the plugin or use the WooCommerce default product image."
111
- msgstr "Attiva il plugin o usa le immagini prodotto di default di WooCommerce."
112
-
113
- #: plugin-options/general-options.php:50
114
- msgid "Activate on mobile device"
115
- msgstr "Attiva su dispositivi mobili"
116
-
117
- #: plugin-options/general-options.php:51
118
- msgid ""
119
- "Set if zoom and slider functionalities should be shown also on mobile "
120
- "devices."
121
- msgstr "Decidi se mostrare lo zoom e lo slider anche sui dispositivi mobili."
122
-
123
- #: plugin-options/general-options.php:59
124
- msgid "Forced Image Size"
125
- msgstr "Dimensioni Immagini Forzate"
126
-
127
- #: plugin-options/general-options.php:60
128
- msgid ""
129
- "If disabled, you will able to customize the sizes of the zoomed images. "
130
- "Disable it at your own risk; the magnifier could not properly work with "
131
- "images out of proportion."
132
- msgstr ""
133
- "Se disabilitata, questa opzione permette di personalizzare la dimensione "
134
- "delle immagini zoomate. Disabilitare a proprio rischio: lo zoom potrebbe non "
135
- "funzionare correttamente con immagini sproporzionate."
136
-
137
- #: plugin-options/general-options.php:74
138
- msgid "Magnifier Settings"
139
- msgstr "Impostazioni Zoom"
140
-
141
- #: plugin-options/general-options.php:80
142
- msgid "Zoom Box Width"
143
- msgstr "Larghezza Riquadro Zoom"
144
-
145
- #: plugin-options/general-options.php:81
146
- msgid "The width of the magnifier box (default: auto)"
147
- msgstr "La larghezza del riquadro di zoom (default: auto)"
148
-
149
- #: plugin-options/general-options.php:88
150
- msgid "Zoom Box Height"
151
- msgstr "Altezza Riquadro Zoom"
152
-
153
- #: plugin-options/general-options.php:89
154
- msgid "The height of the magnifier box (default: auto)"
155
- msgstr "L'altezza del riquadro di zoom (default: auto)"
156
-
157
- #: plugin-options/general-options.php:97
158
- msgid "Zoom Box Position"
159
- msgstr "Posizione Riquadro Zoom"
160
-
161
- #: plugin-options/general-options.php:98
162
- msgid "The magnifier position"
163
- msgstr "Dove apparirà la finestra di zoom"
164
-
165
- #: plugin-options/general-options.php:104
166
- msgid "Right"
167
- msgstr "Destra"
168
-
169
- #: plugin-options/general-options.php:105
170
- #: plugin-options/general-options.php:117
171
- msgid "Inside"
172
- msgstr "Interno"
173
-
174
- #: plugin-options/general-options.php:109
175
- msgid "Zoom Box Position for mobile devices"
176
- msgstr "Posizione Riquadro Zoom su dispositivi mobili"
177
-
178
- #: plugin-options/general-options.php:110
179
- msgid "The magnifier position for the mobile devices (iPhone, Android, etc.)"
180
- msgstr ""
181
- "Dove apparirà la finestra di zoom sui dispositivi mobili (iPhone, Android, "
182
- "etc.)"
183
-
184
- #: plugin-options/general-options.php:116
185
- msgid "Default"
186
- msgstr "Default"
187
-
188
- #: plugin-options/general-options.php:118
189
- msgid "Disable"
190
- msgstr "Disattiva"
191
-
192
- #: plugin-options/general-options.php:122
193
- msgid "Loading label"
194
- msgstr "Etichetta di caricamento"
195
-
196
- #: plugin-options/general-options.php:125
197
- #: plugin-options/general-options.php:126
198
- msgid "Loading..."
199
- msgstr "Caricamento..."
200
-
201
- #: plugin-options/general-options.php:130
202
- msgid "Lens Opacity"
203
- msgstr "Opacità Lenti"
204
-
205
- #: plugin-options/general-options.php:141
206
- msgid "Blur"
207
- msgstr "Sfocatura"
208
-
209
- #: plugin-options/general-options.php:142
210
- msgid "Add a blur effect to the small image on mouse hover."
211
- msgstr ""
212
- "Aggiungi un effetto di sfocatura all'immagine piccola al passaggio del mouse."
213
-
214
- #: plugin-options/general-options.php:153
215
- msgid "Slider Settings"
216
- msgstr "Impostazioni Slider"
217
-
218
- #: plugin-options/general-options.php:159
219
- msgid "Activate Slider"
220
- msgstr "Attiva Slider"
221
-
222
- #: plugin-options/general-options.php:160
223
- msgid "Activate Thumbnail Slider."
224
- msgstr "Attiva lo slider con anteprime."
225
-
226
- #: plugin-options/general-options.php:167
227
- msgid "Activate Responsive Slider"
228
- msgstr "Attiva Slider Responsive"
229
-
230
- #: plugin-options/general-options.php:168
231
- msgid ""
232
- "This option fits the thumbnails within the available space. Disable it if "
233
- "you want to manage freely the thumbnails (eg. add margins, paddings, etc.)"
234
- msgstr ""
235
- "Questa opzione adatta le anteprime allo spazio disponibile. Disabilitala se "
236
- "vuoi gestire liberamente le anteprime (per esempio aggiungere margini, "
237
- "padding, ecc.)"
238
-
239
- #: plugin-options/general-options.php:175
240
- msgid "Items"
241
- msgstr "Elementi"
242
-
243
- #: plugin-options/general-options.php:176
244
- msgid "Number of items to show"
245
- msgstr "Numero di elementi da mostrare"
246
-
247
- #: plugin-options/general-options.php:186
248
- msgid "Circular carousel"
249
- msgstr "Carosello circolare"
250
-
251
- #: plugin-options/general-options.php:187
252
- msgid "It defines whether the carousel should be circular."
253
- msgstr "Imposta se il carosello deve essere circolare."
254
-
255
- #: plugin-options/general-options.php:194
256
- msgid "Infinite carousel"
257
- msgstr "Carosello infinito"
258
-
259
- #: plugin-options/general-options.php:195
260
- msgid ""
261
- "It defines whether the carousel should be infinite. Note: It is possible to "
262
- "create a non-circular, infinite carousel, but it is not possible to create a "
263
- "circular, non-infinite carousel."
264
- msgstr ""
265
- "Imposta se il carosello deve essere infinito. Attenzione: è possibile creare "
266
- "un carosello infinito non circolare, ma non puoi creare un carosello "
267
- "circolare non infinito."
268
-
269
- #: plugin-options/general-options.php:213
270
- msgid "Upgrade to the PREMIUM VERSION"
271
- msgstr "Aggiorna alla VERSIONE PREMIUM"
272
-
273
- #: plugin-options/general-options.php:217
274
- msgid "Discover The Advanced Features"
275
- msgstr "Scopri le caratteristiche avanzate"
276
-
277
- #: plugin-options/general-options.php:218
278
- msgid ""
279
- "Upgrade to the PREMIUM VERSION of YITH WOOCOMMERCE ZOOM MAGNIFIER to benefit "
280
- "from all features!"
281
- msgstr ""
282
- "Aggiorna alla VERSIONE PREMIUM di YITH WOOCOMMERCE ZOOM MAGNIFIER per "
283
- "usufruire di tutte le caratteristiche!"
284
-
285
- #: plugin-options/general-options.php:222
286
- msgid ""
287
- "See YITH WooCommerce Zoom Magnifier plugin with full premium features in "
288
- "action"
289
- msgstr ""
290
- "Guarda il plugin YITH WooCommerce Zoom Magnifier con tutte le "
291
- "caratteristiche premium in azione"
292
-
293
- #: plugin-options/general-options.php:224
294
- msgid "Get Support and Pro Features"
295
- msgstr "Ottieni il supporto e le caratteristiche premium"
296
-
297
- #: plugin-options/general-options.php:225
298
- msgid ""
299
- "Purchasing the premium version of the plugin, you will take advantage of the "
300
- "advanced features of the product, and you will get one year of free updates "
301
- "and support through our platform available 24h/24."
302
- msgstr ""
303
- "Acquistando la versione premium del plugin potrai usufruire delle "
304
- "caratteristiche avanzate del prodotto, oltre a ottenere un anno di "
305
- "aggiornamenti gratuiti e di supporto attraverso la nostra piattaforma "
306
- "disponibile 24h/24."
307
-
308
- #: templates/admin/premium.php:193
309
- #, php-format
310
- msgid ""
311
- "Upgrade to the %1$s premium version %2$s of %1$s YITH WooCommerce Zoom "
312
- "Magnifier %2$s to benefit from all features!"
313
- msgstr ""
314
- "Aggiorna alla %1$s versione premium %2$s di %1$s YITH WooCommerce Zoom "
315
- "Magnifier %2$s per usufruire di tutte le funzionalità!"
316
-
317
- #: templates/admin/premium.php:196
318
- #, php-format
319
- msgid "%1$sUPGRADE%2$s%3$sto the premium version%2$s"
320
- msgstr "%1$sAGGIORNA%2$s%3$salla versione premium%2$s "
321
-
322
- #: templates/admin/premium.php:202
323
- #, php-format
324
- msgid "%1$sPremium Features%2$s"
325
- msgstr "%1$sFunzionalità premium%2$s"
326
-
327
- #: templates/admin/premium.php:210
328
- msgid "ZOOM BOX POSITION"
329
- msgstr "POSIZIONE RIQUADRO ZOOM"
330
-
331
- #: templates/admin/premium.php:213
332
- #, php-format
333
- msgid ""
334
- "Choose where you want to show the %1$szoomed version%2$s of the image of "
335
- "your products. Place it above or below the original image, on its left or "
336
- "its right, or you can even place it over it.$2$s"
337
- msgstr ""
338
- "Scegli dove far apparire la %1$sversione ingrandita%2$s dell’immagine dei "
339
- "tuoi prodotti. Posizionala in alto o in basso rispetto all’immagine "
340
- "originale, alla sua destra o alla sua sinistra, o fa’ sì che si sovrapponga "
341
- "ad essa.$2$s"
342
-
343
- #: templates/admin/premium.php:223
344
- msgid "ENLARGE THE IMAGES"
345
- msgstr "ESPANDI L’IMMAGINE"
346
-
347
- #: templates/admin/premium.php:225
348
- msgid ""
349
- "Just one click and the product image will appear in a bigger size in a modal "
350
- "window. A further chance to let users analyze in a better way what you sell."
351
- msgstr ""
352
- "Un clic e l’immagine del prodotto apparirà a dimensioni maggiori e "
353
- "all’interno di una finestra modale. Una possibilità in più per mettere "
354
- "l’utente nelle condizioni di valutare al meglio ciò che vede."
355
-
356
- #: templates/admin/premium.php:240
357
- msgid "EXCLUDE PRODUCTS"
358
- msgstr "ESCLUSIONE PRODOTTI"
359
-
360
- #: templates/admin/premium.php:242
361
- msgid ""
362
- "Tailored options to limit the plugin features only to certain products. Some "
363
- "of these could have too small images to be zoomed, or maybe being part of "
364
- "categories that do not imply zoomed images. Select the products and the "
365
- "categories to exclude and delete all your problems"
366
- msgstr ""
367
- "Opzioni su misura per limitare le funzionalità del plugin solo a determinati "
368
- "prodotti. Alcuni di questi possono avere immagini troppo piccole per essere "
369
- "zoomate o appartenere a categorie in cui lo zoom immagine non è necessario. "
370
- "Seleziona i prodotti e le categorie da escludere e risolvi questo tipo di "
371
- "problemi."
372
-
373
- #: templates/admin/premium.php:251
374
- #, php-format
375
- msgid ""
376
- "Upgrade to the %1$spremium version%2$s of %1$sYITH WooCommerce Zoom Magnifier"
377
- "%2$s to benefit from all features!"
378
- msgstr ""
379
- "Aggiorna alla %1$sversione premium%2$s di %1$s YITH WooCommerce Zoom "
380
- "Magnifier %2$s per usufruire di tutte le funzionalità!"
381
-
382
- #: templates/admin/premium.php:254
383
- #, php-format
384
- msgid "%1$sUPGRADE%2$s %3$sto the premium version%2$s"
385
- msgstr "%1$sAGGIORNA%2$s %3$salla versione premium%2$s "
386
-
387
- #: yit-common/yith-panel.php:418
388
- msgid "Select a date"
389
- msgstr "Scegli una data"
390
-
391
- #: yit-common/yith-panel.php:419
392
- msgid "Hours"
393
- msgstr "Ore"
394
-
395
- #: yit-common/yith-panel.php:420 yit-common/yith-panel.php:421
396
- msgid "Minutes"
397
- msgstr "Minuti"
398
-
399
- #: yit-common/yith-panel.php:429
400
- msgid "Upload"
401
- msgstr "Carica"
402
-
403
- #: yit-common/yith-panel.php:466
404
- msgid "px"
405
- msgstr "px"
406
-
407
- #: yit-common/yith-panel.php:468
408
- msgid "em"
409
- msgstr "em"
410
-
411
- #: yit-common/yith-panel.php:470
412
- msgid "pt"
413
- msgstr "pt"
414
-
415
- #: yit-common/yith-panel.php:472
416
- msgid "rem"
417
- msgstr "rem"
418
-
419
- #: yit-common/yith-panel.php:484
420
- msgid "Select a font family"
421
- msgstr "Scegli una famiglia di caratteri"
422
-
423
- #: yit-common/yith-panel.php:494
424
- msgid "Regular"
425
- msgstr "Normale"
426
-
427
- #: yit-common/yith-panel.php:496
428
- msgid "Bold"
429
- msgstr "Grassetto"
430
-
431
- #: yit-common/yith-panel.php:498
432
- msgid "Extra bold"
433
- msgstr "Grassetto extra"
434
-
435
- #: yit-common/yith-panel.php:500
436
- msgid "Italic"
437
- msgstr "Corsivo"
438
-
439
- #: yit-common/yith-panel.php:502
440
- msgid "Italic bold"
441
- msgstr "Corsivo E Grassetto"
442
-
443
- #: yit-common/yith-panel.php:518
444
- msgid "Click to preview"
445
- msgstr "Premi per visualizzare l'anteprima"
446
-
447
- #~ msgid "Activate YITH Magnifier"
448
- #~ msgstr "Attiva YITH Magnifier"
449
-
450
- #~ msgid "Activate the plugin on mobile device"
451
- #~ msgstr "Attiva il plugin su dispositivi mobili"
452
-
453
- #~ msgid ""
454
- #~ "Purchasing the premium version of the plugin, you will take advantage of "
455
- #~ "the advanced features of the product and you will get one year of free "
456
- #~ "updates and support through our platform available 24h/24."
457
- #~ msgstr ""
458
- #~ "Acquistando la versione premium del plugin potrai usufruire delle "
459
- #~ "caratteristiche avanzate del prodotto, oltre a ottenere un anno di "
460
- #~ "aggiornamenti gratuiti e di supporto attraverso la nostra piattaforma "
461
- #~ "disponibile 24h/24."
462
-
463
- #~ msgid "product"
464
- #~ msgstr "prodotto"
465
-
466
- #~ msgid "products"
467
- #~ msgstr "prodotti"
468
-
469
- #~ msgid "Product"
470
- #~ msgstr "Prodotto"
471
-
472
- #~ msgid "Remove from exclusions"
473
- #~ msgstr "Rimuovi dalle esclusioni"
474
-
475
- #~ msgid "Edit product"
476
- #~ msgstr "Modifica prodotto"
477
-
478
- #~ msgid "Remove from list"
479
- #~ msgstr "Elimina dalla lista"
480
-
481
- #~ msgid "%s product removed successfully"
482
- #~ msgid_plural "%s products removed successfully"
483
- #~ msgstr[0] "%s prodotto rimosso correttamente"
484
- #~ msgstr[1] "%s prodotti rimossi correttamente"
485
-
486
- #~ msgid "%s product added successfully"
487
- #~ msgid_plural "%s products added successfully"
488
- #~ msgstr[0] "%s prodotto aggiunto correttamente"
489
- #~ msgstr[1] "%s prodotti aggiunti correttamente"
490
-
491
- #~ msgid "Product updated successfully"
492
- #~ msgstr "Prodotto aggiornato correttamente"
493
-
494
- #~ msgid "Single Product Exclusion List"
495
- #~ msgstr "Elenco Esclusioni Prodotti"
496
-
497
- #~ msgid "Add Products"
498
- #~ msgstr "Aggiungi Prodotto"
499
-
500
- #~ msgid "Products to exclude"
501
- #~ msgstr "Prodotti da escludere"
502
-
503
- #~ msgid "Add product exclusion"
504
- #~ msgstr "Aggiungi esclusione prodotto"
505
-
506
- #~ msgid "Return to exclusion list"
507
- #~ msgstr "Torno all'elenco esclusioni"
508
-
509
- #~ msgid "Select at least one product"
510
- #~ msgstr "Seleziona almeno un prodotto"
511
-
512
- #~ msgid "Exclude product categories"
513
- #~ msgstr "Escludi categorie di prodotti"
514
-
515
- #~ msgid "Top"
516
- #~ msgstr "Sopra"
517
-
518
- #~ msgid "Bottom"
519
- #~ msgstr "Sotto"
520
-
521
- #~ msgid "Left"
522
- #~ msgstr "Sinistra"
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: YITH WooCommerce Zoom Magnifier\n"
4
+ "POT-Creation-Date: 2015-10-07 15:48+0200\n"
5
+ "PO-Revision-Date: 2015-10-07 15:48+0200\n"
6
+ "Last-Translator: \n"
7
+ "Language-Team: Your Inspiration Themes <plugins@yithemes.com>\n"
8
+ "Language: it_IT\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 1.8.4\n"
13
+ "X-Poedit-Basepath: ..\n"
14
+ "Plural-Forms: nplurals=2; plural=n!=1;\n"
15
+ "X-Poedit-KeywordsList: __ ;_e;_n:1,2;__ngettext:1,2;__ngettext_noop:1,2;"
16
+ "_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2\n"
17
+ "X-Poedit-SourceCharset: UTF-8\n"
18
+ "X-Poedit-SearchPath-0: .\n"
19
+ "X-Poedit-SearchPathExcluded-0: plugin-fw\n"
20
+
21
+ #: class.yith-wcmg-admin.php:90
22
+ msgid "Image Size"
23
+ msgstr "Dimensioni Immagine"
24
+
25
+ #: class.yith-wcmg-admin.php:91 plugin-options/general-options.php:17
26
+ msgid "The size of the images used within the magnifier box"
27
+ msgstr "La dimensione delle immagini utilizzata nel riquadro di zoom"
28
+
29
+ #: init.php:43
30
+ msgid ""
31
+ "YITH WooCommerce Zoom Magnifier is enabled but not effective. It requires "
32
+ "WooCommerce in order to work."
33
+ msgstr ""
34
+ "YITH WooCommerce Zoom Magnifier è attivo ma non funzionante. Il plugin "
35
+ "richiede WooCommerce per funzionare correttamente."
36
+
37
+ #: init.php:52
38
+ msgid ""
39
+ "You can't activate the free version of YITH WooCommerce Zoom Magnifier while "
40
+ "you are using the premium one."
41
+ msgstr ""
42
+ "Non è possibile attivare la versione gratuita di YITH WooCommerce Zoom "
43
+ "Magnifier mentre si utilizza quella premium."
44
+
45
+ #: lib/class.yith-ywzm-custom-types.php:159
46
+ msgid "Do you want to hard crop the image?"
47
+ msgstr "Vuoi ritagliare l'immagine?"
48
+
49
+ #: lib/class.yith-ywzm-plugin-fw-loader.php:124
50
+ msgid "General"
51
+ msgstr "Generale"
52
+
53
+ #: lib/class.yith-ywzm-plugin-fw-loader.php:127
54
+ #: lib/class.yith-ywzm-plugin-fw-loader.php:191
55
+ msgid "Premium Version"
56
+ msgstr "Versione Premium"
57
+
58
+ #: lib/class.yith-ywzm-plugin-fw-loader.php:129
59
+ msgid "Product exclusion list"
60
+ msgstr "Elenco esclusioni prodotti"
61
+
62
+ #: lib/class.yith-ywzm-plugin-fw-loader.php:188
63
+ msgid "Settings"
64
+ msgstr "Impostazioni"
65
+
66
+ #: lib/class.yith-ywzm-plugin-fw-loader.php:216
67
+ msgid "Plugin Documentation"
68
+ msgstr "Documentazione Plugin"
69
+
70
+ #: lib/class.yith-ywzm-plugin-fw-loader.php:229
71
+ msgid ""
72
+ "YITH WooCommerce Zoom Magnifier is available in an outstanding PREMIUM "
73
+ "version with many new options, discover it now."
74
+ msgstr ""
75
+ "YITH WooCommerce Zoom Magnifier è disponibile in una straordinaria versione "
76
+ "PREMIUM con molte nuove opzioni, scoprila subito."
77
+
78
+ #: lib/class.yith-ywzm-plugin-fw-loader.php:230
79
+ msgid "Premium version"
80
+ msgstr "Versione premium"
81
+
82
+ #: lib/class.yith-ywzm-plugin-fw-loader.php:237
83
+ #: plugin-options/general-options.php:216
84
+ msgid "YITH WooCommerce Zoom Magnifier"
85
+ msgstr "YITH WooCommerce Zoom Magnifier"
86
+
87
+ #: lib/class.yith-ywzm-plugin-fw-loader.php:238
88
+ msgid ""
89
+ "In YIT Plugins tab you can find YITH WooCommerce Zoom Magnifier options."
90
+ "<br> From this menu you can access all settings of the YITH plugins "
91
+ "activated."
92
+ msgstr ""
93
+ "Nella tab YIT Plugins puoi trovare le optioni di YITH WooCommerce Zoom "
94
+ "Magnifier.<br> Da questo menu puoi accedere a tutte le impostazioni dei "
95
+ "plugin YITH attivati."
96
+
97
+ #: plugin-options/general-options.php:16
98
+ msgid "Image size"
99
+ msgstr "Dimensione immagine"
100
+
101
+ #: plugin-options/general-options.php:36
102
+ msgid "General Settings"
103
+ msgstr "Impostazioni generali"
104
+
105
+ #: plugin-options/general-options.php:42
106
+ msgid "Activate YITH WooCommerce Zoom Magnifier"
107
+ msgstr "Attiva YITH WooCommerce Zoom Magnifier"
108
+
109
+ #: plugin-options/general-options.php:43
110
+ msgid "Activate the plugin or use the WooCommerce default product image."
111
+ msgstr "Attiva il plugin o usa le immagini prodotto di default di WooCommerce."
112
+
113
+ #: plugin-options/general-options.php:50
114
+ msgid "Activate on mobile device"
115
+ msgstr "Attiva su dispositivi mobili"
116
+
117
+ #: plugin-options/general-options.php:51
118
+ msgid ""
119
+ "Set if zoom and slider functionalities should be shown also on mobile "
120
+ "devices."
121
+ msgstr "Decidi se mostrare lo zoom e lo slider anche sui dispositivi mobili."
122
+
123
+ #: plugin-options/general-options.php:59
124
+ msgid "Forced Image Size"
125
+ msgstr "Dimensioni Immagini Forzate"
126
+
127
+ #: plugin-options/general-options.php:60
128
+ msgid ""
129
+ "If disabled, you will able to customize the sizes of the zoomed images. "
130
+ "Disable it at your own risk; the magnifier could not properly work with "
131
+ "images out of proportion."
132
+ msgstr ""
133
+ "Se disabilitata, questa opzione permette di personalizzare la dimensione "
134
+ "delle immagini zoomate. Disabilitare a proprio rischio: lo zoom potrebbe non "
135
+ "funzionare correttamente con immagini sproporzionate."
136
+
137
+ #: plugin-options/general-options.php:74
138
+ msgid "Magnifier Settings"
139
+ msgstr "Impostazioni Zoom"
140
+
141
+ #: plugin-options/general-options.php:80
142
+ msgid "Zoom Box Width"
143
+ msgstr "Larghezza Riquadro Zoom"
144
+
145
+ #: plugin-options/general-options.php:81
146
+ msgid "The width of the magnifier box (default: auto)"
147
+ msgstr "La larghezza del riquadro di zoom (default: auto)"
148
+
149
+ #: plugin-options/general-options.php:88
150
+ msgid "Zoom Box Height"
151
+ msgstr "Altezza Riquadro Zoom"
152
+
153
+ #: plugin-options/general-options.php:89
154
+ msgid "The height of the magnifier box (default: auto)"
155
+ msgstr "L'altezza del riquadro di zoom (default: auto)"
156
+
157
+ #: plugin-options/general-options.php:97
158
+ msgid "Zoom Box Position"
159
+ msgstr "Posizione Riquadro Zoom"
160
+
161
+ #: plugin-options/general-options.php:98
162
+ msgid "The magnifier position"
163
+ msgstr "Dove apparirà la finestra di zoom"
164
+
165
+ #: plugin-options/general-options.php:104
166
+ msgid "Right"
167
+ msgstr "Destra"
168
+
169
+ #: plugin-options/general-options.php:105
170
+ #: plugin-options/general-options.php:117
171
+ msgid "Inside"
172
+ msgstr "Interno"
173
+
174
+ #: plugin-options/general-options.php:109
175
+ msgid "Zoom Box Position for mobile devices"
176
+ msgstr "Posizione Riquadro Zoom su dispositivi mobili"
177
+
178
+ #: plugin-options/general-options.php:110
179
+ msgid "The magnifier position for the mobile devices (iPhone, Android, etc.)"
180
+ msgstr ""
181
+ "Dove apparirà la finestra di zoom sui dispositivi mobili (iPhone, Android, "
182
+ "etc.)"
183
+
184
+ #: plugin-options/general-options.php:116
185
+ msgid "Default"
186
+ msgstr "Default"
187
+
188
+ #: plugin-options/general-options.php:118
189
+ msgid "Disable"
190
+ msgstr "Disattiva"
191
+
192
+ #: plugin-options/general-options.php:122
193
+ msgid "Loading label"
194
+ msgstr "Etichetta di caricamento"
195
+
196
+ #: plugin-options/general-options.php:125
197
+ #: plugin-options/general-options.php:126
198
+ msgid "Loading..."
199
+ msgstr "Caricamento..."
200
+
201
+ #: plugin-options/general-options.php:130
202
+ msgid "Lens Opacity"
203
+ msgstr "Opacità Lenti"
204
+
205
+ #: plugin-options/general-options.php:141
206
+ msgid "Blur"
207
+ msgstr "Sfocatura"
208
+
209
+ #: plugin-options/general-options.php:142
210
+ msgid "Add a blur effect to the small image on mouse hover."
211
+ msgstr ""
212
+ "Aggiungi un effetto di sfocatura all'immagine piccola al passaggio del mouse."
213
+
214
+ #: plugin-options/general-options.php:153
215
+ msgid "Slider Settings"
216
+ msgstr "Impostazioni Slider"
217
+
218
+ #: plugin-options/general-options.php:159
219
+ msgid "Activate Slider"
220
+ msgstr "Attiva Slider"
221
+
222
+ #: plugin-options/general-options.php:160
223
+ msgid "Activate Thumbnail Slider."
224
+ msgstr "Attiva lo slider con anteprime."
225
+
226
+ #: plugin-options/general-options.php:167
227
+ msgid "Activate Responsive Slider"
228
+ msgstr "Attiva Slider Responsive"
229
+
230
+ #: plugin-options/general-options.php:168
231
+ msgid ""
232
+ "This option fits the thumbnails within the available space. Disable it if "
233
+ "you want to manage freely the thumbnails (eg. add margins, paddings, etc.)"
234
+ msgstr ""
235
+ "Questa opzione adatta le anteprime allo spazio disponibile. Disabilitala se "
236
+ "vuoi gestire liberamente le anteprime (per esempio aggiungere margini, "
237
+ "padding, ecc.)"
238
+
239
+ #: plugin-options/general-options.php:175
240
+ msgid "Items"
241
+ msgstr "Elementi"
242
+
243
+ #: plugin-options/general-options.php:176
244
+ msgid "Number of items to show"
245
+ msgstr "Numero di elementi da mostrare"
246
+
247
+ #: plugin-options/general-options.php:186
248
+ msgid "Circular carousel"
249
+ msgstr "Carosello circolare"
250
+
251
+ #: plugin-options/general-options.php:187
252
+ msgid "It defines whether the carousel should be circular."
253
+ msgstr "Imposta se il carosello deve essere circolare."
254
+
255
+ #: plugin-options/general-options.php:194
256
+ msgid "Infinite carousel"
257
+ msgstr "Carosello infinito"
258
+
259
+ #: plugin-options/general-options.php:195
260
+ msgid ""
261
+ "It defines whether the carousel should be infinite. Note: It is possible to "
262
+ "create a non-circular, infinite carousel, but it is not possible to create a "
263
+ "circular, non-infinite carousel."
264
+ msgstr ""
265
+ "Imposta se il carosello deve essere infinito. Attenzione: è possibile creare "
266
+ "un carosello infinito non circolare, ma non puoi creare un carosello "
267
+ "circolare non infinito."
268
+
269
+ #: plugin-options/general-options.php:213
270
+ msgid "Upgrade to the PREMIUM VERSION"
271
+ msgstr "Aggiorna alla VERSIONE PREMIUM"
272
+
273
+ #: plugin-options/general-options.php:217
274
+ msgid "Discover The Advanced Features"
275
+ msgstr "Scopri le caratteristiche avanzate"
276
+
277
+ #: plugin-options/general-options.php:218
278
+ msgid ""
279
+ "Upgrade to the PREMIUM VERSION of YITH WOOCOMMERCE ZOOM MAGNIFIER to benefit "
280
+ "from all features!"
281
+ msgstr ""
282
+ "Aggiorna alla VERSIONE PREMIUM di YITH WOOCOMMERCE ZOOM MAGNIFIER per "
283
+ "usufruire di tutte le caratteristiche!"
284
+
285
+ #: plugin-options/general-options.php:222
286
+ msgid ""
287
+ "See YITH WooCommerce Zoom Magnifier plugin with full premium features in "
288
+ "action"
289
+ msgstr ""
290
+ "Guarda il plugin YITH WooCommerce Zoom Magnifier con tutte le "
291
+ "caratteristiche premium in azione"
292
+
293
+ #: plugin-options/general-options.php:224
294
+ msgid "Get Support and Pro Features"
295
+ msgstr "Ottieni il supporto e le caratteristiche premium"
296
+
297
+ #: plugin-options/general-options.php:225
298
+ msgid ""
299
+ "Purchasing the premium version of the plugin, you will take advantage of the "
300
+ "advanced features of the product, and you will get one year of free updates "
301
+ "and support through our platform available 24h/24."
302
+ msgstr ""
303
+ "Acquistando la versione premium del plugin potrai usufruire delle "
304
+ "caratteristiche avanzate del prodotto, oltre a ottenere un anno di "
305
+ "aggiornamenti gratuiti e di supporto attraverso la nostra piattaforma "
306
+ "disponibile 24h/24."
307
+
308
+ #: templates/admin/premium.php:193
309
+ #, php-format
310
+ msgid ""
311
+ "Upgrade to the %1$s premium version %2$s of %1$s YITH WooCommerce Zoom "
312
+ "Magnifier %2$s to benefit from all features!"
313
+ msgstr ""
314
+ "Aggiorna alla %1$s versione premium %2$s di %1$s YITH WooCommerce Zoom "
315
+ "Magnifier %2$s per usufruire di tutte le funzionalità!"
316
+
317
+ #: templates/admin/premium.php:196
318
+ #, php-format
319
+ msgid "%1$sUPGRADE%2$s%3$sto the premium version%2$s"
320
+ msgstr "%1$sAGGIORNA%2$s%3$salla versione premium%2$s "
321
+
322
+ #: templates/admin/premium.php:202
323
+ #, php-format
324
+ msgid "%1$sPremium Features%2$s"
325
+ msgstr "%1$sFunzionalità premium%2$s"
326
+
327
+ #: templates/admin/premium.php:210
328
+ msgid "ZOOM BOX POSITION"
329
+ msgstr "POSIZIONE RIQUADRO ZOOM"
330
+
331
+ #: templates/admin/premium.php:213
332
+ #, php-format
333
+ msgid ""
334
+ "Choose where you want to show the %1$szoomed version%2$s of the image of "
335
+ "your products. Place it above or below the original image, on its left or "
336
+ "its right, or you can even place it over it.$2$s"
337
+ msgstr ""
338
+ "Scegli dove far apparire la %1$sversione ingrandita%2$s dell’immagine dei "
339
+ "tuoi prodotti. Posizionala in alto o in basso rispetto all’immagine "
340
+ "originale, alla sua destra o alla sua sinistra, o fa’ sì che si sovrapponga "
341
+ "ad essa.$2$s"
342
+
343
+ #: templates/admin/premium.php:223
344
+ msgid "ENLARGE THE IMAGES"
345
+ msgstr "ESPANDI L’IMMAGINE"
346
+
347
+ #: templates/admin/premium.php:225
348
+ msgid ""
349
+ "Just one click and the product image will appear in a bigger size in a modal "
350
+ "window. A further chance to let users analyze in a better way what you sell."
351
+ msgstr ""
352
+ "Un clic e l’immagine del prodotto apparirà a dimensioni maggiori e "
353
+ "all’interno di una finestra modale. Una possibilità in più per mettere "
354
+ "l’utente nelle condizioni di valutare al meglio ciò che vede."
355
+
356
+ #: templates/admin/premium.php:240
357
+ msgid "EXCLUDE PRODUCTS"
358
+ msgstr "ESCLUSIONE PRODOTTI"
359
+
360
+ #: templates/admin/premium.php:242
361
+ msgid ""
362
+ "Tailored options to limit the plugin features only to certain products. Some "
363
+ "of these could have too small images to be zoomed, or maybe being part of "
364
+ "categories that do not imply zoomed images. Select the products and the "
365
+ "categories to exclude and delete all your problems"
366
+ msgstr ""
367
+ "Opzioni su misura per limitare le funzionalità del plugin solo a determinati "
368
+ "prodotti. Alcuni di questi possono avere immagini troppo piccole per essere "
369
+ "zoomate o appartenere a categorie in cui lo zoom immagine non è necessario. "
370
+ "Seleziona i prodotti e le categorie da escludere e risolvi questo tipo di "
371
+ "problemi."
372
+
373
+ #: templates/admin/premium.php:251
374
+ #, php-format
375
+ msgid ""
376
+ "Upgrade to the %1$spremium version%2$s of %1$sYITH WooCommerce Zoom Magnifier"
377
+ "%2$s to benefit from all features!"
378
+ msgstr ""
379
+ "Aggiorna alla %1$sversione premium%2$s di %1$s YITH WooCommerce Zoom "
380
+ "Magnifier %2$s per usufruire di tutte le funzionalità!"
381
+
382
+ #: templates/admin/premium.php:254
383
+ #, php-format
384
+ msgid "%1$sUPGRADE%2$s %3$sto the premium version%2$s"
385
+ msgstr "%1$sAGGIORNA%2$s %3$salla versione premium%2$s "
386
+
387
+ #: yit-common/yith-panel.php:418
388
+ msgid "Select a date"
389
+ msgstr "Scegli una data"
390
+
391
+ #: yit-common/yith-panel.php:419
392
+ msgid "Hours"
393
+ msgstr "Ore"
394
+
395
+ #: yit-common/yith-panel.php:420 yit-common/yith-panel.php:421
396
+ msgid "Minutes"
397
+ msgstr "Minuti"
398
+
399
+ #: yit-common/yith-panel.php:429
400
+ msgid "Upload"
401
+ msgstr "Carica"
402
+
403
+ #: yit-common/yith-panel.php:466
404
+ msgid "px"
405
+ msgstr "px"
406
+
407
+ #: yit-common/yith-panel.php:468
408
+ msgid "em"
409
+ msgstr "em"
410
+
411
+ #: yit-common/yith-panel.php:470
412
+ msgid "pt"
413
+ msgstr "pt"
414
+
415
+ #: yit-common/yith-panel.php:472
416
+ msgid "rem"
417
+ msgstr "rem"
418
+
419
+ #: yit-common/yith-panel.php:484
420
+ msgid "Select a font family"
421
+ msgstr "Scegli una famiglia di caratteri"
422
+
423
+ #: yit-common/yith-panel.php:494
424
+ msgid "Regular"
425
+ msgstr "Normale"
426
+
427
+ #: yit-common/yith-panel.php:496
428
+ msgid "Bold"
429
+ msgstr "Grassetto"
430
+
431
+ #: yit-common/yith-panel.php:498
432
+ msgid "Extra bold"
433
+ msgstr "Grassetto extra"
434
+
435
+ #: yit-common/yith-panel.php:500
436
+ msgid "Italic"
437
+ msgstr "Corsivo"
438
+
439
+ #: yit-common/yith-panel.php:502
440
+ msgid "Italic bold"
441
+ msgstr "Corsivo E Grassetto"
442
+
443
+ #: yit-common/yith-panel.php:518
444
+ msgid "Click to preview"
445
+ msgstr "Premi per visualizzare l'anteprima"
446
+
447
+ #~ msgid "Activate YITH Magnifier"
448
+ #~ msgstr "Attiva YITH Magnifier"
449
+
450
+ #~ msgid "Activate the plugin on mobile device"
451
+ #~ msgstr "Attiva il plugin su dispositivi mobili"
452
+
453
+ #~ msgid ""
454
+ #~ "Purchasing the premium version of the plugin, you will take advantage of "
455
+ #~ "the advanced features of the product and you will get one year of free "
456
+ #~ "updates and support through our platform available 24h/24."
457
+ #~ msgstr ""
458
+ #~ "Acquistando la versione premium del plugin potrai usufruire delle "
459
+ #~ "caratteristiche avanzate del prodotto, oltre a ottenere un anno di "
460
+ #~ "aggiornamenti gratuiti e di supporto attraverso la nostra piattaforma "
461
+ #~ "disponibile 24h/24."
462
+
463
+ #~ msgid "product"
464
+ #~ msgstr "prodotto"
465
+
466
+ #~ msgid "products"
467
+ #~ msgstr "prodotti"
468
+
469
+ #~ msgid "Product"
470
+ #~ msgstr "Prodotto"
471
+
472
+ #~ msgid "Remove from exclusions"
473
+ #~ msgstr "Rimuovi dalle esclusioni"
474
+
475
+ #~ msgid "Edit product"
476
+ #~ msgstr "Modifica prodotto"
477
+
478
+ #~ msgid "Remove from list"
479
+ #~ msgstr "Elimina dalla lista"
480
+
481
+ #~ msgid "%s product removed successfully"
482
+ #~ msgid_plural "%s products removed successfully"
483
+ #~ msgstr[0] "%s prodotto rimosso correttamente"
484
+ #~ msgstr[1] "%s prodotti rimossi correttamente"
485
+
486
+ #~ msgid "%s product added successfully"
487
+ #~ msgid_plural "%s products added successfully"
488
+ #~ msgstr[0] "%s prodotto aggiunto correttamente"
489
+ #~ msgstr[1] "%s prodotti aggiunti correttamente"
490
+
491
+ #~ msgid "Product updated successfully"
492
+ #~ msgstr "Prodotto aggiornato correttamente"
493
+
494
+ #~ msgid "Single Product Exclusion List"
495
+ #~ msgstr "Elenco Esclusioni Prodotti"
496
+
497
+ #~ msgid "Add Products"
498
+ #~ msgstr "Aggiungi Prodotto"
499
+
500
+ #~ msgid "Products to exclude"
501
+ #~ msgstr "Prodotti da escludere"
502
+
503
+ #~ msgid "Add product exclusion"
504
+ #~ msgstr "Aggiungi esclusione prodotto"
505
+
506
+ #~ msgid "Return to exclusion list"
507
+ #~ msgstr "Torno all'elenco esclusioni"
508
+
509
+ #~ msgid "Select at least one product"
510
+ #~ msgstr "Seleziona almeno un prodotto"
511
+
512
+ #~ msgid "Exclude product categories"
513
+ #~ msgstr "Escludi categorie di prodotti"
514
+
515
+ #~ msgid "Top"
516
+ #~ msgstr "Sopra"
517
+
518
+ #~ msgid "Bottom"
519
+ #~ msgstr "Sotto"
520
+
521
+ #~ msgid "Left"
522
+ #~ msgstr "Sinistra"
languages/yith-woocommerce-zoom-magnifier.pot CHANGED
@@ -1,401 +1,401 @@
1
- #, fuzzy
2
- msgid ""
3
- msgstr ""
4
- "Project-Id-Version: YITH WooCommerce Order Tracking\n"
5
- "POT-Creation-Date: 2016-06-13 16:57+0200\n"
6
- "PO-Revision-Date: 2015-04-22 12:25+0100\n"
7
- "Last-Translator: \n"
8
- "Language-Team: Your Inspiration Themes <plugins@yithemes.com>\n"
9
- "Language: en\n"
10
- "MIME-Version: 1.0\n"
11
- "Content-Type: text/plain; charset=UTF-8\n"
12
- "Content-Transfer-Encoding: 8bit\n"
13
- "X-Generator: Poedit 1.8.4\n"
14
- "X-Poedit-Basepath: ..\n"
15
- "Plural-Forms: nplurals=2; plural=n!=1;\n"
16
- "X-Poedit-KeywordsList: __ ;_e;_n:1,2;__ngettext:1,2;__ngettext_noop:1,2;"
17
- "_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2\n"
18
- "X-Poedit-SourceCharset: UTF-8\n"
19
- "X-Poedit-SearchPath-0: .\n"
20
- "X-Poedit-SearchPathExcluded-0: plugin-fw\n"
21
-
22
- #: class.yith-wcmg-admin.php:81
23
- msgid "Image Size"
24
- msgstr ""
25
-
26
- #: class.yith-wcmg-admin.php:82 plugin-options/general-options.php:17
27
- msgid "The size of the images used within the magnifier box"
28
- msgstr ""
29
-
30
- #: init.php:50
31
- msgid ""
32
- "YITH WooCommerce Zoom Magnifier is enabled but not effective. It requires "
33
- "WooCommerce in order to work."
34
- msgstr ""
35
-
36
- #: init.php:66
37
- msgid ""
38
- "You can't activate the free version of YITH WooCommerce Zoom Magnifier while "
39
- "you are using the premium one."
40
- msgstr ""
41
-
42
- #: lib/class.yith-ywzm-custom-types.php:159
43
- msgid "Do you want to hard crop the image?"
44
- msgstr ""
45
-
46
- #: lib/class.yith-ywzm-plugin-fw-loader.php:124
47
- msgid "General"
48
- msgstr ""
49
-
50
- #: lib/class.yith-ywzm-plugin-fw-loader.php:127
51
- #: lib/class.yith-ywzm-plugin-fw-loader.php:191
52
- msgid "Premium Version"
53
- msgstr ""
54
-
55
- #: lib/class.yith-ywzm-plugin-fw-loader.php:129
56
- msgid "Product exclusion list"
57
- msgstr ""
58
-
59
- #: lib/class.yith-ywzm-plugin-fw-loader.php:188
60
- msgid "Settings"
61
- msgstr ""
62
-
63
- #: lib/class.yith-ywzm-plugin-fw-loader.php:216
64
- msgid "Plugin Documentation"
65
- msgstr ""
66
-
67
- #: lib/class.yith-ywzm-plugin-fw-loader.php:229
68
- msgid ""
69
- "YITH WooCommerce Zoom Magnifier is available in an outstanding PREMIUM "
70
- "version with many new options, discover it now."
71
- msgstr ""
72
-
73
- #: lib/class.yith-ywzm-plugin-fw-loader.php:230
74
- msgid "Premium version"
75
- msgstr ""
76
-
77
- #: lib/class.yith-ywzm-plugin-fw-loader.php:237
78
- #: plugin-options/general-options.php:217
79
- msgid "YITH WooCommerce Zoom Magnifier"
80
- msgstr ""
81
-
82
- #: lib/class.yith-ywzm-plugin-fw-loader.php:238
83
- msgid ""
84
- "In YIT Plugins tab you can find YITH WooCommerce Zoom Magnifier options."
85
- "<br> From this menu you can access all settings of the YITH plugins "
86
- "activated."
87
- msgstr ""
88
-
89
- #: plugin-options/general-options.php:16
90
- msgid "Image size"
91
- msgstr ""
92
-
93
- #: plugin-options/general-options.php:36
94
- msgid "General Settings"
95
- msgstr ""
96
-
97
- #: plugin-options/general-options.php:42
98
- msgid "Activate YITH WooCommerce Zoom Magnifier"
99
- msgstr ""
100
-
101
- #: plugin-options/general-options.php:43
102
- msgid "Activate the plugin or use the WooCommerce default product image."
103
- msgstr ""
104
-
105
- #: plugin-options/general-options.php:50
106
- msgid "Activate on mobile device"
107
- msgstr ""
108
-
109
- #: plugin-options/general-options.php:51
110
- msgid ""
111
- "Set if zoom and slider functionalities should be shown also on mobile "
112
- "devices."
113
- msgstr ""
114
-
115
- #: plugin-options/general-options.php:59
116
- msgid "Forced Image Size"
117
- msgstr ""
118
-
119
- #: plugin-options/general-options.php:60
120
- msgid ""
121
- "If disabled, you will able to customize the sizes of the zoomed images. "
122
- "Disable it at your own risk; the magnifier could not properly work with "
123
- "images out of proportion."
124
- msgstr ""
125
-
126
- #: plugin-options/general-options.php:74
127
- msgid "Magnifier Settings"
128
- msgstr ""
129
-
130
- #: plugin-options/general-options.php:80
131
- msgid "Zoom Box Width"
132
- msgstr ""
133
-
134
- #: plugin-options/general-options.php:81
135
- msgid "The width of the magnifier box (default: auto)"
136
- msgstr ""
137
-
138
- #: plugin-options/general-options.php:88
139
- msgid "Zoom Box Height"
140
- msgstr ""
141
-
142
- #: plugin-options/general-options.php:89
143
- msgid "The height of the magnifier box (default: auto)"
144
- msgstr ""
145
-
146
- #: plugin-options/general-options.php:97
147
- msgid "Zoom Box Position"
148
- msgstr ""
149
-
150
- #: plugin-options/general-options.php:98
151
- msgid "The magnifier position"
152
- msgstr ""
153
-
154
- #: plugin-options/general-options.php:104
155
- msgid "Right"
156
- msgstr ""
157
-
158
- #: plugin-options/general-options.php:105
159
- #: plugin-options/general-options.php:117
160
- msgid "Inside"
161
- msgstr ""
162
-
163
- #: plugin-options/general-options.php:109
164
- msgid "Zoom Box Position for mobile devices"
165
- msgstr ""
166
-
167
- #: plugin-options/general-options.php:110
168
- msgid "The magnifier position for the mobile devices (iPhone, Android, etc.)"
169
- msgstr ""
170
-
171
- #: plugin-options/general-options.php:116
172
- msgid "Default"
173
- msgstr ""
174
-
175
- #: plugin-options/general-options.php:118
176
- msgid "Disable"
177
- msgstr ""
178
-
179
- #: plugin-options/general-options.php:122
180
- msgid "Loading label"
181
- msgstr ""
182
-
183
- #: plugin-options/general-options.php:125
184
- #: plugin-options/general-options.php:126
185
- msgid "Loading..."
186
- msgstr ""
187
-
188
- #: plugin-options/general-options.php:131
189
- msgid "Lens Opacity"
190
- msgstr ""
191
-
192
- #: plugin-options/general-options.php:142
193
- msgid "Blur"
194
- msgstr ""
195
-
196
- #: plugin-options/general-options.php:143
197
- msgid "Add a blur effect to the small image on mouse hover."
198
- msgstr ""
199
-
200
- #: plugin-options/general-options.php:154
201
- msgid "Slider Settings"
202
- msgstr ""
203
-
204
- #: plugin-options/general-options.php:160
205
- msgid "Activate Slider"
206
- msgstr ""
207
-
208
- #: plugin-options/general-options.php:161
209
- msgid "Activate Thumbnail Slider."
210
- msgstr ""
211
-
212
- #: plugin-options/general-options.php:168
213
- msgid "Activate Responsive Slider"
214
- msgstr ""
215
-
216
- #: plugin-options/general-options.php:169
217
- msgid ""
218
- "This option fits the thumbnails within the available space. Disable it if "
219
- "you want to manage freely the thumbnails (eg. add margins, paddings, etc.)"
220
- msgstr ""
221
-
222
- #: plugin-options/general-options.php:176
223
- msgid "Items"
224
- msgstr ""
225
-
226
- #: plugin-options/general-options.php:177
227
- msgid "Number of items to show"
228
- msgstr ""
229
-
230
- #: plugin-options/general-options.php:187
231
- msgid "Circular carousel"
232
- msgstr ""
233
-
234
- #: plugin-options/general-options.php:188
235
- msgid "It defines whether the carousel should be circular."
236
- msgstr ""
237
-
238
- #: plugin-options/general-options.php:195
239
- msgid "Infinite carousel"
240
- msgstr ""
241
-
242
- #: plugin-options/general-options.php:196
243
- msgid ""
244
- "It defines whether the carousel should be infinite. Note: It is possible to "
245
- "create a non-circular, infinite carousel, but it is not possible to create a "
246
- "circular, non-infinite carousel."
247
- msgstr ""
248
-
249
- #: plugin-options/general-options.php:214
250
- msgid "Upgrade to the PREMIUM VERSION"
251
- msgstr ""
252
-
253
- #: plugin-options/general-options.php:218
254
- msgid "Discover The Advanced Features"
255
- msgstr ""
256
-
257
- #: plugin-options/general-options.php:219
258
- msgid ""
259
- "Upgrade to the PREMIUM VERSION of YITH WOOCOMMERCE ZOOM MAGNIFIER to benefit "
260
- "from all features!"
261
- msgstr ""
262
-
263
- #: plugin-options/general-options.php:223
264
- msgid ""
265
- "See YITH WooCommerce Zoom Magnifier plugin with full premium features in "
266
- "action"
267
- msgstr ""
268
-
269
- #: plugin-options/general-options.php:225
270
- msgid "Get Support and Pro Features"
271
- msgstr ""
272
-
273
- #: plugin-options/general-options.php:226
274
- msgid ""
275
- "Purchasing the premium version of the plugin, you will take advantage of the "
276
- "advanced features of the product, and you will get one year of free updates "
277
- "and support through our platform available 24h/24."
278
- msgstr ""
279
-
280
- #: templates/admin/premium.php:193
281
- #, php-format
282
- msgid ""
283
- "Upgrade to the %1$s premium version %2$s of %1$s YITH WooCommerce Zoom "
284
- "Magnifier %2$s to benefit from all features!"
285
- msgstr ""
286
-
287
- #: templates/admin/premium.php:196
288
- #, php-format
289
- msgid "%1$sUPGRADE%2$s%3$sto the premium version%2$s"
290
- msgstr ""
291
-
292
- #: templates/admin/premium.php:202
293
- #, php-format
294
- msgid "%1$sPremium Features%2$s"
295
- msgstr ""
296
-
297
- #: templates/admin/premium.php:210
298
- msgid "ZOOM BOX POSITION"
299
- msgstr ""
300
-
301
- #: templates/admin/premium.php:213
302
- #, php-format
303
- msgid ""
304
- "Choose where you want to show the %1$szoomed version%2$s of the image of "
305
- "your products. Place it above or below the original image, on its left or "
306
- "its right, or you can even place it over it.$2$s"
307
- msgstr ""
308
-
309
- #: templates/admin/premium.php:223
310
- msgid "ENLARGE THE IMAGES"
311
- msgstr ""
312
-
313
- #: templates/admin/premium.php:225
314
- msgid ""
315
- "Just one click and the product image will appear in a bigger size in a modal "
316
- "window. A further chance to let users analyze in a better way what you sell."
317
- msgstr ""
318
-
319
- #: templates/admin/premium.php:240
320
- msgid "EXCLUDE PRODUCTS"
321
- msgstr ""
322
-
323
- #: templates/admin/premium.php:242
324
- msgid ""
325
- "Tailored options to limit the plugin features only to certain products. Some "
326
- "of these could have too small images to be zoomed, or maybe being part of "
327
- "categories that do not imply zoomed images. Select the products and the "
328
- "categories to exclude and delete all your problems"
329
- msgstr ""
330
-
331
- #: templates/admin/premium.php:251
332
- #, php-format
333
- msgid ""
334
- "Upgrade to the %1$spremium version%2$s of %1$sYITH WooCommerce Zoom Magnifier"
335
- "%2$s to benefit from all features!"
336
- msgstr ""
337
-
338
- #: templates/admin/premium.php:254
339
- #, php-format
340
- msgid "%1$sUPGRADE%2$s %3$sto the premium version%2$s"
341
- msgstr ""
342
-
343
- #: yit-common/yith-panel.php:429
344
- msgid "Select a date"
345
- msgstr ""
346
-
347
- #: yit-common/yith-panel.php:430
348
- msgid "Hours"
349
- msgstr ""
350
-
351
- #: yit-common/yith-panel.php:431 yit-common/yith-panel.php:432
352
- msgid "Minutes"
353
- msgstr ""
354
-
355
- #: yit-common/yith-panel.php:440
356
- msgid "Upload"
357
- msgstr ""
358
-
359
- #: yit-common/yith-panel.php:477
360
- msgid "px"
361
- msgstr ""
362
-
363
- #: yit-common/yith-panel.php:479
364
- msgid "em"
365
- msgstr ""
366
-
367
- #: yit-common/yith-panel.php:481
368
- msgid "pt"
369
- msgstr ""
370
-
371
- #: yit-common/yith-panel.php:483
372
- msgid "rem"
373
- msgstr ""
374
-
375
- #: yit-common/yith-panel.php:495
376
- msgid "Select a font family"
377
- msgstr ""
378
-
379
- #: yit-common/yith-panel.php:505
380
- msgid "Regular"
381
- msgstr ""
382
-
383
- #: yit-common/yith-panel.php:507
384
- msgid "Bold"
385
- msgstr ""
386
-
387
- #: yit-common/yith-panel.php:509
388
- msgid "Extra bold"
389
- msgstr ""
390
-
391
- #: yit-common/yith-panel.php:511
392
- msgid "Italic"
393
- msgstr ""
394
-
395
- #: yit-common/yith-panel.php:513
396
- msgid "Italic bold"
397
- msgstr ""
398
-
399
- #: yit-common/yith-panel.php:529
400
- msgid "Click to preview"
401
- msgstr ""
1
+ #, fuzzy
2
+ msgid ""
3
+ msgstr ""
4
+ "Project-Id-Version: YITH WooCommerce Order Tracking\n"
5
+ "POT-Creation-Date: 2016-06-13 16:57+0200\n"
6
+ "PO-Revision-Date: 2015-04-22 12:25+0100\n"
7
+ "Last-Translator: \n"
8
+ "Language-Team: Your Inspiration Themes <plugins@yithemes.com>\n"
9
+ "Language: en\n"
10
+ "MIME-Version: 1.0\n"
11
+ "Content-Type: text/plain; charset=UTF-8\n"
12
+ "Content-Transfer-Encoding: 8bit\n"
13
+ "X-Generator: Poedit 1.8.4\n"
14
+ "X-Poedit-Basepath: ..\n"
15
+ "Plural-Forms: nplurals=2; plural=n!=1;\n"
16
+ "X-Poedit-KeywordsList: __ ;_e;_n:1,2;__ngettext:1,2;__ngettext_noop:1,2;"
17
+ "_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2\n"
18
+ "X-Poedit-SourceCharset: UTF-8\n"
19
+ "X-Poedit-SearchPath-0: .\n"
20
+ "X-Poedit-SearchPathExcluded-0: plugin-fw\n"
21
+
22
+ #: class.yith-wcmg-admin.php:81
23
+ msgid "Image Size"
24
+ msgstr ""
25
+
26
+ #: class.yith-wcmg-admin.php:82 plugin-options/general-options.php:17
27
+ msgid "The size of the images used within the magnifier box"
28
+ msgstr ""
29
+
30
+ #: init.php:50
31
+ msgid ""
32
+ "YITH WooCommerce Zoom Magnifier is enabled but not effective. It requires "
33
+ "WooCommerce in order to work."
34
+ msgstr ""
35
+
36
+ #: init.php:66
37
+ msgid ""
38
+ "You can't activate the free version of YITH WooCommerce Zoom Magnifier while "
39
+ "you are using the premium one."
40
+ msgstr ""
41
+
42
+ #: lib/class.yith-ywzm-custom-types.php:159
43
+ msgid "Do you want to hard crop the image?"
44
+ msgstr ""
45
+
46
+ #: lib/class.yith-ywzm-plugin-fw-loader.php:124
47
+ msgid "General"
48
+ msgstr ""
49
+
50
+ #: lib/class.yith-ywzm-plugin-fw-loader.php:127
51
+ #: lib/class.yith-ywzm-plugin-fw-loader.php:191
52
+ msgid "Premium Version"
53
+ msgstr ""
54
+
55
+ #: lib/class.yith-ywzm-plugin-fw-loader.php:129
56
+ msgid "Product exclusion list"
57
+ msgstr ""
58
+
59
+ #: lib/class.yith-ywzm-plugin-fw-loader.php:188
60
+ msgid "Settings"
61
+ msgstr ""
62
+
63
+ #: lib/class.yith-ywzm-plugin-fw-loader.php:216
64
+ msgid "Plugin Documentation"
65
+ msgstr ""
66
+
67
+ #: lib/class.yith-ywzm-plugin-fw-loader.php:229
68
+ msgid ""
69
+ "YITH WooCommerce Zoom Magnifier is available in an outstanding PREMIUM "
70
+ "version with many new options, discover it now."
71
+ msgstr ""
72
+
73
+ #: lib/class.yith-ywzm-plugin-fw-loader.php:230
74
+ msgid "Premium version"
75
+ msgstr ""
76
+
77
+ #: lib/class.yith-ywzm-plugin-fw-loader.php:237
78
+ #: plugin-options/general-options.php:217
79
+ msgid "YITH WooCommerce Zoom Magnifier"
80
+ msgstr ""
81
+
82
+ #: lib/class.yith-ywzm-plugin-fw-loader.php:238
83
+ msgid ""
84
+ "In YIT Plugins tab you can find YITH WooCommerce Zoom Magnifier options."
85
+ "<br> From this menu you can access all settings of the YITH plugins "
86
+ "activated."
87
+ msgstr ""
88
+
89
+ #: plugin-options/general-options.php:16
90
+ msgid "Image size"
91
+ msgstr ""
92
+
93
+ #: plugin-options/general-options.php:36
94
+ msgid "General Settings"
95
+ msgstr ""
96
+
97
+ #: plugin-options/general-options.php:42
98
+ msgid "Activate YITH WooCommerce Zoom Magnifier"
99
+ msgstr ""
100
+
101
+ #: plugin-options/general-options.php:43
102
+ msgid "Activate the plugin or use the WooCommerce default product image."
103
+ msgstr ""
104
+
105
+ #: plugin-options/general-options.php:50
106
+ msgid "Activate on mobile device"
107
+ msgstr ""
108
+
109
+ #: plugin-options/general-options.php:51
110
+ msgid ""
111
+ "Set if zoom and slider functionalities should be shown also on mobile "
112
+ "devices."
113
+ msgstr ""
114
+
115
+ #: plugin-options/general-options.php:59
116
+ msgid "Forced Image Size"
117
+ msgstr ""
118
+
119
+ #: plugin-options/general-options.php:60
120
+ msgid ""
121
+ "If disabled, you will able to customize the sizes of the zoomed images. "
122
+ "Disable it at your own risk; the magnifier could not properly work with "
123
+ "images out of proportion."
124
+ msgstr ""
125
+
126
+ #: plugin-options/general-options.php:74
127
+ msgid "Magnifier Settings"
128
+ msgstr ""
129
+
130
+ #: plugin-options/general-options.php:80
131
+ msgid "Zoom Box Width"
132
+ msgstr ""
133
+
134
+ #: plugin-options/general-options.php:81
135
+ msgid "The width of the magnifier box (default: auto)"
136
+ msgstr ""
137
+
138
+ #: plugin-options/general-options.php:88
139
+ msgid "Zoom Box Height"
140
+ msgstr ""
141
+
142
+ #: plugin-options/general-options.php:89
143
+ msgid "The height of the magnifier box (default: auto)"
144
+ msgstr ""
145
+
146
+ #: plugin-options/general-options.php:97
147
+ msgid "Zoom Box Position"
148
+ msgstr ""
149
+
150
+ #: plugin-options/general-options.php:98
151
+ msgid "The magnifier position"
152
+ msgstr ""
153
+
154
+ #: plugin-options/general-options.php:104
155
+ msgid "Right"
156
+ msgstr ""
157
+
158
+ #: plugin-options/general-options.php:105
159
+ #: plugin-options/general-options.php:117
160
+ msgid "Inside"
161
+ msgstr ""
162
+
163
+ #: plugin-options/general-options.php:109
164
+ msgid "Zoom Box Position for mobile devices"
165
+ msgstr ""
166
+
167
+ #: plugin-options/general-options.php:110
168
+ msgid "The magnifier position for the mobile devices (iPhone, Android, etc.)"
169
+ msgstr ""
170
+
171
+ #: plugin-options/general-options.php:116
172
+ msgid "Default"
173
+ msgstr ""
174
+
175
+ #: plugin-options/general-options.php:118
176
+ msgid "Disable"
177
+ msgstr ""
178
+
179
+ #: plugin-options/general-options.php:122
180
+ msgid "Loading label"
181
+ msgstr ""
182
+
183
+ #: plugin-options/general-options.php:125
184
+ #: plugin-options/general-options.php:126
185
+ msgid "Loading..."
186
+ msgstr ""
187
+
188
+ #: plugin-options/general-options.php:131
189
+ msgid "Lens Opacity"
190
+ msgstr ""
191
+
192
+ #: plugin-options/general-options.php:142
193
+ msgid "Blur"
194
+ msgstr ""
195
+
196
+ #: plugin-options/general-options.php:143
197
+ msgid "Add a blur effect to the small image on mouse hover."
198
+ msgstr ""
199
+
200
+ #: plugin-options/general-options.php:154
201
+ msgid "Slider Settings"
202
+ msgstr ""
203
+
204
+ #: plugin-options/general-options.php:160
205
+ msgid "Activate Slider"
206
+ msgstr ""
207
+
208
+ #: plugin-options/general-options.php:161
209
+ msgid "Activate Thumbnail Slider."
210
+ msgstr ""
211
+
212
+ #: plugin-options/general-options.php:168
213
+ msgid "Activate Responsive Slider"
214
+ msgstr ""
215
+
216
+ #: plugin-options/general-options.php:169
217
+ msgid ""
218
+ "This option fits the thumbnails within the available space. Disable it if "
219
+ "you want to manage freely the thumbnails (eg. add margins, paddings, etc.)"
220
+ msgstr ""
221
+
222
+ #: plugin-options/general-options.php:176
223
+ msgid "Items"
224
+ msgstr ""
225
+
226
+ #: plugin-options/general-options.php:177
227
+ msgid "Number of items to show"
228
+ msgstr ""
229
+
230
+ #: plugin-options/general-options.php:187
231
+ msgid "Circular carousel"
232
+ msgstr ""
233
+
234
+ #: plugin-options/general-options.php:188
235
+ msgid "It defines whether the carousel should be circular."
236
+ msgstr ""
237
+
238
+ #: plugin-options/general-options.php:195
239
+ msgid "Infinite carousel"
240
+ msgstr ""
241
+
242
+ #: plugin-options/general-options.php:196
243
+ msgid ""
244
+ "It defines whether the carousel should be infinite. Note: It is possible to "
245
+ "create a non-circular, infinite carousel, but it is not possible to create a "
246
+ "circular, non-infinite carousel."
247
+ msgstr ""
248
+
249
+ #: plugin-options/general-options.php:214
250
+ msgid "Upgrade to the PREMIUM VERSION"
251
+ msgstr ""
252
+
253
+ #: plugin-options/general-options.php:218
254
+ msgid "Discover The Advanced Features"
255
+ msgstr ""
256
+
257
+ #: plugin-options/general-options.php:219
258
+ msgid ""
259
+ "Upgrade to the PREMIUM VERSION of YITH WOOCOMMERCE ZOOM MAGNIFIER to benefit "
260
+ "from all features!"
261
+ msgstr ""
262
+
263
+ #: plugin-options/general-options.php:223
264
+ msgid ""
265
+ "See YITH WooCommerce Zoom Magnifier plugin with full premium features in "
266
+ "action"
267
+ msgstr ""
268
+
269
+ #: plugin-options/general-options.php:225
270
+ msgid "Get Support and Pro Features"
271
+ msgstr ""
272
+
273
+ #: plugin-options/general-options.php:226
274
+ msgid ""
275
+ "Purchasing the premium version of the plugin, you will take advantage of the "
276
+ "advanced features of the product, and you will get one year of free updates "
277
+ "and support through our platform available 24h/24."
278
+ msgstr ""
279
+
280
+ #: templates/admin/premium.php:193
281
+ #, php-format
282
+ msgid ""
283
+ "Upgrade to the %1$s premium version %2$s of %1$s YITH WooCommerce Zoom "
284
+ "Magnifier %2$s to benefit from all features!"
285
+ msgstr ""
286
+
287
+ #: templates/admin/premium.php:196
288
+ #, php-format
289
+ msgid "%1$sUPGRADE%2$s%3$sto the premium version%2$s"
290
+ msgstr ""
291
+
292
+ #: templates/admin/premium.php:202
293
+ #, php-format
294
+ msgid "%1$sPremium Features%2$s"
295
+ msgstr ""
296
+
297
+ #: templates/admin/premium.php:210
298
+ msgid "ZOOM BOX POSITION"
299
+ msgstr ""
300
+
301
+ #: templates/admin/premium.php:213
302
+ #, php-format
303
+ msgid ""
304
+ "Choose where you want to show the %1$szoomed version%2$s of the image of "
305
+ "your products. Place it above or below the original image, on its left or "
306
+ "its right, or you can even place it over it.$2$s"
307
+ msgstr ""
308
+
309
+ #: templates/admin/premium.php:223
310
+ msgid "ENLARGE THE IMAGES"
311
+ msgstr ""
312
+
313
+ #: templates/admin/premium.php:225
314
+ msgid ""
315
+ "Just one click and the product image will appear in a bigger size in a modal "
316
+ "window. A further chance to let users analyze in a better way what you sell."
317
+ msgstr ""
318
+
319
+ #: templates/admin/premium.php:240
320
+ msgid "EXCLUDE PRODUCTS"
321
+ msgstr ""
322
+
323
+ #: templates/admin/premium.php:242
324
+ msgid ""
325
+ "Tailored options to limit the plugin features only to certain products. Some "
326
+ "of these could have too small images to be zoomed, or maybe being part of "
327
+ "categories that do not imply zoomed images. Select the products and the "
328
+ "categories to exclude and delete all your problems"
329
+ msgstr ""
330
+
331
+ #: templates/admin/premium.php:251
332
+ #, php-format
333
+ msgid ""
334
+ "Upgrade to the %1$spremium version%2$s of %1$sYITH WooCommerce Zoom Magnifier"
335
+ "%2$s to benefit from all features!"
336
+ msgstr ""
337
+
338
+ #: templates/admin/premium.php:254
339
+ #, php-format
340
+ msgid "%1$sUPGRADE%2$s %3$sto the premium version%2$s"
341
+ msgstr ""
342
+
343
+ #: yit-common/yith-panel.php:429
344
+ msgid "Select a date"
345
+ msgstr ""
346
+
347
+ #: yit-common/yith-panel.php:430
348
+ msgid "Hours"
349
+ msgstr ""
350
+
351
+ #: yit-common/yith-panel.php:431 yit-common/yith-panel.php:432
352
+ msgid "Minutes"
353
+ msgstr ""
354
+
355
+ #: yit-common/yith-panel.php:440
356
+ msgid "Upload"
357
+ msgstr ""
358
+
359
+ #: yit-common/yith-panel.php:477
360
+ msgid "px"
361
+ msgstr ""
362
+
363
+ #: yit-common/yith-panel.php:479
364
+ msgid "em"
365
+ msgstr ""
366
+
367
+ #: yit-common/yith-panel.php:481
368
+ msgid "pt"
369
+ msgstr ""
370
+
371
+ #: yit-common/yith-panel.php:483
372
+ msgid "rem"
373
+ msgstr ""
374
+
375
+ #: yit-common/yith-panel.php:495
376
+ msgid "Select a font family"
377
+ msgstr ""
378
+
379
+ #: yit-common/yith-panel.php:505
380
+ msgid "Regular"
381
+ msgstr ""
382
+
383
+ #: yit-common/yith-panel.php:507
384
+ msgid "Bold"
385
+ msgstr ""
386
+
387
+ #: yit-common/yith-panel.php:509
388
+ msgid "Extra bold"
389
+ msgstr ""
390
+
391
+ #: yit-common/yith-panel.php:511
392
+ msgid "Italic"
393
+ msgstr ""
394
+
395
+ #: yit-common/yith-panel.php:513
396
+ msgid "Italic bold"
397
+ msgstr ""
398
+
399
+ #: yit-common/yith-panel.php:529
400
+ msgid "Click to preview"
401
+ msgstr ""
lib/class.yith-woocommerce-zoom-magnifier.php CHANGED
@@ -1,167 +1,167 @@
1
- <?php
2
- /**
3
- * Main class
4
- *
5
- * @author Your Inspiration Themes
6
- * @package YITH WooCommerce Zoom Magnifier
7
- * @version 1.1.2
8
- */
9
-
10
- if ( ! defined( 'ABSPATH' ) ) {
11
- exit;
12
- } // Exit if accessed directly
13
-
14
-
15
- if ( ! class_exists( 'YITH_WooCommerce_Zoom_Magnifier' ) ) {
16
- /**
17
- * YITH WooCommerce Zoom Magnifier
18
- *
19
- * @since 1.0.0
20
- */
21
- class YITH_WooCommerce_Zoom_Magnifier {
22
-
23
- /**
24
- * Plugin object
25
- *
26
- * @var string
27
- * @since 1.0.0
28
- */
29
- public $obj = null;
30
-
31
- /**
32
- * @var string Premium version landing link
33
- */
34
- protected $_premium_landing = 'http://yithemes.com/themes/plugins/yith-woocommerce-zoom-magnifier/';
35
-
36
- /**
37
- * @var string Plugin official documentation
38
- */
39
- protected $_official_documentation = 'https://docs.yithemes.com/yith-woocommerce-zoom-magnifier/';
40
-
41
- /**
42
- * @var string Plugin panel page
43
- */
44
- protected $_panel_page = 'yith_woocommerce_zoom-magnifier_panel';
45
-
46
- /**
47
- * Constructor
48
- *
49
- * @return mixed|YITH_WCMG_Admin|YITH_WCMG_Frontend
50
- * @since 1.0.0
51
- */
52
- public function __construct() {
53
- /** Stop the plugin on mobile devices */
54
- if ( ( 'yes' != get_option( 'yith_wcmg_enable_mobile' ) ) && wp_is_mobile() ) {
55
- return;
56
- }
57
-
58
- add_action( 'wp_ajax_nopriv_yith_wc_zoom_magnifier_get_main_image', array(
59
- $this,
60
- 'yith_wc_zoom_magnifier_get_main_image_call_back'
61
- ), 10 );
62
-
63
- add_action( 'wp_ajax_yith_wc_zoom_magnifier_get_main_image', array(
64
- $this,
65
- 'yith_wc_zoom_magnifier_get_main_image_call_back'
66
- ), 10 );
67
-
68
- // actions
69
- add_action( 'init', array( $this, 'init' ) );
70
-
71
- if ( is_admin() && ( ! isset( $_REQUEST['action'] ) || ( isset( $_REQUEST['action'] ) && $_REQUEST['action'] != 'yith_load_product_quick_view' ) ) ) {
72
- $this->obj = new YITH_WCMG_Admin( );
73
- } else {
74
- $this->obj = new YITH_WCMG_Frontend( );
75
- }
76
-
77
- return $this->obj;
78
- }
79
-
80
- /**
81
- * Ajax method to retrieve the product main imavge
82
- *
83
- * @access public
84
- * @author Daniel Sanchez Saez
85
- * @since 1.3.3
86
- */
87
- public function yith_wc_zoom_magnifier_get_main_image_call_back(){
88
-
89
- $product_id = ( isset( $_POST[ 'product_id' ] ) ? $_POST[ 'product_id' ] : 0 );
90
-
91
- $url = wp_get_attachment_image_src ( get_post_thumbnail_id ( $product_id ), "full" );
92
-
93
- $response = array(
94
- "url" => $url[ 0 ],
95
- );
96
- wp_send_json( $response );
97
-
98
- }
99
-
100
- /**
101
- * Init method:
102
- * - default options
103
- *
104
- * @access public
105
- * @since 1.0.0
106
- */
107
- public function init() {
108
-
109
- $this->_image_sizes();
110
-
111
- /* === Show Plugin Information === */
112
-
113
- add_filter( 'plugin_action_links_' . plugin_basename( YITH_YWZM_DIR . '/' . basename( YITH_YWZM_FILE ) ), array( $this, 'action_links' ) );
114
-
115
- add_filter( 'yith_show_plugin_row_meta', array( $this, 'plugin_row_meta' ), 10, 5 );
116
-
117
- }
118
-
119
-
120
- /**
121
- * Add image sizes
122
- *
123
- * Init images
124
- *
125
- * @access protected
126
- * @return void
127
- * @since 1.0.0
128
- */
129
- protected function _image_sizes() {
130
- $size = get_option( 'woocommerce_magnifier_image' );
131
- $width = $size['width'];
132
- $height = $size['height'];
133
- $crop = isset( $size['crop'] ) ? true : false;
134
-
135
- add_image_size( 'shop_magnifier', $width, $height, $crop );
136
- }
137
-
138
- /**
139
- * Action links
140
- *
141
- *
142
- * @return void
143
- * @since 1.3.5
144
- * @author Daniel Sanchez <daniel.sanchez@yithemes.com>
145
- */
146
- public function action_links( $links ) {
147
- $links = yith_add_action_links( $links, $this->_panel_page, false );
148
- return $links;
149
- }
150
- /**
151
- * Plugin Row Meta
152
- *
153
- *
154
- * @return void
155
- * @since 1.3.5
156
- * @author Daniel Sanchez <daniel.sanchez@yithemes.com>
157
- */
158
- public function plugin_row_meta( $new_row_meta_args, $plugin_meta, $plugin_file, $plugin_data, $status, $init_file = 'YITH_YWZM_FREE_INIT' ) {
159
- if ( defined( $init_file ) && constant( $init_file ) == $plugin_file ) {
160
- $new_row_meta_args['slug'] = YITH_YWZM_SLUG;
161
- }
162
-
163
- return $new_row_meta_args;
164
- }
165
-
166
- }
167
  }
1
+ <?php
2
+ /**
3
+ * Main class
4
+ *
5
+ * @author Your Inspiration Themes
6
+ * @package YITH WooCommerce Zoom Magnifier
7
+ * @version 1.1.2
8
+ */
9
+
10
+ if ( ! defined( 'ABSPATH' ) ) {
11
+ exit;
12
+ } // Exit if accessed directly
13
+
14
+
15
+ if ( ! class_exists( 'YITH_WooCommerce_Zoom_Magnifier' ) ) {
16
+ /**
17
+ * YITH WooCommerce Zoom Magnifier
18
+ *
19
+ * @since 1.0.0
20
+ */
21
+ class YITH_WooCommerce_Zoom_Magnifier {
22
+
23
+ /**
24
+ * Plugin object
25
+ *
26
+ * @var string
27
+ * @since 1.0.0
28
+ */
29
+ public $obj = null;
30
+
31
+ /**
32
+ * @var string Premium version landing link
33
+ */
34
+ protected $_premium_landing = 'http://yithemes.com/themes/plugins/yith-woocommerce-zoom-magnifier/';
35
+
36
+ /**
37
+ * @var string Plugin official documentation
38
+ */
39
+ protected $_official_documentation = 'https://docs.yithemes.com/yith-woocommerce-zoom-magnifier/';
40
+
41
+ /**
42
+ * @var string Plugin panel page
43
+ */
44
+ protected $_panel_page = 'yith_woocommerce_zoom-magnifier_panel';
45
+
46
+ /**
47
+ * Constructor
48
+ *
49
+ * @return mixed|YITH_WCMG_Admin|YITH_WCMG_Frontend
50
+ * @since 1.0.0
51
+ */
52
+ public function __construct() {
53
+ /** Stop the plugin on mobile devices */
54
+ if ( ( 'yes' != get_option( 'yith_wcmg_enable_mobile' ) ) && wp_is_mobile() ) {
55
+ return;
56
+ }
57
+
58
+ add_action( 'wp_ajax_nopriv_yith_wc_zoom_magnifier_get_main_image', array(
59
+ $this,
60
+ 'yith_wc_zoom_magnifier_get_main_image_call_back'
61
+ ), 10 );
62
+
63
+ add_action( 'wp_ajax_yith_wc_zoom_magnifier_get_main_image', array(
64
+ $this,
65
+ 'yith_wc_zoom_magnifier_get_main_image_call_back'
66
+ ), 10 );
67
+
68
+ // actions
69
+ add_action( 'init', array( $this, 'init' ) );
70
+
71
+ if ( is_admin() && ( ! isset( $_REQUEST['action'] ) || ( isset( $_REQUEST['action'] ) && $_REQUEST['action'] != 'yith_load_product_quick_view' ) ) ) {
72
+ $this->obj = new YITH_WCMG_Admin( );
73
+ } else {
74
+ $this->obj = new YITH_WCMG_Frontend( );
75
+ }
76
+
77
+ return $this->obj;
78
+ }
79
+
80
+ /**
81
+ * Ajax method to retrieve the product main imavge
82
+ *
83
+ * @access public
84
+ * @author Daniel Sanchez Saez
85
+ * @since 1.3.3
86
+ */
87
+ public function yith_wc_zoom_magnifier_get_main_image_call_back(){
88
+
89
+ $product_id = ( isset( $_POST[ 'product_id' ] ) ? $_POST[ 'product_id' ] : 0 );
90
+
91
+ $url = wp_get_attachment_image_src ( get_post_thumbnail_id ( $product_id ), "full" );
92
+
93
+ $response = array(
94
+ "url" => $url[ 0 ],
95
+ );
96
+ wp_send_json( $response );
97
+
98
+ }
99
+
100
+ /**
101
+ * Init method:
102
+ * - default options
103
+ *
104
+ * @access public
105
+ * @since 1.0.0
106
+ */
107
+ public function init() {
108
+
109
+ $this->_image_sizes();
110
+
111
+ /* === Show Plugin Information === */
112
+
113
+ add_filter( 'plugin_action_links_' . plugin_basename( YITH_YWZM_DIR . '/' . basename( YITH_YWZM_FILE ) ), array( $this, 'action_links' ) );
114
+
115
+ add_filter( 'yith_show_plugin_row_meta', array( $this, 'plugin_row_meta' ), 10, 5 );
116
+
117
+ }
118
+
119
+
120
+ /**
121
+ * Add image sizes
122
+ *
123
+ * Init images
124
+ *
125
+ * @access protected
126
+ * @return void
127
+ * @since 1.0.0
128
+ */
129
+ protected function _image_sizes() {
130
+ $size = get_option( 'woocommerce_magnifier_image' );
131
+ $width = $size['width'];
132
+ $height = $size['height'];
133
+ $crop = isset( $size['crop'] ) ? true : false;
134
+
135
+ add_image_size( 'shop_magnifier', $width, $height, $crop );
136
+ }
137
+
138
+ /**
139
+ * Action links
140
+ *
141
+ *
142
+ * @return void
143
+ * @since 1.3.5
144
+ * @author Daniel Sanchez <daniel.sanchez@yithemes.com>
145
+ */
146
+ public function action_links( $links ) {
147
+ $links = yith_add_action_links( $links, $this->_panel_page, false );
148
+ return $links;
149
+ }
150
+ /**
151
+ * Plugin Row Meta
152
+ *
153
+ *
154
+ * @return void
155
+ * @since 1.3.5
156
+ * @author Daniel Sanchez <daniel.sanchez@yithemes.com>
157
+ */
158
+ public function plugin_row_meta( $new_row_meta_args, $plugin_meta, $plugin_file, $plugin_data, $status, $init_file = 'YITH_YWZM_FREE_INIT' ) {
159
+ if ( defined( $init_file ) && constant( $init_file ) == $plugin_file ) {
160
+ $new_row_meta_args['slug'] = YITH_YWZM_SLUG;
161
+ }
162
+
163
+ return $new_row_meta_args;
164
+ }
165
+
166
+ }
167
  }
lib/class.yith-ywzm-custom-types.php CHANGED
@@ -1,181 +1,181 @@
1
- <?php
2
- if (!defined('ABSPATH')) {
3
- exit; // Exit if accessed directly
4
- }
5
-
6
- if (!class_exists('YITH_YWZM_Custom_Types')) {
7
-
8
- /**
9
- * custom types fields
10
- *
11
- * @class YITH_YWZM_Custom_Types
12
- * @package Yithemes
13
- * @since 1.0.0
14
- * @author Your Inspiration Themes
15
- */
16
- class YITH_YWZM_Custom_Types
17
- {
18
-
19
- /**
20
- * Single instance of the class
21
- *
22
- * @since 1.0.0
23
- */
24
- protected static $instance;
25
-
26
- /**
27
- * Returns single instance of the class
28
- *
29
- * @since 1.0.0
30
- */
31
- public static function get_instance()
32
- {
33
- if (is_null(self::$instance)) {
34
- self::$instance = new self();
35
- }
36
-
37
- return self::$instance;
38
- }
39
-
40
- public function __construct()
41
- {
42
- /**
43
- * Register actions and filters for custom types used on the current plugin
44
- */
45
-
46
- /** Custom types : slider */
47
- add_action('woocommerce_admin_field_slider', array($this, 'admin_fields_slider'));
48
-
49
- add_action('woocommerce_admin_field_yith_ywzm_image_width', array(
50
- $this,
51
- 'admin_fields_yith_ywzm_image_width'
52
- ));
53
- }
54
-
55
- /**
56
- * Create new Woocommerce admin field: slider
57
- *
58
- * @access public
59
- *
60
- * @param array $value
61
- *
62
- * @return void
63
- * @since 1.0.0
64
- */
65
- public function admin_fields_slider($value)
66
- {
67
- $slider_value = (get_option($value['id']) !== false && get_option($value['id']) !== null) ?
68
- esc_attr(stripslashes(get_option($value['id']))) :
69
- esc_attr($value['std']);
70
-
71
- ?>
72
- <tr valign="top">
73
- <th scope="row" class="titledesc">
74
- <label for="<?php echo esc_attr($value['id']); ?>"><?php echo $value['name']; ?></label>
75
- </th>
76
- <td class="forminp">
77
- <div id="<?php echo esc_attr($value['id']); ?>_slider" class="yith_woocommerce_slider"
78
- style="width: 300px; float: left;"></div>
79
- <div id="<?php echo esc_attr($value['id']); ?>_value"
80
- class="yith_woocommerce_slider_value ui-state-default ui-corner-all"><?php echo $slider_value ?></div>
81
- <input name="<?php echo esc_attr($value['id']); ?>" id="<?php echo esc_attr($value['id']); ?>"
82
- type="hidden" value="<?php echo $slider_value ?>"/> <?php echo $value['desc']; ?>
83
- </td>
84
- </tr>
85
-
86
-
87
- <script>
88
- jQuery(document).ready(function ($) {
89
- $('#<?php echo esc_attr( $value['id'] ); ?>_slider').slider({
90
- min: <?php echo $value['min'] ?>,
91
- max: <?php echo $value['max'] ?>,
92
- step: <?php echo $value['step'] ?>,
93
- value: <?php echo $slider_value ?>,
94
- slide: function (event, ui) {
95
- $("#<?php echo esc_attr( $value['id'] ); ?>").val(ui.value);
96
- $("#<?php echo esc_attr( $value['id'] ); ?>_value").text(ui.value);
97
- }
98
- });
99
- });
100
- </script>
101
-
102
- <?php
103
- }
104
-
105
- /**
106
- * Save the admin field: slider
107
- *
108
- * @access public
109
- *
110
- * @param mixed $value
111
- *
112
- * @return void
113
- * @since 1.0.0
114
- */
115
- public function admin_update_option($value)
116
- {
117
- global $woocommerce;
118
-
119
- if (version_compare(preg_replace('/-beta-([0-9]+)/', '', $woocommerce->version), '2.1', '<')) {
120
- $wc_clean = 'woocommerce_clean';
121
- } else {
122
- $wc_clean = 'wc_clean';
123
- }
124
-
125
- update_option($value['id'], $wc_clean($_POST[$value['id']]));
126
- }
127
-
128
-
129
- /**
130
- * Create new Woocommerce admin field: yith_ywzm_image_width
131
- *
132
- * @access public
133
- * @param array $value
134
- * @return void
135
- * @since 1.1.3
136
- */
137
- public function admin_fields_yith_ywzm_image_width($value)
138
- {
139
-
140
- $width = WC_Admin_Settings::get_option($value['id'] . '[width]', $value['default']['width']);
141
- $height = WC_Admin_Settings::get_option($value['id'] . '[height]', $value['default']['height']);
142
- $crop = WC_Admin_Settings::get_option($value['id'] . '[crop]');
143
- $crop = ($crop == 'on' || $crop == '1') ? 1 : 0;
144
- $crop = checked(1, $crop, false);
145
-
146
- ?>
147
- <tr valign="top">
148
- <th scope="row" class="titledesc"><?php echo esc_html($value['title']) ?></th>
149
- <td class="forminp image_width_settings">
150
- <input name="<?php echo esc_attr($value['id']); ?>[width]"
151
- id="<?php echo esc_attr($value['id']); ?>-width" type="text" size="3"
152
- value="<?php echo $width; ?>"/> &times; <input
153
- name="<?php echo esc_attr($value['id']); ?>[height]"
154
- id="<?php echo esc_attr($value['id']); ?>-height" type="text" size="3"
155
- value="<?php echo $height; ?>"/>px <span class="description"><?php echo $value['desc'] ?></span>
156
- <br>
157
- <label><input name="<?php echo esc_attr($value['id']); ?>[crop]"
158
- id="<?php echo esc_attr($value['id']); ?>-crop"
159
- type="checkbox" <?php echo $crop; ?> /> <?php _e('Do you want to hard crop the image?', 'woocommerce'); ?>
160
- </label>
161
-
162
- </td>
163
- </tr><?php
164
-
165
- }
166
-
167
- /**
168
- * Update plugin options.
169
- *
170
- * @return void
171
- * @since 1.0.0
172
- */
173
- public function update_options()
174
- {
175
- foreach ($this->options as $option) {
176
- woocommerce_update_options($option);
177
- }
178
- }
179
-
180
- }
181
  }
1
+ <?php
2
+ if (!defined('ABSPATH')) {
3
+ exit; // Exit if accessed directly
4
+ }
5
+
6
+ if (!class_exists('YITH_YWZM_Custom_Types')) {
7
+
8
+ /**
9
+ * custom types fields
10
+ *
11
+ * @class YITH_YWZM_Custom_Types
12
+ * @package Yithemes
13
+ * @since 1.0.0
14
+ * @author Your Inspiration Themes
15
+ */
16
+ class YITH_YWZM_Custom_Types
17
+ {
18
+
19
+ /**
20
+ * Single instance of the class
21
+ *
22
+ * @since 1.0.0
23
+ */
24
+ protected static $instance;
25
+
26
+ /**
27
+ * Returns single instance of the class
28
+ *
29
+ * @since 1.0.0
30
+ */
31
+ public static function get_instance()
32
+ {
33
+ if (is_null(self::$instance)) {
34
+ self::$instance = new self();
35
+ }
36
+
37
+ return self::$instance;
38
+ }
39
+
40
+ public function __construct()
41
+ {
42
+ /**
43
+ * Register actions and filters for custom types used on the current plugin
44
+ */
45
+
46
+ /** Custom types : slider */
47
+ add_action('woocommerce_admin_field_slider', array($this, 'admin_fields_slider'));
48
+
49
+ add_action('woocommerce_admin_field_yith_ywzm_image_width', array(
50
+ $this,
51
+ 'admin_fields_yith_ywzm_image_width'
52
+ ));
53
+ }
54
+
55
+ /**
56
+ * Create new Woocommerce admin field: slider
57
+ *
58
+ * @access public
59
+ *
60
+ * @param array $value
61
+ *
62
+ * @return void
63
+ * @since 1.0.0
64
+ */
65
+ public function admin_fields_slider($value)
66
+ {
67
+ $slider_value = (get_option($value['id']) !== false && get_option($value['id']) !== null) ?
68
+ esc_attr(stripslashes(get_option($value['id']))) :
69
+ esc_attr($value['std']);
70
+
71
+ ?>
72
+ <tr valign="top">
73
+ <th scope="row" class="titledesc">
74
+ <label for="<?php echo esc_attr($value['id']); ?>"><?php echo $value['name']; ?></label>
75
+ </th>
76
+ <td class="forminp">
77
+ <div id="<?php echo esc_attr($value['id']); ?>_slider" class="yith_woocommerce_slider"
78
+ style="width: 300px; float: left;"></div>
79
+ <div id="<?php echo esc_attr($value['id']); ?>_value"
80
+ class="yith_woocommerce_slider_value ui-state-default ui-corner-all"><?php echo $slider_value ?></div>
81
+ <input name="<?php echo esc_attr($value['id']); ?>" id="<?php echo esc_attr($value['id']); ?>"
82
+ type="hidden" value="<?php echo $slider_value ?>"/> <?php echo $value['desc']; ?>
83
+ </td>
84
+ </tr>
85
+
86
+
87
+ <script>
88
+ jQuery(document).ready(function ($) {
89
+ $('#<?php echo esc_attr( $value['id'] ); ?>_slider').slider({
90
+ min: <?php echo $value['min'] ?>,
91
+ max: <?php echo $value['max'] ?>,
92
+ step: <?php echo $value['step'] ?>,
93
+ value: <?php echo $slider_value ?>,
94
+ slide: function (event, ui) {
95
+ $("#<?php echo esc_attr( $value['id'] ); ?>").val(ui.value);
96
+ $("#<?php echo esc_attr( $value['id'] ); ?>_value").text(ui.value);
97
+ }
98
+ });
99
+ });
100
+ </script>
101
+
102
+ <?php
103
+ }
104
+
105
+ /**
106
+ * Save the admin field: slider
107
+ *
108
+ * @access public
109
+ *
110
+ * @param mixed $value
111
+ *
112
+ * @return void
113
+ * @since 1.0.0
114
+ */
115
+ public function admin_update_option($value)
116
+ {
117
+ global $woocommerce;
118
+
119
+ if (version_compare(preg_replace('/-beta-([0-9]+)/', '', $woocommerce->version), '2.1', '<')) {
120
+ $wc_clean = 'woocommerce_clean';
121
+ } else {
122
+ $wc_clean = 'wc_clean';
123
+ }
124
+
125
+ update_option($value['id'], $wc_clean($_POST[$value['id']]));
126
+ }
127
+
128
+
129
+ /**
130
+ * Create new Woocommerce admin field: yith_ywzm_image_width
131
+ *
132
+ * @access public
133
+ * @param array $value
134
+ * @return void
135
+ * @since 1.1.3
136
+ */
137
+ public function admin_fields_yith_ywzm_image_width($value)
138
+ {
139
+
140
+ $width = WC_Admin_Settings::get_option($value['id'] . '[width]', $value['default']['width']);
141
+ $height = WC_Admin_Settings::get_option($value['id'] . '[height]', $value['default']['height']);
142
+ $crop = WC_Admin_Settings::get_option($value['id'] . '[crop]');
143
+ $crop = ($crop == 'on' || $crop == '1') ? 1 : 0;
144
+ $crop = checked(1, $crop, false);
145
+
146
+ ?>
147
+ <tr valign="top">
148
+ <th scope="row" class="titledesc"><?php echo esc_html($value['title']) ?></th>
149
+ <td class="forminp image_width_settings">
150
+ <input name="<?php echo esc_attr($value['id']); ?>[width]"
151
+ id="<?php echo esc_attr($value['id']); ?>-width" type="text" size="3"
152
+ value="<?php echo $width; ?>"/> &times; <input
153
+ name="<?php echo esc_attr($value['id']); ?>[height]"
154
+ id="<?php echo esc_attr($value['id']); ?>-height" type="text" size="3"
155
+ value="<?php echo $height; ?>"/>px <span class="description"><?php echo $value['desc'] ?></span>
156
+ <br>
157
+ <label><input name="<?php echo esc_attr($value['id']); ?>[crop]"
158
+ id="<?php echo esc_attr($value['id']); ?>-crop"
159
+ type="checkbox" <?php echo $crop; ?> /> <?php _e('Do you want to hard crop the image?', 'woocommerce'); ?>
160
+ </label>
161
+
162
+ </td>
163
+ </tr><?php
164
+
165
+ }
166
+
167
+ /**
168
+ * Update plugin options.
169
+ *
170
+ * @return void
171
+ * @since 1.0.0
172
+ */
173
+ public function update_options()
174
+ {
175
+ foreach ($this->options as $option) {
176
+ woocommerce_update_options($option);
177
+ }
178
+ }
179
+
180
+ }
181
  }
lib/class.yith-ywzm-plugin-fw-loader.php CHANGED
@@ -1,250 +1,250 @@
1
- <?php
2
- if ( ! defined( 'ABSPATH' ) ) {
3
- exit; // Exit if accessed directly
4
- }
5
-
6
- if ( ! class_exists( 'YITH_YWZM_Plugin_FW_Loader' ) ) {
7
-
8
- /**
9
- * Implements features related to an invoice document
10
- *
11
- * @class YITH_YWZM_Plugin_FW_Loader
12
- * @package Yithemes
13
- * @since 1.0.0
14
- * @author Lorenzo Giuffrida
15
- */
16
- class YITH_YWZM_Plugin_FW_Loader {
17
-
18
- /**
19
- * @var $_panel Panel Object
20
- */
21
- protected $_panel;
22
-
23
- /**
24
- * @var $_premium string Premium tab template file name
25
- */
26
- protected $_premium = 'premium.php';
27
-
28
- /**
29
- * @var string Premium version landing link
30
- */
31
- protected $_premium_landing = 'http://yithemes.com/themes/plugins/yith-woocommerce-zoom-magnifier/';
32
-
33
- /**
34
- * @var string Plugin official documentation
35
- */
36
- protected $_official_documentation = 'https://docs.yithemes.com/yith-woocommerce-zoom-magnifier/';
37
-
38
- /**
39
- * @var string Plugin panel page
40
- */
41
- protected $_panel_page = 'yith_woocommerce_zoom-magnifier_panel';
42
-
43
- /**
44
- * Single instance of the class
45
- *
46
- * @since 1.0.0
47
- */
48
- protected static $instance;
49
-
50
- /**
51
- * Returns single instance of the class
52
- *
53
- * @since 1.0.0
54
- */
55
- public static function get_instance() {
56
- if ( is_null( self::$instance ) ) {
57
- self::$instance = new self();
58
- }
59
-
60
- return self::$instance;
61
- }
62
-
63
- public function __construct() {
64
- /**
65
- * Register actions and filters to be used for creating an entry on YIT Plugin menu
66
- */
67
- add_action( 'admin_init', array( $this, 'register_pointer' ) );
68
-
69
- add_action( 'plugins_loaded', array( $this, 'plugin_fw_loader' ), 15 );
70
-
71
- // Add stylesheets and scripts files
72
- add_action( 'admin_menu', array( $this, 'register_panel' ), 5 );
73
-
74
- if ( ! defined( 'YITH_YWZM_PREMIUM' ) ) {
75
- // Show plugin premium tab
76
- add_action( 'yith_zoom_magnifier_premium', array( $this, 'premium_tab' ) );
77
- } else {
78
-
79
- /**
80
- * register plugin to licence/update system
81
- */
82
- $this->licence_activation();
83
- }
84
- }
85
-
86
-
87
- /**
88
- * Load YIT core plugin
89
- *
90
- * @since 1.0
91
- * @access public
92
- * @return void
93
- * @author Andrea Grillo <andrea.grillo@yithemes.com>
94
- */
95
- public function plugin_fw_loader() {
96
- if ( !defined( 'YIT_CORE_PLUGIN' ) ) {
97
- global $plugin_fw_data;
98
- if ( !empty( $plugin_fw_data ) ) {
99
- $plugin_fw_file = array_shift( $plugin_fw_data );
100
- require_once( $plugin_fw_file );
101
- }
102
- }
103
- }
104
-
105
- /**
106
- * Add a panel under YITH Plugins tab
107
- *
108
- * @return void
109
- * @since 1.0
110
- * @author Andrea Grillo <andrea.grillo@yithemes.com>
111
- * @use /Yit_Plugin_Panel class
112
- * @see plugin-fw/lib/yit-plugin-panel.php
113
- */
114
- public function register_panel() {
115
-
116
- if ( ! empty( $this->_panel ) ) {
117
- return;
118
- }
119
-
120
- $admin_tabs['general'] = __( 'General', 'yith-woocommerce-zoom-magnifier' );
121
-
122
- if ( ! defined( 'YITH_YWZM_PREMIUM' ) ) {
123
- $admin_tabs['premium-landing'] = __( 'Premium Version', 'yith-woocommerce-zoom-magnifier' );
124
- } else {
125
- $admin_tabs['exclusions'] = __( 'Product exclusion list', 'yith-woocommerce-zoom-magnifier' );
126
- }
127
-
128
- $args = array(
129
- 'create_menu_page' => true,
130
- 'parent_slug' => '',
131
- 'page_title' => 'Zoom magnifier',
132
- 'menu_title' => 'Zoom magnifier',
133
- 'capability' => 'manage_options',
134
- 'parent' => '',
135
- 'parent_page' => 'yit_plugin_panel',
136
- 'page' => $this->_panel_page,
137
- 'admin-tabs' => $admin_tabs,
138
- 'options-path' => YITH_YWZM_DIR . '/plugin-options'
139
- );
140
-
141
- /* === Fixed: not updated theme === */
142
- if ( ! class_exists( 'YIT_Plugin_Panel_WooCommerce' ) ) {
143
-
144
- require_once( 'plugin-fw/lib/yit-plugin-panel-wc.php' );
145
- }
146
-
147
- $this->_panel = new YIT_Plugin_Panel_WooCommerce( $args );
148
-
149
- /** Add custom types actions and filters */
150
- YITH_YWZM_Custom_Types::get_instance();
151
- }
152
-
153
- /**
154
- * Premium Tab Template
155
- *
156
- * Load the premium tab template on admin page
157
- *
158
- * @return void
159
- * @since 1.0
160
- * @author Andrea Grillo <andrea.grillo@yithemes.com>
161
- * @return void
162
- */
163
- public function premium_tab() {
164
- $premium_tab_template = YITH_YWZM_TEMPLATE_DIR . '/admin/' . $this->_premium;
165
- if ( file_exists( $premium_tab_template ) ) {
166
- include_once( $premium_tab_template );
167
- }
168
- }
169
-
170
- public function register_pointer() {
171
- if ( ! class_exists( 'YIT_Pointers' ) ) {
172
- include_once( 'plugin-fw/lib/yit-pointers.php' );
173
- }
174
-
175
- $premium_message = defined( 'YITH_YWZM_PREMIUM' )
176
- ? ''
177
- : __( 'YITH WooCommerce Zoom Magnifier is available in an outstanding PREMIUM version with many new options, discover it now.', 'yith-woocommerce-zoom-magnifier' ) .
178
- ' <a href="' . $this->_premium_landing . '">' . __( 'Premium version', 'yith-woocommerce-zoom-magnifier' ) . '</a>';
179
-
180
- $args[] = array(
181
- 'screen_id' => 'plugins',
182
- 'pointer_id' => 'yith_woocommerce_zoom-magnifier',
183
- 'target' => '#toplevel_page_yit_plugin_panel',
184
- 'content' => sprintf( '<h3> %s </h3> <p> %s </p>',
185
- __( 'YITH WooCommerce Zoom Magnifier', 'yith-woocommerce-zoom-magnifier' ),
186
- __( 'In YIT Plugins tab you can find YITH WooCommerce Zoom Magnifier options.<br> From this menu you can access all settings of the YITH plugins activated.', 'yith-woocommerce-zoom-magnifier' ) . '<br>' . $premium_message
187
- ),
188
- 'position' => array( 'edge' => 'left', 'align' => 'center' ),
189
- 'init' => defined( 'YITH_YWZM_PREMIUM' ) ? YITH_YWZM_INIT : YITH_YWZM_FREE_INIT
190
- );
191
-
192
- YIT_Pointers()->register( $args );
193
- }
194
-
195
- /**
196
- * Get the premium landing uri
197
- *
198
- * @since 1.0.0
199
- * @author Andrea Grillo <andrea.grillo@yithemes.com>
200
- * @return string The premium landing link
201
- */
202
- public function get_premium_landing_uri() {
203
- return defined( 'YITH_REFER_ID' ) ? $this->_premium_landing . '?refer_id=' . YITH_REFER_ID : $this->_premium_landing . '?refer_id=1030585';
204
- }
205
-
206
- //region **** licence related methods ****
207
-
208
- /**
209
- * Add actions to manage licence activation and updates
210
- */
211
- public function licence_activation() {
212
- if ( ! defined( 'YITH_YWZM_PREMIUM' ) ) {
213
- return;
214
- }
215
-
216
- add_action( 'wp_loaded', array( $this, 'register_plugin_for_activation' ), 99 );
217
- add_action( 'admin_init', array( $this, 'register_plugin_for_updates' ) );
218
- }
219
-
220
- /**
221
- * Register plugins for activation tab
222
- *
223
- * @return void
224
- * @since 2.0.0
225
- * @author Andrea Grillo <andrea.grillo@yithemes.com>
226
- */
227
- public function register_plugin_for_activation() {
228
- if ( ! class_exists( 'YIT_Plugin_Licence' ) ) {
229
- require_once YITH_YWZM_DIR . '/plugin-fw/licence/lib/yit-licence.php';
230
- require_once YITH_YWZM_DIR . '/plugin-fw/licence/lib/yit-plugin-licence.php';
231
- }
232
- YIT_Plugin_Licence()->register( YITH_YWZM_INIT, YITH_YWZM_SECRET_KEY, YITH_YWZM_SLUG );
233
- }
234
-
235
- /**
236
- * Register plugins for update tab
237
- *
238
- * @return void
239
- * @since 2.0.0
240
- * @author Andrea Grillo <andrea.grillo@yithemes.com>
241
- */
242
- public function register_plugin_for_updates() {
243
- if ( ! class_exists( 'YIT_Upgrade' ) ) {
244
- require_once 'plugin-fw/lib/yit-upgrade.php';
245
- }
246
- YIT_Upgrade()->register( YITH_YWZM_SLUG, YITH_YWZM_INIT );
247
- }
248
- //endregion
249
- }
250
  }
1
+ <?php
2
+ if ( ! defined( 'ABSPATH' ) ) {
3
+ exit; // Exit if accessed directly
4
+ }
5
+
6
+ if ( ! class_exists( 'YITH_YWZM_Plugin_FW_Loader' ) ) {
7
+
8
+ /**
9
+ * Implements features related to an invoice document
10
+ *
11
+ * @class YITH_YWZM_Plugin_FW_Loader
12
+ * @package Yithemes
13
+ * @since 1.0.0
14
+ * @author Lorenzo Giuffrida
15
+ */
16
+ class YITH_YWZM_Plugin_FW_Loader {
17
+
18
+ /**
19
+ * @var $_panel Panel Object
20
+ */
21
+ protected $_panel;
22
+
23
+ /**
24
+ * @var $_premium string Premium tab template file name
25
+ */
26
+ protected $_premium = 'premium.php';
27
+
28
+ /**
29
+ * @var string Premium version landing link
30
+ */
31
+ protected $_premium_landing = 'http://yithemes.com/themes/plugins/yith-woocommerce-zoom-magnifier/';
32
+
33
+ /**
34
+ * @var string Plugin official documentation
35
+ */
36
+ protected $_official_documentation = 'https://docs.yithemes.com/yith-woocommerce-zoom-magnifier/';
37
+
38
+ /**
39
+ * @var string Plugin panel page
40
+ */
41
+ protected $_panel_page = 'yith_woocommerce_zoom-magnifier_panel';
42
+
43
+ /**
44
+ * Single instance of the class
45
+ *
46
+ * @since 1.0.0
47
+ */
48
+ protected static $instance;
49
+
50
+ /**
51
+ * Returns single instance of the class
52
+ *
53
+ * @since 1.0.0
54
+ */
55
+ public static function get_instance() {
56
+ if ( is_null( self::$instance ) ) {
57
+ self::$instance = new self();
58
+ }
59
+
60
+ return self::$instance;
61
+ }
62
+
63
+ public function __construct() {
64
+ /**
65
+ * Register actions and filters to be used for creating an entry on YIT Plugin menu
66
+ */
67
+ add_action( 'admin_init', array( $this, 'register_pointer' ) );
68
+
69
+ add_action( 'plugins_loaded', array( $this, 'plugin_fw_loader' ), 15 );
70
+
71
+ // Add stylesheets and scripts files
72
+ add_action( 'admin_menu', array( $this, 'register_panel' ), 5 );
73
+
74
+ if ( ! defined( 'YITH_YWZM_PREMIUM' ) ) {
75
+ // Show plugin premium tab
76
+ add_action( 'yith_zoom_magnifier_premium', array( $this, 'premium_tab' ) );
77
+ } else {
78
+
79
+ /**
80
+ * register plugin to licence/update system
81
+ */
82
+ $this->licence_activation();
83
+ }
84
+ }
85
+
86
+
87
+ /**
88
+ * Load YIT core plugin
89
+ *
90
+ * @since 1.0
91
+ * @access public
92
+ * @return void
93
+ * @author Andrea Grillo <andrea.grillo@yithemes.com>
94
+ */
95
+ public function plugin_fw_loader() {
96
+ if ( !defined( 'YIT_CORE_PLUGIN' ) ) {
97
+ global $plugin_fw_data;
98
+ if ( !empty( $plugin_fw_data ) ) {
99
+ $plugin_fw_file = array_shift( $plugin_fw_data );
100
+ require_once( $plugin_fw_file );
101
+ }
102
+ }
103
+ }
104
+
105
+ /**
106
+ * Add a panel under YITH Plugins tab
107
+ *
108
+ * @return void
109
+ * @since 1.0
110
+ * @author Andrea Grillo <andrea.grillo@yithemes.com>
111
+ * @use /Yit_Plugin_Panel class
112
+ * @see plugin-fw/lib/yit-plugin-panel.php
113
+ */
114
+ public function register_panel() {
115
+
116
+ if ( ! empty( $this->_panel ) ) {
117
+ return;
118
+ }
119
+
120
+ $admin_tabs['general'] = __( 'General', 'yith-woocommerce-zoom-magnifier' );
121
+
122
+ if ( ! defined( 'YITH_YWZM_PREMIUM' ) ) {
123
+ $admin_tabs['premium-landing'] = __( 'Premium Version', 'yith-woocommerce-zoom-magnifier' );
124
+ } else {
125
+ $admin_tabs['exclusions'] = __( 'Product exclusion list', 'yith-woocommerce-zoom-magnifier' );
126
+ }
127
+
128
+ $args = array(
129
+ 'create_menu_page' => true,
130
+ 'parent_slug' => '',
131
+ 'page_title' => 'Zoom magnifier',
132
+ 'menu_title' => 'Zoom magnifier',
133
+ 'capability' => 'manage_options',
134
+ 'parent' => '',
135
+ 'parent_page' => 'yit_plugin_panel',
136
+ 'page' => $this->_panel_page,
137
+ 'admin-tabs' => $admin_tabs,
138
+ 'options-path' => YITH_YWZM_DIR . '/plugin-options'
139
+ );
140
+
141
+ /* === Fixed: not updated theme === */
142
+ if ( ! class_exists( 'YIT_Plugin_Panel_WooCommerce' ) ) {
143
+
144
+ require_once( 'plugin-fw/lib/yit-plugin-panel-wc.php' );
145
+ }
146
+
147
+ $this->_panel = new YIT_Plugin_Panel_WooCommerce( $args );
148
+
149
+ /** Add custom types actions and filters */
150
+ YITH_YWZM_Custom_Types::get_instance();
151
+ }
152
+
153
+ /**
154
+ * Premium Tab Template
155
+ *
156
+ * Load the premium tab template on admin page
157
+ *
158
+ * @return void
159
+ * @since 1.0
160
+ * @author Andrea Grillo <andrea.grillo@yithemes.com>
161
+ * @return void
162
+ */
163
+ public function premium_tab() {
164
+ $premium_tab_template = YITH_YWZM_TEMPLATE_DIR . '/admin/' . $this->_premium;
165
+ if ( file_exists( $premium_tab_template ) ) {
166
+ include_once( $premium_tab_template );
167
+ }
168
+ }
169
+
170
+ public function register_pointer() {
171
+ if ( ! class_exists( 'YIT_Pointers' ) ) {
172
+ include_once( 'plugin-fw/lib/yit-pointers.php' );
173
+ }
174
+
175
+ $premium_message = defined( 'YITH_YWZM_PREMIUM' )
176
+ ? ''
177
+ : __( 'YITH WooCommerce Zoom Magnifier is available in an outstanding PREMIUM version with many new options, discover it now.', 'yith-woocommerce-zoom-magnifier' ) .
178
+ ' <a href="' . $this->_premium_landing . '">' . __( 'Premium version', 'yith-woocommerce-zoom-magnifier' ) . '</a>';
179
+
180
+ $args[] = array(
181
+ 'screen_id' => 'plugins',
182
+ 'pointer_id' => 'yith_woocommerce_zoom-magnifier',
183
+ 'target' => '#toplevel_page_yit_plugin_panel',
184
+ 'content' => sprintf( '<h3> %s </h3> <p> %s </p>',
185
+ __( 'YITH WooCommerce Zoom Magnifier', 'yith-woocommerce-zoom-magnifier' ),
186
+ __( 'In YIT Plugins tab you can find YITH WooCommerce Zoom Magnifier options.<br> From this menu you can access all settings of the YITH plugins activated.', 'yith-woocommerce-zoom-magnifier' ) . '<br>' . $premium_message
187
+ ),
188
+ 'position' => array( 'edge' => 'left', 'align' => 'center' ),
189
+ 'init' => defined( 'YITH_YWZM_PREMIUM' ) ? YITH_YWZM_INIT : YITH_YWZM_FREE_INIT
190
+ );
191
+
192
+ YIT_Pointers()->register( $args );
193
+ }
194
+
195
+ /**
196
+ * Get the premium landing uri
197
+ *
198
+ * @since 1.0.0
199
+ * @author Andrea Grillo <andrea.grillo@yithemes.com>
200
+ * @return string The premium landing link
201
+ */
202
+ public function get_premium_landing_uri() {
203
+ return defined( 'YITH_REFER_ID' ) ? $this->_premium_landing . '?refer_id=' . YITH_REFER_ID : $this->_premium_landing . '?refer_id=1030585';
204
+ }
205
+
206
+ //region **** licence related methods ****
207
+
208
+ /**
209
+ * Add actions to manage licence activation and updates
210
+ */
211
+ public function licence_activation() {
212
+ if ( ! defined( 'YITH_YWZM_PREMIUM' ) ) {
213
+ return;
214
+ }
215
+
216
+ add_action( 'wp_loaded', array( $this, 'register_plugin_for_activation' ), 99 );
217
+ add_action( 'admin_init', array( $this, 'register_plugin_for_updates' ) );
218
+ }
219
+
220
+ /**
221
+ * Register plugins for activation tab
222
+ *
223
+ * @return void
224
+ * @since 2.0.0
225
+ * @author Andrea Grillo <andrea.grillo@yithemes.com>
226
+ */
227
+ public function register_plugin_for_activation() {
228
+ if ( ! class_exists( 'YIT_Plugin_Licence' ) ) {
229
+ require_once YITH_YWZM_DIR . '/plugin-fw/licence/lib/yit-licence.php';
230
+ require_once YITH_YWZM_DIR . '/plugin-fw/licence/lib/yit-plugin-licence.php';
231
+ }
232
+ YIT_Plugin_Licence()->register( YITH_YWZM_INIT, YITH_YWZM_SECRET_KEY, YITH_YWZM_SLUG );
233
+ }
234
+
235
+ /**
236
+ * Register plugins for update tab
237
+ *
238
+ * @return void
239
+ * @since 2.0.0
240
+ * @author Andrea Grillo <andrea.grillo@yithemes.com>
241
+ */
242
+ public function register_plugin_for_updates() {
243
+ if ( ! class_exists( 'YIT_Upgrade' ) ) {
244
+ require_once 'plugin-fw/lib/yit-upgrade.php';
245
+ }
246
+ YIT_Upgrade()->register( YITH_YWZM_SLUG, YITH_YWZM_INIT );
247
+ }
248
+ //endregion
249
+ }
250
  }
plugin-fw/assets/css/admin.css CHANGED
@@ -1,96 +1,96 @@
1
- /*-----------------------
2
- YITH Debug
3
- ------------------------*/
4
- #wpadminbar .yith-debug-admin-bar div,
5
- #wpadminbar .yith-debug-admin-bar:hover div {
6
- background : #05789c !important;
7
- color : #fff !important;
8
- }
9
-
10
- #wpadminbar .yith-debug-admin-bar a,
11
- #wpadminbar .yith-debug-admin-bar strong {
12
- color : #fff !important;
13
- }
14
-
15
- #wpadminbar .yith-debug-admin-bar strong {
16
- font-weight : 600;
17
- }
18
-
19
- #wpadminbar .yith-debug-admin-bar-post-meta .ab-empty-item,
20
- #wpadminbar .yith-debug-admin-bar-option .ab-empty-item {
21
- display : none;
22
- }
23
-
24
- #wpadminbar #wp-admin-bar-yith-debug-admin-bar-post-meta-default,
25
- #wpadminbar #wp-admin-bar-yith-debug-admin-bar-option-default {
26
- padding : 0;
27
- max-height : 500px;
28
- overflow-y : auto;
29
- }
30
-
31
- #wpadminbar .yith-debug-admin-bar pre {
32
- padding : 10px;
33
- line-height : 1.5em;
34
- }
35
-
36
- .notice-yith{
37
- margin-left: 0;
38
- border-left-color: #acc327;
39
- }
40
-
41
- .notice-yith.notice-alt{
42
- background-color: #ecf7ed;
43
- }
44
-
45
- .yith-promo-banner-image-link{
46
- display: block;
47
- margin-bottom: 15px;
48
- }
49
-
50
- .yith-promo-banner-image{
51
- max-width: 100%;
52
- margin: 0 auto;
53
- display: block;
54
- }
55
-
56
- /*-----------------------
57
- YITH Plugins Columns
58
- ------------------------*/
59
- @media screen and (min-width : 783px) {
60
-
61
- .auto-fold #adminmenu .yith-plugin-fw-menu-2-columns.wp-not-current-submenu .wp-submenu-head {
62
- width : 100%;
63
- }
64
-
65
- #adminmenu .yith-plugin-fw-menu-2-columns.wp-not-current-submenu .wp-submenu {
66
- min-width : 320px;
67
- display : flex;
68
- flex-flow : row wrap;
69
- }
70
-
71
- #adminmenu .yith-plugin-fw-menu-2-columns.wp-not-current-submenu .wp-submenu li:not(.wp-submenu-head) {
72
- width : 50%;
73
- border-left : 1px solid #555;
74
- box-sizing : border-box;
75
- }
76
-
77
- #adminmenu .yith-plugin-fw-menu-2-columns.wp-not-current-submenu .wp-submenu li:not(.wp-submenu-head):nth-child(2n) {
78
- border-left : none;
79
- }
80
-
81
- #adminmenu .yith-plugin-fw-menu-3-columns.wp-not-current-submenu .wp-submenu {
82
- min-width : 480px;
83
- display : flex;
84
- flex-flow : row wrap;
85
- }
86
-
87
- #adminmenu .yith-plugin-fw-menu-3-columns.wp-not-current-submenu .wp-submenu li:not(.wp-submenu-head) {
88
- width : calc(100% / 3);
89
- border-left : 1px solid #555;
90
- box-sizing : border-box;
91
- }
92
-
93
- #adminmenu .yith-plugin-fw-menu-3-columns.wp-not-current-submenu .wp-submenu li:not(.wp-submenu-head):nth-child(3n + 2) {
94
- border-left : none;
95
- }
96
  }
1
+ /*-----------------------
2
+ YITH Debug
3
+ ------------------------*/
4
+ #wpadminbar .yith-debug-admin-bar div,
5
+ #wpadminbar .yith-debug-admin-bar:hover div {
6
+ background : #05789c !important;
7
+ color : #fff !important;
8
+ }
9
+
10
+ #wpadminbar .yith-debug-admin-bar a,
11
+ #wpadminbar .yith-debug-admin-bar strong {
12
+ color : #fff !important;
13
+ }
14
+
15
+ #wpadminbar .yith-debug-admin-bar strong {
16
+ font-weight : 600;
17
+ }
18
+
19
+ #wpadminbar .yith-debug-admin-bar-post-meta .ab-empty-item,
20
+ #wpadminbar .yith-debug-admin-bar-option .ab-empty-item {
21
+ display : none;
22
+ }
23
+
24
+ #wpadminbar #wp-admin-bar-yith-debug-admin-bar-post-meta-default,
25
+ #wpadminbar #wp-admin-bar-yith-debug-admin-bar-option-default {
26
+ padding : 0;
27
+ max-height : 500px;
28
+ overflow-y : auto;
29
+ }
30
+
31
+ #wpadminbar .yith-debug-admin-bar pre {
32
+ padding : 10px;
33
+ line-height : 1.5em;
34
+ }
35
+
36
+ .notice-yith{
37
+ margin-left: 0;
38
+ border-left-color: #acc327;
39
+ }
40
+
41
+ .notice-yith.notice-alt{
42
+ background-color: #ecf7ed;
43
+ }
44
+
45
+ .yith-promo-banner-image-link{
46
+ display: block;
47
+ margin-bottom: 15px;
48
+ }
49
+
50
+ .yith-promo-banner-image{
51
+ max-width: 100%;
52
+ margin: 0 auto;
53
+ display: block;
54
+ }
55
+
56
+ /*-----------------------
57
+ YITH Plugins Columns
58
+ ------------------------*/
59
+ @media screen and (min-width : 783px) {
60
+
61
+ .auto-fold #adminmenu .yith-plugin-fw-menu-2-columns.wp-not-current-submenu .wp-submenu-head {
62
+ width : 100%;
63
+ }
64
+
65
+ #adminmenu .yith-plugin-fw-menu-2-columns.wp-not-current-submenu .wp-submenu {
66
+ min-width : 320px;
67
+ display : flex;
68
+ flex-flow : row wrap;
69
+ }
70
+
71
+ #adminmenu .yith-plugin-fw-menu-2-columns.wp-not-current-submenu .wp-submenu li:not(.wp-submenu-head) {
72
+ width : 50%;
73
+ border-left : 1px solid #555;
74
+ box-sizing : border-box;
75
+ }
76
+
77
+ #adminmenu .yith-plugin-fw-menu-2-columns.wp-not-current-submenu .wp-submenu li:not(.wp-submenu-head):nth-child(2n) {
78
+ border-left : none;
79
+ }
80
+
81
+ #adminmenu .yith-plugin-fw-menu-3-columns.wp-not-current-submenu .wp-submenu {
82
+ min-width : 480px;
83
+ display : flex;
84
+ flex-flow : row wrap;
85
+ }
86
+
87
+ #adminmenu .yith-plugin-fw-menu-3-columns.wp-not-current-submenu .wp-submenu li:not(.wp-submenu-head) {
88
+ width : calc(100% / 3);
89
+ border-left : 1px solid #555;
90
+ box-sizing : border-box;
91
+ }
92
+
93
+ #adminmenu .yith-plugin-fw-menu-3-columns.wp-not-current-submenu .wp-submenu li:not(.wp-submenu-head):nth-child(3n + 2) {
94
+ border-left : none;
95
+ }
96
  }
plugin-fw/assets/css/codemirror/codemirror.css CHANGED
@@ -1,260 +1,260 @@
1
- /* BASICS */
2
-
3
- .CodeMirror {
4
- /* Set height, width, borders, and global font properties here */
5
- font-family: monospace;
6
- height: 400px;
7
- clear: both;
8
- padding: 0;
9
- }
10
- .CodeMirror-scroll {
11
- /* Set scrolling behaviour here */
12
- overflow: auto;
13
- }
14
-
15
- /* PADDING */
16
-
17
- .CodeMirror-lines {
18
- padding: 4px 0; /* Vertical padding around content */
19
- }
20
- .CodeMirror pre {
21
- padding: 0 4px; /* Horizontal padding of content */
22
- }
23
-
24
- .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
25
- background-color: white; /* The little square between H and V scrollbars */
26
- }
27
-
28
- /* GUTTER */
29
-
30
- .CodeMirror-gutters {
31
- border-right: 1px solid #ddd;
32
- background-color: #f7f7f7;
33
- white-space: nowrap;
34
- }
35
- .CodeMirror-linenumbers {}
36
- .CodeMirror-linenumber {
37
- padding: 0 3px 0 5px;
38
- min-width: 20px;
39
- text-align: right;
40
- color: #999;
41
- }
42
-
43
- /* CURSOR */
44
-
45
- .CodeMirror div.CodeMirror-cursor {
46
- border-left: 1px solid black;
47
- z-index: 3;
48
- }
49
- /* Shown when moving in bi-directional text */
50
- .CodeMirror div.CodeMirror-secondarycursor {
51
- border-left: 1px solid silver;
52
- }
53
- .CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor {
54
- width: auto;
55
- border: 0;
56
- background: #7e7;
57
- z-index: 1;
58
- }
59
- /* Can style cursor different in overwrite (non-insert) mode */
60
- .CodeMirror div.CodeMirror-cursor.CodeMirror-overwrite {}
61
-
62
- .cm-tab { display: inline-block; }
63
-
64
- /* DEFAULT THEME */
65
-
66
- .cm-s-default .cm-keyword {color: #708;}
67
- .cm-s-default .cm-atom {color: #219;}
68
- .cm-s-default .cm-number {color: #164;}
69
- .cm-s-default .cm-def {color: #00f;}
70
- .cm-s-default .cm-variable {color: black;}
71
- .cm-s-default .cm-variable-2 {color: #05a;}
72
- .cm-s-default .cm-variable-3 {color: #085;}
73
- .cm-s-default .cm-property {color: black;}
74
- .cm-s-default .cm-operator {color: black;}
75
- .cm-s-default .cm-comment {color: #a50;}
76
- .cm-s-default .cm-string {color: #a11;}
77
- .cm-s-default .cm-string-2 {color: #f50;}
78
- .cm-s-default .cm-meta {color: #555;}
79
- .cm-s-default .cm-error {color: #f00;}
80
- .cm-s-default .cm-qualifier {color: #555;}
81
- .cm-s-default .cm-builtin {color: #30a;}
82
- .cm-s-default .cm-bracket {color: #997;}
83
- .cm-s-default .cm-tag {color: #170;}
84
- .cm-s-default .cm-attribute {color: #00c;}
85
- .cm-s-default .cm-header {color: blue;}
86
- .cm-s-default .cm-quote {color: #090;}
87
- .cm-s-default .cm-hr {color: #999;}
88
- .cm-s-default .cm-link {color: #00c;}
89
-
90
- .cm-negative {color: #d44;}
91
- .cm-positive {color: #292;}
92
- .cm-header, .cm-strong {font-weight: bold;}
93
- .cm-em {font-style: italic;}
94
- .cm-link {text-decoration: underline;}
95
-
96
- .cm-invalidchar {color: #f00;}
97
-
98
- div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
99
- div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
100
-
101
- /* STOP */
102
-
103
- /* The rest of this file contains styles related to the mechanics of
104
- the editor. You probably shouldn't touch them. */
105
-
106
- .CodeMirror {
107
- line-height: 1;
108
- position: relative;
109
- overflow: hidden;
110
- background: #fafafa;
111
- color: black;
112
- }
113
-
114
- .CodeMirror-scroll {
115
- /* 30px is the magic margin used to hide the element's real scrollbars */
116
- /* See overflow: hidden in .CodeMirror */
117
- margin-bottom: -30px; margin-right: -30px;
118
- padding-bottom: 30px; padding-right: 30px;
119
- height: 100%;
120
- outline: none; /* Prevent dragging from highlighting the element */
121
- position: relative;
122
- }
123
- .CodeMirror-sizer {
124
- position: relative;
125
- }
126
-
127
- /* The fake, visible scrollbars. Used to force redraw during scrolling
128
- before actuall scrolling happens, thus preventing shaking and
129
- flickering artifacts. */
130
- .CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
131
- position: absolute;
132
- z-index: 6;
133
- display: none;
134
- }
135
- .CodeMirror-vscrollbar {
136
- right: 0; top: 0;
137
- overflow-x: hidden;
138
- overflow-y: scroll;
139
- }
140
- .CodeMirror-hscrollbar {
141
- bottom: 0; left: 0;
142
- overflow-y: hidden;
143
- overflow-x: scroll;
144
- }
145
- .CodeMirror-scrollbar-filler {
146
- right: 0; bottom: 0;
147
- }
148
- .CodeMirror-gutter-filler {
149
- left: 0; bottom: 0;
150
- }
151
-
152
- .CodeMirror-gutters {
153
- position: absolute; left: 0; top: 0;
154
- padding-bottom: 30px;
155
- z-index: 3;
156
- }
157
- .CodeMirror-gutter {
158
- white-space: normal;
159
- height: 100%;
160
- padding-bottom: 30px;
161
- margin-bottom: -32px;
162
- display: inline-block;
163
- /* Hack to make IE7 behave */
164
- *zoom:1;
165
- *display:inline;
166
- }
167
- .CodeMirror-gutter-elt {
168
- position: absolute;
169
- cursor: default;
170
- z-index: 4;
171
- }
172
-
173
- .CodeMirror-lines {
174
- cursor: text;
175
- }
176
- .CodeMirror pre {
177
- /* Reset some styles that the rest of the page might have set */
178
- -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
179
- border-width: 0;
180
- background: transparent;
181
- font-family: inherit;
182
- font-size: inherit;
183
- margin: 0;
184
- white-space: pre;
185
- word-wrap: normal;
186
- line-height: inherit;
187
- color: inherit;
188
- z-index: 2;
189
- position: relative;
190
- overflow: visible;
191
- }
192
- .CodeMirror-wrap pre {
193
- word-wrap: break-word;
194
- white-space: pre-wrap;
195
- word-break: normal;
196
- }
197
- .CodeMirror-code pre {
198
- border-right: 30px solid transparent;
199
- width: -webkit-fit-content;
200
- width: -moz-fit-content;
201
- width: fit-content;
202
- }
203
- .CodeMirror-wrap .CodeMirror-code pre {
204
- border-right: none;
205
- width: auto;
206
- }
207
- .CodeMirror-linebackground {
208
- position: absolute;
209
- left: 0; right: 0; top: 0; bottom: 0;
210
- z-index: 0;
211
- }
212
-
213
- .CodeMirror-linewidget {
214
- position: relative;
215
- z-index: 2;
216
- overflow: auto;
217
- }
218
-
219
- .CodeMirror-widget {
220
- }
221
-
222
- .CodeMirror-wrap .CodeMirror-scroll {
223
- overflow-x: hidden;
224
- }
225
-
226
- .CodeMirror-measure {
227
- position: absolute;
228
- width: 100%; height: 0px;
229
- overflow: hidden;
230
- visibility: hidden;
231
- }
232
- .CodeMirror-measure pre { position: static; }
233
-
234
- .CodeMirror div.CodeMirror-cursor {
235
- position: absolute;
236
- visibility: hidden;
237
- border-right: none;
238
- width: 0;
239
- }
240
- .CodeMirror-focused div.CodeMirror-cursor {
241
- visibility: visible;
242
- }
243
-
244
- .CodeMirror-selected { background: #d9d9d9; }
245
- .CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
246
-
247
- .cm-searching {
248
- background: #ffa;
249
- background: rgba(255, 255, 0, .4);
250
- }
251
-
252
- /* IE7 hack to prevent it from returning funny offsetTops on the spans */
253
- .CodeMirror span { *vertical-align: text-bottom; }
254
-
255
- @media print {
256
- /* Hide the cursor when printing */
257
- .CodeMirror div.CodeMirror-cursor {
258
- visibility: hidden;
259
- }
260
- }
1
+ /* BASICS */
2
+
3
+ .CodeMirror {
4
+ /* Set height, width, borders, and global font properties here */
5
+ font-family: monospace;
6
+ height: 400px;
7
+ clear: both;
8
+ padding: 0;
9
+ }
10
+ .CodeMirror-scroll {
11
+ /* Set scrolling behaviour here */
12
+ overflow: auto;
13
+ }
14
+
15
+ /* PADDING */
16
+
17
+ .CodeMirror-lines {
18
+ padding: 4px 0; /* Vertical padding around content */
19
+ }
20
+ .CodeMirror pre {
21
+ padding: 0 4px; /* Horizontal padding of content */
22
+ }
23
+
24
+ .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
25
+ background-color: white; /* The little square between H and V scrollbars */
26
+ }
27
+
28
+ /* GUTTER */
29
+
30
+ .CodeMirror-gutters {
31
+ border-right: 1px solid #ddd;
32
+ background-color: #f7f7f7;
33
+ white-space: nowrap;
34
+ }
35
+ .CodeMirror-linenumbers {}
36
+ .CodeMirror-linenumber {
37
+ padding: 0 3px 0 5px;
38
+ min-width: 20px;
39
+ text-align: right;
40
+ color: #999;
41
+ }
42
+
43
+ /* CURSOR */
44
+
45
+ .CodeMirror div.CodeMirror-cursor {
46
+ border-left: 1px solid black;
47
+ z-index: 3;
48
+ }
49
+ /* Shown when moving in bi-directional text */
50
+ .CodeMirror div.CodeMirror-secondarycursor {
51
+ border-left: 1px solid silver;
52
+ }
53
+ .CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor {
54
+ width: auto;
55
+ border: 0;
56
+ background: #7e7;
57
+ z-index: 1;
58
+ }
59
+ /* Can style cursor different in overwrite (non-insert) mode */
60
+ .CodeMirror div.CodeMirror-cursor.CodeMirror-overwrite {}
61
+
62
+ .cm-tab { display: inline-block; }
63
+
64
+ /* DEFAULT THEME */
65
+
66
+ .cm-s-default .cm-keyword {color: #708;}
67
+ .cm-s-default .cm-atom {color: #219;}
68
+ .cm-s-default .cm-number {color: #164;}
69
+ .cm-s-default .cm-def {color: #00f;}
70
+ .cm-s-default .cm-variable {color: black;}
71
+ .cm-s-default .cm-variable-2 {color: #05a;}
72
+ .cm-s-default .cm-variable-3 {color: #085;}
73
+ .cm-s-default .cm-property {color: black;}
74
+ .cm-s-default .cm-operator {color: black;}
75
+ .cm-s-default .cm-comment {color: #a50;}
76
+ .cm-s-default .cm-string {color: #a11;}
77
+ .cm-s-default .cm-string-2 {color: #f50;}
78
+ .cm-s-default .cm-meta {color: #555;}
79
+ .cm-s-default .cm-error {color: #f00;}
80
+ .cm-s-default .cm-qualifier {color: #555;}
81
+ .cm-s-default .cm-builtin {color: #30a;}
82
+ .cm-s-default .cm-bracket {color: #997;}
83
+ .cm-s-default .cm-tag {color: #170;}
84
+ .cm-s-default .cm-attribute {color: #00c;}
85
+ .cm-s-default .cm-header {color: blue;}
86
+ .cm-s-default .cm-quote {color: #090;}
87
+ .cm-s-default .cm-hr {color: #999;}
88
+ .cm-s-default .cm-link {color: #00c;}
89
+
90
+ .cm-negative {color: #d44;}
91
+ .cm-positive {color: #292;}
92
+ .cm-header, .cm-strong {font-weight: bold;}
93
+ .cm-em {font-style: italic;}
94
+ .cm-link {text-decoration: underline;}
95
+
96
+ .cm-invalidchar {color: #f00;}
97
+
98
+ div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
99
+ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
100
+
101
+ /* STOP */
102
+
103
+ /* The rest of this file contains styles related to the mechanics of
104
+ the editor. You probably shouldn't touch them. */
105
+
106
+ .CodeMirror {
107
+ line-height: 1;
108
+ position: relative;
109
+ overflow: hidden;
110
+ background: #fafafa;
111
+ color: black;
112
+ }
113
+
114
+ .CodeMirror-scroll {
115
+ /* 30px is the magic margin used to hide the element's real scrollbars */
116
+ /* See overflow: hidden in .CodeMirror */
117
+ margin-bottom: -30px; margin-right: -30px;
118
+ padding-bottom: 30px; padding-right: 30px;
119
+ height: 100%;
120
+ outline: none; /* Prevent dragging from highlighting the element */
121
+ position: relative;
122
+ }
123
+ .CodeMirror-sizer {
124
+ position: relative;
125
+ }
126
+
127
+ /* The fake, visible scrollbars. Used to force redraw during scrolling
128
+ before actuall scrolling happens, thus preventing shaking and
129
+ flickering artifacts. */
130
+ .CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
131
+ position: absolute;
132
+ z-index: 6;
133
+ display: none;
134
+ }
135
+ .CodeMirror-vscrollbar {
136
+ right: 0; top: 0;
137
+ overflow-x: hidden;
138
+ overflow-y: scroll;
139
+ }
140
+ .CodeMirror-hscrollbar {
141
+ bottom: 0; left: 0;
142
+ overflow-y: hidden;
143
+ overflow-x: scroll;
144
+ }
145
+ .CodeMirror-scrollbar-filler {
146
+ right: 0; bottom: 0;
147
+ }
148
+ .CodeMirror-gutter-filler {
149
+ left: 0; bottom: 0;
150
+ }
151
+
152
+ .CodeMirror-gutters {
153
+ position: absolute; left: 0; top: 0;
154
+ padding-bottom: 30px;
155
+ z-index: 3;
156
+ }
157
+ .CodeMirror-gutter {
158
+ white-space: normal;
159
+ height: 100%;
160
+ padding-bottom: 30px;
161
+ margin-bottom: -32px;
162
+ display: inline-block;
163
+ /* Hack to make IE7 behave */
164
+ *zoom:1;
165
+ *display:inline;
166
+ }
167
+ .CodeMirror-gutter-elt {
168
+ position: absolute;
169
+ cursor: default;
170
+ z-index: 4;
171
+ }
172
+
173
+ .CodeMirror-lines {
174
+ cursor: text;
175
+ }
176
+ .CodeMirror pre {
177
+ /* Reset some styles that the rest of the page might have set */
178
+ -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
179
+ border-width: 0;
180
+ background: transparent;
181
+ font-family: inherit;
182
+ font-size: inherit;
183
+ margin: 0;
184
+ white-space: pre;
185
+ word-wrap: normal;
186
+ line-height: inherit;
187
+ color: inherit;
188
+ z-index: 2;
189
+ position: relative;
190
+ overflow: visible;
191
+ }
192
+ .CodeMirror-wrap pre {
193
+ word-wrap: break-word;
194
+ white-space: pre-wrap;
195
+ word-break: normal;
196
+ }
197
+ .CodeMirror-code pre {
198
+ border-right: 30px solid transparent;
199
+ width: -webkit-fit-content;
200
+ width: -moz-fit-content;
201
+ width: fit-content;
202
+ }
203
+ .CodeMirror-wrap .CodeMirror-code pre {
204
+ border-right: none;
205
+ width: auto;
206
+ }
207
+ .CodeMirror-linebackground {
208
+ position: absolute;
209
+ left: 0; right: 0; top: 0; bottom: 0;
210
+ z-index: 0;
211
+ }
212
+
213
+ .CodeMirror-linewidget {
214
+ position: relative;
215
+ z-index: 2;
216
+ overflow: auto;
217
+ }
218
+
219
+ .CodeMirror-widget {
220
+ }
221
+
222
+ .CodeMirror-wrap .CodeMirror-scroll {
223
+ overflow-x: hidden;
224
+ }
225
+
226
+ .CodeMirror-measure {
227
+ position: absolute;
228
+ width: 100%; height: 0px;
229
+ overflow: hidden;
230
+ visibility: hidden;
231
+ }
232
+ .CodeMirror-measure pre { position: static; }
233
+
234
+ .CodeMirror div.CodeMirror-cursor {
235
+ position: absolute;
236
+ visibility: hidden;
237
+ border-right: none;
238
+ width: 0;
239
+ }
240
+ .CodeMirror-focused div.CodeMirror-cursor {
241
+ visibility: visible;
242
+ }
243
+
244
+ .CodeMirror-selected { background: #d9d9d9; }
245
+ .CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
246
+
247
+ .cm-searching {
248
+ background: #ffa;
249
+ background: rgba(255, 255, 0, .4);
250
+ }
251
+
252
+ /* IE7 hack to prevent it from returning funny offsetTops on the spans */
253
+ .CodeMirror span { *vertical-align: text-bottom; }
254
+
255
+ @media print {
256
+ /* Hide the cursor when printing */
257
+ .CodeMirror div.CodeMirror-cursor {
258
+ visibility: hidden;
259
+ }
260
+ }
plugin-fw/assets/css/colorbox.css CHANGED
@@ -1,66 +1,66 @@
1
- /*
2
- Colorbox Core Style:
3
- The following CSS is consistent between example themes and should not be altered.
4
- */
5
- #colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden; -webkit-transform: translate3d(0,0,0);}
6
- #cboxWrapper {max-width:none;}
7
- #cboxOverlay{position:fixed; width:100%; height:100%;}
8
- #cboxMiddleLeft, #cboxBottomLeft{clear:left;}
9
- #cboxContent{position:relative;}
10
- #cboxLoadedContent{overflow:auto; -webkit-overflow-scrolling: touch;}
11
- #cboxTitle{margin:0;}
12
- #cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
13
- #cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
14
- .cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none; -ms-interpolation-mode:bicubic;}
15
- .cboxIframe{width:100%; height:100%; display:block; border:0; padding:0; margin:0;}
16
- #colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;}
17
-
18
- /*
19
- User Style:
20
- Change the following styles to modify the appearance of Colorbox. They are
21
- ordered & tabbed in a way that represents the nesting of the generated HTML.
22
- */
23
- #cboxOverlay{background:#fff; opacity: 0.9; filter: alpha(opacity = 90);}
24
- #colorbox{outline:0;}
25
- #cboxTopLeft{width:25px; height:25px; background:url(../images/colorbox/border1.png) no-repeat 0 0;}
26
- #cboxTopCenter{height:25px; background:url(../images/colorbox/border1.png) repeat-x 0 -50px;}
27
- #cboxTopRight{width:25px; height:25px; background:url(../images/colorbox/border1.png) no-repeat -25px 0;}
28
- #cboxBottomLeft{width:25px; height:25px; background:url(../images/colorbox/border1.png) no-repeat 0 -25px;}
29
- #cboxBottomCenter{height:25px; background:url(../images/colorbox/border1.png) repeat-x 0 -75px;}
30
- #cboxBottomRight{width:25px; height:25px; background:url(../images/colorbox/border1.png) no-repeat -25px -25px;}
31
- #cboxMiddleLeft{width:25px; background:url(../images/colorbox/border2.png) repeat-y 0 0;}
32
- #cboxMiddleRight{width:25px; background:url(../images/colorbox/border2.png) repeat-y -25px 0;}
33
- #cboxContent{background:#fff; overflow:hidden;}
34
- .cboxIframe{background:#fff;}
35
- #cboxError{padding:50px; border:1px solid #ccc;}
36
- #cboxLoadedContent{margin-bottom:20px;}
37
- #cboxTitle{position:absolute; bottom:0px; left:0; text-align:center; width:100%; color:#999;}
38
- #cboxCurrent{position:absolute; bottom:0px; left:100px; color:#999;}
39
- #cboxLoadingOverlay{background:#fff url(../images/colorbox/loading.gif) no-repeat 5px 5px;}
40
-
41
- /* these elements are buttons, and may need to have additional styles reset to avoid unwanted base styles */
42
- #cboxPrevious, #cboxNext, #cboxSlideshow, #cboxClose {border:0; padding:0; margin:0; overflow:visible; width:auto; background:none; }
43
-
44
- /* avoid outlines on :active (mouseclick), but preserve outlines on :focus (tabbed navigating) */
45
- #cboxPrevious:active, #cboxNext:active, #cboxSlideshow:active, #cboxClose:active {outline:0;}
46
-
47
- #cboxSlideshow{position:absolute; bottom:0px; right:42px; color:#444;}
48
- #cboxPrevious{position:absolute; bottom:0px; left:0; color:#444;}
49
- #cboxNext{position:absolute; bottom:0px; left:63px; color:#444;}
50
- #cboxClose{position:absolute; bottom:0; right:0; display:block; color:#444;}
51
-
52
- /*
53
- The following fixes a problem where IE7 and IE8 replace a PNG's alpha transparency with a black fill
54
- when an alpha filter (opacity change) is set on the element or ancestor element. This style is not applied to or needed in IE9.
55
- See: http://jacklmoore.com/notes/ie-transparency-problems/
56
- */
57
- .cboxIE #cboxTopLeft,
58
- .cboxIE #cboxTopCenter,
59
- .cboxIE #cboxTopRight,
60
- .cboxIE #cboxBottomLeft,
61
- .cboxIE #cboxBottomCenter,
62
- .cboxIE #cboxBottomRight,
63
- .cboxIE #cboxMiddleLeft,
64
- .cboxIE #cboxMiddleRight {
65
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF);
66
  }
1
+ /*
2
+ Colorbox Core Style:
3
+ The following CSS is consistent between example themes and should not be altered.
4
+ */
5
+ #colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden; -webkit-transform: translate3d(0,0,0);}
6
+ #cboxWrapper {max-width:none;}
7
+ #cboxOverlay{position:fixed; width:100%; height:100%;}
8
+ #cboxMiddleLeft, #cboxBottomLeft{clear:left;}
9
+ #cboxContent{position:relative;}
10
+ #cboxLoadedContent{overflow:auto; -webkit-overflow-scrolling: touch;}
11
+ #cboxTitle{margin:0;}
12
+ #cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
13
+ #cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
14
+ .cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none; -ms-interpolation-mode:bicubic;}
15
+ .cboxIframe{width:100%; height:100%; display:block; border:0; padding:0; margin:0;}
16
+ #colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;}
17
+
18
+ /*
19
+ User Style:
20
+ Change the following styles to modify the appearance of Colorbox. They are
21
+ ordered & tabbed in a way that represents the nesting of the generated HTML.
22
+ */
23
+ #cboxOverlay{background:#fff; opacity: 0.9; filter: alpha(opacity = 90);}
24
+ #colorbox{outline:0;}
25
+ #cboxTopLeft{width:25px; height:25px; background:url(../images/colorbox/border1.png) no-repeat 0 0;}
26
+ #cboxTopCenter{height:25px; background:url(../images/colorbox/border1.png) repeat-x 0 -50px;}
27
+ #cboxTopRight{width:25px; height:25px; background:url(../images/colorbox/border1.png) no-repeat -25px 0;}
28
+ #cboxBottomLeft{width:25px; height:25px; background:url(../images/colorbox/border1.png) no-repeat 0 -25px;}
29
+ #cboxBottomCenter{height:25px; background:url(../images/colorbox/border1.png) repeat-x 0 -75px;}
30
+ #cboxBottomRight{width:25px; height:25px; background:url(../images/colorbox/border1.png) no-repeat -25px -25px;}
31
+ #cboxMiddleLeft{width:25px; background:url(../images/colorbox/border2.png) repeat-y 0 0;}
32
+ #cboxMiddleRight{width:25px; background:url(../images/colorbox/border2.png) repeat-y -25px 0;}
33
+ #cboxContent{background:#fff; overflow:hidden;}
34
+ .cboxIframe{background:#fff;}
35
+ #cboxError{padding:50px; border:1px solid #ccc;}
36
+ #cboxLoadedContent{margin-bottom:20px;}
37
+ #cboxTitle{position:absolute; bottom:0px; left:0; text-align:center; width:100%; color:#999;}
38
+ #cboxCurrent{position:absolute; bottom:0px; left:100px; color:#999;}
39
+ #cboxLoadingOverlay{background:#fff url(../images/colorbox/loading.gif) no-repeat 5px 5px;}
40
+
41
+ /* these elements are buttons, and may need to have additional styles reset to avoid unwanted base styles */
42
+ #cboxPrevious, #cboxNext, #cboxSlideshow, #cboxClose {border:0; padding:0; margin:0; overflow:visible; width:auto; background:none; }
43
+
44
+ /* avoid outlines on :active (mouseclick), but preserve outlines on :focus (tabbed navigating) */
45
+ #cboxPrevious:active, #cboxNext:active, #cboxSlideshow:active, #cboxClose:active {outline:0;}
46
+
47
+ #cboxSlideshow{position:absolute; bottom:0px; right:42px; color:#444;}
48
+ #cboxPrevious{position:absolute; bottom:0px; left:0; color:#444;}
49
+ #cboxNext{position:absolute; bottom:0px; left:63px; color:#444;}
50
+ #cboxClose{position:absolute; bottom:0; right:0; display:block; color:#444;}
51
+
52
+ /*
53
+ The following fixes a problem where IE7 and IE8 replace a PNG's alpha transparency with a black fill
54
+ when an alpha filter (opacity change) is set on the element or ancestor element. This style is not applied to or needed in IE9.
55
+ See: http://jacklmoore.com/notes/ie-transparency-problems/
56
+ */
57
+ .cboxIE #cboxTopLeft,
58
+ .cboxIE #cboxTopCenter,
59
+ .cboxIE #cboxTopRight,
60
+ .cboxIE #cboxBottomLeft,
61
+ .cboxIE #cboxBottomCenter,
62
+ .cboxIE #cboxBottomRight,
63
+ .cboxIE #cboxMiddleLeft,
64
+ .cboxIE #cboxMiddleRight {
65
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF);
66
  }
plugin-fw/assets/css/metaboxes.css CHANGED
@@ -1,653 +1,653 @@
1
- /* self-clear floats */
2
- .clearfix:after {
3
- content : ".";
4
- display : block;
5
- height : 0;
6
- clear : both;
7
- visibility : hidden;
8
- overflow : hidden;
9
- }
10
-
11
- /* ie.css */
12
- * html .clearfix { /* IE6 */
13
- height : 1%;
14
- }
15
-
16
- *:first-child + html .clearfix { /* IE7 */
17
- min-height : 1%;
18
- }
19
-
20
- .clearboth {
21
- clear : both
22
- }
23
-
24
- /* === TAB STYLE */
25
- .metaboxes-tab {
26
- margin : -6px -12px -8px;
27
- }
28
-
29
- .metaboxes-tab div.tabs-panel {
30
- height : auto;
31
- overflow : visible;
32
- margin-top : 0px;
33
- padding : 0 10px;
34
- background : none;
35
- border : 0;
36
- }
37
-
38
- .metaboxes-tab ul.metaboxes-tabs {
39
- background : #f1f1f1;
40
- margin : 0;
41
- padding : 10px 0 0 5px;
42
- }
43
-
44
- .metaboxes-tab ul.metaboxes-tabs li {
45
- float : left;
46
- background : #dedede;
47
- margin : 0 0 0 5px;
48
- }
49
-
50
- .metaboxes-tab ul.metaboxes-tabs li a {
51
- color : #555;
52
- text-decoration : none;
53
- padding : 8px 15px;
54
- display : block;
55
- box-shadow : none !important;
56
- }
57
-
58
- .metaboxes-tab ul.metaboxes-tabs li.tabs {
59
- background : #fff;
60
- }
61
-
62
- .metaboxes-tab p.field-row {
63
- margin : 20px 0;
64
- }
65
-
66
- .metaboxes-tab div.sep {
67
- height : 1px;
68
- background : #dfdfdf;
69
- clear : both;
70
- margin-left : -10px;
71
- margin-right : -10px;
72
- }
73
-
74
- .metaboxes-tab label {
75
- font-weight : bold;
76
- width : 160px;
77
- float : left;
78
- line-height : 23px;
79
- margin-left : -184px;
80
- }
81
-
82
- .metaboxes-tab label small {
83
- font-weight : normal;
84
- line-height : 15px;
85
- font-style : italic;
86
- color : #999;
87
- display : block;
88
- }
89
-
90
- .metaboxes-tab .wp-picker-container label {
91
- font-weight : inherit;
92
- width : auto;
93
- float : none;
94
- line-height : inherit;
95
- margin-left : 0;
96
- }
97
-
98
- .metaboxes-tab input[type="checkbox"] {
99
- vertical-align : middle
100
- }
101
-
102
- .metaboxes-tab input.button-secondary, .metaboxes-tab input.checkbox {
103
- width : auto;
104
- }
105
-
106
- .metaboxes-tab p.field-row.textarea .description {
107
- vertical-align : top;
108
- }
109
-
110
- .metaboxes-tab p.field-row.checkbox {
111
- background : none;
112
- }
113
-
114
- .metaboxes-tab .the-metabox {
115
- margin : 20px 0;
116
- margin-left : 184px;
117
- }
118
-
119
- .metaboxes-tab .the-metabox.no-label {
120
- margin : 20px 0;
121
- margin-left : 0;
122
- }
123
-
124
- .metaboxes-tab hr {
125
- height : 0px;
126
- border-top : 1px solid #dadada;
127
- width : auto;
128
- margin-left : -10px;
129
- margin-right : -10px;
130
- }
131
-
132
- .metaboxes-tab .the-metabox p {
133
- margin : 0;
134
- }
135
-
136
- .metaboxes-tab .the-metabox:last-child {
137
- border-bottom : 0px;
138
- }
139
-
140
- .metaboxes-tab .the-metabox.checkbox {
141
- background : none;
142
- }
143
-
144
- .metaboxes-tab span.description.inline {
145
- display : inline-block;
146
- line-height : 23px;
147
- width : auto;
148
- vertical-align : middle;
149
- margin : 0;
150
- }
151
-
152
- .metaboxes-tab .slider label {
153
- padding : 15px 0;
154
- }
155
-
156
- /* sortable table posts */
157
-
158
- #the-list.ui-sortable tr:hover {
159
- cursor : move;
160
- }
161
-
162
- .the-metabox.preview {
163
- float : none;
164
- }
165
-
166
- .metaboxes-tab .the-metabox.no-label.preview {
167
- margin-left : 184px;
168
- }
169
-
170
- .metaboxes-tab .the-metabox.no-label.preview img {
171
- box-shadow : 0 1px 8px rgba(0, 0, 0, 0.2);
172
- }
173
-
174
- /**************************************
175
- FIELDS
176
- ***************************************/
177
-
178
- .metaboxes-tab select,
179
- .metaboxes-tab input[type=text],
180
- .metaboxes-tab input[type=number],
181
- .metaboxes-tab textarea,
182
- .metaboxes-tab .yith-plugin-fw-select,
183
- .metaboxes-tab .yith-plugin-fw-slider-container,
184
- .metaboxes-tab .yith-plugin-fw-text-input,
185
- .metaboxes-tab .yith-plugin-fw-text-array-table,
186
- .metaboxes-tab .yith-plugin-fw-textarea {
187
- width : 400px;
188
- max-width : 100%;
189
- }
190
-
191
- .metaboxes-tab .yith-plugin-fw-text-array-table input[type=text] {
192
- width : 100%;
193
- }
194
-
195
- /* wp editor */
196
- .the-metabox.textarea-editor .mceIframeContainer {
197
- background : #fff;
198
- }
199
-
200
- .the-metabox.textarea-editor label {
201
- margin-top : 24px;
202
- }
203
-
204
- /* categories */
205
- .categories-panel {
206
- width : 30%;
207
- float : left;
208
- margin-right : 4px;
209
- }
210
-
211
- .categories-panel .box {
212
- height : 200px;
213
- border : 1px solid #dfdfdf;
214
- background : #fff;
215
- padding : 6px 10px;
216
- overflow : auto;
217
- }
218
-
219
- .categories-panel ul {
220
- list-style : none;
221
- margin : 0;
222
- }
223
-
224
- .categories-panel ul li {
225
- line-height : 19px;
226
- margin : 0;
227
- padding : 0;
228
- word-wrap : break-word;
229
- }
230
-
231
- .categories-panel ul li label {
232
- font-weight : normal !important;
233
- margin-left : 0 !important;
234
- }
235
-
236
- .categories-panel input.newcategory {
237
- width : 100%;
238
- margin-bottom : 3px;
239
- }
240
-
241
- /* contact form */
242
- .contactform_item {
243
- border-style : solid;
244
- border-width : 1px;
245
- line-height : 1;
246
- margin-bottom : 20px;
247
- padding : 0;
248
- background-color : #f5f5f5;
249
- background-image : -moz-linear-gradient(center top, #f9f9f9, #f5f5f5);
250
- border-color : #dfdfdf;
251
- border-radius : 3px 3px 3px 3px;
252
- box-shadow : 0 1px 0 #fff inset;
253
- min-width : 255px;
254
- position : relative;
255
- }
256
-
257
- .contactform_item .handlediv {
258
- position : relative;
259
- top : -4px;
260
- }
261
-
262
- .contactform_item h3 {
263
- min-height : 21px;
264
- margin : 13px;
265
- }
266
-
267
- .contactform_item .inside {
268
- padding : 10px !important;
269
- }
270
-
271
- .contactform_item .deps {
272
- display : none;
273
- }
274
-
275
- .contactform_item .addoptions p.option {
276
- margin : 5px 0 5px 200px
277
- }
278
-
279
- .contactform_item .addoptions p label {
280
- width : 80px !important;
281
- }
282
-
283
- .contactform_item .add-field-option {
284
- margin-bottom : 10px !important;
285
- }
286
-
287
- .remove_item {
288
- float : right;
289
- }
290
-
291
- .metabox-sortable-placeholder {
292
- border : 1px dotted #dedede;
293
- margin : 10px 0
294
- }
295
-
296
- /* features tab */
297
- .featurestab_item {
298
- border-style : solid;
299
- border-width : 1px;
300
- line-height : 1;
301
- margin-bottom : 20px;
302
- padding : 0;
303
- background-color : #f5f5f5;
304
- background-image : -moz-linear-gradient(center top, #f9f9f9, #f5f5f5);
305
- border-color : #dfdfdf;
306
- border-radius : 3px 3px 3px 3px;
307
- box-shadow : 0 1px 0 #fff inset;
308
- min-width : 255px;
309
- position : relative;
310
- }
311
-
312
- .featurestab_item .handlediv {
313
- position : relative;
314
- top : -4px;
315
- }
316
-
317
- .featurestab_item h3 {
318
- min-height : 21px
319
- }
320
-
321
- .featurestab_item .inside {
322
- padding : 10px !important;
323
- }
324
-
325
- .featurestab_item .deps {
326
- display : none;
327
- }
328
-
329
- .featurestab_item .addoptions p.option {
330
- margin : 5px 0 5px 200px
331
- }
332
-
333
- .featurestab_item .addoptions p label {
334
- width : 80px !important;
335
- }
336
-
337
- .featurestab_item .add-field-option {
338
- margin-bottom : 10px !important;
339
- }
340
-
341
- .messages-panel.updated {
342
- margin : 10px 0px 10px !important;
343
- max-width : 1200px;
344
- border-radius : 5px;
345
- -webkit-box-sizing : border-box;
346
- box-sizing : border-box;
347
- }
348
-
349
- .ui-widget-overlay {
350
- background-image : none !important;
351
- }
352
-
353
- .the-metabox .icon_type {
354
- width : 30%;
355
- float : left;
356
- margin-right : 40px
357
- }
358
-
359
- #post-type-settings .category-list label {
360
- width : 187px;
361
- }
362
-
363
- .remove_cat {
364
- float : right;
365
- text-align : center;
366
- display : block;
367
- width : 20px;
368
- height : 20px;
369
- border-radius : 20px;
370
- font-weight : bold;
371
- font-size : 10px;
372
- background : #efefef;
373
- text-decoration : none;
374
- }
375
-
376
- /* typography */
377
- .the-metabox.typography .select_wrapper.font-family {
378
- width : 200px;
379
- }
380
-
381
- .the-metabox.typography .spinner_container {
382
- float : left;
383
- margin-right : 10px;
384
- }
385
-
386
- .the-metabox.typography .spinner_container input.number {
387
- width : 50px !important;
388
- -webkit-border-top-right-radius : 0px;
389
- -webkit-border-bottom-right-radius : 0px;
390
- -moz-border-radius-topright : 0px;
391
- -moz-border-radius-bottomright : 0px;
392
- border-top-right-radius : 0px;
393
- border-bottom-right-radius : 0px;
394
- }
395
-
396
- /* number */
397
- .the-metabox.number input.number {
398
- width : 50px !important;
399
- }
400
-
401
- /* number */
402
- .rm_number .number {
403
- width : 70px;
404
- text-align : right;
405
- -webkit-border-top-right-radius : 0px;
406
- -webkit-border-bottom-right-radius : 0px;
407
- -moz-border-radius-topright : 0px;
408
- -moz-border-radius-bottomright : 0px;
409
- border-top-right-radius : 0px;
410
- border-bottom-right-radius : 0px;
411
- }
412
-
413
- .spinner-wrapper {
414
- position : relative;
415
- height : 23px;
416
- overflow : hidden;
417
- }
418
-
419
- .spinner-wrapper input.number {
420
- float : left;
421
- }
422
-
423
- .spinner-wrapper .spinner-button {
424
- cursor : pointer;
425
- float : left;
426
- position : absolute;
427
- left : 69px;
428
- width : 15px;
429
- height : 12px;
430
- border : 1px solid #dfdfdf;
431
- background : #fff;
432
- margin : 0;
433
- padding : 0;
434
- line-height : 9999px;
435
- overflow : hidden;
436
- background : url('../images/spinner.png') no-repeat center -11px
437
- }
438
-
439
- .spinner-wrapper .spinner-button.button-plus {
440
- top : 0;
441
- -webkit-border-top-right-radius : 3px !important;
442
- -moz-border-radius-topright : 3px !important;
443
- border-top-right-radius : 3px !important;
444
- }
445
-
446
- .spinner-wrapper .spinner-button.button-minus {
447
- bottom : 0;
448
- background-position : center -30px;
449
- -webkit-border-bottom-right-radius : 3px !important;
450
- -moz-border-radius-bottomright : 3px !important;
451
- border-bottom-right-radius : 3px !important;
452
- }
453
-
454
- .spinner-wrapper .spinner-button.button-plus:active {
455
- background-position : center 0px;
456
- }
457
-
458
- .spinner-wrapper .spinner-button.button-minus:active {
459
- background-position : center -20px;
460
- }
461
-
462
- .rm_typography .spinner_container {
463
- float : left;
464
- margin-right : 10px;
465
- }
466
-
467
- .rm_typography .spinner-wrapper {
468
- height : 28px;
469
- }
470
-
471
- .rm_typography .spinner-wrapper input.number {
472
- height : 28px;
473
- }
474
-
475
- .rm_typography .spinner-wrapper .spinner-button.button-plus {
476
- height : 15px;
477
- background-position : center -10px;
478
- }
479
-
480
- .rm_typography .spinner-wrapper .spinner-button.button-minus {
481
- height : 14px;
482
- }
483
-
484
- .the-metabox .spinner-wrapper .spinner-button {
485
- left : 49px;
486
- }
487
-
488
- .the-metabox.typography .spinner-wrapper .spinner-button {
489
- left : 35px;
490
- }
491
-
492
- /* images */
493
- .the-metabox.images, .the-metabox.images label {
494
- margin-left : 0;
495
- display : block;
496
- }
497
-
498
- .the-metabox.images .slides-wrapper {
499
- clear : both;
500
- }
501
-
502
- .the-metabox.images .slides-wrapper li {
503
- position : relative;
504
- }
505
-
506
- .the-metabox.images a.delete {
507
- display : block;
508
- margin-left : 4px;
509
- text-decoration : none;
510
- font-weight : bold;
511
- color : red;
512
- position : absolute;
513
- top : 0;
514
- right : 0;
515
- width : 10px;
516
- height : 18px;
517
- z-index : 10;
518
- cursor : pointer !important;
519
- }
520
-
521
- /* wp editor */
522
- .wp_themeSkin iframe {
523
- background : #fff !important;
524
- }
525
-
526
- /* custom tabs */
527
- .customtab_item {
528
- border-style : solid;
529
- border-width : 1px;
530
- line-height : 1;
531
- margin-bottom : 20px;
532
- padding : 0;
533
- background-color : #f5f5f5;
534
- background-image : -moz-linear-gradient(center top, #f9f9f9, #f5f5f5);
535
- border-color : #dfdfdf;
536
- border-radius : 3px 3px 3px 3px;
537
- box-shadow : 0 1px 0 #fff inset;
538
- min-width : 255px;
539
- position : relative;
540
- }
541
-
542
- .customtab_item .handlediv {
543
- position : relative;
544
- top : -4px;
545
- }
546
-
547
- .customtab_item h3 {
548
- min-height : 21px
549
- }
550
-
551
- .customtab_item .inside {
552
- padding : 10px !important;
553
- }
554
-
555
- .customtab_item .deps {
556
- display : none;
557
- }
558
-
559
- .customtab_item .addoptions p.option {
560
- margin : 5px 0 5px 200px
561
- }
562
-
563
- .customtab_item .addoptions p label {
564
- width : 80px !important;
565
- }
566
-
567
- .customtab_item .add-field-option {
568
- margin-bottom : 10px !important;
569
- }
570
-
571
- .customtab_item .remove_item {
572
- float : right;
573
- }
574
-
575
- .metabox-sortable-placeholder {
576
- border : 1px dotted #dedede;
577
- margin : 10px 0
578
- }
579
-
580
- .the-metabox.customtabs {
581
- margin-left : 0;
582
- }
583
-
584
- #customtab_item_sample {
585
- display : none;
586
- }
587
-
588
- .the-metabox.customtabs .field-row {
589
- margin-bottom : 10px;
590
- }
591
-
592
- #yit_custom_tabs label {
593
- font-weight : normal;
594
- width : auto;
595
- float : none;
596
- line-height : auto;
597
- margin-left : 0;
598
- }
599
-
600
- .wp-admin p label input[type=radio] {
601
- width : 16px;
602
- margin-right : 10px;
603
- margin-top : 3px;
604
- }
605
-
606
- .wp-admin .form-field._preset_onsale_icon_field label input[type=radio] {
607
- margin-top : 0;
608
- }
609
-
610
- .the-metabox .spinner {
611
- margin-top : 5px;
612
- float : none;
613
- }
614
-
615
- /*sidebars*/
616
- #choose-sidebars.choose {
617
- margin-left : 0px;
618
- }
619
-
620
- #_active_page_options-container label, #_active_page_options-container p {
621
- display : inline-block;
622
- margin : 0px;
623
- }
624
-
625
- #_active_page_options-container label {
626
- margin-right : 10px;
627
- margin-top : 3px;
628
- }
629
-
630
- #_active_page_options-container {
631
- float : right;
632
- margin-right : 20px;
633
- margin-top : 5px;
634
- z-index : 9999 !important;
635
- position : absolute;
636
- right : 0;
637
- }
638
-
639
- /*-----------------------
640
- * Colorpicker - fix issues in combination with third-party themes or plugin (Basel, VC Addons, ...)
641
- */
642
- .metaboxes-tab .the-metabox.colorpicker {
643
- display : block;
644
- width : auto;
645
- height : auto;
646
- overflow : visible;
647
- top : auto;
648
- left : auto;
649
- background : transparent;
650
- position : static;
651
- z-index : 1;
652
- font-family : inherit;
653
  }
1
+ /* self-clear floats */
2
+ .clearfix:after {
3
+ content : ".";
4
+ display : block;
5
+ height : 0;
6
+ clear : both;
7
+ visibility : hidden;
8
+ overflow : hidden;
9
+ }
10
+
11
+ /* ie.css */
12
+ * html .clearfix { /* IE6 */
13
+ height : 1%;
14
+ }
15
+
16
+ *:first-child + html .clearfix { /* IE7 */
17
+ min-height : 1%;
18
+ }
19
+
20
+ .clearboth {
21
+ clear : both
22
+ }
23
+
24
+ /* === TAB STYLE */
25
+ .metaboxes-tab {
26
+ margin : -6px -12px -8px;
27
+ }
28
+
29
+ .metaboxes-tab div.tabs-panel {
30
+ height : auto;
31
+ overflow : visible;
32
+ margin-top : 0px;
33
+ padding : 0 10px;
34
+ background : none;
35
+ border : 0;
36
+ }
37
+
38
+ .metaboxes-tab ul.metaboxes-tabs {
39
+ background : #f1f1f1;
40
+ margin : 0;
41
+ padding : 10px 0 0 5px;
42
+ }
43
+
44
+ .metaboxes-tab ul.metaboxes-tabs li {
45
+ float : left;
46
+ background : #dedede;
47
+ margin : 0 0 0 5px;
48
+ }
49
+
50
+ .metaboxes-tab ul.metaboxes-tabs li a {
51
+ color : #555;
52
+ text-decoration : none;
53
+ padding : 8px 15px;
54
+ display : block;
55
+ box-shadow : none !important;
56
+ }
57
+
58
+ .metaboxes-tab ul.metaboxes-tabs li.tabs {
59
+ background : #fff;
60
+ }
61
+
62
+ .metaboxes-tab p.field-row {
63
+ margin : 20px 0;
64
+ }
65
+
66
+ .metaboxes-tab div.sep {
67
+ height : 1px;
68
+ background : #dfdfdf;
69
+ clear : both;
70
+ margin-left : -10px;
71
+ margin-right : -10px;
72
+ }
73
+
74
+ .metaboxes-tab label {
75
+ font-weight : bold;
76
+ width : 160px;
77
+ float : left;
78
+ line-height : 23px;
79
+ margin-left : -184px;
80
+ }
81
+
82
+ .metaboxes-tab label small {
83
+ font-weight : normal;
84
+ line-height : 15px;
85
+ font-style : italic;
86
+ color : #999;
87
+ display : block;
88
+ }
89
+
90
+ .metaboxes-tab .wp-picker-container label {
91
+ font-weight : inherit;
92
+ width : auto;
93
+ float : none;
94
+ line-height : inherit;
95
+ margin-left : 0;
96
+ }
97
+
98
+ .metaboxes-tab input[type="checkbox"] {
99
+ vertical-align : middle
100
+ }
101
+
102
+ .metaboxes-tab input.button-secondary, .metaboxes-tab input.checkbox {
103
+ width : auto;
104
+ }
105
+
106
+ .metaboxes-tab p.field-row.textarea .description {
107
+ vertical-align : top;
108
+ }
109
+
110
+ .metaboxes-tab p.field-row.checkbox {
111
+ background : none;
112
+ }
113
+
114
+ .metaboxes-tab .the-metabox {
115
+ margin : 20px 0;
116
+ margin-left : 184px;
117
+ }
118
+
119
+ .metaboxes-tab .the-metabox.no-label {
120
+ margin : 20px 0;
121
+ margin-left : 0;
122
+ }
123
+
124
+ .metaboxes-tab hr {
125
+ height : 0px;
126
+ border-top : 1px solid #dadada;
127
+ width : auto;
128
+ margin-left : -10px;
129
+ margin-right : -10px;
130
+ }
131
+
132
+ .metaboxes-tab .the-metabox p {
133
+ margin : 0;
134
+ }
135
+
136
+ .metaboxes-tab .the-metabox:last-child {
137
+ border-bottom : 0px;
138
+ }
139
+
140
+ .metaboxes-tab .the-metabox.checkbox {
141
+ background : none;
142
+ }
143
+
144
+ .metaboxes-tab span.description.inline {
145
+ display : inline-block;
146
+ line-height : 23px;
147
+ width : auto;
148
+ vertical-align : middle;
149
+ margin : 0;
150
+ }
151
+
152
+ .metaboxes-tab .slider label {
153
+ padding : 15px 0;
154
+ }
155
+
156
+ /* sortable table posts */
157
+
158
+ #the-list.ui-sortable tr:hover {
159
+ cursor : move;
160
+ }
161
+
162
+ .the-metabox.preview {
163
+ float : none;
164
+ }
165
+
166
+ .metaboxes-tab .the-metabox.no-label.preview {
167
+ margin-left : 184px;
168
+ }
169
+
170
+ .metaboxes-tab .the-metabox.no-label.preview img {
171
+ box-shadow : 0 1px 8px rgba(0, 0, 0, 0.2);
172
+ }
173
+
174
+ /**************************************
175
+ FIELDS
176
+ ***************************************/
177
+
178
+ .metaboxes-tab select,
179
+ .metaboxes-tab input[type=text],
180
+ .metaboxes-tab input[type=number],
181
+ .metaboxes-tab textarea,
182
+ .metaboxes-tab .yith-plugin-fw-select,
183
+ .metaboxes-tab .yith-plugin-fw-slider-container,
184
+ .metaboxes-tab .yith-plugin-fw-text-input,
185
+ .metaboxes-tab .yith-plugin-fw-text-array-table,
186
+ .metaboxes-tab .yith-plugin-fw-textarea {
187
+ width : 400px;
188
+ max-width : 100%;
189
+ }
190
+
191
+ .metaboxes-tab .yith-plugin-fw-text-array-table input[type=text] {
192
+ width : 100%;
193
+ }
194
+
195
+ /* wp editor */
196
+ .the-metabox.textarea-editor .mceIframeContainer {
197
+ background : #fff;
198
+ }
199
+
200
+ .the-metabox.textarea-editor label {
201
+ margin-top : 24px;
202
+ }
203
+
204
+ /* categories */
205
+ .categories-panel {
206
+ width : 30%;
207
+ float : left;
208
+ margin-right : 4px;
209
+ }
210
+
211
+ .categories-panel .box {
212
+ height : 200px;
213
+ border : 1px solid #dfdfdf;
214
+ background : #fff;
215
+ padding : 6px 10px;
216
+ overflow : auto;
217
+ }
218
+
219
+ .categories-panel ul {
220
+ list-style : none;
221
+ margin : 0;
222
+ }
223
+
224
+ .categories-panel ul li {
225
+ line-height : 19px;
226
+ margin : 0;
227
+ padding : 0;
228
+ word-wrap : break-word;
229
+ }
230
+
231
+ .categories-panel ul li label {
232
+ font-weight : normal !important;
233
+ margin-left : 0 !important;
234
+ }
235
+
236
+ .categories-panel input.newcategory {
237
+ width : 100%;
238
+ margin-bottom : 3px;
239
+ }
240
+
241
+ /* contact form */
242
+ .contactform_item {
243
+ border-style : solid;
244
+ border-width : 1px;
245
+ line-height : 1;
246
+ margin-bottom : 20px;
247
+ padding : 0;
248
+ background-color : #f5f5f5;
249
+ background-image : -moz-linear-gradient(center top, #f9f9f9, #f5f5f5);
250
+ border-color : #dfdfdf;
251
+ border-radius : 3px 3px 3px 3px;
252
+ box-shadow : 0 1px 0 #fff inset;
253
+ min-width : 255px;
254
+ position : relative;
255
+ }
256
+
257
+ .contactform_item .handlediv {
258
+ position : relative;
259
+ top : -4px;
260
+ }
261
+
262
+ .contactform_item h3 {
263
+ min-height : 21px;
264
+ margin : 13px;
265
+ }
266
+
267
+ .contactform_item .inside {
268
+ padding : 10px !important;
269
+ }
270
+
271
+ .contactform_item .deps {
272
+ display : none;
273
+ }
274
+
275
+ .contactform_item .addoptions p.option {
276
+ margin : 5px 0 5px 200px
277
+ }
278
+
279
+ .contactform_item .addoptions p label {
280
+ width : 80px !important;
281
+ }
282
+
283
+ .contactform_item .add-field-option {
284
+ margin-bottom : 10px !important;
285
+ }
286
+
287
+ .remove_item {
288
+ float : right;
289
+ }
290
+
291
+ .metabox-sortable-placeholder {
292
+ border : 1px dotted #dedede;
293
+ margin : 10px 0
294
+ }
295
+
296
+ /* features tab */
297
+ .featurestab_item {
298
+ border-style : solid;
299
+ border-width : 1px;
300
+ line-height : 1;
301
+ margin-bottom : 20px;
302
+ padding : 0;
303
+ background-color : #f5f5f5;
304
+ background-image : -moz-linear-gradient(center top, #f9f9f9, #f5f5f5);
305
+ border-color : #dfdfdf;
306
+ border-radius : 3px 3px 3px 3px;
307
+ box-shadow : 0 1px 0 #fff inset;
308
+ min-width : 255px;
309
+ position : relative;
310
+ }
311
+
312
+ .featurestab_item .handlediv {
313
+ position : relative;
314
+ top : -4px;
315
+ }
316
+
317
+ .featurestab_item h3 {
318
+ min-height : 21px
319
+ }
320
+
321
+ .featurestab_item .inside {
322
+ padding : 10px !important;
323
+ }
324
+
325
+ .featurestab_item .deps {
326
+ display : none;
327
+ }
328
+
329
+ .featurestab_item .addoptions p.option {
330
+ margin : 5px 0 5px 200px
331
+ }
332
+
333
+ .featurestab_item .addoptions p label {
334
+ width : 80px !important;
335
+ }
336
+
337
+ .featurestab_item .add-field-option {
338
+ margin-bottom : 10px !important;
339
+ }
340
+
341
+ .messages-panel.updated {
342
+ margin : 10px 0px 10px !important;
343
+ max-width : 1200px;
344
+ border-radius : 5px;
345
+ -webkit-box-sizing : border-box;
346
+ box-sizing : border-box;
347
+ }
348
+
349
+ .ui-widget-overlay {
350
+ background-image : none !important;
351
+ }
352
+
353
+ .the-metabox .icon_type {
354
+ width : 30%;
355
+ float : left;
356
+ margin-right : 40px
357
+ }
358
+
359
+ #post-type-settings .category-list label {
360
+ width : 187px;
361
+ }
362
+
363
+ .remove_cat {
364
+ float : right;
365
+ text-align : center;
366
+ display : block;
367
+ width : 20px;
368
+ height : 20px;
369
+ border-radius : 20px;
370
+ font-weight : bold;
371
+ font-size : 10px;
372
+ background : #efefef;
373
+ text-decoration : none;
374
+ }
375
+
376
+ /* typography */
377
+ .the-metabox.typography .select_wrapper.font-family {
378
+ width : 200px;
379
+ }
380
+
381
+ .the-metabox.typography .spinner_container {
382
+ float : left;
383
+ margin-right : 10px;
384
+ }
385
+
386
+ .the-metabox.typography .spinner_container input.number {
387
+ width : 50px !important;
388
+ -webkit-border-top-right-radius : 0px;
389
+ -webkit-border-bottom-right-radius : 0px;
390
+ -moz-border-radius-topright : 0px;
391
+ -moz-border-radius-bottomright : 0px;
392
+ border-top-right-radius : 0px;
393
+ border-bottom-right-radius : 0px;
394
+ }
395
+
396
+ /* number */
397
+ .the-metabox.number input.number {
398
+ width : 50px !important;
399
+ }
400
+
401
+ /* number */
402
+ .rm_number .number {
403
+ width : 70px;
404
+ text-align : right;
405
+ -webkit-border-top-right-radius : 0px;
406
+ -webkit-border-bottom-right-radius : 0px;
407
+ -moz-border-radius-topright : 0px;
408
+ -moz-border-radius-bottomright : 0px;
409
+ border-top-right-radius : 0px;
410
+ border-bottom-right-radius : 0px;
411
+ }
412
+
413
+ .spinner-wrapper {
414
+ position : relative;
415
+ height : 23px;
416
+ overflow : hidden;
417
+ }
418
+
419
+ .spinner-wrapper input.number {
420
+ float : left;
421
+ }
422
+
423
+ .spinner-wrapper .spinner-button {
424
+ cursor : pointer;
425
+ float : left;
426
+ position : absolute;
427
+ left : 69px;
428
+ width : 15px;
429
+ height : 12px;
430
+ border : 1px solid #dfdfdf;
431
+ background : #fff;
432
+ margin : 0;
433
+ padding : 0;
434
+ line-height : 9999px;
435
+ overflow : hidden;
436
+ background : url('../images/spinner.png') no-repeat center -11px
437
+ }
438
+
439
+ .spinner-wrapper .spinner-button.button-plus {
440
+ top : 0;
441
+ -webkit-border-top-right-radius : 3px !important;
442
+ -moz-border-radius-topright : 3px !important;
443
+ border-top-right-radius : 3px !important;
444
+ }
445
+
446
+ .spinner-wrapper .spinner-button.button-minus {
447
+ bottom : 0;
448
+ background-position : center -30px;
449
+ -webkit-border-bottom-right-radius : 3px !important;
450
+ -moz-border-radius-bottomright : 3px !important;
451
+ border-bottom-right-radius : 3px !important;
452
+ }
453
+
454
+ .spinner-wrapper .spinner-button.button-plus:active {
455
+ background-position : center 0px;
456
+ }
457
+
458
+ .spinner-wrapper .spinner-button.button-minus:active {
459
+ background-position : center -20px;
460
+ }
461
+
462
+ .rm_typography .spinner_container {
463
+ float : left;
464
+ margin-right : 10px;
465
+ }
466
+
467
+ .rm_typography .spinner-wrapper {
468
+ height : 28px;
469
+ }
470
+
471
+ .rm_typography .spinner-wrapper input.number {
472
+ height : 28px;
473
+ }
474
+
475
+ .rm_typography .spinner-wrapper .spinner-button.button-plus {
476
+ height : 15px;
477
+ background-position : center -10px;
478
+ }
479
+
480
+ .rm_typography .spinner-wrapper .spinner-button.button-minus {
481
+ height : 14px;
482
+ }
483
+
484
+ .the-metabox .spinner-wrapper .spinner-button {
485
+ left : 49px;
486
+ }
487
+
488
+ .the-metabox.typography .spinner-wrapper .spinner-button {
489
+ left : 35px;
490
+ }
491
+
492
+ /* images */
493
+ .the-metabox.images, .the-metabox.images label {
494
+ margin-left : 0;
495
+ display : block;
496
+ }
497
+
498
+ .the-metabox.images .slides-wrapper {
499
+ clear : both;
500
+ }
501
+
502
+ .the-metabox.images .slides-wrapper li {
503
+ position : relative;
504
+ }
505
+
506
+ .the-metabox.images a.delete {
507
+ display : block;
508
+ margin-left : 4px;
509
+ text-decoration : none;
510
+ font-weight : bold;
511
+ color : red;
512
+ position : absolute;
513
+ top : 0;
514
+ right : 0;
515
+ width : 10px;
516
+ height : 18px;
517
+ z-index : 10;
518
+ cursor : pointer !important;
519
+ }
520
+
521
+ /* wp editor */
522
+ .wp_themeSkin iframe {
523
+ background : #fff !important;
524
+ }
525
+
526
+ /* custom tabs */
527
+ .customtab_item {
528
+ border-style : solid;
529
+ border-width : 1px;
530
+ line-height : 1;
531
+ margin-bottom : 20px;
532
+ padding : 0;
533
+ background-color : #f5f5f5;
534
+ background-image : -moz-linear-gradient(center top, #f9f9f9, #f5f5f5);
535
+ border-color : #dfdfdf;
536
+ border-radius : 3px 3px 3px 3px;
537
+ box-shadow : 0 1px 0 #fff inset;
538
+ min-width : 255px;
539
+ position : relative;
540
+ }
541
+
542
+ .customtab_item .handlediv {
543
+ position : relative;
544
+ top : -4px;
545
+ }
546
+
547
+ .customtab_item h3 {
548
+ min-height : 21px
549
+ }
550
+
551
+ .customtab_item .inside {
552
+ padding : 10px !important;
553
+ }
554
+
555
+ .customtab_item .deps {
556
+ display : none;
557
+ }
558
+
559
+ .customtab_item .addoptions p.option {
560
+ margin : 5px 0 5px 200px
561
+ }
562
+
563
+ .customtab_item .addoptions p label {
564
+ width : 80px !important;
565
+ }
566
+
567
+ .customtab_item .add-field-option {
568
+ margin-bottom : 10px !important;
569
+ }
570
+
571
+ .customtab_item .remove_item {
572
+ float : right;
573
+ }
574
+
575
+ .metabox-sortable-placeholder {
576
+ border : 1px dotted #dedede;
577
+ margin : 10px 0
578
+ }
579
+
580
+ .the-metabox.customtabs {
581
+ margin-left : 0;
582
+ }
583
+
584
+ #customtab_item_sample {
585
+ display : none;
586
+ }
587
+
588
+ .the-metabox.customtabs .field-row {
589
+ margin-bottom : 10px;
590
+ }
591
+
592
+ #yit_custom_tabs label {
593
+ font-weight : normal;
594
+ width : auto;
595
+ float : none;
596
+ line-height : auto;
597
+ margin-left : 0;
598
+ }
599
+
600
+ .wp-admin p label input[type=radio] {
601
+ width : 16px;
602
+ margin-right : 10px;
603
+ margin-top : 3px;
604
+ }
605
+
606
+ .wp-admin .form-field._preset_onsale_icon_field label input[type=radio] {
607
+ margin-top : 0;
608
+ }
609
+
610
+ .the-metabox .spinner {
611
+ margin-top : 5px;
612
+ float : none;
613
+ }
614
+
615
+ /*sidebars*/
616
+ #choose-sidebars.choose {
617
+ margin-left : 0px;
618
+ }
619
+
620
+ #_active_page_options-container label, #_active_page_options-container p {
621
+ display : inline-block;
622
+ margin : 0px;
623
+ }
624
+
625
+ #_active_page_options-container label {
626
+ margin-right : 10px;
627
+ margin-top : 3px;
628
+ }
629
+
630
+ #_active_page_options-container {
631
+ float : right;
632
+ margin-right : 20px;
633
+ margin-top : 5px;
634
+ z-index : 9999 !important;
635
+ position : absolute;
636
+ right : 0;
637
+ }
638
+
639
+ /*-----------------------
640
+ * Colorpicker - fix issues in combination with third-party themes or plugin (Basel, VC Addons, ...)
641
+ */
642
+ .metaboxes-tab .the-metabox.colorpicker {
643
+ display : block;
644
+ width : auto;
645
+ height : auto;
646
+ overflow : visible;
647
+ top : auto;
648
+ left : auto;
649
+ background : transparent;
650
+ position : static;
651
+ z-index : 1;
652
+ font-family : inherit;
653
  }
plugin-fw/assets/css/yit-plugin-panel.css CHANGED
@@ -1,481 +1,482 @@
1
- /*
2
- * This file belongs to the YIT Plugin Framework.
3
- *
4
- * This source file is subject to the GNU GENERAL PUBLIC LICENSE (GPL 3.0)
5
- * that is bundled with this package in the file LICENSE.txt.
6
- * It is also available through the world-wide-web at this URL:
7
- * http://www.gnu.org/licenses/gpl-3.0.txt
8
- */
9
- .plugin-option tr {
10
- border-bottom : 1px solid #ccc;
11
- }
12
-
13
- .plugin-option .yit_options,
14
- .plugin-option .yit-options {
15
- border-bottom : 0px;
16
- }
17
-
18
- .plugin-option .yit-options .option,
19
- .plugin-option .yit_options .option {
20
- width : 600px;
21
- float : left;
22
- }
23
-
24
- .plugin-option .form-table > tbody > tr > td {
25
- padding : 25px 10px;
26
- }
27
-
28
- .ie8 .yit_options select,
29
- .ie8 .yit-options select {
30
- height : 26px;
31
- }
32
-
33
- /* Style to woocommerce panel*/
34
-
35
- #plugin-fw-wc, #yith-plugin-fw-panel {
36
- padding-top : 20px;
37
- }
38
-
39
- #plugin-fw-wc table.form-table, #yith-plugin-fw-panel table.form-table {
40
- background-color : #fff;
41
- margin-bottom : 20px;
42
- }
43
-
44
- #plugin-fw-wc table.form-table th, #yith-plugin-fw-panel table.form-table th {
45
- padding : 20px;
46
- }
47
-
48
- #plugin-fw-wc h3, #yith-plugin-fw-panel h3 {
49
- padding : 0 0 0 10px;
50
- margin : 0;
51
- }
52
-
53
- /* === Plugins Upgrader === */
54
-
55
- .yit-plugin-changelog-wrapper {
56
- display : none;
57
- }
58
-
59
- .yit-plugin-changelog-title {
60
- text-transform : uppercase;
61
- }
62
-
63
- .yit-plugin-changelog {
64
- height : calc(100% - 15px);
65
- width : calc(100% - 15px);
66
- overflow-x : hidden;
67
- overflow-y : auto;
68
- z-index : 999;
69
- background : #fcfcfc;
70
- }
71
-
72
- /* === Plugins Licence Activation === */
73
-
74
- .yit-container.plugin-licence-activation {
75
- font-family : 'Raleway', sans-serif;
76
- }
77
-
78
- .yit-container.plugin-licence-activation .to-active-wrapper {
79
- margin-bottom : 60px;
80
- }
81
-
82
- .yit-container.plugin-licence-activation .to-active-wrapper form.to-active-form {
83
- position : relative;
84
- border-color : #e1e1e1;
85
- border-style : solid;
86
- border-width : 0;
87
- }
88
-
89
- .yit-container.plugin-licence-activation .to-active-wrapper form.to-active-form:first-child {
90
- border-top-width : 1px;
91
- }
92
-
93
- .yit-container.plugin-licence-activation .to-active-wrapper form.to-active-form:last-child {
94
- border-bottom-width : 1px;
95
- }
96
-
97
- .yit-container.plugin-licence-activation .to-active-wrapper table.to-active-table {
98
- border-width : 0;
99
- border-spacing : 0;
100
- width : 100%;
101
- }
102
-
103
- .yit-container.plugin-licence-activation .message {
104
- display : none;
105
- line-height : normal;
106
- background : #fff url(../images/licence-error.png) 15px center no-repeat;
107
- padding-left : 65px;
108
- padding-right : 15px;
109
- width : 150px;
110
- }
111
-
112
- .yit-container.plugin-licence-activation .message-wrapper {
113
- height : 75px;
114
- display : none;
115
- position : absolute;
116
- top : 0;
117
- right : -250px;
118
- border : 1px solid #ff3838;
119
- }
120
-
121
- .yit-container.plugin-licence-activation .message-wrapper.visible {
122
- display : table;
123
- }
124
-
125
- .yit-container.plugin-licence-activation .message {
126
- display : table-cell;
127
- vertical-align : middle;
128
- }
129
-
130
- .yit-container.plugin-licence-activation .arrow-left:after,
131
- .yit-container.plugin-licence-activation .arrow-left:before {
132
- content : "";
133
- display : block;
134
- width : 0;
135
- height : 0;
136
- position : absolute;
137
- }
138
-
139
- .yit-container.plugin-licence-activation .arrow-left:before {
140
- border-top : 9px solid transparent;
141
- border-bottom : 9px solid transparent;
142
- border-right : 9px solid #ff3838;
143
- top : 26px;
144
- left : -9px;
145
- }
146
-
147
- .yit-container.plugin-licence-activation .arrow-left:after {
148
- border-top : 8px solid transparent;
149
- border-bottom : 8px solid transparent;
150
- border-right : 8px solid #fff;
151
- left : -8px;
152
- top : 27px;
153
- }
154
-
155
- .yit-container.plugin-licence-activation h2,
156
- .yit-container.plugin-licence-activation h3 {
157
- text-transform : uppercase;
158
- font-weight : 800;
159
- margin-bottom : 30px;
160
- }
161
-
162
- .yit-container.plugin-licence-activation h2 {
163
- color : #808a97;
164
- font-size : 25px;
165
- }
166
-
167
- .yit-container.plugin-licence-activation h3 {
168
- color : #313131;
169
- font-size : 15px;
170
- height : 20px;
171
- }
172
-
173
- .yit-container.plugin-licence-activation h3.to-active {
174
- height : 20px;
175
- position : relative;
176
- vertical-align : top;
177
- }
178
-
179
- .yit-container.plugin-licence-activation .spinner.show {
180
- display : inline-block;
181
- vertical-align : middle;
182
- float : none;
183
- }
184
-
185
- .yit-container.plugin-licence-activation h3.to-active > .spinner.show {
186
- display : inline-block;
187
- float : none;
188
- top : -3px;
189
- position : relative;
190
- }
191
-
192
- .yit-container.plugin-licence-activation .licence-check-section {
193
- margin-bottom : 60px;
194
- }
195
-
196
- .yit-container.plugin-licence-activation span.licence-label {
197
- font-weight : 500;
198
- color : #606060;
199
- margin-bottom : 30px;
200
- }
201
-
202
- .yit-container.plugin-licence-activation .button-licence {
203
- border : 0;
204
- font-size : 13px;
205
- text-transform : uppercase;
206
- background-color : #808a97;
207
- color : #fff;
208
- font-weight : 700;
209
- border-radius : 3px;
210
- cursor : pointer;
211
- text-decoration : none;
212
- padding : 5px 7px;
213
- -webkit-transition : background-color 0.3s ease;
214
- -moz-transition : background-color 0.3s ease;
215
- -ms-transition : background-color 0.3s ease;
216
- -o-transition : background-color 0.3s ease;
217
- transition : background-color 0.3s ease;
218
- }
219
-
220
- .yit-container.plugin-licence-activation .button-licence:hover {
221
- background-color : #4d5c6f;
222
- }
223
-
224
- .yit-container.plugin-licence-activation .button-licence.clicked {
225
- cursor : not-allowed;
226
- background-color : #e2e2e2 !important;
227
- }
228
-
229
- .yit-container.plugin-licence-activation .button-licence.licence-check {
230
- font-weight : 400;
231
- padding : 12px 19px;
232
- }
233
-
234
- .yit-container.plugin-licence-activation .button-licence.licence-renew {
235
- text-decoration : none;
236
- padding : 7px 12px;
237
- font-size : 9px;
238
- }
239
-
240
- .yit-container.plugin-licence-activation .button-licence.licence-renew:focus {
241
- box-shadow : none;
242
- }
243
-
244
- .yit-container.plugin-licence-activation table:not(.to-active-table) {
245
- width : 100%;
246
- border : 1px solid #dcdcdc;
247
- border-spacing : 0;
248
- border-radius : 5px;
249
- border-collapse : separate;
250
- overflow : hidden;
251
- }
252
-
253
- .yit-container.plugin-licence-activation table:not(.to-active-table) th {
254
- border-bottom : 1px solid #dcdcdc;
255
- }
256
-
257
- .yit-container.plugin-licence-activation table:not(.to-active-table) td,
258
- .yit-container.plugin-licence-activation table:not(.to-active-table) th {
259
- border-right : 1px solid #dcdcdc;
260
- }
261
-
262
- .yit-container.plugin-licence-activation table td:last-child,
263
- .yit-container.plugin-licence-activation table th:last-child {
264
- border-right : 0;
265
- }
266
-
267
- .yit-container.plugin-licence-activation table thead tr {
268
- background-color : #f6f4f4;
269
- }
270
-
271
- .yit-container.plugin-licence-activation table tbody tr {
272
- background-color : #fff;
273
- }
274
-
275
- .yit-container.plugin-licence-activation table thead tr th {
276
- font-size : 13px;
277
- color : #313131;
278
- text-transform : uppercase;
279
- font-weight : bold;
280
- }
281
-
282
- .yit-container.plugin-licence-activation table thead tr,
283
- .yit-container.plugin-licence-activation table tbody tr {
284
- line-height : 60px;
285
- }
286
-
287
- .yit-container.plugin-licence-activation table tbody tr td {
288
- text-align : center;
289
- line-height : 20px;
290
- padding : 10px 5px;
291
- }
292
-
293
- .yit-container.plugin-licence-activation .button-licence.licence-activation {
294
- padding : 12px 18px;
295
- }
296
-
297
- .yit-container.plugin-licence-activation .to-active-table tr {
298
- line-height : 75px;
299
- }
300
-
301
- .yit-container.plugin-licence-activation .to-active-table tr.plugin-row {
302
- background-color : transparent;
303
- -webkit-transition : all 0.3s ease;
304
- -moz-transition : all 0.3s ease;
305
- -ms-transition : all 0.3s ease;
306
- -o-transition : all 0.3s ease;
307
- transition : all 0.3s ease;
308
- }
309
-
310
- .yit-container.plugin-licence-activation .to-active-table tr.plugin-row.error {
311
- background-color : #ffdcdc;
312
- }
313
-
314
- .yit-container.plugin-licence-activation .to-active-table td {
315
- padding-right : 12px;
316
- width : 33%;
317
- }
318
-
319
- .yit-container.plugin-licence-activation .to-active-table td.plugin-name {
320
- color : #808a97;
321
- font-size : 12px;
322
- text-transform : uppercase;
323
- font-weight : bold;
324
- line-height : 20px;
325
- width : 20%;
326
- padding-left : 20px;
327
- }
328
-
329
- .yit-container.plugin-licence-activation .to-active-table td.activate-button {
330
- width : 15%;
331
- position : relative;
332
- }
333
-
334
- .yit-container.plugin-licence-activation input[type=text],
335
- .yit-container.plugin-licence-activation input[type=email] {
336
- -webkit-transition : all 0.3s ease;
337
- -moz-transition : all 0.3s ease;
338
- -ms-transition : all 0.3s ease;
339
- -o-transition : all 0.3s ease;
340
- transition : all 0.3s ease;
341
-
342
- border : 1px solid #dcdcdc;
343
- padding : 0 15px;
344
- border-radius : 3px;
345
- height : 41px;
346
- width : 100%;
347
- }
348
-
349
- .yit-container.plugin-licence-activation input[type=text].require,
350
- .yit-container.plugin-licence-activation input[type=email].require {
351
- border : 1px solid #ff3838;
352
- }
353
-
354
- .yit-container.plugin-licence-activation input[type=text]:focus,
355
- .yit-container.plugin-licence-activation input[type=email]:focus {
356
- webkit-box-shadow : 0 0 1px rgba(30, 140, 190, .8);
357
- box-shadow : 0 0 1px rgba(30, 140, 190, .8);
358
- }
359
-
360
- .yit-container.plugin-licence-activation input[type=text] {
361
- text-transform : uppercase;
362
- text-align : center;
363
- }
364
-
365
- .yit-container.plugin-licence-activation input[type=email] {
366
- text-align : left;
367
- }
368
-
369
- .yit-container.plugin-licence-activation input[type=submit]:focus {
370
- outline : 0;
371
- }
372
-
373
- /* === Woocommerce panel === */
374
- #plugin-fw-wc .yit_options {
375
- padding : 0;
376
- border : 0;
377
- }
378
-
379
- #plugin-fw-wc .yit_options input.upload_button, .yit_options input.button {
380
- background : none;
381
- border : 1px solid #ccc;
382
- }
383
-
384
- /* === WP Pointers === */
385
-
386
- #adminmenu li.menu-top.yit-pointer-selected-row,
387
- #adminmenu li.menu-top.yit-pointer-selected-row:hover,
388
- #adminmenu li.yit-pointer-selected-row a.menu-top {
389
- background-color : #acc327;
390
- color : #000;
391
- }
392
-
393
- #adminmenu a.menu-top.toplevel_page_yit_plugin_panel.yit-pointer {
394
- color : #000;
395
- }
396
-
397
- #adminmenu a.menu-top.toplevel_page_yit_plugin_panel.yit-pointer:hover,
398
- #adminmenu .wp-submenu a.yit-pointer-selected-row {
399
- color : #fff;
400
- }
401
-
402
- #adminmenu .wp-submenu a.yit-pointer-selected-row:hover {
403
- color : #45bbe6;
404
- }
405
-
406
- /* WooCommerce 2.4 Support */
407
- .woocommerce table.form-table .colorpick {
408
- width : 6em;
409
- }
410
-
411
- #wpwrap h2.nav-tab-wrapper, #wpbody-content h2.nav-tab-wrapper {
412
- border-bottom : 1px solid #ccc;
413
- }
414
-
415
- /* === YIT FRAMEWORK === */
416
- .plugin-card .plugin-icon img {
417
- max-width : 100%;
418
- width : auto;
419
- height : auto;
420
- }
421
-
422
- /* === Panel Content and Container === */
423
- .yit-admin-panel-container {
424
- position : relative;
425
- }
426
-
427
- .yit-admin-panel-content-wrap {
428
- width : 100%;
429
- display : block;
430
- }
431
-
432
- .yith-disabled {
433
- opacity : 0.3;
434
- pointer-events : none;
435
- }
436
-
437
- .yith-plugin-fw-select,
438
- .yith-plugin-fw-slider-container,
439
- .yith-plugin-fw-text-input,
440
- .yith-plugin-fw-text-array-table,
441
- .yith-plugin-fw-textarea {
442
- width : 400px;
443
- max-width : 100%;
444
- }
445
-
446
- .yith-plugin-fw-text-array-table input {
447
- width : 100%;
448
- }
449
-
450
- .yith-plugin-fw-panel-wc-row.preview {
451
- float : none;
452
- }
453
-
454
- .yith-plugin-fw-panel .subsubsub {
455
- margin : 0;
456
- }
457
-
458
- /* === Responsive === */
459
-
460
- @media (max-width : 767px) {
461
-
462
- }
463
-
464
- @media (max-width : 480px) {
465
-
466
- }
467
-
468
- @media (min-width : 768px) and (max-width : 992px) {
469
- }
470
-
471
- @media (min-width : 980px) and (max-width : 1199px) {
472
- }
473
-
474
- @media (min-width : 1200px) {
475
- .yit-container.plugin-licence-activation {
476
- width : 900px;
477
- }
478
- }
479
-
480
- @media only screen and (-webkit-min-device-pixel-ratio : 1.5), only screen and (-o-min-device-pixel-ratio : 3/2), only screen and (min--moz-device-pixel-ratio : 1.5), only screen and (min-device-pixel-ratio : 1.5) {
481
- }
 
1
+ /*
2
+ * This file belongs to the YIT Plugin Framework.
3
+ *
4
+ * This source file is subject to the GNU GENERAL PUBLIC LICENSE (GPL 3.0)
5
+ * that is bundled with this package in the file LICENSE.txt.
6
+ * It is also available through the world-wide-web at this URL:
7
+ * http://www.gnu.org/licenses/gpl-3.0.txt
8
+ */
9
+ .plugin-option tr {
10
+ border-bottom : 1px solid #ebebeb;
11
+ }
12
+
13
+ .plugin-option .yit_options,
14
+ .plugin-option .yit-options {
15
+ border-bottom : 0px;
16
+ }
17
+
18
+ .plugin-option .yit-options .option,
19
+ .plugin-option .yit_options .option {
20
+ width : 600px;
21
+ }
22
+
23
+ .plugin-option .form-table > tbody > tr > td {
24
+ padding : 25px 15px;
25
+ }
26
+
27
+ .ie8 .yit_options select,
28
+ .ie8 .yit-options select {
29
+ height : 26px;
30
+ }
31
+
32
+ /* Style to woocommerce panel*/
33
+
34
+ #plugin-fw-wc, #yith-plugin-fw-panel {
35
+ padding-top : 20px;
36
+ }
37
+
38
+ #plugin-fw-wc table.form-table, #yith-plugin-fw-panel table.form-table {
39
+ background-color : #fff;
40
+ margin-bottom : 20px;
41
+ }
42
+
43
+ #plugin-fw-wc table.form-table th, #yith-plugin-fw-panel table.form-table th {
44
+ padding : 20px;
45
+ }
46
+
47
+ #plugin-fw-wc h3, #yith-plugin-fw-panel h3 {
48
+ padding : 0 0 0 10px;
49
+ margin : 0;
50
+ }
51
+
52
+ /* === Plugins Upgrader === */
53
+
54
+ .yit-plugin-changelog-wrapper {
55
+ display : none;
56
+ }
57
+
58
+ .yit-plugin-changelog-title {
59
+ text-transform : uppercase;
60
+ }
61
+
62
+ .yit-plugin-changelog {
63
+ height : calc(100% - 15px);
64
+ width : calc(100% - 15px);
65
+ overflow-x : hidden;
66
+ overflow-y : auto;
67
+ z-index : 999;
68
+ background : #fcfcfc;
69
+ }
70
+
71
+ /* === Plugins Licence Activation === */
72
+
73
+ .yit-container.plugin-licence-activation {
74
+ font-family : 'Raleway', sans-serif;
75
+ }
76
+
77
+ .yit-container.plugin-licence-activation .to-active-wrapper {
78
+ margin-bottom : 60px;
79
+ }
80
+
81
+ .yit-container.plugin-licence-activation .to-active-wrapper form.to-active-form {
82
+ position : relative;
83
+ border-color : #e1e1e1;
84
+ border-style : solid;
85
+ border-width : 0;
86
+ }
87
+
88
+ .yit-container.plugin-licence-activation .to-active-wrapper form.to-active-form:first-child {
89
+ border-top-width : 1px;
90
+ }
91
+
92
+ .yit-container.plugin-licence-activation .to-active-wrapper form.to-active-form:last-child {
93
+ border-bottom-width : 1px;
94
+ }
95
+
96
+ .yit-container.plugin-licence-activation .to-active-wrapper table.to-active-table {
97
+ border-width : 0;
98
+ border-spacing : 0;
99
+ width : 100%;
100
+ }
101
+
102
+ .yit-container.plugin-licence-activation .message {
103
+ display : none;
104
+ line-height : normal;
105
+ background : #fff url(../images/licence-error.png) 15px center no-repeat;
106
+ padding-left : 65px;
107
+ padding-right : 15px;
108
+ width : 150px;
109
+ }
110
+
111
+ .yit-container.plugin-licence-activation .message-wrapper {
112
+ height : 75px;
113
+ display : none;
114
+ position : absolute;
115
+ top : 0;
116
+ right : -250px;
117
+ border : 1px solid #ff3838;
118
+ }
119
+
120
+ .yit-container.plugin-licence-activation .message-wrapper.visible {
121
+ display : table;
122
+ }
123
+
124
+ .yit-container.plugin-licence-activation .message {
125
+ display : table-cell;
126
+ vertical-align : middle;
127
+ }
128
+
129
+ .yit-container.plugin-licence-activation .arrow-left:after,
130
+ .yit-container.plugin-licence-activation .arrow-left:before {
131
+ content : "";
132
+ display : block;
133
+ width : 0;
134
+ height : 0;
135
+ position : absolute;
136
+ }
137
+
138
+ .yit-container.plugin-licence-activation .arrow-left:before {
139
+ border-top : 9px solid transparent;
140
+ border-bottom : 9px solid transparent;
141
+ border-right : 9px solid #ff3838;
142
+ top : 26px;
143
+ left : -9px;
144
+ }
145
+
146
+ .yit-container.plugin-licence-activation .arrow-left:after {
147
+ border-top : 8px solid transparent;
148
+ border-bottom : 8px solid transparent;
149
+ border-right : 8px solid #fff;
150
+ left : -8px;
151
+ top : 27px;
152
+ }
153
+
154
+ .yit-container.plugin-licence-activation h2,
155
+ .yit-container.plugin-licence-activation h3 {
156
+ text-transform : uppercase;
157
+ font-weight : 800;
158
+ margin-bottom : 30px;
159
+ }
160
+
161
+ .yit-container.plugin-licence-activation h2 {
162
+ color : #808a97;
163
+ font-size : 25px;
164
+ }
165
+
166
+ .yit-container.plugin-licence-activation h3 {
167
+ color : #313131;
168
+ font-size : 15px;
169
+ height : 20px;
170
+ }
171
+
172
+ .yit-container.plugin-licence-activation h3.to-active {
173
+ height : 20px;
174
+ position : relative;
175
+ vertical-align : top;
176
+ }
177
+
178
+ .yit-container.plugin-licence-activation .spinner.show {
179
+ display : inline-block;
180
+ vertical-align : middle;
181
+ float : none;
182
+ }
183
+
184
+ .yit-container.plugin-licence-activation h3.to-active > .spinner.show {
185
+ display : inline-block;
186
+ float : none;
187
+ top : -3px;
188
+ position : relative;
189
+ }
190
+
191
+ .yit-container.plugin-licence-activation .licence-check-section {
192
+ margin-bottom : 60px;
193
+ }
194
+
195
+ .yit-container.plugin-licence-activation span.licence-label {
196
+ font-weight : 500;
197
+ color : #606060;
198
+ margin-bottom : 30px;
199
+ }
200
+
201
+ .yit-container.plugin-licence-activation .button-licence {
202
+ border : 0;
203
+ font-size : 13px;
204
+ text-transform : uppercase;
205
+ background-color : #808a97;
206
+ color : #fff;
207
+ font-weight : 700;
208
+ border-radius : 3px;
209
+ cursor : pointer;
210
+ text-decoration : none;
211
+ padding : 5px 7px;
212
+ -webkit-transition : background-color 0.3s ease;
213
+ -moz-transition : background-color 0.3s ease;
214
+ -ms-transition : background-color 0.3s ease;
215
+ -o-transition : background-color 0.3s ease;
216
+ transition : background-color 0.3s ease;
217
+ }
218
+
219
+ .yit-container.plugin-licence-activation .button-licence:hover {
220
+ background-color : #4d5c6f;
221
+ }
222
+
223
+ .yit-container.plugin-licence-activation .button-licence.clicked {
224
+ cursor : not-allowed;
225
+ background-color : #e2e2e2 !important;
226
+ }
227
+
228
+ .yit-container.plugin-licence-activation .button-licence.licence-check {
229
+ font-weight : 400;
230
+ padding : 12px 19px;
231
+ }
232
+
233
+ .yit-container.plugin-licence-activation .button-licence.licence-renew {
234
+ text-decoration : none;
235
+ padding : 7px 12px;
236
+ font-size : 9px;
237
+ }
238
+
239
+ .yit-container.plugin-licence-activation .button-licence.licence-renew:focus {
240
+ box-shadow : none;
241
+ }
242
+
243
+ .yit-container.plugin-licence-activation table:not(.to-active-table) {
244
+ width : 100%;
245
+ border : 1px solid #dcdcdc;
246
+ border-spacing : 0;
247
+ border-radius : 5px;
248
+ border-collapse : separate;
249
+ overflow : hidden;
250
+ }
251
+
252
+ .yit-container.plugin-licence-activation table:not(.to-active-table) th {
253
+ border-bottom : 1px solid #dcdcdc;
254
+ }
255
+
256
+ .yit-container.plugin-licence-activation table:not(.to-active-table) td,
257
+ .yit-container.plugin-licence-activation table:not(.to-active-table) th {
258
+ border-right : 1px solid #dcdcdc;
259
+ }
260
+
261
+ .yit-container.plugin-licence-activation table td:last-child,
262
+ .yit-container.plugin-licence-activation table th:last-child {
263
+ border-right : 0;
264
+ }
265
+
266
+ .yit-container.plugin-licence-activation table thead tr {
267
+ background-color : #f6f4f4;
268
+ }
269
+
270
+ .yit-container.plugin-licence-activation table tbody tr {
271
+ background-color : #fff;
272
+ }
273
+
274
+ .yit-container.plugin-licence-activation table thead tr th {
275
+ font-size : 13px;
276
+ color : #313131;
277
+ text-transform : uppercase;
278
+ font-weight : bold;
279
+ }
280
+
281
+ .yit-container.plugin-licence-activation table thead tr,
282
+ .yit-container.plugin-licence-activation table tbody tr {
283
+ line-height : 60px;
284
+ }
285
+
286
+ .yit-container.plugin-licence-activation table tbody tr td {
287
+ text-align : center;
288
+ line-height : 20px;
289
+ padding : 10px 5px;
290
+ }
291
+
292
+ .yit-container.plugin-licence-activation .button-licence.licence-activation {
293
+ padding : 12px 18px;
294
+ }
295
+
296
+ .yit-container.plugin-licence-activation .to-active-table tr {
297
+ line-height : 75px;
298
+ }
299
+
300
+ .yit-container.plugin-licence-activation .to-active-table tr.plugin-row {
301
+ background-color : transparent;
302
+ -webkit-transition : all 0.3s ease;
303
+ -moz-transition : all 0.3s ease;
304
+ -ms-transition : all 0.3s ease;
305
+ -o-transition : all 0.3s ease;
306
+ transition : all 0.3s ease;
307
+ }
308
+
309
+ .yit-container.plugin-licence-activation .to-active-table tr.plugin-row.error {
310
+ background-color : #ffdcdc;
311
+ }
312
+
313
+ .yit-container.plugin-licence-activation .to-active-table td {
314
+ padding-right : 12px;
315
+ width : 33%;
316
+ }
317
+
318
+ .yit-container.plugin-licence-activation .to-active-table td.plugin-name {
319
+ color : #808a97;
320
+ font-size : 12px;
321
+ text-transform : uppercase;
322
+ font-weight : bold;
323
+ line-height : 20px;
324
+ width : 20%;
325
+ padding-left : 20px;
326
+ }
327
+
328
+ .yit-container.plugin-licence-activation .to-active-table td.activate-button {
329
+ width : 15%;
330
+ position : relative;
331
+ }
332
+
333
+ .yit-container.plugin-licence-activation input[type=text],
334
+ .yit-container.plugin-licence-activation input[type=email] {
335
+ -webkit-transition : all 0.3s ease;
336
+ -moz-transition : all 0.3s ease;
337
+ -ms-transition : all 0.3s ease;
338
+ -o-transition : all 0.3s ease;
339
+ transition : all 0.3s ease;
340
+
341
+ border : 1px solid #dcdcdc;
342
+ padding : 0 15px;
343
+ border-radius : 3px;
344
+ height : 41px;
345
+ width : 100%;
346
+ }
347
+
348
+ .yit-container.plugin-licence-activation input[type=text].require,
349
+ .yit-container.plugin-licence-activation input[type=email].require {
350
+ border : 1px solid #ff3838;
351
+ }
352
+
353
+ .yit-container.plugin-licence-activation input[type=text]:focus,
354
+ .yit-container.plugin-licence-activation input[type=email]:focus {
355
+ webkit-box-shadow : 0 0 1px rgba(30, 140, 190, .8);
356
+ box-shadow : 0 0 1px rgba(30, 140, 190, .8);
357
+ }
358
+
359
+ .yit-container.plugin-licence-activation input[type=text] {
360
+ text-transform : uppercase;
361
+ text-align : center;
362
+ }
363
+
364
+ .yit-container.plugin-licence-activation input[type=email] {
365
+ text-align : left;
366
+ }
367
+
368
+ .yit-container.plugin-licence-activation input[type=submit]:focus {
369
+ outline : 0;
370
+ }
371
+
372
+ /* === Woocommerce panel === */
373
+ #plugin-fw-wc .yit_options {
374
+ padding : 0;
375
+ border : 0;
376
+ }
377
+
378
+ #plugin-fw-wc .yit_options input.upload_button, .yit_options input.button {
379
+ background : none;
380
+ border : 1px solid #ccc;
381
+ }
382
+
383
+ /* === WP Pointers === */
384
+
385
+ #adminmenu li.menu-top.yit-pointer-selected-row,
386
+ #adminmenu li.menu-top.yit-pointer-selected-row:hover,
387
+ #adminmenu li.yit-pointer-selected-row a.menu-top {
388
+ background-color : #acc327;
389
+ color : #000;
390
+ }
391
+
392
+ #adminmenu a.menu-top.toplevel_page_yit_plugin_panel.yit-pointer {
393
+ color : #000;
394
+ }
395
+
396
+ #adminmenu a.menu-top.toplevel_page_yit_plugin_panel.yit-pointer:hover,
397
+ #adminmenu .wp-submenu a.yit-pointer-selected-row {
398
+ color : #fff;
399
+ }
400
+
401
+ #adminmenu .wp-submenu a.yit-pointer-selected-row:hover {
402
+ color : #45bbe6;
403
+ }
404
+
405
+ /* WooCommerce 2.4 Support */
406
+ .woocommerce table.form-table .colorpick {
407
+ width : 6em;
408
+ }
409
+
410
+ #wpwrap h2.nav-tab-wrapper, #wpbody-content h2.nav-tab-wrapper {
411
+ border-bottom : 1px solid #ccc;
412
+ margin-right: 15px;
413
+ }
414
+
415
+ /* === YIT FRAMEWORK === */
416
+ .plugin-card .plugin-icon img {
417
+ max-width : 100%;
418
+ width : auto;
419
+ height : auto;
420
+ }
421
+
422
+ /* === Panel Content and Container === */
423
+ .yit-admin-panel-container {
424
+ position : relative;
425
+ margin-right: 15px;
426
+ }
427
+
428
+ .yit-admin-panel-content-wrap {
429
+ width : 100%;
430
+ display : block;
431
+ }
432
+
433
+ .yith-disabled {
434
+ opacity : 0.3;
435
+ pointer-events : none;
436
+ }
437
+
438
+ .yith-plugin-fw-select,
439
+ .yith-plugin-fw-slider-container,
440
+ .yith-plugin-fw-text-input,
441
+ .yith-plugin-fw-text-array-table,
442
+ .yith-plugin-fw-textarea {
443
+ width : 400px;
444
+ max-width : 100%;
445
+ }
446
+
447
+ .yith-plugin-fw-text-array-table input {
448
+ width : 100%;
449
+ }
450
+
451
+ .yith-plugin-fw-panel-wc-row.preview {
452
+ float : none;
453
+ }
454
+
455
+ .yith-plugin-fw-panel .subsubsub {
456
+ margin : 0;
457
+ }
458
+
459
+ /* === Responsive === */
460
+
461
+ @media (max-width : 767px) {
462
+
463
+ }
464
+
465
+ @media (max-width : 480px) {
466
+
467
+ }
468
+
469
+ @media (min-width : 768px) and (max-width : 992px) {
470
+ }
471
+
472
+ @media (min-width : 980px) and (max-width : 1199px) {
473
+ }
474
+
475
+ @media (min-width : 1200px) {
476
+ .yit-container.plugin-licence-activation {
477
+ width : 900px;
478
+ }
479
+ }
480
+
481
+ @media only screen and (-webkit-min-device-pixel-ratio : 1.5), only screen and (-o-min-device-pixel-ratio : 3/2), only screen and (min--moz-device-pixel-ratio : 1.5), only screen and (min-device-pixel-ratio : 1.5) {
482
+ }
plugin-fw/assets/css/yit-upgrade-to-pro.css CHANGED
@@ -1,77 +1,77 @@
1
- /* === Upgrade to Premium Landing page === */
2
-
3
- #upgrade-to-premium{
4
- width: 900px;
5
- }
6
- #upgrade-to-premium h1{
7
- font-family: 'Raleway',san-serif;
8
- text-transform: uppercase;
9
- font-size: 30px;
10
- font-weight: 700;
11
- color: #808a97;
12
- }
13
-
14
- #upgrade-to-premium h3{
15
- font-family: 'Raleway',san-serif;
16
- font-size: 20px;
17
- line-height: 29px;
18
- font-weight: 700;
19
- color: #808a97;
20
- }
21
-
22
- #upgrade-to-premium p{
23
- font-family: 'Open Sans',san-serif;
24
- font-size: 15px;
25
- line-height: 29px;
26
- font-weight: 400;
27
- color: #6a6a6b;
28
- }
29
- #upgrade-to-premium p.highlighted{
30
- font-family: 'Raleway',san-serif;
31
- font-size: 20px;
32
- line-height: 27px;
33
- color: #808a97;
34
- font-weight: 400;
35
- }
36
- #upgrade-to-premium ol{
37
- counter-reset: item;
38
- list-style-type: none;
39
- margin-left: 0;
40
- }
41
- #upgrade-to-premium li.step{
42
- font-family: 'open sans',san-serif;
43
- font-size: 15px;
44
- color: #6a6a6b;
45
- font-weight: 400;
46
- position: relative;
47
- padding-left: 50px;
48
- line-height: 25px;
49
- margin-bottom: 25px;
50
- }
51
- #upgrade-to-premium li.step:before{
52
- content: counters(item, ".") " ";
53
- counter-increment: item;
54
- position: absolute;
55
- left: 0;
56
- top: 0;
57
- border: 1px solid #808a97;
58
- width: 30px;
59
- height: 30px;
60
- border-radius: 16px;
61
- background-color: #808a97;
62
- color: #ffffff;
63
- font-weight: 700;
64
- font-size: 18px;
65
- text-align: center;
66
- line-height: 27px;
67
- }
68
- #upgrade-to-premium li.step img{
69
- border: 1px solid #b8b8b8;
70
- width: 600px;
71
- display: block;
72
- margin: 15px 0 25px 0;
73
- }
74
-
75
- #cboxLoadedContent {
76
- margin-bottom: 60px!important;
77
  }
1
+ /* === Upgrade to Premium Landing page === */
2
+
3
+ #upgrade-to-premium{
4
+ width: 900px;
5
+ }
6
+ #upgrade-to-premium h1{
7
+ font-family: 'Raleway',san-serif;
8
+ text-transform: uppercase;
9
+ font-size: 30px;
10
+ font-weight: 700;
11
+ color: #808a97;
12
+ }
13
+
14
+ #upgrade-to-premium h3{
15
+ font-family: 'Raleway',san-serif;
16
+ font-size: 20px;
17
+ line-height: 29px;
18
+ font-weight: 700;
19
+ color: #808a97;
20
+ }
21
+
22
+ #upgrade-to-premium p{
23
+ font-family: 'Open Sans',san-serif;
24
+ font-size: 15px;
25
+ line-height: 29px;
26
+ font-weight: 400;
27
+ color: #6a6a6b;
28
+ }
29
+ #upgrade-to-premium p.highlighted{
30
+ font-family: 'Raleway',san-serif;
31
+ font-size: 20px;
32
+ line-height: 27px;
33
+ color: #808a97;
34
+ font-weight: 400;
35
+ }
36
+ #upgrade-to-premium ol{
37
+ counter-reset: item;
38
+ list-style-type: none;
39
+ margin-left: 0;
40
+ }
41
+ #upgrade-to-premium li.step{
42
+ font-family: 'open sans',san-serif;
43
+ font-size: 15px;
44
+ color: #6a6a6b;
45
+ font-weight: 400;
46
+ position: relative;
47
+ padding-left: 50px;
48
+ line-height: 25px;
49
+ margin-bottom: 25px;
50
+ }
51
+ #upgrade-to-premium li.step:before{
52
+ content: counters(item, ".") " ";
53
+ counter-increment: item;
54
+ position: absolute;
55
+ left: 0;
56
+ top: 0;
57
+ border: 1px solid #808a97;
58
+ width: 30px;
59
+ height: 30px;
60
+ border-radius: 16px;
61
+ background-color: #808a97;
62
+ color: #ffffff;
63
+ font-weight: 700;
64
+ font-size: 18px;
65
+ text-align: center;
66
+ line-height: 27px;
67
+ }
68
+ #upgrade-to-premium li.step img{
69
+ border: 1px solid #b8b8b8;
70
+ width: 600px;
71
+ display: block;
72
+ margin: 15px 0 25px 0;
73
+ }
74
+
75
+ #cboxLoadedContent {
76
+ margin-bottom: 60px!important;
77
  }
plugin-fw/assets/css/yit-upgrader.css CHANGED
@@ -1,18 +1,22 @@
1
- /* === Plugins Upgrader === */
2
-
3
- .yit-plugin-changelog-wrapper {
4
- display: none;
5
- }
6
-
7
- .yit-plugin-changelog-title {
8
- text-transform: uppercase;
9
- }
10
-
11
- .yit-plugin-changelog {
12
- height : calc(100% - 15px);
13
- width : calc(100% - 15px);
14
- overflow-x : hidden;
15
- overflow-y : auto;
16
- z-index : 999;
17
- background: #fcfcfc;
 
 
 
 
18
  }
1
+ /* === Plugins Upgrader === */
2
+
3
+ .yit-plugin-changelog-wrapper {
4
+ display: none;
5
+ }
6
+
7
+ .yit-plugin-changelog-title {
8
+ text-transform: uppercase;
9
+ }
10
+
11
+ .yit-plugin-changelog {
12
+ height : calc(100% - 15px);
13
+ width : calc(100% - 15px);
14
+ overflow-x : hidden;
15
+ overflow-y : auto;
16
+ z-index : 999;
17
+ background: #fcfcfc;
18
+ }
19
+
20
+ .yith-updating:before{
21
+ animation: rotation 2s infinite linear;
22
  }
plugin-fw/assets/css/yith-fields.css CHANGED
@@ -1,402 +1,402 @@
1
- .yith-plugin-fw span.description {
2
- display : block;
3
- margin-top : 5px;
4
- font-size : 12px;
5
- color : #777;
6
- font-style : italic;
7
- clear : both;
8
- }
9
-
10
- .yith-plugin-fw span.description.inline {
11
- display : inline-block;
12
- margin : 0 0 0 5px;
13
- }
14
-
15
- .yith-disabled {
16
- opacity : 0.3;
17
- pointer-events : none;
18
- }
19
-
20
- .yith-plugin-fw-field-wrapper:not(.yith-plugin-fw-title-field-wrapper) {
21
- display : block;
22
- width : 100%;
23
- }
24
-
25
- .yith-plugin-fw-field-wrapper span.desc {
26
- display : block;
27
- width : 100%;
28
- }
29
-
30
- .yith-plugin-fw-title-field-wrapper h3.title {
31
- width : 100%;
32
- }
33
-
34
- .the-metabox .yith-plugin-fw-title-field-wrapper h3.title {
35
- float : left;
36
- }
37
-
38
- .yith-plugin-fw input[type=email],
39
- .yith-plugin-fw input[type=number],
40
- .yith-plugin-fw input[type=text]:not(.select2-search__field),
41
- .yith-plugin-fw select,
42
- .woocommerce .yith-plugin-fw table.form-table input[type=email],
43
- .woocommerce .yith-plugin-fw table.form-table input[type=number],
44
- .woocommerce .yith-plugin-fw table.form-table input[type=text]:not(.select2-search__field),
45
- .woocommerce .yith-plugin-fw table.form-table select {
46
- width : 400px;
47
- max-width : 100%;
48
- height : 30px;
49
- padding : 5px;
50
- }
51
-
52
- .woocommerce .yith-plugin-fw table.form-table input[type=text].wp-color-picker,
53
- .woocommerce .yith-plugin-fw table.form-table input[type=text].yith-plugin-fw-colorpicker,
54
- .yith-plugin-fw input[type=text].wp-color-picker,
55
- .yith-plugin-fw input[type=text].yith-plugin-fw-colorpicker {
56
- width : 6em;
57
- max-width : none;
58
- height : auto;
59
- padding : 3px 5px;
60
- }
61
-
62
- .woocommerce .yith-plugin-fw table.form-table input[type=text].colorpick,
63
- .yith-plugin-fw input[type=text].colorpick {
64
- width : 6em;
65
- max-width : none;
66
- height : auto;
67
- padding : 6px;
68
- }
69
-
70
- .yith-plugin-fw input.select2-search__field,
71
- .yith-plugin-fw .select2-container .select2-search--inline .select2-search__field,
72
- .woocommerce .yith-plugin-fw input.select2-search__field,
73
- .woocommerce .yith-plugin-fw table.form-table input.select2-search__field {
74
- padding : 3px;
75
- }
76
-
77
- .yith-plugin-fw textarea {
78
- width : 400px;
79
- max-width : 100%;
80
- padding : 5px;
81
- }
82
-
83
- /* ------------- ICONS ------------- */
84
- .yit-icons-manager-wrapper {
85
- width : 100%;
86
- max-width : 400px;
87
- }
88
-
89
- .yit-icons-manager-text {
90
- width : 100%;
91
- }
92
-
93
- .yit-icons-manager-icon-text {
94
- width : calc(100% - 35px) !important;
95
- height : 30px;
96
- float : left;
97
- margin : 0;
98
- }
99
-
100
- .yit-icons-manager-icon-preview {
101
- width : 30px;
102
- height : 30px;
103
- margin-right : 5px;
104
- float : left;
105
- padding-top : 6px;
106
- box-sizing : border-box;
107
- text-align : center;
108
- background : #f1f1f1;
109
- }
110
-
111
- .yit-icons-manager-list-wrapper {
112
- margin : 10px 0;
113
- box-shadow : 0 0 0 1px #ddd;
114
- }
115
-
116
- ul.yit-icons-manager-list {
117
- width : 100%;
118
- height : 300px;
119
- overflow-y : scroll;
120
- margin : 0;
121
- }
122
-
123
- ul.yit-icons-manager-list li {
124
- float : left;
125
- width : 30px;
126
- height : 30px;
127
- padding-top : 6px;
128
- box-sizing : border-box;
129
- text-align : center;
130
- background : #f1f1f1;
131
- margin : 1px;
132
- cursor : pointer;
133
- }
134
-
135
- ul.yit-icons-manager-list li:hover {
136
- background : #c5dcf6;
137
- }
138
-
139
- ul.yit-icons-manager-list li.active {
140
- background : #d4f0ff;
141
- }
142
-
143
- .yit-icons-manager-action-set-default {
144
- margin-bottom : 0;
145
- }
146
-
147
- .yit-icons-manager-default-icon-preview {
148
- height : 100%;
149
- display : inline-block;
150
- padding-left : 10px;
151
- border-left : 1px solid #ccc;
152
- margin-left : 10px;
153
- }
154
-
155
- /* ------- Text Array ------- */
156
- .yith-plugin-fw-text-array-table td {
157
- padding : 1px;
158
- }
159
-
160
- .yith-plugin-fw-text-array-table input[type=text],
161
- .woocommerce table.form-table table.yith-plugin-fw-text-array-table input[type=text] {
162
- width : 100%;
163
- }
164
-
165
- /* ------- Image Gallery ------- */
166
- .yith-plugin-fw .image-gallery ul li {
167
- display : inline-block;
168
- width : 80px;
169
- margin-left : 10px;
170
- position : relative;
171
- }
172
-
173
- .yith-plugin-fw .image-gallery ul li img {
174
- width : 80px;
175
- border : 1px solid #ccc;
176
- }
177
-
178
- .yith-plugin-fw .image-gallery ul li ul {
179
- position : absolute;
180
- top : -6px;
181
- right : -1px;
182
- width : 20px;
183
- height : 20px;
184
- }
185
-
186
- .yith-plugin-fw .image-gallery ul a.delete {
187
- background : url(../images/x.png) no-repeat;
188
- width : 20px;
189
- height : 20px;
190
- display : block;
191
- text-indent : -99999px;
192
- }
193
-
194
- /* ------- OnOff ------- */
195
- .yith-plugin-fw-onoff-container {
196
- display : inline-block;
197
- }
198
-
199
- .yith-plugin-fw-onoff-container input {
200
- display : none;
201
- }
202
-
203
- .yith-plugin-fw-onoff-container input + span {
204
- cursor : pointer;
205
- text-indent : -9999px;
206
- display : block;
207
- width : 36px;
208
- height : 20px;
209
- background : #a4a4a4;
210
- border-radius : 24px;
211
- position : relative;
212
- transition : all 0.3s;
213
- }
214
-
215
- .yith-plugin-fw-onoff-container input + span:before {
216
- content : '';
217
- background : #fff;
218
- width : 16px;
219
- height : 16px;
220
- border-radius : 50%;
221
- position : absolute;
222
- top : 2px;
223
- left : 2px;
224
- transition : all 0.3s;
225
- }
226
-
227
- .yith-plugin-fw-onoff-container input:checked + span,
228
- .yith-plugin-fw-onoff-container input.onoffchecked + span {
229
- background : #0073aa;
230
- }
231
-
232
- .yith-plugin-fw-onoff-container input:checked + span:before,
233
- .yith-plugin-fw-onoff-container input.onoffchecked + span:before {
234
- left : 18px;
235
- }
236
-
237
- /* ------- Preview ------- */
238
- .yith-plugin-fw-preview-field {
239
- max-height : 200px;
240
- }
241
-
242
- /* ------- Radio ------- */
243
- .yith-plugin-fw-radio input[type=radio] {
244
- margin : 0 3px 0 0;
245
- }
246
-
247
- .yith-plugin-fw-radio__row {
248
- margin-bottom : 8px;
249
- }
250
-
251
- /* ------- Sidebar Layout ------- */
252
- .yith-plugin-fw-sidebar-layout input[type="radio"] {
253
- display : none;
254
- width : 0px;
255
- }
256
-
257
- .yith-plugin-fw-sidebar-layout input[type="radio"]:first-child {
258
- margin-right : -2px;
259
- }
260
-
261
- .yith-plugin-fw-sidebar-layout input[type="radio"] + img {
262
- border : 2px solid #fff;
263
- padding : 1px;
264
- }
265
-
266
- .yith-plugin-fw-sidebar-layout input[type="radio"] + img:hover {
267
- cursor : pointer;
268
- }
269
-
270
- .yith-plugin-fw-sidebar-layout input[checked] + img {
271
- border : 2px solid #f2ad35;
272
- padding : 1px;
273
- }
274
-
275
- .yith-plugin-fw-sidebar-layout select {
276
- vertical-align : 12px;
277
- }
278
-
279
- .yit-admin-panel-content-wrap .yith-plugin-fw-sidebar-layout label {
280
- font-weight : bold;
281
- width : 200px;
282
- float : left;
283
- line-height : 23px;
284
- margin-left : -230px;
285
- }
286
-
287
- /* ------- Slider ------- */
288
- .yith-plugin-fw .slider {
289
- padding-top : 20px;
290
- }
291
-
292
- .ui-slider .minCaption {
293
- position : absolute;
294
- right : 95%;
295
- top : -6px;
296
- margin-right : 11px;
297
- }
298
-
299
- .ui-slider .maxCaption {
300
- position : absolute;
301
- left : 95%;
302
- top : -6px;
303
- margin-left : 20px;
304
- }
305
-
306
- .ui-slider-horizontal .ui-slider-handle {
307
- background : #fff;
308
- border : 0px !important;
309
- top : -12px !important;
310
- border-radius : 50%;
311
- width : 27px !important;
312
- height : 27px !important;
313
- box-sizing : border-box;
314
- box-shadow : 0 1px 7px -1px rgba(0, 0, 0, 0.5);
315
- font-size : 13px;
316
- padding : 6px 0;
317
- font-weight : 600;
318
- color : #555;
319
- text-align : center;
320
- }
321
-
322
- .ui-slider.ui-widget-content {
323
- background : #ccc;
324
- border : none !important;
325
- height : 3px !important;
326
- border-radius : 3px !important;
327
- width : 90%;
328
- margin : 15px 5% 20px 5%;
329
- }
330
-
331
- .iris-slider-offset.ui-slider.ui-widget-content {
332
- background : transparent !important;
333
- height : auto !important;
334
- }
335
-
336
- .ui-slider.ui-widget-content .ui-widget-header {
337
- background : #4b93ff;
338
- left : 0px !important;
339
- -webkit-border-radius : 3px;
340
- -moz-border-radius : 3px;
341
- -khtml-border-radius : 3px;
342
- border-radius : 3px;
343
- }
344
-
345
- /* ------- Select2 ------- */
346
- .yith-plugin-fw-select2-wrapper {
347
- width : 400px;
348
- }
349
-
350
- /* ------- Textarea ------- */
351
- .yith-plugin-fw-textarea-editor-field-wrapper {
352
- max-width : 1000px;
353
- clear : both;
354
- }
355
-
356
- .yith-plugin-fw-textarea-editor-field-wrapper textarea.wp-editor-area,
357
- .woocommerce table.form-table .yith-plugin-fw-textarea-editor-field-wrapper textarea.wp-editor-area {
358
- width : 100%;
359
- }
360
-
361
- /* ------- Buttons ------- */
362
- .yith-plugin-fw-buttons-field-wrapper {
363
- margin-top : 7px;
364
- }
365
-
366
- /* ------- Select Images ------- */
367
- .yith-plugin-fw-select-images__list {
368
- margin : 0;
369
- display : flex;
370
- flex-wrap : wrap;
371
- }
372
-
373
- .yith-plugin-fw-select-images__item {
374
- width : calc(20% - 10px);
375
- min-width : 150px;
376
- margin : 0 10px 10px 0;
377
- padding : 10px;
378
- box-sizing : border-box;
379
- cursor : pointer;
380
- transition : all .3s;
381
- border : 2px solid #eee;
382
- display : flex;
383
- flex-direction : column;
384
- justify-content : space-between;
385
- }
386
-
387
- .yith-plugin-fw-select-images__item:hover,
388
- .yith-plugin-fw-select-images__item.yith-plugin-fw-select-images__item--selected {
389
- border-color : #07bcce;
390
- }
391
-
392
- .yith-plugin-fw-select-images__item__label {
393
- text-align : center;
394
- font-weight : 600;
395
- margin-bottom : 10px;
396
- }
397
-
398
- .yith-plugin-fw-select-images__item img {
399
- display : block;
400
- max-width : 100%;
401
- margin : 0 auto;
402
  }
1
+ .yith-plugin-fw span.description {
2
+ display : block;
3
+ margin-top : 5px;
4
+ font-size : 12px;
5
+ color : #777;
6
+ font-style : italic;
7
+ clear : both;
8
+ }
9
+
10
+ .yith-plugin-fw span.description.inline {
11
+ display : inline-block;
12
+ margin : 0 0 0 5px;
13
+ }
14
+
15
+ .yith-disabled {
16
+ opacity : 0.3;
17
+ pointer-events : none;
18
+ }
19
+
20
+ .yith-plugin-fw-field-wrapper:not(.yith-plugin-fw-title-field-wrapper) {
21
+ display : block;
22
+ width : 100%;
23
+ }
24
+
25
+ .yith-plugin-fw-field-wrapper span.desc {
26
+ display : block;
27
+ width : 100%;
28
+ }
29
+
30
+ .yith-plugin-fw-title-field-wrapper h3.title {
31
+ width : 100%;
32
+ }
33
+
34
+ .the-metabox .yith-plugin-fw-title-field-wrapper h3.title {
35
+ float : left;
36
+ }
37
+
38
+ .yith-plugin-fw input[type=email],
39
+ .yith-plugin-fw input[type=number],
40
+ .yith-plugin-fw input[type=text]:not(.select2-search__field),
41
+ .yith-plugin-fw select,
42
+ .woocommerce .yith-plugin-fw table.form-table input[type=email],
43
+ .woocommerce .yith-plugin-fw table.form-table input[type=number],
44
+ .woocommerce .yith-plugin-fw table.form-table input[type=text]:not(.select2-search__field),
45
+ .woocommerce .yith-plugin-fw table.form-table select {
46
+ width : 400px;
47
+ max-width : 100%;
48
+ height : 30px;
49
+ padding : 5px;
50
+ }
51
+
52
+ .woocommerce .yith-plugin-fw table.form-table input[type=text].wp-color-picker,
53
+ .woocommerce .yith-plugin-fw table.form-table input[type=text].yith-plugin-fw-colorpicker,
54
+ .yith-plugin-fw input[type=text].wp-color-picker,
55
+ .yith-plugin-fw input[type=text].yith-plugin-fw-colorpicker {
56
+ width : 6em;
57
+ max-width : none;
58
+ height : auto;
59
+ padding : 3px 5px;
60
+ }
61
+
62
+ .woocommerce .yith-plugin-fw table.form-table input[type=text].colorpick,
63
+ .yith-plugin-fw input[type=text].colorpick {
64
+ width : 6em;
65
+ max-width : none;
66
+ height : auto;
67
+ padding : 6px;
68
+ }
69
+
70
+ .yith-plugin-fw input.select2-search__field,
71
+ .yith-plugin-fw .select2-container .select2-search--inline .select2-search__field,
72
+ .woocommerce .yith-plugin-fw input.select2-search__field,
73
+ .woocommerce .yith-plugin-fw table.form-table input.select2-search__field {
74
+ padding : 3px;
75
+ }
76
+
77
+ .yith-plugin-fw textarea {
78
+ width : 400px;
79
+ max-width : 100%;
80
+ padding : 5px;
81
+ }
82
+
83
+ /* ------------- ICONS ------------- */
84
+ .yit-icons-manager-wrapper {
85
+ width : 100%;
86
+ max-width : 400px;
87
+ }
88
+
89
+ .yit-icons-manager-text {
90
+ width : 100%;
91
+ }
92
+
93
+ .yit-icons-manager-icon-text {
94
+ width : calc(100% - 35px) !important;
95
+ height : 30px;
96
+ float : left;
97
+ margin : 0;
98
+ }
99
+
100
+ .yit-icons-manager-icon-preview {
101
+ width : 30px;
102
+ height : 30px;
103
+ margin-right : 5px;
104
+ float : left;
105
+ padding-top : 6px;
106
+ box-sizing : border-box;
107
+ text-align : center;
108
+ background : #f1f1f1;
109
+ }
110
+
111
+ .yit-icons-manager-list-wrapper {
112
+ margin : 10px 0;
113
+ box-shadow : 0 0 0 1px #ddd;
114
+ }
115
+
116
+ ul.yit-icons-manager-list {
117
+ width : 100%;
118
+ height : 300px;
119
+ overflow-y : scroll;
120
+ margin : 0;
121
+ }
122
+
123
+ ul.yit-icons-manager-list li {
124
+ float : left;
125
+ width : 30px;
126
+ height : 30px;
127
+ padding-top : 6px;
128
+ box-sizing : border-box;
129
+ text-align : center;
130
+ background : #f1f1f1;
131
+ margin : 1px;
132
+ cursor : pointer;
133
+ }
134
+
135
+ ul.yit-icons-manager-list li:hover {
136
+ background : #c5dcf6;
137
+ }
138
+
139
+ ul.yit-icons-manager-list li.active {
140
+ background : #d4f0ff;
141
+ }
142
+
143
+ .yit-icons-manager-action-set-default {
144
+ margin-bottom : 0;
145
+ }
146
+
147
+ .yit-icons-manager-default-icon-preview {
148
+ height : 100%;
149
+ display : inline-block;
150
+ padding-left : 10px;
151
+ border-left : 1px solid #ccc;
152
+ margin-left : 10px;
153
+ }
154
+
155
+ /* ------- Text Array ------- */
156
+ .yith-plugin-fw-text-array-table td {
157
+ padding : 1px;
158
+ }
159
+
160
+ .yith-plugin-fw-text-array-table input[type=text],
161
+ .woocommerce table.form-table table.yith-plugin-fw-text-array-table input[type=text] {
162
+ width : 100%;
163
+ }
164
+
165
+ /* ------- Image Gallery ------- */
166
+ .yith-plugin-fw .image-gallery ul li {
167
+ display : inline-block;
168
+ width : 80px;
169
+ margin-left : 10px;
170
+ position : relative;
171
+ }
172
+
173
+ .yith-plugin-fw .image-gallery ul li img {
174
+ width : 80px;
175
+ border : 1px solid #ccc;
176
+ }
177
+
178
+ .yith-plugin-fw .image-gallery ul li ul {
179
+ position : absolute;
180
+ top : -6px;
181
+ right : -1px;
182
+ width : 20px;
183
+ height : 20px;
184
+ }
185
+
186
+ .yith-plugin-fw .image-gallery ul a.delete {
187
+ background : url(../images/x.png) no-repeat;
188
+ width : 20px;
189
+ height : 20px;
190
+ display : block;
191
+ text-indent : -99999px;
192
+ }
193
+
194
+ /* ------- OnOff ------- */
195
+ .yith-plugin-fw-onoff-container {
196
+ display : inline-block;
197
+ }
198
+
199
+ .yith-plugin-fw-onoff-container input {
200
+ display : none;
201
+ }
202
+
203
+ .yith-plugin-fw-onoff-container input + span {
204
+ cursor : pointer;
205
+ text-indent : -9999px;
206
+ display : block;
207
+ width : 36px;
208
+ height : 20px;
209
+ background : #a4a4a4;
210
+ border-radius : 24px;
211
+ position : relative;
212
+ transition : all 0.3s;
213
+ }
214
+
215
+ .yith-plugin-fw-onoff-container input + span:before {
216
+ content : '';
217
+ background : #fff;
218
+ width : 16px;
219
+ height : 16px;
220
+ border-radius : 50%;
221
+ position : absolute;
222
+ top : 2px;
223
+ left : 2px;
224
+ transition : all 0.3s;
225
+ }
226
+
227
+ .yith-plugin-fw-onoff-container input:checked + span,
228
+ .yith-plugin-fw-onoff-container input.onoffchecked + span {
229
+ background : #0073aa;
230
+ }
231
+
232
+ .yith-plugin-fw-onoff-container input:checked + span:before,
233
+ .yith-plugin-fw-onoff-container input.onoffchecked + span:before {
234
+ left : 18px;
235
+ }
236
+
237
+ /* ------- Preview ------- */
238
+ .yith-plugin-fw-preview-field {
239
+ max-height : 200px;
240
+ }
241
+
242
+ /* ------- Radio ------- */
243
+ .yith-plugin-fw-radio input[type=radio] {
244
+ margin : 0 3px 0 0;
245
+ }
246
+
247
+ .yith-plugin-fw-radio__row {
248
+ margin-bottom : 8px;
249
+ }
250
+
251
+ /* ------- Sidebar Layout ------- */
252
+ .yith-plugin-fw-sidebar-layout input[type="radio"] {
253
+ display : none;
254
+ width : 0px;
255
+ }
256
+
257
+ .yith-plugin-fw-sidebar-layout input[type="radio"]:first-child {
258
+ margin-right : -2px;
259
+ }
260
+
261
+ .yith-plugin-fw-sidebar-layout input[type="radio"] + img {
262
+ border : 2px solid #fff;
263
+ padding : 1px;
264
+ }
265
+
266
+ .yith-plugin-fw-sidebar-layout input[type="radio"] + img:hover {
267
+ cursor : pointer;
268
+ }
269
+
270
+ .yith-plugin-fw-sidebar-layout input[checked] + img {
271
+ border : 2px solid #f2ad35;
272
+ padding : 1px;
273
+ }
274
+
275
+ .yith-plugin-fw-sidebar-layout select {
276
+ vertical-align : 12px;
277
+ }
278
+
279
+ .yit-admin-panel-content-wrap .yith-plugin-fw-sidebar-layout label {
280
+ font-weight : bold;
281
+ width : 200px;
282
+ float : left;
283
+ line-height : 23px;
284
+ margin-left : -230px;
285
+ }
286
+
287
+ /* ------- Slider ------- */
288
+ .yith-plugin-fw .slider {
289
+ padding-top : 20px;
290
+ }
291
+
292
+ .ui-slider .minCaption {
293
+ position : absolute;
294
+ right : 95%;
295
+ top : -6px;
296
+ margin-right : 11px;
297
+ }
298
+
299
+ .ui-slider .maxCaption {
300
+ position : absolute;
301
+ left : 95%;
302
+ top : -6px;
303
+ margin-left : 20px;
304
+ }
305
+
306
+ .ui-slider-horizontal .ui-slider-handle {
307
+ background : #fff;
308
+ border : 0px !important;
309
+ top : -12px !important;
310
+ border-radius : 50%;
311
+ width : 27px !important;
312
+ height : 27px !important;
313
+ box-sizing : border-box;
314
+ box-shadow : 0 1px 7px -1px rgba(0, 0, 0, 0.5);
315
+ font-size : 13px;
316
+ padding : 6px 0;
317
+ font-weight : 600;
318
+ color : #555;
319
+ text-align : center;
320
+ }
321
+
322
+ .ui-slider.ui-widget-content {
323
+ background : #ccc;
324
+ border : none !important;
325
+ height : 3px !important;
326
+ border-radius : 3px !important;
327
+ width : 90%;
328
+ margin : 15px 5% 20px 5%;
329
+ }
330
+
331
+ .iris-slider-offset.ui-slider.ui-widget-content {
332
+ background : transparent !important;
333
+ height : auto !important;
334
+ }
335
+
336
+ .ui-slider.ui-widget-content .ui-widget-header {
337
+ background : #4b93ff;
338
+ left : 0px !important;
339
+ -webkit-border-radius : 3px;
340
+ -moz-border-radius : 3px;
341
+ -khtml-border-radius : 3px;
342
+ border-radius : 3px;
343
+ }
344
+
345
+ /* ------- Select2 ------- */
346
+ .yith-plugin-fw-select2-wrapper {
347
+ width : 400px;
348
+ }
349
+
350
+ /* ------- Textarea ------- */
351
+ .yith-plugin-fw-textarea-editor-field-wrapper {
352
+ max-width : 1000px;
353
+ clear : both;
354
+ }
355
+
356
+ .yith-plugin-fw-textarea-editor-field-wrapper textarea.wp-editor-area,
357
+ .woocommerce table.form-table .yith-plugin-fw-textarea-editor-field-wrapper textarea.wp-editor-area {
358
+ width : 100%;
359
+ }
360
+
361
+ /* ------- Buttons ------- */
362
+ .yith-plugin-fw-buttons-field-wrapper {
363
+ margin-top : 7px;
364
+ }
365
+
366
+ /* ------- Select Images ------- */
367
+ .yith-plugin-fw-select-images__list {
368
+ margin : 0;
369
+ display : flex;
370
+ flex-wrap : wrap;
371
+ }
372
+
373
+ .yith-plugin-fw-select-images__item {
374
+ width : calc(20% - 10px);
375
+ min-width : 150px;
376
+ margin : 0 10px 10px 0;
377
+ padding : 10px;
378
+ box-sizing : border-box;
379
+ cursor : pointer;
380
+ transition : all .3s;
381
+ border : 2px solid #eee;
382
+ display : flex;
383
+ flex-direction : column;
384
+ justify-content : space-between;
385
+ }
386
+
387
+ .yith-plugin-fw-select-images__item:hover,
388
+ .yith-plugin-fw-select-images__item.yith-plugin-fw-select-images__item--selected {
389
+ border-color : #07bcce;
390
+ }
391
+
392
+ .yith-plugin-fw-select-images__item__label {
393
+ text-align : center;
394
+ font-weight : 600;
395
+ margin-bottom : 10px;
396
+ }
397
+
398
+ .yith-plugin-fw-select-images__item img {
399
+ display : block;
400
+ max-width : 100%;
401
+ margin : 0 auto;
402
  }
plugin-fw/assets/css/yith-select2-no-wc.css CHANGED
@@ -1,741 +1,741 @@
1
- .select2-container {
2
- -webkit-box-sizing : border-box;
3
- box-sizing : border-box;
4
- display : inline-block;
5
- margin : 0;
6
- position : relative;
7
- vertical-align : middle
8
- }
9
-
10
- .select2-container .select2-selection--single {
11
- -webkit-box-sizing : border-box;
12
- box-sizing : border-box;
13
- cursor : pointer;
14
- display : block;
15
- height : 28px;
16
- margin : 0 0 -4px;
17
- -moz-user-select : none;
18
- -ms-user-select : none;
19
- user-select : none;
20
- -webkit-user-select : none
21
- }
22
-
23
- .select2-container .select2-selection--single .select2-selection__rendered {
24
- display : block;
25
- padding-left : 8px;
26
- padding-right : 20px;
27
- overflow : hidden;
28
- text-overflow : ellipsis;
29
- white-space : nowrap
30
- }
31
-
32
- .select2-container .select2-selection--single .select2-selection__clear {
33
- position : relative
34
- }
35
-
36
- .select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered {
37
- padding-right : 8px;
38
- padding-left : 20px
39
- }
40
-
41
- .select2-container .select2-selection--multiple {
42
- -webkit-box-sizing : border-box;
43
- box-sizing : border-box;
44
- cursor : pointer;
45
- display : block;
46
- min-height : 32px;
47
- -moz-user-select : none;
48
- -ms-user-select : none;
49
- user-select : none;
50
- -webkit-user-select : none
51
- }
52
-
53
- .select2-container .select2-selection--multiple .select2-selection__rendered {
54
- display : inline-block;
55
- overflow : hidden;
56
- padding-left : 8px;
57
- text-overflow : ellipsis;
58
- white-space : nowrap
59
- }
60
-
61
- .select2-container .select2-search--inline {
62
- float : left;
63
- padding : 0
64
- }
65
-
66
- .select2-container .select2-search--inline .select2-search__field {
67
- -webkit-box-sizing : border-box;
68
- box-sizing : border-box;
69
- border : none;
70
- font-size : 100%;
71
- margin : 0;
72
- padding : 0
73
- }
74
-
75
- .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button {
76
- -webkit-appearance : none
77
- }
78
-
79
- .select2-dropdown {
80
- background-color : #fff;
81
- border : 1px solid #aaa;
82
- border-radius : 4px;
83
- -webkit-box-sizing : border-box;
84
- box-sizing : border-box;
85
- display : block;
86
- position : absolute;
87
- left : -100000px;
88
- width : 100%;
89
- z-index : 1051
90
- }
91
-
92
- .select2-results {
93
- display : block
94
- }
95
-
96
- .select2-results__options {
97
- list-style : none;
98
- margin : 0;
99
- padding : 0
100
- }
101
-
102
- .select2-results__option {
103
- padding : 6px;
104
- -moz-user-select : none;
105
- -ms-user-select : none;
106
- user-select : none;
107
- -webkit-user-select : none
108
- }
109
-
110
- .select2-results__option[aria-selected], .select2-results__option[data-selected] {
111
- cursor : pointer
112
- }
113
-
114
- .select2-container--open .select2-dropdown {
115
- left : 0
116
- }
117
-
118
- .select2-container--open .select2-dropdown--above {
119
- border-bottom : none;
120
- border-bottom-left-radius : 0;
121
- border-bottom-right-radius : 0
122
- }
123
-
124
- .select2-container--open .select2-dropdown--below {
125
- border-top : none;
126
- border-top-left-radius : 0;
127
- border-top-right-radius : 0
128
- }
129
-
130
- .select2-search--dropdown {
131
- display : block;
132
- padding : 4px
133
- }
134
-
135
- .select2-search--dropdown .select2-search__field {
136
- padding : 4px;
137
- width : 100%;
138
- -webkit-box-sizing : border-box;
139
- box-sizing : border-box
140
- }
141
-
142
- .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button {
143
- -webkit-appearance : none
144
- }
145
-
146
- .select2-search--dropdown.select2-search--hide {
147
- display : none
148
- }
149
-
150
- .select2-close-mask {
151
- border : 0;
152
- margin : 0;
153
- padding : 0;
154
- display : block;
155
- position : fixed;
156
- left : 0;
157
- top : 0;
158
- min-height : 100%;
159
- min-width : 100%;
160
- height : auto;
161
- width : auto;
162
- opacity : 0;
163
- z-index : 99;
164
- background-color : #fff
165
- }
166
-
167
- .select2-hidden-accessible {
168
- border : 0 !important;
169
- clip : rect(0 0 0 0) !important;
170
- height : 1px !important;
171
- margin : -1px !important;
172
- overflow : hidden !important;
173
- padding : 0 !important;
174
- position : absolute !important;
175
- width : 1px !important
176
- }
177
-
178
- .select2-container--default .select2-selection--single {
179
- background-color : #fff;
180
- border : 1px solid #aaa;
181
- border-radius : 4px
182
- }
183
-
184
- .select2-container--default .select2-selection--single .select2-selection__rendered {
185
- color : #444;
186
- line-height : 28px
187
- }
188
-
189
- .select2-container--default .select2-selection--single .select2-selection__clear {
190
- cursor : pointer;
191
- float : right;
192
- font-weight : 700
193
- }
194
-
195
- .select2-container--default .select2-selection--single .select2-selection__placeholder {
196
- color : #999
197
- }
198
-
199
- .select2-container--default .select2-selection--single .select2-selection__arrow {
200
- height : 26px;
201
- position : absolute;
202
- top : 1px;
203
- right : 1px;
204
- width : 20px
205
- }
206
-
207
- .select2-container--default .select2-selection--single .select2-selection__arrow b {
208
- border-color : #888 transparent transparent transparent;
209
- border-style : solid;
210
- border-width : 5px 4px 0 4px;
211
- height : 0;
212
- left : 50%;
213
- margin-left : -4px;
214
- margin-top : -2px;
215
- position : absolute;
216
- top : 50%;
217
- width : 0
218
- }
219
-
220
- .select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear {
221
- float : left
222
- }
223
-
224
- .select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow {
225
- left : 1px;
226
- right : auto
227
- }
228
-
229
- .select2-container--default.select2-container--disabled .select2-selection--single {
230
- background-color : #eee;
231
- cursor : default
232
- }
233
-
234
- .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear {
235
- display : none
236
- }
237
-
238
- .select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b {
239
- border-color : transparent transparent #888 transparent;
240
- border-width : 0 4px 5px 4px
241
- }
242
-
243
- .select2-container--default .select2-selection--multiple {
244
- background-color : #fff;
245
- border : 1px solid #aaa;
246
- cursor : text;
247
- }
248
-
249
- .select2-container--default .select2-selection--multiple .select2-selection__rendered {
250
- -webkit-box-sizing : border-box;
251
- box-sizing : border-box;
252
- list-style : none;
253
- margin : 0;
254
- padding : 0 5px;
255
- width : 100%
256
- }
257
-
258
- .select2-container--default .select2-selection--multiple .select2-selection__rendered li {
259
- list-style : none;
260
- margin : 5px 5px 0 0
261
- }
262
-
263
- .select2-container--default .select2-selection--multiple .select2-selection__rendered li:before {
264
- content : '';
265
- display : none
266
- }
267
-
268
- .select2-container--default .select2-selection--multiple .select2-selection__placeholder {
269
- color : #999;
270
- margin-top : 5px;
271
- float : left
272
- }
273
-
274
- .select2-container--default .select2-selection--multiple .select2-selection__clear {
275
- cursor : pointer;
276
- float : right;
277
- font-weight : 700;
278
- margin-top : 5px;
279
- margin-right : 10px
280
- }
281
-
282
- .select2-container--default .select2-selection--multiple .select2-selection__choice {
283
- background-color : #e4e4e4;
284
- border : 1px solid #aaa;
285
- border-radius : 4px;
286
- cursor : default;
287
- float : left;
288
- margin-right : 5px;
289
- margin-top : 5px;
290
- padding : 0 5px
291
- }
292
-
293
- .select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
294
- color : #999;
295
- cursor : pointer;
296
- display : inline-block;
297
- font-weight : 700;
298
- margin-right : 2px
299
- }
300
-
301
- .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover {
302
- color : #333
303
- }
304
-
305
- .select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline, .select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder {
306
- float : right
307
- }
308
-
309
- .select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice {
310
- margin-left : 5px;
311
- margin-right : auto
312
- }
313
-
314
- .select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove {
315
- margin-left : 2px;
316
- margin-right : auto
317
- }
318
-
319
- .select2-container--default.select2-container--focus .select2-selection--multiple {
320
- border : solid #000 1px;
321
- outline : 0
322
- }
323
-
324
- .select2-container--default.select2-container--disabled .select2-selection--multiple {
325
- background-color : #eee;
326
- cursor : default
327
- }
328
-
329
- .select2-container--default.select2-container--disabled .select2-selection__choice__remove {
330
- display : none
331
- }
332
-
333
- .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple, .select2-container--default.select2-container--open.select2-container--above .select2-selection--single {
334
- border-top-left-radius : 0;
335
- border-top-right-radius : 0
336
- }
337
-
338
- .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple, .select2-container--default.select2-container--open.select2-container--below .select2-selection--single {
339
- border-bottom-left-radius : 0;
340
- border-bottom-right-radius : 0
341
- }
342
-
343
- .select2-container--default .select2-search--dropdown .select2-search__field {
344
- border : 1px solid #aaa
345
- }
346
-
347
- .select2-container--default .select2-search--inline .select2-search__field {
348
- background : 0 0;
349
- border : none;
350
- outline : 0;
351
- -webkit-box-shadow : none;
352
- box-shadow : none;
353
- -webkit-appearance : textfield
354
- }
355
-
356
- .select2-container--default .select2-results > .select2-results__options {
357
- max-height : 200px;
358
- overflow-y : auto
359
- }
360
-
361
- .select2-container--default .select2-results__option[role=group] {
362
- padding : 0
363
- }
364
-
365
- .select2-container--default .select2-results__option[aria-disabled=true] {
366
- color : #999
367
- }
368
-
369
- .select2-container--default .select2-results__option[aria-selected=true], .select2-container--default .select2-results__option[data-selected=true] {
370
- background-color : #ddd
371
- }
372
-
373
- .select2-container--default .select2-results__option .select2-results__option {
374
- padding-left : 1em
375
- }
376
-
377
- .select2-container--default .select2-results__option .select2-results__option .select2-results__group {
378
- padding-left : 0
379
- }
380
-
381
- .select2-container--default .select2-results__option .select2-results__option .select2-results__option {
382
- margin-left : -1em;
383
- padding-left : 2em
384
- }
385
-
386
- .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
387
- margin-left : -2em;
388
- padding-left : 3em
389
- }
390
-
391
- .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
392
- margin-left : -3em;
393
- padding-left : 4em
394
- }
395
-
396
- .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
397
- margin-left : -4em;
398
- padding-left : 5em
399
- }
400
-
401
- .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
402
- margin-left : -5em;
403
- padding-left : 6em
404
- }
405
-
406
- .select2-container--default .select2-results__option--highlighted[aria-selected], .select2-container--default .select2-results__option--highlighted[data-selected] {
407
- background-color : #0073aa;
408
- color : #fff
409
- }
410
-
411
- .select2-container--default .select2-results__group {
412
- cursor : default;
413
- display : block;
414
- padding : 6px
415
- }
416
-
417
- .select2-container--classic .select2-selection--single {
418
- background-color : #f7f7f7;
419
- border : 1px solid #aaa;
420
- border-radius : 4px;
421
- outline : 0;
422
- background-image : -webkit-gradient(linear, left top, left bottom, color-stop(50%, #fff), to(#eee));
423
- background-image : -webkit-linear-gradient(top, #fff 50%, #eee 100%);
424
- background-image : linear-gradient(to bottom, #fff 50%, #eee 100%);
425
- background-repeat : repeat-x
426
- }
427
-
428
- .select2-container--classic .select2-selection--single:focus {
429
- border : 1px solid #0073aa
430
- }
431
-
432
- .select2-container--classic .select2-selection--single .select2-selection__rendered {
433
- color : #444;
434
- line-height : 28px
435
- }
436
-
437
- .select2-container--classic .select2-selection--single .select2-selection__clear {
438
- cursor : pointer;
439
- float : right;
440
- font-weight : 700;
441
- margin-right : 10px
442
- }
443
-
444
- .select2-container--classic .select2-selection--single .select2-selection__placeholder {
445
- color : #999
446
- }
447
-
448
- .select2-container--classic .select2-selection--single .select2-selection__arrow {
449
- background-color : #ddd;
450
- border : none;
451
- border-left : 1px solid #aaa;
452
- border-top-right-radius : 4px;
453
- border-bottom-right-radius : 4px;
454
- height : 26px;
455
- position : absolute;
456
- top : 1px;
457
- right : 1px;
458
- width : 20px;
459
- background-image : -webkit-gradient(linear, left top, left bottom, color-stop(50%, #eee), to(#ccc));
460
- background-image : -webkit-linear-gradient(top, #eee 50%, #ccc 100%);
461
- background-image : linear-gradient(to bottom, #eee 50%, #ccc 100%);
462
- background-repeat : repeat-x
463
- }
464
-
465
- .select2-container--classic .select2-selection--single .select2-selection__arrow b {
466
- border-color : #888 transparent transparent transparent;
467
- border-style : solid;
468
- border-width : 5px 4px 0 4px;
469
- height : 0;
470
- left : 50%;
471
- margin-left : -4px;
472
- margin-top : -2px;
473
- position : absolute;
474
- top : 50%;
475
- width : 0
476
- }
477
-
478
- .select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear {
479
- float : left
480
- }
481
-
482
- .select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow {
483
- border : none;
484
- border-right : 1px solid #aaa;
485
- border-radius : 0;
486
- border-top-left-radius : 4px;
487
- border-bottom-left-radius : 4px;
488
- left : 1px;
489
- right : auto
490
- }
491
-
492
- .select2-container--classic.select2-container--open .select2-selection--single {
493
- border : 1px solid #0073aa
494
- }
495
-
496
- .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow {
497
- background : 0 0;
498
- border : none
499
- }
500
-
501
- .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b {
502
- border-color : transparent transparent #888 transparent;
503
- border-width : 0 4px 5px 4px
504
- }
505
-
506
- .select2-container--classic.select2-container--open.select2-container--above .select2-selection--single {
507
- border-top : none;
508
- border-top-left-radius : 0;
509
- border-top-right-radius : 0;
510
- background-image : -webkit-gradient(linear, left top, left bottom, from(white), color-stop(50%, #eee));
511
- background-image : -webkit-linear-gradient(top, #fff 0, #eee 50%);
512
- background-image : linear-gradient(to bottom, #fff 0, #eee 50%);
513
- background-repeat : repeat-x
514
- }
515
-
516
- .select2-container--classic.select2-container--open.select2-container--below .select2-selection--single {
517
- border-bottom : none;
518
- border-bottom-left-radius : 0;
519
- border-bottom-right-radius : 0;
520
- background-image : -webkit-gradient(linear, left top, left bottom, color-stop(50%, #eee), to(white));
521
- background-image : -webkit-linear-gradient(top, #eee 50%, #fff 100%);
522
- background-image : linear-gradient(to bottom, #eee 50%, #fff 100%);
523
- background-repeat : repeat-x
524
- }
525
-
526
- .select2-container--classic .select2-selection--multiple {
527
- background-color : #fff;
528
- border : 1px solid #aaa;
529
- border-radius : 4px;
530
- cursor : text;
531
- outline : 0
532
- }
533
-
534
- .select2-container--classic .select2-selection--multiple:focus {
535
- border : 1px solid #0073aa
536
- }
537
-
538
- .select2-container--classic .select2-selection--multiple .select2-selection__rendered {
539
- list-style : none;
540
- margin : 0;
541
- padding : 0 5px
542
- }
543
-
544
- .select2-container--classic .select2-selection--multiple .select2-selection__clear {
545
- display : none
546
- }
547
-
548
- .select2-container--classic .select2-selection--multiple .select2-selection__choice {
549
- background-color : #e4e4e4;
550
- border : 1px solid #aaa;
551
- border-radius : 4px;
552
- cursor : default;
553
- float : left;
554
- margin-right : 5px;
555
- margin-top : 5px;
556
- padding : 0 5px
557
- }
558
-
559
- .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove {
560
- color : #888;
561
- cursor : pointer;
562
- display : inline-block;
563
- font-weight : 700;
564
- margin-right : 2px
565
- }
566
-
567
- .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover {
568
- color : #555
569
- }
570
-
571
- .select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice {
572
- float : right
573
- }
574
-
575
- .select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice {
576
- margin-left : 5px;
577
- margin-right : auto
578
- }
579
-
580
- .select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove {
581
- margin-left : 2px;
582
- margin-right : auto
583
- }
584
-
585
- .select2-container--classic.select2-container--open .select2-selection--multiple {
586
- border : 1px solid #0073aa
587
- }
588
-
589
- .select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple {
590
- border-top : none;
591
- border-top-left-radius : 0;
592
- border-top-right-radius : 0
593
- }
594
-
595
- .select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple {
596
- border-bottom : none;
597
- border-bottom-left-radius : 0;
598
- border-bottom-right-radius : 0
599
- }
600
-
601
- .select2-container--classic .select2-search--dropdown .select2-search__field {
602
- border : 1px solid #aaa;
603
- outline : 0
604
- }
605
-
606
- .select2-container--classic .select2-search--inline .select2-search__field {
607
- outline : 0;
608
- -webkit-box-shadow : none;
609
- box-shadow : none
610
- }
611
-
612
- .select2-container--classic .select2-dropdown {
613
- background-color : #fff;
614
- border : 1px solid transparent
615
- }
616
-
617
- .select2-container--classic .select2-dropdown--above {
618
- border-bottom : none
619
- }
620
-
621
- .select2-container--classic .select2-dropdown--below {
622
- border-top : none
623
- }
624
-
625
- .select2-container--classic .select2-results > .select2-results__options {
626
- max-height : 200px;
627
- overflow-y : auto
628
- }
629
-
630
- .select2-container--classic .select2-results__option[role=group] {
631
- padding : 0
632
- }
633
-
634
- .select2-container--classic .select2-results__option[aria-disabled=true] {
635
- color : grey
636
- }
637
-
638
- .select2-container--classic .select2-results__option--highlighted[aria-selected], .select2-container--classic .select2-results__option--highlighted[data-selected] {
639
- background-color : #3875d7;
640
- color : #fff
641
- }
642
-
643
- .select2-container--classic .select2-results__group {
644
- cursor : default;
645
- display : block;
646
- padding : 6px
647
- }
648
-
649
- .select2-container--classic.select2-container--open .select2-dropdown {
650
- border-color : #0073aa
651
- }
652
-
653
-
654
- .select2-drop, .select2-dropdown {
655
- z-index : 999999 !important
656
- }
657
-
658
- .select2-results {
659
- line-height : 1.5em
660
- }
661
-
662
- .select2-results .select2-results__group, .select2-results .select2-results__option {
663
- margin : 0;
664
- padding : 8px
665
- }
666
-
667
- .select2-results .description {
668
- display : block;
669
- color : #999;
670
- padding-top : 4px
671
- }
672
-
673
- .select2-dropdown {
674
- border-color : #ddd
675
- }
676
-
677
- .select2-dropdown--below {
678
- -webkit-box-shadow : 0 1px 1px rgba(0, 0, 0, .1);
679
- box-shadow : 0 1px 1px rgba(0, 0, 0, .1)
680
- }
681
-
682
- .select2-dropdown--above {
683
- -webkit-box-shadow : 0 -1px 1px rgba(0, 0, 0, .1);
684
- box-shadow : 0 -1px 1px rgba(0, 0, 0, .1)
685
- }
686
-
687
- .select2-container .select2-selection__rendered.ui-sortable li {
688
- cursor : move
689
- }
690
-
691
- .select2-container .select2-selection {
692
- border-color : #ddd
693
- }
694
-
695
- .select2-container .select2-search__field {
696
- min-width : 150px
697
- }
698
-
699
- .select2-container .select2-selection--single {
700
- height : 32px
701
- }
702
-
703
- .select2-container .select2-selection--single .select2-selection__rendered {
704
- line-height : 32px;
705
- padding-right : 24px
706
- }
707
-
708
- .select2-container .select2-selection--single .select2-selection__arrow {
709
- right : 3px;
710
- height : 30px
711
- }
712
-
713
- .select2-container .select2-selection--multiple {
714
- min-height : 28px;
715
- border-radius : 0;
716
- line-height : 1.5
717
- }
718
-
719
- .select2-container .select2-selection--multiple li {
720
- margin : 0
721
- }
722
-
723
- .select2-container .select2-selection--multiple .select2-selection__choice {
724
- padding : 2px 6px
725
- }
726
-
727
- .select2-container .select2-selection--multiple .select2-selection__choice .description {
728
- display : none
729
- }
730
-
731
- .select2-container .select2-selection__clear {
732
- color : #999;
733
- margin-top : -1px
734
- }
735
-
736
- .select2-container .select2-search--inline .select2-search__field {
737
- font-family : inherit;
738
- font-size : inherit;
739
- font-weight : inherit;
740
- padding : 3px 0
741
  }
1
+ .select2-container {
2
+ -webkit-box-sizing : border-box;
3
+ box-sizing : border-box;
4
+ display : inline-block;
5
+ margin : 0;
6
+ position : relative;
7
+ vertical-align : middle
8
+ }
9
+
10
+ .select2-container .select2-selection--single {
11
+ -webkit-box-sizing : border-box;
12
+ box-sizing : border-box;
13
+ cursor : pointer;
14
+ display : block;
15
+ height : 28px;
16
+ margin : 0 0 -4px;
17
+ -moz-user-select : none;
18
+ -ms-user-select : none;
19
+ user-select : none;
20
+ -webkit-user-select : none
21
+ }
22
+
23
+ .select2-container .select2-selection--single .select2-selection__rendered {
24
+ display : block;
25
+ padding-left : 8px;
26
+ padding-right : 20px;
27
+ overflow : hidden;
28
+ text-overflow : ellipsis;
29
+ white-space : nowrap
30
+ }
31
+
32
+ .select2-container .select2-selection--single .select2-selection__clear {
33
+ position : relative
34
+ }
35
+
36
+ .select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered {
37
+ padding-right : 8px;
38
+ padding-left : 20px
39
+ }
40
+
41
+ .select2-container .select2-selection--multiple {
42
+ -webkit-box-sizing : border-box;
43
+ box-sizing : border-box;
44
+ cursor : pointer;
45
+ display : block;
46
+ min-height : 32px;
47
+ -moz-user-select : none;
48
+ -ms-user-select : none;
49
+ user-select : none;
50
+ -webkit-user-select : none
51
+ }
52
+
53
+ .select2-container .select2-selection--multiple .select2-selection__rendered {
54
+ display : inline-block;
55
+ overflow : hidden;
56
+ padding-left : 8px;
57
+ text-overflow : ellipsis;
58
+ white-space : nowrap
59
+ }
60
+
61
+ .select2-container .select2-search--inline {
62
+ float : left;
63
+ padding : 0
64
+ }
65
+
66
+ .select2-container .select2-search--inline .select2-search__field {
67
+ -webkit-box-sizing : border-box;
68
+ box-sizing : border-box;
69
+ border : none;
70
+ font-size : 100%;
71
+ margin : 0;
72
+ padding : 0
73
+ }
74
+
75
+ .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button {
76
+ -webkit-appearance : none
77
+ }
78
+
79
+ .select2-dropdown {
80
+ background-color : #fff;
81
+ border : 1px solid #aaa;
82
+ border-radius : 4px;
83
+ -webkit-box-sizing : border-box;
84
+ box-sizing : border-box;
85
+ display : block;
86
+ position : absolute;
87
+ left : -100000px;
88
+ width : 100%;
89
+ z-index : 1051
90
+ }
91
+
92
+ .select2-results {
93
+ display : block
94
+ }
95
+
96
+ .select2-results__options {
97
+ list-style : none;
98
+ margin : 0;
99
+ padding : 0
100
+ }
101
+
102
+ .select2-results__option {
103
+ padding : 6px;
104
+ -moz-user-select : none;
105
+ -ms-user-select : none;
106
+ user-select : none;
107
+ -webkit-user-select : none
108
+ }
109
+
110
+ .select2-results__option[aria-selected], .select2-results__option[data-selected] {
111
+ cursor : pointer
112
+ }
113
+
114
+ .select2-container--open .select2-dropdown {
115
+ left : 0
116
+ }
117
+
118
+ .select2-container--open .select2-dropdown--above {
119
+ border-bottom : none;
120
+ border-bottom-left-radius : 0;
121
+ border-bottom-right-radius : 0
122
+ }
123
+
124
+ .select2-container--open .select2-dropdown--below {
125
+ border-top : none;
126
+ border-top-left-radius : 0;
127
+ border-top-right-radius : 0
128
+ }
129
+
130
+ .select2-search--dropdown {
131
+ display : block;
132
+ padding : 4px
133
+ }
134
+
135
+ .select2-search--dropdown .select2-search__field {
136
+ padding : 4px;
137
+ width : 100%;
138
+ -webkit-box-sizing : border-box;
139
+ box-sizing : border-box
140
+ }
141
+
142
+ .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button {
143
+ -webkit-appearance : none
144
+ }
145
+
146
+ .select2-search--dropdown.select2-search--hide {
147
+ display : none
148
+ }
149
+
150
+ .select2-close-mask {
151
+ border : 0;
152
+ margin : 0;
153
+ padding : 0;
154
+ display : block;
155
+ position : fixed;
156
+ left : 0;
157
+ top : 0;
158
+ min-height : 100%;
159
+ min-width : 100%;
160
+ height : auto;
161
+ width : auto;
162
+ opacity : 0;
163
+ z-index : 99;
164
+ background-color : #fff
165
+ }
166
+
167
+ .select2-hidden-accessible {
168
+ border : 0 !important;
169
+ clip : rect(0 0 0 0) !important;
170
+ height : 1px !important;
171
+ margin : -1px !important;
172
+ overflow : hidden !important;
173
+ padding : 0 !important;
174
+ position : absolute !important;
175
+ width : 1px !important
176
+ }
177
+
178
+ .select2-container--default .select2-selection--single {
179
+ background-color : #fff;
180
+ border : 1px solid #aaa;
181
+ border-radius : 4px
182
+ }
183
+
184
+ .select2-container--default .select2-selection--single .select2-selection__rendered {
185
+ color : #444;
186
+ line-height : 28px
187
+ }
188
+
189
+ .select2-container--default .select2-selection--single .select2-selection__clear {
190
+ cursor : pointer;
191
+ float : right;
192
+ font-weight : 700
193
+ }
194
+
195
+ .select2-container--default .select2-selection--single .select2-selection__placeholder {
196
+ color : #999
197
+ }
198
+
199
+ .select2-container--default .select2-selection--single .select2-selection__arrow {
200
+ height : 26px;
201
+ position : absolute;
202
+ top : 1px;
203
+ right : 1px;
204
+ width : 20px
205
+ }
206
+
207
+ .select2-container--default .select2-selection--single .select2-selection__arrow b {
208
+ border-color : #888 transparent transparent transparent;
209
+ border-style : solid;
210
+ border-width : 5px 4px 0 4px;
211
+ height : 0;
212
+ left : 50%;
213
+ margin-left : -4px;
214
+ margin-top : -2px;
215
+ position : absolute;
216
+ top : 50%;
217
+ width : 0
218
+ }
219
+
220
+ .select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear {
221
+ float : left
222
+ }
223
+
224
+ .select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow {
225
+ left : 1px;
226
+ right : auto
227
+ }
228
+
229
+ .select2-container--default.select2-container--disabled .select2-selection--single {
230
+ background-color : #eee;
231
+ cursor : default
232
+ }
233
+
234
+ .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear {
235
+ display : none
236
+ }
237
+
238
+ .select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b {
239
+ border-color : transparent transparent #888 transparent;
240
+ border-width : 0 4px 5px 4px
241
+ }
242
+
243
+ .select2-container--default .select2-selection--multiple {
244
+ background-color : #fff;
245
+ border : 1px solid #aaa;
246
+ cursor : text;
247
+ }
248
+
249
+ .select2-container--default .select2-selection--multiple .select2-selection__rendered {
250
+ -webkit-box-sizing : border-box;
251
+ box-sizing : border-box;
252
+ list-style : none;
253
+ margin : 0;
254
+ padding : 0 5px;
255
+ width : 100%
256
+ }
257
+
258
+ .select2-container--default .select2-selection--multiple .select2-selection__rendered li {
259
+ list-style : none;
260
+ margin : 5px 5px 0 0
261
+ }
262
+
263
+ .select2-container--default .select2-selection--multiple .select2-selection__rendered li:before {
264
+ content : '';
265
+ display : none
266
+ }
267
+
268
+ .select2-container--default .select2-selection--multiple .select2-selection__placeholder {
269
+ color : #999;
270
+ margin-top : 5px;
271
+ float : left
272
+ }
273
+
274
+ .select2-container--default .select2-selection--multiple .select2-selection__clear {
275
+ cursor : pointer;
276
+ float : right;
277
+ font-weight : 700;
278
+ margin-top : 5px;
279
+ margin-right : 10px
280
+ }
281
+
282
+ .select2-container--default .select2-selection--multiple .select2-selection__choice {
283
+ background-color : #e4e4e4;
284
+ border : 1px solid #aaa;
285
+ border-radius : 4px;
286
+ cursor : default;
287
+ float : left;
288
+ margin-right : 5px;
289
+ margin-top : 5px;
290
+ padding : 0 5px
291
+ }
292
+
293
+ .select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
294
+ color : #999;
295
+ cursor : pointer;
296
+ display : inline-block;
297
+ font-weight : 700;
298
+ margin-right : 2px
299
+ }
300
+
301
+ .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover {
302
+ color : #333
303
+ }
304
+
305
+ .select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline, .select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder {
306
+ float : right
307
+ }
308
+
309
+ .select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice {
310
+ margin-left : 5px;
311
+ margin-right : auto
312
+ }
313
+
314
+ .select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove {
315
+ margin-left : 2px;
316
+ margin-right : auto
317
+ }
318
+
319
+ .select2-container--default.select2-container--focus .select2-selection--multiple {
320
+ border : solid #000 1px;
321
+ outline : 0
322
+ }
323
+
324
+ .select2-container--default.select2-container--disabled .select2-selection--multiple {
325
+ background-color : #eee;
326
+ cursor : default
327
+ }
328
+
329
+ .select2-container--default.select2-container--disabled .select2-selection__choice__remove {
330
+ display : none
331
+ }
332
+
333
+ .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple, .select2-container--default.select2-container--open.select2-container--above .select2-selection--single {
334
+ border-top-left-radius : 0;
335
+ border-top-right-radius : 0
336
+ }
337
+
338
+ .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple, .select2-container--default.select2-container--open.select2-container--below .select2-selection--single {
339
+ border-bottom-left-radius : 0;
340
+ border-bottom-right-radius : 0
341
+ }
342
+
343
+ .select2-container--default .select2-search--dropdown .select2-search__field {
344
+ border : 1px solid #aaa
345
+ }
346
+
347
+ .select2-container--default .select2-search--inline .select2-search__field {
348
+ background : 0 0;
349
+ border : none;
350
+ outline : 0;
351
+ -webkit-box-shadow : none;
352
+ box-shadow : none;
353
+ -webkit-appearance : textfield
354
+ }
355
+
356
+ .select2-container--default .select2-results > .select2-results__options {
357
+ max-height : 200px;
358
+ overflow-y : auto
359
+ }
360
+
361
+ .select2-container--default .select2-results__option[role=group] {
362
+ padding : 0
363
+ }
364
+
365
+ .select2-container--default .select2-results__option[aria-disabled=true] {
366
+ color : #999
367
+ }
368
+
369
+ .select2-container--default .select2-results__option[aria-selected=true], .select2-container--default .select2-results__option[data-selected=true] {
370
+ background-color : #ddd
371
+ }
372
+
373
+ .select2-container--default .select2-results__option .select2-results__option {
374
+ padding-left : 1em
375
+ }
376
+
377
+ .select2-container--default .select2-results__option .select2-results__option .select2-results__group {
378
+ padding-left : 0
379
+ }
380
+
381
+ .select2-container--default .select2-results__option .select2-results__option .select2-results__option {
382
+ margin-left : -1em;
383
+ padding-left : 2em
384
+ }
385
+
386
+ .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
387
+ margin-left : -2em;
388
+ padding-left : 3em
389
+ }
390
+
391
+ .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
392
+ margin-left : -3em;
393
+ padding-left : 4em
394
+ }
395
+
396
+ .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
397
+ margin-left : -4em;
398
+ padding-left : 5em
399
+ }
400
+
401
+ .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
402
+ margin-left : -5em;
403
+ padding-left : 6em
404
+ }
405
+
406
+ .select2-container--default .select2-results__option--highlighted[aria-selected], .select2-container--default .select2-results__option--highlighted[data-selected] {
407
+ background-color : #0073aa;
408
+ color : #fff
409
+ }
410
+
411
+ .select2-container--default .select2-results__group {
412
+ cursor : default;
413
+ display : block;
414
+ padding : 6px
415
+ }
416
+
417
+ .select2-container--classic .select2-selection--single {
418
+ background-color : #f7f7f7;
419
+ border : 1px solid #aaa;
420
+ border-radius : 4px;
421
+ outline : 0;
422
+ background-image : -webkit-gradient(linear, left top, left bottom, color-stop(50%, #fff), to(#eee));
423
+ background-image : -webkit-linear-gradient(top, #fff 50%, #eee 100%);
424
+ background-image : linear-gradient(to bottom, #fff 50%, #eee 100%);
425
+ background-repeat : repeat-x
426
+ }
427
+
428
+ .select2-container--classic .select2-selection--single:focus {
429
+ border : 1px solid #0073aa
430
+ }
431
+
432
+ .select2-container--classic .select2-selection--single .select2-selection__rendered {
433
+ color : #444;
434
+ line-height : 28px
435
+ }
436
+
437
+ .select2-container--classic .select2-selection--single .select2-selection__clear {
438
+ cursor : pointer;
439
+ float : right;
440
+ font-weight : 700;
441
+ margin-right : 10px
442
+ }
443
+
444
+ .select2-container--classic .select2-selection--single .select2-selection__placeholder {
445
+ color : #999
446
+ }
447
+
448
+ .select2-container--classic .select2-selection--single .select2-selection__arrow {
449
+ background-color : #ddd;
450
+ border : none;
451
+ border-left : 1px solid #aaa;
452
+ border-top-right-radius : 4px;
453
+ border-bottom-right-radius : 4px;
454
+ height : 26px;
455
+ position : absolute;
456
+ top : 1px;
457
+ right : 1px;
458
+ width : 20px;
459
+ background-image : -webkit-gradient(linear, left top, left bottom, color-stop(50%, #eee), to(#ccc));
460
+ background-image : -webkit-linear-gradient(top, #eee 50%, #ccc 100%);
461
+ background-image : linear-gradient(to bottom, #eee 50%, #ccc 100%);
462
+ background-repeat : repeat-x
463
+ }
464
+
465
+ .select2-container--classic .select2-selection--single .select2-selection__arrow b {
466
+ border-color : #888 transparent transparent transparent;
467
+ border-style : solid;
468
+ border-width : 5px 4px 0 4px;
469
+ height : 0;
470
+ left : 50%;
471
+ margin-left : -4px;
472
+ margin-top : -2px;
473
+ position : absolute;
474
+ top : 50%;
475
+ width : 0
476
+ }
477
+
478
+ .select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear {
479
+ float : left
480
+ }
481
+
482
+ .select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow {
483
+ border : none;
484
+ border-right : 1px solid #aaa;
485
+ border-radius : 0;
486
+ border-top-left-radius : 4px;
487
+ border-bottom-left-radius : 4px;
488
+ left : 1px;
489
+ right : auto
490
+ }
491
+
492
+ .select2-container--classic.select2-container--open .select2-selection--single {
493
+ border : 1px solid #0073aa
494
+ }
495
+
496
+ .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow {
497
+ background : 0 0;
498
+ border : none
499
+ }
500
+
501
+ .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b {
502
+ border-color : transparent transparent #888 transparent;
503
+ border-width : 0 4px 5px 4px
504
+ }
505
+
506
+ .select2-container--classic.select2-container--open.select2-container--above .select2-selection--single {
507
+ border-top : none;
508
+ border-top-left-radius : 0;
509
+ border-top-right-radius : 0;
510
+ background-image : -webkit-gradient(linear, left top, left bottom, from(white), color-stop(50%, #eee));
511
+ background-image : -webkit-linear-gradient(top, #fff 0, #eee 50%);
512
+ background-image : linear-gradient(to bottom, #fff 0, #eee 50%);
513
+ background-repeat : repeat-x
514
+ }
515
+
516
+ .select2-container--classic.select2-container--open.select2-container--below .select2-selection--single {
517
+ border-bottom : none;
518
+ border-bottom-left-radius : 0;
519
+ border-bottom-right-radius : 0;
520
+ background-image : -webkit-gradient(linear, left top, left bottom, color-stop(50%, #eee), to(white));
521
+ background-image : -webkit-linear-gradient(top, #eee 50%, #fff 100%);
522
+ background-image : linear-gradient(to bottom, #eee 50%, #fff 100%);
523
+ background-repeat : repeat-x
524
+ }
525
+
526
+ .select2-container--classic .select2-selection--multiple {
527
+ background-color : #fff;
528
+ border : 1px solid #aaa;
529
+ border-radius : 4px;
530
+ cursor : text;
531
+ outline : 0
532
+ }
533
+
534
+ .select2-container--classic .select2-selection--multiple:focus {
535
+ border : 1px solid #0073aa
536
+ }
537
+
538
+ .select2-container--classic .select2-selection--multiple .select2-selection__rendered {
539
+ list-style : none;
540
+ margin : 0;
541
+ padding : 0 5px
542
+ }
543
+
544
+ .select2-container--classic .select2-selection--multiple .select2-selection__clear {
545
+ display : none
546
+ }
547
+
548
+ .select2-container--classic .select2-selection--multiple .select2-selection__choice {
549
+ background-color : #e4e4e4;
550
+ border : 1px solid #aaa;
551
+ border-radius : 4px;
552
+ cursor : default;
553
+ float : left;
554
+ margin-right : 5px;
555
+ margin-top : 5px;
556
+ padding : 0 5px
557
+ }
558
+
559
+ .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove {
560
+ color : #888;
561
+ cursor : pointer;
562
+ display : inline-block;
563
+ font-weight : 700;
564
+ margin-right : 2px
565
+ }
566
+
567
+ .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover {
568
+ color : #555
569
+ }
570
+
571
+ .select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice {
572
+ float : right
573
+ }
574
+
575
+ .select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice {
576
+ margin-left : 5px;
577
+ margin-right : auto
578
+ }
579
+
580
+ .select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove {
581
+ margin-left : 2px;
582
+ margin-right : auto
583
+ }
584
+
585
+ .select2-container--classic.select2-container--open .select2-selection--multiple {
586
+ border : 1px solid #0073aa
587
+ }
588
+
589
+ .select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple {
590
+ border-top : none;
591
+ border-top-left-radius : 0;
592
+ border-top-right-radius : 0
593
+ }
594
+
595
+ .select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple {
596
+ border-bottom : none;
597
+ border-bottom-left-radius : 0;
598
+ border-bottom-right-radius : 0
599
+ }
600
+
601
+ .select2-container--classic .select2-search--dropdown .select2-search__field {
602
+ border : 1px solid #aaa;
603
+ outline : 0
604
+ }
605
+
606
+ .select2-container--classic .select2-search--inline .select2-search__field {
607
+ outline : 0;
608
+ -webkit-box-shadow : none;
609
+ box-shadow : none
610
+ }
611
+
612
+ .select2-container--classic .select2-dropdown {
613
+ background-color : #fff;
614
+ border : 1px solid transparent
615
+ }
616
+
617
+ .select2-container--classic .select2-dropdown--above {
618
+ border-bottom : none
619
+ }
620
+
621
+ .select2-container--classic .select2-dropdown--below {
622
+ border-top : none
623
+ }
624
+
625
+ .select2-container--classic .select2-results > .select2-results__options {
626
+ max-height : 200px;
627
+ overflow-y : auto
628
+ }
629
+
630
+ .select2-container--classic .select2-results__option[role=group] {
631
+ padding : 0
632
+ }
633
+
634
+ .select2-container--classic .select2-results__option[aria-disabled=true] {
635
+ color : grey
636
+ }
637
+
638
+ .select2-container--classic .select2-results__option--highlighted[aria-selected], .select2-container--classic .select2-results__option--highlighted[data-selected] {
639
+ background-color : #3875d7;
640
+ color : #fff
641
+ }
642
+
643
+ .select2-container--classic .select2-results__group {
644
+ cursor : default;
645
+ display : block;
646
+ padding : 6px
647
+ }
648
+
649
+ .select2-container--classic.select2-container--open .select2-dropdown {
650
+ border-color : #0073aa
651
+ }
652
+
653
+
654
+ .select2-drop, .select2-dropdown {
655
+ z-index : 999999 !important
656
+ }
657
+
658
+ .select2-results {
659
+ line-height : 1.5em
660
+ }
661
+
662
+ .select2-results .select2-results__group, .select2-results .select2-results__option {
663
+ margin : 0;
664
+ padding : 8px
665
+ }
666
+
667
+ .select2-results .description {
668
+ display : block;
669
+ color : #999;
670
+ padding-top : 4px
671
+ }
672
+
673
+ .select2-dropdown {
674
+ border-color : #ddd
675
+ }
676
+
677
+ .select2-dropdown--below {
678
+ -webkit-box-shadow : 0 1px 1px rgba(0, 0, 0, .1);
679
+ box-shadow : 0 1px 1px rgba(0, 0, 0, .1)
680
+ }
681
+
682
+ .select2-dropdown--above {
683
+ -webkit-box-shadow : 0 -1px 1px rgba(0, 0, 0, .1);
684
+ box-shadow : 0 -1px 1px rgba(0, 0, 0, .1)
685
+ }
686
+
687
+ .select2-container .select2-selection__rendered.ui-sortable li {
688
+ cursor : move
689
+ }
690
+
691
+ .select2-container .select2-selection {
692
+ border-color : #ddd
693
+ }
694
+
695
+ .select2-container .select2-search__field {
696
+ min-width : 150px
697
+ }
698
+
699
+ .select2-container .select2-selection--single {
700
+ height : 32px
701
+ }
702
+
703
+ .select2-container .select2-selection--single .select2-selection__rendered {
704
+ line-height : 32px;
705
+ padding-right : 24px
706
+ }
707
+
708
+ .select2-container .select2-selection--single .select2-selection__arrow {
709
+ right : 3px;
710
+ height : 30px
711
+ }
712
+
713
+ .select2-container .select2-selection--multiple {
714
+ min-height : 28px;
715
+ border-radius : 0;
716
+ line-height : 1.5
717
+ }
718
+
719
+ .select2-container .select2-selection--multiple li {
720
+ margin : 0
721
+ }
722
+
723
+ .select2-container .select2-selection--multiple .select2-selection__choice {
724
+ padding : 2px 6px
725
+ }
726
+
727
+ .select2-container .select2-selection--multiple .select2-selection__choice .description {
728
+ display : none
729
+ }
730
+
731
+ .select2-container .select2-selection__clear {
732
+ color : #999;
733
+ margin-top : -1px
734
+ }
735
+
736
+ .select2-container .select2-search--inline .select2-search__field {
737
+ font-family : inherit;
738
+ font-size : inherit;
739
+ font-weight : inherit;
740
+ padding : 3px 0
741
  }
plugin-fw/assets/js/codemirror/codemirror.js CHANGED
@@ -1,5799 +1,5799 @@
1
- // CodeMirror version 3.15
2
- //
3
- // CodeMirror is the only global var we claim
4
- window.CodeMirror = (function() {
5
- "use strict";
6
-
7
- // BROWSER SNIFFING
8
-
9
- // Crude, but necessary to handle a number of hard-to-feature-detect
10
- // bugs and behavior differences.
11
- var gecko = /gecko\/\d/i.test(navigator.userAgent);
12
- var ie = /MSIE \d/.test(navigator.userAgent);
13
- var ie_lt8 = ie && (document.documentMode == null || document.documentMode < 8);
14
- var ie_lt9 = ie && (document.documentMode == null || document.documentMode < 9);
15
- var webkit = /WebKit\//.test(navigator.userAgent);
16
- var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(navigator.userAgent);
17
- var chrome = /Chrome\//.test(navigator.userAgent);
18
- var opera = /Opera\//.test(navigator.userAgent);
19
- var safari = /Apple Computer/.test(navigator.vendor);
20
- var khtml = /KHTML\//.test(navigator.userAgent);
21
- var mac_geLion = /Mac OS X 1\d\D([7-9]|\d\d)\D/.test(navigator.userAgent);
22
- var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent);
23
- var phantom = /PhantomJS/.test(navigator.userAgent);
24
-
25
- var ios = /AppleWebKit/.test(navigator.userAgent) && /Mobile\/\w+/.test(navigator.userAgent);
26
- // This is woefully incomplete. Suggestions for alternative methods welcome.
27
- var mobile = ios || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent);
28
- var mac = ios || /Mac/.test(navigator.platform);
29
- var windows = /windows/i.test(navigator.platform);
30
-
31
- var opera_version = opera && navigator.userAgent.match(/Version\/(\d*\.\d*)/);
32
- if (opera_version) opera_version = Number(opera_version[1]);
33
- if (opera_version && opera_version >= 15) { opera = false; webkit = true; }
34
- // Some browsers use the wrong event properties to signal cmd/ctrl on OS X
35
- var flipCtrlCmd = mac && (qtwebkit || opera && (opera_version == null || opera_version < 12.11));
36
- var captureMiddleClick = gecko || (ie && !ie_lt9);
37
-
38
- // Optimize some code when these features are not used
39
- var sawReadOnlySpans = false, sawCollapsedSpans = false;
40
-
41
- // CONSTRUCTOR
42
-
43
- function CodeMirror(place, options) {
44
- if (!(this instanceof CodeMirror)) return new CodeMirror(place, options);
45
-
46
- this.options = options = options || {};
47
- // Determine effective options based on given values and defaults.
48
- for (var opt in defaults) if (!options.hasOwnProperty(opt) && defaults.hasOwnProperty(opt))
49
- options[opt] = defaults[opt];
50
- setGuttersForLineNumbers(options);
51
-
52
- var docStart = typeof options.value == "string" ? 0 : options.value.first;
53
- var display = this.display = makeDisplay(place, docStart);
54
- display.wrapper.CodeMirror = this;
55
- updateGutters(this);
56
- if (options.autofocus && !mobile) focusInput(this);
57
-
58
- this.state = {keyMaps: [],
59
- overlays: [],
60
- modeGen: 0,
61
- overwrite: false, focused: false,
62
- suppressEdits: false, pasteIncoming: false,
63
- draggingText: false,
64
- highlight: new Delayed()};
65
-
66
- themeChanged(this);
67
- if (options.lineWrapping)
68
- this.display.wrapper.className += " CodeMirror-wrap";
69
-
70
- var doc = options.value;
71
- if (typeof doc == "string") doc = new Doc(options.value, options.mode);
72
- operation(this, attachDoc)(this, doc);
73
-
74
- // Override magic textarea content restore that IE sometimes does
75
- // on our hidden textarea on reload
76
- if (ie) setTimeout(bind(resetInput, this, true), 20);
77
-
78
- registerEventHandlers(this);
79
- // IE throws unspecified error in certain cases, when
80
- // trying to access activeElement before onload
81
- var hasFocus; try { hasFocus = (document.activeElement == display.input); } catch(e) { }
82
- if (hasFocus || (options.autofocus && !mobile)) setTimeout(bind(onFocus, this), 20);
83
- else onBlur(this);
84
-
85
- operation(this, function() {
86
- for (var opt in optionHandlers)
87
- if (optionHandlers.propertyIsEnumerable(opt))
88
- optionHandlers[opt](this, options[opt], Init);
89
- for (var i = 0; i < initHooks.length; ++i) initHooks[i](this);
90
- })();
91
- }
92
-
93
- // DISPLAY CONSTRUCTOR
94
-
95
- function makeDisplay(place, docStart) {
96
- var d = {};
97
-
98
- var input = d.input = elt("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em; outline: none; font-size: 4px;");
99
- if (webkit) input.style.width = "1000px";
100
- else input.setAttribute("wrap", "off");
101
- // if border: 0; -- iOS fails to open keyboard (issue #1287)
102
- if (ios) input.style.border = "1px solid black";
103
- input.setAttribute("autocorrect", "off"); input.setAttribute("autocapitalize", "off"); input.setAttribute("spellcheck", "false");
104
-
105
- // Wraps and hides input textarea
106
- d.inputDiv = elt("div", [input], null, "overflow: hidden; position: relative; width: 3px; height: 0px;");
107
- // The actual fake scrollbars.
108
- d.scrollbarH = elt("div", [elt("div", null, null, "height: 1px")], "CodeMirror-hscrollbar");
109
- d.scrollbarV = elt("div", [elt("div", null, null, "width: 1px")], "CodeMirror-vscrollbar");
110
- d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler");
111
- d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler");
112
- // DIVs containing the selection and the actual code
113
- d.lineDiv = elt("div", null, "CodeMirror-code");
114
- d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1");
115
- // Blinky cursor, and element used to ensure cursor fits at the end of a line
116
- d.cursor = elt("div", "\u00a0", "CodeMirror-cursor");
117
- // Secondary cursor, shown when on a 'jump' in bi-directional text
118
- d.otherCursor = elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor");
119
- // Used to measure text size
120
- d.measure = elt("div", null, "CodeMirror-measure");
121
- // Wraps everything that needs to exist inside the vertically-padded coordinate system
122
- d.lineSpace = elt("div", [d.measure, d.selectionDiv, d.lineDiv, d.cursor, d.otherCursor],
123
- null, "position: relative; outline: none");
124
- // Moved around its parent to cover visible view
125
- d.mover = elt("div", [elt("div", [d.lineSpace], "CodeMirror-lines")], null, "position: relative");
126
- // Set to the height of the text, causes scrolling
127
- d.sizer = elt("div", [d.mover], "CodeMirror-sizer");
128
- // D is needed because behavior of elts with overflow: auto and padding is inconsistent across browsers
129
- d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerCutOff + "px; width: 1px;");
130
- // Will contain the gutters, if any
131
- d.gutters = elt("div", null, "CodeMirror-gutters");
132
- d.lineGutter = null;
133
- // Provides scrolling
134
- d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll");
135
- d.scroller.setAttribute("tabIndex", "-1");
136
- // The element in which the editor lives.
137
- d.wrapper = elt("div", [d.inputDiv, d.scrollbarH, d.scrollbarV,
138
- d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror");
139
- // Work around IE7 z-index bug
140
- if (ie_lt8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; }
141
- if (place.appendChild) place.appendChild(d.wrapper); else place(d.wrapper);
142
-
143
- // Needed to hide big blue blinking cursor on Mobile Safari
144
- if (ios) input.style.width = "0px";
145
- if (!webkit) d.scroller.draggable = true;
146
- // Needed to handle Tab key in KHTML
147
- if (khtml) { d.inputDiv.style.height = "1px"; d.inputDiv.style.position = "absolute"; }
148
- // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).
149
- else if (ie_lt8) d.scrollbarH.style.minWidth = d.scrollbarV.style.minWidth = "18px";
150
-
151
- // Current visible range (may be bigger than the view window).
152
- d.viewOffset = d.lastSizeC = 0;
153
- d.showingFrom = d.showingTo = docStart;
154
-
155
- // Used to only resize the line number gutter when necessary (when
156
- // the amount of lines crosses a boundary that makes its width change)
157
- d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null;
158
- // See readInput and resetInput
159
- d.prevInput = "";
160
- // Set to true when a non-horizontal-scrolling widget is added. As
161
- // an optimization, widget aligning is skipped when d is false.
162
- d.alignWidgets = false;
163
- // Flag that indicates whether we currently expect input to appear
164
- // (after some event like 'keypress' or 'input') and are polling
165
- // intensively.
166
- d.pollingFast = false;
167
- // Self-resetting timeout for the poller
168
- d.poll = new Delayed();
169
-
170
- d.cachedCharWidth = d.cachedTextHeight = null;
171
- d.measureLineCache = [];
172
- d.measureLineCachePos = 0;
173
-
174
- // Tracks when resetInput has punted to just putting a short
175
- // string instead of the (large) selection.
176
- d.inaccurateSelection = false;
177
-
178
- // Tracks the maximum line length so that the horizontal scrollbar
179
- // can be kept static when scrolling.
180
- d.maxLine = null;
181
- d.maxLineLength = 0;
182
- d.maxLineChanged = false;
183
-
184
- // Used for measuring wheel scrolling granularity
185
- d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null;
186
-
187
- return d;
188
- }
189
-
190
- // STATE UPDATES
191
-
192
- // Used to get the editor into a consistent state again when options change.
193
-
194
- function loadMode(cm) {
195
- cm.doc.mode = CodeMirror.getMode(cm.options, cm.doc.modeOption);
196
- cm.doc.iter(function(line) {
197
- if (line.stateAfter) line.stateAfter = null;
198
- if (line.styles) line.styles = null;
199
- });
200
- cm.doc.frontier = cm.doc.first;
201
- startWorker(cm, 100);
202
- cm.state.modeGen++;
203
- if (cm.curOp) regChange(cm);
204
- }
205
-
206
- function wrappingChanged(cm) {
207
- if (cm.options.lineWrapping) {
208
- cm.display.wrapper.className += " CodeMirror-wrap";
209
- cm.display.sizer.style.minWidth = "";
210
- } else {
211
- cm.display.wrapper.className = cm.display.wrapper.className.replace(" CodeMirror-wrap", "");
212
- computeMaxLength(cm);
213
- }
214
- estimateLineHeights(cm);
215
- regChange(cm);
216
- clearCaches(cm);
217
- setTimeout(function(){updateScrollbars(cm);}, 100);
218
- }
219
-
220
- function estimateHeight(cm) {
221
- var th = textHeight(cm.display), wrapping = cm.options.lineWrapping;
222
- var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3);
223
- return function(line) {
224
- if (lineIsHidden(cm.doc, line))
225
- return 0;
226
- else if (wrapping)
227
- return (Math.ceil(line.text.length / perLine) || 1) * th;
228
- else
229
- return th;
230
- };
231
- }
232
-
233
- function estimateLineHeights(cm) {
234
- var doc = cm.doc, est = estimateHeight(cm);
235
- doc.iter(function(line) {
236
- var estHeight = est(line);
237
- if (estHeight != line.height) updateLineHeight(line, estHeight);
238
- });
239
- }
240
-
241
- function keyMapChanged(cm) {
242
- var map = keyMap[cm.options.keyMap], style = map.style;
243
- cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-keymap-\S+/g, "") +
244
- (style ? " cm-keymap-" + style : "");
245
- cm.state.disableInput = map.disableInput;
246
- }
247
-
248
- function themeChanged(cm) {
249
- cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") +
250
- cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-");
251
- clearCaches(cm);
252
- }
253
-
254
- function guttersChanged(cm) {
255
- updateGutters(cm);
256
- regChange(cm);
257
- setTimeout(function(){alignHorizontally(cm);}, 20);
258
- }
259
-
260
- function updateGutters(cm) {
261
- var gutters = cm.display.gutters, specs = cm.options.gutters;
262
- removeChildren(gutters);
263
- for (var i = 0; i < specs.length; ++i) {
264
- var gutterClass = specs[i];
265
- var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + gutterClass));
266
- if (gutterClass == "CodeMirror-linenumbers") {
267
- cm.display.lineGutter = gElt;
268
- gElt.style.width = (cm.display.lineNumWidth || 1) + "px";
269
- }
270
- }
271
- gutters.style.display = i ? "" : "none";
272
- }
273
-
274
- function lineLength(doc, line) {
275
- if (line.height == 0) return 0;
276
- var len = line.text.length, merged, cur = line;
277
- while (merged = collapsedSpanAtStart(cur)) {
278
- var found = merged.find();
279
- cur = getLine(doc, found.from.line);
280
- len += found.from.ch - found.to.ch;
281
- }
282
- cur = line;
283
- while (merged = collapsedSpanAtEnd(cur)) {
284
- var found = merged.find();
285
- len -= cur.text.length - found.from.ch;
286
- cur = getLine(doc, found.to.line);
287
- len += cur.text.length - found.to.ch;
288
- }
289
- return len;
290
- }
291
-
292
- function computeMaxLength(cm) {
293
- var d = cm.display, doc = cm.doc;
294
- d.maxLine = getLine(doc, doc.first);
295
- d.maxLineLength = lineLength(doc, d.maxLine);
296
- d.maxLineChanged = true;
297
- doc.iter(function(line) {
298
- var len = lineLength(doc, line);
299
- if (len > d.maxLineLength) {
300
- d.maxLineLength = len;
301
- d.maxLine = line;
302
- }
303
- });
304
- }
305
-
306
- // Make sure the gutters options contains the element
307
- // "CodeMirror-linenumbers" when the lineNumbers option is true.
308
- function setGuttersForLineNumbers(options) {
309
- var found = false;
310
- for (var i = 0; i < options.gutters.length; ++i) {
311
- if (options.gutters[i] == "CodeMirror-linenumbers") {
312
- if (options.lineNumbers) found = true;
313
- else options.gutters.splice(i--, 1);
314
- }
315
- }
316
- if (!found && options.lineNumbers)
317
- options.gutters.push("CodeMirror-linenumbers");
318
- }
319
-
320
- // SCROLLBARS
321
-
322
- // Re-synchronize the fake scrollbars with the actual size of the
323
- // content. Optionally force a scrollTop.
324
- function updateScrollbars(cm) {
325
- var d = cm.display, docHeight = cm.doc.height;
326
- var totalHeight = docHeight + paddingVert(d);
327
- d.sizer.style.minHeight = d.heightForcer.style.top = totalHeight + "px";
328
- d.gutters.style.height = Math.max(totalHeight, d.scroller.clientHeight - scrollerCutOff) + "px";
329
- var scrollHeight = Math.max(totalHeight, d.scroller.scrollHeight);
330
- var needsH = d.scroller.scrollWidth > (d.scroller.clientWidth + 1);
331
- var needsV = scrollHeight > (d.scroller.clientHeight + 1);
332
- if (needsV) {
333
- d.scrollbarV.style.display = "block";
334
- d.scrollbarV.style.bottom = needsH ? scrollbarWidth(d.measure) + "px" : "0";
335
- d.scrollbarV.firstChild.style.height =
336
- (scrollHeight - d.scroller.clientHeight + d.scrollbarV.clientHeight) + "px";
337
- } else d.scrollbarV.style.display = "";
338
- if (needsH) {
339
- d.scrollbarH.style.display = "block";
340
- d.scrollbarH.style.right = needsV ? scrollbarWidth(d.measure) + "px" : "0";
341
- d.scrollbarH.firstChild.style.width =
342
- (d.scroller.scrollWidth - d.scroller.clientWidth + d.scrollbarH.clientWidth) + "px";
343
- } else d.scrollbarH.style.display = "";
344
- if (needsH && needsV) {
345
- d.scrollbarFiller.style.display = "block";
346
- d.scrollbarFiller.style.height = d.scrollbarFiller.style.width = scrollbarWidth(d.measure) + "px";
347
- } else d.scrollbarFiller.style.display = "";
348
- if (needsH && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {
349
- d.gutterFiller.style.display = "block";
350
- d.gutterFiller.style.height = scrollbarWidth(d.measure) + "px";
351
- d.gutterFiller.style.width = d.gutters.offsetWidth + "px";
352
- } else d.gutterFiller.style.display = "";
353
-
354
- if (mac_geLion && scrollbarWidth(d.measure) === 0)
355
- d.scrollbarV.style.minWidth = d.scrollbarH.style.minHeight = mac_geMountainLion ? "18px" : "12px";
356
- }
357
-
358
- function visibleLines(display, doc, viewPort) {
359
- var top = display.scroller.scrollTop, height = display.wrapper.clientHeight;
360
- if (typeof viewPort == "number") top = viewPort;
361
- else if (viewPort) {top = viewPort.top; height = viewPort.bottom - viewPort.top;}
362
- top = Math.floor(top - paddingTop(display));
363
- var bottom = Math.ceil(top + height);
364
- return {from: lineAtHeight(doc, top), to: lineAtHeight(doc, bottom)};
365
- }
366
-
367
- // LINE NUMBERS
368
-
369
- function alignHorizontally(cm) {
370
- var display = cm.display;
371
- if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) return;
372
- var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft;
373
- var gutterW = display.gutters.offsetWidth, l = comp + "px";
374
- for (var n = display.lineDiv.firstChild; n; n = n.nextSibling) if (n.alignable) {
375
- for (var i = 0, a = n.alignable; i < a.length; ++i) a[i].style.left = l;
376
- }
377
- if (cm.options.fixedGutter)
378
- display.gutters.style.left = (comp + gutterW) + "px";
379
- }
380
-
381
- function maybeUpdateLineNumberWidth(cm) {
382
- if (!cm.options.lineNumbers) return false;
383
- var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display;
384
- if (last.length != display.lineNumChars) {
385
- var test = display.measure.appendChild(elt("div", [elt("div", last)],
386
- "CodeMirror-linenumber CodeMirror-gutter-elt"));
387
- var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW;
388
- display.lineGutter.style.width = "";
389
- display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding);
390
- display.lineNumWidth = display.lineNumInnerWidth + padding;
391
- display.lineNumChars = display.lineNumInnerWidth ? last.length : -1;
392
- display.lineGutter.style.width = display.lineNumWidth + "px";
393
- return true;
394
- }
395
- return false;
396
- }
397
-
398
- function lineNumberFor(options, i) {
399
- return String(options.lineNumberFormatter(i + options.firstLineNumber));
400
- }
401
- function compensateForHScroll(display) {
402
- return getRect(display.scroller).left - getRect(display.sizer).left;
403
- }
404
-
405
- // DISPLAY DRAWING
406
-
407
- function updateDisplay(cm, changes, viewPort, forced) {
408
- var oldFrom = cm.display.showingFrom, oldTo = cm.display.showingTo, updated;
409
- var visible = visibleLines(cm.display, cm.doc, viewPort);
410
- for (;;) {
411
- if (!updateDisplayInner(cm, changes, visible, forced)) break;
412
- forced = false;
413
- updated = true;
414
- updateSelection(cm);
415
- updateScrollbars(cm);
416
-
417
- // Clip forced viewport to actual scrollable area
418
- if (viewPort)
419
- viewPort = Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight,
420
- typeof viewPort == "number" ? viewPort : viewPort.top);
421
- visible = visibleLines(cm.display, cm.doc, viewPort);
422
- if (visible.from >= cm.display.showingFrom && visible.to <= cm.display.showingTo)
423
- break;
424
- changes = [];
425
- }
426
-
427
- if (updated) {
428
- signalLater(cm, "update", cm);
429
- if (cm.display.showingFrom != oldFrom || cm.display.showingTo != oldTo)
430
- signalLater(cm, "viewportChange", cm, cm.display.showingFrom, cm.display.showingTo);
431
- }
432
- return updated;
433
- }
434
-
435
- // Uses a set of changes plus the current scroll position to
436
- // determine which DOM updates have to be made, and makes the
437
- // updates.
438
- function updateDisplayInner(cm, changes, visible, forced) {
439
- var display = cm.display, doc = cm.doc;
440
- if (!display.wrapper.clientWidth) {
441
- display.showingFrom = display.showingTo = doc.first;
442
- display.viewOffset = 0;
443
- return;
444
- }
445
-
446
- // Bail out if the visible area is already rendered and nothing changed.
447
- if (!forced && changes.length == 0 &&
448
- visible.from > display.showingFrom && visible.to < display.showingTo)
449
- return;
450
-
451
- if (maybeUpdateLineNumberWidth(cm))
452
- changes = [{from: doc.first, to: doc.first + doc.size}];
453
- var gutterW = display.sizer.style.marginLeft = display.gutters.offsetWidth + "px";
454
- display.scrollbarH.style.left = cm.options.fixedGutter ? gutterW : "0";
455
-
456
- // Used to determine which lines need their line numbers updated
457
- var positionsChangedFrom = Infinity;
458
- if (cm.options.lineNumbers)
459
- for (var i = 0; i < changes.length; ++i)
460
- if (changes[i].diff) { positionsChangedFrom = changes[i].from; break; }
461
-
462
- var end = doc.first + doc.size;
463
- var from = Math.max(visible.from - cm.options.viewportMargin, doc.first);
464
- var to = Math.min(end, visible.to + cm.options.viewportMargin);
465
- if (display.showingFrom < from && from - display.showingFrom < 20) from = Math.max(doc.first, display.showingFrom);
466
- if (display.showingTo > to && display.showingTo - to < 20) to = Math.min(end, display.showingTo);
467
- if (sawCollapsedSpans) {
468
- from = lineNo(visualLine(doc, getLine(doc, from)));
469
- while (to < end && lineIsHidden(doc, getLine(doc, to))) ++to;
470
- }
471
-
472
- // Create a range of theoretically intact lines, and punch holes
473
- // in that using the change info.
474
- var intact = [{from: Math.max(display.showingFrom, doc.first),
475
- to: Math.min(display.showingTo, end)}];
476
- if (intact[0].from >= intact[0].to) intact = [];
477
- else intact = computeIntact(intact, changes);
478
- // When merged lines are present, we might have to reduce the
479
- // intact ranges because changes in continued fragments of the
480
- // intact lines do require the lines to be redrawn.
481
- if (sawCollapsedSpans)
482
- for (var i = 0; i < intact.length; ++i) {
483
- var range = intact[i], merged;
484
- while (merged = collapsedSpanAtEnd(getLine(doc, range.to - 1))) {
485
- var newTo = merged.find().from.line;
486
- if (newTo > range.from) range.to = newTo;
487
- else { intact.splice(i--, 1); break; }
488
- }
489
- }
490
-
491
- // Clip off the parts that won't be visible
492
- var intactLines = 0;
493
- for (var i = 0; i < intact.length; ++i) {
494
- var range = intact[i];
495
- if (range.from < from) range.from = from;
496
- if (range.to > to) range.to = to;
497
- if (range.from >= range.to) intact.splice(i--, 1);
498
- else intactLines += range.to - range.from;
499
- }
500
- if (!forced && intactLines == to - from && from == display.showingFrom && to == display.showingTo) {
501
- updateViewOffset(cm);
502
- return;
503
- }
504
- intact.sort(function(a, b) {return a.from - b.from;});
505
-
506
- // Avoid crashing on IE's "unspecified error" when in iframes
507
- try {
508
- var focused = document.activeElement;
509
- } catch(e) {}
510
- if (intactLines < (to - from) * .7) display.lineDiv.style.display = "none";
511
- patchDisplay(cm, from, to, intact, positionsChangedFrom);
512
- display.lineDiv.style.display = "";
513
- if (focused && document.activeElement != focused && focused.offsetHeight) focused.focus();
514
-
515
- var different = from != display.showingFrom || to != display.showingTo ||
516
- display.lastSizeC != display.wrapper.clientHeight;
517
- // This is just a bogus formula that detects when the editor is
518
- // resized or the font size changes.
519
- if (different) {
520
- display.lastSizeC = display.wrapper.clientHeight;
521
- startWorker(cm, 400);
522
- }
523
- display.showingFrom = from; display.showingTo = to;
524
-
525
- updateHeightsInViewport(cm);
526
- updateViewOffset(cm);
527
-
528
- return true;
529
- }
530
-
531
- function updateHeightsInViewport(cm) {
532
- var display = cm.display;
533
- var prevBottom = display.lineDiv.offsetTop;
534
- for (var node = display.lineDiv.firstChild, height; node; node = node.nextSibling) if (node.lineObj) {
535
- if (ie_lt8) {
536
- var bot = node.offsetTop + node.offsetHeight;
537
- height = bot - prevBottom;
538
- prevBottom = bot;
539
- } else {
540
- var box = getRect(node);
541
- height = box.bottom - box.top;
542
- }
543
- var diff = node.lineObj.height - height;
544
- if (height < 2) height = textHeight(display);
545
- if (diff > .001 || diff < -.001) {
546
- updateLineHeight(node.lineObj, height);
547
- var widgets = node.lineObj.widgets;
548
- if (widgets) for (var i = 0; i < widgets.length; ++i)
549
- widgets[i].height = widgets[i].node.offsetHeight;
550
- }
551
- }
552
- }
553
-
554
- function updateViewOffset(cm) {
555
- var off = cm.display.viewOffset = heightAtLine(cm, getLine(cm.doc, cm.display.showingFrom));
556
- // Position the mover div to align with the current virtual scroll position
557
- cm.display.mover.style.top = off + "px";
558
- }
559
-
560
- function computeIntact(intact, changes) {
561
- for (var i = 0, l = changes.length || 0; i < l; ++i) {
562
- var change = changes[i], intact2 = [], diff = change.diff || 0;
563
- for (var j = 0, l2 = intact.length; j < l2; ++j) {
564
- var range = intact[j];
565
- if (change.to <= range.from && change.diff) {
566
- intact2.push({from: range.from + diff, to: range.to + diff});
567
- } else if (change.to <= range.from || change.from >= range.to) {
568
- intact2.push(range);
569
- } else {
570
- if (change.from > range.from)
571
- intact2.push({from: range.from, to: change.from});
572
- if (change.to < range.to)
573
- intact2.push({from: change.to + diff, to: range.to + diff});
574
- }
575
- }
576
- intact = intact2;
577
- }
578
- return intact;
579
- }
580
-
581
- function getDimensions(cm) {
582
- var d = cm.display, left = {}, width = {};
583
- for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {
584
- left[cm.options.gutters[i]] = n.offsetLeft;
585
- width[cm.options.gutters[i]] = n.offsetWidth;
586
- }
587
- return {fixedPos: compensateForHScroll(d),
588
- gutterTotalWidth: d.gutters.offsetWidth,
589
- gutterLeft: left,
590
- gutterWidth: width,
591
- wrapperWidth: d.wrapper.clientWidth};
592
- }
593
-
594
- function patchDisplay(cm, from, to, intact, updateNumbersFrom) {
595
- var dims = getDimensions(cm);
596
- var display = cm.display, lineNumbers = cm.options.lineNumbers;
597
- if (!intact.length && (!webkit || !cm.display.currentWheelTarget))
598
- removeChildren(display.lineDiv);
599
- var container = display.lineDiv, cur = container.firstChild;
600
-
601
- function rm(node) {
602
- var next = node.nextSibling;
603
- if (webkit && mac && cm.display.currentWheelTarget == node) {
604
- node.style.display = "none";
605
- node.lineObj = null;
606
- } else {
607
- node.parentNode.removeChild(node);
608
- }
609
- return next;
610
- }
611
-
612
- var nextIntact = intact.shift(), lineN = from;
613
- cm.doc.iter(from, to, function(line) {
614
- if (nextIntact && nextIntact.to == lineN) nextIntact = intact.shift();
615
- if (lineIsHidden(cm.doc, line)) {
616
- if (line.height != 0) updateLineHeight(line, 0);
617
- if (line.widgets && cur.previousSibling) for (var i = 0; i < line.widgets.length; ++i) {
618
- var w = line.widgets[i];
619
- if (w.showIfHidden) {
620
- var prev = cur.previousSibling;
621
- if (/pre/i.test(prev.nodeName)) {
622
- var wrap = elt("div", null, null, "position: relative");
623
- prev.parentNode.replaceChild(wrap, prev);
624
- wrap.appendChild(prev);
625
- prev = wrap;
626
- }
627
- var wnode = prev.appendChild(elt("div", [w.node], "CodeMirror-linewidget"));
628
- if (!w.handleMouseEvents) wnode.ignoreEvents = true;
629
- positionLineWidget(w, wnode, prev, dims);
630
- }
631
- }
632
- } else if (nextIntact && nextIntact.from <= lineN && nextIntact.to > lineN) {
633
- // This line is intact. Skip to the actual node. Update its
634
- // line number if needed.
635
- while (cur.lineObj != line) cur = rm(cur);
636
- if (lineNumbers && updateNumbersFrom <= lineN && cur.lineNumber)
637
- setTextContent(cur.lineNumber, lineNumberFor(cm.options, lineN));
638
- cur = cur.nextSibling;
639
- } else {
640
- // For lines with widgets, make an attempt to find and reuse
641
- // the existing element, so that widgets aren't needlessly
642
- // removed and re-inserted into the dom
643
- if (line.widgets) for (var j = 0, search = cur, reuse; search && j < 20; ++j, search = search.nextSibling)
644
- if (search.lineObj == line && /div/i.test(search.nodeName)) { reuse = search; break; }
645
- // This line needs to be generated.
646
- var lineNode = buildLineElement(cm, line, lineN, dims, reuse);
647
- if (lineNode != reuse) {
648
- container.insertBefore(lineNode, cur);
649
- } else {
650
- while (cur != reuse) cur = rm(cur);
651
- cur = cur.nextSibling;
652
- }
653
-
654
- lineNode.lineObj = line;
655
- }
656
- ++lineN;
657
- });
658
- while (cur) cur = rm(cur);
659
- }
660
-
661
- function buildLineElement(cm, line, lineNo, dims, reuse) {
662
- var lineElement = lineContent(cm, line);
663
- var markers = line.gutterMarkers, display = cm.display, wrap;
664
-
665
- if (!cm.options.lineNumbers && !markers && !line.bgClass && !line.wrapClass && !line.widgets)
666
- return lineElement;
667
-
668
- // Lines with gutter elements, widgets or a background class need
669
- // to be wrapped again, and have the extra elements added to the
670
- // wrapper div
671
-
672
- if (reuse) {
673
- reuse.alignable = null;
674
- var isOk = true, widgetsSeen = 0, insertBefore = null;
675
- for (var n = reuse.firstChild, next; n; n = next) {
676
- next = n.nextSibling;
677
- if (!/\bCodeMirror-linewidget\b/.test(n.className)) {
678
- reuse.removeChild(n);
679
- } else {
680
- for (var i = 0; i < line.widgets.length; ++i) {
681
- var widget = line.widgets[i];
682
- if (widget.node == n.firstChild) {
683
- if (!widget.above && !insertBefore) insertBefore = n;
684
- positionLineWidget(widget, n, reuse, dims);
685
- ++widgetsSeen;
686
- break;
687
- }
688
- }
689
- if (i == line.widgets.length) { isOk = false; break; }
690
- }
691
- }
692
- reuse.insertBefore(lineElement, insertBefore);
693
- if (isOk && widgetsSeen == line.widgets.length) {
694
- wrap = reuse;
695
- reuse.className = line.wrapClass || "";
696
- }
697
- }
698
- if (!wrap) {
699
- wrap = elt("div", null, line.wrapClass, "position: relative");
700
- wrap.appendChild(lineElement);
701
- }
702
- // Kludge to make sure the styled element lies behind the selection (by z-index)
703
- if (line.bgClass)
704
- wrap.insertBefore(elt("div", null, line.bgClass + " CodeMirror-linebackground"), wrap.firstChild);
705
- if (cm.options.lineNumbers || markers) {
706
- var gutterWrap = wrap.insertBefore(elt("div", null, null, "position: absolute; left: " +
707
- (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px"),
708
- wrap.firstChild);
709
- if (cm.options.fixedGutter) (wrap.alignable || (wrap.alignable = [])).push(gutterWrap);
710
- if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"]))
711
- wrap.lineNumber = gutterWrap.appendChild(
712
- elt("div", lineNumberFor(cm.options, lineNo),
713
- "CodeMirror-linenumber CodeMirror-gutter-elt",
714
- "left: " + dims.gutterLeft["CodeMirror-linenumbers"] + "px; width: "
715
- + display.lineNumInnerWidth + "px"));
716
- if (markers)
717
- for (var k = 0; k < cm.options.gutters.length; ++k) {
718
- var id = cm.options.gutters[k], found = markers.hasOwnProperty(id) && markers[id];
719
- if (found)
720
- gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", "left: " +
721
- dims.gutterLeft[id] + "px; width: " + dims.gutterWidth[id] + "px"));
722
- }
723
- }
724
- if (ie_lt8) wrap.style.zIndex = 2;
725
- if (line.widgets && wrap != reuse) for (var i = 0, ws = line.widgets; i < ws.length; ++i) {
726
- var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget");
727
- if (!widget.handleMouseEvents) node.ignoreEvents = true;
728
- positionLineWidget(widget, node, wrap, dims);
729
- if (widget.above)
730
- wrap.insertBefore(node, cm.options.lineNumbers && line.height != 0 ? gutterWrap : lineElement);
731
- else
732
- wrap.appendChild(node);
733
- signalLater(widget, "redraw");
734
- }
735
- return wrap;
736
- }
737
-
738
- function positionLineWidget(widget, node, wrap, dims) {
739
- if (widget.noHScroll) {
740
- (wrap.alignable || (wrap.alignable = [])).push(node);
741
- var width = dims.wrapperWidth;
742
- node.style.left = dims.fixedPos + "px";
743
- if (!widget.coverGutter) {
744
- width -= dims.gutterTotalWidth;
745
- node.style.paddingLeft = dims.gutterTotalWidth + "px";
746
- }
747
- node.style.width = width + "px";
748
- }
749
- if (widget.coverGutter) {
750
- node.style.zIndex = 5;
751
- node.style.position = "relative";
752
- if (!widget.noHScroll) node.style.marginLeft = -dims.gutterTotalWidth + "px";
753
- }
754
- }
755
-
756
- // SELECTION / CURSOR
757
-
758
- function updateSelection(cm) {
759
- var display = cm.display;
760
- var collapsed = posEq(cm.doc.sel.from, cm.doc.sel.to);
761
- if (collapsed || cm.options.showCursorWhenSelecting)
762
- updateSelectionCursor(cm);
763
- else
764
- display.cursor.style.display = display.otherCursor.style.display = "none";
765
- if (!collapsed)
766
- updateSelectionRange(cm);
767
- else
768
- display.selectionDiv.style.display = "none";
769
-
770
- // Move the hidden textarea near the cursor to prevent scrolling artifacts
771
- if (cm.options.moveInputWithCursor) {
772
- var headPos = cursorCoords(cm, cm.doc.sel.head, "div");
773
- var wrapOff = getRect(display.wrapper), lineOff = getRect(display.lineDiv);
774
- display.inputDiv.style.top = Math.max(0, Math.min(display.wrapper.clientHeight - 10,
775
- headPos.top + lineOff.top - wrapOff.top)) + "px";
776
- display.inputDiv.style.left = Math.max(0, Math.min(display.wrapper.clientWidth - 10,
777
- headPos.left + lineOff.left - wrapOff.left)) + "px";
778
- }
779
- }
780
-
781
- // No selection, plain cursor
782
- function updateSelectionCursor(cm) {
783
- var display = cm.display, pos = cursorCoords(cm, cm.doc.sel.head, "div");
784
- display.cursor.style.left = pos.left + "px";
785
- display.cursor.style.top = pos.top + "px";
786
- display.cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px";
787
- display.cursor.style.display = "";
788
-
789
- if (pos.other) {
790
- display.otherCursor.style.display = "";
791
- display.otherCursor.style.left = pos.other.left + "px";
792
- display.otherCursor.style.top = pos.other.top + "px";
793
- display.otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px";
794
- } else { display.otherCursor.style.display = "none"; }
795
- }
796
-
797
- // Highlight selection
798
- function updateSelectionRange(cm) {
799
- var display = cm.display, doc = cm.doc, sel = cm.doc.sel;
800
- var fragment = document.createDocumentFragment();
801
- var clientWidth = display.lineSpace.offsetWidth, pl = paddingLeft(cm.display);
802
-
803
- function add(left, top, width, bottom) {
804
- if (top < 0) top = 0;
805
- fragment.appendChild(elt("div", null, "CodeMirror-selected", "position: absolute; left: " + left +
806
- "px; top: " + top + "px; width: " + (width == null ? clientWidth - left : width) +
807
- "px; height: " + (bottom - top) + "px"));
808
- }
809
-
810
- function drawForLine(line, fromArg, toArg) {
811
- var lineObj = getLine(doc, line);
812
- var lineLen = lineObj.text.length;
813
- var start, end;
814
- function coords(ch, bias) {
815
- return charCoords(cm, Pos(line, ch), "div", lineObj, bias);
816
- }
817
-
818
- iterateBidiSections(getOrder(lineObj), fromArg || 0, toArg == null ? lineLen : toArg, function(from, to, dir) {
819
- var leftPos = coords(from, "left"), rightPos, left, right;
820
- if (from == to) {
821
- rightPos = leftPos;
822
- left = right = leftPos.left;
823
- } else {
824
- rightPos = coords(to - 1, "right");
825
- if (dir == "rtl") { var tmp = leftPos; leftPos = rightPos; rightPos = tmp; }
826
- left = leftPos.left;
827
- right = rightPos.right;
828
- }
829
- if (fromArg == null && from == 0) left = pl;
830
- if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part
831
- add(left, leftPos.top, null, leftPos.bottom);
832
- left = pl;
833
- if (leftPos.bottom < rightPos.top) add(left, leftPos.bottom, null, rightPos.top);
834
- }
835
- if (toArg == null && to == lineLen) right = clientWidth;
836
- if (!start || leftPos.top < start.top || leftPos.top == start.top && leftPos.left < start.left)
837
- start = leftPos;
838
- if (!end || rightPos.bottom > end.bottom || rightPos.bottom == end.bottom && rightPos.right > end.right)
839
- end = rightPos;
840
- if (left < pl + 1) left = pl;
841
- add(left, rightPos.top, right - left, rightPos.bottom);
842
- });
843
- return {start: start, end: end};
844
- }
845
-
846
- if (sel.from.line == sel.to.line) {
847
- drawForLine(sel.from.line, sel.from.ch, sel.to.ch);
848
- } else {
849
- var fromLine = getLine(doc, sel.from.line), toLine = getLine(doc, sel.to.line);
850
- var singleVLine = visualLine(doc, fromLine) == visualLine(doc, toLine);
851
- var leftEnd = drawForLine(sel.from.line, sel.from.ch, singleVLine ? fromLine.text.length : null).end;
852
- var rightStart = drawForLine(sel.to.line, singleVLine ? 0 : null, sel.to.ch).start;
853
- if (singleVLine) {
854
- if (leftEnd.top < rightStart.top - 2) {
855
- add(leftEnd.right, leftEnd.top, null, leftEnd.bottom);
856
- add(pl, rightStart.top, rightStart.left, rightStart.bottom);
857
- } else {
858
- add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom);
859
- }
860
- }
861
- if (leftEnd.bottom < rightStart.top)
862
- add(pl, leftEnd.bottom, null, rightStart.top);
863
- }
864
-
865
- removeChildrenAndAdd(display.selectionDiv, fragment);
866
- display.selectionDiv.style.display = "";
867
- }
868
-
869
- // Cursor-blinking
870
- function restartBlink(cm) {
871
- if (!cm.state.focused) return;
872
- var display = cm.display;
873
- clearInterval(display.blinker);
874
- var on = true;
875
- display.cursor.style.visibility = display.otherCursor.style.visibility = "";
876
- display.blinker = setInterval(function() {
877
- display.cursor.style.visibility = display.otherCursor.style.visibility = (on = !on) ? "" : "hidden";
878
- }, cm.options.cursorBlinkRate);
879
- }
880
-
881
- // HIGHLIGHT WORKER
882
-
883
- function startWorker(cm, time) {
884
- if (cm.doc.mode.startState && cm.doc.frontier < cm.display.showingTo)
885
- cm.state.highlight.set(time, bind(highlightWorker, cm));
886
- }
887
-
888
- function highlightWorker(cm) {
889
- var doc = cm.doc;
890
- if (doc.frontier < doc.first) doc.frontier = doc.first;
891
- if (doc.frontier >= cm.display.showingTo) return;
892
- var end = +new Date + cm.options.workTime;
893
- var state = copyState(doc.mode, getStateBefore(cm, doc.frontier));
894
- var changed = [], prevChange;
895
- doc.iter(doc.frontier, Math.min(doc.first + doc.size, cm.display.showingTo + 500), function(line) {
896
- if (doc.frontier >= cm.display.showingFrom) { // Visible
897
- var oldStyles = line.styles;
898
- line.styles = highlightLine(cm, line, state);
899
- var ischange = !oldStyles || oldStyles.length != line.styles.length;
900
- for (var i = 0; !ischange && i < oldStyles.length; ++i) ischange = oldStyles[i] != line.styles[i];
901
- if (ischange) {
902
- if (prevChange && prevChange.end == doc.frontier) prevChange.end++;
903
- else changed.push(prevChange = {start: doc.frontier, end: doc.frontier + 1});
904
- }
905
- line.stateAfter = copyState(doc.mode, state);
906
- } else {
907
- processLine(cm, line, state);
908
- line.stateAfter = doc.frontier % 5 == 0 ? copyState(doc.mode, state) : null;
909
- }
910
- ++doc.frontier;
911
- if (+new Date > end) {
912
- startWorker(cm, cm.options.workDelay);
913
- return true;
914
- }
915
- });
916
- if (changed.length)
917
- operation(cm, function() {
918
- for (var i = 0; i < changed.length; ++i)
919
- regChange(this, changed[i].start, changed[i].end);
920
- })();
921
- }
922
-
923
- // Finds the line to start with when starting a parse. Tries to
924
- // find a line with a stateAfter, so that it can start with a
925
- // valid state. If that fails, it returns the line with the
926
- // smallest indentation, which tends to need the least context to
927
- // parse correctly.
928
- function findStartLine(cm, n, precise) {
929
- var minindent, minline, doc = cm.doc;
930
- for (var search = n, lim = n - 100; search > lim; --search) {
931
- if (search <= doc.first) return doc.first;
932
- var line = getLine(doc, search - 1);
933
- if (line.stateAfter && (!precise || search <= doc.frontier)) return search;
934
- var indented = countColumn(line.text, null, cm.options.tabSize);
935
- if (minline == null || minindent > indented) {
936
- minline = search - 1;
937
- minindent = indented;
938
- }
939
- }
940
- return minline;
941
- }
942
-
943
- function getStateBefore(cm, n, precise) {
944
- var doc = cm.doc, display = cm.display;
945
- if (!doc.mode.startState) return true;
946
- var pos = findStartLine(cm, n, precise), state = pos > doc.first && getLine(doc, pos-1).stateAfter;
947
- if (!state) state = startState(doc.mode);
948
- else state = copyState(doc.mode, state);
949
- doc.iter(pos, n, function(line) {
950
- processLine(cm, line, state);
951
- var save = pos == n - 1 || pos % 5 == 0 || pos >= display.showingFrom && pos < display.showingTo;
952
- line.stateAfter = save ? copyState(doc.mode, state) : null;
953
- ++pos;
954
- });
955
- return state;
956
- }
957
-
958
- // POSITION MEASUREMENT
959
-
960
- function paddingTop(display) {return display.lineSpace.offsetTop;}
961
- function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight;}
962
- function paddingLeft(display) {
963
- var e = removeChildrenAndAdd(display.measure, elt("pre", null, null, "text-align: left")).appendChild(elt("span", "x"));
964
- return e.offsetLeft;
965
- }
966
-
967
- function measureChar(cm, line, ch, data, bias) {
968
- var dir = -1;
969
- data = data || measureLine(cm, line);
970
-
971
- for (var pos = ch;; pos += dir) {
972
- var r = data[pos];
973
- if (r) break;
974
- if (dir < 0 && pos == 0) dir = 1;
975
- }
976
- bias = pos > ch ? "left" : pos < ch ? "right" : bias;
977
- if (bias == "left" && r.leftSide) r = r.leftSide;
978
- else if (bias == "right" && r.rightSide) r = r.rightSide;
979
- return {left: pos < ch ? r.right : r.left,
980
- right: pos > ch ? r.left : r.right,
981
- top: r.top,
982
- bottom: r.bottom};
983
- }
984
-
985
- function findCachedMeasurement(cm, line) {
986
- var cache = cm.display.measureLineCache;
987
- for (var i = 0; i < cache.length; ++i) {
988
- var memo = cache[i];
989
- if (memo.text == line.text && memo.markedSpans == line.markedSpans &&
990
- cm.display.scroller.clientWidth == memo.width &&
991
- memo.classes == line.textClass + "|" + line.bgClass + "|" + line.wrapClass)
992
- return memo;
993
- }
994
- }
995
-
996
- function clearCachedMeasurement(cm, line) {
997
- var exists = findCachedMeasurement(cm, line);
998
- if (exists) exists.text = exists.measure = exists.markedSpans = null;
999
- }
1000
-
1001
- function measureLine(cm, line) {
1002
- // First look in the cache
1003
- var cached = findCachedMeasurement(cm, line);
1004
- if (cached) return cached.measure;
1005
-
1006
- // Failing that, recompute and store result in cache
1007
- var measure = measureLineInner(cm, line);
1008
- var cache = cm.display.measureLineCache;
1009
- var memo = {text: line.text, width: cm.display.scroller.clientWidth,
1010
- markedSpans: line.markedSpans, measure: measure,
1011
- classes: line.textClass + "|" + line.bgClass + "|" + line.wrapClass};
1012
- if (cache.length == 16) cache[++cm.display.measureLineCachePos % 16] = memo;
1013
- else cache.push(memo);
1014
- return measure;
1015
- }
1016
-
1017
- function measureLineInner(cm, line) {
1018
- var display = cm.display, measure = emptyArray(line.text.length);
1019
- var pre = lineContent(cm, line, measure, true);
1020
-
1021
- // IE does not cache element positions of inline elements between
1022
- // calls to getBoundingClientRect. This makes the loop below,
1023
- // which gathers the positions of all the characters on the line,
1024
- // do an amount of layout work quadratic to the number of
1025
- // characters. When line wrapping is off, we try to improve things
1026
- // by first subdividing the line into a bunch of inline blocks, so
1027
- // that IE can reuse most of the layout information from caches
1028
- // for those blocks. This does interfere with line wrapping, so it
1029
- // doesn't work when wrapping is on, but in that case the
1030
- // situation is slightly better, since IE does cache line-wrapping
1031
- // information and only recomputes per-line.
1032
- if (ie && !ie_lt8 && !cm.options.lineWrapping && pre.childNodes.length > 100) {
1033
- var fragment = document.createDocumentFragment();
1034
- var chunk = 10, n = pre.childNodes.length;
1035
- for (var i = 0, chunks = Math.ceil(n / chunk); i < chunks; ++i) {
1036
- var wrap = elt("div", null, null, "display: inline-block");
1037
- for (var j = 0; j < chunk && n; ++j) {
1038
- wrap.appendChild(pre.firstChild);
1039
- --n;
1040
- }
1041
- fragment.appendChild(wrap);
1042
- }
1043
- pre.appendChild(fragment);
1044
- }
1045
-
1046
- removeChildrenAndAdd(display.measure, pre);
1047
-
1048
- var outer = getRect(display.lineDiv);
1049
- var vranges = [], data = emptyArray(line.text.length), maxBot = pre.offsetHeight;
1050
- // Work around an IE7/8 bug where it will sometimes have randomly
1051
- // replaced our pre with a clone at this point.
1052
- if (ie_lt9 && display.measure.first != pre)
1053
- removeChildrenAndAdd(display.measure, pre);
1054
-
1055
- function measureRect(rect) {
1056
- var top = rect.top - outer.top, bot = rect.bottom - outer.top;
1057
- if (bot > maxBot) bot = maxBot;
1058
- if (top < 0) top = 0;
1059
- for (var i = vranges.length - 2; i >= 0; i -= 2) {
1060
- var rtop = vranges[i], rbot = vranges[i+1];
1061
- if (rtop > bot || rbot < top) continue;
1062
- if (rtop <= top && rbot >= bot ||
1063
- top <= rtop && bot >= rbot ||
1064
- Math.min(bot, rbot) - Math.max(top, rtop) >= (bot - top) >> 1) {
1065
- vranges[i] = Math.min(top, rtop);
1066
- vranges[i+1] = Math.max(bot, rbot);
1067
- break;
1068
- }
1069
- }
1070
- if (i < 0) { i = vranges.length; vranges.push(top, bot); }
1071
- return {left: rect.left - outer.left,
1072
- right: rect.right - outer.left,
1073
- top: i, bottom: null};
1074
- }
1075
- function finishRect(rect) {
1076
- rect.bottom = vranges[rect.top+1];
1077
- rect.top = vranges[rect.top];
1078
- }
1079
-
1080
- for (var i = 0, cur; i < measure.length; ++i) if (cur = measure[i]) {
1081
- var node = cur, rect = null;
1082
- // A widget might wrap, needs special care
1083
- if (/\bCodeMirror-widget\b/.test(cur.className) && cur.getClientRects) {
1084
- if (cur.firstChild.nodeType == 1) node = cur.firstChild;
1085
- var rects = node.getClientRects();
1086
- if (rects.length > 1) {
1087
- rect = data[i] = measureRect(rects[0]);
1088
- rect.rightSide = measureRect(rects[rects.length - 1]);
1089
- }
1090
- }
1091
- if (!rect) rect = data[i] = measureRect(getRect(node));
1092
- if (cur.measureRight) rect.right = getRect(cur.measureRight).left;
1093
- if (cur.leftSide) rect.leftSide = measureRect(getRect(cur.leftSide));
1094
- }
1095
- for (var i = 0, cur; i < data.length; ++i) if (cur = data[i]) {
1096
- finishRect(cur);
1097
- if (cur.leftSide) finishRect(cur.leftSide);
1098
- if (cur.rightSide) finishRect(cur.rightSide);
1099
- }
1100
- return data;
1101
- }
1102
-
1103
- function measureLineWidth(cm, line) {
1104
- var hasBadSpan = false;
1105
- if (line.markedSpans) for (var i = 0; i < line.markedSpans; ++i) {
1106
- var sp = line.markedSpans[i];
1107
- if (sp.collapsed && (sp.to == null || sp.to == line.text.length)) hasBadSpan = true;
1108
- }
1109
- var cached = !hasBadSpan && findCachedMeasurement(cm, line);
1110
- if (cached) return measureChar(cm, line, line.text.length, cached.measure, "right").right;
1111
-
1112
- var pre = lineContent(cm, line, null, true);
1113
- var end = pre.appendChild(zeroWidthElement(cm.display.measure));
1114
- removeChildrenAndAdd(cm.display.measure, pre);
1115
- return getRect(end).right - getRect(cm.display.lineDiv).left;
1116
- }
1117
-
1118
- function clearCaches(cm) {
1119
- cm.display.measureLineCache.length = cm.display.measureLineCachePos = 0;
1120
- cm.display.cachedCharWidth = cm.display.cachedTextHeight = null;
1121
- if (!cm.options.lineWrapping) cm.display.maxLineChanged = true;
1122
- cm.display.lineNumChars = null;
1123
- }
1124
-
1125
- function pageScrollX() { return window.pageXOffset || (document.documentElement || document.body).scrollLeft; }
1126
- function pageScrollY() { return window.pageYOffset || (document.documentElement || document.body).scrollTop; }
1127
-
1128
- // Context is one of "line", "div" (display.lineDiv), "local"/null (editor), or "page"
1129
- function intoCoordSystem(cm, lineObj, rect, context) {
1130
- if (lineObj.widgets) for (var i = 0; i < lineObj.widgets.length; ++i) if (lineObj.widgets[i].above) {
1131
- var size = widgetHeight(lineObj.widgets[i]);
1132
- rect.top += size; rect.bottom += size;
1133
- }
1134
- if (context == "line") return rect;
1135
- if (!context) context = "local";
1136
- var yOff = heightAtLine(cm, lineObj);
1137
- if (context == "local") yOff += paddingTop(cm.display);
1138
- else yOff -= cm.display.viewOffset;
1139
- if (context == "page" || context == "window") {
1140
- var lOff = getRect(cm.display.lineSpace);
1141
- yOff += lOff.top + (context == "window" ? 0 : pageScrollY());
1142
- var xOff = lOff.left + (context == "window" ? 0 : pageScrollX());
1143
- rect.left += xOff; rect.right += xOff;
1144
- }
1145
- rect.top += yOff; rect.bottom += yOff;
1146
- return rect;
1147
- }
1148
-
1149
- // Context may be "window", "page", "div", or "local"/null
1150
- // Result is in "div" coords
1151
- function fromCoordSystem(cm, coords, context) {
1152
- if (context == "div") return coords;
1153
- var left = coords.left, top = coords.top;
1154
- // First move into "page" coordinate system
1155
- if (context == "page") {
1156
- left -= pageScrollX();
1157
- top -= pageScrollY();
1158
- } else if (context == "local" || !context) {
1159
- var localBox = getRect(cm.display.sizer);
1160
- left += localBox.left;
1161
- top += localBox.top;
1162
- }
1163
-
1164
- var lineSpaceBox = getRect(cm.display.lineSpace);
1165
- return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top};
1166
- }
1167
-
1168
- function charCoords(cm, pos, context, lineObj, bias) {
1169
- if (!lineObj) lineObj = getLine(cm.doc, pos.line);
1170
- return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, null, bias), context);
1171
- }
1172
-
1173
- function cursorCoords(cm, pos, context, lineObj, measurement) {
1174
- lineObj = lineObj || getLine(cm.doc, pos.line);
1175
- if (!measurement) measurement = measureLine(cm, lineObj);
1176
- function get(ch, right) {
1177
- var m = measureChar(cm, lineObj, ch, measurement, right ? "right" : "left");
1178
- if (right) m.left = m.right; else m.right = m.left;
1179
- return intoCoordSystem(cm, lineObj, m, context);
1180
- }
1181
- function getBidi(ch, partPos) {
1182
- var part = order[partPos], right = part.level % 2;
1183
- if (ch == bidiLeft(part) && partPos && part.level < order[partPos - 1].level) {
1184
- part = order[--partPos];
1185
- ch = bidiRight(part) - (part.level % 2 ? 0 : 1);
1186
- right = true;
1187
- } else if (ch == bidiRight(part) && partPos < order.length - 1 && part.level < order[partPos + 1].level) {
1188
- part = order[++partPos];
1189
- ch = bidiLeft(part) - part.level % 2;
1190
- right = false;
1191
- }
1192
- if (right && ch == part.to && ch > part.from) return get(ch - 1);
1193
- return get(ch, right);
1194
- }
1195
- var order = getOrder(lineObj), ch = pos.ch;
1196
- if (!order) return get(ch);
1197
- var partPos = getBidiPartAt(order, ch);
1198
- var val = getBidi(ch, partPos);
1199
- if (bidiOther != null) val.other = getBidi(ch, bidiOther);
1200
- return val;
1201
- }
1202
-
1203
- function PosWithInfo(line, ch, outside, xRel) {
1204
- var pos = new Pos(line, ch);
1205
- pos.xRel = xRel;
1206
- if (outside) pos.outside = true;
1207
- return pos;
1208
- }
1209
-
1210
- // Coords must be lineSpace-local
1211
- function coordsChar(cm, x, y) {
1212
- var doc = cm.doc;
1213
- y += cm.display.viewOffset;
1214
- if (y < 0) return PosWithInfo(doc.first, 0, true, -1);
1215
- var lineNo = lineAtHeight(doc, y), last = doc.first + doc.size - 1;
1216
- if (lineNo > last)
1217
- return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, true, 1);
1218
- if (x < 0) x = 0;
1219
-
1220
- for (;;) {
1221
- var lineObj = getLine(doc, lineNo);
1222
- var found = coordsCharInner(cm, lineObj, lineNo, x, y);
1223
- var merged = collapsedSpanAtEnd(lineObj);
1224
- var mergedPos = merged && merged.find();
1225
- if (merged && (found.ch > mergedPos.from.ch || found.ch == mergedPos.from.ch && found.xRel > 0))
1226
- lineNo = mergedPos.to.line;
1227
- else
1228
- return found;
1229
- }
1230
- }
1231
-
1232
- function coordsCharInner(cm, lineObj, lineNo, x, y) {
1233
- var innerOff = y - heightAtLine(cm, lineObj);
1234
- var wrongLine = false, adjust = 2 * cm.display.wrapper.clientWidth;
1235
- var measurement = measureLine(cm, lineObj);
1236
-
1237
- function getX(ch) {
1238
- var sp = cursorCoords(cm, Pos(lineNo, ch), "line",
1239
- lineObj, measurement);
1240
- wrongLine = true;
1241
- if (innerOff > sp.bottom) return sp.left - adjust;
1242
- else if (innerOff < sp.top) return sp.left + adjust;
1243
- else wrongLine = false;
1244
- return sp.left;
1245
- }
1246
-
1247
- var bidi = getOrder(lineObj), dist = lineObj.text.length;
1248
- var from = lineLeft(lineObj), to = lineRight(lineObj);
1249
- var fromX = getX(from), fromOutside = wrongLine, toX = getX(to), toOutside = wrongLine;
1250
-
1251
- if (x > toX) return PosWithInfo(lineNo, to, toOutside, 1);
1252
- // Do a binary search between these bounds.
1253
- for (;;) {
1254
- if (bidi ? to == from || to == moveVisually(lineObj, from, 1) : to - from <= 1) {
1255
- var ch = x < fromX || x - fromX <= toX - x ? from : to;
1256
- var xDiff = x - (ch == from ? fromX : toX);
1257
- while (isExtendingChar.test(lineObj.text.charAt(ch))) ++ch;
1258
- var pos = PosWithInfo(lineNo, ch, ch == from ? fromOutside : toOutside,
1259
- xDiff < 0 ? -1 : xDiff ? 1 : 0);
1260
- return pos;
1261
- }
1262
- var step = Math.ceil(dist / 2), middle = from + step;
1263
- if (bidi) {
1264
- middle = from;
1265
- for (var i = 0; i < step; ++i) middle = moveVisually(lineObj, middle, 1);
1266
- }
1267
- var middleX = getX(middle);
1268
- if (middleX > x) {to = middle; toX = middleX; if (toOutside = wrongLine) toX += 1000; dist = step;}
1269
- else {from = middle; fromX = middleX; fromOutside = wrongLine; dist -= step;}
1270
- }
1271
- }
1272
-
1273
- var measureText;
1274
- function textHeight(display) {
1275
- if (display.cachedTextHeight != null) return display.cachedTextHeight;
1276
- if (measureText == null) {
1277
- measureText = elt("pre");
1278
- // Measure a bunch of lines, for browsers that compute
1279
- // fractional heights.
1280
- for (var i = 0; i < 49; ++i) {
1281
- measureText.appendChild(document.createTextNode("x"));
1282
- measureText.appendChild(elt("br"));
1283
- }
1284
- measureText.appendChild(document.createTextNode("x"));
1285
- }
1286
- removeChildrenAndAdd(display.measure, measureText);
1287
- var height = measureText.offsetHeight / 50;
1288
- if (height > 3) display.cachedTextHeight = height;
1289
- removeChildren(display.measure);
1290
- return height || 1;
1291
- }
1292
-
1293
- function charWidth(display) {
1294
- if (display.cachedCharWidth != null) return display.cachedCharWidth;
1295
- var anchor = elt("span", "x");
1296
- var pre = elt("pre", [anchor]);
1297
- removeChildrenAndAdd(display.measure, pre);
1298
- var width = anchor.offsetWidth;
1299
- if (width > 2) display.cachedCharWidth = width;
1300
- return width || 10;
1301
- }
1302
-
1303
- // OPERATIONS
1304
-
1305
- // Operations are used to wrap changes in such a way that each
1306
- // change won't have to update the cursor and display (which would
1307
- // be awkward, slow, and error-prone), but instead updates are
1308
- // batched and then all combined and executed at once.
1309
-
1310
- var nextOpId = 0;
1311
- function startOperation(cm) {
1312
- cm.curOp = {
1313
- // An array of ranges of lines that have to be updated. See
1314
- // updateDisplay.
1315
- changes: [],
1316
- forceUpdate: false,
1317
- updateInput: null,
1318
- userSelChange: null,
1319
- textChanged: null,
1320
- selectionChanged: false,
1321
- cursorActivity: false,
1322
- updateMaxLine: false,
1323
- updateScrollPos: false,
1324
- id: ++nextOpId
1325
- };
1326
- if (!delayedCallbackDepth++) delayedCallbacks = [];
1327
- }
1328
-
1329
- function endOperation(cm) {
1330
- var op = cm.curOp, doc = cm.doc, display = cm.display;
1331
- cm.curOp = null;
1332
-
1333
- if (op.updateMaxLine) computeMaxLength(cm);
1334
- if (display.maxLineChanged && !cm.options.lineWrapping && display.maxLine) {
1335
- var width = measureLineWidth(cm, display.maxLine);
1336
- display.sizer.style.minWidth = Math.max(0, width + 3 + scrollerCutOff) + "px";
1337
- display.maxLineChanged = false;
1338
- var maxScrollLeft = Math.max(0, display.sizer.offsetLeft + display.sizer.offsetWidth - display.scroller.clientWidth);
1339
- if (maxScrollLeft < doc.scrollLeft && !op.updateScrollPos)
1340
- setScrollLeft(cm, Math.min(display.scroller.scrollLeft, maxScrollLeft), true);
1341
- }
1342
- var newScrollPos, updated;
1343
- if (op.updateScrollPos) {
1344
- newScrollPos = op.updateScrollPos;
1345
- } else if (op.selectionChanged && display.scroller.clientHeight) { // don't rescroll if not visible
1346
- var coords = cursorCoords(cm, doc.sel.head);
1347
- newScrollPos = calculateScrollPos(cm, coords.left, coords.top, coords.left, coords.bottom);
1348
- }
1349
- if (op.changes.length || op.forceUpdate || newScrollPos && newScrollPos.scrollTop != null) {
1350
- updated = updateDisplay(cm, op.changes, newScrollPos && newScrollPos.scrollTop, op.forceUpdate);
1351
- if (cm.display.scroller.offsetHeight) cm.doc.scrollTop = cm.display.scroller.scrollTop;
1352
- }
1353
- if (!updated && op.selectionChanged) updateSelection(cm);
1354
- if (op.updateScrollPos) {
1355
- display.scroller.scrollTop = display.scrollbarV.scrollTop = doc.scrollTop = newScrollPos.scrollTop;
1356
- display.scroller.scrollLeft = display.scrollbarH.scrollLeft = doc.scrollLeft = newScrollPos.scrollLeft;
1357
- alignHorizontally(cm);
1358
- if (op.scrollToPos)
1359
- scrollPosIntoView(cm, clipPos(cm.doc, op.scrollToPos), op.scrollToPosMargin);
1360
- } else if (newScrollPos) {
1361
- scrollCursorIntoView(cm);
1362
- }
1363
- if (op.selectionChanged) restartBlink(cm);
1364
-
1365
- if (cm.state.focused && op.updateInput)
1366
- resetInput(cm, op.userSelChange);
1367
-
1368
- var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers;
1369
- if (hidden) for (var i = 0; i < hidden.length; ++i)
1370
- if (!hidden[i].lines.length) signal(hidden[i], "hide");
1371
- if (unhidden) for (var i = 0; i < unhidden.length; ++i)
1372
- if (unhidden[i].lines.length) signal(unhidden[i], "unhide");
1373
-
1374
- var delayed;
1375
- if (!--delayedCallbackDepth) {
1376
- delayed = delayedCallbacks;
1377
- delayedCallbacks = null;
1378
- }
1379
- if (op.textChanged)
1380
- signal(cm, "change", cm, op.textChanged);
1381
- if (op.cursorActivity) signal(cm, "cursorActivity", cm);
1382
- if (delayed) for (var i = 0; i < delayed.length; ++i) delayed[i]();
1383
- }
1384
-
1385
- // Wraps a function in an operation. Returns the wrapped function.
1386
- function operation(cm1, f) {
1387
- return function() {
1388
- var cm = cm1 || this, withOp = !cm.curOp;
1389
- if (withOp) startOperation(cm);
1390
- try { var result = f.apply(cm, arguments); }
1391
- finally { if (withOp) endOperation(cm); }
1392
- return result;
1393
- };
1394
- }
1395
- function docOperation(f) {
1396
- return function() {
1397
- var withOp = this.cm && !this.cm.curOp, result;
1398
- if (withOp) startOperation(this.cm);
1399
- try { result = f.apply(this, arguments); }
1400
- finally { if (withOp) endOperation(this.cm); }
1401
- return result;
1402
- };
1403
- }
1404
- function runInOp(cm, f) {
1405
- var withOp = !cm.curOp, result;
1406
- if (withOp) startOperation(cm);
1407
- try { result = f(); }
1408
- finally { if (withOp) endOperation(cm); }
1409
- return result;
1410
- }
1411
-
1412
- function regChange(cm, from, to, lendiff) {
1413
- if (from == null) from = cm.doc.first;
1414
- if (to == null) to = cm.doc.first + cm.doc.size;
1415
- cm.curOp.changes.push({from: from, to: to, diff: lendiff});
1416
- }
1417
-
1418
- // INPUT HANDLING
1419
-
1420
- function slowPoll(cm) {
1421
- if (cm.display.pollingFast) return;
1422
- cm.display.poll.set(cm.options.pollInterval, function() {
1423
- readInput(cm);
1424
- if (cm.state.focused) slowPoll(cm);
1425
- });
1426
- }
1427
-
1428
- function fastPoll(cm) {
1429
- var missed = false;
1430
- cm.display.pollingFast = true;
1431
- function p() {
1432
- var changed = readInput(cm);
1433
- if (!changed && !missed) {missed = true; cm.display.poll.set(60, p);}
1434
- else {cm.display.pollingFast = false; slowPoll(cm);}
1435
- }
1436
- cm.display.poll.set(20, p);
1437
- }
1438
-
1439
- // prevInput is a hack to work with IME. If we reset the textarea
1440
- // on every change, that breaks IME. So we look for changes
1441
- // compared to the previous content instead. (Modern browsers have
1442
- // events that indicate IME taking place, but these are not widely
1443
- // supported or compatible enough yet to rely on.)
1444
- function readInput(cm) {
1445
- var input = cm.display.input, prevInput = cm.display.prevInput, doc = cm.doc, sel = doc.sel;
1446
- if (!cm.state.focused || hasSelection(input) || isReadOnly(cm) || cm.state.disableInput) return false;
1447
- var text = input.value;
1448
- if (text == prevInput && posEq(sel.from, sel.to)) return false;
1449
- if (ie && !ie_lt9 && cm.display.inputHasSelection === text) {
1450
- resetInput(cm, true);
1451
- return false;
1452
- }
1453
-
1454
- var withOp = !cm.curOp;
1455
- if (withOp) startOperation(cm);
1456
- sel.shift = false;
1457
- var same = 0, l = Math.min(prevInput.length, text.length);
1458
- while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) ++same;
1459
- var from = sel.from, to = sel.to;
1460
- if (same < prevInput.length)
1461
- from = Pos(from.line, from.ch - (prevInput.length - same));
1462
- else if (cm.state.overwrite && posEq(from, to) && !cm.state.pasteIncoming)
1463
- to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + (text.length - same)));
1464
-
1465
- var updateInput = cm.curOp.updateInput;
1466
- var changeEvent = {from: from, to: to, text: splitLines(text.slice(same)),
1467
- origin: cm.state.pasteIncoming ? "paste" : "+input"};
1468
- makeChange(cm.doc, changeEvent, "end");
1469
- cm.curOp.updateInput = updateInput;
1470
- signalLater(cm, "inputRead", cm, changeEvent);
1471
-
1472
- if (text.length > 1000 || text.indexOf("\n") > -1) input.value = cm.display.prevInput = "";
1473
- else cm.display.prevInput = text;
1474
- if (withOp) endOperation(cm);
1475
- cm.state.pasteIncoming = false;
1476
- return true;
1477
- }
1478
-
1479
- function resetInput(cm, user) {
1480
- var minimal, selected, doc = cm.doc;
1481
- if (!posEq(doc.sel.from, doc.sel.to)) {
1482
- cm.display.prevInput = "";
1483
- minimal = hasCopyEvent &&
1484
- (doc.sel.to.line - doc.sel.from.line > 100 || (selected = cm.getSelection()).length > 1000);
1485
- var content = minimal ? "-" : selected || cm.getSelection();
1486
- cm.display.input.value = content;
1487
- if (cm.state.focused) selectInput(cm.display.input);
1488
- if (ie && !ie_lt9) cm.display.inputHasSelection = content;
1489
- } else if (user) {
1490
- cm.display.prevInput = cm.display.input.value = "";
1491
- if (ie && !ie_lt9) cm.display.inputHasSelection = null;
1492
- }
1493
- cm.display.inaccurateSelection = minimal;
1494
- }
1495
-
1496
- function focusInput(cm) {
1497
- if (cm.options.readOnly != "nocursor" && (!mobile || document.activeElement != cm.display.input))
1498
- cm.display.input.focus();
1499
- }
1500
-
1501
- function isReadOnly(cm) {
1502
- return cm.options.readOnly || cm.doc.cantEdit;
1503
- }
1504
-
1505
- // EVENT HANDLERS
1506
-
1507
- function registerEventHandlers(cm) {
1508
- var d = cm.display;
1509
- on(d.scroller, "mousedown", operation(cm, onMouseDown));
1510
- if (ie)
1511
- on(d.scroller, "dblclick", operation(cm, function(e) {
1512
- if (signalDOMEvent(cm, e)) return;
1513
- var pos = posFromMouse(cm, e);
1514
- if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) return;
1515
- e_preventDefault(e);
1516
- var word = findWordAt(getLine(cm.doc, pos.line).text, pos);
1517
- extendSelection(cm.doc, word.from, word.to);
1518
- }));
1519
- else
1520
- on(d.scroller, "dblclick", function(e) { signalDOMEvent(cm, e) || e_preventDefault(e); });
1521
- on(d.lineSpace, "selectstart", function(e) {
1522
- if (!eventInWidget(d, e)) e_preventDefault(e);
1523
- });
1524
- // Gecko browsers fire contextmenu *after* opening the menu, at
1525
- // which point we can't mess with it anymore. Context menu is
1526
- // handled in onMouseDown for Gecko.
1527
- if (!captureMiddleClick) on(d.scroller, "contextmenu", function(e) {onContextMenu(cm, e);});
1528
-
1529
- on(d.scroller, "scroll", function() {
1530
- if (d.scroller.clientHeight) {
1531
- setScrollTop(cm, d.scroller.scrollTop);
1532
- setScrollLeft(cm, d.scroller.scrollLeft, true);
1533
- signal(cm, "scroll", cm);
1534
- }
1535
- });
1536
- on(d.scrollbarV, "scroll", function() {
1537
- if (d.scroller.clientHeight) setScrollTop(cm, d.scrollbarV.scrollTop);
1538
- });
1539
- on(d.scrollbarH, "scroll", function() {
1540
- if (d.scroller.clientHeight) setScrollLeft(cm, d.scrollbarH.scrollLeft);
1541
- });
1542
-
1543
- on(d.scroller, "mousewheel", function(e){onScrollWheel(cm, e);});
1544
- on(d.scroller, "DOMMouseScroll", function(e){onScrollWheel(cm, e);});
1545
-
1546
- function reFocus() { if (cm.state.focused) setTimeout(bind(focusInput, cm), 0); }
1547
- on(d.scrollbarH, "mousedown", reFocus);
1548
- on(d.scrollbarV, "mousedown", reFocus);
1549
- // Prevent wrapper from ever scrolling
1550
- on(d.wrapper, "scroll", function() { d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });
1551
-
1552
- var resizeTimer;
1553
- function onResize() {
1554
- if (resizeTimer == null) resizeTimer = setTimeout(function() {
1555
- resizeTimer = null;
1556
- // Might be a text scaling operation, clear size caches.
1557
- d.cachedCharWidth = d.cachedTextHeight = knownScrollbarWidth = null;
1558
- clearCaches(cm);
1559
- runInOp(cm, bind(regChange, cm));
1560
- }, 100);
1561
- }
1562
- on(window, "resize", onResize);
1563
- // Above handler holds on to the editor and its data structures.
1564
- // Here we poll to unregister it when the editor is no longer in
1565
- // the document, so that it can be garbage-collected.
1566
- function unregister() {
1567
- for (var p = d.wrapper.parentNode; p && p != document.body; p = p.parentNode) {}
1568
- if (p) setTimeout(unregister, 5000);
1569
- else off(window, "resize", onResize);
1570
- }
1571
- setTimeout(unregister, 5000);
1572
-
1573
- on(d.input, "keyup", operation(cm, function(e) {
1574
- if (signalDOMEvent(cm, e) || cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return;
1575
- if (e.keyCode == 16) cm.doc.sel.shift = false;
1576
- }));
1577
- on(d.input, "input", bind(fastPoll, cm));
1578
- on(d.input, "keydown", operation(cm, onKeyDown));
1579
- on(d.input, "keypress", operation(cm, onKeyPress));
1580
- on(d.input, "focus", bind(onFocus, cm));
1581
- on(d.input, "blur", bind(onBlur, cm));
1582
-
1583
- function drag_(e) {
1584
- if (signalDOMEvent(cm, e) || cm.options.onDragEvent && cm.options.onDragEvent(cm, addStop(e))) return;
1585
- e_stop(e);
1586
- }
1587
- if (cm.options.dragDrop) {
1588
- on(d.scroller, "dragstart", function(e){onDragStart(cm, e);});
1589
- on(d.scroller, "dragenter", drag_);
1590
- on(d.scroller, "dragover", drag_);
1591
- on(d.scroller, "drop", operation(cm, onDrop));
1592
- }
1593
- on(d.scroller, "paste", function(e){
1594
- if (eventInWidget(d, e)) return;
1595
- focusInput(cm);
1596
- fastPoll(cm);
1597
- });
1598
- on(d.input, "paste", function() {
1599
- cm.state.pasteIncoming = true;
1600
- fastPoll(cm);
1601
- });
1602
-
1603
- function prepareCopy() {
1604
- if (d.inaccurateSelection) {
1605
- d.prevInput = "";
1606
- d.inaccurateSelection = false;
1607
- d.input.value = cm.getSelection();
1608
- selectInput(d.input);
1609
- }
1610
- }
1611
- on(d.input, "cut", prepareCopy);
1612
- on(d.input, "copy", prepareCopy);
1613
-
1614
- // Needed to handle Tab key in KHTML
1615
- if (khtml) on(d.sizer, "mouseup", function() {
1616
- if (document.activeElement == d.input) d.input.blur();
1617
- focusInput(cm);
1618
- });
1619
- }
1620
-
1621
- function eventInWidget(display, e) {
1622
- for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {
1623
- if (!n || n.ignoreEvents || n.parentNode == display.sizer && n != display.mover) return true;
1624
- }
1625
- }
1626
-
1627
- function posFromMouse(cm, e, liberal) {
1628
- var display = cm.display;
1629
- if (!liberal) {
1630
- var target = e_target(e);
1631
- if (target == display.scrollbarH || target == display.scrollbarH.firstChild ||
1632
- target == display.scrollbarV || target == display.scrollbarV.firstChild ||
1633
- target == display.scrollbarFiller || target == display.gutterFiller) return null;
1634
- }
1635
- var x, y, space = getRect(display.lineSpace);
1636
- // Fails unpredictably on IE[67] when mouse is dragged around quickly.
1637
- try { x = e.clientX; y = e.clientY; } catch (e) { return null; }
1638
- return coordsChar(cm, x - space.left, y - space.top);
1639
- }
1640
-
1641
- var lastClick, lastDoubleClick;
1642
- function onMouseDown(e) {
1643
- if (signalDOMEvent(this, e)) return;
1644
- var cm = this, display = cm.display, doc = cm.doc, sel = doc.sel;
1645
- sel.shift = e.shiftKey;
1646
-
1647
- if (eventInWidget(display, e)) {
1648
- if (!webkit) {
1649
- display.scroller.draggable = false;
1650
- setTimeout(function(){display.scroller.draggable = true;}, 100);
1651
- }
1652
- return;
1653
- }
1654
- if (clickInGutter(cm, e)) return;
1655
- var start = posFromMouse(cm, e);
1656
-
1657
- switch (e_button(e)) {
1658
- case 3:
1659
- if (captureMiddleClick) onContextMenu.call(cm, cm, e);
1660
- return;
1661
- case 2:
1662
- if (start) extendSelection(cm.doc, start);
1663
- setTimeout(bind(focusInput, cm), 20);
1664
- e_preventDefault(e);
1665
- return;
1666
- }
1667
- // For button 1, if it was clicked inside the editor
1668
- // (posFromMouse returning non-null), we have to adjust the
1669
- // selection.
1670
- if (!start) {if (e_target(e) == display.scroller) e_preventDefault(e); return;}
1671
-
1672
- if (!cm.state.focused) onFocus(cm);
1673
-
1674
- var now = +new Date, type = "single";
1675
- if (lastDoubleClick && lastDoubleClick.time > now - 400 && posEq(lastDoubleClick.pos, start)) {
1676
- type = "triple";
1677
- e_preventDefault(e);
1678
- setTimeout(bind(focusInput, cm), 20);
1679
- selectLine(cm, start.line);
1680
- } else if (lastClick && lastClick.time > now - 400 && posEq(lastClick.pos, start)) {
1681
- type = "double";
1682
- lastDoubleClick = {time: now, pos: start};
1683
- e_preventDefault(e);
1684
- var word = findWordAt(getLine(doc, start.line).text, start);
1685
- extendSelection(cm.doc, word.from, word.to);
1686
- } else { lastClick = {time: now, pos: start}; }
1687
-
1688
- var last = start;
1689
- if (cm.options.dragDrop && dragAndDrop && !isReadOnly(cm) && !posEq(sel.from, sel.to) &&
1690
- !posLess(start, sel.from) && !posLess(sel.to, start) && type == "single") {
1691
- var dragEnd = operation(cm, function(e2) {
1692
- if (webkit) display.scroller.draggable = false;
1693
- cm.state.draggingText = false;
1694
- off(document, "mouseup", dragEnd);
1695
- off(display.scroller, "drop", dragEnd);
1696
- if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) {
1697
- e_preventDefault(e2);
1698
- extendSelection(cm.doc, start);
1699
- focusInput(cm);
1700
- }
1701
- });
1702
- // Let the drag handler handle this.
1703
- if (webkit) display.scroller.draggable = true;
1704
- cm.state.draggingText = dragEnd;
1705
- // IE's approach to draggable
1706
- if (display.scroller.dragDrop) display.scroller.dragDrop();
1707
- on(document, "mouseup", dragEnd);
1708
- on(display.scroller, "drop", dragEnd);
1709
- return;
1710
- }
1711
- e_preventDefault(e);
1712
- if (type == "single") extendSelection(cm.doc, clipPos(doc, start));
1713
-
1714
- var startstart = sel.from, startend = sel.to, lastPos = start;
1715
-
1716
- function doSelect(cur) {
1717
- if (posEq(lastPos, cur)) return;
1718
- lastPos = cur;
1719
-
1720
- if (type == "single") {
1721
- extendSelection(cm.doc, clipPos(doc, start), cur);
1722
- return;
1723
- }
1724
-
1725
- startstart = clipPos(doc, startstart);
1726
- startend = clipPos(doc, startend);
1727
- if (type == "double") {
1728
- var word = findWordAt(getLine(doc, cur.line).text, cur);
1729
- if (posLess(cur, startstart)) extendSelection(cm.doc, word.from, startend);
1730
- else extendSelection(cm.doc, startstart, word.to);
1731
- } else if (type == "triple") {
1732
- if (posLess(cur, startstart)) extendSelection(cm.doc, startend, clipPos(doc, Pos(cur.line, 0)));
1733
- else extendSelection(cm.doc, startstart, clipPos(doc, Pos(cur.line + 1, 0)));
1734
- }
1735
- }
1736
-
1737
- var editorSize = getRect(display.wrapper);
1738
- // Used to ensure timeout re-tries don't fire when another extend
1739
- // happened in the meantime (clearTimeout isn't reliable -- at
1740
- // least on Chrome, the timeouts still happen even when cleared,
1741
- // if the clear happens after their scheduled firing time).
1742
- var counter = 0;
1743
-
1744
- function extend(e) {
1745
- var curCount = ++counter;
1746
- var cur = posFromMouse(cm, e, true);
1747
- if (!cur) return;
1748
- if (!posEq(cur, last)) {
1749
- if (!cm.state.focused) onFocus(cm);
1750
- last = cur;
1751
- doSelect(cur);
1752
- var visible = visibleLines(display, doc);
1753
- if (cur.line >= visible.to || cur.line < visible.from)
1754
- setTimeout(operation(cm, function(){if (counter == curCount) extend(e);}), 150);
1755
- } else {
1756
- var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0;
1757
- if (outside) setTimeout(operation(cm, function() {
1758
- if (counter != curCount) return;
1759
- display.scroller.scrollTop += outside;
1760
- extend(e);
1761
- }), 50);
1762
- }
1763
- }
1764
-
1765
- function done(e) {
1766
- counter = Infinity;
1767
- e_preventDefault(e);
1768
- focusInput(cm);
1769
- off(document, "mousemove", move);
1770
- off(document, "mouseup", up);
1771
- }
1772
-
1773
- var move = operation(cm, function(e) {
1774
- if (!ie && !e_button(e)) done(e);
1775
- else extend(e);
1776
- });
1777
- var up = operation(cm, done);
1778
- on(document, "mousemove", move);
1779
- on(document, "mouseup", up);
1780
- }
1781
-
1782
- function clickInGutter(cm, e) {
1783
- var display = cm.display;
1784
- try { var mX = e.clientX, mY = e.clientY; }
1785
- catch(e) { return false; }
1786
-
1787
- if (mX >= Math.floor(getRect(display.gutters).right)) return false;
1788
- e_preventDefault(e);
1789
- if (!hasHandler(cm, "gutterClick")) return true;
1790
-
1791
- var lineBox = getRect(display.lineDiv);
1792
- if (mY > lineBox.bottom) return true;
1793
- mY -= lineBox.top - display.viewOffset;
1794
-
1795
- for (var i = 0; i < cm.options.gutters.length; ++i) {
1796
- var g = display.gutters.childNodes[i];
1797
- if (g && getRect(g).right >= mX) {
1798
- var line = lineAtHeight(cm.doc, mY);
1799
- var gutter = cm.options.gutters[i];
1800
- signalLater(cm, "gutterClick", cm, line, gutter, e);
1801
- break;
1802
- }
1803
- }
1804
- return true;
1805
- }
1806
-
1807
- // Kludge to work around strange IE behavior where it'll sometimes
1808
- // re-fire a series of drag-related events right after the drop (#1551)
1809
- var lastDrop = 0;
1810
-
1811
- function onDrop(e) {
1812
- var cm = this;
1813
- if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e) || (cm.options.onDragEvent && cm.options.onDragEvent(cm, addStop(e))))
1814
- return;
1815
- e_preventDefault(e);
1816
- if (ie) lastDrop = +new Date;
1817
- var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;
1818
- if (!pos || isReadOnly(cm)) return;
1819
- if (files && files.length && window.FileReader && window.File) {
1820
- var n = files.length, text = Array(n), read = 0;
1821
- var loadFile = function(file, i) {
1822
- var reader = new FileReader;
1823
- reader.onload = function() {
1824
- text[i] = reader.result;
1825
- if (++read == n) {
1826
- pos = clipPos(cm.doc, pos);
1827
- makeChange(cm.doc, {from: pos, to: pos, text: splitLines(text.join("\n")), origin: "paste"}, "around");
1828
- }
1829
- };
1830
- reader.readAsText(file);
1831
- };
1832
- for (var i = 0; i < n; ++i) loadFile(files[i], i);
1833
- } else {
1834
- // Don't do a replace if the drop happened inside of the selected text.
1835
- if (cm.state.draggingText && !(posLess(pos, cm.doc.sel.from) || posLess(cm.doc.sel.to, pos))) {
1836
- cm.state.draggingText(e);
1837
- // Ensure the editor is re-focused
1838
- setTimeout(bind(focusInput, cm), 20);
1839
- return;
1840
- }
1841
- try {
1842
- var text = e.dataTransfer.getData("Text");
1843
- if (text) {
1844
- var curFrom = cm.doc.sel.from, curTo = cm.doc.sel.to;
1845
- setSelection(cm.doc, pos, pos);
1846
- if (cm.state.draggingText) replaceRange(cm.doc, "", curFrom, curTo, "paste");
1847
- cm.replaceSelection(text, null, "paste");
1848
- focusInput(cm);
1849
- onFocus(cm);
1850
- }
1851
- }
1852
- catch(e){}
1853
- }
1854
- }
1855
-
1856
- function onDragStart(cm, e) {
1857
- if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return; }
1858
- if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return;
1859
-
1860
- var txt = cm.getSelection();
1861
- e.dataTransfer.setData("Text", txt);
1862
-
1863
- // Use dummy image instead of default browsers image.
1864
- // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.
1865
- if (e.dataTransfer.setDragImage && !safari) {
1866
- var img = elt("img", null, null, "position: fixed; left: 0; top: 0;");
1867
- if (opera) {
1868
- img.width = img.height = 1;
1869
- cm.display.wrapper.appendChild(img);
1870
- // Force a relayout, or Opera won't use our image for some obscure reason
1871
- img._top = img.offsetTop;
1872
- }
1873
- e.dataTransfer.setDragImage(img, 0, 0);
1874
- if (opera) img.parentNode.removeChild(img);
1875
- }
1876
- }
1877
-
1878
- function setScrollTop(cm, val) {
1879
- if (Math.abs(cm.doc.scrollTop - val) < 2) return;
1880
- cm.doc.scrollTop = val;
1881
- if (!gecko) updateDisplay(cm, [], val);
1882
- if (cm.display.scroller.scrollTop != val) cm.display.scroller.scrollTop = val;
1883
- if (cm.display.scrollbarV.scrollTop != val) cm.display.scrollbarV.scrollTop = val;
1884
- if (gecko) updateDisplay(cm, []);
1885
- startWorker(cm, 100);
1886
- }
1887
- function setScrollLeft(cm, val, isScroller) {
1888
- if (isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) return;
1889
- val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth);
1890
- cm.doc.scrollLeft = val;
1891
- alignHorizontally(cm);
1892
- if (cm.display.scroller.scrollLeft != val) cm.display.scroller.scrollLeft = val;
1893
- if (cm.display.scrollbarH.scrollLeft != val) cm.display.scrollbarH.scrollLeft = val;
1894
- }
1895
-
1896
- // Since the delta values reported on mouse wheel events are
1897
- // unstandardized between browsers and even browser versions, and
1898
- // generally horribly unpredictable, this code starts by measuring
1899
- // the scroll effect that the first few mouse wheel events have,
1900
- // and, from that, detects the way it can convert deltas to pixel
1901
- // offsets afterwards.
1902
- //
1903
- // The reason we want to know the amount a wheel event will scroll
1904
- // is that it gives us a chance to update the display before the
1905
- // actual scrolling happens, reducing flickering.
1906
-
1907
- var wheelSamples = 0, wheelPixelsPerUnit = null;
1908
- // Fill in a browser-detected starting value on browsers where we
1909
- // know one. These don't have to be accurate -- the result of them
1910
- // being wrong would just be a slight flicker on the first wheel
1911
- // scroll (if it is large enough).
1912
- if (ie) wheelPixelsPerUnit = -.53;
1913
- else if (gecko) wheelPixelsPerUnit = 15;
1914
- else if (chrome) wheelPixelsPerUnit = -.7;
1915
- else if (safari) wheelPixelsPerUnit = -1/3;
1916
-
1917
- function onScrollWheel(cm, e) {
1918
- var dx = e.wheelDeltaX, dy = e.wheelDeltaY;
1919
- if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) dx = e.detail;
1920
- if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) dy = e.detail;
1921
- else if (dy == null) dy = e.wheelDelta;
1922
-
1923
- var display = cm.display, scroll = display.scroller;
1924
- // Quit if there's nothing to scroll here
1925
- if (!(dx && scroll.scrollWidth > scroll.clientWidth ||
1926
- dy && scroll.scrollHeight > scroll.clientHeight)) return;
1927
-
1928
- // Webkit browsers on OS X abort momentum scrolls when the target
1929
- // of the scroll event is removed from the scrollable element.
1930
- // This hack (see related code in patchDisplay) makes sure the
1931
- // element is kept around.
1932
- if (dy && mac && webkit) {
1933
- for (var cur = e.target; cur != scroll; cur = cur.parentNode) {
1934
- if (cur.lineObj) {
1935
- cm.display.currentWheelTarget = cur;
1936
- break;
1937
- }
1938
- }
1939
- }
1940
-
1941
- // On some browsers, horizontal scrolling will cause redraws to
1942
- // happen before the gutter has been realigned, causing it to
1943
- // wriggle around in a most unseemly way. When we have an
1944
- // estimated pixels/delta value, we just handle horizontal
1945
- // scrolling entirely here. It'll be slightly off from native, but
1946
- // better than glitching out.
1947
- if (dx && !gecko && !opera && wheelPixelsPerUnit != null) {
1948
- if (dy)
1949
- setScrollTop(cm, Math.max(0, Math.min(scroll.scrollTop + dy * wheelPixelsPerUnit, scroll.scrollHeight - scroll.clientHeight)));
1950
- setScrollLeft(cm, Math.max(0, Math.min(scroll.scrollLeft + dx * wheelPixelsPerUnit, scroll.scrollWidth - scroll.clientWidth)));
1951
- e_preventDefault(e);
1952
- display.wheelStartX = null; // Abort measurement, if in progress
1953
- return;
1954
- }
1955
-
1956
- if (dy && wheelPixelsPerUnit != null) {
1957
- var pixels = dy * wheelPixelsPerUnit;
1958
- var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight;
1959
- if (pixels < 0) top = Math.max(0, top + pixels - 50);
1960
- else bot = Math.min(cm.doc.height, bot + pixels + 50);
1961
- updateDisplay(cm, [], {top: top, bottom: bot});
1962
- }
1963
-
1964
- if (wheelSamples < 20) {
1965
- if (display.wheelStartX == null) {
1966
- display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop;
1967
- display.wheelDX = dx; display.wheelDY = dy;
1968
- setTimeout(function() {
1969
- if (display.wheelStartX == null) return;
1970
- var movedX = scroll.scrollLeft - display.wheelStartX;
1971
- var movedY = scroll.scrollTop - display.wheelStartY;
1972
- var sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||
1973
- (movedX && display.wheelDX && movedX / display.wheelDX);
1974
- display.wheelStartX = display.wheelStartY = null;
1975
- if (!sample) return;
1976
- wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1);
1977
- ++wheelSamples;
1978
- }, 200);
1979
- } else {
1980
- display.wheelDX += dx; display.wheelDY += dy;
1981
- }
1982
- }
1983
- }
1984
-
1985
- function doHandleBinding(cm, bound, dropShift) {
1986
- if (typeof bound == "string") {
1987
- bound = commands[bound];
1988
- if (!bound) return false;
1989
- }
1990
- // Ensure previous input has been read, so that the handler sees a
1991
- // consistent view of the document
1992
- if (cm.display.pollingFast && readInput(cm)) cm.display.pollingFast = false;
1993
- var doc = cm.doc, prevShift = doc.sel.shift, done = false;
1994
- try {
1995
- if (isReadOnly(cm)) cm.state.suppressEdits = true;
1996
- if (dropShift) doc.sel.shift = false;
1997
- done = bound(cm) != Pass;
1998
- } finally {
1999
- doc.sel.shift = prevShift;
2000
- cm.state.suppressEdits = false;
2001
- }
2002
- return done;
2003
- }
2004
-
2005
- function allKeyMaps(cm) {
2006
- var maps = cm.state.keyMaps.slice(0);
2007
- if (cm.options.extraKeys) maps.push(cm.options.extraKeys);
2008
- maps.push(cm.options.keyMap);
2009
- return maps;
2010
- }
2011
-
2012
- var maybeTransition;
2013
- function handleKeyBinding(cm, e) {
2014
- // Handle auto keymap transitions
2015
- var startMap = getKeyMap(cm.options.keyMap), next = startMap.auto;
2016
- clearTimeout(maybeTransition);
2017
- if (next && !isModifierKey(e)) maybeTransition = setTimeout(function() {
2018
- if (getKeyMap(cm.options.keyMap) == startMap) {
2019
- cm.options.keyMap = (next.call ? next.call(null, cm) : next);
2020
- keyMapChanged(cm);
2021
- }
2022
- }, 50);
2023
-
2024
- var name = keyName(e, true), handled = false;
2025
- if (!name) return false;
2026
- var keymaps = allKeyMaps(cm);
2027
-
2028
- if (e.shiftKey) {
2029
- // First try to resolve full name (including 'Shift-'). Failing
2030
- // that, see if there is a cursor-motion command (starting with
2031
- // 'go') bound to the keyname without 'Shift-'.
2032
- handled = lookupKey("Shift-" + name, keymaps, function(b) {return doHandleBinding(cm, b, true);})
2033
- || lookupKey(name, keymaps, function(b) {
2034
- if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion)
2035
- return doHandleBinding(cm, b);
2036
- });
2037
- } else {
2038
- handled = lookupKey(name, keymaps, function(b) { return doHandleBinding(cm, b); });
2039
- }
2040
-
2041
- if (handled) {
2042
- e_preventDefault(e);
2043
- restartBlink(cm);
2044
- if (ie_lt9) { e.oldKeyCode = e.keyCode; e.keyCode = 0; }
2045
- signalLater(cm, "keyHandled", cm, name, e);
2046
- }
2047
- return handled;
2048
- }
2049
-
2050
- function handleCharBinding(cm, e, ch) {
2051
- var handled = lookupKey("'" + ch + "'", allKeyMaps(cm),
2052
- function(b) { return doHandleBinding(cm, b, true); });
2053
- if (handled) {
2054
- e_preventDefault(e);
2055
- restartBlink(cm);
2056
- signalLater(cm, "keyHandled", cm, "'" + ch + "'", e);
2057
- }
2058
- return handled;
2059
- }
2060
-
2061
- var lastStoppedKey = null;
2062
- function onKeyDown(e) {
2063
- var cm = this;
2064
- if (!cm.state.focused) onFocus(cm);
2065
- if (ie && e.keyCode == 27) { e.returnValue = false; }
2066
- if (signalDOMEvent(cm, e) || cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return;
2067
- var code = e.keyCode;
2068
- // IE does strange things with escape.
2069
- cm.doc.sel.shift = code == 16 || e.shiftKey;
2070
- // First give onKeyEvent option a chance to handle this.
2071
- var handled = handleKeyBinding(cm, e);
2072
- if (opera) {
2073
- lastStoppedKey = handled ? code : null;
2074
- // Opera has no cut event... we try to at least catch the key combo
2075
- if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey))
2076
- cm.replaceSelection("");
2077
- }
2078
- }
2079
-
2080
- function onKeyPress(e) {
2081
- var cm = this;
2082
- if (signalDOMEvent(cm, e) || cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return;
2083
- var keyCode = e.keyCode, charCode = e.charCode;
2084
- if (opera && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;}
2085
- if (((opera && (!e.which || e.which < 10)) || khtml) && handleKeyBinding(cm, e)) return;
2086
- var ch = String.fromCharCode(charCode == null ? keyCode : charCode);
2087
- if (this.options.electricChars && this.doc.mode.electricChars &&
2088
- this.options.smartIndent && !isReadOnly(this) &&
2089
- this.doc.mode.electricChars.indexOf(ch) > -1)
2090
- setTimeout(operation(cm, function() {indentLine(cm, cm.doc.sel.to.line, "smart");}), 75);
2091
- if (handleCharBinding(cm, e, ch)) return;
2092
- if (ie && !ie_lt9) cm.display.inputHasSelection = null;
2093
- fastPoll(cm);
2094
- }
2095
-
2096
- function onFocus(cm) {
2097
- if (cm.options.readOnly == "nocursor") return;
2098
- if (!cm.state.focused) {
2099
- signal(cm, "focus", cm);
2100
- cm.state.focused = true;
2101
- if (cm.display.wrapper.className.search(/\bCodeMirror-focused\b/) == -1)
2102
- cm.display.wrapper.className += " CodeMirror-focused";
2103
- resetInput(cm, true);
2104
- }
2105
- slowPoll(cm);
2106
- restartBlink(cm);
2107
- }
2108
- function onBlur(cm) {
2109
- if (cm.state.focused) {
2110
- signal(cm, "blur", cm);
2111
- cm.state.focused = false;
2112
- cm.display.wrapper.className = cm.display.wrapper.className.replace(" CodeMirror-focused", "");
2113
- }
2114
- clearInterval(cm.display.blinker);
2115
- setTimeout(function() {if (!cm.state.focused) cm.doc.sel.shift = false;}, 150);
2116
- }
2117
-
2118
- var detectingSelectAll;
2119
- function onContextMenu(cm, e) {
2120
- if (signalDOMEvent(cm, e, "contextmenu")) return;
2121
- var display = cm.display, sel = cm.doc.sel;
2122
- if (eventInWidget(display, e)) return;
2123
-
2124
- var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop;
2125
- if (!pos || opera) return; // Opera is difficult.
2126
- if (posEq(sel.from, sel.to) || posLess(pos, sel.from) || !posLess(pos, sel.to))
2127
- operation(cm, setSelection)(cm.doc, pos, pos);
2128
-
2129
- var oldCSS = display.input.style.cssText;
2130
- display.inputDiv.style.position = "absolute";
2131
- display.input.style.cssText = "position: fixed; width: 30px; height: 30px; top: " + (e.clientY - 5) +
2132
- "px; left: " + (e.clientX - 5) + "px; z-index: 1000; background: white; outline: none;" +
2133
- "border-width: 0; outline: none; overflow: hidden; opacity: .05; -ms-opacity: .05; filter: alpha(opacity=5);";
2134
- focusInput(cm);
2135
- resetInput(cm, true);
2136
- // Adds "Select all" to context menu in FF
2137
- if (posEq(sel.from, sel.to)) display.input.value = display.prevInput = " ";
2138
-
2139
- function prepareSelectAllHack() {
2140
- if (display.input.selectionStart != null) {
2141
- var extval = display.input.value = " " + (posEq(sel.from, sel.to) ? "" : display.input.value);
2142
- display.prevInput = " ";
2143
- display.input.selectionStart = 1; display.input.selectionEnd = extval.length;
2144
- }
2145
- }
2146
- function rehide() {
2147
- display.inputDiv.style.position = "relative";
2148
- display.input.style.cssText = oldCSS;
2149
- if (ie_lt9) display.scrollbarV.scrollTop = display.scroller.scrollTop = scrollPos;
2150
- slowPoll(cm);
2151
-
2152
- // Try to detect the user choosing select-all
2153
- if (display.input.selectionStart != null) {
2154
- if (!ie || ie_lt9) prepareSelectAllHack();
2155
- clearTimeout(detectingSelectAll);
2156
- var i = 0, poll = function(){
2157
- if (display.prevInput == " " && display.input.selectionStart == 0)
2158
- operation(cm, commands.selectAll)(cm);
2159
- else if (i++ < 10) detectingSelectAll = setTimeout(poll, 500);
2160
- else resetInput(cm);
2161
- };
2162
- detectingSelectAll = setTimeout(poll, 200);
2163
- }
2164
- }
2165
-
2166
- if (ie && !ie_lt9) prepareSelectAllHack();
2167
- if (captureMiddleClick) {
2168
- e_stop(e);
2169
- var mouseup = function() {
2170
- off(window, "mouseup", mouseup);
2171
- setTimeout(rehide, 20);
2172
- };
2173
- on(window, "mouseup", mouseup);
2174
- } else {
2175
- setTimeout(rehide, 50);
2176
- }
2177
- }
2178
-
2179
- // UPDATING
2180
-
2181
- var changeEnd = CodeMirror.changeEnd = function(change) {
2182
- if (!change.text) return change.to;
2183
- return Pos(change.from.line + change.text.length - 1,
2184
- lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0));
2185
- };
2186
-
2187
- // Make sure a position will be valid after the given change.
2188
- function clipPostChange(doc, change, pos) {
2189
- if (!posLess(change.from, pos)) return clipPos(doc, pos);
2190
- var diff = (change.text.length - 1) - (change.to.line - change.from.line);
2191
- if (pos.line > change.to.line + diff) {
2192
- var preLine = pos.line - diff, lastLine = doc.first + doc.size - 1;
2193
- if (preLine > lastLine) return Pos(lastLine, getLine(doc, lastLine).text.length);
2194
- return clipToLen(pos, getLine(doc, preLine).text.length);
2195
- }
2196
- if (pos.line == change.to.line + diff)
2197
- return clipToLen(pos, lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0) +
2198
- getLine(doc, change.to.line).text.length - change.to.ch);
2199
- var inside = pos.line - change.from.line;
2200
- return clipToLen(pos, change.text[inside].length + (inside ? 0 : change.from.ch));
2201
- }
2202
-
2203
- // Hint can be null|"end"|"start"|"around"|{anchor,head}
2204
- function computeSelAfterChange(doc, change, hint) {
2205
- if (hint && typeof hint == "object") // Assumed to be {anchor, head} object
2206
- return {anchor: clipPostChange(doc, change, hint.anchor),
2207
- head: clipPostChange(doc, change, hint.head)};
2208
-
2209
- if (hint == "start") return {anchor: change.from, head: change.from};
2210
-
2211
- var end = changeEnd(change);
2212
- if (hint == "around") return {anchor: change.from, head: end};
2213
- if (hint == "end") return {anchor: end, head: end};
2214
-
2215
- // hint is null, leave the selection alone as much as possible
2216
- var adjustPos = function(pos) {
2217
- if (posLess(pos, change.from)) return pos;
2218
- if (!posLess(change.to, pos)) return end;
2219
-
2220
- var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch;
2221
- if (pos.line == change.to.line) ch += end.ch - change.to.ch;
2222
- return Pos(line, ch);
2223
- };
2224
- return {anchor: adjustPos(doc.sel.anchor), head: adjustPos(doc.sel.head)};
2225
- }
2226
-
2227
- function filterChange(doc, change, update) {
2228
- var obj = {
2229
- canceled: false,
2230
- from: change.from,
2231
- to: change.to,
2232
- text: change.text,
2233
- origin: change.origin,
2234
- cancel: function() { this.canceled = true; }
2235
- };
2236
- if (update) obj.update = function(from, to, text, origin) {
2237
- if (from) this.from = clipPos(doc, from);
2238
- if (to) this.to = clipPos(doc, to);
2239
- if (text) this.text = text;
2240
- if (origin !== undefined) this.origin = origin;
2241
- };
2242
- signal(doc, "beforeChange", doc, obj);
2243
- if (doc.cm) signal(doc.cm, "beforeChange", doc.cm, obj);
2244
-
2245
- if (obj.canceled) return null;
2246
- return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin};
2247
- }
2248
-
2249
- // Replace the range from from to to by the strings in replacement.
2250
- // change is a {from, to, text [, origin]} object
2251
- function makeChange(doc, change, selUpdate, ignoreReadOnly) {
2252
- if (doc.cm) {
2253
- if (!doc.cm.curOp) return operation(doc.cm, makeChange)(doc, change, selUpdate, ignoreReadOnly);
2254
- if (doc.cm.state.suppressEdits) return;
2255
- }
2256
-
2257
- if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) {
2258
- change = filterChange(doc, change, true);
2259
- if (!change) return;
2260
- }
2261
-
2262
- // Possibly split or suppress the update based on the presence
2263
- // of read-only spans in its range.
2264
- var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to);
2265
- if (split) {
2266
- for (var i = split.length - 1; i >= 1; --i)
2267
- makeChangeNoReadonly(doc, {from: split[i].from, to: split[i].to, text: [""]});
2268
- if (split.length)
2269
- makeChangeNoReadonly(doc, {from: split[0].from, to: split[0].to, text: change.text}, selUpdate);
2270
- } else {
2271
- makeChangeNoReadonly(doc, change, selUpdate);
2272
- }
2273
- }
2274
-
2275
- function makeChangeNoReadonly(doc, change, selUpdate) {
2276
- var selAfter = computeSelAfterChange(doc, change, selUpdate);
2277
- addToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN);
2278
-
2279
- makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change));
2280
- var rebased = [];
2281
-
2282
- linkedDocs(doc, function(doc, sharedHist) {
2283
- if (!sharedHist && indexOf(rebased, doc.history) == -1) {
2284
- rebaseHist(doc.history, change);
2285
- rebased.push(doc.history);
2286
- }
2287
- makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change));
2288
- });
2289
- }
2290
-
2291
- function makeChangeFromHistory(doc, type) {
2292
- if (doc.cm && doc.cm.state.suppressEdits) return;
2293
-
2294
- var hist = doc.history;
2295
- var event = (type == "undo" ? hist.done : hist.undone).pop();
2296
- if (!event) return;
2297
-
2298
- var anti = {changes: [], anchorBefore: event.anchorAfter, headBefore: event.headAfter,
2299
- anchorAfter: event.anchorBefore, headAfter: event.headBefore,
2300
- generation: hist.generation};
2301
- (type == "undo" ? hist.undone : hist.done).push(anti);
2302
- hist.generation = event.generation || ++hist.maxGeneration;
2303
-
2304
- var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange");
2305
-
2306
- for (var i = event.changes.length - 1; i >= 0; --i) {
2307
- var change = event.changes[i];
2308
- change.origin = type;
2309
- if (filter && !filterChange(doc, change, false)) {
2310
- (type == "undo" ? hist.done : hist.undone).length = 0;
2311
- return;
2312
- }
2313
-
2314
- anti.changes.push(historyChangeFromChange(doc, change));
2315
-
2316
- var after = i ? computeSelAfterChange(doc, change, null)
2317
- : {anchor: event.anchorBefore, head: event.headBefore};
2318
- makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change));
2319
- var rebased = [];
2320
-
2321
- linkedDocs(doc, function(doc, sharedHist) {
2322
- if (!sharedHist && indexOf(rebased, doc.history) == -1) {
2323
- rebaseHist(doc.history, change);
2324
- rebased.push(doc.history);
2325
- }
2326
- makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change));
2327
- });
2328
- }
2329
- }
2330
-
2331
- function shiftDoc(doc, distance) {
2332
- function shiftPos(pos) {return Pos(pos.line + distance, pos.ch);}
2333
- doc.first += distance;
2334
- if (doc.cm) regChange(doc.cm, doc.first, doc.first, distance);
2335
- doc.sel.head = shiftPos(doc.sel.head); doc.sel.anchor = shiftPos(doc.sel.anchor);
2336
- doc.sel.from = shiftPos(doc.sel.from); doc.sel.to = shiftPos(doc.sel.to);
2337
- }
2338
-
2339
- function makeChangeSingleDoc(doc, change, selAfter, spans) {
2340
- if (doc.cm && !doc.cm.curOp)
2341
- return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans);
2342
-
2343
- if (change.to.line < doc.first) {
2344
- shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line));
2345
- return;
2346
- }
2347
- if (change.from.line > doc.lastLine()) return;
2348
-
2349
- // Clip the change to the size of this doc
2350
- if (change.from.line < doc.first) {
2351
- var shift = change.text.length - 1 - (doc.first - change.from.line);
2352
- shiftDoc(doc, shift);
2353
- change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch),
2354
- text: [lst(change.text)], origin: change.origin};
2355
- }
2356
- var last = doc.lastLine();
2357
- if (change.to.line > last) {
2358
- change = {from: change.from, to: Pos(last, getLine(doc, last).text.length),
2359
- text: [change.text[0]], origin: change.origin};
2360
- }
2361
-
2362
- change.removed = getBetween(doc, change.from, change.to);
2363
-
2364
- if (!selAfter) selAfter = computeSelAfterChange(doc, change, null);
2365
- if (doc.cm) makeChangeSingleDocInEditor(doc.cm, change, spans, selAfter);
2366
- else updateDoc(doc, change, spans, selAfter);
2367
- }
2368
-
2369
- function makeChangeSingleDocInEditor(cm, change, spans, selAfter) {
2370
- var doc = cm.doc, display = cm.display, from = change.from, to = change.to;
2371
-
2372
- var recomputeMaxLength = false, checkWidthStart = from.line;
2373
- if (!cm.options.lineWrapping) {
2374
- checkWidthStart = lineNo(visualLine(doc, getLine(doc, from.line)));
2375
- doc.iter(checkWidthStart, to.line + 1, function(line) {
2376
- if (line == display.maxLine) {
2377
- recomputeMaxLength = true;
2378
- return true;
2379
- }
2380
- });
2381
- }
2382
-
2383
- if (!posLess(doc.sel.head, change.from) && !posLess(change.to, doc.sel.head))
2384
- cm.curOp.cursorActivity = true;
2385
-
2386
- updateDoc(doc, change, spans, selAfter, estimateHeight(cm));
2387
-
2388
- if (!cm.options.lineWrapping) {
2389
- doc.iter(checkWidthStart, from.line + change.text.length, function(line) {
2390
- var len = lineLength(doc, line);
2391
- if (len > display.maxLineLength) {
2392
- display.maxLine = line;
2393
- display.maxLineLength = len;
2394
- display.maxLineChanged = true;
2395
- recomputeMaxLength = false;
2396
- }
2397
- });
2398
- if (recomputeMaxLength) cm.curOp.updateMaxLine = true;
2399
- }
2400
-
2401
- // Adjust frontier, schedule worker
2402
- doc.frontier = Math.min(doc.frontier, from.line);
2403
- startWorker(cm, 400);
2404
-
2405
- var lendiff = change.text.length - (to.line - from.line) - 1;
2406
- // Remember that these lines changed, for updating the display
2407
- regChange(cm, from.line, to.line + 1, lendiff);
2408
-
2409
- if (hasHandler(cm, "change")) {
2410
- var changeObj = {from: from, to: to,
2411
- text: change.text,
2412
- removed: change.removed,
2413
- origin: change.origin};
2414
- if (cm.curOp.textChanged) {
2415
- for (var cur = cm.curOp.textChanged; cur.next; cur = cur.next) {}
2416
- cur.next = changeObj;
2417
- } else cm.curOp.textChanged = changeObj;
2418
- }
2419
- }
2420
-
2421
- function replaceRange(doc, code, from, to, origin) {
2422
- if (!to) to = from;
2423
- if (posLess(to, from)) { var tmp = to; to = from; from = tmp; }
2424
- if (typeof code == "string") code = splitLines(code);
2425
- makeChange(doc, {from: from, to: to, text: code, origin: origin}, null);
2426
- }
2427
-
2428
- // POSITION OBJECT
2429
-
2430
- function Pos(line, ch) {
2431
- if (!(this instanceof Pos)) return new Pos(line, ch);
2432
- this.line = line; this.ch = ch;
2433
- }
2434
- CodeMirror.Pos = Pos;
2435
-
2436
- function posEq(a, b) {return a.line == b.line && a.ch == b.ch;}
2437
- function posLess(a, b) {return a.line < b.line || (a.line == b.line && a.ch < b.ch);}
2438
- function copyPos(x) {return Pos(x.line, x.ch);}
2439
-
2440
- // SELECTION
2441
-
2442
- function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1));}
2443
- function clipPos(doc, pos) {
2444
- if (pos.line < doc.first) return Pos(doc.first, 0);
2445
- var last = doc.first + doc.size - 1;
2446
- if (pos.line > last) return Pos(last, getLine(doc, last).text.length);
2447
- return clipToLen(pos, getLine(doc, pos.line).text.length);
2448
- }
2449
- function clipToLen(pos, linelen) {
2450
- var ch = pos.ch;
2451
- if (ch == null || ch > linelen) return Pos(pos.line, linelen);
2452
- else if (ch < 0) return Pos(pos.line, 0);
2453
- else return pos;
2454
- }
2455
- function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size;}
2456
-
2457
- // If shift is held, this will move the selection anchor. Otherwise,
2458
- // it'll set the whole selection.
2459
- function extendSelection(doc, pos, other, bias) {
2460
- if (doc.sel.shift || doc.sel.extend) {
2461
- var anchor = doc.sel.anchor;
2462
- if (other) {
2463
- var posBefore = posLess(pos, anchor);
2464
- if (posBefore != posLess(other, anchor)) {
2465
- anchor = pos;
2466
- pos = other;
2467
- } else if (posBefore != posLess(pos, other)) {
2468
- pos = other;
2469
- }
2470
- }
2471
- setSelection(doc, anchor, pos, bias);
2472
- } else {
2473
- setSelection(doc, pos, other || pos, bias);
2474
- }
2475
- if (doc.cm) doc.cm.curOp.userSelChange = true;
2476
- }
2477
-
2478
- function filterSelectionChange(doc, anchor, head) {
2479
- var obj = {anchor: anchor, head: head};
2480
- signal(doc, "beforeSelectionChange", doc, obj);
2481
- if (doc.cm) signal(doc.cm, "beforeSelectionChange", doc.cm, obj);
2482
- obj.anchor = clipPos(doc, obj.anchor); obj.head = clipPos(doc, obj.head);
2483
- return obj;
2484
- }
2485
-
2486
- // Update the selection. Last two args are only used by
2487
- // updateDoc, since they have to be expressed in the line
2488
- // numbers before the update.
2489
- function setSelection(doc, anchor, head, bias, checkAtomic) {
2490
- if (!checkAtomic && hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange")) {
2491
- var filtered = filterSelectionChange(doc, anchor, head);
2492
- head = filtered.head;
2493
- anchor = filtered.anchor;
2494
- }
2495
-
2496
- var sel = doc.sel;
2497
- sel.goalColumn = null;
2498
- // Skip over atomic spans.
2499
- if (checkAtomic || !posEq(anchor, sel.anchor))
2500
- anchor = skipAtomic(doc, anchor, bias, checkAtomic != "push");
2501
- if (checkAtomic || !posEq(head, sel.head))
2502
- head = skipAtomic(doc, head, bias, checkAtomic != "push");
2503
-
2504
- if (posEq(sel.anchor, anchor) && posEq(sel.head, head)) return;
2505
-
2506
- sel.anchor = anchor; sel.head = head;
2507
- var inv = posLess(head, anchor);
2508
- sel.from = inv ? head : anchor;
2509
- sel.to = inv ? anchor : head;
2510
-
2511
- if (doc.cm)
2512
- doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged =
2513
- doc.cm.curOp.cursorActivity = true;
2514
-
2515
- signalLater(doc, "cursorActivity", doc);
2516
- }
2517
-
2518
- function reCheckSelection(cm) {
2519
- setSelection(cm.doc, cm.doc.sel.from, cm.doc.sel.to, null, "push");
2520
- }
2521
-
2522
- function skipAtomic(doc, pos, bias, mayClear) {
2523
- var flipped = false, curPos = pos;
2524
- var dir = bias || 1;
2525
- doc.cantEdit = false;
2526
- search: for (;;) {
2527
- var line = getLine(doc, curPos.line);
2528
- if (line.markedSpans) {
2529
- for (var i = 0; i < line.markedSpans.length; ++i) {
2530
- var sp = line.markedSpans[i], m = sp.marker;
2531
- if ((sp.from == null || (m.inclusiveLeft ? sp.from <= curPos.ch : sp.from < curPos.ch)) &&
2532
- (sp.to == null || (m.inclusiveRight ? sp.to >= curPos.ch : sp.to > curPos.ch))) {
2533
- if (mayClear) {
2534
- signal(m, "beforeCursorEnter");
2535
- if (m.explicitlyCleared) {
2536
- if (!line.markedSpans) break;
2537
- else {--i; continue;}
2538
- }
2539
- }
2540
- if (!m.atomic) continue;
2541
- var newPos = m.find()[dir < 0 ? "from" : "to"];
2542
- if (posEq(newPos, curPos)) {
2543
- newPos.ch += dir;
2544
- if (newPos.ch < 0) {
2545
- if (newPos.line > doc.first) newPos = clipPos(doc, Pos(newPos.line - 1));
2546
- else newPos = null;
2547
- } else if (newPos.ch > line.text.length) {
2548
- if (newPos.line < doc.first + doc.size - 1) newPos = Pos(newPos.line + 1, 0);
2549
- else newPos = null;
2550
- }
2551
- if (!newPos) {
2552
- if (flipped) {
2553
- // Driven in a corner -- no valid cursor position found at all
2554
- // -- try again *with* clearing, if we didn't already
2555
- if (!mayClear) return skipAtomic(doc, pos, bias, true);
2556
- // Otherwise, turn off editing until further notice, and return the start of the doc
2557
- doc.cantEdit = true;
2558
- return Pos(doc.first, 0);
2559
- }
2560
- flipped = true; newPos = pos; dir = -dir;
2561
- }
2562
- }
2563
- curPos = newPos;
2564
- continue search;
2565
- }
2566
- }
2567
- }
2568
- return curPos;
2569
- }
2570
- }
2571
-
2572
- // SCROLLING
2573
-
2574
- function scrollCursorIntoView(cm) {
2575
- var coords = scrollPosIntoView(cm, cm.doc.sel.head, cm.options.cursorScrollMargin);
2576
- if (!cm.state.focused) return;
2577
- var display = cm.display, box = getRect(display.sizer), doScroll = null;
2578
- if (coords.top + box.top < 0) doScroll = true;
2579
- else if (coords.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false;
2580
- if (doScroll != null && !phantom) {
2581
- var hidden = display.cursor.style.display == "none";
2582
- if (hidden) {
2583
- display.cursor.style.display = "";
2584
- display.cursor.style.left = coords.left + "px";
2585
- display.cursor.style.top = (coords.top - display.viewOffset) + "px";
2586
- }
2587
- display.cursor.scrollIntoView(doScroll);
2588
- if (hidden) display.cursor.style.display = "none";
2589
- }
2590
- }
2591
-
2592
- function scrollPosIntoView(cm, pos, margin) {
2593
- if (margin == null) margin = 0;
2594
- for (;;) {
2595
- var changed = false, coords = cursorCoords(cm, pos);
2596
- var scrollPos = calculateScrollPos(cm, coords.left, coords.top - margin, coords.left, coords.bottom + margin);
2597
- var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft;
2598
- if (scrollPos.scrollTop != null) {
2599
- setScrollTop(cm, scrollPos.scrollTop);
2600
- if (Math.abs(cm.doc.scrollTop - startTop) > 1) changed = true;
2601
- }
2602
- if (scrollPos.scrollLeft != null) {
2603
- setScrollLeft(cm, scrollPos.scrollLeft);
2604
- if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) changed = true;
2605
- }
2606
- if (!changed) return coords;
2607
- }
2608
- }
2609
-
2610
- function scrollIntoView(cm, x1, y1, x2, y2) {
2611
- var scrollPos = calculateScrollPos(cm, x1, y1, x2, y2);
2612
- if (scrollPos.scrollTop != null) setScrollTop(cm, scrollPos.scrollTop);
2613
- if (scrollPos.scrollLeft != null) setScrollLeft(cm, scrollPos.scrollLeft);
2614
- }
2615
-
2616
- function calculateScrollPos(cm, x1, y1, x2, y2) {
2617
- var display = cm.display, snapMargin = textHeight(cm.display);
2618
- if (y1 < 0) y1 = 0;
2619
- var screen = display.scroller.clientHeight - scrollerCutOff, screentop = display.scroller.scrollTop, result = {};
2620
- var docBottom = cm.doc.height + paddingVert(display);
2621
- var atTop = y1 < snapMargin, atBottom = y2 > docBottom - snapMargin;
2622
- if (y1 < screentop) {
2623
- result.scrollTop = atTop ? 0 : y1;
2624
- } else if (y2 > screentop + screen) {
2625
- var newTop = Math.min(y1, (atBottom ? docBottom : y2) - screen);
2626
- if (newTop != screentop) result.scrollTop = newTop;
2627
- }
2628
-
2629
- var screenw = display.scroller.clientWidth - scrollerCutOff, screenleft = display.scroller.scrollLeft;
2630
- x1 += display.gutters.offsetWidth; x2 += display.gutters.offsetWidth;
2631
- var gutterw = display.gutters.offsetWidth;
2632
- var atLeft = x1 < gutterw + 10;
2633
- if (x1 < screenleft + gutterw || atLeft) {
2634
- if (atLeft) x1 = 0;
2635
- result.scrollLeft = Math.max(0, x1 - 10 - gutterw);
2636
- } else if (x2 > screenw + screenleft - 3) {
2637
- result.scrollLeft = x2 + 10 - screenw;
2638
- }
2639
- return result;
2640
- }
2641
-
2642
- function updateScrollPos(cm, left, top) {
2643
- cm.curOp.updateScrollPos = {scrollLeft: left == null ? cm.doc.scrollLeft : left,
2644
- scrollTop: top == null ? cm.doc.scrollTop : top};
2645
- }
2646
-
2647
- function addToScrollPos(cm, left, top) {
2648
- var pos = cm.curOp.updateScrollPos || (cm.curOp.updateScrollPos = {scrollLeft: cm.doc.scrollLeft, scrollTop: cm.doc.scrollTop});
2649
- var scroll = cm.display.scroller;
2650
- pos.scrollTop = Math.max(0, Math.min(scroll.scrollHeight - scroll.clientHeight, pos.scrollTop + top));
2651
- pos.scrollLeft = Math.max(0, Math.min(scroll.scrollWidth - scroll.clientWidth, pos.scrollLeft + left));
2652
- }
2653
-
2654
- // API UTILITIES
2655
-
2656
- function indentLine(cm, n, how, aggressive) {
2657
- var doc = cm.doc;
2658
- if (how == null) how = "add";
2659
- if (how == "smart") {
2660
- if (!cm.doc.mode.indent) how = "prev";
2661
- else var state = getStateBefore(cm, n);
2662
- }
2663
-
2664
- var tabSize = cm.options.tabSize;
2665
- var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize);
2666
- var curSpaceString = line.text.match(/^\s*/)[0], indentation;
2667
- if (how == "smart") {
2668
- indentation = cm.doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text);
2669
- if (indentation == Pass) {
2670
- if (!aggressive) return;
2671
- how = "prev";
2672
- }
2673
- }
2674
- if (how == "prev") {
2675
- if (n > doc.first) indentation = countColumn(getLine(doc, n-1).text, null, tabSize);
2676
- else indentation = 0;
2677
- } else if (how == "add") {
2678
- indentation = curSpace + cm.options.indentUnit;
2679
- } else if (how == "subtract") {
2680
- indentation = curSpace - cm.options.indentUnit;
2681
- } else if (typeof how == "number") {
2682
- indentation = curSpace + how;
2683
- }
2684
- indentation = Math.max(0, indentation);
2685
-
2686
- var indentString = "", pos = 0;
2687
- if (cm.options.indentWithTabs)
2688
- for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";}
2689
- if (pos < indentation) indentString += spaceStr(indentation - pos);
2690
-
2691
- if (indentString != curSpaceString)
2692
- replaceRange(cm.doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input");
2693
- line.stateAfter = null;
2694
- }
2695
-
2696
- function changeLine(cm, handle, op) {
2697
- var no = handle, line = handle, doc = cm.doc;
2698
- if (typeof handle == "number") line = getLine(doc, clipLine(doc, handle));
2699
- else no = lineNo(handle);
2700
- if (no == null) return null;
2701
- if (op(line, no)) regChange(cm, no, no + 1);
2702
- else return null;
2703
- return line;
2704
- }
2705
-
2706
- function findPosH(doc, pos, dir, unit, visually) {
2707
- var line = pos.line, ch = pos.ch, origDir = dir;
2708
- var lineObj = getLine(doc, line);
2709
- var possible = true;
2710
- function findNextLine() {
2711
- var l = line + dir;
2712
- if (l < doc.first || l >= doc.first + doc.size) return (possible = false);
2713
- line = l;
2714
- return lineObj = getLine(doc, l);
2715
- }
2716
- function moveOnce(boundToLine) {
2717
- var next = (visually ? moveVisually : moveLogically)(lineObj, ch, dir, true);
2718
- if (next == null) {
2719
- if (!boundToLine && findNextLine()) {
2720
- if (visually) ch = (dir < 0 ? lineRight : lineLeft)(lineObj);
2721
- else ch = dir < 0 ? lineObj.text.length : 0;
2722
- } else return (possible = false);
2723
- } else ch = next;
2724
- return true;
2725
- }
2726
-
2727
- if (unit == "char") moveOnce();
2728
- else if (unit == "column") moveOnce(true);
2729
- else if (unit == "word" || unit == "group") {
2730
- var sawType = null, group = unit == "group";
2731
- for (var first = true;; first = false) {
2732
- if (dir < 0 && !moveOnce(!first)) break;
2733
- var cur = lineObj.text.charAt(ch) || "\n";
2734
- var type = isWordChar(cur) ? "w"
2735
- : !group ? null
2736
- : /\s/.test(cur) ? null
2737
- : "p";
2738
- if (sawType && sawType != type) {
2739
- if (dir < 0) {dir = 1; moveOnce();}
2740
- break;
2741
- }
2742
- if (type) sawType = type;
2743
- if (dir > 0 && !moveOnce(!first)) break;
2744
- }
2745
- }
2746
- var result = skipAtomic(doc, Pos(line, ch), origDir, true);
2747
- if (!possible) result.hitSide = true;
2748
- return result;
2749
- }
2750
-
2751
- function findPosV(cm, pos, dir, unit) {
2752
- var doc = cm.doc, x = pos.left, y;
2753
- if (unit == "page") {
2754
- var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight);
2755
- y = pos.top + dir * (pageSize - (dir < 0 ? 1.5 : .5) * textHeight(cm.display));
2756
- } else if (unit == "line") {
2757
- y = dir > 0 ? pos.bottom + 3 : pos.top - 3;
2758
- }
2759
- for (;;) {
2760
- var target = coordsChar(cm, x, y);
2761
- if (!target.outside) break;
2762
- if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break; }
2763
- y += dir * 5;
2764
- }
2765
- return target;
2766
- }
2767
-
2768
- function findWordAt(line, pos) {
2769
- var start = pos.ch, end = pos.ch;
2770
- if (line) {
2771
- if ((pos.xRel < 0 || end == line.length) && start) --start; else ++end;
2772
- var startChar = line.charAt(start);
2773
- var check = isWordChar(startChar) ? isWordChar
2774
- : /\s/.test(startChar) ? function(ch) {return /\s/.test(ch);}
2775
- : function(ch) {return !/\s/.test(ch) && !isWordChar(ch);};
2776
- while (start > 0 && check(line.charAt(start - 1))) --start;
2777
- while (end < line.length && check(line.charAt(end))) ++end;
2778
- }
2779
- return {from: Pos(pos.line, start), to: Pos(pos.line, end)};
2780
- }
2781
-
2782
- function selectLine(cm, line) {
2783
- extendSelection(cm.doc, Pos(line, 0), clipPos(cm.doc, Pos(line + 1, 0)));
2784
- }
2785
-
2786
- // PROTOTYPE
2787
-
2788
- // The publicly visible API. Note that operation(null, f) means
2789
- // 'wrap f in an operation, performed on its `this` parameter'
2790
-
2791
- CodeMirror.prototype = {
2792
- constructor: CodeMirror,
2793
- focus: function(){window.focus(); focusInput(this); onFocus(this); fastPoll(this);},
2794
-
2795
- setOption: function(option, value) {
2796
- var options = this.options, old = options[option];
2797
- if (options[option] == value && option != "mode") return;
2798
- options[option] = value;
2799
- if (optionHandlers.hasOwnProperty(option))
2800
- operation(this, optionHandlers[option])(this, value, old);
2801
- },
2802
-
2803
- getOption: function(option) {return this.options[option];},
2804
- getDoc: function() {return this.doc;},
2805
-
2806
- addKeyMap: function(map, bottom) {
2807
- this.state.keyMaps[bottom ? "push" : "unshift"](map);
2808
- },
2809
- removeKeyMap: function(map) {
2810
- var maps = this.state.keyMaps;
2811
- for (var i = 0; i < maps.length; ++i)
2812
- if (maps[i] == map || (typeof maps[i] != "string" && maps[i].name == map)) {
2813
- maps.splice(i, 1);
2814
- return true;
2815
- }
2816
- },
2817
-
2818
- addOverlay: operation(null, function(spec, options) {
2819
- var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec);
2820
- if (mode.startState) throw new Error("Overlays may not be stateful.");
2821
- this.state.overlays.push({mode: mode, modeSpec: spec, opaque: options && options.opaque});
2822
- this.state.modeGen++;
2823
- regChange(this);
2824
- }),
2825
- removeOverlay: operation(null, function(spec) {
2826
- var overlays = this.state.overlays;
2827
- for (var i = 0; i < overlays.length; ++i) {
2828
- var cur = overlays[i].modeSpec;
2829
- if (cur == spec || typeof spec == "string" && cur.name == spec) {
2830
- overlays.splice(i, 1);
2831
- this.state.modeGen++;
2832
- regChange(this);
2833
- return;
2834
- }
2835
- }
2836
- }),
2837
-
2838
- indentLine: operation(null, function(n, dir, aggressive) {
2839
- if (typeof dir != "string" && typeof dir != "number") {
2840
- if (dir == null) dir = this.options.smartIndent ? "smart" : "prev";
2841
- else dir = dir ? "add" : "subtract";
2842
- }
2843
- if (isLine(this.doc, n)) indentLine(this, n, dir, aggressive);
2844
- }),
2845
- indentSelection: operation(null, function(how) {
2846
- var sel = this.doc.sel;
2847
- if (posEq(sel.from, sel.to)) return indentLine(this, sel.from.line, how);
2848
- var e = sel.to.line - (sel.to.ch ? 0 : 1);
2849
- for (var i = sel.from.line; i <= e; ++i) indentLine(this, i, how);
2850
- }),
2851
-
2852
- // Fetch the parser token for a given character. Useful for hacks
2853
- // that want to inspect the mode state (say, for completion).
2854
- getTokenAt: function(pos, precise) {
2855
- var doc = this.doc;
2856
- pos = clipPos(doc, pos);
2857
- var state = getStateBefore(this, pos.line, precise), mode = this.doc.mode;
2858
- var line = getLine(doc, pos.line);
2859
- var stream = new StringStream(line.text, this.options.tabSize);
2860
- while (stream.pos < pos.ch && !stream.eol()) {
2861
- stream.start = stream.pos;
2862
- var style = mode.token(stream, state);
2863
- }
2864
- return {start: stream.start,
2865
- end: stream.pos,
2866
- string: stream.current(),
2867
- className: style || null, // Deprecated, use 'type' instead
2868
- type: style || null,
2869
- state: state};
2870
- },
2871
-
2872
- getTokenTypeAt: function(pos) {
2873
- pos = clipPos(this.doc, pos);
2874
- var styles = getLineStyles(this, getLine(this.doc, pos.line));
2875
- var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;
2876
- if (ch == 0) return styles[2];
2877
- for (;;) {
2878
- var mid = (before + after) >> 1;
2879
- if ((mid ? styles[mid * 2 - 1] : 0) >= ch) after = mid;
2880
- else if (styles[mid * 2 + 1] < ch) before = mid + 1;
2881
- else return styles[mid * 2 + 2];
2882
- }
2883
- },
2884
-
2885
- getModeAt: function(pos) {
2886
- var mode = this.doc.mode;
2887
- if (!mode.innerMode) return mode;
2888
- return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode;
2889
- },
2890
-
2891
- getHelper: function(pos, type) {
2892
- if (!helpers.hasOwnProperty(type)) return;
2893
- var help = helpers[type], mode = this.getModeAt(pos);
2894
- return mode[type] && help[mode[type]] ||
2895
- mode.helperType && help[mode.helperType] ||
2896
- help[mode.name];
2897
- },
2898
-
2899
- getStateAfter: function(line, precise) {
2900
- var doc = this.doc;
2901
- line = clipLine(doc, line == null ? doc.first + doc.size - 1: line);
2902
- return getStateBefore(this, line + 1, precise);
2903
- },
2904
-
2905
- cursorCoords: function(start, mode) {
2906
- var pos, sel = this.doc.sel;
2907
- if (start == null) pos = sel.head;
2908
- else if (typeof start == "object") pos = clipPos(this.doc, start);
2909
- else pos = start ? sel.from : sel.to;
2910
- return cursorCoords(this, pos, mode || "page");
2911
- },
2912
-
2913
- charCoords: function(pos, mode) {
2914
- return charCoords(this, clipPos(this.doc, pos), mode || "page");
2915
- },
2916
-
2917
- coordsChar: function(coords, mode) {
2918
- coords = fromCoordSystem(this, coords, mode || "page");
2919
- return coordsChar(this, coords.left, coords.top);
2920
- },
2921
-
2922
- lineAtHeight: function(height, mode) {
2923
- height = fromCoordSystem(this, {top: height, left: 0}, mode || "page").top;
2924
- return lineAtHeight(this.doc, height + this.display.viewOffset);
2925
- },
2926
- heightAtLine: function(line, mode) {
2927
- var end = false, last = this.doc.first + this.doc.size - 1;
2928
- if (line < this.doc.first) line = this.doc.first;
2929
- else if (line > last) { line = last; end = true; }
2930
- var lineObj = getLine(this.doc, line);
2931
- return intoCoordSystem(this, getLine(this.doc, line), {top: 0, left: 0}, mode || "page").top +
2932
- (end ? lineObj.height : 0);
2933
- },
2934
-
2935
- defaultTextHeight: function() { return textHeight(this.display); },
2936
- defaultCharWidth: function() { return charWidth(this.display); },
2937
-
2938
- setGutterMarker: operation(null, function(line, gutterID, value) {
2939
- return changeLine(this, line, function(line) {
2940
- var markers = line.gutterMarkers || (line.gutterMarkers = {});
2941
- markers[gutterID] = value;
2942
- if (!value && isEmpty(markers)) line.gutterMarkers = null;
2943
- return true;
2944
- });
2945
- }),
2946
-
2947
- clearGutter: operation(null, function(gutterID) {
2948
- var cm = this, doc = cm.doc, i = doc.first;
2949
- doc.iter(function(line) {
2950
- if (line.gutterMarkers && line.gutterMarkers[gutterID]) {
2951
- line.gutterMarkers[gutterID] = null;
2952
- regChange(cm, i, i + 1);
2953
- if (isEmpty(line.gutterMarkers)) line.gutterMarkers = null;
2954
- }
2955
- ++i;
2956
- });
2957
- }),
2958
-
2959
- addLineClass: operation(null, function(handle, where, cls) {
2960
- return changeLine(this, handle, function(line) {
2961
- var prop = where == "text" ? "textClass" : where == "background" ? "bgClass" : "wrapClass";
2962
- if (!line[prop]) line[prop] = cls;
2963
- else if (new RegExp("(?:^|\\s)" + cls + "(?:$|\\s)").test(line[prop])) return false;
2964
- else line[prop] += " " + cls;
2965
- return true;
2966
- });
2967
- }),
2968
-
2969
- removeLineClass: operation(null, function(handle, where, cls) {
2970
- return changeLine(this, handle, function(line) {
2971
- var prop = where == "text" ? "textClass" : where == "background" ? "bgClass" : "wrapClass";
2972
- var cur = line[prop];
2973
- if (!cur) return false;
2974
- else if (cls == null) line[prop] = null;
2975
- else {
2976
- var found = cur.match(new RegExp("(?:^|\\s+)" + cls + "(?:$|\\s+)"));
2977
- if (!found) return false;
2978
- var end = found.index + found[0].length;
2979
- line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null;
2980
- }
2981
- return true;
2982
- });
2983
- }),
2984
-
2985
- addLineWidget: operation(null, function(handle, node, options) {
2986
- return addLineWidget(this, handle, node, options);
2987
- }),
2988
-
2989
- removeLineWidget: function(widget) { widget.clear(); },
2990
-
2991
- lineInfo: function(line) {
2992
- if (typeof line == "number") {
2993
- if (!isLine(this.doc, line)) return null;
2994
- var n = line;
2995
- line = getLine(this.doc, line);
2996
- if (!line) return null;
2997
- } else {
2998
- var n = lineNo(line);
2999
- if (n == null) return null;
3000
- }
3001
- return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers,
3002
- textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass,
3003
- widgets: line.widgets};
3004
- },
3005
-
3006
- getViewport: function() { return {from: this.display.showingFrom, to: this.display.showingTo};},
3007
-
3008
- addWidget: function(pos, node, scroll, vert, horiz) {
3009
- var display = this.display;
3010
- pos = cursorCoords(this, clipPos(this.doc, pos));
3011
- var top = pos.bottom, left = pos.left;
3012
- node.style.position = "absolute";
3013
- display.sizer.appendChild(node);
3014
- if (vert == "over") {
3015
- top = pos.top;
3016
- } else if (vert == "above" || vert == "near") {
3017
- var vspace = Math.max(display.wrapper.clientHeight, this.doc.height),
3018
- hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth);
3019
- // Default to positioning above (if specified and possible); otherwise default to positioning below
3020
- if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight)
3021
- top = pos.top - node.offsetHeight;
3022
- else if (pos.bottom + node.offsetHeight <= vspace)
3023
- top = pos.bottom;
3024
- if (left + node.offsetWidth > hspace)
3025
- left = hspace - node.offsetWidth;
3026
- }
3027
- node.style.top = top + "px";
3028
- node.style.left = node.style.right = "";
3029
- if (horiz == "right") {
3030
- left = display.sizer.clientWidth - node.offsetWidth;
3031
- node.style.right = "0px";
3032
- } else {
3033
- if (horiz == "left") left = 0;
3034
- else if (horiz == "middle") left = (display.sizer.clientWidth - node.offsetWidth) / 2;
3035
- node.style.left = left + "px";
3036
- }
3037
- if (scroll)
3038
- scrollIntoView(this, left, top, left + node.offsetWidth, top + node.offsetHeight);
3039
- },
3040
-
3041
- triggerOnKeyDown: operation(null, onKeyDown),
3042
-
3043
- execCommand: function(cmd) {return commands[cmd](this);},
3044
-
3045
- findPosH: function(from, amount, unit, visually) {
3046
- var dir = 1;
3047
- if (amount < 0) { dir = -1; amount = -amount; }
3048
- for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) {
3049
- cur = findPosH(this.doc, cur, dir, unit, visually);
3050
- if (cur.hitSide) break;
3051
- }
3052
- return cur;
3053
- },
3054
-
3055
- moveH: operation(null, function(dir, unit) {
3056
- var sel = this.doc.sel, pos;
3057
- if (sel.shift || sel.extend || posEq(sel.from, sel.to))
3058
- pos = findPosH(this.doc, sel.head, dir, unit, this.options.rtlMoveVisually);
3059
- else
3060
- pos = dir < 0 ? sel.from : sel.to;
3061
- extendSelection(this.doc, pos, pos, dir);
3062
- }),
3063
-
3064
- deleteH: operation(null, function(dir, unit) {
3065
- var sel = this.doc.sel;
3066
- if (!posEq(sel.from, sel.to)) replaceRange(this.doc, "", sel.from, sel.to, "+delete");
3067
- else replaceRange(this.doc, "", sel.from, findPosH(this.doc, sel.head, dir, unit, false), "+delete");
3068
- this.curOp.userSelChange = true;
3069
- }),
3070
-
3071
- findPosV: function(from, amount, unit, goalColumn) {
3072
- var dir = 1, x = goalColumn;
3073
- if (amount < 0) { dir = -1; amount = -amount; }
3074
- for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) {
3075
- var coords = cursorCoords(this, cur, "div");
3076
- if (x == null) x = coords.left;
3077
- else coords.left = x;
3078
- cur = findPosV(this, coords, dir, unit);
3079
- if (cur.hitSide) break;
3080
- }
3081
- return cur;
3082
- },
3083
-
3084
- moveV: operation(null, function(dir, unit) {
3085
- var sel = this.doc.sel;
3086
- var pos = cursorCoords(this, sel.head, "div");
3087
- if (sel.goalColumn != null) pos.left = sel.goalColumn;
3088
- var target = findPosV(this, pos, dir, unit);
3089
-
3090
- if (unit == "page") addToScrollPos(this, 0, charCoords(this, target, "div").top - pos.top);
3091
- extendSelection(this.doc, target, target, dir);
3092
- sel.goalColumn = pos.left;
3093
- }),
3094
-
3095
- toggleOverwrite: function(value) {
3096
- if (value != null && value == this.state.overwrite) return;
3097
- if (this.state.overwrite = !this.state.overwrite)
3098
- this.display.cursor.className += " CodeMirror-overwrite";
3099
- else
3100
- this.display.cursor.className = this.display.cursor.className.replace(" CodeMirror-overwrite", "");
3101
- },
3102
- hasFocus: function() { return this.state.focused; },
3103
-
3104
- scrollTo: operation(null, function(x, y) {
3105
- updateScrollPos(this, x, y);
3106
- }),
3107
- getScrollInfo: function() {
3108
- var scroller = this.display.scroller, co = scrollerCutOff;
3109
- return {left: scroller.scrollLeft, top: scroller.scrollTop,
3110
- height: scroller.scrollHeight - co, width: scroller.scrollWidth - co,
3111
- clientHeight: scroller.clientHeight - co, clientWidth: scroller.clientWidth - co};
3112
- },
3113
-
3114
- scrollIntoView: operation(null, function(pos, margin) {
3115
- if (typeof pos == "number") pos = Pos(pos, 0);
3116
- if (!margin) margin = 0;
3117
- var coords = pos;
3118
-
3119
- if (!pos || pos.line != null) {
3120
- this.curOp.scrollToPos = pos ? clipPos(this.doc, pos) : this.doc.sel.head;
3121
- this.curOp.scrollToPosMargin = margin;
3122
- coords = cursorCoords(this, this.curOp.scrollToPos);
3123
- }
3124
- var sPos = calculateScrollPos(this, coords.left, coords.top - margin, coords.right, coords.bottom + margin);
3125
- updateScrollPos(this, sPos.scrollLeft, sPos.scrollTop);
3126
- }),
3127
-
3128
- setSize: operation(null, function(width, height) {
3129
- function interpret(val) {
3130
- return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val;
3131
- }
3132
- if (width != null) this.display.wrapper.style.width = interpret(width);
3133
- if (height != null) this.display.wrapper.style.height = interpret(height);
3134
- if (this.options.lineWrapping)
3135
- this.display.measureLineCache.length = this.display.measureLineCachePos = 0;
3136
- this.curOp.forceUpdate = true;
3137
- }),
3138
-
3139
- operation: function(f){return runInOp(this, f);},
3140
-
3141
- refresh: operation(null, function() {
3142
- clearCaches(this);
3143
- updateScrollPos(this, this.doc.scrollLeft, this.doc.scrollTop);
3144
- regChange(this);
3145
- }),
3146
-
3147
- swapDoc: operation(null, function(doc) {
3148
- var old = this.doc;
3149
- old.cm = null;
3150
- attachDoc(this, doc);
3151
- clearCaches(this);
3152
- resetInput(this, true);
3153
- updateScrollPos(this, doc.scrollLeft, doc.scrollTop);
3154
- return old;
3155
- }),
3156
-
3157
- getInputField: function(){return this.display.input;},
3158
- getWrapperElement: function(){return this.display.wrapper;},
3159
- getScrollerElement: function(){return this.display.scroller;},
3160
- getGutterElement: function(){return this.display.gutters;}
3161
- };
3162
- eventMixin(CodeMirror);
3163
-
3164
- // OPTION DEFAULTS
3165
-
3166
- var optionHandlers = CodeMirror.optionHandlers = {};
3167
-
3168
- // The default configuration options.
3169
- var defaults = CodeMirror.defaults = {};
3170
-
3171
- function option(name, deflt, handle, notOnInit) {
3172
- CodeMirror.defaults[name] = deflt;
3173
- if (handle) optionHandlers[name] =
3174
- notOnInit ? function(cm, val, old) {if (old != Init) handle(cm, val, old);} : handle;
3175
- }
3176
-
3177
- var Init = CodeMirror.Init = {toString: function(){return "CodeMirror.Init";}};
3178
-
3179
- // These two are, on init, called from the constructor because they
3180
- // have to be initialized before the editor can start at all.
3181
- option("value", "", function(cm, val) {
3182
- cm.setValue(val);
3183
- }, true);
3184
- option("mode", null, function(cm, val) {
3185
- cm.doc.modeOption = val;
3186
- loadMode(cm);
3187
- }, true);
3188
-
3189
- option("indentUnit", 2, loadMode, true);
3190
- option("indentWithTabs", false);
3191
- option("smartIndent", true);
3192
- option("tabSize", 4, function(cm) {
3193
- loadMode(cm);
3194
- clearCaches(cm);
3195
- regChange(cm);
3196
- }, true);
3197
- option("electricChars", true);
3198
- option("rtlMoveVisually", !windows);
3199
-
3200
- option("theme", "default", function(cm) {
3201
- themeChanged(cm);
3202
- guttersChanged(cm);
3203
- }, true);
3204
- option("keyMap", "default", keyMapChanged);
3205
- option("extraKeys", null);
3206
-
3207
- option("onKeyEvent", null);
3208
- option("onDragEvent", null);
3209
-
3210
- option("lineWrapping", false, wrappingChanged, true);
3211
- option("gutters", [], function(cm) {
3212
- setGuttersForLineNumbers(cm.options);
3213
- guttersChanged(cm);
3214
- }, true);
3215
- option("fixedGutter", true, function(cm, val) {
3216
- cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0";
3217
- cm.refresh();
3218
- }, true);
3219
- option("coverGutterNextToScrollbar", false, updateScrollbars, true);
3220
- option("lineNumbers", false, function(cm) {
3221
- setGuttersForLineNumbers(cm.options);
3222
- guttersChanged(cm);
3223
- }, true);
3224
- option("firstLineNumber", 1, guttersChanged, true);
3225
- option("lineNumberFormatter", function(integer) {return integer;}, guttersChanged, true);
3226
- option("showCursorWhenSelecting", false, updateSelection, true);
3227
-
3228
- option("readOnly", false, function(cm, val) {
3229
- if (val == "nocursor") {onBlur(cm); cm.display.input.blur();}
3230
- else if (!val) resetInput(cm, true);
3231
- });
3232
- option("dragDrop", true);
3233
-
3234
- option("cursorBlinkRate", 530);
3235
- option("cursorScrollMargin", 0);
3236
- option("cursorHeight", 1);
3237
- option("workTime", 100);
3238
- option("workDelay", 100);
3239
- option("flattenSpans", true);
3240
- option("pollInterval", 100);
3241
- option("undoDepth", 40, function(cm, val){cm.doc.history.undoDepth = val;});
3242
- option("historyEventDelay", 500);
3243
- option("viewportMargin", 10, function(cm){cm.refresh();}, true);
3244
- option("maxHighlightLength", 10000, function(cm){loadMode(cm); cm.refresh();}, true);
3245
- option("moveInputWithCursor", true, function(cm, val) {
3246
- if (!val) cm.display.inputDiv.style.top = cm.display.inputDiv.style.left = 0;
3247
- });
3248
-
3249
- option("tabindex", null, function(cm, val) {
3250
- cm.display.input.tabIndex = val || "";
3251
- });
3252
- option("autofocus", null);
3253
-
3254
- // MODE DEFINITION AND QUERYING
3255
-
3256
- // Known modes, by name and by MIME
3257
- var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {};
3258
-
3259
- CodeMirror.defineMode = function(name, mode) {
3260
- if (!CodeMirror.defaults.mode && name != "null") CodeMirror.defaults.mode = name;
3261
- if (arguments.length > 2) {
3262
- mode.dependencies = [];
3263
- for (var i = 2; i < arguments.length; ++i) mode.dependencies.push(arguments[i]);
3264
- }
3265
- modes[name] = mode;
3266
- };
3267
-
3268
- CodeMirror.defineMIME = function(mime, spec) {
3269
- mimeModes[mime] = spec;
3270
- };
3271
-
3272
- CodeMirror.resolveMode = function(spec) {
3273
- if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) {
3274
- spec = mimeModes[spec];
3275
- } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) {
3276
- var found = mimeModes[spec.name];
3277
- spec = createObj(found, spec);
3278
- spec.name = found.name;
3279
- } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) {
3280
- return CodeMirror.resolveMode("application/xml");
3281
- }
3282
- if (typeof spec == "string") return {name: spec};
3283
- else return spec || {name: "null"};
3284
- };
3285
-
3286
- CodeMirror.getMode = function(options, spec) {
3287
- var spec = CodeMirror.resolveMode(spec);
3288
- var mfactory = modes[spec.name];
3289
- if (!mfactory) return CodeMirror.getMode(options, "text/plain");
3290
- var modeObj = mfactory(options, spec);
3291
- if (modeExtensions.hasOwnProperty(spec.name)) {
3292
- var exts = modeExtensions[spec.name];
3293
- for (var prop in exts) {
3294
- if (!exts.hasOwnProperty(prop)) continue;
3295
- if (modeObj.hasOwnProperty(prop)) modeObj["_" + prop] = modeObj[prop];
3296
- modeObj[prop] = exts[prop];
3297
- }
3298
- }
3299
- modeObj.name = spec.name;
3300
-
3301
- return modeObj;
3302
- };
3303
-
3304
- CodeMirror.defineMode("null", function() {
3305
- return {token: function(stream) {stream.skipToEnd();}};
3306
- });
3307
- CodeMirror.defineMIME("text/plain", "null");
3308
-
3309
- var modeExtensions = CodeMirror.modeExtensions = {};
3310
- CodeMirror.extendMode = function(mode, properties) {
3311
- var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});
3312
- copyObj(properties, exts);
3313
- };
3314
-
3315
- // EXTENSIONS
3316
-
3317
- CodeMirror.defineExtension = function(name, func) {
3318
- CodeMirror.prototype[name] = func;
3319
- };
3320
- CodeMirror.defineDocExtension = function(name, func) {
3321
- Doc.prototype[name] = func;
3322
- };
3323
- CodeMirror.defineOption = option;
3324
-
3325
- var initHooks = [];
3326
- CodeMirror.defineInitHook = function(f) {initHooks.push(f);};
3327
-
3328
- var helpers = CodeMirror.helpers = {};
3329
- CodeMirror.registerHelper = function(type, name, value) {
3330
- if (!helpers.hasOwnProperty(type)) helpers[type] = CodeMirror[type] = {};
3331
- helpers[type][name] = value;
3332
- };
3333
-
3334
- // UTILITIES
3335
-
3336
- CodeMirror.isWordChar = isWordChar;
3337
-
3338
- // MODE STATE HANDLING
3339
-
3340
- // Utility functions for working with state. Exported because modes
3341
- // sometimes need to do this.
3342
- function copyState(mode, state) {
3343
- if (state === true) return state;
3344
- if (mode.copyState) return mode.copyState(state);
3345
- var nstate = {};
3346
- for (var n in state) {
3347
- var val = state[n];
3348
- if (val instanceof Array) val = val.concat([]);
3349
- nstate[n] = val;
3350
- }
3351
- return nstate;
3352
- }
3353
- CodeMirror.copyState = copyState;
3354
-
3355
- function startState(mode, a1, a2) {
3356
- return mode.startState ? mode.startState(a1, a2) : true;
3357
- }
3358
- CodeMirror.startState = startState;
3359
-
3360
- CodeMirror.innerMode = function(mode, state) {
3361
- while (mode.innerMode) {
3362
- var info = mode.innerMode(state);
3363
- if (!info || info.mode == mode) break;
3364
- state = info.state;
3365
- mode = info.mode;
3366
- }
3367
- return info || {mode: mode, state: state};
3368
- };
3369
-
3370
- // STANDARD COMMANDS
3371
-
3372
- var commands = CodeMirror.commands = {
3373
- selectAll: function(cm) {cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()));},
3374
- killLine: function(cm) {
3375
- var from = cm.getCursor(true), to = cm.getCursor(false), sel = !posEq(from, to);
3376
- if (!sel && cm.getLine(from.line).length == from.ch)
3377
- cm.replaceRange("", from, Pos(from.line + 1, 0), "+delete");
3378
- else cm.replaceRange("", from, sel ? to : Pos(from.line), "+delete");
3379
- },
3380
- deleteLine: function(cm) {
3381
- var l = cm.getCursor().line;
3382
- cm.replaceRange("", Pos(l, 0), Pos(l), "+delete");
3383
- },
3384
- delLineLeft: function(cm) {
3385
- var cur = cm.getCursor();
3386
- cm.replaceRange("", Pos(cur.line, 0), cur, "+delete");
3387
- },
3388
- undo: function(cm) {cm.undo();},
3389
- redo: function(cm) {cm.redo();},
3390
- goDocStart: function(cm) {cm.extendSelection(Pos(cm.firstLine(), 0));},
3391
- goDocEnd: function(cm) {cm.extendSelection(Pos(cm.lastLine()));},
3392
- goLineStart: function(cm) {
3393
- cm.extendSelection(lineStart(cm, cm.getCursor().line));
3394
- },
3395
- goLineStartSmart: function(cm) {
3396
- var cur = cm.getCursor(), start = lineStart(cm, cur.line);
3397
- var line = cm.getLineHandle(start.line);
3398
- var order = getOrder(line);
3399
- if (!order || order[0].level == 0) {
3400
- var firstNonWS = Math.max(0, line.text.search(/\S/));
3401
- var inWS = cur.line == start.line && cur.ch <= firstNonWS && cur.ch;
3402
- cm.extendSelection(Pos(start.line, inWS ? 0 : firstNonWS));
3403
- } else cm.extendSelection(start);
3404
- },
3405
- goLineEnd: function(cm) {
3406
- cm.extendSelection(lineEnd(cm, cm.getCursor().line));
3407
- },
3408
- goLineRight: function(cm) {
3409
- var top = cm.charCoords(cm.getCursor(), "div").top + 5;
3410
- cm.extendSelection(cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div"));
3411
- },
3412
- goLineLeft: function(cm) {
3413
- var top = cm.charCoords(cm.getCursor(), "div").top + 5;
3414
- cm.extendSelection(cm.coordsChar({left: 0, top: top}, "div"));
3415
- },
3416
- goLineUp: function(cm) {cm.moveV(-1, "line");},
3417
- goLineDown: function(cm) {cm.moveV(1, "line");},
3418
- goPageUp: function(cm) {cm.moveV(-1, "page");},
3419
- goPageDown: function(cm) {cm.moveV(1, "page");},
3420
- goCharLeft: function(cm) {cm.moveH(-1, "char");},
3421
- goCharRight: function(cm) {cm.moveH(1, "char");},
3422
- goColumnLeft: function(cm) {cm.moveH(-1, "column");},
3423
- goColumnRight: function(cm) {cm.moveH(1, "column");},
3424
- goWordLeft: function(cm) {cm.moveH(-1, "word");},
3425
- goGroupRight: function(cm) {cm.moveH(1, "group");},
3426
- goGroupLeft: function(cm) {cm.moveH(-1, "group");},
3427
- goWordRight: function(cm) {cm.moveH(1, "word");},
3428
- delCharBefore: function(cm) {cm.deleteH(-1, "char");},
3429
- delCharAfter: function(cm) {cm.deleteH(1, "char");},
3430
- delWordBefore: function(cm) {cm.deleteH(-1, "word");},
3431
- delWordAfter: function(cm) {cm.deleteH(1, "word");},
3432
- delGroupBefore: function(cm) {cm.deleteH(-1, "group");},
3433
- delGroupAfter: function(cm) {cm.deleteH(1, "group");},
3434
- indentAuto: function(cm) {cm.indentSelection("smart");},
3435
- indentMore: function(cm) {cm.indentSelection("add");},
3436
- indentLess: function(cm) {cm.indentSelection("subtract");},
3437
- insertTab: function(cm) {cm.replaceSelection("\t", "end", "+input");},
3438
- defaultTab: function(cm) {
3439
- if (cm.somethingSelected()) cm.indentSelection("add");
3440
- else cm.replaceSelection("\t", "end", "+input");
3441
- },
3442
- transposeChars: function(cm) {
3443
- var cur = cm.getCursor(), line = cm.getLine(cur.line);
3444
- if (cur.ch > 0 && cur.ch < line.length - 1)
3445
- cm.replaceRange(line.charAt(cur.ch) + line.charAt(cur.ch - 1),
3446
- Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1));
3447
- },
3448
- newlineAndIndent: function(cm) {
3449
- operation(cm, function() {
3450
- cm.replaceSelection("\n", "end", "+input");
3451
- cm.indentLine(cm.getCursor().line, null, true);
3452
- })();
3453
- },
3454
- toggleOverwrite: function(cm) {cm.toggleOverwrite();}
3455
- };
3456
-
3457
- // STANDARD KEYMAPS
3458
-
3459
- var keyMap = CodeMirror.keyMap = {};
3460
- keyMap.basic = {
3461
- "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown",
3462
- "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown",
3463
- "Delete": "delCharAfter", "Backspace": "delCharBefore", "Tab": "defaultTab", "Shift-Tab": "indentAuto",
3464
- "Enter": "newlineAndIndent", "Insert": "toggleOverwrite"
3465
- };
3466
- // Note that the save and find-related commands aren't defined by
3467
- // default. Unknown commands are simply ignored.
3468
- keyMap.pcDefault = {
3469
- "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo",
3470
- "Ctrl-Home": "goDocStart", "Alt-Up": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Down": "goDocEnd",
3471
- "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd",
3472
- "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find",
3473
- "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll",
3474
- "Ctrl-[": "indentLess", "Ctrl-]": "indentMore",
3475
- fallthrough: "basic"
3476
- };
3477
- keyMap.macDefault = {
3478
- "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo",
3479
- "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goGroupLeft",
3480
- "Alt-Right": "goGroupRight", "Cmd-Left": "goLineStart", "Cmd-Right": "goLineEnd", "Alt-Backspace": "delGroupBefore",
3481
- "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find",
3482
- "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll",
3483
- "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delLineLeft",
3484
- fallthrough: ["basic", "emacsy"]
3485
- };
3486
- keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault;
3487
- keyMap.emacsy = {
3488
- "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown",
3489
- "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd",
3490
- "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore",
3491
- "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars"
3492
- };
3493
-
3494
- // KEYMAP DISPATCH
3495
-
3496
- function getKeyMap(val) {
3497
- if (typeof val == "string") return keyMap[val];
3498
- else return val;
3499
- }
3500
-
3501
- function lookupKey(name, maps, handle) {
3502
- function lookup(map) {
3503
- map = getKeyMap(map);
3504
- var found = map[name];
3505
- if (found === false) return "stop";
3506
- if (found != null && handle(found)) return true;
3507
- if (map.nofallthrough) return "stop";
3508
-
3509
- var fallthrough = map.fallthrough;
3510
- if (fallthrough == null) return false;
3511
- if (Object.prototype.toString.call(fallthrough) != "[object Array]")
3512
- return lookup(fallthrough);
3513
- for (var i = 0, e = fallthrough.length; i < e; ++i) {
3514
- var done = lookup(fallthrough[i]);
3515
- if (done) return done;
3516
- }
3517
- return false;
3518
- }
3519
-
3520
- for (var i = 0; i < maps.length; ++i) {
3521
- var done = lookup(maps[i]);
3522
- if (done) return done != "stop";
3523
- }
3524
- }
3525
- function isModifierKey(event) {
3526
- var name = keyNames[event.keyCode];
3527
- return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod";
3528
- }
3529
- function keyName(event, noShift) {
3530
- if (opera && event.keyCode == 34 && event["char"]) return false;
3531
- var name = keyNames[event.keyCode];
3532
- if (name == null || event.altGraphKey) return false;
3533
- if (event.altKey) name = "Alt-" + name;
3534
- if (flipCtrlCmd ? event.metaKey : event.ctrlKey) name = "Ctrl-" + name;
3535
- if (flipCtrlCmd ? event.ctrlKey : event.metaKey) name = "Cmd-" + name;
3536
- if (!noShift && event.shiftKey) name = "Shift-" + name;
3537
- return name;
3538
- }
3539
- CodeMirror.lookupKey = lookupKey;
3540
- CodeMirror.isModifierKey = isModifierKey;
3541
- CodeMirror.keyName = keyName;
3542
-
3543
- // FROMTEXTAREA
3544
-
3545
- CodeMirror.fromTextArea = function(textarea, options) {
3546
- if (!options) options = {};
3547
- options.value = textarea.value;
3548
- if (!options.tabindex && textarea.tabindex)
3549
- options.tabindex = textarea.tabindex;
3550
- if (!options.placeholder && textarea.placeholder)
3551
- options.placeholder = textarea.placeholder;
3552
- // Set autofocus to true if this textarea is focused, or if it has
3553
- // autofocus and no other element is focused.
3554
- if (options.autofocus == null) {
3555
- var hasFocus = document.body;
3556
- // doc.activeElement occasionally throws on IE
3557
- try { hasFocus = document.activeElement; } catch(e) {}
3558
- options.autofocus = hasFocus == textarea ||
3559
- textarea.getAttribute("autofocus") != null && hasFocus == document.body;
3560
- }
3561
-
3562
- function save() {textarea.value = cm.getValue();}
3563
- if (textarea.form) {
3564
- on(textarea.form, "submit", save);
3565
- // Deplorable hack to make the submit method do the right thing.
3566
- if (!options.leaveSubmitMethodAlone) {
3567
- var form = textarea.form, realSubmit = form.submit;
3568
- try {
3569
- var wrappedSubmit = form.submit = function() {
3570
- save();
3571
- form.submit = realSubmit;
3572
- form.submit();
3573
- form.submit = wrappedSubmit;
3574
- };
3575
- } catch(e) {}
3576
- }
3577
- }
3578
-
3579
- textarea.style.display = "none";
3580
- var cm = CodeMirror(function(node) {
3581
- textarea.parentNode.insertBefore(node, textarea.nextSibling);
3582
- }, options);
3583
- cm.save = save;
3584
- cm.getTextArea = function() { return textarea; };
3585
- cm.toTextArea = function() {
3586
- save();
3587
- textarea.parentNode.removeChild(cm.getWrapperElement());
3588
- textarea.style.display = "";
3589
- if (textarea.form) {
3590
- off(textarea.form, "submit", save);
3591
- if (typeof textarea.form.submit == "function")
3592
- textarea.form.submit = realSubmit;
3593
- }
3594
- };
3595
- return cm;
3596
- };
3597
-
3598
- // STRING STREAM
3599
-
3600
- // Fed to the mode parsers, provides helper functions to make
3601
- // parsers more succinct.
3602
-
3603
- // The character stream used by a mode's parser.
3604
- function StringStream(string, tabSize) {
3605
- this.pos = this.start = 0;
3606
- this.string = string;
3607
- this.tabSize = tabSize || 8;
3608
- this.lastColumnPos = this.lastColumnValue = 0;
3609
- }
3610
-
3611
- StringStream.prototype = {
3612
- eol: function() {return this.pos >= this.string.length;},
3613
- sol: function() {return this.pos == 0;},
3614
- peek: function() {return this.string.charAt(this.pos) || undefined;},
3615
- next: function() {
3616
- if (this.pos < this.string.length)
3617
- return this.string.charAt(this.pos++);
3618
- },
3619
- eat: function(match) {
3620
- var ch = this.string.charAt(this.pos);
3621
- if (typeof match == "string") var ok = ch == match;
3622
- else var ok = ch && (match.test ? match.test(ch) : match(ch));
3623
- if (ok) {++this.pos; return ch;}
3624
- },
3625
- eatWhile: function(match) {
3626
- var start = this.pos;
3627
- while (this.eat(match)){}
3628
- return this.pos > start;
3629
- },
3630
- eatSpace: function() {
3631
- var start = this.pos;
3632
- while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos;
3633
- return this.pos > start;
3634
- },
3635
- skipToEnd: function() {this.pos = this.string.length;},
3636
- skipTo: function(ch) {
3637
- var found = this.string.indexOf(ch, this.pos);
3638
- if (found > -1) {this.pos = found; return true;}
3639
- },
3640
- backUp: function(n) {this.pos -= n;},
3641
- column: function() {
3642
- if (this.lastColumnPos < this.start) {
3643
- this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);
3644
- this.lastColumnPos = this.start;
3645
- }
3646
- return this.lastColumnValue;
3647
- },
3648
- indentation: function() {return countColumn(this.string, null, this.tabSize);},
3649
- match: function(pattern, consume, caseInsensitive) {
3650
- if (typeof pattern == "string") {
3651
- var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;};
3652
- var substr = this.string.substr(this.pos, pattern.length);
3653
- if (cased(substr) == cased(pattern)) {
3654
- if (consume !== false) this.pos += pattern.length;
3655
- return true;
3656
- }
3657
- } else {
3658
- var match = this.string.slice(this.pos).match(pattern);
3659
- if (match && match.index > 0) return null;
3660
- if (match && consume !== false) this.pos += match[0].length;
3661
- return match;
3662
- }
3663
- },
3664
- current: function(){return this.string.slice(this.start, this.pos);}
3665
- };
3666
- CodeMirror.StringStream = StringStream;
3667
-
3668
- // TEXTMARKERS
3669
-
3670
- function TextMarker(doc, type) {
3671
- this.lines = [];
3672
- this.type = type;
3673
- this.doc = doc;
3674
- }
3675
- CodeMirror.TextMarker = TextMarker;
3676
- eventMixin(TextMarker);
3677
-
3678
- TextMarker.prototype.clear = function() {
3679
- if (this.explicitlyCleared) return;
3680
- var cm = this.doc.cm, withOp = cm && !cm.curOp;
3681
- if (withOp) startOperation(cm);
3682
- if (hasHandler(this, "clear")) {
3683
- var found = this.find();
3684
- if (found) signalLater(this, "clear", found.from, found.to);
3685
- }
3686
- var min = null, max = null;
3687
- for (var i = 0; i < this.lines.length; ++i) {
3688
- var line = this.lines[i];
3689
- var span = getMarkedSpanFor(line.markedSpans, this);
3690
- if (span.to != null) max = lineNo(line);
3691
- line.markedSpans = removeMarkedSpan(line.markedSpans, span);
3692
- if (span.from != null)
3693
- min = lineNo(line);
3694
- else if (this.collapsed && !lineIsHidden(this.doc, line) && cm)
3695
- updateLineHeight(line, textHeight(cm.display));
3696
- }
3697
- if (cm && this.collapsed && !cm.options.lineWrapping) for (var i = 0; i < this.lines.length; ++i) {
3698
- var visual = visualLine(cm.doc, this.lines[i]), len = lineLength(cm.doc, visual);
3699
- if (len > cm.display.maxLineLength) {
3700
- cm.display.maxLine = visual;
3701
- cm.display.maxLineLength = len;
3702
- cm.display.maxLineChanged = true;
3703
- }
3704
- }
3705
-
3706
- if (min != null && cm) regChange(cm, min, max + 1);
3707
- this.lines.length = 0;
3708
- this.explicitlyCleared = true;
3709
- if (this.atomic && this.doc.cantEdit) {
3710
- this.doc.cantEdit = false;
3711
- if (cm) reCheckSelection(cm);
3712
- }
3713
- if (withOp) endOperation(cm);
3714
- };
3715
-
3716
- TextMarker.prototype.find = function() {
3717
- var from, to;
3718
- for (var i = 0; i < this.lines.length; ++i) {
3719
- var line = this.lines[i];
3720
- var span = getMarkedSpanFor(line.markedSpans, this);
3721
- if (span.from != null || span.to != null) {
3722
- var found = lineNo(line);
3723
- if (span.from != null) from = Pos(found, span.from);
3724
- if (span.to != null) to = Pos(found, span.to);
3725
- }
3726
- }
3727
- if (this.type == "bookmark") return from;
3728
- return from && {from: from, to: to};
3729
- };
3730
-
3731
- TextMarker.prototype.changed = function() {
3732
- var pos = this.find(), cm = this.doc.cm;
3733
- if (!pos || !cm) return;
3734
- var line = getLine(this.doc, pos.from.line);
3735
- clearCachedMeasurement(cm, line);
3736
- if (pos.from.line >= cm.display.showingFrom && pos.from.line < cm.display.showingTo) {
3737
- for (var node = cm.display.lineDiv.firstChild; node; node = node.nextSibling) if (node.lineObj == line) {
3738
- if (node.offsetHeight != line.height) updateLineHeight(line, node.offsetHeight);
3739
- break;
3740
- }
3741
- runInOp(cm, function() {
3742
- cm.curOp.selectionChanged = cm.curOp.forceUpdate = cm.curOp.updateMaxLine = true;
3743
- });
3744
- }
3745
- };
3746
-
3747
- TextMarker.prototype.attachLine = function(line) {
3748
- if (!this.lines.length && this.doc.cm) {
3749
- var op = this.doc.cm.curOp;
3750
- if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1)
3751
- (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this);
3752
- }
3753
- this.lines.push(line);
3754
- };
3755
- TextMarker.prototype.detachLine = function(line) {
3756
- this.lines.splice(indexOf(this.lines, line), 1);
3757
- if (!this.lines.length && this.doc.cm) {
3758
- var op = this.doc.cm.curOp;
3759
- (op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this);
3760
- }
3761
- };
3762
-
3763
- function markText(doc, from, to, options, type) {
3764
- if (options && options.shared) return markTextShared(doc, from, to, options, type);
3765
- if (doc.cm && !doc.cm.curOp) return operation(doc.cm, markText)(doc, from, to, options, type);
3766
-
3767
- var marker = new TextMarker(doc, type);
3768
- if (type == "range" && !posLess(from, to)) return marker;
3769
- if (options) copyObj(options, marker);
3770
- if (marker.replacedWith) {
3771
- marker.collapsed = true;
3772
- marker.replacedWith = elt("span", [marker.replacedWith], "CodeMirror-widget");
3773
- if (!options.handleMouseEvents) marker.replacedWith.ignoreEvents = true;
3774
- }
3775
- if (marker.collapsed) sawCollapsedSpans = true;
3776
-
3777
- if (marker.addToHistory)
3778
- addToHistory(doc, {from: from, to: to, origin: "markText"},
3779
- {head: doc.sel.head, anchor: doc.sel.anchor}, NaN);
3780
-
3781
- var curLine = from.line, size = 0, collapsedAtStart, collapsedAtEnd, cm = doc.cm, updateMaxLine;
3782
- doc.iter(curLine, to.line + 1, function(line) {
3783
- if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(doc, line) == cm.display.maxLine)
3784
- updateMaxLine = true;
3785
- var span = {from: null, to: null, marker: marker};
3786
- size += line.text.length;
3787
- if (curLine == from.line) {span.from = from.ch; size -= from.ch;}
3788
- if (curLine == to.line) {span.to = to.ch; size -= line.text.length - to.ch;}
3789
- if (marker.collapsed) {
3790
- if (curLine == to.line) collapsedAtEnd = collapsedSpanAt(line, to.ch);
3791
- if (curLine == from.line) collapsedAtStart = collapsedSpanAt(line, from.ch);
3792
- else updateLineHeight(line, 0);
3793
- }
3794
- addMarkedSpan(line, span);
3795
- ++curLine;
3796
- });
3797
- if (marker.collapsed) doc.iter(from.line, to.line + 1, function(line) {
3798
- if (lineIsHidden(doc, line)) updateLineHeight(line, 0);
3799
- });
3800
-
3801
- if (marker.clearOnEnter) on(marker, "beforeCursorEnter", function() { marker.clear(); });
3802
-
3803
- if (marker.readOnly) {
3804
- sawReadOnlySpans = true;
3805
- if (doc.history.done.length || doc.history.undone.length)
3806
- doc.clearHistory();
3807
- }
3808
- if (marker.collapsed) {
3809
- if (collapsedAtStart != collapsedAtEnd)
3810
- throw new Error("Inserting collapsed marker overlapping an existing one");
3811
- marker.size = size;
3812
- marker.atomic = true;
3813
- }
3814
- if (cm) {
3815
- if (updateMaxLine) cm.curOp.updateMaxLine = true;
3816
- if (marker.className || marker.title || marker.startStyle || marker.endStyle || marker.collapsed)
3817
- regChange(cm, from.line, to.line + 1);
3818
- if (marker.atomic) reCheckSelection(cm);
3819
- }
3820
- return marker;
3821
- }
3822
-
3823
- // SHARED TEXTMARKERS
3824
-
3825
- function SharedTextMarker(markers, primary) {
3826
- this.markers = markers;
3827
- this.primary = primary;
3828
- for (var i = 0, me = this; i < markers.length; ++i) {
3829
- markers[i].parent = this;
3830
- on(markers[i], "clear", function(){me.clear();});
3831
- }
3832
- }
3833
- CodeMirror.SharedTextMarker = SharedTextMarker;
3834
- eventMixin(SharedTextMarker);
3835
-
3836
- SharedTextMarker.prototype.clear = function() {
3837
- if (this.explicitlyCleared) return;
3838
- this.explicitlyCleared = true;
3839
- for (var i = 0; i < this.markers.length; ++i)
3840
- this.markers[i].clear();
3841
- signalLater(this, "clear");
3842
- };
3843
- SharedTextMarker.prototype.find = function() {
3844
- return this.primary.find();
3845
- };
3846
-
3847
- function markTextShared(doc, from, to, options, type) {
3848
- options = copyObj(options);
3849
- options.shared = false;
3850
- var markers = [markText(doc, from, to, options, type)], primary = markers[0];
3851
- var widget = options.replacedWith;
3852
- linkedDocs(doc, function(doc) {
3853
- if (widget) options.replacedWith = widget.cloneNode(true);
3854
- markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type));
3855
- for (var i = 0; i < doc.linked.length; ++i)
3856
- if (doc.linked[i].isParent) return;
3857
- primary = lst(markers);
3858
- });
3859
- return new SharedTextMarker(markers, primary);
3860
- }
3861
-
3862
- // TEXTMARKER SPANS
3863
-
3864
- function getMarkedSpanFor(spans, marker) {
3865
- if (spans) for (var i = 0; i < spans.length; ++i) {
3866
- var span = spans[i];
3867
- if (span.marker == marker) return span;
3868
- }
3869
- }
3870
- function removeMarkedSpan(spans, span) {
3871
- for (var r, i = 0; i < spans.length; ++i)
3872
- if (spans[i] != span) (r || (r = [])).push(spans[i]);
3873
- return r;
3874
- }
3875
- function addMarkedSpan(line, span) {
3876
- line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];
3877
- span.marker.attachLine(line);
3878
- }
3879
-
3880
- function markedSpansBefore(old, startCh, isInsert) {
3881
- if (old) for (var i = 0, nw; i < old.length; ++i) {
3882
- var span = old[i], marker = span.marker;
3883
- var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);
3884
- if (startsBefore || marker.type == "bookmark" && span.from == startCh && (!isInsert || !span.marker.insertLeft)) {
3885
- var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh);
3886
- (nw || (nw = [])).push({from: span.from,
3887
- to: endsAfter ? null : span.to,
3888
- marker: marker});
3889
- }
3890
- }
3891
- return nw;
3892
- }
3893
-
3894
- function markedSpansAfter(old, endCh, isInsert) {
3895
- if (old) for (var i = 0, nw; i < old.length; ++i) {
3896
- var span = old[i], marker = span.marker;
3897
- var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);
3898
- if (endsAfter || marker.type == "bookmark" && span.from == endCh && (!isInsert || span.marker.insertLeft)) {
3899
- var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh);
3900
- (nw || (nw = [])).push({from: startsBefore ? null : span.from - endCh,
3901
- to: span.to == null ? null : span.to - endCh,
3902
- marker: marker});
3903
- }
3904
- }
3905
- return nw;
3906
- }
3907
-
3908
- function stretchSpansOverChange(doc, change) {
3909
- var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans;
3910
- var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans;
3911
- if (!oldFirst && !oldLast) return null;
3912
-
3913
- var startCh = change.from.ch, endCh = change.to.ch, isInsert = posEq(change.from, change.to);
3914
- // Get the spans that 'stick out' on both sides
3915
- var first = markedSpansBefore(oldFirst, startCh, isInsert);
3916
- var last = markedSpansAfter(oldLast, endCh, isInsert);
3917
-
3918
- // Next, merge those two ends
3919
- var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0);
3920
- if (first) {
3921
- // Fix up .to properties of first
3922
- for (var i = 0; i < first.length; ++i) {
3923
- var span = first[i];
3924
- if (span.to == null) {
3925
- var found = getMarkedSpanFor(last, span.marker);
3926
- if (!found) span.to = startCh;
3927
- else if (sameLine) span.to = found.to == null ? null : found.to + offset;
3928
- }
3929
- }
3930
- }
3931
- if (last) {
3932
- // Fix up .from in last (or move them into first in case of sameLine)
3933
- for (var i = 0; i < last.length; ++i) {
3934
- var span = last[i];
3935
- if (span.to != null) span.to += offset;
3936
- if (span.from == null) {
3937
- var found = getMarkedSpanFor(first, span.marker);
3938
- if (!found) {
3939
- span.from = offset;
3940
- if (sameLine) (first || (first = [])).push(span);
3941
- }
3942
- } else {
3943
- span.from += offset;
3944
- if (sameLine) (first || (first = [])).push(span);
3945
- }
3946
- }
3947
- }
3948
- if (sameLine && first) {
3949
- // Make sure we didn't create any zero-length spans
3950
- for (var i = 0; i < first.length; ++i)
3951
- if (first[i].from != null && first[i].from == first[i].to && first[i].marker.type != "bookmark")
3952
- first.splice(i--, 1);
3953
- if (!first.length) first = null;
3954
- }
3955
-
3956
- var newMarkers = [first];
3957
- if (!sameLine) {
3958
- // Fill gap with whole-line-spans
3959
- var gap = change.text.length - 2, gapMarkers;
3960
- if (gap > 0 && first)
3961
- for (var i = 0; i < first.length; ++i)
3962
- if (first[i].to == null)
3963
- (gapMarkers || (gapMarkers = [])).push({from: null, to: null, marker: first[i].marker});
3964
- for (var i = 0; i < gap; ++i)
3965
- newMarkers.push(gapMarkers);
3966
- newMarkers.push(last);
3967
- }
3968
- return newMarkers;
3969
- }
3970
-
3971
- function mergeOldSpans(doc, change) {
3972
- var old = getOldSpans(doc, change);
3973
- var stretched = stretchSpansOverChange(doc, change);
3974
- if (!old) return stretched;
3975
- if (!stretched) return old;
3976
-
3977
- for (var i = 0; i < old.length; ++i) {
3978
- var oldCur = old[i], stretchCur = stretched[i];
3979
- if (oldCur && stretchCur) {
3980
- spans: for (var j = 0; j < stretchCur.length; ++j) {
3981
- var span = stretchCur[j];
3982
- for (var k = 0; k < oldCur.length; ++k)
3983
- if (oldCur[k].marker == span.marker) continue spans;
3984
- oldCur.push(span);
3985
- }
3986
- } else if (stretchCur) {
3987
- old[i] = stretchCur;
3988
- }
3989
- }
3990
- return old;
3991
- }
3992
-
3993
- function removeReadOnlyRanges(doc, from, to) {
3994
- var markers = null;
3995
- doc.iter(from.line, to.line + 1, function(line) {
3996
- if (line.markedSpans) for (var i = 0; i < line.markedSpans.length; ++i) {
3997
- var mark = line.markedSpans[i].marker;
3998
- if (mark.readOnly && (!markers || indexOf(markers, mark) == -1))
3999
- (markers || (markers = [])).push(mark);
4000
- }
4001
- });
4002
- if (!markers) return null;
4003
- var parts = [{from: from, to: to}];
4004
- for (var i = 0; i < markers.length; ++i) {
4005
- var mk = markers[i], m = mk.find();
4006
- for (var j = 0; j < parts.length; ++j) {
4007
- var p = parts[j];
4008
- if (posLess(p.to, m.from) || posLess(m.to, p.from)) continue;
4009
- var newParts = [j, 1];
4010
- if (posLess(p.from, m.from) || !mk.inclusiveLeft && posEq(p.from, m.from))
4011
- newParts.push({from: p.from, to: m.from});
4012
- if (posLess(m.to, p.to) || !mk.inclusiveRight && posEq(p.to, m.to))
4013
- newParts.push({from: m.to, to: p.to});
4014
- parts.splice.apply(parts, newParts);
4015
- j += newParts.length - 1;
4016
- }
4017
- }
4018
- return parts;
4019
- }
4020
-
4021
- function collapsedSpanAt(line, ch) {
4022
- var sps = sawCollapsedSpans && line.markedSpans, found;
4023
- if (sps) for (var sp, i = 0; i < sps.length; ++i) {
4024
- sp = sps[i];
4025
- if (!sp.marker.collapsed) continue;
4026
- if ((sp.from == null || sp.from < ch) &&
4027
- (sp.to == null || sp.to > ch) &&
4028
- (!found || found.width < sp.marker.width))
4029
- found = sp.marker;
4030
- }
4031
- return found;
4032
- }
4033
- function collapsedSpanAtStart(line) { return collapsedSpanAt(line, -1); }
4034
- function collapsedSpanAtEnd(line) { return collapsedSpanAt(line, line.text.length + 1); }
4035
-
4036
- function visualLine(doc, line) {
4037
- var merged;
4038
- while (merged = collapsedSpanAtStart(line))
4039
- line = getLine(doc, merged.find().from.line);
4040
- return line;
4041
- }
4042
-
4043
- function lineIsHidden(doc, line) {
4044
- var sps = sawCollapsedSpans && line.markedSpans;
4045
- if (sps) for (var sp, i = 0; i < sps.length; ++i) {
4046
- sp = sps[i];
4047
- if (!sp.marker.collapsed) continue;
4048
- if (sp.from == null) return true;
4049
- if (sp.marker.replacedWith) continue;
4050
- if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))
4051
- return true;
4052
- }
4053
- }
4054
- function lineIsHiddenInner(doc, line, span) {
4055
- if (span.to == null) {
4056
- var end = span.marker.find().to, endLine = getLine(doc, end.line);
4057
- return lineIsHiddenInner(doc, endLine, getMarkedSpanFor(endLine.markedSpans, span.marker));
4058
- }
4059
- if (span.marker.inclusiveRight && span.to == line.text.length)
4060
- return true;
4061
- for (var sp, i = 0; i < line.markedSpans.length; ++i) {
4062
- sp = line.markedSpans[i];
4063
- if (sp.marker.collapsed && !sp.marker.replacedWith && sp.from == span.to &&
4064
- (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&
4065
- lineIsHiddenInner(doc, line, sp)) return true;
4066
- }
4067
- }
4068
-
4069
- function detachMarkedSpans(line) {
4070
- var spans = line.markedSpans;
4071
- if (!spans) return;
4072
- for (var i = 0; i < spans.length; ++i)
4073
- spans[i].marker.detachLine(line);
4074
- line.markedSpans = null;
4075
- }
4076
-
4077
- function attachMarkedSpans(line, spans) {
4078
- if (!spans) return;
4079
- for (var i = 0; i < spans.length; ++i)
4080
- spans[i].marker.attachLine(line);
4081
- line.markedSpans = spans;
4082
- }
4083
-
4084
- // LINE WIDGETS
4085
-
4086
- var LineWidget = CodeMirror.LineWidget = function(cm, node, options) {
4087
- if (options) for (var opt in options) if (options.hasOwnProperty(opt))
4088
- this[opt] = options[opt];
4089
- this.cm = cm;
4090
- this.node = node;
4091
- };
4092
- eventMixin(LineWidget);
4093
- function widgetOperation(f) {
4094
- return function() {
4095
- var withOp = !this.cm.curOp;
4096
- if (withOp) startOperation(this.cm);
4097
- try {var result = f.apply(this, arguments);}
4098
- finally {if (withOp) endOperation(this.cm);}
4099
- return result;
4100
- };
4101
- }
4102
- LineWidget.prototype.clear = widgetOperation(function() {
4103
- var ws = this.line.widgets, no = lineNo(this.line);
4104
- if (no == null || !ws) return;
4105
- for (var i = 0; i < ws.length; ++i) if (ws[i] == this) ws.splice(i--, 1);
4106
- if (!ws.length) this.line.widgets = null;
4107
- var aboveVisible = heightAtLine(this.cm, this.line) < this.cm.doc.scrollTop;
4108
- updateLineHeight(this.line, Math.max(0, this.line.height - widgetHeight(this)));
4109
- if (aboveVisible) addToScrollPos(this.cm, 0, -this.height);
4110
- regChange(this.cm, no, no + 1);
4111
- });
4112
- LineWidget.prototype.changed = widgetOperation(function() {
4113
- var oldH = this.height;
4114
- this.height = null;
4115
- var diff = widgetHeight(this) - oldH;
4116
- if (!diff) return;
4117
- updateLineHeight(this.line, this.line.height + diff);
4118
- var no = lineNo(this.line);
4119
- regChange(this.cm, no, no + 1);
4120
- });
4121
-
4122
- function widgetHeight(widget) {
4123
- if (widget.height != null) return widget.height;
4124
- if (!widget.node.parentNode || widget.node.parentNode.nodeType != 1)
4125
- removeChildrenAndAdd(widget.cm.display.measure, elt("div", [widget.node], null, "position: relative"));
4126
- return widget.height = widget.node.offsetHeight;
4127
- }
4128
-
4129
- function addLineWidget(cm, handle, node, options) {
4130
- var widget = new LineWidget(cm, node, options);
4131
- if (widget.noHScroll) cm.display.alignWidgets = true;
4132
- changeLine(cm, handle, function(line) {
4133
- var widgets = line.widgets || (line.widgets = []);
4134
- if (widget.insertAt == null) widgets.push(widget);
4135
- else widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget);
4136
- widget.line = line;
4137
- if (!lineIsHidden(cm.doc, line) || widget.showIfHidden) {
4138
- var aboveVisible = heightAtLine(cm, line) < cm.doc.scrollTop;
4139
- updateLineHeight(line, line.height + widgetHeight(widget));
4140
- if (aboveVisible) addToScrollPos(cm, 0, widget.height);
4141
- }
4142
- return true;
4143
- });
4144
- return widget;
4145
- }
4146
-
4147
- // LINE DATA STRUCTURE
4148
-
4149
- // Line objects. These hold state related to a line, including
4150
- // highlighting info (the styles array).
4151
- var Line = CodeMirror.Line = function(text, markedSpans, estimateHeight) {
4152
- this.text = text;
4153
- attachMarkedSpans(this, markedSpans);
4154
- this.height = estimateHeight ? estimateHeight(this) : 1;
4155
- };
4156
- eventMixin(Line);
4157
-
4158
- function updateLine(line, text, markedSpans, estimateHeight) {
4159
- line.text = text;
4160
- if (line.stateAfter) line.stateAfter = null;
4161
- if (line.styles) line.styles = null;
4162
- if (line.order != null) line.order = null;
4163
- detachMarkedSpans(line);
4164
- attachMarkedSpans(line, markedSpans);
4165
- var estHeight = estimateHeight ? estimateHeight(line) : 1;
4166
- if (estHeight != line.height) updateLineHeight(line, estHeight);
4167
- }
4168
-
4169
- function cleanUpLine(line) {
4170
- line.parent = null;
4171
- detachMarkedSpans(line);
4172
- }
4173
-
4174
- // Run the given mode's parser over a line, update the styles
4175
- // array, which contains alternating fragments of text and CSS
4176
- // classes.
4177
- function runMode(cm, text, mode, state, f) {
4178
- var flattenSpans = mode.flattenSpans;
4179
- if (flattenSpans == null) flattenSpans = cm.options.flattenSpans;
4180
- var curStart = 0, curStyle = null;
4181
- var stream = new StringStream(text, cm.options.tabSize), style;
4182
- if (text == "" && mode.blankLine) mode.blankLine(state);
4183
- while (!stream.eol()) {
4184
- if (stream.pos > cm.options.maxHighlightLength) {
4185
- flattenSpans = false;
4186
- // Webkit seems to refuse to render text nodes longer than 57444 characters
4187
- stream.pos = Math.min(text.length, stream.start + 50000);
4188
- style = null;
4189
- } else {
4190
- style = mode.token(stream, state);
4191
- }
4192
- if (!flattenSpans || curStyle != style) {
4193
- if (curStart < stream.start) f(stream.start, curStyle);
4194
- curStart = stream.start; curStyle = style;
4195
- }
4196
- stream.start = stream.pos;
4197
- }
4198
- if (curStart < stream.pos) f(stream.pos, curStyle);
4199
- }
4200
-
4201
- function highlightLine(cm, line, state) {
4202
- // A styles array always starts with a number identifying the
4203
- // mode/overlays that it is based on (for easy invalidation).
4204
- var st = [cm.state.modeGen];
4205
- // Compute the base array of styles
4206
- runMode(cm, line.text, cm.doc.mode, state, function(end, style) {st.push(end, style);});
4207
-
4208
- // Run overlays, adjust style array.
4209
- for (var o = 0; o < cm.state.overlays.length; ++o) {
4210
- var overlay = cm.state.overlays[o], i = 1, at = 0;
4211
- runMode(cm, line.text, overlay.mode, true, function(end, style) {
4212
- var start = i;
4213
- // Ensure there's a token end at the current position, and that i points at it
4214
- while (at < end) {
4215
- var i_end = st[i];
4216
- if (i_end > end)
4217
- st.splice(i, 1, end, st[i+1], i_end);
4218
- i += 2;
4219
- at = Math.min(end, i_end);
4220
- }
4221
- if (!style) return;
4222
- if (overlay.opaque) {
4223
- st.splice(start, i - start, end, style);
4224
- i = start + 2;
4225
- } else {
4226
- for (; start < i; start += 2) {
4227
- var cur = st[start+1];
4228
- st[start+1] = cur ? cur + " " + style : style;
4229
- }
4230
- }
4231
- });
4232
- }
4233
-
4234
- return st;
4235
- }
4236
-
4237
- function getLineStyles(cm, line) {
4238
- if (!line.styles || line.styles[0] != cm.state.modeGen)
4239
- line.styles = highlightLine(cm, line, line.stateAfter = getStateBefore(cm, lineNo(line)));
4240
- return line.styles;
4241
- }
4242
-
4243
- // Lightweight form of highlight -- proceed over this line and
4244
- // update state, but don't save a style array.
4245
- function processLine(cm, line, state) {
4246
- var mode = cm.doc.mode;
4247
- var stream = new StringStream(line.text, cm.options.tabSize);
4248
- if (line.text == "" && mode.blankLine) mode.blankLine(state);
4249
- while (!stream.eol() && stream.pos <= cm.options.maxHighlightLength) {
4250
- mode.token(stream, state);
4251
- stream.start = stream.pos;
4252
- }
4253
- }
4254
-
4255
- var styleToClassCache = {};
4256
- function styleToClass(style) {
4257
- if (!style) return null;
4258
- return styleToClassCache[style] ||
4259
- (styleToClassCache[style] = "cm-" + style.replace(/ +/g, " cm-"));
4260
- }
4261
-
4262
- function lineContent(cm, realLine, measure, copyWidgets) {
4263
- var merged, line = realLine, empty = true;
4264
- while (merged = collapsedSpanAtStart(line))
4265
- line = getLine(cm.doc, merged.find().from.line);
4266
-
4267
- var builder = {pre: elt("pre"), col: 0, pos: 0,
4268
- measure: null, measuredSomething: false, cm: cm,
4269
- copyWidgets: copyWidgets};
4270
- if (line.textClass) builder.pre.className = line.textClass;
4271
-
4272
- do {
4273
- if (line.text) empty = false;
4274
- builder.measure = line == realLine && measure;
4275
- builder.pos = 0;
4276
- builder.addToken = builder.measure ? buildTokenMeasure : buildToken;
4277
- if ((ie || webkit) && cm.getOption("lineWrapping"))
4278
- builder.addToken = buildTokenSplitSpaces(builder.addToken);
4279
- var next = insertLineContent(line, builder, getLineStyles(cm, line));
4280
- if (measure && line == realLine && !builder.measuredSomething) {
4281
- measure[0] = builder.pre.appendChild(zeroWidthElement(cm.display.measure));
4282
- builder.measuredSomething = true;
4283
- }
4284
- if (next) line = getLine(cm.doc, next.to.line);
4285
- } while (next);
4286
-
4287
- if (measure && !builder.measuredSomething && !measure[0])
4288
- measure[0] = builder.pre.appendChild(empty ? elt("span", "\u00a0") : zeroWidthElement(cm.display.measure));
4289
- if (!builder.pre.firstChild && !lineIsHidden(cm.doc, realLine))
4290
- builder.pre.appendChild(document.createTextNode("\u00a0"));
4291
-
4292
- var order;
4293
- // Work around problem with the reported dimensions of single-char
4294
- // direction spans on IE (issue #1129). See also the comment in
4295
- // cursorCoords.
4296
- if (measure && ie && (order = getOrder(line))) {
4297
- var l = order.length - 1;
4298
- if (order[l].from == order[l].to) --l;
4299
- var last = order[l], prev = order[l - 1];
4300
- if (last.from + 1 == last.to && prev && last.level < prev.level) {
4301
- var span = measure[builder.pos - 1];
4302
- if (span) span.parentNode.insertBefore(span.measureRight = zeroWidthElement(cm.display.measure),
4303
- span.nextSibling);
4304
- }
4305
- }
4306
-
4307
- signal(cm, "renderLine", cm, realLine, builder.pre);
4308
- return builder.pre;
4309
- }
4310
-
4311
- var tokenSpecialChars = /[\t\u0000-\u0019\u00ad\u200b\u2028\u2029\uFEFF]/g;
4312
- function buildToken(builder, text, style, startStyle, endStyle, title) {
4313
- if (!text) return;
4314
- if (!tokenSpecialChars.test(text)) {
4315
- builder.col += text.length;
4316
- var content = document.createTextNode(text);
4317
- } else {
4318
- var content = document.createDocumentFragment(), pos = 0;
4319
- while (true) {
4320
- tokenSpecialChars.lastIndex = pos;
4321
- var m = tokenSpecialChars.exec(text);
4322
- var skipped = m ? m.index - pos : text.length - pos;
4323
- if (skipped) {
4324
- content.appendChild(document.createTextNode(text.slice(pos, pos + skipped)));
4325
- builder.col += skipped;
4326
- }
4327
- if (!m) break;
4328
- pos += skipped + 1;
4329
- if (m[0] == "\t") {
4330
- var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;
4331
- content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab"));
4332
- builder.col += tabWidth;
4333
- } else {
4334
- var token = elt("span", "\u2022", "cm-invalidchar");
4335
- token.title = "\\u" + m[0].charCodeAt(0).toString(16);
4336
- content.appendChild(token);
4337
- builder.col += 1;
4338
- }
4339
- }
4340
- }
4341
- if (style || startStyle || endStyle || builder.measure) {
4342
- var fullStyle = style || "";
4343
- if (startStyle) fullStyle += startStyle;
4344
- if (endStyle) fullStyle += endStyle;
4345
- var token = elt("span", [content], fullStyle);
4346
- if (title) token.title = title;
4347
- return builder.pre.appendChild(token);
4348
- }
4349
- builder.pre.appendChild(content);
4350
- }
4351
-
4352
- function buildTokenMeasure(builder, text, style, startStyle, endStyle) {
4353
- var wrapping = builder.cm.options.lineWrapping;
4354
- for (var i = 0; i < text.length; ++i) {
4355
- var ch = text.charAt(i), start = i == 0;
4356
- if (ch >= "\ud800" && ch < "\udbff" && i < text.length - 1) {
4357
- ch = text.slice(i, i + 2);
4358
- ++i;
4359
- } else if (i && wrapping && spanAffectsWrapping(text, i)) {
4360
- builder.pre.appendChild(elt("wbr"));
4361
- }
4362
- var old = builder.measure[builder.pos];
4363
- var span = builder.measure[builder.pos] =
4364
- buildToken(builder, ch, style,
4365
- start && startStyle, i == text.length - 1 && endStyle);
4366
- if (old) span.leftSide = old.leftSide || old;
4367
- // In IE single-space nodes wrap differently than spaces
4368
- // embedded in larger text nodes, except when set to
4369
- // white-space: normal (issue #1268).
4370
- if (ie && wrapping && ch == " " && i && !/\s/.test(text.charAt(i - 1)) &&
4371
- i < text.length - 1 && !/\s/.test(text.charAt(i + 1)))
4372
- span.style.whiteSpace = "normal";
4373
- builder.pos += ch.length;
4374
- }
4375
- if (text.length) builder.measuredSomething = true;
4376
- }
4377
-
4378
- function buildTokenSplitSpaces(inner) {
4379
- function split(old) {
4380
- var out = " ";
4381
- for (var i = 0; i < old.length - 2; ++i) out += i % 2 ? " " : "\u00a0";
4382
- out += " ";
4383
- return out;
4384
- }
4385
- return function(builder, text, style, startStyle, endStyle, title) {
4386
- return inner(builder, text.replace(/ {3,}/, split), style, startStyle, endStyle, title);
4387
- };
4388
- }
4389
-
4390
- function buildCollapsedSpan(builder, size, marker, ignoreWidget) {
4391
- var widget = !ignoreWidget && marker.replacedWith;
4392
- if (widget) {
4393
- if (builder.copyWidgets) widget = widget.cloneNode(true);
4394
- builder.pre.appendChild(widget);
4395
- if (builder.measure) {
4396
- if (size) {
4397
- builder.measure[builder.pos] = widget;
4398
- } else {
4399
- var elt = builder.measure[builder.pos] = zeroWidthElement(builder.cm.display.measure);
4400
- if (marker.type != "bookmark" || marker.insertLeft)
4401
- builder.pre.insertBefore(elt, widget);
4402
- else
4403
- builder.pre.appendChild(elt);
4404
- }
4405
- builder.measuredSomething = true;
4406
- }
4407
- }
4408
- builder.pos += size;
4409
- }
4410
-
4411
- // Outputs a number of spans to make up a line, taking highlighting
4412
- // and marked text into account.
4413
- function insertLineContent(line, builder, styles) {
4414
- var spans = line.markedSpans, allText = line.text, at = 0;
4415
- if (!spans) {
4416
- for (var i = 1; i < styles.length; i+=2)
4417
- builder.addToken(builder, allText.slice(at, at = styles[i]), styleToClass(styles[i+1]));
4418
- return;
4419
- }
4420
-
4421
- var len = allText.length, pos = 0, i = 1, text = "", style;
4422
- var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, title, collapsed;
4423
- for (;;) {
4424
- if (nextChange == pos) { // Update current marker set
4425
- spanStyle = spanEndStyle = spanStartStyle = title = "";
4426
- collapsed = null; nextChange = Infinity;
4427
- var foundBookmark = null;
4428
- for (var j = 0; j < spans.length; ++j) {
4429
- var sp = spans[j], m = sp.marker;
4430
- if (sp.from <= pos && (sp.to == null || sp.to > pos)) {
4431
- if (sp.to != null && nextChange > sp.to) { nextChange = sp.to; spanEndStyle = ""; }
4432
- if (m.className) spanStyle += " " + m.className;
4433
- if (m.startStyle && sp.from == pos) spanStartStyle += " " + m.startStyle;
4434
- if (m.endStyle && sp.to == nextChange) spanEndStyle += " " + m.endStyle;
4435
- if (m.title && !title) title = m.title;
4436
- if (m.collapsed && (!collapsed || collapsed.marker.size < m.size))
4437
- collapsed = sp;
4438
- } else if (sp.from > pos && nextChange > sp.from) {
4439
- nextChange = sp.from;
4440
- }
4441
- if (m.type == "bookmark" && sp.from == pos && m.replacedWith) foundBookmark = m;
4442
- }
4443
- if (collapsed && (collapsed.from || 0) == pos) {
4444
- buildCollapsedSpan(builder, (collapsed.to == null ? len : collapsed.to) - pos,
4445
- collapsed.marker, collapsed.from == null);
4446
- if (collapsed.to == null) return collapsed.marker.find();
4447
- }
4448
- if (foundBookmark && !collapsed) buildCollapsedSpan(builder, 0, foundBookmark);
4449
- }
4450
- if (pos >= len) break;
4451
-
4452
- var upto = Math.min(len, nextChange);
4453
- while (true) {
4454
- if (text) {
4455
- var end = pos + text.length;
4456
- if (!collapsed) {
4457
- var tokenText = end > upto ? text.slice(0, upto - pos) : text;
4458
- builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,
4459
- spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", title);
4460
- }
4461
- if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;}
4462
- pos = end;
4463
- spanStartStyle = "";
4464
- }
4465
- text = allText.slice(at, at = styles[i++]);
4466
- style = styleToClass(styles[i++]);
4467
- }
4468
- }
4469
- }
4470
-
4471
- // DOCUMENT DATA STRUCTURE
4472
-
4473
- function updateDoc(doc, change, markedSpans, selAfter, estimateHeight) {
4474
- function spansFor(n) {return markedSpans ? markedSpans[n] : null;}
4475
- function update(line, text, spans) {
4476
- updateLine(line, text, spans, estimateHeight);
4477
- signalLater(line, "change", line, change);
4478
- }
4479
-
4480
- var from = change.from, to = change.to, text = change.text;
4481
- var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line);
4482
- var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line;
4483
-
4484
- // First adjust the line structure
4485
- if (from.ch == 0 && to.ch == 0 && lastText == "") {
4486
- // This is a whole-line replace. Treated specially to make
4487
- // sure line objects move the way they are supposed to.
4488
- for (var i = 0, e = text.length - 1, added = []; i < e; ++i)
4489
- added.push(new Line(text[i], spansFor(i), estimateHeight));
4490
- update(lastLine, lastLine.text, lastSpans);
4491
- if (nlines) doc.remove(from.line, nlines);
4492
- if (added.length) doc.insert(from.line, added);
4493
- } else if (firstLine == lastLine) {
4494
- if (text.length == 1) {
4495
- update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans);
4496
- } else {
4497
- for (var added = [], i = 1, e = text.length - 1; i < e; ++i)
4498
- added.push(new Line(text[i], spansFor(i), estimateHeight));
4499
- added.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight));
4500
- update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));
4501
- doc.insert(from.line + 1, added);
4502
- }
4503
- } else if (text.length == 1) {
4504
- update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0));
4505
- doc.remove(from.line + 1, nlines);
4506
- } else {
4507
- update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));
4508
- update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans);
4509
- for (var i = 1, e = text.length - 1, added = []; i < e; ++i)
4510
- added.push(new Line(text[i], spansFor(i), estimateHeight));
4511
- if (nlines > 1) doc.remove(from.line + 1, nlines - 1);
4512
- doc.insert(from.line + 1, added);
4513
- }
4514
-
4515
- signalLater(doc, "change", doc, change);
4516
- setSelection(doc, selAfter.anchor, selAfter.head, null, true);
4517
- }
4518
-
4519
- function LeafChunk(lines) {
4520
- this.lines = lines;
4521
- this.parent = null;
4522
- for (var i = 0, e = lines.length, height = 0; i < e; ++i) {
4523
- lines[i].parent = this;
4524
- height += lines[i].height;
4525
- }
4526
- this.height = height;
4527
- }
4528
-
4529
- LeafChunk.prototype = {
4530
- chunkSize: function() { return this.lines.length; },
4531
- removeInner: function(at, n) {
4532
- for (var i = at, e = at + n; i < e; ++i) {
4533
- var line = this.lines[i];
4534
- this.height -= line.height;
4535
- cleanUpLine(line);
4536
- signalLater(line, "delete");
4537
- }
4538
- this.lines.splice(at, n);
4539
- },
4540
- collapse: function(lines) {
4541
- lines.splice.apply(lines, [lines.length, 0].concat(this.lines));
4542
- },
4543
- insertInner: function(at, lines, height) {
4544
- this.height += height;
4545
- this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at));
4546
- for (var i = 0, e = lines.length; i < e; ++i) lines[i].parent = this;
4547
- },
4548
- iterN: function(at, n, op) {
4549
- for (var e = at + n; at < e; ++at)
4550
- if (op(this.lines[at])) return true;
4551
- }
4552
- };
4553
-
4554
- function BranchChunk(children) {
4555
- this.children = children;
4556
- var size = 0, height = 0;
4557
- for (var i = 0, e = children.length; i < e; ++i) {
4558
- var ch = children[i];
4559
- size += ch.chunkSize(); height += ch.height;
4560
- ch.parent = this;
4561
- }
4562
- this.size = size;
4563
- this.height = height;
4564
- this.parent = null;
4565
- }
4566
-
4567
- BranchChunk.prototype = {
4568
- chunkSize: function() { return this.size; },
4569
- removeInner: function(at, n) {
4570
- this.size -= n;
4571
- for (var i = 0; i < this.children.length; ++i) {
4572
- var child = this.children[i], sz = child.chunkSize();
4573
- if (at < sz) {
4574
- var rm = Math.min(n, sz - at), oldHeight = child.height;
4575
- child.removeInner(at, rm);
4576
- this.height -= oldHeight - child.height;
4577
- if (sz == rm) { this.children.splice(i--, 1); child.parent = null; }
4578
- if ((n -= rm) == 0) break;
4579
- at = 0;
4580
- } else at -= sz;
4581
- }
4582
- if (this.size - n < 25) {
4583
- var lines = [];
4584
- this.collapse(lines);
4585
- this.children = [new LeafChunk(lines)];
4586
- this.children[0].parent = this;
4587
- }
4588
- },
4589
- collapse: function(lines) {
4590
- for (var i = 0, e = this.children.length; i < e; ++i) this.children[i].collapse(lines);
4591
- },
4592
- insertInner: function(at, lines, height) {
4593
- this.size += lines.length;
4594
- this.height += height;
4595
- for (var i = 0, e = this.children.length; i < e; ++i) {
4596
- var child = this.children[i], sz = child.chunkSize();
4597
- if (at <= sz) {
4598
- child.insertInner(at, lines, height);
4599
- if (child.lines && child.lines.length > 50) {
4600
- while (child.lines.length > 50) {
4601
- var spilled = child.lines.splice(child.lines.length - 25, 25);
4602
- var newleaf = new LeafChunk(spilled);
4603
- child.height -= newleaf.height;
4604
- this.children.splice(i + 1, 0, newleaf);
4605
- newleaf.parent = this;
4606
- }
4607
- this.maybeSpill();
4608
- }
4609
- break;
4610
- }
4611
- at -= sz;
4612
- }
4613
- },
4614
- maybeSpill: function() {
4615
- if (this.children.length <= 10) return;
4616
- var me = this;
4617
- do {
4618
- var spilled = me.children.splice(me.children.length - 5, 5);
4619
- var sibling = new BranchChunk(spilled);
4620
- if (!me.parent) { // Become the parent node
4621
- var copy = new BranchChunk(me.children);
4622
- copy.parent = me;
4623
- me.children = [copy, sibling];
4624
- me = copy;
4625
- } else {
4626
- me.size -= sibling.size;
4627
- me.height -= sibling.height;
4628
- var myIndex = indexOf(me.parent.children, me);
4629
- me.parent.children.splice(myIndex + 1, 0, sibling);
4630
- }
4631
- sibling.parent = me.parent;
4632
- } while (me.children.length > 10);
4633
- me.parent.maybeSpill();
4634
- },
4635
- iterN: function(at, n, op) {
4636
- for (var i = 0, e = this.children.length; i < e; ++i) {
4637
- var child = this.children[i], sz = child.chunkSize();
4638
- if (at < sz) {
4639
- var used = Math.min(n, sz - at);
4640
- if (child.iterN(at, used, op)) return true;
4641
- if ((n -= used) == 0) break;
4642
- at = 0;
4643
- } else at -= sz;
4644
- }
4645
- }
4646
- };
4647
-
4648
- var nextDocId = 0;
4649
- var Doc = CodeMirror.Doc = function(text, mode, firstLine) {
4650
- if (!(this instanceof Doc)) return new Doc(text, mode, firstLine);
4651
- if (firstLine == null) firstLine = 0;
4652
-
4653
- BranchChunk.call(this, [new LeafChunk([new Line("", null)])]);
4654
- this.first = firstLine;
4655
- this.scrollTop = this.scrollLeft = 0;
4656
- this.cantEdit = false;
4657
- this.history = makeHistory();
4658
- this.cleanGeneration = 1;
4659
- this.frontier = firstLine;
4660
- var start = Pos(firstLine, 0);
4661
- this.sel = {from: start, to: start, head: start, anchor: start, shift: false, extend: false, goalColumn: null};
4662
- this.id = ++nextDocId;
4663
- this.modeOption = mode;
4664
-
4665
- if (typeof text == "string") text = splitLines(text);
4666
- updateDoc(this, {from: start, to: start, text: text}, null, {head: start, anchor: start});
4667
- };
4668
-
4669
- Doc.prototype = createObj(BranchChunk.prototype, {
4670
- constructor: Doc,
4671
- iter: function(from, to, op) {
4672
- if (op) this.iterN(from - this.first, to - from, op);
4673
- else this.iterN(this.first, this.first + this.size, from);
4674
- },
4675
-
4676
- insert: function(at, lines) {
4677
- var height = 0;
4678
- for (var i = 0, e = lines.length; i < e; ++i) height += lines[i].height;
4679
- this.insertInner(at - this.first, lines, height);
4680
- },
4681
- remove: function(at, n) { this.removeInner(at - this.first, n); },
4682
-
4683
- getValue: function(lineSep) {
4684
- var lines = getLines(this, this.first, this.first + this.size);
4685
- if (lineSep === false) return lines;
4686
- return lines.join(lineSep || "\n");
4687
- },
4688
- setValue: function(code) {
4689
- var top = Pos(this.first, 0), last = this.first + this.size - 1;
4690
- makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length),
4691
- text: splitLines(code), origin: "setValue"},
4692
- {head: top, anchor: top}, true);
4693
- },
4694
- replaceRange: function(code, from, to, origin) {
4695
- from = clipPos(this, from);
4696
- to = to ? clipPos(this, to) : from;
4697
- replaceRange(this, code, from, to, origin);
4698
- },
4699
- getRange: function(from, to, lineSep) {
4700
- var lines = getBetween(this, clipPos(this, from), clipPos(this, to));
4701
- if (lineSep === false) return lines;
4702
- return lines.join(lineSep || "\n");
4703
- },
4704
-
4705
- getLine: function(line) {var l = this.getLineHandle(line); return l && l.text;},
4706
- setLine: function(line, text) {
4707
- if (isLine(this, line))
4708
- replaceRange(this, text, Pos(line, 0), clipPos(this, Pos(line)));
4709
- },
4710
- removeLine: function(line) {
4711
- if (line) replaceRange(this, "", clipPos(this, Pos(line - 1)), clipPos(this, Pos(line)));
4712
- else replaceRange(this, "", Pos(0, 0), clipPos(this, Pos(1, 0)));
4713
- },
4714
-
4715
- getLineHandle: function(line) {if (isLine(this, line)) return getLine(this, line);},
4716
- getLineNumber: function(line) {return lineNo(line);},
4717
-
4718
- getLineHandleVisualStart: function(line) {
4719
- if (typeof line == "number") line = getLine(this, line);
4720
- return visualLine(this, line);
4721
- },
4722
-
4723
- lineCount: function() {return this.size;},
4724
- firstLine: function() {return this.first;},
4725
- lastLine: function() {return this.first + this.size - 1;},
4726
-
4727
- clipPos: function(pos) {return clipPos(this, pos);},
4728
-
4729
- getCursor: function(start) {
4730
- var sel = this.sel, pos;
4731
- if (start == null || start == "head") pos = sel.head;
4732
- else if (start == "anchor") pos = sel.anchor;
4733
- else if (start == "end" || start === false) pos = sel.to;
4734
- else pos = sel.from;
4735
- return copyPos(pos);
4736
- },
4737
- somethingSelected: function() {return !posEq(this.sel.head, this.sel.anchor);},
4738
-
4739
- setCursor: docOperation(function(line, ch, extend) {
4740
- var pos = clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line);
4741
- if (extend) extendSelection(this, pos);
4742
- else setSelection(this, pos, pos);
4743
- }),
4744
- setSelection: docOperation(function(anchor, head) {
4745
- setSelection(this, clipPos(this, anchor), clipPos(this, head || anchor));
4746
- }),
4747
- extendSelection: docOperation(function(from, to) {
4748
- extendSelection(this, clipPos(this, from), to && clipPos(this, to));
4749
- }),
4750
-
4751
- getSelection: function(lineSep) {return this.getRange(this.sel.from, this.sel.to, lineSep);},
4752
- replaceSelection: function(code, collapse, origin) {
4753
- makeChange(this, {from: this.sel.from, to: this.sel.to, text: splitLines(code), origin: origin}, collapse || "around");
4754
- },
4755
- undo: docOperation(function() {makeChangeFromHistory(this, "undo");}),
4756
- redo: docOperation(function() {makeChangeFromHistory(this, "redo");}),
4757
-
4758
- setExtending: function(val) {this.sel.extend = val;},
4759
-
4760
- historySize: function() {
4761
- var hist = this.history;
4762
- return {undo: hist.done.length, redo: hist.undone.length};
4763
- },
4764
- clearHistory: function() {this.history = makeHistory(this.history.maxGeneration);},
4765
-
4766
- markClean: function() {
4767
- this.cleanGeneration = this.changeGeneration();
4768
- },
4769
- changeGeneration: function() {
4770
- this.history.lastOp = this.history.lastOrigin = null;
4771
- return this.history.generation;
4772
- },
4773
- isClean: function (gen) {
4774
- return this.history.generation == (gen || this.cleanGeneration);
4775
- },
4776
-
4777
- getHistory: function() {
4778
- return {done: copyHistoryArray(this.history.done),
4779
- undone: copyHistoryArray(this.history.undone)};
4780
- },
4781
- setHistory: function(histData) {
4782
- var hist = this.history = makeHistory(this.history.maxGeneration);
4783
- hist.done = histData.done.slice(0);
4784
- hist.undone = histData.undone.slice(0);
4785
- },
4786
-
4787
- markText: function(from, to, options) {
4788
- return markText(this, clipPos(this, from), clipPos(this, to), options, "range");
4789
- },
4790
- setBookmark: function(pos, options) {
4791
- var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),
4792
- insertLeft: options && options.insertLeft};
4793
- pos = clipPos(this, pos);
4794
- return markText(this, pos, pos, realOpts, "bookmark");
4795
- },
4796
- findMarksAt: function(pos) {
4797
- pos = clipPos(this, pos);
4798
- var markers = [], spans = getLine(this, pos.line).markedSpans;
4799
- if (spans) for (var i = 0; i < spans.length; ++i) {
4800
- var span = spans[i];
4801
- if ((span.from == null || span.from <= pos.ch) &&
4802
- (span.to == null || span.to >= pos.ch))
4803
- markers.push(span.marker.parent || span.marker);
4804
- }
4805
- return markers;
4806
- },
4807
- getAllMarks: function() {
4808
- var markers = [];
4809
- this.iter(function(line) {
4810
- var sps = line.markedSpans;
4811
- if (sps) for (var i = 0; i < sps.length; ++i)
4812
- if (sps[i].from != null) markers.push(sps[i].marker);
4813
- });
4814
- return markers;
4815
- },
4816
-
4817
- posFromIndex: function(off) {
4818
- var ch, lineNo = this.first;
4819
- this.iter(function(line) {
4820
- var sz = line.text.length + 1;
4821
- if (sz > off) { ch = off; return true; }
4822
- off -= sz;
4823
- ++lineNo;
4824
- });
4825
- return clipPos(this, Pos(lineNo, ch));
4826
- },
4827
- indexFromPos: function (coords) {
4828
- coords = clipPos(this, coords);
4829
- var index = coords.ch;
4830
- if (coords.line < this.first || coords.ch < 0) return 0;
4831
- this.iter(this.first, coords.line, function (line) {
4832
- index += line.text.length + 1;
4833
- });
4834
- return index;
4835
- },
4836
-
4837
- copy: function(copyHistory) {
4838
- var doc = new Doc(getLines(this, this.first, this.first + this.size), this.modeOption, this.first);
4839
- doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft;
4840
- doc.sel = {from: this.sel.from, to: this.sel.to, head: this.sel.head, anchor: this.sel.anchor,
4841
- shift: this.sel.shift, extend: false, goalColumn: this.sel.goalColumn};
4842
- if (copyHistory) {
4843
- doc.history.undoDepth = this.history.undoDepth;
4844
- doc.setHistory(this.getHistory());
4845
- }
4846
- return doc;
4847
- },
4848
-
4849
- linkedDoc: function(options) {
4850
- if (!options) options = {};
4851
- var from = this.first, to = this.first + this.size;
4852
- if (options.from != null && options.from > from) from = options.from;
4853
- if (options.to != null && options.to < to) to = options.to;
4854
- var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from);
4855
- if (options.sharedHist) copy.history = this.history;
4856
- (this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist});
4857
- copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}];
4858
- return copy;
4859
- },
4860
- unlinkDoc: function(other) {
4861
- if (other instanceof CodeMirror) other = other.doc;
4862
- if (this.linked) for (var i = 0; i < this.linked.length; ++i) {
4863
- var link = this.linked[i];
4864
- if (link.doc != other) continue;
4865
- this.linked.splice(i, 1);
4866
- other.unlinkDoc(this);
4867
- break;
4868
- }
4869
- // If the histories were shared, split them again
4870
- if (other.history == this.history) {
4871
- var splitIds = [other.id];
4872
- linkedDocs(other, function(doc) {splitIds.push(doc.id);}, true);
4873
- other.history = makeHistory();
4874
- other.history.done = copyHistoryArray(this.history.done, splitIds);
4875
- other.history.undone = copyHistoryArray(this.history.undone, splitIds);
4876
- }
4877
- },
4878
- iterLinkedDocs: function(f) {linkedDocs(this, f);},
4879
-
4880
- getMode: function() {return this.mode;},
4881
- getEditor: function() {return this.cm;}
4882
- });
4883
-
4884
- Doc.prototype.eachLine = Doc.prototype.iter;
4885
-
4886
- // The Doc methods that should be available on CodeMirror instances
4887
- var dontDelegate = "iter insert remove copy getEditor".split(" ");
4888
- for (var prop in Doc.prototype) if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0)
4889
- CodeMirror.prototype[prop] = (function(method) {
4890
- return function() {return method.apply(this.doc, arguments);};
4891
- })(Doc.prototype[prop]);
4892
-
4893
- eventMixin(Doc);
4894
-
4895
- function linkedDocs(doc, f, sharedHistOnly) {
4896
- function propagate(doc, skip, sharedHist) {
4897
- if (doc.linked) for (var i = 0; i < doc.linked.length; ++i) {
4898
- var rel = doc.linked[i];
4899
- if (rel.doc == skip) continue;
4900
- var shared = sharedHist && rel.sharedHist;
4901
- if (sharedHistOnly && !shared) continue;
4902
- f(rel.doc, shared);
4903
- propagate(rel.doc, doc, shared);
4904
- }
4905
- }
4906
- propagate(doc, null, true);
4907
- }
4908
-
4909
- function attachDoc(cm, doc) {
4910
- if (doc.cm) throw new Error("This document is already in use.");
4911
- cm.doc = doc;
4912
- doc.cm = cm;
4913
- estimateLineHeights(cm);
4914
- loadMode(cm);
4915
- if (!cm.options.lineWrapping) computeMaxLength(cm);
4916
- cm.options.mode = doc.modeOption;
4917
- regChange(cm);
4918
- }
4919
-
4920
- // LINE UTILITIES
4921
-
4922
- function getLine(chunk, n) {
4923
- n -= chunk.first;
4924
- while (!chunk.lines) {
4925
- for (var i = 0;; ++i) {
4926
- var child = chunk.children[i], sz = child.chunkSize();
4927
- if (n < sz) { chunk = child; break; }
4928
- n -= sz;
4929
- }
4930
- }
4931
- return chunk.lines[n];
4932
- }
4933
-
4934
- function getBetween(doc, start, end) {
4935
- var out = [], n = start.line;
4936
- doc.iter(start.line, end.line + 1, function(line) {
4937
- var text = line.text;
4938
- if (n == end.line) text = text.slice(0, end.ch);
4939
- if (n == start.line) text = text.slice(start.ch);
4940
- out.push(text);
4941
- ++n;
4942
- });
4943
- return out;
4944
- }
4945
- function getLines(doc, from, to) {
4946
- var out = [];
4947
- doc.iter(from, to, function(line) { out.push(line.text); });
4948
- return out;
4949
- }
4950
-
4951
- function updateLineHeight(line, height) {
4952
- var diff = height - line.height;
4953
- for (var n = line; n; n = n.parent) n.height += diff;
4954
- }
4955
-
4956
- function lineNo(line) {
4957
- if (line.parent == null) return null;
4958
- var cur = line.parent, no = indexOf(cur.lines, line);
4959
- for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {
4960
- for (var i = 0;; ++i) {
4961
- if (chunk.children[i] == cur) break;
4962
- no += chunk.children[i].chunkSize();
4963
- }
4964
- }
4965
- return no + cur.first;
4966
- }
4967
-
4968
- function lineAtHeight(chunk, h) {
4969
- var n = chunk.first;
4970
- outer: do {
4971
- for (var i = 0, e = chunk.children.length; i < e; ++i) {
4972
- var child = chunk.children[i], ch = child.height;
4973
- if (h < ch) { chunk = child; continue outer; }
4974
- h -= ch;
4975
- n += child.chunkSize();
4976
- }
4977
- return n;
4978
- } while (!chunk.lines);
4979
- for (var i = 0, e = chunk.lines.length; i < e; ++i) {
4980
- var line = chunk.lines[i], lh = line.height;
4981
- if (h < lh) break;
4982
- h -= lh;
4983
- }
4984
- return n + i;
4985
- }
4986
-
4987
- function heightAtLine(cm, lineObj) {
4988
- lineObj = visualLine(cm.doc, lineObj);
4989
-
4990
- var h = 0, chunk = lineObj.parent;
4991
- for (var i = 0; i < chunk.lines.length; ++i) {
4992
- var line = chunk.lines[i];
4993
- if (line == lineObj) break;
4994
- else h += line.height;
4995
- }
4996
- for (var p = chunk.parent; p; chunk = p, p = chunk.parent) {
4997
- for (var i = 0; i < p.children.length; ++i) {
4998
- var cur = p.children[i];
4999
- if (cur == chunk) break;
5000
- else h += cur.height;
5001
- }
5002
- }
5003
- return h;
5004
- }
5005
-
5006
- function getOrder(line) {
5007
- var order = line.order;
5008
- if (order == null) order = line.order = bidiOrdering(line.text);
5009
- return order;
5010
- }
5011
-
5012
- // HISTORY
5013
-
5014
- function makeHistory(startGen) {
5015
- return {
5016
- // Arrays of history events. Doing something adds an event to
5017
- // done and clears undo. Undoing moves events from done to
5018
- // undone, redoing moves them in the other direction.
5019
- done: [], undone: [], undoDepth: Infinity,
5020
- // Used to track when changes can be merged into a single undo
5021
- // event
5022
- lastTime: 0, lastOp: null, lastOrigin: null,
5023
- // Used by the isClean() method
5024
- generation: startGen || 1, maxGeneration: startGen || 1
5025
- };
5026
- }
5027
-
5028
- function attachLocalSpans(doc, change, from, to) {
5029
- var existing = change["spans_" + doc.id], n = 0;
5030
- doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function(line) {
5031
- if (line.markedSpans)
5032
- (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans;
5033
- ++n;
5034
- });
5035
- }
5036
-
5037
- function historyChangeFromChange(doc, change) {
5038
- var from = { line: change.from.line, ch: change.from.ch };
5039
- var histChange = {from: from, to: changeEnd(change), text: getBetween(doc, change.from, change.to)};
5040
- attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);
5041
- linkedDocs(doc, function(doc) {attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);}, true);
5042
- return histChange;
5043
- }
5044
-
5045
- function addToHistory(doc, change, selAfter, opId) {
5046
- var hist = doc.history;
5047
- hist.undone.length = 0;
5048
- var time = +new Date, cur = lst(hist.done);
5049
-
5050
- if (cur &&
5051
- (hist.lastOp == opId ||
5052
- hist.lastOrigin == change.origin && change.origin &&
5053
- ((change.origin.charAt(0) == "+" && doc.cm && hist.lastTime > time - doc.cm.options.historyEventDelay) ||
5054
- change.origin.charAt(0) == "*"))) {
5055
- // Merge this change into the last event
5056
- var last = lst(cur.changes);
5057
- if (posEq(change.from, change.to) && posEq(change.from, last.to)) {
5058
- // Optimized case for simple insertion -- don't want to add
5059
- // new changesets for every character typed
5060
- last.to = changeEnd(change);
5061
- } else {
5062
- // Add new sub-event
5063
- cur.changes.push(historyChangeFromChange(doc, change));
5064
- }
5065
- cur.anchorAfter = selAfter.anchor; cur.headAfter = selAfter.head;
5066
- } else {
5067
- // Can not be merged, start a new event.
5068
- cur = {changes: [historyChangeFromChange(doc, change)],
5069
- generation: hist.generation,
5070
- anchorBefore: doc.sel.anchor, headBefore: doc.sel.head,
5071
- anchorAfter: selAfter.anchor, headAfter: selAfter.head};
5072
- hist.done.push(cur);
5073
- hist.generation = ++hist.maxGeneration;
5074
- while (hist.done.length > hist.undoDepth)
5075
- hist.done.shift();
5076
- }
5077
- hist.lastTime = time;
5078
- hist.lastOp = opId;
5079
- hist.lastOrigin = change.origin;
5080
- }
5081
-
5082
- function removeClearedSpans(spans) {
5083
- if (!spans) return null;
5084
- for (var i = 0, out; i < spans.length; ++i) {
5085
- if (spans[i].marker.explicitlyCleared) { if (!out) out = spans.slice(0, i); }
5086
- else if (out) out.push(spans[i]);
5087
- }
5088
- return !out ? spans : out.length ? out : null;
5089
- }
5090
-
5091
- function getOldSpans(doc, change) {
5092
- var found = change["spans_" + doc.id];
5093
- if (!found) return null;
5094
- for (var i = 0, nw = []; i < change.text.length; ++i)
5095
- nw.push(removeClearedSpans(found[i]));
5096
- return nw;
5097
- }
5098
-
5099
- // Used both to provide a JSON-safe object in .getHistory, and, when
5100
- // detaching a document, to split the history in two
5101
- function copyHistoryArray(events, newGroup) {
5102
- for (var i = 0, copy = []; i < events.length; ++i) {
5103
- var event = events[i], changes = event.changes, newChanges = [];
5104
- copy.push({changes: newChanges, anchorBefore: event.anchorBefore, headBefore: event.headBefore,
5105
- anchorAfter: event.anchorAfter, headAfter: event.headAfter});
5106
- for (var j = 0; j < changes.length; ++j) {
5107
- var change = changes[j], m;
5108
- newChanges.push({from: change.from, to: change.to, text: change.text});
5109
- if (newGroup) for (var prop in change) if (m = prop.match(/^spans_(\d+)$/)) {
5110
- if (indexOf(newGroup, Number(m[1])) > -1) {
5111
- lst(newChanges)[prop] = change[prop];
5112
- delete change[prop];
5113
- }
5114
- }
5115
- }
5116
- }
5117
- return copy;
5118
- }
5119
-
5120
- // Rebasing/resetting history to deal with externally-sourced changes
5121
-
5122
- function rebaseHistSel(pos, from, to, diff) {
5123
- if (to < pos.line) {
5124
- pos.line += diff;
5125
- } else if (from < pos.line) {
5126
- pos.line = from;
5127
- pos.ch = 0;
5128
- }
5129
- }
5130
-
5131
- // Tries to rebase an array of history events given a change in the
5132
- // document. If the change touches the same lines as the event, the
5133
- // event, and everything 'behind' it, is discarded. If the change is
5134
- // before the event, the event's positions are updated. Uses a
5135
- // copy-on-write scheme for the positions, to avoid having to
5136
- // reallocate them all on every rebase, but also avoid problems with
5137
- // shared position objects being unsafely updated.
5138
- function rebaseHistArray(array, from, to, diff) {
5139
- for (var i = 0; i < array.length; ++i) {
5140
- var sub = array[i], ok = true;
5141
- for (var j = 0; j < sub.changes.length; ++j) {
5142
- var cur = sub.changes[j];
5143
- if (!sub.copied) { cur.from = copyPos(cur.from); cur.to = copyPos(cur.to); }
5144
- if (to < cur.from.line) {
5145
- cur.from.line += diff;
5146
- cur.to.line += diff;
5147
- } else if (from <= cur.to.line) {
5148
- ok = false;
5149
- break;
5150
- }
5151
- }
5152
- if (!sub.copied) {
5153
- sub.anchorBefore = copyPos(sub.anchorBefore); sub.headBefore = copyPos(sub.headBefore);
5154
- sub.anchorAfter = copyPos(sub.anchorAfter); sub.readAfter = copyPos(sub.headAfter);
5155
- sub.copied = true;
5156
- }
5157
- if (!ok) {
5158
- array.splice(0, i + 1);
5159
- i = 0;
5160
- } else {
5161
- rebaseHistSel(sub.anchorBefore); rebaseHistSel(sub.headBefore);
5162
- rebaseHistSel(sub.anchorAfter); rebaseHistSel(sub.headAfter);
5163
- }
5164
- }
5165
- }
5166
-
5167
- function rebaseHist(hist, change) {
5168
- var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1;
5169
- rebaseHistArray(hist.done, from, to, diff);
5170
- rebaseHistArray(hist.undone, from, to, diff);
5171
- }
5172
-
5173
- // EVENT OPERATORS
5174
-
5175
- function stopMethod() {e_stop(this);}
5176
- // Ensure an event has a stop method.
5177
- function addStop(event) {
5178
- if (!event.stop) event.stop = stopMethod;
5179
- return event;
5180
- }
5181
-
5182
- function e_preventDefault(e) {
5183
- if (e.preventDefault) e.preventDefault();
5184
- else e.returnValue = false;
5185
- }
5186
- function e_stopPropagation(e) {
5187
- if (e.stopPropagation) e.stopPropagation();
5188
- else e.cancelBubble = true;
5189
- }
5190
- function e_defaultPrevented(e) {
5191
- return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false;
5192
- }
5193
- function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);}
5194
- CodeMirror.e_stop = e_stop;
5195
- CodeMirror.e_preventDefault = e_preventDefault;
5196
- CodeMirror.e_stopPropagation = e_stopPropagation;
5197
-
5198
- function e_target(e) {return e.target || e.srcElement;}
5199
- function e_button(e) {
5200
- var b = e.which;
5201
- if (b == null) {
5202
- if (e.button & 1) b = 1;
5203
- else if (e.button & 2) b = 3;
5204
- else if (e.button & 4) b = 2;
5205
- }
5206
- if (mac && e.ctrlKey && b == 1) b = 3;
5207
- return b;
5208
- }
5209
-
5210
- // EVENT HANDLING
5211
-
5212
- function on(emitter, type, f) {
5213
- if (emitter.addEventListener)
5214
- emitter.addEventListener(type, f, false);
5215
- else if (emitter.attachEvent)
5216
- emitter.attachEvent("on" + type, f);
5217
- else {
5218
- var map = emitter._handlers || (emitter._handlers = {});
5219
- var arr = map[type] || (map[type] = []);
5220
- arr.push(f);
5221
- }
5222
- }
5223
-
5224
- function off(emitter, type, f) {
5225
- if (emitter.removeEventListener)
5226
- emitter.removeEventListener(type, f, false);
5227
- else if (emitter.detachEvent)
5228
- emitter.detachEvent("on" + type, f);
5229
- else {
5230
- var arr = emitter._handlers && emitter._handlers[type];
5231
- if (!arr) return;
5232
- for (var i = 0; i < arr.length; ++i)
5233
- if (arr[i] == f) { arr.splice(i, 1); break; }
5234
- }
5235
- }
5236
-
5237
- function signal(emitter, type /*, values...*/) {
5238
- var arr = emitter._handlers && emitter._handlers[type];
5239
- if (!arr) return;
5240
- var args = Array.prototype.slice.call(arguments, 2);
5241
- for (var i = 0; i < arr.length; ++i) arr[i].apply(null, args);
5242
- }
5243
-
5244
- var delayedCallbacks, delayedCallbackDepth = 0;
5245
- function signalLater(emitter, type /*, values...*/) {
5246
- var arr = emitter._handlers && emitter._handlers[type];
5247
- if (!arr) return;
5248
- var args = Array.prototype.slice.call(arguments, 2);
5249
- if (!delayedCallbacks) {
5250
- ++delayedCallbackDepth;
5251
- delayedCallbacks = [];
5252
- setTimeout(fireDelayed, 0);
5253
- }
5254
- function bnd(f) {return function(){f.apply(null, args);};};
5255
- for (var i = 0; i < arr.length; ++i)
5256
- delayedCallbacks.push(bnd(arr[i]));
5257
- }
5258
-
5259
- function signalDOMEvent(cm, e, override) {
5260
- signal(cm, override || e.type, cm, e);
5261
- return e_defaultPrevented(e) || e.codemirrorIgnore;
5262
- }
5263
-
5264
- function fireDelayed() {
5265
- --delayedCallbackDepth;
5266
- var delayed = delayedCallbacks;
5267
- delayedCallbacks = null;
5268
- for (var i = 0; i < delayed.length; ++i) delayed[i]();
5269
- }
5270
-
5271
- function hasHandler(emitter, type) {
5272
- var arr = emitter._handlers && emitter._handlers[type];
5273
- return arr && arr.length > 0;
5274
- }
5275
-
5276
- CodeMirror.on = on; CodeMirror.off = off; CodeMirror.signal = signal;
5277
-
5278
- function eventMixin(ctor) {
5279
- ctor.prototype.on = function(type, f) {on(this, type, f);};
5280
- ctor.prototype.off = function(type, f) {off(this, type, f);};
5281
- }
5282
-
5283
- // MISC UTILITIES
5284
-
5285
- // Number of pixels added to scroller and sizer to hide scrollbar
5286
- var scrollerCutOff = 30;
5287
-
5288
- // Returned or thrown by various protocols to signal 'I'm not
5289
- // handling this'.
5290
- var Pass = CodeMirror.Pass = {toString: function(){return "CodeMirror.Pass";}};
5291
-
5292
- function Delayed() {this.id = null;}
5293
- Delayed.prototype = {set: function(ms, f) {clearTimeout(this.id); this.id = setTimeout(f, ms);}};
5294
-
5295
- // Counts the column offset in a string, taking tabs into account.
5296
- // Used mostly to find indentation.
5297
- function countColumn(string, end, tabSize, startIndex, startValue) {
5298
- if (end == null) {
5299
- end = string.search(/[^\s\u00a0]/);
5300
- if (end == -1) end = string.length;
5301
- }
5302
- for (var i = startIndex || 0, n = startValue || 0; i < end; ++i) {
5303
- if (string.charAt(i) == "\t") n += tabSize - (n % tabSize);
5304
- else ++n;
5305
- }
5306
- return n;
5307
- }
5308
- CodeMirror.countColumn = countColumn;
5309
-
5310
- var spaceStrs = [""];
5311
- function spaceStr(n) {
5312
- while (spaceStrs.length <= n)
5313
- spaceStrs.push(lst(spaceStrs) + " ");
5314
- return spaceStrs[n];
5315
- }
5316
-
5317
- function lst(arr) { return arr[arr.length-1]; }
5318
-
5319
- function selectInput(node) {
5320
- if (ios) { // Mobile Safari apparently has a bug where select() is broken.
5321
- node.selectionStart = 0;
5322
- node.selectionEnd = node.value.length;
5323
- } else {
5324
- // Suppress mysterious IE10 errors
5325
- try { node.select(); }
5326
- catch(_e) {}
5327
- }
5328
- }
5329
-
5330
- function indexOf(collection, elt) {
5331
- if (collection.indexOf) return collection.indexOf(elt);
5332
- for (var i = 0, e = collection.length; i < e; ++i)
5333
- if (collection[i] == elt) return i;
5334
- return -1;
5335
- }
5336
-
5337
- function createObj(base, props) {
5338
- function Obj() {}
5339
- Obj.prototype = base;
5340
- var inst = new Obj();
5341
- if (props) copyObj(props, inst);
5342
- return inst;
5343
- }
5344
-
5345
- function copyObj(obj, target) {
5346
- if (!target) target = {};
5347
- for (var prop in obj) if (obj.hasOwnProperty(prop)) target[prop] = obj[prop];
5348
- return target;
5349
- }
5350
-
5351
- function emptyArray(size) {
5352
- for (var a = [], i = 0; i < size; ++i) a.push(undefined);
5353
- return a;
5354
- }
5355
-
5356
- function bind(f) {
5357
- var args = Array.prototype.slice.call(arguments, 1);
5358
- return function(){return f.apply(null, args);};
5359
- }
5360
-
5361
- var nonASCIISingleCaseWordChar = /[\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;
5362
- function isWordChar(ch) {
5363
- return /\w/.test(ch) || ch > "\x80" &&
5364
- (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch));
5365
- }
5366
-
5367
- function isEmpty(obj) {
5368
- for (var n in obj) if (obj.hasOwnProperty(n) && obj[n]) return false;
5369
- return true;
5370
- }
5371
-
5372
- var isExtendingChar = /[\u0300-\u036F\u0483-\u0487\u0488-\u0489\u0591-\u05BD\u05BF\u05C1-\u05C2\u05C4-\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7-\u06E8\u06EA-\u06ED\uA66F\uA670-\uA672\uA674-\uA67D\uA69F\udc00-\udfff]/;
5373
-
5374
- // DOM UTILITIES
5375
-
5376
- function elt(tag, content, className, style) {
5377
- var e = document.createElement(tag);
5378
- if (className) e.className = className;
5379
- if (style) e.style.cssText = style;
5380
- if (typeof content == "string") setTextContent(e, content);
5381
- else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]);
5382
- return e;
5383
- }
5384
-
5385
- function removeChildren(e) {
5386
- for (var count = e.childNodes.length; count > 0; --count)
5387
- e.removeChild(e.firstChild);
5388
- return e;
5389
- }
5390
-
5391
- function removeChildrenAndAdd(parent, e) {
5392
- return removeChildren(parent).appendChild(e);
5393
- }
5394
-
5395
- function setTextContent(e, str) {
5396
- if (ie_lt9) {
5397
- e.innerHTML = "";
5398
- e.appendChild(document.createTextNode(str));
5399
- } else e.textContent = str;
5400
- }
5401
-
5402
- function getRect(node) {
5403
- return node.getBoundingClientRect();
5404
- }
5405
- CodeMirror.replaceGetRect = function(f) { getRect = f; };
5406
-
5407
- // FEATURE DETECTION
5408
-
5409
- // Detect drag-and-drop
5410
- var dragAndDrop = function() {
5411
- // There is *some* kind of drag-and-drop support in IE6-8, but I
5412
- // couldn't get it to work yet.
5413
- if (ie_lt9) return false;
5414
- var div = elt('div');
5415
- return "draggable" in div || "dragDrop" in div;
5416
- }();
5417
-
5418
- // For a reason I have yet to figure out, some browsers disallow
5419
- // word wrapping between certain characters *only* if a new inline
5420
- // element is started between them. This makes it hard to reliably
5421
- // measure the position of things, since that requires inserting an
5422
- // extra span. This terribly fragile set of tests matches the
5423
- // character combinations that suffer from this phenomenon on the
5424
- // various browsers.
5425
- function spanAffectsWrapping() { return false; }
5426
- if (gecko) // Only for "$'"
5427
- spanAffectsWrapping = function(str, i) {
5428
- return str.charCodeAt(i - 1) == 36 && str.charCodeAt(i) == 39;
5429
- };
5430
- else if (safari && !/Version\/([6-9]|\d\d)\b/.test(navigator.userAgent))
5431
- spanAffectsWrapping = function(str, i) {
5432
- return /\-[^ \-?]|\?[^ !\'\"\),.\-\/:;\?\]\}]/.test(str.slice(i - 1, i + 1));
5433
- };
5434
- else if (webkit && !/Chrome\/(?:29|[3-9]\d|\d\d\d)\./.test(navigator.userAgent))
5435
- spanAffectsWrapping = function(str, i) {
5436
- if (i > 1 && str.charCodeAt(i - 1) == 45) {
5437
- if (/\w/.test(str.charAt(i - 2)) && /[^\-?\.]/.test(str.charAt(i))) return true;
5438
- if (i > 2 && /[\d\.,]/.test(str.charAt(i - 2)) && /[\d\.,]/.test(str.charAt(i))) return false;
5439
- }
5440
- return /[~!#%&*)=+}\]|\"\.>,:;][({[<]|-[^\-?\.\u2010-\u201f\u2026]|\?[\w~`@#$%\^&*(_=+{[|><]|…[\w~`@#$%\^&*(_=+{[><]/.test(str.slice(i - 1, i + 1));
5441
- };
5442
-
5443
- var knownScrollbarWidth;
5444
- function scrollbarWidth(measure) {
5445
- if (knownScrollbarWidth != null) return knownScrollbarWidth;
5446
- var test = elt("div", null, null, "width: 50px; height: 50px; overflow-x: scroll");
5447
- removeChildrenAndAdd(measure, test);
5448
- if (test.offsetWidth)
5449
- knownScrollbarWidth = test.offsetHeight - test.clientHeight;
5450
- return knownScrollbarWidth || 0;
5451
- }
5452
-
5453
- var zwspSupported;
5454
- function zeroWidthElement(measure) {
5455
- if (zwspSupported == null) {
5456
- var test = elt("span", "\u200b");
5457
- removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")]));
5458
- if (measure.firstChild.offsetHeight != 0)
5459
- zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !ie_lt8;
5460
- }
5461
- if (zwspSupported) return elt("span", "\u200b");
5462
- else return elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px");
5463
- }
5464
-
5465
- // See if "".split is the broken IE version, if so, provide an
5466
- // alternative way to split lines.
5467
- var splitLines = "\n\nb".split(/\n/).length != 3 ? function(string) {
5468
- var pos = 0, result = [], l = string.length;
5469
- while (pos <= l) {
5470
- var nl = string.indexOf("\n", pos);
5471
- if (nl == -1) nl = string.length;
5472
- var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl);
5473
- var rt = line.indexOf("\r");
5474
- if (rt != -1) {
5475
- result.push(line.slice(0, rt));
5476
- pos += rt + 1;
5477
- } else {
5478
- result.push(line);
5479
- pos = nl + 1;
5480
- }
5481
- }
5482
- return result;
5483
- } : function(string){return string.split(/\r\n?|\n/);};
5484
- CodeMirror.splitLines = splitLines;
5485
-
5486
- var hasSelection = window.getSelection ? function(te) {
5487
- try { return te.selectionStart != te.selectionEnd; }
5488
- catch(e) { return false; }
5489
- } : function(te) {
5490
- try {var range = te.ownerDocument.selection.createRange();}
5491
- catch(e) {}
5492
- if (!range || range.parentElement() != te) return false;
5493
- return range.compareEndPoints("StartToEnd", range) != 0;
5494
- };
5495
-
5496
- var hasCopyEvent = (function() {
5497
- var e = elt("div");
5498
- if ("oncopy" in e) return true;
5499
- e.setAttribute("oncopy", "return;");
5500
- return typeof e.oncopy == 'function';
5501
- })();
5502
-
5503
- // KEY NAMING
5504
-
5505
- var keyNames = {3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt",
5506
- 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End",
5507
- 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert",
5508
- 46: "Delete", 59: ";", 91: "Mod", 92: "Mod", 93: "Mod", 109: "-", 107: "=", 127: "Delete",
5509
- 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\",
5510
- 221: "]", 222: "'", 63276: "PageUp", 63277: "PageDown", 63275: "End", 63273: "Home",
5511
- 63234: "Left", 63232: "Up", 63235: "Right", 63233: "Down", 63302: "Insert", 63272: "Delete"};
5512
- CodeMirror.keyNames = keyNames;
5513
- (function() {
5514
- // Number keys
5515
- for (var i = 0; i < 10; i++) keyNames[i + 48] = String(i);
5516
- // Alphabetic keys
5517
- for (var i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i);
5518
- // Function keys
5519
- for (var i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = "F" + i;
5520
- })();
5521
-
5522
- // BIDI HELPERS
5523
-
5524
- function iterateBidiSections(order, from, to, f) {
5525
- if (!order) return f(from, to, "ltr");
5526
- var found = false;
5527
- for (var i = 0; i < order.length; ++i) {
5528
- var part = order[i];
5529
- if (part.from < to && part.to > from || from == to && part.to == from) {
5530
- f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr");
5531
- found = true;
5532
- }
5533
- }
5534
- if (!found) f(from, to, "ltr");
5535
- }
5536
-
5537
- function bidiLeft(part) { return part.level % 2 ? part.to : part.from; }
5538
- function bidiRight(part) { return part.level % 2 ? part.from : part.to; }
5539
-
5540
- function lineLeft(line) { var order = getOrder(line); return order ? bidiLeft(order[0]) : 0; }
5541
- function lineRight(line) {
5542
- var order = getOrder(line);
5543
- if (!order) return line.text.length;
5544
- return bidiRight(lst(order));
5545
- }
5546
-
5547
- function lineStart(cm, lineN) {
5548
- var line = getLine(cm.doc, lineN);
5549
- var visual = visualLine(cm.doc, line);
5550
- if (visual != line) lineN = lineNo(visual);
5551
- var order = getOrder(visual);
5552
- var ch = !order ? 0 : order[0].level % 2 ? lineRight(visual) : lineLeft(visual);
5553
- return Pos(lineN, ch);
5554
- }
5555
- function lineEnd(cm, lineN) {
5556
- var merged, line;
5557
- while (merged = collapsedSpanAtEnd(line = getLine(cm.doc, lineN)))
5558
- lineN = merged.find().to.line;
5559
- var order = getOrder(line);
5560
- var ch = !order ? line.text.length : order[0].level % 2 ? lineLeft(line) : lineRight(line);
5561
- return Pos(lineN, ch);
5562
- }
5563
-
5564
- function compareBidiLevel(order, a, b) {
5565
- var linedir = order[0].level;
5566
- if (a == linedir) return true;
5567
- if (b == linedir) return false;
5568
- return a < b;
5569
- }
5570
- var bidiOther;
5571
- function getBidiPartAt(order, pos) {
5572
- for (var i = 0, found; i < order.length; ++i) {
5573
- var cur = order[i];
5574
- if (cur.from < pos && cur.to > pos) { bidiOther = null; return i; }
5575
- if (cur.from == pos || cur.to == pos) {
5576
- if (found == null) {
5577
- found = i;
5578
- } else if (compareBidiLevel(order, cur.level, order[found].level)) {
5579
- bidiOther = found;
5580
- return i;
5581
- } else {
5582
- bidiOther = i;
5583
- return found;
5584
- }
5585
- }
5586
- }
5587
- bidiOther = null;
5588
- return found;
5589
- }
5590
-
5591
- function moveInLine(line, pos, dir, byUnit) {
5592
- if (!byUnit) return pos + dir;
5593
- do pos += dir;
5594
- while (pos > 0 && isExtendingChar.test(line.text.charAt(pos)));
5595
- return pos;
5596
- }
5597
-
5598
- // This is somewhat involved. It is needed in order to move
5599
- // 'visually' through bi-directional text -- i.e., pressing left
5600
- // should make the cursor go left, even when in RTL text. The
5601
- // tricky part is the 'jumps', where RTL and LTR text touch each
5602
- // other. This often requires the cursor offset to move more than
5603
- // one unit, in order to visually move one unit.
5604
- function moveVisually(line, start, dir, byUnit) {
5605
- var bidi = getOrder(line);
5606
- if (!bidi) return moveLogically(line, start, dir, byUnit);
5607
- var pos = getBidiPartAt(bidi, start), part = bidi[pos];
5608
- var target = moveInLine(line, start, part.level % 2 ? -dir : dir, byUnit);
5609
-
5610
- for (;;) {
5611
- if (target > part.from && target < part.to) return target;
5612
- if (target == part.from || target == part.to) {
5613
- if (getBidiPartAt(bidi, target) == pos) return target;
5614
- part = bidi[pos += dir];
5615
- return (dir > 0) == part.level % 2 ? part.to : part.from;
5616
- } else {
5617
- part = bidi[pos += dir];
5618
- if (!part) return null;
5619
- if ((dir > 0) == part.level % 2)
5620
- target = moveInLine(line, part.to, -1, byUnit);
5621
- else
5622
- target = moveInLine(line, part.from, 1, byUnit);
5623
- }
5624
- }
5625
- }
5626
-
5627
- function moveLogically(line, start, dir, byUnit) {
5628
- var target = start + dir;
5629
- if (byUnit) while (target > 0 && isExtendingChar.test(line.text.charAt(target))) target += dir;
5630
- return target < 0 || target > line.text.length ? null : target;
5631
- }
5632
-
5633
- // Bidirectional ordering algorithm
5634
- // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm
5635
- // that this (partially) implements.
5636
-
5637
- // One-char codes used for character types:
5638
- // L (L): Left-to-Right
5639
- // R (R): Right-to-Left
5640
- // r (AL): Right-to-Left Arabic
5641
- // 1 (EN): European Number
5642
- // + (ES): European Number Separator
5643
- // % (ET): European Number Terminator
5644
- // n (AN): Arabic Number
5645
- // , (CS): Common Number Separator
5646
- // m (NSM): Non-Spacing Mark
5647
- // b (BN): Boundary Neutral
5648
- // s (B): Paragraph Separator
5649
- // t (S): Segment Separator
5650
- // w (WS): Whitespace
5651
- // N (ON): Other Neutrals
5652
-
5653
- // Returns null if characters are ordered as they appear
5654
- // (left-to-right), or an array of sections ({from, to, level}
5655
- // objects) in the order in which they occur visually.
5656
- var bidiOrdering = (function() {
5657
- // Character types for codepoints 0 to 0xff
5658
- var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLL";
5659
- // Character types for codepoints 0x600 to 0x6ff
5660
- var arabicTypes = "rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmmrrrrrrrrrrrrrrrrrr";
5661
- function charType(code) {
5662
- if (code <= 0xff) return lowTypes.charAt(code);
5663
- else if (0x590 <= code && code <= 0x5f4) return "R";
5664
- else if (0x600 <= code && code <= 0x6ff) return arabicTypes.charAt(code - 0x600);
5665
- else if (0x700 <= code && code <= 0x8ac) return "r";
5666
- else return "L";
5667
- }
5668
-
5669
- var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/;
5670
- var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/;
5671
- // Browsers seem to always treat the boundaries of block elements as being L.
5672
- var outerType = "L";
5673
-
5674
- return function(str) {
5675
- if (!bidiRE.test(str)) return false;
5676
- var len = str.length, types = [];
5677
- for (var i = 0, type; i < len; ++i)
5678
- types.push(type = charType(str.charCodeAt(i)));
5679
-
5680
- // W1. Examine each non-spacing mark (NSM) in the level run, and
5681
- // change the type of the NSM to the type of the previous
5682
- // character. If the NSM is at the start of the level run, it will
5683
- // get the type of sor.
5684
- for (var i = 0, prev = outerType; i < len; ++i) {
5685
- var type = types[i];
5686
- if (type == "m") types[i] = prev;
5687
- else prev = type;
5688
- }
5689
-
5690
- // W2. Search backwards from each instance of a European number
5691
- // until the first strong type (R, L, AL, or sor) is found. If an
5692
- // AL is found, change the type of the European number to Arabic
5693
- // number.
5694
- // W3. Change all ALs to R.
5695
- for (var i = 0, cur = outerType; i < len; ++i) {
5696
- var type = types[i];
5697
- if (type == "1" && cur == "r") types[i] = "n";
5698
- else if (isStrong.test(type)) { cur = type; if (type == "r") types[i] = "R"; }
5699
- }
5700
-
5701
- // W4. A single European separator between two European numbers
5702
- // changes to a European number. A single common separator between
5703
- // two numbers of the same type changes to that type.
5704
- for (var i = 1, prev = types[0]; i < len - 1; ++i) {
5705
- var type = types[i];
5706
- if (type == "+" && prev == "1" && types[i+1] == "1") types[i] = "1";
5707
- else if (type == "," && prev == types[i+1] &&
5708
- (prev == "1" || prev == "n")) types[i] = prev;
5709
- prev = type;
5710
- }
5711
-
5712
- // W5. A sequence of European terminators adjacent to European
5713
- // numbers changes to all European numbers.
5714
- // W6. Otherwise, separators and terminators change to Other
5715
- // Neutral.
5716
- for (var i = 0; i < len; ++i) {
5717
- var type = types[i];
5718
- if (type == ",") types[i] = "N";
5719
- else if (type == "%") {
5720
- for (var end = i + 1; end < len && types[end] == "%"; ++end) {}
5721
- var replace = (i && types[i-1] == "!") || (end < len - 1 && types[end] == "1") ? "1" : "N";
5722
- for (var j = i; j < end; ++j) types[j] = replace;
5723
- i = end - 1;
5724
- }
5725
- }
5726
-
5727
- // W7. Search backwards from each instance of a European number
5728
- // until the first strong type (R, L, or sor) is found. If an L is
5729
- // found, then change the type of the European number to L.
5730
- for (var i = 0, cur = outerType; i < len; ++i) {
5731
- var type = types[i];
5732
- if (cur == "L" && type == "1") types[i] = "L";
5733
- else if (isStrong.test(type)) cur = type;
5734
- }
5735
-
5736
- // N1. A sequence of neutrals takes the direction of the
5737
- // surrounding strong text if the text on both sides has the same
5738
- // direction. European and Arabic numbers act as if they were R in
5739
- // terms of their influence on neutrals. Start-of-level-run (sor)
5740
- // and end-of-level-run (eor) are used at level run boundaries.
5741
- // N2. Any remaining neutrals take the embedding direction.
5742
- for (var i = 0; i < len; ++i) {
5743
- if (isNeutral.test(types[i])) {
5744
- for (var end = i + 1; end < len && isNeutral.test(types[end]); ++end) {}
5745
- var before = (i ? types[i-1] : outerType) == "L";
5746
- var after = (end < len - 1 ? types[end] : outerType) == "L";
5747
- var replace = before || after ? "L" : "R";
5748
- for (var j = i; j < end; ++j) types[j] = replace;
5749
- i = end - 1;
5750
- }
5751
- }
5752
-
5753
- // Here we depart from the documented algorithm, in order to avoid
5754
- // building up an actual levels array. Since there are only three
5755
- // levels (0, 1, 2) in an implementation that doesn't take
5756
- // explicit embedding into account, we can build up the order on
5757
- // the fly, without following the level-based algorithm.
5758
- var order = [], m;
5759
- for (var i = 0; i < len;) {
5760
- if (countsAsLeft.test(types[i])) {
5761
- var start = i;
5762
- for (++i; i < len && countsAsLeft.test(types[i]); ++i) {}
5763
- order.push({from: start, to: i, level: 0});
5764
- } else {
5765
- var pos = i, at = order.length;
5766
- for (++i; i < len && types[i] != "L"; ++i) {}
5767
- for (var j = pos; j < i;) {
5768
- if (countsAsNum.test(types[j])) {
5769
- if (pos < j) order.splice(at, 0, {from: pos, to: j, level: 1});
5770
- var nstart = j;
5771
- for (++j; j < i && countsAsNum.test(types[j]); ++j) {}
5772
- order.splice(at, 0, {from: nstart, to: j, level: 2});
5773
- pos = j;
5774
- } else ++j;
5775
- }
5776
- if (pos < i) order.splice(at, 0, {from: pos, to: i, level: 1});
5777
- }
5778
- }
5779
- if (order[0].level == 1 && (m = str.match(/^\s+/))) {
5780
- order[0].from = m[0].length;
5781
- order.unshift({from: 0, to: m[0].length, level: 0});
5782
- }
5783
- if (lst(order).level == 1 && (m = str.match(/\s+$/))) {
5784
- lst(order).to -= m[0].length;
5785
- order.push({from: len - m[0].length, to: len, level: 0});
5786
- }
5787
- if (order[0].level != lst(order).level)
5788
- order.push({from: len, to: len, level: order[0].level});
5789
-
5790
- return order;
5791
- };
5792
- })();
5793
-
5794
- // THE END
5795
-
5796
- CodeMirror.version = "3.15.0";
5797
-
5798
- return CodeMirror;
5799
- })();
1
+ // CodeMirror version 3.15
2
+ //
3
+ // CodeMirror is the only global var we claim
4
+ window.CodeMirror = (function() {
5
+ "use strict";
6
+
7
+ // BROWSER SNIFFING
8
+
9
+ // Crude, but necessary to handle a number of hard-to-feature-detect
10
+ // bugs and behavior differences.
11
+ var gecko = /gecko\/\d/i.test(navigator.userAgent);
12
+ var ie = /MSIE \d/.test(navigator.userAgent);
13
+ var ie_lt8 = ie && (document.documentMode == null || document.documentMode < 8);
14
+ var ie_lt9 = ie && (document.documentMode == null || document.documentMode < 9);
15
+ var webkit = /WebKit\//.test(navigator.userAgent);
16
+ var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(navigator.userAgent);
17
+ var chrome = /Chrome\//.test(navigator.userAgent);
18
+ var opera = /Opera\//.test(navigator.userAgent);
19
+ var safari = /Apple Computer/.test(navigator.vendor);
20
+ var khtml = /KHTML\//.test(navigator.userAgent);
21
+ var mac_geLion = /Mac OS X 1\d\D([7-9]|\d\d)\D/.test(navigator.userAgent);
22
+ var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent);
23
+ var phantom = /PhantomJS/.test(navigator.userAgent);
24
+
25
+ var ios = /AppleWebKit/.test(navigator.userAgent) && /Mobile\/\w+/.test(navigator.userAgent);
26
+ // This is woefully incomplete. Suggestions for alternative methods welcome.
27
+ var mobile = ios || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent);
28
+ var mac = ios || /Mac/.test(navigator.platform);
29
+ var windows = /windows/i.test(navigator.platform);
30
+
31
+ var opera_version = opera && navigator.userAgent.match(/Version\/(\d*\.\d*)/);
32
+ if (opera_version) opera_version = Number(opera_version[1]);
33
+ if (opera_version && opera_version >= 15) { opera = false; webkit = true; }
34
+ // Some browsers use the wrong event properties to signal cmd/ctrl on OS X
35
+ var flipCtrlCmd = mac && (qtwebkit || opera && (opera_version == null || opera_version < 12.11));
36
+ var captureMiddleClick = gecko || (ie && !ie_lt9);
37
+
38
+ // Optimize some code when these features are not used
39
+ var sawReadOnlySpans = false, sawCollapsedSpans = false;
40
+
41
+ // CONSTRUCTOR
42
+
43
+ function CodeMirror(place, options) {
44
+ if (!(this instanceof CodeMirror)) return new CodeMirror(place, options);
45
+
46
+ this.options = options = options || {};
47
+ // Determine effective options based on given values and defaults.
48
+ for (var opt in defaults) if (!options.hasOwnProperty(opt) && defaults.hasOwnProperty(opt))
49
+ options[opt] = defaults[opt];
50
+ setGuttersForLineNumbers(options);
51
+
52
+ var docStart = typeof options.value == "string" ? 0 : options.value.first;
53
+ var display = this.display = makeDisplay(place, docStart);
54
+ display.wrapper.CodeMirror = this;
55
+ updateGutters(this);
56
+ if (options.autofocus && !mobile) focusInput(this);
57
+
58
+ this.state = {keyMaps: [],
59
+ overlays: [],
60
+ modeGen: 0,
61
+ overwrite: false, focused: false,
62
+ suppressEdits: false, pasteIncoming: false,
63
+ draggingText: false,
64
+ highlight: new Delayed()};
65
+
66
+ themeChanged(this);
67
+ if (options.lineWrapping)
68
+ this.display.wrapper.className += " CodeMirror-wrap";
69
+
70
+ var doc = options.value;
71
+ if (typeof doc == "string") doc = new Doc(options.value, options.mode);
72
+ operation(this, attachDoc)(this, doc);
73
+
74
+ // Override magic textarea content restore that IE sometimes does
75
+ // on our hidden textarea on reload
76
+ if (ie) setTimeout(bind(resetInput, this, true), 20);
77
+
78
+ registerEventHandlers(this);
79
+ // IE throws unspecified error in certain cases, when
80
+ // trying to access activeElement before onload
81
+ var hasFocus; try { hasFocus = (document.activeElement == display.input); } catch(e) { }
82
+ if (hasFocus || (options.autofocus && !mobile)) setTimeout(bind(onFocus, this), 20);
83
+ else onBlur(this);
84
+
85
+ operation(this, function() {
86
+ for (var opt in optionHandlers)
87
+ if (optionHandlers.propertyIsEnumerable(opt))
88
+ optionHandlers[opt](this, options[opt], Init);
89
+ for (var i = 0; i < initHooks.length; ++i) initHooks[i](this);
90
+ })();
91
+ }
92
+
93
+ // DISPLAY CONSTRUCTOR
94
+
95
+ function makeDisplay(place, docStart) {
96
+ var d = {};
97
+
98
+ var input = d.input = elt("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em; outline: none; font-size: 4px;");
99
+ if (webkit) input.style.width = "1000px";
100
+ else input.setAttribute("wrap", "off");
101
+ // if border: 0; -- iOS fails to open keyboard (issue #1287)
102
+ if (ios) input.style.border = "1px solid black";
103
+ input.setAttribute("autocorrect", "off"); input.setAttribute("autocapitalize", "off"); input.setAttribute("spellcheck", "false");
104
+
105
+ // Wraps and hides input textarea
106
+ d.inputDiv = elt("div", [input], null, "overflow: hidden; position: relative; width: 3px; height: 0px;");
107
+ // The actual fake scrollbars.
108
+ d.scrollbarH = elt("div", [elt("div", null, null, "height: 1px")], "CodeMirror-hscrollbar");
109
+ d.scrollbarV = elt("div", [elt("div", null, null, "width: 1px")], "CodeMirror-vscrollbar");
110
+ d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler");
111
+ d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler");
112
+ // DIVs containing the selection and the actual code
113
+ d.lineDiv = elt("div", null, "CodeMirror-code");
114
+ d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1");
115
+ // Blinky cursor, and element used to ensure cursor fits at the end of a line
116
+ d.cursor = elt("div", "\u00a0", "CodeMirror-cursor");
117
+ // Secondary cursor, shown when on a 'jump' in bi-directional text
118
+ d.otherCursor = elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor");
119
+ // Used to measure text size
120
+ d.measure = elt("div", null, "CodeMirror-measure");
121
+ // Wraps everything that needs to exist inside the vertically-padded coordinate system
122
+ d.lineSpace = elt("div", [d.measure, d.selectionDiv, d.lineDiv, d.cursor, d.otherCursor],
123
+ null, "position: relative; outline: none");
124
+ // Moved around its parent to cover visible view
125
+ d.mover = elt("div", [elt("div", [d.lineSpace], "CodeMirror-lines")], null, "position: relative");
126
+ // Set to the height of the text, causes scrolling
127
+ d.sizer = elt("div", [d.mover], "CodeMirror-sizer");
128
+ // D is needed because behavior of elts with overflow: auto and padding is inconsistent across browsers
129
+ d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerCutOff + "px; width: 1px;");
130
+ // Will contain the gutters, if any
131
+ d.gutters = elt("div", null, "CodeMirror-gutters");
132
+ d.lineGutter = null;
133
+ // Provides scrolling
134
+ d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll");
135
+ d.scroller.setAttribute("tabIndex", "-1");
136
+ // The element in which the editor lives.
137
+ d.wrapper = elt("div", [d.inputDiv, d.scrollbarH, d.scrollbarV,
138
+ d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror");
139
+ // Work around IE7 z-index bug
140
+ if (ie_lt8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; }
141
+ if (place.appendChild) place.appendChild(d.wrapper); else place(d.wrapper);
142
+
143
+ // Needed to hide big blue blinking cursor on Mobile Safari
144
+ if (ios) input.style.width = "0px";
145
+ if (!webkit) d.scroller.draggable = true;
146
+ // Needed to handle Tab key in KHTML
147
+ if (khtml) { d.inputDiv.style.height = "1px"; d.inputDiv.style.position = "absolute"; }
148
+ // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).
149
+ else if (ie_lt8) d.scrollbarH.style.minWidth = d.scrollbarV.style.minWidth = "18px";
150
+
151
+ // Current visible range (may be bigger than the view window).
152
+ d.viewOffset = d.lastSizeC = 0;
153
+ d.showingFrom = d.showingTo = docStart;
154
+
155
+ // Used to only resize the line number gutter when necessary (when
156
+ // the amount of lines crosses a boundary that makes its width change)
157
+ d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null;
158
+ // See readInput and resetInput
159
+ d.prevInput = "";
160
+ // Set to true when a non-horizontal-scrolling widget is added. As
161
+ // an optimization, widget aligning is skipped when d is false.
162
+ d.alignWidgets = false;
163
+ // Flag that indicates whether we currently expect input to appear
164
+ // (after some event like 'keypress' or 'input') and are polling
165
+ // intensively.
166
+ d.pollingFast = false;
167
+ // Self-resetting timeout for the poller
168
+ d.poll = new Delayed();
169
+
170
+ d.cachedCharWidth = d.cachedTextHeight = null;
171
+ d.measureLineCache = [];
172
+ d.measureLineCachePos = 0;
173
+
174
+ // Tracks when resetInput has punted to just putting a short
175
+ // string instead of the (large) selection.
176
+ d.inaccurateSelection = false;
177
+
178
+ // Tracks the maximum line length so that the horizontal scrollbar
179
+ // can be kept static when scrolling.
180
+ d.maxLine = null;
181
+ d.maxLineLength = 0;
182
+ d.maxLineChanged = false;
183
+
184
+ // Used for measuring wheel scrolling granularity
185
+ d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null;
186
+
187
+ return d;
188
+ }
189
+
190
+ // STATE UPDATES
191
+
192
+ // Used to get the editor into a consistent state again when options change.
193
+
194
+ function loadMode(cm) {
195
+ cm.doc.mode = CodeMirror.getMode(cm.options, cm.doc.modeOption);
196
+ cm.doc.iter(function(line) {
197
+ if (line.stateAfter) line.stateAfter = null;
198
+ if (line.styles) line.styles = null;
199
+ });
200
+ cm.doc.frontier = cm.doc.first;
201
+ startWorker(cm, 100);
202
+ cm.state.modeGen++;
203
+ if (cm.curOp) regChange(cm);
204
+ }
205
+
206
+ function wrappingChanged(cm) {
207
+ if (cm.options.lineWrapping) {
208
+ cm.display.wrapper.className += " CodeMirror-wrap";
209
+ cm.display.sizer.style.minWidth = "";
210
+ } else {
211
+ cm.display.wrapper.className = cm.display.wrapper.className.replace(" CodeMirror-wrap", "");
212
+ computeMaxLength(cm);
213
+ }
214
+ estimateLineHeights(cm);
215
+ regChange(cm);
216
+ clearCaches(cm);
217
+ setTimeout(function(){updateScrollbars(cm);}, 100);
218
+ }
219
+
220
+ function estimateHeight(cm) {
221
+ var th = textHeight(cm.display), wrapping = cm.options.lineWrapping;
222
+ var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3);
223
+ return function(line) {
224
+ if (lineIsHidden(cm.doc, line))
225
+ return 0;
226
+ else if (wrapping)
227
+ return (Math.ceil(line.text.length / perLine) || 1) * th;
228
+ else
229
+ return th;
230
+ };
231
+ }
232
+
233
+ function estimateLineHeights(cm) {
234
+ var doc = cm.doc, est = estimateHeight(cm);
235
+ doc.iter(function(line) {
236
+ var estHeight = est(line);
237
+ if (estHeight != line.height) updateLineHeight(line, estHeight);
238
+ });
239
+ }
240
+
241
+ function keyMapChanged(cm) {
242
+ var map = keyMap[cm.options.keyMap], style = map.style;
243
+ cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-keymap-\S+/g, "") +
244
+ (style ? " cm-keymap-" + style : "");
245
+ cm.state.disableInput = map.disableInput;
246
+ }
247
+
248
+ function themeChanged(cm) {
249
+ cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") +
250
+ cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-");
251
+ clearCaches(cm);
252
+ }
253
+
254
+ function guttersChanged(cm) {
255
+ updateGutters(cm);
256
+ regChange(cm);
257
+ setTimeout(function(){alignHorizontally(cm);}, 20);
258
+ }
259
+
260
+ function updateGutters(cm) {
261
+ var gutters = cm.display.gutters, specs = cm.options.gutters;
262
+ removeChildren(gutters);
263
+ for (var i = 0; i < specs.length; ++i) {
264
+ var gutterClass = specs[i];
265
+ var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + gutterClass));
266
+ if (gutterClass == "CodeMirror-linenumbers") {
267
+ cm.display.lineGutter = gElt;
268
+ gElt.style.width = (cm.display.lineNumWidth || 1) + "px";
269
+ }
270
+ }
271
+ gutters.style.display = i ? "" : "none";
272
+ }
273
+
274
+ function lineLength(doc, line) {
275
+ if (line.height == 0) return 0;
276
+ var len = line.text.length, merged, cur = line;
277
+ while (merged = collapsedSpanAtStart(cur)) {
278
+ var found = merged.find();
279
+ cur = getLine(doc, found.from.line);
280
+ len += found.from.ch - found.to.ch;
281
+ }
282
+ cur = line;
283
+ while (merged = collapsedSpanAtEnd(cur)) {
284
+ var found = merged.find();
285
+ len -= cur.text.length - found.from.ch;
286
+ cur = getLine(doc, found.to.line);
287
+ len += cur.text.length - found.to.ch;
288
+ }
289
+ return len;
290
+ }
291
+
292
+ function computeMaxLength(cm) {
293
+ var d = cm.display, doc = cm.doc;
294
+ d.maxLine = getLine(doc, doc.first);
295
+ d.maxLineLength = lineLength(doc, d.maxLine);
296
+ d.maxLineChanged = true;
297
+ doc.iter(function(line) {
298
+ var len = lineLength(doc, line);
299
+ if (len > d.maxLineLength) {
300
+ d.maxLineLength = len;
301
+ d.maxLine = line;
302
+ }
303
+ });
304
+ }
305
+
306
+ // Make sure the gutters options contains the element
307
+ // "CodeMirror-linenumbers" when the lineNumbers option is true.
308
+ function setGuttersForLineNumbers(options) {
309
+ var found = false;
310
+ for (var i = 0; i < options.gutters.length; ++i) {
311
+ if (options.gutters[i] == "CodeMirror-linenumbers") {
312
+ if (options.lineNumbers) found = true;
313
+ else options.gutters.splice(i--, 1);
314
+ }
315
+ }
316
+ if (!found && options.lineNumbers)
317
+ options.gutters.push("CodeMirror-linenumbers");
318
+ }
319
+
320
+ // SCROLLBARS
321
+
322
+ // Re-synchronize the fake scrollbars with the actual size of the
323
+ // content. Optionally force a scrollTop.
324
+ function updateScrollbars(cm) {
325
+ var d = cm.display, docHeight = cm.doc.height;
326
+ var totalHeight = docHeight + paddingVert(d);
327
+ d.sizer.style.minHeight = d.heightForcer.style.top = totalHeight + "px";
328
+ d.gutters.style.height = Math.max(totalHeight, d.scroller.clientHeight - scrollerCutOff) + "px";
329
+ var scrollHeight = Math.max(totalHeight, d.scroller.scrollHeight);
330
+ var needsH = d.scroller.scrollWidth > (d.scroller.clientWidth + 1);
331
+ var needsV = scrollHeight > (d.scroller.clientHeight + 1);
332
+ if (needsV) {
333
+ d.scrollbarV.style.display = "block";
334
+ d.scrollbarV.style.bottom = needsH ? scrollbarWidth(d.measure) + "px" : "0";
335
+ d.scrollbarV.firstChild.style.height =
336
+ (scrollHeight - d.scroller.clientHeight + d.scrollbarV.clientHeight) + "px";
337
+ } else d.scrollbarV.style.display = "";
338
+ if (needsH) {
339
+ d.scrollbarH.style.display = "block";
340
+ d.scrollbarH.style.right = needsV ? scrollbarWidth(d.measure) + "px" : "0";
341
+ d.scrollbarH.firstChild.style.width =
342
+ (d.scroller.scrollWidth - d.scroller.clientWidth + d.scrollbarH.clientWidth) + "px";
343
+ } else d.scrollbarH.style.display = "";
344
+ if (needsH && needsV) {
345
+ d.scrollbarFiller.style.display = "block";
346
+ d.scrollbarFiller.style.height = d.scrollbarFiller.style.width = scrollbarWidth(d.measure) + "px";
347
+ } else d.scrollbarFiller.style.display = "";
348
+ if (needsH && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {
349
+ d.gutterFiller.style.display = "block";
350
+ d.gutterFiller.style.height = scrollbarWidth(d.measure) + "px";
351
+ d.gutterFiller.style.width = d.gutters.offsetWidth + "px";
352
+ } else d.gutterFiller.style.display = "";
353
+
354
+ if (mac_geLion && scrollbarWidth(d.measure) === 0)
355
+ d.scrollbarV.style.minWidth = d.scrollbarH.style.minHeight = mac_geMountainLion ? "18px" : "12px";
356
+ }
357
+
358
+ function visibleLines(display, doc, viewPort) {
359
+ var top = display.scroller.scrollTop, height = display.wrapper.clientHeight;
360
+ if (typeof viewPort == "number") top = viewPort;
361
+ else if (viewPort) {top = viewPort.top; height = viewPort.bottom - viewPort.top;}
362
+ top = Math.floor(top - paddingTop(display));
363
+ var bottom = Math.ceil(top + height);
364
+ return {from: lineAtHeight(doc, top), to: lineAtHeight(doc, bottom)};
365
+ }
366
+
367
+ // LINE NUMBERS
368
+
369
+ function alignHorizontally(cm) {
370
+ var display = cm.display;
371
+ if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) return;
372
+ var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft;
373
+ var gutterW = display.gutters.offsetWidth, l = comp + "px";
374
+ for (var n = display.lineDiv.firstChild; n; n = n.nextSibling) if (n.alignable) {
375
+ for (var i = 0, a = n.alignable; i < a.length; ++i) a[i].style.left = l;
376
+ }
377
+ if (cm.options.fixedGutter)
378
+ display.gutters.style.left = (comp + gutterW) + "px";
379
+ }
380
+
381
+ function maybeUpdateLineNumberWidth(cm) {
382
+ if (!cm.options.lineNumbers) return false;
383
+ var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display;
384
+ if (last.length != display.lineNumChars) {
385
+ var test = display.measure.appendChild(elt("div", [elt("div", last)],
386
+ "CodeMirror-linenumber CodeMirror-gutter-elt"));
387
+ var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW;
388
+ display.lineGutter.style.width = "";
389
+ display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding);
390
+ display.lineNumWidth = display.lineNumInnerWidth + padding;
391
+ display.lineNumChars = display.lineNumInnerWidth ? last.length : -1;
392
+ display.lineGutter.style.width = display.lineNumWidth + "px";
393
+ return true;
394
+ }
395
+ return false;
396
+ }
397
+
398
+ function lineNumberFor(options, i) {
399
+ return String(options.lineNumberFormatter(i + options.firstLineNumber));
400
+ }
401
+ function compensateForHScroll(display) {
402
+ return getRect(display.scroller).left - getRect(display.sizer).left;
403
+ }
404
+
405
+ // DISPLAY DRAWING
406
+
407
+ function updateDisplay(cm, changes, viewPort, forced) {
408
+ var oldFrom = cm.display.showingFrom, oldTo = cm.display.showingTo, updated;
409
+ var visible = visibleLines(cm.display, cm.doc, viewPort);
410
+ for (;;) {
411
+ if (!updateDisplayInner(cm, changes, visible, forced)) break;
412
+ forced = false;
413
+ updated = true;
414
+ updateSelection(cm);
415
+ updateScrollbars(cm);
416
+
417
+ // Clip forced viewport to actual scrollable area
418
+ if (viewPort)
419
+ viewPort = Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight,
420
+ typeof viewPort == "number" ? viewPort : viewPort.top);
421
+ visible = visibleLines(cm.display, cm.doc, viewPort);
422
+ if (visible.from >= cm.display.showingFrom && visible.to <= cm.display.showingTo)
423
+ break;
424
+ changes = [];
425
+ }
426
+
427
+ if (updated) {
428
+ signalLater(cm, "update", cm);
429
+ if (cm.display.showingFrom != oldFrom || cm.display.showingTo != oldTo)
430
+ signalLater(cm, "viewportChange", cm, cm.display.showingFrom, cm.display.showingTo);
431
+ }
432
+ return updated;
433
+ }
434
+
435
+ // Uses a set of changes plus the current scroll position to
436
+ // determine which DOM updates have to be made, and makes the
437
+ // updates.
438
+ function updateDisplayInner(cm, changes, visible, forced) {
439
+ var display = cm.display, doc = cm.doc;
440
+ if (!display.wrapper.clientWidth) {
441
+ display.showingFrom = display.showingTo = doc.first;
442
+ display.viewOffset = 0;
443
+ return;
444
+ }
445
+
446
+ // Bail out if the visible area is already rendered and nothing changed.
447
+ if (!forced && changes.length == 0 &&
448
+ visible.from > display.showingFrom && visible.to < display.showingTo)
449
+ return;
450
+
451
+ if (maybeUpdateLineNumberWidth(cm))
452
+ changes = [{from: doc.first, to: doc.first + doc.size}];
453
+ var gutterW = display.sizer.style.marginLeft = display.gutters.offsetWidth + "px";
454
+ display.scrollbarH.style.left = cm.options.fixedGutter ? gutterW : "0";
455
+
456
+ // Used to determine which lines need their line numbers updated
457
+ var positionsChangedFrom = Infinity;
458
+ if (cm.options.lineNumbers)
459
+ for (var i = 0; i < changes.length; ++i)
460
+ if (changes[i].diff) { positionsChangedFrom = changes[i].from; break; }
461
+
462
+ var end = doc.first + doc.size;
463
+ var from = Math.max(visible.from - cm.options.viewportMargin, doc.first);
464
+ var to = Math.min(end, visible.to + cm.options.viewportMargin);
465
+ if (display.showingFrom < from && from - display.showingFrom < 20) from = Math.max(doc.first, display.showingFrom);
466
+ if (display.showingTo > to && display.showingTo - to < 20) to = Math.min(end, display.showingTo);
467
+ if (sawCollapsedSpans) {
468
+ from = lineNo(visualLine(doc, getLine(doc, from)));
469
+ while (to < end && lineIsHidden(doc, getLine(doc, to))) ++to;
470
+ }
471
+
472
+ // Create a range of theoretically intact lines, and punch holes
473
+ // in that using the change info.
474
+ var intact = [{from: Math.max(display.showingFrom, doc.first),
475
+ to: Math.min(display.showingTo, end)}];
476
+ if (intact[0].from >= intact[0].to) intact = [];
477
+ else intact = computeIntact(intact, changes);
478
+ // When merged lines are present, we might have to reduce the
479
+ // intact ranges because changes in continued fragments of the
480
+ // intact lines do require the lines to be redrawn.
481
+ if (sawCollapsedSpans)
482
+ for (var i = 0; i < intact.length; ++i) {
483
+ var range = intact[i], merged;
484
+ while (merged = collapsedSpanAtEnd(getLine(doc, range.to - 1))) {
485
+ var newTo = merged.find().from.line;
486
+ if (newTo > range.from) range.to = newTo;
487
+ else { intact.splice(i--, 1); break; }
488
+ }
489
+ }
490
+
491
+ // Clip off the parts that won't be visible
492
+ var intactLines = 0;
493
+ for (var i = 0; i < intact.length; ++i) {
494
+ var range = intact[i];
495
+ if (range.from < from) range.from = from;
496
+ if (range.to > to) range.to = to;
497
+ if (range.from >= range.to) intact.splice(i--, 1);
498
+ else intactLines += range.to - range.from;
499
+ }
500
+ if (!forced && intactLines == to - from && from == display.showingFrom && to == display.showingTo) {
501
+ updateViewOffset(cm);
502
+ return;
503
+ }
504
+ intact.sort(function(a, b) {return a.from - b.from;});
505
+
506
+ // Avoid crashing on IE's "unspecified error" when in iframes
507
+ try {
508
+ var focused = document.activeElement;
509
+ } catch(e) {}
510
+ if (intactLines < (to - from) * .7) display.lineDiv.style.display = "none";
511
+ patchDisplay(cm, from, to, intact, positionsChangedFrom);
512
+ display.lineDiv.style.display = "";
513
+ if (focused && document.activeElement != focused && focused.offsetHeight) focused.focus();
514
+
515
+ var different = from != display.showingFrom || to != display.showingTo ||
516
+ display.lastSizeC != display.wrapper.clientHeight;
517
+ // This is just a bogus formula that detects when the editor is
518
+ // resized or the font size changes.
519
+ if (different) {
520
+ display.lastSizeC = display.wrapper.clientHeight;
521
+ startWorker(cm, 400);
522
+ }
523
+ display.showingFrom = from; display.showingTo = to;
524
+
525
+ updateHeightsInViewport(cm);
526
+ updateViewOffset(cm);
527
+
528
+ return true;
529
+ }
530
+
531
+ function updateHeightsInViewport(cm) {
532
+ var display = cm.display;
533
+ var prevBottom = display.lineDiv.offsetTop;
534
+ for (var node = display.lineDiv.firstChild, height; node; node = node.nextSibling) if (node.lineObj) {
535
+ if (ie_lt8) {
536
+ var bot = node.offsetTop + node.offsetHeight;
537
+ height = bot - prevBottom;
538
+ prevBottom = bot;
539
+ } else {
540
+ var box = getRect(node);
541
+ height = box.bottom - box.top;
542
+ }
543
+ var diff = node.lineObj.height - height;
544
+ if (height < 2) height = textHeight(display);
545
+ if (diff > .001 || diff < -.001) {
546
+ updateLineHeight(node.lineObj, height);
547
+ var widgets = node.lineObj.widgets;
548
+ if (widgets) for (var i = 0; i < widgets.length; ++i)
549
+ widgets[i].height = widgets[i].node.offsetHeight;
550
+ }
551
+ }
552
+ }
553
+
554
+ function updateViewOffset(cm) {
555
+ var off = cm.display.viewOffset = heightAtLine(cm, getLine(cm.doc, cm.display.showingFrom));
556
+ // Position the mover div to align with the current virtual scroll position
557
+ cm.display.mover.style.top = off + "px";
558
+ }
559
+
560
+ function computeIntact(intact, changes) {
561
+ for (var i = 0, l = changes.length || 0; i < l; ++i) {
562
+ var change = changes[i], intact2 = [], diff = change.diff || 0;
563
+ for (var j = 0, l2 = intact.length; j < l2; ++j) {
564
+ var range = intact[j];
565
+ if (change.to <= range.from && change.diff) {
566
+ intact2.push({from: range.from + diff, to: range.to + diff});
567
+ } else if (change.to <= range.from || change.from >= range.to) {
568
+ intact2.push(range);
569
+ } else {
570
+ if (change.from > range.from)
571
+ intact2.push({from: range.from, to: change.from});
572
+ if (change.to < range.to)
573
+ intact2.push({from: change.to + diff, to: range.to + diff});
574
+ }
575
+ }
576
+ intact = intact2;
577
+ }
578
+ return intact;
579
+ }
580
+
581
+ function getDimensions(cm) {
582
+ var d = cm.display, left = {}, width = {};
583
+ for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {
584
+ left[cm.options.gutters[i]] = n.offsetLeft;
585
+ width[cm.options.gutters[i]] = n.offsetWidth;
586
+ }
587
+ return {fixedPos: compensateForHScroll(d),
588
+ gutterTotalWidth: d.gutters.offsetWidth,
589
+ gutterLeft: left,
590
+ gutterWidth: width,
591
+ wrapperWidth: d.wrapper.clientWidth};
592
+ }
593
+
594
+ function patchDisplay(cm, from, to, intact, updateNumbersFrom) {
595
+ var dims = getDimensions(cm);
596
+ var display = cm.display, lineNumbers = cm.options.lineNumbers;
597
+ if (!intact.length && (!webkit || !cm.display.currentWheelTarget))
598
+ removeChildren(display.lineDiv);
599
+ var container = display.lineDiv, cur = container.firstChild;
600
+
601
+ function rm(node) {
602
+ var next = node.nextSibling;
603
+ if (webkit && mac && cm.display.currentWheelTarget == node) {
604
+ node.style.display = "none";
605
+ node.lineObj = null;
606
+ } else {
607
+ node.parentNode.removeChild(node);
608
+ }
609
+ return next;
610
+ }
611
+
612
+ var nextIntact = intact.shift(), lineN = from;
613
+ cm.doc.iter(from, to, function(line) {
614
+ if (nextIntact && nextIntact.to == lineN) nextIntact = intact.shift();
615
+ if (lineIsHidden(cm.doc, line)) {
616
+ if (line.height != 0) updateLineHeight(line, 0);
617
+ if (line.widgets && cur.previousSibling) for (var i = 0; i < line.widgets.length; ++i) {
618
+ var w = line.widgets[i];
619
+ if (w.showIfHidden) {
620
+ var prev = cur.previousSibling;
621
+ if (/pre/i.test(prev.nodeName)) {
622
+ var wrap = elt("div", null, null, "position: relative");
623
+ prev.parentNode.replaceChild(wrap, prev);
624
+ wrap.appendChild(prev);
625
+ prev = wrap;
626
+ }
627
+ var wnode = prev.appendChild(elt("div", [w.node], "CodeMirror-linewidget"));
628
+ if (!w.handleMouseEvents) wnode.ignoreEvents = true;
629
+ positionLineWidget(w, wnode, prev, dims);
630
+ }
631
+ }
632
+ } else if (nextIntact && nextIntact.from <= lineN && nextIntact.to > lineN) {
633
+ // This line is intact. Skip to the actual node. Update its
634
+ // line number if needed.
635
+ while (cur.lineObj != line) cur = rm(cur);
636
+ if (lineNumbers && updateNumbersFrom <= lineN && cur.lineNumber)
637
+ setTextContent(cur.lineNumber, lineNumberFor(cm.options, lineN));
638
+ cur = cur.nextSibling;
639
+ } else {
640
+ // For lines with widgets, make an attempt to find and reuse
641
+ // the existing element, so that widgets aren't needlessly
642
+ // removed and re-inserted into the dom
643
+ if (line.widgets) for (var j = 0, search = cur, reuse; search && j < 20; ++j, search = search.nextSibling)
644
+ if (search.lineObj == line && /div/i.test(search.nodeName)) { reuse = search; break; }
645
+ // This line needs to be generated.
646
+ var lineNode = buildLineElement(cm, line, lineN, dims, reuse);
647
+ if (lineNode != reuse) {
648
+ container.insertBefore(lineNode, cur);
649
+ } else {
650
+ while (cur != reuse) cur = rm(cur);
651
+ cur = cur.nextSibling;
652
+ }
653
+
654
+ lineNode.lineObj = line;
655
+ }
656
+ ++lineN;
657
+ });
658
+ while (cur) cur = rm(cur);
659
+ }
660
+
661
+ function buildLineElement(cm, line, lineNo, dims, reuse) {
662
+ var lineElement = lineContent(cm, line);
663
+ var markers = line.gutterMarkers, display = cm.display, wrap;
664
+
665
+ if (!cm.options.lineNumbers && !markers && !line.bgClass && !line.wrapClass && !line.widgets)
666
+ return lineElement;
667
+
668
+ // Lines with gutter elements, widgets or a background class need
669
+ // to be wrapped again, and have the extra elements added to the
670
+ // wrapper div
671
+
672
+ if (reuse) {
673
+ reuse.alignable = null;
674
+ var isOk = true, widgetsSeen = 0, insertBefore = null;
675
+ for (var n = reuse.firstChild, next; n; n = next) {
676
+ next = n.nextSibling;
677
+ if (!/\bCodeMirror-linewidget\b/.test(n.className)) {
678
+ reuse.removeChild(n);
679
+ } else {
680
+ for (var i = 0; i < line.widgets.length; ++i) {
681
+ var widget = line.widgets[i];
682
+ if (widget.node == n.firstChild) {
683
+ if (!widget.above && !insertBefore) insertBefore = n;
684
+ positionLineWidget(widget, n, reuse, dims);
685
+ ++widgetsSeen;
686
+ break;
687
+ }
688
+ }
689
+ if (i == line.widgets.length) { isOk = false; break; }
690
+ }
691
+ }
692
+ reuse.insertBefore(lineElement, insertBefore);
693
+ if (isOk && widgetsSeen == line.widgets.length) {
694
+ wrap = reuse;
695
+ reuse.className = line.wrapClass || "";
696
+ }
697
+ }
698
+ if (!wrap) {
699
+ wrap = elt("div", null, line.wrapClass, "position: relative");
700
+ wrap.appendChild(lineElement);
701
+ }
702
+ // Kludge to make sure the styled element lies behind the selection (by z-index)
703
+ if (line.bgClass)
704
+ wrap.insertBefore(elt("div", null, line.bgClass + " CodeMirror-linebackground"), wrap.firstChild);
705
+ if (cm.options.lineNumbers || markers) {
706
+ var gutterWrap = wrap.insertBefore(elt("div", null, null, "position: absolute; left: " +
707
+ (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px"),
708
+ wrap.firstChild);
709
+ if (cm.options.fixedGutter) (wrap.alignable || (wrap.alignable = [])).push(gutterWrap);
710
+ if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"]))
711
+ wrap.lineNumber = gutterWrap.appendChild(
712
+ elt("div", lineNumberFor(cm.options, lineNo),
713
+ "CodeMirror-linenumber CodeMirror-gutter-elt",
714
+ "left: " + dims.gutterLeft["CodeMirror-linenumbers"] + "px; width: "
715
+ + display.lineNumInnerWidth + "px"));
716
+ if (markers)
717
+ for (var k = 0; k < cm.options.gutters.length; ++k) {
718
+ var id = cm.options.gutters[k], found = markers.hasOwnProperty(id) && markers[id];
719
+ if (found)
720
+ gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", "left: " +
721
+ dims.gutterLeft[id] + "px; width: " + dims.gutterWidth[id] + "px"));
722
+ }
723
+ }
724
+ if (ie_lt8) wrap.style.zIndex = 2;
725
+ if (line.widgets && wrap != reuse) for (var i = 0, ws = line.widgets; i < ws.length; ++i) {
726
+ var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget");
727
+ if (!widget.handleMouseEvents) node.ignoreEvents = true;
728
+ positionLineWidget(widget, node, wrap, dims);
729
+ if (widget.above)
730
+ wrap.insertBefore(node, cm.options.lineNumbers && line.height != 0 ? gutterWrap : lineElement);
731
+ else
732
+ wrap.appendChild(node);
733
+ signalLater(widget, "redraw");
734
+ }
735
+ return wrap;
736
+ }
737
+
738
+ function positionLineWidget(widget, node, wrap, dims) {
739
+ if (widget.noHScroll) {
740
+ (wrap.alignable || (wrap.alignable = [])).push(node);
741
+ var width = dims.wrapperWidth;
742
+ node.style.left = dims.fixedPos + "px";
743
+ if (!widget.coverGutter) {
744
+ width -= dims.gutterTotalWidth;
745
+ node.style.paddingLeft = dims.gutterTotalWidth + "px";
746
+ }
747
+ node.style.width = width + "px";
748
+ }
749
+ if (widget.coverGutter) {
750
+ node.style.zIndex = 5;
751
+ node.style.position = "relative";
752
+ if (!widget.noHScroll) node.style.marginLeft = -dims.gutterTotalWidth + "px";
753
+ }
754
+ }
755
+
756
+ // SELECTION / CURSOR
757
+
758
+ function updateSelection(cm) {
759
+ var display = cm.display;
760
+ var collapsed = posEq(cm.doc.sel.from, cm.doc.sel.to);
761
+ if (collapsed || cm.options.showCursorWhenSelecting)
762
+ updateSelectionCursor(cm);
763
+ else
764
+ display.cursor.style.display = display.otherCursor.style.display = "none";
765
+ if (!collapsed)
766
+ updateSelectionRange(cm);
767
+ else
768
+ display.selectionDiv.style.display = "none";
769
+
770
+ // Move the hidden textarea near the cursor to prevent scrolling artifacts
771
+ if (cm.options.moveInputWithCursor) {
772
+ var headPos = cursorCoords(cm, cm.doc.sel.head, "div");
773
+ var wrapOff = getRect(display.wrapper), lineOff = getRect(display.lineDiv);
774
+ display.inputDiv.style.top = Math.max(0, Math.min(display.wrapper.clientHeight - 10,
775
+ headPos.top + lineOff.top - wrapOff.top)) + "px";
776
+ display.inputDiv.style.left = Math.max(0, Math.min(display.wrapper.clientWidth - 10,
777
+ headPos.left + lineOff.left - wrapOff.left)) + "px";
778
+ }
779
+ }
780
+
781
+ // No selection, plain cursor
782
+ function updateSelectionCursor(cm) {
783
+ var display = cm.display, pos = cursorCoords(cm, cm.doc.sel.head, "div");
784
+ display.cursor.style.left = pos.left + "px";
785
+ display.cursor.style.top = pos.top + "px";
786
+ display.cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px";
787
+ display.cursor.style.display = "";
788
+
789
+ if (pos.other) {
790
+ display.otherCursor.style.display = "";
791
+ display.otherCursor.style.left = pos.other.left + "px";
792
+ display.otherCursor.style.top = pos.other.top + "px";
793
+ display.otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px";
794
+ } else { display.otherCursor.style.display = "none"; }
795
+ }
796
+
797
+ // Highlight selection
798
+ function updateSelectionRange(cm) {
799
+ var display = cm.display, doc = cm.doc, sel = cm.doc.sel;
800
+ var fragment = document.createDocumentFragment();
801
+ var clientWidth = display.lineSpace.offsetWidth, pl = paddingLeft(cm.display);
802
+
803
+ function add(left, top, width, bottom) {
804
+ if (top < 0) top = 0;
805
+ fragment.appendChild(elt("div", null, "CodeMirror-selected", "position: absolute; left: " + left +
806
+ "px; top: " + top + "px; width: " + (width == null ? clientWidth - left : width) +
807
+ "px; height: " + (bottom - top) + "px"));
808
+ }
809
+
810
+ function drawForLine(line, fromArg, toArg) {
811
+ var lineObj = getLine(doc, line);
812
+ var lineLen = lineObj.text.length;
813
+ var start, end;
814
+ function coords(ch, bias) {
815
+ return charCoords(cm, Pos(line, ch), "div", lineObj, bias);
816
+ }
817
+
818
+ iterateBidiSections(getOrder(lineObj), fromArg || 0, toArg == null ? lineLen : toArg, function(from, to, dir) {
819
+ var leftPos = coords(from, "left"), rightPos, left, right;
820
+ if (from == to) {
821
+ rightPos = leftPos;
822
+ left = right = leftPos.left;
823
+ } else {
824
+ rightPos = coords(to - 1, "right");
825
+ if (dir == "rtl") { var tmp = leftPos; leftPos = rightPos; rightPos = tmp; }
826
+ left = leftPos.left;
827
+ right = rightPos.right;
828
+ }
829
+ if (fromArg == null && from == 0) left = pl;
830
+ if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part
831
+ add(left, leftPos.top, null, leftPos.bottom);
832
+ left = pl;
833
+ if (leftPos.bottom < rightPos.top) add(left, leftPos.bottom, null, rightPos.top);
834
+ }
835
+ if (toArg == null && to == lineLen) right = clientWidth;
836
+ if (!start || leftPos.top < start.top || leftPos.top == start.top && leftPos.left < start.left)
837
+ start = leftPos;
838
+ if (!end || rightPos.bottom > end.bottom || rightPos.bottom == end.bottom && rightPos.right > end.right)
839
+ end = rightPos;
840
+ if (left < pl + 1) left = pl;
841
+ add(left, rightPos.top, right - left, rightPos.bottom);
842
+ });
843
+ return {start: start, end: end};
844
+ }
845
+
846
+ if (sel.from.line == sel.to.line) {
847
+ drawForLine(sel.from.line, sel.from.ch, sel.to.ch);
848
+ } else {
849
+ var fromLine = getLine(doc, sel.from.line), toLine = getLine(doc, sel.to.line);
850
+ var singleVLine = visualLine(doc, fromLine) == visualLine(doc, toLine);
851
+ var leftEnd = drawForLine(sel.from.line, sel.from.ch, singleVLine ? fromLine.text.length : null).end;
852
+ var rightStart = drawForLine(sel.to.line, singleVLine ? 0 : null, sel.to.ch).start;
853
+ if (singleVLine) {
854
+ if (leftEnd.top < rightStart.top - 2) {
855
+ add(leftEnd.right, leftEnd.top, null, leftEnd.bottom);
856
+ add(pl, rightStart.top, rightStart.left, rightStart.bottom);
857
+ } else {
858
+ add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom);
859
+ }
860
+ }
861
+ if (leftEnd.bottom < rightStart.top)
862
+ add(pl, leftEnd.bottom, null, rightStart.top);
863
+ }
864
+
865
+ removeChildrenAndAdd(display.selectionDiv, fragment);
866
+ display.selectionDiv.style.display = "";
867
+ }
868
+
869
+ // Cursor-blinking
870
+ function restartBlink(cm) {
871
+ if (!cm.state.focused) return;
872
+ var display = cm.display;
873
+ clearInterval(display.blinker);
874
+ var on = true;
875
+ display.cursor.style.visibility = display.otherCursor.style.visibility = "";
876
+ display.blinker = setInterval(function() {
877
+ display.cursor.style.visibility = display.otherCursor.style.visibility = (on = !on) ? "" : "hidden";
878
+ }, cm.options.cursorBlinkRate);
879
+ }
880
+
881
+ // HIGHLIGHT WORKER
882
+
883
+ function startWorker(cm, time) {
884
+ if (cm.doc.mode.startState && cm.doc.frontier < cm.display.showingTo)
885
+ cm.state.highlight.set(time, bind(highlightWorker, cm));
886
+ }
887
+
888
+ function highlightWorker(cm) {
889
+ var doc = cm.doc;
890
+ if (doc.frontier < doc.first) doc.frontier = doc.first;
891
+ if (doc.frontier >= cm.display.showingTo) return;
892
+ var end = +new Date + cm.options.workTime;
893
+ var state = copyState(doc.mode, getStateBefore(cm, doc.frontier));
894
+ var changed = [], prevChange;
895
+ doc.iter(doc.frontier, Math.min(doc.first + doc.size, cm.display.showingTo + 500), function(line) {
896
+ if (doc.frontier >= cm.display.showingFrom) { // Visible
897
+ var oldStyles = line.styles;
898
+ line.styles = highlightLine(cm, line, state);
899
+ var ischange = !oldStyles || oldStyles.length != line.styles.length;
900
+ for (var i = 0; !ischange && i < oldStyles.length; ++i) ischange = oldStyles[i] != line.styles[i];
901
+ if (ischange) {
902
+ if (prevChange && prevChange.end == doc.frontier) prevChange.end++;
903
+ else changed.push(prevChange = {start: doc.frontier, end: doc.frontier + 1});
904
+ }
905
+ line.stateAfter = copyState(doc.mode, state);
906
+ } else {
907
+ processLine(cm, line, state);
908
+ line.stateAfter = doc.frontier % 5 == 0 ? copyState(doc.mode, state) : null;
909
+ }
910
+ ++doc.frontier;
911
+ if (+new Date > end) {
912
+ startWorker(cm, cm.options.workDelay);
913
+ return true;
914
+ }
915
+ });
916
+ if (changed.length)
917
+ operation(cm, function() {
918
+ for (var i = 0; i < changed.length; ++i)
919
+ regChange(this, changed[i].start, changed[i].end);
920
+ })();
921
+ }
922
+
923
+ // Finds the line to start with when starting a parse. Tries to
924
+ // find a line with a stateAfter, so that it can start with a
925
+ // valid state. If that fails, it returns the line with the
926
+ // smallest indentation, which tends to need the least context to
927
+ // parse correctly.
928
+ function findStartLine(cm, n, precise) {
929
+ var minindent, minline, doc = cm.doc;
930
+ for (var search = n, lim = n - 100; search > lim; --search) {
931
+ if (search <= doc.first) return doc.first;
932
+ var line = getLine(doc, search - 1);
933
+ if (line.stateAfter && (!precise || search <= doc.frontier)) return search;
934
+ var indented = countColumn(line.text, null, cm.options.tabSize);
935
+ if (minline == null || minindent > indented) {
936
+ minline = search - 1;
937
+ minindent = indented;
938
+ }
939
+ }
940
+ return minline;
941
+ }
942
+
943
+ function getStateBefore(cm, n, precise) {
944
+ var doc = cm.doc, display = cm.display;
945
+ if (!doc.mode.startState) return true;
946
+ var pos = findStartLine(cm, n, precise), state = pos > doc.first && getLine(doc, pos-1).stateAfter;
947
+ if (!state) state = startState(doc.mode);
948
+ else state = copyState(doc.mode, state);
949
+ doc.iter(pos, n, function(line) {
950
+ processLine(cm, line, state);
951
+ var save = pos == n - 1 || pos % 5 == 0 || pos >= display.showingFrom && pos < display.showingTo;
952
+ line.stateAfter = save ? copyState(doc.mode, state) : null;
953
+ ++pos;
954
+ });
955
+ return state;
956
+ }
957
+
958
+ // POSITION MEASUREMENT
959
+
960
+ function paddingTop(display) {return display.lineSpace.offsetTop;}
961
+ function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight;}
962
+ function paddingLeft(display) {
963
+ var e = removeChildrenAndAdd(display.measure, elt("pre", null, null, "text-align: left")).appendChild(elt("span", "x"));
964
+ return e.offsetLeft;
965
+ }
966
+
967
+ function measureChar(cm, line, ch, data, bias) {
968
+ var dir = -1;
969
+ data = data || measureLine(cm, line);
970
+
971
+ for (var pos = ch;; pos += dir) {
972
+ var r = data[pos];
973
+ if (r) break;
974
+ if (dir < 0 && pos == 0) dir = 1;
975
+ }
976
+ bias = pos > ch ? "left" : pos < ch ? "right" : bias;
977
+ if (bias == "left" && r.leftSide) r = r.leftSide;
978
+ else if (bias == "right" && r.rightSide) r = r.rightSide;
979
+ return {left: pos < ch ? r.right : r.left,
980
+ right: pos > ch ? r.left : r.right,
981
+ top: r.top,
982
+ bottom: r.bottom};
983
+ }
984
+
985
+ function findCachedMeasurement(cm, line) {
986
+ var cache = cm.display.measureLineCache;
987
+ for (var i = 0; i < cache.length; ++i) {
988
+ var memo = cache[i];
989
+ if (memo.text == line.text && memo.markedSpans == line.markedSpans &&
990
+ cm.display.scroller.clientWidth == memo.width &&
991
+ memo.classes == line.textClass + "|" + line.bgClass + "|" + line.wrapClass)
992
+ return memo;
993
+ }
994
+ }
995
+
996
+ function clearCachedMeasurement(cm, line) {
997
+ var exists = findCachedMeasurement(cm, line);
998
+ if (exists) exists.text = exists.measure = exists.markedSpans = null;
999
+ }
1000
+
1001
+ function measureLine(cm, line) {
1002
+ // First look in the cache
1003
+ var cached = findCachedMeasurement(cm, line);
1004
+ if (cached) return cached.measure;
1005
+
1006
+ // Failing that, recompute and store result in cache
1007
+ var measure = measureLineInner(cm, line);
1008
+ var cache = cm.display.measureLineCache;
1009
+ var memo = {text: line.text, width: cm.display.scroller.clientWidth,
1010
+ markedSpans: line.markedSpans, measure: measure,
1011
+ classes: line.textClass + "|" + line.bgClass + "|" + line.wrapClass};
1012
+ if (cache.length == 16) cache[++cm.display.measureLineCachePos % 16] = memo;
1013
+ else cache.push(memo);
1014
+ return measure;
1015
+ }
1016
+
1017
+ function measureLineInner(cm, line) {
1018
+ var display = cm.display, measure = emptyArray(line.text.length);
1019
+ var pre = lineContent(cm, line, measure, true);
1020
+
1021
+ // IE does not cache element positions of inline elements between
1022
+ // calls to getBoundingClientRect. This makes the loop below,
1023
+ // which gathers the positions of all the characters on the line,
1024
+ // do an amount of layout work quadratic to the number of
1025
+ // characters. When line wrapping is off, we try to improve things
1026
+ // by first subdividing the line into a bunch of inline blocks, so
1027
+ // that IE can reuse most of the layout information from caches
1028
+ // for those blocks. This does interfere with line wrapping, so it
1029
+ // doesn't work when wrapping is on, but in that case the
1030
+ // situation is slightly better, since IE does cache line-wrapping
1031
+ // information and only recomputes per-line.
1032
+ if (ie && !ie_lt8 && !cm.options.lineWrapping && pre.childNodes.length > 100) {
1033
+ var fragment = document.createDocumentFragment();
1034
+ var chunk = 10, n = pre.childNodes.length;
1035
+ for (var i = 0, chunks = Math.ceil(n / chunk); i < chunks; ++i) {
1036
+ var wrap = elt("div", null, null, "display: inline-block");
1037
+ for (var j = 0; j < chunk && n; ++j) {
1038
+ wrap.appendChild(pre.firstChild);
1039
+ --n;
1040
+ }
1041
+ fragment.appendChild(wrap);
1042
+ }
1043
+ pre.appendChild(fragment);
1044
+ }
1045
+
1046
+ removeChildrenAndAdd(display.measure, pre);
1047
+
1048
+ var outer = getRect(display.lineDiv);
1049
+ var vranges = [], data = emptyArray(line.text.length), maxBot = pre.offsetHeight;
1050
+ // Work around an IE7/8 bug where it will sometimes have randomly
1051
+ // replaced our pre with a clone at this point.
1052
+ if (ie_lt9 && display.measure.first != pre)
1053
+ removeChildrenAndAdd(display.measure, pre);
1054
+
1055
+ function measureRect(rect) {
1056
+ var top = rect.top - outer.top, bot = rect.bottom - outer.top;
1057
+ if (bot > maxBot) bot = maxBot;
1058
+ if (top < 0) top = 0;
1059
+ for (var i = vranges.length - 2; i >= 0; i -= 2) {
1060
+ var rtop = vranges[i], rbot = vranges[i+1];
1061
+ if (rtop > bot || rbot < top) continue;
1062
+ if (rtop <= top && rbot >= bot ||
1063
+ top <= rtop && bot >= rbot ||
1064
+ Math.min(bot, rbot) - Math.max(top, rtop) >= (bot - top) >> 1) {
1065
+ vranges[i] = Math.min(top, rtop);
1066
+ vranges[i+1] = Math.max(bot, rbot);
1067
+ break;
1068
+ }
1069
+ }
1070
+ if (i < 0) { i = vranges.length; vranges.push(top, bot); }
1071
+ return {left: rect.left - outer.left,
1072
+ right: rect.right - outer.left,
1073
+ top: i, bottom: null};
1074
+ }
1075
+ function finishRect(rect) {
1076
+ rect.bottom = vranges[rect.top+1];
1077
+ rect.top = vranges[rect.top];
1078
+ }
1079
+
1080
+ for (var i = 0, cur; i < measure.length; ++i) if (cur = measure[i]) {
1081
+ var node = cur, rect = null;
1082
+ // A widget might wrap, needs special care
1083
+ if (/\bCodeMirror-widget\b/.test(cur.className) && cur.getClientRects) {
1084
+ if (cur.firstChild.nodeType == 1) node = cur.firstChild;
1085
+ var rects = node.getClientRects();
1086
+ if (rects.length > 1) {
1087
+ rect = data[i] = measureRect(rects[0]);
1088
+ rect.rightSide = measureRect(rects[rects.length - 1]);
1089
+ }
1090
+ }
1091
+ if (!rect) rect = data[i] = measureRect(getRect(node));
1092
+ if (cur.measureRight) rect.right = getRect(cur.measureRight).left;
1093
+ if (cur.leftSide) rect.leftSide = measureRect(getRect(cur.leftSide));
1094
+ }
1095
+ for (var i = 0, cur; i < data.length; ++i) if (cur = data[i]) {
1096
+ finishRect(cur);
1097
+ if (cur.leftSide) finishRect(cur.leftSide);
1098
+ if (cur.rightSide) finishRect(cur.rightSide);
1099
+ }
1100
+ return data;
1101
+ }
1102
+
1103
+ function measureLineWidth(cm, line) {
1104
+ var hasBadSpan = false;
1105
+ if (line.markedSpans) for (var i = 0; i < line.markedSpans; ++i) {
1106
+ var sp = line.markedSpans[i];
1107
+ if (sp.collapsed && (sp.to == null || sp.to == line.text.length)) hasBadSpan = true;
1108
+ }
1109
+ var cached = !hasBadSpan && findCachedMeasurement(cm, line);
1110
+ if (cached) return measureChar(cm, line, line.text.length, cached.measure, "right").right;
1111
+
1112
+ var pre = lineContent(cm, line, null, true);
1113
+ var end = pre.appendChild(zeroWidthElement(cm.display.measure));
1114
+ removeChildrenAndAdd(cm.display.measure, pre);
1115
+ return getRect(end).right - getRect(cm.display.lineDiv).left;
1116
+ }
1117
+
1118
+ function clearCaches(cm) {
1119
+ cm.display.measureLineCache.length = cm.display.measureLineCachePos = 0;
1120
+ cm.display.cachedCharWidth = cm.display.cachedTextHeight = null;
1121
+ if (!cm.options.lineWrapping) cm.display.maxLineChanged = true;
1122
+ cm.display.lineNumChars = null;
1123
+ }
1124
+
1125
+ function pageScrollX() { return window.pageXOffset || (document.documentElement || document.body).scrollLeft; }
1126
+ function pageScrollY() { return window.pageYOffset || (document.documentElement || document.body).scrollTop; }
1127
+
1128
+ // Context is one of "line", "div" (display.lineDiv), "local"/null (editor), or "page"
1129
+ function intoCoordSystem(cm, lineObj, rect, context) {
1130
+ if (lineObj.widgets) for (var i = 0; i < lineObj.widgets.length; ++i) if (lineObj.widgets[i].above) {
1131
+ var size = widgetHeight(lineObj.widgets[i]);
1132
+ rect.top += size; rect.bottom += size;
1133
+ }
1134
+ if (context == "line") return rect;
1135
+ if (!context) context = "local";
1136
+ var yOff = heightAtLine(cm, lineObj);
1137
+ if (context == "local") yOff += paddingTop(cm.display);
1138
+ else yOff -= cm.display.viewOffset;
1139
+ if (context == "page" || context == "window") {
1140
+ var lOff = getRect(cm.display.lineSpace);
1141
+ yOff += lOff.top + (context == "window" ? 0 : pageScrollY());
1142
+ var xOff = lOff.left + (context == "window" ? 0 : pageScrollX());
1143
+ rect.left += xOff; rect.right += xOff;
1144
+ }
1145
+ rect.top += yOff; rect.bottom += yOff;
1146
+ return rect;
1147
+ }
1148
+
1149
+ // Context may be "window", "page", "div", or "local"/null
1150
+ // Result is in "div" coords
1151
+ function fromCoordSystem(cm, coords, context) {
1152
+ if (context == "div") return coords;
1153
+ var left = coords.left, top = coords.top;
1154
+ // First move into "page" coordinate system
1155
+ if (context == "page") {
1156
+ left -= pageScrollX();
1157
+ top -= pageScrollY();
1158
+ } else if (context == "local" || !context) {
1159
+ var localBox = getRect(cm.display.sizer);
1160
+ left += localBox.left;
1161
+ top += localBox.top;
1162
+ }
1163
+
1164
+ var lineSpaceBox = getRect(cm.display.lineSpace);
1165
+ return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top};
1166
+ }
1167
+
1168
+ function charCoords(cm, pos, context, lineObj, bias) {
1169
+ if (!lineObj) lineObj = getLine(cm.doc, pos.line);
1170
+ return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, null, bias), context);
1171
+ }
1172
+
1173
+ function cursorCoords(cm, pos, context, lineObj, measurement) {
1174
+ lineObj = lineObj || getLine(cm.doc, pos.line);
1175
+ if (!measurement) measurement = measureLine(cm, lineObj);
1176
+ function get(ch, right) {
1177
+ var m = measureChar(cm, lineObj, ch, measurement, right ? "right" : "left");
1178
+ if (right) m.left = m.right; else m.right = m.left;
1179
+ return intoCoordSystem(cm, lineObj, m, context);
1180
+ }
1181
+ function getBidi(ch, partPos) {
1182
+ var part = order[partPos], right = part.level % 2;
1183
+ if (ch == bidiLeft(part) && partPos && part.level < order[partPos - 1].level) {
1184
+ part = order[--partPos];
1185
+ ch = bidiRight(part) - (part.level % 2 ? 0 : 1);
1186
+ right = true;
1187
+ } else if (ch == bidiRight(part) && partPos < order.length - 1 && part.level < order[partPos + 1].level) {
1188
+ part = order[++partPos];
1189
+ ch = bidiLeft(part) - part.level % 2;
1190
+ right = false;
1191
+ }
1192
+ if (right && ch == part.to && ch > part.from) return get(ch - 1);
1193
+ return get(ch, right);
1194
+ }
1195
+ var order = getOrder(lineObj), ch = pos.ch;
1196
+ if (!order) return get(ch);
1197
+ var partPos = getBidiPartAt(order, ch);
1198
+ var val = getBidi(ch, partPos);
1199
+ if (bidiOther != null) val.other = getBidi(ch, bidiOther);
1200
+ return val;
1201
+ }
1202
+
1203
+ function PosWithInfo(line, ch, outside, xRel) {
1204
+ var pos = new Pos(line, ch);
1205
+ pos.xRel = xRel;
1206
+ if (outside) pos.outside = true;
1207
+ return pos;
1208
+ }
1209
+
1210
+ // Coords must be lineSpace-local
1211
+ function coordsChar(cm, x, y) {
1212
+ var doc = cm.doc;
1213
+ y += cm.display.viewOffset;
1214
+ if (y < 0) return PosWithInfo(doc.first, 0, true, -1);
1215
+ var lineNo = lineAtHeight(doc, y), last = doc.first + doc.size - 1;
1216
+ if (lineNo > last)
1217
+ return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, true, 1);
1218
+ if (x < 0) x = 0;
1219
+
1220
+ for (;;) {
1221
+ var lineObj = getLine(doc, lineNo);
1222
+ var found = coordsCharInner(cm, lineObj, lineNo, x, y);
1223
+ var merged = collapsedSpanAtEnd(lineObj);
1224
+ var mergedPos = merged && merged.find();
1225
+ if (merged && (found.ch > mergedPos.from.ch || found.ch == mergedPos.from.ch && found.xRel > 0))
1226
+ lineNo = mergedPos.to.line;
1227
+ else
1228
+ return found;
1229
+ }
1230
+ }
1231
+
1232
+ function coordsCharInner(cm, lineObj, lineNo, x, y) {
1233
+ var innerOff = y - heightAtLine(cm, lineObj);
1234
+ var wrongLine = false, adjust = 2 * cm.display.wrapper.clientWidth;
1235
+ var measurement = measureLine(cm, lineObj);
1236
+
1237
+ function getX(ch) {
1238
+ var sp = cursorCoords(cm, Pos(lineNo, ch), "line",
1239
+ lineObj, measurement);
1240
+ wrongLine = true;
1241
+ if (innerOff > sp.bottom) return sp.left - adjust;
1242
+ else if (innerOff < sp.top) return sp.left + adjust;
1243
+ else wrongLine = false;
1244
+ return sp.left;
1245
+ }
1246
+
1247
+ var bidi = getOrder(lineObj), dist = lineObj.text.length;
1248
+ var from = lineLeft(lineObj), to = lineRight(lineObj);
1249
+ var fromX = getX(from), fromOutside = wrongLine, toX = getX(to), toOutside = wrongLine;
1250
+
1251
+ if (x > toX) return PosWithInfo(lineNo, to, toOutside, 1);
1252
+ // Do a binary search between these bounds.
1253
+ for (;;) {
1254
+ if (bidi ? to == from || to == moveVisually(lineObj, from, 1) : to - from <= 1) {
1255
+ var ch = x < fromX || x - fromX <= toX - x ? from : to;
1256
+ var xDiff = x - (ch == from ? fromX : toX);
1257
+ while (isExtendingChar.test(lineObj.text.charAt(ch))) ++ch;
1258
+ var pos = PosWithInfo(lineNo, ch, ch == from ? fromOutside : toOutside,
1259
+ xDiff < 0 ? -1 : xDiff ? 1 : 0);
1260
+ return pos;
1261
+ }
1262
+ var step = Math.ceil(dist / 2), middle = from + step;
1263
+ if (bidi) {
1264
+ middle = from;
1265
+ for (var i = 0; i < step; ++i) middle = moveVisually(lineObj, middle, 1);
1266
+ }
1267
+ var middleX = getX(middle);
1268
+ if (middleX > x) {to = middle; toX = middleX; if (toOutside = wrongLine) toX += 1000; dist = step;}
1269
+ else {from = middle; fromX = middleX; fromOutside = wrongLine; dist -= step;}
1270
+ }
1271
+ }
1272
+
1273
+ var measureText;
1274
+ function textHeight(display) {
1275
+ if (display.cachedTextHeight != null) return display.cachedTextHeight;
1276
+ if (measureText == null) {
1277
+ measureText = elt("pre");
1278
+ // Measure a bunch of lines, for browsers that compute
1279
+ // fractional heights.
1280
+ for (var i = 0; i < 49; ++i) {
1281
+ measureText.appendChild(document.createTextNode("x"));
1282
+ measureText.appendChild(elt("br"));
1283
+ }
1284
+ measureText.appendChild(document.createTextNode("x"));
1285
+ }
1286
+ removeChildrenAndAdd(display.measure, measureText);
1287
+ var height = measureText.offsetHeight / 50;
1288
+ if (height > 3) display.cachedTextHeight = height;
1289
+ removeChildren(display.measure);
1290
+ return height || 1;
1291
+ }
1292
+
1293
+ function charWidth(display) {
1294
+ if (display.cachedCharWidth != null) return display.cachedCharWidth;
1295
+ var anchor = elt("span", "x");
1296
+ var pre = elt("pre", [anchor]);
1297
+ removeChildrenAndAdd(display.measure, pre);
1298
+ var width = anchor.offsetWidth;
1299
+ if (width > 2) display.cachedCharWidth = width;
1300
+ return width || 10;
1301
+ }
1302
+
1303
+ // OPERATIONS
1304
+
1305
+ // Operations are used to wrap changes in such a way that each
1306
+ // change won't have to update the cursor and display (which would
1307
+ // be awkward, slow, and error-prone), but instead updates are
1308
+ // batched and then all combined and executed at once.
1309
+
1310
+ var nextOpId = 0;
1311
+ function startOperation(cm) {
1312
+ cm.curOp = {
1313
+ // An array of ranges of lines that have to be updated. See
1314
+ // updateDisplay.
1315
+ changes: [],
1316
+ forceUpdate: false,
1317
+ updateInput: null,
1318
+ userSelChange: null,
1319
+ textChanged: null,
1320
+ selectionChanged: false,
1321
+ cursorActivity: false,
1322
+ updateMaxLine: false,
1323
+ updateScrollPos: false,
1324
+ id: ++nextOpId
1325
+ };
1326
+ if (!delayedCallbackDepth++) delayedCallbacks = [];
1327
+ }
1328
+
1329
+ function endOperation(cm) {
1330
+ var op = cm.curOp, doc = cm.doc, display = cm.display;
1331
+ cm.curOp = null;
1332
+
1333
+ if (op.updateMaxLine) computeMaxLength(cm);
1334
+ if (display.maxLineChanged && !cm.options.lineWrapping && display.maxLine) {
1335
+ var width = measureLineWidth(cm, display.maxLine);
1336
+ display.sizer.style.minWidth = Math.max(0, width + 3 + scrollerCutOff) + "px";
1337
+ display.maxLineChanged = false;
1338
+ var maxScrollLeft = Math.max(0, display.sizer.offsetLeft + display.sizer.offsetWidth - display.scroller.clientWidth);
1339
+ if (maxScrollLeft < doc.scrollLeft && !op.updateScrollPos)
1340
+ setScrollLeft(cm, Math.min(display.scroller.scrollLeft, maxScrollLeft), true);
1341
+ }
1342
+ var newScrollPos, updated;
1343
+ if (op.updateScrollPos) {
1344
+ newScrollPos = op.updateScrollPos;
1345
+ } else if (op.selectionChanged && display.scroller.clientHeight) { // don't rescroll if not visible
1346
+ var coords = cursorCoords(cm, doc.sel.head);
1347
+ newScrollPos = calculateScrollPos(cm, coords.left, coords.top, coords.left, coords.bottom);
1348
+ }
1349
+ if (op.changes.length || op.forceUpdate || newScrollPos && newScrollPos.scrollTop != null) {
1350
+ updated = updateDisplay(cm, op.changes, newScrollPos && newScrollPos.scrollTop, op.forceUpdate);
1351
+ if (cm.display.scroller.offsetHeight) cm.doc.scrollTop = cm.display.scroller.scrollTop;
1352
+ }
1353
+ if (!updated && op.selectionChanged) updateSelection(cm);
1354
+ if (op.updateScrollPos) {
1355
+ display.scroller.scrollTop = display.scrollbarV.scrollTop = doc.scrollTop = newScrollPos.scrollTop;
1356
+ display.scroller.scrollLeft = display.scrollbarH.scrollLeft = doc.scrollLeft = newScrollPos.scrollLeft;
1357
+ alignHorizontally(cm);
1358
+ if (op.scrollToPos)
1359
+ scrollPosIntoView(cm, clipPos(cm.doc, op.scrollToPos), op.scrollToPosMargin);
1360
+ } else if (newScrollPos) {
1361
+ scrollCursorIntoView(cm);
1362
+ }
1363
+ if (op.selectionChanged) restartBlink(cm);
1364
+
1365
+ if (cm.state.focused && op.updateInput)
1366
+ resetInput(cm, op.userSelChange);
1367
+
1368
+ var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers;
1369
+ if (hidden) for (var i = 0; i < hidden.length; ++i)
1370
+ if (!hidden[i].lines.length) signal(hidden[i], "hide");
1371
+ if (unhidden) for (var i = 0; i < unhidden.length; ++i)
1372
+ if (unhidden[i].lines.length) signal(unhidden[i], "unhide");
1373
+
1374
+ var delayed;
1375
+ if (!--delayedCallbackDepth) {
1376
+ delayed = delayedCallbacks;
1377
+ delayedCallbacks = null;
1378
+ }
1379
+ if (op.textChanged)
1380
+ signal(cm, "change", cm, op.textChanged);
1381
+ if (op.cursorActivity) signal(cm, "cursorActivity", cm);
1382
+ if (delayed) for (var i = 0; i < delayed.length; ++i) delayed[i]();
1383
+ }
1384
+
1385
+ // Wraps a function in an operation. Returns the wrapped function.
1386
+ function operation(cm1, f) {
1387
+ return function() {
1388
+ var cm = cm1 || this, withOp = !cm.curOp;
1389
+ if (withOp) startOperation(cm);
1390
+ try { var result = f.apply(cm, arguments); }
1391
+ finally { if (withOp) endOperation(cm); }
1392
+ return result;
1393
+ };
1394
+ }
1395
+ function docOperation(f) {
1396
+ return function() {
1397
+ var withOp = this.cm && !this.cm.curOp, result;
1398
+ if (withOp) startOperation(this.cm);
1399
+ try { result = f.apply(this, arguments); }
1400
+ finally { if (withOp) endOperation(this.cm); }
1401
+ return result;
1402
+ };
1403
+ }
1404
+ function runInOp(cm, f) {
1405
+ var withOp = !cm.curOp, result;
1406
+ if (withOp) startOperation(cm);
1407
+ try { result = f(); }
1408
+ finally { if (withOp) endOperation(cm); }
1409
+ return result;
1410
+ }
1411
+
1412
+ function regChange(cm, from, to, lendiff) {
1413
+ if (from == null) from = cm.doc.first;
1414
+ if (to == null) to = cm.doc.first + cm.doc.size;
1415
+ cm.curOp.changes.push({from: from, to: to, diff: lendiff});
1416
+ }
1417
+
1418
+ // INPUT HANDLING
1419
+
1420
+ function slowPoll(cm) {
1421
+ if (cm.display.pollingFast) return;
1422
+ cm.display.poll.set(cm.options.pollInterval, function() {
1423
+ readInput(cm);
1424
+ if (cm.state.focused) slowPoll(cm);
1425
+ });
1426
+ }
1427
+
1428
+ function fastPoll(cm) {
1429
+ var missed = false;
1430
+ cm.display.pollingFast = true;
1431
+ function p() {
1432
+ var changed = readInput(cm);
1433
+ if (!changed && !missed) {missed = true; cm.display.poll.set(60, p);}
1434
+ else {cm.display.pollingFast = false; slowPoll(cm);}
1435
+ }
1436
+ cm.display.poll.set(20, p);
1437
+ }
1438
+
1439
+ // prevInput is a hack to work with IME. If we reset the textarea
1440
+ // on every change, that breaks IME. So we look for changes
1441
+ // compared to the previous content instead. (Modern browsers have
1442
+ // events that indicate IME taking place, but these are not widely
1443
+ // supported or compatible enough yet to rely on.)
1444
+ function readInput(cm) {
1445
+ var input = cm.display.input, prevInput = cm.display.prevInput, doc = cm.doc, sel = doc.sel;
1446
+ if (!cm.state.focused || hasSelection(input) || isReadOnly(cm) || cm.state.disableInput) return false;
1447
+ var text = input.value;
1448
+ if (text == prevInput && posEq(sel.from, sel.to)) return false;
1449
+ if (ie && !ie_lt9 && cm.display.inputHasSelection === text) {
1450
+ resetInput(cm, true);
1451
+ return false;
1452
+ }
1453
+
1454
+ var withOp = !cm.curOp;
1455
+ if (withOp) startOperation(cm);
1456
+ sel.shift = false;
1457
+ var same = 0, l = Math.min(prevInput.length, text.length);
1458
+ while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) ++same;
1459
+ var from = sel.from, to = sel.to;
1460
+ if (same < prevInput.length)
1461
+ from = Pos(from.line, from.ch - (prevInput.length - same));
1462
+ else if (cm.state.overwrite && posEq(from, to) && !cm.state.pasteIncoming)
1463
+ to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + (text.length - same)));
1464
+
1465
+ var updateInput = cm.curOp.updateInput;
1466
+ var changeEvent = {from: from, to: to, text: splitLines(text.slice(same)),
1467
+ origin: cm.state.pasteIncoming ? "paste" : "+input"};
1468
+ makeChange(cm.doc, changeEvent, "end");
1469
+ cm.curOp.updateInput = updateInput;
1470
+ signalLater(cm, "inputRead", cm, changeEvent);
1471
+
1472
+ if (text.length > 1000 || text.indexOf("\n") > -1) input.value = cm.display.prevInput = "";
1473
+ else cm.display.prevInput = text;
1474
+ if (withOp) endOperation(cm);
1475
+ cm.state.pasteIncoming = false;
1476
+ return true;
1477
+ }
1478
+
1479
+ function resetInput(cm, user) {
1480
+ var minimal, selected, doc = cm.doc;
1481
+ if (!posEq(doc.sel.from, doc.sel.to)) {
1482
+ cm.display.prevInput = "";
1483
+ minimal = hasCopyEvent &&
1484
+ (doc.sel.to.line - doc.sel.from.line > 100 || (selected = cm.getSelection()).length > 1000);
1485
+ var content = minimal ? "-" : selected || cm.getSelection();
1486
+ cm.display.input.value = content;
1487
+ if (cm.state.focused) selectInput(cm.display.input);
1488
+ if (ie && !ie_lt9) cm.display.inputHasSelection = content;
1489
+ } else if (user) {
1490
+ cm.display.prevInput = cm.display.input.value = "";
1491
+ if (ie && !ie_lt9) cm.display.inputHasSelection = null;
1492
+ }
1493
+ cm.display.inaccurateSelection = minimal;
1494
+ }
1495
+
1496
+ function focusInput(cm) {
1497
+ if (cm.options.readOnly != "nocursor" && (!mobile || document.activeElement != cm.display.input))
1498
+ cm.display.input.focus();
1499
+ }
1500
+
1501
+ function isReadOnly(cm) {
1502
+ return cm.options.readOnly || cm.doc.cantEdit;
1503
+ }
1504
+
1505
+ // EVENT HANDLERS
1506
+
1507
+ function registerEventHandlers(cm) {
1508
+ var d = cm.display;
1509
+ on(d.scroller, "mousedown", operation(cm, onMouseDown));
1510
+ if (ie)
1511
+ on(d.scroller, "dblclick", operation(cm, function(e) {
1512
+ if (signalDOMEvent(cm, e)) return;
1513
+ var pos = posFromMouse(cm, e);
1514
+ if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) return;
1515
+ e_preventDefault(e);
1516
+ var word = findWordAt(getLine(cm.doc, pos.line).text, pos);
1517
+ extendSelection(cm.doc, word.from, word.to);
1518
+ }));
1519
+ else
1520
+ on(d.scroller, "dblclick", function(e) { signalDOMEvent(cm, e) || e_preventDefault(e); });
1521
+ on(d.lineSpace, "selectstart", function(e) {
1522
+ if (!eventInWidget(d, e)) e_preventDefault(e);
1523
+ });
1524
+ // Gecko browsers fire contextmenu *after* opening the menu, at
1525
+ // which point we can't mess with it anymore. Context menu is
1526
+ // handled in onMouseDown for Gecko.
1527
+ if (!captureMiddleClick) on(d.scroller, "contextmenu", function(e) {onContextMenu(cm, e);});
1528
+
1529
+ on(d.scroller, "scroll", function() {
1530
+ if (d.scroller.clientHeight) {
1531
+ setScrollTop(cm, d.scroller.scrollTop);
1532
+ setScrollLeft(cm, d.scroller.scrollLeft, true);
1533
+ signal(cm, "scroll", cm);
1534
+ }
1535
+ });
1536
+ on(d.scrollbarV, "scroll", function() {
1537
+ if (d.scroller.clientHeight) setScrollTop(cm, d.scrollbarV.scrollTop);
1538
+ });
1539
+ on(d.scrollbarH, "scroll", function() {
1540
+ if (d.scroller.clientHeight) setScrollLeft(cm, d.scrollbarH.scrollLeft);
1541
+ });
1542
+
1543
+ on(d.scroller, "mousewheel", function(e){onScrollWheel(cm, e);});
1544
+ on(d.scroller, "DOMMouseScroll", function(e){onScrollWheel(cm, e);});
1545
+
1546
+ function reFocus() { if (cm.state.focused) setTimeout(bind(focusInput, cm), 0); }
1547
+ on(d.scrollbarH, "mousedown", reFocus);
1548
+ on(d.scrollbarV, "mousedown", reFocus);
1549
+ // Prevent wrapper from ever scrolling
1550
+ on(d.wrapper, "scroll", function() { d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });
1551
+
1552
+ var resizeTimer;
1553
+ function onResize() {
1554
+ if (resizeTimer == null) resizeTimer = setTimeout(function() {
1555
+ resizeTimer = null;
1556
+ // Might be a text scaling operation, clear size caches.
1557
+ d.cachedCharWidth = d.cachedTextHeight = knownScrollbarWidth = null;
1558
+ clearCaches(cm);
1559
+ runInOp(cm, bind(regChange, cm));
1560
+ }, 100);
1561
+ }
1562
+ on(window, "resize", onResize);
1563
+ // Above handler holds on to the editor and its data structures.
1564
+ // Here we poll to unregister it when the editor is no longer in
1565
+ // the document, so that it can be garbage-collected.
1566
+ function unregister() {
1567
+ for (var p = d.wrapper.parentNode; p && p != document.body; p = p.parentNode) {}
1568
+ if (p) setTimeout(unregister, 5000);
1569
+ else off(window, "resize", onResize);
1570
+ }
1571
+ setTimeout(unregister, 5000);
1572
+
1573
+ on(d.input, "keyup", operation(cm, function(e) {
1574
+ if (signalDOMEvent(cm, e) || cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return;
1575
+ if (e.keyCode == 16) cm.doc.sel.shift = false;
1576
+ }));
1577
+ on(d.input, "input", bind(fastPoll, cm));
1578
+ on(d.input, "keydown", operation(cm, onKeyDown));
1579
+ on(d.input, "keypress", operation(cm, onKeyPress));
1580
+ on(d.input, "focus", bind(onFocus, cm));
1581
+ on(d.input, "blur", bind(onBlur, cm));
1582
+
1583
+ function drag_(e) {
1584
+ if (signalDOMEvent(cm, e) || cm.options.onDragEvent && cm.options.onDragEvent(cm, addStop(e))) return;
1585
+ e_stop(e);
1586
+ }
1587
+ if (cm.options.dragDrop) {
1588
+ on(d.scroller, "dragstart", function(e){onDragStart(cm, e);});
1589
+ on(d.scroller, "dragenter", drag_);
1590
+ on(d.scroller, "dragover", drag_);
1591
+ on(d.scroller, "drop", operation(cm, onDrop));
1592
+ }
1593
+ on(d.scroller, "paste", function(e){
1594
+ if (eventInWidget(d, e)) return;
1595
+ focusInput(cm);
1596
+ fastPoll(cm);
1597
+ });
1598
+ on(d.input, "paste", function() {
1599
+ cm.state.pasteIncoming = true;
1600
+ fastPoll(cm);
1601
+ });
1602
+
1603
+ function prepareCopy() {
1604
+ if (d.inaccurateSelection) {
1605
+ d.prevInput = "";
1606
+ d.inaccurateSelection = false;
1607
+ d.input.value = cm.getSelection();
1608
+ selectInput(d.input);
1609
+ }
1610
+ }
1611
+ on(d.input, "cut", prepareCopy);
1612
+ on(d.input, "copy", prepareCopy);
1613
+
1614
+ // Needed to handle Tab key in KHTML
1615
+ if (khtml) on(d.sizer, "mouseup", function() {
1616
+ if (document.activeElement == d.input) d.input.blur();
1617
+ focusInput(cm);
1618
+ });
1619
+ }
1620
+
1621
+ function eventInWidget(display, e) {
1622
+ for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {
1623
+ if (!n || n.ignoreEvents || n.parentNode == display.sizer && n != display.mover) return true;
1624
+ }
1625
+ }
1626
+
1627
+ function posFromMouse(cm, e, liberal) {
1628
+ var display = cm.display;
1629
+ if (!liberal) {
1630
+ var target = e_target(e);
1631
+ if (target == display.scrollbarH || target == display.scrollbarH.firstChild ||
1632
+ target == display.scrollbarV || target == display.scrollbarV.firstChild ||
1633
+ target == display.scrollbarFiller || target == display.gutterFiller) return null;
1634
+ }
1635
+ var x, y, space = getRect(display.lineSpace);
1636
+ // Fails unpredictably on IE[67] when mouse is dragged around quickly.
1637
+ try { x = e.clientX; y = e.clientY; } catch (e) { return null; }
1638
+ return coordsChar(cm, x - space.left, y - space.top);
1639
+ }
1640
+
1641
+ var lastClick, lastDoubleClick;
1642
+ function onMouseDown(e) {
1643
+ if (signalDOMEvent(this, e)) return;
1644
+ var cm = this, display = cm.display, doc = cm.doc, sel = doc.sel;
1645
+ sel.shift = e.shiftKey;
1646
+
1647
+ if (eventInWidget(display, e)) {
1648
+ if (!webkit) {
1649
+ display.scroller.draggable = false;
1650
+ setTimeout(function(){display.scroller.draggable = true;}, 100);
1651
+ }
1652
+ return;
1653
+ }
1654
+ if (clickInGutter(cm, e)) return;
1655
+ var start = posFromMouse(cm, e);
1656
+
1657
+ switch (e_button(e)) {
1658
+ case 3:
1659
+ if (captureMiddleClick) onContextMenu.call(cm, cm, e);
1660
+ return;
1661
+ case 2:
1662
+ if (start) extendSelection(cm.doc, start);
1663
+ setTimeout(bind(focusInput, cm), 20);
1664
+ e_preventDefault(e);
1665
+ return;
1666
+ }
1667
+ // For button 1, if it was clicked inside the editor
1668
+ // (posFromMouse returning non-null), we have to adjust the
1669
+ // selection.
1670
+ if (!start) {if (e_target(e) == display.scroller) e_preventDefault(e); return;}
1671
+
1672
+ if (!cm.state.focused) onFocus(cm);
1673
+
1674
+ var now = +new Date, type = "single";
1675
+ if (lastDoubleClick && lastDoubleClick.time > now - 400 && posEq(lastDoubleClick.pos, start)) {
1676
+ type = "triple";
1677
+ e_preventDefault(e);
1678
+ setTimeout(bind(focusInput, cm), 20);
1679
+ selectLine(cm, start.line);
1680
+ } else if (lastClick && lastClick.time > now - 400 && posEq(lastClick.pos, start)) {
1681
+ type = "double";
1682
+ lastDoubleClick = {time: now, pos: start};
1683
+ e_preventDefault(e);
1684
+ var word = findWordAt(getLine(doc, start.line).text, start);
1685
+ extendSelection(cm.doc, word.from, word.to);
1686
+ } else { lastClick = {time: now, pos: start}; }
1687
+
1688
+ var last = start;
1689
+ if (cm.options.dragDrop && dragAndDrop && !isReadOnly(cm) && !posEq(sel.from, sel.to) &&
1690
+ !posLess(start, sel.from) && !posLess(sel.to, start) && type == "single") {
1691
+ var dragEnd = operation(cm, function(e2) {
1692
+ if (webkit) display.scroller.draggable = false;
1693
+ cm.state.draggingText = false;
1694
+ off(document, "mouseup", dragEnd);
1695
+ off(display.scroller, "drop", dragEnd);
1696
+ if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) {
1697
+ e_preventDefault(e2);
1698
+ extendSelection(cm.doc, start);
1699
+ focusInput(cm);
1700
+ }
1701
+ });
1702
+ // Let the drag handler handle this.
1703
+ if (webkit) display.scroller.draggable = true;
1704
+ cm.state.draggingText = dragEnd;
1705
+ // IE's approach to draggable
1706
+ if (display.scroller.dragDrop) display.scroller.dragDrop();
1707
+ on(document, "mouseup", dragEnd);
1708
+ on(display.scroller, "drop", dragEnd);
1709
+ return;
1710
+ }
1711
+ e_preventDefault(e);
1712
+ if (type == "single") extendSelection(cm.doc, clipPos(doc, start));
1713
+
1714
+ var startstart = sel.from, startend = sel.to, lastPos = start;
1715
+
1716
+ function doSelect(cur) {
1717
+ if (posEq(lastPos, cur)) return;
1718
+ lastPos = cur;
1719
+
1720
+ if (type == "single") {
1721
+ extendSelection(cm.doc, clipPos(doc, start), cur);
1722
+ return;
1723
+ }
1724
+
1725
+ startstart = clipPos(doc, startstart);
1726
+ startend = clipPos(doc, startend);
1727
+ if (type == "double") {
1728
+ var word = findWordAt(getLine(doc, cur.line).text, cur);
1729
+ if (posLess(cur, startstart)) extendSelection(cm.doc, word.from, startend);
1730
+ else extendSelection(cm.doc, startstart, word.to);
1731
+ } else if (type == "triple") {
1732
+ if (posLess(cur, startstart)) extendSelection(cm.doc, startend, clipPos(doc, Pos(cur.line, 0)));
1733
+ else extendSelection(cm.doc, startstart, clipPos(doc, Pos(cur.line + 1, 0)));
1734
+ }
1735
+ }
1736
+
1737
+ var editorSize = getRect(display.wrapper);
1738
+ // Used to ensure timeout re-tries don't fire when another extend
1739
+ // happened in the meantime (clearTimeout isn't reliable -- at
1740
+ // least on Chrome, the timeouts still happen even when cleared,
1741
+ // if the clear happens after their scheduled firing time).
1742
+ var counter = 0;
1743
+
1744
+ function extend(e) {
1745
+ var curCount = ++counter;
1746
+ var cur = posFromMouse(cm, e, true);
1747
+ if (!cur) return;
1748
+ if (!posEq(cur, last)) {
1749
+ if (!cm.state.focused) onFocus(cm);
1750
+ last = cur;
1751
+ doSelect(cur);
1752
+ var visible = visibleLines(display, doc);
1753
+ if (cur.line >= visible.to || cur.line < visible.from)
1754
+ setTimeout(operation(cm, function(){if (counter == curCount) extend(e);}), 150);
1755
+ } else {
1756
+ var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0;
1757
+ if (outside) setTimeout(operation(cm, function() {
1758
+ if (counter != curCount) return;
1759
+ display.scroller.scrollTop += outside;
1760
+ extend(e);
1761
+ }), 50);
1762
+ }
1763
+ }
1764
+
1765
+ function done(e) {
1766
+ counter = Infinity;
1767
+ e_preventDefault(e);
1768
+ focusInput(cm);
1769
+ off(document, "mousemove", move);
1770
+ off(document, "mouseup", up);
1771
+ }
1772
+
1773
+ var move = operation(cm, function(e) {
1774
+ if (!ie && !e_button(e)) done(e);
1775
+ else extend(e);
1776
+ });
1777
+ var up = operation(cm, done);
1778
+ on(document, "mousemove", move);
1779
+ on(document, "mouseup", up);
1780
+ }
1781
+
1782
+ function clickInGutter(cm, e) {
1783
+ var display = cm.display;
1784
+ try { var mX = e.clientX, mY = e.clientY; }
1785
+ catch(e) { return false; }
1786
+
1787
+ if (mX >= Math.floor(getRect(display.gutters).right)) return false;
1788
+ e_preventDefault(e);
1789
+ if (!hasHandler(cm, "gutterClick")) return true;
1790
+
1791
+ var lineBox = getRect(display.lineDiv);
1792
+ if (mY > lineBox.bottom) return true;
1793
+ mY -= lineBox.top - display.viewOffset;
1794
+
1795
+ for (var i = 0; i < cm.options.gutters.length; ++i) {
1796
+ var g = display.gutters.childNodes[i];
1797
+ if (g && getRect(g).right >= mX) {
1798
+ var line = lineAtHeight(cm.doc, mY);
1799
+ var gutter = cm.options.gutters[i];
1800
+ signalLater(cm, "gutterClick", cm, line, gutter, e);
1801
+ break;
1802
+ }
1803
+ }
1804
+ return true;
1805
+ }
1806
+
1807
+ // Kludge to work around strange IE behavior where it'll sometimes
1808
+ // re-fire a series of drag-related events right after the drop (#1551)
1809
+ var lastDrop = 0;
1810
+
1811
+ function onDrop(e) {
1812
+ var cm = this;
1813
+ if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e) || (cm.options.onDragEvent && cm.options.onDragEvent(cm, addStop(e))))
1814
+ return;
1815
+ e_preventDefault(e);
1816
+ if (ie) lastDrop = +new Date;
1817
+ var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;
1818
+ if (!pos || isReadOnly(cm)) return;
1819
+ if (files && files.length && window.FileReader && window.File) {
1820
+ var n = files.length, text = Array(n), read = 0;
1821
+ var loadFile = function(file, i) {
1822
+ var reader = new FileReader;
1823
+ reader.onload = function() {
1824
+ text[i] = reader.result;
1825
+ if (++read == n) {
1826
+ pos = clipPos(cm.doc, pos);
1827
+ makeChange(cm.doc, {from: pos, to: pos, text: splitLines(text.join("\n")), origin: "paste"}, "around");
1828
+ }
1829
+ };
1830
+ reader.readAsText(file);
1831
+ };
1832
+ for (var i = 0; i < n; ++i) loadFile(files[i], i);
1833
+ } else {
1834
+ // Don't do a replace if the drop happened inside of the selected text.
1835
+ if (cm.state.draggingText && !(posLess(pos, cm.doc.sel.from) || posLess(cm.doc.sel.to, pos))) {
1836
+ cm.state.draggingText(e);
1837
+ // Ensure the editor is re-focused
1838
+ setTimeout(bind(focusInput, cm), 20);
1839
+ return;
1840
+ }
1841
+ try {
1842
+ var text = e.dataTransfer.getData("Text");
1843
+ if (text) {
1844
+ var curFrom = cm.doc.sel.from, curTo = cm.doc.sel.to;
1845
+ setSelection(cm.doc, pos, pos);
1846
+ if (cm.state.draggingText) replaceRange(cm.doc, "", curFrom, curTo, "paste");
1847
+ cm.replaceSelection(text, null, "paste");
1848
+ focusInput(cm);
1849
+ onFocus(cm);
1850
+ }
1851
+ }
1852
+ catch(e){}
1853
+ }
1854
+ }
1855
+
1856
+ function onDragStart(cm, e) {
1857
+ if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return; }
1858
+ if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return;
1859
+
1860
+ var txt = cm.getSelection();
1861
+ e.dataTransfer.setData("Text", txt);
1862
+
1863
+ // Use dummy image instead of default browsers image.
1864
+ // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.
1865
+ if (e.dataTransfer.setDragImage && !safari) {
1866
+ var img = elt("img", null, null, "position: fixed; left: 0; top: 0;");
1867
+ if (opera) {
1868
+ img.width = img.height = 1;
1869
+ cm.display.wrapper.appendChild(img);
1870
+ // Force a relayout, or Opera won't use our image for some obscure reason
1871
+ img._top = img.offsetTop;
1872
+ }
1873
+ e.dataTransfer.setDragImage(img, 0, 0);
1874
+ if (opera) img.parentNode.removeChild(img);
1875
+ }
1876
+ }
1877
+
1878
+ function setScrollTop(cm, val) {
1879
+ if (Math.abs(cm.doc.scrollTop - val) < 2) return;
1880
+ cm.doc.scrollTop = val;
1881
+ if (!gecko) updateDisplay(cm, [], val);
1882
+ if (cm.display.scroller.scrollTop != val) cm.display.scroller.scrollTop = val;
1883
+ if (cm.display.scrollbarV.scrollTop != val) cm.display.scrollbarV.scrollTop = val;
1884
+ if (gecko) updateDisplay(cm, []);
1885
+ startWorker(cm, 100);
1886
+ }
1887
+ function setScrollLeft(cm, val, isScroller) {
1888
+ if (isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) return;
1889
+ val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth);
1890
+ cm.doc.scrollLeft = val;
1891
+ alignHorizontally(cm);
1892
+ if (cm.display.scroller.scrollLeft != val) cm.display.scroller.scrollLeft = val;
1893
+ if (cm.display.scrollbarH.scrollLeft != val) cm.display.scrollbarH.scrollLeft = val;
1894
+ }
1895
+
1896
+ // Since the delta values reported on mouse wheel events are
1897
+ // unstandardized between browsers and even browser versions, and
1898
+ // generally horribly unpredictable, this code starts by measuring
1899
+ // the scroll effect that the first few mouse wheel events have,
1900
+ // and, from that, detects the way it can convert deltas to pixel
1901
+ // offsets afterwards.
1902
+ //
1903
+ // The reason we want to know the amount a wheel event will scroll
1904
+ // is that it gives us a chance to update the display before the
1905
+ // actual scrolling happens, reducing flickering.
1906
+
1907
+ var wheelSamples = 0, wheelPixelsPerUnit = null;
1908
+ // Fill in a browser-detected starting value on browsers where we
1909
+ // know one. These don't have to be accurate -- the result of them
1910
+ // being wrong would just be a slight flicker on the first wheel
1911
+ // scroll (if it is large enough).
1912
+ if (ie) wheelPixelsPerUnit = -.53;
1913
+ else if (gecko) wheelPixelsPerUnit = 15;
1914
+ else if (chrome) wheelPixelsPerUnit = -.7;
1915
+ else if (safari) wheelPixelsPerUnit = -1/3;
1916
+
1917
+ function onScrollWheel(cm, e) {
1918
+ var dx = e.wheelDeltaX, dy = e.wheelDeltaY;
1919
+ if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) dx = e.detail;
1920
+ if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) dy = e.detail;
1921
+ else if (dy == null) dy = e.wheelDelta;
1922
+
1923
+ var display = cm.display, scroll = display.scroller;
1924
+ // Quit if there's nothing to scroll here
1925
+ if (!(dx && scroll.scrollWidth > scroll.clientWidth ||
1926
+ dy && scroll.scrollHeight > scroll.clientHeight)) return;
1927
+
1928
+ // Webkit browsers on OS X abort momentum scrolls when the target
1929
+ // of the scroll event is removed from the scrollable element.
1930
+ // This hack (see related code in patchDisplay) makes sure the
1931
+ // element is kept around.
1932
+ if (dy && mac && webkit) {
1933
+ for (var cur = e.target; cur != scroll; cur = cur.parentNode) {
1934
+ if (cur.lineObj) {
1935
+ cm.display.currentWheelTarget = cur;
1936
+ break;
1937
+ }
1938
+ }
1939
+ }
1940
+
1941
+ // On some browsers, horizontal scrolling will cause redraws to
1942
+ // happen before the gutter has been realigned, causing it to
1943
+ // wriggle around in a most unseemly way. When we have an
1944
+ // estimated pixels/delta value, we just handle horizontal
1945
+ // scrolling entirely here. It'll be slightly off from native, but
1946
+ // better than glitching out.
1947
+ if (dx && !gecko && !opera && wheelPixelsPerUnit != null) {
1948
+ if (dy)
1949
+ setScrollTop(cm, Math.max(0, Math.min(scroll.scrollTop + dy * wheelPixelsPerUnit, scroll.scrollHeight - scroll.clientHeight)));
1950
+ setScrollLeft(cm, Math.max(0, Math.min(scroll.scrollLeft + dx * wheelPixelsPerUnit, scroll.scrollWidth - scroll.clientWidth)));
1951
+ e_preventDefault(e);
1952
+ display.wheelStartX = null; // Abort measurement, if in progress
1953
+ return;
1954
+ }
1955
+
1956
+ if (dy && wheelPixelsPerUnit != null) {
1957
+ var pixels = dy * wheelPixelsPerUnit;
1958
+ var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight;
1959
+ if (pixels < 0) top = Math.max(0, top + pixels - 50);
1960
+ else bot = Math.min(cm.doc.height, bot + pixels + 50);
1961
+ updateDisplay(cm, [], {top: top, bottom: bot});
1962
+ }
1963
+
1964
+ if (wheelSamples < 20) {
1965
+ if (display.wheelStartX == null) {
1966
+ display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop;
1967
+ display.wheelDX = dx; display.wheelDY = dy;
1968
+ setTimeout(function() {
1969
+ if (display.wheelStartX == null) return;
1970
+ var movedX = scroll.scrollLeft - display.wheelStartX;
1971
+ var movedY = scroll.scrollTop - display.wheelStartY;
1972
+ var sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||
1973
+ (movedX && display.wheelDX && movedX / display.wheelDX);
1974
+ display.wheelStartX = display.wheelStartY = null;
1975
+ if (!sample) return;
1976
+ wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1);
1977
+ ++wheelSamples;
1978
+ }, 200);
1979
+ } else {
1980
+ display.wheelDX += dx; display.wheelDY += dy;
1981
+ }
1982
+ }
1983
+ }
1984
+
1985
+ function doHandleBinding(cm, bound, dropShift) {
1986
+ if (typeof bound == "string") {
1987
+ bound = commands[bound];
1988
+ if (!bound) return false;
1989
+ }
1990
+ // Ensure previous input has been read, so that the handler sees a
1991
+ // consistent view of the document
1992
+ if (cm.display.pollingFast && readInput(cm)) cm.display.pollingFast = false;
1993
+ var doc = cm.doc, prevShift = doc.sel.shift, done = false;
1994
+ try {
1995
+ if (isReadOnly(cm)) cm.state.suppressEdits = true;
1996
+ if (dropShift) doc.sel.shift = false;
1997
+ done = bound(cm) != Pass;
1998
+ } finally {
1999
+ doc.sel.shift = prevShift;
2000
+ cm.state.suppressEdits = false;
2001
+ }
2002
+ return done;
2003
+ }
2004
+
2005
+ function allKeyMaps(cm) {
2006
+ var maps = cm.state.keyMaps.slice(0);
2007
+ if (cm.options.extraKeys) maps.push(cm.options.extraKeys);
2008
+ maps.push(cm.options.keyMap);
2009
+ return maps;
2010
+ }
2011
+
2012
+ var maybeTransition;
2013
+ function handleKeyBinding(cm, e) {
2014
+ // Handle auto keymap transitions
2015
+ var startMap = getKeyMap(cm.options.keyMap), next = startMap.auto;
2016
+ clearTimeout(maybeTransition);
2017
+ if (next && !isModifierKey(e)) maybeTransition = setTimeout(function() {
2018
+ if (getKeyMap(cm.options.keyMap) == startMap) {
2019
+ cm.options.keyMap = (next.call ? next.call(null, cm) : next);
2020
+ keyMapChanged(cm);
2021
+ }
2022
+ }, 50);
2023
+
2024
+ var name = keyName(e, true), handled = false;
2025
+ if (!name) return false;
2026
+ var keymaps = allKeyMaps(cm);
2027
+
2028
+ if (e.shiftKey) {
2029
+ // First try to resolve full name (including 'Shift-'). Failing
2030
+ // that, see if there is a cursor-motion command (starting with
2031
+ // 'go') bound to the keyname without 'Shift-'.
2032
+ handled = lookupKey("Shift-" + name, keymaps, function(b) {return doHandleBinding(cm, b, true);})
2033
+ || lookupKey(name, keymaps, function(b) {
2034
+ if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion)
2035
+ return doHandleBinding(cm, b);
2036
+ });
2037
+ } else {
2038
+ handled = lookupKey(name, keymaps, function(b) { return doHandleBinding(cm, b); });
2039
+ }
2040
+
2041
+ if (handled) {
2042
+ e_preventDefault(e);
2043
+ restartBlink(cm);
2044
+ if (ie_lt9) { e.oldKeyCode = e.keyCode; e.keyCode = 0; }
2045
+ signalLater(cm, "keyHandled", cm, name, e);
2046
+ }
2047
+ return handled;
2048
+ }
2049
+
2050
+ function handleCharBinding(cm, e, ch) {
2051
+ var handled = lookupKey("'" + ch + "'", allKeyMaps(cm),
2052
+ function(b) { return doHandleBinding(cm, b, true); });
2053
+ if (handled) {
2054
+ e_preventDefault(e);
2055
+ restartBlink(cm);
2056
+ signalLater(cm, "keyHandled", cm, "'" + ch + "'", e);
2057
+ }
2058
+ return handled;
2059
+ }
2060
+
2061
+ var lastStoppedKey = null;
2062
+ function onKeyDown(e) {
2063
+ var cm = this;
2064
+ if (!cm.state.focused) onFocus(cm);
2065
+ if (ie && e.keyCode == 27) { e.returnValue = false; }
2066
+ if (signalDOMEvent(cm, e) || cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return;
2067
+ var code = e.keyCode;
2068
+ // IE does strange things with escape.
2069
+ cm.doc.sel.shift = code == 16 || e.shiftKey;
2070
+ // First give onKeyEvent option a chance to handle this.
2071
+ var handled = handleKeyBinding(cm, e);
2072
+ if (opera) {
2073
+ lastStoppedKey = handled ? code : null;
2074
+ // Opera has no cut event... we try to at least catch the key combo
2075
+ if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey))
2076
+ cm.replaceSelection("");
2077
+ }
2078
+ }
2079
+
2080
+ function onKeyPress(e) {
2081
+ var cm = this;
2082
+ if (signalDOMEvent(cm, e) || cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return;
2083
+ var keyCode = e.keyCode, charCode = e.charCode;
2084
+ if (opera && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;}
2085
+ if (((opera && (!e.which || e.which < 10)) || khtml) && handleKeyBinding(cm, e)) return;
2086
+ var ch = String.fromCharCode(charCode == null ? keyCode : charCode);
2087
+ if (this.options.electricChars && this.doc.mode.electricChars &&
2088
+ this.options.smartIndent && !isReadOnly(this) &&
2089
+ this.doc.mode.electricChars.indexOf(ch) > -1)
2090
+ setTimeout(operation(cm, function() {indentLine(cm, cm.doc.sel.to.line, "smart");}), 75);
2091
+ if (handleCharBinding(cm, e, ch)) return;
2092
+ if (ie && !ie_lt9) cm.display.inputHasSelection = null;
2093
+ fastPoll(cm);
2094
+ }
2095
+
2096
+ function onFocus(cm) {
2097
+ if (cm.options.readOnly == "nocursor") return;
2098
+ if (!cm.state.focused) {
2099
+ signal(cm, "focus", cm);
2100
+ cm.state.focused = true;
2101
+ if (cm.display.wrapper.className.search(/\bCodeMirror-focused\b/) == -1)
2102
+ cm.display.wrapper.className += " CodeMirror-focused";
2103
+ resetInput(cm, true);
2104
+ }
2105
+ slowPoll(cm);
2106
+ restartBlink(cm);
2107
+ }
2108
+ function onBlur(cm) {
2109
+ if (cm.state.focused) {
2110
+ signal(cm, "blur", cm);
2111
+ cm.state.focused = false;
2112
+ cm.display.wrapper.className = cm.display.wrapper.className.replace(" CodeMirror-focused", "");
2113
+ }
2114
+ clearInterval(cm.display.blinker);
2115
+ setTimeout(function() {if (!cm.state.focused) cm.doc.sel.shift = false;}, 150);
2116
+ }
2117
+
2118
+ var detectingSelectAll;
2119
+ function onContextMenu(cm, e) {
2120
+ if (signalDOMEvent(cm, e, "contextmenu")) return;
2121
+ var display = cm.display, sel = cm.doc.sel;
2122
+ if (eventInWidget(display, e)) return;
2123
+
2124
+ var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop;
2125
+ if (!pos || opera) return; // Opera is difficult.
2126
+ if (posEq(sel.from, sel.to) || posLess(pos, sel.from) || !posLess(pos, sel.to))
2127
+ operation(cm, setSelection)(cm.doc, pos, pos);
2128
+
2129
+ var oldCSS = display.input.style.cssText;
2130
+ display.inputDiv.style.position = "absolute";
2131
+ display.input.style.cssText = "position: fixed; width: 30px; height: 30px; top: " + (e.clientY - 5) +
2132
+ "px; left: " + (e.clientX - 5) + "px; z-index: 1000; background: white; outline: none;" +
2133
+ "border-width: 0; outline: none; overflow: hidden; opacity: .05; -ms-opacity: .05; filter: alpha(opacity=5);";
2134
+ focusInput(cm);
2135
+ resetInput(cm, true);
2136
+ // Adds "Select all" to context menu in FF
2137
+ if (posEq(sel.from, sel.to)) display.input.value = display.prevInput = " ";
2138
+
2139
+ function prepareSelectAllHack() {
2140
+ if (display.input.selectionStart != null) {
2141
+ var extval = display.input.value = " " + (posEq(sel.from, sel.to) ? "" : display.input.value);
2142
+ display.prevInput = " ";
2143
+ display.input.selectionStart = 1; display.input.selectionEnd = extval.length;
2144
+ }
2145
+ }
2146
+ function rehide() {
2147
+ display.inputDiv.style.position = "relative";
2148
+ display.input.style.cssText = oldCSS;
2149
+ if (ie_lt9) display.scrollbarV.scrollTop = display.scroller.scrollTop = scrollPos;
2150
+ slowPoll(cm);
2151
+
2152
+ // Try to detect the user choosing select-all
2153
+ if (display.input.selectionStart != null) {
2154
+ if (!ie || ie_lt9) prepareSelectAllHack();
2155
+ clearTimeout(detectingSelectAll);
2156
+ var i = 0, poll = function(){
2157
+ if (display.prevInput == " " && display.input.selectionStart == 0)
2158
+ operation(cm, commands.selectAll)(cm);
2159
+ else if (i++ < 10) detectingSelectAll = setTimeout(poll, 500);
2160
+ else resetInput(cm);
2161
+ };
2162
+ detectingSelectAll = setTimeout(poll, 200);
2163
+ }
2164
+ }
2165
+
2166
+ if (ie && !ie_lt9) prepareSelectAllHack();
2167
+ if (captureMiddleClick) {
2168
+ e_stop(e);
2169
+ var mouseup = function() {
2170
+ off(window, "mouseup", mouseup);
2171
+ setTimeout(rehide, 20);
2172
+ };
2173
+ on(window, "mouseup", mouseup);
2174
+ } else {
2175
+ setTimeout(rehide, 50);
2176
+ }
2177
+ }
2178
+
2179
+ // UPDATING
2180
+
2181
+ var changeEnd = CodeMirror.changeEnd = function(change) {
2182
+ if (!change.text) return change.to;
2183
+ return Pos(change.from.line + change.text.length - 1,
2184
+ lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0));
2185
+ };
2186
+
2187
+ // Make sure a position will be valid after the given change.
2188
+ function clipPostChange(doc, change, pos) {
2189
+ if (!posLess(change.from, pos)) return clipPos(doc, pos);
2190
+ var diff = (change.text.length - 1) - (change.to.line - change.from.line);
2191
+ if (pos.line > change.to.line + diff) {
2192
+ var preLine = pos.line - diff, lastLine = doc.first + doc.size - 1;
2193
+ if (preLine > lastLine) return Pos(lastLine, getLine(doc, lastLine).text.length);
2194
+ return clipToLen(pos, getLine(doc, preLine).text.length);
2195
+ }
2196
+ if (pos.line == change.to.line + diff)
2197
+ return clipToLen(pos, lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0) +
2198
+ getLine(doc, change.to.line).text.length - change.to.ch);
2199
+ var inside = pos.line - change.from.line;
2200
+ return clipToLen(pos, change.text[inside].length + (inside ? 0 : change.from.ch));
2201
+ }
2202
+
2203
+ // Hint can be null|"end"|"start"|"around"|{anchor,head}
2204
+ function computeSelAfterChange(doc, change, hint) {
2205
+ if (hint && typeof hint == "object") // Assumed to be {anchor, head} object
2206
+ return {anchor: clipPostChange(doc, change, hint.anchor),
2207
+ head: clipPostChange(doc, change, hint.head)};
2208
+
2209
+ if (hint == "start") return {anchor: change.from, head: change.from};
2210
+
2211
+ var end = changeEnd(change);
2212
+ if (hint == "around") return {anchor: change.from, head: end};
2213
+ if (hint == "end") return {anchor: end, head: end};
2214
+
2215
+ // hint is null, leave the selection alone as much as possible
2216
+ var adjustPos = function(pos) {
2217
+ if (posLess(pos, change.from)) return pos;
2218
+ if (!posLess(change.to, pos)) return end;
2219
+
2220
+ var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch;
2221
+ if (pos.line == change.to.line) ch += end.ch - change.to.ch;
2222
+ return Pos(line, ch);
2223
+ };
2224
+ return {anchor: adjustPos(doc.sel.anchor), head: adjustPos(doc.sel.head)};
2225
+ }
2226
+
2227
+ function filterChange(doc, change, update) {
2228
+ var obj = {
2229
+ canceled: false,
2230
+ from: change.from,
2231
+ to: change.to,
2232
+ text: change.text,
2233
+ origin: change.origin,
2234
+ cancel: function() { this.canceled = true; }
2235
+ };
2236
+ if (update) obj.update = function(from, to, text, origin) {
2237
+ if (from) this.from = clipPos(doc, from);
2238
+ if (to) this.to = clipPos(doc, to);
2239
+ if (text) this.text = text;
2240
+ if (origin !== undefined) this.origin = origin;
2241
+ };
2242
+ signal(doc, "beforeChange", doc, obj);
2243
+ if (doc.cm) signal(doc.cm, "beforeChange", doc.cm, obj);
2244
+
2245
+ if (obj.canceled) return null;
2246
+ return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin};
2247
+ }
2248
+
2249
+ // Replace the range from from to to by the strings in replacement.
2250
+ // change is a {from, to, text [, origin]} object
2251
+ function makeChange(doc, change, selUpdate, ignoreReadOnly) {
2252
+ if (doc.cm) {
2253
+ if (!doc.cm.curOp) return operation(doc.cm, makeChange)(doc, change, selUpdate, ignoreReadOnly);
2254
+ if (doc.cm.state.suppressEdits) return;
2255
+ }
2256
+
2257
+ if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) {
2258
+ change = filterChange(doc, change, true);
2259
+ if (!change) return;
2260
+ }
2261
+
2262
+ // Possibly split or suppress the update based on the presence
2263
+ // of read-only spans in its range.
2264
+ var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to);
2265
+ if (split) {
2266
+ for (var i = split.length - 1; i >= 1; --i)
2267
+ makeChangeNoReadonly(doc, {from: split[i].from, to: split[i].to, text: [""]});
2268
+ if (split.length)
2269
+ makeChangeNoReadonly(doc, {from: split[0].from, to: split[0].to, text: change.text}, selUpdate);
2270
+ } else {
2271
+ makeChangeNoReadonly(doc, change, selUpdate);
2272
+ }
2273
+ }
2274
+
2275
+ function makeChangeNoReadonly(doc, change, selUpdate) {
2276
+ var selAfter = computeSelAfterChange(doc, change, selUpdate);
2277
+ addToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN);
2278
+
2279
+ makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change));
2280
+ var rebased = [];
2281
+
2282
+ linkedDocs(doc, function(doc, sharedHist) {
2283
+ if (!sharedHist && indexOf(rebased, doc.history) == -1) {
2284
+ rebaseHist(doc.history, change);
2285
+ rebased.push(doc.history);
2286
+ }
2287
+ makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change));
2288
+ });
2289
+ }
2290
+
2291
+ function makeChangeFromHistory(doc, type) {
2292
+ if (doc.cm && doc.cm.state.suppressEdits) return;
2293
+
2294
+ var hist = doc.history;
2295
+ var event = (type == "undo" ? hist.done : hist.undone).pop();
2296
+ if (!event) return;
2297
+
2298
+ var anti = {changes: [], anchorBefore: event.anchorAfter, headBefore: event.headAfter,
2299
+ anchorAfter: event.anchorBefore, headAfter: event.headBefore,
2300
+ generation: hist.generation};
2301
+ (type == "undo" ? hist.undone : hist.done).push(anti);
2302
+ hist.generation = event.generation || ++hist.maxGeneration;
2303
+
2304
+ var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange");
2305
+
2306
+ for (var i = event.changes.length - 1; i >= 0; --i) {
2307
+ var change = event.changes[i];
2308
+ change.origin = type;
2309
+ if (filter && !filterChange(doc, change, false)) {
2310
+ (type == "undo" ? hist.done : hist.undone).length = 0;
2311
+ return;
2312
+ }
2313
+
2314
+ anti.changes.push(historyChangeFromChange(doc, change));
2315
+
2316
+ var after = i ? computeSelAfterChange(doc, change, null)
2317
+ : {anchor: event.anchorBefore, head: event.headBefore};
2318
+ makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change));
2319
+ var rebased = [];
2320
+
2321
+ linkedDocs(doc, function(doc, sharedHist) {
2322
+ if (!sharedHist && indexOf(rebased, doc.history) == -1) {
2323
+ rebaseHist(doc.history, change);
2324
+ rebased.push(doc.history);
2325
+ }
2326
+ makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change));
2327
+ });
2328
+ }
2329
+ }
2330
+
2331
+ function shiftDoc(doc, distance) {
2332
+ function shiftPos(pos) {return Pos(pos.line + distance, pos.ch);}
2333
+ doc.first += distance;
2334
+ if (doc.cm) regChange(doc.cm, doc.first, doc.first, distance);
2335
+ doc.sel.head = shiftPos(doc.sel.head); doc.sel.anchor = shiftPos(doc.sel.anchor);
2336
+ doc.sel.from = shiftPos(doc.sel.from); doc.sel.to = shiftPos(doc.sel.to);
2337
+ }
2338
+
2339
+ function makeChangeSingleDoc(doc, change, selAfter, spans) {
2340
+ if (doc.cm && !doc.cm.curOp)
2341
+ return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans);
2342
+
2343
+ if (change.to.line < doc.first) {
2344
+ shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line));
2345
+ return;
2346
+ }
2347
+ if (change.from.line > doc.lastLine()) return;
2348
+
2349
+ // Clip the change to the size of this doc
2350
+ if (change.from.line < doc.first) {
2351
+ var shift = change.text.length - 1 - (doc.first - change.from.line);
2352
+ shiftDoc(doc, shift);
2353
+ change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch),
2354
+ text: [lst(change.text)], origin: change.origin};
2355
+ }
2356
+ var last = doc.lastLine();
2357
+ if (change.to.line > last) {
2358
+ change = {from: change.from, to: Pos(last, getLine(doc, last).text.length),
2359
+ text: [change.text[0]], origin: change.origin};
2360
+ }
2361
+
2362
+ change.removed = getBetween(doc, change.from, change.to);
2363
+
2364
+ if (!selAfter) selAfter = computeSelAfterChange(doc, change, null);
2365
+ if (doc.cm) makeChangeSingleDocInEditor(doc.cm, change, spans, selAfter);
2366
+ else updateDoc(doc, change, spans, selAfter);
2367
+ }
2368
+
2369
+ function makeChangeSingleDocInEditor(cm, change, spans, selAfter) {
2370
+ var doc = cm.doc, display = cm.display, from = change.from, to = change.to;
2371
+
2372
+ var recomputeMaxLength = false, checkWidthStart = from.line;
2373
+ if (!cm.options.lineWrapping) {
2374
+ checkWidthStart = lineNo(visualLine(doc, getLine(doc, from.line)));
2375
+ doc.iter(checkWidthStart, to.line + 1, function(line) {
2376
+ if (line == display.maxLine) {
2377
+ recomputeMaxLength = true;
2378
+ return true;
2379
+ }
2380
+ });
2381
+ }
2382
+
2383
+ if (!posLess(doc.sel.head, change.from) && !posLess(change.to, doc.sel.head))
2384
+ cm.curOp.cursorActivity = true;
2385
+
2386
+ updateDoc(doc, change, spans, selAfter, estimateHeight(cm));
2387
+
2388
+ if (!cm.options.lineWrapping) {
2389
+ doc.iter(checkWidthStart, from.line + change.text.length, function(line) {
2390
+ var len = lineLength(doc, line);
2391
+ if (len > display.maxLineLength) {
2392
+ display.maxLine = line;
2393
+ display.maxLineLength = len;
2394
+ display.maxLineChanged = true;
2395
+ recomputeMaxLength = false;
2396
+ }
2397
+ });
2398
+ if (recomputeMaxLength) cm.curOp.updateMaxLine = true;
2399
+ }
2400
+
2401
+ // Adjust frontier, schedule worker
2402
+ doc.frontier = Math.min(doc.frontier, from.line);
2403
+ startWorker(cm, 400);
2404
+
2405
+ var lendiff = change.text.length - (to.line - from.line) - 1;
2406
+ // Remember that these lines changed, for updating the display
2407
+ regChange(cm, from.line, to.line + 1, lendiff);
2408
+
2409
+ if (hasHandler(cm, "change")) {
2410
+ var changeObj = {from: from, to: to,
2411
+ text: change.text,
2412
+ removed: change.removed,
2413
+ origin: change.origin};
2414
+ if (cm.curOp.textChanged) {
2415
+ for (var cur = cm.curOp.textChanged; cur.next; cur = cur.next) {}
2416
+ cur.next = changeObj;
2417
+ } else cm.curOp.textChanged = changeObj;
2418
+ }
2419
+ }
2420
+
2421
+ function replaceRange(doc, code, from, to, origin) {
2422
+ if (!to) to = from;
2423
+ if (posLess(to, from)) { var tmp = to; to = from; from = tmp; }
2424
+ if (typeof code == "string") code = splitLines(code);
2425
+ makeChange(doc, {from: from, to: to, text: code, origin: origin}, null);
2426
+ }
2427
+
2428
+ // POSITION OBJECT
2429
+
2430
+ function Pos(line, ch) {
2431
+ if (!(this instanceof Pos)) return new Pos(line, ch);
2432
+ this.line = line; this.ch = ch;
2433
+ }
2434
+ CodeMirror.Pos = Pos;
2435
+
2436
+ function posEq(a, b) {return a.line == b.line && a.ch == b.ch;}
2437
+ function posLess(a, b) {return a.line < b.line || (a.line == b.line && a.ch < b.ch);}
2438
+ function copyPos(x) {return Pos(x.line, x.ch);}
2439
+
2440
+ // SELECTION
2441
+
2442
+ function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1));}
2443
+ function clipPos(doc, pos) {
2444
+ if (pos.line < doc.first) return Pos(doc.first, 0);
2445
+ var last = doc.first + doc.size - 1;
2446
+ if (pos.line > last) return Pos(last, getLine(doc, last).text.length);
2447
+ return clipToLen(pos, getLine(doc, pos.line).text.length);
2448
+ }
2449
+ function clipToLen(pos, linelen) {
2450
+ var ch = pos.ch;
2451
+ if (ch == null || ch > linelen) return Pos(pos.line, linelen);
2452
+ else if (ch < 0) return Pos(pos.line, 0);
2453
+ else return pos;
2454
+ }
2455
+ function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size;}
2456
+
2457
+ // If shift is held, this will move the selection anchor. Otherwise,
2458
+ // it'll set the whole selection.
2459
+ function extendSelection(doc, pos, other, bias) {
2460
+ if (doc.sel.shift || doc.sel.extend) {
2461
+ var anchor = doc.sel.anchor;
2462
+ if (other) {
2463
+ var posBefore = posLess(pos, anchor);
2464
+ if (posBefore != posLess(other, anchor)) {
2465
+ anchor = pos;
2466
+ pos = other;
2467
+ } else if (posBefore != posLess(pos, other)) {
2468
+ pos = other;
2469
+ }
2470
+ }
2471
+ setSelection(doc, anchor, pos, bias);
2472
+ } else {
2473
+ setSelection(doc, pos, other || pos, bias);
2474
+ }
2475
+ if (doc.cm) doc.cm.curOp.userSelChange = true;
2476
+ }
2477
+
2478
+ function filterSelectionChange(doc, anchor, head) {
2479
+ var obj = {anchor: anchor, head: head};
2480
+ signal(doc, "beforeSelectionChange", doc, obj);
2481
+ if (doc.cm) signal(doc.cm, "beforeSelectionChange", doc.cm, obj);
2482
+ obj.anchor = clipPos(doc, obj.anchor); obj.head = clipPos(doc, obj.head);
2483
+ return obj;
2484
+ }
2485
+
2486
+ // Update the selection. Last two args are only used by
2487
+ // updateDoc, since they have to be expressed in the line
2488
+ // numbers before the update.
2489
+ function setSelection(doc, anchor, head, bias, checkAtomic) {
2490
+ if (!checkAtomic && hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange")) {
2491
+ var filtered = filterSelectionChange(doc, anchor, head);
2492
+ head = filtered.head;
2493
+ anchor = filtered.anchor;
2494
+ }
2495
+
2496
+ var sel = doc.sel;
2497
+ sel.goalColumn = null;
2498
+ // Skip over atomic spans.
2499
+ if (checkAtomic || !posEq(anchor, sel.anchor))
2500
+ anchor = skipAtomic(doc, anchor, bias, checkAtomic != "push");
2501
+ if (checkAtomic || !posEq(head, sel.head))
2502
+ head = skipAtomic(doc, head, bias, checkAtomic != "push");
2503
+
2504
+ if (posEq(sel.anchor, anchor) && posEq(sel.head, head)) return;
2505
+
2506
+ sel.anchor = anchor; sel.head = head;
2507
+ var inv = posLess(head, anchor);
2508
+ sel.from = inv ? head : anchor;
2509
+ sel.to = inv ? anchor : head;
2510
+
2511
+ if (doc.cm)
2512
+ doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged =
2513
+ doc.cm.curOp.cursorActivity = true;
2514
+
2515
+ signalLater(doc, "cursorActivity", doc);
2516
+ }
2517
+
2518
+ function reCheckSelection(cm) {
2519
+ setSelection(cm.doc, cm.doc.sel.from, cm.doc.sel.to, null, "push");
2520
+ }
2521
+
2522
+ function skipAtomic(doc, pos, bias, mayClear) {
2523
+ var flipped = false, curPos = pos;
2524
+ var dir = bias || 1;
2525
+ doc.cantEdit = false;
2526
+ search: for (;;) {
2527
+ var line = getLine(doc, curPos.line);
2528
+ if (line.markedSpans) {
2529
+ for (var i = 0; i < line.markedSpans.length; ++i) {
2530
+ var sp = line.markedSpans[i], m = sp.marker;
2531
+ if ((sp.from == null || (m.inclusiveLeft ? sp.from <= curPos.ch : sp.from < curPos.ch)) &&
2532
+ (sp.to == null || (m.inclusiveRight ? sp.to >= curPos.ch : sp.to > curPos.ch))) {
2533
+ if (mayClear) {
2534
+ signal(m, "beforeCursorEnter");
2535
+ if (m.explicitlyCleared) {
2536
+ if (!line.markedSpans) break;
2537
+ else {--i; continue;}
2538
+ }
2539
+ }
2540
+ if (!m.atomic) continue;
2541
+ var newPos = m.find()[dir < 0 ? "from" : "to"];
2542
+ if (posEq(newPos, curPos)) {
2543
+ newPos.ch += dir;
2544
+ if (newPos.ch < 0) {
2545
+ if (newPos.line > doc.first) newPos = clipPos(doc, Pos(newPos.line - 1));
2546
+ else newPos = null;
2547
+ } else if (newPos.ch > line.text.length) {
2548
+ if (newPos.line < doc.first + doc.size - 1) newPos = Pos(newPos.line + 1, 0);
2549
+ else newPos = null;
2550
+ }
2551
+ if (!newPos) {
2552
+ if (flipped) {
2553
+ // Driven in a corner -- no valid cursor position found at all
2554
+ // -- try again *with* clearing, if we didn't already
2555
+ if (!mayClear) return skipAtomic(doc, pos, bias, true);
2556
+ // Otherwise, turn off editing until further notice, and return the start of the doc
2557
+ doc.cantEdit = true;
2558
+ return Pos(doc.first, 0);
2559
+ }
2560
+ flipped = true; newPos = pos; dir = -dir;
2561
+ }
2562
+ }
2563
+ curPos = newPos;
2564
+ continue search;
2565
+ }
2566
+ }
2567
+ }
2568
+ return curPos;
2569
+ }
2570
+ }
2571
+
2572
+ // SCROLLING
2573
+
2574
+ function scrollCursorIntoView(cm) {
2575
+ var coords = scrollPosIntoView(cm, cm.doc.sel.head, cm.options.cursorScrollMargin);
2576
+ if (!cm.state.focused) return;
2577
+ var display = cm.display, box = getRect(display.sizer), doScroll = null;
2578
+ if (coords.top + box.top < 0) doScroll = true;
2579
+ else if (coords.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false;
2580
+ if (doScroll != null && !phantom) {
2581
+ var hidden = display.cursor.style.display == "none";
2582
+ if (hidden) {
2583
+ display.cursor.style.display = "";
2584
+ display.cursor.style.left = coords.left + "px";
2585
+ display.cursor.style.top = (coords.top - display.viewOffset) + "px";
2586
+ }
2587
+ display.cursor.scrollIntoView(doScroll);
2588
+ if (hidden) display.cursor.style.display = "none";
2589
+ }
2590
+ }
2591
+
2592
+ function scrollPosIntoView(cm, pos, margin) {
2593
+ if (margin == null) margin = 0;
2594
+ for (;;) {
2595
+ var changed = false, coords = cursorCoords(cm, pos);
2596
+ var scrollPos = calculateScrollPos(cm, coords.left, coords.top - margin, coords.left, coords.bottom + margin);
2597
+ var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft;
2598
+ if (scrollPos.scrollTop != null) {
2599
+ setScrollTop(cm, scrollPos.scrollTop);
2600
+ if (Math.abs(cm.doc.scrollTop - startTop) > 1) changed = true;
2601
+ }
2602
+ if (scrollPos.scrollLeft != null) {
2603
+ setScrollLeft(cm, scrollPos.scrollLeft);
2604
+ if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) changed = true;
2605
+ }
2606
+ if (!changed) return coords;
2607
+ }
2608
+ }
2609
+
2610
+ function scrollIntoView(cm, x1, y1, x2, y2) {
2611
+ var scrollPos = calculateScrollPos(cm, x1, y1, x2, y2);
2612
+ if (scrollPos.scrollTop != null) setScrollTop(cm, scrollPos.scrollTop);
2613
+ if (scrollPos.scrollLeft != null) setScrollLeft(cm, scrollPos.scrollLeft);
2614
+ }
2615
+
2616
+ function calculateScrollPos(cm, x1, y1, x2, y2) {
2617
+ var display = cm.display, snapMargin = textHeight(cm.display);
2618
+ if (y1 < 0) y1 = 0;
2619
+ var screen = display.scroller.clientHeight - scrollerCutOff, screentop = display.scroller.scrollTop, result = {};
2620
+ var docBottom = cm.doc.height + paddingVert(display);
2621
+ var atTop = y1 < snapMargin, atBottom = y2 > docBottom - snapMargin;
2622
+ if (y1 < screentop) {
2623
+ result.scrollTop = atTop ? 0 : y1;
2624
+ } else if (y2 > screentop + screen) {
2625
+ var newTop = Math.min(y1, (atBottom ? docBottom : y2) - screen);
2626
+ if (newTop != screentop) result.scrollTop = newTop;
2627
+ }
2628
+
2629
+ var screenw = display.scroller.clientWidth - scrollerCutOff, screenleft = display.scroller.scrollLeft;
2630
+ x1 += display.gutters.offsetWidth; x2 += display.gutters.offsetWidth;
2631
+ var gutterw = display.gutters.offsetWidth;
2632
+ var atLeft = x1 < gutterw + 10;
2633
+ if (x1 < screenleft + gutterw || atLeft) {
2634
+ if (atLeft) x1 = 0;
2635
+ result.scrollLeft = Math.max(0, x1 - 10 - gutterw);
2636
+ } else if (x2 > screenw + screenleft - 3) {
2637
+ result.scrollLeft = x2 + 10 - screenw;
2638
+ }
2639
+ return result;
2640
+ }
2641
+
2642
+ function updateScrollPos(cm, left, top) {
2643
+ cm.curOp.updateScrollPos = {scrollLeft: left == null ? cm.doc.scrollLeft : left,
2644
+ scrollTop: top == null ? cm.doc.scrollTop : top};
2645
+ }
2646
+
2647
+ function addToScrollPos(cm, left, top) {
2648
+ var pos = cm.curOp.updateScrollPos || (cm.curOp.updateScrollPos = {scrollLeft: cm.doc.scrollLeft, scrollTop: cm.doc.scrollTop});
2649
+ var scroll = cm.display.scroller;
2650
+ pos.scrollTop = Math.max(0, Math.min(scroll.scrollHeight - scroll.clientHeight, pos.scrollTop + top));
2651
+ pos.scrollLeft = Math.max(0, Math.min(scroll.scrollWidth - scroll.clientWidth, pos.scrollLeft + left));
2652
+ }
2653
+
2654
+ // API UTILITIES
2655
+
2656
+ function indentLine(cm, n, how, aggressive) {
2657
+ var doc = cm.doc;
2658
+ if (how == null) how = "add";
2659
+ if (how == "smart") {
2660
+ if (!cm.doc.mode.indent) how = "prev";
2661
+ else var state = getStateBefore(cm, n);
2662
+ }
2663
+
2664
+ var tabSize = cm.options.tabSize;
2665
+ var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize);
2666
+ var curSpaceString = line.text.match(/^\s*/)[0], indentation;
2667
+ if (how == "smart") {
2668
+ indentation = cm.doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text);
2669
+ if (indentation == Pass) {
2670
+ if (!aggressive) return;
2671
+ how = "prev";
2672
+ }
2673
+ }
2674
+ if (how == "prev") {
2675
+ if (n > doc.first) indentation = countColumn(getLine(doc, n-1).text, null, tabSize);
2676
+ else indentation = 0;
2677
+ } else if (how == "add") {
2678
+ indentation = curSpace + cm.options.indentUnit;
2679
+ } else if (how == "subtract") {
2680
+ indentation = curSpace - cm.options.indentUnit;
2681
+ } else if (typeof how == "number") {
2682
+ indentation = curSpace + how;
2683
+ }
2684
+ indentation = Math.max(0, indentation);
2685
+
2686
+ var indentString = "", pos = 0;
2687
+ if (cm.options.indentWithTabs)
2688
+ for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";}
2689
+ if (pos < indentation) indentString += spaceStr(indentation - pos);
2690
+
2691
+ if (indentString != curSpaceString)
2692
+ replaceRange(cm.doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input");
2693
+ line.stateAfter = null;
2694
+ }
2695
+
2696
+ function changeLine(cm, handle, op) {
2697
+ var no = handle, line = handle, doc = cm.doc;
2698
+ if (typeof handle == "number") line = getLine(doc, clipLine(doc, handle));
2699
+ else no = lineNo(handle);
2700
+ if (no == null) return null;
2701
+ if (op(line, no)) regChange(cm, no, no + 1);
2702
+ else return null;
2703
+ return line;
2704
+ }
2705
+
2706
+ function findPosH(doc, pos, dir, unit, visually) {
2707
+ var line = pos.line, ch = pos.ch, origDir = dir;
2708
+ var lineObj = getLine(doc, line);
2709
+ var possible = true;
2710
+ function findNextLine() {
2711
+ var l = line + dir;
2712
+ if (l < doc.first || l >= doc.first + doc.size) return (possible = false);
2713
+ line = l;
2714
+ return lineObj = getLine(doc, l);
2715
+ }
2716
+ function moveOnce(boundToLine) {
2717
+ var next = (visually ? moveVisually : moveLogically)(lineObj, ch, dir, true);
2718
+ if (next == null) {
2719
+ if (!boundToLine && findNextLine()) {
2720
+ if (visually) ch = (dir < 0 ? lineRight : lineLeft)(lineObj);
2721
+ else ch = dir < 0 ? lineObj.text.length : 0;
2722
+ } else return (possible = false);
2723
+ } else ch = next;
2724
+ return true;
2725
+ }
2726
+
2727
+ if (unit == "char") moveOnce();
2728
+ else if (unit == "column") moveOnce(true);
2729
+ else if (unit == "word" || unit == "group") {
2730
+ var sawType = null, group = unit == "group";
2731
+ for (var first = true;; first = false) {
2732
+ if (dir < 0 && !moveOnce(!first)) break;
2733
+ var cur = lineObj.text.charAt(ch) || "\n";
2734
+ var type = isWordChar(cur) ? "w"
2735
+ : !group ? null
2736
+ : /\s/.test(cur) ? null
2737
+ : "p";
2738
+ if (sawType && sawType != type) {
2739
+ if (dir < 0) {dir = 1; moveOnce();}
2740
+ break;
2741
+ }
2742
+ if (type) sawType = type;
2743
+ if (dir > 0 && !moveOnce(!first)) break;
2744
+ }
2745
+ }
2746
+ var result = skipAtomic(doc, Pos(line, ch), origDir, true);
2747
+ if (!possible) result.hitSide = true;
2748
+ return result;
2749
+ }
2750
+
2751
+ function findPosV(cm, pos, dir, unit) {
2752
+ var doc = cm.doc, x = pos.left, y;
2753
+ if (unit == "page") {
2754
+ var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight);
2755
+ y = pos.top + dir * (pageSize - (dir < 0 ? 1.5 : .5) * textHeight(cm.display));
2756
+ } else if (unit == "line") {
2757
+ y = dir > 0 ? pos.bottom + 3 : pos.top - 3;
2758
+ }
2759
+ for (;;) {
2760
+ var target = coordsChar(cm, x, y);
2761
+ if (!target.outside) break;
2762
+ if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break; }
2763
+ y += dir * 5;
2764
+ }
2765
+ return target;
2766
+ }
2767
+
2768
+ function findWordAt(line, pos) {
2769
+ var start = pos.ch, end = pos.ch;
2770
+ if (line) {
2771
+ if ((pos.xRel < 0 || end == line.length) && start) --start; else ++end;
2772
+ var startChar = line.charAt(start);
2773
+ var check = isWordChar(startChar) ? isWordChar
2774
+ : /\s/.test(startChar) ? function(ch) {return /\s/.test(ch);}
2775
+ : function(ch) {return !/\s/.test(ch) && !isWordChar(ch);};
2776
+ while (start > 0 && check(line.charAt(start - 1))) --start;
2777
+ while (end < line.length && check(line.charAt(end))) ++end;
2778
+ }
2779
+ return {from: Pos(pos.line, start), to: Pos(pos.line, end)};
2780
+ }
2781
+
2782
+ function selectLine(cm, line) {
2783
+ extendSelection(cm.doc, Pos(line, 0), clipPos(cm.doc, Pos(line + 1, 0)));
2784
+ }
2785
+
2786
+ // PROTOTYPE
2787
+
2788
+ // The publicly visible API. Note that operation(null, f) means
2789
+ // 'wrap f in an operation, performed on its `this` parameter'
2790
+
2791
+ CodeMirror.prototype = {
2792
+ constructor: CodeMirror,
2793
+ focus: function(){window.focus(); focusInput(this); onFocus(this); fastPoll(this);},
2794
+
2795
+ setOption: function(option, value) {
2796
+ var options = this.options, old = options[option];
2797
+ if (options[option] == value && option != "mode") return;
2798
+ options[option] = value;
2799
+ if (optionHandlers.hasOwnProperty(option))
2800
+ operation(this, optionHandlers[option])(this, value, old);
2801
+ },
2802
+
2803
+ getOption: function(option) {return this.options[option];},
2804
+ getDoc: function() {return this.doc;},
2805
+
2806
+ addKeyMap: function(map, bottom) {
2807
+ this.state.keyMaps[bottom ? "push" : "unshift"](map);
2808
+ },
2809
+ removeKeyMap: function(map) {
2810
+ var maps = this.state.keyMaps;
2811
+ for (var i = 0; i < maps.length; ++i)
2812
+ if (maps[i] == map || (typeof maps[i] != "string" && maps[i].name == map)) {
2813
+ maps.splice(i, 1);
2814
+ return true;
2815
+ }
2816
+ },
2817
+
2818
+ addOverlay: operation(null, function(spec, options) {
2819
+ var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec);
2820
+ if (mode.startState) throw new Error("Overlays may not be stateful.");
2821
+ this.state.overlays.push({mode: mode, modeSpec: spec, opaque: options && options.opaque});
2822
+ this.state.modeGen++;
2823
+ regChange(this);
2824
+ }),
2825
+ removeOverlay: operation(null, function(spec) {
2826
+ var overlays = this.state.overlays;
2827
+ for (var i = 0; i < overlays.length; ++i) {
2828
+ var cur = overlays[i].modeSpec;
2829
+ if (cur == spec || typeof spec == "string" && cur.name == spec) {
2830
+ overlays.splice(i, 1);
2831
+ this.state.modeGen++;
2832
+ regChange(this);
2833
+ return;
2834
+ }
2835
+ }
2836
+ }),
2837
+
2838
+ indentLine: operation(null, function(n, dir, aggressive) {
2839
+ if (typeof dir != "string" && typeof dir != "number") {
2840
+ if (dir == null) dir = this.options.smartIndent ? "smart" : "prev";
2841
+ else dir = dir ? "add" : "subtract";
2842
+ }
2843
+ if (isLine(this.doc, n)) indentLine(this, n, dir, aggressive);
2844
+ }),
2845
+ indentSelection: operation(null, function(how) {
2846
+ var sel = this.doc.sel;
2847
+ if (posEq(sel.from, sel.to)) return indentLine(this, sel.from.line, how);
2848
+ var e = sel.to.line - (sel.to.ch ? 0 : 1);
2849
+ for (var i = sel.from.line; i <= e; ++i) indentLine(this, i, how);
2850
+ }),
2851
+
2852
+ // Fetch the parser token for a given character. Useful for hacks
2853
+ // that want to inspect the mode state (say, for completion).
2854
+ getTokenAt: function(pos, precise) {
2855
+ var doc = this.doc;
2856
+ pos = clipPos(doc, pos);
2857
+ var state = getStateBefore(this, pos.line, precise), mode = this.doc.mode;
2858
+ var line = getLine(doc, pos.line);
2859
+ var stream = new StringStream(line.text, this.options.tabSize);
2860
+ while (stream.pos < pos.ch && !stream.eol()) {
2861
+ stream.start = stream.pos;
2862
+ var style = mode.token(stream, state);
2863
+ }
2864
+ return {start: stream.start,
2865
+ end: stream.pos,
2866
+ string: stream.current(),
2867
+ className: style || null, // Deprecated, use 'type' instead
2868
+ type: style || null,
2869
+ state: state};
2870
+ },
2871
+
2872
+ getTokenTypeAt: function(pos) {
2873
+ pos = clipPos(this.doc, pos);
2874
+ var styles = getLineStyles(this, getLine(this.doc, pos.line));
2875
+ var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;
2876
+ if (ch == 0) return styles[2];
2877
+ for (;;) {
2878
+ var mid = (before + after) >> 1;
2879
+ if ((mid ? styles[mid * 2 - 1] : 0) >= ch) after = mid;
2880
+ else if (styles[mid * 2 + 1] < ch) before = mid + 1;
2881
+ else return styles[mid * 2 + 2];
2882
+ }
2883
+ },
2884
+
2885
+ getModeAt: function(pos) {
2886
+ var mode = this.doc.mode;
2887
+ if (!mode.innerMode) return mode;
2888
+ return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode;
2889
+ },
2890
+
2891
+ getHelper: function(pos, type) {
2892
+ if (!helpers.hasOwnProperty(type)) return;
2893
+ var help = helpers[type], mode = this.getModeAt(pos);
2894
+ return mode[type] && help[mode[type]] ||
2895
+ mode.helperType && help[mode.helperType] ||
2896
+ help[mode.name];
2897
+ },
2898
+
2899
+ getStateAfter: function(line, precise) {
2900
+ var doc = this.doc;
2901
+ line = clipLine(doc, line == null ? doc.first + doc.size - 1: line);
2902
+ return getStateBefore(this, line + 1, precise);
2903
+ },
2904
+
2905
+ cursorCoords: function(start, mode) {
2906
+ var pos, sel = this.doc.sel;
2907
+ if (start == null) pos = sel.head;
2908
+ else if (typeof start == "object") pos = clipPos(this.doc, start);
2909
+ else pos = start ? sel.from : sel.to;
2910
+ return cursorCoords(this, pos, mode || "page");
2911
+ },
2912
+
2913
+ charCoords: function(pos, mode) {
2914
+ return charCoords(this, clipPos(this.doc, pos), mode || "page");
2915
+ },
2916
+
2917
+ coordsChar: function(coords, mode) {
2918
+ coords = fromCoordSystem(this, coords, mode || "page");
2919
+ return coordsChar(this, coords.left, coords.top);
2920
+ },
2921
+
2922
+ lineAtHeight: function(height, mode) {
2923
+ height = fromCoordSystem(this, {top: height, left: 0}, mode || "page").top;
2924
+ return lineAtHeight(this.doc, height + this.display.viewOffset);
2925
+ },
2926
+ heightAtLine: function(line, mode) {
2927
+ var end = false, last = this.doc.first + this.doc.size - 1;
2928
+ if (line < this.doc.first) line = this.doc.first;
2929
+ else if (line > last) { line = last; end = true; }
2930
+ var lineObj = getLine(this.doc, line);
2931
+ return intoCoordSystem(this, getLine(this.doc, line), {top: 0, left: 0}, mode || "page").top +
2932
+ (end ? lineObj.height : 0);
2933
+ },
2934
+
2935
+ defaultTextHeight: function() { return textHeight(this.display); },
2936
+ defaultCharWidth: function() { return charWidth(this.display); },
2937
+
2938
+ setGutterMarker: operation(null, function(line, gutterID, value) {
2939
+ return changeLine(this, line, function(line) {
2940
+ var markers = line.gutterMarkers || (line.gutterMarkers = {});
2941
+ markers[gutterID] = value;
2942
+ if (!value && isEmpty(markers)) line.gutterMarkers = null;
2943
+ return true;
2944
+ });
2945
+ }),
2946
+
2947
+ clearGutter: operation(null, function(gutterID) {
2948
+ var cm = this, doc = cm.doc, i = doc.first;
2949
+ doc.iter(function(line) {
2950
+ if (line.gutterMarkers && line.gutterMarkers[gutterID]) {
2951
+ line.gutterMarkers[gutterID] = null;
2952
+ regChange(cm, i, i + 1);
2953
+ if (isEmpty(line.gutterMarkers)) line.gutterMarkers = null;
2954
+ }
2955
+ ++i;
2956
+ });
2957
+ }),
2958
+
2959
+ addLineClass: operation(null, function(handle, where, cls) {
2960
+ return changeLine(this, handle, function(line) {
2961
+ var prop = where == "text" ? "textClass" : where == "background" ? "bgClass" : "wrapClass";
2962
+ if (!line[prop]) line[prop] = cls;
2963
+ else if (new RegExp("(?:^|\\s)" + cls + "(?:$|\\s)").test(line[prop])) return false;
2964
+ else line[prop] += " " + cls;
2965
+ return true;
2966
+ });
2967
+ }),
2968
+
2969
+ removeLineClass: operation(null, function(handle, where, cls) {
2970
+ return changeLine(this, handle, function(line) {
2971
+ var prop = where == "text" ? "textClass" : where == "background" ? "bgClass" : "wrapClass";
2972
+ var cur = line[prop];
2973
+ if (!cur) return false;
2974
+ else if (cls == null) line[prop] = null;
2975
+ else {
2976
+ var found = cur.match(new RegExp("(?:^|\\s+)" + cls + "(?:$|\\s+)"));
2977
+ if (!found) return false;
2978
+ var end = found.index + found[0].length;
2979
+ line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null;
2980
+ }
2981
+ return true;
2982
+ });
2983
+ }),
2984
+
2985
+ addLineWidget: operation(null, function(handle, node, options) {
2986
+ return addLineWidget(this, handle, node, options);
2987
+ }),
2988
+
2989
+ removeLineWidget: function(widget) { widget.clear(); },
2990
+
2991
+ lineInfo: function(line) {
2992
+ if (typeof line == "number") {
2993
+ if (!isLine(this.doc, line)) return null;
2994
+ var n = line;
2995
+ line = getLine(this.doc, line);
2996
+ if (!line) return null;
2997
+ } else {
2998
+ var n = lineNo(line);
2999
+ if (n == null) return null;
3000
+ }
3001
+ return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers,
3002
+ textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass,
3003
+ widgets: line.widgets};
3004
+ },
3005
+
3006
+ getViewport: function() { return {from: this.display.showingFrom, to: this.display.showingTo};},
3007
+
3008
+ addWidget: function(pos, node, scroll, vert, horiz) {
3009
+ var display = this.display;
3010
+ pos = cursorCoords(this, clipPos(this.doc, pos));
3011
+ var top = pos.bottom, left = pos.left;
3012
+ node.style.position = "absolute";
3013
+ display.sizer.appendChild(node);
3014
+ if (vert == "over") {
3015
+ top = pos.top;
3016
+ } else if (vert == "above" || vert == "near") {
3017
+ var vspace = Math.max(display.wrapper.clientHeight, this.doc.height),
3018
+ hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth);
3019
+ // Default to positioning above (if specified and possible); otherwise default to positioning below
3020
+ if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight)
3021
+ top = pos.top - node.offsetHeight;
3022
+ else if (pos.bottom + node.offsetHeight <= vspace)
3023
+ top = pos.bottom;
3024
+ if (left + node.offsetWidth > hspace)
3025
+ left = hspace - node.offsetWidth;
3026
+ }
3027
+ node.style.top = top + "px";
3028
+ node.style.left = node.style.right = "";
3029
+ if (horiz == "right") {
3030
+ left = display.sizer.clientWidth - node.offsetWidth;
3031
+ node.style.right = "0px";
3032
+ } else {
3033
+ if (horiz == "left") left = 0;
3034
+ else if (horiz == "middle") left = (display.sizer.clientWidth - node.offsetWidth) / 2;
3035
+ node.style.left = left + "px";
3036
+ }
3037
+ if (scroll)
3038
+ scrollIntoView(this, left, top, left + node.offsetWidth, top + node.offsetHeight);
3039
+ },
3040
+
3041
+ triggerOnKeyDown: operation(null, onKeyDown),
3042
+
3043
+ execCommand: function(cmd) {return commands[cmd](this);},
3044
+
3045
+ findPosH: function(from, amount, unit, visually) {
3046
+ var dir = 1;
3047
+ if (amount < 0) { dir = -1; amount = -amount; }
3048
+ for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) {
3049
+ cur = findPosH(this.doc, cur, dir, unit, visually);
3050
+ if (cur.hitSide) break;
3051
+ }
3052
+ return cur;
3053
+ },
3054
+
3055
+ moveH: operation(null, function(dir, unit) {
3056
+ var sel = this.doc.sel, pos;
3057
+ if (sel.shift || sel.extend || posEq(sel.from, sel.to))
3058
+ pos = findPosH(this.doc, sel.head, dir, unit, this.options.rtlMoveVisually);
3059
+ else
3060
+ pos = dir < 0 ? sel.from : sel.to;
3061
+ extendSelection(this.doc, pos, pos, dir);
3062
+ }),
3063
+
3064
+ deleteH: operation(null, function(dir, unit) {
3065
+ var sel = this.doc.sel;
3066
+ if (!posEq(sel.from, sel.to)) replaceRange(this.doc, "", sel.from, sel.to, "+delete");
3067
+ else replaceRange(this.doc, "", sel.from, findPosH(this.doc, sel.head, dir, unit, false), "+delete");
3068
+ this.curOp.userSelChange = true;
3069
+ }),
3070
+
3071
+ findPosV: function(from, amount, unit, goalColumn) {
3072
+ var dir = 1, x = goalColumn;
3073
+ if (amount < 0) { dir = -1; amount = -amount; }
3074
+ for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) {
3075
+ var coords = cursorCoords(this, cur, "div");
3076
+ if (x == null) x = coords.left;
3077
+ else coords.left = x;
3078
+ cur = findPosV(this, coords, dir, unit);
3079
+ if (cur.hitSide) break;
3080
+ }
3081
+ return cur;
3082
+ },
3083
+
3084
+ moveV: operation(null, function(dir, unit) {
3085
+ var sel = this.doc.sel;
3086
+ var pos = cursorCoords(this, sel.head, "div");
3087
+ if (sel.goalColumn != null) pos.left = sel.goalColumn;
3088
+ var target = findPosV(this, pos, dir, unit);
3089
+
3090
+ if (unit == "page") addToScrollPos(this, 0, charCoords(this, target, "div").top - pos.top);
3091
+ extendSelection(this.doc, target, target, dir);
3092
+ sel.goalColumn = pos.left;
3093
+ }),
3094
+
3095
+ toggleOverwrite: function(value) {
3096
+ if (value != null && value == this.state.overwrite) return;
3097
+ if (this.state.overwrite = !this.state.overwrite)
3098
+ this.display.cursor.className += " CodeMirror-overwrite";
3099
+ else
3100
+ this.display.cursor.className = this.display.cursor.className.replace(" CodeMirror-overwrite", "");
3101
+ },
3102
+ hasFocus: function() { return this.state.focused; },
3103
+
3104
+ scrollTo: operation(null, function(x, y) {
3105
+ updateScrollPos(this, x, y);
3106
+ }),
3107
+ getScrollInfo: function() {
3108
+ var scroller = this.display.scroller, co = scrollerCutOff;
3109
+ return {left: scroller.scrollLeft, top: scroller.scrollTop,
3110
+ height: scroller.scrollHeight - co, width: scroller.scrollWidth - co,
3111
+ clientHeight: scroller.clientHeight - co, clientWidth: scroller.clientWidth - co};
3112
+ },
3113
+
3114
+ scrollIntoView: operation(null, function(pos, margin) {
3115
+ if (typeof pos == "number") pos = Pos(pos, 0);
3116
+ if (!margin) margin = 0;
3117
+ var coords = pos;
3118
+
3119
+ if (!pos || pos.line != null) {
3120
+ this.curOp.scrollToPos = pos ? clipPos(this.doc, pos) : this.doc.sel.head;
3121
+ this.curOp.scrollToPosMargin = margin;
3122
+ coords = cursorCoords(this, this.curOp.scrollToPos);
3123
+ }
3124
+ var sPos = calculateScrollPos(this, coords.left, coords.top - margin, coords.right, coords.bottom + margin);
3125
+ updateScrollPos(this, sPos.scrollLeft, sPos.scrollTop);
3126
+ }),
3127
+
3128
+ setSize: operation(null, function(width, height) {
3129
+ function interpret(val) {
3130
+ return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val;
3131
+ }
3132
+ if (width != null) this.display.wrapper.style.width = interpret(width);
3133
+ if (height != null) this.display.wrapper.style.height = interpret(height);
3134
+ if (this.options.lineWrapping)
3135
+ this.display.measureLineCache.length = this.display.measureLineCachePos = 0;
3136
+ this.curOp.forceUpdate = true;
3137
+ }),
3138
+
3139
+ operation: function(f){return runInOp(this, f);},
3140
+
3141
+ refresh: operation(null, function() {
3142
+ clearCaches(this);
3143
+ updateScrollPos(this, this.doc.scrollLeft, this.doc.scrollTop);
3144
+ regChange(this);
3145
+ }),
3146
+
3147
+ swapDoc: operation(null, function(doc) {
3148
+ var old = this.doc;
3149
+ old.cm = null;
3150
+ attachDoc(this, doc);
3151
+ clearCaches(this);
3152
+ resetInput(this, true);
3153
+ updateScrollPos(this, doc.scrollLeft, doc.scrollTop);
3154
+ return old;
3155
+ }),
3156
+
3157
+ getInputField: function(){return this.display.input;},
3158
+ getWrapperElement: function(){return this.display.wrapper;},
3159
+ getScrollerElement: function(){return this.display.scroller;},
3160
+ getGutterElement: function(){return this.display.gutters;}
3161
+ };
3162
+ eventMixin(CodeMirror);
3163
+
3164
+ // OPTION DEFAULTS
3165
+
3166
+ var optionHandlers = CodeMirror.optionHandlers = {};
3167
+
3168
+ // The default configuration options.
3169
+ var defaults = CodeMirror.defaults = {};
3170
+
3171
+ function option(name, deflt, handle, notOnInit) {
3172
+ CodeMirror.defaults[name] = deflt;
3173
+ if (handle) optionHandlers[name] =
3174
+ notOnInit ? function(cm, val, old) {if (old != Init) handle(cm, val, old);} : handle;
3175
+ }
3176
+
3177
+ var Init = CodeMirror.Init = {toString: function(){return "CodeMirror.Init";}};
3178
+
3179
+ // These two are, on init, called from the constructor because they
3180
+ // have to be initialized before the editor can start at all.
3181
+ option("value", "", function(cm, val) {
3182
+ cm.setValue(val);
3183
+ }, true);
3184
+ option("mode", null, function(cm, val) {
3185
+ cm.doc.modeOption = val;
3186
+ loadMode(cm);
3187
+ }, true);
3188
+
3189
+ option("indentUnit", 2, loadMode, true);
3190
+ option("indentWithTabs", false);
3191
+ option("smartIndent", true);
3192
+ option("tabSize", 4, function(cm) {
3193
+ loadMode(cm);
3194
+ clearCaches(cm);
3195
+ regChange(cm);
3196
+ }, true);
3197
+ option("electricChars", true);
3198
+ option("rtlMoveVisually", !windows);
3199
+
3200
+ option("theme", "default", function(cm) {
3201
+ themeChanged(cm);
3202
+ guttersChanged(cm);
3203
+ }, true);
3204
+ option("keyMap", "default", keyMapChanged);
3205
+ option("extraKeys", null);
3206
+
3207
+ option("onKeyEvent", null);
3208
+ option("onDragEvent", null);
3209
+
3210
+ option("lineWrapping", false, wrappingChanged, true);
3211
+ option("gutters", [], function(cm) {
3212
+ setGuttersForLineNumbers(cm.options);
3213
+ guttersChanged(cm);
3214
+ }, true);
3215
+ option("fixedGutter", true, function(cm, val) {
3216
+ cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0";
3217
+ cm.refresh();
3218
+ }, true);
3219
+ option("coverGutterNextToScrollbar", false, updateScrollbars, true);
3220
+ option("lineNumbers", false, function(cm) {
3221
+ setGuttersForLineNumbers(cm.options);
3222
+ guttersChanged(cm);
3223
+ }, true);
3224
+ option("firstLineNumber", 1, guttersChanged, true);
3225
+ option("lineNumberFormatter", function(integer) {return integer;}, guttersChanged, true);
3226
+ option("showCursorWhenSelecting", false, updateSelection, true);
3227
+
3228
+ option("readOnly", false, function(cm, val) {
3229
+ if (val == "nocursor") {onBlur(cm); cm.display.input.blur();}
3230
+ else if (!val) resetInput(cm, true);
3231
+ });
3232
+ option("dragDrop", true);
3233
+
3234
+ option("cursorBlinkRate", 530);
3235
+ option("cursorScrollMargin", 0);
3236
+ option("cursorHeight", 1);
3237
+ option("workTime", 100);
3238
+ option("workDelay", 100);
3239
+ option("flattenSpans", true);
3240
+ option("pollInterval", 100);
3241
+ option("undoDepth", 40, function(cm, val){cm.doc.history.undoDepth = val;});
3242
+ option("historyEventDelay", 500);
3243
+ option("viewportMargin", 10, function(cm){cm.refresh();}, true);
3244
+ option("maxHighlightLength", 10000, function(cm){loadMode(cm); cm.refresh();}, true);
3245
+ option("moveInputWithCursor", true, function(cm, val) {
3246
+ if (!val) cm.display.inputDiv.style.top = cm.display.inputDiv.style.left = 0;
3247
+ });
3248
+
3249
+ option("tabindex", null, function(cm, val) {
3250
+ cm.display.input.tabIndex = val || "";
3251
+ });
3252
+ option("autofocus", null);
3253
+
3254
+ // MODE DEFINITION AND QUERYING
3255
+
3256
+ // Known modes, by name and by MIME
3257
+ var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {};
3258
+
3259
+ CodeMirror.defineMode = function(name, mode) {
3260
+ if (!CodeMirror.defaults.mode && name != "null") CodeMirror.defaults.mode = name;
3261
+ if (arguments.length > 2) {
3262
+ mode.dependencies = [];
3263
+ for (var i = 2; i < arguments.length; ++i) mode.dependencies.push(arguments[i]);
3264
+ }
3265
+ modes[name] = mode;
3266
+ };
3267
+
3268
+ CodeMirror.defineMIME = function(mime, spec) {
3269
+ mimeModes[mime] = spec;
3270
+ };
3271
+
3272
+ CodeMirror.resolveMode = function(spec) {
3273
+ if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) {
3274
+ spec = mimeModes[spec];
3275
+ } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) {
3276
+ var found = mimeModes[spec.name];
3277
+ spec = createObj(found, spec);
3278
+ spec.name = found.name;
3279
+ } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) {
3280
+ return CodeMirror.resolveMode("application/xml");
3281
+ }
3282
+ if (typeof spec == "string") return {name: spec};
3283
+ else return spec || {name: "null"};
3284
+ };
3285
+
3286
+ CodeMirror.getMode = function(options, spec) {
3287
+ var spec = CodeMirror.resolveMode(spec);
3288
+ var mfactory = modes[spec.name];
3289
+ if (!mfactory) return CodeMirror.getMode(options, "text/plain");
3290
+ var modeObj = mfactory(options, spec);
3291
+ if (modeExtensions.hasOwnProperty(spec.name)) {
3292
+ var exts = modeExtensions[spec.name];
3293
+ for (var prop in exts) {
3294
+ if (!exts.hasOwnProperty(prop)) continue;
3295
+ if (modeObj.hasOwnProperty(prop)) modeObj["_" + prop] = modeObj[prop];
3296
+ modeObj[prop] = exts[prop];
3297
+ }
3298
+ }
3299
+ modeObj.name = spec.name;
3300
+
3301
+ return modeObj;
3302
+ };
3303
+
3304
+ CodeMirror.defineMode("null", function() {
3305
+ return {token: function(stream) {stream.skipToEnd();}};
3306
+ });
3307
+ CodeMirror.defineMIME("text/plain", "null");
3308
+
3309
+ var modeExtensions = CodeMirror.modeExtensions = {};
3310
+ CodeMirror.extendMode = function(mode, properties) {
3311
+ var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});
3312
+ copyObj(properties, exts);
3313
+ };
3314
+
3315
+ // EXTENSIONS
3316
+
3317
+ CodeMirror.defineExtension = function(name, func) {
3318
+ CodeMirror.prototype[name] = func;
3319
+ };
3320
+ CodeMirror.defineDocExtension = function(name, func) {
3321
+ Doc.prototype[name] = func;
3322
+ };
3323
+ CodeMirror.defineOption = option;
3324
+
3325
+ var initHooks = [];
3326
+ CodeMirror.defineInitHook = function(f) {initHooks.push(f);};
3327
+
3328
+ var helpers = CodeMirror.helpers = {};
3329
+ CodeMirror.registerHelper = function(type, name, value) {
3330
+ if (!helpers.hasOwnProperty(type)) helpers[type] = CodeMirror[type] = {};
3331
+ helpers[type][name] = value;
3332
+ };
3333
+
3334
+ // UTILITIES
3335
+
3336
+ CodeMirror.isWordChar = isWordChar;
3337
+
3338
+ // MODE STATE HANDLING
3339
+
3340
+ // Utility functions for working with state. Exported because modes
3341
+ // sometimes need to do this.
3342
+ function copyState(mode, state) {
3343
+ if (state === true) return state;
3344
+ if (mode.copyState) return mode.copyState(state);
3345
+ var nstate = {};
3346
+ for (var n in state) {
3347
+ var val = state[n];
3348
+ if (val instanceof Array) val = val.concat([]);
3349
+ nstate[n] = val;
3350
+ }
3351
+ return nstate;
3352
+ }
3353
+ CodeMirror.copyState = copyState;
3354
+
3355
+ function startState(mode, a1, a2) {
3356
+ return mode.startState ? mode.startState(a1, a2) : true;
3357
+ }
3358
+ CodeMirror.startState = startState;
3359
+
3360
+ CodeMirror.innerMode = function(mode, state) {
3361
+ while (mode.innerMode) {
3362
+ var info = mode.innerMode(state);
3363
+ if (!info || info.mode == mode) break;
3364
+ state = info.state;
3365
+ mode = info.mode;
3366
+ }
3367
+ return info || {mode: mode, state: state};
3368
+ };
3369
+
3370
+ // STANDARD COMMANDS
3371
+
3372
+ var commands = CodeMirror.commands = {
3373
+ selectAll: function(cm) {cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()));},
3374
+ killLine: function(cm) {
3375
+ var from = cm.getCursor(true), to = cm.getCursor(false), sel = !posEq(from, to);
3376
+ if (!sel && cm.getLine(from.line).length == from.ch)
3377
+ cm.replaceRange("", from, Pos(from.line + 1, 0), "+delete");
3378
+ else cm.replaceRange("", from, sel ? to : Pos(from.line), "+delete");
3379
+ },
3380
+ deleteLine: function(cm) {
3381
+ var l = cm.getCursor().line;
3382
+ cm.replaceRange("", Pos(l, 0), Pos(l), "+delete");
3383
+ },
3384
+ delLineLeft: function(cm) {
3385
+ var cur = cm.getCursor();
3386
+ cm.replaceRange("", Pos(cur.line, 0), cur, "+delete");
3387
+ },
3388
+ undo: function(cm) {cm.undo();},
3389
+ redo: function(cm) {cm.redo();},
3390
+ goDocStart: function(cm) {cm.extendSelection(Pos(cm.firstLine(), 0));},
3391
+ goDocEnd: function(cm) {cm.extendSelection(Pos(cm.lastLine()));},
3392
+ goLineStart: function(cm) {
3393
+ cm.extendSelection(lineStart(cm, cm.getCursor().line));
3394
+ },
3395
+ goLineStartSmart: function(cm) {
3396
+ var cur = cm.getCursor(), start = lineStart(cm, cur.line);
3397
+ var line = cm.getLineHandle(start.line);
3398
+ var order = getOrder(line);
3399
+ if (!order || order[0].level == 0) {
3400
+ var firstNonWS = Math.max(0, line.text.search(/\S/));
3401
+ var inWS = cur.line == start.line && cur.ch <= firstNonWS && cur.ch;
3402
+ cm.extendSelection(Pos(start.line, inWS ? 0 : firstNonWS));
3403
+ } else cm.extendSelection(start);
3404
+ },
3405
+ goLineEnd: function(cm) {
3406
+ cm.extendSelection(lineEnd(cm, cm.getCursor().line));
3407
+ },
3408
+ goLineRight: function(cm) {
3409
+ var top = cm.charCoords(cm.getCursor(), "div").top + 5;
3410
+ cm.extendSelection(cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div"));
3411
+ },
3412
+ goLineLeft: function(cm) {
3413
+ var top = cm.charCoords(cm.getCursor(), "div").top + 5;
3414
+ cm.extendSelection(cm.coordsChar({left: 0, top: top}, "div"));
3415
+ },
3416
+ goLineUp: function(cm) {cm.moveV(-1, "line");},
3417
+ goLineDown: function(cm) {cm.moveV(1, "line");},
3418
+ goPageUp: function(cm) {cm.moveV(-1, "page");},
3419
+ goPageDown: function(cm) {cm.moveV(1, "page");},
3420
+ goCharLeft: function(cm) {cm.moveH(-1, "char");},
3421
+ goCharRight: function(cm) {cm.moveH(1, "char");},
3422
+ goColumnLeft: function(cm) {cm.moveH(-1, "column");},
3423
+ goColumnRight: function(cm) {cm.moveH(1, "column");},
3424
+ goWordLeft: function(cm) {cm.moveH(-1, "word");},
3425
+ goGroupRight: function(cm) {cm.moveH(1, "group");},
3426
+ goGroupLeft: function(cm) {cm.moveH(-1, "group");},
3427
+ goWordRight: function(cm) {cm.moveH(1, "word");},
3428
+ delCharBefore: function(cm) {cm.deleteH(-1, "char");},
3429
+ delCharAfter: function(cm) {cm.deleteH(1, "char");},
3430
+ delWordBefore: function(cm) {cm.deleteH(-1, "word");},
3431
+ delWordAfter: function(cm) {cm.deleteH(1, "word");},
3432
+ delGroupBefore: function(cm) {cm.deleteH(-1, "group");},
3433
+ delGroupAfter: function(cm) {cm.deleteH(1, "group");},
3434
+ indentAuto: function(cm) {cm.indentSelection("smart");},
3435
+ indentMore: function(cm) {cm.indentSelection("add");},
3436
+ indentLess: function(cm) {cm.indentSelection("subtract");},
3437
+ insertTab: function(cm) {cm.replaceSelection("\t", "end", "+input");},
3438
+ defaultTab: function(cm) {
3439
+ if (cm.somethingSelected()) cm.indentSelection("add");
3440
+ else cm.replaceSelection("\t", "end", "+input");
3441
+ },
3442
+ transposeChars: function(cm) {
3443
+ var cur = cm.getCursor(), line = cm.getLine(cur.line);
3444
+ if (cur.ch > 0 && cur.ch < line.length - 1)
3445
+ cm.replaceRange(line.charAt(cur.ch) + line.charAt(cur.ch - 1),
3446
+ Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1));
3447
+ },
3448
+ newlineAndIndent: function(cm) {
3449
+ operation(cm, function() {
3450
+ cm.replaceSelection("\n", "end", "+input");
3451
+ cm.indentLine(cm.getCursor().line, null, true);
3452
+ })();
3453
+ },
3454
+ toggleOverwrite: function(cm) {cm.toggleOverwrite();}
3455
+ };
3456
+
3457
+ // STANDARD KEYMAPS
3458
+
3459
+ var keyMap = CodeMirror.keyMap = {};
3460
+ keyMap.basic = {
3461
+ "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown",
3462
+ "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown",
3463
+ "Delete": "delCharAfter", "Backspace": "delCharBefore", "Tab": "defaultTab", "Shift-Tab": "indentAuto",
3464
+ "Enter": "newlineAndIndent", "Insert": "toggleOverwrite"
3465
+ };
3466
+ // Note that the save and find-related commands aren't defined by
3467
+ // default. Unknown commands are simply ignored.
3468
+ keyMap.pcDefault = {
3469
+ "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo",
3470
+ "Ctrl-Home": "goDocStart", "Alt-Up": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Down": "goDocEnd",
3471
+ "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd",
3472
+ "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find",
3473
+ "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll",
3474
+ "Ctrl-[": "indentLess", "Ctrl-]": "indentMore",
3475
+ fallthrough: "basic"
3476
+ };
3477
+ keyMap.macDefault = {
3478
+ "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo",
3479
+ "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goGroupLeft",
3480
+ "Alt-Right": "goGroupRight", "Cmd-Left": "goLineStart", "Cmd-Right": "goLineEnd", "Alt-Backspace": "delGroupBefore",
3481
+ "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find",
3482
+ "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll",
3483
+ "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delLineLeft",
3484
+ fallthrough: ["basic", "emacsy"]
3485
+ };
3486
+ keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault;
3487
+ keyMap.emacsy = {
3488
+ "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown",
3489
+ "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd",
3490
+ "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore",
3491
+ "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars"
3492
+ };
3493
+
3494
+ // KEYMAP DISPATCH
3495
+
3496
+ function getKeyMap(val) {
3497
+ if (typeof val == "string") return keyMap[val];
3498
+ else return val;
3499
+ }
3500
+
3501
+ function lookupKey(name, maps, handle) {
3502
+ function lookup(map) {
3503
+ map = getKeyMap(map);
3504
+ var found = map[name];
3505
+ if (found === false) return "stop";
3506
+ if (found != null && handle(found)) return true;
3507
+ if (map.nofallthrough) return "stop";
3508
+
3509
+ var fallthrough = map.fallthrough;
3510
+ if (fallthrough == null) return false;
3511
+ if (Object.prototype.toString.call(fallthrough) != "[object Array]")
3512
+ return lookup(fallthrough);
3513
+ for (var i = 0, e = fallthrough.length; i < e; ++i) {
3514
+ var done = lookup(fallthrough[i]);
3515
+ if (done) return done;
3516
+ }
3517
+ return false;
3518
+ }
3519
+
3520
+ for (var i = 0; i < maps.length; ++i) {
3521
+ var done = lookup(maps[i]);
3522
+ if (done) return done != "stop";
3523
+ }
3524
+ }
3525
+ function isModifierKey(event) {
3526
+ var name = keyNames[event.keyCode];
3527
+ return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod";
3528
+ }
3529
+ function keyName(event, noShift) {
3530
+ if (opera && event.keyCode == 34 && event["char"]) return false;
3531
+ var name = keyNames[event.keyCode];
3532
+ if (name == null || event.altGraphKey) return false;
3533
+ if (event.altKey) name = "Alt-" + name;
3534
+ if (flipCtrlCmd ? event.metaKey : event.ctrlKey) name = "Ctrl-" + name;
3535
+ if (flipCtrlCmd ? event.ctrlKey : event.metaKey) name = "Cmd-" + name;
3536
+ if (!noShift && event.shiftKey) name = "Shift-" + name;
3537
+ return name;
3538
+ }
3539
+ CodeMirror.lookupKey = lookupKey;
3540
+ CodeMirror.isModifierKey = isModifierKey;
3541
+ CodeMirror.keyName = keyName;
3542
+
3543
+ // FROMTEXTAREA
3544
+
3545
+ CodeMirror.fromTextArea = function(textarea, options) {
3546
+ if (!options) options = {};
3547
+ options.value = textarea.value;
3548
+ if (!options.tabindex && textarea.tabindex)
3549
+ options.tabindex = textarea.tabindex;
3550
+ if (!options.placeholder && textarea.placeholder)
3551
+ options.placeholder = textarea.placeholder;
3552
+ // Set autofocus to true if this textarea is focused, or if it has
3553
+ // autofocus and no other element is focused.
3554
+ if (options.autofocus == null) {
3555
+ var hasFocus = document.body;
3556
+ // doc.activeElement occasionally throws on IE
3557
+ try { hasFocus = document.activeElement; } catch(e) {}
3558
+ options.autofocus = hasFocus == textarea ||
3559
+ textarea.getAttribute("autofocus") != null && hasFocus == document.body;
3560
+ }
3561
+
3562
+ function save() {textarea.value = cm.getValue();}
3563
+ if (textarea.form) {
3564
+ on(textarea.form, "submit", save);
3565
+ // Deplorable hack to make the submit method do the right thing.
3566
+ if (!options.leaveSubmitMethodAlone) {
3567
+ var form = textarea.form, realSubmit = form.submit;
3568
+ try {
3569
+ var wrappedSubmit = form.submit = function() {
3570
+ save();
3571
+ form.submit = realSubmit;
3572
+ form.submit();
3573
+ form.submit = wrappedSubmit;
3574
+ };
3575
+ } catch(e) {}
3576
+ }
3577
+ }
3578
+
3579
+ textarea.style.display = "none";
3580
+ var cm = CodeMirror(function(node) {
3581
+ textarea.parentNode.insertBefore(node, textarea.nextSibling);
3582
+ }, options);
3583
+ cm.save = save;
3584
+ cm.getTextArea = function() { return textarea; };
3585
+ cm.toTextArea = function() {
3586
+ save();
3587
+ textarea.parentNode.removeChild(cm.getWrapperElement());
3588
+ textarea.style.display = "";
3589
+ if (textarea.form) {
3590
+ off(textarea.form, "submit", save);
3591
+ if (typeof textarea.form.submit == "function")
3592
+ textarea.form.submit = realSubmit;
3593
+ }
3594
+ };
3595
+ return cm;
3596
+ };
3597
+
3598
+ // STRING STREAM
3599
+
3600
+ // Fed to the mode parsers, provides helper functions to make
3601
+ // parsers more succinct.
3602
+
3603
+ // The character stream used by a mode's parser.
3604
+ function StringStream(string, tabSize) {
3605
+ this.pos = this.start = 0;
3606
+ this.string = string;
3607
+ this.tabSize = tabSize || 8;
3608
+ this.lastColumnPos = this.lastColumnValue = 0;
3609
+ }
3610
+
3611
+ StringStream.prototype = {
3612
+ eol: function() {return this.pos >= this.string.length;},
3613
+ sol: function() {return this.pos == 0;},
3614
+ peek: function() {return this.string.charAt(this.pos) || undefined;},
3615
+ next: function() {
3616
+ if (this.pos < this.string.length)
3617
+ return this.string.charAt(this.pos++);
3618
+ },
3619
+ eat: function(match) {
3620
+ var ch = this.string.charAt(this.pos);
3621
+ if (typeof match == "string") var ok = ch == match;
3622
+ else var ok = ch && (match.test ? match.test(ch) : match(ch));
3623
+ if (ok) {++this.pos; return ch;}
3624
+ },
3625
+ eatWhile: function(match) {
3626
+ var start = this.pos;
3627
+ while (this.eat(match)){}
3628
+ return this.pos > start;
3629
+ },
3630
+ eatSpace: function() {
3631
+ var start = this.pos;
3632
+ while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos;
3633
+ return this.pos > start;
3634
+ },
3635
+ skipToEnd: function() {this.pos = this.string.length;},
3636
+ skipTo: function(ch) {
3637
+ var found = this.string.indexOf(ch, this.pos);
3638
+ if (found > -1) {this.pos = found; return true;}
3639
+ },
3640
+ backUp: function(n) {this.pos -= n;},
3641
+ column: function() {
3642
+ if (this.lastColumnPos < this.start) {
3643
+ this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);
3644
+ this.lastColumnPos = this.start;
3645
+ }
3646
+ return this.lastColumnValue;
3647
+ },
3648
+ indentation: function() {return countColumn(this.string, null, this.tabSize);},
3649
+ match: function(pattern, consume, caseInsensitive) {
3650
+ if (typeof pattern == "string") {
3651
+ var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;};
3652
+ var substr = this.string.substr(this.pos, pattern.length);
3653
+ if (cased(substr) == cased(pattern)) {
3654
+ if (consume !== false) this.pos += pattern.length;
3655
+ return true;
3656
+ }
3657
+ } else {
3658
+ var match = this.string.slice(this.pos).match(pattern);
3659
+ if (match && match.index > 0) return null;
3660
+ if (match && consume !== false) this.pos += match[0].length;
3661
+ return match;
3662
+ }
3663
+ },
3664
+ current: function(){return this.string.slice(this.start, this.pos);}
3665
+ };
3666
+ CodeMirror.StringStream = StringStream;
3667
+
3668
+ // TEXTMARKERS
3669
+
3670
+ function TextMarker(doc, type) {
3671
+ this.lines = [];
3672
+ this.type = type;
3673
+ this.doc = doc;
3674
+ }
3675
+ CodeMirror.TextMarker = TextMarker;
3676
+ eventMixin(TextMarker);
3677
+
3678
+ TextMarker.prototype.clear = function() {
3679
+ if (this.explicitlyCleared) return;
3680
+ var cm = this.doc.cm, withOp = cm && !cm.curOp;
3681
+ if (withOp) startOperation(cm);
3682
+ if (hasHandler(this, "clear")) {
3683
+ var found = this.find();
3684
+ if (found) signalLater(this, "clear", found.from, found.to);
3685
+ }
3686
+ var min = null, max = null;
3687
+ for (var i = 0; i < this.lines.length; ++i) {
3688
+ var line = this.lines[i];
3689
+ var span = getMarkedSpanFor(line.markedSpans, this);
3690
+ if (span.to != null) max = lineNo(line);
3691
+ line.markedSpans = removeMarkedSpan(line.markedSpans, span);
3692
+ if (span.from != null)
3693
+ min = lineNo(line);
3694
+ else if (this.collapsed && !lineIsHidden(this.doc, line) && cm)
3695
+ updateLineHeight(line, textHeight(cm.display));
3696
+ }
3697
+ if (cm && this.collapsed && !cm.options.lineWrapping) for (var i = 0; i < this.lines.length; ++i) {
3698
+ var visual = visualLine(cm.doc, this.lines[i]), len = lineLength(cm.doc, visual);
3699
+ if (len > cm.display.maxLineLength) {
3700
+ cm.display.maxLine = visual;
3701
+ cm.display.maxLineLength = len;
3702
+ cm.display.maxLineChanged = true;
3703
+ }
3704
+ }
3705
+
3706
+ if (min != null && cm) regChange(cm, min, max + 1);
3707
+ this.lines.length = 0;
3708
+ this.explicitlyCleared = true;
3709
+ if (this.atomic && this.doc.cantEdit) {
3710
+ this.doc.cantEdit = false;
3711
+ if (cm) reCheckSelection(cm);
3712
+ }
3713
+ if (withOp) endOperation(cm);
3714
+ };
3715
+
3716
+ TextMarker.prototype.find = function() {
3717
+ var from, to;
3718
+ for (var i = 0; i < this.lines.length; ++i) {
3719
+ var line = this.lines[i];
3720
+ var span = getMarkedSpanFor(line.markedSpans, this);
3721
+ if (span.from != null || span.to != null) {
3722
+ var found = lineNo(line);
3723
+ if (span.from != null) from = Pos(found, span.from);
3724
+ if (span.to != null) to = Pos(found, span.to);
3725
+ }
3726
+ }
3727
+ if (this.type == "bookmark") return from;
3728
+ return from && {from: from, to: to};
3729
+ };
3730
+
3731
+ TextMarker.prototype.changed = function() {
3732
+ var pos = this.find(), cm = this.doc.cm;
3733
+ if (!pos || !cm) return;
3734
+ var line = getLine(this.doc, pos.from.line);
3735
+ clearCachedMeasurement(cm, line);
3736
+ if (pos.from.line >= cm.display.showingFrom && pos.from.line < cm.display.showingTo) {
3737
+ for (var node = cm.display.lineDiv.firstChild; node; node = node.nextSibling) if (node.lineObj == line) {
3738
+ if (node.offsetHeight != line.height) updateLineHeight(line, node.offsetHeight);
3739
+ break;
3740
+ }
3741
+ runInOp(cm, function() {
3742
+ cm.curOp.selectionChanged = cm.curOp.forceUpdate = cm.curOp.updateMaxLine = true;
3743
+ });
3744
+ }
3745
+ };
3746
+
3747
+ TextMarker.prototype.attachLine = function(line) {
3748
+ if (!this.lines.length && this.doc.cm) {
3749
+ var op = this.doc.cm.curOp;
3750
+ if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1)
3751
+ (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this);
3752
+ }
3753
+ this.lines.push(line);
3754
+ };
3755
+ TextMarker.prototype.detachLine = function(line) {
3756
+ this.lines.splice(indexOf(this.lines, line), 1);
3757
+ if (!this.lines.length && this.doc.cm) {
3758
+ var op = this.doc.cm.curOp;
3759
+ (op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this);
3760
+ }
3761
+ };
3762
+
3763
+ function markText(doc, from, to, options, type) {
3764
+ if (options && options.shared) return markTextShared(doc, from, to, options, type);
3765
+ if (doc.cm && !doc.cm.curOp) return operation(doc.cm, markText)(doc, from, to, options, type);
3766
+
3767
+ var marker = new TextMarker(doc, type);
3768
+ if (type == "range" && !posLess(from, to)) return marker;
3769
+ if (options) copyObj(options, marker);
3770
+ if (marker.replacedWith) {
3771
+ marker.collapsed = true;
3772
+ marker.replacedWith = elt("span", [marker.replacedWith], "CodeMirror-widget");
3773
+ if (!options.handleMouseEvents) marker.replacedWith.ignoreEvents = true;
3774
+ }
3775
+ if (marker.collapsed) sawCollapsedSpans = true;
3776
+
3777
+ if (marker.addToHistory)
3778
+ addToHistory(doc, {from: from, to: to, origin: "markText"},
3779
+ {head: doc.sel.head, anchor: doc.sel.anchor}, NaN);
3780
+
3781
+ var curLine = from.line, size = 0, collapsedAtStart, collapsedAtEnd, cm = doc.cm, updateMaxLine;
3782
+ doc.iter(curLine, to.line + 1, function(line) {
3783
+ if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(doc, line) == cm.display.maxLine)
3784
+ updateMaxLine = true;
3785
+ var span = {from: null, to: null, marker: marker};
3786
+ size += line.text.length;
3787
+ if (curLine == from.line) {span.from = from.ch; size -= from.ch;}
3788
+ if (curLine == to.line) {span.to = to.ch; size -= line.text.length - to.ch;}
3789
+ if (marker.collapsed) {
3790
+ if (curLine == to.line) collapsedAtEnd = collapsedSpanAt(line, to.ch);
3791
+ if (curLine == from.line) collapsedAtStart = collapsedSpanAt(line, from.ch);
3792
+ else updateLineHeight(line, 0);
3793
+ }
3794
+ addMarkedSpan(line, span);
3795
+ ++curLine;
3796
+ });
3797
+ if (marker.collapsed) doc.iter(from.line, to.line + 1, function(line) {
3798
+ if (lineIsHidden(doc, line)) updateLineHeight(line, 0);
3799
+ });
3800
+
3801
+ if (marker.clearOnEnter) on(marker, "beforeCursorEnter", function() { marker.clear(); });
3802
+
3803
+ if (marker.readOnly) {
3804
+ sawReadOnlySpans = true;
3805
+ if (doc.history.done.length || doc.history.undone.length)
3806
+ doc.clearHistory();
3807
+ }
3808
+ if (marker.collapsed) {
3809
+ if (collapsedAtStart != collapsedAtEnd)
3810
+ throw new Error("Inserting collapsed marker overlapping an existing one");
3811
+ marker.size = size;
3812
+ marker.atomic = true;
3813
+ }
3814
+ if (cm) {
3815
+ if (updateMaxLine) cm.curOp.updateMaxLine = true;
3816
+ if (marker.className || marker.title || marker.startStyle || marker.endStyle || marker.collapsed)
3817
+ regChange(cm, from.line, to.line + 1);
3818
+ if (marker.atomic) reCheckSelection(cm);
3819
+ }
3820
+ return marker;
3821
+ }
3822
+
3823
+ // SHARED TEXTMARKERS
3824
+
3825
+ function SharedTextMarker(markers, primary) {
3826
+ this.markers = markers;
3827
+ this.primary = primary;
3828
+ for (var i = 0, me = this; i < markers.length; ++i) {
3829
+ markers[i].parent = this;
3830
+ on(markers[i], "clear", function(){me.clear();});
3831
+ }
3832
+ }
3833
+ CodeMirror.SharedTextMarker = SharedTextMarker;
3834
+ eventMixin(SharedTextMarker);
3835
+
3836
+ SharedTextMarker.prototype.clear = function() {
3837
+ if (this.explicitlyCleared) return;
3838
+ this.explicitlyCleared = true;
3839
+ for (var i = 0; i < this.markers.length; ++i)
3840
+ this.markers[i].clear();
3841
+ signalLater(this, "clear");
3842
+ };
3843
+ SharedTextMarker.prototype.find = function() {
3844
+ return this.primary.find();
3845
+ };
3846
+
3847
+ function markTextShared(doc, from, to, options, type) {
3848
+ options = copyObj(options);
3849
+ options.shared = false;
3850
+ var markers = [markText(doc, from, to, options, type)], primary = markers[0];
3851
+ var widget = options.replacedWith;
3852
+ linkedDocs(doc, function(doc) {
3853
+ if (widget) options.replacedWith = widget.cloneNode(true);
3854
+ markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type));
3855
+ for (var i = 0; i < doc.linked.length; ++i)
3856
+ if (doc.linked[i].isParent) return;
3857
+ primary = lst(markers);
3858
+ });
3859
+ return new SharedTextMarker(markers, primary);
3860
+ }
3861
+
3862
+ // TEXTMARKER SPANS
3863
+
3864
+ function getMarkedSpanFor(spans, marker) {
3865
+ if (spans) for (var i = 0; i < spans.length; ++i) {
3866
+ var span = spans[i];
3867
+ if (span.marker == marker) return span;
3868
+ }
3869
+ }
3870
+ function removeMarkedSpan(spans, span) {
3871
+ for (var r, i = 0; i < spans.length; ++i)
3872
+ if (spans[i] != span) (r || (r = [])).push(spans[i]);
3873
+ return r;
3874
+ }
3875
+ function addMarkedSpan(line, span) {
3876
+ line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];
3877
+ span.marker.attachLine(line);
3878
+ }
3879
+
3880
+ function markedSpansBefore(old, startCh, isInsert) {
3881
+ if (old) for (var i = 0, nw; i < old.length; ++i) {
3882
+ var span = old[i], marker = span.marker;
3883
+ var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);
3884
+ if (startsBefore || marker.type == "bookmark" && span.from == startCh && (!isInsert || !span.marker.insertLeft)) {
3885
+ var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh);
3886
+ (nw || (nw = [])).push({from: span.from,
3887
+ to: endsAfter ? null : span.to,
3888
+ marker: marker});
3889
+ }
3890
+ }
3891
+ return nw;
3892
+ }
3893
+
3894
+ function markedSpansAfter(old, endCh, isInsert) {
3895
+ if (old) for (var i = 0, nw; i < old.length; ++i) {
3896
+ var span = old[i], marker = span.marker;
3897
+ var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);
3898
+ if (endsAfter || marker.type == "bookmark" && span.from == endCh && (!isInsert || span.marker.insertLeft)) {
3899
+ var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh);
3900
+ (nw || (nw = [])).push({from: startsBefore ? null : span.from - endCh,
3901
+ to: span.to == null ? null : span.to - endCh,
3902
+ marker: marker});
3903
+ }
3904
+ }
3905
+ return nw;
3906
+ }
3907
+
3908
+ function stretchSpansOverChange(doc, change) {
3909
+ var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans;
3910
+ var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans;
3911
+ if (!oldFirst && !oldLast) return null;
3912
+
3913
+ var startCh = change.from.ch, endCh = change.to.ch, isInsert = posEq(change.from, change.to);
3914
+ // Get the spans that 'stick out' on both sides
3915
+ var first = markedSpansBefore(oldFirst, startCh, isInsert);
3916
+ var last = markedSpansAfter(oldLast, endCh, isInsert);
3917
+
3918
+ // Next, merge those two ends
3919
+ var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0);
3920
+ if (first) {
3921
+ // Fix up .to properties of first
3922
+ for (var i = 0; i < first.length; ++i) {
3923
+ var span = first[i];
3924
+ if (span.to == null) {
3925
+ var found = getMarkedSpanFor(last, span.marker);
3926
+ if (!found) span.to = startCh;
3927
+ else if (sameLine) span.to = found.to == null ? null : found.to + offset;
3928
+ }
3929
+ }
3930
+ }
3931
+ if (last) {
3932
+ // Fix up .from in last (or move them into first in case of sameLine)
3933
+ for (var i = 0; i < last.length; ++i) {
3934
+ var span = last[i];
3935
+ if (span.to != null) span.to += offset;
3936
+ if (span.from == null) {
3937
+ var found = getMarkedSpanFor(first, span.marker);
3938
+ if (!found) {
3939
+ span.from = offset;
3940
+ if (sameLine) (first || (first = [])).push(span);
3941
+ }
3942
+ } else {
3943
+ span.from += offset;
3944
+ if (sameLine) (first || (first = [])).push(span);
3945
+ }
3946
+ }
3947
+ }
3948
+ if (sameLine && first) {
3949
+ // Make sure we didn't create any zero-length spans
3950
+ for (var i = 0; i < first.length; ++i)
3951
+ if (first[i].from != null && first[i].from == first[i].to && first[i].marker.type != "bookmark")
3952
+ first.splice(i--, 1);
3953
+ if (!first.length) first = null;
3954
+ }
3955
+
3956
+ var newMarkers = [first];
3957
+ if (!sameLine) {
3958
+ // Fill gap with whole-line-spans
3959
+ var gap = change.text.length - 2, gapMarkers;
3960
+ if (gap > 0 && first)
3961
+ for (var i = 0; i < first.length; ++i)
3962
+ if (first[i].to == null)
3963
+ (gapMarkers || (gapMarkers = [])).push({from: null, to: null, marker: first[i].marker});
3964
+ for (var i = 0; i < gap; ++i)
3965
+ newMarkers.push(gapMarkers);
3966
+ newMarkers.push(last);
3967
+ }
3968
+ return newMarkers;
3969
+ }
3970
+
3971
+ function mergeOldSpans(doc, change) {
3972
+ var old = getOldSpans(doc, change);
3973
+ var stretched = stretchSpansOverChange(doc, change);
3974
+ if (!old) return stretched;
3975
+ if (!stretched) return old;
3976
+
3977
+ for (var i = 0; i < old.length; ++i) {
3978
+ var oldCur = old[i], stretchCur = stretched[i];
3979
+ if (oldCur && stretchCur) {
3980
+ spans: for (var j = 0; j < stretchCur.length; ++j) {
3981
+ var span = stretchCur[j];
3982
+ for (var k = 0; k < oldCur.length; ++k)
3983
+ if (oldCur[k].marker == span.marker) continue spans;
3984
+ oldCur.push(span);
3985
+ }
3986
+ } else if (stretchCur) {
3987
+ old[i] = stretchCur;
3988
+ }
3989
+ }
3990
+ return old;
3991
+ }
3992
+
3993
+ function removeReadOnlyRanges(doc, from, to) {
3994
+ var markers = null;
3995
+ doc.iter(from.line, to.line + 1, function(line) {
3996
+ if (line.markedSpans) for (var i = 0; i < line.markedSpans.length; ++i) {
3997
+ var mark = line.markedSpans[i].marker;
3998
+ if (mark.readOnly && (!markers || indexOf(markers, mark) == -1))
3999
+ (markers || (markers = [])).push(mark);
4000
+ }
4001
+ });
4002
+ if (!markers) return null;
4003
+ var parts = [{from: from, to: to}];
4004
+ for (var i = 0; i < markers.length; ++i) {
4005
+ var mk = markers[i], m = mk.find();
4006
+ for (var j = 0; j < parts.length; ++j) {
4007
+ var p = parts[j];
4008
+ if (posLess(p.to, m.from) || posLess(m.to, p.from)) continue;
4009
+ var newParts = [j, 1];
4010
+ if (posLess(p.from, m.from) || !mk.inclusiveLeft && posEq(p.from, m.from))
4011
+ newParts.push({from: p.from, to: m.from});
4012
+ if (posLess(m.to, p.to) || !mk.inclusiveRight && posEq(p.to, m.to))
4013
+ newParts.push({from: m.to, to: p.to});
4014
+ parts.splice.apply(parts, newParts);
4015
+ j += newParts.length - 1;
4016
+ }
4017
+ }
4018
+ return parts;
4019
+ }
4020
+
4021
+ function collapsedSpanAt(line, ch) {
4022
+ var sps = sawCollapsedSpans && line.markedSpans, found;
4023
+ if (sps) for (var sp, i = 0; i < sps.length; ++i) {
4024
+ sp = sps[i];
4025
+ if (!sp.marker.collapsed) continue;
4026
+ if ((sp.from == null || sp.from < ch) &&
4027
+ (sp.to == null || sp.to > ch) &&
4028
+ (!found || found.width < sp.marker.width))
4029
+ found = sp.marker;
4030
+ }
4031
+ return found;
4032
+ }
4033
+ function collapsedSpanAtStart(line) { return collapsedSpanAt(line, -1); }
4034
+ function collapsedSpanAtEnd(line) { return collapsedSpanAt(line, line.text.length + 1); }
4035
+
4036
+ function visualLine(doc, line) {
4037
+ var merged;
4038
+ while (merged = collapsedSpanAtStart(line))
4039
+ line = getLine(doc, merged.find().from.line);
4040
+ return line;
4041
+ }
4042
+
4043
+ function lineIsHidden(doc, line) {
4044
+ var sps = sawCollapsedSpans && line.markedSpans;
4045
+ if (sps) for (var sp, i = 0; i < sps.length; ++i) {
4046
+ sp = sps[i];
4047
+ if (!sp.marker.collapsed) continue;
4048
+ if (sp.from == null) return true;
4049
+ if (sp.marker.replacedWith) continue;
4050
+ if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))
4051
+ return true;
4052
+ }
4053
+ }
4054
+ function lineIsHiddenInner(doc, line, span) {
4055
+ if (span.to == null) {
4056
+ var end = span.marker.find().to, endLine = getLine(doc, end.line);
4057
+ return lineIsHiddenInner(doc, endLine, getMarkedSpanFor(endLine.markedSpans, span.marker));
4058
+ }
4059
+ if (span.marker.inclusiveRight && span.to == line.text.length)
4060
+ return true;
4061
+ for (var sp, i = 0; i < line.markedSpans.length; ++i) {
4062
+ sp = line.markedSpans[i];
4063
+ if (sp.marker.collapsed && !sp.marker.replacedWith && sp.from == span.to &&
4064
+ (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&
4065
+ lineIsHiddenInner(doc, line, sp)) return true;
4066
+ }
4067
+ }
4068
+
4069
+ function detachMarkedSpans(line) {
4070
+ var spans = line.markedSpans;
4071
+ if (!spans) return;
4072
+ for (var i = 0; i < spans.length; ++i)
4073
+ spans[i].marker.detachLine(line);
4074
+ line.markedSpans = null;
4075
+ }
4076
+
4077
+ function attachMarkedSpans(line, spans) {
4078
+ if (!spans) return;
4079
+ for (var i = 0; i < spans.length; ++i)
4080
+ spans[i].marker.attachLine(line);
4081
+ line.markedSpans = spans;
4082
+ }
4083
+
4084
+ // LINE WIDGETS
4085
+
4086
+ var LineWidget = CodeMirror.LineWidget = function(cm, node, options) {
4087
+ if (options) for (var opt in options) if (options.hasOwnProperty(opt))
4088
+ this[opt] = options[opt];
4089
+ this.cm = cm;
4090
+ this.node = node;
4091
+ };
4092
+ eventMixin(LineWidget);
4093
+ function widgetOperation(f) {
4094
+ return function() {
4095
+ var withOp = !this.cm.curOp;
4096
+ if (withOp) startOperation(this.cm);
4097
+ try {var result = f.apply(this, arguments);}
4098
+ finally {if (withOp) endOperation(this.cm);}
4099
+ return result;
4100
+ };
4101
+ }
4102
+ LineWidget.prototype.clear = widgetOperation(function() {
4103
+ var ws = this.line.widgets, no = lineNo(this.line);
4104
+ if (no == null || !ws) return;
4105
+ for (var i = 0; i < ws.length; ++i) if (ws[i] == this) ws.splice(i--, 1);
4106
+ if (!ws.length) this.line.widgets = null;
4107
+ var aboveVisible = heightAtLine(this.cm, this.line) < this.cm.doc.scrollTop;
4108
+ updateLineHeight(this.line, Math.max(0, this.line.height - widgetHeight(this)));
4109
+ if (aboveVisible) addToScrollPos(this.cm, 0, -this.height);
4110
+ regChange(this.cm, no, no + 1);
4111
+ });
4112
+ LineWidget.prototype.changed = widgetOperation(function() {
4113
+ var oldH = this.height;
4114
+ this.height = null;
4115
+ var diff = widgetHeight(this) - oldH;
4116
+ if (!diff) return;
4117
+ updateLineHeight(this.line, this.line.height + diff);
4118
+ var no = lineNo(this.line);
4119
+ regChange(this.cm, no, no + 1);
4120
+ });
4121
+
4122
+ function widgetHeight(widget) {
4123
+ if (widget.height != null) return widget.height;
4124
+ if (!widget.node.parentNode || widget.node.parentNode.nodeType != 1)
4125
+ removeChildrenAndAdd(widget.cm.display.measure, elt("div", [widget.node], null, "position: relative"));
4126
+ return widget.height = widget.node.offsetHeight;
4127
+ }
4128
+
4129
+ function addLineWidget(cm, handle, node, options) {
4130
+ var widget = new LineWidget(cm, node, options);
4131
+ if (widget.noHScroll) cm.display.alignWidgets = true;
4132
+ changeLine(cm, handle, function(line) {
4133
+ var widgets = line.widgets || (line.widgets = []);
4134
+ if (widget.insertAt == null) widgets.push(widget);
4135
+ else widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget);
4136
+ widget.line = line;
4137
+ if (!lineIsHidden(cm.doc, line) || widget.showIfHidden) {
4138
+ var aboveVisible = heightAtLine(cm, line) < cm.doc.scrollTop;
4139
+ updateLineHeight(line, line.height + widgetHeight(widget));
4140
+ if (aboveVisible) addToScrollPos(cm, 0, widget.height);
4141
+ }
4142
+ return true;
4143
+ });
4144
+ return widget;
4145
+ }
4146
+
4147
+ // LINE DATA STRUCTURE
4148
+
4149
+ // Line objects. These hold state related to a line, including
4150
+ // highlighting info (the styles array).
4151
+ var Line = CodeMirror.Line = function(text, markedSpans, estimateHeight) {
4152
+ this.text = text;
4153
+ attachMarkedSpans(this, markedSpans);
4154
+ this.height = estimateHeight ? estimateHeight(this) : 1;
4155
+ };
4156
+ eventMixin(Line);
4157
+
4158
+ function updateLine(line, text, markedSpans, estimateHeight) {
4159
+ line.text = text;
4160
+ if (line.stateAfter) line.stateAfter = null;
4161
+ if (line.styles) line.styles = null;
4162
+ if (line.order != null) line.order = null;
4163
+ detachMarkedSpans(line);
4164
+ attachMarkedSpans(line, markedSpans);
4165
+ var estHeight = estimateHeight ? estimateHeight(line) : 1;
4166
+ if (estHeight != line.height) updateLineHeight(line, estHeight);
4167
+ }
4168
+
4169
+ function cleanUpLine(line) {
4170
+ line.parent = null;
4171
+ detachMarkedSpans(line);
4172
+ }
4173
+
4174
+ // Run the given mode's parser over a line, update the styles
4175
+ // array, which contains alternating fragments of text and CSS
4176
+ // classes.
4177
+ function runMode(cm, text, mode, state, f) {
4178
+ var flattenSpans = mode.flattenSpans;
4179
+ if (flattenSpans == null) flattenSpans = cm.options.flattenSpans;
4180
+ var curStart = 0, curStyle = null;
4181
+ var stream = new StringStream(text, cm.options.tabSize), style;
4182
+ if (text == "" && mode.blankLine) mode.blankLine(state);
4183
+ while (!stream.eol()) {
4184
+ if (stream.pos > cm.options.maxHighlightLength) {
4185
+ flattenSpans = false;
4186
+ // Webkit seems to refuse to render text nodes longer than 57444 characters
4187
+ stream.pos = Math.min(text.length, stream.start + 50000);
4188
+ style = null;
4189
+ } else {
4190
+ style = mode.token(stream, state);
4191
+ }
4192
+ if (!flattenSpans || curStyle != style) {
4193
+ if (curStart < stream.start) f(stream.start, curStyle);
4194
+ curStart = stream.start; curStyle = style;
4195
+ }
4196
+ stream.start = stream.pos;
4197
+ }
4198
+ if (curStart < stream.pos) f(stream.pos, curStyle);
4199
+ }
4200
+
4201
+ function highlightLine(cm, line, state) {
4202
+ // A styles array always starts with a number identifying the
4203
+ // mode/overlays that it is based on (for easy invalidation).
4204
+ var st = [cm.state.modeGen];
4205
+ // Compute the base array of styles
4206
+ runMode(cm, line.text, cm.doc.mode, state, function(end, style) {st.push(end, style);});
4207
+
4208
+ // Run overlays, adjust style array.
4209
+ for (var o = 0; o < cm.state.overlays.length; ++o) {
4210
+ var overlay = cm.state.overlays[o], i = 1, at = 0;
4211
+ runMode(cm, line.text, overlay.mode, true, function(end, style) {
4212
+ var start = i;
4213
+ // Ensure there's a token end at the current position, and that i points at it
4214
+ while (at < end) {
4215
+ var i_end = st[i];
4216
+ if (i_end > end)
4217
+ st.splice(i, 1, end, st[i+1], i_end);
4218
+ i += 2;
4219
+ at = Math.min(end, i_end);
4220
+ }
4221
+ if (!style) return;
4222
+ if (overlay.opaque) {
4223
+ st.splice(start, i - start, end, style);
4224
+ i = start + 2;
4225
+ } else {
4226
+ for (; start < i; start += 2) {
4227
+ var cur = st[start+1];
4228
+ st[start+1] = cur ? cur + " " + style : style;
4229
+ }
4230
+ }
4231
+ });
4232
+ }
4233
+
4234
+ return st;
4235
+ }
4236
+
4237
+ function getLineStyles(cm, line) {
4238
+ if (!line.styles || line.styles[0] != cm.state.modeGen)
4239
+ line.styles = highlightLine(cm, line, line.stateAfter = getStateBefore(cm, lineNo(line)));
4240
+ return line.styles;
4241
+ }
4242
+
4243
+ // Lightweight form of highlight -- proceed over this line and
4244
+ // update state, but don't save a style array.
4245
+ function processLine(cm, line, state) {
4246
+ var mode = cm.doc.mode;
4247
+ var stream = new StringStream(line.text, cm.options.tabSize);
4248
+ if (line.text == "" && mode.blankLine) mode.blankLine(state);
4249
+ while (!stream.eol() && stream.pos <= cm.options.maxHighlightLength) {
4250
+ mode.token(stream, state);
4251
+ stream.start = stream.pos;
4252
+ }
4253
+ }
4254
+
4255
+ var styleToClassCache = {};
4256
+ function styleToClass(style) {
4257
+ if (!style) return null;
4258
+ return styleToClassCache[style] ||
4259
+ (styleToClassCache[style] = "cm-" + style.replace(/ +/g, " cm-"));
4260
+ }
4261
+
4262
+ function lineContent(cm, realLine, measure, copyWidgets) {
4263
+ var merged, line = realLine, empty = true;
4264
+ while (merged = collapsedSpanAtStart(line))
4265
+ line = getLine(cm.doc, merged.find().from.line);
4266
+
4267
+ var builder = {pre: elt("pre"), col: 0, pos: 0,
4268
+ measure: null, measuredSomething: false, cm: cm,
4269
+ copyWidgets: copyWidgets};
4270
+ if (line.textClass) builder.pre.className = line.textClass;
4271
+
4272
+ do {
4273
+ if (line.text) empty = false;
4274
+ builder.measure = line == realLine && measure;
4275
+ builder.pos = 0;
4276
+ builder.addToken = builder.measure ? buildTokenMeasure : buildToken;
4277
+ if ((ie || webkit) && cm.getOption("lineWrapping"))
4278
+ builder.addToken = buildTokenSplitSpaces(builder.addToken);
4279
+ var next = insertLineContent(line, builder, getLineStyles(cm, line));
4280
+ if (measure && line == realLine && !builder.measuredSomething) {
4281
+ measure[0] = builder.pre.appendChild(zeroWidthElement(cm.display.measure));
4282
+ builder.measuredSomething = true;
4283
+ }
4284
+ if (next) line = getLine(cm.doc, next.to.line);
4285
+ } while (next);
4286
+
4287
+ if (measure && !builder.measuredSomething && !measure[0])
4288
+ measure[0] = builder.pre.appendChild(empty ? elt("span", "\u00a0") : zeroWidthElement(cm.display.measure));
4289
+ if (!builder.pre.firstChild && !lineIsHidden(cm.doc, realLine))
4290
+ builder.pre.appendChild(document.createTextNode("\u00a0"));
4291
+
4292
+ var order;
4293
+ // Work around problem with the reported dimensions of single-char
4294
+ // direction spans on IE (issue #1129). See also the comment in
4295
+ // cursorCoords.
4296
+ if (measure && ie && (order = getOrder(line))) {
4297
+ var l = order.length - 1;
4298
+ if (order[l].from == order[l].to) --l;
4299
+ var last = order[l], prev = order[l - 1];
4300
+ if (last.from + 1 == last.to && prev && last.level < prev.level) {
4301
+ var span = measure[builder.pos - 1];
4302
+ if (span) span.parentNode.insertBefore(span.measureRight = zeroWidthElement(cm.display.measure),
4303
+ span.nextSibling);
4304
+ }
4305
+ }
4306
+
4307
+ signal(cm, "renderLine", cm, realLine, builder.pre);
4308
+ return builder.pre;
4309
+ }
4310
+
4311
+ var tokenSpecialChars = /[\t\u0000-\u0019\u00ad\u200b\u2028\u2029\uFEFF]/g;
4312
+ function buildToken(builder, text, style, startStyle, endStyle, title) {
4313
+ if (!text) return;
4314
+ if (!tokenSpecialChars.test(text)) {
4315
+ builder.col += text.length;
4316
+ var content = document.createTextNode(text);
4317
+ } else {
4318
+ var content = document.createDocumentFragment(), pos = 0;
4319
+ while (true) {
4320
+ tokenSpecialChars.lastIndex = pos;
4321
+ var m = tokenSpecialChars.exec(text);
4322
+ var skipped = m ? m.index - pos : text.length - pos;
4323
+ if (skipped) {
4324
+ content.appendChild(document.createTextNode(text.slice(pos, pos + skipped)));
4325
+ builder.col += skipped;
4326
+ }
4327
+ if (!m) break;
4328
+ pos += skipped + 1;
4329
+ if (m[0] == "\t") {
4330
+ var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;
4331
+ content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab"));
4332
+ builder.col += tabWidth;
4333
+ } else {
4334
+ var token = elt("span", "\u2022", "cm-invalidchar");
4335
+ token.title = "\\u" + m[0].charCodeAt(0).toString(16);
4336
+ content.appendChild(token);
4337
+ builder.col += 1;
4338
+ }
4339
+ }
4340
+ }
4341
+ if (style || startStyle || endStyle || builder.measure) {
4342
+ var fullStyle = style || "";
4343
+ if (startStyle) fullStyle += startStyle;
4344
+ if (endStyle) fullStyle += endStyle;
4345
+ var token = elt("span", [content], fullStyle);
4346
+ if (title) token.title = title;
4347
+ return builder.pre.appendChild(token);
4348
+ }
4349
+ builder.pre.appendChild(content);
4350
+ }
4351
+
4352
+ function buildTokenMeasure(builder, text, style, startStyle, endStyle) {
4353
+ var wrapping = builder.cm.options.lineWrapping;
4354
+ for (var i = 0; i < text.length; ++i) {
4355
+ var ch = text.charAt(i), start = i == 0;
4356
+ if (ch >= "\ud800" && ch < "\udbff" && i < text.length - 1) {
4357
+ ch = text.slice(i, i + 2);
4358
+ ++i;
4359
+ } else if (i && wrapping && spanAffectsWrapping(text, i)) {
4360
+ builder.pre.appendChild(elt("wbr"));
4361
+ }
4362
+ var old = builder.measure[builder.pos];
4363
+ var span = builder.measure[builder.pos] =
4364
+ buildToken(builder, ch, style,
4365
+ start && startStyle, i == text.length - 1 && endStyle);
4366
+ if (old) span.leftSide = old.leftSide || old;
4367
+ // In IE single-space nodes wrap differently than spaces
4368
+ // embedded in larger text nodes, except when set to
4369
+ // white-space: normal (issue #1268).
4370
+ if (ie && wrapping && ch == " " && i && !/\s/.test(text.charAt(i - 1)) &&
4371
+ i < text.length - 1 && !/\s/.test(text.charAt(i + 1)))
4372
+ span.style.whiteSpace = "normal";
4373
+ builder.pos += ch.length;
4374
+ }
4375
+ if (text.length) builder.measuredSomething = true;
4376
+ }
4377
+
4378
+ function buildTokenSplitSpaces(inner) {
4379
+ function split(old) {
4380
+ var out = " ";
4381
+ for (var i = 0; i < old.length - 2; ++i) out += i % 2 ? " " : "\u00a0";
4382
+ out += " ";
4383
+ return out;
4384
+ }
4385
+ return function(builder, text, style, startStyle, endStyle, title) {
4386
+ return inner(builder, text.replace(/ {3,}/, split), style, startStyle, endStyle, title);
4387
+ };
4388
+ }
4389
+
4390
+ function buildCollapsedSpan(builder, size, marker, ignoreWidget) {
4391
+ var widget = !ignoreWidget && marker.replacedWith;
4392
+ if (widget) {
4393
+ if (builder.copyWidgets) widget = widget.cloneNode(true);
4394
+ builder.pre.appendChild(widget);
4395
+ if (builder.measure) {
4396
+ if (size) {
4397
+ builder.measure[builder.pos] = widget;
4398
+ } else {
4399
+ var elt = builder.measure[builder.pos] = zeroWidthElement(builder.cm.display.measure);
4400
+ if (marker.type != "bookmark" || marker.insertLeft)
4401
+ builder.pre.insertBefore(elt, widget);
4402
+ else
4403
+ builder.pre.appendChild(elt);
4404
+ }
4405
+ builder.measuredSomething = true;
4406
+ }
4407
+ }
4408
+ builder.pos += size;
4409
+ }
4410
+
4411
+ // Outputs a number of spans to make up a line, taking highlighting
4412
+ // and marked text into account.
4413
+ function insertLineContent(line, builder, styles) {
4414
+ var spans = line.markedSpans, allText = line.text, at = 0;
4415
+ if (!spans) {
4416
+ for (var i = 1; i < styles.length; i+=2)
4417
+ builder.addToken(builder, allText.slice(at, at = styles[i]), styleToClass(styles[i+1]));
4418
+ return;
4419
+ }
4420
+
4421
+ var len = allText.length, pos = 0, i = 1, text = "", style;
4422
+ var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, title, collapsed;
4423
+ for (;;) {
4424
+ if (nextChange == pos) { // Update current marker set
4425
+ spanStyle = spanEndStyle = spanStartStyle = title = "";
4426
+ collapsed = null; nextChange = Infinity;
4427
+ var foundBookmark = null;
4428
+ for (var j = 0; j < spans.length; ++j) {
4429
+ var sp = spans[j], m = sp.marker;
4430
+ if (sp.from <= pos && (sp.to == null || sp.to > pos)) {
4431
+ if (sp.to != null && nextChange > sp.to) { nextChange = sp.to; spanEndStyle = ""; }
4432
+ if (m.className) spanStyle += " " + m.className;
4433
+ if (m.startStyle && sp.from == pos) spanStartStyle += " " + m.startStyle;
4434
+ if (m.endStyle && sp.to == nextChange) spanEndStyle += " " + m.endStyle;
4435
+ if (m.title && !title) title = m.title;
4436
+ if (m.collapsed && (!collapsed || collapsed.marker.size < m.size))
4437
+ collapsed = sp;
4438
+ } else if (sp.from > pos && nextChange > sp.from) {
4439
+ nextChange = sp.from;
4440
+ }
4441
+ if (m.type == "bookmark" && sp.from == pos && m.replacedWith) foundBookmark = m;
4442
+ }
4443
+ if (collapsed && (collapsed.from || 0) == pos) {
4444
+ buildCollapsedSpan(builder, (collapsed.to == null ? len : collapsed.to) - pos,
4445
+ collapsed.marker, collapsed.from == null);
4446
+ if (collapsed.to == null) return collapsed.marker.find();
4447
+ }
4448
+ if (foundBookmark && !collapsed) buildCollapsedSpan(builder, 0, foundBookmark);
4449
+ }
4450
+ if (pos >= len) break;
4451
+
4452
+ var upto = Math.min(len, nextChange);
4453
+ while (true) {
4454
+ if (text) {
4455
+ var end = pos + text.length;
4456
+ if (!collapsed) {
4457
+ var tokenText = end > upto ? text.slice(0, upto - pos) : text;
4458
+ builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,
4459
+ spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", title);
4460
+ }
4461
+ if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;}
4462
+ pos = end;
4463
+ spanStartStyle = "";
4464
+ }
4465
+ text = allText.slice(at, at = styles[i++]);
4466
+ style = styleToClass(styles[i++]);
4467
+ }
4468
+ }
4469
+ }
4470
+
4471
+ // DOCUMENT DATA STRUCTURE
4472
+
4473
+ function updateDoc(doc, change, markedSpans, selAfter, estimateHeight) {
4474
+ function spansFor(n) {return markedSpans ? markedSpans[n] : null;}
4475
+ function update(line, text, spans) {
4476
+ updateLine(line, text, spans, estimateHeight);
4477
+ signalLater(line, "change", line, change);
4478
+ }
4479
+
4480
+ var from = change.from, to = change.to, text = change.text;
4481
+ var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line);
4482
+ var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line;
4483
+
4484
+ // First adjust the line structure
4485
+ if (from.ch == 0 && to.ch == 0 && lastText == "") {
4486
+ // This is a whole-line replace. Treated specially to make
4487
+ // sure line objects move the way they are supposed to.
4488
+ for (var i = 0, e = text.length - 1, added = []; i < e; ++i)
4489
+ added.push(new Line(text[i], spansFor(i), estimateHeight));
4490
+ update(lastLine, lastLine.text, lastSpans);
4491
+ if (nlines) doc.remove(from.line, nlines);
4492
+ if (added.length) doc.insert(from.line, added);
4493
+ } else if (firstLine == lastLine) {
4494
+ if (text.length == 1) {
4495
+ update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans);
4496
+ } else {
4497
+ for (var added = [], i = 1, e = text.length - 1; i < e; ++i)
4498
+ added.push(new Line(text[i], spansFor(i), estimateHeight));
4499
+ added.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight));
4500
+ update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));
4501
+ doc.insert(from.line + 1, added);
4502
+ }
4503
+ } else if (text.length == 1) {
4504
+ update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0));
4505
+ doc.remove(from.line + 1, nlines);
4506
+ } else {
4507
+ update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));
4508
+ update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans);
4509
+ for (var i = 1, e = text.length - 1, added = []; i < e; ++i)
4510
+ added.push(new Line(text[i], spansFor(i), estimateHeight));
4511
+ if (nlines > 1) doc.remove(from.line + 1, nlines - 1);
4512
+ doc.insert(from.line + 1, added);
4513
+ }
4514
+
4515
+ signalLater(doc, "change", doc, change);
4516
+ setSelection(doc, selAfter.anchor, selAfter.head, null, true);
4517
+ }
4518
+
4519
+ function LeafChunk(lines) {
4520
+ this.lines = lines;
4521
+ this.parent = null;
4522
+ for (var i = 0, e = lines.length, height = 0; i < e; ++i) {
4523
+ lines[i].parent = this;
4524
+ height += lines[i].height;
4525
+ }
4526
+ this.height = height;
4527
+ }
4528
+
4529
+ LeafChunk.prototype = {
4530
+ chunkSize: function() { return this.lines.length; },
4531
+ removeInner: function(at, n) {
4532
+ for (var i = at, e = at + n; i < e; ++i) {
4533
+ var line = this.lines[i];
4534
+ this.height -= line.height;
4535
+ cleanUpLine(line);
4536
+ signalLater(line, "delete");
4537
+ }
4538
+ this.lines.splice(at, n);
4539
+ },
4540
+ collapse: function(lines) {
4541
+ lines.splice.apply(lines, [lines.length, 0].concat(this.lines));
4542
+ },
4543
+ insertInner: function(at, lines, height) {
4544
+ this.height += height;
4545
+ this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at));
4546
+ for (var i = 0, e = lines.length; i < e; ++i) lines[i].parent = this;
4547
+ },
4548
+ iterN: function(at, n, op) {
4549
+ for (var e = at + n; at < e; ++at)
4550
+ if (op(this.lines[at])) return true;
4551
+ }
4552
+ };
4553
+
4554
+ function BranchChunk(children) {
4555
+ this.children = children;
4556
+ var size = 0, height = 0;
4557
+ for (var i = 0, e = children.length; i < e; ++i) {
4558
+ var ch = children[i];
4559
+ size += ch.chunkSize(); height += ch.height;
4560
+ ch.parent = this;
4561
+ }
4562
+ this.size = size;
4563
+ this.height = height;
4564
+ this.parent = null;
4565
+ }
4566
+
4567
+ BranchChunk.prototype = {
4568
+ chunkSize: function() { return this.size; },
4569
+ removeInner: function(at, n) {
4570
+ this.size -= n;
4571
+ for (var i = 0; i < this.children.length; ++i) {
4572
+ var child = this.children[i], sz = child.chunkSize();
4573
+ if (at < sz) {
4574
+ var rm = Math.min(n, sz - at), oldHeight = child.height;
4575
+ child.removeInner(at, rm);
4576
+ this.height -= oldHeight - child.height;
4577
+ if (sz == rm) { this.children.splice(i--, 1); child.parent = null; }
4578
+ if ((n -= rm) == 0) break;
4579
+ at = 0;
4580
+ } else at -= sz;
4581
+ }
4582
+ if (this.size - n < 25) {
4583
+ var lines = [];
4584
+ this.collapse(lines);
4585
+ this.children = [new LeafChunk(lines)];
4586
+ this.children[0].parent = this;
4587
+ }
4588
+ },
4589
+ collapse: function(lines) {
4590
+ for (var i = 0, e = this.children.length; i < e; ++i) this.children[i].collapse(lines);
4591
+ },
4592
+ insertInner: function(at, lines, height) {
4593
+ this.size += lines.length;
4594
+ this.height += height;
4595
+ for (var i = 0, e = this.children.length; i < e; ++i) {
4596
+ var child = this.children[i], sz = child.chunkSize();
4597
+ if (at <= sz) {
4598
+ child.insertInner(at, lines, height);
4599
+ if (child.lines && child.lines.length > 50) {
4600
+ while (child.lines.length > 50) {
4601
+ var spilled = child.lines.splice(child.lines.length - 25, 25);
4602
+ var newleaf = new LeafChunk(spilled);
4603
+ child.height -= newleaf.height;
4604
+ this.children.splice(i + 1, 0, newleaf);
4605
+ newleaf.parent = this;
4606
+ }
4607
+ this.maybeSpill();
4608
+ }
4609
+ break;
4610
+ }
4611
+ at -= sz;
4612
+ }
4613
+ },
4614
+ maybeSpill: function() {
4615
+ if (this.children.length <= 10) return;
4616
+ var me = this;
4617
+ do {
4618
+ var spilled = me.children.splice(me.children.length - 5, 5);
4619
+ var sibling = new BranchChunk(spilled);
4620
+ if (!me.parent) { // Become the parent node
4621
+ var copy = new BranchChunk(me.children);
4622
+ copy.parent = me;
4623
+ me.children = [copy, sibling];
4624
+ me = copy;
4625
+ } else {
4626
+ me.size -= sibling.size;
4627
+ me.height -= sibling.height;
4628
+ var myIndex = indexOf(me.parent.children, me);
4629
+ me.parent.children.splice(myIndex + 1, 0, sibling);
4630
+ }
4631
+ sibling.parent = me.parent;
4632
+ } while (me.children.length > 10);
4633
+ me.parent.maybeSpill();
4634
+ },
4635
+ iterN: function(at, n, op) {
4636
+ for (var i = 0, e = this.children.length; i < e; ++i) {
4637
+ var child = this.children[i], sz = child.chunkSize();
4638
+ if (at < sz) {
4639
+ var used = Math.min(n, sz - at);
4640
+ if (child.iterN(at, used, op)) return true;
4641
+ if ((n -= used) == 0) break;
4642
+ at = 0;
4643
+ } else at -= sz;
4644
+ }
4645
+ }
4646
+ };
4647
+
4648
+ var nextDocId = 0;
4649
+ var Doc = CodeMirror.Doc = function(text, mode, firstLine) {
4650
+ if (!(this instanceof Doc)) return new Doc(text, mode, firstLine);
4651
+ if (firstLine == null) firstLine = 0;
4652
+
4653
+ BranchChunk.call(this, [new LeafChunk([new Line("", null)])]);
4654
+ this.first = firstLine;
4655
+ this.scrollTop = this.scrollLeft = 0;
4656
+ this.cantEdit = false;
4657
+ this.history = makeHistory();
4658
+ this.cleanGeneration = 1;
4659
+ this.frontier = firstLine;
4660
+ var start = Pos(firstLine, 0);
4661
+ this.sel = {from: start, to: start, head: start, anchor: start, shift: false, extend: false, goalColumn: null};
4662
+ this.id = ++nextDocId;
4663
+ this.modeOption = mode;
4664
+
4665
+ if (typeof text == "string") text = splitLines(text);
4666
+ updateDoc(this, {from: start, to: start, text: text}, null, {head: start, anchor: start});
4667
+ };
4668
+
4669
+ Doc.prototype = createObj(BranchChunk.prototype, {
4670
+ constructor: Doc,
4671
+ iter: function(from, to, op) {
4672
+ if (op) this.iterN(from - this.first, to - from, op);
4673
+ else this.iterN(this.first, this.first + this.size, from);
4674
+ },
4675
+
4676
+ insert: function(at, lines) {
4677
+ var height = 0;
4678
+ for (var i = 0, e = lines.length; i < e; ++i) height += lines[i].height;
4679
+ this.insertInner(at - this.first, lines, height);
4680
+ },
4681
+ remove: function(at, n) { this.removeInner(at - this.first, n); },
4682
+
4683
+ getValue: function(lineSep) {
4684
+ var lines = getLines(this, this.first, this.first + this.size);
4685
+ if (lineSep === false) return lines;
4686
+ return lines.join(lineSep || "\n");
4687
+ },
4688
+ setValue: function(code) {
4689
+ var top = Pos(this.first, 0), last = this.first + this.size - 1;
4690
+ makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length),
4691
+ text: splitLines(code), origin: "setValue"},
4692
+ {head: top, anchor: top}, true);
4693
+ },
4694
+ replaceRange: function(code, from, to, origin) {
4695
+ from = clipPos(this, from);
4696
+ to = to ? clipPos(this, to) : from;
4697
+ replaceRange(this, code, from, to, origin);
4698
+ },
4699
+ getRange: function(from, to, lineSep) {
4700
+ var lines = getBetween(this, clipPos(this, from), clipPos(this, to));
4701
+ if (lineSep === false) return lines;
4702
+ return lines.join(lineSep || "\n");
4703
+ },
4704
+
4705
+ getLine: function(line) {var l = this.getLineHandle(line); return l && l.text;},
4706
+ setLine: function(line, text) {
4707
+ if (isLine(this, line))
4708
+ replaceRange(this, text, Pos(line, 0), clipPos(this, Pos(line)));
4709
+ },
4710
+ removeLine: function(line) {
4711
+ if (line) replaceRange(this, "", clipPos(this, Pos(line - 1)), clipPos(this, Pos(line)));
4712
+ else replaceRange(this, "", Pos(0, 0), clipPos(this, Pos(1, 0)));
4713
+ },
4714
+
4715
+ getLineHandle: function(line) {if (isLine(this, line)) return getLine(this, line);},
4716
+ getLineNumber: function(line) {return lineNo(line);},
4717
+
4718
+ getLineHandleVisualStart: function(line) {
4719
+ if (typeof line == "number") line = getLine(this, line);
4720
+ return visualLine(this, line);
4721
+ },
4722
+
4723
+ lineCount: function() {return this.size;},
4724
+ firstLine: function() {return this.first;},
4725
+ lastLine: function() {return this.first + this.size - 1;},
4726
+
4727
+ clipPos: function(pos) {return clipPos(this, pos);},
4728
+
4729
+ getCursor: function(start) {
4730
+ var sel = this.sel, pos;
4731
+ if (start == null || start == "head") pos = sel.head;
4732
+ else if (start == "anchor") pos = sel.anchor;
4733
+ else if (start == "end" || start === false) pos = sel.to;
4734
+ else pos = sel.from;
4735
+ return copyPos(pos);
4736
+ },
4737
+ somethingSelected: function() {return !posEq(this.sel.head, this.sel.anchor);},
4738
+
4739
+ setCursor: docOperation(function(line, ch, extend) {
4740
+ var pos = clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line);
4741
+ if (extend) extendSelection(this, pos);
4742
+ else setSelection(this, pos, pos);
4743
+ }),
4744
+ setSelection: docOperation(function(anchor, head) {
4745
+ setSelection(this, clipPos(this, anchor), clipPos(this, head || anchor));
4746
+ }),
4747
+ extendSelection: docOperation(function(from, to) {
4748
+ extendSelection(this, clipPos(this, from), to && clipPos(this, to));
4749
+ }),
4750
+
4751
+ getSelection: function(lineSep) {return this.getRange(this.sel.from, this.sel.to, lineSep);},
4752
+ replaceSelection: function(code, collapse, origin) {
4753
+ makeChange(this, {from: this.sel.from, to: this.sel.to, text: splitLines(code), origin: origin}, collapse || "around");
4754
+ },
4755
+ undo: docOperation(function() {makeChangeFromHistory(this, "undo");}),
4756
+ redo: docOperation(function() {makeChangeFromHistory(this, "redo");}),
4757
+
4758
+ setExtending: function(val) {this.sel.extend = val;},
4759
+
4760
+ historySize: function() {
4761
+ var hist = this.history;
4762
+ return {undo: hist.done.length, redo: hist.undone.length};
4763
+ },
4764
+ clearHistory: function() {this.history = makeHistory(this.history.maxGeneration);},
4765
+
4766
+ markClean: function() {
4767
+ this.cleanGeneration = this.changeGeneration();
4768
+ },
4769
+ changeGeneration: function() {
4770
+ this.history.lastOp = this.history.lastOrigin = null;
4771
+ return this.history.generation;
4772
+ },
4773
+ isClean: function (gen) {
4774
+ return this.history.generation == (gen || this.cleanGeneration);
4775
+ },
4776
+
4777
+ getHistory: function() {
4778
+ return {done: copyHistoryArray(this.history.done),
4779
+ undone: copyHistoryArray(this.history.undone)};
4780
+ },
4781
+ setHistory: function(histData) {
4782
+ var hist = this.history = makeHistory(this.history.maxGeneration);
4783
+ hist.done = histData.done.slice(0);
4784
+ his