Version Description
- Tweak: Update plugin core framework
Download this release
Release Info
Developer | yithemes |
Plugin | YITH Essential Kit for WooCommerce #1 |
Version | 1.3.8 |
Comparing to | |
See all releases |
Code changes from version 1.3.7 to 1.3.8
- README.txt +7 -3
- init.php +1 -1
- plugin-fw/assets/css/chosen/chosen.css +435 -435
- plugin-fw/assets/css/codemirror/codemirror.css +260 -260
- plugin-fw/assets/css/colorbox.css +65 -65
- plugin-fw/assets/css/metaboxes.css +663 -663
- plugin-fw/assets/css/overcast/jquery-ui-custom/jquery-ui-1.8.9.custom.css +577 -577
- plugin-fw/assets/css/yit-plugin-panel-sidebar.css +387 -387
- plugin-fw/assets/css/yit-plugin-panel.css +713 -713
- plugin-fw/assets/css/yit-upgrade-to-pro.css +76 -76
- plugin-fw/assets/css/yit-upgrader.css +13 -13
- plugin-fw/assets/js/chosen/ajax-chosen.jquery.js +80 -80
- plugin-fw/assets/js/chosen/ajax-chosen.jquery.min.js +1 -1
- plugin-fw/assets/js/chosen/chosen.jquery.js +1211 -1211
- plugin-fw/assets/js/codemirror/codemirror.js +5799 -5799
- plugin-fw/assets/js/codemirror/javascript.js +630 -630
- plugin-fw/assets/js/how-to.js +6 -6
- plugin-fw/assets/js/jquery.colorbox.js +1105 -1105
- plugin-fw/assets/js/metabox.js +354 -354
- plugin-fw/assets/js/metabox.min.js +11 -11
- plugin-fw/assets/js/multisite-updater.js +216 -216
- plugin-fw/assets/js/panel.spinner.js +139 -139
- plugin-fw/assets/js/panel.spinner.min.js +3 -3
- plugin-fw/assets/js/yit-cpt-unlimited.js +78 -78
- plugin-fw/assets/js/yit-cpt-unlimited.min.js +2 -2
- plugin-fw/assets/js/yit-cptu-sortable-posts.js +31 -31
- plugin-fw/assets/js/yit-plugin-panel-sidebar.js +55 -55
- plugin-fw/assets/js/yit-plugin-panel.js +339 -339
- plugin-fw/assets/js/yit-wp-pointer.js +83 -83
- plugin-fw/assets/js/yit-wp-pointer.min.js +2 -2
- plugin-fw/init.php +58 -56
- plugin-fw/languages/yith-plugin-fw-es_ES.po +0 -800
README.txt
CHANGED
@@ -3,8 +3,8 @@
|
|
3 |
Contributors: yithemes
|
4 |
Tags: woocommerce,yith woocommerce colors and labels variations,yith woocommerce zoom magnifier,yith woocommerce wishlist,yith woocommerce ajax product filter,yith woocommerce ajax search,yith woocommerce catalog mode,yith woocommerce advanced reviews, yith woocommerce badges management,yith woocommerce cart messages,yith woocommerce review reminder,yith woocommerce quick view,yith woocommerce mailchimp,yith woocommerce stripe,yith woocommerce request a quote,yith woocommerce tab manager,yith woocommerce multi vendor
|
5 |
Requires at least: 3.5.1
|
6 |
-
Tested up to: 4.7
|
7 |
-
Stable tag: 1.3.
|
8 |
License: GPLv2 or later
|
9 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
10 |
|
@@ -155,6 +155,10 @@ YITH Essential Kit for WooCommerce #1 will add a new submenu called "YITH Essent
|
|
155 |
|
156 |
== Changelog ==
|
157 |
|
|
|
|
|
|
|
|
|
158 |
= 1.3.7 =
|
159 |
|
160 |
* Fixed: Prevent plugin framework not loaded
|
@@ -357,4 +361,4 @@ YITH Essential Kit for WooCommerce #1 will add a new submenu called "YITH Essent
|
|
357 |
|
358 |
== Upgrade Notice ==
|
359 |
|
360 |
-
Last Stable Tag 1.3.7
|
3 |
Contributors: yithemes
|
4 |
Tags: woocommerce,yith woocommerce colors and labels variations,yith woocommerce zoom magnifier,yith woocommerce wishlist,yith woocommerce ajax product filter,yith woocommerce ajax search,yith woocommerce catalog mode,yith woocommerce advanced reviews, yith woocommerce badges management,yith woocommerce cart messages,yith woocommerce review reminder,yith woocommerce quick view,yith woocommerce mailchimp,yith woocommerce stripe,yith woocommerce request a quote,yith woocommerce tab manager,yith woocommerce multi vendor
|
5 |
Requires at least: 3.5.1
|
6 |
+
Tested up to: 4.7.2
|
7 |
+
Stable tag: 1.3.8
|
8 |
License: GPLv2 or later
|
9 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
10 |
|
155 |
|
156 |
== Changelog ==
|
157 |
|
158 |
+
= 1.3.8 =
|
159 |
+
|
160 |
+
* Tweak: Update plugin core framework
|
161 |
+
|
162 |
= 1.3.7 =
|
163 |
|
164 |
* Fixed: Prevent plugin framework not loaded
|
361 |
|
362 |
== Upgrade Notice ==
|
363 |
|
364 |
+
Last Stable Tag 1.3.7
|
init.php
CHANGED
@@ -7,7 +7,7 @@ Text Domain: yith-essential-kit-for-woocommerce-1
|
|
7 |
Domain Path: /languages/
|
8 |
Author: YIThemes
|
9 |
Author URI: http://yithemes.com/
|
10 |
-
Version: 1.3.
|
11 |
*/
|
12 |
|
13 |
if ( ! defined( 'ABSPATH' ) ) {
|
7 |
Domain Path: /languages/
|
8 |
Author: YIThemes
|
9 |
Author URI: http://yithemes.com/
|
10 |
+
Version: 1.3.8
|
11 |
*/
|
12 |
|
13 |
if ( ! defined( 'ABSPATH' ) ) {
|
plugin-fw/assets/css/chosen/chosen.css
CHANGED
@@ -1,435 +1,435 @@
|
|
1 |
-
/*!
|
2 |
-
Chosen, a Select Box Enhancer for jQuery and Prototype
|
3 |
-
by Patrick Filler for Harvest, http://getharvest.com
|
4 |
-
|
5 |
-
Version 1.1.0
|
6 |
-
Full source at https://github.com/harvesthq/chosen
|
7 |
-
Copyright (c) 2011 Harvest http://getharvest.com
|
8 |
-
|
9 |
-
MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
|
10 |
-
This file is generated by `grunt build`, do not edit it by hand.
|
11 |
-
*/
|
12 |
-
|
13 |
-
/* @group Base */
|
14 |
-
.chosen-container {
|
15 |
-
position: relative;
|
16 |
-
display: inline-block;
|
17 |
-
vertical-align: middle;
|
18 |
-
font-size: 13px;
|
19 |
-
zoom: 1;
|
20 |
-
*display: inline;
|
21 |
-
-webkit-user-select: none;
|
22 |
-
-moz-user-select: none;
|
23 |
-
user-select: none;
|
24 |
-
}
|
25 |
-
.chosen-container .chosen-drop {
|
26 |
-
position: absolute;
|
27 |
-
top: 100%;
|
28 |
-
left: -9999px;
|
29 |
-
z-index: 1010;
|
30 |
-
-webkit-box-sizing: border-box;
|
31 |
-
-moz-box-sizing: border-box;
|
32 |
-
box-sizing: border-box;
|
33 |
-
width: 100%;
|
34 |
-
border: 1px solid #aaa;
|
35 |
-
border-top: 0;
|
36 |
-
background: #fff;
|
37 |
-
box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15);
|
38 |
-
}
|
39 |
-
.chosen-container.chosen-with-drop .chosen-drop {
|
40 |
-
left: 0;
|
41 |
-
}
|
42 |
-
.chosen-container a {
|
43 |
-
cursor: pointer;
|
44 |
-
}
|
45 |
-
|
46 |
-
/* @end */
|
47 |
-
/* @group Single Chosen */
|
48 |
-
.chosen-container-single .chosen-single {
|
49 |
-
position: relative;
|
50 |
-
display: block;
|
51 |
-
overflow: hidden;
|
52 |
-
padding: 0 0 0 8px;
|
53 |
-
height: 23px;
|
54 |
-
border: 1px solid #aaa;
|
55 |
-
border-radius: 5px;
|
56 |
-
background-color: #fff;
|
57 |
-
background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4));
|
58 |
-
background: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
|
59 |
-
background: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
|
60 |
-
background: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
|
61 |
-
background: linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
|
62 |
-
background-clip: padding-box;
|
63 |
-
box-shadow: 0 0 3px white inset, 0 1px 1px rgba(0, 0, 0, 0.1);
|
64 |
-
color: #444;
|
65 |
-
text-decoration: none;
|
66 |
-
white-space: nowrap;
|
67 |
-
line-height: 24px;
|
68 |
-
}
|
69 |
-
.chosen-container-single .chosen-default {
|
70 |
-
color: #999;
|
71 |
-
}
|
72 |
-
.chosen-container-single .chosen-single span {
|
73 |
-
display: block;
|
74 |
-
overflow: hidden;
|
75 |
-
margin-right: 26px;
|
76 |
-
text-overflow: ellipsis;
|
77 |
-
white-space: nowrap;
|
78 |
-
}
|
79 |
-
.chosen-container-single .chosen-single-with-deselect span {
|
80 |
-
margin-right: 38px;
|
81 |
-
}
|
82 |
-
.chosen-container-single .chosen-single abbr {
|
83 |
-
position: absolute;
|
84 |
-
top: 6px;
|
85 |
-
right: 26px;
|
86 |
-
display: block;
|
87 |
-
width: 12px;
|
88 |
-
height: 12px;
|
89 |
-
background: url('../../images/chosen/chosen-sprite.png') -42px 1px no-repeat;
|
90 |
-
font-size: 1px;
|
91 |
-
}
|
92 |
-
.chosen-container-single .chosen-single abbr:hover {
|
93 |
-
background-position: -42px -10px;
|
94 |
-
}
|
95 |
-
.chosen-container-single.chosen-disabled .chosen-single abbr:hover {
|
96 |
-
background-position: -42px -10px;
|
97 |
-
}
|
98 |
-
.chosen-container-single .chosen-single div {
|
99 |
-
position: absolute;
|
100 |
-
top: 0;
|
101 |
-
right: 0;
|
102 |
-
display: block;
|
103 |
-
width: 18px;
|
104 |
-
height: 100%;
|
105 |
-
}
|
106 |
-
.chosen-container-single .chosen-single div b {
|
107 |
-
display: block;
|
108 |
-
width: 100%;
|
109 |
-
height: 100%;
|
110 |
-
background: url('../../images/chosen/chosen-sprite.png') no-repeat 0px 2px;
|
111 |
-
}
|
112 |
-
.chosen-container-single .chosen-search {
|
113 |
-
position: relative;
|
114 |
-
z-index: 1010;
|
115 |
-
margin: 0;
|
116 |
-
padding: 3px 4px;
|
117 |
-
white-space: nowrap;
|
118 |
-
}
|
119 |
-
.chosen-container-single .chosen-search input[type="text"] {
|
120 |
-
-webkit-box-sizing: border-box;
|
121 |
-
-moz-box-sizing: border-box;
|
122 |
-
box-sizing: border-box;
|
123 |
-
margin: 1px 0;
|
124 |
-
padding: 4px 20px 4px 5px;
|
125 |
-
width: 100%;
|
126 |
-
height: auto;
|
127 |
-
outline: 0;
|
128 |
-
border: 1px solid #aaa;
|
129 |
-
background: white url('../../images/chosen/chosen-sprite.png') no-repeat 100% -20px;
|
130 |
-
background: url('../../images/chosen/chosen-sprite.png') no-repeat 100% -20px;
|
131 |
-
font-size: 1em;
|
132 |
-
font-family: sans-serif;
|
133 |
-
line-height: normal;
|
134 |
-
border-radius: 0;
|
135 |
-
}
|
136 |
-
.chosen-container-single .chosen-drop {
|
137 |
-
margin-top: -1px;
|
138 |
-
border-radius: 0 0 4px 4px;
|
139 |
-
background-clip: padding-box;
|
140 |
-
}
|
141 |
-
.chosen-container-single.chosen-container-single-nosearch .chosen-search {
|
142 |
-
position: absolute;
|
143 |
-
left: -9999px;
|
144 |
-
}
|
145 |
-
|
146 |
-
/* @end */
|
147 |
-
/* @group Results */
|
148 |
-
.chosen-container .chosen-results {
|
149 |
-
position: relative;
|
150 |
-
overflow-x: hidden;
|
151 |
-
overflow-y: auto;
|
152 |
-
margin: 0 4px 4px 0;
|
153 |
-
padding: 0 0 0 4px;
|
154 |
-
max-height: 240px;
|
155 |
-
-webkit-overflow-scrolling: touch;
|
156 |
-
}
|
157 |
-
.chosen-container .chosen-results li {
|
158 |
-
display: none;
|
159 |
-
margin: 0;
|
160 |
-
padding: 5px 6px;
|
161 |
-
list-style: none;
|
162 |
-
line-height: 15px;
|
163 |
-
-webkit-touch-callout: none;
|
164 |
-
}
|
165 |
-
.chosen-container .chosen-results li.active-result {
|
166 |
-
display: list-item;
|
167 |
-
cursor: pointer;
|
168 |
-
}
|
169 |
-
.chosen-container .chosen-results li.disabled-result {
|
170 |
-
display: list-item;
|
171 |
-
color: #ccc;
|
172 |
-
cursor: default;
|
173 |
-
}
|
174 |
-
.chosen-container .chosen-results li.highlighted {
|
175 |
-
background-color: #3875d7;
|
176 |
-
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc));
|
177 |
-
background-image: -webkit-linear-gradient(#3875d7 20%, #2a62bc 90%);
|
178 |
-
background-image: -moz-linear-gradient(#3875d7 20%, #2a62bc 90%);
|
179 |
-
background-image: -o-linear-gradient(#3875d7 20%, #2a62bc 90%);
|
180 |
-
background-image: linear-gradient(#3875d7 20%, #2a62bc 90%);
|
181 |
-
color: #fff;
|
182 |
-
}
|
183 |
-
.chosen-container .chosen-results li.no-results {
|
184 |
-
display: list-item;
|
185 |
-
background: #f4f4f4;
|
186 |
-
}
|
187 |
-
.chosen-container .chosen-results li.group-result {
|
188 |
-
display: list-item;
|
189 |
-
font-weight: bold;
|
190 |
-
cursor: default;
|
191 |
-
}
|
192 |
-
.chosen-container .chosen-results li.group-option {
|
193 |
-
padding-left: 15px;
|
194 |
-
}
|
195 |
-
.chosen-container .chosen-results li em {
|
196 |
-
font-style: normal;
|
197 |
-
text-decoration: underline;
|
198 |
-
}
|
199 |
-
|
200 |
-
/* @end */
|
201 |
-
/* @group Multi Chosen */
|
202 |
-
.chosen-container-multi .chosen-choices {
|
203 |
-
position: relative;
|
204 |
-
overflow: hidden;
|
205 |
-
-webkit-box-sizing: border-box;
|
206 |
-
-moz-box-sizing: border-box;
|
207 |
-
box-sizing: border-box;
|
208 |
-
margin: 0;
|
209 |
-
padding: 0;
|
210 |
-
width: 100%;
|
211 |
-
height: auto !important;
|
212 |
-
height: 1%;
|
213 |
-
border: 1px solid #aaa;
|
214 |
-
background-color: #fff;
|
215 |
-
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
|
216 |
-
background-image: -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%);
|
217 |
-
background-image: -moz-linear-gradient(#eeeeee 1%, #ffffff 15%);
|
218 |
-
background-image: -o-linear-gradient(#eeeeee 1%, #ffffff 15%);
|
219 |
-
background-image: linear-gradient(#eeeeee 1%, #ffffff 15%);
|
220 |
-
cursor: text;
|
221 |
-
}
|
222 |
-
.chosen-container-multi .chosen-choices li {
|
223 |
-
float: left;
|
224 |
-
list-style: none;
|
225 |
-
}
|
226 |
-
.chosen-container-multi .chosen-choices li.search-field {
|
227 |
-
margin: 0;
|
228 |
-
padding: 0;
|
229 |
-
white-space: nowrap;
|
230 |
-
}
|
231 |
-
.chosen-container-multi .chosen-choices li.search-field input[type="text"] {
|
232 |
-
margin: 1px 0;
|
233 |
-
padding: 5px;
|
234 |
-
height: 15px;
|
235 |
-
outline: 0;
|
236 |
-
border: 0 !important;
|
237 |
-
background: transparent !important;
|
238 |
-
box-shadow: none;
|
239 |
-
color: #666;
|
240 |
-
font-size: 100%;
|
241 |
-
font-family: sans-serif;
|
242 |
-
line-height: normal;
|
243 |
-
border-radius: 0;
|
244 |
-
}
|
245 |
-
.chosen-container-multi .chosen-choices li.search-field .default {
|
246 |
-
color: #999;
|
247 |
-
}
|
248 |
-
.chosen-container-multi .chosen-choices li.search-choice {
|
249 |
-
position: relative;
|
250 |
-
margin: 3px 0 3px 5px;
|
251 |
-
padding: 3px 20px 3px 5px;
|
252 |
-
border: 1px solid #aaa;
|
253 |
-
border-radius: 3px;
|
254 |
-
background-color: #e4e4e4;
|
255 |
-
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
|
256 |
-
background-image: -webkit-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
|
257 |
-
background-image: -moz-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
|
258 |
-
background-image: -o-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
|
259 |
-
background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
|
260 |
-
background-clip: padding-box;
|
261 |
-
box-shadow: 0 0 2px white inset, 0 1px 0 rgba(0, 0, 0, 0.05);
|
262 |
-
color: #333;
|
263 |
-
line-height: 13px;
|
264 |
-
cursor: default;
|
265 |
-
}
|
266 |
-
.chosen-container-multi .chosen-choices li.search-choice .search-choice-close {
|
267 |
-
position: absolute;
|
268 |
-
top: 4px;
|
269 |
-
right: 3px;
|
270 |
-
display: block;
|
271 |
-
width: 12px;
|
272 |
-
height: 12px;
|
273 |
-
background: url('../../images/chosen/chosen-sprite.png') -42px 1px no-repeat;
|
274 |
-
font-size: 1px;
|
275 |
-
}
|
276 |
-
.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover {
|
277 |
-
background-position: -42px -10px;
|
278 |
-
}
|
279 |
-
.chosen-container-multi .chosen-choices li.search-choice-disabled {
|
280 |
-
padding-right: 5px;
|
281 |
-
border: 1px solid #ccc;
|
282 |
-
background-color: #e4e4e4;
|
283 |
-
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
|
284 |
-
background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
|
285 |
-
background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
|
286 |
-
background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
|
287 |
-
background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
|
288 |
-
color: #666;
|
289 |
-
}
|
290 |
-
.chosen-container-multi .chosen-choices li.search-choice-focus {
|
291 |
-
background: #d4d4d4;
|
292 |
-
}
|
293 |
-
.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close {
|
294 |
-
background-position: -42px -10px;
|
295 |
-
}
|
296 |
-
.chosen-container-multi .chosen-results {
|
297 |
-
margin: 0;
|
298 |
-
padding: 0;
|
299 |
-
}
|
300 |
-
.chosen-container-multi .chosen-drop .result-selected {
|
301 |
-
display: list-item;
|
302 |
-
color: #ccc;
|
303 |
-
cursor: default;
|
304 |
-
}
|
305 |
-
|
306 |
-
/* @end */
|
307 |
-
/* @group Active */
|
308 |
-
.chosen-container-active .chosen-single {
|
309 |
-
border: 1px solid #5897fb;
|
310 |
-
box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
|
311 |
-
}
|
312 |
-
.chosen-container-active.chosen-with-drop .chosen-single {
|
313 |
-
border: 1px solid #aaa;
|
314 |
-
-moz-border-radius-bottomright: 0;
|
315 |
-
border-bottom-right-radius: 0;
|
316 |
-
-moz-border-radius-bottomleft: 0;
|
317 |
-
border-bottom-left-radius: 0;
|
318 |
-
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #eeeeee), color-stop(80%, #ffffff));
|
319 |
-
background-image: -webkit-linear-gradient(#eeeeee 20%, #ffffff 80%);
|
320 |
-
background-image: -moz-linear-gradient(#eeeeee 20%, #ffffff 80%);
|
321 |
-
background-image: -o-linear-gradient(#eeeeee 20%, #ffffff 80%);
|
322 |
-
background-image: linear-gradient(#eeeeee 20%, #ffffff 80%);
|
323 |
-
box-shadow: 0 1px 0 #fff inset;
|
324 |
-
}
|
325 |
-
.chosen-container-active.chosen-with-drop .chosen-single div {
|
326 |
-
border-left: none;
|
327 |
-
background: transparent;
|
328 |
-
}
|
329 |
-
.chosen-container-active.chosen-with-drop .chosen-single div b {
|
330 |
-
background-position: -18px 2px;
|
331 |
-
}
|
332 |
-
.chosen-container-active .chosen-choices {
|
333 |
-
border: 1px solid #5897fb;
|
334 |
-
box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
|
335 |
-
}
|
336 |
-
.chosen-container-active .chosen-choices li.search-field input[type="text"] {
|
337 |
-
color: #111 !important;
|
338 |
-
}
|
339 |
-
|
340 |
-
/* @end */
|
341 |
-
/* @group Disabled Support */
|
342 |
-
.chosen-disabled {
|
343 |
-
opacity: 0.5 !important;
|
344 |
-
cursor: default;
|
345 |
-
}
|
346 |
-
.chosen-disabled .chosen-single {
|
347 |
-
cursor: default;
|
348 |
-
}
|
349 |
-
.chosen-disabled .chosen-choices .search-choice .search-choice-close {
|
350 |
-
cursor: default;
|
351 |
-
}
|
352 |
-
|
353 |
-
/* @end */
|
354 |
-
/* @group Right to Left */
|
355 |
-
.chosen-rtl {
|
356 |
-
text-align: right;
|
357 |
-
}
|
358 |
-
.chosen-rtl .chosen-single {
|
359 |
-
overflow: visible;
|
360 |
-
padding: 0 8px 0 0;
|
361 |
-
}
|
362 |
-
.chosen-rtl .chosen-single span {
|
363 |
-
margin-right: 0;
|
364 |
-
margin-left: 26px;
|
365 |
-
direction: rtl;
|
366 |
-
}
|
367 |
-
.chosen-rtl .chosen-single-with-deselect span {
|
368 |
-
margin-left: 38px;
|
369 |
-
}
|
370 |
-
.chosen-rtl .chosen-single div {
|
371 |
-
right: auto;
|
372 |
-
left: 3px;
|
373 |
-
}
|
374 |
-
.chosen-rtl .chosen-single abbr {
|
375 |
-
right: auto;
|
376 |
-
left: 26px;
|
377 |
-
}
|
378 |
-
.chosen-rtl .chosen-choices li {
|
379 |
-
float: right;
|
380 |
-
}
|
381 |
-
.chosen-rtl .chosen-choices li.search-field input[type="text"] {
|
382 |
-
direction: rtl;
|
383 |
-
}
|
384 |
-
.chosen-rtl .chosen-choices li.search-choice {
|
385 |
-
margin: 3px 5px 3px 0;
|
386 |
-
padding: 3px 5px 3px 19px;
|
387 |
-
}
|
388 |
-
.chosen-rtl .chosen-choices li.search-choice .search-choice-close {
|
389 |
-
right: auto;
|
390 |
-
left: 4px;
|
391 |
-
}
|
392 |
-
.chosen-rtl.chosen-container-single-nosearch .chosen-search,
|
393 |
-
.chosen-rtl .chosen-drop {
|
394 |
-
left: 9999px;
|
395 |
-
}
|
396 |
-
.chosen-rtl.chosen-container-single .chosen-results {
|
397 |
-
margin: 0 0 4px 4px;
|
398 |
-
padding: 0 4px 0 0;
|
399 |
-
}
|
400 |
-
.chosen-rtl .chosen-results li.group-option {
|
401 |
-
padding-right: 15px;
|
402 |
-
padding-left: 0;
|
403 |
-
}
|
404 |
-
.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div {
|
405 |
-
border-right: none;
|
406 |
-
}
|
407 |
-
.chosen-rtl .chosen-search input[type="text"] {
|
408 |
-
padding: 4px 5px 4px 20px;
|
409 |
-
background: white url('../../images/chosen/chosen-sprite.png') no-repeat -30px -20px;
|
410 |
-
background: url('../../images/chosen/chosen-sprite.png') no-repeat -30px -20px;
|
411 |
-
direction: rtl;
|
412 |
-
}
|
413 |
-
.chosen-rtl.chosen-container-single .chosen-single div b {
|
414 |
-
background-position: 6px 2px;
|
415 |
-
}
|
416 |
-
.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b {
|
417 |
-
background-position: -12px 2px;
|
418 |
-
}
|
419 |
-
|
420 |
-
/* @end */
|
421 |
-
/* @group Retina compatibility */
|
422 |
-
@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 144dpi) {
|
423 |
-
.chosen-rtl .chosen-search input[type="text"],
|
424 |
-
.chosen-container-single .chosen-single abbr,
|
425 |
-
.chosen-container-single .chosen-single div b,
|
426 |
-
.chosen-container-single .chosen-search input[type="text"],
|
427 |
-
.chosen-container-multi .chosen-choices .search-choice .search-choice-close,
|
428 |
-
.chosen-container .chosen-results-scroll-down span,
|
429 |
-
.chosen-container .chosen-results-scroll-up span {
|
430 |
-
background-image: url('../../images/chosen/chosen-sprite@2x.png') !important;
|
431 |
-
background-size: 52px 37px !important;
|
432 |
-
background-repeat: no-repeat !important;
|
433 |
-
}
|
434 |
-
}
|
435 |
-
/* @end */
|
1 |
+
/*!
|
2 |
+
Chosen, a Select Box Enhancer for jQuery and Prototype
|
3 |
+
by Patrick Filler for Harvest, http://getharvest.com
|
4 |
+
|
5 |
+
Version 1.1.0
|
6 |
+
Full source at https://github.com/harvesthq/chosen
|
7 |
+
Copyright (c) 2011 Harvest http://getharvest.com
|
8 |
+
|
9 |
+
MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
|
10 |
+
This file is generated by `grunt build`, do not edit it by hand.
|
11 |
+
*/
|
12 |
+
|
13 |
+
/* @group Base */
|
14 |
+
.chosen-container {
|
15 |
+
position: relative;
|
16 |
+
display: inline-block;
|
17 |
+
vertical-align: middle;
|
18 |
+
font-size: 13px;
|
19 |
+
zoom: 1;
|
20 |
+
*display: inline;
|
21 |
+
-webkit-user-select: none;
|
22 |
+
-moz-user-select: none;
|
23 |
+
user-select: none;
|
24 |
+
}
|
25 |
+
.chosen-container .chosen-drop {
|
26 |
+
position: absolute;
|
27 |
+
top: 100%;
|
28 |
+
left: -9999px;
|
29 |
+
z-index: 1010;
|
30 |
+
-webkit-box-sizing: border-box;
|
31 |
+
-moz-box-sizing: border-box;
|
32 |
+
box-sizing: border-box;
|
33 |
+
width: 100%;
|
34 |
+
border: 1px solid #aaa;
|
35 |
+
border-top: 0;
|
36 |
+
background: #fff;
|
37 |
+
box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15);
|
38 |
+
}
|
39 |
+
.chosen-container.chosen-with-drop .chosen-drop {
|
40 |
+
left: 0;
|
41 |
+
}
|
42 |
+
.chosen-container a {
|
43 |
+
cursor: pointer;
|
44 |
+
}
|
45 |
+
|
46 |
+
/* @end */
|
47 |
+
/* @group Single Chosen */
|
48 |
+
.chosen-container-single .chosen-single {
|
49 |
+
position: relative;
|
50 |
+
display: block;
|
51 |
+
overflow: hidden;
|
52 |
+
padding: 0 0 0 8px;
|
53 |
+
height: 23px;
|
54 |
+
border: 1px solid #aaa;
|
55 |
+
border-radius: 5px;
|
56 |
+
background-color: #fff;
|
57 |
+
background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4));
|
58 |
+
background: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
|
59 |
+
background: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
|
60 |
+
background: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
|
61 |
+
background: linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
|
62 |
+
background-clip: padding-box;
|
63 |
+
box-shadow: 0 0 3px white inset, 0 1px 1px rgba(0, 0, 0, 0.1);
|
64 |
+
color: #444;
|
65 |
+
text-decoration: none;
|
66 |
+
white-space: nowrap;
|
67 |
+
line-height: 24px;
|
68 |
+
}
|
69 |
+
.chosen-container-single .chosen-default {
|
70 |
+
color: #999;
|
71 |
+
}
|
72 |
+
.chosen-container-single .chosen-single span {
|
73 |
+
display: block;
|
74 |
+
overflow: hidden;
|
75 |
+
margin-right: 26px;
|
76 |
+
text-overflow: ellipsis;
|
77 |
+
white-space: nowrap;
|
78 |
+
}
|
79 |
+
.chosen-container-single .chosen-single-with-deselect span {
|
80 |
+
margin-right: 38px;
|
81 |
+
}
|
82 |
+
.chosen-container-single .chosen-single abbr {
|
83 |
+
position: absolute;
|
84 |
+
top: 6px;
|
85 |
+
right: 26px;
|
86 |
+
display: block;
|
87 |
+
width: 12px;
|
88 |
+
height: 12px;
|
89 |
+
background: url('../../images/chosen/chosen-sprite.png') -42px 1px no-repeat;
|
90 |
+
font-size: 1px;
|
91 |
+
}
|
92 |
+
.chosen-container-single .chosen-single abbr:hover {
|
93 |
+
background-position: -42px -10px;
|
94 |
+
}
|
95 |
+
.chosen-container-single.chosen-disabled .chosen-single abbr:hover {
|
96 |
+
background-position: -42px -10px;
|
97 |
+
}
|
98 |
+
.chosen-container-single .chosen-single div {
|
99 |
+
position: absolute;
|
100 |
+
top: 0;
|
101 |
+
right: 0;
|
102 |
+
display: block;
|
103 |
+
width: 18px;
|
104 |
+
height: 100%;
|
105 |
+
}
|
106 |
+
.chosen-container-single .chosen-single div b {
|
107 |
+
display: block;
|
108 |
+
width: 100%;
|
109 |
+
height: 100%;
|
110 |
+
background: url('../../images/chosen/chosen-sprite.png') no-repeat 0px 2px;
|
111 |
+
}
|
112 |
+
.chosen-container-single .chosen-search {
|
113 |
+
position: relative;
|
114 |
+
z-index: 1010;
|
115 |
+
margin: 0;
|
116 |
+
padding: 3px 4px;
|
117 |
+
white-space: nowrap;
|
118 |
+
}
|
119 |
+
.chosen-container-single .chosen-search input[type="text"] {
|
120 |
+
-webkit-box-sizing: border-box;
|
121 |
+
-moz-box-sizing: border-box;
|
122 |
+
box-sizing: border-box;
|
123 |
+
margin: 1px 0;
|
124 |
+
padding: 4px 20px 4px 5px;
|
125 |
+
width: 100%;
|
126 |
+
height: auto;
|
127 |
+
outline: 0;
|
128 |
+
border: 1px solid #aaa;
|
129 |
+
background: white url('../../images/chosen/chosen-sprite.png') no-repeat 100% -20px;
|
130 |
+
background: url('../../images/chosen/chosen-sprite.png') no-repeat 100% -20px;
|
131 |
+
font-size: 1em;
|
132 |
+
font-family: sans-serif;
|
133 |
+
line-height: normal;
|
134 |
+
border-radius: 0;
|
135 |
+
}
|
136 |
+
.chosen-container-single .chosen-drop {
|
137 |
+
margin-top: -1px;
|
138 |
+
border-radius: 0 0 4px 4px;
|
139 |
+
background-clip: padding-box;
|
140 |
+
}
|
141 |
+
.chosen-container-single.chosen-container-single-nosearch .chosen-search {
|
142 |
+
position: absolute;
|
143 |
+
left: -9999px;
|
144 |
+
}
|
145 |
+
|
146 |
+
/* @end */
|
147 |
+
/* @group Results */
|
148 |
+
.chosen-container .chosen-results {
|
149 |
+
position: relative;
|
150 |
+
overflow-x: hidden;
|
151 |
+
overflow-y: auto;
|
152 |
+
margin: 0 4px 4px 0;
|
153 |
+
padding: 0 0 0 4px;
|
154 |
+
max-height: 240px;
|
155 |
+
-webkit-overflow-scrolling: touch;
|
156 |
+
}
|
157 |
+
.chosen-container .chosen-results li {
|
158 |
+
display: none;
|
159 |
+
margin: 0;
|
160 |
+
padding: 5px 6px;
|
161 |
+
list-style: none;
|
162 |
+
line-height: 15px;
|
163 |
+
-webkit-touch-callout: none;
|
164 |
+
}
|
165 |
+
.chosen-container .chosen-results li.active-result {
|
166 |
+
display: list-item;
|
167 |
+
cursor: pointer;
|
168 |
+
}
|
169 |
+
.chosen-container .chosen-results li.disabled-result {
|
170 |
+
display: list-item;
|
171 |
+
color: #ccc;
|
172 |
+
cursor: default;
|
173 |
+
}
|
174 |
+
.chosen-container .chosen-results li.highlighted {
|
175 |
+
background-color: #3875d7;
|
176 |
+
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc));
|
177 |
+
background-image: -webkit-linear-gradient(#3875d7 20%, #2a62bc 90%);
|
178 |
+
background-image: -moz-linear-gradient(#3875d7 20%, #2a62bc 90%);
|
179 |
+
background-image: -o-linear-gradient(#3875d7 20%, #2a62bc 90%);
|
180 |
+
background-image: linear-gradient(#3875d7 20%, #2a62bc 90%);
|
181 |
+
color: #fff;
|
182 |
+
}
|
183 |
+
.chosen-container .chosen-results li.no-results {
|
184 |
+
display: list-item;
|
185 |
+
background: #f4f4f4;
|
186 |
+
}
|
187 |
+
.chosen-container .chosen-results li.group-result {
|
188 |
+
display: list-item;
|
189 |
+
font-weight: bold;
|
190 |
+
cursor: default;
|
191 |
+
}
|
192 |
+
.chosen-container .chosen-results li.group-option {
|
193 |
+
padding-left: 15px;
|
194 |
+
}
|
195 |
+
.chosen-container .chosen-results li em {
|
196 |
+
font-style: normal;
|
197 |
+
text-decoration: underline;
|
198 |
+
}
|
199 |
+
|
200 |
+
/* @end */
|
201 |
+
/* @group Multi Chosen */
|
202 |
+
.chosen-container-multi .chosen-choices {
|
203 |
+
position: relative;
|
204 |
+
overflow: hidden;
|
205 |
+
-webkit-box-sizing: border-box;
|
206 |
+
-moz-box-sizing: border-box;
|
207 |
+
box-sizing: border-box;
|
208 |
+
margin: 0;
|
209 |
+
padding: 0;
|
210 |
+
width: 100%;
|
211 |
+
height: auto !important;
|
212 |
+
height: 1%;
|
213 |
+
border: 1px solid #aaa;
|
214 |
+
background-color: #fff;
|
215 |
+
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
|
216 |
+
background-image: -webkit-linear-gradient(#eeeeee 1%, #ffffff 15%);
|
217 |
+
background-image: -moz-linear-gradient(#eeeeee 1%, #ffffff 15%);
|
218 |
+
background-image: -o-linear-gradient(#eeeeee 1%, #ffffff 15%);
|
219 |
+
background-image: linear-gradient(#eeeeee 1%, #ffffff 15%);
|
220 |
+
cursor: text;
|
221 |
+
}
|
222 |
+
.chosen-container-multi .chosen-choices li {
|
223 |
+
float: left;
|
224 |
+
list-style: none;
|
225 |
+
}
|
226 |
+
.chosen-container-multi .chosen-choices li.search-field {
|
227 |
+
margin: 0;
|
228 |
+
padding: 0;
|
229 |
+
white-space: nowrap;
|
230 |
+
}
|
231 |
+
.chosen-container-multi .chosen-choices li.search-field input[type="text"] {
|
232 |
+
margin: 1px 0;
|
233 |
+
padding: 5px;
|
234 |
+
height: 15px;
|
235 |
+
outline: 0;
|
236 |
+
border: 0 !important;
|
237 |
+
background: transparent !important;
|
238 |
+
box-shadow: none;
|
239 |
+
color: #666;
|
240 |
+
font-size: 100%;
|
241 |
+
font-family: sans-serif;
|
242 |
+
line-height: normal;
|
243 |
+
border-radius: 0;
|
244 |
+
}
|
245 |
+
.chosen-container-multi .chosen-choices li.search-field .default {
|
246 |
+
color: #999;
|
247 |
+
}
|
248 |
+
.chosen-container-multi .chosen-choices li.search-choice {
|
249 |
+
position: relative;
|
250 |
+
margin: 3px 0 3px 5px;
|
251 |
+
padding: 3px 20px 3px 5px;
|
252 |
+
border: 1px solid #aaa;
|
253 |
+
border-radius: 3px;
|
254 |
+
background-color: #e4e4e4;
|
255 |
+
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
|
256 |
+
background-image: -webkit-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
|
257 |
+
background-image: -moz-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
|
258 |
+
background-image: -o-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
|
259 |
+
background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
|
260 |
+
background-clip: padding-box;
|
261 |
+
box-shadow: 0 0 2px white inset, 0 1px 0 rgba(0, 0, 0, 0.05);
|
262 |
+
color: #333;
|
263 |
+
line-height: 13px;
|
264 |
+
cursor: default;
|
265 |
+
}
|
266 |
+
.chosen-container-multi .chosen-choices li.search-choice .search-choice-close {
|
267 |
+
position: absolute;
|
268 |
+
top: 4px;
|
269 |
+
right: 3px;
|
270 |
+
display: block;
|
271 |
+
width: 12px;
|
272 |
+
height: 12px;
|
273 |
+
background: url('../../images/chosen/chosen-sprite.png') -42px 1px no-repeat;
|
274 |
+
font-size: 1px;
|
275 |
+
}
|
276 |
+
.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover {
|
277 |
+
background-position: -42px -10px;
|
278 |
+
}
|
279 |
+
.chosen-container-multi .chosen-choices li.search-choice-disabled {
|
280 |
+
padding-right: 5px;
|
281 |
+
border: 1px solid #ccc;
|
282 |
+
background-color: #e4e4e4;
|
283 |
+
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
|
284 |
+
background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
|
285 |
+
background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
|
286 |
+
background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
|
287 |
+
background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
|
288 |
+
color: #666;
|
289 |
+
}
|
290 |
+
.chosen-container-multi .chosen-choices li.search-choice-focus {
|
291 |
+
background: #d4d4d4;
|
292 |
+
}
|
293 |
+
.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close {
|
294 |
+
background-position: -42px -10px;
|
295 |
+
}
|
296 |
+
.chosen-container-multi .chosen-results {
|
297 |
+
margin: 0;
|
298 |
+
padding: 0;
|
299 |
+
}
|
300 |
+
.chosen-container-multi .chosen-drop .result-selected {
|
301 |
+
display: list-item;
|
302 |
+
color: #ccc;
|
303 |
+
cursor: default;
|
304 |
+
}
|
305 |
+
|
306 |
+
/* @end */
|
307 |
+
/* @group Active */
|
308 |
+
.chosen-container-active .chosen-single {
|
309 |
+
border: 1px solid #5897fb;
|
310 |
+
box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
|
311 |
+
}
|
312 |
+
.chosen-container-active.chosen-with-drop .chosen-single {
|
313 |
+
border: 1px solid #aaa;
|
314 |
+
-moz-border-radius-bottomright: 0;
|
315 |
+
border-bottom-right-radius: 0;
|
316 |
+
-moz-border-radius-bottomleft: 0;
|
317 |
+
border-bottom-left-radius: 0;
|
318 |
+
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #eeeeee), color-stop(80%, #ffffff));
|
319 |
+
background-image: -webkit-linear-gradient(#eeeeee 20%, #ffffff 80%);
|
320 |
+
background-image: -moz-linear-gradient(#eeeeee 20%, #ffffff 80%);
|
321 |
+
background-image: -o-linear-gradient(#eeeeee 20%, #ffffff 80%);
|
322 |
+
background-image: linear-gradient(#eeeeee 20%, #ffffff 80%);
|
323 |
+
box-shadow: 0 1px 0 #fff inset;
|
324 |
+
}
|
325 |
+
.chosen-container-active.chosen-with-drop .chosen-single div {
|
326 |
+
border-left: none;
|
327 |
+
background: transparent;
|
328 |
+
}
|
329 |
+
.chosen-container-active.chosen-with-drop .chosen-single div b {
|
330 |
+
background-position: -18px 2px;
|
331 |
+
}
|
332 |
+
.chosen-container-active .chosen-choices {
|
333 |
+
border: 1px solid #5897fb;
|
334 |
+
box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
|
335 |
+
}
|
336 |
+
.chosen-container-active .chosen-choices li.search-field input[type="text"] {
|
337 |
+
color: #111 !important;
|
338 |
+
}
|
339 |
+
|
340 |
+
/* @end */
|
341 |
+
/* @group Disabled Support */
|
342 |
+
.chosen-disabled {
|
343 |
+
opacity: 0.5 !important;
|
344 |
+
cursor: default;
|
345 |
+
}
|
346 |
+
.chosen-disabled .chosen-single {
|
347 |
+
cursor: default;
|
348 |
+
}
|
349 |
+
.chosen-disabled .chosen-choices .search-choice .search-choice-close {
|
350 |
+
cursor: default;
|
351 |
+
}
|
352 |
+
|
353 |
+
/* @end */
|
354 |
+
/* @group Right to Left */
|
355 |
+
.chosen-rtl {
|
356 |
+
text-align: right;
|
357 |
+
}
|
358 |
+
.chosen-rtl .chosen-single {
|
359 |
+
overflow: visible;
|
360 |
+
padding: 0 8px 0 0;
|
361 |
+
}
|
362 |
+
.chosen-rtl .chosen-single span {
|
363 |
+
margin-right: 0;
|
364 |
+
margin-left: 26px;
|
365 |
+
direction: rtl;
|
366 |
+
}
|
367 |
+
.chosen-rtl .chosen-single-with-deselect span {
|
368 |
+
margin-left: 38px;
|
369 |
+
}
|
370 |
+
.chosen-rtl .chosen-single div {
|
371 |
+
right: auto;
|
372 |
+
left: 3px;
|
373 |
+
}
|
374 |
+
.chosen-rtl .chosen-single abbr {
|
375 |
+
right: auto;
|
376 |
+
left: 26px;
|
377 |
+
}
|
378 |
+
.chosen-rtl .chosen-choices li {
|
379 |
+
float: right;
|
380 |
+
}
|
381 |
+
.chosen-rtl .chosen-choices li.search-field input[type="text"] {
|
382 |
+
direction: rtl;
|
383 |
+
}
|
384 |
+
.chosen-rtl .chosen-choices li.search-choice {
|
385 |
+
margin: 3px 5px 3px 0;
|
386 |
+
padding: 3px 5px 3px 19px;
|
387 |
+
}
|
388 |
+
.chosen-rtl .chosen-choices li.search-choice .search-choice-close {
|
389 |
+
right: auto;
|
390 |
+
left: 4px;
|
391 |
+
}
|
392 |
+
.chosen-rtl.chosen-container-single-nosearch .chosen-search,
|
393 |
+
.chosen-rtl .chosen-drop {
|
394 |
+
left: 9999px;
|
395 |
+
}
|
396 |
+
.chosen-rtl.chosen-container-single .chosen-results {
|
397 |
+
margin: 0 0 4px 4px;
|
398 |
+
padding: 0 4px 0 0;
|
399 |
+
}
|
400 |
+
.chosen-rtl .chosen-results li.group-option {
|
401 |
+
padding-right: 15px;
|
402 |
+
padding-left: 0;
|
403 |
+
}
|
404 |
+
.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div {
|
405 |
+
border-right: none;
|
406 |
+
}
|
407 |
+
.chosen-rtl .chosen-search input[type="text"] {
|
408 |
+
padding: 4px 5px 4px 20px;
|
409 |
+
background: white url('../../images/chosen/chosen-sprite.png') no-repeat -30px -20px;
|
410 |
+
background: url('../../images/chosen/chosen-sprite.png') no-repeat -30px -20px;
|
411 |
+
direction: rtl;
|
412 |
+
}
|
413 |
+
.chosen-rtl.chosen-container-single .chosen-single div b {
|
414 |
+
background-position: 6px 2px;
|
415 |
+
}
|
416 |
+
.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b {
|
417 |
+
background-position: -12px 2px;
|
418 |
+
}
|
419 |
+
|
420 |
+
/* @end */
|
421 |
+
/* @group Retina compatibility */
|
422 |
+
@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 144dpi) {
|
423 |
+
.chosen-rtl .chosen-search input[type="text"],
|
424 |
+
.chosen-container-single .chosen-single abbr,
|
425 |
+
.chosen-container-single .chosen-single div b,
|
426 |
+
.chosen-container-single .chosen-search input[type="text"],
|
427 |
+
.chosen-container-multi .chosen-choices .search-choice .search-choice-close,
|
428 |
+
.chosen-container .chosen-results-scroll-down span,
|
429 |
+
.chosen-container .chosen-results-scroll-up span {
|
430 |
+
background-image: url('../../images/chosen/chosen-sprite@2x.png') !important;
|
431 |
+
background-size: 52px 37px !important;
|
432 |
+
background-repeat: no-repeat !important;
|
433 |
+
}
|
434 |
+
}
|
435 |
+
/* @end */
|
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,664 +1,664 @@
|
|
1 |
-
/* self-clear floats */
|
2 |
-
.clearfix:after { content:"."; display:block; height:0; clear:both; visibility:hidden; overflow:hidden; }
|
3 |
-
/* ie.css */
|
4 |
-
* html .clearfix { /* IE6 */
|
5 |
-
height:1%;
|
6 |
-
}
|
7 |
-
*:first-child+html .clearfix { /* IE7 */
|
8 |
-
min-height:1%;
|
9 |
-
}
|
10 |
-
|
11 |
-
.clearboth { clear: both }
|
12 |
-
|
13 |
-
/* === TAB STYLE */
|
14 |
-
.metaboxes-tab { margin:-6px -12px -8px; }
|
15 |
-
.metaboxes-tab div.tabs-panel { height:auto; overflow:visible; margin-top:0px; padding:0 10px; background:none; border:0; border-top:1px solid #D4D4D4; }
|
16 |
-
.metaboxes-tab ul.metaboxes-tabs { background:#F5F5F5; margin:0; padding:10px 0 0 5px; }
|
17 |
-
.metaboxes-tab ul.metaboxes-tabs li { padding:8px 15px; border:1px solid #D4D4D4; float:left; background:#EDEDED; border-bottom-color:#EDEDED; margin:0 0 -1px 5px; box-shadow:1px 1px 1px 0 #FFFFFF inset; }
|
18 |
-
.metaboxes-tab ul.metaboxes-tabs li a { color:#555; text-decoration:none; }
|
19 |
-
.metaboxes-tab ul.metaboxes-tabs li.tabs { background:#F6F6F6; border-bottom:1px solid #F6F6F6; }
|
20 |
-
.metaboxes-tab p.field-row { margin:20px 0; }
|
21 |
-
.metaboxes-tab div.sep { height:1px; background:#DFDFDF; clear:both; margin-left:-10px; margin-right:-10px; }
|
22 |
-
.metaboxes-tab label { font-weight:bold; width:160px; float:left; line-height:23px; margin-left:-184px; }
|
23 |
-
.metaboxes-tab label small { font-weight:normal; line-height:15px; font-style:italic; color:#999; display:block; }
|
24 |
-
.metaboxes-tab input[type="text"], .metaboxes-tab select, .metaboxes-tab textarea { width:30%; }
|
25 |
-
.metaboxes-tab input[type="checkbox"] { vertical-align: middle }
|
26 |
-
.metaboxes-tab select {padding:0;}
|
27 |
-
.metaboxes-tab input.button-secondary, .metaboxes-tab input.checkbox { width:auto; }
|
28 |
-
.metaboxes-tab .description { color:#AFAFAF; font-size:90%; font-style:italic; line-height:23px; padding-left:5px; }
|
29 |
-
.metaboxes-tab p.field-row.textarea .description { vertical-align:top; }
|
30 |
-
.metaboxes-tab p.field-row.checkbox {background:none;}
|
31 |
-
|
32 |
-
.metaboxes-tab .the-metabox { margin:20px 0; margin-left:184px;}
|
33 |
-
.metaboxes-tab .the-metabox.no-label { margin:20px 0; margin-left:0;}
|
34 |
-
.metaboxes-tab hr { height: 0px; border-top: 1px solid #dadada; width: auto; margin-left: -10px; margin-right: -10px; }
|
35 |
-
.metaboxes-tab .the-metabox p { margin:0;}
|
36 |
-
.metaboxes-tab .the-metabox:last-child { border-bottom: 0px; }
|
37 |
-
.metaboxes-tab .the-metabox.checkbox { background:none; }
|
38 |
-
.metaboxes-tab .the-metabox.slider .ui-slider { margin-right:15px; }
|
39 |
-
|
40 |
-
.metaboxes-tab span.desc { font-size: 11px; color: #AFAFAF; }
|
41 |
-
.metaboxes-tab span.desc.inline { display: inline-block; vertical-align: top; line-height: 23px; }
|
42 |
-
.metaboxes-tab .onoff span.desc, .metaboxes-tab .onoff label { padding:6px 0; }
|
43 |
-
.metaboxes-tab .select span.desc, .metaboxes-tab .select label { padding:2px 0; }
|
44 |
-
.metaboxes-tab .slider span.desc, .metaboxes-tab .slider label { padding:15px 0; }
|
45 |
-
.metaboxes-tab .slider span.desc { display:block; padding:20px 0; }
|
46 |
-
|
47 |
-
.metaboxes-tab ul.metaboxes-tabs li {
|
48 |
-
-webkit-border-top-left-radius: 3px;
|
49 |
-
-webkit-border-top-right-radius: 3px;
|
50 |
-
-moz-border-radius-topleft: 3px;
|
51 |
-
-moz-border-radius-topright: 3px;
|
52 |
-
border-top-left-radius: 3px;
|
53 |
-
border-top-right-radius: 3px;
|
54 |
-
}
|
55 |
-
|
56 |
-
/* image gallery */
|
57 |
-
.metaboxes-tab .image-gallery ul li{
|
58 |
-
display: inline-block;
|
59 |
-
width: 80px;
|
60 |
-
margin-left: 10px;
|
61 |
-
position: relative;
|
62 |
-
}
|
63 |
-
.metaboxes-tab .image-gallery ul li img{
|
64 |
-
width: 80px;
|
65 |
-
border: 1px solid #ccc;
|
66 |
-
}
|
67 |
-
.metaboxes-tab .image-gallery ul li ul{
|
68 |
-
position: absolute;
|
69 |
-
top: -6px;
|
70 |
-
right: -1px;
|
71 |
-
width: 20px;
|
72 |
-
height: 20px;
|
73 |
-
}
|
74 |
-
.metaboxes-tab .image-gallery ul a.delete{
|
75 |
-
background: url(../images/x.png) no-repeat;
|
76 |
-
width: 20px;
|
77 |
-
height: 20px;
|
78 |
-
display: block;
|
79 |
-
text-indent: -99999px;
|
80 |
-
}
|
81 |
-
/* sidebar layout */
|
82 |
-
.yit-sidebar-layout input[type="radio"] {
|
83 |
-
display: none;
|
84 |
-
width: 0px;
|
85 |
-
}
|
86 |
-
.yit-sidebar-layout input[type="radio"]:first-child {
|
87 |
-
margin-right: -2px;
|
88 |
-
}
|
89 |
-
|
90 |
-
.yit-sidebar-layout input[type="radio"] + img {
|
91 |
-
border: 2px solid #fff;
|
92 |
-
padding: 1px;
|
93 |
-
}
|
94 |
-
|
95 |
-
.yit-sidebar-layout input[type="radio"] + img:hover {
|
96 |
-
cursor: pointer;
|
97 |
-
}
|
98 |
-
|
99 |
-
.yit-sidebar-layout input[checked] + img {
|
100 |
-
border: 2px solid #f2ad35;
|
101 |
-
padding: 1px;
|
102 |
-
}
|
103 |
-
|
104 |
-
.yit-sidebar-layout select {
|
105 |
-
vertical-align: 12px;
|
106 |
-
width: inherit !important;
|
107 |
-
}
|
108 |
-
|
109 |
-
/* wp editor */
|
110 |
-
.the-metabox.textarea-editor .mceIframeContainer {
|
111 |
-
background:#fff;
|
112 |
-
}
|
113 |
-
.the-metabox.textarea-editor label {
|
114 |
-
margin-top:24px;
|
115 |
-
}
|
116 |
-
|
117 |
-
/* categories */
|
118 |
-
.categories-panel { width:30%; float:left; margin-right:4px; }
|
119 |
-
.categories-panel .box { height:200px; border:1px solid #DFDFDF; background:#fff; padding:6px 10px; overflow: auto; }
|
120 |
-
.categories-panel ul { list-style:none; margin:0; }
|
121 |
-
.categories-panel ul li { line-height: 19px; margin: 0; padding: 0; word-wrap: break-word; }
|
122 |
-
.categories-panel ul li label { font-weight:normal !important; margin-left:0 !important; }
|
123 |
-
.categories-panel input.newcategory { width:100%; margin-bottom:3px; }
|
124 |
-
|
125 |
-
/* contact form */
|
126 |
-
.contactform_item {
|
127 |
-
border-style: solid;
|
128 |
-
border-width: 1px;
|
129 |
-
line-height: 1;
|
130 |
-
margin-bottom: 20px;
|
131 |
-
padding: 0;
|
132 |
-
background-color: #F5F5F5;
|
133 |
-
background-image: -moz-linear-gradient(center top , #F9F9F9, #F5F5F5);
|
134 |
-
border-color: #DFDFDF;
|
135 |
-
border-radius: 3px 3px 3px 3px;
|
136 |
-
box-shadow: 0 1px 0 #FFFFFF inset;
|
137 |
-
min-width: 255px;
|
138 |
-
position: relative;
|
139 |
-
}
|
140 |
-
.contactform_item .handlediv { position:relative; top: -4px; }
|
141 |
-
.contactform_item h3 { min-height: 21px }
|
142 |
-
.contactform_item .inside { padding: 10px !important; }
|
143 |
-
.contactform_item .deps { display: none; }
|
144 |
-
.contactform_item .addoptions p.option { margin: 5px 0 5px 200px }
|
145 |
-
.contactform_item .addoptions p label { width: 80px !important; }
|
146 |
-
.contactform_item .add-field-option { margin-bottom: 10px !important; }
|
147 |
-
.remove_item { float: right; }
|
148 |
-
.metabox-sortable-placeholder { border: 1px dotted #dedede; margin: 10px 0 }
|
149 |
-
|
150 |
-
/* features tab */
|
151 |
-
.featurestab_item{
|
152 |
-
border-style: solid;
|
153 |
-
border-width: 1px;
|
154 |
-
line-height: 1;
|
155 |
-
margin-bottom: 20px;
|
156 |
-
padding: 0;
|
157 |
-
background-color: #F5F5F5;
|
158 |
-
background-image: -moz-linear-gradient(center top , #F9F9F9, #F5F5F5);
|
159 |
-
border-color: #DFDFDF;
|
160 |
-
border-radius: 3px 3px 3px 3px;
|
161 |
-
box-shadow: 0 1px 0 #FFFFFF inset;
|
162 |
-
min-width: 255px;
|
163 |
-
position: relative;
|
164 |
-
}
|
165 |
-
.featurestab_item .handlediv { position:relative; top: -4px; }
|
166 |
-
.featurestab_item h3 { min-height: 21px }
|
167 |
-
.featurestab_item .inside { padding: 10px !important; }
|
168 |
-
.featurestab_item .deps { display: none; }
|
169 |
-
.featurestab_item .addoptions p.option { margin: 5px 0 5px 200px }
|
170 |
-
.featurestab_item .addoptions p label { width: 80px !important; }
|
171 |
-
.featurestab_item .add-field-option { margin-bottom: 10px !important; }
|
172 |
-
|
173 |
-
/* slider */
|
174 |
-
.the-metabox.slider { padding-top:20px; }
|
175 |
-
|
176 |
-
/* on off */
|
177 |
-
.the-metabox .rm_onoff span.onoff { float:left; margin-right:5px; margin-left:-4px; /* image fix */ }
|
178 |
-
|
179 |
-
/* onoff */
|
180 |
-
.rm_onoff input {
|
181 |
-
display: none;
|
182 |
-
}
|
183 |
-
|
184 |
-
.rm_onoff input + span {
|
185 |
-
cursor: pointer;
|
186 |
-
text-indent: -9999px;
|
187 |
-
display: block;
|
188 |
-
width: 85px;
|
189 |
-
height: 37px;
|
190 |
-
background: transparent url(../images/off.png);
|
191 |
-
}
|
192 |
-
|
193 |
-
.rm_onoff input:checked + span {
|
194 |
-
background: transparent url(../images/on.png);
|
195 |
-
}
|
196 |
-
|
197 |
-
.rm_onoff input.onoffchecked + span {
|
198 |
-
background: transparent url(../images/on.png);
|
199 |
-
}
|
200 |
-
|
201 |
-
.messages-panel.updated {
|
202 |
-
margin: 10px 0px 10px !important;
|
203 |
-
max-width: 1200px;
|
204 |
-
border-radius: 5px;
|
205 |
-
-webkit-box-sizing: border-box;
|
206 |
-
box-sizing: border-box;
|
207 |
-
}
|
208 |
-
|
209 |
-
.ui-widget-overlay { background-image: none !important; }
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
/* select */
|
214 |
-
.the-metabox .select_wrapper { width:341px; background-color:#fff; }
|
215 |
-
.the-metabox .select_wrapper select { width:100%; }
|
216 |
-
.the-metabox .icon_type{ width:30%; float: left; margin-right: 40px }
|
217 |
-
.the-metabox .icon_type select, .the-metabox div.option .select_wrapper select{ width: 100% }
|
218 |
-
|
219 |
-
#post-type-settings .category-list label { width: 187px; }
|
220 |
-
.remove_cat { float: right; text-align:center; display: block; width: 20px; height: 20px; border-radius: 20px; font-weight: bold; font-size: 10px; background: #efefef; text-decoration: none; }
|
221 |
-
|
222 |
-
.the-metabox .select_wrapper {
|
223 |
-
background: url("../images/select.png") no-repeat scroll right center #FAFAFA;
|
224 |
-
border-color: #CCCCCC #EEEEEE #EEEEEE #CCCCCC;
|
225 |
-
border-radius: 4px 4px 4px 4px;
|
226 |
-
border-style: solid;
|
227 |
-
border-width: 1px;
|
228 |
-
color: #555555;
|
229 |
-
display: block;
|
230 |
-
float: left;
|
231 |
-
font-family: sans-serif;
|
232 |
-
font-size: 12px;
|
233 |
-
min-height: 26px;
|
234 |
-
margin-bottom: 9px !important;
|
235 |
-
margin-left: 0;
|
236 |
-
margin-right: 5px;
|
237 |
-
margin-top: 0;
|
238 |
-
width: 400px;
|
239 |
-
position: relative;
|
240 |
-
}
|
241 |
-
|
242 |
-
/*chosen*/
|
243 |
-
|
244 |
-
.chosen .select_wrapper {
|
245 |
-
background: none;
|
246 |
-
border: none;
|
247 |
-
}
|
248 |
-
.chosen .select_wrapper .chosen-container{
|
249 |
-
width: 338px!important;
|
250 |
-
}
|
251 |
-
.chosen .select_wrapper .chosen-container .search-field input{
|
252 |
-
height: 27px!important;
|
253 |
-
color: #333;
|
254 |
-
}
|
255 |
-
.chosen .select_wrapper .chosen-container .chosen-choices{
|
256 |
-
border: 1px solid #ddd;
|
257 |
-
box-shadow: none;
|
258 |
-
}
|
259 |
-
.chosen .select_wrapper .chosen-container .chosen-choices li.search-choice{
|
260 |
-
height: 15px!important;
|
261 |
-
min-width: 105px;
|
262 |
-
}
|
263 |
-
.chosen .select_wrapper .chosen-container .chosen-choices li.search-choice span{
|
264 |
-
line-height: 15px;
|
265 |
-
height: 15px;
|
266 |
-
padding-top: 2px;
|
267 |
-
}
|
268 |
-
.chosen .select_wrapper .chosen-container .chosen-choices li.search-choice a.search-choice-close{
|
269 |
-
top: 5px;
|
270 |
-
}
|
271 |
-
.chosen .select_wrapper .chosen-container .chosen-drop .chosen-search input{
|
272 |
-
width: 100%!important;
|
273 |
-
}
|
274 |
-
.select_wrapper span {
|
275 |
-
height: 26px;
|
276 |
-
line-height: 26px;
|
277 |
-
padding-left: 6px;
|
278 |
-
position: absolute;
|
279 |
-
z-index: 2;
|
280 |
-
overflow: hidden;
|
281 |
-
}
|
282 |
-
|
283 |
-
.the-metabox .select_wrapper select {
|
284 |
-
cursor: pointer;
|
285 |
-
height: 28px;
|
286 |
-
margin: 0;
|
287 |
-
opacity: 0;
|
288 |
-
padding: 0;
|
289 |
-
position: relative;
|
290 |
-
width: inherit;
|
291 |
-
z-index: 4;
|
292 |
-
background-color: #FAFAFA;
|
293 |
-
}
|
294 |
-
|
295 |
-
|
296 |
-
/* typography */
|
297 |
-
.the-metabox.typography .select_wrapper.font-family { width:200px; }
|
298 |
-
.the-metabox.typography .spinner_container { float:left; margin-right:10px; }
|
299 |
-
.the-metabox.typography .spinner_container input.number {
|
300 |
-
width:50px !important;
|
301 |
-
-webkit-border-top-right-radius: 0px;
|
302 |
-
-webkit-border-bottom-right-radius: 0px;
|
303 |
-
-moz-border-radius-topright: 0px;
|
304 |
-
-moz-border-radius-bottomright: 0px;
|
305 |
-
border-top-right-radius: 0px;
|
306 |
-
border-bottom-right-radius: 0px;
|
307 |
-
}
|
308 |
-
|
309 |
-
/* number */
|
310 |
-
.the-metabox.number input.number { width:50px !important; }
|
311 |
-
/* number */
|
312 |
-
.rm_number .number {
|
313 |
-
width: 70px;
|
314 |
-
text-align: right;
|
315 |
-
-webkit-border-top-right-radius: 0px;
|
316 |
-
-webkit-border-bottom-right-radius: 0px;
|
317 |
-
-moz-border-radius-topright: 0px;
|
318 |
-
-moz-border-radius-bottomright: 0px;
|
319 |
-
border-top-right-radius: 0px;
|
320 |
-
border-bottom-right-radius: 0px;
|
321 |
-
}
|
322 |
-
|
323 |
-
.spinner-wrapper { position: relative; height: 23px; overflow: hidden; }
|
324 |
-
.spinner-wrapper input.number { float: left; }
|
325 |
-
.spinner-wrapper .spinner-button { cursor:pointer; float: left; position: absolute; left: 69px; width: 15px; height: 12px; border: 1px solid #DFDFDF; background: #fff; margin: 0; padding: 0; line-height: 9999px; overflow: hidden; background: url('../images/spinner.png') no-repeat center -11px }
|
326 |
-
.spinner-wrapper .spinner-button.button-plus { top: 0; -webkit-border-top-right-radius: 3px !important; -moz-border-radius-topright: 3px !important; border-top-right-radius: 3px !important; }
|
327 |
-
.spinner-wrapper .spinner-button.button-minus { bottom: 0; background-position: center -30px; -webkit-border-bottom-right-radius: 3px !important; -moz-border-radius-bottomright: 3px !important; border-bottom-right-radius: 3px !important; }
|
328 |
-
|
329 |
-
|
330 |
-
.spinner-wrapper .spinner-button.button-plus:active { background-position: center 0px; }
|
331 |
-
.spinner-wrapper .spinner-button.button-minus:active { background-position: center -20px; }
|
332 |
-
|
333 |
-
|
334 |
-
.rm_typography .spinner_container { float: left; margin-right: 10px; }
|
335 |
-
.rm_typography .spinner-wrapper { height: 28px; }
|
336 |
-
.rm_typography .spinner-wrapper input.number { height: 28px; }
|
337 |
-
.rm_typography .spinner-wrapper .spinner-button.button-plus { height: 15px; background-position: center -10px; }
|
338 |
-
.rm_typography .spinner-wrapper .spinner-button.button-minus { height: 14px; }
|
339 |
-
|
340 |
-
.the-metabox .spinner-wrapper .spinner-button { left: 49px; }
|
341 |
-
.the-metabox.typography .spinner-wrapper .spinner-button { left: 35px; }
|
342 |
-
|
343 |
-
/* colorpicker */
|
344 |
-
.the-metabox.colorpicker { display:block; width: auto; height: auto; overflow: visible; background-image: none; position: static; font-family: inherit;}
|
345 |
-
.the-metabox.colorpicker input { background-color: transparent; border: 1px solid #DFDFDF; position: static; font-size: inherit; font-family: inherit; color: inherit; text-align: center; margin: 0 5px 0px; padding: 0; outline: none; width: auto; }
|
346 |
-
|
347 |
-
/* images */
|
348 |
-
.the-metabox.images, .the-metabox.images label { margin-left:0; display:block; }
|
349 |
-
.the-metabox.images .slides-wrapper { clear:both; }
|
350 |
-
.the-metabox.images .slides-wrapper li { position:relative; }
|
351 |
-
.the-metabox.images a.delete { display:block; margin-left:4px; text-decoration:none; font-weight:bold; color:red; position:absolute; top:0; right:0; width:10px; height:18px; z-index:10; cursor:pointer !important; }
|
352 |
-
|
353 |
-
/* wp editor */
|
354 |
-
.wp_themeSkin iframe { background: #fff !important; }
|
355 |
-
|
356 |
-
/* custom tabs */
|
357 |
-
.customtab_item {
|
358 |
-
border-style: solid;
|
359 |
-
border-width: 1px;
|
360 |
-
line-height: 1;
|
361 |
-
margin-bottom: 20px;
|
362 |
-
padding: 0;
|
363 |
-
background-color: #F5F5F5;
|
364 |
-
background-image: -moz-linear-gradient(center top , #F9F9F9, #F5F5F5);
|
365 |
-
border-color: #DFDFDF;
|
366 |
-
border-radius: 3px 3px 3px 3px;
|
367 |
-
box-shadow: 0 1px 0 #FFFFFF inset;
|
368 |
-
min-width: 255px;
|
369 |
-
position: relative;
|
370 |
-
}
|
371 |
-
.customtab_item .handlediv { position:relative; top: -4px; }
|
372 |
-
.customtab_item h3 { min-height: 21px }
|
373 |
-
.customtab_item .inside { padding: 10px !important; }
|
374 |
-
.customtab_item .deps { display: none; }
|
375 |
-
.customtab_item .addoptions p.option { margin: 5px 0 5px 200px }
|
376 |
-
.customtab_item .addoptions p label { width: 80px !important; }
|
377 |
-
.customtab_item .add-field-option { margin-bottom: 10px !important; }
|
378 |
-
.customtab_item .remove_item { float: right; }
|
379 |
-
.metabox-sortable-placeholder { border: 1px dotted #dedede; margin: 10px 0 }
|
380 |
-
|
381 |
-
.the-metabox.customtabs {
|
382 |
-
margin-left: 0;
|
383 |
-
}
|
384 |
-
|
385 |
-
#customtab_item_sample {
|
386 |
-
display: none;
|
387 |
-
}
|
388 |
-
|
389 |
-
.the-metabox.customtabs .field-row {
|
390 |
-
margin-bottom: 10px;
|
391 |
-
}
|
392 |
-
|
393 |
-
#yit_custom_tabs label {
|
394 |
-
font-weight: normal;
|
395 |
-
width: auto;
|
396 |
-
float: none;
|
397 |
-
line-height: auto;
|
398 |
-
margin-left: 0;
|
399 |
-
}
|
400 |
-
|
401 |
-
|
402 |
-
.wp-admin p label input[type=radio]{
|
403 |
-
width: 16px;
|
404 |
-
margin-right: 10px;
|
405 |
-
margin-top: 3px;
|
406 |
-
}
|
407 |
-
.wp-admin .form-field._preset_onsale_icon_field label input[type=radio]{
|
408 |
-
margin-top: 0;
|
409 |
-
}
|
410 |
-
|
411 |
-
.the-metabox .spinner {
|
412 |
-
margin-top: 5px;
|
413 |
-
float: none;
|
414 |
-
}
|
415 |
-
|
416 |
-
/* slider */
|
417 |
-
/*numbers*/
|
418 |
-
.ui-slider .maxCaption, .ui-slider .minCaption {
|
419 |
-
margin-bottom: 5px;
|
420 |
-
}
|
421 |
-
.ui-slider .feedback {
|
422 |
-
background: url(../images/slider/tooltip.png) no-repeat center top;
|
423 |
-
position: absolute;
|
424 |
-
top: -25px;
|
425 |
-
width: 35px;
|
426 |
-
height: 43px;
|
427 |
-
text-align: center;
|
428 |
-
width: 100%;
|
429 |
-
display: block;
|
430 |
-
}
|
431 |
-
.ui-slider .feedback strong {
|
432 |
-
display: inline-block;
|
433 |
-
padding-top: 4px;
|
434 |
-
top: -30px;
|
435 |
-
}
|
436 |
-
/*handle*/
|
437 |
-
.ui-slider-horizontal .ui-slider-handle{
|
438 |
-
background: transparent url(../images/slider/handle.png) no-repeat left top !important;
|
439 |
-
border: 0px !important;
|
440 |
-
top: -.35em !important;
|
441 |
-
width: 18px !important;
|
442 |
-
height: 19px !important;
|
443 |
-
}
|
444 |
-
|
445 |
-
/*bg on the left:grey*/
|
446 |
-
.ui-slider.ui-widget-content {
|
447 |
-
background: url(../images/slider/grey.gif) repeat-x left center !important;
|
448 |
-
border-color: #c1c1c0 !important;
|
449 |
-
height: 10px !important;
|
450 |
-
}
|
451 |
-
|
452 |
-
.iris-slider-offset.ui-slider.ui-widget-content {
|
453 |
-
background: transparent!important;
|
454 |
-
height: auto!important;
|
455 |
-
}
|
456 |
-
|
457 |
-
/*bg on the right:orange*/
|
458 |
-
.ui-slider.ui-widget-content .ui-widget-header {
|
459 |
-
background: url(../images/slider/orange.gif) repeat-x left center !important;
|
460 |
-
left: 2px !important;
|
461 |
-
-webkit-border-radius: 15px;
|
462 |
-
-moz-border-radius: 15px;
|
463 |
-
-khtml-border-radius: 15px;
|
464 |
-
border-radius: 15px;
|
465 |
-
}
|
466 |
-
|
467 |
-
|
468 |
-
/*sidebars*/
|
469 |
-
|
470 |
-
#choose-sidebars.choose{
|
471 |
-
margin-left: 0px;
|
472 |
-
}
|
473 |
-
|
474 |
-
|
475 |
-
#_active_page_options-container label, #_active_page_options-container p{
|
476 |
-
display: inline-block;
|
477 |
-
margin: 0px;
|
478 |
-
}
|
479 |
-
#_active_page_options-container label{
|
480 |
-
margin-right: 10px;
|
481 |
-
margin-top: 3px;
|
482 |
-
}
|
483 |
-
#_active_page_options-container {
|
484 |
-
float: right;
|
485 |
-
margin-right: 20px;
|
486 |
-
margin-top: 5px;
|
487 |
-
}
|
488 |
-
|
489 |
-
/* sortable table posts */
|
490 |
-
|
491 |
-
#the-list.ui-sortable tr:hover {
|
492 |
-
cursor: move;
|
493 |
-
}
|
494 |
-
|
495 |
-
|
496 |
-
/*datepicker*/
|
497 |
-
/*! jQuery UI - v1.11.2 - 2015-01-21
|
498 |
-
* http://jqueryui.com
|
499 |
-
* Includes: core.css, datepicker.css, theme.css
|
500 |
-
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=0px&bgColorHeader=%23dddddd&bgTextureHeader=flat&bgImgOpacityHeader=60&borderColorHeader=%23aaaaaa&fcHeader=%23222222&iconColorHeader=%23222222&bgColorContent=%23ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=%23aaaaaa&fcContent=%23222222&iconColorContent=%23222222&bgColorDefault=%23e9e9e9&bgTextureDefault=flat&bgImgOpacityDefault=75&borderColorDefault=%23d3d3d3&fcDefault=%23555555&iconColorDefault=%23888888&bgColorHover=%23dadada&bgTextureHover=flat&bgImgOpacityHover=75&borderColorHover=%23999999&fcHover=%23212121&iconColorHover=%23454545&bgColorActive=%23ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=%23aaaaaa&fcActive=%23212121&iconColorActive=%23454545&bgColorHighlight=%23fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=%2389b17e&fcHighlight=%23363636&iconColorHighlight=%232e83ff&bgColorError=%23fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=%23cd0a0a&fcError=%23cd0a0a&iconColorError=%23cd0a0a&bgColorOverlay=%23aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=%23aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
|
501 |
-
* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */
|
502 |
-
|
503 |
-
/* Layout helpers
|
504 |
-
----------------------------------*/
|
505 |
-
.ui-helper-hidden {
|
506 |
-
display: none;
|
507 |
-
}
|
508 |
-
.ui-helper-hidden-accessible {
|
509 |
-
border: 0;
|
510 |
-
clip: rect(0 0 0 0);
|
511 |
-
height: 1px;
|
512 |
-
margin: -1px;
|
513 |
-
overflow: hidden;
|
514 |
-
padding: 0;
|
515 |
-
position: absolute;
|
516 |
-
width: 1px;
|
517 |
-
}
|
518 |
-
.ui-helper-reset {
|
519 |
-
margin: 0;
|
520 |
-
padding: 0;
|
521 |
-
border: 0;
|
522 |
-
outline: 0;
|
523 |
-
line-height: 1.3;
|
524 |
-
text-decoration: none;
|
525 |
-
font-size: 100%;
|
526 |
-
list-style: none;
|
527 |
-
}
|
528 |
-
.ui-helper-clearfix:before,
|
529 |
-
.ui-helper-clearfix:after {
|
530 |
-
content: "";
|
531 |
-
display: table;
|
532 |
-
border-collapse: collapse;
|
533 |
-
}
|
534 |
-
.ui-helper-clearfix:after {
|
535 |
-
clear: both;
|
536 |
-
}
|
537 |
-
.ui-helper-clearfix {
|
538 |
-
min-height: 0; /* support: IE7 */
|
539 |
-
}
|
540 |
-
.ui-helper-zfix {
|
541 |
-
width: 100%;
|
542 |
-
height: 100%;
|
543 |
-
top: 0;
|
544 |
-
left: 0;
|
545 |
-
position: absolute;
|
546 |
-
opacity: 0;
|
547 |
-
filter:Alpha(Opacity=0); /* support: IE8 */
|
548 |
-
}
|
549 |
-
|
550 |
-
.ui-front {
|
551 |
-
z-index: 100;
|
552 |
-
}
|
553 |
-
|
554 |
-
|
555 |
-
/* Interaction Cues
|
556 |
-
----------------------------------*/
|
557 |
-
.ui-state-disabled {
|
558 |
-
cursor: default !important;
|
559 |
-
}
|
560 |
-
|
561 |
-
|
562 |
-
/* Icons
|
563 |
-
----------------------------------*/
|
564 |
-
|
565 |
-
/* states and images */
|
566 |
-
.ui-icon {
|
567 |
-
display: block;
|
568 |
-
text-indent: -99999px;
|
569 |
-
overflow: hidden;
|
570 |
-
background-repeat: no-repeat;
|
571 |
-
}
|
572 |
-
|
573 |
-
|
574 |
-
/* DATE PICKER
|
575 |
-
----------------------------------*/
|
576 |
-
|
577 |
-
.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}
|
578 |
-
.ui-datepicker{width:17em;padding:.2em .2em 0;display:none;z-index:100!important;}
|
579 |
-
.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}
|
580 |
-
.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}
|
581 |
-
.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}
|
582 |
-
.ui-datepicker .ui-datepicker-prev{left:2px}
|
583 |
-
.ui-datepicker .ui-datepicker-next{right:2px}
|
584 |
-
.ui-datepicker .ui-datepicker-prev-hover{left:1px}
|
585 |
-
.ui-datepicker .ui-datepicker-next-hover{right:1px}
|
586 |
-
.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}
|
587 |
-
.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}
|
588 |
-
.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}
|
589 |
-
.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}
|
590 |
-
.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}
|
591 |
-
.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:700;border:0}
|
592 |
-
.ui-datepicker td{border:0;padding:1px}
|
593 |
-
.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}
|
594 |
-
.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}
|
595 |
-
.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em;width:auto;overflow:visible}
|
596 |
-
.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}
|
597 |
-
.ui-datepicker.ui-datepicker-multi{width:auto}
|
598 |
-
.ui-datepicker-multi .ui-datepicker-group{float:left}
|
599 |
-
.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}
|
600 |
-
.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}
|
601 |
-
.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}
|
602 |
-
.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}
|
603 |
-
.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}
|
604 |
-
.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}
|
605 |
-
.ui-datepicker-row-break{clear:both;width:100%;font-size:0}
|
606 |
-
.ui-datepicker-rtl{direction:rtl}
|
607 |
-
.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}
|
608 |
-
.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}
|
609 |
-
.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}
|
610 |
-
.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}
|
611 |
-
.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}
|
612 |
-
.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}
|
613 |
-
.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}
|
614 |
-
.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}
|
615 |
-
.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}
|
616 |
-
.ui-widget .ui-widget{font-size:1em}
|
617 |
-
.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}
|
618 |
-
.ui-widget-content{border:1px solid #aaa;background:#fff 50% 50% repeat-x;color:#222}
|
619 |
-
.ui-widget-content a{color:#222}
|
620 |
-
.ui-widget-header{border:1px solid #aaa;background:#ddd 50% 50% repeat-x;color:#222;font-weight:700}
|
621 |
-
.ui-widget-header a{color:#222}
|
622 |
-
.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:0 solid #d3d3d3;background:#e9e9e9 50% 50% repeat-x;font-weight:400;color:#555}
|
623 |
-
.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#555;text-decoration:none}
|
624 |
-
.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:0 solid #999;background:#dadada 50% 50% repeat-x;font-weight:400;color:#212121}
|
625 |
-
.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#212121;text-decoration:none}
|
626 |
-
.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:0 solid #aaa;background:#fff 50% 50% repeat-x;font-weight:400;color:#212121}
|
627 |
-
.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}
|
628 |
-
.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:0 solid #89b17e;background:#fbf9ee 50% 50% repeat-x;color:#363636}
|
629 |
-
.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}
|
630 |
-
.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:0 solid #cd0a0a;background:#fef1ec 50% 50% repeat-x;color:#cd0a0a}
|
631 |
-
.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}
|
632 |
-
.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}
|
633 |
-
.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:700}
|
634 |
-
.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:400}
|
635 |
-
.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}
|
636 |
-
.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}
|
637 |
-
.ui-icon{width:16px;height:16px}
|
638 |
-
.ui-icon,.ui-widget-content .ui-icon{background-image:url(../images/ui-icons_222222_256x240.png)}
|
639 |
-
.ui-widget-header .ui-icon{background-image:url(../images/ui-icons_222222_256x240.png)}
|
640 |
-
.ui-state-default .ui-icon{background-image:url(../images/ui-icons_888888_256x240.png)}
|
641 |
-
.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(../images/ui-icons_454545_256x240.png)}
|
642 |
-
.ui-state-active .ui-icon{background-image:url(../images/ui-icons_454545_256x240.png)}
|
643 |
-
.ui-state-highlight .ui-icon{background-image:url(../images/ui-icons_2e83ff_256x240.png)}
|
644 |
-
.ui-icon-circle-triangle-e{background-position:-48px -192px}
|
645 |
-
.ui-icon-circle-triangle-s{background-position:-64px -192px}
|
646 |
-
.ui-icon-circle-triangle-w{background-position:-80px -192px}
|
647 |
-
.ui-icon-circle-triangle-n{background-position:-96px -192px}
|
648 |
-
.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:0}
|
649 |
-
.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:0}
|
650 |
-
.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:0}
|
651 |
-
.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:0}
|
652 |
-
.ui-widget-overlay{background:#aaa 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30)}
|
653 |
-
.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px}
|
654 |
-
|
655 |
-
|
656 |
-
.the-metabox.preview{
|
657 |
-
float: none;
|
658 |
-
}
|
659 |
-
.metaboxes-tab .the-metabox.no-label.preview{
|
660 |
-
margin-left: 184px;
|
661 |
-
}
|
662 |
-
.metaboxes-tab .the-metabox.no-label.preview img{
|
663 |
-
box-shadow: 0 1px 8px rgba(0,0,0,0.2);
|
664 |
}
|
1 |
+
/* self-clear floats */
|
2 |
+
.clearfix:after { content:"."; display:block; height:0; clear:both; visibility:hidden; overflow:hidden; }
|
3 |
+
/* ie.css */
|
4 |
+
* html .clearfix { /* IE6 */
|
5 |
+
height:1%;
|
6 |
+
}
|
7 |
+
*:first-child+html .clearfix { /* IE7 */
|
8 |
+
min-height:1%;
|
9 |
+
}
|
10 |
+
|
11 |
+
.clearboth { clear: both }
|
12 |
+
|
13 |
+
/* === TAB STYLE */
|
14 |
+
.metaboxes-tab { margin:-6px -12px -8px; }
|
15 |
+
.metaboxes-tab div.tabs-panel { height:auto; overflow:visible; margin-top:0px; padding:0 10px; background:none; border:0; border-top:1px solid #D4D4D4; }
|
16 |
+
.metaboxes-tab ul.metaboxes-tabs { background:#F5F5F5; margin:0; padding:10px 0 0 5px; }
|
17 |
+
.metaboxes-tab ul.metaboxes-tabs li { padding:8px 15px; border:1px solid #D4D4D4; float:left; background:#EDEDED; border-bottom-color:#EDEDED; margin:0 0 -1px 5px; box-shadow:1px 1px 1px 0 #FFFFFF inset; }
|
18 |
+
.metaboxes-tab ul.metaboxes-tabs li a { color:#555; text-decoration:none; }
|
19 |
+
.metaboxes-tab ul.metaboxes-tabs li.tabs { background:#F6F6F6; border-bottom:1px solid #F6F6F6; }
|
20 |
+
.metaboxes-tab p.field-row { margin:20px 0; }
|
21 |
+
.metaboxes-tab div.sep { height:1px; background:#DFDFDF; clear:both; margin-left:-10px; margin-right:-10px; }
|
22 |
+
.metaboxes-tab label { font-weight:bold; width:160px; float:left; line-height:23px; margin-left:-184px; }
|
23 |
+
.metaboxes-tab label small { font-weight:normal; line-height:15px; font-style:italic; color:#999; display:block; }
|
24 |
+
.metaboxes-tab input[type="text"], .metaboxes-tab select, .metaboxes-tab textarea { width:30%; }
|
25 |
+
.metaboxes-tab input[type="checkbox"] { vertical-align: middle }
|
26 |
+
.metaboxes-tab select {padding:0;}
|
27 |
+
.metaboxes-tab input.button-secondary, .metaboxes-tab input.checkbox { width:auto; }
|
28 |
+
.metaboxes-tab .description { color:#AFAFAF; font-size:90%; font-style:italic; line-height:23px; padding-left:5px; }
|
29 |
+
.metaboxes-tab p.field-row.textarea .description { vertical-align:top; }
|
30 |
+
.metaboxes-tab p.field-row.checkbox {background:none;}
|
31 |
+
|
32 |
+
.metaboxes-tab .the-metabox { margin:20px 0; margin-left:184px;}
|
33 |
+
.metaboxes-tab .the-metabox.no-label { margin:20px 0; margin-left:0;}
|
34 |
+
.metaboxes-tab hr { height: 0px; border-top: 1px solid #dadada; width: auto; margin-left: -10px; margin-right: -10px; }
|
35 |
+
.metaboxes-tab .the-metabox p { margin:0;}
|
36 |
+
.metaboxes-tab .the-metabox:last-child { border-bottom: 0px; }
|
37 |
+
.metaboxes-tab .the-metabox.checkbox { background:none; }
|
38 |
+
.metaboxes-tab .the-metabox.slider .ui-slider { margin-right:15px; }
|
39 |
+
|
40 |
+
.metaboxes-tab span.desc { font-size: 11px; color: #AFAFAF; }
|
41 |
+
.metaboxes-tab span.desc.inline { display: inline-block; vertical-align: top; line-height: 23px; }
|
42 |
+
.metaboxes-tab .onoff span.desc, .metaboxes-tab .onoff label { padding:6px 0; }
|
43 |
+
.metaboxes-tab .select span.desc, .metaboxes-tab .select label { padding:2px 0; }
|
44 |
+
.metaboxes-tab .slider span.desc, .metaboxes-tab .slider label { padding:15px 0; }
|
45 |
+
.metaboxes-tab .slider span.desc { display:block; padding:20px 0; }
|
46 |
+
|
47 |
+
.metaboxes-tab ul.metaboxes-tabs li {
|
48 |
+
-webkit-border-top-left-radius: 3px;
|
49 |
+
-webkit-border-top-right-radius: 3px;
|
50 |
+
-moz-border-radius-topleft: 3px;
|
51 |
+
-moz-border-radius-topright: 3px;
|
52 |
+
border-top-left-radius: 3px;
|
53 |
+
border-top-right-radius: 3px;
|
54 |
+
}
|
55 |
+
|
56 |
+
/* image gallery */
|
57 |
+
.metaboxes-tab .image-gallery ul li{
|
58 |
+
display: inline-block;
|
59 |
+
width: 80px;
|
60 |
+
margin-left: 10px;
|
61 |
+
position: relative;
|
62 |
+
}
|
63 |
+
.metaboxes-tab .image-gallery ul li img{
|
64 |
+
width: 80px;
|
65 |
+
border: 1px solid #ccc;
|
66 |
+
}
|
67 |
+
.metaboxes-tab .image-gallery ul li ul{
|
68 |
+
position: absolute;
|
69 |
+
top: -6px;
|
70 |
+
right: -1px;
|
71 |
+
width: 20px;
|
72 |
+
height: 20px;
|
73 |
+
}
|
74 |
+
.metaboxes-tab .image-gallery ul a.delete{
|
75 |
+
background: url(../images/x.png) no-repeat;
|
76 |
+
width: 20px;
|
77 |
+
height: 20px;
|
78 |
+
display: block;
|
79 |
+
text-indent: -99999px;
|
80 |
+
}
|
81 |
+
/* sidebar layout */
|
82 |
+
.yit-sidebar-layout input[type="radio"] {
|
83 |
+
display: none;
|
84 |
+
width: 0px;
|
85 |
+
}
|
86 |
+
.yit-sidebar-layout input[type="radio"]:first-child {
|
87 |
+
margin-right: -2px;
|
88 |
+
}
|
89 |
+
|
90 |
+
.yit-sidebar-layout input[type="radio"] + img {
|
91 |
+
border: 2px solid #fff;
|
92 |
+
padding: 1px;
|
93 |
+
}
|
94 |
+
|
95 |
+
.yit-sidebar-layout input[type="radio"] + img:hover {
|
96 |
+
cursor: pointer;
|
97 |
+
}
|
98 |
+
|
99 |
+
.yit-sidebar-layout input[checked] + img {
|
100 |
+
border: 2px solid #f2ad35;
|
101 |
+
padding: 1px;
|
102 |
+
}
|
103 |
+
|
104 |
+
.yit-sidebar-layout select {
|
105 |
+
vertical-align: 12px;
|
106 |
+
width: inherit !important;
|
107 |
+
}
|
108 |
+
|
109 |
+
/* wp editor */
|
110 |
+
.the-metabox.textarea-editor .mceIframeContainer {
|
111 |
+
background:#fff;
|
112 |
+
}
|
113 |
+
.the-metabox.textarea-editor label {
|
114 |
+
margin-top:24px;
|
115 |
+
}
|
116 |
+
|
117 |
+
/* categories */
|
118 |
+
.categories-panel { width:30%; float:left; margin-right:4px; }
|
119 |
+
.categories-panel .box { height:200px; border:1px solid #DFDFDF; background:#fff; padding:6px 10px; overflow: auto; }
|
120 |
+
.categories-panel ul { list-style:none; margin:0; }
|
121 |
+
.categories-panel ul li { line-height: 19px; margin: 0; padding: 0; word-wrap: break-word; }
|
122 |
+
.categories-panel ul li label { font-weight:normal !important; margin-left:0 !important; }
|
123 |
+
.categories-panel input.newcategory { width:100%; margin-bottom:3px; }
|
124 |
+
|
125 |
+
/* contact form */
|
126 |
+
.contactform_item {
|
127 |
+
border-style: solid;
|
128 |
+
border-width: 1px;
|
129 |
+
line-height: 1;
|
130 |
+
margin-bottom: 20px;
|
131 |
+
padding: 0;
|
132 |
+
background-color: #F5F5F5;
|
133 |
+
background-image: -moz-linear-gradient(center top , #F9F9F9, #F5F5F5);
|
134 |
+
border-color: #DFDFDF;
|
135 |
+
border-radius: 3px 3px 3px 3px;
|
136 |
+
box-shadow: 0 1px 0 #FFFFFF inset;
|
137 |
+
min-width: 255px;
|
138 |
+
position: relative;
|
139 |
+
}
|
140 |
+
.contactform_item .handlediv { position:relative; top: -4px; }
|
141 |
+
.contactform_item h3 { min-height: 21px }
|
142 |
+
.contactform_item .inside { padding: 10px !important; }
|
143 |
+
.contactform_item .deps { display: none; }
|
144 |
+
.contactform_item .addoptions p.option { margin: 5px 0 5px 200px }
|
145 |
+
.contactform_item .addoptions p label { width: 80px !important; }
|
146 |
+
.contactform_item .add-field-option { margin-bottom: 10px !important; }
|
147 |
+
.remove_item { float: right; }
|
148 |
+
.metabox-sortable-placeholder { border: 1px dotted #dedede; margin: 10px 0 }
|
149 |
+
|
150 |
+
/* features tab */
|
151 |
+
.featurestab_item{
|
152 |
+
border-style: solid;
|
153 |
+
border-width: 1px;
|
154 |
+
line-height: 1;
|
155 |
+
margin-bottom: 20px;
|
156 |
+
padding: 0;
|
157 |
+
background-color: #F5F5F5;
|
158 |
+
background-image: -moz-linear-gradient(center top , #F9F9F9, #F5F5F5);
|
159 |
+
border-color: #DFDFDF;
|
160 |
+
border-radius: 3px 3px 3px 3px;
|
161 |
+
box-shadow: 0 1px 0 #FFFFFF inset;
|
162 |
+
min-width: 255px;
|
163 |
+
position: relative;
|
164 |
+
}
|
165 |
+
.featurestab_item .handlediv { position:relative; top: -4px; }
|
166 |
+
.featurestab_item h3 { min-height: 21px }
|
167 |
+
.featurestab_item .inside { padding: 10px !important; }
|
168 |
+
.featurestab_item .deps { display: none; }
|
169 |
+
.featurestab_item .addoptions p.option { margin: 5px 0 5px 200px }
|
170 |
+
.featurestab_item .addoptions p label { width: 80px !important; }
|
171 |
+
.featurestab_item .add-field-option { margin-bottom: 10px !important; }
|
172 |
+
|
173 |
+
/* slider */
|
174 |
+
.the-metabox.slider { padding-top:20px; }
|
175 |
+
|
176 |
+
/* on off */
|
177 |
+
.the-metabox .rm_onoff span.onoff { float:left; margin-right:5px; margin-left:-4px; /* image fix */ }
|
178 |
+
|
179 |
+
/* onoff */
|
180 |
+
.rm_onoff input {
|
181 |
+
display: none;
|
182 |
+
}
|
183 |
+
|
184 |
+
.rm_onoff input + span {
|
185 |
+
cursor: pointer;
|
186 |
+
text-indent: -9999px;
|
187 |
+
display: block;
|
188 |
+
width: 85px;
|
189 |
+
height: 37px;
|
190 |
+
background: transparent url(../images/off.png);
|
191 |
+
}
|
192 |
+
|
193 |
+
.rm_onoff input:checked + span {
|
194 |
+
background: transparent url(../images/on.png);
|
195 |
+
}
|
196 |
+
|
197 |
+
.rm_onoff input.onoffchecked + span {
|
198 |
+
background: transparent url(../images/on.png);
|
199 |
+
}
|
200 |
+
|
201 |
+
.messages-panel.updated {
|
202 |
+
margin: 10px 0px 10px !important;
|
203 |
+
max-width: 1200px;
|
204 |
+
border-radius: 5px;
|
205 |
+
-webkit-box-sizing: border-box;
|
206 |
+
box-sizing: border-box;
|
207 |
+
}
|
208 |
+
|
209 |
+
.ui-widget-overlay { background-image: none !important; }
|
210 |
+
|
211 |
+
|
212 |
+
|
213 |
+
/* select */
|
214 |
+
.the-metabox .select_wrapper { width:341px; background-color:#fff; }
|
215 |
+
.the-metabox .select_wrapper select { width:100%; }
|
216 |
+
.the-metabox .icon_type{ width:30%; float: left; margin-right: 40px }
|
217 |
+
.the-metabox .icon_type select, .the-metabox div.option .select_wrapper select{ width: 100% }
|
218 |
+
|
219 |
+
#post-type-settings .category-list label { width: 187px; }
|
220 |
+
.remove_cat { float: right; text-align:center; display: block; width: 20px; height: 20px; border-radius: 20px; font-weight: bold; font-size: 10px; background: #efefef; text-decoration: none; }
|
221 |
+
|
222 |
+
.the-metabox .select_wrapper {
|
223 |
+
background: url("../images/select.png") no-repeat scroll right center #FAFAFA;
|
224 |
+
border-color: #CCCCCC #EEEEEE #EEEEEE #CCCCCC;
|
225 |
+
border-radius: 4px 4px 4px 4px;
|
226 |
+
border-style: solid;
|
227 |
+
border-width: 1px;
|
228 |
+
color: #555555;
|
229 |
+
display: block;
|
230 |
+
float: left;
|
231 |
+
font-family: sans-serif;
|
232 |
+
font-size: 12px;
|
233 |
+
min-height: 26px;
|
234 |
+
margin-bottom: 9px !important;
|
235 |
+
margin-left: 0;
|
236 |
+
margin-right: 5px;
|
237 |
+
margin-top: 0;
|
238 |
+
width: 400px;
|
239 |
+
position: relative;
|
240 |
+
}
|
241 |
+
|
242 |
+
/*chosen*/
|
243 |
+
|
244 |
+
.chosen .select_wrapper {
|
245 |
+
background: none;
|
246 |
+
border: none;
|
247 |
+
}
|
248 |
+
.chosen .select_wrapper .chosen-container{
|
249 |
+
width: 338px!important;
|
250 |
+
}
|
251 |
+
.chosen .select_wrapper .chosen-container .search-field input{
|
252 |
+
height: 27px!important;
|
253 |
+
color: #333;
|
254 |
+
}
|
255 |
+
.chosen .select_wrapper .chosen-container .chosen-choices{
|
256 |
+
border: 1px solid #ddd;
|
257 |
+
box-shadow: none;
|
258 |
+
}
|
259 |
+
.chosen .select_wrapper .chosen-container .chosen-choices li.search-choice{
|
260 |
+
height: 15px!important;
|
261 |
+
min-width: 105px;
|
262 |
+
}
|
263 |
+
.chosen .select_wrapper .chosen-container .chosen-choices li.search-choice span{
|
264 |
+
line-height: 15px;
|
265 |
+
height: 15px;
|
266 |
+
padding-top: 2px;
|
267 |
+
}
|
268 |
+
.chosen .select_wrapper .chosen-container .chosen-choices li.search-choice a.search-choice-close{
|
269 |
+
top: 5px;
|
270 |
+
}
|
271 |
+
.chosen .select_wrapper .chosen-container .chosen-drop .chosen-search input{
|
272 |
+
width: 100%!important;
|
273 |
+
}
|
274 |
+
.select_wrapper span {
|
275 |
+
height: 26px;
|
276 |
+
line-height: 26px;
|
277 |
+
padding-left: 6px;
|
278 |
+
position: absolute;
|
279 |
+
z-index: 2;
|
280 |
+
overflow: hidden;
|
281 |
+
}
|
282 |
+
|
283 |
+
.the-metabox .select_wrapper select {
|
284 |
+
cursor: pointer;
|
285 |
+
height: 28px;
|
286 |
+
margin: 0;
|
287 |
+
opacity: 0;
|
288 |
+
padding: 0;
|
289 |
+
position: relative;
|
290 |
+
width: inherit;
|
291 |
+
z-index: 4;
|
292 |
+
background-color: #FAFAFA;
|
293 |
+
}
|
294 |
+
|
295 |
+
|
296 |
+
/* typography */
|
297 |
+
.the-metabox.typography .select_wrapper.font-family { width:200px; }
|
298 |
+
.the-metabox.typography .spinner_container { float:left; margin-right:10px; }
|
299 |
+
.the-metabox.typography .spinner_container input.number {
|
300 |
+
width:50px !important;
|
301 |
+
-webkit-border-top-right-radius: 0px;
|
302 |
+
-webkit-border-bottom-right-radius: 0px;
|
303 |
+
-moz-border-radius-topright: 0px;
|
304 |
+
-moz-border-radius-bottomright: 0px;
|
305 |
+
border-top-right-radius: 0px;
|
306 |
+
border-bottom-right-radius: 0px;
|
307 |
+
}
|
308 |
+
|
309 |
+
/* number */
|
310 |
+
.the-metabox.number input.number { width:50px !important; }
|
311 |
+
/* number */
|
312 |
+
.rm_number .number {
|
313 |
+
width: 70px;
|
314 |
+
text-align: right;
|
315 |
+
-webkit-border-top-right-radius: 0px;
|
316 |
+
-webkit-border-bottom-right-radius: 0px;
|
317 |
+
-moz-border-radius-topright: 0px;
|
318 |
+
-moz-border-radius-bottomright: 0px;
|
319 |
+
border-top-right-radius: 0px;
|
320 |
+
border-bottom-right-radius: 0px;
|
321 |
+
}
|
322 |
+
|
323 |
+
.spinner-wrapper { position: relative; height: 23px; overflow: hidden; }
|
324 |
+
.spinner-wrapper input.number { float: left; }
|
325 |
+
.spinner-wrapper .spinner-button { cursor:pointer; float: left; position: absolute; left: 69px; width: 15px; height: 12px; border: 1px solid #DFDFDF; background: #fff; margin: 0; padding: 0; line-height: 9999px; overflow: hidden; background: url('../images/spinner.png') no-repeat center -11px }
|
326 |
+
.spinner-wrapper .spinner-button.button-plus { top: 0; -webkit-border-top-right-radius: 3px !important; -moz-border-radius-topright: 3px !important; border-top-right-radius: 3px !important; }
|
327 |
+
.spinner-wrapper .spinner-button.button-minus { bottom: 0; background-position: center -30px; -webkit-border-bottom-right-radius: 3px !important; -moz-border-radius-bottomright: 3px !important; border-bottom-right-radius: 3px !important; }
|
328 |
+
|
329 |
+
|
330 |
+
.spinner-wrapper .spinner-button.button-plus:active { background-position: center 0px; }
|
331 |
+
.spinner-wrapper .spinner-button.button-minus:active { background-position: center -20px; }
|
332 |
+
|
333 |
+
|
334 |
+
.rm_typography .spinner_container { float: left; margin-right: 10px; }
|
335 |
+
.rm_typography .spinner-wrapper { height: 28px; }
|
336 |
+
.rm_typography .spinner-wrapper input.number { height: 28px; }
|
337 |
+
.rm_typography .spinner-wrapper .spinner-button.button-plus { height: 15px; background-position: center -10px; }
|
338 |
+
.rm_typography .spinner-wrapper .spinner-button.button-minus { height: 14px; }
|
339 |
+
|
340 |
+
.the-metabox .spinner-wrapper .spinner-button { left: 49px; }
|
341 |
+
.the-metabox.typography .spinner-wrapper .spinner-button { left: 35px; }
|
342 |
+
|
343 |
+
/* colorpicker */
|
344 |
+
.the-metabox.colorpicker { display:block; width: auto; height: auto; overflow: visible; background-image: none; position: static; font-family: inherit;}
|
345 |
+
.the-metabox.colorpicker input { background-color: transparent; border: 1px solid #DFDFDF; position: static; font-size: inherit; font-family: inherit; color: inherit; text-align: center; margin: 0 5px 0px; padding: 0; outline: none; width: auto; }
|
346 |
+
|
347 |
+
/* images */
|
348 |
+
.the-metabox.images, .the-metabox.images label { margin-left:0; display:block; }
|
349 |
+
.the-metabox.images .slides-wrapper { clear:both; }
|
350 |
+
.the-metabox.images .slides-wrapper li { position:relative; }
|
351 |
+
.the-metabox.images a.delete { display:block; margin-left:4px; text-decoration:none; font-weight:bold; color:red; position:absolute; top:0; right:0; width:10px; height:18px; z-index:10; cursor:pointer !important; }
|
352 |
+
|
353 |
+
/* wp editor */
|
354 |
+
.wp_themeSkin iframe { background: #fff !important; }
|
355 |
+
|
356 |
+
/* custom tabs */
|
357 |
+
.customtab_item {
|
358 |
+
border-style: solid;
|
359 |
+
border-width: 1px;
|
360 |
+
line-height: 1;
|
361 |
+
margin-bottom: 20px;
|
362 |
+
padding: 0;
|
363 |
+
background-color: #F5F5F5;
|
364 |
+
background-image: -moz-linear-gradient(center top , #F9F9F9, #F5F5F5);
|
365 |
+
border-color: #DFDFDF;
|
366 |
+
border-radius: 3px 3px 3px 3px;
|
367 |
+
box-shadow: 0 1px 0 #FFFFFF inset;
|
368 |
+
min-width: 255px;
|
369 |
+
position: relative;
|
370 |
+
}
|
371 |
+
.customtab_item .handlediv { position:relative; top: -4px; }
|
372 |
+
.customtab_item h3 { min-height: 21px }
|
373 |
+
.customtab_item .inside { padding: 10px !important; }
|
374 |
+
.customtab_item .deps { display: none; }
|
375 |
+
.customtab_item .addoptions p.option { margin: 5px 0 5px 200px }
|
376 |
+
.customtab_item .addoptions p label { width: 80px !important; }
|
377 |
+
.customtab_item .add-field-option { margin-bottom: 10px !important; }
|
378 |
+
.customtab_item .remove_item { float: right; }
|
379 |
+
.metabox-sortable-placeholder { border: 1px dotted #dedede; margin: 10px 0 }
|
380 |
+
|
381 |
+
.the-metabox.customtabs {
|
382 |
+
margin-left: 0;
|
383 |
+
}
|
384 |
+
|
385 |
+
#customtab_item_sample {
|
386 |
+
display: none;
|
387 |
+
}
|
388 |
+
|
389 |
+
.the-metabox.customtabs .field-row {
|
390 |
+
margin-bottom: 10px;
|
391 |
+
}
|
392 |
+
|
393 |
+
#yit_custom_tabs label {
|
394 |
+
font-weight: normal;
|
395 |
+
width: auto;
|
396 |
+
float: none;
|
397 |
+
line-height: auto;
|
398 |
+
margin-left: 0;
|
399 |
+
}
|
400 |
+
|
401 |
+
|
402 |
+
.wp-admin p label input[type=radio]{
|
403 |
+
width: 16px;
|
404 |
+
margin-right: 10px;
|
405 |
+
margin-top: 3px;
|
406 |
+
}
|
407 |
+
.wp-admin .form-field._preset_onsale_icon_field label input[type=radio]{
|
408 |
+
margin-top: 0;
|
409 |
+
}
|
410 |
+
|
411 |
+
.the-metabox .spinner {
|
412 |
+
margin-top: 5px;
|
413 |
+
float: none;
|
414 |
+
}
|
415 |
+
|
416 |
+
/* slider */
|
417 |
+
/*numbers*/
|
418 |
+
.ui-slider .maxCaption, .ui-slider .minCaption {
|
419 |
+
margin-bottom: 5px;
|
420 |
+
}
|
421 |
+
.ui-slider .feedback {
|
422 |
+
background: url(../images/slider/tooltip.png) no-repeat center top;
|
423 |
+
position: absolute;
|
424 |
+
top: -25px;
|
425 |
+
width: 35px;
|
426 |
+
height: 43px;
|
427 |
+
text-align: center;
|
428 |
+
width: 100%;
|
429 |
+
display: block;
|
430 |
+
}
|
431 |
+
.ui-slider .feedback strong {
|
432 |
+
display: inline-block;
|
433 |
+
padding-top: 4px;
|
434 |
+
top: -30px;
|
435 |
+
}
|
436 |
+
/*handle*/
|
437 |
+
.ui-slider-horizontal .ui-slider-handle{
|
438 |
+
background: transparent url(../images/slider/handle.png) no-repeat left top !important;
|
439 |
+
border: 0px !important;
|
440 |
+
top: -.35em !important;
|
441 |
+
width: 18px !important;
|
442 |
+
height: 19px !important;
|
443 |
+
}
|
444 |
+
|
445 |
+
/*bg on the left:grey*/
|
446 |
+
.ui-slider.ui-widget-content {
|
447 |
+
background: url(../images/slider/grey.gif) repeat-x left center !important;
|
448 |
+
border-color: #c1c1c0 !important;
|
449 |
+
height: 10px !important;
|
450 |
+
}
|
451 |
+
|
452 |
+
.iris-slider-offset.ui-slider.ui-widget-content {
|
453 |
+
background: transparent!important;
|
454 |
+
height: auto!important;
|
455 |
+
}
|
456 |
+
|
457 |
+
/*bg on the right:orange*/
|
458 |
+
.ui-slider.ui-widget-content .ui-widget-header {
|
459 |
+
background: url(../images/slider/orange.gif) repeat-x left center !important;
|
460 |
+
left: 2px !important;
|
461 |
+
-webkit-border-radius: 15px;
|
462 |
+
-moz-border-radius: 15px;
|
463 |
+
-khtml-border-radius: 15px;
|
464 |
+
border-radius: 15px;
|
465 |
+
}
|
466 |
+
|
467 |
+
|
468 |
+
/*sidebars*/
|
469 |
+
|
470 |
+
#choose-sidebars.choose{
|
471 |
+
margin-left: 0px;
|
472 |
+
}
|
473 |
+
|
474 |
+
|
475 |
+
#_active_page_options-container label, #_active_page_options-container p{
|
476 |
+
display: inline-block;
|
477 |
+
margin: 0px;
|
478 |
+
}
|
479 |
+
#_active_page_options-container label{
|
480 |
+
margin-right: 10px;
|
481 |
+
margin-top: 3px;
|
482 |
+
}
|
483 |
+
#_active_page_options-container {
|
484 |
+
float: right;
|
485 |
+
margin-right: 20px;
|
486 |
+
margin-top: 5px;
|
487 |
+
}
|
488 |
+
|
489 |
+
/* sortable table posts */
|
490 |
+
|
491 |
+
#the-list.ui-sortable tr:hover {
|
492 |
+
cursor: move;
|
493 |
+
}
|
494 |
+
|
495 |
+
|
496 |
+
/*datepicker*/
|
497 |
+
/*! jQuery UI - v1.11.2 - 2015-01-21
|
498 |
+
* http://jqueryui.com
|
499 |
+
* Includes: core.css, datepicker.css, theme.css
|
500 |
+
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=0px&bgColorHeader=%23dddddd&bgTextureHeader=flat&bgImgOpacityHeader=60&borderColorHeader=%23aaaaaa&fcHeader=%23222222&iconColorHeader=%23222222&bgColorContent=%23ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=%23aaaaaa&fcContent=%23222222&iconColorContent=%23222222&bgColorDefault=%23e9e9e9&bgTextureDefault=flat&bgImgOpacityDefault=75&borderColorDefault=%23d3d3d3&fcDefault=%23555555&iconColorDefault=%23888888&bgColorHover=%23dadada&bgTextureHover=flat&bgImgOpacityHover=75&borderColorHover=%23999999&fcHover=%23212121&iconColorHover=%23454545&bgColorActive=%23ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=%23aaaaaa&fcActive=%23212121&iconColorActive=%23454545&bgColorHighlight=%23fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=%2389b17e&fcHighlight=%23363636&iconColorHighlight=%232e83ff&bgColorError=%23fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=%23cd0a0a&fcError=%23cd0a0a&iconColorError=%23cd0a0a&bgColorOverlay=%23aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=%23aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
|
501 |
+
* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */
|
502 |
+
|
503 |
+
/* Layout helpers
|
504 |
+
----------------------------------*/
|
505 |
+
.ui-helper-hidden {
|
506 |
+
display: none;
|
507 |
+
}
|
508 |
+
.ui-helper-hidden-accessible {
|
509 |
+
border: 0;
|
510 |
+
clip: rect(0 0 0 0);
|
511 |
+
height: 1px;
|
512 |
+
margin: -1px;
|
513 |
+
overflow: hidden;
|
514 |
+
padding: 0;
|
515 |
+
position: absolute;
|
516 |
+
width: 1px;
|
517 |
+
}
|
518 |
+
.ui-helper-reset {
|
519 |
+
margin: 0;
|
520 |
+
padding: 0;
|
521 |
+
border: 0;
|
522 |
+
outline: 0;
|
523 |
+
line-height: 1.3;
|
524 |
+
text-decoration: none;
|
525 |
+
font-size: 100%;
|
526 |
+
list-style: none;
|
527 |
+
}
|
528 |
+
.ui-helper-clearfix:before,
|
529 |
+
.ui-helper-clearfix:after {
|
530 |
+
content: "";
|
531 |
+
display: table;
|
532 |
+
border-collapse: collapse;
|
533 |
+
}
|
534 |
+
.ui-helper-clearfix:after {
|
535 |
+
clear: both;
|
536 |
+
}
|
537 |
+
.ui-helper-clearfix {
|
538 |
+
min-height: 0; /* support: IE7 */
|
539 |
+
}
|
540 |
+
.ui-helper-zfix {
|
541 |
+
width: 100%;
|
542 |
+
height: 100%;
|
543 |
+
top: 0;
|
544 |
+
left: 0;
|
545 |
+
position: absolute;
|
546 |
+
opacity: 0;
|
547 |
+
filter:Alpha(Opacity=0); /* support: IE8 */
|
548 |
+
}
|
549 |
+
|
550 |
+
.ui-front {
|
551 |
+
z-index: 100;
|
552 |
+
}
|
553 |
+
|
554 |
+
|
555 |
+
/* Interaction Cues
|
556 |
+
----------------------------------*/
|
557 |
+
.ui-state-disabled {
|
558 |
+
cursor: default !important;
|
559 |
+
}
|
560 |
+
|
561 |
+
|
562 |
+
/* Icons
|
563 |
+
----------------------------------*/
|
564 |
+
|
565 |
+
/* states and images */
|
566 |
+
.ui-icon {
|
567 |
+
display: block;
|
568 |
+
text-indent: -99999px;
|
569 |
+
overflow: hidden;
|
570 |
+
background-repeat: no-repeat;
|
571 |
+
}
|
572 |
+
|
573 |
+
|
574 |
+
/* DATE PICKER
|
575 |
+
----------------------------------*/
|
576 |
+
|
577 |
+
.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}
|
578 |
+
.ui-datepicker{width:17em;padding:.2em .2em 0;display:none;z-index:100!important;}
|
579 |
+
.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}
|
580 |
+
.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}
|
581 |
+
.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}
|
582 |
+
.ui-datepicker .ui-datepicker-prev{left:2px}
|
583 |
+
.ui-datepicker .ui-datepicker-next{right:2px}
|
584 |
+
.ui-datepicker .ui-datepicker-prev-hover{left:1px}
|
585 |
+
.ui-datepicker .ui-datepicker-next-hover{right:1px}
|
586 |
+
.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}
|
587 |
+
.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}
|
588 |
+
.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}
|
589 |
+
.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}
|
590 |
+
.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}
|
591 |
+
.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:700;border:0}
|
592 |
+
.ui-datepicker td{border:0;padding:1px}
|
593 |
+
.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}
|
594 |
+
.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}
|
595 |
+
.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em;width:auto;overflow:visible}
|
596 |
+
.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}
|
597 |
+
.ui-datepicker.ui-datepicker-multi{width:auto}
|
598 |
+
.ui-datepicker-multi .ui-datepicker-group{float:left}
|
599 |
+
.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}
|
600 |
+
.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}
|
601 |
+
.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}
|
602 |
+
.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}
|
603 |
+
.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}
|
604 |
+
.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}
|
605 |
+
.ui-datepicker-row-break{clear:both;width:100%;font-size:0}
|
606 |
+
.ui-datepicker-rtl{direction:rtl}
|
607 |
+
.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}
|
608 |
+
.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}
|
609 |
+
.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}
|
610 |
+
.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}
|
611 |
+
.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}
|
612 |
+
.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}
|
613 |
+
.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}
|
614 |
+
.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}
|
615 |
+
.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}
|
616 |
+
.ui-widget .ui-widget{font-size:1em}
|
617 |
+
.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}
|
618 |
+
.ui-widget-content{border:1px solid #aaa;background:#fff 50% 50% repeat-x;color:#222}
|
619 |
+
.ui-widget-content a{color:#222}
|
620 |
+
.ui-widget-header{border:1px solid #aaa;background:#ddd 50% 50% repeat-x;color:#222;font-weight:700}
|
621 |
+
.ui-widget-header a{color:#222}
|
622 |
+
.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:0 solid #d3d3d3;background:#e9e9e9 50% 50% repeat-x;font-weight:400;color:#555}
|
623 |
+
.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#555;text-decoration:none}
|
624 |
+
.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:0 solid #999;background:#dadada 50% 50% repeat-x;font-weight:400;color:#212121}
|
625 |
+
.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#212121;text-decoration:none}
|
626 |
+
.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:0 solid #aaa;background:#fff 50% 50% repeat-x;font-weight:400;color:#212121}
|
627 |
+
.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}
|
628 |
+
.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:0 solid #89b17e;background:#fbf9ee 50% 50% repeat-x;color:#363636}
|
629 |
+
.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}
|
630 |
+
.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:0 solid #cd0a0a;background:#fef1ec 50% 50% repeat-x;color:#cd0a0a}
|
631 |
+
.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}
|
632 |
+
.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}
|
633 |
+
.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:700}
|
634 |
+
.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:400}
|
635 |
+
.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}
|
636 |
+
.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}
|
637 |
+
.ui-icon{width:16px;height:16px}
|
638 |
+
.ui-icon,.ui-widget-content .ui-icon{background-image:url(../images/ui-icons_222222_256x240.png)}
|
639 |
+
.ui-widget-header .ui-icon{background-image:url(../images/ui-icons_222222_256x240.png)}
|
640 |
+
.ui-state-default .ui-icon{background-image:url(../images/ui-icons_888888_256x240.png)}
|
641 |
+
.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(../images/ui-icons_454545_256x240.png)}
|
642 |
+
.ui-state-active .ui-icon{background-image:url(../images/ui-icons_454545_256x240.png)}
|
643 |
+
.ui-state-highlight .ui-icon{background-image:url(../images/ui-icons_2e83ff_256x240.png)}
|
644 |
+
.ui-icon-circle-triangle-e{background-position:-48px -192px}
|
645 |
+
.ui-icon-circle-triangle-s{background-position:-64px -192px}
|
646 |
+
.ui-icon-circle-triangle-w{background-position:-80px -192px}
|
647 |
+
.ui-icon-circle-triangle-n{background-position:-96px -192px}
|
648 |
+
.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:0}
|
649 |
+
.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:0}
|
650 |
+
.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:0}
|
651 |
+
.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:0}
|
652 |
+
.ui-widget-overlay{background:#aaa 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30)}
|
653 |
+
.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px}
|
654 |
+
|
655 |
+
|
656 |
+
.the-metabox.preview{
|
657 |
+
float: none;
|
658 |
+
}
|
659 |
+
.metaboxes-tab .the-metabox.no-label.preview{
|
660 |
+
margin-left: 184px;
|
661 |
+
}
|
662 |
+
.metaboxes-tab .the-metabox.no-label.preview img{
|
663 |
+
box-shadow: 0 1px 8px rgba(0,0,0,0.2);
|
664 |
}
|
plugin-fw/assets/css/overcast/jquery-ui-custom/jquery-ui-1.8.9.custom.css
CHANGED
@@ -1,578 +1,578 @@
|
|
1 |
-
/*
|
2 |
-
* jQuery UI CSS Framework 1.8.13
|
3 |
-
*
|
4 |
-
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
5 |
-
* Dual licensed under the MIT or GPL Version 2 licenses.
|
6 |
-
* http://jquery.org/license
|
7 |
-
*
|
8 |
-
* http://docs.jquery.com/UI/Theming/API
|
9 |
-
*/
|
10 |
-
|
11 |
-
/* Layout helpers
|
12 |
-
----------------------------------*/
|
13 |
-
.ui-helper-hidden { display: none; }
|
14 |
-
.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
|
15 |
-
.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
|
16 |
-
.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
|
17 |
-
.ui-helper-clearfix { display: inline-block; }
|
18 |
-
/* required comment for clearfix to work in Opera \*/
|
19 |
-
* html .ui-helper-clearfix { height:1%; }
|
20 |
-
.ui-helper-clearfix { display:block; }
|
21 |
-
/* end clearfix */
|
22 |
-
.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
|
23 |
-
|
24 |
-
|
25 |
-
/* Interaction Cues
|
26 |
-
----------------------------------*/
|
27 |
-
.ui-state-disabled { cursor: default !important; }
|
28 |
-
|
29 |
-
|
30 |
-
/* Icons
|
31 |
-
----------------------------------*/
|
32 |
-
|
33 |
-
/* states and images */
|
34 |
-
.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
|
35 |
-
|
36 |
-
|
37 |
-
/* Misc visuals
|
38 |
-
----------------------------------*/
|
39 |
-
|
40 |
-
/* Overlays */
|
41 |
-
.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
|
42 |
-
|
43 |
-
|
44 |
-
/*
|
45 |
-
* jQuery UI CSS Framework 1.8.13
|
46 |
-
*
|
47 |
-
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
48 |
-
* Dual licensed under the MIT or GPL Version 2 licenses.
|
49 |
-
* http://jquery.org/license
|
50 |
-
*
|
51 |
-
* http://docs.jquery.com/UI/Theming/API
|
52 |
-
*
|
53 |
-
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
|
54 |
-
*/
|
55 |
-
|
56 |
-
|
57 |
-
/* Component containers
|
58 |
-
----------------------------------*/
|
59 |
-
.ui-widget { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1.1em; }
|
60 |
-
.ui-widget .ui-widget { font-size: 1em; }
|
61 |
-
.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1em; }
|
62 |
-
.ui-widget-content { border: 1px solid #dddddd; background: #eeeeee url(../images/jquery_ui/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x; color: #333333; }
|
63 |
-
.ui-widget-content a { color: #333333; }
|
64 |
-
.ui-widget-header { border: 1px solid #e78f08; background: #f6a828 url(../images/jquery_ui/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; }
|
65 |
-
.ui-widget-header a { color: #ffffff; }
|
66 |
-
|
67 |
-
/* Interaction states
|
68 |
-
----------------------------------*/
|
69 |
-
.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #cccccc; background: #f6f6f6 url(../images/jquery_ui/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1c94c4; }
|
70 |
-
.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #1c94c4; text-decoration: none; }
|
71 |
-
.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #fbcb09; background: #fdf5ce url(../images/jquery_ui/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #c77405; }
|
72 |
-
.ui-state-hover a, .ui-state-hover a:hover { color: #c77405; text-decoration: none; }
|
73 |
-
.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #fbd850; background: #ffffff url(../images/jquery_ui/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #eb8f00; }
|
74 |
-
.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #eb8f00; text-decoration: none; }
|
75 |
-
.ui-widget :active { outline: none; }
|
76 |
-
|
77 |
-
/* Interaction Cues
|
78 |
-
----------------------------------*/
|
79 |
-
.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fed22f; background: #ffe45c url(../images/jquery_ui/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x; color: #363636; }
|
80 |
-
.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
|
81 |
-
.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #b81900 url(../images/jquery_ui/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat; color: #ffffff; }
|
82 |
-
.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; }
|
83 |
-
.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; }
|
84 |
-
.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
|
85 |
-
.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
|
86 |
-
.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
|
87 |
-
|
88 |
-
/* Icons
|
89 |
-
----------------------------------*/
|
90 |
-
|
91 |
-
/* states and images */
|
92 |
-
.ui-icon { width: 16px; height: 16px; background-image: url(../images/jquery_ui/ui-icons_222222_256x240.png); }
|
93 |
-
.ui-widget-content .ui-icon {background-image: url(../images/jquery_ui/ui-icons_222222_256x240.png); }
|
94 |
-
.ui-widget-header .ui-icon {background-image: url(../images/jquery_ui/ui-icons_ffffff_256x240.png); }
|
95 |
-
.ui-state-default .ui-icon { background-image: url(../images/jquery_ui/ui-icons_ef8c08_256x240.png); }
|
96 |
-
.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(../images/jquery_ui/ui-icons_ef8c08_256x240.png); }
|
97 |
-
.ui-state-active .ui-icon {background-image: url(../images/jquery_ui/ui-icons_ef8c08_256x240.png); }
|
98 |
-
.ui-state-highlight .ui-icon {background-image: url(../images/jquery_ui/ui-icons_228ef1_256x240.png); }
|
99 |
-
.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(../images/jquery_ui/ui-icons_ffd27a_256x240.png); }
|
100 |
-
|
101 |
-
/* positioning */
|
102 |
-
.ui-icon-carat-1-n { background-position: 0 0; }
|
103 |
-
.ui-icon-carat-1-ne { background-position: -16px 0; }
|
104 |
-
.ui-icon-carat-1-e { background-position: -32px 0; }
|
105 |
-
.ui-icon-carat-1-se { background-position: -48px 0; }
|
106 |
-
.ui-icon-carat-1-s { background-position: -64px 0; }
|
107 |
-
.ui-icon-carat-1-sw { background-position: -80px 0; }
|
108 |
-
.ui-icon-carat-1-w { background-position: -96px 0; }
|
109 |
-
.ui-icon-carat-1-nw { background-position: -112px 0; }
|
110 |
-
.ui-icon-carat-2-n-s { background-position: -128px 0; }
|
111 |
-
.ui-icon-carat-2-e-w { background-position: -144px 0; }
|
112 |
-
.ui-icon-triangle-1-n { background-position: 0 -16px; }
|
113 |
-
.ui-icon-triangle-1-ne { background-position: -16px -16px; }
|
114 |
-
.ui-icon-triangle-1-e { background-position: -32px -16px; }
|
115 |
-
.ui-icon-triangle-1-se { background-position: -48px -16px; }
|
116 |
-
.ui-icon-triangle-1-s { background-position: -64px -16px; }
|
117 |
-
.ui-icon-triangle-1-sw { background-position: -80px -16px; }
|
118 |
-
.ui-icon-triangle-1-w { background-position: -96px -16px; }
|
119 |
-
.ui-icon-triangle-1-nw { background-position: -112px -16px; }
|
120 |
-
.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
|
121 |
-
.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
|
122 |
-
.ui-icon-arrow-1-n { background-position: 0 -32px; }
|
123 |
-
.ui-icon-arrow-1-ne { background-position: -16px -32px; }
|
124 |
-
.ui-icon-arrow-1-e { background-position: -32px -32px; }
|
125 |
-
.ui-icon-arrow-1-se { background-position: -48px -32px; }
|
126 |
-
.ui-icon-arrow-1-s { background-position: -64px -32px; }
|
127 |
-
.ui-icon-arrow-1-sw { background-position: -80px -32px; }
|
128 |
-
.ui-icon-arrow-1-w { background-position: -96px -32px; }
|
129 |
-
.ui-icon-arrow-1-nw { background-position: -112px -32px; }
|
130 |
-
.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
|
131 |
-
.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
|
132 |
-
.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
|
133 |
-
.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
|
134 |
-
.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
|
135 |
-
.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
|
136 |
-
.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
|
137 |
-
.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
|
138 |
-
.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
|
139 |
-
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
|
140 |
-
.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
|
141 |
-
.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
|
142 |
-
.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
|
143 |
-
.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
|
144 |
-
.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
|
145 |
-
.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
|
146 |
-
.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
|
147 |
-
.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
|
148 |
-
.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
|
149 |
-
.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
|
150 |
-
.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
|
151 |
-
.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
|
152 |
-
.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
|
153 |
-
.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
|
154 |
-
.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
|
155 |
-
.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
|
156 |
-
.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
|
157 |
-
.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
|
158 |
-
.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
|
159 |
-
.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
|
160 |
-
.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
|
161 |
-
.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
|
162 |
-
.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
|
163 |
-
.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
|
164 |
-
.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
|
165 |
-
.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
|
166 |
-
.ui-icon-arrow-4 { background-position: 0 -80px; }
|
167 |
-
.ui-icon-arrow-4-diag { background-position: -16px -80px; }
|
168 |
-
.ui-icon-extlink { background-position: -32px -80px; }
|
169 |
-
.ui-icon-newwin { background-position: -48px -80px; }
|
170 |
-
.ui-icon-refresh { background-position: -64px -80px; }
|
171 |
-
.ui-icon-shuffle { background-position: -80px -80px; }
|
172 |
-
.ui-icon-transfer-e-w { background-position: -96px -80px; }
|
173 |
-
.ui-icon-transferthick-e-w { background-position: -112px -80px; }
|
174 |
-
.ui-icon-folder-collapsed { background-position: 0 -96px; }
|
175 |
-
.ui-icon-folder-open { background-position: -16px -96px; }
|
176 |
-
.ui-icon-document { background-position: -32px -96px; }
|
177 |
-
.ui-icon-document-b { background-position: -48px -96px; }
|
178 |
-
.ui-icon-note { background-position: -64px -96px; }
|
179 |
-
.ui-icon-mail-closed { background-position: -80px -96px; }
|
180 |
-
.ui-icon-mail-open { background-position: -96px -96px; }
|
181 |
-
.ui-icon-suitcase { background-position: -112px -96px; }
|
182 |
-
.ui-icon-comment { background-position: -128px -96px; }
|
183 |
-
.ui-icon-person { background-position: -144px -96px; }
|
184 |
-
.ui-icon-print { background-position: -160px -96px; }
|
185 |
-
.ui-icon-trash { background-position: -176px -96px; }
|
186 |
-
.ui-icon-locked { background-position: -192px -96px; }
|
187 |
-
.ui-icon-unlocked { background-position: -208px -96px; }
|
188 |
-
.ui-icon-bookmark { background-position: -224px -96px; }
|
189 |
-
.ui-icon-tag { background-position: -240px -96px; }
|
190 |
-
.ui-icon-home { background-position: 0 -112px; }
|
191 |
-
.ui-icon-flag { background-position: -16px -112px; }
|
192 |
-
.ui-icon-calendar { background-position: -32px -112px; }
|
193 |
-
.ui-icon-cart { background-position: -48px -112px; }
|
194 |
-
.ui-icon-pencil { background-position: -64px -112px; }
|
195 |
-
.ui-icon-clock { background-position: -80px -112px; }
|
196 |
-
.ui-icon-disk { background-position: -96px -112px; }
|
197 |
-
.ui-icon-calculator { background-position: -112px -112px; }
|
198 |
-
.ui-icon-zoomin { background-position: -128px -112px; }
|
199 |
-
.ui-icon-zoomout { background-position: -144px -112px; }
|
200 |
-
.ui-icon-search { background-position: -160px -112px; }
|
201 |
-
.ui-icon-wrench { background-position: -176px -112px; }
|
202 |
-
.ui-icon-gear { background-position: -192px -112px; }
|
203 |
-
.ui-icon-heart { background-position: -208px -112px; }
|
204 |
-
.ui-icon-star { background-position: -224px -112px; }
|
205 |
-
.ui-icon-link { background-position: -240px -112px; }
|
206 |
-
.ui-icon-cancel { background-position: 0 -128px; }
|
207 |
-
.ui-icon-plus { background-position: -16px -128px; }
|
208 |
-
.ui-icon-plusthick { background-position: -32px -128px; }
|
209 |
-
.ui-icon-minus { background-position: -48px -128px; }
|
210 |
-
.ui-icon-minusthick { background-position: -64px -128px; }
|
211 |
-
.ui-icon-close { background-position: -80px -128px; }
|
212 |
-
.ui-icon-closethick { background-position: -96px -128px; }
|
213 |
-
.ui-icon-key { background-position: -112px -128px; }
|
214 |
-
.ui-icon-lightbulb { background-position: -128px -128px; }
|
215 |
-
.ui-icon-scissors { background-position: -144px -128px; }
|
216 |
-
.ui-icon-clipboard { background-position: -160px -128px; }
|
217 |
-
.ui-icon-copy { background-position: -176px -128px; }
|
218 |
-
.ui-icon-contact { background-position: -192px -128px; }
|
219 |
-
.ui-icon-image { background-position: -208px -128px; }
|
220 |
-
.ui-icon-video { background-position: -224px -128px; }
|
221 |
-
.ui-icon-script { background-position: -240px -128px; }
|
222 |
-
.ui-icon-alert { background-position: 0 -144px; }
|
223 |
-
.ui-icon-info { background-position: -16px -144px; }
|
224 |
-
.ui-icon-notice { background-position: -32px -144px; }
|
225 |
-
.ui-icon-help { background-position: -48px -144px; }
|
226 |
-
.ui-icon-check { background-position: -64px -144px; }
|
227 |
-
.ui-icon-bullet { background-position: -80px -144px; }
|
228 |
-
.ui-icon-radio-off { background-position: -96px -144px; }
|
229 |
-
.ui-icon-radio-on { background-position: -112px -144px; }
|
230 |
-
.ui-icon-pin-w { background-position: -128px -144px; }
|
231 |
-
.ui-icon-pin-s { background-position: -144px -144px; }
|
232 |
-
.ui-icon-play { background-position: 0 -160px; }
|
233 |
-
.ui-icon-pause { background-position: -16px -160px; }
|
234 |
-
.ui-icon-seek-next { background-position: -32px -160px; }
|
235 |
-
.ui-icon-seek-prev { background-position: -48px -160px; }
|
236 |
-
.ui-icon-seek-end { background-position: -64px -160px; }
|
237 |
-
.ui-icon-seek-start { background-position: -80px -160px; }
|
238 |
-
/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
|
239 |
-
.ui-icon-seek-first { background-position: -80px -160px; }
|
240 |
-
.ui-icon-stop { background-position: -96px -160px; }
|
241 |
-
.ui-icon-eject { background-position: -112px -160px; }
|
242 |
-
.ui-icon-volume-off { background-position: -128px -160px; }
|
243 |
-
.ui-icon-volume-on { background-position: -144px -160px; }
|
244 |
-
.ui-icon-power { background-position: 0 -176px; }
|
245 |
-
.ui-icon-signal-diag { background-position: -16px -176px; }
|
246 |
-
.ui-icon-signal { background-position: -32px -176px; }
|
247 |
-
.ui-icon-battery-0 { background-position: -48px -176px; }
|
248 |
-
.ui-icon-battery-1 { background-position: -64px -176px; }
|
249 |
-
.ui-icon-battery-2 { background-position: -80px -176px; }
|
250 |
-
.ui-icon-battery-3 { background-position: -96px -176px; }
|
251 |
-
.ui-icon-circle-plus { background-position: 0 -192px; }
|
252 |
-
.ui-icon-circle-minus { background-position: -16px -192px; }
|
253 |
-
.ui-icon-circle-close { background-position: -32px -192px; }
|
254 |
-
.ui-icon-circle-triangle-e { background-position: -48px -192px; }
|
255 |
-
.ui-icon-circle-triangle-s { background-position: -64px -192px; }
|
256 |
-
.ui-icon-circle-triangle-w { background-position: -80px -192px; }
|
257 |
-
.ui-icon-circle-triangle-n { background-position: -96px -192px; }
|
258 |
-
.ui-icon-circle-arrow-e { background-position: -112px -192px; }
|
259 |
-
.ui-icon-circle-arrow-s { background-position: -128px -192px; }
|
260 |
-
.ui-icon-circle-arrow-w { background-position: -144px -192px; }
|
261 |
-
.ui-icon-circle-arrow-n { background-position: -160px -192px; }
|
262 |
-
.ui-icon-circle-zoomin { background-position: -176px -192px; }
|
263 |
-
.ui-icon-circle-zoomout { background-position: -192px -192px; }
|
264 |
-
.ui-icon-circle-check { background-position: -208px -192px; }
|
265 |
-
.ui-icon-circlesmall-plus { background-position: 0 -208px; }
|
266 |
-
.ui-icon-circlesmall-minus { background-position: -16px -208px; }
|
267 |
-
.ui-icon-circlesmall-close { background-position: -32px -208px; }
|
268 |
-
.ui-icon-squaresmall-plus { background-position: -48px -208px; }
|
269 |
-
.ui-icon-squaresmall-minus { background-position: -64px -208px; }
|
270 |
-
.ui-icon-squaresmall-close { background-position: -80px -208px; }
|
271 |
-
.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
|
272 |
-
.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
|
273 |
-
.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
|
274 |
-
.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
|
275 |
-
.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
|
276 |
-
.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
|
277 |
-
|
278 |
-
|
279 |
-
/* Misc visuals
|
280 |
-
----------------------------------*/
|
281 |
-
|
282 |
-
/* Corner radius */
|
283 |
-
.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; }
|
284 |
-
.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
|
285 |
-
.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
|
286 |
-
.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
|
287 |
-
.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
|
288 |
-
.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
|
289 |
-
.ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
|
290 |
-
.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
|
291 |
-
.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; }
|
292 |
-
|
293 |
-
/* Overlays */
|
294 |
-
.ui-widget-overlay { background: #666666 url(../images/jquery_ui/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat; opacity: .50;filter:Alpha(Opacity=50); }
|
295 |
-
.ui-widget-shadow { margin: -5px 0 0 -5px; padding: 5px; background: #000000 url(../images/jquery_ui/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }/*
|
296 |
-
* jQuery UI Resizable 1.8.13
|
297 |
-
*
|
298 |
-
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
299 |
-
* Dual licensed under the MIT or GPL Version 2 licenses.
|
300 |
-
* http://jquery.org/license
|
301 |
-
*
|
302 |
-
* http://docs.jquery.com/UI/Resizable#theming
|
303 |
-
*/
|
304 |
-
.ui-resizable { position: relative;}
|
305 |
-
.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;
|
306 |
-
/* http://bugs.jqueryui.com/ticket/7233
|
307 |
-
- Resizable: resizable handles fail to work in IE if transparent and content overlaps
|
308 |
-
*/
|
309 |
-
background-image:url(data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=);
|
310 |
-
}
|
311 |
-
.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
|
312 |
-
.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
|
313 |
-
.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
|
314 |
-
.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
|
315 |
-
.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
|
316 |
-
.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
|
317 |
-
.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
|
318 |
-
.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
|
319 |
-
.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*
|
320 |
-
* jQuery UI Selectable 1.8.13
|
321 |
-
*
|
322 |
-
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
323 |
-
* Dual licensed under the MIT or GPL Version 2 licenses.
|
324 |
-
* http://jquery.org/license
|
325 |
-
*
|
326 |
-
* http://docs.jquery.com/UI/Selectable#theming
|
327 |
-
*/
|
328 |
-
.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
|
329 |
-
/*
|
330 |
-
* jQuery UI Accordion 1.8.13
|
331 |
-
*
|
332 |
-
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
333 |
-
* Dual licensed under the MIT or GPL Version 2 licenses.
|
334 |
-
* http://jquery.org/license
|
335 |
-
*
|
336 |
-
* http://docs.jquery.com/UI/Accordion#theming
|
337 |
-
*/
|
338 |
-
/* IE/Win - Fix animation bug - #4615 */
|
339 |
-
.ui-accordion { width: 100%; }
|
340 |
-
.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
|
341 |
-
.ui-accordion .ui-accordion-li-fix { display: inline; }
|
342 |
-
.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
|
343 |
-
.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
|
344 |
-
.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
|
345 |
-
.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
|
346 |
-
.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
|
347 |
-
.ui-accordion .ui-accordion-content-active { display: block; }
|
348 |
-
/*
|
349 |
-
* jQuery UI Autocomplete 1.8.13
|
350 |
-
*
|
351 |
-
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
352 |
-
* Dual licensed under the MIT or GPL Version 2 licenses.
|
353 |
-
* http://jquery.org/license
|
354 |
-
*
|
355 |
-
* http://docs.jquery.com/UI/Autocomplete#theming
|
356 |
-
*/
|
357 |
-
.ui-autocomplete { position: absolute; cursor: default; }
|
358 |
-
|
359 |
-
/* workarounds */
|
360 |
-
* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
|
361 |
-
|
362 |
-
/*
|
363 |
-
* jQuery UI Menu 1.8.13
|
364 |
-
*
|
365 |
-
* Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
|
366 |
-
* Dual licensed under the MIT or GPL Version 2 licenses.
|
367 |
-
* http://jquery.org/license
|
368 |
-
*
|
369 |
-
* http://docs.jquery.com/UI/Menu#theming
|
370 |
-
*/
|
371 |
-
.ui-menu {
|
372 |
-
list-style:none;
|
373 |
-
padding: 2px;
|
374 |
-
margin: 0;
|
375 |
-
display:block;
|
376 |
-
float: left;
|
377 |
-
}
|
378 |
-
.ui-menu .ui-menu {
|
379 |
-
margin-top: -3px;
|
380 |
-
}
|
381 |
-
.ui-menu .ui-menu-item {
|
382 |
-
margin:0;
|
383 |
-
padding: 0;
|
384 |
-
zoom: 1;
|
385 |
-
float: left;
|
386 |
-
clear: left;
|
387 |
-
width: 100%;
|
388 |
-
}
|
389 |
-
.ui-menu .ui-menu-item a {
|
390 |
-
text-decoration:none;
|
391 |
-
display:block;
|
392 |
-
padding:.2em .4em;
|
393 |
-
line-height:1.5;
|
394 |
-
zoom:1;
|
395 |
-
}
|
396 |
-
.ui-menu .ui-menu-item a.ui-state-hover,
|
397 |
-
.ui-menu .ui-menu-item a.ui-state-active {
|
398 |
-
font-weight: normal;
|
399 |
-
margin: -1px;
|
400 |
-
}
|
401 |
-
/*
|
402 |
-
* jQuery UI Button 1.8.13
|
403 |
-
*
|
404 |
-
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
405 |
-
* Dual licensed under the MIT or GPL Version 2 licenses.
|
406 |
-
* http://jquery.org/license
|
407 |
-
*
|
408 |
-
* http://docs.jquery.com/UI/Button#theming
|
409 |
-
*/
|
410 |
-
.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
|
411 |
-
.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
|
412 |
-
button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
|
413 |
-
.ui-button-icons-only { width: 3.4em; }
|
414 |
-
button.ui-button-icons-only { width: 3.7em; }
|
415 |
-
|
416 |
-
/*button text element */
|
417 |
-
.ui-button .ui-button-text { display: block; line-height: 1.4; }
|
418 |
-
.ui-button-text-only .ui-button-text { padding: .4em 1em; }
|
419 |
-
.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
|
420 |
-
.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
|
421 |
-
.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
|
422 |
-
.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
|
423 |
-
/* no icon support for input elements, provide padding by default */
|
424 |
-
input.ui-button { padding: .4em 1em; }
|
425 |
-
|
426 |
-
/*button icon element(s) */
|
427 |
-
.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
|
428 |
-
.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
|
429 |
-
.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
|
430 |
-
.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
|
431 |
-
.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
|
432 |
-
|
433 |
-
/*button sets*/
|
434 |
-
.ui-buttonset { margin-right: 7px; }
|
435 |
-
.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
|
436 |
-
|
437 |
-
/* workarounds */
|
438 |
-
button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
|
439 |
-
/*
|
440 |
-
* jQuery UI Dialog 1.8.13
|
441 |
-
*
|
442 |
-
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
443 |
-
* Dual licensed under the MIT or GPL Version 2 licenses.
|
444 |
-
* http://jquery.org/license
|
445 |
-
*
|
446 |
-
* http://docs.jquery.com/UI/Dialog#theming
|
447 |
-
*/
|
448 |
-
.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
|
449 |
-
.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; }
|
450 |
-
.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; }
|
451 |
-
.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
|
452 |
-
.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
|
453 |
-
.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
|
454 |
-
.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
|
455 |
-
.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
|
456 |
-
.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
|
457 |
-
.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
|
458 |
-
.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
|
459 |
-
.ui-draggable .ui-dialog-titlebar { cursor: move; }
|
460 |
-
/*
|
461 |
-
* jQuery UI Slider 1.8.13
|
462 |
-
*
|
463 |
-
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
464 |
-
* Dual licensed under the MIT or GPL Version 2 licenses.
|
465 |
-
* http://jquery.org/license
|
466 |
-
*
|
467 |
-
* http://docs.jquery.com/UI/Slider#theming
|
468 |
-
*/
|
469 |
-
.ui-slider { position: relative; text-align: left; }
|
470 |
-
.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
|
471 |
-
.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
|
472 |
-
|
473 |
-
.ui-slider-horizontal { height: .8em; }
|
474 |
-
.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
|
475 |
-
.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
|
476 |
-
.ui-slider-horizontal .ui-slider-range-min { left: 0; }
|
477 |
-
.ui-slider-horizontal .ui-slider-range-max { right: 0; }
|
478 |
-
|
479 |
-
.ui-slider-vertical { width: .8em; height: 100px; }
|
480 |
-
.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
|
481 |
-
.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
|
482 |
-
.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
|
483 |
-
.ui-slider-vertical .ui-slider-range-max { top: 0; }/*
|
484 |
-
* jQuery UI Tabs 1.8.13
|
485 |
-
*
|
486 |
-
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
487 |
-
* Dual licensed under the MIT or GPL Version 2 licenses.
|
488 |
-
* http://jquery.org/license
|
489 |
-
*
|
490 |
-
* http://docs.jquery.com/UI/Tabs#theming
|
491 |
-
*/
|
492 |
-
.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
|
493 |
-
.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
|
494 |
-
.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
|
495 |
-
.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
|
496 |
-
.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
|
497 |
-
.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
|
498 |
-
.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
|
499 |
-
.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
|
500 |
-
.ui-tabs .ui-tabs-hide { display: none !important; }
|
501 |
-
/*
|
502 |
-
* jQuery UI Datepicker 1.8.13
|
503 |
-
*
|
504 |
-
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
505 |
-
* Dual licensed under the MIT or GPL Version 2 licenses.
|
506 |
-
* http://jquery.org/license
|
507 |
-
*
|
508 |
-
* http://docs.jquery.com/UI/Datepicker#theming
|
509 |
-
*/
|
510 |
-
.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
|
511 |
-
.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
|
512 |
-
.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
|
513 |
-
.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
|
514 |
-
.ui-datepicker .ui-datepicker-prev { left:2px; }
|
515 |
-
.ui-datepicker .ui-datepicker-next { right:2px; }
|
516 |
-
.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
|
517 |
-
.ui-datepicker .ui-datepicker-next-hover { right:1px; }
|
518 |
-
.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; }
|
519 |
-
.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
|
520 |
-
.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
|
521 |
-
.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
|
522 |
-
.ui-datepicker select.ui-datepicker-month,
|
523 |
-
.ui-datepicker select.ui-datepicker-year { width: 49%;}
|
524 |
-
.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
|
525 |
-
.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; }
|
526 |
-
.ui-datepicker td { border: 0; padding: 1px; }
|
527 |
-
.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
|
528 |
-
.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
|
529 |
-
.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
|
530 |
-
.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
|
531 |
-
|
532 |
-
/* with multiple calendars */
|
533 |
-
.ui-datepicker.ui-datepicker-multi { width:auto; }
|
534 |
-
.ui-datepicker-multi .ui-datepicker-group { float:left; }
|
535 |
-
.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
|
536 |
-
.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
|
537 |
-
.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
|
538 |
-
.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
|
539 |
-
.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
|
540 |
-
.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
|
541 |
-
.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
|
542 |
-
.ui-datepicker-row-break { clear:both; width:100%; }
|
543 |
-
|
544 |
-
/* RTL support */
|
545 |
-
.ui-datepicker-rtl { direction: rtl; }
|
546 |
-
.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
|
547 |
-
.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
|
548 |
-
.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
|
549 |
-
.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
|
550 |
-
.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
|
551 |
-
.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
|
552 |
-
.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
|
553 |
-
.ui-datepicker-rtl .ui-datepicker-group { float:right; }
|
554 |
-
.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
|
555 |
-
.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
|
556 |
-
|
557 |
-
/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
|
558 |
-
.ui-datepicker-cover {
|
559 |
-
display: none; /*sorry for IE5*/
|
560 |
-
display/**/: block; /*sorry for IE5*/
|
561 |
-
position: absolute; /*must have*/
|
562 |
-
z-index: -1; /*must have*/
|
563 |
-
filter: mask(); /*must have*/
|
564 |
-
top: -4px; /*must have*/
|
565 |
-
left: -4px; /*must have*/
|
566 |
-
width: 200px; /*must have*/
|
567 |
-
height: 200px; /*must have*/
|
568 |
-
}/*
|
569 |
-
* jQuery UI Progressbar 1.8.13
|
570 |
-
*
|
571 |
-
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
572 |
-
* Dual licensed under the MIT or GPL Version 2 licenses.
|
573 |
-
* http://jquery.org/license
|
574 |
-
*
|
575 |
-
* http://docs.jquery.com/UI/Progressbar#theming
|
576 |
-
*/
|
577 |
-
.ui-progressbar { height:2em; text-align: left; }
|
578 |
.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
|
1 |
+
/*
|
2 |
+
* jQuery UI CSS Framework 1.8.13
|
3 |
+
*
|
4 |
+
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
5 |
+
* Dual licensed under the MIT or GPL Version 2 licenses.
|
6 |
+
* http://jquery.org/license
|
7 |
+
*
|
8 |
+
* http://docs.jquery.com/UI/Theming/API
|
9 |
+
*/
|
10 |
+
|
11 |
+
/* Layout helpers
|
12 |
+
----------------------------------*/
|
13 |
+
.ui-helper-hidden { display: none; }
|
14 |
+
.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
|
15 |
+
.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
|
16 |
+
.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
|
17 |
+
.ui-helper-clearfix { display: inline-block; }
|
18 |
+
/* required comment for clearfix to work in Opera \*/
|
19 |
+
* html .ui-helper-clearfix { height:1%; }
|
20 |
+
.ui-helper-clearfix { display:block; }
|
21 |
+
/* end clearfix */
|
22 |
+
.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
|
23 |
+
|
24 |
+
|
25 |
+
/* Interaction Cues
|
26 |
+
----------------------------------*/
|
27 |
+
.ui-state-disabled { cursor: default !important; }
|
28 |
+
|
29 |
+
|
30 |
+
/* Icons
|
31 |
+
----------------------------------*/
|
32 |
+
|
33 |
+
/* states and images */
|
34 |
+
.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
|
35 |
+
|
36 |
+
|
37 |
+
/* Misc visuals
|
38 |
+
----------------------------------*/
|
39 |
+
|
40 |
+
/* Overlays */
|
41 |
+
.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
|
42 |
+
|
43 |
+
|
44 |
+
/*
|
45 |
+
* jQuery UI CSS Framework 1.8.13
|
46 |
+
*
|
47 |
+
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
48 |
+
* Dual licensed under the MIT or GPL Version 2 licenses.
|
49 |
+
* http://jquery.org/license
|
50 |
+
*
|
51 |
+
* http://docs.jquery.com/UI/Theming/API
|
52 |
+
*
|
53 |
+
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
|
54 |
+
*/
|
55 |
+
|
56 |
+
|
57 |
+
/* Component containers
|
58 |
+
----------------------------------*/
|
59 |
+
.ui-widget { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1.1em; }
|
60 |
+
.ui-widget .ui-widget { font-size: 1em; }
|
61 |
+
.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1em; }
|
62 |
+
.ui-widget-content { border: 1px solid #dddddd; background: #eeeeee url(../images/jquery_ui/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x; color: #333333; }
|
63 |
+
.ui-widget-content a { color: #333333; }
|
64 |
+
.ui-widget-header { border: 1px solid #e78f08; background: #f6a828 url(../images/jquery_ui/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; }
|
65 |
+
.ui-widget-header a { color: #ffffff; }
|
66 |
+
|
67 |
+
/* Interaction states
|
68 |
+
----------------------------------*/
|
69 |
+
.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #cccccc; background: #f6f6f6 url(../images/jquery_ui/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1c94c4; }
|
70 |
+
.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #1c94c4; text-decoration: none; }
|
71 |
+
.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #fbcb09; background: #fdf5ce url(../images/jquery_ui/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #c77405; }
|
72 |
+
.ui-state-hover a, .ui-state-hover a:hover { color: #c77405; text-decoration: none; }
|
73 |
+
.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #fbd850; background: #ffffff url(../images/jquery_ui/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #eb8f00; }
|
74 |
+
.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #eb8f00; text-decoration: none; }
|
75 |
+
.ui-widget :active { outline: none; }
|
76 |
+
|
77 |
+
/* Interaction Cues
|
78 |
+
----------------------------------*/
|
79 |
+
.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fed22f; background: #ffe45c url(../images/jquery_ui/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x; color: #363636; }
|
80 |
+
.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
|
81 |
+
.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #b81900 url(../images/jquery_ui/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat; color: #ffffff; }
|
82 |
+
.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; }
|
83 |
+
.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; }
|
84 |
+
.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
|
85 |
+
.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
|
86 |
+
.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
|
87 |
+
|
88 |
+
/* Icons
|
89 |
+
----------------------------------*/
|
90 |
+
|
91 |
+
/* states and images */
|
92 |
+
.ui-icon { width: 16px; height: 16px; background-image: url(../images/jquery_ui/ui-icons_222222_256x240.png); }
|
93 |
+
.ui-widget-content .ui-icon {background-image: url(../images/jquery_ui/ui-icons_222222_256x240.png); }
|
94 |
+
.ui-widget-header .ui-icon {background-image: url(../images/jquery_ui/ui-icons_ffffff_256x240.png); }
|
95 |
+
.ui-state-default .ui-icon { background-image: url(../images/jquery_ui/ui-icons_ef8c08_256x240.png); }
|
96 |
+
.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(../images/jquery_ui/ui-icons_ef8c08_256x240.png); }
|
97 |
+
.ui-state-active .ui-icon {background-image: url(../images/jquery_ui/ui-icons_ef8c08_256x240.png); }
|
98 |
+
.ui-state-highlight .ui-icon {background-image: url(../images/jquery_ui/ui-icons_228ef1_256x240.png); }
|
99 |
+
.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(../images/jquery_ui/ui-icons_ffd27a_256x240.png); }
|
100 |
+
|
101 |
+
/* positioning */
|
102 |
+
.ui-icon-carat-1-n { background-position: 0 0; }
|
103 |
+
.ui-icon-carat-1-ne { background-position: -16px 0; }
|
104 |
+
.ui-icon-carat-1-e { background-position: -32px 0; }
|
105 |
+
.ui-icon-carat-1-se { background-position: -48px 0; }
|
106 |
+
.ui-icon-carat-1-s { background-position: -64px 0; }
|
107 |
+
.ui-icon-carat-1-sw { background-position: -80px 0; }
|
108 |
+
.ui-icon-carat-1-w { background-position: -96px 0; }
|
109 |
+
.ui-icon-carat-1-nw { background-position: -112px 0; }
|
110 |
+
.ui-icon-carat-2-n-s { background-position: -128px 0; }
|
111 |
+
.ui-icon-carat-2-e-w { background-position: -144px 0; }
|
112 |
+
.ui-icon-triangle-1-n { background-position: 0 -16px; }
|
113 |
+
.ui-icon-triangle-1-ne { background-position: -16px -16px; }
|
114 |
+
.ui-icon-triangle-1-e { background-position: -32px -16px; }
|
115 |
+
.ui-icon-triangle-1-se { background-position: -48px -16px; }
|
116 |
+
.ui-icon-triangle-1-s { background-position: -64px -16px; }
|
117 |
+
.ui-icon-triangle-1-sw { background-position: -80px -16px; }
|
118 |
+
.ui-icon-triangle-1-w { background-position: -96px -16px; }
|
119 |
+
.ui-icon-triangle-1-nw { background-position: -112px -16px; }
|
120 |
+
.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
|
121 |
+
.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
|
122 |
+
.ui-icon-arrow-1-n { background-position: 0 -32px; }
|
123 |
+
.ui-icon-arrow-1-ne { background-position: -16px -32px; }
|
124 |
+
.ui-icon-arrow-1-e { background-position: -32px -32px; }
|
125 |
+
.ui-icon-arrow-1-se { background-position: -48px -32px; }
|
126 |
+
.ui-icon-arrow-1-s { background-position: -64px -32px; }
|
127 |
+
.ui-icon-arrow-1-sw { background-position: -80px -32px; }
|
128 |
+
.ui-icon-arrow-1-w { background-position: -96px -32px; }
|
129 |
+
.ui-icon-arrow-1-nw { background-position: -112px -32px; }
|
130 |
+
.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
|
131 |
+
.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
|
132 |
+
.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
|
133 |
+
.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
|
134 |
+
.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
|
135 |
+
.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
|
136 |
+
.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
|
137 |
+
.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
|
138 |
+
.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
|
139 |
+
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
|
140 |
+
.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
|
141 |
+
.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
|
142 |
+
.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
|
143 |
+
.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
|
144 |
+
.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
|
145 |
+
.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
|
146 |
+
.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
|
147 |
+
.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
|
148 |
+
.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
|
149 |
+
.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
|
150 |
+
.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
|
151 |
+
.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
|
152 |
+
.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
|
153 |
+
.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
|
154 |
+
.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
|
155 |
+
.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
|
156 |
+
.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
|
157 |
+
.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
|
158 |
+
.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
|
159 |
+
.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
|
160 |
+
.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
|
161 |
+
.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
|
162 |
+
.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
|
163 |
+
.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
|
164 |
+
.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
|
165 |
+
.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
|
166 |
+
.ui-icon-arrow-4 { background-position: 0 -80px; }
|
167 |
+
.ui-icon-arrow-4-diag { background-position: -16px -80px; }
|
168 |
+
.ui-icon-extlink { background-position: -32px -80px; }
|
169 |
+
.ui-icon-newwin { background-position: -48px -80px; }
|
170 |
+
.ui-icon-refresh { background-position: -64px -80px; }
|
171 |
+
.ui-icon-shuffle { background-position: -80px -80px; }
|
172 |
+
.ui-icon-transfer-e-w { background-position: -96px -80px; }
|
173 |
+
.ui-icon-transferthick-e-w { background-position: -112px -80px; }
|
174 |
+
.ui-icon-folder-collapsed { background-position: 0 -96px; }
|
175 |
+
.ui-icon-folder-open { background-position: -16px -96px; }
|
176 |
+
.ui-icon-document { background-position: -32px -96px; }
|
177 |
+
.ui-icon-document-b { background-position: -48px -96px; }
|
178 |
+
.ui-icon-note { background-position: -64px -96px; }
|
179 |
+
.ui-icon-mail-closed { background-position: -80px -96px; }
|
180 |
+
.ui-icon-mail-open { background-position: -96px -96px; }
|
181 |
+
.ui-icon-suitcase { background-position: -112px -96px; }
|
182 |
+
.ui-icon-comment { background-position: -128px -96px; }
|
183 |
+
.ui-icon-person { background-position: -144px -96px; }
|
184 |
+
.ui-icon-print { background-position: -160px -96px; }
|
185 |
+
.ui-icon-trash { background-position: -176px -96px; }
|
186 |
+
.ui-icon-locked { background-position: -192px -96px; }
|
187 |
+
.ui-icon-unlocked { background-position: -208px -96px; }
|
188 |
+
.ui-icon-bookmark { background-position: -224px -96px; }
|
189 |
+
.ui-icon-tag { background-position: -240px -96px; }
|
190 |
+
.ui-icon-home { background-position: 0 -112px; }
|
191 |
+
.ui-icon-flag { background-position: -16px -112px; }
|
192 |
+
.ui-icon-calendar { background-position: -32px -112px; }
|
193 |
+
.ui-icon-cart { background-position: -48px -112px; }
|
194 |
+
.ui-icon-pencil { background-position: -64px -112px; }
|
195 |
+
.ui-icon-clock { background-position: -80px -112px; }
|
196 |
+
.ui-icon-disk { background-position: -96px -112px; }
|
197 |
+
.ui-icon-calculator { background-position: -112px -112px; }
|
198 |
+
.ui-icon-zoomin { background-position: -128px -112px; }
|
199 |
+
.ui-icon-zoomout { background-position: -144px -112px; }
|
200 |
+
.ui-icon-search { background-position: -160px -112px; }
|
201 |
+
.ui-icon-wrench { background-position: -176px -112px; }
|
202 |
+
.ui-icon-gear { background-position: -192px -112px; }
|
203 |
+
.ui-icon-heart { background-position: -208px -112px; }
|
204 |
+
.ui-icon-star { background-position: -224px -112px; }
|
205 |
+
.ui-icon-link { background-position: -240px -112px; }
|
206 |
+
.ui-icon-cancel { background-position: 0 -128px; }
|
207 |
+
.ui-icon-plus { background-position: -16px -128px; }
|
208 |
+
.ui-icon-plusthick { background-position: -32px -128px; }
|
209 |
+
.ui-icon-minus { background-position: -48px -128px; }
|
210 |
+
.ui-icon-minusthick { background-position: -64px -128px; }
|
211 |
+
.ui-icon-close { background-position: -80px -128px; }
|
212 |
+
.ui-icon-closethick { background-position: -96px -128px; }
|
213 |
+
.ui-icon-key { background-position: -112px -128px; }
|
214 |
+
.ui-icon-lightbulb { background-position: -128px -128px; }
|
215 |
+
.ui-icon-scissors { background-position: -144px -128px; }
|
216 |
+
.ui-icon-clipboard { background-position: -160px -128px; }
|
217 |
+
.ui-icon-copy { background-position: -176px -128px; }
|
218 |
+
.ui-icon-contact { background-position: -192px -128px; }
|
219 |
+
.ui-icon-image { background-position: -208px -128px; }
|
220 |
+
.ui-icon-video { background-position: -224px -128px; }
|
221 |
+
.ui-icon-script { background-position: -240px -128px; }
|
222 |
+
.ui-icon-alert { background-position: 0 -144px; }
|
223 |
+
.ui-icon-info { background-position: -16px -144px; }
|
224 |
+
.ui-icon-notice { background-position: -32px -144px; }
|
225 |
+
.ui-icon-help { background-position: -48px -144px; }
|
226 |
+
.ui-icon-check { background-position: -64px -144px; }
|
227 |
+
.ui-icon-bullet { background-position: -80px -144px; }
|
228 |
+
.ui-icon-radio-off { background-position: -96px -144px; }
|
229 |
+
.ui-icon-radio-on { background-position: -112px -144px; }
|
230 |
+
.ui-icon-pin-w { background-position: -128px -144px; }
|
231 |
+
.ui-icon-pin-s { background-position: -144px -144px; }
|
232 |
+
.ui-icon-play { background-position: 0 -160px; }
|
233 |
+
.ui-icon-pause { background-position: -16px -160px; }
|
234 |
+
.ui-icon-seek-next { background-position: -32px -160px; }
|
235 |
+
.ui-icon-seek-prev { background-position: -48px -160px; }
|
236 |
+
.ui-icon-seek-end { background-position: -64px -160px; }
|
237 |
+
.ui-icon-seek-start { background-position: -80px -160px; }
|
238 |
+
/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
|
239 |
+
.ui-icon-seek-first { background-position: -80px -160px; }
|
240 |
+
.ui-icon-stop { background-position: -96px -160px; }
|
241 |
+
.ui-icon-eject { background-position: -112px -160px; }
|
242 |
+
.ui-icon-volume-off { background-position: -128px -160px; }
|
243 |
+
.ui-icon-volume-on { background-position: -144px -160px; }
|
244 |
+
.ui-icon-power { background-position: 0 -176px; }
|
245 |
+
.ui-icon-signal-diag { background-position: -16px -176px; }
|
246 |
+
.ui-icon-signal { background-position: -32px -176px; }
|
247 |
+
.ui-icon-battery-0 { background-position: -48px -176px; }
|
248 |
+
.ui-icon-battery-1 { background-position: -64px -176px; }
|
249 |
+
.ui-icon-battery-2 { background-position: -80px -176px; }
|
250 |
+
.ui-icon-battery-3 { background-position: -96px -176px; }
|
251 |
+
.ui-icon-circle-plus { background-position: 0 -192px; }
|
252 |
+
.ui-icon-circle-minus { background-position: -16px -192px; }
|
253 |
+
.ui-icon-circle-close { background-position: -32px -192px; }
|
254 |
+
.ui-icon-circle-triangle-e { background-position: -48px -192px; }
|
255 |
+
.ui-icon-circle-triangle-s { background-position: -64px -192px; }
|
256 |
+
.ui-icon-circle-triangle-w { background-position: -80px -192px; }
|
257 |
+
.ui-icon-circle-triangle-n { background-position: -96px -192px; }
|
258 |
+
.ui-icon-circle-arrow-e { background-position: -112px -192px; }
|
259 |
+
.ui-icon-circle-arrow-s { background-position: -128px -192px; }
|
260 |
+
.ui-icon-circle-arrow-w { background-position: -144px -192px; }
|
261 |
+
.ui-icon-circle-arrow-n { background-position: -160px -192px; }
|
262 |
+
.ui-icon-circle-zoomin { background-position: -176px -192px; }
|
263 |
+
.ui-icon-circle-zoomout { background-position: -192px -192px; }
|
264 |
+
.ui-icon-circle-check { background-position: -208px -192px; }
|
265 |
+
.ui-icon-circlesmall-plus { background-position: 0 -208px; }
|
266 |
+
.ui-icon-circlesmall-minus { background-position: -16px -208px; }
|
267 |
+
.ui-icon-circlesmall-close { background-position: -32px -208px; }
|
268 |
+
.ui-icon-squaresmall-plus { background-position: -48px -208px; }
|
269 |
+
.ui-icon-squaresmall-minus { background-position: -64px -208px; }
|
270 |
+
.ui-icon-squaresmall-close { background-position: -80px -208px; }
|
271 |
+
.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
|
272 |
+
.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
|
273 |
+
.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
|
274 |
+
.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
|
275 |
+
.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
|
276 |
+
.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
|
277 |
+
|
278 |
+
|
279 |
+
/* Misc visuals
|
280 |
+
----------------------------------*/
|
281 |
+
|
282 |
+
/* Corner radius */
|
283 |
+
.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; }
|
284 |
+
.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
|
285 |
+
.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
|
286 |
+
.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
|
287 |
+
.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
|
288 |
+
.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
|
289 |
+
.ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
|
290 |
+
.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
|
291 |
+
.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; }
|
292 |
+
|
293 |
+
/* Overlays */
|
294 |
+
.ui-widget-overlay { background: #666666 url(../images/jquery_ui/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat; opacity: .50;filter:Alpha(Opacity=50); }
|
295 |
+
.ui-widget-shadow { margin: -5px 0 0 -5px; padding: 5px; background: #000000 url(../images/jquery_ui/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }/*
|
296 |
+
* jQuery UI Resizable 1.8.13
|
297 |
+
*
|
298 |
+
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
299 |
+
* Dual licensed under the MIT or GPL Version 2 licenses.
|
300 |
+
* http://jquery.org/license
|
301 |
+
*
|
302 |
+
* http://docs.jquery.com/UI/Resizable#theming
|
303 |
+
*/
|
304 |
+
.ui-resizable { position: relative;}
|
305 |
+
.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;
|
306 |
+
/* http://bugs.jqueryui.com/ticket/7233
|
307 |
+
- Resizable: resizable handles fail to work in IE if transparent and content overlaps
|
308 |
+
*/
|
309 |
+
background-image:url(data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=);
|
310 |
+
}
|
311 |
+
.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
|
312 |
+
.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
|
313 |
+
.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
|
314 |
+
.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
|
315 |
+
.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
|
316 |
+
.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
|
317 |
+
.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
|
318 |
+
.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
|
319 |
+
.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*
|
320 |
+
* jQuery UI Selectable 1.8.13
|
321 |
+
*
|
322 |
+
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
323 |
+
* Dual licensed under the MIT or GPL Version 2 licenses.
|
324 |
+
* http://jquery.org/license
|
325 |
+
*
|
326 |
+
* http://docs.jquery.com/UI/Selectable#theming
|
327 |
+
*/
|
328 |
+
.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
|
329 |
+
/*
|
330 |
+
* jQuery UI Accordion 1.8.13
|
331 |
+
*
|
332 |
+
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
333 |
+
* Dual licensed under the MIT or GPL Version 2 licenses.
|
334 |
+
* http://jquery.org/license
|
335 |
+
*
|
336 |
+
* http://docs.jquery.com/UI/Accordion#theming
|
337 |
+
*/
|
338 |
+
/* IE/Win - Fix animation bug - #4615 */
|
339 |
+
.ui-accordion { width: 100%; }
|
340 |
+
.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
|
341 |
+
.ui-accordion .ui-accordion-li-fix { display: inline; }
|
342 |
+
.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
|
343 |
+
.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
|
344 |
+
.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
|
345 |
+
.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
|
346 |
+
.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
|
347 |
+
.ui-accordion .ui-accordion-content-active { display: block; }
|
348 |
+
/*
|
349 |
+
* jQuery UI Autocomplete 1.8.13
|
350 |
+
*
|
351 |
+
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
352 |
+
* Dual licensed under the MIT or GPL Version 2 licenses.
|
353 |
+
* http://jquery.org/license
|
354 |
+
*
|
355 |
+
* http://docs.jquery.com/UI/Autocomplete#theming
|
356 |
+
*/
|
357 |
+
.ui-autocomplete { position: absolute; cursor: default; }
|
358 |
+
|
359 |
+
/* workarounds */
|
360 |
+
* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
|
361 |
+
|
362 |
+
/*
|
363 |
+
* jQuery UI Menu 1.8.13
|
364 |
+
*
|
365 |
+
* Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
|
366 |
+
* Dual licensed under the MIT or GPL Version 2 licenses.
|
367 |
+
* http://jquery.org/license
|
368 |
+
*
|
369 |
+
* http://docs.jquery.com/UI/Menu#theming
|
370 |
+
*/
|
371 |
+
.ui-menu {
|
372 |
+
list-style:none;
|
373 |
+
padding: 2px;
|
374 |
+
margin: 0;
|
375 |
+
display:block;
|
376 |
+
float: left;
|
377 |
+
}
|
378 |
+
.ui-menu .ui-menu {
|
379 |
+
margin-top: -3px;
|
380 |
+
}
|
381 |
+
.ui-menu .ui-menu-item {
|
382 |
+
margin:0;
|
383 |
+
padding: 0;
|
384 |
+
zoom: 1;
|
385 |
+
float: left;
|
386 |
+
clear: left;
|
387 |
+
width: 100%;
|
388 |
+
}
|
389 |
+
.ui-menu .ui-menu-item a {
|
390 |
+
text-decoration:none;
|
391 |
+
display:block;
|
392 |
+
padding:.2em .4em;
|
393 |
+
line-height:1.5;
|
394 |
+
zoom:1;
|
395 |
+
}
|
396 |
+
.ui-menu .ui-menu-item a.ui-state-hover,
|
397 |
+
.ui-menu .ui-menu-item a.ui-state-active {
|
398 |
+
font-weight: normal;
|
399 |
+
margin: -1px;
|
400 |
+
}
|
401 |
+
/*
|
402 |
+
* jQuery UI Button 1.8.13
|
403 |
+
*
|
404 |
+
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
405 |
+
* Dual licensed under the MIT or GPL Version 2 licenses.
|
406 |
+
* http://jquery.org/license
|
407 |
+
*
|
408 |
+
* http://docs.jquery.com/UI/Button#theming
|
409 |
+
*/
|
410 |
+
.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
|
411 |
+
.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
|
412 |
+
button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
|
413 |
+
.ui-button-icons-only { width: 3.4em; }
|
414 |
+
button.ui-button-icons-only { width: 3.7em; }
|
415 |
+
|
416 |
+
/*button text element */
|
417 |
+
.ui-button .ui-button-text { display: block; line-height: 1.4; }
|
418 |
+
.ui-button-text-only .ui-button-text { padding: .4em 1em; }
|
419 |
+
.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
|
420 |
+
.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
|
421 |
+
.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
|
422 |
+
.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
|
423 |
+
/* no icon support for input elements, provide padding by default */
|
424 |
+
input.ui-button { padding: .4em 1em; }
|
425 |
+
|
426 |
+
/*button icon element(s) */
|
427 |
+
.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
|
428 |
+
.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
|
429 |
+
.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
|
430 |
+
.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
|
431 |
+
.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
|
432 |
+
|
433 |
+
/*button sets*/
|
434 |
+
.ui-buttonset { margin-right: 7px; }
|
435 |
+
.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
|
436 |
+
|
437 |
+
/* workarounds */
|
438 |
+
button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
|
439 |
+
/*
|
440 |
+
* jQuery UI Dialog 1.8.13
|
441 |
+
*
|
442 |
+
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
443 |
+
* Dual licensed under the MIT or GPL Version 2 licenses.
|
444 |
+
* http://jquery.org/license
|
445 |
+
*
|
446 |
+
* http://docs.jquery.com/UI/Dialog#theming
|
447 |
+
*/
|
448 |
+
.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
|
449 |
+
.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; }
|
450 |
+
.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; }
|
451 |
+
.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
|
452 |
+
.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
|
453 |
+
.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
|
454 |
+
.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
|
455 |
+
.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
|
456 |
+
.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
|
457 |
+
.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
|
458 |
+
.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
|
459 |
+
.ui-draggable .ui-dialog-titlebar { cursor: move; }
|
460 |
+
/*
|
461 |
+
* jQuery UI Slider 1.8.13
|
462 |
+
*
|
463 |
+
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
464 |
+
* Dual licensed under the MIT or GPL Version 2 licenses.
|
465 |
+
* http://jquery.org/license
|
466 |
+
*
|
467 |
+
* http://docs.jquery.com/UI/Slider#theming
|
468 |
+
*/
|
469 |
+
.ui-slider { position: relative; text-align: left; }
|
470 |
+
.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
|
471 |
+
.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
|
472 |
+
|
473 |
+
.ui-slider-horizontal { height: .8em; }
|
474 |
+
.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
|
475 |
+
.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
|
476 |
+
.ui-slider-horizontal .ui-slider-range-min { left: 0; }
|
477 |
+
.ui-slider-horizontal .ui-slider-range-max { right: 0; }
|
478 |
+
|
479 |
+
.ui-slider-vertical { width: .8em; height: 100px; }
|
480 |
+
.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
|
481 |
+
.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
|
482 |
+
.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
|
483 |
+
.ui-slider-vertical .ui-slider-range-max { top: 0; }/*
|
484 |
+
* jQuery UI Tabs 1.8.13
|
485 |
+
*
|
486 |
+
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
487 |
+
* Dual licensed under the MIT or GPL Version 2 licenses.
|
488 |
+
* http://jquery.org/license
|
489 |
+
*
|
490 |
+
* http://docs.jquery.com/UI/Tabs#theming
|
491 |
+
*/
|
492 |
+
.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
|
493 |
+
.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
|
494 |
+
.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
|
495 |
+
.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
|
496 |
+
.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
|
497 |
+
.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
|
498 |
+
.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
|
499 |
+
.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
|
500 |
+
.ui-tabs .ui-tabs-hide { display: none !important; }
|
501 |
+
/*
|
502 |
+
* jQuery UI Datepicker 1.8.13
|
503 |
+
*
|
504 |
+
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
505 |
+
* Dual licensed under the MIT or GPL Version 2 licenses.
|
506 |
+
* http://jquery.org/license
|
507 |
+
*
|
508 |
+
* http://docs.jquery.com/UI/Datepicker#theming
|
509 |
+
*/
|
510 |
+
.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
|
511 |
+
.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
|
512 |
+
.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
|
513 |
+
.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
|
514 |
+
.ui-datepicker .ui-datepicker-prev { left:2px; }
|
515 |
+
.ui-datepicker .ui-datepicker-next { right:2px; }
|
516 |
+
.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
|
517 |
+
.ui-datepicker .ui-datepicker-next-hover { right:1px; }
|
518 |
+
.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; }
|
519 |
+
.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
|
520 |
+
.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
|
521 |
+
.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
|
522 |
+
.ui-datepicker select.ui-datepicker-month,
|
523 |
+
.ui-datepicker select.ui-datepicker-year { width: 49%;}
|
524 |
+
.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
|
525 |
+
.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; }
|
526 |
+
.ui-datepicker td { border: 0; padding: 1px; }
|
527 |
+
.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
|
528 |
+
.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
|
529 |
+
.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
|
530 |
+
.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
|
531 |
+
|
532 |
+
/* with multiple calendars */
|
533 |
+
.ui-datepicker.ui-datepicker-multi { width:auto; }
|
534 |
+
.ui-datepicker-multi .ui-datepicker-group { float:left; }
|
535 |
+
.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
|
536 |
+
.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
|
537 |
+
.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
|
538 |
+
.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
|
539 |
+
.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
|
540 |
+
.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
|
541 |
+
.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
|
542 |
+
.ui-datepicker-row-break { clear:both; width:100%; }
|
543 |
+
|
544 |
+
/* RTL support */
|
545 |
+
.ui-datepicker-rtl { direction: rtl; }
|
546 |
+
.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
|
547 |
+
.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
|
548 |
+
.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
|
549 |
+
.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
|
550 |
+
.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
|
551 |
+
.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
|
552 |
+
.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
|
553 |
+
.ui-datepicker-rtl .ui-datepicker-group { float:right; }
|
554 |
+
.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
|
555 |
+
.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
|
556 |
+
|
557 |
+
/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
|
558 |
+
.ui-datepicker-cover {
|
559 |
+
display: none; /*sorry for IE5*/
|
560 |
+
display/**/: block; /*sorry for IE5*/
|
561 |
+
position: absolute; /*must have*/
|
562 |
+
z-index: -1; /*must have*/
|
563 |
+
filter: mask(); /*must have*/
|
564 |
+
top: -4px; /*must have*/
|
565 |
+
left: -4px; /*must have*/
|
566 |
+
width: 200px; /*must have*/
|
567 |
+
height: 200px; /*must have*/
|
568 |
+
}/*
|
569 |
+
* jQuery UI Progressbar 1.8.13
|
570 |
+
*
|
571 |
+
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
572 |
+
* Dual licensed under the MIT or GPL Version 2 licenses.
|
573 |
+
* http://jquery.org/license
|
574 |
+
*
|
575 |
+
* http://docs.jquery.com/UI/Progressbar#theming
|
576 |
+
*/
|
577 |
+
.ui-progressbar { height:2em; text-align: left; }
|
578 |
.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
|
plugin-fw/assets/css/yit-plugin-panel-sidebar.css
CHANGED
@@ -1,388 +1,388 @@
|
|
1 |
-
/*
|
2 |
-
* This file belongs to the YIT Plugin Framework.
|
3 |
-
*
|
4 |
-
* This source file is subject to the GNU GENERAL PUBLIC LICENSE (GPL 3.0)
|
5 |
-
* that is bundled with this package in the file LICENSE.txt.
|
6 |
-
* It is also available through the world-wide-web at this URL:
|
7 |
-
* http://www.gnu.org/licenses/gpl-3.0.txt
|
8 |
-
*/
|
9 |
-
|
10 |
-
/* === Panel Sidebar === */
|
11 |
-
#yit-panel-sidebar {
|
12 |
-
width : 275px;
|
13 |
-
float : right;
|
14 |
-
margin : 10px 0 0 10px;
|
15 |
-
}
|
16 |
-
|
17 |
-
#yit-panel-sidebar.yith-panel-sidebar-hidden {
|
18 |
-
position : absolute;
|
19 |
-
top : 0;
|
20 |
-
right : 0;
|
21 |
-
}
|
22 |
-
|
23 |
-
#yit-panel-sidebar.yith-panel-sidebar-hidden #yit-panel-sidebar-widgets-container {
|
24 |
-
display : none;
|
25 |
-
}
|
26 |
-
|
27 |
-
.yit-panel-sidebar-widget-wrapper {
|
28 |
-
position : relative;
|
29 |
-
margin : 10px 0 30px 0;
|
30 |
-
}
|
31 |
-
|
32 |
-
.yit-panel-sidebar-widget-container {
|
33 |
-
border-radius : 5px;
|
34 |
-
border : 1px solid #ddd;
|
35 |
-
background : #fff;
|
36 |
-
box-shadow : 0 2px 1px -1px #ccc;
|
37 |
-
overflow : hidden;
|
38 |
-
}
|
39 |
-
|
40 |
-
.yit-panel-sidebar-widget-container a {
|
41 |
-
text-decoration : none;
|
42 |
-
}
|
43 |
-
|
44 |
-
.yit-panel-sidebar-widget-container img.yit-panel-sidebar-widget-image {
|
45 |
-
width : 100%;
|
46 |
-
position : relative;
|
47 |
-
bottom : -5px;
|
48 |
-
}
|
49 |
-
|
50 |
-
.yit-panel-sidebar-widget-title {
|
51 |
-
padding : 12px 10px;
|
52 |
-
background : #f4f4f4;
|
53 |
-
font-size : 10px;
|
54 |
-
text-transform : uppercase;
|
55 |
-
font-weight : 700;
|
56 |
-
}
|
57 |
-
|
58 |
-
.yit-panel-sidebar-widget-title.dashicons {
|
59 |
-
width : auto !important;
|
60 |
-
height : auto !important;
|
61 |
-
display : block;
|
62 |
-
font-family : "Open Sans", sans-serif;
|
63 |
-
text-align : left;
|
64 |
-
}
|
65 |
-
|
66 |
-
.yit-panel-sidebar-widget-title.dashicons::before {
|
67 |
-
font-family : "Dashicons";
|
68 |
-
font-size : 18px;
|
69 |
-
display : inline-block;
|
70 |
-
vertical-align : middle;
|
71 |
-
margin-right : 10px;
|
72 |
-
font-weight : normal;
|
73 |
-
}
|
74 |
-
|
75 |
-
.yit-panel-sidebar-widget-title.orange {
|
76 |
-
background : #ff643e;
|
77 |
-
color : #fff;
|
78 |
-
}
|
79 |
-
|
80 |
-
.yit-panel-sidebar-widget-title.green {
|
81 |
-
background : #a3c401;
|
82 |
-
color : #fff;
|
83 |
-
}
|
84 |
-
|
85 |
-
.yit-panel-sidebar-widget-title.red {
|
86 |
-
background : #e4313c;
|
87 |
-
color : #fff;
|
88 |
-
}
|
89 |
-
|
90 |
-
.yit-panel-sidebar-widget-title.yellow {
|
91 |
-
background : #ffc400;
|
92 |
-
color : #333;
|
93 |
-
}
|
94 |
-
|
95 |
-
.yit-panel-sidebar-widget-title.center {
|
96 |
-
text-align : center;
|
97 |
-
}
|
98 |
-
|
99 |
-
.yit-panel-sidebar-widget-title.right {
|
100 |
-
text-align : right;
|
101 |
-
}
|
102 |
-
|
103 |
-
.yit-panel-sidebar-widget-content {
|
104 |
-
padding : 15px;
|
105 |
-
}
|
106 |
-
|
107 |
-
.yit-panel-sidebar-widget-content p {
|
108 |
-
font-size : 11px;
|
109 |
-
line-height : 18px;
|
110 |
-
margin : 0;
|
111 |
-
text-align : justify;
|
112 |
-
}
|
113 |
-
|
114 |
-
.yit-panel-sidebar-widget-badge.gift-tape {
|
115 |
-
color : #000;
|
116 |
-
font-family : "Open Sans", sans-serif;
|
117 |
-
box-sizing : border-box;
|
118 |
-
position : absolute;
|
119 |
-
background-color : transparent;
|
120 |
-
width : 70px;
|
121 |
-
height : 70px;
|
122 |
-
overflow : hidden;
|
123 |
-
top : 0;
|
124 |
-
right : 0;
|
125 |
-
}
|
126 |
-
|
127 |
-
.yit-panel-sidebar-widget-badge.gift-tape div.yit-panel-sidebar-widget-badge-text {
|
128 |
-
background : #ffd600;
|
129 |
-
background : -webkit-linear-gradient(left, #fe8502, #ffe400); /* For Safari 5.1 to 6.0 */
|
130 |
-
background : -o-linear-gradient(right, #fe8502, #ffe400); /* For Opera 11.1 to 12.0 */
|
131 |
-
background : -moz-linear-gradient(right, #fe8502, #ffe400); /* For Firefox 3.6 to 15 */
|
132 |
-
background : linear-gradient(to right, #fe8502, #ffe400); /* Standard syntax */
|
133 |
-
font-size : 10px;
|
134 |
-
font-weight : bold;
|
135 |
-
line-height : 24px;
|
136 |
-
position : absolute;
|
137 |
-
text-align : center;
|
138 |
-
z-index : 100;
|
139 |
-
-webkit-transform : rotate(45deg);
|
140 |
-
-ms-transform : rotate(45deg);
|
141 |
-
transform : rotate(45deg);
|
142 |
-
top : 15px;
|
143 |
-
left : -6px;
|
144 |
-
width : 100px;
|
145 |
-
text-shadow : 1px 1px 1px #fff;
|
146 |
-
}
|
147 |
-
|
148 |
-
img.yit-panel-sidebar-widget-despacho-image {
|
149 |
-
background : #ffffff;
|
150 |
-
background : -webkit-linear-gradient(#ffffff, #a5b7c5); /* For Safari 5.1 to 6.0 */
|
151 |
-
background : -o-linear-gradient(#ffffff, #a5b7c5); /* For Opera 11.1 to 12.0 */
|
152 |
-
background : -moz-linear-gradient(#ffffff, #a5b7c5); /* For Firefox 3.6 to 15 */
|
153 |
-
background : linear-gradient(#ffffff, #a5b7c5); /* Standard syntax */
|
154 |
-
}
|
155 |
-
|
156 |
-
/* ==== Buttons ==== */
|
157 |
-
#yit-panel-sidebar .button {
|
158 |
-
color : #ffffff;
|
159 |
-
border : none;
|
160 |
-
background : #666666;
|
161 |
-
-webkit-box-shadow : none;
|
162 |
-
box-shadow : none;
|
163 |
-
vertical-align : middle;
|
164 |
-
text-transform : uppercase;
|
165 |
-
font-size : 11px;
|
166 |
-
font-weight : 700;
|
167 |
-
height : 32px;
|
168 |
-
line-height : 32px;
|
169 |
-
padding : 0 18px 1px;
|
170 |
-
}
|
171 |
-
|
172 |
-
#yit-panel-sidebar .button.orange {
|
173 |
-
background : #ff6340;
|
174 |
-
}
|
175 |
-
|
176 |
-
#yit-panel-sidebar .button.green {
|
177 |
-
background : #a3c401;
|
178 |
-
}
|
179 |
-
|
180 |
-
#yit-panel-sidebar .button.red {
|
181 |
-
background : #e4313c;
|
182 |
-
}
|
183 |
-
|
184 |
-
#yit-panel-sidebar .button.yellow {
|
185 |
-
background : #ffc400;
|
186 |
-
}
|
187 |
-
|
188 |
-
/* === Title Icons === */
|
189 |
-
#yit-panel-sidebar .yit-panel-sidebar-widget-icon:before {
|
190 |
-
content : " ";
|
191 |
-
width : 16px;
|
192 |
-
height : 16px;
|
193 |
-
display : inline-block;
|
194 |
-
vertical-align : middle;
|
195 |
-
margin-right : 10px;
|
196 |
-
}
|
197 |
-
|
198 |
-
#yit-panel-sidebar .yit-panel-sidebar-widget-icon.link-icon:before {
|
199 |
-
background : transparent url('../images/widgets/link-icon.png') no-repeat;
|
200 |
-
background-size : contain;
|
201 |
-
}
|
202 |
-
|
203 |
-
#yit-panel-sidebar .yit-panel-sidebar-widget-icon.info-icon:before {
|
204 |
-
background : transparent url('../images/widgets/info-icon.png') no-repeat;
|
205 |
-
background-size : contain;
|
206 |
-
}
|
207 |
-
|
208 |
-
#yit-panel-sidebar .yit-panel-sidebar-widget-icon.box-icon:before {
|
209 |
-
background : transparent url('../images/widgets/box-icon.png') no-repeat;
|
210 |
-
background-size : contain;
|
211 |
-
}
|
212 |
-
|
213 |
-
#yit-panel-sidebar .yit-panel-sidebar-widget-icon.box-white-icon:before {
|
214 |
-
background : transparent url('../images/widgets/box-white-icon.png') no-repeat;
|
215 |
-
background-size : contain;
|
216 |
-
}
|
217 |
-
|
218 |
-
/* ==== Membership Widget ==== */
|
219 |
-
#yit-panel-sidebar-membership-widget {
|
220 |
-
|
221 |
-
}
|
222 |
-
|
223 |
-
#yit-panel-sidebar-membership-widget .yit-panel-sidebar-widget-title {
|
224 |
-
text-align : center;
|
225 |
-
}
|
226 |
-
|
227 |
-
#yit-panel-sidebar-membership-widget .yit-panel-sidebar-widget-content {
|
228 |
-
background : transparent url('../images/widgets/membership-bg.png') no-repeat;
|
229 |
-
background-position : 105% 160%;
|
230 |
-
background-size : 50%;
|
231 |
-
}
|
232 |
-
|
233 |
-
#yit-panel-sidebar-membership-widget .membership-row {
|
234 |
-
margin-bottom: 20px;
|
235 |
-
clear : both;
|
236 |
-
overflow: hidden;
|
237 |
-
}
|
238 |
-
|
239 |
-
#yit-panel-sidebar-membership-widget .membership-total-price {
|
240 |
-
font-size : 25px;
|
241 |
-
font-weight : 700;
|
242 |
-
display : block;
|
243 |
-
width : 50%;
|
244 |
-
box-sizing : border-box;
|
245 |
-
float : left;
|
246 |
-
line-height : 37px;
|
247 |
-
|
248 |
-
}
|
249 |
-
|
250 |
-
#yit-panel-sidebar-membership-widget .membership-offer-text {
|
251 |
-
display : block;
|
252 |
-
font-size : 10px;
|
253 |
-
text-transform : uppercase;
|
254 |
-
width : 50%;
|
255 |
-
line-height : 14px;
|
256 |
-
box-sizing : border-box;
|
257 |
-
float : left;
|
258 |
-
}
|
259 |
-
|
260 |
-
#yit-panel-sidebar-membership-widget .membership-offer-text2 {
|
261 |
-
display : block;
|
262 |
-
font-size : 10px;
|
263 |
-
text-transform : uppercase;
|
264 |
-
text-align : right;
|
265 |
-
vertical-align : middle;
|
266 |
-
float : left;
|
267 |
-
}
|
268 |
-
|
269 |
-
#yit-panel-sidebar-membership-widget .membership-offer-sale-text {
|
270 |
-
display : block;
|
271 |
-
font-size : 22px;
|
272 |
-
color : #ff6340;
|
273 |
-
text-transform : uppercase;
|
274 |
-
text-align : left;
|
275 |
-
vertical-align : middle;
|
276 |
-
margin-left : 6px;
|
277 |
-
font-weight : 600;
|
278 |
-
float : left;
|
279 |
-
}
|
280 |
-
|
281 |
-
#yit-panel-sidebar-membership-widget .membership-buttons {
|
282 |
-
text-align : center;
|
283 |
-
margin-bottom : 10px;
|
284 |
-
}
|
285 |
-
|
286 |
-
/* ==== Important Links Widget ==== */
|
287 |
-
#yit-panel-sidebar-links-widget .yit-panel-sidebar-widget-content {
|
288 |
-
background : transparent url('../images/widgets/link-bg.png') no-repeat;
|
289 |
-
background-position : 110% 120%;
|
290 |
-
background-size : 50%;
|
291 |
-
}
|
292 |
-
|
293 |
-
ul.yit-panel-sidebar-links-list {
|
294 |
-
margin : 0;
|
295 |
-
}
|
296 |
-
|
297 |
-
ul.yit-panel-sidebar-links-list li {
|
298 |
-
margin : 0 0 10px 0;
|
299 |
-
}
|
300 |
-
|
301 |
-
ul.yit-panel-sidebar-links-list li:before {
|
302 |
-
content : " ";
|
303 |
-
width : 15px;
|
304 |
-
height : 13px;
|
305 |
-
display : inline-block;
|
306 |
-
background : transparent url('../images/ui-icons_454545_256x240.png') no-repeat -64px -144px;
|
307 |
-
margin-right : 7px;
|
308 |
-
}
|
309 |
-
|
310 |
-
/* === Sidebar Actions ===*/
|
311 |
-
#yit-panel-sidebar-actions {
|
312 |
-
text-align : right;
|
313 |
-
}
|
314 |
-
|
315 |
-
.yit-panel-sidebar-action-title {
|
316 |
-
margin-right : 5px;
|
317 |
-
text-transform : uppercase;
|
318 |
-
font-size : 11px;
|
319 |
-
}
|
320 |
-
|
321 |
-
#yit-panel-sidebar-action-hide {
|
322 |
-
text-align : right;
|
323 |
-
cursor : pointer;
|
324 |
-
}
|
325 |
-
|
326 |
-
.yit-panel-sidebar-action-hide-icon {
|
327 |
-
color : #f4f4f4;
|
328 |
-
background : #565656;
|
329 |
-
border-radius : 50%;
|
330 |
-
}
|
331 |
-
|
332 |
-
#yit-panel-sidebar-action-hide:hover .yit-panel-sidebar-action-title {
|
333 |
-
color : #000;
|
334 |
-
}
|
335 |
-
|
336 |
-
#yit-panel-sidebar-action-hide:hover .yit-panel-sidebar-action-hide-icon {
|
337 |
-
background : #000;
|
338 |
-
}
|
339 |
-
|
340 |
-
.hide-on-click .yit-panel-sidebar-action-hide-icon:before {
|
341 |
-
content : "\f139" !important;
|
342 |
-
}
|
343 |
-
|
344 |
-
/* === Responsive === */
|
345 |
-
|
346 |
-
@media (min-width : 767px) {
|
347 |
-
#wpbody-content #yit-panel-sidebar {
|
348 |
-
margin-right : 15px;
|
349 |
-
}
|
350 |
-
}
|
351 |
-
|
352 |
-
@media (max-width : 767px) {
|
353 |
-
#yit-panel-sidebar {
|
354 |
-
width : 275px;
|
355 |
-
margin : 20px auto 0 auto;
|
356 |
-
float : none;
|
357 |
-
display : block;
|
358 |
-
}
|
359 |
-
|
360 |
-
#yit-panel-sidebar.yith-panel-sidebar-hidden {
|
361 |
-
position : static;
|
362 |
-
}
|
363 |
-
|
364 |
-
#yit-panel-sidebar-actions {
|
365 |
-
text-align : center;
|
366 |
-
}
|
367 |
-
|
368 |
-
#yit-panel-sidebar-action-hide {
|
369 |
-
text-align : center;
|
370 |
-
}
|
371 |
-
}
|
372 |
-
|
373 |
-
@media (max-width : 480px) {
|
374 |
-
|
375 |
-
}
|
376 |
-
|
377 |
-
@media (min-width : 768px) and (max-width : 992px) {
|
378 |
-
}
|
379 |
-
|
380 |
-
@media (min-width : 980px) and (max-width : 1199px) {
|
381 |
-
}
|
382 |
-
|
383 |
-
@media (min-width : 1200px) {
|
384 |
-
|
385 |
-
}
|
386 |
-
|
387 |
-
@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) {
|
388 |
}
|
1 |
+
/*
|
2 |
+
* This file belongs to the YIT Plugin Framework.
|
3 |
+
*
|
4 |
+
* This source file is subject to the GNU GENERAL PUBLIC LICENSE (GPL 3.0)
|
5 |
+
* that is bundled with this package in the file LICENSE.txt.
|
6 |
+
* It is also available through the world-wide-web at this URL:
|
7 |
+
* http://www.gnu.org/licenses/gpl-3.0.txt
|
8 |
+
*/
|
9 |
+
|
10 |
+
/* === Panel Sidebar === */
|
11 |
+
#yit-panel-sidebar {
|
12 |
+
width : 275px;
|
13 |
+
float : right;
|
14 |
+
margin : 10px 0 0 10px;
|
15 |
+
}
|
16 |
+
|
17 |
+
#yit-panel-sidebar.yith-panel-sidebar-hidden {
|
18 |
+
position : absolute;
|
19 |
+
top : 0;
|
20 |
+
right : 0;
|
21 |
+
}
|
22 |
+
|
23 |
+
#yit-panel-sidebar.yith-panel-sidebar-hidden #yit-panel-sidebar-widgets-container {
|
24 |
+
display : none;
|
25 |
+
}
|
26 |
+
|
27 |
+
.yit-panel-sidebar-widget-wrapper {
|
28 |
+
position : relative;
|
29 |
+
margin : 10px 0 30px 0;
|
30 |
+
}
|
31 |
+
|
32 |
+
.yit-panel-sidebar-widget-container {
|
33 |
+
border-radius : 5px;
|
34 |
+
border : 1px solid #ddd;
|
35 |
+
background : #fff;
|
36 |
+
box-shadow : 0 2px 1px -1px #ccc;
|
37 |
+
overflow : hidden;
|
38 |
+
}
|
39 |
+
|
40 |
+
.yit-panel-sidebar-widget-container a {
|
41 |
+
text-decoration : none;
|
42 |
+
}
|
43 |
+
|
44 |
+
.yit-panel-sidebar-widget-container img.yit-panel-sidebar-widget-image {
|
45 |
+
width : 100%;
|
46 |
+
position : relative;
|
47 |
+
bottom : -5px;
|
48 |
+
}
|
49 |
+
|
50 |
+
.yit-panel-sidebar-widget-title {
|
51 |
+
padding : 12px 10px;
|
52 |
+
background : #f4f4f4;
|
53 |
+
font-size : 10px;
|
54 |
+
text-transform : uppercase;
|
55 |
+
font-weight : 700;
|
56 |
+
}
|
57 |
+
|
58 |
+
.yit-panel-sidebar-widget-title.dashicons {
|
59 |
+
width : auto !important;
|
60 |
+
height : auto !important;
|
61 |
+
display : block;
|
62 |
+
font-family : "Open Sans", sans-serif;
|
63 |
+
text-align : left;
|
64 |
+
}
|
65 |
+
|
66 |
+
.yit-panel-sidebar-widget-title.dashicons::before {
|
67 |
+
font-family : "Dashicons";
|
68 |
+
font-size : 18px;
|
69 |
+
display : inline-block;
|
70 |
+
vertical-align : middle;
|
71 |
+
margin-right : 10px;
|
72 |
+
font-weight : normal;
|
73 |
+
}
|
74 |
+
|
75 |
+
.yit-panel-sidebar-widget-title.orange {
|
76 |
+
background : #ff643e;
|
77 |
+
color : #fff;
|
78 |
+
}
|
79 |
+
|
80 |
+
.yit-panel-sidebar-widget-title.green {
|
81 |
+
background : #a3c401;
|
82 |
+
color : #fff;
|
83 |
+
}
|
84 |
+
|
85 |
+
.yit-panel-sidebar-widget-title.red {
|
86 |
+
background : #e4313c;
|
87 |
+
color : #fff;
|
88 |
+
}
|
89 |
+
|
90 |
+
.yit-panel-sidebar-widget-title.yellow {
|
91 |
+
background : #ffc400;
|
92 |
+
color : #333;
|
93 |
+
}
|
94 |
+
|
95 |
+
.yit-panel-sidebar-widget-title.center {
|
96 |
+
text-align : center;
|
97 |
+
}
|
98 |
+
|
99 |
+
.yit-panel-sidebar-widget-title.right {
|
100 |
+
text-align : right;
|
101 |
+
}
|
102 |
+
|
103 |
+
.yit-panel-sidebar-widget-content {
|
104 |
+
padding : 15px;
|
105 |
+
}
|
106 |
+
|
107 |
+
.yit-panel-sidebar-widget-content p {
|
108 |
+
font-size : 11px;
|
109 |
+
line-height : 18px;
|
110 |
+
margin : 0;
|
111 |
+
text-align : justify;
|
112 |
+
}
|
113 |
+
|
114 |
+
.yit-panel-sidebar-widget-badge.gift-tape {
|
115 |
+
color : #000;
|
116 |
+
font-family : "Open Sans", sans-serif;
|
117 |
+
box-sizing : border-box;
|
118 |
+
position : absolute;
|
119 |
+
background-color : transparent;
|
120 |
+
width : 70px;
|
121 |
+
height : 70px;
|
122 |
+
overflow : hidden;
|
123 |
+
top : 0;
|
124 |
+
right : 0;
|
125 |
+
}
|
126 |
+
|
127 |
+
.yit-panel-sidebar-widget-badge.gift-tape div.yit-panel-sidebar-widget-badge-text {
|
128 |
+
background : #ffd600;
|
129 |
+
background : -webkit-linear-gradient(left, #fe8502, #ffe400); /* For Safari 5.1 to 6.0 */
|
130 |
+
background : -o-linear-gradient(right, #fe8502, #ffe400); /* For Opera 11.1 to 12.0 */
|
131 |
+
background : -moz-linear-gradient(right, #fe8502, #ffe400); /* For Firefox 3.6 to 15 */
|
132 |
+
background : linear-gradient(to right, #fe8502, #ffe400); /* Standard syntax */
|
133 |
+
font-size : 10px;
|
134 |
+
font-weight : bold;
|
135 |
+
line-height : 24px;
|
136 |
+
position : absolute;
|
137 |
+
text-align : center;
|
138 |
+
z-index : 100;
|
139 |
+
-webkit-transform : rotate(45deg);
|
140 |
+
-ms-transform : rotate(45deg);
|
141 |
+
transform : rotate(45deg);
|
142 |
+
top : 15px;
|
143 |
+
left : -6px;
|
144 |
+
width : 100px;
|
145 |
+
text-shadow : 1px 1px 1px #fff;
|
146 |
+
}
|
147 |
+
|
148 |
+
img.yit-panel-sidebar-widget-despacho-image {
|
149 |
+
background : #ffffff;
|
150 |
+
background : -webkit-linear-gradient(#ffffff, #a5b7c5); /* For Safari 5.1 to 6.0 */
|
151 |
+
background : -o-linear-gradient(#ffffff, #a5b7c5); /* For Opera 11.1 to 12.0 */
|
152 |
+
background : -moz-linear-gradient(#ffffff, #a5b7c5); /* For Firefox 3.6 to 15 */
|
153 |
+
background : linear-gradient(#ffffff, #a5b7c5); /* Standard syntax */
|
154 |
+
}
|
155 |
+
|
156 |
+
/* ==== Buttons ==== */
|
157 |
+
#yit-panel-sidebar .button {
|
158 |
+
color : #ffffff;
|
159 |
+
border : none;
|
160 |
+
background : #666666;
|
161 |
+
-webkit-box-shadow : none;
|
162 |
+
box-shadow : none;
|
163 |
+
vertical-align : middle;
|
164 |
+
text-transform : uppercase;
|
165 |
+
font-size : 11px;
|
166 |
+
font-weight : 700;
|
167 |
+
height : 32px;
|
168 |
+
line-height : 32px;
|
169 |
+
padding : 0 18px 1px;
|
170 |
+
}
|
171 |
+
|
172 |
+
#yit-panel-sidebar .button.orange {
|
173 |
+
background : #ff6340;
|
174 |
+
}
|
175 |
+
|
176 |
+
#yit-panel-sidebar .button.green {
|
177 |
+
background : #a3c401;
|
178 |
+
}
|
179 |
+
|
180 |
+
#yit-panel-sidebar .button.red {
|
181 |
+
background : #e4313c;
|
182 |
+
}
|
183 |
+
|
184 |
+
#yit-panel-sidebar .button.yellow {
|
185 |
+
background : #ffc400;
|
186 |
+
}
|
187 |
+
|
188 |
+
/* === Title Icons === */
|
189 |
+
#yit-panel-sidebar .yit-panel-sidebar-widget-icon:before {
|
190 |
+
content : " ";
|
191 |
+
width : 16px;
|
192 |
+
height : 16px;
|
193 |
+
display : inline-block;
|
194 |
+
vertical-align : middle;
|
195 |
+
margin-right : 10px;
|
196 |
+
}
|
197 |
+
|
198 |
+
#yit-panel-sidebar .yit-panel-sidebar-widget-icon.link-icon:before {
|
199 |
+
background : transparent url('../images/widgets/link-icon.png') no-repeat;
|
200 |
+
background-size : contain;
|
201 |
+
}
|
202 |
+
|
203 |
+
#yit-panel-sidebar .yit-panel-sidebar-widget-icon.info-icon:before {
|
204 |
+
background : transparent url('../images/widgets/info-icon.png') no-repeat;
|
205 |
+
background-size : contain;
|
206 |
+
}
|
207 |
+
|
208 |
+
#yit-panel-sidebar .yit-panel-sidebar-widget-icon.box-icon:before {
|
209 |
+
background : transparent url('../images/widgets/box-icon.png') no-repeat;
|
210 |
+
background-size : contain;
|
211 |
+
}
|
212 |
+
|
213 |
+
#yit-panel-sidebar .yit-panel-sidebar-widget-icon.box-white-icon:before {
|
214 |
+
background : transparent url('../images/widgets/box-white-icon.png') no-repeat;
|
215 |
+
background-size : contain;
|
216 |
+
}
|
217 |
+
|
218 |
+
/* ==== Membership Widget ==== */
|
219 |
+
#yit-panel-sidebar-membership-widget {
|
220 |
+
|
221 |
+
}
|
222 |
+
|
223 |
+
#yit-panel-sidebar-membership-widget .yit-panel-sidebar-widget-title {
|
224 |
+
text-align : center;
|
225 |
+
}
|
226 |
+
|
227 |
+
#yit-panel-sidebar-membership-widget .yit-panel-sidebar-widget-content {
|
228 |
+
background : transparent url('../images/widgets/membership-bg.png') no-repeat;
|
229 |
+
background-position : 105% 160%;
|
230 |
+
background-size : 50%;
|
231 |
+
}
|
232 |
+
|
233 |
+
#yit-panel-sidebar-membership-widget .membership-row {
|
234 |
+
margin-bottom: 20px;
|
235 |
+
clear : both;
|
236 |
+
overflow: hidden;
|
237 |
+
}
|
238 |
+
|
239 |
+
#yit-panel-sidebar-membership-widget .membership-total-price {
|
240 |
+
font-size : 25px;
|
241 |
+
font-weight : 700;
|
242 |
+
display : block;
|
243 |
+
width : 50%;
|
244 |
+
box-sizing : border-box;
|
245 |
+
float : left;
|
246 |
+
line-height : 37px;
|
247 |
+
|
248 |
+
}
|
249 |
+
|
250 |
+
#yit-panel-sidebar-membership-widget .membership-offer-text {
|
251 |
+
display : block;
|
252 |
+
font-size : 10px;
|
253 |
+
text-transform : uppercase;
|
254 |
+
width : 50%;
|
255 |
+
line-height : 14px;
|
256 |
+
box-sizing : border-box;
|
257 |
+
float : left;
|
258 |
+
}
|
259 |
+
|
260 |
+
#yit-panel-sidebar-membership-widget .membership-offer-text2 {
|
261 |
+
display : block;
|
262 |
+
font-size : 10px;
|
263 |
+
text-transform : uppercase;
|
264 |
+
text-align : right;
|
265 |
+
vertical-align : middle;
|
266 |
+
float : left;
|
267 |
+
}
|
268 |
+
|
269 |
+
#yit-panel-sidebar-membership-widget .membership-offer-sale-text {
|
270 |
+
display : block;
|
271 |
+
font-size : 22px;
|
272 |
+
color : #ff6340;
|
273 |
+
text-transform : uppercase;
|
274 |
+
text-align : left;
|
275 |
+
vertical-align : middle;
|
276 |
+
margin-left : 6px;
|
277 |
+
font-weight : 600;
|
278 |
+
float : left;
|
279 |
+
}
|
280 |
+
|
281 |
+
#yit-panel-sidebar-membership-widget .membership-buttons {
|
282 |
+
text-align : center;
|
283 |
+
margin-bottom : 10px;
|
284 |
+
}
|
285 |
+
|
286 |
+
/* ==== Important Links Widget ==== */
|
287 |
+
#yit-panel-sidebar-links-widget .yit-panel-sidebar-widget-content {
|
288 |
+
background : transparent url('../images/widgets/link-bg.png') no-repeat;
|
289 |
+
background-position : 110% 120%;
|
290 |
+
background-size : 50%;
|
291 |
+
}
|
292 |
+
|
293 |
+
ul.yit-panel-sidebar-links-list {
|
294 |
+
margin : 0;
|
295 |
+
}
|
296 |
+
|
297 |
+
ul.yit-panel-sidebar-links-list li {
|
298 |
+
margin : 0 0 10px 0;
|
299 |
+
}
|
300 |
+
|
301 |
+
ul.yit-panel-sidebar-links-list li:before {
|
302 |
+
content : " ";
|
303 |
+
width : 15px;
|
304 |
+
height : 13px;
|
305 |
+
display : inline-block;
|
306 |
+
background : transparent url('../images/ui-icons_454545_256x240.png') no-repeat -64px -144px;
|
307 |
+
margin-right : 7px;
|
308 |
+
}
|
309 |
+
|
310 |
+
/* === Sidebar Actions ===*/
|
311 |
+
#yit-panel-sidebar-actions {
|
312 |
+
text-align : right;
|
313 |
+
}
|
314 |
+
|
315 |
+
.yit-panel-sidebar-action-title {
|
316 |
+
margin-right : 5px;
|
317 |
+
text-transform : uppercase;
|
318 |
+
font-size : 11px;
|
319 |
+
}
|
320 |
+
|
321 |
+
#yit-panel-sidebar-action-hide {
|
322 |
+
text-align : right;
|
323 |
+
cursor : pointer;
|
324 |
+
}
|
325 |
+
|
326 |
+
.yit-panel-sidebar-action-hide-icon {
|
327 |
+
color : #f4f4f4;
|
328 |
+
background : #565656;
|
329 |
+
border-radius : 50%;
|
330 |
+
}
|
331 |
+
|
332 |
+
#yit-panel-sidebar-action-hide:hover .yit-panel-sidebar-action-title {
|
333 |
+
color : #000;
|
334 |
+
}
|
335 |
+
|
336 |
+
#yit-panel-sidebar-action-hide:hover .yit-panel-sidebar-action-hide-icon {
|
337 |
+
background : #000;
|
338 |
+
}
|
339 |
+
|
340 |
+
.hide-on-click .yit-panel-sidebar-action-hide-icon:before {
|
341 |
+
content : "\f139" !important;
|
342 |
+
}
|
343 |
+
|
344 |
+
/* === Responsive === */
|
345 |
+
|
346 |
+
@media (min-width : 767px) {
|
347 |
+
#wpbody-content #yit-panel-sidebar {
|
348 |
+
margin-right : 15px;
|
349 |
+
}
|
350 |
+
}
|
351 |
+
|
352 |
+
@media (max-width : 767px) {
|
353 |
+
#yit-panel-sidebar {
|
354 |
+
width : 275px;
|
355 |
+
margin : 20px auto 0 auto;
|
356 |
+
float : none;
|
357 |
+
display : block;
|
358 |
+
}
|
359 |
+
|
360 |
+
#yit-panel-sidebar.yith-panel-sidebar-hidden {
|
361 |
+
position : static;
|
362 |
+
}
|
363 |
+
|
364 |
+
#yit-panel-sidebar-actions {
|
365 |
+
text-align : center;
|
366 |
+
}
|
367 |
+
|
368 |
+
#yit-panel-sidebar-action-hide {
|
369 |
+
text-align : center;
|
370 |
+
}
|
371 |
+
}
|
372 |
+
|
373 |
+
@media (max-width : 480px) {
|
374 |
+
|
375 |
+
}
|
376 |
+
|
377 |
+
@media (min-width : 768px) and (max-width : 992px) {
|
378 |
+
}
|
379 |
+
|
380 |
+
@media (min-width : 980px) and (max-width : 1199px) {
|
381 |
+
}
|
382 |
+
|
383 |
+
@media (min-width : 1200px) {
|
384 |
+
|
385 |
+
}
|
386 |
+
|
387 |
+
@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) {
|
388 |
}
|
plugin-fw/assets/css/yit-plugin-panel.css
CHANGED
@@ -1,713 +1,713 @@
|
|
1 |
-
/*
|
2 |
-
* This file belongs to the YIT Plugin Framework.
|
3 |
-
*
|
4 |
-
* This source file is subject to the GNU GENERAL PUBLIC LICENSE (GPL 3.0)
|
5 |
-
* that is bundled with this package in the file LICENSE.txt.
|
6 |
-
* It is also available through the world-wide-web at this URL:
|
7 |
-
* http://www.gnu.org/licenses/gpl-3.0.txt
|
8 |
-
*/
|
9 |
-
|
10 |
-
/* onoff */
|
11 |
-
.rm_onoff input {
|
12 |
-
display : none;
|
13 |
-
}
|
14 |
-
|
15 |
-
.rm_onoff input + span {
|
16 |
-
cursor : pointer;
|
17 |
-
text-indent : -9999px;
|
18 |
-
display : block;
|
19 |
-
width : 85px;
|
20 |
-
height : 37px;
|
21 |
-
background : transparent url(../images/off.png);
|
22 |
-
}
|
23 |
-
|
24 |
-
.rm_onoff input:checked + span {
|
25 |
-
background : transparent url(../images/on.png);
|
26 |
-
}
|
27 |
-
|
28 |
-
.rm_onoff input.onoffchecked + span {
|
29 |
-
background : transparent url(../images/on.png);
|
30 |
-
}
|
31 |
-
|
32 |
-
/* slider */
|
33 |
-
/*numbers*/
|
34 |
-
.ui-slider .maxCaption, .ui-slider .minCaption {
|
35 |
-
margin-bottom : 5px;
|
36 |
-
}
|
37 |
-
|
38 |
-
.ui-slider .feedback {
|
39 |
-
background : url(../images/slider/tooltip.png) no-repeat center top;
|
40 |
-
position : absolute;
|
41 |
-
top : -25px;
|
42 |
-
width : 35px;
|
43 |
-
height : 43px;
|
44 |
-
text-align : center;
|
45 |
-
width : 100%;
|
46 |
-
display : block;
|
47 |
-
}
|
48 |
-
|
49 |
-
.ui-slider .feedback strong {
|
50 |
-
display : inline-block;
|
51 |
-
padding-top : 4px;
|
52 |
-
top : -30px;
|
53 |
-
}
|
54 |
-
|
55 |
-
/*handle*/
|
56 |
-
.yit-options .ui-slider-horizontal .ui-slider-handle,
|
57 |
-
.yit_options .ui-slider-horizontal .ui-slider-handle {
|
58 |
-
background : transparent url(../images/slider/handle.png) no-repeat left top !important;
|
59 |
-
border : 0px !important;
|
60 |
-
top : -.35em !important;
|
61 |
-
width : 18px !important;
|
62 |
-
height : 19px !important;
|
63 |
-
}
|
64 |
-
|
65 |
-
/*bg on the left:grey*/
|
66 |
-
.yit-options .ui-slider.ui-widget-content,
|
67 |
-
.yit_options .ui-slider.ui-widget-content {
|
68 |
-
background : url(../images/slider/grey.gif) repeat-x left center !important;
|
69 |
-
border-color : #c1c1c0 !important;
|
70 |
-
height : 10px !important;
|
71 |
-
}
|
72 |
-
|
73 |
-
.iris-slider-offset.ui-slider.ui-widget-content {
|
74 |
-
background : transparent !important;
|
75 |
-
height : auto !important;
|
76 |
-
}
|
77 |
-
|
78 |
-
/*bg on the right:orange*/
|
79 |
-
.ui-slider.ui-widget-content .ui-widget-header {
|
80 |
-
background : url(../images/slider/orange.gif) repeat-x left center !important;
|
81 |
-
left : 2px !important;
|
82 |
-
-webkit-border-radius : 15px;
|
83 |
-
-moz-border-radius : 15px;
|
84 |
-
-khtml-border-radius : 15px;
|
85 |
-
border-radius : 15px;
|
86 |
-
}
|
87 |
-
|
88 |
-
.plugin-option tr {
|
89 |
-
border-bottom : 1px solid #ccc;
|
90 |
-
}
|
91 |
-
|
92 |
-
.plugin-option .yit_options,
|
93 |
-
.plugin-option .yit-options {
|
94 |
-
border-bottom : 0px;
|
95 |
-
}
|
96 |
-
|
97 |
-
.plugin-option .yit-options .option,
|
98 |
-
.plugin-option .yit_options .option {
|
99 |
-
width : 600px;
|
100 |
-
float : left;
|
101 |
-
}
|
102 |
-
|
103 |
-
.plugin-option .form-table td {
|
104 |
-
padding : 25px 10px;
|
105 |
-
}
|
106 |
-
|
107 |
-
.yit_options .select_wrapper,
|
108 |
-
.yit-options .select_wrapper {
|
109 |
-
background : url("../images/select.png") no-repeat scroll right center #FAFAFA;
|
110 |
-
border-color : #CCCCCC #EEEEEE #EEEEEE #CCCCCC;
|
111 |
-
border-radius : 4px 4px 4px 4px;
|
112 |
-
border-style : solid;
|
113 |
-
border-width : 1px;
|
114 |
-
color : #555555;
|
115 |
-
display : block;
|
116 |
-
float : left;
|
117 |
-
font-family : sans-serif;
|
118 |
-
font-size : 12px;
|
119 |
-
height : 26px;
|
120 |
-
margin-bottom : 9px !important;
|
121 |
-
margin-left : 0;
|
122 |
-
margin-right : 5px;
|
123 |
-
margin-top : 0;
|
124 |
-
width : 400px;
|
125 |
-
}
|
126 |
-
|
127 |
-
.chosen .select_wrapper {
|
128 |
-
background : none;
|
129 |
-
border : none;
|
130 |
-
}
|
131 |
-
|
132 |
-
.chosen .select_wrapper .chosen-container {
|
133 |
-
width : 338px !important;
|
134 |
-
}
|
135 |
-
|
136 |
-
.chosen .select_wrapper .chosen-container .search-field input {
|
137 |
-
height : 27px !important;
|
138 |
-
color : #333;
|
139 |
-
}
|
140 |
-
|
141 |
-
.chosen .select_wrapper .chosen-container .chosen-choices {
|
142 |
-
border : 1px solid #ddd;
|
143 |
-
box-shadow : none;
|
144 |
-
}
|
145 |
-
|
146 |
-
.chosen .select_wrapper .chosen-container .chosen-choices li.search-choice {
|
147 |
-
height : 15px !important;
|
148 |
-
min-width : 105px;
|
149 |
-
}
|
150 |
-
|
151 |
-
.chosen .select_wrapper .chosen-container .chosen-choices li.search-choice span {
|
152 |
-
line-height : 15px;
|
153 |
-
height : 15px;
|
154 |
-
padding-top : 2px;
|
155 |
-
}
|
156 |
-
|
157 |
-
.chosen .select_wrapper .chosen-container .chosen-choices li.search-choice a.search-choice-close {
|
158 |
-
top : 5px;
|
159 |
-
}
|
160 |
-
|
161 |
-
.chosen .select_wrapper .chosen-container .chosen-drop .chosen-search input {
|
162 |
-
width : 100% !important;
|
163 |
-
}
|
164 |
-
|
165 |
-
/* === Multiple Chosen Customizzation === */
|
166 |
-
|
167 |
-
.yith-choosen .chosen-choices {
|
168 |
-
line-height : 27px;
|
169 |
-
min-height : 27px;
|
170 |
-
border : 1px solid #ddd;
|
171 |
-
}
|
172 |
-
|
173 |
-
.yith-choosen .chosen-container-active .chosen-choices {
|
174 |
-
border : 1px solid #5b9dd9;
|
175 |
-
-webkit-box-shadow : 0 0 2px rgba(30, 140, 190, .8);
|
176 |
-
box-shadow : 0 0 2px rgba(30, 140, 190, .8);
|
177 |
-
}
|
178 |
-
|
179 |
-
.select_wrapper span {
|
180 |
-
height : 26px;
|
181 |
-
line-height : 26px;
|
182 |
-
padding-left : 6px;
|
183 |
-
position : absolute;
|
184 |
-
z-index : 2;
|
185 |
-
overflow : hidden;
|
186 |
-
}
|
187 |
-
|
188 |
-
.ie8 .yit_options select,
|
189 |
-
.ie8 .yit-options select {
|
190 |
-
height : 26px;
|
191 |
-
}
|
192 |
-
|
193 |
-
.yit_options select, .yit-options select, .the-metabox .select_wrapper select {
|
194 |
-
cursor : pointer;
|
195 |
-
height : 28px;
|
196 |
-
margin : 0;
|
197 |
-
opacity : 0;
|
198 |
-
padding : 0;
|
199 |
-
position : relative;
|
200 |
-
width : inherit;
|
201 |
-
z-index : 4;
|
202 |
-
background-color : #FAFAFA;
|
203 |
-
}
|
204 |
-
|
205 |
-
/* === Single Chosen Customizzation === */
|
206 |
-
|
207 |
-
.yith-choosen .chosen-container-single .chosen-default {
|
208 |
-
background : transparent;
|
209 |
-
border-color : #ddd;
|
210 |
-
}
|
211 |
-
|
212 |
-
.yith-choosen .chosen-search > input[type=text] {
|
213 |
-
width : 100% !important;
|
214 |
-
}
|
215 |
-
|
216 |
-
.yith-choosen .chosen-container-single .chosen-single {
|
217 |
-
background : transparent;
|
218 |
-
border-color : #ddd;
|
219 |
-
}
|
220 |
-
|
221 |
-
/* Style to woocommerce panel*/
|
222 |
-
|
223 |
-
#plugin-fw-wc {
|
224 |
-
padding-top : 20px;
|
225 |
-
}
|
226 |
-
|
227 |
-
#plugin-fw-wc table.form-table {
|
228 |
-
background-color : #fff;
|
229 |
-
margin-bottom : 20px;
|
230 |
-
}
|
231 |
-
|
232 |
-
#plugin-fw-wc table.form-table th {
|
233 |
-
padding : 20px;
|
234 |
-
}
|
235 |
-
|
236 |
-
#plugin-fw-wc h3 {
|
237 |
-
padding : 0px 10px 10px;
|
238 |
-
border-bottom : 1px solid #eee;
|
239 |
-
}
|
240 |
-
|
241 |
-
/* === VIDEO BOX === */
|
242 |
-
|
243 |
-
.yith-videobox-wrapper {
|
244 |
-
padding-top : 20px;
|
245 |
-
}
|
246 |
-
|
247 |
-
.yith-videobox-wrapper h3 {
|
248 |
-
padding : 0px 10px 10px;
|
249 |
-
border-bottom : 1px solid #eee;
|
250 |
-
}
|
251 |
-
|
252 |
-
.yith-videobox-wrapper .postbox {
|
253 |
-
display : inline-block;
|
254 |
-
}
|
255 |
-
|
256 |
-
.yith-videobox-wrapper .yith_videobox .column {
|
257 |
-
width : 45%;
|
258 |
-
float : left;
|
259 |
-
padding-right : 2.5%;
|
260 |
-
border-right : 1px solid #ebebeb;
|
261 |
-
padding-bottom : 2em;
|
262 |
-
}
|
263 |
-
|
264 |
-
.yith-videobox-wrapper .yith_videobox .column.two {
|
265 |
-
margin-right : 0;
|
266 |
-
padding-right : 0;
|
267 |
-
padding-left : 2.5%;
|
268 |
-
border : 0;
|
269 |
-
max-width : 49%;
|
270 |
-
}
|
271 |
-
|
272 |
-
.yith-videobox-wrapper .yith_videobox h2 {
|
273 |
-
font-size : 16px;
|
274 |
-
margin-bottom : 20px;
|
275 |
-
}
|
276 |
-
|
277 |
-
.yith-videobox-wrapper .yith-video-link {
|
278 |
-
width : 100%;
|
279 |
-
max-width : 200px;
|
280 |
-
float : left;
|
281 |
-
margin : 0 1.5em 1.5em 0;
|
282 |
-
}
|
283 |
-
|
284 |
-
.yith-videobox-wrapper .yith-video-link {
|
285 |
-
width : 100%;
|
286 |
-
max-width : 200px;
|
287 |
-
float : left;
|
288 |
-
margin : 0 1.5em 1.5em 0;
|
289 |
-
}
|
290 |
-
|
291 |
-
.yith-videobox-wrapper .yith-image-frame img {
|
292 |
-
max-width : 100%;
|
293 |
-
height : auto;
|
294 |
-
}
|
295 |
-
|
296 |
-
.yith-videobox-wrapper .yith-video-link img {
|
297 |
-
max-width : 100%;
|
298 |
-
height : auto;
|
299 |
-
}
|
300 |
-
|
301 |
-
.yith-videobox-wrapper .yith-video-iframe {
|
302 |
-
display : none;
|
303 |
-
|
304 |
-
}
|
305 |
-
|
306 |
-
/* === Plugins Upgrader === */
|
307 |
-
|
308 |
-
.yit-plugin-changelog-wrapper {
|
309 |
-
display : none;
|
310 |
-
}
|
311 |
-
|
312 |
-
.yit-plugin-changelog-title {
|
313 |
-
text-transform : uppercase;
|
314 |
-
}
|
315 |
-
|
316 |
-
.yit-plugin-changelog {
|
317 |
-
background : #fcfcfc;
|
318 |
-
height : 97%;
|
319 |
-
z-index : 999;
|
320 |
-
overflow : auto;
|
321 |
-
}
|
322 |
-
|
323 |
-
/* === Plugins Licence Activation === */
|
324 |
-
|
325 |
-
.yit-container.plugin-licence-activation {
|
326 |
-
font-family : 'Raleway', sans-serif;
|
327 |
-
}
|
328 |
-
|
329 |
-
.yit-container.plugin-licence-activation .to-active-wrapper {
|
330 |
-
margin-bottom : 60px;
|
331 |
-
}
|
332 |
-
|
333 |
-
.yit-container.plugin-licence-activation .to-active-wrapper form.to-active-form {
|
334 |
-
position : relative;
|
335 |
-
border-color : #e1e1e1;
|
336 |
-
border-style : solid;
|
337 |
-
border-width : 0;
|
338 |
-
}
|
339 |
-
|
340 |
-
.yit-container.plugin-licence-activation .to-active-wrapper form.to-active-form:first-child {
|
341 |
-
border-top-width : 1px;
|
342 |
-
}
|
343 |
-
|
344 |
-
.yit-container.plugin-licence-activation .to-active-wrapper form.to-active-form:last-child {
|
345 |
-
border-bottom-width : 1px;
|
346 |
-
}
|
347 |
-
|
348 |
-
.yit-container.plugin-licence-activation .to-active-wrapper table.to-active-table {
|
349 |
-
border-width : 0;
|
350 |
-
border-spacing : 0;
|
351 |
-
width : 100%;
|
352 |
-
}
|
353 |
-
|
354 |
-
.yit-container.plugin-licence-activation .message {
|
355 |
-
display : none;
|
356 |
-
line-height : normal;
|
357 |
-
background : #ffffff url(../images/licence-error.png) 15px center no-repeat;
|
358 |
-
padding-left : 65px;
|
359 |
-
padding-right : 15px;
|
360 |
-
width : 150px;
|
361 |
-
}
|
362 |
-
|
363 |
-
.yit-container.plugin-licence-activation .message-wrapper {
|
364 |
-
height : 75px;
|
365 |
-
display : none;
|
366 |
-
position : absolute;
|
367 |
-
top : 0;
|
368 |
-
right : -250px;
|
369 |
-
border : 1px solid #ff3838;
|
370 |
-
}
|
371 |
-
|
372 |
-
.yit-container.plugin-licence-activation .message-wrapper.visible {
|
373 |
-
display : table;
|
374 |
-
}
|
375 |
-
|
376 |
-
.yit-container.plugin-licence-activation .message {
|
377 |
-
display : table-cell;
|
378 |
-
vertical-align : middle;
|
379 |
-
}
|
380 |
-
|
381 |
-
.yit-container.plugin-licence-activation .arrow-left:after,
|
382 |
-
.yit-container.plugin-licence-activation .arrow-left:before {
|
383 |
-
content : "";
|
384 |
-
display : block;
|
385 |
-
width : 0;
|
386 |
-
height : 0;
|
387 |
-
position : absolute;
|
388 |
-
}
|
389 |
-
|
390 |
-
.yit-container.plugin-licence-activation .arrow-left:before {
|
391 |
-
border-top : 9px solid transparent;
|
392 |
-
border-bottom : 9px solid transparent;
|
393 |
-
border-right : 9px solid #ff3838;
|
394 |
-
top : 26px;
|
395 |
-
left : -9px;
|
396 |
-
}
|
397 |
-
|
398 |
-
.yit-container.plugin-licence-activation .arrow-left:after {
|
399 |
-
border-top : 8px solid transparent;
|
400 |
-
border-bottom : 8px solid transparent;
|
401 |
-
border-right : 8px solid #fff;
|
402 |
-
left : -8px;
|
403 |
-
top : 27px;
|
404 |
-
}
|
405 |
-
|
406 |
-
.yit-container.plugin-licence-activation h2,
|
407 |
-
.yit-container.plugin-licence-activation h3 {
|
408 |
-
text-transform : uppercase;
|
409 |
-
font-weight : 800;
|
410 |
-
margin-bottom : 30px;
|
411 |
-
}
|
412 |
-
|
413 |
-
.yit-container.plugin-licence-activation h2 {
|
414 |
-
color : #808a97;
|
415 |
-
font-size : 25px;
|
416 |
-
}
|
417 |
-
|
418 |
-
.yit-container.plugin-licence-activation h3 {
|
419 |
-
color : #313131;
|
420 |
-
font-size : 15px;
|
421 |
-
height : 20px;
|
422 |
-
}
|
423 |
-
|
424 |
-
.yit-container.plugin-licence-activation h3.to-active {
|
425 |
-
height : 20px;
|
426 |
-
position : relative;
|
427 |
-
vertical-align : top;
|
428 |
-
}
|
429 |
-
|
430 |
-
.yit-container.plugin-licence-activation .spinner.show {
|
431 |
-
display : inline-block;
|
432 |
-
vertical-align : middle;
|
433 |
-
float : none;
|
434 |
-
}
|
435 |
-
|
436 |
-
.yit-container.plugin-licence-activation h3.to-active > .spinner.show {
|
437 |
-
display : inline-block;
|
438 |
-
float : none;
|
439 |
-
top : -3px;
|
440 |
-
position : relative;
|
441 |
-
}
|
442 |
-
|
443 |
-
.yit-container.plugin-licence-activation .licence-check-section {
|
444 |
-
margin-bottom : 60px;
|
445 |
-
}
|
446 |
-
|
447 |
-
.yit-container.plugin-licence-activation span.licence-label {
|
448 |
-
font-weight : 500;
|
449 |
-
color : #606060;
|
450 |
-
margin-bottom : 30px;
|
451 |
-
}
|
452 |
-
|
453 |
-
.yit-container.plugin-licence-activation .button-licence {
|
454 |
-
border : 0;
|
455 |
-
font-size : 13px;
|
456 |
-
text-transform : uppercase;
|
457 |
-
background-color : #808a97;
|
458 |
-
color : #fff;
|
459 |
-
font-weight : 700;
|
460 |
-
border-radius : 3px;
|
461 |
-
cursor : pointer;
|
462 |
-
text-decoration : none;
|
463 |
-
padding : 5px 7px;
|
464 |
-
-webkit-transition : background-color 0.3s ease;
|
465 |
-
-moz-transition : background-color 0.3s ease;
|
466 |
-
-ms-transition : background-color 0.3s ease;
|
467 |
-
-o-transition : background-color 0.3s ease;
|
468 |
-
transition : background-color 0.3s ease;
|
469 |
-
}
|
470 |
-
|
471 |
-
.yit-container.plugin-licence-activation .button-licence:hover {
|
472 |
-
background-color : #4d5c6f;
|
473 |
-
}
|
474 |
-
|
475 |
-
.yit-container.plugin-licence-activation .button-licence.clicked {
|
476 |
-
cursor : not-allowed;
|
477 |
-
background-color : #e2e2e2 !important;
|
478 |
-
}
|
479 |
-
|
480 |
-
.yit-container.plugin-licence-activation .button-licence.licence-check {
|
481 |
-
font-weight : 400;
|
482 |
-
padding : 12px 19px;
|
483 |
-
}
|
484 |
-
|
485 |
-
.yit-container.plugin-licence-activation .button-licence.licence-renew {
|
486 |
-
text-decoration : none;
|
487 |
-
padding : 7px 12px;
|
488 |
-
font-size : 9px;
|
489 |
-
}
|
490 |
-
|
491 |
-
.yit-container.plugin-licence-activation .button-licence.licence-renew:focus {
|
492 |
-
box-shadow : none;
|
493 |
-
}
|
494 |
-
|
495 |
-
.yit-container.plugin-licence-activation table:not(.to-active-table) {
|
496 |
-
width : 100%;
|
497 |
-
border : 1px solid #dcdcdc;
|
498 |
-
border-spacing : 0;
|
499 |
-
border-radius : 5px;
|
500 |
-
border-collapse : separate;
|
501 |
-
overflow : hidden;
|
502 |
-
}
|
503 |
-
|
504 |
-
.yit-container.plugin-licence-activation table:not(.to-active-table) th {
|
505 |
-
border-bottom : 1px solid #dcdcdc;
|
506 |
-
}
|
507 |
-
|
508 |
-
.yit-container.plugin-licence-activation table:not(.to-active-table) td,
|
509 |
-
.yit-container.plugin-licence-activation table:not(.to-active-table) th {
|
510 |
-
border-right : 1px solid #dcdcdc;
|
511 |
-
}
|
512 |
-
|
513 |
-
.yit-container.plugin-licence-activation table td:last-child,
|
514 |
-
.yit-container.plugin-licence-activation table th:last-child {
|
515 |
-
border-right : 0;
|
516 |
-
}
|
517 |
-
|
518 |
-
.yit-container.plugin-licence-activation table thead tr {
|
519 |
-
background-color : #f6f4f4;
|
520 |
-
}
|
521 |
-
|
522 |
-
.yit-container.plugin-licence-activation table tbody tr {
|
523 |
-
background-color : #ffffff;
|
524 |
-
}
|
525 |
-
|
526 |
-
.yit-container.plugin-licence-activation table thead tr th {
|
527 |
-
font-size : 13px;
|
528 |
-
color : #313131;
|
529 |
-
text-transform : uppercase;
|
530 |
-
font-weight : bold;
|
531 |
-
}
|
532 |
-
|
533 |
-
.yit-container.plugin-licence-activation table thead tr,
|
534 |
-
.yit-container.plugin-licence-activation table tbody tr {
|
535 |
-
line-height : 60px;
|
536 |
-
}
|
537 |
-
|
538 |
-
.yit-container.plugin-licence-activation table tbody tr td {
|
539 |
-
text-align : center;
|
540 |
-
line-height : 20px;
|
541 |
-
padding : 10px 5px;
|
542 |
-
}
|
543 |
-
|
544 |
-
.yit-container.plugin-licence-activation .button-licence.licence-activation {
|
545 |
-
padding : 12px 18px;
|
546 |
-
}
|
547 |
-
|
548 |
-
.yit-container.plugin-licence-activation .to-active-table tr {
|
549 |
-
line-height : 75px;
|
550 |
-
}
|
551 |
-
|
552 |
-
.yit-container.plugin-licence-activation .to-active-table tr.plugin-row {
|
553 |
-
background-color : transparent;
|
554 |
-
-webkit-transition : all 0.3s ease;
|
555 |
-
-moz-transition : all 0.3s ease;
|
556 |
-
-ms-transition : all 0.3s ease;
|
557 |
-
-o-transition : all 0.3s ease;
|
558 |
-
transition : all 0.3s ease;
|
559 |
-
}
|
560 |
-
|
561 |
-
.yit-container.plugin-licence-activation .to-active-table tr.plugin-row.error {
|
562 |
-
background-color : #ffdcdc;
|
563 |
-
}
|
564 |
-
|
565 |
-
.yit-container.plugin-licence-activation .to-active-table td {
|
566 |
-
padding-right : 12px;
|
567 |
-
width : 33%;
|
568 |
-
}
|
569 |
-
|
570 |
-
.yit-container.plugin-licence-activation .to-active-table td.plugin-name {
|
571 |
-
color : #808a97;
|
572 |
-
font-size : 12px;
|
573 |
-
text-transform : uppercase;
|
574 |
-
font-weight : bold;
|
575 |
-
line-height : 20px;
|
576 |
-
width : 20%;
|
577 |
-
padding-left : 20px;
|
578 |
-
}
|
579 |
-
|
580 |
-
.yit-container.plugin-licence-activation .to-active-table td.activate-button {
|
581 |
-
width : 15%;
|
582 |
-
position : relative;
|
583 |
-
}
|
584 |
-
|
585 |
-
.yit-container.plugin-licence-activation input[type=text],
|
586 |
-
.yit-container.plugin-licence-activation input[type=email] {
|
587 |
-
-webkit-transition : all 0.3s ease;
|
588 |
-
-moz-transition : all 0.3s ease;
|
589 |
-
-ms-transition : all 0.3s ease;
|
590 |
-
-o-transition : all 0.3s ease;
|
591 |
-
transition : all 0.3s ease;
|
592 |
-
|
593 |
-
border : 1px solid #dcdcdc;
|
594 |
-
padding : 0 15px;
|
595 |
-
border-radius : 3px;
|
596 |
-
height : 41px;
|
597 |
-
width : 100%;
|
598 |
-
}
|
599 |
-
|
600 |
-
.yit-container.plugin-licence-activation input[type=text].require,
|
601 |
-
.yit-container.plugin-licence-activation input[type=email].require {
|
602 |
-
border : 1px solid #ff3838;
|
603 |
-
}
|
604 |
-
|
605 |
-
.yit-container.plugin-licence-activation input[type=text]:focus,
|
606 |
-
.yit-container.plugin-licence-activation input[type=email]:focus {
|
607 |
-
webkit-box-shadow : 0 0 1px rgba(30, 140, 190, .8);
|
608 |
-
box-shadow : 0 0 1px rgba(30, 140, 190, .8);
|
609 |
-
}
|
610 |
-
|
611 |
-
.yit-container.plugin-licence-activation input[type=text] {
|
612 |
-
text-transform : uppercase;
|
613 |
-
text-align : center;
|
614 |
-
}
|
615 |
-
|
616 |
-
.yit-container.plugin-licence-activation input[type=email] {
|
617 |
-
text-align : left;
|
618 |
-
}
|
619 |
-
|
620 |
-
.yit-container.plugin-licence-activation input[type=submit]:focus {
|
621 |
-
outline : 0;
|
622 |
-
}
|
623 |
-
|
624 |
-
/* === Woocommerce panel === */
|
625 |
-
#plugin-fw-wc .yit_options {
|
626 |
-
padding : 0;
|
627 |
-
border : 0;
|
628 |
-
}
|
629 |
-
|
630 |
-
#plugin-fw-wc .yit_options input.upload_button, .yit_options input.button {
|
631 |
-
background : none;
|
632 |
-
border : 1px solid #ccc;
|
633 |
-
}
|
634 |
-
|
635 |
-
/* === WP Pointers === */
|
636 |
-
|
637 |
-
#adminmenu li.menu-top.yit-pointer-selected-row,
|
638 |
-
#adminmenu li.menu-top.yit-pointer-selected-row:hover,
|
639 |
-
#adminmenu li.yit-pointer-selected-row a.menu-top {
|
640 |
-
background-color : #acc327;
|
641 |
-
color : #000;
|
642 |
-
}
|
643 |
-
|
644 |
-
#adminmenu a.menu-top.toplevel_page_yit_plugin_panel.yit-pointer {
|
645 |
-
color : #000;
|
646 |
-
}
|
647 |
-
|
648 |
-
#adminmenu a.menu-top.toplevel_page_yit_plugin_panel.yit-pointer:hover,
|
649 |
-
#adminmenu .wp-submenu a.yit-pointer-selected-row {
|
650 |
-
color : #fff;
|
651 |
-
}
|
652 |
-
|
653 |
-
#adminmenu .wp-submenu a.yit-pointer-selected-row:hover {
|
654 |
-
color : #45bbe6;
|
655 |
-
}
|
656 |
-
|
657 |
-
/* WooCommerce 2.4 Support */
|
658 |
-
.woocommerce table.form-table .colorpick {
|
659 |
-
width : 6em;
|
660 |
-
}
|
661 |
-
|
662 |
-
#wpwrap h2.nav-tab-wrapper , #wpbody-content h2.nav-tab-wrapper {
|
663 |
-
border-bottom: 1px solid #ccc;
|
664 |
-
}
|
665 |
-
|
666 |
-
/* === YIT FRAMEWORK === */
|
667 |
-
.plugin-card .plugin-icon img {
|
668 |
-
max-width : 100%;
|
669 |
-
width : auto;
|
670 |
-
height : auto;
|
671 |
-
}
|
672 |
-
|
673 |
-
/* === Panel Content and Container === */
|
674 |
-
.yit-admin-panel-container{
|
675 |
-
position:relative;
|
676 |
-
}
|
677 |
-
.yit-admin-panel-content-wrap {
|
678 |
-
width : calc(100% - 300px);
|
679 |
-
display : inline-block;
|
680 |
-
}
|
681 |
-
|
682 |
-
.yit-admin-panel-content-wrap.yit-admin-panel-content-wrap-full {
|
683 |
-
width : 100%;
|
684 |
-
display : block;
|
685 |
-
}
|
686 |
-
|
687 |
-
/* === Responsive === */
|
688 |
-
|
689 |
-
@media (max-width : 767px) {
|
690 |
-
.yit-admin-panel-content-wrap {
|
691 |
-
width : 100%;
|
692 |
-
display : block;
|
693 |
-
}
|
694 |
-
}
|
695 |
-
|
696 |
-
@media (max-width : 480px) {
|
697 |
-
|
698 |
-
}
|
699 |
-
|
700 |
-
@media (min-width : 768px) and (max-width : 992px) {
|
701 |
-
}
|
702 |
-
|
703 |
-
@media (min-width : 980px) and (max-width : 1199px) {
|
704 |
-
}
|
705 |
-
|
706 |
-
@media (min-width : 1200px) {
|
707 |
-
.yit-container.plugin-licence-activation {
|
708 |
-
width : 900px;
|
709 |
-
}
|
710 |
-
}
|
711 |
-
|
712 |
-
@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) {
|
713 |
-
}
|
1 |
+
/*
|
2 |
+
* This file belongs to the YIT Plugin Framework.
|
3 |
+
*
|
4 |
+
* This source file is subject to the GNU GENERAL PUBLIC LICENSE (GPL 3.0)
|
5 |
+
* that is bundled with this package in the file LICENSE.txt.
|
6 |
+
* It is also available through the world-wide-web at this URL:
|
7 |
+
* http://www.gnu.org/licenses/gpl-3.0.txt
|
8 |
+
*/
|
9 |
+
|
10 |
+
/* onoff */
|
11 |
+
.rm_onoff input {
|
12 |
+
display : none;
|
13 |
+
}
|
14 |
+
|
15 |
+
.rm_onoff input + span {
|
16 |
+
cursor : pointer;
|
17 |
+
text-indent : -9999px;
|
18 |
+
display : block;
|
19 |
+
width : 85px;
|
20 |
+
height : 37px;
|
21 |
+
background : transparent url(../images/off.png);
|
22 |
+
}
|
23 |
+
|
24 |
+
.rm_onoff input:checked + span {
|
25 |
+
background : transparent url(../images/on.png);
|
26 |
+
}
|
27 |
+
|
28 |
+
.rm_onoff input.onoffchecked + span {
|
29 |
+
background : transparent url(../images/on.png);
|
30 |
+
}
|
31 |
+
|
32 |
+
/* slider */
|
33 |
+
/*numbers*/
|
34 |
+
.ui-slider .maxCaption, .ui-slider .minCaption {
|
35 |
+
margin-bottom : 5px;
|
36 |
+
}
|
37 |
+
|
38 |
+
.ui-slider .feedback {
|
39 |
+
background : url(../images/slider/tooltip.png) no-repeat center top;
|
40 |
+
position : absolute;
|
41 |
+
top : -25px;
|
42 |
+
width : 35px;
|
43 |
+
height : 43px;
|
44 |
+
text-align : center;
|
45 |
+
width : 100%;
|
46 |
+
display : block;
|
47 |
+
}
|
48 |
+
|
49 |
+
.ui-slider .feedback strong {
|
50 |
+
display : inline-block;
|
51 |
+
padding-top : 4px;
|
52 |
+
top : -30px;
|
53 |
+
}
|
54 |
+
|
55 |
+
/*handle*/
|
56 |
+
.yit-options .ui-slider-horizontal .ui-slider-handle,
|
57 |
+
.yit_options .ui-slider-horizontal .ui-slider-handle {
|
58 |
+
background : transparent url(../images/slider/handle.png) no-repeat left top !important;
|
59 |
+
border : 0px !important;
|
60 |
+
top : -.35em !important;
|
61 |
+
width : 18px !important;
|
62 |
+
height : 19px !important;
|
63 |
+
}
|
64 |
+
|
65 |
+
/*bg on the left:grey*/
|
66 |
+
.yit-options .ui-slider.ui-widget-content,
|
67 |
+
.yit_options .ui-slider.ui-widget-content {
|
68 |
+
background : url(../images/slider/grey.gif) repeat-x left center !important;
|
69 |
+
border-color : #c1c1c0 !important;
|
70 |
+
height : 10px !important;
|
71 |
+
}
|
72 |
+
|
73 |
+
.iris-slider-offset.ui-slider.ui-widget-content {
|
74 |
+
background : transparent !important;
|
75 |
+
height : auto !important;
|
76 |
+
}
|
77 |
+
|
78 |
+
/*bg on the right:orange*/
|
79 |
+
.ui-slider.ui-widget-content .ui-widget-header {
|
80 |
+
background : url(../images/slider/orange.gif) repeat-x left center !important;
|
81 |
+
left : 2px !important;
|
82 |
+
-webkit-border-radius : 15px;
|
83 |
+
-moz-border-radius : 15px;
|
84 |
+
-khtml-border-radius : 15px;
|
85 |
+
border-radius : 15px;
|
86 |
+
}
|
87 |
+
|
88 |
+
.plugin-option tr {
|
89 |
+
border-bottom : 1px solid #ccc;
|
90 |
+
}
|
91 |
+
|
92 |
+
.plugin-option .yit_options,
|
93 |
+
.plugin-option .yit-options {
|
94 |
+
border-bottom : 0px;
|
95 |
+
}
|
96 |
+
|
97 |
+
.plugin-option .yit-options .option,
|
98 |
+
.plugin-option .yit_options .option {
|
99 |
+
width : 600px;
|
100 |
+
float : left;
|
101 |
+
}
|
102 |
+
|
103 |
+
.plugin-option .form-table td {
|
104 |
+
padding : 25px 10px;
|
105 |
+
}
|
106 |
+
|
107 |
+
.yit_options .select_wrapper,
|
108 |
+
.yit-options .select_wrapper {
|
109 |
+
background : url("../images/select.png") no-repeat scroll right center #FAFAFA;
|
110 |
+
border-color : #CCCCCC #EEEEEE #EEEEEE #CCCCCC;
|
111 |
+
border-radius : 4px 4px 4px 4px;
|
112 |
+
border-style : solid;
|
113 |
+
border-width : 1px;
|
114 |
+
color : #555555;
|
115 |
+
display : block;
|
116 |
+
float : left;
|
117 |
+
font-family : sans-serif;
|
118 |
+
font-size : 12px;
|
119 |
+
height : 26px;
|
120 |
+
margin-bottom : 9px !important;
|
121 |
+
margin-left : 0;
|
122 |
+
margin-right : 5px;
|
123 |
+
margin-top : 0;
|
124 |
+
width : 400px;
|
125 |
+
}
|
126 |
+
|
127 |
+
.chosen .select_wrapper {
|
128 |
+
background : none;
|
129 |
+
border : none;
|
130 |
+
}
|
131 |
+
|
132 |
+
.chosen .select_wrapper .chosen-container {
|
133 |
+
width : 338px !important;
|
134 |
+
}
|
135 |
+
|
136 |
+
.chosen .select_wrapper .chosen-container .search-field input {
|
137 |
+
height : 27px !important;
|
138 |
+
color : #333;
|
139 |
+
}
|
140 |
+
|
141 |
+
.chosen .select_wrapper .chosen-container .chosen-choices {
|
142 |
+
border : 1px solid #ddd;
|
143 |
+
box-shadow : none;
|
144 |
+
}
|
145 |
+
|
146 |
+
.chosen .select_wrapper .chosen-container .chosen-choices li.search-choice {
|
147 |
+
height : 15px !important;
|
148 |
+
min-width : 105px;
|
149 |
+
}
|
150 |
+
|
151 |
+
.chosen .select_wrapper .chosen-container .chosen-choices li.search-choice span {
|
152 |
+
line-height : 15px;
|
153 |
+
height : 15px;
|
154 |
+
padding-top : 2px;
|
155 |
+
}
|
156 |
+
|
157 |
+
.chosen .select_wrapper .chosen-container .chosen-choices li.search-choice a.search-choice-close {
|
158 |
+
top : 5px;
|
159 |
+
}
|
160 |
+
|
161 |
+
.chosen .select_wrapper .chosen-container .chosen-drop .chosen-search input {
|
162 |
+
width : 100% !important;
|
163 |
+
}
|
164 |
+
|
165 |
+
/* === Multiple Chosen Customizzation === */
|
166 |
+
|
167 |
+
.yith-choosen .chosen-choices {
|
168 |
+
line-height : 27px;
|
169 |
+
min-height : 27px;
|
170 |
+
border : 1px solid #ddd;
|
171 |
+
}
|
172 |
+
|
173 |
+
.yith-choosen .chosen-container-active .chosen-choices {
|
174 |
+
border : 1px solid #5b9dd9;
|
175 |
+
-webkit-box-shadow : 0 0 2px rgba(30, 140, 190, .8);
|
176 |
+
box-shadow : 0 0 2px rgba(30, 140, 190, .8);
|
177 |
+
}
|
178 |
+
|
179 |
+
.select_wrapper span {
|
180 |
+
height : 26px;
|
181 |
+
line-height : 26px;
|
182 |
+
padding-left : 6px;
|
183 |
+
position : absolute;
|
184 |
+
z-index : 2;
|
185 |
+
overflow : hidden;
|
186 |
+
}
|
187 |
+
|
188 |
+
.ie8 .yit_options select,
|
189 |
+
.ie8 .yit-options select {
|
190 |
+
height : 26px;
|
191 |
+
}
|
192 |
+
|
193 |
+
.yit_options select, .yit-options select, .the-metabox .select_wrapper select {
|
194 |
+
cursor : pointer;
|
195 |
+
height : 28px;
|
196 |
+
margin : 0;
|
197 |
+
opacity : 0;
|
198 |
+
padding : 0;
|
199 |
+
position : relative;
|
200 |
+
width : inherit;
|
201 |
+
z-index : 4;
|
202 |
+
background-color : #FAFAFA;
|
203 |
+
}
|
204 |
+
|
205 |
+
/* === Single Chosen Customizzation === */
|
206 |
+
|
207 |
+
.yith-choosen .chosen-container-single .chosen-default {
|
208 |
+
background : transparent;
|
209 |
+
border-color : #ddd;
|
210 |
+
}
|
211 |
+
|
212 |
+
.yith-choosen .chosen-search > input[type=text] {
|
213 |
+
width : 100% !important;
|
214 |
+
}
|
215 |
+
|
216 |
+
.yith-choosen .chosen-container-single .chosen-single {
|
217 |
+
background : transparent;
|
218 |
+
border-color : #ddd;
|
219 |
+
}
|
220 |
+
|
221 |
+
/* Style to woocommerce panel*/
|
222 |
+
|
223 |
+
#plugin-fw-wc {
|
224 |
+
padding-top : 20px;
|
225 |
+
}
|
226 |
+
|
227 |
+
#plugin-fw-wc table.form-table {
|
228 |
+
background-color : #fff;
|
229 |
+
margin-bottom : 20px;
|
230 |
+
}
|
231 |
+
|
232 |
+
#plugin-fw-wc table.form-table th {
|
233 |
+
padding : 20px;
|
234 |
+
}
|
235 |
+
|
236 |
+
#plugin-fw-wc h3 {
|
237 |
+
padding : 0px 10px 10px;
|
238 |
+
border-bottom : 1px solid #eee;
|
239 |
+
}
|
240 |
+
|
241 |
+
/* === VIDEO BOX === */
|
242 |
+
|
243 |
+
.yith-videobox-wrapper {
|
244 |
+
padding-top : 20px;
|
245 |
+
}
|
246 |
+
|
247 |
+
.yith-videobox-wrapper h3 {
|
248 |
+
padding : 0px 10px 10px;
|
249 |
+
border-bottom : 1px solid #eee;
|
250 |
+
}
|
251 |
+
|
252 |
+
.yith-videobox-wrapper .postbox {
|
253 |
+
display : inline-block;
|
254 |
+
}
|
255 |
+
|
256 |
+
.yith-videobox-wrapper .yith_videobox .column {
|
257 |
+
width : 45%;
|
258 |
+
float : left;
|
259 |
+
padding-right : 2.5%;
|
260 |
+
border-right : 1px solid #ebebeb;
|
261 |
+
padding-bottom : 2em;
|
262 |
+
}
|
263 |
+
|
264 |
+
.yith-videobox-wrapper .yith_videobox .column.two {
|
265 |
+
margin-right : 0;
|
266 |
+
padding-right : 0;
|
267 |
+
padding-left : 2.5%;
|
268 |
+
border : 0;
|
269 |
+
max-width : 49%;
|
270 |
+
}
|
271 |
+
|
272 |
+
.yith-videobox-wrapper .yith_videobox h2 {
|
273 |
+
font-size : 16px;
|
274 |
+
margin-bottom : 20px;
|
275 |
+
}
|
276 |
+
|
277 |
+
.yith-videobox-wrapper .yith-video-link {
|
278 |
+
width : 100%;
|
279 |
+
max-width : 200px;
|
280 |
+
float : left;
|
281 |
+
margin : 0 1.5em 1.5em 0;
|
282 |
+
}
|
283 |
+
|
284 |
+
.yith-videobox-wrapper .yith-video-link {
|
285 |
+
width : 100%;
|
286 |
+
max-width : 200px;
|
287 |
+
float : left;
|
288 |
+
margin : 0 1.5em 1.5em 0;
|
289 |
+
}
|
290 |
+
|
291 |
+
.yith-videobox-wrapper .yith-image-frame img {
|
292 |
+
max-width : 100%;
|
293 |
+
height : auto;
|
294 |
+
}
|
295 |
+
|
296 |
+
.yith-videobox-wrapper .yith-video-link img {
|
297 |
+
max-width : 100%;
|
298 |
+
height : auto;
|
299 |
+
}
|
300 |
+
|
301 |
+
.yith-videobox-wrapper .yith-video-iframe {
|
302 |
+
display : none;
|
303 |
+
|
304 |
+
}
|
305 |
+
|
306 |
+
/* === Plugins Upgrader === */
|
307 |
+
|
308 |
+
.yit-plugin-changelog-wrapper {
|
309 |
+
display : none;
|
310 |
+
}
|
311 |
+
|
312 |
+
.yit-plugin-changelog-title {
|
313 |
+
text-transform : uppercase;
|
314 |
+
}
|
315 |
+
|
316 |
+
.yit-plugin-changelog {
|
317 |
+
background : #fcfcfc;
|
318 |
+
height : 97%;
|
319 |
+
z-index : 999;
|
320 |
+
overflow : auto;
|
321 |
+
}
|
322 |
+
|
323 |
+
/* === Plugins Licence Activation === */
|
324 |
+
|
325 |
+
.yit-container.plugin-licence-activation {
|
326 |
+
font-family : 'Raleway', sans-serif;
|
327 |
+
}
|
328 |
+
|
329 |
+
.yit-container.plugin-licence-activation .to-active-wrapper {
|
330 |
+
margin-bottom : 60px;
|
331 |
+
}
|
332 |
+
|
333 |
+
.yit-container.plugin-licence-activation .to-active-wrapper form.to-active-form {
|
334 |
+
position : relative;
|
335 |
+
border-color : #e1e1e1;
|
336 |
+
border-style : solid;
|
337 |
+
border-width : 0;
|
338 |
+
}
|
339 |
+
|
340 |
+
.yit-container.plugin-licence-activation .to-active-wrapper form.to-active-form:first-child {
|
341 |
+
border-top-width : 1px;
|
342 |
+
}
|
343 |
+
|
344 |
+
.yit-container.plugin-licence-activation .to-active-wrapper form.to-active-form:last-child {
|
345 |
+
border-bottom-width : 1px;
|
346 |
+
}
|
347 |
+
|
348 |
+
.yit-container.plugin-licence-activation .to-active-wrapper table.to-active-table {
|
349 |
+
border-width : 0;
|
350 |
+
border-spacing : 0;
|
351 |
+
width : 100%;
|
352 |
+
}
|
353 |
+
|
354 |
+
.yit-container.plugin-licence-activation .message {
|
355 |
+
display : none;
|
356 |
+
line-height : normal;
|
357 |
+
background : #ffffff url(../images/licence-error.png) 15px center no-repeat;
|
358 |
+
padding-left : 65px;
|
359 |
+
padding-right : 15px;
|
360 |
+
width : 150px;
|
361 |
+
}
|
362 |
+
|
363 |
+
.yit-container.plugin-licence-activation .message-wrapper {
|
364 |
+
height : 75px;
|
365 |
+
display : none;
|
366 |
+
position : absolute;
|
367 |
+
top : 0;
|
368 |
+
right : -250px;
|
369 |
+
border : 1px solid #ff3838;
|
370 |
+
}
|
371 |
+
|
372 |
+
.yit-container.plugin-licence-activation .message-wrapper.visible {
|
373 |
+
display : table;
|
374 |
+
}
|
375 |
+
|
376 |
+
.yit-container.plugin-licence-activation .message {
|
377 |
+
display : table-cell;
|
378 |
+
vertical-align : middle;
|
379 |
+
}
|
380 |
+
|
381 |
+
.yit-container.plugin-licence-activation .arrow-left:after,
|
382 |
+
.yit-container.plugin-licence-activation .arrow-left:before {
|
383 |
+
content : "";
|
384 |
+
display : block;
|
385 |
+
width : 0;
|
386 |
+
height : 0;
|
387 |
+
position : absolute;
|
388 |
+
}
|
389 |
+
|
390 |
+
.yit-container.plugin-licence-activation .arrow-left:before {
|
391 |
+
border-top : 9px solid transparent;
|
392 |
+
border-bottom : 9px solid transparent;
|
393 |
+
border-right : 9px solid #ff3838;
|
394 |
+
top : 26px;
|
395 |
+
left : -9px;
|
396 |
+
}
|
397 |
+
|
398 |
+
.yit-container.plugin-licence-activation .arrow-left:after {
|
399 |
+
border-top : 8px solid transparent;
|
400 |
+
border-bottom : 8px solid transparent;
|
401 |
+
border-right : 8px solid #fff;
|
402 |
+
left : -8px;
|
403 |
+
top : 27px;
|
404 |
+
}
|
405 |
+
|
406 |
+
.yit-container.plugin-licence-activation h2,
|
407 |
+
.yit-container.plugin-licence-activation h3 {
|
408 |
+
text-transform : uppercase;
|
409 |
+
font-weight : 800;
|
410 |
+
margin-bottom : 30px;
|
411 |
+
}
|
412 |
+
|
413 |
+
.yit-container.plugin-licence-activation h2 {
|
414 |
+
color : #808a97;
|
415 |
+
font-size : 25px;
|
416 |
+
}
|
417 |
+
|
418 |
+
.yit-container.plugin-licence-activation h3 {
|
419 |
+
color : #313131;
|
420 |
+
font-size : 15px;
|
421 |
+
height : 20px;
|
422 |
+
}
|
423 |
+
|
424 |
+
.yit-container.plugin-licence-activation h3.to-active {
|
425 |
+
height : 20px;
|
426 |
+
position : relative;
|
427 |
+
vertical-align : top;
|
428 |
+
}
|
429 |
+
|
430 |
+
.yit-container.plugin-licence-activation .spinner.show {
|
431 |
+
display : inline-block;
|
432 |
+
vertical-align : middle;
|
433 |
+
float : none;
|
434 |
+
}
|
435 |
+
|
436 |
+
.yit-container.plugin-licence-activation h3.to-active > .spinner.show {
|
437 |
+
display : inline-block;
|
438 |
+
float : none;
|
439 |
+
top : -3px;
|
440 |
+
position : relative;
|
441 |
+
}
|
442 |
+
|
443 |
+
.yit-container.plugin-licence-activation .licence-check-section {
|
444 |
+
margin-bottom : 60px;
|
445 |
+
}
|
446 |
+
|
447 |
+
.yit-container.plugin-licence-activation span.licence-label {
|
448 |
+
font-weight : 500;
|
449 |
+
color : #606060;
|
450 |
+
margin-bottom : 30px;
|
451 |
+
}
|
452 |
+
|
453 |
+
.yit-container.plugin-licence-activation .button-licence {
|
454 |
+
border : 0;
|
455 |
+
font-size : 13px;
|
456 |
+
text-transform : uppercase;
|
457 |
+
background-color : #808a97;
|
458 |
+
color : #fff;
|
459 |
+
font-weight : 700;
|
460 |
+
border-radius : 3px;
|
461 |
+
cursor : pointer;
|
462 |
+
text-decoration : none;
|
463 |
+
padding : 5px 7px;
|
464 |
+
-webkit-transition : background-color 0.3s ease;
|
465 |
+
-moz-transition : background-color 0.3s ease;
|
466 |
+
-ms-transition : background-color 0.3s ease;
|
467 |
+
-o-transition : background-color 0.3s ease;
|
468 |
+
transition : background-color 0.3s ease;
|
469 |
+
}
|
470 |
+
|
471 |
+
.yit-container.plugin-licence-activation .button-licence:hover {
|
472 |
+
background-color : #4d5c6f;
|
473 |
+
}
|
474 |
+
|
475 |
+
.yit-container.plugin-licence-activation .button-licence.clicked {
|
476 |
+
cursor : not-allowed;
|
477 |
+
background-color : #e2e2e2 !important;
|
478 |
+
}
|
479 |
+
|
480 |
+
.yit-container.plugin-licence-activation .button-licence.licence-check {
|
481 |
+
font-weight : 400;
|
482 |
+
padding : 12px 19px;
|
483 |
+
}
|
484 |
+
|
485 |
+
.yit-container.plugin-licence-activation .button-licence.licence-renew {
|
486 |
+
text-decoration : none;
|
487 |
+
padding : 7px 12px;
|
488 |
+
font-size : 9px;
|
489 |
+
}
|
490 |
+
|
491 |
+
.yit-container.plugin-licence-activation .button-licence.licence-renew:focus {
|
492 |
+
box-shadow : none;
|
493 |
+
}
|
494 |
+
|
495 |
+
.yit-container.plugin-licence-activation table:not(.to-active-table) {
|
496 |
+
width : 100%;
|
497 |
+
border : 1px solid #dcdcdc;
|
498 |
+
border-spacing : 0;
|
499 |
+
border-radius : 5px;
|
500 |
+
border-collapse : separate;
|
501 |
+
overflow : hidden;
|
502 |
+
}
|
503 |
+
|
504 |
+
.yit-container.plugin-licence-activation table:not(.to-active-table) th {
|
505 |
+
border-bottom : 1px solid #dcdcdc;
|
506 |
+
}
|
507 |
+
|
508 |
+
.yit-container.plugin-licence-activation table:not(.to-active-table) td,
|
509 |
+
.yit-container.plugin-licence-activation table:not(.to-active-table) th {
|
510 |
+
border-right : 1px solid #dcdcdc;
|
511 |
+
}
|
512 |
+
|
513 |
+
.yit-container.plugin-licence-activation table td:last-child,
|
514 |
+
.yit-container.plugin-licence-activation table th:last-child {
|
515 |
+
border-right : 0;
|
516 |
+
}
|
517 |
+
|
518 |
+
.yit-container.plugin-licence-activation table thead tr {
|
519 |
+
background-color : #f6f4f4;
|
520 |
+
}
|
521 |
+
|
522 |
+
.yit-container.plugin-licence-activation table tbody tr {
|
523 |
+
background-color : #ffffff;
|
524 |
+
}
|
525 |
+
|
526 |
+
.yit-container.plugin-licence-activation table thead tr th {
|
527 |
+
font-size : 13px;
|
528 |
+
color : #313131;
|
529 |
+
text-transform : uppercase;
|
530 |
+
font-weight : bold;
|
531 |
+
}
|
532 |
+
|
533 |
+
.yit-container.plugin-licence-activation table thead tr,
|
534 |
+
.yit-container.plugin-licence-activation table tbody tr {
|
535 |
+
line-height : 60px;
|
536 |
+
}
|
537 |
+
|
538 |
+
.yit-container.plugin-licence-activation table tbody tr td {
|
539 |
+
text-align : center;
|
540 |
+
line-height : 20px;
|
541 |
+
padding : 10px 5px;
|
542 |
+
}
|
543 |
+
|
544 |
+
.yit-container.plugin-licence-activation .button-licence.licence-activation {
|
545 |
+
padding : 12px 18px;
|
546 |
+
}
|
547 |
+
|
548 |
+
.yit-container.plugin-licence-activation .to-active-table tr {
|
549 |
+
line-height : 75px;
|
550 |
+
}
|
551 |
+
|
552 |
+
.yit-container.plugin-licence-activation .to-active-table tr.plugin-row {
|
553 |
+
background-color : transparent;
|
554 |
+
-webkit-transition : all 0.3s ease;
|
555 |
+
-moz-transition : all 0.3s ease;
|
556 |
+
-ms-transition : all 0.3s ease;
|
557 |
+
-o-transition : all 0.3s ease;
|
558 |
+
transition : all 0.3s ease;
|
559 |
+
}
|
560 |
+
|
561 |
+
.yit-container.plugin-licence-activation .to-active-table tr.plugin-row.error {
|
562 |
+
background-color : #ffdcdc;
|
563 |
+
}
|
564 |
+
|
565 |
+
.yit-container.plugin-licence-activation .to-active-table td {
|
566 |
+
padding-right : 12px;
|
567 |
+
width : 33%;
|
568 |
+
}
|
569 |
+
|
570 |
+
.yit-container.plugin-licence-activation .to-active-table td.plugin-name {
|
571 |
+
color : #808a97;
|
572 |
+
font-size : 12px;
|
573 |
+
text-transform : uppercase;
|
574 |
+
font-weight : bold;
|
575 |
+
line-height : 20px;
|
576 |
+
width : 20%;
|
577 |
+
padding-left : 20px;
|
578 |
+
}
|
579 |
+
|
580 |
+
.yit-container.plugin-licence-activation .to-active-table td.activate-button {
|
581 |
+
width : 15%;
|
582 |
+
position : relative;
|
583 |
+
}
|
584 |
+
|
585 |
+
.yit-container.plugin-licence-activation input[type=text],
|
586 |
+
.yit-container.plugin-licence-activation input[type=email] {
|
587 |
+
-webkit-transition : all 0.3s ease;
|
588 |
+
-moz-transition : all 0.3s ease;
|
589 |
+
-ms-transition : all 0.3s ease;
|
590 |
+
-o-transition : all 0.3s ease;
|
591 |
+
transition : all 0.3s ease;
|
592 |
+
|
593 |
+
border : 1px solid #dcdcdc;
|
594 |
+
padding : 0 15px;
|
595 |
+
border-radius : 3px;
|
596 |
+
height : 41px;
|
597 |
+
width : 100%;
|
598 |
+
}
|
599 |
+
|
600 |
+
.yit-container.plugin-licence-activation input[type=text].require,
|
601 |
+
.yit-container.plugin-licence-activation input[type=email].require {
|
602 |
+
border : 1px solid #ff3838;
|
603 |
+
}
|
604 |
+
|
605 |
+
.yit-container.plugin-licence-activation input[type=text]:focus,
|
606 |
+
.yit-container.plugin-licence-activation input[type=email]:focus {
|
607 |
+
webkit-box-shadow : 0 0 1px rgba(30, 140, 190, .8);
|
608 |
+
box-shadow : 0 0 1px rgba(30, 140, 190, .8);
|
609 |
+
}
|
610 |
+
|
611 |
+
.yit-container.plugin-licence-activation input[type=text] {
|
612 |
+
text-transform : uppercase;
|
613 |
+
text-align : center;
|
614 |
+
}
|
615 |
+
|
616 |
+
.yit-container.plugin-licence-activation input[type=email] {
|
617 |
+
text-align : left;
|
618 |
+
}
|
619 |
+
|
620 |
+
.yit-container.plugin-licence-activation input[type=submit]:focus {
|
621 |
+
outline : 0;
|
622 |
+
}
|
623 |
+
|
624 |
+
/* === Woocommerce panel === */
|
625 |
+
#plugin-fw-wc .yit_options {
|
626 |
+
padding : 0;
|
627 |
+
border : 0;
|
628 |
+
}
|
629 |
+
|
630 |
+
#plugin-fw-wc .yit_options input.upload_button, .yit_options input.button {
|
631 |
+
background : none;
|
632 |
+
border : 1px solid #ccc;
|
633 |
+
}
|
634 |
+
|
635 |
+
/* === WP Pointers === */
|
636 |
+
|
637 |
+
#adminmenu li.menu-top.yit-pointer-selected-row,
|
638 |
+
#adminmenu li.menu-top.yit-pointer-selected-row:hover,
|
639 |
+
#adminmenu li.yit-pointer-selected-row a.menu-top {
|
640 |
+
background-color : #acc327;
|
641 |
+
color : #000;
|
642 |
+
}
|
643 |
+
|
644 |
+
#adminmenu a.menu-top.toplevel_page_yit_plugin_panel.yit-pointer {
|
645 |
+
color : #000;
|
646 |
+
}
|
647 |
+
|
648 |
+
#adminmenu a.menu-top.toplevel_page_yit_plugin_panel.yit-pointer:hover,
|
649 |
+
#adminmenu .wp-submenu a.yit-pointer-selected-row {
|
650 |
+
color : #fff;
|
651 |
+
}
|
652 |
+
|
653 |
+
#adminmenu .wp-submenu a.yit-pointer-selected-row:hover {
|
654 |
+
color : #45bbe6;
|
655 |
+
}
|
656 |
+
|
657 |
+
/* WooCommerce 2.4 Support */
|
658 |
+
.woocommerce table.form-table .colorpick {
|
659 |
+
width : 6em;
|
660 |
+
}
|
661 |
+
|
662 |
+
#wpwrap h2.nav-tab-wrapper , #wpbody-content h2.nav-tab-wrapper {
|
663 |
+
border-bottom: 1px solid #ccc;
|
664 |
+
}
|
665 |
+
|
666 |
+
/* === YIT FRAMEWORK === */
|
667 |
+
.plugin-card .plugin-icon img {
|
668 |
+
max-width : 100%;
|
669 |
+
width : auto;
|
670 |
+
height : auto;
|
671 |
+
}
|
672 |
+
|
673 |
+
/* === Panel Content and Container === */
|
674 |
+
.yit-admin-panel-container{
|
675 |
+
position:relative;
|
676 |
+
}
|
677 |
+
.yit-admin-panel-content-wrap {
|
678 |
+
width : calc(100% - 300px);
|
679 |
+
display : inline-block;
|
680 |
+
}
|
681 |
+
|
682 |
+
.yit-admin-panel-content-wrap.yit-admin-panel-content-wrap-full {
|
683 |
+
width : 100%;
|
684 |
+
display : block;
|
685 |
+
}
|
686 |
+
|
687 |
+
/* === Responsive === */
|
688 |
+
|
689 |
+
@media (max-width : 767px) {
|
690 |
+
.yit-admin-panel-content-wrap {
|
691 |
+
width : 100%;
|
692 |
+
display : block;
|
693 |
+
}
|
694 |
+
}
|
695 |
+
|
696 |
+
@media (max-width : 480px) {
|
697 |
+
|
698 |
+
}
|
699 |
+
|
700 |
+
@media (min-width : 768px) and (max-width : 992px) {
|
701 |
+
}
|
702 |
+
|
703 |
+
@media (min-width : 980px) and (max-width : 1199px) {
|
704 |
+
}
|
705 |
+
|
706 |
+
@media (min-width : 1200px) {
|
707 |
+
.yit-container.plugin-licence-activation {
|
708 |
+
width : 900px;
|
709 |
+
}
|
710 |
+
}
|
711 |
+
|
712 |
+
@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) {
|
713 |
+
}
|
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,14 +1,14 @@
|
|
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 |
-
background: #fcfcfc;
|
13 |
-
height: 97%;
|
14 |
}
|
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 |
+
background: #fcfcfc;
|
13 |
+
height: 97%;
|
14 |
}
|
plugin-fw/assets/js/chosen/ajax-chosen.jquery.js
CHANGED
@@ -1,81 +1,81 @@
|
|
1 |
-
// Generated by CoffeeScript 1.3.1
|
2 |
-
|
3 |
-
(function($) {
|
4 |
-
return $.fn.ajaxChosen = function(settings, callback) {
|
5 |
-
var chosenXhr, defaultOptions, options, select;
|
6 |
-
if (settings == null) {
|
7 |
-
settings = {};
|
8 |
-
}
|
9 |
-
if (callback == null) {
|
10 |
-
callback = function() {};
|
11 |
-
}
|
12 |
-
defaultOptions = {
|
13 |
-
minTermLength: 3,
|
14 |
-
afterTypeDelay: 500,
|
15 |
-
jsonTermKey: "term"
|
16 |
-
};
|
17 |
-
select = this;
|
18 |
-
chosenXhr = null;
|
19 |
-
options = $.extend({}, defaultOptions, settings);
|
20 |
-
this.chosen();
|
21 |
-
return this.each(function() {
|
22 |
-
return $(this).next('.chosen-container').find(".search-field > input, .chosen-search > input").bind('keyup', function() {
|
23 |
-
var field, msg, success, val;
|
24 |
-
val = $.trim($(this).attr('value'));
|
25 |
-
msg = val.length < options.minTermLength ? "Keep typing..." : "Looking for '" + val + "'";
|
26 |
-
select.next('.chosen-container').find('.no-results').text(msg);
|
27 |
-
if (val === $(this).data('prevVal')) {
|
28 |
-
return false;
|
29 |
-
}
|
30 |
-
$(this).data('prevVal', val);
|
31 |
-
if (this.timer) {
|
32 |
-
clearTimeout(this.timer);
|
33 |
-
}
|
34 |
-
if (val.length < options.minTermLength) {
|
35 |
-
return false;
|
36 |
-
}
|
37 |
-
field = $(this);
|
38 |
-
if (!(options.data != null)) {
|
39 |
-
options.data = {};
|
40 |
-
}
|
41 |
-
options.data[options.jsonTermKey] = val;
|
42 |
-
if (options.dataCallback != null) {
|
43 |
-
options.data = options.dataCallback(options.data);
|
44 |
-
}
|
45 |
-
success = options.success;
|
46 |
-
options.success = function(data) {
|
47 |
-
var items, selected_values;
|
48 |
-
if (!(data != null)) {
|
49 |
-
return;
|
50 |
-
}
|
51 |
-
selected_values = [];
|
52 |
-
select.find('option').each(function() {
|
53 |
-
if (!$(this).is(":selected")) {
|
54 |
-
return $(this).remove();
|
55 |
-
} else {
|
56 |
-
return selected_values.push($(this).val() + "-" + $(this).text());
|
57 |
-
}
|
58 |
-
});
|
59 |
-
items = callback(data);
|
60 |
-
$.each(items, function(value, text) {
|
61 |
-
if ($.inArray(value + "-" + text, selected_values) === -1) {
|
62 |
-
return $("<option />").attr('value', value).html(text).appendTo(select);
|
63 |
-
}
|
64 |
-
});
|
65 |
-
select.trigger("chosen:updated");
|
66 |
-
if (success != null) {
|
67 |
-
success(data);
|
68 |
-
}
|
69 |
-
field.attr('value', val);
|
70 |
-
return field.css('width', 'auto');
|
71 |
-
};
|
72 |
-
return this.timer = setTimeout(function() {
|
73 |
-
if (chosenXhr) {
|
74 |
-
chosenXhr.abort();
|
75 |
-
}
|
76 |
-
return chosenXhr = $.ajax(options);
|
77 |
-
}, options.afterTypeDelay);
|
78 |
-
});
|
79 |
-
});
|
80 |
-
};
|
81 |
})(jQuery);
|
1 |
+
// Generated by CoffeeScript 1.3.1
|
2 |
+
|
3 |
+
(function($) {
|
4 |
+
return $.fn.ajaxChosen = function(settings, callback) {
|
5 |
+
var chosenXhr, defaultOptions, options, select;
|
6 |
+
if (settings == null) {
|
7 |
+
settings = {};
|
8 |
+
}
|
9 |
+
if (callback == null) {
|
10 |
+
callback = function() {};
|
11 |
+
}
|
12 |
+
defaultOptions = {
|
13 |
+
minTermLength: 3,
|
14 |
+
afterTypeDelay: 500,
|
15 |
+
jsonTermKey: "term"
|
16 |
+
};
|
17 |
+
select = this;
|
18 |
+
chosenXhr = null;
|
19 |
+
options = $.extend({}, defaultOptions, settings);
|
20 |
+
this.chosen();
|
21 |
+
return this.each(function() {
|
22 |
+
return $(this).next('.chosen-container').find(".search-field > input, .chosen-search > input").bind('keyup', function() {
|
23 |
+
var field, msg, success, val;
|
24 |
+
val = $.trim($(this).attr('value'));
|
25 |
+
msg = val.length < options.minTermLength ? "Keep typing..." : "Looking for '" + val + "'";
|
26 |
+
select.next('.chosen-container').find('.no-results').text(msg);
|
27 |
+
if (val === $(this).data('prevVal')) {
|
28 |
+
return false;
|
29 |
+
}
|
30 |
+
$(this).data('prevVal', val);
|
31 |
+
if (this.timer) {
|
32 |
+
clearTimeout(this.timer);
|
33 |
+
}
|
34 |
+
if (val.length < options.minTermLength) {
|
35 |
+
return false;
|
36 |
+
}
|
37 |
+
field = $(this);
|
38 |
+
if (!(options.data != null)) {
|
39 |
+
options.data = {};
|
40 |
+
}
|
41 |
+
options.data[options.jsonTermKey] = val;
|
42 |
+
if (options.dataCallback != null) {
|
43 |
+
options.data = options.dataCallback(options.data);
|
44 |
+
}
|
45 |
+
success = options.success;
|
46 |
+
options.success = function(data) {
|
47 |
+
var items, selected_values;
|
48 |
+
if (!(data != null)) {
|
49 |
+
return;
|
50 |
+
}
|
51 |
+
selected_values = [];
|
52 |
+
select.find('option').each(function() {
|
53 |
+
if (!$(this).is(":selected")) {
|
54 |
+
return $(this).remove();
|
55 |
+
} else {
|
56 |
+
return selected_values.push($(this).val() + "-" + $(this).text());
|
57 |
+
}
|
58 |
+
});
|
59 |
+
items = callback(data);
|
60 |
+
$.each(items, function(value, text) {
|
61 |
+
if ($.inArray(value + "-" + text, selected_values) === -1) {
|
62 |
+
return $("<option />").attr('value', value).html(text).appendTo(select);
|
63 |
+
}
|
64 |
+
});
|
65 |
+
select.trigger("chosen:updated");
|
66 |
+
if (success != null) {
|
67 |
+
success(data);
|
68 |
+
}
|
69 |
+
field.attr('value', val);
|
70 |
+
return field.css('width', 'auto');
|
71 |
+
};
|
72 |
+
return this.timer = setTimeout(function() {
|
73 |
+
if (chosenXhr) {
|
74 |
+
chosenXhr.abort();
|
75 |
+
}
|
76 |
+
return chosenXhr = $.ajax(options);
|
77 |
+
}, options.afterTypeDelay);
|
78 |
+
});
|
79 |
+
});
|
80 |
+
};
|
81 |
})(jQuery);
|
plugin-fw/assets/js/chosen/ajax-chosen.jquery.min.js
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
-
// Generated by CoffeeScript 1.3.1
|
2 |
(function(e){return e.fn.ajaxChosen=function(t,n){var r,i,s,o;t==null&&(t={});n==null&&(n=function(){});i={minTermLength:3,afterTypeDelay:500,jsonTermKey:"term"};o=this;r=null;s=e.extend({},i,t);this.chosen();return this.each(function(){return e(this).next(".chosen-container").find(".search-field > input, .chosen-search > input").bind("keyup",function(){var t,i,u,a;a=e.trim(e(this).attr("value"));i=a.length<s.minTermLength?"Keep typing...":"Looking for '"+a+"'";o.next(".chosen-container").find(".no-results").text(i);if(a===e(this).data("prevVal"))return!1;e(this).data("prevVal",a);this.timer&&clearTimeout(this.timer);if(a.length<s.minTermLength)return!1;t=e(this);s.data==null&&(s.data={});s.data[s.jsonTermKey]=a;s.dataCallback!=null&&(s.data=s.dataCallback(s.data));u=s.success;s.success=function(r){var i,s;if(r==null)return;s=[];o.find("option").each(function(){return e(this).is(":selected")?s.push(e(this).val()+"-"+e(this).text()):e(this).remove()});i=n(r);e.each(i,function(t,n){if(e.inArray(t+"-"+n,s)===-1)return e("<option />").attr("value",t).html(n).appendTo(o)});o.trigger("chosen:updated");u!=null&&u(r);t.attr("value",a);return t.css("width","auto")};return this.timer=setTimeout(function(){r&&r.abort();return r=e.ajax(s)},s.afterTypeDelay)})})}})(jQuery);
|
1 |
+
// Generated by CoffeeScript 1.3.1
|
2 |
(function(e){return e.fn.ajaxChosen=function(t,n){var r,i,s,o;t==null&&(t={});n==null&&(n=function(){});i={minTermLength:3,afterTypeDelay:500,jsonTermKey:"term"};o=this;r=null;s=e.extend({},i,t);this.chosen();return this.each(function(){return e(this).next(".chosen-container").find(".search-field > input, .chosen-search > input").bind("keyup",function(){var t,i,u,a;a=e.trim(e(this).attr("value"));i=a.length<s.minTermLength?"Keep typing...":"Looking for '"+a+"'";o.next(".chosen-container").find(".no-results").text(i);if(a===e(this).data("prevVal"))return!1;e(this).data("prevVal",a);this.timer&&clearTimeout(this.timer);if(a.length<s.minTermLength)return!1;t=e(this);s.data==null&&(s.data={});s.data[s.jsonTermKey]=a;s.dataCallback!=null&&(s.data=s.dataCallback(s.data));u=s.success;s.success=function(r){var i,s;if(r==null)return;s=[];o.find("option").each(function(){return e(this).is(":selected")?s.push(e(this).val()+"-"+e(this).text()):e(this).remove()});i=n(r);e.each(i,function(t,n){if(e.inArray(t+"-"+n,s)===-1)return e("<option />").attr("value",t).html(n).appendTo(o)});o.trigger("chosen:updated");u!=null&&u(r);t.attr("value",a);return t.css("width","auto")};return this.timer=setTimeout(function(){r&&r.abort();return r=e.ajax(s)},s.afterTypeDelay)})})}})(jQuery);
|
plugin-fw/assets/js/chosen/chosen.jquery.js
CHANGED
@@ -1,1211 +1,1211 @@
|
|
1 |
-
/*!
|
2 |
-
Chosen, a Select Box Enhancer for jQuery and Prototype
|
3 |
-
by Patrick Filler for Harvest, http://getharvest.com
|
4 |
-
|
5 |
-
Version 1.1.0
|
6 |
-
Full source at https://github.com/harvesthq/chosen
|
7 |
-
Copyright (c) 2011 Harvest http://getharvest.com
|
8 |
-
|
9 |
-
MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
|
10 |
-
This file is generated by `grunt build`, do not edit it by hand.
|
11 |
-
*/
|
12 |
-
|
13 |
-
(function() {
|
14 |
-
var $, AbstractChosen, Chosen, SelectParser, _ref,
|
15 |
-
__hasProp = {}.hasOwnProperty,
|
16 |
-
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
|
17 |
-
|
18 |
-
SelectParser = (function() {
|
19 |
-
function SelectParser() {
|
20 |
-
this.options_index = 0;
|
21 |
-
this.parsed = [];
|
22 |
-
}
|
23 |
-
|
24 |
-
SelectParser.prototype.add_node = function(child) {
|
25 |
-
if (child.nodeName.toUpperCase() === "OPTGROUP") {
|
26 |
-
return this.add_group(child);
|
27 |
-
} else {
|
28 |
-
return this.add_option(child);
|
29 |
-
}
|
30 |
-
};
|
31 |
-
|
32 |
-
SelectParser.prototype.add_group = function(group) {
|
33 |
-
var group_position, option, _i, _len, _ref, _results;
|
34 |
-
group_position = this.parsed.length;
|
35 |
-
this.parsed.push({
|
36 |
-
array_index: group_position,
|
37 |
-
group: true,
|
38 |
-
label: this.escapeExpression(group.label),
|
39 |
-
children: 0,
|
40 |
-
disabled: group.disabled
|
41 |
-
});
|
42 |
-
_ref = group.childNodes;
|
43 |
-
_results = [];
|
44 |
-
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
45 |
-
option = _ref[_i];
|
46 |
-
_results.push(this.add_option(option, group_position, group.disabled));
|
47 |
-
}
|
48 |
-
return _results;
|
49 |
-
};
|
50 |
-
|
51 |
-
SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
|
52 |
-
if (option.nodeName.toUpperCase() === "OPTION") {
|
53 |
-
if (option.text !== "") {
|
54 |
-
if (group_position != null) {
|
55 |
-
this.parsed[group_position].children += 1;
|
56 |
-
}
|
57 |
-
this.parsed.push({
|
58 |
-
array_index: this.parsed.length,
|
59 |
-
options_index: this.options_index,
|
60 |
-
value: option.value,
|
61 |
-
text: option.text,
|
62 |
-
html: option.innerHTML,
|
63 |
-
selected: option.selected,
|
64 |
-
disabled: group_disabled === true ? group_disabled : option.disabled,
|
65 |
-
group_array_index: group_position,
|
66 |
-
classes: option.className,
|
67 |
-
style: option.style.cssText
|
68 |
-
});
|
69 |
-
} else {
|
70 |
-
this.parsed.push({
|
71 |
-
array_index: this.parsed.length,
|
72 |
-
options_index: this.options_index,
|
73 |
-
empty: true
|
74 |
-
});
|
75 |
-
}
|
76 |
-
return this.options_index += 1;
|
77 |
-
}
|
78 |
-
};
|
79 |
-
|
80 |
-
SelectParser.prototype.escapeExpression = function(text) {
|
81 |
-
var map, unsafe_chars;
|
82 |
-
if ((text == null) || text === false) {
|
83 |
-
return "";
|
84 |
-
}
|
85 |
-
if (!/[\&\<\>\"\'\`]/.test(text)) {
|
86 |
-
return text;
|
87 |
-
}
|
88 |
-
map = {
|
89 |
-
"<": "<",
|
90 |
-
">": ">",
|
91 |
-
'"': """,
|
92 |
-
"'": "'",
|
93 |
-
"`": "`"
|
94 |
-
};
|
95 |
-
unsafe_chars = /&(?!\w+;)|[\<\>\"\'\`]/g;
|
96 |
-
return text.replace(unsafe_chars, function(chr) {
|
97 |
-
return map[chr] || "&";
|
98 |
-
});
|
99 |
-
};
|
100 |
-
|
101 |
-
return SelectParser;
|
102 |
-
|
103 |
-
})();
|
104 |
-
|
105 |
-
SelectParser.select_to_array = function(select) {
|
106 |
-
var child, parser, _i, _len, _ref;
|
107 |
-
parser = new SelectParser();
|
108 |
-
_ref = select.childNodes;
|
109 |
-
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
110 |
-
child = _ref[_i];
|
111 |
-
parser.add_node(child);
|
112 |
-
}
|
113 |
-
return parser.parsed;
|
114 |
-
};
|
115 |
-
|
116 |
-
AbstractChosen = (function() {
|
117 |
-
function AbstractChosen(form_field, options) {
|
118 |
-
this.form_field = form_field;
|
119 |
-
this.options = options != null ? options : {};
|
120 |
-
if (!AbstractChosen.browser_is_supported()) {
|
121 |
-
return;
|
122 |
-
}
|
123 |
-
this.is_multiple = this.form_field.multiple;
|
124 |
-
this.set_default_text();
|
125 |
-
this.set_default_values();
|
126 |
-
this.setup();
|
127 |
-
this.set_up_html();
|
128 |
-
this.register_observers();
|
129 |
-
}
|
130 |
-
|
131 |
-
AbstractChosen.prototype.set_default_values = function() {
|
132 |
-
var _this = this;
|
133 |
-
this.click_test_action = function(evt) {
|
134 |
-
return _this.test_active_click(evt);
|
135 |
-
};
|
136 |
-
this.activate_action = function(evt) {
|
137 |
-
return _this.activate_field(evt);
|
138 |
-
};
|
139 |
-
this.active_field = false;
|
140 |
-
this.mouse_on_container = false;
|
141 |
-
this.results_showing = false;
|
142 |
-
this.result_highlighted = null;
|
143 |
-
this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false;
|
144 |
-
this.disable_search_threshold = this.options.disable_search_threshold || 0;
|
145 |
-
this.disable_search = this.options.disable_search || false;
|
146 |
-
this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true;
|
147 |
-
this.group_search = this.options.group_search != null ? this.options.group_search : true;
|
148 |
-
this.search_contains = this.options.search_contains || false;
|
149 |
-
this.single_backstroke_delete = this.options.single_backstroke_delete != null ? this.options.single_backstroke_delete : true;
|
150 |
-
this.max_selected_options = this.options.max_selected_options || Infinity;
|
151 |
-
this.inherit_select_classes = this.options.inherit_select_classes || false;
|
152 |
-
this.display_selected_options = this.options.display_selected_options != null ? this.options.display_selected_options : true;
|
153 |
-
return this.display_disabled_options = this.options.display_disabled_options != null ? this.options.display_disabled_options : true;
|
154 |
-
};
|
155 |
-
|
156 |
-
AbstractChosen.prototype.set_default_text = function() {
|
157 |
-
if (this.form_field.getAttribute("data-placeholder")) {
|
158 |
-
this.default_text = this.form_field.getAttribute("data-placeholder");
|
159 |
-
} else if (this.is_multiple) {
|
160 |
-
this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || AbstractChosen.default_multiple_text;
|
161 |
-
} else {
|
162 |
-
this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || AbstractChosen.default_single_text;
|
163 |
-
}
|
164 |
-
return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || this.options.no_results_text || AbstractChosen.default_no_result_text;
|
165 |
-
};
|
166 |
-
|
167 |
-
AbstractChosen.prototype.mouse_enter = function() {
|
168 |
-
return this.mouse_on_container = true;
|
169 |
-
};
|
170 |
-
|
171 |
-
AbstractChosen.prototype.mouse_leave = function() {
|
172 |
-
return this.mouse_on_container = false;
|
173 |
-
};
|
174 |
-
|
175 |
-
AbstractChosen.prototype.input_focus = function(evt) {
|
176 |
-
var _this = this;
|
177 |
-
if (this.is_multiple) {
|
178 |
-
if (!this.active_field) {
|
179 |
-
return setTimeout((function() {
|
180 |
-
return _this.container_mousedown();
|
181 |
-
}), 50);
|
182 |
-
}
|
183 |
-
} else {
|
184 |
-
if (!this.active_field) {
|
185 |
-
return this.activate_field();
|
186 |
-
}
|
187 |
-
}
|
188 |
-
};
|
189 |
-
|
190 |
-
AbstractChosen.prototype.input_blur = function(evt) {
|
191 |
-
var _this = this;
|
192 |
-
if (!this.mouse_on_container) {
|
193 |
-
this.active_field = false;
|
194 |
-
return setTimeout((function() {
|
195 |
-
return _this.blur_test();
|
196 |
-
}), 100);
|
197 |
-
}
|
198 |
-
};
|
199 |
-
|
200 |
-
AbstractChosen.prototype.results_option_build = function(options) {
|
201 |
-
var content, data, _i, _len, _ref;
|
202 |
-
content = '';
|
203 |
-
_ref = this.results_data;
|
204 |
-
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
205 |
-
data = _ref[_i];
|
206 |
-
if (data.group) {
|
207 |
-
content += this.result_add_group(data);
|
208 |
-
} else {
|
209 |
-
content += this.result_add_option(data);
|
210 |
-
}
|
211 |
-
if (options != null ? options.first : void 0) {
|
212 |
-
if (data.selected && this.is_multiple) {
|
213 |
-
this.choice_build(data);
|
214 |
-
} else if (data.selected && !this.is_multiple) {
|
215 |
-
this.single_set_selected_text(data.text);
|
216 |
-
}
|
217 |
-
}
|
218 |
-
}
|
219 |
-
return content;
|
220 |
-
};
|
221 |
-
|
222 |
-
AbstractChosen.prototype.result_add_option = function(option) {
|
223 |
-
var classes, option_el;
|
224 |
-
if (!option.search_match) {
|
225 |
-
return '';
|
226 |
-
}
|
227 |
-
if (!this.include_option_in_results(option)) {
|
228 |
-
return '';
|
229 |
-
}
|
230 |
-
classes = [];
|
231 |
-
if (!option.disabled && !(option.selected && this.is_multiple)) {
|
232 |
-
classes.push("active-result");
|
233 |
-
}
|
234 |
-
if (option.disabled && !(option.selected && this.is_multiple)) {
|
235 |
-
classes.push("disabled-result");
|
236 |
-
}
|
237 |
-
if (option.selected) {
|
238 |
-
classes.push("result-selected");
|
239 |
-
}
|
240 |
-
if (option.group_array_index != null) {
|
241 |
-
classes.push("group-option");
|
242 |
-
}
|
243 |
-
if (option.classes !== "") {
|
244 |
-
classes.push(option.classes);
|
245 |
-
}
|
246 |
-
option_el = document.createElement("li");
|
247 |
-
option_el.className = classes.join(" ");
|
248 |
-
option_el.style.cssText = option.style;
|
249 |
-
option_el.setAttribute("data-option-array-index", option.array_index);
|
250 |
-
option_el.innerHTML = option.search_text;
|
251 |
-
return this.outerHTML(option_el);
|
252 |
-
};
|
253 |
-
|
254 |
-
AbstractChosen.prototype.result_add_group = function(group) {
|
255 |
-
var group_el;
|
256 |
-
if (!(group.search_match || group.group_match)) {
|
257 |
-
return '';
|
258 |
-
}
|
259 |
-
if (!(group.active_options > 0)) {
|
260 |
-
return '';
|
261 |
-
}
|
262 |
-
group_el = document.createElement("li");
|
263 |
-
group_el.className = "group-result";
|
264 |
-
group_el.innerHTML = group.search_text;
|
265 |
-
return this.outerHTML(group_el);
|
266 |
-
};
|
267 |
-
|
268 |
-
AbstractChosen.prototype.results_update_field = function() {
|
269 |
-
this.set_default_text();
|
270 |
-
if (!this.is_multiple) {
|
271 |
-
this.results_reset_cleanup();
|
272 |
-
}
|
273 |
-
this.result_clear_highlight();
|
274 |
-
this.results_build();
|
275 |
-
if (this.results_showing) {
|
276 |
-
return this.winnow_results();
|
277 |
-
}
|
278 |
-
};
|
279 |
-
|
280 |
-
AbstractChosen.prototype.reset_single_select_options = function() {
|
281 |
-
var result, _i, _len, _ref, _results;
|
282 |
-
_ref = this.results_data;
|
283 |
-
_results = [];
|
284 |
-
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
285 |
-
result = _ref[_i];
|
286 |
-
if (result.selected) {
|
287 |
-
_results.push(result.selected = false);
|
288 |
-
} else {
|
289 |
-
_results.push(void 0);
|
290 |
-
}
|
291 |
-
}
|
292 |
-
return _results;
|
293 |
-
};
|
294 |
-
|
295 |
-
AbstractChosen.prototype.results_toggle = function() {
|
296 |
-
if (this.results_showing) {
|
297 |
-
return this.results_hide();
|
298 |
-
} else {
|
299 |
-
return this.results_show();
|
300 |
-
}
|
301 |
-
};
|
302 |
-
|
303 |
-
AbstractChosen.prototype.results_search = function(evt) {
|
304 |
-
if (this.results_showing) {
|
305 |
-
return this.winnow_results();
|
306 |
-
} else {
|
307 |
-
return this.results_show();
|
308 |
-
}
|
309 |
-
};
|
310 |
-
|
311 |
-
AbstractChosen.prototype.winnow_results = function() {
|
312 |
-
var escapedSearchText, option, regex, regexAnchor, results, results_group, searchText, startpos, text, zregex, _i, _len, _ref;
|
313 |
-
this.no_results_clear();
|
314 |
-
results = 0;
|
315 |
-
searchText = this.get_search_text();
|
316 |
-
escapedSearchText = searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
|
317 |
-
regexAnchor = this.search_contains ? "" : "^";
|
318 |
-
regex = new RegExp(regexAnchor + escapedSearchText, 'i');
|
319 |
-
zregex = new RegExp(escapedSearchText, 'i');
|
320 |
-
_ref = this.results_data;
|
321 |
-
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
322 |
-
option = _ref[_i];
|
323 |
-
option.search_match = false;
|
324 |
-
results_group = null;
|
325 |
-
if (this.include_option_in_results(option)) {
|
326 |
-
if (option.group) {
|
327 |
-
option.group_match = false;
|
328 |
-
option.active_options = 0;
|
329 |
-
}
|
330 |
-
if ((option.group_array_index != null) && this.results_data[option.group_array_index]) {
|
331 |
-
results_group = this.results_data[option.group_array_index];
|
332 |
-
if (results_group.active_options === 0 && results_group.search_match) {
|
333 |
-
results += 1;
|
334 |
-
}
|
335 |
-
results_group.active_options += 1;
|
336 |
-
}
|
337 |
-
if (!(option.group && !this.group_search)) {
|
338 |
-
option.search_text = option.group ? option.label : option.html;
|
339 |
-
option.search_match = this.search_string_match(option.search_text, regex);
|
340 |
-
if (option.search_match && !option.group) {
|
341 |
-
results += 1;
|
342 |
-
}
|
343 |
-
if (option.search_match) {
|
344 |
-
if (searchText.length) {
|
345 |
-
startpos = option.search_text.search(zregex);
|
346 |
-
text = option.search_text.substr(0, startpos + searchText.length) + '</em>' + option.search_text.substr(startpos + searchText.length);
|
347 |
-
option.search_text = text.substr(0, startpos) + '<em>' + text.substr(startpos);
|
348 |
-
}
|
349 |
-
if (results_group != null) {
|
350 |
-
results_group.group_match = true;
|
351 |
-
}
|
352 |
-
} else if ((option.group_array_index != null) && this.results_data[option.group_array_index].search_match) {
|
353 |
-
option.search_match = true;
|
354 |
-
}
|
355 |
-
}
|
356 |
-
}
|
357 |
-
}
|
358 |
-
this.result_clear_highlight();
|
359 |
-
if (results < 1 && searchText.length) {
|
360 |
-
this.update_results_content("");
|
361 |
-
return this.no_results(searchText);
|
362 |
-
} else {
|
363 |
-
this.update_results_content(this.results_option_build());
|
364 |
-
return this.winnow_results_set_highlight();
|
365 |
-
}
|
366 |
-
};
|
367 |
-
|
368 |
-
AbstractChosen.prototype.search_string_match = function(search_string, regex) {
|
369 |
-
var part, parts, _i, _len;
|
370 |
-
if (regex.test(search_string)) {
|
371 |
-
return true;
|
372 |
-
} else if (this.enable_split_word_search && (search_string.indexOf(" ") >= 0 || search_string.indexOf("[") === 0)) {
|
373 |
-
parts = search_string.replace(/\[|\]/g, "").split(" ");
|
374 |
-
if (parts.length) {
|
375 |
-
for (_i = 0, _len = parts.length; _i < _len; _i++) {
|
376 |
-
part = parts[_i];
|
377 |
-
if (regex.test(part)) {
|
378 |
-
return true;
|
379 |
-
}
|
380 |
-
}
|
381 |
-
}
|
382 |
-
}
|
383 |
-
};
|
384 |
-
|
385 |
-
AbstractChosen.prototype.choices_count = function() {
|
386 |
-
var option, _i, _len, _ref;
|
387 |
-
if (this.selected_option_count != null) {
|
388 |
-
return this.selected_option_count;
|
389 |
-
}
|
390 |
-
this.selected_option_count = 0;
|
391 |
-
_ref = this.form_field.options;
|
392 |
-
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
393 |
-
option = _ref[_i];
|
394 |
-
if (option.selected) {
|
395 |
-
this.selected_option_count += 1;
|
396 |
-
}
|
397 |
-
}
|
398 |
-
return this.selected_option_count;
|
399 |
-
};
|
400 |
-
|
401 |
-
AbstractChosen.prototype.choices_click = function(evt) {
|
402 |
-
evt.preventDefault();
|
403 |
-
if (!(this.results_showing || this.is_disabled)) {
|
404 |
-
return this.results_show();
|
405 |
-
}
|
406 |
-
};
|
407 |
-
|
408 |
-
AbstractChosen.prototype.keyup_checker = function(evt) {
|
409 |
-
var stroke, _ref;
|
410 |
-
stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
|
411 |
-
this.search_field_scale();
|
412 |
-
switch (stroke) {
|
413 |
-
case 8:
|
414 |
-
if (this.is_multiple && this.backstroke_length < 1 && this.choices_count() > 0) {
|
415 |
-
return this.keydown_backstroke();
|
416 |
-
} else if (!this.pending_backstroke) {
|
417 |
-
this.result_clear_highlight();
|
418 |
-
return this.results_search();
|
419 |
-
}
|
420 |
-
break;
|
421 |
-
case 13:
|
422 |
-
evt.preventDefault();
|
423 |
-
if (this.results_showing) {
|
424 |
-
return this.result_select(evt);
|
425 |
-
}
|
426 |
-
break;
|
427 |
-
case 27:
|
428 |
-
if (this.results_showing) {
|
429 |
-
this.results_hide();
|
430 |
-
}
|
431 |
-
return true;
|
432 |
-
case 9:
|
433 |
-
case 38:
|
434 |
-
case 40:
|
435 |
-
case 16:
|
436 |
-
case 91:
|
437 |
-
case 17:
|
438 |
-
break;
|
439 |
-
default:
|
440 |
-
return this.results_search();
|
441 |
-
}
|
442 |
-
};
|
443 |
-
|
444 |
-
AbstractChosen.prototype.clipboard_event_checker = function(evt) {
|
445 |
-
var _this = this;
|
446 |
-
return setTimeout((function() {
|
447 |
-
return _this.results_search();
|
448 |
-
}), 50);
|
449 |
-
};
|
450 |
-
|
451 |
-
AbstractChosen.prototype.container_width = function() {
|
452 |
-
if (this.options.width != null) {
|
453 |
-
return this.options.width;
|
454 |
-
} else {
|
455 |
-
return "" + this.form_field.offsetWidth + "px";
|
456 |
-
}
|
457 |
-
};
|
458 |
-
|
459 |
-
AbstractChosen.prototype.include_option_in_results = function(option) {
|
460 |
-
if (this.is_multiple && (!this.display_selected_options && option.selected)) {
|
461 |
-
return false;
|
462 |
-
}
|
463 |
-
if (!this.display_disabled_options && option.disabled) {
|
464 |
-
return false;
|
465 |
-
}
|
466 |
-
if (option.empty) {
|
467 |
-
return false;
|
468 |
-
}
|
469 |
-
return true;
|
470 |
-
};
|
471 |
-
|
472 |
-
AbstractChosen.prototype.search_results_touchstart = function(evt) {
|
473 |
-
this.touch_started = true;
|
474 |
-
return this.search_results_mouseover(evt);
|
475 |
-
};
|
476 |
-
|
477 |
-
AbstractChosen.prototype.search_results_touchmove = function(evt) {
|
478 |
-
this.touch_started = false;
|
479 |
-
return this.search_results_mouseout(evt);
|
480 |
-
};
|
481 |
-
|
482 |
-
AbstractChosen.prototype.search_results_touchend = function(evt) {
|
483 |
-
if (this.touch_started) {
|
484 |
-
return this.search_results_mouseup(evt);
|
485 |
-
}
|
486 |
-
};
|
487 |
-
|
488 |
-
AbstractChosen.prototype.outerHTML = function(element) {
|
489 |
-
var tmp;
|
490 |
-
if (element.outerHTML) {
|
491 |
-
return element.outerHTML;
|
492 |
-
}
|
493 |
-
tmp = document.createElement("div");
|
494 |
-
tmp.appendChild(element);
|
495 |
-
return tmp.innerHTML;
|
496 |
-
};
|
497 |
-
|
498 |
-
AbstractChosen.browser_is_supported = function() {
|
499 |
-
if (window.navigator.appName === "Microsoft Internet Explorer") {
|
500 |
-
return document.documentMode >= 8;
|
501 |
-
}
|
502 |
-
if (/iP(od|hone)/i.test(window.navigator.userAgent)) {
|
503 |
-
return false;
|
504 |
-
}
|
505 |
-
if (/Android/i.test(window.navigator.userAgent)) {
|
506 |
-
if (/Mobile/i.test(window.navigator.userAgent)) {
|
507 |
-
return false;
|
508 |
-
}
|
509 |
-
}
|
510 |
-
return true;
|
511 |
-
};
|
512 |
-
|
513 |
-
AbstractChosen.default_multiple_text = "Select Some Options";
|
514 |
-
|
515 |
-
AbstractChosen.default_single_text = "Select an Option";
|
516 |
-
|
517 |
-
AbstractChosen.default_no_result_text = "No results match";
|
518 |
-
|
519 |
-
return AbstractChosen;
|
520 |
-
|
521 |
-
})();
|
522 |
-
|
523 |
-
$ = jQuery;
|
524 |
-
|
525 |
-
$.fn.extend({
|
526 |
-
chosen: function(options) {
|
527 |
-
if (!AbstractChosen.browser_is_supported()) {
|
528 |
-
return this;
|
529 |
-
}
|
530 |
-
return this.each(function(input_field) {
|
531 |
-
var $this, chosen;
|
532 |
-
$this = $(this);
|
533 |
-
chosen = $this.data('chosen');
|
534 |
-
if (options === 'destroy' && chosen) {
|
535 |
-
chosen.destroy();
|
536 |
-
} else if (!chosen) {
|
537 |
-
$this.data('chosen', new Chosen(this, options));
|
538 |
-
}
|
539 |
-
});
|
540 |
-
}
|
541 |
-
});
|
542 |
-
|
543 |
-
Chosen = (function(_super) {
|
544 |
-
__extends(Chosen, _super);
|
545 |
-
|
546 |
-
function Chosen() {
|
547 |
-
_ref = Chosen.__super__.constructor.apply(this, arguments);
|
548 |
-
return _ref;
|
549 |
-
}
|
550 |
-
|
551 |
-
Chosen.prototype.setup = function() {
|
552 |
-
this.form_field_jq = $(this.form_field);
|
553 |
-
this.current_selectedIndex = this.form_field.selectedIndex;
|
554 |
-
return this.is_rtl = this.form_field_jq.hasClass("chosen-rtl");
|
555 |
-
};
|
556 |
-
|
557 |
-
Chosen.prototype.set_up_html = function() {
|
558 |
-
var container_classes, container_props;
|
559 |
-
container_classes = ["chosen-container"];
|
560 |
-
container_classes.push("chosen-container-" + (this.is_multiple ? "multi" : "single"));
|
561 |
-
if (this.inherit_select_classes && this.form_field.className) {
|
562 |
-
container_classes.push(this.form_field.className);
|
563 |
-
}
|
564 |
-
if (this.is_rtl) {
|
565 |
-
container_classes.push("chosen-rtl");
|
566 |
-
}
|
567 |
-
container_props = {
|
568 |
-
'class': container_classes.join(' '),
|
569 |
-
'style': "width: " + (this.container_width()) + ";",
|
570 |
-
'title': this.form_field.title
|
571 |
-
};
|
572 |
-
if (this.form_field.id.length) {
|
573 |
-
container_props.id = this.form_field.id.replace(/[^\w]/g, '_') + "_chosen";
|
574 |
-
}
|
575 |
-
this.container = $("<div />", container_props);
|
576 |
-
if (this.is_multiple) {
|
577 |
-
this.container.html('<ul class="chosen-choices"><li class="search-field"><input type="text" value="' + this.default_text + '" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chosen-drop"><ul class="chosen-results"></ul></div>');
|
578 |
-
} else {
|
579 |
-
this.container.html('<a class="chosen-single chosen-default" tabindex="-1"><span>' + this.default_text + '</span><div><b></b></div></a><div class="chosen-drop"><div class="chosen-search"><input type="text" autocomplete="off" /></div><ul class="chosen-results"></ul></div>');
|
580 |
-
}
|
581 |
-
this.form_field_jq.hide().after(this.container);
|
582 |
-
this.dropdown = this.container.find('div.chosen-drop').first();
|
583 |
-
this.search_field = this.container.find('input').first();
|
584 |
-
this.search_results = this.container.find('ul.chosen-results').first();
|
585 |
-
this.search_field_scale();
|
586 |
-
this.search_no_results = this.container.find('li.no-results').first();
|
587 |
-
if (this.is_multiple) {
|
588 |
-
this.search_choices = this.container.find('ul.chosen-choices').first();
|
589 |
-
this.search_container = this.container.find('li.search-field').first();
|
590 |
-
} else {
|
591 |
-
this.search_container = this.container.find('div.chosen-search').first();
|
592 |
-
this.selected_item = this.container.find('.chosen-single').first();
|
593 |
-
}
|
594 |
-
this.results_build();
|
595 |
-
this.set_tab_index();
|
596 |
-
this.set_label_behavior();
|
597 |
-
return this.form_field_jq.trigger("chosen:ready", {
|
598 |
-
chosen: this
|
599 |
-
});
|
600 |
-
};
|
601 |
-
|
602 |
-
Chosen.prototype.register_observers = function() {
|
603 |
-
var _this = this;
|
604 |
-
this.container.bind('mousedown.chosen', function(evt) {
|
605 |
-
_this.container_mousedown(evt);
|
606 |
-
});
|
607 |
-
this.container.bind('mouseup.chosen', function(evt) {
|
608 |
-
_this.container_mouseup(evt);
|
609 |
-
});
|
610 |
-
this.container.bind('mouseenter.chosen', function(evt) {
|
611 |
-
_this.mouse_enter(evt);
|
612 |
-
});
|
613 |
-
this.container.bind('mouseleave.chosen', function(evt) {
|
614 |
-
_this.mouse_leave(evt);
|
615 |
-
});
|
616 |
-
this.search_results.bind('mouseup.chosen', function(evt) {
|
617 |
-
_this.search_results_mouseup(evt);
|
618 |
-
});
|
619 |
-
this.search_results.bind('mouseover.chosen', function(evt) {
|
620 |
-
_this.search_results_mouseover(evt);
|
621 |
-
});
|
622 |
-
this.search_results.bind('mouseout.chosen', function(evt) {
|
623 |
-
_this.search_results_mouseout(evt);
|
624 |
-
});
|
625 |
-
this.search_results.bind('mousewheel.chosen DOMMouseScroll.chosen', function(evt) {
|
626 |
-
_this.search_results_mousewheel(evt);
|
627 |
-
});
|
628 |
-
this.search_results.bind('touchstart.chosen', function(evt) {
|
629 |
-
_this.search_results_touchstart(evt);
|
630 |
-
});
|
631 |
-
this.search_results.bind('touchmove.chosen', function(evt) {
|
632 |
-
_this.search_results_touchmove(evt);
|
633 |
-
});
|
634 |
-
this.search_results.bind('touchend.chosen', function(evt) {
|
635 |
-
_this.search_results_touchend(evt);
|
636 |
-
});
|
637 |
-
this.form_field_jq.bind("chosen:updated.chosen", function(evt) {
|
638 |
-
_this.results_update_field(evt);
|
639 |
-
});
|
640 |
-
this.form_field_jq.bind("chosen:activate.chosen", function(evt) {
|
641 |
-
_this.activate_field(evt);
|
642 |
-
});
|
643 |
-
this.form_field_jq.bind("chosen:open.chosen", function(evt) {
|
644 |
-
_this.container_mousedown(evt);
|
645 |
-
});
|
646 |
-
this.form_field_jq.bind("chosen:close.chosen", function(evt) {
|
647 |
-
_this.input_blur(evt);
|
648 |
-
});
|
649 |
-
this.search_field.bind('blur.chosen', function(evt) {
|
650 |
-
_this.input_blur(evt);
|
651 |
-
});
|
652 |
-
this.search_field.bind('keyup.chosen', function(evt) {
|
653 |
-
_this.keyup_checker(evt);
|
654 |
-
});
|
655 |
-
this.search_field.bind('keydown.chosen', function(evt) {
|
656 |
-
_this.keydown_checker(evt);
|
657 |
-
});
|
658 |
-
this.search_field.bind('focus.chosen', function(evt) {
|
659 |
-
_this.input_focus(evt);
|
660 |
-
});
|
661 |
-
this.search_field.bind('cut.chosen', function(evt) {
|
662 |
-
_this.clipboard_event_checker(evt);
|
663 |
-
});
|
664 |
-
this.search_field.bind('paste.chosen', function(evt) {
|
665 |
-
_this.clipboard_event_checker(evt);
|
666 |
-
});
|
667 |
-
if (this.is_multiple) {
|
668 |
-
return this.search_choices.bind('click.chosen', function(evt) {
|
669 |
-
_this.choices_click(evt);
|
670 |
-
});
|
671 |
-
} else {
|
672 |
-
return this.container.bind('click.chosen', function(evt) {
|
673 |
-
evt.preventDefault();
|
674 |
-
});
|
675 |
-
}
|
676 |
-
};
|
677 |
-
|
678 |
-
Chosen.prototype.destroy = function() {
|
679 |
-
$(this.container[0].ownerDocument).unbind("click.chosen", this.click_test_action);
|
680 |
-
if (this.search_field[0].tabIndex) {
|
681 |
-
this.form_field_jq[0].tabIndex = this.search_field[0].tabIndex;
|
682 |
-
}
|
683 |
-
this.container.remove();
|
684 |
-
this.form_field_jq.removeData('chosen');
|
685 |
-
return this.form_field_jq.show();
|
686 |
-
};
|
687 |
-
|
688 |
-
Chosen.prototype.search_field_disabled = function() {
|
689 |
-
this.is_disabled = this.form_field_jq[0].disabled;
|
690 |
-
if (this.is_disabled) {
|
691 |
-
this.container.addClass('chosen-disabled');
|
692 |
-
this.search_field[0].disabled = true;
|
693 |
-
if (!this.is_multiple) {
|
694 |
-
this.selected_item.unbind("focus.chosen", this.activate_action);
|
695 |
-
}
|
696 |
-
return this.close_field();
|
697 |
-
} else {
|
698 |
-
this.container.removeClass('chosen-disabled');
|
699 |
-
this.search_field[0].disabled = false;
|
700 |
-
if (!this.is_multiple) {
|
701 |
-
return this.selected_item.bind("focus.chosen", this.activate_action);
|
702 |
-
}
|
703 |
-
}
|
704 |
-
};
|
705 |
-
|
706 |
-
Chosen.prototype.container_mousedown = function(evt) {
|
707 |
-
if (!this.is_disabled) {
|
708 |
-
if (evt && evt.type === "mousedown" && !this.results_showing) {
|
709 |
-
evt.preventDefault();
|
710 |
-
}
|
711 |
-
if (!((evt != null) && ($(evt.target)).hasClass("search-choice-close"))) {
|
712 |
-
if (!this.active_field) {
|
713 |
-
if (this.is_multiple) {
|
714 |
-
this.search_field.val("");
|
715 |
-
}
|
716 |
-
$(this.container[0].ownerDocument).bind('click.chosen', this.click_test_action);
|
717 |
-
this.results_show();
|
718 |
-
} else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents("a.chosen-single").length)) {
|
719 |
-
evt.preventDefault();
|
720 |
-
this.results_toggle();
|
721 |
-
}
|
722 |
-
return this.activate_field();
|
723 |
-
}
|
724 |
-
}
|
725 |
-
};
|
726 |
-
|
727 |
-
Chosen.prototype.container_mouseup = function(evt) {
|
728 |
-
if (evt.target.nodeName === "ABBR" && !this.is_disabled) {
|
729 |
-
return this.results_reset(evt);
|
730 |
-
}
|
731 |
-
};
|
732 |
-
|
733 |
-
Chosen.prototype.search_results_mousewheel = function(evt) {
|
734 |
-
var delta;
|
735 |
-
if (evt.originalEvent) {
|
736 |
-
delta = -evt.originalEvent.wheelDelta || evt.originalEvent.detail;
|
737 |
-
}
|
738 |
-
if (delta != null) {
|
739 |
-
evt.preventDefault();
|
740 |
-
if (evt.type === 'DOMMouseScroll') {
|
741 |
-
delta = delta * 40;
|
742 |
-
}
|
743 |
-
return this.search_results.scrollTop(delta + this.search_results.scrollTop());
|
744 |
-
}
|
745 |
-
};
|
746 |
-
|
747 |
-
Chosen.prototype.blur_test = function(evt) {
|
748 |
-
if (!this.active_field && this.container.hasClass("chosen-container-active")) {
|
749 |
-
return this.close_field();
|
750 |
-
}
|
751 |
-
};
|
752 |
-
|
753 |
-
Chosen.prototype.close_field = function() {
|
754 |
-
$(this.container[0].ownerDocument).unbind("click.chosen", this.click_test_action);
|
755 |
-
this.active_field = false;
|
756 |
-
this.results_hide();
|
757 |
-
this.container.removeClass("chosen-container-active");
|
758 |
-
this.clear_backstroke();
|
759 |
-
this.show_search_field_default();
|
760 |
-
return this.search_field_scale();
|
761 |
-
};
|
762 |
-
|
763 |
-
Chosen.prototype.activate_field = function() {
|
764 |
-
this.container.addClass("chosen-container-active");
|
765 |
-
this.active_field = true;
|
766 |
-
this.search_field.val(this.search_field.val());
|
767 |
-
return this.search_field.focus();
|
768 |
-
};
|
769 |
-
|
770 |
-
Chosen.prototype.test_active_click = function(evt) {
|
771 |
-
var active_container;
|
772 |
-
active_container = $(evt.target).closest('.chosen-container');
|
773 |
-
if (active_container.length && this.container[0] === active_container[0]) {
|
774 |
-
return this.active_field = true;
|
775 |
-
} else {
|
776 |
-
return this.close_field();
|
777 |
-
}
|
778 |
-
};
|
779 |
-
|
780 |
-
Chosen.prototype.results_build = function() {
|
781 |
-
this.parsing = true;
|
782 |
-
this.selected_option_count = null;
|
783 |
-
this.results_data = SelectParser.select_to_array(this.form_field);
|
784 |
-
if (this.is_multiple) {
|
785 |
-
this.search_choices.find("li.search-choice").remove();
|
786 |
-
} else if (!this.is_multiple) {
|
787 |
-
this.single_set_selected_text();
|
788 |
-
if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) {
|
789 |
-
this.search_field[0].readOnly = true;
|
790 |
-
this.container.addClass("chosen-container-single-nosearch");
|
791 |
-
} else {
|
792 |
-
this.search_field[0].readOnly = false;
|
793 |
-
this.container.removeClass("chosen-container-single-nosearch");
|
794 |
-
}
|
795 |
-
}
|
796 |
-
this.update_results_content(this.results_option_build({
|
797 |
-
first: true
|
798 |
-
}));
|
799 |
-
this.search_field_disabled();
|
800 |
-
this.show_search_field_default();
|
801 |
-
this.search_field_scale();
|
802 |
-
return this.parsing = false;
|
803 |
-
};
|
804 |
-
|
805 |
-
Chosen.prototype.result_do_highlight = function(el) {
|
806 |
-
var high_bottom, high_top, maxHeight, visible_bottom, visible_top;
|
807 |
-
if (el.length) {
|
808 |
-
this.result_clear_highlight();
|
809 |
-
this.result_highlight = el;
|
810 |
-
this.result_highlight.addClass("highlighted");
|
811 |
-
maxHeight = parseInt(this.search_results.css("maxHeight"), 10);
|
812 |
-
visible_top = this.search_results.scrollTop();
|
813 |
-
visible_bottom = maxHeight + visible_top;
|
814 |
-
high_top = this.result_highlight.position().top + this.search_results.scrollTop();
|
815 |
-
high_bottom = high_top + this.result_highlight.outerHeight();
|
816 |
-
if (high_bottom >= visible_bottom) {
|
817 |
-
return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0);
|
818 |
-
} else if (high_top < visible_top) {
|
819 |
-
return this.search_results.scrollTop(high_top);
|
820 |
-
}
|
821 |
-
}
|
822 |
-
};
|
823 |
-
|
824 |
-
Chosen.prototype.result_clear_highlight = function() {
|
825 |
-
if (this.result_highlight) {
|
826 |
-
this.result_highlight.removeClass("highlighted");
|
827 |
-
}
|
828 |
-
return this.result_highlight = null;
|
829 |
-
};
|
830 |
-
|
831 |
-
Chosen.prototype.results_show = function() {
|
832 |
-
if (this.is_multiple && this.max_selected_options <= this.choices_count()) {
|
833 |
-
this.form_field_jq.trigger("chosen:maxselected", {
|
834 |
-
chosen: this
|
835 |
-
});
|
836 |
-
return false;
|
837 |
-
}
|
838 |
-
this.container.addClass("chosen-with-drop");
|
839 |
-
this.results_showing = true;
|
840 |
-
this.search_field.focus();
|
841 |
-
this.search_field.val(this.search_field.val());
|
842 |
-
this.winnow_results();
|
843 |
-
return this.form_field_jq.trigger("chosen:showing_dropdown", {
|
844 |
-
chosen: this
|
845 |
-
});
|
846 |
-
};
|
847 |
-
|
848 |
-
Chosen.prototype.update_results_content = function(content) {
|
849 |
-
return this.search_results.html(content);
|
850 |
-
};
|
851 |
-
|
852 |
-
Chosen.prototype.results_hide = function() {
|
853 |
-
if (this.results_showing) {
|
854 |
-
this.result_clear_highlight();
|
855 |
-
this.container.removeClass("chosen-with-drop");
|
856 |
-
this.form_field_jq.trigger("chosen:hiding_dropdown", {
|
857 |
-
chosen: this
|
858 |
-
});
|
859 |
-
}
|
860 |
-
return this.results_showing = false;
|
861 |
-
};
|
862 |
-
|
863 |
-
Chosen.prototype.set_tab_index = function(el) {
|
864 |
-
var ti;
|
865 |
-
if (this.form_field.tabIndex) {
|
866 |
-
ti = this.form_field.tabIndex;
|
867 |
-
this.form_field.tabIndex = -1;
|
868 |
-
return this.search_field[0].tabIndex = ti;
|
869 |
-
}
|
870 |
-
};
|
871 |
-
|
872 |
-
Chosen.prototype.set_label_behavior = function() {
|
873 |
-
var _this = this;
|
874 |
-
this.form_field_label = this.form_field_jq.parents("label");
|
875 |
-
if (!this.form_field_label.length && this.form_field.id.length) {
|
876 |
-
this.form_field_label = $("label[for='" + this.form_field.id + "']");
|
877 |
-
}
|
878 |
-
if (this.form_field_label.length > 0) {
|
879 |
-
return this.form_field_label.bind('click.chosen', function(evt) {
|
880 |
-
if (_this.is_multiple) {
|
881 |
-
return _this.container_mousedown(evt);
|
882 |
-
} else {
|
883 |
-
return _this.activate_field();
|
884 |
-
}
|
885 |
-
});
|
886 |
-
}
|
887 |
-
};
|
888 |
-
|
889 |
-
Chosen.prototype.show_search_field_default = function() {
|
890 |
-
if (this.is_multiple && this.choices_count() < 1 && !this.active_field) {
|
891 |
-
this.search_field.val(this.default_text);
|
892 |
-
return this.search_field.addClass("default");
|
893 |
-
} else {
|
894 |
-
this.search_field.val("");
|
895 |
-
return this.search_field.removeClass("default");
|
896 |
-
}
|
897 |
-
};
|
898 |
-
|
899 |
-
Chosen.prototype.search_results_mouseup = function(evt) {
|
900 |
-
var target;
|
901 |
-
target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
|
902 |
-
if (target.length) {
|
903 |
-
this.result_highlight = target;
|
904 |
-
this.result_select(evt);
|
905 |
-
return this.search_field.focus();
|
906 |
-
}
|
907 |
-
};
|
908 |
-
|
909 |
-
Chosen.prototype.search_results_mouseover = function(evt) {
|
910 |
-
var target;
|
911 |
-
target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
|
912 |
-
if (target) {
|
913 |
-
return this.result_do_highlight(target);
|
914 |
-
}
|
915 |
-
};
|
916 |
-
|
917 |
-
Chosen.prototype.search_results_mouseout = function(evt) {
|
918 |
-
if ($(evt.target).hasClass("active-result" || $(evt.target).parents('.active-result').first())) {
|
919 |
-
return this.result_clear_highlight();
|
920 |
-
}
|
921 |
-
};
|
922 |
-
|
923 |
-
Chosen.prototype.choice_build = function(item) {
|
924 |
-
var choice, close_link,
|
925 |
-
_this = this;
|
926 |
-
choice = $('<li />', {
|
927 |
-
"class": "search-choice"
|
928 |
-
}).html("<span>" + item.html + "</span>");
|
929 |
-
if (item.disabled) {
|
930 |
-
choice.addClass('search-choice-disabled');
|
931 |
-
} else {
|
932 |
-
close_link = $('<a />', {
|
933 |
-
"class": 'search-choice-close',
|
934 |
-
'data-option-array-index': item.array_index
|
935 |
-
});
|
936 |
-
close_link.bind('click.chosen', function(evt) {
|
937 |
-
return _this.choice_destroy_link_click(evt);
|
938 |
-
});
|
939 |
-
choice.append(close_link);
|
940 |
-
}
|
941 |
-
return this.search_container.before(choice);
|
942 |
-
};
|
943 |
-
|
944 |
-
Chosen.prototype.choice_destroy_link_click = function(evt) {
|
945 |
-
evt.preventDefault();
|
946 |
-
evt.stopPropagation();
|
947 |
-
if (!this.is_disabled) {
|
948 |
-
return this.choice_destroy($(evt.target));
|
949 |
-
}
|
950 |
-
};
|
951 |
-
|
952 |
-
Chosen.prototype.choice_destroy = function(link) {
|
953 |
-
if (this.result_deselect(link[0].getAttribute("data-option-array-index"))) {
|
954 |
-
this.show_search_field_default();
|
955 |
-
if (this.is_multiple && this.choices_count() > 0 && this.search_field.val().length < 1) {
|
956 |
-
this.results_hide();
|
957 |
-
}
|
958 |
-
link.parents('li').first().remove();
|
959 |
-
return this.search_field_scale();
|
960 |
-
}
|
961 |
-
};
|
962 |
-
|
963 |
-
Chosen.prototype.results_reset = function() {
|
964 |
-
this.reset_single_select_options();
|
965 |
-
this.form_field.options[0].selected = true;
|
966 |
-
this.single_set_selected_text();
|
967 |
-
this.show_search_field_default();
|
968 |
-
this.results_reset_cleanup();
|
969 |
-
this.form_field_jq.trigger("change");
|
970 |
-
if (this.active_field) {
|
971 |
-
return this.results_hide();
|
972 |
-
}
|
973 |
-
};
|
974 |
-
|
975 |
-
Chosen.prototype.results_reset_cleanup = function() {
|
976 |
-
this.current_selectedIndex = this.form_field.selectedIndex;
|
977 |
-
return this.selected_item.find("abbr").remove();
|
978 |
-
};
|
979 |
-
|
980 |
-
Chosen.prototype.result_select = function(evt) {
|
981 |
-
var high, item;
|
982 |
-
if (this.result_highlight) {
|
983 |
-
high = this.result_highlight;
|
984 |
-
this.result_clear_highlight();
|
985 |
-
if (this.is_multiple && this.max_selected_options <= this.choices_count()) {
|
986 |
-
this.form_field_jq.trigger("chosen:maxselected", {
|
987 |
-
chosen: this
|
988 |
-
});
|
989 |
-
return false;
|
990 |
-
}
|
991 |
-
if (this.is_multiple) {
|
992 |
-
high.removeClass("active-result");
|
993 |
-
} else {
|
994 |
-
this.reset_single_select_options();
|
995 |
-
}
|
996 |
-
item = this.results_data[high[0].getAttribute("data-option-array-index")];
|
997 |
-
item.selected = true;
|
998 |
-
this.form_field.options[item.options_index].selected = true;
|
999 |
-
this.selected_option_count = null;
|
1000 |
-
if (this.is_multiple) {
|
1001 |
-
this.choice_build(item);
|
1002 |
-
} else {
|
1003 |
-
this.single_set_selected_text(item.text);
|
1004 |
-
}
|
1005 |
-
if (!((evt.metaKey || evt.ctrlKey) && this.is_multiple)) {
|
1006 |
-
this.results_hide();
|
1007 |
-
}
|
1008 |
-
this.search_field.val("");
|
1009 |
-
if (this.is_multiple || this.form_field.selectedIndex !== this.current_selectedIndex) {
|
1010 |
-
this.form_field_jq.trigger("change", {
|
1011 |
-
'selected': this.form_field.options[item.options_index].value
|
1012 |
-
});
|
1013 |
-
}
|
1014 |
-
this.current_selectedIndex = this.form_field.selectedIndex;
|
1015 |
-
return this.search_field_scale();
|
1016 |
-
}
|
1017 |
-
};
|
1018 |
-
|
1019 |
-
Chosen.prototype.single_set_selected_text = function(text) {
|
1020 |
-
if (text == null) {
|
1021 |
-
text = this.default_text;
|
1022 |
-
}
|
1023 |
-
if (text === this.default_text) {
|
1024 |
-
this.selected_item.addClass("chosen-default");
|
1025 |
-
} else {
|
1026 |
-
this.single_deselect_control_build();
|
1027 |
-
this.selected_item.removeClass("chosen-default");
|
1028 |
-
}
|
1029 |
-
return this.selected_item.find("span").text(text);
|
1030 |
-
};
|
1031 |
-
|
1032 |
-
Chosen.prototype.result_deselect = function(pos) {
|
1033 |
-
var result_data;
|
1034 |
-
result_data = this.results_data[pos];
|
1035 |
-
if (!this.form_field.options[result_data.options_index].disabled) {
|
1036 |
-
result_data.selected = false;
|
1037 |
-
this.form_field.options[result_data.options_index].selected = false;
|
1038 |
-
this.selected_option_count = null;
|
1039 |
-
this.result_clear_highlight();
|
1040 |
-
if (this.results_showing) {
|
1041 |
-
this.winnow_results();
|
1042 |
-
}
|
1043 |
-
this.form_field_jq.trigger("change", {
|
1044 |
-
deselected: this.form_field.options[result_data.options_index].value
|
1045 |
-
});
|
1046 |
-
this.search_field_scale();
|
1047 |
-
return true;
|
1048 |
-
} else {
|
1049 |
-
return false;
|
1050 |
-
}
|
1051 |
-
};
|
1052 |
-
|
1053 |
-
Chosen.prototype.single_deselect_control_build = function() {
|
1054 |
-
if (!this.allow_single_deselect) {
|
1055 |
-
return;
|
1056 |
-
}
|
1057 |
-
if (!this.selected_item.find("abbr").length) {
|
1058 |
-
this.selected_item.find("span").first().after("<abbr class=\"search-choice-close\"></abbr>");
|
1059 |
-
}
|
1060 |
-
return this.selected_item.addClass("chosen-single-with-deselect");
|
1061 |
-
};
|
1062 |
-
|
1063 |
-
Chosen.prototype.get_search_text = function() {
|
1064 |
-
if (this.search_field.val() === this.default_text) {
|
1065 |
-
return "";
|
1066 |
-
} else {
|
1067 |
-
return $('<div/>').text($.trim(this.search_field.val())).html();
|
1068 |
-
}
|
1069 |
-
};
|
1070 |
-
|
1071 |
-
Chosen.prototype.winnow_results_set_highlight = function() {
|
1072 |
-
var do_high, selected_results;
|
1073 |
-
selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : [];
|
1074 |
-
do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first();
|
1075 |
-
if (do_high != null) {
|
1076 |
-
return this.result_do_highlight(do_high);
|
1077 |
-
}
|
1078 |
-
};
|
1079 |
-
|
1080 |
-
Chosen.prototype.no_results = function(terms) {
|
1081 |
-
var no_results_html;
|
1082 |
-
no_results_html = $('<li class="no-results">' + this.results_none_found + ' "<span></span>"</li>');
|
1083 |
-
no_results_html.find("span").first().html(terms);
|
1084 |
-
this.search_results.append(no_results_html);
|
1085 |
-
return this.form_field_jq.trigger("chosen:no_results", {
|
1086 |
-
chosen: this
|
1087 |
-
});
|
1088 |
-
};
|
1089 |
-
|
1090 |
-
Chosen.prototype.no_results_clear = function() {
|
1091 |
-
return this.search_results.find(".no-results").remove();
|
1092 |
-
};
|
1093 |
-
|
1094 |
-
Chosen.prototype.keydown_arrow = function() {
|
1095 |
-
var next_sib;
|
1096 |
-
if (this.results_showing && this.result_highlight) {
|
1097 |
-
next_sib = this.result_highlight.nextAll("li.active-result").first();
|
1098 |
-
if (next_sib) {
|
1099 |
-
return this.result_do_highlight(next_sib);
|
1100 |
-
}
|
1101 |
-
} else {
|
1102 |
-
return this.results_show();
|
1103 |
-
}
|
1104 |
-
};
|
1105 |
-
|
1106 |
-
Chosen.prototype.keyup_arrow = function() {
|
1107 |
-
var prev_sibs;
|
1108 |
-
if (!this.results_showing && !this.is_multiple) {
|
1109 |
-
return this.results_show();
|
1110 |
-
} else if (this.result_highlight) {
|
1111 |
-
prev_sibs = this.result_highlight.prevAll("li.active-result");
|
1112 |
-
if (prev_sibs.length) {
|
1113 |
-
return this.result_do_highlight(prev_sibs.first());
|
1114 |
-
} else {
|
1115 |
-
if (this.choices_count() > 0) {
|
1116 |
-
this.results_hide();
|
1117 |
-
}
|
1118 |
-
return this.result_clear_highlight();
|
1119 |
-
}
|
1120 |
-
}
|
1121 |
-
};
|
1122 |
-
|
1123 |
-
Chosen.prototype.keydown_backstroke = function() {
|
1124 |
-
var next_available_destroy;
|
1125 |
-
if (this.pending_backstroke) {
|
1126 |
-
this.choice_destroy(this.pending_backstroke.find("a").first());
|
1127 |
-
return this.clear_backstroke();
|
1128 |
-
} else {
|
1129 |
-
next_available_destroy = this.search_container.siblings("li.search-choice").last();
|
1130 |
-
if (next_available_destroy.length && !next_available_destroy.hasClass("search-choice-disabled")) {
|
1131 |
-
this.pending_backstroke = next_available_destroy;
|
1132 |
-
if (this.single_backstroke_delete) {
|
1133 |
-
return this.keydown_backstroke();
|
1134 |
-
} else {
|
1135 |
-
return this.pending_backstroke.addClass("search-choice-focus");
|
1136 |
-
}
|
1137 |
-
}
|
1138 |
-
}
|
1139 |
-
};
|
1140 |
-
|
1141 |
-
Chosen.prototype.clear_backstroke = function() {
|
1142 |
-
if (this.pending_backstroke) {
|
1143 |
-
this.pending_backstroke.removeClass("search-choice-focus");
|
1144 |
-
}
|
1145 |
-
return this.pending_backstroke = null;
|
1146 |
-
};
|
1147 |
-
|
1148 |
-
Chosen.prototype.keydown_checker = function(evt) {
|
1149 |
-
var stroke, _ref1;
|
1150 |
-
stroke = (_ref1 = evt.which) != null ? _ref1 : evt.keyCode;
|
1151 |
-
this.search_field_scale();
|
1152 |
-
if (stroke !== 8 && this.pending_backstroke) {
|
1153 |
-
this.clear_backstroke();
|
1154 |
-
}
|
1155 |
-
switch (stroke) {
|
1156 |
-
case 8:
|
1157 |
-
this.backstroke_length = this.search_field.val().length;
|
1158 |
-
break;
|
1159 |
-
case 9:
|
1160 |
-
if (this.results_showing && !this.is_multiple) {
|
1161 |
-
this.result_select(evt);
|
1162 |
-
}
|
1163 |
-
this.mouse_on_container = false;
|
1164 |
-
break;
|
1165 |
-
case 13:
|
1166 |
-
evt.preventDefault();
|
1167 |
-
break;
|
1168 |
-
case 38:
|
1169 |
-
evt.preventDefault();
|
1170 |
-
this.keyup_arrow();
|
1171 |
-
break;
|
1172 |
-
case 40:
|
1173 |
-
evt.preventDefault();
|
1174 |
-
this.keydown_arrow();
|
1175 |
-
break;
|
1176 |
-
}
|
1177 |
-
};
|
1178 |
-
|
1179 |
-
Chosen.prototype.search_field_scale = function() {
|
1180 |
-
var div, f_width, h, style, style_block, styles, w, _i, _len;
|
1181 |
-
if (this.is_multiple) {
|
1182 |
-
h = 0;
|
1183 |
-
w = 0;
|
1184 |
-
style_block = "position:absolute; left: -1000px; top: -1000px; display:none;";
|
1185 |
-
styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing'];
|
1186 |
-
for (_i = 0, _len = styles.length; _i < _len; _i++) {
|
1187 |
-
style = styles[_i];
|
1188 |
-
style_block += style + ":" + this.search_field.css(style) + ";";
|
1189 |
-
}
|
1190 |
-
div = $('<div />', {
|
1191 |
-
'style': style_block
|
1192 |
-
});
|
1193 |
-
div.text(this.search_field.val());
|
1194 |
-
$('body').append(div);
|
1195 |
-
w = div.width() + 25;
|
1196 |
-
div.remove();
|
1197 |
-
f_width = this.container.outerWidth();
|
1198 |
-
if (w > f_width - 10) {
|
1199 |
-
w = f_width - 10;
|
1200 |
-
}
|
1201 |
-
return this.search_field.css({
|
1202 |
-
'width': w + 'px'
|
1203 |
-
});
|
1204 |
-
}
|
1205 |
-
};
|
1206 |
-
|
1207 |
-
return Chosen;
|
1208 |
-
|
1209 |
-
})(AbstractChosen);
|
1210 |
-
|
1211 |
-
}).call(this);
|
1 |
+
/*!
|
2 |
+
Chosen, a Select Box Enhancer for jQuery and Prototype
|
3 |
+
by Patrick Filler for Harvest, http://getharvest.com
|
4 |
+
|
5 |
+
Version 1.1.0
|
6 |
+
Full source at https://github.com/harvesthq/chosen
|
7 |
+
Copyright (c) 2011 Harvest http://getharvest.com
|
8 |
+
|
9 |
+
MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
|
10 |
+
This file is generated by `grunt build`, do not edit it by hand.
|
11 |
+
*/
|
12 |
+
|
13 |
+
(function() {
|
14 |
+
var $, AbstractChosen, Chosen, SelectParser, _ref,
|
15 |
+
__hasProp = {}.hasOwnProperty,
|
16 |
+
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
|
17 |
+
|
18 |
+
SelectParser = (function() {
|
19 |
+
function SelectParser() {
|
20 |
+
this.options_index = 0;
|
21 |
+
this.parsed = [];
|
22 |
+
}
|
23 |
+
|
24 |
+
SelectParser.prototype.add_node = function(child) {
|
25 |
+
if (child.nodeName.toUpperCase() === "OPTGROUP") {
|
26 |
+
return this.add_group(child);
|
27 |
+
} else {
|
28 |
+
return this.add_option(child);
|
29 |
+
}
|
30 |
+
};
|
31 |
+
|
32 |
+
SelectParser.prototype.add_group = function(group) {
|
33 |
+
var group_position, option, _i, _len, _ref, _results;
|
34 |
+
group_position = this.parsed.length;
|
35 |
+
this.parsed.push({
|
36 |
+
array_index: group_position,
|
37 |
+
group: true,
|
38 |
+
label: this.escapeExpression(group.label),
|
39 |
+
children: 0,
|
40 |
+
disabled: group.disabled
|
41 |
+
});
|
42 |
+
_ref = group.childNodes;
|
43 |
+
_results = [];
|
44 |
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
45 |
+
option = _ref[_i];
|
46 |
+
_results.push(this.add_option(option, group_position, group.disabled));
|
47 |
+
}
|
48 |
+
return _results;
|
49 |
+
};
|
50 |
+
|
51 |
+
SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
|
52 |
+
if (option.nodeName.toUpperCase() === "OPTION") {
|
53 |
+
if (option.text !== "") {
|
54 |
+
if (group_position != null) {
|
55 |
+
this.parsed[group_position].children += 1;
|
56 |
+
}
|
57 |
+
this.parsed.push({
|
58 |
+
array_index: this.parsed.length,
|
59 |
+
options_index: this.options_index,
|
60 |
+
value: option.value,
|
61 |
+
text: option.text,
|
62 |
+
html: option.innerHTML,
|
63 |
+
selected: option.selected,
|
64 |
+
disabled: group_disabled === true ? group_disabled : option.disabled,
|
65 |
+
group_array_index: group_position,
|
66 |
+
classes: option.className,
|
67 |
+
style: option.style.cssText
|
68 |
+
});
|
69 |
+
} else {
|
70 |
+
this.parsed.push({
|
71 |
+
array_index: this.parsed.length,
|
72 |
+
options_index: this.options_index,
|
73 |
+
empty: true
|
74 |
+
});
|
75 |
+
}
|
76 |
+
return this.options_index += 1;
|
77 |
+
}
|
78 |
+
};
|
79 |
+
|
80 |
+
SelectParser.prototype.escapeExpression = function(text) {
|
81 |
+
var map, unsafe_chars;
|
82 |
+
if ((text == null) || text === false) {
|
83 |
+
return "";
|
84 |
+
}
|
85 |
+
if (!/[\&\<\>\"\'\`]/.test(text)) {
|
86 |
+
return text;
|
87 |
+
}
|
88 |
+
map = {
|
89 |
+
"<": "<",
|
90 |
+
">": ">",
|
91 |
+
'"': """,
|
92 |
+
"'": "'",
|
93 |
+
"`": "`"
|
94 |
+
};
|
95 |
+
unsafe_chars = /&(?!\w+;)|[\<\>\"\'\`]/g;
|
96 |
+
return text.replace(unsafe_chars, function(chr) {
|
97 |
+
return map[chr] || "&";
|
98 |
+
});
|
99 |
+
};
|
100 |
+
|
101 |
+
return SelectParser;
|
102 |
+
|
103 |
+
})();
|
104 |
+
|
105 |
+
SelectParser.select_to_array = function(select) {
|
106 |
+
var child, parser, _i, _len, _ref;
|
107 |
+
parser = new SelectParser();
|
108 |
+
_ref = select.childNodes;
|
109 |
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
110 |
+
child = _ref[_i];
|
111 |
+
parser.add_node(child);
|
112 |
+
}
|
113 |
+
return parser.parsed;
|
114 |
+
};
|
115 |
+
|
116 |
+
AbstractChosen = (function() {
|
117 |
+
function AbstractChosen(form_field, options) {
|
118 |
+
this.form_field = form_field;
|
119 |
+
this.options = options != null ? options : {};
|
120 |
+
if (!AbstractChosen.browser_is_supported()) {
|
121 |
+
return;
|
122 |
+
}
|
123 |
+
this.is_multiple = this.form_field.multiple;
|
124 |
+
this.set_default_text();
|
125 |
+
this.set_default_values();
|
126 |
+
this.setup();
|
127 |
+
this.set_up_html();
|
128 |
+
this.register_observers();
|
129 |
+
}
|
130 |
+
|
131 |
+
AbstractChosen.prototype.set_default_values = function() {
|
132 |
+
var _this = this;
|
133 |
+
this.click_test_action = function(evt) {
|
134 |
+
return _this.test_active_click(evt);
|
135 |
+
};
|
136 |
+
this.activate_action = function(evt) {
|
137 |
+
return _this.activate_field(evt);
|
138 |
+
};
|
139 |
+
this.active_field = false;
|
140 |
+
this.mouse_on_container = false;
|
141 |
+
this.results_showing = false;
|
142 |
+
this.result_highlighted = null;
|
143 |
+
this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false;
|
144 |
+
this.disable_search_threshold = this.options.disable_search_threshold || 0;
|
145 |
+
this.disable_search = this.options.disable_search || false;
|
146 |
+
this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true;
|
147 |
+
this.group_search = this.options.group_search != null ? this.options.group_search : true;
|
148 |
+
this.search_contains = this.options.search_contains || false;
|
149 |
+
this.single_backstroke_delete = this.options.single_backstroke_delete != null ? this.options.single_backstroke_delete : true;
|
150 |
+
this.max_selected_options = this.options.max_selected_options || Infinity;
|
151 |
+
this.inherit_select_classes = this.options.inherit_select_classes || false;
|
152 |
+
this.display_selected_options = this.options.display_selected_options != null ? this.options.display_selected_options : true;
|
153 |
+
return this.display_disabled_options = this.options.display_disabled_options != null ? this.options.display_disabled_options : true;
|
154 |
+
};
|
155 |
+
|
156 |
+
AbstractChosen.prototype.set_default_text = function() {
|
157 |
+
if (this.form_field.getAttribute("data-placeholder")) {
|
158 |
+
this.default_text = this.form_field.getAttribute("data-placeholder");
|
159 |
+
} else if (this.is_multiple) {
|
160 |
+
this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || AbstractChosen.default_multiple_text;
|
161 |
+
} else {
|
162 |
+
this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || AbstractChosen.default_single_text;
|
163 |
+
}
|
164 |
+
return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || this.options.no_results_text || AbstractChosen.default_no_result_text;
|
165 |
+
};
|
166 |
+
|
167 |
+
AbstractChosen.prototype.mouse_enter = function() {
|
168 |
+
return this.mouse_on_container = true;
|
169 |
+
};
|
170 |
+
|
171 |
+
AbstractChosen.prototype.mouse_leave = function() {
|
172 |
+
return this.mouse_on_container = false;
|
173 |
+
};
|
174 |
+
|
175 |
+
AbstractChosen.prototype.input_focus = function(evt) {
|
176 |
+
var _this = this;
|
177 |
+
if (this.is_multiple) {
|
178 |
+
if (!this.active_field) {
|
179 |
+
return setTimeout((function() {
|
180 |
+
return _this.container_mousedown();
|
181 |
+
}), 50);
|
182 |
+
}
|
183 |
+
} else {
|
184 |
+
if (!this.active_field) {
|
185 |
+
return this.activate_field();
|
186 |
+
}
|
187 |
+
}
|
188 |
+
};
|
189 |
+
|
190 |
+
AbstractChosen.prototype.input_blur = function(evt) {
|
191 |
+
var _this = this;
|
192 |
+
if (!this.mouse_on_container) {
|
193 |
+
this.active_field = false;
|
194 |
+
return setTimeout((function() {
|
195 |
+
return _this.blur_test();
|
196 |
+
}), 100);
|
197 |
+
}
|
198 |
+
};
|
199 |
+
|
200 |
+
AbstractChosen.prototype.results_option_build = function(options) {
|
201 |
+
var content, data, _i, _len, _ref;
|
202 |
+
content = '';
|
203 |
+
_ref = this.results_data;
|
204 |
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
205 |
+
data = _ref[_i];
|
206 |
+
if (data.group) {
|
207 |
+
content += this.result_add_group(data);
|
208 |
+
} else {
|
209 |
+
content += this.result_add_option(data);
|
210 |
+
}
|
211 |
+
if (options != null ? options.first : void 0) {
|
212 |
+
if (data.selected && this.is_multiple) {
|
213 |
+
this.choice_build(data);
|
214 |
+
} else if (data.selected && !this.is_multiple) {
|
215 |
+
this.single_set_selected_text(data.text);
|
216 |
+
}
|
217 |
+
}
|
218 |
+
}
|
219 |
+
return content;
|
220 |
+
};
|
221 |
+
|
222 |
+
AbstractChosen.prototype.result_add_option = function(option) {
|
223 |
+
var classes, option_el;
|
224 |
+
if (!option.search_match) {
|
225 |
+
return '';
|
226 |
+
}
|
227 |
+
if (!this.include_option_in_results(option)) {
|
228 |
+
return '';
|
229 |
+
}
|
230 |
+
classes = [];
|
231 |
+
if (!option.disabled && !(option.selected && this.is_multiple)) {
|
232 |
+
classes.push("active-result");
|
233 |
+
}
|
234 |
+
if (option.disabled && !(option.selected && this.is_multiple)) {
|
235 |
+
classes.push("disabled-result");
|
236 |
+
}
|
237 |
+
if (option.selected) {
|
238 |
+
classes.push("result-selected");
|
239 |
+
}
|
240 |
+
if (option.group_array_index != null) {
|
241 |
+
classes.push("group-option");
|
242 |
+
}
|
243 |
+
if (option.classes !== "") {
|
244 |
+
classes.push(option.classes);
|
245 |
+
}
|
246 |
+
option_el = document.createElement("li");
|
247 |
+
option_el.className = classes.join(" ");
|
248 |
+
option_el.style.cssText = option.style;
|
249 |
+
option_el.setAttribute("data-option-array-index", option.array_index);
|
250 |
+
option_el.innerHTML = option.search_text;
|
251 |
+
return this.outerHTML(option_el);
|
252 |
+
};
|
253 |
+
|
254 |
+
AbstractChosen.prototype.result_add_group = function(group) {
|
255 |
+
var group_el;
|
256 |
+
if (!(group.search_match || group.group_match)) {
|
257 |
+
return '';
|
258 |
+
}
|
259 |
+
if (!(group.active_options > 0)) {
|
260 |
+
return '';
|
261 |
+
}
|
262 |
+
group_el = document.createElement("li");
|
263 |
+
group_el.className = "group-result";
|
264 |
+
group_el.innerHTML = group.search_text;
|
265 |
+
return this.outerHTML(group_el);
|
266 |
+
};
|
267 |
+
|
268 |
+
AbstractChosen.prototype.results_update_field = function() {
|
269 |
+
this.set_default_text();
|
270 |
+
if (!this.is_multiple) {
|
271 |
+
this.results_reset_cleanup();
|
272 |
+
}
|
273 |
+
this.result_clear_highlight();
|
274 |
+
this.results_build();
|
275 |
+
if (this.results_showing) {
|
276 |
+
return this.winnow_results();
|
277 |
+
}
|
278 |
+
};
|
279 |
+
|
280 |
+
AbstractChosen.prototype.reset_single_select_options = function() {
|
281 |
+
var result, _i, _len, _ref, _results;
|
282 |
+
_ref = this.results_data;
|
283 |
+
_results = [];
|
284 |
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
285 |
+
result = _ref[_i];
|
286 |
+
if (result.selected) {
|
287 |
+
_results.push(result.selected = false);
|
288 |
+
} else {
|
289 |
+
_results.push(void 0);
|
290 |
+
}
|
291 |
+
}
|
292 |
+
return _results;
|
293 |
+
};
|
294 |
+
|
295 |
+
AbstractChosen.prototype.results_toggle = function() {
|
296 |
+
if (this.results_showing) {
|
297 |
+
return this.results_hide();
|
298 |
+
} else {
|
299 |
+
return this.results_show();
|
300 |
+
}
|
301 |
+
};
|
302 |
+
|
303 |
+
AbstractChosen.prototype.results_search = function(evt) {
|
304 |
+
if (this.results_showing) {
|
305 |
+
return this.winnow_results();
|
306 |
+
} else {
|
307 |
+
return this.results_show();
|
308 |
+
}
|
309 |
+
};
|
310 |
+
|
311 |
+
AbstractChosen.prototype.winnow_results = function() {
|
312 |
+
var escapedSearchText, option, regex, regexAnchor, results, results_group, searchText, startpos, text, zregex, _i, _len, _ref;
|
313 |
+
this.no_results_clear();
|
314 |
+
results = 0;
|
315 |
+
searchText = this.get_search_text();
|
316 |
+
escapedSearchText = searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
|
317 |
+
regexAnchor = this.search_contains ? "" : "^";
|
318 |
+
regex = new RegExp(regexAnchor + escapedSearchText, 'i');
|
319 |
+
zregex = new RegExp(escapedSearchText, 'i');
|
320 |
+
_ref = this.results_data;
|
321 |
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
322 |
+
option = _ref[_i];
|
323 |
+
option.search_match = false;
|
324 |
+
results_group = null;
|
325 |
+
if (this.include_option_in_results(option)) {
|
326 |
+
if (option.group) {
|
327 |
+
option.group_match = false;
|
328 |
+
option.active_options = 0;
|
329 |
+
}
|
330 |
+
if ((option.group_array_index != null) && this.results_data[option.group_array_index]) {
|
331 |
+
results_group = this.results_data[option.group_array_index];
|
332 |
+
if (results_group.active_options === 0 && results_group.search_match) {
|
333 |
+
results += 1;
|
334 |
+
}
|
335 |
+
results_group.active_options += 1;
|
336 |
+
}
|
337 |
+
if (!(option.group && !this.group_search)) {
|
338 |
+
option.search_text = option.group ? option.label : option.html;
|
339 |
+
option.search_match = this.search_string_match(option.search_text, regex);
|
340 |
+
if (option.search_match && !option.group) {
|
341 |
+
results += 1;
|
342 |
+
}
|
343 |
+
if (option.search_match) {
|
344 |
+
if (searchText.length) {
|
345 |
+
startpos = option.search_text.search(zregex);
|
346 |
+
text = option.search_text.substr(0, startpos + searchText.length) + '</em>' + option.search_text.substr(startpos + searchText.length);
|
347 |
+
option.search_text = text.substr(0, startpos) + '<em>' + text.substr(startpos);
|
348 |
+
}
|
349 |
+
if (results_group != null) {
|
350 |
+
results_group.group_match = true;
|
351 |
+
}
|
352 |
+
} else if ((option.group_array_index != null) && this.results_data[option.group_array_index].search_match) {
|
353 |
+
option.search_match = true;
|
354 |
+
}
|
355 |
+
}
|
356 |
+
}
|
357 |
+
}
|
358 |
+
this.result_clear_highlight();
|
359 |
+
if (results < 1 && searchText.length) {
|
360 |
+
this.update_results_content("");
|
361 |
+
return this.no_results(searchText);
|
362 |
+
} else {
|
363 |
+
this.update_results_content(this.results_option_build());
|
364 |
+
return this.winnow_results_set_highlight();
|
365 |
+
}
|
366 |
+
};
|
367 |
+
|
368 |
+
AbstractChosen.prototype.search_string_match = function(search_string, regex) {
|
369 |
+
var part, parts, _i, _len;
|
370 |
+
if (regex.test(search_string)) {
|
371 |
+
return true;
|
372 |
+
} else if (this.enable_split_word_search && (search_string.indexOf(" ") >= 0 || search_string.indexOf("[") === 0)) {
|
373 |
+
parts = search_string.replace(/\[|\]/g, "").split(" ");
|
374 |
+
if (parts.length) {
|
375 |
+
for (_i = 0, _len = parts.length; _i < _len; _i++) {
|
376 |
+
part = parts[_i];
|
377 |
+
if (regex.test(part)) {
|
378 |
+
return true;
|
379 |
+
}
|
380 |
+
}
|
381 |
+
}
|
382 |
+
}
|
383 |
+
};
|
384 |
+
|
385 |
+
AbstractChosen.prototype.choices_count = function() {
|
386 |
+
var option, _i, _len, _ref;
|
387 |
+
if (this.selected_option_count != null) {
|
388 |
+
return this.selected_option_count;
|
389 |
+
}
|
390 |
+
this.selected_option_count = 0;
|
391 |
+
_ref = this.form_field.options;
|
392 |
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
393 |
+
option = _ref[_i];
|
394 |
+
if (option.selected) {
|
395 |
+
this.selected_option_count += 1;
|
396 |
+
}
|
397 |
+
}
|
398 |
+
return this.selected_option_count;
|
399 |
+
};
|
400 |
+
|
401 |
+
AbstractChosen.prototype.choices_click = function(evt) {
|
402 |
+
evt.preventDefault();
|
403 |
+
if (!(this.results_showing || this.is_disabled)) {
|
404 |
+
return this.results_show();
|
405 |
+
}
|
406 |
+
};
|
407 |
+
|
408 |
+
AbstractChosen.prototype.keyup_checker = function(evt) {
|
409 |
+
var stroke, _ref;
|
410 |
+
stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
|
411 |
+
this.search_field_scale();
|
412 |
+
switch (stroke) {
|
413 |
+
case 8:
|
414 |
+
if (this.is_multiple && this.backstroke_length < 1 && this.choices_count() > 0) {
|
415 |
+
return this.keydown_backstroke();
|
416 |
+
} else if (!this.pending_backstroke) {
|
417 |
+
this.result_clear_highlight();
|
418 |
+
return this.results_search();
|
419 |
+
}
|
420 |
+
break;
|
421 |
+
case 13:
|
422 |
+
evt.preventDefault();
|
423 |
+
if (this.results_showing) {
|
424 |
+
return this.result_select(evt);
|
425 |
+
}
|
426 |
+
break;
|
427 |
+
case 27:
|
428 |
+
if (this.results_showing) {
|
429 |
+
this.results_hide();
|
430 |
+
}
|
431 |
+
return true;
|
432 |
+
case 9:
|
433 |
+
case 38:
|
434 |
+
case 40:
|
435 |
+
case 16:
|
436 |
+
case 91:
|
437 |
+
case 17:
|
438 |
+
break;
|
439 |
+
default:
|
440 |
+
return this.results_search();
|
441 |
+
}
|
442 |
+
};
|
443 |
+
|
444 |
+
AbstractChosen.prototype.clipboard_event_checker = function(evt) {
|
445 |
+
var _this = this;
|
446 |
+
return setTimeout((function() {
|
447 |
+
return _this.results_search();
|
448 |
+
}), 50);
|
449 |
+
};
|
450 |
+
|
451 |
+
AbstractChosen.prototype.container_width = function() {
|
452 |
+
if (this.options.width != null) {
|
453 |
+
return this.options.width;
|
454 |
+
} else {
|
455 |
+
return "" + this.form_field.offsetWidth + "px";
|
456 |
+
}
|
457 |
+
};
|
458 |
+
|
459 |
+
AbstractChosen.prototype.include_option_in_results = function(option) {
|
460 |
+
if (this.is_multiple && (!this.display_selected_options && option.selected)) {
|
461 |
+
return false;
|
462 |
+
}
|
463 |
+
if (!this.display_disabled_options && option.disabled) {
|
464 |
+
return false;
|
465 |
+
}
|
466 |
+
if (option.empty) {
|
467 |
+
return false;
|
468 |
+
}
|
469 |
+
return true;
|
470 |
+
};
|
471 |
+
|
472 |
+
AbstractChosen.prototype.search_results_touchstart = function(evt) {
|
473 |
+
this.touch_started = true;
|
474 |
+
return this.search_results_mouseover(evt);
|
475 |
+
};
|
476 |
+
|
477 |
+
AbstractChosen.prototype.search_results_touchmove = function(evt) {
|
478 |
+
this.touch_started = false;
|
479 |
+
return this.search_results_mouseout(evt);
|
480 |
+
};
|
481 |
+
|
482 |
+
AbstractChosen.prototype.search_results_touchend = function(evt) {
|
483 |
+
if (this.touch_started) {
|
484 |
+
return this.search_results_mouseup(evt);
|
485 |
+
}
|
486 |
+
};
|
487 |
+
|
488 |
+
AbstractChosen.prototype.outerHTML = function(element) {
|
489 |
+
var tmp;
|
490 |
+
if (element.outerHTML) {
|
491 |
+
return element.outerHTML;
|
492 |
+
}
|
493 |
+
tmp = document.createElement("div");
|
494 |
+
tmp.appendChild(element);
|
495 |
+
return tmp.innerHTML;
|
496 |
+
};
|
497 |
+
|
498 |
+
AbstractChosen.browser_is_supported = function() {
|
499 |
+
if (window.navigator.appName === "Microsoft Internet Explorer") {
|
500 |
+
return document.documentMode >= 8;
|
501 |
+
}
|
502 |
+
if (/iP(od|hone)/i.test(window.navigator.userAgent)) {
|
503 |
+
return false;
|
504 |
+
}
|
505 |
+
if (/Android/i.test(window.navigator.userAgent)) {
|
506 |
+
if (/Mobile/i.test(window.navigator.userAgent)) {
|
507 |
+
return false;
|
508 |
+
}
|
509 |
+
}
|
510 |
+
return true;
|
511 |
+
};
|
512 |
+
|
513 |
+
AbstractChosen.default_multiple_text = "Select Some Options";
|
514 |
+
|
515 |
+
AbstractChosen.default_single_text = "Select an Option";
|
516 |
+
|
517 |
+
AbstractChosen.default_no_result_text = "No results match";
|
518 |
+
|
519 |
+
return AbstractChosen;
|
520 |
+
|
521 |
+
})();
|
522 |
+
|
523 |
+
$ = jQuery;
|
524 |
+
|
525 |
+
$.fn.extend({
|
526 |
+
chosen: function(options) {
|
527 |
+
if (!AbstractChosen.browser_is_supported()) {
|
528 |
+
return this;
|
529 |
+
}
|
530 |
+
return this.each(function(input_field) {
|
531 |
+
var $this, chosen;
|
532 |
+
$this = $(this);
|
533 |
+
chosen = $this.data('chosen');
|
534 |
+
if (options === 'destroy' && chosen) {
|
535 |
+
chosen.destroy();
|
536 |
+
} else if (!chosen) {
|
537 |
+
$this.data('chosen', new Chosen(this, options));
|
538 |
+
}
|
539 |
+
});
|
540 |
+
}
|
541 |
+
});
|
542 |
+
|
543 |
+
Chosen = (function(_super) {
|
544 |
+
__extends(Chosen, _super);
|
545 |
+
|
546 |
+
function Chosen() {
|
547 |
+
_ref = Chosen.__super__.constructor.apply(this, arguments);
|
548 |
+
return _ref;
|
549 |
+
}
|
550 |
+
|
551 |
+
Chosen.prototype.setup = function() {
|
552 |
+
this.form_field_jq = $(this.form_field);
|
553 |
+
this.current_selectedIndex = this.form_field.selectedIndex;
|
554 |
+
return this.is_rtl = this.form_field_jq.hasClass("chosen-rtl");
|
555 |
+
};
|
556 |
+
|
557 |
+
Chosen.prototype.set_up_html = function() {
|
558 |
+
var container_classes, container_props;
|
559 |
+
container_classes = ["chosen-container"];
|
560 |
+
container_classes.push("chosen-container-" + (this.is_multiple ? "multi" : "single"));
|
561 |
+
if (this.inherit_select_classes && this.form_field.className) {
|
562 |
+
container_classes.push(this.form_field.className);
|
563 |
+
}
|
564 |
+
if (this.is_rtl) {
|
565 |
+
container_classes.push("chosen-rtl");
|
566 |
+
}
|
567 |
+
container_props = {
|
568 |
+
'class': container_classes.join(' '),
|
569 |
+
'style': "width: " + (this.container_width()) + ";",
|
570 |
+
'title': this.form_field.title
|
571 |
+
};
|
572 |
+
if (this.form_field.id.length) {
|
573 |
+
container_props.id = this.form_field.id.replace(/[^\w]/g, '_') + "_chosen";
|
574 |
+
}
|
575 |
+
this.container = $("<div />", container_props);
|
576 |
+
if (this.is_multiple) {
|
577 |
+
this.container.html('<ul class="chosen-choices"><li class="search-field"><input type="text" value="' + this.default_text + '" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chosen-drop"><ul class="chosen-results"></ul></div>');
|
578 |
+
} else {
|
579 |
+
this.container.html('<a class="chosen-single chosen-default" tabindex="-1"><span>' + this.default_text + '</span><div><b></b></div></a><div class="chosen-drop"><div class="chosen-search"><input type="text" autocomplete="off" /></div><ul class="chosen-results"></ul></div>');
|
580 |
+
}
|
581 |
+
this.form_field_jq.hide().after(this.container);
|
582 |
+
this.dropdown = this.container.find('div.chosen-drop').first();
|
583 |
+
this.search_field = this.container.find('input').first();
|
584 |
+
this.search_results = this.container.find('ul.chosen-results').first();
|
585 |
+
this.search_field_scale();
|
586 |
+
this.search_no_results = this.container.find('li.no-results').first();
|
587 |
+
if (this.is_multiple) {
|
588 |
+
this.search_choices = this.container.find('ul.chosen-choices').first();
|
589 |
+
this.search_container = this.container.find('li.search-field').first();
|
590 |
+
} else {
|
591 |
+
this.search_container = this.container.find('div.chosen-search').first();
|
592 |
+
this.selected_item = this.container.find('.chosen-single').first();
|
593 |
+
}
|
594 |
+
this.results_build();
|
595 |
+
this.set_tab_index();
|
596 |
+
this.set_label_behavior();
|
597 |
+
return this.form_field_jq.trigger("chosen:ready", {
|
598 |
+
chosen: this
|
599 |
+
});
|
600 |
+
};
|
601 |
+
|
602 |
+
Chosen.prototype.register_observers = function() {
|
603 |
+
var _this = this;
|
604 |
+
this.container.bind('mousedown.chosen', function(evt) {
|
605 |
+
_this.container_mousedown(evt);
|
606 |
+
});
|
607 |
+
this.container.bind('mouseup.chosen', function(evt) {
|
608 |
+
_this.container_mouseup(evt);
|
609 |
+
});
|
610 |
+
this.container.bind('mouseenter.chosen', function(evt) {
|
611 |
+
_this.mouse_enter(evt);
|
612 |
+
});
|
613 |
+
this.container.bind('mouseleave.chosen', function(evt) {
|
614 |
+
_this.mouse_leave(evt);
|
615 |
+
});
|
616 |
+
this.search_results.bind('mouseup.chosen', function(evt) {
|
617 |
+
_this.search_results_mouseup(evt);
|
618 |
+
});
|
619 |
+
this.search_results.bind('mouseover.chosen', function(evt) {
|
620 |
+
_this.search_results_mouseover(evt);
|
621 |
+
});
|
622 |
+
this.search_results.bind('mouseout.chosen', function(evt) {
|
623 |
+
_this.search_results_mouseout(evt);
|
624 |
+
});
|
625 |
+
this.search_results.bind('mousewheel.chosen DOMMouseScroll.chosen', function(evt) {
|
626 |
+
_this.search_results_mousewheel(evt);
|
627 |
+
});
|
628 |
+
this.search_results.bind('touchstart.chosen', function(evt) {
|
629 |
+
_this.search_results_touchstart(evt);
|
630 |
+
});
|
631 |
+
this.search_results.bind('touchmove.chosen', function(evt) {
|
632 |
+
_this.search_results_touchmove(evt);
|
633 |
+
});
|
634 |
+
this.search_results.bind('touchend.chosen', function(evt) {
|
635 |
+
_this.search_results_touchend(evt);
|
636 |
+
});
|
637 |
+
this.form_field_jq.bind("chosen:updated.chosen", function(evt) {
|
638 |
+
_this.results_update_field(evt);
|
639 |
+
});
|
640 |
+
this.form_field_jq.bind("chosen:activate.chosen", function(evt) {
|
641 |
+
_this.activate_field(evt);
|
642 |
+
});
|
643 |
+
this.form_field_jq.bind("chosen:open.chosen", function(evt) {
|
644 |
+
_this.container_mousedown(evt);
|
645 |
+
});
|
646 |
+
this.form_field_jq.bind("chosen:close.chosen", function(evt) {
|
647 |
+
_this.input_blur(evt);
|
648 |
+
});
|
649 |
+
this.search_field.bind('blur.chosen', function(evt) {
|
650 |
+
_this.input_blur(evt);
|
651 |
+
});
|
652 |
+
this.search_field.bind('keyup.chosen', function(evt) {
|
653 |
+
_this.keyup_checker(evt);
|
654 |
+
});
|
655 |
+
this.search_field.bind('keydown.chosen', function(evt) {
|
656 |
+
_this.keydown_checker(evt);
|
657 |
+
});
|
658 |
+
this.search_field.bind('focus.chosen', function(evt) {
|
659 |
+
_this.input_focus(evt);
|
660 |
+
});
|
661 |
+
this.search_field.bind('cut.chosen', function(evt) {
|
662 |
+
_this.clipboard_event_checker(evt);
|
663 |
+
});
|
664 |
+
this.search_field.bind('paste.chosen', function(evt) {
|
665 |
+
_this.clipboard_event_checker(evt);
|
666 |
+
});
|
667 |
+
if (this.is_multiple) {
|
668 |
+
return this.search_choices.bind('click.chosen', function(evt) {
|
669 |
+
_this.choices_click(evt);
|
670 |
+
});
|
671 |
+
} else {
|
672 |
+
return this.container.bind('click.chosen', function(evt) {
|
673 |
+
evt.preventDefault();
|
674 |
+
});
|
675 |
+
}
|
676 |
+
};
|
677 |
+
|
678 |
+
Chosen.prototype.destroy = function() {
|
679 |
+
$(this.container[0].ownerDocument).unbind("click.chosen", this.click_test_action);
|
680 |
+
if (this.search_field[0].tabIndex) {
|
681 |
+
this.form_field_jq[0].tabIndex = this.search_field[0].tabIndex;
|
682 |
+
}
|
683 |
+
this.container.remove();
|
684 |
+
this.form_field_jq.removeData('chosen');
|
685 |
+
return this.form_field_jq.show();
|
686 |
+
};
|
687 |
+
|
688 |
+
Chosen.prototype.search_field_disabled = function() {
|
689 |
+
this.is_disabled = this.form_field_jq[0].disabled;
|
690 |
+
if (this.is_disabled) {
|
691 |
+
this.container.addClass('chosen-disabled');
|
692 |
+
this.search_field[0].disabled = true;
|
693 |
+
if (!this.is_multiple) {
|
694 |
+
this.selected_item.unbind("focus.chosen", this.activate_action);
|
695 |
+
}
|
696 |
+
return this.close_field();
|
697 |
+
} else {
|
698 |
+
this.container.removeClass('chosen-disabled');
|
699 |
+
this.search_field[0].disabled = false;
|
700 |
+
if (!this.is_multiple) {
|
701 |
+
return this.selected_item.bind("focus.chosen", this.activate_action);
|
702 |
+
}
|
703 |
+
}
|
704 |
+
};
|
705 |
+
|
706 |
+
Chosen.prototype.container_mousedown = function(evt) {
|
707 |
+
if (!this.is_disabled) {
|
708 |
+
if (evt && evt.type === "mousedown" && !this.results_showing) {
|
709 |
+
evt.preventDefault();
|
710 |
+
}
|
711 |
+
if (!((evt != null) && ($(evt.target)).hasClass("search-choice-close"))) {
|
712 |
+
if (!this.active_field) {
|
713 |
+
if (this.is_multiple) {
|
714 |
+
this.search_field.val("");
|
715 |
+
}
|
716 |
+
$(this.container[0].ownerDocument).bind('click.chosen', this.click_test_action);
|
717 |
+
this.results_show();
|
718 |
+
} else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents("a.chosen-single").length)) {
|
719 |
+
evt.preventDefault();
|
720 |
+
this.results_toggle();
|
721 |
+
}
|
722 |
+
return this.activate_field();
|
723 |
+
}
|
724 |
+
}
|
725 |
+
};
|
726 |
+
|
727 |
+
Chosen.prototype.container_mouseup = function(evt) {
|
728 |
+
if (evt.target.nodeName === "ABBR" && !this.is_disabled) {
|
729 |
+
return this.results_reset(evt);
|
730 |
+
}
|
731 |
+
};
|
732 |
+
|
733 |
+
Chosen.prototype.search_results_mousewheel = function(evt) {
|
734 |
+
var delta;
|
735 |
+
if (evt.originalEvent) {
|
736 |
+
delta = -evt.originalEvent.wheelDelta || evt.originalEvent.detail;
|
737 |
+
}
|
738 |
+
if (delta != null) {
|
739 |
+
evt.preventDefault();
|
740 |
+
if (evt.type === 'DOMMouseScroll') {
|
741 |
+
delta = delta * 40;
|
742 |
+
}
|
743 |
+
return this.search_results.scrollTop(delta + this.search_results.scrollTop());
|
744 |
+
}
|
745 |
+
};
|
746 |
+
|
747 |
+
Chosen.prototype.blur_test = function(evt) {
|
748 |
+
if (!this.active_field && this.container.hasClass("chosen-container-active")) {
|
749 |
+
return this.close_field();
|
750 |
+
}
|
751 |
+
};
|
752 |
+
|
753 |
+
Chosen.prototype.close_field = function() {
|
754 |
+
$(this.container[0].ownerDocument).unbind("click.chosen", this.click_test_action);
|
755 |
+
this.active_field = false;
|
756 |
+
this.results_hide();
|
757 |
+
this.container.removeClass("chosen-container-active");
|
758 |
+
this.clear_backstroke();
|
759 |
+
this.show_search_field_default();
|
760 |
+
return this.search_field_scale();
|
761 |
+
};
|
762 |
+
|
763 |
+
Chosen.prototype.activate_field = function() {
|
764 |
+
this.container.addClass("chosen-container-active");
|
765 |
+
this.active_field = true;
|
766 |
+
this.search_field.val(this.search_field.val());
|
767 |
+
return this.search_field.focus();
|
768 |
+
};
|
769 |
+
|
770 |
+
Chosen.prototype.test_active_click = function(evt) {
|
771 |
+
var active_container;
|
772 |
+
active_container = $(evt.target).closest('.chosen-container');
|
773 |
+
if (active_container.length && this.container[0] === active_container[0]) {
|
774 |
+
return this.active_field = true;
|
775 |
+
} else {
|
776 |
+
return this.close_field();
|
777 |
+
}
|
778 |
+
};
|
779 |
+
|
780 |
+
Chosen.prototype.results_build = function() {
|
781 |
+
this.parsing = true;
|
782 |
+
this.selected_option_count = null;
|
783 |
+
this.results_data = SelectParser.select_to_array(this.form_field);
|
784 |
+
if (this.is_multiple) {
|
785 |
+
this.search_choices.find("li.search-choice").remove();
|
786 |
+
} else if (!this.is_multiple) {
|
787 |
+
this.single_set_selected_text();
|
788 |
+
if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) {
|
789 |
+
this.search_field[0].readOnly = true;
|
790 |
+
this.container.addClass("chosen-container-single-nosearch");
|
791 |
+
} else {
|
792 |
+
this.search_field[0].readOnly = false;
|
793 |
+
this.container.removeClass("chosen-container-single-nosearch");
|
794 |
+
}
|
795 |
+
}
|
796 |
+
this.update_results_content(this.results_option_build({
|
797 |
+
first: true
|
798 |
+
}));
|
799 |
+
this.search_field_disabled();
|
800 |
+
this.show_search_field_default();
|
801 |
+
this.search_field_scale();
|
802 |
+
return this.parsing = false;
|
803 |
+
};
|
804 |
+
|
805 |
+
Chosen.prototype.result_do_highlight = function(el) {
|
806 |
+
var high_bottom, high_top, maxHeight, visible_bottom, visible_top;
|
807 |
+
if (el.length) {
|
808 |
+
this.result_clear_highlight();
|
809 |
+
this.result_highlight = el;
|
810 |
+
this.result_highlight.addClass("highlighted");
|
811 |
+
maxHeight = parseInt(this.search_results.css("maxHeight"), 10);
|
812 |
+
visible_top = this.search_results.scrollTop();
|
813 |
+
visible_bottom = maxHeight + visible_top;
|
814 |
+
high_top = this.result_highlight.position().top + this.search_results.scrollTop();
|
815 |
+
high_bottom = high_top + this.result_highlight.outerHeight();
|
816 |
+
if (high_bottom >= visible_bottom) {
|
817 |
+
return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0);
|
818 |
+
} else if (high_top < visible_top) {
|
819 |
+
return this.search_results.scrollTop(high_top);
|
820 |
+
}
|
821 |
+
}
|
822 |
+
};
|
823 |
+
|
824 |
+
Chosen.prototype.result_clear_highlight = function() {
|
825 |
+
if (this.result_highlight) {
|
826 |
+
this.result_highlight.removeClass("highlighted");
|
827 |
+
}
|
828 |
+
return this.result_highlight = null;
|
829 |
+
};
|
830 |
+
|
831 |
+
Chosen.prototype.results_show = function() {
|
832 |
+
if (this.is_multiple && this.max_selected_options <= this.choices_count()) {
|
833 |
+
this.form_field_jq.trigger("chosen:maxselected", {
|
834 |
+
chosen: this
|
835 |
+
});
|
836 |
+
return false;
|
837 |
+
}
|
838 |
+
this.container.addClass("chosen-with-drop");
|
839 |
+
this.results_showing = true;
|
840 |
+
this.search_field.focus();
|
841 |
+
this.search_field.val(this.search_field.val());
|
842 |
+
this.winnow_results();
|
843 |
+
return this.form_field_jq.trigger("chosen:showing_dropdown", {
|
844 |
+
chosen: this
|
845 |
+
});
|
846 |
+
};
|
847 |
+
|
848 |
+
Chosen.prototype.update_results_content = function(content) {
|
849 |
+
return this.search_results.html(content);
|
850 |
+
};
|
851 |
+
|
852 |
+
Chosen.prototype.results_hide = function() {
|
853 |
+
if (this.results_showing) {
|
854 |
+
this.result_clear_highlight();
|
855 |
+
this.container.removeClass("chosen-with-drop");
|
856 |
+
this.form_field_jq.trigger("chosen:hiding_dropdown", {
|
857 |
+
chosen: this
|
858 |
+
});
|
859 |
+
}
|
860 |
+
return this.results_showing = false;
|
861 |
+
};
|
862 |
+
|
863 |
+
Chosen.prototype.set_tab_index = function(el) {
|
864 |
+
var ti;
|
865 |
+
if (this.form_field.tabIndex) {
|
866 |
+
ti = this.form_field.tabIndex;
|
867 |
+
this.form_field.tabIndex = -1;
|
868 |
+
return this.search_field[0].tabIndex = ti;
|
869 |
+
}
|
870 |
+
};
|
871 |
+
|
872 |
+
Chosen.prototype.set_label_behavior = function() {
|
873 |
+
var _this = this;
|
874 |
+
this.form_field_label = this.form_field_jq.parents("label");
|
875 |
+
if (!this.form_field_label.length && this.form_field.id.length) {
|
876 |
+
this.form_field_label = $("label[for='" + this.form_field.id + "']");
|
877 |
+
}
|
878 |
+
if (this.form_field_label.length > 0) {
|
879 |
+
return this.form_field_label.bind('click.chosen', function(evt) {
|
880 |
+
if (_this.is_multiple) {
|
881 |
+
return _this.container_mousedown(evt);
|
882 |
+
} else {
|
883 |
+
return _this.activate_field();
|
884 |
+
}
|
885 |
+
});
|
886 |
+
}
|
887 |
+
};
|
888 |
+
|
889 |
+
Chosen.prototype.show_search_field_default = function() {
|
890 |
+
if (this.is_multiple && this.choices_count() < 1 && !this.active_field) {
|
891 |
+
this.search_field.val(this.default_text);
|
892 |
+
return this.search_field.addClass("default");
|
893 |
+
} else {
|
894 |
+
this.search_field.val("");
|
895 |
+
return this.search_field.removeClass("default");
|
896 |
+
}
|
897 |
+
};
|
898 |
+
|
899 |
+
Chosen.prototype.search_results_mouseup = function(evt) {
|
900 |
+
var target;
|
901 |
+
target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
|
902 |
+
if (target.length) {
|
903 |
+
this.result_highlight = target;
|
904 |
+
this.result_select(evt);
|
905 |
+
return this.search_field.focus();
|
906 |
+
}
|
907 |
+
};
|
908 |
+
|
909 |
+
Chosen.prototype.search_results_mouseover = function(evt) {
|
910 |
+
var target;
|
911 |
+
target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
|
912 |
+
if (target) {
|
913 |
+
return this.result_do_highlight(target);
|
914 |
+
}
|
915 |
+
};
|
916 |
+
|
917 |
+
Chosen.prototype.search_results_mouseout = function(evt) {
|
918 |
+
if ($(evt.target).hasClass("active-result" || $(evt.target).parents('.active-result').first())) {
|
919 |
+
return this.result_clear_highlight();
|
920 |
+
}
|
921 |
+
};
|
922 |
+
|
923 |
+
Chosen.prototype.choice_build = function(item) {
|
924 |
+
var choice, close_link,
|
925 |
+
_this = this;
|
926 |
+
choice = $('<li />', {
|
927 |
+
"class": "search-choice"
|
928 |
+
}).html("<span>" + item.html + "</span>");
|
929 |
+
if (item.disabled) {
|
930 |
+
choice.addClass('search-choice-disabled');
|
931 |
+
} else {
|
932 |
+
close_link = $('<a />', {
|
933 |
+
"class": 'search-choice-close',
|
934 |
+
'data-option-array-index': item.array_index
|
935 |
+
});
|
936 |
+
close_link.bind('click.chosen', function(evt) {
|
937 |
+
return _this.choice_destroy_link_click(evt);
|
938 |
+
});
|
939 |
+
choice.append(close_link);
|
940 |
+
}
|
941 |
+
return this.search_container.before(choice);
|
942 |
+
};
|
943 |
+
|
944 |
+
Chosen.prototype.choice_destroy_link_click = function(evt) {
|
945 |
+
evt.preventDefault();
|
946 |
+
evt.stopPropagation();
|
947 |
+
if (!this.is_disabled) {
|
948 |
+
return this.choice_destroy($(evt.target));
|
949 |
+
}
|
950 |
+
};
|
951 |
+
|
952 |
+
Chosen.prototype.choice_destroy = function(link) {
|
953 |
+
if (this.result_deselect(link[0].getAttribute("data-option-array-index"))) {
|
954 |
+
this.show_search_field_default();
|
955 |
+
if (this.is_multiple && this.choices_count() > 0 && this.search_field.val().length < 1) {
|
956 |
+
this.results_hide();
|
957 |
+
}
|
958 |
+
link.parents('li').first().remove();
|
959 |
+
return this.search_field_scale();
|
960 |
+
}
|
961 |
+
};
|
962 |
+
|
963 |
+
Chosen.prototype.results_reset = function() {
|
964 |
+
this.reset_single_select_options();
|
965 |
+
this.form_field.options[0].selected = true;
|
966 |
+
this.single_set_selected_text();
|
967 |
+
this.show_search_field_default();
|
968 |
+
this.results_reset_cleanup();
|
969 |
+
this.form_field_jq.trigger("change");
|
970 |
+
if (this.active_field) {
|
971 |
+
return this.results_hide();
|
972 |
+
}
|
973 |
+
};
|
974 |
+
|
975 |
+
Chosen.prototype.results_reset_cleanup = function() {
|
976 |
+
this.current_selectedIndex = this.form_field.selectedIndex;
|
977 |
+
return this.selected_item.find("abbr").remove();
|
978 |
+
};
|
979 |
+
|
980 |
+
Chosen.prototype.result_select = function(evt) {
|
981 |
+
var high, item;
|
982 |
+
if (this.result_highlight) {
|
983 |
+
high = this.result_highlight;
|
984 |
+
this.result_clear_highlight();
|
985 |
+
if (this.is_multiple && this.max_selected_options <= this.choices_count()) {
|
986 |
+
this.form_field_jq.trigger("chosen:maxselected", {
|
987 |
+
chosen: this
|
988 |
+
});
|
989 |
+
return false;
|
990 |
+
}
|
991 |
+
if (this.is_multiple) {
|
992 |
+
high.removeClass("active-result");
|
993 |
+
} else {
|
994 |
+
this.reset_single_select_options();
|
995 |
+
}
|
996 |
+
item = this.results_data[high[0].getAttribute("data-option-array-index")];
|
997 |
+
item.selected = true;
|
998 |
+
this.form_field.options[item.options_index].selected = true;
|
999 |
+
this.selected_option_count = null;
|
1000 |
+
if (this.is_multiple) {
|
1001 |
+
this.choice_build(item);
|
1002 |
+
} else {
|
1003 |
+
this.single_set_selected_text(item.text);
|
1004 |
+
}
|
1005 |
+
if (!((evt.metaKey || evt.ctrlKey) && this.is_multiple)) {
|
1006 |
+
this.results_hide();
|
1007 |
+
}
|
1008 |
+
this.search_field.val("");
|
1009 |
+
if (this.is_multiple || this.form_field.selectedIndex !== this.current_selectedIndex) {
|
1010 |
+
this.form_field_jq.trigger("change", {
|
1011 |
+
'selected': this.form_field.options[item.options_index].value
|
1012 |
+
});
|
1013 |
+
}
|
1014 |
+
this.current_selectedIndex = this.form_field.selectedIndex;
|
1015 |
+
return this.search_field_scale();
|
1016 |
+
}
|
1017 |
+
};
|
1018 |
+
|
1019 |
+
Chosen.prototype.single_set_selected_text = function(text) {
|
1020 |
+
if (text == null) {
|
1021 |
+
text = this.default_text;
|
1022 |
+
}
|
1023 |
+
if (text === this.default_text) {
|
1024 |
+
this.selected_item.addClass("chosen-default");
|
1025 |
+
} else {
|
1026 |
+
this.single_deselect_control_build();
|
1027 |
+
this.selected_item.removeClass("chosen-default");
|
1028 |
+
}
|
1029 |
+
return this.selected_item.find("span").text(text);
|
1030 |
+
};
|
1031 |
+
|
1032 |
+
Chosen.prototype.result_deselect = function(pos) {
|
1033 |
+
var result_data;
|
1034 |
+
result_data = this.results_data[pos];
|
1035 |
+
if (!this.form_field.options[result_data.options_index].disabled) {
|
1036 |
+
result_data.selected = false;
|
1037 |
+
this.form_field.options[result_data.options_index].selected = false;
|
1038 |
+
this.selected_option_count = null;
|
1039 |
+
this.result_clear_highlight();
|
1040 |
+
if (this.results_showing) {
|
1041 |
+
this.winnow_results();
|
1042 |
+
}
|
1043 |
+
this.form_field_jq.trigger("change", {
|
1044 |
+
deselected: this.form_field.options[result_data.options_index].value
|
1045 |
+
});
|
1046 |
+
this.search_field_scale();
|
1047 |
+
return true;
|
1048 |
+
} else {
|
1049 |
+
return false;
|
1050 |
+
}
|
1051 |
+
};
|
1052 |
+
|
1053 |
+
Chosen.prototype.single_deselect_control_build = function() {
|
1054 |
+
if (!this.allow_single_deselect) {
|
1055 |
+
return;
|
1056 |
+
}
|
1057 |
+
if (!this.selected_item.find("abbr").length) {
|
1058 |
+
this.selected_item.find("span").first().after("<abbr class=\"search-choice-close\"></abbr>");
|
1059 |
+
}
|
1060 |
+
return this.selected_item.addClass("chosen-single-with-deselect");
|
1061 |
+
};
|
1062 |
+
|
1063 |
+
Chosen.prototype.get_search_text = function() {
|
1064 |
+
if (this.search_field.val() === this.default_text) {
|
1065 |
+
return "";
|
1066 |
+
} else {
|
1067 |
+
return $('<div/>').text($.trim(this.search_field.val())).html();
|
1068 |
+
}
|
1069 |
+
};
|
1070 |
+
|
1071 |
+
Chosen.prototype.winnow_results_set_highlight = function() {
|
1072 |
+
var do_high, selected_results;
|
1073 |
+
selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : [];
|
1074 |
+
do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first();
|
1075 |
+
if (do_high != null) {
|
1076 |
+
return this.result_do_highlight(do_high);
|
1077 |
+
}
|
1078 |
+
};
|
1079 |
+
|
1080 |
+
Chosen.prototype.no_results = function(terms) {
|
1081 |
+
var no_results_html;
|
1082 |
+
no_results_html = $('<li class="no-results">' + this.results_none_found + ' "<span></span>"</li>');
|
1083 |
+
no_results_html.find("span").first().html(terms);
|
1084 |
+
this.search_results.append(no_results_html);
|
1085 |
+
return this.form_field_jq.trigger("chosen:no_results", {
|
1086 |
+
chosen: this
|
1087 |
+
});
|
1088 |
+
};
|
1089 |
+
|
1090 |
+
Chosen.prototype.no_results_clear = function() {
|
1091 |
+
return this.search_results.find(".no-results").remove();
|
1092 |
+
};
|
1093 |
+
|
1094 |
+
Chosen.prototype.keydown_arrow = function() {
|
1095 |
+
var next_sib;
|
1096 |
+
if (this.results_showing && this.result_highlight) {
|
1097 |
+
next_sib = this.result_highlight.nextAll("li.active-result").first();
|
1098 |
+
if (next_sib) {
|
1099 |
+
return this.result_do_highlight(next_sib);
|
1100 |
+
}
|
1101 |
+
} else {
|
1102 |
+
return this.results_show();
|
1103 |
+
}
|
1104 |
+
};
|
1105 |
+
|
1106 |
+
Chosen.prototype.keyup_arrow = function() {
|
1107 |
+
var prev_sibs;
|
1108 |
+
if (!this.results_showing && !this.is_multiple) {
|
1109 |
+
return this.results_show();
|
1110 |
+
} else if (this.result_highlight) {
|
1111 |
+
prev_sibs = this.result_highlight.prevAll("li.active-result");
|
1112 |
+
if (prev_sibs.length) {
|
1113 |
+
return this.result_do_highlight(prev_sibs.first());
|
1114 |
+
} else {
|
1115 |
+
if (this.choices_count() > 0) {
|
1116 |
+
this.results_hide();
|
1117 |
+
}
|
1118 |
+
return this.result_clear_highlight();
|
1119 |
+
}
|
1120 |
+
}
|
1121 |
+
};
|
1122 |
+
|
1123 |
+
Chosen.prototype.keydown_backstroke = function() {
|
1124 |
+
var next_available_destroy;
|
1125 |
+
if (this.pending_backstroke) {
|
1126 |
+
this.choice_destroy(this.pending_backstroke.find("a").first());
|
1127 |
+
return this.clear_backstroke();
|
1128 |
+
} else {
|
1129 |
+
next_available_destroy = this.search_container.siblings("li.search-choice").last();
|
1130 |
+
if (next_available_destroy.length && !next_available_destroy.hasClass("search-choice-disabled")) {
|
1131 |
+
this.pending_backstroke = next_available_destroy;
|
1132 |
+
if (this.single_backstroke_delete) {
|
1133 |
+
return this.keydown_backstroke();
|
1134 |
+
} else {
|
1135 |
+
return this.pending_backstroke.addClass("search-choice-focus");
|
1136 |
+
}
|
1137 |
+
}
|
1138 |
+
}
|
1139 |
+
};
|
1140 |
+
|
1141 |
+
Chosen.prototype.clear_backstroke = function() {
|
1142 |
+
if (this.pending_backstroke) {
|
1143 |
+
this.pending_backstroke.removeClass("search-choice-focus");
|
1144 |
+
}
|
1145 |
+
return this.pending_backstroke = null;
|
1146 |
+
};
|
1147 |
+
|
1148 |
+
Chosen.prototype.keydown_checker = function(evt) {
|
1149 |
+
var stroke, _ref1;
|
1150 |
+
stroke = (_ref1 = evt.which) != null ? _ref1 : evt.keyCode;
|
1151 |
+
this.search_field_scale();
|
1152 |
+
if (stroke !== 8 && this.pending_backstroke) {
|
1153 |
+
this.clear_backstroke();
|
1154 |
+
}
|
1155 |
+
switch (stroke) {
|
1156 |
+
case 8:
|
1157 |
+
this.backstroke_length = this.search_field.val().length;
|
1158 |
+
break;
|
1159 |
+
case 9:
|
1160 |
+
if (this.results_showing && !this.is_multiple) {
|
1161 |
+
this.result_select(evt);
|
1162 |
+
}
|
1163 |
+
this.mouse_on_container = false;
|
1164 |
+
break;
|
1165 |
+
case 13:
|
1166 |
+
evt.preventDefault();
|
1167 |
+
break;
|
1168 |
+
case 38:
|
1169 |
+
evt.preventDefault();
|
1170 |
+
this.keyup_arrow();
|
1171 |
+
break;
|
1172 |
+
case 40:
|
1173 |
+
evt.preventDefault();
|
1174 |
+
this.keydown_arrow();
|
1175 |
+
break;
|
1176 |
+
}
|
1177 |
+
};
|
1178 |
+
|
1179 |
+
Chosen.prototype.search_field_scale = function() {
|
1180 |
+
var div, f_width, h, style, style_block, styles, w, _i, _len;
|
1181 |
+
if (this.is_multiple) {
|
1182 |
+
h = 0;
|
1183 |
+
w = 0;
|
1184 |
+
style_block = "position:absolute; left: -1000px; top: -1000px; display:none;";
|
1185 |
+
styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing'];
|
1186 |
+
for (_i = 0, _len = styles.length; _i < _len; _i++) {
|
1187 |
+
style = styles[_i];
|
1188 |
+
style_block += style + ":" + this.search_field.css(style) + ";";
|
1189 |
+
}
|
1190 |
+
div = $('<div />', {
|
1191 |
+
'style': style_block
|
1192 |
+
});
|
1193 |
+
div.text(this.search_field.val());
|
1194 |
+
$('body').append(div);
|
1195 |
+
w = div.width() + 25;
|
1196 |
+
div.remove();
|
1197 |
+
f_width = this.container.outerWidth();
|
1198 |
+
if (w > f_width - 10) {
|
1199 |
+
w = f_width - 10;
|
1200 |
+
}
|
1201 |
+
return this.search_field.css({
|
1202 |
+
'width': w + 'px'
|
1203 |
+
});
|
1204 |
+
}
|
1205 |
+
};
|
1206 |
+
|
1207 |
+
return Chosen;
|
1208 |
+
|
1209 |
+
})(AbstractChosen);
|
1210 |
+
|
1211 |
+
}).call(this);
|
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/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/metabox.js
CHANGED
@@ -1,355 +1,355 @@
|
|
1 |
-
/**
|
2 |
-
* This file belongs to the YIT Framework.
|
3 |
-
*
|
4 |
-
* This source file is subject to the GNU GENERAL PUBLIC LICENSE (GPL 3.0)
|
5 |
-
* that is bundled with this package in the file LICENSE.txt.
|
6 |
-
* It is also available through the world-wide-web at this URL:
|
7 |
-
* http://www.gnu.org/licenses/gpl-3.0.txt
|
8 |
-
*/
|
9 |
-
(function ($) {
|
10 |
-
|
11 |
-
$('.metaboxes-tab').each(function () {
|
12 |
-
$('.tabs-panel', this).hide();
|
13 |
-
|
14 |
-
var active_tab = wpCookies.get('active_metabox_tab');
|
15 |
-
if (active_tab == null) {
|
16 |
-
active_tab = $('ul.metaboxes-tabs li:first-child a', this).attr('href');
|
17 |
-
} else {
|
18 |
-
active_tab = '#' + active_tab;
|
19 |
-
}
|
20 |
-
|
21 |
-
$(active_tab).show();
|
22 |
-
|
23 |
-
$('.metaboxes-tabs a', this).click(function (e) {
|
24 |
-
if ($(this).parent().hasClass('tabs')) {
|
25 |
-
e.preventDefault();
|
26 |
-
return;
|
27 |
-
}
|
28 |
-
|
29 |
-
var t = $(this).attr('href');
|
30 |
-
$(this).parent().addClass('tabs').siblings('li').removeClass('tabs');
|
31 |
-
$(this).closest('.metaboxes-tab').find('.tabs-panel').slideUp('fast');
|
32 |
-
$(t).delay(350).slideDown('fast');
|
33 |
-
|
34 |
-
return false;
|
35 |
-
});
|
36 |
-
});
|
37 |
-
|
38 |
-
//upload
|
39 |
-
var _custom_media = true,
|
40 |
-
_orig_send_attachment = wp.media.editor.send.attachment;
|
41 |
-
|
42 |
-
$(document).on('click', '.metaboxes-tab .upload_button', function(e) {
|
43 |
-
var send_attachment_bkp = wp.media.editor.send.attachment;
|
44 |
-
var button = $(this);
|
45 |
-
if( typeof button.attr('id') != 'undefined' ) {
|
46 |
-
|
47 |
-
var id = button.attr('id').replace('-button', '');
|
48 |
-
_custom_media = true;
|
49 |
-
wp.media.editor.send.attachment = function(props, attachment){
|
50 |
-
if ( _custom_media ) {
|
51 |
-
if( $("#"+id).is('input[type=text]') ) {
|
52 |
-
$("#"+id).val(attachment.url);
|
53 |
-
} else {
|
54 |
-
$("#"+id + '_custom').val(attachment.url);
|
55 |
-
}
|
56 |
-
} else {
|
57 |
-
return _orig_send_attachment.apply( this, [props, attachment] );
|
58 |
-
};
|
59 |
-
}
|
60 |
-
|
61 |
-
wp.media.editor.open(button);
|
62 |
-
return false;
|
63 |
-
}
|
64 |
-
|
65 |
-
});
|
66 |
-
|
67 |
-
$('.metaboxes-tab .add_media').on('click', function(){
|
68 |
-
_custom_media = false;
|
69 |
-
});
|
70 |
-
|
71 |
-
//colorpicker
|
72 |
-
$('.metaboxes-tab .panel-colorpicker').wpColorPicker({
|
73 |
-
onInit: function(){ console.log('test');},
|
74 |
-
change: function(event, ui){
|
75 |
-
},
|
76 |
-
clear: function(){
|
77 |
-
var input = $(this);
|
78 |
-
input.val(input.data('default-color'));
|
79 |
-
input.change();
|
80 |
-
}
|
81 |
-
});
|
82 |
-
|
83 |
-
|
84 |
-
$('.metaboxes-tab .panel-colorpicker').each( function() {
|
85 |
-
var select_label = $(this).data('variations-label');
|
86 |
-
$(this).parent().parent().find('a.wp-color-result').attr('title', select_label);
|
87 |
-
});
|
88 |
-
|
89 |
-
//datepicker
|
90 |
-
$('.metaboxes-tab .panel-datepicker').each( function() {
|
91 |
-
$(this).datepicker();
|
92 |
-
});
|
93 |
-
|
94 |
-
|
95 |
-
// select
|
96 |
-
var select_value = function() {
|
97 |
-
var value = '';
|
98 |
-
|
99 |
-
if( $(this).attr('multiple')){
|
100 |
-
$(this).children("option:selected").each(function(i,v){
|
101 |
-
if( i != 0)
|
102 |
-
value += ', ';
|
103 |
-
|
104 |
-
value += $(v).text();
|
105 |
-
});
|
106 |
-
|
107 |
-
if( value == '' ){
|
108 |
-
$(this).children().children("option:selected").each(function(i,v){
|
109 |
-
if( i != 0)
|
110 |
-
value += ', ';
|
111 |
-
|
112 |
-
value += $(v).text();
|
113 |
-
});
|
114 |
-
}
|
115 |
-
}
|
116 |
-
else{
|
117 |
-
value = $(this).children("option:selected").text();
|
118 |
-
|
119 |
-
if( value == '' )
|
120 |
-
value = $(this).children().children("option:selected").text();
|
121 |
-
}
|
122 |
-
|
123 |
-
|
124 |
-
if ( $(this).parent().find('span').length <= 0 ) {
|
125 |
-
$(this).before('<span></span>');
|
126 |
-
}
|
127 |
-
|
128 |
-
$(this).parent().children('span').replaceWith('<span>'+value +'</span>');
|
129 |
-
};
|
130 |
-
$('.metaboxes-tab .select_wrapper select').not('.chosen').each(select_value).change(select_value);
|
131 |
-
|
132 |
-
//Open select multiple
|
133 |
-
$('.metaboxes-tab .select_wrapper').click( function(e){
|
134 |
-
e.stopPropagation();
|
135 |
-
$(this).find('select[multiple]').not('.chosen').toggle();
|
136 |
-
});
|
137 |
-
//Stops click propagation on select, to prevent select hide
|
138 |
-
$('.metaboxes-tab .select_wrapper select[multiple]').not('.chosen').click( function(e){
|
139 |
-
e.stopPropagation();
|
140 |
-
});
|
141 |
-
//Hides select on window click
|
142 |
-
$(window).click(function(){
|
143 |
-
$('.metaboxes-tab .select_wrapper select[multiple]').not('.chosen').hide();
|
144 |
-
})
|
145 |
-
|
146 |
-
//chosen
|
147 |
-
$('.metaboxes-tab .chosen .select_wrapper select').chosen();
|
148 |
-
|
149 |
-
|
150 |
-
$('.metaboxes-tab .slider_container .ui-slider-horizontal').each(function(){
|
151 |
-
var val = $(this).data('val');
|
152 |
-
var minValue = $(this).data('min');
|
153 |
-
var maxValue = $(this).data('max');
|
154 |
-
var step = $(this).data('step');
|
155 |
-
var labels = $(this).data('labels');
|
156 |
-
|
157 |
-
$(this).slider({
|
158 |
-
value: val,
|
159 |
-
min: minValue,
|
160 |
-
max: maxValue,
|
161 |
-
range: 'min',
|
162 |
-
step: step,
|
163 |
-
|
164 |
-
slide: function( event, ui ) {
|
165 |
-
$(this).find('input').val( ui.value );
|
166 |
-
$(this).siblings('.feedback').find('strong' ).text( ui.value + labels );
|
167 |
-
}
|
168 |
-
});
|
169 |
-
});
|
170 |
-
|
171 |
-
|
172 |
-
var act_page_option = $('#_active_page_options-container').parent().html();
|
173 |
-
$('#_active_page_options-container').parent().remove();
|
174 |
-
$(act_page_option).insertAfter('#yit-post-setting .handlediv');
|
175 |
-
$(act_page_option).insertAfter('#yit-page-setting .handlediv');
|
176 |
-
|
177 |
-
|
178 |
-
$('#_active_page_options-container').on('click', function(){
|
179 |
-
if( $('#_active_page_options').is(":checked") ){
|
180 |
-
$('#yit-page-setting .inside .metaboxes-tab, #yit-post-setting .inside .metaboxes-tab').css( { 'opacity' : 1 , 'pointer-events' : 'auto' } );
|
181 |
-
}else{
|
182 |
-
$('#yit-page-setting .inside .metaboxes-tab, #yit-post-setting .inside .metaboxes-tab').css( { 'opacity' : 0.5 , 'pointer-events' : 'none' } );
|
183 |
-
}
|
184 |
-
}).click();
|
185 |
-
|
186 |
-
|
187 |
-
//dependencies handler
|
188 |
-
$('.metaboxes-tab [data-field]').each(function(){
|
189 |
-
var t = $(this);
|
190 |
-
|
191 |
-
var field = '#' + t.data('field'),
|
192 |
-
dep = '#' + t.data('dep'),
|
193 |
-
value = t.data('value');
|
194 |
-
|
195 |
-
|
196 |
-
dependencies_handler( field, dep, value.toString() );
|
197 |
-
|
198 |
-
$(dep).on('change', function(){
|
199 |
-
dependencies_handler( field, dep, value.toString() );
|
200 |
-
}).change();
|
201 |
-
});
|
202 |
-
|
203 |
-
//Handle dependencies.
|
204 |
-
function dependencies_handler ( id, deps, values ) {
|
205 |
-
var result = true;
|
206 |
-
|
207 |
-
|
208 |
-
//Single dependency
|
209 |
-
if( typeof( deps ) == 'string' ) {
|
210 |
-
if( deps.substr( 0, 6 ) == ':radio' )
|
211 |
-
{deps = deps + ':checked'; }
|
212 |
-
|
213 |
-
var val = $( deps ).val();
|
214 |
-
|
215 |
-
if( $(deps).attr('type') == 'checkbox'){
|
216 |
-
var thisCheck = $(deps);
|
217 |
-
if ( thisCheck.is ( ':checked' ) ) {
|
218 |
-
val = 'yes';
|
219 |
-
}
|
220 |
-
else {
|
221 |
-
val = 'no';
|
222 |
-
}
|
223 |
-
}
|
224 |
-
|
225 |
-
var values = values.split( ',' );
|
226 |
-
|
227 |
-
for( var i = 0; i < values.length; i++ ) {
|
228 |
-
if( val != values[i] )
|
229 |
-
{ result = false; }
|
230 |
-
else
|
231 |
-
{ result = true; break; }
|
232 |
-
}
|
233 |
-
}
|
234 |
-
|
235 |
-
if( !result ) {
|
236 |
-
$( id + '-container' ).parent().hide();
|
237 |
-
} else {
|
238 |
-
$( id + '-container' ).parent().show();
|
239 |
-
}
|
240 |
-
};
|
241 |
-
|
242 |
-
// Image gallery
|
243 |
-
$(document).on('click', '.image-gallery-button', function (e) {
|
244 |
-
var $t = $(this),
|
245 |
-
$container = $t.closest('.image-gallery'),
|
246 |
-
$image_gallery_ids = $container.find('.image_gallery_ids'),
|
247 |
-
attachment_ids = $image_gallery_ids.val(),
|
248 |
-
$gallery_images_wrapper = $container.find('ul.slides-wrapper');
|
249 |
-
|
250 |
-
|
251 |
-
// Create the media frame.
|
252 |
-
var image_gallery_frame = wp.media.frames.image_gallery = wp.media({
|
253 |
-
// Set the title of the modal.
|
254 |
-
title : $t.data('choose'),
|
255 |
-
button: {
|
256 |
-
text: $t.data('update')
|
257 |
-
},
|
258 |
-
states: [
|
259 |
-
new wp.media.controller.Library({
|
260 |
-
title : $t.data('choose'),
|
261 |
-
filterable: 'all',
|
262 |
-
multiple : true
|
263 |
-
})
|
264 |
-
]
|
265 |
-
});
|
266 |
-
|
267 |
-
// When an image is selected, run a callback.
|
268 |
-
image_gallery_frame.on('select', function () {
|
269 |
-
var selection = image_gallery_frame.state().get('selection');
|
270 |
-
selection.map(function (attachment) {
|
271 |
-
attachment = attachment.toJSON();
|
272 |
-
|
273 |
-
if (attachment.id) {
|
274 |
-
attachment_ids = attachment_ids ? attachment_ids + "," + attachment.id : attachment.id;
|
275 |
-
$gallery_images_wrapper.append('<li class="image" data-attachment_id="' + attachment.id + '"><img src="' + attachment.sizes.thumbnail.url + '"/><ul class="actions"><li><a href="#" class="delete" title="' + $t.data('delete') + '">x</a></li></ul></li>');
|
276 |
-
}
|
277 |
-
});
|
278 |
-
|
279 |
-
$image_gallery_ids.val(attachment_ids);
|
280 |
-
});
|
281 |
-
|
282 |
-
image_gallery_frame.open();
|
283 |
-
|
284 |
-
});
|
285 |
-
|
286 |
-
// Image ordering
|
287 |
-
$('.image-gallery ul.slides-wrapper').each(function(){
|
288 |
-
var $t = $(this);
|
289 |
-
$t.sortable({
|
290 |
-
items : 'li.image',
|
291 |
-
cursor : 'move',
|
292 |
-
scrollSensitivity : 40,
|
293 |
-
forcePlaceholderSize: true,
|
294 |
-
forceHelperSize : false,
|
295 |
-
helper : 'clone',
|
296 |
-
opacity : 0.65,
|
297 |
-
start : function (event, ui) {
|
298 |
-
ui.item.css('background-color', '#f6f6f6');
|
299 |
-
},
|
300 |
-
stop : function (event, ui) {
|
301 |
-
ui.item.removeAttr('style');
|
302 |
-
},
|
303 |
-
update : function (event, ui) {
|
304 |
-
var attachment_ids = '';
|
305 |
-
|
306 |
-
$t.find('li.image').css('cursor', 'default').each(function () {
|
307 |
-
var attachment_id = $(this).attr('data-attachment_id');
|
308 |
-
attachment_ids = attachment_ids + attachment_id + ',';
|
309 |
-
});
|
310 |
-
|
311 |
-
$t.closest('.image-gallery').find('.image_gallery_ids').val(attachment_ids);
|
312 |
-
}
|
313 |
-
});
|
314 |
-
});
|
315 |
-
|
316 |
-
// Remove images
|
317 |
-
$('.image-gallery ul.slides-wrapper').on( 'click', 'a.delete', function() {
|
318 |
-
|
319 |
-
var $wrapper = $(this).closest('.image-gallery'),
|
320 |
-
$gallery = $(this).closest('.image-gallery ul.slides-wrapper'),
|
321 |
-
$image_gallery_ids = $wrapper.find('.image_gallery_ids'),
|
322 |
-
attachment_ids = '';
|
323 |
-
|
324 |
-
$(this).closest('li.image').remove();
|
325 |
-
|
326 |
-
$gallery.find('li.image').css('cursor','default').each(function() {
|
327 |
-
var attachment_id = $(this).attr( 'data-attachment_id' );
|
328 |
-
attachment_ids = attachment_ids + attachment_id + ',';
|
329 |
-
});
|
330 |
-
|
331 |
-
$image_gallery_ids.val( attachment_ids );
|
332 |
-
|
333 |
-
return false;
|
334 |
-
});
|
335 |
-
|
336 |
-
|
337 |
-
//on-off
|
338 |
-
$('.the-metabox .rm_onoff.onoff_container span').on('click', function(ev){
|
339 |
-
|
340 |
-
var input = $( this ).prev( 'input' );
|
341 |
-
var checked = input.prop( 'checked' );
|
342 |
-
|
343 |
-
if( checked ) {
|
344 |
-
input.prop( 'checked', false ).attr( 'value', 'no' ).removeClass('onoffchecked');
|
345 |
-
} else {
|
346 |
-
input.prop( 'checked', true ).attr( 'value', 'yes' ).addClass('onoffchecked');
|
347 |
-
}
|
348 |
-
|
349 |
-
input.change();
|
350 |
-
});
|
351 |
-
|
352 |
-
|
353 |
-
|
354 |
-
|
355 |
})(jQuery);
|
1 |
+
/**
|
2 |
+
* This file belongs to the YIT Framework.
|
3 |
+
*
|
4 |
+
* This source file is subject to the GNU GENERAL PUBLIC LICENSE (GPL 3.0)
|
5 |
+
* that is bundled with this package in the file LICENSE.txt.
|
6 |
+
* It is also available through the world-wide-web at this URL:
|
7 |
+
* http://www.gnu.org/licenses/gpl-3.0.txt
|
8 |
+
*/
|
9 |
+
(function ($) {
|
10 |
+
|
11 |
+
$('.metaboxes-tab').each(function () {
|
12 |
+
$('.tabs-panel', this).hide();
|
13 |
+
|
14 |
+
var active_tab = wpCookies.get('active_metabox_tab');
|
15 |
+
if (active_tab == null) {
|
16 |
+
active_tab = $('ul.metaboxes-tabs li:first-child a', this).attr('href');
|
17 |
+
} else {
|
18 |
+
active_tab = '#' + active_tab;
|
19 |
+
}
|
20 |
+
|
21 |
+
$(active_tab).show();
|
22 |
+
|
23 |
+
$('.metaboxes-tabs a', this).click(function (e) {
|
24 |
+
if ($(this).parent().hasClass('tabs')) {
|
25 |
+
e.preventDefault();
|
26 |
+
return;
|
27 |
+
}
|
28 |
+
|
29 |
+
var t = $(this).attr('href');
|
30 |
+
$(this).parent().addClass('tabs').siblings('li').removeClass('tabs');
|
31 |
+
$(this).closest('.metaboxes-tab').find('.tabs-panel').slideUp('fast');
|
32 |
+
$(t).delay(350).slideDown('fast');
|
33 |
+
|
34 |
+
return false;
|
35 |
+
});
|
36 |
+
});
|
37 |
+
|
38 |
+
//upload
|
39 |
+
var _custom_media = true,
|
40 |
+
_orig_send_attachment = wp.media.editor.send.attachment;
|
41 |
+
|
42 |
+
$(document).on('click', '.metaboxes-tab .upload_button', function(e) {
|
43 |
+
var send_attachment_bkp = wp.media.editor.send.attachment;
|
44 |
+
var button = $(this);
|
45 |
+
if( typeof button.attr('id') != 'undefined' ) {
|
46 |
+
|
47 |
+
var id = button.attr('id').replace('-button', '');
|
48 |
+
_custom_media = true;
|
49 |
+
wp.media.editor.send.attachment = function(props, attachment){
|
50 |
+
if ( _custom_media ) {
|
51 |
+
if( $("#"+id).is('input[type=text]') ) {
|
52 |
+
$("#"+id).val(attachment.url);
|
53 |
+
} else {
|
54 |
+
$("#"+id + '_custom').val(attachment.url);
|
55 |
+
}
|
56 |
+
} else {
|
57 |
+
return _orig_send_attachment.apply( this, [props, attachment] );
|
58 |
+
};
|
59 |
+
}
|
60 |
+
|
61 |
+
wp.media.editor.open(button);
|
62 |
+
return false;
|
63 |
+
}
|
64 |
+
|
65 |
+
});
|
66 |
+
|
67 |
+
$('.metaboxes-tab .add_media').on('click', function(){
|
68 |
+
_custom_media = false;
|
69 |
+
});
|
70 |
+
|
71 |
+
//colorpicker
|
72 |
+
$('.metaboxes-tab .panel-colorpicker').wpColorPicker({
|
73 |
+
onInit: function(){ console.log('test');},
|
74 |
+
change: function(event, ui){
|
75 |
+
},
|
76 |
+
clear: function(){
|
77 |
+
var input = $(this);
|
78 |
+
input.val(input.data('default-color'));
|
79 |
+
input.change();
|
80 |
+
}
|
81 |
+
});
|
82 |
+
|
83 |
+
|
84 |
+
$('.metaboxes-tab .panel-colorpicker').each( function() {
|
85 |
+
var select_label = $(this).data('variations-label');
|
86 |
+
$(this).parent().parent().find('a.wp-color-result').attr('title', select_label);
|
87 |
+
});
|
88 |
+
|
89 |
+
//datepicker
|
90 |
+
$('.metaboxes-tab .panel-datepicker').each( function() {
|
91 |
+
$(this).datepicker();
|
92 |
+
});
|
93 |
+
|
94 |
+
|
95 |
+
// select
|
96 |
+
var select_value = function() {
|
97 |
+
var value = '';
|
98 |
+
|
99 |
+
if( $(this).attr('multiple')){
|
100 |
+
$(this).children("option:selected").each(function(i,v){
|
101 |
+
if( i != 0)
|
102 |
+
value += ', ';
|
103 |
+
|
104 |
+
value += $(v).text();
|
105 |
+
});
|
106 |
+
|
107 |
+
if( value == '' ){
|
108 |
+
$(this).children().children("option:selected").each(function(i,v){
|
109 |
+
if( i != 0)
|
110 |
+
value += ', ';
|
111 |
+
|
112 |
+
value += $(v).text();
|
113 |
+
});
|
114 |
+
}
|
115 |
+
}
|
116 |
+
else{
|
117 |
+
value = $(this).children("option:selected").text();
|
118 |
+
|
119 |
+
if( value == '' )
|
120 |
+
value = $(this).children().children("option:selected").text();
|
121 |
+
}
|
122 |
+
|
123 |
+
|
124 |
+
if ( $(this).parent().find('span').length <= 0 ) {
|
125 |
+
$(this).before('<span></span>');
|
126 |
+
}
|
127 |
+
|
128 |
+
$(this).parent().children('span').replaceWith('<span>'+value +'</span>');
|
129 |
+
};
|
130 |
+
$('.metaboxes-tab .select_wrapper select').not('.chosen').each(select_value).change(select_value);
|
131 |
+
|
132 |
+
//Open select multiple
|
133 |
+
$('.metaboxes-tab .select_wrapper').click( function(e){
|
134 |
+
e.stopPropagation();
|
135 |
+
$(this).find('select[multiple]').not('.chosen').toggle();
|
136 |
+
});
|
137 |
+
//Stops click propagation on select, to prevent select hide
|
138 |
+
$('.metaboxes-tab .select_wrapper select[multiple]').not('.chosen').click( function(e){
|
139 |
+
e.stopPropagation();
|
140 |
+
});
|
141 |
+
//Hides select on window click
|
142 |
+
$(window).click(function(){
|
143 |
+
$('.metaboxes-tab .select_wrapper select[multiple]').not('.chosen').hide();
|
144 |
+
})
|
145 |
+
|
146 |
+
//chosen
|
147 |
+
$('.metaboxes-tab .chosen .select_wrapper select').chosen();
|
148 |
+
|
149 |
+
|
150 |
+
$('.metaboxes-tab .slider_container .ui-slider-horizontal').each(function(){
|
151 |
+
var val = $(this).data('val');
|
152 |
+
var minValue = $(this).data('min');
|
153 |
+
var maxValue = $(this).data('max');
|
154 |
+
var step = $(this).data('step');
|
155 |
+
var labels = $(this).data('labels');
|
156 |
+
|
157 |
+
$(this).slider({
|
158 |
+
value: val,
|
159 |
+
min: minValue,
|
160 |
+
max: maxValue,
|
161 |
+
range: 'min',
|
162 |
+
step: step,
|
163 |
+
|
164 |
+
slide: function( event, ui ) {
|
165 |
+
$(this).find('input').val( ui.value );
|
166 |
+
$(this).siblings('.feedback').find('strong' ).text( ui.value + labels );
|
167 |
+
}
|
168 |
+
});
|
169 |
+
});
|
170 |
+
|
171 |
+
|
172 |
+
var act_page_option = $('#_active_page_options-container').parent().html();
|
173 |
+
$('#_active_page_options-container').parent().remove();
|
174 |
+
$(act_page_option).insertAfter('#yit-post-setting .handlediv');
|
175 |
+
$(act_page_option).insertAfter('#yit-page-setting .handlediv');
|
176 |
+
|
177 |
+
|
178 |
+
$('#_active_page_options-container').on('click', function(){
|
179 |
+
if( $('#_active_page_options').is(":checked") ){
|
180 |
+
$('#yit-page-setting .inside .metaboxes-tab, #yit-post-setting .inside .metaboxes-tab').css( { 'opacity' : 1 , 'pointer-events' : 'auto' } );
|
181 |
+
}else{
|
182 |
+
$('#yit-page-setting .inside .metaboxes-tab, #yit-post-setting .inside .metaboxes-tab').css( { 'opacity' : 0.5 , 'pointer-events' : 'none' } );
|
183 |
+
}
|
184 |
+
}).click();
|
185 |
+
|
186 |
+
|
187 |
+
//dependencies handler
|
188 |
+
$('.metaboxes-tab [data-field]').each(function(){
|
189 |
+
var t = $(this);
|
190 |
+
|
191 |
+
var field = '#' + t.data('field'),
|
192 |
+
dep = '#' + t.data('dep'),
|
193 |
+
value = t.data('value');
|
194 |
+
|
195 |
+
|
196 |
+
dependencies_handler( field, dep, value.toString() );
|
197 |
+
|
198 |
+
$(dep).on('change', function(){
|
199 |
+
dependencies_handler( field, dep, value.toString() );
|
200 |
+
}).change();
|
201 |
+
});
|
202 |
+
|
203 |
+
//Handle dependencies.
|
204 |
+
function dependencies_handler ( id, deps, values ) {
|
205 |
+
var result = true;
|
206 |
+
|
207 |
+
|
208 |
+
//Single dependency
|
209 |
+
if( typeof( deps ) == 'string' ) {
|
210 |
+
if( deps.substr( 0, 6 ) == ':radio' )
|
211 |
+
{deps = deps + ':checked'; }
|
212 |
+
|
213 |
+
var val = $( deps ).val();
|
214 |
+
|
215 |
+
if( $(deps).attr('type') == 'checkbox'){
|
216 |
+
var thisCheck = $(deps);
|
217 |
+
if ( thisCheck.is ( ':checked' ) ) {
|
218 |
+
val = 'yes';
|
219 |
+
}
|
220 |
+
else {
|
221 |
+
val = 'no';
|
222 |
+
}
|
223 |
+
}
|
224 |
+
|
225 |
+
var values = values.split( ',' );
|
226 |
+
|
227 |
+
for( var i = 0; i < values.length; i++ ) {
|
228 |
+
if( val != values[i] )
|
229 |
+
{ result = false; }
|
230 |
+
else
|
231 |
+
{ result = true; break; }
|
232 |
+
}
|
233 |
+
}
|
234 |
+
|
235 |
+
if( !result ) {
|
236 |
+
$( id + '-container' ).parent().hide();
|
237 |
+
} else {
|
238 |
+
$( id + '-container' ).parent().show();
|
239 |
+
}
|
240 |
+
};
|
241 |
+
|
242 |
+
// Image gallery
|
243 |
+
$(document).on('click', '.image-gallery-button', function (e) {
|
244 |
+
var $t = $(this),
|
245 |
+
$container = $t.closest('.image-gallery'),
|
246 |
+
$image_gallery_ids = $container.find('.image_gallery_ids'),
|
247 |
+
attachment_ids = $image_gallery_ids.val(),
|
248 |
+
$gallery_images_wrapper = $container.find('ul.slides-wrapper');
|
249 |
+
|
250 |
+
|
251 |
+
// Create the media frame.
|
252 |
+
var image_gallery_frame = wp.media.frames.image_gallery = wp.media({
|
253 |
+
// Set the title of the modal.
|
254 |
+
title : $t.data('choose'),
|
255 |
+
button: {
|
256 |
+
text: $t.data('update')
|
257 |
+
},
|
258 |
+
states: [
|
259 |
+
new wp.media.controller.Library({
|
260 |
+
title : $t.data('choose'),
|
261 |
+
filterable: 'all',
|
262 |
+
multiple : true
|
263 |
+
})
|
264 |
+
]
|
265 |
+
});
|
266 |
+
|
267 |
+
// When an image is selected, run a callback.
|
268 |
+
image_gallery_frame.on('select', function () {
|
269 |
+
var selection = image_gallery_frame.state().get('selection');
|
270 |
+
selection.map(function (attachment) {
|
271 |
+
attachment = attachment.toJSON();
|
272 |
+
|
273 |
+
if (attachment.id) {
|
274 |
+
attachment_ids = attachment_ids ? attachment_ids + "," + attachment.id : attachment.id;
|
275 |
+
$gallery_images_wrapper.append('<li class="image" data-attachment_id="' + attachment.id + '"><img src="' + attachment.sizes.thumbnail.url + '"/><ul class="actions"><li><a href="#" class="delete" title="' + $t.data('delete') + '">x</a></li></ul></li>');
|
276 |
+
}
|
277 |
+
});
|
278 |
+
|
279 |
+
$image_gallery_ids.val(attachment_ids);
|
280 |
+
});
|
281 |
+
|
282 |
+
image_gallery_frame.open();
|
283 |
+
|
284 |
+
});
|
285 |
+
|
286 |
+
// Image ordering
|
287 |
+
$('.image-gallery ul.slides-wrapper').each(function(){
|
288 |
+
var $t = $(this);
|
289 |
+
$t.sortable({
|
290 |
+
items : 'li.image',
|
291 |
+
cursor : 'move',
|
292 |
+
scrollSensitivity : 40,
|
293 |
+
forcePlaceholderSize: true,
|
294 |
+
forceHelperSize : false,
|
295 |
+
helper : 'clone',
|
296 |
+
opacity : 0.65,
|
297 |
+
start : function (event, ui) {
|
298 |
+
ui.item.css('background-color', '#f6f6f6');
|
299 |
+
},
|
300 |
+
stop : function (event, ui) {
|
301 |
+
ui.item.removeAttr('style');
|
302 |
+
},
|
303 |
+
update : function (event, ui) {
|
304 |
+
var attachment_ids = '';
|
305 |
+
|
306 |
+
$t.find('li.image').css('cursor', 'default').each(function () {
|
307 |
+
var attachment_id = $(this).attr('data-attachment_id');
|
308 |
+
attachment_ids = attachment_ids + attachment_id + ',';
|
309 |
+
});
|
310 |
+
|
311 |
+
$t.closest('.image-gallery').find('.image_gallery_ids').val(attachment_ids);
|
312 |
+
}
|
313 |
+
});
|
314 |
+
});
|
315 |
+
|
316 |
+
// Remove images
|
317 |
+
$('.image-gallery ul.slides-wrapper').on( 'click', 'a.delete', function() {
|
318 |
+
|
319 |
+
var $wrapper = $(this).closest('.image-gallery'),
|
320 |
+
$gallery = $(this).closest('.image-gallery ul.slides-wrapper'),
|
321 |
+
$image_gallery_ids = $wrapper.find('.image_gallery_ids'),
|
322 |
+
attachment_ids = '';
|
323 |
+
|
324 |
+
$(this).closest('li.image').remove();
|
325 |
+
|
326 |
+
$gallery.find('li.image').css('cursor','default').each(function() {
|
327 |
+
var attachment_id = $(this).attr( 'data-attachment_id' );
|
328 |
+
attachment_ids = attachment_ids + attachment_id + ',';
|
329 |
+
});
|
330 |
+
|
331 |
+
$image_gallery_ids.val( attachment_ids );
|
332 |
+
|
333 |
+
return false;
|
334 |
+
});
|
335 |
+
|
336 |
+
|
337 |
+
//on-off
|
338 |
+
$('.the-metabox .rm_onoff.onoff_container span').on('click', function(ev){
|
339 |
+
|
340 |
+
var input = $( this ).prev( 'input' );
|
341 |
+
var checked = input.prop( 'checked' );
|
342 |
+
|
343 |
+
if( checked ) {
|
344 |
+
input.prop( 'checked', false ).attr( 'value', 'no' ).removeClass('onoffchecked');
|
345 |
+
} else {
|
346 |
+
input.prop( 'checked', true ).attr( 'value', 'yes' ).addClass('onoffchecked');
|
347 |
+
}
|
348 |
+
|
349 |
+
input.change();
|
350 |
+
});
|
351 |
+
|
352 |
+
|
353 |
+
|
354 |
+
|
355 |
})(jQuery);
|
plugin-fw/assets/js/metabox.min.js
CHANGED
@@ -1,11 +1,11 @@
|
|
1 |
-
(function(a){function k(b,c,d){var e=!0;if("string"==typeof c){":radio"==c.substr(0,6)&&(c+=":checked");var g=a(c).val();"checkbox"==a(c).attr("type")&&(g=a(c).is(":checked")?"yes":"no");d=d.split(",");for(c=0;c<d.length;c++)if(g!=d[c])e=!1;else{e=!0;break}}e?a(b+"-container").parent().show():a(b+"-container").parent().hide()}a(".metaboxes-tab").each(function(){a(".tabs-panel",this).hide();var b=wpCookies.get("active_metabox_tab"),b=null==b?a("ul.metaboxes-tabs li:first-child a",this).attr("href"):
|
2 |
-
"#"+b;a(b).show();a(".metaboxes-tabs a",this).click(function(b){if(a(this).parent().hasClass("tabs"))b.preventDefault();else return b=a(this).attr("href"),a(this).parent().addClass("tabs").siblings("li").removeClass("tabs"),a(this).closest(".metaboxes-tab").find(".tabs-panel").slideUp("fast"),a(b).delay(350).slideDown("fast"),!1})});var h=!0,l=wp.media.editor.send.attachment;a(document).on("click",".metaboxes-tab .upload_button",function(b){b=a(this);if("undefined"!=typeof b.attr("id")){var c=b.attr("id").replace("-button",
|
3 |
-
"");h=!0;wp.media.editor.send.attachment=function(b,e){if(h)a("#"+c).is("input[type=text]")?a("#"+c).val(e.url):a("#"+c+"_custom").val(e.url);else return l.apply(this,[b,e])};wp.media.editor.open(b);return!1}});a(".metaboxes-tab .add_media").on("click",function(){h=!1});a(".metaboxes-tab .panel-colorpicker").wpColorPicker({onInit:function(){console.log("test")},change:function(a,c){},clear:function(){var b=a(this);b.val(b.data("default-color"));b.change()}});a(".metaboxes-tab .panel-colorpicker").each(function(){var b=
|
4 |
-
a(this).data("variations-label");a(this).parent().parent().find("a.wp-color-result").attr("title",b)});a(".metaboxes-tab .panel-datepicker").each(function(){a(this).datepicker()});var f=function(){var b="";a(this).attr("multiple")?(a(this).children("option:selected").each(function(c,d){0!=c&&(b+=", ");b+=a(d).text()}),""==b&&a(this).children().children("option:selected").each(function(c,d){0!=c&&(b+=", ");b+=a(d).text()})):(b=a(this).children("option:selected").text(),""==b&&(b=a(this).children().children("option:selected").text()));
|
5 |
-
0>=a(this).parent().find("span").length&&a(this).before("<span></span>");a(this).parent().children("span").replaceWith("<span>"+b+"</span>")};a(".metaboxes-tab .select_wrapper select").not(".chosen").each(f).change(f);a(".metaboxes-tab .select_wrapper").click(function(b){b.stopPropagation();a(this).find("select[multiple]").not(".chosen").toggle()});a(".metaboxes-tab .select_wrapper select[multiple]").not(".chosen").click(function(a){a.stopPropagation()});a(window).click(function(){a(".metaboxes-tab .select_wrapper select[multiple]").not(".chosen").hide()});
|
6 |
-
a(".metaboxes-tab .chosen .select_wrapper select").chosen();a(".metaboxes-tab .slider_container .ui-slider-horizontal").each(function(){var b=a(this).data("val"),c=a(this).data("min"),d=a(this).data("max"),e=a(this).data("step"),g=a(this).data("labels");a(this).slider({value:b,min:c,max:d,range:"min",step:e,slide:function(b,c){a(this).find("input").val(c.value);a(this).siblings(".feedback").find("strong").text(c.value+g)}})});f=a("#_active_page_options-container").parent().html();a("#_active_page_options-container").parent().remove();
|
7 |
-
a(f).insertAfter("#yit-post-setting .handlediv");a(f).insertAfter("#yit-page-setting .handlediv");a("#_active_page_options-container").on("click",function(){a("#_active_page_options").is(":checked")?a("#yit-page-setting .inside .metaboxes-tab, #yit-post-setting .inside .metaboxes-tab").css({opacity:1,"pointer-events":"auto"}):a("#yit-page-setting .inside .metaboxes-tab, #yit-post-setting .inside .metaboxes-tab").css({opacity:.5,"pointer-events":"none"})}).click();a(".metaboxes-tab [data-field]").each(function(){var b=
|
8 |
-
a(this),c="#"+b.data("field"),d="#"+b.data("dep"),e=b.data("value");k(c,d,e.toString());a(d).on("change",function(){k(c,d,e.toString())}).change()});a(document).on("click",".image-gallery-button",function(b){var c=a(this);b=c.closest(".image-gallery");var d=b.find(".image_gallery_ids"),e=d.val(),g=b.find("ul.slides-wrapper"),f=wp.media.frames.image_gallery=wp.media({title:c.data("choose"),button:{text:c.data("update")},states:[new wp.media.controller.Library({title:c.data("choose"),filterable:"all",
|
9 |
-
multiple:!0})]});f.on("select",function(){f.state().get("selection").map(function(a){a=a.toJSON();a.id&&(e=e?e+","+a.id:a.id,g.append('<li class="image" data-attachment_id="'+a.id+'"><img src="'+a.sizes.thumbnail.url+'"/><ul class="actions"><li><a href="#" class="delete" title="'+c.data("delete")+'">x</a></li></ul></li>'))});d.val(e)});f.open()});a(".image-gallery ul.slides-wrapper").each(function(){var b=a(this);b.sortable({items:"li.image",cursor:"move",scrollSensitivity:40,forcePlaceholderSize:!0,
|
10 |
-
forceHelperSize:!1,helper:"clone",opacity:.65,start:function(a,b){b.item.css("background-color","#f6f6f6")},stop:function(a,b){b.item.removeAttr("style")},update:function(c,d){var e="";b.find("li.image").css("cursor","default").each(function(){var b=a(this).attr("data-attachment_id");e=e+b+","});b.closest(".image-gallery").find(".image_gallery_ids").val(e)}})});a(".image-gallery ul.slides-wrapper").on("click","a.delete",function(){var b=a(this).closest(".image-gallery"),c=a(this).closest(".image-gallery ul.slides-wrapper"),
|
11 |
-
b=b.find(".image_gallery_ids"),d="";a(this).closest("li.image").remove();c.find("li.image").css("cursor","default").each(function(){var b=a(this).attr("data-attachment_id");d=d+b+","});b.val(d);return!1});a(".the-metabox .rm_onoff.onoff_container span").on("click",function(b){b=a(this).prev("input");b.prop("checked")?b.prop("checked",!1).attr("value","no").removeClass("onoffchecked"):b.prop("checked",!0).attr("value","yes").addClass("onoffchecked");b.change()})})(jQuery);
|
1 |
+
(function(a){function k(b,c,d){var e=!0;if("string"==typeof c){":radio"==c.substr(0,6)&&(c+=":checked");var g=a(c).val();"checkbox"==a(c).attr("type")&&(g=a(c).is(":checked")?"yes":"no");d=d.split(",");for(c=0;c<d.length;c++)if(g!=d[c])e=!1;else{e=!0;break}}e?a(b+"-container").parent().show():a(b+"-container").parent().hide()}a(".metaboxes-tab").each(function(){a(".tabs-panel",this).hide();var b=wpCookies.get("active_metabox_tab"),b=null==b?a("ul.metaboxes-tabs li:first-child a",this).attr("href"):
|
2 |
+
"#"+b;a(b).show();a(".metaboxes-tabs a",this).click(function(b){if(a(this).parent().hasClass("tabs"))b.preventDefault();else return b=a(this).attr("href"),a(this).parent().addClass("tabs").siblings("li").removeClass("tabs"),a(this).closest(".metaboxes-tab").find(".tabs-panel").slideUp("fast"),a(b).delay(350).slideDown("fast"),!1})});var h=!0,l=wp.media.editor.send.attachment;a(document).on("click",".metaboxes-tab .upload_button",function(b){b=a(this);if("undefined"!=typeof b.attr("id")){var c=b.attr("id").replace("-button",
|
3 |
+
"");h=!0;wp.media.editor.send.attachment=function(b,e){if(h)a("#"+c).is("input[type=text]")?a("#"+c).val(e.url):a("#"+c+"_custom").val(e.url);else return l.apply(this,[b,e])};wp.media.editor.open(b);return!1}});a(".metaboxes-tab .add_media").on("click",function(){h=!1});a(".metaboxes-tab .panel-colorpicker").wpColorPicker({onInit:function(){console.log("test")},change:function(a,c){},clear:function(){var b=a(this);b.val(b.data("default-color"));b.change()}});a(".metaboxes-tab .panel-colorpicker").each(function(){var b=
|
4 |
+
a(this).data("variations-label");a(this).parent().parent().find("a.wp-color-result").attr("title",b)});a(".metaboxes-tab .panel-datepicker").each(function(){a(this).datepicker()});var f=function(){var b="";a(this).attr("multiple")?(a(this).children("option:selected").each(function(c,d){0!=c&&(b+=", ");b+=a(d).text()}),""==b&&a(this).children().children("option:selected").each(function(c,d){0!=c&&(b+=", ");b+=a(d).text()})):(b=a(this).children("option:selected").text(),""==b&&(b=a(this).children().children("option:selected").text()));
|
5 |
+
0>=a(this).parent().find("span").length&&a(this).before("<span></span>");a(this).parent().children("span").replaceWith("<span>"+b+"</span>")};a(".metaboxes-tab .select_wrapper select").not(".chosen").each(f).change(f);a(".metaboxes-tab .select_wrapper").click(function(b){b.stopPropagation();a(this).find("select[multiple]").not(".chosen").toggle()});a(".metaboxes-tab .select_wrapper select[multiple]").not(".chosen").click(function(a){a.stopPropagation()});a(window).click(function(){a(".metaboxes-tab .select_wrapper select[multiple]").not(".chosen").hide()});
|
6 |
+
a(".metaboxes-tab .chosen .select_wrapper select").chosen();a(".metaboxes-tab .slider_container .ui-slider-horizontal").each(function(){var b=a(this).data("val"),c=a(this).data("min"),d=a(this).data("max"),e=a(this).data("step"),g=a(this).data("labels");a(this).slider({value:b,min:c,max:d,range:"min",step:e,slide:function(b,c){a(this).find("input").val(c.value);a(this).siblings(".feedback").find("strong").text(c.value+g)}})});f=a("#_active_page_options-container").parent().html();a("#_active_page_options-container").parent().remove();
|
7 |
+
a(f).insertAfter("#yit-post-setting .handlediv");a(f).insertAfter("#yit-page-setting .handlediv");a("#_active_page_options-container").on("click",function(){a("#_active_page_options").is(":checked")?a("#yit-page-setting .inside .metaboxes-tab, #yit-post-setting .inside .metaboxes-tab").css({opacity:1,"pointer-events":"auto"}):a("#yit-page-setting .inside .metaboxes-tab, #yit-post-setting .inside .metaboxes-tab").css({opacity:.5,"pointer-events":"none"})}).click();a(".metaboxes-tab [data-field]").each(function(){var b=
|
8 |
+
a(this),c="#"+b.data("field"),d="#"+b.data("dep"),e=b.data("value");k(c,d,e.toString());a(d).on("change",function(){k(c,d,e.toString())}).change()});a(document).on("click",".image-gallery-button",function(b){var c=a(this);b=c.closest(".image-gallery");var d=b.find(".image_gallery_ids"),e=d.val(),g=b.find("ul.slides-wrapper"),f=wp.media.frames.image_gallery=wp.media({title:c.data("choose"),button:{text:c.data("update")},states:[new wp.media.controller.Library({title:c.data("choose"),filterable:"all",
|
9 |
+
multiple:!0})]});f.on("select",function(){f.state().get("selection").map(function(a){a=a.toJSON();a.id&&(e=e?e+","+a.id:a.id,g.append('<li class="image" data-attachment_id="'+a.id+'"><img src="'+a.sizes.thumbnail.url+'"/><ul class="actions"><li><a href="#" class="delete" title="'+c.data("delete")+'">x</a></li></ul></li>'))});d.val(e)});f.open()});a(".image-gallery ul.slides-wrapper").each(function(){var b=a(this);b.sortable({items:"li.image",cursor:"move",scrollSensitivity:40,forcePlaceholderSize:!0,
|
10 |
+
forceHelperSize:!1,helper:"clone",opacity:.65,start:function(a,b){b.item.css("background-color","#f6f6f6")},stop:function(a,b){b.item.removeAttr("style")},update:function(c,d){var e="";b.find("li.image").css("cursor","default").each(function(){var b=a(this).attr("data-attachment_id");e=e+b+","});b.closest(".image-gallery").find(".image_gallery_ids").val(e)}})});a(".image-gallery ul.slides-wrapper").on("click","a.delete",function(){var b=a(this).closest(".image-gallery"),c=a(this).closest(".image-gallery ul.slides-wrapper"),
|
11 |
+
b=b.find(".image_gallery_ids"),d="";a(this).closest("li.image").remove();c.find("li.image").css("cursor","default").each(function(){var b=a(this).attr("data-attachment_id");d=d+b+","});b.val(d);return!1});a(".the-metabox .rm_onoff.onoff_container span").on("click",function(b){b=a(this).prev("input");b.prop("checked")?b.prop("checked",!1).attr("value","no").removeClass("onoffchecked"):b.prop("checked",!0).attr("value","yes").addClass("onoffchecked");b.change()})})(jQuery);
|
plugin-fw/assets/js/multisite-updater.js
CHANGED
@@ -1,216 +1,216 @@
|
|
1 |
-
/**
|
2 |
-
* This file belongs to the YIT Framework.
|
3 |
-
*
|
4 |
-
* This source file is subject to the GNU GENERAL PUBLIC LICENSE (GPL 3.0)
|
5 |
-
* that is bundled with this package in the file LICENSE.txt.
|
6 |
-
* It is also available through the world-wide-web at this URL:
|
7 |
-
* http://www.gnu.org/licenses/gpl-3.0.txt
|
8 |
-
*/
|
9 |
-
(function ($) {
|
10 |
-
|
11 |
-
var plugins_menu_item = $( '#menu-plugins' ),
|
12 |
-
update = plugins_menu_item.find('.update-plugins'),
|
13 |
-
count = update.find(".update-count").text(),
|
14 |
-
registered = plugins.registered,
|
15 |
-
activated = plugins.activated;
|
16 |
-
|
17 |
-
if( count == 0 || count == ''){
|
18 |
-
var update_row = '<span class="update-plugins"><span class="plugin-count"></span></span>';
|
19 |
-
count = 0;
|
20 |
-
plugins_menu_item.find( '.wp-menu-name').append( update_row );
|
21 |
-
}
|
22 |
-
|
23 |
-
/**
|
24 |
-
* Add the plugin update rows for old plugins
|
25 |
-
*/
|
26 |
-
update_plugins_row( registered, activated, count, plugins );
|
27 |
-
|
28 |
-
/**
|
29 |
-
*
|
30 |
-
* Add the update plugin rows for old plugin
|
31 |
-
*
|
32 |
-
* @author Andrea Grillo <andrea.grillo@yithemes.com>
|
33 |
-
*
|
34 |
-
* @param registered Registred plugins
|
35 |
-
* @param activated Activated plugins
|
36 |
-
* @param count Number of old plugins
|
37 |
-
* @param localize Localize strings array
|
38 |
-
*
|
39 |
-
* @return void
|
40 |
-
*/
|
41 |
-
function update_plugins_row( registered, activated, count, localize ){
|
42 |
-
for( var init in registered ){
|
43 |
-
var plugin = registered[init];
|
44 |
-
for( var headers in plugin ){
|
45 |
-
|
46 |
-
if( headers == 'slug' || version_compare( plugin[headers].Version, plugin[headers].Latest, '>=' ) ) {
|
47 |
-
continue;
|
48 |
-
}
|
49 |
-
|
50 |
-
count = parseInt(count) + 1;
|
51 |
-
$(".plugin-count").empty().html(count);
|
52 |
-
|
53 |
-
var regex = new RegExp(' ', 'g'),
|
54 |
-
info = plugin[headers],
|
55 |
-
name = '' + info.Name,
|
56 |
-
id = name.replace(regex, '-').trim(),
|
57 |
-
row = '*[data-slug="' + id.toLowerCase() +'"]';
|
58 |
-
|
59 |
-
$(row).addClass("update");
|
60 |
-
|
61 |
-
var html = '<tr class="plugin-update-tr">' +
|
62 |
-
'<td colspan="3" class="plugin-update colspanchange">' +
|
63 |
-
'<div class="update-message">' + localize.strings.new_version.replace( '%plugin_name%', name ) +
|
64 |
-
'<a class="thickbox" href="' + localize.details_url[init] + '">' + localize.strings.latest.replace( '%latest%', plugin[headers].Latest ) + '</a>';
|
65 |
-
|
66 |
-
if( typeof activated[init] == "undefined" ) {
|
67 |
-
|
68 |
-
html = html +
|
69 |
-
' <em>' + localize.strings.unavailable + '</em>' +
|
70 |
-
localize.strings.activate.replace( '%activate_link%', localize.licence_activation_url ).replace( '%plugin_name%', name );
|
71 |
-
} else {
|
72 |
-
html = html +
|
73 |
-
'. <a href="' + localize.update_url[init] + '">' + localize.strings.update_now + '</a>';
|
74 |
-
}
|
75 |
-
|
76 |
-
if( typeof localize.changelogs[init] != 'undefined' ){
|
77 |
-
html = html + localize.changelogs[init];
|
78 |
-
}
|
79 |
-
|
80 |
-
html = html +
|
81 |
-
'</div>' +
|
82 |
-
'</td>' +
|
83 |
-
'</tr>';
|
84 |
-
|
85 |
-
$(html).insertAfter(row);
|
86 |
-
}
|
87 |
-
}
|
88 |
-
}
|
89 |
-
|
90 |
-
/**
|
91 |
-
*
|
92 |
-
* @param v1 Version 1
|
93 |
-
* @param v2 Version 2
|
94 |
-
* @param operator Compare type
|
95 |
-
* @returns bool
|
96 |
-
*
|
97 |
-
* @see php.js library http://phpjs.org/
|
98 |
-
*/
|
99 |
-
function version_compare(v1, v2, operator) {
|
100 |
-
// discuss at: http://phpjs.org/functions/version_compare/
|
101 |
-
// original by: Philippe Jausions (http://pear.php.net/user/jausions)
|
102 |
-
// original by: Aidan Lister (http://aidanlister.com/)
|
103 |
-
// reimplemented by: Kankrelune (http://www.webfaktory.info/)
|
104 |
-
// improved by: Brett Zamir (http://brett-zamir.me)
|
105 |
-
// improved by: Scott Baker
|
106 |
-
// improved by: Theriault
|
107 |
-
// example 1: version_compare('8.2.5rc', '8.2.5a');
|
108 |
-
// returns 1: 1
|
109 |
-
// example 2: version_compare('8.2.50', '8.2.52', '<');
|
110 |
-
// returns 2: true
|
111 |
-
// example 3: version_compare('5.3.0-dev', '5.3.0');
|
112 |
-
// returns 3: -1
|
113 |
-
// example 4: version_compare('4.1.0.52','4.01.0.51');
|
114 |
-
// returns 4: 1
|
115 |
-
|
116 |
-
this.php_js = this.php_js || {};
|
117 |
-
this.php_js.ENV = this.php_js.ENV || {};
|
118 |
-
// END REDUNDANT
|
119 |
-
// Important: compare must be initialized at 0.
|
120 |
-
var i = 0,
|
121 |
-
x = 0,
|
122 |
-
compare = 0,
|
123 |
-
// vm maps textual PHP versions to negatives so they're less than 0.
|
124 |
-
// PHP currently defines these as CASE-SENSITIVE. It is important to
|
125 |
-
// leave these as negatives so that they can come before numerical versions
|
126 |
-
// and as if no letters were there to begin with.
|
127 |
-
// (1alpha is < 1 and < 1.1 but > 1dev1)
|
128 |
-
// If a non-numerical value can't be mapped to this table, it receives
|
129 |
-
// -7 as its value.
|
130 |
-
vm = {
|
131 |
-
'dev' : -6,
|
132 |
-
'alpha': -5,
|
133 |
-
'a' : -5,
|
134 |
-
'beta' : -4,
|
135 |
-
'b' : -4,
|
136 |
-
'RC' : -3,
|
137 |
-
'rc' : -3,
|
138 |
-
'#' : -2,
|
139 |
-
'p' : 1,
|
140 |
-
'pl' : 1
|
141 |
-
},
|
142 |
-
// This function will be called to prepare each version argument.
|
143 |
-
// It replaces every _, -, and + with a dot.
|
144 |
-
// It surrounds any nonsequence of numbers/dots with dots.
|
145 |
-
// It replaces sequences of dots with a single dot.
|
146 |
-
// version_compare('4..0', '4.0') == 0
|
147 |
-
// Important: A string of 0 length needs to be converted into a value
|
148 |
-
// even less than an unexisting value in vm (-7), hence [-8].
|
149 |
-
// It's also important to not strip spaces because of this.
|
150 |
-
// version_compare('', ' ') == 1
|
151 |
-
prepVersion = function (v) {
|
152 |
-
v = ('' + v)
|
153 |
-
.replace(/[_\-+]/g, '.');
|
154 |
-
v = v.replace(/([^.\d]+)/g, '.$1.')
|
155 |
-
.replace(/\.{2,}/g, '.');
|
156 |
-
return (!v.length ? [-8] : v.split('.'));
|
157 |
-
};
|
158 |
-
// This converts a version component to a number.
|
159 |
-
// Empty component becomes 0.
|
160 |
-
// Non-numerical component becomes a negative number.
|
161 |
-
// Numerical component becomes itself as an integer.
|
162 |
-
numVersion = function (v) {
|
163 |
-
return !v ? 0 : (isNaN(v) ? vm[v] || -7 : parseInt(v, 10));
|
164 |
-
};
|
165 |
-
v1 = prepVersion(v1);
|
166 |
-
v2 = prepVersion(v2);
|
167 |
-
x = Math.max(v1.length, v2.length);
|
168 |
-
for (i = 0; i < x; i++) {
|
169 |
-
if (v1[i] == v2[i]) {
|
170 |
-
continue;
|
171 |
-
}
|
172 |
-
v1[i] = numVersion(v1[i]);
|
173 |
-
v2[i] = numVersion(v2[i]);
|
174 |
-
if (v1[i] < v2[i]) {
|
175 |
-
compare = -1;
|
176 |
-
break;
|
177 |
-
} else if (v1[i] > v2[i]) {
|
178 |
-
compare = 1;
|
179 |
-
break;
|
180 |
-
}
|
181 |
-
}
|
182 |
-
if (!operator) {
|
183 |
-
return compare;
|
184 |
-
}
|
185 |
-
|
186 |
-
// Important: operator is CASE-SENSITIVE.
|
187 |
-
// "No operator" seems to be treated as "<."
|
188 |
-
// Any other values seem to make the function return null.
|
189 |
-
switch (operator) {
|
190 |
-
case '>':
|
191 |
-
case 'gt':
|
192 |
-
return (compare > 0);
|
193 |
-
case '>=':
|
194 |
-
case 'ge':
|
195 |
-
return (compare >= 0);
|
196 |
-
case '<=':
|
197 |
-
case 'le':
|
198 |
-
return (compare <= 0);
|
199 |
-
case '==':
|
200 |
-
case '=':
|
201 |
-
case 'eq':
|
202 |
-
return (compare === 0);
|
203 |
-
case '<>':
|
204 |
-
case '!=':
|
205 |
-
case 'ne':
|
206 |
-
return (compare !== 0);
|
207 |
-
case '':
|
208 |
-
case '<':
|
209 |
-
case 'lt':
|
210 |
-
return (compare < 0);
|
211 |
-
default:
|
212 |
-
return null;
|
213 |
-
}
|
214 |
-
}
|
215 |
-
|
216 |
-
})(jQuery);
|
1 |
+
/**
|
2 |
+
* This file belongs to the YIT Framework.
|
3 |
+
*
|
4 |
+
* This source file is subject to the GNU GENERAL PUBLIC LICENSE (GPL 3.0)
|
5 |
+
* that is bundled with this package in the file LICENSE.txt.
|
6 |
+
* It is also available through the world-wide-web at this URL:
|
7 |
+
* http://www.gnu.org/licenses/gpl-3.0.txt
|
8 |
+
*/
|
9 |
+
(function ($) {
|
10 |
+
|
11 |
+
var plugins_menu_item = $( '#menu-plugins' ),
|
12 |
+
update = plugins_menu_item.find('.update-plugins'),
|
13 |
+
count = update.find(".update-count").text(),
|
14 |
+
registered = plugins.registered,
|
15 |
+
activated = plugins.activated;
|
16 |
+
|
17 |
+
if( count == 0 || count == ''){
|
18 |
+
var update_row = '<span class="update-plugins"><span class="plugin-count"></span></span>';
|
19 |
+
count = 0;
|
20 |
+
plugins_menu_item.find( '.wp-menu-name').append( update_row );
|
21 |
+
}
|
22 |
+
|
23 |
+
/**
|
24 |
+
* Add the plugin update rows for old plugins
|
25 |
+
*/
|
26 |
+
update_plugins_row( registered, activated, count, plugins );
|
27 |
+
|
28 |
+
/**
|
29 |
+
*
|
30 |
+
* Add the update plugin rows for old plugin
|
31 |
+
*
|
32 |
+
* @author Andrea Grillo <andrea.grillo@yithemes.com>
|
33 |
+
*
|
34 |
+
* @param registered Registred plugins
|
35 |
+
* @param activated Activated plugins
|
36 |
+
* @param count Number of old plugins
|
37 |
+
* @param localize Localize strings array
|
38 |
+
*
|
39 |
+
* @return void
|
40 |
+
*/
|
41 |
+
function update_plugins_row( registered, activated, count, localize ){
|
42 |
+
for( var init in registered ){
|
43 |
+
var plugin = registered[init];
|
44 |
+
for( var headers in plugin ){
|
45 |
+
|
46 |
+
if( headers == 'slug' || version_compare( plugin[headers].Version, plugin[headers].Latest, '>=' ) ) {
|
47 |
+
continue;
|
48 |
+
}
|
49 |
+
|
50 |
+
count = parseInt(count) + 1;
|
51 |
+
$(".plugin-count").empty().html(count);
|
52 |
+
|
53 |
+
var regex = new RegExp(' ', 'g'),
|
54 |
+
info = plugin[headers],
|
55 |
+
name = '' + info.Name,
|
56 |
+
id = name.replace(regex, '-').trim(),
|
57 |
+
row = '*[data-slug="' + id.toLowerCase() +'"]';
|
58 |
+
|
59 |
+
$(row).addClass("update");
|
60 |
+
|
61 |
+
var html = '<tr class="plugin-update-tr">' +
|
62 |
+
'<td colspan="3" class="plugin-update colspanchange">' +
|
63 |
+
'<div class="update-message">' + localize.strings.new_version.replace( '%plugin_name%', name ) +
|
64 |
+
'<a class="thickbox" href="' + localize.details_url[init] + '">' + localize.strings.latest.replace( '%latest%', plugin[headers].Latest ) + '</a>';
|
65 |
+
|
66 |
+
if( typeof activated[init] == "undefined" ) {
|
67 |
+
|
68 |
+
html = html +
|
69 |
+
' <em>' + localize.strings.unavailable + '</em>' +
|
70 |
+
localize.strings.activate.replace( '%activate_link%', localize.licence_activation_url ).replace( '%plugin_name%', name );
|
71 |
+
} else {
|
72 |
+
html = html +
|
73 |
+
'. <a href="' + localize.update_url[init] + '">' + localize.strings.update_now + '</a>';
|
74 |
+
}
|
75 |
+
|
76 |
+
if( typeof localize.changelogs[init] != 'undefined' ){
|
77 |
+
html = html + localize.changelogs[init];
|
78 |
+
}
|
79 |
+
|
80 |
+
html = html +
|
81 |
+
'</div>' +
|
82 |
+
'</td>' +
|
83 |
+
'</tr>';
|
84 |
+
|
85 |
+
$(html).insertAfter(row);
|
86 |
+
}
|
87 |
+
}
|
88 |
+
}
|
89 |
+
|
90 |
+
/**
|
91 |
+
*
|
92 |
+
* @param v1 Version 1
|
93 |
+
* @param v2 Version 2
|
94 |
+
* @param operator Compare type
|
95 |
+
* @returns bool
|
96 |
+
*
|
97 |
+
* @see php.js library http://phpjs.org/
|
98 |
+
*/
|
99 |
+
function version_compare(v1, v2, operator) {
|
100 |
+
// discuss at: http://phpjs.org/functions/version_compare/
|
101 |
+
// original by: Philippe Jausions (http://pear.php.net/user/jausions)
|
102 |
+
// original by: Aidan Lister (http://aidanlister.com/)
|
103 |
+
// reimplemented by: Kankrelune (http://www.webfaktory.info/)
|
104 |
+
// improved by: Brett Zamir (http://brett-zamir.me)
|
105 |
+
// improved by: Scott Baker
|
106 |
+
// improved by: Theriault
|
107 |
+
// example 1: version_compare('8.2.5rc', '8.2.5a');
|
108 |
+
// returns 1: 1
|
109 |
+
// example 2: version_compare('8.2.50', '8.2.52', '<');
|
110 |
+
// returns 2: true
|
111 |
+
// example 3: version_compare('5.3.0-dev', '5.3.0');
|
112 |
+
// returns 3: -1
|
113 |
+
// example 4: version_compare('4.1.0.52','4.01.0.51');
|
114 |
+
// returns 4: 1
|
115 |
+
|
116 |
+
this.php_js = this.php_js || {};
|
117 |
+
this.php_js.ENV = this.php_js.ENV || {};
|
118 |
+
// END REDUNDANT
|
119 |
+
// Important: compare must be initialized at 0.
|
120 |
+
var i = 0,
|
121 |
+
x = 0,
|
122 |
+
compare = 0,
|
123 |
+
// vm maps textual PHP versions to negatives so they're less than 0.
|
124 |
+
// PHP currently defines these as CASE-SENSITIVE. It is important to
|
125 |
+
// leave these as negatives so that they can come before numerical versions
|
126 |
+
// and as if no letters were there to begin with.
|
127 |
+
// (1alpha is < 1 and < 1.1 but > 1dev1)
|
128 |
+
// If a non-numerical value can't be mapped to this table, it receives
|
129 |
+
// -7 as its value.
|
130 |
+
vm = {
|
131 |
+
'dev' : -6,
|
132 |
+
'alpha': -5,
|
133 |
+
'a' : -5,
|
134 |
+
'beta' : -4,
|
135 |
+
'b' : -4,
|
136 |
+
'RC' : -3,
|
137 |
+
'rc' : -3,
|
138 |
+
'#' : -2,
|
139 |
+
'p' : 1,
|
140 |
+
'pl' : 1
|
141 |
+
},
|
142 |
+
// This function will be called to prepare each version argument.
|
143 |
+
// It replaces every _, -, and + with a dot.
|
144 |
+
// It surrounds any nonsequence of numbers/dots with dots.
|
145 |
+
// It replaces sequences of dots with a single dot.
|
146 |
+
// version_compare('4..0', '4.0') == 0
|
147 |
+
// Important: A string of 0 length needs to be converted into a value
|
148 |
+
// even less than an unexisting value in vm (-7), hence [-8].
|
149 |
+
// It's also important to not strip spaces because of this.
|
150 |
+
// version_compare('', ' ') == 1
|
151 |
+
prepVersion = function (v) {
|
152 |
+
v = ('' + v)
|
153 |
+
.replace(/[_\-+]/g, '.');
|
154 |
+
v = v.replace(/([^.\d]+)/g, '.$1.')
|
155 |
+
.replace(/\.{2,}/g, '.');
|
156 |
+
return (!v.length ? [-8] : v.split('.'));
|
157 |
+
};
|
158 |
+
// This converts a version component to a number.
|
159 |
+
// Empty component becomes 0.
|
160 |
+
// Non-numerical component becomes a negative number.
|
161 |
+
// Numerical component becomes itself as an integer.
|
162 |
+
numVersion = function (v) {
|
163 |
+
return !v ? 0 : (isNaN(v) ? vm[v] || -7 : parseInt(v, 10));
|
164 |
+
};
|
165 |
+
v1 = prepVersion(v1);
|
166 |
+
v2 = prepVersion(v2);
|
167 |
+
x = Math.max(v1.length, v2.length);
|
168 |
+
for (i = 0; i < x; i++) {
|
169 |
+
if (v1[i] == v2[i]) {
|
170 |
+
continue;
|
171 |
+
}
|
172 |
+
v1[i] = numVersion(v1[i]);
|
173 |
+
v2[i] = numVersion(v2[i]);
|
174 |
+
if (v1[i] < v2[i]) {
|
175 |
+
compare = -1;
|
176 |
+
break;
|
177 |
+
} else if (v1[i] > v2[i]) {
|
178 |
+
compare = 1;
|
179 |
+
break;
|
180 |
+
}
|
181 |
+
}
|
182 |
+
if (!operator) {
|
183 |
+
return compare;
|
184 |
+
}
|
185 |
+
|
186 |
+
// Important: operator is CASE-SENSITIVE.
|
187 |
+
// "No operator" seems to be treated as "<."
|
188 |
+
// Any other values seem to make the function return null.
|
189 |
+
switch (operator) {
|
190 |
+
case '>':
|
191 |
+
case 'gt':
|
192 |
+
return (compare > 0);
|
193 |
+
case '>=':
|
194 |
+
case 'ge':
|
195 |
+
return (compare >= 0);
|
196 |
+
case '<=':
|
197 |
+
case 'le':
|
198 |
+
return (compare <= 0);
|
199 |
+
case '==':
|
200 |
+
case '=':
|
201 |
+
case 'eq':
|
202 |
+
return (compare === 0);
|
203 |
+
case '<>':
|
204 |
+
case '!=':
|
205 |
+
case 'ne':
|
206 |
+
return (compare !== 0);
|
207 |
+
case '':
|
208 |
+
case '<':
|
209 |
+
case 'lt':
|
210 |
+
return (compare < 0);
|
211 |
+
default:
|
212 |
+
return null;
|
213 |
+
}
|
214 |
+
}
|
215 |
+
|
216 |
+
})(jQuery);
|
plugin-fw/assets/js/panel.spinner.js
CHANGED
@@ -1,139 +1,139 @@
|
|
1 |
-
/*
|
2 |
-
Spinner for jQuery (version 0.1)
|
3 |
-
Copyright (c) 2012 Simone D'Amico
|
4 |
-
http://simonedamico.com/
|
5 |
-
|
6 |
-
Licensed under the MIT license:
|
7 |
-
http://www.opensource.org/licenses/mit-license.php
|
8 |
-
|
9 |
-
Any and all use of this script must be accompanied by this copyright/license notice in its present form.
|
10 |
-
|
11 |
-
*/
|
12 |
-
(function($){
|
13 |
-
$.fn.spinner = function(params) {
|
14 |
-
|
15 |
-
//private methods
|
16 |
-
var _createButton = function( buttonClass, buttonLabel ) {
|
17 |
-
return $('<button/>', {
|
18 |
-
'class' : buttonClass + ' spinner-button',
|
19 |
-
text : buttonLabel
|
20 |
-
});
|
21 |
-
};
|
22 |
-
|
23 |
-
var _createBody = function(input) {
|
24 |
-
//create wrapper
|
25 |
-
var wrapper = input.wrap('<div class="spinner-wrapper"></div>').parent();
|
26 |
-
|
27 |
-
//create spinner buttons
|
28 |
-
var plus = _createButton('button-plus', '+').appendTo(wrapper).show(),
|
29 |
-
minus = _createButton('button-minus', '-').appendTo(wrapper).show();
|
30 |
-
|
31 |
-
return wrapper;
|
32 |
-
};
|
33 |
-
|
34 |
-
var _buttonClick = function( e ) {
|
35 |
-
var input = e.data.input,
|
36 |
-
params = e.data.params,
|
37 |
-
button = $(this),
|
38 |
-
value = parseFloat(input.val());
|
39 |
-
|
40 |
-
if( button.hasClass('button-plus') ) {
|
41 |
-
if( params.max != null ) {
|
42 |
-
if( ( value + params.interval ) <= params.max ) {
|
43 |
-
input.val( value + params.interval );
|
44 |
-
} else {
|
45 |
-
input.val( params.max );
|
46 |
-
}
|
47 |
-
} else {
|
48 |
-
input.val( value + params.interval );
|
49 |
-
}
|
50 |
-
} else if( button.hasClass('button-minus') ) {
|
51 |
-
if( params.min != null ) {
|
52 |
-
if( ( value - params.interval ) >= params.min ) {
|
53 |
-
input.val( value - params.interval );
|
54 |
-
} else {
|
55 |
-
input.val( params.min );
|
56 |
-
}
|
57 |
-
} else {
|
58 |
-
input.val( value - params.interval );
|
59 |
-
}
|
60 |
-
}
|
61 |
-
|
62 |
-
input.change(); e.preventDefault();
|
63 |
-
};
|
64 |
-
|
65 |
-
var _validateContent = function( e ) {
|
66 |
-
var value = parseFloat( $(this).val() );
|
67 |
-
|
68 |
-
if( params.max != null && value >= params.max ) {
|
69 |
-
$(this).val(params.max);
|
70 |
-
} else if( value <= params.min || isNaN( value ) ) {
|
71 |
-
$(this).val(params.min ? params.min : 0);
|
72 |
-
} else {
|
73 |
-
$(this).val(value);
|
74 |
-
}
|
75 |
-
};
|
76 |
-
|
77 |
-
|
78 |
-
//public methods
|
79 |
-
var methods = {
|
80 |
-
init : function( params ) {
|
81 |
-
|
82 |
-
var params = $.extend({
|
83 |
-
min: null,
|
84 |
-
max: null,
|
85 |
-
interval: 1,
|
86 |
-
defaultValue: 0,
|
87 |
-
mouseWheel: true,
|
88 |
-
largeInterval: 10
|
89 |
-
}, params);
|
90 |
-
|
91 |
-
var self = this,
|
92 |
-
t = $(this),
|
93 |
-
data = t.data('spinner');
|
94 |
-
|
95 |
-
return this.each(function(){
|
96 |
-
//check if the plugin hasn't already been initialized
|
97 |
-
//and it's an input[type=text] element
|
98 |
-
if( !data && t.is(':text') ) {
|
99 |
-
//initialize the value
|
100 |
-
if( params.defaultValue ) {
|
101 |
-
t.val( params.defaultValue );
|
102 |
-
}
|
103 |
-
|
104 |
-
//create the spinner body
|
105 |
-
var wrapper = _createBody(t);
|
106 |
-
|
107 |
-
//event handlers
|
108 |
-
//var mouseWheelEventName = $.browser.mozilla ? 'DOMMouseScroll' : 'mousewheel';
|
109 |
-
|
110 |
-
wrapper.find('.spinner-button')
|
111 |
-
.bind('click.spinner', { params: params, input: t }, _buttonClick);
|
112 |
-
|
113 |
-
t.bind('blur.spinner', _validateContent)
|
114 |
-
//.bind('keyup.spinner', _validateKey)
|
115 |
-
//.bind(mouseWheelEventName, _inputMousewheel);
|
116 |
-
|
117 |
-
//register field data
|
118 |
-
t.data('spinner', {
|
119 |
-
target: self
|
120 |
-
});
|
121 |
-
}
|
122 |
-
});
|
123 |
-
},
|
124 |
-
|
125 |
-
destroy : function( params) {
|
126 |
-
console.log('destroy', params);
|
127 |
-
}
|
128 |
-
};
|
129 |
-
|
130 |
-
//execute the plugin
|
131 |
-
if ( methods[params] ) {
|
132 |
-
return methods[params].apply( this, Array.prototype.slice.call( arguments, 1 ));
|
133 |
-
} else if ( typeof params === 'object' || ! params ) {
|
134 |
-
return methods.init.apply( this, arguments );
|
135 |
-
} else {
|
136 |
-
$.error( 'Method ' + params + ' does not exist' );
|
137 |
-
}
|
138 |
-
};
|
139 |
-
})(jQuery);
|
1 |
+
/*
|
2 |
+
Spinner for jQuery (version 0.1)
|
3 |
+
Copyright (c) 2012 Simone D'Amico
|
4 |
+
http://simonedamico.com/
|
5 |
+
|
6 |
+
Licensed under the MIT license:
|
7 |
+
http://www.opensource.org/licenses/mit-license.php
|
8 |
+
|
9 |
+
Any and all use of this script must be accompanied by this copyright/license notice in its present form.
|
10 |
+
|
11 |
+
*/
|
12 |
+
(function($){
|
13 |
+
$.fn.spinner = function(params) {
|
14 |
+
|
15 |
+
//private methods
|
16 |
+
var _createButton = function( buttonClass, buttonLabel ) {
|
17 |
+
return $('<button/>', {
|
18 |
+
'class' : buttonClass + ' spinner-button',
|
19 |
+
text : buttonLabel
|
20 |
+
});
|
21 |
+
};
|
22 |
+
|
23 |
+
var _createBody = function(input) {
|
24 |
+
//create wrapper
|
25 |
+
var wrapper = input.wrap('<div class="spinner-wrapper"></div>').parent();
|
26 |
+
|
27 |
+
//create spinner buttons
|
28 |
+
var plus = _createButton('button-plus', '+').appendTo(wrapper).show(),
|
29 |
+
minus = _createButton('button-minus', '-').appendTo(wrapper).show();
|
30 |
+
|
31 |
+
return wrapper;
|
32 |
+
};
|
33 |
+
|
34 |
+
var _buttonClick = function( e ) {
|
35 |
+
var input = e.data.input,
|
36 |
+
params = e.data.params,
|
37 |
+
button = $(this),
|
38 |
+
value = parseFloat(input.val());
|
39 |
+
|
40 |
+
if( button.hasClass('button-plus') ) {
|
41 |
+
if( params.max != null ) {
|
42 |
+
if( ( value + params.interval ) <= params.max ) {
|
43 |
+
input.val( value + params.interval );
|
44 |
+
} else {
|
45 |
+
input.val( params.max );
|
46 |
+
}
|
47 |
+
} else {
|
48 |
+
input.val( value + params.interval );
|
49 |
+
}
|
50 |
+
} else if( button.hasClass('button-minus') ) {
|
51 |
+
if( params.min != null ) {
|
52 |
+
if( ( value - params.interval ) >= params.min ) {
|
53 |
+
input.val( value - params.interval );
|
54 |
+
} else {
|
55 |
+
input.val( params.min );
|
56 |
+
}
|
57 |
+
} else {
|
58 |
+
input.val( value - params.interval );
|
59 |
+
}
|
60 |
+
}
|
61 |
+
|
62 |
+
input.change(); e.preventDefault();
|
63 |
+
};
|
64 |
+
|
65 |
+
var _validateContent = function( e ) {
|
66 |
+
var value = parseFloat( $(this).val() );
|
67 |
+
|
68 |
+
if( params.max != null && value >= params.max ) {
|
69 |
+
$(this).val(params.max);
|
70 |
+
} else if( value <= params.min || isNaN( value ) ) {
|
71 |
+
$(this).val(params.min ? params.min : 0);
|
72 |
+
} else {
|
73 |
+
$(this).val(value);
|
74 |
+
}
|
75 |
+
};
|
76 |
+
|
77 |
+
|
78 |
+
//public methods
|
79 |
+
var methods = {
|
80 |
+
init : function( params ) {
|
81 |
+
|
82 |
+
var params = $.extend({
|
83 |
+
min: null,
|
84 |
+
max: null,
|
85 |
+
interval: 1,
|
86 |
+
defaultValue: 0,
|
87 |
+
mouseWheel: true,
|
88 |
+
largeInterval: 10
|
89 |
+
}, params);
|
90 |
+
|
91 |
+
var self = this,
|
92 |
+
t = $(this),
|
93 |
+
data = t.data('spinner');
|
94 |
+
|
95 |
+
return this.each(function(){
|
96 |
+
//check if the plugin hasn't already been initialized
|
97 |
+
//and it's an input[type=text] element
|
98 |
+
if( !data && t.is(':text') ) {
|
99 |
+
//initialize the value
|
100 |
+
if( params.defaultValue ) {
|
101 |
+
t.val( params.defaultValue );
|
102 |
+
}
|
103 |
+
|
104 |
+
//create the spinner body
|
105 |
+
var wrapper = _createBody(t);
|
106 |
+
|
107 |
+
//event handlers
|
108 |
+
//var mouseWheelEventName = $.browser.mozilla ? 'DOMMouseScroll' : 'mousewheel';
|
109 |
+
|
110 |
+
wrapper.find('.spinner-button')
|
111 |
+
.bind('click.spinner', { params: params, input: t }, _buttonClick);
|
112 |
+
|
113 |
+
t.bind('blur.spinner', _validateContent)
|
114 |
+
//.bind('keyup.spinner', _validateKey)
|
115 |
+
//.bind(mouseWheelEventName, _inputMousewheel);
|
116 |
+
|
117 |
+
//register field data
|
118 |
+
t.data('spinner', {
|
119 |
+
target: self
|
120 |
+
});
|
121 |
+
}
|
122 |
+
});
|
123 |
+
},
|
124 |
+
|
125 |
+
destroy : function( params) {
|
126 |
+
console.log('destroy', params);
|
127 |
+
}
|
128 |
+
};
|
129 |
+
|
130 |
+
//execute the plugin
|
131 |
+
if ( methods[params] ) {
|
132 |
+
return methods[params].apply( this, Array.prototype.slice.call( arguments, 1 ));
|
133 |
+
} else if ( typeof params === 'object' || ! params ) {
|
134 |
+
return methods.init.apply( this, arguments );
|
135 |
+
} else {
|
136 |
+
$.error( 'Method ' + params + ' does not exist' );
|
137 |
+
}
|
138 |
+
};
|
139 |
+
})(jQuery);
|
plugin-fw/assets/js/panel.spinner.min.js
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
-
(function(d){d.fn.spinner=function(c){var h=function(b,e){return d("<button/>",{"class":b+" spinner-button",text:e})},k=function(b){var e=b.data.input,a=b.data.params,c=d(this),f=parseFloat(e.val());c.hasClass("button-plus")?null!=a.max?f+a.interval<=a.max?e.val(f+a.interval):e.val(a.max):e.val(f+a.interval):c.hasClass("button-minus")&&(null!=a.min?f-a.interval>=a.min?e.val(f-a.interval):e.val(a.min):e.val(f-a.interval));e.change();b.preventDefault()},l=function(b){b=parseFloat(d(this).val());null!=
|
2 |
-
c.max&&b>=c.max?d(this).val(c.max):b<=c.min||isNaN(b)?d(this).val(c.min?c.min:0):d(this).val(b)},g={init:function(b){b=d.extend({min:null,max:null,interval:1,defaultValue:0,mouseWheel:!0,largeInterval:10},b);var c=this,a=d(this),g=a.data("spinner");return this.each(function(){if(!g&&a.is(":text")){b.defaultValue&&a.val(b.defaultValue);var d=a.wrap('<div class="spinner-wrapper"></div>').parent();h("button-plus","+").appendTo(d).show();h("button-minus","-").appendTo(d).show();d.find(".spinner-button").bind("click.spinner",
|
3 |
-
{params:b,input:a},k);a.bind("blur.spinner",l);a.data("spinner",{target:c})}})},destroy:function(b){console.log("destroy",b)}};if(g[c])return g[c].apply(this,Array.prototype.slice.call(arguments,1));if("object"!==typeof c&&c)d.error("Method "+c+" does not exist");else return g.init.apply(this,arguments)}})(jQuery);
|
1 |
+
(function(d){d.fn.spinner=function(c){var h=function(b,e){return d("<button/>",{"class":b+" spinner-button",text:e})},k=function(b){var e=b.data.input,a=b.data.params,c=d(this),f=parseFloat(e.val());c.hasClass("button-plus")?null!=a.max?f+a.interval<=a.max?e.val(f+a.interval):e.val(a.max):e.val(f+a.interval):c.hasClass("button-minus")&&(null!=a.min?f-a.interval>=a.min?e.val(f-a.interval):e.val(a.min):e.val(f-a.interval));e.change();b.preventDefault()},l=function(b){b=parseFloat(d(this).val());null!=
|
2 |
+
c.max&&b>=c.max?d(this).val(c.max):b<=c.min||isNaN(b)?d(this).val(c.min?c.min:0):d(this).val(b)},g={init:function(b){b=d.extend({min:null,max:null,interval:1,defaultValue:0,mouseWheel:!0,largeInterval:10},b);var c=this,a=d(this),g=a.data("spinner");return this.each(function(){if(!g&&a.is(":text")){b.defaultValue&&a.val(b.defaultValue);var d=a.wrap('<div class="spinner-wrapper"></div>').parent();h("button-plus","+").appendTo(d).show();h("button-minus","-").appendTo(d).show();d.find(".spinner-button").bind("click.spinner",
|
3 |
+
{params:b,input:a},k);a.bind("blur.spinner",l);a.data("spinner",{target:c})}})},destroy:function(b){console.log("destroy",b)}};if(g[c])return g[c].apply(this,Array.prototype.slice.call(arguments,1));if("object"!==typeof c&&c)d.error("Method "+c+" does not exist");else return g.init.apply(this,arguments)}})(jQuery);
|
plugin-fw/assets/js/yit-cpt-unlimited.js
CHANGED
@@ -1,79 +1,79 @@
|
|
1 |
-
/**
|
2 |
-
* This file belongs to the YIT Framework.
|
3 |
-
*
|
4 |
-
* This source file is subject to the GNU GENERAL PUBLIC LICENSE (GPL 3.0)
|
5 |
-
* that is bundled with this package in the file LICENSE.txt.
|
6 |
-
* It is also available through the world-wide-web at this URL:
|
7 |
-
* http://www.gnu.org/licenses/gpl-3.0.txt
|
8 |
-
*/
|
9 |
-
|
10 |
-
(function($) {
|
11 |
-
"use strict";
|
12 |
-
// Author code here
|
13 |
-
|
14 |
-
// open media box
|
15 |
-
$('.wrap h1, .wrap h2').on( 'click', 'a.multi-uploader', function(event){
|
16 |
-
event.preventDefault();
|
17 |
-
|
18 |
-
var file_frame,
|
19 |
-
button = $(this),
|
20 |
-
selected = false;
|
21 |
-
|
22 |
-
// spinner
|
23 |
-
button.next('span.spinner').css( 'display', 'inline-block' );
|
24 |
-
|
25 |
-
// If the media frame already exists, reopen it.
|
26 |
-
if ( file_frame ) {
|
27 |
-
file_frame.open();
|
28 |
-
return;
|
29 |
-
}
|
30 |
-
|
31 |
-
// Create the media frame.
|
32 |
-
file_frame = wp.media.frames.file_frame = wp.media({
|
33 |
-
title: button.data( 'uploader_title' ),
|
34 |
-
button: {
|
35 |
-
text: button.data( 'uploader_button_text' )
|
36 |
-
},
|
37 |
-
library: {
|
38 |
-
type: 'image'
|
39 |
-
},
|
40 |
-
multiple: true // Set to true to allow multiple files to be selected
|
41 |
-
});
|
42 |
-
|
43 |
-
// When an image is selected, run a callback.
|
44 |
-
file_frame.on( 'select', function() {
|
45 |
-
var selection = file_frame.state().get('selection'),
|
46 |
-
images = [];
|
47 |
-
|
48 |
-
selection.map( function( attachment ) {
|
49 |
-
attachment = attachment.toJSON();
|
50 |
-
|
51 |
-
// Do something with attachment.id and/or attachment.url here
|
52 |
-
images.push( { id: attachment.id, url: attachment.url, title: attachment.title } );
|
53 |
-
});
|
54 |
-
|
55 |
-
// make AJAX request
|
56 |
-
$.post( ajaxurl, {
|
57 |
-
images: images,
|
58 |
-
post_type: typenow,
|
59 |
-
action: 'yit_cptu_multiuploader'
|
60 |
-
}, function( data ){
|
61 |
-
location.reload();
|
62 |
-
});
|
63 |
-
|
64 |
-
button.next('span.spinner').css( 'display', 'inline-block' );
|
65 |
-
|
66 |
-
// flag
|
67 |
-
selected = true;
|
68 |
-
});
|
69 |
-
|
70 |
-
// when close
|
71 |
-
file_frame.on( 'close', function() {
|
72 |
-
if ( ! selected ) button.next('span.spinner').hide();
|
73 |
-
});
|
74 |
-
|
75 |
-
// Finally, open the modal
|
76 |
-
file_frame.open();
|
77 |
-
});
|
78 |
-
|
79 |
})(jQuery);
|
1 |
+
/**
|
2 |
+
* This file belongs to the YIT Framework.
|
3 |
+
*
|
4 |
+
* This source file is subject to the GNU GENERAL PUBLIC LICENSE (GPL 3.0)
|
5 |
+
* that is bundled with this package in the file LICENSE.txt.
|
6 |
+
* It is also available through the world-wide-web at this URL:
|
7 |
+
* http://www.gnu.org/licenses/gpl-3.0.txt
|
8 |
+
*/
|
9 |
+
|
10 |
+
(function($) {
|
11 |
+
"use strict";
|
12 |
+
// Author code here
|
13 |
+
|
14 |
+
// open media box
|
15 |
+
$('.wrap h1, .wrap h2').on( 'click', 'a.multi-uploader', function(event){
|
16 |
+
event.preventDefault();
|
17 |
+
|
18 |
+
var file_frame,
|
19 |
+
button = $(this),
|
20 |
+
selected = false;
|
21 |
+
|
22 |
+
// spinner
|
23 |
+
button.next('span.spinner').css( 'display', 'inline-block' );
|
24 |
+
|
25 |
+
// If the media frame already exists, reopen it.
|
26 |
+
if ( file_frame ) {
|
27 |
+
file_frame.open();
|
28 |
+
return;
|
29 |
+
}
|
30 |
+
|
31 |
+
// Create the media frame.
|
32 |
+
file_frame = wp.media.frames.file_frame = wp.media({
|
33 |
+
title: button.data( 'uploader_title' ),
|
34 |
+
button: {
|
35 |
+
text: button.data( 'uploader_button_text' )
|
36 |
+
},
|
37 |
+
library: {
|
38 |
+
type: 'image'
|
39 |
+
},
|
40 |
+
multiple: true // Set to true to allow multiple files to be selected
|
41 |
+
});
|
42 |
+
|
43 |
+
// When an image is selected, run a callback.
|
44 |
+
file_frame.on( 'select', function() {
|
45 |
+
var selection = file_frame.state().get('selection'),
|
46 |
+
images = [];
|
47 |
+
|
48 |
+
selection.map( function( attachment ) {
|
49 |
+
attachment = attachment.toJSON();
|
50 |
+
|
51 |
+
// Do something with attachment.id and/or attachment.url here
|
52 |
+
images.push( { id: attachment.id, url: attachment.url, title: attachment.title } );
|
53 |
+
});
|
54 |
+
|
55 |
+
// make AJAX request
|
56 |
+
$.post( ajaxurl, {
|
57 |
+
images: images,
|
58 |
+
post_type: typenow,
|
59 |
+
action: 'yit_cptu_multiuploader'
|
60 |
+
}, function( data ){
|
61 |
+
location.reload();
|
62 |
+
});
|
63 |
+
|
64 |
+
button.next('span.spinner').css( 'display', 'inline-block' );
|
65 |
+
|
66 |
+
// flag
|
67 |
+
selected = true;
|
68 |
+
});
|
69 |
+
|
70 |
+
// when close
|
71 |
+
file_frame.on( 'close', function() {
|
72 |
+
if ( ! selected ) button.next('span.spinner').hide();
|
73 |
+
});
|
74 |
+
|
75 |
+
// Finally, open the modal
|
76 |
+
file_frame.open();
|
77 |
+
});
|
78 |
+
|
79 |
})(jQuery);
|
plugin-fw/assets/js/yit-cpt-unlimited.min.js
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
-
(function(c){c(".wrap h1, .wrap h2").on("click","a.multi-uploader",function(f){f.preventDefault();var a,b=c(this),d=!1;b.next("span.spinner").css("display","inline-block");a||(a=wp.media.frames.file_frame=wp.media({title:b.data("uploader_title"),button:{text:b.data("uploader_button_text")},library:{type:"image"},multiple:!0}),a.on("select",function(){var e=[];a.state().get("selection").map(function(a){a=a.toJSON();e.push({id:a.id,url:a.url,title:a.title})});c.post(ajaxurl,{images:e,post_type:typenow,action:"yit_cptu_multiuploader"},
|
2 |
-
function(a){location.reload()});b.next("span.spinner").css("display","inline-block");d=!0}),a.on("close",function(){d||b.next("span.spinner").hide()}));a.open()})})(jQuery);
|
1 |
+
(function(c){c(".wrap h1, .wrap h2").on("click","a.multi-uploader",function(f){f.preventDefault();var a,b=c(this),d=!1;b.next("span.spinner").css("display","inline-block");a||(a=wp.media.frames.file_frame=wp.media({title:b.data("uploader_title"),button:{text:b.data("uploader_button_text")},library:{type:"image"},multiple:!0}),a.on("select",function(){var e=[];a.state().get("selection").map(function(a){a=a.toJSON();e.push({id:a.id,url:a.url,title:a.title})});c.post(ajaxurl,{images:e,post_type:typenow,action:"yit_cptu_multiuploader"},
|
2 |
+
function(a){location.reload()});b.next("span.spinner").css("display","inline-block");d=!0}),a.on("close",function(){d||b.next("span.spinner").hide()}));a.open()})})(jQuery);
|
plugin-fw/assets/js/yit-cptu-sortable-posts.js
CHANGED
@@ -1,32 +1,32 @@
|
|
1 |
-
/**
|
2 |
-
* This file belongs to the YIT Framework.
|
3 |
-
*
|
4 |
-
* This source file is subject to the GNU GENERAL PUBLIC LICENSE (GPL 3.0)
|
5 |
-
* that is bundled with this package in the file LICENSE.txt.
|
6 |
-
* It is also available through the world-wide-web at this URL:
|
7 |
-
* http://www.gnu.org/licenses/gpl-3.0.txt
|
8 |
-
*/
|
9 |
-
|
10 |
-
(function($) {
|
11 |
-
"use strict";
|
12 |
-
// Author code here
|
13 |
-
|
14 |
-
$("#the-list").sortable({
|
15 |
-
items : 'tr',
|
16 |
-
axis : 'y',
|
17 |
-
helper : function(e, ui) {
|
18 |
-
ui.children().children().each(function() {
|
19 |
-
$(this).width( $(this).width() );
|
20 |
-
});
|
21 |
-
return ui;
|
22 |
-
},
|
23 |
-
update : function(e, ui) {
|
24 |
-
$.post( ajaxurl, {
|
25 |
-
action: 'cpt_sort_posts',
|
26 |
-
order: $("#the-list").sortable("serialize"),
|
27 |
-
post_type: typenow
|
28 |
-
});
|
29 |
-
}
|
30 |
-
});
|
31 |
-
|
32 |
})(jQuery);
|
1 |
+
/**
|
2 |
+
* This file belongs to the YIT Framework.
|
3 |
+
*
|
4 |
+
* This source file is subject to the GNU GENERAL PUBLIC LICENSE (GPL 3.0)
|
5 |
+
* that is bundled with this package in the file LICENSE.txt.
|
6 |
+
* It is also available through the world-wide-web at this URL:
|
7 |
+
* http://www.gnu.org/licenses/gpl-3.0.txt
|
8 |
+
*/
|
9 |
+
|
10 |
+
(function($) {
|
11 |
+
"use strict";
|
12 |
+
// Author code here
|
13 |
+
|
14 |
+
$("#the-list").sortable({
|
15 |
+
items : 'tr',
|
16 |
+
axis : 'y',
|
17 |
+
helper : function(e, ui) {
|
18 |
+
ui.children().children().each(function() {
|
19 |
+
$(this).width( $(this).width() );
|
20 |
+
});
|
21 |
+
return ui;
|
22 |
+
},
|
23 |
+
update : function(e, ui) {
|
24 |
+
$.post( ajaxurl, {
|
25 |
+
action: 'cpt_sort_posts',
|
26 |
+
order: $("#the-list").sortable("serialize"),
|
27 |
+
post_type: typenow
|
28 |
+
});
|
29 |
+
}
|
30 |
+
});
|
31 |
+
|
32 |
})(jQuery);
|
plugin-fw/assets/js/yit-plugin-panel-sidebar.js
CHANGED
@@ -1,56 +1,56 @@
|
|
1 |
-
/**
|
2 |
-
* This file belongs to the YIT Plugin Framework.
|
3 |
-
*
|
4 |
-
* This source file is subject to the GNU GENERAL PUBLIC LICENSE (GPL 3.0)
|
5 |
-
* that is bundled with this package in the file LICENSE.txt.
|
6 |
-
* It is also available through the world-wide-web at this URL:
|
7 |
-
* http://www.gnu.org/licenses/gpl-3.0.txt
|
8 |
-
*/
|
9 |
-
|
10 |
-
|
11 |
-
(function ( $ ) {
|
12 |
-
var hide_sidebar_btn = $( '#yit-panel-sidebar-action-hide' ),
|
13 |
-
hide_sidebar_text = hide_sidebar_btn.find( '.yit-panel-sidebar-action-title' ),
|
14 |
-
sidebar = $( '#yit-panel-sidebar' ),
|
15 |
-
panel_wrapper = $( '.' + sidebar_labels.wrapper_class ),
|
16 |
-
ajax_hide_option_save_call,
|
17 |
-
ajax_hide_option_save = function ( option ) {
|
18 |
-
if ( ajax_hide_option_save_call ) {
|
19 |
-
ajax_hide_option_save_call.abort();
|
20 |
-
}
|
21 |
-
|
22 |
-
var post_data = {
|
23 |
-
option: option,
|
24 |
-
action: 'yith_plugin_panel_sidebar_set_collapse_option'
|
25 |
-
};
|
26 |
-
|
27 |
-
ajax_hide_option_save_call = $.ajax( {
|
28 |
-
type: "POST",
|
29 |
-
data: post_data,
|
30 |
-
url: ajaxurl
|
31 |
-
} );
|
32 |
-
},
|
33 |
-
hide_sidebar = function () {
|
34 |
-
hide_sidebar_btn.removeClass( 'hide-on-click' );
|
35 |
-
hide_sidebar_text.html( sidebar_labels.show_sidebar );
|
36 |
-
sidebar.addClass( 'yith-panel-sidebar-hidden' );
|
37 |
-
panel_wrapper.addClass( 'yit-admin-panel-content-wrap-full' );
|
38 |
-
ajax_hide_option_save( 'yes' );
|
39 |
-
},
|
40 |
-
show_sidebar = function () {
|
41 |
-
hide_sidebar_btn.addClass( 'hide-on-click' );
|
42 |
-
hide_sidebar_text.html( sidebar_labels.hide_sidebar );
|
43 |
-
sidebar.removeClass( 'yith-panel-sidebar-hidden' );
|
44 |
-
panel_wrapper.removeClass( 'yit-admin-panel-content-wrap-full' );
|
45 |
-
ajax_hide_option_save( 'no' );
|
46 |
-
};
|
47 |
-
|
48 |
-
hide_sidebar_btn.on( 'click', function () {
|
49 |
-
if ( $( this ).is( '.hide-on-click' ) ) {
|
50 |
-
hide_sidebar();
|
51 |
-
} else {
|
52 |
-
show_sidebar();
|
53 |
-
}
|
54 |
-
} );
|
55 |
-
|
56 |
})( jQuery );
|
1 |
+
/**
|
2 |
+
* This file belongs to the YIT Plugin Framework.
|
3 |
+
*
|
4 |
+
* This source file is subject to the GNU GENERAL PUBLIC LICENSE (GPL 3.0)
|
5 |
+
* that is bundled with this package in the file LICENSE.txt.
|
6 |
+
* It is also available through the world-wide-web at this URL:
|
7 |
+
* http://www.gnu.org/licenses/gpl-3.0.txt
|
8 |
+
*/
|
9 |
+
|
10 |
+
|
11 |
+
(function ( $ ) {
|
12 |
+
var hide_sidebar_btn = $( '#yit-panel-sidebar-action-hide' ),
|
13 |
+
hide_sidebar_text = hide_sidebar_btn.find( '.yit-panel-sidebar-action-title' ),
|
14 |
+
sidebar = $( '#yit-panel-sidebar' ),
|
15 |
+
panel_wrapper = $( '.' + sidebar_labels.wrapper_class ),
|
16 |
+
ajax_hide_option_save_call,
|
17 |
+
ajax_hide_option_save = function ( option ) {
|
18 |
+
if ( ajax_hide_option_save_call ) {
|
19 |
+
ajax_hide_option_save_call.abort();
|
20 |
+
}
|
21 |
+
|
22 |
+
var post_data = {
|
23 |
+
option: option,
|
24 |
+
action: 'yith_plugin_panel_sidebar_set_collapse_option'
|
25 |
+
};
|
26 |
+
|
27 |
+
ajax_hide_option_save_call = $.ajax( {
|
28 |
+
type: "POST",
|
29 |
+
data: post_data,
|
30 |
+
url: ajaxurl
|
31 |
+
} );
|
32 |
+
},
|
33 |
+
hide_sidebar = function () {
|
34 |
+
hide_sidebar_btn.removeClass( 'hide-on-click' );
|
35 |
+
hide_sidebar_text.html( sidebar_labels.show_sidebar );
|
36 |
+
sidebar.addClass( 'yith-panel-sidebar-hidden' );
|
37 |
+
panel_wrapper.addClass( 'yit-admin-panel-content-wrap-full' );
|
38 |
+
ajax_hide_option_save( 'yes' );
|
39 |
+
},
|
40 |
+
show_sidebar = function () {
|
41 |
+
hide_sidebar_btn.addClass( 'hide-on-click' );
|
42 |
+
hide_sidebar_text.html( sidebar_labels.hide_sidebar );
|
43 |
+
sidebar.removeClass( 'yith-panel-sidebar-hidden' );
|
44 |
+
panel_wrapper.removeClass( 'yit-admin-panel-content-wrap-full' );
|
45 |
+
ajax_hide_option_save( 'no' );
|
46 |
+
};
|
47 |
+
|
48 |
+
hide_sidebar_btn.on( 'click', function () {
|
49 |
+
if ( $( this ).is( '.hide-on-click' ) ) {
|
50 |
+
hide_sidebar();
|
51 |
+
} else {
|
52 |
+
show_sidebar();
|
53 |
+
}
|
54 |
+
} );
|
55 |
+
|
56 |
})( jQuery );
|
plugin-fw/assets/js/yit-plugin-panel.js
CHANGED
@@ -1,340 +1,340 @@
|
|
1 |
-
/**
|
2 |
-
* This file belongs to the YIT Plugin Framework.
|
3 |
-
*
|
4 |
-
* This source file is subject to the GNU GENERAL PUBLIC LICENSE (GPL 3.0)
|
5 |
-
* that is bundled with this package in the file LICENSE.txt.
|
6 |
-
* It is also available through the world-wide-web at this URL:
|
7 |
-
* http://www.gnu.org/licenses/gpl-3.0.txt
|
8 |
-
*/
|
9 |
-
|
10 |
-
|
11 |
-
(function ($) {
|
12 |
-
|
13 |
-
// select
|
14 |
-
var select_value = function () {
|
15 |
-
|
16 |
-
var value = '';
|
17 |
-
|
18 |
-
if ($(this).attr('multiple')) {
|
19 |
-
$(this).children("option:selected").each(function (i, v) {
|
20 |
-
if (i != 0)
|
21 |
-
value += ', ';
|
22 |
-
|
23 |
-
value += $(v).text();
|
24 |
-
});
|
25 |
-
|
26 |
-
if (value == '') {
|
27 |
-
$(this).children().children("option:selected").each(function (i, v) {
|
28 |
-
if (i != 0)
|
29 |
-
value += ', ';
|
30 |
-
|
31 |
-
value += $(v).text();
|
32 |
-
});
|
33 |
-
}
|
34 |
-
}
|
35 |
-
else {
|
36 |
-
value = $(this).children("option:selected").text();
|
37 |
-
|
38 |
-
if (value == '')
|
39 |
-
value = $(this).children().children("option:selected").text();
|
40 |
-
}
|
41 |
-
|
42 |
-
|
43 |
-
if ($(this).parent().find('span').length <= 0) {
|
44 |
-
$(this).before('<span></span>');
|
45 |
-
}
|
46 |
-
|
47 |
-
$(this).parent().children('span').replaceWith('<span>' + value + '</span>');
|
48 |
-
};
|
49 |
-
$('.plugin-option .select_wrapper select').not('.chosen').each(select_value).change(select_value);
|
50 |
-
|
51 |
-
//Open select multiple
|
52 |
-
$('.plugin-option .select_wrapper').click(function (e) {
|
53 |
-
e.stopPropagation();
|
54 |
-
$(this).find('select[multiple]').not('.chosen').toggle();
|
55 |
-
});
|
56 |
-
//Stops click propagation on select, to prevent select hide
|
57 |
-
$('.plugin-option .select_wrapper select[multiple]').not('.chosen').click(function (e) {
|
58 |
-
e.stopPropagation();
|
59 |
-
});
|
60 |
-
//Hides select on window click
|
61 |
-
$(window).click(function () {
|
62 |
-
$('.plugin-option .select_wrapper select[multiple]').not('.chosen').hide();
|
63 |
-
})
|
64 |
-
//chosen
|
65 |
-
$('.plugin-option .chosen .select_wrapper select').chosen();
|
66 |
-
|
67 |
-
// on-off
|
68 |
-
$('.plugin-option .onoff_container span').on('click', function () {
|
69 |
-
var input = $(this).prev('input');
|
70 |
-
var checked = input.prop('checked');
|
71 |
-
|
72 |
-
if (checked) {
|
73 |
-
input.prop('checked', false).attr('value', 'no').removeClass('onoffchecked');
|
74 |
-
} else {
|
75 |
-
input.prop('checked', true).attr('value', 'yes').addClass('onoffchecked');
|
76 |
-
}
|
77 |
-
|
78 |
-
input.change();
|
79 |
-
});
|
80 |
-
|
81 |
-
//colorpicker
|
82 |
-
$('.plugin-option .panel-colorpicker').wpColorPicker({
|
83 |
-
onInit: function(){ },
|
84 |
-
change: function(event, ui){
|
85 |
-
},
|
86 |
-
clear: function(){
|
87 |
-
var input = $(this);
|
88 |
-
input.val(input.data('default-color'));
|
89 |
-
input.change();
|
90 |
-
}
|
91 |
-
});
|
92 |
-
|
93 |
-
//slider
|
94 |
-
$('.plugin-option .slider_container .ui-slider-horizontal').each(function () {
|
95 |
-
var val = $(this).data('val');
|
96 |
-
var minValue = $(this).data('min');
|
97 |
-
var maxValue = $(this).data('max');
|
98 |
-
var step = $(this).data('step');
|
99 |
-
var labels = $(this).data('labels');
|
100 |
-
|
101 |
-
$(this).slider({
|
102 |
-
value: val,
|
103 |
-
min : minValue,
|
104 |
-
max : maxValue,
|
105 |
-
range: 'min',
|
106 |
-
step : step,
|
107 |
-
|
108 |
-
slide: function (event, ui) {
|
109 |
-
$(this).find('input').val(ui.value);
|
110 |
-
$(this).siblings('.feedback').find('strong').text(ui.value + labels);
|
111 |
-
}
|
112 |
-
});
|
113 |
-
});
|
114 |
-
|
115 |
-
|
116 |
-
if (typeof wp !== 'undefined' && typeof wp.media !== 'undefined') {
|
117 |
-
|
118 |
-
//upload
|
119 |
-
var _custom_media = true,
|
120 |
-
_orig_send_attachment = wp.media.editor.send.attachment;
|
121 |
-
|
122 |
-
// preview
|
123 |
-
$('.plugin-option .upload_img_url').change(function () {
|
124 |
-
var url = $(this).val();
|
125 |
-
var re = new RegExp("(http|ftp|https)://[a-zA-Z0-9@?^=%&:/~+#-_.]*.(gif|jpg|jpeg|png|ico)");
|
126 |
-
|
127 |
-
var preview = $(this).parents().siblings('.upload_img_preview');
|
128 |
-
if (re.test(url)) {
|
129 |
-
preview.html('<img src="' + url + '" style="max-width:600px; max-height:300px;" />');
|
130 |
-
} else {
|
131 |
-
preview.html('');
|
132 |
-
}
|
133 |
-
}).trigger( 'change' );
|
134 |
-
|
135 |
-
$( document ).on( 'click', '.plugin-option .upload_button', function(e) {
|
136 |
-
e.preventDefault();
|
137 |
-
|
138 |
-
var t = $(this),
|
139 |
-
custom_uploader,
|
140 |
-
id = t.attr('id').replace(/-button$/, '');
|
141 |
-
|
142 |
-
//If the uploader object has already been created, reopen the dialog
|
143 |
-
if (custom_uploader) {
|
144 |
-
custom_uploader.open();
|
145 |
-
return;
|
146 |
-
}
|
147 |
-
|
148 |
-
var custom_uploader_states = [
|
149 |
-
// Main states.
|
150 |
-
new wp.media.controller.Library({
|
151 |
-
library: wp.media.query(),
|
152 |
-
multiple: false,
|
153 |
-
title: 'Choose Image',
|
154 |
-
priority: 20,
|
155 |
-
filterable: 'uploaded'
|
156 |
-
})
|
157 |
-
];
|
158 |
-
|
159 |
-
// Create the media frame.
|
160 |
-
custom_uploader = wp.media.frames.downloadable_file = wp.media({
|
161 |
-
// Set the title of the modal.
|
162 |
-
title: 'Choose Image',
|
163 |
-
library: {
|
164 |
-
type: ''
|
165 |
-
},
|
166 |
-
button: {
|
167 |
-
text: 'Choose Image'
|
168 |
-
},
|
169 |
-
multiple: false,
|
170 |
-
states: custom_uploader_states
|
171 |
-
});
|
172 |
-
|
173 |
-
|
174 |
-
//When a file is selected, grab the URL and set it as the text field's value
|
175 |
-
custom_uploader.on( 'select' , function() {
|
176 |
-
var attachment = custom_uploader.state().get( 'selection' ).first().toJSON();
|
177 |
-
|
178 |
-
$("#" + id).val( attachment.url );
|
179 |
-
// Save the id of the selected element to an element which name is the same with
|
180 |
-
// a suffix "-yith-attachment-id"
|
181 |
-
if ($("#" + id + "-yith-attachment-id")) {
|
182 |
-
$("#" + id + "-yith-attachment-id").val(attachment.id);
|
183 |
-
}
|
184 |
-
|
185 |
-
$('.plugin-option .upload_img_url').trigger('change');
|
186 |
-
});
|
187 |
-
|
188 |
-
//Open the uploader dialog
|
189 |
-
custom_uploader.open();
|
190 |
-
});
|
191 |
-
|
192 |
-
$( document).on( 'click', '.plugin-option .upload_button_reset', function(e){
|
193 |
-
var t = $(this),
|
194 |
-
id = t.attr('id'),
|
195 |
-
input_id = t.attr('id').replace(/-button_reset$/, ''),
|
196 |
-
default_value = $('#' + id).data('default');
|
197 |
-
|
198 |
-
$("#" + input_id).val( default_value );
|
199 |
-
$('.plugin-option .upload_img_url').trigger('change');
|
200 |
-
} );
|
201 |
-
}
|
202 |
-
|
203 |
-
$('.plugin-option .add_media').on('click', function () {
|
204 |
-
_custom_media = false;
|
205 |
-
});
|
206 |
-
|
207 |
-
//dependencies handler
|
208 |
-
$('[data-field]').each(function () {
|
209 |
-
var t = $(this);
|
210 |
-
|
211 |
-
var field = '#' + t.data('field'),
|
212 |
-
dep = '#' + t.data('dep'),
|
213 |
-
value = t.data('value');
|
214 |
-
|
215 |
-
$(dep).on('change',function () {
|
216 |
-
dependencies_handler(field, dep, value.toString());
|
217 |
-
}).change();
|
218 |
-
});
|
219 |
-
|
220 |
-
//Handle dependencies.
|
221 |
-
function dependencies_handler(id, deps, values) {
|
222 |
-
var result = true;
|
223 |
-
|
224 |
-
//Single dependency
|
225 |
-
if (typeof( deps ) == 'string') {
|
226 |
-
if (deps.substr(0, 6) == ':radio') {
|
227 |
-
deps = deps + ':checked';
|
228 |
-
}
|
229 |
-
|
230 |
-
var values = values.split(',');
|
231 |
-
|
232 |
-
for (var i = 0; i < values.length; i++) {
|
233 |
-
|
234 |
-
if ($(deps).val() != values[i]) {
|
235 |
-
result = false;
|
236 |
-
}
|
237 |
-
else {
|
238 |
-
result = true;
|
239 |
-
break;
|
240 |
-
}
|
241 |
-
}
|
242 |
-
}
|
243 |
-
|
244 |
-
if (!result) {
|
245 |
-
$(id + '-container').closest('tr').hide();
|
246 |
-
} else {
|
247 |
-
$(id + '-container').closest('tr').show();
|
248 |
-
}
|
249 |
-
};
|
250 |
-
|
251 |
-
//connected list
|
252 |
-
$('.rm_connectedlist').each(function () {
|
253 |
-
var ul = $(this).find('ul');
|
254 |
-
var input = $(this).find(':hidden');
|
255 |
-
var sortable = ul.sortable({
|
256 |
-
connectWith: ul,
|
257 |
-
update : function (event, ui) {
|
258 |
-
var value = {};
|
259 |
-
|
260 |
-
ul.each(function () {
|
261 |
-
var options = {};
|
262 |
-
|
263 |
-
$(this).children().each(function () {
|
264 |
-
options[ $(this).data('option') ] = $(this).text();
|
265 |
-
});
|
266 |
-
|
267 |
-
value[ $(this).data('list') ] = options;
|
268 |
-
});
|
269 |
-
|
270 |
-
input.val((JSON.stringify(value)).replace(/[\\"']/g, '\\$&').replace(/\u0000/g, '\\0'));
|
271 |
-
}
|
272 |
-
}).disableSelection();
|
273 |
-
});
|
274 |
-
|
275 |
-
$(document).ready(function () {
|
276 |
-
|
277 |
-
$('.yith-video-link').click(function (event) {
|
278 |
-
event.preventDefault();
|
279 |
-
var target = $(this).data('video-id');
|
280 |
-
|
281 |
-
$('.' + target).dialog({
|
282 |
-
dialogClass : 'wp-dialog yit-dialog yit-video-dialog',
|
283 |
-
modal : true,
|
284 |
-
closeOnEscape: true,
|
285 |
-
width : 'auto',
|
286 |
-
resizable : false,
|
287 |
-
draggable : false,
|
288 |
-
create : function (event, ui) {
|
289 |
-
$(this).css("maxWidth", "853px");
|
290 |
-
},
|
291 |
-
open : function (event, ui) {
|
292 |
-
|
293 |
-
$('.ui-widget-overlay').bind('click', function () {
|
294 |
-
$(this).siblings('.ui-dialog').find('.ui-dialog-content').dialog('close');
|
295 |
-
});
|
296 |
-
|
297 |
-
}
|
298 |
-
|
299 |
-
});
|
300 |
-
|
301 |
-
$('.ui-dialog :button').blur();
|
302 |
-
|
303 |
-
});
|
304 |
-
});
|
305 |
-
|
306 |
-
//codemirror
|
307 |
-
$(document).ready(function () {
|
308 |
-
$('.codemirror').each(function (i, v) {
|
309 |
-
var editor = CodeMirror.fromTextArea(v, {
|
310 |
-
lineNumbers : 1,
|
311 |
-
mode : 'javascript',
|
312 |
-
showCursorWhenSelecting: true
|
313 |
-
})
|
314 |
-
|
315 |
-
$(v).data('codemirrorInstance', editor);
|
316 |
-
})
|
317 |
-
})
|
318 |
-
|
319 |
-
//google analytics generation
|
320 |
-
$(document).ready(function () {
|
321 |
-
$('.google-analytic-generate').click(function () {
|
322 |
-
var editor = $('#' + $(this).data('textarea')).data('codemirrorInstance');
|
323 |
-
var gatc = $('#' + $(this).data('input')).val();
|
324 |
-
var basename = $(this).data('basename');
|
325 |
-
|
326 |
-
var text = "(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n";
|
327 |
-
text += "(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement( o ),\n";
|
328 |
-
text += "m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n";
|
329 |
-
text += "})(window,document,'script','//www.google-analytics.com/analytics.js','ga');\n\n";
|
330 |
-
text += "ga('create', '" + gatc + "', '" + basename + "');\n";
|
331 |
-
text += "ga('send', 'pageview');\n";
|
332 |
-
editor.replaceRange(
|
333 |
-
text,
|
334 |
-
editor.getCursor('start'),
|
335 |
-
editor.getCursor('end')
|
336 |
-
)
|
337 |
-
})
|
338 |
-
})
|
339 |
-
|
340 |
})(jQuery);
|
1 |
+
/**
|
2 |
+
* This file belongs to the YIT Plugin Framework.
|
3 |
+
*
|
4 |
+
* This source file is subject to the GNU GENERAL PUBLIC LICENSE (GPL 3.0)
|
5 |
+
* that is bundled with this package in the file LICENSE.txt.
|
6 |
+
* It is also available through the world-wide-web at this URL:
|
7 |
+
* http://www.gnu.org/licenses/gpl-3.0.txt
|
8 |
+
*/
|
9 |
+
|
10 |
+
|
11 |
+
(function ($) {
|
12 |
+
|
13 |
+
// select
|
14 |
+
var select_value = function () {
|
15 |
+
|
16 |
+
var value = '';
|
17 |
+
|
18 |
+
if ($(this).attr('multiple')) {
|
19 |
+
$(this).children("option:selected").each(function (i, v) {
|
20 |
+
if (i != 0)
|
21 |
+
value += ', ';
|
22 |
+
|
23 |
+
value += $(v).text();
|
24 |
+
});
|
25 |
+
|
26 |
+
if (value == '') {
|
27 |
+
$(this).children().children("option:selected").each(function (i, v) {
|
28 |
+
if (i != 0)
|
29 |
+
value += ', ';
|
30 |
+
|
31 |
+
value += $(v).text();
|
32 |
+
});
|
33 |
+
}
|
34 |
+
}
|
35 |
+
else {
|
36 |
+
value = $(this).children("option:selected").text();
|
37 |
+
|
38 |
+
if (value == '')
|
39 |
+
value = $(this).children().children("option:selected").text();
|
40 |
+
}
|
41 |
+
|
42 |
+
|
43 |
+
if ($(this).parent().find('span').length <= 0) {
|
44 |
+
$(this).before('<span></span>');
|
45 |
+
}
|
46 |
+
|
47 |
+
$(this).parent().children('span').replaceWith('<span>' + value + '</span>');
|
48 |
+
};
|
49 |
+
$('.plugin-option .select_wrapper select').not('.chosen').each(select_value).change(select_value);
|
50 |
+
|
51 |
+
//Open select multiple
|
52 |
+
$('.plugin-option .select_wrapper').click(function (e) {
|
53 |
+
e.stopPropagation();
|
54 |
+
$(this).find('select[multiple]').not('.chosen').toggle();
|
55 |
+
});
|
56 |
+
//Stops click propagation on select, to prevent select hide
|
57 |
+
$('.plugin-option .select_wrapper select[multiple]').not('.chosen').click(function (e) {
|
58 |
+
e.stopPropagation();
|
59 |
+
});
|
60 |
+
//Hides select on window click
|
61 |
+
$(window).click(function () {
|
62 |
+
$('.plugin-option .select_wrapper select[multiple]').not('.chosen').hide();
|
63 |
+
})
|
64 |
+
//chosen
|
65 |
+
$('.plugin-option .chosen .select_wrapper select').chosen();
|
66 |
+
|
67 |
+
// on-off
|
68 |
+
$('.plugin-option .onoff_container span').on('click', function () {
|
69 |
+
var input = $(this).prev('input');
|
70 |
+
var checked = input.prop('checked');
|
71 |
+
|
72 |
+
if (checked) {
|
73 |
+
input.prop('checked', false).attr('value', 'no').removeClass('onoffchecked');
|
74 |
+
} else {
|
75 |
+
input.prop('checked', true).attr('value', 'yes').addClass('onoffchecked');
|
76 |
+
}
|
77 |
+
|
78 |
+
input.change();
|
79 |
+
});
|
80 |
+
|
81 |
+
//colorpicker
|
82 |
+
$('.plugin-option .panel-colorpicker').wpColorPicker({
|
83 |
+
onInit: function(){ },
|
84 |
+
change: function(event, ui){
|
85 |
+
},
|
86 |
+
clear: function(){
|
87 |
+
var input = $(this);
|
88 |
+
input.val(input.data('default-color'));
|
89 |
+
input.change();
|
90 |
+
}
|
91 |
+
});
|
92 |
+
|
93 |
+
//slider
|
94 |
+
$('.plugin-option .slider_container .ui-slider-horizontal').each(function () {
|
95 |
+
var val = $(this).data('val');
|
96 |
+
var minValue = $(this).data('min');
|
97 |
+
var maxValue = $(this).data('max');
|
98 |
+
var step = $(this).data('step');
|
99 |
+
var labels = $(this).data('labels');
|
100 |
+
|
101 |
+
$(this).slider({
|
102 |
+
value: val,
|
103 |
+
min : minValue,
|
104 |
+
max : maxValue,
|
105 |
+
range: 'min',
|
106 |
+
step : step,
|
107 |
+
|
108 |
+
slide: function (event, ui) {
|
109 |
+
$(this).find('input').val(ui.value);
|
110 |
+
$(this).siblings('.feedback').find('strong').text(ui.value + labels);
|
111 |
+
}
|
112 |
+
});
|
113 |
+
});
|
114 |
+
|
115 |
+
|
116 |
+
if (typeof wp !== 'undefined' && typeof wp.media !== 'undefined') {
|
117 |
+
|
118 |
+
//upload
|
119 |
+
var _custom_media = true,
|
120 |
+
_orig_send_attachment = wp.media.editor.send.attachment;
|
121 |
+
|
122 |
+
// preview
|
123 |
+
$('.plugin-option .upload_img_url').change(function () {
|
124 |
+
var url = $(this).val();
|
125 |
+
var re = new RegExp("(http|ftp|https)://[a-zA-Z0-9@?^=%&:/~+#-_.]*.(gif|jpg|jpeg|png|ico)");
|
126 |
+
|
127 |
+
var preview = $(this).parents().siblings('.upload_img_preview');
|
128 |
+
if (re.test(url)) {
|
129 |
+
preview.html('<img src="' + url + '" style="max-width:600px; max-height:300px;" />');
|
130 |
+
} else {
|
131 |
+
preview.html('');
|
132 |
+
}
|
133 |
+
}).trigger( 'change' );
|
134 |
+
|
135 |
+
$( document ).on( 'click', '.plugin-option .upload_button', function(e) {
|
136 |
+
e.preventDefault();
|
137 |
+
|
138 |
+
var t = $(this),
|
139 |
+
custom_uploader,
|
140 |
+
id = t.attr('id').replace(/-button$/, '');
|
141 |
+
|
142 |
+
//If the uploader object has already been created, reopen the dialog
|
143 |
+
if (custom_uploader) {
|
144 |
+
custom_uploader.open();
|
145 |
+
return;
|
146 |
+
}
|
147 |
+
|
148 |
+
var custom_uploader_states = [
|
149 |
+
// Main states.
|
150 |
+
new wp.media.controller.Library({
|
151 |
+
library: wp.media.query(),
|
152 |
+
multiple: false,
|
153 |
+
title: 'Choose Image',
|
154 |
+
priority: 20,
|
155 |
+
filterable: 'uploaded'
|
156 |
+
})
|
157 |
+
];
|
158 |
+
|
159 |
+
// Create the media frame.
|
160 |
+
custom_uploader = wp.media.frames.downloadable_file = wp.media({
|
161 |
+
// Set the title of the modal.
|
162 |
+
title: 'Choose Image',
|
163 |
+
library: {
|
164 |
+
type: ''
|
165 |
+
},
|
166 |
+
button: {
|
167 |
+
text: 'Choose Image'
|
168 |
+
},
|
169 |
+
multiple: false,
|
170 |
+
states: custom_uploader_states
|
171 |
+
});
|
172 |
+
|
173 |
+
|
174 |
+
//When a file is selected, grab the URL and set it as the text field's value
|
175 |
+
custom_uploader.on( 'select' , function() {
|
176 |
+
var attachment = custom_uploader.state().get( 'selection' ).first().toJSON();
|
177 |
+
|
178 |
+
$("#" + id).val( attachment.url );
|
179 |
+
// Save the id of the selected element to an element which name is the same with
|
180 |
+
// a suffix "-yith-attachment-id"
|
181 |
+
if ($("#" + id + "-yith-attachment-id")) {
|
182 |
+
$("#" + id + "-yith-attachment-id").val(attachment.id);
|
183 |
+
}
|
184 |
+
|
185 |
+
$('.plugin-option .upload_img_url').trigger('change');
|
186 |
+
});
|
187 |
+
|
188 |
+
//Open the uploader dialog
|
189 |
+
custom_uploader.open();
|
190 |
+
});
|
191 |
+
|
192 |
+
$( document).on( 'click', '.plugin-option .upload_button_reset', function(e){
|
193 |
+
var t = $(this),
|
194 |
+
id = t.attr('id'),
|
195 |
+
input_id = t.attr('id').replace(/-button_reset$/, ''),
|
196 |
+
default_value = $('#' + id).data('default');
|
197 |
+
|
198 |
+
$("#" + input_id).val( default_value );
|
199 |
+
$('.plugin-option .upload_img_url').trigger('change');
|
200 |
+
} );
|
201 |
+
}
|
202 |
+
|
203 |
+
$('.plugin-option .add_media').on('click', function () {
|
204 |
+
_custom_media = false;
|
205 |
+
});
|
206 |
+
|
207 |
+
//dependencies handler
|
208 |
+
$('[data-field]').each(function () {
|
209 |
+
var t = $(this);
|
210 |
+
|
211 |
+
var field = '#' + t.data('field'),
|
212 |
+
dep = '#' + t.data('dep'),
|
213 |
+
value = t.data('value');
|
214 |
+
|
215 |
+
$(dep).on('change',function () {
|
216 |
+
dependencies_handler(field, dep, value.toString());
|
217 |
+
}).change();
|
218 |
+
});
|
219 |
+
|
220 |
+
//Handle dependencies.
|
221 |
+
function dependencies_handler(id, deps, values) {
|
222 |
+
var result = true;
|
223 |
+
|
224 |
+
//Single dependency
|
225 |
+
if (typeof( deps ) == 'string') {
|
226 |
+
if (deps.substr(0, 6) == ':radio') {
|
227 |
+
deps = deps + ':checked';
|
228 |
+
}
|
229 |
+
|
230 |
+
var values = values.split(',');
|
231 |
+
|
232 |
+
for (var i = 0; i < values.length; i++) {
|
233 |
+
|
234 |
+
if ($(deps).val() != values[i]) {
|
235 |
+
result = false;
|
236 |
+
}
|
237 |
+
else {
|
238 |
+
result = true;
|
239 |
+
break;
|
240 |
+
}
|
241 |
+
}
|
242 |
+
}
|
243 |
+
|
244 |
+
if (!result) {
|
245 |
+
$(id + '-container').closest('tr').hide();
|
246 |
+
} else {
|
247 |
+
$(id + '-container').closest('tr').show();
|
248 |
+
}
|
249 |
+
};
|
250 |
+
|
251 |
+
//connected list
|
252 |
+
$('.rm_connectedlist').each(function () {
|
253 |
+
var ul = $(this).find('ul');
|
254 |
+
var input = $(this).find(':hidden');
|
255 |
+
var sortable = ul.sortable({
|
256 |
+
connectWith: ul,
|
257 |
+
update : function (event, ui) {
|
258 |
+
var value = {};
|
259 |
+
|
260 |
+
ul.each(function () {
|
261 |
+
var options = {};
|
262 |
+
|
263 |
+
$(this).children().each(function () {
|
264 |
+
options[ $(this).data('option') ] = $(this).text();
|
265 |
+
});
|
266 |
+
|
267 |
+
value[ $(this).data('list') ] = options;
|
268 |
+
});
|
269 |
+
|
270 |
+
input.val((JSON.stringify(value)).replace(/[\\"']/g, '\\$&').replace(/\u0000/g, '\\0'));
|
271 |
+
}
|
272 |
+
}).disableSelection();
|
273 |
+
});
|
274 |
+
|
275 |
+
$(document).ready(function () {
|
276 |
+
|
277 |
+
$('.yith-video-link').click(function (event) {
|
278 |
+
event.preventDefault();
|
279 |
+
var target = $(this).data('video-id');
|
280 |
+
|
281 |
+
$('.' + target).dialog({
|
282 |
+
dialogClass : 'wp-dialog yit-dialog yit-video-dialog',
|
283 |
+
modal : true,
|
284 |
+
closeOnEscape: true,
|
285 |
+
width : 'auto',
|
286 |
+
resizable : false,
|
287 |
+
draggable : false,
|
288 |
+
create : function (event, ui) {
|
289 |
+
$(this).css("maxWidth", "853px");
|
290 |
+
},
|
291 |
+
open : function (event, ui) {
|
292 |
+
|
293 |
+
$('.ui-widget-overlay').bind('click', function () {
|
294 |
+
$(this).siblings('.ui-dialog').find('.ui-dialog-content').dialog('close');
|
295 |
+
});
|
296 |
+
|
297 |
+
}
|
298 |
+
|
299 |
+
});
|
300 |
+
|
301 |
+
$('.ui-dialog :button').blur();
|
302 |
+
|
303 |
+
});
|
304 |
+
});
|
305 |
+
|
306 |
+
//codemirror
|
307 |
+
$(document).ready(function () {
|
308 |
+
$('.codemirror').each(function (i, v) {
|
309 |
+
var editor = CodeMirror.fromTextArea(v, {
|
310 |
+
lineNumbers : 1,
|
311 |
+
mode : 'javascript',
|
312 |
+
showCursorWhenSelecting: true
|
313 |
+
})
|
314 |
+
|
315 |
+
$(v).data('codemirrorInstance', editor);
|
316 |
+
})
|
317 |
+
})
|
318 |
+
|
319 |
+
//google analytics generation
|
320 |
+
$(document).ready(function () {
|
321 |
+
$('.google-analytic-generate').click(function () {
|
322 |
+
var editor = $('#' + $(this).data('textarea')).data('codemirrorInstance');
|
323 |
+
var gatc = $('#' + $(this).data('input')).val();
|
324 |
+
var basename = $(this).data('basename');
|
325 |
+
|
326 |
+
var text = "(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n";
|
327 |
+
text += "(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement( o ),\n";
|
328 |
+
text += "m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n";
|
329 |
+
text += "})(window,document,'script','//www.google-analytics.com/analytics.js','ga');\n\n";
|
330 |
+
text += "ga('create', '" + gatc + "', '" + basename + "');\n";
|
331 |
+
text += "ga('send', 'pageview');\n";
|
332 |
+
editor.replaceRange(
|
333 |
+
text,
|
334 |
+
editor.getCursor('start'),
|
335 |
+
editor.getCursor('end')
|
336 |
+
)
|
337 |
+
})
|
338 |
+
})
|
339 |
+
|
340 |
})(jQuery);
|
plugin-fw/assets/js/yit-wp-pointer.js
CHANGED
@@ -1,84 +1,84 @@
|
|
1 |
-
jQuery(document).ready( function($) {
|
2 |
-
|
3 |
-
var pointers = custom_pointer.pointers[0],
|
4 |
-
options = pointers.options,
|
5 |
-
target = $(pointers.target),
|
6 |
-
pointer_id = pointers.pointer_id;
|
7 |
-
|
8 |
-
$(target).find('.wp-submenu li a').each(function () {
|
9 |
-
|
10 |
-
var t = $(this),
|
11 |
-
href = t.attr('href');
|
12 |
-
|
13 |
-
href = href.replace('admin.php?page=', '');
|
14 |
-
|
15 |
-
if( href == pointer_id ){
|
16 |
-
|
17 |
-
var selected_plugin_row = t.add( target ),
|
18 |
-
top_level_menu = target.find( pointers.target.replace( '#', '.' ) );
|
19 |
-
|
20 |
-
target.toggleClass('wp-no-current-submenu wp-menu-open wp-has-current-submenu');
|
21 |
-
|
22 |
-
t.pointer({
|
23 |
-
pointerClass: 'yit-wp-pointer',
|
24 |
-
content : options.content,
|
25 |
-
position: options.position,
|
26 |
-
open : function () {
|
27 |
-
selected_plugin_row.toggleClass( 'yit-pointer-selected-row' );
|
28 |
-
top_level_menu.addClass( 'yit-pointer' );
|
29 |
-
},
|
30 |
-
|
31 |
-
|
32 |
-
close : function () {
|
33 |
-
target.toggleClass('wp-no-current-submenu wp-menu-open wp-has-current-submenu');
|
34 |
-
selected_plugin_row.toggleClass( 'yit-pointer-selected-row' );
|
35 |
-
top_level_menu.removeClass( 'yit-pointer' );
|
36 |
-
|
37 |
-
$.ajax({
|
38 |
-
type : 'POST',
|
39 |
-
url : ajaxurl,
|
40 |
-
data : {
|
41 |
-
"action" : "dismiss-wp-pointer",
|
42 |
-
"pointer": pointer_id
|
43 |
-
},
|
44 |
-
success: function (response) {
|
45 |
-
}
|
46 |
-
});
|
47 |
-
|
48 |
-
}
|
49 |
-
}).pointer('open');
|
50 |
-
} else if( 'yith_default_pointer' == pointer_id ) {
|
51 |
-
|
52 |
-
var selected_plugin_row = t.add( target ),
|
53 |
-
top_level_menu = target.find( pointers.target.replace( '#', '.' )),
|
54 |
-
yit_plugins = $( pointers.target );
|
55 |
-
|
56 |
-
yit_plugins.addClass('wp-has-current-submenu');
|
57 |
-
|
58 |
-
top_level_menu.pointer({
|
59 |
-
pointerClass: 'yit-wp-pointer',
|
60 |
-
content : options.content,
|
61 |
-
position: options.position,
|
62 |
-
|
63 |
-
open : function () {
|
64 |
-
yit_plugins.addClass( 'yit-pointer-selected-row' );
|
65 |
-
},
|
66 |
-
|
67 |
-
close : function () {
|
68 |
-
yit_plugins.removeClass( 'yit-pointer-selected-row wp-has-current-submenu' );
|
69 |
-
|
70 |
-
$.ajax({
|
71 |
-
type : 'POST',
|
72 |
-
url : ajaxurl,
|
73 |
-
data : {
|
74 |
-
"action" : "dismiss-wp-pointer",
|
75 |
-
"pointer": pointer_id
|
76 |
-
},
|
77 |
-
success: function (response) {
|
78 |
-
}
|
79 |
-
});
|
80 |
-
}
|
81 |
-
}).pointer('open');
|
82 |
-
}
|
83 |
-
});
|
84 |
});
|
1 |
+
jQuery(document).ready( function($) {
|
2 |
+
|
3 |
+
var pointers = custom_pointer.pointers[0],
|
4 |
+
options = pointers.options,
|
5 |
+
target = $(pointers.target),
|
6 |
+
pointer_id = pointers.pointer_id;
|
7 |
+
|
8 |
+
$(target).find('.wp-submenu li a').each(function () {
|
9 |
+
|
10 |
+
var t = $(this),
|
11 |
+
href = t.attr('href');
|
12 |
+
|
13 |
+
href = href.replace('admin.php?page=', '');
|
14 |
+
|
15 |
+
if( href == pointer_id ){
|
16 |
+
|
17 |
+
var selected_plugin_row = t.add( target ),
|
18 |
+
top_level_menu = target.find( pointers.target.replace( '#', '.' ) );
|
19 |
+
|
20 |
+
target.toggleClass('wp-no-current-submenu wp-menu-open wp-has-current-submenu');
|
21 |
+
|
22 |
+
t.pointer({
|
23 |
+
pointerClass: 'yit-wp-pointer',
|
24 |
+
content : options.content,
|
25 |
+
position: options.position,
|
26 |
+
open : function () {
|
27 |
+
selected_plugin_row.toggleClass( 'yit-pointer-selected-row' );
|
28 |
+
top_level_menu.addClass( 'yit-pointer' );
|
29 |
+
},
|
30 |
+
|
31 |
+
|
32 |
+
close : function () {
|
33 |
+
target.toggleClass('wp-no-current-submenu wp-menu-open wp-has-current-submenu');
|
34 |
+
selected_plugin_row.toggleClass( 'yit-pointer-selected-row' );
|
35 |
+
top_level_menu.removeClass( 'yit-pointer' );
|
36 |
+
|
37 |
+
$.ajax({
|
38 |
+
type : 'POST',
|
39 |
+
url : ajaxurl,
|
40 |
+
data : {
|
41 |
+
"action" : "dismiss-wp-pointer",
|
42 |
+
"pointer": pointer_id
|
43 |
+
},
|
44 |
+
success: function (response) {
|
45 |
+
}
|
46 |
+
});
|
47 |
+
|
48 |
+
}
|
49 |
+
}).pointer('open');
|
50 |
+
} else if( 'yith_default_pointer' == pointer_id ) {
|
51 |
+
|
52 |
+
var selected_plugin_row = t.add( target ),
|
53 |
+
top_level_menu = target.find( pointers.target.replace( '#', '.' )),
|
54 |
+
yit_plugins = $( pointers.target );
|
55 |
+
|
56 |
+
yit_plugins.addClass('wp-has-current-submenu');
|
57 |
+
|
58 |
+
top_level_menu.pointer({
|
59 |
+
pointerClass: 'yit-wp-pointer',
|
60 |
+
content : options.content,
|
61 |
+
position: options.position,
|
62 |
+
|
63 |
+
open : function () {
|
64 |
+
yit_plugins.addClass( 'yit-pointer-selected-row' );
|
65 |
+
},
|
66 |
+
|
67 |
+
close : function () {
|
68 |
+
yit_plugins.removeClass( 'yit-pointer-selected-row wp-has-current-submenu' );
|
69 |
+
|
70 |
+
$.ajax({
|
71 |
+
type : 'POST',
|
72 |
+
url : ajaxurl,
|
73 |
+
data : {
|
74 |
+
"action" : "dismiss-wp-pointer",
|
75 |
+
"pointer": pointer_id
|
76 |
+
},
|
77 |
+
success: function (response) {
|
78 |
+
}
|
79 |
+
});
|
80 |
+
}
|
81 |
+
}).pointer('open');
|
82 |
+
}
|
83 |
+
});
|
84 |
});
|
plugin-fw/assets/js/yit-wp-pointer.min.js
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
-
jQuery(document).ready(function(b){var c=custom_pointer.pointers[0],d=c.options,a=b(c.target),e=c.pointer_id;b(a).find(".wp-submenu li a").each(function(){var f=b(this),h=f.attr("href"),h=h.replace("admin.php?page=","");if(h==e){var k=f.add(a),g=a.find(c.target.replace("#","."));a.toggleClass("wp-no-current-submenu wp-menu-open wp-has-current-submenu");f.pointer({pointerClass:"yit-wp-pointer",content:d.content,position:d.position,open:function(){console.log("here");k.toggleClass("yit-pointer-selected-row");
|
2 |
-
g.addClass("yit-pointer")},close:function(){a.toggleClass("wp-no-current-submenu wp-menu-open wp-has-current-submenu");k.toggleClass("yit-pointer-selected-row");g.removeClass("yit-pointer");b.ajax({type:"POST",url:ajaxurl,data:{action:"dismiss-wp-pointer",pointer:e},success:function(a){}})}}).pointer("open")}else if("yith_default_pointer"==e){var k=f.add(a),g=a.find(c.target.replace("#",".")),l=b(c.target);l.addClass("wp-has-current-submenu");g.pointer({pointerClass:"yit-wp-pointer",content:d.content,
|
3 |
position:d.position,open:function(){l.addClass("yit-pointer-selected-row")},close:function(){l.removeClass("yit-pointer-selected-row wp-has-current-submenu");b.ajax({type:"POST",url:ajaxurl,data:{action:"dismiss-wp-pointer",pointer:e},success:function(a){}})}}).pointer("open")}})});
|
1 |
+
jQuery(document).ready(function(b){var c=custom_pointer.pointers[0],d=c.options,a=b(c.target),e=c.pointer_id;b(a).find(".wp-submenu li a").each(function(){var f=b(this),h=f.attr("href"),h=h.replace("admin.php?page=","");if(h==e){var k=f.add(a),g=a.find(c.target.replace("#","."));a.toggleClass("wp-no-current-submenu wp-menu-open wp-has-current-submenu");f.pointer({pointerClass:"yit-wp-pointer",content:d.content,position:d.position,open:function(){console.log("here");k.toggleClass("yit-pointer-selected-row");
|
2 |
+
g.addClass("yit-pointer")},close:function(){a.toggleClass("wp-no-current-submenu wp-menu-open wp-has-current-submenu");k.toggleClass("yit-pointer-selected-row");g.removeClass("yit-pointer");b.ajax({type:"POST",url:ajaxurl,data:{action:"dismiss-wp-pointer",pointer:e},success:function(a){}})}}).pointer("open")}else if("yith_default_pointer"==e){var k=f.add(a),g=a.find(c.target.replace("#",".")),l=b(c.target);l.addClass("wp-has-current-submenu");g.pointer({pointerClass:"yit-wp-pointer",content:d.content,
|
3 |
position:d.position,open:function(){l.addClass("yit-pointer-selected-row")},close:function(){l.removeClass("yit-pointer-selected-row wp-has-current-submenu");b.ajax({type:"POST",url:ajaxurl,data:{action:"dismiss-wp-pointer",pointer:e},success:function(a){}})}}).pointer("open")}})});
|
plugin-fw/init.php
CHANGED
@@ -1,56 +1,58 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Framework Name: YIT Plugin Framework
|
4 |
-
* Version: 2.9.
|
5 |
-
* Author: Yithemes
|
6 |
-
* Text Domain: yith-plugin-fw
|
7 |
-
* Domain Path: /languages/
|
8 |
-
*
|
9 |
-
* @author Your Inspiration Themes
|
10 |
-
* @package YITH WooCommerce Ajax Navigation
|
11 |
-
* @version 2.0
|
12 |
-
*/
|
13 |
-
/**
|
14 |
-
* This file belongs to the YIT Plugin Framework.
|
15 |
-
*
|
16 |
-
* This source file is subject to the GNU GENERAL PUBLIC LICENSE (GPL 3.0)
|
17 |
-
* that is bundled with this package in the file LICENSE.txt.
|
18 |
-
* It is also available through the world-wide-web at this URL:
|
19 |
-
* http://www.gnu.org/licenses/gpl-3.0.txt
|
20 |
-
*/
|
21 |
-
|
22 |
-
if ( ! defined ( 'ABSPATH' ) ) {
|
23 |
-
exit;
|
24 |
-
} // Exit if accessed directly
|
25 |
-
|
26 |
-
if ( ! function_exists ( 'yit_maybe_plugin_fw_loader' ) ) {
|
27 |
-
/**
|
28 |
-
* YITH WooCommerce Ajax Navigation
|
29 |
-
*
|
30 |
-
* @since 1.0.0
|
31 |
-
*/
|
32 |
-
function yit_maybe_plugin_fw_loader ( $plugin_path ) {
|
33 |
-
global $plugin_fw_data;
|
34 |
-
|
35 |
-
$default_headers = array (
|
36 |
-
'Name' => 'Framework Name',
|
37 |
-
'Version' => 'Version',
|
38 |
-
'Author' => 'Author',
|
39 |
-
'TextDomain' => 'Text Domain',
|
40 |
-
'DomainPath' => 'Domain Path',
|
41 |
-
);
|
42 |
-
|
43 |
-
$framework_data = get_file_data ( trailingslashit ( $plugin_path ) . 'plugin-fw/init.php', $default_headers );
|
44 |
-
$plugin_fw_main_file = trailingslashit ( $plugin_path ) . 'plugin-fw/yit-plugin.php';
|
45 |
-
|
46 |
-
if ( ! empty( $plugin_fw_data ) ) {
|
47 |
-
foreach ( $plugin_fw_data as $version => $path ) {
|
48 |
-
if ( version_compare ( $version, $framework_data[ 'Version' ], '<' ) ) {
|
49 |
-
$plugin_fw_data = array ( $framework_data[ 'Version' ] => $plugin_fw_main_file );
|
50 |
-
}
|
51 |
-
}
|
52 |
-
} else {
|
53 |
-
$plugin_fw_data = array ( $framework_data[ 'Version' ] => $plugin_fw_main_file );
|
54 |
-
}
|
55 |
-
}
|
56 |
-
}
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Framework Name: YIT Plugin Framework
|
4 |
+
* Version: 2.9.53
|
5 |
+
* Author: Yithemes
|
6 |
+
* Text Domain: yith-plugin-fw
|
7 |
+
* Domain Path: /languages/
|
8 |
+
*
|
9 |
+
* @author Your Inspiration Themes
|
10 |
+
* @package YITH WooCommerce Ajax Navigation
|
11 |
+
* @version 2.0
|
12 |
+
*/
|
13 |
+
/**
|
14 |
+
* This file belongs to the YIT Plugin Framework.
|
15 |
+
*
|
16 |
+
* This source file is subject to the GNU GENERAL PUBLIC LICENSE (GPL 3.0)
|
17 |
+
* that is bundled with this package in the file LICENSE.txt.
|
18 |
+
* It is also available through the world-wide-web at this URL:
|
19 |
+
* http://www.gnu.org/licenses/gpl-3.0.txt
|
20 |
+
*/
|
21 |
+
|
22 |
+
if ( ! defined ( 'ABSPATH' ) ) {
|
23 |
+
exit;
|
24 |
+
} // Exit if accessed directly
|
25 |
+
|
26 |
+
if ( ! function_exists ( 'yit_maybe_plugin_fw_loader' ) ) {
|
27 |
+
/**
|
28 |
+
* YITH WooCommerce Ajax Navigation
|
29 |
+
*
|
30 |
+
* @since 1.0.0
|
31 |
+
*/
|
32 |
+
function yit_maybe_plugin_fw_loader ( $plugin_path ) {
|
33 |
+
global $plugin_fw_data;
|
34 |
+
|
35 |
+
$default_headers = array (
|
36 |
+
'Name' => 'Framework Name',
|
37 |
+
'Version' => 'Version',
|
38 |
+
'Author' => 'Author',
|
39 |
+
'TextDomain' => 'Text Domain',
|
40 |
+
'DomainPath' => 'Domain Path',
|
41 |
+
);
|
42 |
+
|
43 |
+
$framework_data = get_file_data ( trailingslashit ( $plugin_path ) . 'plugin-fw/init.php', $default_headers );
|
44 |
+
$plugin_fw_main_file = trailingslashit ( $plugin_path ) . 'plugin-fw/yit-plugin.php';
|
45 |
+
|
46 |
+
if ( ! empty( $plugin_fw_data ) ) {
|
47 |
+
foreach ( $plugin_fw_data as $version => $path ) {
|
48 |
+
if ( version_compare ( $version, $framework_data[ 'Version' ], '<' ) ) {
|
49 |
+
$plugin_fw_data = array ( $framework_data[ 'Version' ] => $plugin_fw_main_file );
|
50 |
+
}
|
51 |
+
}
|
52 |
+
} else {
|
53 |
+
$plugin_fw_data = array ( $framework_data[ 'Version' ] => $plugin_fw_main_file );
|
54 |
+
}
|
55 |
+
}
|
56 |
+
}
|
57 |
+
|
58 |
+
|
plugin-fw/languages/yith-plugin-fw-es_ES.po
CHANGED
@@ -1,1197 +1,1197 @@
|
|
1 |
-
# Copyright (C) 2015 YIThemes
|
2 |
-
# This file is distributed under the same license as the YITH Plugin Starter package.
|
3 |
-
msgid ""
|
4 |
-
msgstr ""
|
5 |
-
"Project-Id-Version: YITH Plugin Starter 1.0.0 Plugin FW\n"
|
6 |
-
"Report-Msgid-Bugs-To: Your Inspiration Themes <plugins@yithemes.com>\n"
|
7 |
-
"POT-Creation-Date: 2016-07-06 15:18+0200\n"
|
8 |
-
"PO-Revision-Date: 2016-07-06 15:19+0200\n"
|
9 |
-
"Last-Translator: \n"
|
10 |
-
"Language-Team: Your Inspiration Themes <info@yithemes.com>\n"
|
11 |
-
"Language: es_ES\n"
|
12 |
-
"MIME-Version: 1.0\n"
|
13 |
-
"Content-Type: text/plain; charset=UTF-8\n"
|
14 |
-
"Content-Transfer-Encoding: 8bit\n"
|
15 |
-
"X-Generator: Poedit 1.8.8\n"
|
16 |
-
"X-Poedit-KeywordsList: __;_e;_x:1,2c;_ex:1,2c;_n:1,2;_nx:1,2,4c;_n_noop:1,2;"
|
17 |
-
"_nx_noop:1,2,3c;esc_attr__;esc_html__;esc_attr_e;esc_html_e;esc_attr_x:1,2c;"
|
18 |
-
"esc_html_x:1,2c\n"
|
19 |
-
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
20 |
-
"X-Poedit-SourceCharset: UTF-8\n"
|
21 |
-
"X-Poedit-Basepath: ..\n"
|
22 |
-
"X-Textdomain-Support: yes\n"
|
23 |
-
"X-Poedit-SearchPath-0: .\n"
|
24 |
-
|
25 |
-
#: lib/yit-cpt-unlimited.php:460 lib/yit-cpt-unlimited.php:574
|
26 |
-
#: lib/yit-cpt-unlimited.php:719 lib/yit-cpt-unlimited.php:1632
|
27 |
-
#, php-format
|
28 |
-
msgid "Add %s"
|
29 |
-
msgstr "Añadir %s"
|
30 |
-
|
31 |
-
#: lib/yit-cpt-unlimited.php:461 lib/yit-cpt-unlimited.php:575
|
32 |
-
#, php-format
|
33 |
-
msgid "Add New %s"
|
34 |
-
msgstr "Añadir nuevo/a %s"
|
35 |
-
|
36 |
-
#: lib/yit-cpt-unlimited.php:462 lib/yit-cpt-unlimited.php:576
|
37 |
-
#: lib/yit-cpt-unlimited.php:1267 lib/yit-cpt-unlimited.php:1304
|
38 |
-
#, php-format
|
39 |
-
msgid "Edit %s"
|
40 |
-
msgstr "Editar %s"
|
41 |
-
|
42 |
-
#: lib/yit-cpt-unlimited.php:463 lib/yit-cpt-unlimited.php:577
|
43 |
-
#, php-format
|
44 |
-
msgid "New %s"
|
45 |
-
msgstr "Nuevo/a %s"
|
46 |
-
|
47 |
-
#: lib/yit-cpt-unlimited.php:464 lib/yit-cpt-unlimited.php:578
|
48 |
-
#, php-format
|
49 |
-
msgid "All %s"
|
50 |
-
msgstr "Todo %s"
|
51 |
-
|
52 |
-
#: lib/yit-cpt-unlimited.php:465 lib/yit-cpt-unlimited.php:579
|
53 |
-
#: lib/yit-cpt-unlimited.php:1251 lib/yit-cpt-unlimited.php:1305
|
54 |
-
#, php-format
|
55 |
-
msgid "View %s"
|
56 |
-
msgstr "Ver %s"
|
57 |
-
|
58 |
-
#: lib/yit-cpt-unlimited.php:466 lib/yit-cpt-unlimited.php:580
|
59 |
-
#, php-format
|
60 |
-
msgid "Search %s"
|
61 |
-
msgstr "Buscar %s"
|
62 |
-
|
63 |
-
#: lib/yit-cpt-unlimited.php:467 lib/yit-cpt-unlimited.php:581
|
64 |
-
#, php-format
|
65 |
-
msgid "No %s found"
|
66 |
-
msgstr "No se encontraron %s"
|
67 |
-
|
68 |
-
#: lib/yit-cpt-unlimited.php:468 lib/yit-cpt-unlimited.php:582
|
69 |
-
#, php-format
|
70 |
-
msgid "No %s found in Trash"
|
71 |
-
msgstr "No se encontraron %s en la Papelera"
|
72 |
-
|
73 |
-
#: lib/yit-cpt-unlimited.php:625
|
74 |
-
#, php-format
|
75 |
-
msgctxt "taxonomy general name"
|
76 |
-
msgid "%s Categories"
|
77 |
-
msgstr "%s Categorías"
|
78 |
-
|
79 |
-
#: lib/yit-cpt-unlimited.php:626
|
80 |
-
msgctxt "taxonomy singular name"
|
81 |
-
msgid "Category"
|
82 |
-
msgstr "Categoría"
|
83 |
-
|
84 |
-
#: lib/yit-cpt-unlimited.php:627
|
85 |
-
msgid "Search Categories"
|
86 |
-
msgstr "Buscar Categorías"
|
87 |
-
|
88 |
-
#: lib/yit-cpt-unlimited.php:628
|
89 |
-
msgid "All Categories"
|
90 |
-
msgstr "Todas las categorías"
|
91 |
-
|
92 |
-
#: lib/yit-cpt-unlimited.php:629
|
93 |
-
msgid "Parent Category"
|
94 |
-
msgstr "Categoría Madre"
|
95 |
-
|
96 |
-
#: lib/yit-cpt-unlimited.php:630
|
97 |
-
msgid "Parent Category:"
|
98 |
-
msgstr "Categoría Madre:"
|
99 |
-
|
100 |
-
#: lib/yit-cpt-unlimited.php:631
|
101 |
-
msgid "Edit Category"
|
102 |
-
msgstr "Editar Categoría:"
|
103 |
-
|
104 |
-
#: lib/yit-cpt-unlimited.php:632
|
105 |
-
msgid "Update Category"
|
106 |
-
msgstr "Actualizar Categoría:"
|
107 |
-
|
108 |
-
#: lib/yit-cpt-unlimited.php:633
|
109 |
-
msgid "Add New Category"
|
110 |
-
msgstr "Añadir nueva categoría"
|
111 |
-
|
112 |
-
#: lib/yit-cpt-unlimited.php:634
|
113 |
-
msgid "New Category Name"
|
114 |
-
msgstr "Nuevo nombre de categoría"
|
115 |
-
|
116 |
-
#: lib/yit-cpt-unlimited.php:635
|
117 |
-
msgid "Category"
|
118 |
-
msgstr "Categoría"
|
119 |
-
|
120 |
-
#: lib/yit-cpt-unlimited.php:724
|
121 |
-
msgid "Categories"
|
122 |
-
msgstr "Categorías"
|
123 |
-
|
124 |
-
#: lib/yit-cpt-unlimited.php:1042
|
125 |
-
#, php-format
|
126 |
-
msgid "%s Settings"
|
127 |
-
msgstr "%s Ajustes"
|
128 |
-
|
129 |
-
#: lib/yit-cpt-unlimited.php:1048 lib/yit-cpt-unlimited.php:1196
|
130 |
-
#: lib/yit-cpt-unlimited.php:1202 lib/yit-plugin-panel.php:74
|
131 |
-
msgid "Settings"
|
132 |
-
msgstr "Ajustes"
|
133 |
-
|
134 |
-
#: lib/yit-cpt-unlimited.php:1051
|
135 |
-
msgid "Type"
|
136 |
-
msgstr "Tipos"
|
137 |
-
|
138 |
-
#: lib/yit-cpt-unlimited.php:1052
|
139 |
-
#, php-format
|
140 |
-
msgid "Layout for this %s"
|
141 |
-
msgstr "Diseño para este %s"
|
142 |
-
|
143 |
-
#: lib/yit-cpt-unlimited.php:1058
|
144 |
-
msgid "Rewrite"
|
145 |
-
msgstr "Reescribir"
|
146 |
-
|
147 |
-
#: lib/yit-cpt-unlimited.php:1059
|
148 |
-
msgid ""
|
149 |
-
"Univocal identification name in the URL for each product (slug from post if "
|
150 |
-
"empty)"
|
151 |
-
msgstr ""
|
152 |
-
"Nombre de identificación único en la URL para cada producto (slug desde la "
|
153 |
-
"entrada si está vacío)"
|
154 |
-
|
155 |
-
#: lib/yit-cpt-unlimited.php:1064
|
156 |
-
msgid "Label in Singular"
|
157 |
-
msgstr "Etiqueta en singular"
|
158 |
-
|
159 |
-
#: lib/yit-cpt-unlimited.php:1065
|
160 |
-
msgid "Set a label in singular (title of portfolio if empty)"
|
161 |
-
msgstr ""
|
162 |
-
"Establecer una etiqueta en singular (título del portafolio si está vacío)"
|
163 |
-
|
164 |
-
#: lib/yit-cpt-unlimited.php:1070
|
165 |
-
msgid "Label in Plural"
|
166 |
-
msgstr "Etiqueta en Plural"
|
167 |
-
|
168 |
-
#: lib/yit-cpt-unlimited.php:1071
|
169 |
-
msgid "Set a label in plural (title of portfolio if empty)"
|
170 |
-
msgstr ""
|
171 |
-
"Establecer una etiqueta en plural (título del portafolio si está vacío)"
|
172 |
-
|
173 |
-
#: lib/yit-cpt-unlimited.php:1076
|
174 |
-
msgid "Taxonomy"
|
175 |
-
msgstr "Taxonomía"
|
176 |
-
|
177 |
-
#: lib/yit-cpt-unlimited.php:1077
|
178 |
-
msgid ""
|
179 |
-
"If you want to use categories in the portfolio, set a name for taxonomy. "
|
180 |
-
"Name should be a slug (must not contain capital letters nor spaces) and must "
|
181 |
-
"not be more than 32 characters long (database structure restriction)."
|
182 |
-
msgstr ""
|
183 |
-
"Si quieres usar categorías en el portafolio, establece un nombre para la "
|
184 |
-
"taxonomía. El nombre debería ser un slug (no debe contener mayúsculas ni "
|
185 |
-
"espacios) y no debe ser más largo de 32 caracteres (restricción de "
|
186 |
-
"estructura de base de datos)."
|
187 |
-
|
188 |
-
#: lib/yit-cpt-unlimited.php:1082
|
189 |
-
msgid "Taxonomy Rewrite"
|
190 |
-
msgstr "Taxonomía de reescritura"
|
191 |
-
|
192 |
-
#: lib/yit-cpt-unlimited.php:1083
|
193 |
-
msgid "Set univocal name for each category page URL."
|
194 |
-
msgstr "Establecer nombre único para cada página URL de categoría."
|
195 |
-
|
196 |
-
#: lib/yit-cpt-unlimited.php:1088
|
197 |
-
msgid "Single layout"
|
198 |
-
msgstr "Diseño Simple"
|
199 |
-
|
200 |
-
#: lib/yit-cpt-unlimited.php:1089
|
201 |
-
msgid "Layout for single page of this portfolio"
|
202 |
-
msgstr "Diseño para cada página de este portafolio"
|
203 |
-
|
204 |
-
#: lib/yit-cpt-unlimited.php:1130
|
205 |
-
msgid "layout settings"
|
206 |
-
msgstr "Ajustes de diseño"
|
207 |
-
|
208 |
-
#: lib/yit-cpt-unlimited.php:1222 lib/yit-cpt-unlimited.php:1235
|
209 |
-
msgid "Quick links"
|
210 |
-
msgstr "Enlaces rápidos"
|
211 |
-
|
212 |
-
#: lib/yit-cpt-unlimited.php:1475
|
213 |
-
#, php-format
|
214 |
-
msgid "Show frontend of the %s"
|
215 |
-
msgstr "Mostrar parte delantera de %s"
|
216 |
-
|
217 |
-
#: lib/yit-cpt-unlimited.php:1482 templates/metaboxes/types/customtabs.php:46
|
218 |
-
#: templates/metaboxes/types/customtabs.php:90
|
219 |
-
msgid "Name"
|
220 |
-
msgstr "Nombre"
|
221 |
-
|
222 |
-
#: lib/yit-cpt-unlimited.php:1631
|
223 |
-
#, php-format
|
224 |
-
msgid "Add %s from images"
|
225 |
-
msgstr "Añadir %s desde imágenes"
|
226 |
-
|
227 |
-
#: lib/yit-cpt-unlimited.php:1633
|
228 |
-
msgid "Upload multiple files"
|
229 |
-
msgstr "Cargar archivos múltiples"
|
230 |
-
|
231 |
-
#: lib/yit-plugin-panel-sidebar.php:421 templates/panel/sidebar/sidebar.php:3
|
232 |
-
msgid "Hide sidebar"
|
233 |
-
msgstr "Ocultar barra lateral"
|
234 |
-
|
235 |
-
#: lib/yit-plugin-panel-sidebar.php:422 templates/panel/sidebar/sidebar.php:3
|
236 |
-
msgid "Show sidebar"
|
237 |
-
msgstr "Mostrar barra lateral"
|
238 |
-
|
239 |
-
#: lib/yit-plugin-panel-wc.php:374
|
240 |
-
msgid "The changes you have made will be lost if you leave this page."
|
241 |
-
msgstr "Los cambios que has hecho se perderán si sales de esta página."
|
242 |
-
|
243 |
-
#: lib/yit-plugin-panel.php:73
|
244 |
-
msgid "Plugin Settings"
|
245 |
-
msgstr "Ajustes del plugin"
|
246 |
-
|
247 |
-
#: lib/yit-plugin-panel.php:297 lib/yit-plugin-panel.php:300
|
248 |
-
msgid "How to install premium version"
|
249 |
-
msgstr "Cómo instalar la versión premium"
|
250 |
-
|
251 |
-
#: lib/yit-plugin-panel.php:352 lib/yit-plugin-subpanel.php:146
|
252 |
-
#: templates/panel/woocommerce/woocommerce-form.php:11
|
253 |
-
msgid "Save Changes"
|
254 |
-
msgstr "Guardar cambios"
|
255 |
-
|
256 |
-
#: lib/yit-plugin-panel.php:355
|
257 |
-
#: templates/panel/woocommerce/woocommerce-form.php:14
|
258 |
-
msgid ""
|
259 |
-
"If you continue with this action, you will reset all options in this page."
|
260 |
-
msgstr ""
|
261 |
-
"Si sigues con esta acción, se reiniciarán todas las opciones en esta página."
|
262 |
-
|
263 |
-
#: lib/yit-plugin-panel.php:357 lib/yit-plugin-subpanel.php:151
|
264 |
-
msgid "Reset to default"
|
265 |
-
msgstr "Reiniciar a predeterminado"
|
266 |
-
|
267 |
-
#: lib/yit-plugin-panel.php:357 lib/yit-plugin-subpanel.php:151
|
268 |
-
#: templates/panel/woocommerce/woocommerce-form.php:18
|
269 |
-
msgid "Are you sure?"
|
270 |
-
msgstr "¿Estás seguro/a?"
|
271 |
-
|
272 |
-
#: lib/yit-plugin-panel.php:553
|
273 |
-
msgid ""
|
274 |
-
"The element you have entered already exists. Please, enter another name."
|
275 |
-
msgstr ""
|
276 |
-
"El elemento que has introducido ya existe. Por favor, introduce otro nombre."
|
277 |
-
|
278 |
-
#: lib/yit-plugin-panel.php:554
|
279 |
-
msgid "Settings saved"
|
280 |
-
msgstr "Ajustes guardados"
|
281 |
-
|
282 |
-
#: lib/yit-plugin-panel.php:555
|
283 |
-
msgid "Settings reset"
|
284 |
-
msgstr "Ajustes reiniciados"
|
285 |
-
|
286 |
-
#: lib/yit-plugin-panel.php:556
|
287 |
-
msgid "Element deleted correctly."
|
288 |
-
msgstr "Elemento borrado correctamente."
|
289 |
-
|
290 |
-
#: lib/yit-plugin-panel.php:557 lib/yit-plugin-panel.php:558
|
291 |
-
msgid "Element updated correctly."
|
292 |
-
msgstr "Elemento actualizado correctamente."
|
293 |
-
|
294 |
-
#: lib/yit-plugin-panel.php:559
|
295 |
-
msgid "Database imported correctly."
|
296 |
-
msgstr "Base de datos importada correctamente."
|
297 |
-
|
298 |
-
#: lib/yit-plugin-panel.php:560
|
299 |
-
msgid "An error has occurred during import. Please try again."
|
300 |
-
msgstr ""
|
301 |
-
"Ha ocurrido un error durante la importación. Por favor, inténtalo de nuevo."
|
302 |
-
|
303 |
-
#: lib/yit-plugin-panel.php:561
|
304 |
-
msgid "The added file is not valid."
|
305 |
-
msgstr "El archivo añadido no es válido."
|
306 |
-
|
307 |
-
#: lib/yit-plugin-panel.php:562
|
308 |
-
msgid "Sorry, import is disabled."
|
309 |
-
msgstr "Lo sentimos, la importación está deshabilitada."
|
310 |
-
|
311 |
-
#: lib/yit-plugin-panel.php:563
|
312 |
-
msgid "Sorting successful."
|
313 |
-
msgstr "Clasificación fue realizada con éxito."
|
314 |
-
|
315 |
-
#: lib/yit-plugin-subpanel.php:149
|
316 |
-
msgid ""
|
317 |
-
"If you continue with this action, you will reset all the options in this "
|
318 |
-
"page."
|
319 |
-
msgstr ""
|
320 |
-
"Si continúas con esta acción, reiniciarás todas las opciones de esta página."
|
321 |
-
|
322 |
-
#: lib/yit-pointers.php:70
|
323 |
-
msgid "Plugins Activated"
|
324 |
-
msgstr "Plugins Activados"
|
325 |
-
|
326 |
-
#: lib/yit-pointers.php:71
|
327 |
-
msgid ""
|
328 |
-
"From now on, you can find all plugin options in YIT Plugin menu.\n"
|
329 |
-
" For each plugin installed, "
|
330 |
-
"customization settings will be available as a new entry in YIT Plugin menu."
|
331 |
-
msgstr ""
|
332 |
-
"De ahora en adelante, puedes encontrar todas las opciones del plugin en el "
|
333 |
-
"menú YIT Plugin.\n"
|
334 |
-
" Para cada plugin instalado, los ajustes "
|
335 |
-
"de personalización estarán disponibles como una nueva entrada en el menú YIT "
|
336 |
-
"Plugin."
|
337 |
-
|
338 |
-
#: lib/yit-pointers.php:73 lib/yit-pointers.php:89
|
339 |
-
msgid "Discover all our plugins available on:"
|
340 |
-
msgstr "Descubre todos nuestros plugins disponibles en:"
|
341 |
-
|
342 |
-
#: lib/yit-pointers.php:74 lib/yit-pointers.php:90
|
343 |
-
msgid "and"
|
344 |
-
msgstr "y"
|
345 |
-
|
346 |
-
#: lib/yit-pointers.php:84
|
347 |
-
msgid "Plugins Upgraded"
|
348 |
-
msgstr "Plugins Actualizados"
|
349 |
-
|
350 |
-
#: lib/yit-pointers.php:85
|
351 |
-
msgid ""
|
352 |
-
"From now on, you can find all options of your plugins in YIT Plugin menu.\n"
|
353 |
-
" Any time one of our plugins is updated, "
|
354 |
-
"a new entry will be added to this menu.\n"
|
355 |
-
" For example, after the update, plugin "
|
356 |
-
"options (such as for YITH WooCommerce Wishlist, YITH WooCommerce Ajax "
|
357 |
-
"Search, etc.)\n"
|
358 |
-
" will be moved from previous location to "
|
359 |
-
"YIT Plugin tab."
|
360 |
-
msgstr ""
|
361 |
-
"De ahora en adelante, puedes encontrar todas las opciones de tus plugins en "
|
362 |
-
"el menú YIT Plugin.\n"
|
363 |
-
" Cada vez que uno de nuestros plugins sea "
|
364 |
-
"actualizado, se añadirá una nueva entrada a este menú.\n"
|
365 |
-
" Por ejemplo, después de actualizar, las "
|
366 |
-
"opciones del plugin (como las de YITH WooCommerce Wishlist, YITH WooCommerce "
|
367 |
-
"Ajax Search, etc.)\n"
|
368 |
-
" se moverán de su posición anterior a la "
|
369 |
-
"pestaña YIT Plugin."
|
370 |
-
|
371 |
-
#: lib/yit-upgrade.php:135
|
372 |
-
msgid "There is a new version of %plugin_name% available."
|
373 |
-
msgstr "Hay una nueva versión de %plugin_name% disponible."
|
374 |
-
|
375 |
-
#: lib/yit-upgrade.php:136
|
376 |
-
msgid "View version %latest% details."
|
377 |
-
msgstr "Ver detalles de la %latest% versión"
|
378 |
-
|
379 |
-
#: lib/yit-upgrade.php:137
|
380 |
-
msgid "Automatic update is unavailable for this plugin,"
|
381 |
-
msgstr "Las actualizaciones automáticas no están disponibles para este plugin,"
|
382 |
-
|
383 |
-
#: lib/yit-upgrade.php:138
|
384 |
-
msgid ""
|
385 |
-
"please <a href=\"%activate_link%\">activate</a> your copy of %plugin_name%."
|
386 |
-
msgstr ""
|
387 |
-
"por favor, <a href=\"%activate_link%\">activa</a> tu copia de %plugin_name%."
|
388 |
-
|
389 |
-
#: lib/yit-upgrade.php:139
|
390 |
-
msgid "Update now."
|
391 |
-
msgstr "Actualiza ahora."
|
392 |
-
|
393 |
-
#: lib/yit-upgrade.php:240
|
394 |
-
msgid "YIThemes Repository"
|
395 |
-
msgstr "Repositorio YIThemes"
|
396 |
-
|
397 |
-
#: lib/yit-upgrade.php:274
|
398 |
-
msgid "Invalid URL Provided."
|
399 |
-
msgstr "La URL proporcionada no es válida."
|
400 |
-
|
401 |
-
#: lib/yit-upgrade.php:287
|
402 |
-
msgid "Could not create Temporary file."
|
403 |
-
msgstr "No se pudo crear un archivo temporal."
|
404 |
-
|
405 |
-
#: lib/yit-upgrade.php:439
|
406 |
-
#, php-format
|
407 |
-
msgid ""
|
408 |
-
"There is a new version of %1$s available. <a href=\"%2$s\" class=\"thickbox "
|
409 |
-
"yit-changelog-button\" title=\"%3$s\">View version %4$s details</a>."
|
410 |
-
msgstr ""
|
411 |
-
"Hay una nueva versión de %1$s disponible. <a href=\"%2$s\" class=\"thickbox "
|
412 |
-
"yit-changelog-button\" title=\"%3$s\">Ver detalles de la versión %4$s</a>."
|
413 |
-
|
414 |
-
#: lib/yit-upgrade.php:441
|
415 |
-
#, php-format
|
416 |
-
msgid ""
|
417 |
-
"There is a new version of %1$s available. <a href=\"%2$s\" class=\"thickbox "
|
418 |
-
"yit-changelog-button\" title=\"%3$s\">View version %4$s details</a>. <em>You "
|
419 |
-
"have to activate the plugin on a single site of the network to benefit from "
|
420 |
-
"automatic updates.</em>"
|
421 |
-
msgstr ""
|
422 |
-
"Hay una nueva versión de %1$s disponible. <a href=\"%2$s\" class=\"thickbox "
|
423 |
-
"yit-changelog-button\" title=\"%3$s\">Ver detalles de la versión %4$s</a>. "
|
424 |
-
"<em>Tienes que activar el plugin en un único sitio web desdela red para "
|
425 |
-
"beneficiarte de las actualizaciones automáticas.</em>"
|
426 |
-
|
427 |
-
#: lib/yit-upgrade.php:443
|
428 |
-
#, php-format
|
429 |
-
msgid ""
|
430 |
-
"There is a new version of %1$s available. <a href=\"%2$s\" class=\"thickbox "
|
431 |
-
"yit-changelog-button\" title=\"%3$s\">View version %4$s details</a>. "
|
432 |
-
"<em>Automatic update is unavailable for this plugin, please <a href=\"%5$s\" "
|
433 |
-
"title=\"License activation\">activate</a> your copy of %6s.</em>"
|
434 |
-
msgstr ""
|
435 |
-
"Hay una nueva versión de %1$s disponible. <a href=\"%2$s\" class=\"thickbox "
|
436 |
-
"yit-changelog-button\" title=\"%3$s\">Ver detalles de la versión %4$s</a>. "
|
437 |
-
"<em>Las actualizaciones automáticas no están disponibles para este plugin, "
|
438 |
-
"por favor <a href=\"%5$s\" title=\"License activation\">activa</a> tu copia "
|
439 |
-
"de %6s.</em>"
|
440 |
-
|
441 |
-
#: lib/yit-upgrade.php:445
|
442 |
-
#, php-format
|
443 |
-
msgid ""
|
444 |
-
"There is a new version of %1$s available. <a href=\"%2$s\" class=\"thickbox "
|
445 |
-
"yit-changelog-button\" title=\"%3$s\">View version %4$s details</a> or <a "
|
446 |
-
"href=\"%5$s\">update now</a>."
|
447 |
-
msgstr ""
|
448 |
-
"Hay una nueva versión de %1$s disponible. <a href=\"%2$s\" class=\"thickbox "
|
449 |
-
"yit-changelog-button\" title=\"%3$s\">Ver detalles de la versión %4$s</a> o "
|
450 |
-
"<a href=\"%5$s\">actualizar ahora</a>."
|
451 |
-
|
452 |
-
#: lib/yit-upgrade.php:517
|
453 |
-
msgid "You can't update the plugins for this site."
|
454 |
-
msgstr "No puedes actualizar los plugins para este sitio web."
|
455 |
-
|
456 |
-
#: lib/yit-upgrade.php:521
|
457 |
-
msgid ""
|
458 |
-
"You do not have sufficient permissions to update the plugins for this site."
|
459 |
-
msgstr ""
|
460 |
-
"No tienes suficientes permisos para actualizar los plugins para este sitio "
|
461 |
-
"web."
|
462 |
-
|
463 |
-
#: lib/yit-upgrade.php:528
|
464 |
-
msgid "Update Plugin"
|
465 |
-
msgstr "Actualizar Plugin"
|
466 |
-
|
467 |
-
#: licence/lib/yit-licence.php:182
|
468 |
-
#, php-format
|
469 |
-
msgctxt "%s = field name"
|
470 |
-
msgid "%s field cannot be empty"
|
471 |
-
msgstr "%s el campo no puede estar vacío"
|
472 |
-
|
473 |
-
#: licence/lib/yit-licence.php:183
|
474 |
-
#, php-format
|
475 |
-
msgid "%s and %s fields cannot be empty"
|
476 |
-
msgstr "Los campos %s y %s no pueden estar vacíos"
|
477 |
-
|
478 |
-
#: licence/lib/yit-licence.php:184
|
479 |
-
msgid "Unable to contact the remote server, please try again later. Thanks!"
|
480 |
-
msgstr ""
|
481 |
-
"No fue posible contactar con el servidor remoto, por favor, inténtalo de "
|
482 |
-
"nuevo más tarde. ¡Gracias!"
|
483 |
-
|
484 |
-
#: licence/lib/yit-licence.php:185
|
485 |
-
#: licence/templates/panel/activation/activation-panel.php:88
|
486 |
-
#: licence/templates/panel/activation/activation-panel.php:166
|
487 |
-
#: licence/templates/panel/activation/activation-panel.php:197
|
488 |
-
#: templates/metaboxes/types/contactform.php:148
|
489 |
-
#: templates/metaboxes/types/contactform.php:340
|
490 |
-
msgid "Email"
|
491 |
-
msgstr "Email"
|
492 |
-
|
493 |
-
#: licence/lib/yit-licence.php:186
|
494 |
-
#: licence/templates/panel/activation/activation-panel.php:89
|
495 |
-
#: licence/templates/panel/activation/activation-panel.php:167
|
496 |
-
#: licence/templates/panel/activation/activation-panel.php:198
|
497 |
-
msgid "License Key"
|
498 |
-
msgstr "Clave de Licencia"
|
499 |
-
|
500 |
-
#: licence/lib/yit-licence.php:187
|
501 |
-
msgid "Are you sure you want to deactivate the license for current site?"
|
502 |
-
msgstr ""
|
503 |
-
"¿Estás seguro/a de que quieres desactivar la licencia para el sitio web "
|
504 |
-
"actual?"
|
505 |
-
|
506 |
-
#: licence/lib/yit-licence.php:667
|
507 |
-
msgid "Invalid Request"
|
508 |
-
msgstr "Solicitud inválida"
|
509 |
-
|
510 |
-
#: licence/lib/yit-licence.php:668
|
511 |
-
msgid "Invalid license key"
|
512 |
-
msgstr "Clave de solicitud inválida"
|
513 |
-
|
514 |
-
#: licence/lib/yit-licence.php:669
|
515 |
-
msgid "Software has been deactivated"
|
516 |
-
msgstr "El software ha sido desactivado"
|
517 |
-
|
518 |
-
#: licence/lib/yit-licence.php:670
|
519 |
-
msgid "Maximum number of activations exceeded"
|
520 |
-
msgstr "Se ha excedido el número máximo de solicitudes"
|
521 |
-
|
522 |
-
#: licence/lib/yit-licence.php:671
|
523 |
-
msgid "Invalid instance ID"
|
524 |
-
msgstr "Instancia ID inválida"
|
525 |
-
|
526 |
-
#: licence/lib/yit-licence.php:672
|
527 |
-
msgid "Invalid security key"
|
528 |
-
msgstr "Clave de seguridad inválida"
|
529 |
-
|
530 |
-
#: licence/lib/yit-licence.php:673
|
531 |
-
msgid "License key has expired"
|
532 |
-
msgstr "La clave de licencia ha caducado"
|
533 |
-
|
534 |
-
#: licence/lib/yit-licence.php:674
|
535 |
-
msgid "License key has been banned"
|
536 |
-
msgstr "La clave de licencia ha sido bloqueada"
|
537 |
-
|
538 |
-
#: licence/lib/yit-licence.php:675
|
539 |
-
msgid "Current product is not included in your YITH Club Subscription key"
|
540 |
-
msgstr ""
|
541 |
-
"Producto actual no está incluido en la clave de suscripción de Club de YITH"
|
542 |
-
|
543 |
-
#: licence/lib/yit-licence.php:676
|
544 |
-
msgid "Great"
|
545 |
-
msgstr "Excelente"
|
546 |
-
|
547 |
-
#: licence/lib/yit-licence.php:676
|
548 |
-
msgid "License successfully activated"
|
549 |
-
msgstr "Licencia activada con éxito"
|
550 |
-
|
551 |
-
#: licence/lib/yit-licence.php:677
|
552 |
-
msgid "License key deactivated for website"
|
553 |
-
msgstr "Clave de licencia desactivada para nuestro sitio web"
|
554 |
-
|
555 |
-
#: licence/lib/yit-plugin-licence.php:67 licence/lib/yit-plugin-licence.php:68
|
556 |
-
#: licence/lib/yit-theme-licence.php:69 licence/lib/yit-theme-licence.php:70
|
557 |
-
#: licence/lib/yit-theme-licence.php:109 licence/lib/yit-theme-licence.php:110
|
558 |
-
msgid "License Activation"
|
559 |
-
msgstr "Activación de la Licencia"
|
560 |
-
|
561 |
-
#: licence/lib/yit-theme-licence.php:117 licence/lib/yit-theme-licence.php:118
|
562 |
-
#, php-format
|
563 |
-
msgid "%s"
|
564 |
-
msgstr "%s"
|
565 |
-
|
566 |
-
#: licence/lib/yit-theme-licence.php:159
|
567 |
-
msgid ""
|
568 |
-
"I cannot find the license key for activating the theme I have bought some "
|
569 |
-
"time ago. Where can I find it?"
|
570 |
-
msgstr ""
|
571 |
-
"No puedo encontrar la clave de licencia para activar el tema que compré hace "
|
572 |
-
"tiempo. ¿Dónde la puedo encontrar?"
|
573 |
-
|
574 |
-
#: licence/lib/yit-theme-licence.php:163
|
575 |
-
msgid ""
|
576 |
-
"If you have purchased one of our products before 27 January 2015, you can "
|
577 |
-
"benefit from support and updates (the services offered with the license)\n"
|
578 |
-
" until 27 January 2016 and you do not have to purchase it "
|
579 |
-
"again to get a new license key, because, before this date, your license used "
|
580 |
-
"to be activated automatically by our system.\n"
|
581 |
-
" After 27 January 2016, instead, if you want to benefit "
|
582 |
-
"from support and updates you have to buy a new license and activate it "
|
583 |
-
"through the license key you will be\n"
|
584 |
-
" provided with and that you can find in your YIThemes "
|
585 |
-
"account, in section \"My licenses\"."
|
586 |
-
msgstr ""
|
587 |
-
"Si has comprado uno de nuestros productos antes del 27 de enero de 2015, "
|
588 |
-
"puedes beneficiarte del soporte y actualizaciones (los servicios incluidos "
|
589 |
-
"con la licencia)\n"
|
590 |
-
" hasta el 27 de enero de 2016 y no tendrás que comprarla "
|
591 |
-
"otra vez para conseguir una nueva clave de licencia, porque, antes de esta "
|
592 |
-
"fecha, tu licencia se activaba automáticamente por nuestro sistema.\n"
|
593 |
-
" Después del 27 de enero de 2016, sin embargo, si quieres "
|
594 |
-
"beneficiarte de nuestro soporte y actualizaciones, tienes que comprar una "
|
595 |
-
"nueva licencia y activarla a través de la clave de licencia que \n"
|
596 |
-
" se te proporcionará y que podrás encontrar en tu cuenta "
|
597 |
-
"YIThemes, en la sección \"My licenses\"."
|
598 |
-
|
599 |
-
#: licence/templates/panel/activation/activation-panel.php:23
|
600 |
-
msgid "Yithemes License Activation"
|
601 |
-
msgstr "Licencia de Activación Yithemes"
|
602 |
-
|
603 |
-
#: licence/templates/panel/activation/activation-panel.php:27
|
604 |
-
msgid ""
|
605 |
-
"Have you updated your licenses? Have you asked for an extension? Update "
|
606 |
-
"information concerning your products."
|
607 |
-
msgstr "¿Has actualizado tus licencias? ¿Has pedido una extensión? Actualiza"
|
608 |
-
|
609 |
-
#: licence/templates/panel/activation/activation-panel.php:29
|
610 |
-
msgid "Update license information"
|
611 |
-
msgstr "Actualizar la información de la licencia"
|
612 |
-
|
613 |
-
#: licence/templates/panel/activation/activation-panel.php:42
|
614 |
-
msgid "Product to activate"
|
615 |
-
msgid_plural "Products to activate"
|
616 |
-
msgstr[0] "Producto que activar"
|
617 |
-
msgstr[1] "Productos que activar"
|
618 |
-
|
619 |
-
#: licence/templates/panel/activation/activation-panel.php:61
|
620 |
-
msgid "Activate"
|
621 |
-
msgstr "Activar"
|
622 |
-
|
623 |
-
#: licence/templates/panel/activation/activation-panel.php:80
|
624 |
-
msgid "Activated"
|
625 |
-
msgstr "Activado/a"
|
626 |
-
|
627 |
-
#: licence/templates/panel/activation/activation-panel.php:86
|
628 |
-
#: licence/templates/panel/activation/activation-panel.php:164
|
629 |
-
#: licence/templates/panel/activation/activation-panel.php:194
|
630 |
-
msgid "Product Name"
|
631 |
-
msgstr "Nombre de Producto"
|
632 |
-
|
633 |
-
#: licence/templates/panel/activation/activation-panel.php:92
|
634 |
-
#: licence/templates/panel/activation/activation-panel.php:201
|
635 |
-
msgid "Expires"
|
636 |
-
msgstr "Caduca"
|
637 |
-
|
638 |
-
#: licence/templates/panel/activation/activation-panel.php:95
|
639 |
-
msgid "Remaining"
|
640 |
-
msgstr "Queda"
|
641 |
-
|
642 |
-
#: licence/templates/panel/activation/activation-panel.php:97
|
643 |
-
msgid "Club Subscription"
|
644 |
-
msgstr "Suscripción a Club"
|
645 |
-
|
646 |
-
#: licence/templates/panel/activation/activation-panel.php:101
|
647 |
-
msgid "License Actions"
|
648 |
-
msgstr "Acciones de Licencia"
|
649 |
-
|
650 |
-
#: licence/templates/panel/activation/activation-panel.php:126
|
651 |
-
#, php-format
|
652 |
-
msgid "%1s out of %2s"
|
653 |
-
msgstr "%1s de %2s"
|
654 |
-
|
655 |
-
#: licence/templates/panel/activation/activation-panel.php:142
|
656 |
-
msgid "Deactivate"
|
657 |
-
msgstr "Desactivar"
|
658 |
-
|
659 |
-
#: licence/templates/panel/activation/activation-panel.php:147
|
660 |
-
#: licence/templates/panel/activation/activation-panel.php:204
|
661 |
-
msgid "Renew"
|
662 |
-
msgstr "Renovado"
|
663 |
-
|
664 |
-
#: licence/templates/panel/activation/activation-panel.php:160
|
665 |
-
msgid "Banned"
|
666 |
-
msgstr "Bloqueado"
|
667 |
-
|
668 |
-
#: licence/templates/panel/activation/activation-panel.php:190
|
669 |
-
msgid "Expired"
|
670 |
-
msgstr "Caducado"
|
671 |
-
|
672 |
-
#: licence/templates/panel/activation/activation-panel.php:226
|
673 |
-
msgid "Order again"
|
674 |
-
msgstr "Comprar de nuevo"
|
675 |
-
|
676 |
-
#: licence/templates/panel/activation/activation-panel.php:228
|
677 |
-
msgid "Renew license"
|
678 |
-
msgstr "Renovar licencia"
|
679 |
-
|
680 |
-
#: templates/metaboxes/types/ajax-products.php:23
|
681 |
-
msgid "Search for a product"
|
682 |
-
msgstr "Buscar un producto"
|
683 |
-
|
684 |
-
#: templates/metaboxes/types/categories.php:36
|
685 |
-
msgid "No categories."
|
686 |
-
msgstr "Ninguna categoría."
|
687 |
-
|
688 |
-
#: templates/metaboxes/types/categories.php:42
|
689 |
-
msgid "+ Add New Category"
|
690 |
-
msgstr "+ Añadir Nueva Categoría"
|
691 |
-
|
692 |
-
#: templates/metaboxes/types/categories.php:46
|
693 |
-
msgid "Add"
|
694 |
-
msgstr "Añadir"
|
695 |
-
|
696 |
-
#: templates/metaboxes/types/contactform.php:7
|
697 |
-
msgid "Text Input"
|
698 |
-
msgstr "Text Input"
|
699 |
-
|
700 |
-
#: templates/metaboxes/types/contactform.php:8
|
701 |
-
msgid "Checkbox"
|
702 |
-
msgstr "Casilla"
|
703 |
-
|
704 |
-
#: templates/metaboxes/types/contactform.php:9
|
705 |
-
msgid "Select"
|
706 |
-
msgstr "Seleciona"
|
707 |
-
|
708 |
-
#: templates/metaboxes/types/contactform.php:10
|
709 |
-
msgid "Textarea"
|
710 |
-
msgstr "Área de texto"
|
711 |
-
|
712 |
-
#: templates/metaboxes/types/contactform.php:11
|
713 |
-
msgid "Radio Input"
|
714 |
-
msgstr "Radio Input"
|
715 |
-
|
716 |
-
#: templates/metaboxes/types/contactform.php:12
|
717 |
-
msgid "Password Field"
|
718 |
-
msgstr "Campo de contraseña"
|
719 |
-
|
720 |
-
#: templates/metaboxes/types/contactform.php:13
|
721 |
-
msgid "File Upload"
|
722 |
-
msgstr "Carga de archivo"
|
723 |
-
|
724 |
-
#: templates/metaboxes/types/contactform.php:47
|
725 |
-
msgid "Theme Icon"
|
726 |
-
msgstr "Icono del tema"
|
727 |
-
|
728 |
-
#: templates/metaboxes/types/contactform.php:48
|
729 |
-
msgid "Custom Icon"
|
730 |
-
msgstr "Icono Personalizado"
|
731 |
-
|
732 |
-
#: templates/metaboxes/types/contactform.php:49
|
733 |
-
#: templates/metaboxes/types/responsivesliders.php:24
|
734 |
-
msgid "None"
|
735 |
-
msgstr "Ninguno"
|
736 |
-
|
737 |
-
#: templates/metaboxes/types/contactform.php:60
|
738 |
-
msgid "Add field"
|
739 |
-
msgstr "Añadir campo"
|
740 |
-
|
741 |
-
#: templates/metaboxes/types/contactform.php:69
|
742 |
-
#: templates/metaboxes/types/contactform.php:261
|
743 |
-
#: templates/metaboxes/types/customtabs.php:37
|
744 |
-
#: templates/metaboxes/types/customtabs.php:82
|
745 |
-
msgid "Remove"
|
746 |
-
msgstr "Borrar"
|
747 |
-
|
748 |
-
#: templates/metaboxes/types/contactform.php:70
|
749 |
-
#: templates/metaboxes/types/contactform.php:262
|
750 |
-
msgid "Click to toggle"
|
751 |
-
msgstr "Haz click para alternar"
|
752 |
-
|
753 |
-
#: templates/metaboxes/types/contactform.php:77
|
754 |
-
#: templates/metaboxes/types/contactform.php:269
|
755 |
-
msgid "Field Title"
|
756 |
-
msgstr "Campo de título"
|
757 |
-
|
758 |
-
#: templates/metaboxes/types/contactform.php:81
|
759 |
-
#: templates/metaboxes/types/contactform.php:273
|
760 |
-
msgid "Insert the title for the field."
|
761 |
-
msgstr "Inserta el título del campo."
|
762 |
-
|
763 |
-
#: templates/metaboxes/types/contactform.php:86
|
764 |
-
#: templates/metaboxes/types/contactform.php:278
|
765 |
-
msgid "Data Name"
|
766 |
-
msgstr "Nombre del dato."
|
767 |
-
|
768 |
-
#: templates/metaboxes/types/contactform.php:90
|
769 |
-
#: templates/metaboxes/types/contactform.php:282
|
770 |
-
msgid ""
|
771 |
-
"REQUIRED: Field identification name to be entered into email body. "
|
772 |
-
"<strong>Note:</strong>Use only lowercase characters and underscores."
|
773 |
-
msgstr ""
|
774 |
-
"OBLIGATORIO: El nombre del campo de identificación debe introducirse en el "
|
775 |
-
"cuerpo del email. <strong> Nota: </strong> Usa sólo minúsculas y guiones "
|
776 |
-
"bajos."
|
777 |
-
|
778 |
-
#: templates/metaboxes/types/contactform.php:95
|
779 |
-
#: templates/metaboxes/types/contactform.php:287
|
780 |
-
msgid "Field Type"
|
781 |
-
msgstr "Tipo de campo"
|
782 |
-
|
783 |
-
#: templates/metaboxes/types/contactform.php:103
|
784 |
-
#: templates/metaboxes/types/contactform.php:295
|
785 |
-
msgid "Select the type for this field."
|
786 |
-
msgstr "Selecciona el tipo para este campo."
|
787 |
-
|
788 |
-
#: templates/metaboxes/types/contactform.php:108
|
789 |
-
#: templates/metaboxes/types/contactform.php:300
|
790 |
-
msgid "Checked"
|
791 |
-
msgstr "Campo seleccionado"
|
792 |
-
|
793 |
-
#: templates/metaboxes/types/contactform.php:112
|
794 |
-
#: templates/metaboxes/types/contactform.php:304
|
795 |
-
msgid "Select this option if you want this field appears as already checked."
|
796 |
-
msgstr ""
|
797 |
-
"Selecciona esta opción si quieres que este campo aparezca como ya marcado."
|
798 |
-
|
799 |
-
#: templates/metaboxes/types/contactform.php:117
|
800 |
-
#:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|