YITH WooCommerce Quick View - Version 1.4.0

Version Description

Released 06 March 2020

  • New: Support for WooCommerce 4.0
  • New: Support for WordPress 5.4
  • Update: Plugin framework
  • Fix: Enqueue of YITH WooCommerce Gift Card scripts if version installed is greater than 3.0.0
  • Fix: Do not enqueue YITH WooCommerce Gift Card scripts in product pages
  • Dev: New filter "yith_load_gift_card_script_pages_for_quick_view" to filter pages where YITH WooCommerce Gift Card scripts are loaded
Download this release

Release Info

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

Code changes from version 1.3.18 to 1.4.0

Files changed (81) hide show
  1. README.txt +280 -270
  2. assets/css/yith-quick-view.css +155 -155
  3. assets/image/01-bg.png +0 -0
  4. assets/image/01-icon.png +0 -0
  5. assets/image/01.png +0 -0
  6. assets/image/02-bg.png +0 -0
  7. assets/image/02-icon.png +0 -0
  8. assets/image/02.png +0 -0
  9. assets/image/03-bg.png +0 -0
  10. assets/image/03-icon.png +0 -0
  11. assets/image/03.png +0 -0
  12. assets/image/04-bg.png +0 -0
  13. assets/image/04-icon.png +0 -0
  14. assets/image/04.png +0 -0
  15. assets/image/05-bg.png +0 -0
  16. assets/image/05-icon.png +0 -0
  17. assets/image/05.png +0 -0
  18. assets/image/06-bg.png +0 -0
  19. assets/image/06-icon.png +0 -0
  20. assets/image/06.png +0 -0
  21. assets/image/07-bg.png +0 -0
  22. assets/image/07-icon.png +0 -0
  23. assets/image/07.png +0 -0
  24. assets/image/08-bg.png +0 -0
  25. assets/image/08-icon.png +0 -0
  26. assets/image/08.png +0 -0
  27. assets/image/09-bg.png +0 -0
  28. assets/image/09-icon.png +0 -0
  29. assets/image/09.png +0 -0
  30. assets/image/10.png +0 -0
  31. assets/image/qv-loader.gif +0 -0
  32. assets/image/upgrade.png +0 -0
  33. assets/image/video-yith-woocommerce-quick-view.jpg +0 -0
  34. assets/js/frontend.js +168 -184
  35. assets/js/frontend.min.js +8 -8
  36. includes/class.yith-wcqv-admin.php +242 -232
  37. includes/class.yith-wcqv-frontend.php +386 -393
  38. includes/class.yith-wcqv.php +166 -157
  39. init.php +132 -134
  40. languages/yith-woocommerce-quick-view-it_IT.mo +0 -0
  41. languages/yith-woocommerce-quick-view-it_IT.po +585 -585
  42. languages/yith-woocommerce-quick-view.pot +274 -274
  43. plugin-fw/assets/css/admin.css +196 -196
  44. plugin-fw/assets/css/codemirror/codemirror.css +260 -260
  45. plugin-fw/assets/css/colorbox.css +65 -65
  46. plugin-fw/assets/css/metaboxes.css +751 -751
  47. plugin-fw/assets/css/yit-plugin-panel.css +631 -631
  48. plugin-fw/assets/css/yit-upgrade-to-pro.css +76 -76
  49. plugin-fw/assets/css/yit-upgrader.css +21 -21
  50. plugin-fw/assets/css/yith-fields.css +2183 -2179
  51. plugin-fw/assets/css/yith-select2-no-wc.css +740 -740
  52. plugin-fw/assets/fonts/yith-icon.eot +0 -0
  53. plugin-fw/assets/fonts/yith-icon.svg +9 -0
  54. plugin-fw/assets/fonts/yith-icon.ttf +0 -0
  55. plugin-fw/assets/fonts/yith-icon.woff +0 -0
  56. plugin-fw/assets/images/arrow_down.svg +0 -0
  57. plugin-fw/assets/images/banner-premium.png +0 -0
  58. plugin-fw/assets/images/colorbox/border1.png +0 -0
  59. plugin-fw/assets/images/colorbox/border2.png +0 -0
  60. plugin-fw/assets/images/colorbox/loading.gif +0 -0
  61. plugin-fw/assets/images/double-sidebar.png +0 -0
  62. plugin-fw/assets/images/licence-error.png +0 -0
  63. plugin-fw/assets/images/no-sidebar.png +0 -0
  64. plugin-fw/assets/images/sidebar-left.png +0 -0
  65. plugin-fw/assets/images/sidebar-right.png +0 -0
  66. plugin-fw/assets/images/sleep.png +0 -0
  67. plugin-fw/assets/images/spinner.png +0 -0
  68. plugin-fw/assets/images/ui-icons_222222_256x240.png +0 -0
  69. plugin-fw/assets/images/ui-icons_2e83ff_256x240.png +0 -0
  70. plugin-fw/assets/images/ui-icons_454545_256x240.png +0 -0
  71. plugin-fw/assets/images/ui-icons_888888_256x240.png +0 -0
  72. plugin-fw/assets/images/x.png +0 -0
  73. plugin-fw/assets/images/yith-icon.svg +0 -0
  74. plugin-fw/assets/images/yithemes-icon.png +0 -0
  75. plugin-fw/assets/js/codemirror/codemirror.js +5799 -5799
  76. plugin-fw/assets/js/codemirror/javascript.js +630 -630
  77. plugin-fw/assets/js/how-to.js +6 -6
  78. plugin-fw/assets/js/how-to.min.js +1 -1
  79. plugin-fw/assets/js/javascript-md5/md5.min.js +0 -0
  80. plugin-fw/assets/js/jquery.colorbox.js +1104 -1104
  81. plugin-fw/assets/js/jquery.colorbox.min.js +20 -33
README.txt CHANGED
@@ -1,270 +1,280 @@
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.18
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.18 = Released 21 December 2019
46
-
47
- * New: Support for WooCommerce 3.9
48
- * New: Support for WordPress 5.3.2
49
- * Update: Plugin framework
50
-
51
- = 1.3.17 = Released 29 November 2019
52
-
53
- * Update: Plugin framework
54
-
55
- = 1.3.16 = Released 05 November 2019
56
-
57
- * Update: Plugin framework
58
-
59
- = 1.3.15 = Released 30 October 2019
60
-
61
- * Update: Plugin framework
62
-
63
- = 1.3.14 = Released 28 October 2019
64
-
65
- * New: Support for WooCommerce 3.8
66
- * New: Support for WordPress 5.3
67
- * Update: Plugin framework
68
- * Fix: fatal error (Uncaught Error: Call to undefined function curl_init() )
69
-
70
- = 1.3.13 = Released 26 August 2019
71
-
72
- * Update: plugin core
73
- * Fix: fatal error (Uncaught Error: Call to undefined function curl_init() )
74
-
75
-
76
- = 1.3.12 = Released 31 July 2019
77
-
78
- * New: Support to WooCommerce 3.7.0 RC1
79
- * New: Plugin admin panel style
80
- * Update: Plugin Core
81
-
82
- = 1.3.11 = Released 12 June 2019
83
-
84
- * Update: Plugin Core
85
-
86
- = 1.3.10 = Released 11 June 2019
87
-
88
- * New: Support to WooCommerce 3.6.4
89
- * New: Support to WordPress 5.2.1
90
- * Update: Plugin Core
91
-
92
- = 1.3.9 = Released 23 April 2019
93
-
94
- * New: Support to WooCommerce 3.6.1
95
- * Update: Plugin Core
96
-
97
- = 1.3.8 = Released 02 April 2019
98
-
99
- * New: Support to WooCommerce 3.6.0 RC1
100
- * Update: Plugin Core
101
- * Fix: Style issue on Storefront theme
102
-
103
- = 1.3.7 = Released 21 February 2019
104
-
105
- * New: Support to WooCommerce 3.5.5
106
- * New: Support to WordPress 5.1.0
107
- * Update: Plugin Core
108
- * Fix: Conflict with YITH WooCommerce Gift Card form in checkout page
109
-
110
- = 1.3.6 = Released 06 December 2018
111
-
112
- * New: Support to WooCommerce 3.5.2
113
- * New: Support to WordPress 5.0.0
114
- * Update: Plugin Core
115
-
116
- = 1.3.5 = Released 24 October 2018
117
-
118
- * New: Support to WooCommerce 3.5.0
119
- * Update: Plugin Core
120
-
121
- = 1.3.4 = Released 05 October 2018
122
-
123
- * New: Support to WooCommerce 3.5.0 RC1
124
- * New: Compatibility with YITH WooCommerce Gift Card
125
- * Update: Plugin Core
126
-
127
- = 1.3.3 = Released 27 September 2018
128
-
129
- * Update: Plugin Core
130
- * Dev: New filter "yith_wcqv_show_quick_view_button"
131
-
132
- = 1.3.2 = Released 12 September 2018
133
-
134
- * New: Support to WooCommerce 3.4.5
135
- * New: Support to WordPress 4.9.8
136
- * Update: Plugin Core
137
- * Fix: Now is possible use shortcode [yith_quick_view] without specify the "product_id" parameter
138
-
139
- = 1.3.1 = Released 30 May 2018
140
-
141
- * New: Support to WooCommerce 3.4.0
142
- * New: Support to WordPress 4.9.6
143
- * Update: Plugin Core
144
- * Fix: Product image zoom in Quick View modal
145
- * Fix: Removed redirect to single product page after add to cart
146
- * Fix: WPML compatibility issue
147
-
148
- = 1.3.0 = Released 01 February 2018
149
-
150
- * New: Support to WooCommerce 3.3.0
151
- * New: Support to WordPress 4.9.2
152
- * Update: Plugin Core
153
-
154
- = 1.2.2 = Released 11 October 2017
155
-
156
- * New: Support to WooCommerce 3.2.0 RC2
157
- * New: Support to WordPress 4.8.2
158
- * Fix: Compatibility issue with YITH WooCommerce Product Bundles
159
- * Update: Plugin Core
160
-
161
- = 1.2.1 = Released 05 April 2017
162
-
163
- * Fix: Compatibility issue with YITH WooCommerce Wishlist
164
- * Update: Plugin Core
165
-
166
- = 1.2.0 = Released 31 March 2017
167
-
168
- * New: Support to WordPress 4.7.3
169
- * New: Support to WooCommerce 3.0.0 RC2
170
- * New: Shortcode [yith_quick_view product_id="" label=""] for print "quick view" button of specified product
171
- * Update: Plugin Core
172
-
173
- = 1.1.4 = Released 24 October 2016
174
-
175
- * Fix: Status code 404 for "Quick View" on single product page
176
-
177
- = 1.1.3 = Released 20 October 2016
178
-
179
- * New: Support to WooCommerce 2.6.5
180
- * New: Support to WordPress 4.6.1
181
- * Update: Plugin Core.
182
- * Fix: Responsive style.
183
- * Fix: Add inline css using WordPress function wp_add_inline_style.
184
-
185
- = 1.1.2 = Released 10 June 2016
186
-
187
- * New: Added minimized js files. Plugin loads full files version if the constant "SCRIPT_DEBUG" is defined and is true.
188
- * New: Support to WooCommerce 2.6 RC1
189
- * Update: Plugin Core
190
-
191
- = 1.1.1 = Released 18 April 2016
192
-
193
- * New: Compatibility with WordPress 4.5
194
- * Update: Plugin Core
195
-
196
- = 1.1.0 = Released 30 October 2015
197
-
198
- * New: Compatibility with YITH WooCommerce Wishlist
199
- * New: Compatibility with YITH WooCommerce Badge Management
200
- * New: Italian Language
201
- * Update: Language file .pot. Changed textdomain to yith-wcqv to yith-woocommerce-quick-view
202
- * Update: Plugin Core
203
-
204
- = 1.0.8 = Released 24 August 2015
205
-
206
- * Fix: Main template issue
207
-
208
- = 1.0.7 = Released 21 August 2015
209
-
210
- * New: Compatibility with Wordpress 4.3
211
- * New: WPML config xml
212
- * Update: Language file .pot
213
- * Fix: Default variation select
214
-
215
- = 1.0.6 = Released 12 August 2015
216
-
217
- * Update: Plugin Core
218
-
219
- = 1.0.5 = Released 11 August 2015
220
-
221
- * New: Compatibility with WooCommerce 2.4
222
- * Update: Plugin Core
223
- * Update: Language file
224
-
225
- = 1.0.4 = Released 18 May 2015
226
-
227
- * New option for enable quick view also in mobile device
228
- * Compatibility with Wordpress 4.2.2
229
- * Minor bug fix
230
- * Update Plugin Core
231
- * Update Language file
232
-
233
- = 1.0.3 = Released 11 March 2015
234
-
235
- * Minor bug fix
236
- * Update Plugin Core
237
-
238
- = 1.0.2 = Released 06 March 2015
239
-
240
- * New: Action yith_quick_view_custom_style_scripts
241
- * New: Filter 'yith_quick_view_loader_gif
242
-
243
- = 1.0.1 = Released 26 February 2015
244
-
245
- * Minor bug fix
246
-
247
- = 1.0.0 = Released 17 February 2015
248
-
249
- * Initial release
250
-
251
- == Suggestions ==
252
-
253
- 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.
254
-
255
- == Translators ==
256
-
257
- = Available Languages =
258
- * English
259
- * Italian
260
-
261
- 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").
262
- 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.
263
-
264
- == Upgrade notice ==
265
-
266
- = 1.3.18 = Released 21 December 2019
267
-
268
- * New: Support for WooCommerce 3.9
269
- * New: Support for WordPress 5.3.2
270
- * Update: Plugin framework
 
 
 
 
 
 
 
 
 
 
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.4
6
+ Stable tag: 1.4.0
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
+ * Customize style of modal
26
+
27
+ Full documentation is available [here](https://docs.yithemes.com/yith-woocommerce-quick-view/).
28
+
29
+ == Installation ==
30
+
31
+ 1. Unzip the downloaded zip file.
32
+ 2. Upload the plugin folder into the `wp-content/plugins/` directory of your WordPress site.
33
+ 3. Activate `YITH WooCommerce Quick View` from Plugins page.
34
+
35
+ == Screenshots ==
36
+
37
+ 1. The plugin admin page.
38
+ 2. The quick view button in shop page.
39
+ 3. The quick view modal.
40
+
41
+ == Changelog ==
42
+
43
+ = 1.4.0 = Released 06 March 2020
44
+
45
+ * New: Support for WooCommerce 4.0
46
+ * New: Support for WordPress 5.4
47
+ * Update: Plugin framework
48
+ * Fix: Enqueue of YITH WooCommerce Gift Card scripts if version installed is greater than 3.0.0
49
+ * Fix: Do not enqueue YITH WooCommerce Gift Card scripts in product pages
50
+ * Dev: New filter "yith_load_gift_card_script_pages_for_quick_view" to filter pages where YITH WooCommerce Gift Card scripts are loaded
51
+
52
+ = 1.3.18 = Released 21 December 2019
53
+
54
+ * New: Support for WooCommerce 3.9
55
+ * New: Support for WordPress 5.3.2
56
+ * Update: Plugin framework
57
+
58
+ = 1.3.17 = Released 29 November 2019
59
+
60
+ * Update: Plugin framework
61
+
62
+ = 1.3.16 = Released 05 November 2019
63
+
64
+ * Update: Plugin framework
65
+
66
+ = 1.3.15 = Released 30 October 2019
67
+
68
+ * Update: Plugin framework
69
+
70
+ = 1.3.14 = Released 28 October 2019
71
+
72
+ * New: Support for WooCommerce 3.8
73
+ * New: Support for WordPress 5.3
74
+ * Update: Plugin framework
75
+ * Fix: fatal error (Uncaught Error: Call to undefined function curl_init() )
76
+
77
+ = 1.3.13 = Released 26 August 2019
78
+
79
+ * Update: plugin core
80
+ * Fix: fatal error (Uncaught Error: Call to undefined function curl_init() )
81
+
82
+
83
+ = 1.3.12 = Released 31 July 2019
84
+
85
+ * New: Support to WooCommerce 3.7.0 RC1
86
+ * New: Plugin admin panel style
87
+ * Update: Plugin Core
88
+
89
+ = 1.3.11 = Released 12 June 2019
90
+
91
+ * Update: Plugin Core
92
+
93
+ = 1.3.10 = Released 11 June 2019
94
+
95
+ * New: Support to WooCommerce 3.6.4
96
+ * New: Support to WordPress 5.2.1
97
+ * Update: Plugin Core
98
+
99
+ = 1.3.9 = Released 23 April 2019
100
+
101
+ * New: Support to WooCommerce 3.6.1
102
+ * Update: Plugin Core
103
+
104
+ = 1.3.8 = Released 02 April 2019
105
+
106
+ * New: Support to WooCommerce 3.6.0 RC1
107
+ * Update: Plugin Core
108
+ * Fix: Style issue on Storefront theme
109
+
110
+ = 1.3.7 = Released 21 February 2019
111
+
112
+ * New: Support to WooCommerce 3.5.5
113
+ * New: Support to WordPress 5.1.0
114
+ * Update: Plugin Core
115
+ * Fix: Conflict with YITH WooCommerce Gift Card form in checkout page
116
+
117
+ = 1.3.6 = Released 06 December 2018
118
+
119
+ * New: Support to WooCommerce 3.5.2
120
+ * New: Support to WordPress 5.0.0
121
+ * Update: Plugin Core
122
+
123
+ = 1.3.5 = Released 24 October 2018
124
+
125
+ * New: Support to WooCommerce 3.5.0
126
+ * Update: Plugin Core
127
+
128
+ = 1.3.4 = Released 05 October 2018
129
+
130
+ * New: Support to WooCommerce 3.5.0 RC1
131
+ * New: Compatibility with YITH WooCommerce Gift Card
132
+ * Update: Plugin Core
133
+
134
+ = 1.3.3 = Released 27 September 2018
135
+
136
+ * Update: Plugin Core
137
+ * Dev: New filter "yith_wcqv_show_quick_view_button"
138
+
139
+ = 1.3.2 = Released 12 September 2018
140
+
141
+ * New: Support to WooCommerce 3.4.5
142
+ * New: Support to WordPress 4.9.8
143
+ * Update: Plugin Core
144
+ * Fix: Now is possible use shortcode [yith_quick_view] without specify the "product_id" parameter
145
+
146
+ = 1.3.1 = Released 30 May 2018
147
+
148
+ * New: Support to WooCommerce 3.4.0
149
+ * New: Support to WordPress 4.9.6
150
+ * Update: Plugin Core
151
+ * Fix: Product image zoom in Quick View modal
152
+ * Fix: Removed redirect to single product page after add to cart
153
+ * Fix: WPML compatibility issue
154
+
155
+ = 1.3.0 = Released 01 February 2018
156
+
157
+ * New: Support to WooCommerce 3.3.0
158
+ * New: Support to WordPress 4.9.2
159
+ * Update: Plugin Core
160
+
161
+ = 1.2.2 = Released 11 October 2017
162
+
163
+ * New: Support to WooCommerce 3.2.0 RC2
164
+ * New: Support to WordPress 4.8.2
165
+ * Fix: Compatibility issue with YITH WooCommerce Product Bundles
166
+ * Update: Plugin Core
167
+
168
+ = 1.2.1 = Released 05 April 2017
169
+
170
+ * Fix: Compatibility issue with YITH WooCommerce Wishlist
171
+ * Update: Plugin Core
172
+
173
+ = 1.2.0 = Released 31 March 2017
174
+
175
+ * New: Support to WordPress 4.7.3
176
+ * New: Support to WooCommerce 3.0.0 RC2
177
+ * New: Shortcode [yith_quick_view product_id="" label=""] for print "quick view" button of specified product
178
+ * Update: Plugin Core
179
+
180
+ = 1.1.4 = Released 24 October 2016
181
+
182
+ * Fix: Status code 404 for "Quick View" on single product page
183
+
184
+ = 1.1.3 = Released 20 October 2016
185
+
186
+ * New: Support to WooCommerce 2.6.5
187
+ * New: Support to WordPress 4.6.1
188
+ * Update: Plugin Core.
189
+ * Fix: Responsive style.
190
+ * Fix: Add inline css using WordPress function wp_add_inline_style.
191
+
192
+ = 1.1.2 = Released 10 June 2016
193
+
194
+ * New: Added minimized js files. Plugin loads full files version if the constant "SCRIPT_DEBUG" is defined and is true.
195
+ * New: Support to WooCommerce 2.6 RC1
196
+ * Update: Plugin Core
197
+
198
+ = 1.1.1 = Released 18 April 2016
199
+
200
+ * New: Compatibility with WordPress 4.5
201
+ * Update: Plugin Core
202
+
203
+ = 1.1.0 = Released 30 October 2015
204
+
205
+ * New: Compatibility with YITH WooCommerce Wishlist
206
+ * New: Compatibility with YITH WooCommerce Badge Management
207
+ * New: Italian Language
208
+ * Update: Language file .pot. Changed textdomain to yith-wcqv to yith-woocommerce-quick-view
209
+ * Update: Plugin Core
210
+
211
+ = 1.0.8 = Released 24 August 2015
212
+
213
+ * Fix: Main template issue
214
+
215
+ = 1.0.7 = Released 21 August 2015
216
+
217
+ * New: Compatibility with Wordpress 4.3
218
+ * New: WPML config xml
219
+ * Update: Language file .pot
220
+ * Fix: Default variation select
221
+
222
+ = 1.0.6 = Released 12 August 2015
223
+
224
+ * Update: Plugin Core
225
+
226
+ = 1.0.5 = Released 11 August 2015
227
+
228
+ * New: Compatibility with WooCommerce 2.4
229
+ * Update: Plugin Core
230
+ * Update: Language file
231
+
232
+ = 1.0.4 = Released 18 May 2015
233
+
234
+ * New option for enable quick view also in mobile device
235
+ * Compatibility with Wordpress 4.2.2
236
+ * Minor bug fix
237
+ * Update Plugin Core
238
+ * Update Language file
239
+
240
+ = 1.0.3 = Released 11 March 2015
241
+
242
+ * Minor bug fix
243
+ * Update Plugin Core
244
+
245
+ = 1.0.2 = Released 06 March 2015
246
+
247
+ * New: Action yith_quick_view_custom_style_scripts
248
+ * New: Filter 'yith_quick_view_loader_gif
249
+
250
+ = 1.0.1 = Released 26 February 2015
251
+
252
+ * Minor bug fix
253
+
254
+ = 1.0.0 = Released 17 February 2015
255
+
256
+ * Initial release
257
+
258
+ == Suggestions ==
259
+
260
+ 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.
261
+
262
+ == Translators ==
263
+
264
+ = Available Languages =
265
+ * English
266
+ * Italian
267
+
268
+ 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").
269
+ 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.
270
+
271
+ == Upgrade notice ==
272
+
273
+ = 1.4.0 = Released 06 March 2020
274
+
275
+ * New: Support for WooCommerce 4.0
276
+ * New: Support for WordPress 5.4
277
+ * Update: Plugin framework
278
+ * Fix: Enqueue of YITH WooCommerce Gift Card scripts if version installed is greater than 3.0.0
279
+ * Fix: Do not enqueue YITH WooCommerce Gift Card scripts in product pages
280
+ * Dev: New filter "yith_load_gift_card_script_pages_for_quick_view" to filter pages where YITH WooCommerce Gift Card scripts are loaded
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/image/01-bg.png CHANGED
File without changes
assets/image/01-icon.png CHANGED
File without changes
assets/image/01.png CHANGED
File without changes
assets/image/02-bg.png CHANGED
File without changes
assets/image/02-icon.png CHANGED
File without changes
assets/image/02.png CHANGED
File without changes
assets/image/03-bg.png CHANGED
File without changes
assets/image/03-icon.png CHANGED
File without changes
assets/image/03.png CHANGED
File without changes
assets/image/04-bg.png CHANGED
File without changes
assets/image/04-icon.png CHANGED
File without changes
assets/image/04.png CHANGED
File without changes
assets/image/05-bg.png CHANGED
File without changes
assets/image/05-icon.png CHANGED
File without changes
assets/image/05.png CHANGED
File without changes
assets/image/06-bg.png CHANGED
File without changes
assets/image/06-icon.png CHANGED
File without changes
assets/image/06.png CHANGED
File without changes
assets/image/07-bg.png CHANGED
File without changes
assets/image/07-icon.png CHANGED
File without changes
assets/image/07.png CHANGED
File without changes
assets/image/08-bg.png CHANGED
File without changes
assets/image/08-icon.png CHANGED
File without changes
assets/image/08.png CHANGED
File without changes
assets/image/09-bg.png CHANGED
File without changes
assets/image/09-icon.png CHANGED
File without changes
assets/image/09.png CHANGED
File without changes
assets/image/10.png CHANGED
File without changes
assets/image/qv-loader.gif CHANGED
File without changes
assets/image/upgrade.png CHANGED
File without changes
assets/image/video-yith-woocommerce-quick-view.jpg CHANGED
File without changes
assets/js/frontend.js CHANGED
@@ -1,185 +1,169 @@
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
+ // Variation Form
94
+ var form_variation = qv_content.find('.variations_form');
95
+ form_variation.each( function() {
96
+ $( this ).wc_variation_form();
97
+ // add Color and Label Integration
98
+ if( typeof $.fn.yith_wccl !== 'undefined' ) {
99
+ $(this).yith_wccl();
100
+ }
101
+ });
102
+
103
+ form_variation.trigger( 'check_variations' );
104
+ form_variation.trigger( 'reset_image' );
105
+
106
+ if( typeof $.fn.wc_product_gallery !== 'undefined' ) {
107
+ qv_content.find('.woocommerce-product-gallery').each(function () {
108
+ $(this).wc_product_gallery();
109
+ });
110
+ }
111
+
112
+ if (!qv_modal.hasClass('open')) {
113
+ qv_modal.removeClass('loading').addClass('open');
114
+ if (is_blocked)
115
+ t.unblock();
116
+ }
117
+
118
+ // stop loader
119
+ $(document).trigger('qv_loader_stop');
120
+
121
+ }
122
+ });
123
+ };
124
+
125
+ /*===================
126
+ * CLOSE QUICK VIEW
127
+ ===================*/
128
+
129
+ var close_modal_qv = function() {
130
+
131
+ // Close box by click overlay
132
+ qv_overlay.on( 'click', function(e){
133
+ close_qv();
134
+ });
135
+ // Close box with esc key
136
+ $(document).keyup(function(e){
137
+ if( e.keyCode === 27 )
138
+ close_qv();
139
+ });
140
+ // Close box by click close button
141
+ qv_close.on( 'click', function(e) {
142
+ e.preventDefault();
143
+ close_qv();
144
+ });
145
+
146
+ var close_qv = function() {
147
+ qv_modal.removeClass('open').removeClass('loading');
148
+
149
+ setTimeout(function () {
150
+ qv_content.html('');
151
+ }, 1000);
152
+ }
153
+ };
154
+
155
+ close_modal_qv();
156
+
157
+
158
+ center_modal();
159
+ $( window ).on( 'resize', center_modal );
160
+
161
+ // START
162
+ $.fn.yith_quick_view();
163
+
164
+ $( document ).on( 'yith_infs_adding_elem yith-wcan-ajax-filtered', function(){
165
+ // RESTART
166
+ $.fn.yith_quick_view();
167
+ });
168
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
169
  });
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(o){"use strict";if("undefined"!=typeof yith_qv){var c=o(document).find("#yith-quick-view-modal"),i=c.find(".yith-quick-view-overlay"),a=c.find("#yith-quick-view-content"),n=c.find("#yith-quick-view-close"),d=c.find(".yith-wcqv-wrapper"),r=d.width(),u=d.height(),t=function(){var i=o(window).width(),t=o(window).height(),n=r<i-60?r:i-60,e=u<t-120?u:t-120;d.css({left:i/2-n/2,top:t/2-e/2,width:n+"px",height:e+"px"})};o.fn.yith_quick_view=function(){o(document).off("click",".yith-wcqv-button").on("click",".yith-wcqv-button",function(i){i.preventDefault();var t=o(this),n=t.data("product_id"),e=!1;void 0!==yith_qv.loader&&(e=!0,t.block({message:null,overlayCSS:{background:"#fff url("+yith_qv.loader+") no-repeat center",opacity:.5,cursor:"none"}}),c.hasClass("loading")||c.addClass("loading"),o(document).trigger("qv_loading")),l(t,n,e)})};var l=function(n,i,e){o.ajax({url:yith_qv.ajaxurl,data:{action:"yith_load_product_quick_view",product_id:i,lang:yith_qv.lang},dataType:"html",type:"POST",success:function(i){a.html(i);var t=a.find(".variations_form");t.each(function(){o(this).wc_variation_form(),void 0!==o.fn.yith_wccl&&o(this).yith_wccl()}),t.trigger("check_variations"),t.trigger("reset_image"),void 0!==o.fn.wc_product_gallery&&a.find(".woocommerce-product-gallery").each(function(){o(this).wc_product_gallery()}),c.hasClass("open")||(c.removeClass("loading").addClass("open"),e&&n.unblock()),o(document).trigger("qv_loader_stop")}})};!function(){i.on("click",function(i){t()}),o(document).keyup(function(i){27===i.keyCode&&t()}),n.on("click",function(i){i.preventDefault(),t()});var t=function(){c.removeClass("open").removeClass("loading"),setTimeout(function(){a.html("")},1e3)}}(),t(),o(window).on("resize",t),o.fn.yith_quick_view(),o(document).on("yith_infs_adding_elem yith-wcan-ajax-filtered",function(){o.fn.yith_quick_view()})}});
includes/class.yith-wcqv-admin.php CHANGED
@@ -1,232 +1,242 @@
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
- 'plugin_slug' => YITH_WCQV_SLUG
156
- );
157
-
158
-
159
- /* === Fixed: not updated theme === */
160
- if( ! class_exists( 'YIT_Plugin_Panel_WooCommerce' ) ) {
161
- require_once( 'plugin-fw/lib/yit-plugin-panel-wc.php' );
162
- }
163
-
164
- $this->_panel = new YIT_Plugin_Panel_WooCommerce( $args );
165
- }
166
-
167
- /**
168
- * Premium Tab Template
169
- *
170
- * Load the premium tab template on admin page
171
- *
172
- * @return void
173
- * @since 1.0
174
- * @author Andrea Grillo <andrea.grillo@yithemes.com>
175
- * @return void
176
- */
177
- public function premium_tab() {
178
- $premium_tab_template = YITH_WCQV_TEMPLATE_PATH . '/admin/' . $this->_premium;
179
- if( file_exists( $premium_tab_template ) ) {
180
- include_once($premium_tab_template);
181
- }
182
-
183
- }
184
-
185
- /**
186
- * plugin_row_meta
187
- *
188
- * add the action links to plugin admin page
189
- *
190
- * @param $plugin_meta
191
- * @param $plugin_file
192
- * @param $plugin_data
193
- * @param $status
194
- *
195
- * @return Array
196
- * @since 1.0
197
- * @author Andrea Grillo <andrea.grillo@yithemes.com>
198
- * @use plugin_row_meta
199
- */
200
- public function plugin_row_meta( $new_row_meta_args, $plugin_meta, $plugin_file, $plugin_data, $status ) {
201
- if ( defined( 'YITH_WCQV_INIT' ) && YITH_WCQV_INIT == $plugin_file ) {
202
- $new_row_meta_args['slug'] = YITH_WCQV_SLUG;
203
-
204
- if( defined( 'YITH_WCQV_PREMIUM' ) ){
205
- $new_row_meta_args['is_premium'] = true;
206
- }
207
- }
208
- return $new_row_meta_args;
209
- }
210
-
211
- /**
212
- * Get the premium landing uri
213
- *
214
- * @since 1.0.0
215
- * @author Andrea Grillo <andrea.grillo@yithemes.com>
216
- * @return string The premium landing link
217
- */
218
- public function get_premium_landing_uri(){
219
- return $this->_premium_landing;
220
- }
221
-
222
- }
223
- }
224
- /**
225
- * Unique access to instance of YITH_WCQV_Admin class
226
- *
227
- * @return \YITH_WCQV_Admin
228
- * @since 1.0.0
229
- */
230
- function YITH_WCQV_Admin(){
231
- return YITH_WCQV_Admin::get_instance();
232
- }
 
 
 
 
 
 
 
 
 
 
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
+ * @since 1.0.0
27
+ * @var YITH_WCQV_Admin
28
+ */
29
+ protected static $instance;
30
+
31
+ /**
32
+ * Plugin options
33
+ *
34
+ * @since 1.0.0
35
+ * @var array
36
+ * @access public
37
+ */
38
+ public $options = array();
39
+
40
+ /**
41
+ * Plugin version
42
+ *
43
+ * @since 1.0.0
44
+ * @var string
45
+ */
46
+ public $version = YITH_WCQV_VERSION;
47
+
48
+ /**
49
+ * Panel Object
50
+ *
51
+ * @since 1.0.0
52
+ * @var object $panel
53
+ */
54
+ protected $panel;
55
+
56
+ /**
57
+ * Premium tab template file name
58
+ *
59
+ * @since 1.0.0
60
+ * @var string $premium
61
+ */
62
+ protected $premium = 'premium.php';
63
+
64
+ /**
65
+ * Premium version landing link
66
+ *
67
+ * @since 1.0.0
68
+ * @var string
69
+ */
70
+ protected $premium_landing = 'https://yithemes.com/themes/plugins/yith-woocommerce-quick-view/';
71
+
72
+ /**
73
+ * Quick View panel page
74
+ *
75
+ * @since 1.0.0
76
+ * @var string
77
+ */
78
+ protected $panel_page = 'yith_wcqv_panel';
79
+
80
+ /**
81
+ * Returns single instance of the class
82
+ *
83
+ * @since 1.0.0
84
+ * @return YITH_WCQV_Admin
85
+ */
86
+ public static function get_instance() {
87
+ if ( is_null( self::$instance ) ) {
88
+ self::$instance = new self();
89
+ }
90
+
91
+ return self::$instance;
92
+ }
93
+
94
+ /**
95
+ * Constructor
96
+ *
97
+ * @access public
98
+ * @since 1.0.0
99
+ */
100
+ public function __construct() {
101
+
102
+ // Add panel options.
103
+ add_action( 'admin_menu', array( $this, 'register_panel' ), 5 );
104
+
105
+ // Add action links.
106
+ add_filter( 'plugin_action_links_' . plugin_basename( YITH_WCQV_DIR . '/' . basename( YITH_WCQV_FILE ) ), array( $this, 'action_links' ) );
107
+ add_filter( 'yith_show_plugin_row_meta', array( $this, 'plugin_row_meta' ), 10, 5 );
108
+
109
+ add_action( 'yith_quick_view_premium', array( $this, 'premium_tab' ) );
110
+
111
+ // YITH WCQV Loaded!
112
+ do_action( 'yith_wcqv_loaded' );
113
+
114
+ }
115
+
116
+
117
+ /**
118
+ * Add the action links to plugin admin page
119
+ *
120
+ * @since 1.0
121
+ * @author Andrea Grillo <andrea.grillo@yithemes.com>
122
+ * @param array $links An array og plugin links.
123
+ *
124
+ * @return array
125
+ * @use plugin_action_links_{$plugin_file_name}
126
+ */
127
+ public function action_links( $links ) {
128
+ $links = yith_add_action_links( $links, $this->panel_page, false );
129
+ return $links;
130
+ }
131
+
132
+ /**
133
+ * Add a panel under YITH Plugins tab
134
+ *
135
+ * @since 1.0
136
+ * @author Andrea Grillo <andrea.grillo@yithemes.com>
137
+ * @use /Yit_Plugin_Panel class
138
+ * @return void
139
+ * @see plugin-fw/lib/yit-plugin-panel.php
140
+ */
141
+ public function register_panel() {
142
+
143
+ if ( ! empty( $this->panel ) ) {
144
+ return;
145
+ }
146
+
147
+ $admin_tabs = array(
148
+ 'settings' => __( 'Settings', 'yith-woocommerce-quick-view' ),
149
+ 'premium' => __( 'Premium Version', 'yith-woocommerce-quick-view' ),
150
+ );
151
+
152
+ $args = array(
153
+ 'create_menu_page' => true,
154
+ 'parent_slug' => '',
155
+ 'page_title' => _x( 'YITH WooCommerce Quick View', 'options page title', 'yith-woocommerce-quick-view' ),
156
+ 'menu_title' => _x( 'Quick View', 'plugin menu title', 'yith-woocommerce-quick-view' ),
157
+ 'capability' => 'manage_options',
158
+ 'parent' => '',
159
+ 'parent_page' => 'yith_plugin_panel',
160
+ 'page' => $this->panel_page,
161
+ 'admin-tabs' => $admin_tabs,
162
+ 'options-path' => YITH_WCQV_DIR . '/plugin-options',
163
+ 'class' => yith_set_wrapper_class(),
164
+ 'plugin_slug' => YITH_WCQV_SLUG,
165
+ );
166
+
167
+ /* === Fixed: not updated theme === */
168
+ if ( ! class_exists( 'YIT_Plugin_Panel_WooCommerce' ) ) {
169
+ require_once 'plugin-fw/lib/yit-plugin-panel-wc.php';
170
+ }
171
+
172
+ $this->panel = new YIT_Plugin_Panel_WooCommerce( $args );
173
+ }
174
+
175
+ /**
176
+ * Premium Tab Template
177
+ *
178
+ * Load the premium tab template on admin page
179
+ *
180
+ * @since 1.0
181
+ * @author Andrea Grillo <andrea.grillo@yithemes.com>
182
+ * @return void
183
+ */
184
+ public function premium_tab() {
185
+ $premium_tab_template = YITH_WCQV_TEMPLATE_PATH . '/admin/' . $this->premium;
186
+ if ( file_exists( $premium_tab_template ) ) {
187
+ include_once $premium_tab_template;
188
+ }
189
+
190
+ }
191
+
192
+ /**
193
+ * Plugin Row Meta
194
+ *
195
+ * @since 1.0
196
+ * @author Andrea Grillo <andrea.grillo@yithemes.com>
197
+ * @use plugin_row_meta
198
+ * @param array $new_row_meta_args An array of plugin row meta.
199
+ * @param string[] $plugin_meta An array of the plugin's metadata,
200
+ * including the version, author,
201
+ * author URI, and plugin URI.
202
+ * @param string $plugin_file Path to the plugin file relative to the plugins directory.
203
+ * @param array $plugin_data An array of plugin data.
204
+ * @param string $status Status of the plugin. Defaults are 'All', 'Active',
205
+ * 'Inactive', 'Recently Activated', 'Upgrade', 'Must-Use',
206
+ * 'Drop-ins', 'Search', 'Paused'.
207
+ *
208
+ * @return array
209
+ */
210
+ public function plugin_row_meta( $new_row_meta_args, $plugin_meta, $plugin_file, $plugin_data, $status ) {
211
+ if ( defined( 'YITH_WCQV_INIT' ) && YITH_WCQV_INIT === $plugin_file ) {
212
+ $new_row_meta_args['slug'] = YITH_WCQV_SLUG;
213
+
214
+ if ( defined( 'YITH_WCQV_PREMIUM' ) ) {
215
+ $new_row_meta_args['is_premium'] = true;
216
+ }
217
+ }
218
+ return $new_row_meta_args;
219
+ }
220
+
221
+ /**
222
+ * Get the premium landing uri
223
+ *
224
+ * @since 1.0.0
225
+ * @author Andrea Grillo <andrea.grillo@yithemes.com>
226
+ * @return string The premium landing link
227
+ */
228
+ public function get_premium_landing_uri() {
229
+ return $this->premium_landing;
230
+ }
231
+
232
+ }
233
+ }
234
+ /**
235
+ * Unique access to instance of YITH_WCQV_Admin class
236
+ *
237
+ * @since 1.0.0
238
+ * @return YITH_WCQV_Admin
239
+ */
240
+ function YITH_WCQV_Admin() { // phpcs:ignore
241
+ return YITH_WCQV_Admin::get_instance();
242
+ }
includes/class.yith-wcqv-frontend.php CHANGED
@@ -1,393 +1,386 @@
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
+ * @since 1.0.0
27
+ * @var YITH_WCQV_Frontend
28
+ */
29
+ protected static $instance;
30
+
31
+ /**
32
+ * Plugin version
33
+ *
34
+ * @since 1.0.0
35
+ * @var string
36
+ */
37
+ public $version = YITH_WCQV_VERSION;
38
+
39
+ /**
40
+ * Returns single instance of the class
41
+ *
42
+ * @since 1.0.0
43
+ * @return YITH_WCQV_Frontend
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
+ add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_styles_scripts' ) );
62
+
63
+ // Enqueue gift card script.
64
+ if ( defined( 'YITH_YWGC_FILE' ) ) {
65
+ add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_gift_card_script' ) );
66
+ }
67
+
68
+ // Quick view AJAX.
69
+ add_action( 'wp_ajax_yith_load_product_quick_view', array( $this, 'yith_load_product_quick_view_ajax' ) );
70
+ add_action( 'wp_ajax_nopriv_yith_load_product_quick_view', array( $this, 'yith_load_product_quick_view_ajax' ) );
71
+
72
+ add_action( 'woocommerce_after_shop_loop_item', array( $this, 'yith_add_quick_view_button' ), 15 );
73
+ add_action( 'yith_wcwl_table_after_product_name', array( $this, 'yith_add_quick_view_button' ), 15, 0 );
74
+
75
+ // Load modal template.
76
+ add_action( 'wp_footer', array( $this, 'yith_quick_view' ) );
77
+
78
+ // Load action for product template.
79
+ $this->yith_quick_view_action_template();
80
+
81
+ add_shortcode( 'yith_quick_view', array( $this, 'quick_view_shortcode' ) );
82
+ add_filter( 'woocommerce_add_to_cart_form_action', array( $this, 'avoid_redirect_to_single_page' ), 10, 1 );
83
+ }
84
+
85
+ /**
86
+ * Enqueue styles and scripts
87
+ *
88
+ * @access public
89
+ * @since 1.0.0
90
+ * @author Francesco Licandro <francesco.licandro@yithemes.com>
91
+ * @return void
92
+ */
93
+ public function enqueue_styles_scripts() {
94
+
95
+ $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
96
+
97
+ wp_register_script( 'yith-wcqv-frontend', YITH_WCQV_ASSETS_URL . '/js/frontend' . $suffix . '.js', array( 'jquery' ), $this->version, true );
98
+ wp_enqueue_script( 'yith-wcqv-frontend' );
99
+ wp_enqueue_style( 'yith-quick-view', YITH_WCQV_ASSETS_URL . '/css/yith-quick-view.css', array(), $this->version );
100
+
101
+ $background_modal = get_option( 'yith-wcqv-background-modal', '#ffffff' );
102
+ $close_color = get_option( 'yith-wcqv-close-color', '#cdcdcd' );
103
+ $close_color_hover = get_option( 'yith-wcqv-close-color-hover', '#ff0000' );
104
+
105
+ $inline_style = "
106
+ #yith-quick-view-modal .yith-wcqv-main{background:{$background_modal};}
107
+ #yith-quick-view-close{color:{$close_color};}
108
+ #yith-quick-view-close:hover{color:{$close_color_hover};}";
109
+
110
+ wp_add_inline_style( 'yith-quick-view', $inline_style );
111
+ }
112
+
113
+
114
+ /**
115
+ * Enqueue scripts for YITH WooCommerce Gift Cards
116
+ *
117
+ * @access public
118
+ * @since 1.0.0
119
+ * @author Francesco Licandro <francesco.licandro@yithemes.com>
120
+ * @return void
121
+ */
122
+ public function enqueue_gift_card_script() {
123
+ if ( ! wp_script_is( 'ywgc-frontend' ) && apply_filters( 'yith_load_gift_card_script_pages_for_quick_view', is_shop() ) && version_compare( YITH_YWGC_VERSION, '3.0.0', '<' ) ) {
124
+ wp_register_script( 'ywgc-frontend', YITH_YWGC_URL . 'assets/js/' . yit_load_js_file( 'ywgc-frontend.js' ), array( 'jquery', 'woocommerce' ), YITH_YWGC_VERSION, true );
125
+ wp_enqueue_script( 'ywgc-frontend' );
126
+ } elseif ( ! wp_script_is( 'ywgc-frontend' ) && apply_filters( 'yith_load_gift_card_script_pages_for_quick_view', is_shop() ) ) {
127
+ wp_register_script( 'ywgc-frontend', YITH_YWGC_URL . 'assets/js/' . yit_load_js_file( 'ywgc-frontend.js' ), array( 'jquery', 'woocommerce', 'jquery-ui-datepicker', 'accounting' ), YITH_YWGC_VERSION, true );
128
+
129
+ wp_localize_script(
130
+ 'ywgc-frontend',
131
+ 'ywgc_data',
132
+ array(
133
+ 'loader' => apply_filters( 'yith_gift_cards_loader', YITH_YWGC_ASSETS_URL . '/images/loading.gif' ),
134
+ 'ajax_url' => admin_url( 'admin-ajax.php' ),
135
+ 'wc_ajax_url' => WC_AJAX::get_endpoint( '%%endpoint%%' ),
136
+ 'notice_target' => apply_filters( 'yith_ywgc_gift_card_notice_target', 'div.woocommerce' ),
137
+ )
138
+ );
139
+
140
+ wp_enqueue_script( 'ywgc-frontend' );
141
+ }
142
+ }
143
+
144
+ /**
145
+ * Add quick view button in wc product loop
146
+ *
147
+ * @access public
148
+ * @since 1.0.0
149
+ * @author Francesco Licandro <francesco.licandro@yithemes.com>
150
+ * @param integer|string $product_id The product id.
151
+ * @param string $label The button label.
152
+ * @param boolean $return True to return, false to echo.
153
+ * @return string|void
154
+ */
155
+ public function yith_add_quick_view_button( $product_id = 0, $label = '', $return = false ) {
156
+
157
+ global $product;
158
+
159
+ if ( ! $product_id && $product instanceof WC_Product ) {
160
+ $product_id = $product->get_id();
161
+ }
162
+
163
+ if ( ! apply_filters( 'yith_wcqv_show_quick_view_button', true, $product_id ) ) {
164
+ return;
165
+ }
166
+
167
+ $button = '';
168
+ if ( $product_id ) {
169
+ if ( ! $label ) {
170
+ $label = $this->get_button_label();
171
+ }
172
+
173
+ $button = '<a href="#" class="button yith-wcqv-button" data-product_id="' . esc_attr( $product_id ) . '">' . $label . '</a>';
174
+ $button = apply_filters( 'yith_add_quick_view_button_html', $button, $label, $product );
175
+ }
176
+
177
+ if ( $return ) {
178
+ return $button;
179
+ }
180
+
181
+ echo $button; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
182
+ }
183
+
184
+ /**
185
+ * Enqueue scripts and pass variable to js used in quick view
186
+ *
187
+ * @access public
188
+ * @since 1.0.0
189
+ * @author Francesco Licandro <francesco.licandro@yithemes.com>
190
+ * @return bool
191
+ */
192
+ public function yith_woocommerce_quick_view() {
193
+
194
+ wp_enqueue_script( 'wc-add-to-cart-variation' );
195
+ if ( version_compare( WC()->version, '3.0.0', '>=' ) ) {
196
+ if ( current_theme_supports( 'wc-product-gallery-zoom' ) ) {
197
+ wp_enqueue_script( 'zoom' );
198
+ }
199
+ if ( current_theme_supports( 'wc-product-gallery-lightbox' ) ) {
200
+ wp_enqueue_script( 'photoswipe-ui-default' );
201
+ wp_enqueue_style( 'photoswipe-default-skin' );
202
+ if ( has_action( 'wp_footer', 'woocommerce_photoswipe' ) === false ) {
203
+ add_action( 'wp_footer', 'woocommerce_photoswipe', 15 );
204
+ }
205
+ }
206
+ wp_enqueue_script( 'wc-single-product' );
207
+ }
208
+
209
+ // Enqueue WC Color and Label Variations style and script.
210
+ wp_enqueue_script( 'yith_wccl_frontend' );
211
+ wp_enqueue_style( 'yith_wccl_frontend' );
212
+
213
+ // Allow user to load custom style and scripts!
214
+ do_action( 'yith_quick_view_custom_style_scripts' );
215
+
216
+ wp_localize_script(
217
+ 'yith-wcqv-frontend',
218
+ 'yith_qv',
219
+ array(
220
+ 'ajaxurl' => admin_url( 'admin-ajax.php', 'relative' ),
221
+ 'loader' => apply_filters( 'yith_quick_view_loader_gif', YITH_WCQV_ASSETS_URL . '/image/qv-loader.gif' ),
222
+ 'lang' => defined( 'ICL_LANGUAGE_CODE' ) ? ICL_LANGUAGE_CODE : '',
223
+ )
224
+ );
225
+
226
+ return true;
227
+ }
228
+
229
+ /**
230
+ * Ajax action to load product in quick view
231
+ *
232
+ * @access public
233
+ * @since 1.0.0
234
+ * @author Francesco Licandro <francesco.licandro@yithemes.com>
235
+ * @return void
236
+ */
237
+ public function yith_load_product_quick_view_ajax() {
238
+ // phpcs:disable WordPress.Security.NonceVerification.Recommended
239
+ if ( ! isset( $_REQUEST['product_id'] ) ) {
240
+ die();
241
+ }
242
+
243
+ global $sitepress;
244
+
245
+ $product_id = intval( $_REQUEST['product_id'] );
246
+
247
+ /**
248
+ * WPML Suppot: Localize Ajax Call
249
+ */
250
+ $lang = isset( $_REQUEST['lang'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['lang'] ) ) : '';
251
+ if ( defined( 'ICL_LANGUAGE_CODE' ) && $lang && isset( $sitepress ) ) {
252
+ $sitepress->switch_lang( $lang, true );
253
+ }
254
+
255
+ // Set the main wp query for the product.
256
+ wp( 'p=' . $product_id . '&post_type=product' );
257
+
258
+ // Remove product thumbnails gallery.
259
+ remove_action( 'woocommerce_product_thumbnails', 'woocommerce_show_product_thumbnails', 20 );
260
+
261
+ // Change template for variable products.
262
+ if ( isset( $GLOBALS['yith_wccl'] ) ) {
263
+ $GLOBALS['yith_wccl']->obj = new YITH_WCCL_Frontend();
264
+ $GLOBALS['yith_wccl']->obj->override();
265
+ }
266
+
267
+ ob_start();
268
+ wc_get_template( 'yith-quick-view-content.php', array(), '', YITH_WCQV_DIR . 'templates/' );
269
+ echo ob_get_clean(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
270
+
271
+ die();
272
+ // phpcs:enable WordPress.Security.NonceVerification.Recommended
273
+ }
274
+
275
+ /**
276
+ * Load quick view template
277
+ *
278
+ * @access public
279
+ * @since 1.0.0
280
+ * @author Francesco Licandro <francesco.licandro@yithemes.com>
281
+ * @return void
282
+ */
283
+ public function yith_quick_view() {
284
+ $this->yith_woocommerce_quick_view();
285
+ wc_get_template( 'yith-quick-view.php', array(), '', YITH_WCQV_DIR . 'templates/' );
286
+ }
287
+
288
+ /**
289
+ * Load wc action for quick view product template
290
+ *
291
+ * @access public
292
+ * @since 1.0.0
293
+ * @author Francesco Licandro <francesco.licandro@yithemes.com>
294
+ * @return void
295
+ */
296
+ public function yith_quick_view_action_template() {
297
+
298
+ // Image.
299
+ add_action( 'yith_wcqv_product_image', 'woocommerce_show_product_sale_flash', 10 );
300
+ add_action( 'yith_wcqv_product_image', 'woocommerce_show_product_images', 20 );
301
+
302
+ // Summary.
303
+ add_action( 'yith_wcqv_product_summary', 'woocommerce_template_single_title', 5 );
304
+ add_action( 'yith_wcqv_product_summary', 'woocommerce_template_single_rating', 10 );
305
+ add_action( 'yith_wcqv_product_summary', 'woocommerce_template_single_price', 15 );
306
+ add_action( 'yith_wcqv_product_summary', 'woocommerce_template_single_excerpt', 20 );
307
+ add_action( 'yith_wcqv_product_summary', 'woocommerce_template_single_add_to_cart', 25 );
308
+ add_action( 'yith_wcqv_product_summary', 'woocommerce_template_single_meta', 30 );
309
+ }
310
+
311
+ /**
312
+ * Get Quick View button label
313
+ *
314
+ * @since 1.2.0
315
+ * @author Francesco Licandro
316
+ * @return string
317
+ */
318
+ public function get_button_label() {
319
+ $label = get_option( 'yith-wcqv-button-label' );
320
+ $label = call_user_func( '__', $label, 'yith-woocommerce-quick-view' );
321
+
322
+ return apply_filters( 'yith_wcqv_button_label', esc_html( $label ) );
323
+ }
324
+
325
+ /**
326
+ * Quick View shortcode button
327
+ *
328
+ * @access public
329
+ * @since 1.0.7
330
+ * @author Francesco Licandro
331
+ * @param array $atts An array of shortcode attributes.
332
+ * @return string
333
+ */
334
+ public function quick_view_shortcode( $atts ) {
335
+
336
+ $atts = shortcode_atts(
337
+ array(
338
+ 'product_id' => 0,
339
+ 'label' => '',
340
+ ),
341
+ $atts
342
+ );
343
+
344
+ extract( $atts );
345
+
346
+ return $this->yith_add_quick_view_button( intval( $product_id ), $label, true );
347
+ }
348
+
349
+ /**
350
+ * Check if is quick view
351
+ *
352
+ * @access public
353
+ * @since 1.3.1
354
+ * @author Francesco Licandro <francesco.licandro@yithemes.com>
355
+ * @return bool
356
+ */
357
+ public function yith_is_quick_view() {
358
+ // phpcs:ignore WordPress.Security.NonceVerification.Recommended
359
+ return ( defined( 'DOING_AJAX' ) && DOING_AJAX && isset( $_REQUEST['action'] ) && 'yith_load_product_quick_view' === $_REQUEST['action'] );
360
+ }
361
+
362
+ /**
363
+ * Avoid redirect to single product page on add to cart action in quick view
364
+ *
365
+ * @since 1.3.1
366
+ * @author Francesco Licandro
367
+ * @param string $value The redirect url value.
368
+ * @return string
369
+ */
370
+ public function avoid_redirect_to_single_page( $value ) {
371
+ if ( $this->yith_is_quick_view() ) {
372
+ return '';
373
+ }
374
+ return $value;
375
+ }
376
+ }
377
+ }
378
+ /**
379
+ * Unique access to instance of YITH_WCQV_Frontend class
380
+ *
381
+ * @since 1.0.0
382
+ * @return YITH_WCQV_Frontend
383
+ */
384
+ function YITH_WCQV_Frontend() { // phpcs:ignore
385
+ return YITH_WCQV_Frontend::get_instance();
386
+ }
 
 
 
 
 
 
 
includes/class.yith-wcqv.php CHANGED
@@ -1,157 +1,166 @@
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
+ if ( ! defined( 'YITH_WCQV' ) ) {
11
+ exit;
12
+ } // Exit if accessed directly.
13
+
14
+ if ( ! class_exists( 'YITH_WCQV' ) ) {
15
+ /**
16
+ * YITH WooCommerce Quick View
17
+ *
18
+ * @since 1.0.0
19
+ */
20
+ class YITH_WCQV {
21
+
22
+ /**
23
+ * Single instance of the class
24
+ *
25
+ * @since 1.0.0
26
+ * @var YITH_WCQV
27
+ */
28
+ protected static $instance;
29
+
30
+ /**
31
+ * Plugin version
32
+ *
33
+ * @since 1.0.0
34
+ * @var string
35
+ */
36
+ public $version = YITH_WCQV_VERSION;
37
+
38
+ /**
39
+ * Plugin object
40
+ *
41
+ * @since 1.0.0
42
+ * @var string
43
+ */
44
+ public $obj = null;
45
+
46
+ /**
47
+ * Returns single instance of the class
48
+ *
49
+ * @since 1.0.0
50
+ * @return YITH_WCQV
51
+ */
52
+ public static function get_instance() {
53
+ if ( is_null( self::$instance ) ) {
54
+ self::$instance = new self();
55
+ }
56
+
57
+ return self::$instance;
58
+ }
59
+
60
+ /**
61
+ * Constructor
62
+ *
63
+ * @since 1.0.0
64
+ * @return void
65
+ */
66
+ public function __construct() {
67
+
68
+ // Load Plugin Framework.
69
+ add_action( 'after_setup_theme', array( $this, 'plugin_fw_loader' ), 1 );
70
+
71
+ if ( $this->can_load() ) {
72
+ if ( $this->is_admin() ) {
73
+ require_once 'class.yith-wcqv-admin.php';
74
+ YITH_WCQV_Admin();
75
+ }
76
+ if ( $this->load_frontend() ) {
77
+ require_once 'class.yith-wcqv-frontend.php';
78
+ YITH_WCQV_Frontend();
79
+ }
80
+ }
81
+ }
82
+
83
+ /**
84
+ * Check if the plugin can load. Exit if is WooCommerce AJAX.
85
+ *
86
+ * @since 1.5
87
+ * @author Francesco Licandro
88
+ * @return boolean
89
+ */
90
+ public function can_load() {
91
+ $action = array(
92
+ 'woocommerce_get_refreshed_fragments',
93
+ 'woocommerce_apply_coupon',
94
+ 'woocommerce_remove_coupon',
95
+ 'woocommerce_update_shipping_method',
96
+ 'woocommerce_update_order_review',
97
+ 'woocommerce_add_to_cart',
98
+ 'woocommerce_checkout',
99
+ );
100
+
101
+ // phpcs:ignore WordPress.Security.NonceVerification.Recommended
102
+ if ( defined( 'DOING_AJAX' ) && DOING_AJAX && isset( $_REQUEST['action'] ) && in_array( $_REQUEST['action'], $action, true ) ) {
103
+ return false;
104
+ }
105
+
106
+ return true;
107
+ }
108
+
109
+ /**
110
+ * Check if context is admin
111
+ *
112
+ * @since 1.2.0
113
+ * @author Francesco Licandro
114
+ * @return boolean
115
+ */
116
+ public function is_admin() {
117
+ // phpcs:ignore WordPress.Security.NonceVerification.Recommended
118
+ $is_ajax = ( defined( 'DOING_AJAX' ) && DOING_AJAX && isset( $_REQUEST['context'] ) && 'frontend' === $_REQUEST['context'] );
119
+ return apply_filters( 'yith_wcqv_is_admin', is_admin() && ! $is_ajax );
120
+ }
121
+
122
+ /**
123
+ * Check if load or not frontend
124
+ *
125
+ * @since 1.2.0
126
+ * @author Francesco Licandro
127
+ * @return boolean
128
+ */
129
+ public function load_frontend() {
130
+ $enable = get_option( 'yith-wcqv-enable', 'yes' ) === 'yes';
131
+ $enable_on_mobile = get_option( 'yith-wcqv-enable-mobile', 'yes' ) === 'yes';
132
+ $is_mobile = wp_is_mobile();
133
+
134
+ return apply_filters( 'yith_wcqv_load_frontend', ( ! $is_mobile && $enable ) || ( $is_mobile && $enable_on_mobile ) );
135
+ }
136
+
137
+
138
+ /**
139
+ * Load Plugin Framework
140
+ *
141
+ * @since 1.0
142
+ * @access public
143
+ * @author Andrea Grillo <andrea.grillo@yithemes.com>
144
+ * @return void
145
+ */
146
+ public function plugin_fw_loader() {
147
+ if ( ! defined( 'YIT_CORE_PLUGIN' ) ) {
148
+ global $plugin_fw_data;
149
+ if ( ! empty( $plugin_fw_data ) ) {
150
+ $plugin_fw_file = array_shift( $plugin_fw_data );
151
+ require_once $plugin_fw_file;
152
+ }
153
+ }
154
+ }
155
+ }
156
+ }
157
+
158
+ /**
159
+ * Unique access to instance of YITH_WCQV class
160
+ *
161
+ * @since 1.0.0
162
+ * @return YITH_WCQV
163
+ */
164
+ function YITH_WCQV() { // phpcs:ignore
165
+ return YITH_WCQV::get_instance();
166
+ }
init.php CHANGED
@@ -1,135 +1,133 @@
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.18
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.7
12
- * WC tested up to: 3.9
13
- *
14
- * @author YITH
15
- * @package YITH WooCommerce Quick View
16
- * @version 1.3.18
17
- */
18
- /* Copyright 2015-2019 - 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.18' );
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.4.0
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.7
12
+ * WC tested up to: 4.0
13
+ *
14
+ * @author YITH
15
+ * @package YITH WooCommerce Quick View
16
+ * @version 1.4.0
17
+ */
18
+ /** Copyright 2015-2020 - 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' ) ) {
35
+ exit;
36
+ } // Exit if accessed directly.
37
+
38
+ if ( ! function_exists( 'is_plugin_active' ) ) {
39
+ require_once ABSPATH . 'wp-admin/includes/plugin.php';
40
+ }
41
+
42
+ function yith_wcqv_install_woocommerce_admin_notice() {
43
+ ?>
44
+ <div class="error">
45
+ <p><?php esc_html_e( 'YITH WooCommerce Quick View is enabled but not effective. It requires WooCommerce in order to work.', 'yith-woocommerce-quick-view' ); ?></p>
46
+ </div>
47
+ <?php
48
+ }
49
+
50
+ function yith_wcqv_install_free_admin_notice() {
51
+ ?>
52
+ <div class="error">
53
+ <p><?php esc_html_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>
54
+ </div>
55
+ <?php
56
+ }
57
+
58
+ if ( ! function_exists( 'yith_plugin_registration_hook' ) ) {
59
+ require_once 'plugin-fw/yit-plugin-registration-hook.php';
60
+ }
61
+ register_activation_hook( __FILE__, 'yith_plugin_registration_hook' );
62
+
63
+
64
+ if ( ! defined( 'YITH_WCQV_VERSION' ) ) {
65
+ define( 'YITH_WCQV_VERSION', '1.4.0' );
66
+ }
67
+
68
+ if ( ! defined( 'YITH_WCQV_FREE_INIT' ) ) {
69
+ define( 'YITH_WCQV_FREE_INIT', plugin_basename( __FILE__ ) );
70
+ }
71
+
72
+ if ( ! defined( 'YITH_WCQV_INIT' ) ) {
73
+ define( 'YITH_WCQV_INIT', plugin_basename( __FILE__ ) );
74
+ }
75
+
76
+ if ( ! defined( 'YITH_WCQV' ) ) {
77
+ define( 'YITH_WCQV', true );
78
+ }
79
+
80
+ if ( ! defined( 'YITH_WCQV_FILE' ) ) {
81
+ define( 'YITH_WCQV_FILE', __FILE__ );
82
+ }
83
+
84
+ if ( ! defined( 'YITH_WCQV_URL' ) ) {
85
+ define( 'YITH_WCQV_URL', plugin_dir_url( __FILE__ ) );
86
+ }
87
+
88
+ if ( ! defined( 'YITH_WCQV_DIR' ) ) {
89
+ define( 'YITH_WCQV_DIR', plugin_dir_path( __FILE__ ) );
90
+ }
91
+
92
+ if ( ! defined( 'YITH_WCQV_TEMPLATE_PATH' ) ) {
93
+ define( 'YITH_WCQV_TEMPLATE_PATH', YITH_WCQV_DIR . 'templates' );
94
+ }
95
+
96
+ if ( ! defined( 'YITH_WCQV_ASSETS_URL' ) ) {
97
+ define( 'YITH_WCQV_ASSETS_URL', YITH_WCQV_URL . 'assets' );
98
+ }
99
+
100
+ if ( ! defined( 'YITH_WCQV_SLUG' ) ) {
101
+ define( 'YITH_WCQV_SLUG', 'yith-woocommerce-quick-view' );
102
+ }
103
+
104
+ /* Plugin Framework Version Check */
105
+ if ( ! function_exists( 'yit_maybe_plugin_fw_loader' ) && file_exists( YITH_WCQV_DIR . 'plugin-fw/init.php' ) ) {
106
+ require_once YITH_WCQV_DIR . 'plugin-fw/init.php';
107
+ }
108
+ yit_maybe_plugin_fw_loader( YITH_WCQV_DIR );
109
+
110
+ function yith_wcqv_init() {
111
+
112
+ load_plugin_textdomain( 'yith-woocommerce-quick-view', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' );
113
+ // Load required classes and functions.
114
+ require_once 'includes/class.yith-wcqv.php';
115
+ // Let's start the game!
116
+ YITH_WCQV();
117
+ }
118
+
119
+ add_action( 'yith_wcqv_init', 'yith_wcqv_init' );
120
+
121
+ function yith_wcqv_install() {
122
+
123
+ if ( ! function_exists( 'WC' ) ) {
124
+ add_action( 'admin_notices', 'yith_wcqv_install_woocommerce_admin_notice' );
125
+ } elseif ( defined( 'YITH_WCQV_PREMIUM' ) ) {
126
+ add_action( 'admin_notices', 'yith_wcqv_install_free_admin_notice' );
127
+ deactivate_plugins( plugin_basename( __FILE__ ) );
128
+ } else {
129
+ do_action( 'yith_wcqv_init' );
130
+ }
131
+ }
132
+
 
 
133
  add_action( 'plugins_loaded', 'yith_wcqv_install', 11 );
languages/yith-woocommerce-quick-view-it_IT.mo CHANGED
File without changes
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,752 +1,752 @@
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
- padding : 5px 20px;
107
- margin : 0 0 0 -4px;
108
- width : auto;
109
- background : transparent;
110
- }
111
-
112
- .metaboxes-tab.yith-plugin-ui .yith-add-box,
113
- .metaboxes-tab.yith-plugin-ui .yith-toggle-row {
114
- width : auto;
115
- }
116
-
117
- .metaboxes-tab .wp-picker-container label {
118
- font-weight : inherit;
119
- width : auto;
120
- float : none;
121
- line-height : inherit;
122
- margin-left : 0;
123
- }
124
-
125
- .metaboxes-tab.yith-plugin-ui .yith-plugin-fw-radio__row label {
126
- width : auto !important;
127
- display : inline-block;
128
- font-weight : normal;
129
- }
130
-
131
- .metaboxes-tab input[type="checkbox"] {
132
- vertical-align : middle
133
- }
134
-
135
- .metaboxes-tab input.button-secondary, .metaboxes-tab input.checkbox {
136
- width : auto;
137
- }
138
-
139
- .metaboxes-tab p.field-row.textarea .description {
140
- vertical-align : top;
141
- }
142
-
143
- .metaboxes-tab p.field-row.checkbox {
144
- background : none;
145
- }
146
-
147
- .metaboxes-tab .the-metabox {
148
- margin : 20px 0;
149
- margin-left : 184px;
150
- }
151
-
152
- .metaboxes-tab .the-metabox.no-label {
153
- margin : 20px 0;
154
- margin-left : 0;
155
- }
156
-
157
- .metaboxes-tab hr {
158
- height : 0px;
159
- border-top : 1px solid #dadada;
160
- width : auto;
161
- margin-left : -10px;
162
- margin-right : -10px;
163
- }
164
-
165
- .metaboxes-tab .the-metabox p {
166
- margin : 0;
167
- }
168
-
169
- .metaboxes-tab .the-metabox:last-child {
170
- border-bottom : 0px;
171
- }
172
-
173
- .metaboxes-tab .the-metabox.checkbox {
174
- background : none;
175
- }
176
-
177
- .metaboxes-tab span.description.inline {
178
- display : inline-block;
179
- line-height : 23px;
180
- width : auto;
181
- vertical-align : middle;
182
- margin : 0;
183
- }
184
-
185
- .metaboxes-tab .slider label {
186
- padding : 15px 0;
187
- }
188
-
189
- .metaboxes-tab.yith-plugin-ui ul.metaboxes-tabs {
190
- background : transparent;
191
- border-bottom : 1px solid #d8d8d8;
192
- padding : 10px 0 0 0;
193
- margin : 0 10px
194
- }
195
-
196
-
197
- .metaboxes-tab.yith-plugin-ui ul.metaboxes-tabs li {
198
- background : #fff;
199
- border-top : 1px solid #d8d8d8;
200
- border-left : 1px solid #d8d8d8;
201
- border-right : 1px solid #d8d8d8;
202
- margin : 0 0 -1px -1px;
203
- }
204
-
205
- .metaboxes-tab.yith-plugin-ui ul.metaboxes-tabs li.tabs {
206
- border-bottom : 1px solid #fff;
207
- }
208
-
209
- .metaboxes-tab.yith-plugin-ui ul.metaboxes-tabs li a {
210
- color : #336374;
211
- padding : 10px 18px;
212
- text-transform : uppercase;
213
- font-weight : 600;
214
- display : inline-block;
215
- }
216
-
217
- .metaboxes-tab.yith-plugin-ui ul.metaboxes-tabs li.tabs a {
218
- color : #2a8db0;
219
- }
220
-
221
- /* sortable table posts */
222
-
223
- #the-list.ui-sortable tr:hover {
224
- cursor : move;
225
- }
226
-
227
- .the-metabox.preview {
228
- float : none;
229
- }
230
-
231
- .metaboxes-tab .the-metabox.no-label.preview {
232
- margin-left : 184px;
233
- }
234
-
235
- .metaboxes-tab .the-metabox.no-label.preview img {
236
- box-shadow : 0 1px 8px rgba(0, 0, 0, 0.2);
237
- }
238
-
239
- /**************************************
240
- FIELDS
241
- ***************************************/
242
-
243
- .metaboxes-tab select,
244
- .metaboxes-tab input[type=text],
245
- .metaboxes-tab input[type=number],
246
- .metaboxes-tab textarea,
247
- .metaboxes-tab .yith-plugin-fw-select,
248
- .metaboxes-tab .yith-plugin-fw-slider-container,
249
- .metaboxes-tab .yith-plugin-fw-text-input,
250
- .metaboxes-tab .yith-plugin-fw-text-array-table,
251
- .metaboxes-tab .yith-plugin-fw-textarea {
252
- width : 400px;
253
- max-width : 100%;
254
- }
255
-
256
- .metaboxes-tab.yith-plugin-ui input[type=number] {
257
- width : auto;
258
- min-width : 90px;
259
- }
260
-
261
- .metaboxes-tab.yith-plugin-ui p {
262
- font-size : 14px;
263
- }
264
-
265
- .metaboxes-tab.yith-plugin-ui p.section-description {
266
-
267
- margin : 0 20px 40px 18px;
268
- }
269
-
270
- .metaboxes-tab .yith-plugin-fw-text-array-table input[type=text] {
271
- width : 100%;
272
- }
273
-
274
- .metaboxes-tab.yith-plugin-ui .yith-add-box h3 {
275
- padding : 0 0 30px 0;
276
- font-weight : 600;
277
- margin : 0;
278
- }
279
-
280
- .metaboxes-tab.yith-plugin-ui .select2-container--default .select2-selection--single {
281
- border : 0;
282
- margin : 0;
283
- }
284
-
285
- /* wp editor */
286
- .the-metabox.textarea-editor .mceIframeContainer {
287
- background : #fff;
288
- }
289
-
290
-
291
- .the-metabox.textarea-editor label {
292
- margin-top : 24px;
293
- }
294
-
295
- /* categories */
296
- .categories-panel {
297
- width : 30%;
298
- float : left;
299
- margin-right : 4px;
300
- }
301
-
302
- .categories-panel .box {
303
- height : 200px;
304
- border : 1px solid #dfdfdf;
305
- background : #fff;
306
- padding : 6px 10px;
307
- overflow : auto;
308
- }
309
-
310
- .categories-panel ul {
311
- list-style : none;
312
- margin : 0;
313
- }
314
-
315
- .categories-panel ul li {
316
- line-height : 19px;
317
- margin : 0;
318
- padding : 0;
319
- word-wrap : break-word;
320
- }
321
-
322
- .categories-panel ul li label {
323
- font-weight : normal !important;
324
- margin-left : 0 !important;
325
- }
326
-
327
- .categories-panel input.newcategory {
328
- width : 100%;
329
- margin-bottom : 3px;
330
- }
331
-
332
- /* contact form */
333
- .contactform_item {
334
- border-style : solid;
335
- border-width : 1px;
336
- line-height : 1;
337
- margin-bottom : 20px;
338
- padding : 0;
339
- background-color : #f5f5f5;
340
- background-image : -moz-linear-gradient(center top, #f9f9f9, #f5f5f5);
341
- border-color : #dfdfdf;
342
- border-radius : 3px 3px 3px 3px;
343
- box-shadow : 0 1px 0 #fff inset;
344
- min-width : 255px;
345
- position : relative;
346
- }
347
-
348
- .contactform_item .handlediv {
349
- position : relative;
350
- top : -4px;
351
- }
352
-
353
- .contactform_item h3 {
354
- min-height : 21px;
355
- margin : 13px;
356
- }
357
-
358
- .contactform_item .inside {
359
- padding : 10px !important;
360
- }
361
-
362
- .contactform_item .deps {
363
- display : none;
364
- }
365
-
366
- .contactform_item .addoptions p.option {
367
- margin : 5px 0 5px 200px
368
- }
369
-
370
- .contactform_item .addoptions p label {
371
- width : 80px !important;
372
- }
373
-
374
- .contactform_item .add-field-option {
375
- margin-bottom : 10px !important;
376
- }
377
-
378
- .remove_item {
379
- float : right;
380
- }
381
-
382
- .metabox-sortable-placeholder {
383
- border : 1px dotted #dedede;
384
- margin : 10px 0
385
- }
386
-
387
- /* features tab */
388
- .featurestab_item {
389
- border-style : solid;
390
- border-width : 1px;
391
- line-height : 1;
392
- margin-bottom : 20px;
393
- padding : 0;
394
- background-color : #f5f5f5;
395
- background-image : -moz-linear-gradient(center top, #f9f9f9, #f5f5f5);
396
- border-color : #dfdfdf;
397
- border-radius : 3px 3px 3px 3px;
398
- box-shadow : 0 1px 0 #fff inset;
399
- min-width : 255px;
400
- position : relative;
401
- }
402
-
403
- .featurestab_item .handlediv {
404
- position : relative;
405
- top : -4px;
406
- }
407
-
408
- .featurestab_item h3 {
409
- min-height : 21px
410
- }
411
-
412
- .featurestab_item .inside {
413
- padding : 10px !important;
414
- }
415
-
416
- .featurestab_item .deps {
417
- display : none;
418
- }
419
-
420
- .featurestab_item .addoptions p.option {
421
- margin : 5px 0 5px 200px
422
- }
423
-
424
- .featurestab_item .addoptions p label {
425
- width : 80px !important;
426
- }
427
-
428
- .featurestab_item .add-field-option {
429
- margin-bottom : 10px !important;
430
- }
431
-
432
- .messages-panel.updated {
433
- margin : 10px 0px 10px !important;
434
- max-width : 1200px;
435
- border-radius : 5px;
436
- -webkit-box-sizing : border-box;
437
- box-sizing : border-box;
438
- }
439
-
440
- .ui-widget-overlay {
441
- background-image : none !important;
442
- }
443
-
444
- .the-metabox .icon_type {
445
- width : 30%;
446
- float : left;
447
- margin-right : 40px
448
- }
449
-
450
- #post-type-settings .category-list label {
451
- width : 187px;
452
- }
453
-
454
- .remove_cat {
455
- float : right;
456
- text-align : center;
457
- display : block;
458
- width : 20px;
459
- height : 20px;
460
- border-radius : 20px;
461
- font-weight : bold;
462
- font-size : 10px;
463
- background : #efefef;
464
- text-decoration : none;
465
- }
466
-
467
- /* typography */
468
- .the-metabox.typography .select_wrapper.font-family {
469
- width : 200px;
470
- }
471
-
472
- .the-metabox.typography .spinner_container {
473
- float : left;
474
- margin-right : 10px;
475
- }
476
-
477
- .the-metabox.typography .spinner_container input.number {
478
- width : 50px !important;
479
- -webkit-border-top-right-radius : 0px;
480
- -webkit-border-bottom-right-radius : 0px;
481
- -moz-border-radius-topright : 0px;
482
- -moz-border-radius-bottomright : 0px;
483
- border-top-right-radius : 0px;
484
- border-bottom-right-radius : 0px;
485
- }
486
-
487
- /* number */
488
- .the-metabox.number input.number {
489
- width : 50px !important;
490
- }
491
-
492
- /* number */
493
- .rm_number .number {
494
- width : 70px;
495
- text-align : right;
496
- -webkit-border-top-right-radius : 0px;
497
- -webkit-border-bottom-right-radius : 0px;
498
- -moz-border-radius-topright : 0px;
499
- -moz-border-radius-bottomright : 0px;
500
- border-top-right-radius : 0px;
501
- border-bottom-right-radius : 0px;
502
- }
503
-
504
- .spinner-wrapper {
505
- position : relative;
506
- height : 23px;
507
- overflow : hidden;
508
- }
509
-
510
- .spinner-wrapper input.number {
511
- float : left;
512
- }
513
-
514
- .spinner-wrapper .spinner-button {
515
- cursor : pointer;
516
- float : left;
517
- position : absolute;
518
- left : 69px;
519
- width : 15px;
520
- height : 12px;
521
- border : 1px solid #dfdfdf;
522
- background : #fff;
523
- margin : 0;
524
- padding : 0;
525
- line-height : 9999px;
526
- overflow : hidden;
527
- background : url('../images/spinner.png') no-repeat center -11px
528
- }
529
-
530
- .spinner-wrapper .spinner-button.button-plus {
531
- top : 0;
532
- -webkit-border-top-right-radius : 3px !important;
533
- -moz-border-radius-topright : 3px !important;
534
- border-top-right-radius : 3px !important;
535
- }
536
-
537
- .spinner-wrapper .spinner-button.button-minus {
538
- bottom : 0;
539
- background-position : center -30px;
540
- -webkit-border-bottom-right-radius : 3px !important;
541
- -moz-border-radius-bottomright : 3px !important;
542
- border-bottom-right-radius : 3px !important;
543
- }
544
-
545
- .spinner-wrapper .spinner-button.button-plus:active {
546
- background-position : center 0px;
547
- }
548
-
549
- .spinner-wrapper .spinner-button.button-minus:active {
550
- background-position : center -20px;
551
- }
552
-
553
- .rm_typography .spinner_container {
554
- float : left;
555
- margin-right : 10px;
556
- }
557
-
558
- .rm_typography .spinner-wrapper {
559
- height : 28px;
560
- }
561
-
562
- .rm_typography .spinner-wrapper input.number {
563
- height : 28px;
564
- }
565
-
566
- .rm_typography .spinner-wrapper .spinner-button.button-plus {
567
- height : 15px;
568
- background-position : center -10px;
569
- }
570
-
571
- .rm_typography .spinner-wrapper .spinner-button.button-minus {
572
- height : 14px;
573
- }
574
-
575
- .the-metabox .spinner-wrapper .spinner-button {
576
- left : 49px;
577
- }
578
-
579
- .the-metabox.typography .spinner-wrapper .spinner-button {
580
- left : 35px;
581
- }
582
-
583
- /* images */
584
- .the-metabox.images, .the-metabox.images label {
585
- margin-left : 0;
586
- display : block;
587
- }
588
-
589
- .the-metabox.images .slides-wrapper {
590
- clear : both;
591
- }
592
-
593
- .the-metabox.images .slides-wrapper li {
594
- position : relative;
595
- }
596
-
597
- .the-metabox.images a.delete {
598
- display : block;
599
- margin-left : 4px;
600
- text-decoration : none;
601
- font-weight : bold;
602
- color : red;
603
- position : absolute;
604
- top : 0;
605
- right : 0;
606
- width : 10px;
607
- height : 18px;
608
- z-index : 10;
609
- cursor : pointer !important;
610
- }
611
-
612
- /* wp editor */
613
- .wp_themeSkin iframe {
614
- background : #fff !important;
615
- }
616
-
617
- /* custom tabs */
618
- .customtab_item {
619
- border-style : solid;
620
- border-width : 1px;
621
- line-height : 1;
622
- margin-bottom : 20px;
623
- padding : 0;
624
- background-color : #f5f5f5;
625
- background-image : -moz-linear-gradient(center top, #f9f9f9, #f5f5f5);
626
- border-color : #dfdfdf;
627
- border-radius : 3px 3px 3px 3px;
628
- box-shadow : 0 1px 0 #fff inset;
629
- min-width : 255px;
630
- position : relative;
631
- }
632
-
633
- .customtab_item .handlediv {
634
- position : relative;
635
- top : -4px;
636
- }
637
-
638
- .customtab_item h3 {
639
- min-height : 21px
640
- }
641
-
642
- .customtab_item .inside {
643
- padding : 10px !important;
644
- }
645
-
646
- .customtab_item .deps {
647
- display : none;
648
- }
649
-
650
- .customtab_item .addoptions p.option {
651
- margin : 5px 0 5px 200px
652
- }
653
-
654
- .customtab_item .addoptions p label {
655
- width : 80px !important;
656
- }
657
-
658
- .customtab_item .add-field-option {
659
- margin-bottom : 10px !important;
660
- }
661
-
662
- .customtab_item .remove_item {
663
- float : right;
664
- }
665
-
666
- .metabox-sortable-placeholder {
667
- border : 1px dotted #dedede;
668
- margin : 10px 0
669
- }
670
-
671
- .the-metabox.customtabs {
672
- margin-left : 0;
673
- }
674
-
675
- #customtab_item_sample {
676
- display : none;
677
- }
678
-
679
- .the-metabox.customtabs .field-row {
680
- margin-bottom : 10px;
681
- }
682
-
683
- #yit_custom_tabs label {
684
- font-weight : normal;
685
- width : auto;
686
- float : none;
687
- line-height : auto;
688
- margin-left : 0;
689
- }
690
-
691
- .wp-admin p label input[type=radio] {
692
- width : 16px;
693
- margin-right : 10px;
694
- margin-top : 3px;
695
- }
696
-
697
- .wp-admin .form-field._preset_onsale_icon_field label input[type=radio] {
698
- margin-top : 0;
699
- }
700
-
701
- .the-metabox .spinner {
702
- margin-top : 5px;
703
- float : none;
704
- }
705
-
706
- /*sidebars*/
707
- #choose-sidebars.choose {
708
- margin-left : 0px;
709
- }
710
-
711
- #_active_page_options-container label, #_active_page_options-container p {
712
- display : inline-block;
713
- margin : 0px;
714
- }
715
-
716
- #_active_page_options-container label {
717
- margin-right : 10px;
718
- margin-top : 3px;
719
- }
720
-
721
- #_active_page_options-container {
722
- float : right;
723
- margin-right : 20px;
724
- margin-top : 5px;
725
- z-index : 9999 !important;
726
- position : absolute;
727
- right : 0;
728
- }
729
-
730
- /*-----------------------
731
- * Colorpicker - fix issues in combination with third-party themes or plugin (Basel, VC Addons, ...)
732
- */
733
- .metaboxes-tab .the-metabox.colorpicker {
734
- display : block;
735
- width : auto;
736
- height : auto;
737
- overflow : visible;
738
- top : auto;
739
- left : auto;
740
- background : transparent;
741
- position : static;
742
- z-index : 1;
743
- font-family : inherit;
744
- }
745
-
746
- .the-metabox.checkbox.checkboxgroup-start.clearfix {
747
- margin : 40px 0 0 264px;
748
- }
749
-
750
- .the-metabox.checkbox.checkboxgroup.clearfix {
751
- margin : 0 0 0 264px;
752
  }
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
+ padding : 5px 20px;
107
+ margin : 0 0 0 -4px;
108
+ width : auto;
109
+ background : transparent;
110
+ }
111
+
112
+ .metaboxes-tab.yith-plugin-ui .yith-add-box,
113
+ .metaboxes-tab.yith-plugin-ui .yith-toggle-row {
114
+ width : auto;
115
+ }
116
+
117
+ .metaboxes-tab .wp-picker-container label {
118
+ font-weight : inherit;
119
+ width : auto;
120
+ float : none;
121
+ line-height : inherit;
122
+ margin-left : 0;
123
+ }
124
+
125
+ .metaboxes-tab.yith-plugin-ui .yith-plugin-fw-radio__row label {
126
+ width : auto !important;
127
+ display : inline-block;
128
+ font-weight : normal;
129
+ }
130
+
131
+ .metaboxes-tab input[type="checkbox"] {
132
+ vertical-align : middle
133
+ }
134
+
135
+ .metaboxes-tab input.button-secondary, .metaboxes-tab input.checkbox {
136
+ width : auto;
137
+ }
138
+
139
+ .metaboxes-tab p.field-row.textarea .description {
140
+ vertical-align : top;
141
+ }
142
+
143
+ .metaboxes-tab p.field-row.checkbox {
144
+ background : none;
145
+ }
146
+
147
+ .metaboxes-tab .the-metabox {
148
+ margin : 20px 0;
149
+ margin-left : 184px;
150
+ }
151
+
152
+ .metaboxes-tab .the-metabox.no-label {
153
+ margin : 20px 0;
154
+ margin-left : 0;
155
+ }
156
+
157
+ .metaboxes-tab hr {
158
+ height : 0px;
159
+ border-top : 1px solid #dadada;
160
+ width : auto;
161
+ margin-left : -10px;
162
+ margin-right : -10px;
163
+ }
164
+
165
+ .metaboxes-tab .the-metabox p {
166
+ margin : 0;
167
+ }
168
+
169
+ .metaboxes-tab .the-metabox:last-child {
170
+ border-bottom : 0px;
171
+ }
172
+
173
+ .metaboxes-tab .the-metabox.checkbox {
174
+ background : none;
175
+ }
176
+
177
+ .metaboxes-tab span.description.inline {
178
+ display : inline-block;
179
+ line-height : 23px;
180
+ width : auto;
181
+ vertical-align : middle;
182
+ margin : 0;
183
+ }
184
+
185
+ .metaboxes-tab .slider label {
186
+ padding : 15px 0;
187
+ }
188
+
189
+ .metaboxes-tab.yith-plugin-ui ul.metaboxes-tabs {
190
+ background : transparent;
191
+ border-bottom : 1px solid #d8d8d8;
192
+ padding : 10px 0 0 0;
193
+ margin : 0 10px
194
+ }
195
+
196
+
197
+ .metaboxes-tab.yith-plugin-ui ul.metaboxes-tabs li {
198
+ background : #fff;
199
+ border-top : 1px solid #d8d8d8;
200
+ border-left : 1px solid #d8d8d8;
201
+ border-right : 1px solid #d8d8d8;
202
+ margin : 0 0 -1px -1px;
203
+ }
204
+
205
+ .metaboxes-tab.yith-plugin-ui ul.metaboxes-tabs li.tabs {
206
+ border-bottom : 1px solid #fff;
207
+ }
208
+
209
+ .metaboxes-tab.yith-plugin-ui ul.metaboxes-tabs li a {
210
+ color : #336374;
211
+ padding : 10px 18px;
212
+ text-transform : uppercase;
213
+ font-weight : 600;
214
+ display : inline-block;
215
+ }
216
+
217
+ .metaboxes-tab.yith-plugin-ui ul.metaboxes-tabs li.tabs a {
218
+ color : #2a8db0;
219
+ }
220
+
221
+ /* sortable table posts */
222
+
223
+ #the-list.ui-sortable tr:hover {
224
+ cursor : move;
225
+ }
226
+
227
+ .the-metabox.preview {
228
+ float : none;
229
+ }
230
+
231
+ .metaboxes-tab .the-metabox.no-label.preview {
232
+ margin-left : 184px;
233
+ }
234
+
235
+ .metaboxes-tab .the-metabox.no-label.preview img {
236
+ box-shadow : 0 1px 8px rgba(0, 0, 0, 0.2);
237
+ }
238
+
239
+ /**************************************
240
+ FIELDS
241
+ ***************************************/
242
+
243
+ .metaboxes-tab select,
244
+ .metaboxes-tab input[type=text],
245
+ .metaboxes-tab input[type=number],
246
+ .metaboxes-tab textarea,
247
+ .metaboxes-tab .yith-plugin-fw-select,
248
+ .metaboxes-tab .yith-plugin-fw-slider-container,
249
+ .metaboxes-tab .yith-plugin-fw-text-input,
250
+ .metaboxes-tab .yith-plugin-fw-text-array-table,
251
+ .metaboxes-tab .yith-plugin-fw-textarea {
252
+ width : 400px;
253
+ max-width : 100%;
254
+ }
255
+
256
+ .metaboxes-tab.yith-plugin-ui input[type=number] {
257
+ width : auto;
258
+ min-width : 90px;
259
+ }
260
+
261
+ .metaboxes-tab.yith-plugin-ui p {
262
+ font-size : 14px;
263
+ }
264
+
265
+ .metaboxes-tab.yith-plugin-ui p.section-description {
266
+
267
+ margin : 0 20px 40px 18px;
268
+ }
269
+
270
+ .metaboxes-tab .yith-plugin-fw-text-array-table input[type=text] {
271
+ width : 100%;
272
+ }
273
+
274
+ .metaboxes-tab.yith-plugin-ui .yith-add-box h3 {
275
+ padding : 0 0 30px 0;
276
+ font-weight : 600;
277
+ margin : 0;
278
+ }
279
+
280
+ .metaboxes-tab.yith-plugin-ui .select2-container--default .select2-selection--single {
281
+ border : 0;
282
+ margin : 0;
283
+ }
284
+
285
+ /* wp editor */
286
+ .the-metabox.textarea-editor .mceIframeContainer {
287
+ background : #fff;
288
+ }
289
+
290
+
291
+ .the-metabox.textarea-editor label {
292
+ margin-top : 24px;
293
+ }
294
+
295
+ /* categories */
296
+ .categories-panel {
297
+ width : 30%;
298
+ float : left;
299
+ margin-right : 4px;
300
+ }
301
+
302
+ .categories-panel .box {
303
+ height : 200px;
304
+ border : 1px solid #dfdfdf;
305
+ background : #fff;
306
+ padding : 6px 10px;
307
+ overflow : auto;
308
+ }
309
+
310
+ .categories-panel ul {
311
+ list-style : none;
312
+ margin : 0;
313
+ }
314
+
315
+ .categories-panel ul li {
316
+ line-height : 19px;
317
+ margin : 0;
318
+ padding : 0;
319
+ word-wrap : break-word;
320
+ }
321
+
322
+ .categories-panel ul li label {
323
+ font-weight : normal !important;
324
+ margin-left : 0 !important;
325
+ }
326
+
327
+ .categories-panel input.newcategory {
328
+ width : 100%;
329
+ margin-bottom : 3px;
330
+ }
331
+
332
+ /* contact form */
333
+ .contactform_item {
334
+ border-style : solid;
335
+ border-width : 1px;
336
+ line-height : 1;
337
+ margin-bottom : 20px;
338
+ padding : 0;
339
+ background-color : #f5f5f5;
340
+ background-image : -moz-linear-gradient(center top, #f9f9f9, #f5f5f5);
341
+ border-color : #dfdfdf;
342
+ border-radius : 3px 3px 3px 3px;
343
+ box-shadow : 0 1px 0 #fff inset;
344
+ min-width : 255px;
345
+ position : relative;
346
+ }
347
+
348
+ .contactform_item .handlediv {
349
+ position : relative;
350
+ top : -4px;
351
+ }
352
+
353
+ .contactform_item h3 {
354
+ min-height : 21px;
355
+ margin : 13px;
356
+ }
357
+
358
+ .contactform_item .inside {
359
+ padding : 10px !important;
360
+ }
361
+
362
+ .contactform_item .deps {
363
+ display : none;
364
+ }
365
+
366
+ .contactform_item .addoptions p.option {
367
+ margin : 5px 0 5px 200px
368
+ }
369
+
370
+ .contactform_item .addoptions p label {
371
+ width : 80px !important;
372
+ }
373
+
374
+ .contactform_item .add-field-option {
375
+ margin-bottom : 10px !important;
376
+ }
377
+
378
+ .remove_item {
379
+ float : right;
380
+ }
381
+
382
+ .metabox-sortable-placeholder {
383
+ border : 1px dotted #dedede;
384
+ margin : 10px 0
385
+ }
386
+
387
+ /* features tab */
388
+ .featurestab_item {
389
+ border-style : solid;
390
+ border-width : 1px;
391
+ line-height : 1;
392
+ margin-bottom : 20px;
393
+ padding : 0;
394
+ background-color : #f5f5f5;
395
+ background-image : -moz-linear-gradient(center top, #f9f9f9, #f5f5f5);
396
+ border-color : #dfdfdf;
397
+ border-radius : 3px 3px 3px 3px;
398
+ box-shadow : 0 1px 0 #fff inset;
399
+ min-width : 255px;
400
+ position : relative;
401
+ }
402
+
403
+ .featurestab_item .handlediv {
404
+ position : relative;
405
+ top : -4px;
406
+ }
407
+
408
+ .featurestab_item h3 {
409
+ min-height : 21px
410
+ }
411
+
412
+ .featurestab_item .inside {
413
+ padding : 10px !important;
414
+ }
415
+
416
+ .featurestab_item .deps {
417
+ display : none;
418
+ }
419
+
420
+ .featurestab_item .addoptions p.option {
421
+ margin : 5px 0 5px 200px
422
+ }
423
+
424
+ .featurestab_item .addoptions p label {
425
+ width : 80px !important;
426
+ }
427
+
428
+ .featurestab_item .add-field-option {
429
+ margin-bottom : 10px !important;
430
+ }
431
+
432
+ .messages-panel.updated {
433
+ margin : 10px 0px 10px !important;
434
+ max-width : 1200px;
435
+ border-radius : 5px;
436
+ -webkit-box-sizing : border-box;
437
+ box-sizing : border-box;
438
+ }
439
+
440
+ .ui-widget-overlay {
441
+ background-image : none !important;
442
+ }
443
+
444
+ .the-metabox .icon_type {
445
+ width : 30%;
446
+ float : left;
447
+ margin-right : 40px
448
+ }
449
+
450
+ #post-type-settings .category-list label {
451
+ width : 187px;
452
+ }
453
+
454
+ .remove_cat {
455
+ float : right;
456
+ text-align : center;
457
+ display : block;
458
+ width : 20px;
459
+ height : 20px;
460
+ border-radius : 20px;
461
+ font-weight : bold;
462
+ font-size : 10px;
463
+ background : #efefef;
464
+ text-decoration : none;
465
+ }
466
+
467
+ /* typography */
468
+ .the-metabox.typography .select_wrapper.font-family {
469
+ width : 200px;
470
+ }
471
+
472
+ .the-metabox.typography .spinner_container {
473
+ float : left;
474
+ margin-right : 10px;
475
+ }
476
+
477
+ .the-metabox.typography .spinner_container input.number {
478
+ width : 50px !important;
479
+ -webkit-border-top-right-radius : 0px;
480
+ -webkit-border-bottom-right-radius : 0px;
481
+ -moz-border-radius-topright : 0px;
482
+ -moz-border-radius-bottomright : 0px;
483
+ border-top-right-radius : 0px;
484
+ border-bottom-right-radius : 0px;
485
+ }
486
+
487
+ /* number */
488
+ .the-metabox.number input.number {
489
+ width : 50px !important;
490
+ }
491
+
492
+ /* number */
493
+ .rm_number .number {
494
+ width : 70px;
495
+ text-align : right;
496
+ -webkit-border-top-right-radius : 0px;
497
+ -webkit-border-bottom-right-radius : 0px;
498
+ -moz-border-radius-topright : 0px;
499
+ -moz-border-radius-bottomright : 0px;
500
+ border-top-right-radius : 0px;
501
+ border-bottom-right-radius : 0px;
502
+ }
503
+
504
+ .spinner-wrapper {
505
+ position : relative;
506
+ height : 23px;
507
+ overflow : hidden;
508
+ }
509
+
510
+ .spinner-wrapper input.number {
511
+ float : left;
512
+ }
513
+
514
+ .spinner-wrapper .spinner-button {
515
+ cursor : pointer;
516
+ float : left;
517
+ position : absolute;
518
+ left : 69px;
519
+ width : 15px;
520
+ height : 12px;
521
+ border : 1px solid #dfdfdf;
522
+ background : #fff;
523
+ margin : 0;
524
+ padding : 0;
525
+ line-height : 9999px;
526
+ overflow : hidden;
527
+ background : url('../images/spinner.png') no-repeat center -11px
528
+ }
529
+
530
+ .spinner-wrapper .spinner-button.button-plus {
531
+ top : 0;
532
+ -webkit-border-top-right-radius : 3px !important;
533
+ -moz-border-radius-topright : 3px !important;
534
+ border-top-right-radius : 3px !important;
535
+ }
536
+
537
+ .spinner-wrapper .spinner-button.button-minus {
538
+ bottom : 0;
539
+ background-position : center -30px;
540
+ -webkit-border-bottom-right-radius : 3px !important;
541
+ -moz-border-radius-bottomright : 3px !important;
542
+ border-bottom-right-radius : 3px !important;
543
+ }
544
+
545
+ .spinner-wrapper .spinner-button.button-plus:active {
546
+ background-position : center 0px;
547
+ }
548
+
549
+ .spinner-wrapper .spinner-button.button-minus:active {
550
+ background-position : center -20px;
551
+ }
552
+
553
+ .rm_typography .spinner_container {
554
+ float : left;
555
+ margin-right : 10px;
556
+ }
557
+
558
+ .rm_typography .spinner-wrapper {
559
+ height : 28px;
560
+ }
561
+
562
+ .rm_typography .spinner-wrapper input.number {
563
+ height : 28px;
564
+ }
565
+
566
+ .rm_typography .spinner-wrapper .spinner-button.button-plus {
567
+ height : 15px;
568
+ background-position : center -10px;
569
+ }
570
+
571
+ .rm_typography .spinner-wrapper .spinner-button.button-minus {
572
+ height : 14px;
573
+ }
574
+
575
+ .the-metabox .spinner-wrapper .spinner-button {
576
+ left : 49px;
577
+ }
578
+
579
+ .the-metabox.typography .spinner-wrapper .spinner-button {
580
+ left : 35px;
581
+ }
582
+
583
+ /* images */
584
+ .the-metabox.images, .the-metabox.images label {
585
+ margin-left : 0;
586
+ display : block;
587
+ }
588
+
589
+ .the-metabox.images .slides-wrapper {
590
+ clear : both;
591
+ }
592
+
593
+ .the-metabox.images .slides-wrapper li {
594
+ position : relative;
595
+ }
596
+
597
+ .the-metabox.images a.delete {
598
+ display : block;
599
+ margin-left : 4px;
600
+ text-decoration : none;
601
+ font-weight : bold;
602
+ color : red;
603
+ position : absolute;
604
+ top : 0;
605
+ right : 0;
606
+ width : 10px;
607
+ height : 18px;
608
+ z-index : 10;
609
+ cursor : pointer !important;
610
+ }
611
+
612
+ /* wp editor */
613
+ .wp_themeSkin iframe {
614
+ background : #fff !important;
615
+ }
616
+
617
+ /* custom tabs */
618
+ .customtab_item {
619
+ border-style : solid;
620
+ border-width : 1px;
621
+ line-height : 1;
622
+ margin-bottom : 20px;
623
+ padding : 0;
624
+ background-color : #f5f5f5;
625
+ background-image : -moz-linear-gradient(center top, #f9f9f9, #f5f5f5);
626
+ border-color : #dfdfdf;
627
+ border-radius : 3px 3px 3px 3px;
628
+ box-shadow : 0 1px 0 #fff inset;
629
+ min-width : 255px;
630
+ position : relative;
631
+ }
632
+
633
+ .customtab_item .handlediv {
634
+ position : relative;
635
+ top : -4px;
636
+ }
637
+
638
+ .customtab_item h3 {
639
+ min-height : 21px
640
+ }
641
+
642
+ .customtab_item .inside {
643
+ padding : 10px !important;
644
+ }
645
+
646
+ .customtab_item .deps {
647
+ display : none;
648
+ }
649
+
650
+ .customtab_item .addoptions p.option {
651
+ margin : 5px 0 5px 200px
652
+ }
653
+
654
+ .customtab_item .addoptions p label {
655
+ width : 80px !important;
656
+ }
657
+
658
+ .customtab_item .add-field-option {
659
+ margin-bottom : 10px !important;
660
+ }
661
+
662
+ .customtab_item .remove_item {
663
+ float : right;
664
+ }
665
+
666
+ .metabox-sortable-placeholder {
667
+ border : 1px dotted #dedede;
668
+ margin : 10px 0
669
+ }
670
+
671
+ .the-metabox.customtabs {
672
+ margin-left : 0;
673
+ }
674
+
675
+ #customtab_item_sample {
676
+ display : none;
677
+ }
678
+
679
+ .the-metabox.customtabs .field-row {
680
+ margin-bottom : 10px;
681
+ }
682
+
683
+ #yit_custom_tabs label {
684
+ font-weight : normal;
685
+ width : auto;
686
+ float : none;
687
+ line-height : auto;
688
+ margin-left : 0;
689
+ }
690
+
691
+ .wp-admin p label input[type=radio] {
692
+ width : 16px;
693
+ margin-right : 10px;
694
+ margin-top : 3px;
695
+ }
696
+
697
+ .wp-admin .form-field._preset_onsale_icon_field label input[type=radio] {
698
+ margin-top : 0;
699
+ }
700
+
701
+ .the-metabox .spinner {
702
+ margin-top : 5px;
703
+ float : none;
704
+ }
705
+
706
+ /*sidebars*/
707
+ #choose-sidebars.choose {
708
+ margin-left : 0px;
709
+ }
710
+
711
+ #_active_page_options-container label, #_active_page_options-container p {
712
+ display : inline-block;
713
+ margin : 0px;
714
+ }
715
+
716
+ #_active_page_options-container label {
717
+ margin-right : 10px;
718
+ margin-top : 3px;
719
+ }
720
+
721
+ #_active_page_options-container {
722
+ float : right;
723
+ margin-right : 20px;
724
+ margin-top : 5px;
725
+ z-index : 9999 !important;
726
+ position : absolute;
727
+ right : 0;
728
+ }
729
+
730
+ /*-----------------------
731
+ * Colorpicker - fix issues in combination with third-party themes or plugin (Basel, VC Addons, ...)
732
+ */
733
+ .metaboxes-tab .the-metabox.colorpicker {
734
+ display : block;
735
+ width : auto;
736
+ height : auto;
737
+ overflow : visible;
738
+ top : auto;
739
+ left : auto;
740
+ background : transparent;
741
+ position : static;
742
+ z-index : 1;
743
+ font-family : inherit;
744
+ }
745
+
746
+ .the-metabox.checkbox.checkboxgroup-start.clearfix {
747
+ margin : 40px 0 0 264px;
748
+ }
749
+
750
+ .the-metabox.checkbox.checkboxgroup.clearfix {
751
+ margin : 0 0 0 264px;
752
  }
plugin-fw/assets/css/yit-plugin-panel.css CHANGED
@@ -1,631 +1,631 @@
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, .yith-plugin-fw-panel-custom-tab-container {
39
- background-color : #fff;
40
- margin-bottom : 20px;
41
- }
42
-
43
- .yith-plugin-fw-panel-custom-tab-container {
44
- padding : 20px;
45
- box-sizing : border-box;
46
- margin-right : 15px;
47
- }
48
-
49
- .yith-plugin-fw-panel-custom-tab-container > h2 {
50
- border : none;
51
- padding : 15px 0;
52
- }
53
-
54
- #plugin-fw-wc table.form-table th, #yith-plugin-fw-panel table.form-table th {
55
- padding : 20px;
56
- }
57
-
58
- #plugin-fw-wc h3, #yith-plugin-fw-panel h3 {
59
- padding : 0 0 0 10px;
60
- margin : 0;
61
- }
62
-
63
-
64
- /**
65
- Post type Edit
66
- */
67
-
68
- .yith-plugin-fw-wp-page-wrapper {
69
- margin : 23px 20px 0 2px;
70
- }
71
-
72
- .yith-plugin-fw-wp-page-wrapper .notice,
73
- .yith-plugin-fw-wp-page-wrapper div.updated,
74
- .yith-plugin-fw-wp-page-wrapper div.error {
75
- margin : 5px 15px 15px 0;
76
- }
77
-
78
- .yith-plugin-fw-wp-page-wrapper .wrap {
79
- border : 1px solid #d8d8d8;
80
- border-top : 0;
81
- margin : 0 15px 0 0;
82
- background : #fff;
83
- padding : 20px;
84
- box-sizing : border-box;
85
- }
86
-
87
- #wpwrap .yith-plugin-fw-wp-page-wrapper .yith-plugin-ui h2.nav-tab-wrapper, #wpbody-content .yith-plugin-fw-wp-page-wrapper .yith-plugin-ui h2.nav-tab-wrapper {
88
- padding-bottom : 0;
89
- }
90
-
91
- .yith-plugin-fw-wp-page-wrapper .postbox {
92
- box-shadow : none;
93
- }
94
-
95
- .yith-plugin-fw-wp-page-wrapper h1.nav-tab-wrapper, .yith-plugin-fw-wp-page-wrapper h2.nav-tab-wrapper, .yith-plugin-fw-wp-page-wrapper .nav-tab-wrapper {
96
- padding-top : 9px;
97
- padding-bottom : 0;
98
- }
99
-
100
- .yith-plugin-fw-wp-page-wrapper .wrap h1.wp-heading-inline {
101
- color : #2a8db0;
102
- font-size : 15px;
103
- text-transform : uppercase;
104
- font-weight : 600;
105
- }
106
-
107
- .yith-plugin-fw-wp-page-wrapper .wrap a.page-title-action,
108
- .yith-plugin-fw-wp-page-wrapper .wrap a.page-title-action:active {
109
- border-radius : 3px;
110
- text-transform : uppercase;
111
- box-shadow : none;
112
- border : 0;
113
- font-weight : 700;
114
- font-size : 11px;
115
- padding : 0 14px;
116
- outline : none;
117
- height : auto;
118
- transition : all ease 0.3s;
119
- text-shadow : none;
120
- vertical-align : middle;
121
- line-height : 26px;
122
- display : inline-block;
123
- text-decoration : none;
124
- cursor : pointer;
125
- background-color : #375f6b;
126
- color : #fff;
127
- margin-left: 10px !important;
128
- }
129
-
130
- .yith-plugin-fw-wp-page-wrapper .wrap a.page-title-action:hover {
131
- border-color : #007694;
132
- background : #007694;
133
- color : #fff;
134
- }
135
-
136
- .yith-plugin-fw-wp-page-wrapper #wp-content-editor-tools {
137
- background : transparent;
138
- }
139
-
140
- /* === Plugins Upgrader === */
141
-
142
- .yit-plugin-changelog-wrapper {
143
- display : none;
144
- }
145
-
146
- .yit-plugin-changelog-title {
147
- text-transform : uppercase;
148
- }
149
-
150
- .yit-plugin-changelog {
151
- height : calc(100% - 15px);
152
- width : calc(100% - 15px);
153
- overflow-x : hidden;
154
- overflow-y : auto;
155
- z-index : 999;
156
- background : #fcfcfc;
157
- }
158
-
159
- /* === Plugins Licence Activation === */
160
-
161
- .yit-container.plugin-licence-activation {
162
- font-family : 'Raleway', sans-serif;
163
- }
164
-
165
- .yit-container.plugin-licence-activation .to-active-wrapper {
166
- margin-bottom : 60px;
167
- }
168
-
169
- .yit-container.plugin-licence-activation .to-active-wrapper form.to-active-form {
170
- position : relative;
171
- border-color : #e1e1e1;
172
- border-style : solid;
173
- border-width : 0;
174
- }
175
-
176
- .yit-container.plugin-licence-activation .to-active-wrapper form.to-active-form:first-child {
177
- border-top-width : 1px;
178
- }
179
-
180
- .yit-container.plugin-licence-activation .to-active-wrapper form.to-active-form:last-child {
181
- border-bottom-width : 1px;
182
- }
183
-
184
- .yit-container.plugin-licence-activation .to-active-wrapper table.to-active-table {
185
- border-width : 0;
186
- border-spacing : 0;
187
- width : 100%;
188
- }
189
-
190
- .yit-container.plugin-licence-activation .message {
191
- display : none;
192
- line-height : normal;
193
- background : #fff url(../images/licence-error.png) 15px center no-repeat;
194
- padding-left : 65px;
195
- padding-right : 15px;
196
- width : 150px;
197
- }
198
-
199
- .yit-container.plugin-licence-activation .message-wrapper {
200
- height : 75px;
201
- display : none;
202
- position : absolute;
203
- top : 0;
204
- right : -250px;
205
- border : 1px solid #ff3838;
206
- }
207
-
208
- .yit-container.plugin-licence-activation .message-wrapper.visible {
209
- display : table;
210
- }
211
-
212
- .yit-container.plugin-licence-activation .message {
213
- display : table-cell;
214
- vertical-align : middle;
215
- }
216
-
217
- .yit-container.plugin-licence-activation .arrow-left:after,
218
- .yit-container.plugin-licence-activation .arrow-left:before {
219
- content : "";
220
- display : block;
221
- width : 0;
222
- height : 0;
223
- position : absolute;
224
- }
225
-
226
- .yit-container.plugin-licence-activation .arrow-left:before {
227
- border-top : 9px solid transparent;
228
- border-bottom : 9px solid transparent;
229
- border-right : 9px solid #ff3838;
230
- top : 26px;
231
- left : -9px;
232
- }
233
-
234
- .yit-container.plugin-licence-activation .arrow-left:after {
235
- border-top : 8px solid transparent;
236
- border-bottom : 8px solid transparent;
237
- border-right : 8px solid #fff;
238
- left : -8px;
239
- top : 27px;
240
- }
241
-
242
- .yit-container.plugin-licence-activation h2,
243
- .yit-container.plugin-licence-activation h3 {
244
- text-transform : uppercase;
245
- font-weight : 800;
246
- margin-bottom : 30px;
247
- }
248
-
249
- .yit-container.plugin-licence-activation h2 {
250
- color : #808a97;
251
- font-size : 25px;
252
- }
253
-
254
- .yit-container.plugin-licence-activation h3 {
255
- color : #313131;
256
- font-size : 15px;
257
- height : 20px;
258
- }
259
-
260
- .yit-container.plugin-licence-activation h3.to-active {
261
- height : 20px;
262
- position : relative;
263
- vertical-align : top;
264
- }
265
-
266
- .yit-container.plugin-licence-activation .spinner.show {
267
- display : inline-block;
268
- vertical-align : middle;
269
- float : none;
270
- }
271
-
272
- .yit-container.plugin-licence-activation h3.to-active > .spinner.show {
273
- display : inline-block;
274
- float : none;
275
- top : -3px;
276
- position : relative;
277
- }
278
-
279
- .yit-container.plugin-licence-activation .licence-check-section {
280
- margin-bottom : 60px;
281
- }
282
-
283
- .yit-container.plugin-licence-activation span.licence-label {
284
- font-weight : 500;
285
- color : #606060;
286
- margin-bottom : 30px;
287
- }
288
-
289
- .yit-container.plugin-licence-activation .button-licence {
290
- border : 0;
291
- font-size : 13px;
292
- text-transform : uppercase;
293
- background-color : #808a97;
294
- color : #fff;
295
- font-weight : 700;
296
- border-radius : 3px;
297
- cursor : pointer;
298
- text-decoration : none;
299
- padding : 5px 7px;
300
- -webkit-transition : background-color 0.3s ease;
301
- -moz-transition : background-color 0.3s ease;
302
- -ms-transition : background-color 0.3s ease;
303
- -o-transition : background-color 0.3s ease;
304
- transition : background-color 0.3s ease;
305
- }
306
-
307
- .yit-container.plugin-licence-activation .button-licence:hover {
308
- background-color : #4d5c6f;
309
- }
310
-
311
- .yit-container.plugin-licence-activation .button-licence.clicked {
312
- cursor : not-allowed;
313
- background-color : #e2e2e2 !important;
314
- }
315
-
316
- .yit-container.plugin-licence-activation .button-licence.licence-check {
317
- font-weight : 400;
318
- padding : 12px 19px;
319
- }
320
-
321
- .yit-container.plugin-licence-activation .button-licence.licence-renew {
322
- text-decoration : none;
323
- padding : 7px 12px;
324
- font-size : 9px;
325
- }
326
-
327
- .yit-container.plugin-licence-activation .button-licence.licence-renew:focus {
328
- box-shadow : none;
329
- }
330
-
331
- .yit-container.plugin-licence-activation table:not(.to-active-table) {
332
- width : 100%;
333
- border : 1px solid #dcdcdc;
334
- border-spacing : 0;
335
- border-radius : 5px;
336
- border-collapse : separate;
337
- overflow : hidden;
338
- }
339
-
340
- .yit-container.plugin-licence-activation table:not(.to-active-table) th {
341
- border-bottom : 1px solid #dcdcdc;
342
- }
343
-
344
- .yit-container.plugin-licence-activation table:not(.to-active-table) td,
345
- .yit-container.plugin-licence-activation table:not(.to-active-table) th {
346
- border-right : 1px solid #dcdcdc;
347
- }
348
-
349
- .yit-container.plugin-licence-activation table td:last-child,
350
- .yit-container.plugin-licence-activation table th:last-child {
351
- border-right : 0;
352
- }
353
-
354
- .yit-container.plugin-licence-activation table thead tr {
355
- background-color : #f6f4f4;
356
- }
357
-
358
- .yit-container.plugin-licence-activation table tbody tr {
359
- background-color : #fff;
360
- }
361
-
362
- .yit-container.plugin-licence-activation table thead tr th {
363
- font-size : 13px;
364
- color : #313131;
365
- text-transform : uppercase;
366
- font-weight : bold;
367
- }
368
-
369
- .yit-container.plugin-licence-activation table thead tr,
370
- .yit-container.plugin-licence-activation table tbody tr {
371
- line-height : 60px;
372
- }
373
-
374
- .yit-container.plugin-licence-activation table tbody tr td {
375
- text-align : center;
376
- line-height : 20px;
377
- padding : 10px 5px;
378
- }
379
-
380
- .yit-container.plugin-licence-activation .button-licence.licence-activation {
381
- padding : 12px 18px;
382
- }
383
-
384
- .yit-container.plugin-licence-activation .to-active-table tr {
385
- line-height : 75px;
386
- }
387
-
388
- .yit-container.plugin-licence-activation .to-active-table tr.plugin-row {
389
- background-color : transparent;
390
- -webkit-transition : all 0.3s ease;
391
- -moz-transition : all 0.3s ease;
392
- -ms-transition : all 0.3s ease;
393
- -o-transition : all 0.3s ease;
394
- transition : all 0.3s ease;
395
- }
396
-
397
- .yit-container.plugin-licence-activation .to-active-table tr.plugin-row.error {
398
- background-color : #ffdcdc;
399
- }
400
-
401
- .yit-container.plugin-licence-activation .to-active-table td {
402
- padding-right : 12px;
403
- width : 33%;
404
- }
405
-
406
- .yit-container.plugin-licence-activation .to-active-table td.plugin-name {
407
- color : #808a97;
408
- font-size : 12px;
409
- text-transform : uppercase;
410
- font-weight : bold;
411
- line-height : 20px;
412
- width : 20%;
413
- padding-left : 20px;
414
- }
415
-
416
- .yit-container.plugin-licence-activation .to-active-table td.activate-button {
417
- width : 15%;
418
- position : relative;
419
- }
420
-
421
- .yit-container.plugin-licence-activation input[type=text],
422
- .yit-container.plugin-licence-activation input[type=email] {
423
- -webkit-transition : all 0.3s ease;
424
- -moz-transition : all 0.3s ease;
425
- -ms-transition : all 0.3s ease;
426
- -o-transition : all 0.3s ease;
427
- transition : all 0.3s ease;
428
-
429
- border : 1px solid #dcdcdc;
430
- padding : 0 15px;
431
- border-radius : 3px;
432
- height : 41px;
433
- width : 100%;
434
- }
435
-
436
- .yit-container.plugin-licence-activation input[type=text].require,
437
- .yit-container.plugin-licence-activation input[type=email].require {
438
- border : 1px solid #ff3838;
439
- }
440
-
441
- .yit-container.plugin-licence-activation input[type=text]:focus,
442
- .yit-container.plugin-licence-activation input[type=email]:focus {
443
- webkit-box-shadow : 0 0 1px rgba(30, 140, 190, .8);
444
- box-shadow : 0 0 1px rgba(30, 140, 190, .8);
445
- }
446
-
447
- .yit-container.plugin-licence-activation input[type=text] {
448
- text-transform : uppercase;
449
- text-align : center;
450
- }
451
-
452
- .yit-container.plugin-licence-activation input[type=email] {
453
- text-align : left;
454
- }
455
-
456
- .yit-container.plugin-licence-activation input[type=submit]:focus {
457
- outline : 0;
458
- }
459
-
460
- /* === Woocommerce panel === */
461
- #plugin-fw-wc .yit_options {
462
- padding : 0;
463
- border : 0;
464
- }
465
-
466
- #plugin-fw-wc .yit_options input.upload_button, .yit_options input.button {
467
- background : none;
468
- border : 1px solid #ccc;
469
- }
470
-
471
- /* === WP Pointers === */
472
-
473
- #adminmenu li.menu-top.yit-pointer-selected-row,
474
- #adminmenu li.menu-top.yit-pointer-selected-row:hover,
475
- #adminmenu li.yit-pointer-selected-row a.menu-top {
476
- background-color : #acc327;
477
- color : #000;
478
- }
479
-
480
- #adminmenu a.menu-top.toplevel_page_yit_plugin_panel.yit-pointer {
481
- color : #000;
482
- }
483
-
484
- #adminmenu a.menu-top.toplevel_page_yit_plugin_panel.yit-pointer:hover,
485
- #adminmenu .wp-submenu a.yit-pointer-selected-row {
486
- color : #fff;
487
- }
488
-
489
- #adminmenu .wp-submenu a.yit-pointer-selected-row:hover {
490
- color : #45bbe6;
491
- }
492
-
493
- /* WooCommerce 2.4 Support */
494
- .woocommerce table.form-table .colorpick {
495
- width : 6em;
496
- }
497
-
498
- #wpwrap h2.nav-tab-wrapper, #wpbody-content h2.nav-tab-wrapper {
499
- border-bottom : 1px solid #ccc;
500
- margin-right : 15px;
501
- }
502
-
503
- /* === YIT FRAMEWORK === */
504
- .plugin-card .plugin-icon img {
505
- max-width : 100%;
506
- width : auto;
507
- height : auto;
508
- }
509
-
510
- /* === Panel Content and Container === */
511
- .yit-admin-panel-container {
512
- position : relative;
513
- margin-right : 15px;
514
- }
515
-
516
- .yit-admin-panel-content-wrap {
517
- width : 100%;
518
- display : block;
519
- }
520
-
521
- .yith-disabled {
522
- opacity : 0.3;
523
- pointer-events : none;
524
- }
525
-
526
- .yith-plugin-fw-select,
527
- .yith-plugin-fw-slider-container,
528
- .yith-plugin-fw-text-input,
529
- .yith-plugin-fw-text-array-table,
530
- .yith-plugin-fw-textarea {
531
- width : 400px;
532
- max-width : 100%;
533
- }
534
-
535
- .yith-plugin-fw-text-array-table input {
536
- width : 100%;
537
- }
538
-
539
- .yith-plugin-fw-panel-wc-row.preview {
540
- float : none;
541
- }
542
-
543
- .yith-plugin-fw-panel .subsubsub {
544
- margin : 0;
545
- }
546
-
547
- /**
548
- * Sub Tabs
549
- */
550
- .yith-plugin-ui .yith-plugin-fw-sub-tabs-nav {
551
- background : #fff;
552
- padding : 10px 20px;
553
- box-sizing : border-box;
554
- margin-right : 15px;
555
- border-left : 1px solid #d8d8d8;
556
- border-right : 1px solid #d8d8d8;
557
- }
558
-
559
- .yith-plugin-ui .yith-plugin-fw-sub-tabs-nav h3.nav-tab-wrapper {
560
- text-transform : uppercase;
561
- line-height : inherit;
562
- font-weight : 600;
563
- }
564
-
565
- .yith-plugin-ui .yith-plugin-fw-sub-tabs-nav .nav-tab {
566
- line-height : 1.71428571;
567
- margin-left : 0;
568
- margin-right : 0;
569
- background-color : #fff;
570
- color : #336374;
571
- font-size : 13px;
572
- padding : 8px 20px 9px;
573
- border : 0;
574
- border-left : 1px solid #d8d8d8;
575
- border-top : 1px solid #d8d8d8;
576
- }
577
-
578
- .yith-plugin-ui .yith-plugin-fw-sub-tabs-nav .nav-tab .yith-nav-sub-tab__title,
579
- .yith-plugin-ui .yith-plugin-fw-sub-tabs-nav .nav-tab .yith-nav-sub-tab__icon {
580
- vertical-align : middle;
581
- }
582
-
583
- .yith-plugin-ui .yith-plugin-fw-sub-tabs-nav .nav-tab .yith-nav-sub-tab__icon {
584
- margin-left : 8px;
585
- font-size : 22px;
586
- margin-right : -3px;
587
- }
588
-
589
- .yith-plugin-ui .yith-plugin-fw-sub-tabs-nav .nav-tab .yith-nav-sub-tab__icon:before {
590
- color : inherit;
591
- }
592
-
593
- .yith-plugin-ui .yith-plugin-fw-sub-tabs-nav .nav-tab:last-child {
594
- border-right : 1px solid #d8d8d8;
595
- }
596
-
597
- .yith-plugin-ui .yith-plugin-fw-sub-tabs-nav .yith-nav-sub-tab--highlight {
598
- color : #fff;
599
- background : #2a8db0;
600
- }
601
-
602
- .yith-plugin-ui .yith-plugin-fw-sub-tabs-nav .nav-tab-active {
603
- color : #2a8db0;
604
- background : #fff;
605
- border-bottom : 1px solid #fff;
606
- }
607
-
608
- /* === Responsive === */
609
-
610
- @media (max-width : 767px) {
611
-
612
- }
613
-
614
- @media (max-width : 480px) {
615
-
616
- }
617
-
618
- @media (min-width : 768px) and (max-width : 992px) {
619
- }
620
-
621
- @media (min-width : 980px) and (max-width : 1199px) {
622
- }
623
-
624
- @media (min-width : 1200px) {
625
- .yit-container.plugin-licence-activation {
626
- width : 900px;
627
- }
628
- }
629
-
630
- @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) {
631
- }
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, .yith-plugin-fw-panel-custom-tab-container {
39
+ background-color : #fff;
40
+ margin-bottom : 20px;
41
+ }
42
+
43
+ .yith-plugin-fw-panel-custom-tab-container {
44
+ padding : 20px;
45
+ box-sizing : border-box;
46
+ margin-right : 15px;
47
+ }
48
+
49
+ .yith-plugin-fw-panel-custom-tab-container > h2 {
50
+ border : none;
51
+ padding : 15px 0;
52
+ }
53
+
54
+ #plugin-fw-wc table.form-table th, #yith-plugin-fw-panel table.form-table th {
55
+ padding : 20px;
56
+ }
57
+
58
+ #plugin-fw-wc h3, #yith-plugin-fw-panel h3 {
59
+ padding : 0 0 0 10px;
60
+ margin : 0;
61
+ }
62
+
63
+
64
+ /**
65
+ Post type Edit
66
+ */
67
+
68
+ .yith-plugin-fw-wp-page-wrapper {
69
+ margin : 23px 20px 0 2px;
70
+ }
71
+
72
+ .yith-plugin-fw-wp-page-wrapper .notice,
73
+ .yith-plugin-fw-wp-page-wrapper div.updated,
74
+ .yith-plugin-fw-wp-page-wrapper div.error {
75
+ margin : 5px 15px 15px 0;
76
+ }
77
+
78
+ .yith-plugin-fw-wp-page-wrapper .wrap {
79
+ border : 1px solid #d8d8d8;
80
+ border-top : 0;
81
+ margin : 0 15px 0 0;
82
+ background : #fff;
83
+ padding : 20px;
84
+ box-sizing : border-box;
85
+ }
86
+
87
+ #wpwrap .yith-plugin-fw-wp-page-wrapper .yith-plugin-ui h2.nav-tab-wrapper, #wpbody-content .yith-plugin-fw-wp-page-wrapper .yith-plugin-ui h2.nav-tab-wrapper {
88
+ padding-bottom : 0;
89
+ }
90
+
91
+ .yith-plugin-fw-wp-page-wrapper .postbox {
92
+ box-shadow : none;
93
+ }
94
+
95
+ .yith-plugin-fw-wp-page-wrapper h1.nav-tab-wrapper, .yith-plugin-fw-wp-page-wrapper h2.nav-tab-wrapper, .yith-plugin-fw-wp-page-wrapper .nav-tab-wrapper {
96
+ padding-top : 9px;
97
+ padding-bottom : 0;
98
+ }
99
+
100
+ .yith-plugin-fw-wp-page-wrapper .wrap h1.wp-heading-inline {
101
+ color : #2a8db0;
102
+ font-size : 15px;
103
+ text-transform : uppercase;
104
+ font-weight : 600;
105
+ }
106
+
107
+ .yith-plugin-fw-wp-page-wrapper .wrap a.page-title-action,
108
+ .yith-plugin-fw-wp-page-wrapper .wrap a.page-title-action:active {
109
+ border-radius : 3px;
110
+ text-transform : uppercase;
111
+ box-shadow : none;
112
+ border : 0;
113
+ font-weight : 700;
114
+ font-size : 11px;
115
+ padding : 0 14px;
116
+ outline : none;
117
+ height : auto;
118
+ transition : all ease 0.3s;
119
+ text-shadow : none;
120
+ vertical-align : middle;
121
+ line-height : 26px;
122
+ display : inline-block;
123
+ text-decoration : none;
124
+ cursor : pointer;
125
+ background-color : #375f6b;
126
+ color : #fff;
127
+ margin-left: 10px !important;
128
+ }
129
+
130
+ .yith-plugin-fw-wp-page-wrapper .wrap a.page-title-action:hover {
131
+ border-color : #007694;
132
+ background : #007694;
133
+ color : #fff;
134
+ }
135
+
136
+ .yith-plugin-fw-wp-page-wrapper #wp-content-editor-tools {
137
+ background : transparent;
138
+ }
139
+
140
+ /* === Plugins Upgrader === */
141
+
142
+ .yit-plugin-changelog-wrapper {
143
+ display : none;
144
+ }
145
+
146
+ .yit-plugin-changelog-title {
147
+ text-transform : uppercase;
148
+ }
149
+
150
+ .yit-plugin-changelog {
151
+ height : calc(100% - 15px);
152
+ width : calc(100% - 15px);
153
+ overflow-x : hidden;
154
+ overflow-y : auto;
155
+ z-index : 999;
156
+ background : #fcfcfc;
157
+ }
158
+
159
+ /* === Plugins Licence Activation === */
160
+
161
+ .yit-container.plugin-licence-activation {
162
+ font-family : 'Raleway', sans-serif;
163
+ }
164
+
165
+ .yit-container.plugin-licence-activation .to-active-wrapper {
166
+ margin-bottom : 60px;
167
+ }
168
+
169
+ .yit-container.plugin-licence-activation .to-active-wrapper form.to-active-form {
170
+ position : relative;
171
+ border-color : #e1e1e1;
172
+ border-style : solid;
173
+ border-width : 0;
174
+ }
175
+
176
+ .yit-container.plugin-licence-activation .to-active-wrapper form.to-active-form:first-child {
177
+ border-top-width : 1px;
178
+ }
179
+
180
+ .yit-container.plugin-licence-activation .to-active-wrapper form.to-active-form:last-child {
181
+ border-bottom-width : 1px;
182
+ }
183
+
184
+ .yit-container.plugin-licence-activation .to-active-wrapper table.to-active-table {
185
+ border-width : 0;
186
+ border-spacing : 0;
187
+ width : 100%;
188
+ }
189
+
190
+ .yit-container.plugin-licence-activation .message {
191
+ display : none;
192
+ line-height : normal;
193
+ background : #fff url(../images/licence-error.png) 15px center no-repeat;
194
+ padding-left : 65px;
195
+ padding-right : 15px;
196
+ width : 150px;
197
+ }
198
+
199
+ .yit-container.plugin-licence-activation .message-wrapper {
200
+ height : 75px;
201
+ display : none;
202
+ position : absolute;
203
+ top : 0;
204
+ right : -250px;
205
+ border : 1px solid #ff3838;
206
+ }
207
+
208
+ .yit-container.plugin-licence-activation .message-wrapper.visible {
209
+ display : table;
210
+ }
211
+
212
+ .yit-container.plugin-licence-activation .message {
213
+ display : table-cell;
214
+ vertical-align : middle;
215
+ }
216
+
217
+ .yit-container.plugin-licence-activation .arrow-left:after,
218
+ .yit-container.plugin-licence-activation .arrow-left:before {
219
+ content : "";
220
+ display : block;
221
+ width : 0;
222
+ height : 0;
223
+ position : absolute;
224
+ }
225
+
226
+ .yit-container.plugin-licence-activation .arrow-left:before {
227
+ border-top : 9px solid transparent;
228
+ border-bottom : 9px solid transparent;
229
+ border-right : 9px solid #ff3838;
230
+ top : 26px;
231
+ left : -9px;
232
+ }
233
+
234
+ .yit-container.plugin-licence-activation .arrow-left:after {
235
+ border-top : 8px solid transparent;
236
+ border-bottom : 8px solid transparent;
237
+ border-right : 8px solid #fff;
238
+ left : -8px;
239
+ top : 27px;
240
+ }
241
+
242
+ .yit-container.plugin-licence-activation h2,
243
+ .yit-container.plugin-licence-activation h3 {
244
+ text-transform : uppercase;
245
+ font-weight : 800;
246
+ margin-bottom : 30px;
247
+ }
248
+
249
+ .yit-container.plugin-licence-activation h2 {
250
+ color : #808a97;
251
+ font-size : 25px;
252
+ }
253
+
254
+ .yit-container.plugin-licence-activation h3 {
255
+ color : #313131;
256
+ font-size : 15px;
257
+ height : 20px;
258
+ }
259
+
260
+ .yit-container.plugin-licence-activation h3.to-active {
261
+ height : 20px;
262
+ position : relative;
263
+ vertical-align : top;
264
+ }
265
+
266
+ .yit-container.plugin-licence-activation .spinner.show {
267
+ display : inline-block;
268
+ vertical-align : middle;
269
+ float : none;
270
+ }
271
+
272
+ .yit-container.plugin-licence-activation h3.to-active > .spinner.show {
273
+ display : inline-block;
274
+ float : none;
275
+ top : -3px;
276
+ position : relative;
277
+ }
278
+
279
+ .yit-container.plugin-licence-activation .licence-check-section {
280
+ margin-bottom : 60px;
281
+ }
282
+
283
+ .yit-container.plugin-licence-activation span.licence-label {
284
+ font-weight : 500;
285
+ color : #606060;
286
+ margin-bottom : 30px;
287
+ }
288
+
289
+ .yit-container.plugin-licence-activation .button-licence {
290
+ border : 0;
291
+ font-size : 13px;
292
+ text-transform : uppercase;
293
+ background-color : #808a97;
294
+ color : #fff;
295
+ font-weight : 700;
296
+ border-radius : 3px;
297
+ cursor : pointer;
298
+ text-decoration : none;
299
+ padding : 5px 7px;
300
+ -webkit-transition : background-color 0.3s ease;
301
+ -moz-transition : background-color 0.3s ease;
302
+ -ms-transition : background-color 0.3s ease;
303
+ -o-transition : background-color 0.3s ease;
304
+ transition : background-color 0.3s ease;
305
+ }
306
+
307
+ .yit-container.plugin-licence-activation .button-licence:hover {
308
+ background-color : #4d5c6f;
309
+ }
310
+
311
+ .yit-container.plugin-licence-activation .button-licence.clicked {
312
+ cursor : not-allowed;
313
+ background-color : #e2e2e2 !important;
314
+ }
315
+
316
+ .yit-container.plugin-licence-activation .button-licence.licence-check {
317
+ font-weight : 400;
318
+ padding : 12px 19px;
319
+ }
320
+
321
+ .yit-container.plugin-licence-activation .button-licence.licence-renew {
322
+ text-decoration : none;
323
+ padding : 7px 12px;
324
+ font-size : 9px;
325
+ }
326
+
327
+ .yit-container.plugin-licence-activation .button-licence.licence-renew:focus {
328
+ box-shadow : none;
329
+ }
330
+
331
+ .yit-container.plugin-licence-activation table:not(.to-active-table) {
332
+ width : 100%;
333
+ border : 1px solid #dcdcdc;
334
+ border-spacing : 0;
335
+ border-radius : 5px;
336
+ border-collapse : separate;
337
+ overflow : hidden;
338
+ }
339
+
340
+ .yit-container.plugin-licence-activation table:not(.to-active-table) th {
341
+ border-bottom : 1px solid #dcdcdc;
342
+ }
343
+
344
+ .yit-container.plugin-licence-activation table:not(.to-active-table) td,
345
+ .yit-container.plugin-licence-activation table:not(.to-active-table) th {
346
+ border-right : 1px solid #dcdcdc;
347
+ }
348
+
349
+ .yit-container.plugin-licence-activation table td:last-child,
350
+ .yit-container.plugin-licence-activation table th:last-child {
351
+ border-right : 0;
352
+ }
353
+
354
+ .yit-container.plugin-licence-activation table thead tr {
355
+ background-color : #f6f4f4;
356
+ }
357
+
358
+ .yit-container.plugin-licence-activation table tbody tr {
359
+ background-color : #fff;
360
+ }
361
+
362
+ .yit-container.plugin-licence-activation table thead tr th {
363
+ font-size : 13px;
364
+ color : #313131;
365
+ text-transform : uppercase;
366
+ font-weight : bold;
367
+ }
368
+
369
+ .yit-container.plugin-licence-activation table thead tr,
370
+ .yit-container.plugin-licence-activation table tbody tr {
371
+ line-height : 60px;
372
+ }
373
+
374
+ .yit-container.plugin-licence-activation table tbody tr td {
375
+ text-align : center;
376
+ line-height : 20px;
377
+ padding : 10px 5px;
378
+ }
379
+
380
+ .yit-container.plugin-licence-activation .button-licence.licence-activation {
381
+ padding : 12px 18px;
382
+ }
383
+
384
+ .yit-container.plugin-licence-activation .to-active-table tr {
385
+ line-height : 75px;
386
+ }
387
+
388
+ .yit-container.plugin-licence-activation .to-active-table tr.plugin-row {
389
+ background-color : transparent;
390
+ -webkit-transition : all 0.3s ease;
391
+ -moz-transition : all 0.3s ease;
392
+ -ms-transition : all 0.3s ease;
393
+ -o-transition : all 0.3s ease;
394
+ transition : all 0.3s ease;
395
+ }
396
+
397
+ .yit-container.plugin-licence-activation .to-active-table tr.plugin-row.error {
398
+ background-color : #ffdcdc;
399
+ }
400
+
401
+ .yit-container.plugin-licence-activation .to-active-table td {
402
+ padding-right : 12px;
403
+ width : 33%;
404
+ }
405
+
406
+ .yit-container.plugin-licence-activation .to-active-table td.plugin-name {
407
+ color : #808a97;
408
+ font-size : 12px;
409
+ text-transform : uppercase;
410
+ font-weight : bold;
411
+ line-height : 20px;
412
+ width : 20%;
413
+ padding-left : 20px;
414
+ }
415
+
416
+ .yit-container.plugin-licence-activation .to-active-table td.activate-button {
417
+ width : 15%;
418
+ position : relative;
419
+ }
420
+
421
+ .yit-container.plugin-licence-activation input[type=text],
422
+ .yit-container.plugin-licence-activation input[type=email] {
423
+ -webkit-transition : all 0.3s ease;
424
+ -moz-transition : all 0.3s ease;
425
+ -ms-transition : all 0.3s ease;
426
+ -o-transition : all 0.3s ease;
427
+ transition : all 0.3s ease;
428
+
429
+ border : 1px solid #dcdcdc;
430
+ padding : 0 15px;
431
+ border-radius : 3px;
432
+ height : 41px;
433
+ width : 100%;
434
+ }
435
+
436
+ .yit-container.plugin-licence-activation input[type=text].require,
437
+ .yit-container.plugin-licence-activation input[type=email].require {
438
+ border : 1px solid #ff3838;
439
+ }
440
+
441
+ .yit-container.plugin-licence-activation input[type=text]:focus,
442
+ .yit-container.plugin-licence-activation input[type=email]:focus {
443
+ webkit-box-shadow : 0 0 1px rgba(30, 140, 190, .8);
444
+ box-shadow : 0 0 1px rgba(30, 140, 190, .8);
445
+ }
446
+
447
+ .yit-container.plugin-licence-activation input[type=text] {
448
+ text-transform : uppercase;
449
+ text-align : center;
450
+ }
451
+
452
+ .yit-container.plugin-licence-activation input[type=email] {
453
+ text-align : left;
454
+ }
455
+
456
+ .yit-container.plugin-licence-activation input[type=submit]:focus {
457
+ outline : 0;
458
+ }
459
+
460
+ /* === Woocommerce panel === */
461
+ #plugin-fw-wc .yit_options {
462
+ padding : 0;
463
+ border : 0;
464
+ }
465
+
466
+ #plugin-fw-wc .yit_options input.upload_button, .yit_options input.button {
467
+ background : none;
468
+ border : 1px solid #ccc;
469
+ }
470
+
471
+ /* === WP Pointers === */
472
+
473
+ #adminmenu li.menu-top.yit-pointer-selected-row,
474
+ #adminmenu li.menu-top.yit-pointer-selected-row:hover,
475
+ #adminmenu li.yit-pointer-selected-row a.menu-top {
476
+ background-color : #acc327;
477
+ color : #000;
478
+ }
479
+
480
+ #adminmenu a.menu-top.toplevel_page_yit_plugin_panel.yit-pointer {
481
+ color : #000;
482
+ }
483
+
484
+ #adminmenu a.menu-top.toplevel_page_yit_plugin_panel.yit-pointer:hover,
485
+ #adminmenu .wp-submenu a.yit-pointer-selected-row {
486
+ color : #fff;
487
+ }
488
+
489
+ #adminmenu .wp-submenu a.yit-pointer-selected-row:hover {
490
+ color : #45bbe6;
491
+ }
492
+
493
+ /* WooCommerce 2.4 Support */
494
+ .woocommerce table.form-table .colorpick {
495
+ width : 6em;
496
+ }
497
+
498
+ #wpwrap h2.nav-tab-wrapper, #wpbody-content h2.nav-tab-wrapper {
499
+ border-bottom : 1px solid #ccc;
500
+ margin-right : 15px;
501
+ }
502
+
503
+ /* === YIT FRAMEWORK === */
504
+ .plugin-card .plugin-icon img {
505
+ max-width : 100%;
506
+ width : auto;
507
+ height : auto;
508
+ }
509
+
510
+ /* === Panel Content and Container === */
511
+ .yit-admin-panel-container {
512
+ position : relative;
513
+ margin-right : 15px;
514
+ }
515
+
516
+ .yit-admin-panel-content-wrap {
517
+ width : 100%;
518
+ display : block;
519
+ }
520
+
521
+ .yith-disabled {
522
+ opacity : 0.3;
523
+ pointer-events : none;
524
+ }
525
+
526
+ .yith-plugin-fw-select,
527
+ .yith-plugin-fw-slider-container,
528
+ .yith-plugin-fw-text-input,
529
+ .yith-plugin-fw-text-array-table,
530
+ .yith-plugin-fw-textarea {
531
+ width : 400px;
532
+ max-width : 100%;
533
+ }
534
+
535
+ .yith-plugin-fw-text-array-table input {
536
+ width : 100%;
537
+ }
538
+
539
+ .yith-plugin-fw-panel-wc-row.preview {
540
+ float : none;
541
+ }
542
+
543
+ .yith-plugin-fw-panel .subsubsub {
544
+ margin : 0;
545
+ }
546
+
547
+ /**
548
+ * Sub Tabs
549
+ */
550
+ .yith-plugin-ui .yith-plugin-fw-sub-tabs-nav {
551
+ background : #fff;
552
+ padding : 10px 20px;
553
+ box-sizing : border-box;
554
+ margin-right : 15px;
555
+ border-left : 1px solid #d8d8d8;
556
+ border-right : 1px solid #d8d8d8;
557
+ }
558
+
559
+ .yith-plugin-ui .yith-plugin-fw-sub-tabs-nav h3.nav-tab-wrapper {
560
+ text-transform : uppercase;
561
+ line-height : inherit;
562
+ font-weight : 600;
563
+ }
564
+
565
+ .yith-plugin-ui .yith-plugin-fw-sub-tabs-nav .nav-tab {
566
+ line-height : 1.71428571;
567
+ margin-left : 0;
568
+ margin-right : 0;
569
+ background-color : #fff;
570
+ color : #336374;
571
+ font-size : 13px;
572
+ padding : 8px 20px 9px;
573
+ border : 0;
574
+ border-left : 1px solid #d8d8d8;
575
+ border-top : 1px solid #d8d8d8;
576
+ }
577
+
578
+ .yith-plugin-ui .yith-plugin-fw-sub-tabs-nav .nav-tab .yith-nav-sub-tab__title,
579
+ .yith-plugin-ui .yith-plugin-fw-sub-tabs-nav .nav-tab .yith-nav-sub-tab__icon {
580
+ vertical-align : middle;
581
+ }
582
+
583
+ .yith-plugin-ui .yith-plugin-fw-sub-tabs-nav .nav-tab .yith-nav-sub-tab__icon {
584
+ margin-left : 8px;
585
+ font-size : 22px;
586
+ margin-right : -3px;
587
+ }
588
+
589
+ .yith-plugin-ui .yith-plugin-fw-sub-tabs-nav .nav-tab .yith-nav-sub-tab__icon:before {
590
+ color : inherit;
591
+ }
592
+
593
+ .yith-plugin-ui .yith-plugin-fw-sub-tabs-nav .nav-tab:last-child {
594
+ border-right : 1px solid #d8d8d8;
595
+ }
596
+
597
+ .yith-plugin-ui .yith-plugin-fw-sub-tabs-nav .yith-nav-sub-tab--highlight {
598
+ color : #fff;
599
+ background : #2a8db0;
600
+ }
601
+
602
+ .yith-plugin-ui .yith-plugin-fw-sub-tabs-nav .nav-tab-active {
603
+ color : #2a8db0;
604
+ background : #fff;
605
+ border-bottom : 1px solid #fff;
606
+ }
607
+
608
+ /* === Responsive === */
609
+
610
+ @media (max-width : 767px) {
611
+
612
+ }
613
+
614
+ @media (max-width : 480px) {
615
+
616
+ }
617
+
618
+ @media (min-width : 768px) and (max-width : 992px) {
619
+ }
620
+
621
+ @media (min-width : 980px) and (max-width : 1199px) {
622
+ }
623
+
624
+ @media (min-width : 1200px) {
625
+ .yit-container.plugin-licence-activation {
626
+ width : 900px;
627
+ }
628
+ }
629
+
630
+ @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) {
631
+ }
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,2179 +1,2183 @@
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
- padding: 0 !important;
33
- }
34
-
35
- .the-metabox .yith-plugin-fw-title-field-wrapper h3.title {
36
- float : left;
37
- }
38
-
39
- .yith-plugin-fw span.color-alpha {
40
- height: 100%!important;
41
- width: 100% !important;
42
- border: 1px solid #d9d9d9;
43
- margin: -1px;
44
- }
45
-
46
- .yith-plugin-fw .wp-color-result-text{
47
- height: 100%;
48
- }
49
- .yith-plugin-fw input[type=email],
50
- .yith-plugin-fw input[type=number],
51
- .yith-plugin-fw input[type=text]:not(.select2-search__field),
52
- .yith-plugin-fw select,
53
- .woocommerce .yith-plugin-fw table.form-table input[type=email],
54
- .woocommerce .yith-plugin-fw table.form-table input[type=number],
55
- .yith-plugin-ui input[type=password],
56
- .woocommerce .yith-plugin-fw table.form-table input[type=text]:not(.select2-search__field),
57
- .woocommerce .yith-plugin-fw table.form-table select {
58
- width : 400px;
59
- max-width : 100%;
60
- height : 30px;
61
- padding : 5px;
62
- line-height: 1;
63
- }
64
-
65
- .woocommerce .yith-plugin-fw table.form-table input[type=text].wp-color-picker,
66
- .woocommerce .yith-plugin-fw table.form-table input[type=text].yith-plugin-fw-colorpicker,
67
- .yith-plugin-fw input[type=text].wp-color-picker,
68
- .yith-plugin-fw input[type=text].yith-plugin-fw-colorpicker {
69
- width : 6em;
70
- max-width : none;
71
- height : auto;
72
- padding : 3px 5px;
73
- }
74
-
75
- .wp-core-ui .yith-plugin-fw-colorpicker-field-wrapper button{
76
- border-color: #7e8993;
77
- }
78
-
79
- .woocommerce .yith-plugin-fw table.form-table input[type=text].colorpick,
80
- .yith-plugin-fw input[type=text].colorpick {
81
- width : 6em;
82
- max-width : none;
83
- height : auto;
84
- padding : 6px;
85
- }
86
-
87
- .yith-plugin-fw input.select2-search__field,
88
- .yith-plugin-fw .select2-container .select2-search--inline .select2-search__field,
89
- .woocommerce .yith-plugin-fw input.select2-search__field,
90
- .woocommerce .yith-plugin-fw table.form-table input.select2-search__field {
91
- padding : 3px;
92
- }
93
-
94
- .yith-plugin-fw .select2-container .select2-selection--single .select2-selection__rendered {
95
- line-height : 27px;
96
- }
97
-
98
- .yith-plugin-fw textarea {
99
- width : 400px;
100
- max-width : 100%;
101
- padding : 5px;
102
- }
103
-
104
- /* ------------- ICONS ------------- */
105
- .yit-icons-manager-wrapper {
106
- width : 100%;
107
- max-width : 400px;
108
- }
109
-
110
- .yit-icons-manager-text {
111
- width : 100%;
112
- }
113
-
114
- .yit-icons-manager-icon-text {
115
- width : calc(100% - 35px) !important;
116
- height : 30px;
117
- float : left;
118
- margin : 0;
119
- }
120
-
121
- .yit-icons-manager-icon-preview {
122
- width : 30px;
123
- height : 30px;
124
- margin-right : 5px;
125
- float : left;
126
- padding-top : 6px;
127
- box-sizing : border-box;
128
- text-align : center;
129
- background : #f1f1f1;
130
- }
131
-
132
- .yit-icons-manager-list-wrapper {
133
- margin : 10px 0;
134
- box-shadow : 0 0 0 1px #ddd;
135
- }
136
-
137
- ul.yit-icons-manager-list {
138
- width : 100%;
139
- height : 300px;
140
- overflow-y : scroll;
141
- margin : 0;
142
- }
143
-
144
- ul.yit-icons-manager-list li {
145
- float : left;
146
- width : 30px;
147
- height : 30px;
148
- padding-top : 6px;
149
- box-sizing : border-box;
150
- text-align : center;
151
- background : #f1f1f1;
152
- margin : 1px;
153
- cursor : pointer;
154
- }
155
-
156
- ul.yit-icons-manager-list li:hover {
157
- background : #c5dcf6;
158
- }
159
-
160
- ul.yit-icons-manager-list li.active {
161
- background : #d4f0ff;
162
- }
163
-
164
- .yit-icons-manager-action-set-default {
165
- margin-bottom : 0;
166
- }
167
-
168
- .yit-icons-manager-default-icon-preview {
169
- height : 100%;
170
- display : inline-block;
171
- padding-left : 10px;
172
- border-left : 1px solid #ccc;
173
- margin-left : 10px;
174
- }
175
-
176
- /* ------- Text Array ------- */
177
- .yith-plugin-fw-text-array-table td {
178
- padding : 1px;
179
- }
180
-
181
- .yith-plugin-fw-text-array-table input[type=text],
182
- .woocommerce table.form-table table.yith-plugin-fw-text-array-table input[type=text] {
183
- width : 100%;
184
- }
185
-
186
- /* ------- Image Gallery ------- */
187
- .yith-plugin-fw .image-gallery ul li {
188
- display : inline-block;
189
- width : 80px;
190
- margin-left : 10px;
191
- position : relative;
192
- }
193
-
194
- .yith-plugin-fw .image-gallery ul li img {
195
- width : 80px;
196
- border : 1px solid #ccc;
197
- }
198
-
199
- .yith-plugin-fw .image-gallery ul li ul {
200
- position : absolute;
201
- top : -6px;
202
- right : -1px;
203
- width : 20px;
204
- height : 20px;
205
- }
206
-
207
- .yith-plugin-fw .image-gallery ul a.delete {
208
- background : url(../images/x.png) no-repeat;
209
- width : 20px;
210
- height : 20px;
211
- display : block;
212
- text-indent : -99999px;
213
- }
214
-
215
- /* ------- OnOff ------- */
216
- .yith-plugin-fw-onoff-container {
217
- display : inline-block;
218
- text-align : left;
219
- }
220
-
221
- .yith-plugin-fw-onoff-container input {
222
- display : none;
223
- }
224
-
225
- .yith-plugin-fw-onoff-container input + span {
226
- cursor : pointer;
227
- text-indent : -9999px;
228
- display : block;
229
- width : 36px;
230
- line-height : 1;
231
- height : 20px;
232
- background : #a4a4a4;
233
- border-radius : 24px;
234
- position : relative;
235
- transition : all 0.3s;
236
- }
237
-
238
-
239
- .yith-plugin-fw-onoff-container input + span:before {
240
- content : '';
241
- background : #fff;
242
- width : 16px;
243
- height : 16px;
244
- border-radius : 50%;
245
- position : absolute;
246
- top : 2px;
247
- left : 2px;
248
- transition : all 0.3s;
249
- }
250
-
251
- .yith-plugin-fw-onoff-container input:checked + span,
252
- .yith-plugin-fw-onoff-container input.onoffchecked + span {
253
- background : #0073aa;
254
- }
255
-
256
- .yith-plugin-fw-onoff-container input:checked + span:before,
257
- .yith-plugin-fw-onoff-container input.onoffchecked + span:before {
258
- left : 18px;
259
- }
260
-
261
- /* ------- Preview ------- */
262
- .yith-plugin-fw-preview-field {
263
- max-height : 200px;
264
- }
265
-
266
- /* ------- Radio ------- */
267
- .yith-plugin-fw-radio input[type=radio] {
268
- margin : 0 3px 0 0;
269
- }
270
-
271
- .yith-plugin-fw-radio__row {
272
- margin-bottom : 8px;
273
- }
274
-
275
- /* ------- Checkbox Array ------- */
276
- .yith-plugin-fw-checkbox-array input[type=checkbox] {
277
- margin : 2px 3px 0 0;
278
- }
279
-
280
- .yith-plugin-fw-checkbox-array__row {
281
- margin-bottom : 10px;
282
- }
283
-
284
- .yith-plugin-fw-checkbox-array__row label {
285
- display : inline-block !important;
286
- width : auto !important;
287
- float : none !important;
288
- margin : 0 !important;
289
- padding : 0 !important;
290
- font-weight : 400 !important;
291
- }
292
-
293
- /* ------- Sidebar Layout ------- */
294
- .yith-plugin-fw-sidebar-layout input[type="radio"] {
295
- display : none;
296
- width : 0px;
297
- }
298
-
299
- .yith-plugin-fw-sidebar-layout input[type="radio"]:first-child {
300
- margin-right : -2px;
301
- }
302
-
303
- .yith-plugin-fw-sidebar-layout input[type="radio"] + img {
304
- border : 2px solid #fff;
305
- padding : 1px;
306
- }
307
-
308
- .yith-plugin-fw-sidebar-layout input[type="radio"] + img:hover {
309
- cursor : pointer;
310
- }
311
-
312
- .yith-plugin-fw-sidebar-layout input[checked] + img {
313
- border : 2px solid #f2ad35;
314
- padding : 1px;
315
- }
316
-
317
- .yith-plugin-fw-sidebar-layout select {
318
- vertical-align : 12px;
319
- }
320
-
321
- .yit-admin-panel-content-wrap .yith-plugin-fw-sidebar-layout label {
322
- font-weight : bold;
323
- width : 200px;
324
- float : left;
325
- line-height : 23px;
326
- margin-left : -230px;
327
- }
328
-
329
- /* ------- Slider ------- */
330
- .yith-plugin-fw .slider {
331
- padding-top : 20px;
332
- }
333
-
334
- .yith-plugin-fw-slider-container .ui-slider .minCaption {
335
- position : absolute;
336
- right : 95%;
337
- top : -6px;
338
- margin-right : 11px;
339
- }
340
-
341
- .yith-plugin-fw-slider-container .ui-slider .maxCaption {
342
- position : absolute;
343
- left : 95%;
344
- top : -6px;
345
- margin-left : 20px;
346
- }
347
-
348
- .yith-plugin-fw-slider-container .ui-slider-horizontal .ui-slider-handle {
349
- background : #fff;
350
- border : 0px !important;
351
- top : -12px !important;
352
- border-radius : 50%;
353
- width : 27px !important;
354
- height : 27px !important;
355
- box-sizing : border-box;
356
- box-shadow : 0 1px 7px -1px rgba(0, 0, 0, 0.5);
357
- font-size : 13px;
358
- padding : 6px 0;
359
- font-weight : 600;
360
- color : #555;
361
- text-align : center;
362
- }
363
-
364
- .yith-plugin-fw-slider-container .ui-slider.ui-widget-content {
365
- background : #ccc;
366
- border : none !important;
367
- height : 3px !important;
368
- border-radius : 3px !important;
369
- width : 90%;
370
- margin : 15px 5% 20px 5%;
371
- }
372
-
373
- .yith-plugin-fw-slider-container .ui-slider.ui-widget-content .ui-widget-header {
374
- background : #4b93ff;
375
- left : 0px !important;
376
- -webkit-border-radius : 3px;
377
- -moz-border-radius : 3px;
378
- -khtml-border-radius : 3px;
379
- border-radius : 3px;
380
- }
381
-
382
- /* ------- Select2 ------- */
383
- .yith-plugin-fw-select2-wrapper {
384
- width : 400px;
385
- }
386
-
387
- /* ------- Textarea ------- */
388
- .yith-plugin-fw-textarea-editor-field-wrapper {
389
- max-width : 1000px;
390
- clear : both;
391
- }
392
-
393
- .yith-plugin-fw-textarea-editor-field-wrapper textarea.wp-editor-area,
394
- .woocommerce table.form-table .yith-plugin-fw-textarea-editor-field-wrapper textarea.wp-editor-area {
395
- width : 100%;
396
- }
397
-
398
- /* ------- Buttons ------- */
399
- .yith-plugin-fw-buttons-field-wrapper {
400
- margin-top : 7px;
401
- }
402
-
403
- /* ------- Select Images ------- */
404
- .yith-plugin-fw-select-images__list {
405
- margin : 0;
406
- display : flex;
407
- flex-wrap : wrap;
408
- }
409
-
410
- .yith-plugin-fw-select-images__item {
411
- width : calc(20% - 10px);
412
- min-width : 150px;
413
- margin : 0 10px 10px 0;
414
- padding : 10px;
415
- box-sizing : border-box;
416
- cursor : pointer;
417
- transition : all .3s;
418
- border : 2px solid #eee;
419
- display : flex;
420
- flex-direction : column;
421
- justify-content : space-between;
422
- }
423
-
424
- .yith-plugin-fw-select-images__item:hover,
425
- .yith-plugin-fw-select-images__item.yith-plugin-fw-select-images__item--selected {
426
- border-color : #07bcce;
427
- }
428
-
429
- .yith-plugin-fw-select-images__item__label {
430
- text-align : center;
431
- font-weight : 600;
432
- margin-bottom : 10px;
433
- }
434
-
435
- .yith-plugin-fw-select-images__item img {
436
- display : block;
437
- max-width : 100%;
438
- margin : 0 auto;
439
- }
440
-
441
- /****************
442
- WordPress 5.3 with old panel fixes
443
- ****************/
444
- .yith-plugin-fw-field-wrapper .select2-container .select2-selection--single {
445
- height: auto;
446
- line-height: 1;
447
- }
448
-
449
- .yith-plugin-fw-field-wrapper .select2-container .select2-selection--single .select2-selection__arrow{
450
- height: 100%;
451
- }
452
-
453
- /****************
454
- YITH UI
455
- ****************/
456
- @font-face {
457
- font-family : 'yith-icon';
458
- src : url('../fonts/yith-icon.eot?7ik896');
459
- src : url('../fonts/yith-icon.eot?7ik896#iefix') format('embedded-opentype'),
460
- url('../fonts/yith-icon.ttf?7ik896') format('truetype'),
461
- url('../fonts/yith-icon.woff?7ik896') format('woff'),
462
- url('../fonts/yith-icon.svg?7ik896#yith-icon') format('svg');
463
- font-weight : normal;
464
- font-style : normal;
465
- }
466
-
467
- [class^="icon-"], [class*=" icon-"][class^="yith-icon-"], [class*=" yith-icon-"] {
468
- /* use !important to prevent issues with browser extensions that change fonts */
469
- font-family : 'yith-icon' !important;
470
- speak : none;
471
- font-style : normal;
472
- font-weight : normal;
473
- font-variant : normal;
474
- text-transform : none;
475
- line-height : 1;
476
-
477
- /* Better Font Rendering =========== */
478
- -webkit-font-smoothing : antialiased;
479
- -moz-osx-font-smoothing : grayscale;
480
- }
481
-
482
- .yith-icon-reply:before {
483
- content: "\e91a";
484
- color: #757575;
485
- }
486
- .yith-icon-calendar_add:before {
487
- content : "\e913";
488
- color : #757575;
489
- }
490
-
491
- .yith-icon-calendar_money:before {
492
- content : "\e914";
493
- color : #757575;
494
- }
495
-
496
- .yith-icon-calendar2:before {
497
- content : "\e915";
498
- color : #757575;
499
- }
500
-
501
- .yith-icon-people:before {
502
- content : "\e916";
503
- color : #757575;
504
- }
505
-
506
- .yith-icon-shield_money:before {
507
- content : "\e917";
508
- color : #757575;
509
- }
510
-
511
- .yith-icon-time_check:before {
512
- content : "\e918";
513
- color : #757575;
514
- }
515
-
516
- .yith-icon-world_settings:before {
517
- content : "\e919";
518
- color : #757575;
519
- }
520
-
521
- .yith-icon-arrow_eye_closed:before {
522
- content : "\e912";
523
- color : #757575;
524
- }
525
-
526
- .yith-icon-arrow_eye:before {
527
- content : "\e911";
528
- color : #757575;
529
- }
530
-
531
- .yith-icon-reset:before {
532
- content : "\e910";
533
- color : #757575;
534
- }
535
-
536
- .yith-icon-drag:before {
537
- content : "\e90f";
538
- color : #757575;
539
- }
540
-
541
- .yith-icon-trash:before {
542
- content : "\e90d";
543
- color : #757575;
544
- }
545
-
546
- .yith-icon-info:before {
547
- content : "\e90e";
548
- color : #757575;
549
- }
550
-
551
- .yith-icon-arrow_down:before {
552
- content : "\e900";
553
- color : #757575;
554
- }
555
-
556
- .yith-icon-arrow_left:before {
557
- content : "\e901";
558
- color : #757575;
559
- }
560
-
561
- .yith-icon-arrow_right:before {
562
- content : "\e902";
563
- color : #757575;
564
- }
565
-
566
- .yith-icon-arrow_up:before {
567
- content : "\e903";
568
- color : #757575;
569
- }
570
-
571
- .yith-icon-calendar:before {
572
- content : "\e904";
573
- color : #757575;
574
- }
575
-
576
- .yith-icon-check:before {
577
- content : "\e905";
578
- color : #757575;
579
- }
580
-
581
- .yith-icon-close:before {
582
- content : "\e906";
583
- color : #757575;
584
- }
585
-
586
- .yith-icon-edit:before {
587
- content : "\e907";
588
- color : #757575;
589
- }
590
-
591
- .yith-icon-magnifier:before {
592
- content : "\e908";
593
- color : #757575;
594
- }
595
-
596
- .yith-icon-pencil:before {
597
- content : "\e909";
598
- color : #757575;
599
- }
600
-
601
- .yith-icon-plus:before {
602
- content : "\e90a";
603
- color : #757575;
604
- }
605
-
606
- .yith-icon-update:before {
607
- content : "\e90b";
608
- color : #757575;
609
- }
610
-
611
- .yith-icon-upload:before {
612
- content : "\e90c";
613
- color : #757575;
614
- }
615
-
616
- .yith-plugin-fw-banner {
617
- width : 100%;
618
- height: 45px;
619
- background : url('../images/banner-premium.png');
620
- display: flex;
621
- align-items: center;
622
- padding-right: -23px;
623
- }
624
-
625
- .yith-plugin-fw-banner h1 {
626
- text-transform : uppercase;
627
- color : #0c5777;
628
- font-size : 15px;
629
- padding: 0 0 0 110px;
630
- font-weight : 700;
631
- text-align : left;
632
- display : inline-block;
633
- box-sizing : border-box;
634
- }
635
-
636
- .yith-plugin-fw-banner span {
637
- font-style : italic;
638
- display : block;
639
- font-size : 15px;
640
- color : #214249;
641
- text-transform : none;
642
- text-align : right;
643
- }
644
-
645
- .yith-plugin-fw-banner a,
646
- .yith-plugin-fw-banner a:focus {
647
- text-decoration : none;
648
- outline : none;
649
- box-shadow : none;
650
- }
651
-
652
- .yith-plugin-fw-rate{
653
- margin: 20px 0;
654
- }
655
-
656
- .yith-plugin-fw-rate .dashicons-star-filled{
657
- font-size: 12px;
658
- margin: 4px -4px;
659
- color: #0c5777;
660
- }
661
-
662
- .yith-plugin-fw-rate a{
663
- text-decoration: none;
664
- }
665
- .yith-plugin-ui a {
666
- outline : none;
667
- box-shadow : none;
668
- }
669
-
670
- .yith-plugin-ui {
671
- font-family : -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
672
- }
673
-
674
- .yith-plugin-ui #wpwrap h2.nav-tab-wrapper, .yith-plugin-ui #wpbody-content h2.nav-tab-wrapper {
675
- margin-top : 10px;
676
- }
677
-
678
- .yith-plugin-ui .nav-tab {
679
- margin-left : 0px;
680
- margin-right : 2px;
681
- background-color : #336374;
682
- color : #fff;
683
- font-size : 15px;
684
- padding : 7px 20px;
685
- border : 0;
686
- }
687
-
688
- .yith-plugin-ui .nav-tab:first-child {
689
- border-left : 1px solid #d9d9d9;
690
- }
691
-
692
- .yith-plugin-ui .nav-tab.yith-premium {
693
- background-color : #be421c;
694
- }
695
-
696
- .yith-plugin-ui .nav-tab-active {
697
- background-color : #fff;
698
- color : #336374;
699
- border-bottom : 1px solid #fff;
700
- }
701
-
702
- .yith-plugin-ui .nav-tab-active.yith-premium {
703
- background-color : #fff;
704
- color : #be421c;
705
- }
706
-
707
- .yith-plugin-ui #plugin-fw-wc {
708
- padding-top : 0px;
709
- }
710
-
711
- .yith-plugin-ui .form-table td {
712
- padding : 15px 20px;
713
- }
714
-
715
- .yith-plugin-ui.metaboxes-tab label {
716
- color : #33373b;
717
- font-size : 14px;
718
- margin-left : -248px;
719
- }
720
-
721
- .yith-plugin-ui.metaboxes-tab .the-metabox {
722
- margin : 40px 0 40px 290px;
723
- margin-left : 264px;
724
- }
725
-
726
- .yith-plugin-ui.metaboxes-tab label {
727
- width : 200px;
728
- font-weight : 600;
729
- }
730
-
731
- .yith-plugin-ui span.description {
732
- color : #716269;
733
- font-size : 14px;
734
- font-style : normal;
735
- font-weight : 400;
736
- margin-top : 15px;
737
- margin-left : 0;
738
- }
739
-
740
- #wpwrap .yith-plugin-ui h2.nav-tab-wrapper, #wpbody-content .yith-plugin-ui h2.nav-tab-wrapper {
741
- border : 0;
742
- border-bottom : 1px solid #ccc;
743
- margin-right : 15px;
744
- margin-bottom : 0;
745
- background-color : transparent;
746
- padding-left : 0;
747
- }
748
-
749
- .yith-plugin-ui #plugin-fw-wc table.form-table,
750
- .yith-plugin-ui #yith-plugin-fw-panel table.form-table,
751
- .yith-plugin-ui table.form-table {
752
- border : 1px solid #d8d8d8;
753
- border-top : 0;
754
- margin-bottom : 40px;
755
- }
756
-
757
- .yith-plugin-ui #wpwrap h2.nav-tab-wrapper, .yith-plugin-ui #wpbody-content h2.nav-tab-wrapper {
758
- background-color : transparent;
759
- border : 0;
760
- text-transform : none;
761
- border-bottom : 1px solid #ddd;
762
- }
763
-
764
- .yith-plugin-ui h2 {
765
- color : #2a8db0;
766
- font-size : 15px;
767
- text-transform : uppercase;
768
- border : 1px solid #d8d8d8;
769
- border-bottom : 0;
770
- background-color : #fff;
771
- padding : 35px 20px;
772
- margin : 0px;
773
- }
774
-
775
- .yith-plugin-ui .yith-plugin-fw-custom-tab h2 {
776
- border : 0px solid #d8d8d8;
777
- padding-left : 0;
778
- }
779
-
780
- .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 {
781
- padding : 30px 20px;
782
- }
783
- .yith-plugin-ui #plugin-fw-wc table.form-table tr.toggle-element-fixed td, #yith-plugin-fw-panel table.form-table tr.toggle-element-fixed td.forminp {
784
- padding: 0 20px 30px;
785
- }
786
- .yith-plugin-ui #plugin-fw-wc h2 + div {
787
- background : #fff;
788
- border-left : 1px solid #d9d9d9;
789
- border-right : 1px solid #d9d9d9;
790
- margin : -20px 0 0 0;
791
- padding-left : 20px;
792
- padding-bottom : 5px;
793
- }
794
-
795
- .yith-plugin-ui #plugin-fw-wc h2 + div p, .yith-plugin-ui p.info-box {
796
- background : #f1f1f1;
797
- font-size : 14px;
798
- font-weight : 700;
799
- width : 40%;
800
- display : block;
801
- padding : 15px;
802
- margin-bottom : 0;
803
- }
804
-
805
- .yith-plugin-ui #plugin-fw-wc h2 + div p:before, .yith-plugin-ui p.info-box:before {
806
- content : "\e90e";
807
- font-family : yith-icon;
808
- font-size : 30px;
809
- font-weight : normal;
810
- display : block;
811
- margin-top : -5px;
812
- float : left;
813
- margin-right : 15px;
814
- }
815
-
816
- .yith-plugin-ui h2:first-child {
817
- border-top : 0;
818
- }
819
-
820
- /*** Icon ***/
821
- .yith-plugin-ui span.yith-icon {
822
- margin-left : -36px;
823
- line-height : 36px;
824
- font-size : 20px;
825
- }
826
-
827
- /*** General Input Style ***/
828
-
829
- .yith-plugin-ui .yith-plugin-fw select,
830
- .yith-plugin-ui textarea,
831
- .yith-plugin-ui input[type=number],
832
- .yith-plugin-ui.metaboxes-tab input[type=number],
833
- .yith-plugin-ui input[type=text],
834
- .yith-plugin-ui input[type=text],
835
- .yith-plugin-ui input[type=email],
836
- .yith-plugin-ui input[type=password],
837
- .yith-plugin-ui .search-box input[name="s"],
838
- .yith-plugin-fw.yith-plugin-ui input[type=text]:not(.select2-search__field),
839
- .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table input[type=text]:not(.select2-search__field),
840
- .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table select,
841
- .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table textarea,
842
- .woocommerce .yith-plugin-fw table.form-table input[type=password],
843
- .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table input[type=number],
844
- .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table input[type=text] {
845
- border : 1px solid #d8d8d8;
846
- border-radius : 8px;
847
- padding : 8px 10px;
848
- height : 38px;
849
- min-width : 90px;
850
- box-shadow : none;
851
- color : #716269;
852
- }
853
-
854
- .yith-plugin-ui textarea,
855
- .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table textarea {
856
- height : auto;
857
- }
858
-
859
- .yith-plugin-ui input[type=text]:not(.select2-search__field).wp-color-picker,
860
- .yith-plugin-ui table.form-table input[type=text].wp-color-picker,
861
- .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table input[type=text].wp-color-picker {
862
- border: 0;
863
- height: 30px;
864
- max-width: 121px;
865
- font-size: 11px;
866
- padding: 0;
867
- }
868
-
869
- .yith-plugin-ui .search-box input[name="s"] {
870
- height : 35px;
871
- }
872
-
873
- .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table input[type=text].small-text,
874
- .yith-plugin-ui input[type=text].small-text {
875
- width : 100px;
876
- height : 25px;
877
- border : 1px solid #d9d9d9;
878
- }
879
-
880
- .yith-plugin-ui textarea {
881
- height : auto;
882
- padding : 8px;
883
- }
884
-
885
- .yith-plugin-ui select:focus,
886
- .yith-plugin-ui input:focus {
887
- border-color : #a7d9ec !important;
888
- }
889
-
890
- .woocommerce .yith-plugin-ui table.form-table select,
891
- .yith-plugin-ui select {
892
- -webkit-appearance : none;
893
- line-height : 1.2em;
894
- min-height : 35px;
895
- background : url("../images/arrow_down.svg") no-repeat right center;
896
- background-size : 35px 13px;
897
- border-radius : 8px;
898
- padding-left : 10px;
899
- }
900
-
901
- .yith-plugin-ui .form-table th {
902
- width : 200px;
903
- padding-right : 50px;
904
- }
905
-
906
- /** BUTTONS **/
907
- .wp-core-ui .yith-plugin-ui .button-primary,
908
- .wp-core-ui .yith-plugin-ui .button-secondary,
909
- .yith-plugin-ui .yith-add-button,
910
- .yith-plugin-ui .yith-save-button,
911
- .yith-plugin-ui .yith-edit-button,
912
- .yith-plugin-ui .yith-update-button,
913
- .yith-plugin-ui .yith-plugin-fw-select-all,
914
- .yith-plugin-ui .yith-plugin-fw-deselect-all,
915
- .yith-plugin-ui .yith-plugin-fw-upload-button,
916
- .yith-plugin-ui .yith-plugin-fw-upload-button-reset {
917
- border-radius : 3px;
918
- text-transform : uppercase;
919
- box-shadow : none;
920
- border : 0;
921
- font-weight : 700;
922
- font-size : 11px;
923
- padding : 0px 14px;
924
- outline : none;
925
- height : auto;
926
- transition : all ease 0.3s;
927
- background-color : #d6d6d6;
928
- color : #656565;
929
- text-shadow : none;
930
- vertical-align : middle;
931
- line-height : 26px;
932
- display : inline-block;
933
- text-decoration : none;
934
- cursor : pointer;
935
- }
936
-
937
- .wp-core-ui .yith-plugin-ui .button-secondary.yith-plugin-fw-upload-button-reset,
938
- .wp-core-ui .yith-plugin-ui .button-secondary.yith-plugin-fw-upload-button,
939
- .yith-plugin-ui .yith-plugin-fw-upload-button-reset,
940
- .yith-plugin-ui .button-secondary.yith-plugin-fw-upload-button-reset,
941
- .yith-plugin-ui .button-secondary.yith-plugin-fw-upload-button {
942
- height : 38px;
943
- }
944
-
945
- .wp-core-ui .yith-plugin-ui .button:focus,
946
- .wp-core-ui .yith-plugin-ui .button-primary:focus,
947
- .yith-plugin-ui .yith-add-button:focus,
948
- .yith-plugin-ui .yith-save-button:focus,
949
- .yith-plugin-ui .yith-edit-button:focus,
950
- .yith-plugin-ui .yith-update-button:focus,
951
- .wp-core-ui .yith-plugin-ui .button-secondary:focus {
952
- outline : none;
953
- box-shadow : none;
954
- }
955
-
956
- .wp-core-ui .yith-plugin-ui .button-xl {
957
- padding : 0px 20px;
958
- font-size : 14px;
959
- line-height : 38px;
960
- display : inline-block;
961
- font-weight : 600;
962
- }
963
-
964
- /** button with inside a span with icon class */
965
- .yith-plugin-ui .button-secondary span.yith-icon {
966
- margin-left : 0px;
967
- margin-right : 10px;
968
- line-height : normal;
969
- }
970
-
971
- .yith-plugin-ui .button-secondary span.yith-icon:before {
972
- color : #656565;
973
- font-size : 15px;
974
- }
975
-
976
-
977
- .wp-core-ui .yith-plugin-ui .button:focus,
978
- .wp-core-ui .yith-plugin-ui .button-secondary:focus,
979
- .yith-plugin-ui .yith-save-button:hover,
980
- .wp-core-ui .yith-plugin-ui .button-secondary:hover,
981
- .yith-plugin-ui .yith-plugin-fw-upload-button-reset:hover {
982
- background-color : #cacaca;
983
- color : #515151;
984
- }
985
-
986
- .wp-core-ui .yith-plugin-ui .button-primary,
987
- .yith-plugin-ui .button-secondary.yith-plugin-fw-select-all,
988
- .yith-plugin-ui .button-secondary.yith-plugin-fw-upload-button {
989
- background-color : #007694;
990
- color : #fff;
991
- }
992
-
993
-
994
- .yith-plugin-ui .yith-add-button,
995
- .wp-core-ui .yith-plugin-ui .button-primary:focus,
996
- .wp-core-ui .yith-plugin-ui .button-primary:hover {
997
- background-color : #375f6b;
998
- color : #fff;
999
- cursor : pointer;
1000
- }
1001
-
1002
-
1003
- .yith-plugin-ui .yith-add-button:hover,
1004
- .wp-core-ui .yith-plugin-ui .yith-plugin-fw-upload-button:focus,
1005
- .yith-plugin-ui .button-secondary.yith-plugin-fw-select-all:hover,
1006
- .yith-plugin-ui .button-secondary.yith-plugin-fw-select-all:focus,
1007
- .yith-plugin-ui .yith-plugin-fw-upload-button:hover {
1008
- border-color : #007694;
1009
- background : #007694;
1010
- color : #fff;
1011
- line-height : 26px;
1012
- margin-left : 0;
1013
- }
1014
-
1015
- .yith-plugin-ui .button-primary:before,
1016
- .yith-plugin-ui .yith-add-button:before,
1017
- .yith-plugin-ui .yith-save-button:before,
1018
- .yith-plugin-ui .yith-edit-button:before,
1019
- .yith-plugin-ui .yith-update-button:before,
1020
- .yith-plugin-ui .button-secondary:before {
1021
- font-family : 'yith-icon';
1022
- font-size : 10px;
1023
- font-weight : 700;
1024
- margin-right : 10px;
1025
- vertical-align : bottom;
1026
- display : inline-block;
1027
- }
1028
-
1029
- /** yith-edit-button **/
1030
- .yith-plugin-ui .yith-edit-button {
1031
- background-color : #7f9298;
1032
- color : #fff;
1033
- }
1034
-
1035
- .yith-plugin-ui .yith-edit-button:focus,
1036
- .yith-plugin-ui .yith-edit-button:hover {
1037
- background-color : #718085;
1038
- color : #fff;
1039
- }
1040
-
1041
- .yith-plugin-ui .yith-edit-button:before {
1042
- content : "\e907";
1043
- }
1044
-
1045
- /** yith-update-button **/
1046
- .yith-plugin-ui .yith-update-button {
1047
- background-color : #94aa09;
1048
- color : #fff;
1049
- }
1050
-
1051
- .yith-plugin-ui .yith-update-button:focus,
1052
- .yith-plugin-ui .yith-update-button:hover {
1053
- background-color : #7a9009;
1054
- color : #fff;
1055
- }
1056
-
1057
- .yith-plugin-ui .yith-update-button:before {
1058
- content : "\e90b";
1059
- font-size : 15px;
1060
- }
1061
-
1062
- /** yith-save-button **/
1063
-
1064
- .yith-plugin-ui .yith-save-button {
1065
- background-color : #267390;
1066
- color : #fff;
1067
- }
1068
-
1069
- .yith-plugin-ui .yith-save-button:focus,
1070
- .yith-plugin-ui .yith-save-button:hover {
1071
- background-color : #1c4863;
1072
- color : #fff;
1073
- }
1074
-
1075
-
1076
- /** yith-remove-button **/
1077
-
1078
- .yith-plugin-ui .button-secondary.yith-remove-button:before {
1079
- content : "\e90d";
1080
- font-size : 15px;
1081
- }
1082
-
1083
-
1084
- /** yith-add-button **/
1085
- .yith-plugin-ui .yith-add-button:before {
1086
- content : "\e90a";
1087
- }
1088
-
1089
- .yith-plugin-ui .yith-add-button.closed {
1090
- background-color : #fff;
1091
- color : #375f6b;
1092
- border : 1px solid #375f6b;
1093
- }
1094
-
1095
- .yith-plugin-ui .yith-add-button.closed:before {
1096
- content : "\e906";
1097
- }
1098
-
1099
-
1100
- /** yith-plugin-fw-upload-button **/
1101
- .yith-plugin-ui button.yith-plugin-fw-upload-button:before {
1102
- content : "\e90c";
1103
- font-family : 'yith-icon';
1104
- font-size : 19px;
1105
- font-weight : 400;
1106
- margin-right : 10px;
1107
- vertical-align : middle;
1108
- display : inline-block;
1109
- }
1110
-
1111
- /** SELECT 2 **/
1112
- .yith-plugin-ui .select2-container,
1113
- .yith-plugin-ui .select2-selection--single {
1114
- height : auto;
1115
- padding : 2px;
1116
- outline : none;
1117
- }
1118
-
1119
- .yith-plugin-ui .select2-container .select2-selection--single,
1120
- .yith-plugin-ui .select2-container .select2-selection--multiple,
1121
- .yith-plugin-ui .select2-container.select2-container--focus .select2-selection--single,
1122
- .yith-plugin-ui .select2-container.select2-container--focus .select2-selection--multiple,
1123
- .yith-plugin-ui .select2-container.select2-container--open .select2-selection--single,
1124
- .yith-plugin-ui .select2-container.select2-container--open .select2-selection--multiple{
1125
- margin : 0;
1126
- border : 0;
1127
- box-shadow : none;
1128
- }
1129
-
1130
- .yith-plugin-ui .select2-container .select2-selection--single .select2-selection__arrow{
1131
- background: none;
1132
- }
1133
-
1134
- /* old panel*/
1135
-
1136
- .yith-plugin-ui span.select2.select2-container.select2-container--default,
1137
- span.select2.select2-container.select2-container--default.yith-plugin-fw-select2-container {
1138
- border : 1px solid #d8d8d8;
1139
- border-radius : 8px;
1140
- }
1141
-
1142
- .yith-plugin-ui span.select2.select2-container.select2-container--default:hover,
1143
- .yith-plugin-ui span.select2.select2-container.select2-container--default:active,
1144
- .yith-plugin-ui span.select2.select2-container.select2-container--default:focus {
1145
- border-color : #a7d9ec;
1146
- }
1147
-
1148
- .yith-plugin-ui .select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
1149
- color : #fff;
1150
- }
1151
-
1152
- .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table input[type=text].select2-search__field,
1153
- .yith-plugin-ui .yith-plugin-fw table.form-table input.select2-search__field {
1154
- border : 0;
1155
- padding : 0;
1156
- height : initial;
1157
- }
1158
-
1159
- .yith-plugin-ui .select2-container--default .select2-selection--multiple .select2-selection__choice,
1160
- .yith-plugin-ui .select2-selection__choice {
1161
- color : #fff;
1162
- background-color : #4e8ba2;
1163
- border-radius : 12px;
1164
- padding : 3px 11px;
1165
- border-color : #4e8ba2;
1166
- font-size : 13px;
1167
- }
1168
-
1169
- .yith-plugin-ui .select2-container--default .select2-selection--single .select2-selection__arrow:before {
1170
- content : "\e900";
1171
- font-family : 'yith-icon' !important;
1172
- line-height : 36px;
1173
- color : #d9d9d9;
1174
- }
1175
-
1176
- .yith-plugin-ui .select2-container--default .select2-selection--single .select2-selection__arrow b {
1177
- display : none;
1178
- }
1179
-
1180
- .yith-plugin-fw-select2-container.select2-container--open .select2-dropdown--below,
1181
- .yith-plugin-fw-select2-container.select2-container--open .select2-dropdown--above {
1182
- margin-top : 10px;
1183
- border-radius : 8px;
1184
- box-shadow : 0 2px 4px 0 rgba(0, 0, 0, 0.12), 0 2px 10px 0 rgba(0, 0, 0, 0.12) !important;
1185
- }
1186
-
1187
- .yith-plugin-fw-select2-container.select2-container--open .select2-dropdown--above {
1188
- margin-top : -10px;
1189
- }
1190
-
1191
- .yith-plugin-fw-select2-container.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,
1192
- .yith-plugin-fw-select2-container.select2-container--default.select2-container--open.select2-container--above .select2-selection--single {
1193
- border-radius : 8px;
1194
- }
1195
-
1196
- .yith-plugin-fw-select2-container .select2-results .select2-results__group, .select2-results .select2-results__option:first-child {
1197
- border-top-left-radius : 8px;
1198
- border-top-right-radius : 8px;
1199
- }
1200
-
1201
- .yith-plugin-fw-select2-container .select2-results .select2-results__group,
1202
- .yith-plugin-fw-select2-container .select2-results .select2-results__option:last-child {
1203
- border-bottom-left-radius : 8px;
1204
- border-bottom-right-radius : 8px;
1205
- }
1206
-
1207
- .yith-plugin-fw-select2-container .select2-dropdown {
1208
- border : 0;
1209
- }
1210
-
1211
- .yith-plugin-fw-select2-container.select2-container--default .select2-results__option[data-selected=true] {
1212
- background-color : #fff;
1213
- outline : none;
1214
- }
1215
-
1216
- .yith-plugin-fw-select2-container.select2-container--default .select2-results__option--highlighted[aria-selected] {
1217
- background-color : #e8eff1;
1218
- color : #4e8ba2;
1219
- outline : none;
1220
- }
1221
-
1222
- .yith-plugin-ui .select2-container--default .select2-selection--multiple .select2-selection__choice__remove,
1223
- .yith-plugin-fw-panel .select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
1224
- float : right;
1225
- padding-left : 15px;
1226
- text-indent : -9999px;
1227
- }
1228
-
1229
-
1230
- .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:after,
1231
- .woocommerce .yith-plugin-ui .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:after,
1232
- .yith-plugin-ui .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:after {
1233
- float : right;
1234
- color : #fff;
1235
- content : "\e906";
1236
- font-family : 'yith-icon' !important;
1237
- font-size : 9px;
1238
- line-height : 21px;
1239
- text-indent : 0;
1240
- }
1241
-
1242
- .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:after {
1243
- color : #000;
1244
- }
1245
-
1246
- .yith-plugin-ui .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:after
1247
- .yith-plugin-fw-panel .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:after {
1248
- color : #000;
1249
- }
1250
-
1251
- .yith-plugin-ui .select2-container .select2-selection--multiple,
1252
- .yith-plugin-ui .select2-container--default.select2-container--focus .select2-selection--multiple {
1253
- border : 0;
1254
- }
1255
-
1256
- .yith-plugin-fw .select2-search input[type=text] {
1257
- border : 0;
1258
- padding : 0;
1259
- height : auto;
1260
- }
1261
-
1262
- .yith-plugin-ui .yith-plugin-fw-select-field-wrapper span.yith-icon.yith-icon-magnifier,
1263
- .yith-plugin-fw-panel .yith-plugin-fw-select-field-wrapper span.yith-icon.yith-icon-magnifier {
1264
- position : absolute;
1265
- padding-top : 5px;
1266
- }
1267
-
1268
- .yith-plugin-ui input[type=text].select2-search__field {
1269
- border : 0;
1270
- padding : 0;
1271
- height : 30px;
1272
- }
1273
-
1274
- .yith-plugin-ui .select2-container--default .select2-search--dropdown .select2-search__field,
1275
- .yith-plugin-fw-panel .select2-container--default .select2-search--dropdown .select2-search__field {
1276
- border : 1px solid #d9d9d9;
1277
- border-radius : 8px;
1278
- box-shadow : none;
1279
- }
1280
-
1281
- .yith-plugin-ui .select2-dropdown,
1282
- .yith-plugin-fw-panel .select2-dropdown {
1283
- border : 1px solid #d9d9d9;
1284
- }
1285
-
1286
- /** RADIO BUTTON **/
1287
- .yith-plugin-ui [type="radio"]:checked,
1288
- .yith-plugin-ui [type="radio"]:not(:checked) {
1289
- position : absolute;
1290
- left : -9999px;
1291
- }
1292
-
1293
- .yith-plugin-ui [type="radio"]:checked + label,
1294
- .yith-plugin-ui [type="radio"]:not(:checked) + label {
1295
- position : relative;
1296
- padding-left : 35px;
1297
- cursor : pointer;
1298
- line-height : 20px;
1299
- display : inline-block;
1300
- color : #716269;
1301
- font-size : 14px;
1302
- }
1303
-
1304
- .yith-plugin-ui [type="radio"]:checked + label:before,
1305
- .yith-plugin-ui [type="radio"]:not(:checked) + label:before {
1306
- content : '';
1307
- position : absolute;
1308
- left : 0;
1309
- top : 0;
1310
- width : 19px;
1311
- height : 19px;
1312
- border : 1px solid #d8d8d8;
1313
- border-radius : 100%;
1314
- background : #fff;
1315
- }
1316
-
1317
- .yith-plugin-ui [type="radio"]:checked + label:after,
1318
- .yith-plugin-ui [type="radio"]:not(:checked) + label:after {
1319
- content : '';
1320
- width : 13px;
1321
- height : 13px;
1322
- background : #4e8ba2;
1323
- position : absolute;
1324
- top : 4px;
1325
- left : 4px;
1326
- border-radius : 100%;
1327
- -webkit-transition : all 0.2s ease;
1328
- transition : all 0.2s ease;
1329
- }
1330
-
1331
- .yith-plugin-ui [type="radio"]:not(:checked) + label:after {
1332
- opacity : 0;
1333
- -webkit-transform : scale(0);
1334
- transform : scale(0);
1335
- }
1336
-
1337
- .yith-plugin-ui [type="radio"]:checked + label:after {
1338
- opacity : 1;
1339
- -webkit-transform : scale(1);
1340
- transform : scale(1);
1341
- }
1342
-
1343
- /** CHECKBOX **/
1344
- .yith-plugin-ui input[type="checkbox"] {
1345
- -webkit-appearance : none;
1346
- background-color : #fff;
1347
- border : 1px solid #d8d8d8;
1348
- box-shadow : none;
1349
- width : 18px;
1350
- height : 18px;
1351
- border-radius : 3px;
1352
- display : inline-block;
1353
- position : relative;
1354
- }
1355
-
1356
- .yith-plugin-ui input[type="checkbox"]:checked {
1357
- background-color : #4e8ba2;
1358
- border-color : #488197;
1359
- }
1360
-
1361
- .yith-plugin-ui .forminp-checkbox span.description.inline {
1362
- margin-left : 10px;
1363
- }
1364
-
1365
- .yith-plugin-ui input[type="checkbox"]:checked:before {
1366
- display : none;
1367
- }
1368
-
1369
- .yith-plugin-ui input[type="checkbox"]:checked:after {
1370
- content : "\e905";
1371
- font-family : 'yith-icon';
1372
- font-size : 15px;
1373
- position : absolute;
1374
- top : 8px;
1375
- left : 1px;
1376
- color : #fff;
1377
- }
1378
-
1379
- /** ONOFF **/
1380
- .yith-plugin-ui .yith-plugin-fw-onoff-container input[type="checkbox"] {
1381
- display : none;
1382
- }
1383
-
1384
- .yith-plugin-ui .yith-plugin-fw-onoff-container input + span {
1385
- border : 1px solid #d8d8d8;
1386
- background-color : #fff;
1387
- width : 60px;
1388
- height : 24px;
1389
- }
1390
-
1391
- .yith-plugin-ui .yith-plugin-fw-onoff-container input + span:before {
1392
- background-color : #d8d8d8;
1393
- }
1394
-
1395
- .yith-plugin-ui .yith-plugin-fw-onoff-container input + span:before {
1396
- width : 14px;
1397
- height : 14px;
1398
- top : 5px;
1399
- left : 6px;
1400
- background-color : #d8d8d8;
1401
- }
1402
-
1403
- .yith-plugin-ui .yith-plugin-fw-onoff-container input + span:after {
1404
- content : 'OFF';
1405
- width : 14px;
1406
- height : 14px;
1407
- font-size : 13px;
1408
- font-weight : 600;
1409
- padding-left : 27px;
1410
- color : #979797;
1411
- margin-top : 5px;
1412
- display : inline-block;
1413
- white-space : nowrap;
1414
- }
1415
-
1416
- .yith-plugin-ui .yith-plugin-fw-onoff-container input:checked + span,
1417
- .yith-plugin-ui .yith-plugin-fw-onoff-container input.onoffchecked + span {
1418
- background-color : #fff;
1419
- border-color : #98aa36;
1420
- }
1421
-
1422
- .yith-plugin-ui .yith-plugin-fw-onoff-container input:checked + span:before,
1423
- .yith-plugin-ui.yith-plugin-fw-onoff-container input.onoffchecked + span:before {
1424
- background-color : #98aa36;
1425
- left : 41px;
1426
- }
1427
-
1428
- .yith-plugin-ui .yith-plugin-fw-onoff-container input:checked + span:after,
1429
- .yith-plugin-ui.yith-plugin-fw-onoff-container input.onoffchecked + span:after {
1430
- content : 'ON';
1431
- color : #98aa36;
1432
- width : 14px;
1433
- height : 14px;
1434
- display : inline-block;
1435
- font-size : 13px;
1436
- font-weight : 600;
1437
- padding : 0 10px;
1438
- margin-top : 5px;
1439
- white-space : nowrap;
1440
- }
1441
-
1442
- .yith-plugin-ui .yith-plugin-fw-onoff-container input + span {
1443
- text-indent : 0;
1444
- }
1445
-
1446
-
1447
- /**
1448
- DATEPICKER
1449
- */
1450
- div#ui-datepicker-div.yith-plugin-fw-datepicker-div {
1451
- border : 0;
1452
- box-shadow : 0 2px 4px 0 rgba(0, 0, 0, 0.12), 0 2px 10px 0 rgba(0, 0, 0, 0.12) !important;
1453
- }
1454
-
1455
- #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-datepicker-header.ui-widget-header {
1456
- background : #4e8ba2;
1457
- color : #fff;
1458
- font-size : 11px;
1459
- line-height : 25px;
1460
- border : 0;
1461
- min-height : 25px;
1462
- }
1463
-
1464
- #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-datepicker-title {
1465
- line-height : 25px;
1466
- }
1467
-
1468
- #ui-datepicker-div.yith-plugin-fw-datepicker-div.ui-datepicker th {
1469
- color : #716269;
1470
- }
1471
-
1472
- #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-widget-header .ui-icon,
1473
- #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-widget-header .ui-state-hover,
1474
- #ui-datepicker-div.yith-plugin-fw-datepicker-div.ui-datepicker .ui-datepicker-prev,
1475
- #ui-datepicker-div.yith-plugin-fw-datepicker-div.ui-datepicker .ui-datepicker-next,
1476
- #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-icon.ui-icon-circle-triangle-w,
1477
- #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-icon.ui-icon-circle-triangle-e {
1478
- background : none;
1479
- content : "";
1480
- border : 0;
1481
- text-indent : 0;
1482
- width : 15px;
1483
- height : 20px;
1484
- display : block;
1485
- overflow : hidden;
1486
- }
1487
-
1488
- .yith-plugin-ui .yith-password-wrapper {
1489
- display : inline-block;
1490
- width : auto;
1491
- position : relative;
1492
- }
1493
-
1494
- .yith-plugin-ui .yith-password-wrapper .yith-password-eye-closed:before,
1495
- .yith-plugin-ui .yith-password-wrapper .yith-password-eye:before {
1496
- content : '\e911';
1497
- color : #999;
1498
- font-family : 'yith-icon';
1499
- font-size : 20px;
1500
- font-weight : normal;
1501
- width : 15px;
1502
- display : block;
1503
- position : absolute;
1504
- right : 13px;
1505
- top : 0;
1506
- line-height : 38px;
1507
- bottom : 0;
1508
- cursor : pointer;
1509
- }
1510
-
1511
- .yith-plugin-ui .yith-password-wrapper .yith-password-eye-closed:before {
1512
- content : '\e912';
1513
- }
1514
-
1515
- #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-icon.ui-icon-circle-triangle-w:before {
1516
- content : "\e901";
1517
- color : #fff;
1518
- font-family : 'yith-icon';
1519
- font-size : 12px;
1520
- font-weight : normal;
1521
- width : 15px;
1522
- display : block;
1523
- }
1524
-
1525
- #ui-datepicker-div.yith-plugin-fw-datepicker-div .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
- #ui-datepicker-div.yith-plugin-fw-datepicker-div.ui-datepicker .ui-datepicker-prev,
1538
- #ui-datepicker-div.yith-plugin-fw-datepicker-div.ui-datepicker .ui-datepicker-next,
1539
- #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-datepicker-prev.ui-datepicker-prev-hover,
1540
- #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-datepicker-prev.ui-datepicker-next-hover {
1541
- top : 1px;
1542
- cursor : pointer;
1543
- }
1544
-
1545
- #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-datepicker-prev.ui-datepicker-prev,
1546
- #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-datepicker-prev.ui-datepicker-prev-hover {
1547
- left : 5px;
1548
- }
1549
-
1550
- #ui-datepicker-div.yith-plugin-fw-datepicker-div.ui-datepicker .ui-datepicker-next,
1551
- #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-datepicker-next.ui-datepicker-next-hover {
1552
- right : 1px;
1553
- }
1554
-
1555
- #ui-datepicker-div.yith-plugin-fw-datepicker-div.ui-datepicker table {
1556
- font-size : 10px;
1557
- }
1558
-
1559
- #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-state-default,
1560
- #ui-datepicker-div.yith-plugin-fw-datepicker-div.ui-widget-content .ui-state-default,
1561
- #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-widget-header .ui-state-default {
1562
- background : #fff;
1563
- border : 1px solid #d9d9d9;
1564
-
1565
- }
1566
-
1567
- #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-state-hover,
1568
- #ui-datepicker-div.yith-plugin-fw-datepicker-div.ui-widget-content .ui-state-hover,
1569
- #ui-datepicker-div.yith-plugin-fw-datepicker-div a.ui-state-default:focus,
1570
- #ui-datepicker-div.yith-plugin-fw-datepicker-div.ui-widget-content .ui-state-focus,
1571
- #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-widget-header .ui-state-focus {
1572
- background : #ebf1f3;
1573
- border : 1px solid #bfd5dd;
1574
- outline : none;
1575
- box-shadow : none;
1576
- }
1577
-
1578
- #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-widget-header .ui-state-hover,
1579
- .woocommerce #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-state-focus {
1580
- background : none;
1581
- border : 0;
1582
- }
1583
-
1584
- /** colorpicker **/
1585
- .yith-plugin-ui .iris-slider-offset.ui-slider.ui-widget-content {
1586
- background : transparent !important;
1587
- height : auto !important;
1588
- }
1589
-
1590
- .yith-plugin-ui .yith-plugin-fw-field-wrapper .yith-colorpicker-group:not(:first-child) {
1591
- margin-top : 20px;
1592
- }
1593
-
1594
- .yith-plugin-ui .yith-plugin-fw-field-wrapper .iris-picker,
1595
- .yith-plugin-ui .yith-plugin-fw-field-wrapper .wp-picker-holder {
1596
- display : none !important;
1597
- }
1598
-
1599
- .yith-plugin-ui .yith-plugin-fw-field-wrapper .wp-picker-input-wrap,
1600
- .yith-plugin-ui .yith-plugin-fw-field-wrapper .wp-picker-input-wrap > * {
1601
- display: inline-block !important;
1602
- vertical-align: middle;
1603
- }
1604
-
1605
- .yith-plugin-ui .yith-plugin-fw-field-wrapper .wp-picker-active .iris-picker,
1606
- .yith-plugin-ui .yith-plugin-fw-field-wrapper .wp-picker-active .wp-picker-holder {
1607
- display : block !important;
1608
- }
1609
-
1610
- .woocommerce .yith-plugin-ui .iris-picker {
1611
- border : 0;
1612
- margin-top : 20px;
1613
- }
1614
-
1615
- .yith-plugin-ui .yith-plugin-fw input[type=text].wp-color-picker {
1616
- border : 0;
1617
- padding : 2px 5px;
1618
- height : 30px;
1619
- }
1620
-
1621
- .yith-plugin-ui .wp-color-result-text {
1622
- display : none;
1623
- }
1624
-
1625
- .yith-plugin-ui .wp-picker-container .wp-color-result.button {
1626
- width : 30px;
1627
- height : 30px;
1628
- box-shadow : none;
1629
- border : 1px solid #d9d9d9;
1630
- margin-bottom : 0;
1631
- padding : 0;
1632
- display : inline-block;
1633
- vertical-align : middle;
1634
- box-sizing : content-box;
1635
- }
1636
-
1637
- .yith-plugin-ui .wp-picker-default-custom {
1638
- cursor : pointer;
1639
- width : 25px;
1640
- padding : 0 5px;
1641
- display : inline-block;
1642
- vertical-align : middle;
1643
- position : relative;
1644
- }
1645
-
1646
- .yith-plugin-ui .wp-picker-default-custom input.button {
1647
- opacity : 0;
1648
- margin : 0;
1649
- padding : 0;
1650
- position : absolute;
1651
- top : 0;
1652
- right : 0;
1653
- left : 0;
1654
- bottom : 0;
1655
- z-index : 2;
1656
- }
1657
-
1658
- .yith-plugin-ui .wp-picker-default-custom:before {
1659
- content: "\e91a";
1660
- text-indent : 0;
1661
- font-family : 'yith-icon';
1662
- font-size : 20px;
1663
- color : #d8d8d8;
1664
- font-weight : normal;
1665
- width : 15px;
1666
- display : block;
1667
- background : none;
1668
- line-height : 20px;
1669
- margin-left : 8px;
1670
- }
1671
-
1672
- .yith-plugin-ui .wp-picker-container {
1673
- width : auto;
1674
- display : inline-block;
1675
- border : 1px solid #d9d9d9;
1676
- border-radius : 8px;
1677
- padding : 5px;
1678
- }
1679
-
1680
- .yith-plugin-ui .iris-picker .iris-square-inner {
1681
- box-shadow : none;
1682
- border : 1px solid #d9d9d9;
1683
- }
1684
-
1685
- .yith-plugin-ui .yith-single-colorpicker {
1686
- display : inline-block;
1687
- width : 220px;
1688
- }
1689
-
1690
- .yith-plugin-ui .yith-single-colorpicker > label {
1691
- display : block;
1692
- font-size : 11px;
1693
- font-weight : 600;
1694
- margin : 0 0 10px 0;
1695
- }
1696
-
1697
- /* RANGE SLIDER */
1698
- .yith-plugin-ui .yith-plugin-fw-slider-container .ui-slider-horizontal .ui-slider-handle {
1699
- top : -45px !important;
1700
- }
1701
-
1702
- .yith-plugin-ui .yith-plugin-fw-slider-container .ui-slider-horizontal .ui-slider-handle {
1703
- position : absolute;
1704
- top : -33px;
1705
- left : 0;
1706
- width : auto !important;
1707
- height : auto !important;
1708
- padding : 2px 8px;
1709
- margin-left : -15px;
1710
- font-size : 12px;
1711
- line-height : 20px;
1712
- color : #4e8ba2;
1713
- text-align : center;
1714
- background-color : #fff;
1715
- border : 1px solid #fff;
1716
- border-radius : 3px;
1717
- -webkit-transition : opacity .3s ease-in-out 0s;
1718
- transition : opacity .3s ease-in-out 0s;
1719
- box-shadow : 0px 1px 7px 0px rgba(1, 1, 1, 0.13);
1720
- }
1721
-
1722
- .yith-plugin-ui .yith-plugin-fw-slider-container .ui-slider-horizontal .ui-slider-handle:before {
1723
- position : absolute;
1724
- bottom : -3px;
1725
- left : 50%;
1726
- display : inline-block;
1727
- width : 6px;
1728
- height : 6px;
1729
- margin-left : -3px;
1730
- content : "";
1731
- background-color : #fff;
1732
- -webkit-transform : rotate(-45deg);
1733
- -ms-transform : rotate(-45deg);
1734
- transform : rotate(-45deg);
1735
- }
1736
-
1737
- .yith-plugin-ui .yith-plugin-fw-slider-container .ui-slider.ui-widget-content .ui-widget-header {
1738
- background : #4e8ba2;
1739
- }
1740
-
1741
- .yith-plugin-ui .yith-plugin-fw-slider-container .ui-slider-horizontal .ui-slider-handle:after {
1742
- content : '';
1743
- width : 17px;
1744
- height : 17px;
1745
- display : block;
1746
- position : absolute;
1747
- background : #fff;
1748
- top : 37px;
1749
- border-radius : 50%;
1750
- box-shadow : 0px 1px 6px 0px rgba(1, 1, 1, 0.25);
1751
- cursor : grab;
1752
- }
1753
-
1754
- .yith-plugin-ui .yith-plugin-fw-slider-container .ui-slider-horizontal .ui-slider-handle:active:after{
1755
- cursor : grabbing;
1756
- }
1757
-
1758
- .yith-plugin-ui .yith-plugin-fw-slider-container .ui-slider.ui-widget-content {
1759
- height : 5px !important;
1760
- }
1761
-
1762
- .yith-plugin-ui .yith-plugin-fw-slider-container .ui-slider .minCaption,
1763
- .yith-plugin-ui .yith-plugin-fw-slider-container .ui-slider .maxCaption {
1764
- font-weight : 700;
1765
- font-size : 12px;
1766
- }
1767
-
1768
-
1769
- /* ADD_BOX AND TOGGLE */
1770
- .yith-plugin-ui .yith-add-box,
1771
- .yith-plugin-ui .yith-toggle-row {
1772
- width : 70%;
1773
- border : 1px solid #d9d9d9;
1774
- box-shadow : none;
1775
- border-radius : 4px;
1776
- margin : 20px 0;
1777
- padding : 10px;
1778
- box-sizing : border-box;
1779
- background : white;
1780
- }
1781
-
1782
- .yith-plugin-ui .yith-toggle-row {
1783
- cursor : pointer;
1784
- transition : all ease 0.5s;
1785
- }
1786
- .yith-plugin-ui .yith-toggle-row.fixed {
1787
- margin: 0;
1788
- }
1789
- .yith-plugin-ui .yith-toggle-row.highlight {
1790
- transition : all ease 0.5s;
1791
- /*box-shadow: 0 0 7px rgb(81, 117, 129);*/
1792
- box-shadow : 0 0 7px rgb(30, 140, 190);
1793
-
1794
- display : block;
1795
- }
1796
-
1797
- .yith-plugin-ui .yith-add-box {
1798
- padding : 25px;
1799
- display : none;
1800
- }
1801
-
1802
- .yith-plugin-ui .yith-toggle-title {
1803
- position : relative;
1804
- }
1805
-
1806
- .yith-plugin-ui #plugin-fw-wc .yith-toggle-title h3,
1807
- .yith-plugin-ui.metaboxes-tab h3,
1808
- .yith-plugin-ui .yith-toggle-title h3 {
1809
- padding : 0px 20px 0px 25px;
1810
- margin : 3px 0;
1811
-
1812
- display : inline-block;
1813
- position : relative;
1814
- min-width : 173px;
1815
- box-sizing : border-box;
1816
- font-weight : 600;
1817
- font-size : 15px;
1818
- color : #23282d;
1819
- text-transform : inherit;
1820
- }
1821
-
1822
- .yith-plugin-ui .yith-toggle-title .subtitle {
1823
- padding-left : 0;
1824
- padding-top : 8px;
1825
- font-size : 12px;
1826
- }
1827
-
1828
- .yith-plugin-ui .yith-toggle {
1829
- position : absolute;
1830
- width : 30px;
1831
- cursor : pointer;
1832
- left : 0;
1833
- top : 0;
1834
- bottom : 0;
1835
- margin : auto;
1836
- display : flex;
1837
- align-items : center;
1838
- }
1839
-
1840
- .yith-plugin-ui .yith-toggle > span:before {
1841
- color : #405e69;
1842
- }
1843
-
1844
- .yith-plugin-ui .yith-toggle > span {
1845
- position : absolute;
1846
- right : 50%;
1847
- transition : transform .3s;
1848
- line-height : 1;
1849
- }
1850
-
1851
-
1852
- .yith-plugin-ui .yith-toggle-row-opened .yith-toggle span {
1853
- transform : rotateZ(90deg);
1854
- }
1855
-
1856
- .yith-plugin-ui .yith-toggle-content {
1857
- display : none;
1858
- position : relative;
1859
- padding : 30px 25px;
1860
- }
1861
-
1862
- .yith-plugin-ui .yith-toggle-row-opened .yith-toggle-content {
1863
- /* display: block;*/
1864
- }
1865
-
1866
- .yith-plugin-ui .yith-add-box-row,
1867
- .yith-plugin-ui .yith-toggle-row-opened .yith-toggle-content .yith-toggle-content-row {
1868
- display : table;
1869
- margin-bottom : 40px;
1870
- }
1871
-
1872
- .yith-plugin-ui .yith-add-box-row label,
1873
- .yith-plugin-ui .yith-toggle-row-opened .yith-toggle-content .yith-toggle-content-row > label {
1874
- display : table-cell;
1875
- width : 200px;
1876
- padding-right : 21px;
1877
- color : #33373b;
1878
- font-size : 14px;
1879
- vertical-align : top;
1880
- font-weight : 600;
1881
- }
1882
-
1883
- .yith-plugin-ui .yith-add-box-row .yith-plugin-fw-field-wrapper:not(.yith-plugin-fw-title-field-wrapper),
1884
- .yith-plugin-ui .yith-toggle-row-opened .yith-plugin-fw-field-wrapper:not(.yith-plugin-fw-title-field-wrapper) {
1885
- /* display: table-cell;*/
1886
- width : auto;
1887
- float : none;
1888
- vertical-align : middle;
1889
- position : relative;
1890
- }
1891
-
1892
- .yith-plugin-ui .yith-add-box-row span.yith-icon,
1893
- .yith-plugin-ui .yith-toggle-row-opened .yith-toggle-content .yith-toggle-content-row span.yith-icon {
1894
- position : absolute;
1895
- right : 15px;
1896
- top : 0;
1897
- bottom : 0;
1898
- }
1899
-
1900
- .yith-plugin-ui .yith-add-box-buttons,
1901
- .yith-plugin-ui .yith-toggle-content-buttons {
1902
- text-align : right;
1903
- }
1904
-
1905
- .yith-plugin-ui .yith-toggle-onoff {
1906
- position : absolute;
1907
- cursor : pointer;
1908
- right : 0;
1909
- }
1910
-
1911
- .yith-plugin-ui .yith-toggle_wrapper.ui-sortable .yith-toggle-onoff {
1912
- right : 30px;
1913
- }
1914
-
1915
- .yith-plugin-ui .yith-toggle-row .yith-icon-drag {
1916
- position : absolute;
1917
- right : 0;
1918
- top : 25%;
1919
- bottom : 0;
1920
- line-height : 1;
1921
- }
1922
-
1923
- .yith-plugin-ui .yith-toggle-row.with-subtitle .yith-toggle-onoff {
1924
- top : 25%;
1925
- }
1926
-
1927
- /** SPINNER **/
1928
- .yith-plugin-ui .spinner {
1929
- vertical-align : -5px;
1930
- float : none;
1931
- }
1932
-
1933
- .yith-plugin-ui .spinner.show {
1934
- visibility : visible;
1935
- }
1936
-
1937
- /* LIST TABLE */
1938
- .yith-plugin-ui .form-table .list-table td {
1939
- padding : 15px 0px;
1940
- }
1941
-
1942
- .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table .bulkactions select {
1943
- border : 1px solid #d8d8d8;
1944
- max-width : 200px;
1945
- max-height : 30px;
1946
- padding : 0 10px;
1947
- }
1948
-
1949
- .yith-plugin-ui .form-table .list-table th {
1950
- width : initial;
1951
- }
1952
-
1953
- .yith-plugin-ui #plugin-fw-wc table.form-table th.check-column {
1954
- padding-left : 3px;
1955
- }
1956
-
1957
- .yith-plugin-ui #plugin-fw-wc table.wp-list-table tbody td {
1958
- padding-left : 20px;
1959
- }
1960
-
1961
- .yith-plugin-ui #plugin-fw-wc table.wp-list-table th,
1962
- .yith-plugin-ui #plugin-fw-wc table.wp-list-table td {
1963
- padding : 15px 20px 15px 20px;
1964
- }
1965
-
1966
- .yith-plugin-ui #plugin-fw-wc table.wp-list-table thead td,
1967
- .yith-plugin-ui #plugin-fw-wc table.wp-list-table thead th,
1968
- .yith-plugin-ui #plugin-fw-wc table.wp-list-table tfoot td,
1969
- .yith-plugin-ui #plugin-fw-wc table.wp-list-table tfoot th {
1970
- padding : 3px 20px;
1971
- }
1972
-
1973
- .yith-plugin-ui #plugin-fw-wc table.wp-list-table thead a,
1974
- .yith-plugin-ui #plugin-fw-wc table.wp-list-table tfoot a {
1975
- padding-left : 0;
1976
- }
1977
-
1978
- .yith-plugin-ui .yith-plugin-fw-list-table h2 {
1979
- border : 0;
1980
- padding : 35px 0 15px;
1981
- display : inline-block;
1982
- margin-right : 10px;
1983
- }
1984
-
1985
- .yith-plugin-ui .form-table .yith-plugin-fw-list-table table th {
1986
- vertical-align : middle;
1987
- }
1988
-
1989
- .yith-plugin-ui .yith-plugin-fw-list-table-container {
1990
- padding : 0 20px;
1991
- }
1992
-
1993
- .yith-plugin-ui #doaction, .yith-plugin-ui #doaction2,
1994
- .yith-plugin-ui #post-query-submit,
1995
- .yith-plugin-ui #search-submit,
1996
- .yith-plugin-ui .button.filter-button {
1997
- margin-left : 0;
1998
- height : 33px;
1999
- padding : 0 10px;
2000
- line-height : 33px;
2001
- }
2002
-
2003
- .yith-plugin-ui .bulkactions {
2004
- margin : 10px 0;
2005
- }
2006
-
2007
- .yith-plugin-ui .form-table td p.yith-section-description {
2008
- color : #716269;
2009
- margin-bottom : 20px;
2010
- }
2011
-
2012
- /** Time picker width*/
2013
- .yith-plugin-ui input.ui-timepicker-input {
2014
- width : 100px !important;
2015
- }
2016
-
2017
- /** date format **/
2018
- .yith-plugin-ui .yith-plugin-fw-date-format code {
2019
- margin-left : 30px;
2020
- }
2021
-
2022
- .yith-plugin-ui .yith-plugin-fw-date-format input[type=text].small-text {
2023
- margin-left : 45px;
2024
- }
2025
-
2026
- /** checkbox columns **/
2027
- .yith-plugin-ui td.forminp-checkbox.two-cols fieldset {
2028
- width : calc(50% - 20px);
2029
- padding-right : 20px;
2030
- float : left;
2031
- }
2032
-
2033
- .yith-plugin-ui td.forminp-checkbox.two-cols fieldset:nth-child(2n+1) {
2034
- clear : both;
2035
- }
2036
-
2037
- .yith-plugin-ui td.forminp-checkbox.three-cols fieldset {
2038
- width : calc(33% - 10px);
2039
- padding-right : 10px;
2040
- float : left;
2041
- }
2042
-
2043
- .yith-plugin-ui td.forminp-checkbox.three-cols fieldset:nth-child(3n+1) {
2044
- clear : both;
2045
- }
2046
-
2047
- .yith-plugin-fw-checkbox-field-wrapper {
2048
- display : inline-block !important;
2049
- margin-right : 10px;
2050
- }
2051
-
2052
- .yith-plugin-fw-checkbox-field-wrapper + span.description {
2053
- display : inline-block;
2054
- vertical-align : middle;
2055
- margin : 0;
2056
- }
2057
-
2058
- .yith-plugin-ui span.description {
2059
- margin-top : 10px;
2060
- line-height : 20px;
2061
- }
2062
-
2063
- .yith-plugin-fw-option-with-description {
2064
- display : table-cell;
2065
- width : auto;
2066
- vertical-align : top;
2067
- }
2068
-
2069
-
2070
- /**
2071
- * Required
2072
- */
2073
- .yith-plugin-fw-panel-wc-row.yith-plugin-fw--required th.titledesc > label:after,
2074
- .yith-plugin-fw-metabox-field-row.yith-plugin-fw--required label:first-child:after,
2075
- .yith-plugin-fw-toggle-element-field-wrapper .yith-plugin-fw--required > label:first-child:after {
2076
- content : '*';
2077
- color : #ea0034;
2078
- font-weight : 800;
2079
- margin-left : 4px;
2080
- }
2081
-
2082
- /** YITH PANEL **/
2083
- .yith-plugin-ui #yith-plugin-fw-panel {
2084
- margin-top : -10px;
2085
- }
2086
-
2087
- .yith-plugin-ui #plugin-fw-wc, .yith-plugin-ui #yith-plugin-fw-panel {
2088
- padding-top : 0;
2089
- }
2090
-
2091
- .yith-plugin-ui .plugin-option tr {
2092
- border : 0;
2093
- }
2094
-
2095
- /** MULTI SELECT **/
2096
- .yith-plugin-ui .yith-plugin-fw-multi-select .yith-single-select {
2097
- display: inline-block;
2098
- width: 30%;
2099
- margin-right: 3%;
2100
- max-width: 400px;
2101
- }
2102
- .yith-plugin-ui .yith-plugin-fw-multi-select .yith-single-select label {
2103
- display: block;
2104
- font-size: 11px;
2105
- font-weight: 600;
2106
- margin: 0 0 10px 0;
2107
- }
2108
- .yith-plugin-ui .yith-plugin-fw-multi-select .yith-single-select select,
2109
- .yith-plugin-ui .yith-plugin-fw-multi-select .yith-single-select span.select2 {
2110
- width: 100% !important;
2111
- min-width: auto !important;
2112
- }
2113
-
2114
- /** OVERRIDE WOOCOMMERCE CLASSES FOR 5.3 */
2115
- .branch-5-3 .yith-plugin-fw .select2-container .select2-selection--single .select2-selection__arrow{
2116
- background:none;
2117
- }
2118
- .branch-5-3 .yith-plugin-fw .select2-container.select2-container--focus .select2-selection--single, .branch-5-3 .yith-plugin-fw .select2-container.select2-container--open .select2-selection--multiple, .branch-5-3 .yith-plugin-fw .select2-container.select2-container--open .select2-selection--single{
2119
- box-shadow: none;
2120
- }
2121
-
2122
- @media screen and (max-width : 1440px) {
2123
- .yith-plugin-ui .yith-add-box,
2124
- .yith-plugin-ui .yith-toggle-row:not(.fixed) {
2125
- width : 80%;
2126
- }
2127
- }
2128
-
2129
- @media screen and (max-width : 1024px) {
2130
- .yith-plugin-ui .yith-add-box,
2131
- .yith-plugin-ui .yith-toggle-row:not(.fixed) {
2132
- width : 90%;
2133
- }
2134
-
2135
- .yith-plugin-ui td.forminp-checkbox.two-cols fieldset {
2136
- width : 100%;
2137
- padding-right : 20px;
2138
- float : left;
2139
- }
2140
-
2141
- .yith-plugin-ui td.forminp-checkbox.three-cols fieldset {
2142
- width : calc(50% - 10px);
2143
- padding-right : 10px;
2144
- float : left;
2145
- }
2146
-
2147
- .yith-plugin-ui td.forminp-checkbox.two-cols fieldset:nth-child(2n+1) {
2148
- clear : both;
2149
- }
2150
-
2151
- .yith-plugin-ui td.forminp-checkbox.three-cols fieldset:nth-child(3n+1) {
2152
- clear : initial;
2153
- }
2154
- }
2155
-
2156
- @media screen and (max-width : 782px) {
2157
- .yith-plugin-fw-banner h1 {
2158
- line-height : 1.2em;
2159
- }
2160
- .yith-plugin-fw-banner h1{
2161
- font-size: 12px;
2162
- padding-right: 10px;
2163
- }
2164
- .yith-plugin-ui .yith-add-box,
2165
- .yith-plugin-ui .yith-toggle-row {
2166
- width : 100%;
2167
- }
2168
-
2169
- .yith-plugin-ui td.forminp-checkbox.two-cols fieldset,
2170
- .yith-plugin-ui td.forminp-checkbox.three-cols fieldset {
2171
- width : 100%;
2172
- clear : initial;
2173
- }
2174
-
2175
- .yith-plugin-ui .wp-picker-container .wp-color-result.button {
2176
- padding: 0;
2177
- }
2178
-
2179
- }
 
 
 
 
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
+ padding: 0 !important;
33
+ }
34
+
35
+ .the-metabox .yith-plugin-fw-title-field-wrapper h3.title {
36
+ float : left;
37
+ }
38
+
39
+ .yith-plugin-fw span.color-alpha {
40
+ height: 100%!important;
41
+ width: 100% !important;
42
+ border: 1px solid #d9d9d9;
43
+ margin: -1px;
44
+ }
45
+
46
+ .yith-plugin-fw .wp-color-result-text{
47
+ height: 100%;
48
+ }
49
+ .yith-plugin-fw input[type=email],
50
+ .yith-plugin-fw input[type=number],
51
+ .yith-plugin-fw input[type=text]:not(.select2-search__field),
52
+ .yith-plugin-fw select,
53
+ .woocommerce .yith-plugin-fw table.form-table input[type=email],
54
+ .woocommerce .yith-plugin-fw table.form-table input[type=number],
55
+ .yith-plugin-ui input[type=password],
56
+ .woocommerce .yith-plugin-fw table.form-table input[type=text]:not(.select2-search__field),
57
+ .woocommerce .yith-plugin-fw table.form-table select {
58
+ width : 400px;
59
+ max-width : 100%;
60
+ height : 30px;
61
+ padding : 5px;
62
+ line-height: 1;
63
+ }
64
+
65
+ .woocommerce .yith-plugin-fw table.form-table input[type=text].wp-color-picker,
66
+ .woocommerce .yith-plugin-fw table.form-table input[type=text].yith-plugin-fw-colorpicker,
67
+ .yith-plugin-fw input[type=text].wp-color-picker,
68
+ .yith-plugin-fw input[type=text].yith-plugin-fw-colorpicker {
69
+ width : 6em;
70
+ max-width : none;
71
+ height : auto;
72
+ padding : 3px 5px;
73
+ }
74
+
75
+ .wp-core-ui .yith-plugin-fw-colorpicker-field-wrapper button{
76
+ border-color: #7e8993;
77
+ }
78
+
79
+ .woocommerce .yith-plugin-fw table.form-table input[type=text].colorpick,
80
+ .yith-plugin-fw input[type=text].colorpick {
81
+ width : 6em;
82
+ max-width : none;
83
+ height : auto;
84
+ padding : 6px;
85
+ }
86
+
87
+ .yith-plugin-fw input.select2-search__field,
88
+ .yith-plugin-fw .select2-container .select2-search--inline .select2-search__field,
89
+ .woocommerce .yith-plugin-fw input.select2-search__field,
90
+ .woocommerce .yith-plugin-fw table.form-table input.select2-search__field {
91
+ padding : 3px;
92
+ }
93
+
94
+ .yith-plugin-fw .select2-container .select2-selection--single .select2-selection__rendered {
95
+ line-height : 27px;
96
+ }
97
+
98
+ .yith-plugin-fw textarea {
99
+ width : 400px;
100
+ max-width : 100%;
101
+ padding : 5px;
102
+ }
103
+
104
+ /* ------------- ICONS ------------- */
105
+ .yit-icons-manager-wrapper {
106
+ width : 100%;
107
+ max-width : 400px;
108
+ }
109
+
110
+ .yit-icons-manager-text {
111
+ width : 100%;
112
+ }
113
+
114
+ .yit-icons-manager-icon-text {
115
+ width : calc(100% - 35px) !important;
116
+ height : 30px;
117
+ float : left;
118
+ margin : 0;
119
+ }
120
+
121
+ .yit-icons-manager-icon-preview {
122
+ width : 30px;
123
+ height : 30px;
124
+ margin-right : 5px;
125
+ float : left;
126
+ padding-top : 6px;
127
+ box-sizing : border-box;
128
+ text-align : center;
129
+ background : #f1f1f1;
130
+ }
131
+
132
+ .yit-icons-manager-list-wrapper {
133
+ margin : 10px 0;
134
+ box-shadow : 0 0 0 1px #ddd;
135
+ }
136
+
137
+ ul.yit-icons-manager-list {
138
+ width : 100%;
139
+ height : 300px;
140
+ overflow-y : scroll;
141
+ margin : 0;
142
+ }
143
+
144
+ ul.yit-icons-manager-list li {
145
+ float : left;
146
+ width : 30px;
147
+ height : 30px;
148
+ padding-top : 6px;
149
+ box-sizing : border-box;
150
+ text-align : center;
151
+ background : #f1f1f1;
152
+ margin : 1px;
153
+ cursor : pointer;
154
+ }
155
+
156
+ ul.yit-icons-manager-list li:hover {
157
+ background : #c5dcf6;
158
+ }
159
+
160
+ ul.yit-icons-manager-list li.active {
161
+ background : #d4f0ff;
162
+ }
163
+
164
+ .yit-icons-manager-action-set-default {
165
+ margin-bottom : 0;
166
+ }
167
+
168
+ .yit-icons-manager-default-icon-preview {
169
+ height : 100%;
170
+ display : inline-block;
171
+ padding-left : 10px;
172
+ border-left : 1px solid #ccc;
173
+ margin-left : 10px;
174
+ }
175
+
176
+ /* ------- Text Array ------- */
177
+ .yith-plugin-fw-text-array-table td {
178
+ padding : 1px;
179
+ }
180
+
181
+ .yith-plugin-fw-text-array-table input[type=text],
182
+ .woocommerce table.form-table table.yith-plugin-fw-text-array-table input[type=text] {
183
+ width : 100%;
184
+ }
185
+
186
+ /* ------- Image Gallery ------- */
187
+ .yith-plugin-fw .image-gallery ul li {
188
+ display : inline-block;
189
+ width : 80px;
190
+ margin-left : 10px;
191
+ position : relative;
192
+ }
193
+
194
+ .yith-plugin-fw .image-gallery ul li img {
195
+ width : 80px;
196
+ border : 1px solid #ccc;
197
+ }
198
+
199
+ .yith-plugin-fw .image-gallery ul li ul {
200
+ position : absolute;
201
+ top : -6px;
202
+ right : -1px;
203
+ width : 20px;
204
+ height : 20px;
205
+ }
206
+
207
+ .yith-plugin-fw .image-gallery ul a.delete {
208
+ background : url(../images/x.png) no-repeat;
209
+ width : 20px;
210
+ height : 20px;
211
+ display : block;
212
+ text-indent : -99999px;
213
+ }
214
+
215
+ /* ------- OnOff ------- */
216
+ .yith-plugin-fw-onoff-container {
217
+ display : inline-block;
218
+ text-align : left;
219
+ }
220
+
221
+ .yith-plugin-fw-onoff-container input {
222
+ display : none;
223
+ }
224
+
225
+ .yith-plugin-fw-onoff-container input + span {
226
+ cursor : pointer;
227
+ text-indent : -9999px;
228
+ display : block;
229
+ width : 36px;
230
+ line-height : 1;
231
+ height : 20px;
232
+ background : #a4a4a4;
233
+ border-radius : 24px;
234
+ position : relative;
235
+ transition : all 0.3s;
236
+ }
237
+
238
+
239
+ .yith-plugin-fw-onoff-container input + span:before {
240
+ content : '';
241
+ background : #fff;
242
+ width : 16px;
243
+ height : 16px;
244
+ border-radius : 50%;
245
+ position : absolute;
246
+ top : 2px;
247
+ left : 2px;
248
+ transition : all 0.3s;
249
+ }
250
+
251
+ .yith-plugin-fw-onoff-container input:checked + span,
252
+ .yith-plugin-fw-onoff-container input.onoffchecked + span {
253
+ background : #0073aa;
254
+ }
255
+
256
+ .yith-plugin-fw-onoff-container input:checked + span:before,
257
+ .yith-plugin-fw-onoff-container input.onoffchecked + span:before {
258
+ left : 18px;
259
+ }
260
+
261
+ /* ------- Preview ------- */
262
+ .yith-plugin-fw-preview-field {
263
+ max-height : 200px;
264
+ }
265
+
266
+ /* ------- Radio ------- */
267
+ .yith-plugin-fw-radio input[type=radio] {
268
+ margin : 0 3px 0 0;
269
+ }
270
+
271
+ .yith-plugin-fw-radio__row {
272
+ margin-bottom : 8px;
273
+ }
274
+
275
+ /* ------- Checkbox Array ------- */
276
+ .yith-plugin-fw-checkbox-array input[type=checkbox] {
277
+ margin : 2px 3px 0 0;
278
+ }
279
+
280
+ .yith-plugin-fw-checkbox-array__row {
281
+ margin-bottom : 10px;
282
+ }
283
+
284
+ .yith-plugin-fw-checkbox-array__row label {
285
+ display : inline-block !important;
286
+ width : auto !important;
287
+ float : none !important;
288
+ margin : 0 !important;
289
+ padding : 0 !important;
290
+ font-weight : 400 !important;
291
+ }
292
+
293
+ /* ------- Sidebar Layout ------- */
294
+ .yith-plugin-fw-sidebar-layout input[type="radio"] {
295
+ display : none;
296
+ width : 0px;
297
+ }
298
+
299
+ .yith-plugin-fw-sidebar-layout input[type="radio"]:first-child {
300
+ margin-right : -2px;
301
+ }
302
+
303
+ .yith-plugin-fw-sidebar-layout input[type="radio"] + img {
304
+ border : 2px solid #fff;
305
+ padding : 1px;
306
+ }
307
+
308
+ .yith-plugin-fw-sidebar-layout input[type="radio"] + img:hover {
309
+ cursor : pointer;
310
+ }
311
+
312
+ .yith-plugin-fw-sidebar-layout input[checked] + img {
313
+ border : 2px solid #f2ad35;
314
+ padding : 1px;
315
+ }
316
+
317
+ .yith-plugin-fw-sidebar-layout select {
318
+ vertical-align : 12px;
319
+ }
320
+
321
+ .yit-admin-panel-content-wrap .yith-plugin-fw-sidebar-layout label {
322
+ font-weight : bold;
323
+ width : 200px;
324
+ float : left;
325
+ line-height : 23px;
326
+ margin-left : -230px;
327
+ }
328
+
329
+ /* ------- Slider ------- */
330
+ .yith-plugin-fw .slider {
331
+ padding-top : 20px;
332
+ }
333
+
334
+ .yith-plugin-fw-slider-container .ui-slider .minCaption {
335
+ position : absolute;
336
+ right : 95%;
337
+ top : -6px;
338
+ margin-right : 11px;
339
+ }
340
+
341
+ .yith-plugin-fw-slider-container .ui-slider .maxCaption {
342
+ position : absolute;
343
+ left : 95%;
344
+ top : -6px;
345
+ margin-left : 20px;
346
+ }
347
+
348
+ .yith-plugin-fw-slider-container .ui-slider-horizontal .ui-slider-handle {
349
+ background : #fff;
350
+ border : 0px !important;
351
+ top : -12px !important;
352
+ border-radius : 50%;
353
+ width : 27px !important;
354
+ height : 27px !important;
355
+ box-sizing : border-box;
356
+ box-shadow : 0 1px 7px -1px rgba(0, 0, 0, 0.5);
357
+ font-size : 13px;
358
+ padding : 6px 0;
359
+ font-weight : 600;
360
+ color : #555;
361
+ text-align : center;
362
+ }
363
+
364
+ .yith-plugin-fw-slider-container .ui-slider.ui-widget-content {
365
+ background : #ccc;
366
+ border : none !important;
367
+ height : 3px !important;
368
+ border-radius : 3px !important;
369
+ width : 90%;
370
+ margin : 15px 5% 20px 5%;
371
+ }
372
+
373
+ .yith-plugin-fw-slider-container .ui-slider.ui-widget-content .ui-widget-header {
374
+ background : #4b93ff;
375
+ left : 0px !important;
376
+ -webkit-border-radius : 3px;
377
+ -moz-border-radius : 3px;
378
+ -khtml-border-radius : 3px;
379
+ border-radius : 3px;
380
+ }
381
+
382
+ /* ------- Select2 ------- */
383
+ .yith-plugin-fw-select2-wrapper {
384
+ width : 400px;
385
+ }
386
+
387
+ /* ------- Textarea ------- */
388
+ .yith-plugin-fw-textarea-editor-field-wrapper {
389
+ max-width : 1000px;
390
+ clear : both;
391
+ }
392
+
393
+ .yith-plugin-fw-textarea-editor-field-wrapper textarea.wp-editor-area,
394
+ .woocommerce table.form-table .yith-plugin-fw-textarea-editor-field-wrapper textarea.wp-editor-area {
395
+ width : 100%;
396
+ }
397
+
398
+ /* ------- Buttons ------- */
399
+ .yith-plugin-fw-buttons-field-wrapper {
400
+ margin-top : 7px;
401
+ }
402
+
403
+ /* ------- Select Images ------- */
404
+ .yith-plugin-fw-select-images__list {
405
+ margin : 0;
406
+ display : flex;
407
+ flex-wrap : wrap;
408
+ }
409
+
410
+ .yith-plugin-fw-select-images__item {
411
+ width : calc(20% - 10px);
412
+ min-width : 150px;
413
+ margin : 0 10px 10px 0;
414
+ padding : 10px;
415
+ box-sizing : border-box;
416
+ cursor : pointer;
417
+ transition : all .3s;
418
+ border : 2px solid #eee;
419
+ display : flex;
420
+ flex-direction : column;
421
+ justify-content : space-between;
422
+ }
423
+
424
+ .yith-plugin-fw-select-images__item:hover,
425
+ .yith-plugin-fw-select-images__item.yith-plugin-fw-select-images__item--selected {
426
+ border-color : #07bcce;
427
+ }
428
+
429
+ .yith-plugin-fw-select-images__item__label {
430
+ text-align : center;
431
+ font-weight : 600;
432
+ margin-bottom : 10px;
433
+ }
434
+
435
+ .yith-plugin-fw-select-images__item img {
436
+ display : block;
437
+ max-width : 100%;
438
+ margin : 0 auto;
439
+ }
440
+
441
+ /****************
442
+ WordPress 5.3 with old panel fixes
443
+ ****************/
444
+ .yith-plugin-fw-field-wrapper .select2-container .select2-selection--single {
445
+ height: auto;
446
+ line-height: 1;
447
+ }
448
+
449
+ .yith-plugin-fw-field-wrapper .select2-container .select2-selection--single .select2-selection__arrow{
450
+ height: 100%;
451
+ }
452
+
453
+ /****************
454
+ YITH UI
455
+ ****************/
456
+ @font-face {
457
+ font-family : 'yith-icon';
458
+ src : url('../fonts/yith-icon.eot?g6bfgy');
459
+ src : url('../fonts/yith-icon.eot?g6bfgy#iefix') format('embedded-opentype'),
460
+ url('../fonts/yith-icon.ttf?g6bfgy') format('truetype'),
461
+ url('../fonts/yith-icon.woff?g6bfgy') format('woff'),
462
+ url('../fonts/yith-icon.svg?g6bfgy#yith-icon') format('svg');
463
+ font-weight : normal;
464
+ font-style : normal;
465
+ }
466
+
467
+ [class^="icon-"], [class*=" icon-"][class^="yith-icon-"], [class*=" yith-icon-"] {
468
+ /* use !important to prevent issues with browser extensions that change fonts */
469
+ font-family : 'yith-icon' !important;
470
+ speak : none;
471
+ font-style : normal;
472
+ font-weight : normal;
473
+ font-variant : normal;
474
+ text-transform : none;
475
+ line-height : 1;
476
+
477
+ /* Better Font Rendering =========== */
478
+ -webkit-font-smoothing : antialiased;
479
+ -moz-osx-font-smoothing : grayscale;
480
+ }
481
+
482
+ .yith-icon-paypal-svgrepo-com:before {
483
+ content: "\e91b";
484
+ }
485
+ .yith-icon-check-circle:before {
486
+ content: "\e921";
487
+ color: #757575;
488
+ }
489
+ .yith-icon-info-squared:before {
490
+ content: "\e922";
491
+ color: #757575;
492
+ }
493
+ .yith-icon-warning-triangle:before {
494
+ content: "\e923";
495
+ color: #757575;
496
+ }
497
+ .yith-icon-bank:before {
498
+ content: "\e91c";
499
+ }
500
+ .yith-icon-accounting:before {
501
+ content: "\e91d";
502
+ }
503
+ .yith-icon-bank-check:before {
504
+ content: "\e91e";
505
+ }
506
+ .yith-icon-cash:before {
507
+ content: "\e91f";
508
+ }
509
+ .yith-icon-credit-card:before {
510
+ content: "\e920";
511
+ }
512
+ .yith-icon-calendar_add:before {
513
+ content: "\e913";
514
+ color: #757575;
515
+ }
516
+ .yith-icon-calendar_money:before {
517
+ content: "\e914";
518
+ color: #757575;
519
+ }
520
+ .yith-icon-calendar2:before {
521
+ content: "\e915";
522
+ color: #757575;
523
+ }
524
+ .yith-icon-people:before {
525
+ content: "\e916";
526
+ color: #757575;
527
+ }
528
+ .yith-icon-shield_money:before {
529
+ content: "\e917";
530
+ color: #757575;
531
+ }
532
+ .yith-icon-time_check:before {
533
+ content: "\e918";
534
+ color: #757575;
535
+ }
536
+ .yith-icon-world_settings:before {
537
+ content: "\e919";
538
+ color: #757575;
539
+ }
540
+ .yith-icon-arrow_eye_closed:before {
541
+ content: "\e912";
542
+ color: #757575;
543
+ }
544
+ .yith-icon-arrow_eye:before {
545
+ content: "\e911";
546
+ color: #757575;
547
+ }
548
+ .yith-icon-reset:before {
549
+ content: "\e910";
550
+ color: #757575;
551
+ }
552
+ .yith-icon-drag:before {
553
+ content: "\e90f";
554
+ color: #757575;
555
+ }
556
+ .yith-icon-trash:before {
557
+ content: "\e90d";
558
+ color: #757575;
559
+ }
560
+ .yith-icon-info:before {
561
+ content: "\e90e";
562
+ color: #757575;
563
+ }
564
+ .yith-icon-arrow_down:before {
565
+ content: "\e900";
566
+ color: #757575;
567
+ }
568
+ .yith-icon-arrow_left:before {
569
+ content: "\e901";
570
+ color: #757575;
571
+ }
572
+ .yith-icon-arrow_right:before {
573
+ content: "\e902";
574
+ color: #757575;
575
+ }
576
+ .yith-icon-arrow_up:before {
577
+ content: "\e903";
578
+ color: #757575;
579
+ }
580
+ .yith-icon-calendar:before {
581
+ content: "\e904";
582
+ color: #757575;
583
+ }
584
+ .yith-icon-check:before {
585
+ content: "\e905";
586
+ color: #757575;
587
+ }
588
+ .yith-icon-close:before {
589
+ content: "\e906";
590
+ color: #757575;
591
+ }
592
+ .yith-icon-edit:before {
593
+ content: "\e907";
594
+ color: #757575;
595
+ }
596
+ .yith-icon-magnifier:before {
597
+ content: "\e908";
598
+ color: #757575;
599
+ }
600
+ .yith-icon-pencil:before {
601
+ content: "\e909";
602
+ color: #757575;
603
+ }
604
+ .yith-icon-plus:before {
605
+ content: "\e90a";
606
+ color: #757575;
607
+ }
608
+ .yith-icon-update:before {
609
+ content: "\e90b";
610
+ color: #757575;
611
+ }
612
+ .yith-icon-upload:before {
613
+ content: "\e90c";
614
+ color: #757575;
615
+ }
616
+ .yith-icon-reply:before {
617
+ content: "\e91a";
618
+ }
619
+
620
+ .yith-plugin-fw-banner {
621
+ width : 100%;
622
+ height: 45px;
623
+ background : url('../images/banner-premium.png');
624
+ display: flex;
625
+ align-items: center;
626
+ padding-right: -23px;
627
+ }
628
+
629
+ .yith-plugin-fw-banner h1 {
630
+ text-transform : uppercase;
631
+ color : #0c5777;
632
+ font-size : 15px;
633
+ padding: 0 0 0 110px;
634
+ font-weight : 700;
635
+ text-align : left;
636
+ display : inline-block;
637
+ box-sizing : border-box;
638
+ }
639
+
640
+ .yith-plugin-fw-banner span {
641
+ font-style : italic;
642
+ display : block;
643
+ font-size : 15px;
644
+ color : #214249;
645
+ text-transform : none;
646
+ text-align : right;
647
+ }
648
+
649
+ .yith-plugin-fw-banner a,
650
+ .yith-plugin-fw-banner a:focus {
651
+ text-decoration : none;
652
+ outline : none;
653
+ box-shadow : none;
654
+ }
655
+
656
+ .yith-plugin-fw-rate{
657
+ margin: 20px 0;
658
+ }
659
+
660
+ .yith-plugin-fw-rate .dashicons-star-filled{
661
+ font-size: 12px;
662
+ margin: 4px -4px;
663
+ color: #0c5777;
664
+ }
665
+
666
+ .yith-plugin-fw-rate a{
667
+ text-decoration: none;
668
+ }
669
+ .yith-plugin-ui a {
670
+ outline : none;
671
+ box-shadow : none;
672
+ }
673
+
674
+ .yith-plugin-ui {
675
+ font-family : -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
676
+ }
677
+
678
+ .yith-plugin-ui #wpwrap h2.nav-tab-wrapper, .yith-plugin-ui #wpbody-content h2.nav-tab-wrapper {
679
+ margin-top : 10px;
680
+ }
681
+
682
+ .yith-plugin-ui .nav-tab {
683
+ margin-left : 0px;
684
+ margin-right : 2px;
685
+ background-color : #336374;
686
+ color : #fff;
687
+ font-size : 15px;
688
+ padding : 7px 20px;
689
+ border : 0;
690
+ }
691
+
692
+ .yith-plugin-ui .nav-tab:first-child {
693
+ border-left : 1px solid #d9d9d9;
694
+ }
695
+
696
+ .yith-plugin-ui .nav-tab.yith-premium {
697
+ background-color : #be421c;
698
+ }
699
+
700
+ .yith-plugin-ui .nav-tab-active {
701
+ background-color : #fff;
702
+ color : #336374;
703
+ border-bottom : 1px solid #fff;
704
+ }
705
+
706
+ .yith-plugin-ui .nav-tab-active.yith-premium {
707
+ background-color : #fff;
708
+ color : #be421c;
709
+ }
710
+
711
+ .yith-plugin-ui #plugin-fw-wc {
712
+ padding-top : 0px;
713
+ }
714
+
715
+ .yith-plugin-ui .form-table td {
716
+ padding : 15px 20px;
717
+ }
718
+
719
+ .yith-plugin-ui.metaboxes-tab label {
720
+ color : #33373b;
721
+ font-size : 14px;
722
+ margin-left : -248px;
723
+ }
724
+
725
+ .yith-plugin-ui.metaboxes-tab .the-metabox {
726
+ margin : 40px 0 40px 290px;
727
+ margin-left : 264px;
728
+ }
729
+
730
+ .yith-plugin-ui.metaboxes-tab label {
731
+ width : 200px;
732
+ font-weight : 600;
733
+ }
734
+
735
+ .yith-plugin-ui span.description {
736
+ color : #716269;
737
+ font-size : 14px;
738
+ font-style : normal;
739
+ font-weight : 400;
740
+ margin-top : 15px;
741
+ margin-left : 0;
742
+ }
743
+
744
+ #wpwrap .yith-plugin-ui h2.nav-tab-wrapper, #wpbody-content .yith-plugin-ui h2.nav-tab-wrapper {
745
+ border : 0;
746
+ border-bottom : 1px solid #ccc;
747
+ margin-right : 15px;
748
+ margin-bottom : 0;
749
+ background-color : transparent;
750
+ padding-left : 0;
751
+ }
752
+
753
+ .yith-plugin-ui #plugin-fw-wc table.form-table,
754
+ .yith-plugin-ui #yith-plugin-fw-panel table.form-table,
755
+ .yith-plugin-ui table.form-table {
756
+ border : 1px solid #d8d8d8;
757
+ border-top : 0;
758
+ margin-bottom : 40px;
759
+ }
760
+
761
+ .yith-plugin-ui #wpwrap h2.nav-tab-wrapper, .yith-plugin-ui #wpbody-content h2.nav-tab-wrapper {
762
+ background-color : transparent;
763
+ border : 0;
764
+ text-transform : none;
765
+ border-bottom : 1px solid #ddd;
766
+ }
767
+
768
+ .yith-plugin-ui h2 {
769
+ color : #2a8db0;
770
+ font-size : 15px;
771
+ text-transform : uppercase;
772
+ border : 1px solid #d8d8d8;
773
+ border-bottom : 0;
774
+ background-color : #fff;
775
+ padding : 35px 20px;
776
+ margin : 0px;
777
+ }
778
+
779
+ .yith-plugin-ui .yith-plugin-fw-custom-tab h2 {
780
+ border : 0px solid #d8d8d8;
781
+ padding-left : 0;
782
+ }
783
+
784
+ .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 {
785
+ padding : 30px 20px;
786
+ }
787
+ .yith-plugin-ui #plugin-fw-wc table.form-table tr.toggle-element-fixed td, #yith-plugin-fw-panel table.form-table tr.toggle-element-fixed td.forminp {
788
+ padding: 0 20px 30px;
789
+ }
790
+ .yith-plugin-ui #plugin-fw-wc h2 + div {
791
+ background : #fff;
792
+ border-left : 1px solid #d9d9d9;
793
+ border-right : 1px solid #d9d9d9;
794
+ margin : -20px 0 0 0;
795
+ padding-left : 20px;
796
+ padding-bottom : 5px;
797
+ }
798
+
799
+ .yith-plugin-ui #plugin-fw-wc h2 + div p, .yith-plugin-ui p.info-box {
800
+ background : #f1f1f1;
801
+ font-size : 14px;
802
+ font-weight : 700;
803
+ width : 50%;
804
+ display : block;
805
+ padding : 15px;
806
+ margin-bottom : 0;
807
+ }
808
+
809
+ .yith-plugin-ui #plugin-fw-wc h2 + div p:before, .yith-plugin-ui p.info-box:before {
810
+ content : "\e90e";
811
+ font-family : yith-icon;
812
+ font-size : 30px;
813
+ font-weight : normal;
814
+ display : block;
815
+ margin-top : -5px;
816
+ float : left;
817
+ margin-right : 15px;
818
+ }
819
+
820
+ .yith-plugin-ui h2:first-child {
821
+ border-top : 0;
822
+ }
823
+
824
+ /*** Icon ***/
825
+ .yith-plugin-ui span.yith-icon {
826
+ margin-left : -36px;
827
+ line-height : 36px;
828
+ font-size : 20px;
829
+ }
830
+
831
+ /*** General Input Style ***/
832
+
833
+ .yith-plugin-ui .yith-plugin-fw select,
834
+ .yith-plugin-ui textarea,
835
+ .yith-plugin-ui input[type=number],
836
+ .yith-plugin-ui.metaboxes-tab input[type=number],
837
+ .yith-plugin-ui input[type=text],
838
+ .yith-plugin-ui input[type=text],
839
+ .yith-plugin-ui input[type=email],
840
+ .yith-plugin-ui input[type=password],
841
+ .yith-plugin-ui .search-box input[name="s"],
842
+ .yith-plugin-fw.yith-plugin-ui input[type=text]:not(.select2-search__field),
843
+ .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table input[type=text]:not(.select2-search__field),
844
+ .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table select,
845
+ .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table textarea,
846
+ .woocommerce .yith-plugin-fw table.form-table input[type=password],
847
+ .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table input[type=number],
848
+ .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table input[type=text] {
849
+ border : 1px solid #d8d8d8;
850
+ border-radius : 8px;
851
+ padding : 8px 10px;
852
+ height : 38px;
853
+ min-width : 90px;
854
+ box-shadow : none;
855
+ color : #716269;
856
+ }
857
+
858
+ .yith-plugin-ui textarea,
859
+ .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table textarea {
860
+ height : auto;
861
+ }
862
+
863
+ .yith-plugin-ui input[type=text]:not(.select2-search__field).wp-color-picker,
864
+ .yith-plugin-ui table.form-table input[type=text].wp-color-picker,
865
+ .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table input[type=text].wp-color-picker {
866
+ border: 0;
867
+ height: 30px;
868
+ max-width: 121px;
869
+ font-size: 11px;
870
+ padding: 0;
871
+ }
872
+
873
+ .yith-plugin-ui .search-box input[name="s"] {
874
+ height : 35px;
875
+ }
876
+
877
+ .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table input[type=text].small-text,
878
+ .yith-plugin-ui input[type=text].small-text {
879
+ width : 100px;
880
+ height : 25px;
881
+ border : 1px solid #d9d9d9;
882
+ }
883
+
884
+ .yith-plugin-ui textarea {
885
+ height : auto;
886
+ padding : 8px;
887
+ }
888
+
889
+ .yith-plugin-ui select:focus,
890
+ .yith-plugin-ui input:focus {
891
+ border-color : #a7d9ec !important;
892
+ }
893
+
894
+ .woocommerce .yith-plugin-ui table.form-table select,
895
+ .yith-plugin-ui select {
896
+ -webkit-appearance : none;
897
+ line-height : 1.2em;
898
+ min-height : 35px;
899
+ background : url("../images/arrow_down.svg") no-repeat right center;
900
+ background-size : 35px 13px;
901
+ border-radius : 8px;
902
+ padding-left : 10px;
903
+ }
904
+
905
+ .yith-plugin-ui .form-table th {
906
+ width : 200px;
907
+ padding-right : 50px;
908
+ }
909
+
910
+ /** BUTTONS **/
911
+ .wp-core-ui .yith-plugin-ui .button-primary,
912
+ .wp-core-ui .yith-plugin-ui .button-secondary,
913
+ .yith-plugin-ui .yith-add-button,
914
+ .yith-plugin-ui .yith-save-button,
915
+ .yith-plugin-ui .yith-edit-button,
916
+ .yith-plugin-ui .yith-update-button,
917
+ .yith-plugin-ui .yith-plugin-fw-select-all,
918
+ .yith-plugin-ui .yith-plugin-fw-deselect-all,
919
+ .yith-plugin-ui .yith-plugin-fw-upload-button,
920
+ .yith-plugin-ui .yith-plugin-fw-upload-button-reset {
921
+ border-radius : 3px;
922
+ text-transform : uppercase;
923
+ box-shadow : none;
924
+ border : 0;
925
+ font-weight : 700;
926
+ font-size : 11px;
927
+ padding : 0px 14px;
928
+ outline : none;
929
+ height : auto;
930
+ transition : all ease 0.3s;
931
+ background-color : #d6d6d6;
932
+ color : #656565;
933
+ text-shadow : none;
934
+ vertical-align : middle;
935
+ line-height : 26px;
936
+ display : inline-block;
937
+ text-decoration : none;
938
+ cursor : pointer;
939
+ }
940
+
941
+ .wp-core-ui .yith-plugin-ui .button-secondary.yith-plugin-fw-upload-button-reset,
942
+ .wp-core-ui .yith-plugin-ui .button-secondary.yith-plugin-fw-upload-button,
943
+ .yith-plugin-ui .yith-plugin-fw-upload-button-reset,
944
+ .yith-plugin-ui .button-secondary.yith-plugin-fw-upload-button-reset,
945
+ .yith-plugin-ui .button-secondary.yith-plugin-fw-upload-button {
946
+ height : 38px;
947
+ }
948
+
949
+ .wp-core-ui .yith-plugin-ui .button:focus,
950
+ .wp-core-ui .yith-plugin-ui .button-primary:focus,
951
+ .yith-plugin-ui .yith-add-button:focus,
952
+ .yith-plugin-ui .yith-save-button:focus,
953
+ .yith-plugin-ui .yith-edit-button:focus,
954
+ .yith-plugin-ui .yith-update-button:focus,
955
+ .wp-core-ui .yith-plugin-ui .button-secondary:focus {
956
+ outline : none;
957
+ box-shadow : none;
958
+ }
959
+
960
+ .wp-core-ui .yith-plugin-ui .button-xl {
961
+ padding : 0px 20px;
962
+ font-size : 14px;
963
+ line-height : 38px;
964
+ display : inline-block;
965
+ font-weight : 600;
966
+ }
967
+
968
+ /** button with inside a span with icon class */
969
+ .yith-plugin-ui .button-secondary span.yith-icon {
970
+ margin-left : 0px;
971
+ margin-right : 10px;
972
+ line-height : normal;
973
+ }
974
+
975
+ .yith-plugin-ui .button-secondary span.yith-icon:before {
976
+ color : #656565;
977
+ font-size : 15px;
978
+ }
979
+
980
+
981
+ .wp-core-ui .yith-plugin-ui .button:focus,
982
+ .wp-core-ui .yith-plugin-ui .button-secondary:focus,
983
+ .yith-plugin-ui .yith-save-button:hover,
984
+ .wp-core-ui .yith-plugin-ui .button-secondary:hover,
985
+ .yith-plugin-ui .yith-plugin-fw-upload-button-reset:hover {
986
+ background-color : #cacaca;
987
+ color : #515151;
988
+ }
989
+
990
+ .wp-core-ui .yith-plugin-ui .button-primary,
991
+ .yith-plugin-ui .button-secondary.yith-plugin-fw-select-all,
992
+ .yith-plugin-ui .button-secondary.yith-plugin-fw-upload-button {
993
+ background-color : #007694;
994
+ color : #fff;
995
+ }
996
+
997
+
998
+ .yith-plugin-ui .yith-add-button,
999
+ .wp-core-ui .yith-plugin-ui .button-primary:focus,
1000
+ .wp-core-ui .yith-plugin-ui .button-primary:hover {
1001
+ background-color : #375f6b;
1002
+ color : #fff;
1003
+ cursor : pointer;
1004
+ }
1005
+
1006
+
1007
+ .yith-plugin-ui .yith-add-button:hover,
1008
+ .wp-core-ui .yith-plugin-ui .yith-plugin-fw-upload-button:focus,
1009
+ .yith-plugin-ui .button-secondary.yith-plugin-fw-select-all:hover,
1010
+ .yith-plugin-ui .button-secondary.yith-plugin-fw-select-all:focus,
1011
+ .yith-plugin-ui .yith-plugin-fw-upload-button:hover {
1012
+ border-color : #007694;
1013
+ background : #007694;
1014
+ color : #fff;
1015
+ line-height : 26px;
1016
+ margin-left : 0;
1017
+ }
1018
+
1019
+ .yith-plugin-ui .button-primary:before,
1020
+ .yith-plugin-ui .yith-add-button:before,
1021
+ .yith-plugin-ui .yith-save-button:before,
1022
+ .yith-plugin-ui .yith-edit-button:before,
1023
+ .yith-plugin-ui .yith-update-button:before,
1024
+ .yith-plugin-ui .button-secondary:before {
1025
+ font-family : 'yith-icon';
1026
+ font-size : 10px;
1027
+ font-weight : 700;
1028
+ margin-right : 10px;
1029
+ vertical-align : bottom;
1030
+ display : inline-block;
1031
+ }
1032
+
1033
+ /** yith-edit-button **/
1034
+ .yith-plugin-ui .yith-edit-button {
1035
+ background-color : #7f9298;
1036
+ color : #fff;
1037
+ }
1038
+
1039
+ .yith-plugin-ui .yith-edit-button:focus,
1040
+ .yith-plugin-ui .yith-edit-button:hover {
1041
+ background-color : #718085;
1042
+ color : #fff;
1043
+ }
1044
+
1045
+ .yith-plugin-ui .yith-edit-button:before {
1046
+ content : "\e907";
1047
+ }
1048
+
1049
+ /** yith-update-button **/
1050
+ .yith-plugin-ui .yith-update-button {
1051
+ background-color : #94aa09;
1052
+ color : #fff;
1053
+ }
1054
+
1055
+ .yith-plugin-ui .yith-update-button:focus,
1056
+ .yith-plugin-ui .yith-update-button:hover {
1057
+ background-color : #7a9009;
1058
+ color : #fff;
1059
+ }
1060
+
1061
+ .yith-plugin-ui .yith-update-button:before {
1062
+ content : "\e90b";
1063
+ font-size : 15px;
1064
+ }
1065
+
1066
+ /** yith-save-button **/
1067
+
1068
+ .yith-plugin-ui .yith-save-button {
1069
+ background-color : #267390;
1070
+ color : #fff;
1071
+ }
1072
+
1073
+ .yith-plugin-ui .yith-save-button:focus,
1074
+ .yith-plugin-ui .yith-save-button:hover {
1075
+ background-color : #1c4863;
1076
+ color : #fff;
1077
+ }
1078
+
1079
+
1080
+ /** yith-remove-button **/
1081
+
1082
+ .yith-plugin-ui .button-secondary.yith-remove-button:before {
1083
+ content : "\e90d";
1084
+ font-size : 15px;
1085
+ }
1086
+
1087
+
1088
+ /** yith-add-button **/
1089
+ .yith-plugin-ui .yith-add-button:before {
1090
+ content : "\e90a";
1091
+ }
1092
+
1093
+ .yith-plugin-ui .yith-add-button.closed {
1094
+ background-color : #fff;
1095
+ color : #375f6b;
1096
+ border : 1px solid #375f6b;
1097
+ }
1098
+
1099
+ .yith-plugin-ui .yith-add-button.closed:before {
1100
+ content : "\e906";
1101
+ }
1102
+
1103
+
1104
+ /** yith-plugin-fw-upload-button **/
1105
+ .yith-plugin-ui button.yith-plugin-fw-upload-button:before {
1106
+ content : "\e90c";
1107
+ font-family : 'yith-icon';
1108
+ font-size : 19px;
1109
+ font-weight : 400;
1110
+ margin-right : 10px;
1111
+ vertical-align : middle;
1112
+ display : inline-block;
1113
+ }
1114
+
1115
+ /** SELECT 2 **/
1116
+ .yith-plugin-ui .select2-container,
1117
+ .yith-plugin-ui .select2-selection--single {
1118
+ height : auto;
1119
+ padding : 2px;
1120
+ outline : none;
1121
+ }
1122
+
1123
+ .yith-plugin-ui .select2-container .select2-selection--single,
1124
+ .yith-plugin-ui .select2-container .select2-selection--multiple,
1125
+ .yith-plugin-ui .select2-container.select2-container--focus .select2-selection--single,
1126
+ .yith-plugin-ui .select2-container.select2-container--focus .select2-selection--multiple,
1127
+ .yith-plugin-ui .select2-container.select2-container--open .select2-selection--single,
1128
+ .yith-plugin-ui .select2-container.select2-container--open .select2-selection--multiple{
1129
+ margin : 0;
1130
+ border : 0;
1131
+ box-shadow : none;
1132
+ }
1133
+
1134
+ .yith-plugin-ui .select2-container .select2-selection--single .select2-selection__arrow{
1135
+ background: none;
1136
+ }
1137
+
1138
+ /* old panel*/
1139
+
1140
+ .yith-plugin-ui span.select2.select2-container.select2-container--default,
1141
+ span.select2.select2-container.select2-container--default.yith-plugin-fw-select2-container {
1142
+ border : 1px solid #d8d8d8;
1143
+ border-radius : 8px;
1144
+ }
1145
+
1146
+ .yith-plugin-ui span.select2.select2-container.select2-container--default:hover,
1147
+ .yith-plugin-ui span.select2.select2-container.select2-container--default:active,
1148
+ .yith-plugin-ui span.select2.select2-container.select2-container--default:focus {
1149
+ border-color : #a7d9ec;
1150
+ }
1151
+
1152
+ .yith-plugin-ui .select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
1153
+ color : #fff;
1154
+ }
1155
+
1156
+ .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table input[type=text].select2-search__field,
1157
+ .yith-plugin-ui .yith-plugin-fw table.form-table input.select2-search__field {
1158
+ border : 0;
1159
+ padding : 0;
1160
+ height : initial;
1161
+ }
1162
+
1163
+ .yith-plugin-ui .select2-container--default .select2-selection--multiple .select2-selection__choice,
1164
+ .yith-plugin-ui .select2-selection__choice {
1165
+ color : #fff;
1166
+ background-color : #4e8ba2;
1167
+ border-radius : 12px;
1168
+ padding : 3px 11px;
1169
+ border-color : #4e8ba2;
1170
+ font-size : 13px;
1171
+ }
1172
+
1173
+ .yith-plugin-ui .select2-container--default .select2-selection--single .select2-selection__arrow:before {
1174
+ content : "\e900";
1175
+ font-family : 'yith-icon' !important;
1176
+ line-height : 36px;
1177
+ color : #d9d9d9;
1178
+ }
1179
+
1180
+ .yith-plugin-ui .select2-container--default .select2-selection--single .select2-selection__arrow b {
1181
+ display : none;
1182
+ }
1183
+
1184
+ .yith-plugin-fw-select2-container.select2-container--open .select2-dropdown--below,
1185
+ .yith-plugin-fw-select2-container.select2-container--open .select2-dropdown--above {
1186
+ margin-top : 10px;
1187
+ border-radius : 8px;
1188
+ box-shadow : 0 2px 4px 0 rgba(0, 0, 0, 0.12), 0 2px 10px 0 rgba(0, 0, 0, 0.12) !important;
1189
+ }
1190
+
1191
+ .yith-plugin-fw-select2-container.select2-container--open .select2-dropdown--above {
1192
+ margin-top : -10px;
1193
+ }
1194
+
1195
+ .yith-plugin-fw-select2-container.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,
1196
+ .yith-plugin-fw-select2-container.select2-container--default.select2-container--open.select2-container--above .select2-selection--single {
1197
+ border-radius : 8px;
1198
+ }
1199
+
1200
+ .yith-plugin-fw-select2-container .select2-results .select2-results__group, .select2-results .select2-results__option:first-child {
1201
+ border-top-left-radius : 8px;
1202
+ border-top-right-radius : 8px;
1203
+ }
1204
+
1205
+ .yith-plugin-fw-select2-container .select2-results .select2-results__group,
1206
+ .yith-plugin-fw-select2-container .select2-results .select2-results__option:last-child {
1207
+ border-bottom-left-radius : 8px;
1208
+ border-bottom-right-radius : 8px;
1209
+ }
1210
+
1211
+ .yith-plugin-fw-select2-container .select2-dropdown {
1212
+ border : 0;
1213
+ }
1214
+
1215
+ .yith-plugin-fw-select2-container.select2-container--default .select2-results__option[data-selected=true] {
1216
+ background-color : #fff;
1217
+ outline : none;
1218
+ }
1219
+
1220
+ .yith-plugin-fw-select2-container.select2-container--default .select2-results__option--highlighted[aria-selected] {
1221
+ background-color : #e8eff1;
1222
+ color : #4e8ba2;
1223
+ outline : none;
1224
+ }
1225
+
1226
+ .yith-plugin-ui .select2-container--default .select2-selection--multiple .select2-selection__choice__remove,
1227
+ .yith-plugin-fw-panel .select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
1228
+ float : right;
1229
+ padding-left : 15px;
1230
+ text-indent : -9999px;
1231
+ }
1232
+
1233
+
1234
+ .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:after,
1235
+ .woocommerce .yith-plugin-ui .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:after,
1236
+ .yith-plugin-ui .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:after {
1237
+ float : right;
1238
+ color : #fff;
1239
+ content : "\e906";
1240
+ font-family : 'yith-icon' !important;
1241
+ font-size : 9px;
1242
+ line-height : 21px;
1243
+ text-indent : 0;
1244
+ }
1245
+
1246
+ .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:after {
1247
+ color : #000;
1248
+ }
1249
+
1250
+ .yith-plugin-ui .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:after
1251
+ .yith-plugin-fw-panel .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:after {
1252
+ color : #000;
1253
+ }
1254
+
1255
+ .yith-plugin-ui .select2-container .select2-selection--multiple,
1256
+ .yith-plugin-ui .select2-container--default.select2-container--focus .select2-selection--multiple {
1257
+ border : 0;
1258
+ }
1259
+
1260
+ .yith-plugin-fw .select2-search input[type=text] {
1261
+ border : 0;
1262
+ padding : 0;
1263
+ height : auto;
1264
+ }
1265
+
1266
+ .yith-plugin-ui .yith-plugin-fw-select-field-wrapper span.yith-icon.yith-icon-magnifier,
1267
+ .yith-plugin-fw-panel .yith-plugin-fw-select-field-wrapper span.yith-icon.yith-icon-magnifier {
1268
+ position : absolute;
1269
+ padding-top : 5px;
1270
+ }
1271
+
1272
+ .yith-plugin-ui input[type=text].select2-search__field {
1273
+ border : 0;
1274
+ padding : 0;
1275
+ height : 30px;
1276
+ }
1277
+
1278
+ .yith-plugin-ui .select2-container--default .select2-search--dropdown .select2-search__field,
1279
+ .yith-plugin-fw-panel .select2-container--default .select2-search--dropdown .select2-search__field {
1280
+ border : 1px solid #d9d9d9;
1281
+ border-radius : 8px;
1282
+ box-shadow : none;
1283
+ }
1284
+
1285
+ .yith-plugin-ui .select2-dropdown,
1286
+ .yith-plugin-fw-panel .select2-dropdown {
1287
+ border : 1px solid #d9d9d9;
1288
+ }
1289
+
1290
+ /** RADIO BUTTON **/
1291
+ .yith-plugin-ui [type="radio"]:checked,
1292
+ .yith-plugin-ui [type="radio"]:not(:checked) {
1293
+ position : absolute;
1294
+ left : -9999px;
1295
+ }
1296
+
1297
+ .yith-plugin-ui [type="radio"]:checked + label,
1298
+ .yith-plugin-ui [type="radio"]:not(:checked) + label {
1299
+ position : relative;
1300
+ padding-left : 35px;
1301
+ cursor : pointer;
1302
+ line-height : 20px;
1303
+ display : inline-block;
1304
+ color : #716269;
1305
+ font-size : 14px;
1306
+ }
1307
+
1308
+ .yith-plugin-ui [type="radio"]:checked + label:before,
1309
+ .yith-plugin-ui [type="radio"]:not(:checked) + label:before {
1310
+ content : '';
1311
+ position : absolute;
1312
+ left : 0;
1313
+ top : 0;
1314
+ width : 19px;
1315
+ height : 19px;
1316
+ border : 1px solid #d8d8d8;
1317
+ border-radius : 100%;
1318
+ background : #fff;
1319
+ }
1320
+
1321
+ .yith-plugin-ui [type="radio"]:checked + label:after,
1322
+ .yith-plugin-ui [type="radio"]:not(:checked) + label:after {
1323
+ content : '';
1324
+ width : 13px;
1325
+ height : 13px;
1326
+ background : #4e8ba2;
1327
+ position : absolute;
1328
+ top : 4px;
1329
+ left : 4px;
1330
+ border-radius : 100%;
1331
+ -webkit-transition : all 0.2s ease;
1332
+ transition : all 0.2s ease;
1333
+ }
1334
+
1335
+ .yith-plugin-ui [type="radio"]:not(:checked) + label:after {
1336
+ opacity : 0;
1337
+ -webkit-transform : scale(0);
1338
+ transform : scale(0);
1339
+ }
1340
+
1341
+ .yith-plugin-ui [type="radio"]:checked + label:after {
1342
+ opacity : 1;
1343
+ -webkit-transform : scale(1);
1344
+ transform : scale(1);
1345
+ }
1346
+
1347
+ /** CHECKBOX **/
1348
+ .yith-plugin-ui input[type="checkbox"] {
1349
+ -webkit-appearance : none;
1350
+ background-color : #fff;
1351
+ border : 1px solid #d8d8d8;
1352
+ box-shadow : none;
1353
+ width : 18px;
1354
+ height : 18px;
1355
+ border-radius : 3px;
1356
+ display : inline-block;
1357
+ position : relative;
1358
+ }
1359
+
1360
+ .yith-plugin-ui input[type="checkbox"]:checked {
1361
+ background-color : #4e8ba2;
1362
+ border-color : #488197;
1363
+ }
1364
+
1365
+ .yith-plugin-ui .forminp-checkbox span.description.inline {
1366
+ margin-left : 10px;
1367
+ }
1368
+
1369
+ .yith-plugin-ui input[type="checkbox"]:checked:before {
1370
+ display : none;
1371
+ }
1372
+
1373
+ .yith-plugin-ui input[type="checkbox"]:checked:after {
1374
+ content : "\e905";
1375
+ font-family : 'yith-icon';
1376
+ font-size : 15px;
1377
+ position : absolute;
1378
+ top : 8px;
1379
+ left : 1px;
1380
+ color : #fff;
1381
+ }
1382
+
1383
+ /** ONOFF **/
1384
+ .yith-plugin-ui .yith-plugin-fw-onoff-container input[type="checkbox"] {
1385
+ display : none;
1386
+ }
1387
+
1388
+ .yith-plugin-ui .yith-plugin-fw-onoff-container input + span {
1389
+ border : 1px solid #d8d8d8;
1390
+ background-color : #fff;
1391
+ width : 60px;
1392
+ height : 24px;
1393
+ }
1394
+
1395
+ .yith-plugin-ui .yith-plugin-fw-onoff-container input + span:before {
1396
+ background-color : #d8d8d8;
1397
+ }
1398
+
1399
+ .yith-plugin-ui .yith-plugin-fw-onoff-container input + span:before {
1400
+ width : 14px;
1401
+ height : 14px;
1402
+ top : 5px;
1403
+ left : 6px;
1404
+ background-color : #d8d8d8;
1405
+ }
1406
+
1407
+ .yith-plugin-ui .yith-plugin-fw-onoff-container input + span:after {
1408
+ content : attr(data-text-off);
1409
+ width : 14px;
1410
+ height : 14px;
1411
+ font-size : 13px;
1412
+ font-weight : 600;
1413
+ padding-left : 27px;
1414
+ color : #979797;
1415
+ margin-top : 5px;
1416
+ display : inline-block;
1417
+ white-space : nowrap;
1418
+ }
1419
+
1420
+ .yith-plugin-ui .yith-plugin-fw-onoff-container input:checked + span,
1421
+ .yith-plugin-ui .yith-plugin-fw-onoff-container input.onoffchecked + span {
1422
+ background-color : #fff;
1423
+ border-color : #98aa36;
1424
+ }
1425
+
1426
+ .yith-plugin-ui .yith-plugin-fw-onoff-container input:checked + span:before,
1427
+ .yith-plugin-ui.yith-plugin-fw-onoff-container input.onoffchecked + span:before {
1428
+ background-color : #98aa36;
1429
+ left : 41px;
1430
+ }
1431
+
1432
+ .yith-plugin-ui .yith-plugin-fw-onoff-container input:checked + span:after,
1433
+ .yith-plugin-ui.yith-plugin-fw-onoff-container input.onoffchecked + span:after {
1434
+ content : attr(data-text-on);
1435
+ color : #98aa36;
1436
+ width : 14px;
1437
+ height : 14px;
1438
+ display : inline-block;
1439
+ font-size : 13px;
1440
+ font-weight : 600;
1441
+ padding : 0 10px;
1442
+ margin-top : 5px;
1443
+ white-space : nowrap;
1444
+ }
1445
+
1446
+ .yith-plugin-ui .yith-plugin-fw-onoff-container input + span {
1447
+ text-indent : 0;
1448
+ }
1449
+
1450
+
1451
+ /**
1452
+ DATEPICKER
1453
+ */
1454
+ div#ui-datepicker-div.yith-plugin-fw-datepicker-div {
1455
+ border : 0;
1456
+ box-shadow : 0 2px 4px 0 rgba(0, 0, 0, 0.12), 0 2px 10px 0 rgba(0, 0, 0, 0.12) !important;
1457
+ }
1458
+
1459
+ #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-datepicker-header.ui-widget-header {
1460
+ background : #4e8ba2;
1461
+ color : #fff;
1462
+ font-size : 11px;
1463
+ line-height : 25px;
1464
+ border : 0;
1465
+ min-height : 25px;
1466
+ }
1467
+
1468
+ #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-datepicker-title {
1469
+ line-height : 25px;
1470
+ }
1471
+
1472
+ #ui-datepicker-div.yith-plugin-fw-datepicker-div.ui-datepicker th {
1473
+ color : #716269;
1474
+ }
1475
+
1476
+ #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-widget-header .ui-icon,
1477
+ #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-widget-header .ui-state-hover,
1478
+ #ui-datepicker-div.yith-plugin-fw-datepicker-div.ui-datepicker .ui-datepicker-prev,
1479
+ #ui-datepicker-div.yith-plugin-fw-datepicker-div.ui-datepicker .ui-datepicker-next,
1480
+ #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-icon.ui-icon-circle-triangle-w,
1481
+ #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-icon.ui-icon-circle-triangle-e {
1482
+ background : none;
1483
+ content : "";
1484
+ border : 0;
1485
+ text-indent : 0;
1486
+ width : 15px;
1487
+ height : 20px;
1488
+ display : block;
1489
+ overflow : hidden;
1490
+ }
1491
+
1492
+ .yith-plugin-ui .yith-password-wrapper {
1493
+ display : inline-block;
1494
+ width : auto;
1495
+ position : relative;
1496
+ }
1497
+
1498
+ .yith-plugin-ui .yith-password-wrapper .yith-password-eye-closed:before,
1499
+ .yith-plugin-ui .yith-password-wrapper .yith-password-eye:before {
1500
+ content : '\e911';
1501
+ color : #999;
1502
+ font-family : 'yith-icon';
1503
+ font-size : 20px;
1504
+ font-weight : normal;
1505
+ width : 15px;
1506
+ display : block;
1507
+ position : absolute;
1508
+ right : 13px;
1509
+ top : 0;
1510
+ line-height : 38px;
1511
+ bottom : 0;
1512
+ cursor : pointer;
1513
+ }
1514
+
1515
+ .yith-plugin-ui .yith-password-wrapper .yith-password-eye-closed:before {
1516
+ content : '\e912';
1517
+ }
1518
+
1519
+ #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-icon.ui-icon-circle-triangle-w:before {
1520
+ content : "\e901";
1521
+ color : #fff;
1522
+ font-family : 'yith-icon';
1523
+ font-size : 12px;
1524
+ font-weight : normal;
1525
+ width : 15px;
1526
+ display : block;
1527
+ }
1528
+
1529
+ #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-icon.ui-icon-circle-triangle-e:before {
1530
+ content : "\e902";
1531
+ color : #fff;
1532
+ text-indent : 0;
1533
+ font-family : 'yith-icon';
1534
+ font-size : 12px;
1535
+ font-weight : normal;
1536
+ width : 15px;
1537
+ display : block;
1538
+ }
1539
+
1540
+ /* arrow */
1541
+ #ui-datepicker-div.yith-plugin-fw-datepicker-div.ui-datepicker .ui-datepicker-prev,
1542
+ #ui-datepicker-div.yith-plugin-fw-datepicker-div.ui-datepicker .ui-datepicker-next,
1543
+ #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-datepicker-prev.ui-datepicker-prev-hover,
1544
+ #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-datepicker-prev.ui-datepicker-next-hover {
1545
+ top : 1px;
1546
+ cursor : pointer;
1547
+ }
1548
+
1549
+ #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-datepicker-prev.ui-datepicker-prev,
1550
+ #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-datepicker-prev.ui-datepicker-prev-hover {
1551
+ left : 5px;
1552
+ }
1553
+
1554
+ #ui-datepicker-div.yith-plugin-fw-datepicker-div.ui-datepicker .ui-datepicker-next,
1555
+ #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-datepicker-next.ui-datepicker-next-hover {
1556
+ right : 1px;
1557
+ }
1558
+
1559
+ #ui-datepicker-div.yith-plugin-fw-datepicker-div.ui-datepicker table {
1560
+ font-size : 10px;
1561
+ }
1562
+
1563
+ #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-state-default,
1564
+ #ui-datepicker-div.yith-plugin-fw-datepicker-div.ui-widget-content .ui-state-default,
1565
+ #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-widget-header .ui-state-default {
1566
+ background : #fff;
1567
+ border : 1px solid #d9d9d9;
1568
+
1569
+ }
1570
+
1571
+ #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-state-hover,
1572
+ #ui-datepicker-div.yith-plugin-fw-datepicker-div.ui-widget-content .ui-state-hover,
1573
+ #ui-datepicker-div.yith-plugin-fw-datepicker-div a.ui-state-default:focus,
1574
+ #ui-datepicker-div.yith-plugin-fw-datepicker-div.ui-widget-content .ui-state-focus,
1575
+ #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-widget-header .ui-state-focus {
1576
+ background : #ebf1f3;
1577
+ border : 1px solid #bfd5dd;
1578
+ outline : none;
1579
+ box-shadow : none;
1580
+ }
1581
+
1582
+ #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-widget-header .ui-state-hover,
1583
+ .woocommerce #ui-datepicker-div.yith-plugin-fw-datepicker-div .ui-state-focus {
1584
+ background : none;
1585
+ border : 0;
1586
+ }
1587
+
1588
+ /** colorpicker **/
1589
+ .yith-plugin-ui .iris-slider-offset.ui-slider.ui-widget-content {
1590
+ background : transparent !important;
1591
+ height : auto !important;
1592
+ }
1593
+
1594
+ .yith-plugin-ui .yith-plugin-fw-field-wrapper .yith-colorpicker-group:not(:first-child) {
1595
+ margin-top : 20px;
1596
+ }
1597
+
1598
+ .yith-plugin-ui .yith-plugin-fw-field-wrapper .iris-picker,
1599
+ .yith-plugin-ui .yith-plugin-fw-field-wrapper .wp-picker-holder {
1600
+ display : none !important;
1601
+ }
1602
+
1603
+ .yith-plugin-ui .yith-plugin-fw-field-wrapper .wp-picker-input-wrap,
1604
+ .yith-plugin-ui .yith-plugin-fw-field-wrapper .wp-picker-input-wrap > * {
1605
+ display: inline-block !important;
1606
+ vertical-align: middle;
1607
+ }
1608
+
1609
+ .yith-plugin-ui .yith-plugin-fw-field-wrapper .wp-picker-active .iris-picker,
1610
+ .yith-plugin-ui .yith-plugin-fw-field-wrapper .wp-picker-active .wp-picker-holder {
1611
+ display : block !important;
1612
+ }
1613
+
1614
+ .woocommerce .yith-plugin-ui .iris-picker {
1615
+ border : 0;
1616
+ margin-top : 20px;
1617
+ }
1618
+
1619
+ .yith-plugin-ui .yith-plugin-fw input[type=text].wp-color-picker {
1620
+ border : 0;
1621
+ padding : 2px 5px;
1622
+ height : 30px;
1623
+ }
1624
+
1625
+ .yith-plugin-ui .wp-color-result-text {
1626
+ display : none;
1627
+ }
1628
+
1629
+ .yith-plugin-ui .wp-picker-container .wp-color-result.button {
1630
+ width : 30px;
1631
+ height : 30px;
1632
+ box-shadow : none;
1633
+ border : 1px solid #d9d9d9;
1634
+ margin-bottom : 0;
1635
+ padding : 0;
1636
+ display : inline-block;
1637
+ vertical-align : middle;
1638
+ box-sizing : content-box;
1639
+ }
1640
+
1641
+ .yith-plugin-ui .wp-picker-default-custom {
1642
+ cursor : pointer;
1643
+ width : 25px;
1644
+ padding : 0 5px;
1645
+ display : inline-block;
1646
+ vertical-align : middle;
1647
+ position : relative;
1648
+ }
1649
+
1650
+ .yith-plugin-ui .wp-picker-default-custom input.button {
1651
+ opacity : 0;
1652
+ margin : 0;
1653
+ padding : 0;
1654
+ position : absolute;
1655
+ top : 0;
1656
+ right : 0;
1657
+ left : 0;
1658
+ bottom : 0;
1659
+ z-index : 2;
1660
+ }
1661
+
1662
+ .yith-plugin-ui .wp-picker-default-custom:before {
1663
+ content: "\e91a";
1664
+ text-indent : 0;
1665
+ font-family : 'yith-icon';
1666
+ font-size : 20px;
1667
+ color : #d8d8d8;
1668
+ font-weight : normal;
1669
+ width : 15px;
1670
+ display : block;
1671
+ background : none;
1672
+ line-height : 20px;
1673
+ margin-left : 8px;
1674
+ }
1675
+
1676
+ .yith-plugin-ui .wp-picker-container {
1677
+ width : auto;
1678
+ display : inline-block;
1679
+ border : 1px solid #d9d9d9;
1680
+ border-radius : 8px;
1681
+ padding : 5px;
1682
+ }
1683
+
1684
+ .yith-plugin-ui .iris-picker .iris-square-inner {
1685
+ box-shadow : none;
1686
+ border : 1px solid #d9d9d9;
1687
+ }
1688
+
1689
+ .yith-plugin-ui .yith-single-colorpicker {
1690
+ display : inline-block;
1691
+ width : 220px;
1692
+ }
1693
+
1694
+ .yith-plugin-ui .yith-single-colorpicker > label {
1695
+ display : block;
1696
+ font-size : 11px;
1697
+ font-weight : 600;
1698
+ margin : 0 0 10px 0;
1699
+ }
1700
+
1701
+ /* RANGE SLIDER */
1702
+ .yith-plugin-ui .yith-plugin-fw-slider-container .ui-slider-horizontal .ui-slider-handle {
1703
+ top : -45px !important;
1704
+ }
1705
+
1706
+ .yith-plugin-ui .yith-plugin-fw-slider-container .ui-slider-horizontal .ui-slider-handle {
1707
+ position : absolute;
1708
+ top : -33px;
1709
+ left : 0;
1710
+ width : auto !important;
1711
+ height : auto !important;
1712
+ padding : 2px 8px;
1713
+ margin-left : -15px;
1714
+ font-size : 12px;
1715
+ line-height : 20px;
1716
+ color : #4e8ba2;
1717
+ text-align : center;
1718
+ background-color : #fff;
1719
+ border : 1px solid #fff;
1720
+ border-radius : 3px;
1721
+ -webkit-transition : opacity .3s ease-in-out 0s;
1722
+ transition : opacity .3s ease-in-out 0s;
1723
+ box-shadow : 0px 1px 7px 0px rgba(1, 1, 1, 0.13);
1724
+ }
1725
+
1726
+ .yith-plugin-ui .yith-plugin-fw-slider-container .ui-slider-horizontal .ui-slider-handle:before {
1727
+ position : absolute;
1728
+ bottom : -3px;
1729
+ left : 50%;
1730
+ display : inline-block;
1731
+ width : 6px;
1732
+ height : 6px;
1733
+ margin-left : -3px;
1734
+ content : "";
1735
+ background-color : #fff;
1736
+ -webkit-transform : rotate(-45deg);
1737
+ -ms-transform : rotate(-45deg);
1738
+ transform : rotate(-45deg);
1739
+ }
1740
+
1741
+ .yith-plugin-ui .yith-plugin-fw-slider-container .ui-slider.ui-widget-content .ui-widget-header {
1742
+ background : #4e8ba2;
1743
+ }
1744
+
1745
+ .yith-plugin-ui .yith-plugin-fw-slider-container .ui-slider-horizontal .ui-slider-handle:after {
1746
+ content : '';
1747
+ width : 17px;
1748
+ height : 17px;
1749
+ display : block;
1750
+ position : absolute;
1751
+ background : #fff;
1752
+ top : 37px;
1753
+ border-radius : 50%;
1754
+ box-shadow : 0px 1px 6px 0px rgba(1, 1, 1, 0.25);
1755
+ cursor : grab;
1756
+ }
1757
+
1758
+ .yith-plugin-ui .yith-plugin-fw-slider-container .ui-slider-horizontal .ui-slider-handle:active:after{
1759
+ cursor : grabbing;
1760
+ }
1761
+
1762
+ .yith-plugin-ui .yith-plugin-fw-slider-container .ui-slider.ui-widget-content {
1763
+ height : 5px !important;
1764
+ }
1765
+
1766
+ .yith-plugin-ui .yith-plugin-fw-slider-container .ui-slider .minCaption,
1767
+ .yith-plugin-ui .yith-plugin-fw-slider-container .ui-slider .maxCaption {
1768
+ font-weight : 700;
1769
+ font-size : 12px;
1770
+ }
1771
+
1772
+
1773
+ /* ADD_BOX AND TOGGLE */
1774
+ .yith-plugin-ui .yith-add-box,
1775
+ .yith-plugin-ui .yith-toggle-row {
1776
+ width : 70%;
1777
+ border : 1px solid #d9d9d9;
1778
+ box-shadow : none;
1779
+ border-radius : 4px;
1780
+ margin : 20px 0;
1781
+ padding : 10px;
1782
+ box-sizing : border-box;
1783
+ background : white;
1784
+ }
1785
+
1786
+ .yith-plugin-ui .yith-toggle-row {
1787
+ cursor : pointer;
1788
+ transition : all ease 0.5s;
1789
+ }
1790
+ .yith-plugin-ui .yith-toggle-row.fixed {
1791
+ margin: 0;
1792
+ }
1793
+ .yith-plugin-ui .yith-toggle-row.highlight {
1794
+ transition : all ease 0.5s;
1795
+ /*box-shadow: 0 0 7px rgb(81, 117, 129);*/
1796
+ box-shadow : 0 0 7px rgb(30, 140, 190);
1797
+
1798
+ display : block;
1799
+ }
1800
+
1801
+ .yith-plugin-ui .yith-add-box {
1802
+ padding : 25px;
1803
+ display : none;
1804
+ }
1805
+
1806
+ .yith-plugin-ui .yith-toggle-title {
1807
+ position : relative;
1808
+ }
1809
+
1810
+ .yith-plugin-ui #plugin-fw-wc .yith-toggle-title h3,
1811
+ .yith-plugin-ui.metaboxes-tab h3,
1812
+ .yith-plugin-ui .yith-toggle-title h3 {
1813
+ padding : 0px 20px 0px 25px;
1814
+ margin : 3px 0;
1815
+
1816
+ display : inline-block;
1817
+ position : relative;
1818
+ min-width : 173px;
1819
+ box-sizing : border-box;
1820
+ font-weight : 600;
1821
+ font-size : 15px;
1822
+ color : #23282d;
1823
+ text-transform : inherit;
1824
+ }
1825
+
1826
+ .yith-plugin-ui .yith-toggle-title .subtitle {
1827
+ padding-left : 0;
1828
+ padding-top : 8px;
1829
+ font-size : 12px;
1830
+ }
1831
+
1832
+ .yith-plugin-ui .yith-toggle {
1833
+ position : absolute;
1834
+ width : 30px;
1835
+ cursor : pointer;
1836
+ left : 0;
1837
+ top : 0;
1838
+ bottom : 0;
1839
+ margin : auto;
1840
+ display : flex;
1841
+ align-items : center;
1842
+ }
1843
+
1844
+ .yith-plugin-ui .yith-toggle > span:before {
1845
+ color : #405e69;
1846
+ }
1847
+
1848
+ .yith-plugin-ui .yith-toggle > span {
1849
+ position : absolute;
1850
+ right : 50%;
1851
+ transition : transform .3s;
1852
+ line-height : 1;
1853
+ }
1854
+
1855
+
1856
+ .yith-plugin-ui .yith-toggle-row-opened .yith-toggle span {
1857
+ transform : rotateZ(90deg);
1858
+ }
1859
+
1860
+ .yith-plugin-ui .yith-toggle-content {
1861
+ display : none;
1862
+ position : relative;
1863
+ padding : 30px 25px;
1864
+ }
1865
+
1866
+ .yith-plugin-ui .yith-toggle-row-opened .yith-toggle-content {
1867
+ /* display: block;*/
1868
+ }
1869
+
1870
+ .yith-plugin-ui .yith-add-box-row,
1871
+ .yith-plugin-ui .yith-toggle-row-opened .yith-toggle-content .yith-toggle-content-row {
1872
+ display : table;
1873
+ margin-bottom : 40px;
1874
+ }
1875
+
1876
+ .yith-plugin-ui .yith-add-box-row label,
1877
+ .yith-plugin-ui .yith-toggle-row-opened .yith-toggle-content .yith-toggle-content-row > label {
1878
+ display : table-cell;
1879
+ width : 200px;
1880
+ padding-right : 21px;
1881
+ color : #33373b;
1882
+ font-size : 14px;
1883
+ vertical-align : top;
1884
+ font-weight : 600;
1885
+ }
1886
+
1887
+ .yith-plugin-ui .yith-add-box-row .yith-plugin-fw-field-wrapper:not(.yith-plugin-fw-title-field-wrapper),
1888
+ .yith-plugin-ui .yith-toggle-row-opened .yith-plugin-fw-field-wrapper:not(.yith-plugin-fw-title-field-wrapper) {
1889
+ /* display: table-cell;*/
1890
+ width : auto;
1891
+ float : none;
1892
+ vertical-align : middle;
1893
+ position : relative;
1894
+ }
1895
+
1896
+ .yith-plugin-ui .yith-add-box-row span.yith-icon,
1897
+ .yith-plugin-ui .yith-toggle-row-opened .yith-toggle-content .yith-toggle-content-row span.yith-icon {
1898
+ position : absolute;
1899
+ right : 15px;
1900
+ top : 0;
1901
+ bottom : 0;
1902
+ }
1903
+
1904
+ .yith-plugin-ui .yith-add-box-buttons,
1905
+ .yith-plugin-ui .yith-toggle-content-buttons {
1906
+ text-align : right;
1907
+ }
1908
+
1909
+ .yith-plugin-ui .yith-toggle-onoff {
1910
+ position : absolute;
1911
+ cursor : pointer;
1912
+ right : 0;
1913
+ }
1914
+
1915
+ .yith-plugin-ui .yith-toggle_wrapper.ui-sortable .yith-toggle-onoff {
1916
+ right : 30px;
1917
+ }
1918
+
1919
+ .yith-plugin-ui .yith-toggle-row .yith-icon-drag {
1920
+ position : absolute;
1921
+ right : 0;
1922
+ top : 25%;
1923
+ bottom : 0;
1924
+ line-height : 1;
1925
+ }
1926
+
1927
+ .yith-plugin-ui .yith-toggle-row.with-subtitle .yith-toggle-onoff {
1928
+ top : 25%;
1929
+ }
1930
+
1931
+ /** SPINNER **/
1932
+ .yith-plugin-ui .spinner {
1933
+ vertical-align : -5px;
1934
+ float : none;
1935
+ }
1936
+
1937
+ .yith-plugin-ui .spinner.show {
1938
+ visibility : visible;
1939
+ }
1940
+
1941
+ /* LIST TABLE */
1942
+ .yith-plugin-ui .form-table .list-table td {
1943
+ padding : 15px 0px;
1944
+ }
1945
+
1946
+ .woocommerce.yith-plugin-fw-panel .yith-plugin-ui table.form-table .bulkactions select {
1947
+ border : 1px solid #d8d8d8;
1948
+ max-width : 200px;
1949
+ max-height : 30px;
1950
+ padding : 0 10px;
1951
+ }
1952
+
1953
+ .yith-plugin-ui .form-table .list-table th {
1954
+ width : initial;
1955
+ }
1956
+
1957
+ .yith-plugin-ui #plugin-fw-wc table.form-table th.check-column {
1958
+ padding-left : 3px;
1959
+ }
1960
+
1961
+ .yith-plugin-ui #plugin-fw-wc table.wp-list-table tbody td {
1962
+ padding-left : 20px;
1963
+ }
1964
+
1965
+ .yith-plugin-ui #plugin-fw-wc table.wp-list-table th,
1966
+ .yith-plugin-ui #plugin-fw-wc table.wp-list-table td {
1967
+ padding : 15px 20px 15px 20px;
1968
+ }
1969
+
1970
+ .yith-plugin-ui #plugin-fw-wc table.wp-list-table thead td,
1971
+ .yith-plugin-ui #plugin-fw-wc table.wp-list-table thead th,
1972
+ .yith-plugin-ui #plugin-fw-wc table.wp-list-table tfoot td,
1973
+ .yith-plugin-ui #plugin-fw-wc table.wp-list-table tfoot th {
1974
+ padding : 3px 20px;
1975
+ }
1976
+
1977
+ .yith-plugin-ui #plugin-fw-wc table.wp-list-table thead a,
1978
+ .yith-plugin-ui #plugin-fw-wc table.wp-list-table tfoot a {
1979
+ padding-left : 0;
1980
+ }
1981
+
1982
+ .yith-plugin-ui .yith-plugin-fw-list-table h2 {
1983
+ border : 0;
1984
+ padding : 35px 0 15px;
1985
+ display : inline-block;
1986
+ margin-right : 10px;
1987
+ }
1988
+
1989
+ .yith-plugin-ui .form-table .yith-plugin-fw-list-table table th {
1990
+ vertical-align : middle;
1991
+ }
1992
+
1993
+ .yith-plugin-ui .yith-plugin-fw-list-table-container {
1994
+ padding : 0 20px;
1995
+ }
1996
+
1997
+ .yith-plugin-ui #doaction, .yith-plugin-ui #doaction2,
1998
+ .yith-plugin-ui #post-query-submit,
1999
+ .yith-plugin-ui #search-submit,
2000
+ .yith-plugin-ui .button.filter-button {
2001
+ margin-left : 0;
2002
+ height : 33px;
2003
+ padding : 0 10px;
2004
+ line-height : 33px;
2005
+ }
2006
+
2007
+ .yith-plugin-ui .bulkactions {
2008
+ margin : 10px 0;
2009
+ }
2010
+
2011
+ .yith-plugin-ui .form-table td p.yith-section-description {
2012
+ color : #716269;
2013
+ margin-bottom : 20px;
2014
+ }
2015
+
2016
+ /** Time picker width*/
2017
+ .yith-plugin-ui input.ui-timepicker-input {
2018
+ width : 100px !important;
2019
+ }
2020
+
2021
+ /** date format **/
2022
+ .yith-plugin-ui .yith-plugin-fw-date-format code {
2023
+ margin-left : 30px;
2024
+ }
2025
+
2026
+ .yith-plugin-ui .yith-plugin-fw-date-format input[type=text].small-text {
2027
+ margin-left : 45px;
2028
+ }
2029
+
2030
+ /** checkbox columns **/
2031
+ .yith-plugin-ui td.forminp-checkbox.two-cols fieldset {
2032
+ width : calc(50% - 20px);
2033
+ padding-right : 20px;
2034
+ float : left;
2035
+ }
2036
+
2037
+ .yith-plugin-ui td.forminp-checkbox.two-cols fieldset:nth-child(2n+1) {
2038
+ clear : both;
2039
+ }
2040
+
2041
+ .yith-plugin-ui td.forminp-checkbox.three-cols fieldset {
2042
+ width : calc(33% - 10px);
2043
+ padding-right : 10px;
2044
+ float : left;
2045
+ }
2046
+
2047
+ .yith-plugin-ui td.forminp-checkbox.three-cols fieldset:nth-child(3n+1) {
2048
+ clear : both;
2049
+ }
2050
+
2051
+ .yith-plugin-fw-checkbox-field-wrapper {
2052
+ display : inline-block !important;
2053
+ margin-right : 10px;
2054
+ }
2055
+
2056
+ .yith-plugin-fw-checkbox-field-wrapper + span.description {
2057
+ display : inline-block;
2058
+ vertical-align : middle;
2059
+ margin : 0;
2060
+ }
2061
+
2062
+ .yith-plugin-ui span.description {
2063
+ margin-top : 10px;
2064
+ line-height : 20px;
2065
+ }
2066
+
2067
+ .yith-plugin-fw-option-with-description {
2068
+ display : table-cell;
2069
+ width : auto;
2070
+ vertical-align : top;
2071
+ }
2072
+
2073
+
2074
+ /**
2075
+ * Required
2076
+ */
2077
+ .yith-plugin-fw-panel-wc-row.yith-plugin-fw--required th.titledesc > label:after,
2078
+ .yith-plugin-fw-metabox-field-row.yith-plugin-fw--required label:first-child:after,
2079
+ .yith-plugin-fw-toggle-element-field-wrapper .yith-plugin-fw--required > label:first-child:after {
2080
+ content : '*';
2081
+ color : #ea0034;
2082
+ font-weight : 800;
2083
+ margin-left : 4px;
2084
+ }
2085
+
2086
+ /** YITH PANEL **/
2087
+ .yith-plugin-ui #yith-plugin-fw-panel {
2088
+ margin-top : -10px;
2089
+ }
2090
+
2091
+ .yith-plugin-ui #plugin-fw-wc, .yith-plugin-ui #yith-plugin-fw-panel {
2092
+ padding-top : 0;
2093
+ }
2094
+
2095
+ .yith-plugin-ui .plugin-option tr {
2096
+ border : 0;
2097
+ }
2098
+
2099
+ /** MULTI SELECT **/
2100
+ .yith-plugin-ui .yith-plugin-fw-multi-select .yith-single-select {
2101
+ display: inline-block;
2102
+ width: 30%;
2103
+ margin-right: 3%;
2104
+ max-width: 400px;
2105
+ }
2106
+ .yith-plugin-ui .yith-plugin-fw-multi-select .yith-single-select label {
2107
+ display: block;
2108
+ font-size: 11px;
2109
+ font-weight: 600;
2110
+ margin: 0 0 10px 0;
2111
+ }
2112
+ .yith-plugin-ui .yith-plugin-fw-multi-select .yith-single-select select,
2113
+ .yith-plugin-ui .yith-plugin-fw-multi-select .yith-single-select span.select2 {
2114
+ width: 100% !important;
2115
+ min-width: auto !important;
2116
+ }
2117
+
2118
+ /** OVERRIDE WOOCOMMERCE CLASSES FOR 5.3 */
2119
+ .branch-5-3 .yith-plugin-fw .select2-container .select2-selection--single .select2-selection__arrow{
2120
+ background:none;
2121
+ }
2122
+ .branch-5-3 .yith-plugin-fw .select2-container.select2-container--focus .select2-selection--single, .branch-5-3 .yith-plugin-fw .select2-container.select2-container--open .select2-selection--multiple, .branch-5-3 .yith-plugin-fw .select2-container.select2-container--open .select2-selection--single{
2123
+ box-shadow: none;
2124
+ }
2125
+
2126
+ @media screen and (max-width : 1440px) {
2127
+ .yith-plugin-ui .yith-add-box,
2128
+ .yith-plugin-ui .yith-toggle-row:not(.fixed) {
2129
+ width : 80%;
2130
+ }
2131
+ }
2132
+
2133
+ @media screen and (max-width : 1024px) {
2134
+ .yith-plugin-ui .yith-add-box,
2135
+ .yith-plugin-ui .yith-toggle-row:not(.fixed) {
2136
+ width : 90%;
2137
+ }
2138
+
2139
+ .yith-plugin-ui td.forminp-checkbox.two-cols fieldset {
2140
+ width : 100%;
2141
+ padding-right : 20px;
2142
+ float : left;
2143
+ }
2144
+
2145
+ .yith-plugin-ui td.forminp-checkbox.three-cols fieldset {
2146
+ width : calc(50% - 10px);
2147
+ padding-right : 10px;
2148
+ float : left;
2149
+ }
2150
+
2151
+ .yith-plugin-ui td.forminp-checkbox.two-cols fieldset:nth-child(2n+1) {
2152
+ clear : both;
2153
+ }
2154
+
2155
+ .yith-plugin-ui td.forminp-checkbox.three-cols fieldset:nth-child(3n+1) {
2156
+ clear : initial;
2157
+ }
2158
+ }
2159
+
2160
+ @media screen and (max-width : 782px) {
2161
+ .yith-plugin-fw-banner h1 {
2162
+ line-height : 1.2em;
2163
+ }
2164
+ .yith-plugin-fw-banner h1{
2165
+ font-size: 12px;
2166
+ padding-right: 10px;
2167
+ }
2168
+ .yith-plugin-ui .yith-add-box,
2169
+ .yith-plugin-ui .yith-toggle-row {
2170
+ width : 100%;
2171
+ }
2172
+
2173
+ .yith-plugin-ui td.forminp-checkbox.two-cols fieldset,
2174
+ .yith-plugin-ui td.forminp-checkbox.three-cols fieldset {
2175
+ width : 100%;
2176
+ clear : initial;
2177
+ }
2178
+
2179
+ .yith-plugin-ui .wp-picker-container .wp-color-result.button {
2180
+ padding: 0;
2181
+ }
2182
+
2183
+ }
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/fonts/yith-icon.eot CHANGED
Binary file
plugin-fw/assets/fonts/yith-icon.svg CHANGED
@@ -34,4 +34,13 @@
34
  <glyph unicode="&#xe918;" glyph-name="time_check" d="M86.528 448.341c-0.341-235.008 189.952-425.643 424.96-425.984s425.643 189.952 425.984 424.96c0.171 83.968-24.576 166.059-71.168 236.032l-60.075-63.488c22.528-39.765 37.035-83.627 42.325-129.195h-80.384v-84.651h80.384c-19.627-154.795-141.483-276.651-296.277-296.277v84.651h-84.651v-84.651c-154.795 19.456-276.821 141.483-296.277 296.277h84.651v84.651h-84.651c18.432 155.307 140.971 277.845 296.277 296.277v-82.603h84.651v81.749c46.251-5.803 90.795-21.163 130.731-44.885l61.44 61.44c-68.779 46.080-149.675 70.827-232.448 71.168-234.837-0.341-425.301-190.635-425.472-425.472zM414.549 605.355l-59.563-59.733 157.013-157.013 410.624 410.965-59.733 59.733-350.891-350.891z" />
35
  <glyph unicode="&#xe919;" glyph-name="world_settings" d="M833.707 597.333l48.981 81.92-139.435 139.435-81.92-48.981c-8.875 4.267-18.091 7.851-27.648 11.435l-23.040 92.672h-98.645c-235.179-0.171-425.643-190.635-425.643-425.813s190.464-425.643 425.643-425.643h98.645l23.040 92.672c9.557 3.584 18.773 7.168 27.648 11.435l81.92-48.981 139.435 139.435-48.981 81.92c3.925 8.875 7.851 18.091 11.435 27.648l92.672 23.040v197.12l-92.672 23.040c-3.584 9.557-7.168 20.139-11.435 27.648zM319.659 448c0.171 35.669 3.243 71.339 9.216 106.496h147.627v-212.821h-147.627c-5.973 34.987-9.045 70.656-9.216 106.325zM476.501 795.989v-170.667h-129.877c28.16 86.699 75.264 150.869 129.877 170.667zM476.501 270.677v-171.008c-54.613 19.797-101.888 84.139-129.877 171.008h129.877zM547.499 547.669c55.125-20.309 83.456-81.579 63.147-136.704-10.752-29.184-33.792-52.224-63.147-63.147v199.851zM323.925 748.203c-22.869-38.4-40.277-79.701-51.712-122.709h-67.072c29.013 49.835 69.803 91.989 118.784 122.709zM173.568 554.496h83.797c-11.435-70.485-11.435-142.336 0-212.821h-83.797c-21.845 69.12-21.845 143.531 0 212.821zM205.141 270.677h67.072c11.435-43.179 29.013-84.651 51.712-123.051-48.981 30.72-89.771 73.045-118.784 123.051zM866.816 404.651l-77.312-19.456-5.632-19.115c-5.632-18.091-12.8-35.669-21.675-52.565l-9.557-17.749 40.789-68.096-61.099-61.44-68.437 41.301-17.749-9.557c-16.725-8.875-34.133-16.043-52.224-21.675l-19.456-5.632-19.115-77.312h-7.851v180.907c96.085 19.456 158.037 113.152 138.581 209.067-14.165 69.803-68.779 124.416-138.581 138.581v180.907h7.851l19.115-77.312 19.456-5.632c18.091-5.973 35.669-13.824 52.224-23.381l17.749-9.557 68.437 40.789 61.099-61.099-40.96-66.731 9.557-17.749c8.875-16.555 16.213-34.133 21.675-52.224l5.632-19.456 77.312-19.115 0.171-86.699z" />
36
  <glyph unicode="&#xe91a;" glyph-name="reply" d="M426 554.667q208-30 321-159t149-311q-154 218-470 218v-174l-298 298 298 298v-170z" />
 
 
 
 
 
 
 
 
 
37
  </font></defs></svg>
34
  <glyph unicode="&#xe918;" glyph-name="time_check" d="M86.528 448.341c-0.341-235.008 189.952-425.643 424.96-425.984s425.643 189.952 425.984 424.96c0.171 83.968-24.576 166.059-71.168 236.032l-60.075-63.488c22.528-39.765 37.035-83.627 42.325-129.195h-80.384v-84.651h80.384c-19.627-154.795-141.483-276.651-296.277-296.277v84.651h-84.651v-84.651c-154.795 19.456-276.821 141.483-296.277 296.277h84.651v84.651h-84.651c18.432 155.307 140.971 277.845 296.277 296.277v-82.603h84.651v81.749c46.251-5.803 90.795-21.163 130.731-44.885l61.44 61.44c-68.779 46.080-149.675 70.827-232.448 71.168-234.837-0.341-425.301-190.635-425.472-425.472zM414.549 605.355l-59.563-59.733 157.013-157.013 410.624 410.965-59.733 59.733-350.891-350.891z" />
35
  <glyph unicode="&#xe919;" glyph-name="world_settings" d="M833.707 597.333l48.981 81.92-139.435 139.435-81.92-48.981c-8.875 4.267-18.091 7.851-27.648 11.435l-23.040 92.672h-98.645c-235.179-0.171-425.643-190.635-425.643-425.813s190.464-425.643 425.643-425.643h98.645l23.040 92.672c9.557 3.584 18.773 7.168 27.648 11.435l81.92-48.981 139.435 139.435-48.981 81.92c3.925 8.875 7.851 18.091 11.435 27.648l92.672 23.040v197.12l-92.672 23.040c-3.584 9.557-7.168 20.139-11.435 27.648zM319.659 448c0.171 35.669 3.243 71.339 9.216 106.496h147.627v-212.821h-147.627c-5.973 34.987-9.045 70.656-9.216 106.325zM476.501 795.989v-170.667h-129.877c28.16 86.699 75.264 150.869 129.877 170.667zM476.501 270.677v-171.008c-54.613 19.797-101.888 84.139-129.877 171.008h129.877zM547.499 547.669c55.125-20.309 83.456-81.579 63.147-136.704-10.752-29.184-33.792-52.224-63.147-63.147v199.851zM323.925 748.203c-22.869-38.4-40.277-79.701-51.712-122.709h-67.072c29.013 49.835 69.803 91.989 118.784 122.709zM173.568 554.496h83.797c-11.435-70.485-11.435-142.336 0-212.821h-83.797c-21.845 69.12-21.845 143.531 0 212.821zM205.141 270.677h67.072c11.435-43.179 29.013-84.651 51.712-123.051-48.981 30.72-89.771 73.045-118.784 123.051zM866.816 404.651l-77.312-19.456-5.632-19.115c-5.632-18.091-12.8-35.669-21.675-52.565l-9.557-17.749 40.789-68.096-61.099-61.44-68.437 41.301-17.749-9.557c-16.725-8.875-34.133-16.043-52.224-21.675l-19.456-5.632-19.115-77.312h-7.851v180.907c96.085 19.456 158.037 113.152 138.581 209.067-14.165 69.803-68.779 124.416-138.581 138.581v180.907h7.851l19.115-77.312 19.456-5.632c18.091-5.973 35.669-13.824 52.224-23.381l17.749-9.557 68.437 40.789 61.099-61.099-40.96-66.731 9.557-17.749c8.875-16.555 16.213-34.133 21.675-52.224l5.632-19.456 77.312-19.115 0.171-86.699z" />
36
  <glyph unicode="&#xe91a;" glyph-name="reply" d="M426 554.667q208-30 321-159t149-311q-154 218-470 218v-174l-298 298 298 298v-170z" />
37
+ <glyph unicode="&#xe91b;" glyph-name="paypal-svgrepo-com" d="M948.695 781.407c41.592-76.275 27.867-166.22 11.486-219.376-88.641-289.544-488.607-273.795-546.47-273.795-57.795 0-71.254-53.893-71.254-53.893l-43.213-188.526c-11.779-66.175-71.793-62.877-71.793-62.877s-78.009 0-130.188 0c-3.273 0-6.328 0.225-9.134 0.631-0.645-12.117 1.079-47.541 44.401-47.541 52.139 0 130.147 0 130.147 0s60.013-3.366 71.834 62.806l43.165 188.519c0 0 13.507 53.897 71.301 53.897 57.767 0 457.829-15.746 546.514 273.808 19.787 64.717 35.874 183.635-46.797 266.347zM259.046 86.911l43.206 188.533c0 0 13.421 53.801 71.301 53.801 57.747 0 457.781-15.664 546.429 273.819 32.437 105.838 54.958 356.92-348.956 356.92h-291.749c0 0-60.641 2.816-75.606-61.659l-190.628-822.715c0 0-8.185-51.555 43.974-51.555 52.207 0 130.233 0 130.233 0s60.013-3.393 71.796 62.857zM369 565.482l38.741 167.179c0 0 12.339 45.462 52.207 52.193 39.827 6.755 107.667-1.201 125.12-4.495 113.299-21.279 89.201-128.478 89.201-128.478-22.433-165.476-280.007-142.514-280.007-142.514-40.383 14.602-25.262 56.115-25.262 56.115z" />
38
+ <glyph unicode="&#xe91c;" glyph-name="bank" d="M511.488 599.723c-8.875 0-16.213 7.168-16.213 16.213 0 4.608-3.755 8.363-8.363 8.363s-8.363-3.755-8.363-8.363c0-15.189 10.411-27.989 24.576-31.744v-6.315c0-4.608 3.755-8.363 8.363-8.363s8.363 3.755 8.363 8.363v6.315c14.165 3.755 24.576 16.384 24.576 31.744 0 18.091-14.848 32.939-32.939 32.939-8.875 0-16.213 7.168-16.213 16.213 0 8.875 7.168 16.213 16.213 16.213 8.533 0 15.531-6.656 16.213-15.019 0.341-4.608 4.437-8.021 8.875-7.851 4.608 0.341 8.192 4.267 7.851 8.875-1.024 14.336-11.093 25.941-24.576 29.525v6.315c0 4.608-3.755 8.363-8.363 8.363s-8.363-3.755-8.363-8.363v-6.315c-13.995-3.755-24.576-16.555-24.576-31.744 0-18.091 14.848-32.939 32.939-32.939 8.875 0 16.213-7.168 16.213-16.213s-7.339-16.213-16.213-16.213zM862.72 508.587c0 0.512-0.171 1.195-0.341 1.707s-0.171 1.024-0.341 1.365c-0.171 0.512-0.512 0.853-0.853 1.195-0.341 0.512-0.683 1.024-1.024 1.365-0.171 0.171-0.171 0.171-0.171 0.341l-342.699 283.648c-3.072 2.56-7.68 2.56-10.752 0l-342.187-283.477c-0.171-0.171-0.171-0.171-0.171-0.341-0.512-0.341-0.683-0.853-1.024-1.365-0.341-0.341-0.683-0.853-0.853-1.195-0.171-0.512-0.341-1.024-0.341-1.365-0.171-0.512-0.341-1.195-0.341-1.707 0-0.171 0-0.171 0-0.341v-66.56c0-4.608 3.755-8.363 8.363-8.363h85.504v-258.048h-85.845c-4.608 0-8.363-3.755-8.363-8.363v-55.467c0-1.365 0.341-2.56 0.853-3.584-0.512-1.024-0.853-2.219-0.853-3.584 0-4.608 3.755-8.363 8.363-8.363h678.571c4.608 0 8.363 3.755 8.363 8.363v62.635c0 4.608-3.755 8.363-8.363 8.363h-79.872v257.877h86.016c4.608 0 8.363 3.755 8.363 8.363v66.56c0 0.171 0 0.171 0 0.341zM178.005 450.048v49.835h667.989v-49.835h-667.989zM839.851 158.549v-45.909h-661.845v45.909h661.845zM482.816 175.275v258.048h62.123v-258.048h-62.123zM512 780.971l319.147-264.363h-638.293l319.147 264.363zM271.872 433.323h194.048v-258.048h-115.029v228.352c0 4.608-3.755 8.363-8.363 8.363s-8.363-3.755-8.363-8.363v-228.352h-62.123v258.048zM751.616 175.275h-189.952v258.048h110.933v-227.499c0-4.608 3.755-8.363 8.363-8.363s8.363 3.755 8.363 8.363v227.499h62.123v-258.048z" />
39
+ <glyph unicode="&#xe91d;" glyph-name="accounting" d="M862.72 432.128c0 0.512-0.171 1.024-0.341 1.536s-0.171 0.853-0.512 1.365c-0.171 0.341-0.512 0.853-0.853 1.195s-0.683 0.853-1.024 1.195c-0.171 0.171-0.171 0.171-0.341 0.341l-30.891 23.893c-2.56 2.048-6.315 2.219-9.045 0.341l-31.061-21.163-33.792 21.163c0 0 0 0 0 0h-0.171c-0.171 0.171-0.512 0.171-0.853 0.341-0.683 0.341-1.195 0.683-2.048 0.683-0.512 0-1.024 0-1.365 0-0.512 0-1.024 0-1.536 0-0.683-0.171-1.365-0.512-1.877-0.853-0.171-0.171-0.512-0.171-0.683-0.341v0c0 0 0 0 0 0l-5.973-4.096-29.184-19.797c-3.413-2.389-4.437-7.168-2.048-10.581 1.536-2.219 3.925-3.413 6.315-3.413 1.536 0 2.901 0.512 4.267 1.365l31.232 21.163 33.963-21.333c2.56-1.707 5.803-1.536 8.363 0.171l30.549 20.821 23.552-18.261v-152.747c0-43.861-35.669-79.701-79.701-79.701-43.861 0-79.701 35.669-79.701 79.701v407.723c0 47.957-35.84 87.723-82.261 94.037-1.024 0.512-2.219 1.024-3.584 1.024h-297.813c-52.395 0-94.891-42.667-94.891-94.891v-27.819h-13.995c-18.773 0-33.963-15.189-33.963-33.963v-468.821c0-18.773 15.189-33.963 33.963-33.963h341.504c18.773 0 33.963 15.189 33.963 33.963v468.651c0 18.773-15.189 33.963-33.963 33.963h-13.995v27.819c0 42.325 33.28 76.971 75.093 79.36 41.813-2.389 75.093-37.035 75.093-79.36v-407.723c0-33.28 17.408-62.635 43.52-79.701h-114.517c-4.267 0-7.68-3.413-7.68-7.68s3.413-7.68 7.68-7.68h166.059c52.395 0 94.891 42.667 94.891 94.891v156.501c-0.341 0.341-0.341 0.512-0.341 0.683zM507.563 682.837v-81.749c0-4.267 3.413-7.68 7.68-7.68s7.68 3.413 7.68 7.68v38.571h13.995c10.411 0 18.773-8.363 18.773-18.773v-468.821c0-10.24-8.363-18.773-18.773-18.773h-341.675c-10.24 0-18.773 8.363-18.773 18.773v468.992c0 10.24 8.363 18.773 18.773 18.773h13.995v-38.571c0-4.267 3.413-7.68 7.68-7.68h248.832c4.267 0 7.68 3.413 7.68 7.68s-3.413 7.68-7.68 7.68h-241.152v74.069c0 43.861 35.669 79.701 79.701 79.701h246.784c-26.283-17.237-43.52-46.421-43.52-79.872zM209.237 558.251v-85.333c0-4.267 3.413-7.68 7.68-7.68h298.155c4.267 0 7.68 3.413 7.68 7.68v85.333c0 4.267-3.413 7.68-7.68 7.68h-298.155c-4.096 0-7.68-3.413-7.68-7.68zM224.597 550.571h282.965v-70.144h-282.965v70.144zM290.304 416.597h-73.387c-4.267 0-7.68-3.413-7.68-7.68s3.413-7.68 7.68-7.68h73.387c4.267 0 7.68 3.413 7.68 7.68s-3.413 7.68-7.68 7.68zM402.773 416.597h-73.387c-4.267 0-7.68-3.413-7.68-7.68s3.413-7.68 7.68-7.68h73.387c4.267 0 7.68 3.413 7.68 7.68s-3.413 7.68-7.68 7.68zM515.243 416.597h-73.387c-4.267 0-7.68-3.413-7.68-7.68s3.413-7.68 7.68-7.68h73.387c4.267 0 7.68 3.413 7.68 7.68-0.171 4.267-3.584 7.68-7.68 7.68zM290.304 334.507h-73.387c-4.267 0-7.68-3.413-7.68-7.68s3.413-7.68 7.68-7.68h73.387c4.267 0 7.68 3.413 7.68 7.68s-3.413 7.68-7.68 7.68zM402.773 334.507h-73.387c-4.267 0-7.68-3.413-7.68-7.68s3.413-7.68 7.68-7.68h73.387c4.267 0 7.68 3.413 7.68 7.68s-3.413 7.68-7.68 7.68zM515.243 334.507h-73.387c-4.267 0-7.68-3.413-7.68-7.68s3.413-7.68 7.68-7.68h73.387c4.267 0 7.68 3.413 7.68 7.68s-3.584 7.68-7.68 7.68zM290.304 252.245h-73.387c-4.267 0-7.68-3.413-7.68-7.68s3.413-7.68 7.68-7.68h73.387c4.267 0 7.68 3.413 7.68 7.68s-3.413 7.68-7.68 7.68zM402.773 252.245h-73.387c-4.267 0-7.68-3.413-7.68-7.68s3.413-7.68 7.68-7.68h73.387c4.267 0 7.68 3.413 7.68 7.68s-3.413 7.68-7.68 7.68zM515.243 252.245h-73.387c-4.267 0-7.68-3.413-7.68-7.68s3.413-7.68 7.68-7.68h73.387c4.267 0 7.68 3.413 7.68 7.68-0.171 4.267-3.584 7.68-7.68 7.68z" />
40
+ <glyph unicode="&#xe91e;" glyph-name="bank-check" d="M862.72 645.803c-0.171 1.877-1.195 3.755-2.731 4.949l-96.768 75.776c-3.243 2.56-7.851 1.877-10.411-1.195l-274.091-349.184c-0.853-1.024-1.365-2.389-1.536-3.584l-14.677-118.955c-0.341-2.56 0.683-5.12 2.731-6.656 1.365-1.024 2.901-1.536 4.608-1.536 0.853 0 1.707 0.171 2.731 0.512l111.445 43.008c1.195 0.512 2.389 1.195 3.072 2.389l153.259 195.243v-303.957h-564.395l0.512 337.408 347.989-1.536c0 0 0 0 0 0 4.096 0 7.339 3.243 7.339 7.339s-3.243 7.339-7.339 7.339l-355.328 1.536c-2.219-0.341-3.755-0.683-5.291-2.219-1.365-1.365-2.219-3.243-2.219-5.291l-0.512-351.915c0-3.584 2.56-6.315 5.973-6.997 0.853-0.341 1.877-0.683 2.901-0.683h577.707c4.096 0 7.339 3.243 7.339 7.339v330.24l106.155 135.168c1.195 1.536 1.707 3.584 1.536 5.461zM587.776 315.904l-56.491 44.203c-3.243 2.56-7.851 1.877-10.411-1.195-2.56-3.243-1.877-7.851 1.195-10.411l56.491-44.203-1.877-2.389-98.133-37.888 12.971 104.619 222.208 283.136 61.099-47.957c1.365-1.024 2.901-1.536 4.608-1.536 2.219 0 4.267 1.024 5.803 2.901 2.56 3.243 1.877 7.851-1.195 10.411l-61.099 47.787 37.035 47.104 85.163-66.731-257.365-327.851zM466.261 443.051c0 4.096-3.243 7.339-7.339 7.339h-206.507c-4.096 0-7.339-3.243-7.339-7.339s3.243-7.339 7.339-7.339h206.507c3.925 0 7.339 3.243 7.339 7.339zM395.605 351.403c0 4.096-3.243 7.339-7.339 7.339h-136.021c-4.096 0-7.339-3.243-7.339-7.339s3.243-7.339 7.339-7.339h136.021c4.096 0 7.339 3.243 7.339 7.339zM252.245 267.264c-4.096 0-7.339-3.243-7.339-7.339s3.243-7.339 7.339-7.339h81.92c4.096 0 7.339 3.243 7.339 7.339s-3.243 7.339-7.339 7.339h-81.92z" />
41
+ <glyph unicode="&#xe91f;" glyph-name="cash" d="M387.072 268.629c1.024-0.853 2.389-1.195 3.755-1.195 0.853 0 1.707 0.171 2.56 0.512l138.752 59.733c3.243 1.365 4.779 5.291 3.413 8.533s-5.291 4.779-8.533 3.413l-135.339-58.368-218.795 151.552c-2.901 2.048-6.997 1.365-9.045-1.707-2.048-2.901-1.365-6.997 1.707-9.045l221.525-153.429zM852.48 474.453l-131.584-55.125c-3.243-1.365-4.949-5.12-3.413-8.533 1.024-2.56 3.413-3.925 5.973-3.925 0.853 0 1.707 0.171 2.56 0.512l131.584 55.125c3.243 1.365 4.949 5.12 3.413 8.533-1.365 3.243-5.291 4.779-8.533 3.413zM851.285 425.643l-153.771-64.341 2.219 83.285 0.683 0.341c0.341 0.171 0.512 0.171 0.853 0.341l157.696 66.048c2.219 0.853 3.755 2.901 3.925 5.291s-0.853 4.608-2.731 5.973l-221.696 153.6c-1.877 1.195-4.096 1.536-6.144 0.683l-464.213-194.389c-0.171 0-0.341-0.171-0.512-0.341-0.341-0.171-0.683-0.512-1.024-0.683-0.341-0.341-0.683-0.512-1.024-0.853-0.171-0.171-0.341-0.171-0.341-0.341-0.171-0.171-0.171-0.341-0.341-0.683s-0.341-0.853-0.512-1.195c-0.171-0.341-0.171-0.853-0.171-1.195s0-0.853 0-1.195c0-0.512 0.171-0.853 0.341-1.365 0-0.171 0-0.512 0.171-0.683 0-0.171 0.171-0.341 0.341-0.512 0.171-0.341 0.512-0.683 0.683-1.024 0.341-0.341 0.512-0.683 0.853-1.024 0.171-0.171 0.171-0.341 0.341-0.341l221.696-153.6c0 0 0 0 0 0 0.341-0.341 0.853-0.512 1.195-0.683 0.171 0 0.341-0.171 0.512-0.171 0.512-0.171 1.024-0.171 1.365-0.171 0.171 0 0.341 0 0.341 0v0c0 0 0 0 0 0 0.853 0 1.707 0.171 2.56 0.512l158.379 66.389-2.219-83.285-160.427-67.243-218.795 151.723c-2.901 2.048-6.997 1.365-9.045-1.707-2.048-2.901-1.365-6.997 1.707-9.045l221.696-153.6c1.195-0.853 2.389-1.195 3.755-1.195 0.853 0 1.707 0.171 2.56 0.512l464.213 194.389c3.243 1.365 4.949 5.12 3.413 8.533-1.536 3.072-5.291 4.608-8.533 3.243zM633.685 663.381l209.067-144.896-144.213-60.416-209.067 144.896 144.213 60.416zM392.704 330.069l-209.067 144.896 155.819 65.195 209.067-144.896-155.819-65.195zM566.101 395.264c0 0.171-0.171 0.341-0.171 0.683 0 0.512-0.171 0.853-0.171 1.365-0.171 0.341-0.171 0.853-0.512 1.195-0.171 0.341-0.341 0.683-0.683 1.024s-0.512 0.683-0.853 1.024c-0.171 0.171-0.341 0.341-0.512 0.512l-209.749 145.408 121.515 50.859 211.456-146.603-2.389-94.891-120.32-50.347 2.389 89.771zM391.168 437.76c-1.877 4.779-7.339 7.168-12.117 5.291s-7.168-7.339-5.291-12.117c1.877-4.779 7.339-7.168 12.117-5.291s7.168 7.339 5.291 12.117zM674.133 551.083c4.779 1.877 7.168 7.339 5.291 12.117s-7.339 7.168-12.117 5.291c-4.779-1.877-7.168-7.339-5.291-12.117 1.877-4.949 7.339-7.168 12.117-5.291z" />
42
+ <glyph unicode="&#xe920;" glyph-name="credit-card" d="M813.909 620.544h-645.12c-4.096 0-7.509-3.413-7.509-7.509v-376.832c0-4.096 3.413-7.509 7.509-7.509h645.12c4.096 0 7.509 3.413 7.509 7.509v376.832c0 4.096-3.243 7.509-7.509 7.509zM806.4 243.712h-630.101v361.813h630.101v-361.813zM717.141 378.197c-10.24 0-19.627-3.243-27.477-8.533-8.021 5.461-17.408 8.533-27.307 8.533-26.795 0-48.811-21.845-48.811-48.811s21.845-48.811 48.811-48.811c9.899 0 19.285 3.072 27.307 8.533 7.851-5.461 17.237-8.533 27.477-8.533 26.795 0 48.811 21.845 48.811 48.811s-22.016 48.811-48.811 48.811zM628.736 329.557c0 18.603 15.019 33.621 33.621 33.621 5.803 0 11.264-1.536 16.213-4.267-6.315-8.192-10.069-18.261-10.069-29.355s3.925-21.163 10.069-29.355c-4.949-2.731-10.411-4.267-16.213-4.267-18.603 0-33.621 15.019-33.621 33.621zM717.141 295.936c-18.603 0-33.621 15.019-33.621 33.621s15.019 33.621 33.621 33.621c18.603 0 33.621-15.019 33.621-33.621s-15.019-33.621-33.621-33.621zM224.427 472.064h117.589c4.096 0 7.509 3.413 7.509 7.509v80.555c0 4.096-3.413 7.509-7.509 7.509h-117.589c-4.096 0-7.509-3.413-7.509-7.509v-80.555c0-4.096 3.243-7.509 7.509-7.509zM231.936 552.619h102.571v-65.365h-102.571v65.365zM224.427 417.109h533.845c4.096 0 7.509 3.413 7.509 7.509s-3.413 7.509-7.509 7.509h-533.845c-4.096 0-7.509-3.413-7.509-7.509s3.243-7.509 7.509-7.509zM855.211 667.307h-628.736c-4.096 0-7.509-3.413-7.509-7.509s3.413-7.509 7.509-7.509h621.227v-359.765c0-4.096 3.413-7.509 7.509-7.509s7.509 3.413 7.509 7.509v367.275c0 4.096-3.413 7.509-7.509 7.509z" />
43
+ <glyph unicode="&#xe921;" glyph-name="check-circle" d="M483.499 298.667c-7.509 0-14.848 3.072-20.139 8.363l-99.499 99.669c-11.093 11.093-11.093 29.184 0 40.277s29.184 11.093 40.277 0l77.141-77.141 179.2 224.085c9.728 12.288 27.648 14.336 39.936 4.437 12.288-9.728 14.336-27.648 4.437-39.936l-199.168-249.173c-5.12-6.315-12.629-10.24-20.651-10.581-0.512 0-1.024 0-1.536 0zM512 35.499c-227.499 0-412.501 185.003-412.501 412.501s185.003 412.501 412.501 412.501 412.501-185.003 412.501-412.501-185.003-412.501-412.501-412.501zM512 803.499c-196.096 0-355.499-159.403-355.499-355.499s159.403-355.499 355.499-355.499 355.499 159.573 355.499 355.499-159.403 355.499-355.499 355.499z" />
44
+ <glyph unicode="&#xe922;" glyph-name="info-squared" d="M853.333 35.499h-682.667c-39.253 0-71.168 31.915-71.168 71.168v682.667c0 39.253 31.915 71.168 71.168 71.168h682.667c39.253 0 71.168-31.915 71.168-71.168v-682.667c0-39.253-31.915-71.168-71.168-71.168zM170.667 803.499c-7.851 0-14.165-6.315-14.165-14.165v-682.667c0-7.851 6.315-14.165 14.165-14.165h682.667c7.851 0 14.165 6.315 14.165 14.165v682.667c0 7.851-6.315 14.165-14.165 14.165h-682.667zM504.832 561.835c-19.627 0-35.499 15.872-35.499 35.499s15.872 35.499 35.499 35.499 35.499-15.872 35.499-35.499-15.872-35.499-35.499-35.499zM568.832 291.499h-28.501v199.168c0 15.701-12.8 28.501-28.501 28.501h-28.501c-15.701 0-28.501-12.8-28.501-28.501s12.8-28.501 28.501-28.501v-170.667h-28.501c-15.701 0-28.501-12.8-28.501-28.501s12.8-28.501 28.501-28.501h113.835c15.701 0 28.501 12.8 28.501 28.501s-12.629 28.501-28.331 28.501z" />
45
+ <glyph unicode="&#xe923;" glyph-name="warning-triangle" d="M504.832 789.333l384-682.667h-768l384 682.667zM504.832 846.165v0c-20.48 0-39.424-11.093-49.664-29.013l-384-682.667c-9.899-17.579-9.728-39.083 0.512-56.661 10.24-17.408 28.843-28.16 49.152-28.16h768c20.139 0 38.912 10.752 49.152 28.16s10.411 39.083 0.512 56.661l-384 682.667c-10.069 17.92-29.013 29.013-49.664 29.013v0zM504.832 276.48c23.552 0 42.667-19.115 42.667-42.667s-19.115-42.667-42.667-42.667-42.667 19.115-42.667 42.667 19.115 42.667 42.667 42.667zM497.835 334.165c-15.701 0-28.501 12.8-28.501 28.501v227.499c0 15.701 12.8 28.501 28.501 28.501s28.501-12.8 28.501-28.501v-227.499c-0.171-15.701-12.8-28.501-28.501-28.501z" />
46
  </font></defs></svg>
plugin-fw/assets/fonts/yith-icon.ttf CHANGED
Binary file
plugin-fw/assets/fonts/yith-icon.woff CHANGED
Binary file
plugin-fw/assets/images/arrow_down.svg CHANGED
File without changes
plugin-fw/assets/images/banner-premium.png CHANGED
File without changes
plugin-fw/assets/images/colorbox/border1.png CHANGED
File without changes
plugin-fw/assets/images/colorbox/border2.png CHANGED
File without changes
plugin-fw/assets/images/colorbox/loading.gif CHANGED
File without changes
plugin-fw/assets/images/double-sidebar.png CHANGED
File without changes
plugin-fw/assets/images/licence-error.png CHANGED
File without changes
plugin-fw/assets/images/no-sidebar.png CHANGED
File without changes
plugin-fw/assets/images/sidebar-left.png CHANGED
File without changes
plugin-fw/assets/images/sidebar-right.png CHANGED
File without changes
plugin-fw/assets/images/sleep.png CHANGED
File without changes
plugin-fw/assets/images/spinner.png CHANGED
File without changes
plugin-fw/assets/images/ui-icons_222222_256x240.png CHANGED
File without changes
plugin-fw/assets/images/ui-icons_2e83ff_256x240.png CHANGED
File without changes
plugin-fw/assets/images/ui-icons_454545_256x240.png CHANGED
File without changes
plugin-fw/assets/images/ui-icons_888888_256x240.png CHANGED
File without changes
plugin-fw/assets/images/x.png CHANGED
File without changes
plugin-fw/assets/images/yith-icon.svg CHANGED
File without changes
plugin-fw/assets/images/yithemes-icon.png CHANGED
File without changes
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/javascript-md5/md5.min.js CHANGED
File without changes
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,initi