YITH WooCommerce Quick View - Version 1.3.14

Version Description

Released 28 October 2019

  • New: Support for WooCommerce 3.8
  • New: Support for WordPress 5.3
  • Update: Plugin framework
  • Fix: fatal error (Uncaught Error: Call to undefined function curl_init() )
Download this release

Release Info

Developer yithemes
Plugin Icon 128x128 YITH WooCommerce Quick View
Version 1.3.14
Comparing to
See all releases

Code changes from version 1.3.12 to 1.3.14

README.txt CHANGED
@@ -1,239 +1,252 @@
1
- === Plugin Name ===
2
- Contributors: yithemes
3
- Tags: woocommerce, quick view, woocommerce quick view, products quick view
4
- Requires at least: 4.0
5
- Tested up to: 5.2
6
- Stable tag: 1.3.12
7
- License: GPLv2 or later
8
- License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
-
10
- This plugin adds the possibility to have a quick preview of the products right from product list
11
-
12
- == Description ==
13
- Sometimes the halfway is better: what if you are looking to a product in a list and its image is still too small?
14
-
15
- You have to open its product page, waiting for its loading and finally observe what you are interested into.
16
- So why don't use a simple way to look immediately at the product's distinctiveness? Here it is what Quick View can offer you.
17
-
18
- People are more attracted to what they can see clearly. And often the classic product lists are not enough to understand the real value of a product.
19
- That's when Quick View strikes successfully! Your clients will be free to look in a better way your products, reading also a small description with all the most important features and qualities you want to underline.
20
- In this way, they will be more focused on what they really want and they will proceed easily to the purchase step.
21
-
22
- **Main features:**
23
-
24
- * Add a button in product loop to open a modal window with the product summary using ajax
25
- * Choose to enable the prettyPhoto lightbox for images in quick view
26
- * Customize style of modal
27
-
28
-
29
- Full documentation is available [here](http://yithemes.com/docs-plugins/yith-woocommerce-quick-view/).
30
-
31
- == Installation ==
32
-
33
- 1. Unzip the downloaded zip file.
34
- 2. Upload the plugin folder into the `wp-content/plugins/` directory of your WordPress site.
35
- 3. Activate `YITH WooCommerce Quick View` from Plugins page.
36
-
37
- == Screenshots ==
38
-
39
- 1. The plugin admin page.
40
- 2. The quick view button in shop page.
41
- 3. The quick view modal.
42
-
43
- == Changelog ==
44
-
45
- = 1.3.12 = Released Jul 31 - 2019
46
-
47
- * New: Support to WooCommerce 3.7.0 RC1
48
- * New: Plugin admin panel style
49
- * Update: Plugin Core
50
-
51
- = 1.3.11 = Released Jun 12 - 2019
52
-
53
- * Update: Plugin Core
54
-
55
- = 1.3.10 = Released Jun 11 - 2019
56
-
57
- * New: Support to WooCommerce 3.6.4
58
- * New: Support to WordPress 5.2.1
59
- * Update: Plugin Core
60
-
61
- = 1.3.9 = Released Apr 23 - 2019
62
-
63
- * New: Support to WooCommerce 3.6.1
64
- * Update: Plugin Core
65
-
66
- = 1.3.8 = Released Apr 02 - 2019
67
-
68
- * New: Support to WooCommerce 3.6.0 RC1
69
- * Update: Plugin Core
70
- * Fix: Style issue on Storefront theme
71
-
72
- = 1.3.7 = Released Feb 21 - 2019
73
-
74
- * New: Support to WooCommerce 3.5.5
75
- * New: Support to WordPress 5.1.0
76
- * Update: Plugin Core
77
- * Fix: Conflict with YITH WooCommerce Gift Card form in checkout page
78
-
79
- = 1.3.6 = Released Dec 06 - 2018
80
-
81
- * New: Support to WooCommerce 3.5.2
82
- * New: Support to WordPress 5.0.0
83
- * Update: Plugin Core
84
-
85
- = 1.3.5 = Released Oct 24 - 2018
86
-
87
- * New: Support to WooCommerce 3.5.0
88
- * Update: Plugin Core
89
-
90
- = 1.3.4 = Released Oct 05 - 2018
91
-
92
- * New: Support to WooCommerce 3.5.0 RC1
93
- * New: Compatibility with YITH WooCommerce Gift Card
94
- * Update: Plugin Core
95
-
96
- = 1.3.3 = Released Sep 27 - 2018
97
-
98
- * Update: Plugin Core
99
- * Dev: New filter "yith_wcqv_show_quick_view_button"
100
-
101
- = 1.3.2 = Released Sep 12 - 2018
102
-
103
- * New: Support to WooCommerce 3.4.5
104
- * New: Support to WordPress 4.9.8
105
- * Update: Plugin Core
106
- * Fix: Now is possible use shortcode [yith_quick_view] without specify the "product_id" parameter
107
-
108
- = 1.3.1 = Released May 30 - 2018
109
-
110
- * New: Support to WooCommerce 3.4.0
111
- * New: Support to WordPress 4.9.6
112
- * Update: Plugin Core
113
- * Fix: Product image zoom in Quick View modal
114
- * Fix: Removed redirect to single product page after add to cart
115
- * Fix: WPML compatibility issue
116
-
117
- = 1.3.0 = Released Feb 01 - 2018
118
-
119
- * New: Support to WooCommerce 3.3.0
120
- * New: Support to WordPress 4.9.2
121
- * Update: Plugin Core
122
-
123
- = 1.2.2 = Released Oct 11 - 2017
124
-
125
- * New: Support to WooCommerce 3.2.0 RC2
126
- * New: Support to WordPress 4.8.2
127
- * Fix: Compatibility issue with YITH WooCommerce Product Bundles
128
- * Update: Plugin Core
129
-
130
- = 1.2.1 = Released Apr 05 - 2017
131
-
132
- * Fix: Compatibility issue with YITH WooCommerce Wishlist
133
- * Update: Plugin Core
134
-
135
- = 1.2.0 = Released Mar 31 - 2017
136
-
137
- * New: Support to WordPress 4.7.3
138
- * New: Support to WooCommerce 3.0.0 RC2
139
- * New: Shortcode [yith_quick_view product_id="" label=""] for print "quick view" button of specified product
140
- * Update: Plugin Core
141
-
142
- = 1.1.4 = Released Oct 24 - 2016
143
-
144
- * Fix: Status code 404 for "Quick View" on single product page
145
-
146
- = 1.1.3 = Released Oct 20 - 2016
147
-
148
- * New: Support to WooCommerce 2.6.5
149
- * New: Support to WordPress 4.6.1
150
- * Update: Plugin Core.
151
- * Fix: Responsive style.
152
- * Fix: Add inline css using WordPress function wp_add_inline_style.
153
-
154
- = 1.1.2 = Released Jun 10 - 2016
155
-
156
- * New: Added minimized js files. Plugin loads full files version if the constant "SCRIPT_DEBUG" is defined and is true.
157
- * New: Support to WooCommerce 2.6 RC1
158
- * Update: Plugin Core
159
-
160
- = 1.1.1 = Released Apr 18 - 2016
161
-
162
- * New: Compatibility with WordPress 4.5
163
- * Update: Plugin Core
164
-
165
- = 1.1.0 = Released Oct 30 - 2015
166
-
167
- * New: Compatibility with YITH WooCommerce Wishlist
168
- * New: Compatibility with YITH WooCommerce Badge Management
169
- * New: Italian Language
170
- * Update: Language file .pot. Changed textdomain to yith-wcqv to yith-woocommerce-quick-view
171
- * Update: Plugin Core
172
-
173
- = 1.0.8 = Released Aug 24 - 2015
174
-
175
- * Fix: Main template issue
176
-
177
- = 1.0.7 = Released Aug 21 - 2015
178
-
179
- * New: Compatibility with Wordpress 4.3
180
- * New: WPML config xml
181
- * Update: Language file .pot
182
- * Fix: Default variation select
183
-
184
- = 1.0.6 = Released Aug 12 - 2015
185
-
186
- * Update: Plugin Core
187
-
188
- = 1.0.5 = Released Aug 11 - 2015
189
-
190
- * New: Compatibility with WooCommerce 2.4
191
- * Update: Plugin Core
192
- * Update: Language file
193
-
194
- = 1.0.4 = Released May 18 - 2015
195
-
196
- * New option for enable quick view also in mobile device
197
- * Compatibility with Wordpress 4.2.2
198
- * Minor bug fix
199
- * Update Plugin Core
200
- * Update Language file
201
-
202
- = 1.0.3 = Released Mar 11 - 2015
203
-
204
- * Minor bug fix
205
- * Update Plugin Core
206
-
207
- = 1.0.2 = Released Mar 06 - 2015
208
-
209
- * New: Action yith_quick_view_custom_style_scripts
210
- * New: Filter 'yith_quick_view_loader_gif
211
-
212
- = 1.0.1 = Released Feb 26 - 2015
213
-
214
- * Minor bug fix
215
-
216
- = 1.0.0 = Released Feb 17 - 2015
217
-
218
- * Initial release
219
-
220
- == Suggestions ==
221
-
222
- If you have suggestions about how to improve YITH WooCommerce Quick View, you can [write us](mailto:plugins@yithemes.com "Your Inspiration Themes") so we can bundle them into YITH WooCommerce Quick View.
223
-
224
- == Translators ==
225
-
226
- = Available Languages =
227
- * English
228
- * Italian
229
-
230
- If you can't find this plugin in your language and want to translate it, use the dedicated tool at [Translating WordPress](https://translate.wordpress.org/locale/it/default/wp-plugins/yith-woocommerce-quick-view "Translating WordPress").
231
- Or, if you have created your own language pack, or have an update for an existing one, you can send it as an email attachment from our [Contacts page](http://yithemes.com/contact/ "Your Inspiration Themes") and we will bundle into YITH WooCommerce Quick View.
232
-
233
- == Upgrade notice ==
234
-
235
- = 1.3.12 = Released Jul 31 - 2019
236
-
237
- * New: Support to WooCommerce 3.7.0 RC1
238
- * New: Plugin admin panel style
 
 
 
 
 
 
 
 
 
 
 
 
 
239
  * Update: Plugin Core
1
+ === Plugin Name ===
2
+ Contributors: yithemes
3
+ Tags: woocommerce, quick view, woocommerce quick view, products quick view
4
+ Requires at least: 4.0
5
+ Tested up to: 5.3
6
+ Stable tag: 1.3.14
7
+ License: GPLv2 or later
8
+ License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
+
10
+ This plugin adds the possibility to have a quick preview of the products right from product list
11
+
12
+ == Description ==
13
+ Sometimes the halfway is better: what if you are looking to a product in a list and its image is still too small?
14
+
15
+ You have to open its product page, waiting for its loading and finally observe what you are interested into.
16
+ So why don't use a simple way to look immediately at the product's distinctiveness? Here it is what Quick View can offer you.
17
+
18
+ People are more attracted to what they can see clearly. And often the classic product lists are not enough to understand the real value of a product.
19
+ That's when Quick View strikes successfully! Your clients will be free to look in a better way your products, reading also a small description with all the most important features and qualities you want to underline.
20
+ In this way, they will be more focused on what they really want and they will proceed easily to the purchase step.
21
+
22
+ **Main features:**
23
+
24
+ * Add a button in product loop to open a modal window with the product summary using ajax
25
+ * Choose to enable the prettyPhoto lightbox for images in quick view
26
+ * Customize style of modal
27
+
28
+
29
+ Full documentation is available [here](http://yithemes.com/docs-plugins/yith-woocommerce-quick-view/).
30
+
31
+ == Installation ==
32
+
33
+ 1. Unzip the downloaded zip file.
34
+ 2. Upload the plugin folder into the `wp-content/plugins/` directory of your WordPress site.
35
+ 3. Activate `YITH WooCommerce Quick View` from Plugins page.
36
+
37
+ == Screenshots ==
38
+
39
+ 1. The plugin admin page.
40
+ 2. The quick view button in shop page.
41
+ 3. The quick view modal.
42
+
43
+ == Changelog ==
44
+
45
+ = 1.3.14 = Released 28 October 2019
46
+
47
+ * New: Support for WooCommerce 3.8
48
+ * New: Support for WordPress 5.3
49
+ * Update: Plugin framework
50
+ * Fix: fatal error (Uncaught Error: Call to undefined function curl_init() )
51
+
52
+ = 1.3.13 = Released 26 August 2019
53
+
54
+ * Update: plugin core
55
+ * Fix: fatal error (Uncaught Error: Call to undefined function curl_init() )
56
+
57
+
58
+ = 1.3.12 = Released 31 July 2019
59
+
60
+ * New: Support to WooCommerce 3.7.0 RC1
61
+ * New: Plugin admin panel style
62
+ * Update: Plugin Core
63
+
64
+ = 1.3.11 = Released 12 June 2019
65
+
66
+ * Update: Plugin Core
67
+
68
+ = 1.3.10 = Released 11 June 2019
69
+
70
+ * New: Support to WooCommerce 3.6.4
71
+ * New: Support to WordPress 5.2.1
72
+ * Update: Plugin Core
73
+
74
+ = 1.3.9 = Released 23 April 2019
75
+
76
+ * New: Support to WooCommerce 3.6.1
77
+ * Update: Plugin Core
78
+
79
+ = 1.3.8 = Released 02 April 2019
80
+
81
+ * New: Support to WooCommerce 3.6.0 RC1
82
+ * Update: Plugin Core
83
+ * Fix: Style issue on Storefront theme
84
+
85
+ = 1.3.7 = Released 21 February 2019
86
+
87
+ * New: Support to WooCommerce 3.5.5
88
+ * New: Support to WordPress 5.1.0
89
+ * Update: Plugin Core
90
+ * Fix: Conflict with YITH WooCommerce Gift Card form in checkout page
91
+
92
+ = 1.3.6 = Released 06 December 2018
93
+
94
+ * New: Support to WooCommerce 3.5.2
95
+ * New: Support to WordPress 5.0.0
96
+ * Update: Plugin Core
97
+
98
+ = 1.3.5 = Released 24 October 2018
99
+
100
+ * New: Support to WooCommerce 3.5.0
101
+ * Update: Plugin Core
102
+
103
+ = 1.3.4 = Released 05 October 2018
104
+
105
+ * New: Support to WooCommerce 3.5.0 RC1
106
+ * New: Compatibility with YITH WooCommerce Gift Card
107
+ * Update: Plugin Core
108
+
109
+ = 1.3.3 = Released 27 September 2018
110
+
111
+ * Update: Plugin Core
112
+ * Dev: New filter "yith_wcqv_show_quick_view_button"
113
+
114
+ = 1.3.2 = Released 12 September 2018
115
+
116
+ * New: Support to WooCommerce 3.4.5
117
+ * New: Support to WordPress 4.9.8
118
+ * Update: Plugin Core
119
+ * Fix: Now is possible use shortcode [yith_quick_view] without specify the "product_id" parameter
120
+
121
+ = 1.3.1 = Released 30 May 2018
122
+
123
+ * New: Support to WooCommerce 3.4.0
124
+ * New: Support to WordPress 4.9.6
125
+ * Update: Plugin Core
126
+ * Fix: Product image zoom in Quick View modal
127
+ * Fix: Removed redirect to single product page after add to cart
128
+ * Fix: WPML compatibility issue
129
+
130
+ = 1.3.0 = Released 01 February 2018
131
+
132
+ * New: Support to WooCommerce 3.3.0
133
+ * New: Support to WordPress 4.9.2
134
+ * Update: Plugin Core
135
+
136
+ = 1.2.2 = Released 11 October 2017
137
+
138
+ * New: Support to WooCommerce 3.2.0 RC2
139
+ * New: Support to WordPress 4.8.2
140
+ * Fix: Compatibility issue with YITH WooCommerce Product Bundles
141
+ * Update: Plugin Core
142
+
143
+ = 1.2.1 = Released 05 April 2017
144
+
145
+ * Fix: Compatibility issue with YITH WooCommerce Wishlist
146
+ * Update: Plugin Core
147
+
148
+ = 1.2.0 = Released 31 March 2017
149
+
150
+ * New: Support to WordPress 4.7.3
151
+ * New: Support to WooCommerce 3.0.0 RC2
152
+ * New: Shortcode [yith_quick_view product_id="" label=""] for print "quick view" button of specified product
153
+ * Update: Plugin Core
154
+
155
+ = 1.1.4 = Released 24 October 2016
156
+
157
+ * Fix: Status code 404 for "Quick View" on single product page
158
+
159
+ = 1.1.3 = Released 20 October 2016
160
+
161
+ * New: Support to WooCommerce 2.6.5
162
+ * New: Support to WordPress 4.6.1
163
+ * Update: Plugin Core.
164
+ * Fix: Responsive style.
165
+ * Fix: Add inline css using WordPress function wp_add_inline_style.
166
+
167
+ = 1.1.2 = Released 10 June 2016
168
+
169
+ * New: Added minimized js files. Plugin loads full files version if the constant "SCRIPT_DEBUG" is defined and is true.
170
+ * New: Support to WooCommerce 2.6 RC1
171
+ * Update: Plugin Core
172
+
173
+ = 1.1.1 = Released 18 April 2016
174
+
175
+ * New: Compatibility with WordPress 4.5
176
+ * Update: Plugin Core
177
+
178
+ = 1.1.0 = Released 30 October 2015
179
+
180
+ * New: Compatibility with YITH WooCommerce Wishlist
181
+ * New: Compatibility with YITH WooCommerce Badge Management
182
+ * New: Italian Language
183
+ * Update: Language file .pot. Changed textdomain to yith-wcqv to yith-woocommerce-quick-view
184
+ * Update: Plugin Core
185
+
186
+ = 1.0.8 = Released 24 August 2015
187
+
188
+ * Fix: Main template issue
189
+
190
+ = 1.0.7 = Released 21 August 2015
191
+
192
+ * New: Compatibility with Wordpress 4.3
193
+ * New: WPML config xml
194
+ * Update: Language file .pot
195
+ * Fix: Default variation select
196
+
197
+ = 1.0.6 = Released 12 August 2015
198
+
199
+ * Update: Plugin Core
200
+
201
+ = 1.0.5 = Released 11 August 2015
202
+
203
+ * New: Compatibility with WooCommerce 2.4
204
+ * Update: Plugin Core
205
+ * Update: Language file
206
+
207
+ = 1.0.4 = Released 18 May 2015
208
+
209
+ * New option for enable quick view also in mobile device
210
+ * Compatibility with Wordpress 4.2.2
211
+ * Minor bug fix
212
+ * Update Plugin Core
213
+ * Update Language file
214
+
215
+ = 1.0.3 = Released 11 March 2015
216
+
217
+ * Minor bug fix
218
+ * Update Plugin Core
219
+
220
+ = 1.0.2 = Released 06 March 2015
221
+
222
+ * New: Action yith_quick_view_custom_style_scripts
223
+ * New: Filter 'yith_quick_view_loader_gif
224
+
225
+ = 1.0.1 = Released 26 February 2015
226
+
227
+ * Minor bug fix
228
+
229
+ = 1.0.0 = Released 17 February 2015
230
+
231
+ * Initial release
232
+
233
+ == Suggestions ==
234
+
235
+ If you have suggestions about how to improve YITH WooCommerce Quick View, you can [write us](mailto:plugins@yithemes.com "Your Inspiration Themes") so we can bundle them into YITH WooCommerce Quick View.
236
+
237
+ == Translators ==
238
+
239
+ = Available Languages =
240
+ * English
241
+ * Italian
242
+
243
+ If you can't find this plugin in your language and want to translate it, use the dedicated tool at [Translating WordPress](https://translate.wordpress.org/locale/it/default/wp-plugins/yith-woocommerce-quick-view "Translating WordPress").
244
+ Or, if you have created your own language pack, or have an update for an existing one, you can send it as an email attachment from our [Contacts page](http://yithemes.com/contact/ "Your Inspiration Themes") and we will bundle into YITH WooCommerce Quick View.
245
+
246
+ == Upgrade notice ==
247
+
248
+ = 1.3.12 = Released 31 Jul 2019
249
+
250
+ * New: Support to WooCommerce 3.7.0 RC1
251
+ * New: Plugin admin panel style
252
  * Update: Plugin Core
assets/css/yith-quick-view.css CHANGED
@@ -1,156 +1,156 @@
1
- /*=======================
2
- * MODAL POPUP STYLE
3
- ========================*/
4
-
5
- html.yith-quick-view-is-open,
6
- html.yith-quick-view-is-open body {
7
- overflow: hidden;
8
- }
9
-
10
- #yith-quick-view-modal {
11
- position: fixed;
12
- visibility: hidden;
13
- top: 0;
14
- left: 0;
15
- right: 0;
16
- bottom: 0;
17
- z-index: 1400;
18
- opacity: 0;
19
- text-align: center;
20
- -webkit-transition: all 0.3s;
21
- -moz-transition: all 0.3s;
22
- transition: all 0.3s;
23
- }
24
-
25
- #yith-quick-view-modal:before {
26
- content: '';
27
- display: inline-block;
28
- vertical-align: middle;
29
- height: 100%;
30
- width: 0;
31
- }
32
-
33
- #yith-quick-view-modal .yith-quick-view-overlay {
34
- position: absolute;
35
- top: 0;
36
- right: 0;
37
- bottom: 0;
38
- left: 0;
39
- background: rgba( 0, 0, 0, 0.8);
40
- }
41
-
42
- #yith-quick-view-modal .yith-wcqv-wrapper {
43
- display: inline-block;
44
- vertical-align: middle;
45
- visibility: hidden;
46
- -webkit-backface-visibility: hidden;
47
- -moz-backface-visibility: hidden;
48
- backface-visibility: hidden;
49
- text-align: left;
50
- height: 600px;
51
- width: 1000px;
52
- }
53
-
54
- #yith-quick-view-modal .yith-wcqv-main {
55
- -webkit-transform: translateY(20%);
56
- -moz-transform: translateY(20%);
57
- -ms-transform: translateY(20%);
58
- transform: translateY(20%);
59
- opacity: 0;
60
- height: 100%;
61
- -webkit-transition: all 0.3s;
62
- -moz-transition: all 0.3s;
63
- transition: all 0.3s;
64
- -webkit-box-shadow: 0 0 0 10px rgba(255, 255, 255, 0.2);
65
- box-shadow: 0 0 0 10px rgba(255, 255, 255, 0.2);
66
- }
67
-
68
- #yith-quick-view-modal.open,
69
- #yith-quick-view-modal.open .yith-wcqv-wrapper {
70
- visibility: visible;
71
- opacity: 1;
72
- }
73
-
74
- #yith-quick-view-modal #yith-quick-view-content {
75
- height: 100%;
76
- }
77
-
78
- #yith-quick-view-modal .yith-wcqv-main:after,
79
- #yith-quick-view-modal .yith-wcqv-main:before {
80
- content: '';
81
- display: table;
82
- clear: both;
83
- }
84
- #yith-quick-view-modal.open .yith-wcqv-main {
85
- -webkit-transform: translateY(0);
86
- -moz-transform: translateY(0);
87
- -ms-transform: translateY(0);
88
- transform: translateY(0);
89
- opacity: 1;
90
- height: 100%;
91
- overflow-y: scroll;
92
- position: relative;
93
- }
94
- #yith-quick-view-close {
95
- border: 1px solid;
96
- position: absolute;
97
- top: 5px;
98
- right: 5px;
99
- width: 20px;
100
- height: 20px;
101
- text-align: center;
102
- line-height: 18px;
103
- z-index: 2;
104
- opacity: 0.5;
105
- }
106
- #yith-quick-view-close:hover {
107
- opacity: 1;
108
- transition: all 0.2s ease;
109
- -webkit-transition: all 0.2s ease;
110
- -moz-transition: all 0.2s ease;
111
- -ms-transition: all 0.2s ease;
112
- }
113
- #yith-quick-view-content div.images {
114
- width: 40%;
115
- float: left;
116
- opacity: 1 !important;
117
- margin: 0;
118
- }
119
- #yith-quick-view-content div.summary {
120
- margin: 0;
121
- padding: 15px;
122
- width: 60%;
123
- float: left;
124
- }
125
- #yith-quick-view-content div.woocommerce-product-rating:after,
126
- #yith-quick-view-content div.woocommerce-product-rating:before {
127
- content: '';
128
- display: table;
129
- clear: both;
130
- }
131
- #yith-quick-view-content div.woocommerce-product-rating a.woocommerce-review-link {
132
- display: none;
133
- }
134
- #yith-quick-view-content .onsale {
135
- top: 5px;
136
- right: auto;
137
- left: 5px;
138
- }
139
-
140
- li.product .yith-wcqv-button .blockUI.blockOverlay:before {
141
- background: none;
142
- }
143
-
144
- @media( max-width: 480px ) {
145
- #yith-quick-view-content div.images,
146
- #yith-quick-view-content div.summary {
147
- width: 100%;
148
- float: none;
149
- }
150
- #yith-quick-view-content div.summary {
151
- margin: 0;
152
- padding: 15px;
153
- width: 100%;
154
- float: left;
155
- }
156
  }
1
+ /*=======================
2
+ * MODAL POPUP STYLE
3
+ ========================*/
4
+
5
+ html.yith-quick-view-is-open,
6
+ html.yith-quick-view-is-open body {
7
+ overflow: hidden;
8
+ }
9
+
10
+ #yith-quick-view-modal {
11
+ position: fixed;
12
+ visibility: hidden;
13
+ top: 0;
14
+ left: 0;
15
+ right: 0;
16
+ bottom: 0;
17
+ z-index: 1400;
18
+ opacity: 0;
19
+ text-align: center;
20
+ -webkit-transition: all 0.3s;
21
+ -moz-transition: all 0.3s;
22
+ transition: all 0.3s;
23
+ }
24
+
25
+ #yith-quick-view-modal:before {
26
+ content: '';
27
+ display: inline-block;
28
+ vertical-align: middle;
29
+ height: 100%;
30
+ width: 0;
31
+ }
32
+
33
+ #yith-quick-view-modal .yith-quick-view-overlay {
34
+ position: absolute;
35
+ top: 0;
36
+ right: 0;
37
+ bottom: 0;
38
+ left: 0;
39
+ background: rgba( 0, 0, 0, 0.8);
40
+ }
41
+
42
+ #yith-quick-view-modal .yith-wcqv-wrapper {
43
+ display: inline-block;
44
+ vertical-align: middle;
45
+ visibility: hidden;
46
+ -webkit-backface-visibility: hidden;
47
+ -moz-backface-visibility: hidden;
48
+ backface-visibility: hidden;
49
+ text-align: left;
50
+ height: 600px;
51
+ width: 1000px;
52
+ }
53
+
54
+ #yith-quick-view-modal .yith-wcqv-main {
55
+ -webkit-transform: translateY(20%);
56
+ -moz-transform: translateY(20%);
57
+ -ms-transform: translateY(20%);
58
+ transform: translateY(20%);
59
+ opacity: 0;
60
+ height: 100%;
61
+ -webkit-transition: all 0.3s;
62
+ -moz-transition: all 0.3s;
63
+ transition: all 0.3s;
64
+ -webkit-box-shadow: 0 0 0 10px rgba(255, 255, 255, 0.2);
65
+ box-shadow: 0 0 0 10px rgba(255, 255, 255, 0.2);
66
+ }
67
+
68
+ #yith-quick-view-modal.open,
69
+ #yith-quick-view-modal.open .yith-wcqv-wrapper {
70
+ visibility: visible;
71
+ opacity: 1;
72
+ }
73
+
74
+ #yith-quick-view-modal #yith-quick-view-content {
75
+ height: 100%;
76
+ }
77
+
78
+ #yith-quick-view-modal .yith-wcqv-main:after,
79
+ #yith-quick-view-modal .yith-wcqv-main:before {
80
+ content: '';
81
+ display: table;
82
+ clear: both;
83
+ }
84
+ #yith-quick-view-modal.open .yith-wcqv-main {
85
+ -webkit-transform: translateY(0);
86
+ -moz-transform: translateY(0);
87
+ -ms-transform: translateY(0);
88
+ transform: translateY(0);
89
+ opacity: 1;
90
+ height: 100%;
91
+ overflow-y: scroll;
92
+ position: relative;
93
+ }
94
+ #yith-quick-view-close {
95
+ border: 1px solid;
96
+ position: absolute;
97
+ top: 5px;
98
+ right: 5px;
99
+ width: 20px;
100
+ height: 20px;
101
+ text-align: center;
102
+ line-height: 18px;
103
+ z-index: 2;
104
+ opacity: 0.5;
105
+ }
106
+ #yith-quick-view-close:hover {
107
+ opacity: 1;
108
+ transition: all 0.2s ease;
109
+ -webkit-transition: all 0.2s ease;
110
+ -moz-transition: all 0.2s ease;
111
+ -ms-transition: all 0.2s ease;
112
+ }
113
+ #yith-quick-view-content div.images {
114
+ width: 40%;
115
+ float: left;
116
+ opacity: 1 !important;
117
+ margin: 0;
118
+ }
119
+ #yith-quick-view-content div.summary {
120
+ margin: 0;
121
+ padding: 15px;
122
+ width: 60%;
123
+ float: left;
124
+ }
125
+ #yith-quick-view-content div.woocommerce-product-rating:after,
126
+ #yith-quick-view-content div.woocommerce-product-rating:before {
127
+ content: '';
128
+ display: table;
129
+ clear: both;
130
+ }
131
+ #yith-quick-view-content div.woocommerce-product-rating a.woocommerce-review-link {
132
+ display: none;
133
+ }
134
+ #yith-quick-view-content .onsale {
135
+ top: 5px;
136
+ right: auto;
137
+ left: 5px;
138
+ }
139
+
140
+ li.product .yith-wcqv-button .blockUI.blockOverlay:before {
141
+ background: none;
142
+ }
143
+
144
+ @media( max-width: 480px ) {
145
+ #yith-quick-view-content div.images,
146
+ #yith-quick-view-content div.summary {
147
+ width: 100%;
148
+ float: none;
149
+ }
150
+ #yith-quick-view-content div.summary {
151
+ margin: 0;
152
+ padding: 15px;
153
+ width: 100%;
154
+ float: left;
155
+ }
156
  }
assets/js/frontend.js CHANGED
@@ -1,185 +1,185 @@
1
- /**
2
- * frontend.js
3
- *
4
- * @author Your Inspiration Themes
5
- * @package YITH WooCommerce Quick View
6
- * @version 1.0.0
7
- */
8
-
9
- jQuery(document).ready(function($){
10
- "use strict";
11
-
12
- if( typeof yith_qv === 'undefined' ) {
13
- return;
14
- }
15
-
16
- var qv_modal = $(document).find( '#yith-quick-view-modal' ),
17
- qv_overlay = qv_modal.find( '.yith-quick-view-overlay'),
18
- qv_content = qv_modal.find( '#yith-quick-view-content' ),
19
- qv_close = qv_modal.find( '#yith-quick-view-close' ),
20
- qv_wrapper = qv_modal.find( '.yith-wcqv-wrapper'),
21
- qv_wrapper_w = qv_wrapper.width(),
22
- qv_wrapper_h = qv_wrapper.height(),
23
- center_modal = function() {
24
-
25
- var window_w = $(window).width(),
26
- window_h = $(window).height(),
27
- width = ( ( window_w - 60 ) > qv_wrapper_w ) ? qv_wrapper_w : ( window_w - 60 ),
28
- height = ( ( window_h - 120 ) > qv_wrapper_h ) ? qv_wrapper_h : ( window_h - 120 );
29
-
30
- qv_wrapper.css({
31
- 'left' : (( window_w/2 ) - ( width/2 )),
32
- 'top' : (( window_h/2 ) - ( height/2 )),
33
- 'width' : width + 'px',
34
- 'height' : height + 'px'
35
- });
36
- };
37
-
38
-
39
- /*==================
40
- *MAIN BUTTON OPEN
41
- ==================*/
42
-
43
- $.fn.yith_quick_view = function() {
44
-
45
- $(document).off( 'click', '.yith-wcqv-button' ).on( 'click', '.yith-wcqv-button', function(e){
46
- e.preventDefault();
47
-
48
- var t = $(this),
49
- product_id = t.data( 'product_id' ),
50
- is_blocked = false;
51
-
52
- if ( typeof yith_qv.loader !== 'undefined' ) {
53
- is_blocked = true;
54
- t.block({
55
- message: null,
56
- overlayCSS : {
57
- background: '#fff url(' + yith_qv.loader + ') no-repeat center',
58
- opacity : 0.5,
59
- cursor : 'none'
60
- }
61
- });
62
-
63
- if( ! qv_modal.hasClass( 'loading' ) ) {
64
- qv_modal.addClass('loading');
65
- }
66
-
67
- // stop loader
68
- $(document).trigger( 'qv_loading' );
69
- }
70
- ajax_call( t, product_id, is_blocked );
71
- });
72
- };
73
-
74
- /*================
75
- * MAIN AJAX CALL
76
- ================*/
77
-
78
- var ajax_call = function( t, product_id, is_blocked ) {
79
-
80
- $.ajax({
81
- url: yith_qv.ajaxurl,
82
- data: {
83
- action: 'yith_load_product_quick_view',
84
- product_id: product_id,
85
- lang: yith_qv.lang
86
- },
87
- dataType: 'html',
88
- type: 'POST',
89
- success: function (data) {
90
-
91
- qv_content.html(data);
92
-
93
- // quantity fields for WC 2.2
94
- if (yith_qv.is2_2) {
95
- qv_content.find('div.quantity:not(.buttons_added), td.quantity:not(.buttons_added)').addClass('buttons_added').append('<input type="button" value="+" class="plus" />').prepend('<input type="button" value="-" class="minus" />');
96
- }
97
-
98
- // Variation Form
99
- var form_variation = qv_content.find('.variations_form');
100
- form_variation.each( function() {
101
- $( this ).wc_variation_form();
102
- // add Color and Label Integration
103
- if( typeof $.fn.yith_wccl !== 'undefined' ) {
104
- $(this).yith_wccl();
105
- }
106
- });
107
- form_variation.trigger( 'check_variations' );
108
- form_variation.trigger( 'reset_image' );
109
-
110
- // Init prettyPhoto
111
- if (typeof $.fn.prettyPhoto !== 'undefined') {
112
- qv_content.find("a[data-rel^='prettyPhoto'], a.zoom").prettyPhoto({
113
- hook: 'data-rel',
114
- social_tools: false,
115
- theme: 'pp_woocommerce',
116
- horizontal_padding: 20,
117
- opacity: 0.8,
118
- deeplinking: false
119
- });
120
- }
121
-
122
- if( typeof $.fn.wc_product_gallery !== 'undefined' ) {
123
- qv_content.find('.woocommerce-product-gallery').each(function () {
124
- $(this).wc_product_gallery();
125
- });
126
- }
127
-
128
- if (!qv_modal.hasClass('open')) {
129
- qv_modal.removeClass('loading').addClass('open');
130
- if (is_blocked)
131
- t.unblock();
132
- }
133
-
134
- // stop loader
135
- $(document).trigger('qv_loader_stop');
136
-
137
- }
138
- });
139
- };
140
-
141
- /*===================
142
- * CLOSE QUICK VIEW
143
- ===================*/
144
-
145
- var close_modal_qv = function() {
146
-
147
- // Close box by click overlay
148
- qv_overlay.on( 'click', function(e){
149
- close_qv();
150
- });
151
- // Close box with esc key
152
- $(document).keyup(function(e){
153
- if( e.keyCode === 27 )
154
- close_qv();
155
- });
156
- // Close box by click close button
157
- qv_close.on( 'click', function(e) {
158
- e.preventDefault();
159
- close_qv();
160
- });
161
-
162
- var close_qv = function() {
163
- qv_modal.removeClass('open').removeClass('loading');
164
-
165
- setTimeout(function () {
166
- qv_content.html('');
167
- }, 1000);
168
- }
169
- };
170
-
171
- close_modal_qv();
172
-
173
-
174
- center_modal();
175
- $( window ).on( 'resize', center_modal );
176
-
177
- // START
178
- $.fn.yith_quick_view();
179
-
180
- $( document ).on( 'yith_infs_adding_elem yith-wcan-ajax-filtered', function(){
181
- // RESTART
182
- $.fn.yith_quick_view();
183
- });
184
-
185
  });
1
+ /**
2
+ * frontend.js
3
+ *
4
+ * @author Your Inspiration Themes
5
+ * @package YITH WooCommerce Quick View
6
+ * @version 1.0.0
7
+ */
8
+
9
+ jQuery(document).ready(function($){
10
+ "use strict";
11
+
12
+ if( typeof yith_qv === 'undefined' ) {
13
+ return;
14
+ }
15
+
16
+ var qv_modal = $(document).find( '#yith-quick-view-modal' ),
17
+ qv_overlay = qv_modal.find( '.yith-quick-view-overlay'),
18
+ qv_content = qv_modal.find( '#yith-quick-view-content' ),
19
+ qv_close = qv_modal.find( '#yith-quick-view-close' ),
20
+ qv_wrapper = qv_modal.find( '.yith-wcqv-wrapper'),
21
+ qv_wrapper_w = qv_wrapper.width(),
22
+ qv_wrapper_h = qv_wrapper.height(),
23
+ center_modal = function() {
24
+
25
+ var window_w = $(window).width(),
26
+ window_h = $(window).height(),
27
+ width = ( ( window_w - 60 ) > qv_wrapper_w ) ? qv_wrapper_w : ( window_w - 60 ),
28
+ height = ( ( window_h - 120 ) > qv_wrapper_h ) ? qv_wrapper_h : ( window_h - 120 );
29
+
30
+ qv_wrapper.css({
31
+ 'left' : (( window_w/2 ) - ( width/2 )),
32
+ 'top' : (( window_h/2 ) - ( height/2 )),
33
+ 'width' : width + 'px',
34
+ 'height' : height + 'px'
35
+ });
36
+ };
37
+
38
+
39
+ /*==================
40
+ *MAIN BUTTON OPEN
41
+ ==================*/
42
+
43
+ $.fn.yith_quick_view = function() {
44
+
45
+ $(document).off( 'click', '.yith-wcqv-button' ).on( 'click', '.yith-wcqv-button', function(e){
46
+ e.preventDefault();
47
+
48
+ var t = $(this),
49
+ product_id = t.data( 'product_id' ),
50
+ is_blocked = false;
51
+
52
+ if ( typeof yith_qv.loader !== 'undefined' ) {
53
+ is_blocked = true;
54
+ t.block({
55
+ message: null,
56
+ overlayCSS : {
57
+ background: '#fff url(' + yith_qv.loader + ') no-repeat center',
58
+ opacity : 0.5,
59
+ cursor : 'none'
60
+ }
61
+ });
62
+
63
+ if( ! qv_modal.hasClass( 'loading' ) ) {
64
+ qv_modal.addClass('loading');
65
+ }
66
+
67
+ // stop loader
68
+ $(document).trigger( 'qv_loading' );
69
+ }
70
+ ajax_call( t, product_id, is_blocked );
71
+ });
72
+ };
73
+
74
+ /*================
75
+ * MAIN AJAX CALL
76
+ ================*/
77
+
78
+ var ajax_call = function( t, product_id, is_blocked ) {
79
+
80
+ $.ajax({
81
+ url: yith_qv.ajaxurl,
82
+ data: {
83
+ action: 'yith_load_product_quick_view',
84
+ product_id: product_id,
85
+ lang: yith_qv.lang
86
+ },
87
+ dataType: 'html',
88
+ type: 'POST',
89
+ success: function (data) {
90
+
91
+ qv_content.html(data);
92
+
93
+ // quantity fields for WC 2.2
94
+ if (yith_qv.is2_2) {
95
+ qv_content.find('div.quantity:not(.buttons_added), td.quantity:not(.buttons_added)').addClass('buttons_added').append('<input type="button" value="+" class="plus" />').prepend('<input type="button" value="-" class="minus" />');
96
+ }
97
+
98
+ // Variation Form
99
+ var form_variation = qv_content.find('.variations_form');
100
+ form_variation.each( function() {
101
+ $( this ).wc_variation_form();
102
+ // add Color and Label Integration
103
+ if( typeof $.fn.yith_wccl !== 'undefined' ) {
104
+ $(this).yith_wccl();
105
+ }
106
+ });
107
+ form_variation.trigger( 'check_variations' );
108
+ form_variation.trigger( 'reset_image' );
109
+
110
+ // Init prettyPhoto
111
+ if (typeof $.fn.prettyPhoto !== 'undefined') {
112
+ qv_content.find("a[data-rel^='prettyPhoto'], a.zoom").prettyPhoto({
113
+ hook: 'data-rel',
114
+ social_tools: false,
115
+ theme: 'pp_woocommerce',
116
+ horizontal_padding: 20,
117
+ opacity: 0.8,
118
+ deeplinking: false
119
+ });
120
+ }
121
+
122
+ if( typeof $.fn.wc_product_gallery !== 'undefined' ) {
123
+ qv_content.find('.woocommerce-product-gallery').each(function () {
124
+ $(this).wc_product_gallery();
125
+ });
126
+ }
127
+
128
+ if (!qv_modal.hasClass('open')) {
129
+ qv_modal.removeClass('loading').addClass('open');
130
+ if (is_blocked)
131
+ t.unblock();
132
+ }
133
+
134
+ // stop loader
135
+ $(document).trigger('qv_loader_stop');
136
+
137
+ }
138
+ });
139
+ };
140
+
141
+ /*===================
142
+ * CLOSE QUICK VIEW
143
+ ===================*/
144
+
145
+ var close_modal_qv = function() {
146
+
147
+ // Close box by click overlay
148
+ qv_overlay.on( 'click', function(e){
149
+ close_qv();
150
+ });
151
+ // Close box with esc key
152
+ $(document).keyup(function(e){
153
+ if( e.keyCode === 27 )
154
+ close_qv();
155
+ });
156
+ // Close box by click close button
157
+ qv_close.on( 'click', function(e) {
158
+ e.preventDefault();
159
+ close_qv();
160
+ });
161
+
162
+ var close_qv = function() {
163
+ qv_modal.removeClass('open').removeClass('loading');
164
+
165
+ setTimeout(function () {
166
+ qv_content.html('');
167
+ }, 1000);
168
+ }
169
+ };
170
+
171
+ close_modal_qv();
172
+
173
+
174
+ center_modal();
175
+ $( window ).on( 'resize', center_modal );
176
+
177
+ // START
178
+ $.fn.yith_quick_view();
179
+
180
+ $( document ).on( 'yith_infs_adding_elem yith-wcan-ajax-filtered', function(){
181
+ // RESTART
182
+ $.fn.yith_quick_view();
183
+ });
184
+
185
  });
assets/js/frontend.min.js CHANGED
@@ -1,8 +1,8 @@
1
- /**
2
- * frontend.js
3
- *
4
- * @author Your Inspiration Themes
5
- * @package YITH WooCommerce Quick View
6
- * @version 1.0.0
7
- */
8
  jQuery(document).ready(function(e){"use strict";if("undefined"!=typeof yith_qv){var a=e(document).find("#yith-quick-view-modal"),t=a.find(".yith-quick-view-overlay"),c=a.find("#yith-quick-view-content"),n=a.find("#yith-quick-view-close"),d=a.find(".yith-wcqv-wrapper"),u=d.width(),r=d.height(),i=function(){var t=e(window).width(),i=e(window).height(),n=u<t-60?u:t-60,o=r<i-120?r:i-120;d.css({left:t/2-n/2,top:i/2-o/2,width:n+"px",height:o+"px"})};e.fn.yith_quick_view=function(){e(document).off("click",".yith-wcqv-button").on("click",".yith-wcqv-button",function(t){t.preventDefault();var i=e(this),n=i.data("product_id"),o=!1;void 0!==yith_qv.loader&&(o=!0,i.block({message:null,overlayCSS:{background:"#fff url("+yith_qv.loader+") no-repeat center",opacity:.5,cursor:"none"}}),a.hasClass("loading")||a.addClass("loading"),e(document).trigger("qv_loading")),l(i,n,o)})};var l=function(n,t,o){e.ajax({url:yith_qv.ajaxurl,data:{action:"yith_load_product_quick_view",product_id:t,lang:yith_qv.lang},dataType:"html",type:"POST",success:function(t){c.html(t),yith_qv.is2_2&&c.find("div.quantity:not(.buttons_added), td.quantity:not(.buttons_added)").addClass("buttons_added").append('<input type="button" value="+" class="plus" />').prepend('<input type="button" value="-" class="minus" />');var i=c.find(".variations_form");i.each(function(){e(this).wc_variation_form(),void 0!==e.fn.yith_wccl&&e(this).yith_wccl()}),i.trigger("check_variations"),i.trigger("reset_image"),void 0!==e.fn.prettyPhoto&&c.find("a[data-rel^='prettyPhoto'], a.zoom").prettyPhoto({hook:"data-rel",social_tools:!1,theme:"pp_woocommerce",horizontal_padding:20,opacity:.8,deeplinking:!1}),void 0!==e.fn.wc_product_gallery&&c.find(".woocommerce-product-gallery").each(function(){e(this).wc_product_gallery()}),a.hasClass("open")||(a.removeClass("loading").addClass("open"),o&&n.unblock()),e(document).trigger("qv_loader_stop")}})};!function(){t.on("click",function(t){i()}),e(document).keyup(function(t){27===t.keyCode&&i()}),n.on("click",function(t){t.preventDefault(),i()});var i=function(){a.removeClass("open").removeClass("loading"),setTimeout(function(){c.html("")},1e3)}}(),i(),e(window).on("resize",i),e.fn.yith_quick_view(),e(document).on("yith_infs_adding_elem yith-wcan-ajax-filtered",function(){e.fn.yith_quick_view()})}});
1
+ /**
2
+ * frontend.js
3
+ *
4
+ * @author Your Inspiration Themes
5
+ * @package YITH WooCommerce Quick View
6
+ * @version 1.0.0
7
+ */
8
  jQuery(document).ready(function(e){"use strict";if("undefined"!=typeof yith_qv){var a=e(document).find("#yith-quick-view-modal"),t=a.find(".yith-quick-view-overlay"),c=a.find("#yith-quick-view-content"),n=a.find("#yith-quick-view-close"),d=a.find(".yith-wcqv-wrapper"),u=d.width(),r=d.height(),i=function(){var t=e(window).width(),i=e(window).height(),n=u<t-60?u:t-60,o=r<i-120?r:i-120;d.css({left:t/2-n/2,top:i/2-o/2,width:n+"px",height:o+"px"})};e.fn.yith_quick_view=function(){e(document).off("click",".yith-wcqv-button").on("click",".yith-wcqv-button",function(t){t.preventDefault();var i=e(this),n=i.data("product_id"),o=!1;void 0!==yith_qv.loader&&(o=!0,i.block({message:null,overlayCSS:{background:"#fff url("+yith_qv.loader+") no-repeat center",opacity:.5,cursor:"none"}}),a.hasClass("loading")||a.addClass("loading"),e(document).trigger("qv_loading")),l(i,n,o)})};var l=function(n,t,o){e.ajax({url:yith_qv.ajaxurl,data:{action:"yith_load_product_quick_view",product_id:t,lang:yith_qv.lang},dataType:"html",type:"POST",success:function(t){c.html(t),yith_qv.is2_2&&c.find("div.quantity:not(.buttons_added), td.quantity:not(.buttons_added)").addClass("buttons_added").append('<input type="button" value="+" class="plus" />').prepend('<input type="button" value="-" class="minus" />');var i=c.find(".variations_form");i.each(function(){e(this).wc_variation_form(),void 0!==e.fn.yith_wccl&&e(this).yith_wccl()}),i.trigger("check_variations"),i.trigger("reset_image"),void 0!==e.fn.prettyPhoto&&c.find("a[data-rel^='prettyPhoto'], a.zoom").prettyPhoto({hook:"data-rel",social_tools:!1,theme:"pp_woocommerce",horizontal_padding:20,opacity:.8,deeplinking:!1}),void 0!==e.fn.wc_product_gallery&&c.find(".woocommerce-product-gallery").each(function(){e(this).wc_product_gallery()}),a.hasClass("open")||(a.removeClass("loading").addClass("open"),o&&n.unblock()),e(document).trigger("qv_loader_stop")}})};!function(){t.on("click",function(t){i()}),e(document).keyup(function(t){27===t.keyCode&&i()}),n.on("click",function(t){t.preventDefault(),i()});var i=function(){a.removeClass("open").removeClass("loading"),setTimeout(function(){c.html("")},1e3)}}(),i(),e(window).on("resize",i),e.fn.yith_quick_view(),e(document).on("yith_infs_adding_elem yith-wcan-ajax-filtered",function(){e.fn.yith_quick_view()})}});
includes/class.yith-wcqv-admin.php CHANGED
@@ -1,231 +1,231 @@
1
- <?php
2
- /**
3
- * Admin class
4
- *
5
- * @author YITH
6
- * @package YITH WooCommerce Quick View
7
- * @version 1.1.1
8
- */
9
-
10
- if ( ! defined( 'YITH_WCQV' ) ) {
11
- exit;
12
- } // Exit if accessed directly
13
-
14
- if ( ! class_exists( 'YITH_WCQV_Admin' ) ) {
15
- /**
16
- * Admin class.
17
- * The class manage all the admin behaviors.
18
- *
19
- * @since 1.0.0
20
- */
21
- class YITH_WCQV_Admin {
22
-
23
- /**
24
- * Single instance of the class
25
- *
26
- * @var \YITH_WCQV_Admin
27
- * @since 1.0.0
28
- */
29
- protected static $instance;
30
-
31
- /**
32
- * Plugin options
33
- *
34
- * @var array
35
- * @access public
36
- * @since 1.0.0
37
- */
38
- public $options = array();
39
-
40
- /**
41
- * Plugin version
42
- *
43
- * @var string
44
- * @since 1.0.0
45
- */
46
- public $version = YITH_WCQV_VERSION;
47
-
48
- /**
49
- * @var $_panel Panel Object
50
- */
51
- protected $_panel;
52
-
53
- /**
54
- * @var $_premium string Premium tab template file name
55
- */
56
- protected $_premium = 'premium.php';
57
-
58
- /**
59
- * @var string Premium version landing link
60
- */
61
- protected $_premium_landing = 'https://yithemes.com/themes/plugins/yith-woocommerce-quick-view/';
62
-
63
- /**
64
- * @var string Quick View panel page
65
- */
66
- protected $_panel_page = 'yith_wcqv_panel';
67
-
68
- /**
69
- * Returns single instance of the class
70
- *
71
- * @return \YITH_WCQV_Admin
72
- * @since 1.0.0
73
- */
74
- public static function get_instance(){
75
- if( is_null( self::$instance ) ){
76
- self::$instance = new self();
77
- }
78
-
79
- return self::$instance;
80
- }
81
-
82
- /**
83
- * Constructor
84
- *
85
- * @access public
86
- * @since 1.0.0
87
- */
88
- public function __construct() {
89
-
90
- // Add panel options
91
- add_action( 'admin_menu', array( $this, 'register_panel' ), 5) ;
92
-
93
- //Add action links
94
- add_filter( 'plugin_action_links_' . plugin_basename( YITH_WCQV_DIR . '/' . basename( YITH_WCQV_FILE ) ), array( $this, 'action_links') );
95
- add_filter( 'yith_show_plugin_row_meta', array( $this, 'plugin_row_meta' ), 10, 5 );
96
-
97
- add_action( 'yith_quick_view_premium', array( $this, 'premium_tab' ) );
98
-
99
- // YITH WCQV Loaded
100
- do_action( 'yith_wcqv_loaded' );
101
-
102
- }
103
-
104
-
105
- /**
106
- * Action Links
107
- *
108
- * add the action links to plugin admin page
109
- *
110
- * @param $links | links plugin array
111
- *
112
- * @return mixed Array
113
- * @since 1.0
114
- * @author Andrea Grillo <andrea.grillo@yithemes.com>
115
- * @return mixed
116
- * @use plugin_action_links_{$plugin_file_name}
117
- */
118
- public function action_links( $links ) {
119
- $links = yith_add_action_links( $links, $this->_panel_page, false );
120
- return $links;
121
- }
122
-
123
- /**
124
- * Add a panel under YITH Plugins tab
125
- *
126
- * @return void
127
- * @since 1.0
128
- * @author Andrea Grillo <andrea.grillo@yithemes.com>
129
- * @use /Yit_Plugin_Panel class
130
- * @see plugin-fw/lib/yit-plugin-panel.php
131
- */
132
- public function register_panel() {
133
-
134
- if ( ! empty( $this->_panel ) ) {
135
- return;
136
- }
137
-
138
- $admin_tabs = array(
139
- 'settings' => __( 'Settings', 'yith-woocommerce-quick-view' ),
140
- 'premium' => __( 'Premium Version', 'yith-woocommerce-quick-view' ),
141
- );
142
-
143
- $args = array(
144
- 'create_menu_page' => true,
145
- 'parent_slug' => '',
146
- 'page_title' => _x( 'YITH WooCommerce Quick View', 'options page title', 'yith-woocommerce-quick-view' ),
147
- 'menu_title' => _x( 'Quick View', 'plugin menu title', 'yith-woocommerce-quick-view' ),
148
- 'capability' => 'manage_options',
149
- 'parent' => '',
150
- 'parent_page' => 'yith_plugin_panel',
151
- 'page' => $this->_panel_page,
152
- 'admin-tabs' => $admin_tabs,
153
- 'options-path' => YITH_WCQV_DIR . '/plugin-options',
154
- 'class' => yith_set_wrapper_class()
155
- );
156
-
157
-
158
- /* === Fixed: not updated theme === */
159
- if( ! class_exists( 'YIT_Plugin_Panel_WooCommerce' ) ) {
160
- require_once( 'plugin-fw/lib/yit-plugin-panel-wc.php' );
161
- }
162
-
163
- $this->_panel = new YIT_Plugin_Panel_WooCommerce( $args );
164
- }
165
-
166
- /**
167
- * Premium Tab Template
168
- *
169
- * Load the premium tab template on admin page
170
- *
171
- * @return void
172
- * @since 1.0
173
- * @author Andrea Grillo <andrea.grillo@yithemes.com>
174
- * @return void
175
- */
176
- public function premium_tab() {
177
- $premium_tab_template = YITH_WCQV_TEMPLATE_PATH . '/admin/' . $this->_premium;
178
- if( file_exists( $premium_tab_template ) ) {
179
- include_once($premium_tab_template);
180
- }
181
-
182
- }
183
-
184
- /**
185
- * plugin_row_meta
186
- *
187
- * add the action links to plugin admin page
188
- *
189
- * @param $plugin_meta
190
- * @param $plugin_file
191
- * @param $plugin_data
192
- * @param $status
193
- *
194
- * @return Array
195
- * @since 1.0
196
- * @author Andrea Grillo <andrea.grillo@yithemes.com>
197
- * @use plugin_row_meta
198
- */
199
- public function plugin_row_meta( $new_row_meta_args, $plugin_meta, $plugin_file, $plugin_data, $status ) {
200
- if ( defined( 'YITH_WCQV_INIT' ) && YITH_WCQV_INIT == $plugin_file ) {
201
- $new_row_meta_args['slug'] = YITH_WCQV_SLUG;
202
-
203
- if( defined( 'YITH_WCQV_PREMIUM' ) ){
204
- $new_row_meta_args['is_premium'] = true;
205
- }
206
- }
207
- return $new_row_meta_args;
208
- }
209
-
210
- /**
211
- * Get the premium landing uri
212
- *
213
- * @since 1.0.0
214
- * @author Andrea Grillo <andrea.grillo@yithemes.com>
215
- * @return string The premium landing link
216
- */
217
- public function get_premium_landing_uri(){
218
- return $this->_premium_landing;
219
- }
220
-
221
- }
222
- }
223
- /**
224
- * Unique access to instance of YITH_WCQV_Admin class
225
- *
226
- * @return \YITH_WCQV_Admin
227
- * @since 1.0.0
228
- */
229
- function YITH_WCQV_Admin(){
230
- return YITH_WCQV_Admin::get_instance();
231
  }
1
+ <?php
2
+ /**
3
+ * Admin class
4
+ *
5
+ * @author YITH
6
+ * @package YITH WooCommerce Quick View
7
+ * @version 1.1.1
8
+ */
9
+
10
+ if ( ! defined( 'YITH_WCQV' ) ) {
11
+ exit;
12
+ } // Exit if accessed directly
13
+
14
+ if ( ! class_exists( 'YITH_WCQV_Admin' ) ) {
15
+ /**
16
+ * Admin class.
17
+ * The class manage all the admin behaviors.
18
+ *
19
+ * @since 1.0.0
20
+ */
21
+ class YITH_WCQV_Admin {
22
+
23
+ /**
24
+ * Single instance of the class
25
+ *
26
+ * @var \YITH_WCQV_Admin
27
+ * @since 1.0.0
28
+ */
29
+ protected static $instance;
30
+
31
+ /**
32
+ * Plugin options
33
+ *
34
+ * @var array
35
+ * @access public
36
+ * @since 1.0.0
37
+ */
38
+ public $options = array();
39
+
40
+ /**
41
+ * Plugin version
42
+ *
43
+ * @var string
44
+ * @since 1.0.0
45
+ */
46
+ public $version = YITH_WCQV_VERSION;
47
+
48
+ /**
49
+ * @var $_panel Panel Object
50
+ */
51
+ protected $_panel;
52
+
53
+ /**
54
+ * @var $_premium string Premium tab template file name
55
+ */
56
+ protected $_premium = 'premium.php';
57
+
58
+ /**
59
+ * @var string Premium version landing link
60
+ */
61
+ protected $_premium_landing = 'https://yithemes.com/themes/plugins/yith-woocommerce-quick-view/';
62
+
63
+ /**
64
+ * @var string Quick View panel page
65
+ */
66
+ protected $_panel_page = 'yith_wcqv_panel';
67
+
68
+ /**
69
+ * Returns single instance of the class
70
+ *
71
+ * @return \YITH_WCQV_Admin
72
+ * @since 1.0.0
73
+ */
74
+ public static function get_instance(){
75
+ if( is_null( self::$instance ) ){
76
+ self::$instance = new self();
77
+ }
78
+
79
+ return self::$instance;
80
+ }
81
+
82
+ /**
83
+ * Constructor
84
+ *
85
+ * @access public
86
+ * @since 1.0.0
87
+ */
88
+ public function __construct() {
89
+
90
+ // Add panel options
91
+ add_action( 'admin_menu', array( $this, 'register_panel' ), 5) ;
92
+
93
+ //Add action links
94
+ add_filter( 'plugin_action_links_' . plugin_basename( YITH_WCQV_DIR . '/' . basename( YITH_WCQV_FILE ) ), array( $this, 'action_links') );
95
+ add_filter( 'yith_show_plugin_row_meta', array( $this, 'plugin_row_meta' ), 10, 5 );
96
+
97
+ add_action( 'yith_quick_view_premium', array( $this, 'premium_tab' ) );
98
+
99
+ // YITH WCQV Loaded
100
+ do_action( 'yith_wcqv_loaded' );
101
+
102
+ }
103
+
104
+
105
+ /**
106
+ * Action Links
107
+ *
108
+ * add the action links to plugin admin page
109
+ *
110
+ * @param $links | links plugin array
111
+ *
112
+ * @return mixed Array
113
+ * @since 1.0
114
+ * @author Andrea Grillo <andrea.grillo@yithemes.com>
115
+ * @return mixed
116
+ * @use plugin_action_links_{$plugin_file_name}
117
+ */
118
+ public function action_links( $links ) {
119
+ $links = yith_add_action_links( $links, $this->_panel_page, false );
120
+ return $links;
121
+ }
122
+
123
+ /**
124
+ * Add a panel under YITH Plugins tab
125
+ *
126
+ * @return void
127
+ * @since 1.0
128
+ * @author Andrea Grillo <andrea.grillo@yithemes.com>
129
+ * @use /Yit_Plugin_Panel class
130
+ * @see plugin-fw/lib/yit-plugin-panel.php
131
+ */
132
+ public function register_panel() {
133
+
134
+ if ( ! empty( $this->_panel ) ) {
135
+ return;
136
+ }
137
+
138
+ $admin_tabs = array(
139
+ 'settings' => __( 'Settings', 'yith-woocommerce-quick-view' ),
140
+ 'premium' => __( 'Premium Version', 'yith-woocommerce-quick-view' ),
141
+ );
142
+
143
+ $args = array(
144
+ 'create_menu_page' => true,
145
+ 'parent_slug' => '',
146
+ 'page_title' => _x( 'YITH WooCommerce Quick View', 'options page title', 'yith-woocommerce-quick-view' ),
147
+ 'menu_title' => _x( 'Quick View', 'plugin menu title', 'yith-woocommerce-quick-view' ),
148
+ 'capability' => 'manage_options',
149
+ 'parent' => '',
150
+ 'parent_page' => 'yith_plugin_panel',
151
+ 'page' => $this->_panel_page,
152
+ 'admin-tabs' => $admin_tabs,
153
+ 'options-path' => YITH_WCQV_DIR . '/plugin-options',
154
+ 'class' => yith_set_wrapper_class()
155
+ );
156
+
157
+
158
+ /* === Fixed: not updated theme === */
159
+ if( ! class_exists( 'YIT_Plugin_Panel_WooCommerce' ) ) {
160
+ require_once( 'plugin-fw/lib/yit-plugin-panel-wc.php' );
161
+ }
162
+
163
+ $this->_panel = new YIT_Plugin_Panel_WooCommerce( $args );
164
+ }
165
+
166
+ /**
167
+ * Premium Tab Template
168
+ *
169
+ * Load the premium tab template on admin page
170
+ *
171
+ * @return void
172
+ * @since 1.0
173
+ * @author Andrea Grillo <andrea.grillo@yithemes.com>
174
+ * @return void
175
+ */
176
+ public function premium_tab() {
177
+ $premium_tab_template = YITH_WCQV_TEMPLATE_PATH . '/admin/' . $this->_premium;
178
+ if( file_exists( $premium_tab_template ) ) {
179
+ include_once($premium_tab_template);
180
+ }
181
+
182
+ }
183
+
184
+ /**
185
+ * plugin_row_meta
186
+ *
187
+ * add the action links to plugin admin page
188
+ *
189
+ * @param $plugin_meta
190
+ * @param $plugin_file
191
+ * @param $plugin_data
192
+ * @param $status
193
+ *
194
+ * @return Array
195
+ * @since 1.0
196
+ * @author Andrea Grillo <andrea.grillo@yithemes.com>
197
+ * @use plugin_row_meta
198
+ */
199
+ public function plugin_row_meta( $new_row_meta_args, $plugin_meta, $plugin_file, $plugin_data, $status ) {
200
+ if ( defined( 'YITH_WCQV_INIT' ) && YITH_WCQV_INIT == $plugin_file ) {
201
+ $new_row_meta_args['slug'] = YITH_WCQV_SLUG;
202
+
203
+ if( defined( 'YITH_WCQV_PREMIUM' ) ){
204
+ $new_row_meta_args['is_premium'] = true;
205
+ }
206
+ }
207
+ return $new_row_meta_args;
208
+ }
209
+
210
+ /**
211
+ * Get the premium landing uri
212
+ *
213
+ * @since 1.0.0
214
+ * @author Andrea Grillo <andrea.grillo@yithemes.com>
215
+ * @return string The premium landing link
216
+ */
217
+ public function get_premium_landing_uri(){
218
+ return $this->_premium_landing;
219
+ }
220
+
221
+ }
222
+ }
223
+ /**
224
+ * Unique access to instance of YITH_WCQV_Admin class
225
+ *
226
+ * @return \YITH_WCQV_Admin
227
+ * @since 1.0.0
228
+ */
229
+ function YITH_WCQV_Admin(){
230
+ return YITH_WCQV_Admin::get_instance();
231
  }
includes/class.yith-wcqv-frontend.php CHANGED
@@ -1,393 +1,393 @@
1
- <?php
2
- /**
3
- * Frontend class
4
- *
5
- * @author YITH
6
- * @package YITH WooCommerce Quick View
7
- * @version 1.1.1
8
- */
9
-
10
- if ( ! defined( 'YITH_WCQV' ) ) {
11
- exit;
12
- } // Exit if accessed directly
13
-
14
- if( ! class_exists( 'YITH_WCQV_Frontend' ) ) {
15
- /**
16
- * Admin class.
17
- * The class manage all the Frontend behaviors.
18
- *
19
- * @since 1.0.0
20
- */
21
- class YITH_WCQV_Frontend {
22
-
23
- /**
24
- * Single instance of the class
25
- *
26
- * @var \YITH_WCQV_Frontend
27
- * @since 1.0.0
28
- */
29
- protected static $instance;
30
-
31
- /**
32
- * Plugin version
33
- *
34
- * @var string
35
- * @since 1.0.0
36
- */
37
- public $version = YITH_WCQV_VERSION;
38
-
39
- /**
40
- * Returns single instance of the class
41
- *
42
- * @return \YITH_WCQV_Frontend
43
- * @since 1.0.0
44
- */
45
- public static function get_instance(){
46
- if( is_null( self::$instance ) ){
47
- self::$instance = new self();
48
- }
49
-
50
- return self::$instance;
51
- }
52
-
53
- /**
54
- * Constructor
55
- *
56
- * @access public
57
- * @since 1.0.0
58
- */
59
- public function __construct() {
60
-
61
- // custom styles and javascripts
62
- add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_styles_scripts' ) );
63
-
64
- // enqueue gift card script
65
- if( defined('YITH_YWGC_FILE') ){
66
- add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_gift_card_script' ) );
67
- }
68
-
69
- // quick view ajax
70
- add_action( 'wp_ajax_yith_load_product_quick_view', array( $this, 'yith_load_product_quick_view_ajax' ) );
71
- add_action( 'wp_ajax_nopriv_yith_load_product_quick_view', array( $this, 'yith_load_product_quick_view_ajax' ) );
72
-
73
- // add button
74
- add_action( 'woocommerce_after_shop_loop_item', array( $this, 'yith_add_quick_view_button' ), 15 );
75
- add_action( 'yith_wcwl_table_after_product_name', array( $this, 'yith_add_quick_view_button' ), 15, 0 );
76
-
77
- // load modal template
78
- add_action( 'wp_footer', array( $this, 'yith_quick_view' ) );
79
-
80
- // load action for product template
81
- $this->yith_quick_view_action_template();
82
-
83
- add_shortcode( 'yith_quick_view', array( $this, 'quick_view_shortcode' ) );
84
- add_filter( 'woocommerce_add_to_cart_form_action', array( $this, 'avoid_redirect_to_single_page'), 10, 1 );
85
- }
86
-
87
- /**
88
- * Enqueue styles and scripts
89
- *
90
- * @access public
91
- * @return void
92
- * @since 1.0.0
93
- * @author Francesco Licandro <francesco.licandro@yithemes.com>
94
- */
95
- public function enqueue_styles_scripts() {
96
-
97
- $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
98
-
99
- wp_register_script( 'yith-wcqv-frontend', YITH_WCQV_ASSETS_URL . '/js/frontend'.$suffix.'.js', array('jquery'), $this->version, true);
100
- wp_enqueue_script( 'yith-wcqv-frontend' );
101
- wp_enqueue_style( 'yith-quick-view', YITH_WCQV_ASSETS_URL . '/css/yith-quick-view.css' );
102
-
103
- $background_modal = get_option( 'yith-wcqv-background-modal' );
104
- $close_color = get_option( 'yith-wcqv-close-color' );
105
- $close_color_hover = get_option( 'yith-wcqv-close-color-hover' );
106
-
107
- $inline_style = "
108
- #yith-quick-view-modal .yith-wcqv-main{background:{$background_modal};}
109
- #yith-quick-view-close{color:{$close_color};}
110
- #yith-quick-view-close:hover{color:{$close_color_hover};}";
111
-
112
- wp_add_inline_style( 'yith-quick-view', $inline_style );
113
- }
114
-
115
-
116
- /**
117
- * Enqueue scripts for YITH WooCommerce Gift Cards
118
- *
119
- * @access public
120
- * @return void
121
- * @since 1.0.0
122
- * @author Francesco Licandro <francesco.licandro@yithemes.com>
123
- */
124
- public function enqueue_gift_card_script(){
125
-
126
- if( !wp_script_is('ywgc-frontend') && !is_checkout() ){
127
- wp_register_script( "ywgc-frontend",
128
- YITH_YWGC_URL . 'assets/js/' . yit_load_js_file( 'ywgc-frontend.js' ),
129
- array(
130
- 'jquery',
131
- 'woocommerce',
132
- ),
133
- YITH_YWGC_VERSION,
134
- true );
135
-
136
- wp_enqueue_script( "ywgc-frontend" );
137
- }
138
- }
139
-
140
- /**
141
- * Add quick view button in wc product loop
142
- *
143
- * @access public
144
- * @param integer|string $product_id The product id
145
- * @param string $label The button label
146
- * @param boolean $return
147
- * @return string|void
148
- * @since 1.0.0
149
- * @author Francesco Licandro <francesco.licandro@yithemes.com>
150
- */
151
- public function yith_add_quick_view_button( $product_id = 0, $label = '', $return = false ) {
152
-
153
- global $product;
154
-
155
- if( ! $product_id ){
156
- $product instanceof WC_Product && $product_id = yit_get_prop( $product, 'id', true );
157
- }
158
-
159
- $show_quick_view_button = apply_filters( 'yith_wcqv_show_quick_view_button', true, $product_id );
160
-
161
- if( !$show_quick_view_button ) return;
162
-
163
- $button = '';
164
- if( $product_id ) {
165
- // get label
166
- ! $label && $label = $this->get_button_label();
167
-
168
- $button = '<a href="#" class="button yith-wcqv-button" data-product_id="' . $product_id . '">' . $label . '</a>';
169
- $button = apply_filters('yith_add_quick_view_button_html', $button, $label, $product);
170
- }
171
-
172
- if( $return ) {
173
- return $button;
174
- }
175
-
176
- echo $button;
177
- }
178
-
179
- /**
180
- * Enqueue scripts and pass variable to js used in quick view
181
- *
182
- * @access public
183
- * @return bool
184
- * @since 1.0.0
185
- * @author Francesco Licandro <francesco.licandro@yithemes.com>
186
- */
187
- public function yith_woocommerce_quick_view() {
188
-
189
- wp_enqueue_script( 'wc-add-to-cart-variation' );
190
- if( version_compare( WC()->version, '3.0.0', '>=' ) ) {
191
- if( current_theme_supports('wc-product-gallery-zoom') ) {
192
- wp_enqueue_script('zoom');
193
- }
194
- if( current_theme_supports('wc-product-gallery-lightbox') ) {
195
- wp_enqueue_script('photoswipe-ui-default');
196
- wp_enqueue_style('photoswipe-default-skin');
197
- if( has_action('wp_footer', 'woocommerce_photoswipe') === FALSE ) {
198
- add_action('wp_footer', 'woocommerce_photoswipe', 15);
199
- }
200
- }
201
- wp_enqueue_script('wc-single-product');
202
- }
203
-
204
- // enqueue wc color e label variation style
205
- wp_enqueue_script( 'yith_wccl_frontend' );
206
- wp_enqueue_style( 'yith_wccl_frontend' );
207
-
208
- $lightbox_en = get_option( 'yith-wcqv-enable-lightbox' ) == 'yes' ? true : false;
209
-
210
- // if enabled load prettyPhoto css
211
- if( $lightbox_en ) {
212
-
213
- $assets_path = str_replace( array( 'http:', 'https:' ), '', WC()->plugin_url() ) . '/assets/';
214
-
215
- wp_enqueue_script( 'prettyPhoto', $assets_path . 'js/prettyPhoto/jquery.prettyPhoto.min.js', array( 'jquery' ), '3.1.5', true );
216
- wp_enqueue_style( 'woocommerce_prettyPhoto_css', $assets_path . 'css/prettyPhoto.css' );
217
- }
218
-
219
- $version = version_compare( preg_replace( '/-beta-([0-9]+)/', '', WC()->version ), '2.3.0', '<' );
220
-
221
- // loader gif
222
- $loader = apply_filters( 'yith_quick_view_loader_gif', YITH_WCQV_ASSETS_URL . '/image/qv-loader.gif' );
223
-
224
- // Allow user to load custom style and scripts
225
- do_action( 'yith_quick_view_custom_style_scripts' );
226
-
227
- wp_localize_script( 'yith-wcqv-frontend', 'yith_qv', array (
228
- 'ajaxurl' => admin_url( 'admin-ajax.php', 'relative' ),
229
- 'loader' => $loader,
230
- 'is2_2' => $version,
231
- 'lang' => defined( 'ICL_LANGUAGE_CODE' ) ? ICL_LANGUAGE_CODE : ''
232
- )
233
- );
234
-
235
- return true;
236
- }
237
-
238
- /**
239
- * Ajax action to load product in quick view
240
- *
241
- * @access public
242
- * @return void
243
- * @since 1.0.0
244
- * @author Francesco Licandro <francesco.licandro@yithemes.com>
245
- */
246
- public function yith_load_product_quick_view_ajax() {
247
-
248
- if ( ! isset( $_REQUEST['product_id'] ) ) {
249
- die();
250
- }
251
-
252
- global $sitepress;
253
-
254
- $product_id = intval( $_REQUEST['product_id'] );
255
-
256
- /**
257
- * WPML Suppot: Localize Ajax Call
258
- */
259
- $lang = isset( $_REQUEST['lang'] ) ? $_REQUEST['lang'] : '';
260
- if( defined( 'ICL_LANGUAGE_CODE' ) && $lang && isset( $sitepress ) ) {
261
- $sitepress->switch_lang( $lang, true );
262
- }
263
-
264
- // set the main wp query for the product
265
- wp( 'p=' . $product_id . '&post_type=product' );
266
-
267
- // remove product thumbnails gallery
268
- remove_action( 'woocommerce_product_thumbnails', 'woocommerce_show_product_thumbnails', 20 );
269
-
270
- // change template for variable products
271
- if ( isset( $GLOBALS['yith_wccl'] ) ) {
272
- $GLOBALS['yith_wccl']->obj = new YITH_WCCL_Frontend( YITH_WCCL_VERSION );
273
- $GLOBALS['yith_wccl']->obj->override();
274
- }
275
-
276
- ob_start();
277
-
278
- // load content template
279
- wc_get_template( 'yith-quick-view-content.php', array(), '', YITH_WCQV_DIR . 'templates/' );
280
-
281
- echo ob_get_clean();
282
-
283
- die();
284
- }
285
-
286
- /**
287
- * Load quick view template
288
- *
289
- * @access public
290
- * @return void
291
- * @since 1.0.0
292
- * @author Francesco Licandro <francesco.licandro@yithemes.com>
293
- */
294
- public function yith_quick_view() {
295
- $this->yith_woocommerce_quick_view();
296
- wc_get_template( 'yith-quick-view.php', array(), '', YITH_WCQV_DIR . 'templates/' );
297
- }
298
-
299
- /**
300
- * Load wc action for quick view product template
301
- *
302
- * @access public
303
- * @return void
304
- * @since 1.0.0
305
- * @author Francesco Licandro <francesco.licandro@yithemes.com>
306
- */
307
- public function yith_quick_view_action_template() {
308
-
309
- // Image
310
- add_action( 'yith_wcqv_product_image', 'woocommerce_show_product_sale_flash', 10 );
311
- add_action( 'yith_wcqv_product_image', 'woocommerce_show_product_images', 20 );
312
-
313
- // Summary
314
- add_action( 'yith_wcqv_product_summary', 'woocommerce_template_single_title', 5 );
315
- add_action( 'yith_wcqv_product_summary', 'woocommerce_template_single_rating', 10 );
316
- add_action( 'yith_wcqv_product_summary', 'woocommerce_template_single_price', 15 );
317
- add_action( 'yith_wcqv_product_summary', 'woocommerce_template_single_excerpt', 20 );
318
- add_action( 'yith_wcqv_product_summary', 'woocommerce_template_single_add_to_cart', 25 );
319
- add_action( 'yith_wcqv_product_summary', 'woocommerce_template_single_meta', 30 );
320
- }
321
-
322
- /**
323
- * Get Quick View button label
324
- *
325
- * @author Francesco Licandro
326
- * @since 1.2.0
327
- * @return string
328
- */
329
- public function get_button_label(){
330
- $label = get_option( 'yith-wcqv-button-label' );
331
- $label = call_user_func( '__' , $label, 'yith-woocommerce-quick-view' );
332
-
333
- return apply_filters( 'yith_wcqv_button_label', esc_html( $label ) );
334
- }
335
-
336
- /**
337
- * Quick View shortcode button
338
- *
339
- * @access public
340
- * @since 1.0.7
341
- * @param array $atts
342
- * @return string
343
- * @author Francesco Licandro
344
- */
345
- public function quick_view_shortcode( $atts ) {
346
-
347
- $atts = shortcode_atts(array(
348
- 'product_id' => 0,
349
- 'label' => ''
350
- ), $atts );
351
-
352
- extract( $atts );
353
-
354
- return $this->yith_add_quick_view_button( intval( $product_id ), $label, true );
355
- }
356
-
357
- /**
358
- * Check if is quick view
359
- *
360
- * @access public
361
- * @return bool
362
- * @since 1.3.1
363
- * @author Francesco Licandro <francesco.licandro@yithemes.com>
364
- */
365
- public function yith_is_quick_view() {
366
- return ( defined('DOING_AJAX') && DOING_AJAX && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'yith_load_product_quick_view' ) ? true : false;
367
- }
368
-
369
- /**
370
- * Avoid redirect to single product page on add to cart action in quick view
371
- *
372
- * @since 1.3.1
373
- * @author Francesco Licandro
374
- * @param string $value
375
- * @return string
376
- */
377
- public function avoid_redirect_to_single_page( $value ){
378
- if( $this->yith_is_quick_view() ) {
379
- return '';
380
- }
381
- return $value;
382
- }
383
- }
384
- }
385
- /**
386
- * Unique access to instance of YITH_WCQV_Frontend class
387
- *
388
- * @return \YITH_WCQV_Frontend
389
- * @since 1.0.0
390
- */
391
- function YITH_WCQV_Frontend(){
392
- return YITH_WCQV_Frontend::get_instance();
393
- }
1
+ <?php
2
+ /**
3
+ * Frontend class
4
+ *
5
+ * @author YITH
6
+ * @package YITH WooCommerce Quick View
7
+ * @version 1.1.1
8
+ */
9
+
10
+ if ( ! defined( 'YITH_WCQV' ) ) {
11
+ exit;
12
+ } // Exit if accessed directly
13
+
14
+ if( ! class_exists( 'YITH_WCQV_Frontend' ) ) {
15
+ /**
16
+ * Admin class.
17
+ * The class manage all the Frontend behaviors.
18
+ *
19
+ * @since 1.0.0
20
+ */
21
+ class YITH_WCQV_Frontend {
22
+
23
+ /**
24
+ * Single instance of the class
25
+ *
26
+ * @var \YITH_WCQV_Frontend
27
+ * @since 1.0.0
28
+ */
29
+ protected static $instance;
30
+
31
+ /**
32
+ * Plugin version
33
+ *
34
+ * @var string
35
+ * @since 1.0.0
36
+ */
37
+ public $version = YITH_WCQV_VERSION;
38
+
39
+ /**
40
+ * Returns single instance of the class
41
+ *
42
+ * @return \YITH_WCQV_Frontend
43
+ * @since 1.0.0
44
+ */
45
+ public static function get_instance(){
46
+ if( is_null( self::$instance ) ){
47
+ self::$instance = new self();
48
+ }
49
+
50
+ return self::$instance;
51
+ }
52
+
53
+ /**
54
+ * Constructor
55
+ *
56
+ * @access public
57
+ * @since 1.0.0
58
+ */
59
+ public function __construct() {
60
+
61
+ // custom styles and javascripts
62
+ add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_styles_scripts' ) );
63
+
64
+ // enqueue gift card script
65
+ if( defined('YITH_YWGC_FILE') ){
66
+ add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_gift_card_script' ) );
67
+ }
68
+
69
+ // quick view ajax
70
+ add_action( 'wp_ajax_yith_load_product_quick_view', array( $this, 'yith_load_product_quick_view_ajax' ) );
71
+ add_action( 'wp_ajax_nopriv_yith_load_product_quick_view', array( $this, 'yith_load_product_quick_view_ajax' ) );
72
+
73
+ // add button
74
+ add_action( 'woocommerce_after_shop_loop_item', array( $this, 'yith_add_quick_view_button' ), 15 );
75
+ add_action( 'yith_wcwl_table_after_product_name', array( $this, 'yith_add_quick_view_button' ), 15, 0 );
76
+
77
+ // load modal template
78
+ add_action( 'wp_footer', array( $this, 'yith_quick_view' ) );
79
+
80
+ // load action for product template
81
+ $this->yith_quick_view_action_template();
82
+
83
+ add_shortcode( 'yith_quick_view', array( $this, 'quick_view_shortcode' ) );
84
+ add_filter( 'woocommerce_add_to_cart_form_action', array( $this, 'avoid_redirect_to_single_page'), 10, 1 );
85
+ }
86
+
87
+ /**
88
+ * Enqueue styles and scripts
89
+ *
90
+ * @access public
91
+ * @return void
92
+ * @since 1.0.0
93
+ * @author Francesco Licandro <francesco.licandro@yithemes.com>
94
+ */
95
+ public function enqueue_styles_scripts() {
96
+
97
+ $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
98
+
99
+ wp_register_script( 'yith-wcqv-frontend', YITH_WCQV_ASSETS_URL . '/js/frontend'.$suffix.'.js', array('jquery'), $this->version, true);
100
+ wp_enqueue_script( 'yith-wcqv-frontend' );
101
+ wp_enqueue_style( 'yith-quick-view', YITH_WCQV_ASSETS_URL . '/css/yith-quick-view.css' );
102
+
103
+ $background_modal = get_option( 'yith-wcqv-background-modal' );
104
+ $close_color = get_option( 'yith-wcqv-close-color' );
105
+ $close_color_hover = get_option( 'yith-wcqv-close-color-hover' );
106
+
107
+ $inline_style = "
108
+ #yith-quick-view-modal .yith-wcqv-main{background:{$background_modal};}
109
+ #yith-quick-view-close{color:{$close_color};}
110
+ #yith-quick-view-close:hover{color:{$close_color_hover};}";
111
+
112
+ wp_add_inline_style( 'yith-quick-view', $inline_style );
113
+ }
114
+
115
+
116
+ /**
117
+ * Enqueue scripts for YITH WooCommerce Gift Cards
118
+ *
119
+ * @access public
120
+ * @return void
121
+ * @since 1.0.0
122
+ * @author Francesco Licandro <francesco.licandro@yithemes.com>
123
+ */
124
+ public function enqueue_gift_card_script(){
125
+
126
+ if( !wp_script_is('ywgc-frontend') && !is_checkout() ){
127
+ wp_register_script( "ywgc-frontend",
128
+ YITH_YWGC_URL . 'assets/js/' . yit_load_js_file( 'ywgc-frontend.js' ),
129
+ array(
130
+ 'jquery',
131
+ 'woocommerce',
132
+ ),
133
+ YITH_YWGC_VERSION,
134
+ true );
135
+
136
+ wp_enqueue_script( "ywgc-frontend" );
137
+ }
138
+ }
139
+
140
+ /**
141
+ * Add quick view button in wc product loop
142
+ *
143
+ * @access public
144
+ * @param integer|string $product_id The product id
145
+ * @param string $label The button label
146
+ * @param boolean $return
147
+ * @return string|void
148
+ * @since 1.0.0
149
+ * @author Francesco Licandro <francesco.licandro@yithemes.com>
150
+ */
151
+ public function yith_add_quick_view_button( $product_id = 0, $label = '', $return = false ) {
152
+
153
+ global $product;
154
+
155
+ if( ! $product_id ){
156
+ $product instanceof WC_Product && $product_id = yit_get_prop( $product, 'id', true );
157
+ }
158
+
159
+ $show_quick_view_button = apply_filters( 'yith_wcqv_show_quick_view_button', true, $product_id );
160
+
161
+ if( !$show_quick_view_button ) return;
162
+
163
+ $button = '';
164
+ if( $product_id ) {
165
+ // get label
166
+ ! $label && $label = $this->get_button_label();
167
+
168
+ $button = '<a href="#" class="button yith-wcqv-button" data-product_id="' . $product_id . '">' . $label . '</a>';
169
+ $button = apply_filters('yith_add_quick_view_button_html', $button, $label, $product);
170
+ }
171
+
172
+ if( $return ) {
173
+ return $button;
174
+ }
175
+
176
+ echo $button;
177
+ }
178
+
179
+ /**
180
+ * Enqueue scripts and pass variable to js used in quick view
181
+ *
182
+ * @access public
183
+ * @return bool
184
+ * @since 1.0.0
185
+ * @author Francesco Licandro <francesco.licandro@yithemes.com>
186
+ */
187
+ public function yith_woocommerce_quick_view() {
188
+
189
+ wp_enqueue_script( 'wc-add-to-cart-variation' );
190
+ if( version_compare( WC()->version, '3.0.0', '>=' ) ) {
191
+ if( current_theme_supports('wc-product-gallery-zoom') ) {
192
+ wp_enqueue_script('zoom');
193
+ }
194
+ if( current_theme_supports('wc-product-gallery-lightbox') ) {
195
+ wp_enqueue_script('photoswipe-ui-default');
196
+ wp_enqueue_style('photoswipe-default-skin');
197
+ if( has_action('wp_footer', 'woocommerce_photoswipe') === FALSE ) {
198
+ add_action('wp_footer', 'woocommerce_photoswipe', 15);
199
+ }
200
+ }
201
+ wp_enqueue_script('wc-single-product');
202
+ }
203
+
204
+ // enqueue wc color e label variation style
205
+ wp_enqueue_script( 'yith_wccl_frontend' );
206
+ wp_enqueue_style( 'yith_wccl_frontend' );
207
+
208
+ $lightbox_en = get_option( 'yith-wcqv-enable-lightbox' ) == 'yes' ? true : false;
209
+
210
+ // if enabled load prettyPhoto css
211
+ if( $lightbox_en ) {
212
+
213
+ $assets_path = str_replace( array( 'http:', 'https:' ), '', WC()->plugin_url() ) . '/assets/';
214
+
215
+ wp_enqueue_script( 'prettyPhoto', $assets_path . 'js/prettyPhoto/jquery.prettyPhoto.min.js', array( 'jquery' ), '3.1.5', true );
216
+ wp_enqueue_style( 'woocommerce_prettyPhoto_css', $assets_path . 'css/prettyPhoto.css' );
217
+ }
218
+
219
+ $version = version_compare( preg_replace( '/-beta-([0-9]+)/', '', WC()->version ), '2.3.0', '<' );
220
+
221
+ // loader gif
222
+ $loader = apply_filters( 'yith_quick_view_loader_gif', YITH_WCQV_ASSETS_URL . '/image/qv-loader.gif' );
223
+
224
+ // Allow user to load custom style and scripts
225
+ do_action( 'yith_quick_view_custom_style_scripts' );
226
+
227
+ wp_localize_script( 'yith-wcqv-frontend', 'yith_qv', array (
228
+ 'ajaxurl' => admin_url( 'admin-ajax.php', 'relative' ),
229
+ 'loader' => $loader,
230
+ 'is2_2' => $version,
231
+ 'lang' => defined( 'ICL_LANGUAGE_CODE' ) ? ICL_LANGUAGE_CODE : ''
232
+ )
233
+ );
234
+
235
+ return true;
236
+ }
237
+
238
+ /**
239
+ * Ajax action to load product in quick view
240
+ *
241
+ * @access public
242
+ * @return void
243
+ * @since 1.0.0
244
+ * @author Francesco Licandro <francesco.licandro@yithemes.com>
245
+ */
246
+ public function yith_load_product_quick_view_ajax() {
247
+
248
+ if ( ! isset( $_REQUEST['product_id'] ) ) {
249
+ die();
250
+ }
251
+
252
+ global $sitepress;
253
+
254
+ $product_id = intval( $_REQUEST['product_id'] );
255
+
256
+ /**
257
+ * WPML Suppot: Localize Ajax Call
258
+ */
259
+ $lang = isset( $_REQUEST['lang'] ) ? $_REQUEST['lang'] : '';
260
+ if( defined( 'ICL_LANGUAGE_CODE' ) && $lang && isset( $sitepress ) ) {
261
+ $sitepress->switch_lang( $lang, true );
262
+ }
263
+
264
+ // set the main wp query for the product
265
+ wp( 'p=' . $product_id . '&post_type=product' );
266
+
267
+ // remove product thumbnails gallery
268
+ remove_action( 'woocommerce_product_thumbnails', 'woocommerce_show_product_thumbnails', 20 );
269
+
270
+ // change template for variable products
271
+ if ( isset( $GLOBALS['yith_wccl'] ) ) {
272
+ $GLOBALS['yith_wccl']->obj = new YITH_WCCL_Frontend( YITH_WCCL_VERSION );
273
+ $GLOBALS['yith_wccl']->obj->override();
274
+ }
275
+
276
+ ob_start();
277
+
278
+ // load content template
279
+ wc_get_template( 'yith-quick-view-content.php', array(), '', YITH_WCQV_DIR . 'templates/' );
280
+
281
+ echo ob_get_clean();
282
+
283
+ die();
284
+ }
285
+
286
+ /**
287
+ * Load quick view template
288
+ *
289
+ * @access public
290
+ * @return void
291
+ * @since 1.0.0
292
+ * @author Francesco Licandro <francesco.licandro@yithemes.com>
293
+ */
294
+ public function yith_quick_view() {
295
+ $this->yith_woocommerce_quick_view();
296
+ wc_get_template( 'yith-quick-view.php', array(), '', YITH_WCQV_DIR . 'templates/' );
297
+ }
298
+
299
+ /**
300
+ * Load wc action for quick view product template
301
+ *
302
+ * @access public
303
+ * @return void
304
+ * @since 1.0.0
305
+ * @author Francesco Licandro <francesco.licandro@yithemes.com>
306
+ */
307
+ public function yith_quick_view_action_template() {
308
+
309
+ // Image
310
+ add_action( 'yith_wcqv_product_image', 'woocommerce_show_product_sale_flash', 10 );
311
+ add_action( 'yith_wcqv_product_image', 'woocommerce_show_product_images', 20 );
312
+
313
+ // Summary
314
+ add_action( 'yith_wcqv_product_summary', 'woocommerce_template_single_title', 5 );
315
+ add_action( 'yith_wcqv_product_summary', 'woocommerce_template_single_rating', 10 );
316
+ add_action( 'yith_wcqv_product_summary', 'woocommerce_template_single_price', 15 );
317
+ add_action( 'yith_wcqv_product_summary', 'woocommerce_template_single_excerpt', 20 );
318
+ add_action( 'yith_wcqv_product_summary', 'woocommerce_template_single_add_to_cart', 25 );
319
+ add_action( 'yith_wcqv_product_summary', 'woocommerce_template_single_meta', 30 );
320
+ }
321
+
322
+ /**
323
+ * Get Quick View button label
324
+ *
325
+ * @author Francesco Licandro
326
+ * @since 1.2.0
327
+ * @return string
328
+ */
329
+ public function get_button_label(){
330
+ $label = get_option( 'yith-wcqv-button-label' );
331
+ $label = call_user_func( '__' , $label, 'yith-woocommerce-quick-view' );
332
+
333
+ return apply_filters( 'yith_wcqv_button_label', esc_html( $label ) );
334
+ }
335
+
336
+ /**
337
+ * Quick View shortcode button
338
+ *
339
+ * @access public
340
+ * @since 1.0.7
341
+ * @param array $atts
342
+ * @return string
343
+ * @author Francesco Licandro
344
+ */
345
+ public function quick_view_shortcode( $atts ) {
346
+
347
+ $atts = shortcode_atts(array(
348
+ 'product_id' => 0,
349
+ 'label' => ''
350
+ ), $atts );
351
+
352
+ extract( $atts );
353
+
354
+ return $this->yith_add_quick_view_button( intval( $product_id ), $label, true );
355
+ }
356
+
357
+ /**
358
+ * Check if is quick view
359
+ *
360
+ * @access public
361
+ * @return bool
362
+ * @since 1.3.1
363
+ * @author Francesco Licandro <francesco.licandro@yithemes.com>
364
+ */
365
+ public function yith_is_quick_view() {
366
+ return ( defined('DOING_AJAX') && DOING_AJAX && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'yith_load_product_quick_view' ) ? true : false;
367
+ }
368
+
369
+ /**
370
+ * Avoid redirect to single product page on add to cart action in quick view
371
+ *
372
+ * @since 1.3.1
373
+ * @author Francesco Licandro
374
+ * @param string $value
375
+ * @return string
376
+ */
377
+ public function avoid_redirect_to_single_page( $value ){
378
+ if( $this->yith_is_quick_view() ) {
379
+ return '';
380
+ }
381
+ return $value;
382
+ }
383
+ }
384
+ }
385
+ /**
386
+ * Unique access to instance of YITH_WCQV_Frontend class
387
+ *
388
+ * @return \YITH_WCQV_Frontend
389
+ * @since 1.0.0
390
+ */
391
+ function YITH_WCQV_Frontend(){
392
+ return YITH_WCQV_Frontend::get_instance();
393
+ }
includes/class.yith-wcqv.php CHANGED
@@ -1,157 +1,157 @@
1
- <?php
2
- /**
3
- * Main class
4
- *
5
- * @author YITH
6
- * @package YITH WooCommerce Quick View
7
- * @version 1.0.0
8
- */
9
-
10
-
11
- if ( ! defined( 'YITH_WCQV' ) ) {
12
- exit;
13
- } // Exit if accessed directly
14
-
15
- if ( ! class_exists( 'YITH_WCQV' ) ) {
16
- /**
17
- * YITH WooCommerce Quick View
18
- *
19
- * @since 1.0.0
20
- */
21
- class YITH_WCQV {
22
-
23
- /**
24
- * Single instance of the class
25
- *
26
- * @var \YITH_WCQV
27
- * @since 1.0.0
28
- */
29
- protected static $instance;
30
-
31
- /**
32
- * Plugin version
33
- *
34
- * @var string
35
- * @since 1.0.0
36
- */
37
- public $version = YITH_WCQV_VERSION;
38
-
39
- /**
40
- * Plugin object
41
- *
42
- * @var string
43
- * @since 1.0.0
44
- */
45
- public $obj = null;
46
-
47
- /**
48
- * Returns single instance of the class
49
- *
50
- * @return \YITH_WCQV
51
- * @since 1.0.0
52
- */
53
- public static function get_instance(){
54
- if( is_null( self::$instance ) ){
55
- self::$instance = new self();
56
- }
57
-
58
- return self::$instance;
59
- }
60
-
61
- /**
62
- * Constructor
63
- *
64
- * @return mixed| YITH_WCQV_Admin | YITH_WCQV_Frontend
65
- * @since 1.0.0
66
- */
67
- public function __construct() {
68
-
69
- // Load Plugin Framework
70
- add_action( 'after_setup_theme', array( $this, 'plugin_fw_loader' ), 1 );
71
-
72
- $action = array(
73
- 'woocommerce_get_refreshed_fragments',
74
- 'woocommerce_apply_coupon',
75
- 'woocommerce_remove_coupon',
76
- 'woocommerce_update_shipping_method',
77
- 'woocommerce_update_order_review',
78
- 'woocommerce_add_to_cart',
79
- 'woocommerce_checkout'
80
- );
81
-
82
- // Exit if is woocommerce ajax
83
- if( defined( 'DOING_AJAX') && DOING_AJAX && isset( $_REQUEST['action'] ) && in_array( $_REQUEST['action'], $action ) ) {
84
- return;
85
- }
86
-
87
- if ( $this->is_admin() ) {
88
- // load admin classes
89
- require_once( 'class.yith-wcqv-admin.php' );
90
- YITH_WCQV_Admin();
91
- }
92
-
93
- if( $this->load_frontend() ) {
94
- // load frontend classes
95
- require_once( 'class.yith-wcqv-frontend.php' );
96
- YITH_WCQV_Frontend();
97
- }
98
- }
99
-
100
- /**
101
- * Check if context is admin
102
- *
103
- * @author Francesco Licandro
104
- * @since 1.2.0
105
- * @return boolean
106
- */
107
- public function is_admin(){
108
- $is_ajax = ( defined( 'DOING_AJAX') && DOING_AJAX && isset( $_REQUEST['context'] ) && $_REQUEST['context'] == 'frontend' );
109
- return apply_filters( 'yith_wcqv_is_admin', is_admin() && ! $is_ajax );
110
- }
111
-
112
- /**
113
- * Check if load or not frontend
114
- *
115
- * @author Francesco Licandro
116
- * @since 1.2.0
117
- * @return boolean
118
- */
119
- public function load_frontend(){
120
- // Class frontend
121
- $enable = get_option( 'yith-wcqv-enable', 'yes' ) == 'yes';
122
- $enable_on_mobile = get_option( 'yith-wcqv-enable-mobile', 'yes' ) == 'yes';
123
- $is_mobile = wp_is_mobile();
124
-
125
- return apply_filters( 'yith_wcqv_load_frontend', ( ! $is_mobile && $enable ) || ( $is_mobile && $enable_on_mobile ) );
126
- }
127
-
128
-
129
- /**
130
- * Load Plugin Framework
131
- *
132
- * @since 1.0
133
- * @access public
134
- * @return void
135
- * @author Andrea Grillo <andrea.grillo@yithemes.com>
136
- */
137
- public function plugin_fw_loader() {
138
- if ( ! defined( 'YIT_CORE_PLUGIN' ) ) {
139
- global $plugin_fw_data;
140
- if( ! empty( $plugin_fw_data ) ){
141
- $plugin_fw_file = array_shift( $plugin_fw_data );
142
- require_once( $plugin_fw_file );
143
- }
144
- }
145
- }
146
- }
147
- }
148
-
149
- /**
150
- * Unique access to instance of YITH_WCQV class
151
- *
152
- * @return \YITH_WCQV
153
- * @since 1.0.0
154
- */
155
- function YITH_WCQV(){
156
- return YITH_WCQV::get_instance();
157
  }
1
+ <?php
2
+ /**
3
+ * Main class
4
+ *
5
+ * @author YITH
6
+ * @package YITH WooCommerce Quick View
7
+ * @version 1.0.0
8
+ */
9
+
10
+
11
+ if ( ! defined( 'YITH_WCQV' ) ) {
12
+ exit;
13
+ } // Exit if accessed directly
14
+
15
+ if ( ! class_exists( 'YITH_WCQV' ) ) {
16
+ /**
17
+ * YITH WooCommerce Quick View
18
+ *
19
+ * @since 1.0.0
20
+ */
21
+ class YITH_WCQV {
22
+
23
+ /**
24
+ * Single instance of the class
25
+ *
26
+ * @var \YITH_WCQV
27
+ * @since 1.0.0
28
+ */
29
+ protected static $instance;
30
+
31
+ /**
32
+ * Plugin version
33
+ *
34
+ * @var string
35
+ * @since 1.0.0
36
+ */
37
+ public $version = YITH_WCQV_VERSION;
38
+
39
+ /**
40
+ * Plugin object
41
+ *
42
+ * @var string
43
+ * @since 1.0.0
44
+ */
45
+ public $obj = null;
46
+
47
+ /**
48
+ * Returns single instance of the class
49
+ *
50
+ * @return \YITH_WCQV
51
+ * @since 1.0.0
52
+ */
53
+ public static function get_instance(){
54
+ if( is_null( self::$instance ) ){
55
+ self::$instance = new self();
56
+ }
57
+
58
+ return self::$instance;
59
+ }
60
+
61
+ /**
62
+ * Constructor
63
+ *
64
+ * @return mixed| YITH_WCQV_Admin | YITH_WCQV_Frontend
65
+ * @since 1.0.0
66
+ */
67
+ public function __construct() {
68
+
69
+ // Load Plugin Framework
70
+ add_action( 'after_setup_theme', array( $this, 'plugin_fw_loader' ), 1 );
71
+
72
+ $action = array(
73
+ 'woocommerce_get_refreshed_fragments',
74
+ 'woocommerce_apply_coupon',
75
+ 'woocommerce_remove_coupon',
76
+ 'woocommerce_update_shipping_method',
77
+ 'woocommerce_update_order_review',
78
+ 'woocommerce_add_to_cart',
79
+ 'woocommerce_checkout'
80
+ );
81
+
82
+ // Exit if is woocommerce ajax
83
+ if( defined( 'DOING_AJAX') && DOING_AJAX && isset( $_REQUEST['action'] ) && in_array( $_REQUEST['action'], $action ) ) {
84
+ return;
85
+ }
86
+
87
+ if ( $this->is_admin() ) {
88
+ // load admin classes
89
+ require_once( 'class.yith-wcqv-admin.php' );
90
+ YITH_WCQV_Admin();
91
+ }
92
+
93
+ if( $this->load_frontend() ) {
94
+ // load frontend classes
95
+ require_once( 'class.yith-wcqv-frontend.php' );
96
+ YITH_WCQV_Frontend();
97
+ }
98
+ }
99
+
100
+ /**
101
+ * Check if context is admin
102
+ *
103
+ * @author Francesco Licandro
104
+ * @since 1.2.0
105
+ * @return boolean
106
+ */
107
+ public function is_admin(){
108
+ $is_ajax = ( defined( 'DOING_AJAX') && DOING_AJAX && isset( $_REQUEST['context'] ) && $_REQUEST['context'] == 'frontend' );
109
+ return apply_filters( 'yith_wcqv_is_admin', is_admin() && ! $is_ajax );
110
+ }
111
+
112
+ /**
113
+ * Check if load or not frontend
114
+ *
115
+ * @author Francesco Licandro
116
+ * @since 1.2.0
117
+ * @return boolean
118
+ */
119
+ public function load_frontend(){
120
+ // Class frontend
121
+ $enable = get_option( 'yith-wcqv-enable', 'yes' ) == 'yes';
122
+ $enable_on_mobile = get_option( 'yith-wcqv-enable-mobile', 'yes' ) == 'yes';
123
+ $is_mobile = wp_is_mobile();
124
+
125
+ return apply_filters( 'yith_wcqv_load_frontend', ( ! $is_mobile && $enable ) || ( $is_mobile && $enable_on_mobile ) );
126
+ }
127
+
128
+
129
+ /**
130
+ * Load Plugin Framework
131
+ *
132
+ * @since 1.0
133
+ * @access public
134
+ * @return void
135
+ * @author Andrea Grillo <andrea.grillo@yithemes.com>
136
+ */
137
+ public function plugin_fw_loader() {
138
+ if ( ! defined( 'YIT_CORE_PLUGIN' ) ) {
139
+ global $plugin_fw_data;
140
+ if( ! empty( $plugin_fw_data ) ){
141
+ $plugin_fw_file = array_shift( $plugin_fw_data );
142
+ require_once( $plugin_fw_file );
143
+ }
144
+ }
145
+ }
146
+ }
147
+ }
148
+
149
+ /**
150
+ * Unique access to instance of YITH_WCQV class
151
+ *
152
+ * @return \YITH_WCQV
153
+ * @since 1.0.0
154
+ */
155
+ function YITH_WCQV(){
156
+ return YITH_WCQV::get_instance();
157
  }
init.php CHANGED
@@ -1,135 +1,135 @@
1
- <?php
2
- /**
3
- * Plugin Name: YITH WooCommerce Quick View
4
- * Plugin URI: https://yithemes.com/themes/plugins/yith-woocommerce-quick-view
5
- * Description: The <code><strong>YITH WooCommerce Quick View</strong></code> plugin allows your customers to have a quick look about products. <a href="https://yithemes.com/" target="_blank">Get more plugins for your e-commerce shop on <strong>YITH</strong></a>.
6
- * Version: 1.3.12
7
- * Author: YITH
8
- * Author URI: https://yithemes.com/
9
- * Text Domain: yith-woocommerce-quick-view
10
- * Domain Path: /languages/
11
- * WC requires at least: 2.5.0
12
- * WC tested up to: 3.7
13
- *
14
- * @author YITH
15
- * @package YITH WooCommerce Quick View
16
- * @version 1.3.12
17
- */
18
- /* Copyright 2015 Your Inspiration Themes (email : plugins@yithemes.com)
19
-
20
- This program is free software; you can redistribute it and/or modify
21
- it under the terms of the GNU General Public License, version 2, as
22
- published by the Free Software Foundation.
23
-
24
- This program is distributed in the hope that it will be useful,
25
- but WITHOUT ANY WARRANTY; without even the implied warranty of
26
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27
- GNU General Public License for more details.
28
-
29
- You should have received a copy of the GNU General Public License
30
- along with this program; if not, write to the Free Software
31
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
32
- */
33
-
34
- if ( !defined( 'ABSPATH' ) ) { exit; } // Exit if accessed directly
35
-
36
- if ( ! function_exists( 'is_plugin_active' ) ) {
37
- require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
38
- }
39
-
40
- function yith_wcqv_install_woocommerce_admin_notice() {
41
- ?>
42
- <div class="error">
43
- <p><?php _e( 'YITH WooCommerce Quick View is enabled but not effective. It requires WooCommerce in order to work.', 'yith-woocommerce-quick-view' ); ?></p>
44
- </div>
45
- <?php
46
- }
47
-
48
-
49
- function yith_wcqv_install_free_admin_notice() {
50
- ?>
51
- <div class="error">
52
- <p><?php _e( 'You can\'t activate the free version of YITH WooCommerce Quick View while you are using the premium one.', 'yith-woocommerce-quick-view' ); ?></p>
53
- </div>
54
- <?php
55
- }
56
-
57
- if ( ! function_exists( 'yith_plugin_registration_hook' ) ) {
58
- require_once 'plugin-fw/yit-plugin-registration-hook.php';
59
- }
60
- register_activation_hook( __FILE__, 'yith_plugin_registration_hook' );
61
-
62
-
63
- if ( ! defined( 'YITH_WCQV_VERSION' ) ){
64
- define( 'YITH_WCQV_VERSION', '1.3.12' );
65
- }
66
-
67
- if ( ! defined( 'YITH_WCQV_FREE_INIT' ) ) {
68
- define( 'YITH_WCQV_FREE_INIT', plugin_basename( __FILE__ ) );
69
- }
70
-
71
- if ( ! defined( 'YITH_WCQV_INIT' ) ) {
72
- define( 'YITH_WCQV_INIT', plugin_basename( __FILE__ ) );
73
- }
74
-
75
- if ( ! defined( 'YITH_WCQV' ) ) {
76
- define( 'YITH_WCQV', true );
77
- }
78
-
79
- if ( ! defined( 'YITH_WCQV_FILE' ) ) {
80
- define( 'YITH_WCQV_FILE', __FILE__ );
81
- }
82
-
83
- if ( ! defined( 'YITH_WCQV_URL' ) ) {
84
- define( 'YITH_WCQV_URL', plugin_dir_url( __FILE__ ) );
85
- }
86
-
87
- if ( ! defined( 'YITH_WCQV_DIR' ) ) {
88
- define( 'YITH_WCQV_DIR', plugin_dir_path( __FILE__ ) );
89
- }
90
-
91
- if ( ! defined( 'YITH_WCQV_TEMPLATE_PATH' ) ) {
92
- define( 'YITH_WCQV_TEMPLATE_PATH', YITH_WCQV_DIR . 'templates' );
93
- }
94
-
95
- if ( ! defined( 'YITH_WCQV_ASSETS_URL' ) ) {
96
- define( 'YITH_WCQV_ASSETS_URL', YITH_WCQV_URL . 'assets' );
97
- }
98
-
99
- if ( ! defined( 'YITH_WCQV_SLUG' ) ) {
100
- define( 'YITH_WCQV_SLUG', 'yith-woocommerce-quick-view' );
101
- }
102
-
103
- /* Plugin Framework Version Check */
104
- if( ! function_exists( 'yit_maybe_plugin_fw_loader' ) && file_exists( YITH_WCQV_DIR . 'plugin-fw/init.php' ) ) {
105
- require_once( YITH_WCQV_DIR . 'plugin-fw/init.php' );
106
- }
107
- yit_maybe_plugin_fw_loader( YITH_WCQV_DIR );
108
-
109
- function yith_wcqv_init() {
110
-
111
- load_plugin_textdomain( 'yith-woocommerce-quick-view', false, dirname( plugin_basename( __FILE__ ) ). '/languages/' );
112
-
113
- // Load required classes and functions
114
- require_once('includes/class.yith-wcqv.php');
115
-
116
- // Let's start the game!
117
- YITH_WCQV();
118
- }
119
- add_action( 'yith_wcqv_init', 'yith_wcqv_init' );
120
-
121
-
122
- function yith_wcqv_install() {
123
-
124
- if ( ! function_exists( 'WC' ) ) {
125
- add_action( 'admin_notices', 'yith_wcqv_install_woocommerce_admin_notice' );
126
- }
127
- elseif ( defined( 'YITH_WCQV_PREMIUM' ) ) {
128
- add_action( 'admin_notices', 'yith_wcqv_install_free_admin_notice' );
129
- deactivate_plugins( plugin_basename( __FILE__ ) );
130
- }
131
- else {
132
- do_action( 'yith_wcqv_init' );
133
- }
134
- }
135
  add_action( 'plugins_loaded', 'yith_wcqv_install', 11 );
1
+ <?php
2
+ /**
3
+ * Plugin Name: YITH WooCommerce Quick View
4
+ * Plugin URI: https://yithemes.com/themes/plugins/yith-woocommerce-quick-view
5
+ * Description: The <code><strong>YITH WooCommerce Quick View</strong></code> plugin allows your customers to have a quick look about products. <a href="https://yithemes.com/" target="_blank">Get more plugins for your e-commerce shop on <strong>YITH</strong></a>.
6
+ * Version: 1.3.14
7
+ * Author: YITH
8
+ * Author URI: https://yithemes.com/
9
+ * Text Domain: yith-woocommerce-quick-view
10
+ * Domain Path: /languages/
11
+ * WC requires at least: 3.6
12
+ * WC tested up to: 3.8
13
+ *
14
+ * @author YITH
15
+ * @package YITH WooCommerce Quick View
16
+ * @version 1.3.13
17
+ */
18
+ /* Copyright 2015 YITH (email : plugins@yithemes.com)
19
+
20
+ This program is free software; you can redistribute it and/or modify
21
+ it under the terms of the GNU General Public License, version 2, as
22
+ published by the Free Software Foundation.
23
+
24
+ This program is distributed in the hope that it will be useful,
25
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
26
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27
+ GNU General Public License for more details.
28
+
29
+ You should have received a copy of the GNU General Public License
30
+ along with this program; if not, write to the Free Software
31
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
32
+ */
33
+
34
+ if ( !defined( 'ABSPATH' ) ) { exit; } // Exit if accessed directly
35
+
36
+ if ( ! function_exists( 'is_plugin_active' ) ) {
37
+ require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
38
+ }
39
+
40
+ function yith_wcqv_install_woocommerce_admin_notice() {
41
+ ?>
42
+ <div class="error">
43
+ <p><?php _e( 'YITH WooCommerce Quick View is enabled but not effective. It requires WooCommerce in order to work.', 'yith-woocommerce-quick-view' ); ?></p>
44
+ </div>
45
+ <?php
46
+ }
47
+
48
+
49
+ function yith_wcqv_install_free_admin_notice() {
50
+ ?>
51
+ <div class="error">
52
+ <p><?php _e( 'You can\'t activate the free version of YITH WooCommerce Quick View while you are using the premium one.', 'yith-woocommerce-quick-view' ); ?></p>
53
+ </div>
54
+ <?php
55
+ }
56
+
57
+ if ( ! function_exists( 'yith_plugin_registration_hook' ) ) {
58
+ require_once 'plugin-fw/yit-plugin-registration-hook.php';
59
+ }
60
+ register_activation_hook( __FILE__, 'yith_plugin_registration_hook' );
61
+
62
+
63
+ if ( ! defined( 'YITH_WCQV_VERSION' ) ){
64
+ define( 'YITH_WCQV_VERSION', '1.3.14' );
65
+ }
66
+
67
+ if ( ! defined( 'YITH_WCQV_FREE_INIT' ) ) {
68
+ define( 'YITH_WCQV_FREE_INIT', plugin_basename( __FILE__ ) );
69
+ }
70
+
71
+ if ( ! defined( 'YITH_WCQV_INIT' ) ) {
72
+ define( 'YITH_WCQV_INIT', plugin_basename( __FILE__ ) );
73
+ }
74
+
75
+ if ( ! defined( 'YITH_WCQV' ) ) {
76
+ define( 'YITH_WCQV', true );
77
+ }
78
+
79
+ if ( ! defined( 'YITH_WCQV_FILE' ) ) {
80
+ define( 'YITH_WCQV_FILE', __FILE__ );
81
+ }
82
+
83
+ if ( ! defined( 'YITH_WCQV_URL' ) ) {
84
+ define( 'YITH_WCQV_URL', plugin_dir_url( __FILE__ ) );
85
+ }
86
+
87
+ if ( ! defined( 'YITH_WCQV_DIR' ) ) {
88
+ define( 'YITH_WCQV_DIR', plugin_dir_path( __FILE__ ) );
89
+ }
90
+
91
+ if ( ! defined( 'YITH_WCQV_TEMPLATE_PATH' ) ) {
92
+ define( 'YITH_WCQV_TEMPLATE_PATH', YITH_WCQV_DIR . 'templates' );
93
+ }
94
+
95
+ if ( ! defined( 'YITH_WCQV_ASSETS_URL' ) ) {
96
+ define( 'YITH_WCQV_ASSETS_URL', YITH_WCQV_URL . 'assets' );
97
+ }
98
+
99
+ if ( ! defined( 'YITH_WCQV_SLUG' ) ) {
100
+ define( 'YITH_WCQV_SLUG', 'yith-woocommerce-quick-view' );
101
+ }
102
+
103
+ /* Plugin Framework Version Check */
104
+ if( ! function_exists( 'yit_maybe_plugin_fw_loader' ) && file_exists( YITH_WCQV_DIR . 'plugin-fw/init.php' ) ) {
105
+ require_once( YITH_WCQV_DIR . 'plugin-fw/init.php' );
106
+ }
107
+ yit_maybe_plugin_fw_loader( YITH_WCQV_DIR );
108
+
109
+ function yith_wcqv_init() {
110
+
111
+ load_plugin_textdomain( 'yith-woocommerce-quick-view', false, dirname( plugin_basename( __FILE__ ) ). '/languages/' );
112
+
113
+ // Load required classes and functions
114
+ require_once('includes/class.yith-wcqv.php');
115
+
116
+ // Let's start the game!
117
+ YITH_WCQV();
118
+ }
119
+ add_action( 'yith_wcqv_init', 'yith_wcqv_init' );
120
+
121
+
122
+ function yith_wcqv_install() {
123
+
124
+ if ( ! function_exists( 'WC' ) ) {
125
+ add_action( 'admin_notices', 'yith_wcqv_install_woocommerce_admin_notice' );
126
+ }
127
+ elseif ( defined( 'YITH_WCQV_PREMIUM' ) ) {
128
+ add_action( 'admin_notices', 'yith_wcqv_install_free_admin_notice' );
129
+ deactivate_plugins( plugin_basename( __FILE__ ) );
130
+ }
131
+ else {
132
+ do_action( 'yith_wcqv_init' );
133
+ }
134
+ }
135
  add_action( 'plugins_loaded', 'yith_wcqv_install', 11 );
languages/yith-woocommerce-quick-view-it_IT.po CHANGED
@@ -1,585 +1,585 @@
1
- msgid ""
2
- msgstr ""
3
- "Project-Id-Version: YITH WooCommerce Quick View\n"
4
- "POT-Creation-Date: 2017-10-11 12:42+0200\n"
5
- "PO-Revision-Date: 2017-10-11 12:42+0200\n"
6
- "Last-Translator: \n"
7
- "Language-Team: YIThemes <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.7.1\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
- #: ../includes/class.yith-wcqv-admin.php:129
22
- #: ../includes/class.yith-wcqv-admin.php:151
23
- msgid "Settings"
24
- msgstr "Impostazioni"
25
-
26
- #: ../includes/class.yith-wcqv-admin.php:130
27
- #: ../includes/class.yith-wcqv-admin.php:152
28
- msgid "Premium Version"
29
- msgstr "Versione premium"
30
-
31
- #: ../includes/class.yith-wcqv-admin.php:158
32
- #: ../includes/class.yith-wcqv-admin.php:159
33
- #: ../plugin-options/settings-options.php:57
34
- msgid "Quick View"
35
- msgstr "Quick view"
36
-
37
- #: ../includes/class.yith-wcqv-admin.php:213
38
- msgid "Plugin Documentation"
39
- msgstr "Documentazione plugin"
40
-
41
- #: ../init.php:41
42
- msgid ""
43
- "YITH WooCommerce Quick View is enabled but not effective. It requires "
44
- "WooCommerce in order to work."
45
- msgstr ""
46
- "YITH WooCommerce Quick View è abilitato ma non in funzione. Devi aver "
47
- "installato WooCommerce perché questo possa funzionare correttamente."
48
-
49
- #: ../init.php:50
50
- msgid ""
51
- "You can't activate the free version of YITH WooCommerce Quick View while you "
52
- "are using the premium one."
53
- msgstr ""
54
- "Non è possibile attivare la versione free di YITH WooCommerce Colors and "
55
- "Labels Variations se stai già utilizzando la premium."
56
-
57
- #: ../plugin-options/settings-options.php:8
58
- msgid "Upgrade to the PREMIUM VERSION"
59
- msgstr "Aggiorna alla VERSIONE PREMIUM"
60
-
61
- #: ../plugin-options/settings-options.php:11
62
- #: ../plugin-options/settings-options.php:18
63
- msgid "YITH WooCommerce Quick View"
64
- msgstr "YITH WooCommerce Quick View"
65
-
66
- #: ../plugin-options/settings-options.php:12
67
- msgid "Discover the Advanced Features"
68
- msgstr "Scopri le funzionalità avanzate"
69
-
70
- #: ../plugin-options/settings-options.php:13
71
- msgid ""
72
- "Upgrade to the PREMIUM VERSION of YITH WooCommerce Quick View to benefit "
73
- "from all features!"
74
- msgstr ""
75
- "Aggiorna alla VERSIONE PREMIUM di YITH WooCommerce Quick View per usufruire "
76
- "di tutte le sue funzionalità!"
77
-
78
- #: ../plugin-options/settings-options.php:20
79
- msgid "Get Support and Pro Features"
80
- msgstr "Ottieni supporto e funzionalità aggiuntive"
81
-
82
- #: ../plugin-options/settings-options.php:21
83
- msgid ""
84
- "By purchasing the premium version of the plugin, you will take advantage of "
85
- "the advanced features of the product and you will get one year of free "
86
- "updates and support through our platform available 24h/24."
87
- msgstr ""
88
- "Acquistando la versione premium del plugin, potrai beneficiare delle "
89
- "funzionalità avanzate del prodotto ed otterrai un anno di aggiornamenti "
90
- "gratuiti e supporto per mezzo della nostra piattaforma disponibile 24h/24."
91
-
92
- #: ../plugin-options/settings-options.php:31
93
- msgid "General Options"
94
- msgstr "Opzioni generali"
95
-
96
- #: ../plugin-options/settings-options.php:39
97
- msgid "Enable Quick View"
98
- msgstr "Abilita quick view"
99
-
100
- #: ../plugin-options/settings-options.php:46
101
- msgid "Enable Quick View on mobile"
102
- msgstr "Abilita quick view su dispositivi mobili"
103
-
104
- #: ../plugin-options/settings-options.php:47
105
- msgid "Enable quick view features on mobile device too"
106
- msgstr "Abilita funzionalità quick view anche sui dispositivi mobili"
107
-
108
- #: ../plugin-options/settings-options.php:54
109
- msgid "Quick View Button Label"
110
- msgstr "Testo pulsante quick view"
111
-
112
- #: ../plugin-options/settings-options.php:55
113
- msgid "Label for the quick view button in the WooCommerce loop."
114
- msgstr "Testo per il pulsante Quick view nella pagina shop di WooCommerce"
115
-
116
- #: ../plugin-options/settings-options.php:62
117
- msgid "Enable Lightbox"
118
- msgstr "Abilita lightbox"
119
-
120
- #: ../plugin-options/settings-options.php:63
121
- msgid "Enable lightbox. Product images will open in a lightbox."
122
- msgstr ""
123
- "Abilita la lightbox. Le immagini dei prodotti si apriranno in una lightbox."
124
-
125
- #: ../plugin-options/settings-options.php:74 ../templates/admin/premium.php:323
126
- #: ../templates/admin/premium.php:328
127
- msgid "Style Options"
128
- msgstr "Opzioni di stile"
129
-
130
- #: ../plugin-options/settings-options.php:81
131
- msgid "Modal Window Background Color"
132
- msgstr "Colore finestra modale"
133
-
134
- #: ../plugin-options/settings-options.php:89
135
- msgid "Closing Button Color"
136
- msgstr "Colore pulsante chiusura"
137
-
138
- #: ../plugin-options/settings-options.php:97
139
- msgid "Closing Button Hover Color"
140
- msgstr "Colore pulsante chiusura al passaggio del mouse"
141
-
142
- #: ../templates/admin/premium.php:210 ../templates/admin/premium.php:364
143
- #, php-format
144
- msgid ""
145
- "Upgrade to %1$spremium version%2$s of %1$sYITH WooCommerce Quick View%2$s to "
146
- "benefit from all features!"
147
- msgstr ""
148
- "Aggiorna alla %1$sversione premium%2$s di %1$sYITH WooCommerce Quick View"
149
- "%2$s per usufruire di tutte le sue funzionalità!"
150
-
151
- #: ../templates/admin/premium.php:213 ../templates/admin/premium.php:367
152
- msgid "UPGRADE"
153
- msgstr "AGGIORNA"
154
-
155
- #: ../templates/admin/premium.php:214 ../templates/admin/premium.php:368
156
- msgid "to the premium version"
157
- msgstr "alla versione premium"
158
-
159
- #: ../templates/admin/premium.php:220
160
- msgid "Premium Features"
161
- msgstr "Funzionalità premium"
162
-
163
- #: ../templates/admin/premium.php:223
164
- msgid "Button type"
165
- msgstr "Tipologia pulsante"
166
-
167
- #: ../templates/admin/premium.php:228
168
- msgid "BUTTON TYPE"
169
- msgstr "TIPOLOGIA PULSANTE"
170
-
171
- #: ../templates/admin/premium.php:230
172
- #, php-format
173
- msgid ""
174
- "Choose between the button or a custom icon to access the %1$sQuick View%2$s: "
175
- "you can choose to place it after the \"Add To Cart\" button or inside the "
176
- "thumbnail of the product."
177
- msgstr ""
178
- "Scegli tra il pulsante o un’icona personalizzata per avviare la %1$squick "
179
- "view%2$s: scegli tu se dopo il pulsante “Aggiungi al carrello” o sulla "
180
- "immagine thumbnail del prodotto."
181
-
182
- #: ../templates/admin/premium.php:238 ../templates/admin/premium.php:239
183
- #: ../templates/admin/premium.php:244
184
- msgid "Product Navigation"
185
- msgstr "Navigazione prodotti"
186
-
187
- #: ../templates/admin/premium.php:241
188
- #, php-format
189
- msgid ""
190
- "The navigation in the \"Quick View\" allows browsing among %1$sproducts%2$s "
191
- "displayed in it. The navigation arrows show on mousehover the image of the "
192
- "next/previous product."
193
- msgstr ""
194
- "La navigazione all’interno della visualizzazione rapida permette di scorrere "
195
- "tra i %1$sprodotti%2$s visualizzati. Quando si passa il cursore sulle frecce "
196
- "di navigazione, queste mostrano l’immagine del prodotto immediatamente "
197
- "successivo o precedente."
198
-
199
- #: ../templates/admin/premium.php:255 ../templates/admin/premium.php:256
200
- msgid "Content to display"
201
- msgstr "Contenuto da mostrare"
202
-
203
- #: ../templates/admin/premium.php:258
204
- #, php-format
205
- msgid ""
206
- "The display of the product information in the \"Quick View\" are managed by "
207
- "%1$sadministrators%2$s who can decide whether to show everything or only a "
208
- "part of it."
209
- msgstr ""
210
- "La visualizzazione delle informazioni del prodotto all’interno della “Quick "
211
- "View” sono gestite dall’%1$samministratore%2$s che può decidere se mostrare "
212
- "tutto o solo una parte di esse."
213
-
214
- #: ../templates/admin/premium.php:267
215
- msgid "Quick View Type"
216
- msgstr "Tipologia quick view"
217
-
218
- #: ../templates/admin/premium.php:269
219
- #, php-format
220
- msgid ""
221
- "Quick view has two different displaying modes: the first one opens it as a "
222
- "%1$smodal window%2$s, the other one opens it in the page itself with a "
223
- "%1$scascading effect%2$s above content page."
224
- msgstr ""
225
- "La visualizzazione rapida del prodotto può avvenire in due modi: all’interno "
226
- "di una %1$sfinestra modale%2$s o all’interno della stessa pagina con "
227
- "%1$seffetto a cascata%2$s sul resto del contenuto."
228
-
229
- #: ../templates/admin/premium.php:272
230
- msgid "Quick view type"
231
- msgstr "Tipologia quick view"
232
-
233
- #: ../templates/admin/premium.php:284
234
- msgid "\"View details\" button"
235
- msgstr "Pulsante “Visualizza dettagli”"
236
-
237
- #: ../templates/admin/premium.php:286
238
- msgid ""
239
- "An additional button that allows users to access product detail page "
240
- "directly from quick view window just with a click of the mouse."
241
- msgstr ""
242
- "Un pulsante aggiuntivo per permettere all’utente di accedere alla pagina "
243
- "dettaglio del prodotto direttamente dalla quick view con un semplice clic."
244
-
245
- #: ../templates/admin/premium.php:295
246
- msgid "Type of product images"
247
- msgstr "Tipologia immagini prodotto"
248
-
249
- #: ../templates/admin/premium.php:297
250
- #, php-format
251
- msgid ""
252
- "Each product can have more than one image: choose whether to hide or show "
253
- "them with the %1$sslider%2$s effect or in the classic %1$sWooCommerce%2$s "
254
- "display."
255
- msgstr ""
256
- "Ogni prodotto può avere ulteriori immagini oltre a quella in evidenza: "
257
- "scegli se nasconderle o mostrarle con %1$seffetto scorrimento%2$s o nella "
258
- "classica visualizzazione di %1$sWooCommerce%2$s."
259
-
260
- #: ../templates/admin/premium.php:312
261
- msgid "SHARE"
262
- msgstr "Condivisione"
263
-
264
- #: ../templates/admin/premium.php:314
265
- #, php-format
266
- msgid ""
267
- "%1$sQuick View is also social-friendly!%2$s Activating this option, you will "
268
- "be able to share the Quick View on Facebook, Twitter, Pinterest, Google+, or "
269
- "sending an email."
270
- msgstr ""
271
- "%1$sLa quick view è anche social%2$s! Abilitando l’opzione, potrà essere "
272
- "condivisa su Facebook, Twitter, Pinterest, Google+ e per email."
273
-
274
- #: ../templates/admin/premium.php:325
275
- #, php-format
276
- msgid ""
277
- "A rich option panel to change the colors of the %1$s\"Quick View\"%2$s "
278
- "button and of everything that is within the modal window generated."
279
- msgstr ""
280
- "Un ricco pannello opzioni per modificare i colori del pulsante %1$s“Quick "
281
- "View”%2$s e di tutto ciò che è all’interno della finestra modale generata."
282
-
283
- #: ../templates/admin/premium.php:340
284
- msgid "SHORTCODE"
285
- msgstr ""
286
-
287
- #: ../templates/admin/premium.php:342
288
- msgid ""
289
- "The shortcode of plugin is a $1$srapid$2$s and $1$seasy$2$s solution: you "
290
- "can add a button in any spot of the page to allow your users to see the "
291
- "quick view of a specific product in your store."
292
- msgstr ""
293
-
294
- #: ../templates/admin/premium.php:351
295
- msgid "Compatibility with other YITH's plugins"
296
- msgstr ""
297
-
298
- #: ../templates/admin/premium.php:353
299
- #, php-format
300
- msgid ""
301
- "Thanks to the compatibility with %1$sYITH WooCommerce Zoom Magnifier, YITH "
302
- "WooCommerce Badge Management%2$s and %1$sYITH WooCommerce Wishlist%2$s, you "
303
- "will be free to enrich further the content of your quick view.%3$s Zoom the "
304
- "product image, show a badge, or add the button to open the quick view in all "
305
- "products available in your users' wishlists. With YITH's plugins you make "
306
- "the difference."
307
- msgstr ""
308
-
309
- #~ msgid ""
310
- #~ "In the YIT Plugin tab you can find the YITH WooCommerce Quick View "
311
- #~ "options.\r\n"
312
- #~ "\t\t\t\t\t\t\t\t\t\tWith this menu, you can access to all the settings of "
313
- #~ "our plugins that you have activated.\r\n"
314
- #~ "\t\t\t\t\t\t\t\t\t\tYITH WooCommerce Quick View is available in an "
315
- #~ "outstanding PREMIUM version with many new options,\r\n"
316
- #~ "\t\t\t\t\t\t\t\t\t\t<a href=\""
317
- #~ msgstr ""
318
- #~ "Nella scheda YIT Plugins puoi trovare tutte le opzioni di YITH "
319
- #~ "WooCommerce Quick View.<br>Da questo menu potrai accedere a tutte le "
320
- #~ "impostazioni dei plugin YITH installati."
321
-
322
- #~ msgid ""
323
- #~ "The navigation in the \"Quick View\" allows browsing between the "
324
- #~ "%1$sproducts%2$s within the same %1$scategory%2$s. The navigation arrows "
325
- #~ "show on mousehover the image of the next/previous product."
326
- #~ msgstr ""
327
- #~ "La navigazione all’interno della visualizzazione rapida permette di "
328
- #~ "scorrere tra i %1$sprodotti%2$s visualizzati. Quando si passa il cursore "
329
- #~ "sulle frecce di navigazione, queste mostrano l’immagine del prodotto "
330
- #~ "immediatamente successivo o precedente."
331
-
332
- #~ msgid "General"
333
- #~ msgstr "Generali"
334
-
335
- #~ msgid "Product"
336
- #~ msgstr "Prodotto"
337
-
338
- #~ msgid "Style"
339
- #~ msgstr "Stile"
340
-
341
- #~ msgid "Quick View Navigation"
342
- #~ msgstr "Navigazione quick view"
343
-
344
- #~ msgid ""
345
- #~ "Enable product navigation on quick view. NOTE: only available on modal "
346
- #~ "window style."
347
- #~ msgstr ""
348
- #~ "Abilita scorrimento prodotti all\\’interno della quick view. NOTA: "
349
- #~ "disponibile solo per lo stile finestra modale."
350
-
351
- #~ msgid "Enable navigation in the same product category"
352
- #~ msgstr "Abilita navigazione nella stessa categoria prodotti"
353
-
354
- #~ msgid "Quick View Navigation Style"
355
- #~ msgstr "Stile navigazione quick view"
356
-
357
- #~ msgid "Slide ( thumbnail and product name )"
358
- #~ msgstr "Scorrimento (miniatura e nome prodotto)"
359
-
360
- #~ msgid "Rotate ( thumbnail )"
361
- #~ msgstr "Rotazione (miniatura)"
362
-
363
- #~ msgid "Modal Window"
364
- #~ msgstr "Finestra modale"
365
-
366
- #~ msgid "Cascading"
367
- #~ msgstr "A cascata"
368
-
369
- #~ msgid "Select modal effect"
370
- #~ msgstr "Selezione effetto modale"
371
-
372
- #~ msgid "Slide in"
373
- #~ msgstr "Scorrimento"
374
-
375
- #~ msgid "Fade in"
376
- #~ msgstr "Dissolvenza"
377
-
378
- #~ msgid "Scale up"
379
- #~ msgstr "Ingrandimento"
380
-
381
- #~ msgid "Modal Width"
382
- #~ msgstr "Larghezza finestra"
383
-
384
- #~ msgid "Set width of modal window."
385
- #~ msgstr "Selezione la larghezza della finestra modale"
386
-
387
- #~ msgid "Modal Height"
388
- #~ msgstr "Altezza finestra"
389
-
390
- #~ msgid "Set height of modal window."
391
- #~ msgstr "Seleziona l\\’altezza della finestra modale"
392
-
393
- #~ msgid "Button Options"
394
- #~ msgstr "Opzioni pulsante"
395
-
396
- #~ msgid "Quick View Button Type"
397
- #~ msgstr "Tipo di pulsante quick view"
398
-
399
- #~ msgid "Use button"
400
- #~ msgstr "Usa pulsante"
401
-
402
- #~ msgid "Use icon"
403
- #~ msgstr "Usa icona"
404
-
405
- #~ msgid "Quick View Button Icon"
406
- #~ msgstr "Icona pulsante quick view"
407
-
408
- #~ msgid "Icon for the quick view button in the WooCommerce loop."
409
- #~ msgstr "Icona per il pulsante Quick view nella pagina shop di WooCommerce"
410
-
411
- #~ msgid "Quick View Button Position"
412
- #~ msgstr "Posizione pulsante Quick view"
413
-
414
- #~ msgid "Position of the quick view button."
415
- #~ msgstr "Posizione del pulsante Quick view"
416
-
417
- #~ msgid "After 'add to cart' button"
418
- #~ msgstr "Dopo il pulsante \\‘Aggiungi al carrello\\’"
419
-
420
- #~ msgid "Inside product image"
421
- #~ msgstr "Dentro l\\’immagine prodotto"
422
-
423
- #~ msgid "Content Options"
424
- #~ msgstr "Opzioni contenuto"
425
-
426
- #~ msgid "Select Element to Show"
427
- #~ msgstr "Seleziona elemento da mostrare"
428
-
429
- #~ msgid "Show Product Image"
430
- #~ msgstr "Mostra immagine prodotto"
431
-
432
- #~ msgid "Show Product Name"
433
- #~ msgstr "Mostra nome prodotto"
434
-
435
- #~ msgid "Show Product Rating"
436
- #~ msgstr "Mostra valutazione prodotto"
437
-
438
- #~ msgid "Show Product Price"
439
- #~ msgstr "Mostra prezzo prodotto"
440
-
441
- #~ msgid "Show Product Excerpt"
442
- #~ msgstr "Mostra riepilogo prodotto"
443
-
444
- #~ msgid "Show Product Add To Cart"
445
- #~ msgstr "Mostra \\”Aggiungi al carrello\\” del prodotto"
446
-
447
- #~ msgid "Show Product Meta"
448
- #~ msgstr "Mostra meta prodotto"
449
-
450
- #~ msgid "Product Image Width"
451
- #~ msgstr "Larghezza immagine prodotto"
452
-
453
- #~ msgid "Set width of product image."
454
- #~ msgstr "Imposta la larghezza dell\\’immagine del prodotto."
455
-
456
- #~ msgid "Product Image Height"
457
- #~ msgstr "Altezza immagine prodotto"
458
-
459
- #~ msgid "Set height of product image."
460
- #~ msgstr "Imposta l\\’altezza dell\\’immagine del prodotto."
461
-
462
- #~ msgid "Select Thumbnails Type"
463
- #~ msgstr "Seleziona tipo di miniatura"
464
-
465
- #~ msgid "Don't show"
466
- #~ msgstr "Non mostrare"
467
-
468
- #~ msgid "Slider mode"
469
- #~ msgstr "Modalità scorrimento"
470
-
471
- #~ msgid "Classic mode"
472
- #~ msgstr "Modalità classica"
473
-
474
- #~ msgid "Add 'View Details' Button"
475
- #~ msgstr "Aggiungi pulsante \\’Visualizza dettagli\\’"
476
-
477
- #~ msgid "Check this option to add a button to go to the single product page."
478
- #~ msgstr ""
479
- #~ "Seleziona questa opzione per aggiungere un pulsante che riporti alla "
480
- #~ "pagina singolo prodotto."
481
-
482
- #~ msgid "'View Details' Button Label"
483
- #~ msgstr "Testo pulsante \\’Visualizza dettagli\\’"
484
-
485
- #~ msgid "Set label for 'View Details' button"
486
- #~ msgstr "Scegli il testo del pulsante \\’Visualizza dettagli\\’"
487
-
488
- #~ msgid "View Details"
489
- #~ msgstr "Visualizza dettagli"
490
-
491
- #~ msgid "Enable Ajax Add To Cart"
492
- #~ msgstr "Abilita \\“Aggiungi al carrello\\” in ajax"
493
-
494
- #~ msgid "Check this option to enable add to cart in ajax"
495
- #~ msgstr ""
496
- #~ "Seleziona questa opzione per abilitare il pulsante \\”Aggiungi al carrello"
497
- #~ "\\” in ajax"
498
-
499
- #~ msgid "Share Options"
500
- #~ msgstr "Opzioni di condivisione"
501
-
502
- #~ msgid "Enable Share"
503
- #~ msgstr "Abilita condivisione"
504
-
505
- #~ msgid ""
506
- #~ "Check this option if you want to show the share link for products in "
507
- #~ "quick view"
508
- #~ msgstr ""
509
- #~ "Seleziona questa opzione se vuoi mostrare il link di condivisione per i "
510
- #~ "prodotti nella quick view"
511
-
512
- #~ msgid "Select Socials"
513
- #~ msgstr "Seleziona social"
514
-
515
- #~ msgid "Facebook"
516
- #~ msgstr "Facebook"
517
-
518
- #~ msgid "Twitter"
519
- #~ msgstr "Twitter"
520
-
521
- #~ msgid "Google+"
522
- #~ msgstr "Google+"
523
-
524
- #~ msgid "Pinterest"
525
- #~ msgstr "Pinterest"
526
-
527
- #~ msgid "eMail"
528
- #~ msgstr "email"
529
-
530
- #~ msgid "General Style"
531
- #~ msgstr "Stile generale"
532
-
533
- #~ msgid "'Quick View' Button Color"
534
- #~ msgstr "Colore pulsante 'Quick View'"
535
-
536
- #~ msgid "'Quick View' Button Text Color"
537
- #~ msgstr "Colore testo pulsante 'Quick View'"
538
-
539
- #~ msgid "'Quick View' Button Hover Color "
540
- #~ msgstr "Colore pulsante 'Quick View' al passaggio del mouse"
541
-
542
- #~ msgid "'Quick View' Button Hover Text Color"
543
- #~ msgstr "Colore testo pulsante 'Quick View' al passaggio del mouse"
544
-
545
- #~ msgid "Content Style"
546
- #~ msgstr "Stile contenuto"
547
-
548
- #~ msgid "Main Text Color"
549
- #~ msgstr "Colore principale testo"
550
-
551
- #~ msgid "Star Color"
552
- #~ msgstr "Colore stellina"
553
-
554
- #~ msgid "'Add to Cart' Button Color"
555
- #~ msgstr "Colore pulsante ‘Aggiungi al carrello’"
556
-
557
- #~ msgid "'Add to Cart' Button Text Color"
558
- #~ msgstr "Colore testo pulsante ‘Aggiungi al carrello’"
559
-
560
- #~ msgid "'Add to Cart' Button Hover Color "
561
- #~ msgstr "Colore pulsante ‘Aggiungi al carrello’ al passaggio del mouse"
562
-
563
- #~ msgid "'Add to Cart' Button Hover Text Color"
564
- #~ msgstr "Colore testo pulsante ‘Aggiungi al carrello’ al passaggio del mouse"
565
-
566
- #~ msgid "'View Details' Button Color"
567
- #~ msgstr "Colore pulsante ‘Visualizza dettagli’"
568
-
569
- #~ msgid "'View Details' Button Text Color"
570
- #~ msgstr "Colore testo pulsante ‘Visualizza dettagli’"
571
-
572
- #~ msgid "'View Details' Button Hover Color "
573
- #~ msgstr "Colore pulsante ‘Visualizza dettagli’ al passaggio del mouse "
574
-
575
- #~ msgid "'View Details' Button Hover Text Color"
576
- #~ msgstr "Colore testo pulsante ‘Visualizza dettagli’ al passaggio del mouse "
577
-
578
- #~ msgid "Closing Icon Color"
579
- #~ msgstr "Colore icona chiusura"
580
-
581
- #~ msgid "Closing Icon Hover Color"
582
- #~ msgstr "Colore icona chiusura al passaggio del mouse"
583
-
584
- #~ msgid "May I ask you to see this product, please?"
585
- #~ msgstr "Posso chiederti di guardare questo prodotto, per favore?"
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: YITH WooCommerce Quick View\n"
4
+ "POT-Creation-Date: 2017-10-11 12:42+0200\n"
5
+ "PO-Revision-Date: 2017-10-11 12:42+0200\n"
6
+ "Last-Translator: \n"
7
+ "Language-Team: YIThemes <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.7.1\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
+ #: ../includes/class.yith-wcqv-admin.php:129
22
+ #: ../includes/class.yith-wcqv-admin.php:151
23
+ msgid "Settings"
24
+ msgstr "Impostazioni"
25
+
26
+ #: ../includes/class.yith-wcqv-admin.php:130
27
+ #: ../includes/class.yith-wcqv-admin.php:152
28
+ msgid "Premium Version"
29
+ msgstr "Versione premium"
30
+
31
+ #: ../includes/class.yith-wcqv-admin.php:158
32
+ #: ../includes/class.yith-wcqv-admin.php:159
33
+ #: ../plugin-options/settings-options.php:57
34
+ msgid "Quick View"
35
+ msgstr "Quick view"
36
+
37
+ #: ../includes/class.yith-wcqv-admin.php:213
38
+ msgid "Plugin Documentation"
39
+ msgstr "Documentazione plugin"
40
+
41
+ #: ../init.php:41
42
+ msgid ""
43
+ "YITH WooCommerce Quick View is enabled but not effective. It requires "
44
+ "WooCommerce in order to work."
45
+ msgstr ""
46
+ "YITH WooCommerce Quick View è abilitato ma non in funzione. Devi aver "
47
+ "installato WooCommerce perché questo possa funzionare correttamente."
48
+
49
+ #: ../init.php:50
50
+ msgid ""
51
+ "You can't activate the free version of YITH WooCommerce Quick View while you "
52
+ "are using the premium one."
53
+ msgstr ""
54
+ "Non è possibile attivare la versione free di YITH WooCommerce Colors and "
55
+ "Labels Variations se stai già utilizzando la premium."
56
+
57
+ #: ../plugin-options/settings-options.php:8
58
+ msgid "Upgrade to the PREMIUM VERSION"
59
+ msgstr "Aggiorna alla VERSIONE PREMIUM"
60
+
61
+ #: ../plugin-options/settings-options.php:11
62
+ #: ../plugin-options/settings-options.php:18
63
+ msgid "YITH WooCommerce Quick View"
64
+ msgstr "YITH WooCommerce Quick View"
65
+
66
+ #: ../plugin-options/settings-options.php:12
67
+ msgid "Discover the Advanced Features"
68
+ msgstr "Scopri le funzionalità avanzate"
69
+
70
+ #: ../plugin-options/settings-options.php:13
71
+ msgid ""
72
+ "Upgrade to the PREMIUM VERSION of YITH WooCommerce Quick View to benefit "
73
+ "from all features!"
74
+ msgstr ""
75
+ "Aggiorna alla VERSIONE PREMIUM di YITH WooCommerce Quick View per usufruire "
76
+ "di tutte le sue funzionalità!"
77
+
78
+ #: ../plugin-options/settings-options.php:20
79
+ msgid "Get Support and Pro Features"
80
+ msgstr "Ottieni supporto e funzionalità aggiuntive"
81
+
82
+ #: ../plugin-options/settings-options.php:21
83
+ msgid ""
84
+ "By purchasing the premium version of the plugin, you will take advantage of "
85
+ "the advanced features of the product and you will get one year of free "
86
+ "updates and support through our platform available 24h/24."
87
+ msgstr ""
88
+ "Acquistando la versione premium del plugin, potrai beneficiare delle "
89
+ "funzionalità avanzate del prodotto ed otterrai un anno di aggiornamenti "
90
+ "gratuiti e supporto per mezzo della nostra piattaforma disponibile 24h/24."
91
+
92
+ #: ../plugin-options/settings-options.php:31
93
+ msgid "General Options"
94
+ msgstr "Opzioni generali"
95
+
96
+ #: ../plugin-options/settings-options.php:39
97
+ msgid "Enable Quick View"
98
+ msgstr "Abilita quick view"
99
+
100
+ #: ../plugin-options/settings-options.php:46
101
+ msgid "Enable Quick View on mobile"
102
+ msgstr "Abilita quick view su dispositivi mobili"
103
+
104
+ #: ../plugin-options/settings-options.php:47
105
+ msgid "Enable quick view features on mobile device too"
106
+ msgstr "Abilita funzionalità quick view anche sui dispositivi mobili"
107
+
108
+ #: ../plugin-options/settings-options.php:54
109
+ msgid "Quick View Button Label"
110
+ msgstr "Testo pulsante quick view"
111
+
112
+ #: ../plugin-options/settings-options.php:55
113
+ msgid "Label for the quick view button in the WooCommerce loop."
114
+ msgstr "Testo per il pulsante Quick view nella pagina shop di WooCommerce"
115
+
116
+ #: ../plugin-options/settings-options.php:62
117
+ msgid "Enable Lightbox"
118
+ msgstr "Abilita lightbox"
119
+
120
+ #: ../plugin-options/settings-options.php:63
121
+ msgid "Enable lightbox. Product images will open in a lightbox."
122
+ msgstr ""
123
+ "Abilita la lightbox. Le immagini dei prodotti si apriranno in una lightbox."
124
+
125
+ #: ../plugin-options/settings-options.php:74 ../templates/admin/premium.php:323
126
+ #: ../templates/admin/premium.php:328
127
+ msgid "Style Options"
128
+ msgstr "Opzioni di stile"
129
+
130
+ #: ../plugin-options/settings-options.php:81
131
+ msgid "Modal Window Background Color"
132
+ msgstr "Colore finestra modale"
133
+
134
+ #: ../plugin-options/settings-options.php:89
135
+ msgid "Closing Button Color"
136
+ msgstr "Colore pulsante chiusura"
137
+
138
+ #: ../plugin-options/settings-options.php:97
139
+ msgid "Closing Button Hover Color"
140
+ msgstr "Colore pulsante chiusura al passaggio del mouse"
141
+
142
+ #: ../templates/admin/premium.php:210 ../templates/admin/premium.php:364
143
+ #, php-format
144
+ msgid ""
145
+ "Upgrade to %1$spremium version%2$s of %1$sYITH WooCommerce Quick View%2$s to "
146
+ "benefit from all features!"
147
+ msgstr ""
148
+ "Aggiorna alla %1$sversione premium%2$s di %1$sYITH WooCommerce Quick View"
149
+ "%2$s per usufruire di tutte le sue funzionalità!"
150
+
151
+ #: ../templates/admin/premium.php:213 ../templates/admin/premium.php:367
152
+ msgid "UPGRADE"
153
+ msgstr "AGGIORNA"
154
+
155
+ #: ../templates/admin/premium.php:214 ../templates/admin/premium.php:368
156
+ msgid "to the premium version"
157
+ msgstr "alla versione premium"
158
+
159
+ #: ../templates/admin/premium.php:220
160
+ msgid "Premium Features"
161
+ msgstr "Funzionalità premium"
162
+
163
+ #: ../templates/admin/premium.php:223
164
+ msgid "Button type"
165
+ msgstr "Tipologia pulsante"
166
+
167
+ #: ../templates/admin/premium.php:228
168
+ msgid "BUTTON TYPE"
169
+ msgstr "TIPOLOGIA PULSANTE"
170
+
171
+ #: ../templates/admin/premium.php:230
172
+ #, php-format
173
+ msgid ""
174
+ "Choose between the button or a custom icon to access the %1$sQuick View%2$s: "
175
+ "you can choose to place it after the \"Add To Cart\" button or inside the "
176
+ "thumbnail of the product."
177
+ msgstr ""
178
+ "Scegli tra il pulsante o un’icona personalizzata per avviare la %1$squick "
179
+ "view%2$s: scegli tu se dopo il pulsante “Aggiungi al carrello” o sulla "
180
+ "immagine thumbnail del prodotto."
181
+
182
+ #: ../templates/admin/premium.php:238 ../templates/admin/premium.php:239
183
+ #: ../templates/admin/premium.php:244
184
+ msgid "Product Navigation"
185
+ msgstr "Navigazione prodotti"
186
+
187
+ #: ../templates/admin/premium.php:241
188
+ #, php-format
189
+ msgid ""
190
+ "The navigation in the \"Quick View\" allows browsing among %1$sproducts%2$s "
191
+ "displayed in it. The navigation arrows show on mousehover the image of the "
192
+ "next/previous product."
193
+ msgstr ""
194
+ "La navigazione all’interno della visualizzazione rapida permette di scorrere "
195
+ "tra i %1$sprodotti%2$s visualizzati. Quando si passa il cursore sulle frecce "
196
+ "di navigazione, queste mostrano l’immagine del prodotto immediatamente "
197
+ "successivo o precedente."
198
+
199
+ #: ../templates/admin/premium.php:255 ../templates/admin/premium.php:256
200
+ msgid "Content to display"
201
+ msgstr "Contenuto da mostrare"
202
+
203
+ #: ../templates/admin/premium.php:258
204
+ #, php-format
205
+ msgid ""
206
+ "The display of the product information in the \"Quick View\" are managed by "
207
+ "%1$sadministrators%2$s who can decide whether to show everything or only a "
208
+ "part of it."
209
+ msgstr ""
210
+ "La visualizzazione delle informazioni del prodotto all’interno della “Quick "
211
+ "View” sono gestite dall’%1$samministratore%2$s che può decidere se mostrare "
212
+ "tutto o solo una parte di esse."
213
+
214
+ #: ../templates/admin/premium.php:267
215
+ msgid "Quick View Type"
216
+ msgstr "Tipologia quick view"
217
+
218
+ #: ../templates/admin/premium.php:269
219
+ #, php-format
220
+ msgid ""
221
+ "Quick view has two different displaying modes: the first one opens it as a "
222
+ "%1$smodal window%2$s, the other one opens it in the page itself with a "
223
+ "%1$scascading effect%2$s above content page."
224
+ msgstr ""
225
+ "La visualizzazione rapida del prodotto può avvenire in due modi: all’interno "
226
+ "di una %1$sfinestra modale%2$s o all’interno della stessa pagina con "
227
+ "%1$seffetto a cascata%2$s sul resto del contenuto."
228
+
229
+ #: ../templates/admin/premium.php:272
230
+ msgid "Quick view type"
231
+ msgstr "Tipologia quick view"
232
+
233
+ #: ../templates/admin/premium.php:284
234
+ msgid "\"View details\" button"
235
+ msgstr "Pulsante “Visualizza dettagli”"
236
+
237
+ #: ../templates/admin/premium.php:286
238
+ msgid ""
239
+ "An additional button that allows users to access product detail page "
240
+ "directly from quick view window just with a click of the mouse."
241
+ msgstr ""
242
+ "Un pulsante aggiuntivo per permettere all’utente di accedere alla pagina "
243
+ "dettaglio del prodotto direttamente dalla quick view con un semplice clic."
244
+
245
+ #: ../templates/admin/premium.php:295
246
+ msgid "Type of product images"
247
+ msgstr "Tipologia immagini prodotto"
248
+
249
+ #: ../templates/admin/premium.php:297
250
+ #, php-format
251
+ msgid ""
252
+ "Each product can have more than one image: choose whether to hide or show "
253
+ "them with the %1$sslider%2$s effect or in the classic %1$sWooCommerce%2$s "
254
+ "display."
255
+ msgstr ""
256
+ "Ogni prodotto può avere ulteriori immagini oltre a quella in evidenza: "
257
+ "scegli se nasconderle o mostrarle con %1$seffetto scorrimento%2$s o nella "
258
+ "classica visualizzazione di %1$sWooCommerce%2$s."
259
+
260
+ #: ../templates/admin/premium.php:312
261
+ msgid "SHARE"
262
+ msgstr "Condivisione"
263
+
264
+ #: ../templates/admin/premium.php:314
265
+ #, php-format
266
+ msgid ""
267
+ "%1$sQuick View is also social-friendly!%2$s Activating this option, you will "
268
+ "be able to share the Quick View on Facebook, Twitter, Pinterest, Google+, or "
269
+ "sending an email."
270
+ msgstr ""
271
+ "%1$sLa quick view è anche social%2$s! Abilitando l’opzione, potrà essere "
272
+ "condivisa su Facebook, Twitter, Pinterest, Google+ e per email."
273
+
274
+ #: ../templates/admin/premium.php:325
275
+ #, php-format
276
+ msgid ""
277
+ "A rich option panel to change the colors of the %1$s\"Quick View\"%2$s "
278
+ "button and of everything that is within the modal window generated."
279
+ msgstr ""
280
+ "Un ricco pannello opzioni per modificare i colori del pulsante %1$s“Quick "
281
+ "View”%2$s e di tutto ciò che è all’interno della finestra modale generata."
282
+
283
+ #: ../templates/admin/premium.php:340
284
+ msgid "SHORTCODE"
285
+ msgstr ""
286
+
287
+ #: ../templates/admin/premium.php:342
288
+ msgid ""
289
+ "The shortcode of plugin is a $1$srapid$2$s and $1$seasy$2$s solution: you "
290
+ "can add a button in any spot of the page to allow your users to see the "
291
+ "quick view of a specific product in your store."
292
+ msgstr ""
293
+
294
+ #: ../templates/admin/premium.php:351
295
+ msgid "Compatibility with other YITH's plugins"
296
+ msgstr ""
297
+
298
+ #: ../templates/admin/premium.php:353
299
+ #, php-format
300
+ msgid ""
301
+ "Thanks to the compatibility with %1$sYITH WooCommerce Zoom Magnifier, YITH "
302
+ "WooCommerce Badge Management%2$s and %1$sYITH WooCommerce Wishlist%2$s, you "
303
+ "will be free to enrich further the content of your quick view.%3$s Zoom the "
304
+ "product image, show a badge, or add the button to open the quick view in all "
305
+ "products available in your users' wishlists. With YITH's plugins you make "
306
+ "the difference."
307
+ msgstr ""
308
+
309
+ #~ msgid ""
310
+ #~ "In the YIT Plugin tab you can find the YITH WooCommerce Quick View "
311
+ #~ "options.\r\n"
312
+ #~ "\t\t\t\t\t\t\t\t\t\tWith this menu, you can access to all the settings of "
313
+ #~ "our plugins that you have activated.\r\n"
314
+ #~ "\t\t\t\t\t\t\t\t\t\tYITH WooCommerce Quick View is available in an "
315
+ #~ "outstanding PREMIUM version with many new options,\r\n"
316
+ #~ "\t\t\t\t\t\t\t\t\t\t<a href=\""
317
+ #~ msgstr ""
318
+ #~ "Nella scheda YIT Plugins puoi trovare tutte le opzioni di YITH "
319
+ #~ "WooCommerce Quick View.<br>Da questo menu potrai accedere a tutte le "
320
+ #~ "impostazioni dei plugin YITH installati."
321
+
322
+ #~ msgid ""
323
+ #~ "The navigation in the \"Quick View\" allows browsing between the "
324
+ #~ "%1$sproducts%2$s within the same %1$scategory%2$s. The navigation arrows "
325
+ #~ "show on mousehover the image of the next/previous product."
326
+ #~ msgstr ""
327
+ #~ "La navigazione all’interno della visualizzazione rapida permette di "
328
+ #~ "scorrere tra i %1$sprodotti%2$s visualizzati. Quando si passa il cursore "
329
+ #~ "sulle frecce di navigazione, queste mostrano l’immagine del prodotto "
330
+ #~ "immediatamente successivo o precedente."
331
+
332
+ #~ msgid "General"
333
+ #~ msgstr "Generali"
334
+
335
+ #~ msgid "Product"
336
+ #~ msgstr "Prodotto"
337
+
338
+ #~ msgid "Style"
339
+ #~ msgstr "Stile"
340
+
341
+ #~ msgid "Quick View Navigation"
342
+ #~ msgstr "Navigazione quick view"
343
+
344
+ #~ msgid ""
345
+ #~ "Enable product navigation on quick view. NOTE: only available on modal "
346
+ #~ "window style."
347
+ #~ msgstr ""
348
+ #~ "Abilita scorrimento prodotti all\\’interno della quick view. NOTA: "
349
+ #~ "disponibile solo per lo stile finestra modale."
350
+
351
+ #~ msgid "Enable navigation in the same product category"
352
+ #~ msgstr "Abilita navigazione nella stessa categoria prodotti"
353
+
354
+ #~ msgid "Quick View Navigation Style"
355
+ #~ msgstr "Stile navigazione quick view"
356
+
357
+ #~ msgid "Slide ( thumbnail and product name )"
358
+ #~ msgstr "Scorrimento (miniatura e nome prodotto)"
359
+
360
+ #~ msgid "Rotate ( thumbnail )"
361
+ #~ msgstr "Rotazione (miniatura)"
362
+
363
+ #~ msgid "Modal Window"
364
+ #~ msgstr "Finestra modale"
365
+
366
+ #~ msgid "Cascading"
367
+ #~ msgstr "A cascata"
368
+
369
+ #~ msgid "Select modal effect"
370
+ #~ msgstr "Selezione effetto modale"
371
+
372
+ #~ msgid "Slide in"
373
+ #~ msgstr "Scorrimento"
374
+
375
+ #~ msgid "Fade in"
376
+ #~ msgstr "Dissolvenza"
377
+
378
+ #~ msgid "Scale up"
379
+ #~ msgstr "Ingrandimento"
380
+
381
+ #~ msgid "Modal Width"
382
+ #~ msgstr "Larghezza finestra"
383
+
384
+ #~ msgid "Set width of modal window."
385
+ #~ msgstr "Selezione la larghezza della finestra modale"
386
+
387
+ #~ msgid "Modal Height"
388
+ #~ msgstr "Altezza finestra"
389
+
390
+ #~ msgid "Set height of modal window."
391
+ #~ msgstr "Seleziona l\\’altezza della finestra modale"
392
+
393
+ #~ msgid "Button Options"
394
+ #~ msgstr "Opzioni pulsante"
395
+
396
+ #~ msgid "Quick View Button Type"
397
+ #~ msgstr "Tipo di pulsante quick view"
398
+
399
+ #~ msgid "Use button"
400
+ #~ msgstr "Usa pulsante"
401
+
402
+ #~ msgid "Use icon"
403
+ #~ msgstr "Usa icona"
404
+
405
+ #~ msgid "Quick View Button Icon"
406
+ #~ msgstr "Icona pulsante quick view"
407
+
408
+ #~ msgid "Icon for the quick view button in the WooCommerce loop."
409
+ #~ msgstr "Icona per il pulsante Quick view nella pagina shop di WooCommerce"
410
+
411
+ #~ msgid "Quick View Button Position"
412
+ #~ msgstr "Posizione pulsante Quick view"
413
+
414
+ #~ msgid "Position of the quick view button."
415
+ #~ msgstr "Posizione del pulsante Quick view"
416
+
417
+ #~ msgid "After 'add to cart' button"
418
+ #~ msgstr "Dopo il pulsante \\‘Aggiungi al carrello\\’"
419
+
420
+ #~ msgid "Inside product image"
421
+ #~ msgstr "Dentro l\\’immagine prodotto"
422
+
423
+ #~ msgid "Content Options"
424
+ #~ msgstr "Opzioni contenuto"
425
+
426
+ #~ msgid "Select Element to Show"
427
+ #~ msgstr "Seleziona elemento da mostrare"
428
+
429
+ #~ msgid "Show Product Image"
430
+ #~ msgstr "Mostra immagine prodotto"
431
+
432
+ #~ msgid "Show Product Name"
433
+ #~ msgstr "Mostra nome prodotto"
434
+
435
+ #~ msgid "Show Product Rating"
436
+ #~ msgstr "Mostra valutazione prodotto"
437
+
438
+ #~ msgid "Show Product Price"
439
+ #~ msgstr "Mostra prezzo prodotto"
440
+
441
+ #~ msgid "Show Product Excerpt"
442
+ #~ msgstr "Mostra riepilogo prodotto"
443
+
444
+ #~ msgid "Show Product Add To Cart"
445
+ #~ msgstr "Mostra \\”Aggiungi al carrello\\” del prodotto"
446
+
447
+ #~ msgid "Show Product Meta"
448
+ #~ msgstr "Mostra meta prodotto"
449
+
450
+ #~ msgid "Product Image Width"
451
+ #~ msgstr "Larghezza immagine prodotto"
452
+
453
+ #~ msgid "Set width of product image."
454
+ #~ msgstr "Imposta la larghezza dell\\’immagine del prodotto."
455
+
456
+ #~ msgid "Product Image Height"
457
+ #~ msgstr "Altezza immagine prodotto"
458
+
459
+ #~ msgid "Set height of product image."
460
+ #~ msgstr "Imposta l\\’altezza dell\\’immagine del prodotto."
461
+
462
+ #~ msgid "Select Thumbnails Type"
463
+ #~ msgstr "Seleziona tipo di miniatura"
464
+
465
+ #~ msgid "Don't show"
466
+ #~ msgstr "Non mostrare"
467
+
468
+ #~ msgid "Slider mode"
469
+ #~ msgstr "Modalità scorrimento"
470
+
471
+ #~ msgid "Classic mode"
472
+ #~ msgstr "Modalità classica"
473
+
474
+ #~ msgid "Add 'View Details' Button"
475
+ #~ msgstr "Aggiungi pulsante \\’Visualizza dettagli\\’"
476
+
477
+ #~ msgid "Check this option to add a button to go to the single product page."
478
+ #~ msgstr ""
479
+ #~ "Seleziona questa opzione per aggiungere un pulsante che riporti alla "
480
+ #~ "pagina singolo prodotto."
481
+
482
+ #~ msgid "'View Details' Button Label"
483
+ #~ msgstr "Testo pulsante \\’Visualizza dettagli\\’"
484
+
485
+ #~ msgid "Set label for 'View Details' button"
486
+ #~ msgstr "Scegli il testo del pulsante \\’Visualizza dettagli\\’"
487
+
488
+ #~ msgid "View Details"
489
+ #~ msgstr "Visualizza dettagli"
490
+
491
+ #~ msgid "Enable Ajax Add To Cart"
492
+ #~ msgstr "Abilita \\“Aggiungi al carrello\\” in ajax"
493
+
494
+ #~ msgid "Check this option to enable add to cart in ajax"
495
+ #~ msgstr ""
496
+ #~ "Seleziona questa opzione per abilitare il pulsante \\”Aggiungi al carrello"
497
+ #~ "\\” in ajax"
498
+
499
+ #~ msgid "Share Options"
500
+ #~ msgstr "Opzioni di condivisione"
501
+
502
+ #~ msgid "Enable Share"
503
+ #~ msgstr "Abilita condivisione"
504
+
505
+ #~ msgid ""
506
+ #~ "Check this option if you want to show the share link for products in "
507
+ #~ "quick view"
508
+ #~ msgstr ""
509
+ #~ "Seleziona questa opzione se vuoi mostrare il link di condivisione per i "
510
+ #~ "prodotti nella quick view"
511
+
512
+ #~ msgid "Select Socials"
513
+ #~ msgstr "Seleziona social"
514
+
515
+ #~ msgid "Facebook"
516
+ #~ msgstr "Facebook"
517
+
518
+ #~ msgid "Twitter"
519
+ #~ msgstr "Twitter"
520
+
521
+ #~ msgid "Google+"
522
+ #~ msgstr "Google+"
523
+
524
+ #~ msgid "Pinterest"
525
+ #~ msgstr "Pinterest"
526
+
527
+ #~ msgid "eMail"
528
+ #~ msgstr "email"
529
+
530
+ #~ msgid "General Style"
531
+ #~ msgstr "Stile generale"
532
+
533
+ #~ msgid "'Quick View' Button Color"
534
+ #~ msgstr "Colore pulsante 'Quick View'"
535
+
536
+ #~ msgid "'Quick View' Button Text Color"
537
+ #~ msgstr "Colore testo pulsante 'Quick View'"
538
+
539
+ #~ msgid "'Quick View' Button Hover Color "
540
+ #~ msgstr "Colore pulsante 'Quick View' al passaggio del mouse"
541
+
542
+ #~ msgid "'Quick View' Button Hover Text Color"
543
+ #~ msgstr "Colore testo pulsante 'Quick View' al passaggio del mouse"
544
+
545
+ #~ msgid "Content Style"
546
+ #~ msgstr "Stile contenuto"
547
+
548
+ #~ msgid "Main Text Color"
549
+ #~ msgstr "Colore principale testo"
550
+
551
+ #~ msgid "Star Color"
552
+ #~ msgstr "Colore stellina"
553
+
554
+ #~ msgid "'Add to Cart' Button Color"
555
+ #~ msgstr "Colore pulsante ‘Aggiungi al carrello’"
556
+
557
+ #~ msgid "'Add to Cart' Button Text Color"
558
+ #~ msgstr "Colore testo pulsante ‘Aggiungi al carrello’"
559
+
560
+ #~ msgid "'Add to Cart' Button Hover Color "
561
+ #~ msgstr "Colore pulsante ‘Aggiungi al carrello’ al passaggio del mouse"
562
+
563
+ #~ msgid "'Add to Cart' Button Hover Text Color"
564
+ #~ msgstr "Colore testo pulsante ‘Aggiungi al carrello’ al passaggio del mouse"
565
+
566
+ #~ msgid "'View Details' Button Color"
567
+ #~ msgstr "Colore pulsante ‘Visualizza dettagli’"
568
+
569
+ #~ msgid "'View Details' Button Text Color"
570
+ #~ msgstr "Colore testo pulsante ‘Visualizza dettagli’"
571
+
572
+ #~ msgid "'View Details' Button Hover Color "
573
+ #~ msgstr "Colore pulsante ‘Visualizza dettagli’ al passaggio del mouse "
574
+
575
+ #~ msgid "'View Details' Button Hover Text Color"
576
+ #~ msgstr "Colore testo pulsante ‘Visualizza dettagli’ al passaggio del mouse "
577
+
578
+ #~ msgid "Closing Icon Color"
579
+ #~ msgstr "Colore icona chiusura"
580
+
581
+ #~ msgid "Closing Icon Hover Color"
582
+ #~ msgstr "Colore icona chiusura al passaggio del mouse"
583
+
584
+ #~ msgid "May I ask you to see this product, please?"
585
+ #~ msgstr "Posso chiederti di guardare questo prodotto, per favore?"
languages/yith-woocommerce-quick-view.pot CHANGED
@@ -1,274 +1,274 @@
1
- #, fuzzy
2
- msgid ""
3
- msgstr ""
4
- "Project-Id-Version: YITH WooCommerce Quick View\n"
5
- "POT-Creation-Date: 2017-10-11 12:42+0200\n"
6
- "PO-Revision-Date: 2015-05-18 11:52+0100\n"
7
- "Last-Translator: \n"
8
- "Language-Team: YIThemes <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.7.1\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
- #: ../includes/class.yith-wcqv-admin.php:129
23
- #: ../includes/class.yith-wcqv-admin.php:151
24
- msgid "Settings"
25
- msgstr ""
26
-
27
- #: ../includes/class.yith-wcqv-admin.php:130
28
- #: ../includes/class.yith-wcqv-admin.php:152
29
- msgid "Premium Version"
30
- msgstr ""
31
-
32
- #: ../includes/class.yith-wcqv-admin.php:158
33
- #: ../includes/class.yith-wcqv-admin.php:159
34
- #: ../plugin-options/settings-options.php:57
35
- msgid "Quick View"
36
- msgstr ""
37
-
38
- #: ../includes/class.yith-wcqv-admin.php:213
39
- msgid "Plugin Documentation"
40
- msgstr ""
41
-
42
- #: ../init.php:41
43
- msgid ""
44
- "YITH WooCommerce Quick View is enabled but not effective. It requires "
45
- "WooCommerce in order to work."
46
- msgstr ""
47
-
48
- #: ../init.php:50
49
- msgid ""
50
- "You can't activate the free version of YITH WooCommerce Quick View while you "
51
- "are using the premium one."
52
- msgstr ""
53
-
54
- #: ../plugin-options/settings-options.php:8
55
- msgid "Upgrade to the PREMIUM VERSION"
56
- msgstr ""
57
-
58
- #: ../plugin-options/settings-options.php:11
59
- #: ../plugin-options/settings-options.php:18
60
- msgid "YITH WooCommerce Quick View"
61
- msgstr ""
62
-
63
- #: ../plugin-options/settings-options.php:12
64
- msgid "Discover the Advanced Features"
65
- msgstr ""
66
-
67
- #: ../plugin-options/settings-options.php:13
68
- msgid ""
69
- "Upgrade to the PREMIUM VERSION of YITH WooCommerce Quick View to benefit "
70
- "from all features!"
71
- msgstr ""
72
-
73
- #: ../plugin-options/settings-options.php:20
74
- msgid "Get Support and Pro Features"
75
- msgstr ""
76
-
77
- #: ../plugin-options/settings-options.php:21
78
- msgid ""
79
- "By purchasing the premium version of the plugin, you will take advantage of "
80
- "the advanced features of the product and you will get one year of free "
81
- "updates and support through our platform available 24h/24."
82
- msgstr ""
83
-
84
- #: ../plugin-options/settings-options.php:31
85
- msgid "General Options"
86
- msgstr ""
87
-
88
- #: ../plugin-options/settings-options.php:39
89
- msgid "Enable Quick View"
90
- msgstr ""
91
-
92
- #: ../plugin-options/settings-options.php:46
93
- msgid "Enable Quick View on mobile"
94
- msgstr ""
95
-
96
- #: ../plugin-options/settings-options.php:47
97
- msgid "Enable quick view features on mobile device too"
98
- msgstr ""
99
-
100
- #: ../plugin-options/settings-options.php:54
101
- msgid "Quick View Button Label"
102
- msgstr ""
103
-
104
- #: ../plugin-options/settings-options.php:55
105
- msgid "Label for the quick view button in the WooCommerce loop."
106
- msgstr ""
107
-
108
- #: ../plugin-options/settings-options.php:62
109
- msgid "Enable Lightbox"
110
- msgstr ""
111
-
112
- #: ../plugin-options/settings-options.php:63
113
- msgid "Enable lightbox. Product images will open in a lightbox."
114
- msgstr ""
115
-
116
- #: ../plugin-options/settings-options.php:74 ../templates/admin/premium.php:323
117
- #: ../templates/admin/premium.php:328
118
- msgid "Style Options"
119
- msgstr ""
120
-
121
- #: ../plugin-options/settings-options.php:81
122
- msgid "Modal Window Background Color"
123
- msgstr ""
124
-
125
- #: ../plugin-options/settings-options.php:89
126
- msgid "Closing Button Color"
127
- msgstr ""
128
-
129
- #: ../plugin-options/settings-options.php:97
130
- msgid "Closing Button Hover Color"
131
- msgstr ""
132
-
133
- #: ../templates/admin/premium.php:210 ../templates/admin/premium.php:364
134
- #, php-format
135
- msgid ""
136
- "Upgrade to %1$spremium version%2$s of %1$sYITH WooCommerce Quick View%2$s to "
137
- "benefit from all features!"
138
- msgstr ""
139
-
140
- #: ../templates/admin/premium.php:213 ../templates/admin/premium.php:367
141
- msgid "UPGRADE"
142
- msgstr ""
143
-
144
- #: ../templates/admin/premium.php:214 ../templates/admin/premium.php:368
145
- msgid "to the premium version"
146
- msgstr ""
147
-
148
- #: ../templates/admin/premium.php:220
149
- msgid "Premium Features"
150
- msgstr ""
151
-
152
- #: ../templates/admin/premium.php:223
153
- msgid "Button type"
154
- msgstr ""
155
-
156
- #: ../templates/admin/premium.php:228
157
- msgid "BUTTON TYPE"
158
- msgstr ""
159
-
160
- #: ../templates/admin/premium.php:230
161
- #, php-format
162
- msgid ""
163
- "Choose between the button or a custom icon to access the %1$sQuick View%2$s: "
164
- "you can choose to place it after the \"Add To Cart\" button or inside the "
165
- "thumbnail of the product."
166
- msgstr ""
167
-
168
- #: ../templates/admin/premium.php:238 ../templates/admin/premium.php:239
169
- #: ../templates/admin/premium.php:244
170
- msgid "Product Navigation"
171
- msgstr ""
172
-
173
- #: ../templates/admin/premium.php:241
174
- #, php-format
175
- msgid ""
176
- "The navigation in the \"Quick View\" allows browsing among %1$sproducts%2$s "
177
- "displayed in it. The navigation arrows show on mousehover the image of the "
178
- "next/previous product."
179
- msgstr ""
180
-
181
- #: ../templates/admin/premium.php:255 ../templates/admin/premium.php:256
182
- msgid "Content to display"
183
- msgstr ""
184
-
185
- #: ../templates/admin/premium.php:258
186
- #, php-format
187
- msgid ""
188
- "The display of the product information in the \"Quick View\" are managed by "
189
- "%1$sadministrators%2$s who can decide whether to show everything or only a "
190
- "part of it."
191
- msgstr ""
192
-
193
- #: ../templates/admin/premium.php:267
194
- msgid "Quick View Type"
195
- msgstr ""
196
-
197
- #: ../templates/admin/premium.php:269
198
- #, php-format
199
- msgid ""
200
- "Quick view has two different displaying modes: the first one opens it as a "
201
- "%1$smodal window%2$s, the other one opens it in the page itself with a "
202
- "%1$scascading effect%2$s above content page."
203
- msgstr ""
204
-
205
- #: ../templates/admin/premium.php:272
206
- msgid "Quick view type"
207
- msgstr ""
208
-
209
- #: ../templates/admin/premium.php:284
210
- msgid "\"View details\" button"
211
- msgstr ""
212
-
213
- #: ../templates/admin/premium.php:286
214
- msgid ""
215
- "An additional button that allows users to access product detail page "
216
- "directly from quick view window just with a click of the mouse."
217
- msgstr ""
218
-
219
- #: ../templates/admin/premium.php:295
220
- msgid "Type of product images"
221
- msgstr ""
222
-
223
- #: ../templates/admin/premium.php:297
224
- #, php-format
225
- msgid ""
226
- "Each product can have more than one image: choose whether to hide or show "
227
- "them with the %1$sslider%2$s effect or in the classic %1$sWooCommerce%2$s "
228
- "display."
229
- msgstr ""
230
-
231
- #: ../templates/admin/premium.php:312
232
- msgid "SHARE"
233
- msgstr ""
234
-
235
- #: ../templates/admin/premium.php:314
236
- #, php-format
237
- msgid ""
238
- "%1$sQuick View is also social-friendly!%2$s Activating this option, you will "
239
- "be able to share the Quick View on Facebook, Twitter, Pinterest, Google+, or "
240
- "sending an email."
241
- msgstr ""
242
-
243
- #: ../templates/admin/premium.php:325
244
- #, php-format
245
- msgid ""
246
- "A rich option panel to change the colors of the %1$s\"Quick View\"%2$s "
247
- "button and of everything that is within the modal window generated."
248
- msgstr ""
249
-
250
- #: ../templates/admin/premium.php:340
251
- msgid "SHORTCODE"
252
- msgstr ""
253
-
254
- #: ../templates/admin/premium.php:342
255
- msgid ""
256
- "The shortcode of plugin is a $1$srapid$2$s and $1$seasy$2$s solution: you "
257
- "can add a button in any spot of the page to allow your users to see the "
258
- "quick view of a specific product in your store."
259
- msgstr ""
260
-
261
- #: ../templates/admin/premium.php:351
262
- msgid "Compatibility with other YITH's plugins"
263
- msgstr ""
264
-
265
- #: ../templates/admin/premium.php:353
266
- #, php-format
267
- msgid ""
268
- "Thanks to the compatibility with %1$sYITH WooCommerce Zoom Magnifier, YITH "
269
- "WooCommerce Badge Management%2$s and %1$sYITH WooCommerce Wishlist%2$s, you "
270
- "will be free to enrich further the content of your quick view.%3$s Zoom the "
271
- "product image, show a badge, or add the button to open the quick view in all "
272
- "products available in your users' wishlists. With YITH's plugins you make "
273
- "the difference."
274
- msgstr ""
1
+ #, fuzzy
2
+ msgid ""
3
+ msgstr ""
4
+ "Project-Id-Version: YITH WooCommerce Quick View\n"
5
+ "POT-Creation-Date: 2017-10-11 12:42+0200\n"
6
+ "PO-Revision-Date: 2015-05-18 11:52+0100\n"
7
+ "Last-Translator: \n"
8
+ "Language-Team: YIThemes <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.7.1\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
+ #: ../includes/class.yith-wcqv-admin.php:129
23
+ #: ../includes/class.yith-wcqv-admin.php:151
24
+ msgid "Settings"
25
+ msgstr ""
26
+
27
+ #: ../includes/class.yith-wcqv-admin.php:130
28
+ #: ../includes/class.yith-wcqv-admin.php:152
29
+ msgid "Premium Version"
30
+ msgstr ""
31
+
32
+ #: ../includes/class.yith-wcqv-admin.php:158
33
+ #: ../includes/class.yith-wcqv-admin.php:159
34
+ #: ../plugin-options/settings-options.php:57
35
+ msgid "Quick View"
36
+ msgstr ""
37
+
38
+ #: ../includes/class.yith-wcqv-admin.php:213
39
+ msgid "Plugin Documentation"
40
+ msgstr ""
41
+
42
+ #: ../init.php:41
43
+ msgid ""
44
+ "YITH WooCommerce Quick View is enabled but not effective. It requires "
45
+ "WooCommerce in order to work."
46
+ msgstr ""
47
+
48
+ #: ../init.php:50
49
+ msgid ""
50
+ "You can't activate the free version of YITH WooCommerce Quick View while you "
51
+ "are using the premium one."
52
+ msgstr ""
53
+
54
+ #: ../plugin-options/settings-options.php:8
55
+ msgid "Upgrade to the PREMIUM VERSION"
56
+ msgstr ""
57
+
58
+ #: ../plugin-options/settings-options.php:11
59
+ #: ../plugin-options/settings-options.php:18
60
+ msgid "YITH WooCommerce Quick View"
61
+ msgstr ""
62
+
63
+ #: ../plugin-options/settings-options.php:12
64
+ msgid "Discover the Advanced Features"
65
+ msgstr ""
66
+
67
+ #: ../plugin-options/settings-options.php:13
68
+ msgid ""
69
+ "Upgrade to the PREMIUM VERSION of YITH WooCommerce Quick View to benefit "
70
+ "from all features!"
71
+ msgstr ""
72
+
73
+ #: ../plugin-options/settings-options.php:20
74
+ msgid "Get Support and Pro Features"
75
+ msgstr ""
76
+
77
+ #: ../plugin-options/settings-options.php:21
78
+ msgid ""
79
+ "By purchasing the premium version of the plugin, you will take advantage of "
80
+ "the advanced features of the product and you will get one year of free "
81
+ "updates and support through our platform available 24h/24."
82
+ msgstr ""
83
+
84
+ #: ../plugin-options/settings-options.php:31
85
+ msgid "General Options"
86
+ msgstr ""
87
+
88
+ #: ../plugin-options/settings-options.php:39
89
+ msgid "Enable Quick View"
90
+ msgstr ""
91
+
92
+ #: ../plugin-options/settings-options.php:46
93
+ msgid "Enable Quick View on mobile"
94
+ msgstr ""
95
+
96
+ #: ../plugin-options/settings-options.php:47
97
+ msgid "Enable quick view features on mobile device too"
98
+ msgstr ""
99
+
100
+ #: ../plugin-options/settings-options.php:54
101
+ msgid "Quick View Button Label"
102
+ msgstr ""
103
+
104
+ #: ../plugin-options/settings-options.php:55
105
+ msgid "Label for the quick view button in the WooCommerce loop."
106
+ msgstr ""
107
+
108
+ #: ../plugin-options/settings-options.php:62
109
+ msgid "Enable Lightbox"
110
+ msgstr ""
111
+
112
+ #: ../plugin-options/settings-options.php:63
113
+ msgid "Enable lightbox. Product images will open in a lightbox."
114
+ msgstr ""
115
+
116
+ #: ../plugin-options/settings-options.php:74 ../templates/admin/premium.php:323
117
+ #: ../templates/admin/premium.php:328
118
+ msgid "Style Options"
119
+ msgstr ""
120
+
121
+ #: ../plugin-options/settings-options.php:81
122
+ msgid "Modal Window Background Color"
123
+ msgstr ""
124
+
125
+ #: ../plugin-options/settings-options.php:89
126
+ msgid "Closing Button Color"
127
+ msgstr ""
128
+
129
+ #: ../plugin-options/settings-options.php:97
130
+ msgid "Closing Button Hover Color"
131
+ msgstr ""
132
+
133
+ #: ../templates/admin/premium.php:210 ../templates/admin/premium.php:364
134
+ #, php-format
135
+ msgid ""
136
+ "Upgrade to %1$spremium version%2$s of %1$sYITH WooCommerce Quick View%2$s to "
137
+ "benefit from all features!"
138
+ msgstr ""
139
+
140
+ #: ../templates/admin/premium.php:213 ../templates/admin/premium.php:367
141
+ msgid "UPGRADE"
142
+ msgstr ""
143
+
144
+ #: ../templates/admin/premium.php:214 ../templates/admin/premium.php:368
145
+ msgid "to the premium version"
146
+ msgstr ""
147
+
148
+ #: ../templates/admin/premium.php:220
149
+ msgid "Premium Features"
150
+ msgstr ""
151
+
152
+ #: ../templates/admin/premium.php:223
153
+ msgid "Button type"
154
+ msgstr ""
155
+
156
+ #: ../templates/admin/premium.php:228
157
+ msgid "BUTTON TYPE"
158
+ msgstr ""
159
+
160
+ #: ../templates/admin/premium.php:230
161
+ #, php-format
162
+ msgid ""
163
+ "Choose between the button or a custom icon to access the %1$sQuick View%2$s: "
164
+ "you can choose to place it after the \"Add To Cart\" button or inside the "
165
+ "thumbnail of the product."
166
+ msgstr ""
167
+
168
+ #: ../templates/admin/premium.php:238 ../templates/admin/premium.php:239
169
+ #: ../templates/admin/premium.php:244
170
+ msgid "Product Navigation"
171
+ msgstr ""
172
+
173
+ #: ../templates/admin/premium.php:241
174
+ #, php-format
175
+ msgid ""
176
+ "The navigation in the \"Quick View\" allows browsing among %1$sproducts%2$s "
177
+ "displayed in it. The navigation arrows show on mousehover the image of the "
178
+ "next/previous product."
179
+ msgstr ""
180
+
181
+ #: ../templates/admin/premium.php:255 ../templates/admin/premium.php:256
182
+ msgid "Content to display"
183
+ msgstr ""
184
+
185
+ #: ../templates/admin/premium.php:258
186
+ #, php-format
187
+ msgid ""
188
+ "The display of the product information in the \"Quick View\" are managed by "
189
+ "%1$sadministrators%2$s who can decide whether to show everything or only a "
190
+ "part of it."
191
+ msgstr ""
192
+
193
+ #: ../templates/admin/premium.php:267
194
+ msgid "Quick View Type"
195
+ msgstr ""
196
+
197
+ #: ../templates/admin/premium.php:269
198
+ #, php-format
199
+ msgid ""
200
+ "Quick view has two different displaying modes: the first one opens it as a "
201
+ "%1$smodal window%2$s, the other one opens it in the page itself with a "
202
+ "%1$scascading effect%2$s above content page."
203
+ msgstr ""
204
+
205
+ #: ../templates/admin/premium.php:272
206
+ msgid "Quick view type"
207
+ msgstr ""
208
+
209
+ #: ../templates/admin/premium.php:284
210
+ msgid "\"View details\" button"
211
+ msgstr ""
212
+
213
+ #: ../templates/admin/premium.php:286
214
+ msgid ""
215
+ "An additional button that allows users to access product detail page "
216
+ "directly from quick view window just with a click of the mouse."
217
+ msgstr ""
218
+
219
+ #: ../templates/admin/premium.php:295
220
+ msgid "Type of product images"
221
+ msgstr ""
222
+
223
+ #: ../templates/admin/premium.php:297
224
+ #, php-format
225
+ msgid ""
226
+ "Each product can have more than one image: choose whether to hide or show "
227
+ "them with the %1$sslider%2$s effect or in the classic %1$sWooCommerce%2$s "
228
+ "display."
229
+ msgstr ""
230
+
231
+ #: ../templates/admin/premium.php:312
232
+ msgid "SHARE"
233
+ msgstr ""
234
+
235
+ #: ../templates/admin/premium.php:314
236
+ #, php-format
237
+ msgid ""
238
+ "%1$sQuick View is also social-friendly!%2$s Activating this option, you will "
239
+ "be able to share the Quick View on Facebook, Twitter, Pinterest, Google+, or "
240
+ "sending an email."
241
+ msgstr ""
242
+
243
+ #: ../templates/admin/premium.php:325
244
+ #, php-format
245
+ msgid ""
246
+ "A rich option panel to change the colors of the %1$s\"Quick View\"%2$s "
247
+ "button and of everything that is within the modal window generated."
248
+ msgstr ""
249
+
250
+ #: ../templates/admin/premium.php:340
251
+ msgid "SHORTCODE"
252
+ msgstr ""
253
+
254
+ #: ../templates/admin/premium.php:342
255
+ msgid ""
256
+ "The shortcode of plugin is a $1$srapid$2$s and $1$seasy$2$s solution: you "
257
+ "can add a button in any spot of the page to allow your users to see the "
258
+ "quick view of a specific product in your store."
259
+ msgstr ""
260
+
261
+ #: ../templates/admin/premium.php:351
262
+ msgid "Compatibility with other YITH's plugins"
263
+ msgstr ""
264
+
265
+ #: ../templates/admin/premium.php:353
266
+ #, php-format
267
+ msgid ""
268
+ "Thanks to the compatibility with %1$sYITH WooCommerce Zoom Magnifier, YITH "
269
+ "WooCommerce Badge Management%2$s and %1$sYITH WooCommerce Wishlist%2$s, you "
270
+ "will be free to enrich further the content of your quick view.%3$s Zoom the "
271
+ "product image, show a badge, or add the button to open the quick view in all "
272
+ "products available in your users' wishlists. With YITH's plugins you make "
273
+ "the difference."
274
+ msgstr ""
plugin-fw/assets/css/admin.css CHANGED
@@ -1,196 +1,196 @@
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 FEEDS
58
- ------------------------*/
59
-
60
- .yith-feeds-logo {
61
- display: table-cell;
62
- background: #005b7c;
63
- padding: 5px;
64
- border-radius: 50%;
65
- margin-right: 10px;
66
- vertical-align: text-bottom;
67
- width: 18px;
68
- height: auto;
69
- vertical-align: middle;
70
- }
71
-
72
- .yith-feeds-plugin-name {
73
- display: table-cell;
74
- vertical-align: middle;
75
- }
76
-
77
- /*-----------------------
78
- YITH Plugins Columns
79
- ------------------------*/
80
- @media screen and (min-width: 783px) {
81
-
82
- .auto-fold #adminmenu .yith-plugin-fw-menu-2-columns.wp-not-current-submenu .wp-submenu-head {
83
- width: 100%;
84
- }
85
-
86
- #adminmenu .yith-plugin-fw-menu-2-columns.wp-not-current-submenu .wp-submenu {
87
- min-width: 320px;
88
- display: flex;
89
- flex-flow: row wrap;
90
- }
91
-
92
- #adminmenu .yith-plugin-fw-menu-2-columns.wp-not-current-submenu .wp-submenu li:not(.wp-submenu-head) {
93
- width: 50%;
94
- border-left: 1px solid #555;
95
- box-sizing: border-box;
96
- }
97
-
98
- #adminmenu .yith-plugin-fw-menu-2-columns.wp-not-current-submenu .wp-submenu li:not(.wp-submenu-head):nth-child(2n) {
99
- border-left: none;
100
- }
101
-
102
- #adminmenu .yith-plugin-fw-menu-3-columns.wp-not-current-submenu .wp-submenu {
103
- min-width: 480px;
104
- display: flex;
105
- flex-flow: row wrap;
106
- }
107
-
108
- #adminmenu .yith-plugin-fw-menu-3-columns.wp-not-current-submenu .wp-submenu li:not(.wp-submenu-head) {
109
- width: calc(100% / 3);
110
- border-left: 1px solid #555;
111
- box-sizing: border-box;
112
- }
113
-
114
- #adminmenu .yith-plugin-fw-menu-3-columns.wp-not-current-submenu .wp-submenu li:not(.wp-submenu-head):nth-child(3n + 2) {
115
- border-left: none;
116
- }
117
- }
118
-
119
- /*---------------------------
120
- YITH System Information
121
- ----------------------------*/
122
- .yith-phpinfo img {
123
- float: right;
124
- border: 0;
125
- }
126
-
127
- #yith-system-alert span.yith-logo,
128
- .yith-system-info h1 span.yith-logo {
129
- border-radius: 50%;
130
- background: #265b7a;
131
- height: 30px;
132
- width: 30px;
133
- display: flex;
134
- text-align: center;
135
- margin: 0 10px 0 0;
136
- float: left;
137
- align-items: center;
138
- justify-content: center;
139
- }
140
-
141
- .yith-system-info table {
142
- margin: 20px 0;
143
- }
144
-
145
- .yith-system-info table th {
146
- font-weight: bold;
147
- width: 25%;
148
- padding: 20px 12px;
149
- }
150
-
151
- .yith-system-info table td {
152
- word-break: break-all;
153
- padding: 20px 12px;
154
- }
155
-
156
- .yith-system-info table td.requirement-value {
157
- font-size: 14px;
158
- vertical-align: middle;
159
- text-align: left;
160
- color: #5da726;
161
- line-height: 19px;
162
- width: 90px;
163
- }
164
-
165
- .yith-system-info table td.requirement-value.has-errors {
166
- color: #a00;
167
- }
168
-
169
- .yith-system-info table td.requirement-value.has-warnings {
170
- color: #ffa200;
171
- }
172
-
173
- .yith-system-info table td.requirement-messages ul {
174
- margin: 0;
175
- padding: 0 0 10px 0;
176
- list-style: none!important;
177
- }
178
-
179
- .yith-system-info table td.requirement-messages ul li {
180
- margin-bottom: 3px;
181
- }
182
-
183
- .yith-system-info table td.requirement-messages ul li span.error {
184
- color: #a00;
185
- font-weight: bold;
186
- }
187
-
188
- .yith-system-info table td.requirement-messages ul li span.warning {
189
- color: #a00;
190
- font-weight: bold;
191
- }
192
-
193
- .yith-system-info-menu {
194
- font-weight: bold;
195
- font-size: 11px !important;
196
- }
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 FEEDS
58
+ ------------------------*/
59
+
60
+ .yith-feeds-logo {
61
+ display: table-cell;
62
+ background: #005b7c;
63
+ padding: 5px;
64
+ border-radius: 50%;
65
+ margin-right: 10px;
66
+ vertical-align: text-bottom;
67
+ width: 18px;
68
+ height: auto;
69
+ vertical-align: middle;
70
+ }
71
+
72
+ .yith-feeds-plugin-name {
73
+ display: table-cell;
74
+ vertical-align: middle;
75
+ }
76
+
77
+ /*-----------------------
78
+ YITH Plugins Columns
79
+ ------------------------*/
80
+ @media screen and (min-width: 783px) {
81
+
82
+ .auto-fold #adminmenu .yith-plugin-fw-menu-2-columns.wp-not-current-submenu .wp-submenu-head {
83
+ width: 100%;
84
+ }
85
+
86
+ #adminmenu .yith-plugin-fw-menu-2-columns.wp-not-current-submenu .wp-submenu {
87
+ min-width: 320px;
88
+ display: flex;
89
+ flex-flow: row wrap;
90
+ }
91
+
92
+ #adminmenu .yith-plugin-fw-menu-2-columns.wp-not-current-submenu .wp-submenu li:not(.wp-submenu-head) {
93
+ width: 50%;
94
+ border-left: 1px solid #555;
95
+ box-sizing: border-box;
96
+ }
97
+
98
+ #adminmenu .yith-plugin-fw-menu-2-columns.wp-not-current-submenu .wp-submenu li:not(.wp-submenu-head):nth-child(2n) {
99
+ border-left: none;
100
+ }
101
+
102
+ #adminmenu .yith-plugin-fw-menu-3-columns.wp-not-current-submenu .wp-submenu {
103
+ min-width: 480px;
104
+ display: flex;
105
+ flex-flow: row wrap;
106
+ }
107
+
108
+ #adminmenu .yith-plugin-fw-menu-3-columns.wp-not-current-submenu .wp-submenu li:not(.wp-submenu-head) {
109
+ width: calc(100% / 3);
110
+ border-left: 1px solid #555;
111
+ box-sizing: border-box;
112
+ }
113
+
114
+ #adminmenu .yith-plugin-fw-menu-3-columns.wp-not-current-submenu .wp-submenu li:not(.wp-submenu-head):nth-child(3n + 2) {
115
+ border-left: none;
116
+ }
117
+ }
118
+
119
+ /*---------------------------
120
+ YITH System Information
121
+ ----------------------------*/
122
+ .yith-phpinfo img {
123
+ float: right;
124
+ border: 0;
125
+ }
126
+
127
+ #yith-system-alert span.yith-logo,
128
+ .yith-system-info h1 span.yith-logo {
129
+ border-radius: 50%;
130
+ background: #265b7a;
131
+ height: 30px;
132
+ width: 30px;
133
+ display: flex;
134
+ text-align: center;
135
+ margin: 0 10px 0 0;
136
+ float: left;
137
+ align-items: center;
138
+ justify-content: center;
139
+ }
140
+
141
+ .yith-system-info table {
142
+ margin: 20px 0;
143
+ }
144
+
145
+ .yith-system-info table th {
146
+ font-weight: bold;
147
+ width: 25%;
148
+ padding: 20px 12px;
149
+ }
150
+
151
+ .yith-system-info table td {
152
+ word-break: break-all;
153
+ padding: 20px 12px;
154
+ }
155
+
156
+ .yith-system-info table td.requirement-value {
157
+ font-size: 14px;
158
+ vertical-align: middle;
159
+ text-align: left;
160
+ color: #5da726;
161
+ line-height: 19px;
162
+ width: 90px;
163
+ }
164
+
165
+ .yith-system-info table td.requirement-value.has-errors {
166
+ color: #a00;
167
+ }
168
+
169
+ .yith-system-info table td.requirement-value.has-warnings {
170
+ color: #ffa200;
171
+ }
172
+
173
+ .yith-system-info table td.requirement-messages ul {
174
+ margin: 0;
175
+ padding: 0 0 10px 0;
176
+ list-style: none!important;
177
+ }
178
+
179
+ .yith-system-info table td.requirement-messages ul li {
180
+ margin-bottom: 3px;
181
+ }
182
+
183
+ .yith-system-info table td.requirement-messages ul li span.error {
184
+ color: #a00;
185
+ font-weight: bold;
186
+ }
187
+
188
+ .yith-system-info table td.requirement-messages ul li span.warning {
189
+ color: #a00;
190
+ font-weight: bold;
191
+ }
192
+
193
+ .yith-system-info-menu {
194
+ font-weight: bold;
195
+ font-size: 11px !important;
196
+ }
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,721 +1,721 @@
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 .yith-plugin-fw-radio__row {
91
- width: 100%;
92
- min-height: 20px;
93
- }
94
-
95
- .metaboxes-tab .yith-plugin-fw-radio__row label,
96
- .metaboxes-tab .yith-toggle-elements label,
97
- .metaboxes-tab .yith-add-box label {
98
- margin-left: 0;
99
- font-weight: normal;
100
- }
101
-
102
- .metaboxes-tab.yith-plugin-ui h3 {
103
- color: #2a8db0;
104
- font-size: 15px;
105
- text-transform: uppercase;
106
- background-color: #fff;
107
- padding: 35px 20px;
108
- margin: 0px 0 0 -4px;
109
- width: auto;
110
- background: transparent;
111
- }
112
-
113
- .metaboxes-tab.yith-plugin-ui .yith-add-box,
114
- .metaboxes-tab.yith-plugin-ui .yith-toggle-row {
115
- width: auto;
116
- }
117
-
118
- .metaboxes-tab .wp-picker-container label {
119
- font-weight: inherit;
120
- width: auto;
121
- float: none;
122
- line-height: inherit;
123
- margin-left: 0;
124
- }
125
-
126
- .metaboxes-tab.yith-plugin-ui .yith-plugin-fw-radio__row label {
127
- width: auto !important;
128
- display: inline-block;
129
- font-weight: normal;
130
- }
131
-
132
- .metaboxes-tab input[type="checkbox"] {
133
- vertical-align: middle
134
- }
135
-
136
- .metaboxes-tab input.button-secondary, .metaboxes-tab input.checkbox {
137
- width: auto;
138
- }
139
-
140
- .metaboxes-tab p.field-row.textarea .description {
141
- vertical-align: top;
142
- }
143
-
144
- .metaboxes-tab p.field-row.checkbox {
145
- background: none;
146
- }
147
-
148
- .metaboxes-tab .the-metabox {
149
- margin: 20px 0;
150
- margin-left: 184px;
151
- }
152
-
153
- .metaboxes-tab .the-metabox.no-label {
154
- margin: 20px 0;
155
- margin-left: 0;
156
- }
157
-
158
- .metaboxes-tab hr {
159
- height: 0px;
160
- border-top: 1px solid #dadada;
161
- width: auto;
162
- margin-left: -10px;
163
- margin-right: -10px;
164
- }
165
-
166
- .metaboxes-tab .the-metabox p {
167
- margin: 0;
168
- }
169
-
170
- .metaboxes-tab .the-metabox:last-child {
171
- border-bottom: 0px;
172
- }
173
-
174
- .metaboxes-tab .the-metabox.checkbox {
175
- background: none;
176
- }
177
-
178
- .metaboxes-tab span.description.inline {
179
- display: inline-block;
180
- line-height: 23px;
181
- width: auto;
182
- vertical-align: middle;
183
- margin: 0;
184
- }
185
-
186
- .metaboxes-tab .slider label {
187
- padding: 15px 0;
188
- }
189
-
190
- /* sortable table posts */
191
-
192
- #the-list.ui-sortable tr:hover {
193
- cursor: move;
194
- }
195
-
196
- .the-metabox.preview {
197
- float: none;
198
- }
199
-
200
- .metaboxes-tab .the-metabox.no-label.preview {
201
- margin-left: 184px;
202
- }
203
-
204
- .metaboxes-tab .the-metabox.no-label.preview img {
205
- box-shadow: 0 1px 8px rgba(0, 0, 0, 0.2);
206
- }
207
-
208
- /**************************************
209
- FIELDS
210
- ***************************************/
211
-
212
- .metaboxes-tab select,
213
- .metaboxes-tab input[type=text],
214
- .metaboxes-tab input[type=number],
215
- .metaboxes-tab textarea,
216
- .metaboxes-tab .yith-plugin-fw-select,
217
- .metaboxes-tab .yith-plugin-fw-slider-container,
218
- .metaboxes-tab .yith-plugin-fw-text-input,
219
- .metaboxes-tab .yith-plugin-fw-text-array-table,
220
- .metaboxes-tab .yith-plugin-fw-textarea {
221
- width: 400px;
222
- max-width: 100%;
223
- }
224
-
225
- .metaboxes-tab.yith-plugin-ui input[type=number] {
226
- width: auto;
227
- min-width: 90px;
228
- }
229
-
230
- .metaboxes-tab.yith-plugin-ui p {
231
- font-size: 14px;
232
- }
233
-
234
- .metaboxes-tab.yith-plugin-ui p.section-description {
235
-
236
- margin: 0 20px 40px 18px;
237
- }
238
-
239
- .metaboxes-tab .yith-plugin-fw-text-array-table input[type=text] {
240
- width: 100%;
241
- }
242
-
243
- .metaboxes-tab.yith-plugin-ui .yith-add-box h3 {
244
- padding: 0 0 30px 0;
245
- font-weight: 600;
246
- margin: 0;
247
- }
248
-
249
- .metaboxes-tab.yith-plugin-ui .select2-container--default .select2-selection--single {
250
- border: 0;
251
- margin: 0;
252
- }
253
-
254
- /* wp editor */
255
- .the-metabox.textarea-editor .mceIframeContainer {
256
- background: #fff;
257
- }
258
-
259
-
260
- .the-metabox.textarea-editor label {
261
- margin-top: 24px;
262
- }
263
-
264
- /* categories */
265
- .categories-panel {
266
- width: 30%;
267
- float: left;
268
- margin-right: 4px;
269
- }
270
-
271
- .categories-panel .box {
272
- height: 200px;
273
- border: 1px solid #dfdfdf;
274
- background: #fff;
275
- padding: 6px 10px;
276
- overflow: auto;
277
- }
278
-
279
- .categories-panel ul {
280
- list-style: none;
281
- margin: 0;
282
- }
283
-
284
- .categories-panel ul li {
285
- line-height: 19px;
286
- margin: 0;
287
- padding: 0;
288
- word-wrap: break-word;
289
- }
290
-
291
- .categories-panel ul li label {
292
- font-weight: normal !important;
293
- margin-left: 0 !important;
294
- }
295
-
296
- .categories-panel input.newcategory {
297
- width: 100%;
298
- margin-bottom: 3px;
299
- }
300
-
301
- /* contact form */
302
- .contactform_item {
303
- border-style: solid;
304
- border-width: 1px;
305
- line-height: 1;
306
- margin-bottom: 20px;
307
- padding: 0;
308
- background-color: #f5f5f5;
309
- background-image: -moz-linear-gradient(center top, #f9f9f9, #f5f5f5);
310
- border-color: #dfdfdf;
311
- border-radius: 3px 3px 3px 3px;
312
- box-shadow: 0 1px 0 #fff inset;
313
- min-width: 255px;
314
- position: relative;
315
- }
316
-
317
- .contactform_item .handlediv {
318
- position: relative;
319
- top: -4px;
320
- }
321
-
322
- .contactform_item h3 {
323
- min-height: 21px;
324
- margin: 13px;
325
- }
326
-
327
- .contactform_item .inside {
328
- padding: 10px !important;
329
- }
330
-
331
- .contactform_item .deps {
332
- display: none;
333
- }
334
-
335
- .contactform_item .addoptions p.option {
336
- margin: 5px 0 5px 200px
337
- }
338
-
339
- .contactform_item .addoptions p label {
340
- width: 80px !important;
341
- }
342
-
343
- .contactform_item .add-field-option {
344
- margin-bottom: 10px !important;
345
- }
346
-
347
- .remove_item {
348
- float: right;
349
- }
350
-
351
- .metabox-sortable-placeholder {
352
- border: 1px dotted #dedede;
353
- margin: 10px 0
354
- }
355
-
356
- /* features tab */
357
- .featurestab_item {
358
- border-style: solid;
359
- border-width: 1px;
360
- line-height: 1;
361
- margin-bottom: 20px;
362
- padding: 0;
363
- background-color: #f5f5f5;
364
- background-image: -moz-linear-gradient(center top, #f9f9f9, #f5f5f5);
365
- border-color: #dfdfdf;
366
- border-radius: 3px 3px 3px 3px;
367
- box-shadow: 0 1px 0 #fff inset;
368
- min-width: 255px;
369
- position: relative;
370
- }
371
-
372
- .featurestab_item .handlediv {
373
- position: relative;
374
- top: -4px;
375
- }
376
-
377
- .featurestab_item h3 {
378
- min-height: 21px
379
- }
380
-
381
- .featurestab_item .inside {
382
- padding: 10px !important;
383
- }
384
-
385
- .featurestab_item .deps {
386
- display: none;
387
- }
388
-
389
- .featurestab_item .addoptions p.option {
390
- margin: 5px 0 5px 200px
391
- }
392
-
393
- .featurestab_item .addoptions p label {
394
- width: 80px !important;
395
- }
396
-
397
- .featurestab_item .add-field-option {
398
- margin-bottom: 10px !important;
399
- }
400
-
401
- .messages-panel.updated {
402
- margin: 10px 0px 10px !important;
403
- max-width: 1200px;
404
- border-radius: 5px;
405
- -webkit-box-sizing: border-box;
406
- box-sizing: border-box;
407
- }
408
-
409
- .ui-widget-overlay {
410
- background-image: none !important;
411
- }
412
-
413
- .the-metabox .icon_type {
414
- width: 30%;
415
- float: left;
416
- margin-right: 40px
417
- }
418
-
419
- #post-type-settings .category-list label {
420
- width: 187px;
421
- }
422
-
423
- .remove_cat {
424
- float: right;
425
- text-align: center;
426
- display: block;
427
- width: 20px;
428
- height: 20px;
429
- border-radius: 20px;
430
- font-weight: bold;
431
- font-size: 10px;
432
- background: #efefef;
433
- text-decoration: none;
434
- }
435
-
436
- /* typography */
437
- .the-metabox.typography .select_wrapper.font-family {
438
- width: 200px;
439
- }
440
-
441
- .the-metabox.typography .spinner_container {
442
- float: left;
443
- margin-right: 10px;
444
- }
445
-
446
- .the-metabox.typography .spinner_container input.number {
447
- width: 50px !important;
448
- -webkit-border-top-right-radius: 0px;
449
- -webkit-border-bottom-right-radius: 0px;
450
- -moz-border-radius-topright: 0px;
451
- -moz-border-radius-bottomright: 0px;
452
- border-top-right-radius: 0px;
453
- border-bottom-right-radius: 0px;
454
- }
455
-
456
- /* number */
457
- .the-metabox.number input.number {
458
- width: 50px !important;
459
- }
460
-
461
- /* number */
462
- .rm_number .number {
463
- width: 70px;
464
- text-align: right;
465
- -webkit-border-top-right-radius: 0px;
466
- -webkit-border-bottom-right-radius: 0px;
467
- -moz-border-radius-topright: 0px;
468
- -moz-border-radius-bottomright: 0px;
469
- border-top-right-radius: 0px;
470
- border-bottom-right-radius: 0px;
471
- }
472
-
473
- .spinner-wrapper {
474
- position: relative;
475
- height: 23px;
476
- overflow: hidden;
477
- }
478
-
479
- .spinner-wrapper input.number {
480
- float: left;
481
- }
482
-
483
- .spinner-wrapper .spinner-button {
484
- cursor: pointer;
485
- float: left;
486
- position: absolute;
487
- left: 69px;
488
- width: 15px;
489
- height: 12px;
490
- border: 1px solid #dfdfdf;
491
- background: #fff;
492
- margin: 0;
493
- padding: 0;
494
- line-height: 9999px;
495
- overflow: hidden;
496
- background: url('../images/spinner.png') no-repeat center -11px
497
- }
498
-
499
- .spinner-wrapper .spinner-button.button-plus {
500
- top: 0;
501
- -webkit-border-top-right-radius: 3px !important;
502
- -moz-border-radius-topright: 3px !important;
503
- border-top-right-radius: 3px !important;
504
- }
505
-
506
- .spinner-wrapper .spinner-button.button-minus {
507
- bottom: 0;
508
- background-position: center -30px;
509
- -webkit-border-bottom-right-radius: 3px !important;
510
- -moz-border-radius-bottomright: 3px !important;
511
- border-bottom-right-radius: 3px !important;
512
- }
513
-
514
- .spinner-wrapper .spinner-button.button-plus:active {
515
- background-position: center 0px;
516
- }
517
-
518
- .spinner-wrapper .spinner-button.button-minus:active {
519
- background-position: center -20px;
520
- }
521
-
522
- .rm_typography .spinner_container {
523
- float: left;
524
- margin-right: 10px;
525
- }
526
-
527
- .rm_typography .spinner-wrapper {
528
- height: 28px;
529
- }
530
-
531
- .rm_typography .spinner-wrapper input.number {
532
- height: 28px;
533
- }
534
-
535
- .rm_typography .spinner-wrapper .spinner-button.button-plus {
536
- height: 15px;
537
- background-position: center -10px;
538
- }
539
-
540
- .rm_typography .spinner-wrapper .spinner-button.button-minus {
541
- height: 14px;
542
- }
543
-
544
- .the-metabox .spinner-wrapper .spinner-button {
545
- left: 49px;
546
- }
547
-
548
- .the-metabox.typography .spinner-wrapper .spinner-button {
549
- left: 35px;
550
- }
551
-
552
- /* images */
553
- .the-metabox.images, .the-metabox.images label {
554
- margin-left: 0;
555
- display: block;
556
- }
557
-
558
- .the-metabox.images .slides-wrapper {
559
- clear: both;
560
- }
561
-
562
- .the-metabox.images .slides-wrapper li {
563
- position: relative;
564
- }
565
-
566
- .the-metabox.images a.delete {
567
- display: block;
568
- margin-left: 4px;
569
- text-decoration: none;
570
- font-weight: bold;
571
- color: red;
572
- position: absolute;
573
- top: 0;
574
- right: 0;
575
- width: 10px;
576
- height: 18px;
577
- z-index: 10;
578
- cursor: pointer !important;
579
- }
580
-
581
- /* wp editor */
582
- .wp_themeSkin iframe {
583
- background: #fff !important;
584
- }
585
-
586
- /* custom tabs */
587
- .customtab_item {
588
- border-style: solid;
589
- border-width: 1px;
590
- line-height: 1;
591
- margin-bottom: 20px;
592
- padding: 0;
593
- background-color: #f5f5f5;
594
- background-image: -moz-linear-gradient(center top, #f9f9f9, #f5f5f5);
595
- border-color: #dfdfdf;
596
- border-radius: 3px 3px 3px 3px;
597
- box-shadow: 0 1px 0 #fff inset;
598
- min-width: 255px;
599
- position: relative;
600
- }
601
-
602
- .customtab_item .handlediv {
603
- position: relative;
604
- top: -4px;
605
- }
606
-
607
- .customtab_item h3 {
608
- min-height: 21px
609
- }
610
-
611
- .customtab_item .inside {
612
- padding: 10px !important;
613
- }
614
-
615
- .customtab_item .deps {
616
- display: none;
617
- }
618
-
619
- .customtab_item .addoptions p.option {
620
- margin: 5px 0 5px 200px
621
- }
622
-
623
- .customtab_item .addoptions p label {
624
- width: 80px !important;
625
- }
626
-
627
- .customtab_item .add-field-option {
628
- margin-bottom: 10px !important;
629
- }
630
-
631
- .customtab_item .remove_item {
632
- float: right;
633
- }
634
-
635
- .metabox-sortable-placeholder {
636
- border: 1px dotted #dedede;
637
- margin: 10px 0
638
- }
639
-
640
- .the-metabox.customtabs {
641
- margin-left: 0;
642
- }
643
-
644
- #customtab_item_sample {
645
- display: none;
646
- }
647
-
648
- .the-metabox.customtabs .field-row {
649
- margin-bottom: 10px;
650
- }
651
-
652
- #yit_custom_tabs label {
653
- font-weight: normal;
654
- width: auto;
655
- float: none;
656
- line-height: auto;
657
- margin-left: 0;
658
- }
659
-
660
- .wp-admin p label input[type=radio] {
661
- width: 16px;
662
- margin-right: 10px;
663
- margin-top: 3px;
664
- }
665
-
666
- .wp-admin .form-field._preset_onsale_icon_field label input[type=radio] {
667
- margin-top: 0;
668
- }
669
-
670
- .the-metabox .spinner {
671
- margin-top: 5px;
672
- float: none;
673
- }
674
-
675
- /*sidebars*/
676
- #choose-sidebars.choose {
677
- margin-left: 0px;
678
- }
679
-
680
- #_active_page_options-container label, #_active_page_options-container p {
681
- display: inline-block;
682
- margin: 0px;
683
- }
684
-
685
- #_active_page_options-container label {
686
- margin-right: 10px;
687
- margin-top: 3px;
688
- }
689
-
690
- #_active_page_options-container {
691
- float: right;
692
- margin-right: 20px;
693
- margin-top: 5px;
694
- z-index: 9999 !important;
695
- position: absolute;
696
- right: 0;
697
- }
698
-
699
- /*-----------------------
700
- * Colorpicker - fix issues in combination with third-party themes or plugin (Basel, VC Addons, ...)
701
- */
702
- .metaboxes-tab .the-metabox.colorpicker {
703
- display: block;
704
- width: auto;
705
- height: auto;
706
- overflow: visible;
707
- top: auto;
708
- left: auto;
709
- background: transparent;
710
- position: static;
711
- z-index: 1;
712
- font-family: inherit;
713
- }
714
-
715
- .the-metabox.checkbox.checkboxgroup-start.clearfix {
716
- margin: 40px 0 0 264px;
717
- }
718
-
719
- .the-metabox.checkbox.checkboxgroup.clearfix {
720
- margin: 0 0 0 264px;
721
  }
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 .yith-plugin-fw-radio__row {
91
+ width: 100%;
92
+ min-height: 20px;
93
+ }
94
+
95
+ .metaboxes-tab .yith-plugin-fw-radio__row label,
96
+ .metaboxes-tab .yith-toggle-elements label,
97
+ .metaboxes-tab .yith-add-box label {
98
+ margin-left: 0;
99
+ font-weight: normal;
100
+ }
101
+
102
+ .metaboxes-tab.yith-plugin-ui h3 {
103
+ color: #2a8db0;
104
+ font-size: 15px;
105
+ text-transform: uppercase;
106
+ background-color: #fff;
107
+ padding: 35px 20px;
108
+ margin: 0px 0 0 -4px;
109
+ width: auto;
110
+ background: transparent;
111
+ }
112
+
113
+ .metaboxes-tab.yith-plugin-ui .yith-add-box,
114
+ .metaboxes-tab.yith-plugin-ui .yith-toggle-row {
115
+ width: auto;
116
+ }
117
+
118
+ .metaboxes-tab .wp-picker-container label {
119
+ font-weight: inherit;
120
+ width: auto;
121
+ float: none;
122
+ line-height: inherit;
123
+ margin-left: 0;
124
+ }
125
+
126
+ .metaboxes-tab.yith-plugin-ui .yith-plugin-fw-radio__row label {
127
+ width: auto !important;
128
+ display: inline-block;
129
+ font-weight: normal;
130
+ }
131
+
132
+ .metaboxes-tab input[type="checkbox"] {
133
+ vertical-align: middle
134
+ }
135
+
136
+ .metaboxes-tab input.button-secondary, .metaboxes-tab input.checkbox {
137
+ width: auto;
138
+ }
139
+
140
+ .metaboxes-tab p.field-row.textarea .description {
141
+ vertical-align: top;
142
+ }
143
+
144
+ .metaboxes-tab p.field-row.checkbox {
145
+ background: none;
146
+ }
147
+
148
+ .metaboxes-tab .the-metabox {
149
+ margin: 20px 0;
150
+ margin-left: 184px;
151
+ }
152
+
153
+ .metaboxes-tab .the-metabox.no-label {
154
+ margin: 20px 0;
155
+ margin-left: 0;
156
+ }
157
+
158
+ .metaboxes-tab hr {
159
+ height: 0px;
160
+ border-top: 1px solid #dadada;
161
+ width: auto;
162
+ margin-left: -10px;
163
+ margin-right: -10px;
164
+ }
165
+
166
+ .metaboxes-tab .the-metabox p {
167
+ margin: 0;
168
+ }
169
+
170
+ .metaboxes-tab .the-metabox:last-child {
171
+ border-bottom: 0px;
172
+ }
173
+
174
+ .metaboxes-tab .the-metabox.checkbox {
175
+ background: none;
176
+ }
177
+
178
+ .metaboxes-tab span.description.inline {
179
+ display: inline-block;
180
+ line-height: 23px;
181
+ width: auto;
182
+ vertical-align: middle;
183
+ margin: 0;
184
+ }
185
+
186
+ .metaboxes-tab .slider label {
187
+ padding: 15px 0;
188
+ }
189
+
190
+ /* sortable table posts */
191
+
192
+ #the-list.ui-sortable tr:hover {
193
+ cursor: move;
194
+ }
195
+
196
+ .the-metabox.preview {
197
+ float: none;
198
+ }
199
+
200
+ .metaboxes-tab .the-metabox.no-label.preview {
201
+ margin-left: 184px;
202
+ }
203
+
204
+ .metaboxes-tab .the-metabox.no-label.preview img {
205
+ box-shadow: 0 1px 8px rgba(0, 0, 0, 0.2);
206
+ }
207
+
208
+ /**************************************
209
+ FIELDS
210
+ ***************************************/
211
+
212
+ .metaboxes-tab select,
213
+ .metaboxes-tab input[type=text],
214
+ .metaboxes-tab input[type=number],
215
+ .metaboxes-tab textarea,
216
+ .metaboxes-tab .yith-plugin-fw-select,
217
+ .metaboxes-tab .yith-plugin-fw-slider-container,
218
+ .metaboxes-tab .yith-plugin-fw-text-input,
219
+ .metaboxes-tab .yith-plugin-fw-text-array-table,
220
+ .metaboxes-tab .yith-plugin-fw-textarea {
221
+ width: 400px;
222
+ max-width: 100%;
223
+ }
224
+
225
+ .metaboxes-tab.yith-plugin-ui input[type=number] {
226
+ width: auto;
227
+ min-width: 90px;
228
+ }
229
+
230
+ .metaboxes-tab.yith-plugin-ui p {
231
+ font-size: 14px;
232
+ }
233
+
234
+ .metaboxes-tab.yith-plugin-ui p.section-description {
235
+
236
+ margin: 0 20px 40px 18px;
237
+ }
238
+
239
+ .metaboxes-tab .yith-plugin-fw-text-array-table input[type=text] {
240
+ width: 100%;
241
+ }
242
+
243
+ .metaboxes-tab.yith-plugin-ui .yith-add-box h3 {
244
+ padding: 0 0 30px 0;
245
+ font-weight: 600;
246
+ margin: 0;
247
+ }
248
+
249
+ .metaboxes-tab.yith-plugin-ui .select2-container--default .select2-selection--single {
250
+ border: 0;
251
+ margin: 0;
252
+ }
253
+
254
+ /* wp editor */
255
+ .the-metabox.textarea-editor .mceIframeContainer {
256
+ background: #fff;
257
+ }
258
+
259
+
260
+ .the-metabox.textarea-editor label {
261
+ margin-top: 24px;
262
+ }
263
+
264
+ /* categories */
265
+ .categories-panel {
266
+ width: 30%;
267
+ float: left;
268
+ margin-right: 4px;
269
+ }
270
+
271
+ .categories-panel .box {
272
+ height: 200px;
273
+ border: 1px solid #dfdfdf;
274
+ background: #fff;
275
+ padding: 6px 10px;
276
+ overflow: auto;
277
+ }
278
+
279
+ .categories-panel ul {
280
+ list-style: none;
281
+ margin: 0;
282
+ }
283
+
284
+ .categories-panel ul li {
285
+ line-height: 19px;
286
+ margin: 0;
287
+ padding: 0;
288
+ word-wrap: break-word;
289
+ }
290
+
291
+ .categories-panel ul li label {
292
+ font-weight: normal !important;
293
+ margin-left: 0 !important;
294
+ }
295
+
296
+ .categories-panel input.newcategory {
297
+ width: 100%;
298
+ margin-bottom: 3px;
299
+ }
300
+
301
+ /* contact form */
302
+ .contactform_item {
303
+ border-style: solid;
304
+ border-width: 1px;
305
+ line-height: 1;
306
+ margin-bottom: 20px;
307
+ padding: 0;
308
+ background-color: #f5f5f5;
309
+ background-image: -moz-linear-gradient(center top, #f9f9f9, #f5f5f5);
310
+ border-color: #dfdfdf;
311
+ border-radius: 3px 3px 3px 3px;
312
+ box-shadow: 0 1px 0 #fff inset;
313
+ min-width: 255px;
314
+ position: relative;
315
+ }
316
+
317
+ .contactform_item .handlediv {
318
+ position: relative;
319
+ top: -4px;
320
+ }
321
+
322
+ .contactform_item h3 {
323
+ min-height: 21px;
324
+ margin: 13px;
325
+ }
326
+
327
+ .contactform_item .inside {
328
+ padding: 10px !important;
329
+ }
330
+
331
+ .contactform_item .deps {
332
+ display: none;
333
+ }
334
+
335
+ .contactform_item .addoptions p.option {
336
+ margin: 5px 0 5px 200px
337
+ }
338
+
339
+ .contactform_item .addoptions p label {
340
+ width: 80px !important;
341
+ }
342
+
343
+ .contactform_item .add-field-option {
344
+ margin-bottom: 10px !important;
345
+ }
346
+
347
+ .remove_item {
348
+ float: right;
349
+ }
350
+
351
+ .metabox-sortable-placeholder {
352
+ border: 1px dotted #dedede;
353
+ margin: 10px 0
354
+ }
355
+
356
+ /* features tab */
357
+ .featurestab_item {
358
+ border-style: solid;
359
+ border-width: 1px;
360
+ line-height: 1;
361
+ margin-bottom: 20px;
362
+ padding: 0;
363
+ background-color: #f5f5f5;
364
+ background-image: -moz-linear-gradient(center top, #f9f9f9, #f5f5f5);
365
+ border-color: #dfdfdf;
366
+ border-radius: 3px 3px 3px 3px;
367
+ box-shadow: 0 1px 0 #fff inset;
368
+ min-width: 255px;
369
+ position: relative;
370
+ }
371
+
372
+ .featurestab_item .handlediv {
373
+ position: relative;
374
+ top: -4px;
375
+ }
376
+
377
+ .featurestab_item h3 {
378
+ min-height: 21px
379
+ }
380
+
381
+ .featurestab_item .inside {
382
+ padding: 10px !important;
383
+ }
384
+
385
+ .featurestab_item .deps {
386
+ display: none;
387
+ }
388
+
389
+ .featurestab_item .addoptions p.option {
390
+ margin: 5px 0 5px 200px
391
+ }
392
+
393
+ .featurestab_item .addoptions p label {
394
+ width: 80px !important;
395
+ }
396
+
397
+ .featurestab_item .add-field-option {
398
+ margin-bottom: 10px !important;
399
+ }
400
+
401
+ .messages-panel.updated {
402
+ margin: 10px 0px 10px !important;
403
+ max-width: 1200px;
404
+ border-radius: 5px;
405
+ -webkit-box-sizing: border-box;
406
+ box-sizing: border-box;
407
+ }
408
+
409
+ .ui-widget-overlay {
410
+ background-image: none !important;
411
+ }
412
+
413
+ .the-metabox .icon_type {
414
+ width: 30%;
415
+ float: left;
416
+ margin-right: 40px
417
+ }
418
+
419
+ #post-type-settings .category-list label {
420
+ width: 187px;
421
+ }
422
+
423
+ .remove_cat {
424
+ float: right;
425
+ text-align: center;
426
+ display: block;
427
+ width: 20px;
428
+ height: 20px;
429
+ border-radius: 20px;
430
+ font-weight: bold;
431
+ font-size: 10px;
432
+ background: #efefef;
433
+ text-decoration: none;
434
+ }
435
+
436
+ /* typography */
437
+ .the-metabox.typography .select_wrapper.font-family {
438
+ width: 200px;
439
+ }
440
+
441
+ .the-metabox.typography .spinner_container {
442
+ float: left;
443
+ margin-right: 10px;
444
+ }
445
+
446
+ .the-metabox.typography .spinner_container input.number {
447
+ width: 50px !important;
448
+ -webkit-border-top-right-radius: 0px;
449
+ -webkit-border-bottom-right-radius: 0px;
450
+ -moz-border-radius-topright: 0px;
451
+ -moz-border-radius-bottomright: 0px;
452
+ border-top-right-radius: 0px;
453
+ border-bottom-right-radius: 0px;
454
+ }
455
+
456
+ /* number */
457
+ .the-metabox.number input.number {
458
+ width: 50px !important;
459
+ }
460
+
461
+ /* number */
462
+ .rm_number .number {
463
+ width: 70px;
464
+ text-align: right;
465
+ -webkit-border-top-right-radius: 0px;
466
+ -webkit-border-bottom-right-radius: 0px;
467
+ -moz-border-radius-topright: 0px;
468
+ -moz-border-radius-bottomright: 0px;
469
+ border-top-right-radius: 0px;
470
+ border-bottom-right-radius: 0px;
471
+ }
472
+
473
+ .spinner-wrapper {
474
+ position: relative;
475
+ height: 23px;
476
+ overflow: hidden;
477
+ }
478
+
479
+ .spinner-wrapper input.number {
480
+ float: left;
481
+ }
482
+
483
+ .spinner-wrapper .spinner-button {
484
+ cursor: pointer;
485
+ float: left;
486
+ position: absolute;
487
+ left: 69px;
488
+ width: 15px;
489
+ height: 12px;
490
+ border: 1px solid #dfdfdf;
491
+ background: #fff;
492
+ margin: 0;
493
+ padding: 0;
494
+ line-height: 9999px;
495
+ overflow: hidden;
496
+ background: url('../images/spinner.png') no-repeat center -11px
497
+ }
498
+
499
+ .spinner-wrapper .spinner-button.button-plus {
500
+ top: 0;
501
+ -webkit-border-top-right-radius: 3px !important;
502
+ -moz-border-radius-topright: 3px !important;
503
+ border-top-right-radius: 3px !important;
504
+ }
505
+
506
+ .spinner-wrapper .spinner-button.button-minus {
507
+ bottom: 0;
508
+ background-position: center -30px;
509
+ -webkit-border-bottom-right-radius: 3px !important;
510
+ -moz-border-radius-bottomright: 3px !important;
511
+ border-bottom-right-radius: 3px !important;
512
+ }
513
+
514
+ .spinner-wrapper .spinner-button.button-plus:active {
515
+ background-position: center 0px;
516
+ }
517
+
518
+ .spinner-wrapper .spinner-button.button-minus:active {
519
+ background-position: center -20px;
520
+ }
521
+
522
+ .rm_typography .spinner_container {
523
+ float: left;
524
+ margin-right: 10px;
525
+ }
526
+
527
+ .rm_typography .spinner-wrapper {
528
+ height: 28px;
529
+ }
530
+
531
+ .rm_typography .spinner-wrapper input.number {
532
+ height: 28px;
533
+ }
534
+
535
+ .rm_typography .spinner-wrapper .spinner-button.button-plus {
536
+ height: 15px;
537
+ background-position: center -10px;
538
+ }
539
+
540
+ .rm_typography .spinner-wrapper .spinner-button.button-minus {
541
+ height: 14px;
542
+ }
543
+
544
+ .the-metabox .spinner-wrapper .spinner-button {
545
+ left: 49px;
546
+ }
547
+
548
+ .the-metabox.typography .spinner-wrapper .spinner-button {
549
+ left: 35px;
550
+ }
551
+
552
+ /* images */
553
+ .the-metabox.images, .the-metabox.images label {
554
+ margin-left: 0;
555
+ display: block;
556
+ }
557
+
558
+ .the-metabox.images .slides-wrapper {
559
+ clear: both;
560
+ }
561
+
562
+ .the-metabox.images .slides-wrapper li {
563
+ position: relative;
564
+ }
565
+
566
+ .the-metabox.images a.delete {
567
+ display: block;
568
+ margin-left: 4px;
569
+ text-decoration: none;
570
+ font-weight: bold;
571
+ color: red;
572
+ position: absolute;
573
+ top: 0;
574
+ right: 0;
575
+ width: 10px;
576
+ height: 18px;
577
+ z-index: 10;
578
+ cursor: pointer !important;
579
+ }
580
+
581
+ /* wp editor */
582
+ .wp_themeSkin iframe {
583
+ background: #fff !important;
584
+ }
585
+
586
+ /* custom tabs */
587
+ .customtab_item {
588
+ border-style: solid;
589
+ border-width: 1px;
590
+ line-height: 1;
591
+ margin-bottom: 20px;
592
+ padding: 0;
593
+ background-color: #f5f5f5;
594
+ background-image: -moz-linear-gradient(center top, #f9f9f9, #f5f5f5);
595
+ border-color: #dfdfdf;
596
+ border-radius: 3px 3px 3px 3px;
597
+ box-shadow: 0 1px 0 #fff inset;
598
+ min-width: 255px;
599
+ position: relative;
600
+ }
601
+
602
+ .customtab_item .handlediv {
603
+ position: relative;
604
+ top: -4px;
605
+ }
606
+
607
+ .customtab_item h3 {
608
+ min-height: 21px
609
+ }
610
+
611
+ .customtab_item .inside {
612
+ padding: 10px !important;
613
+ }
614
+
615
+ .customtab_item .deps {
616
+ display: none;
617
+ }
618
+
619
+ .customtab_item .addoptions p.option {
620
+ margin: 5px 0 5px 200px
621
+ }
622
+
623
+ .customtab_item .addoptions p label {
624
+ width: 80px !important;
625
+ }
626
+
627
+ .customtab_item .add-field-option {
628
+ margin-bottom: 10px !important;
629
+ }
630
+
631
+ .customtab_item .remove_item {
632
+ float: right;
633
+ }
634
+
635
+ .metabox-sortable-placeholder {
636
+ border: 1px dotted #dedede;
637
+ margin: 10px 0
638
+ }
639
+
640
+ .the-metabox.customtabs {
641
+ margin-left: 0;
642
+ }
643
+
644
+ #customtab_item_sample {
645
+ display: none;
646
+ }
647
+
648
+ .the-metabox.customtabs .field-row {
649
+ margin-bottom: 10px;
650
+ }
651
+
652
+ #yit_custom_tabs label {
653
+ font-weight: normal;
654
+ width: auto;
655
+ float: none;
656
+ line-height: auto;
657
+ margin-left: 0;
658
+ }
659
+
660
+ .wp-admin p label input[type=radio] {
661
+ width: 16px;
662
+ margin-right: 10px;
663
+ margin-top: 3px;
664
+ }
665
+
666
+ .wp-admin .form-field._preset_onsale_icon_field label input[type=radio] {
667
+ margin-top: 0;
668
+ }
669
+
670
+ .the-metabox .spinner {
671
+ margin-top: 5px;
672
+ float: none;
673
+ }
674
+
675
+ /*sidebars*/
676
+ #choose-sidebars.choose {
677
+ margin-left: 0px;
678
+ }
679
+
680
+ #_active_page_options-container label, #_active_page_options-container p {
681
+ display: inline-block;
682
+ margin: 0px;
683
+ }
684
+
685
+ #_active_page_options-container label {
686
+ margin-right: 10px;
687
+ margin-top: 3px;
688
+ }
689
+
690
+ #_active_page_options-container {
691
+ float: right;
692
+ margin-right: 20px;
693
+ margin-top: 5px;
694
+ z-index: 9999 !important;
695
+ position: absolute;
696
+ right: 0;
697
+ }
698
+
699
+ /*-----------------------
700
+ * Colorpicker - fix issues in combination with third-party themes or plugin (Basel, VC Addons, ...)
701
+ */
702
+ .metaboxes-tab .the-metabox.colorpicker {
703
+ display: block;
704
+ width: auto;
705
+ height: auto;
706
+ overflow: visible;
707
+ top: auto;
708
+ left: auto;
709
+ background: transparent;
710
+ position: static;
711
+ z-index: 1;
712
+ font-family: inherit;
713
+ }
714
+
715
+ .the-metabox.checkbox.checkboxgroup-start.clearfix {
716
+ margin: 40px 0 0 264px;
717
+ }
718
+
719
+ .the-metabox.checkbox.checkboxgroup.clearfix {
720
+ margin: 0 0 0 264px;
721
  }
plugin-fw/assets/css/yit-plugin-panel.css CHANGED
@@ -1,482 +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 #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
- }
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,22 +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
- }
19
-
20
- .yith-updating:before{
21
- animation: rotation 2s infinite linear;
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
+ }
19
+
20
+ .yith-updating:before{
21
+ animation: rotation 2s infinite linear;
22
  }
plugin-fw/assets/css/yith-fields.css CHANGED
@@ -1,2114 +1,2157 @@
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
- .yith-plugin-ui input[type=password],
45
- .woocommerce .yith-plugin-fw table.form-table input[type=text]:not(.select2-search__field),
46
- .woocommerce .yith-plugin-fw table.form-table select {
47
- width: 400px;
48
- max-width: 100%;
49
- height: 30px;
50
- padding: 5px;
51
- }
52
-
53
- .woocommerce .yith-plugin-fw table.form-table input[type=text].wp-color-picker,
54
- .woocommerce .yith-plugin-fw table.form-table input[type=text].yith-plugin-fw-colorpicker,
55
- .yith-plugin-fw input[type=text].wp-color-picker,
56
- .yith-plugin-fw input[type=text].yith-plugin-fw-colorpicker {
57
- width: 6em;
58
- max-width: none;
59
- height: auto;
60
- padding: 3px 5px;
61
- }
62
-
63
- .woocommerce .yith-plugin-fw table.form-table input[type=text].colorpick,
64
- .yith-plugin-fw input[type=text].colorpick {
65
- width: 6em;
66
- max-width: none;
67
- height: auto;
68
- padding: 6px;
69
- }
70
-
71
- .yith-plugin-fw input.select2-search__field,
72
- .yith-plugin-fw .select2-container .select2-search--inline .select2-search__field,
73
- .woocommerce .yith-plugin-fw input.select2-search__field,
74
- .woocommerce .yith-plugin-fw table.form-table input.select2-search__field {
75
- padding: 3px;
76
- }
77
-
78
- .yith-plugin-fw .select2-container .select2-selection--single .select2-selection__rendered {
79
- line-height: 27px;
80
- }
81
-
82
- .yith-plugin-fw textarea {
83
- width: 400px;
84
- max-width: 100%;
85
- padding: 5px;
86
- }
87
-
88
- /* ------------- ICONS ------------- */
89
- .yit-icons-manager-wrapper {
90
- width: 100%;
91
- max-width: 400px;
92
- }
93
-
94
- .yit-icons-manager-text {
95
- width: 100%;
96
- }
97
-
98
- .yit-icons-manager-icon-text {
99
- width: calc(100% - 35px) !important;
100
- height: 30px;
101
- float: left;
102
- margin: 0;
103
- }
104
-
105
- .yit-icons-manager-icon-preview {
106
- width: 30px;
107
- height: 30px;
108
- margin-right: 5px;
109
- float: left;
110
- padding-top: 6px;
111
- box-sizing: border-box;
112
- text-align: center;
113
- background: #f1f1f1;
114
- }
115
-
116
- .yit-icons-manager-list-wrapper {
117
- margin: 10px 0;
118
- box-shadow: 0 0 0 1px #ddd;
119
- }
120
-
121
- ul.yit-icons-manager-list {
122
- width: 100%;
123
- height: 300px;
124
- overflow-y: scroll;
125
- margin: 0;
126
- }
127
-
128
- ul.yit-icons-manager-list li {
129
- float: left;
130
- width: 30px;
131
- height: 30px;
132
- padding-top: 6px;
133
- box-sizing: border-box;
134
- text-align: center;
135
- background: #f1f1f1;
136
- margin: 1px;
137
- cursor: pointer;
138
- }
139
-
140
- ul.yit-icons-manager-list li:hover {
141
- background: #c5dcf6;
142
- }
143
-
144
- ul.yit-icons-manager-list li.active {
145
- background: #d4f0ff;
146
- }
147
-
148
- .yit-icons-manager-action-set-default {
149
- margin-bottom: 0;
150
- }
151
-
152
- .yit-icons-manager-default-icon-preview {
153
- height: 100%;
154
- display: inline-block;
155
- padding-left: 10px;
156
- border-left: 1px solid #ccc;
157
- margin-left: 10px;
158
- }
159
-
160
- /* ------- Text Array ------- */
161
- .yith-plugin-fw-text-array-table td {
162
- padding: 1px;
163
- }
164
-
165
- .yith-plugin-fw-text-array-table input[type=text],
166
- .woocommerce table.form-table table.yith-plugin-fw-text-array-table input[type=text] {
167
- width: 100%;
168
- }
169
-
170
- /* ------- Image Gallery ------- */
171
- .yith-plugin-fw .image-gallery ul li {
172
- display: inline-block;
173
- width: 80px;
174
- margin-left: 10px;
175
- position: relative;
176
- }
177
-
178
- .yith-plugin-fw .image-gallery ul li img {
179
- width: 80px;
180
- border: 1px solid #ccc;
181
- }
182
-
183
- .yith-plugin-fw .image-gallery ul li ul {
184
- position: absolute;
185
- top: -6px;
186
- right: -1px;
187
- width: 20px;
188
- height: 20px;
189
- }
190
-
191
- .yith-plugin-fw .image-gallery ul a.delete {
192
- background: url(../images/x.png) no-repeat;
193
- width: 20px;
194
- height: 20px;
195
- display: block;
196
- text-indent: -99999px;
197
- }
198
-
199
- /* ------- OnOff ------- */
200
- .yith-plugin-fw-onoff-container {
201
- display: inline-block;
202
- }
203
-
204
- .yith-plugin-fw-onoff-container input {
205
- display: none;
206
- }
207
-
208
- .yith-plugin-fw-onoff-container input + span {
209
- cursor: pointer;
210
- text-indent: -9999px;
211
- display: block;
212
- width: 36px;
213
- line-height: 1;
214
- height: 20px;
215
- background: #a4a4a4;
216
- border-radius: 24px;
217
- position: relative;
218
- transition: all 0.3s;
219
- }
220
-
221
-
222
- .yith-plugin-fw-onoff-container input + span:before {
223
- content: '';
224
- background: #fff;
225
- width: 16px;
226
- height: 16px;
227
- border-radius: 50%;
228
- position: absolute;
229
- top: 2px;
230
- left: 2px;
231
- transition: all 0.3s;
232
- }
233
-
234
- .yith-plugin-fw-onoff-container input:checked + span,
235
- .yith-plugin-fw-onoff-container input.onoffchecked + span {
236
- background: #0073aa;
237
- }
238
-
239
- .yith-plugin-fw-onoff-container input:checked + span:before,
240
- .yith-plugin-fw-onoff-container input.onoffchecked + span:before {
241
- left: 18px;
242
- }
243
-
244
- /* ------- Preview ------- */
245
- .yith-plugin-fw-preview-field {
246
- max-height: 200px;
247
- }
248
-
249
- /* ------- Radio ------- */
250
- .yith-plugin-fw-radio input[type=radio] {
251
- margin: 0 3px 0 0;
252
- }
253
-
254
- .yith-plugin-fw-radio__row {
255
- margin-bottom: 8px;
256
- }
257
-
258
- /* ------- Sidebar Layout ------- */
259
- .yith-plugin-fw-sidebar-layout input[type="radio"] {
260
- display: none;
261
- width: 0px;
262
- }
263
-
264
- .yith-plugin-fw-sidebar-layout input[type="radio"]:first-child {
265
- margin-right: -2px;
266
- }
267
-
268
- .yith-plugin-fw-sidebar-layout input[type="radio"] + img {
269
- border: 2px solid #fff;
270
- padding: 1px;
271
- }
272
-
273
- .yith-plugin-fw-sidebar-layout input[type="radio"] + img:hover {
274
- cursor: pointer;
275
- }
276
-
277
- .yith-plugin-fw-sidebar-layout input[checked] + img {
278
- border: 2px solid #f2ad35;
279
- padding: 1px;
280
- }
281
-
282
- .yith-plugin-fw-sidebar-layout select {
283
- vertical-align: 12px;
284
- }
285
-
286
- .yit-admin-panel-content-wrap .yith-plugin-fw-sidebar-layout label {
287
- font-weight: bold;
288
- width: 200px;
289
- float: left;
290
- line-height: 23px;
291
- margin-left: -230px;
292
- }
293
-
294
- /* ------- Slider ------- */
295
- .yith-plugin-fw .slider {
296
- padding-top: 20px;
297
- }
298
-
299
- .ui-slider .minCaption {
300
- position: absolute;
301
- right: 95%;
302
- top: -6px;
303
- margin-right: 11px;
304
- }
305
-
306
- .ui-slider .maxCaption {
307
- position: absolute;
308
- left: 95%;
309
- top: -6px;
310
- margin-left: 20px;
311
- }
312
-
313
- .ui-slider-horizontal .ui-slider-handle {
314
- background: #fff;
315
- border: 0px !important;
316
- top: -12px !important;
317
- border-radius: 50%;
318
- width: 27px !important;
319
- height: 27px !important;
320
- box-sizing: border-box;
321
- box-shadow: 0 1px 7px -1px rgba(0, 0, 0, 0.5);
322
- font-size: 13px;
323
- padding: 6px 0;
324
- font-weight: 600;
325
- color: #555;
326
- text-align: center;
327
- }
328
-
329
- .ui-slider.ui-widget-content {
330
- background: #ccc;
331
- border: none !important;
332
- height: 3px !important;
333
- border-radius: 3px !important;
334
- width: 90%;
335
- margin: 15px 5% 20px 5%;
336
- }
337
-
338
- .iris-slider-offset.ui-slider.ui-widget-content {
339
- background: transparent !important;
340
- height: auto !important;
341
- }
342
-
343
- .ui-slider.ui-widget-content .ui-widget-header {
344
- background: #4b93ff;
345
- left: 0px !important;
346
- -webkit-border-radius: 3px;
347
- -moz-border-radius: 3px;
348
- -khtml-border-radius: 3px;
349
- border-radius: 3px;
350
- }
351
-
352
- /* ------- Select2 ------- */
353
- .yith-plugin-fw-select2-wrapper {
354
- width: 400px;
355
- }
356
-
357
- /* ------- Textarea ------- */
358
- .yith-plugin-fw-textarea-editor-field-wrapper {
359
- max-width: 1000px;
360
- clear: both;
361
- }
362
-
363
- .yith-plugin-fw-textarea-editor-field-wrapper textarea.wp-editor-area,
364
- .woocommerce table.form-table .yith-plugin-fw-textarea-editor-field-wrapper textarea.wp-editor-area {
365
- width: 100%;
366
- }
367
-
368
- /* ------- Buttons ------- */
369
- .yith-plugin-fw-buttons-field-wrapper {
370
- margin-top: 7px;
371
- }
372
-
373
- /* ------- Select Images ------- */
374
- .yith-plugin-fw-select-images__list {
375
- margin: 0;
376
- display: flex;
377
- flex-wrap: wrap;
378
- }
379
-
380
- .yith-plugin-fw-select-images__item {
381
- width: calc(20% - 10px);
382
- min-width: 150px;
383
- margin: 0 10px 10px 0;
384
- padding: 10px;
385
- box-sizing: border-box;
386
- cursor: pointer;
387
- transition: all .3s;
388
- border: 2px solid #eee;
389
- display: flex;
390
- flex-direction: column;
391
- justify-content: space-between;
392
- }
393
-
394
- .yith-plugin-fw-select-images__item:hover,
395
- .yith-plugin-fw-select-images__item.yith-plugin-fw-select-images__item--selected {
396
- border-color: #07bcce;
397
- }
398
-
399
- .yith-plugin-fw-select-images__item__label {
400
- text-align: center;
401
- font-weight: 600;
402
- margin-bottom: 10px;
403
- }
404
-
405
- .yith-plugin-fw-select-images__item img {
406
- display: block;
407
- max-width: 100%;
408
- margin: 0 auto;
409
- }
410
-
411
- /****************
412
- YITH UI
413
- ****************/
414
- @font-face {
415
- font-family: 'yith-icon';
416
- src: url('../fonts/yith-icon.eot?7ik896');
417
- src: url('../fonts/yith-icon.eot?7ik896#iefix') format('embedded-opentype'),
418
- url('../fonts/yith-icon.ttf?7ik896') format('truetype'),
419
- url('../fonts/yith-icon.woff?7ik896') format('woff'),
420
- url('../fonts/yith-icon.svg?7ik896#yith-icon') format('svg');
421
- font-weight: normal;
422
- font-style: normal;
423
- }
424
-
425
- [class^="icon-"], [class*=" icon-"][class^="yith-icon-"], [class*=" yith-icon-"] {
426
- /* use !important to prevent issues with browser extensions that change fonts */
427
- font-family: 'yith-icon' !important;
428
- speak: none;
429
- font-style: normal;
430
- font-weight: normal;
431
- font-variant: normal;
432
- text-transform: none;
433
- line-height: 1;
434
-
435
- /* Better Font Rendering =========== */
436
- -webkit-font-smoothing: antialiased;
437
- -moz-osx-font-smoothing: grayscale;
438
- }
439
-
440
- .yith-icon-calendar_add:before {
441
- content: "\e913";
442
- color: #757575;
443
- }
444
-
445
- .yith-icon-calendar_money:before {
446
- content: "\e914";
447
- color: #757575;
448
- }
449
-
450
- .yith-icon-calendar2:before {
451
- content: "\e915";
452
- color: #757575;
453
- }
454
-
455
- .yith-icon-people:before {
456
- content: "\e916";
457
- color: #757575;
458
- }
459
-
460
- .yith-icon-shield_money:before {
461
- content: "\e917";
462
- color: #757575;
463
- }
464
-
465
- .yith-icon-time_check:before {
466
- content: "\e918";
467
- color: #757575;
468
- }
469
-
470
- .yith-icon-world_settings:before {
471
- content: "\e919";
472
- color: #757575;
473
- }
474
-
475
- .yith-icon-arrow_eye_closed:before {
476
- content: "\e912";
477
- color: #757575;
478
- }
479
-
480
- .yith-icon-arrow_eye:before {
481
- content: "\e911";
482
- color: #757575;
483
- }
484
-
485
- .yith-icon-reset:before {
486
- content: "\e910";
487
- color: #757575;
488
- }
489
-
490
- .yith-icon-drag:before {
491
- content: "\e90f";
492
- color: #757575;
493
- }
494
-
495
- .yith-icon-trash:before {
496
- content: "\e90d";
497
- color: #757575;
498
- }
499
-
500
- .yith-icon-info:before {
501
- content: "\e90e";
502
- color: #757575;
503
- }
504
-
505
- .yith-icon-arrow_down:before {
506
- content: "\e900";
507
- color: #757575;
508
- }
509
-
510
- .yith-icon-arrow_left:before {
511
- content: "\e901";
512
- color: #757575;
513
- }
514
-
515
- .yith-icon-arrow_right:before {
516
- content: "\e902";
517
- color: #757575;
518
- }
519
-
520
- .yith-icon-arrow_up:before {
521
- content: "\e903";
522
- color: #757575;
523
- }
524
-
525
- .yith-icon-calendar:before {
526
- content: "\e904";
527
- color: #757575;
528
- }
529
-
530
- .yith-icon-check:before {
531
- content: "\e905";
532
- color: #757575;
533
- }
534
-
535
- .yith-icon-close:before {
536
- content: "\e906";
537
- color: #757575;
538
- }
539
-
540
- .yith-icon-edit:before {
541
- content: "\e907";
542
- color: #757575;
543
- }
544
-
545
- .yith-icon-magnifier:before {
546
- content: "\e908";
547
- color: #757575;
548
- }
549
-
550
- .yith-icon-pencil:before {
551
- content: "\e909";
552
- color: #757575;
553
- }
554
-
555
- .yith-icon-plus:before {
556
- content: "\e90a";
557
- color: #757575;
558
- }
559
-
560
- .yith-icon-update:before {
561
- content: "\e90b";
562
- color: #757575;
563
- }
564
-
565
- .yith-icon-upload:before {
566
- content: "\e90c";
567
- color: #757575;
568
- }
569
-
570
- .yith-plugin-fw-banner {
571
- width: 100%;
572
- height: 75px;
573
- background: url('../images/banner-premium.png');
574
- }
575
-
576
- .yith-plugin-fw-banner.yith-plugin-fw-banner-free {
577
- height: 290px;
578
- background: url('../images/banner-free.png') no-repeat;
579
- }
580
-
581
- .yith-plugin-fw-banner.yith-plugin-fw-banner-free h1 {
582
- max-width: auto;
583
- text-align: left;
584
- margin-left: 110px;
585
- padding-top: 15px;
586
- padding-bottom: 8px;
587
- }
588
-
589
- .yith-plugin-fw-banner h1 {
590
- text-transform: uppercase;
591
- color: #0c5777;
592
- font-size: 15px;
593
- padding-left: 150px;
594
- font-weight: 700;
595
- text-align: left;
596
- display: inline-block;
597
- box-sizing: border-box;
598
- }
599
-
600
- .yith-plugin-fw-banner span {
601
- font-style: italic;
602
- display: block;
603
- font-size: 15px;
604
- color: #214249;
605
- text-transform: none;
606
- text-align: right;
607
- }
608
-
609
- .yith-plugin-fw-banner a,
610
- .yith-plugin-fw-banner a:focus {
611
- text-decoration: none;
612
- outline: none;
613
- box-shadow: none;
614
- }
615
-
616
- .yith-banners ul {
617
- list-style: none;
618
- margin-left: 10px;
619
- }
620
-
621
- .yith-banners ul li {
622
- display: inline-block;
623
- margin-left: 10px;
624
- }
625
-
626
- .yith-plugin-ui a {
627
- outline: none;
628
- box-shadow: none;
629
- }
630
-
631
- .yith-plugin-ui {
632
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
633
- }
634
-
635
- .yith-plugin-ui #wpwrap h2.nav-tab-wrapper, .yith-plugin-ui #wpbody-content h2.nav-tab-wrapper {
636
- margin-top: 10px;
637
- }
638
-
639
- .yith-plugin-ui .nav-tab {
640
- margin-left: 0px;
641
- margin-right: 2px;
642
- background-color: #336374;
643
- color: #fff;
644
- font-size: 15px;
645
- padding: 7px 20px;
646
- border: 0;
647
- }
648
-
649
- .yith-plugin-ui .nav-tab:first-child {
650
- border-left: 1px solid #d9d9d9;
651
- }
652
-
653
- .yith-plugin-ui .nav-tab.yith-premium {
654
- background-color: #be421c;
655
- }
656
-
657
- .yith-plugin-ui .nav-tab-active {
658
- background-color: #fff;
659
- color: #336374;
660
- border-bottom: 1px solid #fff;
661
- }
662
-
663
- .yith-plugin-ui .nav-tab-active.yith-premium {
664
- background-color: #fff;
665
- color: #be421c;
666
- }
667
-
668
- .yith-plugin-ui #plugin-fw-wc {
669
- padding-top: 0px;
670
- }
671
-
672
- .yith-plugin-ui .form-table td {
673
- padding: 15px 20px;
674
- }
675
-
676
- .yith-plugin-ui.metaboxes-tab label {
677
- color: #33373b;
678
- font-size: 14px;
679
- margin-left: -248px;
680
- }
681
-
682
- .yith-plugin-ui.metaboxes-tab .the-metabox {
683
- margin: 40px 0 40px 290px;
684
- margin-left: 264px;
685
- }
686
-
687
- .yith-plugin-ui.metaboxes-tab label {
688
- width: 200px;
689
- font-weight: 600;
690
- }
691
-
692
- .yith-plugin-ui span.description {
693
- color: #716269;
694
- font-size: 14px;
695
- font-style: normal;
696
- font-weight: 400;
697
- margin-top: 15px;
698
- margin-left: 0;
699
- }
700
-
701
- #wpwrap .yith-plugin-ui h2.nav-tab-wrapper, #wpbody-content .yith-plugin-ui h2.nav-tab-wrapper {
702
- border: 0;
703
- border-bottom: 1px solid #ccc;
704
- margin-right: 15px;
705
- margin-bottom: 0;
706
- background-color: transparent;
707
- padding-left: 0;
708
- }
709
-
710
- .yith-plugin-ui #plugin-fw-wc table.form-table,
711
- .yith-plugin-ui #yith-plugin-fw-panel table.form-table,
712
- .yith-plugin-ui table.form-table {
713
- border: 1px solid #d8d8d8;
714
- border-top: 0;
715
- margin-bottom: 40px;
716
- }
717
-
718
- .yith-plugin-ui #wpwrap h2.nav-tab-wrapper, .yith-plugin-ui #wpbody-content h2.nav-tab-wrapper {
719
- background-color: transparent;
720
- border: 0;
721
- text-transform: none;
722
- border-bottom: 1px solid #ddd;
723
- }
724
-
725
- .yith-plugin-ui h2 {
726
- color: #2a8db0;
727
- font-size: 15px;
728
- text-transform: uppercase;
729
- border: 1px solid #d8d8d8;
730
- border-bottom: 0;
731
- background-color: #fff;
732
- padding: 35px 20px;
733
- margin: 0px;
734
- }
735
-
736
- .yith-plugin-ui .yith-plugin-fw-custom-tab h2 {
737
- border: 0px solid #d8d8d8;
738
- padding-left: 0;
739
- }
740
-
741
- .yith-plugin-ui #plugin-fw-wc table.form-table th, #yith-plugin-fw-panel table.form-table th.titledesc, .yith-plugin-ui #plugin-fw-wc table.form-table td, #yith-plugin-fw-panel table.form-table td.forminp {
742
- padding: 30px 20px;
743
- }
744
-
745
- .yith-plugin-ui #plugin-fw-wc h2 + div {
746
- background: #fff;
747
- border-left: 1px solid #d9d9d9;
748
- border-right: 1px solid #d9d9d9;
749
- margin: -20px 0 0 0;
750
- padding-left: 20px;
751
- padding-bottom: 5px;
752
- }
753
-
754
- .yith-plugin-ui #plugin-fw-wc h2 + div p, .yith-plugin-ui p.info-box {
755
- background: #f1f1f1;
756
- font-size: 14px;
757
- font-weight: 700;
758
- width: 40%;
759
- display: block;
760
- padding: 15px;
761
- margin-bottom: 0;
762
- }
763
-
764
- .yith-plugin-ui #plugin-fw-wc h2 + div p:before, .yith-plugin-ui p.info-box:before {
765
- content: "\e90e";
766
- font-family: yith-icon;
767
- font-size: 30px;
768
- font-weight: normal;
769
- display: block;
770
- margin-top: -5px;
771
- float: left;
772
- margin-right: 15px;
773
- }
774
-
775
- .yith-plugin-ui h2:first-child {
776
- border-top: 0;
777
- }
778
-
779
- /*** Icon ***/
780
- .yith-plugin-ui span.yith-icon {
781
- margin-left: -36px;
782
- line-height: 36px;
783
- font-size: 20px;
784
- }
785
-
786
- /*** General Input Style ***/
787
-
788
- .yith-plugin-ui .yith-plugin-fw select,
789
- .yith-plugin-ui textarea,
790
- .yith-plugin-ui input[type=number],
791
- .yith-plugin-ui.metaboxes-tab input[type=number],
792
- .yith-plugin-ui input[type=text],
793
- .yith-plugin-ui input[type=text],
794
- .yith-plugin-ui input[type=email],
795
- .yith-plugin-ui input[type=password],
796
- .yith-plugin-ui .search-box input[name="s"],
797
- .yith-plugin-fw.yith-plugin-ui input[type=text]:not(.select2-search__field),
798
- .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table input[type=text]:not(.select2-search__field),
799
- .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table select,
800
- .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table textarea,
801
- .woocommerce .yith-plugin-fw table.form-table input[type=password],
802
- .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table input[type=number],
803
- .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table input[type=text] {
804
- border: 1px solid #d8d8d8;
805
- border-radius: 8px;
806
- padding: 8px 10px;
807
- height: 38px;
808
- min-width: 90px;
809
- box-shadow: none;
810
- color: #716269;
811
- }
812
-
813
- .yith-plugin-ui textarea,
814
- .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table textarea {
815
- height: auto;
816
- }
817
-
818
- .yith-plugin-ui table.form-table input[type=text].wp-color-picker,
819
- .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table input[type=text].wp-color-picker {
820
- border: 0;
821
- height: 30px;
822
- max-width: 60px;
823
-
824
- }
825
-
826
- .yith-plugin-ui .search-box input[name="s"] {
827
- height: 35px;
828
- }
829
-
830
- .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table input[type=text].small-text,
831
- .yith-plugin-ui input[type=text].small-text {
832
- width: 100px;
833
- height: 25px;
834
- border: 1px solid #d9d9d9;
835
- }
836
-
837
- .yith-plugin-ui textarea {
838
- height: auto;
839
- padding: 8px;
840
- }
841
-
842
- .yith-plugin-ui select:focus,
843
- .yith-plugin-ui input:focus {
844
- border-color: #a7d9ec !important;
845
- }
846
-
847
- .woocommerce .yith-plugin-ui table.form-table select,
848
- .yith-plugin-ui select {
849
- -webkit-appearance: none;
850
- line-height: 1.2em;
851
- min-height: 35px;
852
- background: url("../images/arrow_down.svg") no-repeat right center;
853
- background-size: 35px 13px;
854
- border-radius: 8px;
855
- padding-left: 10px;
856
- }
857
-
858
- .yith-plugin-ui .form-table th {
859
- width: 200px;
860
- padding-right: 50px;
861
- }
862
-
863
- /** BUTTONS **/
864
- .wp-core-ui .yith-plugin-ui .button-primary,
865
- .wp-core-ui .yith-plugin-ui .button-secondary,
866
- .yith-plugin-ui .yith-add-button,
867
- .yith-plugin-ui .yith-save-button,
868
- .yith-plugin-ui .yith-edit-button,
869
- .yith-plugin-ui .yith-update-button,
870
- .yith-plugin-ui .yith-plugin-fw-select-all,
871
- .yith-plugin-ui .yith-plugin-fw-deselect-all,
872
- .yith-plugin-ui .yith-plugin-fw-upload-button,
873
- .yith-plugin-ui .yith-plugin-fw-upload-button-reset {
874
- border-radius: 3px;
875
- text-transform: uppercase;
876
- box-shadow: none;
877
- border: 0;
878
- font-weight: 700;
879
- font-size: 11px;
880
- padding: 0px 14px;
881
- outline: none;
882
- height: auto;
883
- transition: all ease 0.3s;
884
- background-color: #d6d6d6;
885
- color: #656565;
886
- text-shadow: none;
887
- vertical-align: middle;
888
- line-height: 26px;
889
- display: inline-block;
890
- text-decoration: none;
891
- cursor: pointer;
892
- }
893
-
894
- .wp-core-ui .yith-plugin-ui .button-secondary.yith-plugin-fw-upload-button-reset,
895
- .wp-core-ui .yith-plugin-ui .button-secondary.yith-plugin-fw-upload-button,
896
- .yith-plugin-ui .yith-plugin-fw-upload-button-reset,
897
- .yith-plugin-ui .button-secondary.yith-plugin-fw-upload-button-reset,
898
- .yith-plugin-ui .button-secondary.yith-plugin-fw-upload-button {
899
- height: 38px;
900
- }
901
-
902
- .wp-core-ui .yith-plugin-ui .button:focus,
903
- .wp-core-ui .yith-plugin-ui .button-primary:focus,
904
- .yith-plugin-ui .yith-add-button:focus,
905
- .yith-plugin-ui .yith-save-button:focus,
906
- .yith-plugin-ui .yith-edit-button:focus,
907
- .yith-plugin-ui .yith-update-button:focus,
908
- .wp-core-ui .yith-plugin-ui .button-secondary:focus {
909
- outline: none;
910
- box-shadow: none;
911
- }
912
-
913
- .wp-core-ui .yith-plugin-ui .button-xl {
914
- padding: 0px 20px;
915
- font-size: 14px;
916
- line-height: 38px;
917
- display: inline-block;
918
- font-weight: 600;
919
- }
920
-
921
- /** button with inside a span with icon class */
922
- .yith-plugin-ui .button-secondary span.yith-icon {
923
- margin-left: 0px;
924
- margin-right: 10px;
925
- line-height: normal;
926
- }
927
-
928
- .yith-plugin-ui .button-secondary span.yith-icon:before {
929
- color: #656565;
930
- font-size: 15px;
931
- }
932
-
933
-
934
- .wp-core-ui .yith-plugin-ui .button:focus,
935
- .wp-core-ui .yith-plugin-ui .button-secondary:focus,
936
- .yith-plugin-ui .yith-save-button:hover,
937
- .wp-core-ui .yith-plugin-ui .button-secondary:hover,
938
- .yith-plugin-ui .yith-plugin-fw-upload-button-reset:hover {
939
- background-color: #cacaca;
940
- color: #515151;
941
- }
942
-
943
- .wp-core-ui .yith-plugin-ui .button-primary,
944
- .yith-plugin-ui .button-secondary.yith-plugin-fw-select-all,
945
- .yith-plugin-ui .button-secondary.yith-plugin-fw-upload-button {
946
- background-color: #007694;
947
- color: #fff;
948
- }
949
-
950
-
951
- .yith-plugin-ui .yith-add-button,
952
- .wp-core-ui .yith-plugin-ui .button-primary:focus,
953
- .wp-core-ui .yith-plugin-ui .button-primary:hover {
954
- background-color: #375f6b;
955
- color: #fff;
956
- cursor: pointer;
957
- }
958
-
959
-
960
- .yith-plugin-ui .yith-add-button:hover,
961
- .wp-core-ui .yith-plugin-ui .yith-plugin-fw-upload-button:focus,
962
- .yith-plugin-ui .button-secondary.yith-plugin-fw-select-all:hover,
963
- .yith-plugin-ui .button-secondary.yith-plugin-fw-select-all:focus,
964
- .yith-plugin-ui .yith-plugin-fw-upload-button:hover {
965
- border-color: #007694;
966
- background: #007694;
967
- color: #fff;
968
- line-height: 26px;
969
- margin-left: 0;
970
- }
971
-
972
- .yith-plugin-ui .button-primary:before,
973
- .yith-plugin-ui .yith-add-button:before,
974
- .yith-plugin-ui .yith-save-button:before,
975
- .yith-plugin-ui .yith-edit-button:before,
976
- .yith-plugin-ui .yith-update-button:before,
977
- .yith-plugin-ui .button-secondary:before {
978
- font-family: 'yith-icon';
979
- font-size: 10px;
980
- font-weight: 700;
981
- margin-right: 10px;
982
- vertical-align: bottom;
983
- display: inline-block;
984
- }
985
-
986
- /** yith-edit-button **/
987
- .yith-plugin-ui .yith-edit-button {
988
- background-color: #7f9298;
989
- color: #fff;
990
- }
991
-
992
- .yith-plugin-ui .yith-edit-button:focus,
993
- .yith-plugin-ui .yith-edit-button:hover {
994
- background-color: #718085;
995
- color: #fff;
996
- }
997
-
998
- .yith-plugin-ui .yith-edit-button:before {
999
- content: "\e907";
1000
- }
1001
-
1002
- /** yith-update-button **/
1003
- .yith-plugin-ui .yith-update-button {
1004
- background-color: #94aa09;
1005
- color: #fff;
1006
- }
1007
-
1008
- .yith-plugin-ui .yith-update-button:focus,
1009
- .yith-plugin-ui .yith-update-button:hover {
1010
- background-color: #7a9009;
1011
- color: #fff;
1012
- }
1013
-
1014
- .yith-plugin-ui .yith-update-button:before {
1015
- content: "\e90b";
1016
- font-size: 15px;
1017
- }
1018
-
1019
- /** yith-save-button **/
1020
-
1021
- .yith-plugin-ui .yith-save-button {
1022
- background-color: #267390;
1023
- color: #fff;
1024
- }
1025
-
1026
- .yith-plugin-ui .yith-save-button:focus,
1027
- .yith-plugin-ui .yith-save-button:hover {
1028
- background-color: #1c4863;
1029
- color: #fff;
1030
- }
1031
-
1032
-
1033
- /** yith-remove-button **/
1034
-
1035
- .yith-plugin-ui .button-secondary.yith-remove-button:before {
1036
- content: "\e90d";
1037
- font-size: 15px;
1038
- }
1039
-
1040
-
1041
- /** yith-add-button **/
1042
- .yith-plugin-ui .yith-add-button:before {
1043
- content: "\e90a";
1044
- }
1045
-
1046
- .yith-plugin-ui .yith-add-button.closed {
1047
- background-color: #fff;
1048
- color: #375f6b;
1049
- border: 1px solid #375f6b;
1050
- }
1051
-
1052
- .yith-plugin-ui .yith-add-button.closed:before {
1053
- content: "\e906";
1054
- }
1055
-
1056
-
1057
- /** yith-plugin-fw-upload-button **/
1058
- .yith-plugin-ui button.yith-plugin-fw-upload-button:before {
1059
- content: "\e90c";
1060
- font-family: 'yith-icon';
1061
- font-size: 19px;
1062
- font-weight: 400;
1063
- margin-right: 10px;
1064
- vertical-align: middle;
1065
- display: inline-block;
1066
- }
1067
-
1068
- /** SELECT 2 **/
1069
- .yith-plugin-ui .select2-container,
1070
- .yith-plugin-ui .select2-selection--single {
1071
- height: auto;
1072
- padding: 2px;
1073
- outline: none;
1074
- }
1075
-
1076
- .yith-plugin-ui .select2-selection--single {
1077
- margin: 0;
1078
- border: 0;
1079
- }
1080
-
1081
- /* old panel*/
1082
-
1083
- .yith-plugin-ui span.select2.select2-container.select2-container--default {
1084
- border: 1px solid #d8d8d8;
1085
- border-radius: 8px;
1086
- }
1087
-
1088
- .yith-plugin-ui span.select2.select2-container.select2-container--default:hover,
1089
- .yith-plugin-ui span.select2.select2-container.select2-container--default:active,
1090
- .yith-plugin-ui span.select2.select2-container.select2-container--default:focus {
1091
- border-color: #a7d9ec;
1092
- }
1093
-
1094
- .yith-plugin-ui .select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
1095
- color: #fff;
1096
- }
1097
-
1098
- .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table input[type=text].select2-search__field,
1099
- .yith-plugin-ui .yith-plugin-fw table.form-table input.select2-search__field {
1100
- border: 0;
1101
- padding: 0;
1102
- height: initial;
1103
- }
1104
-
1105
- .yith-plugin-ui .select2-container--default .select2-selection--multiple .select2-selection__choice,
1106
- .yith-plugin-ui .select2-selection__choice {
1107
- color: #fff;
1108
- background-color: #4e8ba2;
1109
- border-radius: 12px;
1110
- padding: 3px 11px;
1111
- border-color: #33937e;
1112
- font-size: 13px;
1113
- }
1114
-
1115
- .yith-plugin-ui .select2-container--default .select2-selection--single .select2-selection__arrow:before {
1116
- content: "\e900";
1117
- font-family: 'yith-icon' !important;
1118
- line-height: 36px;
1119
- color: #d9d9d9;
1120
- }
1121
-
1122
- .yith-plugin-ui .select2-container--default .select2-selection--single .select2-selection__arrow b {
1123
- display: none;
1124
- }
1125
-
1126
- .yith-plugin-ui .select2-container--open .select2-dropdown--below,
1127
- .yith-plugin-ui .select2-container--open .select2-dropdown--above,
1128
- .yith-plugin-fw-panel .select2-container--open .select2-dropdown--below,
1129
- .yith-plugin-fw-panel .select2-container--open .select2-dropdown--above {
1130
- margin-top: 10px;
1131
- border-radius: 8px;
1132
- box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), 0 2px 10px 0 rgba(0, 0, 0, 0.12) !important;
1133
- }
1134
-
1135
- .yith-plugin-ui .select2-container--open .select2-dropdown--above,
1136
- .yith-plugin-fw-panel .select2-container--open .select2-dropdown--above {
1137
- margin-top: -10px;
1138
- }
1139
-
1140
- .yith-plugin-ui .select2-container--default.select2-container--open.select2-container--below .select2-selection--single,
1141
- .yith-plugin-ui .select2-container--default.select2-container--open.select2-container--above .select2-selection--single,
1142
- .yith-plugin-fw-panel .select2-container--default.select2-container--open.select2-container--below .select2-selection--single,
1143
- .yith-plugin-fw-panel .select2-container--default.select2-container--open.select2-container--above .select2-selection--single {
1144
- border-radius: 8px;
1145
- }
1146
-
1147
- .yith-plugin-ui .select2-results .select2-results__group, .select2-results .select2-results__option:first-child,
1148
- .yith-plugin-fw-panel .select2-results .select2-results__group, .select2-results .select2-results__option:first-child {
1149
- border-top-left-radius: 8px;
1150
- border-top-right-radius: 8px;
1151
- }
1152
-
1153
- .yith-plugin-ui .select2-results .select2-results__group,
1154
- .yith-plugin-ui .select2-results .select2-results__option:last-child,
1155
- .yith-plugin-fw-panel .select2-results .select2-results__group,
1156
- .yith-plugin-fw-panel .select2-results .select2-results__option:last-child {
1157
- border-bottom-left-radius: 8px;
1158
- border-bottom-right-radius: 8px;
1159
- }
1160
-
1161
- .yith-plugin-ui .select2-container--default .select2-results__option[data-selected=true],
1162
- .yith-plugin-ui .select2-container--default .select2-results__option[aria-selected=true],
1163
- .yith-plugin-fw-panel .select2-container--default .select2-results__option[data-selected=true],
1164
- .yith-plugin-fw-panel .select2-container--default .select2-results__option[aria-selected=true] {
1165
- background-color: #fff;
1166
- outline: none;
1167
- }
1168
-
1169
- .yith-plugin-ui .select2-container--default .select2-results__option--highlighted[aria-selected],
1170
- .yith-plugin-ui .select2-container--default .select2-results__option--highlighted[data-selected],
1171
- .yith-plugin-fw-panel .select2-container--default .select2-results__option--highlighted[aria-selected],
1172
- .yith-plugin-fw-panel .select2-container--default .select2-results__option--highlighted[data-selected] {
1173
- background-color: #e8eff1;
1174
- color: #4e8ba2;
1175
- outline: none;
1176
- }
1177
-
1178
- .yith-plugin-ui .select2-container--default .select2-selection--multiple .select2-selection__choice__remove,
1179
- .yith-plugin-fw-panel .select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
1180
- float: right;
1181
- padding-left: 15px;
1182
- text-indent: -9999px;
1183
- }
1184
-
1185
-
1186
- .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:after,
1187
- .woocommerce .yith-plugin-ui .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:after,
1188
- .yith-plugin-ui .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:after {
1189
- float: right;
1190
- color: #fff;
1191
- content: "\e906";
1192
- font-family: 'yith-icon' !important;
1193
- font-size: 9px;
1194
- line-height: 21px;
1195
- text-indent: 0;
1196
- }
1197
-
1198
- .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:after {
1199
- color: #000;
1200
- }
1201
-
1202
- .yith-plugin-ui .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:after
1203
- .yith-plugin-fw-panel .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:after {
1204
- color: #000;
1205
- }
1206
-
1207
- .yith-plugin-ui .select2-container .select2-selection--multiple,
1208
- .yith-plugin-ui .select2-container--default.select2-container--focus .select2-selection--multiple {
1209
- border: 0;
1210
- }
1211
-
1212
- .yith-plugin-fw .select2-search input[type=text] {
1213
- border: 0;
1214
- padding: 0;
1215
- height: auto;
1216
- }
1217
-
1218
- .yith-plugin-ui .yith-plugin-fw-select-field-wrapper span.yith-icon.yith-icon-magnifier,
1219
- .yith-plugin-fw-panel .yith-plugin-fw-select-field-wrapper span.yith-icon.yith-icon-magnifier {
1220
- position: absolute;
1221
- padding-top: 5px;
1222
- }
1223
-
1224
- .yith-plugin-ui input[type=text].select2-search__field {
1225
- border: 0;
1226
- padding: 0;
1227
- height: 30px;
1228
- }
1229
-
1230
- .yith-plugin-ui .select2-container--default .select2-search--dropdown .select2-search__field,
1231
- .yith-plugin-fw-panel .select2-container--default .select2-search--dropdown .select2-search__field {
1232
- border: 1px solid #d9d9d9;
1233
- border-radius: 8px;
1234
- box-shadow: none;
1235
- }
1236
-
1237
- .yith-plugin-ui .select2-dropdown,
1238
- .yith-plugin-fw-panel .select2-dropdown {
1239
- border: 1px solid #d9d9d9;
1240
- }
1241
-
1242
- /** RADIO BUTTON **/
1243
- .yith-plugin-ui [type="radio"]:checked,
1244
- .yith-plugin-ui [type="radio"]:not(:checked) {
1245
- position: absolute;
1246
- left: -9999px;
1247
- }
1248
-
1249
- .yith-plugin-ui [type="radio"]:checked + label,
1250
- .yith-plugin-ui [type="radio"]:not(:checked) + label {
1251
- position: relative;
1252
- padding-left: 35px;
1253
- cursor: pointer;
1254
- line-height: 20px;
1255
- display: inline-block;
1256
- color: #716269;
1257
- font-size: 14px;
1258
- }
1259
-
1260
- .yith-plugin-ui [type="radio"]:checked + label:before,
1261
- .yith-plugin-ui [type="radio"]:not(:checked) + label:before {
1262
- content: '';
1263
- position: absolute;
1264
- left: 0;
1265
- top: 0;
1266
- width: 19px;
1267
- height: 19px;
1268
- border: 1px solid #d8d8d8;
1269
- border-radius: 100%;
1270
- background: #fff;
1271
- }
1272
-
1273
- .yith-plugin-ui [type="radio"]:checked + label:after,
1274
- .yith-plugin-ui [type="radio"]:not(:checked) + label:after {
1275
- content: '';
1276
- width: 13px;
1277
- height: 13px;
1278
- background: #4e8ba2;
1279
- position: absolute;
1280
- top: 4px;
1281
- left: 4px;
1282
- border-radius: 100%;
1283
- -webkit-transition: all 0.2s ease;
1284
- transition: all 0.2s ease;
1285
- }
1286
-
1287
- .yith-plugin-ui [type="radio"]:not(:checked) + label:after {
1288
- opacity: 0;
1289
- -webkit-transform: scale(0);
1290
- transform: scale(0);
1291
- }
1292
-
1293
- .yith-plugin-ui [type="radio"]:checked + label:after {
1294
- opacity: 1;
1295
- -webkit-transform: scale(1);
1296
- transform: scale(1);
1297
- }
1298
-
1299
- /** CHECKBOX **/
1300
- .yith-plugin-ui input[type="checkbox"] {
1301
- -webkit-appearance: none;
1302
- background-color: #fff;
1303
- border: 1px solid #d8d8d8;
1304
- box-shadow: none;
1305
- width: 18px;
1306
- height: 18px;
1307
- border-radius: 3px;
1308
- display: inline-block;
1309
- position: relative;
1310
- margin-right: 10px;
1311
- }
1312
-
1313
- .yith-plugin-ui input[type="checkbox"]:checked {
1314
- background-color: #4e8ba2;
1315
- border-color: #488197;
1316
- }
1317
-
1318
- .yith-plugin-ui .forminp-checkbox span.description.inline {
1319
- margin-left: 10px;
1320
- }
1321
-
1322
- .yith-plugin-ui input[type="checkbox"]:checked:before {
1323
- display: none;
1324
- }
1325
-
1326
- .yith-plugin-ui input[type="checkbox"]:checked:after {
1327
- content: "\e905";
1328
- font-family: 'yith-icon';
1329
- font-size: 15px;
1330
- position: absolute;
1331
- top: 8px;
1332
- left: 1px;
1333
- color: #fff;
1334
- }
1335
-
1336
- /** ONOFF **/
1337
- .yith-plugin-ui .yith-plugin-fw-onoff-container input[type="checkbox"] {
1338
- display: none;
1339
- }
1340
-
1341
- .yith-plugin-ui .yith-plugin-fw-onoff-container input + span {
1342
- border: 1px solid #d8d8d8;
1343
- background-color: #fff;
1344
- width: 60px;
1345
- height: 24px;
1346
- }
1347
-
1348
- .yith-plugin-ui .yith-plugin-fw-onoff-container input + span:before {
1349
- background-color: #d8d8d8;
1350
- }
1351
-
1352
- .yith-plugin-ui .yith-plugin-fw-onoff-container input + span:before {
1353
- width: 14px;
1354
- height: 14px;
1355
- top: 5px;
1356
- left: 6px;
1357
- background-color: #d8d8d8;
1358
- }
1359
-
1360
- .yith-plugin-ui .yith-plugin-fw-onoff-container input + span:after {
1361
- content: 'OFF';
1362
- width: 14px;
1363
- height: 14px;
1364
- font-size: 13px;
1365
- font-weight: 600;
1366
- padding-left: 27px;
1367
- color: #979797;
1368
- margin-top: 5px;
1369
- display: inline-block;
1370
- }
1371
-
1372
- .yith-plugin-ui .yith-plugin-fw-onoff-container input:checked + span,
1373
- .yith-plugin-ui .yith-plugin-fw-onoff-container input.onoffchecked + span {
1374
- background-color: #fff;
1375
- border-color: #98aa36;
1376
- }
1377
-
1378
- .yith-plugin-ui .yith-plugin-fw-onoff-container input:checked + span:before,
1379
- .yith-plugin-ui.yith-plugin-fw-onoff-container input.onoffchecked + span:before {
1380
- background-color: #98aa36;
1381
- left: 41px;
1382
- }
1383
-
1384
- .yith-plugin-ui .yith-plugin-fw-onoff-container input:checked + span:after,
1385
- .yith-plugin-ui.yith-plugin-fw-onoff-container input.onoffchecked + span:after {
1386
- content: 'ON';
1387
- color: #98aa36;
1388
- width: 14px;
1389
- height: 14px;
1390
- display: inline-block;
1391
- font-size: 13px;
1392
- font-weight: 600;
1393
- padding: 0 10px;
1394
- margin-top: 5px;
1395
- }
1396
-
1397
- .yith-plugin-ui .yith-plugin-fw-onoff-container input + span {
1398
- text-indent: 0;
1399
- }
1400
-
1401
-
1402
- /**
1403
- DATEPICKER
1404
- */
1405
- .yith-plugin-ui div#ui-datepicker-div,
1406
- .yith-plugin-fw-panel div#ui-datepicker-div {
1407
- border: 0;
1408
- box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), 0 2px 10px 0 rgba(0, 0, 0, 0.12) !important;
1409
- }
1410
-
1411
- .yith-plugin-ui .ui-datepicker-header.ui-widget-header,
1412
- .yith-plugin-fw-panel .ui-datepicker-header.ui-widget-header {
1413
- background: #4e8ba2;
1414
- color: #fff;
1415
- font-size: 11px;
1416
- line-height: 25px;
1417
- border: 0;
1418
- min-height: 25px;
1419
- }
1420
-
1421
- .yith-plugin-ui .ui-datepicker-title,
1422
- .yith-plugin-fw-panel .ui-datepicker-title {
1423
- line-height: 25px;
1424
- }
1425
-
1426
- .yith-plugin-ui .ui-datepicker th,
1427
- .yith-plugin-fw-panel .ui-datepicker th {
1428
- color: #716269;
1429
- }
1430
-
1431
- .yith-plugin-ui .ui-widget-header .ui-icon,
1432
- .yith-plugin-ui .ui-widget-header .ui-state-hover,
1433
- .yith-plugin-ui .ui-datepicker .ui-datepicker-prev,
1434
- .yith-plugin-ui .ui-datepicker .ui-datepicker-next,
1435
- .yith-plugin-ui .ui-icon.ui-icon-circle-triangle-w,
1436
- .yith-plugin-ui .ui-icon.ui-icon-circle-triangle-e,
1437
- .yith-plugin-fw-panel .ui-widget-header .ui-icon,
1438
- .yith-plugin-fw-panel .ui-widget-header .ui-state-hover,
1439
- .yith-plugin-fw-panel .ui-datepicker .ui-datepicker-prev,
1440
- .yith-plugin-fw-panel .ui-datepicker .ui-datepicker-next,
1441
- .yith-plugin-fw-panel .ui-icon.ui-icon-circle-triangle-w,
1442
- .yith-plugin-fw-panel .ui-icon.ui-icon-circle-triangle-e {
1443
- background: none;
1444
- content: "";
1445
- border: 0;
1446
- text-indent: 0;
1447
- width: 15px;
1448
- height: 20px;
1449
- display: block;
1450
- overflow: hidden;
1451
- }
1452
-
1453
- .yith-plugin-ui .yith-password-wrapper {
1454
- display: inline-block;
1455
- width: auto;
1456
- position: relative;
1457
- }
1458
-
1459
- .yith-plugin-ui .yith-password-wrapper .yith-password-eye-closed:before,
1460
- .yith-plugin-ui .yith-password-wrapper .yith-password-eye:before {
1461
- content: '\e911';
1462
- color: #999;
1463
- font-family: 'yith-icon';
1464
- font-size: 20px;
1465
- font-weight: normal;
1466
- width: 15px;
1467
- display: block;
1468
- position: absolute;
1469
- right: 13px;
1470
- top: 0;
1471
- line-height: 38px;
1472
- bottom: 0;
1473
- cursor: pointer;
1474
- }
1475
-
1476
- .yith-plugin-ui .yith-password-wrapper .yith-password-eye-closed:before {
1477
- content: '\e912';
1478
- }
1479
-
1480
- .yith-plugin-ui .ui-icon.ui-icon-circle-triangle-w:before,
1481
- .yith-plugin-fw-panel .ui-icon.ui-icon-circle-triangle-w:before {
1482
- content: "\e901";
1483
- color: #fff;
1484
- font-family: 'yith-icon';
1485
- font-size: 12px;
1486
- font-weight: normal;
1487
- width: 15px;
1488
- display: block;
1489
- }
1490
-
1491
- .yith-plugin-ui .ui-icon.ui-icon-circle-triangle-e:before,
1492
- .yith-plugin-fw-panel .ui-icon.ui-icon-circle-triangle-e:before {
1493
- content: "\e902";
1494
- color: #fff;
1495
- text-indent: 0;
1496
- font-family: 'yith-icon';
1497
- font-size: 12px;
1498
- font-weight: normal;
1499
- width: 15px;
1500
- display: block;
1501
- }
1502
-
1503
- /* arrow */
1504
- .yith-plugin-ui .ui-datepicker .ui-datepicker-prev,
1505
- .yith-plugin-ui .ui-datepicker .ui-datepicker-next,
1506
- .yith-plugin-ui .ui-datepicker-prev.ui-datepicker-prev-hover,
1507
- .yith-plugin-ui .ui-datepicker-prev.ui-datepicker-next-hover,
1508
- .yith-plugin-fw-panel .ui-datepicker .ui-datepicker-prev,
1509
- .yith-plugin-fw-panel .ui-datepicker .ui-datepicker-next,
1510
- .yith-plugin-fw-panel .ui-datepicker-prev.ui-datepicker-prev-hover,
1511
- .yith-plugin-fw-panel .ui-datepicker-prev.ui-datepicker-next-hover {
1512
- top: 1px;
1513
- cursor: pointer;
1514
- }
1515
-
1516
- .yith-plugin-ui .ui-datepicker-prev.ui-datepicker-prev,
1517
- .yith-plugin-ui .ui-datepicker-prev.ui-datepicker-prev-hover,
1518
- .yith-plugin-fw-panel .ui-datepicker-prev.ui-datepicker-prev,
1519
- .yith-plugin-fw-panel .ui-datepicker-prev.ui-datepicker-prev-hover {
1520
- left: 5px;
1521
- }
1522
-
1523
- .yith-plugin-ui .ui-datepicker .ui-datepicker-next,
1524
- .yith-plugin-ui .ui-datepicker-next.ui-datepicker-next-hover,
1525
- .yith-plugin-fw-panel .ui-datepicker .ui-datepicker-next,
1526
- .yith-plugin-fw-panel .ui-datepicker-next.ui-datepicker-next-hover {
1527
- right: 1px;
1528
- }
1529
-
1530
- .yith-plugin-ui .ui-datepicker table,
1531
- .yith-plugin-fw-panel .ui-datepicker table {
1532
- font-size: 10px;
1533
- }
1534
-
1535
- .yith-plugin-ui .ui-state-default,
1536
- .yith-plugin-ui .ui-widget-content .ui-state-default,
1537
- .yith-plugin-ui .ui-widget-header .ui-state-default,
1538
- .yith-plugin-fw-panel .ui-state-default,
1539
- .yith-plugin-fw-panel .ui-widget-content .ui-state-default,
1540
- .yith-plugin-fw-panel .ui-widget-header .ui-state-default {
1541
- background: #fff;
1542
- border: 1px solid #d9d9d9;
1543
-
1544
- }
1545
-
1546
- .yith-plugin-ui .ui-state-hover,
1547
- .yith-plugin-ui .ui-widget-content .ui-state-hover,
1548
- .yith-plugin-ui a.ui-state-default:focus,
1549
- .yith-plugin-ui .ui-widget-content .ui-state-focus,
1550
- .yith-plugin-ui .ui-widget-header .ui-state-focus,
1551
- .yith-plugin-fw-panel .ui-state-hover,
1552
- .yith-plugin-fw-panel .ui-widget-content .ui-state-hover,
1553
- .yith-plugin-fw-panel a.ui-state-default:focus,
1554
- .yith-plugin-fw-panel .ui-widget-content .ui-state-focus,
1555
- .yith-plugin-fw-panel .ui-widget-header .ui-state-focus {
1556
- background: #ebf1f3;
1557
- border: 1px solid #bfd5dd;
1558
- outline: none;
1559
- box-shadow: none;
1560
- }
1561
-
1562
- .yith-plugin-ui .ui-widget-header .ui-state-hover, .woocommerce .yith-plugin-ui .ui-state-focus,
1563
- .yith-plugin-fw-panel .ui-widget-header .ui-state-hover, .woocommerce .yith-plugin-ui .ui-state-focus {
1564
- background: none;
1565
- border: 0;
1566
- }
1567
-
1568
- /** colorpicker **/
1569
- .yith-plugin-ui .yith-plugin-fw-field-wrapper .yith-colorpicker-group:not(:first-child) {
1570
- margin-top: 20px;
1571
- }
1572
-
1573
- .yith-plugin-ui .yith-plugin-fw-field-wrapper .iris-picker,
1574
- .yith-plugin-ui .yith-plugin-fw-field-wrapper .wp-picker-holder {
1575
- display: none !important;
1576
- }
1577
-
1578
- .yith-plugin-ui .yith-plugin-fw-field-wrapper .wp-picker-input-wrap {
1579
- display: inline !important;
1580
- }
1581
-
1582
- .yith-plugin-ui .yith-plugin-fw-field-wrapper .wp-picker-active .iris-picker,
1583
- .yith-plugin-ui .yith-plugin-fw-field-wrapper .wp-picker-active .wp-picker-holder {
1584
- display: block !important;
1585
- }
1586
-
1587
- .woocommerce .yith-plugin-ui .iris-picker {
1588
- border: 0;
1589
- margin-top: 20px;
1590
- }
1591
-
1592
- .yith-plugin-ui .yith-plugin-fw input[type=text].wp-color-picker {
1593
- border: 0;
1594
- padding: 2px 5px;
1595
- height: 30px;
1596
- }
1597
-
1598
- .yith-plugin-ui .wp-color-result-text {
1599
- display: none;
1600
- }
1601
-
1602
- .yith-plugin-ui .wp-picker-container .wp-color-result.button {
1603
- width: 30px;
1604
- height: 30px;
1605
- border: 0;
1606
- box-shadow: none;
1607
- border: 1px solid #d9d9d9;
1608
- margin-bottom: 0;
1609
- display: inline-block;
1610
- vertical-align: middle;
1611
- }
1612
-
1613
- .yith-plugin-ui .wp-picker-default-custom {
1614
- cursor: pointer;
1615
- width: 25px;
1616
- padding: 0 5px;
1617
- display: inline-block;
1618
- vertical-align: middle;
1619
- position: relative;
1620
- }
1621
-
1622
- .yith-plugin-ui .wp-picker-default-custom input.button {
1623
- opacity: 0;
1624
- margin: 0;
1625
- padding: 0;
1626
- position: absolute;
1627
- top: 0;
1628
- right: 0;
1629
- left: 0;
1630
- bottom: 0;
1631
- z-index: 2;
1632
- }
1633
-
1634
- .yith-plugin-ui .wp-picker-default-custom:before {
1635
- content: "\e910";
1636
- text-indent: 0;
1637
- font-family: 'yith-icon';
1638
- font-size: 20px;
1639
- color: #d8d8d8;
1640
- font-weight: normal;
1641
- width: 15px;
1642
- display: block;
1643
- background: none;
1644
- line-height: 20px;
1645
- margin-left: 8px;
1646
- }
1647
-
1648
- .yith-plugin-ui .wp-picker-container {
1649
- width: auto;
1650
- display: inline-block;
1651
- border: 1px solid #d9d9d9;
1652
- border-radius: 8px;
1653
- padding: 5px;
1654
- }
1655
-
1656
- .yith-plugin-ui .iris-picker .iris-square-inner {
1657
- box-shadow: none;
1658
- border: 1px solid #d9d9d9;
1659
- }
1660
-
1661
- .yith-plugin-ui .yith-single-colorpicker {
1662
- display: inline-block;
1663
- width: 220px;
1664
- }
1665
-
1666
- .yith-plugin-ui .yith-single-colorpicker > label {
1667
- display: block;
1668
- font-size: 11px;
1669
- font-weight: 600;
1670
- margin: 0 0 10px 0;
1671
- }
1672
-
1673
- /* RANGE SLIDER */
1674
- .yith-plugin-ui .ui-slider-horizontal .ui-slider-handle {
1675
- top: -45px !important;
1676
- }
1677
-
1678
- .yith-plugin-ui .ui-slider-horizontal .ui-slider-handle {
1679
- position: absolute;
1680
- top: -33px;
1681
- left: 0;
1682
- width: auto !important;
1683
- height: auto !important;
1684
- padding: 2px 8px;
1685
- margin-left: -15px;
1686
- font-size: 12px;
1687
- line-height: 20px;
1688
- color: #4e8ba2;
1689
- text-align: center;
1690
- background-color: #fff;
1691
- border: 1px solid #fff;
1692
- border-radius: 3px;
1693
- -webkit-transition: opacity .3s ease-in-out 0s;
1694
- transition: opacity .3s ease-in-out 0s;
1695
- box-shadow: 0px 1px 7px 0px rgba(1, 1, 1, 0.13);
1696
- }
1697
-
1698
- .yith-plugin-ui .ui-slider-horizontal .ui-slider-handle:before {
1699
- position: absolute;
1700
- bottom: -3px;
1701
- left: 50%;
1702
- display: inline-block;
1703
- width: 6px;
1704
- height: 6px;
1705
- margin-left: -3px;
1706
- content: "";
1707
- background-color: #fff;
1708
- -webkit-transform: rotate(-45deg);
1709
- -ms-transform: rotate(-45deg);
1710
- transform: rotate(-45deg);
1711
- }
1712
-
1713
- .yith-plugin-ui .ui-slider.ui-widget-content .ui-widget-header {
1714
- background: #4e8ba2;
1715
- }
1716
-
1717
- .yith-plugin-ui .ui-slider-horizontal .ui-slider-handle:after {
1718
- content: '';
1719
- width: 17px;
1720
- height: 17px;
1721
- display: block;
1722
- position: absolute;
1723
- background: #fff;
1724
- top: 37px;
1725
- border-radius: 50%;
1726
- box-shadow: 0px 1px 6px 0px rgba(1, 1, 1, 0.25);
1727
- }
1728
-
1729
- .yith-plugin-ui .ui-slider.ui-widget-content {
1730
- height: 5px !important;
1731
- }
1732
-
1733
- .yith-plugin-ui .ui-slider .minCaption,
1734
- .yith-plugin-ui .ui-slider .maxCaption {
1735
- font-weight: 700;
1736
- font-size: 12px;
1737
- }
1738
-
1739
-
1740
- /* ADD_BOX AND TOGGLE */
1741
- .yith-plugin-ui .yith-add-box,
1742
- .yith-plugin-ui .yith-toggle-row {
1743
- width: 70%;
1744
- border: 1px solid #d9d9d9;
1745
- box-shadow: none;
1746
- border-radius: 4px;
1747
- margin: 20px 0;
1748
- padding: 10px;
1749
- box-sizing: border-box;
1750
- background: white;
1751
- }
1752
-
1753
- .yith-plugin-ui .yith-toggle-row {
1754
- cursor: pointer;
1755
- transition: all ease 0.5s;
1756
- }
1757
-
1758
- .yith-plugin-ui .yith-toggle-row.highlight {
1759
- transition: all ease 0.5s;
1760
- /*box-shadow: 0 0 7px rgb(81, 117, 129);*/
1761
- box-shadow: 0 0 7px rgb(30, 140, 190);
1762
-
1763
- display: block;
1764
- }
1765
-
1766
- .yith-plugin-ui .yith-add-box {
1767
- padding: 25px;
1768
- display: none;
1769
- }
1770
-
1771
- .yith-plugin-ui .yith-toggle-title {
1772
- position: relative;
1773
- }
1774
-
1775
- .yith-plugin-ui #plugin-fw-wc .yith-toggle-title h3,
1776
- .yith-plugin-ui.metaboxes-tab.yith-plugin-ui h3,
1777
- .yith-plugin-ui .yith-toggle-title h3 {
1778
- padding: 0px 20px 0px 25px;
1779
- margin: 3px 0;
1780
-
1781
- display: inline-block;
1782
- position: relative;
1783
- min-width: 173px;
1784
- box-sizing: border-box;
1785
- font-weight: 600;
1786
- font-size: 15px;
1787
- color: #23282d;
1788
- text-transform: inherit;
1789
- }
1790
-
1791
- .yith-plugin-ui .yith-toggle-title .subtitle {
1792
- padding-left: 0;
1793
- padding-top: 8px;
1794
- font-size: 12px;
1795
- }
1796
-
1797
- .yith-plugin-ui .yith-toggle {
1798
- position: absolute;
1799
- width: 30px;
1800
- cursor: pointer;
1801
- left: 0;
1802
- top: 0;
1803
- bottom: 0;
1804
- margin: auto;
1805
- display: flex;
1806
- align-items: center;
1807
- }
1808
-
1809
- .yith-plugin-ui .yith-toggle > span:before {
1810
- color: #405e69;
1811
- }
1812
-
1813
- .yith-plugin-ui .yith-toggle > span {
1814
- position: absolute;
1815
- right: 50%;
1816
- transition: transform .3s;
1817
- line-height: 1;
1818
- }
1819
-
1820
-
1821
- .yith-plugin-ui .yith-toggle-row-opened .yith-toggle span {
1822
- transform: rotateZ(90deg);
1823
- }
1824
-
1825
- .yith-plugin-ui .yith-toggle-content {
1826
- display: none;
1827
- position: relative;
1828
- padding: 30px 25px;
1829
- }
1830
-
1831
- .yith-plugin-ui .yith-toggle-row-opened .yith-toggle-content {
1832
- /* display: block;*/
1833
- }
1834
-
1835
- .yith-plugin-ui .yith-add-box-row,
1836
- .yith-plugin-ui .yith-toggle-row-opened .yith-toggle-content .yith-toggle-content-row {
1837
- display: table;
1838
- margin-bottom: 40px;
1839
- }
1840
-
1841
- .yith-plugin-ui .yith-add-box-row label,
1842
- .yith-plugin-ui .yith-toggle-row-opened .yith-toggle-content .yith-toggle-content-row label {
1843
- display: table-cell;
1844
- width: 200px;
1845
- padding-right: 21px;
1846
- color: #33373b;
1847
- font-size: 14px;
1848
- vertical-align: top;
1849
- font-weight: 600;
1850
- }
1851
- .yith-plugin-ui .yith-plugin-fw-radio__row label{
1852
- font-weight: 400!important;
1853
- }
1854
- .yith-plugin-ui .yith-add-box-row .yith-plugin-fw-field-wrapper:not(.yith-plugin-fw-title-field-wrapper),
1855
- .yith-plugin-ui .yith-toggle-row-opened .yith-plugin-fw-field-wrapper:not(.yith-plugin-fw-title-field-wrapper) {
1856
- margin-top: 10px;
1857
- width: auto;
1858
- float: none;
1859
- vertical-align: middle;
1860
- position: relative;
1861
- }
1862
-
1863
- .yith-plugin-ui .yith-add-box-row span.yith-icon,
1864
- .yith-plugin-ui .yith-toggle-row-opened .yith-toggle-content .yith-toggle-content-row span.yith-icon {
1865
- position: absolute;
1866
- right: 15px;
1867
- top: 0;
1868
- bottom: 0;
1869
- }
1870
-
1871
- .yith-plugin-ui .yith-add-box-buttons,
1872
- .yith-plugin-ui .yith-toggle-content-buttons {
1873
- text-align: right;
1874
- }
1875
-
1876
- .yith-plugin-ui .yith-toggle-onoff {
1877
- position: absolute;
1878
- cursor: pointer;
1879
- right: 0;
1880
- }
1881
-
1882
- .yith-plugin-ui .yith-toggle_wrapper.ui-sortable .yith-toggle-onoff {
1883
- right: 30px;
1884
- }
1885
-
1886
- .yith-plugin-ui .yith-toggle-row .yith-icon-drag {
1887
- position: absolute;
1888
- right: 0;
1889
- top: 25%;
1890
- bottom: 0;
1891
- line-height: 1;
1892
- }
1893
-
1894
- .yith-plugin-ui .yith-toggle-row.with-subtitle .yith-toggle-onoff {
1895
- top: 25%;
1896
- }
1897
-
1898
- /** SPINNER **/
1899
- .yith-plugin-ui .spinner {
1900
- vertical-align: -5px;
1901
- float: none;
1902
- }
1903
-
1904
- .yith-plugin-ui .spinner.show {
1905
- visibility: visible;
1906
- }
1907
-
1908
- /* LIST TABLE */
1909
- .yith-plugin-ui .form-table .list-table td {
1910
- padding: 15px 0px;
1911
- }
1912
-
1913
- .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table .bulkactions select {
1914
- border: 1px solid #d8d8d8;
1915
- max-width: 200px;
1916
- max-height: 30px;
1917
- padding: 0 10px;
1918
- margin-right: 5px;
1919
- }
1920
-
1921
- .yith-plugin-ui .form-table .list-table th {
1922
- width: initial;
1923
- }
1924
-
1925
- .yith-plugin-ui #plugin-fw-wc table.wp-list-table tbody td {
1926
- padding-left: 20px;
1927
- }
1928
-
1929
- .yith-plugin-ui #plugin-fw-wc table.wp-list-table th,
1930
- .yith-plugin-ui #plugin-fw-wc table.wp-list-table td {
1931
- padding: 15px 20px 15px 20px;
1932
- }
1933
-
1934
- .yith-plugin-ui #plugin-fw-wc table.wp-list-table thead td,
1935
- .yith-plugin-ui #plugin-fw-wc table.wp-list-table thead th,
1936
- .yith-plugin-ui #plugin-fw-wc table.wp-list-table tfoot td,
1937
- .yith-plugin-ui #plugin-fw-wc table.wp-list-table tfoot th {
1938
- padding: 3px 20px;
1939
- }
1940
-
1941
- .yith-plugin-ui #plugin-fw-wc table.wp-list-table thead a,
1942
- .yith-plugin-ui #plugin-fw-wc table.wp-list-table tfoot a {
1943
- padding-left: 0;
1944
- }
1945
-
1946
- .yith-plugin-ui .yith-plugin-fw-list-table h2 {
1947
- border: 0;
1948
- padding: 35px 0 15px;
1949
- display: inline-block;
1950
- margin-right: 10px;
1951
- }
1952
-
1953
- .yith-plugin-ui .form-table .yith-plugin-fw-list-table table th {
1954
- vertical-align: middle;
1955
- }
1956
-
1957
- .yith-plugin-ui .yith-plugin-fw-list-table-container {
1958
- padding: 0 20px;
1959
- }
1960
-
1961
- .yith-plugin-ui #doaction, .yith-plugin-ui #doaction2,
1962
- .yith-plugin-ui #post-query-submit,
1963
- .yith-plugin-ui #search-submit,
1964
- .yith-plugin-ui .button.filter-button {
1965
- margin-left: 0;
1966
- height: 33px;
1967
- padding: 0 10px;
1968
- line-height: 33px;
1969
- }
1970
-
1971
- .yith-plugin-ui .bulkactions {
1972
- margin: 10px 0;
1973
- }
1974
-
1975
- .yith-plugin-ui .form-table td p.yith-section-description {
1976
- color: #716269;
1977
- margin-bottom: 20px;
1978
- }
1979
-
1980
- /** Time picker width*/
1981
- .yith-plugin-ui input.ui-timepicker-input {
1982
- width: 100px !important;
1983
- }
1984
-
1985
- /** date format **/
1986
- .yith-plugin-ui .yith-plugin-fw-date-format code {
1987
- margin-left: 30px;
1988
- }
1989
-
1990
- .yith-plugin-ui .yith-plugin-fw-date-format input[type=text].small-text {
1991
- margin-left: 45px;
1992
- }
1993
-
1994
- /** checkbox columns **/
1995
- .yith-plugin-ui td.forminp-checkbox.two-cols fieldset {
1996
- width: calc(50% - 20px);
1997
- padding-right: 20px;
1998
- float: left;
1999
- }
2000
-
2001
- .yith-plugin-ui td.forminp-checkbox.two-cols fieldset:nth-child(2n+1) {
2002
- clear: both;
2003
- }
2004
-
2005
- .yith-plugin-ui td.forminp-checkbox.three-cols fieldset {
2006
- width: calc(33% - 10px);
2007
- padding-right: 10px;
2008
- float: left;
2009
- }
2010
-
2011
- .yith-plugin-ui td.forminp-checkbox.three-cols fieldset:nth-child(3n+1) {
2012
- clear: both;
2013
- }
2014
-
2015
- .yith-plugin-fw-checkbox-field-wrapper {
2016
- display: inline-block !important;
2017
- }
2018
-
2019
- .yith-plugin-fw-checkbox-field-wrapper + span.description {
2020
- display: inline-block;
2021
- vertical-align: middle;
2022
- margin: 0;
2023
- }
2024
-
2025
- .yith-plugin-ui span.description {
2026
- margin-top: 10px;
2027
- line-height: 20px;
2028
- }
2029
-
2030
- .yith-plugin-fw-option-with-description {
2031
- display: table-cell;
2032
- width: auto;
2033
- vertical-align: top;
2034
- }
2035
-
2036
- /** YITH PANEL **/
2037
- .yith-plugin-ui #yith-plugin-fw-panel {
2038
- margin-top: -10px;
2039
- }
2040
-
2041
- .yith-plugin-ui #plugin-fw-wc, .yith-plugin-ui #yith-plugin-fw-panel {
2042
- padding-top: 0;
2043
- }
2044
-
2045
- .yith-plugin-ui .plugin-option tr {
2046
- border: 0;
2047
- }
2048
-
2049
- @media screen and (max-width: 1440px) {
2050
- .yith-plugin-ui .yith-add-box,
2051
- .yith-plugin-ui .yith-toggle-row {
2052
- width: 80%;
2053
- }
2054
- }
2055
-
2056
- @media screen and (max-width: 1024px) {
2057
- .yith-plugin-ui .yith-add-box,
2058
- .yith-plugin-ui .yith-toggle-row {
2059
- width: 90%;
2060
- }
2061
-
2062
- .yith-plugin-ui td.forminp-checkbox.two-cols fieldset {
2063
- width: 100%;
2064
- padding-right: 20px;
2065
- float: left;
2066
- }
2067
-
2068
- .yith-plugin-ui td.forminp-checkbox.three-cols fieldset {
2069
- width: calc(50% - 10px);
2070
- padding-right: 10px;
2071
- float: left;
2072
- }
2073
-
2074
- .yith-plugin-ui td.forminp-checkbox.two-cols fieldset:nth-child(2n+1) {
2075
- clear: both;
2076
- }
2077
-
2078
- .yith-plugin-ui td.forminp-checkbox.three-cols fieldset:nth-child(3n+1) {
2079
- clear: initial;
2080
- }
2081
- }
2082
-
2083
- @media screen and (max-width: 782px) {
2084
- .yith-plugin-fw-banner.yith-plugin-fw-banner-free {
2085
- height: auto;
2086
- background-color: #a9c7d3;
2087
- }
2088
-
2089
- .yith-plugin-fw-banner.yith-plugin-fw-banner-free ul {
2090
- width: 90%;
2091
- text-align: center;
2092
- }
2093
-
2094
- .yith-plugin-fw-banner.yith-plugin-fw-banner-free li img {
2095
- width: 90%;
2096
- margin: 0 auto;
2097
- }
2098
-
2099
- .yith-plugin-fw-banner h1 {
2100
- line-height: 1.2em;
2101
- }
2102
-
2103
- .yith-plugin-ui .yith-add-box,
2104
- .yith-plugin-ui .yith-toggle-row {
2105
- width: 100%;
2106
- }
2107
-
2108
- .yith-plugin-ui td.forminp-checkbox.two-cols fieldset,
2109
- .yith-plugin-ui td.forminp-checkbox.three-cols fieldset {
2110
- width: 100%;
2111
- clear: initial;
2112
- }
2113
-
2114
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 span.color-alpha {
39
+ height: 23px!important;
40
+ }
41
+ .yith-plugin-fw .wp-color-result-text{
42
+ height: 100%;
43
+ }
44
+ .yith-plugin-fw input[type=email],
45
+ .yith-plugin-fw input[type=number],
46
+ .yith-plugin-fw input[type=text]:not(.select2-search__field),
47
+ .yith-plugin-fw select,
48
+ .woocommerce .yith-plugin-fw table.form-table input[type=email],
49
+ .woocommerce .yith-plugin-fw table.form-table input[type=number],
50
+ .yith-plugin-ui input[type=password],
51
+ .woocommerce .yith-plugin-fw table.form-table input[type=text]:not(.select2-search__field),
52
+ .woocommerce .yith-plugin-fw table.form-table select {
53
+ width: 400px;
54
+ max-width: 100%;
55
+ height: 30px;
56
+ padding: 5px;
57
+ line-height: 1;
58
+ }
59
+
60
+ .woocommerce .yith-plugin-fw table.form-table input[type=text].wp-color-picker,
61
+ .woocommerce .yith-plugin-fw table.form-table input[type=text].yith-plugin-fw-colorpicker,
62
+ .yith-plugin-fw input[type=text].wp-color-picker,
63
+ .yith-plugin-fw input[type=text].yith-plugin-fw-colorpicker {
64
+ width: 6em;
65
+ max-width: none;
66
+ height: auto;
67
+ padding: 3px 5px;
68
+ }
69
+
70
+ .wp-core-ui .yith-plugin-fw-colorpicker-field-wrapper button{
71
+ border-color: #7e8993;
72
+ }
73
+
74
+ .woocommerce .yith-plugin-fw table.form-table input[type=text].colorpick,
75
+ .yith-plugin-fw input[type=text].colorpick {
76
+ width: 6em;
77
+ max-width: none;
78
+ height: auto;
79
+ padding: 6px;
80
+ }
81
+
82
+ .yith-plugin-fw input.select2-search__field,
83
+ .yith-plugin-fw .select2-container .select2-search--inline .select2-search__field,
84
+ .woocommerce .yith-plugin-fw input.select2-search__field,
85
+ .woocommerce .yith-plugin-fw table.form-table input.select2-search__field {
86
+ padding: 3px;
87
+ }
88
+
89
+ .yith-plugin-fw .select2-container .select2-selection--single .select2-selection__rendered {
90
+ line-height: 27px;
91
+ }
92
+
93
+ .yith-plugin-fw textarea {
94
+ width: 400px;
95
+ max-width: 100%;
96
+ padding: 5px;
97
+ }
98
+
99
+ /* ------------- ICONS ------------- */
100
+ .yit-icons-manager-wrapper {
101
+ width: 100%;
102
+ max-width: 400px;
103
+ }
104
+
105
+ .yit-icons-manager-text {
106
+ width: 100%;
107
+ }
108
+
109
+ .yit-icons-manager-icon-text {
110
+ width: calc(100% - 35px) !important;
111
+ height: 30px;
112
+ float: left;
113
+ margin: 0;
114
+ }
115
+
116
+ .yit-icons-manager-icon-preview {
117
+ width: 30px;
118
+ height: 30px;
119
+ margin-right: 5px;
120
+ float: left;
121
+ padding-top: 6px;
122
+ box-sizing: border-box;
123
+ text-align: center;
124
+ background: #f1f1f1;
125
+ }
126
+
127
+ .yit-icons-manager-list-wrapper {
128
+ margin: 10px 0;
129
+ box-shadow: 0 0 0 1px #ddd;
130
+ }
131
+
132
+ ul.yit-icons-manager-list {
133
+ width: 100%;
134
+ height: 300px;
135
+ overflow-y: scroll;
136
+ margin: 0;
137
+ }
138
+
139
+ ul.yit-icons-manager-list li {
140
+ float: left;
141
+ width: 30px;
142
+ height: 30px;
143
+ padding-top: 6px;
144
+ box-sizing: border-box;
145
+ text-align: center;
146
+ background: #f1f1f1;
147
+ margin: 1px;
148
+ cursor: pointer;
149
+ }
150
+
151
+ ul.yit-icons-manager-list li:hover {
152
+ background: #c5dcf6;
153
+ }
154
+
155
+ ul.yit-icons-manager-list li.active {
156
+ background: #d4f0ff;
157
+ }
158
+
159
+ .yit-icons-manager-action-set-default {
160
+ margin-bottom: 0;
161
+ }
162
+
163
+ .yit-icons-manager-default-icon-preview {
164
+ height: 100%;
165
+ display: inline-block;
166
+ padding-left: 10px;
167
+ border-left: 1px solid #ccc;
168
+ margin-left: 10px;
169
+ }
170
+
171
+ /* ------- Text Array ------- */
172
+ .yith-plugin-fw-text-array-table td {
173
+ padding: 1px;
174
+ }
175
+
176
+ .yith-plugin-fw-text-array-table input[type=text],
177
+ .woocommerce table.form-table table.yith-plugin-fw-text-array-table input[type=text] {
178
+ width: 100%;
179
+ }
180
+
181
+ /* ------- Image Gallery ------- */
182
+ .yith-plugin-fw .image-gallery ul li {
183
+ display: inline-block;
184
+ width: 80px;
185
+ margin-left: 10px;
186
+ position: relative;
187
+ }
188
+
189
+ .yith-plugin-fw .image-gallery ul li img {
190
+ width: 80px;
191
+ border: 1px solid #ccc;
192
+ }
193
+
194
+ .yith-plugin-fw .image-gallery ul li ul {
195
+ position: absolute;
196
+ top: -6px;
197
+ right: -1px;
198
+ width: 20px;
199
+ height: 20px;
200
+ }
201
+
202
+ .yith-plugin-fw .image-gallery ul a.delete {
203
+ background: url(../images/x.png) no-repeat;
204
+ width: 20px;
205
+ height: 20px;
206
+ display: block;
207
+ text-indent: -99999px;
208
+ }
209
+
210
+ /* ------- OnOff ------- */
211
+ .yith-plugin-fw-onoff-container {
212
+ display: inline-block;
213
+ }
214
+
215
+ .yith-plugin-fw-onoff-container input {
216
+ display: none;
217
+ }
218
+
219
+ .yith-plugin-fw-onoff-container input + span {
220
+ cursor: pointer;
221
+ text-indent: -9999px;
222
+ display: block;
223
+ width: 36px;
224
+ line-height: 1;
225
+ height: 20px;
226
+ background: #a4a4a4;
227
+ border-radius: 24px;
228
+ position: relative;
229
+ transition: all 0.3s;
230
+ }
231
+
232
+
233
+ .yith-plugin-fw-onoff-container input + span:before {
234
+ content: '';
235
+ background: #fff;
236
+ width: 16px;
237
+ height: 16px;
238
+ border-radius: 50%;
239
+ position: absolute;
240
+ top: 2px;
241
+ left: 2px;
242
+ transition: all 0.3s;
243
+ }
244
+
245
+ .yith-plugin-fw-onoff-container input:checked + span,
246
+ .yith-plugin-fw-onoff-container input.onoffchecked + span {
247
+ background: #0073aa;
248
+ }
249
+
250
+ .yith-plugin-fw-onoff-container input:checked + span:before,
251
+ .yith-plugin-fw-onoff-container input.onoffchecked + span:before {
252
+ left: 18px;
253
+ }
254
+
255
+ /* ------- Preview ------- */
256
+ .yith-plugin-fw-preview-field {
257
+ max-height: 200px;
258
+ }
259
+
260
+ /* ------- Radio ------- */
261
+ .yith-plugin-fw-radio input[type=radio] {
262
+ margin: 0 3px 0 0;
263
+ }
264
+
265
+ .yith-plugin-fw-radio__row {
266
+ margin-bottom: 8px;
267
+ }
268
+
269
+ /* ------- Sidebar Layout ------- */
270
+ .yith-plugin-fw-sidebar-layout input[type="radio"] {
271
+ display: none;
272
+ width: 0px;
273
+ }
274
+
275
+ .yith-plugin-fw-sidebar-layout input[type="radio"]:first-child {
276
+ margin-right: -2px;
277
+ }
278
+
279
+ .yith-plugin-fw-sidebar-layout input[type="radio"] + img {
280
+ border: 2px solid #fff;
281
+ padding: 1px;
282
+ }
283
+
284
+ .yith-plugin-fw-sidebar-layout input[type="radio"] + img:hover {
285
+ cursor: pointer;
286
+ }
287
+
288
+ .yith-plugin-fw-sidebar-layout input[checked] + img {
289
+ border: 2px solid #f2ad35;
290
+ padding: 1px;
291
+ }
292
+
293
+ .yith-plugin-fw-sidebar-layout select {
294
+ vertical-align: 12px;
295
+ }
296
+
297
+ .yit-admin-panel-content-wrap .yith-plugin-fw-sidebar-layout label {
298
+ font-weight: bold;
299
+ width: 200px;
300
+ float: left;
301
+ line-height: 23px;
302
+ margin-left: -230px;
303
+ }
304
+
305
+ /* ------- Slider ------- */
306
+ .yith-plugin-fw .slider {
307
+ padding-top: 20px;
308
+ }
309
+
310
+ .ui-slider .minCaption {
311
+ position: absolute;
312
+ right: 95%;
313
+ top: -6px;
314
+ margin-right: 11px;
315
+ }
316
+
317
+ .ui-slider .maxCaption {
318
+ position: absolute;
319
+ left: 95%;
320
+ top: -6px;
321
+ margin-left: 20px;
322
+ }
323
+
324
+ .ui-slider-horizontal .ui-slider-handle {
325
+ background: #fff;
326
+ border: 0px !important;
327
+ top: -12px !important;
328
+ border-radius: 50%;
329
+ width: 27px !important;
330
+ height: 27px !important;
331
+ box-sizing: border-box;
332
+ box-shadow: 0 1px 7px -1px rgba(0, 0, 0, 0.5);
333
+ font-size: 13px;
334
+ padding: 6px 0;
335
+ font-weight: 600;
336
+ color: #555;
337
+ text-align: center;
338
+ }
339
+
340
+ .ui-slider.ui-widget-content {
341
+ background: #ccc;
342
+ border: none !important;
343
+ height: 3px !important;
344
+ border-radius: 3px !important;
345
+ width: 90%;
346
+ margin: 15px 5% 20px 5%;
347
+ }
348
+
349
+ .iris-slider-offset.ui-slider.ui-widget-content {
350
+ background: transparent !important;
351
+ height: auto !important;
352
+ }
353
+
354
+ .ui-slider.ui-widget-content .ui-widget-header {
355
+ background: #4b93ff;
356
+ left: 0px !important;
357
+ -webkit-border-radius: 3px;
358
+ -moz-border-radius: 3px;
359
+ -khtml-border-radius: 3px;
360
+ border-radius: 3px;
361
+ }
362
+
363
+ /* ------- Select2 ------- */
364
+ .yith-plugin-fw-select2-wrapper {
365
+ width: 400px;
366
+ }
367
+
368
+ /* ------- Textarea ------- */
369
+ .yith-plugin-fw-textarea-editor-field-wrapper {
370
+ max-width: 1000px;
371
+ clear: both;
372
+ }
373
+
374
+ .yith-plugin-fw-textarea-editor-field-wrapper textarea.wp-editor-area,
375
+ .woocommerce table.form-table .yith-plugin-fw-textarea-editor-field-wrapper textarea.wp-editor-area {
376
+ width: 100%;
377
+ }
378
+
379
+ /* ------- Buttons ------- */
380
+ .yith-plugin-fw-buttons-field-wrapper {
381
+ margin-top: 7px;
382
+ }
383
+
384
+ /* ------- Select Images ------- */
385
+ .yith-plugin-fw-select-images__list {
386
+ margin: 0;
387
+ display: flex;
388
+ flex-wrap: wrap;
389
+ }
390
+
391
+ .yith-plugin-fw-select-images__item {
392
+ width: calc(20% - 10px);
393
+ min-width: 150px;
394
+ margin: 0 10px 10px 0;
395
+ padding: 10px;
396
+ box-sizing: border-box;
397
+ cursor: pointer;
398
+ transition: all .3s;
399
+ border: 2px solid #eee;
400
+ display: flex;
401
+ flex-direction: column;
402
+ justify-content: space-between;
403
+ }
404
+
405
+ .yith-plugin-fw-select-images__item:hover,
406
+ .yith-plugin-fw-select-images__item.yith-plugin-fw-select-images__item--selected {
407
+ border-color: #07bcce;
408
+ }
409
+
410
+ .yith-plugin-fw-select-images__item__label {
411
+ text-align: center;
412
+ font-weight: 600;
413
+ margin-bottom: 10px;
414
+ }
415
+
416
+ .yith-plugin-fw-select-images__item img {
417
+ display: block;
418
+ max-width: 100%;
419
+ margin: 0 auto;
420
+ }
421
+
422
+ /****************
423
+ WordPress 5.3 with old panel fixes
424
+ ****************/
425
+ .yith-plugin-fw-field-wrapper .select2-container .select2-selection--single {
426
+ height: auto;
427
+ line-height: 1;
428
+ }
429
+
430
+ .yith-plugin-fw-field-wrapper .select2-container .select2-selection--single .select2-selection__arrow{
431
+ height: 100%;
432
+ }
433
+
434
+ /****************
435
+ YITH UI
436
+ ****************/
437
+ @font-face {
438
+ font-family: 'yith-icon';
439
+ src: url('../fonts/yith-icon.eot?7ik896');
440
+ src: url('../fonts/yith-icon.eot?7ik896#iefix') format('embedded-opentype'),
441
+ url('../fonts/yith-icon.ttf?7ik896') format('truetype'),
442
+ url('../fonts/yith-icon.woff?7ik896') format('woff'),
443
+ url('../fonts/yith-icon.svg?7ik896#yith-icon') format('svg');
444
+ font-weight: normal;
445
+ font-style: normal;
446
+ }
447
+
448
+ [class^="icon-"], [class*=" icon-"][class^="yith-icon-"], [class*=" yith-icon-"] {
449
+ /* use !important to prevent issues with browser extensions that change fonts */
450
+ font-family: 'yith-icon' !important;
451
+ speak: none;
452
+ font-style: normal;
453
+ font-weight: normal;
454
+ font-variant: normal;
455
+ text-transform: none;
456
+ line-height: 1;
457
+
458
+ /* Better Font Rendering =========== */
459
+ -webkit-font-smoothing: antialiased;
460
+ -moz-osx-font-smoothing: grayscale;
461
+ }
462
+
463
+ .yith-icon-calendar_add:before {
464
+ content: "\e913";
465
+ color: #757575;
466
+ }
467
+
468
+ .yith-icon-calendar_money:before {
469
+ content: "\e914";
470
+ color: #757575;
471
+ }
472
+
473
+ .yith-icon-calendar2:before {
474
+ content: "\e915";
475
+ color: #757575;
476
+ }
477
+
478
+ .yith-icon-people:before {
479
+ content: "\e916";
480
+ color: #757575;
481
+ }
482
+
483
+ .yith-icon-shield_money:before {
484
+ content: "\e917";
485
+ color: #757575;
486
+ }
487
+
488
+ .yith-icon-time_check:before {
489
+ content: "\e918";
490
+ color: #757575;
491
+ }
492
+
493
+ .yith-icon-world_settings:before {
494
+ content: "\e919";
495
+ color: #757575;
496
+ }
497
+
498
+ .yith-icon-arrow_eye_closed:before {
499
+ content: "\e912";
500
+ color: #757575;
501
+ }
502
+
503
+ .yith-icon-arrow_eye:before {
504
+ content: "\e911";
505
+ color: #757575;
506
+ }
507
+
508
+ .yith-icon-reset:before {
509
+ content: "\e910";
510
+ color: #757575;
511
+ }
512
+
513
+ .yith-icon-drag:before {
514
+ content: "\e90f";
515
+ color: #757575;
516
+ }
517
+
518
+ .yith-icon-trash:before {
519
+ content: "\e90d";
520
+ color: #757575;
521
+ }
522
+
523
+ .yith-icon-info:before {
524
+ content: "\e90e";
525
+ color: #757575;
526
+ }
527
+
528
+ .yith-icon-arrow_down:before {
529
+ content: "\e900";
530
+ color: #757575;
531
+ }
532
+
533
+ .yith-icon-arrow_left:before {
534
+ content: "\e901";
535
+ color: #757575;
536
+ }
537
+
538
+ .yith-icon-arrow_right:before {
539
+ content: "\e902";
540
+ color: #757575;
541
+ }
542
+
543
+ .yith-icon-arrow_up:before {
544
+ content: "\e903";
545
+ color: #757575;
546
+ }
547
+
548
+ .yith-icon-calendar:before {
549
+ content: "\e904";
550
+ color: #757575;
551
+ }
552
+
553
+ .yith-icon-check:before {
554
+ content: "\e905";
555
+ color: #757575;
556
+ }
557
+
558
+ .yith-icon-close:before {
559
+ content: "\e906";
560
+ color: #757575;
561
+ }
562
+
563
+ .yith-icon-edit:before {
564
+ content: "\e907";
565
+ color: #757575;
566
+ }
567
+
568
+ .yith-icon-magnifier:before {
569
+ content: "\e908";
570
+ color: #757575;
571
+ }
572
+
573
+ .yith-icon-pencil:before {
574
+ content: "\e909";
575
+ color: #757575;
576
+ }
577
+
578
+ .yith-icon-plus:before {
579
+ content: "\e90a";
580
+ color: #757575;
581
+ }
582
+
583
+ .yith-icon-update:before {
584
+ content: "\e90b";
585
+ color: #757575;
586
+ }
587
+
588
+ .yith-icon-upload:before {
589
+ content: "\e90c";
590
+ color: #757575;
591
+ }
592
+
593
+ .yith-plugin-fw-banner {
594
+ width: 100%;
595
+ height: 75px;
596
+ background: url('../images/banner-premium.png');
597
+ }
598
+
599
+ .yith-plugin-fw-banner.yith-plugin-fw-banner-free {
600
+ height: 290px;
601
+ background: url('../images/banner-free.png') no-repeat;
602
+ }
603
+
604
+ .yith-plugin-fw-banner.yith-plugin-fw-banner-free h1 {
605
+ max-width: auto;
606
+ text-align: left;
607
+ margin-left: 110px;
608
+ padding-top: 15px;
609
+ padding-bottom: 8px;
610
+ }
611
+
612
+ .yith-plugin-fw-banner h1 {
613
+ text-transform: uppercase;
614
+ color: #0c5777;
615
+ font-size: 15px;
616
+ padding-left: 150px;
617
+ font-weight: 700;
618
+ text-align: left;
619
+ display: inline-block;
620
+ box-sizing: border-box;
621
+ }
622
+
623
+ .yith-plugin-fw-banner span {
624
+ font-style: italic;
625
+ display: block;
626
+ font-size: 15px;
627
+ color: #214249;
628
+ text-transform: none;
629
+ text-align: right;
630
+ }
631
+
632
+ .yith-plugin-fw-banner a,
633
+ .yith-plugin-fw-banner a:focus {
634
+ text-decoration: none;
635
+ outline: none;
636
+ box-shadow: none;
637
+ }
638
+
639
+ .yith-banners ul {
640
+ list-style: none;
641
+ margin-left: 10px;
642
+ }
643
+
644
+ .yith-banners ul li {
645
+ display: inline-block;
646
+ margin-left: 10px;
647
+ }
648
+
649
+ .yith-plugin-ui a {
650
+ outline: none;
651
+ box-shadow: none;
652
+ }
653
+
654
+ .yith-plugin-ui {
655
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
656
+ }
657
+
658
+ .yith-plugin-ui #wpwrap h2.nav-tab-wrapper, .yith-plugin-ui #wpbody-content h2.nav-tab-wrapper {
659
+ margin-top: 10px;
660
+ }
661
+
662
+ .yith-plugin-ui .nav-tab {
663
+ margin-left: 0px;
664
+ margin-right: 2px;
665
+ background-color: #336374;
666
+ color: #fff;
667
+ font-size: 15px;
668
+ padding: 7px 20px;
669
+ border: 0;
670
+ }
671
+
672
+ .yith-plugin-ui .nav-tab:first-child {
673
+ border-left: 1px solid #d9d9d9;
674
+ }
675
+
676
+ .yith-plugin-ui .nav-tab.yith-premium {
677
+ background-color: #be421c;
678
+ }
679
+
680
+ .yith-plugin-ui .nav-tab-active {
681
+ background-color: #fff;
682
+ color: #336374;
683
+ border-bottom: 1px solid #fff;
684
+ }
685
+
686
+ .yith-plugin-ui .nav-tab-active.yith-premium {
687
+ background-color: #fff;
688
+ color: #be421c;
689
+ }
690
+
691
+ .yith-plugin-ui #plugin-fw-wc {
692
+ padding-top: 0px;
693
+ }
694
+
695
+ .yith-plugin-ui .form-table td {
696
+ padding: 15px 20px;
697
+ }
698
+
699
+ .yith-plugin-ui.metaboxes-tab label {
700
+ color: #33373b;
701
+ font-size: 14px;
702
+ margin-left: -248px;
703
+ }
704
+
705
+ .yith-plugin-ui.metaboxes-tab .the-metabox {
706
+ margin: 40px 0 40px 290px;
707
+ margin-left: 264px;
708
+ }
709
+
710
+ .yith-plugin-ui.metaboxes-tab label {
711
+ width: 200px;
712
+ font-weight: 600;
713
+ }
714
+
715
+ .yith-plugin-ui span.description {
716
+ color: #716269;
717
+ font-size: 14px;
718
+ font-style: normal;
719
+ font-weight: 400;
720
+ margin-top: 15px;
721
+ margin-left: 0;
722
+ }
723
+
724
+ #wpwrap .yith-plugin-ui h2.nav-tab-wrapper, #wpbody-content .yith-plugin-ui h2.nav-tab-wrapper {
725
+ border: 0;
726
+ border-bottom: 1px solid #ccc;
727
+ margin-right: 15px;
728
+ margin-bottom: 0;
729
+ background-color: transparent;
730
+ padding-left: 0;
731
+ }
732
+
733
+ .yith-plugin-ui #plugin-fw-wc table.form-table,
734
+ .yith-plugin-ui #yith-plugin-fw-panel table.form-table,
735
+ .yith-plugin-ui table.form-table {
736
+ border: 1px solid #d8d8d8;
737
+ border-top: 0;
738
+ margin-bottom: 40px;
739
+ }
740
+
741
+ .yith-plugin-ui #wpwrap h2.nav-tab-wrapper, .yith-plugin-ui #wpbody-content h2.nav-tab-wrapper {
742
+ background-color: transparent;
743
+ border: 0;
744
+ text-transform: none;
745
+ border-bottom: 1px solid #ddd;
746
+ }
747
+
748
+ .yith-plugin-ui h2 {
749
+ color: #2a8db0;
750
+ font-size: 15px;
751
+ text-transform: uppercase;
752
+ border: 1px solid #d8d8d8;
753
+ border-bottom: 0;
754
+ background-color: #fff;
755
+ padding: 35px 20px;
756
+ margin: 0px;
757
+ }
758
+
759
+ .yith-plugin-ui .yith-plugin-fw-custom-tab h2 {
760
+ border: 0px solid #d8d8d8;
761
+ padding-left: 0;
762
+ }
763
+
764
+ .yith-plugin-ui #plugin-fw-wc table.form-table th, #yith-plugin-fw-panel table.form-table th.titledesc, .yith-plugin-ui #plugin-fw-wc table.form-table td, #yith-plugin-fw-panel table.form-table td.forminp {
765
+ padding: 30px 20px;
766
+ }
767
+
768
+ .yith-plugin-ui #plugin-fw-wc h2 + div {
769
+ background: #fff;
770
+ border-left: 1px solid #d9d9d9;
771
+ border-right: 1px solid #d9d9d9;
772
+ margin: -20px 0 0 0;
773
+ padding-left: 20px;
774
+ padding-bottom: 5px;
775
+ }
776
+
777
+ .yith-plugin-ui #plugin-fw-wc h2 + div p, .yith-plugin-ui p.info-box {
778
+ background: #f1f1f1;
779
+ font-size: 14px;
780
+ font-weight: 700;
781
+ width: 40%;
782
+ display: block;
783
+ padding: 15px;
784
+ margin-bottom: 0;
785
+ }
786
+
787
+ .yith-plugin-ui #plugin-fw-wc h2 + div p:before, .yith-plugin-ui p.info-box:before {
788
+ content: "\e90e";
789
+ font-family: yith-icon;
790
+ font-size: 30px;
791
+ font-weight: normal;
792
+ display: block;
793
+ margin-top: -5px;
794
+ float: left;
795
+ margin-right: 15px;
796
+ }
797
+
798
+ .yith-plugin-ui h2:first-child {
799
+ border-top: 0;
800
+ }
801
+
802
+ /*** Icon ***/
803
+ .yith-plugin-ui span.yith-icon {
804
+ margin-left: -36px;
805
+ line-height: 36px;
806
+ font-size: 20px;
807
+ }
808
+
809
+ /*** General Input Style ***/
810
+
811
+ .yith-plugin-ui .yith-plugin-fw select,
812
+ .yith-plugin-ui textarea,
813
+ .yith-plugin-ui input[type=number],
814
+ .yith-plugin-ui.metaboxes-tab input[type=number],
815
+ .yith-plugin-ui input[type=text],
816
+ .yith-plugin-ui input[type=text],
817
+ .yith-plugin-ui input[type=email],
818
+ .yith-plugin-ui input[type=password],
819
+ .yith-plugin-ui .search-box input[name="s"],
820
+ .yith-plugin-fw.yith-plugin-ui input[type=text]:not(.select2-search__field),
821
+ .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table input[type=text]:not(.select2-search__field),
822
+ .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table select,
823
+ .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table textarea,
824
+ .woocommerce .yith-plugin-fw table.form-table input[type=password],
825
+ .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table input[type=number],
826
+ .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table input[type=text] {
827
+ border: 1px solid #d8d8d8;
828
+ border-radius: 8px;
829
+ padding: 8px 10px;
830
+ height: 38px;
831
+ min-width: 90px;
832
+ box-shadow: none;
833
+ color: #716269;
834
+ }
835
+
836
+ .yith-plugin-ui textarea,
837
+ .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table textarea {
838
+ height: auto;
839
+ }
840
+
841
+ .yith-plugin-ui table.form-table input[type=text].wp-color-picker,
842
+ .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table input[type=text].wp-color-picker {
843
+ border: 0;
844
+ height: 30px;
845
+ max-width: 121px;
846
+ font-size: 11px;
847
+ padding: 0;
848
+
849
+ }
850
+
851
+ .yith-plugin-ui .search-box input[name="s"] {
852
+ height: 35px;
853
+ }
854
+
855
+ .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table input[type=text].small-text,
856
+ .yith-plugin-ui input[type=text].small-text {
857
+ width: 100px;
858
+ height: 25px;
859
+ border: 1px solid #d9d9d9;
860
+ }
861
+
862
+ .yith-plugin-ui textarea {
863
+ height: auto;
864
+ padding: 8px;
865
+ }
866
+
867
+ .yith-plugin-ui select:focus,
868
+ .yith-plugin-ui input:focus {
869
+ border-color: #a7d9ec !important;
870
+ }
871
+
872
+ .woocommerce .yith-plugin-ui table.form-table select,
873
+ .yith-plugin-ui select {
874
+ -webkit-appearance: none;
875
+ line-height: 1.2em;
876
+ min-height: 35px;
877
+ background: url("../images/arrow_down.svg") no-repeat right center;
878
+ background-size: 35px 13px;
879
+ border-radius: 8px;
880
+ padding-left: 10px;
881
+ }
882
+
883
+ .yith-plugin-ui .form-table th {
884
+ width: 200px;
885
+ padding-right: 50px;
886
+ }
887
+
888
+ /** BUTTONS **/
889
+ .wp-core-ui .yith-plugin-ui .button-primary,
890
+ .wp-core-ui .yith-plugin-ui .button-secondary,
891
+ .yith-plugin-ui .yith-add-button,
892
+ .yith-plugin-ui .yith-save-button,
893
+ .yith-plugin-ui .yith-edit-button,
894
+ .yith-plugin-ui .yith-update-button,
895
+ .yith-plugin-ui .yith-plugin-fw-select-all,
896
+ .yith-plugin-ui .yith-plugin-fw-deselect-all,
897
+ .yith-plugin-ui .yith-plugin-fw-upload-button,
898
+ .yith-plugin-ui .yith-plugin-fw-upload-button-reset {
899
+ border-radius: 3px;
900
+ text-transform: uppercase;
901
+ box-shadow: none;
902
+ border: 0;
903
+ font-weight: 700;
904
+ font-size: 11px;
905
+ padding: 0px 14px;
906
+ outline: none;
907
+ height: auto;
908
+ transition: all ease 0.3s;
909
+ background-color: #d6d6d6;
910
+ color: #656565;
911
+ text-shadow: none;
912
+ vertical-align: middle;
913
+ line-height: 26px;
914
+ display: inline-block;
915
+ text-decoration: none;
916
+ cursor: pointer;
917
+ }
918
+
919
+ .wp-core-ui .yith-plugin-ui .button-secondary.yith-plugin-fw-upload-button-reset,
920
+ .wp-core-ui .yith-plugin-ui .button-secondary.yith-plugin-fw-upload-button,
921
+ .yith-plugin-ui .yith-plugin-fw-upload-button-reset,
922
+ .yith-plugin-ui .button-secondary.yith-plugin-fw-upload-button-reset,
923
+ .yith-plugin-ui .button-secondary.yith-plugin-fw-upload-button {
924
+ height: 38px;
925
+ }
926
+
927
+ .wp-core-ui .yith-plugin-ui .button:focus,
928
+ .wp-core-ui .yith-plugin-ui .button-primary:focus,
929
+ .yith-plugin-ui .yith-add-button:focus,
930
+ .yith-plugin-ui .yith-save-button:focus,
931
+ .yith-plugin-ui .yith-edit-button:focus,
932
+ .yith-plugin-ui .yith-update-button:focus,
933
+ .wp-core-ui .yith-plugin-ui .button-secondary:focus {
934
+ outline: none;
935
+ box-shadow: none;
936
+ }
937
+
938
+ .wp-core-ui .yith-plugin-ui .button-xl {
939
+ padding: 0px 20px;
940
+ font-size: 14px;
941
+ line-height: 38px;
942
+ display: inline-block;
943
+ font-weight: 600;
944
+ }
945
+
946
+ /** button with inside a span with icon class */
947
+ .yith-plugin-ui .button-secondary span.yith-icon {
948
+ margin-left: 0px;
949
+ margin-right: 10px;
950
+ line-height: normal;
951
+ }
952
+
953
+ .yith-plugin-ui .button-secondary span.yith-icon:before {
954
+ color: #656565;
955
+ font-size: 15px;
956
+ }
957
+
958
+
959
+ .wp-core-ui .yith-plugin-ui .button:focus,
960
+ .wp-core-ui .yith-plugin-ui .button-secondary:focus,
961
+ .yith-plugin-ui .yith-save-button:hover,
962
+ .wp-core-ui .yith-plugin-ui .button-secondary:hover,
963
+ .yith-plugin-ui .yith-plugin-fw-upload-button-reset:hover {
964
+ background-color: #cacaca;
965
+ color: #515151;
966
+ }
967
+
968
+ .wp-core-ui .yith-plugin-ui .button-primary,
969
+ .yith-plugin-ui .button-secondary.yith-plugin-fw-select-all,
970
+ .yith-plugin-ui .button-secondary.yith-plugin-fw-upload-button {
971
+ background-color: #007694;
972
+ color: #fff;
973
+ }
974
+
975
+
976
+ .yith-plugin-ui .yith-add-button,
977
+ .wp-core-ui .yith-plugin-ui .button-primary:focus,
978
+ .wp-core-ui .yith-plugin-ui .button-primary:hover {
979
+ background-color: #375f6b;
980
+ color: #fff;
981
+ cursor: pointer;
982
+ }
983
+
984
+
985
+ .yith-plugin-ui .yith-add-button:hover,
986
+ .wp-core-ui .yith-plugin-ui .yith-plugin-fw-upload-button:focus,
987
+ .yith-plugin-ui .button-secondary.yith-plugin-fw-select-all:hover,
988
+ .yith-plugin-ui .button-secondary.yith-plugin-fw-select-all:focus,
989
+ .yith-plugin-ui .yith-plugin-fw-upload-button:hover {
990
+ border-color: #007694;
991
+ background: #007694;
992
+ color: #fff;
993
+ line-height: 26px;
994
+ margin-left: 0;
995
+ }
996
+
997
+ .yith-plugin-ui .button-primary:before,
998
+ .yith-plugin-ui .yith-add-button:before,
999
+ .yith-plugin-ui .yith-save-button:before,
1000
+ .yith-plugin-ui .yith-edit-button:before,
1001
+ .yith-plugin-ui .yith-update-button:before,
1002
+ .yith-plugin-ui .button-secondary:before {
1003
+ font-family: 'yith-icon';
1004
+ font-size: 10px;
1005
+ font-weight: 700;
1006
+ margin-right: 10px;
1007
+ vertical-align: bottom;
1008
+ display: inline-block;
1009
+ }
1010
+
1011
+ /** yith-edit-button **/
1012
+ .yith-plugin-ui .yith-edit-button {
1013
+ background-color: #7f9298;
1014
+ color: #fff;
1015
+ }
1016
+
1017
+ .yith-plugin-ui .yith-edit-button:focus,
1018
+ .yith-plugin-ui .yith-edit-button:hover {
1019
+ background-color: #718085;
1020
+ color: #fff;
1021
+ }
1022
+
1023
+ .yith-plugin-ui .yith-edit-button:before {
1024
+ content: "\e907";
1025
+ }
1026
+
1027
+ /** yith-update-button **/
1028
+ .yith-plugin-ui .yith-update-button {
1029
+ background-color: #94aa09;
1030
+ color: #fff;
1031
+ }
1032
+
1033
+ .yith-plugin-ui .yith-update-button:focus,
1034
+ .yith-plugin-ui .yith-update-button:hover {
1035
+ background-color: #7a9009;
1036
+ color: #fff;
1037
+ }
1038
+
1039
+ .yith-plugin-ui .yith-update-button:before {
1040
+ content: "\e90b";
1041
+ font-size: 15px;
1042
+ }
1043
+
1044
+ /** yith-save-button **/
1045
+
1046
+ .yith-plugin-ui .yith-save-button {
1047
+ background-color: #267390;
1048
+ color: #fff;
1049
+ }
1050
+
1051
+ .yith-plugin-ui .yith-save-button:focus,
1052
+ .yith-plugin-ui .yith-save-button:hover {
1053
+ background-color: #1c4863;
1054
+ color: #fff;
1055
+ }
1056
+
1057
+
1058
+ /** yith-remove-button **/
1059
+
1060
+ .yith-plugin-ui .button-secondary.yith-remove-button:before {
1061
+ content: "\e90d";
1062
+ font-size: 15px;
1063
+ }
1064
+
1065
+
1066
+ /** yith-add-button **/
1067
+ .yith-plugin-ui .yith-add-button:before {
1068
+ content: "\e90a";
1069
+ }
1070
+
1071
+ .yith-plugin-ui .yith-add-button.closed {
1072
+ background-color: #fff;
1073
+ color: #375f6b;
1074
+ border: 1px solid #375f6b;
1075
+ }
1076
+
1077
+ .yith-plugin-ui .yith-add-button.closed:before {
1078
+ content: "\e906";
1079
+ }
1080
+
1081
+
1082
+ /** yith-plugin-fw-upload-button **/
1083
+ .yith-plugin-ui button.yith-plugin-fw-upload-button:before {
1084
+ content: "\e90c";
1085
+ font-family: 'yith-icon';
1086
+ font-size: 19px;
1087
+ font-weight: 400;
1088
+ margin-right: 10px;
1089
+ vertical-align: middle;
1090
+ display: inline-block;
1091
+ }
1092
+
1093
+ /** SELECT 2 **/
1094
+ .yith-plugin-ui .select2-container,
1095
+ .yith-plugin-ui .select2-selection--single {
1096
+ height: auto;
1097
+ padding: 2px;
1098
+ outline: none;
1099
+ }
1100
+
1101
+ .yith-plugin-ui .select2-selection--single {
1102
+ margin: 0;
1103
+ border: 0;
1104
+ }
1105
+
1106
+ /* old panel*/
1107
+
1108
+ .yith-plugin-ui span.select2.select2-container.select2-container--default {
1109
+ border: 1px solid #d8d8d8;
1110
+ border-radius: 8px;
1111
+ }
1112
+
1113
+ .yith-plugin-ui span.select2.select2-container.select2-container--default:hover,
1114
+ .yith-plugin-ui span.select2.select2-container.select2-container--default:active,
1115
+ .yith-plugin-ui span.select2.select2-container.select2-container--default:focus {
1116
+ border-color: #a7d9ec;
1117
+ }
1118
+
1119
+ .yith-plugin-ui .select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
1120
+ color: #fff;
1121
+ }
1122
+
1123
+ .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table input[type=text].select2-search__field,
1124
+ .yith-plugin-ui .yith-plugin-fw table.form-table input.select2-search__field {
1125
+ border: 0;
1126
+ padding: 0;
1127
+ height: initial;
1128
+ }
1129
+
1130
+ .yith-plugin-ui .select2-container--default .select2-selection--multiple .select2-selection__choice,
1131
+ .yith-plugin-ui .select2-selection__choice {
1132
+ color: #fff;
1133
+ background-color: #4e8ba2;
1134
+ border-radius: 12px;
1135
+ padding: 3px 11px;
1136
+ border-color: #33937e;
1137
+ font-size: 13px;
1138
+ }
1139
+
1140
+ .yith-plugin-ui .select2-container--default .select2-selection--single .select2-selection__arrow:before {
1141
+ content: "\e900";
1142
+ font-family: 'yith-icon' !important;
1143
+ line-height: 36px;
1144
+ color: #d9d9d9;
1145
+ }
1146
+
1147
+ .yith-plugin-ui .select2-container--default .select2-selection--single .select2-selection__arrow b {
1148
+ display: none;
1149
+ }
1150
+
1151
+ .yith-plugin-ui .select2-container--open .select2-dropdown--below,
1152
+ .yith-plugin-ui .select2-container--open .select2-dropdown--above,
1153
+ .yith-plugin-fw-panel .select2-container--open .select2-dropdown--below,
1154
+ .yith-plugin-fw-panel .select2-container--open .select2-dropdown--above {
1155
+ margin-top: 10px;
1156
+ border-radius: 8px;
1157
+ box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), 0 2px 10px 0 rgba(0, 0, 0, 0.12) !important;
1158
+ }
1159
+
1160
+ .yith-plugin-ui .select2-container--open .select2-dropdown--above,
1161
+ .yith-plugin-fw-panel .select2-container--open .select2-dropdown--above {
1162
+ margin-top: -10px;
1163
+ }
1164
+
1165
+ .yith-plugin-ui .select2-container--default.select2-container--open.select2-container--below .select2-selection--single,
1166
+ .yith-plugin-ui .select2-container--default.select2-container--open.select2-container--above .select2-selection--single,
1167
+ .yith-plugin-fw-panel .select2-container--default.select2-container--open.select2-container--below .select2-selection--single,
1168
+ .yith-plugin-fw-panel .select2-container--default.select2-container--open.select2-container--above .select2-selection--single {
1169
+ border-radius: 8px;
1170
+ }
1171
+
1172
+ .yith-plugin-ui .select2-results .select2-results__group, .select2-results .select2-results__option:first-child,
1173
+ .yith-plugin-fw-panel .select2-results .select2-results__group, .select2-results .select2-results__option:first-child {
1174
+ border-top-left-radius: 8px;
1175
+ border-top-right-radius: 8px;
1176
+ }
1177
+ .yith-plugin-ui .select2-results .select2-results__group, .select2-results .select2-results__option:last-child,
1178
+ .yith-plugin-fw-panel .select2-results .select2-results__group, .select2-results .select2-results__option:last-child,
1179
+ .yith-plugin-ui .select2-results .select2-results__group,
1180
+ .yith-plugin-ui .select2-results .select2-results__option:last-child,
1181
+ .yith-plugin-fw-panel .select2-results .select2-results__group,
1182
+ .yith-plugin-fw-panel .select2-results .select2-results__option:last-child,
1183
+ .yith-plugin-ui .select2-results .select2-results__group,
1184
+ .yith-plugin-ui .select2-results .select2-results__option:last-child,
1185
+ .yith-plugin-fw-panel .select2-results .select2-results__group,
1186
+ .yith-plugin-fw-panel .select2-results .select2-results__option:last-child {
1187
+ border-bottom-left-radius: 8px;
1188
+ border-bottom-right-radius: 8px;
1189
+ }
1190
+
1191
+ .yith-plugin-ui .select2-dropdown{
1192
+ border: 0;
1193
+ }
1194
+ .yith-plugin-ui .select2-container--default .select2-results__option[data-selected=true],
1195
+ .yith-plugin-ui .select2-container--default .select2-results__option[aria-selected=true],
1196
+ .yith-plugin-fw-panel .select2-container--default .select2-results__option[data-selected=true],
1197
+ .yith-plugin-fw-panel .select2-container--default .select2-results__option[aria-selected=true] {
1198
+ background-color: #fff;
1199
+ outline: none;
1200
+ }
1201
+
1202
+ .yith-plugin-ui .select2-container--default .select2-results__option--highlighted[aria-selected],
1203
+ .yith-plugin-ui .select2-container--default .select2-results__option--highlighted[data-selected],
1204
+ .yith-plugin-fw-panel .select2-container--default .select2-results__option--highlighted[aria-selected],
1205
+ .yith-plugin-fw-panel .select2-container--default .select2-results__option--highlighted[data-selected] {
1206
+ background-color: #e8eff1;
1207
+ color: #4e8ba2;
1208
+ outline: none;
1209
+ }
1210
+
1211
+ .yith-plugin-ui .select2-container--default .select2-selection--multiple .select2-selection__choice__remove,
1212
+ .yith-plugin-fw-panel .select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
1213
+ float: right;
1214
+ padding-left: 15px;
1215
+ text-indent: -9999px;
1216
+ }
1217
+
1218
+
1219
+ .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:after,
1220
+ .woocommerce .yith-plugin-ui .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:after,
1221
+ .yith-plugin-ui .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:after {
1222
+ float: right;
1223
+ color: #fff;
1224
+ content: "\e906";
1225
+ font-family: 'yith-icon' !important;
1226
+ font-size: 9px;
1227
+ line-height: 21px;
1228
+ text-indent: 0;
1229
+ }
1230
+
1231
+ .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:after {
1232
+ color: #000;
1233
+ }
1234
+
1235
+ .yith-plugin-ui .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:after
1236
+ .yith-plugin-fw-panel .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:after {
1237
+ color: #000;
1238
+ }
1239
+
1240
+ .yith-plugin-ui .select2-container .select2-selection--multiple,
1241
+ .yith-plugin-ui .select2-container--default.select2-container--focus .select2-selection--multiple {
1242
+ border: 0;
1243
+ }
1244
+
1245
+ .yith-plugin-fw .select2-search input[type=text] {
1246
+ border: 0;
1247
+ padding: 0;
1248
+ height: auto;
1249
+ }
1250
+
1251
+ .yith-plugin-ui .yith-plugin-fw-select-field-wrapper span.yith-icon.yith-icon-magnifier,
1252
+ .yith-plugin-fw-panel .yith-plugin-fw-select-field-wrapper span.yith-icon.yith-icon-magnifier {
1253
+ position: absolute;
1254
+ padding-top: 5px;
1255
+ }
1256
+
1257
+ .yith-plugin-ui input[type=text].select2-search__field {
1258
+ border: 0;
1259
+ padding: 0;
1260
+ height: 30px;
1261
+ }
1262
+
1263
+ .yith-plugin-ui .select2-container--default .select2-search--dropdown .select2-search__field,
1264
+ .yith-plugin-fw-panel .select2-container--default .select2-search--dropdown .select2-search__field {
1265
+ border: 1px solid #d9d9d9;
1266
+ border-radius: 8px;
1267
+ box-shadow: none;
1268
+ }
1269
+
1270
+ .yith-plugin-ui .select2-dropdown,
1271
+ .yith-plugin-fw-panel .select2-dropdown {
1272
+ border: 1px solid #d9d9d9;
1273
+ }
1274
+
1275
+ /** RADIO BUTTON **/
1276
+ .yith-plugin-ui [type="radio"]:checked,
1277
+ .yith-plugin-ui [type="radio"]:not(:checked) {
1278
+ position: absolute;
1279
+ left: -9999px;
1280
+ }
1281
+
1282
+ .yith-plugin-ui [type="radio"]:checked + label,
1283
+ .yith-plugin-ui [type="radio"]:not(:checked) + label {
1284
+ position: relative;
1285
+ padding-left: 35px;
1286
+ cursor: pointer;
1287
+ line-height: 20px;
1288
+ display: inline-block;
1289
+ color: #716269;
1290
+ font-size: 14px;
1291
+ }
1292
+
1293
+ .yith-plugin-ui [type="radio"]:checked + label:before,
1294
+ .yith-plugin-ui [type="radio"]:not(:checked) + label:before {
1295
+ content: '';
1296
+ position: absolute;
1297
+ left: 0;
1298
+ top: 0;
1299
+ width: 19px;
1300
+ height: 19px;
1301
+ border: 1px solid #d8d8d8;
1302
+ border-radius: 100%;
1303
+ background: #fff;
1304
+ }
1305
+
1306
+ .yith-plugin-ui [type="radio"]:checked + label:after,
1307
+ .yith-plugin-ui [type="radio"]:not(:checked) + label:after {
1308
+ content: '';
1309
+ width: 13px;
1310
+ height: 13px;
1311
+ background: #4e8ba2;
1312
+ position: absolute;
1313
+ top: 4px;
1314
+ left: 4px;
1315
+ border-radius: 100%;
1316
+ -webkit-transition: all 0.2s ease;
1317
+ transition: all 0.2s ease;
1318
+ }
1319
+
1320
+ .yith-plugin-ui [type="radio"]:not(:checked) + label:after {
1321
+ opacity: 0;
1322
+ -webkit-transform: scale(0);
1323
+ transform: scale(0);
1324
+ }
1325
+
1326
+ .yith-plugin-ui [type="radio"]:checked + label:after {
1327
+ opacity: 1;
1328
+ -webkit-transform: scale(1);
1329
+ transform: scale(1);
1330
+ }
1331
+
1332
+ /** CHECKBOX **/
1333
+ .yith-plugin-ui input[type="checkbox"] {
1334
+ -webkit-appearance: none;
1335
+ background-color: #fff;
1336
+ border: 1px solid #d8d8d8;
1337
+ box-shadow: none;
1338
+ width: 18px;
1339
+ height: 18px;
1340
+ border-radius: 3px;
1341
+ display: inline-block;
1342
+ position: relative;
1343
+ margin-right: 10px;
1344
+ }
1345
+
1346
+ .yith-plugin-ui input[type="checkbox"]:checked {
1347
+ background-color: #4e8ba2;
1348
+ border-color: #488197;
1349
+ }
1350
+
1351
+ .yith-plugin-ui .forminp-checkbox span.description.inline {
1352
+ margin-left: 10px;
1353
+ }
1354
+
1355
+ .yith-plugin-ui input[type="checkbox"]:checked:before {
1356
+ display: none;
1357
+ }
1358
+
1359
+ .yith-plugin-ui input[type="checkbox"]:checked:after {
1360
+ content: "\e905";
1361
+ font-family: 'yith-icon';
1362
+ font-size: 15px;
1363
+ position: absolute;
1364
+ top: 8px;
1365
+ left: 1px;
1366
+ color: #fff;
1367
+ }
1368
+
1369
+ /** ONOFF **/
1370
+ .yith-plugin-ui .yith-plugin-fw-onoff-container input[type="checkbox"] {
1371
+ display: none;
1372
+ }
1373
+
1374
+ .yith-plugin-ui .yith-plugin-fw-onoff-container input + span {
1375
+ border: 1px solid #d8d8d8;
1376
+ background-color: #fff;
1377
+ width: 60px;
1378
+ height: 24px;
1379
+ }
1380
+
1381
+ .yith-plugin-ui .yith-plugin-fw-onoff-container input + span:before {
1382
+ background-color: #d8d8d8;
1383
+ }
1384
+
1385
+ .yith-plugin-ui .yith-plugin-fw-onoff-container input + span:before {
1386
+ width: 14px;
1387
+ height: 14px;
1388
+ top: 5px;
1389
+ left: 6px;
1390
+ background-color: #d8d8d8;
1391
+ }
1392
+
1393
+ .yith-plugin-ui .yith-plugin-fw-onoff-container input + span:after {
1394
+ content: 'OFF';
1395
+ width: 14px;
1396
+ height: 14px;
1397
+ font-size: 13px;
1398
+ font-weight: 600;
1399
+ padding-left: 27px;
1400
+ color: #979797;
1401
+ margin-top: 5px;
1402
+ display: inline-block;
1403
+ }
1404
+
1405
+ .yith-plugin-ui .yith-plugin-fw-onoff-container input:checked + span,
1406
+ .yith-plugin-ui .yith-plugin-fw-onoff-container input.onoffchecked + span {
1407
+ background-color: #fff;
1408
+ border-color: #98aa36;
1409
+ }
1410
+
1411
+ .yith-plugin-ui .yith-plugin-fw-onoff-container input:checked + span:before,
1412
+ .yith-plugin-ui.yith-plugin-fw-onoff-container input.onoffchecked + span:before {
1413
+ background-color: #98aa36;
1414
+ left: 41px;
1415
+ }
1416
+
1417
+ .yith-plugin-ui .yith-plugin-fw-onoff-container input:checked + span:after,
1418
+ .yith-plugin-ui.yith-plugin-fw-onoff-container input.onoffchecked + span:after {
1419
+ content: 'ON';
1420
+ color: #98aa36;
1421
+ width: 14px;
1422
+ height: 14px;
1423
+ display: inline-block;
1424
+ font-size: 13px;
1425
+ font-weight: 600;
1426
+ padding: 0 10px;
1427
+ margin-top: 5px;
1428
+ }
1429
+
1430
+ .yith-plugin-ui .yith-plugin-fw-onoff-container input + span {
1431
+ text-indent: 0;
1432
+ }
1433
+
1434
+
1435
+ /**
1436
+ DATEPICKER
1437
+ */
1438
+ .yith-plugin-ui div#ui-datepicker-div,
1439
+ .yith-plugin-fw-panel div#ui-datepicker-div {
1440
+ border: 0;
1441
+ box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), 0 2px 10px 0 rgba(0, 0, 0, 0.12) !important;
1442
+ }
1443
+
1444
+ .yith-plugin-ui .ui-datepicker-header.ui-widget-header,
1445
+ .yith-plugin-fw-panel .ui-datepicker-header.ui-widget-header {
1446
+ background: #4e8ba2;
1447
+ color: #fff;
1448
+ font-size: 11px;
1449
+ line-height: 25px;
1450
+ border: 0;
1451
+ min-height: 25px;
1452
+ }
1453
+
1454
+ .yith-plugin-ui .ui-datepicker-title,
1455
+ .yith-plugin-fw-panel .ui-datepicker-title {
1456
+ line-height: 25px;
1457
+ }
1458
+
1459
+ .yith-plugin-ui .ui-datepicker th,
1460
+ .yith-plugin-fw-panel .ui-datepicker th {
1461
+ color: #716269;
1462
+ }
1463
+
1464
+ .yith-plugin-ui .ui-widget-header .ui-icon,
1465
+ .yith-plugin-ui .ui-widget-header .ui-state-hover,
1466
+ .yith-plugin-ui .ui-datepicker .ui-datepicker-prev,
1467
+ .yith-plugin-ui .ui-datepicker .ui-datepicker-next,
1468
+ .yith-plugin-ui .ui-icon.ui-icon-circle-triangle-w,
1469
+ .yith-plugin-ui .ui-icon.ui-icon-circle-triangle-e,
1470
+ .yith-plugin-fw-panel .ui-widget-header .ui-icon,
1471
+ .yith-plugin-fw-panel .ui-widget-header .ui-state-hover,
1472
+ .yith-plugin-fw-panel .ui-datepicker .ui-datepicker-prev,
1473
+ .yith-plugin-fw-panel .ui-datepicker .ui-datepicker-next,
1474
+ .yith-plugin-fw-panel .ui-icon.ui-icon-circle-triangle-w,
1475
+ .yith-plugin-fw-panel .ui-icon.ui-icon-circle-triangle-e {
1476
+ background: none;
1477
+ content: "";
1478
+ border: 0;
1479
+ text-indent: 0;
1480
+ width: 15px;
1481
+ height: 20px;
1482
+ display: block;
1483
+ overflow: hidden;
1484
+ }
1485
+
1486
+ .yith-plugin-ui .yith-password-wrapper {
1487
+ display: inline-block;
1488
+ width: auto;
1489
+ position: relative;
1490
+ }
1491
+
1492
+ .yith-plugin-ui .yith-password-wrapper .yith-password-eye-closed:before,
1493
+ .yith-plugin-ui .yith-password-wrapper .yith-password-eye:before {
1494
+ content: '\e911';
1495
+ color: #999;
1496
+ font-family: 'yith-icon';
1497
+ font-size: 20px;
1498
+ font-weight: normal;
1499
+ width: 15px;
1500
+ display: block;
1501
+ position: absolute;
1502
+ right: 13px;
1503
+ top: 0;
1504
+ line-height: 38px;
1505
+ bottom: 0;
1506
+ cursor: pointer;
1507
+ }
1508
+
1509
+ .yith-plugin-ui .yith-password-wrapper .yith-password-eye-closed:before {
1510
+ content: '\e912';
1511
+ }
1512
+
1513
+ .yith-plugin-ui .ui-icon.ui-icon-circle-triangle-w:before,
1514
+ .yith-plugin-fw-panel .ui-icon.ui-icon-circle-triangle-w:before {
1515
+ content: "\e901";
1516
+ color: #fff;
1517
+ font-family: 'yith-icon';
1518
+ font-size: 12px;
1519
+ font-weight: normal;
1520
+ width: 15px;
1521
+ display: block;
1522
+ }
1523
+
1524
+ .yith-plugin-ui .ui-icon.ui-icon-circle-triangle-e:before,
1525
+ .yith-plugin-fw-panel .ui-icon.ui-icon-circle-triangle-e:before {
1526
+ content: "\e902";
1527
+ color: #fff;
1528
+ text-indent: 0;
1529
+ font-family: 'yith-icon';
1530
+ font-size: 12px;
1531
+ font-weight: normal;
1532
+ width: 15px;
1533
+ display: block;
1534
+ }
1535
+
1536
+ /* arrow */
1537
+ .yith-plugin-ui .ui-datepicker .ui-datepicker-prev,
1538
+ .yith-plugin-ui .ui-datepicker .ui-datepicker-next,
1539
+ .yith-plugin-ui .ui-datepicker-prev.ui-datepicker-prev-hover,
1540
+ .yith-plugin-ui .ui-datepicker-prev.ui-datepicker-next-hover,
1541
+ .yith-plugin-fw-panel .ui-datepicker .ui-datepicker-prev,
1542
+ .yith-plugin-fw-panel .ui-datepicker .ui-datepicker-next,
1543
+ .yith-plugin-fw-panel .ui-datepicker-prev.ui-datepicker-prev-hover,
1544
+ .yith-plugin-fw-panel .ui-datepicker-prev.ui-datepicker-next-hover {
1545
+ top: 1px;
1546
+ cursor: pointer;
1547
+ }
1548
+
1549
+ .yith-plugin-ui .ui-datepicker-prev.ui-datepicker-prev,
1550
+ .yith-plugin-ui .ui-datepicker-prev.ui-datepicker-prev-hover,
1551
+ .yith-plugin-fw-panel .ui-datepicker-prev.ui-datepicker-prev,
1552
+ .yith-plugin-fw-panel .ui-datepicker-prev.ui-datepicker-prev-hover {
1553
+ left: 5px;
1554
+ }
1555
+
1556
+ .yith-plugin-ui .ui-datepicker .ui-datepicker-next,
1557
+ .yith-plugin-ui .ui-datepicker-next.ui-datepicker-next-hover,
1558
+ .yith-plugin-fw-panel .ui-datepicker .ui-datepicker-next,
1559
+ .yith-plugin-fw-panel .ui-datepicker-next.ui-datepicker-next-hover {
1560
+ right: 1px;
1561
+ }
1562
+
1563
+ .yith-plugin-ui .ui-datepicker table,
1564
+ .yith-plugin-fw-panel .ui-datepicker table {
1565
+ font-size: 10px;
1566
+ }
1567
+
1568
+ .yith-plugin-ui .ui-state-default,
1569
+ .yith-plugin-ui .ui-widget-content .ui-state-default,
1570
+ .yith-plugin-ui .ui-widget-header .ui-state-default,
1571
+ .yith-plugin-fw-panel .ui-state-default,
1572
+ .yith-plugin-fw-panel .ui-widget-content .ui-state-default,
1573
+ .yith-plugin-fw-panel .ui-widget-header .ui-state-default {
1574
+ background: #fff;
1575
+ border: 1px solid #d9d9d9;
1576
+
1577
+ }
1578
+
1579
+ .yith-plugin-ui .ui-state-hover,
1580
+ .yith-plugin-ui .ui-widget-content .ui-state-hover,
1581
+ .yith-plugin-ui a.ui-state-default:focus,
1582
+ .yith-plugin-ui .ui-widget-content .ui-state-focus,
1583
+ .yith-plugin-ui .ui-widget-header .ui-state-focus,
1584
+ .yith-plugin-fw-panel .ui-state-hover,
1585
+ .yith-plugin-fw-panel .ui-widget-content .ui-state-hover,
1586
+ .yith-plugin-fw-panel a.ui-state-default:focus,
1587
+ .yith-plugin-fw-panel .ui-widget-content .ui-state-focus,
1588
+ .yith-plugin-fw-panel .ui-widget-header .ui-state-focus {
1589
+ background: #ebf1f3;
1590
+ border: 1px solid #bfd5dd;
1591
+ outline: none;
1592
+ box-shadow: none;
1593
+ }
1594
+
1595
+ .yith-plugin-ui .ui-widget-header .ui-state-hover, .woocommerce .yith-plugin-ui .ui-state-focus,
1596
+ .yith-plugin-fw-panel .ui-widget-header .ui-state-hover, .woocommerce .yith-plugin-ui .ui-state-focus {
1597
+ background: none;
1598
+ border: 0;
1599
+ }
1600
+
1601
+ /** colorpicker **/
1602
+ .yith-plugin-ui .yith-plugin-fw-field-wrapper .yith-colorpicker-group:not(:first-child) {
1603
+ margin-top: 20px;
1604
+ }
1605
+
1606
+ .yith-plugin-ui .yith-plugin-fw-field-wrapper .iris-picker,
1607
+ .yith-plugin-ui .yith-plugin-fw-field-wrapper .wp-picker-holder {
1608
+ display: none !important;
1609
+ }
1610
+
1611
+ .yith-plugin-ui .yith-plugin-fw-field-wrapper .wp-picker-input-wrap,
1612
+ .yith-plugin-ui .yith-plugin-fw-field-wrapper .wp-picker-input-wrap > * {
1613
+ display: inline-block !important;
1614
+ vertical-align: middle;
1615
+ }
1616
+
1617
+ .yith-plugin-ui .yith-plugin-fw-field-wrapper .wp-picker-active .iris-picker,
1618
+ .yith-plugin-ui .yith-plugin-fw-field-wrapper .wp-picker-active .wp-picker-holder {
1619
+ display: block !important;
1620
+ }
1621
+
1622
+ .woocommerce .yith-plugin-ui .iris-picker {
1623
+ border: 0;
1624
+ margin-top: 20px;
1625
+ }
1626
+
1627
+ .yith-plugin-ui .yith-plugin-fw input[type=text].wp-color-picker {
1628
+ border: 0;
1629
+ padding: 2px 5px;
1630
+ height: 30px;
1631
+ }
1632
+
1633
+ .yith-plugin-ui .wp-color-result-text {
1634
+ display: none;
1635
+ }
1636
+
1637
+ .yith-plugin-ui .wp-picker-container .wp-color-result.button{
1638
+ height: 30px!important;
1639
+ }
1640
+
1641
+ .yith-plugin-ui .wp-picker-container .color-alpha {
1642
+ height: 28px!important;
1643
+ }
1644
+
1645
+ .yith-plugin-ui .wp-picker-container .wp-color-result.button {
1646
+ width: 30px;
1647
+ height: 30px;
1648
+ border: 0;
1649
+ box-shadow: none;
1650
+ border: 1px solid #d9d9d9;
1651
+ margin-bottom: 0;
1652
+ display: inline-block;
1653
+ vertical-align: middle;
1654
+ }
1655
+
1656
+ .yith-plugin-ui .wp-picker-default-custom {
1657
+ cursor: pointer;
1658
+ width: 25px;
1659
+ padding: 0 5px;
1660
+ display: inline-block;
1661
+ vertical-align: middle;
1662
+ position: relative;
1663
+ }
1664
+
1665
+ .yith-plugin-ui .wp-picker-default-custom input.button {
1666
+ opacity: 0;
1667
+ margin: 0;
1668
+ padding: 0;
1669
+ position: absolute;
1670
+ top: 0;
1671
+ right: 0;
1672
+ left: 0;
1673
+ bottom: 0;
1674
+ z-index: 2;
1675
+ }
1676
+
1677
+ .yith-plugin-ui .wp-picker-default-custom:before {
1678
+ content: "\e910";
1679
+ text-indent: 0;
1680
+ font-family: 'yith-icon';
1681
+ font-size: 20px;
1682
+ color: #d8d8d8;
1683
+ font-weight: normal;
1684
+ width: 15px;
1685
+ display: block;
1686
+ background: none;
1687
+ line-height: 20px;
1688
+ margin-left: 8px;
1689
+ }
1690
+
1691
+ .yith-plugin-ui .wp-picker-container {
1692
+ width: auto;
1693
+ display: inline-block;
1694
+ border: 1px solid #d9d9d9;
1695
+ border-radius: 8px;
1696
+ padding: 5px;
1697
+ }
1698
+
1699
+ .yith-plugin-ui .iris-picker .iris-square-inner {
1700
+ box-shadow: none;
1701
+ border: 1px solid #d9d9d9;
1702
+ }
1703
+
1704
+ .yith-plugin-ui .yith-single-colorpicker {
1705
+ display: inline-block;
1706
+ width: 220px;
1707
+ }
1708
+
1709
+ .yith-plugin-ui .yith-single-colorpicker > label {
1710
+ display: block;
1711
+ font-size: 11px;
1712
+ font-weight: 600;
1713
+ margin: 0 0 10px 0;
1714
+ }
1715
+
1716
+ /* RANGE SLIDER */
1717
+ .yith-plugin-ui .ui-slider-horizontal .ui-slider-handle {
1718
+ top: -45px !important;
1719
+ }
1720
+
1721
+ .yith-plugin-ui .ui-slider-horizontal .ui-slider-handle {
1722
+ position: absolute;
1723
+ top: -33px;
1724
+ left: 0;
1725
+ width: auto !important;
1726
+ height: auto !important;
1727
+ padding: 2px 8px;
1728
+ margin-left: -15px;
1729
+ font-size: 12px;
1730
+ line-height: 20px;
1731
+ color: #4e8ba2;
1732
+ text-align: center;
1733
+ background-color: #fff;
1734
+ border: 1px solid #fff;
1735
+ border-radius: 3px;
1736
+ -webkit-transition: opacity .3s ease-in-out 0s;
1737
+ transition: opacity .3s ease-in-out 0s;
1738
+ box-shadow: 0px 1px 7px 0px rgba(1, 1, 1, 0.13);
1739
+ }
1740
+
1741
+ .yith-plugin-ui .ui-slider-horizontal .ui-slider-handle:before {
1742
+ position: absolute;
1743
+ bottom: -3px;
1744
+ left: 50%;
1745
+ display: inline-block;
1746
+ width: 6px;
1747
+ height: 6px;
1748
+ margin-left: -3px;
1749
+ content: "";
1750
+ background-color: #fff;
1751
+ -webkit-transform: rotate(-45deg);
1752
+ -ms-transform: rotate(-45deg);
1753
+ transform: rotate(-45deg);
1754
+ }
1755
+
1756
+ .yith-plugin-ui .ui-slider.ui-widget-content .ui-widget-header {
1757
+ background: #4e8ba2;
1758
+ }
1759
+
1760
+ .yith-plugin-ui .ui-slider-horizontal .ui-slider-handle:after {
1761
+ content: '';
1762
+ width: 17px;
1763
+ height: 17px;
1764
+ display: block;
1765
+ position: absolute;
1766
+ background: #fff;
1767
+ top: 37px;
1768
+ border-radius: 50%;
1769
+ box-shadow: 0px 1px 6px 0px rgba(1, 1, 1, 0.25);
1770
+ }
1771
+
1772
+ .yith-plugin-ui .ui-slider.ui-widget-content {
1773
+ height: 5px !important;
1774
+ }
1775
+
1776
+ .yith-plugin-ui .ui-slider .minCaption,
1777
+ .yith-plugin-ui .ui-slider .maxCaption {
1778
+ font-weight: 700;
1779
+ font-size: 12px;
1780
+ }
1781
+
1782
+
1783
+ /* ADD_BOX AND TOGGLE */
1784
+ .yith-plugin-ui .yith-add-box,
1785
+ .yith-plugin-ui .yith-toggle-row {
1786
+ width: 70%;
1787
+ border: 1px solid #d9d9d9;
1788
+ box-shadow: none;
1789
+ border-radius: 4px;
1790
+ margin: 20px 0;
1791
+ padding: 10px;
1792
+ box-sizing: border-box;
1793
+ background: white;
1794
+ }
1795
+
1796
+ .yith-plugin-ui .yith-toggle-row {
1797
+ cursor: pointer;
1798
+ transition: all ease 0.5s;
1799
+ }
1800
+
1801
+ .yith-plugin-ui .yith-toggle-row.highlight {
1802
+ transition: all ease 0.5s;
1803
+ /*box-shadow: 0 0 7px rgb(81, 117, 129);*/
1804
+ box-shadow: 0 0 7px rgb(30, 140, 190);
1805
+
1806
+ display: block;
1807
+ }
1808
+
1809
+ .yith-plugin-ui .yith-add-box {
1810
+ padding: 25px;
1811
+ display: none;
1812
+ }
1813
+
1814
+ .yith-plugin-ui .yith-toggle-title {
1815
+ position: relative;
1816
+ }
1817
+
1818
+ .yith-plugin-ui #plugin-fw-wc .yith-toggle-title h3,
1819
+ .yith-plugin-ui.metaboxes-tab.yith-plugin-ui h3,
1820
+ .yith-plugin-ui .yith-toggle-title h3 {
1821
+ padding: 0px 20px 0px 25px;
1822
+ margin: 3px 0;
1823
+
1824
+ display: inline-block;
1825
+ position: relative;
1826
+ min-width: 173px;
1827
+ box-sizing: border-box;
1828
+ font-weight: 600;
1829
+ font-size: 15px;
1830
+ color: #23282d;
1831
+ text-transform: inherit;
1832
+ }
1833
+
1834
+ .yith-plugin-ui .yith-toggle-title .subtitle {
1835
+ padding-left: 0;
1836
+ padding-top: 8px;
1837
+ font-size: 12px;
1838
+ }
1839
+
1840
+ .yith-plugin-ui .yith-toggle {
1841
+ position: absolute;
1842
+ width: 30px;
1843
+ cursor: pointer;
1844
+ left: 0;
1845
+ top: 0;
1846
+ bottom: 0;
1847
+ margin: auto;
1848
+ display: flex;
1849
+ align-items: center;
1850
+ }
1851
+
1852
+ .yith-plugin-ui .yith-toggle > span:before {
1853
+ color: #405e69;
1854
+ }
1855
+
1856
+ .yith-plugin-ui .yith-toggle > span {
1857
+ position: absolute;
1858
+ right: 50%;
1859
+ transition: transform .3s;
1860
+ line-height: 1;
1861
+ }
1862
+
1863
+
1864
+ .yith-plugin-ui .yith-toggle-row-opened .yith-toggle span {
1865
+ transform: rotateZ(90deg);
1866
+ }
1867
+
1868
+ .yith-plugin-ui .yith-toggle-content {
1869
+ display: none;
1870
+ position: relative;
1871
+ padding: 30px 25px;
1872
+ }
1873
+
1874
+ .yith-plugin-ui .yith-toggle-row-opened .yith-toggle-content {
1875
+ /* display: block;*/
1876
+ }
1877
+
1878
+ .yith-plugin-ui .yith-add-box-row,
1879
+ .yith-plugin-ui .yith-toggle-row-opened .yith-toggle-content .yith-toggle-content-row {
1880
+ display: table;
1881
+ margin-bottom: 40px;
1882
+ }
1883
+
1884
+ .yith-plugin-ui .yith-add-box-row label,
1885
+ .yith-plugin-ui .yith-toggle-row-opened .yith-toggle-content .yith-toggle-content-row label {
1886
+ display: table-cell;
1887
+ width: 200px;
1888
+ padding-right: 21px;
1889
+ color: #33373b;
1890
+ font-size: 14px;
1891
+ vertical-align: top;
1892
+ font-weight: 600;
1893
+ }
1894
+ .yith-plugin-ui .yith-plugin-fw-radio__row label{
1895
+ font-weight: 400!important;
1896
+ }
1897
+ .yith-plugin-ui .yith-add-box-row .yith-plugin-fw-field-wrapper:not(.yith-plugin-fw-title-field-wrapper),
1898
+ .yith-plugin-ui .yith-toggle-row-opened .yith-plugin-fw-field-wrapper:not(.yith-plugin-fw-title-field-wrapper) {
1899
+ margin-top: 10px;
1900
+ width: auto;
1901
+ float: none;
1902
+ vertical-align: middle;
1903
+ position: relative;
1904
+ }
1905
+
1906
+ .yith-plugin-ui .yith-add-box-row span.yith-icon,
1907
+ .yith-plugin-ui .yith-toggle-row-opened .yith-toggle-content .yith-toggle-content-row span.yith-icon {
1908
+ position: absolute;
1909
+ right: 15px;
1910
+ top: 0;
1911
+ bottom: 0;
1912
+ }
1913
+
1914
+ .yith-plugin-ui .yith-add-box-buttons,
1915
+ .yith-plugin-ui .yith-toggle-content-buttons {
1916
+ text-align: right;
1917
+ }
1918
+
1919
+ .yith-plugin-ui .yith-toggle-onoff {
1920
+ position: absolute;
1921
+ cursor: pointer;
1922
+ right: 0;
1923
+ }
1924
+
1925
+ .yith-plugin-ui .yith-toggle_wrapper.ui-sortable .yith-toggle-onoff {
1926
+ right: 30px;
1927
+ }
1928
+
1929
+ .yith-plugin-ui .yith-toggle-row .yith-icon-drag {
1930
+ position: absolute;
1931
+ right: 0;
1932
+ top: 25%;
1933
+ bottom: 0;
1934
+ line-height: 1;
1935
+ }
1936
+
1937
+ .yith-plugin-ui .yith-toggle-row.with-subtitle .yith-toggle-onoff {
1938
+ top: 25%;
1939
+ }
1940
+
1941
+ /** SPINNER **/
1942
+ .yith-plugin-ui .spinner {
1943
+ vertical-align: -5px;
1944
+ float: none;
1945
+ }
1946
+
1947
+ .yith-plugin-ui .spinner.show {
1948
+ visibility: visible;
1949
+ }
1950
+
1951
+ /* LIST TABLE */
1952
+ .yith-plugin-ui .form-table .list-table td {
1953
+ padding: 15px 0px;
1954
+ }
1955
+
1956
+ .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table .bulkactions select {
1957
+ border: 1px solid #d8d8d8;
1958
+ max-width: 200px;
1959
+ max-height: 30px;
1960
+ padding: 0 10px;
1961
+ margin-right: 5px;
1962
+ }
1963
+
1964
+ .yith-plugin-ui .form-table .list-table th {
1965
+ width: initial;
1966
+ }
1967
+
1968
+ .yith-plugin-ui #plugin-fw-wc table.wp-list-table tbody td {
1969
+ padding-left: 20px;
1970
+ }
1971
+
1972
+ .yith-plugin-ui #plugin-fw-wc table.wp-list-table th,
1973
+ .yith-plugin-ui #plugin-fw-wc table.wp-list-table td {
1974
+ padding: 15px 20px 15px 20px;
1975
+ }
1976
+
1977
+ .yith-plugin-ui #plugin-fw-wc table.wp-list-table thead td,
1978
+ .yith-plugin-ui #plugin-fw-wc table.wp-list-table thead th,
1979
+ .yith-plugin-ui #plugin-fw-wc table.wp-list-table tfoot td,
1980
+ .yith-plugin-ui #plugin-fw-wc table.wp-list-table tfoot th {
1981
+ padding: 3px 20px;
1982
+ }
1983
+
1984
+ .yith-plugin-ui #plugin-fw-wc table.wp-list-table thead a,
1985
+ .yith-plugin-ui #plugin-fw-wc table.wp-list-table tfoot a {
1986
+ padding-left: 0;
1987
+ }
1988
+
1989
+ .yith-plugin-ui .yith-plugin-fw-list-table h2 {
1990
+ border: 0;
1991
+ padding: 35px 0 15px;
1992
+ display: inline-block;
1993
+ margin-right: 10px;
1994
+ }
1995
+
1996
+ .yith-plugin-ui .form-table .yith-plugin-fw-list-table table th {
1997
+ vertical-align: middle;
1998
+ }
1999
+
2000
+ .yith-plugin-ui .yith-plugin-fw-list-table-container {
2001
+ padding: 0 20px;
2002
+ }
2003
+
2004
+ .yith-plugin-ui #doaction, .yith-plugin-ui #doaction2,
2005
+ .yith-plugin-ui #post-query-submit,
2006
+ .yith-plugin-ui #search-submit,
2007
+ .yith-plugin-ui .button.filter-button {
2008
+ margin-left: 0;
2009
+ height: 33px;
2010
+ padding: 0 10px;
2011
+ line-height: 33px;
2012
+ }
2013
+
2014
+ .yith-plugin-ui .bulkactions {
2015
+ margin: 10px 0;
2016
+ }
2017
+
2018
+ .yith-plugin-ui .form-table td p.yith-section-description {
2019
+ color: #716269;
2020
+ margin-bottom: 20px;
2021
+ }
2022
+
2023
+ /** Time picker width*/
2024
+ .yith-plugin-ui input.ui-timepicker-input {
2025
+ width: 100px !important;
2026
+ }
2027
+
2028
+ /** date format **/
2029
+ .yith-plugin-ui .yith-plugin-fw-date-format code {
2030
+ margin-left: 30px;
2031
+ }
2032
+
2033
+ .yith-plugin-ui .yith-plugin-fw-date-format input[type=text].small-text {
2034
+ margin-left: 45px;
2035
+ }
2036
+
2037
+ /** checkbox columns **/
2038
+ .yith-plugin-ui td.forminp-checkbox.two-cols fieldset {
2039
+ width: calc(50% - 20px);
2040
+ padding-right: 20px;
2041
+ float: left;
2042
+ }
2043
+
2044
+ .yith-plugin-ui td.forminp-checkbox.two-cols fieldset:nth-child(2n+1) {
2045
+ clear: both;
2046
+ }
2047
+
2048
+ .yith-plugin-ui td.forminp-checkbox.three-cols fieldset {
2049
+ width: calc(33% - 10px);
2050
+ padding-right: 10px;
2051
+ float: left;
2052
+ }
2053
+
2054
+ .yith-plugin-ui td.forminp-checkbox.three-cols fieldset:nth-child(3n+1) {
2055
+ clear: both;
2056
+ }
2057
+
2058
+ .yith-plugin-fw-checkbox-field-wrapper {
2059
+ display: inline-block !important;
2060
+ }
2061
+
2062
+ .yith-plugin-fw-checkbox-field-wrapper + span.description {
2063
+ display: inline-block;
2064
+ vertical-align: middle;
2065
+ margin: 0;
2066
+ }
2067
+
2068
+ .yith-plugin-ui span.description {
2069
+ margin-top: 10px;
2070
+ line-height: 20px;
2071
+ }
2072
+
2073
+ .yith-plugin-fw-option-with-description {
2074
+ display: table-cell;
2075
+ width: auto;
2076
+ vertical-align: top;
2077
+ }
2078
+
2079
+ /** YITH PANEL **/
2080
+ .yith-plugin-ui #yith-plugin-fw-panel {
2081
+ margin-top: -10px;
2082
+ }
2083
+
2084
+ .yith-plugin-ui #plugin-fw-wc, .yith-plugin-ui #yith-plugin-fw-panel {
2085
+ padding-top: 0;
2086
+ }
2087
+
2088
+ .yith-plugin-ui .plugin-option tr {
2089
+ border: 0;
2090
+ }
2091
+
2092
+ @media screen and (max-width: 1440px) {
2093
+ .yith-plugin-ui .yith-add-box,
2094
+ .yith-plugin-ui .yith-toggle-row {
2095
+ width: 80%;
2096
+ }
2097
+ }
2098
+
2099
+ @media screen and (max-width: 1024px) {
2100
+ .yith-plugin-ui .yith-add-box,
2101
+ .yith-plugin-ui .yith-toggle-row {
2102
+ width: 90%;
2103
+ }
2104
+
2105
+ .yith-plugin-ui td.forminp-checkbox.two-cols fieldset {
2106
+ width: 100%;
2107
+ padding-right: 20px;
2108
+ float: left;
2109
+ }
2110
+
2111
+ .yith-plugin-ui td.forminp-checkbox.three-cols fieldset {
2112
+ width: calc(50% - 10px);
2113
+ padding-right: 10px;
2114
+ float: left;
2115
+ }
2116
+
2117
+ .yith-plugin-ui td.forminp-checkbox.two-cols fieldset:nth-child(2n+1) {
2118
+ clear: both;
2119
+ }
2120
+
2121
+ .yith-plugin-ui td.forminp-checkbox.three-cols fieldset:nth-child(3n+1) {
2122
+ clear: initial;
2123
+ }
2124
+ }
2125
+
2126
+ @media screen and (max-width: 782px) {
2127
+ .yith-plugin-fw-banner.yith-plugin-fw-banner-free {
2128
+ height: auto;
2129
+ background-color: #a9c7d3;
2130
+ }
2131
+
2132
+ .yith-plugin-fw-banner.yith-plugin-fw-banner-free ul {
2133
+ width: 90%;
2134
+ text-align: center;
2135
+ }
2136
+
2137
+ .yith-plugin-fw-banner.yith-plugin-fw-banner-free li img {
2138
+ width: 90%;
2139
+ margin: 0 auto;
2140
+ }
2141
+
2142
+ .yith-plugin-fw-banner h1 {
2143
+ line-height: 1.2em;
2144
+ }
2145
+
2146
+ .yith-plugin-ui .yith-add-box,
2147
+ .yith-plugin-ui .yith-toggle-row {
2148
+ width: 100%;
2149
+ }
2150
+
2151
+ .yith-plugin-ui td.forminp-checkbox.two-cols fieldset,
2152
+ .yith-plugin-ui td.forminp-checkbox.three-cols fieldset {
2153
+ width: 100%;
2154
+ clear: initial;
2155
+ }
2156
+
2157
+ }
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
+ 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
+ })();
plugin-fw/assets/js/codemirror/javascript.js CHANGED
@@ -1,630 +1,630 @@
1
- // TODO actually recognize syntax of TypeScript constructs
2
-
3
- CodeMirror.defineMode("javascript", function(config, parserConfig) {
4
- var indentUnit = config.indentUnit;
5
- var statementIndent = parserConfig.statementIndent;
6
- var jsonMode = parserConfig.json;
7
- var isTS = parserConfig.typescript;
8
-
9
- // Tokenizer
10
-
11
- var keywords = function(){
12
- function kw(type) {return {type: type, style: "keyword"};}
13
- var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c");
14
- var operator = kw("operator"), atom = {type: "atom", style: "atom"};
15
-
16
- var jsKeywords = {
17
- "if": kw("if"), "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B,
18
- "return": C, "break": C, "continue": C, "new": C, "delete": C, "throw": C, "debugger": C,
19
- "var": kw("var"), "const": kw("var"), "let": kw("var"),
20
- "function": kw("function"), "catch": kw("catch"),
21
- "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"),
22
- "in": operator, "typeof": operator, "instanceof": operator,
23
- "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom,
24
- "this": kw("this"), "module": kw("module"), "class": kw("class"), "super": kw("atom"),
25
- "yield": C, "export": kw("export"), "import": kw("import"), "extends": C
26
- };
27
-
28
- // Extend the 'normal' keywords with the TypeScript language extensions
29
- if (isTS) {
30
- var type = {type: "variable", style: "variable-3"};
31
- var tsKeywords = {
32
- // object-like things
33
- "interface": kw("interface"),
34
- "extends": kw("extends"),
35
- "constructor": kw("constructor"),
36
-
37
- // scope modifiers
38
- "public": kw("public"),
39
- "private": kw("private"),
40
- "protected": kw("protected"),
41
- "static": kw("static"),
42
-
43
- // types
44
- "string": type, "number": type, "bool": type, "any": type
45
- };
46
-
47
- for (var attr in tsKeywords) {
48
- jsKeywords[attr] = tsKeywords[attr];
49
- }
50
- }
51
-
52
- return jsKeywords;
53
- }();
54
-
55
- var isOperatorChar = /[+\-*&%=<>!?|~^]/;
56
-
57
- function readRegexp(stream) {
58
- var escaped = false, next, inSet = false;
59
- while ((next = stream.next()) != null) {
60
- if (!escaped) {
61
- if (next == "/" && !inSet) return;
62
- if (next == "[") inSet = true;
63
- else if (inSet && next == "]") inSet = false;
64
- }
65
- escaped = !escaped && next == "\\";
66
- }
67
- }
68
-
69
- // Used as scratch variables to communicate multiple values without
70
- // consing up tons of objects.
71
- var type, content;
72
- function ret(tp, style, cont) {
73
- type = tp; content = cont;
74
- return style;
75
- }
76
- function tokenBase(stream, state) {
77
- var ch = stream.next();
78
- if (ch == '"' || ch == "'") {
79
- state.tokenize = tokenString(ch);
80
- return state.tokenize(stream, state);
81
- } else if (ch == "." && stream.match(/^\d+(?:[eE][+\-]?\d+)?/)) {
82
- return ret("number", "number");
83
- } else if (ch == "." && stream.match("..")) {
84
- return ret("spread", "meta");
85
- } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
86
- return ret(ch);
87
- } else if (ch == "=" && stream.eat(">")) {
88
- return ret("=>", "operator");
89
- } else if (ch == "0" && stream.eat(/x/i)) {
90
- stream.eatWhile(/[\da-f]/i);
91
- return ret("number", "number");
92
- } else if (/\d/.test(ch)) {
93
- stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/);
94
- return ret("number", "number");
95
- } else if (ch == "/") {
96
- if (stream.eat("*")) {
97
- state.tokenize = tokenComment;
98
- return tokenComment(stream, state);
99
- } else if (stream.eat("/")) {
100
- stream.skipToEnd();
101
- return ret("comment", "comment");
102
- } else if (state.lastType == "operator" || state.lastType == "keyword c" ||
103
- state.lastType == "sof" || /^[\[{}\(,;:]$/.test(state.lastType)) {
104
- readRegexp(stream);
105
- stream.eatWhile(/[gimy]/); // 'y' is "sticky" option in Mozilla
106
- return ret("regexp", "string-2");
107
- } else {
108
- stream.eatWhile(isOperatorChar);
109
- return ret("operator", "operator", stream.current());
110
- }
111
- } else if (ch == "`") {
112
- state.tokenize = tokenQuasi;
113
- return tokenQuasi(stream, state);
114
- } else if (ch == "#") {
115
- stream.skipToEnd();
116
- return ret("error", "error");
117
- } else if (isOperatorChar.test(ch)) {
118
- stream.eatWhile(isOperatorChar);
119
- return ret("operator", "operator", stream.current());
120
- } else {
121
- stream.eatWhile(/[\w\$_]/);
122
- var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word];
123
- return (known && state.lastType != ".") ? ret(known.type, known.style, word) :
124
- ret("variable", "variable", word);
125
- }
126
- }
127
-
128
- function tokenString(quote) {
129
- return function(stream, state) {
130
- var escaped = false, next;
131
- while ((next = stream.next()) != null) {
132
- if (next == quote && !escaped) break;
133
- escaped = !escaped && next == "\\";
134
- }
135
- if (!escaped) state.tokenize = tokenBase;
136
- return ret("string", "string");
137
- };
138
- }
139
-
140
- function tokenComment(stream, state) {
141
- var maybeEnd = false, ch;
142
- while (ch = stream.next()) {
143
- if (ch == "/" && maybeEnd) {
144
- state.tokenize = tokenBase;
145
- break;
146
- }
147
- maybeEnd = (ch == "*");
148
- }
149
- return ret("comment", "comment");
150
- }
151
-
152
- function tokenQuasi(stream, state) {
153
- var escaped = false, next;
154
- while ((next = stream.next()) != null) {
155
- if (!escaped && (next == "`" || next == "$" && stream.eat("{"))) {
156
- state.tokenize = tokenBase;
157
- break;
158
- }
159
- escaped = !escaped && next == "\\";
160
- }
161
- return ret("quasi", "string-2", stream.current());
162
- }
163
-
164
- var brackets = "([{}])";
165
- // This is a crude lookahead trick to try and notice that we're
166
- // parsing the argument patterns for a fat-arrow function before we
167
- // actually hit the arrow token. It only works if the arrow is on
168
- // the same line as the arguments and there's no strange noise
169
- // (comments) in between. Fallback is to only notice when we hit the
170
- // arrow, and not declare the arguments as locals for the arrow
171
- // body.
172
- function findFatArrow(stream, state) {
173
- if (state.fatArrowAt) state.fatArrowAt = null;
174
- var arrow = stream.string.indexOf("=>", stream.start);
175
- if (arrow < 0) return;
176
-
177
- var depth = 0, sawSomething = false;
178
- for (var pos = arrow - 1; pos >= 0; --pos) {
179
- var ch = stream.string.charAt(pos);
180
- var bracket = brackets.indexOf(ch);
181
- if (bracket >= 0 && bracket < 3) {
182
- if (!depth) { ++pos; break; }
183
- if (--depth == 0) break;
184
- } else if (bracket >= 3 && bracket < 6) {
185
- ++depth;
186
- } else if (/[$\w]/.test(ch)) {
187
- sawSomething = true;
188
- } else if (sawSomething && !depth) {
189
- ++pos;
190
- break;
191
- }
192
- }
193
- if (sawSomething && !depth) state.fatArrowAt = pos;
194
- }
195
-
196
- // Parser
197
-
198
- var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true, "this": true};
199
-
200
- function JSLexical(indented, column, type, align, prev, info) {
201
- this.indented = indented;
202
- this.column = column;
203
- this.type = type;
204
- this.prev = prev;
205
- this.info = info;
206
- if (align != null) this.align = align;
207
- }
208
-
209
- function inScope(state, varname) {
210
- for (var v = state.localVars; v; v = v.next)
211
- if (v.name == varname) return true;
212
- for (var cx = state.context; cx; cx = cx.prev) {
213
- for (var v = cx.vars; v; v = v.next)
214
- if (v.name == varname) return true;
215
- }
216
- }
217
-
218
- function parseJS(state, style, type, content, stream) {
219
- var cc = state.cc;
220
- // Communicate our context to the combinators.
221
- // (Less wasteful than consing up a hundred closures on every call.)
222
- cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc;
223
-
224
- if (!state.lexical.hasOwnProperty("align"))
225
- state.lexical.align = true;
226
-
227
- while(true) {
228
- var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement;
229
- if (combinator(type, content)) {
230
- while(cc.length && cc[cc.length - 1].lex)
231
- cc.pop()();
232
- if (cx.marked) return cx.marked;
233
- if (type == "variable" && inScope(state, content)) return "variable-2";
234
- return style;
235
- }
236
- }
237
- }
238
-
239
- // Combinator utils
240
-
241
- var cx = {state: null, column: null, marked: null, cc: null};
242
- function pass() {
243
- for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);
244
- }
245
- function cont() {
246
- pass.apply(null, arguments);
247
- return true;
248
- }
249
- function register(varname) {
250
- function inList(list) {
251
- for (var v = list; v; v = v.next)
252
- if (v.name == varname) return true;
253
- return false;
254
- }
255
- var state = cx.state;
256
- if (state.context) {
257
- cx.marked = "def";
258
- if (inList(state.localVars)) return;
259
- state.localVars = {name: varname, next: state.localVars};
260
- } else {
261
- if (inList(state.globalVars)) return;
262
- if (parserConfig.globalVars)
263
- state.globalVars = {name: varname, next: state.globalVars};
264
- }
265
- }
266
-
267
- // Combinators
268
-
269
- var defaultVars = {name: "this", next: {name: "arguments"}};
270
- function pushcontext() {
271
- cx.state.context = {prev: cx.state.context, vars: cx.state.localVars};
272
- cx.state.localVars = defaultVars;
273
- }
274
- function popcontext() {
275
- cx.state.localVars = cx.state.context.vars;
276
- cx.state.context = cx.state.context.prev;
277
- }
278
- function pushlex(type, info) {
279
- var result = function() {
280
- var state = cx.state, indent = state.indented;
281
- if (state.lexical.type == "stat") indent = state.lexical.indented;
282
- state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info);
283
- };
284
- result.lex = true;
285
- return result;
286
- }
287
- function poplex() {
288
- var state = cx.state;
289
- if (state.lexical.prev) {
290
- if (state.lexical.type == ")")
291
- state.indented = state.lexical.indented;
292
- state.lexical = state.lexical.prev;
293
- }
294
- }
295
- poplex.lex = true;
296
-
297
- function expect(wanted) {
298
- return function(type) {
299
- if (type == wanted) return cont();
300
- else if (wanted == ";") return pass();
301
- else return cont(arguments.callee);
302
- };
303
- }
304
-
305
- function statement(type, value) {
306
- if (type == "var") return cont(pushlex("vardef", value.length), vardef, expect(";"), poplex);
307
- if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex);
308
- if (type == "keyword b") return cont(pushlex("form"), statement, poplex);
309
- if (type == "{") return cont(pushlex("}"), block, poplex);
310
- if (type == ";") return cont();
311
- if (type == "if") return cont(pushlex("form"), expression, statement, poplex, maybeelse);
312
- if (type == "function") return cont(functiondef);
313
- if (type == "for") return cont(pushlex("form"), forspec, statement, poplex);
314
- if (type == "variable") return cont(pushlex("stat"), maybelabel);
315
- if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"),
316
- block, poplex, poplex);
317
- if (type == "case") return cont(expression, expect(":"));
318
- if (type == "default") return cont(expect(":"));
319
- if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"),
320
- statement, poplex, popcontext);
321
- if (type == "module") return cont(pushlex("form"), pushcontext, afterModule, popcontext, poplex);
322
- if (type == "class") return cont(pushlex("form"), className, objlit, poplex);
323
- if (type == "export") return cont(pushlex("form"), afterExport, poplex);
324
- if (type == "import") return cont(pushlex("form"), afterImport, poplex);
325
- return pass(pushlex("stat"), expression, expect(";"), poplex);
326
- }
327
- function expression(type) {
328
- return expressionInner(type, false);
329
- }
330
- function expressionNoComma(type) {
331
- return expressionInner(type, true);
332
- }
333
- function expressionInner(type, noComma) {
334
- if (cx.state.fatArrowAt == cx.stream.start) {
335
- var body = noComma ? arrowBodyNoComma : arrowBody;
336
- if (type == "(") return cont(pushcontext, pushlex(")"), commasep(pattern, ")"), poplex, expect("=>"), body, popcontext);
337
- else if (type == "variable") return pass(pushcontext, pattern, expect("=>"), body, popcontext);
338
- }
339
-
340
- var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma;
341
- if (atomicTypes.hasOwnProperty(type)) return cont(maybeop);
342
- if (type == "function") return cont(functiondef);
343
- if (type == "keyword c") return cont(noComma ? maybeexpressionNoComma : maybeexpression);
344
- if (type == "(") return cont(pushlex(")"), maybeexpression, comprehension, expect(")"), poplex, maybeop);
345
- if (type == "operator" || type == "spread") return cont(noComma ? expressionNoComma : expression);
346
- if (type == "[") return cont(pushlex("]"), arrayLiteral, poplex, maybeop);
347
- if (type == "{") return contCommasep(objprop, "}", null, maybeop);
348
- return cont();
349
- }
350
- function maybeexpression(type) {
351
- if (type.match(/[;\}\)\],]/)) return pass();
352
- return pass(expression);
353
- }
354
- function maybeexpressionNoComma(type) {
355
- if (type.match(/[;\}\)\],]/)) return pass();
356
- return pass(expressionNoComma);
357
- }
358
-
359
- function maybeoperatorComma(type, value) {
360
- if (type == ",") return cont(expression);
361
- return maybeoperatorNoComma(type, value, false);
362
- }
363
- function maybeoperatorNoComma(type, value, noComma) {
364
- var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma;
365
- var expr = noComma == false ? expression : expressionNoComma;
366
- if (value == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext);
367
- if (type == "operator") {
368
- if (/\+\+|--/.test(value)) return cont(me);
369
- if (value == "?") return cont(expression, expect(":"), expr);
370
- return cont(expr);
371
- }
372
- if (type == "quasi") { cx.cc.push(me); return quasi(value); }
373
- if (type == ";") return;
374
- if (type == "(") return contCommasep(expressionNoComma, ")", "call", me);
375
- if (type == ".") return cont(property, me);
376
- if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me);
377
- }
378
- function quasi(value) {
379
- if (value.slice(value.length - 2) != "${") return cont();
380
- return cont(expression, continueQuasi);
381
- }
382
- function continueQuasi(type) {
383
- if (type == "}") {
384
- cx.marked = "string-2";
385
- cx.state.tokenize = tokenQuasi;
386
- return cont();
387
- }
388
- }
389
- function arrowBody(type) {
390
- findFatArrow(cx.stream, cx.state);
391
- if (type == "{") return pass(statement);
392
- return pass(expression);
393
- }
394
- function arrowBodyNoComma(type) {
395
- findFatArrow(cx.stream, cx.state);
396
- if (type == "{") return pass(statement);
397
- return pass(expressionNoComma);
398
- }
399
- function maybelabel(type) {
400
- if (type == ":") return cont(poplex, statement);
401
- return pass(maybeoperatorComma, expect(";"), poplex);
402
- }
403
- function property(type) {
404
- if (type == "variable") {cx.marked = "property"; return cont();}
405
- }
406
- function objprop(type, value) {
407
- if (type == "variable") {
408
- cx.marked = "property";
409
- if (value == "get" || value == "set") return cont(getterSetter);
410
- } else if (type == "number" || type == "string") {
411
- cx.marked = type + " property";
412
- } else if (type == "[") {
413
- return cont(expression, expect("]"), afterprop);
414
- }
415
- if (atomicTypes.hasOwnProperty(type)) return cont(afterprop);
416
- }
417
- function getterSetter(type) {
418
- if (type != "variable") return pass(afterprop);
419
- cx.marked = "property";
420
- return cont(functiondef);
421
- }
422
- function afterprop(type) {
423
- if (type == ":") return cont(expressionNoComma);
424
- if (type == "(") return pass(functiondef);
425
- }
426
- function commasep(what, end) {
427
- function proceed(type) {
428
- if (type == ",") {
429
- var lex = cx.state.lexical;
430
- if (lex.info == "call") lex.pos = (lex.pos || 0) + 1;
431
- return cont(what, proceed);
432
- }
433
- if (type == end) return cont();
434
- return cont(expect(end));
435
- }
436
- return function(type) {
437
- if (type == end) return cont();
438
- return pass(what, proceed);
439
- };
440
- }
441
- function contCommasep(what, end, info) {
442
- for (var i = 3; i < arguments.length; i++)
443
- cx.cc.push(arguments[i]);
444
- return cont(pushlex(end, info), commasep(what, end), poplex);
445
- }
446
- function block(type) {
447
- if (type == "}") return cont();
448
- return pass(statement, block);
449
- }
450
- function maybetype(type) {
451
- if (isTS && type == ":") return cont(typedef);
452
- }
453
- function typedef(type) {
454
- if (type == "variable"){cx.marked = "variable-3"; return cont();}
455
- }
456
- function vardef() {
457
- return pass(pattern, maybetype, maybeAssign, vardefCont);
458
- }
459
- function pattern(type, value) {
460
- if (type == "variable") { register(value); return cont(); }
461
- if (type == "[") return contCommasep(pattern, "]");
462
- if (type == "{") return contCommasep(proppattern, "}");
463
- }
464
- function proppattern(type, value) {
465
- if (type == "variable" && !cx.stream.match(/^\s*:/, false)) {
466
- register(value);
467
- return cont(maybeAssign);
468
- }
469
- if (type == "variable") cx.marked = "property";
470
- return cont(expect(":"), pattern, maybeAssign);
471
- }
472
- function maybeAssign(_type, value) {
473
- if (value == "=") return cont(expressionNoComma);
474
- }
475
- function vardefCont(type) {
476
- if (type == ",") return cont(vardef);
477
- }
478
- function maybeelse(type, value) {
479
- if (type == "keyword b" && value == "else") return cont(pushlex("form"), statement, poplex);
480
- }
481
- function forspec(type) {
482
- if (type == "(") return cont(pushlex(")"), forspec1, expect(")"), poplex);
483
- }
484
- function forspec1(type) {
485
- if (type == "var") return cont(vardef, expect(";"), forspec2);
486
- if (type == ";") return cont(forspec2);
487
- if (type == "variable") return cont(formaybeinof);
488
- return pass(expression, expect(";"), forspec2);
489
- }
490
- function formaybeinof(_type, value) {
491
- if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression); }
492
- return cont(maybeoperatorComma, forspec2);
493
- }
494
- function forspec2(type, value) {
495
- if (type == ";") return cont(forspec3);
496
- if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression); }
497
- return pass(expression, expect(";"), forspec3);
498
- }
499
- function forspec3(type) {
500
- if (type != ")") cont(expression);
501
- }
502
- function functiondef(type, value) {
503
- if (value == "*") {cx.marked = "keyword"; return cont(functiondef);}
504
- if (type == "variable") {register(value); return cont(functiondef);}
505
- if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, statement, popcontext);
506
- }
507
- function funarg(type) {
508
- if (type == "spread") return cont(funarg);
509
- return pass(pattern, maybetype);
510
- }
511
- function className(type, value) {
512
- if (type == "variable") {register(value); return cont(classNameAfter);}
513
- }
514
- function classNameAfter(_type, value) {
515
- if (value == "extends") return cont(expression);
516
- }
517
- function objlit(type) {
518
- if (type == "{") return contCommasep(objprop, "}");
519
- }
520
- function afterModule(type, value) {
521
- if (type == "string") return cont(statement);
522
- if (type == "variable") { register(value); return cont(maybeFrom); }
523
- }
524
- function afterExport(_type, value) {
525
- if (value == "*") { cx.marked = "keyword"; return cont(maybeFrom, expect(";")); }
526
- if (value == "default") { cx.marked = "keyword"; return cont(expression, expect(";")); }
527
- return pass(statement);
528
- }
529
- function afterImport(type) {
530
- if (type == "string") return cont();
531
- return pass(importSpec, maybeFrom);
532
- }
533
- function importSpec(type, value) {
534
- if (type == "{") return contCommasep(importSpec, "}");
535
- if (type == "variable") register(value);
536
- return cont();
537
- }
538
- function maybeFrom(_type, value) {
539
- if (value == "from") { cx.marked = "keyword"; return cont(expression); }
540
- }
541
- function arrayLiteral(type) {
542
- if (type == "]") return cont();
543
- return pass(expressionNoComma, maybeArrayComprehension);
544
- }
545
- function maybeArrayComprehension(type) {
546
- if (type == "for") return pass(comprehension, expect("]"));
547
- if (type == ",") return cont(commasep(expressionNoComma, "]"));
548
- return pass(commasep(expressionNoComma, "]"));
549
- }
550
- function comprehension(type) {
551
- if (type == "for") return cont(forspec, comprehension);
552
- if (type == "if") return cont(expression, comprehension);
553
- }
554
-
555
- // Interface
556
-
557
- return {
558
- startState: function(basecolumn) {
559
- var state = {
560
- tokenize: tokenBase,
561
- lastType: "sof",
562
- cc: [],
563
- lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false),
564
- localVars: parserConfig.localVars,
565
- context: parserConfig.localVars && {vars: parserConfig.localVars},
566
- indented: 0
567
- };
568
- if (parserConfig.globalVars) state.globalVars = parserConfig.globalVars;
569
- return state;
570
- },
571
-
572
- token: function(stream, state) {
573
- if (stream.sol()) {
574
- if (!state.lexical.hasOwnProperty("align"))
575
- state.lexical.align = false;
576
- state.indented = stream.indentation();
577
- findFatArrow(stream, state);
578
- }
579
- if (state.tokenize != tokenComment && stream.eatSpace()) return null;
580
- var style = state.tokenize(stream, state);
581
- if (type == "comment") return style;
582
- state.lastType = type == "operator" && (content == "++" || content == "--") ? "incdec" : type;
583
- return parseJS(state, style, type, content, stream);
584
- },
585
-
586
- indent: function(state, textAfter) {
587
- if (state.tokenize == tokenComment) return CodeMirror.Pass;
588
- if (state.tokenize != tokenBase) return 0;
589
- var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical;
590
- // Kludge to prevent 'maybelse' from blocking lexical scope pops
591
- for (var i = state.cc.length - 1; i >= 0; --i) {
592
- var c = state.cc[i];
593
- if (c == poplex) lexical = lexical.prev;
594
- else if (c != maybeelse) break;
595
- }
596
- if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev;
597
- if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat")
598
- lexical = lexical.prev;
599
- var type = lexical.type, closing = firstChar == type;
600
-
601
- if (type == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? lexical.info + 1 : 0);
602
- else if (type == "form" && firstChar == "{") return lexical.indented;
603
- else if (type == "form") return lexical.indented + indentUnit;
604
- else if (type == "stat")
605
- return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? statementIndent || indentUnit : 0);
606
- else if (lexical.info == "switch" && !closing && parserConfig.doubleIndentSwitch != false)
607
- return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit);
608
- else if (lexical.align) return lexical.column + (closing ? 0 : 1);
609
- else return lexical.indented + (closing ? 0 : indentUnit);
610
- },
611
-
612
- electricChars: ":{}",
613
- blockCommentStart: jsonMode ? null : "/*",
614
- blockCommentEnd: jsonMode ? null : "*/",
615
- lineComment: jsonMode ? null : "//",
616
- fold: "brace",
617
-
618
- helperType: jsonMode ? "json" : "javascript",
619
- jsonMode: jsonMode
620
- };
621
- });
622
-
623
- CodeMirror.defineMIME("text/javascript", "javascript");
624
- CodeMirror.defineMIME("text/ecmascript", "javascript");
625
- CodeMirror.defineMIME("application/javascript", "javascript");
626
- CodeMirror.defineMIME("application/ecmascript", "javascript");
627
- CodeMirror.defineMIME("application/json", {name: "javascript", json: true});
628
- CodeMirror.defineMIME("application/x-json", {name: "javascript", json: true});
629
- CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true });
630
- CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true });
1
+ // TODO actually recognize syntax of TypeScript constructs
2
+
3
+ CodeMirror.defineMode("javascript", function(config, parserConfig) {
4
+ var indentUnit = config.indentUnit;
5
+ var statementIndent = parserConfig.statementIndent;
6
+ var jsonMode = parserConfig.json;
7
+ var isTS = parserConfig.typescript;
8
+
9
+ // Tokenizer
10
+
11
+ var keywords = function(){
12
+ function kw(type) {return {type: type, style: "keyword"};}
13
+ var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c");
14
+ var operator = kw("operator"), atom = {type: "atom", style: "atom"};
15
+
16
+ var jsKeywords = {
17
+ "if": kw("if"), "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B,
18
+ "return": C, "break": C, "continue": C, "new": C, "delete": C, "throw": C, "debugger": C,
19
+ "var": kw("var"), "const": kw("var"), "let": kw("var"),
20
+ "function": kw("function"), "catch": kw("catch"),
21
+ "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"),
22
+ "in": operator, "typeof": operator, "instanceof": operator,
23
+ "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom,
24
+ "this": kw("this"), "module": kw("module"), "class": kw("class"), "super": kw("atom"),
25
+ "yield": C, "export": kw("export"), "import": kw("import"), "extends": C
26
+ };
27
+
28
+ // Extend the 'normal' keywords with the TypeScript language extensions
29
+ if (isTS) {
30
+ var type = {type: "variable", style: "variable-3"};
31
+ var tsKeywords = {
32
+ // object-like things
33
+ "interface": kw("interface"),
34
+ "extends": kw("extends"),
35
+ "constructor": kw("constructor"),
36
+
37
+ // scope modifiers
38
+ "public": kw("public"),
39
+ "private": kw("private"),
40
+ "protected": kw("protected"),
41
+ "static": kw("static"),
42
+
43
+ // types
44
+ "string": type, "number": type, "bool": type, "any": type
45
+ };
46
+
47
+ for (var attr in tsKeywords) {
48
+ jsKeywords[attr] = tsKeywords[attr];
49
+ }
50
+ }
51
+
52
+ return jsKeywords;
53
+ }();
54
+
55
+ var isOperatorChar = /[+\-*&%=<>!?|~^]/;
56
+
57
+ function readRegexp(stream) {
58
+ var escaped = false, next, inSet = false;
59
+ while ((next = stream.next()) != null) {
60
+ if (!escaped) {
61
+ if (next == "/" && !inSet) return;
62
+ if (next == "[") inSet = true;
63
+ else if (inSet && next == "]") inSet = false;
64
+ }
65
+ escaped = !escaped && next == "\\";
66
+ }
67
+ }
68
+
69
+ // Used as scratch variables to communicate multiple values without
70
+ // consing up tons of objects.
71
+ var type, content;
72
+ function ret(tp, style, cont) {
73
+ type = tp; content = cont;
74
+ return style;
75
+ }
76
+ function tokenBase(stream, state) {
77
+ var ch = stream.next();
78
+ if (ch == '"' || ch == "'") {
79
+ state.tokenize = tokenString(ch);
80
+ return state.tokenize(stream, state);
81
+ } else if (ch == "." && stream.match(/^\d+(?:[eE][+\-]?\d+)?/)) {
82
+ return ret("number", "number");
83
+ } else if (ch == "." && stream.match("..")) {
84
+ return ret("spread", "meta");
85
+ } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
86
+ return ret(ch);
87
+ } else if (ch == "=" && stream.eat(">")) {
88
+ return ret("=>", "operator");
89
+ } else if (ch == "0" && stream.eat(/x/i)) {
90
+ stream.eatWhile(/[\da-f]/i);
91
+ return ret("number", "number");
92
+ } else if (/\d/.test(ch)) {
93
+ stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/);
94
+ return ret("number", "number");
95
+ } else if (ch == "/") {
96
+ if (stream.eat("*")) {
97
+ state.tokenize = tokenComment;
98
+ return tokenComment(stream, state);
99
+ } else if (stream.eat("/")) {
100
+ stream.skipToEnd();
101
+ return ret("comment", "comment");
102
+ } else if (state.lastType == "operator" || state.lastType == "keyword c" ||
103
+ state.lastType == "sof" || /^[\[{}\(,;:]$/.test(state.lastType)) {
104
+ readRegexp(stream);
105
+ stream.eatWhile(/[gimy]/); // 'y' is "sticky" option in Mozilla
106
+ return ret("regexp", "string-2");
107
+ } else {
108
+ stream.eatWhile(isOperatorChar);
109
+ return ret("operator", "operator", stream.current());
110
+ }
111
+ } else if (ch == "`") {
112
+ state.tokenize = tokenQuasi;
113
+ return tokenQuasi(stream, state);
114
+ } else if (ch == "#") {
115
+ stream.skipToEnd();
116
+ return ret("error", "error");
117
+ } else if (isOperatorChar.test(ch)) {
118
+ stream.eatWhile(isOperatorChar);
119
+ return ret("operator", "operator", stream.current());
120
+ } else {
121
+ stream.eatWhile(/[\w\$_]/);
122
+ var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word];
123
+ return (known && state.lastType != ".") ? ret(known.type, known.style, word) :
124
+ ret("variable", "variable", word);
125
+ }
126
+ }
127
+
128
+ function tokenString(quote) {
129
+ return function(stream, state) {
130
+ var escaped = false, next;
131
+ while ((next = stream.next()) != null) {
132
+ if (next == quote && !escaped) break;
133
+ escaped = !escaped && next == "\\";
134
+ }
135
+ if (!escaped) state.tokenize = tokenBase;
136
+ return ret("string", "string");
137
+ };
138
+ }
139
+
140
+ function tokenComment(stream, state) {
141
+ var maybeEnd = false, ch;
142
+ while (ch = stream.next()) {
143
+ if (ch == "/" && maybeEnd) {
144
+ state.tokenize = tokenBase;
145
+ break;
146
+ }
147
+ maybeEnd = (ch == "*");
148
+ }
149
+ return ret("comment", "comment");
150
+ }
151
+
152
+ function tokenQuasi(stream, state) {
153
+ var escaped = false, next;
154
+ while ((next = stream.next()) != null) {
155
+ if (!escaped && (next == "`" || next == "$" && stream.eat("{"))) {
156
+ state.tokenize = tokenBase;
157
+ break;
158
+ }
159
+ escaped = !escaped && next == "\\";
160
+ }
161
+ return ret("quasi", "string-2", stream.current());
162
+ }
163
+
164
+ var brackets = "([{}])";
165
+ // This is a crude lookahead trick to try and notice that we're
166
+ // parsing the argument patterns for a fat-arrow function before we
167
+ // actually hit the arrow token. It only works if the arrow is on
168
+ // the same line as the arguments and there's no strange noise
169
+ // (comments) in between. Fallback is to only notice when we hit the
170
+ // arrow, and not declare the arguments as locals for the arrow
171
+ // body.
172
+ function findFatArrow(stream, state) {
173
+ if (state.fatArrowAt) state.fatArrowAt = null;
174
+ var arrow = stream.string.indexOf("=>", stream.start);
175
+ if (arrow < 0) return;
176
+
177
+ var depth = 0, sawSomething = false;
178
+ for (var pos = arrow - 1; pos >= 0; --pos) {
179
+ var ch = stream.string.charAt(pos);
180
+ var bracket = brackets.indexOf(ch);
181
+ if (bracket >= 0 && bracket < 3) {
182
+ if (!depth) { ++pos; break; }
183
+ if (--depth == 0) break;
184
+ } else if (bracket >= 3 && bracket < 6) {
185
+ ++depth;
186
+ } else if (/[$\w]/.test(ch)) {
187
+ sawSomething = true;
188
+ } else if (sawSomething && !depth) {
189
+ ++pos;
190
+ break;
191
+ }
192
+ }
193
+ if (sawSomething && !depth) state.fatArrowAt = pos;
194
+ }
195
+
196
+ // Parser
197
+
198
+ var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true, "this": true};
199
+
200
+ function JSLexical(indented, column, type, align, prev, info) {
201
+ this.indented = indented;
202
+ this.column = column;
203
+ this.type = type;
204
+ this.prev = prev;
205
+ this.info = info;
206
+ if (align != null) this.align = align;
207
+ }
208
+
209
+ function inScope(state, varname) {
210
+ for (var v = state.localVars; v; v = v.next)
211
+ if (v.name == varname) return true;
212
+ for (var cx = state.context; cx; cx = cx.prev) {
213
+ for (var v = cx.vars; v; v = v.next)
214
+ if (v.name == varname) return true;
215
+ }
216
+ }
217
+
218
+ function parseJS(state, style, type, content, stream) {
219
+ var cc = state.cc;
220
+ // Communicate our context to the combinators.
221
+ // (Less wasteful than consing up a hundred closures on every call.)
222
+ cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc;
223
+
224
+ if (!state.lexical.hasOwnProperty("align"))
225
+ state.lexical.align = true;
226
+
227
+ while(true) {
228
+ var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement;
229
+ if (combinator(type, content)) {
230
+ while(cc.length && cc[cc.length - 1].lex)
231
+ cc.pop()();
232
+ if (cx.marked) return cx.marked;
233
+ if (type == "variable" && inScope(state, content)) return "variable-2";
234
+ return style;
235
+ }
236
+ }
237
+ }
238
+
239
+ // Combinator utils
240
+
241
+ var cx = {state: null, column: null, marked: null, cc: null};
242
+ function pass() {
243
+ for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);
244
+ }
245
+ function cont() {
246
+ pass.apply(null, arguments);
247
+ return true;
248
+ }
249
+ function register(varname) {
250
+ function inList(list) {
251
+ for (var v = list; v; v = v.next)
252
+ if (v.name == varname) return true;
253
+ return false;
254
+ }
255
+ var state = cx.state;
256
+ if (state.context) {
257
+ cx.marked = "def";
258
+ if (inList(state.localVars)) return;
259
+ state.localVars = {name: varname, next: state.localVars};
260
+ } else {
261
+ if (inList(state.globalVars)) return;
262
+ if (parserConfig.globalVars)
263
+ state.globalVars = {name: varname, next: state.globalVars};
264
+ }
265
+ }
266
+
267
+ // Combinators
268
+
269
+ var defaultVars = {name: "this", next: {name: "arguments"}};
270
+ function pushcontext() {
271
+ cx.state.context = {prev: cx.state.context, vars: cx.state.localVars};
272
+ cx.state.localVars = defaultVars;
273
+ }
274
+ function popcontext() {
275
+ cx.state.localVars = cx.state.context.vars;
276
+ cx.state.context = cx.state.context.prev;
277
+ }
278
+ function pushlex(type, info) {
279
+ var result = function() {
280
+ var state = cx.state, indent = state.indented;
281
+ if (state.lexical.type == "stat") indent = state.lexical.indented;
282
+ state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info);
283
+ };
284
+ result.lex = true;
285
+ return result;
286
+ }
287
+ function poplex() {
288
+ var state = cx.state;
289
+ if (state.lexical.prev) {
290
+ if (state.lexical.type == ")")
291
+ state.indented = state.lexical.indented;
292
+ state.lexical = state.lexical.prev;
293
+ }
294
+ }
295
+ poplex.lex = true;
296
+
297
+ function expect(wanted) {
298
+ return function(type) {
299
+ if (type == wanted) return cont();
300
+ else if (wanted == ";") return pass();
301
+ else return cont(arguments.callee);
302
+ };
303
+ }
304
+
305
+ function statement(type, value) {
306
+ if (type == "var") return cont(pushlex("vardef", value.length), vardef, expect(";"), poplex);
307
+ if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex);
308
+ if (type == "keyword b") return cont(pushlex("form"), statement, poplex);
309
+ if (type == "{") return cont(pushlex("}"), block, poplex);
310
+ if (type == ";") return cont();
311
+ if (type == "if") return cont(pushlex("form"), expression, statement, poplex, maybeelse);
312
+ if (type == "function") return cont(functiondef);
313
+ if (type == "for") return cont(pushlex("form"), forspec, statement, poplex);
314
+ if (type == "variable") return cont(pushlex("stat"), maybelabel);
315
+ if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"),
316
+ block, poplex, poplex);
317
+ if (type == "case") return cont(expression, expect(":"));
318
+ if (type == "default") return cont(expect(":"));
319
+ if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"),
320
+ statement, poplex, popcontext);
321
+ if (type == "module") return cont(pushlex("form"), pushcontext, afterModule, popcontext, poplex);
322
+ if (type == "class") return cont(pushlex("form"), className, objlit, poplex);
323
+ if (type == "export") return cont(pushlex("form"), afterExport, poplex);
324
+ if (type == "import") return cont(pushlex("form"), afterImport, poplex);
325
+ return pass(pushlex("stat"), expression, expect(";"), poplex);
326
+ }
327
+ function expression(type) {
328
+ return expressionInner(type, false);
329
+ }
330
+ function expressionNoComma(type) {
331
+ return expressionInner(type, true);
332
+ }
333
+ function expressionInner(type, noComma) {
334
+ if (cx.state.fatArrowAt == cx.stream.start) {
335
+ var body = noComma ? arrowBodyNoComma : arrowBody;
336
+ if (type == "(") return cont(pushcontext, pushlex(")"), commasep(pattern, ")"), poplex, expect("=>"), body, popcontext);
337
+ else if (type == "variable") return pass(pushcontext, pattern, expect("=>"), body, popcontext);
338
+ }
339
+
340
+ var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma;
341
+ if (atomicTypes.hasOwnProperty(type)) return cont(maybeop);
342
+ if (type == "function") return cont(functiondef);
343
+ if (type == "keyword c") return cont(noComma ? maybeexpressionNoComma : maybeexpression);
344
+ if (type == "(") return cont(pushlex(")"), maybeexpression, comprehension, expect(")"), poplex, maybeop);
345
+ if (type == "operator" || type == "spread") return cont(noComma ? expressionNoComma : expression);
346
+ if (type == "[") return cont(pushlex("]"), arrayLiteral, poplex, maybeop);
347
+ if (type == "{") return contCommasep(objprop, "}", null, maybeop);
348
+ return cont();
349
+ }
350
+ function maybeexpression(type) {
351
+ if (type.match(/[;\}\)\],]/)) return pass();
352
+ return pass(expression);
353
+ }
354
+ function maybeexpressionNoComma(type) {
355
+ if (type.match(/[;\}\)\],]/)) return pass();
356
+ return pass(expressionNoComma);
357
+ }
358
+
359
+ function maybeoperatorComma(type, value) {
360
+ if (type == ",") return cont(expression);
361
+ return maybeoperatorNoComma(type, value, false);
362
+ }
363
+ function maybeoperatorNoComma(type, value, noComma) {
364
+ var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma;
365
+ var expr = noComma == false ? expression : expressionNoComma;
366
+ if (value == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext);
367
+ if (type == "operator") {
368
+ if (/\+\+|--/.test(value)) return cont(me);
369
+ if (value == "?") return cont(expression, expect(":"), expr);
370
+ return cont(expr);
371
+ }
372
+ if (type == "quasi") { cx.cc.push(me); return quasi(value); }
373
+ if (type == ";") return;
374
+ if (type == "(") return contCommasep(expressionNoComma, ")", "call", me);
375
+ if (type == ".") return cont(property, me);
376
+ if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me);
377
+ }
378
+ function quasi(value) {
379
+ if (value.slice(value.length - 2) != "${") return cont();
380
+ return cont(expression, continueQuasi);
381
+ }
382
+ function continueQuasi(type) {
383
+ if (type == "}") {
384
+ cx.marked = "string-2";
385
+ cx.state.tokenize = tokenQuasi;
386
+ return cont();
387
+ }
388
+ }
389
+ function arrowBody(type) {
390
+ findFatArrow(cx.stream, cx.state);
391
+ if (type == "{") return pass(statement);
392
+ return pass(expression);
393
+ }
394
+ function arrowBodyNoComma(type) {
395
+ findFatArrow(cx.stream, cx.state);
396
+ if (type == "{") return pass(statement);
397
+ return pass(expressionNoComma);
398
+ }
399
+ function maybelabel(type) {
400
+ if (type == ":") return cont(poplex, statement);
401
+ return pass(maybeoperatorComma, expect(";"), poplex);
402
+ }
403
+ function property(type) {
404
+ if (type == "variable") {cx.marked = "property"; return cont();}
405
+ }
406
+ function objprop(type, value) {
407
+ if (type == "variable") {
408
+ cx.marked = "property";
409
+ if (value == "get" || value == "set") return cont(getterSetter);
410
+ } else if (type == "number" || type == "string") {
411
+ cx.marked = type + " property";
412
+ } else if (type == "[") {
413
+ return cont(expression, expect("]"), afterprop);
414
+ }
415
+ if (atomicTypes.hasOwnProperty(type)) return cont(afterprop);
416
+ }
417
+ function getterSetter(type) {
418
+ if (type != "variable") return pass(afterprop);
419
+ cx.marked = "property";
420
+ return cont(functiondef);
421
+ }
422
+ function afterprop(type) {
423
+ if (type == ":") return cont(expressionNoComma);
424
+ if (type == "(") return pass(functiondef);
425
+ }
426
+ function commasep(what, end) {
427
+ function proceed(type) {
428
+ if (type == ",") {
429
+ var lex = cx.state.lexical;
430
+ if (lex.info == "call") lex.pos = (lex.pos || 0) + 1;
431
+ return cont(what, proceed);
432
+ }
433
+ if (type == end) return cont();
434
+ return cont(expect(end));
435
+ }
436
+ return function(type) {
437
+ if (type == end) return cont();
438
+ return pass(what, proceed);
439
+ };
440
+ }
441
+ function contCommasep(what, end, info) {
442
+ for (var i = 3; i < arguments.length; i++)
443
+ cx.cc.push(arguments[i]);
444
+ return cont(pushlex(end, info), commasep(what, end), poplex);
445
+ }
446
+ function block(type) {
447
+ if (type == "}") return cont();
448
+ return pass(statement, block);
449
+ }
450
+ function maybetype(type) {
451
+ if (isTS && type == ":") return cont(typedef);
452
+ }
453
+ function typedef(type) {
454
+ if (type == "variable"){cx.marked = "variable-3"; return cont();}
455
+ }
456
+ function vardef() {
457
+ return pass(pattern, maybetype, maybeAssign, vardefCont);
458
+ }
459
+ function pattern(type, value) {
460
+ if (type == "variable") { register(value); return cont(); }
461
+ if (type == "[") return contCommasep(pattern, "]");
462
+ if (type == "{") return contCommasep(proppattern, "}");
463
+ }
464
+ function proppattern(type, value) {
465
+ if (type == "variable" && !cx.stream.match(/^\s*:/, false)) {
466
+ register(value);
467
+ return cont(maybeAssign);
468
+ }
469
+ if (type == "variable") cx.marked = "property";
470
+ return cont(expect(":"), pattern, maybeAssign);
471
+ }
472
+ function maybeAssign(_type, value) {
473
+ if (value == "=") return cont(expressionNoComma);
474
+ }
475
+ function vardefCont(type) {
476
+ if (type == ",") return cont(vardef);
477
+ }
478
+ function maybeelse(type, value) {
479
+ if (type == "keyword b" && value == "else") return cont(pushlex("form"), statement, poplex);
480
+ }
481
+ function forspec(type) {
482
+ if (type == "(") return cont(pushlex(")"), forspec1, expect(")"), poplex);
483
+ }
484
+ function forspec1(type) {
485
+ if (type == "var") return cont(vardef, expect(";"), forspec2);
486
+ if (type == ";") return cont(forspec2);
487
+ if (type == "variable") return cont(formaybeinof);
488
+ return pass(expression, expect(";"), forspec2);
489
+ }
490
+ function formaybeinof(_type, value) {
491
+ if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression); }
492
+ return cont(maybeoperatorComma, forspec2);
493
+ }
494
+ function forspec2(type, value) {
495
+ if (type == ";") return cont(forspec3);
496
+ if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression); }
497
+ return pass(expression, expect(";"), forspec3);
498
+ }
499
+ function forspec3(type) {
500
+ if (type != ")") cont(expression);
501
+ }
502
+ function functiondef(type, value) {
503
+ if (value == "*") {cx.marked = "keyword"; return cont(functiondef);}
504
+ if (type == "variable") {register(value); return cont(functiondef);}
505
+ if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, statement, popcontext);
506
+ }
507
+ function funarg(type) {
508
+ if (type == "spread") return cont(funarg);
509
+ return pass(pattern, maybetype);
510
+ }
511
+ function className(type, value) {
512
+ if (type == "variable") {register(value); return cont(classNameAfter);}
513
+ }
514
+ function classNameAfter(_type, value) {
515
+ if (value == "extends") return cont(expression);
516
+ }
517
+ function objlit(type) {
518
+ if (type == "{") return contCommasep(objprop, "}");
519
+ }
520
+ function afterModule(type, value) {
521
+ if (type == "string") return cont(statement);
522
+ if (type == "variable") { register(value); return cont(maybeFrom); }
523
+ }
524
+ function afterExport(_type, value) {
525
+ if (value == "*") { cx.marked = "keyword"; return cont(maybeFrom, expect(";")); }
526
+ if (value == "default") { cx.marked = "keyword"; return cont(expression, expect(";")); }
527
+ return pass(statement);
528
+ }
529
+ function afterImport(type) {
530
+ if (type == "string") return cont();
531
+ return pass(importSpec, maybeFrom);
532
+ }
533
+ function importSpec(type, value) {
534
+ if (type == "{") return contCommasep(importSpec, "}");
535
+ if (type == "variable") register(value);
536
+ return cont();
537
+ }
538
+ function maybeFrom(_type, value) {
539
+ if (value == "from") { cx.marked = "keyword"; return cont(expression); }
540
+ }
541
+ function arrayLiteral(type) {
542
+ if (type == "]") return cont();
543
+ return pass(expressionNoComma, maybeArrayComprehension);
544
+ }
545
+ function maybeArrayComprehension(type) {
546
+ if (type == "for") return pass(comprehension, expect("]"));
547
+ if (type == ",") return cont(commasep(expressionNoComma, "]"));
548
+ return pass(commasep(expressionNoComma, "]"));
549
+ }
550
+ function comprehension(type) {
551
+ if (type == "for") return cont(forspec, comprehension);
552
+ if (type == "if") return cont(expression, comprehension);
553
+ }
554
+
555
+ // Interface
556
+
557
+ return {
558
+ startState: function(basecolumn) {
559
+ var state = {
560
+ tokenize: tokenBase,
561
+ lastType: "sof",
562
+ cc: [],
563
+ lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false),
564
+ localVars: parserConfig.localVars,
565
+ context: parserConfig.localVars && {vars: parserConfig.localVars},
566
+ indented: 0
567
+ };
568
+ if (parserConfig.globalVars) state.globalVars = parserConfig.globalVars;
569
+ return state;
570
+ },
571
+
572
+ token: function(stream, state) {
573
+ if (stream.sol()) {
574
+ if (!state.lexical.hasOwnProperty("align"))
575
+ state.lexical.align = false;
576
+ state.indented = stream.indentation();
577
+ findFatArrow(stream, state);
578
+ }
579
+ if (state.tokenize != tokenComment && stream.eatSpace()) return null;
580
+ var style = state.tokenize(stream, state);
581
+ if (type == "comment") return style;
582
+ state.lastType = type == "operator" && (content == "++" || content == "--") ? "incdec" : type;
583
+ return parseJS(state, style, type, content, stream);
584
+ },
585
+
586
+ indent: function(state, textAfter) {
587
+ if (state.tokenize == tokenComment) return CodeMirror.Pass;
588
+ if (state.tokenize != tokenBase) return 0;
589
+ var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical;
590
+ // Kludge to prevent 'maybelse' from blocking lexical scope pops
591
+ for (var i = state.cc.length - 1; i >= 0; --i) {
592
+ var c = state.cc[i];
593
+ if (c == poplex) lexical = lexical.prev;
594
+ else if (c != maybeelse) break;
595
+ }
596
+ if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev;
597
+ if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat")
598
+ lexical = lexical.prev;
599
+ var type = lexical.type, closing = firstChar == type;
600
+
601
+ if (type == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? lexical.info + 1 : 0);
602
+ else if (type == "form" && firstChar == "{") return lexical.indented;
603
+ else if (type == "form") return lexical.indented + indentUnit;
604
+ else if (type == "stat")
605
+ return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? statementIndent || indentUnit : 0);
606
+ else if (lexical.info == "switch" && !closing && parserConfig.doubleIndentSwitch != false)
607
+ return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit);
608
+ else if (lexical.align) return lexical.column + (closing ? 0 : 1);
609
+ else return lexical.indented + (closing ? 0 : indentUnit);
610
+ },
611
+
612
+ electricChars: ":{}",
613
+ blockCommentStart: jsonMode ? null : "/*",
614
+ blockCommentEnd: jsonMode ? null : "*/",
615
+ lineComment: jsonMode ? null : "//",
616
+ fold: "brace",
617
+
618
+ helperType: jsonMode ? "json" : "javascript",
619
+ jsonMode: jsonMode
620
+ };
621
+ });
622
+
623
+ CodeMirror.defineMIME("text/javascript", "javascript");
624
+ CodeMirror.defineMIME("text/ecmascript", "javascript");
625
+ CodeMirror.defineMIME("application/javascript", "javascript");
626
+ CodeMirror.defineMIME("application/ecmascript", "javascript");
627
+ CodeMirror.defineMIME("application/json", {name: "javascript", json: true});
628
+ CodeMirror.defineMIME("application/x-json", {name: "javascript", json: true});
629
+ CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true });
630
+ CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true });
plugin-fw/assets/js/how-to.js CHANGED
@@ -1,6 +1,6 @@
1
- (function ( $ ) {
2
- var how_to_link = $( '#yith-how-to-premium' ).parent();
3
- if ( typeof how_to_link != 'undefined' ) {
4
- how_to_link.prop( 'target', '_blank' );
5
- }
6
- })( jQuery );
1
+ (function ( $ ) {
2
+ var how_to_link = $( '#yith-how-to-premium' ).parent();
3
+ if ( typeof how_to_link != 'undefined' ) {
4
+ how_to_link.prop( 'target', '_blank' );
5
+ }
6
+ })( jQuery );
plugin-fw/assets/js/how-to.min.js CHANGED
@@ -1 +1 @@
1
- (function(a){a=a("#yith-how-to-premium").parent();"undefined"!=typeof a&&a.prop("target","_blank")})(jQuery);
1
+ (function(a){a=a("#yith-how-to-premium").parent();"undefined"!=typeof a&&a.prop("target","_blank")})(jQuery);
plugin-fw/assets/js/jquery.colorbox.js CHANGED
@@ -1,1105 +1,1105 @@
1
- /*!
2
- Colorbox 1.6.3
3
- license: MIT
4
- http://www.jacklmoore.com/colorbox
5
- */
6
- (function ($, document, window) {
7
- var
8
- // Default settings object.
9
- // See http://jacklmoore.com/colorbox for details.
10
- defaults = {
11
- // data sources
12
- html: false,
13
- photo: false,
14
- iframe: false,
15
- inline: false,
16
-
17
- // behavior and appearance
18
- transition: "elastic",
19
- speed: 300,
20
- fadeOut: 300,
21
- width: false,
22
- initialWidth: "600",
23
- innerWidth: false,
24
- maxWidth: false,
25
- height: false,
26
- initialHeight: "450",
27
- innerHeight: false,
28
- maxHeight: false,
29
- scalePhotos: true,
30
- scrolling: true,
31
- opacity: 0.9,
32
- preloading: true,
33
- className: false,
34
- overlayClose: true,
35
- escKey: true,
36
- arrowKey: true,
37
- top: false,
38
- bottom: false,
39
- left: false,
40
- right: false,
41
- fixed: false,
42
- data: undefined,
43
- closeButton: true,
44
- fastIframe: true,
45
- open: false,
46
- reposition: true,
47
- loop: true,
48
- slideshow: false,
49
- slideshowAuto: true,
50
- slideshowSpeed: 2500,
51
- slideshowStart: "start slideshow",
52
- slideshowStop: "stop slideshow",
53
- photoRegex: /\.(gif|png|jp(e|g|eg)|bmp|ico|webp|jxr|svg)((#|\?).*)?$/i,
54
-
55
- // alternate image paths for high-res displays
56
- retinaImage: false,
57
- retinaUrl: false,
58
- retinaSuffix: '@2x.$1',
59
-
60
- // internationalization
61
- current: "image {current} of {total}",
62
- previous: "previous",
63
- next: "next",
64
- close: "close",
65
- xhrError: "This content failed to load.",
66
- imgError: "This image failed to load.",
67
-
68
- // accessbility
69
- returnFocus: true,
70
- trapFocus: true,
71
-
72
- // callbacks
73
- onOpen: false,
74
- onLoad: false,
75
- onComplete: false,
76
- onCleanup: false,
77
- onClosed: false,
78
-
79
- rel: function() {
80
- return this.rel;
81
- },
82
- href: function() {
83
- // using this.href would give the absolute url, when the href may have been inteded as a selector (e.g. '#container')
84
- return $(this).attr('href');
85
- },
86
- title: function() {
87
- return this.title;
88
- },
89
- createImg: function() {
90
- var img = new Image();
91
- var attrs = $(this).data('cbox-img-attrs');
92
-
93
- if (typeof attrs === 'object') {
94
- $.each(attrs, function(key, val){
95
- img[key] = val;
96
- });
97
- }
98
-
99
- return img;
100
- },
101
- createIframe: function() {
102
- var iframe = document.createElement('iframe');
103
- var attrs = $(this).data('cbox-iframe-attrs');
104
-
105
- if (typeof attrs === 'object') {
106
- $.each(attrs, function(key, val){
107
- iframe[key] = val;
108
- });
109
- }
110
-
111
- if ('frameBorder' in iframe) {
112
- iframe.frameBorder = 0;
113
- }
114
- if ('allowTransparency' in iframe) {
115
- iframe.allowTransparency = "true";
116
- }
117
- iframe.name = (new Date()).getTime(); // give the iframe a unique name to prevent caching
118
- iframe.allowFullscreen = true;
119
-
120
- return iframe;
121
- }
122
- },
123
-
124
- // Abstracting the HTML and event identifiers for easy rebranding
125
- colorbox = 'colorbox',
126
- prefix = 'cbox',
127
- boxElement = prefix + 'Element',
128
-
129
- // Events
130
- event_open = prefix + '_open',
131
- event_load = prefix + '_load',
132
- event_complete = prefix + '_complete',
133
- event_cleanup = prefix + '_cleanup',
134
- event_closed = prefix + '_closed',
135
- event_purge = prefix + '_purge',
136
-
137
- // Cached jQuery Object Variables
138
- $overlay,
139
- $box,
140
- $wrap,
141
- $content,
142
- $topBorder,
143
- $leftBorder,
144
- $rightBorder,
145
- $bottomBorder,
146
- $related,
147
- $window,
148
- $loaded,
149
- $loadingBay,
150
- $loadingOverlay,
151
- $title,
152
- $current,
153
- $slideshow,
154
- $next,
155
- $prev,
156
- $close,
157
- $groupControls,
158
- $events = $('<a/>'), // $({}) would be prefered, but there is an issue with jQuery 1.4.2
159
-
160
- // Variables for cached values or use across multiple functions
161
- settings,
162
- interfaceHeight,
163
- interfaceWidth,
164
- loadedHeight,
165
- loadedWidth,
166
- index,
167
- photo,
168
- open,
169
- active,
170
- closing,
171
- loadingTimer,
172
- publicMethod,
173
- div = "div",
174
- requests = 0,
175
- previousCSS = {},
176
- init;
177
-
178
- // ****************
179
- // HELPER FUNCTIONS
180
- // ****************
181
-
182
- // Convenience function for creating new jQuery objects
183
- function $tag(tag, id, css) {
184
- var element = document.createElement(tag);
185
-
186
- if (id) {
187
- element.id = prefix + id;
188
- }
189
-
190
- if (css) {
191
- element.style.cssText = css;
192
- }
193
-
194
- return $(element);
195
- }
196
-
197
- // Get the window height using innerHeight when available to avoid an issue with iOS
198
- // http://bugs.jquery.com/ticket/6724
199
- function winheight() {
200
- return window.innerHeight ? window.innerHeight : $(window).height();
201
- }
202
-
203
- function Settings(element, options) {
204
- if (options !== Object(options)) {
205
- options = {};
206
- }
207
-
208
- this.cache = {};
209
- this.el = element;
210
-
211
- this.value = function(key) {
212
- var dataAttr;
213
-
214
- if (this.cache[key] === undefined) {
215
- dataAttr = $(this.el).attr('data-cbox-'+key);
216
-
217
- if (dataAttr !== undefined) {
218
- this.cache[key] = dataAttr;
219
- } else if (options[key] !== undefined) {
220
- this.cache[key] = options[key];
221
- } else if (defaults[key] !== undefined) {
222
- this.cache[key] = defaults[key];
223
- }
224
- }
225
-
226
- return this.cache[key];
227
- };
228
-
229
- this.get = function(key) {
230
- var value = this.value(key);
231
- return $.isFunction(value) ? value.call(this.el, this) : value;
232
- };
233
- }
234
-
235
- // Determine the next and previous members in a group.
236
- function getIndex(increment) {
237
- var
238
- max = $related.length,
239
- newIndex = (index + increment) % max;
240
-
241
- return (newIndex < 0) ? max + newIndex : newIndex;
242
- }
243
-
244
- // Convert '%' and 'px' values to integers
245
- function setSize(size, dimension) {
246
- return Math.round((/%/.test(size) ? ((dimension === 'x' ? $window.width() : winheight()) / 100) : 1) * parseInt(size, 10));
247
- }
248
-
249
- // Checks an href to see if it is a photo.
250
- // There is a force photo option (photo: true) for hrefs that cannot be matched by the regex.
251
- function isImage(settings, url) {
252
- return settings.get('photo') || settings.get('photoRegex').test(url);
253
- }
254
-
255
- function retinaUrl(settings, url) {
256
- return settings.get('retinaUrl') && window.devicePixelRatio > 1 ? url.replace(settings.get('photoRegex'), settings.get('retinaSuffix')) : url;
257
- }
258
-
259
- function trapFocus(e) {
260
- if ('contains' in $box[0] && !$box[0].contains(e.target) && e.target !== $overlay[0]) {
261
- e.stopPropagation();
262
- $box.focus();
263
- }
264
- }
265
-
266
- function setClass(str) {
267
- if (setClass.str !== str) {
268
- $box.add($overlay).removeClass(setClass.str).addClass(str);
269
- setClass.str = str;
270
- }
271
- }
272
-
273
- function getRelated(rel) {
274
- index = 0;
275
-
276
- if (rel && rel !== false && rel !== 'nofollow') {
277
- $related = $('.' + boxElement).filter(function () {
278
- var options = $.data(this, colorbox);
279
- var settings = new Settings(this, options);
280
- return (settings.get('rel') === rel);
281
- });
282
- index = $related.index(settings.el);
283
-
284
- // Check direct calls to Colorbox.
285
- if (index === -1) {
286
- $related = $related.add(settings.el);
287
- index = $related.length - 1;
288
- }
289
- } else {
290
- $related = $(settings.el);
291
- }
292
- }
293
-
294
- function trigger(event) {
295
- // for external use
296
- $(document).trigger(event);
297
- // for internal use
298
- $events.triggerHandler(event);
299
- }
300
-
301
- var slideshow = (function(){
302
- var active,
303
- className = prefix + "Slideshow_",
304
- click = "click." + prefix,
305
- timeOut;
306
-
307
- function clear () {
308
- clearTimeout(timeOut);
309
- }
310
-
311
- function set() {
312
- if (settings.get('loop') || $related[index + 1]) {
313
- clear();
314
- timeOut = setTimeout(publicMethod.next, settings.get('slideshowSpeed'));
315
- }
316
- }
317
-
318
- function start() {
319
- $slideshow
320
- .html(settings.get('slideshowStop'))
321
- .unbind(click)
322
- .one(click, stop);
323
-
324
- $events
325
- .bind(event_complete, set)
326
- .bind(event_load, clear);
327
-
328
- $box.removeClass(className + "off").addClass(className + "on");
329
- }
330
-
331
- function stop() {
332
- clear();
333
-
334
- $events
335
- .unbind(event_complete, set)
336
- .unbind(event_load, clear);
337
-
338
- $slideshow
339
- .html(settings.get('slideshowStart'))
340
- .unbind(click)
341
- .one(click, function () {
342
- publicMethod.next();
343
- start();
344
- });
345
-
346
- $box.removeClass(className + "on").addClass(className + "off");
347
- }
348
-
349
- function reset() {
350
- active = false;
351
- $slideshow.hide();
352
- clear();
353
- $events
354
- .unbind(event_complete, set)
355
- .unbind(event_load, clear);
356
- $box.removeClass(className + "off " + className + "on");
357
- }
358
-
359
- return function(){
360
- if (active) {
361
- if (!settings.get('slideshow')) {
362
- $events.unbind(event_cleanup, reset);
363
- reset();
364
- }
365
- } else {
366
- if (settings.get('slideshow') && $related[1]) {
367
- active = true;
368
- $events.one(event_cleanup, reset);
369
- if (settings.get('slideshowAuto')) {
370
- start();
371
- } else {
372
- stop();
373
- }
374
- $slideshow.show();
375
- }
376
- }
377
- };
378
-
379
- }());
380
-
381
-
382
- function launch(element) {
383
- var options;
384
-
385
- if (!closing) {
386
-
387
- options = $(element).data(colorbox);
388
-
389
- settings = new Settings(element, options);
390
-
391
- getRelated(settings.get('rel'));
392
-
393
- if (!open) {
394
- open = active = true; // Prevents the page-change action from queuing up if the visitor holds down the left or right keys.
395
-
396
- setClass(settings.get('className'));
397
-
398
- // Show colorbox so the sizes can be calculated in older versions of jQuery
399
- $box.css({visibility:'hidden', display:'block', opacity:''});
400
-
401
- $loaded = $tag(div, 'LoadedContent', 'width:0; height:0; overflow:hidden; visibility:hidden');
402
- $content.css({width:'', height:''}).append($loaded);
403
-
404
- // Cache values needed for size calculations
405
- interfaceHeight = $topBorder.height() + $bottomBorder.height() + $content.outerHeight(true) - $content.height();
406
- interfaceWidth = $leftBorder.width() + $rightBorder.width() + $content.outerWidth(true) - $content.width();
407
- loadedHeight = $loaded.outerHeight(true);
408
- loadedWidth = $loaded.outerWidth(true);
409
-
410
- // Opens inital empty Colorbox prior to content being loaded.
411
- var initialWidth = setSize(settings.get('initialWidth'), 'x');
412
- var initialHeight = setSize(settings.get('initialHeight'), 'y');
413
- var maxWidth = settings.get('maxWidth');
414
- var maxHeight = settings.get('maxHeight');
415
-
416
- settings.w = Math.max((maxWidth !== false ? Math.min(initialWidth, setSize(maxWidth, 'x')) : initialWidth) - loadedWidth - interfaceWidth, 0);
417
- settings.h = Math.max((maxHeight !== false ? Math.min(initialHeight, setSize(maxHeight, 'y')) : initialHeight) - loadedHeight - interfaceHeight, 0);
418
-
419
- $loaded.css({width:'', height:settings.h});
420
- publicMethod.position();
421
-
422
- trigger(event_open);
423
- settings.get('onOpen');
424
-
425
- $groupControls.add($title).hide();
426
-
427
- $box.focus();
428
-
429
- if (settings.get('trapFocus')) {
430
- // Confine focus to the modal
431
- // Uses event capturing that is not supported in IE8-
432
- if (document.addEventListener) {
433
-
434
- document.addEventListener('focus', trapFocus, true);
435
-
436
- $events.one(event_closed, function () {
437
- document.removeEventListener('focus', trapFocus, true);
438
- });
439
- }
440
- }
441
-
442
- // Return focus on closing
443
- if (settings.get('returnFocus')) {
444
- $events.one(event_closed, function () {
445
- $(settings.el).focus();
446
- });
447
- }
448
- }
449
-
450
- var opacity = parseFloat(settings.get('opacity'));
451
- $overlay.css({
452
- opacity: opacity === opacity ? opacity : '',
453
- cursor: settings.get('overlayClose') ? 'pointer' : '',
454
- visibility: 'visible'
455
- }).show();
456
-
457
- if (settings.get('closeButton')) {
458
- $close.html(settings.get('close')).appendTo($content);
459
- } else {
460
- $close.appendTo('<div/>'); // replace with .detach() when dropping jQuery < 1.4
461
- }
462
-
463
- load();
464
- }
465
- }
466
-
467
- // Colorbox's markup needs to be added to the DOM prior to being called
468
- // so that the browser will go ahead and load the CSS background images.
469
- function appendHTML() {
470
- if (!$box) {
471
- init = false;
472
- $window = $(window);
473
- $box = $tag(div).attr({
474
- id: colorbox,
475
- 'class': $.support.opacity === false ? prefix + 'IE' : '', // class for optional IE8 & lower targeted CSS.
476
- role: 'dialog',
477
- tabindex: '-1'
478
- }).hide();
479
- $overlay = $tag(div, "Overlay").hide();
480
- $loadingOverlay = $([$tag(div, "LoadingOverlay")[0],$tag(div, "LoadingGraphic")[0]]);
481
- $wrap = $tag(div, "Wrapper");
482
- $content = $tag(div, "Content").append(
483
- $title = $tag(div, "Title"),
484
- $current = $tag(div, "Current"),
485
- $prev = $('<button type="button"/>').attr({id:prefix+'Previous'}),
486
- $next = $('<button type="button"/>').attr({id:prefix+'Next'}),
487
- $slideshow = $tag('button', "Slideshow"),
488
- $loadingOverlay
489
- );
490
-
491
- $close = $('<button type="button"/>').attr({id:prefix+'Close'});
492
-
493
- $wrap.append( // The 3x3 Grid that makes up Colorbox
494
- $tag(div).append(
495
- $tag(div, "TopLeft"),
496
- $topBorder = $tag(div, "TopCenter"),
497
- $tag(div, "TopRight")
498
- ),
499
- $tag(div, false, 'clear:left').append(
500
- $leftBorder = $tag(div, "MiddleLeft"),
501
- $content,
502
- $rightBorder = $tag(div, "MiddleRight")
503
- ),
504
- $tag(div, false, 'clear:left').append(
505
- $tag(div, "BottomLeft"),
506
- $bottomBorder = $tag(div, "BottomCenter"),
507
- $tag(div, "BottomRight")
508
- )
509
- ).find('div div').css({'float': 'left'});
510
-
511
- $loadingBay = $tag(div, false, 'position:absolute; width:9999px; visibility:hidden; display:none; max-width:none;');
512
-
513
- $groupControls = $next.add($prev).add($current).add($slideshow);
514
- }
515
- if (document.body && !$box.parent().length) {
516
- $(document.body).append($overlay, $box.append($wrap, $loadingBay));
517
- }
518
- }
519
-
520
- // Add Colorbox's event bindings
521
- function addBindings() {
522
- function clickHandler(e) {
523
- // ignore non-left-mouse-clicks and clicks modified with ctrl / command, shift, or alt.
524
- // See: http://jacklmoore.com/notes/click-events/
525
- if (!(e.which > 1 || e.shiftKey || e.altKey || e.metaKey || e.ctrlKey)) {
526
- e.preventDefault();
527
- launch(this);
528
- }
529
- }
530
-
531
- if ($box) {
532
- if (!init) {
533
- init = true;
534
-
535
- // Anonymous functions here keep the public method from being cached, thereby allowing them to be redefined on the fly.
536
- $next.click(function () {
537
- publicMethod.next();
538
- });
539
- $prev.click(function () {
540
- publicMethod.prev();
541
- });
542
- $close.click(function () {
543
- publicMethod.close();
544
- });
545
- $overlay.click(function () {
546
- if (settings.get('overlayClose')) {
547
- publicMethod.close();
548
- }
549
- });
550
-
551
- // Key Bindings
552
- $(document).bind('keydown.' + prefix, function (e) {
553
- var key = e.keyCode;
554
- if (open && settings.get('escKey') && key === 27) {
555
- e.preventDefault();
556
- publicMethod.close();
557
- }
558
- if (open && settings.get('arrowKey') && $related[1] && !e.altKey) {
559
- if (key === 37) {
560
- e.preventDefault();
561
- $prev.click();
562
- } else if (key === 39) {
563
- e.preventDefault();
564
- $next.click();
565
- }
566
- }
567
- });
568
-
569
- if ($.isFunction($.fn.on)) {
570
- // For jQuery 1.7+
571
- $(document).on('click.'+prefix, '.'+boxElement, clickHandler);
572
- } else {
573
- // For jQuery 1.3.x -> 1.6.x
574
- // This code is never reached in jQuery 1.9, so do not contact me about 'live' being removed.
575
- // This is not here for jQuery 1.9, it's here for legacy users.
576
- $('.'+boxElement).live('click.'+prefix, clickHandler);
577
- }
578
- }
579
- return true;
580
- }
581
- return false;
582
- }
583
-
584
- // Don't do anything if Colorbox already exists.
585
- if ($[colorbox]) {
586
- return;
587
- }
588
-
589
- // Append the HTML when the DOM loads
590
- $(appendHTML);
591
-
592
-
593
- // ****************
594
- // PUBLIC FUNCTIONS
595
- // Usage format: $.colorbox.close();
596
- // Usage from within an iframe: parent.jQuery.colorbox.close();
597
- // ****************
598
-
599
- publicMethod = $.fn[colorbox] = $[colorbox] = function (options, callback) {
600
- var settings;
601
- var $obj = this;
602
-
603
- options = options || {};
604
-
605
- if ($.isFunction($obj)) { // assume a call to $.colorbox
606
- $obj = $('<a/>');
607
- options.open = true;
608
- }
609
-
610
- if (!$obj[0]) { // colorbox being applied to empty collection
611
- return $obj;
612
- }
613
-
614
- appendHTML();
615
-
616
- if (addBindings()) {
617
-
618
- if (callback) {
619
- options.onComplete = callback;
620
- }
621
-
622
- $obj.each(function () {
623
- var old = $.data(this, colorbox) || {};
624
- $.data(this, colorbox, $.extend(old, options));
625
- }).addClass(boxElement);
626
-
627
- settings = new Settings($obj[0], options);
628
-
629
- if (settings.get('open')) {
630
- launch($obj[0]);
631
- }
632
- }
633
-
634
- return $obj;
635
- };
636
-
637
- publicMethod.position = function (speed, loadedCallback) {
638
- var
639
- css,
640
- top = 0,
641
- left = 0,
642
- offset = $box.offset(),
643
- scrollTop,
644
- scrollLeft;
645
-
646
- $window.unbind('resize.' + prefix);
647
-
648
- // remove the modal so that it doesn't influence the document width/height
649
- $box.css({top: -9e4, left: -9e4});
650
-
651
- scrollTop = $window.scrollTop();
652
- scrollLeft = $window.scrollLeft();
653
-
654
- if (settings.get('fixed')) {
655
- offset.top -= scrollTop;
656
- offset.left -= scrollLeft;
657
- $box.css({position: 'fixed'});
658
- } else {
659
- top = scrollTop;
660
- left = scrollLeft;
661
- $box.css({position: 'absolute'});
662
- }
663
-
664
- // keeps the top and left positions within the browser's viewport.
665
- if (settings.get('right') !== false) {
666
- left += Math.max($window.width() - settings.w - loadedWidth - interfaceWidth - setSize(settings.get('right'), 'x'), 0);
667
- } else if (settings.get('left') !== false) {
668
- left += setSize(settings.get('left'), 'x');
669
- } else {
670
- left += Math.round(Math.max($window.width() - settings.w - loadedWidth - interfaceWidth, 0) / 2);
671
- }
672
-
673
- if (settings.get('bottom') !== false) {
674
- top += Math.max(winheight() - settings.h - loadedHeight - interfaceHeight - setSize(settings.get('bottom'), 'y'), 0);
675
- } else if (settings.get('top') !== false) {
676
- top += setSize(settings.get('top'), 'y');
677
- } else {
678
- top += Math.round(Math.max(winheight() - settings.h - loadedHeight - interfaceHeight, 0) / 2);
679
- }
680
-
681
- $box.css({top: offset.top, left: offset.left, visibility:'visible'});
682
-
683
- // this gives the wrapper plenty of breathing room so it's floated contents can move around smoothly,
684
- // but it has to be shrank down around the size of div#colorbox when it's done. If not,
685
- // it can invoke an obscure IE bug when using iframes.
686
- $wrap[0].style.width = $wrap[0].style.height = "9999px";
687
-
688
- function modalDimensions() {
689
- $topBorder[0].style.width = $bottomBorder[0].style.width = $content[0].style.width = (parseInt($box[0].style.width,10) - interfaceWidth)+'px';
690
- $content[0].style.height = $leftBorder[0].style.height = $rightBorder[0].style.height = (parseInt($box[0].style.height,10) - interfaceHeight)+'px';
691
- }
692
-
693
- css = {width: settings.w + loadedWidth + interfaceWidth, height: settings.h + loadedHeight + interfaceHeight, top: top, left: left};
694
-
695
- // setting the speed to 0 if the content hasn't changed size or position
696
- if (speed) {
697
- var tempSpeed = 0;
698
- $.each(css, function(i){
699
- if (css[i] !== previousCSS[i]) {
700
- tempSpeed = speed;
701
- return;
702
- }
703
- });
704
- speed = tempSpeed;
705
- }
706
-
707
- previousCSS = css;
708
-
709
- if (!speed) {
710
- $box.css(css);
711
- }
712
-
713
- $box.dequeue().animate(css, {
714
- duration: speed || 0,
715
- complete: function () {
716
- modalDimensions();
717
-
718
- active = false;
719
-
720
- // shrink the wrapper down to exactly the size of colorbox to avoid a bug in IE's iframe implementation.
721
- $wrap[0].style.width = (settings.w + loadedWidth + interfaceWidth) + "px";
722
- $wrap[0].style.height = (settings.h + loadedHeight + interfaceHeight) + "px";
723
-
724
- if (settings.get('reposition')) {
725
- setTimeout(function () { // small delay before binding onresize due to an IE8 bug.
726
- $window.bind('resize.' + prefix, publicMethod.position);
727
- }, 1);
728
- }
729
-
730
- if ($.isFunction(loadedCallback)) {
731
- loadedCallback();
732
- }
733
- },
734
- step: modalDimensions
735
- });
736
- };
737
-
738
- publicMethod.resize = function (options) {
739
- var scrolltop;
740
-
741
- if (open) {
742
- options = options || {};
743
-
744
- if (options.width) {
745
- settings.w = setSize(options.width, 'x') - loadedWidth - interfaceWidth;
746
- }
747
-
748
- if (options.innerWidth) {
749
- settings.w = setSize(options.innerWidth, 'x');
750
- }
751
-
752
- $loaded.css({width: settings.w});
753
-
754
- if (options.height) {
755
- settings.h = setSize(options.height, 'y') - loadedHeight - interfaceHeight;
756
- }
757
-
758
- if (options.innerHeight) {
759
- settings.h = setSize(options.innerHeight, 'y');
760
- }
761
-
762
- if (!options.innerHeight && !options.height) {
763
- scrolltop = $loaded.scrollTop();
764
- $loaded.css({height: "auto"});
765
- settings.h = $loaded.height();
766
- }
767
-
768
- $loaded.css({height: settings.h});
769
-
770
- if(scrolltop) {
771
- $loaded.scrollTop(scrolltop);
772
- }
773
-
774
- publicMethod.position(settings.get('transition') === "none" ? 0 : settings.get('speed'));
775
- }
776
- };
777
-
778
- publicMethod.prep = function (object) {
779
- if (!open) {
780
- return;
781
- }
782
-
783
- var callback, speed = settings.get('transition') === "none" ? 0 : settings.get('speed');
784
-
785
- $loaded.remove();
786
-
787
- $loaded = $tag(div, 'LoadedContent').append(object);
788
-
789
- function getWidth() {
790
- settings.w = settings.w || $loaded.width();
791
- settings.w = settings.mw && settings.mw < settings.w ? settings.mw : settings.w;
792
- return settings.w;
793
- }
794
- function getHeight() {
795
- settings.h = settings.h || $loaded.height();
796
- settings.h = settings.mh && settings.mh < settings.h ? settings.mh : settings.h;
797
- return settings.h;
798
- }
799
-
800
- $loaded.hide()
801
- .appendTo($loadingBay.show())// content has to be appended to the DOM for accurate size calculations.
802
- .css({width: getWidth(), overflow: settings.get('scrolling') ? 'auto' : 'hidden'})
803
- .css({height: getHeight()})// sets the height independently from the width in case the new width influences the value of height.
804
- .prependTo($content);
805
-
806
- $loadingBay.hide();
807
-
808
- // floating the IMG removes the bottom line-height and fixed a problem where IE miscalculates the width of the parent element as 100% of the document width.
809
-
810
- $(photo).css({'float': 'none'});
811
-
812
- setClass(settings.get('className'));
813
-
814
- callback = function () {
815
- var total = $related.length,
816
- iframe,
817
- complete;
818
-
819
- if (!open) {
820
- return;
821
- }
822
-
823
- function removeFilter() { // Needed for IE8 in versions of jQuery prior to 1.7.2
824
- if ($.support.opacity === false) {
825
- $box[0].style.removeAttribute('filter');
826
- }
827
- }
828
-
829
- complete = function () {
830
- clearTimeout(loadingTimer);
831
- $loadingOverlay.hide();
832
- trigger(event_complete);
833
- settings.get('onComplete');
834
- };
835
-
836
-
837
- $title.html(settings.get('title')).show();
838
- $loaded.show();
839
-
840
- if (total > 1) { // handle grouping
841
- if (typeof settings.get('current') === "string") {
842
- $current.html(settings.get('current').replace('{current}', index + 1).replace('{total}', total)).show();
843
- }
844
-
845
- $next[(settings.get('loop') || index < total - 1) ? "show" : "hide"]().html(settings.get('next'));
846
- $prev[(settings.get('loop') || index) ? "show" : "hide"]().html(settings.get('previous'));
847
-
848
- slideshow();
849
-
850
- // Preloads images within a rel group
851
- if (settings.get('preloading')) {
852
- $.each([getIndex(-1), getIndex(1)], function(){
853
- var img,
854
- i = $related[this],
855
- settings = new Settings(i, $.data(i, colorbox)),
856
- src = settings.get('href');
857
-
858
- if (src && isImage(settings, src)) {
859
- src = retinaUrl(settings, src);
860
- img = document.createElement('img');
861
- img.src = src;
862
- }
863
- });
864
- }
865
- } else {
866
- $groupControls.hide();
867
- }
868
-
869
- if (settings.get('iframe')) {
870
-
871
- iframe = settings.get('createIframe');
872
-
873
- if (!settings.get('scrolling')) {
874
- iframe.scrolling = "no";
875
- }
876
-
877
- $(iframe)
878
- .attr({
879
- src: settings.get('href'),
880
- 'class': prefix + 'Iframe'
881
- })
882
- .one('load', complete)
883
- .appendTo($loaded);
884
-
885
- $events.one(event_purge, function () {
886
- iframe.src = "//about:blank";
887
- });
888
-
889
- if (settings.get('fastIframe')) {
890
- $(iframe).trigger('load');
891
- }
892
- } else {
893
- complete();
894
- }
895
-
896
- if (settings.get('transition') === 'fade') {
897
- $box.fadeTo(speed, 1, removeFilter);
898
- } else {
899
- removeFilter();
900
- }
901
- };
902
-
903
- if (settings.get('transition') === 'fade') {
904
- $box.fadeTo(speed, 0, function () {
905
- publicMethod.position(0, callback);
906
- });
907
- } else {
908
- publicMethod.position(speed, callback);
909
- }
910
- };
911
-
912
- function load () {
913
- var href, setResize, prep = publicMethod.prep, $inline, request = ++requests;
914
-
915
- active = true;
916
-
917
- photo = false;
918
-
919
- trigger(event_purge);
920
- trigger(event_load);
921
- settings.get('onLoad');
922
-
923
- settings.h = settings.get('height') ?
924
- setSize(settings.get('height'), 'y') - loadedHeight - interfaceHeight :
925
- settings.get('innerHeight') && setSize(settings.get('innerHeight'), 'y');
926
-
927
- settings.w = settings.get('width') ?
928
- setSize(settings.get('width'), 'x') - loadedWidth - interfaceWidth :
929
- settings.get('innerWidth') && setSize(settings.get('innerWidth'), 'x');
930
-
931
- // Sets the minimum dimensions for use in image scaling
932
- settings.mw = settings.w;
933
- settings.mh = settings.h;
934
-
935
- // Re-evaluate the minimum width and height based on maxWidth and maxHeight values.
936
- // If the width or height exceed the maxWidth or maxHeight, use the maximum values instead.
937
- if (settings.get('maxWidth')) {
938
- settings.mw = setSize(settings.get('maxWidth'), 'x') - loadedWidth - interfaceWidth;
939
- settings.mw = settings.w && settings.w < settings.mw ? settings.w : settings.mw;
940
- }
941
- if (settings.get('maxHeight')) {
942
- settings.mh = setSize(settings.get('maxHeight'), 'y') - loadedHeight - interfaceHeight;
943
- settings.mh = settings.h && settings.h < settings.mh ? settings.h : settings.mh;
944
- }
945
-
946
- href = settings.get('href');
947
-
948
- loadingTimer = setTimeout(function () {
949
- $loadingOverlay.show();
950
- }, 100);
951
-
952
- if (settings.get('inline')) {
953
- var $target = $(href);
954
- // Inserts an empty placeholder where inline content is being pulled from.
955
- // An event is bound to put inline content back when Colorbox closes or loads new content.
956
- $inline = $('<div>').hide().insertBefore($target);
957
-
958
- $events.one(event_purge, function () {
959
- $inline.replaceWith($target);
960
- });
961
-
962
- prep($target);
963
- } else if (settings.get('iframe')) {
964
- // IFrame element won't be added to the DOM until it is ready to be displayed,
965
- // to avoid problems with DOM-ready JS that might be trying to run in that iframe.
966
- prep(" ");
967
- } else if (settings.get('html')) {
968
- prep(settings.get('html'));
969
- } else if (isImage(settings, href)) {
970
-
971
- href = retinaUrl(settings, href);
972
-
973
- photo = settings.get('createImg');
974
-
975
- $(photo)
976
- .addClass(prefix + 'Photo')
977
- .bind('error.'+prefix,function () {
978
- prep($tag(div, 'Error').html(settings.get('imgError')));
979
- })
980
- .one('load', function () {
981
- if (request !== requests) {
982
- return;
983
- }
984
-
985
- // A small pause because some browsers will occassionaly report a
986
- // img.width and img.height of zero immediately after the img.onload fires
987
- setTimeout(function(){
988
- var percent;
989
-
990
- if (settings.get('retinaImage') && window.devicePixelRatio > 1) {
991
- photo.height = photo.height / window.devicePixelRatio;
992
- photo.width = photo.width / window.devicePixelRatio;
993
- }
994
-
995
- if (settings.get('scalePhotos')) {
996
- setResize = function () {
997
- photo.height -= photo.height * percent;
998
- photo.width -= photo.width * percent;
999
- };
1000
- if (settings.mw && photo.width > settings.mw) {
1001
- percent = (photo.width - settings.mw) / photo.width;
1002
- setResize();
1003
- }
1004
- if (settings.mh && photo.height > settings.mh) {
1005
- percent = (photo.height - settings.mh) / photo.height;
1006
- setResize();
1007
- }
1008
- }
1009
-
1010
- if (settings.h) {
1011
- photo.style.marginTop = Math.max(settings.mh - photo.height, 0) / 2 + 'px';
1012
- }
1013
-
1014
- if ($related[1] && (settings.get('loop') || $related[index + 1])) {
1015
- photo.style.cursor = 'pointer';
1016
-
1017
- $(photo).bind('click.'+prefix, function () {
1018
- publicMethod.next();
1019
- });
1020
- }
1021
-
1022
- photo.style.width = photo.width + 'px';
1023
- photo.style.height = photo.height + 'px';
1024
- prep(photo);
1025
- }, 1);
1026
- });
1027
-
1028
- photo.src = href;
1029
-
1030
- } else if (href) {
1031
- $loadingBay.load(href, settings.get('data'), function (data, status) {
1032
- if (request === requests) {
1033
- prep(status === 'error' ? $tag(div, 'Error').html(settings.get('xhrError')) : $(this).contents());
1034
- }
1035
- });
1036
- }
1037
- }
1038
-
1039
- // Navigates to the next page/image in a set.
1040
- publicMethod.next = function () {
1041
- if (!active && $related[1] && (settings.get('loop') || $related[index + 1])) {
1042
- index = getIndex(1);
1043
- launch($related[index]);
1044
- }
1045
- };
1046
-
1047
- publicMethod.prev = function () {
1048
- if (!active && $related[1] && (settings.get('loop') || index)) {
1049
- index = getIndex(-1);
1050
- launch($related[index]);
1051
- }
1052
- };
1053
-
1054
- // Note: to use this within an iframe use the following format: parent.jQuery.colorbox.close();
1055
- publicMethod.close = function () {
1056
- if (open && !closing) {
1057
-
1058
- closing = true;
1059
- open = false;
1060
- trigger(event_cleanup);
1061
- settings.get('onCleanup');
1062
- $window.unbind('.' + prefix);
1063
- $overlay.fadeTo(settings.get('fadeOut') || 0, 0);
1064
-
1065
- $box.stop().fadeTo(settings.get('fadeOut') || 0, 0, function () {
1066
- $box.hide();
1067
- $overlay.hide();
1068
- trigger(event_purge);
1069
- $loaded.remove();
1070
-
1071
- setTimeout(function () {
1072
- closing = false;
1073
- trigger(event_closed);
1074
- settings.get('onClosed');
1075
- }, 1);
1076
- });
1077
- }
1078
- };
1079
-
1080
- // Removes changes Colorbox made to the document, but does not remove the plugin.
1081
- publicMethod.remove = function () {
1082
- if (!$box) { return; }
1083
-
1084
- $box.stop();
1085
- $[colorbox].close();
1086
- $box.stop(false, true).remove();
1087
- $overlay.remove();
1088
- closing = false;
1089
- $box = null;
1090
- $('.' + boxElement)
1091
- .removeData(colorbox)
1092
- .removeClass(boxElement);
1093
-
1094
- $(document).unbind('click.'+prefix).unbind('keydown.'+prefix);
1095
- };
1096
-
1097
- // A method for fetching the current element Colorbox is referencing.
1098
- // returns a jQuery object.
1099
- publicMethod.element = function () {
1100
- return $(settings.el);
1101
- };
1102
-
1103
- publicMethod.settings = defaults;
1104
-
1105
  }(jQuery, document, window));
1
+ /*!
2
+ Colorbox 1.6.3
3
+ license: MIT
4
+ http://www.jacklmoore.com/colorbox
5
+ */
6
+ (function ($, document, window) {
7
+ var
8
+ // Default settings object.
9
+ // See http://jacklmoore.com/colorbox for details.
10
+ defaults = {
11
+ // data sources
12
+ html: false,
13
+ photo: false,
14
+ iframe: false,
15
+ inline: false,
16
+
17
+ // behavior and appearance
18
+ transition: "elastic",
19
+ speed: 300,
20
+ fadeOut: 300,
21
+ width: false,
22
+ initialWidth: "600",
23
+ innerWidth: false,
24
+ maxWidth: false,
25
+ height: false,
26
+ initialHeight: "450",
27
+ innerHeight: false,
28
+ maxHeight: false,
29
+ scalePhotos: true,
30
+ scrolling: true,
31
+ opacity: 0.9,
32
+ preloading: true,
33
+ className: false,
34
+ overlayClose: true,
35
+ escKey: true,
36
+ arrowKey: true,
37
+ top: false,
38
+ bottom: false,
39
+ left: false,
40
+ right: false,
41
+ fixed: false,
42
+ data: undefined,
43
+ closeButton: true,
44
+ fastIframe: true,
45
+ open: false,
46
+ reposition: true,
47
+ loop: true,
48
+ slideshow: false,
49
+ slideshowAuto: true,
50
+ slideshowSpeed: 2500,
51
+ slideshowStart: "start slideshow",
52
+ slideshowStop: "stop slideshow",
53
+ photoRegex: /\.(gif|png|jp(e|g|eg)|bmp|ico|webp|jxr|svg)((#|\?).*)?$/i,
54
+
55
+ // alternate image paths for high-res displays
56
+ retinaImage: false,
57
+ retinaUrl: false,
58
+ retinaSuffix: '@2x.$1',
59
+
60
+ // internationalization
61
+ current: "image {current} of {total}",
62
+ previous: "previous",
63
+ next: "next",
64
+ close: "close",
65
+ xhrError: "This content failed to load.",
66
+ imgError: "This image failed to load.",
67
+
68
+ // accessbility
69
+ returnFocus: true,
70
+ trapFocus: true,
71
+
72
+ // callbacks
73
+ onOpen: false,
74
+ onLoad: false,
75
+ onComplete: false,
76
+ onCleanup: false,
77
+ onClosed: false,
78
+
79
+ rel: function() {
80
+ return this.rel;
81
+ },
82
+ href: function() {
83
+ // using this.href would give the absolute url, when the href may have been inteded as a selector (e.g. '#container')
84
+ return $(this).attr('href');
85
+ },
86
+ title: function() {
87
+ return this.title;
88
+ },
89
+ createImg: function() {
90
+ var img = new Image();
91
+ var attrs = $(this).data('cbox-img-attrs');
92
+
93
+ if (typeof attrs === 'object') {
94
+ $.each(attrs, function(key, val){
95
+ img[key] = val;
96
+ });
97
+ }
98
+
99
+ return img;
100
+ },
101
+ createIframe: function() {
102
+ var iframe = document.createElement('iframe');
103
+ var attrs = $(this).data('cbox-iframe-attrs');
104
+
105
+ if (typeof attrs === 'object') {
106
+ $.each(attrs, function(key, val){
107
+ iframe[key] = val;
108
+ });
109
+ }
110
+
111
+ if ('frameBorder' in iframe) {
112
+ iframe.frameBorder = 0;
113
+ }
114
+ if ('allowTransparency' in iframe) {
115
+ iframe.allowTransparency = "true";
116
+ }
117
+ iframe.name = (new Date()).getTime(); // give the iframe a unique name to prevent caching
118
+ iframe.allowFullscreen = true;
119
+
120
+ return iframe;
121
+ }
122
+ },
123
+
124
+ // Abstracting the HTML and event identifiers for easy rebranding
125
+ colorbox = 'colorbox',
126
+ prefix = 'cbox',
127
+ boxElement = prefix + 'Element',
128
+
129
+ // Events
130
+ event_open = prefix + '_open',
131
+ event_load = prefix + '_load',
132
+ event_complete = prefix + '_complete',
133
+ event_cleanup = prefix + '_cleanup',
134
+ event_closed = prefix + '_closed',
135
+ event_purge = prefix + '_purge',
136
+
137
+ // Cached jQuery Object Variables
138
+ $overlay,
139
+ $box,
140
+ $wrap,
141
+ $content,
142
+ $topBorder,
143
+ $leftBorder,
144
+ $rightBorder,
145
+ $bottomBorder,
146
+ $related,
147
+ $window,
148
+ $loaded,
149
+ $loadingBay,
150
+ $loadingOverlay,
151
+ $title,
152
+ $current,
153
+ $slideshow,
154
+ $next,
155
+ $prev,
156
+ $close,
157
+ $groupControls,
158
+ $events = $('<a/>'), // $({}) would be prefered, but there is an issue with jQuery 1.4.2
159
+
160
+ // Variables for cached values or use across multiple functions
161
+ settings,
162
+ interfaceHeight,
163
+ interfaceWidth,
164
+ loadedHeight,
165
+ loadedWidth,
166
+ index,
167
+ photo,
168
+ open,
169
+ active,
170
+ closing,
171
+ loadingTimer,
172
+ publicMethod,
173
+ div = "div",
174
+ requests = 0,
175
+ previousCSS = {},
176
+ init;
177
+
178
+ // ****************
179
+ // HELPER FUNCTIONS
180
+ // ****************
181
+
182
+ // Convenience function for creating new jQuery objects
183
+ function $tag(tag, id, css) {
184
+ var element = document.createElement(tag);
185
+
186
+ if (id) {
187
+ element.id = prefix + id;
188
+ }
189
+
190
+ if (css) {
191
+ element.style.cssText = css;
192
+ }
193
+
194
+ return $(element);
195
+ }
196
+
197
+ // Get the window height using innerHeight when available to avoid an issue with iOS
198
+ // http://bugs.jquery.com/ticket/6724
199
+ function winheight() {
200
+ return window.innerHeight ? window.innerHeight : $(window).height();
201
+ }
202
+
203
+ function Settings(element, options) {
204
+ if (options !== Object(options)) {
205
+ options = {};
206
+ }
207
+
208
+ this.cache = {};
209
+ this.el = element;
210
+
211
+ this.value = function(key) {
212
+ var dataAttr;
213
+
214
+ if (this.cache[key] === undefined) {
215
+ dataAttr = $(this.el).attr('data-cbox-'+key);
216
+
217
+ if (dataAttr !== undefined) {
218
+ this.cache[key] = dataAttr;
219
+ } else if (options[key] !== undefined) {
220
+ this.cache[key] = options[key];
221
+ } else if (defaults[key] !== undefined) {
222
+ this.cache[key] = defaults[key];
223
+ }
224
+ }
225
+
226
+ return this.cache[key];
227
+ };
228
+
229
+ this.get = function(key) {
230
+ var value = this.value(key);
231
+ return $.isFunction(value) ? value.call(this.el, this) : value;
232
+ };
233
+ }
234
+
235
+ // Determine the next and previous members in a group.
236
+ function getIndex(increment) {
237
+ var
238
+ max = $related.length,
239
+ newIndex = (index + increment) % max;
240
+
241
+ return (newIndex < 0) ? max + newIndex : newIndex;
242
+ }
243
+
244
+ // Convert '%' and 'px' values to integers
245
+ function setSize(size, dimension) {
246
+ return Math.round((/%/.test(size) ? ((dimension === 'x' ? $window.width() : winheight()) / 100) : 1) * parseInt(size, 10));
247
+ }
248
+
249
+ // Checks an href to see if it is a photo.
250
+ // There is a force photo option (photo: true) for hrefs that cannot be matched by the regex.
251
+ function isImage(settings, url) {
252
+ return settings.get('photo') || settings.get('photoRegex').test(url);
253
+ }
254
+
255
+ function retinaUrl(settings, url) {
256
+ return settings.get('retinaUrl') && window.devicePixelRatio > 1 ? url.replace(settings.get('photoRegex'), settings.get('retinaSuffix')) : url;
257
+ }
258
+
259
+ function trapFocus(e) {
260
+ if ('contains' in $box[0] && !$box[0].contains(e.target) && e.target !== $overlay[0]) {
261
+ e.stopPropagation();
262
+ $box.focus();
263
+ }
264
+ }
265
+
266
+ function setClass(str) {
267
+ if (setClass.str !== str) {
268
+ $box.add($overlay).removeClass(setClass.str).addClass(str);
269
+ setClass.str = str;
270
+ }
271
+ }
272
+
273
+ function getRelated(rel) {
274
+ index = 0;
275
+
276
+ if (rel && rel !== false && rel !== 'nofollow') {
277
+ $related = $('.' + boxElement).filter(function () {
278
+ var options = $.data(this, colorbox);
279
+ var settings = new Settings(this, options);
280
+ return (settings.get('rel') === rel);
281
+ });
282
+ index = $related.index(settings.el);
283
+
284
+ // Check direct calls to Colorbox.
285
+ if (index === -1) {
286
+ $related = $related.add(settings.el);
287
+ index = $related.length - 1;
288
+ }
289
+ } else {
290
+ $related = $(settings.el);
291
+ }
292
+ }
293
+
294
+ function trigger(event) {
295
+ // for external use
296
+ $(document).trigger(event);
297
+ // for internal use
298
+ $events.triggerHandler(event);
299
+ }
300
+
301
+ var slideshow = (function(){
302
+ var active,
303
+ className = prefix + "Slideshow_",
304
+ click = "click." + prefix,
305
+ timeOut;
306
+
307
+ function clear () {
308
+ clearTimeout(timeOut);
309
+ }
310
+
311
+ function set() {
312
+ if (settings.get('loop') || $related[index + 1]) {
313
+ clear();
314
+ timeOut = setTimeout(publicMethod.next, settings.get('slideshowSpeed'));
315
+ }
316
+ }
317
+
318
+ function start() {
319
+ $slideshow
320
+ .html(settings.get('slideshowStop'))
321
+ .unbind(click)
322
+ .one(click, stop);
323
+
324
+ $events
325
+ .bind(event_complete, set)
326
+ .bind(event_load, clear);
327
+
328
+ $box.removeClass(className + "off").addClass(className + "on");
329
+ }
330
+
331
+ function stop() {
332
+ clear();
333
+
334
+ $events
335
+ .unbind(event_complete, set)
336
+ .unbind(event_load, clear);
337
+
338
+ $slideshow
339
+ .html(settings.get('slideshowStart'))
340
+ .unbind(click)
341
+ .one(click, function () {
342
+ publicMethod.next();
343
+ start();
344
+ });
345
+
346
+ $box.removeClass(className + "on").addClass(className + "off");
347
+ }
348
+
349
+ function reset() {
350
+ active = false;
351
+ $slideshow.hide();
352
+ clear();
353
+ $events
354
+ .unbind(event_complete, set)
355
+ .unbind(event_load, clear);
356
+ $box.removeClass(className + "off " + className + "on");
357
+ }
358
+
359
+ return function(){
360
+ if (active) {
361
+ if (!settings.get('slideshow')) {
362
+ $events.unbind(event_cleanup, reset);
363
+ reset();
364
+ }
365
+ } else {
366
+ if (settings.get('slideshow') && $related[1]) {
367
+ active = true;
368
+ $events.one(event_cleanup, reset);
369
+ if (settings.get('slideshowAuto')) {
370
+ start();
371
+ } else {
372
+ stop();
373
+ }
374
+ $slideshow.show();
375
+ }
376
+ }
377
+ };
378
+
379
+ }());
380
+
381
+
382
+ function launch(element) {
383
+ var options;
384
+
385
+ if (!closing) {
386
+
387
+ options = $(element).data(colorbox);
388
+
389
+ settings = new Settings(element, options);
390
+
391
+ getRelated(settings.get('rel'));
392
+
393
+ if (!open) {
394
+ open = active = true; // Prevents the page-change action from queuing up if the visitor holds down the left or right keys.
395
+
396
+ setClass(settings.get('className'));
397
+
398
+ // Show colorbox so the sizes can be calculated in older versions of jQuery
399
+ $box.css({visibility:'hidden', display:'block', opacity:''});
400
+
401
+ $loaded = $tag(div, 'LoadedContent', 'width:0; height:0; overflow:hidden; visibility:hidden');
402
+ $content.css({width:'', height:''}).append($loaded);
403
+
404
+ // Cache values needed for size calculations
405
+ interfaceHeight = $topBorder.height() + $bottomBorder.height() + $content.outerHeight(true) - $content.height();
406
+ interfaceWidth = $leftBorder.width() + $rightBorder.width() + $content.outerWidth(true) - $content.width();
407
+ loadedHeight = $loaded.outerHeight(true);
408
+ loadedWidth = $loaded.outerWidth(true);
409
+
410
+ // Opens inital empty Colorbox prior to content being loaded.
411
+ var initialWidth = setSize(settings.get('initialWidth'), 'x');
412
+ var initialHeight = setSize(settings.get('initialHeight'), 'y');
413
+ var maxWidth = settings.get('maxWidth');
414
+ var maxHeight = settings.get('maxHeight');
415
+
416
+ settings.w = Math.max((maxWidth !== false ? Math.min(initialWidth, setSize(maxWidth, 'x')) : initialWidth) - loadedWidth - interfaceWidth, 0);
417
+ settings.h = Math.max((maxHeight !== false ? Math.min(initialHeight, setSize(maxHeight, 'y')) : initialHeight) - loadedHeight - interfaceHeight, 0);
418
+
419
+ $loaded.css({width:'', height:settings.h});
420
+ publicMethod.position();
421
+
422
+ trigger(event_open);
423
+ settings.get('onOpen');
424
+
425
+ $groupControls.add($title).hide();
426
+
427
+ $box.focus();
428
+
429
+ if (settings.get('trapFocus')) {
430
+ // Confine focus to the modal
431
+ // Uses event capturing that is not supported in IE8-
432
+ if (document.addEventListener) {
433
+
434
+ document.addEventListener('focus', trapFocus, true);
435
+
436
+ $events.one(event_closed, function () {
437
+ document.removeEventListener('focus', trapFocus, true);
438
+ });
439
+ }
440
+ }
441
+
442
+ // Return focus on closing
443
+ if (settings.get('returnFocus')) {
444
+ $events.one(event_closed, function () {
445
+ $(settings.el).focus();
446
+ });
447
+ }
448
+ }
449
+
450
+ var opacity = parseFloat(settings.get('opacity'));
451
+ $overlay.css({
452
+ opacity: opacity === opacity ? opacity : '',
453
+ cursor: settings.get('overlayClose') ? 'pointer' : '',
454
+ visibility: 'visible'
455
+ }).show();
456
+
457
+ if (settings.get('closeButton')) {
458
+ $close.html(settings.get('close')).appendTo($content);
459
+ } else {
460
+ $close.appendTo('<div/>'); // replace with .detach() when dropping jQuery < 1.4
461
+ }
462
+
463
+ load();
464
+ }
465
+ }
466
+
467
+ // Colorbox's markup needs to be added to the DOM prior to being called
468
+ // so that the browser will go ahead and load the CSS background images.
469
+ function appendHTML() {
470
+ if (!$box) {
471
+ init = false;
472
+ $window = $(window);
473
+ $box = $tag(div).attr({
474
+ id: colorbox,
475
+ 'class': $.support.opacity === false ? prefix + 'IE' : '', // class for optional IE8 & lower targeted CSS.
476
+ role: 'dialog',
477
+ tabindex: '-1'
478
+ }).hide();
479
+ $overlay = $tag(div, "Overlay").hide();
480
+ $loadingOverlay = $([$tag(div, "LoadingOverlay")[0],$tag(div, "LoadingGraphic")[0]]);
481
+ $wrap = $tag(div, "Wrapper");
482
+ $content = $tag(div, "Content").append(
483
+ $title = $tag(div, "Title"),
484
+ $current = $tag(div, "Current"),
485
+ $prev = $('<button type="button"/>').attr({id:prefix+'Previous'}),
486
+ $next = $('<button type="button"/>').attr({id:prefix+'Next'}),
487
+ $slideshow = $tag('button', "Slideshow"),
488
+ $loadingOverlay
489
+ );
490
+
491
+ $close = $('<button type="button"/>').attr({id:prefix+'Close'});
492
+
493
+ $wrap.append( // The 3x3 Grid that makes up Colorbox
494
+ $tag(div).append(
495
+ $tag(div, "TopLeft"),
496
+ $topBorder = $tag(div, "TopCenter"),
497
+ $tag(div, "TopRight")
498
+ ),
499
+ $tag(div, false, 'clear:left').append(
500
+ $leftBorder = $tag(div, "MiddleLeft"),
501
+ $content,
502
+ $rightBorder = $tag(div, "MiddleRight")
503
+ ),
504
+ $tag(div, false, 'clear:left').append(
505
+ $tag(div, "BottomLeft"),
506
+ $bottomBorder = $tag(div, "BottomCenter"),
507
+ $tag(div, "BottomRight")
508
+ )
509
+ ).find('div div').css({'float': 'left'});
510
+
511
+ $loadingBay = $tag(div, false, 'position:absolute; width:9999px; visibility:hidden; display:none; max-width:none;');
512
+
513
+ $groupControls = $next.add($prev).add($current).add($slideshow);
514
+ }
515
+ if (document.body && !$box.parent().length) {
516
+ $(document.body).append($overlay, $box.append($wrap, $loadingBay));
517
+ }
518
+ }
519
+
520
+ // Add Colorbox's event bindings
521
+ function addBindings() {
522
+ function clickHandler(e) {
523
+ // ignore non-left-mouse-clicks and clicks modified with ctrl / command, shift, or alt.
524
+ // See: http://jacklmoore.com/notes/click-events/
525
+ if (!(e.which > 1 || e.shiftKey || e.altKey || e.metaKey || e.ctrlKey)) {
526
+ e.preventDefault();
527
+ launch(this);
528
+ }
529
+ }
530
+
531
+ if ($box) {
532
+ if (!init) {
533
+ init = true;
534
+
535
+ // Anonymous functions here keep the public method from being cached, thereby allowing them to be redefined on the fly.
536
+ $next.click(function () {
537
+ publicMethod.next();
538
+ });
539
+ $prev.click(function () {
540
+ publicMethod.prev();
541
+ });
542
+ $close.click(function () {
543
+ publicMethod.close();
544
+ });
545
+ $overlay.click(function () {
546
+ if (settings.get('overlayClose')) {
547
+ publicMethod.close();
548
+ }
549
+ });
550
+
551
+ // Key Bindings
552
+ $(document).bind('keydown.' + prefix, function (e) {
553
+ var key = e.keyCode;
554
+ if (open && settings.get('escKey') && key === 27) {
555
+ e.preventDefault();
556
+ publicMethod.close();
557
+ }
558
+ if (open && settings.get('arrowKey') && $related[1] && !e.altKey) {
559
+ if (key === 37) {
560
+ e.preventDefault();
561
+ $prev.click();
562
+ } else if (key === 39) {
563
+ e.preventDefault();
564
+ $next.click();
565
+ }
566
+ }
567
+ });
568
+
569
+ if ($.isFunction($.fn.on)) {
570
+ // For jQuery 1.7+
571
+ $(document).on('click.'+prefix, '.'+boxElement, clickHandler);
572
+ } else {
573
+ // For jQuery 1.3.x -> 1.6.x
574
+ // This code is never reached in jQuery 1.9, so do not contact me about 'live' being removed.
575
+ // This is not here for jQuery 1.9, it's here for legacy users.
576
+ $('.'+boxElement).live('click.'+prefix, clickHandler);
577
+ }
578
+ }
579
+ return true;
580
+ }
581
+ return false;
582
+ }
583
+
584
+ // Don't do anything if Colorbox already exists.
585
+ if ($[colorbox]) {
586
+ return;
587
+ }
588
+
589
+ // Append the HTML when the DOM loads
590
+ $(appendHTML);
591
+
592
+
593
+ // ****************
594
+ // PUBLIC FUNCTIONS
595
+ // Usage format: $.colorbox.close();
596
+ // Usage from within an iframe: parent.jQuery.colorbox.close();
597
+ // ****************
598
+
599
+ publicMethod = $.fn[colorbox] = $[colorbox] = function (options, callback) {
600
+ var settings;
601
+ var $obj = this;
602
+
603
+ options = options || {};
604
+
605
+ if ($.isFunction($obj)) { // assume a call to $.colorbox
606
+ $obj = $('<a/>');
607
+ options.open = true;
608
+ }
609
+
610
+ if (!$obj[0]) { // colorbox being applied to empty collection
611
+ return $obj;
612
+ }
613
+
614
+ appendHTML();
615
+
616
+ if (addBindings()) {
617
+
618
+ if (callback) {
619
+ options.onComplete = callback;
620
+ }
621
+
622
+ $obj.each(function () {
623
+ var old = $.data(this, colorbox) || {};
624
+ $.data(this, colorbox, $.extend(old, options));
625
+ }).addClass(boxElement);
626
+
627
+ settings = new Settings($obj[0], options);
628
+
629
+ if (settings.get('open')) {
630
+ launch($obj[0]);
631
+ }
632
+ }
633
+
634
+ return $obj;
635
+ };
636
+
637
+ publicMethod.position = function (speed, loadedCallback) {
638
+ var
639
+ css,
640
+ top = 0,
641
+ left = 0,
642
+ offset = $box.offset(),
643
+ scrollTop,
644
+ scrollLeft;
645
+
646
+ $window.unbind('resize.' + prefix);
647
+
648
+ // remove the modal so that it doesn't influence the document width/height
649
+ $box.css({top: -9e4, left: -9e4});
650
+
651
+ scrollTop = $window.scrollTop();
652
+ scrollLeft = $window.scrollLeft();
653
+
654
+ if (settings.get('fixed')) {
655
+ offset.top -= scrollTop;
656
+ offset.left -= scrollLeft;
657
+ $box.css({position: 'fixed'});
658
+ } else {
659
+ top = scrollTop;
660
+ left = scrollLeft;
661
+ $box.css({position: 'absolute'});
662
+ }
663
+
664
+ // keeps the top and left positions within the browser's viewport.
665
+ if (settings.get('right') !== false) {
666
+ left += Math.max($window.width() - settings.w - loadedWidth - interfaceWidth - setSize(settings.get('right'), 'x'), 0);
667
+ } else if (settings.get('left') !== false) {
668
+ left += setSize(settings.get('left'), 'x');
669
+ } else {
670
+ left += Math.round(Math.max($window.width() - settings.w - loadedWidth - interfaceWidth, 0) / 2);
671
+ }
672
+
673
+ if (settings.get('bottom') !== false) {
674
+ top += Math.max(winheight() - settings.h - loadedHeight - interfaceHeight - setSize(settings.get('bottom'), 'y'), 0);
675
+ } else if (settings.get('top') !== false) {
676
+ top += setSize(settings.get('top'), 'y');
677
+ } else {
678
+ top += Math.round(Math.max(winheight() - settings.h - loadedHeight - interfaceHeight, 0) / 2);
679
+ }
680
+
681
+ $box.css({top: offset.top, left: offset.left, visibility:'visible'});
682
+
683
+ // this gives the wrapper plenty of breathing room so it's floated contents can move around smoothly,
684
+ // but it has to be shrank down around the size of div#colorbox when it's done. If not,
685
+ // it can invoke an obscure IE bug when using iframes.
686
+ $wrap[0].style.width = $wrap[0].style.height = "9999px";
687
+
688
+ function modalDimensions() {
689
+ $topBorder[0].style.width = $bottomBorder[0].style.width = $content[0].style.width = (parseInt($box[0].style.width,10) - interfaceWidth)+'px';
690
+ $content[0].style.height = $leftBorder[0].style.height = $rightBorder[0].style.height = (parseInt($box[0].style.height,10) - interfaceHeight)+'px';
691
+ }
692
+
693
+ css = {width: settings.w + loadedWidth + interfaceWidth, height: settings.h + loadedHeight + interfaceHeight, top: top, left: left};
694
+
695
+ // setting the speed to 0 if the content hasn't changed size or position
696
+ if (speed) {
697
+ var tempSpeed = 0;
698
+ $.each(css, function(i){
699
+ if (css[i] !== previousCSS[i]) {
700
+ tempSpeed = speed;
701
+ return;
702
+ }
703
+ });
704
+ speed = tempSpeed;
705
+ }
706
+
707
+ previousCSS = css;
708
+
709
+ if (!speed) {
710
+ $box.css(css);
711
+ }
712
+
713
+ $box.dequeue().animate(css, {
714
+ duration: speed || 0,
715
+ complete: function () {
716
+ modalDimensions();
717
+
718
+ active = false;
719
+
720
+ // shrink the wrapper down to exactly the size of colorbox to avoid a bug in IE's iframe implementation.
721
+ $wrap[0].style.width = (settings.w + loadedWidth + interfaceWidth) + "px";
722
+ $wrap[0].style.height = (settings.h + loadedHeight + interfaceHeight) + "px";
723
+
724
+ if (settings.get('reposition')) {
725
+ setTimeout(function () { // small delay before binding onresize due to an IE8 bug.
726
+ $window.bind('resize.' + prefix, publicMethod.position);
727
+ }, 1);
728
+ }
729
+
730
+ if ($.isFunction(loadedCallback)) {
731
+ loadedCallback();
732
+ }
733
+ },
734
+ step: modalDimensions
735
+ });
736
+ };
737
+
738
+ publicMethod.resize = function (options) {
739
+ var scrolltop;
740
+
741
+ if (open) {
742
+ options = options || {};
743
+
744
+ if (options.width) {
745
+ settings.w = setSize(options.width, 'x') - loadedWidth - interfaceWidth;
746
+ }
747
+
748
+ if (options.innerWidth) {
749
+ settings.w = setSize(options.innerWidth, 'x');
750
+ }
751
+
752
+ $loaded.css({width: settings.w});
753
+
754
+ if (options.height) {
755
+ settings.h = setSize(options.height, 'y') - loadedHeight - interfaceHeight;
756
+ }
757
+
758
+ if (options.innerHeight) {
759
+ settings.h = setSize(options.innerHeight, 'y');
760
+ }
761
+
762
+ if (!options.innerHeight && !options.height) {
763
+ scrolltop = $loaded.scrollTop();
764
+ $loaded.css({height: "auto"});
765
+ settings.h = $loaded.height();
766
+ }
767
+
768
+ $loaded.css({height: settings.h});
769
+
770
+ if(scrolltop) {
771
+ $loaded.scrollTop(scrolltop);
772
+ }
773
+
774
+ publicMethod.position(settings.get('transition') === "none" ? 0 : settings.get('speed'));
775
+ }
776
+ };
777
+
778
+ publicMethod.prep = function (object) {
779
+ if (!open) {
780
+ return;
781
+ }
782
+
783
+ var callback, speed = settings.get('transition') === "none" ? 0 : settings.get('speed');
784
+
785
+ $loaded.remove();
786
+
787
+ $loaded = $tag(div, 'LoadedContent').append(object);
788
+
789
+ function getWidth() {
790
+ settings.w = settings.w || $loaded.width();
791
+ settings.w = settings.mw && settings.mw < settings.w ? settings.mw : settings.w;
792
+ return settings.w;
793
+ }
794
+ function getHeight() {
795
+ settings.h = settings.h || $loaded.height();
796
+ settings.h = settings.mh && settings.mh < settings.h ? settings.mh : settings.h;
797
+ return settings.h;
798
+ }
799
+
800
+ $loaded.hide()
801
+ .appendTo($loadingBay.show())// content has to be appended to the DOM for accurate size calculations.
802
+ .css({width: getWidth(), overflow: settings.get('scrolling') ? 'auto' : 'hidden'})
803
+ .css({height: getHeight()})// sets the height independently from the width in case the new width influences the value of height.
804
+ .prependTo($content);
805
+
806
+ $loadingBay.hide();
807
+
808
+ // floating the IMG removes the bottom line-height and fixed a problem where IE miscalculates the width of the parent element as 100% of the document width.
809
+
810
+ $(photo).css({'float': 'none'});
811
+
812
+ setClass(settings.get('className'));
813
+
814
+ callback = function () {
815
+ var total = $related.length,
816
+ iframe,
817
+ complete;
818
+
819
+ if (!open) {
820
+ return;
821
+ }
822
+
823
+ function removeFilter() { // Needed for IE8 in versions of jQuery prior to 1.7.2
824
+ if ($.support.opacity === false) {
825
+ $box[0].style.removeAttribute('filter');
826
+ }
827
+ }
828
+
829
+ complete = function () {
830
+ clearTimeout(loadingTimer);
831
+ $loadingOverlay.hide();
832
+ trigger(event_complete);
833
+ settings.get('onComplete');
834
+ };
835
+
836
+
837
+ $title.html(settings.get('title')).show();
838
+ $loaded.show();
839
+
840
+ if (total > 1) { // handle grouping
841
+ if (typeof settings.get('current') === "string") {
842
+ $current.html(settings.get('current').replace('{current}', index + 1).replace('{total}', total)).show();
843
+ }
844
+
845
+ $next[(settings.get('loop') || index < total - 1) ? "show" : "hide"]().html(settings.get('next'));
846
+ $prev[(settings.get('loop') || index) ? "show" : "hide"]().html(settings.get('previous'));
847
+
848
+ slideshow();
849
+
850
+ // Preloads images within a rel group
851
+ if (settings.get('preloading')) {
852
+ $.each([getIndex(-1), getIndex(1)], function(){
853
+ var img,
854
+ i = $related[this],
855
+ settings = new Settings(i, $.data(i, colorbox)),
856
+ src = settings.get('href');
857
+
858
+ if (src && isImage(settings, src)) {
859
+ src = retinaUrl(settings, src);
860
+ img = document.createElement('img');
861
+ img.src = src;
862
+ }
863
+ });
864
+ }
865
+ } else {
866
+ $groupControls.hide();
867
+ }
868
+
869
+ if (settings.get('iframe')) {
870
+
871
+ iframe = settings.get('createIframe');
872
+
873
+ if (!settings.get('scrolling')) {
874
+ iframe.scrolling = "no";
875
+ }
876
+
877
+ $(iframe)
878
+ .attr({
879
+ src: settings.get('href'),
880
+ 'class': prefix + 'Iframe'
881
+ })
882
+ .one('load', complete)
883
+ .appendTo($loaded);
884
+
885
+ $events.one(event_purge, function () {
886
+ iframe.src = "//about:blank";
887
+ });
888
+
889
+ if (settings.get('fastIframe')) {
890
+ $(iframe).trigger('load');
891
+ }
892
+ } else {
893
+ complete();
894
+ }
895
+
896
+ if (settings.get('transition') === 'fade') {
897
+ $box.fadeTo(speed, 1, removeFilter);
898
+ } else {
899
+ removeFilter();
900
+ }
901
+ };
902
+
903
+ if (settings.get('transition') === 'fade') {
904
+ $box.fadeTo(speed, 0, function () {
905
+ publicMethod.position(0, callback);
906
+ });
907
+ } else {
908
+ publicMethod.position(speed, callback);
909
+ }
910
+ };
911
+
912
+ function load () {
913
+ var href, setResize, prep = publicMethod.prep, $inline, request = ++requests;
914
+
915
+ active = true;
916
+
917
+ photo = false;
918
+
919
+ trigger(event_purge);
920
+ trigger(event_load);
921
+ settings.get('onLoad');
922
+
923
+ settings.h = settings.get('height') ?
924
+ setSize(settings.get('height'), 'y') - loadedHeight - interfaceHeight :
925
+ settings.get('innerHeight') && setSize(settings.get('innerHeight'), 'y');
926
+
927
+ settings.w = settings.get('width') ?
928
+ setSize(settings.get('width'), 'x') - loadedWidth - interfaceWidth :
929
+ settings.get('innerWidth') && setSize(settings.get('innerWidth'), 'x');
930
+
931
+ // Sets the minimum dimensions for use in image scaling
932
+ settings.mw = settings.w;
933
+ settings.mh = settings.h;
934
+
935
+ // Re-evaluate the minimum width and height based on maxWidth and maxHeight values.
936
+ // If the width or height exceed the maxWidth or maxHeight, use the maximum values instead.
937
+ if (settings.get('maxWidth')) {
938
+ settings.mw = setSize(settings.get('maxWidth'), 'x') - loadedWidth - interfaceWidth;
939
+ settings.mw = settings.w && settings.w < settings.mw ? settings.w : settings.mw;
940
+ }
941
+ if (settings.get('maxHeight')) {
942
+ settings.mh = setSize(settings.get('maxHeight'), 'y') - loadedHeight - interfaceHeight;
943
+ settings.mh = settings.h && settings.h < settings.mh ? settings.h : settings.mh;
944
+ }
945
+
946
+ href = settings.get('href');
947
+
948
+ loadingTimer = setTimeout(function () {
949
+ $loadingOverlay.show();
950
+ }, 100);
951
+
952
+ if (settings.get('inline')) {
953
+ var $target = $(href);
954
+ // Inserts an empty placeholder where inline content is being pulled from.
955
+ // An event is bound to put inline content back when Colorbox closes or loads new content.
956
+ $inline = $('<div>').hide().insertBefore($target);
957
+
958
+ $events.one(event_purge, function () {
959
+ $inline.replaceWith($target);
960
+ });
961
+
962
+ prep($target);
963
+ } else if (settings.get('iframe')) {
964
+ // IFrame element won't be added to the DOM until it is ready to be displayed,
965
+ // to avoid problems with DOM-ready JS that might be trying to run in that iframe.
966
+ prep(" ");
967
+ } else if (settings.get('html')) {
968
+ prep(settings.get('html'));
969
+ } else if (isImage(settings, href)) {
970
+
971
+ href = retinaUrl(settings, href);
972
+
973
+ photo = settings.get('createImg');
974
+
975
+ $(photo)
976
+ .addClass(prefix + 'Photo')
977
+ .bind('error.'+prefix,function () {
978
+ prep($tag(div, 'Error').html(settings.get('imgError')));
979
+ })
980
+ .one('load', function () {
981
+ if (request !== requests) {
982
+ return;
983
+ }
984
+
985
+ // A small pause because some browsers will occassionaly report a
986
+ // img.width and img.height of zero immediately after the img.onload fires
987
+ setTimeout(function(){
988
+ var percent;
989
+
990
+ if (settings.get('retinaImage') && window.devicePixelRatio > 1) {
991
+ photo.height = photo.height / window.devicePixelRatio;
992
+ photo.width = photo.width / window.devicePixelRatio;
993
+ }
994
+
995
+ if (settings.get('scalePhotos')) {
996
+ setResize = function () {
997
+ photo.height -= photo.height * percent;
998
+ photo.width -= photo.width * percent;
999
+ };
1000
+ if (settings.mw && photo.width > settings.mw) {
1001
+ percent = (photo.width - settings.mw) / photo.width;
1002
+ setResize();
1003
+ }
1004
+ if (settings.mh && photo.height > settings.mh) {
1005
+ percent = (photo.height - settings.mh) / photo.height;
1006
+ setResize();
1007
+ }
1008
+ }
1009
+
1010
+ if (settings.h) {
1011
+ photo.style.marginTop = Math.max(settings.mh - photo.height, 0) / 2 + 'px';
1012
+ }
1013
+
1014
+ if ($related[1] && (settings.get('loop') || $related[index + 1])) {
1015
+ photo.style.cursor = 'pointer';
1016
+
1017
+ $(photo).bind('click.'+prefix, function () {
1018
+ publicMethod.next();
1019
+ });
1020
+ }
1021
+
1022
+ photo.style.width = photo.width + 'px';
1023
+ photo.style.height = photo.height + 'px';
1024
+ prep(photo);
1025
+ }, 1);
1026
+ });
1027
+
1028
+ photo.src = href;
1029
+
1030
+ } else if (href) {
1031
+ $loadingBay.load(href, settings.get('data'), function (data, status) {
1032
+ if (request === requests) {
1033
+ prep(status === 'error' ? $tag(div, 'Error').html(settings.get('xhrError')) : $(this).contents());
1034
+ }
1035
+ });
1036
+ }
1037
+ }
1038
+
1039
+ // Navigates to the next page/image in a set.
1040
+ publicMethod.next = function () {
1041
+ if (!active && $related[1] && (settings.get('loop') || $related[index + 1])) {
1042
+ index = getIndex(1);
1043
+ launch($related[index]);
1044
+ }
1045
+ };
1046
+
1047
+ publicMethod.prev = function () {
1048
+ if (!active && $related[1] && (settings.get('loop') || index)) {
1049
+ index = getIndex(-1);
1050
+ launch($related[index]);
1051
+ }
1052
+ };
1053
+
1054
+ // Note: to use this within an iframe use the following format: parent.jQuery.colorbox.close();
1055
+ publicMethod.close = function () {
1056
+ if (open && !closing) {
1057
+
1058
+ closing = true;
1059
+ open = false;
1060
+ trigger(event_cleanup);
1061
+ settings.get('onCleanup');
1062
+ $window.unbind('.' + prefix);
1063
+ $overlay.fadeTo(settings.get('fadeOut') || 0, 0);
1064
+
1065
+ $box.stop().fadeTo(settings.get('fadeOut') || 0, 0, function () {
1066
+ $box.hide();
1067
+ $overlay.hide();
1068
+ trigger(event_purge);
1069
+ $loaded.remove();
1070
+
1071
+ setTimeout(function () {
1072
+ closing = false;
1073
+ trigger(event_closed);
1074
+ settings.get('onClosed');
1075
+ }, 1);
1076
+ });
1077
+ }
1078
+ };
1079
+
1080
+ // Removes changes Colorbox made to the document, but does not remove the plugin.
1081
+ publicMethod.remove = function () {
1082
+ if (!$box) { return; }
1083
+
1084
+ $box.stop();
1085
+ $[colorbox].close();
1086
+ $box.stop(false, true).remove();
1087
+ $overlay.remove();
1088
+ closing = false;
1089
+ $box = null;
1090
+ $('.' + boxElement)
1091
+ .removeData(colorbox)
1092
+ .removeClass(boxElement);
1093
+
1094
+ $(document).unbind('click.'+prefix).unbind('keydown.'+prefix);
1095
+ };
1096
+
1097
+ // A method for fetching the current element Colorbox is referencing.
1098
+ // returns a jQuery object.
1099
+ publicMethod.element = function () {
1100
+ return $(settings.el);
1101
+ };
1102
+
1103
+ publicMethod.settings = defaults;
1104
+
1105
  }(jQuery, document, window));
plugin-fw/assets/js/jquery.colorbox.min.js CHANGED
@@ -1,33 +1,33 @@
1
- /*
2
- Colorbox 1.6.3
3
- license: MIT
4
- http://www.jacklmoore.com/colorbox
5
- */
6
- var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(b,h,g){b instanceof String&&(b=String(b));for(var d=b.length,r=0;r<d;r++){var C=b[r];if(h.call(g,C,r,b))return{i:r,v:C}}return{i:-1,v:void 0}};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(b,h,g){b!=Array.prototype&&b!=Object.prototype&&(b[h]=g.value)};
7
- $jscomp.getGlobal=function(b){return"undefined"!=typeof window&&window===b?b:"undefined"!=typeof global&&null!=global?global:b};$jscomp.global=$jscomp.getGlobal(this);$jscomp.polyfill=function(b,h,g,d){if(h){g=$jscomp.global;b=b.split(".");for(d=0;d<b.length-1;d++){var r=b[d];r in g||(g[r]={});g=g[r]}b=b[b.length-1];d=g[b];h=h(d);h!=d&&null!=h&&$jscomp.defineProperty(g,b,{configurable:!0,writable:!0,value:h})}};
8
- $jscomp.polyfill("Array.prototype.find",function(b){return b?b:function(b,g){return $jscomp.findInternal(this,b,g).v}},"es6","es3");
9
- (function(b,h,g){function d(a,f,H){a=h.createElement(a);f&&(a.id="cbox"+f);H&&(a.style.cssText=H);return b(a)}function r(){return g.innerHeight?g.innerHeight:b(g).height()}function C(a,f){f!==Object(f)&&(f={});this.cache={};this.el=a;this.value=function(a){if(void 0===this.cache[a]){var c=b(this.el).attr("data-cbox-"+a);void 0!==c?this.cache[a]=c:void 0!==f[a]?this.cache[a]=f[a]:void 0!==S[a]&&(this.cache[a]=S[a])}return this.cache[a]};this.get=function(a){a=this.value(a);return b.isFunction(a)?a.call(this.el,
10
- this):a}}function O(a){var c=n.length;a=(p+a)%c;return 0>a?c+a:a}function q(a,b){return Math.round((/%/.test(a)?("x"===b?x.width():r())/100:1)*parseInt(a,10))}function ca(a,b){return a.get("photo")||a.get("photoRegex").test(b)}function da(a,b){return a.get("retinaUrl")&&1<g.devicePixelRatio?b.replace(a.get("photoRegex"),a.get("retinaSuffix")):b}function ea(a){"contains"in k[0]&&!k[0].contains(a.target)&&a.target!==y[0]&&(a.stopPropagation(),k.focus())}function I(a){I.str!==a&&(k.add(y).removeClass(I.str).addClass(a),
11
- I.str=a)}function ja(c){p=0;c&&!1!==c&&"nofollow"!==c?(n=b(".cboxElement").filter(function(){var a=b.data(this,"colorbox");return(new C(this,a)).get("rel")===c}),p=n.index(a.el),-1===p&&(n=n.add(a.el),p=n.length-1)):n=b(a.el)}function E(a){b(h).trigger(a);t.triggerHandler(a)}function P(c){if(!J){var f=b(c).data("colorbox");a=new C(c,f);ja(a.get("rel"));if(!z){z=K=!0;I(a.get("className"));k.css({visibility:"hidden",display:"block",opacity:""});l=d("div","LoadedContent","width:0; height:0; overflow:hidden; visibility:hidden");
12
- u.css({width:"",height:""}).append(l);v=T.height()+U.height()+u.outerHeight(!0)-u.height();w=V.width()+W.width()+u.outerWidth(!0)-u.width();A=l.outerHeight(!0);B=l.outerWidth(!0);c=q(a.get("initialWidth"),"x");f=q(a.get("initialHeight"),"y");var H=a.get("maxWidth"),e=a.get("maxHeight");a.w=Math.max((!1!==H?Math.min(c,q(H,"x")):c)-B-w,0);a.h=Math.max((!1!==e?Math.min(f,q(e,"y")):f)-A-v,0);l.css({width:"",height:a.h});m.position();E("cbox_open");a.get("onOpen");X.add(Y).hide();k.focus();a.get("trapFocus")&&
13
- h.addEventListener&&(h.addEventListener("focus",ea,!0),t.one("cbox_closed",function(){h.removeEventListener("focus",ea,!0)}));if(a.get("returnFocus"))t.one("cbox_closed",function(){b(a.el).focus()})}c=parseFloat(a.get("opacity"));y.css({opacity:c===c?c:"",cursor:a.get("overlayClose")?"pointer":"",visibility:"visible"}).show();a.get("closeButton")?Q.html(a.get("close")).appendTo(u):Q.appendTo("<div/>");ka()}}function fa(){k||(Z=!1,x=b(g),k=d("div").attr({id:"colorbox","class":!1===b.support.opacity?
14
- "cboxIE":"",role:"dialog",tabindex:"-1"}).hide(),y=d("div","Overlay").hide(),R=b([d("div","LoadingOverlay")[0],d("div","LoadingGraphic")[0]]),F=d("div","Wrapper"),u=d("div","Content").append(Y=d("div","Title"),aa=d("div","Current"),L=b('<button type="button"/>').attr({id:"cboxPrevious"}),M=b('<button type="button"/>').attr({id:"cboxNext"}),G=d("button","Slideshow"),R),Q=b('<button type="button"/>').attr({id:"cboxClose"}),F.append(d("div").append(d("div","TopLeft"),T=d("div","TopCenter"),d("div","TopRight")),
15
- d("div",!1,"clear:left").append(V=d("div","MiddleLeft"),u,W=d("div","MiddleRight")),d("div",!1,"clear:left").append(d("div","BottomLeft"),U=d("div","BottomCenter"),d("div","BottomRight"))).find("div div").css({"float":"left"}),N=d("div",!1,"position:absolute; width:9999px; visibility:hidden; display:none; max-width:none;"),X=M.add(L).add(aa).add(G));h.body&&!k.parent().length&&b(h.body).append(y,k.append(F,N))}function la(){function c(a){1<a.which||a.shiftKey||a.altKey||a.metaKey||a.ctrlKey||(a.preventDefault(),
16
- P(this))}if(k){if(!Z)if(Z=!0,M.click(function(){m.next()}),L.click(function(){m.prev()}),Q.click(function(){m.close()}),y.click(function(){a.get("overlayClose")&&m.close()}),b(h).bind("keydown.cbox",function(b){var c=b.keyCode;z&&a.get("escKey")&&27===c&&(b.preventDefault(),m.close());z&&a.get("arrowKey")&&n[1]&&!b.altKey&&(37===c?(b.preventDefault(),L.click()):39===c&&(b.preventDefault(),M.click()))}),b.isFunction(b.fn.on))b(h).on("click.cbox",".cboxElement",c);else b(".cboxElement").live("click.cbox",
17
- c);return!0}return!1}function ka(){var c,f=m.prep,k=++ba;K=!0;e=!1;E("cbox_purge");E("cbox_load");a.get("onLoad");a.h=a.get("height")?q(a.get("height"),"y")-A-v:a.get("innerHeight")&&q(a.get("innerHeight"),"y");a.w=a.get("width")?q(a.get("width"),"x")-B-w:a.get("innerWidth")&&q(a.get("innerWidth"),"x");a.mw=a.w;a.mh=a.h;a.get("maxWidth")&&(a.mw=q(a.get("maxWidth"),"x")-B-w,a.mw=a.w&&a.w<a.mw?a.w:a.mw);a.get("maxHeight")&&(a.mh=q(a.get("maxHeight"),"y")-A-v,a.mh=a.h&&a.h<a.mh?a.h:a.mh);var D=a.get("href");
18
- ha=setTimeout(function(){R.show()},100);if(a.get("inline")){var h=b(D);var l=b("<div>").hide().insertBefore(h);t.one("cbox_purge",function(){l.replaceWith(h)});f(h)}else a.get("iframe")?f(" "):a.get("html")?f(a.get("html")):ca(a,D)?(D=da(a,D),e=a.get("createImg"),b(e).addClass("cboxPhoto").bind("error.cbox",function(){f(d("div","Error").html(a.get("imgError")))}).one("load",function(){k===ba&&setTimeout(function(){a.get("retinaImage")&&1<g.devicePixelRatio&&(e.height/=g.devicePixelRatio,e.width/=
19
- g.devicePixelRatio);if(a.get("scalePhotos")){c=function(){e.height-=e.height*d;e.width-=e.width*d};if(a.mw&&e.width>a.mw){var d=(e.width-a.mw)/e.width;c()}a.mh&&e.height>a.mh&&(d=(e.height-a.mh)/e.height,c())}a.h&&(e.style.marginTop=Math.max(a.mh-e.height,0)/2+"px");n[1]&&(a.get("loop")||n[p+1])&&(e.style.cursor="pointer",b(e).bind("click.cbox",function(){m.next()}));e.style.width=e.width+"px";e.style.height=e.height+"px";f(e)},1)}),e.src=D):D&&N.load(D,a.get("data"),function(c,e){k===ba&&f("error"===
20
- e?d("div","Error").html(a.get("xhrError")):b(this).contents())})}var S={html:!1,photo:!1,iframe:!1,inline:!1,transition:"elastic",speed:300,fadeOut:300,width:!1,initialWidth:"600",innerWidth:!1,maxWidth:!1,height:!1,initialHeight:"450",innerHeight:!1,maxHeight:!1,scalePhotos:!0,scrolling:!0,opacity:.9,preloading:!0,className:!1,overlayClose:!0,escKey:!0,arrowKey:!0,top:!1,bottom:!1,left:!1,right:!1,fixed:!1,data:void 0,closeButton:!0,fastIframe:!0,open:!1,reposition:!0,loop:!0,slideshow:!1,slideshowAuto:!0,
21
- slideshowSpeed:2500,slideshowStart:"start slideshow",slideshowStop:"stop slideshow",photoRegex:/\.(gif|png|jp(e|g|eg)|bmp|ico|webp|jxr|svg)((#|\?).*)?$/i,retinaImage:!1,retinaUrl:!1,retinaSuffix:"@2x.$1",current:"image {current} of {total}",previous:"previous",next:"next",close:"close",xhrError:"This content failed to load.",imgError:"This image failed to load.",returnFocus:!0,trapFocus:!0,onOpen:!1,onLoad:!1,onComplete:!1,onCleanup:!1,onClosed:!1,rel:function(){return this.rel},href:function(){return b(this).attr("href")},
22
- title:function(){return this.title},createImg:function(){var a=new Image,f=b(this).data("cbox-img-attrs");"object"===typeof f&&b.each(f,function(b,c){a[b]=c});return a},createIframe:function(){var a=h.createElement("iframe"),f=b(this).data("cbox-iframe-attrs");"object"===typeof f&&b.each(f,function(b,c){a[b]=c});"frameBorder"in a&&(a.frameBorder=0);"allowTransparency"in a&&(a.allowTransparency="true");a.name=(new Date).getTime();a.allowFullscreen=!0;return a}},y,k,F,u,T,V,W,U,n,x,l,N,R,Y,aa,G,M,L,
23
- Q,X,t=b("<a/>"),a,v,w,A,B,p,e,z,K,J,ha,ba=0,ia={},Z,ma=function(){function b(){clearTimeout(l)}function f(){if(a.get("loop")||n[p+1])b(),l=setTimeout(m.next,a.get("slideshowSpeed"))}function d(){G.html(a.get("slideshowStop")).unbind("click.cbox").one("click.cbox",e);t.bind("cbox_complete",f).bind("cbox_load",b);k.removeClass("cboxSlideshow_off").addClass("cboxSlideshow_on")}function e(){b();t.unbind("cbox_complete",f).unbind("cbox_load",b);G.html(a.get("slideshowStart")).unbind("click.cbox").one("click.cbox",
24
- function(){m.next();d()});k.removeClass("cboxSlideshow_on").addClass("cboxSlideshow_off")}function h(){g=!1;G.hide();b();t.unbind("cbox_complete",f).unbind("cbox_load",b);k.removeClass("cboxSlideshow_off cboxSlideshow_on")}var g,l;return function(){g?a.get("slideshow")||(t.unbind("cbox_cleanup",h),h()):a.get("slideshow")&&n[1]&&(g=!0,t.one("cbox_cleanup",h),a.get("slideshowAuto")?d():e(),G.show())}}();if(!b.colorbox){b(fa);var m=b.fn.colorbox=b.colorbox=function(a,f){var c=this;a=a||{};b.isFunction(c)&&
25
- (c=b("<a/>"),a.open=!0);if(!c[0])return c;fa();la()&&(f&&(a.onComplete=f),c.each(function(){var c=b.data(this,"colorbox")||{};b.data(this,"colorbox",b.extend(c,a))}).addClass("cboxElement"),f=new C(c[0],a),f.get("open")&&P(c[0]));return c};m.position=function(c,f){function d(){T[0].style.width=U[0].style.width=u[0].style.width=parseInt(k[0].style.width,10)-w+"px";u[0].style.height=V[0].style.height=W[0].style.height=parseInt(k[0].style.height,10)-v+"px"}var e=0,h=0,g=k.offset();x.unbind("resize.cbox");
26
- k.css({top:-9E4,left:-9E4});var l=x.scrollTop();var n=x.scrollLeft();a.get("fixed")?(g.top-=l,g.left-=n,k.css({position:"fixed"})):(e=l,h=n,k.css({position:"absolute"}));h=!1!==a.get("right")?h+Math.max(x.width()-a.w-B-w-q(a.get("right"),"x"),0):!1!==a.get("left")?h+q(a.get("left"),"x"):h+Math.round(Math.max(x.width()-a.w-B-w,0)/2);e=!1!==a.get("bottom")?e+Math.max(r()-a.h-A-v-q(a.get("bottom"),"y"),0):!1!==a.get("top")?e+q(a.get("top"),"y"):e+Math.round(Math.max(r()-a.h-A-v,0)/2);k.css({top:g.top,
27
- left:g.left,visibility:"visible"});F[0].style.width=F[0].style.height="9999px";var p={width:a.w+B+w,height:a.h+A+v,top:e,left:h};if(c){var t=0;b.each(p,function(a){p[a]!==ia[a]&&(t=c)});c=t}ia=p;c||k.css(p);k.dequeue().animate(p,{duration:c||0,complete:function(){d();K=!1;F[0].style.width=a.w+B+w+"px";F[0].style.height=a.h+A+v+"px";a.get("reposition")&&setTimeout(function(){x.bind("resize.cbox",m.position)},1);b.isFunction(f)&&f()},step:d})};m.resize=function(b){if(z){b=b||{};b.width&&(a.w=q(b.width,
28
- "x")-B-w);b.innerWidth&&(a.w=q(b.innerWidth,"x"));l.css({width:a.w});b.height&&(a.h=q(b.height,"y")-A-v);b.innerHeight&&(a.h=q(b.innerHeight,"y"));if(!b.innerHeight&&!b.height){var c=l.scrollTop();l.css({height:"auto"});a.h=l.height()}l.css({height:a.h});c&&l.scrollTop(c);m.position("none"===a.get("transition")?0:a.get("speed"))}};m.prep=function(c){if(z){var f="none"===a.get("transition")?0:a.get("speed");l.remove();l=d("div","LoadedContent").append(c);l.hide().appendTo(N.show()).css({width:function(){a.w=
29
- a.w||l.width();a.w=a.mw&&a.mw<a.w?a.mw:a.w;return a.w}(),overflow:a.get("scrolling")?"auto":"hidden"}).css({height:function(){a.h=a.h||l.height();a.h=a.mh&&a.mh<a.h?a.mh:a.h;return a.h}()}).prependTo(u);N.hide();b(e).css({"float":"none"});I(a.get("className"));var g=function(){function c(){!1===b.support.opacity&&k[0].style.removeAttribute("filter")}var d=n.length;if(z){var e=function(){clearTimeout(ha);R.hide();E("cbox_complete");a.get("onComplete")};Y.html(a.get("title")).show();l.show();1<d?("string"===
30
- typeof a.get("current")&&aa.html(a.get("current").replace("{current}",p+1).replace("{total}",d)).show(),M[a.get("loop")||p<d-1?"show":"hide"]().html(a.get("next")),L[a.get("loop")||p?"show":"hide"]().html(a.get("previous")),ma(),a.get("preloading")&&b.each([O(-1),O(1)],function(){var a=n[this];var c=new C(a,b.data(a,"colorbox"));(a=c.get("href"))&&ca(c,a)&&(a=da(c,a),c=h.createElement("img"),c.src=a)})):X.hide();if(a.get("iframe")){var g=a.get("createIframe");a.get("scrolling")||(g.scrolling="no");
31
- b(g).attr({src:a.get("href"),"class":"cboxIframe"}).one("load",e).appendTo(l);t.one("cbox_purge",function(){g.src="//about:blank"});a.get("fastIframe")&&b(g).trigger("load")}else e();"fade"===a.get("transition")?k.fadeTo(f,1,c):c()}};"fade"===a.get("transition")?k.fadeTo(f,0,function(){m.position(0,g)}):m.position(f,g)}};m.next=function(){!K&&n[1]&&(a.get("loop")||n[p+1])&&(p=O(1),P(n[p]))};m.prev=function(){!K&&n[1]&&(a.get("loop")||p)&&(p=O(-1),P(n[p]))};m.close=function(){z&&!J&&(J=!0,z=!1,E("cbox_cleanup"),
32
- a.get("onCleanup"),x.unbind(".cbox"),y.fadeTo(a.get("fadeOut")||0,0),k.stop().fadeTo(a.get("fadeOut")||0,0,function(){k.hide();y.hide();E("cbox_purge");l.remove();setTimeout(function(){J=!1;E("cbox_closed");a.get("onClosed")},1)}))};m.remove=function(){k&&(k.stop(),b.colorbox.close(),k.stop(!1,!0).remove(),y.remove(),J=!1,k=null,b(".cboxElement").removeData("colorbox").removeClass("cboxElement"),b(h).unbind("click.cbox").unbind("keydown.cbox"))};m.element=function(){return b(a.el)};m.settings=S}})(jQuery,
33
- document,window);
1
+ /*
2
+ Colorbox 1.6.3
3
+ license: MIT
4
+ http://www.jacklmoore.com/colorbox
5
+ */
6
+ var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(b,h,g){b instanceof String&&(b=String(b));for(var d=b.length,r=0;r<d;r++){var C=b[r];if(h.call(g,C,r,b))return{i:r,v:C}}return{i:-1,v:void 0}};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(b,h,g){b!=Array.prototype&&b!=Object.prototype&&(b[h]=g.value)};
7
+ $jscomp.getGlobal=function(b){return"undefined"!=typeof window&&window===b?b:"undefined"!=typeof global&&null!=global?global:b};$jscomp.global=$jscomp.getGlobal(this);$jscomp.polyfill=function(b,h,g,d){if(h){g=$jscomp.global;b=b.split(".");for(d=0;d<b.length-1;d++){var r=b[d];r in g||(g[r]={});g=g[r]}b=b[b.length-1];d=g[b];h=h(d);h!=d&&null!=h&&$jscomp.defineProperty(g,b,{configurable:!0,writable:!0,value:h})}};
8
+ $jscomp.polyfill("Array.prototype.find",function(b){return b?b:function(b,g){return $jscomp.findInternal(this,b,g).v}},"es6","es3");
9
+ (function(b,h,g){function d(a,f,H){a=h.createElement(a);f&&(a.id="cbox"+f);H&&(a.style.cssText=H);return b(a)}function r(){return g.innerHeight?g.innerHeight:b(g).height()}function C(a,f){f!==Object(f)&&(f={});this.cache={};this.el=a;this.value=function(a){if(void 0===this.cache[a]){var c=b(this.el).attr("data-cbox-"+a);void 0!==c?this.cache[a]=c:void 0!==f[a]?this.cache[a]=f[a]:void 0!==S[a]&&(this.cache[a]=S[a])}return this.cache[a]};this.get=function(a){a=this.value(a);return b.isFunction(a)?a.call(this.el,
10
+ this):a}}function O(a){var c=n.length;a=(p+a)%c;return 0>a?c+a:a}function q(a,b){return Math.round((/%/.test(a)?("x"===b?x.width():r())/100:1)*parseInt(a,10))}function ca(a,b){return a.get("photo")||a.get("photoRegex").test(b)}function da(a,b){return a.get("retinaUrl")&&1<g.devicePixelRatio?b.replace(a.get("photoRegex"),a.get("retinaSuffix")):b}function ea(a){"contains"in k[0]&&!k[0].contains(a.target)&&a.target!==y[0]&&(a.stopPropagation(),k.focus())}function I(a){I.str!==a&&(k.add(y).removeClass(I.str).addClass(a),
11
+ I.str=a)}function ja(c){p=0;c&&!1!==c&&"nofollow"!==c?(n=b(".cboxElement").filter(function(){var a=b.data(this,"colorbox");return(new C(this,a)).get("rel")===c}),p=n.index(a.el),-1===p&&(n=n.add(a.el),p=n.length-1)):n=b(a.el)}function E(a){b(h).trigger(a);t.triggerHandler(a)}function P(c){if(!J){var f=b(c).data("colorbox");a=new C(c,f);ja(a.get("rel"));if(!z){z=K=!0;I(a.get("className"));k.css({visibility:"hidden",display:"block",opacity:""});l=d("div","LoadedContent","width:0; height:0; overflow:hidden; visibility:hidden");
12
+ u.css({width:"",height:""}).append(l);v=T.height()+U.height()+u.outerHeight(!0)-u.height();w=V.width()+W.width()+u.outerWidth(!0)-u.width();A=l.outerHeight(!0);B=l.outerWidth(!0);c=q(a.get("initialWidth"),"x");f=q(a.get("initialHeight"),"y");var H=a.get("maxWidth"),e=a.get("maxHeight");a.w=Math.max((!1!==H?Math.min(c,q(H,"x")):c)-B-w,0);a.h=Math.max((!1!==e?Math.min(f,q(e,"y")):f)-A-v,0);l.css({width:"",height:a.h});m.position();E("cbox_open");a.get("onOpen");X.add(Y).hide();k.focus();a.get("trapFocus")&&
13
+ h.addEventListener&&(h.addEventListener("focus",ea,!0),t.one("cbox_closed",function(){h.removeEventListener("focus",ea,!0)}));if(a.get("returnFocus"))t.one("cbox_closed",function(){b(a.el).focus()})}c=parseFloat(a.get("opacity"));y.css({opacity:c===c?c:"",cursor:a.get("overlayClose")?"pointer":"",visibility:"visible"}).show();a.get("closeButton")?Q.html(a.get("close")).appendTo(u):Q.appendTo("<div/>");ka()}}function fa(){k||(Z=!1,x=b(g),k=d("div").attr({id:"colorbox","class":!1===b.support.opacity?
14
+ "cboxIE":"",role:"dialog",tabindex:"-1"}).hide(),y=d("div","Overlay").hide(),R=b([d("div","LoadingOverlay")[0],d("div","LoadingGraphic")[0]]),F=d("div","Wrapper"),u=d("div","Content").append(Y=d("div","Title"),aa=d("div","Current"),L=b('<button type="button"/>').attr({id:"cboxPrevious"}),M=b('<button type="button"/>').attr({id:"cboxNext"}),G=d("button","Slideshow"),R),Q=b('<button type="button"/>').attr({id:"cboxClose"}),F.append(d("div").append(d("div","TopLeft"),T=d("div","TopCenter"),d("div","TopRight")),
15
+ d("div",!1,"clear:left").append(V=d("div","MiddleLeft"),u,W=d("div","MiddleRight")),d("div",!1,"clear:left").append(d("div","BottomLeft"),U=d("div","BottomCenter"),d("div","BottomRight"))).find("div div").css({"float":"left"}),N=d("div",!1,"position:absolute; width:9999px; visibility:hidden; display:none; max-width:none;"),X=M.add(L).add(aa).add(G));h.body&&!k.parent().length&&b(h.body).append(y,k.append(F,N))}function la(){function c(a){1<a.which||a.shiftKey||a.altKey||a.metaKey||a.ctrlKey||(a.preventDefault(),
16
+ P(this))}if(k){if(!Z)if(Z=!0,M.click(function(){m.next()}),L.click(function(){m.prev()}),Q.click(function(){m.close()}),y.click(function(){a.get("overlayClose")&&m.close()}),b(h).bind("keydown.cbox",function(b){var c=b.keyCode;z&&a.get("escKey")&&27===c&&(b.preventDefault(),m.close());z&&a.get("arrowKey")&&n[1]&&!b.altKey&&(37===c?(b.preventDefault(),L.click()):39===c&&(b.preventDefault(),M.click()))}),b.isFunction(b.fn.on))b(h).on("click.cbox",".cboxElement",c);else b(".cboxElement").live("click.cbox",
17
+ c);return!0}return!1}function ka(){var c,f=m.prep,k=++ba;K=!0;e=!1;E("cbox_purge");E("cbox_load");a.get("onLoad");a.h=a.get("height")?q(a.get("height"),"y")-A-v:a.get("innerHeight")&&q(a.get("innerHeight"),"y");a.w=a.get("width")?q(a.get("width"),"x")-B-w:a.get("innerWidth")&&q(a.get("innerWidth"),"x");a.mw=a.w;a.mh=a.h;a.get("maxWidth")&&(a.mw=q(a.get("maxWidth"),"x")-B-w,a.mw=a.w&&a.w<a.mw?a.w:a.mw);a.get("maxHeight")&&(a.mh=q(a.get("maxHeight"),"y")-A-v,a.mh=a.h&&a.h<a.mh?a.h:a.mh);var D=a.get("href");
18
+ ha=setTimeout(function(){R.show()},100);if(a.get("inline")){var h=b(D);var l=b("<div>").hide().insertBefore(h);t.one("cbox_purge",function(){l.replaceWith(h)});f(h)}else a.get("iframe")?f(" "):a.get("html")?f(a.get("html")):ca(a,D)?(D=da(a,D),e=a.get("createImg"),b(e).addClass("cboxPhoto").bind("error.cbox",function(){f(d("div","Error").html(a.get("imgError")))}).one("load",function(){k===ba&&setTimeout(function(){a.get("retinaImage")&&1<g.devicePixelRatio&&(e.height/=g.devicePixelRatio,e.width/=
19
+ g.devicePixelRatio);if(a.get("scalePhotos")){c=function(){e.height-=e.height*d;e.width-=e.width*d};if(a.mw&&e.width>a.mw){var d=(e.width-a.mw)/e.width;c()}a.mh&&e.height>a.mh&&(d=(e.height-a.mh)/e.height,c())}a.h&&(e.style.marginTop=Math.max(a.mh-e.height,0)/2+"px");n[1]&&(a.get("loop")||n[p+1])&&(e.style.cursor="pointer",b(e).bind("click.cbox",function(){m.next()}));e.style.width=e.width+"px";e.style.height=e.height+"px";f(e)},1)}),e.src=D):D&&N.load(D,a.get("data"),function(c,e){k===ba&&f("error"===
20
+ e?d("div","Error").html(a.get("xhrError")):b(this).contents())})}var S={html:!1,photo:!1,iframe:!1,inline:!1,transition:"elastic",speed:300,fadeOut:300,width:!1,initialWidth:"600",innerWidth:!1,maxWidth:!1,height:!1,initialHeight:"450",innerHeight:!1,maxHeight:!1,scalePhotos:!0,scrolling:!0,opacity:.9,preloading:!0,className:!1,overlayClose:!0,escKey:!0,arrowKey:!0,top:!1,bottom:!1,left:!1,right:!1,fixed:!1,data:void 0,closeButton:!0,fastIframe:!0,open:!1,reposition:!0,loop:!0,slideshow:!1,slideshowAuto:!0,
21
+ slideshowSpeed:2500,slideshowStart:"start slideshow",slideshowStop:"stop slideshow",photoRegex:/\.(gif|png|jp(e|g|eg)|bmp|ico|webp|jxr|svg)((#|\?).*)?$/i,retinaImage:!1,retinaUrl:!1,retinaSuffix:"@2x.$1",current:"image {current} of {total}",previous:"previous",next:"next",close:"close",xhrError:"This content failed to load.",imgError:"This image failed to load.",returnFocus:!0,trapFocus:!0,onOpen:!1,onLoad:!1,onComplete:!1,onCleanup:!1,onClosed:!1,rel:function(){return this.rel},href:function(){return b(this).attr("href")},
22
+ title:function(){return this.title},createImg:function(){var a=new Image,f=b(this).data("cbox-img-attrs");"object"===typeof f&&b.each(f,function(b,c){a[b]=c});return a},createIframe:function(){var a=h.createElement("iframe"),f=b(this).data("cbox-iframe-attrs");"object"===typeof f&&b.each(f,function(b,c){a[b]=c});"frameBorder"in a&&(a.frameBorder=0);"allowTransparency"in a&&(a.allowTransparency="true");a.name=(new Date).getTime();a.allowFullscreen=!0;return a}},y,k,F,u,T,V,W,U,n,x,l,N,R,Y,aa,G,M,L,
23
+ Q,X,t=b("<a/>"),a,v,w,A,B,p,e,z,K,J,ha,ba=0,ia={},Z,ma=function(){function b(){clearTimeout(l)}function f(){if(a.get("loop")||n[p+1])b(),l=setTimeout(m.next,a.get("slideshowSpeed"))}function d(){G.html(a.get("slideshowStop")).unbind("click.cbox").one("click.cbox",e);t.bind("cbox_complete",f).bind("cbox_load",b);k.removeClass("cboxSlideshow_off").addClass("cboxSlideshow_on")}function e(){b();t.unbind("cbox_complete",f).unbind("cbox_load",b);G.html(a.get("slideshowStart")).unbind("click.cbox").one("click.cbox",
24
+ function(){m.next();d()});k.removeClass("cboxSlideshow_on").addClass("cboxSlideshow_off")}function h(){g=!1;G.hide();b();t.unbind("cbox_complete",f).unbind("cbox_load",b);k.removeClass("cboxSlideshow_off cboxSlideshow_on")}var g,l;return function(){g?a.get("slideshow")||(t.unbind("cbox_cleanup",h),h()):a.get("slideshow")&&n[1]&&(g=!0,t.one("cbox_cleanup",h),a.get("slideshowAuto")?d():e(),G.show())}}();if(!b.colorbox){b(fa);var m=b.fn.colorbox=b.colorbox=function(a,f){var c=this;a=a||{};b.isFunction(c)&&
25
+ (c=b("<a/>"),a.open=!0);if(!c[0])return c;fa();la()&&(f&&(a.onComplete=f),c.each(function(){var c=b.data(this,"colorbox")||{};b.data(this,"colorbox",b.extend(c,a))}).addClass("cboxElement"),f=new C(c[0],a),f.get("open")&&P(c[0]));return c};m.position=function(c,f){function d(){T[0].style.width=U[0].style.width=u[0].style.width=parseInt(k[0].style.width,10)-w+"px";u[0].style.height=V[0].style.height=W[0].style.height=parseInt(k[0].style.height,10)-v+"px"}var e=0,h=0,g=k.offset();x.unbind("resize.cbox");
26
+ k.css({top:-9E4,left:-9E4});var l=x.scrollTop();var n=x.scrollLeft();a.get("fixed")?(g.top-=l,g.left-=n,k.css({position:"fixed"})):(e=l,h=n,k.css({position:"absolute"}));h=!1!==a.get("right")?h+Math.max(x.width()-a.w-B-w-q(a.get("right"),"x"),0):!1!==a.get("left")?h+q(a.get("left"),"x"):h+Math.round(Math.max(x.width()-a.w-B-w,0)/2);e=!1!==a.get("bottom")?e+Math.max(r()-a.h-A-v-q(a.get("bottom"),"y"),0):!1!==a.get("top")?e+q(a.get("top"),"y"):e+Math.round(Math.max(r()-a.h-A-v,0)/2);k.css({top:g.top,
27
+ left:g.left,visibility:"visible"});F[0].style.width=F[0].style.height="9999px";var p={width:a.w+B+w,height:a.h+A+v,top:e,left:h};if(c){var t=0;b.each(p,function(a){p[a]!==ia[a]&&(t=c)});c=t}ia=p;c||k.css(p);k.dequeue().animate(p,{duration:c||0,complete:function(){d();K=!1;F[0].style.width=a.w+B+w+"px";F[0].style.height=a.h+A+v+"px";a.get("reposition")&&setTimeout(function(){x.bind("resize.cbox",m.position)},1);b.isFunction(f)&&f()},step:d})};m.resize=function(b){if(z){b=b||{};b.width&&(a.w=q(b.width,
28
+ "x")-B-w);b.innerWidth&&(a.w=q(b.innerWidth,"x"));l.css({width:a.w});b.height&&(a.h=q(b.height,"y")-A-v);b.innerHeight&&(a.h=q(b.innerHeight,"y"));if(!b.innerHeight&&!b.height){var c=l.scrollTop();l.css({height:"auto"});a.h=l.height()}l.css({height:a.h});c&&l.scrollTop(c);m.position("none"===a.get("transition")?0:a.get("speed"))}};m.prep=function(c){if(z){var f="none"===a.get("transition")?0:a.get("speed");l.remove();l=d("div","LoadedContent").append(c);l.hide().appendTo(N.show()).css({width:function(){a.w=
29
+ a.w||l.width();a.w=a.mw&&a.mw<a.w?a.mw:a.w;return a.w}(),overflow:a.get("scrolling")?"auto":"hidden"}).css({height:function(){a.h=a.h||l.height();a.h=a.mh&&a.mh<a.h?a.mh:a.h;return a.h}()}).prependTo(u);N.hide();b(e).css({"float":"none"});I(a.get("className"));var g=function(){function c(){!1===b.support.opacity&&k[0].style.removeAttribute("filter")}var d=n.length;if(z){var e=function(){clearTimeout(ha);R.hide();E("cbox_complete");a.get("onComplete")};Y.html(a.get("title")).show();l.show();1<d?("string"===
30
+ typeof a.get("current")&&aa.html(a.get("current").replace("{current}",p+1).replace("{total}",d)).show(),M[a.get("loop")||p<d-1?"show":"hide"]().html(a.get("next")),L[a.get("loop")||p?"show":"hide"]().html(a.get("previous")),ma(),a.get("preloading")&&b.each([O(-1),O(1)],function(){var a=n[this];var c=new C(a,b.data(a,"colorbox"));(a=c.get("href"))&&ca(c,a)&&(a=da(c,a),c=h.createElement("img"),c.src=a)})):X.hide();if(a.get("iframe")){var g=a.get("createIframe");a.get("scrolling")||(g.scrolling="no");
31
+ b(g).attr({src:a.get("href"),"class":"cboxIframe"}).one("load",e).appendTo(l);t.one("cbox_purge",function(){g.src="//about:blank"});a.get("fastIframe")&&b(g).trigger("load")}else e();"fade"===a.get("transition")?k.fadeTo(f,1,c):c()}};"fade"===a.get("transition")?k.fadeTo(f,0,function(){m.position(0,g)}):m.position(f,g)}};m.next=function(){!K&&n[1]&&(a.get("loop")||n[p+1])&&(p=O(1),P(n[p]))};m.prev=function(){!K&&n[1]&&(a.get("loop")||p)&&(p=O(-1),P(n[p]))};m.close=function(){z&&!J&&(J=!0,z=!1,E("cbox_cleanup"),
32
+ a.get("onCleanup"),x.unbind(".cbox"),y.fadeTo(a.get("fadeOut")||0,0),k.stop().fadeTo(a.get("fadeOut")||0,0,function(){k.hide();y.hide();E("cbox_purge");l.remove();setTimeout(function(){J=!1;E("cbox_closed");a.get("onClosed")},1)}))};m.remove=function(){k&&(k.stop(),b.colorbox.close(),k.stop(!1,!0).remove(),y.remove(),J=!1,k=null,b(".cboxElement").removeData("colorbox").removeClass("cboxElement"),b(h).unbind("click.cbox").unbind("keydown.cbox"))};m.element=function(){return b(a.el)};m.settings=S}})(jQuery,
33
+ document,window);
plugin-fw/assets/js/metabox.js CHANGED
@@ -1,138 +1,138 @@
1
- /**
2
- * This file belongs to the YIT 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
- (function ($) {
10
-
11
- $('.metaboxes-tab').each(function () {
12
- $('.tabs-panel', this).hide();
13
-
14
- var active_tab = wpCookies.get('active_metabox_tab');
15
- if (active_tab == null) {
16
- active_tab = $('ul.metaboxes-tabs li:first-child a', this).attr('href');
17
- } else {
18
- active_tab = '#' + active_tab;
19
- }
20
-
21
- $(active_tab).show();
22
-
23
- $('.metaboxes-tabs a', this).click(function (e) {
24
- if ($(this).parent().hasClass('tabs')) {
25
- e.preventDefault();
26
- return;
27
- }
28
-
29
- var t = $(this).attr('href');
30
- $(this).parent().addClass('tabs').siblings('li').removeClass('tabs');
31
- $(this).closest('.metaboxes-tab').find('.tabs-panel').hide();
32
- $(t).show();
33
-
34
- return false;
35
- });
36
- });
37
-
38
- var act_page_option = $('#_active_page_options-container').parent().html();
39
- $('#_active_page_options-container').parent().remove();
40
- $(act_page_option).insertAfter('#yit-post-setting .handlediv');
41
- $(act_page_option).insertAfter('#yit-page-setting .handlediv');
42
-
43
-
44
- $('#_active_page_options-container').on('click', function(){
45
- if( $('#_active_page_options').is(":checked") ){
46
- $('#yit-page-setting .inside .metaboxes-tab, #yit-post-setting .inside .metaboxes-tab').css( { 'opacity' : 1 , 'pointer-events' : 'auto' } );
47
- }else{
48
- $('#yit-page-setting .inside .metaboxes-tab, #yit-post-setting .inside .metaboxes-tab').css( { 'opacity' : 0.5 , 'pointer-events' : 'none' } );
49
- }
50
- }).click();
51
-
52
-
53
- //dependencies handler
54
- $('.metaboxes-tab [data-dep-target]').each(function(){
55
- var t = $(this);
56
-
57
- var field = '#' + t.data('dep-target'),
58
- dep = '#' + t.data('dep-id'),
59
- value = t.data('dep-value'),
60
- type = t.data('dep-type');
61
-
62
-
63
- dependencies_handler( field, dep, value.toString(), type );
64
-
65
- $(dep).on('change', function(){
66
- dependencies_handler( field, dep, value.toString(), type );
67
- }).change();
68
- });
69
-
70
- //Handle dependencies.
71
- function dependencies_handler ( id, deps, values, type ) {
72
- var result = true;
73
-
74
-
75
- //Single dependency
76
- if( typeof( deps ) == 'string' ) {
77
- if( deps.substr( 0, 6 ) == ':radio' )
78
- {deps = deps + ':checked'; }
79
-
80
- var val = $( deps ).val();
81
-
82
- if( $(deps).attr('type') == 'checkbox'){
83
- var thisCheck = $(deps);
84
- if ( thisCheck.is ( ':checked' ) ) {
85
- val = 'yes';
86
- }
87
- else {
88
- val = 'no';
89
- }
90
- }
91
-
92
- values = values.split( ',' );
93
-
94
- for( var i = 0; i < values.length; i++ ) {
95
- if( val != values[i] )
96
- { result = false; }
97
- else
98
- { result = true; break; }
99
- }
100
- }
101
-
102
- var $current_field = $( id ),
103
- $current_container = $( id + '-container' ).parent();
104
-
105
- var types = type.split( '-' ), j;
106
- for ( j in types ) {
107
- var current_type = types[ j ];
108
-
109
- if ( !result ) {
110
- switch ( current_type ) {
111
- case 'disable':
112
- $current_container.addClass( 'yith-disabled' );
113
- $current_field.attr( 'disabled', true );
114
- break;
115
- case 'hideme':
116
- $current_field.hide();
117
- break;
118
- default:
119
- $current_container.hide();
120
- }
121
-
122
- } else {
123
- switch ( current_type ) {
124
- case 'disable':
125
- $current_container.removeClass( 'yith-disabled' );
126
- $current_field.attr( 'disabled', false );
127
- break;
128
- case 'hideme':
129
- $current_field.show();
130
- break;
131
- default:
132
- $current_container.show();
133
- }
134
- }
135
- }
136
- }
137
-
138
  })(jQuery);
1
+ /**
2
+ * This file belongs to the YIT 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
+ (function ($) {
10
+
11
+ $('.metaboxes-tab').each(function () {
12
+ $('.tabs-panel', this).hide();
13
+
14
+ var active_tab = wpCookies.get('active_metabox_tab');
15
+ if (active_tab == null) {
16
+ active_tab = $('ul.metaboxes-tabs li:first-child a', this).attr('href');
17
+ } else {
18
+ active_tab = '#' + active_tab;
19
+ }
20
+
21
+ $(active_tab).show();
22
+
23
+ $('.metaboxes-tabs a', this).click(function (e) {
24
+ if ($(this).parent().hasClass('tabs')) {
25
+ e.preventDefault();
26
+ return;
27
+ }
28
+
29
+ var t = $(this).attr('href');
30
+ $(this).parent().addClass('tabs').siblings('li').removeClass('tabs');
31
+ $(this).closest('.metaboxes-tab').find('.tabs-panel').hide();
32
+ $(t).show();
33
+
34
+ return false;
35
+ });
36
+ });
37
+
38
+ var act_page_option = $('#_active_page_options-container').parent().html();
39
+ $('#_active_page_options-container').parent().remove();
40
+ $(act_page_option).insertAfter('#yit-post-setting .handlediv');
41
+ $(act_page_option).insertAfter('#yit-page-setting .handlediv');
42
+
43
+
44
+ $('#_active_page_options-container').on('click', function(){
45
+ if( $('#_active_page_options').is(":checked") ){
46
+ $('#yit-page-setting .inside .metaboxes-tab, #yit-post-setting .inside .metaboxes-tab').css( { 'opacity' : 1 , 'pointer-events' : 'auto' } );
47
+ }else{
48
+ $('#yit-page-setting .inside .metaboxes-tab, #yit-post-setting .inside .metaboxes-tab').css( { 'opacity' : 0.5 , 'pointer-events' : 'none' } );
49
+ }
50
+ }).click();
51
+
52
+
53
+ //dependencies handler
54
+ $('.metaboxes-tab [data-dep-target]').each(function(){
55
+ var t = $(this);
56
+
57
+ var field = '#' + t.data('dep-target'),
58
+ dep = '#' + t.data('dep-id'),
59
+ value = t.data('dep-value'),
60
+ type = t.data('dep-type');
61
+
62
+
63
+ dependencies_handler( field, dep, value.toString(), type );
64
+
65
+ $(dep).on('change', function(){
66
+ dependencies_handler( field, dep, value.toString(), type );
67
+ }).change();
68
+ });
69
+
70
+ //Handle dependencies.
71
+ function dependencies_handler ( id, deps, values, type ) {
72
+ var result = true;
73
+
74
+
75
+ //Single dependency
76
+ if( typeof( deps ) == 'string' ) {
77
+ if( deps.substr( 0, 6 ) == ':radio' )
78
+ {deps = deps + ':checked'; }
79
+
80
+ var val = $( deps ).val();
81
+
82
+ if( $(deps).attr('type') == 'checkbox'){
83
+ var thisCheck = $(deps);
84
+ if ( thisCheck.is ( ':checked' ) ) {
85
+ val = 'yes';
86
+ }
87
+ else {
88
+ val = 'no';
89
+ }
90
+ }
91
+
92
+ values = values.split( ',' );
93
+
94
+ for( var i = 0; i < values.length; i++ ) {
95
+ if( val != values[i] )
96
+ { result = false; }
97
+ else
98
+ { result = true; break; }
99
+ }
100
+ }
101
+
102
+ var $current_field = $( id ),
103
+ $current_container = $( id + '-container' ).parent();
104
+
105
+ var types = type.split( '-' ), j;
106
+ for ( j in types ) {
107
+ var current_type = types[ j ];
108
+
109
+ if ( !result ) {
110
+ switch ( current_type ) {
111
+ case 'disable':
112
+ $current_container.addClass( 'yith-disabled' );
113
+ $current_field.attr( 'disabled', true );
114
+ break;
115
+ case 'hideme':
116
+ $current_field.hide();
117
+ break;
118
+ default:
119
+ $current_container.hide();
120
+ }
121
+
122
+ } else {
123
+ switch ( current_type ) {
124
+ case 'disable':
125
+ $current_container.removeClass( 'yith-disabled' );
126
+ $current_field.attr( 'disabled', false );
127
+ break;
128
+ case 'hideme':
129
+ $current_field.show();
130
+ break;
131
+ default:
132
+ $current_container.show();
133
+ }
134
+ }
135
+ }
136
+ }
137
+
138
  })(jQuery);
plugin-fw/assets/js/metabox.min.js CHANGED
@@ -1,7 +1,7 @@
1
- var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(a,e,c){a instanceof String&&(a=String(a));for(var b=a.length,d=0;d<b;d++){var f=a[d];if(e.call(c,f,d,a))return{i:d,v:f}}return{i:-1,v:void 0}};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(a,e,c){a!=Array.prototype&&a!=Object.prototype&&(a[e]=c.value)};
2
- $jscomp.getGlobal=function(a){return"undefined"!=typeof window&&window===a?a:"undefined"!=typeof global&&null!=global?global:a};$jscomp.global=$jscomp.getGlobal(this);$jscomp.polyfill=function(a,e,c,b){if(e){c=$jscomp.global;a=a.split(".");for(b=0;b<a.length-1;b++){var d=a[b];d in c||(c[d]={});c=c[d]}a=a[a.length-1];b=c[a];e=e(b);e!=b&&null!=e&&$jscomp.defineProperty(c,a,{configurable:!0,writable:!0,value:e})}};
3
- $jscomp.polyfill("Array.prototype.find",function(a){return a?a:function(a,c){return $jscomp.findInternal(this,a,c).v}},"es6","es3");
4
- (function(a){function e(b,d,c,e){var f=!0;if("string"==typeof d){":radio"==d.substr(0,6)&&(d+=":checked");var g=a(d).val();"checkbox"==a(d).attr("type")&&(g=a(d).is(":checked")?"yes":"no");c=c.split(",");for(d=0;d<c.length;d++)if(g!=c[d])f=!1;else{f=!0;break}}c=a(b);b=a(b+"-container").parent();e=e.split("-");for(var h in e)if(g=e[h],f)switch(g){case "disable":b.removeClass("yith-disabled");c.attr("disabled",!1);break;case "hideme":c.show();break;default:b.show()}else switch(g){case "disable":b.addClass("yith-disabled");
5
- c.attr("disabled",!0);break;case "hideme":c.hide();break;default:b.hide()}}a(".metaboxes-tab").each(function(){a(".tabs-panel",this).hide();var b=wpCookies.get("active_metabox_tab");b=null==b?a("ul.metaboxes-tabs li:first-child a",this).attr("href"):"#"+b;a(b).show();a(".metaboxes-tabs a",this).click(function(b){if(a(this).parent().hasClass("tabs"))b.preventDefault();else return b=a(this).attr("href"),a(this).parent().addClass("tabs").siblings("li").removeClass("tabs"),a(this).closest(".metaboxes-tab").find(".tabs-panel").hide(),
6
- a(b).show(),!1})});var c=a("#_active_page_options-container").parent().html();a("#_active_page_options-container").parent().remove();a(c).insertAfter("#yit-post-setting .handlediv");a(c).insertAfter("#yit-page-setting .handlediv");a("#_active_page_options-container").on("click",function(){a("#_active_page_options").is(":checked")?a("#yit-page-setting .inside .metaboxes-tab, #yit-post-setting .inside .metaboxes-tab").css({opacity:1,"pointer-events":"auto"}):a("#yit-page-setting .inside .metaboxes-tab, #yit-post-setting .inside .metaboxes-tab").css({opacity:.5,
7
- "pointer-events":"none"})}).click();a(".metaboxes-tab [data-dep-target]").each(function(){var b=a(this),c="#"+b.data("dep-target"),f="#"+b.data("dep-id"),h=b.data("dep-value"),k=b.data("dep-type");e(c,f,h.toString(),k);a(f).on("change",function(){e(c,f,h.toString(),k)}).change()})})(jQuery);
1
+ var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(a,e,c){a instanceof String&&(a=String(a));for(var b=a.length,d=0;d<b;d++){var f=a[d];if(e.call(c,f,d,a))return{i:d,v:f}}return{i:-1,v:void 0}};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(a,e,c){a!=Array.prototype&&a!=Object.prototype&&(a[e]=c.value)};
2
+ $jscomp.getGlobal=function(a){return"undefined"!=typeof window&&window===a?a:"undefined"!=typeof global&&null!=global?global:a};$jscomp.global=$jscomp.getGlobal(this);$jscomp.polyfill=function(a,e,c,b){if(e){c=$jscomp.global;a=a.split(".");for(b=0;b<a.length-1;b++){var d=a[b];d in c||(c[d]={});c=c[d]}a=a[a.length-1];b=c[a];e=e(b);e!=b&&null!=e&&$jscomp.defineProperty(c,a,{configurable:!0,writable:!0,value:e})}};
3
+ $jscomp.polyfill("Array.prototype.find",function(a){return a?a:function(a,c){return $jscomp.findInternal(this,a,c).v}},"es6","es3");
4
+ (function(a){function e(b,d,c,e){var f=!0;if("string"==typeof d){":radio"==d.substr(0,6)&&(d+=":checked");var g=a(d).val();"checkbox"==a(d).attr("type")&&(g=a(d).is(":checked")?"yes":"no");c=c.split(",");for(d=0;d<c.length;d++)if(g!=c[d])f=!1;else{f=!0;break}}c=a(b);b=a(b+"-container").parent();e=e.split("-");for(var h in e)if(g=e[h],f)switch(g){case "disable":b.removeClass("yith-disabled");c.attr("disabled",!1);break;case "hideme":c.show();break;default:b.show()}else switch(g){case "disable":b.addClass("yith-disabled");
5
+ c.attr("disabled",!0);break;case "hideme":c.hide();break;default:b.hide()}}a(".metaboxes-tab").each(function(){a(".tabs-panel",this).hide();var b=wpCookies.get("active_metabox_tab");b=null==b?a("ul.metaboxes-tabs li:first-child a",this).attr("href"):"#"+b;a(b).show();a(".metaboxes-tabs a",this).click(function(b){if(a(this).parent().hasClass("tabs"))b.preventDefault();else return b=a(this).attr("href"),a(this).parent().addClass("tabs").siblings("li").removeClass("tabs"),a(this).closest(".metaboxes-tab").find(".tabs-panel").hide(),
6
+ a(b).show(),!1})});var c=a("#_active_page_options-container").parent().html();a("#_active_page_options-container").parent().remove();a(c).insertAfter("#yit-post-setting .handlediv");a(c).insertAfter("#yit-page-setting .handlediv");a("#_active_page_options-container").on("click",function(){a("#_active_page_options").is(":checked")?a("#yit-page-setting .inside .metaboxes-tab, #yit-post-setting .inside .metaboxes-tab").css({opacity:1,"pointer-events":"auto"}):a("#yit-page-setting .inside .metaboxes-tab, #yit-post-setting .inside .metaboxes-tab").css({opacity:.5,
7
+ "pointer-events":"none"})}).click();a(".metaboxes-tab [data-dep-target]").each(function(){var b=a(this),c="#"+b.data("dep-target"),f="#"+b.data("dep-id"),h=b.data("dep-value"),k=b.data("dep-type");e(c,f,h.toString(),k);a(f).on("change",function(){e(c,f,h.toString(),k)}).change()})})(jQuery);
plugin-fw/assets/js/multisite-updater.js CHANGED
@@ -1,222 +1,222 @@
1
- /**
2
- * This file belongs to the YIT 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
- (function ( $ ) {
10
-
11
- var plugins_menu_item = $( '#menu-plugins' ),
12
- update = plugins_menu_item.find( '.update-plugins' ),
13
- count = update.find( ".update-count" ).text(),
14
- registered = plugins.registered,
15
- activated = plugins.activated;
16
-
17
- if ( count == 0 || count == '' ) {
18
- var update_row = '<span class="update-plugins"><span class="plugin-count"></span></span>';
19
- count = 0;
20
- plugins_menu_item.find( '.wp-menu-name' ).append( update_row );
21
- }
22
-
23
- /**
24
- * Add the plugin update rows for old plugins
25
- */
26
- update_plugins_row( registered, activated, count, plugins );
27
-
28
- /**
29
- *
30
- * Add the update plugin rows for old plugin
31
- *
32
- * @author Andrea Grillo <andrea.grillo@yithemes.com>
33
- *
34
- * @param registered Registred plugins
35
- * @param activated Activated plugins
36
- * @param count Number of old plugins
37
- * @param localize Localize strings array
38
- *
39
- * @return void
40
- */
41
- function update_plugins_row( registered, activated, count, localize ) {
42
- for ( var init in registered ) {
43
- var plugin = registered[ init ];
44
- for ( var headers in plugin ) {
45
-
46
- if ( headers == 'slug' || version_compare( plugin[ headers ].Version, plugin[ headers ].Latest, '=' ) ) {
47
- continue;
48
- }
49
-
50
- count = parseInt( count ) + 1;
51
- $( ".plugin-count" ).empty().html( count );
52
-
53
- var regex = new RegExp( ' ', 'g' ),
54
- info = plugin[ headers ],
55
- name = '' + info.Name,
56
- id = name.replace( regex, '-' ).trim(),
57
- row = '*[data-slug="' + id.toLowerCase() + '"]';
58
-
59
- $( row ).addClass( "update" );
60
-
61
- var html = '<tr class="plugin-update-tr">' +
62
- '<td colspan="3" class="plugin-update colspanchange">' +
63
- '<div class="update-message notice inline notice-warning notice-alt">' + localize.strings.new_version.replace( '%plugin_name%', name ) +
64
- '<a class="thickbox open-plugin-details-modal" href="' + localize.details_url[ init ] + '">' + localize.strings.latest.replace( '%latest%', plugin[ headers ].Latest ) + '</a>';
65
-
66
- if ( typeof activated[ init ] == "undefined" ) {
67
-
68
- html = html +
69
- ' <em>' + localize.strings.unavailable + '</em>' +
70
- localize.strings.activate.replace( '%activate_link%', localize.licence_activation_url ).replace( '%plugin_name%', name );
71
- } else {
72
- html = html +
73
- '. <a href="' + localize.update_url[ init ] + '">' + localize.strings.update_now + '</a>';
74
- }
75
-
76
- if( version_compare( plugin[ headers ].Version, plugin[ headers ].Latest, '>' ) ){
77
- html = html + localize.strings.version_issue.replace( '%plugin_name%', name )
78
- }
79
-
80
- html = html +
81
- '</div>' +
82
- '</td>' +
83
- '</tr>';
84
-
85
- $( html ).insertAfter( row );
86
- }
87
- }
88
- }
89
-
90
- /**
91
- *
92
- * @param v1 Version 1
93
- * @param v2 Version 2
94
- * @param operator Compare type
95
- * @returns bool
96
- *
97
- * @see php.js library http://phpjs.org/
98
- */
99
- function version_compare( v1, v2, operator ) {
100
- // discuss at: http://phpjs.org/functions/version_compare/
101
- // original by: Philippe Jausions (http://pear.php.net/user/jausions)
102
- // original by: Aidan Lister (http://aidanlister.com/)
103
- // reimplemented by: Kankrelune (http://www.webfaktory.info/)
104
- // improved by: Brett Zamir (http://brett-zamir.me)
105
- // improved by: Scott Baker
106
- // improved by: Theriault
107
- // example 1: version_compare('8.2.5rc', '8.2.5a');
108
- // returns 1: 1
109
- // example 2: version_compare('8.2.50', '8.2.52', '<');
110
- // returns 2: true
111
- // example 3: version_compare('5.3.0-dev', '5.3.0');
112
- // returns 3: -1
113
- // example 4: version_compare('4.1.0.52','4.01.0.51');
114
- // returns 4: 1
115
-
116
- this.php_js = this.php_js || {};
117
- this.php_js.ENV = this.php_js.ENV || {};
118
- // END REDUNDANT
119
- // Important: compare must be initialized at 0.
120
- var i = 0,
121
- x = 0,
122
- compare = 0,
123
- // vm maps textual PHP versions to negatives so they're less than 0.
124
- // PHP currently defines these as CASE-SENSITIVE. It is important to
125
- // leave these as negatives so that they can come before numerical versions
126
- // and as if no letters were there to begin with.
127
- // (1alpha is < 1 and < 1.1 but > 1dev1)
128
- // If a non-numerical value can't be mapped to this table, it receives
129
- // -7 as its value.
130
- vm = {
131
- 'dev' : -6,
132
- 'alpha': -5,
133
- 'a' : -5,
134
- 'beta' : -4,
135
- 'b' : -4,
136
- 'RC' : -3,
137
- 'rc' : -3,
138
- '#' : -2,
139
- 'p' : 1,
140
- 'pl' : 1
141
- },
142
- // This function will be called to prepare each version argument.
143
- // It replaces every _, -, and + with a dot.
144
- // It surrounds any nonsequence of numbers/dots with dots.
145
- // It replaces sequences of dots with a single dot.
146
- // version_compare('4..0', '4.0') == 0
147
- // Important: A string of 0 length needs to be converted into a value
148
- // even less than an unexisting value in vm (-7), hence [-8].
149
- // It's also important to not strip spaces because of this.
150
- // version_compare('', ' ') == 1
151
- prepVersion = function ( v ) {
152
- v = ('' + v)
153
- .replace( /[_\-+]/g, '.' );
154
- v = v.replace( /([^.\d]+)/g, '.$1.' )
155
- .replace( /\.{2,}/g, '.' );
156
- return (!v.length ? [ -8 ] : v.split( '.' ));
157
- };
158
- // This converts a version component to a number.
159
- // Empty component becomes 0.
160
- // Non-numerical component becomes a negative number.
161
- // Numerical component becomes itself as an integer.
162
- numVersion = function ( v ) {
163
- return !v ? 0 : (isNaN( v ) ? vm[ v ] || -7 : parseInt( v, 10 ));
164
- };
165
- v1 = prepVersion( v1 );
166
- v2 = prepVersion( v2 );
167
- x = Math.max( v1.length, v2.length );
168
- for ( i = 0; i < x; i++ ) {
169
- if ( v1[ i ] == v2[ i ] ) {
170
- continue;
171
- }
172
- v1[ i ] = numVersion( v1[ i ] );
173
- v2[ i ] = numVersion( v2[ i ] );
174
- if ( v1[ i ] < v2[ i ] ) {
175
- compare = -1;
176
- break;
177
- } else if ( v1[ i ] > v2[ i ] ) {
178
- compare = 1;
179
- break;
180
- }
181
- }
182
- if ( !operator ) {
183
- return compare;
184
- }
185
-
186
- // Important: operator is CASE-SENSITIVE.
187
- // "No operator" seems to be treated as "<."
188
- // Any other values seem to make the function return null.
189
- switch ( operator ) {
190
- case '>':
191
- case 'gt':
192
- return (compare > 0);
193
- case '>=':
194
- case 'ge':
195
- return (compare >= 0);
196
- case '<=':
197
- case 'le':
198
- return (compare <= 0);
199
- case '==':
200
- case '=':
201
- case 'eq':
202
- return (compare === 0);
203
- case '<>':
204
- case '!=':
205
- case 'ne':
206
- return (compare !== 0);
207
- case '':
208
- case '<':
209
- case 'lt':
210
- return (compare < 0);
211
- default:
212
- return null;
213
- }
214
- }
215
-
216
- // fix ThickBox issue (width-height) when opening a changelog
217
- $( 'body' ).on( 'click', '.yit-changelog-button', function () {
218
- $( '#TB_window' ).remove();
219
- } );
220
-
221
-
222
- })( jQuery );
1
+ /**
2
+ * This file belongs to the YIT 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
+ (function ( $ ) {
10
+
11
+ var plugins_menu_item = $( '#menu-plugins' ),
12
+ update = plugins_menu_item.find( '.update-plugins' ),
13
+ count = update.find( ".update-count" ).text(),
14
+ registered = plugins.registered,
15
+ activated = plugins.activated;
16
+
17
+ if ( count == 0 || count == '' ) {
18
+ var update_row = '<span class="update-plugins"><span class="plugin-count"></span></span>';
19
+ count = 0;
20
+ plugins_menu_item.find( '.wp-menu-name' ).append( update_row );
21
+ }
22
+
23
+ /**
24
+ * Add the plugin update rows for old plugins
25
+ */
26
+ update_plugins_row( registered, activated, count, plugins );
27
+
28
+ /**
29
+ *
30
+ * Add the update plugin rows for old plugin
31
+ *
32
+ * @author Andrea Grillo <andrea.grillo@yithemes.com>
33
+ *
34
+ * @param registered Registred plugins
35
+ * @param activated Activated plugins
36
+ * @param count Number of old plugins
37
+ * @param localize Localize strings array
38
+ *
39
+ * @return void
40
+ */
41
+ function update_plugins_row( registered, activated, count, localize ) {
42
+ for ( var init in registered ) {
43
+ var plugin = registered[ init ];
44
+ for ( var headers in plugin ) {
45
+
46
+ if ( headers == 'slug' || version_compare( plugin[ headers ].Version, plugin[ headers ].Latest, '=' ) ) {
47
+ continue;
48
+ }
49
+
50
+ count = parseInt( count ) + 1;
51
+ $( ".plugin-count" ).empty().html( count );
52
+
53
+ var regex = new RegExp( ' ', 'g' ),
54
+ info = plugin[ headers ],
55
+ name = '' + info.Name,
56
+ id = name.replace( regex, '-' ).trim(),
57
+ row = '*[data-slug="' + id.toLowerCase() + '"]';
58
+
59
+ $( row ).addClass( "update" );
60
+
61
+ var html = '<tr class="plugin-update-tr">' +
62
+ '<td colspan="3" class="plugin-update colspanchange">' +
63
+ '<div class="update-message notice inline notice-warning notice-alt">' + localize.strings.new_version.replace( '%plugin_name%', name ) +
64
+ '<a class="thickbox open-plugin-details-modal" href="' + localize.details_url[ init ] + '">' + localize.strings.latest.replace( '%latest%', plugin[ headers ].Latest ) + '</a>';
65
+
66
+ if ( typeof activated[ init ] == "undefined" ) {
67
+
68
+ html = html +
69
+ ' <em>' + localize.strings.unavailable + '</em>' +
70
+ localize.strings.activate.replace( '%activate_link%', localize.licence_activation_url ).replace( '%plugin_name%', name );
71
+ } else {
72
+ html = html +
73
+ '. <a href="' + localize.update_url[ init ] + '">' + localize.strings.update_now + '</a>';
74
+ }
75
+
76
+ if( version_compare( plugin[ headers ].Version, plugin[ headers ].Latest, '>' ) ){
77
+ html = html + localize.strings.version_issue.replace( '%plugin_name%', name )
78
+ }
79
+
80
+ html = html +
81
+ '</div>' +
82
+ '</td>' +
83
+ '</tr>';
84
+
85
+ $( html ).insertAfter( row );
86
+ }
87
+ }
88
+ }
89
+
90
+ /**
91
+ *
92
+ * @param v1 Version 1
93
+ * @param v2 Version 2
94
+ * @param operator Compare type
95
+ * @returns bool
96
+ *
97
+ * @see php.js library http://phpjs.org/
98
+ */
99
+ function version_compare( v1, v2, operator ) {
100
+ // discuss at: http://phpjs.org/functions/version_compare/
101
+ // original by: Philippe Jausions (http://pear.php.net/user/jausions)
102
+ // original by: Aidan Lister (http://aidanlister.com/)
103
+ // reimplemented by: Kankrelune (http://www.webfaktory.info/)
104
+ // improved by: Brett Zamir (http://brett-zamir.me)
105
+ // improved by: Scott Baker
106
+ // improved by: Theriault
107
+ // example 1: version_compare('8.2.5rc', '8.2.5a');
108
+ // returns 1: 1
109
+ // example 2: version_compare('8.2.50', '8.2.52', '<');
110
+ // returns 2: true
111
+ // example 3: version_compare('5.3.0-dev', '5.3.0');
112
+ // returns 3: -1
113
+ // example 4: version_compare('4.1.0.52','4.01.0.51');
114
+ // returns 4: 1
115
+
116
+ this.php_js = this.php_js || {};
117
+ this.php_js.ENV = this.php_js.ENV || {};
118
+ // END REDUNDANT
119
+ // Important: compare must be initialized at 0.
120
+ var i = 0,
121
+ x = 0,
122
+ compare = 0,
123
+ // vm maps textual PHP versions to negatives so they're less than 0.
124
+ // PHP currently defines these as CASE-SENSITIVE. It is important to
125
+ // leave these as negatives so that they can come before numerical versions
126
+ // and as if no letters were there to begin with.
127
+ // (1alpha is < 1 and < 1.1 but > 1dev1)
128
+ // If a non-numerical value can't be mapped to this table, it receives
129
+ // -7 as its value.
130
+ vm = {
131
+ 'dev' : -6,
132
+ 'alpha': -5,
133
+ 'a' : -5,
134
+ 'beta' : -4,
135
+ 'b' : -4,
136
+ 'RC' : -3,
137
+ 'rc' : -3,
138
+ '#' : -2,
139
+ 'p' : 1,
140
+ 'pl' : 1
141
+ },
142
+ // This function will be called to prepare each version argument.
143
+ // It replaces every _, -, and + with a dot.
144
+ // It surrounds any nonsequence of numbers/dots with dots.
145
+ // It replaces sequences of dots with a single dot.
146
+ // version_compare('4..0', '4.0') == 0
147
+ // Important: A string of 0 length needs to be converted into a value
148
+ // even less than an unexisting value in vm (-7), hence [-8].
149
+ // It's also important to not strip spaces because of this.
150
+ // version_compare('', ' ') == 1
151
+ prepVersion = function ( v ) {
152
+ v = ('' + v)
153
+ .replace( /[_\-+]/g, '.' );
154
+ v = v.replace( /([^.\d]+)/g, '.$1.' )
155
+ .replace( /\.{2,}/g, '.' );
156
+ return (!v.length ? [ -8 ] : v.split( '.' ));
157
+ };
158
+ // This converts a version component to a number.
159
+ // Empty component becomes 0.
160
+ // Non-numerical component becomes a negative number.
161
+ // Numerical component becomes itself as an integer.
162
+ numVersion = function ( v ) {
163
+ return !v ? 0 : (isNaN( v ) ? vm[ v ] || -7 : parseInt( v, 10 ));
164
+ };
165
+ v1 = prepVersion( v1 );
166
+ v2 = prepVersion( v2 );
167
+ x = Math.max( v1.length, v2.length );
168
+ for ( i = 0; i < x; i++ ) {
169
+ if ( v1[ i ] == v2[ i ] ) {
170
+ continue;
171
+ }
172
+ v1[ i ] = numVersion( v1[ i ] );
173
+ v2[ i ] = numVersion( v2[ i ] );
174
+ if ( v1[ i ] < v2[ i ] ) {
175
+ compare = -1;
176
+ break;
177
+ } else if ( v1[ i ] > v2[ i ] ) {
178
+ compare = 1;
179
+ break;
180
+ }
181
+ }
182
+ if ( !operator ) {
183
+ return compare;
184
+ }
185
+
186
+ // Important: operator is CASE-SENSITIVE.
187
+ // "No operator" seems to be treated as "<."
188
+ // Any other values seem to make the function return null.
189
+ switch ( operator ) {
190
+ case '>':
191
+ case 'gt':
192
+ return (compare > 0);
193
+ case '>=':
194
+ case 'ge':
195
+ return (compare >= 0);
196
+ case '<=':
197
+ case 'le':
198
+ return (compare <= 0);
199
+ case '==':
200
+ case '=':
201
+ case 'eq':
202
+ return (compare === 0);
203
+ case '<>':
204
+ case '!=':
205
+ case 'ne':
206
+ return (compare !== 0);
207
+ case '':
208
+ case '<':
209
+ case 'lt':
210
+ return (compare < 0);
211
+ default:
212
+ return null;
213
+ }
214
+ }
215
+
216
+ // fix ThickBox issue (width-height) when opening a changelog
217
+ $( 'body' ).on( 'click', '.yit-changelog-button', function () {
218
+ $( '#TB_window' ).remove();
219
+ } );
220
+
221
+
222
+ })( jQuery );
plugin-fw/assets/js/yit-cpt-unlimited.js CHANGED
@@ -1,79 +1,80 @@
1
- /**
2
- * This file belongs to the YIT 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
-
10
- (function($) {
11
- "use strict";
12
- // Author code here
13
-
14
- // open media box
15
- $('.wrap h1, .wrap h2').on( 'click', 'a.multi-uploader', function(event){
16
- event.preventDefault();
17
-
18
- var file_frame,
19
- button = $(this),
20
- selected = false;
21
-
22
- // spinner
23
- button.next('span.spinner').css( 'display', 'inline-block' );
24
-
25
- // If the media frame already exists, reopen it.
26
- if ( file_frame ) {
27
- file_frame.open();
28
- return;
29
- }
30
-
31
- // Create the media frame.
32
- file_frame = wp.media.frames.file_frame = wp.media({
33
- title: button.data( 'uploader_title' ),
34
- button: {
35
- text: button.data( 'uploader_button_text' )
36
- },
37
- library: {
38
- type: 'image'
39
- },
40
- multiple: true // Set to true to allow multiple files to be selected
41
- });
42
-
43
- // When an image is selected, run a callback.
44
- file_frame.on( 'select', function() {
45
- var selection = file_frame.state().get('selection'),
46
- images = [];
47
-
48
- selection.map( function( attachment ) {
49
- attachment = attachment.toJSON();
50
-
51
- // Do something with attachment.id and/or attachment.url here
52
- images.push( { id: attachment.id, url: attachment.url, title: attachment.title } );
53
- });
54
-
55
- // make AJAX request
56
- $.post( ajaxurl, {
57
- images: images,
58
- post_type: typenow,
59
- action: 'yit_cptu_multiuploader'
60
- }, function( data ){
61
- location.reload();
62
- });
63
-
64
- button.next('span.spinner').css( 'display', 'inline-block' );
65
-
66
- // flag
67
- selected = true;
68
- });
69
-
70
- // when close
71
- file_frame.on( 'close', function() {
72
- if ( ! selected ) button.next('span.spinner').hide();
73
- });
74
-
75
- // Finally, open the modal
76
- file_frame.open();
77
- });
78
-
 
79
  })(jQuery);
1
+ /**
2
+ * This file belongs to the YIT 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
+
10
+ (function($) {
11
+ "use strict";
12
+ // Author code here
13
+
14
+ // open media box
15
+ $('.wrap h1, .wrap h2').on( 'click', 'a.multi-uploader', function(event){
16
+ event.preventDefault();
17
+
18
+ var file_frame,
19
+ button = $(this),
20
+ selected = false;
21
+
22
+ // spinner
23
+ button.next('span.spinner').css( 'display', 'inline-block' );
24
+
25
+ // If the media frame already exists, reopen it.
26
+ if ( file_frame ) {
27
+ file_frame.open();
28
+ return;
29
+ }
30
+
31
+ // Create the media frame.
32
+ file_frame = wp.media.frames.file_frame = wp.media({
33
+ title: button.data( 'uploader_title' ),
34
+ button: {
35
+ text: button.data( 'uploader_button_text' )
36
+ },
37
+ library: {
38
+ type: 'image'
39
+ },
40
+ multiple: true // Set to true to allow multiple files to be selected
41
+ });
42
+
43
+ // When an image is selected, run a callback.
44
+ file_frame.on( 'select', function() {
45
+ var selection = file_frame.state().get('selection'),
46
+ images = [];
47
+
48
+ selection.map( function( attachment ) {
49
+ attachment = attachment.toJSON();
50
+
51
+ // Do something with attachment.id and/or attachment.url here
52
+ images.push( { id: attachment.id, url: attachment.url, title: attachment.title } );
53
+ });
54
+ console.log( button.data('nonce') );
55
+ // make AJAX request
56
+ $.post( ajaxurl, {
57
+ images: images,
58
+ post_type: typenow,
59
+ action: 'yit_cptu_multiuploader',
60
+ _ajax_nonce: button.data('nonce')
61
+ }, function( data ){
62
+ location.reload();
63
+ });
64
+
65
+ button.next('span.spinner').css( 'display', 'inline-block' );
66
+
67
+ // flag
68
+ selected = true;
69
+ });
70
+
71
+ // when close
72
+ file_frame.on( 'close', function() {
73
+ if ( ! selected ) button.next('span.spinner').hide();
74
+ });
75
+
76
+ // Finally, open the modal
77
+ file_frame.open();
78
+ });
79
+
80
  })(jQuery);
plugin-fw/assets/js/yit-cpt-unlimited.min.js CHANGED
@@ -1,2 +1,2 @@
1
- (function(d){d(".wrap h1, .wrap h2").on("click","a.multi-uploader",function(g){g.preventDefault();var b=d(this),e=!1;b.next("span.spinner").css("display","inline-block");if(!c){var c=wp.media.frames.file_frame=wp.media({title:b.data("uploader_title"),button:{text:b.data("uploader_button_text")},library:{type:"image"},multiple:!0});c.on("select",function(){var f=[];c.state().get("selection").map(function(a){a=a.toJSON();f.push({id:a.id,url:a.url,title:a.title})});d.post(ajaxurl,{images:f,post_type:typenow,
2
- action:"yit_cptu_multiuploader"},function(a){location.reload()});b.next("span.spinner").css("display","inline-block");e=!0});c.on("close",function(){e||b.next("span.spinner").hide()})}c.open()})})(jQuery);
1
+ (function(c){c(".wrap h1, .wrap h2").on("click","a.multi-uploader",function(f){f.preventDefault();var a=c(this),d=!1;a.next("span.spinner").css("display","inline-block");if(!b){var b=wp.media.frames.file_frame=wp.media({title:a.data("uploader_title"),button:{text:a.data("uploader_button_text")},library:{type:"image"},multiple:!0});b.on("select",function(){var e=[];b.state().get("selection").map(function(a){a=a.toJSON();e.push({id:a.id,url:a.url,title:a.title})});c.post(ajaxurl,{images:e,post_type:typenow,
2
+ action:"yit_cptu_multiuploader",_ajax_nonce:a.data("nonce")},function(a){location.reload()});a.next("span.spinner").css("display","inline-block");d=!0});b.on("close",function(){d||a.next("span.spinner").hide()})}b.open()})})(jQuery);
plugin-fw/assets/js/yit-plugin-panel.js CHANGED
@@ -1,152 +1,152 @@
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
-
10
- jQuery( function ( $ ) {
11
- //dependencies handler
12
- $( '[data-dep-target]' ).each( function () {
13
- var t = $( this );
14
-
15
- var field = '#' + t.data( 'dep-target' ),
16
- dep = '#' + t.data( 'dep-id' ),
17
- value = t.data( 'dep-value' ),
18
- type = t.data( 'dep-type' );
19
-
20
- dependencies_handler( field, dep, value.toString(), type );
21
-
22
- $( dep ).on( 'change', function () {
23
- dependencies_handler( field, dep, value.toString(), type );
24
- } ).change();
25
- } );
26
-
27
- //Handle dependencies.
28
- function dependencies_handler( id, deps, values, type ) {
29
- var result = true;
30
-
31
- //Single dependency
32
- if ( typeof( deps ) == 'string' ) {
33
- if ( deps.substr( 0, 6 ) == ':radio' ) {
34
- deps = deps + ':checked';
35
- }
36
-
37
- var val = $( deps ).val();
38
-
39
- if ( $( deps ).attr( 'type' ) == 'checkbox' ) {
40
- var thisCheck = $( deps );
41
- if ( thisCheck.is( ':checked' ) ) {
42
- val = 'yes';
43
- }
44
- else {
45
- val = 'no';
46
- }
47
- }
48
-
49
- values = values.split( ',' );
50
-
51
- for ( var i = 0; i < values.length; i++ ) {
52
- if ( val != values[ i ] ) {
53
- result = false;
54
- }
55
- else {
56
- result = true;
57
- break;
58
- }
59
- }
60
- }
61
-
62
- var $current_field = $( id ),
63
- $current_container = $( id + '-container' ).closest( 'tr' ); // container for YIT Plugin Panel
64
-
65
- if ( $current_container.length < 1 ) {
66
- // container for YIT Plugin Panel WooCommerce
67
- $current_container = $current_field.closest( '.yith-plugin-fw-panel-wc-row' );
68
- }
69
-
70
- var types = type.split( '-' ), j;
71
- for ( j in types ) {
72
- var current_type = types[ j ];
73
-
74
- if ( !result ) {
75
- switch ( current_type ) {
76
- case 'disable':
77
- $current_container.addClass( 'yith-disabled' );
78
- $current_field.attr( 'disabled', true );
79
- break;
80
- case 'hideme':
81
- $current_field.hide();
82
- break;
83
- default:
84
- $current_container.hide();
85
- }
86
-
87
- } else {
88
- switch ( current_type ) {
89
- case 'disable':
90
- $current_container.removeClass( 'yith-disabled' );
91
- $current_field.attr( 'disabled', false );
92
- break;
93
- case 'hideme':
94
- $current_field.show();
95
- break;
96
- default:
97
- $current_container.show();
98
- }
99
- }
100
- }
101
- }
102
-
103
- //connected list
104
- $( '.rm_connectedlist' ).each( function () {
105
- var ul = $( this ).find( 'ul' );
106
- var input = $( this ).find( ':hidden' );
107
- var sortable = ul.sortable( {
108
- connectWith: ul,
109
- update : function ( event, ui ) {
110
- var value = {};
111
-
112
- ul.each( function () {
113
- var options = {};
114
-
115
- $( this ).children().each( function () {
116
- options[ $( this ).data( 'option' ) ] = $( this ).text();
117
- } );
118
-
119
- value[ $( this ).data( 'list' ) ] = options;
120
- } );
121
-
122
- input.val( (JSON.stringify( value )).replace( /[\\"']/g, '\\$&' ).replace( /\u0000/g, '\\0' ) );
123
- }
124
- } ).disableSelection();
125
- } );
126
-
127
- //google analytics generation
128
- $( document ).ready( function () {
129
- $( '.google-analytic-generate' ).click( function () {
130
- var editor = $( '#' + $( this ).data( 'textarea' ) ).data( 'codemirrorInstance' );
131
- var