PageSourceSearch

https://schfinder.com/DXR.axd?r=1_9-1U2pu

js schfinder.com collected 2026-10-01 15:33:00 UTC 203,180 bytes, 5,665 lines download raw bytes

1var ASPx = ASPx || {};
2var dx = dx || {};
3(function module(ASPx, dx) {
4ASPx.modules = { Utils: module };
5if(!ASPx.attachToReady)
6 ASPx.attachToReady = function (callback) { ASPx.Evt.AttachEventToElement(window, "load", callback); };
7if(!ASPx.attachToLoad)
8 ASPx.attachToLoad = function(callback) { ASPx.Evt.AttachEventToDocumentCore("DOMContentLoaded", callback); };
9ASPx.EmptyObject = { };
10ASPx.FalseFunction = function() { return false; };
11ASPx.SSLSecureBlankUrl = '/DXR.axd?r=1_86-1U2pu';
12ASPx.EmptyImageUrl = '/DXR.axd?r=1_87-1U2pu';
13ASPx.VersionInfo = 'Version=\'24.2.5.0\', File Version=\'24.2.5.0\', Date Modified=\'3/5/2025 6:17:52 AM\'';
14ASPx.Platform = 'ASP';
15ASPx.DoctypeMode = 'Xhtml';
16ASPx.InvalidDimension = -10000;
17ASPx.InvalidPosition = -10000;
18ASPx.AbsoluteLeftPosition = -10000;
19ASPx.EmptyGuid = "00000000-0000-0000-0000-000000000000";
20ASPx.CallbackSeparator = ":";
21ASPx.ItemIndexSeparator = "i";
22ASPx.CallbackResultPrefix = "/*DX*/";
23ASPx.StyleValueEncodedSemicolon = "DXsmcln";
24ASPx.AccessibilityEmptyUrl = "javascript:;";
25ASPx.AccessibilityPronounceTimeout = 500;
26ASPx.MaxMobileWindowWidth = 576;
27ASPx.PossibleNumberDecimalSeparators = [",", "."];
28ASPx.CultureInfo = {
29 twoDigitYearMax: 2029,
30 ts: ":",
31 ds: "/",
32 am: "AM",
33 pm: "PM",
34 monthNames: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "
34November", "December", ""],
35 genMonthNames: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", ""],
36 abbrMonthNames: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", ""],
37 abbrDayNames: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
38 dayNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
39 invariantCultureDecimalPoint: ".",
40 numDecimalPoint: ".",
41 numPrec: 2,
42 numGroupSeparator: ",", 
43 numGroups: [ 3 ],
44 numNegPattern: 1,
45 numPosInf: "Infinity", 
46 numNegInf: "-Infinity", 
47 numNan: "NaN",
48 currency: "$",
49 currDecimalPoint: ".",
50 currPrec: 2,
51 currGroupSeparator: ",",
52 currGroups: [ 3 ],
53 currPosPattern: 0,
54 currNegPattern: 0,
55 percentPattern: 0,
56 shortTime: "h:mm tt",
57 longTime: "h:mm:ss tt",
58 shortDate: "M/d/yyyy",
59 longDate: "dddd, MMMM d, yyyy",
60 monthDay: "MMMM d",
61 yearMonth: "MMMM yyyy"
62};
63ASPx.CultureInfo.genMonthNames = ASPx.CultureInfo.monthNames;
64ASPx.Position = {
65 Left: "Left",
66 Right: "Right",
67 Top: "Top",
68 Bottom: "Bottom"
69};
70ASPx.FOCUS_TIMEOUT = 100;
71function setInnerHtmlInternal(el, trustedHtmlString) { 
72 el.innerHTML = trustedHtmlString;
73}
74var DateUtils = { };
75DateUtils.GetInvariantDateString = function(date) {
76 if(!date)
77  return "01/01/0001";
78 var day = date.getDate();
79 var month = date.getMonth() + 1;
80 var year = date.getFullYear();
81 var result = "";
82 if(month < 10)
83  result += "0";
84 result += month.toString() + "/";
85 if(day < 10)
86  result += "0";
87 result += day.toString() + "/";
88 if(year < 1000)
89  result += "0";
90 result += year.toString();
91 return result;
92};
93DateUtils.GetInvariantDateTimeString = function(date) {
94 var dateTimeString = DateUtils.GetInvariantDateString(date);
95 var time = {
96  h: date.getHours(),
97  m: date.getMinutes(),
98  s: date.getSeconds()
99 };
100 for(var key in time) {
101  if(time.hasOwnProperty(key)) {
102   var str = time[key].toString();
103   if(str.length < 2)
104    str = "0" + str;
105   time[key] = str;
106  }
107 }
108 dateTimeString += " " + time.h + ":" + time.m + ":" + time.s;
109 var msec = date.getMilliseconds();
110 if(msec > 0)
111  dateTimeString += "." + ("000" + msec.toString()).substr(-3);
112 return dateTimeString;
113};
114DateUtils.ExpandTwoDigitYear = function(value) {
115 value += 1900;
116 if(value + 99 < ASPx.CultureInfo.twoDigitYearMax)
117  value += 100;
118 return value;  
119};
120DateUtils.GetTimeZoneOffsetDifference = function(firstDate, secondDate) {
121 if(!secondDate)
122  secondDate = DateUtils.GetUtcDate(firstDate);
123 return 60000 * (firstDate.getTimezoneOffset() - secondDate.getTimezoneOffset());
124};
125DateUtils.GetTimeZoneOffset = function(date) {
126 var isECMA262Support = (ASPx.Browser.Chrome && ASPx.Browser.Version >= 67) || ASPx.Browser.EdgeWebKit;
127 if(!isECMA262Support)
128  return date.getTimezoneOffset() * 60000;
129 var utcDate = DateUtils.GetUtcDate(date);
130 var utcTimezoneOffsetDifference = DateUtils.GetTimeZoneOffsetDifference(date);
131 if(utcTimezoneOffsetDifference !== 0)
132  utcDate.setTime(utcDate.valueOf() + utcTimezoneOffsetDifference);
133 return utcDate - date;
134};
135DateUtils.GetUtcDate = function(date) {
136 var utcFullYear = date.getUTCFullYear();
137 var result = new Date(utcFullYear, date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), date.getUTCMilliseconds());
138 if(utcFullYear < 100)
139  result.setFullYear(utcFullYear);
140 return result;
141};
142DateUtils.ToUtcTime = function(date) {
143 var result = new Date();
144 result.setTime(date.valueOf() + ASPx.DateUtils.GetTimeZoneOffset(date));
145 return result;
146};
147DateUtils.ToLocalTime = function(date) {
148 var result = new Date();
149 result.setTime(date.valueOf() - ASPx.DateUtils.GetTimeZoneOffset(date));
150 return result; 
151};
152DateUtils.AreDatesEqualExact = function(date1, date2) {
153 if(date1 == null && date2 == null)
154  return true;
155 if(date1 == null || date2 == null)
156  return false;
157 return date1.getTime() == date2.getTime(); 
158};
159DateUtils.FixTimezoneGap = function(oldDate, newDate) {
160 var diff = newDate.getHours() - oldDate.getHours();
161 if(diff == 0)
162  return;
163 var sign = (diff == 1 || diff == -23) ? -1 : 1;
164 var trial = new Date(newDate.getTime() + sign * 3600000);
165 var isDateChangedAsExpected = newDate.getHours() - trial.getHours() === diff;
166 if(isDateChangedAsExpected && (sign > 0 || trial.getDate() == newDate.getDate()))
167  newDate.setTime(trial.getTime());
168};
169DateUtils.GetDecadeStartYear = function(year) {
170 return 10 * Math.floor(year / 10);
171};
172DateUtils.GetCenturyStartYear = function(year) {
173 return 100 * Math.floor(year / 100);
174};
175DateUtils.GetCorrectedYear = function(date, pickerType) {
176 var year = date.getFullYear();
177 return pickerType != ASPx.DatePickerType.Decades ? year : DateUtils.GetDecadeStartYear(year);
178};
179DateUtils.GetCorrectedMonth = function(date, pickerType) {
180 return pickerType < ASPx.DatePickerType.Years ? date.getMonth() : 0;
181};
182DateUtils.GetCorrectedDay = function(date, pickerType) {
183 return pickerType == ASPx.DatePickerType.Days ? date.getDate() : 1;
184};
185DateUtils.CorrectDateByPickerType = function(date, pickerType) {
186 if(!ASPx.IsExists(pickerType))
187  pickerType = ASPx.DatePickerType.Days;
188 if(!date || pickerType == ASPx.DatePickerType.Days)
189  return date;
190 var correctedYear = DateUtils.GetCorrectedYear(date, pickerType);
191 var result = new Date(
192  correctedYear,
193  DateUtils.GetCorrectedMonth(date, pickerType),
194  DateUtils.GetCorrectedDay(date, pickerType),
195  date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds()
196 );
197 result.setFullYear(correctedYear);
198 return result;
199};
200DateUtils.GetYearRangeFormatString = function(startYear, rangeLength) {
201 return startYear + " - " + (startYear + rangeLength - 1);
202};
203ASPx.DateUtils = DateUtils;
204var Timer = { };
205Timer.ClearTimer = function(timerID){
206 if(timerID > -1)
207  window.clearTimeout(timerID);
208 return -1;
209};
210Timer.ClearInterval = function(timerID){
211 if(timerID > -1)
212  window.clearInterval(timerID);
213 return -1;
214};
215var setControlBoundTimer = function(handler, control, setTimerFunction, clearTimerFunction, delay) {
216 var timerId;
217 var getTimerId = function() { return timerId; };
218 var controlMainElement = control.GetMainElement();
219 var boundHandler = function() {
220  var controlExists = control && ASPx.GetControlCollection().Get(control.name) === control && control.GetMainElement() === controlMainElement;
221  if(controlExists)
222   handler.aspxBind(control)();
223  else {
224   clearTimerFunction(getTimerId());
225   controlMainElement = null;
226  }
227 };
228 timerId = setTimerFunction(boundHandler, delay);
229 return timerId;
230};
231Timer.SetControlBoundTimeout = function(handler, control, delay) {
232 return setControlBoundTimer(handler, control, window.setTimeout, Timer.ClearTimer, delay);
233};
234Timer.SetControlBoundInterval = function(handler, control, delay) {
235 return setControlBoundTimer(handler, control, window.setInterval, Timer.ClearInterval, delay);
236};
237Timer.Throttle = function(func, delay) {
238 var isThrottled = false,
239   savedArgs,
240   savedThis = this;
241 function wrapper() {
242  if(isThrottled) {
243   savedArgs = arguments;
244   savedThis = this;
245   return;
246  }
247  func.apply(this, arguments);
248  isThrottled = true;
249  setTimeout(function() {
250   isThrottled = false;
251   if(savedArgs) {
252    wrapper.apply(savedThis, savedArgs);
253    savedArgs = null;
254   }
255  }, delay);
256 }
257 wrapper.cancel = function() {
258  clearTimeout(delay);
259  delay = savedArgs = savedThis = null;
260 };
261 return wrapper;
262};
263ASPx.Timer = Timer;
264var Browser = { };
265Browser.UserAgent = navigator.userAgent.toLowerCase();
266Browser.Mozilla = false;
267Browser.IE = false;
268Browser.Firefox = false;
269Browser.Netscape = false;
270Browser.Safari = false;
271Browser.Chrome = false;
272Browser.Opera = false;
273Browser.Edge = false;
274Browser.EdgeWebKit = false;
275Browser.Version = undefined; 
276Browser.MajorVersion = undefined; 
277Browser.WindowsPlatform = false;
278Browser.MacOSPlatform = false;
279Browser.MacOSMobilePlatform = false;
280Browser.AndroidMobilePlatform = false;
281Browser.PlaformMajorVersion = false;
282Browser.WindowsPhonePlatform = false;
283Browser.AndroidDefaultBrowser = false;
284Browser.AndroidChromeBrowser = false;
285Browser.SamsungAndroidDevice = false;
286Browser.WebKitTouchUI = false;
287Browser.MSTouchUI = false;
288Browser.TouchUI = false;
289Browser.WebKitFamily = false; 
290Browser.NetscapeFamily = false; 
291Browser.VirtualKeyboardSupported = false;
292Browser.Info = "";
293Browser.IsQuirksMode = document.compatMode === "BackCompat";
294function indentPlatformMajorVersion(userAgent) {
295 var regex = /(?:(?:windows nt|macintosh|mac os|cpu os|cpu iphone os|android|windows phone|linux) )(\d+)(?:[-0-9_.])*/;
296 var matches = regex.exec(userAgent);
297 if(matches)
298  Browser.PlaformMajorVersion = matches[1];
299}
300function getIECompatibleVersionString() {
301 if(document.compatible) {
302  for(var i = 0; i < document.compatible.length; i++)
303   if(document.compatible[i].userAgent === "IE" && document.compatible[i].version)
304    return document.compatible[i].version.toLowerCase();
305 }
306 return "";
307}
308Browser.IdentUserAgent = function(userAgent, ignoreDocumentMode) {
309 var browserTypesOrderedList = ["Mozilla", "IE", "Firefox", "Netscape", "Safari", "Chrome", "Opera", "Opera10", "EdgeWebKit", "Edge" ];
310 var defaultBrowserType = "IE";
311 var defaultPlatform = "Win";
312 var defaultVersions = { Safari: 2, Chrome: 0.1, Mozilla: 1.9, Netscape: 8, Firefox: 2, Opera: 9, IE: 6, Edge: 12 };
313 if(!userAgent || userAgent.length == 0) {
314  fillUserAgentInfo(browserTypesOrderedList, defaultBrowserType, defaultVersions[defaultBrowserType], defaultPlatform);
315  return;
316 }
317 userAgent = userAgent.toLowerCase();
318 indentPlatformMajorVersion(userAgent);
319 try {
320  var platformIdentStrings = {
321   "Windows": "Win",
322   "Macintosh": "Mac",
323   "Mac OS": "Mac",
324   "Mac_PowerPC": "Mac",
325   "cpu os": "MacMobile",
326   "cpu iphone os": "MacMobile",
327   "Android": "Android",
328   "!Windows Phone": "WinPhone",
329   "!WPDesktop": "WinPhone",
330   "!ZuneWP": "WinPhone"
331  };
332  var optSlashOrSpace = "(?:/|\\s*)?";
333  var version = "(\\d+)(?:\\.((?:\\d+?[1-9])|\\d)0*?)?";
334  var optComma = "(?:,)?";
335  var appleVersion = "(\\d+)(?:\\.((?:\\d+?[1-9])|\\d)" + optComma + "0*?)?"; 
336  var optVersion = "(?:" + version + ")?";
337  var patterns = {
338   Safari: "applewebkit(?:.*?(?:version/" + appleVersion + "[\\.\\w\\d]*?(?:\\s+mobile\/\\S*)?\\s+safari))?",
339   Chrome: "(?:chrome|crios)(?!frame)" + optSlashOrSpace + optVersion,
340   Mozilla: "mozilla(?:.*rv:" + optVersion + ".*Gecko)?",
341   Netscape: "(?:netscape|navigator)\\d*/?\\s*" + optVersion,
342   Firefox: "firefox" + optSlashOrSpace + optVersion,
343   Opera: "(?:opera|\sopr)" + optSlashOrSpace + optVersion,
344   Opera10: "opera.*\\s*version" + optSlashOrSpace + optVersion,
345   IE: "msie\\s*" + optVersion,
346   EdgeWebKit: "edg" + optSlashOrSpace + optVersion,
347   Edge: "edge" + optSlashOrSpace + optVersion
348  };
349  var browserType;
350  var version = -1;
351  for(var i = 0; i < browserTypesOrderedList.length; i++) {
352   var browserTypeCandidate = browserTypesOrderedList[i];
353   var regExp = new RegExp(patterns[browserTypeCandidate], "i");
354   if(regExp.compile)
355    regExp.compile(patterns[browserTypeCandidate], "i");
356   var matches = regExp.exec(userAgent);
357   if(matches && matches.index >= 0) {
358    if(browserType == "IE" && version >= 11 && browserTypeCandidate == "Safari") 
359     continue;
360    browserType = browserTypeCandidate;
361    if(browserType == "Opera10")
362     browserType = "Opera";
363    var tridentPattern = "trident" + optSlashOrSpace + optVersion;
364    version = Browser.GetBrowserVersion(userAgent, matches, tridentPattern, getIECompatibleVersionString());
365    if(browserType == "Mozilla" && version >= 11)
366     browserType = "IE";
367   }
368  }
369  if(!browserType)
370   browserType = defaultBrowserType;
371  var browserVersionDetected = version != -1;
372  if(!browserVersionDetected)
373   version = defaultVersions[browserType];
374  var platform;
375  var minOccurenceIndex = Number.MAX_VALUE;
376  for(var identStr in platformIdentStrings) {
377   if(!platformIdentStrings.hasOwnProperty(identStr)) continue;
378   var importantIdent = identStr.substr(0,1) == "!";
379   var occurenceIndex = userAgent.indexOf((importantIdent ? identStr.substr(1) : identStr).toLowerCase());
380   if(occurenceIndex >= 0 && (occurenceIndex < minOccurenceIndex || importantIdent)) {
381    minOccurenceIndex = importantIdent ? 0 : occurenceIndex;
382    platform = platformIdentStrings[identStr];
383   }
384  }
385  var samsungPattern = "SM-[A-Z]";
386  var matches = userAgent.toUpperCase().match(samsungPattern);
387  var isSamsungAndroidDevice = matches && matches.length > 0;
388  if(platform == "WinPhone" && version < 9)
389   version = Math.floor(getVersionFromTrident(userAgent, "trident" + optSlashOrSpace + optVersion));
390  if(!ignoreDocumentMode && browserType == "IE" && version > 7 && document.documentMode < version)
391   version = document.documentMode;
392  if(platform == "WinPhone")
393   version = Math.max(9, version);
394  if(!platform)
395   platform = defaultPlatform;
396  if(platform == platformIdentStrings["cpu os"] && !browserVersionDetected) 
397   version = 4;
398  fillUserAgentInfo(browserTypesOrderedList, browserType, version, platform, isSamsungAndroidDevice);
399 } catch(e) {
400  fillUserAgentInfo(browserTypesOrderedList, defaultBrowserType, defaultVersions[defaultBrowserType], defaultPlatform);
401 }
402};
403function getVersionFromMatches(matches) {
404 var result = -1;
405 var versionStr = "";
406 if(matches[1]) {
407  versionStr += matches[1];
408  if(matches[2])
409   versionStr += "." + matches[2];
410 }
411 if(versionStr != "") {
412  result = parseFloat(versionStr);
413  if(isNaN(result))
414   result = -1;
415 }
416 return result;
417}
418function getVersionFromTrident(userAgent, tridentPattern) {
419 var tridentDiffFromVersion = 4;
420 var matches = new RegExp(tridentPattern, "i").exec(userAgent);
421 return getVersionFromMatches(matches) + tridentDiffFromVersion;
422}
423Browser.GetBrowserVersion = function(userAgent, matches, tridentPattern, ieCompatibleVersionString) {
424 var version = getVersionFromMatches(matches);
425 if(ieCompatibleVersionString) {
426  var versionFromTrident = getVersionFromTrident(userAgent, tridentPattern);
427  if(ieCompatibleVersionString === "edge" || parseInt(ieCompatibleVersionString) === versionFromTrident)
428   return versionFromTrident;
429 }
430 return version;
431};
432function fillUserAgentInfo(browserTypesOrderedList, browserType, version, platform, isSamsungAndroidDevice) {
433 for(var i = 0; i < browserTypesOrderedList.length; i++) {
434  var type = browserTypesOrderedList[i];
435  Browser[type] = type == browserType;
436 }
437 Browser.Version = Math.floor(10.0 * version) / 10.0;
438 Browser.MajorVersion = Math.floor(Browser.Version);
439 Browser.WindowsPlatform = platform == "Win" || platform == "WinPhone";
440 Browser.MacOSPlatform = platform == "Mac";
441 var isMacWithTouchSupport = platform == "Mac" && (!!window.ontouchstart || getMaxTouchPoints() > 0); 
442 Browser.MacOSMobilePlatform = platform == "MacMobile" || isMacWithTouchSupport;
443 if(Browser.MacOSMobilePlatform)
444  Browser.MacOSPlatform = false;
445 Browser.AndroidMobilePlatform = platform == "Android";
446 Browser.WindowsPhonePlatform = platform == "WinPhone";
447 Browser.WebKitFamily = Browser.Safari || Browser.Chrome || Browser.Opera && Browser.MajorVersion >= 15 || Browser.EdgeWebKit;
448 Browser.NetscapeFamily = Browser.Netscape || Browser.Mozilla || Browser.Firefox;
449 Browser.WebKitTouchUI = Browser.MacOSMobilePlatform || Browser.AndroidMobilePlatform;
450 var isIETouchUI = Browser.IE && Browser.MajorVersion > 9 && Browser.WindowsPlatform && Browser.UserAgent.toLowerCase().indexOf("touch") >= 0;
451 Browser.MSTouchUI = isIETouchUI || ((Browser.Edge || (Browser.EdgeWebKit && !Browser.AndroidMobilePlatform)) && !!getMaxTouchPoints());
452 Browser.TouchUI = Browser.WebKitTouchUI || Browser.MSTouchUI;
453 Browser.MobileUI = Browser.WebKitTouchUI || Browser.WindowsPhonePlatform;
454 Browser.AndroidDefaultBrowser = Browser.AndroidMobilePlatform && !Browser.Chrome;
455 Browser.AndroidChromeBrowser = Browser.AndroidMobilePlatform && Browser.Chrome;
456 if(isSamsungAndroidDevice)
457  Browser.SamsungAndroidDevice = isSamsungAndroidDevice;
458 if(Browser.MSTouchUI) {
459  var isARMArchitecture = Browser.UserAgent.toLowerCase().indexOf("arm;") > -1;    
460  Browser.VirtualKeyboardSupported = isARMArchitecture || Browser.WindowsPhonePlatform;   
461 } else {
462  Browser.VirtualKeyboardSupported = Browser.MobileUI;
463 }
464 fillDocumentElementBrowserTypeClassNames(browserTypesOrderedList);
465}
466function getMaxTouchPoints() { 
467 var result = navigator.maxTouchPoints;
468 if(window.testingTouchMode)
469  result = 10;
470 return result;
471}
472function fillDocumentElementBrowserTypeClassNames(browserTypesOrderedList) {
473 var documentElementClassName = "";
474 var browserTypeslist = browserTypesOrderedList.concat(["WindowsPlatform", "MacOSPlatform", "MacOSMobilePlatform", "AndroidMobilePlatform",
475   "WindowsPhonePlatform", "WebKitFamily", "WebKitTouchUI", "MSTouchUI", "TouchUI", "AndroidDefaultBrowser", "MobileUI"]);
476 for(var i = 0; i < browserTypeslist.length; i++) {
477  var type = browserTypeslist[i];
478  if(Browser[type])
479   documentElementClassName += "dx" + type + " ";
480 }
481 documentElementClassName += "dxBrowserVersion-" + Browser.MajorVersion;
482 if(document && document.documentElement) {
483  if(document.documentElement.className != "")
484   documentElementClassName = " " + documentElementClassName;
485  document.documentElement.className += documentElementClassName;
486  Browser.Info = documentElementClassName;
487 }
488}
489Browser.SupportsStickyPositioning = function() {
490 return this.Chrome && this.MajorVersion >= 56
491  || this.Firefox && this.MajorVersion >= 32
492  || this.Safari && this.MajorVersion >= 6 && this.Version !== "6"
493  || this.Opera && this.MajorVersion >= 42;
494};
495Browser.IdentUserAgent(Browser.UserAgent);
496ASPx.Browser = Browser;
497ASPx.BlankUrl = Browser.Opera ? "about:blank" : "";
498ASPx.FillDocumentElementDXThemeCssClassName = function(dxThemeName) {
499 ASPx.AddClassNameToElement(document.documentElement, "dxTheme-" + dxThemeName);
500};
501var Data = { };
502Data.ArrayInsert = function(array, element, position){
503 if(0 <= position && position < array.length){
504  for(var i = array.length; i > position; i --)
505   array[i] = array[i - 1];
506  array[position] = element;
507 }
508 else
509  array.push(element);
510};
511Data.ArrayRemove = function(array, element){
512 var index = Data.ArrayIndexOf(array, element);
513 if(index > -1) Data.ArrayRemoveAt(array, index);
514};
515Data.ArrayRemoveAt = function(array, index){
516 if(index >= 0  && index < array.length){
517  for(var i = index; i < array.length - 1; i++)
518   array[i] = array[i + 1];
519  array.pop();
520 }
521};
522Data.ArrayClear = function(array){
523 while(array.length > 0)
524  array.pop();
525};
526Data.ArrayIndexOf = function(array, element, comparer) {
527 if(!comparer) {
528  for(var i = 0; i < array.length; i++) {
529   if(array[i] == element)
530    return i;
531  }
532 } else {
533  for(var i = 0; i < array.length; i++) {
534   if(comparer(array[i], element))
535    return i;
536  }
537 }
538 return -1;
539};
540Data.ArrayContains = function(array, element) { 
541 return Data.ArrayIndexOf(array, element) >= 0;
542};
543Data.ArrayEqual = function(array1, array2) {
544 var count1 = array1.length;
545 var count2 = array2.length;
546 if(count1 != count2)
547  return false;
548 for(var i = 0; i < count1; i++)
549  if(array1[i] != array2[i])
550   return false;
551 return true;
552};
553Data.ArraySame = function(array1, array2) {
554 if(array1.length !== array2.length)
555  return false;
556 return array1.every(function(elem) { return Data.ArrayContains(array2, elem); });
557};
558Data.ArrayGetIntegerEdgeValues = function(array) {
559 var arrayToSort = Data.CollectionToArray(array);
560 Data.ArrayIntegerAscendingSort(arrayToSort);
561 return {
562  start: arrayToSort[0],
563  end: arrayToSort[arrayToSort.length - 1]
564 };
565};
566Data.ArrayIntegerAscendingSort = function(array){
567 Data.ArrayIntegerSort(array);
568};
569Data.ArrayIntegerSort = function(array, desc) {
570 array.sort(function(i1, i2) {
571  var res = 0;
572  if(i1 > i2)
573   res = 1;
574  else if(i1 < i2)
575   res = -1;
576  if(desc)
577   res *= -1;
578  return res;
579 });
580};
581Data.CollectionsUnionToArray = function(firstCollection, secondCollection) {
582 var result = [];
583 var firstCollectionLength = firstCollection.length;
584 var secondCollectionLength = secondCollection.length;
585 for(var i = 0; i < firstCollectionLength + secondCollectionLength; i++) {
586  if(i < firstCollectionLength)
587   result.push(firstCollection[i]);
588  else
589   result.push(secondCollection[i - firstCollectionLength]);
590 }
591 return result;
592};
593Data.CollectionToArray = function(collection) {
594 var array = [];
595 for(var i = 0; i < collection.length; i++)
596  array.push(collection[i]);
597 return array;
598};
599Data.CreateHashTableFromArray = function(array) {
600 var hash = [];
601 for(var i = 0; i < array.length; i++)
602  hash[array[i]] = 1;
603 return hash;
604};
605Data.CreateIndexHashTableFromArray = function(array) {
606 var hash = [];
607 for(var i = 0; i < array.length; i++)
608  hash[array[i]] = i;
609 return hash;
610};
611Data.ArrayToHash = function(array, getKeyFunc, getValueFunc) {
612 if(!(array instanceof Array)) 
613  return { };
614 return array.reduce(function(map, element, index) { 
615  var key = getKeyFunc(element, index);
616  var value = getValueFunc(element, index);
617  map[key] = value;
618  return map; 
619 }, { });
620};
621Data.Sum = function(array, getValueFunc) {
622 if(!(array instanceof Array)) 
623  return 0;
624 return array.reduce(function(prevValue, item) {
625  var value = getValueFunc ? getValueFunc(item) : item;
626  if(!ASPx.IsNumber(value))
627   value = 0;
628  return prevValue + value;
629 }, 0);
630};
631Data.Min = function(array, getValueFunc) { return CalculateArrayMinMax(array, getValueFunc, false); };
632Data.Max = function(array, getValueFunc) { return CalculateArrayMinMax(array, getValueFunc, true); };
633var CalculateArrayMinMax = function(array, getValueFunc, isMax) {
634 if(!(array instanceof Array)) 
635  return 0;
636 var startValue = isMax ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY;
637 return array.reduce(function(prevValue, item) {
638  var value = getValueFunc ? getValueFunc(item) : item;
639  if(!ASPx.IsNumber(value))
640   value = startValue;
641  var func = isMax ? Math.max : Math.min;
642  return func(value, prevValue);
643 }, startValue);
644};
645var defaultBinarySearchComparer = function(array, index, value) {
646 var arrayElement = array[index];
647 if(arrayElement == value)
648  return 0;
649 else
650  return arrayElement < value ? -1 : 1;
651};
652Data.NearestLeftBinarySearchComparer = function(array, index, value) { 
653 var arrayElement = array[index];
654 var leftPoint = arrayElement < value;
655 var lastLeftPoint = leftPoint && index == array.length - 1;
656 var nearestLeftPoint = lastLeftPoint || (leftPoint && array[index + 1] >= value);
657 if(nearestLeftPoint)
658  return 0;
659 else
660  return arrayElement < value ? -1 : 1;
661};
662Data.ArrayBinarySearch = function(array, value, binarySearchComparer, startIndex, length) {
663 if(!binarySearchComparer)
664  binarySearchComparer = defaultBinarySearchComparer;
665 if(!ASPx.IsExists(startIndex))
666  startIndex = 0;
667 if(!ASPx.IsExists(length))
668  length = array.length - startIndex;
669 var endIndex = (startIndex + length) - 1;
670 while(startIndex <= endIndex) {
671  var middle = (startIndex + ((endIndex - startIndex) >> 1));
672  var compareResult = binarySearchComparer(array, middle, value);
673  if(compareResult == 0)
674   return middle;
675  if(compareResult < 0)
676   startIndex = middle + 1;
677  else
678   endIndex = middle - 1;
679 }
680 return -(startIndex + 1);
681};
682Data.ArrayFlatten = function(arrayOfArrays) {
683 return [].concat.apply([], arrayOfArrays);
684};
685Data.GetDistinctArray = function(array) {
686 var resultArray = [];
687 for(var i = 0; i < array.length; i++) {
688  var currentEntry = array[i];
689  if(Data.ArrayIndexOf(resultArray, currentEntry) == -1) {
690   resultArray.push(currentEntry);
691  }
692 }
693 return resultArray;
694};
695Data.ForEach = function(arr, callback) {
696 if(Array.prototype.forEach) {
697  Array.prototype.forEach.call(arr, callback);
698 } else {
699  for(var i = 0, len = arr.length; i < len; i++) {
700   callback(arr[i], i, arr);
701  }
702 }
703};
704Data.MergeHashTables = function(target, object) {
705 if(!object || typeof (object) == "string")
706  return target;
707 if(!target)
708  target = {};
709 for(var key in object)
710  if(key && !(key in target))
711   target[key] = object[key];
712 return target;
713};
714Data.Range = function(count, start) {
715 count = parseInt(count) || 0;
716 start = parseInt(start) || 0;
717 if(count < 0) count = 0;
718 if(start < 0) start = 0;
719 return Array.apply(null, Array(count)).map(function(val, i) { return start + i; });
720};
721ASPx.Data = Data;
722var Cookie = { };
723Cookie.DelCookie = function(name){
724 setCookieInternal(name, "", new Date(1970, 1, 1));
725};
726Cookie.GetCookie = function(name) {
727 name = escape(name);
728 var cookies = document.cookie.split(';');
729 for(var i = 0; i < cookies.length; i++) {
730  var cookie = Str.Trim(cookies[i]);
731  if(cookie.indexOf(name + "=") == 0)
732   return unescape(cookie.substring(name.length + 1, cookie.length));
733  else if(cookie.indexOf(name + ";") == 0 || cookie === name)
734   return "";
735 }
736 return null;
737};
738Cookie.SetCookie = function(name, value, expirationDate){
739 if(!ASPx.IsExists(value)) {
740  Cookie.DelCookie(name);
741  return;
742 }
743 if(!ASPx.Ident.IsDate(expirationDate)) {
744  expirationDate = new Date();
745  expirationDate.setFullYear(expirationDate.getFullYear() + 1);
746 }
747 setCookieInternal(name, value, expirationDate);
748};
749function setCookieInternal(name, value, date){
750 document.cookie = escape(name) + "=" + escape(value.toString()) + "; expires=" + date.toGMTString() + "; path=/";
751}
752ASPx.Cookie = Cookie;
753ASPx.ImageUtils = {
754 GetImageSrc: function (image){
755  return image.src;
756 },
757 SetImageSrc: function(image, src){
758  image.src = src;
759 },
760 SetSize: function(image, width, height){
761  image.style.width = width + "px";
762  image.style.height = height + "px";
763 },
764 GetSize: function(image, isWidth) {
765  return (isWidth ? ASPx.GetElementOffsetWidth(image) : ASPx.GetElementOffsetHeight(image));
766 }
767};
768var Str = { };
769Str.ApplyReplacement = function(text, replecementTable) {
770 if(typeof(text) != "string")
771  text = text.toString();
772 for(var i = 0; i < replecementTable.length; i++) {
773  var replacement = replecementTable[i];
774  text = text.replace(replacement[0], replacement[1]);
775 }
776 return text;
777};
778Str.CompleteReplace = function(text, regexp, newSubStr) {
779 if(typeof(text) != "string")
780  text = text.toString();
781 var textPrev;
782 do {
783  textPrev = text;
784  text = text.replace(regexp, newSubStr);
785 } while(text != textPrev);
786 return text;
787};
788Str.EncodeHtml = function(html) {
789 return Str.ApplyReplacement(html, [
790  [ /&amp;/g,  '&ampx;'  ], [ /&/g, '&amp;'  ],
791  [ /&quot;/g, '&quotx;' ], [ /"/g, '&quot;' ],
792  [ /&lt;/g,   '&ltx;'   ], [ /</g, '&lt;'   ],
793  [ /&gt;/g,   '&gtx;'   ], [ />/g, '&gt;'   ]
794 ]);
795};
796Str.DecodeHtml = function(html) {
797 return Str.ApplyReplacement(html, [
798  [ /&gt;/g,   '>' ], [ /&gtx;/g,  '&gt;'   ],
799  [ /&lt;/g,   '<' ], [ /&ltx;/g,  '&lt;'   ],
800  [ /&quot;/g, '"' ], [ /&quotx;/g,'&quot;' ],
801  [ /&amp;/g,  '&' ], [ /&ampx;/g, '&amp;'  ]
802 ]);
803};
804Str.DecodeHtmlViaTextArea = function(html) {
805 var textArea = document.createElement("TEXTAREA");
806 setInnerHtmlInternal(textArea, html);
807 return textArea.value;
808};
809Str.TrimStart = function(str) { 
810 return trimInternal(str, true);
811};
812Str.TrimEnd = function(str) { 
813 return trimInternal(str, false, true);
814};
815Str.Trim = function(str) { 
816 return trimInternal(str, true, true); 
817};
818Str.EscapeForRegEx = function(str) {
819 return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
820};
821var whiteSpaces = { 
822 0x0009: 1, 0x000a: 1, 0x000b: 1, 0x000c: 1, 0x000d: 1, 0x0020: 1, 0x0085: 1, 
823 0x00a0: 1, 0x1680: 1, 0x180e: 1, 0x2000: 1, 0x2001: 1, 0x2002: 1, 0x2003: 1, 
824 0x2004: 1, 0x2005: 1, 0x2006: 1, 0x2007: 1, 0x2008: 1, 0x2009: 1, 0x200a: 1, 
825 0x200b: 1, 0x2028: 1, 0x2029: 1, 0x202f: 1, 0x205f: 1, 0x3000: 1, 0xfeff: 1
826};
827var caretWidth = 1;
828function trimInternal(source, trimStart, trimEnd) {
829 var len = source.length;
830 if(!len)
831  return source;
832 var result = "";
833 if(len < 0xBABA1) 
834  result = trimSource(source, trimStart, trimEnd);
835 else
836  result = trimLargeSource(source, len, trimStart, trimEnd);
837 return Str.ClearString(result);
838}
839function trimSource(source, trimStart, trimEnd) {
840 var result = source;
841 if(trimStart)
842  result = result.replace(/^\s+/, "");
843 if(trimEnd)
844  result = result.replace(/\s+$/, "");
845 return result;
846}
847function trimLargeSource(source, len, trimStart, trimEnd) {
848 var start = 0;
849 if(trimEnd) {
850  while(len > 0 && whiteSpaces[source.charCodeAt(len - 1)]) {
851   len--;
852  }
853 }
854 if(trimStart && len > 0) {
855  while(start < len && whiteSpaces[source.charCodeAt(start)]) {
856   start++;
857  }
858 }
859 return source.substring(start, len);
860}
861var inlineStringLength = 12;
862Str.ClearString = function(str) { 
863 if(!ASPx.Browser.Chrome)
864  return str;
865 return str.length < inlineStringLength ? str : JSON.parse(JSON.stringify(str));
866};
867Str.Insert = function(str, subStr, index) { 
868 var leftText = str.slice(0, index);
869 var rightText = str.slice(index);
870 return leftText + subStr + rightText;
871};
872Str.InsertEx = function(str, subStr, startIndex, endIndex) { 
873 var leftText = str.slice(0, startIndex);
874 var rightText = str.slice(endIndex);
875 return leftText + subStr + rightText;
876};
877var greekSLFSigmaChar = String.fromCharCode(962);
878var greekSLSigmaChar = String.fromCharCode(963);
879Str.PrepareStringForFilter = function(s, saveCaseSensitive){
880 if(!saveCaseSensitive)
881  s = s.toLowerCase();
882 if(ASPx.Browser.WebKitFamily) {
883  return s.replace(new RegExp(greekSLFSigmaChar, "g"), greekSLSigmaChar);
884 }
885 return s;
886};
887Str.GetCoincideCharCount = function(text, filter, textMatchingDelegate) {
888 var coincideText = ASPx.Str.PrepareStringForFilter(filter);
889 var originText = ASPx.Str.PrepareStringForFilter(text);
890 while(coincideText != "" && !textMatchingDelegate(originText, coincideText)) {
891  coincideText = coincideText.slice(0, -1);
892 }
893 return coincideText.length;
894};
895Str.EndsWith = function(str, suffix) {
896 return str.indexOf(suffix, str.length - suffix.length) !== -1;
897};
898ASPx.Str = Str;
899var Xml = { };
900Xml.Parse = function(xmlStr) {
901 if(window.DOMParser) {
902  var parser = new DOMParser();
903  return parser.parseFromString(xmlStr, "text/xml");
904 }
905 else if(window.ActiveXObject) {
906  var xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM");
907  if(xmlDoc) {
908   xmlDoc.async = false;
909   xmlDoc.loadXML(xmlStr);
910   return xmlDoc;
911  }
912 }
913 return null;
914};
915ASPx.Xml = Xml;
916ASPx.Key = {
917 F1     : 112,
918 F2     : 113,
919 F3     : 114,
920 F4     : 115,
921 F5     : 116,
922 F6     : 117,
923 F7     : 118,
924 F8     : 119,
925 F9     : 120,
926 F10    : 121,
927 F11    : 122,
928 F12    : 123,
929 Ctrl   : 17,
930 Shift  : 16,
931 Alt    : 18,
932 Enter  : 13,
933 Home   : 36,
934 End    : 35,
935 Left   : 37,
936 Right  : 39,
937 Up     : 38,
938 Down   : 40,
939 PageUp    : 33,
940 PageDown  : 34,
941 Esc    : 27,
942 Space  : 32,
943 Tab    : 9,
944 Backspace : 8,
945 Delete    : 46,
946 Insert    : 45,
947 ContextMenu  : 93,
948 Windows   : 91,
949 Decimal   : 110,
950 CapsLock  : 20
951};
952ASPx.ModifierKey = {
953 None: 0,
954 Ctrl: 1 << (0 + 16),
955 Shift: 1 << (2 + 16),
956 Alt: 1 << (4 + 16),
957 Meta: 1 << (8 + 16)
958};
959ASPx.KeyCode = {
960 Backspace : 8,
961 Tab    : 9,
962 Enter  : 13,
963 Pause  : 19,
964 CapsLock  : 20,
965 Esc    : 27,
966 Space  : 32,
967 PageUp    : 33,
968 PageDown  : 34,
969 End    : 35,
970 Home   : 36,
971 Left   : 37,
972 Up     : 38,
973 Right  : 39,
974 Down   : 40,
975 Insert    : 45,
976 Delete    : 46,
977 Key_0  : 48,
978 Key_1  : 49,
979 Key_2  : 50,
980 Key_3  : 51,
981 Key_4  : 52,
982 Key_5  : 53,
983 Key_6  : 54,
984 Key_7  : 55,
985 Key_8  : 56,
986 Key_9  : 57,
987 Key_a  : 65,
988 Key_b  : 66,
989 Key_c  : 67,
990 Key_d  : 68,
991 Key_e  : 69,
992 Key_f  : 70,
993 Key_g  : 71,
994 Key_h  : 72,
995 Key_i  : 73,
996 Key_j  : 74,
997 Key_k  : 75,
998 Key_l  : 76,
999 Key_m  : 77,
1000 Key_n  : 78,
1001 Key_o  : 79,
1002 Key_p  : 80,
1003 Key_q  : 81,
1004 Key_r  : 82,
1005 Key_s  : 83,
1006 Key_t  : 84,
1007 Key_u  : 85,
1008 Key_v  : 86,
1009 Key_w  : 87,
1010 Key_x  : 88,
1011 Key_y  : 89,
1012 Key_z  : 90,
1013 Windows   : 91,
1014 ContextMenu  : 93,
1015 Numpad_0  : 96,
1016 Numpad_1  : 97,
1017 Numpad_2  : 98,
1018 Numpad_3  : 99,
1019 Numpad_4  : 100,
1020 Numpad_5  : 101,
1021 Numpad_6  : 102,
1022 Numpad_7  : 103,
1023 Numpad_8  : 104,
1024 Numpad_9  : 105,
1025 Multiply  : 106,
1026 Add    : 107,
1027 Subtract  : 109,
1028 Decimal   : 110,
1029 Divide    : 111,
1030 F1     : 112,
1031 F2     : 113,
1032 F3     : 114,
1033 F4     : 115,
1034 F5     : 116,
1035 F6     : 117,
1036 F7     : 118,
1037 F8     : 119,
1038 F9     : 120,
1039 F10    : 121,
1040 F11    : 122,
1041 F12    : 123,
1042 NumLock   : 144,
1043 ScrollLock   : 145,
1044 Semicolon : 186,
1045 Equals    : 187,
1046 Comma  : 188,
1047 Dash   : 189,
1048 Period    : 190,
1049 ForwardSlash : 191,
1050 GraveAccent  : 192,
1051 OpenBracket  : 219,
1052 BackSlash : 220,
1053 CloseBracket : 221,
1054 SingleQuote  : 222
1055};
1056ASPx.ScrollBarMode = { Hidden: 0, Visible: 1, Auto: 2 };
1057ASPx.ColumnResizeMode = { None: 0, Control: 1, NextColumn: 2 };
1058var Selection = { };
1059Selection.Set = function(input, startPos, endPos, scrollToSelection, isApi) {
1060 if(!ASPx.IsExistsElement(input))
1061  return;
1062 var isInputFocused = ASPx.GetActiveElement() === input;
1063 var isInputNativeFocusLocked = ASPx.VirtualKeyboardUI.getInputNativeFocusLocked();
1064 if(!isApi && Browser.VirtualKeyboardSupported && (!isInputFocused || isInputNativeFocusLocked))
1065  return;
1066 var textLen = input.value.length;
1067 startPos = ASPx.GetDefinedValue(startPos, 0);
1068 endPos = ASPx.GetDefinedValue(endPos, textLen);
1069 if(startPos < 0)
1070  startPos = 0;
1071 if(endPos < 0 || endPos > textLen)
1072  endPos = textLen;
1073 if(startPos > endPos)
1074  startPos = endPos;
1075 var makeReadOnly = false;
1076 if(Browser.WebKitFamily && input.readOnly) {
1077  input.readOnly = false;
1078  makeReadOnly = true;
1079 }
1080 try {
1081  if(Browser.Firefox && Browser.Version >= 8) 
1082   input.setSelectionRange(startPos, endPos, "backward");
1083  else {
1084   forceScrollToSelectionRange(input, startPos, endPos);
1085   input.setSelectionRange(startPos, endPos);
1086  }
1087  if(Browser.Opera || Browser.Firefox || Browser.Chrome || Browser.Edge || Browser.EdgeWebKit) 
1088   input.focus();
1089 } catch(e) { }
1090 if(scrollToSelection && input.tagName == 'TEXTAREA') {
1091  var scrollHeight = input.scrollHeight;
1092  var approxCaretPos = startPos;
1093  var scrollTop = Math.max(Math.round(approxCaretPos * scrollHeight / textLen  - input.clientHeight / 2), 0);
1094  input.scrollTop = scrollTop;
1095 }
1096 if(makeReadOnly)
1097  input.readOnly = true;
1098};
1099var getTextWidthBeforePos = function(input, pos) {
1100 return ASPx.GetSizeOfText(input.value.toString().substr(0, pos), ASPx.GetCurrentStyle(input)).width;
1101};
1102var forceScrollToSelectionRange = function(input, startPos, endPos) {
1103 if(endPos === input.value.length)
1104  input.scrollLeft = input.scrollWidth;
1105 else if(startPos === 0 && endPos === 0)
1106  input.scrollLeft = 0;
1107 else {
1108  var inputRawWidth = ASPx.GetElementOffsetWidth(input) - ASPx.GetLeftRightBordersAndPaddingsSummaryValue(input);
1109  if(inputRawWidth < input.scrollWidth) {
1110   var widthBeforeEndPos = getTextWidthBeforePos(input, endPos) + caretWidth;
1111   if(input.scrollLeft < widthBeforeEndPos - inputRawWidth)
1112    input.scrollLeft = widthBeforeEndPos - inputRawWidth;
1113   else {
1114    var widthBeforeStartPos = getTextWidthBeforePos(input, startPos) - caretWidth;
1115    if(input.scrollLeft > widthBeforeStartPos)
1116     input.scrollLeft = widthBeforeStartPos;
1117   }
1118  }
1119 }
1120};
1121Selection.GetInfo = function(input) {
1122 var start, end;
1123 try {
1124  start = input.selectionStart;
1125  end = input.selectionEnd;
1126 } catch (e) {
1127 }
1128 return { startPos: start, endPos: end };
1129};
1130Selection.GetExtInfo = function(input) {
1131 var start = 0, end = 0;
1132 try {
1133  start = input.selectionStart;
1134  end = input.selectionEnd;
1135 } catch (e) {
1136 }
1137 return {startPos: start, endPos: end}; 
1138};
1139Selection.SetCaretPosition = function(input, caretPos) {
1140 if(typeof caretPos === "undefined" || caretPos < 0)
1141  caretPos = input.value.length;
1142 Selection.Set(input, caretPos, caretPos, true);
1143};
1144Selection.GetCaretPosition = function(element, isDialogMode) {
1145 var pos = 0;
1146 if("selectionStart" in element) {
1147  pos = element.selectionStart;
1148 } else if("selection" in document) {
1149  element.focus();
1150  var sel = document.selection.createRange(),
1151   selLength = document.selection.createRange().text.length;
1152  sel.moveStart("character", -element.value.length);
1153  pos = sel.text.length - selLength;
1154 }
1155 if(isDialogMode && !pos) {
1156  pos = element.value.length - 1;
1157 }
1158 return pos;
1159};
1160Selection.Clear = function() {
1161 try {
1162  if(window.getSelection) {
1163   window.getSelection().removeAllRanges();
1164  }
1165  else if(document.selection) {
1166   if(document.selection.empty)
1167    document.selection.empty();
1168   else if(document.selection.clear)
1169    document.selection.clear();
1170  }
1171 } catch(e) {
1172 }
1173};
1174Selection.ClearOnMouseMove = function(evt) {
1175 Selection.Clear();
1176};
1177Selection.SetElementSelectionEnabled = function(element, value) {
1178 var userSelectValue = value ? "" : "none";
1179 var func = value ? Evt.DetachEventFromElement : Evt.AttachEventToElement;
1180 if(Browser.Firefox)
1181  element.style.MozUserSelect = userSelectValue;
1182 else if(Browser.WebKitFamily)
1183  element.style.webkitUserSelect = userSelectValue;
1184 else if(Browser.Edge)
1185  element.style.msUserSelect = userSelectValue;
1186 else if(Browser.Opera)
1187  func(element, "mousemove", Selection.Clear);
1188 else {
1189  func(element, "selectstart", ASPx.FalseFunction);
1190  func(element, "mousemove", Selection.Clear);
1191 }
1192};
1193Selection.SetElementAsUnselectable = function(element, isWithChild, recursive) {
1194 if(element && element.nodeType == 1) {
1195  element.unselectable = "on";
1196  if(Browser.NetscapeFamily)
1197   element.onmousedown = ASPx.FalseFunction;
1198  if(Browser.WebKitFamily)
1199   Evt.AttachEventToElement(element, "mousedown", Evt.PreventEventAndBubble);
1200  if(isWithChild === true){
1201   for(var j = 0; j < element.childNodes.length; j ++)
1202    Selection.SetElementAsUnselectable(element.childNodes[j], (!!recursive ? true : false), (!!recursive));
1203  }
1204 }
1205};
1206Selection.AreEqual = function(selection1, selection2) {
1207 return selection1.startPos === selection2.startPos && selection1.endPos === selection2.endPos;
1208};
1209ASPx.Selection = Selection;
1210var MouseScroller = { };
1211MouseScroller.MinimumOffset = 10;
1212MouseScroller.Create = function(getElement, getScrollXElement, getScrollYElement, needPreventScrolling, vertRecursive, onMouseDown, onMouseMove, onMouseUp, onMouseUpMissed) {
1213 var element = getElement();
1214 if(!element) 
1215  return;
1216 if(!element.dxMouseScroller)
1217  element.dxMouseScroller = new MouseScroller.Extender(getElement, getScrollXElement, getScrollYElement, needPreventScrolling, vertRecursive, onMouseDown, onMouseMove, onMouseUp, onMouseUpMissed);
1218 return element.dxMouseScroller;
1219};
1220MouseScroller.Extender = function(getElement, getScrollXElement, getScrollYElement, needPreventScrolling, vertRecursive, onMouseDown, onMouseMove, onMouseUp, onMouseUpMissed) {
1221 this.getElement = getElement;
1222 this.getScrollXElement = getScrollXElement;
1223 this.getScrollYElement = getScrollYElement;
1224 this.needPreventScrolling = needPreventScrolling;
1225 this.vertRecursive = !!vertRecursive;
1226 this.createHandlers(onMouseDown || function() { }, onMouseMove || function() { }, onMouseUp || function() { }, onMouseUpMissed || function() { });
1227 this.update();
1228};
1229MouseScroller.Extender.prototype = {
1230 update: function() {
1231  if(this.element)
1232   Evt.DetachEventFromElement(this.element, ASPx.TouchUIHelper.touchMouseDownEventName, this.mouseDownHandler);
1233  this.element = this.getElement();
1234  Evt.AttachEventToElement(this.element, ASPx.TouchUIHelper.touchMouseDownEventName, this.mouseDownHandler);  
1235  Evt.AttachEventToElement(this.element, "click", this.mouseClickHandler);   
1236  if(Browser.MSTouchUI && this.element.className.indexOf(ASPx.TouchUIHelper.msTouchDraggableClassName) < 0)
1237   this.element.className += " " + ASPx.TouchUIHelper.msTouchDraggableClassName;
1238  this.scrollXElement = this.getScrollXElement();
1239  this.scrollYElement = this.getScrollYElement();
1240 },
1241 createHandlers: function(onMouseDown, onMouseMove, onMouseUp, onMouseUpMissed) {
1242  var mouseDownCounter = 0;
1243  this.onMouseDown = onMouseDown;
1244  this.onMouseMove = onMouseMove;
1245  this.onMouseUp = onMouseUp;  
1246  this.mouseDownHandler = function(e) {
1247   if(mouseDownCounter++ > 0) {
1248    this.finishScrolling();
1249    onMouseUpMissed();
1250   }
1251   var eventSource = Evt.GetEventSource(e);
1252   var requirePreventCustonScroll = ASPx.IsExists(ASPx.TouchUIHelper.RequirePreventCustomScroll) && ASPx.TouchUIHelper.RequirePreventCustomScroll(eventSource, this.element);
1253   this.requirePreventScroll = requirePreventCustonScroll || this.needPreventScrolling && this.needPreventScrolling(eventSource);
1254   if(this.requirePreventScroll)
1255    return;
1256   this.scrollableTreeLine = this.GetScrollableElements();
1257   this.firstX = this.prevX = Evt.GetEventX(e);
1258   this.firstY = this.prevY = Evt.GetEventY(e);
1259   Evt.AttachEventToDocument(ASPx.TouchUIHelper.touchMouseMoveEventName, this.mouseMoveHandler);
1260   Evt.AttachEventToDocument(ASPx.TouchUIHelper.touchMouseUpEventName, this.mouseUpHandler);
1261   this.onMouseDown(e);
1262  }.aspxBind(this);
1263  this.mouseMoveHandler = function(e) {
1264   if(ASPx.TouchUIHelper.isGesture)
1265    return;
1266   var x = Evt.GetEventX(e);
1267   var y = Evt.GetEventY(e);
1268   var xDiff = this.prevX - x;
1269   var yDiff = this.prevY - y;
1270   if(this.vertRecursive) {
1271    var isTopDirection = yDiff < 0;
1272    this.scrollYElement = this.GetElementForVertScrolling(isTopDirection, this.prevIsTopDirection, this.scrollYElement);
1273    this.prevIsTopDirection = isTopDirection;
1274   }
1275   if(this.scrollXElement && xDiff != 0)
1276    this.scrollXElement.scrollLeft += xDiff;
1277   if(this.scrollYElement && yDiff != 0) {
1278    this.scrollYElement.scrollTop += yDiff;
1279    var isOuterScrollableElement = this.scrollableTreeLine[this.scrollableTreeLine.length - 1] == this.scrollYElement;
1280    if(isOuterScrollableElement)
1281     y += yDiff;
1282   }
1283   this.prevX = x;
1284   this.prevY = y;
1285   Evt.PreventEvent(e);
1286   this.onMouseMove(e);
1287  }.aspxBind(this);
1288  this.mouseUpHandler = function(e) {
1289   this.finishScrolling();
1290   this.onMouseUp(e);
1291  }.aspxBind(this);
1292  this.mouseClickHandler = function(e){
1293   if(this.requirePreventScroll || (ASPx.IsExists(e.isTrusted) && !e.isTrusted))
1294    return;
1295   var xDiff = this.firstX - Evt.GetEventX(e);
1296   var yDiff = this.firstY - Evt.GetEventY(e);
1297   if(xDiff > MouseScroller.MinimumOffset || yDiff > MouseScroller.MinimumOffset)
1298    return Evt.PreventEventAndBubble(e);
1299  }.aspxBind(this);
1300  this.finishScrolling = function() {
1301   Evt.DetachEventFromDocument(ASPx.TouchUIHelper.touchMouseMoveEventName, this.mouseMoveHandler);
1302   Evt.DetachEventFromDocument(ASPx.TouchUIHelper.touchMouseUpEventName, this.mouseUpHandler);
1303   this.scrollableTreeLine = [];
1304   this.prevIsTopDirection = null;
1305   mouseDownCounter--;
1306  };
1307 },
1308 GetScrollableElements: function() {
1309  if(!this.vertRecursive) return [ ];
1310  var isHtmlScrollableElement = !ASPx.Browser.IsQuirksMode && !ASPx.Browser.Safari;
1311  var outerScrollableElementTag = isHtmlScrollableElement ? "HTML" : "BODY";
1312  return ASPx.GetElementTreeLine(this.element, null, function(el) { return el == document; })
1313   .filter(function(el) {
1314    var tagName = el.tagName;
1315    if(isHtmlScrollableElement && tagName == "BODY")
1316     return false;
1317    return ASPx.IsScrollableElement(el, false, true) || tagName == outerScrollableElementTag || el.dxScrollable;
1318   }.bind(this));
1319 },
1320 GetElementForVertScrolling: function(currentIsTop, prevIsTop, prevElement) {
1321  if(prevElement && currentIsTop === prevIsTop && this.GetVertScrollExcess(prevElement, currentIsTop) > 0)
1322   return prevElement;
1323  for(var i = 0; i < this.scrollableTreeLine.length; i++) {
1324   var element = this.scrollableTreeLine[i];
1325   var excess = this.GetVertScrollExcess(element, currentIsTop);
1326   if(excess > 0)
1327    return element;
1328  }
1329  return null;
1330 },
1331 GetVertScrollExcess: function(element, isTop) {
1332  if(isTop)
1333   return element.scrollTop;
1334  var isDocument = element.tagName == "HTML" || ASPx.Browser.Safari && !ASPx.Browser.IsQuirksMode && element.tagName == "BODY";
1335  var clientHeight = isDocument ? ASPx.GetDocumentClientHeight() : element.clientHeight;
1336  return element.scrollHeight - clientHeight - element.scrollTop;
1337 }
1338};
1339ASPx.MouseScroller = MouseScroller;
1340var Evt = { };
1341Evt.GetEvent = function(evt){
1342 return evt; 
1343};
1344Evt.IsEventPrevented = function(evt) {
1345 return evt.defaultPrevented || evt.returnValue === false;
1346};
1347Evt.PreventEvent = function(evt){
1348 if(evt.preventDefault) {
1349  if(evt.cancelable)
1350   evt.preventDefault();
1351 }
1352 else
1353  evt.returnValue = false;
1354 return false;
1355};
1356Evt.PreventEventAndBubble = function(evt){
1357 Evt.PreventEvent(evt);
1358 if(evt.stopPropagation)
1359  evt.stopPropagation();
1360 evt.cancelBubble = true;
1361 return false;
1362};
1363Evt.CancelBubble = function(evt){
1364 evt.stopPropagation();
1365 return false;
1366};
1367Evt.PreventImageDragging = function(image) {
1368 if(image)
1369  image.ondragstart = function() { return false; };
1370};
1371Evt.PreventDragStart = function(evt) {
1372 evt = Evt.GetEvent(evt);
1373 var element = Evt.GetEventSource(evt);
1374 if(element.releaseCapture)
1375  element.releaseCapture(); 
1376 return false;
1377};
1378Evt.PreventElementDrag = function(element) {
1379 Evt.AttachEventToElement(element, "mousedown", Evt.PreventEvent);
1380};
1381Evt.PreventElementDragAndSelect = function(element, skipMouseMove, skipIESelect){
1382 if(Browser.WebKitFamily)
1383  Evt.AttachEventToElement(element, "selectstart", Evt.PreventEventAndBubble);
1384};
1385Evt.GetEventSource = function(evt){
1386 if(!ASPx.IsExists(evt)) return null; 
1387 return evt.srcElement ? evt.srcElement : evt.target;
1388};
1389Evt.GetKeyCode = function(srcEvt) {
1390 return Browser.NetscapeFamily || Browser.Opera ? srcEvt.which : srcEvt.keyCode;
1391};
1392function clientEventRequiresDocScrollCorrection() {
1393 var isSafariVerLess3 = Browser.Safari && Browser.Version < 3,
1394  isMacOSMobileVerLess51 = Browser.MacOSMobilePlatform && Browser.Version < 5.1;
1395 return Browser.AndroidDefaultBrowser || Browser.AndroidChromeBrowser || !(isSafariVerLess3 || isMacOSMobileVerLess51);
1396}
1397Evt.GetEventX = function(evt){
1398 if(ASPx.TouchUIHelper.isTouchEvent(evt))
1399  return ASPx.TouchUIHelper.getEventX(evt);
1400 return evt.clientX + (clientEventRequiresDocScrollCorrection() ? ASPx.GetDocumentScrollLeft() : 0);
1401};
1402Evt.GetEventY = function(evt){
1403 if(ASPx.TouchUIHelper.isTouchEvent(evt))
1404  return ASPx.TouchUIHelper.getEventY(evt);
1405 return evt.clientY + (clientEventRequiresDocScrollCorrection() ? ASPx.GetDocumentScrollTop() : 0 );
1406};
1407Evt.IsLeftButtonPressed = function(evt) {
1408 if(ASPx.TouchUIHelper.isTouchEvent(evt))
1409  return true;
1410 evt = Evt.GetEvent(evt);
1411 if(!evt) return false;
1412 if(Browser.WebKitFamily) {
1413  if(evt.type === "pointermove")
1414   return evt.buttons === 1;
1415  return evt.which == 1;
1416 } else if(Browser.NetscapeFamily || Browser.Edge) {
1417  if(evt.type === ASPx.TouchUIHelper.touchMouseMoveEventName)
1418   return evt.buttons === 1;
1419  return evt.which == 1;
1420 } else if(Browser.Opera)
1421  return evt.button == 0;
1422 return true;
1423};
1424Evt.IsRightButtonPressed = function(evt){
1425 evt = Evt.GetEvent(evt);
1426 if(!ASPx.IsExists(evt)) return false;
1427 if(Browser.IE || Browser.Edge) {
1428  if(evt.type === "pointermove")
1429   return evt.buttons === 2;
1430  return evt.button == 2;
1431 }
1432 else if(Browser.NetscapeFamily || Browser.WebKitFamily)
1433  return evt.which == 3;
1434 else if (Browser.Opera)
1435  return evt.button == 1;
1436 return true;
1437};
1438Evt.GetWheelDelta = function(evt) {
1439 var ret;
1440 if(Browser.NetscapeFamily && Browser.MajorVersion < 17)
1441  ret = -evt.detail;
1442 else if(Browser.Safari)
1443  ret = evt.wheelDelta;
1444 else
1445  ret = -evt.deltaY;
1446 if(Browser.Opera && Browser.Version < 9)
1447  ret = -ret;
1448 return ret;
1449};
1450Evt.IsWheelEventWithDirection = function(evt) {
1451 return ASPx.Data.ArrayContains(["wheel", "mousewheel"], evt.type);
1452};
1453Evt.GetWheelDeltaX = function(evt) {
1454 if(evt.type === "wheel")
1455  return -evt.deltaX;
1456 if(evt.type === "mousewheel")
1457  return evt.wheelDeltaX;
1458};
1459Evt.GetWheelDeltaY = function(evt) {
1460 if(evt.type === "wheel")
1461  return -evt.deltaY;
1462 if(evt.type === "mousewheel")
1463  return evt.wheelDeltaY;
1464};
1465Evt.IsPassiveListenersSupported = function() {
1466 if(Browser.Chrome && Browser.MajorVersion > 69 || Browser.Edge && Browser.MajorVersion > 15 || Browser.Firefox && Browser.MajorVersion > 62)
1467  return true;
1468 if(Evt.isPassiveListenersSupported === undefined) {
1469  Evt.isPassiveListenersSupported = false;
1470  try {
1471   var options = Object.defineProperty({}, "passive", { get: function() { Evt.isPassiveListenersSupported = true; } });
1472   window.addEventListener("test", options, options);
1473   window.removeEventListener("test", options, options);
1474  }
1475  catch(err) { Evt.isPassiveListenersSupported = false; }
1476 }
1477 return !!Evt.isPassiveListenersSupported;
1478};
1479Evt.AttachEventToElement = function(element, eventName, func, onlyBubbling, passive) {
1480 if(element.addEventListener)
1481  element.addEventListener(eventName, func, Evt.IsPassiveListenersSupported() ? { capture: !onlyBubbling, passive: !!passive } : !onlyBubbling);
1482 else
1483  element.attachEvent("on" + eventName, func);
1484};
1485Evt.DetachEventFromElement = function(element, eventName, func, onlyBubbling) {
1486 if(element.removeEventListener)
1487  element.removeEventListener(eventName, func, Evt.IsPassiveListenersSupported() ? { capture: !onlyBubbling } : !onlyBubbling);
1488 else
1489  element.detachEvent("on" + eventName, func);
1490};
1491Evt.AttachEventToDocument = function(eventName, func) {
1492 var attachingAllowed = ASPx.TouchUIHelper.onEventAttachingToDocument(eventName, func);
1493 if(attachingAllowed)
1494  Evt.AttachEventToDocumentCore(eventName, func);
1495};
1496Evt.AttachEventToDocumentCore = function(eventName, func) {
1497 Evt.AttachEventToElement(document, eventName, func);
1498};
1499Evt.DetachEventFromDocument = function(eventName, func) {
1500 Evt.DetachEventFromDocumentCore(eventName, func);
1501 ASPx.TouchUIHelper.onEventDettachedFromDocument(eventName, func);
1502};
1503Evt.DetachEventFromDocumentCore = function(eventName, func){
1504 Evt.DetachEventFromElement(document, eventName, func);
1505};
1506Evt.GetMouseWheelEventName = function() {
1507 if(Browser.Safari)
1508  return "mousewheel";
1509 if(Browser.NetscapeFamily && Browser.MajorVersion < 17)
1510  return "DOMMouseScroll";
1511 return "wheel";
1512};
1513Evt.AttachMouseEnterToElement = function (element, onMouseOverHandler, onMouseOutHandler) {
1514 Evt.AttachEventToElement(element, ASPx.TouchUIHelper.pointerEnabled ? ASPx.TouchUIHelper.pointerOverEventName : "mouseover", function (evt) { mouseEnterHandler(evt, element, onMouseOverHandler, onMouseOutHandler); });
1515 Evt.AttachEventToElement(element, ASPx.TouchUIHelper.pointerEnabled ? ASPx.TouchUIHelper.pointerOutEventName : "mouseout", function (evt) { mouseEnterHandler(evt, element, onMouseOverHandler, onMouseOutHandler); });
1516};
1517Evt.GetEventRelatedTarget = function(evt, isMouseOverEvent) {
1518 return evt.relatedTarget || (isMouseOverEvent ? evt.srcElement : evt.toElement);
1519};
1520function mouseEnterHandler(evt, element, onMouseOverHandler, onMouseOutHandler) {
1521 var isMouseOverExecuted = !!element.dxMouseOverExecuted;
1522 var isMouseOverEvent = (evt.type == "mouseover" || evt.type == ASPx.TouchUIHelper.pointerOverEventName);
1523 if(isMouseOverEvent && isMouseOverExecuted || !isMouseOverEvent && !isMouseOverExecuted)
1524  return;
1525 var source = Evt.GetEventRelatedTarget(evt, isMouseOverEvent);
1526 if(!ASPx.GetIsParent(element, source)) {
1527  element.dxMouseOverExecuted = isMouseOverEvent;
1528  if(isMouseOverEvent)
1529   onMouseOverHandler(element);
1530  else
1531   onMouseOutHandler(element);
1532 }
1533 else if(isMouseOverEvent && !isMouseOverExecuted) {
1534  element.dxMouseOverExecuted = true;
1535  onMouseOverHandler(element);
1536 }
1537}
1538Evt.DispatchEvent = function(target, eventName, canBubble, cancellable) {
1539 var event = document.createEvent("Event");
1540 event.initEvent(eventName, canBubble || false, cancellable || false);
1541 target.dispatchEvent(event);
1542};
1543Evt.EmulateDocumentOnMouseDown = function(evt) {
1544 Evt.EmulateOnMouseDown(document, evt);
1545};
1546Evt.EmulateOnMouseDown = function(element, evt) {
1547 if(!Browser.WebKitFamily){
1548  var emulatedEvt = document.createEvent("MouseEvents");
1549  emulatedEvt.initMouseEvent("mousedown", true, true, window, 0, evt.screenX, evt.screenY, 
1550   evt.clientX, evt.clientY, evt.ctrlKey, evt.altKey, evt.shiftKey, false, 0, null);
1551  element.dispatchEvent(emulatedEvt);
1552 }
1553};
1554Evt.EmulateOnMouseEvent = function (type, element, evt) {
1555 evt.type = type;
1556 var emulatedEvt = document.createEvent("MouseEvents");
1557 emulatedEvt.initMouseEvent(type, true, true, window, 0, evt.screenX, evt.screenY,
1558  evt.clientX, evt.clientY, evt.ctrlKey, evt.altKey, evt.shiftKey, false, 0, null);
1559 emulatedEvt.target = element;
1560 element.dispatchEvent(emulatedEvt);
1561};
1562Evt.EmulateMouseClick = function (element, evt) {
1563 var x = ASPx.GetElementOffsetWidth(element) / 2;
1564 var y = ASPx.GetElementOffsetHeight(element) / 2;
1565 if (!evt)
1566  evt = {
1567   bubbles: true,
1568   cancelable: true,
1569   view: window,
1570   detail: 1,
1571   screenX: 0,
1572   screenY: 0,
1573   clientX: x,
1574   clientY: y,
1575   ctrlKey: false,
1576   altKey: false,
1577   shiftKey: false,
1578   metaKey: false,
1579   button: 0,
1580   relatedTarget: null
1581  };
1582 Evt.EmulateOnMouseEvent("mousedown", element, evt);
1583 Evt.EmulateOnMouseEvent("mouseup", element, evt);
1584 Evt.EmulateOnMouseEvent("click", element, evt);
1585};
1586Evt.DoElementClick = function(element) {
1587 try{
1588  element.click();
1589 }
1590 catch(e){ 
1591 }
1592};
1593Evt.IsActionKeyPressed = function(evt) {
1594 return evt.keyCode === ASPx.Key.Space ||
1595     evt.keyCode === ASPx.Key.Enter ||
1596    (evt.keyCode === ASPx.Key.Down && evt.altKey);
1597};
1598Evt.InvokeMouseClickByKeyDown = function(evt, handler) {
1599 if(Evt.IsActionKeyPressed(evt)) {
1600  ASPx.Evt.PreventEvent(evt); 
1601  if(!handler)
1602   ASPx.Evt.GetEventSource(evt).onclick();
1603  else
1604   handler(evt);
1605 }
1606};
1607Evt.AttachContextMenuToElement = function (element, handler, onlyBubbling) {
1608 if (ASPx.TouchUIHelper.useLongTapHelper())
1609  element.detachContextMenuEventHandler = ASPx.TouchUIHelper.attachLongTapHandler(element, handler, onlyBubbling);
1610 else
1611  Evt.AttachEventToElement(element, "contextmenu", handler, onlyBubbling);
1612};
1613Evt.DetachContextMenuFromElement = function (element, handler) {
1614 if (element.detachContextMenuEventHandler)
1615  element.detachContextMenuEventHandler();
1616 else
1617  Evt.DetachEventFromElement(element, "contextmenu", handler);
1618};
1619Evt.PreventContextMenuOnElement = function(element) {
1620 Evt.AttachContextMenuToElement(element, function(evt) {
1621  Evt.PreventEvent(evt);
1622 });
1623};
1624ASPx.Evt = Evt;
1625var Attr = { };
1626Attr.GetAttribute = function(obj, attrName){
1627 if(obj.getAttribute)
1628  return obj.getAttribute(attrName);
1629 else if(obj.getPropertyValue) {
1630  if(Browser.Firefox) { 
1631   try {
1632    return obj.getPropertyValue(attrName);
1633   } catch(e) {
1634    return obj[attrName];
1635   }
1636  }
1637  return obj.getPropertyValue(attrName);
1638 }
1639 return null;
1640};
1641Attr.SetAttribute = function(obj, attrName, value){
1642 if(obj.setAttribute)
1643  obj.setAttribute(attrName, value);
1644 else if(obj.setProperty)
1645  obj.setProperty(attrName, value, "");
1646};
1647Attr.ToggleAttribute = function(obj, attrName, value, condition) {
1648 if(condition)
1649  Attr.SetAttribute(obj, attrName, value);
1650 else
1651  Attr.RemoveAttribute(obj, attrName);
1652};
1653Attr.RemoveAttribute = function(obj, attrName){
1654 if(obj.removeAttribute)
1655  obj.removeAttribute(attrName);
1656 else if(obj.removeProperty)
1657  obj.removeProperty(attrName);
1658};
1659Attr.IsExistsAttribute = function(obj, attrName){
1660 var value = Attr.GetAttribute(obj, attrName);
1661 return (value != null) && (value !== "");
1662};
1663Attr.SetOrRemoveAttribute = function(obj, attrName, value) {
1664 if(!value)
1665  Attr.RemoveAttribute(obj, attrName);
1666 else
1667  Attr.SetAttribute(obj, attrName, value);
1668};
1669Attr.SaveAttribute = function(obj, attrName, savedObj, savedAttrName){
1670 if(!Attr.IsExistsAttribute(savedObj, savedAttrName)){
1671  var oldValue = Attr.IsExistsAttribute(obj, attrName) ? Attr.GetAttribute(obj, attrName) : ASPx.EmptyObject;
1672  Attr.SetAttribute(savedObj, savedAttrName, oldValue);
1673 }
1674};
1675Attr.SaveStyleAttribute = function(obj, attrName){
1676 Attr.SaveAttribute(obj.style, attrName, obj, "saved" + attrName);
1677};
1678Attr.ChangeAttributeExtended = function(obj, attrName, savedObj, savedAttrName, newValue){
1679 Attr.SaveAttribute(obj, attrName, savedObj, savedAttrName);
1680 Attr.SetAttribute(obj, attrName, newValue);
1681};
1682Attr.ChangeAttribute = function(obj, attrName, newValue){
1683 Attr.ChangeAttributeExtended(obj, attrName, obj, "saved" + attrName, newValue);
1684};
1685Attr.ChangeStyleAttribute = function(obj, attrName, newValue){
1686 Attr.ChangeAttributeExtended(obj.style, attrName, obj, "saved" + attrName, newValue);
1687};
1688Attr.ResetAttributeExtended = function(obj, attrName, savedObj, savedAttrName){
1689 Attr.SaveAttribute(obj, attrName, savedObj, savedAttrName);
1690 Attr.SetAttribute(obj, attrName, "");
1691 Attr.RemoveAttribute(obj, attrName);
1692};
1693Attr.ResetAttribute = function(obj, attrName){
1694 Attr.ResetAttributeExtended(obj, attrName, obj, "saved" + attrName);
1695};
1696Attr.ResetStyleAttribute = function(obj, attrName){
1697 Attr.ResetAttributeExtended(obj.style, attrName, obj, "saved" + attrName);
1698};
1699Attr.RestoreAttributeExtended = function(obj, attrName, savedObj, savedAttrName){
1700 if(Attr.IsExistsAttribute(savedObj, savedAttrName)){
1701  var oldValue = Attr.GetAttribute(savedObj, savedAttrName);
1702  if(oldValue != ASPx.EmptyObject)
1703   Attr.SetAttribute(obj, attrName, oldValue);
1704  else
1705   Attr.RemoveAttribute(obj, attrName);
1706  Attr.RemoveAttribute(savedObj, savedAttrName);
1707  return true;
1708 }
1709 return false;
1710};
1711Attr.RestoreAttribute = function(obj, attrName){
1712 return Attr.RestoreAttributeExtended(obj, attrName, obj, "saved" + attrName);
1713};
1714Attr.RestoreStyleAttribute = function(obj, attrName){
1715 return Attr.RestoreAttributeExtended(obj.style, attrName, obj, "saved" + attrName);
1716};
1717Attr.CopyAllAttributes = function(sourceElem, destElement) {
1718 var attrs = sourceElem.attributes;
1719 for(var n = 0; n < attrs.length; n++) {
1720  var attr = attrs[n];
1721  if(attr.specified) {
1722   var attrName = attr.nodeName;
1723   var attrValue = sourceElem.getAttribute(attrName, 2);
1724   if(attrValue == null)
1725    attrValue = attr.nodeValue;
1726   destElement.setAttribute(attrName, attrValue, 0); 
1727  }
1728 }
1729 if(sourceElem.style.cssText !== '')
1730  destElement.style.cssText = sourceElem.style.cssText;
1731};
1732Attr.RemoveAllAttributes = function(element, excludedAttributes) {
1733 var excludedAttributesHashTable = {};
1734 if(excludedAttributes)
1735  excludedAttributesHashTable = Data.CreateHashTableFromArray(excludedAttributes);
1736 if(element.attributes) {
1737  var attrArray = element.attributes;
1738  for(var i = 0; i < attrArray.length; i++) {
1739   var attrName = attrArray[i].name;
1740   if(!ASPx.IsExists(excludedAttributesHashTable[attrName.toLowerCase()])) {
1741    try {
1742     attrArray.removeNamedItem(attrName);
1743    } catch (e) { }
1744   }
1745  }
1746 }
1747};
1748Attr.RemoveStyleAttribute = function(element, attrName) {
1749 if(element.style) {
1750  if(Browser.Firefox && element.style[attrName]) 
1751   element.style[attrName] = "";
1752  if(element.style.removeAttribute && element.style.removeAttribute != "")
1753   element.style.removeAttribute(attrName);
1754  else if(element.style.removeProperty && element.style.removeProperty != "")
1755   element.style.removeProperty(attrName);
1756 }
1757};
1758Attr.RemoveAllStyles = function(element) {
1759 if(element.style) {
1760  for(var key in element.style)
1761   Attr.RemoveStyleAttribute(element, key);
1762    Attr.RemoveAttribute(element, "style");
1763 }
1764};
1765Attr.GetTabIndexAttributeName = function(){
1766 return "tabindex";
1767};
1768Attr.ChangeTabIndexAttribute = function(element){
1769 var attribute = Attr.GetTabIndexAttributeName(); 
1770 if(Attr.GetAttribute(element, attribute) != -1)
1771    Attr.ChangeAttribute(element, attribute, -1);
1772};
1773Attr.SaveTabIndexAttributeAndReset = function(element) {
1774 var attribute = Attr.GetTabIndexAttributeName();
1775 Attr.SaveAttribute(element, attribute, element, "saved" + attribute);
1776 Attr.SetAttribute(element, attribute, -1);
1777};
1778Attr.RestoreTabIndexAttribute = function(element){
1779 var attribute = Attr.GetTabIndexAttributeName();
1780 if(Attr.IsExistsAttribute(element, attribute)) {
1781  if(Attr.GetAttribute(element, attribute) == -1) {
1782   if(Attr.IsExistsAttribute(element, "saved" + attribute)){
1783    var oldValue = Attr.GetAttribute(element, "saved" + attribute);
1784    if(oldValue != ASPx.EmptyObject)
1785     Attr.SetAttribute(element, attribute, oldValue);
1786    else {
1787     if(Browser.WebKitFamily) 
1788      Attr.SetAttribute(element, attribute, 0); 
1789     Attr.RemoveAttribute(element, attribute);   
1790    }
1791    Attr.RemoveAttribute(element, "saved" + attribute); 
1792   }
1793  }
1794 }
1795};
1796Attr.ChangeAttributesMethod = function(enabled){
1797 return enabled ? Attr.RestoreAttribute : Attr.ResetAttribute;
1798};
1799Attr.InitiallyChangeAttributesMethod = function(enabled){
1800 return enabled ? Attr.ChangeAttribute : Attr.ResetAttribute;
1801};
1802Attr.ChangeStyleAttributesMethod = function(enabled){
1803 return enabled ? Attr.RestoreStyleAttribute : Attr.ResetStyleAttribute;
1804};
1805Attr.InitiallyChangeStyleAttributesMethod = function(enabled){
1806 return enabled ? Attr.ChangeStyleAttribute : Attr.ResetStyleAttribute;
1807};
1808Attr.ChangeEventsMethod = function(enabled){
1809 return enabled ? Evt.AttachEventToElement : Evt.DetachEventFromElement;
1810};
1811Attr.ChangeDocumentEventsMethod = function(enabled){
1812 return enabled ? Evt.AttachEventToDocument : Evt.DetachEventFromDocument;
1813};
1814Attr.ChangeCellSpanCount = function(cell, value, isColumnSpan) {
1815 if(!cell) return;
1816 var propertyKey = isColumnSpan ? "colSpan" : "rowSpan";
1817 var prevValue = cell[propertyKey];
1818 if(value > 1)
1819  cell[propertyKey] = value;
1820 else if(prevValue !== 1)
1821  Attr.RemoveAttribute(cell, propertyKey);
1822};
1823Attr.AppendScriptType = function(script) {
1824 if(!isHtml5Mode())
1825  script.type = "text/javascript";
1826};
1827Attr.AppendStyleType = function(style) {
1828 if(!isHtml5Mode())
1829  style.type = "text/css";
1830};
1831function isHtml5Mode() {
1832 return ASPx.DoctypeMode === "Html5";
1833}
1834ASPx.Attr = Attr;
1835var Aria = {
1836 atomic: "aria-atomic",
1837 checked: "aria-checked",
1838 descendant: "aria-activedescendant",
1839 described: "aria-describedby",
1840 disabled: "aria-disabled",
1841 expanded: "aria-expanded",
1842 haspopup: "aria-haspopup",
1843 invalid: "aria-invalid",
1844 label: "aria-label",
1845 labelled: "aria-labelledby",
1846 level: "aria-level",
1847 owns: "aria-owns",
1848 posinset: "aria-posinset",
1849 role: "role",
1850 selected: "aria-selected",
1851 setsize: "aria-setsize",
1852 valuemax: "aria-valuemax",
1853 valuemin: "aria-valuemin",
1854 valuenow: "aria-valuenow"
1855};
1856Aria.SetOrRemoveDescendant = function(obj, value) {
1857 ASPx.Attr.SetOrRemoveAttribute(obj, Aria.descendant, value);
1858};
1859Aria.SetOrRemoveLabel = function(obj, value) {
1860 ASPx.Attr.SetOrRemoveAttribute(obj, Aria.label, value);
1861};
1862Aria.SetOrRemoveDisabled = function(obj, value) {
1863 ASPx.Attr.SetOrRemoveAttribute(obj, Aria.disabled, value);
1864};
1865Aria.AppendLabel = function(obj, value, checkExists) {
1866 var currentValue = ASPx.Attr.GetAttribute(obj, Aria.label) || "";
1867 var resultParts = [ ];
1868 if(currentValue)
1869  resultParts.push(currentValue);
1870 var needAppendValue = value && (!checkExists || currentValue.indexOf(value) == -1);
1871 if(needAppendValue)
1872  resultParts.push(value);
1873 ASPx.Attr.SetAttribute(obj, Aria.label, resultParts.join(" "));
1874};
1875Aria.SetOrRemoveLabelled = function(obj, value) {
1876 ASPx.Attr.SetOrRemoveAttribute(obj, Aria.labelled, value);
1877};
1878Aria.SetApplicationRole = function(obj) {
1879  ASPx.Attr.SetAttribute(obj, Aria.role, "application");
1880};
1881Aria.SetSilence = function(obj) {
1882 ASPx.Attr.SetAttribute(obj, Aria.label, ";");
1883};
1884Aria.SetExpanded = function(obj, expanded) {
1885 if(!obj || !ASPx.Attr.GetAttribute(obj, Aria.expanded)) return;
1886 Aria.SetBoolAttribute(obj, Aria.expanded, expanded);
1887};
1888Aria.SetAtomic = function(obj, value) {
1889 Aria.SetBoolAttribute(obj, Aria.atomic, value);
1890};
1891Aria.SetBoolAttribute = function(obj, attribute, value) {
1892 if(value)
1893  ASPx.Attr.SetAttribute(obj, attribute, true);
1894 else 
1895  ASPx.Attr.SetAttribute(obj, attribute, false);
1896};
1897ASPx.Attr.Aria = Aria;
1898var Color = { };
1899function _aspxToHex(d) {
1900 return (d < 16) ? ("0" + d.toString(16)) : d.toString(16);
1901}
1902Color.RGBRegexp = /rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/;
1903Color.RGBARegexp = /rgba?\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*,?\s*([0-9]*\.?[0-9]*)\s*\)/;
1904Color.ColorToHexadecimal = function(colorValue, isRGBA) {
1905 if(typeof(colorValue) == "number") {
1906  var r = colorValue & 0xFF;
1907  var g = (colorValue >> 8) & 0xFF;
1908  var b = (colorValue >> 16) & 0xFF;
1909  return "#" + _aspxToHex(r) + _aspxToHex(g) + _aspxToHex(b);
1910 }
1911 if(colorValue && (colorValue.substr(0, 3).toLowerCase() == "rgb")) {
1912  var regResult = colorValue.toLowerCase().match(isRGBA ? Color.RGBARegexp : Color.RGBRegexp);
1913  if(regResult) {
1914   var r = parseInt(regResult[1]);
1915   var g = parseInt(regResult[2]);
1916   var b = parseInt(regResult[3]);
1917   if (isRGBA)
1918    return { r: r, g: g, b: b, a: regResult[4] !== undefined ? parseFloat(regResult[4]) : 1 };
1919   return "#" + _aspxToHex(r) + _aspxToHex(g) + _aspxToHex(b);
1920  }
1921  return null;
1922 } 
1923 if(colorValue && (colorValue.charAt(0) == "#"))
1924  return colorValue;
1925 return null;
1926};
1927Color.Names = {
1928 AddColorNames: function(stringResourcesObj) {
1929  if(stringResourcesObj) {
1930   for(var key in stringResourcesObj)
1931    if(stringResourcesObj.hasOwnProperty(key))
1932     this[key] = stringResourcesObj[key];
1933  }
1934 }
1935};
1936ASPx.Color = Color;
1937var Url = { };
1938Url.Navigate = function(url, target) {
1939 var javascriptPrefix = "javascript:";
1940 if(!url || url === "")
1941  return;
1942 else if(url.indexOf(javascriptPrefix) != -1)
1943  eval(url.substr(javascriptPrefix.length));
1944 else {
1945  try {
1946   if(target != "")
1947    navigateTo(url, target);
1948   else
1949    location.href = url;
1950  }
1951  catch(e) {
1952  }
1953 }
1954};
1955Url.NavigateByLink = function(linkElement) {
1956 Url.Navigate(Attr.GetAttribute(linkElement, "href"), linkElement.target);
1957};
1958Url.GetAbsoluteUrl = function(url) {
1959 if(url)
1960  url = Url.getURLObject(url).href;
1961 return url;
1962};
1963Url.Redirect = function(url) {
1964 window.location.href = url;
1965};
1966var absolutePathPrefixes = 
1967 [ "about:", "file:///", "ftp://", "gopher://", "http://", "https://", "javascript:", "mailto:", "news:", "res://", "telnet://", "view-source:" ];
1968Url.isAbsoluteUrl = function(url) {
1969 if (url) {
1970  for (var i = 0; i < absolutePathPrefixes.length; i++) {
1971   if(url.indexOf(absolutePathPrefixes[i]) == 0)
1972    return true;
1973  }
1974 }
1975 return false;
1976};
1977Url.getURLObject = function(url) {
1978 var link = document.createElement('A');
1979 link.href = url || "";
1980 return { 
1981  href: link.href,
1982  protocol: link.protocol,
1983  host: link.host,
1984  port: link.port,
1985  pathname: link.pathname,
1986  search: link.search,
1987  hash: link.hash
1988 }; 
1989};
1990Url.getRootRelativeUrl = function(url) {
1991 return getRelativeUrl(url, !Url.isRootRelativeUrl(url), true); 
1992};
1993Url.getPathRelativeUrl = function(url) {
1994 return getRelativeUrl(url, !Url.isPathRelativeUrl(url), false);
1995};
1996function getRelativeUrl(url, isValid, isRootRelative) {
1997 if(url && !(/data:([^;]+\/?[^;]*)(;charset=[^;]*)?(;base64,)/.test(url)) && isValid) {
1998  var urlObject = Url.getURLObject(url);
1999  var baseUrlObject = Url.getURLObject();
2000  if(!Url.isAbsoluteUrl(url) || urlObject.host === baseUrlObject.host && urlObject.protocol === baseUrlObject.protocol) {
2001   url = urlObject.pathname;
2002   if(!isRootRelative)
2003    url = getPathRelativeUrl(baseUrlObject.pathname, url);
2004   url = url + urlObject.search + urlObject.hash;
2005  }
2006 }
2007 return url;   
2008}
2009function getPathRelativeUrl(baseUrl, url) {
2010 var requestSegments = getSegments(baseUrl, false);
2011 var urlSegments = getSegments(url, true);
2012 return buildPathRelativeUrl(requestSegments, urlSegments, 0, 0, "");
2013}
2014function getSegments(url, addTail) {
2015 var segments = [];
2016 var startIndex = 0;
2017 var endIndex = -1;
2018 while ((endIndex = url.indexOf("/", startIndex)) != -1) {
2019  segments.push(url.substring(startIndex, ++endIndex));
2020  startIndex = endIndex;
2021 }
2022 if(addTail && startIndex < url.length)
2023  segments.push(url.substring(startIndex, url.length)); 
2024 return segments;
2025}
2026function buildPathRelativeUrl(requestSegments, urlSegments, reqIndex, urlIndex, buffer) {
2027 if(urlIndex >= urlSegments.length)
2028  return buffer;
2029 if(reqIndex >= requestSegments.length)
2030  return buildPathRelativeUrl(requestSegments, urlSegments, reqIndex, urlIndex + 1, buffer + urlSegments[urlIndex]);
2031 if(requestSegments[reqIndex] === urlSegments[urlIndex] && urlIndex === reqIndex)
2032  return buildPathRelativeUrl(requestSegments, urlSegments, reqIndex + 1, urlIndex + 1, buffer);
2033 return buildPathRelativeUrl(requestSegments, urlSegments, reqIndex + 1, urlIndex, buffer + "../");
2034}
2035Url.isPathRelativeUrl = function(url) {
2036 return !!url && !Url.isAbsoluteUrl(url) && url.indexOf("/") != 0;  
2037};
2038Url.isRootRelativeUrl = function(url) {
2039 return !!url && !Url.isAbsoluteUrl(url) && url.indexOf("/") == 0 && url.indexOf("//") != 0;
2040};
2041function navigateTo(url, target) {
2042 var lowerCaseTarget = target.toLowerCase();
2043 if("_top" == lowerCaseTarget)
2044  top.location.href = url;
2045 else if("_self" == lowerCaseTarget)
2046  location.href = url;
2047 else if("_search" == lowerCaseTarget)
2048  openInNewWindow(url);
2049 else if("_media" == lowerCaseTarget)
2050  openInNewWindow(url);
2051 else if("_parent" == lowerCaseTarget)
2052  window.parent.location.href = url;
2053 else if("_blank" == lowerCaseTarget)
2054  openInNewWindow(url);
2055 else {
2056  var frame = getFrame(top.frames, target);
2057  if(frame != null)
2058   frame.location.href = url;
2059  else
2060   openInNewWindow(url);
2061 }
2062}
2063function openInNewWindow(url) {
2064 if(ASPx.Browser.Safari)
2065  openInNewWindowViaIframe(url);
2066 else {
2067  var newWindow = window.open();
2068  newWindow.opener = null;
2069  newWindow.location = url;
2070 }
2071}
2072function openInNewWindowViaIframe(url) {
2073 var iframe = document.createElement('iframe');
2074 iframe.style.display = 'none';
2075 document.body.appendChild(iframe);
2076 var iframeDoc = iframe.contentDocument || iframe.contentWindow.document;
2077 var openArgs = '"' + url + '"';
2078 var script = iframeDoc.createElement('script');
2079 script.type = 'text/javascript';
2080 script.text = 'window.parent = null; ' +
2081  'window.top = null;' +
2082  'window.frameElement = null;' +
2083  'var child = window.open(' + openArgs + ');' +
2084  'child.opener = null';
2085 iframeDoc.body.appendChild(script);
2086 document.body.removeChild(iframe);
2087}
2088ASPx.Url = Url;
2089var Json = { };
2090function isValid(JsonString) {
2091 return !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(JsonString.replace(/"(\\.|[^"\\])*"/g, '')));
2092}
2093Json.Eval = function(jsonString, controlName) {
2094 if(isValid(jsonString)) {
2095  return eval("(" + jsonString + ")");
2096 } else {
2097  throw new Error(controlName + " received incorrect JSON-data: " + jsonString);
2098 }
2099};
2100Json.ToJson = function(param, skipEncodeHtml){
2101 var paramType = typeof(param);
2102 if((paramType == "undefined") || (param == null))
2103  return null;
2104 if((paramType == "object") && (typeof(param.__toJson) == "function"))
2105  return param.__toJson();
2106 if((paramType == "number") || (paramType == "boolean"))
2107  return param;
2108 if(param.constructor == Date)
2109  return dateToJson(param);
2110 if(paramType == "string") {
2111  var result = param.replace(/\\/g, "\\\\");
2112  result = result.replace(/"/g, "\\\"");
2113  result = result.replace(/\n/g, "\\n");
2114  result = result.replace(/\r/g, "\\r");
2115  if(!skipEncodeHtml) {
2116   result = result.replace(/</g, "\\u003c");
2117   result = result.replace(/>/g, "\\u003e");
2118  }
2119  return "\"" + result + "\"";
2120 }
2121 if(param.constructor == Array){
2122  var values = [];
2123  for(var i = 0; i < param.length; i++) {
2124   var jsonValue = Json.ToJson(param[i], skipEncodeHtml);
2125   if(jsonValue === null)
2126    jsonValue = "null";
2127   values.push(jsonValue);
2128  }
2129  return "[" + values.join(",") + "]";
2130 }
2131 var exceptKeys = {};
2132 if(ASPx.Ident.IsArray(param.__toJsonExceptKeys))
2133  exceptKeys = Data.CreateHashTableFromArray(param.__toJsonExceptKeys);
2134 exceptKeys["__toJsonExceptKeys"] = 1;
2135 var values = [];
2136 for(var key in param) {
2137  if(param.hasOwnProperty(key)) {
2138   if(ASPx.IsFunction(param[key]))
2139    continue;
2140   if(exceptKeys[key] == 1)
2141    continue;
2142   values.push(Json.ToJson(key) + ":" + Json.ToJson(param[key], skipEncodeHtml));
2143  }
2144 }
2145 return "{" + values.join(",") + "}";
2146};
2147function dateToJson(date) {
2148 var result = [ 
2149  date.getFullYear(),
2150  date.getMonth(),
2151  date.getDate()
2152 ];
2153 var time = {
2154  h: date.getHours(),
2155  m: date.getMinutes(),
2156  s: date.getSeconds(),
2157  ms: date.getMilliseconds()
2158 };
2159 if(time.h || time.m || time.s || time.ms)
2160  result.push(time.h);
2161 if(time.m || time.s || time.ms)
2162  result.push(time.m);
2163 if(time.s || time.ms)
2164  result.push(time.s);
2165 if(time.ms)
2166  result.push(time.ms);
2167 return "new Date(" + result.join() + ")";
2168}
2169ASPx.Json = Json;
2170ASPx.CreateClass = function(parentClass, properties) {
2171 if(arguments.length == 1) {
2172  properties = parentClass;
2173  parentClass = null;
2174 }
2175 var ret = function() {
2176  if(ret.preparing) 
2177   return delete(ret.preparing);
2178  if(ret.constr) {
2179   this.constructor = ret;
2180   ret.constr.apply(this, arguments);
2181  }
2182 };
2183 ret.prototype = {};
2184 if(parentClass) {
2185  parentClass.preparing = true;
2186  for(var name in parentClass) {
2187   if(parentClass.hasOwnProperty(name) && name != 'constr' && ASPx.IsFunction(parentClass[name]) && !ret[name])
2188    ret[name] = parentClass[name].aspxBind(parentClass);
2189  }
2190  ret.prototype = new parentClass;
2191  ret.prototype.constructor = parentClass;
2192  ret.constr = parentClass;
2193 }
2194 if(properties) {
2195  var constructorName = "constructor";
2196  for(var name in properties) {
2197   if(!properties.hasOwnProperty(name)) 
2198    continue;
2199   var getter = Object.getOwnPropertyDescriptor(properties, name).get;
2200   var setter = Object.getOwnPropertyDescriptor(properties, name).set;
2201   if(getter || setter)
2202    Object.defineProperty(ret.prototype, name, {
2203     set: setter,
2204     get: getter,
2205     enumerable: true,
2206     configurable: true
2207    });
2208   if(name != constructorName && !getter && !setter)
2209    ret.prototype[name] = properties[name];
2210  }
2211  if(properties[constructorName] && properties[constructorName] != Object)
2212   ret.constr = properties[constructorName];
2213 }
2214 return ret;
2215};
2216var registeredMixins = {};
2217ASPx.GetMixin = function (name, baseClass) {
2218 var mixinCache = baseClass._mixins || (baseClass._mixins = {});
2219 var resultClass = mixinCache[name];
2220 if (!resultClass) {
2221  var mixinCodeBuilder = registeredMixins[name];
2222  if (!mixinCodeBuilder)
2223   throw new Error("mixin with the '" + name + "' is not registered");
2224  var mixinCode = mixinCodeBuilder(baseClass);
2225  mixinCode.mixinName = name;
2226  resultClass = ASPx.CreateClass(baseClass, mixinCode);
2227  mixinCache[name] = resultClass;
2228 }
2229 return resultClass;
2230};
2231ASPx.RegisterMixin = function() {
2232 var name = arguments.length == 1 ? "mixin_" + ASPx.CreateGuid() : arguments[0];
2233 var mixinCodeBuilder = arguments[arguments.length - 1];
2234 if (registeredMixins[name])
2235  throw new Error("mixin with the '" + name + "' name is already defined");
2236 registeredMixins[name] = mixinCodeBuilder;
2237 return function(baseClass) { return ASPx.GetMixin(name, baseClass); };
2238};
2239ASPx.FormatCallbackArg = function(prefix, arg) {
2240 if(prefix == null && arg == null)
2241  return ""; 
2242 if(prefix == null) prefix = "";
2243 if(arg == null) arg = "";
2244 if(arg != null && !ASPx.IsExists(arg.length) && ASPx.IsExists(arg.value))
2245  arg = arg.value;
2246 arg = arg.toString();
2247 return [prefix, '|', arg.length, '|' , arg].join('');
2248};
2249ASPx.FormatCallbackArgs = function(callbackData) {
2250 var sb = [ ];
2251 for(var i = 0; i < callbackData.length; i++)
2252  sb.push(ASPx.FormatCallbackArg(callbackData[i][0], callbackData[i][1]));
2253 return sb.join("");
2254};
2255ASPx.ParseShortcutString = function(shortcutString) {
2256 if(!shortcutString)
2257  return 0;
2258 var isCtrlKey = false;
2259 var isShiftKey = false;
2260 var isAltKey = false;
2261 var isMetaKey = false;
2262 var keyCode = null;
2263 var shcKeys = shortcutString.toString().split("+");
2264 if(shcKeys.length > 0) {
2265  for(var i = 0; i < shcKeys.length; i++) {
2266   var key = Str.Trim(shcKeys[i].toUpperCase());
2267   switch (key) {
2268    case "CONTROL":
2269    case "CONTROLKEY":
2270    case "CTRL":
2271     isCtrlKey = true;
2272     break;
2273    case "SHIFT":
2274    case "SHIFTKEY":
2275     isShiftKey = true;
2276     break;
2277    case "ALT":
2278     isAltKey = true;
2279     break;
2280    case "CMD":
2281     isMetaKey = true;
2282     break;
2283    case "F1": keyCode = ASPx.Key.F1; break;
2284    case "F2": keyCode = ASPx.Key.F2; break;
2285    case "F3": keyCode = ASPx.Key.F3; break;
2286    case "F4": keyCode = ASPx.Key.F4; break;
2287    case "F5": keyCode = ASPx.Key.F5; break;
2288    case "F6": keyCode = ASPx.Key.F6; break;
2289    case "F7": keyCode = ASPx.Key.F7; break;
2290    case "F8": keyCode = ASPx.Key.F8; break;
2291    case "F9": keyCode = ASPx.Key.F9; break;
2292    case "F10":   keyCode = ASPx.Key.F10; break;
2293    case "F11":   keyCode = ASPx.Key.F11; break;
2294    case "F12":   keyCode = ASPx.Key.F12; break;
2295    case "RETURN":
2296    case "ENTER": keyCode = ASPx.Key.Enter; break;
2297    case "HOME":  keyCode = ASPx.Key.Home; break;
2298    case "END":   keyCode = ASPx.Key.End; break;
2299    case "LEFT":  keyCode = ASPx.Key.Left; break;
2300    case "RIGHT": keyCode = ASPx.Key.Right; break;
2301    case "UP": keyCode = ASPx.Key.Up; break;
2302    case "DOWN":  keyCode = ASPx.Key.Down; break;
2303    case "PAGEUP": keyCode = ASPx.Key.PageUp; break;
2304    case "PAGEDOWN": keyCode = ASPx.Key.PageDown; break;
2305    case "SPACE": keyCode = ASPx.Key.Space; break;
2306    case "TAB":   keyCode = ASPx.Key.Tab; break;
2307    case "BACKSPACE": 
2308    case "BACK": keyCode = ASPx.Key.Backspace; break;
2309    case "CONTEXT": keyCode = ASPx.Key.ContextMenu; break;
2310    case "ESCAPE":
2311    case "ESC":
2312     keyCode = ASPx.Key.Esc;
2313     break;
2314    case "DELETE":
2315    case "DEL":
2316     keyCode = ASPx.Key.Delete;
2317     break;
2318    case "INSERT":
2319    case "INS":
2320     keyCode = ASPx.Key.Insert;
2321     break;
2322    case "PLUS":
2323     keyCode = "+".charCodeAt(0);
2324     break;
2325    default:
2326     keyCode = key.charCodeAt(0);
2327     break;
2328   }
2329  }
2330 } else
2331  ASPx.ShowErrorAlert("Invalid shortcut");
2332 return ASPx.GetShortcutCode(keyCode, isCtrlKey, isShiftKey, isAltKey, isMetaKey);
2333};
2334ASPx.GetShortcutCode = function(keyCode, isCtrlKey, isShiftKey, isAltKey, isMetaKey) {
2335 var value = keyCode;
2336 value |= isCtrlKey ? ASPx.ModifierKey.Ctrl : 0;
2337 value |= isShiftKey ? ASPx.ModifierKey.Shift : 0;
2338 value |= isAltKey ? ASPx.ModifierKey.Alt : 0;
2339 value |= isMetaKey ? ASPx.ModifierKey.Meta : 0;
2340 return value;
2341};
2342ASPx.GetShortcutCodeByEvent = function(evt) {
2343 return ASPx.GetShortcutCode(Evt.GetKeyCode(evt), evt.ctrlKey, evt.shiftKey, evt.altKey, ASPx.Browser.MacOSPlatform ? evt.metaKey : false);
2344};
2345ASPx.IsPasteShortcut = function(evt) {
2346 if(evt.type === "paste")
2347  return true;
2348 var keyCode = Evt.GetKeyCode(evt);
2349 if(Browser.NetscapeFamily && evt.which == 0)  
2350  keyCode = evt.keyCode;
2351 return (evt.ctrlKey && (keyCode == 118  || (keyCode == 86))) ||
2352     (evt.shiftKey && !evt.ctrlKey && !evt.altKey &&
2353     (keyCode == ASPx.Key.Insert)) ;
2354};
2355var NotPrintableKeyCodes = null;
2356ASPx.IsPrintableKey = function(keyCode) {
2357 if (!NotPrintableKeyCodes)
2358  NotPrintableKeyCodes = Object.keys(ASPx.Key).map(function(key) { return ASPx.Key[key]; });
2359 return !ASPx.Data.ArrayContains(NotPrintableKeyCodes, keyCode);
2360};
2361ASPx.SetFocus = function(element, selectAction) {
2362 function focusCore(element, selectAction){
2363  try {
2364    element.focus();
2365    if(selectAction) {
2366     var currentSelection = Selection.GetInfo(element);
2367     if(currentSelection.startPos == currentSelection.endPos) {
2368      switch(selectAction) {
2369       case "start":
2370        Selection.SetCaretPosition(element, 0);
2371        break;
2372       case "all":
2373        Selection.Set(element);
2374        break;
2375      }
2376     }
2377    }
2378   } catch (e) {
2379  }
2380 }
2381 if(ASPxClientUtils.iOSPlatform || ASPxClientUtils.androidPlatform) 
2382  focusCore(element, selectAction);
2383 else {
2384  window.setTimeout(function() { 
2385   focusCore(element, selectAction);
2386  }, ASPx.FOCUS_TIMEOUT);
2387 }
2388};
2389ASPx.IsFocusableCore = function(element, skipContainerVisibilityCheck) {
2390 var current = element;
2391 while(current && current.nodeType == 1) {
2392  if(current == element || !skipContainerVisibilityCheck(current)) {
2393   var tagName = current.tagName.toUpperCase();
2394   if(tagName == "BODY")
2395    return true;
2396   var disabledElementTags = ["INPUT", "BUTTON", "TEXTAREA", "SELECT", "OPTION"];
2397   if(disabledElementTags.indexOf(tagName) !== -1 && current.disabled || !ASPx.GetElementDisplay(current) || !ASPx.GetElementVisibility(current))
2398    return false;
2399  }
2400  current = current.parentNode;
2401 }
2402 return true;
2403};
2404ASPx.IsFocusable = function(element) {
2405 return ASPx.IsFocusableCore(element, ASPx.FalseFunction);
2406};
2407ASPx.RemoveFocus = function(parent) {
2408 var div = document.createElement('div');
2409 div.tabIndex = "-1";
2410 concealDivElement(div);
2411 parent.appendChild(div);
2412 if(ASPx.IsFocusable(div))
2413  div.focus();
2414 ASPx.RemoveElement(div);
2415};
2416function concealDivElement(div){
2417 div.style.position = "absolute";
2418 div.style.left = 0;
2419 div.style.top = 0;
2420 if(ASPx.Browser.WebKitFamily) {
2421  div.style.opacity = 0;
2422  div.style.width = 1;
2423  div.style.height = 1;
2424 } else {
2425  div.style.border = 0;
2426  div.style.width = 0;
2427  div.style.height = 0;
2428 }
2429}
2430var ActionElementsCache = ASPx.CreateClass(null, {
2431 constructor: function() {
2432  this.usageCounter = 0;
2433  this.elements = [ ];
2434  this.values = [ ];
2435 },
2436 IsActive: function() { return this.usageCounter > 0; },
2437 BeginUsage: function() {
2438  this.usageCounter++;
2439 },
2440 EndUsage: function() {
2441  this.usageCounter--;
2442  if(this.usageCounter === 0)
2443   this.Clear();
2444 },
2445 Add: function(element, value) {
2446  var index = this.elements.length;
2447  this.elements[index] = element;
2448  this.values[index] = value;
2449 },
2450 Get: function(element) { 
2451  var index = this.elements.indexOf(element);
2452  var hasValue = index > -1;
2453  var value = hasValue ? this.values[index] : undefined;
2454  return { hasValue: hasValue, value: value };
2455 },
2456 Clear: function() { 
2457  this.elements = [ ];
2458  this.values = [ ];
2459 }
2460});
2461ASPx.ActionElementsCache = new ActionElementsCache();
2462ASPx.IsActionElement = function(element) {
2463 if(!ASPx.IsExistsElement(element))
2464  return false;
2465 var useCache = ASPx.ActionElementsCache.IsActive();
2466 if(useCache) {
2467  var cacheValue = ASPx.ActionElementsCache.Get(element);
2468  if(cacheValue.hasValue)
2469   return cacheValue.value;
2470 }
2471 var isActionElement = ASPx.IsActionElementCore(element);
2472 if(useCache)
2473  ASPx.ActionElementsCache.Add(element, isActionElement);
2474 return isActionElement;
2475};
2476ASPx.IsActionElementCore = function(element) {
2477 var tabIndex = parseInt(ASPx.Attr.GetAttribute(element, ASPx.Attr.GetTabIndexAttributeName()));
2478 var hasTabIndex = !isNaN(tabIndex);
2479 var hasNonNegativeTabIndex = hasTabIndex && tabIndex > -1;
2480 var hasNegativeTabIndex = hasTabIndex && tabIndex < 0;
2481 var tagName = element.tagName;
2482 var focusableElementTags = ["BUTTON", "SELECT", "TEXTAREA", "OPTION", "IFRAME"];
2483 var isFocusableCore = ASPx.IsFocusable(element);
2484 var isFocusableTag = focusableElementTags.indexOf(tagName) !== -1;
2485 var isFocusableLink = tagName === "A" && (!!element.href || hasNonNegativeTabIndex);
2486 var isFocusableInput = tagName === "INPUT" && element.type.toLowerCase() !== "hidden";
2487 var isFocusableByTabIndex = tagName !== "INPUT" && hasNonNegativeTabIndex;
2488 var isEditableDiv = tagName == "DIV" && element.contentEditable === "true";
2489 return isFocusableCore && !hasNegativeTabIndex && (isFocusableTag || isFocusableLink || isFocusableInput || isFocusableByTabIndex || isEditableDiv);
2490};
2491ASPx.GetCanBeActiveElementsInContainer = function(container) {
2492 var canBeActiveTags = ["INPUT", "A", "UL", "BUTTON", "TEXTAREA", "SELECT", "IFRAME"],
2493  canBeActiveElements = [];
2494 Data.ForEach(canBeActiveTags, function(tag) {
2495  var elements = container.getElementsByTagName(tag);
2496  canBeActiveElements = canBeActiveElements.concat([].slice.call(elements));
2497 });
2498 return canBeActiveElements;
2499};
2500function isActionElementAllowedByPredicate(element, predicate) {
2501  var allowedByPredicate = !predicate || predicate(element);
2502  return allowedByPredicate && ASPx.IsActionElement(element);
2503}
2504ASPx.FindChildActionElements = function(container, predicate) {
2505 return ASPx.GetNodes(container, function(el) {
2506  return isActionElementAllowedByPredicate(el, predicate);
2507 });
2508};
2509ASPx.FindAllSortedActionElements = function(container, predicate) {
2510 var result = [ ];
2511 if(!container || !container.getElementsByTagName) return result;
2512 var actionElements = ASPx.FindChildActionElements(container, predicate);
2513 var getTabOrderValue = function(el) {
2514  var tabIndex = parseInt(ASPx.Attr.GetAttribute(el, ASPx.Attr.GetTabIndexAttributeName()));
2515  return isNaN(tabIndex) ? 0 : tabIndex;
2516 };
2517 var positiveTabIndexElements = actionElements.filter(function(x) { return getTabOrderValue(x) > 0; });
2518 var nonPositiveTabIndexElements = actionElements.filter(function(x) { return getTabOrderValue(x) === 0; });
2519 var sortedTabIndexElements = positiveTabIndexElements.sort(function(x, y) { return getTabOrderValue(x) - getTabOrderValue(y); });
2520 result = sortedTabIndexElements.concat(nonPositiveTabIndexElements);
2521 return result;
2522};
2523ASPx.FindFirstChildActionElement = function(container, predicate) {
2524 if(!container || isActionElementAllowedByPredicate(container, predicate))
2525  return !container ? null : container;
2526 var sortedActionElements = ASPx.FindAllSortedActionElements(container, predicate);
2527 return sortedActionElements[0];
2528};
2529ASPx.FindLastChildActionElement = function(container, predicate) {
2530 if(!container)
2531  return null;
2532 var sortedActionElements = ASPx.FindAllSortedActionElements(container, predicate);
2533 var actionElement = sortedActionElements[sortedActionElements.length - 1];
2534 if(!actionElement && isActionElementAllowedByPredicate(container, predicate))
2535  actionElement = container;
2536 return actionElement;
2537};
2538ASPx.GetParentClientControls = function(name) {
2539 var nameParts = name.split("_");
2540 var result = [ ];
2541 var controlCollection = ASPx.GetControlCollection();
2542 for(var i = 1; i <= nameParts.length; i++) {
2543  var controlName = nameParts.slice(0, i).join("_");
2544  var control = controlCollection.Get(controlName);
2545  if(control)
2546   result.push(control);
2547 }
2548 return result;
2549};
2550ASPx.GetRootClientControl = function(childControlName) {
2551 var parentControls = ASPx.GetParentClientControls(childControlName);
2552 return parentControls[0];
2553};
2554ASPx.GetClientControlByElementID = function(elementID) {
2555 var parentControls = ASPx.GetParentClientControls(elementID);
2556 return parentControls[parentControls.length - 1];
2557};
2558ASPx.IsExists = function(obj){
2559 return (typeof(obj) != "undefined") && (obj != null);
2560};
2561ASPx.IsFunction = function(obj){
2562 return typeof(obj) == "function";
2563};
2564ASPx.IsNumber = function(str) {
2565 return !isNaN(parseFloat(str)) && isFinite(str);
2566};
2567ASPx.GetDefinedValue = function(value, defaultValue){
2568 return (typeof(value) != "undefined") ? value : defaultValue;
2569};
2570ASPx.CorrectJSFloatNumber = function(number) {
2571 var ret = 21; 
2572 var numString = number.toPrecision(21);
2573 numString = numString.replace("-", ""); 
2574 var integerDigitsCount = numString.indexOf(ASPx.PossibleNumberDecimalSeparators[0]);
2575 if(integerDigitsCount < 0)
2576  integerDigitsCount = numString.indexOf(ASPx.PossibleNumberDecimalSeparators[1]);
2577 var floatDigitsCount = numString.length - integerDigitsCount - 1;
2578 if(floatDigitsCount < 10)
2579  return number;
2580 if(integerDigitsCount > 0) {
2581  ret = integerDigitsCount + 12;
2582 }
2583 var toPrecisionNumber = Math.min(ret, 21);
2584 var newValueString = number.toPrecision(toPrecisionNumber);
2585 return parseFloat(newValueString, 10);
2586};
2587ASPx.CorrectRounding = function(number, step) { 
2588 var regex = /[,|.](.*)/,
2589  isFloatValue = regex.test(number),
2590  isFloatStep = regex.test(step);
2591 if(isFloatValue || isFloatStep) {
2592  var valueAccuracy = (isFloatValue) ? regex.exec(number)[0].length - 1 : 0,
2593   stepAccuracy = (isFloatStep) ? regex.exec(step)[0].length - 1 : 0,
2594   accuracy = Math.max(valueAccuracy, stepAccuracy);
2595  var multiplier = Math.pow(10, accuracy);
2596  number = Math.round((number + step) * multiplier) / multiplier;
2597  return number;
2598 }
2599 return number + step;
2600};
2601ASPx.GetActiveElement = function() {
2602 try{ return document.activeElement; } catch(e) { return null; }
2603};
2604var verticalScrollBarWidth;
2605ASPx.GetVerticalScrollBarWidth = function(nonZero) {
2606 if(typeof(verticalScrollBarWidth) === "undefined") {
2607  var container = document.createElement("DIV");
2608  container.style.cssText = "position: absolute; top: 0px; left: 0px; visibility: hidden; width: 200px; height: 150px; overflow: hidden; box-sizing: content-box";
2609  document.body.appendChild(container);
2610  var child = document.createElement("P");
2611  container.appendChild(child);
2612  child.style.cssText = "width: 100%; height: 200px;";
2613  var widthWithoutScrollBar = child.offsetWidth;
2614  container.style.overflow = "scroll";
2615  var widthWithScrollBar = child.offsetWidth;
2616  if(widthWithoutScrollBar == widthWithScrollBar)
2617   widthWithScrollBar = container.clientWidth;
2618  verticalScrollBarWidth = widthWithoutScrollBar - widthWithScrollBar;
2619  document.body.removeChild(container);
2620 }
2621 if(nonZero && verticalScrollBarWidth === 0) {
2622  if(ASPx.Browser.MacOSPlatform || ASPx.Browser.Firefox)
2623   return 12;
2624  if(ASPx.Browser.WebKitTouchUI)
2625   return 1;
2626 }
2627 return verticalScrollBarWidth;
2628};
2629function hideScrollBarCore(element, scrollName) {
2630 if(element.tagName == "IFRAME") {
2631  if((element.scrolling == "yes") || (element.scrolling == "auto")) {
2632   Attr.ChangeAttribute(element, "scrolling", "no");
2633   return true;
2634  }
2635 }
2636 else if(element.tagName == "DIV") {
2637  if((element.style[scrollName] == "scroll") || (element.style[scrollName] == "auto")) {
2638   Attr.ChangeStyleAttribute(element, scrollName, "hidden");
2639   return true;
2640  }
2641 }
2642 return false;
2643}
2644function restoreScrollBarCore(element, scrollName) {
2645 if(element.tagName == "IFRAME")
2646  return Attr.RestoreAttribute(element, "scrolling");
2647 else if(element.tagName == "DIV")
2648  return Attr.RestoreStyleAttribute(element, scrollName);
2649 return false;
2650}
2651ASPx.SetScrollBarVisibilityCore = function(element, scrollName, isVisible) {
2652 return isVisible ? restoreScrollBarCore(element, scrollName) : hideScrollBarCore(element, scrollName);
2653};
2654ASPx.SetScrollBarVisibility = function(element, isVisible) {
2655 if(ASPx.SetScrollBarVisibilityCore(element, "overflow", isVisible)) 
2656  return true;
2657 var result = ASPx.SetScrollBarVisibilityCore(element, "overflowX", isVisible)
2658  || ASPx.SetScrollBarVisibilityCore(element, "overflowY", isVisible);
2659 return result;
2660};
2661ASPx.SetInnerHtml = function(element, html) {
2662 setInnerHtmlInternal(element, html);
2663};
2664ASPx.GetInnerText = function(container) {
2665 if(Browser.Safari && Browser.MajorVersion <= 5) {
2666  var filter = getHtml2PlainTextFilter();
2667  setInnerHtmlInternal(filter, container.innerHTML);
2668  ASPx.SetElementDisplay(filter, true);
2669  var innerText = filter.innerText;
2670  ASPx.SetElementDisplay(filter, false);
2671  return innerText;
2672 } else if(Browser.NetscapeFamily || Browser.WebKitFamily || (Browser.IE && Browser.Version >= 9) || Browser.Edge) {
2673  return container.textContent;
2674 } else
2675  return container.innerText;
2676};
2677ASPx.GetEllipsisTooltipText = function(element) {
2678 var innerText = ASPx.GetInnerText(element);
2679 innerText = ASPx.RemoveComment(innerText);
2680 return innerText;
2681};
2682ASPx.RemoveComment = function(text) {
2683 var result = text;
2684 var commentStart = "<!--";
2685 var commentEnd = "//-->";
2686 var positionStart = result.indexOf(commentStart);
2687 while(positionStart > -1) {
2688  var positionEnd = result.indexOf(commentEnd);
2689  var startStr = result.substring(0, positionStart);
2690  var endStr = result.substring(positionEnd + commentEnd.length);
2691  result = startStr + endStr;
2692  positionStart = result.indexOf(commentStart);
2693 }
2694 return result;
2695};
2696var html2PlainTextFilter = null;
2697function getHtml2PlainTextFilter() {
2698 if(html2PlainTextFilter == null) {
2699  html2PlainTextFilter = document.createElement("DIV");
2700  html2PlainTextFilter.style.width = "0";
2701  html2PlainTextFilter.style.height = "0";
2702  html2PlainTextFilter.style.overflow = "visible";
2703  ASPx.SetElementDisplay(html2PlainTextFilter, false);
2704  document.body.appendChild(html2PlainTextFilter);
2705 }
2706 return html2PlainTextFilter;
2707}
2708ASPx.CreateHiddenField = function(name, id, parent) {
2709 var input = document.createElement("INPUT");
2710 input.setAttribute("type", "hidden");
2711 if(name)
2712  input.setAttribute("name", name);
2713 if(id)
2714  input.setAttribute("id", id);
2715 if(parent)
2716  parent.appendChild(input);
2717 return input;
2718};
2719ASPx.CloneObject = function(srcObject) {
2720 if(typeof(srcObject) != 'object' || srcObject == null)
2721  return srcObject;
2722 var newObject = {};
2723 for(var i in srcObject)
2724  newObject[i] = srcObject[i];
2725 return newObject;
2726};
2727ASPx.InsertRowsBefore = function(table, rowsHtml, index) {
2728 var row = null;
2729 if(index >= 0 && index < table.rows.length)
2730  row = table.rows[index];
2731 insertRowsBefore(table, rowsHtml, row);
2732};
2733var insertRowsBefore = function(table, rowsHtml, row) {
2734 if(!row && table.tBodies.length > 0) {
2735  row = document.createElement("TR");
2736  table.tBodies[0].appendChild(row);
2737  row.shouldRemove = true;
2738 }
2739 if(row) {
2740  row.insertAdjacentHTML("beforeBegin", rowsHtml);
2741  if(row.shouldRemove)
2742   ASPx.RemoveElement(row);
2743 }
2744};
2745ASPx.IsPercentageSize = function(size) {
2746 return size && size.indexOf('%') != -1;
2747};
2748ASPx.GetElementById = function(id) {
2749 if(document.getElementById)
2750  return document.getElementById(id);
2751 else
2752  return document.all[id];
2753};
2754ASPx.GetElementByIdInDocument = function(documentObj, id) {
2755 if(documentObj.getElementById)
2756  return documentObj.getElementById(id);
2757 else
2758  return documentObj.all[id];
2759};
2760ASPx.GetIsParent = function(parentElement, element) {
2761 if(!parentElement || !element)
2762  return false;
2763 while(element){
2764  if(element === parentElement)
2765   return true;
2766  if(element.tagName === "BODY")
2767   return false;
2768  element = element.parentNode;
2769 }
2770 return false;
2771};
2772ASPx.GetParentById = function(element, id) {
2773 element = element.parentNode;
2774 while(element){
2775  if(element.id === id)
2776   return element;
2777  element = element.parentNode;
2778 }
2779 return null;
2780};
2781ASPx.GetParentByPartialId = function(element, idPart){
2782 while(element && element.tagName != "BODY") {
2783  if(element.id && element.id.match(idPart)) 
2784   return element;
2785  element = element.parentNode;
2786 }
2787 return null;
2788};
2789ASPx.GetParentByTagName = function(element, tagName) {
2790 tagName = tagName.toUpperCase();
2791 while(element) {
2792  if(element.tagName === "BODY")
2793   return null;
2794  if(element.tagName === tagName)
2795   return element;
2796  element = element.parentNode;
2797 }
2798 return null;
2799};
2800function getParentByCondition(element, conditionArg, condition) {
2801 while(element != null) {
2802  if(element.tagName == "BODY" || element.nodeName == "#document")
2803   return null;
2804  if (condition(element, conditionArg))
2805   return element;
2806  element = element.parentNode;
2807 }
2808 return null;
2809}
2810ASPx.GetParentByPartialClassName = function(element, className) {
2811 return getParentByCondition(element, className, ASPx.ElementContainsCssClass);
2812};
2813ASPx.GetParentByClassName = function(element, className) {
2814 return getParentByCondition(element, className, ASPx.ElementHasCssClass);
2815};
2816ASPx.GetParentBySelector = function (element, selector) {
2817 return getParentByCondition(element, selector, ASPx.ElementMatchesSelector);
2818};
2819ASPx.GetParentByTagNameAndAttributeValue = function(element, tagName, attrName, attrValue) {
2820 tagName = tagName.toUpperCase();
2821 while(element != null) {
2822  if(element.tagName == "BODY")
2823   return null;
2824  if(element.tagName == tagName && element[attrName] == attrValue)
2825   return element;
2826  element = element.parentNode;
2827 }
2828 return null;
2829};
2830ASPx.GetParent = function(element, testFunc){
2831 if (!ASPx.IsExists(testFunc)) return null;
2832 while(element != null && element.tagName != "BODY"){
2833  if(testFunc(element))
2834   return element;
2835  element = element.parentNode;
2836 }
2837 return null;
2838};
2839ASPx.GetElementTreeLine = function(element, stopTagName, stopFunc) {
2840 var result = [];
2841 stopTagName = stopTagName || "BODY";
2842 while(element != null) {
2843  if(!stopFunc && element.tagName == stopTagName)
2844   break;
2845  if(stopFunc && stopFunc(element))
2846   break;
2847  result.push(element);
2848  element = element.parentNode;
2849 }
2850 return result;
2851};
2852ASPx.IsScrollableElement = function(element, isHorzScrollable, isVertScrollable) {
2853 isHorzScrollable = ASPx.IsExists(isHorzScrollable) ? isHorzScrollable : true;
2854 isVertScrollable = ASPx.IsExists(isVertScrollable) ? isVertScrollable : true;
2855 var style = ASPx.GetCurrentStyle(element);
2856 var overflowStyleNames = ["overflow"];
2857 if(isHorzScrollable)
2858  overflowStyleNames.push("overflowX");
2859 if(isVertScrollable)
2860  overflowStyleNames.push("overflowY");
2861 for(var i = 0; i < overflowStyleNames.length; i++)
2862  if(style[overflowStyleNames[i]] == "scroll" || style[overflowStyleNames[i]] == "auto")
2863   return true;
2864 return false;
2865};
2866ASPx.GetPreviousSibling = function(el) {
2867 if(el.previousElementSibling) {
2868  return el.previousElementSibling;
2869 } else {
2870  while(el = el.previousSibling) {
2871   if(el.nodeType === 1)
2872    return el;
2873  }
2874 }
2875};
2876ASPx.ElementMatchesSelector = (function (e) {
2877 return (function (matches) {
2878  return function (el, selector) { return !!el && !!selector && matches.call(el, selector); };
2879 })(e.matches || e.matchesSelector || e.webkitMatchesSelector || e.mozMatchesSelector || e.msMatchesSelector || e.oMatchesSelector);
2880})(Element.prototype);
2881ASPx.ElementHasCssClass = function(element, className) {
2882 try {
2883  var elementClasses;
2884  var classList = ASPx.GetClassNameList(element);
2885  if(!classList) {
2886   var elementClassName = ASPx.GetClassName(element);
2887   if(!elementClassName) {
2888    return false;
2889   }
2890   elementClasses = elementClassName.split(" ");
2891  }
2892  var classNames = className.split(" ");
2893  for(var i = classNames.length - 1; i >= 0; i--) {
2894   if(classList) {
2895    if(classList.indexOf(classNames[i]) === -1)
2896     return false;
2897    continue;
2898   }
2899   if(Data.ArrayIndexOf(elementClasses, classNames[i]) < 0)
2900    return false;
2901  }
2902  return true;
2903 } catch(e) {
2904  return false;
2905 }
2906};
2907ASPx.ElementContainsCssClass = function(element, className) {
2908 try {
2909  var elementClassName = ASPx.GetClassName(element);
2910  if(!elementClassName) {
2911   return false;
2912  }
2913  return elementClassName.indexOf(className) != -1;
2914 } catch(e) {
2915  return false;
2916 }
2917};
2918ASPx.AddClassNameToElement = function (element, className) {
2919 if(!element || typeof(className) !== "string" ) return;
2920 className = className.trim();
2921 if(!ASPx.ElementHasCssClass(element, className) && className !== "") {
2922  var oldClassName = ASPx.GetClassName(element);
2923  ASPx.SetClassName(element, (oldClassName === "") ? className : oldClassName + " " + className);
2924 }
2925};
2926ASPx.AddClassNamesToElement = function(element, classNames) {
2927 Data.ForEach(classNames, function(className) { ASPx.AddClassNameToElement(element, className); });
2928};
2929ASPx.CombineCssClasses = function() {
2930 return Array.prototype.slice.call(arguments).join(" ");
2931};
2932ASPx.RemoveClassNameFromElement = function(element, className) {
2933 if(!element) return;
2934 var elementClassName = ASPx.GetClassName(element);
2935 var updClassName = " " + elementClassName + " ";
2936 var newClassName = updClassName.replace(" " + className + " ", " ");
2937 if(updClassName.length != newClassName.length)
2938  ASPx.SetClassName(element, Str.Trim(newClassName));  
2939};
2940ASPx.RemoveClassNamesFromElement = function(element, classNames) {
2941 if(!element) return;
2942 for(var i = 0; i < classNames.length; i++) {
2943  var className = classNames[i];
2944  element.classList.remove(className);
2945 }
2946};
2947ASPx.ToggleClassNameToElement = function(element, className, toggleState) {
2948 if(!toggleState)
2949  ASPx.RemoveClassNameFromElement(element, className);
2950 if(toggleState && !ASPx.ElementHasCssClass(element, className))
2951  ASPx.AddClassNameToElement(element, className);
2952};
2953ASPx.GetClassNameList = function(element) {
2954 var result = [];
2955 if(element) {
2956  if(element.tagName === "svg") {
2957   result = ASPx.GetClassName(element).replace(/^\s+|\s+$/g, '').split(/\s+/);
2958  }
2959  else {
2960   result = element.classList ? [].slice.call(element.classList) : ASPx.GetClassName(element).replace(/^\s+|\s+$/g, '').split(/\s+/);
2961  }
2962 }
2963 return result;
2964};
2965ASPx.GetClassName = function(element) {
2966 var result = "";
2967 if(element) {
2968  if(element.tagName === "svg") {
2969   result = element.className.baseVal;
2970  }
2971  else {
2972   result = element.className ? element.className : "";
2973  }
2974 }
2975 return result;
2976};
2977ASPx.SetClassName = function(element, className) {
2978 if(element.tagName === "svg") {
2979  element.className.baseVal = Str.Trim(className);
2980 }
2981 else {
2982  element.className = Str.Trim(className);
2983 }
2984};
2985ASPx.GetElementOffsetWidth = function(element) {
2986 if(element.tagName === "svg") {
2987  return element.getBoundingClientRect().width;
2988 }
2989 else {
2990  return element.offsetWidth;
2991 }
2992};
2993ASPx.GetElementOffsetHeight = function(element) {
2994 if(element.tagName === "svg") {
2995  return element.getBoundingClientRect().height;
2996 }
2997 else {
2998  return element.offsetHeight;
2999 }
3000};
3001function nodeListToArray(nodeList, filter) {
3002 var result = [];
3003 for(var i = 0, element; element = nodeList[i]; i++) {
3004  if(filter && !filter(element))
3005   continue;
3006  result.push(element);
3007 }
3008 return result;
3009}
3010ASPx.NodeListToArray = nodeListToArray;
3011function getItemByIndex(collection, index) {
3012 if(!index) index = 0;
3013 if(collection != null && collection.length > index)
3014  return collection[index];
3015 return null;
3016}
3017ASPx.GetChildNodesByQuerySelector = function (parent, selector) {
3018 return nodeListToArray(parent.querySelectorAll(selector), function (el) { return el.parentNode === parent; });
3019};
3020ASPx.GetChildNodesByClassName = function(parent, className) {
3021 if(!parent) return [];
3022 if(parent.querySelectorAll) {
3023  var children = parent.querySelectorAll('.' + className);
3024  return nodeListToArray(children, function(element) { 
3025   return element.parentNode === parent;
3026  });
3027 }
3028 return ASPx.GetChildNodes(parent, function(elem) { return elem.className && ASPx.ElementHasCssClass(elem, className); });
3029};
3030ASPx.GetChildNodesByPartialClassName = function(element, className) {
3031 return ASPx.GetChildElementNodesByPredicate(element,
3032  function(child) {
3033   return ASPx.ElementContainsCssClass(child, className);
3034  });
3035};
3036ASPx.GetChildByPartialClassName = function(element, className, index) {
3037 if(element != null){    
3038  var collection = ASPx.GetChildNodesByPartialClassName(element, className);
3039  return getItemByIndex(collection, index);
3040 }
3041 return null;
3042};
3043ASPx.GetChildByClassName = function(element, className, index) {
3044 if(element != null){    
3045  var collection = ASPx.GetChildNodesByClassName(element, className);
3046  return getItemByIndex(collection, index);
3047 }
3048 return null;
3049};
3050ASPx.GetNodesByPartialClassName = function(element, className) {
3051 if(element.querySelectorAll) {
3052  var list = element.querySelectorAll('*[class*=' + className + ']');
3053  return nodeListToArray(list);
3054 }
3055 var collection = element.all || element.getElementsByTagName('*');
3056 var ret = [ ];
3057 if(collection != null) {
3058  for(var i = 0; i < collection.length; i ++) {
3059   if(ASPx.ElementContainsCssClass(collection[i], className))
3060    ret.push(collection[i]);
3061  }
3062 }
3063 return ret;
3064};
3065ASPx.GetNodesByClassName = function(parent, className) {
3066 if(parent.querySelectorAll) {
3067  var children = parent.querySelectorAll('.' + className);
3068  return nodeListToArray(children);
3069 }
3070 return ASPx.GetNodes(parent, function(elem) { return elem.className && ASPx.ElementHasCssClass(elem, className); });
3071};
3072ASPx.GetNodeByClassName = function(element, className, index) {
3073 if(element != null){    
3074  var collection = ASPx.GetNodesByClassName(element, className);
3075  return getItemByIndex(collection, index);
3076 }
3077 return null;
3078};
3079ASPx.GetChildById = function(element, id) {
3080 if(element.all) {
3081  var child = element.all[id];
3082  if(!child) {
3083   child = element.all(id); 
3084   if(!child)
3085    return null; 
3086  } 
3087  if(!ASPx.IsExists(child.length)) 
3088   return child;
3089  else
3090   return ASPx.GetElementById(id);
3091 }
3092 else
3093  return ASPx.GetElementById(id);
3094};
3095ASPx.GetNodesByPartialId = function(element, partialName, list) {
3096 if(element.id && element.id.indexOf(partialName) > -1) 
3097  list.push(element);
3098 if(element.childNodes) {
3099  for(var i = 0; i < element.childNodes.length; i ++) 
3100   ASPx.GetNodesByPartialId(element.childNodes[i], partialName, list);
3101 }
3102};
3103ASPx.GetNodesByTagName = function(element, tagName) {
3104 var tagNameToUpper = tagName.toUpperCase();
3105 var result = null;
3106 if(element) {
3107  if(element.getElementsByTagName) {
3108   result = element.getElementsByTagName(tagNameToUpper);
3109   if(result.length === 0) {
3110    result = element.getElementsByTagName(tagName);
3111   }
3112  }
3113  else if(element.all && element.all.tags !== undefined)
3114   result = Browser.Netscape ? element.all.tags[tagNameToUpper] : element.all.tags(tagNameToUpper);
3115 }
3116 return result;
3117};
3118ASPx.GetNodeByTagName = function(element, tagName, index) {
3119 if(element != null){    
3120  var collection = ASPx.GetNodesByTagName(element, tagName);
3121  return getItemByIndex(collection, index);
3122 }
3123 return null;
3124};
3125ASPx.GetChildNodesByTagName = function(parent, tagName) {
3126 return ASPx.GetChildNodes(parent, function (child) { return child.tagName === tagName; });
3127};
3128ASPx.GetChildByTagName = function(element, tagName, index) {
3129 if(element != null){    
3130  var collection = ASPx.GetChildNodesByTagName(element, tagName);
3131  return getItemByIndex(collection, index);
3132 }
3133 return null;
3134};
3135ASPx.RetrieveByPredicate = function(scourceCollection, predicate) {
3136 var result = [];
3137 for(var i = 0; i < scourceCollection.length; i++) {
3138  var element = scourceCollection[i];
3139  if(!predicate || predicate(element)) 
3140   result.push(element);
3141 }
3142 return result;
3143};
3144ASPx.GetChildNodes = function(parent, predicate) {
3145 return ASPx.RetrieveByPredicate(parent.childNodes, predicate);
3146};
3147ASPx.GetNodes = function(parent, predicate) {
3148 var c = parent.all || parent.getElementsByTagName('*');
3149 return ASPx.RetrieveByPredicate(c, predicate);
3150};
3151ASPx.GetChildElementNodes = function(parent) {
3152 if(!parent) return null;
3153 return ASPx.GetChildNodes(parent, function(e) { return e.nodeType == 1; });
3154};
3155ASPx.GetChildElementNodesByPredicate = function(parent, predicate) {
3156 if(!parent) return null;
3157 if(!predicate) return ASPx.GetChildElementNodes(parent);
3158 return ASPx.GetChildNodes(parent, function(e) { return e.nodeType == 1 && predicate(e); });
3159};
3160ASPx.GetTextNode = function(element, index) {
3161 if(element != null){
3162  var collection = [ ];
3163  ASPx.GetTextNodes(element, collection);
3164  return getItemByIndex(collection, index);
3165 }
3166 return null;
3167};
3168ASPx.GetTextNodes = function(element, collection) {
3169 if(element.tagName === "svg")
3170  return;
3171 for(var i = 0; i < element.childNodes.length; i ++){
3172  var childNode = element.childNodes[i];
3173  if(ASPx.IsExists(childNode.nodeValue))
3174   collection.push(childNode);
3175  ASPx.GetTextNodes(childNode, collection);
3176 }
3177};
3178ASPx.GetNormalizedTextNode = function(element, index) {
3179 var textNode = ASPx.GetTextNode(element, index);
3180 if(textNode != null)
3181  ASPx.MergeAdjacentTextNodes(textNode);
3182 return textNode;
3183};
3184ASPx.MergeAdjacentTextNodes = function(firstTextNode) {
3185 if(!ASPx.IsExists(firstTextNode.nodeValue))
3186  return;
3187 var textNode = firstTextNode;
3188 while(textNode.nextSibling && ASPx.IsExists(textNode.nextSibling.nodeValue)) {
3189  textNode.nodeValue += textNode.nextSibling.nodeValue;
3190  textNode.parentNode.removeChild(textNode.nextSibling);
3191 }
3192};
3193ASPx.GetElementDocument = function(element) {
3194 return element.document || element.ownerDocument;
3195};
3196ASPx.RemoveElement = function(element) {
3197 if(element && element.parentNode)
3198  element.parentNode.removeChild(element);
3199};
3200ASPx.ReplaceTagName = function(element, newTagName, cloneChilds) {
3201 if(element.nodeType != 1)
3202  return null;
3203 if(element.nodeName == newTagName)
3204  return element;
3205 cloneChilds = cloneChilds !== undefined ? cloneChilds : true;
3206 var doc = element.ownerDocument;
3207 var newElem = doc.createElement(newTagName);
3208 Attr.CopyAllAttributes(element, newElem);
3209 if(cloneChilds) {
3210  for(var i = 0; i < element.childNodes.length; i++)
3211   newElem.appendChild(element.childNodes[i].cloneNode(true));
3212 }
3213 else {
3214  for(var child; child = element.firstChild; )
3215   newElem.appendChild(child);
3216 }
3217 element.parentNode.replaceChild(newElem, element);
3218 return newElem;
3219};
3220ASPx.RemoveOuterTags = function(element) {
3221 var docFragment = element.ownerDocument.createDocumentFragment();
3222 for(var i = 0; i < element.childNodes.length; i++)
3223  docFragment.appendChild(element.childNodes[i].cloneNode(true));
3224 element.parentNode.replaceChild(docFragment, element);
3225};
3226ASPx.WrapElementInNewElement = function(element, newElementTagName) { 
3227 var wrapElement = null;
3228 var docFragment = element.ownerDocument.createDocumentFragment();
3229 wrapElement = element.ownerDocument.createElement(newElementTagName);
3230 docFragment.appendChild(wrapElement);
3231 wrapElement.appendChild(element.cloneNode(true));
3232 element.parentNode.replaceChild(docFragment, element);
3233 return wrapElement;
3234};
3235ASPx.InsertElementAfter = function(newElement, targetElement) {
3236 var parentElem = targetElement.parentNode;
3237 if(parentElem.childNodes[parentElem.childNodes.length - 1] == targetElement)
3238  parentElem.appendChild(newElement);
3239 else if(newElement !== targetElement.nextSibling)
3240  parentElem.insertBefore(newElement, targetElement.nextSibling);
3241};
3242ASPx.SetElementOpacity = function(element, value) {
3243  element.style.opacity = value;
3244};
3245ASPx.GetElementOpacity = function(element) {
3246 return parseFloat(ASPx.GetCurrentStyle(element).opacity);
3247};
3248ASPx.HiddenChangable = "dx-hc";
3249ASPx.DefaultDisplayNoneSelectors = [ "dxmodalSys" ];
3250ASPx.DefaultDisplaySelectors = ["show"];
3251function getIsDefaultDisplayNone(element) {
3252 for(var i = 0; i < ASPx.DefaultDisplayNoneSelectors.length; i++) {
3253  if(ASPx.ElementHasCssClass(element, ASPx.DefaultDisplayNoneSelectors[i]))
3254   return true;
3255 }
3256 return false;
3257}
3258ASPx.GetElementDisplay = function(element, isCurrentStyle) {
3259 if(isCurrentStyle) {
3260  var currentStyle = ASPx.GetCurrentStyle(element);
3261  if(currentStyle)
3262   return currentStyle.display != "none";
3263 }
3264 if(getIsDefaultDisplayNone(element))
3265  return element.style.display != "none" && element.style.display != "" || ASPx.DefaultDisplaySelectors.some(function(s) { return ASPx.ElementHasCssClass(element, s); });
3266 return element.style.display != "none" && !ASPx.ElementHasCssClass(element, ASPx.HiddenChangable);
3267};
3268ASPx.SetElementDisplay = function(element, value) {
3269 if(!element) return;
3270 if(ASPx.ElementHasCssClass(element, ASPx.HiddenChangable))
3271  ASPx.RemoveClassNameFromElement(element, ASPx.HiddenChangable);
3272 if(typeof(value) === "string")
3273  element.style.display = value;
3274 else if(getIsDefaultDisplayNone(element))
3275  element.style.display = value ? (element.tagName === "TABLE" ? "table" : "block") : "";
3276 else if(!value)
3277  element.style.display = "none";
3278 else
3279  element.style.display = "";
3280};
3281ASPx.GetElementVisibility = function(element, isCurrentStyle) {
3282 if(isCurrentStyle) {
3283  var currentStyle = ASPx.GetCurrentStyle(element);
3284  if(currentStyle)
3285   return currentStyle.visibility != "hidden";
3286 }
3287 return element.style.visibility != "hidden";
3288};
3289ASPx.SetElementVisibility = function(element, value) {
3290 if(!element) return;
3291 if(typeof(value) === "string")
3292  element.style.visibility = value;
3293 else
3294  element.style.visibility = value ? "visible" : "hidden";
3295};
3296ASPx.IsElementVisible = function(element, isCurrentStyle) {
3297 if(!element) return false;
3298 while(element && element.tagName != "BODY") {
3299  if(!ASPx.GetElementDisplay(element, isCurrentStyle) || (!ASPx.GetElementVisibility(element, isCurrentStyle) && !Attr.IsExistsAttribute(element, "errorFrame")))
3300     return false;
3301  element = element.parentNode;
3302 }
3303 return true;
3304};
3305ASPx.IsElementDisplayed = function(element) {
3306 if(!element) return false;
3307 while(element && element.tagName != "BODY") {
3308  if(!ASPx.GetElementDisplay(element))
3309     return false;
3310  element = element.parentNode;
3311 }
3312 return true;
3313};
3314ASPx.GetElementInitializedFlag = function(element) {
3315 return element["dxinit"];
3316};
3317ASPx.SetElementInitializedFlag = function(element) {
3318 element["dxinit"] = true;
3319};
3320ASPx.AddStyleSheetLinkToDocument = function(doc, linkUrl) {
3321 var newLink = createStyleLink(doc, linkUrl);
3322 var head = ASPx.GetHeadElementOrCreateIfNotExist(doc);
3323 head.appendChild(newLink);
3324 return newLink;
3325};
3326ASPx.GetHeadElementOrCreateIfNotExist = function(doc) {
3327 var elements = ASPx.GetNodesByTagName(doc, "head");
3328 var head = null;
3329 if(elements.length == 0) {
3330  head = doc.createElement("head");
3331  head.visibility = "hidden";
3332  doc.insertBefore(head, doc.body);
3333 } else
3334  head = elements[0];
3335 return head;
3336};
3337function createStyleLink(doc, url) {
3338 var newLink = doc.createElement("link");
3339 Attr.SetAttribute(newLink, "href", url);
3340 Attr.SetAttribute(newLink, "rel", "stylesheet");
3341 Attr.AppendStyleType(newLink);
3342 return newLink;
3343}
3344ASPx.GetCurrentStyle = function(element) {
3345 if(document.defaultView && document.defaultView.getComputedStyle) { 
3346  var result = document.defaultView.getComputedStyle(element, null);
3347  if(!result && Browser.Firefox && window.frameElement) {
3348   var changes = [];
3349   var curElement = window.frameElement;
3350   while(!(result = document.defaultView.getComputedStyle(element, null))) {
3351    changes.push([curElement, curElement.style.display]);
3352    ASPx.SetStylesCore(curElement, "display", "block", true);
3353    curElement = curElement.tagName == "BODY" ? curElement.ownerDocument.defaultView.frameElement : curElement.parentNode;
3354   }
3355   result = ASPx.CloneObject(result);
3356   for(var ch, i = 0; ch = changes[i]; i++)
3357    ASPx.SetStylesCore(ch[0], "display", ch[1]);
3358   var dummy = document.body.offsetWidth; 
3359  }
3360  if(Browser.Firefox && Browser.MajorVersion >= 62 && window.frameElement && result.length === 0) { 
3361   result = ASPx.CloneObject(result);
3362   result.display = element.style.display;
3363  }
3364  return result;
3365 }
3366 return window.getComputedStyle(element, null);
3367};
3368ASPx.CreateStyleSheetInDocument = function(doc) {
3369 if(doc.createStyleSheet) {
3370  try {
3371   return doc.createStyleSheet();
3372  }
3373  catch(e) {
3374   var message = "The CSS link limit (31) has been exceeded. Please enable CSS merging or reduce the number of CSS files on the page. For details, see https://supportcenter.devexpress.com/ticket/details/k18487/.";
3375   throw new Error(message);
3376  }
3377 }
3378 else {
3379  var styleSheet = doc.createElement("STYLE");
3380  ASPx.GetNodeByTagName(doc, "HEAD", 0).appendChild(styleSheet);
3381  return styleSheet.sheet;
3382 }
3383};
3384ASPx.currentStyleSheet = null;
3385ASPx.GetCurrentStyleSheet = function() {
3386 if(!ASPx.currentStyleSheet)
3387  ASPx.currentStyleSheet = ASPx.CreateStyleSheetInDocument(document);
3388 return ASPx.currentStyleSheet;
3389};
3390function getStyleSheetRules(styleSheet){
3391 try {
3392  if (styleSheet.href && styleSheet.href.indexOf("file:///") === 0)
3393   return null;
3394  return styleSheet.cssRules;
3395 }
3396 catch(e) {
3397  return null;
3398 }
3399}
3400ASPx.cachedCssRules = { };
3401ASPx.GetStyleSheetRules = function (className, stylesStorageDocument) {
3402 if(ASPx.cachedCssRules[className]) {
3403  if(ASPx.cachedCssRules[className] != ASPx.EmptyObject)
3404   return ASPx.cachedCssRules[className];
3405  return null;
3406 }
3407 var result = iterateStyleSheetRules(stylesStorageDocument, function(rule) {
3408  if(rule.selectorText == "." + className){
3409   ASPx.cachedCssRules[className] = rule;
3410   return rule;
3411  }
3412 });
3413 if(ASPx.IsExists(result))
3414  return result;
3415 ASPx.cachedCssRules[className] = ASPx.EmptyObject;
3416 return null;
3417};
3418function iterateStyleSheetRules(stylesStorageDocument, callback) {
3419 var doc = stylesStorageDocument || document;
3420 for(var i = 0; i < doc.styleSheets.length; i ++){
3421  var styleSheet = doc.styleSheets[i];
3422  var rules = getStyleSheetRules(styleSheet);
3423  if(rules != null){
3424   for(var j = 0; j < rules.length; j ++) {
3425    var result = callback(rules[j]);
3426    if(result !== undefined)
3427     return result;
3428   }
3429  }
3430 }
3431}
3432ASPx.ProcessStyleSheetRules = function(prefix, callback) {
3433 iterateStyleSheetRules(null, function(rule) {
3434  if(!!rule.selectorText && rule.selectorText.indexOf(prefix) === 0) {
3435   var name = rule.selectorText.substring(prefix.length);
3436   var result = callback(name, rule.style, rule);
3437   if(result !== undefined)
3438    return result;
3439  }
3440 });
3441};
3442ASPx.ClearCachedCssRules = function(){
3443 ASPx.cachedCssRules = { };
3444};
3445var styleCount = 0;
3446var styleNameCache = { };
3447ASPx.CreateImportantStyleRule = function(styleSheet, cssText, postfix, prefix) {
3448 styleSheet = styleSheet || ASPx.GetCurrentStyleSheet();
3449 var cacheKey = (postfix ? postfix + "||" : "") + cssText + (prefix ? "||" + prefix : "");
3450 if(styleNameCache[cacheKey])
3451  return styleNameCache[cacheKey];
3452 prefix = prefix ? prefix + " " : "";
3453 var className = "dxh" + styleCount + (postfix ? postfix : "");
3454 ASPx.AddStyleSheetRule(styleSheet, prefix + "." + className, ASPx.CreateImportantCssText(cssText));
3455 styleCount++;
3456 styleNameCache[cacheKey] = className;
3457 return className; 
3458};
3459ASPx.CreateImportantCssText = function(cssText) {
3460 var newText = "";
3461 var hasEncodedSemicolon = cssText.indexOf(ASPx.StyleValueEncodedSemicolon) > -1;
3462 var attributes = cssText.split(";");
3463 for(var i = 0; i < attributes.length; i++) {
3464  var rule = attributes[i];
3465  if(rule != "")
3466   newText += ASPx.CreateImportantCssRule(rule, hasEncodedSemicolon);
3467 }
3468 return newText;
3469};
3470ASPx.CreateImportantCssRule = function(rule, hasEncodedSemicolon) {
3471 var result = rule;
3472 if(hasEncodedSemicolon) {
3473  var regex = new RegExp(ASPx.StyleValueEncodedSemicolon, "g");
3474  result = result.replace(regex, ";");
3475 }
3476 result = result + " !important;";
3477 return result;
3478};
3479ASPx.AddStyleSheetRule = function(styleSheet, selector, cssText){
3480 if(!cssText) return;
3481 var index = styleSheet.cssRules.length;
3482 styleSheet.insertRule(selector + " { " + cssText + " }", index);
3483 return styleSheet.cssRules[index];
3484};
3485ASPx.GetPointerCursor = function() {
3486 return "pointer";
3487};
3488ASPx.SetPointerCursor = function(element) {
3489 if(element.style.cursor == "")
3490  element.style.cursor = ASPx.GetPointerCursor();
3491};
3492ASPx.SetElementFloat = function(element, value) {
3493 if(ASPx.IsExists(element.style.cssFloat))
3494  element.style.cssFloat = value;
3495 else if(ASPx.IsExists(element.style.styleFloat))
3496  element.style.styleFloat = value;
3497 else
3498  Attr.SetAttribute(element.style, "float", value);
3499};
3500ASPx.GetElementFloat = function(element) {
3501 var currentStyle = ASPx.GetCurrentStyle(element);
3502 if(ASPx.IsExists(currentStyle.cssFloat))
3503  return currentStyle.cssFloat;
3504 if(ASPx.IsExists(currentStyle.styleFloat))
3505  return currentStyle.styleFloat;
3506 return Attr.GetAttribute(currentStyle, "float");
3507};
3508function getElementDirection(element) {
3509 return ASPx.GetCurrentStyle(element).direction;
3510}
3511ASPx.IsElementRightToLeft = function(element) {
3512 return getElementDirection(element) == "rtl";
3513};
3514ASPx.AdjustVerticalMarginsInContainer = function(container) {
3515 var containerBorderAndPaddings = ASPx.GetTopBottomBordersAndPaddingsSummaryValue(container);
3516 var flowElements = [], floatElements = [], floatTextElements = [];
3517 var maxHeight = 0, maxFlowHeight = 0;
3518 for(var i = 0; i < container.childNodes.length; i++) {
3519  var element = container.childNodes[i];
3520  if(!element.offsetHeight) continue;
3521  ASPx.ClearVerticalMargins(element);
3522 }
3523 for(var i = 0; i < container.childNodes.length; i++) {
3524  var element = container.childNodes[i];
3525  if(!element.offsetHeight) continue;
3526  var float = ASPx.GetElementFloat(element);
3527  var isFloat = (float === "left" || float === "right");
3528  if(isFloat)
3529   floatElements.push(element);
3530  else {
3531   flowElements.push(element);
3532   if(element.tagName !== "IMG"){
3533    if(!ASPx.IsTextWrapped(element))
3534     element.style.verticalAlign = 'baseline'; 
3535    floatTextElements.push(element);
3536   }
3537   if(element.tagName === "DIV")
3538    Attr.ChangeStyleAttribute(element, "float", "left"); 
3539  }
3540  if(element.offsetHeight > maxHeight) 
3541   maxHeight = element.offsetHeight;
3542  if(!isFloat && element.offsetHeight > maxFlowHeight) 
3543   maxFlowHeight = element.offsetHeight;
3544 }
3545 for(var i = 0; i < flowElements.length; i++) 
3546  Attr.RestoreStyleAttribute(flowElements[i], "float");
3547 var containerBorderAndPaddings = ASPx.GetTopBottomBordersAndPaddingsSummaryValue(container);
3548 var containerHeight = container.offsetHeight - containerBorderAndPaddings;
3549 if(maxHeight == containerHeight) {
3550  var verticalAlign = ASPx.GetCurrentStyle(container).verticalAlign;
3551  for(var i = 0; i < floatTextElements.length; i++)
3552   floatTextElements[i].style.verticalAlign = '';
3553  containerHeight = container.offsetHeight - containerBorderAndPaddings;
3554  for(var i = 0; i < floatElements.length; i++)
3555   adjustVerticalMarginsCore(floatElements[i], containerHeight, verticalAlign, true);
3556  for(var i = 0; i < flowElements.length; i++) {
3557   if(maxFlowHeight != maxHeight)
3558    adjustVerticalMarginsCore(flowElements[i], containerHeight, verticalAlign);
3559  }
3560 }
3561};
3562ASPx.AdjustVerticalMargins = function(element) {
3563 ASPx.ClearVerticalMargins(element);
3564 var parentElement = element.parentNode;
3565 var parentHeight = parentElement.getBoundingClientRect().height - ASPx.GetTopBottomBordersAndPaddingsSummaryValue(parentElement);
3566 adjustVerticalMarginsCore(element, parentHeight, ASPx.GetCurrentStyle(parentElement).verticalAlign);
3567};
3568function adjustVerticalMarginsCore(element, parentHeight, verticalAlign, toBottom) {
3569 var marginTop;
3570 if(verticalAlign == "top")
3571  marginTop = 0;
3572 else if(verticalAlign == "bottom")
3573  marginTop = parentHeight - element.getBoundingClientRect().height;
3574 else
3575  marginTop = (parentHeight - element.getBoundingClientRect().height) / 2;
3576 if(marginTop !== 0){
3577  element.style.marginTop = marginTop + "px";
3578 }
3579}
3580ASPx.ClearVerticalMargins = function(element) {
3581 element.style.marginTop = "";
3582 element.style.marginBottom = "";
3583};
3584ASPx.AdjustHeightInContainer = function(container) {
3585 var height = container.offsetHeight - ASPx.GetTopBottomBordersAndPaddingsSummaryValue(container);
3586 for(var i = 0; i < container.childNodes.length; i++) {
3587  var element = container.childNodes[i];
3588  if(!element.offsetHeight) continue;
3589  ASPx.ClearHeight(element);
3590 }
3591 var elements = [];
3592 var childrenHeight = 0;
3593 for(var i = 0; i < container.childNodes.length; i++) {
3594  var element = container.childNodes[i];
3595  if(!element.offsetHeight) continue;
3596  childrenHeight += element.offsetHeight + ASPx.GetTopBottomMargins(element);
3597  elements.push(element);
3598 }
3599 if(elements.length > 0 && childrenHeight < height) {
3600  var correctedHeight = 0;
3601  for(var i = 0; i < elements.length; i++) {
3602   var elementHeight = 0;
3603   if(i < elements.length - 1){
3604    var elementHeight = Math.floor(height / elements.length);
3605    correctedHeight += elementHeight;
3606   }
3607   else{
3608    var elementHeight = height - correctedHeight;
3609    if(elementHeight < 0) elementHeight = 0;
3610   }
3611   adjustHeightCore(elements[i], elementHeight);
3612  }
3613 }
3614};
3615ASPx.AdjustHeight = function(element) {
3616 ASPx.ClearHeight(element);
3617 var parentElement = element.parentNode;
3618 var height = parentElement.getBoundingClientRect().height - ASPx.GetTopBottomBordersAndPaddingsSummaryValue(parentElement);
3619 adjustHeightCore(element, height);
3620};
3621function adjustHeightCore(element, height) {
3622 var height = height - ASPx.GetTopBottomBordersAndPaddingsSummaryValue(element);
3623 if(height < 0) height = 0;
3624 element.style.height = height + "px";
3625}
3626ASPx.ClearHeight = function(element) {
3627 element.style.height = "";
3628};
3629ASPx.ShrinkWrappedTextInContainer = function(container) {
3630 if(!container) return;
3631 for(var i = 0; i < container.childNodes.length; i++){
3632  var child = container.childNodes[i];
3633  if(child.style && ASPx.IsTextWrapped(child)) {
3634   Attr.ChangeStyleAttribute(child, "width", "1px");
3635   child.shrinkedTextContainer = true;
3636  }
3637 }
3638};
3639ASPx.AdjustWrappedTextInContainer = function(container) {
3640 if(!container) return;
3641 var textContainer, leftWidth = 0, rightWidth = 0;
3642 for(var i = 0; i < container.childNodes.length; i++){
3643  var child = container.childNodes[i];
3644  if(child.tagName === "BR")
3645   return;
3646  if(!child.tagName)
3647   continue;
3648  if(child.tagName !== "IMG"){
3649   textContainer = child;
3650   if(ASPx.IsTextWrapped(textContainer)){
3651    if(!textContainer.shrinkedTextContainer)
3652     textContainer.style.width = "";
3653    textContainer.style.marginRight = "";
3654   }
3655  }
3656  else {
3657   if(ASPx.GetElementOffsetWidth(child)=== 0)
3658    Evt.AttachEventToElement(child, "load", function(evt) { ASPx.AdjustWrappedTextInContainer(container); });
3659   else {
3660    var width = ASPx.GetElementOffsetWidth(child) + ASPx.GetLeftRightMargins(child);
3661    if(textContainer)
3662     rightWidth += width;
3663    else
3664     leftWidth += width;
3665   }
3666  }
3667 }
3668 if(textContainer && ASPx.IsTextWrapped(textContainer)) {
3669  var containerWidth = ASPx.GetElementOffsetWidth(container) - ASPx.GetLeftRightBordersAndPaddingsSummaryValue(container);
3670  if(textContainer.shrinkedTextContainer) {
3671   Attr.RestoreStyleAttribute(textContainer, "width");
3672   Attr.ChangeStyleAttribute(container, "width", containerWidth + "px");
3673  }
3674  if(ASPx.GetElementOffsetWidth(textContainer) + leftWidth + rightWidth >= containerWidth) {
3675    if(rightWidth > 0 && !textContainer.shrinkedTextContainer)
3676    textContainer.style.width = (containerWidth - rightWidth) + "px";
3677   else if(leftWidth > 0){
3678    if(ASPx.IsElementRightToLeft(container))
3679     textContainer.style.marginLeft = leftWidth + "px";
3680    else
3681     textContainer.style.marginRight = leftWidth + "px";
3682   }
3683  }
3684 }
3685};
3686ASPx.IsTextWrapped = function(element) {
3687 return element && ASPx.GetCurrentStyle(element).whiteSpace !== "nowrap";
3688};
3689ASPx.IsValidPosition = function(pos){
3690 return pos != ASPx.InvalidPosition && pos != -ASPx.InvalidPosition;
3691};
3692ASPx.getSpriteMainElement = function(element) {
3693 var cssClassMarker = "dx-acc";
3694 if(ASPx.ElementContainsCssClass(element, cssClassMarker))
3695  return element;
3696 if(element.parentNode && ASPx.ElementContainsCssClass(element.parentNode, cssClassMarker))
3697  return element.parentNode;
3698 return element;
3699};
3700ASPx.GetAbsoluteX = function(curEl){
3701 return ASPx.GetAbsolutePositionX(curEl);
3702};
3703ASPx.GetAbsoluteY = function(curEl){
3704 return ASPx.GetAbsolutePositionY(curEl);
3705};
3706ASPx.SetAbsoluteX = function(element, x){
3707 element.style.left = ASPx.PrepareClientPosForElement(x, element, true) + "px";
3708};
3709ASPx.SetAbsoluteY = function(element, y){
3710 element.style.top = ASPx.PrepareClientPosForElement(y, element, false) + "px";
3711};
3712ASPx.GetAbsolutePositionX = function(element){
3713 if(Browser.Firefox && Browser.Version >= 3)
3714  return getAbsolutePositionX_FF3(element);
3715 else if(Browser.Opera)
3716  return getAbsolutePositionX_Opera(element);
3717 else if(Browser.NetscapeFamily && (!Browser.Firefox || Browser.Version < 3))
3718  return getAbsolutePositionX_NS(element);
3719 else if(Browser.WebKitFamily || Browser.Edge)
3720  return getAbsolutePositionX_FF3(element);
3721 else
3722  return getAbsolutePositionX_Other(element);
3723};
3724function getAbsolutePositionX_Opera(curEl){
3725 var isFirstCycle = true;
3726 var pos = getAbsoluteScrollOffset_OperaFF(curEl, true);
3727 while(curEl != null) {
3728  pos += curEl.offsetLeft;
3729  if(!isFirstCycle)
3730   pos -= curEl.scrollLeft;
3731  curEl = curEl.offsetParent;
3732  isFirstCycle = false;
3733 }
3734 pos += document.body.scrollLeft;
3735 return pos;
3736}
3737function getAbsolutePositionX_FF3(element){
3738 if(element == null) return 0;
3739 var x = element.getBoundingClientRect().left + ASPx.GetDocumentScrollLeft();
3740 return x;
3741}
3742function getAbsolutePositionX_NS(curEl){
3743 var pos = getAbsoluteScrollOffset_OperaFF(curEl, true);
3744 var isFirstCycle = true;
3745 while(curEl != null) {
3746  pos += curEl.offsetLeft;
3747  if(!isFirstCycle && curEl.offsetParent != null)
3748   pos -= curEl.scrollLeft;
3749  if(!isFirstCycle && Browser.Firefox){
3750   var style = ASPx.GetCurrentStyle(curEl);
3751   if(curEl.tagName == "DIV" && style.overflow != "visible")
3752    pos += ASPx.PxToInt(style.borderLeftWidth);
3753  }
3754  isFirstCycle = false;
3755  curEl = curEl.offsetParent;
3756 }
3757 return pos;
3758}
3759function getAbsolutePositionX_Other(curEl){
3760 var pos = 0;
3761 var isFirstCycle = true;
3762 while(curEl != null) {
3763  pos += curEl.offsetLeft;
3764  if(!isFirstCycle && curEl.offsetParent != null)
3765   pos -= curEl.scrollLeft;
3766  isFirstCycle = false;
3767  curEl = curEl.offsetParent;
3768 }
3769 return pos;
3770}
3771ASPx.GetAbsolutePositionY = function(element){
3772 if(Browser.Firefox && Browser.Version >= 3)
3773  return getAbsolutePositionY_FF3(element);
3774 else if(Browser.Opera)
3775  return getAbsolutePositionY_Opera(element);
3776 else if(Browser.NetscapeFamily && (!Browser.Firefox || Browser.Version < 3))
3777  return getAbsolutePositionY_NS(element);
3778 else if(Browser.WebKitFamily || Browser.Edge)
3779  return getAbsolutePositionY_FF3(element);
3780 else
3781  return getAbsolutePositionY_Other(element);
3782};
3783function getAbsolutePositionY_Opera(curEl){
3784 var isFirstCycle = true;
3785 if(curEl && curEl.tagName == "TR" && curEl.cells.length > 0)
3786  curEl = curEl.cells[0];
3787 var pos = getAbsoluteScrollOffset_OperaFF(curEl, false);
3788 while(curEl != null) {
3789  pos += curEl.offsetTop;
3790  if(!isFirstCycle)
3791   pos -= curEl.scrollTop;
3792  curEl = curEl.offsetParent;
3793  isFirstCycle = false;
3794 }
3795 pos += document.body.scrollTop;
3796 return pos;
3797}
3798function getAbsolutePositionY_FF3(element){
3799 if(element == null) return 0;
3800 var y = element.getBoundingClientRect().top + ASPx.GetDocumentScrollTop();
3801 return y;
3802}
3803function getAbsolutePositionY_NS(curEl){
3804 var pos = getAbsoluteScrollOffset_OperaFF(curEl, false);
3805 var isFirstCycle = true;
3806 while(curEl != null) {
3807  pos += curEl.offsetTop;
3808  if(!isFirstCycle && curEl.offsetParent != null)
3809   pos -= curEl.scrollTop;
3810  if(!isFirstCycle && Browser.Firefox){
3811   var style = ASPx.GetCurrentStyle(curEl);
3812   if(curEl.tagName == "DIV" && style.overflow != "visible")
3813    pos += ASPx.PxToInt(style.borderTopWidth);
3814  }
3815  isFirstCycle = false;
3816  curEl = curEl.offsetParent;
3817 }
3818 return pos;
3819}
3820function getAbsoluteScrollOffset_OperaFF(curEl, isX) {
3821 var pos = 0;   
3822 var isFirstCycle = true;
3823 while(curEl != null) {
3824  if(curEl.tagName == "BODY")
3825   break;
3826  var style = ASPx.GetCurrentStyle(curEl);
3827  if(style.position == "absolute")
3828   break;
3829  if(!isFirstCycle && curEl.tagName == "DIV" && (style.position == "" || style.position == "static"))
3830   pos -= isX ? curEl.scrollLeft : curEl.scrollTop;
3831  curEl = curEl.parentNode;
3832  isFirstCycle = false;
3833 }
3834 return pos; 
3835}
3836function getAbsolutePositionY_Other(curEl){
3837 var pos = 0;
3838 var isFirstCycle = true;
3839 while(curEl != null) {
3840  pos += curEl.offsetTop;
3841  if(!isFirstCycle && curEl.offsetParent != null)
3842   pos -= curEl.scrollTop;
3843  isFirstCycle = false;
3844  curEl = curEl.offsetParent;
3845 }
3846 return pos;
3847}
3848function createElementMock(element) {
3849 var div = document.createElement('DIV');
3850 div.style.top = "0px";
3851 div.style.left = "0px";
3852 div.visibility = "hidden";
3853 div.style.position = ASPx.GetCurrentStyle(element).position;
3854 return div;
3855}
3856ASPx.PrepareClientPosElementForOtherParent = function(pos, element, otherParent, isX) {
3857 if(element.parentNode == otherParent)
3858  return ASPx.PrepareClientPosForElement(pos, element, isX);
3859 var elementMock = createElementMock(element);
3860 otherParent.appendChild(elementMock); 
3861 var preparedPos = ASPx.PrepareClientPosForElement(pos, elementMock, isX);
3862 otherParent.removeChild(elementMock);
3863 return preparedPos;
3864};
3865ASPx.PrepareClientPosForElement = function(pos, element, isX) {
3866 pos -= ASPx.GetPositionElementOffset(element, isX);
3867 return pos;
3868};
3869function getExperimentalPositionOffset(element, isX) {
3870 var div = createElementMock(element);
3871 if(div.style.position == "static")
3872  div.style.position = "absolute";
3873 element.parentNode.appendChild(div); 
3874 var realPos = isX ? ASPx.GetAbsoluteX(div) : ASPx.GetAbsoluteY(div);
3875 element.parentNode.removeChild(div);
3876 return realPos;
3877}
3878ASPx.GetPositionElementOffset = function(element, isX) {
3879 return getExperimentalPositionOffset(element, isX);
3880};
3881ASPx.GetSizeOfText = function(text, textCss) {
3882 var testContainer = document.createElement("tester");
3883 var defaultLineHeight = ASPx.Browser.Firefox ? "1" : "";
3884 testContainer.style.fontSize = textCss.fontSize;
3885 testContainer.style.fontFamily = textCss.fontFamily;
3886 testContainer.style.fontWeight = textCss.fontWeight;
3887 testContainer.style.letterSpacing = textCss.letterSpacing;
3888 testContainer.style.lineHeight = textCss.lineHeight || defaultLineHeight;
3889 testContainer.style.position = "absolute";
3890 testContainer.style.top = ASPx.InvalidPosition + "px";
3891 testContainer.style.left = ASPx.InvalidPosition + "px";
3892 testContainer.style.width = "auto";
3893 testContainer.style.whiteSpace = "nowrap";
3894 testContainer.appendChild(document.createTextNode(text));
3895 var testElement = document.body.appendChild(testContainer);
3896 var size = {
3897  "width": testElement.offsetWidth,
3898  "height": testElement.offsetHeight
3899 };
3900 document.body.removeChild(testElement);
3901 return size;
3902};
3903ASPx.PointToPixel = function(points, addPx) {  
3904 var result = 0;
3905 try {
3906  var indexOfPt = points.toLowerCase().indexOf("pt");
3907  if(indexOfPt > -1)
3908   result = parseInt(points.substr(0, indexOfPt)) * 96 / 72;
3909  else
3910   result = parseInt(points) * 96 / 72;
3911  if(addPx)
3912   result = result + "px";
3913 } catch(e) {}
3914 return result;
3915};
3916ASPx.PixelToPoint = function(pixels, addPt) { 
3917 var result = 0;
3918 try {
3919  var indexOfPx = pixels.toLowerCase().indexOf("px");
3920  if(indexOfPx > -1)
3921   result = parseInt(pixels.substr(0, indexOfPx)) * 72 / 96;
3922  else
3923   result = parseInt(pixels) * 72 / 96;
3924  if(addPt)
3925   result = result + "pt";
3926 } catch(e) {}
3927 return result;         
3928};
3929ASPx.PxToInt = function(px) {
3930 return pxToNumber(px, parseInt);
3931};
3932ASPx.PxToFloat = function(px) {
3933 return pxToNumber(px, parseFloat);
3934};
3935function pxToNumber(px, parseFunction) {
3936 var result = 0;
3937 if(px != null && px != "") {
3938  try {
3939   var indexOfPx = px.indexOf("px");
3940   if(indexOfPx > -1)
3941    result = parseFunction(px.substr(0, indexOfPx));
3942  } catch(e) { }
3943 }
3944 return result;
3945}
3946ASPx.PercentageToFloat = function(perc) {
3947 var result = 0;
3948 if(perc != null && perc != "") {
3949  try {
3950   var indexOfPerc = perc.indexOf("%");
3951   if(indexOfPerc > -1)
3952    result = parseFloat(perc.substr(0, indexOfPerc)) / 100;
3953  } catch(e) { }
3954 }
3955 return result;
3956};
3957ASPx.CreateGuid = function() {
3958 return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { 
3959   var r = Math.random()*16|0,v=c=='x'?r:r&0x3|0x8;
3960  return v.toString(16);
3961 });
3962};
3963ASPx.GetLeftRightBordersAndPaddingsSummaryValue = function(element, currentStyle) {
3964 return ASPx.GetLeftRightPaddings(element, currentStyle) + ASPx.GetHorizontalBordersWidth(element, currentStyle);
3965};
3966ASPx.GetTopBottomBordersAndPaddingsSummaryValue = function(element, currentStyle) {
3967 return ASPx.GetTopBottomPaddings(element, currentStyle) + ASPx.GetVerticalBordersWidth(element, currentStyle);
3968};
3969ASPx.GetVerticalBordersWidth = function(element, style) {
3970 if(!ASPx.IsExists(style))
3971  style = ASPx.GetCurrentStyle(element);
3972 var res = 0;
3973 if(style.borderTopStyle != "none")
3974  res += ASPx.PxToFloat(style.borderTopWidth);
3975 if(style.borderBottomStyle != "none")
3976  res += ASPx.PxToFloat(style.borderBottomWidth);
3977 return res;
3978};
3979ASPx.GetHorizontalBordersWidth = function(element, style) {
3980 if(!ASPx.IsExists(style))
3981  style = ASPx.GetCurrentStyle(element);
3982 var res = 0;
3983 if(style.borderLeftStyle != "none")
3984  res += ASPx.PxToFloat(style.borderLeftWidth);
3985 if(style.borderRightStyle != "none")
3986  res += ASPx.PxToFloat(style.borderRightWidth);
3987 return res;
3988};
3989ASPx.GetTopBottomPaddings = function(element, style) {
3990 var currentStyle = style ? style : ASPx.GetCurrentStyle(element);
3991 return ASPx.PxToInt(currentStyle.paddingTop) + ASPx.PxToInt(currentStyle.paddingBottom);
3992};
3993ASPx.GetTopPaddings = function(element, style) {
3994 var currentStyle = style ? style : ASPx.GetCurrentStyle(element);
3995 return ASPx.PxToInt(currentStyle.paddingTop);
3996};
3997ASPx.GetBottomPaddings = function(element, style) {
3998 var currentStyle = style ? style : ASPx.GetCurrentStyle(element);
3999 return ASPx.PxToInt(currentStyle.paddingBottom);
4000};
4001ASPx.GetLeftRightPaddings = function(element, style) {
4002 var currentStyle = style ? style : ASPx.GetCurrentStyle(element);
4003 return ASPx.PxToInt(currentStyle.paddingLeft) + ASPx.PxToInt(currentStyle.paddingRight);
4004};
4005ASPx.GetTopBottomMargins = function(element, style) {
4006 var currentStyle = style ? style : ASPx.GetCurrentStyle(element);
4007 return ASPx.PxToInt(currentStyle.marginTop) + ASPx.PxToInt(currentStyle.marginBottom);
4008};
4009ASPx.GetLeftRightMargins = function(element, style) {
4010 var currentStyle = style ? style : ASPx.GetCurrentStyle(element);
4011 return ASPx.PxToInt(currentStyle.marginLeft) + ASPx.PxToInt(currentStyle.marginRight);
4012};
4013ASPx.GetClearClientWidth = function(element) {
4014 return ASPx.GetElementOffsetWidth(element)- ASPx.GetLeftRightBordersAndPaddingsSummaryValue(element);
4015};
4016ASPx.GetClearClientHeight = function(element) {
4017 return ASPx.GetElementOffsetHeight(element) - ASPx.GetTopBottomBordersAndPaddingsSummaryValue(element);
4018};
4019ASPx.SetOffsetWidth = function(element, widthValue, currentStyle) {
4020 if(!ASPx.IsExists(currentStyle))
4021  currentStyle = ASPx.GetCurrentStyle(element);
4022 var value = widthValue - ASPx.PxToInt(currentStyle.marginLeft) - ASPx.PxToInt(currentStyle.marginRight);
4023  value -= ASPx.GetLeftRightBordersAndPaddingsSummaryValue(element, currentStyle);
4024 if(value > -1)
4025  element.style.width = value + "px";
4026};
4027ASPx.SetOffsetHeight = function(element, heightValue, currentStyle) {
4028 if(!ASPx.IsExists(currentStyle))
4029  currentStyle = ASPx.GetCurrentStyle(element);
4030 var value = heightValue - ASPx.PxToInt(currentStyle.marginTop) - ASPx.PxToInt(currentStyle.marginBottom);
4031  value -= ASPx.GetTopBottomBordersAndPaddingsSummaryValue(element, currentStyle);
4032 if(value > -1)
4033  element.style.height = value + "px";
4034};
4035ASPx.FindOffsetParent = function(element) {
4036 var currentElement = element.parentNode;
4037 while(ASPx.IsExistsElement(currentElement) && currentElement.tagName != "BODY") {
4038  if(ASPx.GetElementOffsetWidth(currentElement) > 0 && ASPx.GetElementOffsetHeight(currentElement) > 0)
4039   return currentElement;
4040  currentElement = currentElement.parentNode;
4041 }
4042 return document.body;
4043};
4044ASPx.GetDocumentScrollTop = function(){
4045 if(Browser.WebKitFamily || Browser.Edge) {
4046  if(Browser.MacOSMobilePlatform) 
4047   return window.pageYOffset;
4048  if(Browser.WebKitFamily)
4049   return document.documentElement.scrollTop || document.body.scrollTop;
4050  return document.body.scrollTop;
4051 }
4052 else
4053  return document.documentElement.scrollTop;
4054};
4055ASPx.SetDocumentScrollTop = function(scrollTop) {
4056 if(!Browser.MacOSMobilePlatform && (Browser.Safari || (Browser.Chrome && Browser.Version < 60) || (Browser.Opera && Browser.MajorVersion >= 15) || Browser.Edge))  
4057  document.body.scrollTop = scrollTop;
4058 else
4059  document.documentElement.scrollTop = scrollTop;
4060};
4061ASPx.GetDocumentScrollLeft = function(){
4062 if(Browser.Edge)
4063  return document.body ? document.body.scrollLeft : document.documentElement.scrollLeft;
4064 if(Browser.WebKitFamily)
4065  return document.documentElement.scrollLeft || document.body.scrollLeft;
4066 return document.documentElement.scrollLeft;
4067};
4068ASPx.SetDocumentScrollLeft = function (scrollLeft) {
4069 if(!Browser.MacOSMobilePlatform && (Browser.Safari || (Browser.Chrome && Browser.Version < 60) || (Browser.Opera && Browser.MajorVersion >= 15) || Browser.Edge))  
4070  document.body.scrollLeft = scrollLeft;
4071 else
4072  document.documentElement.scrollLeft = scrollLeft;
4073};
4074ASPx.GetDocumentClientWidth = function(){
4075 if(document.documentElement.clientWidth == 0)
4076  return document.body.clientWidth;
4077 else
4078  return document.documentElement.clientWidth;
4079};
4080ASPx.GetDocumentClientHeight = function() {
4081 if(Browser.Firefox && window.innerHeight - document.documentElement.clientHeight > ASPx.GetVerticalScrollBarWidth()) {
4082  return window.innerHeight;
4083 } else if(Browser.Opera && Browser.Version < 9.6 || document.documentElement.clientHeight == 0) {
4084   return document.body.clientHeight;
4085 }
4086 return document.documentElement.clientHeight;
4087};
4088ASPx.GetDocumentWidth = function(){
4089 var bodyWidth = document.body.offsetWidth;
4090 var docWidth = document.documentElement.offsetWidth;
4091 var bodyScrollWidth = document.body.scrollWidth;
4092 var docScrollWidth = document.documentElement.scrollWidth;
4093 return getMaxDimensionOf(bodyWidth, docWidth, bodyScrollWidth, docScrollWidth);
4094};
4095ASPx.GetDocumentHeight = function(){
4096 var bodyHeight = document.body.offsetHeight;
4097 var docHeight = document.documentElement.offsetHeight;
4098 var bodyScrollHeight = document.body.scrollHeight;
4099 var docScrollHeight = document.documentElement.scrollHeight;
4100 var maxHeight = getMaxDimensionOf(bodyHeight, docHeight, bodyScrollHeight, docScrollHeight);
4101 if(Browser.Opera && Browser.Version >= 9.6){
4102  if(Browser.Version < 10)
4103   maxHeight = getMaxDimensionOf(bodyHeight, docHeight, bodyScrollHeight);
4104  var visibleHeightOfDocument = document.documentElement.clientHeight;
4105  if(maxHeight > visibleHeightOfDocument)
4106   maxHeight = getMaxDimensionOf(window.outerHeight, maxHeight);
4107  else
4108   maxHeight = document.documentElement.clientHeight;
4109  return maxHeight;
4110 }
4111 return maxHeight;
4112};
4113ASPx.GetDocumentMaxClientWidth = function(){
4114 var bodyWidth = document.body.offsetWidth;
4115 var docWidth = document.documentElement.offsetWidth;
4116 var docClientWidth = document.documentElement.clientWidth;
4117 return getMaxDimensionOf(bodyWidth, docWidth, docClientWidth);
4118};
4119ASPx.GetDocumentMaxClientHeight = function(){
4120 var bodyHeight = document.body.offsetHeight;
4121 var docHeight = document.documentElement.offsetHeight;
4122 var docClientHeight = document.documentElement.clientHeight;
4123 return getMaxDimensionOf(bodyHeight, docHeight, docClientHeight);
4124};
4125ASPx.verticalScrollIsNotHidden = null;
4126ASPx.horizontalScrollIsNotHidden = null;
4127ASPx.GetVerticalScrollIsNotHidden = function() {
4128 if(!ASPx.IsExists(ASPx.verticalScrollIsNotHidden))
4129  ASPx.verticalScrollIsNotHidden = ASPx.GetCurrentStyle(document.body).overflowY !== "hidden"
4130   && ASPx.GetCurrentStyle(document.documentElement).overflowY !== "hidden";
4131 return ASPx.verticalScrollIsNotHidden;
4132};
4133ASPx.GetHorizontalScrollIsNotHidden = function() {
4134 if(!ASPx.IsExists(ASPx.horizontalScrollIsNotHidden))
4135  ASPx.horizontalScrollIsNotHidden = ASPx.GetCurrentStyle(document.body).overflowX !== "hidden"
4136   && ASPx.GetCurrentStyle(document.documentElement).overflowX !== "hidden";
4137 return ASPx.horizontalScrollIsNotHidden;
4138};
4139ASPx.GetCurrentDocumentWidth = function() {
4140 var result = ASPx.GetDocumentClientWidth();
4141 if(!ASPx.Browser.Safari && ASPx.GetVerticalScrollIsNotHidden() && ASPx.GetDocumentHeight() > ASPx.GetDocumentClientHeight())
4142  result += ASPx.GetVerticalScrollBarWidth();
4143 return result;
4144};
4145ASPx.GetCurrentDocumentHeight = function() {
4146 var result = ASPx.GetDocumentClientHeight();
4147 if(!ASPx.Browser.Safari && ASPx.GetHorizontalScrollIsNotHidden() && ASPx.GetDocumentWidth() > ASPx.GetDocumentClientWidth())
4148  result += ASPx.GetVerticalScrollBarWidth();
4149 return result;
4150};
4151function getMaxDimensionOf(){
4152 var max = ASPx.InvalidDimension;
4153 for(var i = 0; i < arguments.length; i++){
4154  if(max < arguments[i])
4155   max = arguments[i];
4156 }
4157 return max;
4158}
4159ASPx.GetClientLeft = function(element) {
4160 return ASPx.IsExists(element.clientLeft) ? element.clientLeft : (ASPx.GetElementOffsetWidth(element)- element.clientWidth) / 2;
4161};
4162ASPx.GetClientTop = function(element) {
4163 return ASPx.IsExists(element.clientTop) ? element.clientTop : (ASPx.GetElementOffsetHeight(element) - element.clientHeight) / 2;
4164};
4165var requestAnimationFrameFunc = window.requestAnimationFrame || function(callback) { callback(); };
4166var cancelAnimationFrameFunc = window.cancelAnimationFrame || function(id) { };
4167ASPx.CancelAnimationFrame = function(id) { cancelAnimationFrameFunc(id); };
4168ASPx.RequestAnimationFrame = function (callback) { return requestAnimationFrameFunc(callback); };
4169ASPx.SetStyles = function(element, styles, makeImportant) {
4170 if(ASPx.IsExists(styles.cssText))
4171  element.style.cssText = styles.cssText;
4172 if(ASPx.IsExists(styles.className)) {
4173  ASPx.SetClassName(element, styles.className);
4174 }
4175 for(var property in styles) {
4176  if(!styles.hasOwnProperty(property))
4177   continue;
4178  var value = styles[property];
4179  switch (property) {
4180   case "cssText":
4181   case "className":
4182    break;
4183   case "float":
4184    ASPx.SetElementFloat(element, value);
4185    break;
4186   case "opacity":
4187    ASPx.SetElementOpacity(element, value);
4188    break;
4189   case "zIndex":
4190    ASPx.SetStylesCore(element, property, value, makeImportant);
4191    break;
4192   default:
4193    ASPx.SetStylesCore(element, property, value + (typeof (value) == "number" ? "px" : ""), makeImportant);
4194  }
4195 }
4196};
4197ASPx.SetStylesCore = function(element, property, value, makeImportant) {
4198 if(makeImportant) {
4199  var index = property.search("[A-Z]");
4200  if(index != -1)
4201   property = property.replace(property.charAt(index), "-" + property.charAt(index).toLowerCase());
4202  if(element.style.setProperty)
4203   element.style.setProperty(property, value, "important");
4204  else 
4205   element.style.cssText += ";" + property + ":" + value + "!important";
4206 }
4207 else
4208  element.style[property] = value;
4209};
4210ASPx.RemoveBordersAndShadows = function(el) {
4211 if(!el || !el.style)
4212  return;
4213 el.style.borderWidth = 0;
4214 if(ASPx.IsExists(el.style.boxShadow))
4215  el.style.boxShadow = "none";
4216 else if(ASPx.IsExists(el.style.MozBoxShadow))
4217  el.style.MozBoxShadow = "none";
4218 else if(ASPx.IsExists(el.style.webkitBoxShadow))
4219  el.style.webkitBoxShadow = "none";
4220};
4221ASPx.GetCellSpacing = function(element) {
4222 var val = parseInt(element.cellSpacing);
4223 if(!isNaN(val)) return val;
4224 val = parseInt(ASPx.GetCurrentStyle(element).borderSpacing);
4225 if(!isNaN(val)) return val;
4226 return 0;
4227};
4228ASPx.GetInnerScrollPositions = function(element) {
4229 var scrolls = [];
4230 getInnerScrollPositionsCore(element, scrolls);
4231 return scrolls;
4232};
4233function getInnerScrollPositionsCore(element, scrolls) {
4234 for(var child = element.firstChild; child; child = child.nextSibling) {
4235  var scrollTop = child.scrollTop,
4236   scrollLeft = child.scrollLeft;
4237  if(scrollTop > 0 || scrollLeft > 0)
4238   scrolls.push([child, scrollTop, scrollLeft]);
4239  getInnerScrollPositionsCore(child, scrolls);
4240 }
4241}
4242ASPx.RestoreInnerScrollPositions = function(scrolls) {
4243 for(var i = 0, scrollArr; scrollArr = scrolls[i]; i++) {
4244  if(scrollArr[1] > 0)
4245   scrollArr[0].scrollTop = scrollArr[1];
4246  if(scrollArr[2] > 0)
4247   scrollArr[0].scrollLeft = scrollArr[2];
4248 }
4249};
4250ASPx.GetOuterScrollPosition = function(element) {
4251 while(element && element.tagName !== "BODY") {
4252  var scrollTop = element.scrollTop,
4253   scrollLeft = element.scrollLeft;
4254  if(scrollTop > 0 || scrollLeft > 0) {
4255   return {
4256    scrollTop: scrollTop,
4257    scrollLeft: scrollLeft,
4258    element: element
4259   };
4260  }
4261  element = element.parentNode;
4262 }
4263 return {
4264  scrollTop: ASPx.GetDocumentScrollTop(),
4265  scrollLeft: ASPx.GetDocumentScrollLeft()
4266 };
4267};
4268ASPx.RestoreOuterScrollPosition = function(scrollInfo) {
4269 if(scrollInfo.element) {
4270  if(scrollInfo.scrollTop > 0)
4271   scrollInfo.element.scrollTop = scrollInfo.scrollTop;
4272  if(scrollInfo.scrollLeft > 0)
4273   scrollInfo.element.scrollLeft = scrollInfo.scrollLeft;
4274 }
4275 else {
4276  if(scrollInfo.scrollTop > 0)
4277   ASPx.SetDocumentScrollTop(scrollInfo.scrollTop);
4278  if(scrollInfo.scrollLeft > 0)
4279   ASPx.SetDocumentScrollLeft(scrollInfo.scrollLeft);
4280 }
4281};
4282ASPx.ChangeElementContainer = function(element, container, savePreviousContainer) {
4283 if(element.parentNode != container) {
4284  var parentNode = element.parentNode;
4285  parentNode.removeChild(element);
4286  container.appendChild(element);
4287  if(savePreviousContainer)
4288   element.previousContainer = parentNode;
4289 }
4290};
4291ASPx.RestoreElementContainer = function(element) {
4292 if(element.previousContainer) {
4293  ASPx.ChangeElementContainer(element, element.previousContainer, false);
4294  element.previousContainer = null;
4295 }
4296};
4297ASPx.MoveChildrenToElement = function(sourceElement, destinationElement){
4298 while(sourceElement.childNodes.length > 0)
4299  destinationElement.appendChild(sourceElement.childNodes[0]);
4300};
4301ASPx.GetScriptCode = function(script) {
4302 var useFirstChildElement = Browser.Chrome && Browser.Version < 11 || Browser.Safari && Browser.Version < 5; 
4303 var text = useFirstChildElement ? script.firstChild.data : script.text;
4304 var comment = "<!--";
4305 var pos = text.indexOf(comment);
4306 if(pos > -1)
4307  text = text.substr(pos + comment.length);
4308 return text;
4309};
4310ASPx.AppendScript = function(script) {
4311 var parent = document.getElementsByTagName("head")[0];
4312 if(!parent)
4313  parent = document.body;
4314 if(parent)
4315  parent.appendChild(script);
4316};
4317function getFrame(frames, name) {
4318 if(frames[name])
4319  return frames[name];
4320 for(var i = 0; i < frames.length; i++) {
4321  try {
4322   var frame = frames[i];
4323   if(frame.name == name) 
4324    return frame; 
4325   frame = getFrame(frame.frames, name);
4326   if(frame != null)   
4327    return frame; 
4328  } catch(e) {
4329  } 
4330 }
4331 return null;
4332}
4333ASPx.IsValidElement = function(element) {
4334 if(!element) 
4335  return false;
4336 if(!(Browser.Firefox && Browser.Version < 4)) {
4337  if(element.ownerDocument && element.ownerDocument.body && element.ownerDocument.body.compareDocumentPosition)
4338   return element.ownerDocument.body.compareDocumentPosition(element) % 2 === 0;
4339 }
4340 if(!Browser.Opera && element.offsetParent && element.parentNode.tagName)
4341  return true;
4342 while(element != null){
4343  if(element.tagName == "BODY")
4344   return true;
4345  element = element.parentNode;
4346 }
4347 return false;
4348};
4349ASPx.IsValidElements = function(elements) {
4350 if(!elements)
4351  return false; 
4352 for(var i = 0; i < elements.length; i++) {
4353  if(elements[i] && !ASPx.IsValidElement(elements[i]))
4354   return false;
4355 }
4356 return true;
4357};
4358ASPx.IsExistsElement = function(element) {
4359 return element && ASPx.IsValidElement(element);
4360};
4361ASPx.CreateHtmlElementFromString = function(str) {
4362 var dummy = ASPx.CreateHtmlElement();
4363 setInnerHtmlInternal(dummy, str);
4364 return dummy.firstChild;
4365};
4366ASPx.CreateHtmlElement = function(tagName, styles) {
4367 var element = document.createElement(tagName || "DIV");
4368 if(styles)
4369  ASPx.SetStyles(element, styles);
4370 return element;
4371};
4372ASPx.RestoreElementOriginalWidth = function(element) {
4373 if(!ASPx.IsExistsElement(element)) 
4374  return;
4375 element.style.width = element.dxOrigWidth = ASPx.GetElementOriginalWidth(element);
4376};
4377ASPx.GetElementOriginalWidth = function(element) {
4378 if(!ASPx.IsExistsElement(element)) 
4379  return null;
4380 var width;
4381 if(!ASPx.IsExists(element.dxOrigWidth)) {
4382  width = String(element.style.width).length > 0
4383   ? element.style.width
4384   : ASPx.GetElementOffsetWidth(element) + "px";
4385 } else {
4386  width = element.dxOrigWidth;
4387 }
4388 return width;
4389};
4390ASPx.DropElementOriginalWidth = function(element) {
4391 if(ASPx.IsExists(element.dxOrigWidth))
4392  element.dxOrigWidth = null;
4393};
4394ASPx.GetObjectKeys = function(obj) {
4395 if(!obj) return [ ];
4396 if(Object.keys)
4397  return Object.keys(obj);
4398 var keys = [ ];
4399 for(var key in obj) {
4400  if(obj.hasOwnProperty(key))
4401   keys.push(key);
4402 }
4403 return keys;
4404};
4405ASPx.ShowErrorAlert = function(message) {
4406 message = ASPx.Str.DecodeHtmlViaTextArea(message);
4407 if(ASPx.IsExists(message) && message !== "")
4408  alert(message);
4409};
4410ASPx.ShowKBErrorMessage = function(text, kbid) {
4411 ASPx.ShowErrorMessage(text + "https://www.devexpress.com/kbid=" + kbid + ".");
4412};
4413ASPx.ShowErrorMessage = function(errorMessage) {
4414 var console = window.console;
4415 if(!console || !ASPx.IsFunction(console.error))
4416  return;
4417 console.error(errorMessage);
4418};
4419ASPx.IsInteractiveControl = function(element, extremeParent) { 
4420 return Data.ArrayIndexOf(["A", "INPUT", "SELECT", "OPTION", "TEXTAREA", "BUTTON", "IFRAME"], element.tagName) > -1;
4421};
4422ASPx.IsUrlContainsClientScript = function(url) {
4423 return url.toLowerCase().indexOf("javascript:") !== -1;
4424};
4425ASPx.GetMSAjaxRequestManager = function() {
4426 if(window.Sys && Sys.WebForms && Sys.WebForms.PageRequestManager && Sys.WebForms.PageRequestManager.getInstance)
4427  return Sys.WebForms.PageRequestManager.getInstance();
4428 return null;
4429};
4430Function.prototype.aspxBind = function(scope) {
4431 var func = this;
4432 return function() {
4433  return func.apply(scope, arguments);
4434 };
4435};
4436var FilteringUtils = { };
4437FilteringUtils.EventKeyCodeChangesTheInput = function(evt) {
4438 if(ASPx.IsPasteShortcut(evt))
4439  return true;
4440 else if(evt.ctrlKey && !evt.altKey)
4441  return false;
4442 if(ASPx.Browser.AndroidMobilePlatform || ASPx.Browser.MacOSMobilePlatform) return true; 
4443 var keyCode = ASPx.Evt.GetKeyCode(evt);
4444 var isSystemKey = ASPx.Key.Windows <= keyCode && keyCode <= ASPx.Key.ContextMenu;
4445 var isFKey = ASPx.Key.F1 <= keyCode && keyCode <= 127; 
4446 return ASPx.Key.Delete <= keyCode && !isSystemKey && !isFKey || keyCode == ASPx.Key.Backspace || keyCode == ASPx.Key.Space;
4447};
4448FilteringUtils.FormatCallbackArg = function(prefix, arg) {
4449 return (ASPx.IsExists(arg) ? prefix + "|" + arg.length + ';' + arg + ';' : "");
4450};
4451ASPx.FilteringUtils = FilteringUtils;
4452var FormatStringHelper = { };
4453FormatStringHelper.PlaceHolderTemplateStruct = function(startIndex, length, index, placeHolderString){
4454 this.startIndex = startIndex;
4455 this.realStartIndex = 0;
4456 this.length = length;
4457 this.realLength = 0;
4458 this.index = index;
4459 this.placeHolderString = placeHolderString;
4460};
4461FormatStringHelper.GetPlaceHolderTemplates = function(formatString){
4462 formatString = this.CollapseDoubleBrackets(formatString);
4463 var templates = this.CreatePlaceHolderTemplates(formatString);
4464 return templates;
4465};
4466FormatStringHelper.CreatePlaceHolderTemplates = function(formatString){
4467 var templates = [];
4468 var templateStrings = formatString.match(/{[^}]+}/g);
4469 if(templateStrings != null){
4470  var pos = 0;
4471  for(var i = 0; i < templateStrings.length; i++){
4472   var tempString = templateStrings[i];
4473   var startIndex = formatString.indexOf(tempString, pos);
4474   var length = tempString.length;
4475   var indexString = tempString.slice(1).match(/^[0-9]+/);
4476   var index = parseInt(indexString);
4477   templates.push(new this.PlaceHolderTemplateStruct(startIndex, length, index, tempString));
4478   pos = startIndex + length;
4479  }
4480 }
4481 return templates;
4482};
4483FormatStringHelper.CollapseDoubleBrackets = function(formatString){
4484 formatString = this.CollapseOpenDoubleBrackets(formatString);
4485 formatString = this.CollapseCloseDoubleBrackets(formatString);
4486 return formatString;
4487};
4488FormatStringHelper.CollapseOpenDoubleBrackets = function(formatString){
4489 return formatString.replace(/{{/g, "_");
4490};
4491FormatStringHelper.CollapseCloseDoubleBrackets = function(formatString){
4492 while(true){
4493  var index = formatString.lastIndexOf("}}");
4494  if(index == -1) 
4495   break;
4496  else
4497   formatString = formatString.substr(0, index) + "_" + formatString.substr(index + 2);
4498 }
4499 return formatString;
4500};
4501ASPx.FormatStringHelper = FormatStringHelper;
4502var StartWithFilteringUtils = { };
4503StartWithFilteringUtils.HighlightSuggestedText = function(input, suggestedText, control, onChangeInput){
4504 if(this.NeedToLockAndoidKeyEvents(control))
4505  control.LockAndroidKeyEvents();
4506 var selInfo = ASPx.Selection.GetInfo(input);
4507 var currentTextLenght = ASPx.Str.GetCoincideCharCount(suggestedText, input.value, 
4508  function(text, filter) { 
4509   return text.indexOf(filter) == 0;
4510  });
4511 var suggestedTextLenght = suggestedText.length;
4512 var isSelected = selInfo.startPos == 0 && selInfo.endPos == currentTextLenght && 
4513  selInfo.endPos == suggestedTextLenght && input.value == suggestedText;
4514 if(!isSelected) { 
4515  input.value = suggestedText;
4516  if(onChangeInput)
4517   onChangeInput();
4518  if(this.NeedToLockAndoidKeyEvents(control)) {
4519   window.setTimeout(function() {
4520    this.SelectText(input, currentTextLenght, suggestedTextLenght);
4521    control.UnlockAndroidKeyEvents();
4522   }.aspxBind(this), control.adroidSamsungBugTimeout);
4523  } else
4524   this.SelectText(input, currentTextLenght, suggestedTextLenght);
4525 }
4526};
4527StartWithFilteringUtils.SelectText = function(input, startPos, stopPos) {
4528 if(startPos < stopPos)
4529  ASPx.Selection.Set(input, startPos, stopPos);
4530};
4531StartWithFilteringUtils.RollbackOneSuggestedChar = function(input){
4532 var currentText = input.value;
4533 var cutText = currentText.slice(0, -1);
4534 if(cutText != currentText)
4535  input.value = cutText;
4536};
4537StartWithFilteringUtils.NeedToLockAndoidKeyEvents = function(control) {
4538 return ASPx.Browser.AndroidMobilePlatform && control && control.LockAndroidKeyEvents;
4539};
4540ASPx.StartWithFilteringUtils = StartWithFilteringUtils;
4541var ContainsFilteringUtils = { };
4542ContainsFilteringUtils.ColumnSelectionStruct = function(index, startIndex, length){
4543 this.index = index;
4544 this.length = length;
4545 this.startIndex = startIndex;
4546};
4547ContainsFilteringUtils.IsFilterCrossPlaseHolder = function(filterStartIndex, filterEndIndex, template) {
4548 var left = Math.max(filterStartIndex, template.realStartIndex);
4549 var right = Math.min(filterEndIndex,  template.realStartIndex + template.realLength);
4550 return left < right;
4551};
4552ContainsFilteringUtils.GetColumnSelectionsForItem = function(itemValues, formatString, filterString) {
4553 if(formatString == "") 
4554  return this.GetSelectionForSingleColumnItem(itemValues, filterString); 
4555 var result = [];
4556 var formatedString = ASPx.Formatter.Format(formatString, itemValues);
4557 var filterStartIndex = ASPx.Str.PrepareStringForFilter(formatedString).indexOf(ASPx.Str.PrepareStringForFilter(filterString));
4558 if(filterStartIndex == -1) return result;
4559 var filterEndIndex = filterStartIndex + filterString.length;
4560 var templates = FormatStringHelper.GetPlaceHolderTemplates(formatString);
4561 this.SupplyTemplatesWithRealValues(itemValues, templates);
4562 for(var i = 0; i < templates.length ; i++) {
4563  if(this.IsFilterCrossPlaseHolder(filterStartIndex, filterEndIndex, templates[i])) 
4564   result.push(this.GetColumnSelectionsForItemValue(templates[i], filterStartIndex, filterEndIndex));
4565 }
4566 return result;
4567};
4568ContainsFilteringUtils.GetColumnSelectionsForItemValue = function(template, filterStartIndex, filterEndIndex) {
4569 var selectedTextStartIndex = filterStartIndex < template.realStartIndex ? 0 :
4570  filterStartIndex - template.realStartIndex;
4571 var selectedTextEndIndex = filterEndIndex >  template.realStartIndex + template.realLength ? template.realLength :
4572  filterEndIndex - template.realStartIndex;
4573 var selectedTextLength = selectedTextEndIndex - selectedTextStartIndex;
4574 return new this.ColumnSelectionStruct(template.index, selectedTextStartIndex, selectedTextLength);
4575};
4576ContainsFilteringUtils.GetSelectionForSingleColumnItem = function(itemValues, filterString) {
4577 var selectedTextStartIndex = ASPx.Str.PrepareStringForFilter(itemValues[0]).indexOf(ASPx.Str.PrepareStringForFilter(filterString));
4578 var selectedTextLength = filterString.length;
4579 return [new this.ColumnSelectionStruct(0, selectedTextStartIndex, selectedTextLength)];
4580};
4581ContainsFilteringUtils.ResetFormatStringIndex = function(formatString, index) {
4582 if(index != 0)
4583  return formatString.replace(index.toString(), "0");
4584 return formatString;
4585};
4586ContainsFilteringUtils.SupplyTemplatesWithRealValues = function(itemValues, templates) {
4587 var shift = 0;
4588 for(var i = 0; i < templates.length; i++) {
4589  var formatString = this.ResetFormatStringIndex(templates[i].placeHolderString, templates[i].index);
4590  var currentItemValue = itemValues[templates[i].index];
4591  templates[i].realLength = ASPx.Formatter.Format(formatString, currentItemValue).length;
4592  templates[i].realStartIndex  += templates[i].startIndex + shift; 
4593  shift += templates[i].realLength - templates[i].placeHolderString.length; 
4594 }
4595};
4596ContainsFilteringUtils.PrepareElementText = function(itemText) {
4597 return itemText ? itemText.replace(/\&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;") : '';
4598};
4599ContainsFilteringUtils.UnselectContainsTextInElement = function(element, selection, highlightTagName) {
4600 var currentText =  ASPx.Attr.GetAttribute (element, "DXText");
4601 if(ASPx.IsExists(currentText)) {
4602  currentText = ContainsFilteringUtils.PrepareElementText(currentText);
4603  ASPx.Security.setInnerHtml(element, currentText === "" ? "&nbsp;" : currentText, ASPx.Security.DataType.Trusted);
4604 }
4605};
4606ContainsFilteringUtils.ReselectContainsTextInElement = function(element, selection, highlightTagName) {
4607 var currentText = ASPx.GetInnerText(element);
4608 if(!highlightTagName)
4609  highlightTagName = "em";
4610 highlightTagName = highlightTagName.toLowerCase();
4611 if(currentText.indexOf("</" + highlightTagName + ">") != -1)
4612  ContainsFilteringUtils.UnselectContainsTextInElement(element, selection, highlightTagName);
4613 return ContainsFilteringUtils.SelectContainsTextInElement(element, selection, highlightTagName);
4614};
4615ContainsFilteringUtils.SelectContainsTextInElement = function(element, selection, highlightTagName) {
4616 if(selection.startIndex == -1)
4617  return;
4618 var currentText =  ASPx.Attr.GetAttribute (element, "DXText");
4619 if(!ASPx.IsExists(currentText)) ASPx.Attr.SetAttribute (element, "DXText", ASPx.GetInnerText(element));
4620 if(!highlightTagName)
4621  highlightTagName = "em";
4622 highlightTagName = highlightTagName.toLowerCase();
4623 var oldInnerText = ASPx.GetInnerText(element);
4624 var newInnerText = ContainsFilteringUtils.PrepareElementText(oldInnerText.substr(0, selection.startIndex)) + "<" + highlightTagName + ">" +
4625      ContainsFilteringUtils.PrepareElementText(oldInnerText.substr(selection.startIndex, selection.length)) + "</" + highlightTagName + ">" +
4626      ContainsFilteringUtils.PrepareElementText(oldInnerText.substr(selection.startIndex + selection.length));
4627 ASPx.Security.setInnerHtml(element, newInnerText, ASPx.Security.DataType.Trusted);
4628};
4629ASPx.ContainsFilteringUtils = ContainsFilteringUtils;
4630ASPx.MakeEqualControlsWidth = function(name1, name2){
4631 var control1 = ASPx.GetControlCollection().Get(name1);
4632 var control2 = ASPx.GetControlCollection().Get(name2);
4633 if(control1 && control2){
4634  var width = Math.max(control1.GetWidth(), control2.GetWidth());
4635  control1.SetWidth(width);
4636  control2.SetWidth(width);
4637 }
4638};
4639ASPx.HighContrastForeColorHighlightColorMap = {
4640 "#ffff00" : "#008000",
4641 "#00ff00" : "#0000ff",
4642 "#ffffff" : "#00838f",
4643 "#000000" : "#a347ff"
4644};
4645var BadgeManagerBase = ASPx.CreateClass(null, {
4646 createBadge: function(text, iconCssClass) {
4647  var badge = document.createElement("SPAN");
4648  ASPx.SetClassName(badge, this.getBadgeClassName());
4649  if(iconCssClass && iconCssClass.length)
4650   this.setBadgeIconCssClass(badge, iconCssClass);
4651  if(text && text.length)
4652   this.setBadgeText(badge, text);
4653  return badge;
4654 },
4655 findBadge: function(element) {
4656  if(!element)
4657   return null;
4658  return element.querySelector("." + this.getBadgeClassName());
4659 },
4660 setBadgeIconCssClass: function(badge, iconCssClass) {
4661  if(!badge || iconCssClass === undefined)
4662   return;
4663  var iconElement = this.getBadgeIconElement(badge);
4664  if(!iconCssClass) {
4665   if(iconElement)
4666    badge.removeChild(iconElement);
4667  }
4668  else {
4669   if(!iconElement) {
4670    iconElement = document.createElement("SPAN");
4671    badge.insertBefore(iconElement, badge.childNodes[0]);
4672   }
4673   ASPx.SetClassName(iconElement, iconCssClass + " " + this.getBadgeIconDefaultClassName());
4674  }
4675 },
4676 getBadgeIconCssClass: function(element) {
4677  var badge = this.findBadge(element);
4678  if(badge) {
4679   var iconElement = this.getBadgeIconElement(badge);
4680   var regEx = new RegExp("(?:^|\\s)" + this.getBadgeIconDefaultClassName() + "(?!\\S)");
4681   return iconElement ? ASPx.Str.Trim(ASPx.GetClassName(iconElement).replace(regEx, "")) : "";
4682  }
4683  return "";
4684 },
4685 setBadgeText: function(badge, text) {
4686  if(!badge || text === undefined)
4687   return;
4688  var textElement = this.getBadgeTextElement(badge);
4689  if(!text) {
4690   if(textElement)
4691    badge.removeChild(textElement);
4692  }
4693  else {
4694   if(!textElement) {
4695    textElement = document.createElement("SPAN");
4696    badge.appendChild(textElement);
4697   }
4698   ASPx.Security.setInnerHtml(textElement, text, ASPx.Security.DataType.Trusted);
4699  }
4700 },
4701 getBadgeText: function(element) {
4702  var badge = this.findBadge(element);
4703  if(badge) {
4704   var textElement = this.getBadgeTextElement(badge);
4705   return textElement ? ASPx.GetInnerText(textElement) : "";
4706  }
4707  return "";
4708 },
4709 getBadgeClassName: function() {
4710  return "";
4711 },
4712 getBadgeIconDefaultClassName: function() {
4713  return "";
4714 },
4715 getBadgeIconElement: function(badge) {
4716  return badge.childNodes.length ? badge.querySelector("." + this.getBadgeIconDefaultClassName()) : null;
4717 },
4718 getBadgeTextElement: function(badge) {
4719  return badge.childNodes.length ? badge.querySelector("span:not(." + this.getBadgeIconDefaultClassName() + ")") : null;
4720 }
4721});
4722ASPx.BadgeManagerBase = BadgeManagerBase;
4723var BadgeManager = ASPx.CreateClass(BadgeManagerBase, {
4724 getBadgeClassName: function() {
4725  return "dxBadge";
4726 },
4727 getBadgeIconDefaultClassName: function() {
4728  return "dxBadgeImage";
4729 },
4730 createBadgeForButton: function(button) {
4731  var badge = ASPx.BadgeManager.createBadge();
4732  var buttonImage = button.GetButtonImage();
4733  var textContainer = button.GetTextContainer();
4734  var badgeRightSibling = !!buttonImage ? buttonImage : textContainer;
4735  badgeRightSibling.parentNode.insertBefore(badge, badgeRightSibling);
4736  if(button.IsLink() && buttonImage)
4737   ASPx.SetStyles(badge, { verticalAlign: "middle" });
4738  return badge;
4739 },
4740 createBadgeForToolbar: function(toolbarItem) {
4741  var badge = ASPx.BadgeManager.createBadge();
4742  var itemImage = toolbarItem.GetImage();
4743  var badgeRightSibling = itemImage;
4744  if(!itemImage) {
4745   var itemContentElement = toolbarItem.menu.GetItemContentElement(toolbarItem.indexPath);
4746   badgeRightSibling = toolbarItem.menu.GetContentTextElement(itemContentElement);
4747  }
4748  badgeRightSibling.parentNode.insertBefore(badge, badgeRightSibling);
4749  return badge;
4750 }
4751});
4752ASPx.BadgeManager = new BadgeManager();
4753var AccessibilityUtils = {
4754 isInitialized: false,
4755 highContrastCssClassMarker: "dxHighContrast",
4756 highContrastBackgroundCssClassMarker: "dxHCB",
4757 highContrastDefaultBackgroundColor: "#a347ff",
4758 highContrastThemeActive: false,
4759 accessibleBackgroundCssMarker: ".dx-runtime-background",
4760 createAccessibleBackgrounds: function(control) {
4761  if(!this.highContrastThemeActive || control.accessibleBackgroundsCreated || !control.accessibilityCompliant)
4762   return;
4763  var className = this.accessibleBackgroundCssMarker;
4764  var styleSheetRuleNames = [];
4765  iterateStyleSheetRules(null, function(rule) {
4766   var selectorTxt = rule.selectorText;
4767   if(selectorTxt && selectorTxt.indexOf(className) > -1)
4768    styleSheetRuleNames.push(ASPx.Str.CompleteReplace(selectorTxt, className, "")); 
4769  });
4770  for(var i = 0; i < styleSheetRuleNames.length; i++) {
4771   var name = styleSheetRuleNames[i];
4772   var rule = ASPx.GetStyleSheetRules(name.substring(1));
4773   if(rule && rule.style && rule.style.backgroundImage)
4774    this.createAccessibleBackground(control.GetMainElement(), rule.style, name);
4775  }
4776  control.accessibleBackgroundsCreated = true;
4777 },
4778 createAccessibleBackground: function(container, style, selector) {
4779  if(!container)
4780   return;
4781  var backgroundUrl = style.backgroundImage.substring(5, style.backgroundImage.length - 2);
4782  var elements = container.querySelectorAll(selector);
4783  var accessibleBackgroundClassName = "dx-acc-bi";
4784  for(var i = 0; i < elements.length; i++) {
4785   var element = elements[i];
4786   if(ASPx.ElementHasCssClass(element, accessibleBackgroundClassName))
4787    continue;
4788   var image = null;
4789   if(element.tagName !== "IMG") {
4790    ASPx.AddClassNameToElement(element, accessibleBackgroundClassName);
4791    image = element.ownerDocument.createElement("IMG");
4792    ASPx.SetStyles(image, { width: "100%", height: "100%" });
4793    if(element.firstChild)
4794     element.insertBefore(image, element.firstChild);
4795    else
4796     element.appendChild(image);
4797   } else
4798    image = element;
4799   image.src = backgroundUrl;
4800  }
4801 },
4802 createHighContrastBackgroundStyle: function() {
4803  var style = document.createElement('style');
4804  ASPx.Attr.AppendStyleType(style);
4805  var styleContent = [
4806   "." + this.highContrastCssClassMarker + " ." + this.highContrastBackgroundCssClassMarker + ":after {",
4807   "border-image: url(" + this.getHighContrastBackgroundUrl() + ") 0 1 0 0 round;",
4808   "}",
4809  ];
4810  setInnerHtmlInternal(style, styleContent.join('\n'));
4811  document.getElementsByTagName('head')[0].appendChild(style);
4812 },
4813 getHighContrastBackgroundUrl: function() {
4814  var canvas = document.createElement("canvas"),
4815  ctx = canvas.getContext('2d');
4816  canvas.width = 1;
4817  canvas.height = 1;
4818  ctx.fillStyle = this.getHighContrastBackgroundColor();
4819  ctx.fillRect(0, 0, canvas.width, canvas.height);
4820  return canvas.toDataURL();
4821 },
4822 getHighContrastBackgroundColor: function() {
4823  var foreColor = ASPx.GetCurrentStyle(document.body).color;
4824  var hexColor = ASPx.Color.ColorToHexadecimal(foreColor);
4825  return ASPx.HighContrastForeColorHighlightColorMap[hexColor] || this.highContrastDefaultBackgroundColor;
4826 },
4827 initialize: function() {
4828  if(this.isInitialized)
4829   return;
4830  this.isInitialized = true;
4831  this.detectHighContrastTheme();
4832  if(this.highContrastThemeActive)
4833   this.createHighContrastBackgroundStyle();
4834 },
4835 detectHighContrastTheme: function() {
4836  var testElement = document.createElement("DIV");
4837  ASPx.SetStyles(testElement, {
4838   backgroundColor: "rgb(255, 255, 255)",
4839   display: "none"
4840  }, true);
4841  var docElement = document.documentElement;
4842  docElement.appendChild(testElement);
4843  var actualBackgroundColor = ASPx.GetCurrentStyle(testElement).backgroundColor;
4844  docElement.removeChild(testElement);
4845  if(actualBackgroundColor === "rgb(0, 0, 0)") {
4846   this.highContrastThemeActive = true;
4847   ASPx.AddClassNameToElement(docElement, this.highContrastCssClassMarker);
4848  }
4849 }
4850};
4851ASPx.AccessibilityUtils = AccessibilityUtils;
4852ASPx.AccessibilityUtils.SendMessageToAssistiveTechnology = function(message) {
4853 var messageParts = ASPx.Ident.IsArray(message) ? message : [message];
4854 var args = new ASPxClientControlBeforePronounceEventArgs(messageParts, null);
4855 ASPx.AccessibilityPronouncer.EnsureInitialize();
4856 ASPx.AccessibilityPronouncer.Pronounce(args, ASPx.AccessibilityPronouncerType.live);
4857};
4858ASPx.AccessibilityUtils.SetFocusAccessible = function(focusableElement) {
4859 if(!focusableElement)
4860  return;
4861 var elementId = focusableElement.id;
4862 if(!elementId) {
4863  var namedParent = ASPx.GetParent(focusableElement, function(element) {
4864   return !!element.id;
4865  });
4866  if(ASPx.IsExists(namedParent))
4867   elementId = namedParent.id;
4868 }
4869 var focusableControl = ASPx.GetClientControlByElementID(elementId);
4870 if(focusableControl && focusableControl.OnAssociatedLabelClick)
4871  focusableControl.OnAssociatedLabelClick(focusableElement);
4872 else
4873  window.setTimeout(function() {
4874   ASPx.AccessibilityUtils.SetFocusAccessibleCore(focusableElement);
4875  }, 0);
4876};
4877ASPx.AccessibilityUtils.SetFocusAccessibleCore = function(focusableElement) {
4878 if(!ASPx.IsExists(focusableElement))
4879  return;
4880 var isTabIndexChanged = ASPx.ControlTabIndexManager.getInstance().isElementWithChangedIndex(focusableElement);
4881 if(isTabIndexChanged)
4882  return;
4883 if(!ASPx.IsValidElement(focusableElement) && focusableElement.id)
4884  focusableElement = ASPx.GetElementById(focusableElement.id);
4885 if(!ASPx.IsActionElement(focusableElement))
4886  focusableElement = ASPx.RestoreFocusHelper.findNeighbourFocusElement(focusableElement, document.body);
4887 if(ASPx.IsExistsElement(focusableElement))
4888  focusableElement.focus();
4889};
4890var Security = {
4891 setInnerHtml: function(el, html, dataType) {
4892  if(!html) {
4893   while(el.firstChild)
4894    ASPx.RemoveElement(el.firstChild);
4895  } else
4896   Security.setData(html, function(d) { ASPx.SetInnerHtml.call(window, el, d); }, dataType);
4897 },
4898 setText: function(control, text, dataType) { Security.setData(text, control.SetText.aspxBind(control), dataType); },
4899 safeEncodeHtml: function(html) { return ASPx.Str.EncodeHtml(ASPx.Str.DecodeHtml(html)); },
4900 setData: function(data, dataSetter, dataType) {
4901  if(dataType === undefined)
4902   throw new Error("Specify the dataType");
4903  if(dataType == Security.DataType.Untrusted)
4904   data = Security.safeEncodeHtml(data);
4905  dataSetter(data);
4906 }
4907};
4908Security.DataType = {
4909 Trusted: 0,
4910 Untrusted: 1
4911};
4912ASPx.EnableCssAnimation = true;
4913var AnimationTransitionBase = ASPx.CreateClass(null, {
4914 constructor: function(element, options) {
4915  if(element) {
4916   AnimationTransitionBase.Cancel(element);
4917   this.element = element;
4918   this.element.aspxTransition = this;
4919  }
4920  this.duration = options.duration || AnimationConstants.Durations.DEFAULT;
4921  this.transition = options.transition || AnimationConstants.Transitions.SINE;
4922  this.property = options.property;
4923  this.unit = options.unit || "";
4924  this.onComplete = options.onComplete;
4925  this.to = null;
4926  this.from = null;
4927 },
4928 Start: function(from, to) {
4929  if(to != undefined) {
4930   this.to = to;
4931   this.from = from;
4932   this.SetValue(this.from);
4933  }
4934  else
4935   this.to = from;
4936 },
4937 Cancel: function() {
4938  if(!this.element)
4939   return;
4940  try {
4941   delete this.element.aspxTransition;
4942  } catch(e) {
4943   this.element.aspxTransition = undefined;
4944  }
4945 },
4946 GetValue: function() {
4947  return this.getValueInternal(this.element, this.property);
4948 },
4949 SetValue: function(value) {
4950  this.setValueInternal(this.element, this.property, this.unit, value);
4951 },
4952 setValueInternal: function(element, property, unit, value) {
4953  if(property == "opacity")
4954   AnimationUtils.setOpacity(element, value);
4955  else
4956   element.style[property] = value + unit;
4957 },
4958 getValueInternal: function(element, property) {
4959  if(property == "opacity")
4960   return ASPx.GetElementOpacity(element);
4961  var value = parseFloat(element.style[property]);
4962  return isNaN(value) ? 0 : value;
4963 },
4964 performOnComplete: function() {
4965  if(this.onComplete)
4966   this.onComplete(this.element);
4967 },
4968 getTransition: function() {
4969  return this.transition;
4970 }
4971});
4972AnimationTransitionBase.Cancel = function(element) {
4973 if(element.aspxTransition)
4974  element.aspxTransition.Cancel();
4975};
4976var AnimationConstants = {};
4977AnimationConstants.Durations = {
4978 SHORT: 200,
4979 DEFAULT: 400,
4980 LONG: 600
4981};
4982AnimationConstants.Transitions = {
4983 LINER: {
4984  Css: "cubic-bezier(0.250, 0.250, 0.750, 0.750)",
4985  Js: function(progress) { return progress; }
4986 },
4987 SINE: {
4988  Css: "cubic-bezier(0.470, 0.000, 0.745, 0.715)",
4989  Js: function(progress) { return Math.sin(progress * 1.57); }
4990 },
4991 POW: {
4992  Css: "cubic-bezier(0.755, 0.050, 0.855, 0.060)",
4993  Js: function(progress) { return Math.pow(progress, 4); }
4994 },
4995 POW_EASE_OUT: {
4996  Css: "cubic-bezier(0.165, 0.840, 0.440, 1.000)",
4997  Js: function(progress) { return 1 - AnimationConstants.Transitions.POW.Js(1 - progress); }
4998 },
4999 RIPPLE: {
5000  Css: "cubic-bezier(0.47, 0.06, 0.23, 0.99)",
5001  Js: function(progress) {
5002   return Math.pow((progress), 3) * 0.47 + 3 * progress * Math.pow((1 - progress), 2) * 0.06 + 3 * Math.pow(progress, 2) *
5003    (1 - progress) * 0.23 + 0.99 * Math.pow(progress, 3);
5004  }
5005 }
5006};
5007var JsAnimationTransition = ASPx.CreateClass(AnimationTransitionBase, {
5008 constructor: function(element, options) {
5009  this.constructor.prototype.constructor.call(this, element, options);
5010  this.onStep = options.onStep;
5011  this.fps = 60;
5012  this.startTime = null;
5013 },
5014 Start: function(from, to) {
5015  if(from == to) {
5016   this.from = this.to = from;
5017   setTimeout(this.complete.aspxBind(this), 0);
5018  }
5019  else {
5020   AnimationTransitionBase.prototype.Start.call(this, from, to);
5021   if(to == undefined)
5022    this.from = this.GetValue();
5023   this.initTimer();
5024  }
5025 },
5026 Cancel: function() {
5027  AnimationTransitionBase.prototype.Cancel.call(this);
5028  if(this.timerId)
5029   clearInterval(this.timerId);
5030 },
5031 initTimer: function() {
5032  this.startTime = new Date();
5033  this.timerId = window.setInterval(function() { this.onTick(); }.aspxBind(this), 1000 / this.fps);
5034 },
5035 onTick: function() {
5036  var progress = (new Date() - this.startTime) / this.duration;
5037  if(progress >= 1)
5038   this.complete();
5039  else {
5040   this.update(progress);
5041   if(this.onStep)
5042    this.onStep();
5043  }
5044 },
5045 update: function(progress) {
5046  this.SetValue(this.gatCalculatedValue(this.from, this.to, progress));
5047 },
5048 complete: function() {
5049  this.Cancel();
5050  this.update(1);
5051  this.performOnComplete();
5052 },
5053 gatCalculatedValue: function(from, to, progress) {
5054  if(progress == 1)
5055   return to;
5056  return from + (to - from) * this.getTransition()(progress);
5057 },
5058 getTransition: function() {
5059  return this.transition.Js;
5060 }
5061});
5062var SimpleAnimationTransition = ASPx.CreateClass(JsAnimationTransition, {
5063 constructor: function(options) {
5064  this.constructor.prototype.constructor.call(this, null, options);
5065  this.transition = options.transition || AnimationConstants.Transitions.POW_EASE_OUT;
5066  this.onUpdate = options.onUpdate;
5067  this.lastValue = 0;
5068 },
5069 SetValue: function(value) {
5070  this.onUpdate(value - this.lastValue);
5071  this.lastValue = value;
5072 },
5073 GetValue: function() {
5074  return this.lastValue;
5075 },
5076 performOnComplete: function() {
5077  if(this.onComplete)
5078   this.onComplete();
5079 }
5080});
5081var MultipleJsAnimationTransition = ASPx.CreateClass(JsAnimationTransition, {
5082 constructor: function(element, options) {
5083  this.constructor.prototype.constructor.call(this, element, options);
5084  this.properties = {};
5085 },
5086 Start: function(properties) {
5087  this.initProperties(properties);
5088  this.initTimer();
5089 },
5090 initProperties: function(properties) {
5091  this.properties = properties;
5092  for(var propName in this.properties)
5093   if(properties[propName].from == undefined)
5094    properties[propName].from = this.getValueInternal(this.element, propName);
5095 },
5096 update: function(progress) {
5097  for(var propName in this.properties) {
5098   if(this.properties.hasOwnProperty(propName)) {
5099    var property = this.properties[propName];
5100    if(property.from != property.to)
5101     this.setValueInternal(this.element, propName, property.unit, this.gatCalculatedValue(property.from, property.to, progress));
5102   }
5103  }
5104 }
5105});
5106var CssAnimationTransition = ASPx.CreateClass(AnimationTransitionBase, {
5107 constructor: function(element, options) {
5108  this.constructor.prototype.constructor.call(this, element, options);
5109  this.transitionPropertyName = AnimationUtils.CurrentTransition.property;
5110  this.eventName = AnimationUtils.CurrentTransition.event;
5111  this.forceTransitionEndByTimer = true;
5112  this.needForceTransitionEndByTimerFlag = options.needForceTransitionEndByTimerFlag;
5113 },
5114 Start: function(from, to) {
5115  this.forceTransitionEndByTimer = true;
5116  AnimationTransitionBase.prototype.Start.call(this, from, to);
5117  this.startTimerId = window.setTimeout(function() {
5118   if(this.from == this.to)
5119    this.onTransitionEnd();
5120   else {
5121    var isHidden = ASPx.GetElementOffsetHeight(this.element) == 0 && ASPx.GetElementOffsetWidth(this.element) == 0; 
5122    if(!isHidden)
5123     this.prepareElementBeforeAnimation();
5124    this.SetValue(this.to);
5125    if(isHidden)
5126     this.onTransitionEnd();
5127   }
5128  }.aspxBind(this), 0);
5129 },
5130 Cancel: function() {
5131  this.forceTransitionEndByTimer = false;
5132  window.clearTimeout(this.startTimerId);
5133  AnimationTransitionBase.prototype.Cancel.call(this);
5134  ASPx.Evt.DetachEventFromElement(this.element, this.eventName, CssAnimationTransition.transitionEnd);
5135  this.setValueInternal(this.element, this.transitionPropertyName, "", "");
5136  this.stopAnimation();
5137 },
5138 prepareElementBeforeAnimation: function() {
5139  ASPx.Evt.AttachEventToElement(this.element, this.eventName, CssAnimationTransition.transitionEnd);
5140  var dummy = this.element.offsetHeight;
5141  this.element.style[this.transitionPropertyName] = this.getTransitionCssString();
5142  if(this.needForceTransitionEndByTimer()) {
5143   setTimeout(function() {
5144    if(this.forceTransitionEndByTimer && this.element && this.element.aspxTransition) {
5145     this.element.style[this.transitionPropertyName] = "";
5146     this.element.aspxTransition.onTransitionEnd();
5147    }
5148   }.aspxBind(this), this.duration + 100);
5149  }
5150 },
5151 needForceTransitionEndByTimer: function() {
5152  if(this.needForceTransitionEndByTimerFlag)
5153   return true;
5154  if(ASPx.Browser.Safari && ASPx.Browser.MacOSMobilePlatform && ASPx.Browser.MajorVersion >= 8) 
5155   return true;
5156  return ASPx.Browser.AndroidMobilePlatform; 
5157 },
5158 stopAnimation: function() {
5159  this.SetValue(ASPx.GetCurrentStyle(this.element)[this.property]);
5160 },
5161 onTransitionEnd: function() {
5162  this.Cancel();
5163  this.performOnComplete();
5164 },
5165 getTransition: function() {
5166  return this.transition.Css;
5167 },
5168 getTransitionCssString: function() {
5169  return this.getTransitionCssStringInternal(this.getCssName(this.property));
5170 },
5171 getTransitionCssStringInternal: function(cssProperty) {
5172  return cssProperty + " " + this.duration + "ms " + this.getTransition();
5173 },
5174 getCssName: function(property) {
5175  switch(property) {
5176   case "marginLeft":
5177    return "margin-left";
5178   case "marginTop":
5179    return "margin-top";
5180  }
5181  return property;
5182 }
5183});
5184var MultipleCssAnimationTransition = ASPx.CreateClass(CssAnimationTransition, {
5185 constructor: function(element, options) {
5186  this.constructor.prototype.constructor.call(this, element, options);
5187  this.properties = null;
5188 },
5189 Start: function(properties) {
5190  this.properties = properties;
5191  this.forEachProperties(function(property, propName) {
5192   if(property.from !== undefined)
5193    this.setValueInternal(this.element, propName, property.unit, property.from);
5194  }.aspxBind(this));
5195  this.prepareElementBeforeAnimation();
5196  window.setTimeout(function() {
5197   this.forEachProperties(function(property, propName) {
5198    this.setValueInternal(this.element, propName, property.unit, property.to);
5199   }.aspxBind(this));
5200  }.aspxBind(this), 0);
5201 },
5202 stopAnimation: function() {
5203  var style = ASPx.GetCurrentStyle(this.element);
5204  this.forEachProperties(function(property, propName) {
5205   this.setValueInternal(this.element, propName, "", style[propName]);
5206  }.aspxBind(this));
5207 },
5208 getTransitionCssString: function() {
5209  var str = "";
5210  this.forEachProperties(function(property, propName) {
5211   str += this.getTransitionCssStringInternal(this.getCssName(propName)) + ",";
5212  }.aspxBind(this));
5213  str = str.substring(0, str.length - 1);
5214  return str;
5215 },
5216 forEachProperties: function(func) {
5217  for(var propName in this.properties) {
5218   if(this.properties.hasOwnProperty(propName)) {
5219    var property = this.properties[propName];
5220    if(property.from == undefined)
5221     property.from = this.getValueInternal(this.element, propName);
5222    if(property.from != property.to)
5223     func(property, propName);
5224   }
5225  }
5226 }
5227});
5228CssAnimationTransition.transitionEnd = function(evt) {
5229 var element = evt.target;
5230 if(element && element.aspxTransition)
5231  element.aspxTransition.onTransitionEnd();
5232};
5233var AnimationUtils = {
5234 CanUseCssTransition: function() { return ASPx.EnableCssAnimation && this.CurrentTransition; },
5235 CanUseCssTransform: function() { return this.CanUseCssTransition() && this.CurrentTransform; },
5236 CurrentTransition: (function() {
5237  var transitions = [
5238   { property: "webkitTransition", event: "webkitTransitionEnd" },
5239   { property: "MozTransition", event: "transitionend" },
5240   { property: "OTransition", event: "oTransitionEnd" },
5241   { property: "transition", event: "transitionend" }
5242  ];
5243  var fakeElement = document.createElement("DIV");
5244  for(var i = 0; i < transitions.length; i++)
5245   if(transitions[i].property in fakeElement.style)
5246    return transitions[i];
5247 })(),
5248 CurrentTransform: (function() {
5249  var transforms = ["transform", "MozTransform", "-webkit-transform", "msTransform", "OTransform"];
5250  var fakeElement = document.createElement("DIV");
5251  for(var i = 0; i < transforms.length; i++)
5252   if(transforms[i] in fakeElement.style)
5253    return transforms[i];
5254 })(),
5255 SetTransformValue: function(element, position, isTop) {
5256  if(this.CanUseCssTransform())
5257   element.style[this.CurrentTransform] = this.GetTransformCssText(position, isTop);
5258  else
5259   element.style[!isTop ? "left" : "top"] = position + "px";
5260 },
5261 GetTransformValue: function(element, isTop) {
5262  if(this.CanUseCssTransform()) {
5263   var cssValue = element.style[this.CurrentTransform];
5264   return cssValue && cssValue != "none" ? Number(cssValue.replace('matrix(1, 0, 0, 1,', '').replace(')', '').split(',')[!isTop ? 0 : 1]) : 0;
5265  }
5266  else
5267   return !isTop ? element.offsetLeft : element.offsetTop;
5268 },
5269 GetTransformCssText: function(position, isTop) {
5270  if(!position)
5271   return "none";
5272  return "matrix(1, 0, 0, 1," + (!isTop ? position : 0) + ", " + (!isTop ? 0 : position) + ")";
5273 },
5274 createMultipleAnimationTransition: function (element, options) {
5275  return this.CanUseCssTransition() && !options.onStep ? new MultipleCssAnimationTransition(element, options) : new MultipleJsAnimationTransition(element, options);
5276 },
5277 createSimpleAnimationTransition: function(options) {
5278  return new SimpleAnimationTransition(options);
5279 },
5280 createJsAnimationTransition: function(element, options) {
5281  return new JsAnimationTransition(element, options);
5282 },
5283 createCssAnimationTransition: function(element, options) {
5284  return new CssAnimationTransition(element, options);
5285 },
5286 setOpacity: function(element, value) {
5287  ASPx.SetElementOpacity(element, value);
5288 }
5289};
5290var AsyncTracker = function() {
5291 var currentToken,
5292  lockedTokens,
5293  onDoneDelegates,
5294  lockedDelegates;
5295 function clearState() {
5296  currentToken = 1;
5297  lockedTokens = [];
5298  onDoneDelegates = [];
5299  lockedDelegates = {};
5300 }
5301 clearState();
5302 var log = function(msg) { };
5303 function setLog(delegate){
5304  log = delegate;
5305 }
5306 function getLockToken() {
5307  if(onDoneDelegates.length === 0)
5308   return -1;
5309  var token = currentToken++;
5310  lockedTokens.push(token);
5311  lockedDelegates[token] = [];
5312  for (var i = 0; i < onDoneDelegates.length; i++) {
5313   lockedDelegates[token].push(onDoneDelegates[i]);
5314  }
5315  log("module locks token " + token);
5316  return token;
5317 }
5318 function releaseToken(token) {
5319  if(token < 0) return;
5320  log("module releasing token " + token);
5321  ASPx.Data.ArrayRemove(lockedTokens, token);
5322  delete lockedDelegates[token];
5323  invokeUnlockedDelegates();
5324  if(lockedTokens.length === 0)
5325   clearState();
5326  log("module released token " + token);
5327 }
5328 function invokeUnlockedDelegates() {
5329  var onDoneDelegate;
5330  for (var i = onDoneDelegates.length - 1; i >= 0; i--) {
5331   if(onDoneDelegates[i] && !isDelegateLocked(onDoneDelegates[i])) {
5332    onDoneDelegate = onDoneDelegates[i];
5333    delete onDoneDelegates[i];
5334    onDoneDelegate();
5335   }
5336  }
5337 }
5338 function isDelegateLocked(delegate) {
5339  for (var i = lockedTokens.length - 1; i >= 0; i--) {
5340   var token = lockedTokens[i];
5341   var delegates = lockedDelegates[token];
5342   if(delegates) {
5343    for (var j = delegates.length - 1; j >= 0; j--) {
5344     if(delegates[j] && delegates[j] === delegate)
5345      return true;
5346    }
5347   }
5348  }
5349  return false;
5350 }
5351 function track(doDelegate, onDoneDelegate) {
5352  if(onDoneDelegate)
5353   onDoneDelegates.push(onDoneDelegate);
5354  doDelegate();
5355  if(onDoneDelegate)
5356   invokeUnlockedDelegates();
5357 }
5358 return {
5359  getLockToken: getLockToken,
5360  releaseToken: releaseToken,
5361  track: track,
5362  setLog:setLog,
5363 };
5364};
5365var GetEditorValuesInContainer = function(containerOrId, processInvisibleEditors, needSerialize) {
5366 var container = typeof(containerOrId) === "string" ? ASPx.GetElementById(containerOrId) : containerOrId;
5367 var result = {};
5368 if(!ASPx.ProcessEditorsInContainer) 
5369  return result;
5370 ASPx.ProcessEditorsInContainer(container, function(editor){
5371  result[editor.name] = GetCorrectedByTypeValue(ASPx.GetEditorValueByControl(editor), needSerialize);
5372  return true;
5373 }, null, null, processInvisibleEditors, false);
5374 return result;
5375};
5376var SetEditorValues = function(values) {
5377 for(var controlName in values) {
5378  if(values.hasOwnProperty(controlName)) {
5379   var trackedControl = ASPxClientControl.GetControlCollection().Get(controlName);
5380   if(!trackedControl)
5381    continue;
5382   var setValueMethod = trackedControl.SetTokenCollection || trackedControl.SelectValues || trackedControl.SetValue;
5383   if(setValueMethod === trackedControl.SelectValues)
5384    trackedControl.UnselectAll();
5385   setValueMethod.call(trackedControl, values[controlName]);
5386  }
5387 }
5388};
5389var GetCorrectedByTypeValue = function(value, needSerialize){
5390 if(ASPx.Ident.IsArray(value))
5391  for(var i = 0; i < value.length; i++)
5392   value[i] = GetCorrectedByTypeValue(value[i]);
5393 if(needSerialize && ASPx.Ident.IsDate(value))
5394  return ASPx.DateUtils.GetInvariantDateTimeString(value);
5395 return value;
5396};
5397var ListBoxTemporaryCache = ASPx.CreateClass(null, {
5398 constructor: function() { 
5399  this.cache = { };
5400  this.invalidateTimerID = -1;
5401 },
5402 Get: function(key, getObjectFunc, context, args) {
5403  if(this.invalidateTimerID < 0) {
5404   this.invalidateTimerID = window.setTimeout(function() {
5405    this.Invalidate();
5406   }.aspxBind(this), 0);
5407  }
5408  if(!ASPx.IsExists(this.cache[key])) {
5409   if(!ASPx.IsExists(args))
5410    args = [ ];
5411   this.cache[key] = getObjectFunc.apply(context, args);
5412  }
5413  return this.cache[key];
5414 },
5415 Invalidate: function() {
5416  this.cache = { };
5417  this.invalidateTimerID = ASPx.Timer.ClearTimer(this.invalidateTimerID);
5418 }
5419});
5420ASPx.GetEditorValueByControl = function(control, needSerialize) {
5421 var result;
5422 if(ASPx.IsMultipleValueOwner(control))
5423  result = control.GetSelectedValues();
5424 if(ASPx.IsTokenBox(control)) {
5425  if(needSerialize)
5426   result = control.GetTokenValuesCollection();
5427  else
5428   result = control.GetTokenCollection();
5429 }
5430 if(ASPx.IsDropDownEdit(control))
5431  result = control.GetKeyValue();
5432 if(ASPx.IsHtmlEditor(control))
5433  result = control.GetHtml();
5434 return result || control.GetValue();
5435};
5436ASPx.IsMultipleValueOwner = function(control) {
5437 return ASPx.IsListBox(control) || ASPx.IsCheckBoxList(control);
5438};
5439ASPx.IsCheckBoxList = function(control) {
5440 return control && typeof(ASPxClientCheckBoxList) != "undefined" && control instanceof ASPxClientCheckBoxList;
5441 };
5442ASPx.IsCheckBox = function(control) {
5443 return control && typeof (ASPxClientCheckBox) != "undefined" && control instanceof ASPxClientCheckBox;
5444};
5445ASPx.IsListBox = function(control) {
5446 return control && typeof(ASPxClientListBox) != "undefined" && control instanceof ASPxClientListBox;
5447};
5448ASPx.IsComboBox = function(control) {
5449 return control && typeof(ASPxClientComboBox) != "undefined" && control instanceof ASPxClientComboBox;
5450};
5451ASPx.IsTokenBox = function(control) {
5452 return control && typeof(ASPxClientTokenBox) != "undefined" && control instanceof ASPxClientTokenBox;
5453};
5454ASPx.IsDropDownEdit = function(control) {
5455 return control && typeof (ASPxClientDropDownEdit) != "undefined" && control instanceof ASPxClientDropDownEdit;
5456};
5457ASPx.IsGridLookup = function(control) {
5458 return control && typeof(MVCxClientGridLookup) != "undefined" && control instanceof MVCxClientGridLookup;
5459};
5460ASPx.IsSpinEdit = function(control) {
5461 return control && typeof(ASPxClientSpinEdit) != "undefined" && control instanceof ASPxClientSpinEdit;
5462};
5463ASPx.IsHtmlEditor = function(control) {
5464 return control && typeof (ASPxClientHtmlEditor) != "undefined" && control instanceof ASPxClientHtmlEditor;
5465};
5466ASPx.DatePickerType = {
5467 Days: 0,
5468 Months: 1,
5469 Years: 2,
5470 Decades: 3
5471};
5472ASPx.FullScreenUtils = {
5473 subscribeChange: function(handler) {
5474  Evt.AttachEventToElement(document, "fullscreenchange", handler);
5475  Evt.AttachEventToElement(document, "msfullscreenchange", handler); 
5476  Evt.AttachEventToElement(document, "MSFullscreenChange", handler); 
5477  Evt.AttachEventToElement(document, "webkitfullscreenchange", handler);
5478  Evt.AttachEventToElement(document, "mozfullscreenchange", handler);
5479 },
5480 unsubscribeChange: function(handler) {
5481  Evt.DetachEventFromElement(document, "fullscreenchange", handler);
5482  Evt.DetachEventFromElement(document, "msfullscreenchange", handler);
5483  Evt.DetachEventFromElement(document, "MSFullscreenChange", handler);
5484  Evt.DetachEventFromElement(document, "webkitfullscreenchange", handler);
5485  Evt.DetachEventFromElement(document, "mozfullscreenchange", handler);
5486 },
5487 setFullscreen: function(on) {
5488  var element = window.self.document.body;
5489  if(on) {
5490   if(element.requestFullscreen) {
5491    element.requestFullscreen();
5492   } else if(element.mozRequestFullScreen) {
5493    element.mozRequestFullScreen();
5494   } else if(element.webkitRequestFullscreen) {
5495    element.webkitRequestFullscreen();
5496   } else if(element.msRequestFullscreen) {
5497    element.msRequestFullscreen();
5498   }
5499  } else {
5500   if(document.exitFullscreen) {
5501    document.exitFullscreen();
5502   } else if(document.mozCancelFullScreen) {
5503    document.mozCancelFullScreen();
5504   } else if(document.webkitCancelFullScreen) {
5505    document.webkitCancelFullScreen();
5506   } else if(document.msExitFullscreen) {
5507    document.msExitFullscreen();
5508   }
5509  }
5510 },
5511 inFullscreen: function() {
5512  var fullscreenElement = document.fullscreenElement || document.msFullscreenElement || document.webkitFullscreenElement;
5513  var isInFullscreen = fullscreenElement === document.body || document.webkitIsFullScreen;
5514  return !!isInFullscreen;
5515 }
5516 };
5517ASPx.InitializeSVGSprite = function () {
5518 if (ASPx.SVGSprites && ASPx.SVGSprites.length > 0) {
5519  var svgContainer = document.getElementById('svgContainer');
5520  var hasSvgContainer = !!svgContainer;
5521  if (!hasSvgContainer) {
5522   svgContainer = document.createElement('div');
5523   svgContainer.id = 'svgContainer';
5524   svgContainer.style.display = "none";
5525   document.body.appendChild(svgContainer);
5526  }
5527  for (var i = 0; i < ASPx.SVGSprites.length; i++) {
5528   svgContainer.innerHTML += ASPx.SVGSprites[i];
5529  }
5530  ASPx.SVGSprites = null;
5531 }
5532};
5533var GridDynamicStyleSheetHelper = ASPx.CreateClass(null, {
5534 constructor: function() {
5535  this.styleSheet = {};
5536  this.rules = {};
5537  this.updateLock = 0;
5538 },
5539 Update: function(control, styleName, rules) {
5540  var key = control.name + "_" + styleName;
5541  this.BeginUpdate(key);
5542  this.ChangeRules(key, rules);
5543  this.EndUpdate(key);
5544 },
5545 ChangeRules: function(key, rules) {
5546  if(key && rules)
5547   this.rules[key] = rules;
5548 },
5549 BeginUpdate: function(key) {
5550  this.updateLock++;
5551  this.RemoveStyleSheetElement(key);
5552 },
5553 EndUpdate: function(key) {
5554  this.updateLock--;
5555  if(this.updateLock !== 0)
5556   return;
5557  var styleArgs = [];
5558  var controlRules = this.rules[key];
5559  for(var i = 0; i < controlRules.length; i++) {
5560   var rule = controlRules[i];
5561   styleArgs.push(rule.selector + " { " + rule.cssText + " } ");
5562  }
5563  this.styleSheet[key] = this.CreateStyleSheet(key, styleArgs.join(""));
5564 },
5565 CreateStyleSheet: function(key, cssText) {
5566  var container = document.createElement("DIV");
5567  ASPx.Security.setInnerHtml(container, "<style type='text/css' id='" + key + "'>" + cssText + "</style>", ASPx.Security.DataType.Trusted);
5568  styleSheet = ASPx.GetNodeByTagName(container, "style", 0);
5569  if(styleSheet)
5570   ASPx.GetNodeByTagName(document, "HEAD", 0).appendChild(styleSheet);
5571  return styleSheet;
5572 },
5573 ClearStyleSheet: function(control, styleName) {
5574  var key = control.name + "_" + styleName;
5575  this.RemoveStyleSheetElement(key);
5576 },
5577 RemoveStyleSheetElement: function(key) {
5578  if(this.styleSheet[key]) {
5579   ASPx.RemoveElement(this.styleSheet[key]);
5580   delete this.styleSheet[key];
5581  }
5582 }
5583});
5584GridDynamicStyleSheetHelper.Instance = new GridDynamicStyleSheetHelper();
5585ASPx.GridDynamicStyleSheetHelper = GridDynamicStyleSheetHelper;
5586ASPxClientUtils = {};
5587ASPxClientUtils.agent = Browser.UserAgent;
5588ASPxClientUtils.opera = Browser.Opera;
5589ASPxClientUtils.opera9 = Browser.Opera && Browser.MajorVersion == 9;
5590ASPxClientUtils.safari = Browser.Safari;
5591ASPxClientUtils.safari3 = Browser.Safari && Browser.MajorVersion == 3;
5592ASPxClientUtils.safariMacOS = Browser.Safari && Browser.MacOSPlatform;
5593ASPxClientUtils.chrome = Browser.Chrome;
5594ASPxClientUtils.ie = Browser.IE;
5595ASPxClientUtils.ie7 = Browser.IE && Browser.MajorVersion == 7;
5596ASPxClientUtils.firefox = Browser.Firefox;
5597ASPxClientUtils.firefox3 = Browser.Firefox && Browser.MajorVersion == 3;
5598ASPxClientUtils.mozilla = Browser.Mozilla;
5599ASPxClientUtils.netscape = Browser.Netscape;
5600ASPxClientUtils.browserVersion = Browser.Version;
5601ASPxClientUtils.browserMajorVersion = Browser.MajorVersion;
5602ASPxClientUtils.macOSPlatform = Browser.MacOSPlatform;
5603ASPxClientUtils.windowsPlatform = Browser.WindowsPlatform;
5604ASPxClientUtils.webKitFamily = Browser.WebKitFamily;
5605ASPxClientUtils.netscapeFamily = Browser.NetscapeFamily;
5606ASPxClientUtils.touchUI = Browser.TouchUI;
5607ASPxClientUtils.webKitTouchUI = Browser.WebKitTouchUI;
5608ASPxClientUtils.msTouchUI = Browser.MSTouchUI;
5609ASPxClientUtils.iOSPlatform = Browser.MacOSMobilePlatform;
5610ASPxClientUtils.androidPlatform = Browser.AndroidMobilePlatform;
5611ASPxClientUtils.ArrayInsert = Data.ArrayInsert;
5612ASPxClientUtils.ArrayRemove = Data.ArrayRemove;
5613ASPxClientUtils.ArrayRemoveAt = Data.ArrayRemoveAt;
5614ASPxClientUtils.ArrayClear = Data.ArrayClear;
5615ASPxClientUtils.ArrayIndexOf = Data.ArrayIndexOf;
5616ASPxClientUtils.AttachEventToElement = Evt.AttachEventToElement;
5617ASPxClientUtils.DetachEventFromElement = Evt.DetachEventFromElement;
5618ASPxClientUtils.GetEventSource = Evt.GetEventSource;
5619ASPxClientUtils.GetEventX = Evt.GetEventX;
5620ASPxClientUtils.GetEventY = Evt.GetEventY;
5621ASPxClientUtils.GetKeyCode = Evt.GetKeyCode;
5622ASPxClientUtils.PreventEvent = Evt.PreventEvent;
5623ASPxClientUtils.PreventEventAndBubble = Evt.PreventEventAndBubble;
5624ASPxClientUtils.PreventDragStart = Evt.PreventDragStart;
5625ASPxClientUtils.ClearSelection = Selection.Clear;
5626ASPxClientUtils.IsExists = ASPx.IsExists;
5627ASPxClientUtils.IsFunction = ASPx.IsFunction;
5628ASPxClientUtils.GetAbsoluteX = ASPx.GetAbsoluteX;
5629ASPxClientUtils.GetAbsoluteY = ASPx.GetAbsoluteY;
5630ASPxClientUtils.SetAbsoluteX = ASPx.SetAbsoluteX;
5631ASPxClientUtils.SetAbsoluteY = ASPx.SetAbsoluteY;
5632ASPxClientUtils.GetDocumentScrollTop = ASPx.GetDocumentScrollTop;
5633ASPxClientUtils.GetDocumentScrollLeft = ASPx.GetDocumentScrollLeft;
5634ASPxClientUtils.GetDocumentClientWidth = ASPx.GetDocumentClientWidth;
5635ASPxClientUtils.GetDocumentClientHeight = ASPx.GetDocumentClientHeight;
5636ASPxClientUtils.AddClassNameToElement = ASPx.AddClassNameToElement;
5637ASPxClientUtils.RemoveClassNameFromElement = ASPx.RemoveClassNameFromElement;
5638ASPxClientUtils.ToggleClassName = ASPx.ToggleClassNameToElement;
5639ASPxClientUtils.GetIsParent = ASPx.GetIsParent;
5640ASPxClientUtils.GetParentById = ASPx.GetParentById;
5641ASPxClientUtils.GetParentByTagName = ASPx.GetParentByTagName;
5642ASPxClientUtils.GetParentByClassName = ASPx.GetParentByPartialClassName;
5643ASPxClientUtils.GetChildById = ASPx.GetChildById;
5644ASPxClientUtils.GetChildByTagName = ASPx.GetChildByTagName;
5645ASPxClientUtils.SetCookie = Cookie.SetCookie;
5646ASPxClientUtils.GetCookie = Cookie.GetCookie;
5647ASPxClientUtils.DeleteCookie = Cookie.DelCookie;
5648ASPxClientUtils.GetShortcutCode = ASPx.GetShortcutCode; 
5649ASPxClientUtils.GetShortcutCodeByEvent = ASPx.GetShortcutCodeByEvent;
5650ASPxClientUtils.StringToShortcutCode = ASPx.ParseShortcutString;
5651ASPxClientUtils.Trim = Str.Trim; 
5652ASPxClientUtils.TrimStart = Str.TrimStart;
5653ASPxClientUtils.TrimEnd = Str.TrimEnd;
5654ASPxClientUtils.GetEditorValuesInContainer = GetEditorValuesInContainer;
5655ASPxClientUtils.SetEditorValues = SetEditorValues;
5656ASPxClientUtils.SendMessageToAssistiveTechnology = ASPx.AccessibilityUtils.SendMessageToAssistiveTechnology;
5657window.ASPxClientUtils = ASPxClientUtils;
5658window.ListBoxTemporaryCache = ListBoxTemporaryCache;
5659ASPx.AnimationUtils = AnimationUtils;
5660ASPx.AnimationTransitionBase = AnimationTransitionBase;
5661ASPx.AnimationConstants = AnimationConstants;
5662ASPx.AsyncTracker = AsyncTracker;
5663ASPx.Security = Security;
5664})(ASPx, dx);
5665

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.