right-rails 0.3.2 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/generators/right_rails/right_rails_generator.rb +1 -1
- data/javascripts/right-autocompleter-src.js +5 -3
- data/javascripts/right-autocompleter.js +1 -1
- data/javascripts/right-behavior-src.js +21 -0
- data/javascripts/right-behavior.js +1 -1
- data/javascripts/right-calendar-src.js +3 -3
- data/javascripts/right-calendar.js +1 -1
- data/javascripts/right-dnd-src.js +3 -2
- data/javascripts/right-dnd.js +1 -1
- data/javascripts/right-effects-src.js +30 -18
- data/javascripts/right-effects.js +1 -1
- data/javascripts/right-lightbox-src.js +10 -8
- data/javascripts/right-lightbox.js +1 -1
- data/javascripts/right-olds-src.js +547 -0
- data/javascripts/right-olds.js +9 -0
- data/javascripts/right-rails-min.js +9 -0
- data/javascripts/right-rails-src.js +14 -12
- data/javascripts/right-rails.js +1 -1
- data/javascripts/right-rater-src.js +2 -2
- data/javascripts/right-rater.js +1 -1
- data/javascripts/right-selectable-src.js +3 -3
- data/javascripts/right-selectable.js +1 -1
- data/javascripts/right-slider-src.js +4 -4
- data/javascripts/right-slider.js +1 -1
- data/javascripts/right-sortable-src.js +21 -16
- data/javascripts/right-sortable.js +1 -1
- data/javascripts/right-src.js +755 -1240
- data/javascripts/right-tabs-src.js +2 -2
- data/javascripts/right-tabs.js +1 -1
- data/javascripts/right-tooltips-src.js +3 -3
- data/javascripts/right-tooltips.js +1 -1
- data/javascripts/right-ui-i18n-ru.js +2 -2
- data/javascripts/right.js +3 -2
- metadata +7 -3
data/javascripts/right-src.js
CHANGED
@@ -4,16 +4,17 @@
|
|
4
4
|
* The library released under terms of the MIT license
|
5
5
|
* Visit http://rightjs.org for more details
|
6
6
|
*
|
7
|
+
* Custom build with options: no-olds
|
8
|
+
*
|
7
9
|
* Copyright (C) 2008-2009 Nikolay V. Nemshilov aka St.
|
8
10
|
*/
|
9
|
-
|
10
11
|
/**
|
11
12
|
* The framework description object
|
12
13
|
*
|
13
14
|
* Copyright (C) 2008-2009 Nikolay V. Nemshilov aka St. <nemshilov#gma-ilc-om>
|
14
15
|
*/
|
15
16
|
var RightJS = {
|
16
|
-
version: "1.
|
17
|
+
version: "1.5.0",
|
17
18
|
modules: ["core", "form", "cookie", "xhr", "fx"]
|
18
19
|
};
|
19
20
|
|
@@ -156,15 +157,9 @@ function defined(value) {
|
|
156
157
|
* @return boolean check result
|
157
158
|
*/
|
158
159
|
function isHash(value) {
|
159
|
-
return typeof(value)
|
160
|
+
return typeof(value) === 'object' && value !== null && value.constructor === Object;
|
160
161
|
};
|
161
162
|
|
162
|
-
// Konqueror 3 patch
|
163
|
-
if (navigator.userAgent.indexOf('Konqueror/3') != -1) {
|
164
|
-
eval(isHash.toString().replace(';', '&&!(arguments[0] instanceof HTMLElement);'));
|
165
|
-
}
|
166
|
-
|
167
|
-
|
168
163
|
/**
|
169
164
|
* checks if the given value is a function
|
170
165
|
*
|
@@ -172,7 +167,7 @@ if (navigator.userAgent.indexOf('Konqueror/3') != -1) {
|
|
172
167
|
* @return boolean check result
|
173
168
|
*/
|
174
169
|
function isFunction(value) {
|
175
|
-
return typeof(value)
|
170
|
+
return typeof(value) === 'function';
|
176
171
|
};
|
177
172
|
|
178
173
|
/**
|
@@ -182,7 +177,7 @@ function isFunction(value) {
|
|
182
177
|
* @return boolean check result
|
183
178
|
*/
|
184
179
|
function isString(value) {
|
185
|
-
return typeof(value)
|
180
|
+
return typeof(value) === 'string';
|
186
181
|
};
|
187
182
|
|
188
183
|
/**
|
@@ -202,7 +197,7 @@ function isArray(value) {
|
|
202
197
|
* @return boolean check result
|
203
198
|
*/
|
204
199
|
function isNumber(value) {
|
205
|
-
return typeof(value)
|
200
|
+
return typeof(value) === 'number';
|
206
201
|
};
|
207
202
|
|
208
203
|
/**
|
@@ -234,12 +229,12 @@ function isNode(value) {
|
|
234
229
|
var $A = (function(slice) {
|
235
230
|
return function (it) {
|
236
231
|
try {
|
237
|
-
|
232
|
+
return slice.call(it);
|
238
233
|
} catch(e) {
|
239
234
|
for (var a=[], i=0, length = it.length; i < length; i++)
|
240
235
|
a[i] = it[i];
|
236
|
+
return a;
|
241
237
|
}
|
242
|
-
return a;
|
243
238
|
};
|
244
239
|
})(Array.prototype.slice);
|
245
240
|
|
@@ -261,8 +256,7 @@ function $E(tag_name, options) {
|
|
261
256
|
* @return Element or null
|
262
257
|
*/
|
263
258
|
function $(element) {
|
264
|
-
|
265
|
-
return Browser.OLD ? Element.prepare(element) : element;
|
259
|
+
return typeof(element) === 'string' ? document.getElementById(element) : element;
|
266
260
|
};
|
267
261
|
|
268
262
|
/**
|
@@ -291,13 +285,11 @@ function $w(string) {
|
|
291
285
|
* @param Object object
|
292
286
|
* @return Integer uniq id
|
293
287
|
*/
|
294
|
-
var $uid = (function() {
|
295
|
-
var _UID = 1;
|
296
|
-
|
288
|
+
var $uid = (function(UID) {
|
297
289
|
return function(item) {
|
298
|
-
return item.uid || (item.uid =
|
290
|
+
return item.uid || (item.uid = UID++);
|
299
291
|
};
|
300
|
-
})();
|
292
|
+
})(1);
|
301
293
|
|
302
294
|
|
303
295
|
/**
|
@@ -538,7 +530,7 @@ $ext(Array.prototype, (function(A_proto) {
|
|
538
530
|
|
539
531
|
if (isString(callback)) {
|
540
532
|
var attr = callback;
|
541
|
-
if (array.length && isFunction(array[0][attr])) {
|
533
|
+
if (array.length !== 0 && isFunction(array[0][attr])) {
|
542
534
|
callback = function(object) { return object[attr].apply(object, args); };
|
543
535
|
} else {
|
544
536
|
callback = function(object) { return object[attr]; };
|
@@ -733,10 +725,10 @@ return {
|
|
733
725
|
arg = arguments[i];
|
734
726
|
if (isArray(arg)) {
|
735
727
|
for (var j=0; j < arg.length; j++) {
|
736
|
-
if (copy.indexOf(arg[j])
|
728
|
+
if (copy.indexOf(arg[j]) === -1)
|
737
729
|
copy.push(arg[j]);
|
738
730
|
}
|
739
|
-
} else if (copy.indexOf(arg)
|
731
|
+
} else if (copy.indexOf(arg) === -1) {
|
740
732
|
copy.push(arg);
|
741
733
|
}
|
742
734
|
}
|
@@ -788,7 +780,7 @@ return {
|
|
788
780
|
*/
|
789
781
|
includes: function() {
|
790
782
|
for (var i=0, length = arguments.length; i < length; i++)
|
791
|
-
if (this.indexOf(arguments[i])
|
783
|
+
if (this.indexOf(arguments[i]) === -1)
|
792
784
|
return false;
|
793
785
|
return true;
|
794
786
|
},
|
@@ -926,7 +918,7 @@ $ext(String.prototype, {
|
|
926
918
|
*/
|
927
919
|
extractScripts: function() {
|
928
920
|
var scripts = '';
|
929
|
-
this.stripScripts(function(s
|
921
|
+
this.stripScripts(function(s) { scripts = s; });
|
930
922
|
return scripts;
|
931
923
|
},
|
932
924
|
|
@@ -980,7 +972,7 @@ $ext(String.prototype, {
|
|
980
972
|
* @return boolean check result
|
981
973
|
*/
|
982
974
|
includes: function(string) {
|
983
|
-
return this.indexOf(string)
|
975
|
+
return this.indexOf(string) !== -1;
|
984
976
|
},
|
985
977
|
|
986
978
|
/**
|
@@ -992,8 +984,8 @@ $ext(String.prototype, {
|
|
992
984
|
*/
|
993
985
|
startsWith: function(string, ignorecase) {
|
994
986
|
var start_str = this.substr(0, string.length);
|
995
|
-
return ignorecase ? start_str.toLowerCase()
|
996
|
-
start_str
|
987
|
+
return ignorecase ? start_str.toLowerCase() === string.toLowerCase() :
|
988
|
+
start_str === string;
|
997
989
|
},
|
998
990
|
|
999
991
|
/**
|
@@ -1005,8 +997,8 @@ $ext(String.prototype, {
|
|
1005
997
|
*/
|
1006
998
|
endsWith: function(string, ignorecase) {
|
1007
999
|
var end_str = this.substring(this.length - string.length);
|
1008
|
-
return ignorecase ? end_str.toLowerCase()
|
1009
|
-
end_str
|
1000
|
+
return ignorecase ? end_str.toLowerCase() === string.toLowerCase() :
|
1001
|
+
end_str === string;
|
1010
1002
|
},
|
1011
1003
|
|
1012
1004
|
/**
|
@@ -1040,7 +1032,11 @@ $alias(String.prototype, {include: 'includes'});
|
|
1040
1032
|
*
|
1041
1033
|
* Copyright (C) 2008 Nikolay V. Nemshilov aka St. <nemshilov#gma-il>
|
1042
1034
|
*/
|
1043
|
-
$ext(Function.prototype, {
|
1035
|
+
$ext(Function.prototype, (function() {
|
1036
|
+
// creating a local reference to the method for a faster access
|
1037
|
+
var _A = Array.prototype.slice;
|
1038
|
+
|
1039
|
+
return {
|
1044
1040
|
/**
|
1045
1041
|
* binds the function to be executed in the given scope
|
1046
1042
|
*
|
@@ -1050,14 +1046,14 @@ $ext(Function.prototype, {
|
|
1050
1046
|
* @return Function binded function
|
1051
1047
|
*/
|
1052
1048
|
bind: function() {
|
1053
|
-
if (arguments.length < 2 && !
|
1054
|
-
|
1055
|
-
var
|
1049
|
+
if (arguments.length < 2 && !arguments[0]) return this;
|
1050
|
+
|
1051
|
+
var slice = _A, args = slice.call(arguments), scope = args.shift(), func = this;
|
1056
1052
|
return function() {
|
1057
|
-
return
|
1053
|
+
return func.apply(scope, (args.length !== 0 || arguments.length !== 0) ? args.concat(slice.call(arguments)) : args);
|
1058
1054
|
};
|
1059
1055
|
},
|
1060
|
-
|
1056
|
+
|
1061
1057
|
/**
|
1062
1058
|
* binds the function as an event listener to the given scope object
|
1063
1059
|
*
|
@@ -1067,23 +1063,37 @@ $ext(Function.prototype, {
|
|
1067
1063
|
* @return Function binded function
|
1068
1064
|
*/
|
1069
1065
|
bindAsEventListener: function() {
|
1070
|
-
var
|
1066
|
+
var slice = _A, args = slice.call(arguments), scope = args.shift(), func = this;
|
1071
1067
|
return function(event) {
|
1072
|
-
return
|
1068
|
+
return func.apply(scope, [event || window.event].concat(args).concat(slice.call(arguments)));
|
1073
1069
|
};
|
1074
1070
|
},
|
1075
|
-
|
1071
|
+
|
1076
1072
|
/**
|
1077
1073
|
* allows you to put some curry in your cookery
|
1078
1074
|
*
|
1079
1075
|
* @param mixed value to curry
|
1080
1076
|
* ....
|
1081
|
-
* @return Function
|
1077
|
+
* @return Function curried function
|
1082
1078
|
*/
|
1083
1079
|
curry: function() {
|
1084
|
-
return this.bind.apply(this, [this].concat(
|
1080
|
+
return this.bind.apply(this, [this].concat(_A.call(arguments)));
|
1085
1081
|
},
|
1086
1082
|
|
1083
|
+
/**
|
1084
|
+
* The right side curry feature
|
1085
|
+
*
|
1086
|
+
* @param mixed value to curry
|
1087
|
+
* ....
|
1088
|
+
* @return Function curried function
|
1089
|
+
*/
|
1090
|
+
rcurry: function() {
|
1091
|
+
var curry = _A.call(arguments), func = this;
|
1092
|
+
return function() {
|
1093
|
+
return func.apply(func, _A.call(arguments).concat(curry));
|
1094
|
+
}
|
1095
|
+
},
|
1096
|
+
|
1087
1097
|
/**
|
1088
1098
|
* delays the function execution
|
1089
1099
|
*
|
@@ -1093,14 +1103,14 @@ $ext(Function.prototype, {
|
|
1093
1103
|
* @return Integer timeout marker
|
1094
1104
|
*/
|
1095
1105
|
delay: function() {
|
1096
|
-
var args =
|
1106
|
+
var args = _A.call(arguments), timeout = args.shift();
|
1097
1107
|
var timer = new Number(window.setTimeout(this.bind.apply(this, [this].concat(args)), timeout));
|
1098
|
-
|
1099
|
-
timer
|
1100
|
-
|
1108
|
+
|
1109
|
+
timer.cancel = function() { window.clearTimeout(this); };
|
1110
|
+
|
1101
1111
|
return timer;
|
1102
1112
|
},
|
1103
|
-
|
1113
|
+
|
1104
1114
|
/**
|
1105
1115
|
* creates a periodical execution of the function with the given timeout
|
1106
1116
|
*
|
@@ -1110,14 +1120,31 @@ $ext(Function.prototype, {
|
|
1110
1120
|
* @return Ineger interval marker
|
1111
1121
|
*/
|
1112
1122
|
periodical: function() {
|
1113
|
-
var args =
|
1123
|
+
var args = _A.call(arguments), timeout = args.shift();
|
1114
1124
|
var timer = new Number(window.setInterval(this.bind.apply(this, [this].concat(args)), timeout));
|
1115
|
-
|
1116
|
-
timer
|
1117
|
-
|
1125
|
+
|
1126
|
+
timer.stop = function() { window.clearInterval(this); };
|
1127
|
+
|
1118
1128
|
return timer;
|
1129
|
+
},
|
1130
|
+
|
1131
|
+
/**
|
1132
|
+
* Chains the given function after the current one
|
1133
|
+
*
|
1134
|
+
* @param Function the next function
|
1135
|
+
* @param mixed optional value to curry
|
1136
|
+
* ......
|
1137
|
+
* @return Function chained function
|
1138
|
+
*/
|
1139
|
+
chain: function() {
|
1140
|
+
var args = _A.call(arguments), func = args.shift(), current = this;
|
1141
|
+
return function() {
|
1142
|
+
var result = current.apply(current, arguments);
|
1143
|
+
func.apply(func, args);
|
1144
|
+
return result;
|
1145
|
+
};
|
1119
1146
|
}
|
1120
|
-
});
|
1147
|
+
}})());
|
1121
1148
|
|
1122
1149
|
/**
|
1123
1150
|
* The Number class extentions
|
@@ -1158,8 +1185,13 @@ $ext(Number.prototype, {
|
|
1158
1185
|
return Math.abs(this);
|
1159
1186
|
},
|
1160
1187
|
|
1161
|
-
round: function() {
|
1162
|
-
|
1188
|
+
round: function(base) {
|
1189
|
+
if (base) {
|
1190
|
+
var base = Math.pow(10, base);
|
1191
|
+
return Math.round(this * base) / base;
|
1192
|
+
} else {
|
1193
|
+
return Math.round(this);
|
1194
|
+
}
|
1163
1195
|
},
|
1164
1196
|
|
1165
1197
|
ceil: function() {
|
@@ -1205,102 +1237,94 @@ $ext(RegExp, {
|
|
1205
1237
|
*/
|
1206
1238
|
var Class = function() {
|
1207
1239
|
var args = $A(arguments), properties = args.pop() || {}, parent = args.pop();
|
1208
|
-
|
1240
|
+
|
1209
1241
|
// if only the parent class has been specified
|
1210
|
-
if (
|
1242
|
+
if (!args.length && !isHash(properties)) {
|
1211
1243
|
parent = properties; properties = {};
|
1212
1244
|
}
|
1213
|
-
|
1245
|
+
|
1214
1246
|
// basic class object definition
|
1215
1247
|
var klass = function() {
|
1216
1248
|
return this.initialize ? this.initialize.apply(this, arguments) : this;
|
1217
1249
|
};
|
1218
|
-
|
1250
|
+
|
1219
1251
|
// attaching main class-level methods
|
1220
|
-
$ext(klass, Class.Methods);
|
1221
|
-
|
1222
|
-
//
|
1223
|
-
|
1224
|
-
|
1225
|
-
|
1226
|
-
|
1227
|
-
|
1228
|
-
|
1229
|
-
|
1230
|
-
klass.include(properties);
|
1252
|
+
$ext(klass, Class.Methods).inherit(parent);
|
1253
|
+
|
1254
|
+
// catching the injections
|
1255
|
+
$w('extend include').each(function(name) {
|
1256
|
+
if (properties[name]) {
|
1257
|
+
var modules = properties[name];
|
1258
|
+
klass[name].apply(klass, isArray(modules) ? modules : [modules]);
|
1259
|
+
delete(properties[name]);
|
1260
|
+
}
|
1261
|
+
});
|
1231
1262
|
|
1232
|
-
return klass;
|
1263
|
+
return klass.include(properties);
|
1233
1264
|
};
|
1234
1265
|
|
1235
1266
|
/**
|
1236
|
-
* This
|
1267
|
+
* This method gets through a list of the object its class and all the ancestors
|
1268
|
+
* and finds a hash named after property, used for configuration purposes with
|
1269
|
+
* the Observer and Options modules
|
1237
1270
|
*
|
1238
|
-
*
|
1271
|
+
* NOTE: this method will look for capitalized and uppercased versions of the
|
1272
|
+
* property name
|
1273
|
+
*
|
1274
|
+
* @param Object a class instance
|
1275
|
+
* @param String property name
|
1276
|
+
* @return Object hash or null if nothing found
|
1277
|
+
*/
|
1278
|
+
Class.findSet = function(object, property) {
|
1279
|
+
var upcased = property.toUpperCase(), capcased = property.capitalize(),
|
1280
|
+
candidates = [object, object.constructor].concat(object.constructor.ancestors),
|
1281
|
+
holder = candidates.first(function(o) { return o[upcased] || o[capcased]});
|
1282
|
+
|
1283
|
+
return holder ? holder[upcased] || holder[capcased] : null;
|
1284
|
+
};
|
1285
|
+
|
1286
|
+
/**
|
1287
|
+
* This module contains the methods by which the Class instances
|
1288
|
+
* will be extended. It provides basic and standard way to work
|
1289
|
+
* with the classes.
|
1290
|
+
*
|
1291
|
+
* Copyright (C) 2008-2009 Nikolay V. Nemshilov aka St. <nemshilov#gma-ilc-om>
|
1239
1292
|
*/
|
1240
|
-
Class.
|
1293
|
+
Class.Methods = (function() {
|
1294
|
+
var commons = $w('selfExtended self_extended selfIncluded self_included');
|
1295
|
+
var extend = commons.concat($w('prototype parent extend include'));
|
1296
|
+
var include = commons.concat(['constructor']);
|
1297
|
+
|
1298
|
+
var clean_module = function(module, what) {
|
1299
|
+
return Object.without.apply(Object, [module].concat(what == 'e' ? extend : include));
|
1300
|
+
};
|
1301
|
+
|
1302
|
+
return {
|
1241
1303
|
/**
|
1242
|
-
*
|
1304
|
+
* Makes the class get inherited from another one
|
1243
1305
|
*
|
1244
|
-
* @param
|
1245
|
-
* @
|
1246
|
-
* @return void
|
1306
|
+
* @param Object another class
|
1307
|
+
* @return Class this
|
1247
1308
|
*/
|
1248
|
-
|
1249
|
-
|
1250
|
-
|
1309
|
+
inherit: function(parent) {
|
1310
|
+
// handling the parent class assign
|
1311
|
+
if (parent && parent.prototype) {
|
1251
1312
|
var s_klass = function() {};
|
1252
1313
|
s_klass.prototype = parent.prototype;
|
1253
|
-
|
1314
|
+
this.prototype = new s_klass;
|
1315
|
+
this.parent = parent;
|
1254
1316
|
}
|
1255
|
-
|
1256
|
-
|
1317
|
+
|
1318
|
+
// collecting the list of ancestors
|
1319
|
+
this.ancestors = [];
|
1257
1320
|
while (parent) {
|
1258
|
-
|
1321
|
+
this.ancestors.push(parent);
|
1259
1322
|
parent = parent.parent;
|
1260
1323
|
}
|
1261
|
-
},
|
1262
|
-
|
1263
|
-
/**
|
1264
|
-
* handles the inline extendings on class definitions
|
1265
|
-
*
|
1266
|
-
* @param Function class
|
1267
|
-
* @param Object user's properties
|
1268
|
-
* @return void
|
1269
|
-
*/
|
1270
|
-
catchExtends: function(klass, properties) {
|
1271
|
-
if (properties['extend']) {
|
1272
|
-
var exts = properties['extend'];
|
1273
|
-
|
1274
|
-
klass.extend.apply(klass, isArray(exts) ? exts : [exts]);
|
1275
|
-
delete(properties['extend']);
|
1276
|
-
}
|
1277
|
-
},
|
1278
|
-
|
1279
|
-
/**
|
1280
|
-
* handles the inline includes of the class definitions
|
1281
|
-
*
|
1282
|
-
* @param Function class
|
1283
|
-
* @param Object user's properties
|
1284
|
-
* @return void
|
1285
|
-
*/
|
1286
|
-
catchIncludes: function(klass, properties) {
|
1287
|
-
if (properties['include']) {
|
1288
|
-
var includes = properties['include'];
|
1289
1324
|
|
1290
|
-
|
1291
|
-
|
1292
|
-
}
|
1293
|
-
}
|
1294
|
-
};
|
1325
|
+
return this.prototype.constructor = this;
|
1326
|
+
},
|
1295
1327
|
|
1296
|
-
/**
|
1297
|
-
* This module contains the methods by which the Class instances
|
1298
|
-
* will be extended. It provides basic and standard way to work
|
1299
|
-
* with the classes.
|
1300
|
-
*
|
1301
|
-
* Copyright (C) 2008 Nikolay V. Nemshilov aka St. <nemshilov#gma-ilc-om>
|
1302
|
-
*/
|
1303
|
-
Class.Methods = {
|
1304
1328
|
/**
|
1305
1329
|
* this method will extend the class-level with the given objects
|
1306
1330
|
*
|
@@ -1316,20 +1340,17 @@ Class.Methods = {
|
|
1316
1340
|
* @return Class the klass
|
1317
1341
|
*/
|
1318
1342
|
extend: function() {
|
1319
|
-
|
1320
|
-
|
1321
|
-
|
1322
|
-
|
1323
|
-
|
1324
|
-
|
1325
|
-
|
1326
|
-
|
1327
|
-
}
|
1328
|
-
}
|
1329
|
-
|
1343
|
+
$A(arguments).filter(isHash).each(function(module) {
|
1344
|
+
var callback = module.selfExtended || module.self_extended;
|
1345
|
+
|
1346
|
+
$ext(this, clean_module(module, 'e'));
|
1347
|
+
|
1348
|
+
if (callback) callback.call(module, this);
|
1349
|
+
}, this);
|
1350
|
+
|
1330
1351
|
return this;
|
1331
1352
|
},
|
1332
|
-
|
1353
|
+
|
1333
1354
|
/**
|
1334
1355
|
* extends the class prototype with the given objects
|
1335
1356
|
* NOTE: this method _WILL_OVERWRITE_ the existing itercecting entries
|
@@ -1340,33 +1361,31 @@ Class.Methods = {
|
|
1340
1361
|
* @return Class the klass
|
1341
1362
|
*/
|
1342
1363
|
include: function() {
|
1343
|
-
|
1344
|
-
|
1345
|
-
|
1346
|
-
|
1347
|
-
|
1348
|
-
|
1349
|
-
|
1350
|
-
|
1351
|
-
|
1352
|
-
|
1353
|
-
|
1354
|
-
|
1355
|
-
|
1356
|
-
|
1357
|
-
|
1358
|
-
|
1359
|
-
|
1360
|
-
this.prototype[key] = arguments[i][key];
|
1361
|
-
}
|
1362
|
-
|
1363
|
-
}
|
1364
|
-
}
|
1364
|
+
var ancestors = this.ancestors.map('prototype'), ancestor;
|
1365
|
+
|
1366
|
+
$A(arguments).filter(isHash).each(function(module) {
|
1367
|
+
var callback = module.selfIncluded || module.self_included;
|
1368
|
+
module = clean_module(module, 'i');
|
1369
|
+
|
1370
|
+
for (var key in module) {
|
1371
|
+
ancestor = ancestors.first(function(proto) { return isFunction(proto[key]); });
|
1372
|
+
|
1373
|
+
this.prototype[key] = !ancestor ? module[key] :
|
1374
|
+
(function(name, method, super_method) {
|
1375
|
+
return function() {
|
1376
|
+
this.$super = super_method;
|
1377
|
+
|
1378
|
+
return method.apply(this, arguments);
|
1379
|
+
};
|
1380
|
+
})(key, module[key], ancestor[key]);
|
1365
1381
|
}
|
1366
|
-
|
1382
|
+
|
1383
|
+
if (callback) callback.call(module, this);
|
1384
|
+
}, this);
|
1385
|
+
|
1367
1386
|
return this;
|
1368
1387
|
}
|
1369
|
-
};
|
1388
|
+
}})();
|
1370
1389
|
|
1371
1390
|
/**
|
1372
1391
|
* This is a simple mix-in module to be included in other classes
|
@@ -1388,26 +1407,34 @@ var Options = {
|
|
1388
1407
|
* @return Object current instance
|
1389
1408
|
*/
|
1390
1409
|
setOptions: function(options) {
|
1391
|
-
var
|
1392
|
-
objects = [this, this.constructor].concat(this.constructor.ancestors),
|
1393
|
-
OPTIONS = objects.map(function(object) {
|
1394
|
-
return names.map(function(name) { return object[name]; });
|
1395
|
-
}).flatten().first(function(i) { return !!i; });
|
1396
|
-
|
1397
|
-
this.options = Object.merge({}, OPTIONS, options);
|
1410
|
+
var options = this.options = Object.merge(Class.findSet(this, 'options'), options);
|
1398
1411
|
|
1399
1412
|
// hooking up the observer options
|
1400
1413
|
if (isFunction(this.on)) {
|
1401
1414
|
var match;
|
1402
|
-
for (var key in
|
1403
|
-
if (match = key.match(/on([A-Z][
|
1404
|
-
this.on(match[1].toLowerCase(),
|
1405
|
-
delete(
|
1415
|
+
for (var key in options) {
|
1416
|
+
if (match = key.match(/on([A-Z][A-Za-z]+)/)) {
|
1417
|
+
this.on(match[1].toLowerCase(), options[key]);
|
1418
|
+
delete(options[key]);
|
1406
1419
|
}
|
1407
1420
|
}
|
1408
1421
|
}
|
1409
1422
|
|
1410
1423
|
return this;
|
1424
|
+
},
|
1425
|
+
|
1426
|
+
/**
|
1427
|
+
* Cuts of an options hash from the end of the arguments list
|
1428
|
+
* assigns them using the #setOptions method and then
|
1429
|
+
* returns the list of other arguments as an Array instance
|
1430
|
+
*
|
1431
|
+
* @param mixed iterable
|
1432
|
+
* @return Array of the arguments
|
1433
|
+
*/
|
1434
|
+
cutOptions: function(args) {
|
1435
|
+
var args = $A(args);
|
1436
|
+
this.setOptions(isHash(args.last()) ? args.pop() : {});
|
1437
|
+
return args;
|
1411
1438
|
}
|
1412
1439
|
};
|
1413
1440
|
|
@@ -1431,14 +1458,8 @@ var Observer = new Class({
|
|
1431
1458
|
* @param Object options
|
1432
1459
|
*/
|
1433
1460
|
initialize: function(options) {
|
1434
|
-
this.setOptions(options);
|
1435
|
-
|
1436
|
-
// catching up the event shortucts
|
1437
|
-
var ancestor, shorts = this.EVENTS || this.constructor.EVENTS ||
|
1438
|
-
((ancestor = this.constructor.ancestors.first('EVENTS')) ?
|
1439
|
-
ancestor.EVENTS : null);
|
1440
|
-
|
1441
|
-
Observer.createShortcuts(this, shorts);
|
1461
|
+
this.setOptions(options);
|
1462
|
+
Observer.createShortcuts(this, Class.findSet(this, 'events'));
|
1442
1463
|
},
|
1443
1464
|
|
1444
1465
|
/**
|
@@ -1452,9 +1473,33 @@ var Observer = new Class({
|
|
1452
1473
|
* @return Observer self
|
1453
1474
|
*/
|
1454
1475
|
observe: function() {
|
1455
|
-
var args =
|
1456
|
-
|
1457
|
-
if (
|
1476
|
+
var args = Array.prototype.slice.call(arguments), event = args.shift();
|
1477
|
+
|
1478
|
+
if (typeof(event) === 'string') {
|
1479
|
+
if (this.$listeners === undefined) this.$listeners = [];
|
1480
|
+
|
1481
|
+
var callback = args.shift();
|
1482
|
+
switch (typeof callback) {
|
1483
|
+
case "string":
|
1484
|
+
callback = this[callback];
|
1485
|
+
|
1486
|
+
case "function":
|
1487
|
+
var hash = { e: event, f: callback, a: args };
|
1488
|
+
this.$listeners.push(hash);
|
1489
|
+
break;
|
1490
|
+
|
1491
|
+
default:
|
1492
|
+
if (isArray(callback)) {
|
1493
|
+
callback.each(function(params) {
|
1494
|
+
this.observe.apply(this, [event].concat(
|
1495
|
+
isArray(params) ? params : [params]
|
1496
|
+
).concat(args));
|
1497
|
+
}, this);
|
1498
|
+
}
|
1499
|
+
}
|
1500
|
+
|
1501
|
+
} else {
|
1502
|
+
// assuming it's a hash of key-value pairs
|
1458
1503
|
for (var name in event) {
|
1459
1504
|
this.observe.apply(this, [name].concat(
|
1460
1505
|
isArray(event[name]) ? event[name] : [event[name]]
|
@@ -1462,30 +1507,7 @@ var Observer = new Class({
|
|
1462
1507
|
}
|
1463
1508
|
}
|
1464
1509
|
|
1465
|
-
if (!this.$listeners) this.$listeners = [];
|
1466
1510
|
|
1467
|
-
var callback = args.shift();
|
1468
|
-
switch (typeof callback) {
|
1469
|
-
case "string":
|
1470
|
-
callback = this[callback];
|
1471
|
-
|
1472
|
-
case "function":
|
1473
|
-
var hash = { e: event, f: callback, a: args };
|
1474
|
-
this.$listeners.push(hash);
|
1475
|
-
|
1476
|
-
if (this.$o && this.$o.add) this.$o.add.call(this, hash);
|
1477
|
-
|
1478
|
-
break;
|
1479
|
-
|
1480
|
-
default:
|
1481
|
-
if (isArray(callback)) {
|
1482
|
-
callback.each(function(params) {
|
1483
|
-
this.observe.apply(this, [event].concat(
|
1484
|
-
isArray(params) ? params : [params]
|
1485
|
-
).concat(args));
|
1486
|
-
}, this);
|
1487
|
-
}
|
1488
|
-
}
|
1489
1511
|
|
1490
1512
|
return this;
|
1491
1513
|
},
|
@@ -1530,12 +1552,8 @@ var Observer = new Class({
|
|
1530
1552
|
if (isString(callback)) callback = this[callback];
|
1531
1553
|
|
1532
1554
|
this.$listeners = this.$listeners.filter(function(i) {
|
1533
|
-
|
1534
|
-
(event ? i.e
|
1535
|
-
|
1536
|
-
if (!result && this.$o && this.$o.remove) this.$o.remove.call(this, i);
|
1537
|
-
|
1538
|
-
return result;
|
1555
|
+
return (event && callback) ? (i.e !== event || i.f !== callback) :
|
1556
|
+
(event ? i.e !== event : i.f !== callback);
|
1539
1557
|
}, this);
|
1540
1558
|
}
|
1541
1559
|
|
@@ -1553,7 +1571,7 @@ var Observer = new Class({
|
|
1553
1571
|
*/
|
1554
1572
|
listeners: function(event) {
|
1555
1573
|
return (this.$listeners || []).filter(function(i) {
|
1556
|
-
return !event || i.e
|
1574
|
+
return !event || i.e === event;
|
1557
1575
|
}).map(function(i) { return i.f; }).uniq();
|
1558
1576
|
},
|
1559
1577
|
|
@@ -1569,10 +1587,7 @@ var Observer = new Class({
|
|
1569
1587
|
var args = $A(arguments), event = args.shift();
|
1570
1588
|
|
1571
1589
|
(this.$listeners || []).each(function(i) {
|
1572
|
-
if (i.e
|
1573
|
-
(this.$o && this.$o.fire) ? this.$o.fire.call(this, event, args, i) :
|
1574
|
-
i.f.apply(this, i.a.concat(args));
|
1575
|
-
}
|
1590
|
+
if (i.e === event) i.f.apply(this, i.a.concat(args));
|
1576
1591
|
}, this);
|
1577
1592
|
|
1578
1593
|
return this;
|
@@ -1588,7 +1603,7 @@ var Observer = new Class({
|
|
1588
1603
|
*/
|
1589
1604
|
create: function(object, events) {
|
1590
1605
|
$ext(object, Object.without(this.prototype, 'initialize', 'setOptions'), true);
|
1591
|
-
return this.createShortcuts(object, events || object
|
1606
|
+
return this.createShortcuts(object, events || Class.findSet(object, 'events'));
|
1592
1607
|
},
|
1593
1608
|
|
1594
1609
|
/**
|
@@ -1690,8 +1705,8 @@ var Event = new Class(Event, {
|
|
1690
1705
|
*/
|
1691
1706
|
cleanName: function(name) {
|
1692
1707
|
name = name.toLowerCase();
|
1693
|
-
name = name.
|
1694
|
-
name = name
|
1708
|
+
name = name.substr(0,2) === 'on' ? name.slice(2) : name;
|
1709
|
+
name = name === 'rightclick' ? 'contextmenu' : name;
|
1695
1710
|
return name;
|
1696
1711
|
},
|
1697
1712
|
|
@@ -1702,8 +1717,8 @@ var Event = new Class(Event, {
|
|
1702
1717
|
* @return String real name
|
1703
1718
|
*/
|
1704
1719
|
realName: function(name) {
|
1705
|
-
if (Browser.Gecko && name
|
1706
|
-
if (Browser.Konqueror && name
|
1720
|
+
if (Browser.Gecko && name === 'mousewheel') name = 'DOMMouseScroll';
|
1721
|
+
if (Browser.Konqueror && name === 'contextmenu') name = 'rightclick';
|
1707
1722
|
return name;
|
1708
1723
|
},
|
1709
1724
|
|
@@ -1784,96 +1799,78 @@ Event.Custom = new Class({
|
|
1784
1799
|
/**
|
1785
1800
|
* The DOM Element unit handling
|
1786
1801
|
*
|
1787
|
-
* Credits:
|
1788
|
-
* The basic principles of the elements extending are originated from
|
1789
|
-
* - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson
|
1790
|
-
*
|
1791
1802
|
* Copyright (C) 2008-2009 Nikolay V. Nemshilov aka St. <nemshilov#gma-ilc-om>
|
1792
1803
|
*/
|
1793
|
-
|
1804
|
+
self.Element = (function(old_Element) {
|
1805
|
+
|
1806
|
+
var new_Element = function(tag, options) {
|
1807
|
+
var element = document.createElement(tag), options = options || {};
|
1808
|
+
|
1809
|
+
if (options.id) { element.id = options.id; delete(options.id); }
|
1810
|
+
if (options.html) { element.innerHTML = options.html; delete(options.html); }
|
1811
|
+
if (options['class']) { element.className = options['class']; delete(options['class']); }
|
1812
|
+
if (options.style) { element.setStyle(options.style); delete(options.style); }
|
1813
|
+
if (options.observe) { element.observe(options.observe); delete(options.observe); }
|
1814
|
+
|
1815
|
+
for (var key in options) // a filter in case there is no keys in the options left
|
1816
|
+
return element.set(options);
|
1817
|
+
return element;
|
1818
|
+
};
|
1819
|
+
|
1820
|
+
|
1821
|
+
if (Browser.IE) {
|
1822
|
+
//
|
1823
|
+
// IE browsers have a bug with checked input elements
|
1824
|
+
// and we kinda hacking the Element constructor so that
|
1825
|
+
// it affected IE browsers only
|
1826
|
+
//
|
1827
|
+
new_Element = eval('({f:'+new_Element.toString().replace(/(\((\w+), (\w+)\) \{)/,
|
1828
|
+
'$1if($2=="input"&&$3&&$3.checked)$2="<input checked=true/>";'
|
1829
|
+
)+'})').f;
|
1830
|
+
}
|
1831
|
+
|
1832
|
+
// connecting the old Element instance to the new one for IE browsers
|
1833
|
+
if (old_Element) {
|
1834
|
+
$ext(new_Element, old_Element);
|
1835
|
+
new_Element.parent = old_Element;
|
1836
|
+
}
|
1837
|
+
|
1838
|
+
return new_Element;
|
1839
|
+
})(self.Element);
|
1840
|
+
|
1841
|
+
|
1842
|
+
$ext(Element, {
|
1794
1843
|
/**
|
1795
|
-
*
|
1844
|
+
* registeres the methods on the custom element methods list
|
1845
|
+
* will add them to prototype and will generate a non extensive static mirror
|
1846
|
+
*
|
1847
|
+
* USAGE:
|
1848
|
+
* Element.addMethods({
|
1849
|
+
* foo: function(bar) {}
|
1850
|
+
* });
|
1796
1851
|
*
|
1797
|
-
*
|
1798
|
-
*
|
1799
|
-
*
|
1852
|
+
* $(element).foo(bar);
|
1853
|
+
* Element.foo(element, bar);
|
1854
|
+
*
|
1855
|
+
* @param Object new methods list
|
1856
|
+
* @param Boolean flag if the method should keep the existing methods alive
|
1857
|
+
* @return Element the global Element object
|
1800
1858
|
*/
|
1801
|
-
|
1802
|
-
|
1803
|
-
tag_name = '<input checked="true"/>';
|
1804
|
-
}
|
1859
|
+
addMethods: function(methods, dont_overwrite) {
|
1860
|
+
$ext(this.Methods, methods, dont_overwrite);
|
1805
1861
|
|
1806
|
-
|
1807
|
-
|
1808
|
-
|
1809
|
-
|
1810
|
-
|
1811
|
-
|
1862
|
+
try { // busting up the basic element prototypes
|
1863
|
+
$ext(HTMLElement.prototype, methods, dont_overwrite);
|
1864
|
+
} catch(e) {
|
1865
|
+
try { // IE8 native element extension
|
1866
|
+
$ext(this.parent.prototype, methods, dont_overwrite);
|
1867
|
+
} catch(e) {}
|
1868
|
+
}
|
1812
1869
|
|
1813
|
-
return
|
1870
|
+
return this;
|
1814
1871
|
},
|
1815
1872
|
|
1816
|
-
|
1817
|
-
Methods: {}, // DO NOT Extend this object manually unless you need it, use Element#addMethods
|
1818
|
-
|
1819
|
-
/**
|
1820
|
-
* IE browsers manual elements extending
|
1821
|
-
*
|
1822
|
-
* @param Element
|
1823
|
-
* @return Element
|
1824
|
-
*/
|
1825
|
-
prepare: function(element) {
|
1826
|
-
if (element && element.tagName && !element.set) {
|
1827
|
-
$ext(element, Element.Methods, true);
|
1828
|
-
|
1829
|
-
if (self['Form']) {
|
1830
|
-
switch(element.tagName) {
|
1831
|
-
case 'FORM':
|
1832
|
-
Form.ext(element);
|
1833
|
-
break;
|
1834
|
-
|
1835
|
-
case 'INPUT':
|
1836
|
-
case 'SELECT':
|
1837
|
-
case 'BUTTON':
|
1838
|
-
case 'TEXTAREA':
|
1839
|
-
Form.Element.ext(element);
|
1840
|
-
break;
|
1841
|
-
}
|
1842
|
-
}
|
1843
|
-
}
|
1844
|
-
return element;
|
1845
|
-
},
|
1846
|
-
|
1847
|
-
/**
|
1848
|
-
* registeres the methods on the custom element methods list
|
1849
|
-
* will add them to prototype and will generate a non extensive static mirror
|
1850
|
-
*
|
1851
|
-
* USAGE:
|
1852
|
-
* Element.addMethods({
|
1853
|
-
* foo: function(bar) {}
|
1854
|
-
* });
|
1855
|
-
*
|
1856
|
-
* $(element).foo(bar);
|
1857
|
-
* Element.foo(element, bar);
|
1858
|
-
*
|
1859
|
-
* @param Object new methods list
|
1860
|
-
* @param Boolean flag if the method should keep the existing methods alive
|
1861
|
-
* @return Element the global Element object
|
1862
|
-
*/
|
1863
|
-
addMethods: function(methods, dont_overwrite) {
|
1864
|
-
$ext(this.Methods, methods, dont_overwrite);
|
1865
|
-
|
1866
|
-
try { // busting up the basic element prototypes
|
1867
|
-
$ext(HTMLElement.prototype, methods, dont_overwrite);
|
1868
|
-
} catch(e) {
|
1869
|
-
try { // IE8 native element extension
|
1870
|
-
$ext(this.parent.prototype, methods, dont_overwrite);
|
1871
|
-
} catch(e) {}
|
1872
|
-
}
|
1873
|
-
|
1874
|
-
return this;
|
1875
|
-
}
|
1876
|
-
}
|
1873
|
+
Methods: {} // DO NOT Extend this object manually unless you really need it, use Element#addMethods
|
1877
1874
|
});
|
1878
1875
|
|
1879
1876
|
/**
|
@@ -1929,14 +1926,6 @@ Element.addMethods({
|
|
1929
1926
|
return this.prevSiblings(css_rule).first();
|
1930
1927
|
},
|
1931
1928
|
|
1932
|
-
// those two are moved to the Selector unit definition
|
1933
|
-
// first: Element.Methods.querySelector,
|
1934
|
-
// select: Element.Methods.querySelectorAll,
|
1935
|
-
|
1936
|
-
match: function(css_rule) {
|
1937
|
-
return new Selector(css_rule).match(this);
|
1938
|
-
},
|
1939
|
-
|
1940
1929
|
/**
|
1941
1930
|
* removes the elemnt out of this parent node
|
1942
1931
|
*
|
@@ -1973,7 +1962,7 @@ Element.addMethods({
|
|
1973
1962
|
position = isString(position) ? position.toLowerCase() : 'bottom';
|
1974
1963
|
|
1975
1964
|
if (isString(content)) {
|
1976
|
-
content = content.stripScripts(function(s
|
1965
|
+
content = content.stripScripts(function(s) { scripts = s; });
|
1977
1966
|
}
|
1978
1967
|
|
1979
1968
|
Element.insertions[position](this, content.tagName ? content :
|
@@ -1982,11 +1971,18 @@ Element.addMethods({
|
|
1982
1971
|
this : this.parentNode, content
|
1983
1972
|
)
|
1984
1973
|
);
|
1985
|
-
$eval(scripts);
|
1974
|
+
if (scripts) $eval(scripts);
|
1986
1975
|
}
|
1987
1976
|
return this;
|
1988
1977
|
},
|
1989
1978
|
|
1979
|
+
/**
|
1980
|
+
* Inserts the element inside the given one at the given position
|
1981
|
+
*
|
1982
|
+
* @param mixed destination element reference
|
1983
|
+
* @param String optional position
|
1984
|
+
* @return Element this
|
1985
|
+
*/
|
1990
1986
|
insertTo: function(element, position) {
|
1991
1987
|
$(element).insert(this, position);
|
1992
1988
|
return this;
|
@@ -2010,8 +2006,9 @@ Element.addMethods({
|
|
2010
2006
|
*/
|
2011
2007
|
update: function(content) {
|
2012
2008
|
if (isString(content)) {
|
2013
|
-
|
2014
|
-
content.
|
2009
|
+
var scripts = '';
|
2010
|
+
this.innerHTML = content.stripScripts(function(s) { scripts = s; });
|
2011
|
+
if (scripts) $eval(scripts);
|
2015
2012
|
} else {
|
2016
2013
|
this.clean().insert(content);
|
2017
2014
|
}
|
@@ -2062,15 +2059,15 @@ Element.addMethods({
|
|
2062
2059
|
* @return Array found elements
|
2063
2060
|
*/
|
2064
2061
|
rCollect: function(attr, css_rule) {
|
2065
|
-
var node = this,
|
2062
|
+
var node = this, result = [];
|
2066
2063
|
|
2067
2064
|
while ((node = node[attr])) {
|
2068
|
-
if (node.tagName && (!css_rule ||
|
2069
|
-
|
2065
|
+
if (node.tagName && (!css_rule || $(node).match(css_rule))) {
|
2066
|
+
result.push(node);
|
2070
2067
|
}
|
2071
2068
|
}
|
2072
|
-
|
2073
|
-
return
|
2069
|
+
if (Browser.OLD) result.forEach(Element.prepare);
|
2070
|
+
return result;
|
2074
2071
|
}
|
2075
2072
|
});
|
2076
2073
|
|
@@ -2191,9 +2188,9 @@ Element.addMethods({
|
|
2191
2188
|
for (var key in hash) {
|
2192
2189
|
c_key = key.indexOf('-') != -1 ? key.camelize() : key;
|
2193
2190
|
|
2194
|
-
if (key
|
2191
|
+
if (key === 'opacity') {
|
2195
2192
|
this.setOpacity(hash[key]);
|
2196
|
-
} else if (key
|
2193
|
+
} else if (key === 'float') {
|
2197
2194
|
c_key = Browser.IE ? 'styleFloat' : 'cssFloat';
|
2198
2195
|
}
|
2199
2196
|
|
@@ -2209,13 +2206,11 @@ Element.addMethods({
|
|
2209
2206
|
* @param Float opacity value between 0 and 1
|
2210
2207
|
* @return Element self
|
2211
2208
|
*/
|
2212
|
-
setOpacity: function(value) {
|
2213
|
-
|
2214
|
-
|
2215
|
-
|
2216
|
-
|
2217
|
-
}
|
2218
|
-
this.style[key] = value;
|
2209
|
+
setOpacity: Browser.IE ? function(value) {
|
2210
|
+
this.style.filter = 'alpha(opacity='+ value * 100 +')';
|
2211
|
+
return this;
|
2212
|
+
} : function(value) {
|
2213
|
+
this.style.opacity = value;
|
2219
2214
|
return this;
|
2220
2215
|
},
|
2221
2216
|
|
@@ -2248,30 +2243,18 @@ Element.addMethods({
|
|
2248
2243
|
switch (key) {
|
2249
2244
|
case 'opacity':
|
2250
2245
|
value = !Browser.IE ? style[key] :
|
2251
|
-
((
|
2246
|
+
((/opacity=(\d+)/i.exec(style.filter || '') || ['', '100'])[1].toInt() / 100)+'';
|
2252
2247
|
break;
|
2253
2248
|
|
2254
2249
|
case 'float':
|
2255
|
-
key
|
2250
|
+
key = Browser.IE ? 'styleFloat' : 'cssFloat';
|
2256
2251
|
|
2257
2252
|
default:
|
2258
|
-
|
2259
|
-
value = style[key];
|
2260
|
-
} else {
|
2261
|
-
var values = $w('top right bottom left').map(function(name) {
|
2262
|
-
var tokens = key.underscored().split('_'); tokens.splice(1, 0, name);
|
2263
|
-
return style[tokens.join('_').camelize()];
|
2264
|
-
}).uniq();
|
2265
|
-
|
2266
|
-
if (values.length == 1) {
|
2267
|
-
value = values[0];
|
2268
|
-
}
|
2269
|
-
}
|
2253
|
+
value = style[key];
|
2270
2254
|
|
2271
2255
|
// Opera returns named colors with quotes
|
2272
|
-
if (
|
2273
|
-
|
2274
|
-
value = match ? match[1] : value;
|
2256
|
+
if (Browser.Opera && /color/i.test(key) && value) {
|
2257
|
+
value = value.replace(/"/g, '');
|
2275
2258
|
}
|
2276
2259
|
}
|
2277
2260
|
|
@@ -2285,7 +2268,7 @@ Element.addMethods({
|
|
2285
2268
|
* @return boolean check result
|
2286
2269
|
*/
|
2287
2270
|
hasClass: function(name) {
|
2288
|
-
return (' '+this.className+' ').indexOf(' '+name+' ')
|
2271
|
+
return (' '+this.className+' ').indexOf(' '+name+' ') !== -1;
|
2289
2272
|
},
|
2290
2273
|
|
2291
2274
|
/**
|
@@ -2306,8 +2289,9 @@ Element.addMethods({
|
|
2306
2289
|
* @return Element self
|
2307
2290
|
*/
|
2308
2291
|
addClass: function(name) {
|
2309
|
-
|
2310
|
-
|
2292
|
+
var testee = ' '+this.className+' ';
|
2293
|
+
if (testee.indexOf(' '+name+' ') === -1) {
|
2294
|
+
this.className += (testee === ' ' ? '' : ' ') + name;
|
2311
2295
|
}
|
2312
2296
|
return this;
|
2313
2297
|
},
|
@@ -2365,9 +2349,14 @@ Element.addMethods({
|
|
2365
2349
|
*/
|
2366
2350
|
set: function(hash, value) {
|
2367
2351
|
if (value) { var val = {}; val[hash] = value; hash = val; }
|
2368
|
-
|
2369
|
-
for (var key in hash)
|
2352
|
+
|
2353
|
+
for (var key in hash) {
|
2354
|
+
// some attributes are not available as properties
|
2355
|
+
if (this[key] === undefined) {
|
2356
|
+
this.setAttribute(key, ''+hash[key]);
|
2357
|
+
}
|
2370
2358
|
this[key] = hash[key];
|
2359
|
+
}
|
2371
2360
|
|
2372
2361
|
return this;
|
2373
2362
|
},
|
@@ -2379,7 +2368,7 @@ Element.addMethods({
|
|
2379
2368
|
* @return mixed value
|
2380
2369
|
*/
|
2381
2370
|
get: function(name) {
|
2382
|
-
var value = this
|
2371
|
+
var value = this[name] || this.getAttribute(name);
|
2383
2372
|
return value == '' ? null : value;
|
2384
2373
|
},
|
2385
2374
|
|
@@ -2482,16 +2471,36 @@ Element.addMethods({
|
|
2482
2471
|
* Copyright (C) 2008-2009 Nikolay V. Nemshilov aka St. <nemshilov#gma-il>
|
2483
2472
|
*/
|
2484
2473
|
Element.addMethods({
|
2485
|
-
|
2474
|
+
/**
|
2475
|
+
* Returns the element sizes as a hash
|
2476
|
+
*
|
2477
|
+
* @return Object {x: NNN, y: NNN}
|
2478
|
+
*/
|
2486
2479
|
sizes: function() {
|
2487
2480
|
return { x: this.offsetWidth, y: this.offsetHeight };
|
2488
2481
|
},
|
2489
2482
|
|
2483
|
+
/**
|
2484
|
+
* Returns the element absolute position
|
2485
|
+
*
|
2486
|
+
* NOTE: see the konq.js file for the manual version of the method
|
2487
|
+
*
|
2488
|
+
* @return Object {x: NNN, y: NNN}
|
2489
|
+
*/
|
2490
2490
|
position: function() {
|
2491
|
-
var
|
2492
|
-
|
2491
|
+
var rect = this.getBoundingClientRect(), doc = this.ownerDocument.documentElement, scrolls = window.scrolls();
|
2492
|
+
|
2493
|
+
return {
|
2494
|
+
x: rect.left + scrolls.x - doc.clientLeft,
|
2495
|
+
y: rect.top + scrolls.y - doc.clientTop
|
2496
|
+
};
|
2493
2497
|
},
|
2494
2498
|
|
2499
|
+
/**
|
2500
|
+
* Returns the element scrolls
|
2501
|
+
*
|
2502
|
+
* @return Object {x: NNN, y: NNN}
|
2503
|
+
*/
|
2495
2504
|
scrolls: function() {
|
2496
2505
|
return { x: this.scrollLeft, y: this.scrollTop };
|
2497
2506
|
},
|
@@ -2502,33 +2511,17 @@ Element.addMethods({
|
|
2502
2511
|
* @return Object dimensions (top, left, width, height, scrollLeft, scrollTop)
|
2503
2512
|
*/
|
2504
2513
|
dimensions: function() {
|
2505
|
-
var
|
2506
|
-
|
2507
|
-
|
2508
|
-
var rect = this.getBoundingClientRect(), doc = this.ownerDocument.documentElement, scrolls = window.scrolls();
|
2509
|
-
|
2510
|
-
left = rect.left + scrolls.x - doc.clientLeft;
|
2511
|
-
top = rect.top + scrolls.y - doc.clientTop;
|
2512
|
-
} else {
|
2513
|
-
// Manual version
|
2514
|
-
left = this.offsetLeft;
|
2515
|
-
top = this.offsetTop;
|
2516
|
-
|
2517
|
-
if (this.getStyle('position') != 'absolute') {
|
2518
|
-
var body = this.ownerDocument.body, html = body.parentNode;
|
2519
|
-
|
2520
|
-
left += body.offsetLeft + html.offsetLeft;
|
2521
|
-
top += body.offsetTop + html.offsetTop;
|
2522
|
-
}
|
2523
|
-
}
|
2514
|
+
var sizes = this.sizes();
|
2515
|
+
var scrolls = this.scrolls();
|
2516
|
+
var position = this.position();
|
2524
2517
|
|
2525
2518
|
return {
|
2526
|
-
top:
|
2527
|
-
left:
|
2528
|
-
width:
|
2529
|
-
height:
|
2530
|
-
scrollLeft:
|
2531
|
-
scrollTop:
|
2519
|
+
top: position.y,
|
2520
|
+
left: position.x,
|
2521
|
+
width: sizes.x,
|
2522
|
+
height: sizes.y,
|
2523
|
+
scrollLeft: scrolls.x,
|
2524
|
+
scrollTop: scrolls.y
|
2532
2525
|
};
|
2533
2526
|
},
|
2534
2527
|
|
@@ -2641,38 +2634,41 @@ Element.addMethods((function() {
|
|
2641
2634
|
$w('click rightclick contextmenu mousedown mouseup mouseover mouseout mousemove keypress keydown keyup')
|
2642
2635
|
);
|
2643
2636
|
|
2644
|
-
|
2645
|
-
|
2646
|
-
|
2647
|
-
|
2648
|
-
|
2637
|
+
//
|
2638
|
+
// HACK HACK HACK
|
2639
|
+
//
|
2640
|
+
// I'm kinda patching the observer methods manually in here
|
2641
|
+
// the reason is in building flat and fast functions
|
2642
|
+
//
|
2643
|
+
observer.observe = observer.on = eval('({f:'+
|
2644
|
+
observer.observe.toString().replace(/(\$listeners\.push\((\w+?)\);)/, '$1'+
|
2645
|
+
'$2.e=Event.cleanName($2.e);$2.n=Event.realName($2.e);'+
|
2649
2646
|
|
2650
|
-
|
2651
|
-
|
2652
|
-
return callback.apply(this, $A(arguments).concat(args));
|
2653
|
-
};
|
2647
|
+
'$2.w=function(){Event.ext(arguments[0]);'+
|
2648
|
+
'return $2.f.apply(this,$A(arguments).concat($2.a));};'+(
|
2654
2649
|
|
2655
|
-
|
2656
|
-
this.
|
2657
|
-
|
2658
|
-
|
2659
|
-
|
2660
|
-
|
2661
|
-
|
2662
|
-
|
2663
|
-
|
2664
|
-
|
2665
|
-
|
2666
|
-
|
2667
|
-
this.
|
2668
|
-
|
2669
|
-
|
2670
|
-
|
2671
|
-
|
2672
|
-
|
2673
|
-
|
2674
|
-
|
2675
|
-
|
2650
|
+
self.attachEvent ?
|
2651
|
+
'$2.w=$2.w.bind(this);this.attachEvent("on"+$2.n,$2.w);' :
|
2652
|
+
'this.addEventListener($2.n,$2.w,false);'
|
2653
|
+
)
|
2654
|
+
)+
|
2655
|
+
'})').f;
|
2656
|
+
|
2657
|
+
observer.stopObserving = eval('({f:'+
|
2658
|
+
observer.stopObserving.toString().replace(/(function\s*\((\w+)\)\s*\{\s*)(return\s*)([^}]+)/m,
|
2659
|
+
'$1var r=$4;'+
|
2660
|
+
'if(!r)' + (self.attachEvent ?
|
2661
|
+
'this.detachEvent("on"+$2.n,$2.w);' :
|
2662
|
+
'this.removeEventListener($2.n,$2.w,false);'
|
2663
|
+
)+'$3 r')+
|
2664
|
+
'})').f;
|
2665
|
+
|
2666
|
+
|
2667
|
+
observer.fire = eval('({f:'+
|
2668
|
+
observer.fire.toString().replace(/(\w+)\.f\.apply.*?\.concat\((\w+)\)[^}]/,
|
2669
|
+
'$1.f.apply(this,[new Event($1.e,$2.shift())].concat($1.a).concat($2))'
|
2670
|
+
)+
|
2671
|
+
'})').f;
|
2676
2672
|
|
2677
2673
|
// a simple events terminator method to be hooked like
|
2678
2674
|
// this.onClick('stopEvent');
|
@@ -2686,599 +2682,76 @@ Element.addMethods((function() {
|
|
2686
2682
|
|
2687
2683
|
|
2688
2684
|
/**
|
2689
|
-
* The DOM elements selection handling
|
2685
|
+
* The DOM elements selection handling
|
2690
2686
|
*
|
2691
|
-
*
|
2692
|
-
*
|
2693
|
-
* - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson
|
2687
|
+
* NOTE: this module is just a wrap over the native CSS-selectors feature
|
2688
|
+
* see the olds/css.js file for the manual selector code
|
2694
2689
|
*
|
2695
2690
|
* Copyright (C) 2008-2009 Nikolay V. Nemshilov aka St. <nemshilov#gma-ilc-om>
|
2696
2691
|
*/
|
2697
|
-
|
2698
|
-
// checking, monkeying and hooking the native css-selectors interface
|
2699
|
-
// IE8 W3C
|
2700
|
-
[document, (Element.parent || self['HTMLElement'] || {}.constructor).prototype].each(function(object, i) {
|
2701
|
-
var old_selector = object.querySelector;
|
2702
|
-
var old_selector_all = object.querySelectorAll;
|
2703
|
-
|
2704
|
-
// the native selectors checking/monkeying
|
2705
|
-
var selectors = {};
|
2706
|
-
if (!old_selector) selectors.querySelector = function(css_rule) {
|
2707
|
-
return new Selector(css_rule).first(this);
|
2708
|
-
};
|
2709
|
-
if (!old_selector_all) selectors.querySelectorAll = function(css_rule) {
|
2710
|
-
return new Selector(css_rule).select(this);
|
2711
|
-
};
|
2712
|
-
|
2713
|
-
// RightJS version of the selectors
|
2714
|
-
selectors.first = old_selector ? i ? function(css_rule) {
|
2715
|
-
return this.querySelector(this.tagName + ' ' + (css_rule || '*'));
|
2716
|
-
} : function(css_rule) {
|
2717
|
-
return this.querySelector(css_rule || '*');
|
2718
|
-
} : selectors.querySelector;
|
2719
|
-
|
2720
|
-
selectors.select = old_selector_all ? i ? function(css_rule) {
|
2721
|
-
return $A(this.querySelectorAll(this.tagName + ' ' + (css_rule || '*')));
|
2722
|
-
} : function(css_rule) {
|
2723
|
-
return $A(this.querySelectorAll(css_rule || '*'));
|
2724
|
-
} : selectors.querySelectorAll;
|
2725
|
-
|
2726
|
-
return i ? Element.addMethods(selectors) : $ext(object, selectors);
|
2727
|
-
});
|
2728
|
-
|
2729
|
-
|
2730
|
-
var Selector = new Class({
|
2731
|
-
extend: {
|
2732
|
-
cache: {}
|
2733
|
-
},
|
2734
|
-
|
2692
|
+
Element.addMethods((function() {
|
2735
2693
|
/**
|
2736
|
-
*
|
2737
|
-
*
|
2738
|
-
*
|
2739
|
-
* @return void
|
2694
|
+
* Native css-selectors include the current element into the search context
|
2695
|
+
* and as we actually search only inside of the element we add it's tag
|
2696
|
+
* as a scope for the search
|
2740
2697
|
*/
|
2741
|
-
|
2742
|
-
|
2743
|
-
|
2744
|
-
Selector.cache[css_rule] = this;
|
2745
|
-
|
2746
|
-
this.cssRule = css_rule || '*';
|
2747
|
-
|
2748
|
-
var strategy = 'Manual';
|
2749
|
-
if (this.cssRule.includes(',')) {
|
2750
|
-
strategy = 'Multiple';
|
2751
|
-
}
|
2752
|
-
|
2753
|
-
this.strategy = new Selector[strategy](this.cssRule);
|
2754
|
-
},
|
2698
|
+
var stub_rule = function(css_rule, tag) {
|
2699
|
+
return css_rule ? css_rule.replace(/(^|,)/g, '$1'+ tag + ' ') : '*';
|
2700
|
+
};
|
2755
2701
|
|
2702
|
+
return {
|
2756
2703
|
/**
|
2757
|
-
*
|
2758
|
-
*
|
2704
|
+
* Extracts the first element matching the css-rule,
|
2705
|
+
* or just any first element if no css-rule was specified
|
2759
2706
|
*
|
2760
|
-
* @param
|
2761
|
-
* @return Element matching
|
2707
|
+
* @param String css-rule
|
2708
|
+
* @return Element matching node or null
|
2762
2709
|
*/
|
2763
|
-
first:
|
2764
|
-
|
2765
|
-
return element ? $(element) : null;
|
2766
|
-
} : function(element) {
|
2767
|
-
return this.strategy.first(element);
|
2710
|
+
first: function(css_rule) {
|
2711
|
+
return this.querySelector(stub_rule(css_rule, this.tagName));
|
2768
2712
|
},
|
2769
2713
|
|
2770
2714
|
/**
|
2771
|
-
*
|
2715
|
+
* Selects a list of matching nodes, or all the descendant nodes if no css-rule provided
|
2772
2716
|
*
|
2773
|
-
* @param
|
2774
|
-
* @return Array
|
2717
|
+
* @param String css-rule
|
2718
|
+
* @return Array of elements
|
2775
2719
|
*/
|
2776
|
-
select:
|
2777
|
-
return this.
|
2778
|
-
} : function(element) {
|
2779
|
-
return this.strategy.select(element);
|
2720
|
+
select: function(css_rule) {
|
2721
|
+
return $A(this.querySelectorAll(stub_rule(css_rule, this.tagName)));
|
2780
2722
|
},
|
2781
2723
|
|
2782
2724
|
/**
|
2783
|
-
* checks if the element matches
|
2725
|
+
* checks if the element matches this css-rule
|
2784
2726
|
*
|
2785
|
-
* @param
|
2786
|
-
* @return Boolean check result
|
2787
|
-
*/
|
2788
|
-
match: function(element) {
|
2789
|
-
return this.strategy.match(element);
|
2790
|
-
}
|
2791
|
-
});
|
2792
|
-
|
2793
|
-
|
2794
|
-
/**
|
2795
|
-
* this class represent a simple css-definition atom unit
|
2796
|
-
*
|
2797
|
-
* the main purpose is to organize the simpliest case of css-rule match for the manual matcher.
|
2798
|
-
*
|
2799
|
-
* Credits:
|
2800
|
-
* Some functionality and principles are inspired by css-selectors in
|
2801
|
-
* - MooTools (http://mootools.net) Copyright (C) Valerio Proietti
|
2802
|
-
*
|
2803
|
-
* Copyright (C) 2008-2009 Nikolay V. Nemshilov aka St. <nemshilov#gma-ilc-om>
|
2804
|
-
*/
|
2805
|
-
Selector.Atom = new Class({
|
2806
|
-
id: null,
|
2807
|
-
tag: '*',
|
2808
|
-
classes: [],
|
2809
|
-
pseudo: null,
|
2810
|
-
pseudoValue: null,
|
2811
|
-
attrs: {},
|
2812
|
-
|
2813
|
-
rel: ' ', // relations with the previous atom
|
2814
|
-
|
2815
|
-
ID_RE: /#([\w\-_]+)/,
|
2816
|
-
TAG_RE: /^[\w\*]+/,
|
2817
|
-
CLASS_RE: /\.([\w\-\._]+)/,
|
2818
|
-
PSEUDO_RE: /:([\w\-]+)(\((.+?)\))*$/,
|
2819
|
-
ATTRS_RE: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/,
|
2820
|
-
|
2821
|
-
/**
|
2822
|
-
* constructor
|
2823
|
-
*
|
2824
|
-
* @param String css-definition
|
2825
|
-
* @param String relation with the previous atom
|
2826
|
-
* @return void
|
2827
|
-
*/
|
2828
|
-
initialize: function(css_rule, rel) {
|
2829
|
-
css_rule = css_rule.trim();
|
2830
|
-
this.rel = rel || ' ';
|
2831
|
-
this.hasNonTagMatcher = !/^[a-z\*]+$/.test(css_rule);
|
2832
|
-
|
2833
|
-
// NOTE! dont change the order of the atom parsing, there might be collisions
|
2834
|
-
this.attrs = {};
|
2835
|
-
while((m = css_rule.match(this.ATTRS_RE))) {
|
2836
|
-
this.attrs[m[1]] = { op: m[2], value: m[5] || m[6] };
|
2837
|
-
css_rule = css_rule.replace(m[0], '');
|
2838
|
-
}
|
2839
|
-
|
2840
|
-
if ((m = css_rule.match(this.PSEUDO_RE))) {
|
2841
|
-
this.pseudo = m[1];
|
2842
|
-
this.pseudoValue = m[3] == '' ? null : m[3];
|
2843
|
-
css_rule = css_rule.replace(m[0], '');
|
2844
|
-
} else {
|
2845
|
-
this.pseudo = null;
|
2846
|
-
this.pseudoValue = null;
|
2847
|
-
}
|
2848
|
-
|
2849
|
-
this.id = (css_rule.match(this.ID_RE) || [1, null])[1];
|
2850
|
-
this.tag = (css_rule.match(this.TAG_RE) || '*').toString().toUpperCase();
|
2851
|
-
this.classes = (css_rule.match(this.CLASS_RE) || [1, ''])[1].split('.').without('');
|
2852
|
-
|
2853
|
-
this.buildMatch();
|
2854
|
-
},
|
2855
|
-
|
2856
|
-
/**
|
2857
|
-
* cecks if the node matches the atom
|
2858
|
-
*
|
2859
|
-
* @param Element element
|
2727
|
+
* @param String css-rule
|
2860
2728
|
* @return Boolean check result
|
2861
2729
|
*/
|
2862
|
-
match:
|
2863
|
-
|
2864
|
-
// protected
|
2865
|
-
|
2866
|
-
// building the match method for the particular case
|
2867
|
-
buildMatch: function() {
|
2868
|
-
var matchers = [];
|
2869
|
-
|
2870
|
-
if (this.id) matchers.push('matchId');
|
2871
|
-
if (this.tag != '*') matchers.push('matchTag');
|
2872
|
-
if (this.classes.length) matchers.push('matchClass');
|
2873
|
-
if (!Object.empty(this.attrs)) matchers.push('matchAttrs');
|
2874
|
-
if (this.pseudo) matchers.push('matchPseudo');
|
2875
|
-
|
2876
|
-
if (matchers.length == 1) {
|
2877
|
-
this.match = this[matchers[0]];
|
2878
|
-
} else if (matchers.length) {
|
2879
|
-
var length = matchers.length;
|
2880
|
-
this.match = function(element) {
|
2881
|
-
for (var i=0; i < length; i++)
|
2882
|
-
if (!this[matchers[i]](element))
|
2883
|
-
return false;
|
2884
|
-
return true;
|
2885
|
-
}
|
2886
|
-
} else {
|
2887
|
-
this.match = function() { return true; }
|
2888
|
-
}
|
2889
|
-
},
|
2890
|
-
|
2891
|
-
matchId: function(element) {
|
2892
|
-
return element.id == this.id;
|
2893
|
-
},
|
2894
|
-
|
2895
|
-
matchTag: function(element) {
|
2896
|
-
return element.tagName == this.tag;
|
2897
|
-
},
|
2898
|
-
|
2899
|
-
matchClass: function(element) {
|
2900
|
-
if (element.className) {
|
2901
|
-
var names = element.className.split(' ');
|
2902
|
-
if (names.length == 1) {
|
2903
|
-
return this.classes.indexOf(names[0]) != -1;
|
2904
|
-
} else {
|
2905
|
-
for (var i=0, length = this.classes.length; i < length; i++)
|
2906
|
-
if (names.indexOf(this.classes[i]) == -1)
|
2907
|
-
return false;
|
2908
|
-
|
2909
|
-
return true;
|
2910
|
-
}
|
2911
|
-
}
|
2912
|
-
return false;
|
2913
|
-
},
|
2914
|
-
|
2915
|
-
matchAttrs: function(element) {
|
2916
|
-
var matches = true;
|
2917
|
-
for (var key in this.attrs) {
|
2918
|
-
matches &= this.matchAttr(element, key, this.attrs[key]['op'], this.attrs[key]['value']);
|
2919
|
-
}
|
2920
|
-
return matches;
|
2921
|
-
},
|
2922
|
-
|
2923
|
-
matchAttr: function(element, name, operator, value) {
|
2924
|
-
var attr = element.getAttribute(name) || '';
|
2925
|
-
switch(operator) {
|
2926
|
-
case '=': return attr == value;
|
2927
|
-
case '*=': return attr.includes(value);
|
2928
|
-
case '^=': return attr.startsWith(value);
|
2929
|
-
case '$=': return attr.endsWith(value);
|
2930
|
-
case '~=': return attr.split(' ').includes(value);
|
2931
|
-
case '|=': return attr.split('-').includes(value);
|
2932
|
-
default: return attr != '';
|
2933
|
-
}
|
2934
|
-
return false;
|
2935
|
-
},
|
2936
|
-
|
2937
|
-
matchPseudo: function(element) {
|
2938
|
-
return this.pseudoMatchers[this.pseudo].call(element, this.pseudoValue, this.pseudoMatchers);
|
2939
|
-
},
|
2940
|
-
|
2941
|
-
/**
|
2942
|
-
* W3C pseudo matchers
|
2943
|
-
*
|
2944
|
-
* NOTE: methods of the module will be called in a context of an element
|
2945
|
-
*/
|
2946
|
-
pseudoMatchers: {
|
2947
|
-
checked: function() {
|
2948
|
-
return this.checked;
|
2949
|
-
},
|
2950
|
-
|
2951
|
-
disabled: function() {
|
2952
|
-
return this.disabled;
|
2953
|
-
},
|
2954
|
-
|
2955
|
-
empty: function() {
|
2956
|
-
return !(this.innerText || this.innerHTML || this.textContent || '').length;
|
2957
|
-
},
|
2958
|
-
|
2959
|
-
'first-child': function(tag_name) {
|
2960
|
-
var node = this;
|
2961
|
-
while ((node = node.previousSibling)) {
|
2962
|
-
if (node.tagName && (!tag_name || node.tagName == tag_name)) {
|
2963
|
-
return false;
|
2964
|
-
}
|
2965
|
-
}
|
2966
|
-
return true;
|
2967
|
-
},
|
2968
|
-
|
2969
|
-
'first-of-type': function() {
|
2970
|
-
return arguments[1]['first-child'].call(this, this.tagName);
|
2971
|
-
},
|
2972
|
-
|
2973
|
-
'last-child': function(tag_name) {
|
2974
|
-
var node = this;
|
2975
|
-
while ((node = node.nextSibling)) {
|
2976
|
-
if (node.tagName && (!tag_name || node.tagName == tag_name)) {
|
2977
|
-
return false;
|
2978
|
-
}
|
2979
|
-
}
|
2980
|
-
return true;
|
2981
|
-
},
|
2730
|
+
match: function(css_rule) {
|
2731
|
+
if (!css_rule || css_rule == '*') return true;
|
2982
2732
|
|
2983
|
-
|
2984
|
-
return arguments[1]['last-child'].call(this, this.tagName);
|
2985
|
-
},
|
2986
|
-
|
2987
|
-
'only-child': function(tag_name, matchers) {
|
2988
|
-
return matchers['first-child'].call(this, tag_name)
|
2989
|
-
&& matchers['last-child'].call(this, tag_name);
|
2990
|
-
},
|
2733
|
+
var fake, result, parent, parents = this.parents();
|
2991
2734
|
|
2992
|
-
|
2993
|
-
|
2994
|
-
},
|
2995
|
-
|
2996
|
-
'nth-child': function(number, matchers, tag_name) {
|
2997
|
-
if (!matchers.hasParent(this)) return false;
|
2998
|
-
number = number.toLowerCase();
|
2999
|
-
|
3000
|
-
if (number == 'n') return true;
|
3001
|
-
|
3002
|
-
if (number.includes('n')) {
|
3003
|
-
// parsing out the matching expression
|
3004
|
-
var a = b = 0;
|
3005
|
-
if (m = number.match(/^([+-]?\d*)?n([+-]?\d*)?$/)) {
|
3006
|
-
a = m[1] == '-' ? -1 : parseInt(m[1], 10) || 1;
|
3007
|
-
b = parseInt(m[2], 10) || 0;
|
3008
|
-
}
|
3009
|
-
|
3010
|
-
// getting the element index
|
3011
|
-
var index = 1, node = this;
|
3012
|
-
while ((node = node.previousSibling)) {
|
3013
|
-
if (node.tagName && (!tag_name || node.tagName == tag_name)) index++;
|
3014
|
-
}
|
3015
|
-
|
3016
|
-
return (index - b) % a == 0 && (index - b) / a >= 0;
|
3017
|
-
|
3018
|
-
} else {
|
3019
|
-
return matchers['index'].call(this, number.toInt() - 1, matchers, tag_name);
|
3020
|
-
}
|
3021
|
-
},
|
2735
|
+
parent = parents.length ? parents.last() : fake = $E('div').insert(this);
|
2736
|
+
result = parent.select(css_rule).include(this);
|
3022
2737
|
|
3023
|
-
|
3024
|
-
return arguments[1]['nth-child'].call(this, number, arguments[1], this.tagName);
|
3025
|
-
},
|
2738
|
+
if (fake) { this.remove(); }
|
3026
2739
|
|
3027
|
-
|
3028
|
-
index: function(number, matchers, tag_name) {
|
3029
|
-
number = isString(number) ? number.toInt() : number;
|
3030
|
-
var node = this, count = 0;
|
3031
|
-
while ((node = node.previousSibling)) {
|
3032
|
-
if (node.tagName && (!tag_name || node.tagName == tag_name) && ++count > number) return false;
|
3033
|
-
}
|
3034
|
-
return count == number;
|
3035
|
-
},
|
3036
|
-
|
3037
|
-
// checking if the element has a parent node
|
3038
|
-
// the '-----fake' parent is a temporary context for the element
|
3039
|
-
// just of the matching process
|
3040
|
-
hasParent: function(element) {
|
3041
|
-
return element.parentNode && element.parentNode.id != '-----fake';
|
3042
|
-
}
|
2740
|
+
return result;
|
3043
2741
|
}
|
3044
|
-
});
|
2742
|
+
}})());
|
3045
2743
|
|
3046
|
-
|
3047
|
-
|
3048
|
-
|
3049
|
-
*
|
3050
|
-
* Some principles were inspired by
|
3051
|
-
* - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson
|
3052
|
-
* - MooTools (http://mootools.net) Copyright (C) Valerio Proietti
|
3053
|
-
*
|
3054
|
-
* Copyright (C) 2008-2009 Nikolay V. Nemshilov aka St. <nemshilov#gma-ilc-om>
|
3055
|
-
*/
|
3056
|
-
Selector.Manual = new Class({
|
3057
|
-
ATOMS_SPLIT_RE: /(\s*([~>+ ])\s*)(?![^\s\)\]]*(\)|\]))/,
|
3058
|
-
|
3059
|
-
/**
|
3060
|
-
* constructor
|
3061
|
-
*
|
3062
|
-
* @param String css-rule
|
3063
|
-
*/
|
3064
|
-
initialize: function(css_rule) {
|
3065
|
-
var css_rule = css_rule.trim();
|
3066
|
-
this.cssRule = css_rule;
|
3067
|
-
|
3068
|
-
this.atoms = [];
|
3069
|
-
|
3070
|
-
var relation = null, match = null;
|
3071
|
-
|
3072
|
-
while (match = css_rule.match(this.ATOMS_SPLIT_RE)) {
|
3073
|
-
separator_pos = css_rule.indexOf(match[0]);
|
3074
|
-
this.atoms.push(new Selector.Atom(css_rule.substring(0, separator_pos), relation));
|
3075
|
-
|
3076
|
-
relation = match[2]; // <- puts the current relation to the next atom
|
3077
|
-
|
3078
|
-
// chopping off the first atom of the rule
|
3079
|
-
css_rule = css_rule.substr(separator_pos+(match[1].length==1 ? 1 : match[1].length-1)).trim();
|
3080
|
-
}
|
3081
|
-
this.atoms.push(new Selector.Atom(css_rule, relation));
|
3082
|
-
},
|
3083
|
-
|
3084
|
-
/**
|
3085
|
-
* searches for the first matching subnode
|
3086
|
-
*
|
3087
|
-
* @param Element base node
|
3088
|
-
* @return Element matching element or null if nothing found
|
3089
|
-
*/
|
3090
|
-
first: function(node) {
|
3091
|
-
return this.select(node).first();
|
3092
|
-
},
|
3093
|
-
|
3094
|
-
/**
|
3095
|
-
* selects all the matching subnodes
|
3096
|
-
*
|
3097
|
-
* @param Element base node
|
3098
|
-
* @return Array found nodes
|
3099
|
-
*/
|
3100
|
-
select: function(node) {
|
3101
|
-
var founds, atom, index, sub_founds;
|
3102
|
-
|
3103
|
-
for (var i=0, i_length = this.atoms.length; i < i_length; i++) {
|
3104
|
-
atom = this.atoms[i];
|
3105
|
-
if (i == 0) {
|
3106
|
-
founds = this.find[atom.rel](node, atom);
|
3107
|
-
|
3108
|
-
} else {
|
3109
|
-
if (i > 1) founds = this.uniq(founds);
|
3110
|
-
|
3111
|
-
for (var j=0; j < founds.length; j++) {
|
3112
|
-
sub_founds = this.find[atom.rel](founds[j], atom);
|
3113
|
-
|
3114
|
-
sub_founds.unshift(1); // <- nuke the parent node out of the list
|
3115
|
-
sub_founds.unshift(j); // <- position to insert the subresult
|
3116
|
-
|
3117
|
-
founds.splice.apply(founds, sub_founds);
|
3118
|
-
|
3119
|
-
j += sub_founds.length - 3;
|
3120
|
-
}
|
3121
|
-
}
|
3122
|
-
}
|
3123
|
-
|
3124
|
-
return this.atoms.length > 1 ? this.uniq(founds) : founds;
|
3125
|
-
},
|
3126
|
-
|
3127
|
-
/**
|
3128
|
-
* checks if the node matches the rule
|
3129
|
-
*
|
3130
|
-
* @param Element node to check
|
3131
|
-
* @return boolean check result
|
3132
|
-
*/
|
3133
|
-
match: function(element) {
|
3134
|
-
// if there's more than one atom, we match the element in a context
|
3135
|
-
if (!this.atoms || this.atoms.length > 1) {
|
3136
|
-
if (element.parentNode) {
|
3137
|
-
// searching for the top parent node
|
3138
|
-
// NOTE: don't use the Element.parents in here to avoid annecessary elements extending
|
3139
|
-
var p = element, parent;
|
3140
|
-
while ((p = p.parentNode)) parent = p;
|
3141
|
-
} else {
|
3142
|
-
// putting the element in a temporary context so we could test it
|
3143
|
-
var parent = document.createElement('div'), parent_is_fake = true;
|
3144
|
-
parent.id = '-----fake'; // <- this id is used in the manual 'match' method,
|
3145
|
-
// to determine if the element originally had no parent node
|
3146
|
-
parent.appendChild(element);
|
3147
|
-
}
|
3148
|
-
|
3149
|
-
var match = this.select(parent).includes(element);
|
3150
|
-
if (parent_is_fake) parent.removeChild(element);
|
3151
|
-
} else {
|
3152
|
-
// if there's just one atom, we simple match against it.
|
3153
|
-
var match = this.atoms[0].match(element);
|
3154
|
-
}
|
3155
|
-
|
3156
|
-
return match;
|
3157
|
-
},
|
3158
|
-
|
3159
|
-
// protected
|
3160
|
-
uniq: function(elements) {
|
3161
|
-
var uniq = [], uids = [], uid;
|
3162
|
-
for (var i=0, length = elements.length; i < length; i++) {
|
3163
|
-
uid = $uid(elements[i]);
|
3164
|
-
if (!uids[uid]) {
|
3165
|
-
uniq.push(elements[i]);
|
3166
|
-
uids[uid] = true;
|
3167
|
-
}
|
3168
|
-
}
|
3169
|
-
|
3170
|
-
return uniq;
|
2744
|
+
// document-level hooks
|
2745
|
+
$ext(document, {
|
2746
|
+
first: function(css_rule) {
|
2747
|
+
return this.querySelector(css_rule || '*');
|
3171
2748
|
},
|
3172
|
-
|
3173
|
-
find: {
|
3174
|
-
/**
|
3175
|
-
* search for any descendant nodes
|
3176
|
-
*/
|
3177
|
-
' ': function(element, atom) {
|
3178
|
-
var founds = $A(element.getElementsByTagName(atom.tag));
|
3179
|
-
if (atom.hasNonTagMatcher) {
|
3180
|
-
var matching = [];
|
3181
|
-
for (var i=0, length = founds.length; i < length; i++) {
|
3182
|
-
if (atom.match(founds[i]))
|
3183
|
-
matching.push(founds[i]);
|
3184
|
-
}
|
3185
|
-
return matching;
|
3186
|
-
}
|
3187
|
-
return founds;
|
3188
|
-
},
|
3189
|
-
|
3190
|
-
/**
|
3191
|
-
* search for immidate descendant nodes
|
3192
|
-
*/
|
3193
|
-
'>': function(element, atom) {
|
3194
|
-
var node = element.firstChild, matched = [];
|
3195
|
-
while (node) {
|
3196
|
-
if (atom.match(node)) {
|
3197
|
-
matched.push(node);
|
3198
|
-
}
|
3199
|
-
node = node.nextSibling;
|
3200
|
-
}
|
3201
|
-
return matched;
|
3202
|
-
},
|
3203
|
-
|
3204
|
-
/**
|
3205
|
-
* search for immiate sibling nodes
|
3206
|
-
*/
|
3207
|
-
'+': function(element, atom) {
|
3208
|
-
while ((element = element.nextSibling)) {
|
3209
|
-
if (element.tagName) {
|
3210
|
-
return atom.match(element) ? [element] : [];
|
3211
|
-
}
|
3212
|
-
}
|
3213
|
-
return [];
|
3214
|
-
},
|
3215
|
-
|
3216
|
-
/**
|
3217
|
-
* search for late sibling nodes
|
3218
|
-
*/
|
3219
|
-
'~': function(element, atom) {
|
3220
|
-
var founds = [];
|
3221
|
-
while ((element = element.nextSibling)) {
|
3222
|
-
if (atom.match(element))
|
3223
|
-
founds.push(element);
|
3224
|
-
}
|
3225
|
-
return founds;
|
3226
|
-
}
|
3227
|
-
}
|
3228
|
-
|
3229
|
-
});
|
3230
|
-
|
3231
|
-
/**
|
3232
|
-
* represents a complex, multi ruled select strategy
|
3233
|
-
*
|
3234
|
-
* Copyright (C) 2008-2009 Nikolay V. Nemshilov aka St. <nemshilov#gma-ilc-om>
|
3235
|
-
*/
|
3236
|
-
Selector.Multiple = new Class({
|
3237
2749
|
|
3238
|
-
|
3239
|
-
|
3240
|
-
*
|
3241
|
-
* @param String css-rule
|
3242
|
-
*/
|
3243
|
-
initialize: function(css_rule) {
|
3244
|
-
this.cssRule = css_rule;
|
3245
|
-
this.selectors = css_rule.split(',').map(function(rule) {
|
3246
|
-
return rule.blank() ? null : new Selector.Manual(rule);
|
3247
|
-
}).compact();
|
3248
|
-
},
|
3249
|
-
|
3250
|
-
/**
|
3251
|
-
* searches for the first matching subnode
|
3252
|
-
*
|
3253
|
-
* @param Element base node
|
3254
|
-
* @return Element matching element or null if nothing found
|
3255
|
-
*/
|
3256
|
-
first: function(node) {
|
3257
|
-
return this.selectors.map('first', node).first(function(i) { return !!i;});
|
3258
|
-
},
|
3259
|
-
|
3260
|
-
/**
|
3261
|
-
* selects all the matching subnodes
|
3262
|
-
*
|
3263
|
-
* @param Element base node
|
3264
|
-
* @return Array found nodes
|
3265
|
-
*/
|
3266
|
-
select: function(node) {
|
3267
|
-
return this.selectors.map('select', node, null).flatten().uniq();
|
3268
|
-
},
|
3269
|
-
|
3270
|
-
/**
|
3271
|
-
* checks if the node matches the rule
|
3272
|
-
*
|
3273
|
-
* @param Element node to check
|
3274
|
-
* @return boolean check result
|
3275
|
-
*/
|
3276
|
-
match: function(node) {
|
3277
|
-
return this.selectors.some('match', node) || !this.selectors.length;
|
2750
|
+
select: function(css_rule) {
|
2751
|
+
return $A(this.querySelectorAll(css_rule || '*'));
|
3278
2752
|
}
|
3279
2753
|
});
|
3280
2754
|
|
3281
|
-
|
3282
2755
|
/**
|
3283
2756
|
* the window object extensions
|
3284
2757
|
*
|
@@ -3348,20 +2821,10 @@ return {
|
|
3348
2821
|
Observer.createShortcuts(object, ['ready']);
|
3349
2822
|
var ready = object.ready.bind(object);
|
3350
2823
|
|
3351
|
-
|
3352
|
-
|
2824
|
+
// IE and Konqueror browsers
|
2825
|
+
if (document.readyState !== undefined) {
|
3353
2826
|
(function() {
|
3354
|
-
|
3355
|
-
try {
|
3356
|
-
document.body.appendChild(tmp);
|
3357
|
-
tmp.remove();
|
3358
|
-
loaded = true;
|
3359
|
-
} catch(e) { arguments.callee.delay(50);}
|
3360
|
-
if (loaded) ready();
|
3361
|
-
})();
|
3362
|
-
} else if (document['readyState'] !== undefined) {
|
3363
|
-
(function() {
|
3364
|
-
$w('loaded complete').includes(document.readyState) ? ready() : arguments.callee.delay(50);
|
2827
|
+
['loaded','complete'].includes(document.readyState) ? ready() : arguments.callee.delay(50);
|
3365
2828
|
})();
|
3366
2829
|
} else {
|
3367
2830
|
document.addEventListener('DOMContentLoaded', ready, false);
|
@@ -3378,47 +2841,40 @@ return {
|
|
3378
2841
|
*
|
3379
2842
|
* Copyright (C) 2009 Nikolay V. Nemshilov aka St. <nemshilov#gma-ilc-om>
|
3380
2843
|
*/
|
3381
|
-
var Form =
|
2844
|
+
var Form = function(options) {
|
2845
|
+
var options = options || {}, remote = options['remote'],
|
2846
|
+
form = new Element('form', Object.without(options, 'remote'));
|
2847
|
+
|
2848
|
+
if (remote) form.remotize();
|
2849
|
+
|
2850
|
+
return form;
|
2851
|
+
};
|
2852
|
+
|
2853
|
+
$ext(Form, {
|
3382
2854
|
/**
|
3383
|
-
*
|
2855
|
+
* IE browsers manual elements extending
|
3384
2856
|
*
|
3385
|
-
* @param
|
2857
|
+
* @param Element form
|
2858
|
+
* @return Form element
|
3386
2859
|
*/
|
3387
|
-
|
3388
|
-
|
3389
|
-
form = this.$super('form', Object.without(options, 'remote'));
|
3390
|
-
|
3391
|
-
if (remote) form.remotize();
|
3392
|
-
|
3393
|
-
return form;
|
2860
|
+
ext: function(element) {
|
2861
|
+
return $ext(element, this.Methods);
|
3394
2862
|
},
|
3395
2863
|
|
3396
|
-
|
3397
|
-
|
3398
|
-
|
3399
|
-
|
3400
|
-
|
3401
|
-
|
3402
|
-
|
3403
|
-
|
3404
|
-
|
3405
|
-
|
3406
|
-
|
3407
|
-
Methods: {},
|
2864
|
+
Methods: {},
|
2865
|
+
|
2866
|
+
/**
|
2867
|
+
* Extends the form functionality
|
2868
|
+
*
|
2869
|
+
* @param Object methods hash
|
2870
|
+
* @return void
|
2871
|
+
*/
|
2872
|
+
addMethods: function(methods, dont_overwrite) {
|
2873
|
+
$ext(Form.Methods, methods, dont_overwrite);
|
3408
2874
|
|
3409
|
-
|
3410
|
-
|
3411
|
-
|
3412
|
-
* @param Object methods hash
|
3413
|
-
* @return void
|
3414
|
-
*/
|
3415
|
-
addMethods: function(methods, dont_overwrite) {
|
3416
|
-
$ext(Form.Methods, methods, dont_overwrite);
|
3417
|
-
|
3418
|
-
try { // trying to extend the form element prototype
|
3419
|
-
$ext(HTMLFormElement.prototype, methods, dont_overwrite);
|
3420
|
-
} catch(e) {}
|
3421
|
-
}
|
2875
|
+
try { // trying to extend the form element prototype
|
2876
|
+
$ext(HTMLFormElement.prototype, methods, dont_overwrite);
|
2877
|
+
} catch(e) {}
|
3422
2878
|
}
|
3423
2879
|
});
|
3424
2880
|
|
@@ -3781,7 +3237,7 @@ var Xhr = new Class(Observer, {
|
|
3781
3237
|
Options: {
|
3782
3238
|
headers: {
|
3783
3239
|
'X-Requested-With': 'XMLHttpRequest',
|
3784
|
-
'Accept': 'text/javascript,
|
3240
|
+
'Accept': 'text/javascript,text/html,application/xml,text/xml,*/*'
|
3785
3241
|
},
|
3786
3242
|
method: 'post',
|
3787
3243
|
encoding: 'utf-8',
|
@@ -3793,7 +3249,8 @@ var Xhr = new Class(Observer, {
|
|
3793
3249
|
urlEncoded: true,
|
3794
3250
|
spinner: null,
|
3795
3251
|
spinnerFx: 'fade',
|
3796
|
-
params: null
|
3252
|
+
params: null,
|
3253
|
+
iframed: false
|
3797
3254
|
},
|
3798
3255
|
|
3799
3256
|
/**
|
@@ -3866,21 +3323,20 @@ var Xhr = new Class(Observer, {
|
|
3866
3323
|
* @return Xhr self
|
3867
3324
|
*/
|
3868
3325
|
send: function(params) {
|
3869
|
-
var add_params = {}, url = this.url;
|
3326
|
+
var add_params = {}, url = this.url, method = this.method.toLowerCase();
|
3870
3327
|
|
3871
|
-
|
3872
|
-
|
3873
|
-
|
3874
|
-
method = 'POST';
|
3328
|
+
if (method == 'put' || method == 'delete') {
|
3329
|
+
add_params['_method'] = method;
|
3330
|
+
method = 'post';
|
3875
3331
|
}
|
3876
3332
|
|
3877
3333
|
var data = this.prepareData(this.params, this.prepareParams(params), add_params);
|
3878
3334
|
|
3879
|
-
if (this.urlEncoded && method == '
|
3880
|
-
this.setHeader('Content-type', 'application/x-www-form-urlencoded;
|
3335
|
+
if (this.urlEncoded && method == 'post' && !this.headers['Content-type']) {
|
3336
|
+
this.setHeader('Content-type', 'application/x-www-form-urlencoded;charset='+this.encoding);
|
3881
3337
|
}
|
3882
3338
|
|
3883
|
-
if (method == '
|
3339
|
+
if (method == 'get') {
|
3884
3340
|
url += (url.includes('?') ? '&' : '?') + data;
|
3885
3341
|
data = null;
|
3886
3342
|
}
|
@@ -4007,11 +3463,8 @@ var Xhr = new Class(Observer, {
|
|
4007
3463
|
|
4008
3464
|
// initializes the request callbacks
|
4009
3465
|
initCallbacks: function() {
|
4010
|
-
//
|
4011
|
-
this.on('create', 'showSpinner').on('complete', 'hideSpinner').on('cancel', 'hideSpinner');
|
4012
|
-
|
4013
|
-
// response scripts evaluation, should be before the global xhr callbacks
|
4014
|
-
this.on('success', 'tryScripts');
|
3466
|
+
// connecting basic callbacks
|
3467
|
+
this.on('success', 'tryScripts').on('create', 'showSpinner').on('complete', 'hideSpinner').on('cancel', 'hideSpinner');
|
4015
3468
|
|
4016
3469
|
// wiring the global xhr callbacks
|
4017
3470
|
Xhr.EVENTS.each(function(name) {
|
@@ -4046,13 +3499,13 @@ $ext(Xhr, {
|
|
4046
3499
|
}
|
4047
3500
|
});
|
4048
3501
|
|
4049
|
-
Xhr.
|
3502
|
+
Xhr.onCreate(function() {
|
4050
3503
|
this.counter++;
|
4051
3504
|
this.showSpinner();
|
4052
|
-
}).
|
3505
|
+
}).onComplete(function() {
|
4053
3506
|
this.counter--;
|
4054
3507
|
if (this.counter < 1) this.hideSpinner();
|
4055
|
-
}).
|
3508
|
+
}).onCancel(function() {
|
4056
3509
|
this.counter--;
|
4057
3510
|
if (this.counter < 1) this.hideSpinner();
|
4058
3511
|
});
|
@@ -4215,7 +3668,7 @@ var Fx = new Class(Observer, {
|
|
4215
3668
|
|
4216
3669
|
// default options
|
4217
3670
|
Options: {
|
4218
|
-
fps: Browser.IE ?
|
3671
|
+
fps: Browser.IE || Browser.Opera ? 35 : 60,
|
4219
3672
|
duration: 'normal',
|
4220
3673
|
transition: 'Sin',
|
4221
3674
|
queue: true
|
@@ -4252,7 +3705,7 @@ var Fx = new Class(Observer, {
|
|
4252
3705
|
*/
|
4253
3706
|
initialize: function(element, options) {
|
4254
3707
|
this.$super(options);
|
4255
|
-
this.element = $(element);
|
3708
|
+
this.element = this.fxee = $(element);
|
4256
3709
|
},
|
4257
3710
|
|
4258
3711
|
/**
|
@@ -4264,8 +3717,9 @@ var Fx = new Class(Observer, {
|
|
4264
3717
|
if (this.queue(arguments)) return this;
|
4265
3718
|
this.prepare.apply(this, arguments);
|
4266
3719
|
|
4267
|
-
|
4268
|
-
|
3720
|
+
var options = this.options,
|
3721
|
+
duration = Fx.Durations[options.duration] || options.duration;
|
3722
|
+
this.transition = Fx.Transitions[options.transition] || options.transition;
|
4269
3723
|
|
4270
3724
|
this.steps = (duration / 1000 * this.options.fps).ceil();
|
4271
3725
|
this.number = 1;
|
@@ -4311,28 +3765,18 @@ var Fx = new Class(Observer, {
|
|
4311
3765
|
|
4312
3766
|
// protected
|
4313
3767
|
// dummy method, should be implemented in a subclass
|
4314
|
-
prepare: function() {},
|
3768
|
+
prepare: function(values) {},
|
4315
3769
|
|
4316
|
-
// dummy method,
|
4317
|
-
render: function(
|
3770
|
+
// dummy method, processes the element properties
|
3771
|
+
render: function(delta) {},
|
4318
3772
|
|
4319
3773
|
// the periodically called method
|
4320
3774
|
// NOTE: called outside of the instance scope!
|
4321
|
-
step: function(
|
4322
|
-
if (
|
4323
|
-
|
4324
|
-
|
4325
|
-
$this.number ++;
|
4326
|
-
} else {
|
4327
|
-
$this.finish();
|
4328
|
-
}
|
3775
|
+
step: function(that) {
|
3776
|
+
if (that.number > that.steps) that.finish();
|
3777
|
+
else that.render(that.transition(that.number ++ / that.steps));
|
4329
3778
|
},
|
4330
|
-
|
4331
|
-
// calculates the current value
|
4332
|
-
calc: function(start, end, delata) {
|
4333
|
-
return start + (end - start) * delta;
|
4334
|
-
},
|
4335
|
-
|
3779
|
+
|
4336
3780
|
startTimer: function() {
|
4337
3781
|
this.timer = this.step.periodical((1000 / this.options.fps).round(), this);
|
4338
3782
|
return this;
|
@@ -4349,15 +3793,11 @@ var Fx = new Class(Observer, {
|
|
4349
3793
|
// should return false if there's no queue and true if there is a queue
|
4350
3794
|
queue: function(args) {
|
4351
3795
|
if (!this.element) return false;
|
4352
|
-
if (this.$
|
4353
|
-
delete(this['$chained']);
|
4354
|
-
return false;
|
4355
|
-
}
|
3796
|
+
if (this.$ch) return this.$ch = false;
|
4356
3797
|
|
4357
3798
|
var uid = $uid(this.element), chain;
|
4358
|
-
|
4359
|
-
|
4360
|
-
chain = Fx.$chains[uid];
|
3799
|
+
Fx.$ch = Fx.$ch || [];
|
3800
|
+
chain = (Fx.$ch[uid] = Fx.$ch[uid] || []);
|
4361
3801
|
|
4362
3802
|
if (this.options.queue)
|
4363
3803
|
chain.push([args, this]);
|
@@ -4365,13 +3805,13 @@ var Fx = new Class(Observer, {
|
|
4365
3805
|
this.next = function() {
|
4366
3806
|
var next = chain.shift(); next = chain[0];
|
4367
3807
|
if (next) {
|
4368
|
-
next[1].$
|
3808
|
+
next[1].$ch = true;
|
4369
3809
|
next[1].start.apply(next[1], next[0]);
|
4370
3810
|
}
|
4371
3811
|
return this;
|
4372
3812
|
};
|
4373
3813
|
|
4374
|
-
return chain[0][1] !== this
|
3814
|
+
return this.options.queue && chain[0][1] !== this;
|
4375
3815
|
},
|
4376
3816
|
|
4377
3817
|
next: function() {
|
@@ -4430,11 +3870,11 @@ $ext(String.prototype, {
|
|
4430
3870
|
* @return String hex color
|
4431
3871
|
*/
|
4432
3872
|
toHex: function() {
|
4433
|
-
var match =
|
3873
|
+
var match = /^#(\w)(\w)(\w)$/.exec(this);
|
4434
3874
|
|
4435
3875
|
if (match) {
|
4436
3876
|
match = "#"+ match[1]+match[1]+match[2]+match[2]+match[3]+match[3];
|
4437
|
-
} else if (match =
|
3877
|
+
} else if (match = /^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/.exec(this)) {
|
4438
3878
|
match = "#"+ match.slice(1).map(function(bit) {
|
4439
3879
|
bit = (bit-0).toString(16);
|
4440
3880
|
return bit.length == 1 ? '0'+bit : bit;
|
@@ -4453,7 +3893,7 @@ $ext(String.prototype, {
|
|
4453
3893
|
* @return String rgb(R,G,B) or Array [R,G,B]
|
4454
3894
|
*/
|
4455
3895
|
toRgb: function(array) {
|
4456
|
-
var match =
|
3896
|
+
var match = /#([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})/i.exec(this.toHex()||'');
|
4457
3897
|
|
4458
3898
|
if (match) {
|
4459
3899
|
match = match.slice(1).map('toInt', 16);
|
@@ -4473,187 +3913,222 @@ $ext(String.prototype, {
|
|
4473
3913
|
*
|
4474
3914
|
* Copyright (C) 2008-2009 Nikolay V. Nemshilov aka St. <nemshilov#gma-ilc-om>
|
4475
3915
|
*/
|
4476
|
-
Fx.Morph = new Class(Fx, {
|
4477
|
-
|
4478
|
-
|
3916
|
+
Fx.Morph = new Class(Fx, (function() {
|
3917
|
+
// a list of common style names to compact the code a bit
|
3918
|
+
var Top = 'Top', Left = 'Left', Right = 'Right', Bottom = 'Bottom', Color = 'Color', Style = 'Style',
|
3919
|
+
Width = 'Width', Bg = 'background', Border = 'border', Pos = 'Position', BgColor = Bg + Color,
|
3920
|
+
BdStyle = Border + Style, BdColor = Border + Color, BdWidth = Border + Width;
|
4479
3921
|
|
4480
|
-
|
4481
|
-
|
4482
|
-
|
4483
|
-
|
4484
|
-
|
4485
|
-
|
3922
|
+
|
3923
|
+
// adds variants to the style names list
|
3924
|
+
var add_variants = function(keys, key, variants) {
|
3925
|
+
for (var i=0; i < variants.length; i++)
|
3926
|
+
keys.push(key + variants[i]);
|
3927
|
+
};
|
3928
|
+
|
3929
|
+
// parses the style hash into a processable format
|
3930
|
+
var parse_style = function(values) {
|
3931
|
+
var result = {}, re = /[\d\.\-]+/g, m;
|
3932
|
+
|
3933
|
+
for (var key in values) {
|
3934
|
+
m = values[key].match(re);
|
3935
|
+
var value = m.map('toFloat');
|
3936
|
+
value.t = values[key].split(re);
|
3937
|
+
if (/^\d/.test(values[key]) && value.t[0] !== '') value.t.unshift('');
|
3938
|
+
for (var i=0; i < value.length; i++) {
|
3939
|
+
value.t.splice(i*2+1, 0, value[i]);
|
3940
|
+
}
|
3941
|
+
result[key] = value;
|
3942
|
+
}
|
3943
|
+
|
3944
|
+
return result;
|
3945
|
+
};
|
3946
|
+
|
3947
|
+
return {
|
3948
|
+
|
3949
|
+
// protected
|
3950
|
+
|
3951
|
+
// parepares the effect
|
4486
3952
|
prepare: function(style) {
|
4487
|
-
|
4488
|
-
|
3953
|
+
var keys = this._styleKeys(style),
|
3954
|
+
before = this._cloneStyle(this.element, keys),
|
3955
|
+
after = this._endStyle(style, keys);
|
4489
3956
|
|
4490
|
-
this._cleanStyles();
|
3957
|
+
this._cleanStyles(before, after);
|
4491
3958
|
|
4492
|
-
|
3959
|
+
this.before = parse_style(before);
|
3960
|
+
this.after = parse_style(after);
|
4493
3961
|
},
|
4494
3962
|
|
4495
3963
|
render: function(delta) {
|
4496
|
-
var
|
4497
|
-
|
4498
|
-
|
4499
|
-
|
4500
|
-
end = this.endStyle[key];
|
4501
|
-
|
4502
|
-
if (typeof(start) == 'number') {
|
4503
|
-
// handling floats like opacity
|
4504
|
-
value = start + (end - start) * delta;
|
4505
|
-
|
4506
|
-
} else if(start.length == 2) {
|
4507
|
-
// handling usual sizes with dimensions
|
4508
|
-
value = (start[0] + (end[0] - start[0]) * delta) + end[1];
|
4509
|
-
|
4510
|
-
} else if(start.length == 3) {
|
4511
|
-
// calculating colors
|
4512
|
-
value = end.map(function(value, i) {
|
4513
|
-
return start[i] + (value - start[i]) * delta;
|
4514
|
-
}).toRgb();
|
4515
|
-
}
|
3964
|
+
var before, after, value, style = this.element.style;
|
3965
|
+
for (var key in this.after) {
|
3966
|
+
before = this.before[key];
|
3967
|
+
after = this.after[key];
|
4516
3968
|
|
4517
|
-
|
4518
|
-
|
4519
|
-
|
4520
|
-
|
3969
|
+
for (var i=0; i < after.length; i++) {
|
3970
|
+
value = before[i] + (after[i] - before[i]) * delta;
|
3971
|
+
if (after.t[0] === 'rgb(') value = Math.round(value);
|
3972
|
+
after.t[i*2+1] = ''+value;
|
4521
3973
|
}
|
3974
|
+
style[key] = after.t.join('');
|
4522
3975
|
}
|
4523
3976
|
},
|
4524
3977
|
|
4525
|
-
|
4526
|
-
|
4527
|
-
|
4528
|
-
|
4529
|
-
|
4530
|
-
|
4531
|
-
|
4532
|
-
|
4533
|
-
|
4534
|
-
|
4535
|
-
|
4536
|
-
|
4537
|
-
var
|
4538
|
-
|
4539
|
-
// assigning the border style if the end style has a border
|
4540
|
-
var border_style = element_styles.borderTopStyle, element_border_style = this_element_styles.borderTopStyle;
|
4541
|
-
if (border_style != element_border_style) {
|
4542
|
-
if (element_border_style == 'none') {
|
4543
|
-
this.element.style.borderWidth = '0px';
|
4544
|
-
}
|
4545
|
-
this.element.style.borderStyle = border_style;
|
4546
|
-
if (this._transp(this_element_styles.borderTopColor)) {
|
4547
|
-
this.element.style.borderColor = this_element_styles.color;
|
4548
|
-
}
|
4549
|
-
}
|
4550
|
-
|
4551
|
-
element.remove();
|
3978
|
+
/**
|
3979
|
+
* Returns a hash of the end style
|
3980
|
+
*
|
3981
|
+
* @param Object style
|
3982
|
+
* @return Object end style
|
3983
|
+
*/
|
3984
|
+
_endStyle: function(style, keys) {
|
3985
|
+
var parent = this.element.parentNode,
|
3986
|
+
dummy = $(this.element.cloneNode(true)).setStyle(style);
|
3987
|
+
|
3988
|
+
// swapping the element with the dummy and getting the new styles
|
3989
|
+
if (parent) parent.replaceChild(dummy, this.element);
|
3990
|
+
var after = this._cloneStyle(dummy, keys);
|
3991
|
+
if (parent) parent.replaceChild(this.element, dummy);
|
4552
3992
|
|
4553
|
-
return
|
3993
|
+
return after;
|
4554
3994
|
},
|
4555
3995
|
|
4556
|
-
|
4557
|
-
|
4558
|
-
|
4559
|
-
|
4560
|
-
|
3996
|
+
/**
|
3997
|
+
* Fast styles cloning
|
3998
|
+
*
|
3999
|
+
* @param Element element
|
4000
|
+
* @param Array style keys
|
4001
|
+
* @return Hash of styles
|
4002
|
+
*/
|
4003
|
+
_cloneStyle: function(element, keys) {
|
4004
|
+
for (var i=0, len = keys.length, style = element.computedStyles(), clean = {}; i < len; i++)
|
4005
|
+
clean[keys[i]] = style[keys[i]];
|
4561
4006
|
|
4562
|
-
return
|
4007
|
+
return clean;
|
4563
4008
|
},
|
4564
4009
|
|
4565
|
-
|
4566
|
-
|
4567
|
-
|
4568
|
-
|
4010
|
+
/**
|
4011
|
+
* creates an appropriate style-keys list out of the user styles
|
4012
|
+
*
|
4013
|
+
* @param Object the style hash
|
4014
|
+
* @return Array of clean style keys list
|
4015
|
+
*/
|
4016
|
+
_styleKeys: function(style) {
|
4017
|
+
var keys = [], border_types = [Style, Color, Width], directions = [Top, Left, Right, Bottom];
|
4018
|
+
|
4019
|
+
for (var key in style) {
|
4020
|
+
if (key.startsWith(Border))
|
4021
|
+
for (var i=0; i < border_types.length; i++)
|
4022
|
+
for (var j=0; j < directions.length; j++)
|
4023
|
+
keys.push(Border + directions[j] + border_types[i]);
|
4024
|
+
else if (key === 'margin' || key === 'padding')
|
4025
|
+
add_variants(keys, key, directions);
|
4026
|
+
else if (key.startsWith(Bg))
|
4027
|
+
add_variants(keys, Bg, [Color, Pos, Pos+'X', Pos+'Y']);
|
4028
|
+
else if (key === 'opacity' && Browser.IE)
|
4029
|
+
keys.push('filter');
|
4030
|
+
else
|
4031
|
+
keys.push(key);
|
4032
|
+
}
|
4569
4033
|
|
4570
|
-
|
4571
|
-
|
4034
|
+
return keys;
|
4035
|
+
},
|
4036
|
+
|
4037
|
+
/**
|
4038
|
+
* cleans up and optimizies the styles
|
4039
|
+
*
|
4040
|
+
* @param Object before
|
4041
|
+
* @param Object after
|
4042
|
+
* @return void
|
4043
|
+
*/
|
4044
|
+
_cleanStyles: function(before, after) {
|
4045
|
+
var remove = [];
|
4046
|
+
|
4047
|
+
for (var key in after) {
|
4048
|
+
// getting directional options together so they were processed faster
|
4049
|
+
if (key.includes(Top)) {
|
4050
|
+
var top = key,
|
4051
|
+
left = key.replace(Top, Left),
|
4052
|
+
right = key.replace(Top, Right),
|
4053
|
+
bottom = key.replace(Top, Bottom),
|
4054
|
+
common = key.replace(Top, '');
|
4055
|
+
|
4056
|
+
if (after[top] === after[left] && after[top] === after[right] && after[top] === after[bottom] &&
|
4057
|
+
before[top] === before[left] && before[top] === before[right] && before[top] === before[bottom]
|
4058
|
+
) {
|
4059
|
+
after[common] = after[top];
|
4060
|
+
before[common] = before[top];
|
4061
|
+
|
4062
|
+
remove = remove.concat([top, left, right, bottom]);
|
4063
|
+
}
|
4064
|
+
}
|
4572
4065
|
|
4573
|
-
//
|
4574
|
-
if (key
|
4575
|
-
|
4576
|
-
key = 'borderWidth';
|
4577
|
-
keys.splice(i+1, 0, 'borderColor'); // inserting the border color as the next unit
|
4066
|
+
// checking the height/width options
|
4067
|
+
if (key === Width || key === 'height') {
|
4068
|
+
if (before[key] == 'auto') before[key] = this.element['offset'+key.capitalize()] + 'px';
|
4578
4069
|
}
|
4070
|
+
}
|
4071
|
+
|
4072
|
+
// IE opacity filter fix
|
4073
|
+
if (after.filter && !before.filter) before.filter = 'alpha(opacity=100)';
|
4074
|
+
|
4075
|
+
// adjusting the border style
|
4076
|
+
if (before[BdStyle] != after[BdStyle]) {
|
4077
|
+
var style = this.element.style;
|
4579
4078
|
|
4580
|
-
|
4581
|
-
|
4079
|
+
if (before[BdStyle] == 'none') {
|
4080
|
+
style[BdWidth] = '0px';
|
4081
|
+
}
|
4582
4082
|
|
4583
|
-
|
4584
|
-
if (
|
4083
|
+
style[BdStyle] = after[BdStyle];
|
4084
|
+
if (this._transp(before[BdColor])) {
|
4085
|
+
style[BdColor] = this.element.getStyle(Color);
|
4086
|
+
}
|
4087
|
+
}
|
4088
|
+
|
4089
|
+
// cleaing up the list
|
4090
|
+
for (var key in after) {
|
4091
|
+
// proprocessing colors
|
4092
|
+
if (after[key] !== before[key] && !remove.includes(key) && /color/i.test(key)) {
|
4093
|
+
if (Browser.Opera) {
|
4094
|
+
after[key] = after[key].replace(/"/g, '');
|
4095
|
+
before[key] = before[key].replace(/"/g, '');
|
4096
|
+
}
|
4097
|
+
|
4098
|
+
if (!this._transp(after[key])) after[key] = after[key].toRgb();
|
4099
|
+
if (!this._transp(before[key])) before[key] = before[key].toRgb();
|
4100
|
+
|
4101
|
+
if (!after[key] || !before[key]) after[key] = before[key] = '';
|
4102
|
+
}
|
4585
4103
|
|
4586
|
-
//
|
4587
|
-
if (
|
4104
|
+
// filling up the missing sizes
|
4105
|
+
if (/\d/.test(after[key]) && !/\d/.test(before[key])) before[key] = after[key].replace(/[\d\.\-]+/g, '0');
|
4588
4106
|
|
4589
|
-
//
|
4590
|
-
if (
|
4591
|
-
|
4592
|
-
|
4107
|
+
// removing unprocessable keys
|
4108
|
+
if (after[key] === before[key] || remove.includes(key) || !/\d/.test(before[key]) || !/\d/.test(after[key])) {
|
4109
|
+
delete(after[key]);
|
4110
|
+
delete(before[key]);
|
4593
4111
|
}
|
4594
4112
|
}
|
4595
|
-
|
4596
|
-
return name ? style[name] : style;
|
4597
4113
|
},
|
4598
4114
|
|
4599
4115
|
// looking for the visible background color of the element
|
4600
4116
|
_getBGColor: function(element) {
|
4601
4117
|
return [element].concat(element.parents()).map(function(node) {
|
4602
|
-
var bg = node.getStyle(
|
4118
|
+
var bg = node.getStyle(BgColor);
|
4603
4119
|
return (bg && !this._transp(bg)) ? bg : null;
|
4604
|
-
}, this).compact().first() || '
|
4120
|
+
}, this).compact().first() || '#FFF';
|
4605
4121
|
},
|
4606
4122
|
|
4607
|
-
// prepares the style values to be processed correctly
|
4608
|
-
_cleanStyles: function() {
|
4609
|
-
var end = this.endStyle, start = this.startStyle;
|
4610
|
-
|
4611
|
-
// filling up missing styles
|
4612
|
-
for (var key in end) {
|
4613
|
-
if (start[key] === '' && /^[\d\.\-]+[a-z]+$/.test(end[key])) {
|
4614
|
-
start[key] = '0px';
|
4615
|
-
}
|
4616
|
-
}
|
4617
|
-
|
4618
|
-
[end, start].each(this._cleanStyle, this);
|
4619
|
-
|
4620
|
-
// removing duplications between start and end styles
|
4621
|
-
for (var key in end) {
|
4622
|
-
if (!defined(start[key]) || (end[key] instanceof Array ? end[key].join() === start[key].join() : end[key] === start[key])) {
|
4623
|
-
delete(end[key]);
|
4624
|
-
delete(start[key]);
|
4625
|
-
}
|
4626
|
-
}
|
4627
|
-
},
|
4628
|
-
|
4629
|
-
// cleans up a style object
|
4630
|
-
_cleanStyle: function(style) {
|
4631
|
-
var match;
|
4632
|
-
for (var key in style) {
|
4633
|
-
style[key] = String(style[key]);
|
4634
|
-
|
4635
|
-
if (/color/i.test(key)) {
|
4636
|
-
// preparing the colors
|
4637
|
-
style[key] = style[key].toRgb(true);
|
4638
|
-
if (!style[key]) delete(style[key]);
|
4639
|
-
} else if (/^[\d\.]+$/.test(style[key])) {
|
4640
|
-
// preparing numberic values
|
4641
|
-
style[key] = style[key].toFloat();
|
4642
|
-
} else if (match = style[key].match(/^([\d\.\-]+)([a-z]+)$/i)) {
|
4643
|
-
// preparing values with dimensions
|
4644
|
-
style[key] = [match[1].toFloat(), match[2]];
|
4645
|
-
|
4646
|
-
} else {
|
4647
|
-
delete(style[key]);
|
4648
|
-
}
|
4649
|
-
}
|
4650
|
-
},
|
4651
4123
|
|
4652
4124
|
// checks if the color is transparent
|
4653
4125
|
_transp: function(color) {
|
4654
|
-
return color
|
4126
|
+
return color === 'transparent' || color === 'rgba(0, 0, 0, 0)';
|
4655
4127
|
}
|
4656
|
-
|
4128
|
+
|
4129
|
+
}})());
|
4130
|
+
|
4131
|
+
|
4657
4132
|
|
4658
4133
|
/**
|
4659
4134
|
* the elements hightlighting effect
|
@@ -4753,7 +4228,7 @@ Fx.Slide = new Class(Fx.Twin, {
|
|
4753
4228
|
this.element.style.overflow = 'hidden';
|
4754
4229
|
this.onFinish('_getBack').onCancel('_getBack');
|
4755
4230
|
|
4756
|
-
return this.$super(this.
|
4231
|
+
return this.$super(this._getStyle(this.options.direction));
|
4757
4232
|
},
|
4758
4233
|
|
4759
4234
|
_getBack: function() {
|
@@ -4761,7 +4236,7 @@ Fx.Slide = new Class(Fx.Twin, {
|
|
4761
4236
|
},
|
4762
4237
|
|
4763
4238
|
// calculates the final style
|
4764
|
-
|
4239
|
+
_getStyle: function(direction) {
|
4765
4240
|
var style = {}, sizes = this.sizes,
|
4766
4241
|
margin_left = (this.styles.marginLeft || '0').toFloat(),
|
4767
4242
|
margin_top = (this.styles.marginTop || '0').toFloat();
|
@@ -4816,6 +4291,27 @@ Fx.Fade = new Class(Fx.Twin, {
|
|
4816
4291
|
}
|
4817
4292
|
});
|
4818
4293
|
|
4294
|
+
/**
|
4295
|
+
* A smooth scrolling visual effect
|
4296
|
+
*
|
4297
|
+
* Copyright (C) 2009 Nikolay V. Nemshilov aka St.
|
4298
|
+
*/
|
4299
|
+
Fx.Scroll = new Class(Fx, {
|
4300
|
+
prepare: function(value) {
|
4301
|
+
this.before = {};
|
4302
|
+
this.after = value;
|
4303
|
+
|
4304
|
+
if (value.x != undefined) this.before.x = this.element.scrollLeft;
|
4305
|
+
if (value.y != undefined) this.before.y = this.element.scrollTop;
|
4306
|
+
},
|
4307
|
+
|
4308
|
+
render: function(delta) {
|
4309
|
+
for (var key in this.after) {
|
4310
|
+
this.element['scroll' + (key === 'x' ? 'Left' : 'Top')] = this.before[key] + (this.after[key] - this.before[key]) * delta;
|
4311
|
+
}
|
4312
|
+
}
|
4313
|
+
});
|
4314
|
+
|
4819
4315
|
/**
|
4820
4316
|
* This block contains additional Element shortcuts for effects easy handling
|
4821
4317
|
*
|
@@ -4828,7 +4324,7 @@ Fx.Fade = new Class(Fx.Twin, {
|
|
4828
4324
|
Element.addMethods((function(methods) {
|
4829
4325
|
var old_hide = methods.hide,
|
4830
4326
|
old_show = methods.show,
|
4831
|
-
|
4327
|
+
old_scroll = methods.scrollTo;
|
4832
4328
|
|
4833
4329
|
return {
|
4834
4330
|
|
@@ -4852,31 +4348,6 @@ return {
|
|
4852
4348
|
return fx ? this.fx(fx, ['in', options], old_show) : old_show.call(this);
|
4853
4349
|
},
|
4854
4350
|
|
4855
|
-
/**
|
4856
|
-
* resizes the element using the Morph visual effect
|
4857
|
-
*
|
4858
|
-
* @param Integer width
|
4859
|
-
* @param Integer height
|
4860
|
-
* @param Object options
|
4861
|
-
*/
|
4862
|
-
resize: function(width, height, options) {
|
4863
|
-
if (isHash(width)) {
|
4864
|
-
height = width.y;
|
4865
|
-
width = width.x;
|
4866
|
-
}
|
4867
|
-
if (options) {
|
4868
|
-
var style = {};
|
4869
|
-
if (isNumber(height)) style.height = height+'px';
|
4870
|
-
if (isNumber(width)) style.width = width +'px';
|
4871
|
-
|
4872
|
-
if (!isHash(options)) options = {duration: options};
|
4873
|
-
|
4874
|
-
return this.fx('morph', [style, options]);
|
4875
|
-
} else {
|
4876
|
-
return old_resize.call(this, width, height);
|
4877
|
-
}
|
4878
|
-
},
|
4879
|
-
|
4880
4351
|
/**
|
4881
4352
|
* runs the Fx.Morth effect to the given style
|
4882
4353
|
*
|
@@ -4921,6 +4392,30 @@ return {
|
|
4921
4392
|
return this.fx('slide', arguments);
|
4922
4393
|
},
|
4923
4394
|
|
4395
|
+
/**
|
4396
|
+
* Starts the smooth scrolling effect
|
4397
|
+
*
|
4398
|
+
* @param Object {x: NNN, y: NNN} where to scroll
|
4399
|
+
* @param Object fx-options
|
4400
|
+
* @return Element this
|
4401
|
+
*/
|
4402
|
+
scroll: function(value, options) {
|
4403
|
+
return this.fx('scroll', [value, options||{}]);
|
4404
|
+
},
|
4405
|
+
|
4406
|
+
/**
|
4407
|
+
* wraps the old scroll to be able to run it with fxes
|
4408
|
+
*
|
4409
|
+
* If you send two hashes then will start a smooth scrolling
|
4410
|
+
* otherwise will just jump over with the usual method
|
4411
|
+
*
|
4412
|
+
* @return Element this
|
4413
|
+
*/
|
4414
|
+
scrollTo: function(value, options) {
|
4415
|
+
return isHash(options) ? this.scroll(value, options) : old_scroll.apply(this, arguments);
|
4416
|
+
},
|
4417
|
+
|
4418
|
+
|
4924
4419
|
// protected
|
4925
4420
|
|
4926
4421
|
// runs an Fx on the element
|
@@ -4937,3 +4432,23 @@ return {
|
|
4937
4432
|
|
4938
4433
|
}})(Element.Methods));
|
4939
4434
|
|
4435
|
+
/**
|
4436
|
+
* The old browsers support patch loading script
|
4437
|
+
* will be included in the core file when it's built
|
4438
|
+
* with the no-olds option
|
4439
|
+
*
|
4440
|
+
* Basically it just checks all the script tags on the page
|
4441
|
+
* finds the core inclusion tag and uses it's src attribute
|
4442
|
+
* to dynamically load the olds patch
|
4443
|
+
*
|
4444
|
+
* Copyright (C) 2009 Nikolay V. Nemshilov aka St.
|
4445
|
+
*/
|
4446
|
+
if (!document.querySelector) {
|
4447
|
+
(function() {
|
4448
|
+
var rigth_src_re = /(\/right)([^\/]+)$/;
|
4449
|
+
var core_src = $A(document.getElementsByTagName('script')).map('src').compact().first('match', rigth_src_re);
|
4450
|
+
if (core_src)
|
4451
|
+
document.write('<scr'+'ipt src="'+core_src.replace(rigth_src_re, '$1-olds$2')+'"></scr'+'ipt>');
|
4452
|
+
})();
|
4453
|
+
}
|
4454
|
+
|